All files / farcaster/build/static/chunks/app layout.js

0% Statements 0/1298
0% Branches 0/1
0% Functions 0/1
0% Lines 0/1298

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
/*
 * ATTENTION: An "eval-source-map" devtool has been used.
 * This devtool is neither made for production nor for readable output files.
 * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
 * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
 * or disable the default devtool with "devtool: false".
 * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
 */
(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([["app/layout"],{
 
/***/ "(app-pages-browser)/./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js":
/*!*******************************************************************************!*\
  !*** ./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js ***!
  \*******************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ isPropValid)\n/* harmony export */ });\n/* harmony import */ var _emotion_memoize__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @emotion/memoize */ \"(app-pages-browser)/./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js\");\n\n\n// eslint-disable-next-line no-undef\nvar reactPropsRegex = /^((children|dangerouslySetInnerHTML|key|ref|autoFocus|defaultValue|defaultChecked|innerHTML|suppressContentEditableWarning|suppressHydrationWarning|valueLink|abbr|accept|acceptCharset|accessKey|action|allow|allowUserMedia|allowPaymentRequest|allowFullScreen|allowTransparency|alt|async|autoComplete|autoPlay|capture|cellPadding|cellSpacing|challenge|charSet|checked|cite|classID|className|cols|colSpan|content|contentEditable|contextMenu|controls|controlsList|coords|crossOrigin|data|dateTime|decoding|default|defer|dir|disabled|disablePictureInPicture|disableRemotePlayback|download|draggable|encType|enterKeyHint|fetchpriority|fetchPriority|form|formAction|formEncType|formMethod|formNoValidate|formTarget|frameBorder|headers|height|hidden|high|href|hrefLang|htmlFor|httpEquiv|id|inputMode|integrity|is|keyParams|keyType|kind|label|lang|list|loading|loop|low|marginHeight|marginWidth|max|maxLength|media|mediaGroup|method|min|minLength|multiple|muted|name|nonce|noValidate|open|optimum|pattern|placeholder|playsInline|popover|popoverTarget|popoverTargetAction|poster|preload|profile|radioGroup|readOnly|referrerPolicy|rel|required|reversed|role|rows|rowSpan|sandbox|scope|scoped|scrolling|seamless|selected|shape|size|sizes|slot|span|spellCheck|src|srcDoc|srcLang|srcSet|start|step|style|summary|tabIndex|target|title|translate|type|useMap|value|width|wmode|wrap|about|datatype|inlist|prefix|property|resource|typeof|vocab|autoCapitalize|autoCorrect|autoSave|color|incremental|fallback|inert|itemProp|itemScope|itemType|itemID|itemRef|on|option|results|security|unselectable|accentHeight|accumulate|additive|alignmentBaseline|allowReorder|alphabetic|amplitude|arabicForm|ascent|attributeName|attributeType|autoReverse|azimuth|baseFrequency|baselineShift|baseProfile|bbox|begin|bias|by|calcMode|capHeight|clip|clipPathUnits|clipPath|clipRule|colorInterpolation|colorInterpolationFilters|colorProfile|colorRendering|contentScriptType|contentStyleType|cursor|cx|cy|d|decelerate|descent|diffuseConstant|direction|display|divisor|dominantBaseline|dur|dx|dy|edgeMode|elevation|enableBackground|end|exponent|externalResourcesRequired|fill|fillOpacity|fillRule|filter|filterRes|filterUnits|floodColor|floodOpacity|focusable|fontFamily|fontSize|fontSizeAdjust|fontStretch|fontStyle|fontVariant|fontWeight|format|from|fr|fx|fy|g1|g2|glyphName|glyphOrientationHorizontal|glyphOrientationVertical|glyphRef|gradientTransform|gradientUnits|hanging|horizAdvX|horizOriginX|ideographic|imageRendering|in|in2|intercept|k|k1|k2|k3|k4|kernelMatrix|kernelUnitLength|kerning|keyPoints|keySplines|keyTimes|lengthAdjust|letterSpacing|lightingColor|limitingConeAngle|local|markerEnd|markerMid|markerStart|markerHeight|markerUnits|markerWidth|mask|maskContentUnits|maskUnits|mathematical|mode|numOctaves|offset|opacity|operator|order|orient|orientation|origin|overflow|overlinePosition|overlineThickness|panose1|paintOrder|pathLength|patternContentUnits|patternTransform|patternUnits|pointerEvents|points|pointsAtX|pointsAtY|pointsAtZ|preserveAlpha|preserveAspectRatio|primitiveUnits|r|radius|refX|refY|renderingIntent|repeatCount|repeatDur|requiredExtensions|requiredFeatures|restart|result|rotate|rx|ry|scale|seed|shapeRendering|slope|spacing|specularConstant|specularExponent|speed|spreadMethod|startOffset|stdDeviation|stemh|stemv|stitchTiles|stopColor|stopOpacity|strikethroughPosition|strikethroughThickness|string|stroke|strokeDasharray|strokeDashoffset|strokeLinecap|strokeLinejoin|strokeMiterlimit|strokeOpacity|strokeWidth|surfaceScale|systemLanguage|tableValues|targetX|targetY|textAnchor|textDecoration|textRendering|textLength|to|transform|u1|u2|underlinePosition|underlineThickness|unicode|unicodeBidi|unicodeRange|unitsPerEm|vAlphabetic|vHanging|vIdeographic|vMathematical|values|vectorEffect|version|vertAdvY|vertOriginX|vertOriginY|viewBox|viewTarget|visibility|widths|wordSpacing|writingMode|x|xHeight|x1|x2|xChannelSelector|xlinkActuate|xlinkArcrole|xlinkHref|xlinkRole|xlinkShow|xlinkTitle|xlinkType|xmlBase|xmlns|xmlnsXlink|xmlLang|xmlSpace|y|y1|y2|yChannelSelector|z|zoomAndPan|for|class|autofocus)|(([Dd][Aa][Tt][Aa]|[Aa][Rr][Ii][Aa]|x)-.*))$/; // https://esbench.com/bench/5bfee68a4cd7e6009ef61d23\n\nvar isPropValid = /* #__PURE__ */(0,_emotion_memoize__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(function (prop) {\n  return reactPropsRegex.test(prop) || prop.charCodeAt(0) === 111\n  /* o */\n  && prop.charCodeAt(1) === 110\n  /* n */\n  && prop.charCodeAt(2) < 91;\n}\n/* Z+1 */\n);\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9pcy1wcm9wLXZhbGlkL2Rpc3QvZW1vdGlvbi1pcy1wcm9wLXZhbGlkLmVzbS5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUF1Qzs7QUFFdkM7QUFDQSx1a0lBQXVrSTs7QUFFdmtJLGlDQUFpQyw0REFBTztBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVrQyIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9pcy1wcm9wLXZhbGlkL2Rpc3QvZW1vdGlvbi1pcy1wcm9wLXZhbGlkLmVzbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbWVtb2l6ZSBmcm9tICdAZW1vdGlvbi9tZW1vaXplJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG52YXIgcmVhY3RQcm9wc1JlZ2V4ID0gL14oKGNoaWxkcmVufGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MfGtleXxyZWZ8YXV0b0ZvY3VzfGRlZmF1bHRWYWx1ZXxkZWZhdWx0Q2hlY2tlZHxpbm5lckhUTUx8c3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nfHN1cHByZXNzSHlkcmF0aW9uV2FybmluZ3x2YWx1ZUxpbmt8YWJicnxhY2NlcHR8YWNjZXB0Q2hhcnNldHxhY2Nlc3NLZXl8YWN0aW9ufGFsbG93fGFsbG93VXNlck1lZGlhfGFsbG93UGF5bWVudFJlcXVlc3R8YWxsb3dGdWxsU2NyZWVufGFsbG93VHJhbnNwYXJlbmN5fGFsdHxhc3luY3xhdXRvQ29tcGxldGV8YXV0b1BsYXl8Y2FwdHVyZXxjZWxsUGFkZGluZ3xjZWxsU3BhY2luZ3xjaGFsbGVuZ2V8Y2hhclNldHxjaGVja2VkfGNpdGV8Y2xhc3NJRHxjbGFzc05hbWV8Y29sc3xjb2xTcGFufGNvbnRlbnR8Y29udGVudEVkaXRhYmxlfGNvbnRleHRNZW51fGNvbnRyb2xzfGNvbnRyb2xzTGlzdHxjb29yZHN8Y3Jvc3NPcmlnaW58ZGF0YXxkYXRlVGltZXxkZWNvZGluZ3xkZWZhdWx0fGRlZmVyfGRpcnxkaXNhYmxlZHxkaXNhYmxlUGljdHVyZUluUGljdHVyZXxkaXNhYmxlUmVtb3RlUGxheWJhY2t8ZG93bmxvYWR8ZHJhZ2dhYmxlfGVuY1R5cGV8ZW50ZXJLZXlIaW50fGZldGNocHJpb3JpdHl8ZmV0Y2hQcmlvcml0eXxmb3JtfGZvcm1BY3Rpb258Zm9ybUVuY1R5cGV8Zm9ybU1ldGhvZHxmb3JtTm9WYWxpZGF0ZXxmb3JtVGFyZ2V0fGZyYW1lQm9yZGVyfGhlYWRlcnN8aGVpZ2h0fGhpZGRlbnxoaWdofGhyZWZ8aHJlZkxhbmd8aHRtbEZvcnxodHRwRXF1aXZ8aWR8aW5wdXRNb2RlfGludGVncml0eXxpc3xrZXlQYXJhbXN8a2V5VHlwZXxraW5kfGxhYmVsfGxhbmd8bGlzdHxsb2FkaW5nfGxvb3B8bG93fG1hcmdpbkhlaWdodHxtYXJnaW5XaWR0aHxtYXh8bWF4TGVuZ3RofG1lZGlhfG1lZGlhR3JvdXB8bWV0aG9kfG1pbnxtaW5MZW5ndGh8bXVsdGlwbGV8bXV0ZWR8bmFtZXxub25jZXxub1ZhbGlkYXRlfG9wZW58b3B0aW11bXxwYXR0ZXJufHBsYWNlaG9sZGVyfHBsYXlzSW5saW5lfHBvcG92ZXJ8cG9wb3ZlclRhcmdldHxwb3BvdmVyVGFyZ2V0QWN0aW9ufHBvc3RlcnxwcmVsb2FkfHByb2ZpbGV8cmFkaW9Hcm91cHxyZWFkT25seXxyZWZlcnJlclBvbGljeXxyZWx8cmVxdWlyZWR8cmV2ZXJzZWR8cm9sZXxyb3dzfHJvd1NwYW58c2FuZGJveHxzY29wZXxzY29wZWR8c2Nyb2xsaW5nfHNlYW1sZXNzfHNlbGVjdGVkfHNoYXBlfHNpemV8c2l6ZXN8c2xvdHxzcGFufHNwZWxsQ2hlY2t8c3JjfHNyY0RvY3xzcmNMYW5nfHNyY1NldHxzdGFydHxzdGVwfHN0eWxlfHN1bW1hcnl8dGFiSW5kZXh8dGFyZ2V0fHRpdGxlfHRyYW5zbGF0ZXx0eXBlfHVzZU1hcHx2YWx1ZXx3aWR0aHx3bW9kZXx3cmFwfGFib3V0fGRhdGF0eXBlfGlubGlzdHxwcmVmaXh8cHJvcGVydHl8cmVzb3VyY2V8dHlwZW9mfHZvY2FifGF1dG9DYXBpdGFsaXplfGF1dG9Db3JyZWN0fGF1dG9TYXZlfGNvbG9yfGluY3JlbWVudGFsfGZhbGxiYWNrfGluZXJ0fGl0ZW1Qcm9wfGl0ZW1TY29wZXxpdGVtVHlwZXxpdGVtSUR8aXRlbVJlZnxvbnxvcHRpb258cmVzdWx0c3xzZWN1cml0eXx1bnNlbGVjdGFibGV8YWNjZW50SGVpZ2h0fGFjY3VtdWxhdGV8YWRkaXRpdmV8YWxpZ25tZW50QmFzZWxpbmV8YWxsb3dSZW9yZGVyfGFscGhhYmV0aWN8YW1wbGl0dWRlfGFyYWJpY0Zvcm18YXNjZW50fGF0dHJpYnV0ZU5hbWV8YXR0cmlidXRlVHlwZXxhdXRvUmV2ZXJzZXxhemltdXRofGJhc2VGcmVxdWVuY3l8YmFzZWxpbmVTaGlmdHxiYXNlUHJvZmlsZXxiYm94fGJlZ2lufGJpYXN8Ynl8Y2FsY01vZGV8Y2FwSGVpZ2h0fGNsaXB8Y2xpcFBhdGhVbml0c3xjbGlwUGF0aHxjbGlwUnVsZXxjb2xvckludGVycG9sYXRpb258Y29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyc3xjb2xvclByb2ZpbGV8Y29sb3JSZW5kZXJpbmd8Y29udGVudFNjcmlwdFR5cGV8Y29udGVudFN0eWxlVHlwZXxjdXJzb3J8Y3h8Y3l8ZHxkZWNlbGVyYXRlfGRlc2NlbnR8ZGlmZnVzZUNvbnN0YW50fGRpcmVjdGlvbnxkaXNwbGF5fGRpdmlzb3J8ZG9taW5hbnRCYXNlbGluZXxkdXJ8ZHh8ZHl8ZWRnZU1vZGV8ZWxldmF0aW9ufGVuYWJsZUJhY2tncm91bmR8ZW5kfGV4cG9uZW50fGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWR8ZmlsbHxmaWxsT3BhY2l0eXxmaWxsUnVsZXxmaWx0ZXJ8ZmlsdGVyUmVzfGZpbHRlclVuaXRzfGZsb29kQ29sb3J8Zmxvb2RPcGFjaXR5fGZvY3VzYWJsZXxmb250RmFtaWx5fGZvbnRTaXplfGZvbnRTaXplQWRqdXN0fGZvbnRTdHJldGNofGZvbnRTdHlsZXxmb250VmFyaWFudHxmb250V2VpZ2h0fGZvcm1hdHxmcm9tfGZyfGZ4fGZ5fGcxfGcyfGdseXBoTmFtZXxnbHlwaE9yaWVudGF0aW9uSG9yaXpvbnRhbHxnbHlwaE9yaWVudGF0aW9uVmVydGljYWx8Z2x5cGhSZWZ8Z3JhZGllbnRUcmFuc2Zvcm18Z3JhZGllbnRVbml0c3xoYW5naW5nfGhvcml6QWR2WHxob3Jpek9yaWdpblh8aWRlb2dyYXBoaWN8aW1hZ2VSZW5kZXJpbmd8aW58aW4yfGludGVyY2VwdHxrfGsxfGsyfGszfGs0fGtlcm5lbE1hdHJpeHxrZXJuZWxVbml0TGVuZ3RofGtlcm5pbmd8a2V5UG9pbnRzfGtleVNwbGluZXN8a2V5VGltZXN8bGVuZ3RoQWRqdXN0fGxldHRlclNwYWNpbmd8bGlnaHRpbmdDb2xvcnxsaW1pdGluZ0NvbmVBbmdsZXxsb2NhbHxtYXJrZXJFbmR8bWFya2VyTWlkfG1hcmtlclN0YXJ0fG1hcmtlckhlaWdodHxtYXJrZXJVbml0c3xtYXJrZXJXaWR0aHxtYXNrfG1hc2tDb250ZW50VW5pdHN8bWFza1VuaXRzfG1hdGhlbWF0aWNhbHxtb2RlfG51bU9jdGF2ZXN8b2Zmc2V0fG9wYWNpdHl8b3BlcmF0b3J8b3JkZXJ8b3JpZW50fG9yaWVudGF0aW9ufG9yaWdpbnxvdmVyZmxvd3xvdmVybGluZVBvc2l0aW9ufG92ZXJsaW5lVGhpY2tuZXNzfHBhbm9zZTF8cGFpbnRPcmRlcnxwYXRoTGVuZ3RofHBhdHRlcm5Db250ZW50VW5pdHN8cGF0dGVyblRyYW5zZm9ybXxwYXR0ZXJuVW5pdHN8cG9pbnRlckV2ZW50c3xwb2ludHN8cG9pbnRzQXRYfHBvaW50c0F0WXxwb2ludHNBdFp8cHJlc2VydmVBbHBoYXxwcmVzZXJ2ZUFzcGVjdFJhdGlvfHByaW1pdGl2ZVVuaXRzfHJ8cmFkaXVzfHJlZlh8cmVmWXxyZW5kZXJpbmdJbnRlbnR8cmVwZWF0Q291bnR8cmVwZWF0RHVyfHJlcXVpcmVkRXh0ZW5zaW9uc3xyZXF1aXJlZEZlYXR1cmVzfHJlc3RhcnR8cmVzdWx0fHJvdGF0ZXxyeHxyeXxzY2FsZXxzZWVkfHNoYXBlUmVuZGVyaW5nfHNsb3BlfHNwYWNpbmd8c3BlY3VsYXJDb25zdGFudHxzcGVjdWxhckV4cG9uZW50fHNwZWVkfHNwcmVhZE1ldGhvZHxzdGFydE9mZnNldHxzdGREZXZpYXRpb258c3RlbWh8c3RlbXZ8c3RpdGNoVGlsZXN8c3RvcENvbG9yfHN0b3BPcGFjaXR5fHN0cmlrZXRocm91Z2hQb3NpdGlvbnxzdHJpa2V0aHJvdWdoVGhpY2tuZXNzfHN0cmluZ3xzdHJva2V8c3Ryb2tlRGFzaGFycmF5fHN0cm9rZURhc2hvZmZzZXR8c3Ryb2tlTGluZWNhcHxzdHJva2VMaW5lam9pbnxzdHJva2VNaXRlcmxpbWl0fHN0cm9rZU9wYWNpdHl8c3Ryb2tlV2lkdGh8c3VyZmFjZVNjYWxlfHN5c3RlbUxhbmd1YWdlfHRhYmxlVmFsdWVzfHRhcmdldFh8dGFyZ2V0WXx0ZXh0QW5jaG9yfHRleHREZWNvcmF0aW9ufHRleHRSZW5kZXJpbmd8dGV4dExlbmd0aHx0b3x0cmFuc2Zvcm18dTF8dTJ8dW5kZXJsaW5lUG9zaXRpb258dW5kZXJsaW5lVGhpY2tuZXNzfHVuaWNvZGV8dW5pY29kZUJpZGl8dW5pY29kZVJhbmdlfHVuaXRzUGVyRW18dkFscGhhYmV0aWN8dkhhbmdpbmd8dklkZW9ncmFwaGljfHZNYXRoZW1hdGljYWx8dmFsdWVzfHZlY3RvckVmZmVjdHx2ZXJzaW9ufHZlcnRBZHZZfHZlcnRPcmlnaW5YfHZlcnRPcmlnaW5ZfHZpZXdCb3h8dmlld1RhcmdldHx2aXNpYmlsaXR5fHdpZHRoc3x3b3JkU3BhY2luZ3x3cml0aW5nTW9kZXx4fHhIZWlnaHR8eDF8eDJ8eENoYW5uZWxTZWxlY3Rvcnx4bGlua0FjdHVhdGV8eGxpbmtBcmNyb2xlfHhsaW5rSHJlZnx4bGlua1JvbGV8eGxpbmtTaG93fHhsaW5rVGl0bGV8eGxpbmtUeXBlfHhtbEJhc2V8eG1sbnN8eG1sbnNYbGlua3x4bWxMYW5nfHhtbFNwYWNlfHl8eTF8eTJ8eUNoYW5uZWxTZWxlY3Rvcnx6fHpvb21BbmRQYW58Zm9yfGNsYXNzfGF1dG9mb2N1cyl8KChbRGRdW0FhXVtUdF1bQWFdfFtBYV1bUnJdW0lpXVtBYV18eCktLiopKSQvOyAvLyBodHRwczovL2VzYmVuY2guY29tL2JlbmNoLzViZmVlNjhhNGNkN2U2MDA5ZWY2MWQyM1xuXG52YXIgaXNQcm9wVmFsaWQgPSAvKiAjX19QVVJFX18gKi9tZW1vaXplKGZ1bmN0aW9uIChwcm9wKSB7XG4gIHJldHVybiByZWFjdFByb3BzUmVnZXgudGVzdChwcm9wKSB8fCBwcm9wLmNoYXJDb2RlQXQoMCkgPT09IDExMVxuICAvKiBvICovXG4gICYmIHByb3AuY2hhckNvZGVBdCgxKSA9PT0gMTEwXG4gIC8qIG4gKi9cbiAgJiYgcHJvcC5jaGFyQ29kZUF0KDIpIDwgOTE7XG59XG4vKiBaKzEgKi9cbik7XG5cbmV4cG9ydCB7IGlzUHJvcFZhbGlkIGFzIGRlZmF1bHQgfTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js":
/*!*******************************************************************!*\
  !*** ./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js ***!
  \*******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ memoize)\n/* harmony export */ });\nfunction memoize(fn) {\n  var cache = Object.create(null);\n  return function (arg) {\n    if (cache[arg] === undefined) cache[arg] = fn(arg);\n    return cache[arg];\n  };\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZW1vdGlvbi9tZW1vaXplL2Rpc3QvZW1vdGlvbi1tZW1vaXplLmVzbS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRThCIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BlbW90aW9uL21lbW9pemUvZGlzdC9lbW90aW9uLW1lbW9pemUuZXNtLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIG1lbW9pemUoZm4pIHtcbiAgdmFyIGNhY2hlID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHtcbiAgICBpZiAoY2FjaGVbYXJnXSA9PT0gdW5kZWZpbmVkKSBjYWNoZVthcmddID0gZm4oYXJnKTtcbiAgICByZXR1cm4gY2FjaGVbYXJnXTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgbWVtb2l6ZSBhcyBkZWZhdWx0IH07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@emotion/memoize/dist/emotion-memoize.esm.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/AddMiniApp.js":
/*!************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/AddMiniApp.js ***!
  \************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   InvalidDomainManifest: () => (/* binding */ InvalidDomainManifest),\n/* harmony export */   RejectedByUser: () => (/* binding */ RejectedByUser)\n/* harmony export */ });\n/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../errors.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/errors.js\");\n\n/**\n * Thrown when the miniapp does not have a valid domain manifest.\n */\nclass InvalidDomainManifest extends _errors_js__WEBPACK_IMPORTED_MODULE_0__.BaseError {\n    name = 'AddMiniApp.InvalidDomainManifest';\n    constructor() {\n        super('Invalid domain manifest');\n    }\n}\n/**\n * Thrown when add miniapp action was rejected by the user.\n */\nclass RejectedByUser extends _errors_js__WEBPACK_IMPORTED_MODULE_0__.BaseError {\n    name = 'AddMiniApp.RejectedByUser';\n    constructor() {\n        super('Add miniapp rejected by user');\n    }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9BZGRNaW5pQXBwLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDTyxvQ0FBb0MsaURBQWdCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyw2QkFBNkIsaURBQWdCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL2FjdGlvbnMvQWRkTWluaUFwcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBFcnJvcnMgZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgbWluaWFwcCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgZG9tYWluIG1hbmlmZXN0LlxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZERvbWFpbk1hbmlmZXN0IGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgbmFtZSA9ICdBZGRNaW5pQXBwLkludmFsaWREb21haW5NYW5pZmVzdCc7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdJbnZhbGlkIGRvbWFpbiBtYW5pZmVzdCcpO1xuICAgIH1cbn1cbi8qKlxuICogVGhyb3duIHdoZW4gYWRkIG1pbmlhcHAgYWN0aW9uIHdhcyByZWplY3RlZCBieSB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlamVjdGVkQnlVc2VyIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgbmFtZSA9ICdBZGRNaW5pQXBwLlJlamVjdGVkQnlVc2VyJztcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ0FkZCBtaW5pYXBwIHJlamVjdGVkIGJ5IHVzZXInKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/AddMiniApp.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ComposeCast.js":
/*!*************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/ComposeCast.js ***!
  \*************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9Db21wb3NlQ2FzdC5qcyIsIm1hcHBpbmdzIjoiO0FBQVUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL2FjdGlvbnMvQ29tcG9zZUNhc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHt9O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ComposeCast.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/Haptics.js":
/*!*********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/Haptics.js ***!
  \*********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9IYXB0aWNzLmpzIiwibWFwcGluZ3MiOiI7QUFBVSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9IYXB0aWNzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7fTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/Haptics.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/OpenMiniApp.js":
/*!*************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/OpenMiniApp.js ***!
  \*************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9PcGVuTWluaUFwcC5qcyIsIm1hcHBpbmdzIjoiO0FBQVUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL2FjdGlvbnMvT3Blbk1pbmlBcHAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHt9O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/OpenMiniApp.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/Ready.js":
/*!*******************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/Ready.js ***!
  \*******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   DEFAULT_READY_OPTIONS: () => (/* binding */ DEFAULT_READY_OPTIONS)\n/* harmony export */ });\nconst DEFAULT_READY_OPTIONS = {\n    disableNativeGestures: false,\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9SZWFkeS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQU87QUFDUDtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9hY3Rpb25zL1JlYWR5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBERUZBVUxUX1JFQURZX09QVElPTlMgPSB7XG4gICAgZGlzYWJsZU5hdGl2ZUdlc3R1cmVzOiBmYWxzZSxcbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/Ready.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/RequestCameraAndMicrophoneAccess.js":
/*!**********************************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/RequestCameraAndMicrophoneAccess.js ***!
  \**********************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9SZXF1ZXN0Q2FtZXJhQW5kTWljcm9waG9uZUFjY2Vzcy5qcyIsIm1hcHBpbmdzIjoiO0FBQVUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL2FjdGlvbnMvUmVxdWVzdENhbWVyYUFuZE1pY3JvcGhvbmVBY2Nlc3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHt9O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/RequestCameraAndMicrophoneAccess.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SendToken.js":
/*!***********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/SendToken.js ***!
  \***********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9TZW5kVG9rZW4uanMiLCJtYXBwaW5ncyI6IjtBQUFVIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9hY3Rpb25zL1NlbmRUb2tlbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge307XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SendToken.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SignIn.js":
/*!********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/SignIn.js ***!
  \********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   RejectedByUser: () => (/* binding */ RejectedByUser)\n/* harmony export */ });\n/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../errors.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/errors.js\");\n\n/**\n * Thrown when a sign in action was rejected.\n */\nclass RejectedByUser extends _errors_js__WEBPACK_IMPORTED_MODULE_0__.BaseError {\n    name = 'SignIn.RejectedByUser';\n    constructor() {\n        super('Sign in rejected by user');\n    }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9TaWduSW4uanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ08sNkJBQTZCLGlEQUFnQjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9hY3Rpb25zL1NpZ25Jbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBFcnJvcnMgZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHNpZ24gaW4gYWN0aW9uIHdhcyByZWplY3RlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlamVjdGVkQnlVc2VyIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgbmFtZSA9ICdTaWduSW4uUmVqZWN0ZWRCeVVzZXInO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignU2lnbiBpbiByZWplY3RlZCBieSB1c2VyJyk7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SignIn.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SignManifest.js":
/*!**************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/SignManifest.js ***!
  \**************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   GenericError: () => (/* binding */ GenericError),\n/* harmony export */   InvalidDomain: () => (/* binding */ InvalidDomain),\n/* harmony export */   RejectedByUser: () => (/* binding */ RejectedByUser)\n/* harmony export */ });\n/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../errors.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/errors.js\");\n\n/**\n * Thrown when sign manifest action was rejected by the user.\n */\nclass RejectedByUser extends _errors_js__WEBPACK_IMPORTED_MODULE_0__.BaseError {\n    name = 'SignManifest.RejectedByUser';\n    constructor() {\n        super('Sign manifest rejected by user');\n    }\n}\n/**\n * Thrown when the provided domain is invalid.\n */\nclass InvalidDomain extends _errors_js__WEBPACK_IMPORTED_MODULE_0__.BaseError {\n    name = 'SignManifest.InvalidDomain';\n    constructor() {\n        super('Invalid domain provided');\n    }\n}\n/**\n * Thrown when manifest signing fails for generic reasons.\n */\nclass GenericError extends _errors_js__WEBPACK_IMPORTED_MODULE_0__.BaseError {\n    name = 'SignManifest.GenericError';\n    constructor(message = 'Manifest signing failed') {\n        super(message);\n    }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9TaWduTWFuaWZlc3QuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDTyw2QkFBNkIsaURBQWdCO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyw0QkFBNEIsaURBQWdCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTywyQkFBMkIsaURBQWdCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL2FjdGlvbnMvU2lnbk1hbmlmZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEVycm9ycyBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG4vKipcbiAqIFRocm93biB3aGVuIHNpZ24gbWFuaWZlc3QgYWN0aW9uIHdhcyByZWplY3RlZCBieSB0aGUgdXNlci5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlamVjdGVkQnlVc2VyIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgbmFtZSA9ICdTaWduTWFuaWZlc3QuUmVqZWN0ZWRCeVVzZXInO1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignU2lnbiBtYW5pZmVzdCByZWplY3RlZCBieSB1c2VyJyk7XG4gICAgfVxufVxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcHJvdmlkZWQgZG9tYWluIGlzIGludmFsaWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkRG9tYWluIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgbmFtZSA9ICdTaWduTWFuaWZlc3QuSW52YWxpZERvbWFpbic7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdJbnZhbGlkIGRvbWFpbiBwcm92aWRlZCcpO1xuICAgIH1cbn1cbi8qKlxuICogVGhyb3duIHdoZW4gbWFuaWZlc3Qgc2lnbmluZyBmYWlscyBmb3IgZ2VuZXJpYyByZWFzb25zLlxuICovXG5leHBvcnQgY2xhc3MgR2VuZXJpY0Vycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgbmFtZSA9ICdTaWduTWFuaWZlc3QuR2VuZXJpY0Vycm9yJztcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ01hbmlmZXN0IHNpZ25pbmcgZmFpbGVkJykge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SignManifest.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SwapToken.js":
/*!***********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/SwapToken.js ***!
  \***********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9Td2FwVG9rZW4uanMiLCJtYXBwaW5ncyI6IjtBQUFVIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9hY3Rpb25zL1N3YXBUb2tlbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge307XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SwapToken.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ViewCast.js":
/*!**********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/ViewCast.js ***!
  \**********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9WaWV3Q2FzdC5qcyIsIm1hcHBpbmdzIjoiO0FBQVUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL2FjdGlvbnMvVmlld0Nhc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHt9O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ViewCast.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ViewProfile.js":
/*!*************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/ViewProfile.js ***!
  \*************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9WaWV3UHJvZmlsZS5qcyIsIm1hcHBpbmdzIjoiO0FBQVUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL2FjdGlvbnMvVmlld1Byb2ZpbGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHt9O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ViewProfile.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ViewToken.js":
/*!***********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/ViewToken.js ***!
  \***********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9WaWV3VG9rZW4uanMiLCJtYXBwaW5ncyI6IjtBQUFVIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9hY3Rpb25zL1ZpZXdUb2tlbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge307XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ViewToken.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/index.js":
/*!*******************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/actions/index.js ***!
  \*******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   AddMiniApp: () => (/* reexport module object */ _AddMiniApp_js__WEBPACK_IMPORTED_MODULE_0__),\n/* harmony export */   ComposeCast: () => (/* reexport module object */ _ComposeCast_js__WEBPACK_IMPORTED_MODULE_1__),\n/* harmony export */   Haptics: () => (/* reexport module object */ _Haptics_js__WEBPACK_IMPORTED_MODULE_2__),\n/* harmony export */   OpenMiniApp: () => (/* reexport module object */ _OpenMiniApp_js__WEBPACK_IMPORTED_MODULE_3__),\n/* harmony export */   Ready: () => (/* reexport module object */ _Ready_js__WEBPACK_IMPORTED_MODULE_4__),\n/* harmony export */   RequestCameraAndMicrophoneAccess: () => (/* reexport module object */ _RequestCameraAndMicrophoneAccess_js__WEBPACK_IMPORTED_MODULE_5__),\n/* harmony export */   SendToken: () => (/* reexport module object */ _SendToken_js__WEBPACK_IMPORTED_MODULE_6__),\n/* harmony export */   SignIn: () => (/* reexport module object */ _SignIn_js__WEBPACK_IMPORTED_MODULE_7__),\n/* harmony export */   SignManifest: () => (/* reexport module object */ _SignManifest_js__WEBPACK_IMPORTED_MODULE_8__),\n/* harmony export */   SwapToken: () => (/* reexport module object */ _SwapToken_js__WEBPACK_IMPORTED_MODULE_9__),\n/* harmony export */   ViewCast: () => (/* reexport module object */ _ViewCast_js__WEBPACK_IMPORTED_MODULE_10__),\n/* harmony export */   ViewProfile: () => (/* reexport module object */ _ViewProfile_js__WEBPACK_IMPORTED_MODULE_11__),\n/* harmony export */   ViewToken: () => (/* reexport module object */ _ViewToken_js__WEBPACK_IMPORTED_MODULE_12__)\n/* harmony export */ });\n/* harmony import */ var _AddMiniApp_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AddMiniApp.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/AddMiniApp.js\");\n/* harmony import */ var _ComposeCast_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ComposeCast.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ComposeCast.js\");\n/* harmony import */ var _Haptics_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Haptics.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/Haptics.js\");\n/* harmony import */ var _OpenMiniApp_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./OpenMiniApp.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/OpenMiniApp.js\");\n/* harmony import */ var _Ready_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Ready.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/Ready.js\");\n/* harmony import */ var _RequestCameraAndMicrophoneAccess_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./RequestCameraAndMicrophoneAccess.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/RequestCameraAndMicrophoneAccess.js\");\n/* harmony import */ var _SendToken_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./SendToken.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SendToken.js\");\n/* harmony import */ var _SignIn_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./SignIn.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SignIn.js\");\n/* harmony import */ var _SignManifest_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./SignManifest.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SignManifest.js\");\n/* harmony import */ var _SwapToken_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./SwapToken.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/SwapToken.js\");\n/* harmony import */ var _ViewCast_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./ViewCast.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ViewCast.js\");\n/* harmony import */ var _ViewProfile_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ViewProfile.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ViewProfile.js\");\n/* harmony import */ var _ViewToken_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./ViewToken.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/ViewToken.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYWN0aW9ucy9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUE4QztBQUNFO0FBQ1I7QUFDUTtBQUNaO0FBQ3NEO0FBQzlDO0FBQ047QUFDWTtBQUNOO0FBQ0Y7QUFDTTtBQUNKIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9hY3Rpb25zL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIEFkZE1pbmlBcHAgZnJvbSBcIi4vQWRkTWluaUFwcC5qc1wiO1xuZXhwb3J0ICogYXMgQ29tcG9zZUNhc3QgZnJvbSBcIi4vQ29tcG9zZUNhc3QuanNcIjtcbmV4cG9ydCAqIGFzIEhhcHRpY3MgZnJvbSBcIi4vSGFwdGljcy5qc1wiO1xuZXhwb3J0ICogYXMgT3Blbk1pbmlBcHAgZnJvbSBcIi4vT3Blbk1pbmlBcHAuanNcIjtcbmV4cG9ydCAqIGFzIFJlYWR5IGZyb20gXCIuL1JlYWR5LmpzXCI7XG5leHBvcnQgKiBhcyBSZXF1ZXN0Q2FtZXJhQW5kTWljcm9waG9uZUFjY2VzcyBmcm9tIFwiLi9SZXF1ZXN0Q2FtZXJhQW5kTWljcm9waG9uZUFjY2Vzcy5qc1wiO1xuZXhwb3J0ICogYXMgU2VuZFRva2VuIGZyb20gXCIuL1NlbmRUb2tlbi5qc1wiO1xuZXhwb3J0ICogYXMgU2lnbkluIGZyb20gXCIuL1NpZ25Jbi5qc1wiO1xuZXhwb3J0ICogYXMgU2lnbk1hbmlmZXN0IGZyb20gXCIuL1NpZ25NYW5pZmVzdC5qc1wiO1xuZXhwb3J0ICogYXMgU3dhcFRva2VuIGZyb20gXCIuL1N3YXBUb2tlbi5qc1wiO1xuZXhwb3J0ICogYXMgVmlld0Nhc3QgZnJvbSBcIi4vVmlld0Nhc3QuanNcIjtcbmV4cG9ydCAqIGFzIFZpZXdQcm9maWxlIGZyb20gXCIuL1ZpZXdQcm9maWxlLmpzXCI7XG5leHBvcnQgKiBhcyBWaWV3VG9rZW4gZnJvbSBcIi4vVmlld1Rva2VuLmpzXCI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/back.js":
/*!**********************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/back.js ***!
  \**********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   DEFAULT_BACK_STATE: () => (/* binding */ DEFAULT_BACK_STATE)\n/* harmony export */ });\nconst DEFAULT_BACK_STATE = {\n    visible: false,\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vYmFjay5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQU87QUFDUDtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9iYWNrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBERUZBVUxUX0JBQ0tfU1RBVEUgPSB7XG4gICAgdmlzaWJsZTogZmFsc2UsXG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/back.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/context.js":
/*!*************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/context.js ***!
  \*************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vY29udGV4dC5qcyIsIm1hcHBpbmdzIjoiO0FBQVUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHt9O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/context.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/errors.js":
/*!************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/errors.js ***!
  \************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   BaseError: () => (/* binding */ BaseError)\n/* harmony export */ });\nclass BaseError extends Error {\n    name = 'BaseError';\n    cause;\n    constructor(message, options = {}) {\n        super(message, options.cause ? { cause: options.cause } : undefined);\n        this.cause = options.cause;\n    }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vZXJyb3JzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBTztBQUNQO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckMseUNBQXlDLHVCQUF1QjtBQUNoRTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL2Vycm9ycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQmFzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIG5hbWUgPSAnQmFzZUVycm9yJztcbiAgICBjYXVzZTtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucy5jYXVzZSA/IHsgY2F1c2U6IG9wdGlvbnMuY2F1c2UgfSA6IHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuY2F1c2UgPSBvcHRpb25zLmNhdXNlO1xuICAgIH1cbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/errors.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/index.js":
/*!***********************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/index.js ***!
  \***********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   AddMiniApp: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.AddMiniApp),\n/* harmony export */   Back: () => (/* reexport module object */ _back_js__WEBPACK_IMPORTED_MODULE_1__),\n/* harmony export */   ComposeCast: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.ComposeCast),\n/* harmony export */   Context: () => (/* reexport module object */ _context_js__WEBPACK_IMPORTED_MODULE_2__),\n/* harmony export */   DEFAULT_READY_OPTIONS: () => (/* reexport safe */ _types_js__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_READY_OPTIONS),\n/* harmony export */   Errors: () => (/* reexport module object */ _errors_js__WEBPACK_IMPORTED_MODULE_3__),\n/* harmony export */   Ethereum: () => (/* reexport safe */ _wallet_index_js__WEBPACK_IMPORTED_MODULE_9__.Ethereum),\n/* harmony export */   Haptics: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.Haptics),\n/* harmony export */   Manifest: () => (/* reexport module object */ _manifest_js__WEBPACK_IMPORTED_MODULE_4__),\n/* harmony export */   OpenMiniApp: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.OpenMiniApp),\n/* harmony export */   Ready: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.Ready),\n/* harmony export */   RequestCameraAndMicrophoneAccess: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.RequestCameraAndMicrophoneAccess),\n/* harmony export */   SendToken: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.SendToken),\n/* harmony export */   SignIn: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.SignIn),\n/* harmony export */   SignManifest: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.SignManifest),\n/* harmony export */   SolanaConnection: () => (/* reexport safe */ _solana_js__WEBPACK_IMPORTED_MODULE_6__.SolanaConnection),\n/* harmony export */   SwapToken: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.SwapToken),\n/* harmony export */   ViewCast: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.ViewCast),\n/* harmony export */   ViewProfile: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.ViewProfile),\n/* harmony export */   ViewToken: () => (/* reexport safe */ _actions_index_js__WEBPACK_IMPORTED_MODULE_0__.ViewToken),\n/* harmony export */   actionLaunchFrameSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.actionLaunchFrameSchema),\n/* harmony export */   actionLaunchMiniAppSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.actionLaunchMiniAppSchema),\n/* harmony export */   actionSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.actionSchema),\n/* harmony export */   actionViewTokenSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.actionViewTokenSchema),\n/* harmony export */   aspectRatioSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.aspectRatioSchema),\n/* harmony export */   buttonSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.buttonSchema),\n/* harmony export */   buttonTitleSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.buttonTitleSchema),\n/* harmony export */   caip19TokenSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.caip19TokenSchema),\n/* harmony export */   chains: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.chains),\n/* harmony export */   createSimpleStringSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.createSimpleStringSchema),\n/* harmony export */   createSolanaWalletProvider: () => (/* reexport safe */ _solana_js__WEBPACK_IMPORTED_MODULE_6__.createSolanaWalletProvider),\n/* harmony export */   descriptionSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.descriptionSchema),\n/* harmony export */   domainManifestSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.domainManifestSchema),\n/* harmony export */   domainMiniAppConfigSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.domainMiniAppConfigSchema),\n/* harmony export */   domainSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.domainSchema),\n/* harmony export */   encodedJsonFarcasterSignatureSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.encodedJsonFarcasterSignatureSchema),\n/* harmony export */   eventMiniAppAddedSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.eventMiniAppAddedSchema),\n/* harmony export */   eventMiniAppRemovedSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.eventMiniAppRemovedSchema),\n/* harmony export */   eventNotificationsEnabledSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.eventNotificationsEnabledSchema),\n/* harmony export */   hexColorSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.hexColorSchema),\n/* harmony export */   jsonFarcasterSignatureHeaderSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.jsonFarcasterSignatureHeaderSchema),\n/* harmony export */   miniAppEmbedNextSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.miniAppEmbedNextSchema),\n/* harmony export */   miniAppHostCapabilityList: () => (/* reexport safe */ _types_js__WEBPACK_IMPORTED_MODULE_8__.miniAppHostCapabilityList),\n/* harmony export */   miniAppNameSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.miniAppNameSchema),\n/* harmony export */   noindexSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.noindexSchema),\n/* harmony export */   notificationDetailsSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.notificationDetailsSchema),\n/* harmony export */   notificationsDisabledSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.notificationsDisabledSchema),\n/* harmony export */   ogDescriptionSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.ogDescriptionSchema),\n/* harmony export */   ogTitleSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.ogTitleSchema),\n/* harmony export */   primaryCategories: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.primaryCategories),\n/* harmony export */   primaryCategorySchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.primaryCategorySchema),\n/* harmony export */   requiredCapabilitiesSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.requiredCapabilitiesSchema),\n/* harmony export */   requiredChainsSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.requiredChainsSchema),\n/* harmony export */   safeParseFrameEmbed: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.safeParseFrameEmbed),\n/* harmony export */   safeParseMiniAppEmbed: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.safeParseMiniAppEmbed),\n/* harmony export */   screenshotUrlsSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.screenshotUrlsSchema),\n/* harmony export */   secureUrlSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.secureUrlSchema),\n/* harmony export */   sendNotificationRequestSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.sendNotificationRequestSchema),\n/* harmony export */   sendNotificationResponseSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.sendNotificationResponseSchema),\n/* harmony export */   serverEventSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.serverEventSchema),\n/* harmony export */   subtitleSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.subtitleSchema),\n/* harmony export */   taglineSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.taglineSchema),\n/* harmony export */   tagsSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.tagsSchema),\n/* harmony export */   unwrapSolanaProviderRequest: () => (/* reexport safe */ _solanaWire_js__WEBPACK_IMPORTED_MODULE_7__.unwrapSolanaProviderRequest),\n/* harmony export */   versionSchema: () => (/* reexport safe */ _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__.versionSchema),\n/* harmony export */   wrapSolanaProviderRequest: () => (/* reexport safe */ _solanaWire_js__WEBPACK_IMPORTED_MODULE_7__.wrapSolanaProviderRequest)\n/* harmony export */ });\n/* harmony import */ var _actions_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions/index.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/index.js\");\n/* harmony import */ var _back_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./back.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/back.js\");\n/* harmony import */ var _context_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./context.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/context.js\");\n/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./errors.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/errors.js\");\n/* harmony import */ var _manifest_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./manifest.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/manifest.js\");\n/* harmony import */ var _schemas_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./schemas/index.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/index.js\");\n/* harmony import */ var _solana_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./solana.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/solana.js\");\n/* harmony import */ var _solanaWire_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./solanaWire.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/solanaWire.js\");\n/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./types.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/types.js\");\n/* harmony import */ var _wallet_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./wallet/index.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/wallet/index.js\");\n\n\n\n\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFtQztBQUNEO0FBQ007QUFDRjtBQUNJO0FBQ1A7QUFDUDtBQUNJO0FBQ0w7QUFDTyIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYWN0aW9ucy9pbmRleC5qc1wiO1xuZXhwb3J0ICogYXMgQmFjayBmcm9tIFwiLi9iYWNrLmpzXCI7XG5leHBvcnQgKiBhcyBDb250ZXh0IGZyb20gXCIuL2NvbnRleHQuanNcIjtcbmV4cG9ydCAqIGFzIEVycm9ycyBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmV4cG9ydCAqIGFzIE1hbmlmZXN0IGZyb20gXCIuL21hbmlmZXN0LmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zY2hlbWFzL2luZGV4LmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zb2xhbmEuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NvbGFuYVdpcmUuanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93YWxsZXQvaW5kZXguanNcIjtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/manifest.js":
/*!**************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/manifest.js ***!
  \**************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getMiniAppConfig: () => (/* binding */ getMiniAppConfig)\n/* harmony export */ });\n/**\n * Helper function to get the MiniApp config from a manifest,\n * supporting both 'miniapp' and 'frame' properties during the transition period\n */\nfunction getMiniAppConfig(manifest) {\n    return manifest.miniapp || manifest.frame;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vbWFuaWZlc3QuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9tYW5pZmVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIE1pbmlBcHAgY29uZmlnIGZyb20gYSBtYW5pZmVzdCxcbiAqIHN1cHBvcnRpbmcgYm90aCAnbWluaWFwcCcgYW5kICdmcmFtZScgcHJvcGVydGllcyBkdXJpbmcgdGhlIHRyYW5zaXRpb24gcGVyaW9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaW5pQXBwQ29uZmlnKG1hbmlmZXN0KSB7XG4gICAgcmV0dXJuIG1hbmlmZXN0Lm1pbmlhcHAgfHwgbWFuaWZlc3QuZnJhbWU7XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/manifest.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/embeds.js":
/*!********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/schemas/embeds.js ***!
  \********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   actionLaunchFrameSchema: () => (/* binding */ actionLaunchFrameSchema),\n/* harmony export */   actionLaunchMiniAppSchema: () => (/* binding */ actionLaunchMiniAppSchema),\n/* harmony export */   actionSchema: () => (/* binding */ actionSchema),\n/* harmony export */   actionViewTokenSchema: () => (/* binding */ actionViewTokenSchema),\n/* harmony export */   buttonSchema: () => (/* binding */ buttonSchema),\n/* harmony export */   miniAppEmbedNextSchema: () => (/* binding */ miniAppEmbedNextSchema),\n/* harmony export */   safeParseFrameEmbed: () => (/* binding */ safeParseFrameEmbed),\n/* harmony export */   safeParseMiniAppEmbed: () => (/* binding */ safeParseMiniAppEmbed)\n/* harmony export */ });\n/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! zod */ \"(app-pages-browser)/./node_modules/zod/v3/types.js\");\n/* harmony import */ var _shared_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shared.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/shared.js\");\n\n\nconst actionLaunchFrameSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    type: zod__WEBPACK_IMPORTED_MODULE_1__.literal('launch_frame'),\n    name: _shared_js__WEBPACK_IMPORTED_MODULE_0__.miniAppNameSchema,\n    url: _shared_js__WEBPACK_IMPORTED_MODULE_0__.secureUrlSchema.optional(),\n    splashImageUrl: _shared_js__WEBPACK_IMPORTED_MODULE_0__.secureUrlSchema.optional(),\n    splashBackgroundColor: _shared_js__WEBPACK_IMPORTED_MODULE_0__.hexColorSchema.optional(),\n});\nconst actionLaunchMiniAppSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    type: zod__WEBPACK_IMPORTED_MODULE_1__.literal('launch_miniapp'),\n    name: _shared_js__WEBPACK_IMPORTED_MODULE_0__.miniAppNameSchema,\n    url: _shared_js__WEBPACK_IMPORTED_MODULE_0__.secureUrlSchema.optional(),\n    splashImageUrl: _shared_js__WEBPACK_IMPORTED_MODULE_0__.secureUrlSchema.optional(),\n    splashBackgroundColor: _shared_js__WEBPACK_IMPORTED_MODULE_0__.hexColorSchema.optional(),\n});\nconst actionViewTokenSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    type: zod__WEBPACK_IMPORTED_MODULE_1__.literal('view_token'),\n    token: _shared_js__WEBPACK_IMPORTED_MODULE_0__.caip19TokenSchema,\n});\nconst actionSchema = zod__WEBPACK_IMPORTED_MODULE_1__.discriminatedUnion('type', [\n    actionLaunchMiniAppSchema,\n    actionViewTokenSchema,\n    // Remove after compatibility period\n    actionLaunchFrameSchema,\n]);\nconst buttonSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    title: _shared_js__WEBPACK_IMPORTED_MODULE_0__.buttonTitleSchema,\n    action: actionSchema,\n});\nconst miniAppEmbedNextSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    version: zod__WEBPACK_IMPORTED_MODULE_1__.union([zod__WEBPACK_IMPORTED_MODULE_1__.string(), zod__WEBPACK_IMPORTED_MODULE_1__.number()])\n        .transform((val) => String(val))\n        .pipe(zod__WEBPACK_IMPORTED_MODULE_1__.union([zod__WEBPACK_IMPORTED_MODULE_1__.literal('next'), zod__WEBPACK_IMPORTED_MODULE_1__.literal('1')])),\n    imageUrl: _shared_js__WEBPACK_IMPORTED_MODULE_0__.secureUrlSchema,\n    aspectRatio: _shared_js__WEBPACK_IMPORTED_MODULE_0__.aspectRatioSchema.optional(),\n    button: buttonSchema,\n});\nconst safeParseMiniAppEmbed = (rawResponse) => miniAppEmbedNextSchema.safeParse(rawResponse);\n// Backward compatibility - also parse fc:frame meta tags\nconst safeParseFrameEmbed = safeParseMiniAppEmbed;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vc2NoZW1hcy9lbWJlZHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUF3QjtBQUNtSDtBQUNwSSxnQ0FBZ0MsdUNBQVE7QUFDL0MsVUFBVSx3Q0FBUztBQUNuQixVQUFVLHlEQUFpQjtBQUMzQixTQUFTLHVEQUFlO0FBQ3hCLG9CQUFvQix1REFBZTtBQUNuQywyQkFBMkIsc0RBQWM7QUFDekMsQ0FBQztBQUNNLGtDQUFrQyx1Q0FBUTtBQUNqRCxVQUFVLHdDQUFTO0FBQ25CLFVBQVUseURBQWlCO0FBQzNCLFNBQVMsdURBQWU7QUFDeEIsb0JBQW9CLHVEQUFlO0FBQ25DLDJCQUEyQixzREFBYztBQUN6QyxDQUFDO0FBQ00sOEJBQThCLHVDQUFRO0FBQzdDLFVBQVUsd0NBQVM7QUFDbkIsV0FBVyx5REFBaUI7QUFDNUIsQ0FBQztBQUNNLHFCQUFxQixtREFBb0I7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHFCQUFxQix1Q0FBUTtBQUNwQyxXQUFXLHlEQUFpQjtBQUM1QjtBQUNBLENBQUM7QUFDTSwrQkFBK0IsdUNBQVE7QUFDOUMsYUFBYSxzQ0FDQyxFQUFFLHVDQUFRLElBQUksdUNBQVE7QUFDcEM7QUFDQSxjQUFjLHNDQUFPLEVBQUUsd0NBQVMsVUFBVSx3Q0FBUztBQUNuRCxjQUFjLHVEQUFlO0FBQzdCLGlCQUFpQix5REFBaUI7QUFDbEM7QUFDQSxDQUFDO0FBQ007QUFDUDtBQUNPIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9zY2hlbWFzL2VtYmVkcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IGFzcGVjdFJhdGlvU2NoZW1hLCBidXR0b25UaXRsZVNjaGVtYSwgY2FpcDE5VG9rZW5TY2hlbWEsIGhleENvbG9yU2NoZW1hLCBtaW5pQXBwTmFtZVNjaGVtYSwgc2VjdXJlVXJsU2NoZW1hLCB9IGZyb20gXCIuL3NoYXJlZC5qc1wiO1xuZXhwb3J0IGNvbnN0IGFjdGlvbkxhdW5jaEZyYW1lU2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgnbGF1bmNoX2ZyYW1lJyksXG4gICAgbmFtZTogbWluaUFwcE5hbWVTY2hlbWEsXG4gICAgdXJsOiBzZWN1cmVVcmxTY2hlbWEub3B0aW9uYWwoKSxcbiAgICBzcGxhc2hJbWFnZVVybDogc2VjdXJlVXJsU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgc3BsYXNoQmFja2dyb3VuZENvbG9yOiBoZXhDb2xvclNjaGVtYS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgY29uc3QgYWN0aW9uTGF1bmNoTWluaUFwcFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICB0eXBlOiB6LmxpdGVyYWwoJ2xhdW5jaF9taW5pYXBwJyksXG4gICAgbmFtZTogbWluaUFwcE5hbWVTY2hlbWEsXG4gICAgdXJsOiBzZWN1cmVVcmxTY2hlbWEub3B0aW9uYWwoKSxcbiAgICBzcGxhc2hJbWFnZVVybDogc2VjdXJlVXJsU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgc3BsYXNoQmFja2dyb3VuZENvbG9yOiBoZXhDb2xvclNjaGVtYS5vcHRpb25hbCgpLFxufSk7XG5leHBvcnQgY29uc3QgYWN0aW9uVmlld1Rva2VuU2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHR5cGU6IHoubGl0ZXJhbCgndmlld190b2tlbicpLFxuICAgIHRva2VuOiBjYWlwMTlUb2tlblNjaGVtYSxcbn0pO1xuZXhwb3J0IGNvbnN0IGFjdGlvblNjaGVtYSA9IHouZGlzY3JpbWluYXRlZFVuaW9uKCd0eXBlJywgW1xuICAgIGFjdGlvbkxhdW5jaE1pbmlBcHBTY2hlbWEsXG4gICAgYWN0aW9uVmlld1Rva2VuU2NoZW1hLFxuICAgIC8vIFJlbW92ZSBhZnRlciBjb21wYXRpYmlsaXR5IHBlcmlvZFxuICAgIGFjdGlvbkxhdW5jaEZyYW1lU2NoZW1hLFxuXSk7XG5leHBvcnQgY29uc3QgYnV0dG9uU2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHRpdGxlOiBidXR0b25UaXRsZVNjaGVtYSxcbiAgICBhY3Rpb246IGFjdGlvblNjaGVtYSxcbn0pO1xuZXhwb3J0IGNvbnN0IG1pbmlBcHBFbWJlZE5leHRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdmVyc2lvbjogelxuICAgICAgICAudW5pb24oW3ouc3RyaW5nKCksIHoubnVtYmVyKCldKVxuICAgICAgICAudHJhbnNmb3JtKCh2YWwpID0+IFN0cmluZyh2YWwpKVxuICAgICAgICAucGlwZSh6LnVuaW9uKFt6LmxpdGVyYWwoJ25leHQnKSwgei5saXRlcmFsKCcxJyldKSksXG4gICAgaW1hZ2VVcmw6IHNlY3VyZVVybFNjaGVtYSxcbiAgICBhc3BlY3RSYXRpbzogYXNwZWN0UmF0aW9TY2hlbWEub3B0aW9uYWwoKSxcbiAgICBidXR0b246IGJ1dHRvblNjaGVtYSxcbn0pO1xuZXhwb3J0IGNvbnN0IHNhZmVQYXJzZU1pbmlBcHBFbWJlZCA9IChyYXdSZXNwb25zZSkgPT4gbWluaUFwcEVtYmVkTmV4dFNjaGVtYS5zYWZlUGFyc2UocmF3UmVzcG9uc2UpO1xuLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eSAtIGFsc28gcGFyc2UgZmM6ZnJhbWUgbWV0YSB0YWdzXG5leHBvcnQgY29uc3Qgc2FmZVBhcnNlRnJhbWVFbWJlZCA9IHNhZmVQYXJzZU1pbmlBcHBFbWJlZDtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/embeds.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/events.js":
/*!********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/schemas/events.js ***!
  \********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   eventMiniAppAddedSchema: () => (/* binding */ eventMiniAppAddedSchema),\n/* harmony export */   eventMiniAppRemovedSchema: () => (/* binding */ eventMiniAppRemovedSchema),\n/* harmony export */   eventNotificationsEnabledSchema: () => (/* binding */ eventNotificationsEnabledSchema),\n/* harmony export */   notificationsDisabledSchema: () => (/* binding */ notificationsDisabledSchema),\n/* harmony export */   serverEventSchema: () => (/* binding */ serverEventSchema)\n/* harmony export */ });\n/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! zod */ \"(app-pages-browser)/./node_modules/zod/v3/types.js\");\n/* harmony import */ var _notifications_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./notifications.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/notifications.js\");\n\n\nconst eventMiniAppAddedSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    event: zod__WEBPACK_IMPORTED_MODULE_1__.literal('miniapp_added'),\n    notificationDetails: _notifications_js__WEBPACK_IMPORTED_MODULE_0__.notificationDetailsSchema.optional(),\n});\nconst eventMiniAppRemovedSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    event: zod__WEBPACK_IMPORTED_MODULE_1__.literal('miniapp_removed'),\n});\nconst eventNotificationsEnabledSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    event: zod__WEBPACK_IMPORTED_MODULE_1__.literal('notifications_enabled'),\n    notificationDetails: _notifications_js__WEBPACK_IMPORTED_MODULE_0__.notificationDetailsSchema.required(),\n});\nconst notificationsDisabledSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    event: zod__WEBPACK_IMPORTED_MODULE_1__.literal('notifications_disabled'),\n});\nconst serverEventSchema = zod__WEBPACK_IMPORTED_MODULE_1__.discriminatedUnion('event', [\n    eventMiniAppAddedSchema,\n    eventMiniAppRemovedSchema,\n    eventNotificationsEnabledSchema,\n    notificationsDisabledSchema,\n]);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vc2NoZW1hcy9ldmVudHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUF3QjtBQUN1QztBQUN4RCxnQ0FBZ0MsdUNBQVE7QUFDL0MsV0FBVyx3Q0FBUztBQUNwQix5QkFBeUIsd0VBQXlCO0FBQ2xELENBQUM7QUFDTSxrQ0FBa0MsdUNBQVE7QUFDakQsV0FBVyx3Q0FBUztBQUNwQixDQUFDO0FBQ00sd0NBQXdDLHVDQUFRO0FBQ3ZELFdBQVcsd0NBQVM7QUFDcEIseUJBQXlCLHdFQUF5QjtBQUNsRCxDQUFDO0FBQ00sb0NBQW9DLHVDQUFRO0FBQ25ELFdBQVcsd0NBQVM7QUFDcEIsQ0FBQztBQUNNLDBCQUEwQixtREFBb0I7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vc2NoZW1hcy9ldmVudHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBub3RpZmljYXRpb25EZXRhaWxzU2NoZW1hIH0gZnJvbSBcIi4vbm90aWZpY2F0aW9ucy5qc1wiO1xuZXhwb3J0IGNvbnN0IGV2ZW50TWluaUFwcEFkZGVkU2NoZW1hID0gei5vYmplY3Qoe1xuICAgIGV2ZW50OiB6LmxpdGVyYWwoJ21pbmlhcHBfYWRkZWQnKSxcbiAgICBub3RpZmljYXRpb25EZXRhaWxzOiBub3RpZmljYXRpb25EZXRhaWxzU2NoZW1hLm9wdGlvbmFsKCksXG59KTtcbmV4cG9ydCBjb25zdCBldmVudE1pbmlBcHBSZW1vdmVkU2NoZW1hID0gei5vYmplY3Qoe1xuICAgIGV2ZW50OiB6LmxpdGVyYWwoJ21pbmlhcHBfcmVtb3ZlZCcpLFxufSk7XG5leHBvcnQgY29uc3QgZXZlbnROb3RpZmljYXRpb25zRW5hYmxlZFNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICBldmVudDogei5saXRlcmFsKCdub3RpZmljYXRpb25zX2VuYWJsZWQnKSxcbiAgICBub3RpZmljYXRpb25EZXRhaWxzOiBub3RpZmljYXRpb25EZXRhaWxzU2NoZW1hLnJlcXVpcmVkKCksXG59KTtcbmV4cG9ydCBjb25zdCBub3RpZmljYXRpb25zRGlzYWJsZWRTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgZXZlbnQ6IHoubGl0ZXJhbCgnbm90aWZpY2F0aW9uc19kaXNhYmxlZCcpLFxufSk7XG5leHBvcnQgY29uc3Qgc2VydmVyRXZlbnRTY2hlbWEgPSB6LmRpc2NyaW1pbmF0ZWRVbmlvbignZXZlbnQnLCBbXG4gICAgZXZlbnRNaW5pQXBwQWRkZWRTY2hlbWEsXG4gICAgZXZlbnRNaW5pQXBwUmVtb3ZlZFNjaGVtYSxcbiAgICBldmVudE5vdGlmaWNhdGlvbnNFbmFibGVkU2NoZW1hLFxuICAgIG5vdGlmaWNhdGlvbnNEaXNhYmxlZFNjaGVtYSxcbl0pO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/events.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/index.js":
/*!*******************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/schemas/index.js ***!
  \*******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   actionLaunchFrameSchema: () => (/* reexport safe */ _embeds_js__WEBPACK_IMPORTED_MODULE_0__.actionLaunchFrameSchema),\n/* harmony export */   actionLaunchMiniAppSchema: () => (/* reexport safe */ _embeds_js__WEBPACK_IMPORTED_MODULE_0__.actionLaunchMiniAppSchema),\n/* harmony export */   actionSchema: () => (/* reexport safe */ _embeds_js__WEBPACK_IMPORTED_MODULE_0__.actionSchema),\n/* harmony export */   actionViewTokenSchema: () => (/* reexport safe */ _embeds_js__WEBPACK_IMPORTED_MODULE_0__.actionViewTokenSchema),\n/* harmony export */   aspectRatioSchema: () => (/* reexport safe */ _shared_js__WEBPACK_IMPORTED_MODULE_4__.aspectRatioSchema),\n/* harmony export */   buttonSchema: () => (/* reexport safe */ _embeds_js__WEBPACK_IMPORTED_MODULE_0__.buttonSchema),\n/* harmony export */   buttonTitleSchema: () => (/* reexport safe */ _shared_js__WEBPACK_IMPORTED_MODULE_4__.buttonTitleSchema),\n/* harmony export */   caip19TokenSchema: () => (/* reexport safe */ _shared_js__WEBPACK_IMPORTED_MODULE_4__.caip19TokenSchema),\n/* harmony export */   chains: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.chains),\n/* harmony export */   createSimpleStringSchema: () => (/* reexport safe */ _shared_js__WEBPACK_IMPORTED_MODULE_4__.createSimpleStringSchema),\n/* harmony export */   descriptionSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.descriptionSchema),\n/* harmony export */   domainManifestSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.domainManifestSchema),\n/* harmony export */   domainMiniAppConfigSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.domainMiniAppConfigSchema),\n/* harmony export */   domainSchema: () => (/* reexport safe */ _shared_js__WEBPACK_IMPORTED_MODULE_4__.domainSchema),\n/* harmony export */   encodedJsonFarcasterSignatureSchema: () => (/* reexport safe */ _shared_js__WEBPACK_IMPORTED_MODULE_4__.encodedJsonFarcasterSignatureSchema),\n/* harmony export */   eventMiniAppAddedSchema: () => (/* reexport safe */ _events_js__WEBPACK_IMPORTED_MODULE_1__.eventMiniAppAddedSchema),\n/* harmony export */   eventMiniAppRemovedSchema: () => (/* reexport safe */ _events_js__WEBPACK_IMPORTED_MODULE_1__.eventMiniAppRemovedSchema),\n/* harmony export */   eventNotificationsEnabledSchema: () => (/* reexport safe */ _events_js__WEBPACK_IMPORTED_MODULE_1__.eventNotificationsEnabledSchema),\n/* harmony export */   hexColorSchema: () => (/* reexport safe */ _shared_js__WEBPACK_IMPORTED_MODULE_4__.hexColorSchema),\n/* harmony export */   jsonFarcasterSignatureHeaderSchema: () => (/* reexport safe */ _shared_js__WEBPACK_IMPORTED_MODULE_4__.jsonFarcasterSignatureHeaderSchema),\n/* harmony export */   miniAppEmbedNextSchema: () => (/* reexport safe */ _embeds_js__WEBPACK_IMPORTED_MODULE_0__.miniAppEmbedNextSchema),\n/* harmony export */   miniAppNameSchema: () => (/* reexport safe */ _shared_js__WEBPACK_IMPORTED_MODULE_4__.miniAppNameSchema),\n/* harmony export */   noindexSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.noindexSchema),\n/* harmony export */   notificationDetailsSchema: () => (/* reexport safe */ _notifications_js__WEBPACK_IMPORTED_MODULE_3__.notificationDetailsSchema),\n/* harmony export */   notificationsDisabledSchema: () => (/* reexport safe */ _events_js__WEBPACK_IMPORTED_MODULE_1__.notificationsDisabledSchema),\n/* harmony export */   ogDescriptionSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.ogDescriptionSchema),\n/* harmony export */   ogTitleSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.ogTitleSchema),\n/* harmony export */   primaryCategories: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.primaryCategories),\n/* harmony export */   primaryCategorySchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.primaryCategorySchema),\n/* harmony export */   requiredCapabilitiesSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.requiredCapabilitiesSchema),\n/* harmony export */   requiredChainsSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.requiredChainsSchema),\n/* harmony export */   safeParseFrameEmbed: () => (/* reexport safe */ _embeds_js__WEBPACK_IMPORTED_MODULE_0__.safeParseFrameEmbed),\n/* harmony export */   safeParseMiniAppEmbed: () => (/* reexport safe */ _embeds_js__WEBPACK_IMPORTED_MODULE_0__.safeParseMiniAppEmbed),\n/* harmony export */   screenshotUrlsSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.screenshotUrlsSchema),\n/* harmony export */   secureUrlSchema: () => (/* reexport safe */ _shared_js__WEBPACK_IMPORTED_MODULE_4__.secureUrlSchema),\n/* harmony export */   sendNotificationRequestSchema: () => (/* reexport safe */ _notifications_js__WEBPACK_IMPORTED_MODULE_3__.sendNotificationRequestSchema),\n/* harmony export */   sendNotificationResponseSchema: () => (/* reexport safe */ _notifications_js__WEBPACK_IMPORTED_MODULE_3__.sendNotificationResponseSchema),\n/* harmony export */   serverEventSchema: () => (/* reexport safe */ _events_js__WEBPACK_IMPORTED_MODULE_1__.serverEventSchema),\n/* harmony export */   subtitleSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.subtitleSchema),\n/* harmony export */   taglineSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.taglineSchema),\n/* harmony export */   tagsSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.tagsSchema),\n/* harmony export */   versionSchema: () => (/* reexport safe */ _manifest_js__WEBPACK_IMPORTED_MODULE_2__.versionSchema)\n/* harmony export */ });\n/* harmony import */ var _embeds_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./embeds.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/embeds.js\");\n/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./events.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/events.js\");\n/* harmony import */ var _manifest_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./manifest.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/manifest.js\");\n/* harmony import */ var _notifications_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./notifications.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/notifications.js\");\n/* harmony import */ var _shared_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./shared.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/shared.js\");\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vc2NoZW1hcy9pbmRleC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUE0QjtBQUNBO0FBQ0U7QUFDSztBQUNQIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9zY2hlbWFzL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2VtYmVkcy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXZlbnRzLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9tYW5pZmVzdC5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vbm90aWZpY2F0aW9ucy5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2hhcmVkLmpzXCI7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/manifest.js":
/*!**********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/schemas/manifest.js ***!
  \**********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   chains: () => (/* binding */ chains),\n/* harmony export */   descriptionSchema: () => (/* binding */ descriptionSchema),\n/* harmony export */   domainManifestSchema: () => (/* binding */ domainManifestSchema),\n/* harmony export */   domainMiniAppConfigSchema: () => (/* binding */ domainMiniAppConfigSchema),\n/* harmony export */   noindexSchema: () => (/* binding */ noindexSchema),\n/* harmony export */   ogDescriptionSchema: () => (/* binding */ ogDescriptionSchema),\n/* harmony export */   ogTitleSchema: () => (/* binding */ ogTitleSchema),\n/* harmony export */   primaryCategories: () => (/* binding */ primaryCategories),\n/* harmony export */   primaryCategorySchema: () => (/* binding */ primaryCategorySchema),\n/* harmony export */   requiredCapabilitiesSchema: () => (/* binding */ requiredCapabilitiesSchema),\n/* harmony export */   requiredChainsSchema: () => (/* binding */ requiredChainsSchema),\n/* harmony export */   screenshotUrlsSchema: () => (/* binding */ screenshotUrlsSchema),\n/* harmony export */   subtitleSchema: () => (/* binding */ subtitleSchema),\n/* harmony export */   taglineSchema: () => (/* binding */ taglineSchema),\n/* harmony export */   tagsSchema: () => (/* binding */ tagsSchema),\n/* harmony export */   versionSchema: () => (/* binding */ versionSchema)\n/* harmony export */ });\n/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! zod */ \"(app-pages-browser)/./node_modules/zod/v3/types.js\");\n/* harmony import */ var _types_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../types.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/types.js\");\n/* harmony import */ var _shared_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./shared.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/shared.js\");\n\n\n\nconst primaryCategories = [\n    'games',\n    'social',\n    'finance',\n    'utility',\n    'productivity',\n    'health-fitness',\n    'news-media',\n    'music',\n    'shopping',\n    'education',\n    'developer-tools',\n    'entertainment',\n    'art-creativity',\n];\nconst primaryCategorySchema = zod__WEBPACK_IMPORTED_MODULE_2__[\"enum\"](primaryCategories);\nconst versionSchema = zod__WEBPACK_IMPORTED_MODULE_2__.union([\n    zod__WEBPACK_IMPORTED_MODULE_2__.literal('0.0.0'),\n    zod__WEBPACK_IMPORTED_MODULE_2__.literal('0.0.1'),\n    zod__WEBPACK_IMPORTED_MODULE_2__.literal('1'),\n    zod__WEBPACK_IMPORTED_MODULE_2__.literal('next'),\n]);\nconst subtitleSchema = (0,_shared_js__WEBPACK_IMPORTED_MODULE_1__.createSimpleStringSchema)({ max: 30 });\nconst descriptionSchema = (0,_shared_js__WEBPACK_IMPORTED_MODULE_1__.createSimpleStringSchema)({ max: 170 });\nconst screenshotUrlsSchema = zod__WEBPACK_IMPORTED_MODULE_2__.array(_shared_js__WEBPACK_IMPORTED_MODULE_1__.secureUrlSchema).max(3);\nconst tagsSchema = zod__WEBPACK_IMPORTED_MODULE_2__.array((0,_shared_js__WEBPACK_IMPORTED_MODULE_1__.createSimpleStringSchema)({ max: 20, noSpaces: true }))\n    .max(5);\nconst taglineSchema = (0,_shared_js__WEBPACK_IMPORTED_MODULE_1__.createSimpleStringSchema)({ max: 30 });\nconst ogTitleSchema = (0,_shared_js__WEBPACK_IMPORTED_MODULE_1__.createSimpleStringSchema)({ max: 30 });\nconst ogDescriptionSchema = (0,_shared_js__WEBPACK_IMPORTED_MODULE_1__.createSimpleStringSchema)({ max: 100 });\nconst noindexSchema = zod__WEBPACK_IMPORTED_MODULE_2__.boolean();\nconst chains = [\n    'eip155:1', // Ethereum mainnet\n    'eip155:8453', // Base mainnet\n    'eip155:42161', // Arbitrum One\n    'eip155:421614', // Arbitrum Sepolia\n    'eip155:84532', // Base Sepolia\n    'eip155:666666666', // Degen\n    'eip155:100', // Gnosis\n    'eip155:10', // Optimism\n    'eip155:11155420', // Optimism Sepolia\n    'eip155:137', // Polygon\n    'eip155:11155111', // Ethereum Sepolia\n    'eip155:7777777', // Zora\n    'eip155:130', // Unichain\n    'eip155:10143', // Monad testnet\n    'eip155:42220', // Celo\n    'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp', // Solana\n];\nfunction removeArrayDuplicates(arr) {\n    const set = new Set(arr);\n    return Array.from(set);\n}\nconst requiredChainsSchema = zod__WEBPACK_IMPORTED_MODULE_2__.array(zod__WEBPACK_IMPORTED_MODULE_2__[\"enum\"](chains))\n    .transform(removeArrayDuplicates);\nconst requiredCapabilitiesSchema = zod__WEBPACK_IMPORTED_MODULE_2__.array(zod__WEBPACK_IMPORTED_MODULE_2__[\"enum\"](_types_js__WEBPACK_IMPORTED_MODULE_0__.miniAppHostCapabilityList))\n    .transform(removeArrayDuplicates);\nconst domainMiniAppConfigSchema = zod__WEBPACK_IMPORTED_MODULE_2__.object({\n    // 0.0.0 and 0.0.1 are not technically part of the spec but kept for\n    // backwards compatibility. next should always resolve to the most recent\n    // schema version.\n    version: versionSchema,\n    name: _shared_js__WEBPACK_IMPORTED_MODULE_1__.miniAppNameSchema,\n    iconUrl: _shared_js__WEBPACK_IMPORTED_MODULE_1__.secureUrlSchema,\n    homeUrl: _shared_js__WEBPACK_IMPORTED_MODULE_1__.secureUrlSchema,\n    /** deprecated, set ogImageUrl instead */\n    imageUrl: _shared_js__WEBPACK_IMPORTED_MODULE_1__.secureUrlSchema.optional(),\n    /** deprecated, will rely on fc:frame/fc:miniapp meta tag */\n    buttonTitle: _shared_js__WEBPACK_IMPORTED_MODULE_1__.buttonTitleSchema.optional(),\n    splashImageUrl: _shared_js__WEBPACK_IMPORTED_MODULE_1__.secureUrlSchema.optional(),\n    splashBackgroundColor: _shared_js__WEBPACK_IMPORTED_MODULE_1__.hexColorSchema.optional(),\n    webhookUrl: _shared_js__WEBPACK_IMPORTED_MODULE_1__.secureUrlSchema.optional(),\n    /** see: https://github.com/farcasterxyz/miniapps/discussions/191 */\n    subtitle: subtitleSchema.optional(),\n    description: descriptionSchema.optional(),\n    screenshotUrls: screenshotUrlsSchema.optional(),\n    primaryCategory: primaryCategorySchema.optional(),\n    tags: tagsSchema.optional(),\n    heroImageUrl: _shared_js__WEBPACK_IMPORTED_MODULE_1__.secureUrlSchema.optional(),\n    tagline: taglineSchema.optional(),\n    ogTitle: ogTitleSchema.optional(),\n    ogDescription: ogDescriptionSchema.optional(),\n    ogImageUrl: _shared_js__WEBPACK_IMPORTED_MODULE_1__.secureUrlSchema.optional(),\n    /** see: https://github.com/farcasterxyz/miniapps/discussions/204 */\n    noindex: noindexSchema.optional(),\n    /** see https://github.com/farcasterxyz/miniapps/discussions/256 */\n    requiredChains: requiredChainsSchema.optional(),\n    requiredCapabilities: requiredCapabilitiesSchema.optional(),\n    /** see https://github.com/farcasterxyz/miniapps/discussions/158 */\n    /** Documentation will be added once this feature is finalized. */\n    castShareUrl: _shared_js__WEBPACK_IMPORTED_MODULE_1__.secureUrlSchema.optional(),\n    /** Canonical domain for the miniapp application */\n    canonicalDomain: _shared_js__WEBPACK_IMPORTED_MODULE_1__.domainSchema.optional(),\n})\n    .refine((data) => {\n    if (data.castShareUrl === undefined)\n        return true;\n    try {\n        const homeUrlDomain = new URL(data.homeUrl).hostname;\n        const castShareUrlDomain = new URL(data.castShareUrl).hostname;\n        return homeUrlDomain === castShareUrlDomain;\n    }\n    catch {\n        return false;\n    }\n}, {\n    message: 'castShareUrl must have the same domain as homeUrl',\n    path: ['castShareUrl'],\n});\nconst domainManifestSchema = zod__WEBPACK_IMPORTED_MODULE_2__.object({\n    accountAssociation: _shared_js__WEBPACK_IMPORTED_MODULE_1__.encodedJsonFarcasterSignatureSchema,\n    miniapp: domainMiniAppConfigSchema.optional(),\n    // Support both 'frame' and 'miniapp' during transition period\n    frame: domainMiniAppConfigSchema.optional(),\n})\n    .refine((data) => {\n    // If both are provided, they must be identical\n    if (data.frame && data.miniapp) {\n        return JSON.stringify(data.frame) === JSON.stringify(data.miniapp);\n    }\n    return true;\n}, {\n    message: 'If both \"frame\" and \"miniapp\" are provided, they must be identical',\n    path: ['frame', 'miniapp'],\n})\n    .transform((schema) => {\n    return {\n        ...schema,\n        frame: schema.frame ?? schema.miniapp,\n    };\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vc2NoZW1hcy9tYW5pZmVzdC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXdCO0FBQ2dDO0FBQzBIO0FBQzNLO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDhCQUE4Qix3Q0FBTTtBQUNwQyxzQkFBc0Isc0NBQU87QUFDcEMsSUFBSSx3Q0FBUztBQUNiLElBQUksd0NBQVM7QUFDYixJQUFJLHdDQUFTO0FBQ2IsSUFBSSx3Q0FBUztBQUNiO0FBQ08sdUJBQXVCLG9FQUF3QixHQUFHLFNBQVM7QUFDM0QsMEJBQTBCLG9FQUF3QixHQUFHLFVBQVU7QUFDL0QsNkJBQTZCLHNDQUFPLENBQUMsdURBQWU7QUFDcEQsbUJBQW1CLHNDQUNoQixDQUFDLG9FQUF3QixHQUFHLHlCQUF5QjtBQUMvRDtBQUNPLHNCQUFzQixvRUFBd0IsR0FBRyxTQUFTO0FBQzFELHNCQUFzQixvRUFBd0IsR0FBRyxTQUFTO0FBQzFELDRCQUE0QixvRUFBd0IsR0FBRyxVQUFVO0FBQ2pFLHNCQUFzQix3Q0FBUztBQUMvQjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDZCQUE2QixzQ0FDMUIsQ0FBQyx3Q0FBTTtBQUNqQjtBQUNPLG1DQUFtQyxzQ0FDaEMsQ0FBQyx3Q0FBTSxDQUFDLGdFQUF5QjtBQUMzQztBQUNPLGtDQUFrQyx1Q0FDOUI7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUseURBQWlCO0FBQzNCLGFBQWEsdURBQWU7QUFDNUIsYUFBYSx1REFBZTtBQUM1QjtBQUNBLGNBQWMsdURBQWU7QUFDN0I7QUFDQSxpQkFBaUIseURBQWlCO0FBQ2xDLG9CQUFvQix1REFBZTtBQUNuQywyQkFBMkIsc0RBQWM7QUFDekMsZ0JBQWdCLHVEQUFlO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix1REFBZTtBQUNqQztBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsdURBQWU7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsdURBQWU7QUFDakM7QUFDQSxxQkFBcUIsb0RBQVk7QUFDakMsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDTSw2QkFBNkIsdUNBQ3pCO0FBQ1gsd0JBQXdCLDJFQUFtQztBQUMzRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL3NjaGVtYXMvbWFuaWZlc3QuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBtaW5pQXBwSG9zdENhcGFiaWxpdHlMaXN0IH0gZnJvbSBcIi4uL3R5cGVzLmpzXCI7XG5pbXBvcnQgeyBidXR0b25UaXRsZVNjaGVtYSwgY3JlYXRlU2ltcGxlU3RyaW5nU2NoZW1hLCBkb21haW5TY2hlbWEsIGVuY29kZWRKc29uRmFyY2FzdGVyU2lnbmF0dXJlU2NoZW1hLCBoZXhDb2xvclNjaGVtYSwgbWluaUFwcE5hbWVTY2hlbWEsIHNlY3VyZVVybFNjaGVtYSwgfSBmcm9tIFwiLi9zaGFyZWQuanNcIjtcbmV4cG9ydCBjb25zdCBwcmltYXJ5Q2F0ZWdvcmllcyA9IFtcbiAgICAnZ2FtZXMnLFxuICAgICdzb2NpYWwnLFxuICAgICdmaW5hbmNlJyxcbiAgICAndXRpbGl0eScsXG4gICAgJ3Byb2R1Y3Rpdml0eScsXG4gICAgJ2hlYWx0aC1maXRuZXNzJyxcbiAgICAnbmV3cy1tZWRpYScsXG4gICAgJ211c2ljJyxcbiAgICAnc2hvcHBpbmcnLFxuICAgICdlZHVjYXRpb24nLFxuICAgICdkZXZlbG9wZXItdG9vbHMnLFxuICAgICdlbnRlcnRhaW5tZW50JyxcbiAgICAnYXJ0LWNyZWF0aXZpdHknLFxuXTtcbmV4cG9ydCBjb25zdCBwcmltYXJ5Q2F0ZWdvcnlTY2hlbWEgPSB6LmVudW0ocHJpbWFyeUNhdGVnb3JpZXMpO1xuZXhwb3J0IGNvbnN0IHZlcnNpb25TY2hlbWEgPSB6LnVuaW9uKFtcbiAgICB6LmxpdGVyYWwoJzAuMC4wJyksXG4gICAgei5saXRlcmFsKCcwLjAuMScpLFxuICAgIHoubGl0ZXJhbCgnMScpLFxuICAgIHoubGl0ZXJhbCgnbmV4dCcpLFxuXSk7XG5leHBvcnQgY29uc3Qgc3VidGl0bGVTY2hlbWEgPSBjcmVhdGVTaW1wbGVTdHJpbmdTY2hlbWEoeyBtYXg6IDMwIH0pO1xuZXhwb3J0IGNvbnN0IGRlc2NyaXB0aW9uU2NoZW1hID0gY3JlYXRlU2ltcGxlU3RyaW5nU2NoZW1hKHsgbWF4OiAxNzAgfSk7XG5leHBvcnQgY29uc3Qgc2NyZWVuc2hvdFVybHNTY2hlbWEgPSB6LmFycmF5KHNlY3VyZVVybFNjaGVtYSkubWF4KDMpO1xuZXhwb3J0IGNvbnN0IHRhZ3NTY2hlbWEgPSB6XG4gICAgLmFycmF5KGNyZWF0ZVNpbXBsZVN0cmluZ1NjaGVtYSh7IG1heDogMjAsIG5vU3BhY2VzOiB0cnVlIH0pKVxuICAgIC5tYXgoNSk7XG5leHBvcnQgY29uc3QgdGFnbGluZVNjaGVtYSA9IGNyZWF0ZVNpbXBsZVN0cmluZ1NjaGVtYSh7IG1heDogMzAgfSk7XG5leHBvcnQgY29uc3Qgb2dUaXRsZVNjaGVtYSA9IGNyZWF0ZVNpbXBsZVN0cmluZ1NjaGVtYSh7IG1heDogMzAgfSk7XG5leHBvcnQgY29uc3Qgb2dEZXNjcmlwdGlvblNjaGVtYSA9IGNyZWF0ZVNpbXBsZVN0cmluZ1NjaGVtYSh7IG1heDogMTAwIH0pO1xuZXhwb3J0IGNvbnN0IG5vaW5kZXhTY2hlbWEgPSB6LmJvb2xlYW4oKTtcbmV4cG9ydCBjb25zdCBjaGFpbnMgPSBbXG4gICAgJ2VpcDE1NToxJywgLy8gRXRoZXJldW0gbWFpbm5ldFxuICAgICdlaXAxNTU6ODQ1MycsIC8vIEJhc2UgbWFpbm5ldFxuICAgICdlaXAxNTU6NDIxNjEnLCAvLyBBcmJpdHJ1bSBPbmVcbiAgICAnZWlwMTU1OjQyMTYxNCcsIC8vIEFyYml0cnVtIFNlcG9saWFcbiAgICAnZWlwMTU1Ojg0NTMyJywgLy8gQmFzZSBTZXBvbGlhXG4gICAgJ2VpcDE1NTo2NjY2NjY2NjYnLCAvLyBEZWdlblxuICAgICdlaXAxNTU6MTAwJywgLy8gR25vc2lzXG4gICAgJ2VpcDE1NToxMCcsIC8vIE9wdGltaXNtXG4gICAgJ2VpcDE1NToxMTE1NTQyMCcsIC8vIE9wdGltaXNtIFNlcG9saWFcbiAgICAnZWlwMTU1OjEzNycsIC8vIFBvbHlnb25cbiAgICAnZWlwMTU1OjExMTU1MTExJywgLy8gRXRoZXJldW0gU2Vwb2xpYVxuICAgICdlaXAxNTU6Nzc3Nzc3NycsIC8vIFpvcmFcbiAgICAnZWlwMTU1OjEzMCcsIC8vIFVuaWNoYWluXG4gICAgJ2VpcDE1NToxMDE0MycsIC8vIE1vbmFkIHRlc3RuZXRcbiAgICAnZWlwMTU1OjQyMjIwJywgLy8gQ2Vsb1xuICAgICdzb2xhbmE6NWV5a3Q0VXNGdjhQOE5KZFRSRXBZMXZ6cUtxWkt2ZHAnLCAvLyBTb2xhbmFcbl07XG5mdW5jdGlvbiByZW1vdmVBcnJheUR1cGxpY2F0ZXMoYXJyKSB7XG4gICAgY29uc3Qgc2V0ID0gbmV3IFNldChhcnIpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHNldCk7XG59XG5leHBvcnQgY29uc3QgcmVxdWlyZWRDaGFpbnNTY2hlbWEgPSB6XG4gICAgLmFycmF5KHouZW51bShjaGFpbnMpKVxuICAgIC50cmFuc2Zvcm0ocmVtb3ZlQXJyYXlEdXBsaWNhdGVzKTtcbmV4cG9ydCBjb25zdCByZXF1aXJlZENhcGFiaWxpdGllc1NjaGVtYSA9IHpcbiAgICAuYXJyYXkoei5lbnVtKG1pbmlBcHBIb3N0Q2FwYWJpbGl0eUxpc3QpKVxuICAgIC50cmFuc2Zvcm0ocmVtb3ZlQXJyYXlEdXBsaWNhdGVzKTtcbmV4cG9ydCBjb25zdCBkb21haW5NaW5pQXBwQ29uZmlnU2NoZW1hID0gelxuICAgIC5vYmplY3Qoe1xuICAgIC8vIDAuMC4wIGFuZCAwLjAuMSBhcmUgbm90IHRlY2huaWNhbGx5IHBhcnQgb2YgdGhlIHNwZWMgYnV0IGtlcHQgZm9yXG4gICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIG5leHQgc2hvdWxkIGFsd2F5cyByZXNvbHZlIHRvIHRoZSBtb3N0IHJlY2VudFxuICAgIC8vIHNjaGVtYSB2ZXJzaW9uLlxuICAgIHZlcnNpb246IHZlcnNpb25TY2hlbWEsXG4gICAgbmFtZTogbWluaUFwcE5hbWVTY2hlbWEsXG4gICAgaWNvblVybDogc2VjdXJlVXJsU2NoZW1hLFxuICAgIGhvbWVVcmw6IHNlY3VyZVVybFNjaGVtYSxcbiAgICAvKiogZGVwcmVjYXRlZCwgc2V0IG9nSW1hZ2VVcmwgaW5zdGVhZCAqL1xuICAgIGltYWdlVXJsOiBzZWN1cmVVcmxTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAvKiogZGVwcmVjYXRlZCwgd2lsbCByZWx5IG9uIGZjOmZyYW1lL2ZjOm1pbmlhcHAgbWV0YSB0YWcgKi9cbiAgICBidXR0b25UaXRsZTogYnV0dG9uVGl0bGVTY2hlbWEub3B0aW9uYWwoKSxcbiAgICBzcGxhc2hJbWFnZVVybDogc2VjdXJlVXJsU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgc3BsYXNoQmFja2dyb3VuZENvbG9yOiBoZXhDb2xvclNjaGVtYS5vcHRpb25hbCgpLFxuICAgIHdlYmhvb2tVcmw6IHNlY3VyZVVybFNjaGVtYS5vcHRpb25hbCgpLFxuICAgIC8qKiBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYXJjYXN0ZXJ4eXovbWluaWFwcHMvZGlzY3Vzc2lvbnMvMTkxICovXG4gICAgc3VidGl0bGU6IHN1YnRpdGxlU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgc2NyZWVuc2hvdFVybHM6IHNjcmVlbnNob3RVcmxzU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgcHJpbWFyeUNhdGVnb3J5OiBwcmltYXJ5Q2F0ZWdvcnlTY2hlbWEub3B0aW9uYWwoKSxcbiAgICB0YWdzOiB0YWdzU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgaGVyb0ltYWdlVXJsOiBzZWN1cmVVcmxTY2hlbWEub3B0aW9uYWwoKSxcbiAgICB0YWdsaW5lOiB0YWdsaW5lU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgb2dUaXRsZTogb2dUaXRsZVNjaGVtYS5vcHRpb25hbCgpLFxuICAgIG9nRGVzY3JpcHRpb246IG9nRGVzY3JpcHRpb25TY2hlbWEub3B0aW9uYWwoKSxcbiAgICBvZ0ltYWdlVXJsOiBzZWN1cmVVcmxTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAvKiogc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmFyY2FzdGVyeHl6L21pbmlhcHBzL2Rpc2N1c3Npb25zLzIwNCAqL1xuICAgIG5vaW5kZXg6IG5vaW5kZXhTY2hlbWEub3B0aW9uYWwoKSxcbiAgICAvKiogc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYXJjYXN0ZXJ4eXovbWluaWFwcHMvZGlzY3Vzc2lvbnMvMjU2ICovXG4gICAgcmVxdWlyZWRDaGFpbnM6IHJlcXVpcmVkQ2hhaW5zU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgcmVxdWlyZWRDYXBhYmlsaXRpZXM6IHJlcXVpcmVkQ2FwYWJpbGl0aWVzU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgLyoqIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFyY2FzdGVyeHl6L21pbmlhcHBzL2Rpc2N1c3Npb25zLzE1OCAqL1xuICAgIC8qKiBEb2N1bWVudGF0aW9uIHdpbGwgYmUgYWRkZWQgb25jZSB0aGlzIGZlYXR1cmUgaXMgZmluYWxpemVkLiAqL1xuICAgIGNhc3RTaGFyZVVybDogc2VjdXJlVXJsU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgLyoqIENhbm9uaWNhbCBkb21haW4gZm9yIHRoZSBtaW5pYXBwIGFwcGxpY2F0aW9uICovXG4gICAgY2Fub25pY2FsRG9tYWluOiBkb21haW5TY2hlbWEub3B0aW9uYWwoKSxcbn0pXG4gICAgLnJlZmluZSgoZGF0YSkgPT4ge1xuICAgIGlmIChkYXRhLmNhc3RTaGFyZVVybCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBob21lVXJsRG9tYWluID0gbmV3IFVSTChkYXRhLmhvbWVVcmwpLmhvc3RuYW1lO1xuICAgICAgICBjb25zdCBjYXN0U2hhcmVVcmxEb21haW4gPSBuZXcgVVJMKGRhdGEuY2FzdFNoYXJlVXJsKS5ob3N0bmFtZTtcbiAgICAgICAgcmV0dXJuIGhvbWVVcmxEb21haW4gPT09IGNhc3RTaGFyZVVybERvbWFpbjtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufSwge1xuICAgIG1lc3NhZ2U6ICdjYXN0U2hhcmVVcmwgbXVzdCBoYXZlIHRoZSBzYW1lIGRvbWFpbiBhcyBob21lVXJsJyxcbiAgICBwYXRoOiBbJ2Nhc3RTaGFyZVVybCddLFxufSk7XG5leHBvcnQgY29uc3QgZG9tYWluTWFuaWZlc3RTY2hlbWEgPSB6XG4gICAgLm9iamVjdCh7XG4gICAgYWNjb3VudEFzc29jaWF0aW9uOiBlbmNvZGVkSnNvbkZhcmNhc3RlclNpZ25hdHVyZVNjaGVtYSxcbiAgICBtaW5pYXBwOiBkb21haW5NaW5pQXBwQ29uZmlnU2NoZW1hLm9wdGlvbmFsKCksXG4gICAgLy8gU3VwcG9ydCBib3RoICdmcmFtZScgYW5kICdtaW5pYXBwJyBkdXJpbmcgdHJhbnNpdGlvbiBwZXJpb2RcbiAgICBmcmFtZTogZG9tYWluTWluaUFwcENvbmZpZ1NjaGVtYS5vcHRpb25hbCgpLFxufSlcbiAgICAucmVmaW5lKChkYXRhKSA9PiB7XG4gICAgLy8gSWYgYm90aCBhcmUgcHJvdmlkZWQsIHRoZXkgbXVzdCBiZSBpZGVudGljYWxcbiAgICBpZiAoZGF0YS5mcmFtZSAmJiBkYXRhLm1pbmlhcHApIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEuZnJhbWUpID09PSBKU09OLnN0cmluZ2lmeShkYXRhLm1pbmlhcHApO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn0sIHtcbiAgICBtZXNzYWdlOiAnSWYgYm90aCBcImZyYW1lXCIgYW5kIFwibWluaWFwcFwiIGFyZSBwcm92aWRlZCwgdGhleSBtdXN0IGJlIGlkZW50aWNhbCcsXG4gICAgcGF0aDogWydmcmFtZScsICdtaW5pYXBwJ10sXG59KVxuICAgIC50cmFuc2Zvcm0oKHNjaGVtYSkgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLnNjaGVtYSxcbiAgICAgICAgZnJhbWU6IHNjaGVtYS5mcmFtZSA/PyBzY2hlbWEubWluaWFwcCxcbiAgICB9O1xufSk7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/manifest.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/notifications.js":
/*!***************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/schemas/notifications.js ***!
  \***************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   notificationDetailsSchema: () => (/* binding */ notificationDetailsSchema),\n/* harmony export */   sendNotificationRequestSchema: () => (/* binding */ sendNotificationRequestSchema),\n/* harmony export */   sendNotificationResponseSchema: () => (/* binding */ sendNotificationResponseSchema)\n/* harmony export */ });\n/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! zod */ \"(app-pages-browser)/./node_modules/zod/v3/types.js\");\n/* harmony import */ var _shared_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./shared.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/shared.js\");\n\n\nconst notificationDetailsSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    url: zod__WEBPACK_IMPORTED_MODULE_1__.string(),\n    token: zod__WEBPACK_IMPORTED_MODULE_1__.string(),\n});\nconst sendNotificationRequestSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    notificationId: zod__WEBPACK_IMPORTED_MODULE_1__.string().max(128),\n    title: zod__WEBPACK_IMPORTED_MODULE_1__.string().max(32),\n    body: zod__WEBPACK_IMPORTED_MODULE_1__.string().max(128),\n    targetUrl: _shared_js__WEBPACK_IMPORTED_MODULE_0__.secureUrlSchema,\n    tokens: zod__WEBPACK_IMPORTED_MODULE_1__.string().array().max(100),\n});\nconst sendNotificationResponseSchema = zod__WEBPACK_IMPORTED_MODULE_1__.object({\n    result: zod__WEBPACK_IMPORTED_MODULE_1__.object({\n        successfulTokens: zod__WEBPACK_IMPORTED_MODULE_1__.array(zod__WEBPACK_IMPORTED_MODULE_1__.string()),\n        invalidTokens: zod__WEBPACK_IMPORTED_MODULE_1__.array(zod__WEBPACK_IMPORTED_MODULE_1__.string()),\n        rateLimitedTokens: zod__WEBPACK_IMPORTED_MODULE_1__.array(zod__WEBPACK_IMPORTED_MODULE_1__.string()),\n    }),\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vc2NoZW1hcy9ub3RpZmljYXRpb25zLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQXdCO0FBQ3NCO0FBQ3ZDLGtDQUFrQyx1Q0FBUTtBQUNqRCxTQUFTLHVDQUFRO0FBQ2pCLFdBQVcsdUNBQVE7QUFDbkIsQ0FBQztBQUNNLHNDQUFzQyx1Q0FBUTtBQUNyRCxvQkFBb0IsdUNBQVE7QUFDNUIsV0FBVyx1Q0FBUTtBQUNuQixVQUFVLHVDQUFRO0FBQ2xCLGVBQWUsdURBQWU7QUFDOUIsWUFBWSx1Q0FBUTtBQUNwQixDQUFDO0FBQ00sdUNBQXVDLHVDQUFRO0FBQ3RELFlBQVksdUNBQVE7QUFDcEIsMEJBQTBCLHNDQUFPLENBQUMsdUNBQVE7QUFDMUMsdUJBQXVCLHNDQUFPLENBQUMsdUNBQVE7QUFDdkMsMkJBQTJCLHNDQUFPLENBQUMsdUNBQVE7QUFDM0MsS0FBSztBQUNMLENBQUMiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL3NjaGVtYXMvbm90aWZpY2F0aW9ucy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IHNlY3VyZVVybFNjaGVtYSB9IGZyb20gXCIuL3NoYXJlZC5qc1wiO1xuZXhwb3J0IGNvbnN0IG5vdGlmaWNhdGlvbkRldGFpbHNTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgdXJsOiB6LnN0cmluZygpLFxuICAgIHRva2VuOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgY29uc3Qgc2VuZE5vdGlmaWNhdGlvblJlcXVlc3RTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgbm90aWZpY2F0aW9uSWQ6IHouc3RyaW5nKCkubWF4KDEyOCksXG4gICAgdGl0bGU6IHouc3RyaW5nKCkubWF4KDMyKSxcbiAgICBib2R5OiB6LnN0cmluZygpLm1heCgxMjgpLFxuICAgIHRhcmdldFVybDogc2VjdXJlVXJsU2NoZW1hLFxuICAgIHRva2Vuczogei5zdHJpbmcoKS5hcnJheSgpLm1heCgxMDApLFxufSk7XG5leHBvcnQgY29uc3Qgc2VuZE5vdGlmaWNhdGlvblJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICAgIHJlc3VsdDogei5vYmplY3Qoe1xuICAgICAgICBzdWNjZXNzZnVsVG9rZW5zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICAgICAgICBpbnZhbGlkVG9rZW5zOiB6LmFycmF5KHouc3RyaW5nKCkpLFxuICAgICAgICByYXRlTGltaXRlZFRva2Vuczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgICB9KSxcbn0pO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/notifications.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/shared.js":
/*!********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/schemas/shared.js ***!
  \********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   aspectRatioSchema: () => (/* binding */ aspectRatioSchema),\n/* harmony export */   buttonTitleSchema: () => (/* binding */ buttonTitleSchema),\n/* harmony export */   caip19TokenSchema: () => (/* binding */ caip19TokenSchema),\n/* harmony export */   createSimpleStringSchema: () => (/* binding */ createSimpleStringSchema),\n/* harmony export */   domainSchema: () => (/* binding */ domainSchema),\n/* harmony export */   encodedJsonFarcasterSignatureSchema: () => (/* binding */ encodedJsonFarcasterSignatureSchema),\n/* harmony export */   hexColorSchema: () => (/* binding */ hexColorSchema),\n/* harmony export */   jsonFarcasterSignatureHeaderSchema: () => (/* binding */ jsonFarcasterSignatureHeaderSchema),\n/* harmony export */   miniAppNameSchema: () => (/* binding */ miniAppNameSchema),\n/* harmony export */   secureUrlSchema: () => (/* binding */ secureUrlSchema)\n/* harmony export */ });\n/* harmony import */ var zod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zod */ \"(app-pages-browser)/./node_modules/zod/v3/types.js\");\n\nconst SPECIAL_CHARS_PATTERN = /[@#$%^&*+=/\\\\|~«»]/;\nconst REPEATED_PUNCTUATION_PATTERN = /(!{2,}|\\?{2,}|-{2,})/;\n// Unicode ranges for emoji detection:\n// \\u{1F300}-\\u{1F9FF} - Miscellaneous Symbols, Pictographs, Emoticons, Transport, Map, and Supplemental\n// \\u{2702}-\\u{27B0} - Dingbats\n// \\u{2600}-\\u{26FF} - Miscellaneous Symbols\n// \\u{2B00}-\\u{2BFF} - Miscellaneous Symbols and Arrows\nconst EMOJI_PATTERN = /[\\u{1F300}-\\u{1F9FF}]|[\\u{2702}-\\u{27B0}]|[\\u{2600}-\\u{26FF}]|[\\u{2B00}-\\u{2BFF}]/u;\nconst createSimpleStringSchema = ({ max, noSpaces, } = {}) => {\n    const stringValidations = noSpaces\n        ? zod__WEBPACK_IMPORTED_MODULE_0__.string()\n            .max(max ?? Number.POSITIVE_INFINITY)\n            .regex(/^\\S*$/, 'Spaces are not allowed')\n        : zod__WEBPACK_IMPORTED_MODULE_0__.string().max(max ?? Number.POSITIVE_INFINITY);\n    return stringValidations\n        .refine((value) => !EMOJI_PATTERN.test(value), {\n        message: 'Emojis and symbols are not allowed',\n    })\n        .refine((value) => !SPECIAL_CHARS_PATTERN.test(value), {\n        message: 'Special characters (@, #, $, %, ^, &, *, +, =, /, \\\\, |, ~, «, ») are not allowed',\n    })\n        .refine((value) => !REPEATED_PUNCTUATION_PATTERN.test(value), {\n        message: 'Repeated punctuations (!!, ??, --) are not allowed',\n    });\n};\nconst secureUrlSchema = zod__WEBPACK_IMPORTED_MODULE_0__.string()\n    .url()\n    .startsWith('https://', { message: 'Must be an https url' })\n    .max(1024)\n    .refine((url) => !url.includes(' '), {\n    message: 'URL must not contain spaces',\n})\n    .refine((url) => {\n    try {\n        const hostname = new URL(url).hostname;\n        // Check for localhost\n        if (hostname === 'localhost' || hostname.endsWith('.localhost')) {\n            return false;\n        }\n        // Check for IPv4 addresses\n        const ipv4Regex = /^(\\d{1,3}\\.){3}\\d{1,3}$/;\n        if (ipv4Regex.test(hostname)) {\n            return false;\n        }\n        // Check for IPv6 addresses (including brackets)\n        if (hostname.startsWith('[') && hostname.endsWith(']')) {\n            return false;\n        }\n        return true;\n    }\n    catch {\n        return false;\n    }\n}, {\n    message: 'URL must not use IP addresses or localhost',\n});\nconst miniAppNameSchema = zod__WEBPACK_IMPORTED_MODULE_0__.string().max(32);\nconst buttonTitleSchema = zod__WEBPACK_IMPORTED_MODULE_0__.string().max(32);\nconst CAIP_19_REGEX = /^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}\\/(?:[-a-z0-9]{3,8}:[-.%a-zA-Z0-9]{1,128}(?:\\/[-.%a-zA-Z0-9]{1,78})?|native)$/;\nconst caip19TokenSchema = zod__WEBPACK_IMPORTED_MODULE_0__.string()\n    .regex(CAIP_19_REGEX, { message: 'Invalid CAIP-19 asset ID' });\nconst hexColorSchema = zod__WEBPACK_IMPORTED_MODULE_0__.string()\n    .regex(/^#([0-9A-F]{3}|[0-9A-F]{6})$/i, {\n    message: 'Invalid hex color code. It should be in the format #RRGGBB or #RGB.',\n});\n// Domain validation regex:\n// - Each label (part between dots) must start and end with alphanumeric\n// - Labels can contain hyphens in the middle\n// - Cannot have consecutive dots\n// - Must have at least one dot (TLD required)\n// - TLD must be at least 2 characters and only letters\nconst DOMAIN_REGEX = /^(?!.*\\.\\.)([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$/;\nconst domainSchema = zod__WEBPACK_IMPORTED_MODULE_0__.string()\n    .max(1024)\n    .regex(DOMAIN_REGEX, {\n    message: 'Must be a valid domain name (e.g., example.com, sub.example.com)',\n})\n    .refine((value) => !value.includes('://'), {\n    message: 'Domain must not include protocol (http://, https://, etc.)',\n})\n    .refine((value) => !value.includes('/'), {\n    message: 'Domain must not include path separators',\n})\n    .refine((value) => !value.includes('@'), {\n    message: 'Domain must not include @ symbol',\n})\n    .refine((value) => !value.includes(':'), {\n    message: 'Domain must not include port numbers',\n});\nconst aspectRatioSchema = zod__WEBPACK_IMPORTED_MODULE_0__.union([zod__WEBPACK_IMPORTED_MODULE_0__.literal('1:1'), zod__WEBPACK_IMPORTED_MODULE_0__.literal('3:2')]);\nconst encodedJsonFarcasterSignatureSchema = zod__WEBPACK_IMPORTED_MODULE_0__.object({\n    header: zod__WEBPACK_IMPORTED_MODULE_0__.string(),\n    payload: zod__WEBPACK_IMPORTED_MODULE_0__.string(),\n    signature: zod__WEBPACK_IMPORTED_MODULE_0__.string(),\n});\nconst jsonFarcasterSignatureHeaderSchema = zod__WEBPACK_IMPORTED_MODULE_0__.object({\n    fid: zod__WEBPACK_IMPORTED_MODULE_0__.number(),\n    type: zod__WEBPACK_IMPORTED_MODULE_0__.literal('app_key'),\n    key: zod__WEBPACK_IMPORTED_MODULE_0__.string().startsWith('0x'),\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vc2NoZW1hcy9zaGFyZWQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBd0I7QUFDeEI7QUFDQSx5Q0FBeUMsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHO0FBQ3pEO0FBQ0EsTUFBTSxNQUFNLElBQUksT0FBTztBQUN2QixNQUFNLEtBQUssSUFBSSxNQUFNO0FBQ3JCLE1BQU0sS0FBSyxJQUFJLE1BQU07QUFDckIsTUFBTSxLQUFLLElBQUksTUFBTTtBQUNyQiwyQkFBMkIsTUFBTSxJQUFJLE1BQU0sTUFBTSxLQUFLLElBQUksS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUs7QUFDaEcsb0NBQW9DLGlCQUFpQixJQUFJO0FBQ2hFO0FBQ0EsVUFBVSx1Q0FDUztBQUNuQjtBQUNBO0FBQ0EsVUFBVSx1Q0FBUTtBQUNsQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ08sd0JBQXdCLHVDQUNwQjtBQUNYO0FBQ0EsOEJBQThCLGlDQUFpQztBQUMvRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxJQUFJLElBQUksRUFBRSxHQUFHLElBQUk7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsQ0FBQztBQUNNLDBCQUEwQix1Q0FBUTtBQUNsQywwQkFBMEIsdUNBQVE7QUFDekMsa0NBQWtDLElBQUksZUFBZSxLQUFLLGVBQWUsSUFBSSxnQkFBZ0IsTUFBTSxvQkFBb0IsS0FBSztBQUNySCwwQkFBMEIsdUNBQ3RCO0FBQ1gsNEJBQTRCLHFDQUFxQztBQUMxRCx1QkFBdUIsdUNBQ25CO0FBQ1gsd0JBQXdCLEVBQUUsVUFBVSxFQUFFO0FBQ3RDO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFGQUFxRixHQUFHO0FBQ2pGLHFCQUFxQix1Q0FDakI7QUFDWDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDTSwwQkFBMEIsc0NBQU8sRUFBRSx3Q0FBUyxTQUFTLHdDQUFTO0FBQzlELDRDQUE0Qyx1Q0FBUTtBQUMzRCxZQUFZLHVDQUFRO0FBQ3BCLGFBQWEsdUNBQVE7QUFDckIsZUFBZSx1Q0FBUTtBQUN2QixDQUFDO0FBQ00sMkNBQTJDLHVDQUFRO0FBQzFELFNBQVMsdUNBQVE7QUFDakIsVUFBVSx3Q0FBUztBQUNuQixTQUFTLHVDQUFRO0FBQ2pCLENBQUMiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL3NjaGVtYXMvc2hhcmVkLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuY29uc3QgU1BFQ0lBTF9DSEFSU19QQVRURVJOID0gL1tAIyQlXiYqKz0vXFxcXHx+wqvCu10vO1xuY29uc3QgUkVQRUFURURfUFVOQ1RVQVRJT05fUEFUVEVSTiA9IC8oIXsyLH18XFw/ezIsfXwtezIsfSkvO1xuLy8gVW5pY29kZSByYW5nZXMgZm9yIGVtb2ppIGRldGVjdGlvbjpcbi8vIFxcdXsxRjMwMH0tXFx1ezFGOUZGfSAtIE1pc2NlbGxhbmVvdXMgU3ltYm9scywgUGljdG9ncmFwaHMsIEVtb3RpY29ucywgVHJhbnNwb3J0LCBNYXAsIGFuZCBTdXBwbGVtZW50YWxcbi8vIFxcdXsyNzAyfS1cXHV7MjdCMH0gLSBEaW5nYmF0c1xuLy8gXFx1ezI2MDB9LVxcdXsyNkZGfSAtIE1pc2NlbGxhbmVvdXMgU3ltYm9sc1xuLy8gXFx1ezJCMDB9LVxcdXsyQkZGfSAtIE1pc2NlbGxhbmVvdXMgU3ltYm9scyBhbmQgQXJyb3dzXG5jb25zdCBFTU9KSV9QQVRURVJOID0gL1tcXHV7MUYzMDB9LVxcdXsxRjlGRn1dfFtcXHV7MjcwMn0tXFx1ezI3QjB9XXxbXFx1ezI2MDB9LVxcdXsyNkZGfV18W1xcdXsyQjAwfS1cXHV7MkJGRn1dL3U7XG5leHBvcnQgY29uc3QgY3JlYXRlU2ltcGxlU3RyaW5nU2NoZW1hID0gKHsgbWF4LCBub1NwYWNlcywgfSA9IHt9KSA9PiB7XG4gICAgY29uc3Qgc3RyaW5nVmFsaWRhdGlvbnMgPSBub1NwYWNlc1xuICAgICAgICA/IHpcbiAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgLm1heChtYXggPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKVxuICAgICAgICAgICAgLnJlZ2V4KC9eXFxTKiQvLCAnU3BhY2VzIGFyZSBub3QgYWxsb3dlZCcpXG4gICAgICAgIDogei5zdHJpbmcoKS5tYXgobWF4ID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgcmV0dXJuIHN0cmluZ1ZhbGlkYXRpb25zXG4gICAgICAgIC5yZWZpbmUoKHZhbHVlKSA9PiAhRU1PSklfUEFUVEVSTi50ZXN0KHZhbHVlKSwge1xuICAgICAgICBtZXNzYWdlOiAnRW1vamlzIGFuZCBzeW1ib2xzIGFyZSBub3QgYWxsb3dlZCcsXG4gICAgfSlcbiAgICAgICAgLnJlZmluZSgodmFsdWUpID0+ICFTUEVDSUFMX0NIQVJTX1BBVFRFUk4udGVzdCh2YWx1ZSksIHtcbiAgICAgICAgbWVzc2FnZTogJ1NwZWNpYWwgY2hhcmFjdGVycyAoQCwgIywgJCwgJSwgXiwgJiwgKiwgKywgPSwgLywgXFxcXCwgfCwgfiwgwqssIMK7KSBhcmUgbm90IGFsbG93ZWQnLFxuICAgIH0pXG4gICAgICAgIC5yZWZpbmUoKHZhbHVlKSA9PiAhUkVQRUFURURfUFVOQ1RVQVRJT05fUEFUVEVSTi50ZXN0KHZhbHVlKSwge1xuICAgICAgICBtZXNzYWdlOiAnUmVwZWF0ZWQgcHVuY3R1YXRpb25zICghISwgPz8sIC0tKSBhcmUgbm90IGFsbG93ZWQnLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCBzZWN1cmVVcmxTY2hlbWEgPSB6XG4gICAgLnN0cmluZygpXG4gICAgLnVybCgpXG4gICAgLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJywgeyBtZXNzYWdlOiAnTXVzdCBiZSBhbiBodHRwcyB1cmwnIH0pXG4gICAgLm1heCgxMDI0KVxuICAgIC5yZWZpbmUoKHVybCkgPT4gIXVybC5pbmNsdWRlcygnICcpLCB7XG4gICAgbWVzc2FnZTogJ1VSTCBtdXN0IG5vdCBjb250YWluIHNwYWNlcycsXG59KVxuICAgIC5yZWZpbmUoKHVybCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGhvc3RuYW1lID0gbmV3IFVSTCh1cmwpLmhvc3RuYW1lO1xuICAgICAgICAvLyBDaGVjayBmb3IgbG9jYWxob3N0XG4gICAgICAgIGlmIChob3N0bmFtZSA9PT0gJ2xvY2FsaG9zdCcgfHwgaG9zdG5hbWUuZW5kc1dpdGgoJy5sb2NhbGhvc3QnKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGZvciBJUHY0IGFkZHJlc3Nlc1xuICAgICAgICBjb25zdCBpcHY0UmVnZXggPSAvXihcXGR7MSwzfVxcLil7M31cXGR7MSwzfSQvO1xuICAgICAgICBpZiAoaXB2NFJlZ2V4LnRlc3QoaG9zdG5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgZm9yIElQdjYgYWRkcmVzc2VzIChpbmNsdWRpbmcgYnJhY2tldHMpXG4gICAgICAgIGlmIChob3N0bmFtZS5zdGFydHNXaXRoKCdbJykgJiYgaG9zdG5hbWUuZW5kc1dpdGgoJ10nKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59LCB7XG4gICAgbWVzc2FnZTogJ1VSTCBtdXN0IG5vdCB1c2UgSVAgYWRkcmVzc2VzIG9yIGxvY2FsaG9zdCcsXG59KTtcbmV4cG9ydCBjb25zdCBtaW5pQXBwTmFtZVNjaGVtYSA9IHouc3RyaW5nKCkubWF4KDMyKTtcbmV4cG9ydCBjb25zdCBidXR0b25UaXRsZVNjaGVtYSA9IHouc3RyaW5nKCkubWF4KDMyKTtcbmNvbnN0IENBSVBfMTlfUkVHRVggPSAvXlstYS16MC05XXszLDh9OlstX2EtekEtWjAtOV17MSwzMn1cXC8oPzpbLWEtejAtOV17Myw4fTpbLS4lYS16QS1aMC05XXsxLDEyOH0oPzpcXC9bLS4lYS16QS1aMC05XXsxLDc4fSk/fG5hdGl2ZSkkLztcbmV4cG9ydCBjb25zdCBjYWlwMTlUb2tlblNjaGVtYSA9IHpcbiAgICAuc3RyaW5nKClcbiAgICAucmVnZXgoQ0FJUF8xOV9SRUdFWCwgeyBtZXNzYWdlOiAnSW52YWxpZCBDQUlQLTE5IGFzc2V0IElEJyB9KTtcbmV4cG9ydCBjb25zdCBoZXhDb2xvclNjaGVtYSA9IHpcbiAgICAuc3RyaW5nKClcbiAgICAucmVnZXgoL14jKFswLTlBLUZdezN9fFswLTlBLUZdezZ9KSQvaSwge1xuICAgIG1lc3NhZ2U6ICdJbnZhbGlkIGhleCBjb2xvciBjb2RlLiBJdCBzaG91bGQgYmUgaW4gdGhlIGZvcm1hdCAjUlJHR0JCIG9yICNSR0IuJyxcbn0pO1xuLy8gRG9tYWluIHZhbGlkYXRpb24gcmVnZXg6XG4vLyAtIEVhY2ggbGFiZWwgKHBhcnQgYmV0d2VlbiBkb3RzKSBtdXN0IHN0YXJ0IGFuZCBlbmQgd2l0aCBhbHBoYW51bWVyaWNcbi8vIC0gTGFiZWxzIGNhbiBjb250YWluIGh5cGhlbnMgaW4gdGhlIG1pZGRsZVxuLy8gLSBDYW5ub3QgaGF2ZSBjb25zZWN1dGl2ZSBkb3RzXG4vLyAtIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZG90IChUTEQgcmVxdWlyZWQpXG4vLyAtIFRMRCBtdXN0IGJlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyBhbmQgb25seSBsZXR0ZXJzXG5jb25zdCBET01BSU5fUkVHRVggPSAvXig/IS4qXFwuXFwuKShbYS16QS1aMC05XShbYS16QS1aMC05LV0qW2EtekEtWjAtOV0pP1xcLikrW2EtekEtWl17Mix9JC87XG5leHBvcnQgY29uc3QgZG9tYWluU2NoZW1hID0gelxuICAgIC5zdHJpbmcoKVxuICAgIC5tYXgoMTAyNClcbiAgICAucmVnZXgoRE9NQUlOX1JFR0VYLCB7XG4gICAgbWVzc2FnZTogJ011c3QgYmUgYSB2YWxpZCBkb21haW4gbmFtZSAoZS5nLiwgZXhhbXBsZS5jb20sIHN1Yi5leGFtcGxlLmNvbSknLFxufSlcbiAgICAucmVmaW5lKCh2YWx1ZSkgPT4gIXZhbHVlLmluY2x1ZGVzKCc6Ly8nKSwge1xuICAgIG1lc3NhZ2U6ICdEb21haW4gbXVzdCBub3QgaW5jbHVkZSBwcm90b2NvbCAoaHR0cDovLywgaHR0cHM6Ly8sIGV0Yy4pJyxcbn0pXG4gICAgLnJlZmluZSgodmFsdWUpID0+ICF2YWx1ZS5pbmNsdWRlcygnLycpLCB7XG4gICAgbWVzc2FnZTogJ0RvbWFpbiBtdXN0IG5vdCBpbmNsdWRlIHBhdGggc2VwYXJhdG9ycycsXG59KVxuICAgIC5yZWZpbmUoKHZhbHVlKSA9PiAhdmFsdWUuaW5jbHVkZXMoJ0AnKSwge1xuICAgIG1lc3NhZ2U6ICdEb21haW4gbXVzdCBub3QgaW5jbHVkZSBAIHN5bWJvbCcsXG59KVxuICAgIC5yZWZpbmUoKHZhbHVlKSA9PiAhdmFsdWUuaW5jbHVkZXMoJzonKSwge1xuICAgIG1lc3NhZ2U6ICdEb21haW4gbXVzdCBub3QgaW5jbHVkZSBwb3J0IG51bWJlcnMnLFxufSk7XG5leHBvcnQgY29uc3QgYXNwZWN0UmF0aW9TY2hlbWEgPSB6LnVuaW9uKFt6LmxpdGVyYWwoJzE6MScpLCB6LmxpdGVyYWwoJzM6MicpXSk7XG5leHBvcnQgY29uc3QgZW5jb2RlZEpzb25GYXJjYXN0ZXJTaWduYXR1cmVTY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgaGVhZGVyOiB6LnN0cmluZygpLFxuICAgIHBheWxvYWQ6IHouc3RyaW5nKCksXG4gICAgc2lnbmF0dXJlOiB6LnN0cmluZygpLFxufSk7XG5leHBvcnQgY29uc3QganNvbkZhcmNhc3RlclNpZ25hdHVyZUhlYWRlclNjaGVtYSA9IHoub2JqZWN0KHtcbiAgICBmaWQ6IHoubnVtYmVyKCksXG4gICAgdHlwZTogei5saXRlcmFsKCdhcHBfa2V5JyksXG4gICAga2V5OiB6LnN0cmluZygpLnN0YXJ0c1dpdGgoJzB4JyksXG59KTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/schemas/shared.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/solana.js":
/*!************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/solana.js ***!
  \************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   SolanaConnection: () => (/* reexport safe */ _solana_web3_js__WEBPACK_IMPORTED_MODULE_0__.Connection),\n/* harmony export */   createSolanaWalletProvider: () => (/* binding */ createSolanaWalletProvider)\n/* harmony export */ });\n/* harmony import */ var _solana_web3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @solana/web3.js */ \"(app-pages-browser)/./node_modules/@solana/web3.js/lib/index.browser.esm.js\");\n\n\nconst createSolanaWalletProvider = (request) => ({\n    request,\n    signMessage: (msg) => request({ method: 'signMessage', params: { message: msg } }),\n    signTransaction: (transaction) => request({ method: 'signTransaction', params: { transaction } }),\n    signAndSendTransaction: (input) => request({\n        method: 'signAndSendTransaction',\n        params: input,\n    }),\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vc29sYW5hLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFrRTtBQUN0QztBQUNyQjtBQUNQO0FBQ0Esb0NBQW9DLGlDQUFpQyxnQkFBZ0I7QUFDckYsZ0RBQWdELHFDQUFxQyxlQUFlO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxDQUFDIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS9zb2xhbmEuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29ubmVjdGlvbiBhcyBTb2xhbmFDb25uZWN0aW9uLCB9IGZyb20gJ0Bzb2xhbmEvd2ViMy5qcyc7XG5leHBvcnQgeyBTb2xhbmFDb25uZWN0aW9uIH07XG5leHBvcnQgY29uc3QgY3JlYXRlU29sYW5hV2FsbGV0UHJvdmlkZXIgPSAocmVxdWVzdCkgPT4gKHtcbiAgICByZXF1ZXN0LFxuICAgIHNpZ25NZXNzYWdlOiAobXNnKSA9PiByZXF1ZXN0KHsgbWV0aG9kOiAnc2lnbk1lc3NhZ2UnLCBwYXJhbXM6IHsgbWVzc2FnZTogbXNnIH0gfSksXG4gICAgc2lnblRyYW5zYWN0aW9uOiAodHJhbnNhY3Rpb24pID0+IHJlcXVlc3QoeyBtZXRob2Q6ICdzaWduVHJhbnNhY3Rpb24nLCBwYXJhbXM6IHsgdHJhbnNhY3Rpb24gfSB9KSxcbiAgICBzaWduQW5kU2VuZFRyYW5zYWN0aW9uOiAoaW5wdXQpID0+IHJlcXVlc3Qoe1xuICAgICAgICBtZXRob2Q6ICdzaWduQW5kU2VuZFRyYW5zYWN0aW9uJyxcbiAgICAgICAgcGFyYW1zOiBpbnB1dCxcbiAgICB9KSxcbn0pO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/solana.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/solanaWire.js":
/*!****************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/solanaWire.js ***!
  \****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   unwrapSolanaProviderRequest: () => (/* binding */ unwrapSolanaProviderRequest),\n/* harmony export */   wrapSolanaProviderRequest: () => (/* binding */ wrapSolanaProviderRequest)\n/* harmony export */ });\n/* harmony import */ var _solana_web3_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @solana/web3.js */ \"(app-pages-browser)/./node_modules/@solana/web3.js/lib/index.browser.esm.js\");\n/* provided dependency */ var Buffer = __webpack_require__(/*! buffer */ \"(app-pages-browser)/./node_modules/buffer/index.js\")[\"Buffer\"];\n\nfunction serializeTransaction(transaction) {\n    return Buffer.from(transaction.serialize({\n        verifySignatures: false,\n    })).toString('base64');\n}\nfunction unserializeTransaction(transaction) {\n    const bytes = Buffer.from(transaction, 'base64');\n    const version = _solana_web3_js__WEBPACK_IMPORTED_MODULE_0__.VersionedMessage.deserializeMessageVersion(bytes);\n    return version === 'legacy'\n        ? _solana_web3_js__WEBPACK_IMPORTED_MODULE_0__.VersionedTransaction.deserialize(bytes)\n        : _solana_web3_js__WEBPACK_IMPORTED_MODULE_0__.Transaction.from(bytes);\n}\nfunction wrapSolanaProviderRequest(requestFn) {\n    const wrappedFn = async (request) => {\n        if (request.method === 'connect') {\n            return await requestFn(request);\n        }\n        if (request.method === 'signMessage') {\n            return await requestFn(request);\n        }\n        if (request.method === 'signAndSendTransaction') {\n            const { transaction, options } = request.params;\n            const params = {\n                transaction: unserializeTransaction(transaction),\n                options,\n            };\n            return await requestFn({\n                method: 'signAndSendTransaction',\n                params,\n            });\n        }\n        if (request.method === 'signTransaction') {\n            const { transaction } = request.params;\n            const params = {\n                transaction: unserializeTransaction(transaction),\n            };\n            const { signedTransaction } = await requestFn({\n                method: 'signTransaction',\n                params,\n            });\n            return {\n                signedTransaction: serializeTransaction(signedTransaction),\n            };\n        }\n    };\n    return wrappedFn;\n}\nfunction unwrapSolanaProviderRequest(wrappedRequestFn) {\n    const unwrappedFn = async (request) => {\n        if (request.method === 'connect') {\n            return await wrappedRequestFn(request);\n        }\n        if (request.method === 'signMessage') {\n            return await wrappedRequestFn(request);\n        }\n        if (request.method === 'signAndSendTransaction') {\n            const { transaction } = request.params;\n            const params = {\n                transaction: serializeTransaction(transaction),\n            };\n            return await wrappedRequestFn({\n                method: 'signAndSendTransaction',\n                params,\n            });\n        }\n        if (request.method === 'signTransaction') {\n            const { transaction } = request.params;\n            const params = {\n                transaction: serializeTransaction(transaction),\n            };\n            const { signedTransaction } = await wrappedRequestFn({\n                method: 'signTransaction',\n                params,\n            });\n            return { signedTransaction: unserializeTransaction(signedTransaction) };\n        }\n    };\n    return unwrappedFn;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vc29sYW5hV2lyZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQW9LO0FBQ3BLO0FBQ0EsV0FBVyxNQUFNO0FBQ2pCO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxrQkFBa0IsTUFBTTtBQUN4QixvQkFBb0IsNkRBQXNCO0FBQzFDO0FBQ0EsVUFBVSxpRUFBMEI7QUFDcEMsVUFBVSx3REFBaUI7QUFDM0I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsdUJBQXVCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBLGFBQWE7QUFDYixxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUvZXNtL3NvbGFuYVdpcmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb24gYXMgU29sYW5hVHJhbnNhY3Rpb24sIFZlcnNpb25lZE1lc3NhZ2UgYXMgU29sYW5hVmVyc2lvbmVkTWVzc2FnZSwgVmVyc2lvbmVkVHJhbnNhY3Rpb24gYXMgU29sYW5hVmVyc2lvbmVkVHJhbnNhY3Rpb24sIH0gZnJvbSAnQHNvbGFuYS93ZWIzLmpzJztcbmZ1bmN0aW9uIHNlcmlhbGl6ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHRyYW5zYWN0aW9uLnNlcmlhbGl6ZSh7XG4gICAgICAgIHZlcmlmeVNpZ25hdHVyZXM6IGZhbHNlLFxuICAgIH0pKS50b1N0cmluZygnYmFzZTY0Jyk7XG59XG5mdW5jdGlvbiB1bnNlcmlhbGl6ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBCdWZmZXIuZnJvbSh0cmFuc2FjdGlvbiwgJ2Jhc2U2NCcpO1xuICAgIGNvbnN0IHZlcnNpb24gPSBTb2xhbmFWZXJzaW9uZWRNZXNzYWdlLmRlc2VyaWFsaXplTWVzc2FnZVZlcnNpb24oYnl0ZXMpO1xuICAgIHJldHVybiB2ZXJzaW9uID09PSAnbGVnYWN5J1xuICAgICAgICA/IFNvbGFuYVZlcnNpb25lZFRyYW5zYWN0aW9uLmRlc2VyaWFsaXplKGJ5dGVzKVxuICAgICAgICA6IFNvbGFuYVRyYW5zYWN0aW9uLmZyb20oYnl0ZXMpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdyYXBTb2xhbmFQcm92aWRlclJlcXVlc3QocmVxdWVzdEZuKSB7XG4gICAgY29uc3Qgd3JhcHBlZEZuID0gYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCByZXF1ZXN0Rm4ocmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnc2lnbk1lc3NhZ2UnKSB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVxdWVzdEZuKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ3NpZ25BbmRTZW5kVHJhbnNhY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRyYW5zYWN0aW9uLCBvcHRpb25zIH0gPSByZXF1ZXN0LnBhcmFtcztcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbjogdW5zZXJpYWxpemVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbiksXG4gICAgICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVxdWVzdEZuKHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdzaWduQW5kU2VuZFRyYW5zYWN0aW9uJyxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxdWVzdC5tZXRob2QgPT09ICdzaWduVHJhbnNhY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRyYW5zYWN0aW9uIH0gPSByZXF1ZXN0LnBhcmFtcztcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbjogdW5zZXJpYWxpemVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgeyBzaWduZWRUcmFuc2FjdGlvbiB9ID0gYXdhaXQgcmVxdWVzdEZuKHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdzaWduVHJhbnNhY3Rpb24nLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzaWduZWRUcmFuc2FjdGlvbjogc2VyaWFsaXplVHJhbnNhY3Rpb24oc2lnbmVkVHJhbnNhY3Rpb24pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHdyYXBwZWRGbjtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1bndyYXBTb2xhbmFQcm92aWRlclJlcXVlc3Qod3JhcHBlZFJlcXVlc3RGbikge1xuICAgIGNvbnN0IHVud3JhcHBlZEZuID0gYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnY29ubmVjdCcpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB3cmFwcGVkUmVxdWVzdEZuKHJlcXVlc3QpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ3NpZ25NZXNzYWdlJykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHdyYXBwZWRSZXF1ZXN0Rm4ocmVxdWVzdCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcXVlc3QubWV0aG9kID09PSAnc2lnbkFuZFNlbmRUcmFuc2FjdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdHJhbnNhY3Rpb24gfSA9IHJlcXVlc3QucGFyYW1zO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uOiBzZXJpYWxpemVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHdyYXBwZWRSZXF1ZXN0Rm4oe1xuICAgICAgICAgICAgICAgIG1ldGhvZDogJ3NpZ25BbmRTZW5kVHJhbnNhY3Rpb24nLFxuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXF1ZXN0Lm1ldGhvZCA9PT0gJ3NpZ25UcmFuc2FjdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdHJhbnNhY3Rpb24gfSA9IHJlcXVlc3QucGFyYW1zO1xuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uOiBzZXJpYWxpemVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbiksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgeyBzaWduZWRUcmFuc2FjdGlvbiB9ID0gYXdhaXQgd3JhcHBlZFJlcXVlc3RGbih7XG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnc2lnblRyYW5zYWN0aW9uJyxcbiAgICAgICAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB7IHNpZ25lZFRyYW5zYWN0aW9uOiB1bnNlcmlhbGl6ZVRyYW5zYWN0aW9uKHNpZ25lZFRyYW5zYWN0aW9uKSB9O1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdW53cmFwcGVkRm47XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/solanaWire.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/types.js":
/*!***********************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/types.js ***!
  \***********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   DEFAULT_READY_OPTIONS: () => (/* reexport safe */ _actions_Ready_js__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_READY_OPTIONS),\n/* harmony export */   miniAppHostCapabilityList: () => (/* binding */ miniAppHostCapabilityList)\n/* harmony export */ });\n/* harmony import */ var _actions_Ready_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./actions/Ready.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/actions/Ready.js\");\n/* harmony import */ var _wallet_ethereum_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wallet/ethereum.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/wallet/ethereum.js\");\n\n// start backwards compat, remove in 1.0\n\nconst miniAppHostCapabilityList = [\n    'wallet.getEthereumProvider',\n    'wallet.getSolanaProvider',\n    'actions.ready',\n    'actions.openUrl',\n    'actions.close',\n    'actions.setPrimaryButton',\n    'actions.addMiniApp',\n    'actions.signIn',\n    'actions.viewCast',\n    'actions.viewProfile',\n    'actions.composeCast',\n    'actions.viewToken',\n    'actions.sendToken',\n    'actions.swapToken',\n    'actions.openMiniApp',\n    'actions.requestCameraAndMicrophoneAccess',\n    'experimental.signManifest',\n    'haptics.impactOccurred',\n    'haptics.notificationOccurred',\n    'haptics.selectionChanged',\n    'back',\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vdHlwZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUEyRDtBQUMzRDtBQUNxQztBQUM5QjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS90eXBlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBERUZBVUxUX1JFQURZX09QVElPTlMgfSBmcm9tIFwiLi9hY3Rpb25zL1JlYWR5LmpzXCI7XG4vLyBzdGFydCBiYWNrd2FyZHMgY29tcGF0LCByZW1vdmUgaW4gMS4wXG5leHBvcnQgKiBmcm9tIFwiLi93YWxsZXQvZXRoZXJldW0uanNcIjtcbmV4cG9ydCBjb25zdCBtaW5pQXBwSG9zdENhcGFiaWxpdHlMaXN0ID0gW1xuICAgICd3YWxsZXQuZ2V0RXRoZXJldW1Qcm92aWRlcicsXG4gICAgJ3dhbGxldC5nZXRTb2xhbmFQcm92aWRlcicsXG4gICAgJ2FjdGlvbnMucmVhZHknLFxuICAgICdhY3Rpb25zLm9wZW5VcmwnLFxuICAgICdhY3Rpb25zLmNsb3NlJyxcbiAgICAnYWN0aW9ucy5zZXRQcmltYXJ5QnV0dG9uJyxcbiAgICAnYWN0aW9ucy5hZGRNaW5pQXBwJyxcbiAgICAnYWN0aW9ucy5zaWduSW4nLFxuICAgICdhY3Rpb25zLnZpZXdDYXN0JyxcbiAgICAnYWN0aW9ucy52aWV3UHJvZmlsZScsXG4gICAgJ2FjdGlvbnMuY29tcG9zZUNhc3QnLFxuICAgICdhY3Rpb25zLnZpZXdUb2tlbicsXG4gICAgJ2FjdGlvbnMuc2VuZFRva2VuJyxcbiAgICAnYWN0aW9ucy5zd2FwVG9rZW4nLFxuICAgICdhY3Rpb25zLm9wZW5NaW5pQXBwJyxcbiAgICAnYWN0aW9ucy5yZXF1ZXN0Q2FtZXJhQW5kTWljcm9waG9uZUFjY2VzcycsXG4gICAgJ2V4cGVyaW1lbnRhbC5zaWduTWFuaWZlc3QnLFxuICAgICdoYXB0aWNzLmltcGFjdE9jY3VycmVkJyxcbiAgICAnaGFwdGljcy5ub3RpZmljYXRpb25PY2N1cnJlZCcsXG4gICAgJ2hhcHRpY3Muc2VsZWN0aW9uQ2hhbmdlZCcsXG4gICAgJ2JhY2snLFxuXTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/types.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/wallet/ethereum.js":
/*!*********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/wallet/ethereum.js ***!
  \*********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vd2FsbGV0L2V0aGVyZXVtLmpzIiwibWFwcGluZ3MiOiI7QUFBVSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vd2FsbGV0L2V0aGVyZXVtLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7fTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/wallet/ethereum.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/wallet/index.js":
/*!******************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-core/esm/wallet/index.js ***!
  \******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Ethereum: () => (/* reexport module object */ _ethereum_js__WEBPACK_IMPORTED_MODULE_0__)\n/* harmony export */ });\n/* harmony import */ var _ethereum_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./ethereum.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/wallet/ethereum.js\");\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtY29yZS9lc20vd2FsbGV0L2luZGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQTBDIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL2VzbS93YWxsZXQvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogYXMgRXRoZXJldW0gZnJvbSBcIi4vZXRoZXJldW0uanNcIjtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/wallet/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/back.js":
/*!**********************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/dist/back.js ***!
  \**********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   createBack: () => (/* binding */ createBack)\n/* harmony export */ });\nconst createBack = ({ miniAppHost, emitter }) => {\n    let teardownWebNavigation;\n    let backCb = null;\n    return {\n        visible: false,\n        get onback() {\n            return backCb;\n        },\n        set onback(cb) {\n            if (backCb) {\n                emitter.removeListener('backNavigationTriggered', backCb);\n            }\n            backCb = cb;\n            if (cb) {\n                emitter.addListener('backNavigationTriggered', cb);\n            }\n        },\n        async show() {\n            await miniAppHost.updateBackState({\n                visible: true,\n            });\n            this.visible = true;\n        },\n        async hide() {\n            await miniAppHost.updateBackState({\n                visible: false,\n            });\n            this.visible = false;\n        },\n        async enableWebNavigation() {\n            teardownWebNavigation = setupWebBack({\n                back: this,\n                emitter,\n            });\n        },\n        async disableWebNavigation() {\n            teardownWebNavigation?.();\n            teardownWebNavigation = undefined;\n        },\n    };\n};\nfunction setupWebBack({ emitter, back }) {\n    const navigation = getWebNavigation();\n    if (navigation) {\n        return setupNavigationApi({ emitter, back, navigation });\n    }\n    if (typeof window !== 'undefined') {\n        return setupFallback({ emitter, back, window });\n    }\n}\nfunction getWebNavigation() {\n    if (typeof window !== 'undefined' && window.navigation !== undefined) {\n        return window.navigation;\n    }\n}\nfunction setupNavigationApi({ emitter, back, navigation, }) {\n    function handleNavigateSuccess() {\n        if (navigation.canGoBack) {\n            back.show();\n        }\n        else {\n            back.hide();\n        }\n    }\n    function handleBackNavigationTriggered() {\n        if (back.visible && navigation.canGoBack) {\n            navigation.back();\n        }\n    }\n    navigation.addEventListener('navigatesuccess', handleNavigateSuccess);\n    emitter.addListener('backNavigationTriggered', handleBackNavigationTriggered);\n    return () => {\n        navigation.removeEventListener('navigatesuccess', handleNavigateSuccess);\n        emitter.removeListener('backNavigationTriggered', handleBackNavigationTriggered);\n    };\n}\nfunction setupFallback({ emitter, back, window, }) {\n    back.show();\n    function handleBackNavigationTriggered() {\n        if (back.visible) {\n            window.history.back();\n        }\n    }\n    emitter.addListener('backNavigationTriggered', handleBackNavigationTriggered);\n    return () => {\n        emitter.removeListener('backNavigationTriggered', handleBackNavigationTriggered);\n    };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3QvYmFjay5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQU8sc0JBQXNCLHNCQUFzQjtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLHdCQUF3QixlQUFlO0FBQ3ZDO0FBQ0E7QUFDQSxvQ0FBb0MsMkJBQTJCO0FBQy9EO0FBQ0E7QUFDQSwrQkFBK0IsdUJBQXVCO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLDRCQUE0QjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLHdCQUF3QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1zZGsvZGlzdC9iYWNrLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBjcmVhdGVCYWNrID0gKHsgbWluaUFwcEhvc3QsIGVtaXR0ZXIgfSkgPT4ge1xuICAgIGxldCB0ZWFyZG93bldlYk5hdmlnYXRpb247XG4gICAgbGV0IGJhY2tDYiA9IG51bGw7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIGdldCBvbmJhY2soKSB7XG4gICAgICAgICAgICByZXR1cm4gYmFja0NiO1xuICAgICAgICB9LFxuICAgICAgICBzZXQgb25iYWNrKGNiKSB7XG4gICAgICAgICAgICBpZiAoYmFja0NiKSB7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignYmFja05hdmlnYXRpb25UcmlnZ2VyZWQnLCBiYWNrQ2IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmFja0NiID0gY2I7XG4gICAgICAgICAgICBpZiAoY2IpIHtcbiAgICAgICAgICAgICAgICBlbWl0dGVyLmFkZExpc3RlbmVyKCdiYWNrTmF2aWdhdGlvblRyaWdnZXJlZCcsIGNiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgc2hvdygpIHtcbiAgICAgICAgICAgIGF3YWl0IG1pbmlBcHBIb3N0LnVwZGF0ZUJhY2tTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgaGlkZSgpIHtcbiAgICAgICAgICAgIGF3YWl0IG1pbmlBcHBIb3N0LnVwZGF0ZUJhY2tTdGF0ZSh7XG4gICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBlbmFibGVXZWJOYXZpZ2F0aW9uKCkge1xuICAgICAgICAgICAgdGVhcmRvd25XZWJOYXZpZ2F0aW9uID0gc2V0dXBXZWJCYWNrKHtcbiAgICAgICAgICAgICAgICBiYWNrOiB0aGlzLFxuICAgICAgICAgICAgICAgIGVtaXR0ZXIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZGlzYWJsZVdlYk5hdmlnYXRpb24oKSB7XG4gICAgICAgICAgICB0ZWFyZG93bldlYk5hdmlnYXRpb24/LigpO1xuICAgICAgICAgICAgdGVhcmRvd25XZWJOYXZpZ2F0aW9uID0gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgIH07XG59O1xuZnVuY3Rpb24gc2V0dXBXZWJCYWNrKHsgZW1pdHRlciwgYmFjayB9KSB7XG4gICAgY29uc3QgbmF2aWdhdGlvbiA9IGdldFdlYk5hdmlnYXRpb24oKTtcbiAgICBpZiAobmF2aWdhdGlvbikge1xuICAgICAgICByZXR1cm4gc2V0dXBOYXZpZ2F0aW9uQXBpKHsgZW1pdHRlciwgYmFjaywgbmF2aWdhdGlvbiB9KTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiBzZXR1cEZhbGxiYWNrKHsgZW1pdHRlciwgYmFjaywgd2luZG93IH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGdldFdlYk5hdmlnYXRpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5uYXZpZ2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0aW9uO1xuICAgIH1cbn1cbmZ1bmN0aW9uIHNldHVwTmF2aWdhdGlvbkFwaSh7IGVtaXR0ZXIsIGJhY2ssIG5hdmlnYXRpb24sIH0pIHtcbiAgICBmdW5jdGlvbiBoYW5kbGVOYXZpZ2F0ZVN1Y2Nlc3MoKSB7XG4gICAgICAgIGlmIChuYXZpZ2F0aW9uLmNhbkdvQmFjaykge1xuICAgICAgICAgICAgYmFjay5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBiYWNrLmhpZGUoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBoYW5kbGVCYWNrTmF2aWdhdGlvblRyaWdnZXJlZCgpIHtcbiAgICAgICAgaWYgKGJhY2sudmlzaWJsZSAmJiBuYXZpZ2F0aW9uLmNhbkdvQmFjaykge1xuICAgICAgICAgICAgbmF2aWdhdGlvbi5iYWNrKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbmF2aWdhdGlvbi5hZGRFdmVudExpc3RlbmVyKCduYXZpZ2F0ZXN1Y2Nlc3MnLCBoYW5kbGVOYXZpZ2F0ZVN1Y2Nlc3MpO1xuICAgIGVtaXR0ZXIuYWRkTGlzdGVuZXIoJ2JhY2tOYXZpZ2F0aW9uVHJpZ2dlcmVkJywgaGFuZGxlQmFja05hdmlnYXRpb25UcmlnZ2VyZWQpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIG5hdmlnYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcignbmF2aWdhdGVzdWNjZXNzJywgaGFuZGxlTmF2aWdhdGVTdWNjZXNzKTtcbiAgICAgICAgZW1pdHRlci5yZW1vdmVMaXN0ZW5lcignYmFja05hdmlnYXRpb25UcmlnZ2VyZWQnLCBoYW5kbGVCYWNrTmF2aWdhdGlvblRyaWdnZXJlZCk7XG4gICAgfTtcbn1cbmZ1bmN0aW9uIHNldHVwRmFsbGJhY2soeyBlbWl0dGVyLCBiYWNrLCB3aW5kb3csIH0pIHtcbiAgICBiYWNrLnNob3coKTtcbiAgICBmdW5jdGlvbiBoYW5kbGVCYWNrTmF2aWdhdGlvblRyaWdnZXJlZCgpIHtcbiAgICAgICAgaWYgKGJhY2sudmlzaWJsZSkge1xuICAgICAgICAgICAgd2luZG93Lmhpc3RvcnkuYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVtaXR0ZXIuYWRkTGlzdGVuZXIoJ2JhY2tOYXZpZ2F0aW9uVHJpZ2dlcmVkJywgaGFuZGxlQmFja05hdmlnYXRpb25UcmlnZ2VyZWQpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoJ2JhY2tOYXZpZ2F0aW9uVHJpZ2dlcmVkJywgaGFuZGxlQmFja05hdmlnYXRpb25UcmlnZ2VyZWQpO1xuICAgIH07XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/back.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/endpoint.js":
/*!**************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/dist/endpoint.js ***!
  \**************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   endpoint: () => (/* binding */ endpoint)\n/* harmony export */ });\n/* harmony import */ var comlink__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! comlink */ \"(app-pages-browser)/./node_modules/comlink/dist/esm/comlink.mjs\");\n\nconst mockEndpoint = {\n    postMessage() {\n        // noop\n    },\n    addEventListener: () => {\n        // noop\n    },\n    removeEventListener: () => {\n        // noop\n    },\n};\nconst webViewEndpoint = {\n    postMessage: (data) => {\n        window.ReactNativeWebView.postMessage(JSON.stringify(data));\n    },\n    addEventListener: (_, listener, ...args) => {\n        document.addEventListener('FarcasterFrameCallback', listener, ...args);\n    },\n    removeEventListener: (_, listener) => {\n        document.removeEventListener('FarcasterFrameCallback', listener);\n    },\n};\nconst endpoint = (() => {\n    // No actions are actually gonna take place during SSR, thus it's safe to return mocked endpoint\n    if (typeof window === 'undefined')\n        return mockEndpoint;\n    return window?.ReactNativeWebView\n        ? webViewEndpoint\n        : (0,comlink__WEBPACK_IMPORTED_MODULE_0__.windowEndpoint)(window?.parent ?? window);\n})();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3QvZW5kcG9pbnQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLHVEQUFjO0FBQ3hCLENBQUMiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLXNkay9kaXN0L2VuZHBvaW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdpbmRvd0VuZHBvaW50IH0gZnJvbSAnY29tbGluayc7XG5jb25zdCBtb2NrRW5kcG9pbnQgPSB7XG4gICAgcG9zdE1lc3NhZ2UoKSB7XG4gICAgICAgIC8vIG5vb3BcbiAgICB9LFxuICAgIGFkZEV2ZW50TGlzdGVuZXI6ICgpID0+IHtcbiAgICAgICAgLy8gbm9vcFxuICAgIH0sXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogKCkgPT4ge1xuICAgICAgICAvLyBub29wXG4gICAgfSxcbn07XG5jb25zdCB3ZWJWaWV3RW5kcG9pbnQgPSB7XG4gICAgcG9zdE1lc3NhZ2U6IChkYXRhKSA9PiB7XG4gICAgICAgIHdpbmRvdy5SZWFjdE5hdGl2ZVdlYlZpZXcucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpO1xuICAgIH0sXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogKF8sIGxpc3RlbmVyLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0ZhcmNhc3RlckZyYW1lQ2FsbGJhY2snLCBsaXN0ZW5lciwgLi4uYXJncyk7XG4gICAgfSxcbiAgICByZW1vdmVFdmVudExpc3RlbmVyOiAoXywgbGlzdGVuZXIpID0+IHtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignRmFyY2FzdGVyRnJhbWVDYWxsYmFjaycsIGxpc3RlbmVyKTtcbiAgICB9LFxufTtcbmV4cG9ydCBjb25zdCBlbmRwb2ludCA9ICgoKSA9PiB7XG4gICAgLy8gTm8gYWN0aW9ucyBhcmUgYWN0dWFsbHkgZ29ubmEgdGFrZSBwbGFjZSBkdXJpbmcgU1NSLCB0aHVzIGl0J3Mgc2FmZSB0byByZXR1cm4gbW9ja2VkIGVuZHBvaW50XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKVxuICAgICAgICByZXR1cm4gbW9ja0VuZHBvaW50O1xuICAgIHJldHVybiB3aW5kb3c/LlJlYWN0TmF0aXZlV2ViVmlld1xuICAgICAgICA/IHdlYlZpZXdFbmRwb2ludFxuICAgICAgICA6IHdpbmRvd0VuZHBvaW50KHdpbmRvdz8ucGFyZW50ID8/IHdpbmRvdyk7XG59KSgpO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/endpoint.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/ethereumProvider.js":
/*!**********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/dist/ethereumProvider.js ***!
  \**********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   ethereumProvider: () => (/* binding */ ethereumProvider),\n/* harmony export */   getEthereumProvider: () => (/* binding */ getEthereumProvider)\n/* harmony export */ });\n/* harmony import */ var ox_Provider__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ox/Provider */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Provider.js\");\n/* harmony import */ var ox_RpcRequest__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ox/RpcRequest */ \"(app-pages-browser)/./node_modules/ox/_esm/core/RpcRequest.js\");\n/* harmony import */ var ox_RpcResponse__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ox/RpcResponse */ \"(app-pages-browser)/./node_modules/ox/_esm/core/RpcResponse.js\");\n/* harmony import */ var _miniAppHost_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./miniAppHost.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/miniAppHost.js\");\n\n\n\n\nconst emitter = ox_Provider__WEBPACK_IMPORTED_MODULE_1__.createEmitter();\nconst store = ox_RpcRequest__WEBPACK_IMPORTED_MODULE_2__.createStore();\nfunction toProviderRpcError({ code, details, }) {\n    switch (code) {\n        case 4001:\n            return new ox_Provider__WEBPACK_IMPORTED_MODULE_1__.UserRejectedRequestError();\n        case 4100:\n            return new ox_Provider__WEBPACK_IMPORTED_MODULE_1__.UnauthorizedError();\n        case 4200:\n            return new ox_Provider__WEBPACK_IMPORTED_MODULE_1__.UnsupportedMethodError();\n        case 4900:\n            return new ox_Provider__WEBPACK_IMPORTED_MODULE_1__.DisconnectedError();\n        case 4901:\n            return new ox_Provider__WEBPACK_IMPORTED_MODULE_1__.ChainDisconnectedError();\n        default:\n            return new ox_Provider__WEBPACK_IMPORTED_MODULE_1__.ProviderRpcError(code, details ?? 'Unknown provider RPC error');\n    }\n}\nconst ethereumProvider = ox_Provider__WEBPACK_IMPORTED_MODULE_1__.from({\n    ...emitter,\n    async request(args) {\n        // @ts-expect-error\n        const request = store.prepare(args);\n        try {\n            const response = await _miniAppHost_js__WEBPACK_IMPORTED_MODULE_0__.miniAppHost\n                .ethProviderRequestV2(request)\n                .then((res) => ox_RpcResponse__WEBPACK_IMPORTED_MODULE_3__.parse(res, { request, raw: true }));\n            if (response.error) {\n                throw toProviderRpcError(response.error);\n            }\n            return response.result;\n        }\n        catch (e) {\n            // ethProviderRequestV2 not supported, fall back to v1\n            if (e instanceof Error &&\n                e.message.match(/cannot read property 'apply'/i)) {\n                return await _miniAppHost_js__WEBPACK_IMPORTED_MODULE_0__.miniAppHost.ethProviderRequest(request);\n            }\n            if (e instanceof ox_Provider__WEBPACK_IMPORTED_MODULE_1__.ProviderRpcError ||\n                e instanceof ox_RpcResponse__WEBPACK_IMPORTED_MODULE_3__.BaseError) {\n                throw e;\n            }\n            throw new ox_RpcResponse__WEBPACK_IMPORTED_MODULE_3__.InternalError({\n                message: e instanceof Error ? e.message : undefined,\n            });\n        }\n    },\n});\nasync function getEthereumProvider() {\n    try {\n        const capabilities = await _miniAppHost_js__WEBPACK_IMPORTED_MODULE_0__.miniAppHost.getCapabilities();\n        if (!capabilities.includes('wallet.getEthereumProvider') &&\n            !capabilities.includes('wallet.getEvmProvider')) {\n            // We used getEvmProvider for a short period before getEthereumProvider.\n            // In case we're talking to an old host, we check the old key.\n            return undefined;\n        }\n        return ethereumProvider;\n    }\n    catch {\n        // If this is an old frame host that doesn't support getCapabilities,\n        // getEthereumProvider will assume that it's supported\n        return ethereumProvider;\n    }\n}\nfunction announceEvmProvider(detail) {\n    const event = new CustomEvent('eip6963:announceProvider', { detail: Object.freeze(detail) });\n    window.dispatchEvent(event);\n    const handler = () => window.dispatchEvent(event);\n    window.addEventListener('eip6963:requestProvider', handler);\n    return () => window.removeEventListener('eip6963:requestProvider', handler);\n}\n// Required to pass SSR\nif (typeof document !== 'undefined') {\n    // forward eip6963:requestProvider events to the host\n    document.addEventListener('eip6963:requestProvider', () => {\n        _miniAppHost_js__WEBPACK_IMPORTED_MODULE_0__.miniAppHost.eip6963RequestProvider();\n    });\n    // react native webview events\n    document.addEventListener('FarcasterFrameEthProviderEvent', (event) => {\n        if (event instanceof MessageEvent) {\n            const ethProviderEvent = event.data;\n            // @ts-expect-error\n            emitter.emit(ethProviderEvent.event, ...ethProviderEvent.params);\n        }\n    });\n    document.addEventListener('FarcasterFrameEvent', (event) => {\n        if (event instanceof MessageEvent) {\n            const miniAppEvent = event.data;\n            if (miniAppEvent.event === 'eip6963:announceProvider') {\n                announceEvmProvider({\n                    info: miniAppEvent.info,\n                    provider: ethereumProvider,\n                });\n            }\n        }\n    });\n}\n// Required to pass SSR\nif (typeof window !== 'undefined') {\n    // forward eip6963:requestProvider events to the host\n    window.addEventListener('eip6963:requestProvider', () => {\n        _miniAppHost_js__WEBPACK_IMPORTED_MODULE_0__.miniAppHost.eip6963RequestProvider();\n    });\n    // web events\n    window.addEventListener('message', (event) => {\n        if (event instanceof MessageEvent) {\n            if (event.data.type === 'frameEthProviderEvent') {\n                const ethProviderEvent = event.data;\n                // @ts-expect-error\n                emitter.emit(ethProviderEvent.event, ...ethProviderEvent.params);\n            }\n        }\n    });\n    window.addEventListener('message', (event) => {\n        if (event instanceof MessageEvent) {\n            if (event.data.type === 'frameEvent') {\n                const miniAppEvent = event.data.event;\n                if (miniAppEvent.event === 'eip6963:announceProvider') {\n                    announceEvmProvider({\n                        info: miniAppEvent.info,\n                        provider: ethereumProvider,\n                    });\n                }\n            }\n        }\n    });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3QvZXRoZXJldW1Qcm92aWRlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBd0M7QUFDSTtBQUNFO0FBQ0M7QUFDL0MsZ0JBQWdCLHNEQUFzQjtBQUN0QyxjQUFjLHNEQUFzQjtBQUNwQyw4QkFBOEIsZ0JBQWdCO0FBQzlDO0FBQ0E7QUFDQSx1QkFBdUIsaUVBQWlDO0FBQ3hEO0FBQ0EsdUJBQXVCLDBEQUEwQjtBQUNqRDtBQUNBLHVCQUF1QiwrREFBK0I7QUFDdEQ7QUFDQSx1QkFBdUIsMERBQTBCO0FBQ2pEO0FBQ0EsdUJBQXVCLCtEQUErQjtBQUN0RDtBQUNBLHVCQUF1Qix5REFBeUI7QUFDaEQ7QUFDQTtBQUNPLHlCQUF5Qiw2Q0FBYTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLHdEQUFXO0FBQzlDO0FBQ0EsK0JBQStCLGlEQUFpQixRQUFRLG9CQUFvQjtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsd0RBQVc7QUFDeEM7QUFDQSw2QkFBNkIseURBQXlCO0FBQ3RELDZCQUE2QixxREFBcUI7QUFDbEQ7QUFDQTtBQUNBLHNCQUFzQix5REFBeUI7QUFDL0M7QUFDQSxhQUFhO0FBQ2I7QUFDQSxLQUFLO0FBQ0wsQ0FBQztBQUNNO0FBQ1A7QUFDQSxtQ0FBbUMsd0RBQVc7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLCtCQUErQjtBQUMvRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHdEQUFXO0FBQ25CLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHdEQUFXO0FBQ25CLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLXNkay9kaXN0L2V0aGVyZXVtUHJvdmlkZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUHJvdmlkZXIgZnJvbSAnb3gvUHJvdmlkZXInO1xuaW1wb3J0ICogYXMgUnBjUmVxdWVzdCBmcm9tICdveC9ScGNSZXF1ZXN0JztcbmltcG9ydCAqIGFzIFJwY1Jlc3BvbnNlIGZyb20gJ294L1JwY1Jlc3BvbnNlJztcbmltcG9ydCB7IG1pbmlBcHBIb3N0IH0gZnJvbSBcIi4vbWluaUFwcEhvc3QuanNcIjtcbmNvbnN0IGVtaXR0ZXIgPSBQcm92aWRlci5jcmVhdGVFbWl0dGVyKCk7XG5jb25zdCBzdG9yZSA9IFJwY1JlcXVlc3QuY3JlYXRlU3RvcmUoKTtcbmZ1bmN0aW9uIHRvUHJvdmlkZXJScGNFcnJvcih7IGNvZGUsIGRldGFpbHMsIH0pIHtcbiAgICBzd2l0Y2ggKGNvZGUpIHtcbiAgICAgICAgY2FzZSA0MDAxOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm92aWRlci5Vc2VyUmVqZWN0ZWRSZXF1ZXN0RXJyb3IoKTtcbiAgICAgICAgY2FzZSA0MTAwOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm92aWRlci5VbmF1dGhvcml6ZWRFcnJvcigpO1xuICAgICAgICBjYXNlIDQyMDA6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3ZpZGVyLlVuc3VwcG9ydGVkTWV0aG9kRXJyb3IoKTtcbiAgICAgICAgY2FzZSA0OTAwOlxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm92aWRlci5EaXNjb25uZWN0ZWRFcnJvcigpO1xuICAgICAgICBjYXNlIDQ5MDE6XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3ZpZGVyLkNoYWluRGlzY29ubmVjdGVkRXJyb3IoKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvdmlkZXIuUHJvdmlkZXJScGNFcnJvcihjb2RlLCBkZXRhaWxzID8/ICdVbmtub3duIHByb3ZpZGVyIFJQQyBlcnJvcicpO1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBldGhlcmV1bVByb3ZpZGVyID0gUHJvdmlkZXIuZnJvbSh7XG4gICAgLi4uZW1pdHRlcixcbiAgICBhc3luYyByZXF1ZXN0KGFyZ3MpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICBjb25zdCByZXF1ZXN0ID0gc3RvcmUucHJlcGFyZShhcmdzKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWluaUFwcEhvc3RcbiAgICAgICAgICAgICAgICAuZXRoUHJvdmlkZXJSZXF1ZXN0VjIocmVxdWVzdClcbiAgICAgICAgICAgICAgICAudGhlbigocmVzKSA9PiBScGNSZXNwb25zZS5wYXJzZShyZXMsIHsgcmVxdWVzdCwgcmF3OiB0cnVlIH0pKTtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IHRvUHJvdmlkZXJScGNFcnJvcihyZXNwb25zZS5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBldGhQcm92aWRlclJlcXVlc3RWMiBub3Qgc3VwcG9ydGVkLCBmYWxsIGJhY2sgdG8gdjFcbiAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICAgICAgICAgICBlLm1lc3NhZ2UubWF0Y2goL2Nhbm5vdCByZWFkIHByb3BlcnR5ICdhcHBseScvaSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgbWluaUFwcEhvc3QuZXRoUHJvdmlkZXJSZXF1ZXN0KHJlcXVlc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBQcm92aWRlci5Qcm92aWRlclJwY0Vycm9yIHx8XG4gICAgICAgICAgICAgICAgZSBpbnN0YW5jZW9mIFJwY1Jlc3BvbnNlLkJhc2VFcnJvcikge1xuICAgICAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnBjUmVzcG9uc2UuSW50ZXJuYWxFcnJvcih7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxufSk7XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RXRoZXJldW1Qcm92aWRlcigpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSBhd2FpdCBtaW5pQXBwSG9zdC5nZXRDYXBhYmlsaXRpZXMoKTtcbiAgICAgICAgaWYgKCFjYXBhYmlsaXRpZXMuaW5jbHVkZXMoJ3dhbGxldC5nZXRFdGhlcmV1bVByb3ZpZGVyJykgJiZcbiAgICAgICAgICAgICFjYXBhYmlsaXRpZXMuaW5jbHVkZXMoJ3dhbGxldC5nZXRFdm1Qcm92aWRlcicpKSB7XG4gICAgICAgICAgICAvLyBXZSB1c2VkIGdldEV2bVByb3ZpZGVyIGZvciBhIHNob3J0IHBlcmlvZCBiZWZvcmUgZ2V0RXRoZXJldW1Qcm92aWRlci5cbiAgICAgICAgICAgIC8vIEluIGNhc2Ugd2UncmUgdGFsa2luZyB0byBhbiBvbGQgaG9zdCwgd2UgY2hlY2sgdGhlIG9sZCBrZXkuXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldGhlcmV1bVByb3ZpZGVyO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gb2xkIGZyYW1lIGhvc3QgdGhhdCBkb2Vzbid0IHN1cHBvcnQgZ2V0Q2FwYWJpbGl0aWVzLFxuICAgICAgICAvLyBnZXRFdGhlcmV1bVByb3ZpZGVyIHdpbGwgYXNzdW1lIHRoYXQgaXQncyBzdXBwb3J0ZWRcbiAgICAgICAgcmV0dXJuIGV0aGVyZXVtUHJvdmlkZXI7XG4gICAgfVxufVxuZnVuY3Rpb24gYW5ub3VuY2VFdm1Qcm92aWRlcihkZXRhaWwpIHtcbiAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgnZWlwNjk2Mzphbm5vdW5jZVByb3ZpZGVyJywgeyBkZXRhaWw6IE9iamVjdC5mcmVlemUoZGV0YWlsKSB9KTtcbiAgICB3aW5kb3cuZGlzcGF0Y2hFdmVudChldmVudCk7XG4gICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHdpbmRvdy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignZWlwNjk2MzpyZXF1ZXN0UHJvdmlkZXInLCBoYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4gd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VpcDY5NjM6cmVxdWVzdFByb3ZpZGVyJywgaGFuZGxlcik7XG59XG4vLyBSZXF1aXJlZCB0byBwYXNzIFNTUlxuaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBmb3J3YXJkIGVpcDY5NjM6cmVxdWVzdFByb3ZpZGVyIGV2ZW50cyB0byB0aGUgaG9zdFxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2VpcDY5NjM6cmVxdWVzdFByb3ZpZGVyJywgKCkgPT4ge1xuICAgICAgICBtaW5pQXBwSG9zdC5laXA2OTYzUmVxdWVzdFByb3ZpZGVyKCk7XG4gICAgfSk7XG4gICAgLy8gcmVhY3QgbmF0aXZlIHdlYnZpZXcgZXZlbnRzXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRmFyY2FzdGVyRnJhbWVFdGhQcm92aWRlckV2ZW50JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE1lc3NhZ2VFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgZXRoUHJvdmlkZXJFdmVudCA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICBlbWl0dGVyLmVtaXQoZXRoUHJvdmlkZXJFdmVudC5ldmVudCwgLi4uZXRoUHJvdmlkZXJFdmVudC5wYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRmFyY2FzdGVyRnJhbWVFdmVudCcsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNZXNzYWdlRXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1pbmlBcHBFdmVudCA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICBpZiAobWluaUFwcEV2ZW50LmV2ZW50ID09PSAnZWlwNjk2Mzphbm5vdW5jZVByb3ZpZGVyJykge1xuICAgICAgICAgICAgICAgIGFubm91bmNlRXZtUHJvdmlkZXIoe1xuICAgICAgICAgICAgICAgICAgICBpbmZvOiBtaW5pQXBwRXZlbnQuaW5mbyxcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXI6IGV0aGVyZXVtUHJvdmlkZXIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbi8vIFJlcXVpcmVkIHRvIHBhc3MgU1NSXG5pZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAvLyBmb3J3YXJkIGVpcDY5NjM6cmVxdWVzdFByb3ZpZGVyIGV2ZW50cyB0byB0aGUgaG9zdFxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlaXA2OTYzOnJlcXVlc3RQcm92aWRlcicsICgpID0+IHtcbiAgICAgICAgbWluaUFwcEhvc3QuZWlwNjk2M1JlcXVlc3RQcm92aWRlcigpO1xuICAgIH0pO1xuICAgIC8vIHdlYiBldmVudHNcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNZXNzYWdlRXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLnR5cGUgPT09ICdmcmFtZUV0aFByb3ZpZGVyRXZlbnQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXRoUHJvdmlkZXJFdmVudCA9IGV2ZW50LmRhdGE7XG4gICAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdChldGhQcm92aWRlckV2ZW50LmV2ZW50LCAuLi5ldGhQcm92aWRlckV2ZW50LnBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNZXNzYWdlRXZlbnQpIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLnR5cGUgPT09ICdmcmFtZUV2ZW50Jykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pbmlBcHBFdmVudCA9IGV2ZW50LmRhdGEuZXZlbnQ7XG4gICAgICAgICAgICAgICAgaWYgKG1pbmlBcHBFdmVudC5ldmVudCA9PT0gJ2VpcDY5NjM6YW5ub3VuY2VQcm92aWRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VFdm1Qcm92aWRlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmZvOiBtaW5pQXBwRXZlbnQuaW5mbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyOiBldGhlcmV1bVByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/ethereumProvider.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/index.js":
/*!***********************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/dist/index.js ***!
  \***********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   AddMiniApp: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.AddMiniApp),\n/* harmony export */   Back: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.Back),\n/* harmony export */   ComposeCast: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.ComposeCast),\n/* harmony export */   Context: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.Context),\n/* harmony export */   DEFAULT_READY_OPTIONS: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.DEFAULT_READY_OPTIONS),\n/* harmony export */   Errors: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.Errors),\n/* harmony export */   Ethereum: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.Ethereum),\n/* harmony export */   Haptics: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.Haptics),\n/* harmony export */   Manifest: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.Manifest),\n/* harmony export */   OpenMiniApp: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.OpenMiniApp),\n/* harmony export */   QuickAuth: () => (/* reexport module object */ _quickAuth_js__WEBPACK_IMPORTED_MODULE_3__),\n/* harmony export */   Ready: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.Ready),\n/* harmony export */   RequestCameraAndMicrophoneAccess: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.RequestCameraAndMicrophoneAccess),\n/* harmony export */   SendToken: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.SendToken),\n/* harmony export */   SignIn: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.SignIn),\n/* harmony export */   SignManifest: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.SignManifest),\n/* harmony export */   SolanaConnection: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.SolanaConnection),\n/* harmony export */   SwapToken: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.SwapToken),\n/* harmony export */   ViewCast: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.ViewCast),\n/* harmony export */   ViewProfile: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.ViewProfile),\n/* harmony export */   ViewToken: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.ViewToken),\n/* harmony export */   actionLaunchFrameSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.actionLaunchFrameSchema),\n/* harmony export */   actionLaunchMiniAppSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.actionLaunchMiniAppSchema),\n/* harmony export */   actionSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.actionSchema),\n/* harmony export */   actionViewTokenSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.actionViewTokenSchema),\n/* harmony export */   aspectRatioSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.aspectRatioSchema),\n/* harmony export */   buttonSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.buttonSchema),\n/* harmony export */   buttonTitleSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.buttonTitleSchema),\n/* harmony export */   caip19TokenSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.caip19TokenSchema),\n/* harmony export */   chains: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.chains),\n/* harmony export */   createSimpleStringSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.createSimpleStringSchema),\n/* harmony export */   createSolanaWalletProvider: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.createSolanaWalletProvider),\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */   descriptionSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.descriptionSchema),\n/* harmony export */   domainManifestSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.domainManifestSchema),\n/* harmony export */   domainMiniAppConfigSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.domainMiniAppConfigSchema),\n/* harmony export */   domainSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.domainSchema),\n/* harmony export */   encodedJsonFarcasterSignatureSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.encodedJsonFarcasterSignatureSchema),\n/* harmony export */   eventMiniAppAddedSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.eventMiniAppAddedSchema),\n/* harmony export */   eventMiniAppRemovedSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.eventMiniAppRemovedSchema),\n/* harmony export */   eventNotificationsEnabledSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.eventNotificationsEnabledSchema),\n/* harmony export */   frameHost: () => (/* reexport safe */ _miniAppHost_js__WEBPACK_IMPORTED_MODULE_2__.frameHost),\n/* harmony export */   hexColorSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.hexColorSchema),\n/* harmony export */   jsonFarcasterSignatureHeaderSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.jsonFarcasterSignatureHeaderSchema),\n/* harmony export */   miniAppEmbedNextSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.miniAppEmbedNextSchema),\n/* harmony export */   miniAppHost: () => (/* reexport safe */ _miniAppHost_js__WEBPACK_IMPORTED_MODULE_2__.miniAppHost),\n/* harmony export */   miniAppHostCapabilityList: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.miniAppHostCapabilityList),\n/* harmony export */   miniAppNameSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.miniAppNameSchema),\n/* harmony export */   noindexSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.noindexSchema),\n/* harmony export */   notificationDetailsSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.notificationDetailsSchema),\n/* harmony export */   notificationsDisabledSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.notificationsDisabledSchema),\n/* harmony export */   ogDescriptionSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.ogDescriptionSchema),\n/* harmony export */   ogTitleSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.ogTitleSchema),\n/* harmony export */   primaryCategories: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.primaryCategories),\n/* harmony export */   primaryCategorySchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.primaryCategorySchema),\n/* harmony export */   quickAuth: () => (/* reexport safe */ _quickAuth_js__WEBPACK_IMPORTED_MODULE_3__.quickAuth),\n/* harmony export */   requiredCapabilitiesSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.requiredCapabilitiesSchema),\n/* harmony export */   requiredChainsSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.requiredChainsSchema),\n/* harmony export */   safeParseFrameEmbed: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.safeParseFrameEmbed),\n/* harmony export */   safeParseMiniAppEmbed: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.safeParseMiniAppEmbed),\n/* harmony export */   screenshotUrlsSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.screenshotUrlsSchema),\n/* harmony export */   sdk: () => (/* reexport safe */ _sdk_js__WEBPACK_IMPORTED_MODULE_0__.sdk),\n/* harmony export */   secureUrlSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.secureUrlSchema),\n/* harmony export */   sendNotificationRequestSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.sendNotificationRequestSchema),\n/* harmony export */   sendNotificationResponseSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.sendNotificationResponseSchema),\n/* harmony export */   serverEventSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.serverEventSchema),\n/* harmony export */   subtitleSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.subtitleSchema),\n/* harmony export */   taglineSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.taglineSchema),\n/* harmony export */   tagsSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.tagsSchema),\n/* harmony export */   unwrapSolanaProviderRequest: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.unwrapSolanaProviderRequest),\n/* harmony export */   versionSchema: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.versionSchema),\n/* harmony export */   wrapSolanaProviderRequest: () => (/* reexport safe */ _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__.wrapSolanaProviderRequest)\n/* harmony export */ });\n/* harmony import */ var _sdk_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sdk.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/sdk.js\");\n/* harmony import */ var _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @farcaster/miniapp-core */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/index.js\");\n/* harmony import */ var _miniAppHost_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./miniAppHost.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/miniAppHost.js\");\n/* harmony import */ var _quickAuth_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./quickAuth.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/quickAuth.js\");\n\n\n\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_sdk_js__WEBPACK_IMPORTED_MODULE_0__.sdk);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3QvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUErQjtBQUNTO0FBQ1A7QUFDVztBQUNEO0FBQ2xCO0FBQ3pCLGlFQUFlLHdDQUFHLEVBQUMiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLXNkay9kaXN0L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNkayB9IGZyb20gXCIuL3Nkay5qc1wiO1xuZXhwb3J0ICogZnJvbSAnQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUnO1xuZXhwb3J0ICogZnJvbSBcIi4vbWluaUFwcEhvc3QuanNcIjtcbmV4cG9ydCAqIGFzIFF1aWNrQXV0aCBmcm9tIFwiLi9xdWlja0F1dGguanNcIjtcbmV4cG9ydCB7IHF1aWNrQXV0aCB9IGZyb20gXCIuL3F1aWNrQXV0aC5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2RrLmpzXCI7XG5leHBvcnQgZGVmYXVsdCBzZGs7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/miniAppHost.js":
/*!*****************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/dist/miniAppHost.js ***!
  \*****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   frameHost: () => (/* binding */ frameHost),\n/* harmony export */   miniAppHost: () => (/* binding */ miniAppHost)\n/* harmony export */ });\n/* harmony import */ var comlink__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! comlink */ \"(app-pages-browser)/./node_modules/comlink/dist/esm/comlink.mjs\");\n/* harmony import */ var _endpoint_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./endpoint.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/endpoint.js\");\n\n\nconst miniAppHost = (0,comlink__WEBPACK_IMPORTED_MODULE_1__.wrap)(_endpoint_js__WEBPACK_IMPORTED_MODULE_0__.endpoint);\n// Backward compatibility\nconst frameHost = miniAppHost;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3QvbWluaUFwcEhvc3QuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUErQjtBQUNVO0FBQ2xDLG9CQUFvQiw2Q0FBSSxDQUFDLGtEQUFRO0FBQ3hDO0FBQ08iLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLXNkay9kaXN0L21pbmlBcHBIb3N0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdyYXAgfSBmcm9tICdjb21saW5rJztcbmltcG9ydCB7IGVuZHBvaW50IH0gZnJvbSBcIi4vZW5kcG9pbnQuanNcIjtcbmV4cG9ydCBjb25zdCBtaW5pQXBwSG9zdCA9IHdyYXAoZW5kcG9pbnQpO1xuLy8gQmFja3dhcmQgY29tcGF0aWJpbGl0eVxuZXhwb3J0IGNvbnN0IGZyYW1lSG9zdCA9IG1pbmlBcHBIb3N0O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/miniAppHost.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/quickAuth.js":
/*!***************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/dist/quickAuth.js ***!
  \***************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   quickAuth: () => (/* binding */ quickAuth)\n/* harmony export */ });\n/* harmony import */ var _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @farcaster/miniapp-core */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/index.js\");\n/* harmony import */ var _farcaster_quick_auth_decodeJwt__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @farcaster/quick-auth/decodeJwt */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/decodeJwt.js\");\n/* harmony import */ var _farcaster_quick_auth_light__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @farcaster/quick-auth/light */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/lightClient.js\");\n/* harmony import */ var ox_Siwe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ox/Siwe */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Siwe.js\");\n/* harmony import */ var _miniAppHost_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./miniAppHost.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/miniAppHost.js\");\n\n\n\n\n\nconst quickAuth = (() => {\n    let current;\n    let pendingPromise;\n    async function getTokenInner(options) {\n        const quickAuthClient = (0,_farcaster_quick_auth_light__WEBPACK_IMPORTED_MODULE_2__.createLightClient)({\n            origin: options.quickAuthServerOrigin,\n        });\n        const { nonce } = await quickAuthClient.generateNonce();\n        const response = await _miniAppHost_js__WEBPACK_IMPORTED_MODULE_1__.miniAppHost.signIn({\n            nonce,\n            acceptAuthAddress: true,\n        });\n        if (response.result) {\n            const parsedSiwe = ox_Siwe__WEBPACK_IMPORTED_MODULE_3__.parseMessage(response.result.message);\n            // The Farcaster Client rendering the Mini App will set the domain\n            // based on the URL it's rendering. It should always be set.\n            if (!parsedSiwe.domain) {\n                throw new Error('Missing domain on SIWE message');\n            }\n            const verifyResult = await quickAuthClient.verifySiwf({\n                domain: parsedSiwe.domain,\n                message: response.result.message,\n                signature: response.result.signature,\n            });\n            current = {\n                token: verifyResult.token,\n                payload: (0,_farcaster_quick_auth_decodeJwt__WEBPACK_IMPORTED_MODULE_4__.decodeJwt)(verifyResult.token),\n            };\n            return verifyResult;\n        }\n        if (response.error.type === 'rejected_by_user') {\n            throw new _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__.SignIn.RejectedByUser();\n        }\n        throw new Error('Unreachable');\n    }\n    return {\n        get token() {\n            if (current &&\n                new Date(current.payload.exp * 1000) > new Date(Date.now() + 15000)) {\n                return current.token;\n            }\n            return undefined;\n        },\n        async getToken(options = {}) {\n            const force = options.force ?? false;\n            if (current &&\n                !force &&\n                new Date(current.payload.exp * 1000) > new Date(Date.now() + 15000)) {\n                return { token: current.token };\n            }\n            if (!pendingPromise) {\n                pendingPromise = getTokenInner(options);\n            }\n            pendingPromise.finally(() => {\n                pendingPromise = undefined;\n            });\n            return pendingPromise;\n        },\n        async fetch(url, options) {\n            const { token } = await this.getToken();\n            const headers = new Headers(options?.headers);\n            headers.set('Authorization', `Bearer ${token}`);\n            return fetch(url, {\n                ...options,\n                headers,\n            });\n        },\n    };\n})();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3QvcXVpY2tBdXRoLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFpRDtBQUNXO0FBQ0k7QUFDaEM7QUFDZTtBQUN4QztBQUNQO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyw4RUFBaUI7QUFDakQ7QUFDQSxTQUFTO0FBQ1QsZ0JBQWdCLFFBQVE7QUFDeEIsK0JBQStCLHdEQUFXO0FBQzFDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSwrQkFBK0IsaURBQWlCO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EseUJBQXlCLDBFQUFTO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDBFQUFxQjtBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsU0FBUztBQUNUO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQSxtREFBbUQsTUFBTTtBQUN6RDtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0EsQ0FBQyIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3QvcXVpY2tBdXRoLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFNpZ25JbiB9IGZyb20gJ0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlJztcbmltcG9ydCB7IGRlY29kZUp3dCB9IGZyb20gJ0BmYXJjYXN0ZXIvcXVpY2stYXV0aC9kZWNvZGVKd3QnO1xuaW1wb3J0IHsgY3JlYXRlTGlnaHRDbGllbnQgfSBmcm9tICdAZmFyY2FzdGVyL3F1aWNrLWF1dGgvbGlnaHQnO1xuaW1wb3J0ICogYXMgU2l3ZSBmcm9tICdveC9TaXdlJztcbmltcG9ydCB7IG1pbmlBcHBIb3N0IH0gZnJvbSAnLi9taW5pQXBwSG9zdC5qcyc7XG5leHBvcnQgY29uc3QgcXVpY2tBdXRoID0gKCgpID0+IHtcbiAgICBsZXQgY3VycmVudDtcbiAgICBsZXQgcGVuZGluZ1Byb21pc2U7XG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0VG9rZW5Jbm5lcihvcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHF1aWNrQXV0aENsaWVudCA9IGNyZWF0ZUxpZ2h0Q2xpZW50KHtcbiAgICAgICAgICAgIG9yaWdpbjogb3B0aW9ucy5xdWlja0F1dGhTZXJ2ZXJPcmlnaW4sXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB7IG5vbmNlIH0gPSBhd2FpdCBxdWlja0F1dGhDbGllbnQuZ2VuZXJhdGVOb25jZSgpO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1pbmlBcHBIb3N0LnNpZ25Jbih7XG4gICAgICAgICAgICBub25jZSxcbiAgICAgICAgICAgIGFjY2VwdEF1dGhBZGRyZXNzOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdCkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkU2l3ZSA9IFNpd2UucGFyc2VNZXNzYWdlKHJlc3BvbnNlLnJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIC8vIFRoZSBGYXJjYXN0ZXIgQ2xpZW50IHJlbmRlcmluZyB0aGUgTWluaSBBcHAgd2lsbCBzZXQgdGhlIGRvbWFpblxuICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIFVSTCBpdCdzIHJlbmRlcmluZy4gSXQgc2hvdWxkIGFsd2F5cyBiZSBzZXQuXG4gICAgICAgICAgICBpZiAoIXBhcnNlZFNpd2UuZG9tYWluKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGRvbWFpbiBvbiBTSVdFIG1lc3NhZ2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHZlcmlmeVJlc3VsdCA9IGF3YWl0IHF1aWNrQXV0aENsaWVudC52ZXJpZnlTaXdmKHtcbiAgICAgICAgICAgICAgICBkb21haW46IHBhcnNlZFNpd2UuZG9tYWluLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3BvbnNlLnJlc3VsdC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZTogcmVzcG9uc2UucmVzdWx0LnNpZ25hdHVyZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY3VycmVudCA9IHtcbiAgICAgICAgICAgICAgICB0b2tlbjogdmVyaWZ5UmVzdWx0LnRva2VuLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IGRlY29kZUp3dCh2ZXJpZnlSZXN1bHQudG9rZW4pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB2ZXJpZnlSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yLnR5cGUgPT09ICdyZWplY3RlZF9ieV91c2VyJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNpZ25Jbi5SZWplY3RlZEJ5VXNlcigpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5yZWFjaGFibGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0IHRva2VuKCkge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQgJiZcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZShjdXJyZW50LnBheWxvYWQuZXhwICogMTAwMCkgPiBuZXcgRGF0ZShEYXRlLm5vdygpICsgMTUwMDApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQudG9rZW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgICBhc3luYyBnZXRUb2tlbihvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcmNlID0gb3B0aW9ucy5mb3JjZSA/PyBmYWxzZTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50ICYmXG4gICAgICAgICAgICAgICAgIWZvcmNlICYmXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoY3VycmVudC5wYXlsb2FkLmV4cCAqIDEwMDApID4gbmV3IERhdGUoRGF0ZS5ub3coKSArIDE1MDAwKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRva2VuOiBjdXJyZW50LnRva2VuIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBlbmRpbmdQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcGVuZGluZ1Byb21pc2UgPSBnZXRUb2tlbklubmVyKG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGVuZGluZ1Byb21pc2UuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGVuZGluZ1Byb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBwZW5kaW5nUHJvbWlzZTtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgZmV0Y2godXJsLCBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRva2VuIH0gPSBhd2FpdCB0aGlzLmdldFRva2VuKCk7XG4gICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMob3B0aW9ucz8uaGVhZGVycyk7XG4gICAgICAgICAgICBoZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsIGBCZWFyZXIgJHt0b2tlbn1gKTtcbiAgICAgICAgICAgIHJldHVybiBmZXRjaCh1cmwsIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICB9O1xufSkoKTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/quickAuth.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/sdk.js":
/*!*********************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/dist/sdk.js ***!
  \*********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   sdk: () => (/* binding */ sdk)\n/* harmony export */ });\n/* harmony import */ var _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @farcaster/miniapp-core */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/index.js\");\n/* harmony import */ var _back_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./back.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/back.js\");\n/* harmony import */ var _ethereumProvider_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./ethereumProvider.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/ethereumProvider.js\");\n/* harmony import */ var _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./miniAppHost.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/miniAppHost.js\");\n/* harmony import */ var _quickAuth_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./quickAuth.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/quickAuth.js\");\n/* harmony import */ var _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./sdkEmitter.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/sdkEmitter.js\");\n/* harmony import */ var _solanaProvider_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./solanaProvider.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/solanaProvider.js\");\n\n\n\n\n\n\n\nlet cachedIsInMiniAppResult = null;\n/**\n * Determines if the current environment is a MiniApp context.\n *\n * @param timeoutMs - Optional timeout in milliseconds (default: 1000)\n * @returns Promise resolving to boolean indicating if in MiniApp context\n */\nasync function isInMiniApp(timeoutMs = 1000) {\n    // Return cached result if we've already determined we are in a MiniApp\n    if (cachedIsInMiniAppResult === true) {\n        return true;\n    }\n    // Check for SSR environment - definitely not a MiniApp\n    if (typeof window === 'undefined') {\n        return false;\n    }\n    // Short-circuit: definitely NOT a MiniApp\n    if (!window.ReactNativeWebView && window === window.parent) {\n        return false;\n    }\n    // At this point, we MIGHT be in a MiniApp (iframe or RN WebView)\n    // but need to verify by checking for context communication.\n    const isInMiniApp = await Promise.race([\n        _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.context.then((context) => !!context), // Check if context resolves to truthy\n        new Promise((resolve) => {\n            setTimeout(() => resolve(false), timeoutMs); // Timeout resolves to false\n        }),\n    ]).catch(() => {\n        return false;\n    });\n    // Cache the result ONLY if true (we are confirmed to be in a MiniApp)\n    if (isInMiniApp) {\n        cachedIsInMiniAppResult = true;\n    }\n    return isInMiniApp;\n}\nconst addMiniApp = async () => {\n    // Use the existing message overcomlink for backwards compat until\n    // hosts are all upgraded.\n    const response = await _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.addFrame();\n    if (response.result) {\n        return response.result;\n    }\n    if (response.error.type === 'invalid_domain_manifest') {\n        throw new _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__.AddMiniApp.InvalidDomainManifest();\n    }\n    if (response.error.type === 'rejected_by_user') {\n        throw new _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__.AddMiniApp.RejectedByUser();\n    }\n    throw new Error('Unreachable');\n};\nconst sdk = {\n    ..._sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter,\n    getCapabilities: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.getCapabilities,\n    getChains: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.getChains,\n    isInMiniApp,\n    context: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.context,\n    back: (0,_back_js__WEBPACK_IMPORTED_MODULE_1__.createBack)({ miniAppHost: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost, emitter: _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter }),\n    quickAuth: _quickAuth_js__WEBPACK_IMPORTED_MODULE_4__.quickAuth,\n    actions: {\n        setPrimaryButton: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.setPrimaryButton.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n        ready: async (options = {}) => {\n            return await _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.ready(options);\n        },\n        close: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.close.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n        viewCast: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.viewCast.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n        viewProfile: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.viewProfile.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n        openMiniApp: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.openMiniApp.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n        signIn: async (options) => {\n            const response = await _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.signIn({\n                ...options,\n                acceptAuthAddress: options.acceptAuthAddress ?? true,\n            });\n            if (response.result) {\n                return response.result;\n            }\n            if (response.error.type === 'rejected_by_user') {\n                throw new _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__.SignIn.RejectedByUser();\n            }\n            throw new Error('Unreachable');\n        },\n        openUrl: (urlArg) => {\n            const url = typeof urlArg === 'string' ? urlArg : urlArg.url;\n            return _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.openUrl(url.trim());\n        },\n        addFrame: addMiniApp,\n        addMiniApp,\n        composeCast(options = {}) {\n            return _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.composeCast(options);\n        },\n        viewToken: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.viewToken.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n        sendToken: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.sendToken.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n        swapToken: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.swapToken.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n        requestCameraAndMicrophoneAccess: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.requestCameraAndMicrophoneAccess.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n    },\n    experimental: {\n        getSolanaProvider: _solanaProvider_js__WEBPACK_IMPORTED_MODULE_6__.getSolanaProvider,\n        signManifest: async (options) => {\n            const response = await _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.signManifest(options);\n            if (response.result) {\n                return response.result;\n            }\n            if (response.error.type === 'rejected_by_user') {\n                throw new _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__.SignManifest.RejectedByUser();\n            }\n            if (response.error.type === 'invalid_domain') {\n                throw new _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__.SignManifest.InvalidDomain();\n            }\n            if (response.error.type === 'generic_error') {\n                throw new _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__.SignManifest.GenericError(response.error.message);\n            }\n            throw new Error('Unreachable');\n        },\n        quickAuth(options) {\n            return _quickAuth_js__WEBPACK_IMPORTED_MODULE_4__.quickAuth.getToken(options);\n        },\n    },\n    wallet: {\n        ethProvider: _ethereumProvider_js__WEBPACK_IMPORTED_MODULE_2__.ethereumProvider,\n        getEthereumProvider: _ethereumProvider_js__WEBPACK_IMPORTED_MODULE_2__.getEthereumProvider,\n        getSolanaProvider: _solanaProvider_js__WEBPACK_IMPORTED_MODULE_6__.getSolanaProvider,\n    },\n    haptics: {\n        impactOccurred: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.impactOccurred.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n        notificationOccurred: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.notificationOccurred.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n        selectionChanged: _miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost.selectionChanged.bind(_miniAppHost_js__WEBPACK_IMPORTED_MODULE_3__.miniAppHost),\n    },\n};\n// Required to pass SSR\nif (typeof document !== 'undefined') {\n    // react native webview events\n    document.addEventListener('FarcasterFrameEvent', (event) => {\n        if (event instanceof MessageEvent) {\n            const miniAppEvent = event.data;\n            if (miniAppEvent.event === 'primary_button_clicked') {\n                _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('primaryButtonClicked');\n            }\n            else if (miniAppEvent.event === 'miniapp_added') {\n                _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('miniAppAdded', {\n                    notificationDetails: miniAppEvent.notificationDetails,\n                });\n            }\n            else if (miniAppEvent.event === 'miniapp_add_rejected') {\n                _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('miniAppAddRejected', { reason: miniAppEvent.reason });\n            }\n            else if (miniAppEvent.event === 'miniapp_removed') {\n                _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('miniAppRemoved');\n            }\n            else if (miniAppEvent.event === 'notifications_enabled') {\n                _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('notificationsEnabled', {\n                    notificationDetails: miniAppEvent.notificationDetails,\n                });\n            }\n            else if (miniAppEvent.event === 'notifications_disabled') {\n                _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('notificationsDisabled');\n            }\n            else if (miniAppEvent.event === 'back_navigation_triggered') {\n                _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('backNavigationTriggered');\n            }\n        }\n    });\n}\n// Required to pass SSR\nif (typeof window !== 'undefined') {\n    // web events\n    window.addEventListener('message', (event) => {\n        if (event instanceof MessageEvent) {\n            if (event.data.type === 'frameEvent') {\n                const miniAppEvent = event.data.event;\n                if (miniAppEvent.event === 'primary_button_clicked') {\n                    _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('primaryButtonClicked');\n                }\n                else if (miniAppEvent.event === 'miniapp_added') {\n                    _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('miniAppAdded', {\n                        notificationDetails: miniAppEvent.notificationDetails,\n                    });\n                }\n                else if (miniAppEvent.event === 'miniapp_add_rejected') {\n                    _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('miniAppAddRejected', { reason: miniAppEvent.reason });\n                }\n                else if (miniAppEvent.event === 'miniapp_removed') {\n                    _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('miniAppRemoved');\n                }\n                else if (miniAppEvent.event === 'notifications_enabled') {\n                    _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('notificationsEnabled', {\n                        notificationDetails: miniAppEvent.notificationDetails,\n                    });\n                }\n                else if (miniAppEvent.event === 'notifications_disabled') {\n                    _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('notificationsDisabled');\n                }\n                else if (miniAppEvent.event === 'back_navigation_triggered') {\n                    _sdkEmitter_js__WEBPACK_IMPORTED_MODULE_5__.emitter.emit('backNavigationTriggered');\n                }\n            }\n        }\n    });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3Qvc2RrLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQTRFO0FBQ3JDO0FBQ3VDO0FBQy9CO0FBQ0o7QUFDRDtBQUNjO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHdEQUFXO0FBQ25CO0FBQ0EseURBQXlEO0FBQ3pELFNBQVM7QUFDVDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQix3REFBVztBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixxRkFBZ0M7QUFDbEQ7QUFDQTtBQUNBLGtCQUFrQiw4RUFBeUI7QUFDM0M7QUFDQTtBQUNBO0FBQ087QUFDUCxPQUFPLG1EQUFPO0FBQ2QscUJBQXFCLHdEQUFXO0FBQ2hDLGVBQWUsd0RBQVc7QUFDMUI7QUFDQSxhQUFhLHdEQUFXO0FBQ3hCLFVBQVUsb0RBQVUsR0FBRyxXQUFXLG1FQUFTLHVEQUFFO0FBQzdDLGFBQWE7QUFDYjtBQUNBLDBCQUEwQix3REFBVyx1QkFBdUIsd0RBQVc7QUFDdkUsa0NBQWtDO0FBQ2xDLHlCQUF5Qix3REFBVztBQUNwQyxTQUFTO0FBQ1QsZUFBZSx3REFBVyxZQUFZLHdEQUFXO0FBQ2pELGtCQUFrQix3REFBVyxlQUFlLHdEQUFXO0FBQ3ZELHFCQUFxQix3REFBVyxrQkFBa0Isd0RBQVc7QUFDN0QscUJBQXFCLHdEQUFXLGtCQUFrQix3REFBVztBQUM3RDtBQUNBLG1DQUFtQyx3REFBVztBQUM5QztBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLDBFQUFxQjtBQUMvQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxtQkFBbUIsd0RBQVc7QUFDOUIsU0FBUztBQUNUO0FBQ0E7QUFDQSxnQ0FBZ0M7QUFDaEMsbUJBQW1CLHdEQUFXO0FBQzlCLFNBQVM7QUFDVCxtQkFBbUIsd0RBQVcsZ0JBQWdCLHdEQUFXO0FBQ3pELG1CQUFtQix3REFBVyxnQkFBZ0Isd0RBQVc7QUFDekQsbUJBQW1CLHdEQUFXLGdCQUFnQix3REFBVztBQUN6RCwwQ0FBMEMsd0RBQVcsdUNBQXVDLHdEQUFXO0FBQ3ZHLEtBQUs7QUFDTDtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLG1DQUFtQyx3REFBVztBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixnRkFBMkI7QUFDckQ7QUFDQTtBQUNBLDBCQUEwQiwrRUFBMEI7QUFDcEQ7QUFDQTtBQUNBLDBCQUEwQiw4RUFBeUI7QUFDbkQ7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLG1CQUFtQixvREFBUztBQUM1QixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0EscUJBQXFCLGtFQUFnQjtBQUNyQywyQkFBMkI7QUFDM0IseUJBQXlCO0FBQ3pCLEtBQUs7QUFDTDtBQUNBLHdCQUF3Qix3REFBVyxxQkFBcUIsd0RBQVc7QUFDbkUsOEJBQThCLHdEQUFXLDJCQUEyQix3REFBVztBQUMvRSwwQkFBMEIsd0RBQVcsdUJBQXVCLHdEQUFXO0FBQ3ZFLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG1EQUFPO0FBQ3ZCO0FBQ0E7QUFDQSxnQkFBZ0IsbURBQU87QUFDdkI7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGdCQUFnQixtREFBTyw4QkFBOEIsNkJBQTZCO0FBQ2xGO0FBQ0E7QUFDQSxnQkFBZ0IsbURBQU87QUFDdkI7QUFDQTtBQUNBLGdCQUFnQixtREFBTztBQUN2QjtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsZ0JBQWdCLG1EQUFPO0FBQ3ZCO0FBQ0E7QUFDQSxnQkFBZ0IsbURBQU87QUFDdkI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsbURBQU87QUFDM0I7QUFDQTtBQUNBLG9CQUFvQixtREFBTztBQUMzQjtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0Esb0JBQW9CLG1EQUFPLDhCQUE4Qiw2QkFBNkI7QUFDdEY7QUFDQTtBQUNBLG9CQUFvQixtREFBTztBQUMzQjtBQUNBO0FBQ0Esb0JBQW9CLG1EQUFPO0FBQzNCO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxvQkFBb0IsbURBQU87QUFDM0I7QUFDQTtBQUNBLG9CQUFvQixtREFBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLXNkay9kaXN0L3Nkay5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZGRNaW5pQXBwLCBTaWduSW4sIFNpZ25NYW5pZmVzdCwgfSBmcm9tICdAZmFyY2FzdGVyL21pbmlhcHAtY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVCYWNrIH0gZnJvbSBcIi4vYmFjay5qc1wiO1xuaW1wb3J0IHsgZXRoZXJldW1Qcm92aWRlciwgZ2V0RXRoZXJldW1Qcm92aWRlciB9IGZyb20gXCIuL2V0aGVyZXVtUHJvdmlkZXIuanNcIjtcbmltcG9ydCB7IG1pbmlBcHBIb3N0IH0gZnJvbSBcIi4vbWluaUFwcEhvc3QuanNcIjtcbmltcG9ydCB7IHF1aWNrQXV0aCB9IGZyb20gXCIuL3F1aWNrQXV0aC5qc1wiO1xuaW1wb3J0IHsgZW1pdHRlciB9IGZyb20gXCIuL3Nka0VtaXR0ZXIuanNcIjtcbmltcG9ydCB7IGdldFNvbGFuYVByb3ZpZGVyIH0gZnJvbSBcIi4vc29sYW5hUHJvdmlkZXIuanNcIjtcbmxldCBjYWNoZWRJc0luTWluaUFwcFJlc3VsdCA9IG51bGw7XG4vKipcbiAqIERldGVybWluZXMgaWYgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaXMgYSBNaW5pQXBwIGNvbnRleHQuXG4gKlxuICogQHBhcmFtIHRpbWVvdXRNcyAtIE9wdGlvbmFsIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIChkZWZhdWx0OiAxMDAwKVxuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGluIE1pbmlBcHAgY29udGV4dFxuICovXG5hc3luYyBmdW5jdGlvbiBpc0luTWluaUFwcCh0aW1lb3V0TXMgPSAxMDAwKSB7XG4gICAgLy8gUmV0dXJuIGNhY2hlZCByZXN1bHQgaWYgd2UndmUgYWxyZWFkeSBkZXRlcm1pbmVkIHdlIGFyZSBpbiBhIE1pbmlBcHBcbiAgICBpZiAoY2FjaGVkSXNJbk1pbmlBcHBSZXN1bHQgPT09IHRydWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vIENoZWNrIGZvciBTU1IgZW52aXJvbm1lbnQgLSBkZWZpbml0ZWx5IG5vdCBhIE1pbmlBcHBcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBTaG9ydC1jaXJjdWl0OiBkZWZpbml0ZWx5IE5PVCBhIE1pbmlBcHBcbiAgICBpZiAoIXdpbmRvdy5SZWFjdE5hdGl2ZVdlYlZpZXcgJiYgd2luZG93ID09PSB3aW5kb3cucGFyZW50KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgTUlHSFQgYmUgaW4gYSBNaW5pQXBwIChpZnJhbWUgb3IgUk4gV2ViVmlldylcbiAgICAvLyBidXQgbmVlZCB0byB2ZXJpZnkgYnkgY2hlY2tpbmcgZm9yIGNvbnRleHQgY29tbXVuaWNhdGlvbi5cbiAgICBjb25zdCBpc0luTWluaUFwcCA9IGF3YWl0IFByb21pc2UucmFjZShbXG4gICAgICAgIG1pbmlBcHBIb3N0LmNvbnRleHQudGhlbigoY29udGV4dCkgPT4gISFjb250ZXh0KSwgLy8gQ2hlY2sgaWYgY29udGV4dCByZXNvbHZlcyB0byB0cnV0aHlcbiAgICAgICAgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZShmYWxzZSksIHRpbWVvdXRNcyk7IC8vIFRpbWVvdXQgcmVzb2x2ZXMgdG8gZmFsc2VcbiAgICAgICAgfSksXG4gICAgXSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSk7XG4gICAgLy8gQ2FjaGUgdGhlIHJlc3VsdCBPTkxZIGlmIHRydWUgKHdlIGFyZSBjb25maXJtZWQgdG8gYmUgaW4gYSBNaW5pQXBwKVxuICAgIGlmIChpc0luTWluaUFwcCkge1xuICAgICAgICBjYWNoZWRJc0luTWluaUFwcFJlc3VsdCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luTWluaUFwcDtcbn1cbmNvbnN0IGFkZE1pbmlBcHAgPSBhc3luYyAoKSA9PiB7XG4gICAgLy8gVXNlIHRoZSBleGlzdGluZyBtZXNzYWdlIG92ZXJjb21saW5rIGZvciBiYWNrd2FyZHMgY29tcGF0IHVudGlsXG4gICAgLy8gaG9zdHMgYXJlIGFsbCB1cGdyYWRlZC5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG1pbmlBcHBIb3N0LmFkZEZyYW1lKCk7XG4gICAgaWYgKHJlc3BvbnNlLnJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0O1xuICAgIH1cbiAgICBpZiAocmVzcG9uc2UuZXJyb3IudHlwZSA9PT0gJ2ludmFsaWRfZG9tYWluX21hbmlmZXN0Jykge1xuICAgICAgICB0aHJvdyBuZXcgQWRkTWluaUFwcC5JbnZhbGlkRG9tYWluTWFuaWZlc3QoKTtcbiAgICB9XG4gICAgaWYgKHJlc3BvbnNlLmVycm9yLnR5cGUgPT09ICdyZWplY3RlZF9ieV91c2VyJykge1xuICAgICAgICB0aHJvdyBuZXcgQWRkTWluaUFwcC5SZWplY3RlZEJ5VXNlcigpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1VucmVhY2hhYmxlJyk7XG59O1xuZXhwb3J0IGNvbnN0IHNkayA9IHtcbiAgICAuLi5lbWl0dGVyLFxuICAgIGdldENhcGFiaWxpdGllczogbWluaUFwcEhvc3QuZ2V0Q2FwYWJpbGl0aWVzLFxuICAgIGdldENoYWluczogbWluaUFwcEhvc3QuZ2V0Q2hhaW5zLFxuICAgIGlzSW5NaW5pQXBwLFxuICAgIGNvbnRleHQ6IG1pbmlBcHBIb3N0LmNvbnRleHQsXG4gICAgYmFjazogY3JlYXRlQmFjayh7IG1pbmlBcHBIb3N0LCBlbWl0dGVyIH0pLFxuICAgIHF1aWNrQXV0aCxcbiAgICBhY3Rpb25zOiB7XG4gICAgICAgIHNldFByaW1hcnlCdXR0b246IG1pbmlBcHBIb3N0LnNldFByaW1hcnlCdXR0b24uYmluZChtaW5pQXBwSG9zdCksXG4gICAgICAgIHJlYWR5OiBhc3luYyAob3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYXdhaXQgbWluaUFwcEhvc3QucmVhZHkob3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsb3NlOiBtaW5pQXBwSG9zdC5jbG9zZS5iaW5kKG1pbmlBcHBIb3N0KSxcbiAgICAgICAgdmlld0Nhc3Q6IG1pbmlBcHBIb3N0LnZpZXdDYXN0LmJpbmQobWluaUFwcEhvc3QpLFxuICAgICAgICB2aWV3UHJvZmlsZTogbWluaUFwcEhvc3Qudmlld1Byb2ZpbGUuYmluZChtaW5pQXBwSG9zdCksXG4gICAgICAgIG9wZW5NaW5pQXBwOiBtaW5pQXBwSG9zdC5vcGVuTWluaUFwcC5iaW5kKG1pbmlBcHBIb3N0KSxcbiAgICAgICAgc2lnbkluOiBhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBtaW5pQXBwSG9zdC5zaWduSW4oe1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgYWNjZXB0QXV0aEFkZHJlc3M6IG9wdGlvbnMuYWNjZXB0QXV0aEFkZHJlc3MgPz8gdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IudHlwZSA9PT0gJ3JlamVjdGVkX2J5X3VzZXInKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNpZ25Jbi5SZWplY3RlZEJ5VXNlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlYWNoYWJsZScpO1xuICAgICAgICB9LFxuICAgICAgICBvcGVuVXJsOiAodXJsQXJnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSB0eXBlb2YgdXJsQXJnID09PSAnc3RyaW5nJyA/IHVybEFyZyA6IHVybEFyZy51cmw7XG4gICAgICAgICAgICByZXR1cm4gbWluaUFwcEhvc3Qub3BlblVybCh1cmwudHJpbSgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWRkRnJhbWU6IGFkZE1pbmlBcHAsXG4gICAgICAgIGFkZE1pbmlBcHAsXG4gICAgICAgIGNvbXBvc2VDYXN0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbmlBcHBIb3N0LmNvbXBvc2VDYXN0KG9wdGlvbnMpO1xuICAgICAgICB9LFxuICAgICAgICB2aWV3VG9rZW46IG1pbmlBcHBIb3N0LnZpZXdUb2tlbi5iaW5kKG1pbmlBcHBIb3N0KSxcbiAgICAgICAgc2VuZFRva2VuOiBtaW5pQXBwSG9zdC5zZW5kVG9rZW4uYmluZChtaW5pQXBwSG9zdCksXG4gICAgICAgIHN3YXBUb2tlbjogbWluaUFwcEhvc3Quc3dhcFRva2VuLmJpbmQobWluaUFwcEhvc3QpLFxuICAgICAgICByZXF1ZXN0Q2FtZXJhQW5kTWljcm9waG9uZUFjY2VzczogbWluaUFwcEhvc3QucmVxdWVzdENhbWVyYUFuZE1pY3JvcGhvbmVBY2Nlc3MuYmluZChtaW5pQXBwSG9zdCksXG4gICAgfSxcbiAgICBleHBlcmltZW50YWw6IHtcbiAgICAgICAgZ2V0U29sYW5hUHJvdmlkZXIsXG4gICAgICAgIHNpZ25NYW5pZmVzdDogYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgbWluaUFwcEhvc3Quc2lnbk1hbmlmZXN0KG9wdGlvbnMpO1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3IudHlwZSA9PT0gJ3JlamVjdGVkX2J5X3VzZXInKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNpZ25NYW5pZmVzdC5SZWplY3RlZEJ5VXNlcigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yLnR5cGUgPT09ICdpbnZhbGlkX2RvbWFpbicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2lnbk1hbmlmZXN0LkludmFsaWREb21haW4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvci50eXBlID09PSAnZ2VuZXJpY19lcnJvcicpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2lnbk1hbmlmZXN0LkdlbmVyaWNFcnJvcihyZXNwb25zZS5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5yZWFjaGFibGUnKTtcbiAgICAgICAgfSxcbiAgICAgICAgcXVpY2tBdXRoKG9wdGlvbnMpIHtcbiAgICAgICAgICAgIHJldHVybiBxdWlja0F1dGguZ2V0VG9rZW4ob3B0aW9ucyk7XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB3YWxsZXQ6IHtcbiAgICAgICAgZXRoUHJvdmlkZXI6IGV0aGVyZXVtUHJvdmlkZXIsXG4gICAgICAgIGdldEV0aGVyZXVtUHJvdmlkZXIsXG4gICAgICAgIGdldFNvbGFuYVByb3ZpZGVyLFxuICAgIH0sXG4gICAgaGFwdGljczoge1xuICAgICAgICBpbXBhY3RPY2N1cnJlZDogbWluaUFwcEhvc3QuaW1wYWN0T2NjdXJyZWQuYmluZChtaW5pQXBwSG9zdCksXG4gICAgICAgIG5vdGlmaWNhdGlvbk9jY3VycmVkOiBtaW5pQXBwSG9zdC5ub3RpZmljYXRpb25PY2N1cnJlZC5iaW5kKG1pbmlBcHBIb3N0KSxcbiAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogbWluaUFwcEhvc3Quc2VsZWN0aW9uQ2hhbmdlZC5iaW5kKG1pbmlBcHBIb3N0KSxcbiAgICB9LFxufTtcbi8vIFJlcXVpcmVkIHRvIHBhc3MgU1NSXG5pZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgIC8vIHJlYWN0IG5hdGl2ZSB3ZWJ2aWV3IGV2ZW50c1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0ZhcmNhc3RlckZyYW1lRXZlbnQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTWVzc2FnZUV2ZW50KSB7XG4gICAgICAgICAgICBjb25zdCBtaW5pQXBwRXZlbnQgPSBldmVudC5kYXRhO1xuICAgICAgICAgICAgaWYgKG1pbmlBcHBFdmVudC5ldmVudCA9PT0gJ3ByaW1hcnlfYnV0dG9uX2NsaWNrZWQnKSB7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KCdwcmltYXJ5QnV0dG9uQ2xpY2tlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWluaUFwcEV2ZW50LmV2ZW50ID09PSAnbWluaWFwcF9hZGRlZCcpIHtcbiAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoJ21pbmlBcHBBZGRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRGV0YWlsczogbWluaUFwcEV2ZW50Lm5vdGlmaWNhdGlvbkRldGFpbHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChtaW5pQXBwRXZlbnQuZXZlbnQgPT09ICdtaW5pYXBwX2FkZF9yZWplY3RlZCcpIHtcbiAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoJ21pbmlBcHBBZGRSZWplY3RlZCcsIHsgcmVhc29uOiBtaW5pQXBwRXZlbnQucmVhc29uIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWluaUFwcEV2ZW50LmV2ZW50ID09PSAnbWluaWFwcF9yZW1vdmVkJykge1xuICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdCgnbWluaUFwcFJlbW92ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1pbmlBcHBFdmVudC5ldmVudCA9PT0gJ25vdGlmaWNhdGlvbnNfZW5hYmxlZCcpIHtcbiAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoJ25vdGlmaWNhdGlvbnNFbmFibGVkJywge1xuICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25EZXRhaWxzOiBtaW5pQXBwRXZlbnQubm90aWZpY2F0aW9uRGV0YWlscyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1pbmlBcHBFdmVudC5ldmVudCA9PT0gJ25vdGlmaWNhdGlvbnNfZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KCdub3RpZmljYXRpb25zRGlzYWJsZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG1pbmlBcHBFdmVudC5ldmVudCA9PT0gJ2JhY2tfbmF2aWdhdGlvbl90cmlnZ2VyZWQnKSB7XG4gICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KCdiYWNrTmF2aWdhdGlvblRyaWdnZXJlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG4vLyBSZXF1aXJlZCB0byBwYXNzIFNTUlxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gd2ViIGV2ZW50c1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE1lc3NhZ2VFdmVudCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEudHlwZSA9PT0gJ2ZyYW1lRXZlbnQnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWluaUFwcEV2ZW50ID0gZXZlbnQuZGF0YS5ldmVudDtcbiAgICAgICAgICAgICAgICBpZiAobWluaUFwcEV2ZW50LmV2ZW50ID09PSAncHJpbWFyeV9idXR0b25fY2xpY2tlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KCdwcmltYXJ5QnV0dG9uQ2xpY2tlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtaW5pQXBwRXZlbnQuZXZlbnQgPT09ICdtaW5pYXBwX2FkZGVkJykge1xuICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmVtaXQoJ21pbmlBcHBBZGRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkRldGFpbHM6IG1pbmlBcHBFdmVudC5ub3RpZmljYXRpb25EZXRhaWxzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobWluaUFwcEV2ZW50LmV2ZW50ID09PSAnbWluaWFwcF9hZGRfcmVqZWN0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdCgnbWluaUFwcEFkZFJlamVjdGVkJywgeyByZWFzb246IG1pbmlBcHBFdmVudC5yZWFzb24gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1pbmlBcHBFdmVudC5ldmVudCA9PT0gJ21pbmlhcHBfcmVtb3ZlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdHRlci5lbWl0KCdtaW5pQXBwUmVtb3ZlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChtaW5pQXBwRXZlbnQuZXZlbnQgPT09ICdub3RpZmljYXRpb25zX2VuYWJsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdCgnbm90aWZpY2F0aW9uc0VuYWJsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25EZXRhaWxzOiBtaW5pQXBwRXZlbnQubm90aWZpY2F0aW9uRGV0YWlscyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1pbmlBcHBFdmVudC5ldmVudCA9PT0gJ25vdGlmaWNhdGlvbnNfZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdCgnbm90aWZpY2F0aW9uc0Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1pbmlBcHBFdmVudC5ldmVudCA9PT0gJ2JhY2tfbmF2aWdhdGlvbl90cmlnZ2VyZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuZW1pdCgnYmFja05hdmlnYXRpb25UcmlnZ2VyZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/sdk.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/sdkEmitter.js":
/*!****************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/dist/sdkEmitter.js ***!
  \****************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   createEmitter: () => (/* binding */ createEmitter),\n/* harmony export */   emitter: () => (/* binding */ emitter)\n/* harmony export */ });\n/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventemitter3 */ \"(app-pages-browser)/./node_modules/eventemitter3/index.mjs\");\n\nfunction createEmitter() {\n    const emitter = new eventemitter3__WEBPACK_IMPORTED_MODULE_0__[\"default\"]();\n    return {\n        get eventNames() {\n            return emitter.eventNames.bind(emitter);\n        },\n        get listenerCount() {\n            return emitter.listenerCount.bind(emitter);\n        },\n        get listeners() {\n            return emitter.listeners.bind(emitter);\n        },\n        addListener: emitter.addListener.bind(emitter),\n        emit: emitter.emit.bind(emitter),\n        off: emitter.off.bind(emitter),\n        on: emitter.on.bind(emitter),\n        once: emitter.once.bind(emitter),\n        removeAllListeners: emitter.removeAllListeners.bind(emitter),\n        removeListener: emitter.removeListener.bind(emitter),\n    };\n}\nconst emitter = createEmitter();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3Qvc2RrRW1pdHRlci5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBeUM7QUFDbEM7QUFDUCx3QkFBd0IscURBQVk7QUFDcEM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3Qvc2RrRW1pdHRlci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVtaXR0ZXIoKSB7XG4gICAgY29uc3QgZW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgZXZlbnROYW1lcygpIHtcbiAgICAgICAgICAgIHJldHVybiBlbWl0dGVyLmV2ZW50TmFtZXMuYmluZChlbWl0dGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGxpc3RlbmVyQ291bnQoKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50LmJpbmQoZW1pdHRlcik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBsaXN0ZW5lcnMoKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1pdHRlci5saXN0ZW5lcnMuYmluZChlbWl0dGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWRkTGlzdGVuZXI6IGVtaXR0ZXIuYWRkTGlzdGVuZXIuYmluZChlbWl0dGVyKSxcbiAgICAgICAgZW1pdDogZW1pdHRlci5lbWl0LmJpbmQoZW1pdHRlciksXG4gICAgICAgIG9mZjogZW1pdHRlci5vZmYuYmluZChlbWl0dGVyKSxcbiAgICAgICAgb246IGVtaXR0ZXIub24uYmluZChlbWl0dGVyKSxcbiAgICAgICAgb25jZTogZW1pdHRlci5vbmNlLmJpbmQoZW1pdHRlciksXG4gICAgICAgIHJlbW92ZUFsbExpc3RlbmVyczogZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMuYmluZChlbWl0dGVyKSxcbiAgICAgICAgcmVtb3ZlTGlzdGVuZXI6IGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIuYmluZChlbWl0dGVyKSxcbiAgICB9O1xufVxuZXhwb3J0IGNvbnN0IGVtaXR0ZXIgPSBjcmVhdGVFbWl0dGVyKCk7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/sdkEmitter.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/solanaProvider.js":
/*!********************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/dist/solanaProvider.js ***!
  \********************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getSolanaProvider: () => (/* binding */ getSolanaProvider)\n/* harmony export */ });\n/* harmony import */ var _farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @farcaster/miniapp-core */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-core/esm/index.js\");\n/* harmony import */ var _miniAppHost_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./miniAppHost.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/miniAppHost.js\");\n\n\nconst { solanaProviderRequest } = _miniAppHost_js__WEBPACK_IMPORTED_MODULE_1__.miniAppHost;\nlet solanaProvider;\nif (solanaProviderRequest) {\n    solanaProvider = (0,_farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__.createSolanaWalletProvider)((0,_farcaster_miniapp_core__WEBPACK_IMPORTED_MODULE_0__.unwrapSolanaProviderRequest)(solanaProviderRequest));\n}\nasync function getSolanaProvider() {\n    let capabilities;\n    try {\n        capabilities = await _miniAppHost_js__WEBPACK_IMPORTED_MODULE_1__.miniAppHost.getCapabilities();\n    }\n    catch { }\n    if (!capabilities?.includes('wallet.getSolanaProvider')) {\n        return undefined;\n    }\n    return solanaProvider;\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL2Rpc3Qvc29sYW5hUHJvdmlkZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQW1HO0FBQ3BEO0FBQy9DLFFBQVEsd0JBQXdCLEVBQUUsd0RBQVc7QUFDN0M7QUFDQTtBQUNBLHFCQUFxQixtRkFBMEIsQ0FBQyxvRkFBMkI7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsd0RBQVc7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDNkIiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLXNkay9kaXN0L3NvbGFuYVByb3ZpZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZVNvbGFuYVdhbGxldFByb3ZpZGVyLCB1bndyYXBTb2xhbmFQcm92aWRlclJlcXVlc3QsIH0gZnJvbSAnQGZhcmNhc3Rlci9taW5pYXBwLWNvcmUnO1xuaW1wb3J0IHsgbWluaUFwcEhvc3QgfSBmcm9tIFwiLi9taW5pQXBwSG9zdC5qc1wiO1xuY29uc3QgeyBzb2xhbmFQcm92aWRlclJlcXVlc3QgfSA9IG1pbmlBcHBIb3N0O1xubGV0IHNvbGFuYVByb3ZpZGVyO1xuaWYgKHNvbGFuYVByb3ZpZGVyUmVxdWVzdCkge1xuICAgIHNvbGFuYVByb3ZpZGVyID0gY3JlYXRlU29sYW5hV2FsbGV0UHJvdmlkZXIodW53cmFwU29sYW5hUHJvdmlkZXJSZXF1ZXN0KHNvbGFuYVByb3ZpZGVyUmVxdWVzdCkpO1xufVxuYXN5bmMgZnVuY3Rpb24gZ2V0U29sYW5hUHJvdmlkZXIoKSB7XG4gICAgbGV0IGNhcGFiaWxpdGllcztcbiAgICB0cnkge1xuICAgICAgICBjYXBhYmlsaXRpZXMgPSBhd2FpdCBtaW5pQXBwSG9zdC5nZXRDYXBhYmlsaXRpZXMoKTtcbiAgICB9XG4gICAgY2F0Y2ggeyB9XG4gICAgaWYgKCFjYXBhYmlsaXRpZXM/LmluY2x1ZGVzKCd3YWxsZXQuZ2V0U29sYW5hUHJvdmlkZXInKSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gc29sYW5hUHJvdmlkZXI7XG59XG5leHBvcnQgeyBnZXRTb2xhbmFQcm92aWRlciB9O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/solanaProvider.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/actions/nonce.js":
/*!******************************************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/actions/nonce.js ***!
  \******************************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   generateNonce: () => (/* binding */ generateNonce)\n/* harmony export */ });\n/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../errors.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/errors.js\");\n\nasync function generateNonce({ origin }) {\n    const response = await fetch(`${origin}/nonce`, {\n        method: 'POST',\n    });\n    if (!response.ok) {\n        throw new _errors_js__WEBPACK_IMPORTED_MODULE_0__.ResponseError({ status: response.status });\n    }\n    return await response.json();\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL3F1aWNrLWF1dGgvZGlzdC9hY3Rpb25zL25vbmNlLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQTZDO0FBQ3RDLCtCQUErQixRQUFRO0FBQzlDLG9DQUFvQyxPQUFPO0FBQzNDO0FBQ0EsS0FBSztBQUNMO0FBQ0Esa0JBQWtCLHFEQUFhLEdBQUcseUJBQXlCO0FBQzNEO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL3F1aWNrLWF1dGgvZGlzdC9hY3Rpb25zL25vbmNlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc3BvbnNlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVOb25jZSh7IG9yaWdpbiB9KSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtvcmlnaW59L25vbmNlYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXNwb25zZUVycm9yKHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMgfSk7XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCByZXNwb25zZS5qc29uKCk7XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/actions/nonce.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/actions/verifySiwf.js":
/*!***********************************************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/actions/verifySiwf.js ***!
  \***********************************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   verifySiwf: () => (/* binding */ verifySiwf)\n/* harmony export */ });\n/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../errors.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/errors.js\");\n\nasync function verifySiwf({ origin }, options) {\n    const response = await fetch(`${origin}/verify-siwf`, {\n        method: 'POST',\n        headers: new Headers({ 'Content-Type': 'application/json' }),\n        body: JSON.stringify(options)\n    });\n    if (!response.ok) {\n        throw new _errors_js__WEBPACK_IMPORTED_MODULE_0__.ResponseError({ status: response.status });\n    }\n    const data = await response.json();\n    if (data.valid === false) {\n        throw new _errors_js__WEBPACK_IMPORTED_MODULE_0__.InvalidSiwfError(data.message ?? 'unknown');\n    }\n    return { token: data.token };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL3F1aWNrLWF1dGgvZGlzdC9hY3Rpb25zL3ZlcmlmeVNpd2YuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBK0Q7QUFDeEQsNEJBQTRCLFFBQVE7QUFDM0Msb0NBQW9DLE9BQU87QUFDM0M7QUFDQSwrQkFBK0Isb0NBQW9DO0FBQ25FO0FBQ0EsS0FBSztBQUNMO0FBQ0Esa0JBQWtCLHFEQUFhLEdBQUcseUJBQXlCO0FBQzNEO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQix3REFBZ0I7QUFDbEM7QUFDQSxhQUFhO0FBQ2IiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLXNkay9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9xdWljay1hdXRoL2Rpc3QvYWN0aW9ucy92ZXJpZnlTaXdmLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEludmFsaWRTaXdmRXJyb3IsIFJlc3BvbnNlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U2l3Zih7IG9yaWdpbiB9LCBvcHRpb25zKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtvcmlnaW59L3ZlcmlmeS1zaXdmYCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogbmV3IEhlYWRlcnMoeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pLFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShvcHRpb25zKVxuICAgIH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlRXJyb3IoeyBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyB9KTtcbiAgICB9XG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICBpZiAoZGF0YS52YWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRTaXdmRXJyb3IoZGF0YS5tZXNzYWdlID8/ICd1bmtub3duJyk7XG4gICAgfVxuICAgIHJldHVybiB7IHRva2VuOiBkYXRhLnRva2VuIH07XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/actions/verifySiwf.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/config.js":
/*!***********************************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/config.js ***!
  \***********************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   createConfig: () => (/* binding */ createConfig)\n/* harmony export */ });\nfunction createConfig(options = {}) {\n    return {\n        origin: options.origin ?? 'https://auth.farcaster.xyz'\n    };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL3F1aWNrLWF1dGgvZGlzdC9jb25maWcuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFPLGtDQUFrQztBQUN6QztBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL3F1aWNrLWF1dGgvZGlzdC9jb25maWcuanMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbmZpZyhvcHRpb25zID0ge30pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBvcmlnaW46IG9wdGlvbnMub3JpZ2luID8/ICdodHRwczovL2F1dGguZmFyY2FzdGVyLnh5eidcbiAgICB9O1xufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/config.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/decodeJwt.js":
/*!**************************************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/decodeJwt.js ***!
  \**************************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   decodeJwt: () => (/* binding */ decodeJwt)\n/* harmony export */ });\n/* harmony import */ var jose_jwt_decode__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! jose/jwt/decode */ \"(app-pages-browser)/./node_modules/jose/dist/browser/util/decode_jwt.js\");\n\n/**\n * Returns the JWT payload without verifying it.\n *\n * This function is exported (as a named export) from the main `'quick-auth'` module\n * entry point as well as from its subpath export `'quick-auth/decodeJwt'`.\n */\nfunction decodeJwt(token) {\n    return (0,jose_jwt_decode__WEBPACK_IMPORTED_MODULE_0__.decodeJwt)(token);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL3F1aWNrLWF1dGgvZGlzdC9kZWNvZGVKd3QuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBNkQ7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxXQUFXLDBEQUFhO0FBQ3hCIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1zZGsvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvcXVpY2stYXV0aC9kaXN0L2RlY29kZUp3dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWNvZGVKd3QgYXMgam9zZURlY29kZUp3dCB9IGZyb20gXCJqb3NlL2p3dC9kZWNvZGVcIjtcbi8qKlxuICogUmV0dXJucyB0aGUgSldUIHBheWxvYWQgd2l0aG91dCB2ZXJpZnlpbmcgaXQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRlZCAoYXMgYSBuYW1lZCBleHBvcnQpIGZyb20gdGhlIG1haW4gYCdxdWljay1hdXRoJ2AgbW9kdWxlXG4gKiBlbnRyeSBwb2ludCBhcyB3ZWxsIGFzIGZyb20gaXRzIHN1YnBhdGggZXhwb3J0IGAncXVpY2stYXV0aC9kZWNvZGVKd3QnYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUp3dCh0b2tlbikge1xuICAgIHJldHVybiBqb3NlRGVjb2RlSnd0KHRva2VuKTtcbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/decodeJwt.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/errors.js":
/*!***********************************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/errors.js ***!
  \***********************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   BaseError: () => (/* binding */ BaseError),\n/* harmony export */   InvalidParametersError: () => (/* binding */ InvalidParametersError),\n/* harmony export */   InvalidSiwfError: () => (/* binding */ InvalidSiwfError),\n/* harmony export */   InvalidTokenError: () => (/* binding */ InvalidTokenError),\n/* harmony export */   ResponseError: () => (/* binding */ ResponseError)\n/* harmony export */ });\nclass BaseError extends Error {\n    constructor(shortMessage, options = {}) {\n        const details = (() => {\n            if (options.cause instanceof BaseError) {\n                if (options.cause.details)\n                    return options.cause.details;\n                if (options.cause.shortMessage)\n                    return options.cause.shortMessage;\n            }\n            if (options.cause &&\n                'details' in options.cause &&\n                typeof options.cause.details === 'string')\n                return options.cause.details;\n            if (options.cause?.message)\n                return options.cause.message;\n            return options.details;\n        })();\n        const message = [\n            shortMessage || 'An error occurred.',\n            ...(options.metaMessages ? ['', ...options.metaMessages] : []),\n            ...(details\n                ? [\n                    '',\n                    details ? `Details: ${details}` : undefined,\n                ]\n                : []),\n        ]\n            .filter((x) => typeof x === 'string')\n            .join('\\n');\n        super(message, options.cause ? { cause: options.cause } : undefined);\n        this.name = 'BaseError';\n        this.cause = options.cause;\n        this.details = details;\n        this.shortMessage = shortMessage;\n    }\n}\nclass ResponseError extends BaseError {\n    constructor({ status }) {\n        super(`Request failed with status ${status}`);\n        this.name = 'RequestFailedError';\n    }\n}\nclass InvalidSiwfError extends BaseError {\n    constructor(message) {\n        super(message);\n        this.name = 'InvalidToken';\n    }\n}\nclass InvalidTokenError extends BaseError {\n    constructor(message) {\n        super(message);\n        this.name = 'InvalidToken';\n    }\n}\nclass InvalidParametersError extends BaseError {\n    constructor(message) {\n        super(message);\n        this.name = 'InvalidParameters';\n    }\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL3F1aWNrLWF1dGgvZGlzdC9lcnJvcnMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBTztBQUNQLDBDQUEwQztBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxRQUFRO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsdUJBQXVCO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asa0JBQWtCLFFBQVE7QUFDMUIsNENBQTRDLE9BQU87QUFDbkQ7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvbWluaWFwcC1zZGsvbm9kZV9tb2R1bGVzL0BmYXJjYXN0ZXIvcXVpY2stYXV0aC9kaXN0L2Vycm9ycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgQmFzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHNob3J0TWVzc2FnZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2F1c2UgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jYXVzZS5kZXRhaWxzKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jYXVzZS5kZXRhaWxzO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNhdXNlLnNob3J0TWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY2F1c2Uuc2hvcnRNZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2F1c2UgJiZcbiAgICAgICAgICAgICAgICAnZGV0YWlscycgaW4gb3B0aW9ucy5jYXVzZSAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiBvcHRpb25zLmNhdXNlLmRldGFpbHMgPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmNhdXNlLmRldGFpbHM7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jYXVzZT8ubWVzc2FnZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jYXVzZS5tZXNzYWdlO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZGV0YWlscztcbiAgICAgICAgfSkoKTtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IFtcbiAgICAgICAgICAgIHNob3J0TWVzc2FnZSB8fCAnQW4gZXJyb3Igb2NjdXJyZWQuJyxcbiAgICAgICAgICAgIC4uLihvcHRpb25zLm1ldGFNZXNzYWdlcyA/IFsnJywgLi4ub3B0aW9ucy5tZXRhTWVzc2FnZXNdIDogW10pLFxuICAgICAgICAgICAgLi4uKGRldGFpbHNcbiAgICAgICAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbHMgPyBgRGV0YWlsczogJHtkZXRhaWxzfWAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIDogW10pLFxuICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiB0eXBlb2YgeCA9PT0gJ3N0cmluZycpXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMuY2F1c2UgPyB7IGNhdXNlOiBvcHRpb25zLmNhdXNlIH0gOiB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLm5hbWUgPSAnQmFzZUVycm9yJztcbiAgICAgICAgdGhpcy5jYXVzZSA9IG9wdGlvbnMuY2F1c2U7XG4gICAgICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7XG4gICAgICAgIHRoaXMuc2hvcnRNZXNzYWdlID0gc2hvcnRNZXNzYWdlO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7IHN0YXR1cyB9KSB7XG4gICAgICAgIHN1cGVyKGBSZXF1ZXN0IGZhaWxlZCB3aXRoIHN0YXR1cyAke3N0YXR1c31gKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ1JlcXVlc3RGYWlsZWRFcnJvcic7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEludmFsaWRTaXdmRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkVG9rZW4nO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBJbnZhbGlkVG9rZW5FcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5uYW1lID0gJ0ludmFsaWRUb2tlbic7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIEludmFsaWRQYXJhbWV0ZXJzRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9ICdJbnZhbGlkUGFyYW1ldGVycyc7XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/errors.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/lightClient.js":
/*!****************************************************************************************************!*\
  !*** ./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/lightClient.js ***!
  \****************************************************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   createLightClient: () => (/* binding */ createLightClient)\n/* harmony export */ });\n/* harmony import */ var _actions_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./actions/index.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/actions/nonce.js\");\n/* harmony import */ var _actions_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./actions/index.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/actions/verifySiwf.js\");\n/* harmony import */ var _config_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./config.js */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/config.js\");\n\n\n/**\n * For use on frontends where JWT verification is not necessary.\n *\n * This function is exported (as a named export) from the main `'quick-auth'` module\n * entry point as well as from its subpath export `'quick-auth/light'`.\n */\nfunction createLightClient(options = {}) {\n    const config = (0,_config_js__WEBPACK_IMPORTED_MODULE_0__.createConfig)(options);\n    return {\n        generateNonce: () => (0,_actions_index_js__WEBPACK_IMPORTED_MODULE_1__.generateNonce)(config),\n        verifySiwf: (options) => (0,_actions_index_js__WEBPACK_IMPORTED_MODULE_2__.verifySiwf)(config, options),\n    };\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL21pbmlhcHAtc2RrL25vZGVfbW9kdWxlcy9AZmFyY2FzdGVyL3F1aWNrLWF1dGgvZGlzdC9saWdodENsaWVudC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQStEO0FBQ3BCO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHVDQUF1QztBQUM5QyxtQkFBbUIsd0RBQVk7QUFDL0I7QUFDQSw2QkFBNkIsZ0VBQWE7QUFDMUMsaUNBQWlDLDZEQUFVO0FBQzNDO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9taW5pYXBwLXNkay9ub2RlX21vZHVsZXMvQGZhcmNhc3Rlci9xdWljay1hdXRoL2Rpc3QvbGlnaHRDbGllbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2VuZXJhdGVOb25jZSwgdmVyaWZ5U2l3ZiB9IGZyb20gXCIuL2FjdGlvbnMvaW5kZXguanNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy5qc1wiO1xuLyoqXG4gKiBGb3IgdXNlIG9uIGZyb250ZW5kcyB3aGVyZSBKV1QgdmVyaWZpY2F0aW9uIGlzIG5vdCBuZWNlc3NhcnkuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyBleHBvcnRlZCAoYXMgYSBuYW1lZCBleHBvcnQpIGZyb20gdGhlIG1haW4gYCdxdWljay1hdXRoJ2AgbW9kdWxlXG4gKiBlbnRyeSBwb2ludCBhcyB3ZWxsIGFzIGZyb20gaXRzIHN1YnBhdGggZXhwb3J0IGAncXVpY2stYXV0aC9saWdodCdgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGlnaHRDbGllbnQob3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgY29uZmlnID0gY3JlYXRlQ29uZmlnKG9wdGlvbnMpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGdlbmVyYXRlTm9uY2U6ICgpID0+IGdlbmVyYXRlTm9uY2UoY29uZmlnKSxcbiAgICAgICAgdmVyaWZ5U2l3ZjogKG9wdGlvbnMpID0+IHZlcmlmeVNpd2YoY29uZmlnLCBvcHRpb25zKSxcbiAgICB9O1xufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/node_modules/@farcaster/quick-auth/dist/lightClient.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@neynar/react/dist/bundle.es.js":
/*!******************************************************!*\
  !*** ./node_modules/@neynar/react/dist/bundle.es.js ***!
  \******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   CastCard: () => (/* binding */ oa),\n/* harmony export */   MiniAppProvider: () => (/* binding */ dR),\n/* harmony export */   NeynarAuthButton: () => (/* binding */ pS),\n/* harmony export */   NeynarAutoCompleteUser: () => (/* binding */ xR),\n/* harmony export */   NeynarCastCard: () => (/* binding */ RA),\n/* harmony export */   NeynarContextProvider: () => (/* binding */ fR),\n/* harmony export */   NeynarConversationList: () => (/* binding */ mR),\n/* harmony export */   NeynarFeedList: () => (/* binding */ yR),\n/* harmony export */   NeynarFrameCard: () => (/* binding */ aI),\n/* harmony export */   NeynarProfileCard: () => (/* binding */ vR),\n/* harmony export */   NeynarUserDropdown: () => (/* binding */ ER),\n/* harmony export */   SIWN_variant: () => (/* binding */ gs),\n/* harmony export */   Theme: () => (/* binding */ yg),\n/* harmony export */   useLocalStorage: () => (/* binding */ du),\n/* harmony export */   useMiniApp: () => (/* binding */ hR),\n/* harmony export */   useNeynarContext: () => (/* binding */ ts)\n/* harmony export */ });\n/* harmony import */ var _pigment_css_react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @pigment-css/react */ \"(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-AFZBAV6Q.mjs\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\n/* provided dependency */ var Buffer = __webpack_require__(/*! buffer */ \"(app-pages-browser)/./node_modules/buffer/index.js\")[\"Buffer\"];\nvar ym = Object.defineProperty;\nvar vm = (s, e, t) => e in s ? ym(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t;\nvar Cr = (s, e, t) => vm(s, typeof e != \"symbol\" ? e + \"\" : e, t);\n\n\nconst Gr = {\n  vars: {\n    colors: {\n      primary: \"var(--colors-primary)\"\n    },\n    typography: {\n      fonts: {\n        base: \"var(--typography-fonts-base)\"\n      },\n      fontWeights: {\n        regular: \"var(--typography-fontWeights-regular)\",\n        bold: \"var(--typography-fontWeights-bold)\"\n      },\n      fontSizes: {\n        large: \"var(--typography-fontSizes-large)\",\n        medium: \"var(--typography-fontSizes-medium)\",\n        small: \"var(--typography-fontSizes-small)\"\n      }\n    },\n    palette: {\n      background: \"var(--palette-background)\",\n      border: \"var(--palette-border)\",\n      text: \"var(--palette-text)\",\n      textMuted: \"var(--palette-textMuted)\"\n    }\n  }\n};\nfunction Fc(s) {\n  return s && s.__esModule && Object.prototype.hasOwnProperty.call(s, \"default\") ? s.default : s;\n}\nfunction Nc(s) {\n  if (Object.prototype.hasOwnProperty.call(s, \"__esModule\")) return s;\n  var e = s.default;\n  if (typeof e == \"function\") {\n    var t = function r() {\n      return this instanceof r ? Reflect.construct(e, arguments, this.constructor) : e.apply(this, arguments);\n    };\n    t.prototype = e.prototype;\n  } else t = {};\n  return Object.defineProperty(t, \"__esModule\", {\n    value: !0\n  }), Object.keys(s).forEach(function(r) {\n    var n = Object.getOwnPropertyDescriptor(s, r);\n    Object.defineProperty(t, r, n.get ? n : {\n      enumerable: !0,\n      get: function() {\n        return s[r];\n      }\n    });\n  }), t;\n}\nvar Ua = { exports: {} }, Kn = {};\n/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar Wu;\nfunction Sm() {\n  if (Wu) return Kn;\n  Wu = 1;\n  var s = Symbol.for(\"react.transitional.element\"), e = Symbol.for(\"react.fragment\");\n  function t(r, n, i) {\n    var o = null;\n    if (i !== void 0 && (o = \"\" + i), n.key !== void 0 && (o = \"\" + n.key), \"key\" in n) {\n      i = {};\n      for (var a in n)\n        a !== \"key\" && (i[a] = n[a]);\n    } else i = n;\n    return n = i.ref, {\n      $$typeof: s,\n      type: r,\n      key: o,\n      ref: n !== void 0 ? n : null,\n      props: i\n    };\n  }\n  return Kn.Fragment = e, Kn.jsx = t, Kn.jsxs = t, Kn;\n}\nvar zu;\nfunction bm() {\n  return zu || (zu = 1, Ua.exports = Sm()), Ua.exports;\n}\nvar q = bm();\nlet Un = class extends Error {\n  constructor(t, r = {}) {\n    super(t, r.cause ? { cause: r.cause } : void 0);\n    Cr(this, \"name\", \"BaseError\");\n    Cr(this, \"cause\");\n    this.cause = r.cause;\n  }\n};\nclass Tm extends Un {\n  constructor() {\n    super(\"Invalid domain manifest\");\n    Cr(this, \"name\", \"AddMiniApp.InvalidDomainManifest\");\n  }\n}\nlet wm = class extends Un {\n  constructor() {\n    super(\"Add miniapp rejected by user\");\n    Cr(this, \"name\", \"AddMiniApp.RejectedByUser\");\n  }\n}, Of = class extends Un {\n  constructor() {\n    super(\"Sign in rejected by user\");\n    Cr(this, \"name\", \"SignIn.RejectedByUser\");\n  }\n};\nclass Am extends Un {\n  constructor() {\n    super(\"Sign manifest rejected by user\");\n    Cr(this, \"name\", \"SignManifest.RejectedByUser\");\n  }\n}\nclass Im extends Un {\n  constructor() {\n    super(\"Invalid domain provided\");\n    Cr(this, \"name\", \"SignManifest.InvalidDomain\");\n  }\n}\nclass _m extends Un {\n  constructor(t = \"Manifest signing failed\") {\n    super(t);\n    Cr(this, \"name\", \"SignManifest.GenericError\");\n  }\n}\nvar Ze;\n(function(s) {\n  s.assertEqual = (n) => {\n  };\n  function e(n) {\n  }\n  s.assertIs = e;\n  function t(n) {\n    throw new Error();\n  }\n  s.assertNever = t, s.arrayToEnum = (n) => {\n    const i = {};\n    for (const o of n)\n      i[o] = o;\n    return i;\n  }, s.getValidEnumValues = (n) => {\n    const i = s.objectKeys(n).filter((a) => typeof n[n[a]] != \"number\"), o = {};\n    for (const a of i)\n      o[a] = n[a];\n    return s.objectValues(o);\n  }, s.objectValues = (n) => s.objectKeys(n).map(function(i) {\n    return n[i];\n  }), s.objectKeys = typeof Object.keys == \"function\" ? (n) => Object.keys(n) : (n) => {\n    const i = [];\n    for (const o in n)\n      Object.prototype.hasOwnProperty.call(n, o) && i.push(o);\n    return i;\n  }, s.find = (n, i) => {\n    for (const o of n)\n      if (i(o))\n        return o;\n  }, s.isInteger = typeof Number.isInteger == \"function\" ? (n) => Number.isInteger(n) : (n) => typeof n == \"number\" && Number.isFinite(n) && Math.floor(n) === n;\n  function r(n, i = \" | \") {\n    return n.map((o) => typeof o == \"string\" ? `'${o}'` : o).join(i);\n  }\n  s.joinValues = r, s.jsonStringifyReplacer = (n, i) => typeof i == \"bigint\" ? i.toString() : i;\n})(Ze || (Ze = {}));\nvar Yu;\n(function(s) {\n  s.mergeShapes = (e, t) => ({\n    ...e,\n    ...t\n    // second overwrites first\n  });\n})(Yu || (Yu = {}));\nconst me = Ze.arrayToEnum([\n  \"string\",\n  \"nan\",\n  \"number\",\n  \"integer\",\n  \"float\",\n  \"boolean\",\n  \"date\",\n  \"bigint\",\n  \"symbol\",\n  \"function\",\n  \"undefined\",\n  \"null\",\n  \"array\",\n  \"object\",\n  \"unknown\",\n  \"promise\",\n  \"void\",\n  \"never\",\n  \"map\",\n  \"set\"\n]), ws = (s) => {\n  switch (typeof s) {\n    case \"undefined\":\n      return me.undefined;\n    case \"string\":\n      return me.string;\n    case \"number\":\n      return Number.isNaN(s) ? me.nan : me.number;\n    case \"boolean\":\n      return me.boolean;\n    case \"function\":\n      return me.function;\n    case \"bigint\":\n      return me.bigint;\n    case \"symbol\":\n      return me.symbol;\n    case \"object\":\n      return Array.isArray(s) ? me.array : s === null ? me.null : s.then && typeof s.then == \"function\" && s.catch && typeof s.catch == \"function\" ? me.promise : typeof Map < \"u\" && s instanceof Map ? me.map : typeof Set < \"u\" && s instanceof Set ? me.set : typeof Date < \"u\" && s instanceof Date ? me.date : me.object;\n    default:\n      return me.unknown;\n  }\n}, ae = Ze.arrayToEnum([\n  \"invalid_type\",\n  \"invalid_literal\",\n  \"custom\",\n  \"invalid_union\",\n  \"invalid_union_discriminator\",\n  \"invalid_enum_value\",\n  \"unrecognized_keys\",\n  \"invalid_arguments\",\n  \"invalid_return_type\",\n  \"invalid_date\",\n  \"invalid_string\",\n  \"too_small\",\n  \"too_big\",\n  \"invalid_intersection_types\",\n  \"not_multiple_of\",\n  \"not_finite\"\n]);\nclass ps extends Error {\n  get errors() {\n    return this.issues;\n  }\n  constructor(e) {\n    super(), this.issues = [], this.addIssue = (r) => {\n      this.issues = [...this.issues, r];\n    }, this.addIssues = (r = []) => {\n      this.issues = [...this.issues, ...r];\n    };\n    const t = new.target.prototype;\n    Object.setPrototypeOf ? Object.setPrototypeOf(this, t) : this.__proto__ = t, this.name = \"ZodError\", this.issues = e;\n  }\n  format(e) {\n    const t = e || function(i) {\n      return i.message;\n    }, r = { _errors: [] }, n = (i) => {\n      for (const o of i.issues)\n        if (o.code === \"invalid_union\")\n          o.unionErrors.map(n);\n        else if (o.code === \"invalid_return_type\")\n          n(o.returnTypeError);\n        else if (o.code === \"invalid_arguments\")\n          n(o.argumentsError);\n        else if (o.path.length === 0)\n          r._errors.push(t(o));\n        else {\n          let a = r, l = 0;\n          for (; l < o.path.length; ) {\n            const c = o.path[l];\n            l === o.path.length - 1 ? (a[c] = a[c] || { _errors: [] }, a[c]._errors.push(t(o))) : a[c] = a[c] || { _errors: [] }, a = a[c], l++;\n          }\n        }\n    };\n    return n(this), r;\n  }\n  static assert(e) {\n    if (!(e instanceof ps))\n      throw new Error(`Not a ZodError: ${e}`);\n  }\n  toString() {\n    return this.message;\n  }\n  get message() {\n    return JSON.stringify(this.issues, Ze.jsonStringifyReplacer, 2);\n  }\n  get isEmpty() {\n    return this.issues.length === 0;\n  }\n  flatten(e = (t) => t.message) {\n    const t = {}, r = [];\n    for (const n of this.issues)\n      if (n.path.length > 0) {\n        const i = n.path[0];\n        t[i] = t[i] || [], t[i].push(e(n));\n      } else\n        r.push(e(n));\n    return { formErrors: r, fieldErrors: t };\n  }\n  get formErrors() {\n    return this.flatten();\n  }\n}\nps.create = (s) => new ps(s);\nconst Kl = (s, e) => {\n  let t;\n  switch (s.code) {\n    case ae.invalid_type:\n      s.received === me.undefined ? t = \"Required\" : t = `Expected ${s.expected}, received ${s.received}`;\n      break;\n    case ae.invalid_literal:\n      t = `Invalid literal value, expected ${JSON.stringify(s.expected, Ze.jsonStringifyReplacer)}`;\n      break;\n    case ae.unrecognized_keys:\n      t = `Unrecognized key(s) in object: ${Ze.joinValues(s.keys, \", \")}`;\n      break;\n    case ae.invalid_union:\n      t = \"Invalid input\";\n      break;\n    case ae.invalid_union_discriminator:\n      t = `Invalid discriminator value. Expected ${Ze.joinValues(s.options)}`;\n      break;\n    case ae.invalid_enum_value:\n      t = `Invalid enum value. Expected ${Ze.joinValues(s.options)}, received '${s.received}'`;\n      break;\n    case ae.invalid_arguments:\n      t = \"Invalid function arguments\";\n      break;\n    case ae.invalid_return_type:\n      t = \"Invalid function return type\";\n      break;\n    case ae.invalid_date:\n      t = \"Invalid date\";\n      break;\n    case ae.invalid_string:\n      typeof s.validation == \"object\" ? \"includes\" in s.validation ? (t = `Invalid input: must include \"${s.validation.includes}\"`, typeof s.validation.position == \"number\" && (t = `${t} at one or more positions greater than or equal to ${s.validation.position}`)) : \"startsWith\" in s.validation ? t = `Invalid input: must start with \"${s.validation.startsWith}\"` : \"endsWith\" in s.validation ? t = `Invalid input: must end with \"${s.validation.endsWith}\"` : Ze.assertNever(s.validation) : s.validation !== \"regex\" ? t = `Invalid ${s.validation}` : t = \"Invalid\";\n      break;\n    case ae.too_small:\n      s.type === \"array\" ? t = `Array must contain ${s.exact ? \"exactly\" : s.inclusive ? \"at least\" : \"more than\"} ${s.minimum} element(s)` : s.type === \"string\" ? t = `String must contain ${s.exact ? \"exactly\" : s.inclusive ? \"at least\" : \"over\"} ${s.minimum} character(s)` : s.type === \"number\" ? t = `Number must be ${s.exact ? \"exactly equal to \" : s.inclusive ? \"greater than or equal to \" : \"greater than \"}${s.minimum}` : s.type === \"bigint\" ? t = `Number must be ${s.exact ? \"exactly equal to \" : s.inclusive ? \"greater than or equal to \" : \"greater than \"}${s.minimum}` : s.type === \"date\" ? t = `Date must be ${s.exact ? \"exactly equal to \" : s.inclusive ? \"greater than or equal to \" : \"greater than \"}${new Date(Number(s.minimum))}` : t = \"Invalid input\";\n      break;\n    case ae.too_big:\n      s.type === \"array\" ? t = `Array must contain ${s.exact ? \"exactly\" : s.inclusive ? \"at most\" : \"less than\"} ${s.maximum} element(s)` : s.type === \"string\" ? t = `String must contain ${s.exact ? \"exactly\" : s.inclusive ? \"at most\" : \"under\"} ${s.maximum} character(s)` : s.type === \"number\" ? t = `Number must be ${s.exact ? \"exactly\" : s.inclusive ? \"less than or equal to\" : \"less than\"} ${s.maximum}` : s.type === \"bigint\" ? t = `BigInt must be ${s.exact ? \"exactly\" : s.inclusive ? \"less than or equal to\" : \"less than\"} ${s.maximum}` : s.type === \"date\" ? t = `Date must be ${s.exact ? \"exactly\" : s.inclusive ? \"smaller than or equal to\" : \"smaller than\"} ${new Date(Number(s.maximum))}` : t = \"Invalid input\";\n      break;\n    case ae.custom:\n      t = \"Invalid input\";\n      break;\n    case ae.invalid_intersection_types:\n      t = \"Intersection results could not be merged\";\n      break;\n    case ae.not_multiple_of:\n      t = `Number must be a multiple of ${s.multipleOf}`;\n      break;\n    case ae.not_finite:\n      t = \"Number must be finite\";\n      break;\n    default:\n      t = e.defaultError, Ze.assertNever(s);\n  }\n  return { message: t };\n};\nlet Rm = Kl;\nfunction Lm() {\n  return Rm;\n}\nconst Cm = (s) => {\n  const { data: e, path: t, errorMaps: r, issueData: n } = s, i = [...t, ...n.path || []], o = {\n    ...n,\n    path: i\n  };\n  if (n.message !== void 0)\n    return {\n      ...n,\n      path: i,\n      message: n.message\n    };\n  let a = \"\";\n  const l = r.filter((c) => !!c).slice().reverse();\n  for (const c of l)\n    a = c(o, { data: e, defaultError: a }).message;\n  return {\n    ...n,\n    path: i,\n    message: a\n  };\n};\nfunction he(s, e) {\n  const t = Lm(), r = Cm({\n    issueData: e,\n    data: s.data,\n    path: s.path,\n    errorMaps: [\n      s.common.contextualErrorMap,\n      // contextual error map is first priority\n      s.schemaErrorMap,\n      // then schema-bound map if available\n      t,\n      // then global override map\n      t === Kl ? void 0 : Kl\n      // then global default map\n    ].filter((n) => !!n)\n  });\n  s.common.issues.push(r);\n}\nclass wr {\n  constructor() {\n    this.value = \"valid\";\n  }\n  dirty() {\n    this.value === \"valid\" && (this.value = \"dirty\");\n  }\n  abort() {\n    this.value !== \"aborted\" && (this.value = \"aborted\");\n  }\n  static mergeArray(e, t) {\n    const r = [];\n    for (const n of t) {\n      if (n.status === \"aborted\")\n        return Re;\n      n.status === \"dirty\" && e.dirty(), r.push(n.value);\n    }\n    return { status: e.value, value: r };\n  }\n  static async mergeObjectAsync(e, t) {\n    const r = [];\n    for (const n of t) {\n      const i = await n.key, o = await n.value;\n      r.push({\n        key: i,\n        value: o\n      });\n    }\n    return wr.mergeObjectSync(e, r);\n  }\n  static mergeObjectSync(e, t) {\n    const r = {};\n    for (const n of t) {\n      const { key: i, value: o } = n;\n      if (i.status === \"aborted\" || o.status === \"aborted\")\n        return Re;\n      i.status === \"dirty\" && e.dirty(), o.status === \"dirty\" && e.dirty(), i.value !== \"__proto__\" && (typeof o.value < \"u\" || n.alwaysSet) && (r[i.value] = o.value);\n    }\n    return { status: e.value, value: r };\n  }\n}\nconst Re = Object.freeze({\n  status: \"aborted\"\n}), Wn = (s) => ({ status: \"dirty\", value: s }), Rr = (s) => ({ status: \"valid\", value: s }), Zu = (s) => s.status === \"aborted\", Xu = (s) => s.status === \"dirty\", Ln = (s) => s.status === \"valid\", bo = (s) => typeof Promise < \"u\" && s instanceof Promise;\nvar Ee;\n(function(s) {\n  s.errToObj = (e) => typeof e == \"string\" ? { message: e } : e || {}, s.toString = (e) => typeof e == \"string\" ? e : e == null ? void 0 : e.message;\n})(Ee || (Ee = {}));\nclass Ds {\n  constructor(e, t, r, n) {\n    this._cachedPath = [], this.parent = e, this.data = t, this._path = r, this._key = n;\n  }\n  get path() {\n    return this._cachedPath.length || (Array.isArray(this._key) ? this._cachedPath.push(...this._path, ...this._key) : this._cachedPath.push(...this._path, this._key)), this._cachedPath;\n  }\n}\nconst Ju = (s, e) => {\n  if (Ln(e))\n    return { success: !0, data: e.value };\n  if (!s.common.issues.length)\n    throw new Error(\"Validation failed but no issues detected.\");\n  return {\n    success: !1,\n    get error() {\n      if (this._error)\n        return this._error;\n      const t = new ps(s.common.issues);\n      return this._error = t, this._error;\n    }\n  };\n};\nfunction Ve(s) {\n  if (!s)\n    return {};\n  const { errorMap: e, invalid_type_error: t, required_error: r, description: n } = s;\n  if (e && (t || r))\n    throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n  return e ? { errorMap: e, description: n } : { errorMap: (o, a) => {\n    const { message: l } = s;\n    return o.code === \"invalid_enum_value\" ? { message: l ?? a.defaultError } : typeof a.data > \"u\" ? { message: l ?? r ?? a.defaultError } : o.code !== \"invalid_type\" ? { message: a.defaultError } : { message: l ?? t ?? a.defaultError };\n  }, description: n };\n}\nclass Ye {\n  get description() {\n    return this._def.description;\n  }\n  _getType(e) {\n    return ws(e.data);\n  }\n  _getOrReturnCtx(e, t) {\n    return t || {\n      common: e.parent.common,\n      data: e.data,\n      parsedType: ws(e.data),\n      schemaErrorMap: this._def.errorMap,\n      path: e.path,\n      parent: e.parent\n    };\n  }\n  _processInputParams(e) {\n    return {\n      status: new wr(),\n      ctx: {\n        common: e.parent.common,\n        data: e.data,\n        parsedType: ws(e.data),\n        schemaErrorMap: this._def.errorMap,\n        path: e.path,\n        parent: e.parent\n      }\n    };\n  }\n  _parseSync(e) {\n    const t = this._parse(e);\n    if (bo(t))\n      throw new Error(\"Synchronous parse encountered promise.\");\n    return t;\n  }\n  _parseAsync(e) {\n    const t = this._parse(e);\n    return Promise.resolve(t);\n  }\n  parse(e, t) {\n    const r = this.safeParse(e, t);\n    if (r.success)\n      return r.data;\n    throw r.error;\n  }\n  safeParse(e, t) {\n    const r = {\n      common: {\n        issues: [],\n        async: (t == null ? void 0 : t.async) ?? !1,\n        contextualErrorMap: t == null ? void 0 : t.errorMap\n      },\n      path: (t == null ? void 0 : t.path) || [],\n      schemaErrorMap: this._def.errorMap,\n      parent: null,\n      data: e,\n      parsedType: ws(e)\n    }, n = this._parseSync({ data: e, path: r.path, parent: r });\n    return Ju(r, n);\n  }\n  \"~validate\"(e) {\n    var r, n;\n    const t = {\n      common: {\n        issues: [],\n        async: !!this[\"~standard\"].async\n      },\n      path: [],\n      schemaErrorMap: this._def.errorMap,\n      parent: null,\n      data: e,\n      parsedType: ws(e)\n    };\n    if (!this[\"~standard\"].async)\n      try {\n        const i = this._parseSync({ data: e, path: [], parent: t });\n        return Ln(i) ? {\n          value: i.value\n        } : {\n          issues: t.common.issues\n        };\n      } catch (i) {\n        (n = (r = i == null ? void 0 : i.message) == null ? void 0 : r.toLowerCase()) != null && n.includes(\"encountered\") && (this[\"~standard\"].async = !0), t.common = {\n          issues: [],\n          async: !0\n        };\n      }\n    return this._parseAsync({ data: e, path: [], parent: t }).then((i) => Ln(i) ? {\n      value: i.value\n    } : {\n      issues: t.common.issues\n    });\n  }\n  async parseAsync(e, t) {\n    const r = await this.safeParseAsync(e, t);\n    if (r.success)\n      return r.data;\n    throw r.error;\n  }\n  async safeParseAsync(e, t) {\n    const r = {\n      common: {\n        issues: [],\n        contextualErrorMap: t == null ? void 0 : t.errorMap,\n        async: !0\n      },\n      path: (t == null ? void 0 : t.path) || [],\n      schemaErrorMap: this._def.errorMap,\n      parent: null,\n      data: e,\n      parsedType: ws(e)\n    }, n = this._parse({ data: e, path: r.path, parent: r }), i = await (bo(n) ? n : Promise.resolve(n));\n    return Ju(r, i);\n  }\n  refine(e, t) {\n    const r = (n) => typeof t == \"string\" || typeof t > \"u\" ? { message: t } : typeof t == \"function\" ? t(n) : t;\n    return this._refinement((n, i) => {\n      const o = e(n), a = () => i.addIssue({\n        code: ae.custom,\n        ...r(n)\n      });\n      return typeof Promise < \"u\" && o instanceof Promise ? o.then((l) => l ? !0 : (a(), !1)) : o ? !0 : (a(), !1);\n    });\n  }\n  refinement(e, t) {\n    return this._refinement((r, n) => e(r) ? !0 : (n.addIssue(typeof t == \"function\" ? t(r, n) : t), !1));\n  }\n  _refinement(e) {\n    return new Ys({\n      schema: this,\n      typeName: ke.ZodEffects,\n      effect: { type: \"refinement\", refinement: e }\n    });\n  }\n  superRefine(e) {\n    return this._refinement(e);\n  }\n  constructor(e) {\n    this.spa = this.safeParseAsync, this._def = e, this.parse = this.parse.bind(this), this.safeParse = this.safeParse.bind(this), this.parseAsync = this.parseAsync.bind(this), this.safeParseAsync = this.safeParseAsync.bind(this), this.spa = this.spa.bind(this), this.refine = this.refine.bind(this), this.refinement = this.refinement.bind(this), this.superRefine = this.superRefine.bind(this), this.optional = this.optional.bind(this), this.nullable = this.nullable.bind(this), this.nullish = this.nullish.bind(this), this.array = this.array.bind(this), this.promise = this.promise.bind(this), this.or = this.or.bind(this), this.and = this.and.bind(this), this.transform = this.transform.bind(this), this.brand = this.brand.bind(this), this.default = this.default.bind(this), this.catch = this.catch.bind(this), this.describe = this.describe.bind(this), this.pipe = this.pipe.bind(this), this.readonly = this.readonly.bind(this), this.isNullable = this.isNullable.bind(this), this.isOptional = this.isOptional.bind(this), this[\"~standard\"] = {\n      version: 1,\n      vendor: \"zod\",\n      validate: (t) => this[\"~validate\"](t)\n    };\n  }\n  optional() {\n    return fs.create(this, this._def);\n  }\n  nullable() {\n    return Zs.create(this, this._def);\n  }\n  nullish() {\n    return this.nullable().optional();\n  }\n  array() {\n    return Yr.create(this);\n  }\n  promise() {\n    return _o.create(this, this._def);\n  }\n  or(e) {\n    return wo.create([this, e], this._def);\n  }\n  and(e) {\n    return Ao.create(this, e, this._def);\n  }\n  transform(e) {\n    return new Ys({\n      ...Ve(this._def),\n      schema: this,\n      typeName: ke.ZodEffects,\n      effect: { type: \"transform\", transform: e }\n    });\n  }\n  default(e) {\n    const t = typeof e == \"function\" ? e : () => e;\n    return new Ro({\n      ...Ve(this._def),\n      innerType: this,\n      defaultValue: t,\n      typeName: ke.ZodDefault\n    });\n  }\n  brand() {\n    return new Uf({\n      typeName: ke.ZodBranded,\n      type: this,\n      ...Ve(this._def)\n    });\n  }\n  catch(e) {\n    const t = typeof e == \"function\" ? e : () => e;\n    return new Lo({\n      ...Ve(this._def),\n      innerType: this,\n      catchValue: t,\n      typeName: ke.ZodCatch\n    });\n  }\n  describe(e) {\n    const t = this.constructor;\n    return new t({\n      ...this._def,\n      description: e\n    });\n  }\n  pipe(e) {\n    return $c.create(this, e);\n  }\n  readonly() {\n    return Co.create(this);\n  }\n  isOptional() {\n    return this.safeParse(void 0).success;\n  }\n  isNullable() {\n    return this.safeParse(null).success;\n  }\n}\nconst km = /^c[^\\s-]{8,}$/i, Dm = /^[0-9a-z]+$/, Pm = /^[0-9A-HJKMNP-TV-Z]{26}$/i, Mm = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i, Om = /^[a-z0-9_-]{21}$/i, Bm = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/, Fm = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/, Nm = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i, Um = \"^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$\";\nlet $a;\nconst $m = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/, Gm = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/, Vm = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/, jm = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/, Km = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/, Hm = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/, Bf = \"((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))\", qm = new RegExp(`^${Bf}$`);\nfunction Ff(s) {\n  let e = \"[0-5]\\\\d\";\n  s.precision ? e = `${e}\\\\.\\\\d{${s.precision}}` : s.precision == null && (e = `${e}(\\\\.\\\\d+)?`);\n  const t = s.precision ? \"+\" : \"?\";\n  return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${e})${t}`;\n}\nfunction Wm(s) {\n  return new RegExp(`^${Ff(s)}$`);\n}\nfunction zm(s) {\n  let e = `${Bf}T${Ff(s)}`;\n  const t = [];\n  return t.push(s.local ? \"Z?\" : \"Z\"), s.offset && t.push(\"([+-]\\\\d{2}:?\\\\d{2})\"), e = `${e}(${t.join(\"|\")})`, new RegExp(`^${e}$`);\n}\nfunction Ym(s, e) {\n  return !!((e === \"v4\" || !e) && $m.test(s) || (e === \"v6\" || !e) && Vm.test(s));\n}\nfunction Zm(s, e) {\n  if (!Bm.test(s))\n    return !1;\n  try {\n    const [t] = s.split(\".\");\n    if (!t)\n      return !1;\n    const r = t.replace(/-/g, \"+\").replace(/_/g, \"/\").padEnd(t.length + (4 - t.length % 4) % 4, \"=\"), n = JSON.parse(atob(r));\n    return !(typeof n != \"object\" || n === null || \"typ\" in n && (n == null ? void 0 : n.typ) !== \"JWT\" || !n.alg || e && n.alg !== e);\n  } catch {\n    return !1;\n  }\n}\nfunction Xm(s, e) {\n  return !!((e === \"v4\" || !e) && Gm.test(s) || (e === \"v6\" || !e) && jm.test(s));\n}\nclass Rs extends Ye {\n  _parse(e) {\n    if (this._def.coerce && (e.data = String(e.data)), this._getType(e) !== me.string) {\n      const i = this._getOrReturnCtx(e);\n      return he(i, {\n        code: ae.invalid_type,\n        expected: me.string,\n        received: i.parsedType\n      }), Re;\n    }\n    const r = new wr();\n    let n;\n    for (const i of this._def.checks)\n      if (i.kind === \"min\")\n        e.data.length < i.value && (n = this._getOrReturnCtx(e, n), he(n, {\n          code: ae.too_small,\n          minimum: i.value,\n          type: \"string\",\n          inclusive: !0,\n          exact: !1,\n          message: i.message\n        }), r.dirty());\n      else if (i.kind === \"max\")\n        e.data.length > i.value && (n = this._getOrReturnCtx(e, n), he(n, {\n          code: ae.too_big,\n          maximum: i.value,\n          type: \"string\",\n          inclusive: !0,\n          exact: !1,\n          message: i.message\n        }), r.dirty());\n      else if (i.kind === \"length\") {\n        const o = e.data.length > i.value, a = e.data.length < i.value;\n        (o || a) && (n = this._getOrReturnCtx(e, n), o ? he(n, {\n          code: ae.too_big,\n          maximum: i.value,\n          type: \"string\",\n          inclusive: !0,\n          exact: !0,\n          message: i.message\n        }) : a && he(n, {\n          code: ae.too_small,\n          minimum: i.value,\n          type: \"string\",\n          inclusive: !0,\n          exact: !0,\n          message: i.message\n        }), r.dirty());\n      } else if (i.kind === \"email\")\n        Nm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n          validation: \"email\",\n          code: ae.invalid_string,\n          message: i.message\n        }), r.dirty());\n      else if (i.kind === \"emoji\")\n        $a || ($a = new RegExp(Um, \"u\")), $a.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n          validation: \"emoji\",\n          code: ae.invalid_string,\n          message: i.message\n        }), r.dirty());\n      else if (i.kind === \"uuid\")\n        Mm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n          validation: \"uuid\",\n          code: ae.invalid_string,\n          message: i.message\n        }), r.dirty());\n      else if (i.kind === \"nanoid\")\n        Om.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n          validation: \"nanoid\",\n          code: ae.invalid_string,\n          message: i.message\n        }), r.dirty());\n      else if (i.kind === \"cuid\")\n        km.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n          validation: \"cuid\",\n          code: ae.invalid_string,\n          message: i.message\n        }), r.dirty());\n      else if (i.kind === \"cuid2\")\n        Dm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n          validation: \"cuid2\",\n          code: ae.invalid_string,\n          message: i.message\n        }), r.dirty());\n      else if (i.kind === \"ulid\")\n        Pm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n          validation: \"ulid\",\n          code: ae.invalid_string,\n          message: i.message\n        }), r.dirty());\n      else if (i.kind === \"url\")\n        try {\n          new URL(e.data);\n        } catch {\n          n = this._getOrReturnCtx(e, n), he(n, {\n            validation: \"url\",\n            code: ae.invalid_string,\n            message: i.message\n          }), r.dirty();\n        }\n      else i.kind === \"regex\" ? (i.regex.lastIndex = 0, i.regex.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n        validation: \"regex\",\n        code: ae.invalid_string,\n        message: i.message\n      }), r.dirty())) : i.kind === \"trim\" ? e.data = e.data.trim() : i.kind === \"includes\" ? e.data.includes(i.value, i.position) || (n = this._getOrReturnCtx(e, n), he(n, {\n        code: ae.invalid_string,\n        validation: { includes: i.value, position: i.position },\n        message: i.message\n      }), r.dirty()) : i.kind === \"toLowerCase\" ? e.data = e.data.toLowerCase() : i.kind === \"toUpperCase\" ? e.data = e.data.toUpperCase() : i.kind === \"startsWith\" ? e.data.startsWith(i.value) || (n = this._getOrReturnCtx(e, n), he(n, {\n        code: ae.invalid_string,\n        validation: { startsWith: i.value },\n        message: i.message\n      }), r.dirty()) : i.kind === \"endsWith\" ? e.data.endsWith(i.value) || (n = this._getOrReturnCtx(e, n), he(n, {\n        code: ae.invalid_string,\n        validation: { endsWith: i.value },\n        message: i.message\n      }), r.dirty()) : i.kind === \"datetime\" ? zm(i).test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n        code: ae.invalid_string,\n        validation: \"datetime\",\n        message: i.message\n      }), r.dirty()) : i.kind === \"date\" ? qm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n        code: ae.invalid_string,\n        validation: \"date\",\n        message: i.message\n      }), r.dirty()) : i.kind === \"time\" ? Wm(i).test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n        code: ae.invalid_string,\n        validation: \"time\",\n        message: i.message\n      }), r.dirty()) : i.kind === \"duration\" ? Fm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n        validation: \"duration\",\n        code: ae.invalid_string,\n        message: i.message\n      }), r.dirty()) : i.kind === \"ip\" ? Ym(e.data, i.version) || (n = this._getOrReturnCtx(e, n), he(n, {\n        validation: \"ip\",\n        code: ae.invalid_string,\n        message: i.message\n      }), r.dirty()) : i.kind === \"jwt\" ? Zm(e.data, i.alg) || (n = this._getOrReturnCtx(e, n), he(n, {\n        validation: \"jwt\",\n        code: ae.invalid_string,\n        message: i.message\n      }), r.dirty()) : i.kind === \"cidr\" ? Xm(e.data, i.version) || (n = this._getOrReturnCtx(e, n), he(n, {\n        validation: \"cidr\",\n        code: ae.invalid_string,\n        message: i.message\n      }), r.dirty()) : i.kind === \"base64\" ? Km.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n        validation: \"base64\",\n        code: ae.invalid_string,\n        message: i.message\n      }), r.dirty()) : i.kind === \"base64url\" ? Hm.test(e.data) || (n = this._getOrReturnCtx(e, n), he(n, {\n        validation: \"base64url\",\n        code: ae.invalid_string,\n        message: i.message\n      }), r.dirty()) : Ze.assertNever(i);\n    return { status: r.value, value: e.data };\n  }\n  _regex(e, t, r) {\n    return this.refinement((n) => e.test(n), {\n      validation: t,\n      code: ae.invalid_string,\n      ...Ee.errToObj(r)\n    });\n  }\n  _addCheck(e) {\n    return new Rs({\n      ...this._def,\n      checks: [...this._def.checks, e]\n    });\n  }\n  email(e) {\n    return this._addCheck({ kind: \"email\", ...Ee.errToObj(e) });\n  }\n  url(e) {\n    return this._addCheck({ kind: \"url\", ...Ee.errToObj(e) });\n  }\n  emoji(e) {\n    return this._addCheck({ kind: \"emoji\", ...Ee.errToObj(e) });\n  }\n  uuid(e) {\n    return this._addCheck({ kind: \"uuid\", ...Ee.errToObj(e) });\n  }\n  nanoid(e) {\n    return this._addCheck({ kind: \"nanoid\", ...Ee.errToObj(e) });\n  }\n  cuid(e) {\n    return this._addCheck({ kind: \"cuid\", ...Ee.errToObj(e) });\n  }\n  cuid2(e) {\n    return this._addCheck({ kind: \"cuid2\", ...Ee.errToObj(e) });\n  }\n  ulid(e) {\n    return this._addCheck({ kind: \"ulid\", ...Ee.errToObj(e) });\n  }\n  base64(e) {\n    return this._addCheck({ kind: \"base64\", ...Ee.errToObj(e) });\n  }\n  base64url(e) {\n    return this._addCheck({\n      kind: \"base64url\",\n      ...Ee.errToObj(e)\n    });\n  }\n  jwt(e) {\n    return this._addCheck({ kind: \"jwt\", ...Ee.errToObj(e) });\n  }\n  ip(e) {\n    return this._addCheck({ kind: \"ip\", ...Ee.errToObj(e) });\n  }\n  cidr(e) {\n    return this._addCheck({ kind: \"cidr\", ...Ee.errToObj(e) });\n  }\n  datetime(e) {\n    return typeof e == \"string\" ? this._addCheck({\n      kind: \"datetime\",\n      precision: null,\n      offset: !1,\n      local: !1,\n      message: e\n    }) : this._addCheck({\n      kind: \"datetime\",\n      precision: typeof (e == null ? void 0 : e.precision) > \"u\" ? null : e == null ? void 0 : e.precision,\n      offset: (e == null ? void 0 : e.offset) ?? !1,\n      local: (e == null ? void 0 : e.local) ?? !1,\n      ...Ee.errToObj(e == null ? void 0 : e.message)\n    });\n  }\n  date(e) {\n    return this._addCheck({ kind: \"date\", message: e });\n  }\n  time(e) {\n    return typeof e == \"string\" ? this._addCheck({\n      kind: \"time\",\n      precision: null,\n      message: e\n    }) : this._addCheck({\n      kind: \"time\",\n      precision: typeof (e == null ? void 0 : e.precision) > \"u\" ? null : e == null ? void 0 : e.precision,\n      ...Ee.errToObj(e == null ? void 0 : e.message)\n    });\n  }\n  duration(e) {\n    return this._addCheck({ kind: \"duration\", ...Ee.errToObj(e) });\n  }\n  regex(e, t) {\n    return this._addCheck({\n      kind: \"regex\",\n      regex: e,\n      ...Ee.errToObj(t)\n    });\n  }\n  includes(e, t) {\n    return this._addCheck({\n      kind: \"includes\",\n      value: e,\n      position: t == null ? void 0 : t.position,\n      ...Ee.errToObj(t == null ? void 0 : t.message)\n    });\n  }\n  startsWith(e, t) {\n    return this._addCheck({\n      kind: \"startsWith\",\n      value: e,\n      ...Ee.errToObj(t)\n    });\n  }\n  endsWith(e, t) {\n    return this._addCheck({\n      kind: \"endsWith\",\n      value: e,\n      ...Ee.errToObj(t)\n    });\n  }\n  min(e, t) {\n    return this._addCheck({\n      kind: \"min\",\n      value: e,\n      ...Ee.errToObj(t)\n    });\n  }\n  max(e, t) {\n    return this._addCheck({\n      kind: \"max\",\n      value: e,\n      ...Ee.errToObj(t)\n    });\n  }\n  length(e, t) {\n    return this._addCheck({\n      kind: \"length\",\n      value: e,\n      ...Ee.errToObj(t)\n    });\n  }\n  /**\n   * Equivalent to `.min(1)`\n   */\n  nonempty(e) {\n    return this.min(1, Ee.errToObj(e));\n  }\n  trim() {\n    return new Rs({\n      ...this._def,\n      checks: [...this._def.checks, { kind: \"trim\" }]\n    });\n  }\n  toLowerCase() {\n    return new Rs({\n      ...this._def,\n      checks: [...this._def.checks, { kind: \"toLowerCase\" }]\n    });\n  }\n  toUpperCase() {\n    return new Rs({\n      ...this._def,\n      checks: [...this._def.checks, { kind: \"toUpperCase\" }]\n    });\n  }\n  get isDatetime() {\n    return !!this._def.checks.find((e) => e.kind === \"datetime\");\n  }\n  get isDate() {\n    return !!this._def.checks.find((e) => e.kind === \"date\");\n  }\n  get isTime() {\n    return !!this._def.checks.find((e) => e.kind === \"time\");\n  }\n  get isDuration() {\n    return !!this._def.checks.find((e) => e.kind === \"duration\");\n  }\n  get isEmail() {\n    return !!this._def.checks.find((e) => e.kind === \"email\");\n  }\n  get isURL() {\n    return !!this._def.checks.find((e) => e.kind === \"url\");\n  }\n  get isEmoji() {\n    return !!this._def.checks.find((e) => e.kind === \"emoji\");\n  }\n  get isUUID() {\n    return !!this._def.checks.find((e) => e.kind === \"uuid\");\n  }\n  get isNANOID() {\n    return !!this._def.checks.find((e) => e.kind === \"nanoid\");\n  }\n  get isCUID() {\n    return !!this._def.checks.find((e) => e.kind === \"cuid\");\n  }\n  get isCUID2() {\n    return !!this._def.checks.find((e) => e.kind === \"cuid2\");\n  }\n  get isULID() {\n    return !!this._def.checks.find((e) => e.kind === \"ulid\");\n  }\n  get isIP() {\n    return !!this._def.checks.find((e) => e.kind === \"ip\");\n  }\n  get isCIDR() {\n    return !!this._def.checks.find((e) => e.kind === \"cidr\");\n  }\n  get isBase64() {\n    return !!this._def.checks.find((e) => e.kind === \"base64\");\n  }\n  get isBase64url() {\n    return !!this._def.checks.find((e) => e.kind === \"base64url\");\n  }\n  get minLength() {\n    let e = null;\n    for (const t of this._def.checks)\n      t.kind === \"min\" && (e === null || t.value > e) && (e = t.value);\n    return e;\n  }\n  get maxLength() {\n    let e = null;\n    for (const t of this._def.checks)\n      t.kind === \"max\" && (e === null || t.value < e) && (e = t.value);\n    return e;\n  }\n}\nRs.create = (s) => new Rs({\n  checks: [],\n  typeName: ke.ZodString,\n  coerce: (s == null ? void 0 : s.coerce) ?? !1,\n  ...Ve(s)\n});\nfunction Jm(s, e) {\n  const t = (s.toString().split(\".\")[1] || \"\").length, r = (e.toString().split(\".\")[1] || \"\").length, n = t > r ? t : r, i = Number.parseInt(s.toFixed(n).replace(\".\", \"\")), o = Number.parseInt(e.toFixed(n).replace(\".\", \"\"));\n  return i % o / 10 ** n;\n}\nclass Cn extends Ye {\n  constructor() {\n    super(...arguments), this.min = this.gte, this.max = this.lte, this.step = this.multipleOf;\n  }\n  _parse(e) {\n    if (this._def.coerce && (e.data = Number(e.data)), this._getType(e) !== me.number) {\n      const i = this._getOrReturnCtx(e);\n      return he(i, {\n        code: ae.invalid_type,\n        expected: me.number,\n        received: i.parsedType\n      }), Re;\n    }\n    let r;\n    const n = new wr();\n    for (const i of this._def.checks)\n      i.kind === \"int\" ? Ze.isInteger(e.data) || (r = this._getOrReturnCtx(e, r), he(r, {\n        code: ae.invalid_type,\n        expected: \"integer\",\n        received: \"float\",\n        message: i.message\n      }), n.dirty()) : i.kind === \"min\" ? (i.inclusive ? e.data < i.value : e.data <= i.value) && (r = this._getOrReturnCtx(e, r), he(r, {\n        code: ae.too_small,\n        minimum: i.value,\n        type: \"number\",\n        inclusive: i.inclusive,\n        exact: !1,\n        message: i.message\n      }), n.dirty()) : i.kind === \"max\" ? (i.inclusive ? e.data > i.value : e.data >= i.value) && (r = this._getOrReturnCtx(e, r), he(r, {\n        code: ae.too_big,\n        maximum: i.value,\n        type: \"number\",\n        inclusive: i.inclusive,\n        exact: !1,\n        message: i.message\n      }), n.dirty()) : i.kind === \"multipleOf\" ? Jm(e.data, i.value) !== 0 && (r = this._getOrReturnCtx(e, r), he(r, {\n        code: ae.not_multiple_of,\n        multipleOf: i.value,\n        message: i.message\n      }), n.dirty()) : i.kind === \"finite\" ? Number.isFinite(e.data) || (r = this._getOrReturnCtx(e, r), he(r, {\n        code: ae.not_finite,\n        message: i.message\n      }), n.dirty()) : Ze.assertNever(i);\n    return { status: n.value, value: e.data };\n  }\n  gte(e, t) {\n    return this.setLimit(\"min\", e, !0, Ee.toString(t));\n  }\n  gt(e, t) {\n    return this.setLimit(\"min\", e, !1, Ee.toString(t));\n  }\n  lte(e, t) {\n    return this.setLimit(\"max\", e, !0, Ee.toString(t));\n  }\n  lt(e, t) {\n    return this.setLimit(\"max\", e, !1, Ee.toString(t));\n  }\n  setLimit(e, t, r, n) {\n    return new Cn({\n      ...this._def,\n      checks: [\n        ...this._def.checks,\n        {\n          kind: e,\n          value: t,\n          inclusive: r,\n          message: Ee.toString(n)\n        }\n      ]\n    });\n  }\n  _addCheck(e) {\n    return new Cn({\n      ...this._def,\n      checks: [...this._def.checks, e]\n    });\n  }\n  int(e) {\n    return this._addCheck({\n      kind: \"int\",\n      message: Ee.toString(e)\n    });\n  }\n  positive(e) {\n    return this._addCheck({\n      kind: \"min\",\n      value: 0,\n      inclusive: !1,\n      message: Ee.toString(e)\n    });\n  }\n  negative(e) {\n    return this._addCheck({\n      kind: \"max\",\n      value: 0,\n      inclusive: !1,\n      message: Ee.toString(e)\n    });\n  }\n  nonpositive(e) {\n    return this._addCheck({\n      kind: \"max\",\n      value: 0,\n      inclusive: !0,\n      message: Ee.toString(e)\n    });\n  }\n  nonnegative(e) {\n    return this._addCheck({\n      kind: \"min\",\n      value: 0,\n      inclusive: !0,\n      message: Ee.toString(e)\n    });\n  }\n  multipleOf(e, t) {\n    return this._addCheck({\n      kind: \"multipleOf\",\n      value: e,\n      message: Ee.toString(t)\n    });\n  }\n  finite(e) {\n    return this._addCheck({\n      kind: \"finite\",\n      message: Ee.toString(e)\n    });\n  }\n  safe(e) {\n    return this._addCheck({\n      kind: \"min\",\n      inclusive: !0,\n      value: Number.MIN_SAFE_INTEGER,\n      message: Ee.toString(e)\n    })._addCheck({\n      kind: \"max\",\n      inclusive: !0,\n      value: Number.MAX_SAFE_INTEGER,\n      message: Ee.toString(e)\n    });\n  }\n  get minValue() {\n    let e = null;\n    for (const t of this._def.checks)\n      t.kind === \"min\" && (e === null || t.value > e) && (e = t.value);\n    return e;\n  }\n  get maxValue() {\n    let e = null;\n    for (const t of this._def.checks)\n      t.kind === \"max\" && (e === null || t.value < e) && (e = t.value);\n    return e;\n  }\n  get isInt() {\n    return !!this._def.checks.find((e) => e.kind === \"int\" || e.kind === \"multipleOf\" && Ze.isInteger(e.value));\n  }\n  get isFinite() {\n    let e = null, t = null;\n    for (const r of this._def.checks) {\n      if (r.kind === \"finite\" || r.kind === \"int\" || r.kind === \"multipleOf\")\n        return !0;\n      r.kind === \"min\" ? (t === null || r.value > t) && (t = r.value) : r.kind === \"max\" && (e === null || r.value < e) && (e = r.value);\n    }\n    return Number.isFinite(t) && Number.isFinite(e);\n  }\n}\nCn.create = (s) => new Cn({\n  checks: [],\n  typeName: ke.ZodNumber,\n  coerce: (s == null ? void 0 : s.coerce) || !1,\n  ...Ve(s)\n});\nclass Jn extends Ye {\n  constructor() {\n    super(...arguments), this.min = this.gte, this.max = this.lte;\n  }\n  _parse(e) {\n    if (this._def.coerce)\n      try {\n        e.data = BigInt(e.data);\n      } catch {\n        return this._getInvalidInput(e);\n      }\n    if (this._getType(e) !== me.bigint)\n      return this._getInvalidInput(e);\n    let r;\n    const n = new wr();\n    for (const i of this._def.checks)\n      i.kind === \"min\" ? (i.inclusive ? e.data < i.value : e.data <= i.value) && (r = this._getOrReturnCtx(e, r), he(r, {\n        code: ae.too_small,\n        type: \"bigint\",\n        minimum: i.value,\n        inclusive: i.inclusive,\n        message: i.message\n      }), n.dirty()) : i.kind === \"max\" ? (i.inclusive ? e.data > i.value : e.data >= i.value) && (r = this._getOrReturnCtx(e, r), he(r, {\n        code: ae.too_big,\n        type: \"bigint\",\n        maximum: i.value,\n        inclusive: i.inclusive,\n        message: i.message\n      }), n.dirty()) : i.kind === \"multipleOf\" ? e.data % i.value !== BigInt(0) && (r = this._getOrReturnCtx(e, r), he(r, {\n        code: ae.not_multiple_of,\n        multipleOf: i.value,\n        message: i.message\n      }), n.dirty()) : Ze.assertNever(i);\n    return { status: n.value, value: e.data };\n  }\n  _getInvalidInput(e) {\n    const t = this._getOrReturnCtx(e);\n    return he(t, {\n      code: ae.invalid_type,\n      expected: me.bigint,\n      received: t.parsedType\n    }), Re;\n  }\n  gte(e, t) {\n    return this.setLimit(\"min\", e, !0, Ee.toString(t));\n  }\n  gt(e, t) {\n    return this.setLimit(\"min\", e, !1, Ee.toString(t));\n  }\n  lte(e, t) {\n    return this.setLimit(\"max\", e, !0, Ee.toString(t));\n  }\n  lt(e, t) {\n    return this.setLimit(\"max\", e, !1, Ee.toString(t));\n  }\n  setLimit(e, t, r, n) {\n    return new Jn({\n      ...this._def,\n      checks: [\n        ...this._def.checks,\n        {\n          kind: e,\n          value: t,\n          inclusive: r,\n          message: Ee.toString(n)\n        }\n      ]\n    });\n  }\n  _addCheck(e) {\n    return new Jn({\n      ...this._def,\n      checks: [...this._def.checks, e]\n    });\n  }\n  positive(e) {\n    return this._addCheck({\n      kind: \"min\",\n      value: BigInt(0),\n      inclusive: !1,\n      message: Ee.toString(e)\n    });\n  }\n  negative(e) {\n    return this._addCheck({\n      kind: \"max\",\n      value: BigInt(0),\n      inclusive: !1,\n      message: Ee.toString(e)\n    });\n  }\n  nonpositive(e) {\n    return this._addCheck({\n      kind: \"max\",\n      value: BigInt(0),\n      inclusive: !0,\n      message: Ee.toString(e)\n    });\n  }\n  nonnegative(e) {\n    return this._addCheck({\n      kind: \"min\",\n      value: BigInt(0),\n      inclusive: !0,\n      message: Ee.toString(e)\n    });\n  }\n  multipleOf(e, t) {\n    return this._addCheck({\n      kind: \"multipleOf\",\n      value: e,\n      message: Ee.toString(t)\n    });\n  }\n  get minValue() {\n    let e = null;\n    for (const t of this._def.checks)\n      t.kind === \"min\" && (e === null || t.value > e) && (e = t.value);\n    return e;\n  }\n  get maxValue() {\n    let e = null;\n    for (const t of this._def.checks)\n      t.kind === \"max\" && (e === null || t.value < e) && (e = t.value);\n    return e;\n  }\n}\nJn.create = (s) => new Jn({\n  checks: [],\n  typeName: ke.ZodBigInt,\n  coerce: (s == null ? void 0 : s.coerce) ?? !1,\n  ...Ve(s)\n});\nclass Hl extends Ye {\n  _parse(e) {\n    if (this._def.coerce && (e.data = !!e.data), this._getType(e) !== me.boolean) {\n      const r = this._getOrReturnCtx(e);\n      return he(r, {\n        code: ae.invalid_type,\n        expected: me.boolean,\n        received: r.parsedType\n      }), Re;\n    }\n    return Rr(e.data);\n  }\n}\nHl.create = (s) => new Hl({\n  typeName: ke.ZodBoolean,\n  coerce: (s == null ? void 0 : s.coerce) || !1,\n  ...Ve(s)\n});\nclass To extends Ye {\n  _parse(e) {\n    if (this._def.coerce && (e.data = new Date(e.data)), this._getType(e) !== me.date) {\n      const i = this._getOrReturnCtx(e);\n      return he(i, {\n        code: ae.invalid_type,\n        expected: me.date,\n        received: i.parsedType\n      }), Re;\n    }\n    if (Number.isNaN(e.data.getTime())) {\n      const i = this._getOrReturnCtx(e);\n      return he(i, {\n        code: ae.invalid_date\n      }), Re;\n    }\n    const r = new wr();\n    let n;\n    for (const i of this._def.checks)\n      i.kind === \"min\" ? e.data.getTime() < i.value && (n = this._getOrReturnCtx(e, n), he(n, {\n        code: ae.too_small,\n        message: i.message,\n        inclusive: !0,\n        exact: !1,\n        minimum: i.value,\n        type: \"date\"\n      }), r.dirty()) : i.kind === \"max\" ? e.data.getTime() > i.value && (n = this._getOrReturnCtx(e, n), he(n, {\n        code: ae.too_big,\n        message: i.message,\n        inclusive: !0,\n        exact: !1,\n        maximum: i.value,\n        type: \"date\"\n      }), r.dirty()) : Ze.assertNever(i);\n    return {\n      status: r.value,\n      value: new Date(e.data.getTime())\n    };\n  }\n  _addCheck(e) {\n    return new To({\n      ...this._def,\n      checks: [...this._def.checks, e]\n    });\n  }\n  min(e, t) {\n    return this._addCheck({\n      kind: \"min\",\n      value: e.getTime(),\n      message: Ee.toString(t)\n    });\n  }\n  max(e, t) {\n    return this._addCheck({\n      kind: \"max\",\n      value: e.getTime(),\n      message: Ee.toString(t)\n    });\n  }\n  get minDate() {\n    let e = null;\n    for (const t of this._def.checks)\n      t.kind === \"min\" && (e === null || t.value > e) && (e = t.value);\n    return e != null ? new Date(e) : null;\n  }\n  get maxDate() {\n    let e = null;\n    for (const t of this._def.checks)\n      t.kind === \"max\" && (e === null || t.value < e) && (e = t.value);\n    return e != null ? new Date(e) : null;\n  }\n}\nTo.create = (s) => new To({\n  checks: [],\n  coerce: (s == null ? void 0 : s.coerce) || !1,\n  typeName: ke.ZodDate,\n  ...Ve(s)\n});\nclass Qu extends Ye {\n  _parse(e) {\n    if (this._getType(e) !== me.symbol) {\n      const r = this._getOrReturnCtx(e);\n      return he(r, {\n        code: ae.invalid_type,\n        expected: me.symbol,\n        received: r.parsedType\n      }), Re;\n    }\n    return Rr(e.data);\n  }\n}\nQu.create = (s) => new Qu({\n  typeName: ke.ZodSymbol,\n  ...Ve(s)\n});\nclass ql extends Ye {\n  _parse(e) {\n    if (this._getType(e) !== me.undefined) {\n      const r = this._getOrReturnCtx(e);\n      return he(r, {\n        code: ae.invalid_type,\n        expected: me.undefined,\n        received: r.parsedType\n      }), Re;\n    }\n    return Rr(e.data);\n  }\n}\nql.create = (s) => new ql({\n  typeName: ke.ZodUndefined,\n  ...Ve(s)\n});\nclass Wl extends Ye {\n  _parse(e) {\n    if (this._getType(e) !== me.null) {\n      const r = this._getOrReturnCtx(e);\n      return he(r, {\n        code: ae.invalid_type,\n        expected: me.null,\n        received: r.parsedType\n      }), Re;\n    }\n    return Rr(e.data);\n  }\n}\nWl.create = (s) => new Wl({\n  typeName: ke.ZodNull,\n  ...Ve(s)\n});\nclass ed extends Ye {\n  constructor() {\n    super(...arguments), this._any = !0;\n  }\n  _parse(e) {\n    return Rr(e.data);\n  }\n}\ned.create = (s) => new ed({\n  typeName: ke.ZodAny,\n  ...Ve(s)\n});\nclass td extends Ye {\n  constructor() {\n    super(...arguments), this._unknown = !0;\n  }\n  _parse(e) {\n    return Rr(e.data);\n  }\n}\ntd.create = (s) => new td({\n  typeName: ke.ZodUnknown,\n  ...Ve(s)\n});\nclass Ps extends Ye {\n  _parse(e) {\n    const t = this._getOrReturnCtx(e);\n    return he(t, {\n      code: ae.invalid_type,\n      expected: me.never,\n      received: t.parsedType\n    }), Re;\n  }\n}\nPs.create = (s) => new Ps({\n  typeName: ke.ZodNever,\n  ...Ve(s)\n});\nclass rd extends Ye {\n  _parse(e) {\n    if (this._getType(e) !== me.undefined) {\n      const r = this._getOrReturnCtx(e);\n      return he(r, {\n        code: ae.invalid_type,\n        expected: me.void,\n        received: r.parsedType\n      }), Re;\n    }\n    return Rr(e.data);\n  }\n}\nrd.create = (s) => new rd({\n  typeName: ke.ZodVoid,\n  ...Ve(s)\n});\nclass Yr extends Ye {\n  _parse(e) {\n    const { ctx: t, status: r } = this._processInputParams(e), n = this._def;\n    if (t.parsedType !== me.array)\n      return he(t, {\n        code: ae.invalid_type,\n        expected: me.array,\n        received: t.parsedType\n      }), Re;\n    if (n.exactLength !== null) {\n      const o = t.data.length > n.exactLength.value, a = t.data.length < n.exactLength.value;\n      (o || a) && (he(t, {\n        code: o ? ae.too_big : ae.too_small,\n        minimum: a ? n.exactLength.value : void 0,\n        maximum: o ? n.exactLength.value : void 0,\n        type: \"array\",\n        inclusive: !0,\n        exact: !0,\n        message: n.exactLength.message\n      }), r.dirty());\n    }\n    if (n.minLength !== null && t.data.length < n.minLength.value && (he(t, {\n      code: ae.too_small,\n      minimum: n.minLength.value,\n      type: \"array\",\n      inclusive: !0,\n      exact: !1,\n      message: n.minLength.message\n    }), r.dirty()), n.maxLength !== null && t.data.length > n.maxLength.value && (he(t, {\n      code: ae.too_big,\n      maximum: n.maxLength.value,\n      type: \"array\",\n      inclusive: !0,\n      exact: !1,\n      message: n.maxLength.message\n    }), r.dirty()), t.common.async)\n      return Promise.all([...t.data].map((o, a) => n.type._parseAsync(new Ds(t, o, t.path, a)))).then((o) => wr.mergeArray(r, o));\n    const i = [...t.data].map((o, a) => n.type._parseSync(new Ds(t, o, t.path, a)));\n    return wr.mergeArray(r, i);\n  }\n  get element() {\n    return this._def.type;\n  }\n  min(e, t) {\n    return new Yr({\n      ...this._def,\n      minLength: { value: e, message: Ee.toString(t) }\n    });\n  }\n  max(e, t) {\n    return new Yr({\n      ...this._def,\n      maxLength: { value: e, message: Ee.toString(t) }\n    });\n  }\n  length(e, t) {\n    return new Yr({\n      ...this._def,\n      exactLength: { value: e, message: Ee.toString(t) }\n    });\n  }\n  nonempty(e) {\n    return this.min(1, e);\n  }\n}\nYr.create = (s, e) => new Yr({\n  type: s,\n  minLength: null,\n  maxLength: null,\n  exactLength: null,\n  typeName: ke.ZodArray,\n  ...Ve(e)\n});\nfunction mn(s) {\n  if (s instanceof $t) {\n    const e = {};\n    for (const t in s.shape) {\n      const r = s.shape[t];\n      e[t] = fs.create(mn(r));\n    }\n    return new $t({\n      ...s._def,\n      shape: () => e\n    });\n  } else return s instanceof Yr ? new Yr({\n    ...s._def,\n    type: mn(s.element)\n  }) : s instanceof fs ? fs.create(mn(s.unwrap())) : s instanceof Zs ? Zs.create(mn(s.unwrap())) : s instanceof Ws ? Ws.create(s.items.map((e) => mn(e))) : s;\n}\nclass $t extends Ye {\n  constructor() {\n    super(...arguments), this._cached = null, this.nonstrict = this.passthrough, this.augment = this.extend;\n  }\n  _getCached() {\n    if (this._cached !== null)\n      return this._cached;\n    const e = this._def.shape(), t = Ze.objectKeys(e);\n    return this._cached = { shape: e, keys: t }, this._cached;\n  }\n  _parse(e) {\n    if (this._getType(e) !== me.object) {\n      const c = this._getOrReturnCtx(e);\n      return he(c, {\n        code: ae.invalid_type,\n        expected: me.object,\n        received: c.parsedType\n      }), Re;\n    }\n    const { status: r, ctx: n } = this._processInputParams(e), { shape: i, keys: o } = this._getCached(), a = [];\n    if (!(this._def.catchall instanceof Ps && this._def.unknownKeys === \"strip\"))\n      for (const c in n.data)\n        o.includes(c) || a.push(c);\n    const l = [];\n    for (const c of o) {\n      const u = i[c], d = n.data[c];\n      l.push({\n        key: { status: \"valid\", value: c },\n        value: u._parse(new Ds(n, d, n.path, c)),\n        alwaysSet: c in n.data\n      });\n    }\n    if (this._def.catchall instanceof Ps) {\n      const c = this._def.unknownKeys;\n      if (c === \"passthrough\")\n        for (const u of a)\n          l.push({\n            key: { status: \"valid\", value: u },\n            value: { status: \"valid\", value: n.data[u] }\n          });\n      else if (c === \"strict\")\n        a.length > 0 && (he(n, {\n          code: ae.unrecognized_keys,\n          keys: a\n        }), r.dirty());\n      else if (c !== \"strip\") throw new Error(\"Internal ZodObject error: invalid unknownKeys value.\");\n    } else {\n      const c = this._def.catchall;\n      for (const u of a) {\n        const d = n.data[u];\n        l.push({\n          key: { status: \"valid\", value: u },\n          value: c._parse(\n            new Ds(n, d, n.path, u)\n            //, ctx.child(key), value, getParsedType(value)\n          ),\n          alwaysSet: u in n.data\n        });\n      }\n    }\n    return n.common.async ? Promise.resolve().then(async () => {\n      const c = [];\n      for (const u of l) {\n        const d = await u.key, h = await u.value;\n        c.push({\n          key: d,\n          value: h,\n          alwaysSet: u.alwaysSet\n        });\n      }\n      return c;\n    }).then((c) => wr.mergeObjectSync(r, c)) : wr.mergeObjectSync(r, l);\n  }\n  get shape() {\n    return this._def.shape();\n  }\n  strict(e) {\n    return Ee.errToObj, new $t({\n      ...this._def,\n      unknownKeys: \"strict\",\n      ...e !== void 0 ? {\n        errorMap: (t, r) => {\n          var i, o;\n          const n = ((o = (i = this._def).errorMap) == null ? void 0 : o.call(i, t, r).message) ?? r.defaultError;\n          return t.code === \"unrecognized_keys\" ? {\n            message: Ee.errToObj(e).message ?? n\n          } : {\n            message: n\n          };\n        }\n      } : {}\n    });\n  }\n  strip() {\n    return new $t({\n      ...this._def,\n      unknownKeys: \"strip\"\n    });\n  }\n  passthrough() {\n    return new $t({\n      ...this._def,\n      unknownKeys: \"passthrough\"\n    });\n  }\n  // const AugmentFactory =\n  //   <Def extends ZodObjectDef>(def: Def) =>\n  //   <Augmentation extends ZodRawShape>(\n  //     augmentation: Augmentation\n  //   ): ZodObject<\n  //     extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n  //     Def[\"unknownKeys\"],\n  //     Def[\"catchall\"]\n  //   > => {\n  //     return new ZodObject({\n  //       ...def,\n  //       shape: () => ({\n  //         ...def.shape(),\n  //         ...augmentation,\n  //       }),\n  //     }) as any;\n  //   };\n  extend(e) {\n    return new $t({\n      ...this._def,\n      shape: () => ({\n        ...this._def.shape(),\n        ...e\n      })\n    });\n  }\n  /**\n   * Prior to zod@1.0.12 there was a bug in the\n   * inferred type of merged objects. Please\n   * upgrade if you are experiencing issues.\n   */\n  merge(e) {\n    return new $t({\n      unknownKeys: e._def.unknownKeys,\n      catchall: e._def.catchall,\n      shape: () => ({\n        ...this._def.shape(),\n        ...e._def.shape()\n      }),\n      typeName: ke.ZodObject\n    });\n  }\n  // merge<\n  //   Incoming extends AnyZodObject,\n  //   Augmentation extends Incoming[\"shape\"],\n  //   NewOutput extends {\n  //     [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n  //       ? Augmentation[k][\"_output\"]\n  //       : k extends keyof Output\n  //       ? Output[k]\n  //       : never;\n  //   },\n  //   NewInput extends {\n  //     [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n  //       ? Augmentation[k][\"_input\"]\n  //       : k extends keyof Input\n  //       ? Input[k]\n  //       : never;\n  //   }\n  // >(\n  //   merging: Incoming\n  // ): ZodObject<\n  //   extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n  //   Incoming[\"_def\"][\"unknownKeys\"],\n  //   Incoming[\"_def\"][\"catchall\"],\n  //   NewOutput,\n  //   NewInput\n  // > {\n  //   const merged: any = new ZodObject({\n  //     unknownKeys: merging._def.unknownKeys,\n  //     catchall: merging._def.catchall,\n  //     shape: () =>\n  //       objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n  //     typeName: ZodFirstPartyTypeKind.ZodObject,\n  //   }) as any;\n  //   return merged;\n  // }\n  setKey(e, t) {\n    return this.augment({ [e]: t });\n  }\n  // merge<Incoming extends AnyZodObject>(\n  //   merging: Incoming\n  // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n  // ZodObject<\n  //   extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n  //   Incoming[\"_def\"][\"unknownKeys\"],\n  //   Incoming[\"_def\"][\"catchall\"]\n  // > {\n  //   // const mergedShape = objectUtil.mergeShapes(\n  //   //   this._def.shape(),\n  //   //   merging._def.shape()\n  //   // );\n  //   const merged: any = new ZodObject({\n  //     unknownKeys: merging._def.unknownKeys,\n  //     catchall: merging._def.catchall,\n  //     shape: () =>\n  //       objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n  //     typeName: ZodFirstPartyTypeKind.ZodObject,\n  //   }) as any;\n  //   return merged;\n  // }\n  catchall(e) {\n    return new $t({\n      ...this._def,\n      catchall: e\n    });\n  }\n  pick(e) {\n    const t = {};\n    for (const r of Ze.objectKeys(e))\n      e[r] && this.shape[r] && (t[r] = this.shape[r]);\n    return new $t({\n      ...this._def,\n      shape: () => t\n    });\n  }\n  omit(e) {\n    const t = {};\n    for (const r of Ze.objectKeys(this.shape))\n      e[r] || (t[r] = this.shape[r]);\n    return new $t({\n      ...this._def,\n      shape: () => t\n    });\n  }\n  /**\n   * @deprecated\n   */\n  deepPartial() {\n    return mn(this);\n  }\n  partial(e) {\n    const t = {};\n    for (const r of Ze.objectKeys(this.shape)) {\n      const n = this.shape[r];\n      e && !e[r] ? t[r] = n : t[r] = n.optional();\n    }\n    return new $t({\n      ...this._def,\n      shape: () => t\n    });\n  }\n  required(e) {\n    const t = {};\n    for (const r of Ze.objectKeys(this.shape))\n      if (e && !e[r])\n        t[r] = this.shape[r];\n      else {\n        let i = this.shape[r];\n        for (; i instanceof fs; )\n          i = i._def.innerType;\n        t[r] = i;\n      }\n    return new $t({\n      ...this._def,\n      shape: () => t\n    });\n  }\n  keyof() {\n    return Nf(Ze.objectKeys(this.shape));\n  }\n}\n$t.create = (s, e) => new $t({\n  shape: () => s,\n  unknownKeys: \"strip\",\n  catchall: Ps.create(),\n  typeName: ke.ZodObject,\n  ...Ve(e)\n});\n$t.strictCreate = (s, e) => new $t({\n  shape: () => s,\n  unknownKeys: \"strict\",\n  catchall: Ps.create(),\n  typeName: ke.ZodObject,\n  ...Ve(e)\n});\n$t.lazycreate = (s, e) => new $t({\n  shape: s,\n  unknownKeys: \"strip\",\n  catchall: Ps.create(),\n  typeName: ke.ZodObject,\n  ...Ve(e)\n});\nclass wo extends Ye {\n  _parse(e) {\n    const { ctx: t } = this._processInputParams(e), r = this._def.options;\n    function n(i) {\n      for (const a of i)\n        if (a.result.status === \"valid\")\n          return a.result;\n      for (const a of i)\n        if (a.result.status === \"dirty\")\n          return t.common.issues.push(...a.ctx.common.issues), a.result;\n      const o = i.map((a) => new ps(a.ctx.common.issues));\n      return he(t, {\n        code: ae.invalid_union,\n        unionErrors: o\n      }), Re;\n    }\n    if (t.common.async)\n      return Promise.all(r.map(async (i) => {\n        const o = {\n          ...t,\n          common: {\n            ...t.common,\n            issues: []\n          },\n          parent: null\n        };\n        return {\n          result: await i._parseAsync({\n            data: t.data,\n            path: t.path,\n            parent: o\n          }),\n          ctx: o\n        };\n      })).then(n);\n    {\n      let i;\n      const o = [];\n      for (const l of r) {\n        const c = {\n          ...t,\n          common: {\n            ...t.common,\n            issues: []\n          },\n          parent: null\n        }, u = l._parseSync({\n          data: t.data,\n          path: t.path,\n          parent: c\n        });\n        if (u.status === \"valid\")\n          return u;\n        u.status === \"dirty\" && !i && (i = { result: u, ctx: c }), c.common.issues.length && o.push(c.common.issues);\n      }\n      if (i)\n        return t.common.issues.push(...i.ctx.common.issues), i.result;\n      const a = o.map((l) => new ps(l));\n      return he(t, {\n        code: ae.invalid_union,\n        unionErrors: a\n      }), Re;\n    }\n  }\n  get options() {\n    return this._def.options;\n  }\n}\nwo.create = (s, e) => new wo({\n  options: s,\n  typeName: ke.ZodUnion,\n  ...Ve(e)\n});\nconst os = (s) => s instanceof Yl ? os(s.schema) : s instanceof Ys ? os(s.innerType()) : s instanceof Io ? [s.value] : s instanceof zs ? s.options : s instanceof Zl ? Ze.objectValues(s.enum) : s instanceof Ro ? os(s._def.innerType) : s instanceof ql ? [void 0] : s instanceof Wl ? [null] : s instanceof fs ? [void 0, ...os(s.unwrap())] : s instanceof Zs ? [null, ...os(s.unwrap())] : s instanceof Uf || s instanceof Co ? os(s.unwrap()) : s instanceof Lo ? os(s._def.innerType) : [];\nclass Uc extends Ye {\n  _parse(e) {\n    const { ctx: t } = this._processInputParams(e);\n    if (t.parsedType !== me.object)\n      return he(t, {\n        code: ae.invalid_type,\n        expected: me.object,\n        received: t.parsedType\n      }), Re;\n    const r = this.discriminator, n = t.data[r], i = this.optionsMap.get(n);\n    return i ? t.common.async ? i._parseAsync({\n      data: t.data,\n      path: t.path,\n      parent: t\n    }) : i._parseSync({\n      data: t.data,\n      path: t.path,\n      parent: t\n    }) : (he(t, {\n      code: ae.invalid_union_discriminator,\n      options: Array.from(this.optionsMap.keys()),\n      path: [r]\n    }), Re);\n  }\n  get discriminator() {\n    return this._def.discriminator;\n  }\n  get options() {\n    return this._def.options;\n  }\n  get optionsMap() {\n    return this._def.optionsMap;\n  }\n  /**\n   * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n   * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n   * have a different value for each object in the union.\n   * @param discriminator the name of the discriminator property\n   * @param types an array of object schemas\n   * @param params\n   */\n  static create(e, t, r) {\n    const n = /* @__PURE__ */ new Map();\n    for (const i of t) {\n      const o = os(i.shape[e]);\n      if (!o.length)\n        throw new Error(`A discriminator value for key \\`${e}\\` could not be extracted from all schema options`);\n      for (const a of o) {\n        if (n.has(a))\n          throw new Error(`Discriminator property ${String(e)} has duplicate value ${String(a)}`);\n        n.set(a, i);\n      }\n    }\n    return new Uc({\n      typeName: ke.ZodDiscriminatedUnion,\n      discriminator: e,\n      options: t,\n      optionsMap: n,\n      ...Ve(r)\n    });\n  }\n}\nfunction zl(s, e) {\n  const t = ws(s), r = ws(e);\n  if (s === e)\n    return { valid: !0, data: s };\n  if (t === me.object && r === me.object) {\n    const n = Ze.objectKeys(e), i = Ze.objectKeys(s).filter((a) => n.indexOf(a) !== -1), o = { ...s, ...e };\n    for (const a of i) {\n      const l = zl(s[a], e[a]);\n      if (!l.valid)\n        return { valid: !1 };\n      o[a] = l.data;\n    }\n    return { valid: !0, data: o };\n  } else if (t === me.array && r === me.array) {\n    if (s.length !== e.length)\n      return { valid: !1 };\n    const n = [];\n    for (let i = 0; i < s.length; i++) {\n      const o = s[i], a = e[i], l = zl(o, a);\n      if (!l.valid)\n        return { valid: !1 };\n      n.push(l.data);\n    }\n    return { valid: !0, data: n };\n  } else return t === me.date && r === me.date && +s == +e ? { valid: !0, data: s } : { valid: !1 };\n}\nclass Ao extends Ye {\n  _parse(e) {\n    const { status: t, ctx: r } = this._processInputParams(e), n = (i, o) => {\n      if (Zu(i) || Zu(o))\n        return Re;\n      const a = zl(i.value, o.value);\n      return a.valid ? ((Xu(i) || Xu(o)) && t.dirty(), { status: t.value, value: a.data }) : (he(r, {\n        code: ae.invalid_intersection_types\n      }), Re);\n    };\n    return r.common.async ? Promise.all([\n      this._def.left._parseAsync({\n        data: r.data,\n        path: r.path,\n        parent: r\n      }),\n      this._def.right._parseAsync({\n        data: r.data,\n        path: r.path,\n        parent: r\n      })\n    ]).then(([i, o]) => n(i, o)) : n(this._def.left._parseSync({\n      data: r.data,\n      path: r.path,\n      parent: r\n    }), this._def.right._parseSync({\n      data: r.data,\n      path: r.path,\n      parent: r\n    }));\n  }\n}\nAo.create = (s, e, t) => new Ao({\n  left: s,\n  right: e,\n  typeName: ke.ZodIntersection,\n  ...Ve(t)\n});\nclass Ws extends Ye {\n  _parse(e) {\n    const { status: t, ctx: r } = this._processInputParams(e);\n    if (r.parsedType !== me.array)\n      return he(r, {\n        code: ae.invalid_type,\n        expected: me.array,\n        received: r.parsedType\n      }), Re;\n    if (r.data.length < this._def.items.length)\n      return he(r, {\n        code: ae.too_small,\n        minimum: this._def.items.length,\n        inclusive: !0,\n        exact: !1,\n        type: \"array\"\n      }), Re;\n    !this._def.rest && r.data.length > this._def.items.length && (he(r, {\n      code: ae.too_big,\n      maximum: this._def.items.length,\n      inclusive: !0,\n      exact: !1,\n      type: \"array\"\n    }), t.dirty());\n    const i = [...r.data].map((o, a) => {\n      const l = this._def.items[a] || this._def.rest;\n      return l ? l._parse(new Ds(r, o, r.path, a)) : null;\n    }).filter((o) => !!o);\n    return r.common.async ? Promise.all(i).then((o) => wr.mergeArray(t, o)) : wr.mergeArray(t, i);\n  }\n  get items() {\n    return this._def.items;\n  }\n  rest(e) {\n    return new Ws({\n      ...this._def,\n      rest: e\n    });\n  }\n}\nWs.create = (s, e) => {\n  if (!Array.isArray(s))\n    throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n  return new Ws({\n    items: s,\n    typeName: ke.ZodTuple,\n    rest: null,\n    ...Ve(e)\n  });\n};\nclass sd extends Ye {\n  get keySchema() {\n    return this._def.keyType;\n  }\n  get valueSchema() {\n    return this._def.valueType;\n  }\n  _parse(e) {\n    const { status: t, ctx: r } = this._processInputParams(e);\n    if (r.parsedType !== me.map)\n      return he(r, {\n        code: ae.invalid_type,\n        expected: me.map,\n        received: r.parsedType\n      }), Re;\n    const n = this._def.keyType, i = this._def.valueType, o = [...r.data.entries()].map(([a, l], c) => ({\n      key: n._parse(new Ds(r, a, r.path, [c, \"key\"])),\n      value: i._parse(new Ds(r, l, r.path, [c, \"value\"]))\n    }));\n    if (r.common.async) {\n      const a = /* @__PURE__ */ new Map();\n      return Promise.resolve().then(async () => {\n        for (const l of o) {\n          const c = await l.key, u = await l.value;\n          if (c.status === \"aborted\" || u.status === \"aborted\")\n            return Re;\n          (c.status === \"dirty\" || u.status === \"dirty\") && t.dirty(), a.set(c.value, u.value);\n        }\n        return { status: t.value, value: a };\n      });\n    } else {\n      const a = /* @__PURE__ */ new Map();\n      for (const l of o) {\n        const c = l.key, u = l.value;\n        if (c.status === \"aborted\" || u.status === \"aborted\")\n          return Re;\n        (c.status === \"dirty\" || u.status === \"dirty\") && t.dirty(), a.set(c.value, u.value);\n      }\n      return { status: t.value, value: a };\n    }\n  }\n}\nsd.create = (s, e, t) => new sd({\n  valueType: e,\n  keyType: s,\n  typeName: ke.ZodMap,\n  ...Ve(t)\n});\nclass Qn extends Ye {\n  _parse(e) {\n    const { status: t, ctx: r } = this._processInputParams(e);\n    if (r.parsedType !== me.set)\n      return he(r, {\n        code: ae.invalid_type,\n        expected: me.set,\n        received: r.parsedType\n      }), Re;\n    const n = this._def;\n    n.minSize !== null && r.data.size < n.minSize.value && (he(r, {\n      code: ae.too_small,\n      minimum: n.minSize.value,\n      type: \"set\",\n      inclusive: !0,\n      exact: !1,\n      message: n.minSize.message\n    }), t.dirty()), n.maxSize !== null && r.data.size > n.maxSize.value && (he(r, {\n      code: ae.too_big,\n      maximum: n.maxSize.value,\n      type: \"set\",\n      inclusive: !0,\n      exact: !1,\n      message: n.maxSize.message\n    }), t.dirty());\n    const i = this._def.valueType;\n    function o(l) {\n      const c = /* @__PURE__ */ new Set();\n      for (const u of l) {\n        if (u.status === \"aborted\")\n          return Re;\n        u.status === \"dirty\" && t.dirty(), c.add(u.value);\n      }\n      return { status: t.value, value: c };\n    }\n    const a = [...r.data.values()].map((l, c) => i._parse(new Ds(r, l, r.path, c)));\n    return r.common.async ? Promise.all(a).then((l) => o(l)) : o(a);\n  }\n  min(e, t) {\n    return new Qn({\n      ...this._def,\n      minSize: { value: e, message: Ee.toString(t) }\n    });\n  }\n  max(e, t) {\n    return new Qn({\n      ...this._def,\n      maxSize: { value: e, message: Ee.toString(t) }\n    });\n  }\n  size(e, t) {\n    return this.min(e, t).max(e, t);\n  }\n  nonempty(e) {\n    return this.min(1, e);\n  }\n}\nQn.create = (s, e) => new Qn({\n  valueType: s,\n  minSize: null,\n  maxSize: null,\n  typeName: ke.ZodSet,\n  ...Ve(e)\n});\nclass Yl extends Ye {\n  get schema() {\n    return this._def.getter();\n  }\n  _parse(e) {\n    const { ctx: t } = this._processInputParams(e);\n    return this._def.getter()._parse({ data: t.data, path: t.path, parent: t });\n  }\n}\nYl.create = (s, e) => new Yl({\n  getter: s,\n  typeName: ke.ZodLazy,\n  ...Ve(e)\n});\nclass Io extends Ye {\n  _parse(e) {\n    if (e.data !== this._def.value) {\n      const t = this._getOrReturnCtx(e);\n      return he(t, {\n        received: t.data,\n        code: ae.invalid_literal,\n        expected: this._def.value\n      }), Re;\n    }\n    return { status: \"valid\", value: e.data };\n  }\n  get value() {\n    return this._def.value;\n  }\n}\nIo.create = (s, e) => new Io({\n  value: s,\n  typeName: ke.ZodLiteral,\n  ...Ve(e)\n});\nfunction Nf(s, e) {\n  return new zs({\n    values: s,\n    typeName: ke.ZodEnum,\n    ...Ve(e)\n  });\n}\nclass zs extends Ye {\n  _parse(e) {\n    if (typeof e.data != \"string\") {\n      const t = this._getOrReturnCtx(e), r = this._def.values;\n      return he(t, {\n        expected: Ze.joinValues(r),\n        received: t.parsedType,\n        code: ae.invalid_type\n      }), Re;\n    }\n    if (this._cache || (this._cache = new Set(this._def.values)), !this._cache.has(e.data)) {\n      const t = this._getOrReturnCtx(e), r = this._def.values;\n      return he(t, {\n        received: t.data,\n        code: ae.invalid_enum_value,\n        options: r\n      }), Re;\n    }\n    return Rr(e.data);\n  }\n  get options() {\n    return this._def.values;\n  }\n  get enum() {\n    const e = {};\n    for (const t of this._def.values)\n      e[t] = t;\n    return e;\n  }\n  get Values() {\n    const e = {};\n    for (const t of this._def.values)\n      e[t] = t;\n    return e;\n  }\n  get Enum() {\n    const e = {};\n    for (const t of this._def.values)\n      e[t] = t;\n    return e;\n  }\n  extract(e, t = this._def) {\n    return zs.create(e, {\n      ...this._def,\n      ...t\n    });\n  }\n  exclude(e, t = this._def) {\n    return zs.create(this.options.filter((r) => !e.includes(r)), {\n      ...this._def,\n      ...t\n    });\n  }\n}\nzs.create = Nf;\nclass Zl extends Ye {\n  _parse(e) {\n    const t = Ze.getValidEnumValues(this._def.values), r = this._getOrReturnCtx(e);\n    if (r.parsedType !== me.string && r.parsedType !== me.number) {\n      const n = Ze.objectValues(t);\n      return he(r, {\n        expected: Ze.joinValues(n),\n        received: r.parsedType,\n        code: ae.invalid_type\n      }), Re;\n    }\n    if (this._cache || (this._cache = new Set(Ze.getValidEnumValues(this._def.values))), !this._cache.has(e.data)) {\n      const n = Ze.objectValues(t);\n      return he(r, {\n        received: r.data,\n        code: ae.invalid_enum_value,\n        options: n\n      }), Re;\n    }\n    return Rr(e.data);\n  }\n  get enum() {\n    return this._def.values;\n  }\n}\nZl.create = (s, e) => new Zl({\n  values: s,\n  typeName: ke.ZodNativeEnum,\n  ...Ve(e)\n});\nclass _o extends Ye {\n  unwrap() {\n    return this._def.type;\n  }\n  _parse(e) {\n    const { ctx: t } = this._processInputParams(e);\n    if (t.parsedType !== me.promise && t.common.async === !1)\n      return he(t, {\n        code: ae.invalid_type,\n        expected: me.promise,\n        received: t.parsedType\n      }), Re;\n    const r = t.parsedType === me.promise ? t.data : Promise.resolve(t.data);\n    return Rr(r.then((n) => this._def.type.parseAsync(n, {\n      path: t.path,\n      errorMap: t.common.contextualErrorMap\n    })));\n  }\n}\n_o.create = (s, e) => new _o({\n  type: s,\n  typeName: ke.ZodPromise,\n  ...Ve(e)\n});\nclass Ys extends Ye {\n  innerType() {\n    return this._def.schema;\n  }\n  sourceType() {\n    return this._def.schema._def.typeName === ke.ZodEffects ? this._def.schema.sourceType() : this._def.schema;\n  }\n  _parse(e) {\n    const { status: t, ctx: r } = this._processInputParams(e), n = this._def.effect || null, i = {\n      addIssue: (o) => {\n        he(r, o), o.fatal ? t.abort() : t.dirty();\n      },\n      get path() {\n        return r.path;\n      }\n    };\n    if (i.addIssue = i.addIssue.bind(i), n.type === \"preprocess\") {\n      const o = n.transform(r.data, i);\n      if (r.common.async)\n        return Promise.resolve(o).then(async (a) => {\n          if (t.value === \"aborted\")\n            return Re;\n          const l = await this._def.schema._parseAsync({\n            data: a,\n            path: r.path,\n            parent: r\n          });\n          return l.status === \"aborted\" ? Re : l.status === \"dirty\" || t.value === \"dirty\" ? Wn(l.value) : l;\n        });\n      {\n        if (t.value === \"aborted\")\n          return Re;\n        const a = this._def.schema._parseSync({\n          data: o,\n          path: r.path,\n          parent: r\n        });\n        return a.status === \"aborted\" ? Re : a.status === \"dirty\" || t.value === \"dirty\" ? Wn(a.value) : a;\n      }\n    }\n    if (n.type === \"refinement\") {\n      const o = (a) => {\n        const l = n.refinement(a, i);\n        if (r.common.async)\n          return Promise.resolve(l);\n        if (l instanceof Promise)\n          throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n        return a;\n      };\n      if (r.common.async === !1) {\n        const a = this._def.schema._parseSync({\n          data: r.data,\n          path: r.path,\n          parent: r\n        });\n        return a.status === \"aborted\" ? Re : (a.status === \"dirty\" && t.dirty(), o(a.value), { status: t.value, value: a.value });\n      } else\n        return this._def.schema._parseAsync({ data: r.data, path: r.path, parent: r }).then((a) => a.status === \"aborted\" ? Re : (a.status === \"dirty\" && t.dirty(), o(a.value).then(() => ({ status: t.value, value: a.value }))));\n    }\n    if (n.type === \"transform\")\n      if (r.common.async === !1) {\n        const o = this._def.schema._parseSync({\n          data: r.data,\n          path: r.path,\n          parent: r\n        });\n        if (!Ln(o))\n          return Re;\n        const a = n.transform(o.value, i);\n        if (a instanceof Promise)\n          throw new Error(\"Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.\");\n        return { status: t.value, value: a };\n      } else\n        return this._def.schema._parseAsync({ data: r.data, path: r.path, parent: r }).then((o) => Ln(o) ? Promise.resolve(n.transform(o.value, i)).then((a) => ({\n          status: t.value,\n          value: a\n        })) : Re);\n    Ze.assertNever(n);\n  }\n}\nYs.create = (s, e, t) => new Ys({\n  schema: s,\n  typeName: ke.ZodEffects,\n  effect: e,\n  ...Ve(t)\n});\nYs.createWithPreprocess = (s, e, t) => new Ys({\n  schema: e,\n  effect: { type: \"preprocess\", transform: s },\n  typeName: ke.ZodEffects,\n  ...Ve(t)\n});\nclass fs extends Ye {\n  _parse(e) {\n    return this._getType(e) === me.undefined ? Rr(void 0) : this._def.innerType._parse(e);\n  }\n  unwrap() {\n    return this._def.innerType;\n  }\n}\nfs.create = (s, e) => new fs({\n  innerType: s,\n  typeName: ke.ZodOptional,\n  ...Ve(e)\n});\nclass Zs extends Ye {\n  _parse(e) {\n    return this._getType(e) === me.null ? Rr(null) : this._def.innerType._parse(e);\n  }\n  unwrap() {\n    return this._def.innerType;\n  }\n}\nZs.create = (s, e) => new Zs({\n  innerType: s,\n  typeName: ke.ZodNullable,\n  ...Ve(e)\n});\nclass Ro extends Ye {\n  _parse(e) {\n    const { ctx: t } = this._processInputParams(e);\n    let r = t.data;\n    return t.parsedType === me.undefined && (r = this._def.defaultValue()), this._def.innerType._parse({\n      data: r,\n      path: t.path,\n      parent: t\n    });\n  }\n  removeDefault() {\n    return this._def.innerType;\n  }\n}\nRo.create = (s, e) => new Ro({\n  innerType: s,\n  typeName: ke.ZodDefault,\n  defaultValue: typeof e.default == \"function\" ? e.default : () => e.default,\n  ...Ve(e)\n});\nclass Lo extends Ye {\n  _parse(e) {\n    const { ctx: t } = this._processInputParams(e), r = {\n      ...t,\n      common: {\n        ...t.common,\n        issues: []\n      }\n    }, n = this._def.innerType._parse({\n      data: r.data,\n      path: r.path,\n      parent: {\n        ...r\n      }\n    });\n    return bo(n) ? n.then((i) => ({\n      status: \"valid\",\n      value: i.status === \"valid\" ? i.value : this._def.catchValue({\n        get error() {\n          return new ps(r.common.issues);\n        },\n        input: r.data\n      })\n    })) : {\n      status: \"valid\",\n      value: n.status === \"valid\" ? n.value : this._def.catchValue({\n        get error() {\n          return new ps(r.common.issues);\n        },\n        input: r.data\n      })\n    };\n  }\n  removeCatch() {\n    return this._def.innerType;\n  }\n}\nLo.create = (s, e) => new Lo({\n  innerType: s,\n  typeName: ke.ZodCatch,\n  catchValue: typeof e.catch == \"function\" ? e.catch : () => e.catch,\n  ...Ve(e)\n});\nclass nd extends Ye {\n  _parse(e) {\n    if (this._getType(e) !== me.nan) {\n      const r = this._getOrReturnCtx(e);\n      return he(r, {\n        code: ae.invalid_type,\n        expected: me.nan,\n        received: r.parsedType\n      }), Re;\n    }\n    return { status: \"valid\", value: e.data };\n  }\n}\nnd.create = (s) => new nd({\n  typeName: ke.ZodNaN,\n  ...Ve(s)\n});\nclass Uf extends Ye {\n  _parse(e) {\n    const { ctx: t } = this._processInputParams(e), r = t.data;\n    return this._def.type._parse({\n      data: r,\n      path: t.path,\n      parent: t\n    });\n  }\n  unwrap() {\n    return this._def.type;\n  }\n}\nclass $c extends Ye {\n  _parse(e) {\n    const { status: t, ctx: r } = this._processInputParams(e);\n    if (r.common.async)\n      return (async () => {\n        const i = await this._def.in._parseAsync({\n          data: r.data,\n          path: r.path,\n          parent: r\n        });\n        return i.status === \"aborted\" ? Re : i.status === \"dirty\" ? (t.dirty(), Wn(i.value)) : this._def.out._parseAsync({\n          data: i.value,\n          path: r.path,\n          parent: r\n        });\n      })();\n    {\n      const n = this._def.in._parseSync({\n        data: r.data,\n        path: r.path,\n        parent: r\n      });\n      return n.status === \"aborted\" ? Re : n.status === \"dirty\" ? (t.dirty(), {\n        status: \"dirty\",\n        value: n.value\n      }) : this._def.out._parseSync({\n        data: n.value,\n        path: r.path,\n        parent: r\n      });\n    }\n  }\n  static create(e, t) {\n    return new $c({\n      in: e,\n      out: t,\n      typeName: ke.ZodPipeline\n    });\n  }\n}\nclass Co extends Ye {\n  _parse(e) {\n    const t = this._def.innerType._parse(e), r = (n) => (Ln(n) && (n.value = Object.freeze(n.value)), n);\n    return bo(t) ? t.then((n) => r(n)) : r(t);\n  }\n  unwrap() {\n    return this._def.innerType;\n  }\n}\nCo.create = (s, e) => new Co({\n  innerType: s,\n  typeName: ke.ZodReadonly,\n  ...Ve(e)\n});\nvar ke;\n(function(s) {\n  s.ZodString = \"ZodString\", s.ZodNumber = \"ZodNumber\", s.ZodNaN = \"ZodNaN\", s.ZodBigInt = \"ZodBigInt\", s.ZodBoolean = \"ZodBoolean\", s.ZodDate = \"ZodDate\", s.ZodSymbol = \"ZodSymbol\", s.ZodUndefined = \"ZodUndefined\", s.ZodNull = \"ZodNull\", s.ZodAny = \"ZodAny\", s.ZodUnknown = \"ZodUnknown\", s.ZodNever = \"ZodNever\", s.ZodVoid = \"ZodVoid\", s.ZodArray = \"ZodArray\", s.ZodObject = \"ZodObject\", s.ZodUnion = \"ZodUnion\", s.ZodDiscriminatedUnion = \"ZodDiscriminatedUnion\", s.ZodIntersection = \"ZodIntersection\", s.ZodTuple = \"ZodTuple\", s.ZodRecord = \"ZodRecord\", s.ZodMap = \"ZodMap\", s.ZodSet = \"ZodSet\", s.ZodFunction = \"ZodFunction\", s.ZodLazy = \"ZodLazy\", s.ZodLiteral = \"ZodLiteral\", s.ZodEnum = \"ZodEnum\", s.ZodEffects = \"ZodEffects\", s.ZodNativeEnum = \"ZodNativeEnum\", s.ZodOptional = \"ZodOptional\", s.ZodNullable = \"ZodNullable\", s.ZodDefault = \"ZodDefault\", s.ZodCatch = \"ZodCatch\", s.ZodPromise = \"ZodPromise\", s.ZodBranded = \"ZodBranded\", s.ZodPipeline = \"ZodPipeline\", s.ZodReadonly = \"ZodReadonly\";\n})(ke || (ke = {}));\nconst xt = Rs.create, $f = Cn.create, Qm = Hl.create;\nPs.create;\nconst Ks = Yr.create, Jt = $t.create, ko = wo.create, Gf = Uc.create;\nAo.create;\nWs.create;\nconst ir = Io.create, Gc = zs.create;\n_o.create;\nfs.create;\nZs.create;\nconst e1 = /[@#$%^&*+=/\\\\|~«»]/, t1 = /(!{2,}|\\?{2,}|-{2,})/, r1 = /[\\u{1F300}-\\u{1F9FF}]|[\\u{2702}-\\u{27B0}]|[\\u{2600}-\\u{26FF}]|[\\u{2B00}-\\u{2BFF}]/u, $n = ({ max: s, noSpaces: e } = {}) => (e ? xt().max(s ?? Number.POSITIVE_INFINITY).regex(/^\\S*$/, \"Spaces are not allowed\") : xt().max(s ?? Number.POSITIVE_INFINITY)).refine((r) => !r1.test(r), {\n  message: \"Emojis and symbols are not allowed\"\n}).refine((r) => !e1.test(r), {\n  message: \"Special characters (@, #, $, %, ^, &, *, +, =, /, \\\\, |, ~, «, ») are not allowed\"\n}).refine((r) => !t1.test(r), {\n  message: \"Repeated punctuations (!!, ??, --) are not allowed\"\n}), or = xt().url().startsWith(\"https://\", { message: \"Must be an https url\" }).max(1024).refine((s) => !s.includes(\" \"), {\n  message: \"URL must not contain spaces\"\n}).refine((s) => {\n  try {\n    const e = new URL(s).hostname;\n    return !(e === \"localhost\" || e.endsWith(\".localhost\") || /^(\\d{1,3}\\.){3}\\d{1,3}$/.test(e) || e.startsWith(\"[\") && e.endsWith(\"]\"));\n  } catch {\n    return !1;\n  }\n}, {\n  message: \"URL must not use IP addresses or localhost\"\n}), Vc = xt().max(32), Vf = xt().max(32), s1 = /^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}\\/(?:[-a-z0-9]{3,8}:[-.%a-zA-Z0-9]{1,128}(?:\\/[-.%a-zA-Z0-9]{1,78})?|native)$/, n1 = xt().regex(s1, { message: \"Invalid CAIP-19 asset ID\" }), jc = xt().regex(/^#([0-9A-F]{3}|[0-9A-F]{6})$/i, {\n  message: \"Invalid hex color code. It should be in the format #RRGGBB or #RGB.\"\n}), i1 = /^(?!.*\\.\\.)([a-zA-Z0-9]([a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}$/, o1 = xt().max(1024).regex(i1, {\n  message: \"Must be a valid domain name (e.g., example.com, sub.example.com)\"\n}).refine((s) => !s.includes(\"://\"), {\n  message: \"Domain must not include protocol (http://, https://, etc.)\"\n}).refine((s) => !s.includes(\"/\"), {\n  message: \"Domain must not include path separators\"\n}).refine((s) => !s.includes(\"@\"), {\n  message: \"Domain must not include @ symbol\"\n}).refine((s) => !s.includes(\":\"), {\n  message: \"Domain must not include port numbers\"\n}), a1 = ko([ir(\"1:1\"), ir(\"3:2\")]), l1 = Jt({\n  header: xt(),\n  payload: xt(),\n  signature: xt()\n});\nJt({\n  fid: $f(),\n  type: ir(\"app_key\"),\n  key: xt().startsWith(\"0x\")\n});\nconst c1 = Jt({\n  type: ir(\"launch_frame\"),\n  name: Vc,\n  url: or.optional(),\n  splashImageUrl: or.optional(),\n  splashBackgroundColor: jc.optional()\n}), u1 = Jt({\n  type: ir(\"launch_miniapp\"),\n  name: Vc,\n  url: or.optional(),\n  splashImageUrl: or.optional(),\n  splashBackgroundColor: jc.optional()\n}), d1 = Jt({\n  type: ir(\"view_token\"),\n  token: n1\n}), h1 = Gf(\"type\", [\n  u1,\n  d1,\n  // Remove after compatibility period\n  c1\n]), f1 = Jt({\n  title: Vf,\n  action: h1\n});\nJt({\n  version: ko([xt(), $f()]).transform((s) => String(s)).pipe(ko([ir(\"next\"), ir(\"1\")])),\n  imageUrl: or,\n  aspectRatio: a1.optional(),\n  button: f1\n});\nconst jf = Jt({\n  url: xt(),\n  token: xt()\n});\nJt({\n  notificationId: xt().max(128),\n  title: xt().max(32),\n  body: xt().max(128),\n  targetUrl: or,\n  tokens: xt().array().max(100)\n});\nJt({\n  result: Jt({\n    successfulTokens: Ks(xt()),\n    invalidTokens: Ks(xt()),\n    rateLimitedTokens: Ks(xt())\n  })\n});\nconst g1 = Jt({\n  event: ir(\"miniapp_added\"),\n  notificationDetails: jf.optional()\n}), p1 = Jt({\n  event: ir(\"miniapp_removed\")\n}), m1 = Jt({\n  event: ir(\"notifications_enabled\"),\n  notificationDetails: jf.required()\n}), y1 = Jt({\n  event: ir(\"notifications_disabled\")\n});\nGf(\"event\", [\n  g1,\n  p1,\n  m1,\n  y1\n]);\nconst v1 = [\n  \"wallet.getEthereumProvider\",\n  \"wallet.getSolanaProvider\",\n  \"actions.ready\",\n  \"actions.openUrl\",\n  \"actions.close\",\n  \"actions.setPrimaryButton\",\n  \"actions.addMiniApp\",\n  \"actions.signIn\",\n  \"actions.viewCast\",\n  \"actions.viewProfile\",\n  \"actions.composeCast\",\n  \"actions.viewToken\",\n  \"actions.sendToken\",\n  \"actions.swapToken\",\n  \"actions.openMiniApp\",\n  \"actions.requestCameraAndMicrophoneAccess\",\n  \"experimental.signManifest\",\n  \"haptics.impactOccurred\",\n  \"haptics.notificationOccurred\",\n  \"haptics.selectionChanged\",\n  \"back\"\n], E1 = [\n  \"games\",\n  \"social\",\n  \"finance\",\n  \"utility\",\n  \"productivity\",\n  \"health-fitness\",\n  \"news-media\",\n  \"music\",\n  \"shopping\",\n  \"education\",\n  \"developer-tools\",\n  \"entertainment\",\n  \"art-creativity\"\n], x1 = Gc(E1), S1 = ko([\n  ir(\"0.0.0\"),\n  ir(\"0.0.1\"),\n  ir(\"1\"),\n  ir(\"next\")\n]), b1 = $n({ max: 30 }), T1 = $n({ max: 170 }), w1 = Ks(or).max(3), A1 = Ks($n({ max: 20, noSpaces: !0 })).max(5), I1 = $n({ max: 30 }), _1 = $n({ max: 30 }), R1 = $n({ max: 100 }), L1 = Qm(), C1 = [\n  \"eip155:1\",\n  // Ethereum mainnet\n  \"eip155:8453\",\n  // Base mainnet\n  \"eip155:42161\",\n  // Arbitrum One\n  \"eip155:421614\",\n  // Arbitrum Sepolia\n  \"eip155:84532\",\n  // Base Sepolia\n  \"eip155:666666666\",\n  // Degen\n  \"eip155:100\",\n  // Gnosis\n  \"eip155:10\",\n  // Optimism\n  \"eip155:11155420\",\n  // Optimism Sepolia\n  \"eip155:137\",\n  // Polygon\n  \"eip155:11155111\",\n  // Ethereum Sepolia\n  \"eip155:7777777\",\n  // Zora\n  \"eip155:130\",\n  // Unichain\n  \"eip155:10143\",\n  // Monad testnet\n  \"eip155:42220\",\n  // Celo\n  \"solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp\"\n  // Solana\n];\nfunction Kf(s) {\n  const e = new Set(s);\n  return Array.from(e);\n}\nconst k1 = Ks(Gc(C1)).transform(Kf), D1 = Ks(Gc(v1)).transform(Kf), id = Jt({\n  // 0.0.0 and 0.0.1 are not technically part of the spec but kept for\n  // backwards compatibility. next should always resolve to the most recent\n  // schema version.\n  version: S1,\n  name: Vc,\n  iconUrl: or,\n  homeUrl: or,\n  /** deprecated, set ogImageUrl instead */\n  imageUrl: or.optional(),\n  /** deprecated, will rely on fc:frame/fc:miniapp meta tag */\n  buttonTitle: Vf.optional(),\n  splashImageUrl: or.optional(),\n  splashBackgroundColor: jc.optional(),\n  webhookUrl: or.optional(),\n  /** see: https://github.com/farcasterxyz/miniapps/discussions/191 */\n  subtitle: b1.optional(),\n  description: T1.optional(),\n  screenshotUrls: w1.optional(),\n  primaryCategory: x1.optional(),\n  tags: A1.optional(),\n  heroImageUrl: or.optional(),\n  tagline: I1.optional(),\n  ogTitle: _1.optional(),\n  ogDescription: R1.optional(),\n  ogImageUrl: or.optional(),\n  /** see: https://github.com/farcasterxyz/miniapps/discussions/204 */\n  noindex: L1.optional(),\n  /** see https://github.com/farcasterxyz/miniapps/discussions/256 */\n  requiredChains: k1.optional(),\n  requiredCapabilities: D1.optional(),\n  /** see https://github.com/farcasterxyz/miniapps/discussions/158 */\n  /** Documentation will be added once this feature is finalized. */\n  castShareUrl: or.optional(),\n  /** Canonical domain for the miniapp application */\n  canonicalDomain: o1.optional()\n}).refine((s) => {\n  if (s.castShareUrl === void 0)\n    return !0;\n  try {\n    const e = new URL(s.homeUrl).hostname, t = new URL(s.castShareUrl).hostname;\n    return e === t;\n  } catch {\n    return !1;\n  }\n}, {\n  message: \"castShareUrl must have the same domain as homeUrl\",\n  path: [\"castShareUrl\"]\n});\nJt({\n  accountAssociation: l1,\n  miniapp: id.optional(),\n  // Support both 'frame' and 'miniapp' during transition period\n  frame: id.optional()\n}).refine((s) => s.frame && s.miniapp ? JSON.stringify(s.frame) === JSON.stringify(s.miniapp) : !0, {\n  message: 'If both \"frame\" and \"miniapp\" are provided, they must be identical',\n  path: [\"frame\", \"miniapp\"]\n}).transform((s) => ({\n  ...s,\n  frame: s.frame ?? s.miniapp\n}));\nvar Ga = {}, Hn = {}, od;\nfunction P1() {\n  if (od) return Hn;\n  od = 1, Hn.byteLength = a, Hn.toByteArray = c, Hn.fromByteArray = h;\n  for (var s = [], e = [], t = typeof Uint8Array < \"u\" ? Uint8Array : Array, r = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\", n = 0, i = r.length; n < i; ++n)\n    s[n] = r[n], e[r.charCodeAt(n)] = n;\n  e[45] = 62, e[95] = 63;\n  function o(f) {\n    var p = f.length;\n    if (p % 4 > 0)\n      throw new Error(\"Invalid string. Length must be a multiple of 4\");\n    var y = f.indexOf(\"=\");\n    y === -1 && (y = p);\n    var E = y === p ? 0 : 4 - y % 4;\n    return [y, E];\n  }\n  function a(f) {\n    var p = o(f), y = p[0], E = p[1];\n    return (y + E) * 3 / 4 - E;\n  }\n  function l(f, p, y) {\n    return (p + y) * 3 / 4 - y;\n  }\n  function c(f) {\n    var p, y = o(f), E = y[0], b = y[1], R = new t(l(f, E, b)), A = 0, F = b > 0 ? E - 4 : E, M;\n    for (M = 0; M < F; M += 4)\n      p = e[f.charCodeAt(M)] << 18 | e[f.charCodeAt(M + 1)] << 12 | e[f.charCodeAt(M + 2)] << 6 | e[f.charCodeAt(M + 3)], R[A++] = p >> 16 & 255, R[A++] = p >> 8 & 255, R[A++] = p & 255;\n    return b === 2 && (p = e[f.charCodeAt(M)] << 2 | e[f.charCodeAt(M + 1)] >> 4, R[A++] = p & 255), b === 1 && (p = e[f.charCodeAt(M)] << 10 | e[f.charCodeAt(M + 1)] << 4 | e[f.charCodeAt(M + 2)] >> 2, R[A++] = p >> 8 & 255, R[A++] = p & 255), R;\n  }\n  function u(f) {\n    return s[f >> 18 & 63] + s[f >> 12 & 63] + s[f >> 6 & 63] + s[f & 63];\n  }\n  function d(f, p, y) {\n    for (var E, b = [], R = p; R < y; R += 3)\n      E = (f[R] << 16 & 16711680) + (f[R + 1] << 8 & 65280) + (f[R + 2] & 255), b.push(u(E));\n    return b.join(\"\");\n  }\n  function h(f) {\n    for (var p, y = f.length, E = y % 3, b = [], R = 16383, A = 0, F = y - E; A < F; A += R)\n      b.push(d(f, A, A + R > F ? F : A + R));\n    return E === 1 ? (p = f[y - 1], b.push(\n      s[p >> 2] + s[p << 4 & 63] + \"==\"\n    )) : E === 2 && (p = (f[y - 2] << 8) + f[y - 1], b.push(\n      s[p >> 10] + s[p >> 4 & 63] + s[p << 2 & 63] + \"=\"\n    )), b.join(\"\");\n  }\n  return Hn;\n}\nvar Mi = {};\n/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nvar ad;\nfunction M1() {\n  return ad || (ad = 1, Mi.read = function(s, e, t, r, n) {\n    var i, o, a = n * 8 - r - 1, l = (1 << a) - 1, c = l >> 1, u = -7, d = t ? n - 1 : 0, h = t ? -1 : 1, f = s[e + d];\n    for (d += h, i = f & (1 << -u) - 1, f >>= -u, u += a; u > 0; i = i * 256 + s[e + d], d += h, u -= 8)\n      ;\n    for (o = i & (1 << -u) - 1, i >>= -u, u += r; u > 0; o = o * 256 + s[e + d], d += h, u -= 8)\n      ;\n    if (i === 0)\n      i = 1 - c;\n    else {\n      if (i === l)\n        return o ? NaN : (f ? -1 : 1) * (1 / 0);\n      o = o + Math.pow(2, r), i = i - c;\n    }\n    return (f ? -1 : 1) * o * Math.pow(2, i - r);\n  }, Mi.write = function(s, e, t, r, n, i) {\n    var o, a, l, c = i * 8 - n - 1, u = (1 << c) - 1, d = u >> 1, h = n === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0, f = r ? 0 : i - 1, p = r ? 1 : -1, y = e < 0 || e === 0 && 1 / e < 0 ? 1 : 0;\n    for (e = Math.abs(e), isNaN(e) || e === 1 / 0 ? (a = isNaN(e) ? 1 : 0, o = u) : (o = Math.floor(Math.log(e) / Math.LN2), e * (l = Math.pow(2, -o)) < 1 && (o--, l *= 2), o + d >= 1 ? e += h / l : e += h * Math.pow(2, 1 - d), e * l >= 2 && (o++, l /= 2), o + d >= u ? (a = 0, o = u) : o + d >= 1 ? (a = (e * l - 1) * Math.pow(2, n), o = o + d) : (a = e * Math.pow(2, d - 1) * Math.pow(2, n), o = 0)); n >= 8; s[t + f] = a & 255, f += p, a /= 256, n -= 8)\n      ;\n    for (o = o << n | a, c += n; c > 0; s[t + f] = o & 255, f += p, o /= 256, c -= 8)\n      ;\n    s[t + f - p] |= y * 128;\n  }), Mi;\n}\n/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\nvar ld;\nfunction Kc() {\n  return ld || (ld = 1, (function(s) {\n    const e = P1(), t = M1(), r = typeof Symbol == \"function\" && typeof Symbol.for == \"function\" ? Symbol.for(\"nodejs.util.inspect.custom\") : null;\n    s.Buffer = a, s.SlowBuffer = R, s.INSPECT_MAX_BYTES = 50;\n    const n = 2147483647;\n    s.kMaxLength = n, a.TYPED_ARRAY_SUPPORT = i(), !a.TYPED_ARRAY_SUPPORT && typeof console < \"u\" && typeof console.error == \"function\" && console.error(\n      \"This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support.\"\n    );\n    function i() {\n      try {\n        const B = new Uint8Array(1), S = { foo: function() {\n          return 42;\n        } };\n        return Object.setPrototypeOf(S, Uint8Array.prototype), Object.setPrototypeOf(B, S), B.foo() === 42;\n      } catch {\n        return !1;\n      }\n    }\n    Object.defineProperty(a.prototype, \"parent\", {\n      enumerable: !0,\n      get: function() {\n        if (a.isBuffer(this))\n          return this.buffer;\n      }\n    }), Object.defineProperty(a.prototype, \"offset\", {\n      enumerable: !0,\n      get: function() {\n        if (a.isBuffer(this))\n          return this.byteOffset;\n      }\n    });\n    function o(B) {\n      if (B > n)\n        throw new RangeError('The value \"' + B + '\" is invalid for option \"size\"');\n      const S = new Uint8Array(B);\n      return Object.setPrototypeOf(S, a.prototype), S;\n    }\n    function a(B, S, T) {\n      if (typeof B == \"number\") {\n        if (typeof S == \"string\")\n          throw new TypeError(\n            'The \"string\" argument must be of type string. Received type number'\n          );\n        return d(B);\n      }\n      return l(B, S, T);\n    }\n    a.poolSize = 8192;\n    function l(B, S, T) {\n      if (typeof B == \"string\")\n        return h(B, S);\n      if (ArrayBuffer.isView(B))\n        return p(B);\n      if (B == null)\n        throw new TypeError(\n          \"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof B\n        );\n      if (dt(B, ArrayBuffer) || B && dt(B.buffer, ArrayBuffer) || typeof SharedArrayBuffer < \"u\" && (dt(B, SharedArrayBuffer) || B && dt(B.buffer, SharedArrayBuffer)))\n        return y(B, S, T);\n      if (typeof B == \"number\")\n        throw new TypeError(\n          'The \"value\" argument must not be of type number. Received type number'\n        );\n      const G = B.valueOf && B.valueOf();\n      if (G != null && G !== B)\n        return a.from(G, S, T);\n      const Z = E(B);\n      if (Z) return Z;\n      if (typeof Symbol < \"u\" && Symbol.toPrimitive != null && typeof B[Symbol.toPrimitive] == \"function\")\n        return a.from(B[Symbol.toPrimitive](\"string\"), S, T);\n      throw new TypeError(\n        \"The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type \" + typeof B\n      );\n    }\n    a.from = function(B, S, T) {\n      return l(B, S, T);\n    }, Object.setPrototypeOf(a.prototype, Uint8Array.prototype), Object.setPrototypeOf(a, Uint8Array);\n    function c(B) {\n      if (typeof B != \"number\")\n        throw new TypeError('\"size\" argument must be of type number');\n      if (B < 0)\n        throw new RangeError('The value \"' + B + '\" is invalid for option \"size\"');\n    }\n    function u(B, S, T) {\n      return c(B), B <= 0 ? o(B) : S !== void 0 ? typeof T == \"string\" ? o(B).fill(S, T) : o(B).fill(S) : o(B);\n    }\n    a.alloc = function(B, S, T) {\n      return u(B, S, T);\n    };\n    function d(B) {\n      return c(B), o(B < 0 ? 0 : b(B) | 0);\n    }\n    a.allocUnsafe = function(B) {\n      return d(B);\n    }, a.allocUnsafeSlow = function(B) {\n      return d(B);\n    };\n    function h(B, S) {\n      if ((typeof S != \"string\" || S === \"\") && (S = \"utf8\"), !a.isEncoding(S))\n        throw new TypeError(\"Unknown encoding: \" + S);\n      const T = A(B, S) | 0;\n      let G = o(T);\n      const Z = G.write(B, S);\n      return Z !== T && (G = G.slice(0, Z)), G;\n    }\n    function f(B) {\n      const S = B.length < 0 ? 0 : b(B.length) | 0, T = o(S);\n      for (let G = 0; G < S; G += 1)\n        T[G] = B[G] & 255;\n      return T;\n    }\n    function p(B) {\n      if (dt(B, Uint8Array)) {\n        const S = new Uint8Array(B);\n        return y(S.buffer, S.byteOffset, S.byteLength);\n      }\n      return f(B);\n    }\n    function y(B, S, T) {\n      if (S < 0 || B.byteLength < S)\n        throw new RangeError('\"offset\" is outside of buffer bounds');\n      if (B.byteLength < S + (T || 0))\n        throw new RangeError('\"length\" is outside of buffer bounds');\n      let G;\n      return S === void 0 && T === void 0 ? G = new Uint8Array(B) : T === void 0 ? G = new Uint8Array(B, S) : G = new Uint8Array(B, S, T), Object.setPrototypeOf(G, a.prototype), G;\n    }\n    function E(B) {\n      if (a.isBuffer(B)) {\n        const S = b(B.length) | 0, T = o(S);\n        return T.length === 0 || B.copy(T, 0, 0, S), T;\n      }\n      if (B.length !== void 0)\n        return typeof B.length != \"number\" || Je(B.length) ? o(0) : f(B);\n      if (B.type === \"Buffer\" && Array.isArray(B.data))\n        return f(B.data);\n    }\n    function b(B) {\n      if (B >= n)\n        throw new RangeError(\"Attempt to allocate Buffer larger than maximum size: 0x\" + n.toString(16) + \" bytes\");\n      return B | 0;\n    }\n    function R(B) {\n      return +B != B && (B = 0), a.alloc(+B);\n    }\n    a.isBuffer = function(S) {\n      return S != null && S._isBuffer === !0 && S !== a.prototype;\n    }, a.compare = function(S, T) {\n      if (dt(S, Uint8Array) && (S = a.from(S, S.offset, S.byteLength)), dt(T, Uint8Array) && (T = a.from(T, T.offset, T.byteLength)), !a.isBuffer(S) || !a.isBuffer(T))\n        throw new TypeError(\n          'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n        );\n      if (S === T) return 0;\n      let G = S.length, Z = T.length;\n      for (let Q = 0, se = Math.min(G, Z); Q < se; ++Q)\n        if (S[Q] !== T[Q]) {\n          G = S[Q], Z = T[Q];\n          break;\n        }\n      return G < Z ? -1 : Z < G ? 1 : 0;\n    }, a.isEncoding = function(S) {\n      switch (String(S).toLowerCase()) {\n        case \"hex\":\n        case \"utf8\":\n        case \"utf-8\":\n        case \"ascii\":\n        case \"latin1\":\n        case \"binary\":\n        case \"base64\":\n        case \"ucs2\":\n        case \"ucs-2\":\n        case \"utf16le\":\n        case \"utf-16le\":\n          return !0;\n        default:\n          return !1;\n      }\n    }, a.concat = function(S, T) {\n      if (!Array.isArray(S))\n        throw new TypeError('\"list\" argument must be an Array of Buffers');\n      if (S.length === 0)\n        return a.alloc(0);\n      let G;\n      if (T === void 0)\n        for (T = 0, G = 0; G < S.length; ++G)\n          T += S[G].length;\n      const Z = a.allocUnsafe(T);\n      let Q = 0;\n      for (G = 0; G < S.length; ++G) {\n        let se = S[G];\n        if (dt(se, Uint8Array))\n          Q + se.length > Z.length ? (a.isBuffer(se) || (se = a.from(se)), se.copy(Z, Q)) : Uint8Array.prototype.set.call(\n            Z,\n            se,\n            Q\n          );\n        else if (a.isBuffer(se))\n          se.copy(Z, Q);\n        else\n          throw new TypeError('\"list\" argument must be an Array of Buffers');\n        Q += se.length;\n      }\n      return Z;\n    };\n    function A(B, S) {\n      if (a.isBuffer(B))\n        return B.length;\n      if (ArrayBuffer.isView(B) || dt(B, ArrayBuffer))\n        return B.byteLength;\n      if (typeof B != \"string\")\n        throw new TypeError(\n          'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. Received type ' + typeof B\n        );\n      const T = B.length, G = arguments.length > 2 && arguments[2] === !0;\n      if (!G && T === 0) return 0;\n      let Z = !1;\n      for (; ; )\n        switch (S) {\n          case \"ascii\":\n          case \"latin1\":\n          case \"binary\":\n            return T;\n          case \"utf8\":\n          case \"utf-8\":\n            return be(B).length;\n          case \"ucs2\":\n          case \"ucs-2\":\n          case \"utf16le\":\n          case \"utf-16le\":\n            return T * 2;\n          case \"hex\":\n            return T >>> 1;\n          case \"base64\":\n            return we(B).length;\n          default:\n            if (Z)\n              return G ? -1 : be(B).length;\n            S = (\"\" + S).toLowerCase(), Z = !0;\n        }\n    }\n    a.byteLength = A;\n    function F(B, S, T) {\n      let G = !1;\n      if ((S === void 0 || S < 0) && (S = 0), S > this.length || ((T === void 0 || T > this.length) && (T = this.length), T <= 0) || (T >>>= 0, S >>>= 0, T <= S))\n        return \"\";\n      for (B || (B = \"utf8\"); ; )\n        switch (B) {\n          case \"hex\":\n            return U(this, S, T);\n          case \"utf8\":\n          case \"utf-8\":\n            return g(this, S, T);\n          case \"ascii\":\n            return D(this, S, T);\n          case \"latin1\":\n          case \"binary\":\n            return O(this, S, T);\n          case \"base64\":\n            return _(this, S, T);\n          case \"ucs2\":\n          case \"ucs-2\":\n          case \"utf16le\":\n          case \"utf-16le\":\n            return V(this, S, T);\n          default:\n            if (G) throw new TypeError(\"Unknown encoding: \" + B);\n            B = (B + \"\").toLowerCase(), G = !0;\n        }\n    }\n    a.prototype._isBuffer = !0;\n    function M(B, S, T) {\n      const G = B[S];\n      B[S] = B[T], B[T] = G;\n    }\n    a.prototype.swap16 = function() {\n      const S = this.length;\n      if (S % 2 !== 0)\n        throw new RangeError(\"Buffer size must be a multiple of 16-bits\");\n      for (let T = 0; T < S; T += 2)\n        M(this, T, T + 1);\n      return this;\n    }, a.prototype.swap32 = function() {\n      const S = this.length;\n      if (S % 4 !== 0)\n        throw new RangeError(\"Buffer size must be a multiple of 32-bits\");\n      for (let T = 0; T < S; T += 4)\n        M(this, T, T + 3), M(this, T + 1, T + 2);\n      return this;\n    }, a.prototype.swap64 = function() {\n      const S = this.length;\n      if (S % 8 !== 0)\n        throw new RangeError(\"Buffer size must be a multiple of 64-bits\");\n      for (let T = 0; T < S; T += 8)\n        M(this, T, T + 7), M(this, T + 1, T + 6), M(this, T + 2, T + 5), M(this, T + 3, T + 4);\n      return this;\n    }, a.prototype.toString = function() {\n      const S = this.length;\n      return S === 0 ? \"\" : arguments.length === 0 ? g(this, 0, S) : F.apply(this, arguments);\n    }, a.prototype.toLocaleString = a.prototype.toString, a.prototype.equals = function(S) {\n      if (!a.isBuffer(S)) throw new TypeError(\"Argument must be a Buffer\");\n      return this === S ? !0 : a.compare(this, S) === 0;\n    }, a.prototype.inspect = function() {\n      let S = \"\";\n      const T = s.INSPECT_MAX_BYTES;\n      return S = this.toString(\"hex\", 0, T).replace(/(.{2})/g, \"$1 \").trim(), this.length > T && (S += \" ... \"), \"<Buffer \" + S + \">\";\n    }, r && (a.prototype[r] = a.prototype.inspect), a.prototype.compare = function(S, T, G, Z, Q) {\n      if (dt(S, Uint8Array) && (S = a.from(S, S.offset, S.byteLength)), !a.isBuffer(S))\n        throw new TypeError(\n          'The \"target\" argument must be one of type Buffer or Uint8Array. Received type ' + typeof S\n        );\n      if (T === void 0 && (T = 0), G === void 0 && (G = S ? S.length : 0), Z === void 0 && (Z = 0), Q === void 0 && (Q = this.length), T < 0 || G > S.length || Z < 0 || Q > this.length)\n        throw new RangeError(\"out of range index\");\n      if (Z >= Q && T >= G)\n        return 0;\n      if (Z >= Q)\n        return -1;\n      if (T >= G)\n        return 1;\n      if (T >>>= 0, G >>>= 0, Z >>>= 0, Q >>>= 0, this === S) return 0;\n      let se = Q - Z, Ue = G - T;\n      const Pe = Math.min(se, Ue), Le = this.slice(Z, Q), ct = S.slice(T, G);\n      for (let Ae = 0; Ae < Pe; ++Ae)\n        if (Le[Ae] !== ct[Ae]) {\n          se = Le[Ae], Ue = ct[Ae];\n          break;\n        }\n      return se < Ue ? -1 : Ue < se ? 1 : 0;\n    };\n    function H(B, S, T, G, Z) {\n      if (B.length === 0) return -1;\n      if (typeof T == \"string\" ? (G = T, T = 0) : T > 2147483647 ? T = 2147483647 : T < -2147483648 && (T = -2147483648), T = +T, Je(T) && (T = Z ? 0 : B.length - 1), T < 0 && (T = B.length + T), T >= B.length) {\n        if (Z) return -1;\n        T = B.length - 1;\n      } else if (T < 0)\n        if (Z) T = 0;\n        else return -1;\n      if (typeof S == \"string\" && (S = a.from(S, G)), a.isBuffer(S))\n        return S.length === 0 ? -1 : K(B, S, T, G, Z);\n      if (typeof S == \"number\")\n        return S = S & 255, typeof Uint8Array.prototype.indexOf == \"function\" ? Z ? Uint8Array.prototype.indexOf.call(B, S, T) : Uint8Array.prototype.lastIndexOf.call(B, S, T) : K(B, [S], T, G, Z);\n      throw new TypeError(\"val must be string, number or Buffer\");\n    }\n    function K(B, S, T, G, Z) {\n      let Q = 1, se = B.length, Ue = S.length;\n      if (G !== void 0 && (G = String(G).toLowerCase(), G === \"ucs2\" || G === \"ucs-2\" || G === \"utf16le\" || G === \"utf-16le\")) {\n        if (B.length < 2 || S.length < 2)\n          return -1;\n        Q = 2, se /= 2, Ue /= 2, T /= 2;\n      }\n      function Pe(ct, Ae) {\n        return Q === 1 ? ct[Ae] : ct.readUInt16BE(Ae * Q);\n      }\n      let Le;\n      if (Z) {\n        let ct = -1;\n        for (Le = T; Le < se; Le++)\n          if (Pe(B, Le) === Pe(S, ct === -1 ? 0 : Le - ct)) {\n            if (ct === -1 && (ct = Le), Le - ct + 1 === Ue) return ct * Q;\n          } else\n            ct !== -1 && (Le -= Le - ct), ct = -1;\n      } else\n        for (T + Ue > se && (T = se - Ue), Le = T; Le >= 0; Le--) {\n          let ct = !0;\n          for (let Ae = 0; Ae < Ue; Ae++)\n            if (Pe(B, Le + Ae) !== Pe(S, Ae)) {\n              ct = !1;\n              break;\n            }\n          if (ct) return Le;\n        }\n      return -1;\n    }\n    a.prototype.includes = function(S, T, G) {\n      return this.indexOf(S, T, G) !== -1;\n    }, a.prototype.indexOf = function(S, T, G) {\n      return H(this, S, T, G, !0);\n    }, a.prototype.lastIndexOf = function(S, T, G) {\n      return H(this, S, T, G, !1);\n    };\n    function j(B, S, T, G) {\n      T = Number(T) || 0;\n      const Z = B.length - T;\n      G ? (G = Number(G), G > Z && (G = Z)) : G = Z;\n      const Q = S.length;\n      G > Q / 2 && (G = Q / 2);\n      let se;\n      for (se = 0; se < G; ++se) {\n        const Ue = parseInt(S.substr(se * 2, 2), 16);\n        if (Je(Ue)) return se;\n        B[T + se] = Ue;\n      }\n      return se;\n    }\n    function C(B, S, T, G) {\n      return Ne(be(S, B.length - T), B, T, G);\n    }\n    function k(B, S, T, G) {\n      return Ne(Fe(S), B, T, G);\n    }\n    function $(B, S, T, G) {\n      return Ne(we(S), B, T, G);\n    }\n    function W(B, S, T, G) {\n      return Ne(Xe(S, B.length - T), B, T, G);\n    }\n    a.prototype.write = function(S, T, G, Z) {\n      if (T === void 0)\n        Z = \"utf8\", G = this.length, T = 0;\n      else if (G === void 0 && typeof T == \"string\")\n        Z = T, G = this.length, T = 0;\n      else if (isFinite(T))\n        T = T >>> 0, isFinite(G) ? (G = G >>> 0, Z === void 0 && (Z = \"utf8\")) : (Z = G, G = void 0);\n      else\n        throw new Error(\n          \"Buffer.write(string, encoding, offset[, length]) is no longer supported\"\n        );\n      const Q = this.length - T;\n      if ((G === void 0 || G > Q) && (G = Q), S.length > 0 && (G < 0 || T < 0) || T > this.length)\n        throw new RangeError(\"Attempt to write outside buffer bounds\");\n      Z || (Z = \"utf8\");\n      let se = !1;\n      for (; ; )\n        switch (Z) {\n          case \"hex\":\n            return j(this, S, T, G);\n          case \"utf8\":\n          case \"utf-8\":\n            return C(this, S, T, G);\n          case \"ascii\":\n          case \"latin1\":\n          case \"binary\":\n            return k(this, S, T, G);\n          case \"base64\":\n            return $(this, S, T, G);\n          case \"ucs2\":\n          case \"ucs-2\":\n          case \"utf16le\":\n          case \"utf-16le\":\n            return W(this, S, T, G);\n          default:\n            if (se) throw new TypeError(\"Unknown encoding: \" + Z);\n            Z = (\"\" + Z).toLowerCase(), se = !0;\n        }\n    }, a.prototype.toJSON = function() {\n      return {\n        type: \"Buffer\",\n        data: Array.prototype.slice.call(this._arr || this, 0)\n      };\n    };\n    function _(B, S, T) {\n      return S === 0 && T === B.length ? e.fromByteArray(B) : e.fromByteArray(B.slice(S, T));\n    }\n    function g(B, S, T) {\n      T = Math.min(B.length, T);\n      const G = [];\n      let Z = S;\n      for (; Z < T; ) {\n        const Q = B[Z];\n        let se = null, Ue = Q > 239 ? 4 : Q > 223 ? 3 : Q > 191 ? 2 : 1;\n        if (Z + Ue <= T) {\n          let Pe, Le, ct, Ae;\n          switch (Ue) {\n            case 1:\n              Q < 128 && (se = Q);\n              break;\n            case 2:\n              Pe = B[Z + 1], (Pe & 192) === 128 && (Ae = (Q & 31) << 6 | Pe & 63, Ae > 127 && (se = Ae));\n              break;\n            case 3:\n              Pe = B[Z + 1], Le = B[Z + 2], (Pe & 192) === 128 && (Le & 192) === 128 && (Ae = (Q & 15) << 12 | (Pe & 63) << 6 | Le & 63, Ae > 2047 && (Ae < 55296 || Ae > 57343) && (se = Ae));\n              break;\n            case 4:\n              Pe = B[Z + 1], Le = B[Z + 2], ct = B[Z + 3], (Pe & 192) === 128 && (Le & 192) === 128 && (ct & 192) === 128 && (Ae = (Q & 15) << 18 | (Pe & 63) << 12 | (Le & 63) << 6 | ct & 63, Ae > 65535 && Ae < 1114112 && (se = Ae));\n          }\n        }\n        se === null ? (se = 65533, Ue = 1) : se > 65535 && (se -= 65536, G.push(se >>> 10 & 1023 | 55296), se = 56320 | se & 1023), G.push(se), Z += Ue;\n      }\n      return w(G);\n    }\n    const x = 4096;\n    function w(B) {\n      const S = B.length;\n      if (S <= x)\n        return String.fromCharCode.apply(String, B);\n      let T = \"\", G = 0;\n      for (; G < S; )\n        T += String.fromCharCode.apply(\n          String,\n          B.slice(G, G += x)\n        );\n      return T;\n    }\n    function D(B, S, T) {\n      let G = \"\";\n      T = Math.min(B.length, T);\n      for (let Z = S; Z < T; ++Z)\n        G += String.fromCharCode(B[Z] & 127);\n      return G;\n    }\n    function O(B, S, T) {\n      let G = \"\";\n      T = Math.min(B.length, T);\n      for (let Z = S; Z < T; ++Z)\n        G += String.fromCharCode(B[Z]);\n      return G;\n    }\n    function U(B, S, T) {\n      const G = B.length;\n      (!S || S < 0) && (S = 0), (!T || T < 0 || T > G) && (T = G);\n      let Z = \"\";\n      for (let Q = S; Q < T; ++Q)\n        Z += Qe[B[Q]];\n      return Z;\n    }\n    function V(B, S, T) {\n      const G = B.slice(S, T);\n      let Z = \"\";\n      for (let Q = 0; Q < G.length - 1; Q += 2)\n        Z += String.fromCharCode(G[Q] + G[Q + 1] * 256);\n      return Z;\n    }\n    a.prototype.slice = function(S, T) {\n      const G = this.length;\n      S = ~~S, T = T === void 0 ? G : ~~T, S < 0 ? (S += G, S < 0 && (S = 0)) : S > G && (S = G), T < 0 ? (T += G, T < 0 && (T = 0)) : T > G && (T = G), T < S && (T = S);\n      const Z = this.subarray(S, T);\n      return Object.setPrototypeOf(Z, a.prototype), Z;\n    };\n    function L(B, S, T) {\n      if (B % 1 !== 0 || B < 0) throw new RangeError(\"offset is not uint\");\n      if (B + S > T) throw new RangeError(\"Trying to access beyond buffer length\");\n    }\n    a.prototype.readUintLE = a.prototype.readUIntLE = function(S, T, G) {\n      S = S >>> 0, T = T >>> 0, G || L(S, T, this.length);\n      let Z = this[S], Q = 1, se = 0;\n      for (; ++se < T && (Q *= 256); )\n        Z += this[S + se] * Q;\n      return Z;\n    }, a.prototype.readUintBE = a.prototype.readUIntBE = function(S, T, G) {\n      S = S >>> 0, T = T >>> 0, G || L(S, T, this.length);\n      let Z = this[S + --T], Q = 1;\n      for (; T > 0 && (Q *= 256); )\n        Z += this[S + --T] * Q;\n      return Z;\n    }, a.prototype.readUint8 = a.prototype.readUInt8 = function(S, T) {\n      return S = S >>> 0, T || L(S, 1, this.length), this[S];\n    }, a.prototype.readUint16LE = a.prototype.readUInt16LE = function(S, T) {\n      return S = S >>> 0, T || L(S, 2, this.length), this[S] | this[S + 1] << 8;\n    }, a.prototype.readUint16BE = a.prototype.readUInt16BE = function(S, T) {\n      return S = S >>> 0, T || L(S, 2, this.length), this[S] << 8 | this[S + 1];\n    }, a.prototype.readUint32LE = a.prototype.readUInt32LE = function(S, T) {\n      return S = S >>> 0, T || L(S, 4, this.length), (this[S] | this[S + 1] << 8 | this[S + 2] << 16) + this[S + 3] * 16777216;\n    }, a.prototype.readUint32BE = a.prototype.readUInt32BE = function(S, T) {\n      return S = S >>> 0, T || L(S, 4, this.length), this[S] * 16777216 + (this[S + 1] << 16 | this[S + 2] << 8 | this[S + 3]);\n    }, a.prototype.readBigUInt64LE = it(function(S) {\n      S = S >>> 0, _e(S, \"offset\");\n      const T = this[S], G = this[S + 7];\n      (T === void 0 || G === void 0) && xe(S, this.length - 8);\n      const Z = T + this[++S] * 2 ** 8 + this[++S] * 2 ** 16 + this[++S] * 2 ** 24, Q = this[++S] + this[++S] * 2 ** 8 + this[++S] * 2 ** 16 + G * 2 ** 24;\n      return BigInt(Z) + (BigInt(Q) << BigInt(32));\n    }), a.prototype.readBigUInt64BE = it(function(S) {\n      S = S >>> 0, _e(S, \"offset\");\n      const T = this[S], G = this[S + 7];\n      (T === void 0 || G === void 0) && xe(S, this.length - 8);\n      const Z = T * 2 ** 24 + this[++S] * 2 ** 16 + this[++S] * 2 ** 8 + this[++S], Q = this[++S] * 2 ** 24 + this[++S] * 2 ** 16 + this[++S] * 2 ** 8 + G;\n      return (BigInt(Z) << BigInt(32)) + BigInt(Q);\n    }), a.prototype.readIntLE = function(S, T, G) {\n      S = S >>> 0, T = T >>> 0, G || L(S, T, this.length);\n      let Z = this[S], Q = 1, se = 0;\n      for (; ++se < T && (Q *= 256); )\n        Z += this[S + se] * Q;\n      return Q *= 128, Z >= Q && (Z -= Math.pow(2, 8 * T)), Z;\n    }, a.prototype.readIntBE = function(S, T, G) {\n      S = S >>> 0, T = T >>> 0, G || L(S, T, this.length);\n      let Z = T, Q = 1, se = this[S + --Z];\n      for (; Z > 0 && (Q *= 256); )\n        se += this[S + --Z] * Q;\n      return Q *= 128, se >= Q && (se -= Math.pow(2, 8 * T)), se;\n    }, a.prototype.readInt8 = function(S, T) {\n      return S = S >>> 0, T || L(S, 1, this.length), this[S] & 128 ? (255 - this[S] + 1) * -1 : this[S];\n    }, a.prototype.readInt16LE = function(S, T) {\n      S = S >>> 0, T || L(S, 2, this.length);\n      const G = this[S] | this[S + 1] << 8;\n      return G & 32768 ? G | 4294901760 : G;\n    }, a.prototype.readInt16BE = function(S, T) {\n      S = S >>> 0, T || L(S, 2, this.length);\n      const G = this[S + 1] | this[S] << 8;\n      return G & 32768 ? G | 4294901760 : G;\n    }, a.prototype.readInt32LE = function(S, T) {\n      return S = S >>> 0, T || L(S, 4, this.length), this[S] | this[S + 1] << 8 | this[S + 2] << 16 | this[S + 3] << 24;\n    }, a.prototype.readInt32BE = function(S, T) {\n      return S = S >>> 0, T || L(S, 4, this.length), this[S] << 24 | this[S + 1] << 16 | this[S + 2] << 8 | this[S + 3];\n    }, a.prototype.readBigInt64LE = it(function(S) {\n      S = S >>> 0, _e(S, \"offset\");\n      const T = this[S], G = this[S + 7];\n      (T === void 0 || G === void 0) && xe(S, this.length - 8);\n      const Z = this[S + 4] + this[S + 5] * 2 ** 8 + this[S + 6] * 2 ** 16 + (G << 24);\n      return (BigInt(Z) << BigInt(32)) + BigInt(T + this[++S] * 2 ** 8 + this[++S] * 2 ** 16 + this[++S] * 2 ** 24);\n    }), a.prototype.readBigInt64BE = it(function(S) {\n      S = S >>> 0, _e(S, \"offset\");\n      const T = this[S], G = this[S + 7];\n      (T === void 0 || G === void 0) && xe(S, this.length - 8);\n      const Z = (T << 24) + // Overflow\n      this[++S] * 2 ** 16 + this[++S] * 2 ** 8 + this[++S];\n      return (BigInt(Z) << BigInt(32)) + BigInt(this[++S] * 2 ** 24 + this[++S] * 2 ** 16 + this[++S] * 2 ** 8 + G);\n    }), a.prototype.readFloatLE = function(S, T) {\n      return S = S >>> 0, T || L(S, 4, this.length), t.read(this, S, !0, 23, 4);\n    }, a.prototype.readFloatBE = function(S, T) {\n      return S = S >>> 0, T || L(S, 4, this.length), t.read(this, S, !1, 23, 4);\n    }, a.prototype.readDoubleLE = function(S, T) {\n      return S = S >>> 0, T || L(S, 8, this.length), t.read(this, S, !0, 52, 8);\n    }, a.prototype.readDoubleBE = function(S, T) {\n      return S = S >>> 0, T || L(S, 8, this.length), t.read(this, S, !1, 52, 8);\n    };\n    function m(B, S, T, G, Z, Q) {\n      if (!a.isBuffer(B)) throw new TypeError('\"buffer\" argument must be a Buffer instance');\n      if (S > Z || S < Q) throw new RangeError('\"value\" argument is out of bounds');\n      if (T + G > B.length) throw new RangeError(\"Index out of range\");\n    }\n    a.prototype.writeUintLE = a.prototype.writeUIntLE = function(S, T, G, Z) {\n      if (S = +S, T = T >>> 0, G = G >>> 0, !Z) {\n        const Ue = Math.pow(2, 8 * G) - 1;\n        m(this, S, T, G, Ue, 0);\n      }\n      let Q = 1, se = 0;\n      for (this[T] = S & 255; ++se < G && (Q *= 256); )\n        this[T + se] = S / Q & 255;\n      return T + G;\n    }, a.prototype.writeUintBE = a.prototype.writeUIntBE = function(S, T, G, Z) {\n      if (S = +S, T = T >>> 0, G = G >>> 0, !Z) {\n        const Ue = Math.pow(2, 8 * G) - 1;\n        m(this, S, T, G, Ue, 0);\n      }\n      let Q = G - 1, se = 1;\n      for (this[T + Q] = S & 255; --Q >= 0 && (se *= 256); )\n        this[T + Q] = S / se & 255;\n      return T + G;\n    }, a.prototype.writeUint8 = a.prototype.writeUInt8 = function(S, T, G) {\n      return S = +S, T = T >>> 0, G || m(this, S, T, 1, 255, 0), this[T] = S & 255, T + 1;\n    }, a.prototype.writeUint16LE = a.prototype.writeUInt16LE = function(S, T, G) {\n      return S = +S, T = T >>> 0, G || m(this, S, T, 2, 65535, 0), this[T] = S & 255, this[T + 1] = S >>> 8, T + 2;\n    }, a.prototype.writeUint16BE = a.prototype.writeUInt16BE = function(S, T, G) {\n      return S = +S, T = T >>> 0, G || m(this, S, T, 2, 65535, 0), this[T] = S >>> 8, this[T + 1] = S & 255, T + 2;\n    }, a.prototype.writeUint32LE = a.prototype.writeUInt32LE = function(S, T, G) {\n      return S = +S, T = T >>> 0, G || m(this, S, T, 4, 4294967295, 0), this[T + 3] = S >>> 24, this[T + 2] = S >>> 16, this[T + 1] = S >>> 8, this[T] = S & 255, T + 4;\n    }, a.prototype.writeUint32BE = a.prototype.writeUInt32BE = function(S, T, G) {\n      return S = +S, T = T >>> 0, G || m(this, S, T, 4, 4294967295, 0), this[T] = S >>> 24, this[T + 1] = S >>> 16, this[T + 2] = S >>> 8, this[T + 3] = S & 255, T + 4;\n    };\n    function v(B, S, T, G, Z) {\n      ze(S, G, Z, B, T, 7);\n      let Q = Number(S & BigInt(4294967295));\n      B[T++] = Q, Q = Q >> 8, B[T++] = Q, Q = Q >> 8, B[T++] = Q, Q = Q >> 8, B[T++] = Q;\n      let se = Number(S >> BigInt(32) & BigInt(4294967295));\n      return B[T++] = se, se = se >> 8, B[T++] = se, se = se >> 8, B[T++] = se, se = se >> 8, B[T++] = se, T;\n    }\n    function P(B, S, T, G, Z) {\n      ze(S, G, Z, B, T, 7);\n      let Q = Number(S & BigInt(4294967295));\n      B[T + 7] = Q, Q = Q >> 8, B[T + 6] = Q, Q = Q >> 8, B[T + 5] = Q, Q = Q >> 8, B[T + 4] = Q;\n      let se = Number(S >> BigInt(32) & BigInt(4294967295));\n      return B[T + 3] = se, se = se >> 8, B[T + 2] = se, se = se >> 8, B[T + 1] = se, se = se >> 8, B[T] = se, T + 8;\n    }\n    a.prototype.writeBigUInt64LE = it(function(S, T = 0) {\n      return v(this, S, T, BigInt(0), BigInt(\"0xffffffffffffffff\"));\n    }), a.prototype.writeBigUInt64BE = it(function(S, T = 0) {\n      return P(this, S, T, BigInt(0), BigInt(\"0xffffffffffffffff\"));\n    }), a.prototype.writeIntLE = function(S, T, G, Z) {\n      if (S = +S, T = T >>> 0, !Z) {\n        const Pe = Math.pow(2, 8 * G - 1);\n        m(this, S, T, G, Pe - 1, -Pe);\n      }\n      let Q = 0, se = 1, Ue = 0;\n      for (this[T] = S & 255; ++Q < G && (se *= 256); )\n        S < 0 && Ue === 0 && this[T + Q - 1] !== 0 && (Ue = 1), this[T + Q] = (S / se >> 0) - Ue & 255;\n      return T + G;\n    }, a.prototype.writeIntBE = function(S, T, G, Z) {\n      if (S = +S, T = T >>> 0, !Z) {\n        const Pe = Math.pow(2, 8 * G - 1);\n        m(this, S, T, G, Pe - 1, -Pe);\n      }\n      let Q = G - 1, se = 1, Ue = 0;\n      for (this[T + Q] = S & 255; --Q >= 0 && (se *= 256); )\n        S < 0 && Ue === 0 && this[T + Q + 1] !== 0 && (Ue = 1), this[T + Q] = (S / se >> 0) - Ue & 255;\n      return T + G;\n    }, a.prototype.writeInt8 = function(S, T, G) {\n      return S = +S, T = T >>> 0, G || m(this, S, T, 1, 127, -128), S < 0 && (S = 255 + S + 1), this[T] = S & 255, T + 1;\n    }, a.prototype.writeInt16LE = function(S, T, G) {\n      return S = +S, T = T >>> 0, G || m(this, S, T, 2, 32767, -32768), this[T] = S & 255, this[T + 1] = S >>> 8, T + 2;\n    }, a.prototype.writeInt16BE = function(S, T, G) {\n      return S = +S, T = T >>> 0, G || m(this, S, T, 2, 32767, -32768), this[T] = S >>> 8, this[T + 1] = S & 255, T + 2;\n    }, a.prototype.writeInt32LE = function(S, T, G) {\n      return S = +S, T = T >>> 0, G || m(this, S, T, 4, 2147483647, -2147483648), this[T] = S & 255, this[T + 1] = S >>> 8, this[T + 2] = S >>> 16, this[T + 3] = S >>> 24, T + 4;\n    }, a.prototype.writeInt32BE = function(S, T, G) {\n      return S = +S, T = T >>> 0, G || m(this, S, T, 4, 2147483647, -2147483648), S < 0 && (S = 4294967295 + S + 1), this[T] = S >>> 24, this[T + 1] = S >>> 16, this[T + 2] = S >>> 8, this[T + 3] = S & 255, T + 4;\n    }, a.prototype.writeBigInt64LE = it(function(S, T = 0) {\n      return v(this, S, T, -BigInt(\"0x8000000000000000\"), BigInt(\"0x7fffffffffffffff\"));\n    }), a.prototype.writeBigInt64BE = it(function(S, T = 0) {\n      return P(this, S, T, -BigInt(\"0x8000000000000000\"), BigInt(\"0x7fffffffffffffff\"));\n    });\n    function N(B, S, T, G, Z, Q) {\n      if (T + G > B.length) throw new RangeError(\"Index out of range\");\n      if (T < 0) throw new RangeError(\"Index out of range\");\n    }\n    function Y(B, S, T, G, Z) {\n      return S = +S, T = T >>> 0, Z || N(B, S, T, 4), t.write(B, S, T, G, 23, 4), T + 4;\n    }\n    a.prototype.writeFloatLE = function(S, T, G) {\n      return Y(this, S, T, !0, G);\n    }, a.prototype.writeFloatBE = function(S, T, G) {\n      return Y(this, S, T, !1, G);\n    };\n    function ee(B, S, T, G, Z) {\n      return S = +S, T = T >>> 0, Z || N(B, S, T, 8), t.write(B, S, T, G, 52, 8), T + 8;\n    }\n    a.prototype.writeDoubleLE = function(S, T, G) {\n      return ee(this, S, T, !0, G);\n    }, a.prototype.writeDoubleBE = function(S, T, G) {\n      return ee(this, S, T, !1, G);\n    }, a.prototype.copy = function(S, T, G, Z) {\n      if (!a.isBuffer(S)) throw new TypeError(\"argument should be a Buffer\");\n      if (G || (G = 0), !Z && Z !== 0 && (Z = this.length), T >= S.length && (T = S.length), T || (T = 0), Z > 0 && Z < G && (Z = G), Z === G || S.length === 0 || this.length === 0) return 0;\n      if (T < 0)\n        throw new RangeError(\"targetStart out of bounds\");\n      if (G < 0 || G >= this.length) throw new RangeError(\"Index out of range\");\n      if (Z < 0) throw new RangeError(\"sourceEnd out of bounds\");\n      Z > this.length && (Z = this.length), S.length - T < Z - G && (Z = S.length - T + G);\n      const Q = Z - G;\n      return this === S && typeof Uint8Array.prototype.copyWithin == \"function\" ? this.copyWithin(T, G, Z) : Uint8Array.prototype.set.call(\n        S,\n        this.subarray(G, Z),\n        T\n      ), Q;\n    }, a.prototype.fill = function(S, T, G, Z) {\n      if (typeof S == \"string\") {\n        if (typeof T == \"string\" ? (Z = T, T = 0, G = this.length) : typeof G == \"string\" && (Z = G, G = this.length), Z !== void 0 && typeof Z != \"string\")\n          throw new TypeError(\"encoding must be a string\");\n        if (typeof Z == \"string\" && !a.isEncoding(Z))\n          throw new TypeError(\"Unknown encoding: \" + Z);\n        if (S.length === 1) {\n          const se = S.charCodeAt(0);\n          (Z === \"utf8\" && se < 128 || Z === \"latin1\") && (S = se);\n        }\n      } else typeof S == \"number\" ? S = S & 255 : typeof S == \"boolean\" && (S = Number(S));\n      if (T < 0 || this.length < T || this.length < G)\n        throw new RangeError(\"Out of range index\");\n      if (G <= T)\n        return this;\n      T = T >>> 0, G = G === void 0 ? this.length : G >>> 0, S || (S = 0);\n      let Q;\n      if (typeof S == \"number\")\n        for (Q = T; Q < G; ++Q)\n          this[Q] = S;\n      else {\n        const se = a.isBuffer(S) ? S : a.from(S, Z), Ue = se.length;\n        if (Ue === 0)\n          throw new TypeError('The value \"' + S + '\" is invalid for argument \"value\"');\n        for (Q = 0; Q < G - T; ++Q)\n          this[Q + T] = se[Q % Ue];\n      }\n      return this;\n    };\n    const ie = {};\n    function le(B, S, T) {\n      ie[B] = class extends T {\n        constructor() {\n          super(), Object.defineProperty(this, \"message\", {\n            value: S.apply(this, arguments),\n            writable: !0,\n            configurable: !0\n          }), this.name = `${this.name} [${B}]`, this.stack, delete this.name;\n        }\n        get code() {\n          return B;\n        }\n        set code(Z) {\n          Object.defineProperty(this, \"code\", {\n            configurable: !0,\n            enumerable: !0,\n            value: Z,\n            writable: !0\n          });\n        }\n        toString() {\n          return `${this.name} [${B}]: ${this.message}`;\n        }\n      };\n    }\n    le(\n      \"ERR_BUFFER_OUT_OF_BOUNDS\",\n      function(B) {\n        return B ? `${B} is outside of buffer bounds` : \"Attempt to access memory outside buffer bounds\";\n      },\n      RangeError\n    ), le(\n      \"ERR_INVALID_ARG_TYPE\",\n      function(B, S) {\n        return `The \"${B}\" argument must be of type number. Received type ${typeof S}`;\n      },\n      TypeError\n    ), le(\n      \"ERR_OUT_OF_RANGE\",\n      function(B, S, T) {\n        let G = `The value of \"${B}\" is out of range.`, Z = T;\n        return Number.isInteger(T) && Math.abs(T) > 2 ** 32 ? Z = Te(String(T)) : typeof T == \"bigint\" && (Z = String(T), (T > BigInt(2) ** BigInt(32) || T < -(BigInt(2) ** BigInt(32))) && (Z = Te(Z)), Z += \"n\"), G += ` It must be ${S}. Received ${Z}`, G;\n      },\n      RangeError\n    );\n    function Te(B) {\n      let S = \"\", T = B.length;\n      const G = B[0] === \"-\" ? 1 : 0;\n      for (; T >= G + 4; T -= 3)\n        S = `_${B.slice(T - 3, T)}${S}`;\n      return `${B.slice(0, T)}${S}`;\n    }\n    function De(B, S, T) {\n      _e(S, \"offset\"), (B[S] === void 0 || B[S + T] === void 0) && xe(S, B.length - (T + 1));\n    }\n    function ze(B, S, T, G, Z, Q) {\n      if (B > T || B < S) {\n        const se = typeof S == \"bigint\" ? \"n\" : \"\";\n        let Ue;\n        throw S === 0 || S === BigInt(0) ? Ue = `>= 0${se} and < 2${se} ** ${(Q + 1) * 8}${se}` : Ue = `>= -(2${se} ** ${(Q + 1) * 8 - 1}${se}) and < 2 ** ${(Q + 1) * 8 - 1}${se}`, new ie.ERR_OUT_OF_RANGE(\"value\", Ue, B);\n      }\n      De(G, Z, Q);\n    }\n    function _e(B, S) {\n      if (typeof B != \"number\")\n        throw new ie.ERR_INVALID_ARG_TYPE(S, \"number\", B);\n    }\n    function xe(B, S, T) {\n      throw Math.floor(B) !== B ? (_e(B, T), new ie.ERR_OUT_OF_RANGE(\"offset\", \"an integer\", B)) : S < 0 ? new ie.ERR_BUFFER_OUT_OF_BOUNDS() : new ie.ERR_OUT_OF_RANGE(\n        \"offset\",\n        `>= 0 and <= ${S}`,\n        B\n      );\n    }\n    const Be = /[^+/0-9A-Za-z-_]/g;\n    function ye(B) {\n      if (B = B.split(\"=\")[0], B = B.trim().replace(Be, \"\"), B.length < 2) return \"\";\n      for (; B.length % 4 !== 0; )\n        B = B + \"=\";\n      return B;\n    }\n    function be(B, S) {\n      S = S || 1 / 0;\n      let T;\n      const G = B.length;\n      let Z = null;\n      const Q = [];\n      for (let se = 0; se < G; ++se) {\n        if (T = B.charCodeAt(se), T > 55295 && T < 57344) {\n          if (!Z) {\n            if (T > 56319) {\n              (S -= 3) > -1 && Q.push(239, 191, 189);\n              continue;\n            } else if (se + 1 === G) {\n              (S -= 3) > -1 && Q.push(239, 191, 189);\n              continue;\n            }\n            Z = T;\n            continue;\n          }\n          if (T < 56320) {\n            (S -= 3) > -1 && Q.push(239, 191, 189), Z = T;\n            continue;\n          }\n          T = (Z - 55296 << 10 | T - 56320) + 65536;\n        } else Z && (S -= 3) > -1 && Q.push(239, 191, 189);\n        if (Z = null, T < 128) {\n          if ((S -= 1) < 0) break;\n          Q.push(T);\n        } else if (T < 2048) {\n          if ((S -= 2) < 0) break;\n          Q.push(\n            T >> 6 | 192,\n            T & 63 | 128\n          );\n        } else if (T < 65536) {\n          if ((S -= 3) < 0) break;\n          Q.push(\n            T >> 12 | 224,\n            T >> 6 & 63 | 128,\n            T & 63 | 128\n          );\n        } else if (T < 1114112) {\n          if ((S -= 4) < 0) break;\n          Q.push(\n            T >> 18 | 240,\n            T >> 12 & 63 | 128,\n            T >> 6 & 63 | 128,\n            T & 63 | 128\n          );\n        } else\n          throw new Error(\"Invalid code point\");\n      }\n      return Q;\n    }\n    function Fe(B) {\n      const S = [];\n      for (let T = 0; T < B.length; ++T)\n        S.push(B.charCodeAt(T) & 255);\n      return S;\n    }\n    function Xe(B, S) {\n      let T, G, Z;\n      const Q = [];\n      for (let se = 0; se < B.length && !((S -= 2) < 0); ++se)\n        T = B.charCodeAt(se), G = T >> 8, Z = T % 256, Q.push(Z), Q.push(G);\n      return Q;\n    }\n    function we(B) {\n      return e.toByteArray(ye(B));\n    }\n    function Ne(B, S, T, G) {\n      let Z;\n      for (Z = 0; Z < G && !(Z + T >= S.length || Z >= B.length); ++Z)\n        S[Z + T] = B[Z];\n      return Z;\n    }\n    function dt(B, S) {\n      return B instanceof S || B != null && B.constructor != null && B.constructor.name != null && B.constructor.name === S.name;\n    }\n    function Je(B) {\n      return B !== B;\n    }\n    const Qe = (function() {\n      const B = \"0123456789abcdef\", S = new Array(256);\n      for (let T = 0; T < 16; ++T) {\n        const G = T * 16;\n        for (let Z = 0; Z < 16; ++Z)\n          S[G + Z] = B[T] + B[Z];\n      }\n      return S;\n    })();\n    function it(B) {\n      return typeof BigInt > \"u\" ? je : B;\n    }\n    function je() {\n      throw new Error(\"BigInt not supported\");\n    }\n  })(Ga)), Ga;\n}\nvar He = Kc();\nconst ln = typeof globalThis == \"object\" && \"crypto\" in globalThis ? globalThis.crypto : void 0;\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nfunction Ii(s) {\n  return s instanceof Uint8Array || ArrayBuffer.isView(s) && s.constructor.name === \"Uint8Array\";\n}\nfunction Xl(s) {\n  if (!Number.isSafeInteger(s) || s < 0)\n    throw new Error(\"positive integer expected, got \" + s);\n}\nfunction Qs(s, ...e) {\n  if (!Ii(s))\n    throw new Error(\"Uint8Array expected\");\n  if (e.length > 0 && !e.includes(s.length))\n    throw new Error(\"Uint8Array expected of length \" + e + \", got length=\" + s.length);\n}\nfunction Hf(s) {\n  if (typeof s != \"function\" || typeof s.create != \"function\")\n    throw new Error(\"Hash should be wrapped by utils.createHasher\");\n  Xl(s.outputLen), Xl(s.blockLen);\n}\nfunction Do(s, e = !0) {\n  if (s.destroyed)\n    throw new Error(\"Hash instance has been destroyed\");\n  if (e && s.finished)\n    throw new Error(\"Hash#digest() has already been called\");\n}\nfunction O1(s, e) {\n  Qs(s);\n  const t = e.outputLen;\n  if (s.length < t)\n    throw new Error(\"digestInto() expects output buffer of length at least \" + t);\n}\nfunction kn(...s) {\n  for (let e = 0; e < s.length; e++)\n    s[e].fill(0);\n}\nfunction Va(s) {\n  return new DataView(s.buffer, s.byteOffset, s.byteLength);\n}\nfunction Nr(s, e) {\n  return s << 32 - e | s >>> e;\n}\nconst qf = /* @ts-ignore */ typeof Uint8Array.from([]).toHex == \"function\" && typeof Uint8Array.fromHex == \"function\", B1 = /* @__PURE__ */ Array.from({ length: 256 }, (s, e) => e.toString(16).padStart(2, \"0\"));\nfunction Hs(s) {\n  if (Qs(s), qf)\n    return s.toHex();\n  let e = \"\";\n  for (let t = 0; t < s.length; t++)\n    e += B1[s[t]];\n  return e;\n}\nconst rs = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction cd(s) {\n  if (s >= rs._0 && s <= rs._9)\n    return s - rs._0;\n  if (s >= rs.A && s <= rs.F)\n    return s - (rs.A - 10);\n  if (s >= rs.a && s <= rs.f)\n    return s - (rs.a - 10);\n}\nfunction Po(s) {\n  if (typeof s != \"string\")\n    throw new Error(\"hex string expected, got \" + typeof s);\n  if (qf)\n    return Uint8Array.fromHex(s);\n  const e = s.length, t = e / 2;\n  if (e % 2)\n    throw new Error(\"hex string expected, got unpadded hex of length \" + e);\n  const r = new Uint8Array(t);\n  for (let n = 0, i = 0; n < t; n++, i += 2) {\n    const o = cd(s.charCodeAt(i)), a = cd(s.charCodeAt(i + 1));\n    if (o === void 0 || a === void 0) {\n      const l = s[i] + s[i + 1];\n      throw new Error('hex string expected, got non-hex character \"' + l + '\" at index ' + i);\n    }\n    r[n] = o * 16 + a;\n  }\n  return r;\n}\nfunction F1(s) {\n  if (typeof s != \"string\")\n    throw new Error(\"string expected\");\n  return new Uint8Array(new TextEncoder().encode(s));\n}\nfunction Hc(s) {\n  return typeof s == \"string\" && (s = F1(s)), Qs(s), s;\n}\nfunction Kr(...s) {\n  let e = 0;\n  for (let r = 0; r < s.length; r++) {\n    const n = s[r];\n    Qs(n), e += n.length;\n  }\n  const t = new Uint8Array(e);\n  for (let r = 0, n = 0; r < s.length; r++) {\n    const i = s[r];\n    t.set(i, n), n += i.length;\n  }\n  return t;\n}\nclass Wf {\n}\nfunction zf(s) {\n  const e = (r) => s().update(Hc(r)).digest(), t = s();\n  return e.outputLen = t.outputLen, e.blockLen = t.blockLen, e.create = () => s(), e;\n}\nfunction qc(s = 32) {\n  if (ln && typeof ln.getRandomValues == \"function\")\n    return ln.getRandomValues(new Uint8Array(s));\n  if (ln && typeof ln.randomBytes == \"function\")\n    return Uint8Array.from(ln.randomBytes(s));\n  throw new Error(\"crypto.getRandomValues must be defined\");\n}\nfunction N1(s, e, t, r) {\n  if (typeof s.setBigUint64 == \"function\")\n    return s.setBigUint64(e, t, r);\n  const n = BigInt(32), i = BigInt(4294967295), o = Number(t >> n & i), a = Number(t & i), l = r ? 4 : 0, c = r ? 0 : 4;\n  s.setUint32(e + l, o, r), s.setUint32(e + c, a, r);\n}\nfunction U1(s, e, t) {\n  return s & e ^ ~s & t;\n}\nfunction $1(s, e, t) {\n  return s & e ^ s & t ^ e & t;\n}\nclass Yf extends Wf {\n  constructor(e, t, r, n) {\n    super(), this.finished = !1, this.length = 0, this.pos = 0, this.destroyed = !1, this.blockLen = e, this.outputLen = t, this.padOffset = r, this.isLE = n, this.buffer = new Uint8Array(e), this.view = Va(this.buffer);\n  }\n  update(e) {\n    Do(this), e = Hc(e), Qs(e);\n    const { view: t, buffer: r, blockLen: n } = this, i = e.length;\n    for (let o = 0; o < i; ) {\n      const a = Math.min(n - this.pos, i - o);\n      if (a === n) {\n        const l = Va(e);\n        for (; n <= i - o; o += n)\n          this.process(l, o);\n        continue;\n      }\n      r.set(e.subarray(o, o + a), this.pos), this.pos += a, o += a, this.pos === n && (this.process(t, 0), this.pos = 0);\n    }\n    return this.length += e.length, this.roundClean(), this;\n  }\n  digestInto(e) {\n    Do(this), O1(e, this), this.finished = !0;\n    const { buffer: t, view: r, blockLen: n, isLE: i } = this;\n    let { pos: o } = this;\n    t[o++] = 128, kn(this.buffer.subarray(o)), this.padOffset > n - o && (this.process(r, 0), o = 0);\n    for (let d = o; d < n; d++)\n      t[d] = 0;\n    N1(r, n - 8, BigInt(this.length * 8), i), this.process(r, 0);\n    const a = Va(e), l = this.outputLen;\n    if (l % 4)\n      throw new Error(\"_sha2: outputLen should be aligned to 32bit\");\n    const c = l / 4, u = this.get();\n    if (c > u.length)\n      throw new Error(\"_sha2: outputLen bigger than state\");\n    for (let d = 0; d < c; d++)\n      a.setUint32(4 * d, u[d], i);\n  }\n  digest() {\n    const { buffer: e, outputLen: t } = this;\n    this.digestInto(e);\n    const r = e.slice(0, t);\n    return this.destroy(), r;\n  }\n  _cloneInto(e) {\n    e || (e = new this.constructor()), e.set(...this.get());\n    const { blockLen: t, buffer: r, length: n, finished: i, destroyed: o, pos: a } = this;\n    return e.destroyed = o, e.finished = i, e.length = n, e.pos = a, n % t && e.buffer.set(r), e;\n  }\n  clone() {\n    return this._cloneInto();\n  }\n}\nconst ms = /* @__PURE__ */ Uint32Array.from([\n  1779033703,\n  3144134277,\n  1013904242,\n  2773480762,\n  1359893119,\n  2600822924,\n  528734635,\n  1541459225\n]), Qt = /* @__PURE__ */ Uint32Array.from([\n  1779033703,\n  4089235720,\n  3144134277,\n  2227873595,\n  1013904242,\n  4271175723,\n  2773480762,\n  1595750129,\n  1359893119,\n  2917565137,\n  2600822924,\n  725511199,\n  528734635,\n  4215389547,\n  1541459225,\n  327033209\n]), Oi = /* @__PURE__ */ BigInt(2 ** 32 - 1), ud = /* @__PURE__ */ BigInt(32);\nfunction G1(s, e = !1) {\n  return e ? { h: Number(s & Oi), l: Number(s >> ud & Oi) } : { h: Number(s >> ud & Oi) | 0, l: Number(s & Oi) | 0 };\n}\nfunction V1(s, e = !1) {\n  const t = s.length;\n  let r = new Uint32Array(t), n = new Uint32Array(t);\n  for (let i = 0; i < t; i++) {\n    const { h: o, l: a } = G1(s[i], e);\n    [r[i], n[i]] = [o, a];\n  }\n  return [r, n];\n}\nconst dd = (s, e, t) => s >>> t, hd = (s, e, t) => s << 32 - t | e >>> t, cn = (s, e, t) => s >>> t | e << 32 - t, un = (s, e, t) => s << 32 - t | e >>> t, Bi = (s, e, t) => s << 64 - t | e >>> t - 32, Fi = (s, e, t) => s >>> t - 32 | e << 64 - t;\nfunction ss(s, e, t, r) {\n  const n = (e >>> 0) + (r >>> 0);\n  return { h: s + t + (n / 2 ** 32 | 0) | 0, l: n | 0 };\n}\nconst j1 = (s, e, t) => (s >>> 0) + (e >>> 0) + (t >>> 0), K1 = (s, e, t, r) => e + t + r + (s / 2 ** 32 | 0) | 0, H1 = (s, e, t, r) => (s >>> 0) + (e >>> 0) + (t >>> 0) + (r >>> 0), q1 = (s, e, t, r, n) => e + t + r + n + (s / 2 ** 32 | 0) | 0, W1 = (s, e, t, r, n) => (s >>> 0) + (e >>> 0) + (t >>> 0) + (r >>> 0) + (n >>> 0), z1 = (s, e, t, r, n, i) => e + t + r + n + i + (s / 2 ** 32 | 0) | 0, Y1 = /* @__PURE__ */ Uint32Array.from([\n  1116352408,\n  1899447441,\n  3049323471,\n  3921009573,\n  961987163,\n  1508970993,\n  2453635748,\n  2870763221,\n  3624381080,\n  310598401,\n  607225278,\n  1426881987,\n  1925078388,\n  2162078206,\n  2614888103,\n  3248222580,\n  3835390401,\n  4022224774,\n  264347078,\n  604807628,\n  770255983,\n  1249150122,\n  1555081692,\n  1996064986,\n  2554220882,\n  2821834349,\n  2952996808,\n  3210313671,\n  3336571891,\n  3584528711,\n  113926993,\n  338241895,\n  666307205,\n  773529912,\n  1294757372,\n  1396182291,\n  1695183700,\n  1986661051,\n  2177026350,\n  2456956037,\n  2730485921,\n  2820302411,\n  3259730800,\n  3345764771,\n  3516065817,\n  3600352804,\n  4094571909,\n  275423344,\n  430227734,\n  506948616,\n  659060556,\n  883997877,\n  958139571,\n  1322822218,\n  1537002063,\n  1747873779,\n  1955562222,\n  2024104815,\n  2227730452,\n  2361852424,\n  2428436474,\n  2756734187,\n  3204031479,\n  3329325298\n]), ys = /* @__PURE__ */ new Uint32Array(64);\nclass Z1 extends Yf {\n  constructor(e = 32) {\n    super(64, e, 8, !1), this.A = ms[0] | 0, this.B = ms[1] | 0, this.C = ms[2] | 0, this.D = ms[3] | 0, this.E = ms[4] | 0, this.F = ms[5] | 0, this.G = ms[6] | 0, this.H = ms[7] | 0;\n  }\n  get() {\n    const { A: e, B: t, C: r, D: n, E: i, F: o, G: a, H: l } = this;\n    return [e, t, r, n, i, o, a, l];\n  }\n  // prettier-ignore\n  set(e, t, r, n, i, o, a, l) {\n    this.A = e | 0, this.B = t | 0, this.C = r | 0, this.D = n | 0, this.E = i | 0, this.F = o | 0, this.G = a | 0, this.H = l | 0;\n  }\n  process(e, t) {\n    for (let d = 0; d < 16; d++, t += 4)\n      ys[d] = e.getUint32(t, !1);\n    for (let d = 16; d < 64; d++) {\n      const h = ys[d - 15], f = ys[d - 2], p = Nr(h, 7) ^ Nr(h, 18) ^ h >>> 3, y = Nr(f, 17) ^ Nr(f, 19) ^ f >>> 10;\n      ys[d] = y + ys[d - 7] + p + ys[d - 16] | 0;\n    }\n    let { A: r, B: n, C: i, D: o, E: a, F: l, G: c, H: u } = this;\n    for (let d = 0; d < 64; d++) {\n      const h = Nr(a, 6) ^ Nr(a, 11) ^ Nr(a, 25), f = u + h + U1(a, l, c) + Y1[d] + ys[d] | 0, y = (Nr(r, 2) ^ Nr(r, 13) ^ Nr(r, 22)) + $1(r, n, i) | 0;\n      u = c, c = l, l = a, a = o + f | 0, o = i, i = n, n = r, r = f + y | 0;\n    }\n    r = r + this.A | 0, n = n + this.B | 0, i = i + this.C | 0, o = o + this.D | 0, a = a + this.E | 0, l = l + this.F | 0, c = c + this.G | 0, u = u + this.H | 0, this.set(r, n, i, o, a, l, c, u);\n  }\n  roundClean() {\n    kn(ys);\n  }\n  destroy() {\n    this.set(0, 0, 0, 0, 0, 0, 0, 0), kn(this.buffer);\n  }\n}\nconst Zf = V1([\n  \"0x428a2f98d728ae22\",\n  \"0x7137449123ef65cd\",\n  \"0xb5c0fbcfec4d3b2f\",\n  \"0xe9b5dba58189dbbc\",\n  \"0x3956c25bf348b538\",\n  \"0x59f111f1b605d019\",\n  \"0x923f82a4af194f9b\",\n  \"0xab1c5ed5da6d8118\",\n  \"0xd807aa98a3030242\",\n  \"0x12835b0145706fbe\",\n  \"0x243185be4ee4b28c\",\n  \"0x550c7dc3d5ffb4e2\",\n  \"0x72be5d74f27b896f\",\n  \"0x80deb1fe3b1696b1\",\n  \"0x9bdc06a725c71235\",\n  \"0xc19bf174cf692694\",\n  \"0xe49b69c19ef14ad2\",\n  \"0xefbe4786384f25e3\",\n  \"0x0fc19dc68b8cd5b5\",\n  \"0x240ca1cc77ac9c65\",\n  \"0x2de92c6f592b0275\",\n  \"0x4a7484aa6ea6e483\",\n  \"0x5cb0a9dcbd41fbd4\",\n  \"0x76f988da831153b5\",\n  \"0x983e5152ee66dfab\",\n  \"0xa831c66d2db43210\",\n  \"0xb00327c898fb213f\",\n  \"0xbf597fc7beef0ee4\",\n  \"0xc6e00bf33da88fc2\",\n  \"0xd5a79147930aa725\",\n  \"0x06ca6351e003826f\",\n  \"0x142929670a0e6e70\",\n  \"0x27b70a8546d22ffc\",\n  \"0x2e1b21385c26c926\",\n  \"0x4d2c6dfc5ac42aed\",\n  \"0x53380d139d95b3df\",\n  \"0x650a73548baf63de\",\n  \"0x766a0abb3c77b2a8\",\n  \"0x81c2c92e47edaee6\",\n  \"0x92722c851482353b\",\n  \"0xa2bfe8a14cf10364\",\n  \"0xa81a664bbc423001\",\n  \"0xc24b8b70d0f89791\",\n  \"0xc76c51a30654be30\",\n  \"0xd192e819d6ef5218\",\n  \"0xd69906245565a910\",\n  \"0xf40e35855771202a\",\n  \"0x106aa07032bbd1b8\",\n  \"0x19a4c116b8d2d0c8\",\n  \"0x1e376c085141ab53\",\n  \"0x2748774cdf8eeb99\",\n  \"0x34b0bcb5e19b48a8\",\n  \"0x391c0cb3c5c95a63\",\n  \"0x4ed8aa4ae3418acb\",\n  \"0x5b9cca4f7763e373\",\n  \"0x682e6ff3d6b2b8a3\",\n  \"0x748f82ee5defb2fc\",\n  \"0x78a5636f43172f60\",\n  \"0x84c87814a1f0ab72\",\n  \"0x8cc702081a6439ec\",\n  \"0x90befffa23631e28\",\n  \"0xa4506cebde82bde9\",\n  \"0xbef9a3f7b2c67915\",\n  \"0xc67178f2e372532b\",\n  \"0xca273eceea26619c\",\n  \"0xd186b8c721c0c207\",\n  \"0xeada7dd6cde0eb1e\",\n  \"0xf57d4f7fee6ed178\",\n  \"0x06f067aa72176fba\",\n  \"0x0a637dc5a2c898a6\",\n  \"0x113f9804bef90dae\",\n  \"0x1b710b35131c471b\",\n  \"0x28db77f523047d84\",\n  \"0x32caab7b40c72493\",\n  \"0x3c9ebe0a15c9bebc\",\n  \"0x431d67c49c100d4c\",\n  \"0x4cc5d4becb3e42b6\",\n  \"0x597f299cfc657e2a\",\n  \"0x5fcb6fab3ad6faec\",\n  \"0x6c44198c4a475817\"\n].map((s) => BigInt(s))), X1 = Zf[0], J1 = Zf[1], vs = /* @__PURE__ */ new Uint32Array(80), Es = /* @__PURE__ */ new Uint32Array(80);\nclass Q1 extends Yf {\n  constructor(e = 64) {\n    super(128, e, 16, !1), this.Ah = Qt[0] | 0, this.Al = Qt[1] | 0, this.Bh = Qt[2] | 0, this.Bl = Qt[3] | 0, this.Ch = Qt[4] | 0, this.Cl = Qt[5] | 0, this.Dh = Qt[6] | 0, this.Dl = Qt[7] | 0, this.Eh = Qt[8] | 0, this.El = Qt[9] | 0, this.Fh = Qt[10] | 0, this.Fl = Qt[11] | 0, this.Gh = Qt[12] | 0, this.Gl = Qt[13] | 0, this.Hh = Qt[14] | 0, this.Hl = Qt[15] | 0;\n  }\n  // prettier-ignore\n  get() {\n    const { Ah: e, Al: t, Bh: r, Bl: n, Ch: i, Cl: o, Dh: a, Dl: l, Eh: c, El: u, Fh: d, Fl: h, Gh: f, Gl: p, Hh: y, Hl: E } = this;\n    return [e, t, r, n, i, o, a, l, c, u, d, h, f, p, y, E];\n  }\n  // prettier-ignore\n  set(e, t, r, n, i, o, a, l, c, u, d, h, f, p, y, E) {\n    this.Ah = e | 0, this.Al = t | 0, this.Bh = r | 0, this.Bl = n | 0, this.Ch = i | 0, this.Cl = o | 0, this.Dh = a | 0, this.Dl = l | 0, this.Eh = c | 0, this.El = u | 0, this.Fh = d | 0, this.Fl = h | 0, this.Gh = f | 0, this.Gl = p | 0, this.Hh = y | 0, this.Hl = E | 0;\n  }\n  process(e, t) {\n    for (let A = 0; A < 16; A++, t += 4)\n      vs[A] = e.getUint32(t), Es[A] = e.getUint32(t += 4);\n    for (let A = 16; A < 80; A++) {\n      const F = vs[A - 15] | 0, M = Es[A - 15] | 0, H = cn(F, M, 1) ^ cn(F, M, 8) ^ dd(F, M, 7), K = un(F, M, 1) ^ un(F, M, 8) ^ hd(F, M, 7), j = vs[A - 2] | 0, C = Es[A - 2] | 0, k = cn(j, C, 19) ^ Bi(j, C, 61) ^ dd(j, C, 6), $ = un(j, C, 19) ^ Fi(j, C, 61) ^ hd(j, C, 6), W = H1(K, $, Es[A - 7], Es[A - 16]), _ = q1(W, H, k, vs[A - 7], vs[A - 16]);\n      vs[A] = _ | 0, Es[A] = W | 0;\n    }\n    let { Ah: r, Al: n, Bh: i, Bl: o, Ch: a, Cl: l, Dh: c, Dl: u, Eh: d, El: h, Fh: f, Fl: p, Gh: y, Gl: E, Hh: b, Hl: R } = this;\n    for (let A = 0; A < 80; A++) {\n      const F = cn(d, h, 14) ^ cn(d, h, 18) ^ Bi(d, h, 41), M = un(d, h, 14) ^ un(d, h, 18) ^ Fi(d, h, 41), H = d & f ^ ~d & y, K = h & p ^ ~h & E, j = W1(R, M, K, J1[A], Es[A]), C = z1(j, b, F, H, X1[A], vs[A]), k = j | 0, $ = cn(r, n, 28) ^ Bi(r, n, 34) ^ Bi(r, n, 39), W = un(r, n, 28) ^ Fi(r, n, 34) ^ Fi(r, n, 39), _ = r & i ^ r & a ^ i & a, g = n & o ^ n & l ^ o & l;\n      b = y | 0, R = E | 0, y = f | 0, E = p | 0, f = d | 0, p = h | 0, { h: d, l: h } = ss(c | 0, u | 0, C | 0, k | 0), c = a | 0, u = l | 0, a = i | 0, l = o | 0, i = r | 0, o = n | 0;\n      const x = j1(k, W, g);\n      r = K1(x, C, $, _), n = x | 0;\n    }\n    ({ h: r, l: n } = ss(this.Ah | 0, this.Al | 0, r | 0, n | 0)), { h: i, l: o } = ss(this.Bh | 0, this.Bl | 0, i | 0, o | 0), { h: a, l } = ss(this.Ch | 0, this.Cl | 0, a | 0, l | 0), { h: c, l: u } = ss(this.Dh | 0, this.Dl | 0, c | 0, u | 0), { h: d, l: h } = ss(this.Eh | 0, this.El | 0, d | 0, h | 0), { h: f, l: p } = ss(this.Fh | 0, this.Fl | 0, f | 0, p | 0), { h: y, l: E } = ss(this.Gh | 0, this.Gl | 0, y | 0, E | 0), { h: b, l: R } = ss(this.Hh | 0, this.Hl | 0, b | 0, R | 0), this.set(r, n, i, o, a, l, c, u, d, h, f, p, y, E, b, R);\n  }\n  roundClean() {\n    kn(vs, Es);\n  }\n  destroy() {\n    kn(this.buffer), this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n  }\n}\nconst Xf = /* @__PURE__ */ zf(() => new Z1()), ey = /* @__PURE__ */ zf(() => new Q1());\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst Wc = /* @__PURE__ */ BigInt(0), Jl = /* @__PURE__ */ BigInt(1);\nfunction Xs(s, e = \"\") {\n  if (typeof s != \"boolean\") {\n    const t = e && `\"${e}\"`;\n    throw new Error(t + \"expected boolean, got type=\" + typeof s);\n  }\n  return s;\n}\nfunction Or(s, e, t = \"\") {\n  const r = Ii(s), n = s == null ? void 0 : s.length, i = e !== void 0;\n  if (!r || i && n !== e) {\n    const o = t && `\"${t}\" `, a = i ? ` of length ${e}` : \"\", l = r ? `length=${n}` : `type=${typeof s}`;\n    throw new Error(o + \"expected Uint8Array\" + a + \", got \" + l);\n  }\n  return s;\n}\nfunction Ni(s) {\n  const e = s.toString(16);\n  return e.length & 1 ? \"0\" + e : e;\n}\nfunction Jf(s) {\n  if (typeof s != \"string\")\n    throw new Error(\"hex string expected, got \" + typeof s);\n  return s === \"\" ? Wc : BigInt(\"0x\" + s);\n}\nfunction la(s) {\n  return Jf(Hs(s));\n}\nfunction ei(s) {\n  return Qs(s), Jf(Hs(Uint8Array.from(s).reverse()));\n}\nfunction zc(s, e) {\n  return Po(s.toString(16).padStart(e * 2, \"0\"));\n}\nfunction Qf(s, e) {\n  return zc(s, e).reverse();\n}\nfunction Et(s, e, t) {\n  let r;\n  if (typeof e == \"string\")\n    try {\n      r = Po(e);\n    } catch (i) {\n      throw new Error(s + \" must be hex string or Uint8Array, cause: \" + i);\n    }\n  else if (Ii(e))\n    r = Uint8Array.from(e);\n  else\n    throw new Error(s + \" must be hex string or Uint8Array\");\n  const n = r.length;\n  if (typeof t == \"number\" && n !== t)\n    throw new Error(s + \" of length \" + t + \" expected, got \" + n);\n  return r;\n}\nfunction fd(s) {\n  return Uint8Array.from(s);\n}\nconst ja = (s) => typeof s == \"bigint\" && Wc <= s;\nfunction ty(s, e, t) {\n  return ja(s) && ja(e) && ja(t) && e <= s && s < t;\n}\nfunction Ql(s, e, t, r) {\n  if (!ty(e, t, r))\n    throw new Error(\"expected valid \" + s + \": \" + t + \" <= n < \" + r + \", got \" + e);\n}\nfunction e0(s) {\n  let e;\n  for (e = 0; s > Wc; s >>= Jl, e += 1)\n    ;\n  return e;\n}\nconst _i = (s) => (Jl << BigInt(s)) - Jl;\nfunction ry(s, e, t) {\n  if (typeof s != \"number\" || s < 2)\n    throw new Error(\"hashLen must be a number\");\n  if (typeof e != \"number\" || e < 2)\n    throw new Error(\"qByteLen must be a number\");\n  if (typeof t != \"function\")\n    throw new Error(\"hmacFn must be a function\");\n  const r = (f) => new Uint8Array(f), n = (f) => Uint8Array.of(f);\n  let i = r(s), o = r(s), a = 0;\n  const l = () => {\n    i.fill(1), o.fill(0), a = 0;\n  }, c = (...f) => t(o, i, ...f), u = (f = r(0)) => {\n    o = c(n(0), f), i = c(), f.length !== 0 && (o = c(n(1), f), i = c());\n  }, d = () => {\n    if (a++ >= 1e3)\n      throw new Error(\"drbg: tried 1000 values\");\n    let f = 0;\n    const p = [];\n    for (; f < e; ) {\n      i = c();\n      const y = i.slice();\n      p.push(y), f += i.length;\n    }\n    return Kr(...p);\n  };\n  return (f, p) => {\n    l(), u(f);\n    let y;\n    for (; !(y = p(d())); )\n      u();\n    return l(), y;\n  };\n}\nfunction Ri(s, e, t = {}) {\n  if (!s || typeof s != \"object\")\n    throw new Error(\"expected valid options object\");\n  function r(n, i, o) {\n    const a = s[n];\n    if (o && a === void 0)\n      return;\n    const l = typeof a;\n    if (l !== i || a === null)\n      throw new Error(`param \"${n}\" is invalid: expected ${i}, got ${l}`);\n  }\n  Object.entries(e).forEach(([n, i]) => r(n, i, !1)), Object.entries(t).forEach(([n, i]) => r(n, i, !0));\n}\nfunction Mo(s) {\n  const e = /* @__PURE__ */ new WeakMap();\n  return (t, ...r) => {\n    const n = e.get(t);\n    if (n !== void 0)\n      return n;\n    const i = s(t, ...r);\n    return e.set(t, i), i;\n  };\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst gr = BigInt(0), Xt = BigInt(1), Gs = /* @__PURE__ */ BigInt(2), t0 = /* @__PURE__ */ BigInt(3), r0 = /* @__PURE__ */ BigInt(4), s0 = /* @__PURE__ */ BigInt(5), sy = /* @__PURE__ */ BigInt(7), n0 = /* @__PURE__ */ BigInt(8), ny = /* @__PURE__ */ BigInt(9), i0 = /* @__PURE__ */ BigInt(16);\nfunction Gt(s, e) {\n  const t = s % e;\n  return t >= gr ? t : e + t;\n}\nfunction vt(s, e, t) {\n  let r = s;\n  for (; e-- > gr; )\n    r *= r, r %= t;\n  return r;\n}\nfunction gd(s, e) {\n  if (s === gr)\n    throw new Error(\"invert: expected non-zero number\");\n  if (e <= gr)\n    throw new Error(\"invert: expected positive modulus, got \" + e);\n  let t = Gt(s, e), r = e, n = gr, i = Xt;\n  for (; t !== gr; ) {\n    const a = r / t, l = r % t, c = n - i * a;\n    r = t, t = l, n = i, i = c;\n  }\n  if (r !== Xt)\n    throw new Error(\"invert: does not exist\");\n  return Gt(n, e);\n}\nfunction Yc(s, e, t) {\n  if (!s.eql(s.sqr(e), t))\n    throw new Error(\"Cannot find square root\");\n}\nfunction o0(s, e) {\n  const t = (s.ORDER + Xt) / r0, r = s.pow(e, t);\n  return Yc(s, r, e), r;\n}\nfunction iy(s, e) {\n  const t = (s.ORDER - s0) / n0, r = s.mul(e, Gs), n = s.pow(r, t), i = s.mul(e, n), o = s.mul(s.mul(i, Gs), n), a = s.mul(i, s.sub(o, s.ONE));\n  return Yc(s, a, e), a;\n}\nfunction oy(s) {\n  const e = en(s), t = a0(s), r = t(e, e.neg(e.ONE)), n = t(e, r), i = t(e, e.neg(r)), o = (s + sy) / i0;\n  return (a, l) => {\n    let c = a.pow(l, o), u = a.mul(c, r);\n    const d = a.mul(c, n), h = a.mul(c, i), f = a.eql(a.sqr(u), l), p = a.eql(a.sqr(d), l);\n    c = a.cmov(c, u, f), u = a.cmov(h, d, p);\n    const y = a.eql(a.sqr(u), l), E = a.cmov(c, u, y);\n    return Yc(a, E, l), E;\n  };\n}\nfunction a0(s) {\n  if (s < t0)\n    throw new Error(\"sqrt is not defined for small field\");\n  let e = s - Xt, t = 0;\n  for (; e % Gs === gr; )\n    e /= Gs, t++;\n  let r = Gs;\n  const n = en(s);\n  for (; pd(n, r) === 1; )\n    if (r++ > 1e3)\n      throw new Error(\"Cannot find square root: probably non-prime P\");\n  if (t === 1)\n    return o0;\n  let i = n.pow(r, e);\n  const o = (e + Xt) / Gs;\n  return function(l, c) {\n    if (l.is0(c))\n      return c;\n    if (pd(l, c) !== 1)\n      throw new Error(\"Cannot find square root\");\n    let u = t, d = l.mul(l.ONE, i), h = l.pow(c, e), f = l.pow(c, o);\n    for (; !l.eql(h, l.ONE); ) {\n      if (l.is0(h))\n        return l.ZERO;\n      let p = 1, y = l.sqr(h);\n      for (; !l.eql(y, l.ONE); )\n        if (p++, y = l.sqr(y), p === u)\n          throw new Error(\"Cannot find square root\");\n      const E = Xt << BigInt(u - p - 1), b = l.pow(d, E);\n      u = p, d = l.sqr(b), h = l.mul(h, d), f = l.mul(f, b);\n    }\n    return f;\n  };\n}\nfunction ay(s) {\n  return s % r0 === t0 ? o0 : s % n0 === s0 ? iy : s % i0 === ny ? oy(s) : a0(s);\n}\nconst ly = (s, e) => (Gt(s, e) & Xt) === Xt, cy = [\n  \"create\",\n  \"isValid\",\n  \"is0\",\n  \"neg\",\n  \"inv\",\n  \"sqrt\",\n  \"sqr\",\n  \"eql\",\n  \"add\",\n  \"sub\",\n  \"mul\",\n  \"pow\",\n  \"div\",\n  \"addN\",\n  \"subN\",\n  \"mulN\",\n  \"sqrN\"\n];\nfunction uy(s) {\n  const e = {\n    ORDER: \"bigint\",\n    MASK: \"bigint\",\n    BYTES: \"number\",\n    BITS: \"number\"\n  }, t = cy.reduce((r, n) => (r[n] = \"function\", r), e);\n  return Ri(s, t), s;\n}\nfunction dy(s, e, t) {\n  if (t < gr)\n    throw new Error(\"invalid exponent, negatives unsupported\");\n  if (t === gr)\n    return s.ONE;\n  if (t === Xt)\n    return e;\n  let r = s.ONE, n = e;\n  for (; t > gr; )\n    t & Xt && (r = s.mul(r, n)), n = s.sqr(n), t >>= Xt;\n  return r;\n}\nfunction l0(s, e, t = !1) {\n  const r = new Array(e.length).fill(t ? s.ZERO : void 0), n = e.reduce((o, a, l) => s.is0(a) ? o : (r[l] = o, s.mul(o, a)), s.ONE), i = s.inv(n);\n  return e.reduceRight((o, a, l) => s.is0(a) ? o : (r[l] = s.mul(o, r[l]), s.mul(o, a)), i), r;\n}\nfunction pd(s, e) {\n  const t = (s.ORDER - Xt) / Gs, r = s.pow(e, t), n = s.eql(r, s.ONE), i = s.eql(r, s.ZERO), o = s.eql(r, s.neg(s.ONE));\n  if (!n && !i && !o)\n    throw new Error(\"invalid Legendre symbol result\");\n  return n ? 1 : i ? 0 : -1;\n}\nfunction c0(s, e) {\n  e !== void 0 && Xl(e);\n  const t = e !== void 0 ? e : s.toString(2).length, r = Math.ceil(t / 8);\n  return { nBitLength: t, nByteLength: r };\n}\nfunction en(s, e, t = !1, r = {}) {\n  if (s <= gr)\n    throw new Error(\"invalid field: expected ORDER > 0, got \" + s);\n  let n, i, o = !1, a;\n  if (typeof e == \"object\" && e != null) {\n    if (r.sqrt || t)\n      throw new Error(\"cannot specify opts in two arguments\");\n    const h = e;\n    h.BITS && (n = h.BITS), h.sqrt && (i = h.sqrt), typeof h.isLE == \"boolean\" && (t = h.isLE), typeof h.modFromBytes == \"boolean\" && (o = h.modFromBytes), a = h.allowedLengths;\n  } else\n    typeof e == \"number\" && (n = e), r.sqrt && (i = r.sqrt);\n  const { nBitLength: l, nByteLength: c } = c0(s, n);\n  if (c > 2048)\n    throw new Error(\"invalid field: expected ORDER of <= 2048 bytes\");\n  let u;\n  const d = Object.freeze({\n    ORDER: s,\n    isLE: t,\n    BITS: l,\n    BYTES: c,\n    MASK: _i(l),\n    ZERO: gr,\n    ONE: Xt,\n    allowedLengths: a,\n    create: (h) => Gt(h, s),\n    isValid: (h) => {\n      if (typeof h != \"bigint\")\n        throw new Error(\"invalid field element: expected bigint, got \" + typeof h);\n      return gr <= h && h < s;\n    },\n    is0: (h) => h === gr,\n    // is valid and invertible\n    isValidNot0: (h) => !d.is0(h) && d.isValid(h),\n    isOdd: (h) => (h & Xt) === Xt,\n    neg: (h) => Gt(-h, s),\n    eql: (h, f) => h === f,\n    sqr: (h) => Gt(h * h, s),\n    add: (h, f) => Gt(h + f, s),\n    sub: (h, f) => Gt(h - f, s),\n    mul: (h, f) => Gt(h * f, s),\n    pow: (h, f) => dy(d, h, f),\n    div: (h, f) => Gt(h * gd(f, s), s),\n    // Same as above, but doesn't normalize\n    sqrN: (h) => h * h,\n    addN: (h, f) => h + f,\n    subN: (h, f) => h - f,\n    mulN: (h, f) => h * f,\n    inv: (h) => gd(h, s),\n    sqrt: i || ((h) => (u || (u = ay(s)), u(d, h))),\n    toBytes: (h) => t ? Qf(h, c) : zc(h, c),\n    fromBytes: (h, f = !0) => {\n      if (a) {\n        if (!a.includes(h.length) || h.length > c)\n          throw new Error(\"Field.fromBytes: expected \" + a + \" bytes, got \" + h.length);\n        const y = new Uint8Array(c);\n        y.set(h, t ? 0 : y.length - h.length), h = y;\n      }\n      if (h.length !== c)\n        throw new Error(\"Field.fromBytes: expected \" + c + \" bytes, got \" + h.length);\n      let p = t ? ei(h) : la(h);\n      if (o && (p = Gt(p, s)), !f && !d.isValid(p))\n        throw new Error(\"invalid field element: outside of range 0..ORDER\");\n      return p;\n    },\n    // TODO: we don't need it here, move out to separate fn\n    invertBatch: (h) => l0(d, h),\n    // We can't move this out because Fp6, Fp12 implement it\n    // and it's unclear what to return in there.\n    cmov: (h, f, p) => p ? f : h\n  });\n  return Object.freeze(d);\n}\nfunction u0(s) {\n  if (typeof s != \"bigint\")\n    throw new Error(\"field order must be bigint\");\n  const e = s.toString(2).length;\n  return Math.ceil(e / 8);\n}\nfunction d0(s) {\n  const e = u0(s);\n  return e + Math.ceil(e / 2);\n}\nfunction hy(s, e, t = !1) {\n  const r = s.length, n = u0(e), i = d0(e);\n  if (r < 16 || r < i || r > 1024)\n    throw new Error(\"expected \" + i + \"-1024 bytes of input, got \" + r);\n  const o = t ? ei(s) : la(s), a = Gt(o, e - Xt) + Xt;\n  return t ? Qf(a, n) : zc(a, n);\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst Dn = BigInt(0), Vs = BigInt(1);\nfunction Oo(s, e) {\n  const t = e.negate();\n  return s ? t : e;\n}\nfunction js(s, e) {\n  const t = l0(s.Fp, e.map((r) => r.Z));\n  return e.map((r, n) => s.fromAffine(r.toAffine(t[n])));\n}\nfunction h0(s, e) {\n  if (!Number.isSafeInteger(s) || s <= 0 || s > e)\n    throw new Error(\"invalid window size, expected [1..\" + e + \"], got W=\" + s);\n}\nfunction Ka(s, e) {\n  h0(s, e);\n  const t = Math.ceil(e / s) + 1, r = 2 ** (s - 1), n = 2 ** s, i = _i(s), o = BigInt(s);\n  return { windows: t, windowSize: r, mask: i, maxNumber: n, shiftBy: o };\n}\nfunction md(s, e, t) {\n  const { windowSize: r, mask: n, maxNumber: i, shiftBy: o } = t;\n  let a = Number(s & n), l = s >> o;\n  a > r && (a -= i, l += Vs);\n  const c = e * r, u = c + Math.abs(a) - 1, d = a === 0, h = a < 0, f = e % 2 !== 0;\n  return { nextN: l, offset: u, isZero: d, isNeg: h, isNegF: f, offsetF: c };\n}\nfunction fy(s, e) {\n  if (!Array.isArray(s))\n    throw new Error(\"array expected\");\n  s.forEach((t, r) => {\n    if (!(t instanceof e))\n      throw new Error(\"invalid point at index \" + r);\n  });\n}\nfunction gy(s, e) {\n  if (!Array.isArray(s))\n    throw new Error(\"array of scalars expected\");\n  s.forEach((t, r) => {\n    if (!e.isValid(t))\n      throw new Error(\"invalid scalar at index \" + r);\n  });\n}\nconst Ha = /* @__PURE__ */ new WeakMap(), f0 = /* @__PURE__ */ new WeakMap();\nfunction qa(s) {\n  return f0.get(s) || 1;\n}\nfunction yd(s) {\n  if (s !== Dn)\n    throw new Error(\"invalid wNAF\");\n}\nclass g0 {\n  // Parametrized with a given Point class (not individual point)\n  constructor(e, t) {\n    this.BASE = e.BASE, this.ZERO = e.ZERO, this.Fn = e.Fn, this.bits = t;\n  }\n  // non-const time multiplication ladder\n  _unsafeLadder(e, t, r = this.ZERO) {\n    let n = e;\n    for (; t > Dn; )\n      t & Vs && (r = r.add(n)), n = n.double(), t >>= Vs;\n    return r;\n  }\n  /**\n   * Creates a wNAF precomputation window. Used for caching.\n   * Default window size is set by `utils.precompute()` and is equal to 8.\n   * Number of precomputed points depends on the curve size:\n   * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n   * - 𝑊 is the window size\n   * - 𝑛 is the bitlength of the curve order.\n   * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n   * @param point Point instance\n   * @param W window size\n   * @returns precomputed point tables flattened to a single array\n   */\n  precomputeWindow(e, t) {\n    const { windows: r, windowSize: n } = Ka(t, this.bits), i = [];\n    let o = e, a = o;\n    for (let l = 0; l < r; l++) {\n      a = o, i.push(a);\n      for (let c = 1; c < n; c++)\n        a = a.add(o), i.push(a);\n      o = a.double();\n    }\n    return i;\n  }\n  /**\n   * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n   * More compact implementation:\n   * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n   * @returns real and fake (for const-time) points\n   */\n  wNAF(e, t, r) {\n    if (!this.Fn.isValid(r))\n      throw new Error(\"invalid scalar\");\n    let n = this.ZERO, i = this.BASE;\n    const o = Ka(e, this.bits);\n    for (let a = 0; a < o.windows; a++) {\n      const { nextN: l, offset: c, isZero: u, isNeg: d, isNegF: h, offsetF: f } = md(r, a, o);\n      r = l, u ? i = i.add(Oo(h, t[f])) : n = n.add(Oo(d, t[c]));\n    }\n    return yd(r), { p: n, f: i };\n  }\n  /**\n   * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n   * @param acc accumulator point to add result of multiplication\n   * @returns point\n   */\n  wNAFUnsafe(e, t, r, n = this.ZERO) {\n    const i = Ka(e, this.bits);\n    for (let o = 0; o < i.windows && r !== Dn; o++) {\n      const { nextN: a, offset: l, isZero: c, isNeg: u } = md(r, o, i);\n      if (r = a, !c) {\n        const d = t[l];\n        n = n.add(u ? d.negate() : d);\n      }\n    }\n    return yd(r), n;\n  }\n  getPrecomputes(e, t, r) {\n    let n = Ha.get(t);\n    return n || (n = this.precomputeWindow(t, e), e !== 1 && (typeof r == \"function\" && (n = r(n)), Ha.set(t, n))), n;\n  }\n  cached(e, t, r) {\n    const n = qa(e);\n    return this.wNAF(n, this.getPrecomputes(n, e, r), t);\n  }\n  unsafe(e, t, r, n) {\n    const i = qa(e);\n    return i === 1 ? this._unsafeLadder(e, t, n) : this.wNAFUnsafe(i, this.getPrecomputes(i, e, r), t, n);\n  }\n  // We calculate precomputes for elliptic curve point multiplication\n  // using windowed method. This specifies window size and\n  // stores precomputed values. Usually only base point would be precomputed.\n  createCache(e, t) {\n    h0(t, this.bits), f0.set(e, t), Ha.delete(e);\n  }\n  hasCache(e) {\n    return qa(e) !== 1;\n  }\n}\nfunction py(s, e, t, r) {\n  let n = e, i = s.ZERO, o = s.ZERO;\n  for (; t > Dn || r > Dn; )\n    t & Vs && (i = i.add(n)), r & Vs && (o = o.add(n)), n = n.double(), t >>= Vs, r >>= Vs;\n  return { p1: i, p2: o };\n}\nfunction p0(s, e, t, r) {\n  fy(t, s), gy(r, e);\n  const n = t.length, i = r.length;\n  if (n !== i)\n    throw new Error(\"arrays of points and scalars must have equal length\");\n  const o = s.ZERO, a = e0(BigInt(n));\n  let l = 1;\n  a > 12 ? l = a - 3 : a > 4 ? l = a - 2 : a > 0 && (l = 2);\n  const c = _i(l), u = new Array(Number(c) + 1).fill(o), d = Math.floor((e.BITS - 1) / l) * l;\n  let h = o;\n  for (let f = d; f >= 0; f -= l) {\n    u.fill(o);\n    for (let y = 0; y < i; y++) {\n      const E = r[y], b = Number(E >> BigInt(f) & c);\n      u[b] = u[b].add(t[y]);\n    }\n    let p = o;\n    for (let y = u.length - 1, E = o; y > 0; y--)\n      E = E.add(u[y]), p = p.add(E);\n    if (h = h.add(p), f !== 0)\n      for (let y = 0; y < l; y++)\n        h = h.double();\n  }\n  return h;\n}\nfunction vd(s, e, t) {\n  if (e) {\n    if (e.ORDER !== s)\n      throw new Error(\"Field.ORDER must match order: Fp == p, Fn == n\");\n    return uy(e), e;\n  } else\n    return en(s, { isLE: t });\n}\nfunction m0(s, e, t = {}, r) {\n  if (r === void 0 && (r = s === \"edwards\"), !e || typeof e != \"object\")\n    throw new Error(`expected valid ${s} CURVE object`);\n  for (const l of [\"p\", \"n\", \"h\"]) {\n    const c = e[l];\n    if (!(typeof c == \"bigint\" && c > Dn))\n      throw new Error(`CURVE.${l} must be positive bigint`);\n  }\n  const n = vd(e.p, t.Fp, r), i = vd(e.n, t.Fn, r), a = [\"Gx\", \"Gy\", \"a\", s === \"weierstrass\" ? \"b\" : \"d\"];\n  for (const l of a)\n    if (!n.isValid(e[l]))\n      throw new Error(`CURVE.${l} must be valid field element of CURVE.Fp`);\n  return e = Object.freeze(Object.assign({}, e)), { CURVE: e, Fp: n, Fn: i };\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst xs = BigInt(0), zt = BigInt(1), Wa = BigInt(2), my = BigInt(8);\nfunction yy(s, e, t, r) {\n  const n = s.sqr(t), i = s.sqr(r), o = s.add(s.mul(e.a, n), i), a = s.add(s.ONE, s.mul(e.d, s.mul(n, i)));\n  return s.eql(o, a);\n}\nfunction vy(s, e = {}) {\n  const t = m0(\"edwards\", s, e, e.FpFnLE), { Fp: r, Fn: n } = t;\n  let i = t.CURVE;\n  const { h: o } = i;\n  Ri(e, {}, { uvRatio: \"function\" });\n  const a = Wa << BigInt(n.BYTES * 8) - zt, l = (E) => r.create(E), c = e.uvRatio || ((E, b) => {\n    try {\n      return { isValid: !0, value: r.sqrt(r.div(E, b)) };\n    } catch {\n      return { isValid: !1, value: xs };\n    }\n  });\n  if (!yy(r, i, i.Gx, i.Gy))\n    throw new Error(\"bad curve params: generator point\");\n  function u(E, b, R = !1) {\n    const A = R ? zt : xs;\n    return Ql(\"coordinate \" + E, b, A, a), b;\n  }\n  function d(E) {\n    if (!(E instanceof p))\n      throw new Error(\"ExtendedPoint expected\");\n  }\n  const h = Mo((E, b) => {\n    const { X: R, Y: A, Z: F } = E, M = E.is0();\n    b == null && (b = M ? my : r.inv(F));\n    const H = l(R * b), K = l(A * b), j = r.mul(F, b);\n    if (M)\n      return { x: xs, y: zt };\n    if (j !== zt)\n      throw new Error(\"invZ was invalid\");\n    return { x: H, y: K };\n  }), f = Mo((E) => {\n    const { a: b, d: R } = i;\n    if (E.is0())\n      throw new Error(\"bad point: ZERO\");\n    const { X: A, Y: F, Z: M, T: H } = E, K = l(A * A), j = l(F * F), C = l(M * M), k = l(C * C), $ = l(K * b), W = l(C * l($ + j)), _ = l(k + l(R * l(K * j)));\n    if (W !== _)\n      throw new Error(\"bad point: equation left != right (1)\");\n    const g = l(A * F), x = l(M * H);\n    if (g !== x)\n      throw new Error(\"bad point: equation left != right (2)\");\n    return !0;\n  });\n  class p {\n    constructor(b, R, A, F) {\n      this.X = u(\"x\", b), this.Y = u(\"y\", R), this.Z = u(\"z\", A, !0), this.T = u(\"t\", F), Object.freeze(this);\n    }\n    static CURVE() {\n      return i;\n    }\n    static fromAffine(b) {\n      if (b instanceof p)\n        throw new Error(\"extended point not allowed\");\n      const { x: R, y: A } = b || {};\n      return u(\"x\", R), u(\"y\", A), new p(R, A, zt, l(R * A));\n    }\n    // Uses algo from RFC8032 5.1.3.\n    static fromBytes(b, R = !1) {\n      const A = r.BYTES, { a: F, d: M } = i;\n      b = fd(Or(b, A, \"point\")), Xs(R, \"zip215\");\n      const H = fd(b), K = b[A - 1];\n      H[A - 1] = K & -129;\n      const j = ei(H), C = R ? a : r.ORDER;\n      Ql(\"point.y\", j, xs, C);\n      const k = l(j * j), $ = l(k - zt), W = l(M * k - F);\n      let { isValid: _, value: g } = c($, W);\n      if (!_)\n        throw new Error(\"bad point: invalid y coordinate\");\n      const x = (g & zt) === zt, w = (K & 128) !== 0;\n      if (!R && g === xs && w)\n        throw new Error(\"bad point: x=0 and x_0=1\");\n      return w !== x && (g = l(-g)), p.fromAffine({ x: g, y: j });\n    }\n    static fromHex(b, R = !1) {\n      return p.fromBytes(Et(\"point\", b), R);\n    }\n    get x() {\n      return this.toAffine().x;\n    }\n    get y() {\n      return this.toAffine().y;\n    }\n    precompute(b = 8, R = !0) {\n      return y.createCache(this, b), R || this.multiply(Wa), this;\n    }\n    // Useful in fromAffine() - not for fromBytes(), which always created valid points.\n    assertValidity() {\n      f(this);\n    }\n    // Compare one point to another.\n    equals(b) {\n      d(b);\n      const { X: R, Y: A, Z: F } = this, { X: M, Y: H, Z: K } = b, j = l(R * K), C = l(M * F), k = l(A * K), $ = l(H * F);\n      return j === C && k === $;\n    }\n    is0() {\n      return this.equals(p.ZERO);\n    }\n    negate() {\n      return new p(l(-this.X), this.Y, this.Z, l(-this.T));\n    }\n    // Fast algo for doubling Extended Point.\n    // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n    // Cost: 4M + 4S + 1*a + 6add + 1*2.\n    double() {\n      const { a: b } = i, { X: R, Y: A, Z: F } = this, M = l(R * R), H = l(A * A), K = l(Wa * l(F * F)), j = l(b * M), C = R + A, k = l(l(C * C) - M - H), $ = j + H, W = $ - K, _ = j - H, g = l(k * W), x = l($ * _), w = l(k * _), D = l(W * $);\n      return new p(g, x, D, w);\n    }\n    // Fast algo for adding 2 Extended Points.\n    // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd\n    // Cost: 9M + 1*a + 1*d + 7add.\n    add(b) {\n      d(b);\n      const { a: R, d: A } = i, { X: F, Y: M, Z: H, T: K } = this, { X: j, Y: C, Z: k, T: $ } = b, W = l(F * j), _ = l(M * C), g = l(K * A * $), x = l(H * k), w = l((F + M) * (j + C) - W - _), D = x - g, O = x + g, U = l(_ - R * W), V = l(w * D), L = l(O * U), m = l(w * U), v = l(D * O);\n      return new p(V, L, v, m);\n    }\n    subtract(b) {\n      return this.add(b.negate());\n    }\n    // Constant-time multiplication.\n    multiply(b) {\n      if (!n.isValidNot0(b))\n        throw new Error(\"invalid scalar: expected 1 <= sc < curve.n\");\n      const { p: R, f: A } = y.cached(this, b, (F) => js(p, F));\n      return js(p, [R, A])[0];\n    }\n    // Non-constant-time multiplication. Uses double-and-add algorithm.\n    // It's faster, but should only be used when you don't care about\n    // an exposed private key e.g. sig verification.\n    // Does NOT allow scalars higher than CURVE.n.\n    // Accepts optional accumulator to merge with multiply (important for sparse scalars)\n    multiplyUnsafe(b, R = p.ZERO) {\n      if (!n.isValid(b))\n        throw new Error(\"invalid scalar: expected 0 <= sc < curve.n\");\n      return b === xs ? p.ZERO : this.is0() || b === zt ? this : y.unsafe(this, b, (A) => js(p, A), R);\n    }\n    // Checks if point is of small order.\n    // If you add something to small order point, you will have \"dirty\"\n    // point with torsion component.\n    // Multiplies point by cofactor and checks if the result is 0.\n    isSmallOrder() {\n      return this.multiplyUnsafe(o).is0();\n    }\n    // Multiplies point by curve order and checks if the result is 0.\n    // Returns `false` is the point is dirty.\n    isTorsionFree() {\n      return y.unsafe(this, i.n).is0();\n    }\n    // Converts Extended point to default (x, y) coordinates.\n    // Can accept precomputed Z^-1 - for example, from invertBatch.\n    toAffine(b) {\n      return h(this, b);\n    }\n    clearCofactor() {\n      return o === zt ? this : this.multiplyUnsafe(o);\n    }\n    toBytes() {\n      const { x: b, y: R } = this.toAffine(), A = r.toBytes(R);\n      return A[A.length - 1] |= b & zt ? 128 : 0, A;\n    }\n    toHex() {\n      return Hs(this.toBytes());\n    }\n    toString() {\n      return `<Point ${this.is0() ? \"ZERO\" : this.toHex()}>`;\n    }\n    // TODO: remove\n    get ex() {\n      return this.X;\n    }\n    get ey() {\n      return this.Y;\n    }\n    get ez() {\n      return this.Z;\n    }\n    get et() {\n      return this.T;\n    }\n    static normalizeZ(b) {\n      return js(p, b);\n    }\n    static msm(b, R) {\n      return p0(p, n, b, R);\n    }\n    _setWindowSize(b) {\n      this.precompute(b);\n    }\n    toRawBytes() {\n      return this.toBytes();\n    }\n  }\n  p.BASE = new p(i.Gx, i.Gy, zt, l(i.Gx * i.Gy)), p.ZERO = new p(xs, zt, zt, xs), p.Fp = r, p.Fn = n;\n  const y = new g0(p, n.BITS);\n  return p.BASE.precompute(8), p;\n}\nfunction Ey(s, e, t = {}) {\n  if (typeof e != \"function\")\n    throw new Error('\"hash\" function param is required');\n  Ri(t, {}, {\n    adjustScalarBytes: \"function\",\n    randomBytes: \"function\",\n    domain: \"function\",\n    prehash: \"function\",\n    mapToCurve: \"function\"\n  });\n  const { prehash: r } = t, { BASE: n, Fp: i, Fn: o } = s, a = t.randomBytes || qc, l = t.adjustScalarBytes || ((C) => C), c = t.domain || ((C, k, $) => {\n    if (Xs($, \"phflag\"), k.length || $)\n      throw new Error(\"Contexts/pre-hash are not supported\");\n    return C;\n  });\n  function u(C) {\n    return o.create(ei(C));\n  }\n  function d(C) {\n    const k = A.secretKey;\n    C = Et(\"private key\", C, k);\n    const $ = Et(\"hashed private key\", e(C), 2 * k), W = l($.slice(0, k)), _ = $.slice(k, 2 * k), g = u(W);\n    return { head: W, prefix: _, scalar: g };\n  }\n  function h(C) {\n    const { head: k, prefix: $, scalar: W } = d(C), _ = n.multiply(W), g = _.toBytes();\n    return { head: k, prefix: $, scalar: W, point: _, pointBytes: g };\n  }\n  function f(C) {\n    return h(C).pointBytes;\n  }\n  function p(C = Uint8Array.of(), ...k) {\n    const $ = Kr(...k);\n    return u(e(c($, Et(\"context\", C), !!r)));\n  }\n  function y(C, k, $ = {}) {\n    C = Et(\"message\", C), r && (C = r(C));\n    const { prefix: W, scalar: _, pointBytes: g } = h(k), x = p($.context, W, C), w = n.multiply(x).toBytes(), D = p($.context, w, g, C), O = o.create(x + D * _);\n    if (!o.isValid(O))\n      throw new Error(\"sign failed: invalid s\");\n    const U = Kr(w, o.toBytes(O));\n    return Or(U, A.signature, \"result\");\n  }\n  const E = { zip215: !0 };\n  function b(C, k, $, W = E) {\n    const { context: _, zip215: g } = W, x = A.signature;\n    C = Et(\"signature\", C, x), k = Et(\"message\", k), $ = Et(\"publicKey\", $, A.publicKey), g !== void 0 && Xs(g, \"zip215\"), r && (k = r(k));\n    const w = x / 2, D = C.subarray(0, w), O = ei(C.subarray(w, x));\n    let U, V, L;\n    try {\n      U = s.fromBytes($, g), V = s.fromBytes(D, g), L = n.multiplyUnsafe(O);\n    } catch {\n      return !1;\n    }\n    if (!g && U.isSmallOrder())\n      return !1;\n    const m = p(_, V.toBytes(), U.toBytes(), k);\n    return V.add(U.multiplyUnsafe(m)).subtract(L).clearCofactor().is0();\n  }\n  const R = i.BYTES, A = {\n    secretKey: R,\n    publicKey: R,\n    signature: 2 * R,\n    seed: R\n  };\n  function F(C = a(A.seed)) {\n    return Or(C, A.seed, \"seed\");\n  }\n  function M(C) {\n    const k = j.randomSecretKey(C);\n    return { secretKey: k, publicKey: f(k) };\n  }\n  function H(C) {\n    return Ii(C) && C.length === o.BYTES;\n  }\n  function K(C, k) {\n    try {\n      return !!s.fromBytes(C, k);\n    } catch {\n      return !1;\n    }\n  }\n  const j = {\n    getExtendedPublicKey: h,\n    randomSecretKey: F,\n    isValidSecretKey: H,\n    isValidPublicKey: K,\n    /**\n     * Converts ed public key to x public key. Uses formula:\n     * - ed25519:\n     *   - `(u, v) = ((1+y)/(1-y), sqrt(-486664)*u/x)`\n     *   - `(x, y) = (sqrt(-486664)*u/v, (u-1)/(u+1))`\n     * - ed448:\n     *   - `(u, v) = ((y-1)/(y+1), sqrt(156324)*u/x)`\n     *   - `(x, y) = (sqrt(156324)*u/v, (1+u)/(1-u))`\n     */\n    toMontgomery(C) {\n      const { y: k } = s.fromBytes(C), $ = A.publicKey, W = $ === 32;\n      if (!W && $ !== 57)\n        throw new Error(\"only defined for 25519 and 448\");\n      const _ = W ? i.div(zt + k, zt - k) : i.div(k - zt, k + zt);\n      return i.toBytes(_);\n    },\n    toMontgomerySecret(C) {\n      const k = A.secretKey;\n      Or(C, k);\n      const $ = e(C.subarray(0, k));\n      return l($).subarray(0, k);\n    },\n    /** @deprecated */\n    randomPrivateKey: F,\n    /** @deprecated */\n    precompute(C = 8, k = s.BASE) {\n      return k.precompute(C, !1);\n    }\n  };\n  return Object.freeze({\n    keygen: M,\n    getPublicKey: f,\n    sign: y,\n    verify: b,\n    utils: j,\n    Point: s,\n    lengths: A\n  });\n}\nfunction xy(s) {\n  const e = {\n    a: s.a,\n    d: s.d,\n    p: s.Fp.ORDER,\n    n: s.n,\n    h: s.h,\n    Gx: s.Gx,\n    Gy: s.Gy\n  }, t = s.Fp, r = en(e.n, s.nBitLength, !0), n = { Fp: t, Fn: r, uvRatio: s.uvRatio }, i = {\n    randomBytes: s.randomBytes,\n    adjustScalarBytes: s.adjustScalarBytes,\n    domain: s.domain,\n    prehash: s.prehash,\n    mapToCurve: s.mapToCurve\n  };\n  return { CURVE: e, curveOpts: n, hash: s.hash, eddsaOpts: i };\n}\nfunction Sy(s, e) {\n  const t = e.Point;\n  return Object.assign({}, e, {\n    ExtendedPoint: t,\n    CURVE: s,\n    nBitLength: t.Fn.BITS,\n    nByteLength: t.Fn.BYTES\n  });\n}\nfunction by(s) {\n  const { CURVE: e, curveOpts: t, hash: r, eddsaOpts: n } = xy(s), i = vy(e, t), o = Ey(i, r, n);\n  return Sy(s, o);\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst Ty = BigInt(1), Ed = BigInt(2);\nBigInt(3);\nconst wy = BigInt(5), Ay = BigInt(8), Zc = BigInt(\"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed\"), y0 = {\n  p: Zc,\n  n: BigInt(\"0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed\"),\n  h: Ay,\n  a: BigInt(\"0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec\"),\n  d: BigInt(\"0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3\"),\n  Gx: BigInt(\"0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a\"),\n  Gy: BigInt(\"0x6666666666666666666666666666666666666666666666666666666666666658\")\n};\nfunction Iy(s) {\n  const e = BigInt(10), t = BigInt(20), r = BigInt(40), n = BigInt(80), i = Zc, a = s * s % i * s % i, l = vt(a, Ed, i) * a % i, c = vt(l, Ty, i) * s % i, u = vt(c, wy, i) * c % i, d = vt(u, e, i) * u % i, h = vt(d, t, i) * d % i, f = vt(h, r, i) * h % i, p = vt(f, n, i) * f % i, y = vt(p, n, i) * f % i, E = vt(y, e, i) * u % i;\n  return { pow_p_5_8: vt(E, Ed, i) * s % i, b2: a };\n}\nfunction _y(s) {\n  return s[0] &= 248, s[31] &= 127, s[31] |= 64, s;\n}\nconst xd = /* @__PURE__ */ BigInt(\"19681161376707505956807079304988542015446066515923890162744021073123829784752\");\nfunction Ry(s, e) {\n  const t = Zc, r = Gt(e * e * e, t), n = Gt(r * r * e, t), i = Iy(s * n).pow_p_5_8;\n  let o = Gt(s * r * i, t);\n  const a = Gt(e * o * o, t), l = o, c = Gt(o * xd, t), u = a === s, d = a === Gt(-s, t), h = a === Gt(-s * xd, t);\n  return u && (o = l), (d || h) && (o = c), ly(o, t) && (o = Gt(-o, t)), { isValid: u || d, value: o };\n}\nconst Ly = en(y0.p, { isLE: !0 }), Cy = {\n  ...y0,\n  Fp: Ly,\n  hash: ey,\n  adjustScalarBytes: _y,\n  // dom2\n  // Ratio of u to v. Allows us to combine inversion and square root. Uses algo from RFC8032 5.1.3.\n  // Constant-time, u/√v\n  uvRatio: Ry\n}, Li = by(Cy);\nvar co = { exports: {} };\nconst ky = {}, Dy = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n  __proto__: null,\n  default: ky\n}, Symbol.toStringTag, { value: \"Module\" })), Py = /* @__PURE__ */ Nc(Dy);\nvar My = co.exports, Sd;\nfunction v0() {\n  return Sd || (Sd = 1, (function(s) {\n    (function(e, t) {\n      function r(_, g) {\n        if (!_) throw new Error(g || \"Assertion failed\");\n      }\n      function n(_, g) {\n        _.super_ = g;\n        var x = function() {\n        };\n        x.prototype = g.prototype, _.prototype = new x(), _.prototype.constructor = _;\n      }\n      function i(_, g, x) {\n        if (i.isBN(_))\n          return _;\n        this.negative = 0, this.words = null, this.length = 0, this.red = null, _ !== null && ((g === \"le\" || g === \"be\") && (x = g, g = 10), this._init(_ || 0, g || 10, x || \"be\"));\n      }\n      typeof e == \"object\" ? e.exports = i : t.BN = i, i.BN = i, i.wordSize = 26;\n      var o;\n      try {\n        typeof window < \"u\" && typeof window.Buffer < \"u\" ? o = window.Buffer : o = Py.Buffer;\n      } catch {\n      }\n      i.isBN = function(g) {\n        return g instanceof i ? !0 : g !== null && typeof g == \"object\" && g.constructor.wordSize === i.wordSize && Array.isArray(g.words);\n      }, i.max = function(g, x) {\n        return g.cmp(x) > 0 ? g : x;\n      }, i.min = function(g, x) {\n        return g.cmp(x) < 0 ? g : x;\n      }, i.prototype._init = function(g, x, w) {\n        if (typeof g == \"number\")\n          return this._initNumber(g, x, w);\n        if (typeof g == \"object\")\n          return this._initArray(g, x, w);\n        x === \"hex\" && (x = 16), r(x === (x | 0) && x >= 2 && x <= 36), g = g.toString().replace(/\\s+/g, \"\");\n        var D = 0;\n        g[0] === \"-\" && (D++, this.negative = 1), D < g.length && (x === 16 ? this._parseHex(g, D, w) : (this._parseBase(g, x, D), w === \"le\" && this._initArray(this.toArray(), x, w)));\n      }, i.prototype._initNumber = function(g, x, w) {\n        g < 0 && (this.negative = 1, g = -g), g < 67108864 ? (this.words = [g & 67108863], this.length = 1) : g < 4503599627370496 ? (this.words = [\n          g & 67108863,\n          g / 67108864 & 67108863\n        ], this.length = 2) : (r(g < 9007199254740992), this.words = [\n          g & 67108863,\n          g / 67108864 & 67108863,\n          1\n        ], this.length = 3), w === \"le\" && this._initArray(this.toArray(), x, w);\n      }, i.prototype._initArray = function(g, x, w) {\n        if (r(typeof g.length == \"number\"), g.length <= 0)\n          return this.words = [0], this.length = 1, this;\n        this.length = Math.ceil(g.length / 3), this.words = new Array(this.length);\n        for (var D = 0; D < this.length; D++)\n          this.words[D] = 0;\n        var O, U, V = 0;\n        if (w === \"be\")\n          for (D = g.length - 1, O = 0; D >= 0; D -= 3)\n            U = g[D] | g[D - 1] << 8 | g[D - 2] << 16, this.words[O] |= U << V & 67108863, this.words[O + 1] = U >>> 26 - V & 67108863, V += 24, V >= 26 && (V -= 26, O++);\n        else if (w === \"le\")\n          for (D = 0, O = 0; D < g.length; D += 3)\n            U = g[D] | g[D + 1] << 8 | g[D + 2] << 16, this.words[O] |= U << V & 67108863, this.words[O + 1] = U >>> 26 - V & 67108863, V += 24, V >= 26 && (V -= 26, O++);\n        return this._strip();\n      };\n      function a(_, g) {\n        var x = _.charCodeAt(g);\n        if (x >= 48 && x <= 57)\n          return x - 48;\n        if (x >= 65 && x <= 70)\n          return x - 55;\n        if (x >= 97 && x <= 102)\n          return x - 87;\n        r(!1, \"Invalid character in \" + _);\n      }\n      function l(_, g, x) {\n        var w = a(_, x);\n        return x - 1 >= g && (w |= a(_, x - 1) << 4), w;\n      }\n      i.prototype._parseHex = function(g, x, w) {\n        this.length = Math.ceil((g.length - x) / 6), this.words = new Array(this.length);\n        for (var D = 0; D < this.length; D++)\n          this.words[D] = 0;\n        var O = 0, U = 0, V;\n        if (w === \"be\")\n          for (D = g.length - 1; D >= x; D -= 2)\n            V = l(g, x, D) << O, this.words[U] |= V & 67108863, O >= 18 ? (O -= 18, U += 1, this.words[U] |= V >>> 26) : O += 8;\n        else {\n          var L = g.length - x;\n          for (D = L % 2 === 0 ? x + 1 : x; D < g.length; D += 2)\n            V = l(g, x, D) << O, this.words[U] |= V & 67108863, O >= 18 ? (O -= 18, U += 1, this.words[U] |= V >>> 26) : O += 8;\n        }\n        this._strip();\n      };\n      function c(_, g, x, w) {\n        for (var D = 0, O = 0, U = Math.min(_.length, x), V = g; V < U; V++) {\n          var L = _.charCodeAt(V) - 48;\n          D *= w, L >= 49 ? O = L - 49 + 10 : L >= 17 ? O = L - 17 + 10 : O = L, r(L >= 0 && O < w, \"Invalid character\"), D += O;\n        }\n        return D;\n      }\n      i.prototype._parseBase = function(g, x, w) {\n        this.words = [0], this.length = 1;\n        for (var D = 0, O = 1; O <= 67108863; O *= x)\n          D++;\n        D--, O = O / x | 0;\n        for (var U = g.length - w, V = U % D, L = Math.min(U, U - V) + w, m = 0, v = w; v < L; v += D)\n          m = c(g, v, v + D, x), this.imuln(O), this.words[0] + m < 67108864 ? this.words[0] += m : this._iaddn(m);\n        if (V !== 0) {\n          var P = 1;\n          for (m = c(g, v, g.length, x), v = 0; v < V; v++)\n            P *= x;\n          this.imuln(P), this.words[0] + m < 67108864 ? this.words[0] += m : this._iaddn(m);\n        }\n        this._strip();\n      }, i.prototype.copy = function(g) {\n        g.words = new Array(this.length);\n        for (var x = 0; x < this.length; x++)\n          g.words[x] = this.words[x];\n        g.length = this.length, g.negative = this.negative, g.red = this.red;\n      };\n      function u(_, g) {\n        _.words = g.words, _.length = g.length, _.negative = g.negative, _.red = g.red;\n      }\n      if (i.prototype._move = function(g) {\n        u(g, this);\n      }, i.prototype.clone = function() {\n        var g = new i(null);\n        return this.copy(g), g;\n      }, i.prototype._expand = function(g) {\n        for (; this.length < g; )\n          this.words[this.length++] = 0;\n        return this;\n      }, i.prototype._strip = function() {\n        for (; this.length > 1 && this.words[this.length - 1] === 0; )\n          this.length--;\n        return this._normSign();\n      }, i.prototype._normSign = function() {\n        return this.length === 1 && this.words[0] === 0 && (this.negative = 0), this;\n      }, typeof Symbol < \"u\" && typeof Symbol.for == \"function\")\n        try {\n          i.prototype[Symbol.for(\"nodejs.util.inspect.custom\")] = d;\n        } catch {\n          i.prototype.inspect = d;\n        }\n      else\n        i.prototype.inspect = d;\n      function d() {\n        return (this.red ? \"<BN-R: \" : \"<BN: \") + this.toString(16) + \">\";\n      }\n      var h = [\n        \"\",\n        \"0\",\n        \"00\",\n        \"000\",\n        \"0000\",\n        \"00000\",\n        \"000000\",\n        \"0000000\",\n        \"00000000\",\n        \"000000000\",\n        \"0000000000\",\n        \"00000000000\",\n        \"000000000000\",\n        \"0000000000000\",\n        \"00000000000000\",\n        \"000000000000000\",\n        \"0000000000000000\",\n        \"00000000000000000\",\n        \"000000000000000000\",\n        \"0000000000000000000\",\n        \"00000000000000000000\",\n        \"000000000000000000000\",\n        \"0000000000000000000000\",\n        \"00000000000000000000000\",\n        \"000000000000000000000000\",\n        \"0000000000000000000000000\"\n      ], f = [\n        0,\n        0,\n        25,\n        16,\n        12,\n        11,\n        10,\n        9,\n        8,\n        8,\n        7,\n        7,\n        7,\n        7,\n        6,\n        6,\n        6,\n        6,\n        6,\n        6,\n        6,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5,\n        5\n      ], p = [\n        0,\n        0,\n        33554432,\n        43046721,\n        16777216,\n        48828125,\n        60466176,\n        40353607,\n        16777216,\n        43046721,\n        1e7,\n        19487171,\n        35831808,\n        62748517,\n        7529536,\n        11390625,\n        16777216,\n        24137569,\n        34012224,\n        47045881,\n        64e6,\n        4084101,\n        5153632,\n        6436343,\n        7962624,\n        9765625,\n        11881376,\n        14348907,\n        17210368,\n        20511149,\n        243e5,\n        28629151,\n        33554432,\n        39135393,\n        45435424,\n        52521875,\n        60466176\n      ];\n      i.prototype.toString = function(g, x) {\n        g = g || 10, x = x | 0 || 1;\n        var w;\n        if (g === 16 || g === \"hex\") {\n          w = \"\";\n          for (var D = 0, O = 0, U = 0; U < this.length; U++) {\n            var V = this.words[U], L = ((V << D | O) & 16777215).toString(16);\n            O = V >>> 24 - D & 16777215, D += 2, D >= 26 && (D -= 26, U--), O !== 0 || U !== this.length - 1 ? w = h[6 - L.length] + L + w : w = L + w;\n          }\n          for (O !== 0 && (w = O.toString(16) + w); w.length % x !== 0; )\n            w = \"0\" + w;\n          return this.negative !== 0 && (w = \"-\" + w), w;\n        }\n        if (g === (g | 0) && g >= 2 && g <= 36) {\n          var m = f[g], v = p[g];\n          w = \"\";\n          var P = this.clone();\n          for (P.negative = 0; !P.isZero(); ) {\n            var N = P.modrn(v).toString(g);\n            P = P.idivn(v), P.isZero() ? w = N + w : w = h[m - N.length] + N + w;\n          }\n          for (this.isZero() && (w = \"0\" + w); w.length % x !== 0; )\n            w = \"0\" + w;\n          return this.negative !== 0 && (w = \"-\" + w), w;\n        }\n        r(!1, \"Base should be between 2 and 36\");\n      }, i.prototype.toNumber = function() {\n        var g = this.words[0];\n        return this.length === 2 ? g += this.words[1] * 67108864 : this.length === 3 && this.words[2] === 1 ? g += 4503599627370496 + this.words[1] * 67108864 : this.length > 2 && r(!1, \"Number can only safely store up to 53 bits\"), this.negative !== 0 ? -g : g;\n      }, i.prototype.toJSON = function() {\n        return this.toString(16, 2);\n      }, o && (i.prototype.toBuffer = function(g, x) {\n        return this.toArrayLike(o, g, x);\n      }), i.prototype.toArray = function(g, x) {\n        return this.toArrayLike(Array, g, x);\n      };\n      var y = function(g, x) {\n        return g.allocUnsafe ? g.allocUnsafe(x) : new g(x);\n      };\n      i.prototype.toArrayLike = function(g, x, w) {\n        this._strip();\n        var D = this.byteLength(), O = w || Math.max(1, D);\n        r(D <= O, \"byte array longer than desired length\"), r(O > 0, \"Requested array length <= 0\");\n        var U = y(g, O), V = x === \"le\" ? \"LE\" : \"BE\";\n        return this[\"_toArrayLike\" + V](U, D), U;\n      }, i.prototype._toArrayLikeLE = function(g, x) {\n        for (var w = 0, D = 0, O = 0, U = 0; O < this.length; O++) {\n          var V = this.words[O] << U | D;\n          g[w++] = V & 255, w < g.length && (g[w++] = V >> 8 & 255), w < g.length && (g[w++] = V >> 16 & 255), U === 6 ? (w < g.length && (g[w++] = V >> 24 & 255), D = 0, U = 0) : (D = V >>> 24, U += 2);\n        }\n        if (w < g.length)\n          for (g[w++] = D; w < g.length; )\n            g[w++] = 0;\n      }, i.prototype._toArrayLikeBE = function(g, x) {\n        for (var w = g.length - 1, D = 0, O = 0, U = 0; O < this.length; O++) {\n          var V = this.words[O] << U | D;\n          g[w--] = V & 255, w >= 0 && (g[w--] = V >> 8 & 255), w >= 0 && (g[w--] = V >> 16 & 255), U === 6 ? (w >= 0 && (g[w--] = V >> 24 & 255), D = 0, U = 0) : (D = V >>> 24, U += 2);\n        }\n        if (w >= 0)\n          for (g[w--] = D; w >= 0; )\n            g[w--] = 0;\n      }, Math.clz32 ? i.prototype._countBits = function(g) {\n        return 32 - Math.clz32(g);\n      } : i.prototype._countBits = function(g) {\n        var x = g, w = 0;\n        return x >= 4096 && (w += 13, x >>>= 13), x >= 64 && (w += 7, x >>>= 7), x >= 8 && (w += 4, x >>>= 4), x >= 2 && (w += 2, x >>>= 2), w + x;\n      }, i.prototype._zeroBits = function(g) {\n        if (g === 0) return 26;\n        var x = g, w = 0;\n        return (x & 8191) === 0 && (w += 13, x >>>= 13), (x & 127) === 0 && (w += 7, x >>>= 7), (x & 15) === 0 && (w += 4, x >>>= 4), (x & 3) === 0 && (w += 2, x >>>= 2), (x & 1) === 0 && w++, w;\n      }, i.prototype.bitLength = function() {\n        var g = this.words[this.length - 1], x = this._countBits(g);\n        return (this.length - 1) * 26 + x;\n      };\n      function E(_) {\n        for (var g = new Array(_.bitLength()), x = 0; x < g.length; x++) {\n          var w = x / 26 | 0, D = x % 26;\n          g[x] = _.words[w] >>> D & 1;\n        }\n        return g;\n      }\n      i.prototype.zeroBits = function() {\n        if (this.isZero()) return 0;\n        for (var g = 0, x = 0; x < this.length; x++) {\n          var w = this._zeroBits(this.words[x]);\n          if (g += w, w !== 26) break;\n        }\n        return g;\n      }, i.prototype.byteLength = function() {\n        return Math.ceil(this.bitLength() / 8);\n      }, i.prototype.toTwos = function(g) {\n        return this.negative !== 0 ? this.abs().inotn(g).iaddn(1) : this.clone();\n      }, i.prototype.fromTwos = function(g) {\n        return this.testn(g - 1) ? this.notn(g).iaddn(1).ineg() : this.clone();\n      }, i.prototype.isNeg = function() {\n        return this.negative !== 0;\n      }, i.prototype.neg = function() {\n        return this.clone().ineg();\n      }, i.prototype.ineg = function() {\n        return this.isZero() || (this.negative ^= 1), this;\n      }, i.prototype.iuor = function(g) {\n        for (; this.length < g.length; )\n          this.words[this.length++] = 0;\n        for (var x = 0; x < g.length; x++)\n          this.words[x] = this.words[x] | g.words[x];\n        return this._strip();\n      }, i.prototype.ior = function(g) {\n        return r((this.negative | g.negative) === 0), this.iuor(g);\n      }, i.prototype.or = function(g) {\n        return this.length > g.length ? this.clone().ior(g) : g.clone().ior(this);\n      }, i.prototype.uor = function(g) {\n        return this.length > g.length ? this.clone().iuor(g) : g.clone().iuor(this);\n      }, i.prototype.iuand = function(g) {\n        var x;\n        this.length > g.length ? x = g : x = this;\n        for (var w = 0; w < x.length; w++)\n          this.words[w] = this.words[w] & g.words[w];\n        return this.length = x.length, this._strip();\n      }, i.prototype.iand = function(g) {\n        return r((this.negative | g.negative) === 0), this.iuand(g);\n      }, i.prototype.and = function(g) {\n        return this.length > g.length ? this.clone().iand(g) : g.clone().iand(this);\n      }, i.prototype.uand = function(g) {\n        return this.length > g.length ? this.clone().iuand(g) : g.clone().iuand(this);\n      }, i.prototype.iuxor = function(g) {\n        var x, w;\n        this.length > g.length ? (x = this, w = g) : (x = g, w = this);\n        for (var D = 0; D < w.length; D++)\n          this.words[D] = x.words[D] ^ w.words[D];\n        if (this !== x)\n          for (; D < x.length; D++)\n            this.words[D] = x.words[D];\n        return this.length = x.length, this._strip();\n      }, i.prototype.ixor = function(g) {\n        return r((this.negative | g.negative) === 0), this.iuxor(g);\n      }, i.prototype.xor = function(g) {\n        return this.length > g.length ? this.clone().ixor(g) : g.clone().ixor(this);\n      }, i.prototype.uxor = function(g) {\n        return this.length > g.length ? this.clone().iuxor(g) : g.clone().iuxor(this);\n      }, i.prototype.inotn = function(g) {\n        r(typeof g == \"number\" && g >= 0);\n        var x = Math.ceil(g / 26) | 0, w = g % 26;\n        this._expand(x), w > 0 && x--;\n        for (var D = 0; D < x; D++)\n          this.words[D] = ~this.words[D] & 67108863;\n        return w > 0 && (this.words[D] = ~this.words[D] & 67108863 >> 26 - w), this._strip();\n      }, i.prototype.notn = function(g) {\n        return this.clone().inotn(g);\n      }, i.prototype.setn = function(g, x) {\n        r(typeof g == \"number\" && g >= 0);\n        var w = g / 26 | 0, D = g % 26;\n        return this._expand(w + 1), x ? this.words[w] = this.words[w] | 1 << D : this.words[w] = this.words[w] & ~(1 << D), this._strip();\n      }, i.prototype.iadd = function(g) {\n        var x;\n        if (this.negative !== 0 && g.negative === 0)\n          return this.negative = 0, x = this.isub(g), this.negative ^= 1, this._normSign();\n        if (this.negative === 0 && g.negative !== 0)\n          return g.negative = 0, x = this.isub(g), g.negative = 1, x._normSign();\n        var w, D;\n        this.length > g.length ? (w = this, D = g) : (w = g, D = this);\n        for (var O = 0, U = 0; U < D.length; U++)\n          x = (w.words[U] | 0) + (D.words[U] | 0) + O, this.words[U] = x & 67108863, O = x >>> 26;\n        for (; O !== 0 && U < w.length; U++)\n          x = (w.words[U] | 0) + O, this.words[U] = x & 67108863, O = x >>> 26;\n        if (this.length = w.length, O !== 0)\n          this.words[this.length] = O, this.length++;\n        else if (w !== this)\n          for (; U < w.length; U++)\n            this.words[U] = w.words[U];\n        return this;\n      }, i.prototype.add = function(g) {\n        var x;\n        return g.negative !== 0 && this.negative === 0 ? (g.negative = 0, x = this.sub(g), g.negative ^= 1, x) : g.negative === 0 && this.negative !== 0 ? (this.negative = 0, x = g.sub(this), this.negative = 1, x) : this.length > g.length ? this.clone().iadd(g) : g.clone().iadd(this);\n      }, i.prototype.isub = function(g) {\n        if (g.negative !== 0) {\n          g.negative = 0;\n          var x = this.iadd(g);\n          return g.negative = 1, x._normSign();\n        } else if (this.negative !== 0)\n          return this.negative = 0, this.iadd(g), this.negative = 1, this._normSign();\n        var w = this.cmp(g);\n        if (w === 0)\n          return this.negative = 0, this.length = 1, this.words[0] = 0, this;\n        var D, O;\n        w > 0 ? (D = this, O = g) : (D = g, O = this);\n        for (var U = 0, V = 0; V < O.length; V++)\n          x = (D.words[V] | 0) - (O.words[V] | 0) + U, U = x >> 26, this.words[V] = x & 67108863;\n        for (; U !== 0 && V < D.length; V++)\n          x = (D.words[V] | 0) + U, U = x >> 26, this.words[V] = x & 67108863;\n        if (U === 0 && V < D.length && D !== this)\n          for (; V < D.length; V++)\n            this.words[V] = D.words[V];\n        return this.length = Math.max(this.length, V), D !== this && (this.negative = 1), this._strip();\n      }, i.prototype.sub = function(g) {\n        return this.clone().isub(g);\n      };\n      function b(_, g, x) {\n        x.negative = g.negative ^ _.negative;\n        var w = _.length + g.length | 0;\n        x.length = w, w = w - 1 | 0;\n        var D = _.words[0] | 0, O = g.words[0] | 0, U = D * O, V = U & 67108863, L = U / 67108864 | 0;\n        x.words[0] = V;\n        for (var m = 1; m < w; m++) {\n          for (var v = L >>> 26, P = L & 67108863, N = Math.min(m, g.length - 1), Y = Math.max(0, m - _.length + 1); Y <= N; Y++) {\n            var ee = m - Y | 0;\n            D = _.words[ee] | 0, O = g.words[Y] | 0, U = D * O + P, v += U / 67108864 | 0, P = U & 67108863;\n          }\n          x.words[m] = P | 0, L = v | 0;\n        }\n        return L !== 0 ? x.words[m] = L | 0 : x.length--, x._strip();\n      }\n      var R = function(g, x, w) {\n        var D = g.words, O = x.words, U = w.words, V = 0, L, m, v, P = D[0] | 0, N = P & 8191, Y = P >>> 13, ee = D[1] | 0, ie = ee & 8191, le = ee >>> 13, Te = D[2] | 0, De = Te & 8191, ze = Te >>> 13, _e = D[3] | 0, xe = _e & 8191, Be = _e >>> 13, ye = D[4] | 0, be = ye & 8191, Fe = ye >>> 13, Xe = D[5] | 0, we = Xe & 8191, Ne = Xe >>> 13, dt = D[6] | 0, Je = dt & 8191, Qe = dt >>> 13, it = D[7] | 0, je = it & 8191, B = it >>> 13, S = D[8] | 0, T = S & 8191, G = S >>> 13, Z = D[9] | 0, Q = Z & 8191, se = Z >>> 13, Ue = O[0] | 0, Pe = Ue & 8191, Le = Ue >>> 13, ct = O[1] | 0, Ae = ct & 8191, Tt = ct >>> 13, Uu = O[2] | 0, wt = Uu & 8191, At = Uu >>> 13, $u = O[3] | 0, It = $u & 8191, _t = $u >>> 13, Gu = O[4] | 0, Rt = Gu & 8191, Lt = Gu >>> 13, Vu = O[5] | 0, Ct = Vu & 8191, kt = Vu >>> 13, ju = O[6] | 0, Dt = ju & 8191, Pt = ju >>> 13, Ku = O[7] | 0, Mt = Ku & 8191, Ot = Ku >>> 13, Hu = O[8] | 0, Bt = Hu & 8191, Ft = Hu >>> 13, qu = O[9] | 0, Nt = qu & 8191, Ut = qu >>> 13;\n        w.negative = g.negative ^ x.negative, w.length = 19, L = Math.imul(N, Pe), m = Math.imul(N, Le), m = m + Math.imul(Y, Pe) | 0, v = Math.imul(Y, Le);\n        var xa = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (xa >>> 26) | 0, xa &= 67108863, L = Math.imul(ie, Pe), m = Math.imul(ie, Le), m = m + Math.imul(le, Pe) | 0, v = Math.imul(le, Le), L = L + Math.imul(N, Ae) | 0, m = m + Math.imul(N, Tt) | 0, m = m + Math.imul(Y, Ae) | 0, v = v + Math.imul(Y, Tt) | 0;\n        var Sa = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Sa >>> 26) | 0, Sa &= 67108863, L = Math.imul(De, Pe), m = Math.imul(De, Le), m = m + Math.imul(ze, Pe) | 0, v = Math.imul(ze, Le), L = L + Math.imul(ie, Ae) | 0, m = m + Math.imul(ie, Tt) | 0, m = m + Math.imul(le, Ae) | 0, v = v + Math.imul(le, Tt) | 0, L = L + Math.imul(N, wt) | 0, m = m + Math.imul(N, At) | 0, m = m + Math.imul(Y, wt) | 0, v = v + Math.imul(Y, At) | 0;\n        var ba = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (ba >>> 26) | 0, ba &= 67108863, L = Math.imul(xe, Pe), m = Math.imul(xe, Le), m = m + Math.imul(Be, Pe) | 0, v = Math.imul(Be, Le), L = L + Math.imul(De, Ae) | 0, m = m + Math.imul(De, Tt) | 0, m = m + Math.imul(ze, Ae) | 0, v = v + Math.imul(ze, Tt) | 0, L = L + Math.imul(ie, wt) | 0, m = m + Math.imul(ie, At) | 0, m = m + Math.imul(le, wt) | 0, v = v + Math.imul(le, At) | 0, L = L + Math.imul(N, It) | 0, m = m + Math.imul(N, _t) | 0, m = m + Math.imul(Y, It) | 0, v = v + Math.imul(Y, _t) | 0;\n        var Ta = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Ta >>> 26) | 0, Ta &= 67108863, L = Math.imul(be, Pe), m = Math.imul(be, Le), m = m + Math.imul(Fe, Pe) | 0, v = Math.imul(Fe, Le), L = L + Math.imul(xe, Ae) | 0, m = m + Math.imul(xe, Tt) | 0, m = m + Math.imul(Be, Ae) | 0, v = v + Math.imul(Be, Tt) | 0, L = L + Math.imul(De, wt) | 0, m = m + Math.imul(De, At) | 0, m = m + Math.imul(ze, wt) | 0, v = v + Math.imul(ze, At) | 0, L = L + Math.imul(ie, It) | 0, m = m + Math.imul(ie, _t) | 0, m = m + Math.imul(le, It) | 0, v = v + Math.imul(le, _t) | 0, L = L + Math.imul(N, Rt) | 0, m = m + Math.imul(N, Lt) | 0, m = m + Math.imul(Y, Rt) | 0, v = v + Math.imul(Y, Lt) | 0;\n        var wa = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (wa >>> 26) | 0, wa &= 67108863, L = Math.imul(we, Pe), m = Math.imul(we, Le), m = m + Math.imul(Ne, Pe) | 0, v = Math.imul(Ne, Le), L = L + Math.imul(be, Ae) | 0, m = m + Math.imul(be, Tt) | 0, m = m + Math.imul(Fe, Ae) | 0, v = v + Math.imul(Fe, Tt) | 0, L = L + Math.imul(xe, wt) | 0, m = m + Math.imul(xe, At) | 0, m = m + Math.imul(Be, wt) | 0, v = v + Math.imul(Be, At) | 0, L = L + Math.imul(De, It) | 0, m = m + Math.imul(De, _t) | 0, m = m + Math.imul(ze, It) | 0, v = v + Math.imul(ze, _t) | 0, L = L + Math.imul(ie, Rt) | 0, m = m + Math.imul(ie, Lt) | 0, m = m + Math.imul(le, Rt) | 0, v = v + Math.imul(le, Lt) | 0, L = L + Math.imul(N, Ct) | 0, m = m + Math.imul(N, kt) | 0, m = m + Math.imul(Y, Ct) | 0, v = v + Math.imul(Y, kt) | 0;\n        var Aa = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Aa >>> 26) | 0, Aa &= 67108863, L = Math.imul(Je, Pe), m = Math.imul(Je, Le), m = m + Math.imul(Qe, Pe) | 0, v = Math.imul(Qe, Le), L = L + Math.imul(we, Ae) | 0, m = m + Math.imul(we, Tt) | 0, m = m + Math.imul(Ne, Ae) | 0, v = v + Math.imul(Ne, Tt) | 0, L = L + Math.imul(be, wt) | 0, m = m + Math.imul(be, At) | 0, m = m + Math.imul(Fe, wt) | 0, v = v + Math.imul(Fe, At) | 0, L = L + Math.imul(xe, It) | 0, m = m + Math.imul(xe, _t) | 0, m = m + Math.imul(Be, It) | 0, v = v + Math.imul(Be, _t) | 0, L = L + Math.imul(De, Rt) | 0, m = m + Math.imul(De, Lt) | 0, m = m + Math.imul(ze, Rt) | 0, v = v + Math.imul(ze, Lt) | 0, L = L + Math.imul(ie, Ct) | 0, m = m + Math.imul(ie, kt) | 0, m = m + Math.imul(le, Ct) | 0, v = v + Math.imul(le, kt) | 0, L = L + Math.imul(N, Dt) | 0, m = m + Math.imul(N, Pt) | 0, m = m + Math.imul(Y, Dt) | 0, v = v + Math.imul(Y, Pt) | 0;\n        var Ia = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Ia >>> 26) | 0, Ia &= 67108863, L = Math.imul(je, Pe), m = Math.imul(je, Le), m = m + Math.imul(B, Pe) | 0, v = Math.imul(B, Le), L = L + Math.imul(Je, Ae) | 0, m = m + Math.imul(Je, Tt) | 0, m = m + Math.imul(Qe, Ae) | 0, v = v + Math.imul(Qe, Tt) | 0, L = L + Math.imul(we, wt) | 0, m = m + Math.imul(we, At) | 0, m = m + Math.imul(Ne, wt) | 0, v = v + Math.imul(Ne, At) | 0, L = L + Math.imul(be, It) | 0, m = m + Math.imul(be, _t) | 0, m = m + Math.imul(Fe, It) | 0, v = v + Math.imul(Fe, _t) | 0, L = L + Math.imul(xe, Rt) | 0, m = m + Math.imul(xe, Lt) | 0, m = m + Math.imul(Be, Rt) | 0, v = v + Math.imul(Be, Lt) | 0, L = L + Math.imul(De, Ct) | 0, m = m + Math.imul(De, kt) | 0, m = m + Math.imul(ze, Ct) | 0, v = v + Math.imul(ze, kt) | 0, L = L + Math.imul(ie, Dt) | 0, m = m + Math.imul(ie, Pt) | 0, m = m + Math.imul(le, Dt) | 0, v = v + Math.imul(le, Pt) | 0, L = L + Math.imul(N, Mt) | 0, m = m + Math.imul(N, Ot) | 0, m = m + Math.imul(Y, Mt) | 0, v = v + Math.imul(Y, Ot) | 0;\n        var _a = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (_a >>> 26) | 0, _a &= 67108863, L = Math.imul(T, Pe), m = Math.imul(T, Le), m = m + Math.imul(G, Pe) | 0, v = Math.imul(G, Le), L = L + Math.imul(je, Ae) | 0, m = m + Math.imul(je, Tt) | 0, m = m + Math.imul(B, Ae) | 0, v = v + Math.imul(B, Tt) | 0, L = L + Math.imul(Je, wt) | 0, m = m + Math.imul(Je, At) | 0, m = m + Math.imul(Qe, wt) | 0, v = v + Math.imul(Qe, At) | 0, L = L + Math.imul(we, It) | 0, m = m + Math.imul(we, _t) | 0, m = m + Math.imul(Ne, It) | 0, v = v + Math.imul(Ne, _t) | 0, L = L + Math.imul(be, Rt) | 0, m = m + Math.imul(be, Lt) | 0, m = m + Math.imul(Fe, Rt) | 0, v = v + Math.imul(Fe, Lt) | 0, L = L + Math.imul(xe, Ct) | 0, m = m + Math.imul(xe, kt) | 0, m = m + Math.imul(Be, Ct) | 0, v = v + Math.imul(Be, kt) | 0, L = L + Math.imul(De, Dt) | 0, m = m + Math.imul(De, Pt) | 0, m = m + Math.imul(ze, Dt) | 0, v = v + Math.imul(ze, Pt) | 0, L = L + Math.imul(ie, Mt) | 0, m = m + Math.imul(ie, Ot) | 0, m = m + Math.imul(le, Mt) | 0, v = v + Math.imul(le, Ot) | 0, L = L + Math.imul(N, Bt) | 0, m = m + Math.imul(N, Ft) | 0, m = m + Math.imul(Y, Bt) | 0, v = v + Math.imul(Y, Ft) | 0;\n        var Ra = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Ra >>> 26) | 0, Ra &= 67108863, L = Math.imul(Q, Pe), m = Math.imul(Q, Le), m = m + Math.imul(se, Pe) | 0, v = Math.imul(se, Le), L = L + Math.imul(T, Ae) | 0, m = m + Math.imul(T, Tt) | 0, m = m + Math.imul(G, Ae) | 0, v = v + Math.imul(G, Tt) | 0, L = L + Math.imul(je, wt) | 0, m = m + Math.imul(je, At) | 0, m = m + Math.imul(B, wt) | 0, v = v + Math.imul(B, At) | 0, L = L + Math.imul(Je, It) | 0, m = m + Math.imul(Je, _t) | 0, m = m + Math.imul(Qe, It) | 0, v = v + Math.imul(Qe, _t) | 0, L = L + Math.imul(we, Rt) | 0, m = m + Math.imul(we, Lt) | 0, m = m + Math.imul(Ne, Rt) | 0, v = v + Math.imul(Ne, Lt) | 0, L = L + Math.imul(be, Ct) | 0, m = m + Math.imul(be, kt) | 0, m = m + Math.imul(Fe, Ct) | 0, v = v + Math.imul(Fe, kt) | 0, L = L + Math.imul(xe, Dt) | 0, m = m + Math.imul(xe, Pt) | 0, m = m + Math.imul(Be, Dt) | 0, v = v + Math.imul(Be, Pt) | 0, L = L + Math.imul(De, Mt) | 0, m = m + Math.imul(De, Ot) | 0, m = m + Math.imul(ze, Mt) | 0, v = v + Math.imul(ze, Ot) | 0, L = L + Math.imul(ie, Bt) | 0, m = m + Math.imul(ie, Ft) | 0, m = m + Math.imul(le, Bt) | 0, v = v + Math.imul(le, Ft) | 0, L = L + Math.imul(N, Nt) | 0, m = m + Math.imul(N, Ut) | 0, m = m + Math.imul(Y, Nt) | 0, v = v + Math.imul(Y, Ut) | 0;\n        var La = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (La >>> 26) | 0, La &= 67108863, L = Math.imul(Q, Ae), m = Math.imul(Q, Tt), m = m + Math.imul(se, Ae) | 0, v = Math.imul(se, Tt), L = L + Math.imul(T, wt) | 0, m = m + Math.imul(T, At) | 0, m = m + Math.imul(G, wt) | 0, v = v + Math.imul(G, At) | 0, L = L + Math.imul(je, It) | 0, m = m + Math.imul(je, _t) | 0, m = m + Math.imul(B, It) | 0, v = v + Math.imul(B, _t) | 0, L = L + Math.imul(Je, Rt) | 0, m = m + Math.imul(Je, Lt) | 0, m = m + Math.imul(Qe, Rt) | 0, v = v + Math.imul(Qe, Lt) | 0, L = L + Math.imul(we, Ct) | 0, m = m + Math.imul(we, kt) | 0, m = m + Math.imul(Ne, Ct) | 0, v = v + Math.imul(Ne, kt) | 0, L = L + Math.imul(be, Dt) | 0, m = m + Math.imul(be, Pt) | 0, m = m + Math.imul(Fe, Dt) | 0, v = v + Math.imul(Fe, Pt) | 0, L = L + Math.imul(xe, Mt) | 0, m = m + Math.imul(xe, Ot) | 0, m = m + Math.imul(Be, Mt) | 0, v = v + Math.imul(Be, Ot) | 0, L = L + Math.imul(De, Bt) | 0, m = m + Math.imul(De, Ft) | 0, m = m + Math.imul(ze, Bt) | 0, v = v + Math.imul(ze, Ft) | 0, L = L + Math.imul(ie, Nt) | 0, m = m + Math.imul(ie, Ut) | 0, m = m + Math.imul(le, Nt) | 0, v = v + Math.imul(le, Ut) | 0;\n        var Ca = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Ca >>> 26) | 0, Ca &= 67108863, L = Math.imul(Q, wt), m = Math.imul(Q, At), m = m + Math.imul(se, wt) | 0, v = Math.imul(se, At), L = L + Math.imul(T, It) | 0, m = m + Math.imul(T, _t) | 0, m = m + Math.imul(G, It) | 0, v = v + Math.imul(G, _t) | 0, L = L + Math.imul(je, Rt) | 0, m = m + Math.imul(je, Lt) | 0, m = m + Math.imul(B, Rt) | 0, v = v + Math.imul(B, Lt) | 0, L = L + Math.imul(Je, Ct) | 0, m = m + Math.imul(Je, kt) | 0, m = m + Math.imul(Qe, Ct) | 0, v = v + Math.imul(Qe, kt) | 0, L = L + Math.imul(we, Dt) | 0, m = m + Math.imul(we, Pt) | 0, m = m + Math.imul(Ne, Dt) | 0, v = v + Math.imul(Ne, Pt) | 0, L = L + Math.imul(be, Mt) | 0, m = m + Math.imul(be, Ot) | 0, m = m + Math.imul(Fe, Mt) | 0, v = v + Math.imul(Fe, Ot) | 0, L = L + Math.imul(xe, Bt) | 0, m = m + Math.imul(xe, Ft) | 0, m = m + Math.imul(Be, Bt) | 0, v = v + Math.imul(Be, Ft) | 0, L = L + Math.imul(De, Nt) | 0, m = m + Math.imul(De, Ut) | 0, m = m + Math.imul(ze, Nt) | 0, v = v + Math.imul(ze, Ut) | 0;\n        var ka = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (ka >>> 26) | 0, ka &= 67108863, L = Math.imul(Q, It), m = Math.imul(Q, _t), m = m + Math.imul(se, It) | 0, v = Math.imul(se, _t), L = L + Math.imul(T, Rt) | 0, m = m + Math.imul(T, Lt) | 0, m = m + Math.imul(G, Rt) | 0, v = v + Math.imul(G, Lt) | 0, L = L + Math.imul(je, Ct) | 0, m = m + Math.imul(je, kt) | 0, m = m + Math.imul(B, Ct) | 0, v = v + Math.imul(B, kt) | 0, L = L + Math.imul(Je, Dt) | 0, m = m + Math.imul(Je, Pt) | 0, m = m + Math.imul(Qe, Dt) | 0, v = v + Math.imul(Qe, Pt) | 0, L = L + Math.imul(we, Mt) | 0, m = m + Math.imul(we, Ot) | 0, m = m + Math.imul(Ne, Mt) | 0, v = v + Math.imul(Ne, Ot) | 0, L = L + Math.imul(be, Bt) | 0, m = m + Math.imul(be, Ft) | 0, m = m + Math.imul(Fe, Bt) | 0, v = v + Math.imul(Fe, Ft) | 0, L = L + Math.imul(xe, Nt) | 0, m = m + Math.imul(xe, Ut) | 0, m = m + Math.imul(Be, Nt) | 0, v = v + Math.imul(Be, Ut) | 0;\n        var Da = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Da >>> 26) | 0, Da &= 67108863, L = Math.imul(Q, Rt), m = Math.imul(Q, Lt), m = m + Math.imul(se, Rt) | 0, v = Math.imul(se, Lt), L = L + Math.imul(T, Ct) | 0, m = m + Math.imul(T, kt) | 0, m = m + Math.imul(G, Ct) | 0, v = v + Math.imul(G, kt) | 0, L = L + Math.imul(je, Dt) | 0, m = m + Math.imul(je, Pt) | 0, m = m + Math.imul(B, Dt) | 0, v = v + Math.imul(B, Pt) | 0, L = L + Math.imul(Je, Mt) | 0, m = m + Math.imul(Je, Ot) | 0, m = m + Math.imul(Qe, Mt) | 0, v = v + Math.imul(Qe, Ot) | 0, L = L + Math.imul(we, Bt) | 0, m = m + Math.imul(we, Ft) | 0, m = m + Math.imul(Ne, Bt) | 0, v = v + Math.imul(Ne, Ft) | 0, L = L + Math.imul(be, Nt) | 0, m = m + Math.imul(be, Ut) | 0, m = m + Math.imul(Fe, Nt) | 0, v = v + Math.imul(Fe, Ut) | 0;\n        var Pa = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Pa >>> 26) | 0, Pa &= 67108863, L = Math.imul(Q, Ct), m = Math.imul(Q, kt), m = m + Math.imul(se, Ct) | 0, v = Math.imul(se, kt), L = L + Math.imul(T, Dt) | 0, m = m + Math.imul(T, Pt) | 0, m = m + Math.imul(G, Dt) | 0, v = v + Math.imul(G, Pt) | 0, L = L + Math.imul(je, Mt) | 0, m = m + Math.imul(je, Ot) | 0, m = m + Math.imul(B, Mt) | 0, v = v + Math.imul(B, Ot) | 0, L = L + Math.imul(Je, Bt) | 0, m = m + Math.imul(Je, Ft) | 0, m = m + Math.imul(Qe, Bt) | 0, v = v + Math.imul(Qe, Ft) | 0, L = L + Math.imul(we, Nt) | 0, m = m + Math.imul(we, Ut) | 0, m = m + Math.imul(Ne, Nt) | 0, v = v + Math.imul(Ne, Ut) | 0;\n        var Ma = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Ma >>> 26) | 0, Ma &= 67108863, L = Math.imul(Q, Dt), m = Math.imul(Q, Pt), m = m + Math.imul(se, Dt) | 0, v = Math.imul(se, Pt), L = L + Math.imul(T, Mt) | 0, m = m + Math.imul(T, Ot) | 0, m = m + Math.imul(G, Mt) | 0, v = v + Math.imul(G, Ot) | 0, L = L + Math.imul(je, Bt) | 0, m = m + Math.imul(je, Ft) | 0, m = m + Math.imul(B, Bt) | 0, v = v + Math.imul(B, Ft) | 0, L = L + Math.imul(Je, Nt) | 0, m = m + Math.imul(Je, Ut) | 0, m = m + Math.imul(Qe, Nt) | 0, v = v + Math.imul(Qe, Ut) | 0;\n        var Oa = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Oa >>> 26) | 0, Oa &= 67108863, L = Math.imul(Q, Mt), m = Math.imul(Q, Ot), m = m + Math.imul(se, Mt) | 0, v = Math.imul(se, Ot), L = L + Math.imul(T, Bt) | 0, m = m + Math.imul(T, Ft) | 0, m = m + Math.imul(G, Bt) | 0, v = v + Math.imul(G, Ft) | 0, L = L + Math.imul(je, Nt) | 0, m = m + Math.imul(je, Ut) | 0, m = m + Math.imul(B, Nt) | 0, v = v + Math.imul(B, Ut) | 0;\n        var Ba = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Ba >>> 26) | 0, Ba &= 67108863, L = Math.imul(Q, Bt), m = Math.imul(Q, Ft), m = m + Math.imul(se, Bt) | 0, v = Math.imul(se, Ft), L = L + Math.imul(T, Nt) | 0, m = m + Math.imul(T, Ut) | 0, m = m + Math.imul(G, Nt) | 0, v = v + Math.imul(G, Ut) | 0;\n        var Fa = (V + L | 0) + ((m & 8191) << 13) | 0;\n        V = (v + (m >>> 13) | 0) + (Fa >>> 26) | 0, Fa &= 67108863, L = Math.imul(Q, Nt), m = Math.imul(Q, Ut), m = m + Math.imul(se, Nt) | 0, v = Math.imul(se, Ut);\n        var Na = (V + L | 0) + ((m & 8191) << 13) | 0;\n        return V = (v + (m >>> 13) | 0) + (Na >>> 26) | 0, Na &= 67108863, U[0] = xa, U[1] = Sa, U[2] = ba, U[3] = Ta, U[4] = wa, U[5] = Aa, U[6] = Ia, U[7] = _a, U[8] = Ra, U[9] = La, U[10] = Ca, U[11] = ka, U[12] = Da, U[13] = Pa, U[14] = Ma, U[15] = Oa, U[16] = Ba, U[17] = Fa, U[18] = Na, V !== 0 && (U[19] = V, w.length++), w;\n      };\n      Math.imul || (R = b);\n      function A(_, g, x) {\n        x.negative = g.negative ^ _.negative, x.length = _.length + g.length;\n        for (var w = 0, D = 0, O = 0; O < x.length - 1; O++) {\n          var U = D;\n          D = 0;\n          for (var V = w & 67108863, L = Math.min(O, g.length - 1), m = Math.max(0, O - _.length + 1); m <= L; m++) {\n            var v = O - m, P = _.words[v] | 0, N = g.words[m] | 0, Y = P * N, ee = Y & 67108863;\n            U = U + (Y / 67108864 | 0) | 0, ee = ee + V | 0, V = ee & 67108863, U = U + (ee >>> 26) | 0, D += U >>> 26, U &= 67108863;\n          }\n          x.words[O] = V, w = U, U = D;\n        }\n        return w !== 0 ? x.words[O] = w : x.length--, x._strip();\n      }\n      function F(_, g, x) {\n        return A(_, g, x);\n      }\n      i.prototype.mulTo = function(g, x) {\n        var w, D = this.length + g.length;\n        return this.length === 10 && g.length === 10 ? w = R(this, g, x) : D < 63 ? w = b(this, g, x) : D < 1024 ? w = A(this, g, x) : w = F(this, g, x), w;\n      }, i.prototype.mul = function(g) {\n        var x = new i(null);\n        return x.words = new Array(this.length + g.length), this.mulTo(g, x);\n      }, i.prototype.mulf = function(g) {\n        var x = new i(null);\n        return x.words = new Array(this.length + g.length), F(this, g, x);\n      }, i.prototype.imul = function(g) {\n        return this.clone().mulTo(g, this);\n      }, i.prototype.imuln = function(g) {\n        var x = g < 0;\n        x && (g = -g), r(typeof g == \"number\"), r(g < 67108864);\n        for (var w = 0, D = 0; D < this.length; D++) {\n          var O = (this.words[D] | 0) * g, U = (O & 67108863) + (w & 67108863);\n          w >>= 26, w += O / 67108864 | 0, w += U >>> 26, this.words[D] = U & 67108863;\n        }\n        return w !== 0 && (this.words[D] = w, this.length++), this.length = g === 0 ? 1 : this.length, x ? this.ineg() : this;\n      }, i.prototype.muln = function(g) {\n        return this.clone().imuln(g);\n      }, i.prototype.sqr = function() {\n        return this.mul(this);\n      }, i.prototype.isqr = function() {\n        return this.imul(this.clone());\n      }, i.prototype.pow = function(g) {\n        var x = E(g);\n        if (x.length === 0) return new i(1);\n        for (var w = this, D = 0; D < x.length && x[D] === 0; D++, w = w.sqr())\n          ;\n        if (++D < x.length)\n          for (var O = w.sqr(); D < x.length; D++, O = O.sqr())\n            x[D] !== 0 && (w = w.mul(O));\n        return w;\n      }, i.prototype.iushln = function(g) {\n        r(typeof g == \"number\" && g >= 0);\n        var x = g % 26, w = (g - x) / 26, D = 67108863 >>> 26 - x << 26 - x, O;\n        if (x !== 0) {\n          var U = 0;\n          for (O = 0; O < this.length; O++) {\n            var V = this.words[O] & D, L = (this.words[O] | 0) - V << x;\n            this.words[O] = L | U, U = V >>> 26 - x;\n          }\n          U && (this.words[O] = U, this.length++);\n        }\n        if (w !== 0) {\n          for (O = this.length - 1; O >= 0; O--)\n            this.words[O + w] = this.words[O];\n          for (O = 0; O < w; O++)\n            this.words[O] = 0;\n          this.length += w;\n        }\n        return this._strip();\n      }, i.prototype.ishln = function(g) {\n        return r(this.negative === 0), this.iushln(g);\n      }, i.prototype.iushrn = function(g, x, w) {\n        r(typeof g == \"number\" && g >= 0);\n        var D;\n        x ? D = (x - x % 26) / 26 : D = 0;\n        var O = g % 26, U = Math.min((g - O) / 26, this.length), V = 67108863 ^ 67108863 >>> O << O, L = w;\n        if (D -= U, D = Math.max(0, D), L) {\n          for (var m = 0; m < U; m++)\n            L.words[m] = this.words[m];\n          L.length = U;\n        }\n        if (U !== 0) if (this.length > U)\n          for (this.length -= U, m = 0; m < this.length; m++)\n            this.words[m] = this.words[m + U];\n        else\n          this.words[0] = 0, this.length = 1;\n        var v = 0;\n        for (m = this.length - 1; m >= 0 && (v !== 0 || m >= D); m--) {\n          var P = this.words[m] | 0;\n          this.words[m] = v << 26 - O | P >>> O, v = P & V;\n        }\n        return L && v !== 0 && (L.words[L.length++] = v), this.length === 0 && (this.words[0] = 0, this.length = 1), this._strip();\n      }, i.prototype.ishrn = function(g, x, w) {\n        return r(this.negative === 0), this.iushrn(g, x, w);\n      }, i.prototype.shln = function(g) {\n        return this.clone().ishln(g);\n      }, i.prototype.ushln = function(g) {\n        return this.clone().iushln(g);\n      }, i.prototype.shrn = function(g) {\n        return this.clone().ishrn(g);\n      }, i.prototype.ushrn = function(g) {\n        return this.clone().iushrn(g);\n      }, i.prototype.testn = function(g) {\n        r(typeof g == \"number\" && g >= 0);\n        var x = g % 26, w = (g - x) / 26, D = 1 << x;\n        if (this.length <= w) return !1;\n        var O = this.words[w];\n        return !!(O & D);\n      }, i.prototype.imaskn = function(g) {\n        r(typeof g == \"number\" && g >= 0);\n        var x = g % 26, w = (g - x) / 26;\n        if (r(this.negative === 0, \"imaskn works only with positive numbers\"), this.length <= w)\n          return this;\n        if (x !== 0 && w++, this.length = Math.min(w, this.length), x !== 0) {\n          var D = 67108863 ^ 67108863 >>> x << x;\n          this.words[this.length - 1] &= D;\n        }\n        return this._strip();\n      }, i.prototype.maskn = function(g) {\n        return this.clone().imaskn(g);\n      }, i.prototype.iaddn = function(g) {\n        return r(typeof g == \"number\"), r(g < 67108864), g < 0 ? this.isubn(-g) : this.negative !== 0 ? this.length === 1 && (this.words[0] | 0) <= g ? (this.words[0] = g - (this.words[0] | 0), this.negative = 0, this) : (this.negative = 0, this.isubn(g), this.negative = 1, this) : this._iaddn(g);\n      }, i.prototype._iaddn = function(g) {\n        this.words[0] += g;\n        for (var x = 0; x < this.length && this.words[x] >= 67108864; x++)\n          this.words[x] -= 67108864, x === this.length - 1 ? this.words[x + 1] = 1 : this.words[x + 1]++;\n        return this.length = Math.max(this.length, x + 1), this;\n      }, i.prototype.isubn = function(g) {\n        if (r(typeof g == \"number\"), r(g < 67108864), g < 0) return this.iaddn(-g);\n        if (this.negative !== 0)\n          return this.negative = 0, this.iaddn(g), this.negative = 1, this;\n        if (this.words[0] -= g, this.length === 1 && this.words[0] < 0)\n          this.words[0] = -this.words[0], this.negative = 1;\n        else\n          for (var x = 0; x < this.length && this.words[x] < 0; x++)\n            this.words[x] += 67108864, this.words[x + 1] -= 1;\n        return this._strip();\n      }, i.prototype.addn = function(g) {\n        return this.clone().iaddn(g);\n      }, i.prototype.subn = function(g) {\n        return this.clone().isubn(g);\n      }, i.prototype.iabs = function() {\n        return this.negative = 0, this;\n      }, i.prototype.abs = function() {\n        return this.clone().iabs();\n      }, i.prototype._ishlnsubmul = function(g, x, w) {\n        var D = g.length + w, O;\n        this._expand(D);\n        var U, V = 0;\n        for (O = 0; O < g.length; O++) {\n          U = (this.words[O + w] | 0) + V;\n          var L = (g.words[O] | 0) * x;\n          U -= L & 67108863, V = (U >> 26) - (L / 67108864 | 0), this.words[O + w] = U & 67108863;\n        }\n        for (; O < this.length - w; O++)\n          U = (this.words[O + w] | 0) + V, V = U >> 26, this.words[O + w] = U & 67108863;\n        if (V === 0) return this._strip();\n        for (r(V === -1), V = 0, O = 0; O < this.length; O++)\n          U = -(this.words[O] | 0) + V, V = U >> 26, this.words[O] = U & 67108863;\n        return this.negative = 1, this._strip();\n      }, i.prototype._wordDiv = function(g, x) {\n        var w = this.length - g.length, D = this.clone(), O = g, U = O.words[O.length - 1] | 0, V = this._countBits(U);\n        w = 26 - V, w !== 0 && (O = O.ushln(w), D.iushln(w), U = O.words[O.length - 1] | 0);\n        var L = D.length - O.length, m;\n        if (x !== \"mod\") {\n          m = new i(null), m.length = L + 1, m.words = new Array(m.length);\n          for (var v = 0; v < m.length; v++)\n            m.words[v] = 0;\n        }\n        var P = D.clone()._ishlnsubmul(O, 1, L);\n        P.negative === 0 && (D = P, m && (m.words[L] = 1));\n        for (var N = L - 1; N >= 0; N--) {\n          var Y = (D.words[O.length + N] | 0) * 67108864 + (D.words[O.length + N - 1] | 0);\n          for (Y = Math.min(Y / U | 0, 67108863), D._ishlnsubmul(O, Y, N); D.negative !== 0; )\n            Y--, D.negative = 0, D._ishlnsubmul(O, 1, N), D.isZero() || (D.negative ^= 1);\n          m && (m.words[N] = Y);\n        }\n        return m && m._strip(), D._strip(), x !== \"div\" && w !== 0 && D.iushrn(w), {\n          div: m || null,\n          mod: D\n        };\n      }, i.prototype.divmod = function(g, x, w) {\n        if (r(!g.isZero()), this.isZero())\n          return {\n            div: new i(0),\n            mod: new i(0)\n          };\n        var D, O, U;\n        return this.negative !== 0 && g.negative === 0 ? (U = this.neg().divmod(g, x), x !== \"mod\" && (D = U.div.neg()), x !== \"div\" && (O = U.mod.neg(), w && O.negative !== 0 && O.iadd(g)), {\n          div: D,\n          mod: O\n        }) : this.negative === 0 && g.negative !== 0 ? (U = this.divmod(g.neg(), x), x !== \"mod\" && (D = U.div.neg()), {\n          div: D,\n          mod: U.mod\n        }) : (this.negative & g.negative) !== 0 ? (U = this.neg().divmod(g.neg(), x), x !== \"div\" && (O = U.mod.neg(), w && O.negative !== 0 && O.isub(g)), {\n          div: U.div,\n          mod: O\n        }) : g.length > this.length || this.cmp(g) < 0 ? {\n          div: new i(0),\n          mod: this\n        } : g.length === 1 ? x === \"div\" ? {\n          div: this.divn(g.words[0]),\n          mod: null\n        } : x === \"mod\" ? {\n          div: null,\n          mod: new i(this.modrn(g.words[0]))\n        } : {\n          div: this.divn(g.words[0]),\n          mod: new i(this.modrn(g.words[0]))\n        } : this._wordDiv(g, x);\n      }, i.prototype.div = function(g) {\n        return this.divmod(g, \"div\", !1).div;\n      }, i.prototype.mod = function(g) {\n        return this.divmod(g, \"mod\", !1).mod;\n      }, i.prototype.umod = function(g) {\n        return this.divmod(g, \"mod\", !0).mod;\n      }, i.prototype.divRound = function(g) {\n        var x = this.divmod(g);\n        if (x.mod.isZero()) return x.div;\n        var w = x.div.negative !== 0 ? x.mod.isub(g) : x.mod, D = g.ushrn(1), O = g.andln(1), U = w.cmp(D);\n        return U < 0 || O === 1 && U === 0 ? x.div : x.div.negative !== 0 ? x.div.isubn(1) : x.div.iaddn(1);\n      }, i.prototype.modrn = function(g) {\n        var x = g < 0;\n        x && (g = -g), r(g <= 67108863);\n        for (var w = (1 << 26) % g, D = 0, O = this.length - 1; O >= 0; O--)\n          D = (w * D + (this.words[O] | 0)) % g;\n        return x ? -D : D;\n      }, i.prototype.modn = function(g) {\n        return this.modrn(g);\n      }, i.prototype.idivn = function(g) {\n        var x = g < 0;\n        x && (g = -g), r(g <= 67108863);\n        for (var w = 0, D = this.length - 1; D >= 0; D--) {\n          var O = (this.words[D] | 0) + w * 67108864;\n          this.words[D] = O / g | 0, w = O % g;\n        }\n        return this._strip(), x ? this.ineg() : this;\n      }, i.prototype.divn = function(g) {\n        return this.clone().idivn(g);\n      }, i.prototype.egcd = function(g) {\n        r(g.negative === 0), r(!g.isZero());\n        var x = this, w = g.clone();\n        x.negative !== 0 ? x = x.umod(g) : x = x.clone();\n        for (var D = new i(1), O = new i(0), U = new i(0), V = new i(1), L = 0; x.isEven() && w.isEven(); )\n          x.iushrn(1), w.iushrn(1), ++L;\n        for (var m = w.clone(), v = x.clone(); !x.isZero(); ) {\n          for (var P = 0, N = 1; (x.words[0] & N) === 0 && P < 26; ++P, N <<= 1) ;\n          if (P > 0)\n            for (x.iushrn(P); P-- > 0; )\n              (D.isOdd() || O.isOdd()) && (D.iadd(m), O.isub(v)), D.iushrn(1), O.iushrn(1);\n          for (var Y = 0, ee = 1; (w.words[0] & ee) === 0 && Y < 26; ++Y, ee <<= 1) ;\n          if (Y > 0)\n            for (w.iushrn(Y); Y-- > 0; )\n              (U.isOdd() || V.isOdd()) && (U.iadd(m), V.isub(v)), U.iushrn(1), V.iushrn(1);\n          x.cmp(w) >= 0 ? (x.isub(w), D.isub(U), O.isub(V)) : (w.isub(x), U.isub(D), V.isub(O));\n        }\n        return {\n          a: U,\n          b: V,\n          gcd: w.iushln(L)\n        };\n      }, i.prototype._invmp = function(g) {\n        r(g.negative === 0), r(!g.isZero());\n        var x = this, w = g.clone();\n        x.negative !== 0 ? x = x.umod(g) : x = x.clone();\n        for (var D = new i(1), O = new i(0), U = w.clone(); x.cmpn(1) > 0 && w.cmpn(1) > 0; ) {\n          for (var V = 0, L = 1; (x.words[0] & L) === 0 && V < 26; ++V, L <<= 1) ;\n          if (V > 0)\n            for (x.iushrn(V); V-- > 0; )\n              D.isOdd() && D.iadd(U), D.iushrn(1);\n          for (var m = 0, v = 1; (w.words[0] & v) === 0 && m < 26; ++m, v <<= 1) ;\n          if (m > 0)\n            for (w.iushrn(m); m-- > 0; )\n              O.isOdd() && O.iadd(U), O.iushrn(1);\n          x.cmp(w) >= 0 ? (x.isub(w), D.isub(O)) : (w.isub(x), O.isub(D));\n        }\n        var P;\n        return x.cmpn(1) === 0 ? P = D : P = O, P.cmpn(0) < 0 && P.iadd(g), P;\n      }, i.prototype.gcd = function(g) {\n        if (this.isZero()) return g.abs();\n        if (g.isZero()) return this.abs();\n        var x = this.clone(), w = g.clone();\n        x.negative = 0, w.negative = 0;\n        for (var D = 0; x.isEven() && w.isEven(); D++)\n          x.iushrn(1), w.iushrn(1);\n        do {\n          for (; x.isEven(); )\n            x.iushrn(1);\n          for (; w.isEven(); )\n            w.iushrn(1);\n          var O = x.cmp(w);\n          if (O < 0) {\n            var U = x;\n            x = w, w = U;\n          } else if (O === 0 || w.cmpn(1) === 0)\n            break;\n          x.isub(w);\n        } while (!0);\n        return w.iushln(D);\n      }, i.prototype.invm = function(g) {\n        return this.egcd(g).a.umod(g);\n      }, i.prototype.isEven = function() {\n        return (this.words[0] & 1) === 0;\n      }, i.prototype.isOdd = function() {\n        return (this.words[0] & 1) === 1;\n      }, i.prototype.andln = function(g) {\n        return this.words[0] & g;\n      }, i.prototype.bincn = function(g) {\n        r(typeof g == \"number\");\n        var x = g % 26, w = (g - x) / 26, D = 1 << x;\n        if (this.length <= w)\n          return this._expand(w + 1), this.words[w] |= D, this;\n        for (var O = D, U = w; O !== 0 && U < this.length; U++) {\n          var V = this.words[U] | 0;\n          V += O, O = V >>> 26, V &= 67108863, this.words[U] = V;\n        }\n        return O !== 0 && (this.words[U] = O, this.length++), this;\n      }, i.prototype.isZero = function() {\n        return this.length === 1 && this.words[0] === 0;\n      }, i.prototype.cmpn = function(g) {\n        var x = g < 0;\n        if (this.negative !== 0 && !x) return -1;\n        if (this.negative === 0 && x) return 1;\n        this._strip();\n        var w;\n        if (this.length > 1)\n          w = 1;\n        else {\n          x && (g = -g), r(g <= 67108863, \"Number is too big\");\n          var D = this.words[0] | 0;\n          w = D === g ? 0 : D < g ? -1 : 1;\n        }\n        return this.negative !== 0 ? -w | 0 : w;\n      }, i.prototype.cmp = function(g) {\n        if (this.negative !== 0 && g.negative === 0) return -1;\n        if (this.negative === 0 && g.negative !== 0) return 1;\n        var x = this.ucmp(g);\n        return this.negative !== 0 ? -x | 0 : x;\n      }, i.prototype.ucmp = function(g) {\n        if (this.length > g.length) return 1;\n        if (this.length < g.length) return -1;\n        for (var x = 0, w = this.length - 1; w >= 0; w--) {\n          var D = this.words[w] | 0, O = g.words[w] | 0;\n          if (D !== O) {\n            D < O ? x = -1 : D > O && (x = 1);\n            break;\n          }\n        }\n        return x;\n      }, i.prototype.gtn = function(g) {\n        return this.cmpn(g) === 1;\n      }, i.prototype.gt = function(g) {\n        return this.cmp(g) === 1;\n      }, i.prototype.gten = function(g) {\n        return this.cmpn(g) >= 0;\n      }, i.prototype.gte = function(g) {\n        return this.cmp(g) >= 0;\n      }, i.prototype.ltn = function(g) {\n        return this.cmpn(g) === -1;\n      }, i.prototype.lt = function(g) {\n        return this.cmp(g) === -1;\n      }, i.prototype.lten = function(g) {\n        return this.cmpn(g) <= 0;\n      }, i.prototype.lte = function(g) {\n        return this.cmp(g) <= 0;\n      }, i.prototype.eqn = function(g) {\n        return this.cmpn(g) === 0;\n      }, i.prototype.eq = function(g) {\n        return this.cmp(g) === 0;\n      }, i.red = function(g) {\n        return new $(g);\n      }, i.prototype.toRed = function(g) {\n        return r(!this.red, \"Already a number in reduction context\"), r(this.negative === 0, \"red works only with positives\"), g.convertTo(this)._forceRed(g);\n      }, i.prototype.fromRed = function() {\n        return r(this.red, \"fromRed works only with numbers in reduction context\"), this.red.convertFrom(this);\n      }, i.prototype._forceRed = function(g) {\n        return this.red = g, this;\n      }, i.prototype.forceRed = function(g) {\n        return r(!this.red, \"Already a number in reduction context\"), this._forceRed(g);\n      }, i.prototype.redAdd = function(g) {\n        return r(this.red, \"redAdd works only with red numbers\"), this.red.add(this, g);\n      }, i.prototype.redIAdd = function(g) {\n        return r(this.red, \"redIAdd works only with red numbers\"), this.red.iadd(this, g);\n      }, i.prototype.redSub = function(g) {\n        return r(this.red, \"redSub works only with red numbers\"), this.red.sub(this, g);\n      }, i.prototype.redISub = function(g) {\n        return r(this.red, \"redISub works only with red numbers\"), this.red.isub(this, g);\n      }, i.prototype.redShl = function(g) {\n        return r(this.red, \"redShl works only with red numbers\"), this.red.shl(this, g);\n      }, i.prototype.redMul = function(g) {\n        return r(this.red, \"redMul works only with red numbers\"), this.red._verify2(this, g), this.red.mul(this, g);\n      }, i.prototype.redIMul = function(g) {\n        return r(this.red, \"redMul works only with red numbers\"), this.red._verify2(this, g), this.red.imul(this, g);\n      }, i.prototype.redSqr = function() {\n        return r(this.red, \"redSqr works only with red numbers\"), this.red._verify1(this), this.red.sqr(this);\n      }, i.prototype.redISqr = function() {\n        return r(this.red, \"redISqr works only with red numbers\"), this.red._verify1(this), this.red.isqr(this);\n      }, i.prototype.redSqrt = function() {\n        return r(this.red, \"redSqrt works only with red numbers\"), this.red._verify1(this), this.red.sqrt(this);\n      }, i.prototype.redInvm = function() {\n        return r(this.red, \"redInvm works only with red numbers\"), this.red._verify1(this), this.red.invm(this);\n      }, i.prototype.redNeg = function() {\n        return r(this.red, \"redNeg works only with red numbers\"), this.red._verify1(this), this.red.neg(this);\n      }, i.prototype.redPow = function(g) {\n        return r(this.red && !g.red, \"redPow(normalNum)\"), this.red._verify1(this), this.red.pow(this, g);\n      };\n      var M = {\n        k256: null,\n        p224: null,\n        p192: null,\n        p25519: null\n      };\n      function H(_, g) {\n        this.name = _, this.p = new i(g, 16), this.n = this.p.bitLength(), this.k = new i(1).iushln(this.n).isub(this.p), this.tmp = this._tmp();\n      }\n      H.prototype._tmp = function() {\n        var g = new i(null);\n        return g.words = new Array(Math.ceil(this.n / 13)), g;\n      }, H.prototype.ireduce = function(g) {\n        var x = g, w;\n        do\n          this.split(x, this.tmp), x = this.imulK(x), x = x.iadd(this.tmp), w = x.bitLength();\n        while (w > this.n);\n        var D = w < this.n ? -1 : x.ucmp(this.p);\n        return D === 0 ? (x.words[0] = 0, x.length = 1) : D > 0 ? x.isub(this.p) : x.strip !== void 0 ? x.strip() : x._strip(), x;\n      }, H.prototype.split = function(g, x) {\n        g.iushrn(this.n, 0, x);\n      }, H.prototype.imulK = function(g) {\n        return g.imul(this.k);\n      };\n      function K() {\n        H.call(\n          this,\n          \"k256\",\n          \"ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f\"\n        );\n      }\n      n(K, H), K.prototype.split = function(g, x) {\n        for (var w = 4194303, D = Math.min(g.length, 9), O = 0; O < D; O++)\n          x.words[O] = g.words[O];\n        if (x.length = D, g.length <= 9) {\n          g.words[0] = 0, g.length = 1;\n          return;\n        }\n        var U = g.words[9];\n        for (x.words[x.length++] = U & w, O = 10; O < g.length; O++) {\n          var V = g.words[O] | 0;\n          g.words[O - 10] = (V & w) << 4 | U >>> 22, U = V;\n        }\n        U >>>= 22, g.words[O - 10] = U, U === 0 && g.length > 10 ? g.length -= 10 : g.length -= 9;\n      }, K.prototype.imulK = function(g) {\n        g.words[g.length] = 0, g.words[g.length + 1] = 0, g.length += 2;\n        for (var x = 0, w = 0; w < g.length; w++) {\n          var D = g.words[w] | 0;\n          x += D * 977, g.words[w] = x & 67108863, x = D * 64 + (x / 67108864 | 0);\n        }\n        return g.words[g.length - 1] === 0 && (g.length--, g.words[g.length - 1] === 0 && g.length--), g;\n      };\n      function j() {\n        H.call(\n          this,\n          \"p224\",\n          \"ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001\"\n        );\n      }\n      n(j, H);\n      function C() {\n        H.call(\n          this,\n          \"p192\",\n          \"ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff\"\n        );\n      }\n      n(C, H);\n      function k() {\n        H.call(\n          this,\n          \"25519\",\n          \"7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed\"\n        );\n      }\n      n(k, H), k.prototype.imulK = function(g) {\n        for (var x = 0, w = 0; w < g.length; w++) {\n          var D = (g.words[w] | 0) * 19 + x, O = D & 67108863;\n          D >>>= 26, g.words[w] = O, x = D;\n        }\n        return x !== 0 && (g.words[g.length++] = x), g;\n      }, i._prime = function(g) {\n        if (M[g]) return M[g];\n        var x;\n        if (g === \"k256\")\n          x = new K();\n        else if (g === \"p224\")\n          x = new j();\n        else if (g === \"p192\")\n          x = new C();\n        else if (g === \"p25519\")\n          x = new k();\n        else\n          throw new Error(\"Unknown prime \" + g);\n        return M[g] = x, x;\n      };\n      function $(_) {\n        if (typeof _ == \"string\") {\n          var g = i._prime(_);\n          this.m = g.p, this.prime = g;\n        } else\n          r(_.gtn(1), \"modulus must be greater than 1\"), this.m = _, this.prime = null;\n      }\n      $.prototype._verify1 = function(g) {\n        r(g.negative === 0, \"red works only with positives\"), r(g.red, \"red works only with red numbers\");\n      }, $.prototype._verify2 = function(g, x) {\n        r((g.negative | x.negative) === 0, \"red works only with positives\"), r(\n          g.red && g.red === x.red,\n          \"red works only with red numbers\"\n        );\n      }, $.prototype.imod = function(g) {\n        return this.prime ? this.prime.ireduce(g)._forceRed(this) : (u(g, g.umod(this.m)._forceRed(this)), g);\n      }, $.prototype.neg = function(g) {\n        return g.isZero() ? g.clone() : this.m.sub(g)._forceRed(this);\n      }, $.prototype.add = function(g, x) {\n        this._verify2(g, x);\n        var w = g.add(x);\n        return w.cmp(this.m) >= 0 && w.isub(this.m), w._forceRed(this);\n      }, $.prototype.iadd = function(g, x) {\n        this._verify2(g, x);\n        var w = g.iadd(x);\n        return w.cmp(this.m) >= 0 && w.isub(this.m), w;\n      }, $.prototype.sub = function(g, x) {\n        this._verify2(g, x);\n        var w = g.sub(x);\n        return w.cmpn(0) < 0 && w.iadd(this.m), w._forceRed(this);\n      }, $.prototype.isub = function(g, x) {\n        this._verify2(g, x);\n        var w = g.isub(x);\n        return w.cmpn(0) < 0 && w.iadd(this.m), w;\n      }, $.prototype.shl = function(g, x) {\n        return this._verify1(g), this.imod(g.ushln(x));\n      }, $.prototype.imul = function(g, x) {\n        return this._verify2(g, x), this.imod(g.imul(x));\n      }, $.prototype.mul = function(g, x) {\n        return this._verify2(g, x), this.imod(g.mul(x));\n      }, $.prototype.isqr = function(g) {\n        return this.imul(g, g.clone());\n      }, $.prototype.sqr = function(g) {\n        return this.mul(g, g);\n      }, $.prototype.sqrt = function(g) {\n        if (g.isZero()) return g.clone();\n        var x = this.m.andln(3);\n        if (r(x % 2 === 1), x === 3) {\n          var w = this.m.add(new i(1)).iushrn(2);\n          return this.pow(g, w);\n        }\n        for (var D = this.m.subn(1), O = 0; !D.isZero() && D.andln(1) === 0; )\n          O++, D.iushrn(1);\n        r(!D.isZero());\n        var U = new i(1).toRed(this), V = U.redNeg(), L = this.m.subn(1).iushrn(1), m = this.m.bitLength();\n        for (m = new i(2 * m * m).toRed(this); this.pow(m, L).cmp(V) !== 0; )\n          m.redIAdd(V);\n        for (var v = this.pow(m, D), P = this.pow(g, D.addn(1).iushrn(1)), N = this.pow(g, D), Y = O; N.cmp(U) !== 0; ) {\n          for (var ee = N, ie = 0; ee.cmp(U) !== 0; ie++)\n            ee = ee.redSqr();\n          r(ie < Y);\n          var le = this.pow(v, new i(1).iushln(Y - ie - 1));\n          P = P.redMul(le), v = le.redSqr(), N = N.redMul(v), Y = ie;\n        }\n        return P;\n      }, $.prototype.invm = function(g) {\n        var x = g._invmp(this.m);\n        return x.negative !== 0 ? (x.negative = 0, this.imod(x).redNeg()) : this.imod(x);\n      }, $.prototype.pow = function(g, x) {\n        if (x.isZero()) return new i(1).toRed(this);\n        if (x.cmpn(1) === 0) return g.clone();\n        var w = 4, D = new Array(1 << w);\n        D[0] = new i(1).toRed(this), D[1] = g;\n        for (var O = 2; O < D.length; O++)\n          D[O] = this.mul(D[O - 1], g);\n        var U = D[0], V = 0, L = 0, m = x.bitLength() % 26;\n        for (m === 0 && (m = 26), O = x.length - 1; O >= 0; O--) {\n          for (var v = x.words[O], P = m - 1; P >= 0; P--) {\n            var N = v >> P & 1;\n            if (U !== D[0] && (U = this.sqr(U)), N === 0 && V === 0) {\n              L = 0;\n              continue;\n            }\n            V <<= 1, V |= N, L++, !(L !== w && (O !== 0 || P !== 0)) && (U = this.mul(U, D[V]), L = 0, V = 0);\n          }\n          m = 26;\n        }\n        return U;\n      }, $.prototype.convertTo = function(g) {\n        var x = g.umod(this.m);\n        return x === g ? x.clone() : x;\n      }, $.prototype.convertFrom = function(g) {\n        var x = g.clone();\n        return x.red = null, x;\n      }, i.mont = function(g) {\n        return new W(g);\n      };\n      function W(_) {\n        $.call(this, _), this.shift = this.m.bitLength(), this.shift % 26 !== 0 && (this.shift += 26 - this.shift % 26), this.r = new i(1).iushln(this.shift), this.r2 = this.imod(this.r.sqr()), this.rinv = this.r._invmp(this.m), this.minv = this.rinv.mul(this.r).isubn(1).div(this.m), this.minv = this.minv.umod(this.r), this.minv = this.r.sub(this.minv);\n      }\n      n(W, $), W.prototype.convertTo = function(g) {\n        return this.imod(g.ushln(this.shift));\n      }, W.prototype.convertFrom = function(g) {\n        var x = this.imod(g.mul(this.rinv));\n        return x.red = null, x;\n      }, W.prototype.imul = function(g, x) {\n        if (g.isZero() || x.isZero())\n          return g.words[0] = 0, g.length = 1, g;\n        var w = g.imul(x), D = w.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), O = w.isub(D).iushrn(this.shift), U = O;\n        return O.cmp(this.m) >= 0 ? U = O.isub(this.m) : O.cmpn(0) < 0 && (U = O.iadd(this.m)), U._forceRed(this);\n      }, W.prototype.mul = function(g, x) {\n        if (g.isZero() || x.isZero()) return new i(0)._forceRed(this);\n        var w = g.mul(x), D = w.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m), O = w.isub(D).iushrn(this.shift), U = O;\n        return O.cmp(this.m) >= 0 ? U = O.isub(this.m) : O.cmpn(0) < 0 && (U = O.iadd(this.m)), U._forceRed(this);\n      }, W.prototype.invm = function(g) {\n        var x = this.imod(g._invmp(this.m).mul(this.r2));\n        return x._forceRed(this);\n      };\n    })(s, My);\n  })(co)), co.exports;\n}\nvar Oy = v0();\nconst bd = /* @__PURE__ */ Fc(Oy);\nvar Ui = { exports: {} };\n/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\nvar Td;\nfunction By() {\n  return Td || (Td = 1, (function(s, e) {\n    var t = Kc(), r = t.Buffer;\n    function n(o, a) {\n      for (var l in o)\n        a[l] = o[l];\n    }\n    r.from && r.alloc && r.allocUnsafe && r.allocUnsafeSlow ? s.exports = t : (n(t, e), e.Buffer = i);\n    function i(o, a, l) {\n      return r(o, a, l);\n    }\n    i.prototype = Object.create(r.prototype), n(r, i), i.from = function(o, a, l) {\n      if (typeof o == \"number\")\n        throw new TypeError(\"Argument must not be a number\");\n      return r(o, a, l);\n    }, i.alloc = function(o, a, l) {\n      if (typeof o != \"number\")\n        throw new TypeError(\"Argument must be a number\");\n      var c = r(o);\n      return a !== void 0 ? typeof l == \"string\" ? c.fill(a, l) : c.fill(a) : c.fill(0), c;\n    }, i.allocUnsafe = function(o) {\n      if (typeof o != \"number\")\n        throw new TypeError(\"Argument must be a number\");\n      return r(o);\n    }, i.allocUnsafeSlow = function(o) {\n      if (typeof o != \"number\")\n        throw new TypeError(\"Argument must be a number\");\n      return t.SlowBuffer(o);\n    };\n  })(Ui, Ui.exports)), Ui.exports;\n}\nvar za, wd;\nfunction E0() {\n  if (wd) return za;\n  wd = 1;\n  var s = By().Buffer;\n  function e(t) {\n    if (t.length >= 255)\n      throw new TypeError(\"Alphabet too long\");\n    for (var r = new Uint8Array(256), n = 0; n < r.length; n++)\n      r[n] = 255;\n    for (var i = 0; i < t.length; i++) {\n      var o = t.charAt(i), a = o.charCodeAt(0);\n      if (r[a] !== 255)\n        throw new TypeError(o + \" is ambiguous\");\n      r[a] = i;\n    }\n    var l = t.length, c = t.charAt(0), u = Math.log(l) / Math.log(256), d = Math.log(256) / Math.log(l);\n    function h(y) {\n      if ((Array.isArray(y) || y instanceof Uint8Array) && (y = s.from(y)), !s.isBuffer(y))\n        throw new TypeError(\"Expected Buffer\");\n      if (y.length === 0)\n        return \"\";\n      for (var E = 0, b = 0, R = 0, A = y.length; R !== A && y[R] === 0; )\n        R++, E++;\n      for (var F = (A - R) * d + 1 >>> 0, M = new Uint8Array(F); R !== A; ) {\n        for (var H = y[R], K = 0, j = F - 1; (H !== 0 || K < b) && j !== -1; j--, K++)\n          H += 256 * M[j] >>> 0, M[j] = H % l >>> 0, H = H / l >>> 0;\n        if (H !== 0)\n          throw new Error(\"Non-zero carry\");\n        b = K, R++;\n      }\n      for (var C = F - b; C !== F && M[C] === 0; )\n        C++;\n      for (var k = c.repeat(E); C < F; ++C)\n        k += t.charAt(M[C]);\n      return k;\n    }\n    function f(y) {\n      if (typeof y != \"string\")\n        throw new TypeError(\"Expected String\");\n      if (y.length === 0)\n        return s.alloc(0);\n      for (var E = 0, b = 0, R = 0; y[E] === c; )\n        b++, E++;\n      for (var A = (y.length - E) * u + 1 >>> 0, F = new Uint8Array(A); E < y.length; ) {\n        var M = y.charCodeAt(E);\n        if (M > 255)\n          return;\n        var H = r[M];\n        if (H === 255)\n          return;\n        for (var K = 0, j = A - 1; (H !== 0 || K < R) && j !== -1; j--, K++)\n          H += l * F[j] >>> 0, F[j] = H % 256 >>> 0, H = H / 256 >>> 0;\n        if (H !== 0)\n          throw new Error(\"Non-zero carry\");\n        R = K, E++;\n      }\n      for (var C = A - R; C !== A && F[C] === 0; )\n        C++;\n      var k = s.allocUnsafe(b + (A - C));\n      k.fill(0, 0, b);\n      for (var $ = b; C !== A; )\n        k[$++] = F[C++];\n      return k;\n    }\n    function p(y) {\n      var E = f(y);\n      if (E)\n        return E;\n      throw new Error(\"Non-base\" + l + \" character\");\n    }\n    return {\n      encode: h,\n      decodeUnsafe: f,\n      decode: p\n    };\n  }\n  return za = e, za;\n}\nvar Ya, Ad;\nfunction Fy() {\n  if (Ad) return Ya;\n  Ad = 1;\n  var s = E0(), e = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n  return Ya = s(e), Ya;\n}\nvar Ny = Fy();\nconst ar = /* @__PURE__ */ Fc(Ny), Id = Xf;\nvar et = {}, Za, _d;\nfunction Uy() {\n  if (_d) return Za;\n  _d = 1;\n  var s = E0(), e = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\";\n  return Za = s(e), Za;\n}\nfunction us(s, e, t) {\n  return e <= s && s <= t;\n}\nfunction ca(s) {\n  if (s === void 0) return {};\n  if (s === Object(s)) return s;\n  throw TypeError(\"Could not convert argument to dictionary\");\n}\nfunction $y(s) {\n  for (var e = String(s), t = e.length, r = 0, n = []; r < t; ) {\n    var i = e.charCodeAt(r);\n    if (i < 55296 || i > 57343)\n      n.push(i);\n    else if (56320 <= i && i <= 57343)\n      n.push(65533);\n    else if (55296 <= i && i <= 56319)\n      if (r === t - 1)\n        n.push(65533);\n      else {\n        var o = s.charCodeAt(r + 1);\n        if (56320 <= o && o <= 57343) {\n          var a = i & 1023, l = o & 1023;\n          n.push(65536 + (a << 10) + l), r += 1;\n        } else\n          n.push(65533);\n      }\n    r += 1;\n  }\n  return n;\n}\nfunction Gy(s) {\n  for (var e = \"\", t = 0; t < s.length; ++t) {\n    var r = s[t];\n    r <= 65535 ? e += String.fromCharCode(r) : (r -= 65536, e += String.fromCharCode(\n      (r >> 10) + 55296,\n      (r & 1023) + 56320\n    ));\n  }\n  return e;\n}\nvar Bo = -1;\nfunction Xc(s) {\n  this.tokens = [].slice.call(s);\n}\nXc.prototype = {\n  /**\n   * @return {boolean} True if end-of-stream has been hit.\n   */\n  endOfStream: function() {\n    return !this.tokens.length;\n  },\n  /**\n   * When a token is read from a stream, the first token in the\n   * stream must be returned and subsequently removed, and\n   * end-of-stream must be returned otherwise.\n   *\n   * @return {number} Get the next token from the stream, or\n   * end_of_stream.\n   */\n  read: function() {\n    return this.tokens.length ? this.tokens.shift() : Bo;\n  },\n  /**\n   * When one or more tokens are prepended to a stream, those tokens\n   * must be inserted, in given order, before the first token in the\n   * stream.\n   *\n   * @param {(number|!Array.<number>)} token The token(s) to prepend to the stream.\n   */\n  prepend: function(s) {\n    if (Array.isArray(s))\n      for (var e = (\n        /**@type {!Array.<number>}*/\n        s\n      ); e.length; )\n        this.tokens.unshift(e.pop());\n    else\n      this.tokens.unshift(s);\n  },\n  /**\n   * When one or more tokens are pushed to a stream, those tokens\n   * must be inserted, in given order, after the last token in the\n   * stream.\n   *\n   * @param {(number|!Array.<number>)} token The tokens(s) to prepend to the stream.\n   */\n  push: function(s) {\n    if (Array.isArray(s))\n      for (var e = (\n        /**@type {!Array.<number>}*/\n        s\n      ); e.length; )\n        this.tokens.push(e.shift());\n    else\n      this.tokens.push(s);\n  }\n};\nvar Pn = -1;\nfunction Xa(s, e) {\n  if (s)\n    throw TypeError(\"Decoder error\");\n  return e || 65533;\n}\nvar Fo = \"utf-8\";\nfunction No(s, e) {\n  if (!(this instanceof No))\n    return new No(s, e);\n  if (s = s !== void 0 ? String(s).toLowerCase() : Fo, s !== Fo)\n    throw new Error(\"Encoding not supported. Only utf-8 is supported\");\n  e = ca(e), this._streaming = !1, this._BOMseen = !1, this._decoder = null, this._fatal = !!e.fatal, this._ignoreBOM = !!e.ignoreBOM, Object.defineProperty(this, \"encoding\", { value: \"utf-8\" }), Object.defineProperty(this, \"fatal\", { value: this._fatal }), Object.defineProperty(this, \"ignoreBOM\", { value: this._ignoreBOM });\n}\nNo.prototype = {\n  /**\n   * @param {ArrayBufferView=} input The buffer of bytes to decode.\n   * @param {Object=} options\n   * @return {string} The decoded string.\n   */\n  decode: function(e, t) {\n    var r;\n    typeof e == \"object\" && e instanceof ArrayBuffer ? r = new Uint8Array(e) : typeof e == \"object\" && \"buffer\" in e && e.buffer instanceof ArrayBuffer ? r = new Uint8Array(\n      e.buffer,\n      e.byteOffset,\n      e.byteLength\n    ) : r = new Uint8Array(0), t = ca(t), this._streaming || (this._decoder = new Vy({ fatal: this._fatal }), this._BOMseen = !1), this._streaming = !!t.stream;\n    for (var n = new Xc(r), i = [], o; !n.endOfStream() && (o = this._decoder.handler(n, n.read()), o !== Pn); )\n      o !== null && (Array.isArray(o) ? i.push.apply(\n        i,\n        /**@type {!Array.<number>}*/\n        o\n      ) : i.push(o));\n    if (!this._streaming) {\n      do {\n        if (o = this._decoder.handler(n, n.read()), o === Pn)\n          break;\n        o !== null && (Array.isArray(o) ? i.push.apply(\n          i,\n          /**@type {!Array.<number>}*/\n          o\n        ) : i.push(o));\n      } while (!n.endOfStream());\n      this._decoder = null;\n    }\n    return i.length && [\"utf-8\"].indexOf(this.encoding) !== -1 && !this._ignoreBOM && !this._BOMseen && (i[0] === 65279 ? (this._BOMseen = !0, i.shift()) : this._BOMseen = !0), Gy(i);\n  }\n};\nfunction Uo(s, e) {\n  if (!(this instanceof Uo))\n    return new Uo(s, e);\n  if (s = s !== void 0 ? String(s).toLowerCase() : Fo, s !== Fo)\n    throw new Error(\"Encoding not supported. Only utf-8 is supported\");\n  e = ca(e), this._streaming = !1, this._encoder = null, this._options = { fatal: !!e.fatal }, Object.defineProperty(this, \"encoding\", { value: \"utf-8\" });\n}\nUo.prototype = {\n  /**\n   * @param {string=} opt_string The string to encode.\n   * @param {Object=} options\n   * @return {Uint8Array} Encoded bytes, as a Uint8Array.\n   */\n  encode: function(e, t) {\n    e = e ? String(e) : \"\", t = ca(t), this._streaming || (this._encoder = new jy(this._options)), this._streaming = !!t.stream;\n    for (var r = [], n = new Xc($y(e)), i; !n.endOfStream() && (i = this._encoder.handler(n, n.read()), i !== Pn); )\n      Array.isArray(i) ? r.push.apply(\n        r,\n        /**@type {!Array.<number>}*/\n        i\n      ) : r.push(i);\n    if (!this._streaming) {\n      for (; i = this._encoder.handler(n, n.read()), i !== Pn; )\n        Array.isArray(i) ? r.push.apply(\n          r,\n          /**@type {!Array.<number>}*/\n          i\n        ) : r.push(i);\n      this._encoder = null;\n    }\n    return new Uint8Array(r);\n  }\n};\nfunction Vy(s) {\n  var e = s.fatal, t = 0, r = 0, n = 0, i = 128, o = 191;\n  this.handler = function(a, l) {\n    if (l === Bo && n !== 0)\n      return n = 0, Xa(e);\n    if (l === Bo)\n      return Pn;\n    if (n === 0) {\n      if (us(l, 0, 127))\n        return l;\n      if (us(l, 194, 223))\n        n = 1, t = l - 192;\n      else if (us(l, 224, 239))\n        l === 224 && (i = 160), l === 237 && (o = 159), n = 2, t = l - 224;\n      else if (us(l, 240, 244))\n        l === 240 && (i = 144), l === 244 && (o = 143), n = 3, t = l - 240;\n      else\n        return Xa(e);\n      return t = t << 6 * n, null;\n    }\n    if (!us(l, i, o))\n      return t = n = r = 0, i = 128, o = 191, a.prepend(l), Xa(e);\n    if (i = 128, o = 191, r += 1, t += l - 128 << 6 * (n - r), r !== n)\n      return null;\n    var c = t;\n    return t = n = r = 0, c;\n  };\n}\nfunction jy(s) {\n  s.fatal, this.handler = function(e, t) {\n    if (t === Bo)\n      return Pn;\n    if (us(t, 0, 127))\n      return t;\n    var r, n;\n    us(t, 128, 2047) ? (r = 1, n = 192) : us(t, 2048, 65535) ? (r = 2, n = 224) : us(t, 65536, 1114111) && (r = 3, n = 240);\n    for (var i = [(t >> 6 * r) + n]; r > 0; ) {\n      var o = t >> 6 * (r - 1);\n      i.push(128 | o & 63), r -= 1;\n    }\n    return i;\n  };\n}\nconst Ky = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n  __proto__: null,\n  TextDecoder: No,\n  TextEncoder: Uo\n}, Symbol.toStringTag, { value: \"Module\" })), Hy = /* @__PURE__ */ Nc(Ky);\nvar Rd;\nfunction qy() {\n  if (Rd) return et;\n  Rd = 1;\n  var s = et && et.__createBinding || (Object.create ? (function(C, k, $, W) {\n    W === void 0 && (W = $), Object.defineProperty(C, W, { enumerable: !0, get: function() {\n      return k[$];\n    } });\n  }) : (function(C, k, $, W) {\n    W === void 0 && (W = $), C[W] = k[$];\n  })), e = et && et.__setModuleDefault || (Object.create ? (function(C, k) {\n    Object.defineProperty(C, \"default\", { enumerable: !0, value: k });\n  }) : function(C, k) {\n    C.default = k;\n  }), t = et && et.__decorate || function(C, k, $, W) {\n    var _ = arguments.length, g = _ < 3 ? k : W === null ? W = Object.getOwnPropertyDescriptor(k, $) : W, x;\n    if (typeof Reflect == \"object\" && typeof Reflect.decorate == \"function\") g = Reflect.decorate(C, k, $, W);\n    else for (var w = C.length - 1; w >= 0; w--) (x = C[w]) && (g = (_ < 3 ? x(g) : _ > 3 ? x(k, $, g) : x(k, $)) || g);\n    return _ > 3 && g && Object.defineProperty(k, $, g), g;\n  }, r = et && et.__importStar || function(C) {\n    if (C && C.__esModule) return C;\n    var k = {};\n    if (C != null) for (var $ in C) $ !== \"default\" && Object.hasOwnProperty.call(C, $) && s(k, C, $);\n    return e(k, C), k;\n  }, n = et && et.__importDefault || function(C) {\n    return C && C.__esModule ? C : { default: C };\n  };\n  Object.defineProperty(et, \"__esModule\", { value: !0 }), et.deserializeUnchecked = et.deserialize = et.serialize = et.BinaryReader = et.BinaryWriter = et.BorshError = et.baseDecode = et.baseEncode = void 0;\n  const i = n(v0()), o = n(Uy()), a = r(Hy), l = typeof TextDecoder != \"function\" ? a.TextDecoder : TextDecoder, c = new l(\"utf-8\", { fatal: !0 });\n  function u(C) {\n    return typeof C == \"string\" && (C = Buffer.from(C, \"utf8\")), o.default.encode(Buffer.from(C));\n  }\n  et.baseEncode = u;\n  function d(C) {\n    return Buffer.from(o.default.decode(C));\n  }\n  et.baseDecode = d;\n  const h = 1024;\n  class f extends Error {\n    constructor(k) {\n      super(k), this.fieldPath = [], this.originalMessage = k;\n    }\n    addToFieldPath(k) {\n      this.fieldPath.splice(0, 0, k), this.message = this.originalMessage + \": \" + this.fieldPath.join(\".\");\n    }\n  }\n  et.BorshError = f;\n  class p {\n    constructor() {\n      this.buf = Buffer.alloc(h), this.length = 0;\n    }\n    maybeResize() {\n      this.buf.length < 16 + this.length && (this.buf = Buffer.concat([this.buf, Buffer.alloc(h)]));\n    }\n    writeU8(k) {\n      this.maybeResize(), this.buf.writeUInt8(k, this.length), this.length += 1;\n    }\n    writeU16(k) {\n      this.maybeResize(), this.buf.writeUInt16LE(k, this.length), this.length += 2;\n    }\n    writeU32(k) {\n      this.maybeResize(), this.buf.writeUInt32LE(k, this.length), this.length += 4;\n    }\n    writeU64(k) {\n      this.maybeResize(), this.writeBuffer(Buffer.from(new i.default(k).toArray(\"le\", 8)));\n    }\n    writeU128(k) {\n      this.maybeResize(), this.writeBuffer(Buffer.from(new i.default(k).toArray(\"le\", 16)));\n    }\n    writeU256(k) {\n      this.maybeResize(), this.writeBuffer(Buffer.from(new i.default(k).toArray(\"le\", 32)));\n    }\n    writeU512(k) {\n      this.maybeResize(), this.writeBuffer(Buffer.from(new i.default(k).toArray(\"le\", 64)));\n    }\n    writeBuffer(k) {\n      this.buf = Buffer.concat([\n        Buffer.from(this.buf.subarray(0, this.length)),\n        k,\n        Buffer.alloc(h)\n      ]), this.length += k.length;\n    }\n    writeString(k) {\n      this.maybeResize();\n      const $ = Buffer.from(k, \"utf8\");\n      this.writeU32($.length), this.writeBuffer($);\n    }\n    writeFixedArray(k) {\n      this.writeBuffer(Buffer.from(k));\n    }\n    writeArray(k, $) {\n      this.maybeResize(), this.writeU32(k.length);\n      for (const W of k)\n        this.maybeResize(), $(W);\n    }\n    toArray() {\n      return this.buf.subarray(0, this.length);\n    }\n  }\n  et.BinaryWriter = p;\n  function y(C, k, $) {\n    const W = $.value;\n    $.value = function(..._) {\n      try {\n        return W.apply(this, _);\n      } catch (g) {\n        if (g instanceof RangeError) {\n          const x = g.code;\n          if ([\"ERR_BUFFER_OUT_OF_BOUNDS\", \"ERR_OUT_OF_RANGE\"].indexOf(x) >= 0)\n            throw new f(\"Reached the end of buffer when deserializing\");\n        }\n        throw g;\n      }\n    };\n  }\n  class E {\n    constructor(k) {\n      this.buf = k, this.offset = 0;\n    }\n    readU8() {\n      const k = this.buf.readUInt8(this.offset);\n      return this.offset += 1, k;\n    }\n    readU16() {\n      const k = this.buf.readUInt16LE(this.offset);\n      return this.offset += 2, k;\n    }\n    readU32() {\n      const k = this.buf.readUInt32LE(this.offset);\n      return this.offset += 4, k;\n    }\n    readU64() {\n      const k = this.readBuffer(8);\n      return new i.default(k, \"le\");\n    }\n    readU128() {\n      const k = this.readBuffer(16);\n      return new i.default(k, \"le\");\n    }\n    readU256() {\n      const k = this.readBuffer(32);\n      return new i.default(k, \"le\");\n    }\n    readU512() {\n      const k = this.readBuffer(64);\n      return new i.default(k, \"le\");\n    }\n    readBuffer(k) {\n      if (this.offset + k > this.buf.length)\n        throw new f(`Expected buffer length ${k} isn't within bounds`);\n      const $ = this.buf.slice(this.offset, this.offset + k);\n      return this.offset += k, $;\n    }\n    readString() {\n      const k = this.readU32(), $ = this.readBuffer(k);\n      try {\n        return c.decode($);\n      } catch (W) {\n        throw new f(`Error decoding UTF-8 string: ${W}`);\n      }\n    }\n    readFixedArray(k) {\n      return new Uint8Array(this.readBuffer(k));\n    }\n    readArray(k) {\n      const $ = this.readU32(), W = Array();\n      for (let _ = 0; _ < $; ++_)\n        W.push(k());\n      return W;\n    }\n  }\n  t([\n    y\n  ], E.prototype, \"readU8\", null), t([\n    y\n  ], E.prototype, \"readU16\", null), t([\n    y\n  ], E.prototype, \"readU32\", null), t([\n    y\n  ], E.prototype, \"readU64\", null), t([\n    y\n  ], E.prototype, \"readU128\", null), t([\n    y\n  ], E.prototype, \"readU256\", null), t([\n    y\n  ], E.prototype, \"readU512\", null), t([\n    y\n  ], E.prototype, \"readString\", null), t([\n    y\n  ], E.prototype, \"readFixedArray\", null), t([\n    y\n  ], E.prototype, \"readArray\", null), et.BinaryReader = E;\n  function b(C) {\n    return C.charAt(0).toUpperCase() + C.slice(1);\n  }\n  function R(C, k, $, W, _) {\n    try {\n      if (typeof W == \"string\")\n        _[`write${b(W)}`]($);\n      else if (W instanceof Array)\n        if (typeof W[0] == \"number\") {\n          if ($.length !== W[0])\n            throw new f(`Expecting byte array of length ${W[0]}, but got ${$.length} bytes`);\n          _.writeFixedArray($);\n        } else if (W.length === 2 && typeof W[1] == \"number\") {\n          if ($.length !== W[1])\n            throw new f(`Expecting byte array of length ${W[1]}, but got ${$.length} bytes`);\n          for (let g = 0; g < W[1]; g++)\n            R(C, null, $[g], W[0], _);\n        } else\n          _.writeArray($, (g) => {\n            R(C, k, g, W[0], _);\n          });\n      else if (W.kind !== void 0)\n        switch (W.kind) {\n          case \"option\": {\n            $ == null ? _.writeU8(0) : (_.writeU8(1), R(C, k, $, W.type, _));\n            break;\n          }\n          case \"map\": {\n            _.writeU32($.size), $.forEach((g, x) => {\n              R(C, k, x, W.key, _), R(C, k, g, W.value, _);\n            });\n            break;\n          }\n          default:\n            throw new f(`FieldType ${W} unrecognized`);\n        }\n      else\n        A(C, $, _);\n    } catch (g) {\n      throw g instanceof f && g.addToFieldPath(k), g;\n    }\n  }\n  function A(C, k, $) {\n    if (typeof k.borshSerialize == \"function\") {\n      k.borshSerialize($);\n      return;\n    }\n    const W = C.get(k.constructor);\n    if (!W)\n      throw new f(`Class ${k.constructor.name} is missing in schema`);\n    if (W.kind === \"struct\")\n      W.fields.map(([_, g]) => {\n        R(C, _, k[_], g, $);\n      });\n    else if (W.kind === \"enum\") {\n      const _ = k[W.field];\n      for (let g = 0; g < W.values.length; ++g) {\n        const [x, w] = W.values[g];\n        if (x === _) {\n          $.writeU8(g), R(C, x, k[x], w, $);\n          break;\n        }\n      }\n    } else\n      throw new f(`Unexpected schema kind: ${W.kind} for ${k.constructor.name}`);\n  }\n  function F(C, k, $ = p) {\n    const W = new $();\n    return A(C, k, W), W.toArray();\n  }\n  et.serialize = F;\n  function M(C, k, $, W) {\n    try {\n      if (typeof $ == \"string\")\n        return W[`read${b($)}`]();\n      if ($ instanceof Array) {\n        if (typeof $[0] == \"number\")\n          return W.readFixedArray($[0]);\n        if (typeof $[1] == \"number\") {\n          const _ = [];\n          for (let g = 0; g < $[1]; g++)\n            _.push(M(C, null, $[0], W));\n          return _;\n        } else\n          return W.readArray(() => M(C, k, $[0], W));\n      }\n      if ($.kind === \"option\")\n        return W.readU8() ? M(C, k, $.type, W) : void 0;\n      if ($.kind === \"map\") {\n        let _ = /* @__PURE__ */ new Map();\n        const g = W.readU32();\n        for (let x = 0; x < g; x++) {\n          const w = M(C, k, $.key, W), D = M(C, k, $.value, W);\n          _.set(w, D);\n        }\n        return _;\n      }\n      return H(C, $, W);\n    } catch (_) {\n      throw _ instanceof f && _.addToFieldPath(k), _;\n    }\n  }\n  function H(C, k, $) {\n    if (typeof k.borshDeserialize == \"function\")\n      return k.borshDeserialize($);\n    const W = C.get(k);\n    if (!W)\n      throw new f(`Class ${k.name} is missing in schema`);\n    if (W.kind === \"struct\") {\n      const _ = {};\n      for (const [g, x] of C.get(k).fields)\n        _[g] = M(C, g, x, $);\n      return new k(_);\n    }\n    if (W.kind === \"enum\") {\n      const _ = $.readU8();\n      if (_ >= W.values.length)\n        throw new f(`Enum index: ${_} is out of range`);\n      const [g, x] = W.values[_], w = M(C, g, x, $);\n      return new k({ [g]: w });\n    }\n    throw new f(`Unexpected schema kind: ${W.kind} for ${k.constructor.name}`);\n  }\n  function K(C, k, $, W = E) {\n    const _ = new W($), g = H(C, k, _);\n    if (_.offset < $.length)\n      throw new f(`Unexpected ${$.length - _.offset} bytes after deserialized data`);\n    return g;\n  }\n  et.deserialize = K;\n  function j(C, k, $, W = E) {\n    const _ = new W($);\n    return H(C, k, _);\n  }\n  return et.deserializeUnchecked = j, et;\n}\nvar Ja = qy(), re = {}, Ld;\nfunction Wy() {\n  if (Ld) return re;\n  Ld = 1, Object.defineProperty(re, \"__esModule\", { value: !0 }), re.s16 = re.s8 = re.nu64be = re.u48be = re.u40be = re.u32be = re.u24be = re.u16be = re.nu64 = re.u48 = re.u40 = re.u32 = re.u24 = re.u16 = re.u8 = re.offset = re.greedy = re.Constant = re.UTF8 = re.CString = re.Blob = re.Boolean = re.BitField = re.BitStructure = re.VariantLayout = re.Union = re.UnionLayoutDiscriminator = re.UnionDiscriminator = re.Structure = re.Sequence = re.DoubleBE = re.Double = re.FloatBE = re.Float = re.NearInt64BE = re.NearInt64 = re.NearUInt64BE = re.NearUInt64 = re.IntBE = re.Int = re.UIntBE = re.UInt = re.OffsetLayout = re.GreedyCount = re.ExternalLayout = re.bindConstructorLayout = re.nameWithProperty = re.Layout = re.uint8ArrayToBuffer = re.checkUint8Array = void 0, re.constant = re.utf8 = re.cstr = re.blob = re.unionLayoutDiscriminator = re.union = re.seq = re.bits = re.struct = re.f64be = re.f64 = re.f32be = re.f32 = re.ns64be = re.s48be = re.s40be = re.s32be = re.s24be = re.s16be = re.ns64 = re.s48 = re.s40 = re.s32 = re.s24 = void 0;\n  const s = Kc();\n  function e(m) {\n    if (!(m instanceof Uint8Array))\n      throw new TypeError(\"b must be a Uint8Array\");\n  }\n  re.checkUint8Array = e;\n  function t(m) {\n    return e(m), s.Buffer.from(m.buffer, m.byteOffset, m.length);\n  }\n  re.uint8ArrayToBuffer = t;\n  let r = class {\n    constructor(v, P) {\n      if (!Number.isInteger(v))\n        throw new TypeError(\"span must be an integer\");\n      this.span = v, this.property = P;\n    }\n    /** Function to create an Object into which decoded properties will\n     * be written.\n     *\n     * Used only for layouts that {@link Layout#decode|decode} to Object\n     * instances, which means:\n     * * {@link Structure}\n     * * {@link Union}\n     * * {@link VariantLayout}\n     * * {@link BitStructure}\n     *\n     * If left undefined the JavaScript representation of these layouts\n     * will be Object instances.\n     *\n     * See {@link bindConstructorLayout}.\n     */\n    makeDestinationObject() {\n      return {};\n    }\n    /**\n     * Calculate the span of a specific instance of a layout.\n     *\n     * @param {Uint8Array} b - the buffer that contains an encoded instance.\n     *\n     * @param {Number} [offset] - the offset at which the encoded instance\n     * starts.  If absent a zero offset is inferred.\n     *\n     * @return {Number} - the number of bytes covered by the layout\n     * instance.  If this method is not overridden in a subclass the\n     * definition-time constant {@link Layout#span|span} will be\n     * returned.\n     *\n     * @throws {RangeError} - if the length of the value cannot be\n     * determined.\n     */\n    getSpan(v, P) {\n      if (0 > this.span)\n        throw new RangeError(\"indeterminate span\");\n      return this.span;\n    }\n    /**\n     * Replicate the layout using a new property.\n     *\n     * This function must be used to get a structurally-equivalent layout\n     * with a different name since all {@link Layout} instances are\n     * immutable.\n     *\n     * **NOTE** This is a shallow copy.  All fields except {@link\n     * Layout#property|property} are strictly equal to the origin layout.\n     *\n     * @param {String} property - the value for {@link\n     * Layout#property|property} in the replica.\n     *\n     * @returns {Layout} - the copy with {@link Layout#property|property}\n     * set to `property`.\n     */\n    replicate(v) {\n      const P = Object.create(this.constructor.prototype);\n      return Object.assign(P, this), P.property = v, P;\n    }\n    /**\n     * Create an object from layout properties and an array of values.\n     *\n     * **NOTE** This function returns `undefined` if invoked on a layout\n     * that does not return its value as an Object.  Objects are\n     * returned for things that are a {@link Structure}, which includes\n     * {@link VariantLayout|variant layouts} if they are structures, and\n     * excludes {@link Union}s.  If you want this feature for a union\n     * you must use {@link Union.getVariant|getVariant} to select the\n     * desired layout.\n     *\n     * @param {Array} values - an array of values that correspond to the\n     * default order for properties.  As with {@link Layout#decode|decode}\n     * layout elements that have no property name are skipped when\n     * iterating over the array values.  Only the top-level properties are\n     * assigned; arguments are not assigned to properties of contained\n     * layouts.  Any unused values are ignored.\n     *\n     * @return {(Object|undefined)}\n     */\n    fromArray(v) {\n    }\n  };\n  re.Layout = r;\n  function n(m, v) {\n    return v.property ? m + \"[\" + v.property + \"]\" : m;\n  }\n  re.nameWithProperty = n;\n  function i(m, v) {\n    if (typeof m != \"function\")\n      throw new TypeError(\"Class must be constructor\");\n    if (Object.prototype.hasOwnProperty.call(m, \"layout_\"))\n      throw new Error(\"Class is already bound to a layout\");\n    if (!(v && v instanceof r))\n      throw new TypeError(\"layout must be a Layout\");\n    if (Object.prototype.hasOwnProperty.call(v, \"boundConstructor_\"))\n      throw new Error(\"layout is already bound to a constructor\");\n    m.layout_ = v, v.boundConstructor_ = m, v.makeDestinationObject = (() => new m()), Object.defineProperty(m.prototype, \"encode\", {\n      value(P, N) {\n        return v.encode(this, P, N);\n      },\n      writable: !0\n    }), Object.defineProperty(m, \"decode\", {\n      value(P, N) {\n        return v.decode(P, N);\n      },\n      writable: !0\n    });\n  }\n  re.bindConstructorLayout = i;\n  class o extends r {\n    /**\n     * Return `true` iff the external layout decodes to an unsigned\n     * integer layout.\n     *\n     * In that case it can be used as the source of {@link\n     * Sequence#count|Sequence counts}, {@link Blob#length|Blob lengths},\n     * or as {@link UnionLayoutDiscriminator#layout|external union\n     * discriminators}.\n     *\n     * @abstract\n     */\n    isCount() {\n      throw new Error(\"ExternalLayout is abstract\");\n    }\n  }\n  re.ExternalLayout = o;\n  class a extends o {\n    constructor(v = 1, P) {\n      if (!Number.isInteger(v) || 0 >= v)\n        throw new TypeError(\"elementSpan must be a (positive) integer\");\n      super(-1, P), this.elementSpan = v;\n    }\n    /** @override */\n    isCount() {\n      return !0;\n    }\n    /** @override */\n    decode(v, P = 0) {\n      e(v);\n      const N = v.length - P;\n      return Math.floor(N / this.elementSpan);\n    }\n    /** @override */\n    encode(v, P, N) {\n      return 0;\n    }\n  }\n  re.GreedyCount = a;\n  class l extends o {\n    constructor(v, P = 0, N) {\n      if (!(v instanceof r))\n        throw new TypeError(\"layout must be a Layout\");\n      if (!Number.isInteger(P))\n        throw new TypeError(\"offset must be integer or undefined\");\n      super(v.span, N || v.property), this.layout = v, this.offset = P;\n    }\n    /** @override */\n    isCount() {\n      return this.layout instanceof c || this.layout instanceof u;\n    }\n    /** @override */\n    decode(v, P = 0) {\n      return this.layout.decode(v, P + this.offset);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      return this.layout.encode(v, P, N + this.offset);\n    }\n  }\n  re.OffsetLayout = l;\n  class c extends r {\n    constructor(v, P) {\n      if (super(v, P), 6 < this.span)\n        throw new RangeError(\"span must not exceed 6 bytes\");\n    }\n    /** @override */\n    decode(v, P = 0) {\n      return t(v).readUIntLE(P, this.span);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      return t(P).writeUIntLE(v, N, this.span), this.span;\n    }\n  }\n  re.UInt = c;\n  class u extends r {\n    constructor(v, P) {\n      if (super(v, P), 6 < this.span)\n        throw new RangeError(\"span must not exceed 6 bytes\");\n    }\n    /** @override */\n    decode(v, P = 0) {\n      return t(v).readUIntBE(P, this.span);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      return t(P).writeUIntBE(v, N, this.span), this.span;\n    }\n  }\n  re.UIntBE = u;\n  class d extends r {\n    constructor(v, P) {\n      if (super(v, P), 6 < this.span)\n        throw new RangeError(\"span must not exceed 6 bytes\");\n    }\n    /** @override */\n    decode(v, P = 0) {\n      return t(v).readIntLE(P, this.span);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      return t(P).writeIntLE(v, N, this.span), this.span;\n    }\n  }\n  re.Int = d;\n  class h extends r {\n    constructor(v, P) {\n      if (super(v, P), 6 < this.span)\n        throw new RangeError(\"span must not exceed 6 bytes\");\n    }\n    /** @override */\n    decode(v, P = 0) {\n      return t(v).readIntBE(P, this.span);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      return t(P).writeIntBE(v, N, this.span), this.span;\n    }\n  }\n  re.IntBE = h;\n  const f = Math.pow(2, 32);\n  function p(m) {\n    const v = Math.floor(m / f), P = m - v * f;\n    return { hi32: v, lo32: P };\n  }\n  function y(m, v) {\n    return m * f + v;\n  }\n  class E extends r {\n    constructor(v) {\n      super(8, v);\n    }\n    /** @override */\n    decode(v, P = 0) {\n      const N = t(v), Y = N.readUInt32LE(P), ee = N.readUInt32LE(P + 4);\n      return y(ee, Y);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      const Y = p(v), ee = t(P);\n      return ee.writeUInt32LE(Y.lo32, N), ee.writeUInt32LE(Y.hi32, N + 4), 8;\n    }\n  }\n  re.NearUInt64 = E;\n  class b extends r {\n    constructor(v) {\n      super(8, v);\n    }\n    /** @override */\n    decode(v, P = 0) {\n      const N = t(v), Y = N.readUInt32BE(P), ee = N.readUInt32BE(P + 4);\n      return y(Y, ee);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      const Y = p(v), ee = t(P);\n      return ee.writeUInt32BE(Y.hi32, N), ee.writeUInt32BE(Y.lo32, N + 4), 8;\n    }\n  }\n  re.NearUInt64BE = b;\n  class R extends r {\n    constructor(v) {\n      super(8, v);\n    }\n    /** @override */\n    decode(v, P = 0) {\n      const N = t(v), Y = N.readUInt32LE(P), ee = N.readInt32LE(P + 4);\n      return y(ee, Y);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      const Y = p(v), ee = t(P);\n      return ee.writeUInt32LE(Y.lo32, N), ee.writeInt32LE(Y.hi32, N + 4), 8;\n    }\n  }\n  re.NearInt64 = R;\n  class A extends r {\n    constructor(v) {\n      super(8, v);\n    }\n    /** @override */\n    decode(v, P = 0) {\n      const N = t(v), Y = N.readInt32BE(P), ee = N.readUInt32BE(P + 4);\n      return y(Y, ee);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      const Y = p(v), ee = t(P);\n      return ee.writeInt32BE(Y.hi32, N), ee.writeUInt32BE(Y.lo32, N + 4), 8;\n    }\n  }\n  re.NearInt64BE = A;\n  class F extends r {\n    constructor(v) {\n      super(4, v);\n    }\n    /** @override */\n    decode(v, P = 0) {\n      return t(v).readFloatLE(P);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      return t(P).writeFloatLE(v, N), 4;\n    }\n  }\n  re.Float = F;\n  class M extends r {\n    constructor(v) {\n      super(4, v);\n    }\n    /** @override */\n    decode(v, P = 0) {\n      return t(v).readFloatBE(P);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      return t(P).writeFloatBE(v, N), 4;\n    }\n  }\n  re.FloatBE = M;\n  class H extends r {\n    constructor(v) {\n      super(8, v);\n    }\n    /** @override */\n    decode(v, P = 0) {\n      return t(v).readDoubleLE(P);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      return t(P).writeDoubleLE(v, N), 8;\n    }\n  }\n  re.Double = H;\n  class K extends r {\n    constructor(v) {\n      super(8, v);\n    }\n    /** @override */\n    decode(v, P = 0) {\n      return t(v).readDoubleBE(P);\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      return t(P).writeDoubleBE(v, N), 8;\n    }\n  }\n  re.DoubleBE = K;\n  class j extends r {\n    constructor(v, P, N) {\n      if (!(v instanceof r))\n        throw new TypeError(\"elementLayout must be a Layout\");\n      if (!(P instanceof o && P.isCount() || Number.isInteger(P) && 0 <= P))\n        throw new TypeError(\"count must be non-negative integer or an unsigned integer ExternalLayout\");\n      let Y = -1;\n      !(P instanceof o) && 0 < v.span && (Y = P * v.span), super(Y, N), this.elementLayout = v, this.count = P;\n    }\n    /** @override */\n    getSpan(v, P = 0) {\n      if (0 <= this.span)\n        return this.span;\n      let N = 0, Y = this.count;\n      if (Y instanceof o && (Y = Y.decode(v, P)), 0 < this.elementLayout.span)\n        N = Y * this.elementLayout.span;\n      else {\n        let ee = 0;\n        for (; ee < Y; )\n          N += this.elementLayout.getSpan(v, P + N), ++ee;\n      }\n      return N;\n    }\n    /** @override */\n    decode(v, P = 0) {\n      const N = [];\n      let Y = 0, ee = this.count;\n      for (ee instanceof o && (ee = ee.decode(v, P)); Y < ee; )\n        N.push(this.elementLayout.decode(v, P)), P += this.elementLayout.getSpan(v, P), Y += 1;\n      return N;\n    }\n    /** Implement {@link Layout#encode|encode} for {@link Sequence}.\n     *\n     * **NOTE** If `src` is shorter than {@link Sequence#count|count} then\n     * the unused space in the buffer is left unchanged.  If `src` is\n     * longer than {@link Sequence#count|count} the unneeded elements are\n     * ignored.\n     *\n     * **NOTE** If {@link Layout#count|count} is an instance of {@link\n     * ExternalLayout} then the length of `src` will be encoded as the\n     * count after `src` is encoded. */\n    encode(v, P, N = 0) {\n      const Y = this.elementLayout, ee = v.reduce((ie, le) => ie + Y.encode(le, P, N + ie), 0);\n      return this.count instanceof o && this.count.encode(v.length, P, N), ee;\n    }\n  }\n  re.Sequence = j;\n  class C extends r {\n    constructor(v, P, N) {\n      if (!(Array.isArray(v) && v.reduce((ee, ie) => ee && ie instanceof r, !0)))\n        throw new TypeError(\"fields must be array of Layout instances\");\n      typeof P == \"boolean\" && N === void 0 && (N = P, P = void 0);\n      for (const ee of v)\n        if (0 > ee.span && ee.property === void 0)\n          throw new Error(\"fields cannot contain unnamed variable-length layout\");\n      let Y = -1;\n      try {\n        Y = v.reduce((ee, ie) => ee + ie.getSpan(), 0);\n      } catch {\n      }\n      super(Y, P), this.fields = v, this.decodePrefixes = !!N;\n    }\n    /** @override */\n    getSpan(v, P = 0) {\n      if (0 <= this.span)\n        return this.span;\n      let N = 0;\n      try {\n        N = this.fields.reduce((Y, ee) => {\n          const ie = ee.getSpan(v, P);\n          return P += ie, Y + ie;\n        }, 0);\n      } catch {\n        throw new RangeError(\"indeterminate span\");\n      }\n      return N;\n    }\n    /** @override */\n    decode(v, P = 0) {\n      e(v);\n      const N = this.makeDestinationObject();\n      for (const Y of this.fields)\n        if (Y.property !== void 0 && (N[Y.property] = Y.decode(v, P)), P += Y.getSpan(v, P), this.decodePrefixes && v.length === P)\n          break;\n      return N;\n    }\n    /** Implement {@link Layout#encode|encode} for {@link Structure}.\n     *\n     * If `src` is missing a property for a member with a defined {@link\n     * Layout#property|property} the corresponding region of the buffer is\n     * left unmodified. */\n    encode(v, P, N = 0) {\n      const Y = N;\n      let ee = 0, ie = 0;\n      for (const le of this.fields) {\n        let Te = le.span;\n        if (ie = 0 < Te ? Te : 0, le.property !== void 0) {\n          const De = v[le.property];\n          De !== void 0 && (ie = le.encode(De, P, N), 0 > Te && (Te = le.getSpan(P, N)));\n        }\n        ee = N, N += Te;\n      }\n      return ee + ie - Y;\n    }\n    /** @override */\n    fromArray(v) {\n      const P = this.makeDestinationObject();\n      for (const N of this.fields)\n        N.property !== void 0 && 0 < v.length && (P[N.property] = v.shift());\n      return P;\n    }\n    /**\n     * Get access to the layout of a given property.\n     *\n     * @param {String} property - the structure member of interest.\n     *\n     * @return {Layout} - the layout associated with `property`, or\n     * undefined if there is no such property.\n     */\n    layoutFor(v) {\n      if (typeof v != \"string\")\n        throw new TypeError(\"property must be string\");\n      for (const P of this.fields)\n        if (P.property === v)\n          return P;\n    }\n    /**\n     * Get the offset of a structure member.\n     *\n     * @param {String} property - the structure member of interest.\n     *\n     * @return {Number} - the offset in bytes to the start of `property`\n     * within the structure, or undefined if `property` is not a field\n     * within the structure.  If the property is a member but follows a\n     * variable-length structure member a negative number will be\n     * returned.\n     */\n    offsetOf(v) {\n      if (typeof v != \"string\")\n        throw new TypeError(\"property must be string\");\n      let P = 0;\n      for (const N of this.fields) {\n        if (N.property === v)\n          return P;\n        0 > N.span ? P = -1 : 0 <= P && (P += N.span);\n      }\n    }\n  }\n  re.Structure = C;\n  class k {\n    constructor(v) {\n      this.property = v;\n    }\n    /** Analog to {@link Layout#decode|Layout decode} for union discriminators.\n     *\n     * The implementation of this method need not reference the buffer if\n     * variant information is available through other means. */\n    decode(v, P) {\n      throw new Error(\"UnionDiscriminator is abstract\");\n    }\n    /** Analog to {@link Layout#decode|Layout encode} for union discriminators.\n     *\n     * The implementation of this method need not store the value if\n     * variant information is maintained through other means. */\n    encode(v, P, N) {\n      throw new Error(\"UnionDiscriminator is abstract\");\n    }\n  }\n  re.UnionDiscriminator = k;\n  class $ extends k {\n    constructor(v, P) {\n      if (!(v instanceof o && v.isCount()))\n        throw new TypeError(\"layout must be an unsigned integer ExternalLayout\");\n      super(P || v.property || \"variant\"), this.layout = v;\n    }\n    /** Delegate decoding to {@link UnionLayoutDiscriminator#layout|layout}. */\n    decode(v, P) {\n      return this.layout.decode(v, P);\n    }\n    /** Delegate encoding to {@link UnionLayoutDiscriminator#layout|layout}. */\n    encode(v, P, N) {\n      return this.layout.encode(v, P, N);\n    }\n  }\n  re.UnionLayoutDiscriminator = $;\n  class W extends r {\n    constructor(v, P, N) {\n      let Y;\n      if (v instanceof c || v instanceof u)\n        Y = new $(new l(v));\n      else if (v instanceof o && v.isCount())\n        Y = new $(v);\n      else if (v instanceof k)\n        Y = v;\n      else\n        throw new TypeError(\"discr must be a UnionDiscriminator or an unsigned integer layout\");\n      if (P === void 0 && (P = null), !(P === null || P instanceof r))\n        throw new TypeError(\"defaultLayout must be null or a Layout\");\n      if (P !== null) {\n        if (0 > P.span)\n          throw new Error(\"defaultLayout must have constant span\");\n        P.property === void 0 && (P = P.replicate(\"content\"));\n      }\n      let ee = -1;\n      P && (ee = P.span, 0 <= ee && (v instanceof c || v instanceof u) && (ee += Y.layout.span)), super(ee, N), this.discriminator = Y, this.usesPrefixDiscriminator = v instanceof c || v instanceof u, this.defaultLayout = P, this.registry = {};\n      let ie = this.defaultGetSourceVariant.bind(this);\n      this.getSourceVariant = function(le) {\n        return ie(le);\n      }, this.configGetSourceVariant = function(le) {\n        ie = le.bind(this);\n      };\n    }\n    /** @override */\n    getSpan(v, P = 0) {\n      if (0 <= this.span)\n        return this.span;\n      const N = this.getVariant(v, P);\n      if (!N)\n        throw new Error(\"unable to determine span for unrecognized variant\");\n      return N.getSpan(v, P);\n    }\n    /**\n     * Method to infer a registered Union variant compatible with `src`.\n     *\n     * The first satisfied rule in the following sequence defines the\n     * return value:\n     * * If `src` has properties matching the Union discriminator and\n     *   the default layout, `undefined` is returned regardless of the\n     *   value of the discriminator property (this ensures the default\n     *   layout will be used);\n     * * If `src` has a property matching the Union discriminator, the\n     *   value of the discriminator identifies a registered variant, and\n     *   either (a) the variant has no layout, or (b) `src` has the\n     *   variant's property, then the variant is returned (because the\n     *   source satisfies the constraints of the variant it identifies);\n     * * If `src` does not have a property matching the Union\n     *   discriminator, but does have a property matching a registered\n     *   variant, then the variant is returned (because the source\n     *   matches a variant without an explicit conflict);\n     * * An error is thrown (because we either can't identify a variant,\n     *   or we were explicitly told the variant but can't satisfy it).\n     *\n     * @param {Object} src - an object presumed to be compatible with\n     * the content of the Union.\n     *\n     * @return {(undefined|VariantLayout)} - as described above.\n     *\n     * @throws {Error} - if `src` cannot be associated with a default or\n     * registered variant.\n     */\n    defaultGetSourceVariant(v) {\n      if (Object.prototype.hasOwnProperty.call(v, this.discriminator.property)) {\n        if (this.defaultLayout && this.defaultLayout.property && Object.prototype.hasOwnProperty.call(v, this.defaultLayout.property))\n          return;\n        const P = this.registry[v[this.discriminator.property]];\n        if (P && (!P.layout || P.property && Object.prototype.hasOwnProperty.call(v, P.property)))\n          return P;\n      } else\n        for (const P in this.registry) {\n          const N = this.registry[P];\n          if (N.property && Object.prototype.hasOwnProperty.call(v, N.property))\n            return N;\n        }\n      throw new Error(\"unable to infer src variant\");\n    }\n    /** Implement {@link Layout#decode|decode} for {@link Union}.\n     *\n     * If the variant is {@link Union#addVariant|registered} the return\n     * value is an instance of that variant, with no explicit\n     * discriminator.  Otherwise the {@link Union#defaultLayout|default\n     * layout} is used to decode the content. */\n    decode(v, P = 0) {\n      let N;\n      const Y = this.discriminator, ee = Y.decode(v, P), ie = this.registry[ee];\n      if (ie === void 0) {\n        const le = this.defaultLayout;\n        let Te = 0;\n        this.usesPrefixDiscriminator && (Te = Y.layout.span), N = this.makeDestinationObject(), N[Y.property] = ee, N[le.property] = le.decode(v, P + Te);\n      } else\n        N = ie.decode(v, P);\n      return N;\n    }\n    /** Implement {@link Layout#encode|encode} for {@link Union}.\n     *\n     * This API assumes the `src` object is consistent with the union's\n     * {@link Union#defaultLayout|default layout}.  To encode variants\n     * use the appropriate variant-specific {@link VariantLayout#encode}\n     * method. */\n    encode(v, P, N = 0) {\n      const Y = this.getSourceVariant(v);\n      if (Y === void 0) {\n        const ee = this.discriminator, ie = this.defaultLayout;\n        let le = 0;\n        return this.usesPrefixDiscriminator && (le = ee.layout.span), ee.encode(v[ee.property], P, N), le + ie.encode(v[ie.property], P, N + le);\n      }\n      return Y.encode(v, P, N);\n    }\n    /** Register a new variant structure within a union.  The newly\n     * created variant is returned.\n     *\n     * @param {Number} variant - initializer for {@link\n     * VariantLayout#variant|variant}.\n     *\n     * @param {Layout} layout - initializer for {@link\n     * VariantLayout#layout|layout}.\n     *\n     * @param {String} property - initializer for {@link\n     * Layout#property|property}.\n     *\n     * @return {VariantLayout} */\n    addVariant(v, P, N) {\n      const Y = new _(this, v, P, N);\n      return this.registry[v] = Y, Y;\n    }\n    /**\n     * Get the layout associated with a registered variant.\n     *\n     * If `vb` does not produce a registered variant the function returns\n     * `undefined`.\n     *\n     * @param {(Number|Uint8Array)} vb - either the variant number, or a\n     * buffer from which the discriminator is to be read.\n     *\n     * @param {Number} offset - offset into `vb` for the start of the\n     * union.  Used only when `vb` is an instance of {Uint8Array}.\n     *\n     * @return {({VariantLayout}|undefined)}\n     */\n    getVariant(v, P = 0) {\n      let N;\n      return v instanceof Uint8Array ? N = this.discriminator.decode(v, P) : N = v, this.registry[N];\n    }\n  }\n  re.Union = W;\n  class _ extends r {\n    constructor(v, P, N, Y) {\n      if (!(v instanceof W))\n        throw new TypeError(\"union must be a Union\");\n      if (!Number.isInteger(P) || 0 > P)\n        throw new TypeError(\"variant must be a (non-negative) integer\");\n      if (typeof N == \"string\" && Y === void 0 && (Y = N, N = null), N) {\n        if (!(N instanceof r))\n          throw new TypeError(\"layout must be a Layout\");\n        if (v.defaultLayout !== null && 0 <= N.span && N.span > v.defaultLayout.span)\n          throw new Error(\"variant span exceeds span of containing union\");\n        if (typeof Y != \"string\")\n          throw new TypeError(\"variant must have a String property\");\n      }\n      let ee = v.span;\n      0 > v.span && (ee = N ? N.span : 0, 0 <= ee && v.usesPrefixDiscriminator && (ee += v.discriminator.layout.span)), super(ee, Y), this.union = v, this.variant = P, this.layout = N || null;\n    }\n    /** @override */\n    getSpan(v, P = 0) {\n      if (0 <= this.span)\n        return this.span;\n      let N = 0;\n      this.union.usesPrefixDiscriminator && (N = this.union.discriminator.layout.span);\n      let Y = 0;\n      return this.layout && (Y = this.layout.getSpan(v, P + N)), N + Y;\n    }\n    /** @override */\n    decode(v, P = 0) {\n      const N = this.makeDestinationObject();\n      if (this !== this.union.getVariant(v, P))\n        throw new Error(\"variant mismatch\");\n      let Y = 0;\n      return this.union.usesPrefixDiscriminator && (Y = this.union.discriminator.layout.span), this.layout ? N[this.property] = this.layout.decode(v, P + Y) : this.property ? N[this.property] = !0 : this.union.usesPrefixDiscriminator && (N[this.union.discriminator.property] = this.variant), N;\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      let Y = 0;\n      if (this.union.usesPrefixDiscriminator && (Y = this.union.discriminator.layout.span), this.layout && !Object.prototype.hasOwnProperty.call(v, this.property))\n        throw new TypeError(\"variant lacks property \" + this.property);\n      this.union.discriminator.encode(this.variant, P, N);\n      let ee = Y;\n      if (this.layout && (this.layout.encode(v[this.property], P, N + Y), ee += this.layout.getSpan(P, N + Y), 0 <= this.union.span && ee > this.union.span))\n        throw new Error(\"encoded variant overruns containing union\");\n      return ee;\n    }\n    /** Delegate {@link Layout#fromArray|fromArray} to {@link\n     * VariantLayout#layout|layout}. */\n    fromArray(v) {\n      if (this.layout)\n        return this.layout.fromArray(v);\n    }\n  }\n  re.VariantLayout = _;\n  function g(m) {\n    return 0 > m && (m += 4294967296), m;\n  }\n  class x extends r {\n    constructor(v, P, N) {\n      if (!(v instanceof c || v instanceof u))\n        throw new TypeError(\"word must be a UInt or UIntBE layout\");\n      if (typeof P == \"string\" && N === void 0 && (N = P, P = !1), 4 < v.span)\n        throw new RangeError(\"word cannot exceed 32 bits\");\n      super(v.span, N), this.word = v, this.msb = !!P, this.fields = [];\n      let Y = 0;\n      this._packedSetValue = function(ee) {\n        return Y = g(ee), this;\n      }, this._packedGetValue = function() {\n        return Y;\n      };\n    }\n    /** @override */\n    decode(v, P = 0) {\n      const N = this.makeDestinationObject(), Y = this.word.decode(v, P);\n      this._packedSetValue(Y);\n      for (const ee of this.fields)\n        ee.property !== void 0 && (N[ee.property] = ee.decode(v));\n      return N;\n    }\n    /** Implement {@link Layout#encode|encode} for {@link BitStructure}.\n     *\n     * If `src` is missing a property for a member with a defined {@link\n     * Layout#property|property} the corresponding region of the packed\n     * value is left unmodified.  Unused bits are also left unmodified. */\n    encode(v, P, N = 0) {\n      const Y = this.word.decode(P, N);\n      this._packedSetValue(Y);\n      for (const ee of this.fields)\n        if (ee.property !== void 0) {\n          const ie = v[ee.property];\n          ie !== void 0 && ee.encode(ie);\n        }\n      return this.word.encode(this._packedGetValue(), P, N);\n    }\n    /** Register a new bitfield with a containing bit structure.  The\n     * resulting bitfield is returned.\n     *\n     * @param {Number} bits - initializer for {@link BitField#bits|bits}.\n     *\n     * @param {string} property - initializer for {@link\n     * Layout#property|property}.\n     *\n     * @return {BitField} */\n    addField(v, P) {\n      const N = new w(this, v, P);\n      return this.fields.push(N), N;\n    }\n    /** As with {@link BitStructure#addField|addField} for single-bit\n     * fields with `boolean` value representation.\n     *\n     * @param {string} property - initializer for {@link\n     * Layout#property|property}.\n     *\n     * @return {Boolean} */\n    // `Boolean` conflicts with the native primitive type\n    // eslint-disable-next-line @typescript-eslint/ban-types\n    addBoolean(v) {\n      const P = new D(this, v);\n      return this.fields.push(P), P;\n    }\n    /**\n     * Get access to the bit field for a given property.\n     *\n     * @param {String} property - the bit field of interest.\n     *\n     * @return {BitField} - the field associated with `property`, or\n     * undefined if there is no such property.\n     */\n    fieldFor(v) {\n      if (typeof v != \"string\")\n        throw new TypeError(\"property must be string\");\n      for (const P of this.fields)\n        if (P.property === v)\n          return P;\n    }\n  }\n  re.BitStructure = x;\n  class w {\n    constructor(v, P, N) {\n      if (!(v instanceof x))\n        throw new TypeError(\"container must be a BitStructure\");\n      if (!Number.isInteger(P) || 0 >= P)\n        throw new TypeError(\"bits must be positive integer\");\n      const Y = 8 * v.span, ee = v.fields.reduce((ie, le) => ie + le.bits, 0);\n      if (P + ee > Y)\n        throw new Error(\"bits too long for span remainder (\" + (Y - ee) + \" of \" + Y + \" remain)\");\n      this.container = v, this.bits = P, this.valueMask = (1 << P) - 1, P === 32 && (this.valueMask = 4294967295), this.start = ee, this.container.msb && (this.start = Y - ee - P), this.wordMask = g(this.valueMask << this.start), this.property = N;\n    }\n    /** Store a value into the corresponding subsequence of the containing\n     * bit field. */\n    decode(v, P) {\n      const N = this.container._packedGetValue();\n      return g(N & this.wordMask) >>> this.start;\n    }\n    /** Store a value into the corresponding subsequence of the containing\n     * bit field.\n     *\n     * **NOTE** This is not a specialization of {@link\n     * Layout#encode|Layout.encode} and there is no return value. */\n    encode(v) {\n      if (typeof v != \"number\" || !Number.isInteger(v) || v !== g(v & this.valueMask))\n        throw new TypeError(n(\"BitField.encode\", this) + \" value must be integer not exceeding \" + this.valueMask);\n      const P = this.container._packedGetValue(), N = g(v << this.start);\n      this.container._packedSetValue(g(P & ~this.wordMask) | N);\n    }\n  }\n  re.BitField = w;\n  class D extends w {\n    constructor(v, P) {\n      super(v, 1, P);\n    }\n    /** Override {@link BitField#decode|decode} for {@link Boolean|Boolean}.\n     *\n     * @returns {boolean} */\n    decode(v, P) {\n      return !!super.decode(v, P);\n    }\n    /** @override */\n    encode(v) {\n      typeof v == \"boolean\" && (v = +v), super.encode(v);\n    }\n  }\n  re.Boolean = D;\n  class O extends r {\n    constructor(v, P) {\n      if (!(v instanceof o && v.isCount() || Number.isInteger(v) && 0 <= v))\n        throw new TypeError(\"length must be positive integer or an unsigned integer ExternalLayout\");\n      let N = -1;\n      v instanceof o || (N = v), super(N, P), this.length = v;\n    }\n    /** @override */\n    getSpan(v, P) {\n      let N = this.span;\n      return 0 > N && (N = this.length.decode(v, P)), N;\n    }\n    /** @override */\n    decode(v, P = 0) {\n      let N = this.span;\n      return 0 > N && (N = this.length.decode(v, P)), t(v).slice(P, P + N);\n    }\n    /** Implement {@link Layout#encode|encode} for {@link Blob}.\n     *\n     * **NOTE** If {@link Layout#count|count} is an instance of {@link\n     * ExternalLayout} then the length of `src` will be encoded as the\n     * count after `src` is encoded. */\n    encode(v, P, N) {\n      let Y = this.length;\n      if (this.length instanceof o && (Y = v.length), !(v instanceof Uint8Array && Y === v.length))\n        throw new TypeError(n(\"Blob.encode\", this) + \" requires (length \" + Y + \") Uint8Array as src\");\n      if (N + Y > P.length)\n        throw new RangeError(\"encoding overruns Uint8Array\");\n      const ee = t(v);\n      return t(P).write(ee.toString(\"hex\"), N, Y, \"hex\"), this.length instanceof o && this.length.encode(Y, P, N), Y;\n    }\n  }\n  re.Blob = O;\n  class U extends r {\n    constructor(v) {\n      super(-1, v);\n    }\n    /** @override */\n    getSpan(v, P = 0) {\n      e(v);\n      let N = P;\n      for (; N < v.length && v[N] !== 0; )\n        N += 1;\n      return 1 + N - P;\n    }\n    /** @override */\n    decode(v, P = 0) {\n      const N = this.getSpan(v, P);\n      return t(v).slice(P, P + N - 1).toString(\"utf-8\");\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      typeof v != \"string\" && (v = String(v));\n      const Y = s.Buffer.from(v, \"utf8\"), ee = Y.length;\n      if (N + ee > P.length)\n        throw new RangeError(\"encoding overruns Buffer\");\n      const ie = t(P);\n      return Y.copy(ie, N), ie[N + ee] = 0, ee + 1;\n    }\n  }\n  re.CString = U;\n  class V extends r {\n    constructor(v, P) {\n      if (typeof v == \"string\" && P === void 0 && (P = v, v = void 0), v === void 0)\n        v = -1;\n      else if (!Number.isInteger(v))\n        throw new TypeError(\"maxSpan must be an integer\");\n      super(-1, P), this.maxSpan = v;\n    }\n    /** @override */\n    getSpan(v, P = 0) {\n      return e(v), v.length - P;\n    }\n    /** @override */\n    decode(v, P = 0) {\n      const N = this.getSpan(v, P);\n      if (0 <= this.maxSpan && this.maxSpan < N)\n        throw new RangeError(\"text length exceeds maxSpan\");\n      return t(v).slice(P, P + N).toString(\"utf-8\");\n    }\n    /** @override */\n    encode(v, P, N = 0) {\n      typeof v != \"string\" && (v = String(v));\n      const Y = s.Buffer.from(v, \"utf8\"), ee = Y.length;\n      if (0 <= this.maxSpan && this.maxSpan < ee)\n        throw new RangeError(\"text length exceeds maxSpan\");\n      if (N + ee > P.length)\n        throw new RangeError(\"encoding overruns Buffer\");\n      return Y.copy(t(P), N), ee;\n    }\n  }\n  re.UTF8 = V;\n  class L extends r {\n    constructor(v, P) {\n      super(0, P), this.value = v;\n    }\n    /** @override */\n    decode(v, P) {\n      return this.value;\n    }\n    /** @override */\n    encode(v, P, N) {\n      return 0;\n    }\n  }\n  return re.Constant = L, re.greedy = ((m, v) => new a(m, v)), re.offset = ((m, v, P) => new l(m, v, P)), re.u8 = ((m) => new c(1, m)), re.u16 = ((m) => new c(2, m)), re.u24 = ((m) => new c(3, m)), re.u32 = ((m) => new c(4, m)), re.u40 = ((m) => new c(5, m)), re.u48 = ((m) => new c(6, m)), re.nu64 = ((m) => new E(m)), re.u16be = ((m) => new u(2, m)), re.u24be = ((m) => new u(3, m)), re.u32be = ((m) => new u(4, m)), re.u40be = ((m) => new u(5, m)), re.u48be = ((m) => new u(6, m)), re.nu64be = ((m) => new b(m)), re.s8 = ((m) => new d(1, m)), re.s16 = ((m) => new d(2, m)), re.s24 = ((m) => new d(3, m)), re.s32 = ((m) => new d(4, m)), re.s40 = ((m) => new d(5, m)), re.s48 = ((m) => new d(6, m)), re.ns64 = ((m) => new R(m)), re.s16be = ((m) => new h(2, m)), re.s24be = ((m) => new h(3, m)), re.s32be = ((m) => new h(4, m)), re.s40be = ((m) => new h(5, m)), re.s48be = ((m) => new h(6, m)), re.ns64be = ((m) => new A(m)), re.f32 = ((m) => new F(m)), re.f32be = ((m) => new M(m)), re.f64 = ((m) => new H(m)), re.f64be = ((m) => new K(m)), re.struct = ((m, v, P) => new C(m, v, P)), re.bits = ((m, v, P) => new x(m, v, P)), re.seq = ((m, v, P) => new j(m, v, P)), re.union = ((m, v, P) => new W(m, v, P)), re.unionLayoutDiscriminator = ((m, v) => new $(m, v)), re.blob = ((m, v) => new O(m, v)), re.cstr = ((m) => new U(m)), re.utf8 = ((m, v) => new V(m, v)), re.constant = ((m, v) => new L(m, v)), re;\n}\nvar z = Wy(), zy = 8078e3, Yy = 8078001, Zy = 8078004, Xy = 8078005, Jy = 8078006, Qy = 8078011;\nfunction x0(s) {\n  return Array.isArray(s) ? \"%5B\" + s.map(x0).join(\n    \"%2C%20\"\n    /* \", \" */\n  ) + /* \"]\" */\n  \"%5D\" : typeof s == \"bigint\" ? `${s}n` : encodeURIComponent(\n    String(\n      s != null && Object.getPrototypeOf(s) === null ? (\n        // Plain objects with no prototype don't have a `toString` method.\n        // Convert them before stringifying them.\n        { ...s }\n      ) : s\n    )\n  );\n}\nfunction ev([s, e]) {\n  return `${s}=${x0(e)}`;\n}\nfunction tv(s) {\n  const e = Object.entries(s).map(ev).join(\"&\");\n  return btoa(e);\n}\nfunction rv(s, e = {}) {\n  {\n    let t = `Solana error #${s}; Decode this error by running \\`npx @solana/errors decode -- ${s}`;\n    return Object.keys(e).length && (t += ` '${tv(e)}'`), `${t}\\``;\n  }\n}\nvar bn = class extends Error {\n  constructor(...[e, t]) {\n    let r, n;\n    if (t) {\n      const { cause: o, ...a } = t;\n      o && (n = { cause: o }), Object.keys(a).length > 0 && (r = a);\n    }\n    const i = rv(e, r);\n    super(i, n);\n    /**\n     * Indicates the root cause of this {@link SolanaError}, if any.\n     *\n     * For example, a transaction error might have an instruction error as its root cause. In this\n     * case, you will be able to access the instruction error on the transaction error as `cause`.\n     */\n    Cr(this, \"cause\", this.cause);\n    /**\n     * Contains context that can assist in understanding or recovering from a {@link SolanaError}.\n     */\n    Cr(this, \"context\");\n    this.context = {\n      __code: e,\n      ...r\n    }, this.name = \"SolanaError\";\n  }\n};\nfunction sv(s, e) {\n  return \"fixedSize\" in e ? e.fixedSize : e.getSizeFromValue(s);\n}\nfunction nv(s) {\n  return Object.freeze({\n    ...s,\n    encode: (e) => {\n      const t = new Uint8Array(sv(e, s));\n      return s.write(e, t, 0), t;\n    }\n  });\n}\nfunction iv(s) {\n  return Object.freeze({\n    ...s,\n    decode: (e, t = 0) => s.read(e, t)[0]\n  });\n}\nfunction dn(s) {\n  return \"fixedSize\" in s && typeof s.fixedSize == \"number\";\n}\nfunction ov(s, e) {\n  if (dn(s) !== dn(e))\n    throw new bn(Zy);\n  if (dn(s) && dn(e) && s.fixedSize !== e.fixedSize)\n    throw new bn(Xy, {\n      decoderFixedSize: e.fixedSize,\n      encoderFixedSize: s.fixedSize\n    });\n  if (!dn(s) && !dn(e) && s.maxSize !== e.maxSize)\n    throw new bn(Jy, {\n      decoderMaxSize: e.maxSize,\n      encoderMaxSize: s.maxSize\n    });\n  return {\n    ...e,\n    ...s,\n    decode: e.decode,\n    encode: s.encode,\n    read: e.read,\n    write: s.write\n  };\n}\nfunction av(s, e, t = 0) {\n  if (e.length - t <= 0)\n    throw new bn(zy, {\n      codecDescription: s\n    });\n}\nfunction lv(s, e, t, r = 0) {\n  const n = t.length - r;\n  if (n < e)\n    throw new bn(Yy, {\n      bytesLength: n,\n      codecDescription: s,\n      expected: e\n    });\n}\nfunction cv(s, e, t, r) {\n  if (r < e || r > t)\n    throw new bn(Qy, {\n      codecDescription: s,\n      max: t,\n      min: e,\n      value: r\n    });\n}\nfunction S0(s) {\n  return (s == null ? void 0 : s.endian) !== 1;\n}\nfunction uv(s) {\n  return nv({\n    fixedSize: s.size,\n    write(e, t, r) {\n      s.range && cv(s.name, s.range[0], s.range[1], e);\n      const n = new ArrayBuffer(s.size);\n      return s.set(new DataView(n), e, S0(s.config)), t.set(new Uint8Array(n), r), r + s.size;\n    }\n  });\n}\nfunction dv(s) {\n  return iv({\n    fixedSize: s.size,\n    read(e, t = 0) {\n      av(s.name, e, t), lv(s.name, s.size, e, t);\n      const r = new DataView(hv(e, t, s.size));\n      return [s.get(r, S0(s.config)), t + s.size];\n    }\n  });\n}\nfunction hv(s, e, t) {\n  const r = s.byteOffset + (e ?? 0), n = t ?? s.byteLength;\n  return s.buffer.slice(r, r + n);\n}\nvar fv = (s = {}) => uv({\n  config: s,\n  name: \"u64\",\n  range: [0n, BigInt(\"0xffffffffffffffff\")],\n  set: (e, t, r) => e.setBigUint64(0, BigInt(t), r),\n  size: 8\n}), gv = (s = {}) => dv({\n  config: s,\n  get: (e, t) => e.getBigUint64(0, t),\n  name: \"u64\",\n  size: 8\n}), pv = (s = {}) => ov(fv(s), gv(s));\nclass mv extends TypeError {\n  constructor(e, t) {\n    let r;\n    const { message: n, explanation: i, ...o } = e, { path: a } = e, l = a.length === 0 ? n : `At path: ${a.join(\".\")} -- ${n}`;\n    super(i ?? l), i != null && (this.cause = l), Object.assign(this, o), this.name = this.constructor.name, this.failures = () => r ?? (r = [e, ...t()]);\n  }\n}\nfunction yv(s) {\n  return Ci(s) && typeof s[Symbol.iterator] == \"function\";\n}\nfunction Ci(s) {\n  return typeof s == \"object\" && s != null;\n}\nfunction $o(s) {\n  return Ci(s) && !Array.isArray(s);\n}\nfunction Br(s) {\n  return typeof s == \"symbol\" ? s.toString() : typeof s == \"string\" ? JSON.stringify(s) : `${s}`;\n}\nfunction vv(s) {\n  const { done: e, value: t } = s.next();\n  return e ? void 0 : t;\n}\nfunction Ev(s, e, t, r) {\n  if (s === !0)\n    return;\n  s === !1 ? s = {} : typeof s == \"string\" && (s = { message: s });\n  const { path: n, branch: i } = e, { type: o } = t, { refinement: a, message: l = `Expected a value of type \\`${o}\\`${a ? ` with refinement \\`${a}\\`` : \"\"}, but received: \\`${Br(r)}\\`` } = s;\n  return {\n    value: r,\n    type: o,\n    refinement: a,\n    key: n[n.length - 1],\n    path: n,\n    branch: i,\n    ...s,\n    message: l\n  };\n}\nfunction* Cd(s, e, t, r) {\n  yv(s) || (s = [s]);\n  for (const n of s) {\n    const i = Ev(n, e, t, r);\n    i && (yield i);\n  }\n}\nfunction* Jc(s, e, t = {}) {\n  const { path: r = [], branch: n = [s], coerce: i = !1, mask: o = !1 } = t, a = { path: r, branch: n, mask: o };\n  i && (s = e.coercer(s, a));\n  let l = \"valid\";\n  for (const c of e.validator(s, a))\n    c.explanation = t.message, l = \"not_valid\", yield [c, void 0];\n  for (let [c, u, d] of e.entries(s, a)) {\n    const h = Jc(u, d, {\n      path: c === void 0 ? r : [...r, c],\n      branch: c === void 0 ? n : [...n, u],\n      coerce: i,\n      mask: o,\n      message: t.message\n    });\n    for (const f of h)\n      f[0] ? (l = f[0].refinement != null ? \"not_refined\" : \"not_valid\", yield [f[0], void 0]) : i && (u = f[1], c === void 0 ? s = u : s instanceof Map ? s.set(c, u) : s instanceof Set ? s.add(u) : Ci(s) && (u !== void 0 || c in s) && (s[c] = u));\n  }\n  if (l !== \"not_valid\")\n    for (const c of e.refiner(s, a))\n      c.explanation = t.message, l = \"not_refined\", yield [c, void 0];\n  l === \"valid\" && (yield [void 0, s]);\n}\nlet es = class {\n  constructor(e) {\n    const { type: t, schema: r, validator: n, refiner: i, coercer: o = (l) => l, entries: a = function* () {\n    } } = e;\n    this.type = t, this.schema = r, this.entries = a, this.coercer = o, n ? this.validator = (l, c) => {\n      const u = n(l, c);\n      return Cd(u, c, this, l);\n    } : this.validator = () => [], i ? this.refiner = (l, c) => {\n      const u = i(l, c);\n      return Cd(u, c, this, l);\n    } : this.refiner = () => [];\n  }\n  /**\n   * Assert that a value passes the struct's validation, throwing if it doesn't.\n   */\n  assert(e, t) {\n    return xv(e, this, t);\n  }\n  /**\n   * Create a value with the struct's coercion logic, then validate it.\n   */\n  create(e, t) {\n    return ti(e, this, t);\n  }\n  /**\n   * Check if a value passes the struct's validation.\n   */\n  is(e) {\n    return b0(e, this);\n  }\n  /**\n   * Mask a value, coercing and validating it, but returning only the subset of\n   * properties defined by the struct's schema. Masking applies recursively to\n   * props of `object` structs only.\n   */\n  mask(e, t) {\n    return Sv(e, this, t);\n  }\n  /**\n   * Validate a value with the struct's validation logic, returning a tuple\n   * representing the result.\n   *\n   * You may optionally pass `true` for the `coerce` argument to coerce\n   * the value before attempting to validate it. If you do, the result will\n   * contain the coerced result when successful. Also, `mask` will turn on\n   * masking of the unknown `object` props recursively if passed.\n   */\n  validate(e, t = {}) {\n    return ki(e, this, t);\n  }\n};\nfunction xv(s, e, t) {\n  const r = ki(s, e, { message: t });\n  if (r[0])\n    throw r[0];\n}\nfunction ti(s, e, t) {\n  const r = ki(s, e, { coerce: !0, message: t });\n  if (r[0])\n    throw r[0];\n  return r[1];\n}\nfunction Sv(s, e, t) {\n  const r = ki(s, e, { coerce: !0, mask: !0, message: t });\n  if (r[0])\n    throw r[0];\n  return r[1];\n}\nfunction b0(s, e) {\n  return !ki(s, e)[0];\n}\nfunction ki(s, e, t = {}) {\n  const r = Jc(s, e, t), n = vv(r);\n  return n[0] ? [new mv(n[0], function* () {\n    for (const o of r)\n      o[0] && (yield o[0]);\n  }), void 0] : [void 0, n[1]];\n}\nfunction tn(s, e) {\n  return new es({ type: s, schema: null, validator: e });\n}\nfunction bv() {\n  return tn(\"any\", () => !0);\n}\nfunction fe(s) {\n  return new es({\n    type: \"array\",\n    schema: s,\n    *entries(e) {\n      if (s && Array.isArray(e))\n        for (const [t, r] of e.entries())\n          yield [t, r, s];\n    },\n    coercer(e) {\n      return Array.isArray(e) ? e.slice() : e;\n    },\n    validator(e) {\n      return Array.isArray(e) || `Expected an array value, but received: ${Br(e)}`;\n    }\n  });\n}\nfunction Xr() {\n  return tn(\"boolean\", (s) => typeof s == \"boolean\");\n}\nfunction Qc(s) {\n  return tn(\"instance\", (e) => e instanceof s || `Expected a \\`${s.name}\\` instance, but received: ${Br(e)}`);\n}\nfunction pt(s) {\n  const e = Br(s), t = typeof s;\n  return new es({\n    type: \"literal\",\n    schema: t === \"string\" || t === \"number\" || t === \"boolean\" ? s : null,\n    validator(r) {\n      return r === s || `Expected the literal \\`${e}\\`, but received: ${Br(r)}`;\n    }\n  });\n}\nfunction Tv() {\n  return tn(\"never\", () => !1);\n}\nfunction ge(s) {\n  return new es({\n    ...s,\n    validator: (e, t) => e === null || s.validator(e, t),\n    refiner: (e, t) => e === null || s.refiner(e, t)\n  });\n}\nfunction te() {\n  return tn(\"number\", (s) => typeof s == \"number\" && !isNaN(s) || `Expected a number, but received: ${Br(s)}`);\n}\nfunction Se(s) {\n  return new es({\n    ...s,\n    validator: (e, t) => e === void 0 || s.validator(e, t),\n    refiner: (e, t) => e === void 0 || s.refiner(e, t)\n  });\n}\nfunction T0(s, e) {\n  return new es({\n    type: \"record\",\n    schema: null,\n    *entries(t) {\n      if (Ci(t))\n        for (const r in t) {\n          const n = t[r];\n          yield [r, r, s], yield [r, n, e];\n        }\n    },\n    validator(t) {\n      return $o(t) || `Expected an object, but received: ${Br(t)}`;\n    },\n    coercer(t) {\n      return $o(t) ? { ...t } : t;\n    }\n  });\n}\nfunction ce() {\n  return tn(\"string\", (s) => typeof s == \"string\" || `Expected a string, but received: ${Br(s)}`);\n}\nfunction eu(s) {\n  const e = Tv();\n  return new es({\n    type: \"tuple\",\n    schema: null,\n    *entries(t) {\n      if (Array.isArray(t)) {\n        const r = Math.max(s.length, t.length);\n        for (let n = 0; n < r; n++)\n          yield [n, t[n], s[n] || e];\n      }\n    },\n    validator(t) {\n      return Array.isArray(t) || `Expected an array, but received: ${Br(t)}`;\n    },\n    coercer(t) {\n      return Array.isArray(t) ? t.slice() : t;\n    }\n  });\n}\nfunction oe(s) {\n  const e = Object.keys(s);\n  return new es({\n    type: \"type\",\n    schema: s,\n    *entries(t) {\n      if (Ci(t))\n        for (const r of e)\n          yield [r, t[r], s[r]];\n    },\n    validator(t) {\n      return $o(t) || `Expected an object, but received: ${Br(t)}`;\n    },\n    coercer(t) {\n      return $o(t) ? { ...t } : t;\n    }\n  });\n}\nfunction ur(s) {\n  const e = s.map((t) => t.type).join(\" | \");\n  return new es({\n    type: \"union\",\n    schema: null,\n    coercer(t, r) {\n      for (const n of s) {\n        const [i, o] = n.validate(t, {\n          coerce: !0,\n          mask: r.mask\n        });\n        if (!i)\n          return o;\n      }\n      return t;\n    },\n    validator(t, r) {\n      const n = [];\n      for (const i of s) {\n        const [...o] = Jc(t, i, r), [a] = o;\n        if (a[0])\n          for (const [l] of o)\n            l && n.push(l);\n        else\n          return [];\n      }\n      return [\n        `Expected the value to satisfy a union of \\`${e}\\`, but received: ${Br(t)}`,\n        ...n\n      ];\n    }\n  });\n}\nfunction Gn() {\n  return tn(\"unknown\", () => !0);\n}\nfunction Di(s, e, t) {\n  return new es({\n    ...s,\n    coercer: (r, n) => b0(r, e) ? s.coercer(t(r, n), n) : s.coercer(r, n)\n  });\n}\nvar $i, wv = new Uint8Array(16);\nfunction w0() {\n  if (!$i && ($i = typeof crypto < \"u\" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto < \"u\" && typeof msCrypto.getRandomValues == \"function\" && msCrypto.getRandomValues.bind(msCrypto), !$i))\n    throw new Error(\"crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported\");\n  return $i(wv);\n}\nconst Av = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;\nfunction ua(s) {\n  return typeof s == \"string\" && Av.test(s);\n}\nvar Yt = [];\nfor (var Qa = 0; Qa < 256; ++Qa)\n  Yt.push((Qa + 256).toString(16).substr(1));\nfunction da(s) {\n  var e = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0, t = (Yt[s[e + 0]] + Yt[s[e + 1]] + Yt[s[e + 2]] + Yt[s[e + 3]] + \"-\" + Yt[s[e + 4]] + Yt[s[e + 5]] + \"-\" + Yt[s[e + 6]] + Yt[s[e + 7]] + \"-\" + Yt[s[e + 8]] + Yt[s[e + 9]] + \"-\" + Yt[s[e + 10]] + Yt[s[e + 11]] + Yt[s[e + 12]] + Yt[s[e + 13]] + Yt[s[e + 14]] + Yt[s[e + 15]]).toLowerCase();\n  if (!ua(t))\n    throw TypeError(\"Stringified UUID is invalid\");\n  return t;\n}\nvar kd, el, tl = 0, rl = 0;\nfunction Iv(s, e, t) {\n  var r = e && t || 0, n = e || new Array(16);\n  s = s || {};\n  var i = s.node || kd, o = s.clockseq !== void 0 ? s.clockseq : el;\n  if (i == null || o == null) {\n    var a = s.random || (s.rng || w0)();\n    i == null && (i = kd = [a[0] | 1, a[1], a[2], a[3], a[4], a[5]]), o == null && (o = el = (a[6] << 8 | a[7]) & 16383);\n  }\n  var l = s.msecs !== void 0 ? s.msecs : Date.now(), c = s.nsecs !== void 0 ? s.nsecs : rl + 1, u = l - tl + (c - rl) / 1e4;\n  if (u < 0 && s.clockseq === void 0 && (o = o + 1 & 16383), (u < 0 || l > tl) && s.nsecs === void 0 && (c = 0), c >= 1e4)\n    throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n  tl = l, rl = c, el = o, l += 122192928e5;\n  var d = ((l & 268435455) * 1e4 + c) % 4294967296;\n  n[r++] = d >>> 24 & 255, n[r++] = d >>> 16 & 255, n[r++] = d >>> 8 & 255, n[r++] = d & 255;\n  var h = l / 4294967296 * 1e4 & 268435455;\n  n[r++] = h >>> 8 & 255, n[r++] = h & 255, n[r++] = h >>> 24 & 15 | 16, n[r++] = h >>> 16 & 255, n[r++] = o >>> 8 | 128, n[r++] = o & 255;\n  for (var f = 0; f < 6; ++f)\n    n[r + f] = i[f];\n  return e || da(n);\n}\nfunction A0(s) {\n  if (!ua(s))\n    throw TypeError(\"Invalid UUID\");\n  var e, t = new Uint8Array(16);\n  return t[0] = (e = parseInt(s.slice(0, 8), 16)) >>> 24, t[1] = e >>> 16 & 255, t[2] = e >>> 8 & 255, t[3] = e & 255, t[4] = (e = parseInt(s.slice(9, 13), 16)) >>> 8, t[5] = e & 255, t[6] = (e = parseInt(s.slice(14, 18), 16)) >>> 8, t[7] = e & 255, t[8] = (e = parseInt(s.slice(19, 23), 16)) >>> 8, t[9] = e & 255, t[10] = (e = parseInt(s.slice(24, 36), 16)) / 1099511627776 & 255, t[11] = e / 4294967296 & 255, t[12] = e >>> 24 & 255, t[13] = e >>> 16 & 255, t[14] = e >>> 8 & 255, t[15] = e & 255, t;\n}\nfunction _v(s) {\n  s = unescape(encodeURIComponent(s));\n  for (var e = [], t = 0; t < s.length; ++t)\n    e.push(s.charCodeAt(t));\n  return e;\n}\nvar Rv = \"6ba7b810-9dad-11d1-80b4-00c04fd430c8\", Lv = \"6ba7b811-9dad-11d1-80b4-00c04fd430c8\";\nfunction I0(s, e, t) {\n  function r(n, i, o, a) {\n    if (typeof n == \"string\" && (n = _v(n)), typeof i == \"string\" && (i = A0(i)), i.length !== 16)\n      throw TypeError(\"Namespace must be array-like (16 iterable integer values, 0-255)\");\n    var l = new Uint8Array(16 + n.length);\n    if (l.set(i), l.set(n, i.length), l = t(l), l[6] = l[6] & 15 | e, l[8] = l[8] & 63 | 128, o) {\n      a = a || 0;\n      for (var c = 0; c < 16; ++c)\n        o[a + c] = l[c];\n      return o;\n    }\n    return da(l);\n  }\n  try {\n    r.name = s;\n  } catch {\n  }\n  return r.DNS = Rv, r.URL = Lv, r;\n}\nfunction Cv(s) {\n  if (typeof s == \"string\") {\n    var e = unescape(encodeURIComponent(s));\n    s = new Uint8Array(e.length);\n    for (var t = 0; t < e.length; ++t)\n      s[t] = e.charCodeAt(t);\n  }\n  return kv(Dv(Pv(s), s.length * 8));\n}\nfunction kv(s) {\n  for (var e = [], t = s.length * 32, r = \"0123456789abcdef\", n = 0; n < t; n += 8) {\n    var i = s[n >> 5] >>> n % 32 & 255, o = parseInt(r.charAt(i >>> 4 & 15) + r.charAt(i & 15), 16);\n    e.push(o);\n  }\n  return e;\n}\nfunction _0(s) {\n  return (s + 64 >>> 9 << 4) + 14 + 1;\n}\nfunction Dv(s, e) {\n  s[e >> 5] |= 128 << e % 32, s[_0(e) - 1] = e;\n  for (var t = 1732584193, r = -271733879, n = -1732584194, i = 271733878, o = 0; o < s.length; o += 16) {\n    var a = t, l = r, c = n, u = i;\n    t = er(t, r, n, i, s[o], 7, -680876936), i = er(i, t, r, n, s[o + 1], 12, -389564586), n = er(n, i, t, r, s[o + 2], 17, 606105819), r = er(r, n, i, t, s[o + 3], 22, -1044525330), t = er(t, r, n, i, s[o + 4], 7, -176418897), i = er(i, t, r, n, s[o + 5], 12, 1200080426), n = er(n, i, t, r, s[o + 6], 17, -1473231341), r = er(r, n, i, t, s[o + 7], 22, -45705983), t = er(t, r, n, i, s[o + 8], 7, 1770035416), i = er(i, t, r, n, s[o + 9], 12, -1958414417), n = er(n, i, t, r, s[o + 10], 17, -42063), r = er(r, n, i, t, s[o + 11], 22, -1990404162), t = er(t, r, n, i, s[o + 12], 7, 1804603682), i = er(i, t, r, n, s[o + 13], 12, -40341101), n = er(n, i, t, r, s[o + 14], 17, -1502002290), r = er(r, n, i, t, s[o + 15], 22, 1236535329), t = tr(t, r, n, i, s[o + 1], 5, -165796510), i = tr(i, t, r, n, s[o + 6], 9, -1069501632), n = tr(n, i, t, r, s[o + 11], 14, 643717713), r = tr(r, n, i, t, s[o], 20, -373897302), t = tr(t, r, n, i, s[o + 5], 5, -701558691), i = tr(i, t, r, n, s[o + 10], 9, 38016083), n = tr(n, i, t, r, s[o + 15], 14, -660478335), r = tr(r, n, i, t, s[o + 4], 20, -405537848), t = tr(t, r, n, i, s[o + 9], 5, 568446438), i = tr(i, t, r, n, s[o + 14], 9, -1019803690), n = tr(n, i, t, r, s[o + 3], 14, -187363961), r = tr(r, n, i, t, s[o + 8], 20, 1163531501), t = tr(t, r, n, i, s[o + 13], 5, -1444681467), i = tr(i, t, r, n, s[o + 2], 9, -51403784), n = tr(n, i, t, r, s[o + 7], 14, 1735328473), r = tr(r, n, i, t, s[o + 12], 20, -1926607734), t = rr(t, r, n, i, s[o + 5], 4, -378558), i = rr(i, t, r, n, s[o + 8], 11, -2022574463), n = rr(n, i, t, r, s[o + 11], 16, 1839030562), r = rr(r, n, i, t, s[o + 14], 23, -35309556), t = rr(t, r, n, i, s[o + 1], 4, -1530992060), i = rr(i, t, r, n, s[o + 4], 11, 1272893353), n = rr(n, i, t, r, s[o + 7], 16, -155497632), r = rr(r, n, i, t, s[o + 10], 23, -1094730640), t = rr(t, r, n, i, s[o + 13], 4, 681279174), i = rr(i, t, r, n, s[o], 11, -358537222), n = rr(n, i, t, r, s[o + 3], 16, -722521979), r = rr(r, n, i, t, s[o + 6], 23, 76029189), t = rr(t, r, n, i, s[o + 9], 4, -640364487), i = rr(i, t, r, n, s[o + 12], 11, -421815835), n = rr(n, i, t, r, s[o + 15], 16, 530742520), r = rr(r, n, i, t, s[o + 2], 23, -995338651), t = sr(t, r, n, i, s[o], 6, -198630844), i = sr(i, t, r, n, s[o + 7], 10, 1126891415), n = sr(n, i, t, r, s[o + 14], 15, -1416354905), r = sr(r, n, i, t, s[o + 5], 21, -57434055), t = sr(t, r, n, i, s[o + 12], 6, 1700485571), i = sr(i, t, r, n, s[o + 3], 10, -1894986606), n = sr(n, i, t, r, s[o + 10], 15, -1051523), r = sr(r, n, i, t, s[o + 1], 21, -2054922799), t = sr(t, r, n, i, s[o + 8], 6, 1873313359), i = sr(i, t, r, n, s[o + 15], 10, -30611744), n = sr(n, i, t, r, s[o + 6], 15, -1560198380), r = sr(r, n, i, t, s[o + 13], 21, 1309151649), t = sr(t, r, n, i, s[o + 4], 6, -145523070), i = sr(i, t, r, n, s[o + 11], 10, -1120210379), n = sr(n, i, t, r, s[o + 2], 15, 718787259), r = sr(r, n, i, t, s[o + 9], 21, -343485551), t = Ls(t, a), r = Ls(r, l), n = Ls(n, c), i = Ls(i, u);\n  }\n  return [t, r, n, i];\n}\nfunction Pv(s) {\n  if (s.length === 0)\n    return [];\n  for (var e = s.length * 8, t = new Uint32Array(_0(e)), r = 0; r < e; r += 8)\n    t[r >> 5] |= (s[r / 8] & 255) << r % 32;\n  return t;\n}\nfunction Ls(s, e) {\n  var t = (s & 65535) + (e & 65535), r = (s >> 16) + (e >> 16) + (t >> 16);\n  return r << 16 | t & 65535;\n}\nfunction Mv(s, e) {\n  return s << e | s >>> 32 - e;\n}\nfunction ha(s, e, t, r, n, i) {\n  return Ls(Mv(Ls(Ls(e, s), Ls(r, i)), n), t);\n}\nfunction er(s, e, t, r, n, i, o) {\n  return ha(e & t | ~e & r, s, e, n, i, o);\n}\nfunction tr(s, e, t, r, n, i, o) {\n  return ha(e & r | t & ~r, s, e, n, i, o);\n}\nfunction rr(s, e, t, r, n, i, o) {\n  return ha(e ^ t ^ r, s, e, n, i, o);\n}\nfunction sr(s, e, t, r, n, i, o) {\n  return ha(t ^ (e | ~r), s, e, n, i, o);\n}\nvar Ov = I0(\"v3\", 48, Cv);\nfunction Bv(s, e, t) {\n  s = s || {};\n  var r = s.random || (s.rng || w0)();\n  if (r[6] = r[6] & 15 | 64, r[8] = r[8] & 63 | 128, e) {\n    t = t || 0;\n    for (var n = 0; n < 16; ++n)\n      e[t + n] = r[n];\n    return e;\n  }\n  return da(r);\n}\nfunction Fv(s, e, t, r) {\n  switch (s) {\n    case 0:\n      return e & t ^ ~e & r;\n    case 1:\n      return e ^ t ^ r;\n    case 2:\n      return e & t ^ e & r ^ t & r;\n    case 3:\n      return e ^ t ^ r;\n  }\n}\nfunction sl(s, e) {\n  return s << e | s >>> 32 - e;\n}\nfunction Nv(s) {\n  var e = [1518500249, 1859775393, 2400959708, 3395469782], t = [1732584193, 4023233417, 2562383102, 271733878, 3285377520];\n  if (typeof s == \"string\") {\n    var r = unescape(encodeURIComponent(s));\n    s = [];\n    for (var n = 0; n < r.length; ++n)\n      s.push(r.charCodeAt(n));\n  } else Array.isArray(s) || (s = Array.prototype.slice.call(s));\n  s.push(128);\n  for (var i = s.length / 4 + 2, o = Math.ceil(i / 16), a = new Array(o), l = 0; l < o; ++l) {\n    for (var c = new Uint32Array(16), u = 0; u < 16; ++u)\n      c[u] = s[l * 64 + u * 4] << 24 | s[l * 64 + u * 4 + 1] << 16 | s[l * 64 + u * 4 + 2] << 8 | s[l * 64 + u * 4 + 3];\n    a[l] = c;\n  }\n  a[o - 1][14] = (s.length - 1) * 8 / Math.pow(2, 32), a[o - 1][14] = Math.floor(a[o - 1][14]), a[o - 1][15] = (s.length - 1) * 8 & 4294967295;\n  for (var d = 0; d < o; ++d) {\n    for (var h = new Uint32Array(80), f = 0; f < 16; ++f)\n      h[f] = a[d][f];\n    for (var p = 16; p < 80; ++p)\n      h[p] = sl(h[p - 3] ^ h[p - 8] ^ h[p - 14] ^ h[p - 16], 1);\n    for (var y = t[0], E = t[1], b = t[2], R = t[3], A = t[4], F = 0; F < 80; ++F) {\n      var M = Math.floor(F / 20), H = sl(y, 5) + Fv(M, E, b, R) + A + e[M] + h[F] >>> 0;\n      A = R, R = b, b = sl(E, 30) >>> 0, E = y, y = H;\n    }\n    t[0] = t[0] + y >>> 0, t[1] = t[1] + E >>> 0, t[2] = t[2] + b >>> 0, t[3] = t[3] + R >>> 0, t[4] = t[4] + A >>> 0;\n  }\n  return [t[0] >> 24 & 255, t[0] >> 16 & 255, t[0] >> 8 & 255, t[0] & 255, t[1] >> 24 & 255, t[1] >> 16 & 255, t[1] >> 8 & 255, t[1] & 255, t[2] >> 24 & 255, t[2] >> 16 & 255, t[2] >> 8 & 255, t[2] & 255, t[3] >> 24 & 255, t[3] >> 16 & 255, t[3] >> 8 & 255, t[3] & 255, t[4] >> 24 & 255, t[4] >> 16 & 255, t[4] >> 8 & 255, t[4] & 255];\n}\nvar Uv = I0(\"v5\", 80, Nv);\nconst $v = \"00000000-0000-0000-0000-000000000000\";\nfunction Gv(s) {\n  if (!ua(s))\n    throw TypeError(\"Invalid UUID\");\n  return parseInt(s.substr(14, 1), 16);\n}\nconst Vv = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({\n  __proto__: null,\n  NIL: $v,\n  parse: A0,\n  stringify: da,\n  v1: Iv,\n  v3: Ov,\n  v4: Bv,\n  v5: Uv,\n  validate: ua,\n  version: Gv\n}, Symbol.toStringTag, { value: \"Module\" })), R0 = /* @__PURE__ */ Nc(Vv);\nvar nl, Dd;\nfunction jv() {\n  if (Dd) return nl;\n  Dd = 1;\n  const s = R0.v4;\n  return nl = function(t, r, n, i) {\n    if (typeof t != \"string\")\n      throw new TypeError(t + \" must be a string\");\n    i = i || {};\n    const o = typeof i.version == \"number\" ? i.version : 2;\n    if (o !== 1 && o !== 2)\n      throw new TypeError(o + \" must be 1 or 2\");\n    const a = {\n      method: t\n    };\n    if (o === 2 && (a.jsonrpc = \"2.0\"), r) {\n      if (typeof r != \"object\" && !Array.isArray(r))\n        throw new TypeError(r + \" must be an object, array or omitted\");\n      a.params = r;\n    }\n    if (typeof n > \"u\") {\n      const l = typeof i.generator == \"function\" ? i.generator : function() {\n        return s();\n      };\n      a.id = l(a, i);\n    } else o === 2 && n === null ? i.notificationIdNull && (a.id = null) : a.id = n;\n    return a;\n  }, nl;\n}\nvar il, Pd;\nfunction Kv() {\n  if (Pd) return il;\n  Pd = 1;\n  const s = R0.v4, e = jv(), t = function(r, n) {\n    if (!(this instanceof t))\n      return new t(r, n);\n    n || (n = {}), this.options = {\n      reviver: typeof n.reviver < \"u\" ? n.reviver : null,\n      replacer: typeof n.replacer < \"u\" ? n.replacer : null,\n      generator: typeof n.generator < \"u\" ? n.generator : function() {\n        return s();\n      },\n      version: typeof n.version < \"u\" ? n.version : 2,\n      notificationIdNull: typeof n.notificationIdNull == \"boolean\" ? n.notificationIdNull : !1\n    }, this.callServer = r;\n  };\n  return il = t, t.prototype.request = function(r, n, i, o) {\n    const a = this;\n    let l = null;\n    const c = Array.isArray(r) && typeof n == \"function\";\n    if (this.options.version === 1 && c)\n      throw new TypeError(\"JSON-RPC 1.0 does not support batching\");\n    if (c || !c && r && typeof r == \"object\" && typeof n == \"function\")\n      o = n, l = r;\n    else {\n      typeof i == \"function\" && (o = i, i = void 0);\n      const h = typeof o == \"function\";\n      try {\n        l = e(r, n, i, {\n          generator: this.options.generator,\n          version: this.options.version,\n          notificationIdNull: this.options.notificationIdNull\n        });\n      } catch (f) {\n        if (h)\n          return o(f);\n        throw f;\n      }\n      if (!h)\n        return l;\n    }\n    let d;\n    try {\n      d = JSON.stringify(l, this.options.replacer);\n    } catch (h) {\n      return o(h);\n    }\n    return this.callServer(d, function(h, f) {\n      a._parseResponse(h, f, o);\n    }), l;\n  }, t.prototype._parseResponse = function(r, n, i) {\n    if (r) {\n      i(r);\n      return;\n    }\n    if (!n)\n      return i();\n    let o;\n    try {\n      o = JSON.parse(n, this.options.reviver);\n    } catch (a) {\n      return i(a);\n    }\n    if (i.length === 3)\n      if (Array.isArray(o)) {\n        const a = function(c) {\n          return typeof c.error < \"u\";\n        }, l = function(c) {\n          return !a(c);\n        };\n        return i(null, o.filter(a), o.filter(l));\n      } else\n        return i(null, o.error, o.result);\n    i(null, o);\n  }, il;\n}\nKv();\nvar ol = { exports: {} }, Md;\nfunction Hv() {\n  return Md || (Md = 1, (function(s) {\n    var e = Object.prototype.hasOwnProperty, t = \"~\";\n    function r() {\n    }\n    Object.create && (r.prototype = /* @__PURE__ */ Object.create(null), new r().__proto__ || (t = !1));\n    function n(l, c, u) {\n      this.fn = l, this.context = c, this.once = u || !1;\n    }\n    function i(l, c, u, d, h) {\n      if (typeof u != \"function\")\n        throw new TypeError(\"The listener must be a function\");\n      var f = new n(u, d || l, h), p = t ? t + c : c;\n      return l._events[p] ? l._events[p].fn ? l._events[p] = [l._events[p], f] : l._events[p].push(f) : (l._events[p] = f, l._eventsCount++), l;\n    }\n    function o(l, c) {\n      --l._eventsCount === 0 ? l._events = new r() : delete l._events[c];\n    }\n    function a() {\n      this._events = new r(), this._eventsCount = 0;\n    }\n    a.prototype.eventNames = function() {\n      var c = [], u, d;\n      if (this._eventsCount === 0) return c;\n      for (d in u = this._events)\n        e.call(u, d) && c.push(t ? d.slice(1) : d);\n      return Object.getOwnPropertySymbols ? c.concat(Object.getOwnPropertySymbols(u)) : c;\n    }, a.prototype.listeners = function(c) {\n      var u = t ? t + c : c, d = this._events[u];\n      if (!d) return [];\n      if (d.fn) return [d.fn];\n      for (var h = 0, f = d.length, p = new Array(f); h < f; h++)\n        p[h] = d[h].fn;\n      return p;\n    }, a.prototype.listenerCount = function(c) {\n      var u = t ? t + c : c, d = this._events[u];\n      return d ? d.fn ? 1 : d.length : 0;\n    }, a.prototype.emit = function(c, u, d, h, f, p) {\n      var y = t ? t + c : c;\n      if (!this._events[y]) return !1;\n      var E = this._events[y], b = arguments.length, R, A;\n      if (E.fn) {\n        switch (E.once && this.removeListener(c, E.fn, void 0, !0), b) {\n          case 1:\n            return E.fn.call(E.context), !0;\n          case 2:\n            return E.fn.call(E.context, u), !0;\n          case 3:\n            return E.fn.call(E.context, u, d), !0;\n          case 4:\n            return E.fn.call(E.context, u, d, h), !0;\n          case 5:\n            return E.fn.call(E.context, u, d, h, f), !0;\n          case 6:\n            return E.fn.call(E.context, u, d, h, f, p), !0;\n        }\n        for (A = 1, R = new Array(b - 1); A < b; A++)\n          R[A - 1] = arguments[A];\n        E.fn.apply(E.context, R);\n      } else {\n        var F = E.length, M;\n        for (A = 0; A < F; A++)\n          switch (E[A].once && this.removeListener(c, E[A].fn, void 0, !0), b) {\n            case 1:\n              E[A].fn.call(E[A].context);\n              break;\n            case 2:\n              E[A].fn.call(E[A].context, u);\n              break;\n            case 3:\n              E[A].fn.call(E[A].context, u, d);\n              break;\n            case 4:\n              E[A].fn.call(E[A].context, u, d, h);\n              break;\n            default:\n              if (!R) for (M = 1, R = new Array(b - 1); M < b; M++)\n                R[M - 1] = arguments[M];\n              E[A].fn.apply(E[A].context, R);\n          }\n      }\n      return !0;\n    }, a.prototype.on = function(c, u, d) {\n      return i(this, c, u, d, !1);\n    }, a.prototype.once = function(c, u, d) {\n      return i(this, c, u, d, !0);\n    }, a.prototype.removeListener = function(c, u, d, h) {\n      var f = t ? t + c : c;\n      if (!this._events[f]) return this;\n      if (!u)\n        return o(this, f), this;\n      var p = this._events[f];\n      if (p.fn)\n        p.fn === u && (!h || p.once) && (!d || p.context === d) && o(this, f);\n      else {\n        for (var y = 0, E = [], b = p.length; y < b; y++)\n          (p[y].fn !== u || h && !p[y].once || d && p[y].context !== d) && E.push(p[y]);\n        E.length ? this._events[f] = E.length === 1 ? E[0] : E : o(this, f);\n      }\n      return this;\n    }, a.prototype.removeAllListeners = function(c) {\n      var u;\n      return c ? (u = t ? t + c : c, this._events[u] && o(this, u)) : (this._events = new r(), this._eventsCount = 0), this;\n    }, a.prototype.off = a.prototype.removeListener, a.prototype.addListener = a.prototype.on, a.prefixed = t, a.EventEmitter = a, s.exports = a;\n  })(ol)), ol.exports;\n}\nvar qv = Hv();\nconst L0 = /* @__PURE__ */ Fc(qv);\nclass C0 extends Wf {\n  constructor(e, t) {\n    super(), this.finished = !1, this.destroyed = !1, Hf(e);\n    const r = Hc(t);\n    if (this.iHash = e.create(), typeof this.iHash.update != \"function\")\n      throw new Error(\"Expected instance of class which extends utils.Hash\");\n    this.blockLen = this.iHash.blockLen, this.outputLen = this.iHash.outputLen;\n    const n = this.blockLen, i = new Uint8Array(n);\n    i.set(r.length > n ? e.create().update(r).digest() : r);\n    for (let o = 0; o < i.length; o++)\n      i[o] ^= 54;\n    this.iHash.update(i), this.oHash = e.create();\n    for (let o = 0; o < i.length; o++)\n      i[o] ^= 106;\n    this.oHash.update(i), kn(i);\n  }\n  update(e) {\n    return Do(this), this.iHash.update(e), this;\n  }\n  digestInto(e) {\n    Do(this), Qs(e, this.outputLen), this.finished = !0, this.iHash.digestInto(e), this.oHash.update(e), this.oHash.digestInto(e), this.destroy();\n  }\n  digest() {\n    const e = new Uint8Array(this.oHash.outputLen);\n    return this.digestInto(e), e;\n  }\n  _cloneInto(e) {\n    e || (e = Object.create(Object.getPrototypeOf(this), {}));\n    const { oHash: t, iHash: r, finished: n, destroyed: i, blockLen: o, outputLen: a } = this;\n    return e = e, e.finished = n, e.destroyed = i, e.blockLen = o, e.outputLen = a, e.oHash = t._cloneInto(e.oHash), e.iHash = r._cloneInto(e.iHash), e;\n  }\n  clone() {\n    return this._cloneInto();\n  }\n  destroy() {\n    this.destroyed = !0, this.oHash.destroy(), this.iHash.destroy();\n  }\n}\nconst k0 = (s, e, t) => new C0(s, e).update(t).digest();\nk0.create = (s, e) => new C0(s, e);\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst Od = (s, e) => (s + (s >= 0 ? e : -e) / D0) / e;\nfunction Wv(s, e, t) {\n  const [[r, n], [i, o]] = e, a = Od(o * s, t), l = Od(-n * s, t);\n  let c = s - a * r - l * i, u = -a * n - l * o;\n  const d = c < hs, h = u < hs;\n  d && (c = -c), h && (u = -u);\n  const f = _i(Math.ceil(e0(t) / 2)) + Tn;\n  if (c < hs || c >= f || u < hs || u >= f)\n    throw new Error(\"splitScalar (endomorphism): failed, k=\" + s);\n  return { k1neg: d, k1: c, k2neg: h, k2: u };\n}\nfunction ec(s) {\n  if (![\"compact\", \"recovered\", \"der\"].includes(s))\n    throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n  return s;\n}\nfunction al(s, e) {\n  const t = {};\n  for (let r of Object.keys(e))\n    t[r] = s[r] === void 0 ? e[r] : s[r];\n  return Xs(t.lowS, \"lowS\"), Xs(t.prehash, \"prehash\"), t.format !== void 0 && ec(t.format), t;\n}\nclass zv extends Error {\n  constructor(e = \"\") {\n    super(e);\n  }\n}\nconst cs = {\n  // asn.1 DER encoding utils\n  Err: zv,\n  // Basic building block is TLV (Tag-Length-Value)\n  _tlv: {\n    encode: (s, e) => {\n      const { Err: t } = cs;\n      if (s < 0 || s > 256)\n        throw new t(\"tlv.encode: wrong tag\");\n      if (e.length & 1)\n        throw new t(\"tlv.encode: unpadded data\");\n      const r = e.length / 2, n = Ni(r);\n      if (n.length / 2 & 128)\n        throw new t(\"tlv.encode: long form length too big\");\n      const i = r > 127 ? Ni(n.length / 2 | 128) : \"\";\n      return Ni(s) + i + n + e;\n    },\n    // v - value, l - left bytes (unparsed)\n    decode(s, e) {\n      const { Err: t } = cs;\n      let r = 0;\n      if (s < 0 || s > 256)\n        throw new t(\"tlv.encode: wrong tag\");\n      if (e.length < 2 || e[r++] !== s)\n        throw new t(\"tlv.decode: wrong tlv\");\n      const n = e[r++], i = !!(n & 128);\n      let o = 0;\n      if (!i)\n        o = n;\n      else {\n        const l = n & 127;\n        if (!l)\n          throw new t(\"tlv.decode(long): indefinite length not supported\");\n        if (l > 4)\n          throw new t(\"tlv.decode(long): byte length is too big\");\n        const c = e.subarray(r, r + l);\n        if (c.length !== l)\n          throw new t(\"tlv.decode: length bytes not complete\");\n        if (c[0] === 0)\n          throw new t(\"tlv.decode(long): zero leftmost byte\");\n        for (const u of c)\n          o = o << 8 | u;\n        if (r += l, o < 128)\n          throw new t(\"tlv.decode(long): not minimal encoding\");\n      }\n      const a = e.subarray(r, r + o);\n      if (a.length !== o)\n        throw new t(\"tlv.decode: wrong value length\");\n      return { v: a, l: e.subarray(r + o) };\n    }\n  },\n  // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n  // since we always use positive integers here. It must always be empty:\n  // - add zero byte if exists\n  // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n  _int: {\n    encode(s) {\n      const { Err: e } = cs;\n      if (s < hs)\n        throw new e(\"integer: negative integers are not allowed\");\n      let t = Ni(s);\n      if (Number.parseInt(t[0], 16) & 8 && (t = \"00\" + t), t.length & 1)\n        throw new e(\"unexpected DER parsing assertion: unpadded hex\");\n      return t;\n    },\n    decode(s) {\n      const { Err: e } = cs;\n      if (s[0] & 128)\n        throw new e(\"invalid signature integer: negative\");\n      if (s[0] === 0 && !(s[1] & 128))\n        throw new e(\"invalid signature integer: unnecessary leading zero\");\n      return la(s);\n    }\n  },\n  toSig(s) {\n    const { Err: e, _int: t, _tlv: r } = cs, n = Et(\"signature\", s), { v: i, l: o } = r.decode(48, n);\n    if (o.length)\n      throw new e(\"invalid signature: left bytes after parsing\");\n    const { v: a, l } = r.decode(2, i), { v: c, l: u } = r.decode(2, l);\n    if (u.length)\n      throw new e(\"invalid signature: left bytes after parsing\");\n    return { r: t.decode(a), s: t.decode(c) };\n  },\n  hexFromSig(s) {\n    const { _tlv: e, _int: t } = cs, r = e.encode(2, t.encode(s.r)), n = e.encode(2, t.encode(s.s)), i = r + n;\n    return e.encode(48, i);\n  }\n}, hs = BigInt(0), Tn = BigInt(1), D0 = BigInt(2), Gi = BigInt(3), Yv = BigInt(4);\nfunction En(s, e) {\n  const { BYTES: t } = s;\n  let r;\n  if (typeof e == \"bigint\")\n    r = e;\n  else {\n    let n = Et(\"private key\", e);\n    try {\n      r = s.fromBytes(n);\n    } catch {\n      throw new Error(`invalid private key: expected ui8a of size ${t}, got ${typeof e}`);\n    }\n  }\n  if (!s.isValidNot0(r))\n    throw new Error(\"invalid private key: out of range [1..N-1]\");\n  return r;\n}\nfunction Zv(s, e = {}) {\n  const t = m0(\"weierstrass\", s, e), { Fp: r, Fn: n } = t;\n  let i = t.CURVE;\n  const { h: o, n: a } = i;\n  Ri(e, {}, {\n    allowInfinityPoint: \"boolean\",\n    clearCofactor: \"function\",\n    isTorsionFree: \"function\",\n    fromBytes: \"function\",\n    toBytes: \"function\",\n    endo: \"object\",\n    wrapPrivateKey: \"boolean\"\n  });\n  const { endo: l } = e;\n  if (l && (!r.is0(i.a) || typeof l.beta != \"bigint\" || !Array.isArray(l.basises)))\n    throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n  const c = M0(r, n);\n  function u() {\n    if (!r.isOdd)\n      throw new Error(\"compression is not supported: Field does not have .isOdd()\");\n  }\n  function d(W, _, g) {\n    const { x, y: w } = _.toAffine(), D = r.toBytes(x);\n    if (Xs(g, \"isCompressed\"), g) {\n      u();\n      const O = !r.isOdd(w);\n      return Kr(P0(O), D);\n    } else\n      return Kr(Uint8Array.of(4), D, r.toBytes(w));\n  }\n  function h(W) {\n    Or(W, void 0, \"Point\");\n    const { publicKey: _, publicKeyUncompressed: g } = c, x = W.length, w = W[0], D = W.subarray(1);\n    if (x === _ && (w === 2 || w === 3)) {\n      const O = r.fromBytes(D);\n      if (!r.isValid(O))\n        throw new Error(\"bad point: is not on curve, wrong x\");\n      const U = y(O);\n      let V;\n      try {\n        V = r.sqrt(U);\n      } catch (v) {\n        const P = v instanceof Error ? \": \" + v.message : \"\";\n        throw new Error(\"bad point: is not on curve, sqrt error\" + P);\n      }\n      u();\n      const L = r.isOdd(V);\n      return (w & 1) === 1 !== L && (V = r.neg(V)), { x: O, y: V };\n    } else if (x === g && w === 4) {\n      const O = r.BYTES, U = r.fromBytes(D.subarray(0, O)), V = r.fromBytes(D.subarray(O, O * 2));\n      if (!E(U, V))\n        throw new Error(\"bad point: is not on curve\");\n      return { x: U, y: V };\n    } else\n      throw new Error(`bad point: got length ${x}, expected compressed=${_} or uncompressed=${g}`);\n  }\n  const f = e.toBytes || d, p = e.fromBytes || h;\n  function y(W) {\n    const _ = r.sqr(W), g = r.mul(_, W);\n    return r.add(r.add(g, r.mul(W, i.a)), i.b);\n  }\n  function E(W, _) {\n    const g = r.sqr(_), x = y(W);\n    return r.eql(g, x);\n  }\n  if (!E(i.Gx, i.Gy))\n    throw new Error(\"bad curve params: generator point\");\n  const b = r.mul(r.pow(i.a, Gi), Yv), R = r.mul(r.sqr(i.b), BigInt(27));\n  if (r.is0(r.add(b, R)))\n    throw new Error(\"bad curve params: a or b\");\n  function A(W, _, g = !1) {\n    if (!r.isValid(_) || g && r.is0(_))\n      throw new Error(`bad point coordinate ${W}`);\n    return _;\n  }\n  function F(W) {\n    if (!(W instanceof C))\n      throw new Error(\"ProjectivePoint expected\");\n  }\n  function M(W) {\n    if (!l || !l.basises)\n      throw new Error(\"no endo\");\n    return Wv(W, l.basises, n.ORDER);\n  }\n  const H = Mo((W, _) => {\n    const { X: g, Y: x, Z: w } = W;\n    if (r.eql(w, r.ONE))\n      return { x: g, y: x };\n    const D = W.is0();\n    _ == null && (_ = D ? r.ONE : r.inv(w));\n    const O = r.mul(g, _), U = r.mul(x, _), V = r.mul(w, _);\n    if (D)\n      return { x: r.ZERO, y: r.ZERO };\n    if (!r.eql(V, r.ONE))\n      throw new Error(\"invZ was invalid\");\n    return { x: O, y: U };\n  }), K = Mo((W) => {\n    if (W.is0()) {\n      if (e.allowInfinityPoint && !r.is0(W.Y))\n        return;\n      throw new Error(\"bad point: ZERO\");\n    }\n    const { x: _, y: g } = W.toAffine();\n    if (!r.isValid(_) || !r.isValid(g))\n      throw new Error(\"bad point: x or y not field elements\");\n    if (!E(_, g))\n      throw new Error(\"bad point: equation left != right\");\n    if (!W.isTorsionFree())\n      throw new Error(\"bad point: not in prime-order subgroup\");\n    return !0;\n  });\n  function j(W, _, g, x, w) {\n    return g = new C(r.mul(g.X, W), g.Y, g.Z), _ = Oo(x, _), g = Oo(w, g), _.add(g);\n  }\n  class C {\n    /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n    constructor(_, g, x) {\n      this.X = A(\"x\", _), this.Y = A(\"y\", g, !0), this.Z = A(\"z\", x), Object.freeze(this);\n    }\n    static CURVE() {\n      return i;\n    }\n    /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n    static fromAffine(_) {\n      const { x: g, y: x } = _ || {};\n      if (!_ || !r.isValid(g) || !r.isValid(x))\n        throw new Error(\"invalid affine point\");\n      if (_ instanceof C)\n        throw new Error(\"projective point not allowed\");\n      return r.is0(g) && r.is0(x) ? C.ZERO : new C(g, x, r.ONE);\n    }\n    static fromBytes(_) {\n      const g = C.fromAffine(p(Or(_, void 0, \"point\")));\n      return g.assertValidity(), g;\n    }\n    static fromHex(_) {\n      return C.fromBytes(Et(\"pointHex\", _));\n    }\n    get x() {\n      return this.toAffine().x;\n    }\n    get y() {\n      return this.toAffine().y;\n    }\n    /**\n     *\n     * @param windowSize\n     * @param isLazy true will defer table computation until the first multiplication\n     * @returns\n     */\n    precompute(_ = 8, g = !0) {\n      return $.createCache(this, _), g || this.multiply(Gi), this;\n    }\n    // TODO: return `this`\n    /** A point on curve is valid if it conforms to equation. */\n    assertValidity() {\n      K(this);\n    }\n    hasEvenY() {\n      const { y: _ } = this.toAffine();\n      if (!r.isOdd)\n        throw new Error(\"Field doesn't support isOdd\");\n      return !r.isOdd(_);\n    }\n    /** Compare one point to another. */\n    equals(_) {\n      F(_);\n      const { X: g, Y: x, Z: w } = this, { X: D, Y: O, Z: U } = _, V = r.eql(r.mul(g, U), r.mul(D, w)), L = r.eql(r.mul(x, U), r.mul(O, w));\n      return V && L;\n    }\n    /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n    negate() {\n      return new C(this.X, r.neg(this.Y), this.Z);\n    }\n    // Renes-Costello-Batina exception-free doubling formula.\n    // There is 30% faster Jacobian formula, but it is not complete.\n    // https://eprint.iacr.org/2015/1060, algorithm 3\n    // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n    double() {\n      const { a: _, b: g } = i, x = r.mul(g, Gi), { X: w, Y: D, Z: O } = this;\n      let U = r.ZERO, V = r.ZERO, L = r.ZERO, m = r.mul(w, w), v = r.mul(D, D), P = r.mul(O, O), N = r.mul(w, D);\n      return N = r.add(N, N), L = r.mul(w, O), L = r.add(L, L), U = r.mul(_, L), V = r.mul(x, P), V = r.add(U, V), U = r.sub(v, V), V = r.add(v, V), V = r.mul(U, V), U = r.mul(N, U), L = r.mul(x, L), P = r.mul(_, P), N = r.sub(m, P), N = r.mul(_, N), N = r.add(N, L), L = r.add(m, m), m = r.add(L, m), m = r.add(m, P), m = r.mul(m, N), V = r.add(V, m), P = r.mul(D, O), P = r.add(P, P), m = r.mul(P, N), U = r.sub(U, m), L = r.mul(P, v), L = r.add(L, L), L = r.add(L, L), new C(U, V, L);\n    }\n    // Renes-Costello-Batina exception-free addition formula.\n    // There is 30% faster Jacobian formula, but it is not complete.\n    // https://eprint.iacr.org/2015/1060, algorithm 1\n    // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n    add(_) {\n      F(_);\n      const { X: g, Y: x, Z: w } = this, { X: D, Y: O, Z: U } = _;\n      let V = r.ZERO, L = r.ZERO, m = r.ZERO;\n      const v = i.a, P = r.mul(i.b, Gi);\n      let N = r.mul(g, D), Y = r.mul(x, O), ee = r.mul(w, U), ie = r.add(g, x), le = r.add(D, O);\n      ie = r.mul(ie, le), le = r.add(N, Y), ie = r.sub(ie, le), le = r.add(g, w);\n      let Te = r.add(D, U);\n      return le = r.mul(le, Te), Te = r.add(N, ee), le = r.sub(le, Te), Te = r.add(x, w), V = r.add(O, U), Te = r.mul(Te, V), V = r.add(Y, ee), Te = r.sub(Te, V), m = r.mul(v, le), V = r.mul(P, ee), m = r.add(V, m), V = r.sub(Y, m), m = r.add(Y, m), L = r.mul(V, m), Y = r.add(N, N), Y = r.add(Y, N), ee = r.mul(v, ee), le = r.mul(P, le), Y = r.add(Y, ee), ee = r.sub(N, ee), ee = r.mul(v, ee), le = r.add(le, ee), N = r.mul(Y, le), L = r.add(L, N), N = r.mul(Te, le), V = r.mul(ie, V), V = r.sub(V, N), N = r.mul(ie, Y), m = r.mul(Te, m), m = r.add(m, N), new C(V, L, m);\n    }\n    subtract(_) {\n      return this.add(_.negate());\n    }\n    is0() {\n      return this.equals(C.ZERO);\n    }\n    /**\n     * Constant time multiplication.\n     * Uses wNAF method. Windowed method may be 10% faster,\n     * but takes 2x longer to generate and consumes 2x memory.\n     * Uses precomputes when available.\n     * Uses endomorphism for Koblitz curves.\n     * @param scalar by which the point would be multiplied\n     * @returns New point\n     */\n    multiply(_) {\n      const { endo: g } = e;\n      if (!n.isValidNot0(_))\n        throw new Error(\"invalid scalar: out of range\");\n      let x, w;\n      const D = (O) => $.cached(this, O, (U) => js(C, U));\n      if (g) {\n        const { k1neg: O, k1: U, k2neg: V, k2: L } = M(_), { p: m, f: v } = D(U), { p: P, f: N } = D(L);\n        w = v.add(N), x = j(g.beta, m, P, O, V);\n      } else {\n        const { p: O, f: U } = D(_);\n        x = O, w = U;\n      }\n      return js(C, [x, w])[0];\n    }\n    /**\n     * Non-constant-time multiplication. Uses double-and-add algorithm.\n     * It's faster, but should only be used when you don't care about\n     * an exposed secret key e.g. sig verification, which works over *public* keys.\n     */\n    multiplyUnsafe(_) {\n      const { endo: g } = e, x = this;\n      if (!n.isValid(_))\n        throw new Error(\"invalid scalar: out of range\");\n      if (_ === hs || x.is0())\n        return C.ZERO;\n      if (_ === Tn)\n        return x;\n      if ($.hasCache(this))\n        return this.multiply(_);\n      if (g) {\n        const { k1neg: w, k1: D, k2neg: O, k2: U } = M(_), { p1: V, p2: L } = py(C, x, D, U);\n        return j(g.beta, V, L, w, O);\n      } else\n        return $.unsafe(x, _);\n    }\n    multiplyAndAddUnsafe(_, g, x) {\n      const w = this.multiplyUnsafe(g).add(_.multiplyUnsafe(x));\n      return w.is0() ? void 0 : w;\n    }\n    /**\n     * Converts Projective point to affine (x, y) coordinates.\n     * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n     */\n    toAffine(_) {\n      return H(this, _);\n    }\n    /**\n     * Checks whether Point is free of torsion elements (is in prime subgroup).\n     * Always torsion-free for cofactor=1 curves.\n     */\n    isTorsionFree() {\n      const { isTorsionFree: _ } = e;\n      return o === Tn ? !0 : _ ? _(C, this) : $.unsafe(this, a).is0();\n    }\n    clearCofactor() {\n      const { clearCofactor: _ } = e;\n      return o === Tn ? this : _ ? _(C, this) : this.multiplyUnsafe(o);\n    }\n    isSmallOrder() {\n      return this.multiplyUnsafe(o).is0();\n    }\n    toBytes(_ = !0) {\n      return Xs(_, \"isCompressed\"), this.assertValidity(), f(C, this, _);\n    }\n    toHex(_ = !0) {\n      return Hs(this.toBytes(_));\n    }\n    toString() {\n      return `<Point ${this.is0() ? \"ZERO\" : this.toHex()}>`;\n    }\n    // TODO: remove\n    get px() {\n      return this.X;\n    }\n    get py() {\n      return this.X;\n    }\n    get pz() {\n      return this.Z;\n    }\n    toRawBytes(_ = !0) {\n      return this.toBytes(_);\n    }\n    _setWindowSize(_) {\n      this.precompute(_);\n    }\n    static normalizeZ(_) {\n      return js(C, _);\n    }\n    static msm(_, g) {\n      return p0(C, n, _, g);\n    }\n    static fromPrivateKey(_) {\n      return C.BASE.multiply(En(n, _));\n    }\n  }\n  C.BASE = new C(i.Gx, i.Gy, r.ONE), C.ZERO = new C(r.ZERO, r.ONE, r.ZERO), C.Fp = r, C.Fn = n;\n  const k = n.BITS, $ = new g0(C, e.endo ? Math.ceil(k / 2) : k);\n  return C.BASE.precompute(8), C;\n}\nfunction P0(s) {\n  return Uint8Array.of(s ? 2 : 3);\n}\nfunction M0(s, e) {\n  return {\n    secretKey: e.BYTES,\n    publicKey: 1 + s.BYTES,\n    publicKeyUncompressed: 1 + 2 * s.BYTES,\n    publicKeyHasPrefix: !0,\n    signature: 2 * e.BYTES\n  };\n}\nfunction Xv(s, e = {}) {\n  const { Fn: t } = s, r = e.randomBytes || qc, n = Object.assign(M0(s.Fp, t), { seed: d0(t.ORDER) });\n  function i(f) {\n    try {\n      return !!En(t, f);\n    } catch {\n      return !1;\n    }\n  }\n  function o(f, p) {\n    const { publicKey: y, publicKeyUncompressed: E } = n;\n    try {\n      const b = f.length;\n      return p === !0 && b !== y || p === !1 && b !== E ? !1 : !!s.fromBytes(f);\n    } catch {\n      return !1;\n    }\n  }\n  function a(f = r(n.seed)) {\n    return hy(Or(f, n.seed, \"seed\"), t.ORDER);\n  }\n  function l(f, p = !0) {\n    return s.BASE.multiply(En(t, f)).toBytes(p);\n  }\n  function c(f) {\n    const p = a(f);\n    return { secretKey: p, publicKey: l(p) };\n  }\n  function u(f) {\n    if (typeof f == \"bigint\")\n      return !1;\n    if (f instanceof s)\n      return !0;\n    const { secretKey: p, publicKey: y, publicKeyUncompressed: E } = n;\n    if (t.allowedLengths || p === y)\n      return;\n    const b = Et(\"key\", f).length;\n    return b === y || b === E;\n  }\n  function d(f, p, y = !0) {\n    if (u(f) === !0)\n      throw new Error(\"first arg must be private key\");\n    if (u(p) === !1)\n      throw new Error(\"second arg must be public key\");\n    const E = En(t, f);\n    return s.fromHex(p).multiply(E).toBytes(y);\n  }\n  return Object.freeze({ getPublicKey: l, getSharedSecret: d, keygen: c, Point: s, utils: {\n    isValidSecretKey: i,\n    isValidPublicKey: o,\n    randomSecretKey: a,\n    // TODO: remove\n    isValidPrivateKey: i,\n    randomPrivateKey: a,\n    normPrivateKeyToScalar: (f) => En(t, f),\n    precompute(f = 8, p = s.BASE) {\n      return p.precompute(f, !1);\n    }\n  }, lengths: n });\n}\nfunction Jv(s, e, t = {}) {\n  Hf(e), Ri(t, {}, {\n    hmac: \"function\",\n    lowS: \"boolean\",\n    randomBytes: \"function\",\n    bits2int: \"function\",\n    bits2int_modN: \"function\"\n  });\n  const r = t.randomBytes || qc, n = t.hmac || ((g, ...x) => k0(e, g, Kr(...x))), { Fp: i, Fn: o } = s, { ORDER: a, BITS: l } = o, { keygen: c, getPublicKey: u, getSharedSecret: d, utils: h, lengths: f } = Xv(s, t), p = {\n    prehash: !1,\n    lowS: typeof t.lowS == \"boolean\" ? t.lowS : !1,\n    format: void 0,\n    //'compact' as ECDSASigFormat,\n    extraEntropy: !1\n  }, y = \"compact\";\n  function E(g) {\n    const x = a >> Tn;\n    return g > x;\n  }\n  function b(g, x) {\n    if (!o.isValidNot0(x))\n      throw new Error(`invalid signature ${g}: out of range 1..Point.Fn.ORDER`);\n    return x;\n  }\n  function R(g, x) {\n    ec(x);\n    const w = f.signature, D = x === \"compact\" ? w : x === \"recovered\" ? w + 1 : void 0;\n    return Or(g, D, `${x} signature`);\n  }\n  class A {\n    constructor(x, w, D) {\n      this.r = b(\"r\", x), this.s = b(\"s\", w), D != null && (this.recovery = D), Object.freeze(this);\n    }\n    static fromBytes(x, w = y) {\n      R(x, w);\n      let D;\n      if (w === \"der\") {\n        const { r: L, s: m } = cs.toSig(Or(x));\n        return new A(L, m);\n      }\n      w === \"recovered\" && (D = x[0], w = \"compact\", x = x.subarray(1));\n      const O = o.BYTES, U = x.subarray(0, O), V = x.subarray(O, O * 2);\n      return new A(o.fromBytes(U), o.fromBytes(V), D);\n    }\n    static fromHex(x, w) {\n      return this.fromBytes(Po(x), w);\n    }\n    addRecoveryBit(x) {\n      return new A(this.r, this.s, x);\n    }\n    recoverPublicKey(x) {\n      const w = i.ORDER, { r: D, s: O, recovery: U } = this;\n      if (U == null || ![0, 1, 2, 3].includes(U))\n        throw new Error(\"recovery id invalid\");\n      if (a * D0 < w && U > 1)\n        throw new Error(\"recovery id is ambiguous for h>1 curve\");\n      const L = U === 2 || U === 3 ? D + a : D;\n      if (!i.isValid(L))\n        throw new Error(\"recovery id 2 or 3 invalid\");\n      const m = i.toBytes(L), v = s.fromBytes(Kr(P0((U & 1) === 0), m)), P = o.inv(L), N = M(Et(\"msgHash\", x)), Y = o.create(-N * P), ee = o.create(O * P), ie = s.BASE.multiplyUnsafe(Y).add(v.multiplyUnsafe(ee));\n      if (ie.is0())\n        throw new Error(\"point at infinify\");\n      return ie.assertValidity(), ie;\n    }\n    // Signatures should be low-s, to prevent malleability.\n    hasHighS() {\n      return E(this.s);\n    }\n    toBytes(x = y) {\n      if (ec(x), x === \"der\")\n        return Po(cs.hexFromSig(this));\n      const w = o.toBytes(this.r), D = o.toBytes(this.s);\n      if (x === \"recovered\") {\n        if (this.recovery == null)\n          throw new Error(\"recovery bit must be present\");\n        return Kr(Uint8Array.of(this.recovery), w, D);\n      }\n      return Kr(w, D);\n    }\n    toHex(x) {\n      return Hs(this.toBytes(x));\n    }\n    // TODO: remove\n    assertValidity() {\n    }\n    static fromCompact(x) {\n      return A.fromBytes(Et(\"sig\", x), \"compact\");\n    }\n    static fromDER(x) {\n      return A.fromBytes(Et(\"sig\", x), \"der\");\n    }\n    normalizeS() {\n      return this.hasHighS() ? new A(this.r, o.neg(this.s), this.recovery) : this;\n    }\n    toDERRawBytes() {\n      return this.toBytes(\"der\");\n    }\n    toDERHex() {\n      return Hs(this.toBytes(\"der\"));\n    }\n    toCompactRawBytes() {\n      return this.toBytes(\"compact\");\n    }\n    toCompactHex() {\n      return Hs(this.toBytes(\"compact\"));\n    }\n  }\n  const F = t.bits2int || function(x) {\n    if (x.length > 8192)\n      throw new Error(\"input is too large\");\n    const w = la(x), D = x.length * 8 - l;\n    return D > 0 ? w >> BigInt(D) : w;\n  }, M = t.bits2int_modN || function(x) {\n    return o.create(F(x));\n  }, H = _i(l);\n  function K(g) {\n    return Ql(\"num < 2^\" + l, g, hs, H), o.toBytes(g);\n  }\n  function j(g, x) {\n    return Or(g, void 0, \"message\"), x ? Or(e(g), void 0, \"prehashed message\") : g;\n  }\n  function C(g, x, w) {\n    if ([\"recovered\", \"canonical\"].some((Y) => Y in w))\n      throw new Error(\"sign() legacy options not supported\");\n    const { lowS: D, prehash: O, extraEntropy: U } = al(w, p);\n    g = j(g, O);\n    const V = M(g), L = En(o, x), m = [K(L), K(V)];\n    if (U != null && U !== !1) {\n      const Y = U === !0 ? r(f.secretKey) : U;\n      m.push(Et(\"extraEntropy\", Y));\n    }\n    const v = Kr(...m), P = V;\n    function N(Y) {\n      const ee = F(Y);\n      if (!o.isValidNot0(ee))\n        return;\n      const ie = o.inv(ee), le = s.BASE.multiply(ee).toAffine(), Te = o.create(le.x);\n      if (Te === hs)\n        return;\n      const De = o.create(ie * o.create(P + Te * L));\n      if (De === hs)\n        return;\n      let ze = (le.x === Te ? 0 : 2) | Number(le.y & Tn), _e = De;\n      return D && E(De) && (_e = o.neg(De), ze ^= 1), new A(Te, _e, ze);\n    }\n    return { seed: v, k2sig: N };\n  }\n  function k(g, x, w = {}) {\n    g = Et(\"message\", g);\n    const { seed: D, k2sig: O } = C(g, x, w);\n    return ry(e.outputLen, o.BYTES, n)(D, O);\n  }\n  function $(g) {\n    let x;\n    const w = typeof g == \"string\" || Ii(g), D = !w && g !== null && typeof g == \"object\" && typeof g.r == \"bigint\" && typeof g.s == \"bigint\";\n    if (!w && !D)\n      throw new Error(\"invalid signature, expected Uint8Array, hex string or Signature instance\");\n    if (D)\n      x = new A(g.r, g.s);\n    else if (w) {\n      try {\n        x = A.fromBytes(Et(\"sig\", g), \"der\");\n      } catch (O) {\n        if (!(O instanceof cs.Err))\n          throw O;\n      }\n      if (!x)\n        try {\n          x = A.fromBytes(Et(\"sig\", g), \"compact\");\n        } catch {\n          return !1;\n        }\n    }\n    return x || !1;\n  }\n  function W(g, x, w, D = {}) {\n    const { lowS: O, prehash: U, format: V } = al(D, p);\n    if (w = Et(\"publicKey\", w), x = j(Et(\"message\", x), U), \"strict\" in D)\n      throw new Error(\"options.strict was renamed to lowS\");\n    const L = V === void 0 ? $(g) : A.fromBytes(Et(\"sig\", g), V);\n    if (L === !1)\n      return !1;\n    try {\n      const m = s.fromBytes(w);\n      if (O && L.hasHighS())\n        return !1;\n      const { r: v, s: P } = L, N = M(x), Y = o.inv(P), ee = o.create(N * Y), ie = o.create(v * Y), le = s.BASE.multiplyUnsafe(ee).add(m.multiplyUnsafe(ie));\n      return le.is0() ? !1 : o.create(le.x) === v;\n    } catch {\n      return !1;\n    }\n  }\n  function _(g, x, w = {}) {\n    const { prehash: D } = al(w, p);\n    return x = j(x, D), A.fromBytes(g, \"recovered\").recoverPublicKey(x).toBytes();\n  }\n  return Object.freeze({\n    keygen: c,\n    getPublicKey: u,\n    getSharedSecret: d,\n    utils: h,\n    lengths: f,\n    Point: s,\n    sign: k,\n    verify: W,\n    recoverPublicKey: _,\n    Signature: A,\n    hash: e\n  });\n}\nfunction Qv(s) {\n  const e = {\n    a: s.a,\n    b: s.b,\n    p: s.Fp.ORDER,\n    n: s.n,\n    h: s.h,\n    Gx: s.Gx,\n    Gy: s.Gy\n  }, t = s.Fp;\n  let r = s.allowedPrivateKeyLengths ? Array.from(new Set(s.allowedPrivateKeyLengths.map((o) => Math.ceil(o / 2)))) : void 0;\n  const n = en(e.n, {\n    BITS: s.nBitLength,\n    allowedLengths: r,\n    modFromBytes: s.wrapPrivateKey\n  }), i = {\n    Fp: t,\n    Fn: n,\n    allowInfinityPoint: s.allowInfinityPoint,\n    endo: s.endo,\n    isTorsionFree: s.isTorsionFree,\n    clearCofactor: s.clearCofactor,\n    fromBytes: s.fromBytes,\n    toBytes: s.toBytes\n  };\n  return { CURVE: e, curveOpts: i };\n}\nfunction eE(s) {\n  const { CURVE: e, curveOpts: t } = Qv(s), r = {\n    hmac: s.hmac,\n    randomBytes: s.randomBytes,\n    lowS: s.lowS,\n    bits2int: s.bits2int,\n    bits2int_modN: s.bits2int_modN\n  };\n  return { CURVE: e, curveOpts: t, hash: s.hash, ecdsaOpts: r };\n}\nfunction tE(s, e) {\n  const t = e.Point;\n  return Object.assign({}, e, {\n    ProjectivePoint: t,\n    CURVE: Object.assign({}, s, c0(t.Fn.ORDER, t.Fn.BITS))\n  });\n}\nfunction rE(s) {\n  const { CURVE: e, curveOpts: t, hash: r, ecdsaOpts: n } = eE(s), i = Zv(e, t), o = Jv(i, r, n);\n  return tE(s, o);\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nfunction sE(s, e) {\n  const t = (r) => rE({ ...s, hash: r });\n  return { ...t(e), create: t };\n}\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nconst tu = {\n  p: BigInt(\"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f\"),\n  n: BigInt(\"0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141\"),\n  h: BigInt(1),\n  a: BigInt(0),\n  b: BigInt(7),\n  Gx: BigInt(\"0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798\"),\n  Gy: BigInt(\"0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8\")\n}, nE = {\n  beta: BigInt(\"0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee\"),\n  basises: [\n    [BigInt(\"0x3086d221a7d46bcde86c90e49284eb15\"), -BigInt(\"0xe4437ed6010e88286f547fa90abfe4c3\")],\n    [BigInt(\"0x114ca50f7a8e2f3f657c1108d9d44cfd8\"), BigInt(\"0x3086d221a7d46bcde86c90e49284eb15\")]\n  ]\n}, Bd = /* @__PURE__ */ BigInt(2);\nfunction iE(s) {\n  const e = tu.p, t = BigInt(3), r = BigInt(6), n = BigInt(11), i = BigInt(22), o = BigInt(23), a = BigInt(44), l = BigInt(88), c = s * s * s % e, u = c * c * s % e, d = vt(u, t, e) * u % e, h = vt(d, t, e) * u % e, f = vt(h, Bd, e) * c % e, p = vt(f, n, e) * f % e, y = vt(p, i, e) * p % e, E = vt(y, a, e) * y % e, b = vt(E, l, e) * E % e, R = vt(b, a, e) * y % e, A = vt(R, t, e) * u % e, F = vt(A, o, e) * p % e, M = vt(F, r, e) * c % e, H = vt(M, Bd, e);\n  if (!tc.eql(tc.sqr(H), s))\n    throw new Error(\"Cannot find square root\");\n  return H;\n}\nconst tc = en(tu.p, { sqrt: iE }), oE = sE({ ...tu, Fp: tc, lowS: !0, endo: nE }, Xf);\nLi.utils.randomPrivateKey;\nLi.getPublicKey;\nfunction Fd(s) {\n  try {\n    return Li.ExtendedPoint.fromHex(s), !0;\n  } catch {\n    return !1;\n  }\n}\nconst O0 = (s, e) => Li.sign(s, e.slice(0, 32)), aE = Li.verify, ru = (s) => He.Buffer.isBuffer(s) ? s : s instanceof Uint8Array ? He.Buffer.from(s.buffer, s.byteOffset, s.byteLength) : He.Buffer.from(s);\nclass lE {\n  constructor(e) {\n    Object.assign(this, e);\n  }\n  encode() {\n    return He.Buffer.from(Ja.serialize(uo, this));\n  }\n  static decode(e) {\n    return Ja.deserialize(uo, this, e);\n  }\n  static decodeUnchecked(e) {\n    return Ja.deserializeUnchecked(uo, this, e);\n  }\n}\nconst uo = /* @__PURE__ */ new Map();\nvar B0;\nconst cE = 32, ks = 32;\nfunction uE(s) {\n  return s._bn !== void 0;\n}\nlet Nd = 1;\nclass Oe extends lE {\n  /**\n   * Create a new PublicKey object\n   * @param value ed25519 public key as buffer or base-58 encoded string\n   */\n  constructor(e) {\n    if (super({}), this._bn = void 0, uE(e))\n      this._bn = e._bn;\n    else {\n      if (typeof e == \"string\") {\n        const t = ar.decode(e);\n        if (t.length != ks)\n          throw new Error(\"Invalid public key input\");\n        this._bn = new bd(t);\n      } else\n        this._bn = new bd(e);\n      if (this._bn.byteLength() > ks)\n        throw new Error(\"Invalid public key input\");\n    }\n  }\n  /**\n   * Returns a unique PublicKey for tests and benchmarks using a counter\n   */\n  static unique() {\n    const e = new Oe(Nd);\n    return Nd += 1, new Oe(e.toBuffer());\n  }\n  /**\n   * Default public key value. The base58-encoded string representation is all ones (as seen below)\n   * The underlying BN number is 32 bytes that are all zeros\n   */\n  /**\n   * Checks if two publicKeys are equal\n   */\n  equals(e) {\n    return this._bn.eq(e._bn);\n  }\n  /**\n   * Return the base-58 representation of the public key\n   */\n  toBase58() {\n    return ar.encode(this.toBytes());\n  }\n  toJSON() {\n    return this.toBase58();\n  }\n  /**\n   * Return the byte array representation of the public key in big endian\n   */\n  toBytes() {\n    const e = this.toBuffer();\n    return new Uint8Array(e.buffer, e.byteOffset, e.byteLength);\n  }\n  /**\n   * Return the Buffer representation of the public key in big endian\n   */\n  toBuffer() {\n    const e = this._bn.toArrayLike(He.Buffer);\n    if (e.length === ks)\n      return e;\n    const t = He.Buffer.alloc(32);\n    return e.copy(t, 32 - e.length), t;\n  }\n  get [Symbol.toStringTag]() {\n    return `PublicKey(${this.toString()})`;\n  }\n  /**\n   * Return the base-58 representation of the public key\n   */\n  toString() {\n    return this.toBase58();\n  }\n  /**\n   * Derive a public key from another key, a seed, and a program ID.\n   * The program ID will also serve as the owner of the public key, giving\n   * it permission to write data to the account.\n   */\n  /* eslint-disable require-await */\n  static async createWithSeed(e, t, r) {\n    const n = He.Buffer.concat([e.toBuffer(), He.Buffer.from(t), r.toBuffer()]), i = Id(n);\n    return new Oe(i);\n  }\n  /**\n   * Derive a program address from seeds and a program ID.\n   */\n  /* eslint-disable require-await */\n  static createProgramAddressSync(e, t) {\n    let r = He.Buffer.alloc(0);\n    e.forEach(function(i) {\n      if (i.length > cE)\n        throw new TypeError(\"Max seed length exceeded\");\n      r = He.Buffer.concat([r, ru(i)]);\n    }), r = He.Buffer.concat([r, t.toBuffer(), He.Buffer.from(\"ProgramDerivedAddress\")]);\n    const n = Id(r);\n    if (Fd(n))\n      throw new Error(\"Invalid seeds, address must fall off the curve\");\n    return new Oe(n);\n  }\n  /**\n   * Async version of createProgramAddressSync\n   * For backwards compatibility\n   *\n   * @deprecated Use {@link createProgramAddressSync} instead\n   */\n  /* eslint-disable require-await */\n  static async createProgramAddress(e, t) {\n    return this.createProgramAddressSync(e, t);\n  }\n  /**\n   * Find a valid program address\n   *\n   * Valid program addresses must fall off the ed25519 curve.  This function\n   * iterates a nonce until it finds one that when combined with the seeds\n   * results in a valid program address.\n   */\n  static findProgramAddressSync(e, t) {\n    let r = 255, n;\n    for (; r != 0; ) {\n      try {\n        const i = e.concat(He.Buffer.from([r]));\n        n = this.createProgramAddressSync(i, t);\n      } catch (i) {\n        if (i instanceof TypeError)\n          throw i;\n        r--;\n        continue;\n      }\n      return [n, r];\n    }\n    throw new Error(\"Unable to find a viable program address nonce\");\n  }\n  /**\n   * Async version of findProgramAddressSync\n   * For backwards compatibility\n   *\n   * @deprecated Use {@link findProgramAddressSync} instead\n   */\n  static async findProgramAddress(e, t) {\n    return this.findProgramAddressSync(e, t);\n  }\n  /**\n   * Check that a pubkey is on the ed25519 curve.\n   */\n  static isOnCurve(e) {\n    const t = new Oe(e);\n    return Fd(t.toBytes());\n  }\n}\nB0 = Oe;\nOe.default = new B0(\"11111111111111111111111111111111\");\nuo.set(Oe, {\n  kind: \"struct\",\n  fields: [[\"_bn\", \"u256\"]]\n});\nnew Oe(\"BPFLoader1111111111111111111111111111111111\");\nconst wn = 1232, su = 127, Go = 64;\nclass Vo {\n  constructor(e, t) {\n    this.staticAccountKeys = void 0, this.accountKeysFromLookups = void 0, this.staticAccountKeys = e, this.accountKeysFromLookups = t;\n  }\n  keySegments() {\n    const e = [this.staticAccountKeys];\n    return this.accountKeysFromLookups && (e.push(this.accountKeysFromLookups.writable), e.push(this.accountKeysFromLookups.readonly)), e;\n  }\n  get(e) {\n    for (const t of this.keySegments()) {\n      if (e < t.length)\n        return t[e];\n      e -= t.length;\n    }\n  }\n  get length() {\n    return this.keySegments().flat().length;\n  }\n  compileInstructions(e) {\n    if (this.length > 256)\n      throw new Error(\"Account index overflow encountered during compilation\");\n    const r = /* @__PURE__ */ new Map();\n    this.keySegments().flat().forEach((i, o) => {\n      r.set(i.toBase58(), o);\n    });\n    const n = (i) => {\n      const o = r.get(i.toBase58());\n      if (o === void 0) throw new Error(\"Encountered an unknown instruction account key during compilation\");\n      return o;\n    };\n    return e.map((i) => ({\n      programIdIndex: n(i.programId),\n      accountKeyIndexes: i.keys.map((o) => n(o.pubkey)),\n      data: i.data\n    }));\n  }\n}\nconst We = (s = \"publicKey\") => z.blob(32, s), dE = (s = \"signature\") => z.blob(64, s), xn = (s = \"string\") => {\n  const e = z.struct([z.u32(\"length\"), z.u32(\"lengthPadding\"), z.blob(z.offset(z.u32(), -8), \"chars\")], s), t = e.decode.bind(e), r = e.encode.bind(e), n = e;\n  return n.decode = (i, o) => t(i, o).chars.toString(), n.encode = (i, o, a) => {\n    const l = {\n      chars: He.Buffer.from(i, \"utf8\")\n    };\n    return r(l, o, a);\n  }, n.alloc = (i) => z.u32().span + z.u32().span + He.Buffer.from(i, \"utf8\").length, n;\n}, hE = (s = \"authorized\") => z.struct([We(\"staker\"), We(\"withdrawer\")], s), fE = (s = \"lockup\") => z.struct([z.ns64(\"unixTimestamp\"), z.ns64(\"epoch\"), We(\"custodian\")], s), gE = (s = \"voteInit\") => z.struct([We(\"nodePubkey\"), We(\"authorizedVoter\"), We(\"authorizedWithdrawer\"), z.u8(\"commission\")], s), pE = (s = \"voteAuthorizeWithSeedArgs\") => z.struct([z.u32(\"voteAuthorizationType\"), We(\"currentAuthorityDerivedKeyOwnerPubkey\"), xn(\"currentAuthorityDerivedKeySeed\"), We(\"newAuthorized\")], s);\nfunction Er(s) {\n  let e = 0, t = 0;\n  for (; ; ) {\n    let r = s.shift();\n    if (e |= (r & 127) << t * 7, t += 1, (r & 128) === 0)\n      break;\n  }\n  return e;\n}\nfunction xr(s, e) {\n  let t = e;\n  for (; ; ) {\n    let r = t & 127;\n    if (t >>= 7, t == 0) {\n      s.push(r);\n      break;\n    } else\n      r |= 128, s.push(r);\n  }\n}\nfunction Kt(s, e) {\n  if (!s)\n    throw new Error(e || \"Assertion failed\");\n}\nclass fa {\n  constructor(e, t) {\n    this.payer = void 0, this.keyMetaMap = void 0, this.payer = e, this.keyMetaMap = t;\n  }\n  static compile(e, t) {\n    const r = /* @__PURE__ */ new Map(), n = (o) => {\n      const a = o.toBase58();\n      let l = r.get(a);\n      return l === void 0 && (l = {\n        isSigner: !1,\n        isWritable: !1,\n        isInvoked: !1\n      }, r.set(a, l)), l;\n    }, i = n(t);\n    i.isSigner = !0, i.isWritable = !0;\n    for (const o of e) {\n      n(o.programId).isInvoked = !0;\n      for (const a of o.keys) {\n        const l = n(a.pubkey);\n        l.isSigner || (l.isSigner = a.isSigner), l.isWritable || (l.isWritable = a.isWritable);\n      }\n    }\n    return new fa(t, r);\n  }\n  getMessageComponents() {\n    const e = [...this.keyMetaMap.entries()];\n    Kt(e.length <= 256, \"Max static account keys length exceeded\");\n    const t = e.filter(([, l]) => l.isSigner && l.isWritable), r = e.filter(([, l]) => l.isSigner && !l.isWritable), n = e.filter(([, l]) => !l.isSigner && l.isWritable), i = e.filter(([, l]) => !l.isSigner && !l.isWritable), o = {\n      numRequiredSignatures: t.length + r.length,\n      numReadonlySignedAccounts: r.length,\n      numReadonlyUnsignedAccounts: i.length\n    };\n    {\n      Kt(t.length > 0, \"Expected at least one writable signer key\");\n      const [l] = t[0];\n      Kt(l === this.payer.toBase58(), \"Expected first writable signer key to be the fee payer\");\n    }\n    const a = [...t.map(([l]) => new Oe(l)), ...r.map(([l]) => new Oe(l)), ...n.map(([l]) => new Oe(l)), ...i.map(([l]) => new Oe(l))];\n    return [o, a];\n  }\n  extractTableLookup(e) {\n    const [t, r] = this.drainKeysFoundInLookupTable(e.state.addresses, (o) => !o.isSigner && !o.isInvoked && o.isWritable), [n, i] = this.drainKeysFoundInLookupTable(e.state.addresses, (o) => !o.isSigner && !o.isInvoked && !o.isWritable);\n    if (!(t.length === 0 && n.length === 0))\n      return [{\n        accountKey: e.key,\n        writableIndexes: t,\n        readonlyIndexes: n\n      }, {\n        writable: r,\n        readonly: i\n      }];\n  }\n  /** @internal */\n  drainKeysFoundInLookupTable(e, t) {\n    const r = new Array(), n = new Array();\n    for (const [i, o] of this.keyMetaMap.entries())\n      if (t(o)) {\n        const a = new Oe(i), l = e.findIndex((c) => c.equals(a));\n        l >= 0 && (Kt(l < 256, \"Max lookup table index exceeded\"), r.push(l), n.push(a), this.keyMetaMap.delete(i));\n      }\n    return [r, n];\n  }\n}\nconst F0 = \"Reached end of buffer unexpectedly\";\nfunction ds(s) {\n  if (s.length === 0)\n    throw new Error(F0);\n  return s.shift();\n}\nfunction Sr(s, ...e) {\n  const [t] = e;\n  if (e.length === 2 ? t + (e[1] ?? 0) > s.length : t >= s.length)\n    throw new Error(F0);\n  return s.splice(...e);\n}\nclass Mn {\n  constructor(e) {\n    this.header = void 0, this.accountKeys = void 0, this.recentBlockhash = void 0, this.instructions = void 0, this.indexToProgramIds = /* @__PURE__ */ new Map(), this.header = e.header, this.accountKeys = e.accountKeys.map((t) => new Oe(t)), this.recentBlockhash = e.recentBlockhash, this.instructions = e.instructions, this.instructions.forEach((t) => this.indexToProgramIds.set(t.programIdIndex, this.accountKeys[t.programIdIndex]));\n  }\n  get version() {\n    return \"legacy\";\n  }\n  get staticAccountKeys() {\n    return this.accountKeys;\n  }\n  get compiledInstructions() {\n    return this.instructions.map((e) => ({\n      programIdIndex: e.programIdIndex,\n      accountKeyIndexes: e.accounts,\n      data: ar.decode(e.data)\n    }));\n  }\n  get addressTableLookups() {\n    return [];\n  }\n  getAccountKeys() {\n    return new Vo(this.staticAccountKeys);\n  }\n  static compile(e) {\n    const t = fa.compile(e.instructions, e.payerKey), [r, n] = t.getMessageComponents(), o = new Vo(n).compileInstructions(e.instructions).map((a) => ({\n      programIdIndex: a.programIdIndex,\n      accounts: a.accountKeyIndexes,\n      data: ar.encode(a.data)\n    }));\n    return new Mn({\n      header: r,\n      accountKeys: n,\n      recentBlockhash: e.recentBlockhash,\n      instructions: o\n    });\n  }\n  isAccountSigner(e) {\n    return e < this.header.numRequiredSignatures;\n  }\n  isAccountWritable(e) {\n    const t = this.header.numRequiredSignatures;\n    if (e >= this.header.numRequiredSignatures) {\n      const r = e - t, i = this.accountKeys.length - t - this.header.numReadonlyUnsignedAccounts;\n      return r < i;\n    } else {\n      const r = t - this.header.numReadonlySignedAccounts;\n      return e < r;\n    }\n  }\n  isProgramId(e) {\n    return this.indexToProgramIds.has(e);\n  }\n  programIds() {\n    return [...this.indexToProgramIds.values()];\n  }\n  nonProgramIds() {\n    return this.accountKeys.filter((e, t) => !this.isProgramId(t));\n  }\n  serialize() {\n    const e = this.accountKeys.length;\n    let t = [];\n    xr(t, e);\n    const r = this.instructions.map((d) => {\n      const {\n        accounts: h,\n        programIdIndex: f\n      } = d, p = Array.from(ar.decode(d.data));\n      let y = [];\n      xr(y, h.length);\n      let E = [];\n      return xr(E, p.length), {\n        programIdIndex: f,\n        keyIndicesCount: He.Buffer.from(y),\n        keyIndices: h,\n        dataLength: He.Buffer.from(E),\n        data: p\n      };\n    });\n    let n = [];\n    xr(n, r.length);\n    let i = He.Buffer.alloc(wn);\n    He.Buffer.from(n).copy(i);\n    let o = n.length;\n    r.forEach((d) => {\n      const f = z.struct([z.u8(\"programIdIndex\"), z.blob(d.keyIndicesCount.length, \"keyIndicesCount\"), z.seq(z.u8(\"keyIndex\"), d.keyIndices.length, \"keyIndices\"), z.blob(d.dataLength.length, \"dataLength\"), z.seq(z.u8(\"userdatum\"), d.data.length, \"data\")]).encode(d, i, o);\n      o += f;\n    }), i = i.slice(0, o);\n    const a = z.struct([z.blob(1, \"numRequiredSignatures\"), z.blob(1, \"numReadonlySignedAccounts\"), z.blob(1, \"numReadonlyUnsignedAccounts\"), z.blob(t.length, \"keyCount\"), z.seq(We(\"key\"), e, \"keys\"), We(\"recentBlockhash\")]), l = {\n      numRequiredSignatures: He.Buffer.from([this.header.numRequiredSignatures]),\n      numReadonlySignedAccounts: He.Buffer.from([this.header.numReadonlySignedAccounts]),\n      numReadonlyUnsignedAccounts: He.Buffer.from([this.header.numReadonlyUnsignedAccounts]),\n      keyCount: He.Buffer.from(t),\n      keys: this.accountKeys.map((d) => ru(d.toBytes())),\n      recentBlockhash: ar.decode(this.recentBlockhash)\n    };\n    let c = He.Buffer.alloc(2048);\n    const u = a.encode(l, c);\n    return i.copy(c, u), c.slice(0, u + i.length);\n  }\n  /**\n   * Decode a compiled message into a Message object.\n   */\n  static from(e) {\n    let t = [...e];\n    const r = ds(t);\n    if (r !== (r & su))\n      throw new Error(\"Versioned messages must be deserialized with VersionedMessage.deserialize()\");\n    const n = ds(t), i = ds(t), o = Er(t);\n    let a = [];\n    for (let h = 0; h < o; h++) {\n      const f = Sr(t, 0, ks);\n      a.push(new Oe(He.Buffer.from(f)));\n    }\n    const l = Sr(t, 0, ks), c = Er(t);\n    let u = [];\n    for (let h = 0; h < c; h++) {\n      const f = ds(t), p = Er(t), y = Sr(t, 0, p), E = Er(t), b = Sr(t, 0, E), R = ar.encode(He.Buffer.from(b));\n      u.push({\n        programIdIndex: f,\n        accounts: y,\n        data: R\n      });\n    }\n    const d = {\n      header: {\n        numRequiredSignatures: r,\n        numReadonlySignedAccounts: n,\n        numReadonlyUnsignedAccounts: i\n      },\n      recentBlockhash: ar.encode(He.Buffer.from(l)),\n      accountKeys: a,\n      instructions: u\n    };\n    return new Mn(d);\n  }\n}\nclass jo {\n  constructor(e) {\n    this.header = void 0, this.staticAccountKeys = void 0, this.recentBlockhash = void 0, this.compiledInstructions = void 0, this.addressTableLookups = void 0, this.header = e.header, this.staticAccountKeys = e.staticAccountKeys, this.recentBlockhash = e.recentBlockhash, this.compiledInstructions = e.compiledInstructions, this.addressTableLookups = e.addressTableLookups;\n  }\n  get version() {\n    return 0;\n  }\n  get numAccountKeysFromLookups() {\n    let e = 0;\n    for (const t of this.addressTableLookups)\n      e += t.readonlyIndexes.length + t.writableIndexes.length;\n    return e;\n  }\n  getAccountKeys(e) {\n    let t;\n    if (e && \"accountKeysFromLookups\" in e && e.accountKeysFromLookups) {\n      if (this.numAccountKeysFromLookups != e.accountKeysFromLookups.writable.length + e.accountKeysFromLookups.readonly.length)\n        throw new Error(\"Failed to get account keys because of a mismatch in the number of account keys from lookups\");\n      t = e.accountKeysFromLookups;\n    } else if (e && \"addressLookupTableAccounts\" in e && e.addressLookupTableAccounts)\n      t = this.resolveAddressTableLookups(e.addressLookupTableAccounts);\n    else if (this.addressTableLookups.length > 0)\n      throw new Error(\"Failed to get account keys because address table lookups were not resolved\");\n    return new Vo(this.staticAccountKeys, t);\n  }\n  isAccountSigner(e) {\n    return e < this.header.numRequiredSignatures;\n  }\n  isAccountWritable(e) {\n    const t = this.header.numRequiredSignatures, r = this.staticAccountKeys.length;\n    if (e >= r) {\n      const n = e - r, i = this.addressTableLookups.reduce((o, a) => o + a.writableIndexes.length, 0);\n      return n < i;\n    } else if (e >= this.header.numRequiredSignatures) {\n      const n = e - t, o = r - t - this.header.numReadonlyUnsignedAccounts;\n      return n < o;\n    } else {\n      const n = t - this.header.numReadonlySignedAccounts;\n      return e < n;\n    }\n  }\n  resolveAddressTableLookups(e) {\n    const t = {\n      writable: [],\n      readonly: []\n    };\n    for (const r of this.addressTableLookups) {\n      const n = e.find((i) => i.key.equals(r.accountKey));\n      if (!n)\n        throw new Error(`Failed to find address lookup table account for table key ${r.accountKey.toBase58()}`);\n      for (const i of r.writableIndexes)\n        if (i < n.state.addresses.length)\n          t.writable.push(n.state.addresses[i]);\n        else\n          throw new Error(`Failed to find address for index ${i} in address lookup table ${r.accountKey.toBase58()}`);\n      for (const i of r.readonlyIndexes)\n        if (i < n.state.addresses.length)\n          t.readonly.push(n.state.addresses[i]);\n        else\n          throw new Error(`Failed to find address for index ${i} in address lookup table ${r.accountKey.toBase58()}`);\n    }\n    return t;\n  }\n  static compile(e) {\n    const t = fa.compile(e.instructions, e.payerKey), r = new Array(), n = {\n      writable: new Array(),\n      readonly: new Array()\n    }, i = e.addressLookupTableAccounts || [];\n    for (const u of i) {\n      const d = t.extractTableLookup(u);\n      if (d !== void 0) {\n        const [h, {\n          writable: f,\n          readonly: p\n        }] = d;\n        r.push(h), n.writable.push(...f), n.readonly.push(...p);\n      }\n    }\n    const [o, a] = t.getMessageComponents(), c = new Vo(a, n).compileInstructions(e.instructions);\n    return new jo({\n      header: o,\n      staticAccountKeys: a,\n      recentBlockhash: e.recentBlockhash,\n      compiledInstructions: c,\n      addressTableLookups: r\n    });\n  }\n  serialize() {\n    const e = Array();\n    xr(e, this.staticAccountKeys.length);\n    const t = this.serializeInstructions(), r = Array();\n    xr(r, this.compiledInstructions.length);\n    const n = this.serializeAddressTableLookups(), i = Array();\n    xr(i, this.addressTableLookups.length);\n    const o = z.struct([z.u8(\"prefix\"), z.struct([z.u8(\"numRequiredSignatures\"), z.u8(\"numReadonlySignedAccounts\"), z.u8(\"numReadonlyUnsignedAccounts\")], \"header\"), z.blob(e.length, \"staticAccountKeysLength\"), z.seq(We(), this.staticAccountKeys.length, \"staticAccountKeys\"), We(\"recentBlockhash\"), z.blob(r.length, \"instructionsLength\"), z.blob(t.length, \"serializedInstructions\"), z.blob(i.length, \"addressTableLookupsLength\"), z.blob(n.length, \"serializedAddressTableLookups\")]), a = new Uint8Array(wn), c = o.encode({\n      prefix: 128,\n      header: this.header,\n      staticAccountKeysLength: new Uint8Array(e),\n      staticAccountKeys: this.staticAccountKeys.map((u) => u.toBytes()),\n      recentBlockhash: ar.decode(this.recentBlockhash),\n      instructionsLength: new Uint8Array(r),\n      serializedInstructions: t,\n      addressTableLookupsLength: new Uint8Array(i),\n      serializedAddressTableLookups: n\n    }, a);\n    return a.slice(0, c);\n  }\n  serializeInstructions() {\n    let e = 0;\n    const t = new Uint8Array(wn);\n    for (const r of this.compiledInstructions) {\n      const n = Array();\n      xr(n, r.accountKeyIndexes.length);\n      const i = Array();\n      xr(i, r.data.length);\n      const o = z.struct([z.u8(\"programIdIndex\"), z.blob(n.length, \"encodedAccountKeyIndexesLength\"), z.seq(z.u8(), r.accountKeyIndexes.length, \"accountKeyIndexes\"), z.blob(i.length, \"encodedDataLength\"), z.blob(r.data.length, \"data\")]);\n      e += o.encode({\n        programIdIndex: r.programIdIndex,\n        encodedAccountKeyIndexesLength: new Uint8Array(n),\n        accountKeyIndexes: r.accountKeyIndexes,\n        encodedDataLength: new Uint8Array(i),\n        data: r.data\n      }, t, e);\n    }\n    return t.slice(0, e);\n  }\n  serializeAddressTableLookups() {\n    let e = 0;\n    const t = new Uint8Array(wn);\n    for (const r of this.addressTableLookups) {\n      const n = Array();\n      xr(n, r.writableIndexes.length);\n      const i = Array();\n      xr(i, r.readonlyIndexes.length);\n      const o = z.struct([We(\"accountKey\"), z.blob(n.length, \"encodedWritableIndexesLength\"), z.seq(z.u8(), r.writableIndexes.length, \"writableIndexes\"), z.blob(i.length, \"encodedReadonlyIndexesLength\"), z.seq(z.u8(), r.readonlyIndexes.length, \"readonlyIndexes\")]);\n      e += o.encode({\n        accountKey: r.accountKey.toBytes(),\n        encodedWritableIndexesLength: new Uint8Array(n),\n        writableIndexes: r.writableIndexes,\n        encodedReadonlyIndexesLength: new Uint8Array(i),\n        readonlyIndexes: r.readonlyIndexes\n      }, t, e);\n    }\n    return t.slice(0, e);\n  }\n  static deserialize(e) {\n    let t = [...e];\n    const r = ds(t), n = r & su;\n    Kt(r !== n, \"Expected versioned message but received legacy message\");\n    const i = n;\n    Kt(i === 0, `Expected versioned message with version 0 but found version ${i}`);\n    const o = {\n      numRequiredSignatures: ds(t),\n      numReadonlySignedAccounts: ds(t),\n      numReadonlyUnsignedAccounts: ds(t)\n    }, a = [], l = Er(t);\n    for (let p = 0; p < l; p++)\n      a.push(new Oe(Sr(t, 0, ks)));\n    const c = ar.encode(Sr(t, 0, ks)), u = Er(t), d = [];\n    for (let p = 0; p < u; p++) {\n      const y = ds(t), E = Er(t), b = Sr(t, 0, E), R = Er(t), A = new Uint8Array(Sr(t, 0, R));\n      d.push({\n        programIdIndex: y,\n        accountKeyIndexes: b,\n        data: A\n      });\n    }\n    const h = Er(t), f = [];\n    for (let p = 0; p < h; p++) {\n      const y = new Oe(Sr(t, 0, ks)), E = Er(t), b = Sr(t, 0, E), R = Er(t), A = Sr(t, 0, R);\n      f.push({\n        accountKey: y,\n        writableIndexes: b,\n        readonlyIndexes: A\n      });\n    }\n    return new jo({\n      header: o,\n      staticAccountKeys: a,\n      recentBlockhash: c,\n      compiledInstructions: d,\n      addressTableLookups: f\n    });\n  }\n}\nconst nu = {\n  deserializeMessageVersion(s) {\n    const e = s[0], t = e & su;\n    return t === e ? \"legacy\" : t;\n  },\n  deserialize: (s) => {\n    const e = nu.deserializeMessageVersion(s);\n    if (e === \"legacy\")\n      return Mn.from(s);\n    if (e === 0)\n      return jo.deserialize(s);\n    throw new Error(`Transaction message version ${e} deserialization is not supported`);\n  }\n}, mE = He.Buffer.alloc(Go).fill(0);\nclass Ud {\n  constructor(e) {\n    this.keys = void 0, this.programId = void 0, this.data = He.Buffer.alloc(0), this.programId = e.programId, this.keys = e.keys, e.data && (this.data = e.data);\n  }\n  /**\n   * @internal\n   */\n  toJSON() {\n    return {\n      keys: this.keys.map(({\n        pubkey: e,\n        isSigner: t,\n        isWritable: r\n      }) => ({\n        pubkey: e.toJSON(),\n        isSigner: t,\n        isWritable: r\n      })),\n      programId: this.programId.toJSON(),\n      data: [...this.data]\n    };\n  }\n}\nclass Ko {\n  /**\n   * The first (payer) Transaction signature\n   *\n   * @returns {Buffer | null} Buffer of payer's signature\n   */\n  get signature() {\n    return this.signatures.length > 0 ? this.signatures[0].signature : null;\n  }\n  /**\n   * The transaction fee payer\n   */\n  // Construct a transaction with a blockhash and lastValidBlockHeight\n  // Construct a transaction using a durable nonce\n  /**\n   * @deprecated `TransactionCtorFields` has been deprecated and will be removed in a future version.\n   * Please supply a `TransactionBlockhashCtor` instead.\n   */\n  /**\n   * Construct an empty Transaction\n   */\n  constructor(e) {\n    if (this.signatures = [], this.feePayer = void 0, this.instructions = [], this.recentBlockhash = void 0, this.lastValidBlockHeight = void 0, this.nonceInfo = void 0, this.minNonceContextSlot = void 0, this._message = void 0, this._json = void 0, !!e)\n      if (e.feePayer && (this.feePayer = e.feePayer), e.signatures && (this.signatures = e.signatures), Object.prototype.hasOwnProperty.call(e, \"nonceInfo\")) {\n        const {\n          minContextSlot: t,\n          nonceInfo: r\n        } = e;\n        this.minNonceContextSlot = t, this.nonceInfo = r;\n      } else if (Object.prototype.hasOwnProperty.call(e, \"lastValidBlockHeight\")) {\n        const {\n          blockhash: t,\n          lastValidBlockHeight: r\n        } = e;\n        this.recentBlockhash = t, this.lastValidBlockHeight = r;\n      } else {\n        const {\n          recentBlockhash: t,\n          nonceInfo: r\n        } = e;\n        r && (this.nonceInfo = r), this.recentBlockhash = t;\n      }\n  }\n  /**\n   * @internal\n   */\n  toJSON() {\n    return {\n      recentBlockhash: this.recentBlockhash || null,\n      feePayer: this.feePayer ? this.feePayer.toJSON() : null,\n      nonceInfo: this.nonceInfo ? {\n        nonce: this.nonceInfo.nonce,\n        nonceInstruction: this.nonceInfo.nonceInstruction.toJSON()\n      } : null,\n      instructions: this.instructions.map((e) => e.toJSON()),\n      signers: this.signatures.map(({\n        publicKey: e\n      }) => e.toJSON())\n    };\n  }\n  /**\n   * Add one or more instructions to this Transaction\n   *\n   * @param {Array< Transaction | TransactionInstruction | TransactionInstructionCtorFields >} items - Instructions to add to the Transaction\n   */\n  add(...e) {\n    if (e.length === 0)\n      throw new Error(\"No instructions\");\n    return e.forEach((t) => {\n      \"instructions\" in t ? this.instructions = this.instructions.concat(t.instructions) : \"data\" in t && \"programId\" in t && \"keys\" in t ? this.instructions.push(t) : this.instructions.push(new Ud(t));\n    }), this;\n  }\n  /**\n   * Compile transaction data\n   */\n  compileMessage() {\n    if (this._message && JSON.stringify(this.toJSON()) === JSON.stringify(this._json))\n      return this._message;\n    let e, t;\n    if (this.nonceInfo ? (e = this.nonceInfo.nonce, this.instructions[0] != this.nonceInfo.nonceInstruction ? t = [this.nonceInfo.nonceInstruction, ...this.instructions] : t = this.instructions) : (e = this.recentBlockhash, t = this.instructions), !e)\n      throw new Error(\"Transaction recentBlockhash required\");\n    t.length < 1 && console.warn(\"No instructions provided\");\n    let r;\n    if (this.feePayer)\n      r = this.feePayer;\n    else if (this.signatures.length > 0 && this.signatures[0].publicKey)\n      r = this.signatures[0].publicKey;\n    else\n      throw new Error(\"Transaction fee payer required\");\n    for (let y = 0; y < t.length; y++)\n      if (t[y].programId === void 0)\n        throw new Error(`Transaction instruction index ${y} has undefined program id`);\n    const n = [], i = [];\n    t.forEach((y) => {\n      y.keys.forEach((b) => {\n        i.push({\n          ...b\n        });\n      });\n      const E = y.programId.toString();\n      n.includes(E) || n.push(E);\n    }), n.forEach((y) => {\n      i.push({\n        pubkey: new Oe(y),\n        isSigner: !1,\n        isWritable: !1\n      });\n    });\n    const o = [];\n    i.forEach((y) => {\n      const E = y.pubkey.toString(), b = o.findIndex((R) => R.pubkey.toString() === E);\n      b > -1 ? (o[b].isWritable = o[b].isWritable || y.isWritable, o[b].isSigner = o[b].isSigner || y.isSigner) : o.push(y);\n    }), o.sort(function(y, E) {\n      if (y.isSigner !== E.isSigner)\n        return y.isSigner ? -1 : 1;\n      if (y.isWritable !== E.isWritable)\n        return y.isWritable ? -1 : 1;\n      const b = {\n        localeMatcher: \"best fit\",\n        usage: \"sort\",\n        sensitivity: \"variant\",\n        ignorePunctuation: !1,\n        numeric: !1,\n        caseFirst: \"lower\"\n      };\n      return y.pubkey.toBase58().localeCompare(E.pubkey.toBase58(), \"en\", b);\n    });\n    const a = o.findIndex((y) => y.pubkey.equals(r));\n    if (a > -1) {\n      const [y] = o.splice(a, 1);\n      y.isSigner = !0, y.isWritable = !0, o.unshift(y);\n    } else\n      o.unshift({\n        pubkey: r,\n        isSigner: !0,\n        isWritable: !0\n      });\n    for (const y of this.signatures) {\n      const E = o.findIndex((b) => b.pubkey.equals(y.publicKey));\n      if (E > -1)\n        o[E].isSigner || (o[E].isSigner = !0, console.warn(\"Transaction references a signature that is unnecessary, only the fee payer and instruction signer accounts should sign a transaction. This behavior is deprecated and will throw an error in the next major version release.\"));\n      else\n        throw new Error(`unknown signer: ${y.publicKey.toString()}`);\n    }\n    let l = 0, c = 0, u = 0;\n    const d = [], h = [];\n    o.forEach(({\n      pubkey: y,\n      isSigner: E,\n      isWritable: b\n    }) => {\n      E ? (d.push(y.toString()), l += 1, b || (c += 1)) : (h.push(y.toString()), b || (u += 1));\n    });\n    const f = d.concat(h), p = t.map((y) => {\n      const {\n        data: E,\n        programId: b\n      } = y;\n      return {\n        programIdIndex: f.indexOf(b.toString()),\n        accounts: y.keys.map((R) => f.indexOf(R.pubkey.toString())),\n        data: ar.encode(E)\n      };\n    });\n    return p.forEach((y) => {\n      Kt(y.programIdIndex >= 0), y.accounts.forEach((E) => Kt(E >= 0));\n    }), new Mn({\n      header: {\n        numRequiredSignatures: l,\n        numReadonlySignedAccounts: c,\n        numReadonlyUnsignedAccounts: u\n      },\n      accountKeys: f,\n      recentBlockhash: e,\n      instructions: p\n    });\n  }\n  /**\n   * @internal\n   */\n  _compile() {\n    const e = this.compileMessage(), t = e.accountKeys.slice(0, e.header.numRequiredSignatures);\n    return this.signatures.length === t.length && this.signatures.every((n, i) => t[i].equals(n.publicKey)) || (this.signatures = t.map((r) => ({\n      signature: null,\n      publicKey: r\n    }))), e;\n  }\n  /**\n   * Get a buffer of the Transaction data that need to be covered by signatures\n   */\n  serializeMessage() {\n    return this._compile().serialize();\n  }\n  /**\n   * Get the estimated fee associated with a transaction\n   *\n   * @param {Connection} connection Connection to RPC Endpoint.\n   *\n   * @returns {Promise<number | null>} The estimated fee for the transaction\n   */\n  async getEstimatedFee(e) {\n    return (await e.getFeeForMessage(this.compileMessage())).value;\n  }\n  /**\n   * Specify the public keys which will be used to sign the Transaction.\n   * The first signer will be used as the transaction fee payer account.\n   *\n   * Signatures can be added with either `partialSign` or `addSignature`\n   *\n   * @deprecated Deprecated since v0.84.0. Only the fee payer needs to be\n   * specified and it can be set in the Transaction constructor or with the\n   * `feePayer` property.\n   */\n  setSigners(...e) {\n    if (e.length === 0)\n      throw new Error(\"No signers\");\n    const t = /* @__PURE__ */ new Set();\n    this.signatures = e.filter((r) => {\n      const n = r.toString();\n      return t.has(n) ? !1 : (t.add(n), !0);\n    }).map((r) => ({\n      signature: null,\n      publicKey: r\n    }));\n  }\n  /**\n   * Sign the Transaction with the specified signers. Multiple signatures may\n   * be applied to a Transaction. The first signature is considered \"primary\"\n   * and is used identify and confirm transactions.\n   *\n   * If the Transaction `feePayer` is not set, the first signer will be used\n   * as the transaction fee payer account.\n   *\n   * Transaction fields should not be modified after the first call to `sign`,\n   * as doing so may invalidate the signature and cause the Transaction to be\n   * rejected.\n   *\n   * The Transaction must be assigned a valid `recentBlockhash` before invoking this method\n   *\n   * @param {Array<Signer>} signers Array of signers that will sign the transaction\n   */\n  sign(...e) {\n    if (e.length === 0)\n      throw new Error(\"No signers\");\n    const t = /* @__PURE__ */ new Set(), r = [];\n    for (const i of e) {\n      const o = i.publicKey.toString();\n      t.has(o) || (t.add(o), r.push(i));\n    }\n    this.signatures = r.map((i) => ({\n      signature: null,\n      publicKey: i.publicKey\n    }));\n    const n = this._compile();\n    this._partialSign(n, ...r);\n  }\n  /**\n   * Partially sign a transaction with the specified accounts. All accounts must\n   * correspond to either the fee payer or a signer account in the transaction\n   * instructions.\n   *\n   * All the caveats from the `sign` method apply to `partialSign`\n   *\n   * @param {Array<Signer>} signers Array of signers that will sign the transaction\n   */\n  partialSign(...e) {\n    if (e.length === 0)\n      throw new Error(\"No signers\");\n    const t = /* @__PURE__ */ new Set(), r = [];\n    for (const i of e) {\n      const o = i.publicKey.toString();\n      t.has(o) || (t.add(o), r.push(i));\n    }\n    const n = this._compile();\n    this._partialSign(n, ...r);\n  }\n  /**\n   * @internal\n   */\n  _partialSign(e, ...t) {\n    const r = e.serialize();\n    t.forEach((n) => {\n      const i = O0(r, n.secretKey);\n      this._addSignature(n.publicKey, ru(i));\n    });\n  }\n  /**\n   * Add an externally created signature to a transaction. The public key\n   * must correspond to either the fee payer or a signer account in the transaction\n   * instructions.\n   *\n   * @param {PublicKey} pubkey Public key that will be added to the transaction.\n   * @param {Buffer} signature An externally created signature to add to the transaction.\n   */\n  addSignature(e, t) {\n    this._compile(), this._addSignature(e, t);\n  }\n  /**\n   * @internal\n   */\n  _addSignature(e, t) {\n    Kt(t.length === 64);\n    const r = this.signatures.findIndex((n) => e.equals(n.publicKey));\n    if (r < 0)\n      throw new Error(`unknown signer: ${e.toString()}`);\n    this.signatures[r].signature = He.Buffer.from(t);\n  }\n  /**\n   * Verify signatures of a Transaction\n   * Optional parameter specifies if we're expecting a fully signed Transaction or a partially signed one.\n   * If no boolean is provided, we expect a fully signed Transaction by default.\n   *\n   * @param {boolean} [requireAllSignatures=true] Require a fully signed Transaction\n   */\n  verifySignatures(e = !0) {\n    return !this._getMessageSignednessErrors(this.serializeMessage(), e);\n  }\n  /**\n   * @internal\n   */\n  _getMessageSignednessErrors(e, t) {\n    const r = {};\n    for (const {\n      signature: n,\n      publicKey: i\n    } of this.signatures)\n      n === null ? t && (r.missing || (r.missing = [])).push(i) : aE(n, e, i.toBytes()) || (r.invalid || (r.invalid = [])).push(i);\n    return r.invalid || r.missing ? r : void 0;\n  }\n  /**\n   * Serialize the Transaction in the wire format.\n   *\n   * @param {Buffer} [config] Config of transaction.\n   *\n   * @returns {Buffer} Signature of transaction in wire format.\n   */\n  serialize(e) {\n    const {\n      requireAllSignatures: t,\n      verifySignatures: r\n    } = Object.assign({\n      requireAllSignatures: !0,\n      verifySignatures: !0\n    }, e), n = this.serializeMessage();\n    if (r) {\n      const i = this._getMessageSignednessErrors(n, t);\n      if (i) {\n        let o = \"Signature verification failed.\";\n        throw i.invalid && (o += `\nInvalid signature for public key${i.invalid.length === 1 ? \"\" : \"(s)\"} [\\`${i.invalid.map((a) => a.toBase58()).join(\"`, `\")}\\`].`), i.missing && (o += `\nMissing signature for public key${i.missing.length === 1 ? \"\" : \"(s)\"} [\\`${i.missing.map((a) => a.toBase58()).join(\"`, `\")}\\`].`), new Error(o);\n      }\n    }\n    return this._serialize(n);\n  }\n  /**\n   * @internal\n   */\n  _serialize(e) {\n    const {\n      signatures: t\n    } = this, r = [];\n    xr(r, t.length);\n    const n = r.length + t.length * 64 + e.length, i = He.Buffer.alloc(n);\n    return Kt(t.length < 256), He.Buffer.from(r).copy(i, 0), t.forEach(({\n      signature: o\n    }, a) => {\n      o !== null && (Kt(o.length === 64, \"signature has invalid length\"), He.Buffer.from(o).copy(i, r.length + a * 64));\n    }), e.copy(i, r.length + t.length * 64), Kt(i.length <= wn, `Transaction too large: ${i.length} > ${wn}`), i;\n  }\n  /**\n   * Deprecated method\n   * @internal\n   */\n  get keys() {\n    return Kt(this.instructions.length === 1), this.instructions[0].keys.map((e) => e.pubkey);\n  }\n  /**\n   * Deprecated method\n   * @internal\n   */\n  get programId() {\n    return Kt(this.instructions.length === 1), this.instructions[0].programId;\n  }\n  /**\n   * Deprecated method\n   * @internal\n   */\n  get data() {\n    return Kt(this.instructions.length === 1), this.instructions[0].data;\n  }\n  /**\n   * Parse a wire transaction into a Transaction object.\n   *\n   * @param {Buffer | Uint8Array | Array<number>} buffer Signature of wire Transaction\n   *\n   * @returns {Transaction} Transaction associated with the signature\n   */\n  static from(e) {\n    let t = [...e];\n    const r = Er(t);\n    let n = [];\n    for (let i = 0; i < r; i++) {\n      const o = Sr(t, 0, Go);\n      n.push(ar.encode(He.Buffer.from(o)));\n    }\n    return Ko.populate(Mn.from(t), n);\n  }\n  /**\n   * Populate Transaction object from message and signatures\n   *\n   * @param {Message} message Message of transaction\n   * @param {Array<string>} signatures List of signatures to assign to the transaction\n   *\n   * @returns {Transaction} The populated Transaction\n   */\n  static populate(e, t = []) {\n    const r = new Ko();\n    return r.recentBlockhash = e.recentBlockhash, e.header.numRequiredSignatures > 0 && (r.feePayer = e.accountKeys[0]), t.forEach((n, i) => {\n      const o = {\n        signature: n == ar.encode(mE) ? null : ar.decode(n),\n        publicKey: e.accountKeys[i]\n      };\n      r.signatures.push(o);\n    }), e.instructions.forEach((n) => {\n      const i = n.accounts.map((o) => {\n        const a = e.accountKeys[o];\n        return {\n          pubkey: a,\n          isSigner: r.signatures.some((l) => l.publicKey.toString() === a.toString()) || e.isAccountSigner(o),\n          isWritable: e.isAccountWritable(o)\n        };\n      });\n      r.instructions.push(new Ud({\n        keys: i,\n        programId: e.accountKeys[n.programIdIndex],\n        data: ar.decode(n.data)\n      }));\n    }), r._message = e, r._json = r.toJSON(), r;\n  }\n}\nclass iu {\n  get version() {\n    return this.message.version;\n  }\n  constructor(e, t) {\n    if (this.signatures = void 0, this.message = void 0, t !== void 0)\n      Kt(t.length === e.header.numRequiredSignatures, \"Expected signatures length to be equal to the number of required signatures\"), this.signatures = t;\n    else {\n      const r = [];\n      for (let n = 0; n < e.header.numRequiredSignatures; n++)\n        r.push(new Uint8Array(Go));\n      this.signatures = r;\n    }\n    this.message = e;\n  }\n  serialize() {\n    const e = this.message.serialize(), t = Array();\n    xr(t, this.signatures.length);\n    const r = z.struct([z.blob(t.length, \"encodedSignaturesLength\"), z.seq(dE(), this.signatures.length, \"signatures\"), z.blob(e.length, \"serializedMessage\")]), n = new Uint8Array(2048), i = r.encode({\n      encodedSignaturesLength: new Uint8Array(t),\n      signatures: this.signatures,\n      serializedMessage: e\n    }, n);\n    return n.slice(0, i);\n  }\n  static deserialize(e) {\n    let t = [...e];\n    const r = [], n = Er(t);\n    for (let o = 0; o < n; o++)\n      r.push(new Uint8Array(Sr(t, 0, Go)));\n    const i = nu.deserialize(new Uint8Array(t));\n    return new iu(i, r);\n  }\n  sign(e) {\n    const t = this.message.serialize(), r = this.message.staticAccountKeys.slice(0, this.message.header.numRequiredSignatures);\n    for (const n of e) {\n      const i = r.findIndex((o) => o.equals(n.publicKey));\n      Kt(i >= 0, `Cannot sign with non signer key ${n.publicKey.toBase58()}`), this.signatures[i] = O0(t, n.secretKey);\n    }\n  }\n  addSignature(e, t) {\n    Kt(t.byteLength === 64, \"Signature must be 64 bytes long\");\n    const n = this.message.staticAccountKeys.slice(0, this.message.header.numRequiredSignatures).findIndex((i) => i.equals(e));\n    Kt(n >= 0, `Can not add signature; \\`${e.toBase58()}\\` is not required to sign this transaction`), this.signatures[n] = t;\n  }\n}\nnew Oe(\"SysvarC1ock11111111111111111111111111111111\");\nnew Oe(\"SysvarEpochSchedu1e111111111111111111111111\");\nnew Oe(\"Sysvar1nstructions1111111111111111111111111\");\nnew Oe(\"SysvarRecentB1ockHashes11111111111111111111\");\nnew Oe(\"SysvarRent111111111111111111111111111111111\");\nnew Oe(\"SysvarRewards111111111111111111111111111111\");\nnew Oe(\"SysvarS1otHashes111111111111111111111111111\");\nnew Oe(\"SysvarS1otHistory11111111111111111111111111\");\nnew Oe(\"SysvarStakeHistory1111111111111111111111111\");\nconst yE = z.nu64(\"lamportsPerSignature\"), vE = z.struct([z.u32(\"version\"), z.u32(\"state\"), We(\"authorizedPubkey\"), We(\"nonce\"), z.struct([yE], \"feeCalculator\")]);\nvE.span;\nfunction On(s) {\n  const e = z.blob(8, s), t = e.decode.bind(e), r = e.encode.bind(e), n = e, i = pv();\n  return n.decode = (o, a) => {\n    const l = t(o, a);\n    return i.decode(l);\n  }, n.encode = (o, a, l) => {\n    const c = i.encode(o);\n    return r(c, a, l);\n  }, n;\n}\nObject.freeze({\n  Create: {\n    index: 0,\n    layout: z.struct([z.u32(\"instruction\"), z.ns64(\"lamports\"), z.ns64(\"space\"), We(\"programId\")])\n  },\n  Assign: {\n    index: 1,\n    layout: z.struct([z.u32(\"instruction\"), We(\"programId\")])\n  },\n  Transfer: {\n    index: 2,\n    layout: z.struct([z.u32(\"instruction\"), On(\"lamports\")])\n  },\n  CreateWithSeed: {\n    index: 3,\n    layout: z.struct([z.u32(\"instruction\"), We(\"base\"), xn(\"seed\"), z.ns64(\"lamports\"), z.ns64(\"space\"), We(\"programId\")])\n  },\n  AdvanceNonceAccount: {\n    index: 4,\n    layout: z.struct([z.u32(\"instruction\")])\n  },\n  WithdrawNonceAccount: {\n    index: 5,\n    layout: z.struct([z.u32(\"instruction\"), z.ns64(\"lamports\")])\n  },\n  InitializeNonceAccount: {\n    index: 6,\n    layout: z.struct([z.u32(\"instruction\"), We(\"authorized\")])\n  },\n  AuthorizeNonceAccount: {\n    index: 7,\n    layout: z.struct([z.u32(\"instruction\"), We(\"authorized\")])\n  },\n  Allocate: {\n    index: 8,\n    layout: z.struct([z.u32(\"instruction\"), z.ns64(\"space\")])\n  },\n  AllocateWithSeed: {\n    index: 9,\n    layout: z.struct([z.u32(\"instruction\"), We(\"base\"), xn(\"seed\"), z.ns64(\"space\"), We(\"programId\")])\n  },\n  AssignWithSeed: {\n    index: 10,\n    layout: z.struct([z.u32(\"instruction\"), We(\"base\"), xn(\"seed\"), We(\"programId\")])\n  },\n  TransferWithSeed: {\n    index: 11,\n    layout: z.struct([z.u32(\"instruction\"), On(\"lamports\"), xn(\"seed\"), We(\"programId\")])\n  },\n  UpgradeNonceAccount: {\n    index: 12,\n    layout: z.struct([z.u32(\"instruction\")])\n  }\n});\nnew Oe(\"11111111111111111111111111111111\");\nnew Oe(\"BPFLoader2111111111111111111111111111111111\");\nz.struct([\n  z.u32(\"typeIndex\"),\n  On(\"deactivationSlot\"),\n  z.nu64(\"lastExtendedSlot\"),\n  z.u8(\"lastExtendedStartIndex\"),\n  z.u8(),\n  // option\n  z.seq(We(), z.offset(z.u8(), -1), \"authority\")\n]);\nconst St = Di(Qc(Oe), ce(), (s) => new Oe(s)), N0 = eu([ce(), pt(\"base64\")]), ou = Di(Qc(He.Buffer), N0, (s) => He.Buffer.from(s[0], \"base64\"));\nfunction U0(s) {\n  return ur([oe({\n    jsonrpc: pt(\"2.0\"),\n    id: ce(),\n    result: s\n  }), oe({\n    jsonrpc: pt(\"2.0\"),\n    id: ce(),\n    error: oe({\n      code: Gn(),\n      message: ce(),\n      data: Se(bv())\n    })\n  })]);\n}\nconst EE = U0(Gn());\nfunction lt(s) {\n  return Di(U0(s), EE, (e) => \"error\" in e ? e : {\n    ...e,\n    result: ti(e.result, s)\n  });\n}\nfunction Fr(s) {\n  return lt(oe({\n    context: oe({\n      slot: te()\n    }),\n    value: s\n  }));\n}\nfunction ga(s) {\n  return oe({\n    context: oe({\n      slot: te()\n    }),\n    value: s\n  });\n}\nconst xE = oe({\n  foundation: te(),\n  foundationTerm: te(),\n  initial: te(),\n  taper: te(),\n  terminal: te()\n});\nlt(fe(ge(oe({\n  epoch: te(),\n  effectiveSlot: te(),\n  amount: te(),\n  postBalance: te(),\n  commission: Se(ge(te()))\n}))));\nconst SE = fe(oe({\n  slot: te(),\n  prioritizationFee: te()\n})), bE = oe({\n  total: te(),\n  validator: te(),\n  foundation: te(),\n  epoch: te()\n}), TE = oe({\n  epoch: te(),\n  slotIndex: te(),\n  slotsInEpoch: te(),\n  absoluteSlot: te(),\n  blockHeight: Se(te()),\n  transactionCount: Se(te())\n}), wE = oe({\n  slotsPerEpoch: te(),\n  leaderScheduleSlotOffset: te(),\n  warmup: Xr(),\n  firstNormalEpoch: te(),\n  firstNormalSlot: te()\n}), AE = T0(ce(), fe(te())), rn = ge(ur([oe({}), ce()])), IE = oe({\n  err: rn\n}), _E = pt(\"receivedSignature\");\noe({\n  \"solana-core\": ce(),\n  \"feature-set\": Se(te())\n});\nconst RE = oe({\n  program: ce(),\n  programId: St,\n  parsed: Gn()\n}), LE = oe({\n  programId: St,\n  accounts: fe(St),\n  data: ce()\n});\nFr(oe({\n  err: ge(ur([oe({}), ce()])),\n  logs: ge(fe(ce())),\n  accounts: Se(ge(fe(ge(oe({\n    executable: Xr(),\n    owner: ce(),\n    lamports: te(),\n    data: fe(ce()),\n    rentEpoch: Se(te())\n  }))))),\n  unitsConsumed: Se(te()),\n  returnData: Se(ge(oe({\n    programId: ce(),\n    data: eu([ce(), pt(\"base64\")])\n  }))),\n  innerInstructions: Se(ge(fe(oe({\n    index: te(),\n    instructions: fe(ur([RE, LE]))\n  }))))\n}));\nFr(oe({\n  byIdentity: T0(ce(), fe(te())),\n  range: oe({\n    firstSlot: te(),\n    lastSlot: te()\n  })\n}));\nlt(xE);\nlt(bE);\nlt(SE);\nlt(TE);\nlt(wE);\nlt(AE);\nlt(te());\nFr(oe({\n  total: te(),\n  circulating: te(),\n  nonCirculating: te(),\n  nonCirculatingAccounts: fe(St)\n}));\nconst CE = oe({\n  amount: ce(),\n  uiAmount: ge(te()),\n  decimals: te(),\n  uiAmountString: Se(ce())\n});\nFr(fe(oe({\n  address: St,\n  amount: ce(),\n  uiAmount: ge(te()),\n  decimals: te(),\n  uiAmountString: Se(ce())\n})));\nFr(fe(oe({\n  pubkey: St,\n  account: oe({\n    executable: Xr(),\n    owner: St,\n    lamports: te(),\n    data: ou,\n    rentEpoch: te()\n  })\n})));\nconst rc = oe({\n  program: ce(),\n  parsed: Gn(),\n  space: te()\n});\nFr(fe(oe({\n  pubkey: St,\n  account: oe({\n    executable: Xr(),\n    owner: St,\n    lamports: te(),\n    data: rc,\n    rentEpoch: te()\n  })\n})));\nFr(fe(oe({\n  lamports: te(),\n  address: St\n})));\nconst au = oe({\n  executable: Xr(),\n  owner: St,\n  lamports: te(),\n  data: ou,\n  rentEpoch: te()\n});\noe({\n  pubkey: St,\n  account: au\n});\nconst kE = Di(ur([Qc(He.Buffer), rc]), ur([N0, rc]), (s) => Array.isArray(s) ? ti(s, ou) : s), DE = oe({\n  executable: Xr(),\n  owner: St,\n  lamports: te(),\n  data: kE,\n  rentEpoch: te()\n});\noe({\n  pubkey: St,\n  account: DE\n});\noe({\n  state: ur([pt(\"active\"), pt(\"inactive\"), pt(\"activating\"), pt(\"deactivating\")]),\n  active: te(),\n  inactive: te()\n});\nlt(fe(oe({\n  signature: ce(),\n  slot: te(),\n  err: rn,\n  memo: ge(ce()),\n  blockTime: Se(ge(te()))\n})));\nlt(fe(oe({\n  signature: ce(),\n  slot: te(),\n  err: rn,\n  memo: ge(ce()),\n  blockTime: Se(ge(te()))\n})));\noe({\n  subscription: te(),\n  result: ga(au)\n});\nconst PE = oe({\n  pubkey: St,\n  account: au\n});\noe({\n  subscription: te(),\n  result: ga(PE)\n});\nconst ME = oe({\n  parent: te(),\n  slot: te(),\n  root: te()\n});\noe({\n  subscription: te(),\n  result: ME\n});\nconst OE = ur([oe({\n  type: ur([pt(\"firstShredReceived\"), pt(\"completed\"), pt(\"optimisticConfirmation\"), pt(\"root\")]),\n  slot: te(),\n  timestamp: te()\n}), oe({\n  type: pt(\"createdBank\"),\n  parent: te(),\n  slot: te(),\n  timestamp: te()\n}), oe({\n  type: pt(\"frozen\"),\n  slot: te(),\n  timestamp: te(),\n  stats: oe({\n    numTransactionEntries: te(),\n    numSuccessfulTransactions: te(),\n    numFailedTransactions: te(),\n    maxTransactionsPerEntry: te()\n  })\n}), oe({\n  type: pt(\"dead\"),\n  slot: te(),\n  timestamp: te(),\n  err: ce()\n})]);\noe({\n  subscription: te(),\n  result: OE\n});\noe({\n  subscription: te(),\n  result: ga(ur([IE, _E]))\n});\noe({\n  subscription: te(),\n  result: te()\n});\noe({\n  pubkey: ce(),\n  gossip: ge(ce()),\n  tpu: ge(ce()),\n  rpc: ge(ce()),\n  version: ge(ce())\n});\nconst $d = oe({\n  votePubkey: ce(),\n  nodePubkey: ce(),\n  activatedStake: te(),\n  epochVoteAccount: Xr(),\n  epochCredits: fe(eu([te(), te(), te()])),\n  commission: te(),\n  lastVote: te(),\n  rootSlot: ge(te())\n});\nlt(oe({\n  current: fe($d),\n  delinquent: fe($d)\n}));\nconst BE = ur([pt(\"processed\"), pt(\"confirmed\"), pt(\"finalized\")]), FE = oe({\n  slot: te(),\n  confirmations: ge(te()),\n  err: rn,\n  confirmationStatus: Se(BE)\n});\nFr(fe(ge(FE)));\nlt(te());\nconst $0 = oe({\n  accountKey: St,\n  writableIndexes: fe(te()),\n  readonlyIndexes: fe(te())\n}), lu = oe({\n  signatures: fe(ce()),\n  message: oe({\n    accountKeys: fe(ce()),\n    header: oe({\n      numRequiredSignatures: te(),\n      numReadonlySignedAccounts: te(),\n      numReadonlyUnsignedAccounts: te()\n    }),\n    instructions: fe(oe({\n      accounts: fe(te()),\n      data: ce(),\n      programIdIndex: te()\n    })),\n    recentBlockhash: ce(),\n    addressTableLookups: Se(fe($0))\n  })\n}), G0 = oe({\n  pubkey: St,\n  signer: Xr(),\n  writable: Xr(),\n  source: Se(ur([pt(\"transaction\"), pt(\"lookupTable\")]))\n}), V0 = oe({\n  accountKeys: fe(G0),\n  signatures: fe(ce())\n}), j0 = oe({\n  parsed: Gn(),\n  program: ce(),\n  programId: St\n}), K0 = oe({\n  accounts: fe(St),\n  data: ce(),\n  programId: St\n}), NE = ur([K0, j0]), UE = ur([oe({\n  parsed: Gn(),\n  program: ce(),\n  programId: ce()\n}), oe({\n  accounts: fe(ce()),\n  data: ce(),\n  programId: ce()\n})]), H0 = Di(NE, UE, (s) => \"accounts\" in s ? ti(s, K0) : ti(s, j0)), q0 = oe({\n  signatures: fe(ce()),\n  message: oe({\n    accountKeys: fe(G0),\n    instructions: fe(H0),\n    recentBlockhash: ce(),\n    addressTableLookups: Se(ge(fe($0)))\n  })\n}), Ho = oe({\n  accountIndex: te(),\n  mint: ce(),\n  owner: Se(ce()),\n  programId: Se(ce()),\n  uiTokenAmount: CE\n}), W0 = oe({\n  writable: fe(St),\n  readonly: fe(St)\n}), pa = oe({\n  err: rn,\n  fee: te(),\n  innerInstructions: Se(ge(fe(oe({\n    index: te(),\n    instructions: fe(oe({\n      accounts: fe(te()),\n      data: ce(),\n      programIdIndex: te()\n    }))\n  })))),\n  preBalances: fe(te()),\n  postBalances: fe(te()),\n  logMessages: Se(ge(fe(ce()))),\n  preTokenBalances: Se(ge(fe(Ho))),\n  postTokenBalances: Se(ge(fe(Ho))),\n  loadedAddresses: Se(W0),\n  computeUnitsConsumed: Se(te()),\n  costUnits: Se(te())\n}), cu = oe({\n  err: rn,\n  fee: te(),\n  innerInstructions: Se(ge(fe(oe({\n    index: te(),\n    instructions: fe(H0)\n  })))),\n  preBalances: fe(te()),\n  postBalances: fe(te()),\n  logMessages: Se(ge(fe(ce()))),\n  preTokenBalances: Se(ge(fe(Ho))),\n  postTokenBalances: Se(ge(fe(Ho))),\n  loadedAddresses: Se(W0),\n  computeUnitsConsumed: Se(te()),\n  costUnits: Se(te())\n}), Vn = ur([pt(0), pt(\"legacy\")]), sn = oe({\n  pubkey: ce(),\n  lamports: te(),\n  postBalance: ge(te()),\n  rewardType: ge(ce()),\n  commission: Se(ge(te()))\n});\nlt(ge(oe({\n  blockhash: ce(),\n  previousBlockhash: ce(),\n  parentSlot: te(),\n  transactions: fe(oe({\n    transaction: lu,\n    meta: ge(pa),\n    version: Se(Vn)\n  })),\n  rewards: Se(fe(sn)),\n  blockTime: ge(te()),\n  blockHeight: ge(te())\n})));\nlt(ge(oe({\n  blockhash: ce(),\n  previousBlockhash: ce(),\n  parentSlot: te(),\n  rewards: Se(fe(sn)),\n  blockTime: ge(te()),\n  blockHeight: ge(te())\n})));\nlt(ge(oe({\n  blockhash: ce(),\n  previousBlockhash: ce(),\n  parentSlot: te(),\n  transactions: fe(oe({\n    transaction: V0,\n    meta: ge(pa),\n    version: Se(Vn)\n  })),\n  rewards: Se(fe(sn)),\n  blockTime: ge(te()),\n  blockHeight: ge(te())\n})));\nlt(ge(oe({\n  blockhash: ce(),\n  previousBlockhash: ce(),\n  parentSlot: te(),\n  transactions: fe(oe({\n    transaction: q0,\n    meta: ge(cu),\n    version: Se(Vn)\n  })),\n  rewards: Se(fe(sn)),\n  blockTime: ge(te()),\n  blockHeight: ge(te())\n})));\nlt(ge(oe({\n  blockhash: ce(),\n  previousBlockhash: ce(),\n  parentSlot: te(),\n  transactions: fe(oe({\n    transaction: V0,\n    meta: ge(cu),\n    version: Se(Vn)\n  })),\n  rewards: Se(fe(sn)),\n  blockTime: ge(te()),\n  blockHeight: ge(te())\n})));\nlt(ge(oe({\n  blockhash: ce(),\n  previousBlockhash: ce(),\n  parentSlot: te(),\n  rewards: Se(fe(sn)),\n  blockTime: ge(te()),\n  blockHeight: ge(te())\n})));\nlt(ge(oe({\n  blockhash: ce(),\n  previousBlockhash: ce(),\n  parentSlot: te(),\n  transactions: fe(oe({\n    transaction: lu,\n    meta: ge(pa)\n  })),\n  rewards: Se(fe(sn)),\n  blockTime: ge(te())\n})));\nlt(ge(oe({\n  blockhash: ce(),\n  previousBlockhash: ce(),\n  parentSlot: te(),\n  signatures: fe(ce()),\n  blockTime: ge(te())\n})));\nlt(ge(oe({\n  slot: te(),\n  meta: ge(pa),\n  blockTime: Se(ge(te())),\n  transaction: lu,\n  version: Se(Vn)\n})));\nlt(ge(oe({\n  slot: te(),\n  transaction: q0,\n  meta: ge(cu),\n  blockTime: Se(ge(te())),\n  version: Se(Vn)\n})));\nFr(oe({\n  blockhash: ce(),\n  lastValidBlockHeight: te()\n}));\nFr(Xr());\nconst $E = oe({\n  slot: te(),\n  numTransactions: te(),\n  numSlots: te(),\n  samplePeriodSecs: te()\n});\nlt(fe($E));\nFr(ge(oe({\n  feeCalculator: oe({\n    lamportsPerSignature: te()\n  })\n})));\nlt(ce());\nlt(ce());\nconst GE = oe({\n  err: rn,\n  logs: fe(ce()),\n  signature: ce()\n});\noe({\n  result: ga(GE),\n  subscription: te()\n});\nObject.freeze({\n  CreateLookupTable: {\n    index: 0,\n    layout: z.struct([z.u32(\"instruction\"), On(\"recentSlot\"), z.u8(\"bumpSeed\")])\n  },\n  FreezeLookupTable: {\n    index: 1,\n    layout: z.struct([z.u32(\"instruction\")])\n  },\n  ExtendLookupTable: {\n    index: 2,\n    layout: z.struct([z.u32(\"instruction\"), On(), z.seq(We(), z.offset(z.u32(), -8), \"addresses\")])\n  },\n  DeactivateLookupTable: {\n    index: 3,\n    layout: z.struct([z.u32(\"instruction\")])\n  },\n  CloseLookupTable: {\n    index: 4,\n    layout: z.struct([z.u32(\"instruction\")])\n  }\n});\nnew Oe(\"AddressLookupTab1e1111111111111111111111111\");\nObject.freeze({\n  RequestUnits: {\n    index: 0,\n    layout: z.struct([z.u8(\"instruction\"), z.u32(\"units\"), z.u32(\"additionalFee\")])\n  },\n  RequestHeapFrame: {\n    index: 1,\n    layout: z.struct([z.u8(\"instruction\"), z.u32(\"bytes\")])\n  },\n  SetComputeUnitLimit: {\n    index: 2,\n    layout: z.struct([z.u8(\"instruction\"), z.u32(\"units\")])\n  },\n  SetComputeUnitPrice: {\n    index: 3,\n    layout: z.struct([z.u8(\"instruction\"), On(\"microLamports\")])\n  }\n});\nnew Oe(\"ComputeBudget111111111111111111111111111111\");\nz.struct([z.u8(\"numSignatures\"), z.u8(\"padding\"), z.u16(\"signatureOffset\"), z.u16(\"signatureInstructionIndex\"), z.u16(\"publicKeyOffset\"), z.u16(\"publicKeyInstructionIndex\"), z.u16(\"messageDataOffset\"), z.u16(\"messageDataSize\"), z.u16(\"messageInstructionIndex\")]);\nnew Oe(\"Ed25519SigVerify111111111111111111111111111\");\noE.utils.isValidPrivateKey;\nz.struct([z.u8(\"numSignatures\"), z.u16(\"signatureOffset\"), z.u8(\"signatureInstructionIndex\"), z.u16(\"ethAddressOffset\"), z.u8(\"ethAddressInstructionIndex\"), z.u16(\"messageDataOffset\"), z.u16(\"messageDataSize\"), z.u8(\"messageInstructionIndex\"), z.blob(20, \"ethAddress\"), z.blob(64, \"signature\"), z.u8(\"recoveryId\")]);\nnew Oe(\"KeccakSecp256k11111111111111111111111111111\");\nvar z0;\nnew Oe(\"StakeConfig11111111111111111111111111111111\");\nclass Y0 {\n  /**\n   * Create a new Lockup object\n   */\n  constructor(e, t, r) {\n    this.unixTimestamp = void 0, this.epoch = void 0, this.custodian = void 0, this.unixTimestamp = e, this.epoch = t, this.custodian = r;\n  }\n  /**\n   * Default, inactive Lockup value\n   */\n}\nz0 = Y0;\nY0.default = new z0(0, 0, Oe.default);\nObject.freeze({\n  Initialize: {\n    index: 0,\n    layout: z.struct([z.u32(\"instruction\"), hE(), fE()])\n  },\n  Authorize: {\n    index: 1,\n    layout: z.struct([z.u32(\"instruction\"), We(\"newAuthorized\"), z.u32(\"stakeAuthorizationType\")])\n  },\n  Delegate: {\n    index: 2,\n    layout: z.struct([z.u32(\"instruction\")])\n  },\n  Split: {\n    index: 3,\n    layout: z.struct([z.u32(\"instruction\"), z.ns64(\"lamports\")])\n  },\n  Withdraw: {\n    index: 4,\n    layout: z.struct([z.u32(\"instruction\"), z.ns64(\"lamports\")])\n  },\n  Deactivate: {\n    index: 5,\n    layout: z.struct([z.u32(\"instruction\")])\n  },\n  Merge: {\n    index: 7,\n    layout: z.struct([z.u32(\"instruction\")])\n  },\n  AuthorizeWithSeed: {\n    index: 8,\n    layout: z.struct([z.u32(\"instruction\"), We(\"newAuthorized\"), z.u32(\"stakeAuthorizationType\"), xn(\"authoritySeed\"), We(\"authorityOwner\")])\n  }\n});\nnew Oe(\"Stake11111111111111111111111111111111111111\");\nObject.freeze({\n  InitializeAccount: {\n    index: 0,\n    layout: z.struct([z.u32(\"instruction\"), gE()])\n  },\n  Authorize: {\n    index: 1,\n    layout: z.struct([z.u32(\"instruction\"), We(\"newAuthorized\"), z.u32(\"voteAuthorizationType\")])\n  },\n  Withdraw: {\n    index: 3,\n    layout: z.struct([z.u32(\"instruction\"), z.ns64(\"lamports\")])\n  },\n  UpdateValidatorIdentity: {\n    index: 4,\n    layout: z.struct([z.u32(\"instruction\")])\n  },\n  AuthorizeWithSeed: {\n    index: 10,\n    layout: z.struct([z.u32(\"instruction\"), pE()])\n  }\n});\nnew Oe(\"Vote111111111111111111111111111111111111111\");\nnew Oe(\"Va1idator1nfo111111111111111111111111111111\");\noe({\n  name: ce(),\n  website: Se(ce()),\n  details: Se(ce()),\n  iconUrl: Se(ce()),\n  keybaseUsername: Se(ce())\n});\nnew Oe(\"Vote111111111111111111111111111111111111111\");\nz.struct([\n  We(\"nodePubkey\"),\n  We(\"authorizedWithdrawer\"),\n  z.u8(\"commission\"),\n  z.nu64(),\n  // votes.length\n  z.seq(z.struct([z.nu64(\"slot\"), z.u32(\"confirmationCount\")]), z.offset(z.u32(), -8), \"votes\"),\n  z.u8(\"rootSlotValid\"),\n  z.nu64(\"rootSlot\"),\n  z.nu64(),\n  // authorizedVoters.length\n  z.seq(z.struct([z.nu64(\"epoch\"), We(\"authorizedVoter\")]), z.offset(z.u32(), -8), \"authorizedVoters\"),\n  z.struct([z.seq(z.struct([We(\"authorizedPubkey\"), z.nu64(\"epochOfLastAuthorizedSwitch\"), z.nu64(\"targetEpoch\")]), 32, \"buf\"), z.nu64(\"idx\"), z.u8(\"isEmpty\")], \"priorVoters\"),\n  z.nu64(),\n  // epochCredits.length\n  z.seq(z.struct([z.nu64(\"epoch\"), z.nu64(\"credits\"), z.nu64(\"prevCredits\")]), z.offset(z.u32(), -8), \"epochCredits\"),\n  z.struct([z.nu64(\"slot\"), z.nu64(\"timestamp\")], \"lastTimestamp\")\n]);\nconst VE = (s) => ({\n  request: s,\n  signMessage: (e) => s({ method: \"signMessage\", params: { message: e } }),\n  signTransaction: (e) => s({ method: \"signTransaction\", params: { transaction: e } }),\n  signAndSendTransaction: (e) => s({\n    method: \"signAndSendTransaction\",\n    params: e\n  })\n});\nfunction Gd(s) {\n  return Buffer.from(s.serialize({\n    verifySignatures: !1\n  })).toString(\"base64\");\n}\nfunction jE(s) {\n  const e = Buffer.from(s, \"base64\");\n  return nu.deserializeMessageVersion(e) === \"legacy\" ? iu.deserialize(e) : Ko.from(e);\n}\nfunction KE(s) {\n  return async (t) => {\n    if (t.method === \"connect\")\n      return await s(t);\n    if (t.method === \"signMessage\")\n      return await s(t);\n    if (t.method === \"signAndSendTransaction\") {\n      const { transaction: r } = t.params, n = {\n        transaction: Gd(r)\n      };\n      return await s({\n        method: \"signAndSendTransaction\",\n        params: n\n      });\n    }\n    if (t.method === \"signTransaction\") {\n      const { transaction: r } = t.params, n = {\n        transaction: Gd(r)\n      }, { signedTransaction: i } = await s({\n        method: \"signTransaction\",\n        params: n\n      });\n      return { signedTransaction: jE(i) };\n    }\n  };\n}\nconst HE = ({ miniAppHost: s, emitter: e }) => {\n  let t, r = null;\n  return {\n    visible: !1,\n    get onback() {\n      return r;\n    },\n    set onback(n) {\n      r && e.removeListener(\"backNavigationTriggered\", r), r = n, n && e.addListener(\"backNavigationTriggered\", n);\n    },\n    async show() {\n      await s.updateBackState({\n        visible: !0\n      }), this.visible = !0;\n    },\n    async hide() {\n      await s.updateBackState({\n        visible: !1\n      }), this.visible = !1;\n    },\n    async enableWebNavigation() {\n      t = qE({\n        back: this,\n        emitter: e\n      });\n    },\n    async disableWebNavigation() {\n      t == null || t(), t = void 0;\n    }\n  };\n};\nfunction qE({ emitter: s, back: e }) {\n  const t = WE();\n  if (t)\n    return zE({ emitter: s, back: e, navigation: t });\n  if (typeof window < \"u\")\n    return YE({ emitter: s, back: e, window });\n}\nfunction WE() {\n  if (typeof window < \"u\" && window.navigation !== void 0)\n    return window.navigation;\n}\nfunction zE({ emitter: s, back: e, navigation: t }) {\n  function r() {\n    t.canGoBack ? e.show() : e.hide();\n  }\n  function n() {\n    e.visible && t.canGoBack && t.back();\n  }\n  return t.addEventListener(\"navigatesuccess\", r), s.addListener(\"backNavigationTriggered\", n), () => {\n    t.removeEventListener(\"navigatesuccess\", r), s.removeListener(\"backNavigationTriggered\", n);\n  };\n}\nfunction YE({ emitter: s, back: e, window: t }) {\n  e.show();\n  function r() {\n    e.visible && t.history.back();\n  }\n  return s.addListener(\"backNavigationTriggered\", r), () => {\n    s.removeListener(\"backNavigationTriggered\", r);\n  };\n}\nconst ZE = \"0.1.1\";\nfunction XE() {\n  return ZE;\n}\nlet JE = class sc extends Error {\n  constructor(e, t = {}) {\n    const r = (() => {\n      var l;\n      if (t.cause instanceof sc) {\n        if (t.cause.details)\n          return t.cause.details;\n        if (t.cause.shortMessage)\n          return t.cause.shortMessage;\n      }\n      return (l = t.cause) != null && l.message ? t.cause.message : t.details;\n    })(), n = t.cause instanceof sc && t.cause.docsPath || t.docsPath, o = `https://oxlib.sh${n ?? \"\"}`, a = [\n      e || \"An error occurred.\",\n      ...t.metaMessages ? [\"\", ...t.metaMessages] : [],\n      ...r || n ? [\n        \"\",\n        r ? `Details: ${r}` : void 0,\n        n ? `See: ${o}` : void 0\n      ] : []\n    ].filter((l) => typeof l == \"string\").join(`\n`);\n    super(a, t.cause ? { cause: t.cause } : void 0), Object.defineProperty(this, \"details\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: void 0\n    }), Object.defineProperty(this, \"docs\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: void 0\n    }), Object.defineProperty(this, \"docsPath\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: void 0\n    }), Object.defineProperty(this, \"shortMessage\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: void 0\n    }), Object.defineProperty(this, \"cause\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: void 0\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"BaseError\"\n    }), Object.defineProperty(this, \"version\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: `ox@${XE()}`\n    }), this.cause = t.cause, this.details = r, this.docs = o, this.docsPath = n, this.shortMessage = e;\n  }\n  walk(e) {\n    return Z0(this, e);\n  }\n};\nfunction Z0(s, e) {\n  return e != null && e(s) ? s : s && typeof s == \"object\" && \"cause\" in s && s.cause ? Z0(s.cause, e) : e ? null : s;\n}\nfunction X0(s, e = {}) {\n  const { raw: t = !1 } = e, r = s;\n  if (t)\n    return s;\n  if (r.error) {\n    const { code: n } = r.error, i = n === Bn.code ? Bn : n === ri.code ? ri : n === di.code ? di : n === ci.code ? ci : n === ai.code ? ai : n === ui.code ? ui : n === oi.code ? oi : n === hi.code ? hi : n === si.code ? si : n === ni.code ? ni : n === ii.code ? ii : n === li.code ? li : mr;\n    throw new i(r.error);\n  }\n  return r.result;\n}\nlet mr = class extends Error {\n  constructor(e) {\n    const { code: t, message: r, data: n } = e;\n    super(r), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.BaseError\"\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: void 0\n    }), Object.defineProperty(this, \"data\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: void 0\n    }), this.code = t, this.data = n;\n  }\n};\nclass ri extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Missing or invalid parameters.\",\n      ...e,\n      code: ri.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32e3\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.InvalidInputError\"\n    });\n  }\n}\nObject.defineProperty(ri, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32e3\n});\nclass si extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Requested resource not found.\",\n      ...e,\n      code: si.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32001\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.ResourceNotFoundError\"\n    });\n  }\n}\nObject.defineProperty(si, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32001\n});\nclass ni extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Requested resource not available.\",\n      ...e,\n      code: ni.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32002\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.ResourceUnavailableError\"\n    });\n  }\n}\nObject.defineProperty(ni, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32002\n});\nclass ii extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Transaction creation failed.\",\n      ...e,\n      code: ii.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32003\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.TransactionRejectedError\"\n    });\n  }\n}\nObject.defineProperty(ii, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32003\n});\nclass oi extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Method is not implemented.\",\n      ...e,\n      code: oi.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32004\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.MethodNotSupportedError\"\n    });\n  }\n}\nObject.defineProperty(oi, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32004\n});\nclass ai extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Rate limit exceeded.\",\n      ...e,\n      code: ai.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32005\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.LimitExceededError\"\n    });\n  }\n}\nObject.defineProperty(ai, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32005\n});\nclass li extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"JSON-RPC version not supported.\",\n      ...e,\n      code: li.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32006\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.VersionNotSupportedError\"\n    });\n  }\n}\nObject.defineProperty(li, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32006\n});\nclass ci extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Input is not a valid JSON-RPC request.\",\n      ...e,\n      code: ci.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32600\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.InvalidRequestError\"\n    });\n  }\n}\nObject.defineProperty(ci, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32600\n});\nclass ui extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Method does not exist.\",\n      ...e,\n      code: ui.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32601\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.MethodNotFoundError\"\n    });\n  }\n}\nObject.defineProperty(ui, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32601\n});\nclass di extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Invalid method parameters.\",\n      ...e,\n      code: di.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32602\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.InvalidParamsError\"\n    });\n  }\n}\nObject.defineProperty(di, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32602\n});\nclass Bn extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Internal JSON-RPC error.\",\n      ...e,\n      code: Bn.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32603\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.InternalErrorError\"\n    });\n  }\n}\nObject.defineProperty(Bn, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32603\n});\nclass hi extends mr {\n  constructor(e = {}) {\n    super({\n      message: \"Failed to parse JSON-RPC response.\",\n      ...e,\n      code: hi.code\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: -32700\n    }), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"RpcResponse.ParseError\"\n    });\n  }\n}\nObject.defineProperty(hi, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: -32700\n});\nclass nn extends Error {\n  constructor(e, t) {\n    super(t), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"ProviderRpcError\"\n    }), Object.defineProperty(this, \"code\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: void 0\n    }), Object.defineProperty(this, \"details\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: void 0\n    }), this.code = e, this.details = t;\n  }\n}\nclass J0 extends nn {\n  constructor({ message: e = \"The user rejected the request.\" } = {}) {\n    super(4001, e), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"Provider.UserRejectedRequestError\"\n    });\n  }\n}\nObject.defineProperty(J0, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: 4001\n});\nclass Q0 extends nn {\n  constructor({ message: e = \"The requested method and/or account has not been authorized by the user.\" } = {}) {\n    super(4100, e), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"Provider.UnauthorizedError\"\n    });\n  }\n}\nObject.defineProperty(Q0, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: 4100\n});\nclass eg extends nn {\n  constructor({ message: e = \"The provider does not support the requested method.\" } = {}) {\n    super(4200, e), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"Provider.UnsupportedMethodError\"\n    });\n  }\n}\nObject.defineProperty(eg, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: 4200\n});\nclass tg extends nn {\n  constructor({ message: e = \"The provider is disconnected from all chains.\" } = {}) {\n    super(4900, e), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"Provider.DisconnectedError\"\n    });\n  }\n}\nObject.defineProperty(tg, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: 4900\n});\nclass rg extends nn {\n  constructor({ message: e = \"The provider is not connected to the requested chain.\" } = {}) {\n    super(4901, e), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"Provider.ChainDisconnectedError\"\n    });\n  }\n}\nObject.defineProperty(rg, \"code\", {\n  enumerable: !0,\n  configurable: !0,\n  writable: !0,\n  value: 4901\n});\nfunction QE() {\n  const s = new L0();\n  return {\n    get eventNames() {\n      return s.eventNames.bind(s);\n    },\n    get listenerCount() {\n      return s.listenerCount.bind(s);\n    },\n    get listeners() {\n      return s.listeners.bind(s);\n    },\n    addListener: s.addListener.bind(s),\n    emit: s.emit.bind(s),\n    off: s.off.bind(s),\n    on: s.on.bind(s),\n    once: s.once.bind(s),\n    removeAllListeners: s.removeAllListeners.bind(s),\n    removeListener: s.removeListener.bind(s)\n  };\n}\nfunction ex(s, e = {}) {\n  var r, n;\n  const { includeEvents: t = !0 } = e;\n  if (!s)\n    throw new tx();\n  return {\n    ...t ? {\n      on: (r = s.on) == null ? void 0 : r.bind(s),\n      removeListener: (n = s.removeListener) == null ? void 0 : n.bind(s)\n    } : {},\n    async request(i) {\n      const o = await s.request(i);\n      return o && typeof o == \"object\" && \"jsonrpc\" in o ? X0(o) : o;\n    }\n  };\n}\nclass tx extends JE {\n  constructor() {\n    super(\"`provider` is undefined.\"), Object.defineProperty(this, \"name\", {\n      enumerable: !0,\n      configurable: !0,\n      writable: !0,\n      value: \"Provider.IsUndefinedError\"\n    });\n  }\n}\nfunction rx(s = {}) {\n  let e = s.id ?? 0;\n  return {\n    prepare(t) {\n      return sx({\n        id: e++,\n        ...t\n      });\n    },\n    get id() {\n      return e;\n    }\n  };\n}\nfunction sx(s) {\n  return {\n    ...s,\n    jsonrpc: \"2.0\"\n  };\n}\n/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\nconst sg = Symbol(\"Comlink.proxy\"), nx = Symbol(\"Comlink.endpoint\"), ix = Symbol(\"Comlink.releaseProxy\"), ll = Symbol(\"Comlink.finalizer\"), ho = Symbol(\"Comlink.thrown\"), ng = (s) => typeof s == \"object\" && s !== null || typeof s == \"function\", ox = {\n  canHandle: (s) => ng(s) && s[sg],\n  serialize(s) {\n    const { port1: e, port2: t } = new MessageChannel();\n    return og(s, e), [t, [t]];\n  },\n  deserialize(s) {\n    return s.start(), lg(s);\n  }\n}, ax = {\n  canHandle: (s) => ng(s) && ho in s,\n  serialize({ value: s }) {\n    let e;\n    return s instanceof Error ? e = {\n      isError: !0,\n      value: {\n        message: s.message,\n        name: s.name,\n        stack: s.stack\n      }\n    } : e = { isError: !1, value: s }, [e, []];\n  },\n  deserialize(s) {\n    throw s.isError ? Object.assign(new Error(s.value.message), s.value) : s.value;\n  }\n}, ig = /* @__PURE__ */ new Map([\n  [\"proxy\", ox],\n  [\"throw\", ax]\n]);\nfunction lx(s, e) {\n  for (const t of s)\n    if (e === t || t === \"*\" || t instanceof RegExp && t.test(e))\n      return !0;\n  return !1;\n}\nfunction og(s, e = globalThis, t = [\"*\"]) {\n  e.addEventListener(\"message\", function r(n) {\n    if (!n || !n.data)\n      return;\n    if (!lx(t, n.origin)) {\n      console.warn(`Invalid origin '${n.origin}' for comlink proxy`);\n      return;\n    }\n    const { id: i, type: o, path: a } = Object.assign({ path: [] }, n.data), l = (n.data.argumentList || []).map($s);\n    let c;\n    try {\n      const u = a.slice(0, -1).reduce((h, f) => h[f], s), d = a.reduce((h, f) => h[f], s);\n      switch (o) {\n        case \"GET\":\n          c = d;\n          break;\n        case \"SET\":\n          u[a.slice(-1)[0]] = $s(n.data.value), c = !0;\n          break;\n        case \"APPLY\":\n          c = d.apply(u, l);\n          break;\n        case \"CONSTRUCT\":\n          {\n            const h = new d(...l);\n            c = gx(h);\n          }\n          break;\n        case \"ENDPOINT\":\n          {\n            const { port1: h, port2: f } = new MessageChannel();\n            og(s, f), c = fx(h, [h]);\n          }\n          break;\n        case \"RELEASE\":\n          c = void 0;\n          break;\n        default:\n          return;\n      }\n    } catch (u) {\n      c = { value: u, [ho]: 0 };\n    }\n    Promise.resolve(c).catch((u) => ({ value: u, [ho]: 0 })).then((u) => {\n      const [d, h] = zo(u);\n      e.postMessage(Object.assign(Object.assign({}, d), { id: i }), h), o === \"RELEASE\" && (e.removeEventListener(\"message\", r), ag(e), ll in s && typeof s[ll] == \"function\" && s[ll]());\n    }).catch((u) => {\n      const [d, h] = zo({\n        value: new TypeError(\"Unserializable return value\"),\n        [ho]: 0\n      });\n      e.postMessage(Object.assign(Object.assign({}, d), { id: i }), h);\n    });\n  }), e.start && e.start();\n}\nfunction cx(s) {\n  return s.constructor.name === \"MessagePort\";\n}\nfunction ag(s) {\n  cx(s) && s.close();\n}\nfunction lg(s, e) {\n  const t = /* @__PURE__ */ new Map();\n  return s.addEventListener(\"message\", function(n) {\n    const { data: i } = n;\n    if (!i || !i.id)\n      return;\n    const o = t.get(i.id);\n    if (o)\n      try {\n        o(i);\n      } finally {\n        t.delete(i.id);\n      }\n  }), nc(s, t, [], e);\n}\nfunction Vi(s) {\n  if (s)\n    throw new Error(\"Proxy has been released and is not useable\");\n}\nfunction cg(s) {\n  return yn(s, /* @__PURE__ */ new Map(), {\n    type: \"RELEASE\"\n  }).then(() => {\n    ag(s);\n  });\n}\nconst qo = /* @__PURE__ */ new WeakMap(), Wo = \"FinalizationRegistry\" in globalThis && new FinalizationRegistry((s) => {\n  const e = (qo.get(s) || 0) - 1;\n  qo.set(s, e), e === 0 && cg(s);\n});\nfunction ux(s, e) {\n  const t = (qo.get(e) || 0) + 1;\n  qo.set(e, t), Wo && Wo.register(s, e, s);\n}\nfunction dx(s) {\n  Wo && Wo.unregister(s);\n}\nfunction nc(s, e, t = [], r = function() {\n}) {\n  let n = !1;\n  const i = new Proxy(r, {\n    get(o, a) {\n      if (Vi(n), a === ix)\n        return () => {\n          dx(i), cg(s), e.clear(), n = !0;\n        };\n      if (a === \"then\") {\n        if (t.length === 0)\n          return { then: () => i };\n        const l = yn(s, e, {\n          type: \"GET\",\n          path: t.map((c) => c.toString())\n        }).then($s);\n        return l.then.bind(l);\n      }\n      return nc(s, e, [...t, a]);\n    },\n    set(o, a, l) {\n      Vi(n);\n      const [c, u] = zo(l);\n      return yn(s, e, {\n        type: \"SET\",\n        path: [...t, a].map((d) => d.toString()),\n        value: c\n      }, u).then($s);\n    },\n    apply(o, a, l) {\n      Vi(n);\n      const c = t[t.length - 1];\n      if (c === nx)\n        return yn(s, e, {\n          type: \"ENDPOINT\"\n        }).then($s);\n      if (c === \"bind\")\n        return nc(s, e, t.slice(0, -1));\n      const [u, d] = Vd(l);\n      return yn(s, e, {\n        type: \"APPLY\",\n        path: t.map((h) => h.toString()),\n        argumentList: u\n      }, d).then($s);\n    },\n    construct(o, a) {\n      Vi(n);\n      const [l, c] = Vd(a);\n      return yn(s, e, {\n        type: \"CONSTRUCT\",\n        path: t.map((u) => u.toString()),\n        argumentList: l\n      }, c).then($s);\n    }\n  });\n  return ux(i, s), i;\n}\nfunction hx(s) {\n  return Array.prototype.concat.apply([], s);\n}\nfunction Vd(s) {\n  const e = s.map(zo);\n  return [e.map((t) => t[0]), hx(e.map((t) => t[1]))];\n}\nconst ug = /* @__PURE__ */ new WeakMap();\nfunction fx(s, e) {\n  return ug.set(s, e), s;\n}\nfunction gx(s) {\n  return Object.assign(s, { [sg]: !0 });\n}\nfunction px(s, e = globalThis, t = \"*\") {\n  return {\n    postMessage: (r, n) => s.postMessage(r, t, n),\n    addEventListener: e.addEventListener.bind(e),\n    removeEventListener: e.removeEventListener.bind(e)\n  };\n}\nfunction zo(s) {\n  for (const [e, t] of ig)\n    if (t.canHandle(s)) {\n      const [r, n] = t.serialize(s);\n      return [\n        {\n          type: \"HANDLER\",\n          name: e,\n          value: r\n        },\n        n\n      ];\n    }\n  return [\n    {\n      type: \"RAW\",\n      value: s\n    },\n    ug.get(s) || []\n  ];\n}\nfunction $s(s) {\n  switch (s.type) {\n    case \"HANDLER\":\n      return ig.get(s.name).deserialize(s.value);\n    case \"RAW\":\n      return s.value;\n  }\n}\nfunction yn(s, e, t, r) {\n  return new Promise((n) => {\n    const i = mx();\n    e.set(i, n), s.start && s.start(), s.postMessage(Object.assign({ id: i }, t), r);\n  });\n}\nfunction mx() {\n  return new Array(4).fill(0).map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16)).join(\"-\");\n}\nconst yx = {\n  postMessage() {\n  },\n  addEventListener: () => {\n  },\n  removeEventListener: () => {\n  }\n}, vx = {\n  postMessage: (s) => {\n    window.ReactNativeWebView.postMessage(JSON.stringify(s));\n  },\n  addEventListener: (s, e, ...t) => {\n    document.addEventListener(\"FarcasterFrameCallback\", e, ...t);\n  },\n  removeEventListener: (s, e) => {\n    document.removeEventListener(\"FarcasterFrameCallback\", e);\n  }\n}, Ex = typeof window > \"u\" ? yx : window != null && window.ReactNativeWebView ? vx : px((window == null ? void 0 : window.parent) ?? window), Me = lg(Ex), uu = QE(), xx = rx();\nfunction Sx({ code: s, details: e }) {\n  switch (s) {\n    case 4001:\n      return new J0();\n    case 4100:\n      return new Q0();\n    case 4200:\n      return new eg();\n    case 4900:\n      return new tg();\n    case 4901:\n      return new rg();\n    default:\n      return new nn(s, e ?? \"Unknown provider RPC error\");\n  }\n}\nconst fi = ex({\n  ...uu,\n  async request(s) {\n    const e = xx.prepare(s);\n    try {\n      const t = await Me.ethProviderRequestV2(e).then((r) => X0(r, { request: e, raw: !0 }));\n      if (t.error)\n        throw Sx(t.error);\n      return t.result;\n    } catch (t) {\n      if (t instanceof Error && t.message.match(/cannot read property 'apply'/i))\n        return await Me.ethProviderRequest(e);\n      throw t instanceof nn || t instanceof mr ? t : new Bn({\n        message: t instanceof Error ? t.message : void 0\n      });\n    }\n  }\n});\nasync function bx() {\n  try {\n    const s = await Me.getCapabilities();\n    return !s.includes(\"wallet.getEthereumProvider\") && !s.includes(\"wallet.getEvmProvider\") ? void 0 : fi;\n  } catch {\n    return fi;\n  }\n}\nfunction dg(s) {\n  const e = new CustomEvent(\"eip6963:announceProvider\", { detail: Object.freeze(s) });\n  window.dispatchEvent(e);\n  const t = () => window.dispatchEvent(e);\n  return window.addEventListener(\"eip6963:requestProvider\", t), () => window.removeEventListener(\"eip6963:requestProvider\", t);\n}\ntypeof document < \"u\" && (document.addEventListener(\"eip6963:requestProvider\", () => {\n  Me.eip6963RequestProvider();\n}), document.addEventListener(\"FarcasterFrameEthProviderEvent\", (s) => {\n  if (s instanceof MessageEvent) {\n    const e = s.data;\n    uu.emit(e.event, ...e.params);\n  }\n}), document.addEventListener(\"FarcasterFrameEvent\", (s) => {\n  if (s instanceof MessageEvent) {\n    const e = s.data;\n    e.event === \"eip6963:announceProvider\" && dg({\n      info: e.info,\n      provider: fi\n    });\n  }\n}));\ntypeof window < \"u\" && (window.addEventListener(\"eip6963:requestProvider\", () => {\n  Me.eip6963RequestProvider();\n}), window.addEventListener(\"message\", (s) => {\n  if (s instanceof MessageEvent && s.data.type === \"frameEthProviderEvent\") {\n    const e = s.data;\n    uu.emit(e.event, ...e.params);\n  }\n}), window.addEventListener(\"message\", (s) => {\n  if (s instanceof MessageEvent && s.data.type === \"frameEvent\") {\n    const e = s.data.event;\n    e.event === \"eip6963:announceProvider\" && dg({\n      info: e.info,\n      provider: fi\n    });\n  }\n}));\nnew TextEncoder();\nconst hg = new TextDecoder(), Tx = (s) => {\n  const e = atob(s), t = new Uint8Array(e.length);\n  for (let r = 0; r < e.length; r++)\n    t[r] = e.charCodeAt(r);\n  return t;\n}, wx = (s) => {\n  let e = s;\n  e instanceof Uint8Array && (e = hg.decode(e)), e = e.replace(/-/g, \"+\").replace(/_/g, \"/\").replace(/\\s/g, \"\");\n  try {\n    return Tx(e);\n  } catch {\n    throw new TypeError(\"The input to be decoded is not correctly encoded.\");\n  }\n}, Ax = wx;\nfunction Ix(s) {\n  return typeof s == \"object\" && s !== null;\n}\nfunction _x(s) {\n  if (!Ix(s) || Object.prototype.toString.call(s) !== \"[object Object]\")\n    return !1;\n  if (Object.getPrototypeOf(s) === null)\n    return !0;\n  let e = s;\n  for (; Object.getPrototypeOf(e) !== null; )\n    e = Object.getPrototypeOf(e);\n  return Object.getPrototypeOf(s) === e;\n}\nclass dr extends Error {\n  constructor(e, t) {\n    var r;\n    super(e, t), this.code = \"ERR_JOSE_GENERIC\", this.name = this.constructor.name, (r = Error.captureStackTrace) == null || r.call(Error, this, this.constructor);\n  }\n}\ndr.code = \"ERR_JOSE_GENERIC\";\nclass Rx extends dr {\n  constructor(e, t, r = \"unspecified\", n = \"unspecified\") {\n    super(e, { cause: { claim: r, reason: n, payload: t } }), this.code = \"ERR_JWT_CLAIM_VALIDATION_FAILED\", this.claim = r, this.reason = n, this.payload = t;\n  }\n}\nRx.code = \"ERR_JWT_CLAIM_VALIDATION_FAILED\";\nclass Lx extends dr {\n  constructor(e, t, r = \"unspecified\", n = \"unspecified\") {\n    super(e, { cause: { claim: r, reason: n, payload: t } }), this.code = \"ERR_JWT_EXPIRED\", this.claim = r, this.reason = n, this.payload = t;\n  }\n}\nLx.code = \"ERR_JWT_EXPIRED\";\nclass Cx extends dr {\n  constructor() {\n    super(...arguments), this.code = \"ERR_JOSE_ALG_NOT_ALLOWED\";\n  }\n}\nCx.code = \"ERR_JOSE_ALG_NOT_ALLOWED\";\nclass kx extends dr {\n  constructor() {\n    super(...arguments), this.code = \"ERR_JOSE_NOT_SUPPORTED\";\n  }\n}\nkx.code = \"ERR_JOSE_NOT_SUPPORTED\";\nclass Dx extends dr {\n  constructor(e = \"decryption operation failed\", t) {\n    super(e, t), this.code = \"ERR_JWE_DECRYPTION_FAILED\";\n  }\n}\nDx.code = \"ERR_JWE_DECRYPTION_FAILED\";\nclass Px extends dr {\n  constructor() {\n    super(...arguments), this.code = \"ERR_JWE_INVALID\";\n  }\n}\nPx.code = \"ERR_JWE_INVALID\";\nclass Mx extends dr {\n  constructor() {\n    super(...arguments), this.code = \"ERR_JWS_INVALID\";\n  }\n}\nMx.code = \"ERR_JWS_INVALID\";\nclass Ts extends dr {\n  constructor() {\n    super(...arguments), this.code = \"ERR_JWT_INVALID\";\n  }\n}\nTs.code = \"ERR_JWT_INVALID\";\nclass Ox extends dr {\n  constructor() {\n    super(...arguments), this.code = \"ERR_JWK_INVALID\";\n  }\n}\nOx.code = \"ERR_JWK_INVALID\";\nclass Bx extends dr {\n  constructor() {\n    super(...arguments), this.code = \"ERR_JWKS_INVALID\";\n  }\n}\nBx.code = \"ERR_JWKS_INVALID\";\nclass Fx extends dr {\n  constructor(e = \"no applicable key found in the JSON Web Key Set\", t) {\n    super(e, t), this.code = \"ERR_JWKS_NO_MATCHING_KEY\";\n  }\n}\nFx.code = \"ERR_JWKS_NO_MATCHING_KEY\";\nclass Nx extends dr {\n  constructor(e = \"multiple matching keys found in the JSON Web Key Set\", t) {\n    super(e, t), this.code = \"ERR_JWKS_MULTIPLE_MATCHING_KEYS\";\n  }\n}\nNx.code = \"ERR_JWKS_MULTIPLE_MATCHING_KEYS\";\nclass Ux extends dr {\n  constructor(e = \"request timed out\", t) {\n    super(e, t), this.code = \"ERR_JWKS_TIMEOUT\";\n  }\n}\nUx.code = \"ERR_JWKS_TIMEOUT\";\nclass $x extends dr {\n  constructor(e = \"signature verification failed\", t) {\n    super(e, t), this.code = \"ERR_JWS_SIGNATURE_VERIFICATION_FAILED\";\n  }\n}\n$x.code = \"ERR_JWS_SIGNATURE_VERIFICATION_FAILED\";\nfunction Gx(s) {\n  if (typeof s != \"string\")\n    throw new Ts(\"JWTs must use Compact JWS serialization, JWT must be a string\");\n  const { 1: e, length: t } = s.split(\".\");\n  if (t === 5)\n    throw new Ts(\"Only JWTs using Compact JWS serialization can be decoded\");\n  if (t !== 3)\n    throw new Ts(\"Invalid JWT\");\n  if (!e)\n    throw new Ts(\"JWTs must contain a payload\");\n  let r;\n  try {\n    r = Ax(e);\n  } catch {\n    throw new Ts(\"Failed to base64url decode the payload\");\n  }\n  let n;\n  try {\n    n = JSON.parse(hg.decode(r));\n  } catch {\n    throw new Ts(\"Failed to parse the decoded payload as JSON\");\n  }\n  if (!_x(n))\n    throw new Ts(\"Invalid JWT Claims Set\");\n  return n;\n}\nfunction Vx(s) {\n  return Gx(s);\n}\nclass ma extends Error {\n  constructor(e, t = {}) {\n    const r = (() => {\n      var i;\n      if (t.cause instanceof ma) {\n        if (t.cause.details)\n          return t.cause.details;\n        if (t.cause.shortMessage)\n          return t.cause.shortMessage;\n      }\n      return t.cause && \"details\" in t.cause && typeof t.cause.details == \"string\" ? t.cause.details : (i = t.cause) != null && i.message ? t.cause.message : t.details;\n    })(), n = [\n      e || \"An error occurred.\",\n      ...t.metaMessages ? [\"\", ...t.metaMessages] : [],\n      ...r ? [\n        \"\",\n        r ? `Details: ${r}` : void 0\n      ] : []\n    ].filter((i) => typeof i == \"string\").join(`\n`);\n    super(n, t.cause ? { cause: t.cause } : void 0), this.name = \"BaseError\", this.cause = t.cause, this.details = r, this.shortMessage = e;\n  }\n}\nclass fg extends ma {\n  constructor({ status: e }) {\n    super(`Request failed with status ${e}`), this.name = \"RequestFailedError\";\n  }\n}\nclass jx extends ma {\n  constructor(e) {\n    super(e), this.name = \"InvalidToken\";\n  }\n}\nasync function Kx({ origin: s }) {\n  const e = await fetch(`${s}/nonce`, {\n    method: \"POST\"\n  });\n  if (!e.ok)\n    throw new fg({ status: e.status });\n  return await e.json();\n}\nasync function Hx({ origin: s }, e) {\n  const t = await fetch(`${s}/verify-siwf`, {\n    method: \"POST\",\n    headers: new Headers({ \"Content-Type\": \"application/json\" }),\n    body: JSON.stringify(e)\n  });\n  if (!t.ok)\n    throw new fg({ status: t.status });\n  const r = await t.json();\n  if (r.valid === !1)\n    throw new jx(r.message ?? \"unknown\");\n  return { token: r.token };\n}\nfunction qx(s = {}) {\n  return {\n    origin: s.origin ?? \"https://auth.farcaster.xyz\"\n  };\n}\nfunction Wx(s = {}) {\n  const e = qx(s);\n  return {\n    generateNonce: () => Kx(e),\n    verifySiwf: (t) => Hx(e, t)\n  };\n}\nconst zx = /^(?:(?<scheme>[a-zA-Z][a-zA-Z0-9+-.]*):\\/\\/)?(?<domain>[a-zA-Z0-9+-.]*(?::[0-9]{1,5})?) (?:wants you to sign in with your Ethereum account:\\n)(?<address>0x[a-fA-F0-9]{40})\\n\\n(?:(?<statement>.*)\\n\\n)?/, Yx = /(?:URI: (?<uri>.+))\\n(?:Version: (?<version>.+))\\n(?:Chain ID: (?<chainId>\\d+))\\n(?:Nonce: (?<nonce>[a-zA-Z0-9]+))\\n(?:Issued At: (?<issuedAt>.+))(?:\\nExpiration Time: (?<expirationTime>.+))?(?:\\nNot Before: (?<notBefore>.+))?(?:\\nRequest ID: (?<requestId>.+))?/;\nfunction Zx(s) {\n  var d, h, f;\n  const { scheme: e, statement: t, ...r } = ((d = s.match(zx)) == null ? void 0 : d.groups) ?? {}, { chainId: n, expirationTime: i, issuedAt: o, notBefore: a, requestId: l, ...c } = ((h = s.match(Yx)) == null ? void 0 : h.groups) ?? {}, u = (f = s.split(\"Resources:\")[1]) == null ? void 0 : f.split(`\n- `).slice(1);\n  return {\n    ...r,\n    ...c,\n    ...n ? { chainId: Number(n) } : {},\n    ...i ? { expirationTime: new Date(i) } : {},\n    ...o ? { issuedAt: new Date(o) } : {},\n    ...a ? { notBefore: new Date(a) } : {},\n    ...l ? { requestId: l } : {},\n    ...u ? { resources: u } : {},\n    ...e ? { scheme: e } : {},\n    ...t ? { statement: t } : {}\n  };\n}\nconst jd = /* @__PURE__ */ (() => {\n  let s, e;\n  async function t(r) {\n    const n = Wx({\n      origin: r.quickAuthServerOrigin\n    }), { nonce: i } = await n.generateNonce(), o = await Me.signIn({\n      nonce: i,\n      acceptAuthAddress: !0\n    });\n    if (o.result) {\n      const a = Zx(o.result.message);\n      if (!a.domain)\n        throw new Error(\"Missing domain on SIWE message\");\n      const l = await n.verifySiwf({\n        domain: a.domain,\n        message: o.result.message,\n        signature: o.result.signature\n      });\n      return s = {\n        token: l.token,\n        payload: Vx(l.token)\n      }, l;\n    }\n    throw o.error.type === \"rejected_by_user\" ? new Of() : new Error(\"Unreachable\");\n  }\n  return {\n    get token() {\n      if (s && new Date(s.payload.exp * 1e3) > new Date(Date.now() + 15e3))\n        return s.token;\n    },\n    async getToken(r = {}) {\n      const n = r.force ?? !1;\n      return s && !n && new Date(s.payload.exp * 1e3) > new Date(Date.now() + 15e3) ? { token: s.token } : (e || (e = t(r)), e.finally(() => {\n        e = void 0;\n      }), e);\n    },\n    async fetch(r, n) {\n      const { token: i } = await this.getToken(), o = new Headers(n == null ? void 0 : n.headers);\n      return o.set(\"Authorization\", `Bearer ${i}`), fetch(r, {\n        ...n,\n        headers: o\n      });\n    }\n  };\n})();\nfunction Xx() {\n  const s = new L0();\n  return {\n    get eventNames() {\n      return s.eventNames.bind(s);\n    },\n    get listenerCount() {\n      return s.listenerCount.bind(s);\n    },\n    get listeners() {\n      return s.listeners.bind(s);\n    },\n    addListener: s.addListener.bind(s),\n    emit: s.emit.bind(s),\n    off: s.off.bind(s),\n    on: s.on.bind(s),\n    once: s.once.bind(s),\n    removeAllListeners: s.removeAllListeners.bind(s),\n    removeListener: s.removeListener.bind(s)\n  };\n}\nconst nr = Xx(), { solanaProviderRequest: Kd } = Me;\nlet gg;\nKd && (gg = VE(KE(Kd)));\nasync function Hd() {\n  let s;\n  try {\n    s = await Me.getCapabilities();\n  } catch {\n  }\n  if (s != null && s.includes(\"wallet.getSolanaProvider\"))\n    return gg;\n}\nlet qd = null;\nasync function Jx(s = 1e3) {\n  if (qd === !0)\n    return !0;\n  if (typeof window > \"u\" || !window.ReactNativeWebView && window === window.parent)\n    return !1;\n  const e = await Promise.race([\n    Me.context.then((t) => !!t),\n    // Check if context resolves to truthy\n    new Promise((t) => {\n      setTimeout(() => t(!1), s);\n    })\n  ]).catch(() => !1);\n  return e && (qd = !0), e;\n}\nconst Wd = async () => {\n  const s = await Me.addFrame();\n  if (s.result)\n    return s.result;\n  throw s.error.type === \"invalid_domain_manifest\" ? new Tm() : s.error.type === \"rejected_by_user\" ? new wm() : new Error(\"Unreachable\");\n}, ht = {\n  ...nr,\n  getCapabilities: Me.getCapabilities,\n  getChains: Me.getChains,\n  isInMiniApp: Jx,\n  context: Me.context,\n  back: HE({ miniAppHost: Me, emitter: nr }),\n  quickAuth: jd,\n  actions: {\n    setPrimaryButton: Me.setPrimaryButton.bind(Me),\n    ready: async (s = {}) => await Me.ready(s),\n    close: Me.close.bind(Me),\n    viewCast: Me.viewCast.bind(Me),\n    viewProfile: Me.viewProfile.bind(Me),\n    openMiniApp: Me.openMiniApp.bind(Me),\n    signIn: async (s) => {\n      const e = await Me.signIn(s);\n      if (e.result)\n        return e.result;\n      throw e.error.type === \"rejected_by_user\" ? new Of() : new Error(\"Unreachable\");\n    },\n    openUrl: (s) => {\n      const e = typeof s == \"string\" ? s : s.url;\n      return Me.openUrl(e.trim());\n    },\n    addFrame: Wd,\n    addMiniApp: Wd,\n    composeCast(s = {}) {\n      return Me.composeCast(s);\n    },\n    viewToken: Me.viewToken.bind(Me),\n    sendToken: Me.sendToken.bind(Me),\n    swapToken: Me.swapToken.bind(Me),\n    requestCameraAndMicrophoneAccess: Me.requestCameraAndMicrophoneAccess.bind(Me)\n  },\n  experimental: {\n    getSolanaProvider: Hd,\n    signManifest: async (s) => {\n      const e = await Me.signManifest(s);\n      if (e.result)\n        return e.result;\n      throw e.error.type === \"rejected_by_user\" ? new Am() : e.error.type === \"invalid_domain\" ? new Im() : e.error.type === \"generic_error\" ? new _m(e.error.message) : new Error(\"Unreachable\");\n    },\n    quickAuth(s) {\n      return jd.getToken(s);\n    }\n  },\n  wallet: {\n    ethProvider: fi,\n    getEthereumProvider: bx,\n    getSolanaProvider: Hd\n  },\n  haptics: {\n    impactOccurred: Me.impactOccurred.bind(Me),\n    notificationOccurred: Me.notificationOccurred.bind(Me),\n    selectionChanged: Me.selectionChanged.bind(Me)\n  }\n};\ntypeof document < \"u\" && document.addEventListener(\"FarcasterFrameEvent\", (s) => {\n  if (s instanceof MessageEvent) {\n    const e = s.data;\n    e.event === \"primary_button_clicked\" ? nr.emit(\"primaryButtonClicked\") : e.event === \"miniapp_added\" ? nr.emit(\"miniAppAdded\", {\n      notificationDetails: e.notificationDetails\n    }) : e.event === \"miniapp_add_rejected\" ? nr.emit(\"miniAppAddRejected\", { reason: e.reason }) : e.event === \"miniapp_removed\" ? nr.emit(\"miniAppRemoved\") : e.event === \"notifications_enabled\" ? nr.emit(\"notificationsEnabled\", {\n      notificationDetails: e.notificationDetails\n    }) : e.event === \"notifications_disabled\" ? nr.emit(\"notificationsDisabled\") : e.event === \"back_navigation_triggered\" && nr.emit(\"backNavigationTriggered\");\n  }\n});\ntypeof window < \"u\" && window.addEventListener(\"message\", (s) => {\n  if (s instanceof MessageEvent && s.data.type === \"frameEvent\") {\n    const e = s.data.event;\n    e.event === \"primary_button_clicked\" ? nr.emit(\"primaryButtonClicked\") : e.event === \"miniapp_added\" ? nr.emit(\"miniAppAdded\", {\n      notificationDetails: e.notificationDetails\n    }) : e.event === \"miniapp_add_rejected\" ? nr.emit(\"miniAppAddRejected\", { reason: e.reason }) : e.event === \"miniapp_removed\" ? nr.emit(\"miniAppRemoved\") : e.event === \"notifications_enabled\" ? nr.emit(\"notificationsEnabled\", {\n      notificationDetails: e.notificationDetails\n    }) : e.event === \"notifications_disabled\" ? nr.emit(\"notificationsDisabled\") : e.event === \"back_navigation_triggered\" && nr.emit(\"backNavigationTriggered\");\n  }\n});\nfunction Qx(s) {\n  if (typeof window > \"u\")\n    return;\n  const e = (t) => s(t.detail);\n  return window.addEventListener(\"eip6963:announceProvider\", e), window.dispatchEvent(new CustomEvent(\"eip6963:requestProvider\")), () => window.removeEventListener(\"eip6963:announceProvider\", e);\n}\nfunction eS() {\n  const s = /* @__PURE__ */ new Set();\n  let e = [];\n  const t = () => Qx((n) => {\n    e.some(({ info: i }) => i.uuid === n.info.uuid) || (e = [...e, n], s.forEach((i) => i(e, { added: [n] })));\n  });\n  let r = t();\n  return {\n    _listeners() {\n      return s;\n    },\n    clear() {\n      s.forEach((n) => n([], { removed: [...e] })), e = [];\n    },\n    destroy() {\n      this.clear(), s.clear(), r == null || r();\n    },\n    findProvider({ rdns: n }) {\n      return e.find((i) => i.info.rdns === n);\n    },\n    getProviders() {\n      return e;\n    },\n    reset() {\n      this.clear(), r == null || r(), r = t();\n    },\n    subscribe(n, { emitImmediately: i } = {}) {\n      return s.add(n), i && n(e, { added: e }), () => s.delete(n);\n    }\n  };\n}\nfunction tS(s, e = {}, t) {\n  if (!t || t === \"\") {\n    console.debug(\"Amplitude: Skipping event tracking - no userId available yet\");\n    return;\n  }\n  const r = {\n    event_type: s,\n    api_key: \"0c4fe46171b9bb8eca2ca61eb71f2e19\",\n    time: Date.now(),\n    user_id: t,\n    ...Object.keys(e).length && {\n      event_properties: e\n    }\n  };\n  fetch(\"https://api2.amplitude.com/2/httpapi\", {\n    method: \"POST\",\n    headers: {\n      \"Content-Type\": \"application/json\"\n    },\n    body: JSON.stringify({\n      api_key: \"0c4fe46171b9bb8eca2ca61eb71f2e19\",\n      events: [r]\n    })\n  }).then((n) => {\n    n.ok || console.debug(\"Amplitude response error:\", n.status, n.statusText);\n  }).catch((n) => {\n    console.debug(\"Amplitude tracking error:\", n);\n  });\n}\nconst pg = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({\n  analyticsEnabled: !1,\n  backButtonEnabled: !1,\n  returnUrl: void 0\n}), mg = react__WEBPACK_IMPORTED_MODULE_0___default().createContext(void 0);\nfunction rS() {\n  const {\n    analyticsEnabled: s,\n    backButtonEnabled: e,\n    returnUrl: t\n  } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(pg), [r, n] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [i, o] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [a, l] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [c, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [d, h] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), [f, p] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({}), [y, E] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), [b, R] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [A, F] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), M = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(/* @__PURE__ */ new Set()), H = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(/* @__PURE__ */ new Map()), K = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)({}), j = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(\"\");\n  K.current = f, j.current = y;\n  const C = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((m, v = {}, P) => {\n    s && tS(m, v, P);\n  }, [s]), k = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((m) => {\n    R((v) => {\n      const P = [...v, m];\n      return C(\"navigation.setActiveTab\", {\n        ...K.current,\n        toTab: m,\n        historyLength: P.length\n      }, j.current), P;\n    }), F(m);\n  }, [C]), $ = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (m) => {\n    const v = typeof m == \"string\" ? m : m.url;\n    await ht.isInMiniApp() ? await ht.actions.openUrl(v) : window.open(v, \"_blank\");\n  }, []), W = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => {\n    await ht.isInMiniApp() ? await ht.actions.close() : window.close();\n  }, []), _ = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n    R((m) => {\n      if (m.length === 0)\n        return t && $(t), m;\n      const v = m.slice(0, -1), P = v.length > 0 ? v[v.length - 1] : \"\";\n      return F(P), C(\"navigation.navBack\", {\n        ...K.current,\n        fromTab: m[m.length - 1],\n        toTab: P,\n        historyLength: v.length\n      }, j.current), v;\n    });\n  }, [C, t, $]), g = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((m) => {\n    R([m]), F(m), C(\"navigation.setInitialTab\", {\n      ...K.current,\n      tab: m\n    }, j.current);\n  }, [C]), x = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (m) => (C(\"haptics.impactOccurred\", {\n    ...K.current,\n    hapticType: m\n  }, j.current), ht.haptics.impactOccurred(m)), [C]), w = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (m) => (C(\"haptics.notificationOccurred\", {\n    ...K.current,\n    hapticType: m\n  }, j.current), ht.haptics.notificationOccurred(m)), [C]), D = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async () => (C(\"haptics.selectionChanged\", {\n    ...K.current\n  }, j.current), ht.haptics.selectionChanged()), [C]), O = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (m, v) => (v && s && C(\"cast.composed\", {\n    ...K.current,\n    castText: m == null ? void 0 : m.text,\n    source: v\n  }, j.current), ht.actions.composeCast(m)), [s, C]), U = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(_);\n  U.current = _, (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    if (r)\n      return;\n    let m = !0, v = null;\n    const P = async () => {\n      const N = await ht.context;\n      if (!m) return;\n      if (o(N), ht.on(\"miniAppAdded\", ({\n        notificationDetails: ee\n      }) => {\n        l(!0), u(ee ?? null), h(\"Frame added\"), C(\"frame.added\", K.current, j.current);\n      }), ht.on(\"miniAppAddRejected\", ({\n        reason: ee\n      }) => {\n        l(!1), h(`Frame add rejected: ${ee}`), C(\"frame.add.rejected\", K.current, j.current);\n      }), ht.on(\"miniAppRemoved\", () => {\n        l(!1), h(\"Frame removed\"), C(\"frame.removed\", K.current, j.current);\n      }), ht.on(\"notificationsEnabled\", ({\n        notificationDetails: ee\n      }) => {\n        u(ee ?? null), h(\"Notifications enabled\"), C(\"notifications.enabled\", K.current, j.current);\n      }), ht.on(\"notificationsDisabled\", () => {\n        u(null), h(\"Notifications disabled\"), C(\"notifications.disabled\", K.current, j.current);\n      }), ht.on(\"primaryButtonClicked\", () => {\n        h(\"Primary button clicked\"), C(\"primary-button.clicked\", K.current, j.current);\n      }), v = eS().subscribe(() => {\n      }), await ht.actions.ready(), e)\n        try {\n          ht.back.onback = () => {\n            C(\"back-button.clicked\", K.current, j.current), U.current();\n          }, await ht.back.show();\n        } catch (ee) {\n          console.warn(\"Back button not supported by this client:\", ee);\n        }\n      m && n(!0);\n    };\n    if (ht)\n      return P(), () => {\n        m = !1, ht.removeAllListeners(), ht.back.onback = null, ht.back.hide(), v && v(), H.current.forEach((N) => clearTimeout(N)), H.current.clear(), M.current.clear();\n      };\n  }, [\n    // Only include stable references that won't change\n    e,\n    C\n  ]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    i != null && i.user && (i != null && i.client) && (p({\n      username: i.user.username,\n      clientFid: i.client.clientFid\n    }), E(`${i.user.fid}`), C(\"frame.opened\", {\n      username: i.user.username,\n      clientFid: i.client.clientFid,\n      location: i.location,\n      added: i.client.added\n    }, `${i.user.fid}`));\n  }, [i, C]);\n  const [V, L] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\");\n  return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    const m = () => {\n      L(window.location.href);\n    };\n    m(), window.addEventListener(\"popstate\", m);\n    const v = window.history.pushState, P = window.history.replaceState;\n    return window.history.pushState = function(...N) {\n      v.apply(window.history, N), m();\n    }, window.history.replaceState = function(...N) {\n      P.apply(window.history, N), m();\n    }, () => {\n      window.removeEventListener(\"popstate\", m), window.history.pushState = v, window.history.replaceState = P;\n    };\n  }, []), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    var Y, ee;\n    if (!((Y = i == null ? void 0 : i.user) != null && Y.fid) || !((ee = i == null ? void 0 : i.client) != null && ee.clientFid) || !V)\n      return;\n    const m = new URLSearchParams(window.location.search), v = m.get(\"utm_source\"), P = m.get(\"utm_medium\"), N = m.get(\"utm_campaign\");\n    if (v === \"neynar\" && (P != null && P.startsWith(\"share-cast-\"))) {\n      const ie = P.replace(\"share-cast-\", \"\");\n      C(\"cast.shared\", {\n        username: i.user.username,\n        clientFid: i.client.clientFid,\n        sharedByFid: ie\n      }, `${i.user.fid}`);\n    }\n    if (v === \"neynar\" && N) {\n      const ie = `${N}_${i.user.fid}_${Date.now()}`;\n      if (M.current.has(ie))\n        return;\n      const Te = H.current.get(ie);\n      Te && clearTimeout(Te), M.current.add(ie);\n      const De = setTimeout(async () => {\n        try {\n          const ze = await fetch(\"https://api.neynar.com/v2/farcaster/frame/notifications/open\", {\n            method: \"POST\",\n            headers: {\n              \"content-type\": \"application/json\"\n            },\n            body: JSON.stringify({\n              campaign_id: N,\n              fid: i.user.fid,\n              app_fid: i.client.clientFid\n            })\n          });\n          ze.ok || console.error(\"Failed to mark notification as opened: \", await ze.text());\n        } catch (ze) {\n          console.error(\"Error marking notification as opened: \", ze);\n        } finally {\n          M.current.delete(ie), H.current.delete(ie);\n        }\n      }, 1e3);\n      H.current.set(ie, De);\n    }\n  }, [i, C, V]), {\n    ...ht,\n    isSDKLoaded: r,\n    context: i,\n    added: a,\n    notificationDetails: c,\n    lastEvent: d,\n    currentTab: A,\n    setActiveTab: k,\n    setInitialTab: g,\n    haptics: {\n      impactOccurred: x,\n      notificationOccurred: w,\n      selectionChanged: D\n    },\n    actions: {\n      ...ht.actions,\n      openUrl: $,\n      close: W,\n      composeCast: O\n    }\n  };\n}\nfunction sS({\n  children: s\n}) {\n  const e = rS();\n  return e.isSDKLoaded ? /* @__PURE__ */ q.jsx(mg.Provider, {\n    value: e,\n    children: s\n  }) : null;\n}\nfunction dR({\n  children: s,\n  analyticsEnabled: e = !1,\n  backButtonEnabled: t = !1,\n  returnUrl: r\n}) {\n  const n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n    analyticsEnabled: e,\n    backButtonEnabled: t,\n    returnUrl: r\n  }), [e, t, r]);\n  return /* @__PURE__ */ q.jsx(pg.Provider, {\n    value: n,\n    children: /* @__PURE__ */ q.jsx(sS, {\n      children: s\n    })\n  });\n}\nfunction hR() {\n  const s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(mg);\n  if (s === void 0)\n    throw new Error(\"useMiniApp must be used within a MiniAppProvider\");\n  return s;\n}\nvar yg = /* @__PURE__ */ ((s) => (s.Light = \"light\", s.Dark = \"dark\", s))(yg || {}), gs = /* @__PURE__ */ ((s) => (s.FARCASTER = \"farcaster\", s.NEYNAR = \"neynar\", s.WARPCAST = \"warpcast\", s))(gs || {});\nfunction du(s, e = \"\", {\n  serialize: t = JSON.stringify,\n  deserialize: r = JSON.parse\n} = {}) {\n  const [n, i] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(() => {\n    if (typeof window > \"u\")\n      return e;\n    try {\n      const l = window.localStorage.getItem(s);\n      return l ? r(l) : e;\n    } catch (l) {\n      return console.error(\"Error reading from localStorage\", l), e;\n    }\n  });\n  return [n, (l) => {\n    try {\n      const c = l instanceof Function ? l(n) : l;\n      i(c), typeof window < \"u\" && window.localStorage.setItem(s, t(c));\n    } catch (c) {\n      console.error(\"Error writing to localStorage\", c);\n    }\n  }, () => {\n    try {\n      window.localStorage.removeItem(s), i(e);\n    } catch (l) {\n      console.error(\"Error removing from localStorage\", l);\n    }\n  }];\n}\nvar jn = /* @__PURE__ */ ((s) => (s.NEYNAR_AUTHENTICATED_USER = \"neynar_authenticated_user\", s))(jn || {});\nconst vg = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(void 0), nS = ({\n  children: s,\n  _setIsAuthenticated: e,\n  _setUser: t,\n  _onAuthSuccess: r,\n  _onSignout: n\n}) => {\n  const {\n    isAuthenticated: i\n  } = ts(), [o, a] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [l, c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [u] = du(jn.NEYNAR_AUTHENTICATED_USER);\n  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    e(o);\n  }, [o]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    a(i);\n  }, [i]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    u ? (c(u), a(!0)) : (c(null), a(!1));\n  }, []), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    t(l);\n  }, [l]);\n  const d = (p) => {\n    r && r(p);\n  }, h = (p) => {\n    n && n(p);\n  }, f = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n    isAuthenticated: o,\n    user: l,\n    setIsAuthenticated: a,\n    setUser: c,\n    onAuthSuccess: d,\n    onSignout: h\n  }), [o, l]);\n  return /* @__PURE__ */ q.jsx(vg.Provider, {\n    value: f,\n    children: s\n  });\n}, Eg = () => {\n  const s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(vg);\n  if (!s)\n    throw new Error(\"useAuth must be used within a AuthContextProvider\");\n  return s;\n}, iS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"tbaom7c\"]\n}), oS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"t1ff44zi\"],\n  variants: [{\n    props: {\n      type: \"success\"\n    },\n    className: \"t1ff44zi-1\"\n  }, {\n    props: {\n      type: \"error\"\n    },\n    className: \"t1ff44zi-2\"\n  }, {\n    props: {\n      type: \"warning\"\n    },\n    className: \"t1ff44zi-3\"\n  }, {\n    props: {\n      type: \"info\"\n    },\n    className: \"t1ff44zi-4\"\n  }]\n});\nvar xg = /* @__PURE__ */ ((s) => (s.Success = \"success\", s.Error = \"error\", s.Warning = \"warning\", s.Info = \"info\", s))(xg || {});\nconst Sg = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(void 0), fR = ({\n  children: s,\n  settings: {\n    clientId: e,\n    defaultTheme: t = yg.Light,\n    eventsCallbacks: r\n  }\n}) => {\n  const [n] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(e), [i, o] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [a, l] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(t), [c, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [d, h] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), f = (A, F) => {\n    const M = {\n      type: A,\n      message: F\n    };\n    u((H) => [...H, M]), setTimeout(() => p(M), 5e3);\n  }, p = (A) => {\n    u((F) => F.filter((M) => M !== A));\n  };\n  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    const A = document.querySelector(\":root\");\n    A && (a === \"light\" ? (A.classList.add(\"theme-light\"), A.classList.remove(\"theme-dark\")) : a === \"dark\" && (A.classList.add(\"theme-dark\"), A.classList.remove(\"theme-light\")));\n  }, [a]);\n  const y = (A) => {\n    o(A);\n  }, E = (A) => {\n    h(A);\n  }, b = () => {\n    if (d) {\n      const {\n        signer_uuid: A,\n        ...F\n      } = d;\n      h(null), o(!1), localStorage.removeItem(jn.NEYNAR_AUTHENTICATED_USER), r != null && r.onSignout && r.onSignout(F);\n    }\n  }, R = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => ({\n    client_id: n,\n    theme: a,\n    isAuthenticated: i,\n    user: d,\n    setTheme: l,\n    showToast: f,\n    logoutUser: b\n  }), [n, a, i, d, l, f, b]);\n  return /* @__PURE__ */ q.jsx(Sg.Provider, {\n    value: R,\n    children: /* @__PURE__ */ q.jsxs(nS, {\n      _setIsAuthenticated: y,\n      _setUser: E,\n      _onAuthSuccess: r == null ? void 0 : r.onAuthSuccess,\n      _onSignout: r == null ? void 0 : r.onSignout,\n      children: [s, /* @__PURE__ */ q.jsx(iS, {\n        children: c.map((A, F) => /* @__PURE__ */ q.jsx(oS, {\n          type: A.type,\n          children: A.message\n        }, F))\n      })]\n    })\n  });\n}, ts = () => {\n  const s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(Sg);\n  if (!s)\n    throw new Error(\"useNeynarContext must be used within a NeynarContextProvider\");\n  return s;\n}, aS = () => /* @__PURE__ */ q.jsxs(\"svg\", {\n  width: \"18\",\n  height: \"17\",\n  viewBox: \"0 0 18 17\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\",\n  children: [/* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M13.7222 0H4.27778C2.19137 0 0.5 1.69137 0.5 3.77778V13.2222C0.5 15.3086 2.19137 17 4.27778 17H13.7222C15.8086 17 17.5 15.3086 17.5 13.2222V3.77778C17.5 1.69137 15.8086 0 13.7222 0Z\",\n    fill: \"#855DCD\"\n  }), /* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M4.88281 2.64453H13.1184V14.3556H11.9095V8.9912H11.8976C11.764 7.50859 10.518 6.34675 9.00059 6.34675C7.4832 6.34675 6.23717 7.50859 6.10356 8.9912H6.0917V14.3556H4.88281V2.64453Z\",\n    fill: \"white\"\n  }), /* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M2.69141 4.30664L3.18252 5.96886H3.59807V12.6933C3.38943 12.6933 3.2203 12.8625 3.2203 13.0711V13.5244H3.14474C2.9361 13.5244 2.76696 13.6936 2.76696 13.9022V14.3555H6.99807V13.9022C6.99807 13.6936 6.82893 13.5244 6.6203 13.5244H6.54474V13.0711C6.54474 12.8625 6.3756 12.6933 6.16696 12.6933H5.71363V4.30664H2.69141Z\",\n    fill: \"white\"\n  }), /* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M11.9854 12.6933C11.7768 12.6933 11.6076 12.8625 11.6076 13.0711V13.5244H11.5321C11.3235 13.5244 11.1543 13.6936 11.1543 13.9022V14.3555H15.3854V13.9022C15.3854 13.6936 15.2162 13.5244 15.0076 13.5244H14.9321V13.0711C14.9321 12.8625 14.7629 12.6933 14.5543 12.6933V5.96886H14.9699L15.461 4.30664H12.4387V12.6933H11.9854Z\",\n    fill: \"white\"\n  })]\n}), zd = () => /* @__PURE__ */ q.jsxs(\"svg\", {\n  width: \"32\",\n  height: \"17\",\n  viewBox: \"0 0 50 28\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\",\n  children: [/* @__PURE__ */ q.jsx(\"path\", {\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M38.3744 13.7311C38.3744 16.1209 37.7639 18.368 36.6904 20.3252C32.5685 19.8525 27.847 18.9503 22.8999 17.6247C20.4058 16.9564 18.0151 16.2236 15.7697 15.4495L15.7693 15.4486C15.7579 15.445 15.7465 15.4413 15.7351 15.4376C15.6448 15.4064 15.5547 15.3752 15.4649 15.3439C12.8978 14.399 11.2356 12.2056 11.4168 10.0315L11.4482 10.0399L11.4215 10.0133C13.0427 4.23612 18.3483 0 24.6434 0C32.2268 0 38.3744 6.14762 38.3744 13.7311Z\",\n    fill: \"black\"\n  }), /* @__PURE__ */ q.jsx(\"path\", {\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M11.3804 17.2987C12.4882 16.5313 13.9658 16.1804 15.5002 16.3953C17.7731 17.156 20.1682 17.8782 22.6535 18.5441C27.397 19.8151 31.9584 20.7444 36.0833 21.3275C33.623 25.0252 29.4177 27.4619 24.6434 27.4619C18.294 27.4619 12.9511 23.1524 11.3804 17.2987Z\",\n    fill: \"black\"\n  }), /* @__PURE__ */ q.jsx(\"path\", {\n    fillRule: \"evenodd\",\n    clipRule: \"evenodd\",\n    d: \"M43.0917 13.4458C41.6461 12.6648 39.9756 11.8759 38.1233 11.1029C38.0363 10.6544 37.9275 10.2136 37.7981 9.78174C39.9806 10.6648 41.9403 11.5752 43.6139 12.4794C45.7007 13.6069 47.3703 14.7394 48.4714 15.816C49.5356 16.8566 50.2295 18.0063 49.93 19.1241C49.6304 20.2419 48.4547 20.8906 47.0128 21.2597C45.5209 21.6415 43.5087 21.7875 41.1377 21.7206C39.6046 21.6773 37.9082 21.5444 36.0864 21.3234C36.3086 20.9891 36.5165 20.6446 36.7094 20.2906C38.3134 20.4733 39.8091 20.5841 41.1687 20.6225C43.4946 20.6882 45.3908 20.5409 46.7404 20.1955C48.14 19.8373 48.7389 19.3249 48.8689 18.8398C48.9989 18.3547 48.7364 17.6115 47.7034 16.6015C46.7073 15.6275 45.1388 14.5519 43.0917 13.4458ZM8.86229 3.16772C10.7583 3.22128 12.9038 3.41177 15.2278 3.73661C14.8974 4.04803 14.5824 4.37566 14.2841 4.71822C12.3016 4.46314 10.4678 4.312 8.83127 4.26577C6.50541 4.20006 4.6092 4.34737 3.25958 4.69279C1.86001 5.05099 1.26107 5.56342 1.13109 6.04849C1.00112 6.53356 1.2636 7.27681 2.29657 8.2868C3.29267 9.26075 4.86118 10.3364 6.90828 11.4425C6.94181 11.4606 6.97546 11.4787 7.00923 11.4968C6.84251 11.5938 6.72574 11.7161 6.66353 11.8645C6.57791 12.0688 6.60013 12.3121 6.72013 12.5874C6.60757 12.5279 6.49623 12.4684 6.38612 12.4089C4.29926 11.2814 2.62971 10.1489 1.5286 9.07223C0.464367 8.03166 -0.229485 6.882 0.0700354 5.76418C0.369556 4.64635 1.54528 3.99764 2.98722 3.6286C4.47911 3.24677 6.49126 3.10074 8.86229 3.16772Z\",\n    fill: \"black\"\n  }), /* @__PURE__ */ q.jsx(\"ellipse\", {\n    cx: \"5.94866\",\n    cy: \"11.5309\",\n    rx: \"3.76009\",\n    ry: \"0.575832\",\n    transform: \"rotate(29.2824 5.94866 11.5309)\",\n    fill: \"black\"\n  })]\n}), lS = () => /* @__PURE__ */ q.jsxs(\"svg\", {\n  width: \"17\",\n  height: \"17\",\n  viewBox: \"0 0 17 17\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\",\n  children: [/* @__PURE__ */ q.jsx(\"mask\", {\n    id: \"mask0_875_48\",\n    maskUnits: \"userSpaceOnUse\",\n    x: \"0\",\n    y: \"0\",\n    width: \"17\",\n    height: \"17\",\n    children: /* @__PURE__ */ q.jsx(\"path\", {\n      d: \"M16.9947 0H0V16.9947H16.9947V0Z\",\n      fill: \"white\"\n    })\n  }), /* @__PURE__ */ q.jsxs(\"g\", {\n    mask: \"url(#mask0_875_48)\",\n    children: [/* @__PURE__ */ q.jsx(\"path\", {\n      d: \"M12.7871 16.9947H4.20765C1.88755 16.9947 0 15.1073 0 12.7871V4.20771C0 1.88756 1.88755 0 4.20765 0H12.7871C15.1072 0 16.9947 1.88756 16.9947 4.20771V12.7871C16.9947 15.1073 15.1072 16.9947 12.7871 16.9947Z\",\n      fill: \"#472A91\"\n    }), /* @__PURE__ */ q.jsx(\"path\", {\n      d: \"M11.1523 5.37891L10.3143 8.52601L9.47364 5.37891H7.53893L6.69017 8.54919L5.84419 5.37891H3.64062L5.68823 12.3371H7.58931L8.49835 9.10599L9.40736 12.3371H11.3125L13.3557 5.37891H11.1523Z\",\n      fill: \"white\"\n    })]\n  })]\n});\nvar cS = {};\nconst ic = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"img\")({\n  classes: [\"ippfsqr\"]\n}), uS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"button\")({\n  classes: [\"b1yzssjb\"]\n}), dS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"m1xn8b2e\"]\n}), hS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"button\")({\n  classes: [\"mwuiqyg\"]\n}), fS = (s, e) => {\n  if (e)\n    return e;\n  switch (s) {\n    case gs.FARCASTER:\n      return \"Sign in with Farcaster\";\n    case gs.NEYNAR:\n      return \"Sign in with Neynar\";\n    case gs.WARPCAST:\n      return \"Sign in with Warpcast\";\n    default:\n      return \"Sign in with Neynar\";\n  }\n}, gS = (s, e, t) => {\n  if (e)\n    return e;\n  if (t)\n    return /* @__PURE__ */ q.jsx(ic, {\n      src: t,\n      alt: \"Custom logo\"\n    });\n  switch (s) {\n    case gs.FARCASTER:\n      return /* @__PURE__ */ q.jsx(aS, {});\n    case gs.NEYNAR:\n      return /* @__PURE__ */ q.jsx(zd, {});\n    case gs.WARPCAST:\n      return /* @__PURE__ */ q.jsx(lS, {});\n    default:\n      return /* @__PURE__ */ q.jsx(zd, {});\n  }\n}, pS = ({\n  children: s,\n  label: e,\n  variant: t = gs.NEYNAR,\n  icon: r,\n  customLogoUrl: n,\n  modalStyle: i = {},\n  modalButtonStyle: o = {},\n  ...a\n}) => {\n  const {\n    client_id: l,\n    user: c,\n    isAuthenticated: u\n  } = ts(), {\n    setIsAuthenticated: d,\n    setUser: h,\n    onAuthSuccess: f,\n    onSignout: p\n  } = Eg(), [y, E, b] = du(jn.NEYNAR_AUTHENTICATED_USER), [R, A] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), F = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), M = `${cS.NEYNAR_LOGIN_URL ?? \"https://app.neynar.com/login\"}?client_id=${l}`, H = new URL(M).origin, K = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), j = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(async (g) => {\n    var x;\n    if (g.origin === H && g.data && g.data.is_authenticated) {\n      d(!0), (x = F.current) == null || x.close(), window.removeEventListener(\"message\", j);\n      const w = {\n        signer_uuid: g.data.signer_uuid,\n        ...g.data.user\n      };\n      E(w), h(w), f({\n        user: w\n      });\n    }\n  }, [l, d]), C = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n    const w = window.screen.width / 2 - 300, O = `width=600,height=700,top=${window.screen.height / 2 - 700 / 2},left=${w}`;\n    if (F.current = window.open(M, \"_blank\", O), !F.current) {\n      console.error(\"Failed to open the authentication window. Please check your pop-up blocker settings.\");\n      return;\n    }\n    window.addEventListener(\"message\", j, !1);\n  }, [l, j]), k = () => {\n    if (c) {\n      const g = c;\n      b(), d(!1), W();\n      const {\n        signer_uuid: x,\n        ...w\n      } = g;\n      p(w);\n    }\n  }, $ = () => A(!0), W = () => A(!1);\n  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => () => {\n    window.removeEventListener(\"message\", j);\n  }, [j]);\n  const _ = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((g) => {\n    K.current && !K.current.contains(g.target) && W();\n  }, []);\n  return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => (R ? document.addEventListener(\"mousedown\", _) : document.removeEventListener(\"mousedown\", _), () => {\n    document.removeEventListener(\"mousedown\", _);\n  }), [R, _]), /* @__PURE__ */ q.jsxs(q.Fragment, {\n    children: [R && /* @__PURE__ */ q.jsxs(dS, {\n      style: i,\n      ref: K,\n      children: [/* @__PURE__ */ q.jsx(ic, {\n        src: c == null ? void 0 : c.pfp_url,\n        alt: c == null ? void 0 : c.username\n      }), /* @__PURE__ */ q.jsxs(\"span\", {\n        children: [\"@\", c == null ? void 0 : c.username]\n      }), /* @__PURE__ */ q.jsx(hS, {\n        style: o,\n        onClick: k,\n        children: \"Sign out\"\n      })]\n    }), /* @__PURE__ */ q.jsx(uS, {\n      onClick: u ? $ : C,\n      ...a,\n      children: u ? /* @__PURE__ */ q.jsxs(q.Fragment, {\n        children: [/* @__PURE__ */ q.jsx(ic, {\n          src: c == null ? void 0 : c.pfp_url,\n          alt: `${c == null ? void 0 : c.username} profile picture`\n        }), /* @__PURE__ */ q.jsxs(\"span\", {\n          style: {\n            marginLeft: \"10px\"\n          },\n          children: [\"@\", c == null ? void 0 : c.username]\n        })]\n      }) : /* @__PURE__ */ q.jsxs(q.Fragment, {\n        children: [gS(t, r, n), /* @__PURE__ */ q.jsx(\"span\", {\n          style: {\n            marginLeft: \"5px\"\n          },\n          children: fS(t, e)\n        })]\n      })\n    })]\n  });\n}, Yo = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"img\")({\n  classes: [\"a11pt0xp\"],\n  vars: {\n    \"a11pt0xp-0\": [(s, e = Gr) => s.width || \"45px\", !1],\n    \"a11pt0xp-1\": [(s, e = Gr) => s.width || \"45px\", !1]\n  }\n}), Yd = \"https://farcaster.xyz\", bg = /(^|\\s)\\/\\w+/g, Tg = /@\\w+(\\.eth)?/g, wg = /((https?:\\/\\/)?([a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})(\\/[^\\s]*)?)/g, Zd = new RegExp(`(${bg.source})|(${Tg.source})|(${wg.source})`, \"g\"), mS = (s) => bg.test(s) ? `${Yd}/~/channel${s.trim()}` : Tg.test(s) ? `${Yd}/${s.substring(1)}` : wg.test(s) ? s.startsWith(\"http\") ? s : `http://${s}` : \"\", yS = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"a\")({\n  classes: [\"s4xymqs\"]\n}), vS = (s) => s.filter((e) => e.url).map((e) => e.url), ES = (s, e) => {\n  if (!s) return [];\n  const t = vS(e), r = [];\n  let n = 0, i;\n  for (; (i = Zd.exec(s)) !== null; ) {\n    const o = i.index;\n    n < o && r.push(s.slice(n, o));\n    const a = i[0].trim();\n    if (t.includes(a))\n      r.push(a);\n    else {\n      const l = mS(a);\n      r.push(/* @__PURE__ */ q.jsx(yS, {\n        href: l,\n        target: \"_blank\",\n        children: a\n      }, o));\n    }\n    n = Zd.lastIndex;\n  }\n  return n < s.length && r.push(s.slice(n)), r;\n}, Ir = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"be87m0m\"],\n  vars: {\n    \"be87m0m-0\": [(s, e = Gr) => s.alignItems || \"flex-start\", !1],\n    \"be87m0m-1\": [(s, e = Gr) => s.justifyContent || \"flex-start\", !1],\n    \"be87m0m-2\": [(s, e = Gr) => s.flexGrow || \"initial\", !0],\n    \"be87m0m-3\": [(s, e = Gr) => s.flexShrink || \"initial\", !0],\n    \"be87m0m-4\": [(s, e = Gr) => s.spacing ?? s.spacingVertical ?? s.spacingTop ?? \"0px\", !1],\n    \"be87m0m-5\": [(s, e = Gr) => s.spacing ?? s.spacingHorizontal ?? s.spacingRight ?? \"0px\", !1],\n    \"be87m0m-6\": [(s, e = Gr) => s.spacing ?? s.spacingVertical ?? s.spacingBottom ?? \"0px\", !1],\n    \"be87m0m-7\": [(s, e = Gr) => s.spacing ?? s.spacingHorizontal ?? s.spacingLeft ?? \"0px\", !1]\n  }\n}), xS = () => Ir, Pr = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(xS())({\n  classes: [\"ha1dvpi\"]\n}), ue = Number.isFinite || function(s) {\n  return typeof s == \"number\" && isFinite(s);\n}, SS = Number.isSafeInteger || function(s) {\n  return typeof s == \"number\" && Math.abs(s) <= bS;\n}, bS = Number.MAX_SAFE_INTEGER || 9007199254740991;\nlet ve = /* @__PURE__ */ (function(s) {\n  return s.NETWORK_ERROR = \"networkError\", s.MEDIA_ERROR = \"mediaError\", s.KEY_SYSTEM_ERROR = \"keySystemError\", s.MUX_ERROR = \"muxError\", s.OTHER_ERROR = \"otherError\", s;\n})({}), J = /* @__PURE__ */ (function(s) {\n  return s.KEY_SYSTEM_NO_KEYS = \"keySystemNoKeys\", s.KEY_SYSTEM_NO_ACCESS = \"keySystemNoAccess\", s.KEY_SYSTEM_NO_SESSION = \"keySystemNoSession\", s.KEY_SYSTEM_NO_CONFIGURED_LICENSE = \"keySystemNoConfiguredLicense\", s.KEY_SYSTEM_LICENSE_REQUEST_FAILED = \"keySystemLicenseRequestFailed\", s.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED = \"keySystemServerCertificateRequestFailed\", s.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED = \"keySystemServerCertificateUpdateFailed\", s.KEY_SYSTEM_SESSION_UPDATE_FAILED = \"keySystemSessionUpdateFailed\", s.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED = \"keySystemStatusOutputRestricted\", s.KEY_SYSTEM_STATUS_INTERNAL_ERROR = \"keySystemStatusInternalError\", s.KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR = \"keySystemDestroyMediaKeysError\", s.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR = \"keySystemDestroyCloseSessionError\", s.KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR = \"keySystemDestroyRemoveSessionError\", s.MANIFEST_LOAD_ERROR = \"manifestLoadError\", s.MANIFEST_LOAD_TIMEOUT = \"manifestLoadTimeOut\", s.MANIFEST_PARSING_ERROR = \"manifestParsingError\", s.MANIFEST_INCOMPATIBLE_CODECS_ERROR = \"manifestIncompatibleCodecsError\", s.LEVEL_EMPTY_ERROR = \"levelEmptyError\", s.LEVEL_LOAD_ERROR = \"levelLoadError\", s.LEVEL_LOAD_TIMEOUT = \"levelLoadTimeOut\", s.LEVEL_PARSING_ERROR = \"levelParsingError\", s.LEVEL_SWITCH_ERROR = \"levelSwitchError\", s.AUDIO_TRACK_LOAD_ERROR = \"audioTrackLoadError\", s.AUDIO_TRACK_LOAD_TIMEOUT = \"audioTrackLoadTimeOut\", s.SUBTITLE_LOAD_ERROR = \"subtitleTrackLoadError\", s.SUBTITLE_TRACK_LOAD_TIMEOUT = \"subtitleTrackLoadTimeOut\", s.FRAG_LOAD_ERROR = \"fragLoadError\", s.FRAG_LOAD_TIMEOUT = \"fragLoadTimeOut\", s.FRAG_DECRYPT_ERROR = \"fragDecryptError\", s.FRAG_PARSING_ERROR = \"fragParsingError\", s.FRAG_GAP = \"fragGap\", s.REMUX_ALLOC_ERROR = \"remuxAllocError\", s.KEY_LOAD_ERROR = \"keyLoadError\", s.KEY_LOAD_TIMEOUT = \"keyLoadTimeOut\", s.BUFFER_ADD_CODEC_ERROR = \"bufferAddCodecError\", s.BUFFER_INCOMPATIBLE_CODECS_ERROR = \"bufferIncompatibleCodecsError\", s.BUFFER_APPEND_ERROR = \"bufferAppendError\", s.BUFFER_APPENDING_ERROR = \"bufferAppendingError\", s.BUFFER_STALLED_ERROR = \"bufferStalledError\", s.BUFFER_FULL_ERROR = \"bufferFullError\", s.BUFFER_SEEK_OVER_HOLE = \"bufferSeekOverHole\", s.BUFFER_NUDGE_ON_STALL = \"bufferNudgeOnStall\", s.ASSET_LIST_LOAD_ERROR = \"assetListLoadError\", s.ASSET_LIST_LOAD_TIMEOUT = \"assetListLoadTimeout\", s.ASSET_LIST_PARSING_ERROR = \"assetListParsingError\", s.INTERSTITIAL_ASSET_ITEM_ERROR = \"interstitialAssetItemError\", s.INTERNAL_EXCEPTION = \"internalException\", s.INTERNAL_ABORTED = \"aborted\", s.ATTACH_MEDIA_ERROR = \"attachMediaError\", s.UNKNOWN = \"unknown\", s;\n})({}), I = /* @__PURE__ */ (function(s) {\n  return s.MEDIA_ATTACHING = \"hlsMediaAttaching\", s.MEDIA_ATTACHED = \"hlsMediaAttached\", s.MEDIA_DETACHING = \"hlsMediaDetaching\", s.MEDIA_DETACHED = \"hlsMediaDetached\", s.MEDIA_ENDED = \"hlsMediaEnded\", s.STALL_RESOLVED = \"hlsStallResolved\", s.BUFFER_RESET = \"hlsBufferReset\", s.BUFFER_CODECS = \"hlsBufferCodecs\", s.BUFFER_CREATED = \"hlsBufferCreated\", s.BUFFER_APPENDING = \"hlsBufferAppending\", s.BUFFER_APPENDED = \"hlsBufferAppended\", s.BUFFER_EOS = \"hlsBufferEos\", s.BUFFERED_TO_END = \"hlsBufferedToEnd\", s.BUFFER_FLUSHING = \"hlsBufferFlushing\", s.BUFFER_FLUSHED = \"hlsBufferFlushed\", s.MANIFEST_LOADING = \"hlsManifestLoading\", s.MANIFEST_LOADED = \"hlsManifestLoaded\", s.MANIFEST_PARSED = \"hlsManifestParsed\", s.LEVEL_SWITCHING = \"hlsLevelSwitching\", s.LEVEL_SWITCHED = \"hlsLevelSwitched\", s.LEVEL_LOADING = \"hlsLevelLoading\", s.LEVEL_LOADED = \"hlsLevelLoaded\", s.LEVEL_UPDATED = \"hlsLevelUpdated\", s.LEVEL_PTS_UPDATED = \"hlsLevelPtsUpdated\", s.LEVELS_UPDATED = \"hlsLevelsUpdated\", s.AUDIO_TRACKS_UPDATED = \"hlsAudioTracksUpdated\", s.AUDIO_TRACK_SWITCHING = \"hlsAudioTrackSwitching\", s.AUDIO_TRACK_SWITCHED = \"hlsAudioTrackSwitched\", s.AUDIO_TRACK_LOADING = \"hlsAudioTrackLoading\", s.AUDIO_TRACK_LOADED = \"hlsAudioTrackLoaded\", s.AUDIO_TRACK_UPDATED = \"hlsAudioTrackUpdated\", s.SUBTITLE_TRACKS_UPDATED = \"hlsSubtitleTracksUpdated\", s.SUBTITLE_TRACKS_CLEARED = \"hlsSubtitleTracksCleared\", s.SUBTITLE_TRACK_SWITCH = \"hlsSubtitleTrackSwitch\", s.SUBTITLE_TRACK_LOADING = \"hlsSubtitleTrackLoading\", s.SUBTITLE_TRACK_LOADED = \"hlsSubtitleTrackLoaded\", s.SUBTITLE_TRACK_UPDATED = \"hlsSubtitleTrackUpdated\", s.SUBTITLE_FRAG_PROCESSED = \"hlsSubtitleFragProcessed\", s.CUES_PARSED = \"hlsCuesParsed\", s.NON_NATIVE_TEXT_TRACKS_FOUND = \"hlsNonNativeTextTracksFound\", s.INIT_PTS_FOUND = \"hlsInitPtsFound\", s.FRAG_LOADING = \"hlsFragLoading\", s.FRAG_LOAD_EMERGENCY_ABORTED = \"hlsFragLoadEmergencyAborted\", s.FRAG_LOADED = \"hlsFragLoaded\", s.FRAG_DECRYPTED = \"hlsFragDecrypted\", s.FRAG_PARSING_INIT_SEGMENT = \"hlsFragParsingInitSegment\", s.FRAG_PARSING_USERDATA = \"hlsFragParsingUserdata\", s.FRAG_PARSING_METADATA = \"hlsFragParsingMetadata\", s.FRAG_PARSED = \"hlsFragParsed\", s.FRAG_BUFFERED = \"hlsFragBuffered\", s.FRAG_CHANGED = \"hlsFragChanged\", s.FPS_DROP = \"hlsFpsDrop\", s.FPS_DROP_LEVEL_CAPPING = \"hlsFpsDropLevelCapping\", s.MAX_AUTO_LEVEL_UPDATED = \"hlsMaxAutoLevelUpdated\", s.ERROR = \"hlsError\", s.DESTROYING = \"hlsDestroying\", s.KEY_LOADING = \"hlsKeyLoading\", s.KEY_LOADED = \"hlsKeyLoaded\", s.LIVE_BACK_BUFFER_REACHED = \"hlsLiveBackBufferReached\", s.BACK_BUFFER_REACHED = \"hlsBackBufferReached\", s.STEERING_MANIFEST_LOADED = \"hlsSteeringManifestLoaded\", s.ASSET_LIST_LOADING = \"hlsAssetListLoading\", s.ASSET_LIST_LOADED = \"hlsAssetListLoaded\", s.INTERSTITIALS_UPDATED = \"hlsInterstitialsUpdated\", s.INTERSTITIALS_BUFFERED_TO_BOUNDARY = \"hlsInterstitialsBufferedToBoundary\", s.INTERSTITIAL_ASSET_PLAYER_CREATED = \"hlsInterstitialAssetPlayerCreated\", s.INTERSTITIAL_STARTED = \"hlsInterstitialStarted\", s.INTERSTITIAL_ASSET_STARTED = \"hlsInterstitialAssetStarted\", s.INTERSTITIAL_ASSET_ENDED = \"hlsInterstitialAssetEnded\", s.INTERSTITIAL_ASSET_ERROR = \"hlsInterstitialAssetError\", s.INTERSTITIAL_ENDED = \"hlsInterstitialEnded\", s.INTERSTITIALS_PRIMARY_RESUMED = \"hlsInterstitialsPrimaryResumed\", s.PLAYOUT_LIMIT_REACHED = \"hlsPlayoutLimitReached\", s.EVENT_CUE_ENTER = \"hlsEventCueEnter\", s;\n})({});\nvar Ke = {\n  MANIFEST: \"manifest\",\n  LEVEL: \"level\",\n  AUDIO_TRACK: \"audioTrack\",\n  SUBTITLE_TRACK: \"subtitleTrack\"\n}, pe = {\n  MAIN: \"main\",\n  AUDIO: \"audio\",\n  SUBTITLE: \"subtitle\"\n};\nclass hn {\n  //  About half of the estimated value will be from the last |halfLife| samples by weight.\n  constructor(e, t = 0, r = 0) {\n    this.halfLife = void 0, this.alpha_ = void 0, this.estimate_ = void 0, this.totalWeight_ = void 0, this.halfLife = e, this.alpha_ = e ? Math.exp(Math.log(0.5) / e) : 0, this.estimate_ = t, this.totalWeight_ = r;\n  }\n  sample(e, t) {\n    const r = Math.pow(this.alpha_, e);\n    this.estimate_ = t * (1 - r) + r * this.estimate_, this.totalWeight_ += e;\n  }\n  getTotalWeight() {\n    return this.totalWeight_;\n  }\n  getEstimate() {\n    if (this.alpha_) {\n      const e = 1 - Math.pow(this.alpha_, this.totalWeight_);\n      if (e)\n        return this.estimate_ / e;\n    }\n    return this.estimate_;\n  }\n}\nclass TS {\n  constructor(e, t, r, n = 100) {\n    this.defaultEstimate_ = void 0, this.minWeight_ = void 0, this.minDelayMs_ = void 0, this.slow_ = void 0, this.fast_ = void 0, this.defaultTTFB_ = void 0, this.ttfb_ = void 0, this.defaultEstimate_ = r, this.minWeight_ = 1e-3, this.minDelayMs_ = 50, this.slow_ = new hn(e), this.fast_ = new hn(t), this.defaultTTFB_ = n, this.ttfb_ = new hn(e);\n  }\n  update(e, t) {\n    const {\n      slow_: r,\n      fast_: n,\n      ttfb_: i\n    } = this;\n    r.halfLife !== e && (this.slow_ = new hn(e, r.getEstimate(), r.getTotalWeight())), n.halfLife !== t && (this.fast_ = new hn(t, n.getEstimate(), n.getTotalWeight())), i.halfLife !== e && (this.ttfb_ = new hn(e, i.getEstimate(), i.getTotalWeight()));\n  }\n  sample(e, t) {\n    e = Math.max(e, this.minDelayMs_);\n    const r = 8 * t, n = e / 1e3, i = r / n;\n    this.fast_.sample(n, i), this.slow_.sample(n, i);\n  }\n  sampleTTFB(e) {\n    const t = e / 1e3, r = Math.sqrt(2) * Math.exp(-Math.pow(t, 2) / 2);\n    this.ttfb_.sample(r, Math.max(e, 5));\n  }\n  canEstimate() {\n    return this.fast_.getTotalWeight() >= this.minWeight_;\n  }\n  getEstimate() {\n    return this.canEstimate() ? Math.min(this.fast_.getEstimate(), this.slow_.getEstimate()) : this.defaultEstimate_;\n  }\n  getEstimateTTFB() {\n    return this.ttfb_.getTotalWeight() >= this.minWeight_ ? this.ttfb_.getEstimate() : this.defaultTTFB_;\n  }\n  get defaultEstimate() {\n    return this.defaultEstimate_;\n  }\n  destroy() {\n  }\n}\nfunction wS(s, e, t) {\n  return (e = IS(e)) in s ? Object.defineProperty(s, e, {\n    value: t,\n    enumerable: !0,\n    configurable: !0,\n    writable: !0\n  }) : s[e] = t, s;\n}\nfunction nt() {\n  return nt = Object.assign ? Object.assign.bind() : function(s) {\n    for (var e = 1; e < arguments.length; e++) {\n      var t = arguments[e];\n      for (var r in t) ({}).hasOwnProperty.call(t, r) && (s[r] = t[r]);\n    }\n    return s;\n  }, nt.apply(null, arguments);\n}\nfunction Xd(s, e) {\n  var t = Object.keys(s);\n  if (Object.getOwnPropertySymbols) {\n    var r = Object.getOwnPropertySymbols(s);\n    e && (r = r.filter(function(n) {\n      return Object.getOwnPropertyDescriptor(s, n).enumerable;\n    })), t.push.apply(t, r);\n  }\n  return t;\n}\nfunction tt(s) {\n  for (var e = 1; e < arguments.length; e++) {\n    var t = arguments[e] != null ? arguments[e] : {};\n    e % 2 ? Xd(Object(t), !0).forEach(function(r) {\n      wS(s, r, t[r]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(s, Object.getOwnPropertyDescriptors(t)) : Xd(Object(t)).forEach(function(r) {\n      Object.defineProperty(s, r, Object.getOwnPropertyDescriptor(t, r));\n    });\n  }\n  return s;\n}\nfunction AS(s, e) {\n  if (typeof s != \"object\" || !s) return s;\n  var t = s[Symbol.toPrimitive];\n  if (t !== void 0) {\n    var r = t.call(s, e);\n    if (typeof r != \"object\") return r;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (e === \"string\" ? String : Number)(s);\n}\nfunction IS(s) {\n  var e = AS(s, \"string\");\n  return typeof e == \"symbol\" ? e : e + \"\";\n}\nclass Lr {\n  constructor(e, t) {\n    this.trace = void 0, this.debug = void 0, this.log = void 0, this.warn = void 0, this.info = void 0, this.error = void 0;\n    const r = `[${e}]:`;\n    this.trace = As, this.debug = t.debug.bind(null, r), this.log = t.log.bind(null, r), this.warn = t.warn.bind(null, r), this.info = t.info.bind(null, r), this.error = t.error.bind(null, r);\n  }\n}\nconst As = function() {\n}, _S = {\n  trace: As,\n  debug: As,\n  log: As,\n  warn: As,\n  info: As,\n  error: As\n};\nfunction oc() {\n  return nt({}, _S);\n}\nfunction RS(s, e) {\n  const t = self.console[s];\n  return t ? t.bind(self.console, `${e ? \"[\" + e + \"] \" : \"\"}[${s}] >`) : As;\n}\nfunction Jd(s, e, t) {\n  return e[s] ? e[s].bind(e) : RS(s, t);\n}\nconst ac = oc();\nfunction LS(s, e, t) {\n  const r = oc();\n  if (typeof console == \"object\" && s === !0 || typeof s == \"object\") {\n    const n = [\n      // Remove out from list here to hard-disable a log-level\n      // 'trace',\n      \"debug\",\n      \"log\",\n      \"info\",\n      \"warn\",\n      \"error\"\n    ];\n    n.forEach((i) => {\n      r[i] = Jd(i, s, t);\n    });\n    try {\n      r.log(`Debug logs enabled for \"${e}\" in hls.js version 1.6.12`);\n    } catch {\n      return oc();\n    }\n    n.forEach((i) => {\n      ac[i] = Jd(i, s);\n    });\n  } else\n    nt(ac, r);\n  return r;\n}\nconst rt = ac;\nfunction Ms(s = !0) {\n  return typeof self > \"u\" ? void 0 : (s || !self.MediaSource) && self.ManagedMediaSource || self.MediaSource || self.WebKitMediaSource;\n}\nfunction CS(s) {\n  return typeof self < \"u\" && s === self.ManagedMediaSource;\n}\nfunction Ag(s, e) {\n  const t = Object.keys(s), r = Object.keys(e), n = t.length, i = r.length;\n  return !n || !i || n === i && !t.some((o) => r.indexOf(o) === -1);\n}\nfunction Tr(s, e = !1) {\n  if (typeof TextDecoder < \"u\") {\n    const c = new TextDecoder(\"utf-8\").decode(s);\n    if (e) {\n      const u = c.indexOf(\"\\0\");\n      return u !== -1 ? c.substring(0, u) : c;\n    }\n    return c.replace(/\\0/g, \"\");\n  }\n  const t = s.length;\n  let r, n, i, o = \"\", a = 0;\n  for (; a < t; ) {\n    if (r = s[a++], r === 0 && e)\n      return o;\n    if (r === 0 || r === 3)\n      continue;\n    switch (r >> 4) {\n      case 0:\n      case 1:\n      case 2:\n      case 3:\n      case 4:\n      case 5:\n      case 6:\n      case 7:\n        o += String.fromCharCode(r);\n        break;\n      case 12:\n      case 13:\n        n = s[a++], o += String.fromCharCode((r & 31) << 6 | n & 63);\n        break;\n      case 14:\n        n = s[a++], i = s[a++], o += String.fromCharCode((r & 15) << 12 | (n & 63) << 6 | (i & 63) << 0);\n        break;\n    }\n  }\n  return o;\n}\nfunction fr(s) {\n  let e = \"\";\n  for (let t = 0; t < s.length; t++) {\n    let r = s[t].toString(16);\n    r.length < 2 && (r = \"0\" + r), e += r;\n  }\n  return e;\n}\nfunction Ig(s) {\n  return Uint8Array.from(s.replace(/^0x/, \"\").replace(/([\\da-fA-F]{2}) ?/g, \"0x$1 \").replace(/ +$/, \"\").split(\" \")).buffer;\n}\nfunction kS(s) {\n  return s && s.__esModule && Object.prototype.hasOwnProperty.call(s, \"default\") ? s.default : s;\n}\nvar cl = { exports: {} }, Qd;\nfunction DS() {\n  return Qd || (Qd = 1, (function(s, e) {\n    (function(t) {\n      var r = /^(?=((?:[a-zA-Z0-9+\\-.]+:)?))\\1(?=((?:\\/\\/[^\\/?#]*)?))\\2(?=((?:(?:[^?#\\/]*\\/)*[^;?#\\/]*)?))\\3((?:;[^?#]*)?)(\\?[^#]*)?(#[^]*)?$/, n = /^(?=([^\\/?#]*))\\1([^]*)$/, i = /(?:\\/|^)\\.(?=\\/)/g, o = /(?:\\/|^)\\.\\.\\/(?!\\.\\.\\/)[^\\/]*(?=\\/)/g, a = {\n        // If opts.alwaysNormalize is true then the path will always be normalized even when it starts with / or //\n        // E.g\n        // With opts.alwaysNormalize = false (default, spec compliant)\n        // http://a.com/b/cd + /e/f/../g => http://a.com/e/f/../g\n        // With opts.alwaysNormalize = true (not spec compliant)\n        // http://a.com/b/cd + /e/f/../g => http://a.com/e/g\n        buildAbsoluteURL: function(l, c, u) {\n          if (u = u || {}, l = l.trim(), c = c.trim(), !c) {\n            if (!u.alwaysNormalize)\n              return l;\n            var d = a.parseURL(l);\n            if (!d)\n              throw new Error(\"Error trying to parse base URL.\");\n            return d.path = a.normalizePath(\n              d.path\n            ), a.buildURLFromParts(d);\n          }\n          var h = a.parseURL(c);\n          if (!h)\n            throw new Error(\"Error trying to parse relative URL.\");\n          if (h.scheme)\n            return u.alwaysNormalize ? (h.path = a.normalizePath(h.path), a.buildURLFromParts(h)) : c;\n          var f = a.parseURL(l);\n          if (!f)\n            throw new Error(\"Error trying to parse base URL.\");\n          if (!f.netLoc && f.path && f.path[0] !== \"/\") {\n            var p = n.exec(f.path);\n            f.netLoc = p[1], f.path = p[2];\n          }\n          f.netLoc && !f.path && (f.path = \"/\");\n          var y = {\n            // 2c) Otherwise, the embedded URL inherits the scheme of\n            // the base URL.\n            scheme: f.scheme,\n            netLoc: h.netLoc,\n            path: null,\n            params: h.params,\n            query: h.query,\n            fragment: h.fragment\n          };\n          if (!h.netLoc && (y.netLoc = f.netLoc, h.path[0] !== \"/\"))\n            if (!h.path)\n              y.path = f.path, h.params || (y.params = f.params, h.query || (y.query = f.query));\n            else {\n              var E = f.path, b = E.substring(0, E.lastIndexOf(\"/\") + 1) + h.path;\n              y.path = a.normalizePath(b);\n            }\n          return y.path === null && (y.path = u.alwaysNormalize ? a.normalizePath(h.path) : h.path), a.buildURLFromParts(y);\n        },\n        parseURL: function(l) {\n          var c = r.exec(l);\n          return c ? {\n            scheme: c[1] || \"\",\n            netLoc: c[2] || \"\",\n            path: c[3] || \"\",\n            params: c[4] || \"\",\n            query: c[5] || \"\",\n            fragment: c[6] || \"\"\n          } : null;\n        },\n        normalizePath: function(l) {\n          for (l = l.split(\"\").reverse().join(\"\").replace(i, \"\"); l.length !== (l = l.replace(o, \"\")).length; )\n            ;\n          return l.split(\"\").reverse().join(\"\");\n        },\n        buildURLFromParts: function(l) {\n          return l.scheme + l.netLoc + l.path + l.params + l.query + l.fragment;\n        }\n      };\n      s.exports = a;\n    })();\n  })(cl)), cl.exports;\n}\nvar hu = DS();\nclass fu {\n  constructor() {\n    this.aborted = !1, this.loaded = 0, this.retry = 0, this.total = 0, this.chunkCount = 0, this.bwEstimate = 0, this.loading = {\n      start: 0,\n      first: 0,\n      end: 0\n    }, this.parsing = {\n      start: 0,\n      end: 0\n    }, this.buffering = {\n      start: 0,\n      first: 0,\n      end: 0\n    };\n  }\n}\nvar ot = {\n  AUDIO: \"audio\",\n  VIDEO: \"video\",\n  AUDIOVIDEO: \"audiovideo\"\n};\nclass _g {\n  constructor(e) {\n    this._byteRange = null, this._url = null, this._stats = null, this._streams = null, this.base = void 0, this.relurl = void 0, typeof e == \"string\" && (e = {\n      url: e\n    }), this.base = e, MS(this, \"stats\");\n  }\n  // setByteRange converts a EXT-X-BYTERANGE attribute into a two element array\n  setByteRange(e, t) {\n    const r = e.split(\"@\", 2);\n    let n;\n    r.length === 1 ? n = (t == null ? void 0 : t.byteRangeEndOffset) || 0 : n = parseInt(r[1]), this._byteRange = [n, parseInt(r[0]) + n];\n  }\n  get baseurl() {\n    return this.base.url;\n  }\n  get byteRange() {\n    return this._byteRange === null ? [] : this._byteRange;\n  }\n  get byteRangeStartOffset() {\n    return this.byteRange[0];\n  }\n  get byteRangeEndOffset() {\n    return this.byteRange[1];\n  }\n  get elementaryStreams() {\n    return this._streams === null && (this._streams = {\n      [ot.AUDIO]: null,\n      [ot.VIDEO]: null,\n      [ot.AUDIOVIDEO]: null\n    }), this._streams;\n  }\n  set elementaryStreams(e) {\n    this._streams = e;\n  }\n  get hasStats() {\n    return this._stats !== null;\n  }\n  get hasStreams() {\n    return this._streams !== null;\n  }\n  get stats() {\n    return this._stats === null && (this._stats = new fu()), this._stats;\n  }\n  set stats(e) {\n    this._stats = e;\n  }\n  get url() {\n    return !this._url && this.baseurl && this.relurl && (this._url = hu.buildAbsoluteURL(this.baseurl, this.relurl, {\n      alwaysNormalize: !0\n    })), this._url || \"\";\n  }\n  set url(e) {\n    this._url = e;\n  }\n  clearElementaryStreamInfo() {\n    const {\n      elementaryStreams: e\n    } = this;\n    e[ot.AUDIO] = null, e[ot.VIDEO] = null, e[ot.AUDIOVIDEO] = null;\n  }\n}\nfunction Vt(s) {\n  return s.sn !== \"initSegment\";\n}\nclass ul extends _g {\n  constructor(e, t) {\n    super(t), this._decryptdata = null, this._programDateTime = null, this._ref = null, this._bitrate = void 0, this.rawProgramDateTime = null, this.tagList = [], this.duration = 0, this.sn = 0, this.levelkeys = void 0, this.type = void 0, this.loader = null, this.keyLoader = null, this.level = -1, this.cc = 0, this.startPTS = void 0, this.endPTS = void 0, this.startDTS = void 0, this.endDTS = void 0, this.start = 0, this.playlistOffset = 0, this.deltaPTS = void 0, this.maxStartPTS = void 0, this.minEndPTS = void 0, this.data = void 0, this.bitrateTest = !1, this.title = null, this.initSegment = null, this.endList = void 0, this.gap = void 0, this.urlId = 0, this.type = e;\n  }\n  get byteLength() {\n    if (this.hasStats) {\n      const e = this.stats.total;\n      if (e)\n        return e;\n    }\n    if (this.byteRange.length) {\n      const e = this.byteRange[0], t = this.byteRange[1];\n      if (ue(e) && ue(t))\n        return t - e;\n    }\n    return null;\n  }\n  get bitrate() {\n    return this.byteLength ? this.byteLength * 8 / this.duration : this._bitrate ? this._bitrate : null;\n  }\n  set bitrate(e) {\n    this._bitrate = e;\n  }\n  get decryptdata() {\n    const {\n      levelkeys: e\n    } = this;\n    if (!e && !this._decryptdata)\n      return null;\n    if (!this._decryptdata && this.levelkeys && !this.levelkeys.NONE) {\n      const t = this.levelkeys.identity;\n      if (t)\n        this._decryptdata = t.getDecryptData(this.sn);\n      else {\n        const r = Object.keys(this.levelkeys);\n        if (r.length === 1) {\n          const n = this._decryptdata = this.levelkeys[r[0]] || null;\n          if (n)\n            return n.getDecryptData(this.sn);\n        }\n      }\n    }\n    return this._decryptdata;\n  }\n  get end() {\n    return this.start + this.duration;\n  }\n  get endProgramDateTime() {\n    if (this.programDateTime === null)\n      return null;\n    const e = ue(this.duration) ? this.duration : 0;\n    return this.programDateTime + e * 1e3;\n  }\n  get encrypted() {\n    var e;\n    if ((e = this._decryptdata) != null && e.encrypted)\n      return !0;\n    if (this.levelkeys) {\n      var t;\n      const r = Object.keys(this.levelkeys), n = r.length;\n      if (n > 1 || n === 1 && (t = this.levelkeys[r[0]]) != null && t.encrypted)\n        return !0;\n    }\n    return !1;\n  }\n  get programDateTime() {\n    return this._programDateTime === null && this.rawProgramDateTime && (this.programDateTime = Date.parse(this.rawProgramDateTime)), this._programDateTime;\n  }\n  set programDateTime(e) {\n    if (!ue(e)) {\n      this._programDateTime = this.rawProgramDateTime = null;\n      return;\n    }\n    this._programDateTime = e;\n  }\n  get ref() {\n    return Vt(this) ? (this._ref || (this._ref = {\n      base: this.base,\n      start: this.start,\n      duration: this.duration,\n      sn: this.sn,\n      programDateTime: this.programDateTime\n    }), this._ref) : null;\n  }\n  addStart(e) {\n    this.setStart(this.start + e);\n  }\n  setStart(e) {\n    this.start = e, this._ref && (this._ref.start = e);\n  }\n  setDuration(e) {\n    this.duration = e, this._ref && (this._ref.duration = e);\n  }\n  setKeyFormat(e) {\n    if (this.levelkeys) {\n      const t = this.levelkeys[e];\n      t && !this._decryptdata && (this._decryptdata = t.getDecryptData(this.sn));\n    }\n  }\n  abortRequests() {\n    var e, t;\n    (e = this.loader) == null || e.abort(), (t = this.keyLoader) == null || t.abort();\n  }\n  setElementaryStreamInfo(e, t, r, n, i, o = !1) {\n    const {\n      elementaryStreams: a\n    } = this, l = a[e];\n    if (!l) {\n      a[e] = {\n        startPTS: t,\n        endPTS: r,\n        startDTS: n,\n        endDTS: i,\n        partial: o\n      };\n      return;\n    }\n    l.startPTS = Math.min(l.startPTS, t), l.endPTS = Math.max(l.endPTS, r), l.startDTS = Math.min(l.startDTS, n), l.endDTS = Math.max(l.endDTS, i);\n  }\n}\nclass PS extends _g {\n  constructor(e, t, r, n, i) {\n    super(r), this.fragOffset = 0, this.duration = 0, this.gap = !1, this.independent = !1, this.relurl = void 0, this.fragment = void 0, this.index = void 0, this.duration = e.decimalFloatingPoint(\"DURATION\"), this.gap = e.bool(\"GAP\"), this.independent = e.bool(\"INDEPENDENT\"), this.relurl = e.enumeratedString(\"URI\"), this.fragment = t, this.index = n;\n    const o = e.enumeratedString(\"BYTERANGE\");\n    o && this.setByteRange(o, i), i && (this.fragOffset = i.fragOffset + i.duration);\n  }\n  get start() {\n    return this.fragment.start + this.fragOffset;\n  }\n  get end() {\n    return this.start + this.duration;\n  }\n  get loaded() {\n    const {\n      elementaryStreams: e\n    } = this;\n    return !!(e.audio || e.video || e.audiovideo);\n  }\n}\nfunction Rg(s, e) {\n  const t = Object.getPrototypeOf(s);\n  if (t) {\n    const r = Object.getOwnPropertyDescriptor(t, e);\n    return r || Rg(t, e);\n  }\n}\nfunction MS(s, e) {\n  const t = Rg(s, e);\n  t && (t.enumerable = !0, Object.defineProperty(s, e, t));\n}\nconst eh = Math.pow(2, 32) - 1, OS = [].push, Lg = {\n  video: 1,\n  audio: 2,\n  id3: 3,\n  text: 4\n};\nfunction jt(s) {\n  return String.fromCharCode.apply(null, s);\n}\nfunction Cg(s, e) {\n  const t = s[e] << 8 | s[e + 1];\n  return t < 0 ? 65536 + t : t;\n}\nfunction Ie(s, e) {\n  const t = kg(s, e);\n  return t < 0 ? 4294967296 + t : t;\n}\nfunction th(s, e) {\n  let t = Ie(s, e);\n  return t *= Math.pow(2, 32), t += Ie(s, e + 4), t;\n}\nfunction kg(s, e) {\n  return s[e] << 24 | s[e + 1] << 16 | s[e + 2] << 8 | s[e + 3];\n}\nfunction BS(s) {\n  const e = s.byteLength;\n  for (let t = 0; t < e; ) {\n    const r = Ie(s, t);\n    if (r > 8 && s[t + 4] === 109 && s[t + 5] === 111 && s[t + 6] === 111 && s[t + 7] === 102)\n      return !0;\n    t = r > 1 ? t + r : e;\n  }\n  return !1;\n}\nfunction Ge(s, e) {\n  const t = [];\n  if (!e.length)\n    return t;\n  const r = s.byteLength;\n  for (let n = 0; n < r; ) {\n    const i = Ie(s, n), o = jt(s.subarray(n + 4, n + 8)), a = i > 1 ? n + i : r;\n    if (o === e[0])\n      if (e.length === 1)\n        t.push(s.subarray(n + 8, a));\n      else {\n        const l = Ge(s.subarray(n + 8, a), e.slice(1));\n        l.length && OS.apply(t, l);\n      }\n    n = a;\n  }\n  return t;\n}\nfunction FS(s) {\n  const e = [], t = s[0];\n  let r = 8;\n  const n = Ie(s, r);\n  r += 4;\n  let i = 0, o = 0;\n  t === 0 ? (i = Ie(s, r), o = Ie(s, r + 4), r += 8) : (i = th(s, r), o = th(s, r + 8), r += 16), r += 2;\n  let a = s.length + o;\n  const l = Cg(s, r);\n  r += 2;\n  for (let c = 0; c < l; c++) {\n    let u = r;\n    const d = Ie(s, u);\n    u += 4;\n    const h = d & 2147483647;\n    if ((d & 2147483648) >>> 31 === 1)\n      return rt.warn(\"SIDX has hierarchical references (not supported)\"), null;\n    const p = Ie(s, u);\n    u += 4, e.push({\n      referenceSize: h,\n      subsegmentDuration: p,\n      // unscaled\n      info: {\n        duration: p / n,\n        start: a,\n        end: a + h - 1\n      }\n    }), a += h, u += 4, r = u;\n  }\n  return {\n    earliestPresentationTime: i,\n    timescale: n,\n    version: t,\n    referencesCount: l,\n    references: e\n  };\n}\nfunction Dg(s) {\n  const e = [], t = Ge(s, [\"moov\", \"trak\"]);\n  for (let n = 0; n < t.length; n++) {\n    const i = t[n], o = Ge(i, [\"tkhd\"])[0];\n    if (o) {\n      let a = o[0];\n      const l = Ie(o, a === 0 ? 12 : 20), c = Ge(i, [\"mdia\", \"mdhd\"])[0];\n      if (c) {\n        a = c[0];\n        const u = Ie(c, a === 0 ? 12 : 20), d = Ge(i, [\"mdia\", \"hdlr\"])[0];\n        if (d) {\n          const h = jt(d.subarray(8, 12)), f = {\n            soun: ot.AUDIO,\n            vide: ot.VIDEO\n          }[h], p = Ge(i, [\"mdia\", \"minf\", \"stbl\", \"stsd\"])[0], y = NS(p);\n          f ? (e[l] = {\n            timescale: u,\n            type: f,\n            stsd: y\n          }, e[f] = tt({\n            timescale: u,\n            id: l\n          }, y)) : e[l] = {\n            timescale: u,\n            type: h,\n            stsd: y\n          };\n        }\n      }\n    }\n  }\n  return Ge(s, [\"moov\", \"mvex\", \"trex\"]).forEach((n) => {\n    const i = Ie(n, 4), o = e[i];\n    o && (o.default = {\n      duration: Ie(n, 12),\n      flags: Ie(n, 20)\n    });\n  }), e;\n}\nfunction NS(s) {\n  const e = s.subarray(8), t = e.subarray(86), r = jt(e.subarray(4, 8));\n  let n = r, i;\n  const o = r === \"enca\" || r === \"encv\";\n  if (o) {\n    const c = Ge(e, [r])[0].subarray(r === \"enca\" ? 28 : 78);\n    Ge(c, [\"sinf\"]).forEach((d) => {\n      const h = Ge(d, [\"schm\"])[0];\n      if (h) {\n        const f = jt(h.subarray(4, 8));\n        if (f === \"cbcs\" || f === \"cenc\") {\n          const p = Ge(d, [\"frma\"])[0];\n          p && (n = jt(p));\n        }\n      }\n    });\n  }\n  const a = n;\n  switch (n) {\n    case \"avc1\":\n    case \"avc2\":\n    case \"avc3\":\n    case \"avc4\": {\n      const l = Ge(t, [\"avcC\"])[0];\n      l && l.length > 3 && (n += \".\" + Ki(l[1]) + Ki(l[2]) + Ki(l[3]), i = ji(a === \"avc1\" ? \"dva1\" : \"dvav\", t));\n      break;\n    }\n    case \"mp4a\": {\n      const l = Ge(e, [r])[0], c = Ge(l.subarray(28), [\"esds\"])[0];\n      if (c && c.length > 7) {\n        let u = 4;\n        if (c[u++] !== 3)\n          break;\n        u = dl(c, u), u += 2;\n        const d = c[u++];\n        if (d & 128 && (u += 2), d & 64 && (u += c[u++]), c[u++] !== 4)\n          break;\n        u = dl(c, u);\n        const h = c[u++];\n        if (h === 64)\n          n += \".\" + Ki(h);\n        else\n          break;\n        if (u += 12, c[u++] !== 5)\n          break;\n        u = dl(c, u);\n        const f = c[u++];\n        let p = (f & 248) >> 3;\n        p === 31 && (p += 1 + ((f & 7) << 3) + ((c[u] & 224) >> 5)), n += \".\" + p;\n      }\n      break;\n    }\n    case \"hvc1\":\n    case \"hev1\": {\n      const l = Ge(t, [\"hvcC\"])[0];\n      if (l && l.length > 12) {\n        const c = l[1], u = [\"\", \"A\", \"B\", \"C\"][c >> 6], d = c & 31, h = Ie(l, 2), f = (c & 32) >> 5 ? \"H\" : \"L\", p = l[12], y = l.subarray(6, 12);\n        n += \".\" + u + d, n += \".\" + US(h).toString(16).toUpperCase(), n += \".\" + f + p;\n        let E = \"\";\n        for (let b = y.length; b--; ) {\n          const R = y[b];\n          (R || E) && (E = \".\" + R.toString(16).toUpperCase() + E);\n        }\n        n += E;\n      }\n      i = ji(a == \"hev1\" ? \"dvhe\" : \"dvh1\", t);\n      break;\n    }\n    case \"dvh1\":\n    case \"dvhe\":\n    case \"dvav\":\n    case \"dva1\":\n    case \"dav1\": {\n      n = ji(n, t) || n;\n      break;\n    }\n    case \"vp09\": {\n      const l = Ge(t, [\"vpcC\"])[0];\n      if (l && l.length > 6) {\n        const c = l[4], u = l[5], d = l[6] >> 4 & 15;\n        n += \".\" + Vr(c) + \".\" + Vr(u) + \".\" + Vr(d);\n      }\n      break;\n    }\n    case \"av01\": {\n      const l = Ge(t, [\"av1C\"])[0];\n      if (l && l.length > 2) {\n        const c = l[1] >>> 5, u = l[1] & 31, d = l[2] >>> 7 ? \"H\" : \"M\", h = (l[2] & 64) >> 6, f = (l[2] & 32) >> 5, p = c === 2 && h ? f ? 12 : 10 : h ? 10 : 8, y = (l[2] & 16) >> 4, E = (l[2] & 8) >> 3, b = (l[2] & 4) >> 2, R = l[2] & 3;\n        n += \".\" + c + \".\" + Vr(u) + d + \".\" + Vr(p) + \".\" + y + \".\" + E + b + R + \".\" + Vr(1) + \".\" + Vr(1) + \".\" + Vr(1) + \".\" + 0, i = ji(\"dav1\", t);\n      }\n      break;\n    }\n  }\n  return {\n    codec: n,\n    encrypted: o,\n    supplemental: i\n  };\n}\nfunction ji(s, e) {\n  const t = Ge(e, [\"dvvC\"]), r = t.length ? t[0] : Ge(e, [\"dvcC\"])[0];\n  if (r) {\n    const n = r[2] >> 1 & 127, i = r[2] << 5 & 32 | r[3] >> 3 & 31;\n    return s + \".\" + Vr(n) + \".\" + Vr(i);\n  }\n}\nfunction US(s) {\n  let e = 0;\n  for (let t = 0; t < 32; t++)\n    e |= (s >> t & 1) << 31 - t;\n  return e >>> 0;\n}\nfunction dl(s, e) {\n  const t = e + 5;\n  for (; s[e++] & 128 && e < t; )\n    ;\n  return e;\n}\nfunction Ki(s) {\n  return (\"0\" + s.toString(16).toUpperCase()).slice(-2);\n}\nfunction Vr(s) {\n  return (s < 10 ? \"0\" : \"\") + s;\n}\nfunction $S(s, e) {\n  if (!s || !e)\n    return;\n  const t = e.keyId;\n  t && e.isCommonEncryption && Ge(s, [\"moov\", \"trak\"]).forEach((n) => {\n    const o = Ge(n, [\"mdia\", \"minf\", \"stbl\", \"stsd\"])[0].subarray(8);\n    let a = Ge(o, [\"enca\"]);\n    const l = a.length > 0;\n    l || (a = Ge(o, [\"encv\"])), a.forEach((c) => {\n      const u = l ? c.subarray(28) : c.subarray(78);\n      Ge(u, [\"sinf\"]).forEach((h) => {\n        const f = Pg(h);\n        if (f) {\n          const p = f.subarray(8, 24);\n          p.some((y) => y !== 0) || (rt.log(`[eme] Patching keyId in 'enc${l ? \"a\" : \"v\"}>sinf>>tenc' box: ${fr(p)} -> ${fr(t)}`), f.set(t, 8));\n        }\n      });\n    });\n  });\n}\nfunction Pg(s) {\n  const e = Ge(s, [\"schm\"])[0];\n  if (e) {\n    const t = jt(e.subarray(4, 8));\n    if (t === \"cbcs\" || t === \"cenc\")\n      return Ge(s, [\"schi\", \"tenc\"])[0];\n  }\n  return null;\n}\nfunction GS(s, e, t) {\n  const r = {}, n = Ge(s, [\"moof\", \"traf\"]);\n  for (let i = 0; i < n.length; i++) {\n    const o = n[i], a = Ge(o, [\"tfhd\"])[0], l = Ie(a, 4), c = e[l];\n    if (!c)\n      continue;\n    r[l] || (r[l] = {\n      start: NaN,\n      duration: 0,\n      sampleCount: 0,\n      timescale: c.timescale,\n      type: c.type\n    });\n    const u = r[l], d = Ge(o, [\"tfdt\"])[0];\n    if (d) {\n      const A = d[0];\n      let F = Ie(d, 4);\n      A === 1 && (F === eh ? t.warn(\"[mp4-demuxer]: Ignoring assumed invalid signed 64-bit track fragment decode time\") : (F *= eh + 1, F += Ie(d, 8))), ue(F) && (!ue(u.start) || F < u.start) && (u.start = F);\n    }\n    const h = c.default, f = Ie(a, 0) | (h == null ? void 0 : h.flags);\n    let p = (h == null ? void 0 : h.duration) || 0;\n    f & 8 && (f & 2 ? p = Ie(a, 12) : p = Ie(a, 8));\n    const y = Ge(o, [\"trun\"]);\n    let E = u.start || 0, b = 0, R = p;\n    for (let A = 0; A < y.length; A++) {\n      const F = y[A], M = Ie(F, 4), H = u.sampleCount;\n      u.sampleCount += M;\n      const K = F[3] & 1, j = F[3] & 4, C = F[2] & 1, k = F[2] & 2, $ = F[2] & 4, W = F[2] & 8;\n      let _ = 8, g = M;\n      for (K && (_ += 4), j && M && (!(F[_ + 1] & 1) && u.keyFrameIndex === void 0 && (u.keyFrameIndex = H), _ += 4, C ? (R = Ie(F, _), _ += 4) : R = p, k && (_ += 4), W && (_ += 4), E += R, b += R, g--); g--; )\n        C ? (R = Ie(F, _), _ += 4) : R = p, k && (_ += 4), $ && (F[_ + 1] & 1 || u.keyFrameIndex === void 0 && (u.keyFrameIndex = u.sampleCount - (g + 1), u.keyFrameStart = E), _ += 4), W && (_ += 4), E += R, b += R;\n      !b && p && (b += p * M);\n    }\n    u.duration += b;\n  }\n  if (!Object.keys(r).some((i) => r[i].duration)) {\n    let i = 1 / 0, o = 0;\n    const a = Ge(s, [\"sidx\"]);\n    for (let l = 0; l < a.length; l++) {\n      const c = FS(a[l]);\n      if (c != null && c.references) {\n        i = Math.min(i, c.earliestPresentationTime / c.timescale);\n        const u = c.references.reduce((d, h) => d + h.info.duration || 0, 0);\n        o = Math.max(o, u + c.earliestPresentationTime / c.timescale);\n      }\n    }\n    o && ue(o) && Object.keys(r).forEach((l) => {\n      r[l].duration || (r[l].duration = o * r[l].timescale - r[l].start);\n    });\n  }\n  return r;\n}\nfunction VS(s) {\n  const e = {\n    valid: null,\n    remainder: null\n  }, t = Ge(s, [\"moof\"]);\n  if (t.length < 2)\n    return e.remainder = s, e;\n  const r = t[t.length - 1];\n  return e.valid = s.slice(0, r.byteOffset - 8), e.remainder = s.slice(r.byteOffset - 8), e;\n}\nfunction _r(s, e) {\n  const t = new Uint8Array(s.length + e.length);\n  return t.set(s), t.set(e, s.length), t;\n}\nfunction rh(s, e) {\n  const t = [], r = e.samples, n = e.timescale, i = e.id;\n  let o = !1;\n  return Ge(r, [\"moof\"]).map((l) => {\n    const c = l.byteOffset - 8;\n    Ge(l, [\"traf\"]).map((d) => {\n      const h = Ge(d, [\"tfdt\"]).map((f) => {\n        const p = f[0];\n        let y = Ie(f, 4);\n        return p === 1 && (y *= Math.pow(2, 32), y += Ie(f, 8)), y / n;\n      })[0];\n      return h !== void 0 && (s = h), Ge(d, [\"tfhd\"]).map((f) => {\n        const p = Ie(f, 4), y = Ie(f, 0) & 16777215, E = (y & 1) !== 0, b = (y & 2) !== 0, R = (y & 8) !== 0;\n        let A = 0;\n        const F = (y & 16) !== 0;\n        let M = 0;\n        const H = (y & 32) !== 0;\n        let K = 8;\n        p === i && (E && (K += 8), b && (K += 4), R && (A = Ie(f, K), K += 4), F && (M = Ie(f, K), K += 4), H && (K += 4), e.type === \"video\" && (o = ya(e.codec)), Ge(d, [\"trun\"]).map((j) => {\n          const C = j[0], k = Ie(j, 0) & 16777215, $ = (k & 1) !== 0;\n          let W = 0;\n          const _ = (k & 4) !== 0, g = (k & 256) !== 0;\n          let x = 0;\n          const w = (k & 512) !== 0;\n          let D = 0;\n          const O = (k & 1024) !== 0, U = (k & 2048) !== 0;\n          let V = 0;\n          const L = Ie(j, 4);\n          let m = 8;\n          $ && (W = Ie(j, m), m += 4), _ && (m += 4);\n          let v = W + c;\n          for (let P = 0; P < L; P++) {\n            if (g ? (x = Ie(j, m), m += 4) : x = A, w ? (D = Ie(j, m), m += 4) : D = M, O && (m += 4), U && (C === 0 ? V = Ie(j, m) : V = kg(j, m), m += 4), e.type === ot.VIDEO) {\n              let N = 0;\n              for (; N < D; ) {\n                const Y = Ie(r, v);\n                if (v += 4, jS(o, r[v])) {\n                  const ee = r.subarray(v, v + Y);\n                  gu(ee, o ? 2 : 1, s + V / n, t);\n                }\n                v += Y, N += Y + 4;\n              }\n            }\n            s += x / n;\n          }\n        }));\n      });\n    });\n  }), t;\n}\nfunction ya(s) {\n  if (!s)\n    return !1;\n  const e = s.substring(0, 4);\n  return e === \"hvc1\" || e === \"hev1\" || // Dolby Vision\n  e === \"dvh1\" || e === \"dvhe\";\n}\nfunction jS(s, e) {\n  if (s) {\n    const t = e >> 1 & 63;\n    return t === 39 || t === 40;\n  } else\n    return (e & 31) === 6;\n}\nfunction gu(s, e, t, r) {\n  const n = Mg(s);\n  let i = 0;\n  i += e;\n  let o = 0, a = 0, l = 0;\n  for (; i < n.length; ) {\n    o = 0;\n    do {\n      if (i >= n.length)\n        break;\n      l = n[i++], o += l;\n    } while (l === 255);\n    a = 0;\n    do {\n      if (i >= n.length)\n        break;\n      l = n[i++], a += l;\n    } while (l === 255);\n    const c = n.length - i;\n    let u = i;\n    if (a < c)\n      i += a;\n    else if (a > c) {\n      rt.error(`Malformed SEI payload. ${a} is too small, only ${c} bytes left to parse.`);\n      break;\n    }\n    if (o === 4) {\n      if (n[u++] === 181) {\n        const h = Cg(n, u);\n        if (u += 2, h === 49) {\n          const f = Ie(n, u);\n          if (u += 4, f === 1195456820) {\n            const p = n[u++];\n            if (p === 3) {\n              const y = n[u++], E = 31 & y, b = 64 & y, R = b ? 2 + E * 3 : 0, A = new Uint8Array(R);\n              if (b) {\n                A[0] = y;\n                for (let F = 1; F < R; F++)\n                  A[F] = n[u++];\n              }\n              r.push({\n                type: p,\n                payloadType: o,\n                pts: t,\n                bytes: A\n              });\n            }\n          }\n        }\n      }\n    } else if (o === 5 && a > 16) {\n      const d = [];\n      for (let p = 0; p < 16; p++) {\n        const y = n[u++].toString(16);\n        d.push(y.length == 1 ? \"0\" + y : y), (p === 3 || p === 5 || p === 7 || p === 9) && d.push(\"-\");\n      }\n      const h = a - 16, f = new Uint8Array(h);\n      for (let p = 0; p < h; p++)\n        f[p] = n[u++];\n      r.push({\n        payloadType: o,\n        pts: t,\n        uuid: d.join(\"\"),\n        userData: Tr(f),\n        userDataBytes: f\n      });\n    }\n  }\n}\nfunction Mg(s) {\n  const e = s.byteLength, t = [];\n  let r = 1;\n  for (; r < e - 2; )\n    s[r] === 0 && s[r + 1] === 0 && s[r + 2] === 3 ? (t.push(r + 2), r += 2) : r++;\n  if (t.length === 0)\n    return s;\n  const n = e - t.length, i = new Uint8Array(n);\n  let o = 0;\n  for (r = 0; r < n; o++, r++)\n    o === t[0] && (o++, t.shift()), i[r] = s[o];\n  return i;\n}\nfunction KS(s) {\n  const e = s[0];\n  let t = \"\", r = \"\", n = 0, i = 0, o = 0, a = 0, l = 0, c = 0;\n  if (e === 0) {\n    for (; jt(s.subarray(c, c + 1)) !== \"\\0\"; )\n      t += jt(s.subarray(c, c + 1)), c += 1;\n    for (t += jt(s.subarray(c, c + 1)), c += 1; jt(s.subarray(c, c + 1)) !== \"\\0\"; )\n      r += jt(s.subarray(c, c + 1)), c += 1;\n    r += jt(s.subarray(c, c + 1)), c += 1, n = Ie(s, 12), i = Ie(s, 16), a = Ie(s, 20), l = Ie(s, 24), c = 28;\n  } else if (e === 1) {\n    c += 4, n = Ie(s, c), c += 4;\n    const d = Ie(s, c);\n    c += 4;\n    const h = Ie(s, c);\n    for (c += 4, o = 2 ** 32 * d + h, SS(o) || (o = Number.MAX_SAFE_INTEGER, rt.warn(\"Presentation time exceeds safe integer limit and wrapped to max safe integer in parsing emsg box\")), a = Ie(s, c), c += 4, l = Ie(s, c), c += 4; jt(s.subarray(c, c + 1)) !== \"\\0\"; )\n      t += jt(s.subarray(c, c + 1)), c += 1;\n    for (t += jt(s.subarray(c, c + 1)), c += 1; jt(s.subarray(c, c + 1)) !== \"\\0\"; )\n      r += jt(s.subarray(c, c + 1)), c += 1;\n    r += jt(s.subarray(c, c + 1)), c += 1;\n  }\n  const u = s.subarray(c, s.byteLength);\n  return {\n    schemeIdUri: t,\n    value: r,\n    timeScale: n,\n    presentationTime: o,\n    presentationTimeDelta: i,\n    eventDuration: a,\n    id: l,\n    payload: u\n  };\n}\nfunction HS(s, ...e) {\n  const t = e.length;\n  let r = 8, n = t;\n  for (; n--; )\n    r += e[n].byteLength;\n  const i = new Uint8Array(r);\n  for (i[0] = r >> 24 & 255, i[1] = r >> 16 & 255, i[2] = r >> 8 & 255, i[3] = r & 255, i.set(s, 4), n = 0, r = 8; n < t; n++)\n    i.set(e[n], r), r += e[n].byteLength;\n  return i;\n}\nfunction qS(s, e, t) {\n  if (s.byteLength !== 16)\n    throw new RangeError(\"Invalid system id\");\n  let r, n;\n  r = 0, n = new Uint8Array();\n  let i;\n  r > 0 ? (i = new Uint8Array(4), e.length > 0 && new DataView(i.buffer).setUint32(0, e.length, !1)) : i = new Uint8Array();\n  const o = new Uint8Array(4);\n  return t.byteLength > 0 && new DataView(o.buffer).setUint32(0, t.byteLength, !1), HS(\n    [112, 115, 115, 104],\n    new Uint8Array([\n      r,\n      0,\n      0,\n      0\n      // Flags\n    ]),\n    s,\n    // 16 bytes\n    i,\n    n,\n    o,\n    t\n  );\n}\nfunction WS(s) {\n  const e = [];\n  if (s instanceof ArrayBuffer) {\n    const t = s.byteLength;\n    let r = 0;\n    for (; r + 32 < t; ) {\n      const n = new DataView(s, r), i = zS(n);\n      e.push(i), r += i.size;\n    }\n  }\n  return e;\n}\nfunction zS(s) {\n  const e = s.getUint32(0), t = s.byteOffset, r = s.byteLength;\n  if (r < e)\n    return {\n      offset: t,\n      size: r\n    };\n  if (s.getUint32(4) !== 1886614376)\n    return {\n      offset: t,\n      size: e\n    };\n  const i = s.getUint32(8) >>> 24;\n  if (i !== 0 && i !== 1)\n    return {\n      offset: t,\n      size: e\n    };\n  const o = s.buffer, a = fr(new Uint8Array(o, t + 12, 16));\n  let l = null, c = null, u = 0;\n  if (i === 0)\n    u = 28;\n  else {\n    const h = s.getUint32(28);\n    if (!h || r < 32 + h * 16)\n      return {\n        offset: t,\n        size: e\n      };\n    l = [];\n    for (let f = 0; f < h; f++)\n      l.push(new Uint8Array(o, t + 32 + f * 16, 16));\n    u = 32 + h * 16;\n  }\n  if (!u)\n    return {\n      offset: t,\n      size: e\n    };\n  const d = s.getUint32(u);\n  return e - 32 < d ? {\n    offset: t,\n    size: e\n  } : (c = new Uint8Array(o, t + u + 4, d), {\n    version: i,\n    systemId: a,\n    kids: l,\n    data: c,\n    offset: t,\n    size: e\n  });\n}\nconst Og = () => /\\(Windows.+Firefox\\//i.test(navigator.userAgent), Fn = {\n  audio: {\n    a3ds: 1,\n    \"ac-3\": 0.95,\n    \"ac-4\": 1,\n    alac: 0.9,\n    alaw: 1,\n    dra1: 1,\n    \"dts+\": 1,\n    \"dts-\": 1,\n    dtsc: 1,\n    dtse: 1,\n    dtsh: 1,\n    \"ec-3\": 0.9,\n    enca: 1,\n    fLaC: 0.9,\n    // MP4-RA listed codec entry for FLAC\n    flac: 0.9,\n    // legacy browser codec name for FLAC\n    FLAC: 0.9,\n    // some manifests may list \"FLAC\" with Apple's tools\n    g719: 1,\n    g726: 1,\n    m4ae: 1,\n    mha1: 1,\n    mha2: 1,\n    mhm1: 1,\n    mhm2: 1,\n    mlpa: 1,\n    mp4a: 1,\n    \"raw \": 1,\n    Opus: 1,\n    opus: 1,\n    // browsers expect this to be lowercase despite MP4RA says 'Opus'\n    samr: 1,\n    sawb: 1,\n    sawp: 1,\n    sevc: 1,\n    sqcp: 1,\n    ssmv: 1,\n    twos: 1,\n    ulaw: 1\n  },\n  video: {\n    avc1: 1,\n    avc2: 1,\n    avc3: 1,\n    avc4: 1,\n    avcp: 1,\n    av01: 0.8,\n    dav1: 0.8,\n    drac: 1,\n    dva1: 1,\n    dvav: 1,\n    dvh1: 0.7,\n    dvhe: 0.7,\n    encv: 1,\n    hev1: 0.75,\n    hvc1: 0.75,\n    mjp2: 1,\n    mp4v: 1,\n    mvc1: 1,\n    mvc2: 1,\n    mvc3: 1,\n    mvc4: 1,\n    resv: 1,\n    rv60: 1,\n    s263: 1,\n    svc1: 1,\n    svc2: 1,\n    \"vc-1\": 1,\n    vp08: 1,\n    vp09: 0.9\n  },\n  text: {\n    stpp: 1,\n    wvtt: 1\n  }\n};\nfunction pu(s, e) {\n  const t = Fn[e];\n  return !!t && !!t[s.slice(0, 4)];\n}\nfunction gi(s, e, t = !0) {\n  return !s.split(\",\").some((r) => !mu(r, e, t));\n}\nfunction mu(s, e, t = !0) {\n  var r;\n  const n = Ms(t);\n  return (r = n == null ? void 0 : n.isTypeSupported(pi(s, e))) != null ? r : !1;\n}\nfunction pi(s, e) {\n  return `${e}/mp4;codecs=${s}`;\n}\nfunction sh(s) {\n  if (s) {\n    const e = s.substring(0, 4);\n    return Fn.video[e];\n  }\n  return 2;\n}\nfunction Zo(s) {\n  const e = Og();\n  return s.split(\",\").reduce((t, r) => {\n    const i = e && ya(r) ? 9 : Fn.video[r];\n    return i ? (i * 2 + t) / (t ? 3 : 2) : (Fn.audio[r] + t) / (t ? 2 : 1);\n  }, 0);\n}\nconst hl = {};\nfunction YS(s, e = !0) {\n  if (hl[s])\n    return hl[s];\n  const t = {\n    // Idealy fLaC and Opus would be first (spec-compliant) but\n    // some browsers will report that fLaC is supported then fail.\n    // see: https://bugs.chromium.org/p/chromium/issues/detail?id=1422728\n    flac: [\"flac\", \"fLaC\", \"FLAC\"],\n    opus: [\"opus\", \"Opus\"],\n    // Replace audio codec info if browser does not support mp4a.40.34,\n    // and demuxer can fallback to 'audio/mpeg' or 'audio/mp4;codecs=\"mp3\"'\n    \"mp4a.40.34\": [\"mp3\"]\n  }[s];\n  for (let n = 0; n < t.length; n++) {\n    var r;\n    if (mu(t[n], \"audio\", e))\n      return hl[s] = t[n], t[n];\n    if (t[n] === \"mp3\" && (r = Ms(e)) != null && r.isTypeSupported(\"audio/mpeg\"))\n      return \"\";\n  }\n  return s;\n}\nconst ZS = /flac|opus|mp4a\\.40\\.34/i;\nfunction Xo(s, e = !0) {\n  return s.replace(ZS, (t) => YS(t.toLowerCase(), e));\n}\nfunction XS(s, e) {\n  const t = [];\n  if (s) {\n    const r = s.split(\",\");\n    for (let n = 0; n < r.length; n++)\n      pu(r[n], \"video\") || t.push(r[n]);\n  }\n  return e && t.push(e), t.join(\",\");\n}\nfunction fo(s, e) {\n  if (s && (s.length > 4 || [\"ac-3\", \"ec-3\", \"alac\", \"fLaC\", \"Opus\"].indexOf(s) !== -1) && (nh(s, \"audio\") || nh(s, \"video\")))\n    return s;\n  if (e) {\n    const t = e.split(\",\");\n    if (t.length > 1) {\n      if (s) {\n        for (let r = t.length; r--; )\n          if (t[r].substring(0, 4) === s.substring(0, 4))\n            return t[r];\n      }\n      return t[0];\n    }\n  }\n  return e || s;\n}\nfunction nh(s, e) {\n  return pu(s, e) && mu(s, e);\n}\nfunction JS(s) {\n  const e = s.split(\",\");\n  for (let t = 0; t < e.length; t++) {\n    const r = e[t].split(\".\");\n    r.length > 2 && r[0] === \"avc1\" && (e[t] = `avc1.${parseInt(r[1]).toString(16)}${(\"000\" + parseInt(r[2]).toString(16)).slice(-4)}`);\n  }\n  return e.join(\",\");\n}\nfunction QS(s) {\n  if (s.startsWith(\"av01.\")) {\n    const e = s.split(\".\"), t = [\"0\", \"111\", \"01\", \"01\", \"01\", \"0\"];\n    for (let r = e.length; r > 4 && r < 10; r++)\n      e[r] = t[r - 4];\n    return e.join(\".\");\n  }\n  return s;\n}\nfunction ih(s) {\n  const e = Ms(s) || {\n    isTypeSupported: () => !1\n  };\n  return {\n    mpeg: e.isTypeSupported(\"audio/mpeg\"),\n    mp3: e.isTypeSupported('audio/mp4; codecs=\"mp3\"'),\n    ac3: e.isTypeSupported('audio/mp4; codecs=\"ac-3\"')\n  };\n}\nfunction lc(s) {\n  return s.replace(/^.+codecs=[\"']?([^\"']+).*$/, \"$1\");\n}\nconst eb = {\n  supported: !0,\n  powerEfficient: !0,\n  smooth: !0\n  // keySystemAccess: null,\n}, tb = {\n  supported: !1,\n  smooth: !1,\n  powerEfficient: !1\n  // keySystemAccess: null,\n}, Bg = {\n  supported: !0,\n  configurations: [],\n  decodingInfoResults: [eb]\n};\nfunction Fg(s, e) {\n  return {\n    supported: !1,\n    configurations: e,\n    decodingInfoResults: [tb],\n    error: s\n  };\n}\nfunction rb(s, e, t, r, n, i) {\n  const o = s.videoCodec, a = s.audioCodec ? s.audioGroups : null, l = i == null ? void 0 : i.audioCodec, c = i == null ? void 0 : i.channels, u = c ? parseInt(c) : l ? 1 / 0 : 2;\n  let d = null;\n  if (a != null && a.length)\n    try {\n      a.length === 1 && a[0] ? d = e.groups[a[0]].channels : d = a.reduce((h, f) => {\n        if (f) {\n          const p = e.groups[f];\n          if (!p)\n            throw new Error(`Audio track group ${f} not found`);\n          Object.keys(p.channels).forEach((y) => {\n            h[y] = (h[y] || 0) + p.channels[y];\n          });\n        }\n        return h;\n      }, {\n        2: 0\n      });\n    } catch {\n      return !0;\n    }\n  return o !== void 0 && // Force media capabilities check for HEVC to avoid failure on Windows\n  (o.split(\",\").some((h) => ya(h)) || s.width > 1920 && s.height > 1088 || s.height > 1920 && s.width > 1088 || s.frameRate > Math.max(r, 30) || s.videoRange !== \"SDR\" && s.videoRange !== t || s.bitrate > Math.max(n, 8e6)) || !!d && ue(u) && Object.keys(d).some((h) => parseInt(h) > u);\n}\nfunction Ng(s, e, t, r = {}) {\n  const n = s.videoCodec;\n  if (!n && !s.audioCodec || !t)\n    return Promise.resolve(Bg);\n  const i = [], o = sb(s), a = o.length, l = nb(s, e, a > 0), c = l.length;\n  for (let u = a || 1 * c || 1; u--; ) {\n    const d = {\n      type: \"media-source\"\n    };\n    if (a && (d.video = o[u % a]), c) {\n      d.audio = l[u % c];\n      const h = d.audio.bitrate;\n      d.video && h && (d.video.bitrate -= h);\n    }\n    i.push(d);\n  }\n  if (n) {\n    const u = navigator.userAgent;\n    if (n.split(\",\").some((d) => ya(d)) && Og())\n      return Promise.resolve(Fg(new Error(`Overriding Windows Firefox HEVC MediaCapabilities result based on user-agent string: (${u})`), i));\n  }\n  return Promise.all(i.map((u) => {\n    const d = ob(u);\n    return r[d] || (r[d] = t.decodingInfo(u));\n  })).then((u) => ({\n    supported: !u.some((d) => !d.supported),\n    configurations: i,\n    decodingInfoResults: u\n  })).catch((u) => ({\n    supported: !1,\n    configurations: i,\n    decodingInfoResults: [],\n    error: u\n  }));\n}\nfunction sb(s) {\n  var e;\n  const t = (e = s.videoCodec) == null ? void 0 : e.split(\",\"), r = Ug(s), n = s.width || 640, i = s.height || 480, o = s.frameRate || 30, a = s.videoRange.toLowerCase();\n  return t ? t.map((l) => {\n    const c = {\n      contentType: pi(QS(l), \"video\"),\n      width: n,\n      height: i,\n      bitrate: r,\n      framerate: o\n    };\n    return a !== \"sdr\" && (c.transferFunction = a), c;\n  }) : [];\n}\nfunction nb(s, e, t) {\n  var r;\n  const n = (r = s.audioCodec) == null ? void 0 : r.split(\",\"), i = Ug(s);\n  return n && s.audioGroups ? s.audioGroups.reduce((o, a) => {\n    var l;\n    const c = a ? (l = e.groups[a]) == null ? void 0 : l.tracks : null;\n    return c ? c.reduce((u, d) => {\n      if (d.groupId === a) {\n        const h = parseFloat(d.channels || \"\");\n        n.forEach((f) => {\n          const p = {\n            contentType: pi(f, \"audio\"),\n            bitrate: t ? ib(f, i) : i\n          };\n          h && (p.channels = \"\" + h), u.push(p);\n        });\n      }\n      return u;\n    }, o) : o;\n  }, []) : [];\n}\nfunction ib(s, e) {\n  if (e <= 1)\n    return 1;\n  let t = 128e3;\n  return s === \"ec-3\" ? t = 768e3 : s === \"ac-3\" && (t = 64e4), Math.min(e / 2, t);\n}\nfunction Ug(s) {\n  return Math.ceil(Math.max(s.bitrate * 0.9, s.averageBitrate) / 1e3) * 1e3 || 1;\n}\nfunction ob(s) {\n  let e = \"\";\n  const {\n    audio: t,\n    video: r\n  } = s;\n  if (r) {\n    const n = lc(r.contentType);\n    e += `${n}_r${r.height}x${r.width}f${Math.ceil(r.framerate)}${r.transferFunction || \"sd\"}_${Math.ceil(r.bitrate / 1e5)}`;\n  }\n  if (t) {\n    const n = lc(t.contentType);\n    e += `${r ? \"_\" : \"\"}${n}_c${t.channels}`;\n  }\n  return e;\n}\nconst cc = [\"NONE\", \"TYPE-0\", \"TYPE-1\", null];\nfunction ab(s) {\n  return cc.indexOf(s) > -1;\n}\nconst Jo = [\"SDR\", \"PQ\", \"HLG\"];\nfunction lb(s) {\n  return !!s && Jo.indexOf(s) > -1;\n}\nvar go = {\n  No: \"\",\n  Yes: \"YES\",\n  v2: \"v2\"\n};\nfunction oh(s) {\n  const {\n    canSkipUntil: e,\n    canSkipDateRanges: t,\n    age: r\n  } = s, n = r < e / 2;\n  return e && n ? t ? go.v2 : go.Yes : go.No;\n}\nclass ah {\n  constructor(e, t, r) {\n    this.msn = void 0, this.part = void 0, this.skip = void 0, this.msn = e, this.part = t, this.skip = r;\n  }\n  addDirectives(e) {\n    const t = new self.URL(e);\n    return this.msn !== void 0 && t.searchParams.set(\"_HLS_msn\", this.msn.toString()), this.part !== void 0 && t.searchParams.set(\"_HLS_part\", this.part.toString()), this.skip && t.searchParams.set(\"_HLS_skip\", this.skip), t.href;\n  }\n}\nclass mi {\n  constructor(e) {\n    if (this._attrs = void 0, this.audioCodec = void 0, this.bitrate = void 0, this.codecSet = void 0, this.url = void 0, this.frameRate = void 0, this.height = void 0, this.id = void 0, this.name = void 0, this.supplemental = void 0, this.videoCodec = void 0, this.width = void 0, this.details = void 0, this.fragmentError = 0, this.loadError = 0, this.loaded = void 0, this.realBitrate = 0, this.supportedPromise = void 0, this.supportedResult = void 0, this._avgBitrate = 0, this._audioGroups = void 0, this._subtitleGroups = void 0, this._urlId = 0, this.url = [e.url], this._attrs = [e.attrs], this.bitrate = e.bitrate, e.details && (this.details = e.details), this.id = e.id || 0, this.name = e.name, this.width = e.width || 0, this.height = e.height || 0, this.frameRate = e.attrs.optionalFloat(\"FRAME-RATE\", 0), this._avgBitrate = e.attrs.decimalInteger(\"AVERAGE-BANDWIDTH\"), this.audioCodec = e.audioCodec, this.videoCodec = e.videoCodec, this.codecSet = [e.videoCodec, e.audioCodec].filter((r) => !!r).map((r) => r.substring(0, 4)).join(\",\"), \"supplemental\" in e) {\n      var t;\n      this.supplemental = e.supplemental;\n      const r = (t = e.supplemental) == null ? void 0 : t.videoCodec;\n      r && r !== e.videoCodec && (this.codecSet += `,${r.substring(0, 4)}`);\n    }\n    this.addGroupId(\"audio\", e.attrs.AUDIO), this.addGroupId(\"text\", e.attrs.SUBTITLES);\n  }\n  get maxBitrate() {\n    return Math.max(this.realBitrate, this.bitrate);\n  }\n  get averageBitrate() {\n    return this._avgBitrate || this.realBitrate || this.bitrate;\n  }\n  get attrs() {\n    return this._attrs[0];\n  }\n  get codecs() {\n    return this.attrs.CODECS || \"\";\n  }\n  get pathwayId() {\n    return this.attrs[\"PATHWAY-ID\"] || \".\";\n  }\n  get videoRange() {\n    return this.attrs[\"VIDEO-RANGE\"] || \"SDR\";\n  }\n  get score() {\n    return this.attrs.optionalFloat(\"SCORE\", 0);\n  }\n  get uri() {\n    return this.url[0] || \"\";\n  }\n  hasAudioGroup(e) {\n    return lh(this._audioGroups, e);\n  }\n  hasSubtitleGroup(e) {\n    return lh(this._subtitleGroups, e);\n  }\n  get audioGroups() {\n    return this._audioGroups;\n  }\n  get subtitleGroups() {\n    return this._subtitleGroups;\n  }\n  addGroupId(e, t) {\n    if (t) {\n      if (e === \"audio\") {\n        let r = this._audioGroups;\n        r || (r = this._audioGroups = []), r.indexOf(t) === -1 && r.push(t);\n      } else if (e === \"text\") {\n        let r = this._subtitleGroups;\n        r || (r = this._subtitleGroups = []), r.indexOf(t) === -1 && r.push(t);\n      }\n    }\n  }\n  // Deprecated methods (retained for backwards compatibility)\n  get urlId() {\n    return 0;\n  }\n  set urlId(e) {\n  }\n  get audioGroupIds() {\n    return this.audioGroups ? [this.audioGroupId] : void 0;\n  }\n  get textGroupIds() {\n    return this.subtitleGroups ? [this.textGroupId] : void 0;\n  }\n  get audioGroupId() {\n    var e;\n    return (e = this.audioGroups) == null ? void 0 : e[0];\n  }\n  get textGroupId() {\n    var e;\n    return (e = this.subtitleGroups) == null ? void 0 : e[0];\n  }\n  addFallback() {\n  }\n}\nfunction lh(s, e) {\n  return !e || !s ? !1 : s.indexOf(e) !== -1;\n}\nfunction cb() {\n  if (typeof matchMedia == \"function\") {\n    const s = matchMedia(\"(dynamic-range: high)\"), e = matchMedia(\"bad query\");\n    if (s.media !== e.media)\n      return s.matches === !0;\n  }\n  return !1;\n}\nfunction ub(s, e) {\n  let t = !1, r = [];\n  if (s && (t = s !== \"SDR\", r = [s]), e) {\n    r = e.allowedVideoRanges || Jo.slice(0);\n    const n = r.join(\"\") !== \"SDR\" && !e.videoCodec;\n    t = e.preferHDR !== void 0 ? e.preferHDR : n && cb(), t || (r = [\"SDR\"]);\n  }\n  return {\n    preferHDR: t,\n    allowedVideoRanges: r\n  };\n}\nconst db = (s) => {\n  const e = /* @__PURE__ */ new WeakSet();\n  return (t, r) => {\n    if (s && (r = s(t, r)), typeof r == \"object\" && r !== null) {\n      if (e.has(r))\n        return;\n      e.add(r);\n    }\n    return r;\n  };\n}, at = (s, e) => JSON.stringify(s, db(e));\nfunction hb(s, e, t, r, n) {\n  const i = Object.keys(s), o = r == null ? void 0 : r.channels, a = r == null ? void 0 : r.audioCodec, l = n == null ? void 0 : n.videoCodec, c = o && parseInt(o) === 2;\n  let u = !1, d = !1, h = 1 / 0, f = 1 / 0, p = 1 / 0, y = 1 / 0, E = 0, b = [];\n  const {\n    preferHDR: R,\n    allowedVideoRanges: A\n  } = ub(e, n);\n  for (let j = i.length; j--; ) {\n    const C = s[i[j]];\n    u || (u = C.channels[2] > 0), h = Math.min(h, C.minHeight), f = Math.min(f, C.minFramerate), p = Math.min(p, C.minBitrate), A.filter(($) => C.videoRanges[$] > 0).length > 0 && (d = !0);\n  }\n  h = ue(h) ? h : 0, f = ue(f) ? f : 0;\n  const F = Math.max(1080, h), M = Math.max(30, f);\n  p = ue(p) ? p : t, t = Math.max(p, t), d || (e = void 0);\n  const H = i.length > 1;\n  return {\n    codecSet: i.reduce((j, C) => {\n      const k = s[C];\n      if (C === j)\n        return j;\n      if (b = d ? A.filter(($) => k.videoRanges[$] > 0) : [], H) {\n        if (k.minBitrate > t)\n          return Ur(C, `min bitrate of ${k.minBitrate} > current estimate of ${t}`), j;\n        if (!k.hasDefaultAudio)\n          return Ur(C, \"no renditions with default or auto-select sound found\"), j;\n        if (a && C.indexOf(a.substring(0, 4)) % 5 !== 0)\n          return Ur(C, `audio codec preference \"${a}\" not found`), j;\n        if (o && !c) {\n          if (!k.channels[o])\n            return Ur(C, `no renditions with ${o} channel sound found (channels options: ${Object.keys(k.channels)})`), j;\n        } else if ((!a || c) && u && k.channels[2] === 0)\n          return Ur(C, \"no renditions with stereo sound found\"), j;\n        if (k.minHeight > F)\n          return Ur(C, `min resolution of ${k.minHeight} > maximum of ${F}`), j;\n        if (k.minFramerate > M)\n          return Ur(C, `min framerate of ${k.minFramerate} > maximum of ${M}`), j;\n        if (!b.some(($) => k.videoRanges[$] > 0))\n          return Ur(C, `no variants with VIDEO-RANGE of ${at(b)} found`), j;\n        if (l && C.indexOf(l.substring(0, 4)) % 5 !== 0)\n          return Ur(C, `video codec preference \"${l}\" not found`), j;\n        if (k.maxScore < E)\n          return Ur(C, `max score of ${k.maxScore} < selected max of ${E}`), j;\n      }\n      return j && (Zo(C) >= Zo(j) || k.fragmentError > s[j].fragmentError) ? j : (y = k.minIndex, E = k.maxScore, C);\n    }, void 0),\n    videoRanges: b,\n    preferHDR: R,\n    minFramerate: f,\n    minBitrate: p,\n    minIndex: y\n  };\n}\nfunction Ur(s, e) {\n  rt.log(`[abr] start candidates with \"${s}\" ignored because ${e}`);\n}\nfunction $g(s) {\n  return s.reduce((e, t) => {\n    let r = e.groups[t.groupId];\n    r || (r = e.groups[t.groupId] = {\n      tracks: [],\n      channels: {\n        2: 0\n      },\n      hasDefault: !1,\n      hasAutoSelect: !1\n    }), r.tracks.push(t);\n    const n = t.channels || \"2\";\n    return r.channels[n] = (r.channels[n] || 0) + 1, r.hasDefault = r.hasDefault || t.default, r.hasAutoSelect = r.hasAutoSelect || t.autoselect, r.hasDefault && (e.hasDefaultAudio = !0), r.hasAutoSelect && (e.hasAutoSelectAudio = !0), e;\n  }, {\n    hasDefaultAudio: !1,\n    hasAutoSelectAudio: !1,\n    groups: {}\n  });\n}\nfunction fb(s, e, t, r) {\n  return s.slice(t, r + 1).reduce((n, i, o) => {\n    if (!i.codecSet)\n      return n;\n    const a = i.audioGroups;\n    let l = n[i.codecSet];\n    l || (n[i.codecSet] = l = {\n      minBitrate: 1 / 0,\n      minHeight: 1 / 0,\n      minFramerate: 1 / 0,\n      minIndex: o,\n      maxScore: 0,\n      videoRanges: {\n        SDR: 0\n      },\n      channels: {\n        2: 0\n      },\n      hasDefaultAudio: !a,\n      fragmentError: 0\n    }), l.minBitrate = Math.min(l.minBitrate, i.bitrate);\n    const c = Math.min(i.height, i.width);\n    return l.minHeight = Math.min(l.minHeight, c), l.minFramerate = Math.min(l.minFramerate, i.frameRate), l.minIndex = Math.min(l.minIndex, o), l.maxScore = Math.max(l.maxScore, i.score), l.fragmentError += i.fragmentError, l.videoRanges[i.videoRange] = (l.videoRanges[i.videoRange] || 0) + 1, a && a.forEach((u) => {\n      if (!u)\n        return;\n      const d = e.groups[u];\n      d && (l.hasDefaultAudio = l.hasDefaultAudio || e.hasDefaultAudio ? d.hasDefault : d.hasAutoSelect || !e.hasDefaultAudio && !e.hasAutoSelectAudio, Object.keys(d.channels).forEach((h) => {\n        l.channels[h] = (l.channels[h] || 0) + d.channels[h];\n      }));\n    }), n;\n  }, {});\n}\nfunction ch(s) {\n  if (!s)\n    return s;\n  const {\n    lang: e,\n    assocLang: t,\n    characteristics: r,\n    channels: n,\n    audioCodec: i\n  } = s;\n  return {\n    lang: e,\n    assocLang: t,\n    characteristics: r,\n    channels: n,\n    audioCodec: i\n  };\n}\nfunction Wr(s, e, t) {\n  if (\"attrs\" in s) {\n    const r = e.indexOf(s);\n    if (r !== -1)\n      return r;\n  }\n  for (let r = 0; r < e.length; r++) {\n    const n = e[r];\n    if (qs(s, n, t))\n      return r;\n  }\n  return -1;\n}\nfunction qs(s, e, t) {\n  const {\n    groupId: r,\n    name: n,\n    lang: i,\n    assocLang: o,\n    default: a\n  } = s, l = s.forced;\n  return (r === void 0 || e.groupId === r) && (n === void 0 || e.name === n) && (i === void 0 || gb(i, e.lang)) && (i === void 0 || e.assocLang === o) && (a === void 0 || e.default === a) && (l === void 0 || e.forced === l) && (!(\"characteristics\" in s) || pb(s.characteristics || \"\", e.characteristics)) && (t === void 0 || t(s, e));\n}\nfunction gb(s, e = \"--\") {\n  return s.length === e.length ? s === e : s.startsWith(e) || e.startsWith(s);\n}\nfunction pb(s, e = \"\") {\n  const t = s.split(\",\"), r = e.split(\",\");\n  return t.length === r.length && !t.some((n) => r.indexOf(n) === -1);\n}\nfunction Us(s, e) {\n  const {\n    audioCodec: t,\n    channels: r\n  } = s;\n  return (t === void 0 || (e.audioCodec || \"\").substring(0, 4) === t.substring(0, 4)) && (r === void 0 || r === (e.channels || \"2\"));\n}\nfunction mb(s, e, t, r, n) {\n  const i = e[r], a = e.reduce((h, f, p) => {\n    const y = f.uri;\n    return (h[y] || (h[y] = [])).push(p), h;\n  }, {})[i.uri];\n  a.length > 1 && (r = Math.max.apply(Math, a));\n  const l = i.videoRange, c = i.frameRate, u = i.codecSet.substring(0, 4), d = uh(e, r, (h) => {\n    if (h.videoRange !== l || h.frameRate !== c || h.codecSet.substring(0, 4) !== u)\n      return !1;\n    const f = h.audioGroups, p = t.filter((y) => !f || f.indexOf(y.groupId) !== -1);\n    return Wr(s, p, n) > -1;\n  });\n  return d > -1 ? d : uh(e, r, (h) => {\n    const f = h.audioGroups, p = t.filter((y) => !f || f.indexOf(y.groupId) !== -1);\n    return Wr(s, p, n) > -1;\n  });\n}\nfunction uh(s, e, t) {\n  for (let r = e; r > -1; r--)\n    if (t(s[r]))\n      return r;\n  for (let r = e + 1; r < s.length; r++)\n    if (t(s[r]))\n      return r;\n  return -1;\n}\nfunction Qo(s, e) {\n  var t;\n  return !!s && s !== ((t = e.loadLevelObj) == null ? void 0 : t.uri);\n}\nclass yb extends Lr {\n  constructor(e) {\n    super(\"abr\", e.logger), this.hls = void 0, this.lastLevelLoadSec = 0, this.lastLoadedFragLevel = -1, this.firstSelection = -1, this._nextAutoLevel = -1, this.nextAutoLevelKey = \"\", this.audioTracksByGroup = null, this.codecTiers = null, this.timer = -1, this.fragCurrent = null, this.partCurrent = null, this.bitrateTestDelay = 0, this.rebufferNotice = -1, this.supportedCache = {}, this.bwEstimator = void 0, this._abandonRulesCheck = (t) => {\n      var r;\n      const {\n        fragCurrent: n,\n        partCurrent: i,\n        hls: o\n      } = this, {\n        autoLevelEnabled: a,\n        media: l\n      } = o;\n      if (!n || !l)\n        return;\n      const c = performance.now(), u = i ? i.stats : n.stats, d = i ? i.duration : n.duration, h = c - u.loading.start, f = o.minAutoLevel, p = n.level, y = this._nextAutoLevel;\n      if (u.aborted || u.loaded && u.loaded === u.total || p <= f) {\n        this.clearTimer(), this._nextAutoLevel = -1;\n        return;\n      }\n      if (!a)\n        return;\n      const E = y > -1 && y !== p, b = !!t || E;\n      if (!b && (l.paused || !l.playbackRate || !l.readyState))\n        return;\n      const R = o.mainForwardBufferInfo;\n      if (!b && R === null)\n        return;\n      const A = this.bwEstimator.getEstimateTTFB(), F = Math.abs(l.playbackRate);\n      if (h <= Math.max(A, 1e3 * (d / (F * 2))))\n        return;\n      const M = R ? R.len / F : 0, H = u.loading.first ? u.loading.first - u.loading.start : -1, K = u.loaded && H > -1, j = this.getBwEstimate(), C = o.levels, k = C[p], $ = Math.max(u.loaded, Math.round(d * (n.bitrate || k.averageBitrate) / 8));\n      let W = K ? h - H : h;\n      W < 1 && K && (W = Math.min(h, u.loaded * 8 / j));\n      const _ = K ? u.loaded * 1e3 / W : 0, g = A / 1e3, x = _ ? ($ - u.loaded) / _ : $ * 8 / j + g;\n      if (x <= M)\n        return;\n      const w = _ ? _ * 8 : j, D = ((r = (t == null ? void 0 : t.details) || this.hls.latestLevelDetails) == null ? void 0 : r.live) === !0, O = this.hls.config.abrBandWidthUpFactor;\n      let U = Number.POSITIVE_INFINITY, V;\n      for (V = p - 1; V > f; V--) {\n        const P = C[V].maxBitrate, N = !C[V].details || D;\n        if (U = this.getTimeToLoadFrag(g, w, d * P, N), U < Math.min(M, d + g))\n          break;\n      }\n      if (U >= x || U > d * 10)\n        return;\n      K ? this.bwEstimator.sample(h - Math.min(A, H), u.loaded) : this.bwEstimator.sampleTTFB(h);\n      const L = C[V].maxBitrate;\n      this.getBwEstimate() * O > L && this.resetEstimator(L);\n      const m = this.findBestLevel(L, f, V, 0, M, 1, 1);\n      m > -1 && (V = m), this.warn(`Fragment ${n.sn}${i ? \" part \" + i.index : \"\"} of level ${p} is loading too slowly;\n      Fragment duration: ${n.duration.toFixed(3)}\n      Time to underbuffer: ${M.toFixed(3)} s\n      Estimated load time for current fragment: ${x.toFixed(3)} s\n      Estimated load time for down switch fragment: ${U.toFixed(3)} s\n      TTFB estimate: ${H | 0} ms\n      Current BW estimate: ${ue(j) ? j | 0 : \"Unknown\"} bps\n      New BW estimate: ${this.getBwEstimate() | 0} bps\n      Switching to level ${V} @ ${L | 0} bps`), o.nextLoadLevel = o.nextAutoLevel = V, this.clearTimer();\n      const v = () => {\n        if (this.clearTimer(), this.fragCurrent === n && this.hls.loadLevel === V && V > 0) {\n          const P = this.getStarvationDelay();\n          if (this.warn(`Aborting inflight request ${V > 0 ? \"and switching down\" : \"\"}\n      Fragment duration: ${n.duration.toFixed(3)} s\n      Time to underbuffer: ${P.toFixed(3)} s`), n.abortRequests(), this.fragCurrent = this.partCurrent = null, V > f) {\n            let N = this.findBestLevel(this.hls.levels[f].bitrate, f, V, 0, P, 1, 1);\n            N === -1 && (N = f), this.hls.nextLoadLevel = this.hls.nextAutoLevel = N, this.resetEstimator(this.hls.levels[N].bitrate);\n          }\n        }\n      };\n      E || x > U * 2 ? v() : this.timer = self.setInterval(v, U * 1e3), o.trigger(I.FRAG_LOAD_EMERGENCY_ABORTED, {\n        frag: n,\n        part: i,\n        stats: u\n      });\n    }, this.hls = e, this.bwEstimator = this.initEstimator(), this.registerListeners();\n  }\n  resetEstimator(e) {\n    e && (this.log(`setting initial bwe to ${e}`), this.hls.config.abrEwmaDefaultEstimate = e), this.firstSelection = -1, this.bwEstimator = this.initEstimator();\n  }\n  initEstimator() {\n    const e = this.hls.config;\n    return new TS(e.abrEwmaSlowVoD, e.abrEwmaFastVoD, e.abrEwmaDefaultEstimate);\n  }\n  registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.FRAG_LOADING, this.onFragLoading, this), e.on(I.FRAG_LOADED, this.onFragLoaded, this), e.on(I.FRAG_BUFFERED, this.onFragBuffered, this), e.on(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.on(I.LEVEL_LOADED, this.onLevelLoaded, this), e.on(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.on(I.MAX_AUTO_LEVEL_UPDATED, this.onMaxAutoLevelUpdated, this), e.on(I.ERROR, this.onError, this);\n  }\n  unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e && (e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.FRAG_LOADING, this.onFragLoading, this), e.off(I.FRAG_LOADED, this.onFragLoaded, this), e.off(I.FRAG_BUFFERED, this.onFragBuffered, this), e.off(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.off(I.LEVEL_LOADED, this.onLevelLoaded, this), e.off(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.off(I.MAX_AUTO_LEVEL_UPDATED, this.onMaxAutoLevelUpdated, this), e.off(I.ERROR, this.onError, this));\n  }\n  destroy() {\n    this.unregisterListeners(), this.clearTimer(), this.hls = this._abandonRulesCheck = this.supportedCache = null, this.fragCurrent = this.partCurrent = null;\n  }\n  onManifestLoading(e, t) {\n    this.lastLoadedFragLevel = -1, this.firstSelection = -1, this.lastLevelLoadSec = 0, this.supportedCache = {}, this.fragCurrent = this.partCurrent = null, this.onLevelsUpdated(), this.clearTimer();\n  }\n  onLevelsUpdated() {\n    this.lastLoadedFragLevel > -1 && this.fragCurrent && (this.lastLoadedFragLevel = this.fragCurrent.level), this._nextAutoLevel = -1, this.onMaxAutoLevelUpdated(), this.codecTiers = null, this.audioTracksByGroup = null;\n  }\n  onMaxAutoLevelUpdated() {\n    this.firstSelection = -1, this.nextAutoLevelKey = \"\";\n  }\n  onFragLoading(e, t) {\n    const r = t.frag;\n    if (!this.ignoreFragment(r)) {\n      if (!r.bitrateTest) {\n        var n;\n        this.fragCurrent = r, this.partCurrent = (n = t.part) != null ? n : null;\n      }\n      this.clearTimer(), this.timer = self.setInterval(this._abandonRulesCheck, 100);\n    }\n  }\n  onLevelSwitching(e, t) {\n    this.clearTimer();\n  }\n  onError(e, t) {\n    if (!t.fatal)\n      switch (t.details) {\n        case J.BUFFER_ADD_CODEC_ERROR:\n        case J.BUFFER_APPEND_ERROR:\n          this.lastLoadedFragLevel = -1, this.firstSelection = -1;\n          break;\n        case J.FRAG_LOAD_TIMEOUT: {\n          const r = t.frag, {\n            fragCurrent: n,\n            partCurrent: i\n          } = this;\n          if (r && n && r.sn === n.sn && r.level === n.level) {\n            const o = performance.now(), a = i ? i.stats : r.stats, l = o - a.loading.start, c = a.loading.first ? a.loading.first - a.loading.start : -1;\n            if (a.loaded && c > -1) {\n              const d = this.bwEstimator.getEstimateTTFB();\n              this.bwEstimator.sample(l - Math.min(d, c), a.loaded);\n            } else\n              this.bwEstimator.sampleTTFB(l);\n          }\n          break;\n        }\n      }\n  }\n  getTimeToLoadFrag(e, t, r, n) {\n    const i = e + r / t, o = n ? e + this.lastLevelLoadSec : 0;\n    return i + o;\n  }\n  onLevelLoaded(e, t) {\n    const r = this.hls.config, {\n      loading: n\n    } = t.stats, i = n.end - n.first;\n    ue(i) && (this.lastLevelLoadSec = i / 1e3), t.details.live ? this.bwEstimator.update(r.abrEwmaSlowLive, r.abrEwmaFastLive) : this.bwEstimator.update(r.abrEwmaSlowVoD, r.abrEwmaFastVoD), this.timer > -1 && this._abandonRulesCheck(t.levelInfo);\n  }\n  onFragLoaded(e, {\n    frag: t,\n    part: r\n  }) {\n    const n = r ? r.stats : t.stats;\n    if (t.type === pe.MAIN && this.bwEstimator.sampleTTFB(n.loading.first - n.loading.start), !this.ignoreFragment(t)) {\n      if (this.clearTimer(), t.level === this._nextAutoLevel && (this._nextAutoLevel = -1), this.firstSelection = -1, this.hls.config.abrMaxWithRealBitrate) {\n        const i = r ? r.duration : t.duration, o = this.hls.levels[t.level], a = (o.loaded ? o.loaded.bytes : 0) + n.loaded, l = (o.loaded ? o.loaded.duration : 0) + i;\n        o.loaded = {\n          bytes: a,\n          duration: l\n        }, o.realBitrate = Math.round(8 * a / l);\n      }\n      if (t.bitrateTest) {\n        const i = {\n          stats: n,\n          frag: t,\n          part: r,\n          id: t.type\n        };\n        this.onFragBuffered(I.FRAG_BUFFERED, i), t.bitrateTest = !1;\n      } else\n        this.lastLoadedFragLevel = t.level;\n    }\n  }\n  onFragBuffered(e, t) {\n    const {\n      frag: r,\n      part: n\n    } = t, i = n != null && n.stats.loaded ? n.stats : r.stats;\n    if (i.aborted || this.ignoreFragment(r))\n      return;\n    const o = i.parsing.end - i.loading.start - Math.min(i.loading.first - i.loading.start, this.bwEstimator.getEstimateTTFB());\n    this.bwEstimator.sample(o, i.loaded), i.bwEstimate = this.getBwEstimate(), r.bitrateTest ? this.bitrateTestDelay = o / 1e3 : this.bitrateTestDelay = 0;\n  }\n  ignoreFragment(e) {\n    return e.type !== pe.MAIN || e.sn === \"initSegment\";\n  }\n  clearTimer() {\n    this.timer > -1 && (self.clearInterval(this.timer), this.timer = -1);\n  }\n  get firstAutoLevel() {\n    const {\n      maxAutoLevel: e,\n      minAutoLevel: t\n    } = this.hls, r = this.getBwEstimate(), n = this.hls.config.maxStarvationDelay, i = this.findBestLevel(r, t, e, 0, n, 1, 1);\n    if (i > -1)\n      return i;\n    const o = this.hls.firstLevel, a = Math.min(Math.max(o, t), e);\n    return this.warn(`Could not find best starting auto level. Defaulting to first in playlist ${o} clamped to ${a}`), a;\n  }\n  get forcedAutoLevel() {\n    return this.nextAutoLevelKey ? -1 : this._nextAutoLevel;\n  }\n  // return next auto level\n  get nextAutoLevel() {\n    const e = this.forcedAutoLevel, r = this.bwEstimator.canEstimate(), n = this.lastLoadedFragLevel > -1;\n    if (e !== -1 && (!r || !n || this.nextAutoLevelKey === this.getAutoLevelKey()))\n      return e;\n    const i = r && n ? this.getNextABRAutoLevel() : this.firstAutoLevel;\n    if (e !== -1) {\n      const o = this.hls.levels;\n      if (o.length > Math.max(e, i) && o[e].loadError <= o[i].loadError)\n        return e;\n    }\n    return this._nextAutoLevel = i, this.nextAutoLevelKey = this.getAutoLevelKey(), i;\n  }\n  getAutoLevelKey() {\n    return `${this.getBwEstimate()}_${this.getStarvationDelay().toFixed(2)}`;\n  }\n  getNextABRAutoLevel() {\n    const {\n      fragCurrent: e,\n      partCurrent: t,\n      hls: r\n    } = this;\n    if (r.levels.length <= 1)\n      return r.loadLevel;\n    const {\n      maxAutoLevel: n,\n      config: i,\n      minAutoLevel: o\n    } = r, a = t ? t.duration : e ? e.duration : 0, l = this.getBwEstimate(), c = this.getStarvationDelay();\n    let u = i.abrBandWidthFactor, d = i.abrBandWidthUpFactor;\n    if (c) {\n      const E = this.findBestLevel(l, o, n, c, 0, u, d);\n      if (E >= 0)\n        return this.rebufferNotice = -1, E;\n    }\n    let h = a ? Math.min(a, i.maxStarvationDelay) : i.maxStarvationDelay;\n    if (!c) {\n      const E = this.bitrateTestDelay;\n      E && (h = (a ? Math.min(a, i.maxLoadingDelay) : i.maxLoadingDelay) - E, this.info(`bitrate test took ${Math.round(1e3 * E)}ms, set first fragment max fetchDuration to ${Math.round(1e3 * h)} ms`), u = d = 1);\n    }\n    const f = this.findBestLevel(l, o, n, c, h, u, d);\n    if (this.rebufferNotice !== f && (this.rebufferNotice = f, this.info(`${c ? \"rebuffering expected\" : \"buffer is empty\"}, optimal quality level ${f}`)), f > -1)\n      return f;\n    const p = r.levels[o], y = r.loadLevelObj;\n    return y && (p == null ? void 0 : p.bitrate) < y.bitrate ? o : r.loadLevel;\n  }\n  getStarvationDelay() {\n    const e = this.hls, t = e.media;\n    if (!t)\n      return 1 / 0;\n    const r = t && t.playbackRate !== 0 ? Math.abs(t.playbackRate) : 1, n = e.mainForwardBufferInfo;\n    return (n ? n.len : 0) / r;\n  }\n  getBwEstimate() {\n    return this.bwEstimator.canEstimate() ? this.bwEstimator.getEstimate() : this.hls.config.abrEwmaDefaultEstimate;\n  }\n  findBestLevel(e, t, r, n, i, o, a) {\n    var l;\n    const c = n + i, u = this.lastLoadedFragLevel, d = u === -1 ? this.hls.firstLevel : u, {\n      fragCurrent: h,\n      partCurrent: f\n    } = this, {\n      levels: p,\n      allAudioTracks: y,\n      loadLevel: E,\n      config: b\n    } = this.hls;\n    if (p.length === 1)\n      return 0;\n    const R = p[d], A = !!((l = this.hls.latestLevelDetails) != null && l.live), F = E === -1 || u === -1;\n    let M, H = \"SDR\", K = (R == null ? void 0 : R.frameRate) || 0;\n    const {\n      audioPreference: j,\n      videoPreference: C\n    } = b, k = this.audioTracksByGroup || (this.audioTracksByGroup = $g(y));\n    let $ = -1;\n    if (F) {\n      if (this.firstSelection !== -1)\n        return this.firstSelection;\n      const w = this.codecTiers || (this.codecTiers = fb(p, k, t, r)), D = hb(w, H, e, j, C), {\n        codecSet: O,\n        videoRanges: U,\n        minFramerate: V,\n        minBitrate: L,\n        minIndex: m,\n        preferHDR: v\n      } = D;\n      $ = m, M = O, H = v ? U[U.length - 1] : U[0], K = V, e = Math.max(e, L), this.log(`picked start tier ${at(D)}`);\n    } else\n      M = R == null ? void 0 : R.codecSet, H = R == null ? void 0 : R.videoRange;\n    const W = f ? f.duration : h ? h.duration : 0, _ = this.bwEstimator.getEstimateTTFB() / 1e3, g = [];\n    for (let w = r; w >= t; w--) {\n      var x;\n      const D = p[w], O = w > d;\n      if (!D)\n        continue;\n      if (b.useMediaCapabilities && !D.supportedResult && !D.supportedPromise) {\n        const N = navigator.mediaCapabilities;\n        typeof (N == null ? void 0 : N.decodingInfo) == \"function\" && rb(D, k, H, K, e, j) ? (D.supportedPromise = Ng(D, k, N, this.supportedCache), D.supportedPromise.then((Y) => {\n          if (!this.hls)\n            return;\n          D.supportedResult = Y;\n          const ee = this.hls.levels, ie = ee.indexOf(D);\n          Y.error ? this.warn(`MediaCapabilities decodingInfo error: \"${Y.error}\" for level ${ie} ${at(Y)}`) : Y.supported ? Y.decodingInfoResults.some((le) => le.smooth === !1 || le.powerEfficient === !1) && this.log(`MediaCapabilities decodingInfo for level ${ie} not smooth or powerEfficient: ${at(Y)}`) : (this.warn(`Unsupported MediaCapabilities decodingInfo result for level ${ie} ${at(Y)}`), ie > -1 && ee.length > 1 && (this.log(`Removing unsupported level ${ie}`), this.hls.removeLevel(ie), this.hls.loadLevel === -1 && (this.hls.nextLoadLevel = 0)));\n        }).catch((Y) => {\n          this.warn(`Error handling MediaCapabilities decodingInfo: ${Y}`);\n        })) : D.supportedResult = Bg;\n      }\n      if ((M && D.codecSet !== M || H && D.videoRange !== H || O && K > D.frameRate || !O && K > 0 && K < D.frameRate || (x = D.supportedResult) != null && (x = x.decodingInfoResults) != null && x.some((N) => N.smooth === !1)) && (!F || w !== $)) {\n        g.push(w);\n        continue;\n      }\n      const U = D.details, V = (f ? U == null ? void 0 : U.partTarget : U == null ? void 0 : U.averagetargetduration) || W;\n      let L;\n      O ? L = a * e : L = o * e;\n      const m = W && n >= W * 2 && i === 0 ? D.averageBitrate : D.maxBitrate, v = this.getTimeToLoadFrag(_, L, m * V, U === void 0);\n      if (\n        // if adjusted bw is greater than level bitrate AND\n        L >= m && // no level change, or new level has no error history\n        (w === u || D.loadError === 0 && D.fragmentError === 0) && // fragment fetchDuration unknown OR live stream OR fragment fetchDuration less than max allowed fetch duration, then this level matches\n        // we don't account for max Fetch Duration for live streams, this is to avoid switching down when near the edge of live sliding window ...\n        // special case to support startLevel = -1 (bitrateTest) on live streams : in that case we should not exit loop so that findBestLevel will return -1\n        (v <= _ || !ue(v) || A && !this.bitrateTestDelay || v < c)\n      ) {\n        const N = this.forcedAutoLevel;\n        return w !== E && (N === -1 || N !== E) && (g.length && this.trace(`Skipped level(s) ${g.join(\",\")} of ${r} max with CODECS and VIDEO-RANGE:\"${p[g[0]].codecs}\" ${p[g[0]].videoRange}; not compatible with \"${M}\" ${H}`), this.info(`switch candidate:${d}->${w} adjustedbw(${Math.round(L)})-bitrate=${Math.round(L - m)} ttfb:${_.toFixed(1)} avgDuration:${V.toFixed(1)} maxFetchDuration:${c.toFixed(1)} fetchDuration:${v.toFixed(1)} firstSelection:${F} codecSet:${D.codecSet} videoRange:${D.videoRange} hls.loadLevel:${E}`)), F && (this.firstSelection = w), w;\n      }\n    }\n    return -1;\n  }\n  set nextAutoLevel(e) {\n    const t = this.deriveNextAutoLevel(e);\n    this._nextAutoLevel !== t && (this.nextAutoLevelKey = \"\", this._nextAutoLevel = t);\n  }\n  deriveNextAutoLevel(e) {\n    const {\n      maxAutoLevel: t,\n      minAutoLevel: r\n    } = this.hls;\n    return Math.min(Math.max(e, r), t);\n  }\n}\nconst Gg = {\n  /**\n   * Searches for an item in an array which matches a certain condition.\n   * This requires the condition to only match one item in the array,\n   * and for the array to be ordered.\n   *\n   * @param list The array to search.\n   * @param comparisonFn\n   *      Called and provided a candidate item as the first argument.\n   *      Should return:\n   *          > -1 if the item should be located at a lower index than the provided item.\n   *          > 1 if the item should be located at a higher index than the provided item.\n   *          > 0 if the item is the item you're looking for.\n   *\n   * @returns the object if found, otherwise returns null\n   */\n  search: function(s, e) {\n    let t = 0, r = s.length - 1, n = null, i = null;\n    for (; t <= r; ) {\n      n = (t + r) / 2 | 0, i = s[n];\n      const o = e(i);\n      if (o > 0)\n        t = n + 1;\n      else if (o < 0)\n        r = n - 1;\n      else\n        return i;\n    }\n    return null;\n  }\n};\nfunction vb(s, e, t) {\n  if (e === null || !Array.isArray(s) || !s.length || !ue(e))\n    return null;\n  const r = s[0].programDateTime;\n  if (e < (r || 0))\n    return null;\n  const n = s[s.length - 1].endProgramDateTime;\n  if (e >= (n || 0))\n    return null;\n  for (let i = 0; i < s.length; ++i) {\n    const o = s[i];\n    if (xb(e, t, o))\n      return o;\n  }\n  return null;\n}\nfunction Js(s, e, t = 0, r = 0, n = 5e-3) {\n  let i = null;\n  if (s) {\n    i = e[1 + s.sn - e[0].sn] || null;\n    const a = s.endDTS - t;\n    a > 0 && a < 15e-7 && (t += 15e-7), i && s.level !== i.level && i.end <= s.end && (i = e[2 + s.sn - e[0].sn] || null);\n  } else t === 0 && e[0].start === 0 && (i = e[0]);\n  if (i && ((!s || s.level === i.level) && dh(t, r, i) === 0 || Eb(i, s, Math.min(n, r))))\n    return i;\n  const o = Gg.search(e, dh.bind(null, t, r));\n  return o && (o !== s || !i) ? o : i;\n}\nfunction Eb(s, e, t) {\n  if (e && e.start === 0 && e.level < s.level && (e.endPTS || 0) > 0) {\n    const r = e.tagList.reduce((n, i) => (i[0] === \"INF\" && (n += parseFloat(i[1])), n), t);\n    return s.start <= r;\n  }\n  return !1;\n}\nfunction dh(s = 0, e = 0, t) {\n  if (t.start <= s && t.start + t.duration > s)\n    return 0;\n  const r = Math.min(e, t.duration + (t.deltaPTS ? t.deltaPTS : 0));\n  return t.start + t.duration - r <= s ? 1 : t.start - r > s && t.start ? -1 : 0;\n}\nfunction xb(s, e, t) {\n  const r = Math.min(e, t.duration + (t.deltaPTS ? t.deltaPTS : 0)) * 1e3;\n  return (t.endProgramDateTime || 0) - r > s;\n}\nfunction Vg(s, e, t) {\n  if (s && s.startCC <= e && s.endCC >= e) {\n    let r = s.fragments;\n    const {\n      fragmentHint: n\n    } = s;\n    n && (r = r.concat(n));\n    let i;\n    return Gg.search(r, (o) => o.cc < e ? 1 : o.cc > e ? -1 : (i = o, o.end <= t ? 1 : o.start > t ? -1 : 0)), i || null;\n  }\n  return null;\n}\nfunction ea(s) {\n  switch (s.details) {\n    case J.FRAG_LOAD_TIMEOUT:\n    case J.KEY_LOAD_TIMEOUT:\n    case J.LEVEL_LOAD_TIMEOUT:\n    case J.MANIFEST_LOAD_TIMEOUT:\n      return !0;\n  }\n  return !1;\n}\nfunction jg(s) {\n  return s.details.startsWith(\"key\");\n}\nfunction Kg(s) {\n  return jg(s) && !!s.frag && !s.frag.decryptdata;\n}\nfunction hh(s, e) {\n  const t = ea(e);\n  return s.default[`${t ? \"timeout\" : \"error\"}Retry`];\n}\nfunction yu(s, e) {\n  const t = s.backoff === \"linear\" ? 1 : Math.pow(2, e);\n  return Math.min(t * s.retryDelayMs, s.maxRetryDelayMs);\n}\nfunction fh(s) {\n  return tt(tt({}, s), {\n    errorRetry: null,\n    timeoutRetry: null\n  });\n}\nfunction ta(s, e, t, r) {\n  if (!s)\n    return !1;\n  const n = r == null ? void 0 : r.code, i = e < s.maxNumRetry && (Sb(n) || !!t);\n  return s.shouldRetry ? s.shouldRetry(s, e, t, r, i) : i;\n}\nfunction Sb(s) {\n  return uc(s) || !!s && (s < 400 || s > 499);\n}\nfunction uc(s) {\n  return s === 0 && navigator.onLine === !1;\n}\nvar Zt = {\n  DoNothing: 0,\n  SendAlternateToPenaltyBox: 2,\n  RemoveAlternatePermanently: 3,\n  RetryRequest: 5\n}, vr = {\n  None: 0,\n  MoveAllAlternatesMatchingHost: 1,\n  MoveAllAlternatesMatchingHDCP: 2,\n  MoveAllAlternatesMatchingKey: 4\n};\nclass bb extends Lr {\n  constructor(e) {\n    super(\"error-controller\", e.logger), this.hls = void 0, this.playlistError = 0, this.hls = e, this.registerListeners();\n  }\n  registerListeners() {\n    const e = this.hls;\n    e.on(I.ERROR, this.onError, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.LEVEL_UPDATED, this.onLevelUpdated, this);\n  }\n  unregisterListeners() {\n    const e = this.hls;\n    e && (e.off(I.ERROR, this.onError, this), e.off(I.ERROR, this.onErrorOut, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.LEVEL_UPDATED, this.onLevelUpdated, this));\n  }\n  destroy() {\n    this.unregisterListeners(), this.hls = null;\n  }\n  startLoad(e) {\n  }\n  stopLoad() {\n    this.playlistError = 0;\n  }\n  getVariantLevelIndex(e) {\n    return (e == null ? void 0 : e.type) === pe.MAIN ? e.level : this.getVariantIndex();\n  }\n  getVariantIndex() {\n    var e;\n    const t = this.hls, r = t.currentLevel;\n    return (e = t.loadLevelObj) != null && e.details || r === -1 ? t.loadLevel : r;\n  }\n  variantHasKey(e, t) {\n    if (e) {\n      var r;\n      if ((r = e.details) != null && r.hasKey(t))\n        return !0;\n      const n = e.audioGroups;\n      if (n)\n        return this.hls.allAudioTracks.filter((o) => n.indexOf(o.groupId) >= 0).some((o) => {\n          var a;\n          return (a = o.details) == null ? void 0 : a.hasKey(t);\n        });\n    }\n    return !1;\n  }\n  onManifestLoading() {\n    this.playlistError = 0;\n  }\n  onLevelUpdated() {\n    this.playlistError = 0;\n  }\n  onError(e, t) {\n    var r;\n    if (t.fatal)\n      return;\n    const n = this.hls, i = t.context;\n    switch (t.details) {\n      case J.FRAG_LOAD_ERROR:\n      case J.FRAG_LOAD_TIMEOUT:\n      case J.KEY_LOAD_ERROR:\n      case J.KEY_LOAD_TIMEOUT:\n        t.errorAction = this.getFragRetryOrSwitchAction(t);\n        return;\n      case J.FRAG_PARSING_ERROR:\n        if ((r = t.frag) != null && r.gap) {\n          t.errorAction = An();\n          return;\n        }\n      // falls through\n      case J.FRAG_GAP:\n      case J.FRAG_DECRYPT_ERROR: {\n        t.errorAction = this.getFragRetryOrSwitchAction(t), t.errorAction.action = Zt.SendAlternateToPenaltyBox;\n        return;\n      }\n      case J.LEVEL_EMPTY_ERROR:\n      case J.LEVEL_PARSING_ERROR:\n        {\n          var o;\n          const l = t.parent === pe.MAIN ? t.level : n.loadLevel;\n          t.details === J.LEVEL_EMPTY_ERROR && ((o = t.context) != null && (o = o.levelDetails) != null && o.live) ? t.errorAction = this.getPlaylistRetryOrSwitchAction(t, l) : (t.levelRetry = !1, t.errorAction = this.getLevelSwitchAction(t, l));\n        }\n        return;\n      case J.LEVEL_LOAD_ERROR:\n      case J.LEVEL_LOAD_TIMEOUT:\n        typeof (i == null ? void 0 : i.level) == \"number\" && (t.errorAction = this.getPlaylistRetryOrSwitchAction(t, i.level));\n        return;\n      case J.AUDIO_TRACK_LOAD_ERROR:\n      case J.AUDIO_TRACK_LOAD_TIMEOUT:\n      case J.SUBTITLE_LOAD_ERROR:\n      case J.SUBTITLE_TRACK_LOAD_TIMEOUT:\n        if (i) {\n          const l = n.loadLevelObj;\n          if (l && (i.type === Ke.AUDIO_TRACK && l.hasAudioGroup(i.groupId) || i.type === Ke.SUBTITLE_TRACK && l.hasSubtitleGroup(i.groupId))) {\n            t.errorAction = this.getPlaylistRetryOrSwitchAction(t, n.loadLevel), t.errorAction.action = Zt.SendAlternateToPenaltyBox, t.errorAction.flags = vr.MoveAllAlternatesMatchingHost;\n            return;\n          }\n        }\n        return;\n      case J.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED:\n        t.errorAction = {\n          action: Zt.SendAlternateToPenaltyBox,\n          flags: vr.MoveAllAlternatesMatchingHDCP\n        };\n        return;\n      case J.KEY_SYSTEM_SESSION_UPDATE_FAILED:\n      case J.KEY_SYSTEM_STATUS_INTERNAL_ERROR:\n      case J.KEY_SYSTEM_NO_SESSION:\n        t.errorAction = {\n          action: Zt.SendAlternateToPenaltyBox,\n          flags: vr.MoveAllAlternatesMatchingKey\n        };\n        return;\n      case J.BUFFER_ADD_CODEC_ERROR:\n      case J.REMUX_ALLOC_ERROR:\n      case J.BUFFER_APPEND_ERROR:\n        if (!t.errorAction) {\n          var a;\n          t.errorAction = this.getLevelSwitchAction(t, (a = t.level) != null ? a : n.loadLevel);\n        }\n        return;\n      case J.INTERNAL_EXCEPTION:\n      case J.BUFFER_APPENDING_ERROR:\n      case J.BUFFER_FULL_ERROR:\n      case J.LEVEL_SWITCH_ERROR:\n      case J.BUFFER_STALLED_ERROR:\n      case J.BUFFER_SEEK_OVER_HOLE:\n      case J.BUFFER_NUDGE_ON_STALL:\n        t.errorAction = An();\n        return;\n    }\n    t.type === ve.KEY_SYSTEM_ERROR && (t.levelRetry = !1, t.errorAction = An());\n  }\n  getPlaylistRetryOrSwitchAction(e, t) {\n    const r = this.hls, n = hh(r.config.playlistLoadPolicy, e), i = this.playlistError++;\n    if (ta(n, i, ea(e), e.response))\n      return {\n        action: Zt.RetryRequest,\n        flags: vr.None,\n        retryConfig: n,\n        retryCount: i\n      };\n    const a = this.getLevelSwitchAction(e, t);\n    return n && (a.retryConfig = n, a.retryCount = i), a;\n  }\n  getFragRetryOrSwitchAction(e) {\n    const t = this.hls, r = this.getVariantLevelIndex(e.frag), n = t.levels[r], {\n      fragLoadPolicy: i,\n      keyLoadPolicy: o\n    } = t.config, a = hh(jg(e) ? o : i, e), l = t.levels.reduce((u, d) => u + d.fragmentError, 0);\n    if (n && (e.details !== J.FRAG_GAP && n.fragmentError++, !Kg(e) && ta(a, l, ea(e), e.response)))\n      return {\n        action: Zt.RetryRequest,\n        flags: vr.None,\n        retryConfig: a,\n        retryCount: l\n      };\n    const c = this.getLevelSwitchAction(e, r);\n    return a && (c.retryConfig = a, c.retryCount = l), c;\n  }\n  getLevelSwitchAction(e, t) {\n    const r = this.hls;\n    t == null && (t = r.loadLevel);\n    const n = this.hls.levels[t];\n    if (n) {\n      var i, o;\n      const c = e.details;\n      n.loadError++, c === J.BUFFER_APPEND_ERROR && n.fragmentError++;\n      let u = -1;\n      const {\n        levels: d,\n        loadLevel: h,\n        minAutoLevel: f,\n        maxAutoLevel: p\n      } = r;\n      !r.autoLevelEnabled && !r.config.preserveManualLevelOnError && (r.loadLevel = -1);\n      const y = (i = e.frag) == null ? void 0 : i.type, b = (y === pe.AUDIO && c === J.FRAG_PARSING_ERROR || e.sourceBufferName === \"audio\" && (c === J.BUFFER_ADD_CODEC_ERROR || c === J.BUFFER_APPEND_ERROR)) && d.some(({\n        audioCodec: H\n      }) => n.audioCodec !== H), A = e.sourceBufferName === \"video\" && (c === J.BUFFER_ADD_CODEC_ERROR || c === J.BUFFER_APPEND_ERROR) && d.some(({\n        codecSet: H,\n        audioCodec: K\n      }) => n.codecSet !== H && n.audioCodec === K), {\n        type: F,\n        groupId: M\n      } = (o = e.context) != null ? o : {};\n      for (let H = d.length; H--; ) {\n        const K = (H + h) % d.length;\n        if (K !== h && K >= f && K <= p && d[K].loadError === 0) {\n          var a, l;\n          const j = d[K];\n          if (c === J.FRAG_GAP && y === pe.MAIN && e.frag) {\n            const C = d[K].details;\n            if (C) {\n              const k = Js(e.frag, C.fragments, e.frag.start);\n              if (k != null && k.gap)\n                continue;\n            }\n          } else {\n            if (F === Ke.AUDIO_TRACK && j.hasAudioGroup(M) || F === Ke.SUBTITLE_TRACK && j.hasSubtitleGroup(M))\n              continue;\n            if (y === pe.AUDIO && (a = n.audioGroups) != null && a.some((C) => j.hasAudioGroup(C)) || y === pe.SUBTITLE && (l = n.subtitleGroups) != null && l.some((C) => j.hasSubtitleGroup(C)) || b && n.audioCodec === j.audioCodec || A && n.codecSet === j.codecSet || !b && n.codecSet !== j.codecSet)\n              continue;\n          }\n          u = K;\n          break;\n        }\n      }\n      if (u > -1 && r.loadLevel !== u)\n        return e.levelRetry = !0, this.playlistError = 0, {\n          action: Zt.SendAlternateToPenaltyBox,\n          flags: vr.None,\n          nextAutoLevel: u\n        };\n    }\n    return {\n      action: Zt.SendAlternateToPenaltyBox,\n      flags: vr.MoveAllAlternatesMatchingHost\n    };\n  }\n  onErrorOut(e, t) {\n    var r;\n    switch ((r = t.errorAction) == null ? void 0 : r.action) {\n      case Zt.DoNothing:\n        break;\n      case Zt.SendAlternateToPenaltyBox:\n        this.sendAlternateToPenaltyBox(t), !t.errorAction.resolved && t.details !== J.FRAG_GAP ? t.fatal = !0 : /MediaSource readyState: ended/.test(t.error.message) && (this.warn(`MediaSource ended after \"${t.sourceBufferName}\" sourceBuffer append error. Attempting to recover from media error.`), this.hls.recoverMediaError());\n        break;\n    }\n    if (t.fatal) {\n      this.hls.stopLoad();\n      return;\n    }\n  }\n  sendAlternateToPenaltyBox(e) {\n    const t = this.hls, r = e.errorAction;\n    if (!r)\n      return;\n    const {\n      flags: n\n    } = r, i = r.nextAutoLevel;\n    switch (n) {\n      case vr.None:\n        this.switchLevel(e, i);\n        break;\n      case vr.MoveAllAlternatesMatchingHDCP: {\n        const l = this.getVariantLevelIndex(e.frag), c = t.levels[l], u = c == null ? void 0 : c.attrs[\"HDCP-LEVEL\"];\n        if (r.hdcpLevel = u, u === \"NONE\")\n          this.warn(\"HDCP policy resticted output with HDCP-LEVEL=NONE\");\n        else if (u) {\n          t.maxHdcpLevel = cc[cc.indexOf(u) - 1], r.resolved = !0, this.warn(`Restricting playback to HDCP-LEVEL of \"${t.maxHdcpLevel}\" or lower`);\n          break;\n        }\n      }\n      // eslint-disable-next-line no-fallthrough\n      case vr.MoveAllAlternatesMatchingKey: {\n        const l = e.decryptdata;\n        if (l) {\n          const c = this.hls.levels, u = c.length;\n          for (let h = u; h--; )\n            if (this.variantHasKey(c[h], l)) {\n              var o, a;\n              this.log(`Banned key found in level ${h} (${c[h].bitrate}bps) or audio group \"${(o = c[h].audioGroups) == null ? void 0 : o.join(\",\")}\" (${(a = e.frag) == null ? void 0 : a.type} fragment) ${fr(l.keyId || [])}`), c[h].fragmentError++, c[h].loadError++, this.log(`Removing level ${h} with key error (${e.error})`), this.hls.removeLevel(h);\n            }\n          const d = e.frag;\n          if (this.hls.levels.length < u)\n            r.resolved = !0;\n          else if (d && d.type !== pe.MAIN) {\n            const h = d.decryptdata;\n            h && !l.matches(h) && (r.resolved = !0);\n          }\n        }\n        break;\n      }\n    }\n    r.resolved || this.switchLevel(e, i);\n  }\n  switchLevel(e, t) {\n    if (t !== void 0 && e.errorAction && (this.warn(`switching to level ${t} after ${e.details}`), this.hls.nextAutoLevel = t, e.errorAction.resolved = !0, this.hls.nextLoadLevel = this.hls.nextAutoLevel, e.details === J.BUFFER_ADD_CODEC_ERROR && e.mimeType && e.sourceBufferName !== \"audiovideo\")) {\n      const r = lc(e.mimeType), n = this.hls.levels;\n      for (let i = n.length; i--; )\n        n[i][`${e.sourceBufferName}Codec`] === r && (this.log(`Removing level ${i} for ${e.details} (\"${r}\" not supported)`), this.hls.removeLevel(i));\n    }\n  }\n}\nfunction An(s) {\n  const e = {\n    action: Zt.DoNothing,\n    flags: vr.None\n  };\n  return s && (e.resolved = !0), e;\n}\nvar Ht = {\n  NOT_LOADED: \"NOT_LOADED\",\n  APPENDING: \"APPENDING\",\n  PARTIAL: \"PARTIAL\",\n  OK: \"OK\"\n};\nclass Tb {\n  constructor(e) {\n    this.activePartLists = /* @__PURE__ */ Object.create(null), this.endListFragments = /* @__PURE__ */ Object.create(null), this.fragments = /* @__PURE__ */ Object.create(null), this.timeRanges = /* @__PURE__ */ Object.create(null), this.bufferPadding = 0.2, this.hls = void 0, this.hasGaps = !1, this.hls = e, this._registerListeners();\n  }\n  _registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e && (e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.BUFFER_APPENDED, this.onBufferAppended, this), e.on(I.FRAG_BUFFERED, this.onFragBuffered, this), e.on(I.FRAG_LOADED, this.onFragLoaded, this));\n  }\n  _unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e && (e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.BUFFER_APPENDED, this.onBufferAppended, this), e.off(I.FRAG_BUFFERED, this.onFragBuffered, this), e.off(I.FRAG_LOADED, this.onFragLoaded, this));\n  }\n  destroy() {\n    this._unregisterListeners(), this.hls = // @ts-ignore\n    this.fragments = // @ts-ignore\n    this.activePartLists = // @ts-ignore\n    this.endListFragments = this.timeRanges = null;\n  }\n  /**\n   * Return a Fragment or Part with an appended range that matches the position and levelType\n   * Otherwise, return null\n   */\n  getAppendedFrag(e, t) {\n    const r = this.activePartLists[t];\n    if (r)\n      for (let n = r.length; n--; ) {\n        const i = r[n];\n        if (!i)\n          break;\n        if (i.start <= e && e <= i.end && i.loaded)\n          return i;\n      }\n    return this.getBufferedFrag(e, t);\n  }\n  /**\n   * Return a buffered Fragment that matches the position and levelType.\n   * A buffered Fragment is one whose loading, parsing and appending is done (completed or \"partial\" meaning aborted).\n   * If not found any Fragment, return null\n   */\n  getBufferedFrag(e, t) {\n    return this.getFragAtPos(e, t, !0);\n  }\n  getFragAtPos(e, t, r) {\n    const {\n      fragments: n\n    } = this, i = Object.keys(n);\n    for (let o = i.length; o--; ) {\n      const a = n[i[o]];\n      if ((a == null ? void 0 : a.body.type) === t && (!r || a.buffered)) {\n        const l = a.body;\n        if (l.start <= e && e <= l.end)\n          return l;\n      }\n    }\n    return null;\n  }\n  /**\n   * Partial fragments effected by coded frame eviction will be removed\n   * The browser will unload parts of the buffer to free up memory for new buffer data\n   * Fragments will need to be reloaded when the buffer is freed up, removing partial fragments will allow them to reload(since there might be parts that are still playable)\n   */\n  detectEvictedFragments(e, t, r, n, i) {\n    this.timeRanges && (this.timeRanges[e] = t);\n    const o = (n == null ? void 0 : n.fragment.sn) || -1;\n    Object.keys(this.fragments).forEach((a) => {\n      const l = this.fragments[a];\n      if (!l || o >= l.body.sn)\n        return;\n      if (!l.buffered && (!l.loaded || i)) {\n        l.body.type === r && this.removeFragment(l.body);\n        return;\n      }\n      const c = l.range[e];\n      if (c) {\n        if (c.time.length === 0) {\n          this.removeFragment(l.body);\n          return;\n        }\n        c.time.some((u) => {\n          const d = !this.isTimeBuffered(u.startPTS, u.endPTS, t);\n          return d && this.removeFragment(l.body), d;\n        });\n      }\n    });\n  }\n  /**\n   * Checks if the fragment passed in is loaded in the buffer properly\n   * Partially loaded fragments will be registered as a partial fragment\n   */\n  detectPartialFragments(e) {\n    const t = this.timeRanges;\n    if (!t || e.frag.sn === \"initSegment\")\n      return;\n    const r = e.frag, n = fn(r), i = this.fragments[n];\n    if (!i || i.buffered && r.gap)\n      return;\n    const o = !r.relurl;\n    Object.keys(t).forEach((a) => {\n      const l = r.elementaryStreams[a];\n      if (!l)\n        return;\n      const c = t[a], u = o || l.partial === !0;\n      i.range[a] = this.getBufferedTimes(r, e.part, u, c);\n    }), i.loaded = null, Object.keys(i.range).length ? (i.buffered = !0, (i.body.endList = r.endList || i.body.endList) && (this.endListFragments[i.body.type] = i), Hi(i) || this.removeParts(r.sn - 1, r.type)) : this.removeFragment(i.body);\n  }\n  removeParts(e, t) {\n    const r = this.activePartLists[t];\n    r && (this.activePartLists[t] = gh(r, (n) => n.fragment.sn >= e));\n  }\n  fragBuffered(e, t) {\n    const r = fn(e);\n    let n = this.fragments[r];\n    !n && t && (n = this.fragments[r] = {\n      body: e,\n      appendedPTS: null,\n      loaded: null,\n      buffered: !1,\n      range: /* @__PURE__ */ Object.create(null)\n    }, e.gap && (this.hasGaps = !0)), n && (n.loaded = null, n.buffered = !0);\n  }\n  getBufferedTimes(e, t, r, n) {\n    const i = {\n      time: [],\n      partial: r\n    }, o = e.start, a = e.end, l = e.minEndPTS || a, c = e.maxStartPTS || o;\n    for (let u = 0; u < n.length; u++) {\n      const d = n.start(u) - this.bufferPadding, h = n.end(u) + this.bufferPadding;\n      if (c >= d && l <= h) {\n        i.time.push({\n          startPTS: Math.max(o, n.start(u)),\n          endPTS: Math.min(a, n.end(u))\n        });\n        break;\n      } else if (o < h && a > d) {\n        const f = Math.max(o, n.start(u)), p = Math.min(a, n.end(u));\n        p > f && (i.partial = !0, i.time.push({\n          startPTS: f,\n          endPTS: p\n        }));\n      } else if (a <= d)\n        break;\n    }\n    return i;\n  }\n  /**\n   * Gets the partial fragment for a certain time\n   */\n  getPartialFragment(e) {\n    let t = null, r, n, i, o = 0;\n    const {\n      bufferPadding: a,\n      fragments: l\n    } = this;\n    return Object.keys(l).forEach((c) => {\n      const u = l[c];\n      u && Hi(u) && (n = u.body.start - a, i = u.body.end + a, e >= n && e <= i && (r = Math.min(e - n, i - e), o <= r && (t = u.body, o = r)));\n    }), t;\n  }\n  isEndListAppended(e) {\n    const t = this.endListFragments[e];\n    return t !== void 0 && (t.buffered || Hi(t));\n  }\n  getState(e) {\n    const t = fn(e), r = this.fragments[t];\n    return r ? r.buffered ? Hi(r) ? Ht.PARTIAL : Ht.OK : Ht.APPENDING : Ht.NOT_LOADED;\n  }\n  isTimeBuffered(e, t, r) {\n    let n, i;\n    for (let o = 0; o < r.length; o++) {\n      if (n = r.start(o) - this.bufferPadding, i = r.end(o) + this.bufferPadding, e >= n && t <= i)\n        return !0;\n      if (t <= n)\n        return !1;\n    }\n    return !1;\n  }\n  onManifestLoading() {\n    this.removeAllFragments();\n  }\n  onFragLoaded(e, t) {\n    if (t.frag.sn === \"initSegment\" || t.frag.bitrateTest)\n      return;\n    const r = t.frag, n = t.part ? null : t, i = fn(r);\n    this.fragments[i] = {\n      body: r,\n      appendedPTS: null,\n      loaded: n,\n      buffered: !1,\n      range: /* @__PURE__ */ Object.create(null)\n    };\n  }\n  onBufferAppended(e, t) {\n    const {\n      frag: r,\n      part: n,\n      timeRanges: i,\n      type: o\n    } = t;\n    if (r.sn === \"initSegment\")\n      return;\n    const a = r.type;\n    if (n) {\n      let c = this.activePartLists[a];\n      c || (this.activePartLists[a] = c = []), c.push(n);\n    }\n    this.timeRanges = i;\n    const l = i[o];\n    this.detectEvictedFragments(o, l, a, n);\n  }\n  onFragBuffered(e, t) {\n    this.detectPartialFragments(t);\n  }\n  hasFragment(e) {\n    const t = fn(e);\n    return !!this.fragments[t];\n  }\n  hasFragments(e) {\n    const {\n      fragments: t\n    } = this, r = Object.keys(t);\n    if (!e)\n      return r.length > 0;\n    for (let n = r.length; n--; ) {\n      const i = t[r[n]];\n      if ((i == null ? void 0 : i.body.type) === e)\n        return !0;\n    }\n    return !1;\n  }\n  hasParts(e) {\n    var t;\n    return !!((t = this.activePartLists[e]) != null && t.length);\n  }\n  removeFragmentsInRange(e, t, r, n, i) {\n    n && !this.hasGaps || Object.keys(this.fragments).forEach((o) => {\n      const a = this.fragments[o];\n      if (!a)\n        return;\n      const l = a.body;\n      l.type !== r || n && !l.gap || l.start < t && l.end > e && (a.buffered || i) && this.removeFragment(l);\n    });\n  }\n  removeFragment(e) {\n    const t = fn(e);\n    e.clearElementaryStreamInfo();\n    const r = this.activePartLists[e.type];\n    if (r) {\n      const n = e.sn;\n      this.activePartLists[e.type] = gh(r, (i) => i.fragment.sn !== n);\n    }\n    delete this.fragments[t], e.endList && delete this.endListFragments[e.type];\n  }\n  removeAllFragments() {\n    var e;\n    this.fragments = /* @__PURE__ */ Object.create(null), this.endListFragments = /* @__PURE__ */ Object.create(null), this.activePartLists = /* @__PURE__ */ Object.create(null), this.hasGaps = !1;\n    const t = (e = this.hls) == null || (e = e.latestLevelDetails) == null ? void 0 : e.partList;\n    t && t.forEach((r) => r.clearElementaryStreamInfo());\n  }\n}\nfunction Hi(s) {\n  var e, t, r;\n  return s.buffered && !!(s.body.gap || (e = s.range.video) != null && e.partial || (t = s.range.audio) != null && t.partial || (r = s.range.audiovideo) != null && r.partial);\n}\nfunction fn(s) {\n  return `${s.type}_${s.level}_${s.sn}`;\n}\nfunction gh(s, e) {\n  return s.filter((t) => {\n    const r = e(t);\n    return r || t.clearElementaryStreamInfo(), r;\n  });\n}\nvar Os = {\n  cbc: 0,\n  ctr: 1\n};\nclass wb {\n  constructor(e, t, r) {\n    this.subtle = void 0, this.aesIV = void 0, this.aesMode = void 0, this.subtle = e, this.aesIV = t, this.aesMode = r;\n  }\n  decrypt(e, t) {\n    switch (this.aesMode) {\n      case Os.cbc:\n        return this.subtle.decrypt({\n          name: \"AES-CBC\",\n          iv: this.aesIV\n        }, t, e);\n      case Os.ctr:\n        return this.subtle.decrypt(\n          {\n            name: \"AES-CTR\",\n            counter: this.aesIV,\n            length: 64\n          },\n          //64 : NIST SP800-38A standard suggests that the counter should occupy half of the counter block\n          t,\n          e\n        );\n      default:\n        throw new Error(`[AESCrypto] invalid aes mode ${this.aesMode}`);\n    }\n  }\n}\nfunction Ab(s) {\n  const e = s.byteLength, t = e && new DataView(s.buffer).getUint8(e - 1);\n  return t ? s.slice(0, e - t) : s;\n}\nclass Ib {\n  constructor() {\n    this.rcon = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54], this.subMix = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)], this.invSubMix = [new Uint32Array(256), new Uint32Array(256), new Uint32Array(256), new Uint32Array(256)], this.sBox = new Uint32Array(256), this.invSBox = new Uint32Array(256), this.key = new Uint32Array(0), this.ksRows = 0, this.keySize = 0, this.keySchedule = void 0, this.invKeySchedule = void 0, this.initTable();\n  }\n  // Using view.getUint32() also swaps the byte order.\n  uint8ArrayToUint32Array_(e) {\n    const t = new DataView(e), r = new Uint32Array(4);\n    for (let n = 0; n < 4; n++)\n      r[n] = t.getUint32(n * 4);\n    return r;\n  }\n  initTable() {\n    const e = this.sBox, t = this.invSBox, r = this.subMix, n = r[0], i = r[1], o = r[2], a = r[3], l = this.invSubMix, c = l[0], u = l[1], d = l[2], h = l[3], f = new Uint32Array(256);\n    let p = 0, y = 0, E = 0;\n    for (E = 0; E < 256; E++)\n      E < 128 ? f[E] = E << 1 : f[E] = E << 1 ^ 283;\n    for (E = 0; E < 256; E++) {\n      let b = y ^ y << 1 ^ y << 2 ^ y << 3 ^ y << 4;\n      b = b >>> 8 ^ b & 255 ^ 99, e[p] = b, t[b] = p;\n      const R = f[p], A = f[R], F = f[A];\n      let M = f[b] * 257 ^ b * 16843008;\n      n[p] = M << 24 | M >>> 8, i[p] = M << 16 | M >>> 16, o[p] = M << 8 | M >>> 24, a[p] = M, M = F * 16843009 ^ A * 65537 ^ R * 257 ^ p * 16843008, c[b] = M << 24 | M >>> 8, u[b] = M << 16 | M >>> 16, d[b] = M << 8 | M >>> 24, h[b] = M, p ? (p = R ^ f[f[f[F ^ R]]], y ^= f[f[y]]) : p = y = 1;\n    }\n  }\n  expandKey(e) {\n    const t = this.uint8ArrayToUint32Array_(e);\n    let r = !0, n = 0;\n    for (; n < t.length && r; )\n      r = t[n] === this.key[n], n++;\n    if (r)\n      return;\n    this.key = t;\n    const i = this.keySize = t.length;\n    if (i !== 4 && i !== 6 && i !== 8)\n      throw new Error(\"Invalid aes key size=\" + i);\n    const o = this.ksRows = (i + 6 + 1) * 4;\n    let a, l;\n    const c = this.keySchedule = new Uint32Array(o), u = this.invKeySchedule = new Uint32Array(o), d = this.sBox, h = this.rcon, f = this.invSubMix, p = f[0], y = f[1], E = f[2], b = f[3];\n    let R, A;\n    for (a = 0; a < o; a++) {\n      if (a < i) {\n        R = c[a] = t[a];\n        continue;\n      }\n      A = R, a % i === 0 ? (A = A << 8 | A >>> 24, A = d[A >>> 24] << 24 | d[A >>> 16 & 255] << 16 | d[A >>> 8 & 255] << 8 | d[A & 255], A ^= h[a / i | 0] << 24) : i > 6 && a % i === 4 && (A = d[A >>> 24] << 24 | d[A >>> 16 & 255] << 16 | d[A >>> 8 & 255] << 8 | d[A & 255]), c[a] = R = (c[a - i] ^ A) >>> 0;\n    }\n    for (l = 0; l < o; l++)\n      a = o - l, l & 3 ? A = c[a] : A = c[a - 4], l < 4 || a <= 4 ? u[l] = A : u[l] = p[d[A >>> 24]] ^ y[d[A >>> 16 & 255]] ^ E[d[A >>> 8 & 255]] ^ b[d[A & 255]], u[l] = u[l] >>> 0;\n  }\n  // Adding this as a method greatly improves performance.\n  networkToHostOrderSwap(e) {\n    return e << 24 | (e & 65280) << 8 | (e & 16711680) >> 8 | e >>> 24;\n  }\n  decrypt(e, t, r) {\n    const n = this.keySize + 6, i = this.invKeySchedule, o = this.invSBox, a = this.invSubMix, l = a[0], c = a[1], u = a[2], d = a[3], h = this.uint8ArrayToUint32Array_(r);\n    let f = h[0], p = h[1], y = h[2], E = h[3];\n    const b = new Int32Array(e), R = new Int32Array(b.length);\n    let A, F, M, H, K, j, C, k, $, W, _, g, x, w;\n    const D = this.networkToHostOrderSwap;\n    for (; t < b.length; ) {\n      for ($ = D(b[t]), W = D(b[t + 1]), _ = D(b[t + 2]), g = D(b[t + 3]), K = $ ^ i[0], j = g ^ i[1], C = _ ^ i[2], k = W ^ i[3], x = 4, w = 1; w < n; w++)\n        A = l[K >>> 24] ^ c[j >> 16 & 255] ^ u[C >> 8 & 255] ^ d[k & 255] ^ i[x], F = l[j >>> 24] ^ c[C >> 16 & 255] ^ u[k >> 8 & 255] ^ d[K & 255] ^ i[x + 1], M = l[C >>> 24] ^ c[k >> 16 & 255] ^ u[K >> 8 & 255] ^ d[j & 255] ^ i[x + 2], H = l[k >>> 24] ^ c[K >> 16 & 255] ^ u[j >> 8 & 255] ^ d[C & 255] ^ i[x + 3], K = A, j = F, C = M, k = H, x = x + 4;\n      A = o[K >>> 24] << 24 ^ o[j >> 16 & 255] << 16 ^ o[C >> 8 & 255] << 8 ^ o[k & 255] ^ i[x], F = o[j >>> 24] << 24 ^ o[C >> 16 & 255] << 16 ^ o[k >> 8 & 255] << 8 ^ o[K & 255] ^ i[x + 1], M = o[C >>> 24] << 24 ^ o[k >> 16 & 255] << 16 ^ o[K >> 8 & 255] << 8 ^ o[j & 255] ^ i[x + 2], H = o[k >>> 24] << 24 ^ o[K >> 16 & 255] << 16 ^ o[j >> 8 & 255] << 8 ^ o[C & 255] ^ i[x + 3], R[t] = D(A ^ f), R[t + 1] = D(H ^ p), R[t + 2] = D(M ^ y), R[t + 3] = D(F ^ E), f = $, p = W, y = _, E = g, t = t + 4;\n    }\n    return R.buffer;\n  }\n}\nclass _b {\n  constructor(e, t, r) {\n    this.subtle = void 0, this.key = void 0, this.aesMode = void 0, this.subtle = e, this.key = t, this.aesMode = r;\n  }\n  expandKey() {\n    const e = Rb(this.aesMode);\n    return this.subtle.importKey(\"raw\", this.key, {\n      name: e\n    }, !1, [\"encrypt\", \"decrypt\"]);\n  }\n}\nfunction Rb(s) {\n  switch (s) {\n    case Os.cbc:\n      return \"AES-CBC\";\n    case Os.ctr:\n      return \"AES-CTR\";\n    default:\n      throw new Error(`[FastAESKey] invalid aes mode ${s}`);\n  }\n}\nconst Lb = 16;\nclass vu {\n  constructor(e, {\n    removePKCS7Padding: t = !0\n  } = {}) {\n    if (this.logEnabled = !0, this.removePKCS7Padding = void 0, this.subtle = null, this.softwareDecrypter = null, this.key = null, this.fastAesKey = null, this.remainderData = null, this.currentIV = null, this.currentResult = null, this.useSoftware = void 0, this.enableSoftwareAES = void 0, this.enableSoftwareAES = e.enableSoftwareAES, this.removePKCS7Padding = t, t)\n      try {\n        const r = self.crypto;\n        r && (this.subtle = r.subtle || r.webkitSubtle);\n      } catch {\n      }\n    this.useSoftware = !this.subtle;\n  }\n  destroy() {\n    this.subtle = null, this.softwareDecrypter = null, this.key = null, this.fastAesKey = null, this.remainderData = null, this.currentIV = null, this.currentResult = null;\n  }\n  isSync() {\n    return this.useSoftware;\n  }\n  flush() {\n    const {\n      currentResult: e,\n      remainderData: t\n    } = this;\n    if (!e || t)\n      return this.reset(), null;\n    const r = new Uint8Array(e);\n    return this.reset(), this.removePKCS7Padding ? Ab(r) : r;\n  }\n  reset() {\n    this.currentResult = null, this.currentIV = null, this.remainderData = null, this.softwareDecrypter && (this.softwareDecrypter = null);\n  }\n  decrypt(e, t, r, n) {\n    return this.useSoftware ? new Promise((i, o) => {\n      const a = ArrayBuffer.isView(e) ? e : new Uint8Array(e);\n      this.softwareDecrypt(a, t, r, n);\n      const l = this.flush();\n      l ? i(l.buffer) : o(new Error(\"[softwareDecrypt] Failed to decrypt data\"));\n    }) : this.webCryptoDecrypt(new Uint8Array(e), t, r, n);\n  }\n  // Software decryption is progressive. Progressive decryption may not return a result on each call. Any cached\n  // data is handled in the flush() call\n  softwareDecrypt(e, t, r, n) {\n    const {\n      currentIV: i,\n      currentResult: o,\n      remainderData: a\n    } = this;\n    if (n !== Os.cbc || t.byteLength !== 16)\n      return rt.warn(\"SoftwareDecrypt: can only handle AES-128-CBC\"), null;\n    this.logOnce(\"JS AES decrypt\"), a && (e = _r(a, e), this.remainderData = null);\n    const l = this.getValidChunk(e);\n    if (!l.length)\n      return null;\n    i && (r = i);\n    let c = this.softwareDecrypter;\n    c || (c = this.softwareDecrypter = new Ib()), c.expandKey(t);\n    const u = o;\n    return this.currentResult = c.decrypt(l.buffer, 0, r), this.currentIV = l.slice(-16).buffer, u || null;\n  }\n  webCryptoDecrypt(e, t, r, n) {\n    if (this.key !== t || !this.fastAesKey) {\n      if (!this.subtle)\n        return Promise.resolve(this.onWebCryptoError(e, t, r, n));\n      this.key = t, this.fastAesKey = new _b(this.subtle, t, n);\n    }\n    return this.fastAesKey.expandKey().then((i) => this.subtle ? (this.logOnce(\"WebCrypto AES decrypt\"), new wb(this.subtle, new Uint8Array(r), n).decrypt(e.buffer, i)) : Promise.reject(new Error(\"web crypto not initialized\"))).catch((i) => (rt.warn(`[decrypter]: WebCrypto Error, disable WebCrypto API, ${i.name}: ${i.message}`), this.onWebCryptoError(e, t, r, n)));\n  }\n  onWebCryptoError(e, t, r, n) {\n    const i = this.enableSoftwareAES;\n    if (i) {\n      this.useSoftware = !0, this.logEnabled = !0, this.softwareDecrypt(e, t, r, n);\n      const o = this.flush();\n      if (o)\n        return o.buffer;\n    }\n    throw new Error(\"WebCrypto\" + (i ? \" and softwareDecrypt\" : \"\") + \": failed to decrypt data\");\n  }\n  getValidChunk(e) {\n    let t = e;\n    const r = e.length - e.length % Lb;\n    return r !== e.length && (t = e.slice(0, r), this.remainderData = e.slice(r)), t;\n  }\n  logOnce(e) {\n    this.logEnabled && (rt.log(`[decrypter]: ${e}`), this.logEnabled = !1);\n  }\n}\nconst ph = Math.pow(2, 17);\nclass Cb {\n  constructor(e) {\n    this.config = void 0, this.loader = null, this.partLoadTimeout = -1, this.config = e;\n  }\n  destroy() {\n    this.loader && (this.loader.destroy(), this.loader = null);\n  }\n  abort() {\n    this.loader && this.loader.abort();\n  }\n  load(e, t) {\n    const r = e.url;\n    if (!r)\n      return Promise.reject(new as({\n        type: ve.NETWORK_ERROR,\n        details: J.FRAG_LOAD_ERROR,\n        fatal: !1,\n        frag: e,\n        error: new Error(`Fragment does not have a ${r ? \"part list\" : \"url\"}`),\n        networkDetails: null\n      }));\n    this.abort();\n    const n = this.config, i = n.fLoader, o = n.loader;\n    return new Promise((a, l) => {\n      if (this.loader && this.loader.destroy(), e.gap)\n        if (e.tagList.some((p) => p[0] === \"GAP\")) {\n          l(yh(e));\n          return;\n        } else\n          e.gap = !1;\n      const c = this.loader = i ? new i(n) : new o(n), u = mh(e);\n      e.loader = c;\n      const d = fh(n.fragLoadPolicy.default), h = {\n        loadPolicy: d,\n        timeout: d.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0,\n        highWaterMark: e.sn === \"initSegment\" ? 1 / 0 : ph\n      };\n      e.stats = c.stats;\n      const f = {\n        onSuccess: (p, y, E, b) => {\n          this.resetLoader(e, c);\n          let R = p.data;\n          E.resetIV && e.decryptdata && (e.decryptdata.iv = new Uint8Array(R.slice(0, 16)), R = R.slice(16)), a({\n            frag: e,\n            part: null,\n            payload: R,\n            networkDetails: b\n          });\n        },\n        onError: (p, y, E, b) => {\n          this.resetLoader(e, c), l(new as({\n            type: ve.NETWORK_ERROR,\n            details: J.FRAG_LOAD_ERROR,\n            fatal: !1,\n            frag: e,\n            response: tt({\n              url: r,\n              data: void 0\n            }, p),\n            error: new Error(`HTTP Error ${p.code} ${p.text}`),\n            networkDetails: E,\n            stats: b\n          }));\n        },\n        onAbort: (p, y, E) => {\n          this.resetLoader(e, c), l(new as({\n            type: ve.NETWORK_ERROR,\n            details: J.INTERNAL_ABORTED,\n            fatal: !1,\n            frag: e,\n            error: new Error(\"Aborted\"),\n            networkDetails: E,\n            stats: p\n          }));\n        },\n        onTimeout: (p, y, E) => {\n          this.resetLoader(e, c), l(new as({\n            type: ve.NETWORK_ERROR,\n            details: J.FRAG_LOAD_TIMEOUT,\n            fatal: !1,\n            frag: e,\n            error: new Error(`Timeout after ${h.timeout}ms`),\n            networkDetails: E,\n            stats: p\n          }));\n        }\n      };\n      t && (f.onProgress = (p, y, E, b) => t({\n        frag: e,\n        part: null,\n        payload: E,\n        networkDetails: b\n      })), c.load(u, h, f);\n    });\n  }\n  loadPart(e, t, r) {\n    this.abort();\n    const n = this.config, i = n.fLoader, o = n.loader;\n    return new Promise((a, l) => {\n      if (this.loader && this.loader.destroy(), e.gap || t.gap) {\n        l(yh(e, t));\n        return;\n      }\n      const c = this.loader = i ? new i(n) : new o(n), u = mh(e, t);\n      e.loader = c;\n      const d = fh(n.fragLoadPolicy.default), h = {\n        loadPolicy: d,\n        timeout: d.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0,\n        highWaterMark: ph\n      };\n      t.stats = c.stats, c.load(u, h, {\n        onSuccess: (f, p, y, E) => {\n          this.resetLoader(e, c), this.updateStatsFromPart(e, t);\n          const b = {\n            frag: e,\n            part: t,\n            payload: f.data,\n            networkDetails: E\n          };\n          r(b), a(b);\n        },\n        onError: (f, p, y, E) => {\n          this.resetLoader(e, c), l(new as({\n            type: ve.NETWORK_ERROR,\n            details: J.FRAG_LOAD_ERROR,\n            fatal: !1,\n            frag: e,\n            part: t,\n            response: tt({\n              url: u.url,\n              data: void 0\n            }, f),\n            error: new Error(`HTTP Error ${f.code} ${f.text}`),\n            networkDetails: y,\n            stats: E\n          }));\n        },\n        onAbort: (f, p, y) => {\n          e.stats.aborted = t.stats.aborted, this.resetLoader(e, c), l(new as({\n            type: ve.NETWORK_ERROR,\n            details: J.INTERNAL_ABORTED,\n            fatal: !1,\n            frag: e,\n            part: t,\n            error: new Error(\"Aborted\"),\n            networkDetails: y,\n            stats: f\n          }));\n        },\n        onTimeout: (f, p, y) => {\n          this.resetLoader(e, c), l(new as({\n            type: ve.NETWORK_ERROR,\n            details: J.FRAG_LOAD_TIMEOUT,\n            fatal: !1,\n            frag: e,\n            part: t,\n            error: new Error(`Timeout after ${h.timeout}ms`),\n            networkDetails: y,\n            stats: f\n          }));\n        }\n      });\n    });\n  }\n  updateStatsFromPart(e, t) {\n    const r = e.stats, n = t.stats, i = n.total;\n    if (r.loaded += n.loaded, i) {\n      const l = Math.round(e.duration / t.duration), c = Math.min(Math.round(r.loaded / i), l), d = (l - c) * Math.round(r.loaded / c);\n      r.total = r.loaded + d;\n    } else\n      r.total = Math.max(r.loaded, r.total);\n    const o = r.loading, a = n.loading;\n    o.start ? o.first += a.first - a.start : (o.start = a.start, o.first = a.first), o.end = a.end;\n  }\n  resetLoader(e, t) {\n    e.loader = null, this.loader === t && (self.clearTimeout(this.partLoadTimeout), this.loader = null), t.destroy();\n  }\n}\nfunction mh(s, e = null) {\n  const t = e || s, r = {\n    frag: s,\n    part: e,\n    responseType: \"arraybuffer\",\n    url: t.url,\n    headers: {},\n    rangeStart: 0,\n    rangeEnd: 0\n  }, n = t.byteRangeStartOffset, i = t.byteRangeEndOffset;\n  if (ue(n) && ue(i)) {\n    var o;\n    let a = n, l = i;\n    if (s.sn === \"initSegment\" && kb((o = s.decryptdata) == null ? void 0 : o.method)) {\n      const c = i - n;\n      c % 16 && (l = i + (16 - c % 16)), n !== 0 && (r.resetIV = !0, a = n - 16);\n    }\n    r.rangeStart = a, r.rangeEnd = l;\n  }\n  return r;\n}\nfunction yh(s, e) {\n  const t = new Error(`GAP ${s.gap ? \"tag\" : \"attribute\"} found`), r = {\n    type: ve.MEDIA_ERROR,\n    details: J.FRAG_GAP,\n    fatal: !1,\n    frag: s,\n    error: t,\n    networkDetails: null\n  };\n  return e && (r.part = e), (e || s).stats.aborted = !0, new as(r);\n}\nfunction kb(s) {\n  return s === \"AES-128\" || s === \"AES-256\";\n}\nclass as extends Error {\n  constructor(e) {\n    super(e.error.message), this.data = void 0, this.data = e;\n  }\n}\nclass Hg extends Lr {\n  constructor(e, t) {\n    super(e, t), this._boundTick = void 0, this._tickTimer = null, this._tickInterval = null, this._tickCallCount = 0, this._boundTick = this.tick.bind(this);\n  }\n  destroy() {\n    this.onHandlerDestroying(), this.onHandlerDestroyed();\n  }\n  onHandlerDestroying() {\n    this.clearNextTick(), this.clearInterval();\n  }\n  onHandlerDestroyed() {\n  }\n  hasInterval() {\n    return !!this._tickInterval;\n  }\n  hasNextTick() {\n    return !!this._tickTimer;\n  }\n  /**\n   * @param millis - Interval time (ms)\n   * @eturns True when interval has been scheduled, false when already scheduled (no effect)\n   */\n  setInterval(e) {\n    return this._tickInterval ? !1 : (this._tickCallCount = 0, this._tickInterval = self.setInterval(this._boundTick, e), !0);\n  }\n  /**\n   * @returns True when interval was cleared, false when none was set (no effect)\n   */\n  clearInterval() {\n    return this._tickInterval ? (self.clearInterval(this._tickInterval), this._tickInterval = null, !0) : !1;\n  }\n  /**\n   * @returns True when timeout was cleared, false when none was set (no effect)\n   */\n  clearNextTick() {\n    return this._tickTimer ? (self.clearTimeout(this._tickTimer), this._tickTimer = null, !0) : !1;\n  }\n  /**\n   * Will call the subclass doTick implementation in this main loop tick\n   * or in the next one (via setTimeout(,0)) in case it has already been called\n   * in this tick (in case this is a re-entrant call).\n   */\n  tick() {\n    this._tickCallCount++, this._tickCallCount === 1 && (this.doTick(), this._tickCallCount > 1 && this.tickImmediate(), this._tickCallCount = 0);\n  }\n  tickImmediate() {\n    this.clearNextTick(), this._tickTimer = self.setTimeout(this._boundTick, 0);\n  }\n  /**\n   * For subclass to implement task logic\n   * @abstract\n   */\n  doTick() {\n  }\n}\nclass Eu {\n  constructor(e, t, r, n = 0, i = -1, o = !1) {\n    this.level = void 0, this.sn = void 0, this.part = void 0, this.id = void 0, this.size = void 0, this.partial = void 0, this.transmuxing = qi(), this.buffering = {\n      audio: qi(),\n      video: qi(),\n      audiovideo: qi()\n    }, this.level = e, this.sn = t, this.id = r, this.size = n, this.part = i, this.partial = o;\n  }\n}\nfunction qi() {\n  return {\n    start: 0,\n    executeStart: 0,\n    executeEnd: 0,\n    end: 0\n  };\n}\nconst vh = {\n  length: 0,\n  start: () => 0,\n  end: () => 0\n};\nclass Ce {\n  /**\n   * Return true if `media`'s buffered include `position`\n   */\n  static isBuffered(e, t) {\n    if (e) {\n      const r = Ce.getBuffered(e);\n      for (let n = r.length; n--; )\n        if (t >= r.start(n) && t <= r.end(n))\n          return !0;\n    }\n    return !1;\n  }\n  static bufferedRanges(e) {\n    if (e) {\n      const t = Ce.getBuffered(e);\n      return Ce.timeRangesToArray(t);\n    }\n    return [];\n  }\n  static timeRangesToArray(e) {\n    const t = [];\n    for (let r = 0; r < e.length; r++)\n      t.push({\n        start: e.start(r),\n        end: e.end(r)\n      });\n    return t;\n  }\n  static bufferInfo(e, t, r) {\n    if (e) {\n      const n = Ce.bufferedRanges(e);\n      if (n.length)\n        return Ce.bufferedInfo(n, t, r);\n    }\n    return {\n      len: 0,\n      start: t,\n      end: t,\n      bufferedIndex: -1\n    };\n  }\n  static bufferedInfo(e, t, r) {\n    t = Math.max(0, t), e.length > 1 && e.sort((u, d) => u.start - d.start || d.end - u.end);\n    let n = -1, i = [];\n    if (r)\n      for (let u = 0; u < e.length; u++) {\n        t >= e[u].start && t <= e[u].end && (n = u);\n        const d = i.length;\n        if (d) {\n          const h = i[d - 1].end;\n          e[u].start - h < r ? e[u].end > h && (i[d - 1].end = e[u].end) : i.push(e[u]);\n        } else\n          i.push(e[u]);\n      }\n    else\n      i = e;\n    let o = 0, a, l = t, c = t;\n    for (let u = 0; u < i.length; u++) {\n      const d = i[u].start, h = i[u].end;\n      if (n === -1 && t >= d && t <= h && (n = u), t + r >= d && t < h)\n        l = d, c = h, o = c - t;\n      else if (t + r < d) {\n        a = d;\n        break;\n      }\n    }\n    return {\n      len: o,\n      start: l || 0,\n      end: c || 0,\n      nextStart: a,\n      buffered: e,\n      bufferedIndex: n\n    };\n  }\n  /**\n   * Safe method to get buffered property.\n   * SourceBuffer.buffered may throw if SourceBuffer is removed from it's MediaSource\n   */\n  static getBuffered(e) {\n    try {\n      return e.buffered || vh;\n    } catch (t) {\n      return rt.log(\"failed to get media.buffered\", t), vh;\n    }\n  }\n}\nconst qg = /\\{\\$([a-zA-Z0-9-_]+)\\}/g;\nfunction Eh(s) {\n  return qg.test(s);\n}\nfunction dc(s, e) {\n  if (s.variableList !== null || s.hasVariableRefs) {\n    const t = s.variableList;\n    return e.replace(qg, (r) => {\n      const n = r.substring(2, r.length - 1), i = t == null ? void 0 : t[n];\n      return i === void 0 ? (s.playlistParsingError || (s.playlistParsingError = new Error(`Missing preceding EXT-X-DEFINE tag for Variable Reference: \"${n}\"`)), r) : i;\n    });\n  }\n  return e;\n}\nfunction xh(s, e, t) {\n  let r = s.variableList;\n  r || (s.variableList = r = {});\n  let n, i;\n  if (\"QUERYPARAM\" in e) {\n    n = e.QUERYPARAM;\n    try {\n      const o = new self.URL(t).searchParams;\n      if (o.has(n))\n        i = o.get(n);\n      else\n        throw new Error(`\"${n}\" does not match any query parameter in URI: \"${t}\"`);\n    } catch (o) {\n      s.playlistParsingError || (s.playlistParsingError = new Error(`EXT-X-DEFINE QUERYPARAM: ${o.message}`));\n    }\n  } else\n    n = e.NAME, i = e.VALUE;\n  n in r ? s.playlistParsingError || (s.playlistParsingError = new Error(`EXT-X-DEFINE duplicate Variable Name declarations: \"${n}\"`)) : r[n] = i || \"\";\n}\nfunction Db(s, e, t) {\n  const r = e.IMPORT;\n  if (t && r in t) {\n    let n = s.variableList;\n    n || (s.variableList = n = {}), n[r] = t[r];\n  } else\n    s.playlistParsingError || (s.playlistParsingError = new Error(`EXT-X-DEFINE IMPORT attribute not found in Multivariant Playlist: \"${r}\"`));\n}\nconst Pb = /^(\\d+)x(\\d+)$/, Sh = /(.+?)=(\".*?\"|.*?)(?:,|$)/g;\nclass gt {\n  constructor(e, t) {\n    typeof e == \"string\" && (e = gt.parseAttrList(e, t)), nt(this, e);\n  }\n  get clientAttrs() {\n    return Object.keys(this).filter((e) => e.substring(0, 2) === \"X-\");\n  }\n  decimalInteger(e) {\n    const t = parseInt(this[e], 10);\n    return t > Number.MAX_SAFE_INTEGER ? 1 / 0 : t;\n  }\n  hexadecimalInteger(e) {\n    if (this[e]) {\n      let t = (this[e] || \"0x\").slice(2);\n      t = (t.length & 1 ? \"0\" : \"\") + t;\n      const r = new Uint8Array(t.length / 2);\n      for (let n = 0; n < t.length / 2; n++)\n        r[n] = parseInt(t.slice(n * 2, n * 2 + 2), 16);\n      return r;\n    }\n    return null;\n  }\n  hexadecimalIntegerAsNumber(e) {\n    const t = parseInt(this[e], 16);\n    return t > Number.MAX_SAFE_INTEGER ? 1 / 0 : t;\n  }\n  decimalFloatingPoint(e) {\n    return parseFloat(this[e]);\n  }\n  optionalFloat(e, t) {\n    const r = this[e];\n    return r ? parseFloat(r) : t;\n  }\n  enumeratedString(e) {\n    return this[e];\n  }\n  enumeratedStringList(e, t) {\n    const r = this[e];\n    return (r ? r.split(/[ ,]+/) : []).reduce((n, i) => (n[i.toLowerCase()] = !0, n), t);\n  }\n  bool(e) {\n    return this[e] === \"YES\";\n  }\n  decimalResolution(e) {\n    const t = Pb.exec(this[e]);\n    if (t !== null)\n      return {\n        width: parseInt(t[1], 10),\n        height: parseInt(t[2], 10)\n      };\n  }\n  static parseAttrList(e, t) {\n    let r;\n    const n = {};\n    for (Sh.lastIndex = 0; (r = Sh.exec(e)) !== null; ) {\n      const o = r[1].trim();\n      let a = r[2];\n      const l = a.indexOf('\"') === 0 && a.lastIndexOf('\"') === a.length - 1;\n      let c = !1;\n      if (l)\n        a = a.slice(1, -1);\n      else\n        switch (o) {\n          case \"IV\":\n          case \"SCTE35-CMD\":\n          case \"SCTE35-IN\":\n          case \"SCTE35-OUT\":\n            c = !0;\n        }\n      if (t && (l || c))\n        a = dc(t, a);\n      else if (!c && !l)\n        switch (o) {\n          case \"CLOSED-CAPTIONS\":\n            if (a === \"NONE\")\n              break;\n          // falls through\n          case \"ALLOWED-CPC\":\n          case \"CLASS\":\n          case \"ASSOC-LANGUAGE\":\n          case \"AUDIO\":\n          case \"BYTERANGE\":\n          case \"CHANNELS\":\n          case \"CHARACTERISTICS\":\n          case \"CODECS\":\n          case \"DATA-ID\":\n          case \"END-DATE\":\n          case \"GROUP-ID\":\n          case \"ID\":\n          case \"IMPORT\":\n          case \"INSTREAM-ID\":\n          case \"KEYFORMAT\":\n          case \"KEYFORMATVERSIONS\":\n          case \"LANGUAGE\":\n          case \"NAME\":\n          case \"PATHWAY-ID\":\n          case \"QUERYPARAM\":\n          case \"RECENTLY-REMOVED-DATERANGES\":\n          case \"SERVER-URI\":\n          case \"STABLE-RENDITION-ID\":\n          case \"STABLE-VARIANT-ID\":\n          case \"START-DATE\":\n          case \"SUBTITLES\":\n          case \"SUPPLEMENTAL-CODECS\":\n          case \"URI\":\n          case \"VALUE\":\n          case \"VIDEO\":\n          case \"X-ASSET-LIST\":\n          case \"X-ASSET-URI\":\n            rt.warn(`${e}: attribute ${o} is missing quotes`);\n        }\n      n[o] = a;\n    }\n    return n;\n  }\n}\nconst Mb = \"com.apple.hls.interstitial\";\nfunction Ob(s) {\n  return s !== \"ID\" && s !== \"CLASS\" && s !== \"CUE\" && s !== \"START-DATE\" && s !== \"DURATION\" && s !== \"END-DATE\" && s !== \"END-ON-NEXT\";\n}\nfunction Bb(s) {\n  return s === \"SCTE35-OUT\" || s === \"SCTE35-IN\" || s === \"SCTE35-CMD\";\n}\nclass Wg {\n  constructor(e, t, r = 0) {\n    var n;\n    if (this.attr = void 0, this.tagAnchor = void 0, this.tagOrder = void 0, this._startDate = void 0, this._endDate = void 0, this._dateAtEnd = void 0, this._cue = void 0, this._badValueForSameId = void 0, this.tagAnchor = (t == null ? void 0 : t.tagAnchor) || null, this.tagOrder = (n = t == null ? void 0 : t.tagOrder) != null ? n : r, t) {\n      const i = t.attr;\n      for (const o in i)\n        if (Object.prototype.hasOwnProperty.call(e, o) && e[o] !== i[o]) {\n          rt.warn(`DATERANGE tag attribute: \"${o}\" does not match for tags with ID: \"${e.ID}\"`), this._badValueForSameId = o;\n          break;\n        }\n      e = nt(new gt({}), i, e);\n    }\n    if (this.attr = e, t ? (this._startDate = t._startDate, this._cue = t._cue, this._endDate = t._endDate, this._dateAtEnd = t._dateAtEnd) : this._startDate = new Date(e[\"START-DATE\"]), \"END-DATE\" in this.attr) {\n      const i = (t == null ? void 0 : t.endDate) || new Date(this.attr[\"END-DATE\"]);\n      ue(i.getTime()) && (this._endDate = i);\n    }\n  }\n  get id() {\n    return this.attr.ID;\n  }\n  get class() {\n    return this.attr.CLASS;\n  }\n  get cue() {\n    const e = this._cue;\n    return e === void 0 ? this._cue = this.attr.enumeratedStringList(this.attr.CUE ? \"CUE\" : \"X-CUE\", {\n      pre: !1,\n      post: !1,\n      once: !1\n    }) : e;\n  }\n  get startTime() {\n    const {\n      tagAnchor: e\n    } = this;\n    return e === null || e.programDateTime === null ? (rt.warn(`Expected tagAnchor Fragment with PDT set for DateRange \"${this.id}\": ${e}`), NaN) : e.start + (this.startDate.getTime() - e.programDateTime) / 1e3;\n  }\n  get startDate() {\n    return this._startDate;\n  }\n  get endDate() {\n    const e = this._endDate || this._dateAtEnd;\n    if (e)\n      return e;\n    const t = this.duration;\n    return t !== null ? this._dateAtEnd = new Date(this._startDate.getTime() + t * 1e3) : null;\n  }\n  get duration() {\n    if (\"DURATION\" in this.attr) {\n      const e = this.attr.decimalFloatingPoint(\"DURATION\");\n      if (ue(e))\n        return e;\n    } else if (this._endDate)\n      return (this._endDate.getTime() - this._startDate.getTime()) / 1e3;\n    return null;\n  }\n  get plannedDuration() {\n    return \"PLANNED-DURATION\" in this.attr ? this.attr.decimalFloatingPoint(\"PLANNED-DURATION\") : null;\n  }\n  get endOnNext() {\n    return this.attr.bool(\"END-ON-NEXT\");\n  }\n  get isInterstitial() {\n    return this.class === Mb;\n  }\n  get isValid() {\n    return !!this.id && !this._badValueForSameId && ue(this.startDate.getTime()) && (this.duration === null || this.duration >= 0) && (!this.endOnNext || !!this.class) && (!this.attr.CUE || !this.cue.pre && !this.cue.post || this.cue.pre !== this.cue.post) && (!this.isInterstitial || \"X-ASSET-URI\" in this.attr || \"X-ASSET-LIST\" in this.attr);\n  }\n}\nconst Fb = 10;\nclass Nb {\n  constructor(e) {\n    this.PTSKnown = !1, this.alignedSliding = !1, this.averagetargetduration = void 0, this.endCC = 0, this.endSN = 0, this.fragments = void 0, this.fragmentHint = void 0, this.partList = null, this.dateRanges = void 0, this.dateRangeTagCount = 0, this.live = !0, this.requestScheduled = -1, this.ageHeader = 0, this.advancedDateTime = void 0, this.updated = !0, this.advanced = !0, this.misses = 0, this.startCC = 0, this.startSN = 0, this.startTimeOffset = null, this.targetduration = 0, this.totalduration = 0, this.type = null, this.url = void 0, this.m3u8 = \"\", this.version = null, this.canBlockReload = !1, this.canSkipUntil = 0, this.canSkipDateRanges = !1, this.skippedSegments = 0, this.recentlyRemovedDateranges = void 0, this.partHoldBack = 0, this.holdBack = 0, this.partTarget = 0, this.preloadHint = void 0, this.renditionReports = void 0, this.tuneInGoal = 0, this.deltaUpdateFailed = void 0, this.driftStartTime = 0, this.driftEndTime = 0, this.driftStart = 0, this.driftEnd = 0, this.encryptedFragments = void 0, this.playlistParsingError = null, this.variableList = null, this.hasVariableRefs = !1, this.appliedTimelineOffset = void 0, this.fragments = [], this.encryptedFragments = [], this.dateRanges = {}, this.url = e;\n  }\n  reloaded(e) {\n    if (!e) {\n      this.advanced = !0, this.updated = !0;\n      return;\n    }\n    const t = this.lastPartSn - e.lastPartSn, r = this.lastPartIndex - e.lastPartIndex;\n    this.updated = this.endSN !== e.endSN || !!r || !!t || !this.live, this.advanced = this.endSN > e.endSN || t > 0 || t === 0 && r > 0, this.updated || this.advanced ? this.misses = Math.floor(e.misses * 0.6) : this.misses = e.misses + 1;\n  }\n  hasKey(e) {\n    return this.encryptedFragments.some((t) => {\n      let r = t.decryptdata;\n      return r || (t.setKeyFormat(e.keyFormat), r = t.decryptdata), !!r && e.matches(r);\n    });\n  }\n  get hasProgramDateTime() {\n    return this.fragments.length ? ue(this.fragments[this.fragments.length - 1].programDateTime) : !1;\n  }\n  get levelTargetDuration() {\n    return this.averagetargetduration || this.targetduration || Fb;\n  }\n  get drift() {\n    const e = this.driftEndTime - this.driftStartTime;\n    return e > 0 ? (this.driftEnd - this.driftStart) * 1e3 / e : 1;\n  }\n  get edge() {\n    return this.partEnd || this.fragmentEnd;\n  }\n  get partEnd() {\n    var e;\n    return (e = this.partList) != null && e.length ? this.partList[this.partList.length - 1].end : this.fragmentEnd;\n  }\n  get fragmentEnd() {\n    return this.fragments.length ? this.fragments[this.fragments.length - 1].end : 0;\n  }\n  get fragmentStart() {\n    return this.fragments.length ? this.fragments[0].start : 0;\n  }\n  get age() {\n    return this.advancedDateTime ? Math.max(Date.now() - this.advancedDateTime, 0) / 1e3 : 0;\n  }\n  get lastPartIndex() {\n    var e;\n    return (e = this.partList) != null && e.length ? this.partList[this.partList.length - 1].index : -1;\n  }\n  get maxPartIndex() {\n    const e = this.partList;\n    if (e) {\n      const t = this.lastPartIndex;\n      if (t !== -1) {\n        for (let r = e.length; r--; )\n          if (e[r].index > t)\n            return e[r].index;\n        return t;\n      }\n    }\n    return 0;\n  }\n  get lastPartSn() {\n    var e;\n    return (e = this.partList) != null && e.length ? this.partList[this.partList.length - 1].fragment.sn : this.endSN;\n  }\n  get expired() {\n    if (this.live && this.age && this.misses < 3) {\n      const e = this.partEnd - this.fragmentStart;\n      return this.age > Math.max(e, this.totalduration) + this.levelTargetDuration;\n    }\n    return !1;\n  }\n}\nfunction xu(s, e) {\n  return s.length === e.length ? !s.some((t, r) => t !== e[r]) : !1;\n}\nfunction bh(s, e) {\n  return !s && !e ? !0 : !s || !e ? !1 : xu(s, e);\n}\nfunction In(s) {\n  return s === \"AES-128\" || s === \"AES-256\" || s === \"AES-256-CTR\";\n}\nfunction Su(s) {\n  switch (s) {\n    case \"AES-128\":\n    case \"AES-256\":\n      return Os.cbc;\n    case \"AES-256-CTR\":\n      return Os.ctr;\n    default:\n      throw new Error(`invalid full segment method ${s}`);\n  }\n}\nfunction bu(s) {\n  return Uint8Array.from(atob(s), (e) => e.charCodeAt(0));\n}\nfunction hc(s) {\n  return Uint8Array.from(unescape(encodeURIComponent(s)), (e) => e.charCodeAt(0));\n}\nfunction Ub(s) {\n  const e = hc(s).subarray(0, 16), t = new Uint8Array(16);\n  return t.set(e, 16 - e.length), t;\n}\nfunction zg(s) {\n  const e = function(r, n, i) {\n    const o = r[n];\n    r[n] = r[i], r[i] = o;\n  };\n  e(s, 0, 3), e(s, 1, 2), e(s, 4, 5), e(s, 6, 7);\n}\nfunction $b(s) {\n  const e = s.split(\":\");\n  let t = null;\n  if (e[0] === \"data\" && e.length === 2) {\n    const r = e[1].split(\";\"), n = r[r.length - 1].split(\",\");\n    if (n.length === 2) {\n      const i = n[0] === \"base64\", o = n[1];\n      i ? (r.splice(-1, 1), t = bu(o)) : t = Ub(o);\n    }\n  }\n  return t;\n}\nconst ra = typeof self < \"u\" ? self : void 0;\nvar mt = {\n  CLEARKEY: \"org.w3.clearkey\",\n  FAIRPLAY: \"com.apple.fps\",\n  PLAYREADY: \"com.microsoft.playready\",\n  WIDEVINE: \"com.widevine.alpha\"\n}, lr = {\n  CLEARKEY: \"org.w3.clearkey\",\n  FAIRPLAY: \"com.apple.streamingkeydelivery\",\n  PLAYREADY: \"com.microsoft.playready\",\n  WIDEVINE: \"urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed\"\n};\nfunction po(s) {\n  switch (s) {\n    case lr.FAIRPLAY:\n      return mt.FAIRPLAY;\n    case lr.PLAYREADY:\n      return mt.PLAYREADY;\n    case lr.WIDEVINE:\n      return mt.WIDEVINE;\n    case lr.CLEARKEY:\n      return mt.CLEARKEY;\n  }\n}\nfunction fl(s) {\n  switch (s) {\n    case mt.FAIRPLAY:\n      return lr.FAIRPLAY;\n    case mt.PLAYREADY:\n      return lr.PLAYREADY;\n    case mt.WIDEVINE:\n      return lr.WIDEVINE;\n    case mt.CLEARKEY:\n      return lr.CLEARKEY;\n  }\n}\nfunction zn(s) {\n  const {\n    drmSystems: e,\n    widevineLicenseUrl: t\n  } = s, r = e ? [mt.FAIRPLAY, mt.WIDEVINE, mt.PLAYREADY, mt.CLEARKEY].filter((n) => !!e[n]) : [];\n  return !r[mt.WIDEVINE] && t && r.push(mt.WIDEVINE), r;\n}\nconst Yg = (function(s) {\n  return ra != null && (s = ra.navigator) != null && s.requestMediaKeySystemAccess ? self.navigator.requestMediaKeySystemAccess.bind(self.navigator) : null;\n})();\nfunction Gb(s, e, t, r) {\n  let n;\n  switch (s) {\n    case mt.FAIRPLAY:\n      n = [\"cenc\", \"sinf\"];\n      break;\n    case mt.WIDEVINE:\n    case mt.PLAYREADY:\n      n = [\"cenc\"];\n      break;\n    case mt.CLEARKEY:\n      n = [\"cenc\", \"keyids\"];\n      break;\n    default:\n      throw new Error(`Unknown key-system: ${s}`);\n  }\n  return Vb(n, e, t, r);\n}\nfunction Vb(s, e, t, r) {\n  return [{\n    initDataTypes: s,\n    persistentState: r.persistentState || \"optional\",\n    distinctiveIdentifier: r.distinctiveIdentifier || \"optional\",\n    sessionTypes: r.sessionTypes || [r.sessionType || \"temporary\"],\n    audioCapabilities: e.map((i) => ({\n      contentType: `audio/mp4; codecs=${i}`,\n      robustness: r.audioRobustness || \"\",\n      encryptionScheme: r.audioEncryptionScheme || null\n    })),\n    videoCapabilities: t.map((i) => ({\n      contentType: `video/mp4; codecs=${i}`,\n      robustness: r.videoRobustness || \"\",\n      encryptionScheme: r.videoEncryptionScheme || null\n    }))\n  }];\n}\nfunction jb(s) {\n  var e;\n  return !!s && (s.sessionType === \"persistent-license\" || !!((e = s.sessionTypes) != null && e.some((t) => t === \"persistent-license\")));\n}\nfunction Kb(s) {\n  const e = new Uint16Array(s.buffer, s.byteOffset, s.byteLength / 2), t = String.fromCharCode.apply(null, Array.from(e)), r = t.substring(t.indexOf(\"<\"), t.length), o = new DOMParser().parseFromString(r, \"text/xml\").getElementsByTagName(\"KID\")[0];\n  if (o) {\n    const a = o.childNodes[0] ? o.childNodes[0].nodeValue : o.getAttribute(\"VALUE\");\n    if (a) {\n      const l = bu(a).subarray(0, 16);\n      return zg(l), l;\n    }\n  }\n  return null;\n}\nlet Wi = {};\nclass yi {\n  static clearKeyUriToKeyIdMap() {\n    Wi = {};\n  }\n  static setKeyIdForUri(e, t) {\n    Wi[e] = t;\n  }\n  constructor(e, t, r, n = [1], i = null, o) {\n    this.uri = void 0, this.method = void 0, this.keyFormat = void 0, this.keyFormatVersions = void 0, this.encrypted = void 0, this.isCommonEncryption = void 0, this.iv = null, this.key = null, this.keyId = null, this.pssh = null, this.method = e, this.uri = t, this.keyFormat = r, this.keyFormatVersions = n, this.iv = i, this.encrypted = e ? e !== \"NONE\" : !1, this.isCommonEncryption = this.encrypted && !In(e), o != null && o.startsWith(\"0x\") && (this.keyId = new Uint8Array(Ig(o)));\n  }\n  matches(e) {\n    return e.uri === this.uri && e.method === this.method && e.encrypted === this.encrypted && e.keyFormat === this.keyFormat && xu(e.keyFormatVersions, this.keyFormatVersions) && bh(e.iv, this.iv) && bh(e.keyId, this.keyId);\n  }\n  isSupported() {\n    if (this.method) {\n      if (In(this.method) || this.method === \"NONE\")\n        return !0;\n      if (this.keyFormat === \"identity\")\n        return this.method === \"SAMPLE-AES\";\n      switch (this.keyFormat) {\n        case lr.FAIRPLAY:\n        case lr.WIDEVINE:\n        case lr.PLAYREADY:\n        case lr.CLEARKEY:\n          return [\"SAMPLE-AES\", \"SAMPLE-AES-CENC\", \"SAMPLE-AES-CTR\"].indexOf(this.method) !== -1;\n      }\n    }\n    return !1;\n  }\n  getDecryptData(e) {\n    if (!this.encrypted || !this.uri)\n      return null;\n    if (In(this.method)) {\n      let n = this.iv;\n      return n || (typeof e != \"number\" && (rt.warn(`missing IV for initialization segment with method=\"${this.method}\" - compliance issue`), e = 0), n = Hb(e)), new yi(this.method, this.uri, \"identity\", this.keyFormatVersions, n);\n    }\n    if (this.pssh && this.keyId)\n      return this;\n    const t = $b(this.uri);\n    if (t)\n      switch (this.keyFormat) {\n        case lr.WIDEVINE:\n          if (this.pssh = t, !this.keyId) {\n            const n = WS(t.buffer);\n            if (n.length) {\n              var r;\n              const i = n[0];\n              this.keyId = (r = i.kids) != null && r.length ? i.kids[0] : null;\n            }\n          }\n          if (!this.keyId) {\n            const n = t.length - 22;\n            this.keyId = t.subarray(n, n + 16);\n          }\n          break;\n        case lr.PLAYREADY: {\n          const n = new Uint8Array([154, 4, 240, 121, 152, 64, 66, 134, 171, 146, 230, 91, 224, 136, 95, 149]);\n          this.pssh = qS(n, null, t), this.keyId = Kb(t);\n          break;\n        }\n        default: {\n          let n = t.subarray(0, 16);\n          if (n.length !== 16) {\n            const i = new Uint8Array(16);\n            i.set(n, 16 - n.length), n = i;\n          }\n          this.keyId = n;\n          break;\n        }\n      }\n    if (!this.keyId || this.keyId.byteLength !== 16) {\n      let n = Wi[this.uri];\n      if (!n) {\n        const i = Object.keys(Wi).length % Number.MAX_SAFE_INTEGER;\n        n = new Uint8Array(16), new DataView(n.buffer, 12, 4).setUint32(0, i), yi.setKeyIdForUri(this.uri, n);\n      }\n      this.keyId = n;\n    }\n    return this;\n  }\n}\nfunction Hb(s) {\n  const e = new Uint8Array(16);\n  for (let t = 12; t < 16; t++)\n    e[t] = s >> 8 * (15 - t) & 255;\n  return e;\n}\nconst Th = /#EXT-X-STREAM-INF:([^\\r\\n]*)(?:[\\r\\n](?:#[^\\r\\n]*)?)*([^\\r\\n]+)|#EXT-X-(SESSION-DATA|SESSION-KEY|DEFINE|CONTENT-STEERING|START):([^\\r\\n]*)[\\r\\n]+/g, wh = /#EXT-X-MEDIA:(.*)/g, qb = /^#EXT(?:INF|-X-TARGETDURATION):/m, gl = new RegExp([\n  /#EXTINF:\\s*(\\d*(?:\\.\\d+)?)(?:,(.*)\\s+)?/.source,\n  // duration (#EXTINF:<duration>,<title>), group 1 => duration, group 2 => title\n  /(?!#) *(\\S[^\\r\\n]*)/.source,\n  // segment URI, group 3 => the URI (note newline is not eaten)\n  /#.*/.source\n  // All other non-segment oriented tags will match with all groups empty\n].join(\"|\"), \"g\"), Wb = new RegExp([/#EXT-X-(PROGRAM-DATE-TIME|BYTERANGE|DATERANGE|DEFINE|KEY|MAP|PART|PART-INF|PLAYLIST-TYPE|PRELOAD-HINT|RENDITION-REPORT|SERVER-CONTROL|SKIP|START):(.+)/.source, /#EXT-X-(BITRATE|DISCONTINUITY-SEQUENCE|MEDIA-SEQUENCE|TARGETDURATION|VERSION): *(\\d+)/.source, /#EXT-X-(DISCONTINUITY|ENDLIST|GAP|INDEPENDENT-SEGMENTS)/.source, /(#)([^:]*):(.*)/.source, /(#)(.*)(?:.*)\\r?\\n?/.source].join(\"|\"));\nclass zr {\n  static findGroup(e, t) {\n    for (let r = 0; r < e.length; r++) {\n      const n = e[r];\n      if (n.id === t)\n        return n;\n    }\n  }\n  static resolve(e, t) {\n    return hu.buildAbsoluteURL(t, e, {\n      alwaysNormalize: !0\n    });\n  }\n  static isMediaPlaylist(e) {\n    return qb.test(e);\n  }\n  static parseMasterPlaylist(e, t) {\n    const r = Eh(e), n = {\n      contentSteering: null,\n      levels: [],\n      playlistParsingError: null,\n      sessionData: null,\n      sessionKeys: null,\n      startTimeOffset: null,\n      variableList: null,\n      hasVariableRefs: r\n    }, i = [];\n    if (Th.lastIndex = 0, !e.startsWith(\"#EXTM3U\"))\n      return n.playlistParsingError = new Error(\"no EXTM3U delimiter\"), n;\n    let o;\n    for (; (o = Th.exec(e)) != null; )\n      if (o[1]) {\n        var a;\n        const c = new gt(o[1], n), u = dc(n, o[2]), d = {\n          attrs: c,\n          bitrate: c.decimalInteger(\"BANDWIDTH\") || c.decimalInteger(\"AVERAGE-BANDWIDTH\"),\n          name: c.NAME,\n          url: zr.resolve(u, t)\n        }, h = c.decimalResolution(\"RESOLUTION\");\n        h && (d.width = h.width, d.height = h.height), _h(c.CODECS, d);\n        const f = c[\"SUPPLEMENTAL-CODECS\"];\n        f && (d.supplemental = {}, _h(f, d.supplemental)), (a = d.unknownCodecs) != null && a.length || i.push(d), n.levels.push(d);\n      } else if (o[3]) {\n        const c = o[3], u = o[4];\n        switch (c) {\n          case \"SESSION-DATA\": {\n            const d = new gt(u, n), h = d[\"DATA-ID\"];\n            h && (n.sessionData === null && (n.sessionData = {}), n.sessionData[h] = d);\n            break;\n          }\n          case \"SESSION-KEY\": {\n            const d = Ah(u, t, n);\n            d.encrypted && d.isSupported() ? (n.sessionKeys === null && (n.sessionKeys = []), n.sessionKeys.push(d)) : rt.warn(`[Keys] Ignoring invalid EXT-X-SESSION-KEY tag: \"${u}\"`);\n            break;\n          }\n          case \"DEFINE\": {\n            {\n              const d = new gt(u, n);\n              xh(n, d, t);\n            }\n            break;\n          }\n          case \"CONTENT-STEERING\": {\n            const d = new gt(u, n);\n            n.contentSteering = {\n              uri: zr.resolve(d[\"SERVER-URI\"], t),\n              pathwayId: d[\"PATHWAY-ID\"] || \".\"\n            };\n            break;\n          }\n          case \"START\": {\n            n.startTimeOffset = Ih(u);\n            break;\n          }\n        }\n      }\n    const l = i.length > 0 && i.length < n.levels.length;\n    return n.levels = l ? i : n.levels, n.levels.length === 0 && (n.playlistParsingError = new Error(\"no levels found in manifest\")), n;\n  }\n  static parseMasterPlaylistMedia(e, t, r) {\n    let n;\n    const i = {}, o = r.levels, a = {\n      AUDIO: o.map((c) => ({\n        id: c.attrs.AUDIO,\n        audioCodec: c.audioCodec\n      })),\n      SUBTITLES: o.map((c) => ({\n        id: c.attrs.SUBTITLES,\n        textCodec: c.textCodec\n      })),\n      \"CLOSED-CAPTIONS\": []\n    };\n    let l = 0;\n    for (wh.lastIndex = 0; (n = wh.exec(e)) !== null; ) {\n      const c = new gt(n[1], r), u = c.TYPE;\n      if (u) {\n        const d = a[u], h = i[u] || [];\n        i[u] = h;\n        const f = c.LANGUAGE, p = c[\"ASSOC-LANGUAGE\"], y = c.CHANNELS, E = c.CHARACTERISTICS, b = c[\"INSTREAM-ID\"], R = {\n          attrs: c,\n          bitrate: 0,\n          id: l++,\n          groupId: c[\"GROUP-ID\"] || \"\",\n          name: c.NAME || f || \"\",\n          type: u,\n          default: c.bool(\"DEFAULT\"),\n          autoselect: c.bool(\"AUTOSELECT\"),\n          forced: c.bool(\"FORCED\"),\n          lang: f,\n          url: c.URI ? zr.resolve(c.URI, t) : \"\"\n        };\n        if (p && (R.assocLang = p), y && (R.channels = y), E && (R.characteristics = E), b && (R.instreamId = b), d != null && d.length) {\n          const A = zr.findGroup(d, R.groupId) || d[0];\n          Rh(R, A, \"audioCodec\"), Rh(R, A, \"textCodec\");\n        }\n        h.push(R);\n      }\n    }\n    return i;\n  }\n  static parseLevelPlaylist(e, t, r, n, i, o) {\n    var a;\n    const l = {\n      url: t\n    }, c = new Nb(t), u = c.fragments, d = [];\n    let h = null, f = 0, p = 0, y = 0, E = 0, b = 0, R = null, A = new ul(n, l), F, M, H, K = -1, j = !1, C = null, k;\n    if (gl.lastIndex = 0, c.m3u8 = e, c.hasVariableRefs = Eh(e), ((a = gl.exec(e)) == null ? void 0 : a[0]) !== \"#EXTM3U\")\n      return c.playlistParsingError = new Error(\"Missing format identifier #EXTM3U\"), c;\n    for (; (F = gl.exec(e)) !== null; ) {\n      j && (j = !1, A = new ul(n, l), A.playlistOffset = y, A.setStart(y), A.sn = f, A.cc = E, b && (A.bitrate = b), A.level = r, h && (A.initSegment = h, h.rawProgramDateTime && (A.rawProgramDateTime = h.rawProgramDateTime, h.rawProgramDateTime = null), C && (A.setByteRange(C), C = null)));\n      const g = F[1];\n      if (g) {\n        A.duration = parseFloat(g);\n        const x = (\" \" + F[2]).slice(1);\n        A.title = x || null, A.tagList.push(x ? [\"INF\", g, x] : [\"INF\", g]);\n      } else if (F[3]) {\n        if (ue(A.duration)) {\n          A.playlistOffset = y, A.setStart(y), H && Ch(A, H, c), A.sn = f, A.level = r, A.cc = E, u.push(A);\n          const x = (\" \" + F[3]).slice(1);\n          A.relurl = dc(c, x), fc(A, R, d), R = A, y += A.duration, f++, p = 0, j = !0;\n        }\n      } else {\n        if (F = F[0].match(Wb), !F) {\n          rt.warn(\"No matches on slow regex match for level playlist!\");\n          continue;\n        }\n        for (M = 1; M < F.length && F[M] === void 0; M++)\n          ;\n        const x = (\" \" + F[M]).slice(1), w = (\" \" + F[M + 1]).slice(1), D = F[M + 2] ? (\" \" + F[M + 2]).slice(1) : null;\n        switch (x) {\n          case \"BYTERANGE\":\n            R ? A.setByteRange(w, R) : A.setByteRange(w);\n            break;\n          case \"PROGRAM-DATE-TIME\":\n            A.rawProgramDateTime = w, A.tagList.push([\"PROGRAM-DATE-TIME\", w]), K === -1 && (K = u.length);\n            break;\n          case \"PLAYLIST-TYPE\":\n            c.type && ns(c, x, F), c.type = w.toUpperCase();\n            break;\n          case \"MEDIA-SEQUENCE\":\n            c.startSN !== 0 ? ns(c, x, F) : u.length > 0 && kh(c, x, F), f = c.startSN = parseInt(w);\n            break;\n          case \"SKIP\": {\n            c.skippedSegments && ns(c, x, F);\n            const O = new gt(w, c), U = O.decimalInteger(\"SKIPPED-SEGMENTS\");\n            if (ue(U)) {\n              c.skippedSegments += U;\n              for (let L = U; L--; )\n                u.push(null);\n              f += U;\n            }\n            const V = O.enumeratedString(\"RECENTLY-REMOVED-DATERANGES\");\n            V && (c.recentlyRemovedDateranges = (c.recentlyRemovedDateranges || []).concat(V.split(\"\t\")));\n            break;\n          }\n          case \"TARGETDURATION\":\n            c.targetduration !== 0 && ns(c, x, F), c.targetduration = Math.max(parseInt(w), 1);\n            break;\n          case \"VERSION\":\n            c.version !== null && ns(c, x, F), c.version = parseInt(w);\n            break;\n          case \"INDEPENDENT-SEGMENTS\":\n            break;\n          case \"ENDLIST\":\n            c.live || ns(c, x, F), c.live = !1;\n            break;\n          case \"#\":\n            (w || D) && A.tagList.push(D ? [w, D] : [w]);\n            break;\n          case \"DISCONTINUITY\":\n            E++, A.tagList.push([\"DIS\"]);\n            break;\n          case \"GAP\":\n            A.gap = !0, A.tagList.push([x]);\n            break;\n          case \"BITRATE\":\n            A.tagList.push([x, w]), b = parseInt(w) * 1e3, ue(b) ? A.bitrate = b : b = 0;\n            break;\n          case \"DATERANGE\": {\n            const O = new gt(w, c), U = new Wg(O, c.dateRanges[O.ID], c.dateRangeTagCount);\n            c.dateRangeTagCount++, U.isValid || c.skippedSegments ? c.dateRanges[U.id] = U : rt.warn(`Ignoring invalid DATERANGE tag: \"${w}\"`), A.tagList.push([\"EXT-X-DATERANGE\", w]);\n            break;\n          }\n          case \"DEFINE\": {\n            {\n              const O = new gt(w, c);\n              \"IMPORT\" in O ? Db(c, O, o) : xh(c, O, t);\n            }\n            break;\n          }\n          case \"DISCONTINUITY-SEQUENCE\":\n            c.startCC !== 0 ? ns(c, x, F) : u.length > 0 && kh(c, x, F), c.startCC = E = parseInt(w);\n            break;\n          case \"KEY\": {\n            const O = Ah(w, t, c);\n            if (O.isSupported()) {\n              if (O.method === \"NONE\") {\n                H = void 0;\n                break;\n              }\n              H || (H = {});\n              const U = H[O.keyFormat];\n              U != null && U.matches(O) || (U && (H = nt({}, H)), H[O.keyFormat] = O);\n            } else\n              rt.warn(`[Keys] Ignoring unsupported EXT-X-KEY tag: \"${w}\"`);\n            break;\n          }\n          case \"START\":\n            c.startTimeOffset = Ih(w);\n            break;\n          case \"MAP\": {\n            const O = new gt(w, c);\n            if (A.duration) {\n              const U = new ul(n, l);\n              Lh(U, O, r, H), h = U, A.initSegment = h, h.rawProgramDateTime && !A.rawProgramDateTime && (A.rawProgramDateTime = h.rawProgramDateTime);\n            } else {\n              const U = A.byteRangeEndOffset;\n              if (U) {\n                const V = A.byteRangeStartOffset;\n                C = `${U - V}@${V}`;\n              } else\n                C = null;\n              Lh(A, O, r, H), h = A, j = !0;\n            }\n            h.cc = E;\n            break;\n          }\n          case \"SERVER-CONTROL\": {\n            k && ns(c, x, F), k = new gt(w), c.canBlockReload = k.bool(\"CAN-BLOCK-RELOAD\"), c.canSkipUntil = k.optionalFloat(\"CAN-SKIP-UNTIL\", 0), c.canSkipDateRanges = c.canSkipUntil > 0 && k.bool(\"CAN-SKIP-DATERANGES\"), c.partHoldBack = k.optionalFloat(\"PART-HOLD-BACK\", 0), c.holdBack = k.optionalFloat(\"HOLD-BACK\", 0);\n            break;\n          }\n          case \"PART-INF\": {\n            c.partTarget && ns(c, x, F);\n            const O = new gt(w);\n            c.partTarget = O.decimalFloatingPoint(\"PART-TARGET\");\n            break;\n          }\n          case \"PART\": {\n            let O = c.partList;\n            O || (O = c.partList = []);\n            const U = p > 0 ? O[O.length - 1] : void 0, V = p++, L = new gt(w, c), m = new PS(L, A, l, V, U);\n            O.push(m), A.duration += m.duration;\n            break;\n          }\n          case \"PRELOAD-HINT\": {\n            const O = new gt(w, c);\n            c.preloadHint = O;\n            break;\n          }\n          case \"RENDITION-REPORT\": {\n            const O = new gt(w, c);\n            c.renditionReports = c.renditionReports || [], c.renditionReports.push(O);\n            break;\n          }\n          default:\n            rt.warn(`line parsed but not handled: ${F}`);\n            break;\n        }\n      }\n    }\n    R && !R.relurl ? (u.pop(), y -= R.duration, c.partList && (c.fragmentHint = R)) : c.partList && (fc(A, R, d), A.cc = E, c.fragmentHint = A, H && Ch(A, H, c)), c.targetduration || (c.playlistParsingError = new Error(\"Missing Target Duration\"));\n    const $ = u.length, W = u[0], _ = u[$ - 1];\n    if (y += c.skippedSegments * c.targetduration, y > 0 && $ && _) {\n      c.averagetargetduration = y / $;\n      const g = _.sn;\n      c.endSN = g !== \"initSegment\" ? g : 0, c.live || (_.endList = !0), K > 0 && (Yb(u, K), W && d.unshift(W));\n    }\n    return c.fragmentHint && (y += c.fragmentHint.duration), c.totalduration = y, d.length && c.dateRangeTagCount && W && Zg(d, c), c.endCC = E, c;\n  }\n}\nfunction Zg(s, e) {\n  let t = s.length;\n  if (!t)\n    if (e.hasProgramDateTime) {\n      const a = e.fragments[e.fragments.length - 1];\n      s.push(a), t++;\n    } else\n      return;\n  const r = s[t - 1], n = e.live ? 1 / 0 : e.totalduration, i = Object.keys(e.dateRanges);\n  for (let a = i.length; a--; ) {\n    const l = e.dateRanges[i[a]], c = l.startDate.getTime();\n    l.tagAnchor = r.ref;\n    for (let u = t; u--; ) {\n      var o;\n      if (((o = s[u]) == null ? void 0 : o.sn) < e.startSN)\n        break;\n      const d = zb(e, c, s, u, n);\n      if (d !== -1) {\n        l.tagAnchor = e.fragments[d].ref;\n        break;\n      }\n    }\n  }\n}\nfunction zb(s, e, t, r, n) {\n  const i = t[r];\n  if (i) {\n    const a = i.programDateTime;\n    if (e >= a || r === 0) {\n      var o;\n      const l = (((o = t[r + 1]) == null ? void 0 : o.start) || n) - i.start;\n      if (e <= a + l * 1e3) {\n        const c = t[r].sn - s.startSN;\n        if (c < 0)\n          return -1;\n        const u = s.fragments;\n        if (u.length > t.length) {\n          const h = (t[r + 1] || u[u.length - 1]).sn - s.startSN;\n          for (let f = h; f > c; f--) {\n            const p = u[f].programDateTime;\n            if (e >= p && e < p + u[f].duration * 1e3)\n              return f;\n          }\n        }\n        return c;\n      }\n    }\n  }\n  return -1;\n}\nfunction Ah(s, e, t) {\n  var r, n;\n  const i = new gt(s, t), o = (r = i.METHOD) != null ? r : \"\", a = i.URI, l = i.hexadecimalInteger(\"IV\"), c = i.KEYFORMATVERSIONS, u = (n = i.KEYFORMAT) != null ? n : \"identity\";\n  a && i.IV && !l && rt.error(`Invalid IV: ${i.IV}`);\n  const d = a ? zr.resolve(a, e) : \"\", h = (c || \"1\").split(\"/\").map(Number).filter(Number.isFinite);\n  return new yi(o, d, u, h, l, i.KEYID);\n}\nfunction Ih(s) {\n  const t = new gt(s).decimalFloatingPoint(\"TIME-OFFSET\");\n  return ue(t) ? t : null;\n}\nfunction _h(s, e) {\n  let t = (s || \"\").split(/[ ,]+/).filter((r) => r);\n  [\"video\", \"audio\", \"text\"].forEach((r) => {\n    const n = t.filter((i) => pu(i, r));\n    n.length && (e[`${r}Codec`] = n.map((i) => i.split(\"/\")[0]).join(\",\"), t = t.filter((i) => n.indexOf(i) === -1));\n  }), e.unknownCodecs = t;\n}\nfunction Rh(s, e, t) {\n  const r = e[t];\n  r && (s[t] = r);\n}\nfunction Yb(s, e) {\n  let t = s[e];\n  for (let r = e; r--; ) {\n    const n = s[r];\n    if (!n)\n      return;\n    n.programDateTime = t.programDateTime - n.duration * 1e3, t = n;\n  }\n}\nfunction fc(s, e, t) {\n  s.rawProgramDateTime ? t.push(s) : e != null && e.programDateTime && (s.programDateTime = e.endProgramDateTime);\n}\nfunction Lh(s, e, t, r) {\n  s.relurl = e.URI, e.BYTERANGE && s.setByteRange(e.BYTERANGE), s.level = t, s.sn = \"initSegment\", r && (s.levelkeys = r), s.initSegment = null;\n}\nfunction Ch(s, e, t) {\n  s.levelkeys = e;\n  const {\n    encryptedFragments: r\n  } = t;\n  (!r.length || r[r.length - 1].levelkeys !== e) && Object.keys(e).some((n) => e[n].isCommonEncryption) && r.push(s);\n}\nfunction ns(s, e, t) {\n  s.playlistParsingError = new Error(`#EXT-X-${e} must not appear more than once (${t[0]})`);\n}\nfunction kh(s, e, t) {\n  s.playlistParsingError = new Error(`#EXT-X-${e} must appear before the first Media Segment (${t[0]})`);\n}\nfunction pl(s, e) {\n  const t = e.startPTS;\n  if (ue(t)) {\n    let r = 0, n;\n    e.sn > s.sn ? (r = t - s.start, n = s) : (r = s.start - t, n = e), n.duration !== r && n.setDuration(r);\n  } else e.sn > s.sn ? s.cc === e.cc && s.minEndPTS ? e.setStart(s.start + (s.minEndPTS - s.start)) : e.setStart(s.start + s.duration) : e.setStart(Math.max(s.start - e.duration, 0));\n}\nfunction Xg(s, e, t, r, n, i, o) {\n  r - t <= 0 && (o.warn(\"Fragment should have a positive duration\", e), r = t + e.duration, i = n + e.duration);\n  let l = t, c = r;\n  const u = e.startPTS, d = e.endPTS;\n  if (ue(u)) {\n    const b = Math.abs(u - t);\n    s && b > s.totalduration ? o.warn(`media timestamps and playlist times differ by ${b}s for level ${e.level} ${s.url}`) : ue(e.deltaPTS) ? e.deltaPTS = Math.max(b, e.deltaPTS) : e.deltaPTS = b, l = Math.max(t, u), t = Math.min(t, u), n = e.startDTS !== void 0 ? Math.min(n, e.startDTS) : n, c = Math.min(r, d), r = Math.max(r, d), i = e.endDTS !== void 0 ? Math.max(i, e.endDTS) : i;\n  }\n  const h = t - e.start;\n  e.start !== 0 && e.setStart(t), e.setDuration(r - e.start), e.startPTS = t, e.maxStartPTS = l, e.startDTS = n, e.endPTS = r, e.minEndPTS = c, e.endDTS = i;\n  const f = e.sn;\n  if (!s || f < s.startSN || f > s.endSN)\n    return 0;\n  let p;\n  const y = f - s.startSN, E = s.fragments;\n  for (E[y] = e, p = y; p > 0; p--)\n    pl(E[p], E[p - 1]);\n  for (p = y; p < E.length - 1; p++)\n    pl(E[p], E[p + 1]);\n  return s.fragmentHint && pl(E[E.length - 1], s.fragmentHint), s.PTSKnown = s.alignedSliding = !0, h;\n}\nfunction Zb(s, e, t) {\n  if (s === e)\n    return;\n  let r = null;\n  const n = s.fragments;\n  for (let u = n.length - 1; u >= 0; u--) {\n    const d = n[u].initSegment;\n    if (d) {\n      r = d;\n      break;\n    }\n  }\n  s.fragmentHint && delete s.fragmentHint.endPTS;\n  let i;\n  Qb(s, e, (u, d, h, f) => {\n    if ((!e.startCC || e.skippedSegments) && d.cc !== u.cc) {\n      const p = u.cc - d.cc;\n      for (let y = h; y < f.length; y++)\n        f[y].cc += p;\n      e.endCC = f[f.length - 1].cc;\n    }\n    ue(u.startPTS) && ue(u.endPTS) && (d.setStart(d.startPTS = u.startPTS), d.startDTS = u.startDTS, d.maxStartPTS = u.maxStartPTS, d.endPTS = u.endPTS, d.endDTS = u.endDTS, d.minEndPTS = u.minEndPTS, d.setDuration(u.endPTS - u.startPTS), d.duration && (i = d), e.PTSKnown = e.alignedSliding = !0), u.hasStreams && (d.elementaryStreams = u.elementaryStreams), d.loader = u.loader, u.hasStats && (d.stats = u.stats), u.initSegment && (d.initSegment = u.initSegment, r = u.initSegment);\n  });\n  const o = e.fragments, a = e.fragmentHint ? o.concat(e.fragmentHint) : o;\n  if (r && a.forEach((u) => {\n    var d;\n    u && (!u.initSegment || u.initSegment.relurl === ((d = r) == null ? void 0 : d.relurl)) && (u.initSegment = r);\n  }), e.skippedSegments) {\n    if (e.deltaUpdateFailed = o.some((u) => !u), e.deltaUpdateFailed) {\n      t.warn(\"[level-helper] Previous playlist missing segments skipped in delta playlist\");\n      for (let u = e.skippedSegments; u--; )\n        o.shift();\n      e.startSN = o[0].sn;\n    } else {\n      e.canSkipDateRanges && (e.dateRanges = Xb(s.dateRanges, e, t));\n      const u = s.fragments.filter((d) => d.rawProgramDateTime);\n      if (s.hasProgramDateTime && !e.hasProgramDateTime)\n        for (let d = 1; d < a.length; d++)\n          a[d].programDateTime === null && fc(a[d], a[d - 1], u);\n      Zg(u, e);\n    }\n    e.endCC = o[o.length - 1].cc;\n  }\n  if (!e.startCC) {\n    var l;\n    const u = ep(s, e.startSN - 1);\n    e.startCC = (l = u == null ? void 0 : u.cc) != null ? l : o[0].cc;\n  }\n  Jb(s.partList, e.partList, (u, d) => {\n    d.elementaryStreams = u.elementaryStreams, d.stats = u.stats;\n  }), i ? Xg(e, i, i.startPTS, i.endPTS, i.startDTS, i.endDTS, t) : Jg(s, e), o.length && (e.totalduration = e.edge - o[0].start), e.driftStartTime = s.driftStartTime, e.driftStart = s.driftStart;\n  const c = e.advancedDateTime;\n  if (e.advanced && c) {\n    const u = e.edge;\n    e.driftStart || (e.driftStartTime = c, e.driftStart = u), e.driftEndTime = c, e.driftEnd = u;\n  } else\n    e.driftEndTime = s.driftEndTime, e.driftEnd = s.driftEnd, e.advancedDateTime = s.advancedDateTime;\n  e.requestScheduled === -1 && (e.requestScheduled = s.requestScheduled);\n}\nfunction Xb(s, e, t) {\n  const {\n    dateRanges: r,\n    recentlyRemovedDateranges: n\n  } = e, i = nt({}, s);\n  n && n.forEach((l) => {\n    delete i[l];\n  });\n  const a = Object.keys(i).length;\n  return a ? (Object.keys(r).forEach((l) => {\n    const c = i[l], u = new Wg(r[l].attr, c);\n    u.isValid ? (i[l] = u, c || (u.tagOrder += a)) : t.warn(`Ignoring invalid Playlist Delta Update DATERANGE tag: \"${at(r[l].attr)}\"`);\n  }), i) : r;\n}\nfunction Jb(s, e, t) {\n  if (s && e) {\n    let r = 0;\n    for (let n = 0, i = s.length; n <= i; n++) {\n      const o = s[n], a = e[n + r];\n      o && a && o.index === a.index && o.fragment.sn === a.fragment.sn ? t(o, a) : r--;\n    }\n  }\n}\nfunction Qb(s, e, t) {\n  const r = e.skippedSegments, n = Math.max(s.startSN, e.startSN) - e.startSN, i = (s.fragmentHint ? 1 : 0) + (r ? e.endSN : Math.min(s.endSN, e.endSN)) - e.startSN, o = e.startSN - s.startSN, a = e.fragmentHint ? e.fragments.concat(e.fragmentHint) : e.fragments, l = s.fragmentHint ? s.fragments.concat(s.fragmentHint) : s.fragments;\n  for (let c = n; c <= i; c++) {\n    const u = l[o + c];\n    let d = a[c];\n    if (r && !d && u && (d = e.fragments[c] = u), u && d) {\n      t(u, d, c, a);\n      const h = u.relurl, f = d.relurl;\n      if (h && eT(h, f)) {\n        e.playlistParsingError = Dh(`media sequence mismatch ${d.sn}:`, s, e, u, d);\n        return;\n      } else if (u.cc !== d.cc) {\n        e.playlistParsingError = Dh(`discontinuity sequence mismatch (${u.cc}!=${d.cc})`, s, e, u, d);\n        return;\n      }\n    }\n  }\n}\nfunction Dh(s, e, t, r, n) {\n  return new Error(`${s} ${n.url}\nPlaylist starting @${e.startSN}\n${e.m3u8}\n\nPlaylist starting @${t.startSN}\n${t.m3u8}`);\n}\nfunction Jg(s, e, t = !0) {\n  const r = e.startSN + e.skippedSegments - s.startSN, n = s.fragments, i = r >= 0;\n  let o = 0;\n  if (i && r < n.length)\n    o = n[r].start;\n  else if (i && e.startSN === s.endSN + 1)\n    o = s.fragmentEnd;\n  else if (i && t)\n    o = s.fragmentStart + r * e.levelTargetDuration;\n  else if (!e.skippedSegments && e.fragmentStart === 0)\n    o = s.fragmentStart;\n  else\n    return;\n  gc(e, o);\n}\nfunction gc(s, e) {\n  if (e) {\n    const t = s.fragments;\n    for (let r = s.skippedSegments; r < t.length; r++)\n      t[r].addStart(e);\n    s.fragmentHint && s.fragmentHint.addStart(e);\n  }\n}\nfunction Qg(s, e = 1 / 0) {\n  let t = 1e3 * s.targetduration;\n  if (s.updated) {\n    const r = s.fragments;\n    if (r.length && t * 4 > e) {\n      const i = r[r.length - 1].duration * 1e3;\n      i < t && (t = i);\n    }\n  } else\n    t /= 2;\n  return Math.round(t);\n}\nfunction ep(s, e, t) {\n  if (!s)\n    return null;\n  let r = s.fragments[e - s.startSN];\n  return r || (r = s.fragmentHint, r && r.sn === e) ? r : e < s.startSN && t && t.sn === e ? t : null;\n}\nfunction Ph(s, e, t) {\n  return s ? tp(s.partList, e, t) : null;\n}\nfunction tp(s, e, t) {\n  if (s)\n    for (let r = s.length; r--; ) {\n      const n = s[r];\n      if (n.index === t && n.fragment.sn === e)\n        return n;\n    }\n  return null;\n}\nfunction rp(s) {\n  s.forEach((e, t) => {\n    var r;\n    (r = e.details) == null || r.fragments.forEach((n) => {\n      n.level = t, n.initSegment && (n.initSegment.level = t);\n    });\n  });\n}\nfunction eT(s, e) {\n  return s !== e && e ? Mh(s) !== Mh(e) : !1;\n}\nfunction Mh(s) {\n  return s.replace(/\\?[^?]*$/, \"\");\n}\nfunction Yn(s, e) {\n  for (let r = 0, n = s.length; r < n; r++) {\n    var t;\n    if (((t = s[r]) == null ? void 0 : t.cc) === e)\n      return s[r];\n  }\n  return null;\n}\nfunction tT(s, e) {\n  return !!(s && e.startCC < s.endCC && e.endCC > s.startCC);\n}\nfunction Oh(s, e) {\n  const t = s.start + e;\n  s.startPTS = t, s.setStart(t), s.endPTS = t + s.duration;\n}\nfunction sp(s, e) {\n  const t = e.fragments;\n  for (let r = 0, n = t.length; r < n; r++)\n    Oh(t[r], s);\n  e.fragmentHint && Oh(e.fragmentHint, s), e.alignedSliding = !0;\n}\nfunction rT(s, e) {\n  s && (np(e, s), e.alignedSliding || sa(e, s), !e.alignedSliding && !e.skippedSegments && Jg(s, e, !1));\n}\nfunction np(s, e) {\n  if (!tT(e, s))\n    return;\n  const t = Math.min(e.endCC, s.endCC), r = Yn(e.fragments, t), n = Yn(s.fragments, t);\n  if (!r || !n)\n    return;\n  rt.log(`Aligning playlist at start of dicontinuity sequence ${t}`);\n  const i = r.start - n.start;\n  sp(i, s);\n}\nfunction sa(s, e) {\n  if (!s.hasProgramDateTime || !e.hasProgramDateTime)\n    return;\n  const t = s.fragments, r = e.fragments;\n  if (!t.length || !r.length)\n    return;\n  let n, i;\n  const o = Math.min(e.endCC, s.endCC);\n  e.startCC < o && s.startCC < o && (n = Yn(r, o), i = Yn(t, o)), (!n || !i) && (n = r[Math.floor(r.length / 2)], i = Yn(t, n.cc) || t[Math.floor(t.length / 2)]);\n  const a = n.programDateTime, l = i.programDateTime;\n  if (!a || !l)\n    return;\n  const c = (l - a) / 1e3 - (i.start - n.start);\n  sp(c, s);\n}\nfunction cr(s, e, t) {\n  pr(s, e, t), s.addEventListener(e, t);\n}\nfunction pr(s, e, t) {\n  s.removeEventListener(e, t);\n}\nconst sT = {\n  toString: function(s) {\n    let e = \"\";\n    const t = s.length;\n    for (let r = 0; r < t; r++)\n      e += `[${s.start(r).toFixed(3)}-${s.end(r).toFixed(3)}]`;\n    return e;\n  }\n}, ne = {\n  STOPPED: \"STOPPED\",\n  IDLE: \"IDLE\",\n  KEY_LOADING: \"KEY_LOADING\",\n  FRAG_LOADING: \"FRAG_LOADING\",\n  FRAG_LOADING_WAITING_RETRY: \"FRAG_LOADING_WAITING_RETRY\",\n  WAITING_TRACK: \"WAITING_TRACK\",\n  PARSING: \"PARSING\",\n  PARSED: \"PARSED\",\n  ENDED: \"ENDED\",\n  ERROR: \"ERROR\",\n  WAITING_INIT_PTS: \"WAITING_INIT_PTS\",\n  WAITING_LEVEL: \"WAITING_LEVEL\"\n};\nclass Tu extends Hg {\n  constructor(e, t, r, n, i) {\n    super(n, e.logger), this.hls = void 0, this.fragPrevious = null, this.fragCurrent = null, this.fragmentTracker = void 0, this.transmuxer = null, this._state = ne.STOPPED, this.playlistType = void 0, this.media = null, this.mediaBuffer = null, this.config = void 0, this.bitrateTest = !1, this.lastCurrentTime = 0, this.nextLoadPosition = 0, this.startPosition = 0, this.startTimeOffset = null, this.retryDate = 0, this.levels = null, this.fragmentLoader = void 0, this.keyLoader = void 0, this.levelLastLoaded = null, this.startFragRequested = !1, this.decrypter = void 0, this.initPTS = [], this.buffering = !0, this.loadingParts = !1, this.loopSn = void 0, this.onMediaSeeking = () => {\n      const {\n        config: o,\n        fragCurrent: a,\n        media: l,\n        mediaBuffer: c,\n        state: u\n      } = this, d = l ? l.currentTime : 0, h = Ce.bufferInfo(c || l, d, o.maxBufferHole), f = !h.len;\n      if (this.log(`Media seeking to ${ue(d) ? d.toFixed(3) : d}, state: ${u}, ${f ? \"out of\" : \"in\"} buffer`), this.state === ne.ENDED)\n        this.resetLoadingState();\n      else if (a) {\n        const p = o.maxFragLookUpTolerance, y = a.start - p, E = a.start + a.duration + p;\n        if (f || E < h.start || y > h.end) {\n          const b = d > E;\n          (d < y || b) && (b && a.loader && (this.log(`Cancelling fragment load for seek (sn: ${a.sn})`), a.abortRequests(), this.resetLoadingState()), this.fragPrevious = null);\n        }\n      }\n      if (l) {\n        this.fragmentTracker.removeFragmentsInRange(d, 1 / 0, this.playlistType, !0);\n        const p = this.lastCurrentTime;\n        if (d > p && (this.lastCurrentTime = d), !this.loadingParts) {\n          const y = Math.max(h.end, d), E = this.shouldLoadParts(this.getLevelDetails(), y);\n          E && (this.log(`LL-Part loading ON after seeking to ${d.toFixed(2)} with buffer @${y.toFixed(2)}`), this.loadingParts = E);\n        }\n      }\n      this.hls.hasEnoughToStart || (this.log(`Setting ${f ? \"startPosition\" : \"nextLoadPosition\"} to ${d} for seek without enough to start`), this.nextLoadPosition = d, f && (this.startPosition = d)), f && this.state === ne.IDLE && this.tickImmediate();\n    }, this.onMediaEnded = () => {\n      this.log(\"setting startPosition to 0 because media ended\"), this.startPosition = this.lastCurrentTime = 0;\n    }, this.playlistType = i, this.hls = e, this.fragmentLoader = new Cb(e.config), this.keyLoader = r, this.fragmentTracker = t, this.config = e.config, this.decrypter = new vu(e.config);\n  }\n  registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.on(I.ERROR, this.onError, this);\n  }\n  unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.off(I.ERROR, this.onError, this);\n  }\n  doTick() {\n    this.onTickEnd();\n  }\n  onTickEnd() {\n  }\n  startLoad(e) {\n  }\n  stopLoad() {\n    if (this.state === ne.STOPPED)\n      return;\n    this.fragmentLoader.abort(), this.keyLoader.abort(this.playlistType);\n    const e = this.fragCurrent;\n    e != null && e.loader && (e.abortRequests(), this.fragmentTracker.removeFragment(e)), this.resetTransmuxer(), this.fragCurrent = null, this.fragPrevious = null, this.clearInterval(), this.clearNextTick(), this.state = ne.STOPPED;\n  }\n  get startPositionValue() {\n    const {\n      nextLoadPosition: e,\n      startPosition: t\n    } = this;\n    return t === -1 && e ? e : t;\n  }\n  get bufferingEnabled() {\n    return this.buffering;\n  }\n  pauseBuffering() {\n    this.buffering = !1;\n  }\n  resumeBuffering() {\n    this.buffering = !0;\n  }\n  get inFlightFrag() {\n    return {\n      frag: this.fragCurrent,\n      state: this.state\n    };\n  }\n  _streamEnded(e, t) {\n    if (t.live || !this.media)\n      return !1;\n    const r = e.end || 0, n = this.config.timelineOffset || 0;\n    if (r <= n)\n      return !1;\n    const i = e.buffered;\n    this.config.maxBufferHole && i && i.length > 1 && (e = Ce.bufferedInfo(i, e.start, 0));\n    const o = e.nextStart;\n    if (o && o > n && o < t.edge || this.media.currentTime < e.start)\n      return !1;\n    const l = t.partList;\n    if (l != null && l.length) {\n      const u = l[l.length - 1];\n      return Ce.isBuffered(this.media, u.start + u.duration / 2);\n    }\n    const c = t.fragments[t.fragments.length - 1].type;\n    return this.fragmentTracker.isEndListAppended(c);\n  }\n  getLevelDetails() {\n    if (this.levels && this.levelLastLoaded !== null)\n      return this.levelLastLoaded.details;\n  }\n  get timelineOffset() {\n    const e = this.config.timelineOffset;\n    if (e) {\n      var t;\n      return ((t = this.getLevelDetails()) == null ? void 0 : t.appliedTimelineOffset) || e;\n    }\n    return 0;\n  }\n  onMediaAttached(e, t) {\n    const r = this.media = this.mediaBuffer = t.media;\n    cr(r, \"seeking\", this.onMediaSeeking), cr(r, \"ended\", this.onMediaEnded);\n    const n = this.config;\n    this.levels && n.autoStartLoad && this.state === ne.STOPPED && this.startLoad(n.startPosition);\n  }\n  onMediaDetaching(e, t) {\n    const r = !!t.transferMedia, n = this.media;\n    if (n !== null) {\n      if (n.ended && (this.log(\"MSE detaching and video ended, reset startPosition\"), this.startPosition = this.lastCurrentTime = 0), pr(n, \"seeking\", this.onMediaSeeking), pr(n, \"ended\", this.onMediaEnded), this.keyLoader && !r && this.keyLoader.detach(), this.media = this.mediaBuffer = null, this.loopSn = void 0, r) {\n        this.resetLoadingState(), this.resetTransmuxer();\n        return;\n      }\n      this.loadingParts = !1, this.fragmentTracker.removeAllFragments(), this.stopLoad();\n    }\n  }\n  onManifestLoading() {\n    this.initPTS = [], this.levels = this.levelLastLoaded = this.fragCurrent = null, this.lastCurrentTime = this.startPosition = 0, this.startFragRequested = !1;\n  }\n  onError(e, t) {\n  }\n  onManifestLoaded(e, t) {\n    this.startTimeOffset = t.startTimeOffset;\n  }\n  onHandlerDestroying() {\n    this.stopLoad(), this.transmuxer && (this.transmuxer.destroy(), this.transmuxer = null), super.onHandlerDestroying(), this.hls = this.onMediaSeeking = this.onMediaEnded = null;\n  }\n  onHandlerDestroyed() {\n    this.state = ne.STOPPED, this.fragmentLoader && this.fragmentLoader.destroy(), this.keyLoader && this.keyLoader.destroy(), this.decrypter && this.decrypter.destroy(), this.hls = this.log = this.warn = this.decrypter = this.keyLoader = this.fragmentLoader = this.fragmentTracker = null, super.onHandlerDestroyed();\n  }\n  loadFragment(e, t, r) {\n    this.startFragRequested = !0, this._loadFragForPlayback(e, t, r);\n  }\n  _loadFragForPlayback(e, t, r) {\n    const n = (i) => {\n      const o = i.frag;\n      if (this.fragContextChanged(o)) {\n        this.warn(`${o.type} sn: ${o.sn}${i.part ? \" part: \" + i.part.index : \"\"} of ${this.fragInfo(o, !1, i.part)}) was dropped during download.`), this.fragmentTracker.removeFragment(o);\n        return;\n      }\n      o.stats.chunkCount++, this._handleFragmentLoadProgress(i);\n    };\n    this._doFragLoad(e, t, r, n).then((i) => {\n      if (!i)\n        return;\n      const o = this.state, a = i.frag;\n      if (this.fragContextChanged(a)) {\n        (o === ne.FRAG_LOADING || !this.fragCurrent && o === ne.PARSING) && (this.fragmentTracker.removeFragment(a), this.state = ne.IDLE);\n        return;\n      }\n      \"payload\" in i && (this.log(`Loaded ${a.type} sn: ${a.sn} of ${this.playlistLabel()} ${a.level}`), this.hls.trigger(I.FRAG_LOADED, i)), this._handleFragmentLoadComplete(i);\n    }).catch((i) => {\n      this.state === ne.STOPPED || this.state === ne.ERROR || (this.warn(`Frag error: ${(i == null ? void 0 : i.message) || i}`), this.resetFragmentLoading(e));\n    });\n  }\n  clearTrackerIfNeeded(e) {\n    var t;\n    const {\n      fragmentTracker: r\n    } = this;\n    if (r.getState(e) === Ht.APPENDING) {\n      const i = e.type, o = this.getFwdBufferInfo(this.mediaBuffer, i), a = Math.max(e.duration, o ? o.len : this.config.maxBufferLength), l = this.backtrackFragment;\n      ((l ? e.sn - l.sn : 0) === 1 || this.reduceMaxBufferLength(a, e.duration)) && r.removeFragment(e);\n    } else ((t = this.mediaBuffer) == null ? void 0 : t.buffered.length) === 0 ? r.removeAllFragments() : r.hasParts(e.type) && (r.detectPartialFragments({\n      frag: e,\n      part: null,\n      stats: e.stats,\n      id: e.type\n    }), r.getState(e) === Ht.PARTIAL && r.removeFragment(e));\n  }\n  checkLiveUpdate(e) {\n    if (e.updated && !e.live) {\n      const t = e.fragments[e.fragments.length - 1];\n      this.fragmentTracker.detectPartialFragments({\n        frag: t,\n        part: null,\n        stats: t.stats,\n        id: t.type\n      });\n    }\n    e.fragments[0] || (e.deltaUpdateFailed = !0);\n  }\n  waitForLive(e) {\n    const t = e.details;\n    return (t == null ? void 0 : t.live) && t.type !== \"EVENT\" && (this.levelLastLoaded !== e || t.expired);\n  }\n  flushMainBuffer(e, t, r = null) {\n    if (!(e - t))\n      return;\n    const n = {\n      startOffset: e,\n      endOffset: t,\n      type: r\n    };\n    this.hls.trigger(I.BUFFER_FLUSHING, n);\n  }\n  _loadInitSegment(e, t) {\n    this._doFragLoad(e, t).then((r) => {\n      const n = r == null ? void 0 : r.frag;\n      if (!n || this.fragContextChanged(n) || !this.levels)\n        throw new Error(\"init load aborted\");\n      return r;\n    }).then((r) => {\n      const {\n        hls: n\n      } = this, {\n        frag: i,\n        payload: o\n      } = r, a = i.decryptdata;\n      if (o && o.byteLength > 0 && a != null && a.key && a.iv && In(a.method)) {\n        const l = self.performance.now();\n        return this.decrypter.decrypt(new Uint8Array(o), a.key.buffer, a.iv.buffer, Su(a.method)).catch((c) => {\n          throw n.trigger(I.ERROR, {\n            type: ve.MEDIA_ERROR,\n            details: J.FRAG_DECRYPT_ERROR,\n            fatal: !1,\n            error: c,\n            reason: c.message,\n            frag: i\n          }), c;\n        }).then((c) => {\n          const u = self.performance.now();\n          return n.trigger(I.FRAG_DECRYPTED, {\n            frag: i,\n            payload: c,\n            stats: {\n              tstart: l,\n              tdecrypt: u\n            }\n          }), r.payload = c, this.completeInitSegmentLoad(r);\n        });\n      }\n      return this.completeInitSegmentLoad(r);\n    }).catch((r) => {\n      this.state === ne.STOPPED || this.state === ne.ERROR || (this.warn(r), this.resetFragmentLoading(e));\n    });\n  }\n  completeInitSegmentLoad(e) {\n    const {\n      levels: t\n    } = this;\n    if (!t)\n      throw new Error(\"init load aborted, missing levels\");\n    const r = e.frag.stats;\n    this.state !== ne.STOPPED && (this.state = ne.IDLE), e.frag.data = new Uint8Array(e.payload), r.parsing.start = r.buffering.start = self.performance.now(), r.parsing.end = r.buffering.end = self.performance.now(), this.tick();\n  }\n  unhandledEncryptionError(e, t) {\n    var r, n;\n    const i = e.tracks;\n    if (i && !t.encrypted && ((r = i.audio) != null && r.encrypted || (n = i.video) != null && n.encrypted) && (!this.config.emeEnabled || !this.keyLoader.emeController)) {\n      const o = this.media, a = new Error(`Encrypted track with no key in ${this.fragInfo(t)} (media ${o ? \"attached mediaKeys: \" + o.mediaKeys : \"detached\"})`);\n      return this.warn(a.message), !o || o.mediaKeys ? !1 : (this.hls.trigger(I.ERROR, {\n        type: ve.KEY_SYSTEM_ERROR,\n        details: J.KEY_SYSTEM_NO_KEYS,\n        fatal: !1,\n        error: a,\n        frag: t\n      }), this.resetTransmuxer(), !0);\n    }\n    return !1;\n  }\n  fragContextChanged(e) {\n    const {\n      fragCurrent: t\n    } = this;\n    return !e || !t || e.sn !== t.sn || e.level !== t.level;\n  }\n  fragBufferedComplete(e, t) {\n    const r = this.mediaBuffer ? this.mediaBuffer : this.media;\n    if (this.log(`Buffered ${e.type} sn: ${e.sn}${t ? \" part: \" + t.index : \"\"} of ${this.fragInfo(e, !1, t)} > buffer:${r ? sT.toString(Ce.getBuffered(r)) : \"(detached)\"})`), Vt(e)) {\n      var n;\n      if (e.type !== pe.SUBTITLE) {\n        const o = e.elementaryStreams;\n        if (!Object.keys(o).some((a) => !!o[a])) {\n          this.state = ne.IDLE;\n          return;\n        }\n      }\n      const i = (n = this.levels) == null ? void 0 : n[e.level];\n      i != null && i.fragmentError && (this.log(`Resetting level fragment error count of ${i.fragmentError} on frag buffered`), i.fragmentError = 0);\n    }\n    this.state = ne.IDLE;\n  }\n  _handleFragmentLoadComplete(e) {\n    const {\n      transmuxer: t\n    } = this;\n    if (!t)\n      return;\n    const {\n      frag: r,\n      part: n,\n      partsLoaded: i\n    } = e, o = !i || i.length === 0 || i.some((l) => !l), a = new Eu(r.level, r.sn, r.stats.chunkCount + 1, 0, n ? n.index : -1, !o);\n    t.flush(a);\n  }\n  _handleFragmentLoadProgress(e) {\n  }\n  _doFragLoad(e, t, r = null, n) {\n    var i;\n    this.fragCurrent = e;\n    const o = t.details;\n    if (!this.levels || !o)\n      throw new Error(`frag load aborted, missing level${o ? \"\" : \" detail\"}s`);\n    let a = null;\n    if (e.encrypted && !((i = e.decryptdata) != null && i.key)) {\n      if (this.log(`Loading key for ${e.sn} of [${o.startSN}-${o.endSN}], ${this.playlistLabel()} ${e.level}`), this.state = ne.KEY_LOADING, this.fragCurrent = e, a = this.keyLoader.load(e).then((h) => {\n        if (!this.fragContextChanged(h.frag))\n          return this.hls.trigger(I.KEY_LOADED, h), this.state === ne.KEY_LOADING && (this.state = ne.IDLE), h;\n      }), this.hls.trigger(I.KEY_LOADING, {\n        frag: e\n      }), this.fragCurrent === null)\n        return this.log(\"context changed in KEY_LOADING\"), Promise.resolve(null);\n    } else e.encrypted || (a = this.keyLoader.loadClear(e, o.encryptedFragments, this.startFragRequested), a && this.log(\"[eme] blocking frag load until media-keys acquired\"));\n    const l = this.fragPrevious;\n    if (Vt(e) && (!l || e.sn !== l.sn)) {\n      const h = this.shouldLoadParts(t.details, e.end);\n      h !== this.loadingParts && (this.log(`LL-Part loading ${h ? \"ON\" : \"OFF\"} loading sn ${l == null ? void 0 : l.sn}->${e.sn}`), this.loadingParts = h);\n    }\n    if (r = Math.max(e.start, r || 0), this.loadingParts && Vt(e)) {\n      const h = o.partList;\n      if (h && n) {\n        r > o.fragmentEnd && o.fragmentHint && (e = o.fragmentHint);\n        const f = this.getNextPart(h, e, r);\n        if (f > -1) {\n          const p = h[f];\n          e = this.fragCurrent = p.fragment, this.log(`Loading ${e.type} sn: ${e.sn} part: ${p.index} (${f}/${h.length - 1}) of ${this.fragInfo(e, !1, p)}) cc: ${e.cc} [${o.startSN}-${o.endSN}], target: ${parseFloat(r.toFixed(3))}`), this.nextLoadPosition = p.start + p.duration, this.state = ne.FRAG_LOADING;\n          let y;\n          return a ? y = a.then((E) => !E || this.fragContextChanged(E.frag) ? null : this.doFragPartsLoad(e, p, t, n)).catch((E) => this.handleFragLoadError(E)) : y = this.doFragPartsLoad(e, p, t, n).catch((E) => this.handleFragLoadError(E)), this.hls.trigger(I.FRAG_LOADING, {\n            frag: e,\n            part: p,\n            targetBufferTime: r\n          }), this.fragCurrent === null ? Promise.reject(new Error(\"frag load aborted, context changed in FRAG_LOADING parts\")) : y;\n        } else if (!e.url || this.loadedEndOfParts(h, r))\n          return Promise.resolve(null);\n      }\n    }\n    if (Vt(e) && this.loadingParts) {\n      var c;\n      this.log(`LL-Part loading OFF after next part miss @${r.toFixed(2)} Check buffer at sn: ${e.sn} loaded parts: ${(c = o.partList) == null ? void 0 : c.filter((h) => h.loaded).map((h) => `[${h.start}-${h.end}]`)}`), this.loadingParts = !1;\n    } else if (!e.url)\n      return Promise.resolve(null);\n    this.log(`Loading ${e.type} sn: ${e.sn} of ${this.fragInfo(e, !1)}) cc: ${e.cc} ${\"[\" + o.startSN + \"-\" + o.endSN + \"]\"}, target: ${parseFloat(r.toFixed(3))}`), ue(e.sn) && !this.bitrateTest && (this.nextLoadPosition = e.start + e.duration), this.state = ne.FRAG_LOADING;\n    const u = this.config.progressive;\n    let d;\n    return u && a ? d = a.then((h) => !h || this.fragContextChanged(h.frag) ? null : this.fragmentLoader.load(e, n)).catch((h) => this.handleFragLoadError(h)) : d = Promise.all([this.fragmentLoader.load(e, u ? n : void 0), a]).then(([h]) => (!u && n && n(h), h)).catch((h) => this.handleFragLoadError(h)), this.hls.trigger(I.FRAG_LOADING, {\n      frag: e,\n      targetBufferTime: r\n    }), this.fragCurrent === null ? Promise.reject(new Error(\"frag load aborted, context changed in FRAG_LOADING\")) : d;\n  }\n  doFragPartsLoad(e, t, r, n) {\n    return new Promise((i, o) => {\n      var a;\n      const l = [], c = (a = r.details) == null ? void 0 : a.partList, u = (d) => {\n        this.fragmentLoader.loadPart(e, d, n).then((h) => {\n          l[d.index] = h;\n          const f = h.part;\n          this.hls.trigger(I.FRAG_LOADED, h);\n          const p = Ph(r.details, e.sn, d.index + 1) || tp(c, e.sn, d.index + 1);\n          if (p)\n            u(p);\n          else\n            return i({\n              frag: e,\n              part: f,\n              partsLoaded: l\n            });\n        }).catch(o);\n      };\n      u(t);\n    });\n  }\n  handleFragLoadError(e) {\n    if (\"data\" in e) {\n      const t = e.data;\n      t.frag && t.details === J.INTERNAL_ABORTED ? this.handleFragLoadAborted(t.frag, t.part) : t.frag && t.type === ve.KEY_SYSTEM_ERROR ? (t.frag.abortRequests(), this.resetStartWhenNotLoaded(), this.resetFragmentLoading(t.frag)) : this.hls.trigger(I.ERROR, t);\n    } else\n      this.hls.trigger(I.ERROR, {\n        type: ve.OTHER_ERROR,\n        details: J.INTERNAL_EXCEPTION,\n        err: e,\n        error: e,\n        fatal: !0\n      });\n    return null;\n  }\n  _handleTransmuxerFlush(e) {\n    const t = this.getCurrentContext(e);\n    if (!t || this.state !== ne.PARSING) {\n      !this.fragCurrent && this.state !== ne.STOPPED && this.state !== ne.ERROR && (this.state = ne.IDLE);\n      return;\n    }\n    const {\n      frag: r,\n      part: n,\n      level: i\n    } = t, o = self.performance.now();\n    r.stats.parsing.end = o, n && (n.stats.parsing.end = o);\n    const a = this.getLevelDetails(), c = a && r.sn > a.endSN || this.shouldLoadParts(a, r.end);\n    c !== this.loadingParts && (this.log(`LL-Part loading ${c ? \"ON\" : \"OFF\"} after parsing segment ending @${r.end.toFixed(2)}`), this.loadingParts = c), this.updateLevelTiming(r, n, i, e.partial);\n  }\n  shouldLoadParts(e, t) {\n    if (this.config.lowLatencyMode) {\n      if (!e)\n        return this.loadingParts;\n      if (e.partList) {\n        var r;\n        const i = e.partList[0];\n        if (i.fragment.type === pe.SUBTITLE)\n          return !1;\n        const o = i.end + (((r = e.fragmentHint) == null ? void 0 : r.duration) || 0);\n        if (t >= o) {\n          var n;\n          if ((this.hls.hasEnoughToStart ? ((n = this.media) == null ? void 0 : n.currentTime) || this.lastCurrentTime : this.getLoadPosition()) > i.start - i.fragment.duration)\n            return !0;\n        }\n      }\n    }\n    return !1;\n  }\n  getCurrentContext(e) {\n    const {\n      levels: t,\n      fragCurrent: r\n    } = this, {\n      level: n,\n      sn: i,\n      part: o\n    } = e;\n    if (!(t != null && t[n]))\n      return this.warn(`Levels object was unset while buffering fragment ${i} of ${this.playlistLabel()} ${n}. The current chunk will not be buffered.`), null;\n    const a = t[n], l = a.details, c = o > -1 ? Ph(l, i, o) : null, u = c ? c.fragment : ep(l, i, r);\n    return u ? (r && r !== u && (u.stats = r.stats), {\n      frag: u,\n      part: c,\n      level: a\n    }) : null;\n  }\n  bufferFragmentData(e, t, r, n, i) {\n    if (this.state !== ne.PARSING)\n      return;\n    const {\n      data1: o,\n      data2: a\n    } = e;\n    let l = o;\n    if (a && (l = _r(o, a)), !l.length)\n      return;\n    const c = this.initPTS[t.cc], u = c ? -c.baseTime / c.timescale : void 0, d = {\n      type: e.type,\n      frag: t,\n      part: r,\n      chunkMeta: n,\n      offset: u,\n      parent: t.type,\n      data: l\n    };\n    if (this.hls.trigger(I.BUFFER_APPENDING, d), e.dropped && e.independent && !r) {\n      if (i)\n        return;\n      this.flushBufferGap(t);\n    }\n  }\n  flushBufferGap(e) {\n    const t = this.media;\n    if (!t)\n      return;\n    if (!Ce.isBuffered(t, t.currentTime)) {\n      this.flushMainBuffer(0, e.start);\n      return;\n    }\n    const r = t.currentTime, n = Ce.bufferInfo(t, r, 0), i = e.duration, o = Math.min(this.config.maxFragLookUpTolerance * 2, i * 0.25), a = Math.max(Math.min(e.start - o, n.end - o), r + o);\n    e.start - a > o && this.flushMainBuffer(a, e.start);\n  }\n  getFwdBufferInfo(e, t) {\n    var r;\n    const n = this.getLoadPosition();\n    if (!ue(n))\n      return null;\n    const o = this.lastCurrentTime > n || (r = this.media) != null && r.paused ? 0 : this.config.maxBufferHole;\n    return this.getFwdBufferInfoAtPos(e, n, t, o);\n  }\n  getFwdBufferInfoAtPos(e, t, r, n) {\n    const i = Ce.bufferInfo(e, t, n);\n    if (i.len === 0 && i.nextStart !== void 0) {\n      const o = this.fragmentTracker.getBufferedFrag(t, r);\n      if (o && (i.nextStart <= o.end || o.gap)) {\n        const a = Math.max(Math.min(i.nextStart, o.end) - t, n);\n        return Ce.bufferInfo(e, t, a);\n      }\n    }\n    return i;\n  }\n  getMaxBufferLength(e) {\n    const {\n      config: t\n    } = this;\n    let r;\n    return e ? r = Math.max(8 * t.maxBufferSize / e, t.maxBufferLength) : r = t.maxBufferLength, Math.min(r, t.maxMaxBufferLength);\n  }\n  reduceMaxBufferLength(e, t) {\n    const r = this.config, n = Math.max(Math.min(e - t, r.maxBufferLength), t), i = Math.max(e - t * 3, r.maxMaxBufferLength / 2, n);\n    return i >= n ? (r.maxMaxBufferLength = i, this.warn(`Reduce max buffer length to ${i}s`), !0) : !1;\n  }\n  getAppendedFrag(e, t = pe.MAIN) {\n    const r = this.fragmentTracker ? this.fragmentTracker.getAppendedFrag(e, t) : null;\n    return r && \"fragment\" in r ? r.fragment : r;\n  }\n  getNextFragment(e, t) {\n    const r = t.fragments, n = r.length;\n    if (!n)\n      return null;\n    const {\n      config: i\n    } = this, o = r[0].start, a = i.lowLatencyMode && !!t.partList;\n    let l = null;\n    if (t.live) {\n      const d = i.initialLiveManifestSize;\n      if (n < d)\n        return this.warn(`Not enough fragments to start playback (have: ${n}, need: ${d})`), null;\n      if (!t.PTSKnown && !this.startFragRequested && this.startPosition === -1 || e < o) {\n        var c;\n        a && !this.loadingParts && (this.log(\"LL-Part loading ON for initial live fragment\"), this.loadingParts = !0), l = this.getInitialLiveFragment(t);\n        const h = this.hls.startPosition, f = this.hls.liveSyncPosition, p = l ? (h !== -1 && h >= o ? h : f) || l.start : e;\n        this.log(`Setting startPosition to ${p} to match start frag at live edge. mainStart: ${h} liveSyncPosition: ${f} frag.start: ${(c = l) == null ? void 0 : c.start}`), this.startPosition = this.nextLoadPosition = p;\n      }\n    } else e <= o && (l = r[0]);\n    if (!l) {\n      const d = this.loadingParts ? t.partEnd : t.fragmentEnd;\n      l = this.getFragmentAtPosition(e, d, t);\n    }\n    let u = this.filterReplacedPrimary(l, t);\n    if (!u && l) {\n      const d = l.sn - t.startSN;\n      u = this.filterReplacedPrimary(r[d + 1] || null, t);\n    }\n    return this.mapToInitFragWhenRequired(u);\n  }\n  isLoopLoading(e, t) {\n    const r = this.fragmentTracker.getState(e);\n    return (r === Ht.OK || r === Ht.PARTIAL && !!e.gap) && this.nextLoadPosition > t;\n  }\n  getNextFragmentLoopLoading(e, t, r, n, i) {\n    let o = null;\n    if (e.gap && (o = this.getNextFragment(this.nextLoadPosition, t), o && !o.gap && r.nextStart)) {\n      const a = this.getFwdBufferInfoAtPos(this.mediaBuffer ? this.mediaBuffer : this.media, r.nextStart, n, 0);\n      if (a !== null && r.len + a.len >= i) {\n        const l = o.sn;\n        return this.loopSn !== l && (this.log(`buffer full after gaps in \"${n}\" playlist starting at sn: ${l}`), this.loopSn = l), null;\n      }\n    }\n    return this.loopSn = void 0, o;\n  }\n  get primaryPrefetch() {\n    if (Bh(this.config)) {\n      var e;\n      if ((e = this.hls.interstitialsManager) == null || (e = e.playingItem) == null ? void 0 : e.event)\n        return !0;\n    }\n    return !1;\n  }\n  filterReplacedPrimary(e, t) {\n    if (!e)\n      return e;\n    if (Bh(this.config) && e.type !== pe.SUBTITLE) {\n      const r = this.hls.interstitialsManager, n = r == null ? void 0 : r.bufferingItem;\n      if (n) {\n        const o = n.event;\n        if (o) {\n          if (o.appendInPlace || Math.abs(e.start - n.start) > 1 || n.start === 0)\n            return null;\n        } else if (e.end <= n.start && (t == null ? void 0 : t.live) === !1 || e.start > n.end && n.nextEvent && (n.nextEvent.appendInPlace || e.start - n.end > 1))\n          return null;\n      }\n      const i = r == null ? void 0 : r.playerQueue;\n      if (i)\n        for (let o = i.length; o--; ) {\n          const a = i[o].interstitial;\n          if (a.appendInPlace && e.start >= a.startTime && e.end <= a.resumeTime)\n            return null;\n        }\n    }\n    return e;\n  }\n  mapToInitFragWhenRequired(e) {\n    return e != null && e.initSegment && !e.initSegment.data && !this.bitrateTest ? e.initSegment : e;\n  }\n  getNextPart(e, t, r) {\n    let n = -1, i = !1, o = !0;\n    for (let a = 0, l = e.length; a < l; a++) {\n      const c = e[a];\n      if (o = o && !c.independent, n > -1 && r < c.start)\n        break;\n      const u = c.loaded;\n      u ? n = -1 : (i || (c.independent || o) && c.fragment === t) && (c.fragment !== t && this.warn(`Need buffer at ${r} but next unloaded part starts at ${c.start}`), n = a), i = u;\n    }\n    return n;\n  }\n  loadedEndOfParts(e, t) {\n    let r;\n    for (let n = e.length; n--; ) {\n      if (r = e[n], !r.loaded)\n        return !1;\n      if (t > r.start)\n        return !0;\n    }\n    return !1;\n  }\n  /*\n   This method is used find the best matching first fragment for a live playlist. This fragment is used to calculate the\n   \"sliding\" of the playlist, which is its offset from the start of playback. After sliding we can compute the real\n   start and end times for each fragment in the playlist (after which this method will not need to be called).\n  */\n  getInitialLiveFragment(e) {\n    const t = e.fragments, r = this.fragPrevious;\n    let n = null;\n    if (r) {\n      if (e.hasProgramDateTime && (this.log(`Live playlist, switching playlist, load frag with same PDT: ${r.programDateTime}`), n = vb(t, r.endProgramDateTime, this.config.maxFragLookUpTolerance)), !n) {\n        const i = r.sn + 1;\n        if (i >= e.startSN && i <= e.endSN) {\n          const o = t[i - e.startSN];\n          r.cc === o.cc && (n = o, this.log(`Live playlist, switching playlist, load frag with next SN: ${n.sn}`));\n        }\n        n || (n = Vg(e, r.cc, r.end), n && this.log(`Live playlist, switching playlist, load frag with same CC: ${n.sn}`));\n      }\n    } else {\n      const i = this.hls.liveSyncPosition;\n      i !== null && (n = this.getFragmentAtPosition(i, this.bitrateTest ? e.fragmentEnd : e.edge, e));\n    }\n    return n;\n  }\n  /*\n  This method finds the best matching fragment given the provided position.\n   */\n  getFragmentAtPosition(e, t, r) {\n    const {\n      config: n\n    } = this;\n    let {\n      fragPrevious: i\n    } = this, {\n      fragments: o,\n      endSN: a\n    } = r;\n    const {\n      fragmentHint: l\n    } = r, {\n      maxFragLookUpTolerance: c\n    } = n, u = r.partList, d = !!(this.loadingParts && u != null && u.length && l);\n    d && !this.bitrateTest && u[u.length - 1].fragment.sn === l.sn && (o = o.concat(l), a = l.sn);\n    let h;\n    if (e < t) {\n      var f;\n      const y = e < this.lastCurrentTime || e > t - c || (f = this.media) != null && f.paused || !this.startFragRequested ? 0 : c;\n      h = Js(i, o, e, y);\n    } else\n      h = o[o.length - 1];\n    if (h) {\n      const p = h.sn - r.startSN, y = this.fragmentTracker.getState(h);\n      if ((y === Ht.OK || y === Ht.PARTIAL && h.gap) && (i = h), i && h.sn === i.sn && (!d || u[0].fragment.sn > h.sn || !r.live) && h.level === i.level) {\n        const b = o[p + 1];\n        h.sn < a && this.fragmentTracker.getState(b) !== Ht.OK ? h = b : h = null;\n      }\n    }\n    return h;\n  }\n  alignPlaylists(e, t, r) {\n    const n = e.fragments.length;\n    if (!n)\n      return this.warn(\"No fragments in live playlist\"), 0;\n    const i = e.fragmentStart, o = !t, a = e.alignedSliding && ue(i);\n    if (o || !a && !i) {\n      rT(r, e);\n      const l = e.fragmentStart;\n      return this.log(`Live playlist sliding: ${l.toFixed(2)} start-sn: ${t ? t.startSN : \"na\"}->${e.startSN} fragments: ${n}`), l;\n    }\n    return i;\n  }\n  waitForCdnTuneIn(e) {\n    return e.live && e.canBlockReload && e.partTarget && e.tuneInGoal > Math.max(e.partHoldBack, e.partTarget * 3);\n  }\n  setStartPosition(e, t) {\n    let r = this.startPosition;\n    r < t && (r = -1);\n    const n = this.timelineOffset;\n    if (r === -1) {\n      const i = this.startTimeOffset !== null, o = i ? this.startTimeOffset : e.startTimeOffset;\n      o !== null && ue(o) ? (r = t + o, o < 0 && (r += e.edge), r = Math.min(Math.max(t, r), t + e.totalduration), this.log(`Setting startPosition to ${r} for start time offset ${o} found in ${i ? \"multivariant\" : \"media\"} playlist`), this.startPosition = r) : e.live ? (r = this.hls.liveSyncPosition || t, this.log(`Setting startPosition to -1 to start at live edge ${r}`), this.startPosition = -1) : (this.log(\"setting startPosition to 0 by default\"), this.startPosition = r = 0), this.lastCurrentTime = r + n;\n    }\n    this.nextLoadPosition = r + n;\n  }\n  getLoadPosition() {\n    var e;\n    const {\n      media: t\n    } = this;\n    let r = 0;\n    return (e = this.hls) != null && e.hasEnoughToStart && t ? r = t.currentTime : this.nextLoadPosition >= 0 && (r = this.nextLoadPosition), r;\n  }\n  handleFragLoadAborted(e, t) {\n    this.transmuxer && e.type === this.playlistType && Vt(e) && e.stats.aborted && (this.log(`Fragment ${e.sn}${t ? \" part \" + t.index : \"\"} of ${this.playlistLabel()} ${e.level} was aborted`), this.resetFragmentLoading(e));\n  }\n  resetFragmentLoading(e) {\n    (!this.fragCurrent || !this.fragContextChanged(e) && this.state !== ne.FRAG_LOADING_WAITING_RETRY) && (this.state = ne.IDLE);\n  }\n  onFragmentOrKeyLoadError(e, t) {\n    var r;\n    if (t.chunkMeta && !t.frag) {\n      const b = this.getCurrentContext(t.chunkMeta);\n      b && (t.frag = b.frag);\n    }\n    const n = t.frag;\n    if (!n || n.type !== e || !this.levels)\n      return;\n    if (this.fragContextChanged(n)) {\n      var i;\n      this.warn(`Frag load error must match current frag to retry ${n.url} > ${(i = this.fragCurrent) == null ? void 0 : i.url}`);\n      return;\n    }\n    const o = t.details === J.FRAG_GAP;\n    o && this.fragmentTracker.fragBuffered(n, !0);\n    const a = t.errorAction;\n    if (!a) {\n      this.state = ne.ERROR;\n      return;\n    }\n    const {\n      action: l,\n      flags: c,\n      retryCount: u = 0,\n      retryConfig: d\n    } = a, h = !!d, f = h && l === Zt.RetryRequest, p = h && !a.resolved && c === vr.MoveAllAlternatesMatchingHost, y = (r = this.hls.latestLevelDetails) == null ? void 0 : r.live;\n    if (!f && p && Vt(n) && !n.endList && y && !Kg(t))\n      this.resetFragmentErrors(e), this.treatAsGap(n), a.resolved = !0;\n    else if ((f || p) && u < d.maxNumRetry) {\n      var E;\n      const b = uc((E = t.response) == null ? void 0 : E.code), R = yu(d, u);\n      if (this.resetStartWhenNotLoaded(), this.retryDate = self.performance.now() + R, this.state = ne.FRAG_LOADING_WAITING_RETRY, a.resolved = !0, b) {\n        this.log(\"Waiting for connection (offline)\"), this.retryDate = 1 / 0, t.reason = \"offline\";\n        return;\n      }\n      this.warn(`Fragment ${n.sn} of ${e} ${n.level} errored with ${t.details}, retrying loading ${u + 1}/${d.maxNumRetry} in ${R}ms`);\n    } else if (d)\n      if (this.resetFragmentErrors(e), u < d.maxNumRetry)\n        !o && l !== Zt.RemoveAlternatePermanently && (a.resolved = !0);\n      else {\n        this.warn(`${t.details} reached or exceeded max retry (${u})`);\n        return;\n      }\n    else l === Zt.SendAlternateToPenaltyBox ? this.state = ne.WAITING_LEVEL : this.state = ne.ERROR;\n    this.tickImmediate();\n  }\n  checkRetryDate() {\n    const e = self.performance.now(), t = this.retryDate, r = t === 1 / 0;\n    (!t || e >= t || r && !uc(0)) && (r && this.log(\"Connection restored (online)\"), this.resetStartWhenNotLoaded(), this.state = ne.IDLE);\n  }\n  reduceLengthAndFlushBuffer(e) {\n    if (this.state === ne.PARSING || this.state === ne.PARSED) {\n      const t = e.frag, r = e.parent, n = this.getFwdBufferInfo(this.mediaBuffer, r), i = n && n.len > 0.5;\n      i && this.reduceMaxBufferLength(n.len, (t == null ? void 0 : t.duration) || 10);\n      const o = !i;\n      return o && this.warn(`Buffer full error while media.currentTime (${this.getLoadPosition()}) is not buffered, flush ${r} buffer`), t && (this.fragmentTracker.removeFragment(t), this.nextLoadPosition = t.start), this.resetLoadingState(), o;\n    }\n    return !1;\n  }\n  resetFragmentErrors(e) {\n    e === pe.AUDIO && (this.fragCurrent = null), this.hls.hasEnoughToStart || (this.startFragRequested = !1), this.state !== ne.STOPPED && (this.state = ne.IDLE);\n  }\n  afterBufferFlushed(e, t, r) {\n    if (!e)\n      return;\n    const n = Ce.getBuffered(e);\n    this.fragmentTracker.detectEvictedFragments(t, n, r), this.state === ne.ENDED && this.resetLoadingState();\n  }\n  resetLoadingState() {\n    this.log(\"Reset loading state\"), this.fragCurrent = null, this.fragPrevious = null, this.state !== ne.STOPPED && (this.state = ne.IDLE);\n  }\n  resetStartWhenNotLoaded() {\n    if (!this.hls.hasEnoughToStart) {\n      this.startFragRequested = !1;\n      const e = this.levelLastLoaded, t = e ? e.details : null;\n      t != null && t.live ? (this.log(\"resetting startPosition for live start\"), this.startPosition = -1, this.setStartPosition(t, t.fragmentStart), this.resetLoadingState()) : this.nextLoadPosition = this.startPosition;\n    }\n  }\n  resetWhenMissingContext(e) {\n    this.log(`Loading context changed while buffering sn ${e.sn} of ${this.playlistLabel()} ${e.level === -1 ? \"<removed>\" : e.level}. This chunk will not be buffered.`), this.removeUnbufferedFrags(), this.resetStartWhenNotLoaded(), this.resetLoadingState();\n  }\n  removeUnbufferedFrags(e = 0) {\n    this.fragmentTracker.removeFragmentsInRange(e, 1 / 0, this.playlistType, !1, !0);\n  }\n  updateLevelTiming(e, t, r, n) {\n    const i = r.details;\n    if (!i) {\n      this.warn(\"level.details undefined\");\n      return;\n    }\n    if (!Object.keys(e.elementaryStreams).reduce((l, c) => {\n      const u = e.elementaryStreams[c];\n      if (u) {\n        const d = u.endPTS - u.startPTS;\n        if (d <= 0)\n          return this.warn(`Could not parse fragment ${e.sn} ${c} duration reliably (${d})`), l || !1;\n        const h = n ? 0 : Xg(i, e, u.startPTS, u.endPTS, u.startDTS, u.endDTS, this);\n        return this.hls.trigger(I.LEVEL_PTS_UPDATED, {\n          details: i,\n          level: r,\n          drift: h,\n          type: c,\n          frag: e,\n          start: u.startPTS,\n          end: u.endPTS\n        }), !0;\n      }\n      return l;\n    }, !1)) {\n      var a;\n      if (r.fragmentError === 0 && this.treatAsGap(e, r), ((a = this.transmuxer) == null ? void 0 : a.error) === null) {\n        const l = new Error(`Found no media in fragment ${e.sn} of ${this.playlistLabel()} ${e.level} resetting transmuxer to fallback to playlist timing`);\n        if (this.warn(l.message), this.hls.trigger(I.ERROR, {\n          type: ve.MEDIA_ERROR,\n          details: J.FRAG_PARSING_ERROR,\n          fatal: !1,\n          error: l,\n          frag: e,\n          reason: `Found no media in msn ${e.sn} of ${this.playlistLabel()} \"${r.url}\"`\n        }), !this.hls)\n          return;\n        this.resetTransmuxer();\n      }\n    }\n    this.state = ne.PARSED, this.log(`Parsed ${e.type} sn: ${e.sn}${t ? \" part: \" + t.index : \"\"} of ${this.fragInfo(e, !1, t)})`), this.hls.trigger(I.FRAG_PARSED, {\n      frag: e,\n      part: t\n    });\n  }\n  playlistLabel() {\n    return this.playlistType === pe.MAIN ? \"level\" : \"track\";\n  }\n  fragInfo(e, t = !0, r) {\n    var n, i;\n    return `${this.playlistLabel()} ${e.level} (${r ? \"part\" : \"frag\"}:[${((n = t && !r ? e.startPTS : (r || e).start) != null ? n : NaN).toFixed(3)}-${((i = t && !r ? e.endPTS : (r || e).end) != null ? i : NaN).toFixed(3)}]${r && e.type === \"main\" ? \"INDEPENDENT=\" + (r.independent ? \"YES\" : \"NO\") : \"\"}`;\n  }\n  treatAsGap(e, t) {\n    t && t.fragmentError++, e.gap = !0, this.fragmentTracker.removeFragment(e), this.fragmentTracker.fragBuffered(e, !0);\n  }\n  resetTransmuxer() {\n    var e;\n    (e = this.transmuxer) == null || e.reset();\n  }\n  recoverWorkerError(e) {\n    e.event === \"demuxerWorker\" && (this.fragmentTracker.removeAllFragments(), this.transmuxer && (this.transmuxer.destroy(), this.transmuxer = null), this.resetStartWhenNotLoaded(), this.resetLoadingState());\n  }\n  set state(e) {\n    const t = this._state;\n    t !== e && (this._state = e, this.log(`${t}->${e}`));\n  }\n  get state() {\n    return this._state;\n  }\n}\nfunction Bh(s) {\n  return !!s.interstitialsController && s.enableInterstitialPlayback !== !1;\n}\nclass ip {\n  constructor() {\n    this.chunks = [], this.dataLength = 0;\n  }\n  push(e) {\n    this.chunks.push(e), this.dataLength += e.length;\n  }\n  flush() {\n    const {\n      chunks: e,\n      dataLength: t\n    } = this;\n    let r;\n    if (e.length)\n      e.length === 1 ? r = e[0] : r = nT(e, t);\n    else return new Uint8Array(0);\n    return this.reset(), r;\n  }\n  reset() {\n    this.chunks.length = 0, this.dataLength = 0;\n  }\n}\nfunction nT(s, e) {\n  const t = new Uint8Array(e);\n  let r = 0;\n  for (let n = 0; n < s.length; n++) {\n    const i = s[n];\n    t.set(i, r), r += i.length;\n  }\n  return t;\n}\nvar ml = { exports: {} }, Fh;\nfunction iT() {\n  return Fh || (Fh = 1, (function(s) {\n    var e = Object.prototype.hasOwnProperty, t = \"~\";\n    function r() {\n    }\n    Object.create && (r.prototype = /* @__PURE__ */ Object.create(null), new r().__proto__ || (t = !1));\n    function n(l, c, u) {\n      this.fn = l, this.context = c, this.once = u || !1;\n    }\n    function i(l, c, u, d, h) {\n      if (typeof u != \"function\")\n        throw new TypeError(\"The listener must be a function\");\n      var f = new n(u, d || l, h), p = t ? t + c : c;\n      return l._events[p] ? l._events[p].fn ? l._events[p] = [l._events[p], f] : l._events[p].push(f) : (l._events[p] = f, l._eventsCount++), l;\n    }\n    function o(l, c) {\n      --l._eventsCount === 0 ? l._events = new r() : delete l._events[c];\n    }\n    function a() {\n      this._events = new r(), this._eventsCount = 0;\n    }\n    a.prototype.eventNames = function() {\n      var c = [], u, d;\n      if (this._eventsCount === 0) return c;\n      for (d in u = this._events)\n        e.call(u, d) && c.push(t ? d.slice(1) : d);\n      return Object.getOwnPropertySymbols ? c.concat(Object.getOwnPropertySymbols(u)) : c;\n    }, a.prototype.listeners = function(c) {\n      var u = t ? t + c : c, d = this._events[u];\n      if (!d) return [];\n      if (d.fn) return [d.fn];\n      for (var h = 0, f = d.length, p = new Array(f); h < f; h++)\n        p[h] = d[h].fn;\n      return p;\n    }, a.prototype.listenerCount = function(c) {\n      var u = t ? t + c : c, d = this._events[u];\n      return d ? d.fn ? 1 : d.length : 0;\n    }, a.prototype.emit = function(c, u, d, h, f, p) {\n      var y = t ? t + c : c;\n      if (!this._events[y]) return !1;\n      var E = this._events[y], b = arguments.length, R, A;\n      if (E.fn) {\n        switch (E.once && this.removeListener(c, E.fn, void 0, !0), b) {\n          case 1:\n            return E.fn.call(E.context), !0;\n          case 2:\n            return E.fn.call(E.context, u), !0;\n          case 3:\n            return E.fn.call(E.context, u, d), !0;\n          case 4:\n            return E.fn.call(E.context, u, d, h), !0;\n          case 5:\n            return E.fn.call(E.context, u, d, h, f), !0;\n          case 6:\n            return E.fn.call(E.context, u, d, h, f, p), !0;\n        }\n        for (A = 1, R = new Array(b - 1); A < b; A++)\n          R[A - 1] = arguments[A];\n        E.fn.apply(E.context, R);\n      } else {\n        var F = E.length, M;\n        for (A = 0; A < F; A++)\n          switch (E[A].once && this.removeListener(c, E[A].fn, void 0, !0), b) {\n            case 1:\n              E[A].fn.call(E[A].context);\n              break;\n            case 2:\n              E[A].fn.call(E[A].context, u);\n              break;\n            case 3:\n              E[A].fn.call(E[A].context, u, d);\n              break;\n            case 4:\n              E[A].fn.call(E[A].context, u, d, h);\n              break;\n            default:\n              if (!R) for (M = 1, R = new Array(b - 1); M < b; M++)\n                R[M - 1] = arguments[M];\n              E[A].fn.apply(E[A].context, R);\n          }\n      }\n      return !0;\n    }, a.prototype.on = function(c, u, d) {\n      return i(this, c, u, d, !1);\n    }, a.prototype.once = function(c, u, d) {\n      return i(this, c, u, d, !0);\n    }, a.prototype.removeListener = function(c, u, d, h) {\n      var f = t ? t + c : c;\n      if (!this._events[f]) return this;\n      if (!u)\n        return o(this, f), this;\n      var p = this._events[f];\n      if (p.fn)\n        p.fn === u && (!h || p.once) && (!d || p.context === d) && o(this, f);\n      else {\n        for (var y = 0, E = [], b = p.length; y < b; y++)\n          (p[y].fn !== u || h && !p[y].once || d && p[y].context !== d) && E.push(p[y]);\n        E.length ? this._events[f] = E.length === 1 ? E[0] : E : o(this, f);\n      }\n      return this;\n    }, a.prototype.removeAllListeners = function(c) {\n      var u;\n      return c ? (u = t ? t + c : c, this._events[u] && o(this, u)) : (this._events = new r(), this._eventsCount = 0), this;\n    }, a.prototype.off = a.prototype.removeListener, a.prototype.addListener = a.prototype.on, a.prefixed = t, a.EventEmitter = a, s.exports = a;\n  })(ml)), ml.exports;\n}\nvar oT = iT(), wu = /* @__PURE__ */ kS(oT);\nconst vi = \"1.6.12\", Nn = {};\nfunction aT() {\n  return typeof __HLS_WORKER_BUNDLE__ == \"function\";\n}\nfunction lT() {\n  const s = Nn[vi];\n  if (s)\n    return s.clientCount++, s;\n  const e = new self.Blob([`var exports={};var module={exports:exports};function define(f){f()};define.amd=true;(${__HLS_WORKER_BUNDLE__.toString()})(true);`], {\n    type: \"text/javascript\"\n  }), t = self.URL.createObjectURL(e), n = {\n    worker: new self.Worker(t),\n    objectURL: t,\n    clientCount: 1\n  };\n  return Nn[vi] = n, n;\n}\nfunction cT(s) {\n  const e = Nn[s];\n  if (e)\n    return e.clientCount++, e;\n  const t = new self.URL(s, self.location.href).href, n = {\n    worker: new self.Worker(t),\n    scriptURL: t,\n    clientCount: 1\n  };\n  return Nn[s] = n, n;\n}\nfunction uT(s) {\n  const e = Nn[s || vi];\n  if (e && e.clientCount-- === 1) {\n    const {\n      worker: r,\n      objectURL: n\n    } = e;\n    delete Nn[s || vi], n && self.URL.revokeObjectURL(n), r.terminate();\n  }\n}\nfunction op(s, e) {\n  return e + 10 <= s.length && s[e] === 51 && s[e + 1] === 68 && s[e + 2] === 73 && s[e + 3] < 255 && s[e + 4] < 255 && s[e + 6] < 128 && s[e + 7] < 128 && s[e + 8] < 128 && s[e + 9] < 128;\n}\nfunction Au(s, e) {\n  return e + 10 <= s.length && s[e] === 73 && s[e + 1] === 68 && s[e + 2] === 51 && s[e + 3] < 255 && s[e + 4] < 255 && s[e + 6] < 128 && s[e + 7] < 128 && s[e + 8] < 128 && s[e + 9] < 128;\n}\nfunction va(s, e) {\n  let t = 0;\n  return t = (s[e] & 127) << 21, t |= (s[e + 1] & 127) << 14, t |= (s[e + 2] & 127) << 7, t |= s[e + 3] & 127, t;\n}\nfunction Ei(s, e) {\n  const t = e;\n  let r = 0;\n  for (; Au(s, e); ) {\n    r += 10;\n    const n = va(s, e + 6);\n    r += n, op(s, e + 10) && (r += 10), e += r;\n  }\n  if (r > 0)\n    return s.subarray(t, t + r);\n}\nfunction dT(s, e, t, r) {\n  const n = [96e3, 88200, 64e3, 48e3, 44100, 32e3, 24e3, 22050, 16e3, 12e3, 11025, 8e3, 7350], i = e[t + 2], o = i >> 2 & 15;\n  if (o > 12) {\n    const f = new Error(`invalid ADTS sampling index:${o}`);\n    s.emit(I.ERROR, I.ERROR, {\n      type: ve.MEDIA_ERROR,\n      details: J.FRAG_PARSING_ERROR,\n      fatal: !0,\n      error: f,\n      reason: f.message\n    });\n    return;\n  }\n  const a = (i >> 6 & 3) + 1, l = e[t + 3] >> 6 & 3 | (i & 1) << 2, c = \"mp4a.40.\" + a, u = n[o];\n  let d = o;\n  (a === 5 || a === 29) && (d -= 3);\n  const h = [a << 3 | (d & 14) >> 1, (d & 1) << 7 | l << 3];\n  return rt.log(`manifest codec:${r}, parsed codec:${c}, channels:${l}, rate:${u} (ADTS object type:${a} sampling index:${o})`), {\n    config: h,\n    samplerate: u,\n    channelCount: l,\n    codec: c,\n    parsedCodec: c,\n    manifestCodec: r\n  };\n}\nfunction ap(s, e) {\n  return s[e] === 255 && (s[e + 1] & 246) === 240;\n}\nfunction lp(s, e) {\n  return s[e + 1] & 1 ? 7 : 9;\n}\nfunction Iu(s, e) {\n  return (s[e + 3] & 3) << 11 | s[e + 4] << 3 | (s[e + 5] & 224) >>> 5;\n}\nfunction hT(s, e) {\n  return e + 5 < s.length;\n}\nfunction na(s, e) {\n  return e + 1 < s.length && ap(s, e);\n}\nfunction fT(s, e) {\n  return hT(s, e) && ap(s, e) && Iu(s, e) <= s.length - e;\n}\nfunction gT(s, e) {\n  if (na(s, e)) {\n    const t = lp(s, e);\n    if (e + t >= s.length)\n      return !1;\n    const r = Iu(s, e);\n    if (r <= t)\n      return !1;\n    const n = e + r;\n    return n === s.length || na(s, n);\n  }\n  return !1;\n}\nfunction cp(s, e, t, r, n) {\n  if (!s.samplerate) {\n    const i = dT(e, t, r, n);\n    if (!i)\n      return;\n    nt(s, i);\n  }\n}\nfunction up(s) {\n  return 1024 * 9e4 / s;\n}\nfunction pT(s, e) {\n  const t = lp(s, e);\n  if (e + t <= s.length) {\n    const r = Iu(s, e) - t;\n    if (r > 0)\n      return {\n        headerLength: t,\n        frameLength: r\n      };\n  }\n}\nfunction dp(s, e, t, r, n) {\n  const i = up(s.samplerate), o = r + n * i, a = pT(e, t);\n  let l;\n  if (a) {\n    const {\n      frameLength: d,\n      headerLength: h\n    } = a, f = h + d, p = Math.max(0, t + f - e.length);\n    p ? (l = new Uint8Array(f - h), l.set(e.subarray(t + h, e.length), 0)) : l = e.subarray(t + h, t + f);\n    const y = {\n      unit: l,\n      pts: o\n    };\n    return p || s.samples.push(y), {\n      sample: y,\n      length: f,\n      missing: p\n    };\n  }\n  const c = e.length - t;\n  return l = new Uint8Array(c), l.set(e.subarray(t, e.length), 0), {\n    sample: {\n      unit: l,\n      pts: o\n    },\n    length: c,\n    missing: -1\n  };\n}\nfunction mT(s, e) {\n  return Au(s, e) && va(s, e + 6) + 10 <= s.length - e;\n}\nfunction yT(s) {\n  return s instanceof ArrayBuffer ? s : s.byteOffset == 0 && s.byteLength == s.buffer.byteLength ? s.buffer : new Uint8Array(s).buffer;\n}\nfunction yl(s, e = 0, t = 1 / 0) {\n  return vT(s, e, t, Uint8Array);\n}\nfunction vT(s, e, t, r) {\n  const n = ET(s);\n  let i = 1;\n  \"BYTES_PER_ELEMENT\" in r && (i = r.BYTES_PER_ELEMENT);\n  const o = xT(s) ? s.byteOffset : 0, a = (o + s.byteLength) / i, l = (o + e) / i, c = Math.floor(Math.max(0, Math.min(l, a))), u = Math.floor(Math.min(c + Math.max(t, 0), a));\n  return new r(n, c, u - c);\n}\nfunction ET(s) {\n  return s instanceof ArrayBuffer ? s : s.buffer;\n}\nfunction xT(s) {\n  return s && s.buffer instanceof ArrayBuffer && s.byteLength !== void 0 && s.byteOffset !== void 0;\n}\nfunction ST(s) {\n  const e = {\n    key: s.type,\n    description: \"\",\n    data: \"\",\n    mimeType: null,\n    pictureType: null\n  }, t = 3;\n  if (s.size < 2)\n    return;\n  if (s.data[0] !== t) {\n    console.log(\"Ignore frame with unrecognized character encoding\");\n    return;\n  }\n  const r = s.data.subarray(1).indexOf(0);\n  if (r === -1)\n    return;\n  const n = Tr(yl(s.data, 1, r)), i = s.data[2 + r], o = s.data.subarray(3 + r).indexOf(0);\n  if (o === -1)\n    return;\n  const a = Tr(yl(s.data, 3 + r, o));\n  let l;\n  return n === \"-->\" ? l = Tr(yl(s.data, 4 + r + o)) : l = yT(s.data.subarray(4 + r + o)), e.mimeType = n, e.pictureType = i, e.description = a, e.data = l, e;\n}\nfunction bT(s) {\n  if (s.size < 2)\n    return;\n  const e = Tr(s.data, !0), t = new Uint8Array(s.data.subarray(e.length + 1));\n  return {\n    key: s.type,\n    info: e,\n    data: t.buffer\n  };\n}\nfunction TT(s) {\n  if (s.size < 2)\n    return;\n  if (s.type === \"TXXX\") {\n    let t = 1;\n    const r = Tr(s.data.subarray(t), !0);\n    t += r.length + 1;\n    const n = Tr(s.data.subarray(t));\n    return {\n      key: s.type,\n      info: r,\n      data: n\n    };\n  }\n  const e = Tr(s.data.subarray(1));\n  return {\n    key: s.type,\n    info: \"\",\n    data: e\n  };\n}\nfunction wT(s) {\n  if (s.type === \"WXXX\") {\n    if (s.size < 2)\n      return;\n    let t = 1;\n    const r = Tr(s.data.subarray(t), !0);\n    t += r.length + 1;\n    const n = Tr(s.data.subarray(t));\n    return {\n      key: s.type,\n      info: r,\n      data: n\n    };\n  }\n  const e = Tr(s.data);\n  return {\n    key: s.type,\n    info: \"\",\n    data: e\n  };\n}\nfunction AT(s) {\n  return s.type === \"PRIV\" ? bT(s) : s.type[0] === \"W\" ? wT(s) : s.type === \"APIC\" ? ST(s) : TT(s);\n}\nfunction IT(s) {\n  const e = String.fromCharCode(s[0], s[1], s[2], s[3]), t = va(s, 4), r = 10;\n  return {\n    type: e,\n    size: t,\n    data: s.subarray(r, r + t)\n  };\n}\nconst zi = 10, _T = 10;\nfunction hp(s) {\n  let e = 0;\n  const t = [];\n  for (; Au(s, e); ) {\n    const r = va(s, e + 6);\n    s[e + 5] >> 6 & 1 && (e += zi), e += zi;\n    const n = e + r;\n    for (; e + _T < n; ) {\n      const i = IT(s.subarray(e)), o = AT(i);\n      o && t.push(o), e += i.size + zi;\n    }\n    op(s, e) && (e += zi);\n  }\n  return t;\n}\nfunction fp(s) {\n  return s && s.key === \"PRIV\" && s.info === \"com.apple.streaming.transportStreamTimestamp\";\n}\nfunction RT(s) {\n  if (s.data.byteLength === 8) {\n    const e = new Uint8Array(s.data), t = e[3] & 1;\n    let r = (e[4] << 23) + (e[5] << 15) + (e[6] << 7) + e[7];\n    return r /= 45, t && (r += 4772185884e-2), Math.round(r);\n  }\n}\nfunction _u(s) {\n  const e = hp(s);\n  for (let t = 0; t < e.length; t++) {\n    const r = e[t];\n    if (fp(r))\n      return RT(r);\n  }\n}\nlet br = /* @__PURE__ */ (function(s) {\n  return s.audioId3 = \"org.id3\", s.dateRange = \"com.apple.quicktime.HLS\", s.emsg = \"https://aomedia.org/emsg/ID3\", s.misbklv = \"urn:misb:KLV:bin:1910.1\", s;\n})({});\nfunction jr(s = \"\", e = 9e4) {\n  return {\n    type: s,\n    id: -1,\n    pid: -1,\n    inputTimeScale: e,\n    sequenceNumber: -1,\n    samples: [],\n    dropped: 0\n  };\n}\nclass Ru {\n  constructor() {\n    this._audioTrack = void 0, this._id3Track = void 0, this.frameIndex = 0, this.cachedData = null, this.basePTS = null, this.initPTS = null, this.lastPTS = null;\n  }\n  resetInitSegment(e, t, r, n) {\n    this._id3Track = {\n      type: \"id3\",\n      id: 3,\n      pid: -1,\n      inputTimeScale: 9e4,\n      sequenceNumber: 0,\n      samples: [],\n      dropped: 0\n    };\n  }\n  resetTimeStamp(e) {\n    this.initPTS = e, this.resetContiguity();\n  }\n  resetContiguity() {\n    this.basePTS = null, this.lastPTS = null, this.frameIndex = 0;\n  }\n  canParse(e, t) {\n    return !1;\n  }\n  appendFrame(e, t, r) {\n  }\n  // feed incoming data to the front of the parsing pipeline\n  demux(e, t) {\n    this.cachedData && (e = _r(this.cachedData, e), this.cachedData = null);\n    let r = Ei(e, 0), n = r ? r.length : 0, i;\n    const o = this._audioTrack, a = this._id3Track, l = r ? _u(r) : void 0, c = e.length;\n    for ((this.basePTS === null || this.frameIndex === 0 && ue(l)) && (this.basePTS = LT(l, t, this.initPTS), this.lastPTS = this.basePTS), this.lastPTS === null && (this.lastPTS = this.basePTS), r && r.length > 0 && a.samples.push({\n      pts: this.lastPTS,\n      dts: this.lastPTS,\n      data: r,\n      type: br.audioId3,\n      duration: Number.POSITIVE_INFINITY\n    }); n < c; ) {\n      if (this.canParse(e, n)) {\n        const u = this.appendFrame(o, e, n);\n        u ? (this.frameIndex++, this.lastPTS = u.sample.pts, n += u.length, i = n) : n = c;\n      } else mT(e, n) ? (r = Ei(e, n), a.samples.push({\n        pts: this.lastPTS,\n        dts: this.lastPTS,\n        data: r,\n        type: br.audioId3,\n        duration: Number.POSITIVE_INFINITY\n      }), n += r.length, i = n) : n++;\n      if (n === c && i !== c) {\n        const u = e.slice(i);\n        this.cachedData ? this.cachedData = _r(this.cachedData, u) : this.cachedData = u;\n      }\n    }\n    return {\n      audioTrack: o,\n      videoTrack: jr(),\n      id3Track: a,\n      textTrack: jr()\n    };\n  }\n  demuxSampleAes(e, t, r) {\n    return Promise.reject(new Error(`[${this}] This demuxer does not support Sample-AES decryption`));\n  }\n  flush(e) {\n    const t = this.cachedData;\n    return t && (this.cachedData = null, this.demux(t, 0)), {\n      audioTrack: this._audioTrack,\n      videoTrack: jr(),\n      id3Track: this._id3Track,\n      textTrack: jr()\n    };\n  }\n  destroy() {\n    this.cachedData = null, this._audioTrack = this._id3Track = void 0;\n  }\n}\nconst LT = (s, e, t) => {\n  if (ue(s))\n    return s * 90;\n  const r = t ? t.baseTime * 9e4 / t.timescale : 0;\n  return e * 9e4 + r;\n};\nlet Yi = null;\nconst CT = [32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160], kT = [44100, 48e3, 32e3, 22050, 24e3, 16e3, 11025, 12e3, 8e3], DT = [\n  // MPEG 2.5\n  [\n    0,\n    // Reserved\n    72,\n    // Layer3\n    144,\n    // Layer2\n    12\n    // Layer1\n  ],\n  // Reserved\n  [\n    0,\n    // Reserved\n    0,\n    // Layer3\n    0,\n    // Layer2\n    0\n    // Layer1\n  ],\n  // MPEG 2\n  [\n    0,\n    // Reserved\n    72,\n    // Layer3\n    144,\n    // Layer2\n    12\n    // Layer1\n  ],\n  // MPEG 1\n  [\n    0,\n    // Reserved\n    144,\n    // Layer3\n    144,\n    // Layer2\n    12\n    // Layer1\n  ]\n], PT = [\n  0,\n  // Reserved\n  1,\n  // Layer3\n  1,\n  // Layer2\n  4\n  // Layer1\n];\nfunction gp(s, e, t, r, n) {\n  if (t + 24 > e.length)\n    return;\n  const i = pp(e, t);\n  if (i && t + i.frameLength <= e.length) {\n    const o = i.samplesPerFrame * 9e4 / i.sampleRate, a = r + n * o, l = {\n      unit: e.subarray(t, t + i.frameLength),\n      pts: a,\n      dts: a\n    };\n    return s.config = [], s.channelCount = i.channelCount, s.samplerate = i.sampleRate, s.samples.push(l), {\n      sample: l,\n      length: i.frameLength,\n      missing: 0\n    };\n  }\n}\nfunction pp(s, e) {\n  const t = s[e + 1] >> 3 & 3, r = s[e + 1] >> 1 & 3, n = s[e + 2] >> 4 & 15, i = s[e + 2] >> 2 & 3;\n  if (t !== 1 && n !== 0 && n !== 15 && i !== 3) {\n    const o = s[e + 2] >> 1 & 1, a = s[e + 3] >> 6, l = t === 3 ? 3 - r : r === 3 ? 3 : 4, c = CT[l * 14 + n - 1] * 1e3, d = kT[(t === 3 ? 0 : t === 2 ? 1 : 2) * 3 + i], h = a === 3 ? 1 : 2, f = DT[t][r], p = PT[r], y = f * 8 * p, E = Math.floor(f * c / d + o) * p;\n    if (Yi === null) {\n      const A = (navigator.userAgent || \"\").match(/Chrome\\/(\\d+)/i);\n      Yi = A ? parseInt(A[1]) : 0;\n    }\n    return !!Yi && Yi <= 87 && r === 2 && c >= 224e3 && a === 0 && (s[e + 3] = s[e + 3] | 128), {\n      sampleRate: d,\n      channelCount: h,\n      frameLength: E,\n      samplesPerFrame: y\n    };\n  }\n}\nfunction Lu(s, e) {\n  return s[e] === 255 && (s[e + 1] & 224) === 224 && (s[e + 1] & 6) !== 0;\n}\nfunction mp(s, e) {\n  return e + 1 < s.length && Lu(s, e);\n}\nfunction MT(s, e) {\n  return Lu(s, e) && 4 <= s.length - e;\n}\nfunction yp(s, e) {\n  if (e + 1 < s.length && Lu(s, e)) {\n    const r = pp(s, e);\n    let n = 4;\n    r != null && r.frameLength && (n = r.frameLength);\n    const i = e + n;\n    return i === s.length || mp(s, i);\n  }\n  return !1;\n}\nclass OT extends Ru {\n  constructor(e, t) {\n    super(), this.observer = void 0, this.config = void 0, this.observer = e, this.config = t;\n  }\n  resetInitSegment(e, t, r, n) {\n    super.resetInitSegment(e, t, r, n), this._audioTrack = {\n      container: \"audio/adts\",\n      type: \"audio\",\n      id: 2,\n      pid: -1,\n      sequenceNumber: 0,\n      segmentCodec: \"aac\",\n      samples: [],\n      manifestCodec: t,\n      duration: n,\n      inputTimeScale: 9e4,\n      dropped: 0\n    };\n  }\n  // Source for probe info - https://wiki.multimedia.cx/index.php?title=ADTS\n  static probe(e, t) {\n    if (!e)\n      return !1;\n    const r = Ei(e, 0);\n    let n = (r == null ? void 0 : r.length) || 0;\n    if (yp(e, n))\n      return !1;\n    for (let i = e.length; n < i; n++)\n      if (gT(e, n))\n        return t.log(\"ADTS sync word found !\"), !0;\n    return !1;\n  }\n  canParse(e, t) {\n    return fT(e, t);\n  }\n  appendFrame(e, t, r) {\n    cp(e, this.observer, t, r, e.manifestCodec);\n    const n = dp(e, t, r, this.basePTS, this.frameIndex);\n    if (n && n.missing === 0)\n      return n;\n  }\n}\nconst vp = (s, e) => {\n  let t = 0, r = 5;\n  e += r;\n  const n = new Uint32Array(1), i = new Uint32Array(1), o = new Uint8Array(1);\n  for (; r > 0; ) {\n    o[0] = s[e];\n    const a = Math.min(r, 8), l = 8 - a;\n    i[0] = 4278190080 >>> 24 + l << l, n[0] = (o[0] & i[0]) >> l, t = t ? t << a | n[0] : n[0], e += 1, r -= a;\n  }\n  return t;\n};\nclass BT extends Ru {\n  constructor(e) {\n    super(), this.observer = void 0, this.observer = e;\n  }\n  resetInitSegment(e, t, r, n) {\n    super.resetInitSegment(e, t, r, n), this._audioTrack = {\n      container: \"audio/ac-3\",\n      type: \"audio\",\n      id: 2,\n      pid: -1,\n      sequenceNumber: 0,\n      segmentCodec: \"ac3\",\n      samples: [],\n      manifestCodec: t,\n      duration: n,\n      inputTimeScale: 9e4,\n      dropped: 0\n    };\n  }\n  canParse(e, t) {\n    return t + 64 < e.length;\n  }\n  appendFrame(e, t, r) {\n    const n = Ep(e, t, r, this.basePTS, this.frameIndex);\n    if (n !== -1)\n      return {\n        sample: e.samples[e.samples.length - 1],\n        length: n,\n        missing: 0\n      };\n  }\n  static probe(e) {\n    if (!e)\n      return !1;\n    const t = Ei(e, 0);\n    if (!t)\n      return !1;\n    const r = t.length;\n    return e[r] === 11 && e[r + 1] === 119 && _u(t) !== void 0 && // check the bsid to confirm ac-3\n    vp(e, r) < 16;\n  }\n}\nfunction Ep(s, e, t, r, n) {\n  if (t + 8 > e.length || e[t] !== 11 || e[t + 1] !== 119)\n    return -1;\n  const i = e[t + 4] >> 6;\n  if (i >= 3)\n    return -1;\n  const a = [48e3, 44100, 32e3][i], l = e[t + 4] & 63, u = [64, 69, 96, 64, 70, 96, 80, 87, 120, 80, 88, 120, 96, 104, 144, 96, 105, 144, 112, 121, 168, 112, 122, 168, 128, 139, 192, 128, 140, 192, 160, 174, 240, 160, 175, 240, 192, 208, 288, 192, 209, 288, 224, 243, 336, 224, 244, 336, 256, 278, 384, 256, 279, 384, 320, 348, 480, 320, 349, 480, 384, 417, 576, 384, 418, 576, 448, 487, 672, 448, 488, 672, 512, 557, 768, 512, 558, 768, 640, 696, 960, 640, 697, 960, 768, 835, 1152, 768, 836, 1152, 896, 975, 1344, 896, 976, 1344, 1024, 1114, 1536, 1024, 1115, 1536, 1152, 1253, 1728, 1152, 1254, 1728, 1280, 1393, 1920, 1280, 1394, 1920][l * 3 + i] * 2;\n  if (t + u > e.length)\n    return -1;\n  const d = e[t + 6] >> 5;\n  let h = 0;\n  d === 2 ? h += 2 : (d & 1 && d !== 1 && (h += 2), d & 4 && (h += 2));\n  const f = (e[t + 6] << 8 | e[t + 7]) >> 12 - h & 1, y = [2, 1, 2, 3, 3, 4, 4, 5][d] + f, E = e[t + 5] >> 3, b = e[t + 5] & 7, R = new Uint8Array([i << 6 | E << 1 | b >> 2, (b & 3) << 6 | d << 3 | f << 2 | l >> 4, l << 4 & 224]), A = 1536 / a * 9e4, F = r + n * A, M = e.subarray(t, t + u);\n  return s.config = R, s.channelCount = y, s.samplerate = a, s.samples.push({\n    unit: M,\n    pts: F\n  }), u;\n}\nclass FT extends Ru {\n  resetInitSegment(e, t, r, n) {\n    super.resetInitSegment(e, t, r, n), this._audioTrack = {\n      container: \"audio/mpeg\",\n      type: \"audio\",\n      id: 2,\n      pid: -1,\n      sequenceNumber: 0,\n      segmentCodec: \"mp3\",\n      samples: [],\n      manifestCodec: t,\n      duration: n,\n      inputTimeScale: 9e4,\n      dropped: 0\n    };\n  }\n  static probe(e) {\n    if (!e)\n      return !1;\n    const t = Ei(e, 0);\n    let r = (t == null ? void 0 : t.length) || 0;\n    if (t && e[r] === 11 && e[r + 1] === 119 && _u(t) !== void 0 && // check the bsid to confirm ac-3 or ec-3 (not mp3)\n    vp(e, r) <= 16)\n      return !1;\n    for (let n = e.length; r < n; r++)\n      if (yp(e, r))\n        return rt.log(\"MPEG Audio sync word found !\"), !0;\n    return !1;\n  }\n  canParse(e, t) {\n    return MT(e, t);\n  }\n  appendFrame(e, t, r) {\n    if (this.basePTS !== null)\n      return gp(e, t, r, this.basePTS, this.frameIndex);\n  }\n}\nconst NT = /\\/emsg[-/]ID3/i;\nclass UT {\n  constructor(e, t) {\n    this.remainderData = null, this.timeOffset = 0, this.config = void 0, this.videoTrack = void 0, this.audioTrack = void 0, this.id3Track = void 0, this.txtTrack = void 0, this.config = t;\n  }\n  resetTimeStamp() {\n  }\n  resetInitSegment(e, t, r, n) {\n    const i = this.videoTrack = jr(\"video\", 1), o = this.audioTrack = jr(\"audio\", 1), a = this.txtTrack = jr(\"text\", 1);\n    if (this.id3Track = jr(\"id3\", 1), this.timeOffset = 0, !(e != null && e.byteLength))\n      return;\n    const l = Dg(e);\n    if (l.video) {\n      const {\n        id: c,\n        timescale: u,\n        codec: d,\n        supplemental: h\n      } = l.video;\n      i.id = c, i.timescale = a.timescale = u, i.codec = d, i.supplemental = h;\n    }\n    if (l.audio) {\n      const {\n        id: c,\n        timescale: u,\n        codec: d\n      } = l.audio;\n      o.id = c, o.timescale = u, o.codec = d;\n    }\n    a.id = Lg.text, i.sampleDuration = 0, i.duration = o.duration = n;\n  }\n  resetContiguity() {\n    this.remainderData = null;\n  }\n  static probe(e) {\n    return BS(e);\n  }\n  demux(e, t) {\n    this.timeOffset = t;\n    let r = e;\n    const n = this.videoTrack, i = this.txtTrack;\n    if (this.config.progressive) {\n      this.remainderData && (r = _r(this.remainderData, e));\n      const a = VS(r);\n      this.remainderData = a.remainder, n.samples = a.valid || new Uint8Array();\n    } else\n      n.samples = r;\n    const o = this.extractID3Track(n, t);\n    return i.samples = rh(t, n), {\n      videoTrack: n,\n      audioTrack: this.audioTrack,\n      id3Track: o,\n      textTrack: this.txtTrack\n    };\n  }\n  flush() {\n    const e = this.timeOffset, t = this.videoTrack, r = this.txtTrack;\n    t.samples = this.remainderData || new Uint8Array(), this.remainderData = null;\n    const n = this.extractID3Track(t, this.timeOffset);\n    return r.samples = rh(e, t), {\n      videoTrack: t,\n      audioTrack: jr(),\n      id3Track: n,\n      textTrack: jr()\n    };\n  }\n  extractID3Track(e, t) {\n    const r = this.id3Track;\n    if (e.samples.length) {\n      const n = Ge(e.samples, [\"emsg\"]);\n      n && n.forEach((i) => {\n        const o = KS(i);\n        if (NT.test(o.schemeIdUri)) {\n          const a = Nh(o, t);\n          let l = o.eventDuration === 4294967295 ? Number.POSITIVE_INFINITY : o.eventDuration / o.timeScale;\n          l <= 1e-3 && (l = Number.POSITIVE_INFINITY);\n          const c = o.payload;\n          r.samples.push({\n            data: c,\n            len: c.byteLength,\n            dts: a,\n            pts: a,\n            type: br.emsg,\n            duration: l\n          });\n        } else if (this.config.enableEmsgKLVMetadata && o.schemeIdUri.startsWith(\"urn:misb:KLV:bin:1910.1\")) {\n          const a = Nh(o, t);\n          r.samples.push({\n            data: o.payload,\n            len: o.payload.byteLength,\n            dts: a,\n            pts: a,\n            type: br.misbklv,\n            duration: Number.POSITIVE_INFINITY\n          });\n        }\n      });\n    }\n    return r;\n  }\n  demuxSampleAes(e, t, r) {\n    return Promise.reject(new Error(\"The MP4 demuxer does not support SAMPLE-AES decryption\"));\n  }\n  destroy() {\n    this.config = null, this.remainderData = null, this.videoTrack = this.audioTrack = this.id3Track = this.txtTrack = void 0;\n  }\n}\nfunction Nh(s, e) {\n  return ue(s.presentationTime) ? s.presentationTime / s.timeScale : e + s.presentationTimeDelta / s.timeScale;\n}\nclass $T {\n  constructor(e, t, r) {\n    this.keyData = void 0, this.decrypter = void 0, this.keyData = r, this.decrypter = new vu(t, {\n      removePKCS7Padding: !1\n    });\n  }\n  decryptBuffer(e) {\n    return this.decrypter.decrypt(e, this.keyData.key.buffer, this.keyData.iv.buffer, Os.cbc);\n  }\n  // AAC - encrypt all full 16 bytes blocks starting from offset 16\n  decryptAacSample(e, t, r) {\n    const n = e[t].unit;\n    if (n.length <= 16)\n      return;\n    const i = n.subarray(16, n.length - n.length % 16), o = i.buffer.slice(i.byteOffset, i.byteOffset + i.length);\n    this.decryptBuffer(o).then((a) => {\n      const l = new Uint8Array(a);\n      n.set(l, 16), this.decrypter.isSync() || this.decryptAacSamples(e, t + 1, r);\n    }).catch(r);\n  }\n  decryptAacSamples(e, t, r) {\n    for (; ; t++) {\n      if (t >= e.length) {\n        r();\n        return;\n      }\n      if (!(e[t].unit.length < 32) && (this.decryptAacSample(e, t, r), !this.decrypter.isSync()))\n        return;\n    }\n  }\n  // AVC - encrypt one 16 bytes block out of ten, starting from offset 32\n  getAvcEncryptedData(e) {\n    const t = Math.floor((e.length - 48) / 160) * 16 + 16, r = new Int8Array(t);\n    let n = 0;\n    for (let i = 32; i < e.length - 16; i += 160, n += 16)\n      r.set(e.subarray(i, i + 16), n);\n    return r;\n  }\n  getAvcDecryptedUnit(e, t) {\n    const r = new Uint8Array(t);\n    let n = 0;\n    for (let i = 32; i < e.length - 16; i += 160, n += 16)\n      e.set(r.subarray(n, n + 16), i);\n    return e;\n  }\n  decryptAvcSample(e, t, r, n, i) {\n    const o = Mg(i.data), a = this.getAvcEncryptedData(o);\n    this.decryptBuffer(a.buffer).then((l) => {\n      i.data = this.getAvcDecryptedUnit(o, l), this.decrypter.isSync() || this.decryptAvcSamples(e, t, r + 1, n);\n    }).catch(n);\n  }\n  decryptAvcSamples(e, t, r, n) {\n    if (e instanceof Uint8Array)\n      throw new Error(\"Cannot decrypt samples of type Uint8Array\");\n    for (; ; t++, r = 0) {\n      if (t >= e.length) {\n        n();\n        return;\n      }\n      const i = e[t].units;\n      for (; !(r >= i.length); r++) {\n        const o = i[r];\n        if (!(o.data.length <= 48 || o.type !== 1 && o.type !== 5) && (this.decryptAvcSample(e, t, r, n, o), !this.decrypter.isSync()))\n          return;\n      }\n    }\n  }\n}\nclass xp {\n  constructor() {\n    this.VideoSample = null;\n  }\n  createVideoSample(e, t, r) {\n    return {\n      key: e,\n      frame: !1,\n      pts: t,\n      dts: r,\n      units: [],\n      length: 0\n    };\n  }\n  getLastNalUnit(e) {\n    var t;\n    let r = this.VideoSample, n;\n    if ((!r || r.units.length === 0) && (r = e[e.length - 1]), (t = r) != null && t.units) {\n      const i = r.units;\n      n = i[i.length - 1];\n    }\n    return n;\n  }\n  pushAccessUnit(e, t) {\n    if (e.units.length && e.frame) {\n      if (e.pts === void 0) {\n        const r = t.samples, n = r.length;\n        if (n) {\n          const i = r[n - 1];\n          e.pts = i.pts, e.dts = i.dts;\n        } else {\n          t.dropped++;\n          return;\n        }\n      }\n      t.samples.push(e);\n    }\n  }\n  parseNALu(e, t, r) {\n    const n = t.byteLength;\n    let i = e.naluState || 0;\n    const o = i, a = [];\n    let l = 0, c, u, d, h = -1, f = 0;\n    for (i === -1 && (h = 0, f = this.getNALuType(t, 0), i = 0, l = 1); l < n; ) {\n      if (c = t[l++], !i) {\n        i = c ? 0 : 1;\n        continue;\n      }\n      if (i === 1) {\n        i = c ? 0 : 2;\n        continue;\n      }\n      if (!c)\n        i = 3;\n      else if (c === 1) {\n        if (u = l - i - 1, h >= 0) {\n          const p = {\n            data: t.subarray(h, u),\n            type: f\n          };\n          a.push(p);\n        } else {\n          const p = this.getLastNalUnit(e.samples);\n          p && (o && l <= 4 - o && p.state && (p.data = p.data.subarray(0, p.data.byteLength - o)), u > 0 && (p.data = _r(p.data, t.subarray(0, u)), p.state = 0));\n        }\n        l < n ? (d = this.getNALuType(t, l), h = l, f = d, i = 0) : i = -1;\n      } else\n        i = 0;\n    }\n    if (h >= 0 && i >= 0) {\n      const p = {\n        data: t.subarray(h, n),\n        type: f,\n        state: i\n      };\n      a.push(p);\n    }\n    if (a.length === 0) {\n      const p = this.getLastNalUnit(e.samples);\n      p && (p.data = _r(p.data, t));\n    }\n    return e.naluState = i, a;\n  }\n}\nclass Zn {\n  constructor(e) {\n    this.data = void 0, this.bytesAvailable = void 0, this.word = void 0, this.bitsAvailable = void 0, this.data = e, this.bytesAvailable = e.byteLength, this.word = 0, this.bitsAvailable = 0;\n  }\n  // ():void\n  loadWord() {\n    const e = this.data, t = this.bytesAvailable, r = e.byteLength - t, n = new Uint8Array(4), i = Math.min(4, t);\n    if (i === 0)\n      throw new Error(\"no bytes available\");\n    n.set(e.subarray(r, r + i)), this.word = new DataView(n.buffer).getUint32(0), this.bitsAvailable = i * 8, this.bytesAvailable -= i;\n  }\n  // (count:int):void\n  skipBits(e) {\n    let t;\n    e = Math.min(e, this.bytesAvailable * 8 + this.bitsAvailable), this.bitsAvailable > e ? (this.word <<= e, this.bitsAvailable -= e) : (e -= this.bitsAvailable, t = e >> 3, e -= t << 3, this.bytesAvailable -= t, this.loadWord(), this.word <<= e, this.bitsAvailable -= e);\n  }\n  // (size:int):uint\n  readBits(e) {\n    let t = Math.min(this.bitsAvailable, e);\n    const r = this.word >>> 32 - t;\n    if (e > 32 && rt.error(\"Cannot read more than 32 bits at a time\"), this.bitsAvailable -= t, this.bitsAvailable > 0)\n      this.word <<= t;\n    else if (this.bytesAvailable > 0)\n      this.loadWord();\n    else\n      throw new Error(\"no bits available\");\n    return t = e - t, t > 0 && this.bitsAvailable ? r << t | this.readBits(t) : r;\n  }\n  // ():uint\n  skipLZ() {\n    let e;\n    for (e = 0; e < this.bitsAvailable; ++e)\n      if ((this.word & 2147483648 >>> e) !== 0)\n        return this.word <<= e, this.bitsAvailable -= e, e;\n    return this.loadWord(), e + this.skipLZ();\n  }\n  // ():void\n  skipUEG() {\n    this.skipBits(1 + this.skipLZ());\n  }\n  // ():void\n  skipEG() {\n    this.skipBits(1 + this.skipLZ());\n  }\n  // ():uint\n  readUEG() {\n    const e = this.skipLZ();\n    return this.readBits(e + 1) - 1;\n  }\n  // ():int\n  readEG() {\n    const e = this.readUEG();\n    return 1 & e ? 1 + e >>> 1 : -1 * (e >>> 1);\n  }\n  // Some convenience functions\n  // :Boolean\n  readBoolean() {\n    return this.readBits(1) === 1;\n  }\n  // ():int\n  readUByte() {\n    return this.readBits(8);\n  }\n  // ():int\n  readUShort() {\n    return this.readBits(16);\n  }\n  // ():int\n  readUInt() {\n    return this.readBits(32);\n  }\n}\nclass GT extends xp {\n  parsePES(e, t, r, n) {\n    const i = this.parseNALu(e, r.data, n);\n    let o = this.VideoSample, a, l = !1;\n    r.data = null, o && i.length && !e.audFound && (this.pushAccessUnit(o, e), o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts)), i.forEach((c) => {\n      var u, d;\n      switch (c.type) {\n        // NDR\n        case 1: {\n          let y = !1;\n          a = !0;\n          const E = c.data;\n          if (l && E.length > 4) {\n            const b = this.readSliceType(E);\n            (b === 2 || b === 4 || b === 7 || b === 9) && (y = !0);\n          }\n          if (y) {\n            var h;\n            (h = o) != null && h.frame && !o.key && (this.pushAccessUnit(o, e), o = this.VideoSample = null);\n          }\n          o || (o = this.VideoSample = this.createVideoSample(!0, r.pts, r.dts)), o.frame = !0, o.key = y;\n          break;\n        }\n        case 5:\n          a = !0, (u = o) != null && u.frame && !o.key && (this.pushAccessUnit(o, e), o = this.VideoSample = null), o || (o = this.VideoSample = this.createVideoSample(!0, r.pts, r.dts)), o.key = !0, o.frame = !0;\n          break;\n        // SEI\n        case 6: {\n          a = !0, gu(c.data, 1, r.pts, t.samples);\n          break;\n        }\n        case 7: {\n          var f, p;\n          a = !0, l = !0;\n          const y = c.data, E = this.readSPS(y);\n          if (!e.sps || e.width !== E.width || e.height !== E.height || ((f = e.pixelRatio) == null ? void 0 : f[0]) !== E.pixelRatio[0] || ((p = e.pixelRatio) == null ? void 0 : p[1]) !== E.pixelRatio[1]) {\n            e.width = E.width, e.height = E.height, e.pixelRatio = E.pixelRatio, e.sps = [y];\n            const b = y.subarray(1, 4);\n            let R = \"avc1.\";\n            for (let A = 0; A < 3; A++) {\n              let F = b[A].toString(16);\n              F.length < 2 && (F = \"0\" + F), R += F;\n            }\n            e.codec = R;\n          }\n          break;\n        }\n        // PPS\n        case 8:\n          a = !0, e.pps = [c.data];\n          break;\n        // AUD\n        case 9:\n          a = !0, e.audFound = !0, (d = o) != null && d.frame && (this.pushAccessUnit(o, e), o = null), o || (o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts));\n          break;\n        // Filler Data\n        case 12:\n          a = !0;\n          break;\n        default:\n          a = !1;\n          break;\n      }\n      o && a && o.units.push(c);\n    }), n && o && (this.pushAccessUnit(o, e), this.VideoSample = null);\n  }\n  getNALuType(e, t) {\n    return e[t] & 31;\n  }\n  readSliceType(e) {\n    const t = new Zn(e);\n    return t.readUByte(), t.readUEG(), t.readUEG();\n  }\n  /**\n   * The scaling list is optionally transmitted as part of a sequence parameter\n   * set and is not relevant to transmuxing.\n   * @param count the number of entries in this scaling list\n   * @see Recommendation ITU-T H.264, Section 7.3.2.1.1.1\n   */\n  skipScalingList(e, t) {\n    let r = 8, n = 8, i;\n    for (let o = 0; o < e; o++)\n      n !== 0 && (i = t.readEG(), n = (r + i + 256) % 256), r = n === 0 ? r : n;\n  }\n  /**\n   * Read a sequence parameter set and return some interesting video\n   * properties. A sequence parameter set is the H264 metadata that\n   * describes the properties of upcoming video frames.\n   * @returns an object with configuration parsed from the\n   * sequence parameter set, including the dimensions of the\n   * associated video frames.\n   */\n  readSPS(e) {\n    const t = new Zn(e);\n    let r = 0, n = 0, i = 0, o = 0, a, l, c;\n    const u = t.readUByte.bind(t), d = t.readBits.bind(t), h = t.readUEG.bind(t), f = t.readBoolean.bind(t), p = t.skipBits.bind(t), y = t.skipEG.bind(t), E = t.skipUEG.bind(t), b = this.skipScalingList.bind(this);\n    u();\n    const R = u();\n    if (d(5), p(3), u(), E(), R === 100 || R === 110 || R === 122 || R === 244 || R === 44 || R === 83 || R === 86 || R === 118 || R === 128) {\n      const j = h();\n      if (j === 3 && p(1), E(), E(), p(1), f())\n        for (l = j !== 3 ? 8 : 12, c = 0; c < l; c++)\n          f() && (c < 6 ? b(16, t) : b(64, t));\n    }\n    E();\n    const A = h();\n    if (A === 0)\n      h();\n    else if (A === 1)\n      for (p(1), y(), y(), a = h(), c = 0; c < a; c++)\n        y();\n    E(), p(1);\n    const F = h(), M = h(), H = d(1);\n    H === 0 && p(1), p(1), f() && (r = h(), n = h(), i = h(), o = h());\n    let K = [1, 1];\n    if (f() && f())\n      switch (u()) {\n        case 1:\n          K = [1, 1];\n          break;\n        case 2:\n          K = [12, 11];\n          break;\n        case 3:\n          K = [10, 11];\n          break;\n        case 4:\n          K = [16, 11];\n          break;\n        case 5:\n          K = [40, 33];\n          break;\n        case 6:\n          K = [24, 11];\n          break;\n        case 7:\n          K = [20, 11];\n          break;\n        case 8:\n          K = [32, 11];\n          break;\n        case 9:\n          K = [80, 33];\n          break;\n        case 10:\n          K = [18, 11];\n          break;\n        case 11:\n          K = [15, 11];\n          break;\n        case 12:\n          K = [64, 33];\n          break;\n        case 13:\n          K = [160, 99];\n          break;\n        case 14:\n          K = [4, 3];\n          break;\n        case 15:\n          K = [3, 2];\n          break;\n        case 16:\n          K = [2, 1];\n          break;\n        case 255: {\n          K = [u() << 8 | u(), u() << 8 | u()];\n          break;\n        }\n      }\n    return {\n      width: Math.ceil((F + 1) * 16 - r * 2 - n * 2),\n      height: (2 - H) * (M + 1) * 16 - (H ? 2 : 4) * (i + o),\n      pixelRatio: K\n    };\n  }\n}\nclass VT extends xp {\n  constructor(...e) {\n    super(...e), this.initVPS = null;\n  }\n  parsePES(e, t, r, n) {\n    const i = this.parseNALu(e, r.data, n);\n    let o = this.VideoSample, a, l = !1;\n    r.data = null, o && i.length && !e.audFound && (this.pushAccessUnit(o, e), o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts)), i.forEach((c) => {\n      var u, d;\n      switch (c.type) {\n        // NON-IDR, NON RANDOM ACCESS SLICE\n        case 0:\n        case 1:\n        case 2:\n        case 3:\n        case 4:\n        case 5:\n        case 6:\n        case 7:\n        case 8:\n        case 9:\n          o || (o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts)), o.frame = !0, a = !0;\n          break;\n        // CRA, BLA (random access picture)\n        case 16:\n        case 17:\n        case 18:\n        case 21:\n          if (a = !0, l) {\n            var h;\n            (h = o) != null && h.frame && !o.key && (this.pushAccessUnit(o, e), o = this.VideoSample = null);\n          }\n          o || (o = this.VideoSample = this.createVideoSample(!0, r.pts, r.dts)), o.key = !0, o.frame = !0;\n          break;\n        // IDR\n        case 19:\n        case 20:\n          a = !0, (u = o) != null && u.frame && !o.key && (this.pushAccessUnit(o, e), o = this.VideoSample = null), o || (o = this.VideoSample = this.createVideoSample(!0, r.pts, r.dts)), o.key = !0, o.frame = !0;\n          break;\n        // SEI\n        case 39:\n          a = !0, gu(\n            c.data,\n            2,\n            // NALu header size\n            r.pts,\n            t.samples\n          );\n          break;\n        // VPS\n        case 32:\n          a = !0, e.vps || (typeof e.params != \"object\" && (e.params = {}), e.params = nt(e.params, this.readVPS(c.data)), this.initVPS = c.data), e.vps = [c.data];\n          break;\n        // SPS\n        case 33:\n          if (a = !0, l = !0, e.vps !== void 0 && e.vps[0] !== this.initVPS && e.sps !== void 0 && !this.matchSPS(e.sps[0], c.data) && (this.initVPS = e.vps[0], e.sps = e.pps = void 0), !e.sps) {\n            const f = this.readSPS(c.data);\n            e.width = f.width, e.height = f.height, e.pixelRatio = f.pixelRatio, e.codec = f.codecString, e.sps = [], typeof e.params != \"object\" && (e.params = {});\n            for (const p in f.params)\n              e.params[p] = f.params[p];\n          }\n          this.pushParameterSet(e.sps, c.data, e.vps), o || (o = this.VideoSample = this.createVideoSample(!0, r.pts, r.dts)), o.key = !0;\n          break;\n        // PPS\n        case 34:\n          if (a = !0, typeof e.params == \"object\") {\n            if (!e.pps) {\n              e.pps = [];\n              const f = this.readPPS(c.data);\n              for (const p in f)\n                e.params[p] = f[p];\n            }\n            this.pushParameterSet(e.pps, c.data, e.vps);\n          }\n          break;\n        // ACCESS UNIT DELIMITER\n        case 35:\n          a = !0, e.audFound = !0, (d = o) != null && d.frame && (this.pushAccessUnit(o, e), o = null), o || (o = this.VideoSample = this.createVideoSample(!1, r.pts, r.dts));\n          break;\n        default:\n          a = !1;\n          break;\n      }\n      o && a && o.units.push(c);\n    }), n && o && (this.pushAccessUnit(o, e), this.VideoSample = null);\n  }\n  pushParameterSet(e, t, r) {\n    (r && r[0] === this.initVPS || !r && !e.length) && e.push(t);\n  }\n  getNALuType(e, t) {\n    return (e[t] & 126) >>> 1;\n  }\n  ebsp2rbsp(e) {\n    const t = new Uint8Array(e.byteLength);\n    let r = 0;\n    for (let n = 0; n < e.byteLength; n++)\n      n >= 2 && e[n] === 3 && e[n - 1] === 0 && e[n - 2] === 0 || (t[r] = e[n], r++);\n    return new Uint8Array(t.buffer, 0, r);\n  }\n  pushAccessUnit(e, t) {\n    super.pushAccessUnit(e, t), this.initVPS && (this.initVPS = null);\n  }\n  readVPS(e) {\n    const t = new Zn(e);\n    t.readUByte(), t.readUByte(), t.readBits(4), t.skipBits(2), t.readBits(6);\n    const r = t.readBits(3), n = t.readBoolean();\n    return {\n      numTemporalLayers: r + 1,\n      temporalIdNested: n\n    };\n  }\n  readSPS(e) {\n    const t = new Zn(this.ebsp2rbsp(e));\n    t.readUByte(), t.readUByte(), t.readBits(4);\n    const r = t.readBits(3);\n    t.readBoolean();\n    const n = t.readBits(2), i = t.readBoolean(), o = t.readBits(5), a = t.readUByte(), l = t.readUByte(), c = t.readUByte(), u = t.readUByte(), d = t.readUByte(), h = t.readUByte(), f = t.readUByte(), p = t.readUByte(), y = t.readUByte(), E = t.readUByte(), b = t.readUByte(), R = [], A = [];\n    for (let ye = 0; ye < r; ye++)\n      R.push(t.readBoolean()), A.push(t.readBoolean());\n    if (r > 0)\n      for (let ye = r; ye < 8; ye++)\n        t.readBits(2);\n    for (let ye = 0; ye < r; ye++)\n      R[ye] && (t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte(), t.readUByte()), A[ye] && t.readUByte();\n    t.readUEG();\n    const F = t.readUEG();\n    F == 3 && t.skipBits(1);\n    const M = t.readUEG(), H = t.readUEG(), K = t.readBoolean();\n    let j = 0, C = 0, k = 0, $ = 0;\n    K && (j += t.readUEG(), C += t.readUEG(), k += t.readUEG(), $ += t.readUEG());\n    const W = t.readUEG(), _ = t.readUEG(), g = t.readUEG(), x = t.readBoolean();\n    for (let ye = x ? 0 : r; ye <= r; ye++)\n      t.skipUEG(), t.skipUEG(), t.skipUEG();\n    if (t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG(), t.readBoolean() && t.readBoolean())\n      for (let be = 0; be < 4; be++)\n        for (let Fe = 0; Fe < (be === 3 ? 2 : 6); Fe++)\n          if (!t.readBoolean())\n            t.readUEG();\n          else {\n            const we = Math.min(64, 1 << 4 + (be << 1));\n            be > 1 && t.readEG();\n            for (let Ne = 0; Ne < we; Ne++)\n              t.readEG();\n          }\n    t.readBoolean(), t.readBoolean(), t.readBoolean() && (t.readUByte(), t.skipUEG(), t.skipUEG(), t.readBoolean());\n    const O = t.readUEG();\n    let U = 0;\n    for (let ye = 0; ye < O; ye++) {\n      let be = !1;\n      if (ye !== 0 && (be = t.readBoolean()), be) {\n        ye === O && t.readUEG(), t.readBoolean(), t.readUEG();\n        let Fe = 0;\n        for (let Xe = 0; Xe <= U; Xe++) {\n          const we = t.readBoolean();\n          let Ne = !1;\n          we || (Ne = t.readBoolean()), (we || Ne) && Fe++;\n        }\n        U = Fe;\n      } else {\n        const Fe = t.readUEG(), Xe = t.readUEG();\n        U = Fe + Xe;\n        for (let we = 0; we < Fe; we++)\n          t.readUEG(), t.readBoolean();\n        for (let we = 0; we < Xe; we++)\n          t.readUEG(), t.readBoolean();\n      }\n    }\n    if (t.readBoolean()) {\n      const ye = t.readUEG();\n      for (let be = 0; be < ye; be++) {\n        for (let Fe = 0; Fe < g + 4; Fe++)\n          t.readBits(1);\n        t.readBits(1);\n      }\n    }\n    let L = 0, m = 1, v = 1, P = !0, N = 1, Y = 0;\n    t.readBoolean(), t.readBoolean();\n    let ee = !1;\n    if (t.readBoolean()) {\n      if (t.readBoolean()) {\n        const dt = t.readUByte(), Je = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2], Qe = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];\n        dt > 0 && dt < 16 ? (m = Je[dt - 1], v = Qe[dt - 1]) : dt === 255 && (m = t.readBits(16), v = t.readBits(16));\n      }\n      if (t.readBoolean() && t.readBoolean(), t.readBoolean() && (t.readBits(3), t.readBoolean(), t.readBoolean() && (t.readUByte(), t.readUByte(), t.readUByte())), t.readBoolean() && (t.readUEG(), t.readUEG()), t.readBoolean(), t.readBoolean(), t.readBoolean(), ee = t.readBoolean(), ee && (t.skipUEG(), t.skipUEG(), t.skipUEG(), t.skipUEG()), t.readBoolean() && (N = t.readBits(32), Y = t.readBits(32), t.readBoolean() && t.readUEG(), t.readBoolean())) {\n        const Qe = t.readBoolean(), it = t.readBoolean();\n        let je = !1;\n        (Qe || it) && (je = t.readBoolean(), je && (t.readUByte(), t.readBits(5), t.readBoolean(), t.readBits(5)), t.readBits(4), t.readBits(4), je && t.readBits(4), t.readBits(5), t.readBits(5), t.readBits(5));\n        for (let B = 0; B <= r; B++) {\n          P = t.readBoolean();\n          const S = P || t.readBoolean();\n          let T = !1;\n          S ? t.readEG() : T = t.readBoolean();\n          const G = T ? 1 : t.readUEG() + 1;\n          if (Qe)\n            for (let Z = 0; Z < G; Z++)\n              t.readUEG(), t.readUEG(), je && (t.readUEG(), t.readUEG()), t.skipBits(1);\n          if (it)\n            for (let Z = 0; Z < G; Z++)\n              t.readUEG(), t.readUEG(), je && (t.readUEG(), t.readUEG()), t.skipBits(1);\n        }\n      }\n      t.readBoolean() && (t.readBoolean(), t.readBoolean(), t.readBoolean(), L = t.readUEG());\n    }\n    let le = M, Te = H;\n    if (K) {\n      let ye = 1, be = 1;\n      F === 1 ? ye = be = 2 : F == 2 && (ye = 2), le = M - ye * C - ye * j, Te = H - be * $ - be * k;\n    }\n    const De = n ? [\"A\", \"B\", \"C\"][n] : \"\", ze = a << 24 | l << 16 | c << 8 | u;\n    let _e = 0;\n    for (let ye = 0; ye < 32; ye++)\n      _e = (_e | (ze >> ye & 1) << 31 - ye) >>> 0;\n    let xe = _e.toString(16);\n    return o === 1 && xe === \"2\" && (xe = \"6\"), {\n      codecString: `hvc1.${De}${o}.${xe}.${i ? \"H\" : \"L\"}${b}.B0`,\n      params: {\n        general_tier_flag: i,\n        general_profile_idc: o,\n        general_profile_space: n,\n        general_profile_compatibility_flags: [a, l, c, u],\n        general_constraint_indicator_flags: [d, h, f, p, y, E],\n        general_level_idc: b,\n        bit_depth: W + 8,\n        bit_depth_luma_minus8: W,\n        bit_depth_chroma_minus8: _,\n        min_spatial_segmentation_idc: L,\n        chroma_format_idc: F,\n        frame_rate: {\n          fixed: P,\n          fps: Y / N\n        }\n      },\n      width: le,\n      height: Te,\n      pixelRatio: [m, v]\n    };\n  }\n  readPPS(e) {\n    const t = new Zn(this.ebsp2rbsp(e));\n    t.readUByte(), t.readUByte(), t.skipUEG(), t.skipUEG(), t.skipBits(2), t.skipBits(3), t.skipBits(2), t.skipUEG(), t.skipUEG(), t.skipEG(), t.skipBits(2), t.readBoolean() && t.skipUEG(), t.skipEG(), t.skipEG(), t.skipBits(4);\n    const n = t.readBoolean(), i = t.readBoolean();\n    let o = 1;\n    return i && n ? o = 0 : i ? o = 3 : n && (o = 2), {\n      parallelismType: o\n    };\n  }\n  matchSPS(e, t) {\n    return String.fromCharCode.apply(null, e).substr(3) === String.fromCharCode.apply(null, t).substr(3);\n  }\n}\nconst Wt = 188;\nclass Is {\n  constructor(e, t, r, n) {\n    this.logger = void 0, this.observer = void 0, this.config = void 0, this.typeSupported = void 0, this.sampleAes = null, this.pmtParsed = !1, this.audioCodec = void 0, this.videoCodec = void 0, this._pmtId = -1, this._videoTrack = void 0, this._audioTrack = void 0, this._id3Track = void 0, this._txtTrack = void 0, this.aacOverFlow = null, this.remainderData = null, this.videoParser = void 0, this.observer = e, this.config = t, this.typeSupported = r, this.logger = n, this.videoParser = null;\n  }\n  static probe(e, t) {\n    const r = Is.syncOffset(e);\n    return r > 0 && t.warn(`MPEG2-TS detected but first sync word found @ offset ${r}`), r !== -1;\n  }\n  static syncOffset(e) {\n    const t = e.length;\n    let r = Math.min(Wt * 5, t - Wt) + 1, n = 0;\n    for (; n < r; ) {\n      let i = !1, o = -1, a = 0;\n      for (let l = n; l < t; l += Wt)\n        if (e[l] === 71 && (t - l === Wt || e[l + Wt] === 71)) {\n          if (a++, o === -1 && (o = l, o !== 0 && (r = Math.min(o + Wt * 99, e.length - Wt) + 1)), i || (i = pc(e, l) === 0), i && a > 1 && (o === 0 && a > 2 || l + Wt > r))\n            return o;\n        } else {\n          if (a)\n            return -1;\n          break;\n        }\n      n++;\n    }\n    return -1;\n  }\n  /**\n   * Creates a track model internal to demuxer used to drive remuxing input\n   */\n  static createTrack(e, t) {\n    return {\n      container: e === \"video\" || e === \"audio\" ? \"video/mp2t\" : void 0,\n      type: e,\n      id: Lg[e],\n      pid: -1,\n      inputTimeScale: 9e4,\n      sequenceNumber: 0,\n      samples: [],\n      dropped: 0,\n      duration: e === \"audio\" ? t : void 0\n    };\n  }\n  /**\n   * Initializes a new init segment on the demuxer/remuxer interface. Needed for discontinuities/track-switches (or at stream start)\n   * Resets all internal track instances of the demuxer.\n   */\n  resetInitSegment(e, t, r, n) {\n    this.pmtParsed = !1, this._pmtId = -1, this._videoTrack = Is.createTrack(\"video\"), this._videoTrack.duration = n, this._audioTrack = Is.createTrack(\"audio\", n), this._id3Track = Is.createTrack(\"id3\"), this._txtTrack = Is.createTrack(\"text\"), this._audioTrack.segmentCodec = \"aac\", this.videoParser = null, this.aacOverFlow = null, this.remainderData = null, this.audioCodec = t, this.videoCodec = r;\n  }\n  resetTimeStamp() {\n  }\n  resetContiguity() {\n    const {\n      _audioTrack: e,\n      _videoTrack: t,\n      _id3Track: r\n    } = this;\n    e && (e.pesData = null), t && (t.pesData = null), r && (r.pesData = null), this.aacOverFlow = null, this.remainderData = null;\n  }\n  demux(e, t, r = !1, n = !1) {\n    r || (this.sampleAes = null);\n    let i;\n    const o = this._videoTrack, a = this._audioTrack, l = this._id3Track, c = this._txtTrack;\n    let u = o.pid, d = o.pesData, h = a.pid, f = l.pid, p = a.pesData, y = l.pesData, E = null, b = this.pmtParsed, R = this._pmtId, A = e.length;\n    if (this.remainderData && (e = _r(this.remainderData, e), A = e.length, this.remainderData = null), A < Wt && !n)\n      return this.remainderData = e, {\n        audioTrack: a,\n        videoTrack: o,\n        id3Track: l,\n        textTrack: c\n      };\n    const F = Math.max(0, Is.syncOffset(e));\n    A -= (A - F) % Wt, A < e.byteLength && !n && (this.remainderData = new Uint8Array(e.buffer, A, e.buffer.byteLength - A));\n    let M = 0;\n    for (let K = F; K < A; K += Wt)\n      if (e[K] === 71) {\n        const j = !!(e[K + 1] & 64), C = pc(e, K), k = (e[K + 3] & 48) >> 4;\n        let $;\n        if (k > 1) {\n          if ($ = K + 5 + e[K + 4], $ === K + Wt)\n            continue;\n        } else\n          $ = K + 4;\n        switch (C) {\n          case u:\n            j && (d && (i = gn(d, this.logger)) && (this.readyVideoParser(o.segmentCodec), this.videoParser !== null && this.videoParser.parsePES(o, c, i, !1)), d = {\n              data: [],\n              size: 0\n            }), d && (d.data.push(e.subarray($, K + Wt)), d.size += K + Wt - $);\n            break;\n          case h:\n            if (j) {\n              if (p && (i = gn(p, this.logger)))\n                switch (a.segmentCodec) {\n                  case \"aac\":\n                    this.parseAACPES(a, i);\n                    break;\n                  case \"mp3\":\n                    this.parseMPEGPES(a, i);\n                    break;\n                  case \"ac3\":\n                    this.parseAC3PES(a, i);\n                    break;\n                }\n              p = {\n                data: [],\n                size: 0\n              };\n            }\n            p && (p.data.push(e.subarray($, K + Wt)), p.size += K + Wt - $);\n            break;\n          case f:\n            j && (y && (i = gn(y, this.logger)) && this.parseID3PES(l, i), y = {\n              data: [],\n              size: 0\n            }), y && (y.data.push(e.subarray($, K + Wt)), y.size += K + Wt - $);\n            break;\n          case 0:\n            j && ($ += e[$] + 1), R = this._pmtId = jT(e, $);\n            break;\n          case R: {\n            j && ($ += e[$] + 1);\n            const W = KT(e, $, this.typeSupported, r, this.observer, this.logger);\n            u = W.videoPid, u > 0 && (o.pid = u, o.segmentCodec = W.segmentVideoCodec), h = W.audioPid, h > 0 && (a.pid = h, a.segmentCodec = W.segmentAudioCodec), f = W.id3Pid, f > 0 && (l.pid = f), E !== null && !b && (this.logger.warn(`MPEG-TS PMT found at ${K} after unknown PID '${E}'. Backtracking to sync byte @${F} to parse all TS packets.`), E = null, K = F - 188), b = this.pmtParsed = !0;\n            break;\n          }\n          case 17:\n          case 8191:\n            break;\n          default:\n            E = C;\n            break;\n        }\n      } else\n        M++;\n    M > 0 && mc(this.observer, new Error(`Found ${M} TS packet/s that do not start with 0x47`), void 0, this.logger), o.pesData = d, a.pesData = p, l.pesData = y;\n    const H = {\n      audioTrack: a,\n      videoTrack: o,\n      id3Track: l,\n      textTrack: c\n    };\n    return n && this.extractRemainingSamples(H), H;\n  }\n  flush() {\n    const {\n      remainderData: e\n    } = this;\n    this.remainderData = null;\n    let t;\n    return e ? t = this.demux(e, -1, !1, !0) : t = {\n      videoTrack: this._videoTrack,\n      audioTrack: this._audioTrack,\n      id3Track: this._id3Track,\n      textTrack: this._txtTrack\n    }, this.extractRemainingSamples(t), this.sampleAes ? this.decrypt(t, this.sampleAes) : t;\n  }\n  extractRemainingSamples(e) {\n    const {\n      audioTrack: t,\n      videoTrack: r,\n      id3Track: n,\n      textTrack: i\n    } = e, o = r.pesData, a = t.pesData, l = n.pesData;\n    let c;\n    if (o && (c = gn(o, this.logger)) ? (this.readyVideoParser(r.segmentCodec), this.videoParser !== null && (this.videoParser.parsePES(r, i, c, !0), r.pesData = null)) : r.pesData = o, a && (c = gn(a, this.logger))) {\n      switch (t.segmentCodec) {\n        case \"aac\":\n          this.parseAACPES(t, c);\n          break;\n        case \"mp3\":\n          this.parseMPEGPES(t, c);\n          break;\n        case \"ac3\":\n          this.parseAC3PES(t, c);\n          break;\n      }\n      t.pesData = null;\n    } else\n      a != null && a.size && this.logger.log(\"last AAC PES packet truncated,might overlap between fragments\"), t.pesData = a;\n    l && (c = gn(l, this.logger)) ? (this.parseID3PES(n, c), n.pesData = null) : n.pesData = l;\n  }\n  demuxSampleAes(e, t, r) {\n    const n = this.demux(e, r, !0, !this.config.progressive), i = this.sampleAes = new $T(this.observer, this.config, t);\n    return this.decrypt(n, i);\n  }\n  readyVideoParser(e) {\n    this.videoParser === null && (e === \"avc\" ? this.videoParser = new GT() : e === \"hevc\" && (this.videoParser = new VT()));\n  }\n  decrypt(e, t) {\n    return new Promise((r) => {\n      const {\n        audioTrack: n,\n        videoTrack: i\n      } = e;\n      n.samples && n.segmentCodec === \"aac\" ? t.decryptAacSamples(n.samples, 0, () => {\n        i.samples ? t.decryptAvcSamples(i.samples, 0, 0, () => {\n          r(e);\n        }) : r(e);\n      }) : i.samples && t.decryptAvcSamples(i.samples, 0, 0, () => {\n        r(e);\n      });\n    });\n  }\n  destroy() {\n    this.observer && this.observer.removeAllListeners(), this.config = this.logger = this.observer = null, this.aacOverFlow = this.videoParser = this.remainderData = this.sampleAes = null, this._videoTrack = this._audioTrack = this._id3Track = this._txtTrack = void 0;\n  }\n  parseAACPES(e, t) {\n    let r = 0;\n    const n = this.aacOverFlow;\n    let i = t.data;\n    if (n) {\n      this.aacOverFlow = null;\n      const d = n.missing, h = n.sample.unit.byteLength;\n      if (d === -1)\n        i = _r(n.sample.unit, i);\n      else {\n        const f = h - d;\n        n.sample.unit.set(i.subarray(0, d), f), e.samples.push(n.sample), r = n.missing;\n      }\n    }\n    let o, a;\n    for (o = r, a = i.length; o < a - 1 && !na(i, o); o++)\n      ;\n    if (o !== r) {\n      let d;\n      const h = o < a - 1;\n      if (h ? d = `AAC PES did not start with ADTS header,offset:${o}` : d = \"No ADTS header found in AAC PES\", mc(this.observer, new Error(d), h, this.logger), !h)\n        return;\n    }\n    cp(e, this.observer, i, o, this.audioCodec);\n    let l;\n    if (t.pts !== void 0)\n      l = t.pts;\n    else if (n) {\n      const d = up(e.samplerate);\n      l = n.sample.pts + d;\n    } else {\n      this.logger.warn(\"[tsdemuxer]: AAC PES unknown PTS\");\n      return;\n    }\n    let c = 0, u;\n    for (; o < a; )\n      if (u = dp(e, i, o, l, c), o += u.length, u.missing) {\n        this.aacOverFlow = u;\n        break;\n      } else\n        for (c++; o < a - 1 && !na(i, o); o++)\n          ;\n  }\n  parseMPEGPES(e, t) {\n    const r = t.data, n = r.length;\n    let i = 0, o = 0;\n    const a = t.pts;\n    if (a === void 0) {\n      this.logger.warn(\"[tsdemuxer]: MPEG PES unknown PTS\");\n      return;\n    }\n    for (; o < n; )\n      if (mp(r, o)) {\n        const l = gp(e, r, o, a, i);\n        if (l)\n          o += l.length, i++;\n        else\n          break;\n      } else\n        o++;\n  }\n  parseAC3PES(e, t) {\n    {\n      const r = t.data, n = t.pts;\n      if (n === void 0) {\n        this.logger.warn(\"[tsdemuxer]: AC3 PES unknown PTS\");\n        return;\n      }\n      const i = r.length;\n      let o = 0, a = 0, l;\n      for (; a < i && (l = Ep(e, r, a, n, o++)) > 0; )\n        a += l;\n    }\n  }\n  parseID3PES(e, t) {\n    if (t.pts === void 0) {\n      this.logger.warn(\"[tsdemuxer]: ID3 PES unknown PTS\");\n      return;\n    }\n    const r = nt({}, t, {\n      type: this._videoTrack ? br.emsg : br.audioId3,\n      duration: Number.POSITIVE_INFINITY\n    });\n    e.samples.push(r);\n  }\n}\nfunction pc(s, e) {\n  return ((s[e + 1] & 31) << 8) + s[e + 2];\n}\nfunction jT(s, e) {\n  return (s[e + 10] & 31) << 8 | s[e + 11];\n}\nfunction KT(s, e, t, r, n, i) {\n  const o = {\n    audioPid: -1,\n    videoPid: -1,\n    id3Pid: -1,\n    segmentVideoCodec: \"avc\",\n    segmentAudioCodec: \"aac\"\n  }, a = (s[e + 1] & 15) << 8 | s[e + 2], l = e + 3 + a - 4, c = (s[e + 10] & 15) << 8 | s[e + 11];\n  for (e += 12 + c; e < l; ) {\n    const u = pc(s, e), d = (s[e + 3] & 15) << 8 | s[e + 4];\n    switch (s[e]) {\n      case 207:\n        if (!r) {\n          vl(\"ADTS AAC\", i);\n          break;\n        }\n      /* falls through */\n      case 15:\n        o.audioPid === -1 && (o.audioPid = u);\n        break;\n      // Packetized metadata (ID3)\n      case 21:\n        o.id3Pid === -1 && (o.id3Pid = u);\n        break;\n      case 219:\n        if (!r) {\n          vl(\"H.264\", i);\n          break;\n        }\n      /* falls through */\n      case 27:\n        o.videoPid === -1 && (o.videoPid = u);\n        break;\n      // ISO/IEC 11172-3 (MPEG-1 audio)\n      // or ISO/IEC 13818-3 (MPEG-2 halved sample rate audio)\n      case 3:\n      case 4:\n        !t.mpeg && !t.mp3 ? i.log(\"MPEG audio found, not supported in this browser\") : o.audioPid === -1 && (o.audioPid = u, o.segmentAudioCodec = \"mp3\");\n        break;\n      case 193:\n        if (!r) {\n          vl(\"AC-3\", i);\n          break;\n        }\n      /* falls through */\n      case 129:\n        t.ac3 ? o.audioPid === -1 && (o.audioPid = u, o.segmentAudioCodec = \"ac3\") : i.log(\"AC-3 audio found, not supported in this browser\");\n        break;\n      case 6:\n        if (o.audioPid === -1 && d > 0) {\n          let h = e + 5, f = d;\n          for (; f > 2; ) {\n            switch (s[h]) {\n              case 106:\n                t.ac3 !== !0 ? i.log(\"AC-3 audio found, not supported in this browser for now\") : (o.audioPid = u, o.segmentAudioCodec = \"ac3\");\n                break;\n            }\n            const y = s[h + 1] + 2;\n            h += y, f -= y;\n          }\n        }\n        break;\n      case 194:\n      // SAMPLE-AES EC3\n      /* falls through */\n      case 135:\n        return mc(n, new Error(\"Unsupported EC-3 in M2TS found\"), void 0, i), o;\n      case 36:\n        o.videoPid === -1 && (o.videoPid = u, o.segmentVideoCodec = \"hevc\", i.log(\"HEVC in M2TS found\"));\n        break;\n    }\n    e += d + 5;\n  }\n  return o;\n}\nfunction mc(s, e, t, r) {\n  r.warn(`parsing error: ${e.message}`), s.emit(I.ERROR, I.ERROR, {\n    type: ve.MEDIA_ERROR,\n    details: J.FRAG_PARSING_ERROR,\n    fatal: !1,\n    levelRetry: t,\n    error: e,\n    reason: e.message\n  });\n}\nfunction vl(s, e) {\n  e.log(`${s} with AES-128-CBC encryption found in unencrypted stream`);\n}\nfunction gn(s, e) {\n  let t = 0, r, n, i, o, a;\n  const l = s.data;\n  if (!s || s.size === 0)\n    return null;\n  for (; l[0].length < 19 && l.length > 1; )\n    l[0] = _r(l[0], l[1]), l.splice(1, 1);\n  if (r = l[0], (r[0] << 16) + (r[1] << 8) + r[2] === 1) {\n    if (n = (r[4] << 8) + r[5], n && n > s.size - 6)\n      return null;\n    const u = r[7];\n    u & 192 && (o = (r[9] & 14) * 536870912 + // 1 << 29\n    (r[10] & 255) * 4194304 + // 1 << 22\n    (r[11] & 254) * 16384 + // 1 << 14\n    (r[12] & 255) * 128 + // 1 << 7\n    (r[13] & 254) / 2, u & 64 ? (a = (r[14] & 14) * 536870912 + // 1 << 29\n    (r[15] & 255) * 4194304 + // 1 << 22\n    (r[16] & 254) * 16384 + // 1 << 14\n    (r[17] & 255) * 128 + // 1 << 7\n    (r[18] & 254) / 2, o - a > 60 * 9e4 && (e.warn(`${Math.round((o - a) / 9e4)}s delta between PTS and DTS, align them`), o = a)) : a = o), i = r[8];\n    let d = i + 9;\n    if (s.size <= d)\n      return null;\n    s.size -= d;\n    const h = new Uint8Array(s.size);\n    for (let f = 0, p = l.length; f < p; f++) {\n      r = l[f];\n      let y = r.byteLength;\n      if (d)\n        if (d > y) {\n          d -= y;\n          continue;\n        } else\n          r = r.subarray(d), y -= d, d = 0;\n      h.set(r, t), t += y;\n    }\n    return n && (n -= i + 3), {\n      data: h,\n      pts: o,\n      dts: a,\n      len: n\n    };\n  }\n  return null;\n}\nclass HT {\n  static getSilentFrame(e, t) {\n    switch (e) {\n      case \"mp4a.40.2\":\n        if (t === 1)\n          return new Uint8Array([0, 200, 0, 128, 35, 128]);\n        if (t === 2)\n          return new Uint8Array([33, 0, 73, 144, 2, 25, 0, 35, 128]);\n        if (t === 3)\n          return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 142]);\n        if (t === 4)\n          return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 128, 44, 128, 8, 2, 56]);\n        if (t === 5)\n          return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 130, 48, 4, 153, 0, 33, 144, 2, 56]);\n        if (t === 6)\n          return new Uint8Array([0, 200, 0, 128, 32, 132, 1, 38, 64, 8, 100, 0, 130, 48, 4, 153, 0, 33, 144, 2, 0, 178, 0, 32, 8, 224]);\n        break;\n      // handle HE-AAC below (mp4a.40.5 / mp4a.40.29)\n      default:\n        if (t === 1)\n          return new Uint8Array([1, 64, 34, 128, 163, 78, 230, 128, 186, 8, 0, 0, 0, 28, 6, 241, 193, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]);\n        if (t === 2)\n          return new Uint8Array([1, 64, 34, 128, 163, 94, 230, 128, 186, 8, 0, 0, 0, 0, 149, 0, 6, 241, 161, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]);\n        if (t === 3)\n          return new Uint8Array([1, 64, 34, 128, 163, 94, 230, 128, 186, 8, 0, 0, 0, 0, 149, 0, 6, 241, 161, 10, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 94]);\n        break;\n    }\n  }\n}\nconst Ss = Math.pow(2, 32) - 1;\nclass X {\n  static init() {\n    X.types = {\n      avc1: [],\n      // codingname\n      avcC: [],\n      hvc1: [],\n      hvcC: [],\n      btrt: [],\n      dinf: [],\n      dref: [],\n      esds: [],\n      ftyp: [],\n      hdlr: [],\n      mdat: [],\n      mdhd: [],\n      mdia: [],\n      mfhd: [],\n      minf: [],\n      moof: [],\n      moov: [],\n      mp4a: [],\n      \".mp3\": [],\n      dac3: [],\n      \"ac-3\": [],\n      mvex: [],\n      mvhd: [],\n      pasp: [],\n      sdtp: [],\n      stbl: [],\n      stco: [],\n      stsc: [],\n      stsd: [],\n      stsz: [],\n      stts: [],\n      tfdt: [],\n      tfhd: [],\n      traf: [],\n      trak: [],\n      trun: [],\n      trex: [],\n      tkhd: [],\n      vmhd: [],\n      smhd: []\n    };\n    let e;\n    for (e in X.types)\n      X.types.hasOwnProperty(e) && (X.types[e] = [e.charCodeAt(0), e.charCodeAt(1), e.charCodeAt(2), e.charCodeAt(3)]);\n    const t = new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      // pre_defined\n      118,\n      105,\n      100,\n      101,\n      // handler_type: 'vide'\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      86,\n      105,\n      100,\n      101,\n      111,\n      72,\n      97,\n      110,\n      100,\n      108,\n      101,\n      114,\n      0\n      // name: 'VideoHandler'\n    ]), r = new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      // pre_defined\n      115,\n      111,\n      117,\n      110,\n      // handler_type: 'soun'\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      83,\n      111,\n      117,\n      110,\n      100,\n      72,\n      97,\n      110,\n      100,\n      108,\n      101,\n      114,\n      0\n      // name: 'SoundHandler'\n    ]);\n    X.HDLR_TYPES = {\n      video: t,\n      audio: r\n    };\n    const n = new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      1,\n      // entry_count\n      0,\n      0,\n      0,\n      12,\n      // entry_size\n      117,\n      114,\n      108,\n      32,\n      // 'url' type\n      0,\n      // version 0\n      0,\n      0,\n      1\n      // entry_flags\n    ]), i = new Uint8Array([\n      0,\n      // version\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0\n      // entry_count\n    ]);\n    X.STTS = X.STSC = X.STCO = i, X.STSZ = new Uint8Array([\n      0,\n      // version\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      // sample_size\n      0,\n      0,\n      0,\n      0\n      // sample_count\n    ]), X.VMHD = new Uint8Array([\n      0,\n      // version\n      0,\n      0,\n      1,\n      // flags\n      0,\n      0,\n      // graphicsmode\n      0,\n      0,\n      0,\n      0,\n      0,\n      0\n      // opcolor\n    ]), X.SMHD = new Uint8Array([\n      0,\n      // version\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      // balance\n      0,\n      0\n      // reserved\n    ]), X.STSD = new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      1\n    ]);\n    const o = new Uint8Array([105, 115, 111, 109]), a = new Uint8Array([97, 118, 99, 49]), l = new Uint8Array([0, 0, 0, 1]);\n    X.FTYP = X.box(X.types.ftyp, o, l, o, a), X.DINF = X.box(X.types.dinf, X.box(X.types.dref, n));\n  }\n  static box(e, ...t) {\n    let r = 8, n = t.length;\n    const i = n;\n    for (; n--; )\n      r += t[n].byteLength;\n    const o = new Uint8Array(r);\n    for (o[0] = r >> 24 & 255, o[1] = r >> 16 & 255, o[2] = r >> 8 & 255, o[3] = r & 255, o.set(e, 4), n = 0, r = 8; n < i; n++)\n      o.set(t[n], r), r += t[n].byteLength;\n    return o;\n  }\n  static hdlr(e) {\n    return X.box(X.types.hdlr, X.HDLR_TYPES[e]);\n  }\n  static mdat(e) {\n    return X.box(X.types.mdat, e);\n  }\n  static mdhd(e, t) {\n    t *= e;\n    const r = Math.floor(t / (Ss + 1)), n = Math.floor(t % (Ss + 1));\n    return X.box(X.types.mdhd, new Uint8Array([\n      1,\n      // version 1\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2,\n      // creation_time\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3,\n      // modification_time\n      e >> 24 & 255,\n      e >> 16 & 255,\n      e >> 8 & 255,\n      e & 255,\n      // timescale\n      r >> 24,\n      r >> 16 & 255,\n      r >> 8 & 255,\n      r & 255,\n      n >> 24,\n      n >> 16 & 255,\n      n >> 8 & 255,\n      n & 255,\n      85,\n      196,\n      // 'und' language (undetermined)\n      0,\n      0\n    ]));\n  }\n  static mdia(e) {\n    return X.box(X.types.mdia, X.mdhd(e.timescale || 0, e.duration || 0), X.hdlr(e.type), X.minf(e));\n  }\n  static mfhd(e) {\n    return X.box(X.types.mfhd, new Uint8Array([\n      0,\n      0,\n      0,\n      0,\n      // flags\n      e >> 24,\n      e >> 16 & 255,\n      e >> 8 & 255,\n      e & 255\n      // sequence_number\n    ]));\n  }\n  static minf(e) {\n    return e.type === \"audio\" ? X.box(X.types.minf, X.box(X.types.smhd, X.SMHD), X.DINF, X.stbl(e)) : X.box(X.types.minf, X.box(X.types.vmhd, X.VMHD), X.DINF, X.stbl(e));\n  }\n  static moof(e, t, r) {\n    return X.box(X.types.moof, X.mfhd(e), X.traf(r, t));\n  }\n  static moov(e) {\n    let t = e.length;\n    const r = [];\n    for (; t--; )\n      r[t] = X.trak(e[t]);\n    return X.box.apply(null, [X.types.moov, X.mvhd(e[0].timescale || 0, e[0].duration || 0)].concat(r).concat(X.mvex(e)));\n  }\n  static mvex(e) {\n    let t = e.length;\n    const r = [];\n    for (; t--; )\n      r[t] = X.trex(e[t]);\n    return X.box.apply(null, [X.types.mvex, ...r]);\n  }\n  static mvhd(e, t) {\n    t *= e;\n    const r = Math.floor(t / (Ss + 1)), n = Math.floor(t % (Ss + 1)), i = new Uint8Array([\n      1,\n      // version 1\n      0,\n      0,\n      0,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2,\n      // creation_time\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3,\n      // modification_time\n      e >> 24 & 255,\n      e >> 16 & 255,\n      e >> 8 & 255,\n      e & 255,\n      // timescale\n      r >> 24,\n      r >> 16 & 255,\n      r >> 8 & 255,\n      r & 255,\n      n >> 24,\n      n >> 16 & 255,\n      n >> 8 & 255,\n      n & 255,\n      0,\n      1,\n      0,\n      0,\n      // 1.0 rate\n      1,\n      0,\n      // 1.0 volume\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      64,\n      0,\n      0,\n      0,\n      // transformation: unity matrix\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // pre_defined\n      255,\n      255,\n      255,\n      255\n      // next_track_ID\n    ]);\n    return X.box(X.types.mvhd, i);\n  }\n  static sdtp(e) {\n    const t = e.samples || [], r = new Uint8Array(4 + t.length);\n    let n, i;\n    for (n = 0; n < t.length; n++)\n      i = t[n].flags, r[n + 4] = i.dependsOn << 4 | i.isDependedOn << 2 | i.hasRedundancy;\n    return X.box(X.types.sdtp, r);\n  }\n  static stbl(e) {\n    return X.box(X.types.stbl, X.stsd(e), X.box(X.types.stts, X.STTS), X.box(X.types.stsc, X.STSC), X.box(X.types.stsz, X.STSZ), X.box(X.types.stco, X.STCO));\n  }\n  static avc1(e) {\n    let t = [], r = [], n, i, o;\n    for (n = 0; n < e.sps.length; n++)\n      i = e.sps[n], o = i.byteLength, t.push(o >>> 8 & 255), t.push(o & 255), t = t.concat(Array.prototype.slice.call(i));\n    for (n = 0; n < e.pps.length; n++)\n      i = e.pps[n], o = i.byteLength, r.push(o >>> 8 & 255), r.push(o & 255), r = r.concat(Array.prototype.slice.call(i));\n    const a = X.box(X.types.avcC, new Uint8Array([\n      1,\n      // version\n      t[3],\n      // profile\n      t[4],\n      // profile compat\n      t[5],\n      // level\n      255,\n      // lengthSizeMinusOne, hard-coded to 4 bytes\n      224 | e.sps.length\n      // 3bit reserved (111) + numOfSequenceParameterSets\n    ].concat(t).concat([\n      e.pps.length\n      // numOfPictureParameterSets\n    ]).concat(r))), l = e.width, c = e.height, u = e.pixelRatio[0], d = e.pixelRatio[1];\n    return X.box(\n      X.types.avc1,\n      new Uint8Array([\n        0,\n        0,\n        0,\n        // reserved\n        0,\n        0,\n        0,\n        // reserved\n        0,\n        1,\n        // data_reference_index\n        0,\n        0,\n        // pre_defined\n        0,\n        0,\n        // reserved\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        // pre_defined\n        l >> 8 & 255,\n        l & 255,\n        // width\n        c >> 8 & 255,\n        c & 255,\n        // height\n        0,\n        72,\n        0,\n        0,\n        // horizresolution\n        0,\n        72,\n        0,\n        0,\n        // vertresolution\n        0,\n        0,\n        0,\n        0,\n        // reserved\n        0,\n        1,\n        // frame_count\n        18,\n        100,\n        97,\n        105,\n        108,\n        // dailymotion/hls.js\n        121,\n        109,\n        111,\n        116,\n        105,\n        111,\n        110,\n        47,\n        104,\n        108,\n        115,\n        46,\n        106,\n        115,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        // compressorname\n        0,\n        24,\n        // depth = 24\n        17,\n        17\n      ]),\n      // pre_defined = -1\n      a,\n      X.box(X.types.btrt, new Uint8Array([\n        0,\n        28,\n        156,\n        128,\n        // bufferSizeDB\n        0,\n        45,\n        198,\n        192,\n        // maxBitrate\n        0,\n        45,\n        198,\n        192\n      ])),\n      // avgBitrate\n      X.box(X.types.pasp, new Uint8Array([\n        u >> 24,\n        // hSpacing\n        u >> 16 & 255,\n        u >> 8 & 255,\n        u & 255,\n        d >> 24,\n        // vSpacing\n        d >> 16 & 255,\n        d >> 8 & 255,\n        d & 255\n      ]))\n    );\n  }\n  static esds(e) {\n    const t = e.config;\n    return new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      3,\n      // descriptor_type\n      25,\n      // length\n      0,\n      1,\n      // es_id\n      0,\n      // stream_priority\n      4,\n      // descriptor_type\n      17,\n      // length\n      64,\n      // codec : mpeg4_audio\n      21,\n      // stream_type\n      0,\n      0,\n      0,\n      // buffer_size\n      0,\n      0,\n      0,\n      0,\n      // maxBitrate\n      0,\n      0,\n      0,\n      0,\n      // avgBitrate\n      5,\n      // descriptor_type\n      2,\n      // length\n      ...t,\n      6,\n      1,\n      2\n      // GASpecificConfig)); // length + audio config descriptor\n    ]);\n  }\n  static audioStsd(e) {\n    const t = e.samplerate || 0;\n    return new Uint8Array([\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      1,\n      // data_reference_index\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      e.channelCount || 0,\n      // channelcount\n      0,\n      16,\n      // sampleSize:16bits\n      0,\n      0,\n      0,\n      0,\n      // reserved2\n      t >> 8 & 255,\n      t & 255,\n      //\n      0,\n      0\n    ]);\n  }\n  static mp4a(e) {\n    return X.box(X.types.mp4a, X.audioStsd(e), X.box(X.types.esds, X.esds(e)));\n  }\n  static mp3(e) {\n    return X.box(X.types[\".mp3\"], X.audioStsd(e));\n  }\n  static ac3(e) {\n    return X.box(X.types[\"ac-3\"], X.audioStsd(e), X.box(X.types.dac3, e.config));\n  }\n  static stsd(e) {\n    const {\n      segmentCodec: t\n    } = e;\n    if (e.type === \"audio\") {\n      if (t === \"aac\")\n        return X.box(X.types.stsd, X.STSD, X.mp4a(e));\n      if (t === \"ac3\" && e.config)\n        return X.box(X.types.stsd, X.STSD, X.ac3(e));\n      if (t === \"mp3\" && e.codec === \"mp3\")\n        return X.box(X.types.stsd, X.STSD, X.mp3(e));\n    } else if (e.pps && e.sps) {\n      if (t === \"avc\")\n        return X.box(X.types.stsd, X.STSD, X.avc1(e));\n      if (t === \"hevc\" && e.vps)\n        return X.box(X.types.stsd, X.STSD, X.hvc1(e));\n    } else\n      throw new Error(\"video track missing pps or sps\");\n    throw new Error(`unsupported ${e.type} segment codec (${t}/${e.codec})`);\n  }\n  static tkhd(e) {\n    const t = e.id, r = (e.duration || 0) * (e.timescale || 0), n = e.width || 0, i = e.height || 0, o = Math.floor(r / (Ss + 1)), a = Math.floor(r % (Ss + 1));\n    return X.box(X.types.tkhd, new Uint8Array([\n      1,\n      // version 1\n      0,\n      0,\n      7,\n      // flags\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      2,\n      // creation_time\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      3,\n      // modification_time\n      t >> 24 & 255,\n      t >> 16 & 255,\n      t >> 8 & 255,\n      t & 255,\n      // track_ID\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      o >> 24,\n      o >> 16 & 255,\n      o >> 8 & 255,\n      o & 255,\n      a >> 24,\n      a >> 16 & 255,\n      a >> 8 & 255,\n      a & 255,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      // reserved\n      0,\n      0,\n      // layer\n      0,\n      0,\n      // alternate_group\n      0,\n      0,\n      // non-audio track volume\n      0,\n      0,\n      // reserved\n      0,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      1,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      0,\n      64,\n      0,\n      0,\n      0,\n      // transformation: unity matrix\n      n >> 8 & 255,\n      n & 255,\n      0,\n      0,\n      // width\n      i >> 8 & 255,\n      i & 255,\n      0,\n      0\n      // height\n    ]));\n  }\n  static traf(e, t) {\n    const r = X.sdtp(e), n = e.id, i = Math.floor(t / (Ss + 1)), o = Math.floor(t % (Ss + 1));\n    return X.box(\n      X.types.traf,\n      X.box(X.types.tfhd, new Uint8Array([\n        0,\n        // version 0\n        0,\n        0,\n        0,\n        // flags\n        n >> 24,\n        n >> 16 & 255,\n        n >> 8 & 255,\n        n & 255\n        // track_ID\n      ])),\n      X.box(X.types.tfdt, new Uint8Array([\n        1,\n        // version 1\n        0,\n        0,\n        0,\n        // flags\n        i >> 24,\n        i >> 16 & 255,\n        i >> 8 & 255,\n        i & 255,\n        o >> 24,\n        o >> 16 & 255,\n        o >> 8 & 255,\n        o & 255\n      ])),\n      X.trun(e, r.length + 16 + // tfhd\n      20 + // tfdt\n      8 + // traf header\n      16 + // mfhd\n      8 + // moof header\n      8),\n      // mdat header\n      r\n    );\n  }\n  /**\n   * Generate a track box.\n   * @param track a track definition\n   */\n  static trak(e) {\n    return e.duration = e.duration || 4294967295, X.box(X.types.trak, X.tkhd(e), X.mdia(e));\n  }\n  static trex(e) {\n    const t = e.id;\n    return X.box(X.types.trex, new Uint8Array([\n      0,\n      // version 0\n      0,\n      0,\n      0,\n      // flags\n      t >> 24,\n      t >> 16 & 255,\n      t >> 8 & 255,\n      t & 255,\n      // track_ID\n      0,\n      0,\n      0,\n      1,\n      // default_sample_description_index\n      0,\n      0,\n      0,\n      0,\n      // default_sample_duration\n      0,\n      0,\n      0,\n      0,\n      // default_sample_size\n      0,\n      1,\n      0,\n      1\n      // default_sample_flags\n    ]));\n  }\n  static trun(e, t) {\n    const r = e.samples || [], n = r.length, i = 12 + 16 * n, o = new Uint8Array(i);\n    let a, l, c, u, d, h;\n    for (t += 8 + i, o.set([\n      e.type === \"video\" ? 1 : 0,\n      // version 1 for video with signed-int sample_composition_time_offset\n      0,\n      15,\n      1,\n      // flags\n      n >>> 24 & 255,\n      n >>> 16 & 255,\n      n >>> 8 & 255,\n      n & 255,\n      // sample_count\n      t >>> 24 & 255,\n      t >>> 16 & 255,\n      t >>> 8 & 255,\n      t & 255\n      // data_offset\n    ], 0), a = 0; a < n; a++)\n      l = r[a], c = l.duration, u = l.size, d = l.flags, h = l.cts, o.set([\n        c >>> 24 & 255,\n        c >>> 16 & 255,\n        c >>> 8 & 255,\n        c & 255,\n        // sample_duration\n        u >>> 24 & 255,\n        u >>> 16 & 255,\n        u >>> 8 & 255,\n        u & 255,\n        // sample_size\n        d.isLeading << 2 | d.dependsOn,\n        d.isDependedOn << 6 | d.hasRedundancy << 4 | d.paddingValue << 1 | d.isNonSync,\n        d.degradPrio & 61440,\n        d.degradPrio & 15,\n        // sample_flags\n        h >>> 24 & 255,\n        h >>> 16 & 255,\n        h >>> 8 & 255,\n        h & 255\n        // sample_composition_time_offset\n      ], 12 + 16 * a);\n    return X.box(X.types.trun, o);\n  }\n  static initSegment(e) {\n    X.types || X.init();\n    const t = X.moov(e);\n    return _r(X.FTYP, t);\n  }\n  static hvc1(e) {\n    const t = e.params, r = [e.vps, e.sps, e.pps], n = 4, i = new Uint8Array([1, t.general_profile_space << 6 | (t.general_tier_flag ? 32 : 0) | t.general_profile_idc, t.general_profile_compatibility_flags[0], t.general_profile_compatibility_flags[1], t.general_profile_compatibility_flags[2], t.general_profile_compatibility_flags[3], t.general_constraint_indicator_flags[0], t.general_constraint_indicator_flags[1], t.general_constraint_indicator_flags[2], t.general_constraint_indicator_flags[3], t.general_constraint_indicator_flags[4], t.general_constraint_indicator_flags[5], t.general_level_idc, 240 | t.min_spatial_segmentation_idc >> 8, 255 & t.min_spatial_segmentation_idc, 252 | t.parallelismType, 252 | t.chroma_format_idc, 248 | t.bit_depth_luma_minus8, 248 | t.bit_depth_chroma_minus8, 0, parseInt(t.frame_rate.fps), n - 1 | t.temporal_id_nested << 2 | t.num_temporal_layers << 3 | (t.frame_rate.fixed ? 64 : 0), r.length]);\n    let o = i.length;\n    for (let p = 0; p < r.length; p += 1) {\n      o += 3;\n      for (let y = 0; y < r[p].length; y += 1)\n        o += 2 + r[p][y].length;\n    }\n    const a = new Uint8Array(o);\n    a.set(i, 0), o = i.length;\n    const l = r.length - 1;\n    for (let p = 0; p < r.length; p += 1) {\n      a.set(new Uint8Array([32 + p | (p === l ? 128 : 0), 0, r[p].length]), o), o += 3;\n      for (let y = 0; y < r[p].length; y += 1)\n        a.set(new Uint8Array([r[p][y].length >> 8, r[p][y].length & 255]), o), o += 2, a.set(r[p][y], o), o += r[p][y].length;\n    }\n    const c = X.box(X.types.hvcC, a), u = e.width, d = e.height, h = e.pixelRatio[0], f = e.pixelRatio[1];\n    return X.box(\n      X.types.hvc1,\n      new Uint8Array([\n        0,\n        0,\n        0,\n        // reserved\n        0,\n        0,\n        0,\n        // reserved\n        0,\n        1,\n        // data_reference_index\n        0,\n        0,\n        // pre_defined\n        0,\n        0,\n        // reserved\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        // pre_defined\n        u >> 8 & 255,\n        u & 255,\n        // width\n        d >> 8 & 255,\n        d & 255,\n        // height\n        0,\n        72,\n        0,\n        0,\n        // horizresolution\n        0,\n        72,\n        0,\n        0,\n        // vertresolution\n        0,\n        0,\n        0,\n        0,\n        // reserved\n        0,\n        1,\n        // frame_count\n        18,\n        100,\n        97,\n        105,\n        108,\n        // dailymotion/hls.js\n        121,\n        109,\n        111,\n        116,\n        105,\n        111,\n        110,\n        47,\n        104,\n        108,\n        115,\n        46,\n        106,\n        115,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        0,\n        // compressorname\n        0,\n        24,\n        // depth = 24\n        17,\n        17\n      ]),\n      // pre_defined = -1\n      c,\n      X.box(X.types.btrt, new Uint8Array([\n        0,\n        28,\n        156,\n        128,\n        // bufferSizeDB\n        0,\n        45,\n        198,\n        192,\n        // maxBitrate\n        0,\n        45,\n        198,\n        192\n      ])),\n      // avgBitrate\n      X.box(X.types.pasp, new Uint8Array([\n        h >> 24,\n        // hSpacing\n        h >> 16 & 255,\n        h >> 8 & 255,\n        h & 255,\n        f >> 24,\n        // vSpacing\n        f >> 16 & 255,\n        f >> 8 & 255,\n        f & 255\n      ]))\n    );\n  }\n}\nX.types = void 0;\nX.HDLR_TYPES = void 0;\nX.STTS = void 0;\nX.STSC = void 0;\nX.STCO = void 0;\nX.STSZ = void 0;\nX.VMHD = void 0;\nX.SMHD = void 0;\nX.STSD = void 0;\nX.FTYP = void 0;\nX.DINF = void 0;\nconst Sp = 9e4;\nfunction Cu(s, e, t = 1, r = !1) {\n  const n = s * e * t;\n  return r ? Math.round(n) : n;\n}\nfunction qT(s, e, t = 1, r = !1) {\n  return Cu(s, e, 1 / t, r);\n}\nfunction qn(s, e = !1) {\n  return Cu(s, 1e3, 1 / Sp, e);\n}\nfunction WT(s, e = 1) {\n  return Cu(s, Sp, 1 / e);\n}\nconst zT = 10 * 1e3, YT = 1024, ZT = 1152, XT = 1536;\nlet pn = null, El = null;\nfunction Uh(s, e, t, r) {\n  return {\n    duration: e,\n    size: t,\n    cts: r,\n    flags: {\n      isLeading: 0,\n      isDependedOn: 0,\n      hasRedundancy: 0,\n      degradPrio: 0,\n      dependsOn: s ? 2 : 1,\n      isNonSync: s ? 0 : 1\n    }\n  };\n}\nclass mo extends Lr {\n  constructor(e, t, r, n) {\n    if (super(\"mp4-remuxer\", n), this.observer = void 0, this.config = void 0, this.typeSupported = void 0, this.ISGenerated = !1, this._initPTS = null, this._initDTS = null, this.nextVideoTs = null, this.nextAudioTs = null, this.videoSampleDuration = null, this.isAudioContiguous = !1, this.isVideoContiguous = !1, this.videoTrackConfig = void 0, this.observer = e, this.config = t, this.typeSupported = r, this.ISGenerated = !1, pn === null) {\n      const o = (navigator.userAgent || \"\").match(/Chrome\\/(\\d+)/i);\n      pn = o ? parseInt(o[1]) : 0;\n    }\n    if (El === null) {\n      const i = navigator.userAgent.match(/Safari\\/(\\d+)/i);\n      El = i ? parseInt(i[1]) : 0;\n    }\n  }\n  destroy() {\n    this.config = this.videoTrackConfig = this._initPTS = this._initDTS = null;\n  }\n  resetTimeStamp(e) {\n    this.log(\"initPTS & initDTS reset\"), this._initPTS = this._initDTS = e;\n  }\n  resetNextTimestamp() {\n    this.log(\"reset next timestamp\"), this.isVideoContiguous = !1, this.isAudioContiguous = !1;\n  }\n  resetInitSegment() {\n    this.log(\"ISGenerated flag reset\"), this.ISGenerated = !1, this.videoTrackConfig = void 0;\n  }\n  getVideoStartPts(e) {\n    let t = !1;\n    const r = e[0].pts, n = e.reduce((i, o) => {\n      let a = o.pts, l = a - i;\n      return l < -4294967296 && (t = !0, a = Ar(a, r), l = a - i), l > 0 ? i : a;\n    }, r);\n    return t && this.debug(\"PTS rollover detected\"), n;\n  }\n  remux(e, t, r, n, i, o, a, l) {\n    let c, u, d, h, f, p, y = i, E = i;\n    const b = e.pid > -1, R = t.pid > -1, A = t.samples.length, F = e.samples.length > 0, M = a && A > 0 || A > 1;\n    if ((!b || F) && (!R || M) || this.ISGenerated || a) {\n      if (this.ISGenerated) {\n        var K, j, C, k;\n        const g = this.videoTrackConfig;\n        (g && (t.width !== g.width || t.height !== g.height || ((K = t.pixelRatio) == null ? void 0 : K[0]) !== ((j = g.pixelRatio) == null ? void 0 : j[0]) || ((C = t.pixelRatio) == null ? void 0 : C[1]) !== ((k = g.pixelRatio) == null ? void 0 : k[1])) || !g && M || this.nextAudioTs === null && F) && this.resetInitSegment();\n      }\n      this.ISGenerated || (d = this.generateIS(e, t, i, o));\n      const $ = this.isVideoContiguous;\n      let W = -1, _;\n      if (M && (W = JT(t.samples), !$ && this.config.forceKeyFrameOnDiscontinuity))\n        if (p = !0, W > 0) {\n          this.warn(`Dropped ${W} out of ${A} video samples due to a missing keyframe`);\n          const g = this.getVideoStartPts(t.samples);\n          t.samples = t.samples.slice(W), t.dropped += W, E += (t.samples[0].pts - g) / t.inputTimeScale, _ = E;\n        } else W === -1 && (this.warn(`No keyframe found out of ${A} video samples`), p = !1);\n      if (this.ISGenerated) {\n        if (F && M) {\n          const g = this.getVideoStartPts(t.samples), w = (Ar(e.samples[0].pts, g) - g) / t.inputTimeScale;\n          y += Math.max(0, w), E += Math.max(0, -w);\n        }\n        if (F) {\n          if (e.samplerate || (this.warn(\"regenerate InitSegment as audio detected\"), d = this.generateIS(e, t, i, o)), u = this.remuxAudio(e, y, this.isAudioContiguous, o, R || M || l === pe.AUDIO ? E : void 0), M) {\n            const g = u ? u.endPTS - u.startPTS : 0;\n            t.inputTimeScale || (this.warn(\"regenerate InitSegment as video detected\"), d = this.generateIS(e, t, i, o)), c = this.remuxVideo(t, E, $, g);\n          }\n        } else M && (c = this.remuxVideo(t, E, $, 0));\n        c && (c.firstKeyFrame = W, c.independent = W !== -1, c.firstKeyFramePTS = _);\n      }\n    }\n    return this.ISGenerated && this._initPTS && this._initDTS && (r.samples.length && (f = bp(r, i, this._initPTS, this._initDTS)), n.samples.length && (h = Tp(n, i, this._initPTS))), {\n      audio: u,\n      video: c,\n      initSegment: d,\n      independent: p,\n      text: h,\n      id3: f\n    };\n  }\n  generateIS(e, t, r, n) {\n    const i = e.samples, o = t.samples, a = this.typeSupported, l = {}, c = this._initPTS;\n    let u = !c || n, d = \"audio/mp4\", h, f, p, y = -1;\n    if (u && (h = f = 1 / 0), e.config && i.length) {\n      switch (e.timescale = e.samplerate, e.segmentCodec) {\n        case \"mp3\":\n          a.mpeg ? (d = \"audio/mpeg\", e.codec = \"\") : a.mp3 && (e.codec = \"mp3\");\n          break;\n        case \"ac3\":\n          e.codec = \"ac-3\";\n          break;\n      }\n      l.audio = {\n        id: \"audio\",\n        container: d,\n        codec: e.codec,\n        initSegment: e.segmentCodec === \"mp3\" && a.mpeg ? new Uint8Array(0) : X.initSegment([e]),\n        metadata: {\n          channelCount: e.channelCount\n        }\n      }, u && (y = e.id, p = e.inputTimeScale, !c || p !== c.timescale ? h = f = i[0].pts - Math.round(p * r) : u = !1);\n    }\n    if (t.sps && t.pps && o.length) {\n      if (t.timescale = t.inputTimeScale, l.video = {\n        id: \"main\",\n        container: \"video/mp4\",\n        codec: t.codec,\n        initSegment: X.initSegment([t]),\n        metadata: {\n          width: t.width,\n          height: t.height\n        }\n      }, u)\n        if (y = t.id, p = t.inputTimeScale, !c || p !== c.timescale) {\n          const E = this.getVideoStartPts(o), b = Math.round(p * r);\n          f = Math.min(f, Ar(o[0].dts, E) - b), h = Math.min(h, E - b);\n        } else\n          u = !1;\n      this.videoTrackConfig = {\n        width: t.width,\n        height: t.height,\n        pixelRatio: t.pixelRatio\n      };\n    }\n    if (Object.keys(l).length)\n      return this.ISGenerated = !0, u ? (c && this.warn(`Timestamps at playlist time: ${n ? \"\" : \"~\"}${r} ${h / p} != initPTS: ${c.baseTime / c.timescale} (${c.baseTime}/${c.timescale}) trackId: ${c.trackId}`), this.log(`Found initPTS at playlist time: ${r} offset: ${h / p} (${h}/${p}) trackId: ${y}`), this._initPTS = {\n        baseTime: h,\n        timescale: p,\n        trackId: y\n      }, this._initDTS = {\n        baseTime: f,\n        timescale: p,\n        trackId: y\n      }) : h = p = void 0, {\n        tracks: l,\n        initPTS: h,\n        timescale: p,\n        trackId: y\n      };\n  }\n  remuxVideo(e, t, r, n) {\n    const i = e.inputTimeScale, o = e.samples, a = [], l = o.length, c = this._initPTS, u = c.baseTime * i / c.timescale;\n    let d = this.nextVideoTs, h = 8, f = this.videoSampleDuration, p, y, E = Number.POSITIVE_INFINITY, b = Number.NEGATIVE_INFINITY, R = !1;\n    if (!r || d === null) {\n      const L = u + t * i, m = o[0].pts - Ar(o[0].dts, o[0].pts);\n      pn && d !== null && Math.abs(L - m - (d + u)) < 15e3 ? r = !0 : d = L - m - u;\n    }\n    const A = d + u;\n    for (let L = 0; L < l; L++) {\n      const m = o[L];\n      m.pts = Ar(m.pts, A), m.dts = Ar(m.dts, A), m.dts < o[L > 0 ? L - 1 : L].dts && (R = !0);\n    }\n    R && o.sort(function(L, m) {\n      const v = L.dts - m.dts, P = L.pts - m.pts;\n      return v || P;\n    }), p = o[0].dts, y = o[o.length - 1].dts;\n    const F = y - p, M = F ? Math.round(F / (l - 1)) : f || e.inputTimeScale / 30;\n    if (r) {\n      const L = p - A, m = L > M, v = L < -1;\n      if ((m || v) && (m ? this.warn(`${(e.segmentCodec || \"\").toUpperCase()}: ${qn(L, !0)} ms (${L}dts) hole between fragments detected at ${t.toFixed(3)}`) : this.warn(`${(e.segmentCodec || \"\").toUpperCase()}: ${qn(-L, !0)} ms (${L}dts) overlapping between fragments detected at ${t.toFixed(3)}`), !v || A >= o[0].pts || pn)) {\n        p = A;\n        const P = o[0].pts - L;\n        if (m)\n          o[0].dts = p, o[0].pts = P;\n        else {\n          let N = !0;\n          for (let Y = 0; Y < o.length && !(o[Y].dts > P && N); Y++) {\n            const ee = o[Y].pts;\n            if (o[Y].dts -= L, o[Y].pts -= L, Y < o.length - 1) {\n              const ie = o[Y + 1].pts, le = o[Y].pts, Te = ie <= le, De = ie <= ee;\n              N = Te == De;\n            }\n          }\n        }\n        this.log(`Video: Initial PTS/DTS adjusted: ${qn(P, !0)}/${qn(p, !0)}, delta: ${qn(L, !0)} ms`);\n      }\n    }\n    p = Math.max(0, p);\n    let H = 0, K = 0, j = p;\n    for (let L = 0; L < l; L++) {\n      const m = o[L], v = m.units, P = v.length;\n      let N = 0;\n      for (let Y = 0; Y < P; Y++)\n        N += v[Y].data.length;\n      K += N, H += P, m.length = N, m.dts < j ? (m.dts = j, j += M / 4 | 0 || 1) : j = m.dts, E = Math.min(m.pts, E), b = Math.max(m.pts, b);\n    }\n    y = o[l - 1].dts;\n    const C = K + 4 * H + 8;\n    let k;\n    try {\n      k = new Uint8Array(C);\n    } catch (L) {\n      this.observer.emit(I.ERROR, I.ERROR, {\n        type: ve.MUX_ERROR,\n        details: J.REMUX_ALLOC_ERROR,\n        fatal: !1,\n        error: L,\n        bytes: C,\n        reason: `fail allocating video mdat ${C}`\n      });\n      return;\n    }\n    const $ = new DataView(k.buffer);\n    $.setUint32(0, C), k.set(X.types.mdat, 4);\n    let W = !1, _ = Number.POSITIVE_INFINITY, g = Number.POSITIVE_INFINITY, x = Number.NEGATIVE_INFINITY, w = Number.NEGATIVE_INFINITY;\n    for (let L = 0; L < l; L++) {\n      const m = o[L], v = m.units;\n      let P = 0;\n      for (let ee = 0, ie = v.length; ee < ie; ee++) {\n        const le = v[ee], Te = le.data, De = le.data.byteLength;\n        $.setUint32(h, De), h += 4, k.set(Te, h), h += De, P += 4 + De;\n      }\n      let N;\n      if (L < l - 1)\n        f = o[L + 1].dts - m.dts, N = o[L + 1].pts - m.pts;\n      else {\n        const ee = this.config, ie = L > 0 ? m.dts - o[L - 1].dts : M;\n        if (N = L > 0 ? m.pts - o[L - 1].pts : M, ee.stretchShortVideoTrack && this.nextAudioTs !== null) {\n          const le = Math.floor(ee.maxBufferHole * i), Te = (n ? E + n * i : this.nextAudioTs + u) - m.pts;\n          Te > le ? (f = Te - ie, f < 0 ? f = ie : W = !0, this.log(`It is approximately ${Te / 90} ms to the next segment; using duration ${f / 90} ms for the last video frame.`)) : f = ie;\n        } else\n          f = ie;\n      }\n      const Y = Math.round(m.pts - m.dts);\n      _ = Math.min(_, f), x = Math.max(x, f), g = Math.min(g, N), w = Math.max(w, N), a.push(Uh(m.key, f, P, Y));\n    }\n    if (a.length) {\n      if (pn) {\n        if (pn < 70) {\n          const L = a[0].flags;\n          L.dependsOn = 2, L.isNonSync = 0;\n        }\n      } else if (El && w - g < x - _ && M / x < 0.025 && a[0].cts === 0) {\n        this.warn(\"Found irregular gaps in sample duration. Using PTS instead of DTS to determine MP4 sample duration.\");\n        let L = p;\n        for (let m = 0, v = a.length; m < v; m++) {\n          const P = L + a[m].duration, N = L + a[m].cts;\n          if (m < v - 1) {\n            const Y = P + a[m + 1].cts;\n            a[m].duration = Y - N;\n          } else\n            a[m].duration = m ? a[m - 1].duration : M;\n          a[m].cts = 0, L = P;\n        }\n      }\n    }\n    f = W || !f ? M : f;\n    const D = y + f;\n    this.nextVideoTs = d = D - u, this.videoSampleDuration = f, this.isVideoContiguous = !0;\n    const V = {\n      data1: X.moof(e.sequenceNumber++, p, nt(e, {\n        samples: a\n      })),\n      data2: k,\n      startPTS: (E - u) / i,\n      endPTS: (b + f - u) / i,\n      startDTS: (p - u) / i,\n      endDTS: d / i,\n      type: \"video\",\n      hasAudio: !1,\n      hasVideo: !0,\n      nb: a.length,\n      dropped: e.dropped\n    };\n    return e.samples = [], e.dropped = 0, V;\n  }\n  getSamplesPerFrame(e) {\n    switch (e.segmentCodec) {\n      case \"mp3\":\n        return ZT;\n      case \"ac3\":\n        return XT;\n      default:\n        return YT;\n    }\n  }\n  remuxAudio(e, t, r, n, i) {\n    const o = e.inputTimeScale, a = e.samplerate ? e.samplerate : o, l = o / a, c = this.getSamplesPerFrame(e), u = c * l, d = this._initPTS, h = e.segmentCodec === \"mp3\" && this.typeSupported.mpeg, f = [], p = i !== void 0;\n    let y = e.samples, E = h ? 0 : 8, b = this.nextAudioTs || -1;\n    const R = d.baseTime * o / d.timescale, A = R + t * o;\n    if (this.isAudioContiguous = r = r || y.length && b > 0 && (n && Math.abs(A - (b + R)) < 9e3 || Math.abs(Ar(y[0].pts, A) - (b + R)) < 20 * u), y.forEach(function(w) {\n      w.pts = Ar(w.pts, A);\n    }), !r || b < 0) {\n      if (y = y.filter((w) => w.pts >= 0), !y.length)\n        return;\n      i === 0 ? b = 0 : n && !p ? b = Math.max(0, A - R) : b = y[0].pts - R;\n    }\n    if (e.segmentCodec === \"aac\") {\n      const w = this.config.maxAudioFramesDrift;\n      for (let D = 0, O = b + R; D < y.length; D++) {\n        const U = y[D], V = U.pts, L = V - O, m = Math.abs(1e3 * L / o);\n        if (L <= -w * u && p)\n          D === 0 && (this.warn(`Audio frame @ ${(V / o).toFixed(3)}s overlaps marker by ${Math.round(1e3 * L / o)} ms.`), this.nextAudioTs = b = V - R, O = V);\n        else if (L >= w * u && m < zT && p) {\n          let v = Math.round(L / u);\n          for (O = V - v * u; O < 0 && v && u; )\n            v--, O += u;\n          D === 0 && (this.nextAudioTs = b = O - R), this.warn(`Injecting ${v} audio frames @ ${((O - R) / o).toFixed(3)}s due to ${Math.round(1e3 * L / o)} ms gap.`);\n          for (let P = 0; P < v; P++) {\n            let N = HT.getSilentFrame(e.parsedCodec || e.manifestCodec || e.codec, e.channelCount);\n            N || (this.log(\"Unable to get silent frame for given audio codec; duplicating last frame instead.\"), N = U.unit.subarray()), y.splice(D, 0, {\n              unit: N,\n              pts: O\n            }), O += u, D++;\n          }\n        }\n        U.pts = O, O += u;\n      }\n    }\n    let F = null, M = null, H, K = 0, j = y.length;\n    for (; j--; )\n      K += y[j].unit.byteLength;\n    for (let w = 0, D = y.length; w < D; w++) {\n      const O = y[w], U = O.unit;\n      let V = O.pts;\n      if (M !== null) {\n        const m = f[w - 1];\n        m.duration = Math.round((V - M) / l);\n      } else if (r && e.segmentCodec === \"aac\" && (V = b + R), F = V, K > 0) {\n        K += E;\n        try {\n          H = new Uint8Array(K);\n        } catch (m) {\n          this.observer.emit(I.ERROR, I.ERROR, {\n            type: ve.MUX_ERROR,\n            details: J.REMUX_ALLOC_ERROR,\n            fatal: !1,\n            error: m,\n            bytes: K,\n            reason: `fail allocating audio mdat ${K}`\n          });\n          return;\n        }\n        h || (new DataView(H.buffer).setUint32(0, K), H.set(X.types.mdat, 4));\n      } else\n        return;\n      H.set(U, E);\n      const L = U.byteLength;\n      E += L, f.push(Uh(!0, c, L, 0)), M = V;\n    }\n    const C = f.length;\n    if (!C)\n      return;\n    const k = f[f.length - 1];\n    b = M - R, this.nextAudioTs = b + l * k.duration;\n    const $ = h ? new Uint8Array(0) : X.moof(e.sequenceNumber++, F / l, nt({}, e, {\n      samples: f\n    }));\n    e.samples = [];\n    const W = (F - R) / o, _ = b / o, x = {\n      data1: $,\n      data2: H,\n      startPTS: W,\n      endPTS: _,\n      startDTS: W,\n      endDTS: _,\n      type: \"audio\",\n      hasAudio: !0,\n      hasVideo: !1,\n      nb: C\n    };\n    return this.isAudioContiguous = !0, x;\n  }\n}\nfunction Ar(s, e) {\n  let t;\n  if (e === null)\n    return s;\n  for (e < s ? t = -8589934592 : t = 8589934592; Math.abs(s - e) > 4294967296; )\n    s += t;\n  return s;\n}\nfunction JT(s) {\n  for (let e = 0; e < s.length; e++)\n    if (s[e].key)\n      return e;\n  return -1;\n}\nfunction bp(s, e, t, r) {\n  const n = s.samples.length;\n  if (!n)\n    return;\n  const i = s.inputTimeScale;\n  for (let a = 0; a < n; a++) {\n    const l = s.samples[a];\n    l.pts = Ar(l.pts - t.baseTime * i / t.timescale, e * i) / i, l.dts = Ar(l.dts - r.baseTime * i / r.timescale, e * i) / i;\n  }\n  const o = s.samples;\n  return s.samples = [], {\n    samples: o\n  };\n}\nfunction Tp(s, e, t) {\n  const r = s.samples.length;\n  if (!r)\n    return;\n  const n = s.inputTimeScale;\n  for (let o = 0; o < r; o++) {\n    const a = s.samples[o];\n    a.pts = Ar(a.pts - t.baseTime * n / t.timescale, e * n) / n;\n  }\n  s.samples.sort((o, a) => o.pts - a.pts);\n  const i = s.samples;\n  return s.samples = [], {\n    samples: i\n  };\n}\nclass QT extends Lr {\n  constructor(e, t, r, n) {\n    super(\"passthrough-remuxer\", n), this.emitInitSegment = !1, this.audioCodec = void 0, this.videoCodec = void 0, this.initData = void 0, this.initPTS = null, this.initTracks = void 0, this.lastEndTime = null, this.isVideoContiguous = !1;\n  }\n  destroy() {\n  }\n  resetTimeStamp(e) {\n    this.lastEndTime = null;\n    const t = this.initPTS;\n    t && e && t.baseTime === e.baseTime && t.timescale === e.timescale || (this.initPTS = e);\n  }\n  resetNextTimestamp() {\n    this.isVideoContiguous = !1, this.lastEndTime = null;\n  }\n  resetInitSegment(e, t, r, n) {\n    this.audioCodec = t, this.videoCodec = r, this.generateInitSegment(e, n), this.emitInitSegment = !0;\n  }\n  generateInitSegment(e, t) {\n    let {\n      audioCodec: r,\n      videoCodec: n\n    } = this;\n    if (!(e != null && e.byteLength)) {\n      this.initTracks = void 0, this.initData = void 0;\n      return;\n    }\n    const {\n      audio: i,\n      video: o\n    } = this.initData = Dg(e);\n    if (t)\n      $S(e, t);\n    else {\n      const l = i || o;\n      l != null && l.encrypted && this.warn(`Init segment with encrypted track with has no key (\"${l.codec}\")!`);\n    }\n    i && (r = $h(i, ot.AUDIO, this)), o && (n = $h(o, ot.VIDEO, this));\n    const a = {};\n    i && o ? a.audiovideo = {\n      container: \"video/mp4\",\n      codec: r + \",\" + n,\n      supplemental: o.supplemental,\n      encrypted: o.encrypted,\n      initSegment: e,\n      id: \"main\"\n    } : i ? a.audio = {\n      container: \"audio/mp4\",\n      codec: r,\n      encrypted: i.encrypted,\n      initSegment: e,\n      id: \"audio\"\n    } : o ? a.video = {\n      container: \"video/mp4\",\n      codec: n,\n      supplemental: o.supplemental,\n      encrypted: o.encrypted,\n      initSegment: e,\n      id: \"main\"\n    } : this.warn(\"initSegment does not contain moov or trak boxes.\"), this.initTracks = a;\n  }\n  remux(e, t, r, n, i, o) {\n    var a, l;\n    let {\n      initPTS: c,\n      lastEndTime: u\n    } = this;\n    const d = {\n      audio: void 0,\n      video: void 0,\n      text: n,\n      id3: r,\n      initSegment: void 0\n    };\n    ue(u) || (u = this.lastEndTime = i || 0);\n    const h = t.samples;\n    if (!h.length)\n      return d;\n    const f = {\n      initPTS: void 0,\n      timescale: void 0,\n      trackId: void 0\n    };\n    let p = this.initData;\n    if ((a = p) != null && a.length || (this.generateInitSegment(h), p = this.initData), !((l = p) != null && l.length))\n      return this.warn(\"Failed to generate initSegment.\"), d;\n    this.emitInitSegment && (f.tracks = this.initTracks, this.emitInitSegment = !1);\n    const y = GS(h, p, this), E = p.audio ? y[p.audio.id] : null, b = p.video ? y[p.video.id] : null, R = Zi(b, 1 / 0), A = Zi(E, 1 / 0), F = Zi(b, 0, !0), M = Zi(E, 0, !0);\n    let H = i, K = 0;\n    const j = E && (!b || !c && A < R || c && c.trackId === p.audio.id), C = j ? E : b;\n    if (C) {\n      const O = C.timescale, U = C.start - i * O, V = j ? p.audio.id : p.video.id;\n      H = C.start / O, K = j ? M - A : F - R, (o || !c) && (e2(c, H, i, K) || O !== c.timescale) && (c && this.warn(`Timestamps at playlist time: ${o ? \"\" : \"~\"}${i} ${U / O} != initPTS: ${c.baseTime / c.timescale} (${c.baseTime}/${c.timescale}) trackId: ${c.trackId}`), this.log(`Found initPTS at playlist time: ${i} offset: ${H - i} (${U}/${O}) trackId: ${V}`), c = null, f.initPTS = U, f.timescale = O, f.trackId = V);\n    } else\n      this.warn(`No audio or video samples found for initPTS at playlist time: ${i}`);\n    c ? (f.initPTS = c.baseTime, f.timescale = c.timescale, f.trackId = c.trackId) : ((!f.timescale || f.trackId === void 0 || f.initPTS === void 0) && (this.warn(\"Could not set initPTS\"), f.initPTS = H, f.timescale = 1, f.trackId = -1), this.initPTS = c = {\n      baseTime: f.initPTS,\n      timescale: f.timescale,\n      trackId: f.trackId\n    });\n    const k = H - c.baseTime / c.timescale, $ = k + K;\n    K > 0 ? this.lastEndTime = $ : (this.warn(\"Duration parsed from mp4 should be greater than zero\"), this.resetNextTimestamp());\n    const W = !!p.audio, _ = !!p.video;\n    let g = \"\";\n    W && (g += \"audio\"), _ && (g += \"video\");\n    const x = (p.audio ? p.audio.encrypted : !1) || (p.video ? p.video.encrypted : !1), w = {\n      data1: h,\n      startPTS: k,\n      startDTS: k,\n      endPTS: $,\n      endDTS: $,\n      type: g,\n      hasAudio: W,\n      hasVideo: _,\n      nb: 1,\n      dropped: 0,\n      encrypted: x\n    };\n    d.audio = W && !_ ? w : void 0, d.video = _ ? w : void 0;\n    const D = b == null ? void 0 : b.sampleCount;\n    if (D) {\n      const O = b.keyFrameIndex, U = O !== -1;\n      w.nb = D, w.dropped = O === 0 || this.isVideoContiguous ? 0 : U ? O : D, w.independent = U, w.firstKeyFrame = O, U && b.keyFrameStart && (w.firstKeyFramePTS = (b.keyFrameStart - c.baseTime) / c.timescale), this.isVideoContiguous || (d.independent = U), this.isVideoContiguous || (this.isVideoContiguous = U), w.dropped && this.warn(`fmp4 does not start with IDR: firstIDR ${O}/${D} dropped: ${w.dropped} start: ${w.firstKeyFramePTS || \"NA\"}`);\n    }\n    return d.initSegment = f, d.id3 = bp(r, i, c, c), n.samples.length && (d.text = Tp(n, i, c)), d;\n  }\n}\nfunction Zi(s, e, t = !1) {\n  return (s == null ? void 0 : s.start) !== void 0 ? (s.start + (t ? s.duration : 0)) / s.timescale : e;\n}\nfunction e2(s, e, t, r) {\n  if (s === null)\n    return !0;\n  const n = Math.max(r, 1), i = e - s.baseTime / s.timescale;\n  return Math.abs(i - t) > n;\n}\nfunction $h(s, e, t) {\n  const r = s.codec;\n  return r && r.length > 4 ? r : e === ot.AUDIO ? r === \"ec-3\" || r === \"ac-3\" || r === \"alac\" ? r : r === \"fLaC\" || r === \"Opus\" ? Xo(r, !1) : (t.warn(`Unhandled audio codec \"${r}\" in mp4 MAP`), r || \"mp4a\") : (t.warn(`Unhandled video codec \"${r}\" in mp4 MAP`), r || \"avc1\");\n}\nlet ls;\ntry {\n  ls = self.performance.now.bind(self.performance);\n} catch {\n  ls = Date.now;\n}\nconst yo = [{\n  demux: UT,\n  remux: QT\n}, {\n  demux: Is,\n  remux: mo\n}, {\n  demux: OT,\n  remux: mo\n}, {\n  demux: FT,\n  remux: mo\n}];\nyo.splice(2, 0, {\n  demux: BT,\n  remux: mo\n});\nclass Gh {\n  constructor(e, t, r, n, i, o) {\n    this.asyncResult = !1, this.logger = void 0, this.observer = void 0, this.typeSupported = void 0, this.config = void 0, this.id = void 0, this.demuxer = void 0, this.remuxer = void 0, this.decrypter = void 0, this.probe = void 0, this.decryptionPromise = null, this.transmuxConfig = void 0, this.currentTransmuxState = void 0, this.observer = e, this.typeSupported = t, this.config = r, this.id = i, this.logger = o;\n  }\n  configure(e) {\n    this.transmuxConfig = e, this.decrypter && this.decrypter.reset();\n  }\n  push(e, t, r, n) {\n    const i = r.transmuxing;\n    i.executeStart = ls();\n    let o = new Uint8Array(e);\n    const {\n      currentTransmuxState: a,\n      transmuxConfig: l\n    } = this;\n    n && (this.currentTransmuxState = n);\n    const {\n      contiguous: c,\n      discontinuity: u,\n      trackSwitch: d,\n      accurateTimeOffset: h,\n      timeOffset: f,\n      initSegmentChange: p\n    } = n || a, {\n      audioCodec: y,\n      videoCodec: E,\n      defaultInitPts: b,\n      duration: R,\n      initSegmentData: A\n    } = l, F = t2(o, t);\n    if (F && In(F.method)) {\n      const j = this.getDecrypter(), C = Su(F.method);\n      if (j.isSync()) {\n        let k = j.softwareDecrypt(o, F.key.buffer, F.iv.buffer, C);\n        if (r.part > -1) {\n          const W = j.flush();\n          k = W && W.buffer;\n        }\n        if (!k)\n          return i.executeEnd = ls(), xl(r);\n        o = new Uint8Array(k);\n      } else\n        return this.asyncResult = !0, this.decryptionPromise = j.webCryptoDecrypt(o, F.key.buffer, F.iv.buffer, C).then((k) => {\n          const $ = this.push(k, null, r);\n          return this.decryptionPromise = null, $;\n        }), this.decryptionPromise;\n    }\n    const M = this.needsProbing(u, d);\n    if (M) {\n      const j = this.configureTransmuxer(o);\n      if (j)\n        return this.logger.warn(`[transmuxer] ${j.message}`), this.observer.emit(I.ERROR, I.ERROR, {\n          type: ve.MEDIA_ERROR,\n          details: J.FRAG_PARSING_ERROR,\n          fatal: !1,\n          error: j,\n          reason: j.message\n        }), i.executeEnd = ls(), xl(r);\n    }\n    (u || d || p || M) && this.resetInitSegment(A, y, E, R, t), (u || p || M) && this.resetInitialTimestamp(b), c || this.resetContiguity();\n    const H = this.transmux(o, F, f, h, r);\n    this.asyncResult = xi(H);\n    const K = this.currentTransmuxState;\n    return K.contiguous = !0, K.discontinuity = !1, K.trackSwitch = !1, i.executeEnd = ls(), H;\n  }\n  // Due to data caching, flush calls can produce more than one TransmuxerResult (hence the Array type)\n  flush(e) {\n    const t = e.transmuxing;\n    t.executeStart = ls();\n    const {\n      decrypter: r,\n      currentTransmuxState: n,\n      decryptionPromise: i\n    } = this;\n    if (i)\n      return this.asyncResult = !0, i.then(() => this.flush(e));\n    const o = [], {\n      timeOffset: a\n    } = n;\n    if (r) {\n      const d = r.flush();\n      d && o.push(this.push(d.buffer, null, e));\n    }\n    const {\n      demuxer: l,\n      remuxer: c\n    } = this;\n    if (!l || !c) {\n      t.executeEnd = ls();\n      const d = [xl(e)];\n      return this.asyncResult ? Promise.resolve(d) : d;\n    }\n    const u = l.flush(a);\n    return xi(u) ? (this.asyncResult = !0, u.then((d) => (this.flushRemux(o, d, e), o))) : (this.flushRemux(o, u, e), this.asyncResult ? Promise.resolve(o) : o);\n  }\n  flushRemux(e, t, r) {\n    const {\n      audioTrack: n,\n      videoTrack: i,\n      id3Track: o,\n      textTrack: a\n    } = t, {\n      accurateTimeOffset: l,\n      timeOffset: c\n    } = this.currentTransmuxState;\n    this.logger.log(`[transmuxer.ts]: Flushed ${this.id} sn: ${r.sn}${r.part > -1 ? \" part: \" + r.part : \"\"} of ${this.id === pe.MAIN ? \"level\" : \"track\"} ${r.level}`);\n    const u = this.remuxer.remux(n, i, o, a, c, l, !0, this.id);\n    e.push({\n      remuxResult: u,\n      chunkMeta: r\n    }), r.transmuxing.executeEnd = ls();\n  }\n  resetInitialTimestamp(e) {\n    const {\n      demuxer: t,\n      remuxer: r\n    } = this;\n    !t || !r || (t.resetTimeStamp(e), r.resetTimeStamp(e));\n  }\n  resetContiguity() {\n    const {\n      demuxer: e,\n      remuxer: t\n    } = this;\n    !e || !t || (e.resetContiguity(), t.resetNextTimestamp());\n  }\n  resetInitSegment(e, t, r, n, i) {\n    const {\n      demuxer: o,\n      remuxer: a\n    } = this;\n    !o || !a || (o.resetInitSegment(e, t, r, n), a.resetInitSegment(e, t, r, i));\n  }\n  destroy() {\n    this.demuxer && (this.demuxer.destroy(), this.demuxer = void 0), this.remuxer && (this.remuxer.destroy(), this.remuxer = void 0);\n  }\n  transmux(e, t, r, n, i) {\n    let o;\n    return t && t.method === \"SAMPLE-AES\" ? o = this.transmuxSampleAes(e, t, r, n, i) : o = this.transmuxUnencrypted(e, r, n, i), o;\n  }\n  transmuxUnencrypted(e, t, r, n) {\n    const {\n      audioTrack: i,\n      videoTrack: o,\n      id3Track: a,\n      textTrack: l\n    } = this.demuxer.demux(e, t, !1, !this.config.progressive);\n    return {\n      remuxResult: this.remuxer.remux(i, o, a, l, t, r, !1, this.id),\n      chunkMeta: n\n    };\n  }\n  transmuxSampleAes(e, t, r, n, i) {\n    return this.demuxer.demuxSampleAes(e, t, r).then((o) => ({\n      remuxResult: this.remuxer.remux(o.audioTrack, o.videoTrack, o.id3Track, o.textTrack, r, n, !1, this.id),\n      chunkMeta: i\n    }));\n  }\n  configureTransmuxer(e) {\n    const {\n      config: t,\n      observer: r,\n      typeSupported: n\n    } = this;\n    let i;\n    for (let d = 0, h = yo.length; d < h; d++) {\n      var o;\n      if ((o = yo[d].demux) != null && o.probe(e, this.logger)) {\n        i = yo[d];\n        break;\n      }\n    }\n    if (!i)\n      return new Error(\"Failed to find demuxer by probing fragment data\");\n    const a = this.demuxer, l = this.remuxer, c = i.remux, u = i.demux;\n    (!l || !(l instanceof c)) && (this.remuxer = new c(r, t, n, this.logger)), (!a || !(a instanceof u)) && (this.demuxer = new u(r, t, n, this.logger), this.probe = u.probe);\n  }\n  needsProbing(e, t) {\n    return !this.demuxer || !this.remuxer || e || t;\n  }\n  getDecrypter() {\n    let e = this.decrypter;\n    return e || (e = this.decrypter = new vu(this.config)), e;\n  }\n}\nfunction t2(s, e) {\n  let t = null;\n  return s.byteLength > 0 && (e == null ? void 0 : e.key) != null && e.iv !== null && e.method != null && (t = e), t;\n}\nconst xl = (s) => ({\n  remuxResult: {},\n  chunkMeta: s\n});\nfunction xi(s) {\n  return \"then\" in s && s.then instanceof Function;\n}\nclass r2 {\n  constructor(e, t, r, n, i) {\n    this.audioCodec = void 0, this.videoCodec = void 0, this.initSegmentData = void 0, this.duration = void 0, this.defaultInitPts = void 0, this.audioCodec = e, this.videoCodec = t, this.initSegmentData = r, this.duration = n, this.defaultInitPts = i || null;\n  }\n}\nclass s2 {\n  constructor(e, t, r, n, i, o) {\n    this.discontinuity = void 0, this.contiguous = void 0, this.accurateTimeOffset = void 0, this.trackSwitch = void 0, this.timeOffset = void 0, this.initSegmentChange = void 0, this.discontinuity = e, this.contiguous = t, this.accurateTimeOffset = r, this.trackSwitch = n, this.timeOffset = i, this.initSegmentChange = o;\n  }\n}\nlet Vh = 0;\nclass wp {\n  constructor(e, t, r, n) {\n    this.error = null, this.hls = void 0, this.id = void 0, this.instanceNo = Vh++, this.observer = void 0, this.frag = null, this.part = null, this.useWorker = void 0, this.workerContext = null, this.transmuxer = null, this.onTransmuxComplete = void 0, this.onFlush = void 0, this.onWorkerMessage = (l) => {\n      const c = l.data, u = this.hls;\n      if (!(!u || !(c != null && c.event) || c.instanceNo !== this.instanceNo))\n        switch (c.event) {\n          case \"init\": {\n            var d;\n            const h = (d = this.workerContext) == null ? void 0 : d.objectURL;\n            h && self.URL.revokeObjectURL(h);\n            break;\n          }\n          case \"transmuxComplete\": {\n            this.handleTransmuxComplete(c.data);\n            break;\n          }\n          case \"flush\": {\n            this.onFlush(c.data);\n            break;\n          }\n          // pass logs from the worker thread to the main logger\n          case \"workerLog\": {\n            u.logger[c.data.logType] && u.logger[c.data.logType](c.data.message);\n            break;\n          }\n          default: {\n            c.data = c.data || {}, c.data.frag = this.frag, c.data.part = this.part, c.data.id = this.id, u.trigger(c.event, c.data);\n            break;\n          }\n        }\n    }, this.onWorkerError = (l) => {\n      if (!this.hls)\n        return;\n      const c = new Error(`${l.message}  (${l.filename}:${l.lineno})`);\n      this.hls.config.enableWorker = !1, this.hls.logger.warn(`Error in \"${this.id}\" Web Worker, fallback to inline`), this.hls.trigger(I.ERROR, {\n        type: ve.OTHER_ERROR,\n        details: J.INTERNAL_EXCEPTION,\n        fatal: !1,\n        event: \"demuxerWorker\",\n        error: c\n      });\n    };\n    const i = e.config;\n    this.hls = e, this.id = t, this.useWorker = !!i.enableWorker, this.onTransmuxComplete = r, this.onFlush = n;\n    const o = (l, c) => {\n      c = c || {}, c.frag = this.frag || void 0, l === I.ERROR && (c = c, c.parent = this.id, c.part = this.part, this.error = c.error), this.hls.trigger(l, c);\n    };\n    this.observer = new wu(), this.observer.on(I.FRAG_DECRYPTED, o), this.observer.on(I.ERROR, o);\n    const a = ih(i.preferManagedMediaSource);\n    if (this.useWorker && typeof Worker < \"u\") {\n      const l = this.hls.logger;\n      if (i.workerPath || aT()) {\n        try {\n          i.workerPath ? (l.log(`loading Web Worker ${i.workerPath} for \"${t}\"`), this.workerContext = cT(i.workerPath)) : (l.log(`injecting Web Worker for \"${t}\"`), this.workerContext = lT());\n          const {\n            worker: u\n          } = this.workerContext;\n          u.addEventListener(\"message\", this.onWorkerMessage), u.addEventListener(\"error\", this.onWorkerError), u.postMessage({\n            instanceNo: this.instanceNo,\n            cmd: \"init\",\n            typeSupported: a,\n            id: t,\n            config: at(i)\n          });\n        } catch (u) {\n          l.warn(`Error setting up \"${t}\" Web Worker, fallback to inline`, u), this.terminateWorker(), this.error = null, this.transmuxer = new Gh(this.observer, a, i, \"\", t, e.logger);\n        }\n        return;\n      }\n    }\n    this.transmuxer = new Gh(this.observer, a, i, \"\", t, e.logger);\n  }\n  reset() {\n    if (this.frag = null, this.part = null, this.workerContext) {\n      const e = this.instanceNo;\n      this.instanceNo = Vh++;\n      const t = this.hls.config, r = ih(t.preferManagedMediaSource);\n      this.workerContext.worker.postMessage({\n        instanceNo: this.instanceNo,\n        cmd: \"reset\",\n        resetNo: e,\n        typeSupported: r,\n        id: this.id,\n        config: at(t)\n      });\n    }\n  }\n  terminateWorker() {\n    if (this.workerContext) {\n      const {\n        worker: e\n      } = this.workerContext;\n      this.workerContext = null, e.removeEventListener(\"message\", this.onWorkerMessage), e.removeEventListener(\"error\", this.onWorkerError), uT(this.hls.config.workerPath);\n    }\n  }\n  destroy() {\n    if (this.workerContext)\n      this.terminateWorker(), this.onWorkerMessage = this.onWorkerError = null;\n    else {\n      const t = this.transmuxer;\n      t && (t.destroy(), this.transmuxer = null);\n    }\n    const e = this.observer;\n    e && e.removeAllListeners(), this.frag = null, this.part = null, this.observer = null, this.hls = null;\n  }\n  push(e, t, r, n, i, o, a, l, c, u) {\n    var d, h;\n    c.transmuxing.start = self.performance.now();\n    const {\n      instanceNo: f,\n      transmuxer: p\n    } = this, y = o ? o.start : i.start, E = i.decryptdata, b = this.frag, R = !(b && i.cc === b.cc), A = !(b && c.level === b.level), F = b ? c.sn - b.sn : -1, M = this.part ? c.part - this.part.index : -1, H = F === 0 && c.id > 1 && c.id === (b == null ? void 0 : b.stats.chunkCount), K = !A && (F === 1 || F === 0 && (M === 1 || H && M <= 0)), j = self.performance.now();\n    (A || F || i.stats.parsing.start === 0) && (i.stats.parsing.start = j), o && (M || !K) && (o.stats.parsing.start = j);\n    const C = !(b && ((d = i.initSegment) == null ? void 0 : d.url) === ((h = b.initSegment) == null ? void 0 : h.url)), k = new s2(R, K, l, A, y, C);\n    if (!K || R || C) {\n      this.hls.logger.log(`[transmuxer-interface]: Starting new transmux session for ${i.type} sn: ${c.sn}${c.part > -1 ? \" part: \" + c.part : \"\"} ${this.id === pe.MAIN ? \"level\" : \"track\"}: ${c.level} id: ${c.id}\n        discontinuity: ${R}\n        trackSwitch: ${A}\n        contiguous: ${K}\n        accurateTimeOffset: ${l}\n        timeOffset: ${y}\n        initSegmentChange: ${C}`);\n      const $ = new r2(r, n, t, a, u);\n      this.configureTransmuxer($);\n    }\n    if (this.frag = i, this.part = o, this.workerContext)\n      this.workerContext.worker.postMessage({\n        instanceNo: f,\n        cmd: \"demux\",\n        data: e,\n        decryptdata: E,\n        chunkMeta: c,\n        state: k\n      }, e instanceof ArrayBuffer ? [e] : []);\n    else if (p) {\n      const $ = p.push(e, E, c, k);\n      xi($) ? $.then((W) => {\n        this.handleTransmuxComplete(W);\n      }).catch((W) => {\n        this.transmuxerError(W, c, \"transmuxer-interface push error\");\n      }) : this.handleTransmuxComplete($);\n    }\n  }\n  flush(e) {\n    e.transmuxing.start = self.performance.now();\n    const {\n      instanceNo: t,\n      transmuxer: r\n    } = this;\n    if (this.workerContext)\n      this.workerContext.worker.postMessage({\n        instanceNo: t,\n        cmd: \"flush\",\n        chunkMeta: e\n      });\n    else if (r) {\n      const n = r.flush(e);\n      xi(n) ? n.then((i) => {\n        this.handleFlushResult(i, e);\n      }).catch((i) => {\n        this.transmuxerError(i, e, \"transmuxer-interface flush error\");\n      }) : this.handleFlushResult(n, e);\n    }\n  }\n  transmuxerError(e, t, r) {\n    this.hls && (this.error = e, this.hls.trigger(I.ERROR, {\n      type: ve.MEDIA_ERROR,\n      details: J.FRAG_PARSING_ERROR,\n      chunkMeta: t,\n      frag: this.frag || void 0,\n      part: this.part || void 0,\n      fatal: !1,\n      error: e,\n      err: e,\n      reason: r\n    }));\n  }\n  handleFlushResult(e, t) {\n    e.forEach((r) => {\n      this.handleTransmuxComplete(r);\n    }), this.onFlush(t);\n  }\n  configureTransmuxer(e) {\n    const {\n      instanceNo: t,\n      transmuxer: r\n    } = this;\n    this.workerContext ? this.workerContext.worker.postMessage({\n      instanceNo: t,\n      cmd: \"configure\",\n      config: e\n    }) : r && r.configure(e);\n  }\n  handleTransmuxComplete(e) {\n    e.chunkMeta.transmuxing.end = self.performance.now(), this.onTransmuxComplete(e);\n  }\n}\nconst jh = 100;\nclass n2 extends Tu {\n  constructor(e, t, r) {\n    super(e, t, r, \"audio-stream-controller\", pe.AUDIO), this.mainAnchor = null, this.mainFragLoading = null, this.audioOnly = !1, this.bufferedTrack = null, this.switchingTrack = null, this.trackId = -1, this.waitingData = null, this.mainDetails = null, this.flushing = !1, this.bufferFlushed = !1, this.cachedTrackLoadedData = null, this.registerListeners();\n  }\n  onHandlerDestroying() {\n    this.unregisterListeners(), super.onHandlerDestroying(), this.resetItem();\n  }\n  resetItem() {\n    this.mainDetails = this.mainAnchor = this.mainFragLoading = this.bufferedTrack = this.switchingTrack = this.waitingData = this.cachedTrackLoadedData = null;\n  }\n  registerListeners() {\n    super.registerListeners();\n    const {\n      hls: e\n    } = this;\n    e.on(I.LEVEL_LOADED, this.onLevelLoaded, this), e.on(I.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this), e.on(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.on(I.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), e.on(I.BUFFER_RESET, this.onBufferReset, this), e.on(I.BUFFER_CREATED, this.onBufferCreated, this), e.on(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.on(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.on(I.INIT_PTS_FOUND, this.onInitPtsFound, this), e.on(I.FRAG_LOADING, this.onFragLoading, this), e.on(I.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n  unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e && (super.unregisterListeners(), e.off(I.LEVEL_LOADED, this.onLevelLoaded, this), e.off(I.AUDIO_TRACKS_UPDATED, this.onAudioTracksUpdated, this), e.off(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.off(I.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), e.off(I.BUFFER_RESET, this.onBufferReset, this), e.off(I.BUFFER_CREATED, this.onBufferCreated, this), e.off(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.off(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.off(I.INIT_PTS_FOUND, this.onInitPtsFound, this), e.off(I.FRAG_LOADING, this.onFragLoading, this), e.off(I.FRAG_BUFFERED, this.onFragBuffered, this));\n  }\n  // INIT_PTS_FOUND is triggered when the video track parsed in the stream-controller has a new PTS value\n  onInitPtsFound(e, {\n    frag: t,\n    id: r,\n    initPTS: n,\n    timescale: i,\n    trackId: o\n  }) {\n    if (r === pe.MAIN) {\n      const a = t.cc, l = this.fragCurrent;\n      if (this.initPTS[a] = {\n        baseTime: n,\n        timescale: i,\n        trackId: o\n      }, this.log(`InitPTS for cc: ${a} found from main: ${n / i} (${n}/${i}) trackId: ${o}`), this.mainAnchor = t, this.state === ne.WAITING_INIT_PTS) {\n        const c = this.waitingData;\n        (!c && !this.loadingParts || c && c.frag.cc !== a) && this.syncWithAnchor(t, c == null ? void 0 : c.frag);\n      } else !this.hls.hasEnoughToStart && l && l.cc !== a ? (l.abortRequests(), this.syncWithAnchor(t, l)) : this.state === ne.IDLE && this.tick();\n    }\n  }\n  getLoadPosition() {\n    return !this.startFragRequested && this.nextLoadPosition >= 0 ? this.nextLoadPosition : super.getLoadPosition();\n  }\n  syncWithAnchor(e, t) {\n    var r;\n    const n = ((r = this.mainFragLoading) == null ? void 0 : r.frag) || null;\n    if (t && (n == null ? void 0 : n.cc) === t.cc)\n      return;\n    const i = (n || e).cc, o = this.getLevelDetails(), a = this.getLoadPosition(), l = Vg(o, i, a);\n    l && (this.log(`Syncing with main frag at ${l.start} cc ${l.cc}`), this.startFragRequested = !1, this.nextLoadPosition = l.start, this.resetLoadingState(), this.state === ne.IDLE && this.doTickIdle());\n  }\n  startLoad(e, t) {\n    if (!this.levels) {\n      this.startPosition = e, this.state = ne.STOPPED;\n      return;\n    }\n    const r = this.lastCurrentTime;\n    this.stopLoad(), this.setInterval(jh), r > 0 && e === -1 ? (this.log(`Override startPosition with lastCurrentTime @${r.toFixed(3)}`), e = r, this.state = ne.IDLE) : this.state = ne.WAITING_TRACK, this.nextLoadPosition = this.lastCurrentTime = e + this.timelineOffset, this.startPosition = t ? -1 : e, this.tick();\n  }\n  doTick() {\n    switch (this.state) {\n      case ne.IDLE:\n        this.doTickIdle();\n        break;\n      case ne.WAITING_TRACK: {\n        const {\n          levels: e,\n          trackId: t\n        } = this, r = e == null ? void 0 : e[t], n = r == null ? void 0 : r.details;\n        if (n && !this.waitForLive(r)) {\n          if (this.waitForCdnTuneIn(n))\n            break;\n          this.state = ne.WAITING_INIT_PTS;\n        }\n        break;\n      }\n      case ne.FRAG_LOADING_WAITING_RETRY: {\n        this.checkRetryDate();\n        break;\n      }\n      case ne.WAITING_INIT_PTS: {\n        const e = this.waitingData;\n        if (e) {\n          const {\n            frag: t,\n            part: r,\n            cache: n,\n            complete: i\n          } = e, o = this.mainAnchor;\n          if (this.initPTS[t.cc] !== void 0) {\n            this.waitingData = null, this.state = ne.FRAG_LOADING;\n            const a = n.flush().buffer, l = {\n              frag: t,\n              part: r,\n              payload: a,\n              networkDetails: null\n            };\n            this._handleFragmentLoadProgress(l), i && super._handleFragmentLoadComplete(l);\n          } else o && o.cc !== e.frag.cc && this.syncWithAnchor(o, e.frag);\n        } else\n          this.state = ne.IDLE;\n      }\n    }\n    this.onTickEnd();\n  }\n  resetLoadingState() {\n    const e = this.waitingData;\n    e && (this.fragmentTracker.removeFragment(e.frag), this.waitingData = null), super.resetLoadingState();\n  }\n  onTickEnd() {\n    const {\n      media: e\n    } = this;\n    e != null && e.readyState && (this.lastCurrentTime = e.currentTime);\n  }\n  doTickIdle() {\n    var e;\n    const {\n      hls: t,\n      levels: r,\n      media: n,\n      trackId: i\n    } = this, o = t.config;\n    if (!this.buffering || !n && !this.primaryPrefetch && (this.startFragRequested || !o.startFragPrefetch) || !(r != null && r[i]))\n      return;\n    const a = r[i], l = a.details;\n    if (!l || this.waitForLive(a) || this.waitForCdnTuneIn(l)) {\n      this.state = ne.WAITING_TRACK, this.startFragRequested = !1;\n      return;\n    }\n    const c = this.mediaBuffer ? this.mediaBuffer : this.media;\n    this.bufferFlushed && c && (this.bufferFlushed = !1, this.afterBufferFlushed(c, ot.AUDIO, pe.AUDIO));\n    const u = this.getFwdBufferInfo(c, pe.AUDIO);\n    if (u === null)\n      return;\n    if (!this.switchingTrack && this._streamEnded(u, l)) {\n      t.trigger(I.BUFFER_EOS, {\n        type: \"audio\"\n      }), this.state = ne.ENDED;\n      return;\n    }\n    const d = u.len, h = t.maxBufferLength, f = l.fragments, p = f[0].start, y = this.getLoadPosition(), E = this.flushing ? y : u.end;\n    if (this.switchingTrack && n) {\n      const A = y;\n      l.PTSKnown && A < p && (u.end > p || u.nextStart) && (this.log(\"Alt audio track ahead of main track, seek to start of alt audio track\"), n.currentTime = p + 0.05);\n    }\n    if (d >= h && !this.switchingTrack && E < f[f.length - 1].start)\n      return;\n    let b = this.getNextFragment(E, l);\n    if (b && this.isLoopLoading(b, E) && (b = this.getNextFragmentLoopLoading(b, l, u, pe.MAIN, h)), !b) {\n      this.bufferFlushed = !0;\n      return;\n    }\n    let R = ((e = this.mainFragLoading) == null ? void 0 : e.frag) || null;\n    if (!this.audioOnly && this.startFragRequested && R && Vt(b) && !b.endList && (!l.live || !this.loadingParts && E < this.hls.liveSyncPosition) && (this.fragmentTracker.getState(R) === Ht.OK && (this.mainFragLoading = R = null), R && Vt(R))) {\n      if (b.start > R.end) {\n        const F = this.fragmentTracker.getFragAtPos(E, pe.MAIN);\n        F && F.end > R.end && (R = F, this.mainFragLoading = {\n          frag: F,\n          targetBufferTime: null\n        });\n      }\n      if (b.start > R.end)\n        return;\n    }\n    this.loadFragment(b, a, E);\n  }\n  onMediaDetaching(e, t) {\n    this.bufferFlushed = this.flushing = !1, super.onMediaDetaching(e, t);\n  }\n  onAudioTracksUpdated(e, {\n    audioTracks: t\n  }) {\n    this.resetTransmuxer(), this.levels = t.map((r) => new mi(r));\n  }\n  onAudioTrackSwitching(e, t) {\n    const r = !!t.url;\n    this.trackId = t.id;\n    const {\n      fragCurrent: n\n    } = this;\n    n && (n.abortRequests(), this.removeUnbufferedFrags(n.start)), this.resetLoadingState(), r ? (this.switchingTrack = t, this.flushAudioIfNeeded(t), this.state !== ne.STOPPED && (this.setInterval(jh), this.state = ne.IDLE, this.tick())) : (this.resetTransmuxer(), this.switchingTrack = null, this.bufferedTrack = t, this.clearInterval());\n  }\n  onManifestLoading() {\n    super.onManifestLoading(), this.bufferFlushed = this.flushing = this.audioOnly = !1, this.resetItem(), this.trackId = -1;\n  }\n  onLevelLoaded(e, t) {\n    this.mainDetails = t.details;\n    const r = this.cachedTrackLoadedData;\n    r && (this.cachedTrackLoadedData = null, this.onAudioTrackLoaded(I.AUDIO_TRACK_LOADED, r));\n  }\n  onAudioTrackLoaded(e, t) {\n    var r;\n    const {\n      levels: n\n    } = this, {\n      details: i,\n      id: o,\n      groupId: a,\n      track: l\n    } = t;\n    if (!n) {\n      this.warn(`Audio tracks reset while loading track ${o} \"${l.name}\" of \"${a}\"`);\n      return;\n    }\n    const c = this.mainDetails;\n    if (!c || i.endCC > c.endCC || c.expired) {\n      this.cachedTrackLoadedData = t, this.state !== ne.STOPPED && (this.state = ne.WAITING_TRACK);\n      return;\n    }\n    this.cachedTrackLoadedData = null, this.log(`Audio track ${o} \"${l.name}\" of \"${a}\" loaded [${i.startSN},${i.endSN}]${i.lastPartSn ? `[part-${i.lastPartSn}-${i.lastPartIndex}]` : \"\"},duration:${i.totalduration}`);\n    const u = n[o];\n    let d = 0;\n    if (i.live || (r = u.details) != null && r.live) {\n      if (this.checkLiveUpdate(i), i.deltaUpdateFailed)\n        return;\n      if (u.details) {\n        var h;\n        d = this.alignPlaylists(i, u.details, (h = this.levelLastLoaded) == null ? void 0 : h.details);\n      }\n      i.alignedSliding || (np(i, c), i.alignedSliding || sa(i, c), d = i.fragmentStart);\n    }\n    u.details = i, this.levelLastLoaded = u, this.startFragRequested || this.setStartPosition(c, d), this.hls.trigger(I.AUDIO_TRACK_UPDATED, {\n      details: i,\n      id: o,\n      groupId: t.groupId\n    }), this.state === ne.WAITING_TRACK && !this.waitForCdnTuneIn(i) && (this.state = ne.IDLE), this.tick();\n  }\n  _handleFragmentLoadProgress(e) {\n    var t;\n    const r = e.frag, {\n      part: n,\n      payload: i\n    } = e, {\n      config: o,\n      trackId: a,\n      levels: l\n    } = this;\n    if (!l) {\n      this.warn(`Audio tracks were reset while fragment load was in progress. Fragment ${r.sn} of level ${r.level} will not be buffered`);\n      return;\n    }\n    const c = l[a];\n    if (!c) {\n      this.warn(\"Audio track is undefined on fragment load progress\");\n      return;\n    }\n    const u = c.details;\n    if (!u) {\n      this.warn(\"Audio track details undefined on fragment load progress\"), this.removeUnbufferedFrags(r.start);\n      return;\n    }\n    const d = o.defaultAudioCodec || c.audioCodec || \"mp4a.40.2\";\n    let h = this.transmuxer;\n    h || (h = this.transmuxer = new wp(this.hls, pe.AUDIO, this._handleTransmuxComplete.bind(this), this._handleTransmuxerFlush.bind(this)));\n    const f = this.initPTS[r.cc], p = (t = r.initSegment) == null ? void 0 : t.data;\n    if (f !== void 0) {\n      const E = n ? n.index : -1, b = E !== -1, R = new Eu(r.level, r.sn, r.stats.chunkCount, i.byteLength, E, b);\n      h.push(i, p, d, \"\", r, n, u.totalduration, !1, R, f);\n    } else {\n      this.log(`Unknown video PTS for cc ${r.cc}, waiting for video PTS before demuxing audio frag ${r.sn} of [${u.startSN} ,${u.endSN}],track ${a}`);\n      const {\n        cache: y\n      } = this.waitingData = this.waitingData || {\n        frag: r,\n        part: n,\n        cache: new ip(),\n        complete: !1\n      };\n      y.push(new Uint8Array(i)), this.state !== ne.STOPPED && (this.state = ne.WAITING_INIT_PTS);\n    }\n  }\n  _handleFragmentLoadComplete(e) {\n    if (this.waitingData) {\n      this.waitingData.complete = !0;\n      return;\n    }\n    super._handleFragmentLoadComplete(e);\n  }\n  onBufferReset() {\n    this.mediaBuffer = null;\n  }\n  onBufferCreated(e, t) {\n    this.bufferFlushed = this.flushing = !1;\n    const r = t.tracks.audio;\n    r && (this.mediaBuffer = r.buffer || null);\n  }\n  onFragLoading(e, t) {\n    !this.audioOnly && t.frag.type === pe.MAIN && Vt(t.frag) && (this.mainFragLoading = t, this.state === ne.IDLE && this.tick());\n  }\n  onFragBuffered(e, t) {\n    const {\n      frag: r,\n      part: n\n    } = t;\n    if (r.type !== pe.AUDIO) {\n      !this.audioOnly && r.type === pe.MAIN && !r.elementaryStreams.video && !r.elementaryStreams.audiovideo && (this.audioOnly = !0, this.mainFragLoading = null);\n      return;\n    }\n    if (this.fragContextChanged(r)) {\n      this.warn(`Fragment ${r.sn}${n ? \" p: \" + n.index : \"\"} of level ${r.level} finished buffering, but was aborted. state: ${this.state}, audioSwitch: ${this.switchingTrack ? this.switchingTrack.name : \"false\"}`);\n      return;\n    }\n    if (Vt(r)) {\n      this.fragPrevious = r;\n      const i = this.switchingTrack;\n      i && (this.bufferedTrack = i, this.switchingTrack = null, this.hls.trigger(I.AUDIO_TRACK_SWITCHED, tt({}, i)));\n    }\n    this.fragBufferedComplete(r, n), this.media && this.tick();\n  }\n  onError(e, t) {\n    var r;\n    if (t.fatal) {\n      this.state = ne.ERROR;\n      return;\n    }\n    switch (t.details) {\n      case J.FRAG_GAP:\n      case J.FRAG_PARSING_ERROR:\n      case J.FRAG_DECRYPT_ERROR:\n      case J.FRAG_LOAD_ERROR:\n      case J.FRAG_LOAD_TIMEOUT:\n      case J.KEY_LOAD_ERROR:\n      case J.KEY_LOAD_TIMEOUT:\n        this.onFragmentOrKeyLoadError(pe.AUDIO, t);\n        break;\n      case J.AUDIO_TRACK_LOAD_ERROR:\n      case J.AUDIO_TRACK_LOAD_TIMEOUT:\n      case J.LEVEL_PARSING_ERROR:\n        !t.levelRetry && this.state === ne.WAITING_TRACK && ((r = t.context) == null ? void 0 : r.type) === Ke.AUDIO_TRACK && (this.state = ne.IDLE);\n        break;\n      case J.BUFFER_ADD_CODEC_ERROR:\n      case J.BUFFER_APPEND_ERROR:\n        if (t.parent !== \"audio\")\n          return;\n        this.reduceLengthAndFlushBuffer(t) || this.resetLoadingState();\n        break;\n      case J.BUFFER_FULL_ERROR:\n        if (t.parent !== \"audio\")\n          return;\n        this.reduceLengthAndFlushBuffer(t) && (this.bufferedTrack = null, super.flushMainBuffer(0, Number.POSITIVE_INFINITY, \"audio\"));\n        break;\n      case J.INTERNAL_EXCEPTION:\n        this.recoverWorkerError(t);\n        break;\n    }\n  }\n  onBufferFlushing(e, {\n    type: t\n  }) {\n    t !== ot.VIDEO && (this.flushing = !0);\n  }\n  onBufferFlushed(e, {\n    type: t\n  }) {\n    if (t !== ot.VIDEO) {\n      this.flushing = !1, this.bufferFlushed = !0, this.state === ne.ENDED && (this.state = ne.IDLE);\n      const r = this.mediaBuffer || this.media;\n      r && (this.afterBufferFlushed(r, t, pe.AUDIO), this.tick());\n    }\n  }\n  _handleTransmuxComplete(e) {\n    var t;\n    const r = \"audio\", {\n      hls: n\n    } = this, {\n      remuxResult: i,\n      chunkMeta: o\n    } = e, a = this.getCurrentContext(o);\n    if (!a) {\n      this.resetWhenMissingContext(o);\n      return;\n    }\n    const {\n      frag: l,\n      part: c,\n      level: u\n    } = a, {\n      details: d\n    } = u, {\n      audio: h,\n      text: f,\n      id3: p,\n      initSegment: y\n    } = i;\n    if (this.fragContextChanged(l) || !d) {\n      this.fragmentTracker.removeFragment(l);\n      return;\n    }\n    if (this.state = ne.PARSING, this.switchingTrack && h && this.completeAudioSwitch(this.switchingTrack), y != null && y.tracks) {\n      const E = l.initSegment || l;\n      if (this.unhandledEncryptionError(y, l))\n        return;\n      this._bufferInitSegment(u, y.tracks, E, o), n.trigger(I.FRAG_PARSING_INIT_SEGMENT, {\n        frag: E,\n        id: r,\n        tracks: y.tracks\n      });\n    }\n    if (h) {\n      const {\n        startPTS: E,\n        endPTS: b,\n        startDTS: R,\n        endDTS: A\n      } = h;\n      c && (c.elementaryStreams[ot.AUDIO] = {\n        startPTS: E,\n        endPTS: b,\n        startDTS: R,\n        endDTS: A\n      }), l.setElementaryStreamInfo(ot.AUDIO, E, b, R, A), this.bufferFragmentData(h, l, c, o);\n    }\n    if (p != null && (t = p.samples) != null && t.length) {\n      const E = nt({\n        id: r,\n        frag: l,\n        details: d\n      }, p);\n      n.trigger(I.FRAG_PARSING_METADATA, E);\n    }\n    if (f) {\n      const E = nt({\n        id: r,\n        frag: l,\n        details: d\n      }, f);\n      n.trigger(I.FRAG_PARSING_USERDATA, E);\n    }\n  }\n  _bufferInitSegment(e, t, r, n) {\n    if (this.state !== ne.PARSING || (t.video && delete t.video, t.audiovideo && delete t.audiovideo, !t.audio))\n      return;\n    const i = t.audio;\n    i.id = pe.AUDIO;\n    const o = e.audioCodec;\n    this.log(`Init audio buffer, container:${i.container}, codecs[level/parsed]=[${o}/${i.codec}]`), o && o.split(\",\").length === 1 && (i.levelCodec = o), this.hls.trigger(I.BUFFER_CODECS, t);\n    const a = i.initSegment;\n    if (a != null && a.byteLength) {\n      const l = {\n        type: \"audio\",\n        frag: r,\n        part: null,\n        chunkMeta: n,\n        parent: r.type,\n        data: a\n      };\n      this.hls.trigger(I.BUFFER_APPENDING, l);\n    }\n    this.tickImmediate();\n  }\n  loadFragment(e, t, r) {\n    const n = this.fragmentTracker.getState(e);\n    if (this.switchingTrack || n === Ht.NOT_LOADED || n === Ht.PARTIAL) {\n      var i;\n      if (!Vt(e))\n        this._loadInitSegment(e, t);\n      else if ((i = t.details) != null && i.live && !this.initPTS[e.cc]) {\n        this.log(`Waiting for video PTS in continuity counter ${e.cc} of live stream before loading audio fragment ${e.sn} of level ${this.trackId}`), this.state = ne.WAITING_INIT_PTS;\n        const o = this.mainDetails;\n        o && o.fragmentStart !== t.details.fragmentStart && sa(t.details, o);\n      } else\n        super.loadFragment(e, t, r);\n    } else\n      this.clearTrackerIfNeeded(e);\n  }\n  flushAudioIfNeeded(e) {\n    if (this.media && this.bufferedTrack) {\n      const {\n        name: t,\n        lang: r,\n        assocLang: n,\n        characteristics: i,\n        audioCodec: o,\n        channels: a\n      } = this.bufferedTrack;\n      qs({\n        name: t,\n        lang: r,\n        assocLang: n,\n        characteristics: i,\n        audioCodec: o,\n        channels: a\n      }, e, Us) || (Qo(e.url, this.hls) ? (this.log(\"Switching audio track : flushing all audio\"), super.flushMainBuffer(0, Number.POSITIVE_INFINITY, \"audio\"), this.bufferedTrack = null) : this.bufferedTrack = e);\n    }\n  }\n  completeAudioSwitch(e) {\n    const {\n      hls: t\n    } = this;\n    this.flushAudioIfNeeded(e), this.bufferedTrack = e, this.switchingTrack = null, t.trigger(I.AUDIO_TRACK_SWITCHED, tt({}, e));\n  }\n}\nclass ku extends Lr {\n  constructor(e, t) {\n    super(t, e.logger), this.hls = void 0, this.canLoad = !1, this.timer = -1, this.hls = e;\n  }\n  destroy() {\n    this.clearTimer(), this.hls = this.log = this.warn = null;\n  }\n  clearTimer() {\n    this.timer !== -1 && (self.clearTimeout(this.timer), this.timer = -1);\n  }\n  startLoad() {\n    this.canLoad = !0, this.loadPlaylist();\n  }\n  stopLoad() {\n    this.canLoad = !1, this.clearTimer();\n  }\n  switchParams(e, t, r) {\n    const n = t == null ? void 0 : t.renditionReports;\n    if (n) {\n      let i = -1;\n      for (let o = 0; o < n.length; o++) {\n        const a = n[o];\n        let l;\n        try {\n          l = new self.URL(a.URI, t.url).href;\n        } catch (c) {\n          this.warn(`Could not construct new URL for Rendition Report: ${c}`), l = a.URI || \"\";\n        }\n        if (l === e) {\n          i = o;\n          break;\n        } else l === e.substring(0, l.length) && (i = o);\n      }\n      if (i !== -1) {\n        const o = n[i], a = parseInt(o[\"LAST-MSN\"]) || t.lastPartSn;\n        let l = parseInt(o[\"LAST-PART\"]) || t.lastPartIndex;\n        if (this.hls.config.lowLatencyMode) {\n          const u = Math.min(t.age - t.partTarget, t.targetduration);\n          l >= 0 && u > t.partTarget && (l += 1);\n        }\n        const c = r && oh(r);\n        return new ah(a, l >= 0 ? l : void 0, c);\n      }\n    }\n  }\n  loadPlaylist(e) {\n    this.clearTimer();\n  }\n  loadingPlaylist(e, t) {\n    this.clearTimer();\n  }\n  shouldLoadPlaylist(e) {\n    return this.canLoad && !!e && !!e.url && (!e.details || e.details.live);\n  }\n  getUrlWithDirectives(e, t) {\n    if (t)\n      try {\n        return t.addDirectives(e);\n      } catch (r) {\n        this.warn(`Could not construct new URL with HLS Delivery Directives: ${r}`);\n      }\n    return e;\n  }\n  playlistLoaded(e, t, r) {\n    const {\n      details: n,\n      stats: i\n    } = t, o = self.performance.now(), a = i.loading.first ? Math.max(0, o - i.loading.first) : 0;\n    n.advancedDateTime = Date.now() - a;\n    const l = this.hls.config.timelineOffset;\n    if (l !== n.appliedTimelineOffset) {\n      const u = Math.max(l || 0, 0);\n      n.appliedTimelineOffset = u, n.fragments.forEach((d) => {\n        d.setStart(d.playlistOffset + u);\n      });\n    }\n    if (n.live || r != null && r.live) {\n      const u = \"levelInfo\" in t ? t.levelInfo : t.track;\n      if (n.reloaded(r), r && n.fragments.length > 0) {\n        Zb(r, n, this);\n        const R = n.playlistParsingError;\n        if (R) {\n          this.warn(R);\n          const A = this.hls;\n          if (!A.config.ignorePlaylistParsingErrors) {\n            var c;\n            const {\n              networkDetails: F\n            } = t;\n            A.trigger(I.ERROR, {\n              type: ve.NETWORK_ERROR,\n              details: J.LEVEL_PARSING_ERROR,\n              fatal: !1,\n              url: n.url,\n              error: R,\n              reason: R.message,\n              level: t.level || void 0,\n              parent: (c = n.fragments[0]) == null ? void 0 : c.type,\n              networkDetails: F,\n              stats: i\n            });\n            return;\n          }\n          n.playlistParsingError = null;\n        }\n      }\n      n.requestScheduled === -1 && (n.requestScheduled = i.loading.start);\n      const d = this.hls.mainForwardBufferInfo, h = d ? d.end - d.len : 0, f = (n.edge - h) * 1e3, p = Qg(n, f);\n      if (n.requestScheduled + p < o ? n.requestScheduled = o : n.requestScheduled += p, this.log(`live playlist ${e} ${n.advanced ? \"REFRESHED \" + n.lastPartSn + \"-\" + n.lastPartIndex : n.updated ? \"UPDATED\" : \"MISSED\"}`), !this.canLoad || !n.live)\n        return;\n      let y, E, b;\n      if (n.canBlockReload && n.endSN && n.advanced) {\n        const R = this.hls.config.lowLatencyMode, A = n.lastPartSn, F = n.endSN, M = n.lastPartIndex, H = M !== -1, K = A === F;\n        H ? K ? (E = F + 1, b = R ? 0 : M) : (E = A, b = R ? M + 1 : n.maxPartIndex) : E = F + 1;\n        const j = n.age, C = j + n.ageHeader;\n        let k = Math.min(C - n.partTarget, n.targetduration * 1.5);\n        if (k > 0) {\n          if (C > n.targetduration * 3)\n            this.log(`Playlist last advanced ${j.toFixed(2)}s ago. Omitting segment and part directives.`), E = void 0, b = void 0;\n          else if (r != null && r.tuneInGoal && C - n.partTarget > r.tuneInGoal)\n            this.warn(`CDN Tune-in goal increased from: ${r.tuneInGoal} to: ${k} with playlist age: ${n.age}`), k = 0;\n          else {\n            const $ = Math.floor(k / n.targetduration);\n            if (E += $, b !== void 0) {\n              const W = Math.round(k % n.targetduration / n.partTarget);\n              b += W;\n            }\n            this.log(`CDN Tune-in age: ${n.ageHeader}s last advanced ${j.toFixed(2)}s goal: ${k} skip sn ${$} to part ${b}`);\n          }\n          n.tuneInGoal = k;\n        }\n        if (y = this.getDeliveryDirectives(n, t.deliveryDirectives, E, b), R || !K) {\n          n.requestScheduled = o, this.loadingPlaylist(u, y);\n          return;\n        }\n      } else (n.canBlockReload || n.canSkipUntil) && (y = this.getDeliveryDirectives(n, t.deliveryDirectives, E, b));\n      y && E !== void 0 && n.canBlockReload && (n.requestScheduled = i.loading.first + Math.max(p - a * 2, p / 2)), this.scheduleLoading(u, y, n);\n    } else\n      this.clearTimer();\n  }\n  scheduleLoading(e, t, r) {\n    const n = r || e.details;\n    if (!n) {\n      this.loadingPlaylist(e, t);\n      return;\n    }\n    const i = self.performance.now(), o = n.requestScheduled;\n    if (i >= o) {\n      this.loadingPlaylist(e, t);\n      return;\n    }\n    const a = o - i;\n    this.log(`reload live playlist ${e.name || e.bitrate + \"bps\"} in ${Math.round(a)} ms`), this.clearTimer(), this.timer = self.setTimeout(() => this.loadingPlaylist(e, t), a);\n  }\n  getDeliveryDirectives(e, t, r, n) {\n    let i = oh(e);\n    return t != null && t.skip && e.deltaUpdateFailed && (r = t.msn, n = t.part, i = go.No), new ah(r, n, i);\n  }\n  checkRetry(e) {\n    const t = e.details, r = ea(e), n = e.errorAction, {\n      action: i,\n      retryCount: o = 0,\n      retryConfig: a\n    } = n || {}, l = !!n && !!a && (i === Zt.RetryRequest || !n.resolved && i === Zt.SendAlternateToPenaltyBox);\n    if (l) {\n      var c;\n      if (o >= a.maxNumRetry)\n        return !1;\n      if (r && (c = e.context) != null && c.deliveryDirectives)\n        this.warn(`Retrying playlist loading ${o + 1}/${a.maxNumRetry} after \"${t}\" without delivery-directives`), this.loadPlaylist();\n      else {\n        const u = yu(a, o);\n        this.clearTimer(), this.timer = self.setTimeout(() => this.loadPlaylist(), u), this.warn(`Retrying playlist loading ${o + 1}/${a.maxNumRetry} after \"${t}\" in ${u}ms`);\n      }\n      e.levelRetry = !0, n.resolved = !0;\n    }\n    return l;\n  }\n}\nfunction Ap(s, e) {\n  if (s.length !== e.length)\n    return !1;\n  for (let t = 0; t < s.length; t++)\n    if (!Si(s[t].attrs, e[t].attrs))\n      return !1;\n  return !0;\n}\nfunction Si(s, e, t) {\n  const r = s[\"STABLE-RENDITION-ID\"];\n  return r && !t ? r === e[\"STABLE-RENDITION-ID\"] : !(t || [\"LANGUAGE\", \"NAME\", \"CHARACTERISTICS\", \"AUTOSELECT\", \"DEFAULT\", \"FORCED\", \"ASSOC-LANGUAGE\"]).some((n) => s[n] !== e[n]);\n}\nfunction yc(s, e) {\n  return e.label.toLowerCase() === s.name.toLowerCase() && (!e.language || e.language.toLowerCase() === (s.lang || \"\").toLowerCase());\n}\nclass i2 extends ku {\n  constructor(e) {\n    super(e, \"audio-track-controller\"), this.tracks = [], this.groupIds = null, this.tracksInGroup = [], this.trackId = -1, this.currentTrack = null, this.selectDefaultTrack = !0, this.registerListeners();\n  }\n  registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.LEVEL_LOADING, this.onLevelLoading, this), e.on(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.on(I.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), e.on(I.ERROR, this.onError, this);\n  }\n  unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.LEVEL_LOADING, this.onLevelLoading, this), e.off(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.off(I.AUDIO_TRACK_LOADED, this.onAudioTrackLoaded, this), e.off(I.ERROR, this.onError, this);\n  }\n  destroy() {\n    this.unregisterListeners(), this.tracks.length = 0, this.tracksInGroup.length = 0, this.currentTrack = null, super.destroy();\n  }\n  onManifestLoading() {\n    this.tracks = [], this.tracksInGroup = [], this.groupIds = null, this.currentTrack = null, this.trackId = -1, this.selectDefaultTrack = !0;\n  }\n  onManifestParsed(e, t) {\n    this.tracks = t.audioTracks || [];\n  }\n  onAudioTrackLoaded(e, t) {\n    const {\n      id: r,\n      groupId: n,\n      details: i\n    } = t, o = this.tracksInGroup[r];\n    if (!o || o.groupId !== n) {\n      this.warn(`Audio track with id:${r} and group:${n} not found in active group ${o == null ? void 0 : o.groupId}`);\n      return;\n    }\n    const a = o.details;\n    o.details = t.details, this.log(`Audio track ${r} \"${o.name}\" lang:${o.lang} group:${n} loaded [${i.startSN}-${i.endSN}]`), r === this.trackId && this.playlistLoaded(r, t, a);\n  }\n  onLevelLoading(e, t) {\n    this.switchLevel(t.level);\n  }\n  onLevelSwitching(e, t) {\n    this.switchLevel(t.level);\n  }\n  switchLevel(e) {\n    const t = this.hls.levels[e];\n    if (!t)\n      return;\n    const r = t.audioGroups || null, n = this.groupIds;\n    let i = this.currentTrack;\n    if (!r || (n == null ? void 0 : n.length) !== (r == null ? void 0 : r.length) || r != null && r.some((a) => (n == null ? void 0 : n.indexOf(a)) === -1)) {\n      this.groupIds = r, this.trackId = -1, this.currentTrack = null;\n      const a = this.tracks.filter((h) => !r || r.indexOf(h.groupId) !== -1);\n      if (a.length)\n        this.selectDefaultTrack && !a.some((h) => h.default) && (this.selectDefaultTrack = !1), a.forEach((h, f) => {\n          h.id = f;\n        });\n      else if (!i && !this.tracksInGroup.length)\n        return;\n      this.tracksInGroup = a;\n      const l = this.hls.config.audioPreference;\n      if (!i && l) {\n        const h = Wr(l, a, Us);\n        if (h > -1)\n          i = a[h];\n        else {\n          const f = Wr(l, this.tracks);\n          i = this.tracks[f];\n        }\n      }\n      let c = this.findTrackId(i);\n      c === -1 && i && (c = this.findTrackId(null));\n      const u = {\n        audioTracks: a\n      };\n      this.log(`Updating audio tracks, ${a.length} track(s) found in group(s): ${r == null ? void 0 : r.join(\",\")}`), this.hls.trigger(I.AUDIO_TRACKS_UPDATED, u);\n      const d = this.trackId;\n      if (c !== -1 && d === -1)\n        this.setAudioTrack(c);\n      else if (a.length && d === -1) {\n        var o;\n        const h = new Error(`No audio track selected for current audio group-ID(s): ${(o = this.groupIds) == null ? void 0 : o.join(\",\")} track count: ${a.length}`);\n        this.warn(h.message), this.hls.trigger(I.ERROR, {\n          type: ve.MEDIA_ERROR,\n          details: J.AUDIO_TRACK_LOAD_ERROR,\n          fatal: !0,\n          error: h\n        });\n      }\n    }\n  }\n  onError(e, t) {\n    t.fatal || !t.context || t.context.type === Ke.AUDIO_TRACK && t.context.id === this.trackId && (!this.groupIds || this.groupIds.indexOf(t.context.groupId) !== -1) && this.checkRetry(t);\n  }\n  get allAudioTracks() {\n    return this.tracks;\n  }\n  get audioTracks() {\n    return this.tracksInGroup;\n  }\n  get audioTrack() {\n    return this.trackId;\n  }\n  set audioTrack(e) {\n    this.selectDefaultTrack = !1, this.setAudioTrack(e);\n  }\n  setAudioOption(e) {\n    const t = this.hls;\n    if (t.config.audioPreference = e, e) {\n      const r = this.allAudioTracks;\n      if (this.selectDefaultTrack = !1, r.length) {\n        const n = this.currentTrack;\n        if (n && qs(e, n, Us))\n          return n;\n        const i = Wr(e, this.tracksInGroup, Us);\n        if (i > -1) {\n          const o = this.tracksInGroup[i];\n          return this.setAudioTrack(i), o;\n        } else if (n) {\n          let o = t.loadLevel;\n          o === -1 && (o = t.firstAutoLevel);\n          const a = mb(e, t.levels, r, o, Us);\n          if (a === -1)\n            return null;\n          t.nextLoadLevel = a;\n        }\n        if (e.channels || e.audioCodec) {\n          const o = Wr(e, r);\n          if (o > -1)\n            return r[o];\n        }\n      }\n    }\n    return null;\n  }\n  setAudioTrack(e) {\n    const t = this.tracksInGroup;\n    if (e < 0 || e >= t.length) {\n      this.warn(`Invalid audio track id: ${e}`);\n      return;\n    }\n    this.selectDefaultTrack = !1;\n    const r = this.currentTrack, n = t[e], i = n.details && !n.details.live;\n    if (e === this.trackId && n === r && i || (this.log(`Switching to audio-track ${e} \"${n.name}\" lang:${n.lang} group:${n.groupId} channels:${n.channels}`), this.trackId = e, this.currentTrack = n, this.hls.trigger(I.AUDIO_TRACK_SWITCHING, tt({}, n)), i))\n      return;\n    const o = this.switchParams(n.url, r == null ? void 0 : r.details, n.details);\n    this.loadPlaylist(o);\n  }\n  findTrackId(e) {\n    const t = this.tracksInGroup;\n    for (let r = 0; r < t.length; r++) {\n      const n = t[r];\n      if (!(this.selectDefaultTrack && !n.default) && (!e || qs(e, n, Us)))\n        return r;\n    }\n    if (e) {\n      const {\n        name: r,\n        lang: n,\n        assocLang: i,\n        characteristics: o,\n        audioCodec: a,\n        channels: l\n      } = e;\n      for (let c = 0; c < t.length; c++) {\n        const u = t[c];\n        if (qs({\n          name: r,\n          lang: n,\n          assocLang: i,\n          characteristics: o,\n          audioCodec: a,\n          channels: l\n        }, u, Us))\n          return c;\n      }\n      for (let c = 0; c < t.length; c++) {\n        const u = t[c];\n        if (Si(e.attrs, u.attrs, [\"LANGUAGE\", \"ASSOC-LANGUAGE\", \"CHARACTERISTICS\"]))\n          return c;\n      }\n      for (let c = 0; c < t.length; c++) {\n        const u = t[c];\n        if (Si(e.attrs, u.attrs, [\"LANGUAGE\"]))\n          return c;\n      }\n    }\n    return -1;\n  }\n  loadPlaylist(e) {\n    super.loadPlaylist();\n    const t = this.currentTrack;\n    this.shouldLoadPlaylist(t) && Qo(t.url, this.hls) && this.scheduleLoading(t, e);\n  }\n  loadingPlaylist(e, t) {\n    super.loadingPlaylist(e, t);\n    const r = e.id, n = e.groupId, i = this.getUrlWithDirectives(e.url, t), o = e.details, a = o == null ? void 0 : o.age;\n    this.log(`Loading audio-track ${r} \"${e.name}\" lang:${e.lang} group:${n}${(t == null ? void 0 : t.msn) !== void 0 ? \" at sn \" + t.msn + \" part \" + t.part : \"\"}${a && o.live ? \" age \" + a.toFixed(1) + (o.type && \" \" + o.type || \"\") : \"\"} ${i}`), this.hls.trigger(I.AUDIO_TRACK_LOADING, {\n      url: i,\n      id: r,\n      groupId: n,\n      deliveryDirectives: t || null,\n      track: e\n    });\n  }\n}\nclass o2 {\n  constructor(e) {\n    this.tracks = void 0, this.queues = {\n      video: [],\n      audio: [],\n      audiovideo: []\n    }, this.tracks = e;\n  }\n  destroy() {\n    this.tracks = this.queues = null;\n  }\n  append(e, t, r) {\n    if (this.queues === null || this.tracks === null)\n      return;\n    const n = this.queues[t];\n    n.push(e), n.length === 1 && !r && this.executeNext(t);\n  }\n  appendBlocker(e) {\n    return new Promise((t) => {\n      const r = {\n        label: \"async-blocker\",\n        execute: t,\n        onStart: () => {\n        },\n        onComplete: () => {\n        },\n        onError: () => {\n        }\n      };\n      this.append(r, e);\n    });\n  }\n  prependBlocker(e) {\n    return new Promise((t) => {\n      if (this.queues) {\n        const r = {\n          label: \"async-blocker-prepend\",\n          execute: t,\n          onStart: () => {\n          },\n          onComplete: () => {\n          },\n          onError: () => {\n          }\n        };\n        this.queues[e].unshift(r);\n      }\n    });\n  }\n  removeBlockers() {\n    this.queues !== null && [this.queues.video, this.queues.audio, this.queues.audiovideo].forEach((e) => {\n      var t;\n      const r = (t = e[0]) == null ? void 0 : t.label;\n      (r === \"async-blocker\" || r === \"async-blocker-prepend\") && (e[0].execute(), e.splice(0, 1));\n    });\n  }\n  unblockAudio(e) {\n    if (this.queues === null)\n      return;\n    this.queues.audio[0] === e && this.shiftAndExecuteNext(\"audio\");\n  }\n  executeNext(e) {\n    if (this.queues === null || this.tracks === null)\n      return;\n    const t = this.queues[e];\n    if (t.length) {\n      const n = t[0];\n      try {\n        n.execute();\n      } catch (i) {\n        var r;\n        if (n.onError(i), this.queues === null || this.tracks === null)\n          return;\n        const o = (r = this.tracks[e]) == null ? void 0 : r.buffer;\n        o != null && o.updating || this.shiftAndExecuteNext(e);\n      }\n    }\n  }\n  shiftAndExecuteNext(e) {\n    this.queues !== null && (this.queues[e].shift(), this.executeNext(e));\n  }\n  current(e) {\n    var t;\n    return ((t = this.queues) == null ? void 0 : t[e][0]) || null;\n  }\n  toString() {\n    const {\n      queues: e,\n      tracks: t\n    } = this;\n    return e === null || t === null ? \"<destroyed>\" : `\n${this.list(\"video\")}\n${this.list(\"audio\")}\n${this.list(\"audiovideo\")}}`;\n  }\n  list(e) {\n    var t, r;\n    return (t = this.queues) != null && t[e] || (r = this.tracks) != null && r[e] ? `${e}: (${this.listSbInfo(e)}) ${this.listOps(e)}` : \"\";\n  }\n  listSbInfo(e) {\n    var t;\n    const r = (t = this.tracks) == null ? void 0 : t[e], n = r == null ? void 0 : r.buffer;\n    return n ? `SourceBuffer${n.updating ? \" updating\" : \"\"}${r.ended ? \" ended\" : \"\"}${r.ending ? \" ending\" : \"\"}` : \"none\";\n  }\n  listOps(e) {\n    var t;\n    return ((t = this.queues) == null ? void 0 : t[e].map((r) => r.label).join(\", \")) || \"\";\n  }\n}\nconst Kh = /(avc[1234]|hvc1|hev1|dvh[1e]|vp09|av01)(?:\\.[^.,]+)+/, Ip = \"HlsJsTrackRemovedError\";\nclass a2 extends Error {\n  constructor(e) {\n    super(e), this.name = Ip;\n  }\n}\nclass l2 extends Lr {\n  constructor(e, t) {\n    super(\"buffer-controller\", e.logger), this.hls = void 0, this.fragmentTracker = void 0, this.details = null, this._objectUrl = null, this.operationQueue = null, this.bufferCodecEventsTotal = 0, this.media = null, this.mediaSource = null, this.lastMpegAudioChunk = null, this.blockedAudioAppend = null, this.lastVideoAppendEnd = 0, this.appendSource = void 0, this.transferData = void 0, this.overrides = void 0, this.appendErrors = {\n      audio: 0,\n      video: 0,\n      audiovideo: 0\n    }, this.tracks = {}, this.sourceBuffers = [[null, null], [null, null]], this._onEndStreaming = (r) => {\n      var n;\n      this.hls && ((n = this.mediaSource) == null ? void 0 : n.readyState) === \"open\" && this.hls.pauseBuffering();\n    }, this._onStartStreaming = (r) => {\n      this.hls && this.hls.resumeBuffering();\n    }, this._onMediaSourceOpen = (r) => {\n      const {\n        media: n,\n        mediaSource: i\n      } = this;\n      r && this.log(\"Media source opened\"), !(!n || !i) && (i.removeEventListener(\"sourceopen\", this._onMediaSourceOpen), n.removeEventListener(\"emptied\", this._onMediaEmptied), this.updateDuration(), this.hls.trigger(I.MEDIA_ATTACHED, {\n        media: n,\n        mediaSource: i\n      }), this.mediaSource !== null && this.checkPendingTracks());\n    }, this._onMediaSourceClose = () => {\n      this.log(\"Media source closed\");\n    }, this._onMediaSourceEnded = () => {\n      this.log(\"Media source ended\");\n    }, this._onMediaEmptied = () => {\n      const {\n        mediaSrc: r,\n        _objectUrl: n\n      } = this;\n      r !== n && this.error(`Media element src was set while attaching MediaSource (${n} > ${r})`);\n    }, this.hls = e, this.fragmentTracker = t, this.appendSource = CS(Ms(e.config.preferManagedMediaSource)), this.initTracks(), this.registerListeners();\n  }\n  hasSourceTypes() {\n    return Object.keys(this.tracks).length > 0;\n  }\n  destroy() {\n    this.unregisterListeners(), this.details = null, this.lastMpegAudioChunk = this.blockedAudioAppend = null, this.transferData = this.overrides = void 0, this.operationQueue && (this.operationQueue.destroy(), this.operationQueue = null), this.hls = this.fragmentTracker = null, this._onMediaSourceOpen = this._onMediaSourceClose = null, this._onMediaSourceEnded = null, this._onStartStreaming = this._onEndStreaming = null;\n  }\n  registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.BUFFER_RESET, this.onBufferReset, this), e.on(I.BUFFER_APPENDING, this.onBufferAppending, this), e.on(I.BUFFER_CODECS, this.onBufferCodecs, this), e.on(I.BUFFER_EOS, this.onBufferEos, this), e.on(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.on(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.on(I.FRAG_PARSED, this.onFragParsed, this), e.on(I.FRAG_CHANGED, this.onFragChanged, this), e.on(I.ERROR, this.onError, this);\n  }\n  unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.BUFFER_RESET, this.onBufferReset, this), e.off(I.BUFFER_APPENDING, this.onBufferAppending, this), e.off(I.BUFFER_CODECS, this.onBufferCodecs, this), e.off(I.BUFFER_EOS, this.onBufferEos, this), e.off(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.off(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.off(I.FRAG_PARSED, this.onFragParsed, this), e.off(I.FRAG_CHANGED, this.onFragChanged, this), e.off(I.ERROR, this.onError, this);\n  }\n  transferMedia() {\n    const {\n      media: e,\n      mediaSource: t\n    } = this;\n    if (!e)\n      return null;\n    const r = {};\n    if (this.operationQueue) {\n      const i = this.isUpdating();\n      i || this.operationQueue.removeBlockers();\n      const o = this.isQueued();\n      (i || o) && this.warn(`Transfering MediaSource with${o ? \" operations in queue\" : \"\"}${i ? \" updating SourceBuffer(s)\" : \"\"} ${this.operationQueue}`), this.operationQueue.destroy();\n    }\n    const n = this.transferData;\n    return !this.sourceBufferCount && n && n.mediaSource === t ? nt(r, n.tracks) : this.sourceBuffers.forEach((i) => {\n      const [o] = i;\n      o && (r[o] = nt({}, this.tracks[o]), this.removeBuffer(o)), i[0] = i[1] = null;\n    }), {\n      media: e,\n      mediaSource: t,\n      tracks: r\n    };\n  }\n  initTracks() {\n    const e = {};\n    this.sourceBuffers = [[null, null], [null, null]], this.tracks = e, this.resetQueue(), this.resetAppendErrors(), this.lastMpegAudioChunk = this.blockedAudioAppend = null, this.lastVideoAppendEnd = 0;\n  }\n  onManifestLoading() {\n    this.bufferCodecEventsTotal = 0, this.details = null;\n  }\n  onManifestParsed(e, t) {\n    var r;\n    let n = 2;\n    (t.audio && !t.video || !t.altAudio) && (n = 1), this.bufferCodecEventsTotal = n, this.log(`${n} bufferCodec event(s) expected.`), (r = this.transferData) != null && r.mediaSource && this.sourceBufferCount && n && this.bufferCreated();\n  }\n  onMediaAttaching(e, t) {\n    const r = this.media = t.media;\n    this.transferData = this.overrides = void 0;\n    const n = Ms(this.appendSource);\n    if (n) {\n      const i = !!t.mediaSource;\n      (i || t.overrides) && (this.transferData = t, this.overrides = t.overrides);\n      const o = this.mediaSource = t.mediaSource || new n();\n      if (this.assignMediaSource(o), i)\n        this._objectUrl = r.src, this.attachTransferred();\n      else {\n        const a = this._objectUrl = self.URL.createObjectURL(o);\n        if (this.appendSource)\n          try {\n            r.removeAttribute(\"src\");\n            const l = self.ManagedMediaSource;\n            r.disableRemotePlayback = r.disableRemotePlayback || l && o instanceof l, Hh(r), c2(r, a), r.load();\n          } catch {\n            r.src = a;\n          }\n        else\n          r.src = a;\n      }\n      r.addEventListener(\"emptied\", this._onMediaEmptied);\n    }\n  }\n  assignMediaSource(e) {\n    var t, r;\n    this.log(`${((t = this.transferData) == null ? void 0 : t.mediaSource) === e ? \"transferred\" : \"created\"} media source: ${(r = e.constructor) == null ? void 0 : r.name}`), e.addEventListener(\"sourceopen\", this._onMediaSourceOpen), e.addEventListener(\"sourceended\", this._onMediaSourceEnded), e.addEventListener(\"sourceclose\", this._onMediaSourceClose), this.appendSource && (e.addEventListener(\"startstreaming\", this._onStartStreaming), e.addEventListener(\"endstreaming\", this._onEndStreaming));\n  }\n  attachTransferred() {\n    const e = this.media, t = this.transferData;\n    if (!t || !e)\n      return;\n    const r = this.tracks, n = t.tracks, i = n ? Object.keys(n) : null, o = i ? i.length : 0, a = () => {\n      Promise.resolve().then(() => {\n        this.media && this.mediaSourceOpenOrEnded && this._onMediaSourceOpen();\n      });\n    };\n    if (n && i && o) {\n      if (!this.tracksReady) {\n        this.hls.config.startFragPrefetch = !0, this.log(\"attachTransferred: waiting for SourceBuffer track info\");\n        return;\n      }\n      if (this.log(`attachTransferred: (bufferCodecEventsTotal ${this.bufferCodecEventsTotal})\nrequired tracks: ${at(r, (l, c) => l === \"initSegment\" ? void 0 : c)};\ntransfer tracks: ${at(n, (l, c) => l === \"initSegment\" ? void 0 : c)}}`), !Ag(n, r)) {\n        t.mediaSource = null, t.tracks = void 0;\n        const l = e.currentTime, c = this.details, u = Math.max(l, (c == null ? void 0 : c.fragments[0].start) || 0);\n        if (u - l > 1) {\n          this.log(`attachTransferred: waiting for playback to reach new tracks start time ${l} -> ${u}`);\n          return;\n        }\n        this.warn(`attachTransferred: resetting MediaSource for incompatible tracks (\"${Object.keys(n)}\"->\"${Object.keys(r)}\") start time: ${u} currentTime: ${l}`), this.onMediaDetaching(I.MEDIA_DETACHING, {}), this.onMediaAttaching(I.MEDIA_ATTACHING, t), e.currentTime = u;\n        return;\n      }\n      this.transferData = void 0, i.forEach((l) => {\n        const c = l, u = n[c];\n        if (u) {\n          const d = u.buffer;\n          if (d) {\n            const h = this.fragmentTracker, f = u.id;\n            if (h.hasFragments(f) || h.hasParts(f)) {\n              const E = Ce.getBuffered(d);\n              h.detectEvictedFragments(c, E, f, null, !0);\n            }\n            const p = Sl(c), y = [c, d];\n            this.sourceBuffers[p] = y, d.updating && this.operationQueue && this.operationQueue.prependBlocker(c), this.trackSourceBuffer(c, u);\n          }\n        }\n      }), a(), this.bufferCreated();\n    } else\n      this.log(\"attachTransferred: MediaSource w/o SourceBuffers\"), a();\n  }\n  get mediaSourceOpenOrEnded() {\n    var e;\n    const t = (e = this.mediaSource) == null ? void 0 : e.readyState;\n    return t === \"open\" || t === \"ended\";\n  }\n  onMediaDetaching(e, t) {\n    const r = !!t.transferMedia;\n    this.transferData = this.overrides = void 0;\n    const {\n      media: n,\n      mediaSource: i,\n      _objectUrl: o\n    } = this;\n    if (i) {\n      if (this.log(`media source ${r ? \"transferring\" : \"detaching\"}`), r)\n        this.sourceBuffers.forEach(([a]) => {\n          a && this.removeBuffer(a);\n        }), this.resetQueue();\n      else {\n        if (this.mediaSourceOpenOrEnded) {\n          const a = i.readyState === \"open\";\n          try {\n            const l = i.sourceBuffers;\n            for (let c = l.length; c--; )\n              a && l[c].abort(), i.removeSourceBuffer(l[c]);\n            a && i.endOfStream();\n          } catch (l) {\n            this.warn(`onMediaDetaching: ${l.message} while calling endOfStream`);\n          }\n        }\n        this.sourceBufferCount && this.onBufferReset();\n      }\n      i.removeEventListener(\"sourceopen\", this._onMediaSourceOpen), i.removeEventListener(\"sourceended\", this._onMediaSourceEnded), i.removeEventListener(\"sourceclose\", this._onMediaSourceClose), this.appendSource && (i.removeEventListener(\"startstreaming\", this._onStartStreaming), i.removeEventListener(\"endstreaming\", this._onEndStreaming)), this.mediaSource = null, this._objectUrl = null;\n    }\n    n && (n.removeEventListener(\"emptied\", this._onMediaEmptied), r || (o && self.URL.revokeObjectURL(o), this.mediaSrc === o ? (n.removeAttribute(\"src\"), this.appendSource && Hh(n), n.load()) : this.warn(\"media|source.src was changed by a third party - skip cleanup\")), this.media = null), this.hls.trigger(I.MEDIA_DETACHED, t);\n  }\n  onBufferReset() {\n    this.sourceBuffers.forEach(([e]) => {\n      e && this.resetBuffer(e);\n    }), this.initTracks();\n  }\n  resetBuffer(e) {\n    var t;\n    const r = (t = this.tracks[e]) == null ? void 0 : t.buffer;\n    if (this.removeBuffer(e), r)\n      try {\n        var n;\n        (n = this.mediaSource) != null && n.sourceBuffers.length && this.mediaSource.removeSourceBuffer(r);\n      } catch (i) {\n        this.warn(`onBufferReset ${e}`, i);\n      }\n    delete this.tracks[e];\n  }\n  removeBuffer(e) {\n    this.removeBufferListeners(e), this.sourceBuffers[Sl(e)] = [null, null];\n    const t = this.tracks[e];\n    t && (t.buffer = void 0);\n  }\n  resetQueue() {\n    this.operationQueue && this.operationQueue.destroy(), this.operationQueue = new o2(this.tracks);\n  }\n  onBufferCodecs(e, t) {\n    var r;\n    const n = this.tracks, i = Object.keys(t);\n    this.log(`BUFFER_CODECS: \"${i}\" (current SB count ${this.sourceBufferCount})`);\n    const o = \"audiovideo\" in t && (n.audio || n.video) || n.audiovideo && (\"audio\" in t || \"video\" in t), a = !o && this.sourceBufferCount && this.media && i.some((l) => !n[l]);\n    if (o || a) {\n      this.warn(`Unsupported transition between \"${Object.keys(n)}\" and \"${i}\" SourceBuffers`);\n      return;\n    }\n    i.forEach((l) => {\n      var c, u;\n      const d = t[l], {\n        id: h,\n        codec: f,\n        levelCodec: p,\n        container: y,\n        metadata: E,\n        supplemental: b\n      } = d;\n      let R = n[l];\n      const A = (c = this.transferData) == null || (c = c.tracks) == null ? void 0 : c[l], F = A != null && A.buffer ? A : R, M = (F == null ? void 0 : F.pendingCodec) || (F == null ? void 0 : F.codec), H = F == null ? void 0 : F.levelCodec;\n      R || (R = n[l] = {\n        buffer: void 0,\n        listeners: [],\n        codec: f,\n        supplemental: b,\n        container: y,\n        levelCodec: p,\n        metadata: E,\n        id: h\n      });\n      const K = fo(M, H), j = K == null ? void 0 : K.replace(Kh, \"$1\");\n      let C = fo(f, p);\n      const k = (u = C) == null ? void 0 : u.replace(Kh, \"$1\");\n      C && K && j !== k && (l.slice(0, 5) === \"audio\" && (C = Xo(C, this.appendSource)), this.log(`switching codec ${M} to ${C}`), C !== (R.pendingCodec || R.codec) && (R.pendingCodec = C), R.container = y, this.appendChangeType(l, y, C));\n    }), (this.tracksReady || this.sourceBufferCount) && (t.tracks = this.sourceBufferTracks), !this.sourceBufferCount && (this.bufferCodecEventsTotal > 1 && !this.tracks.video && !t.video && ((r = t.audio) == null ? void 0 : r.id) === \"main\" && (this.log(\"Main audio-only\"), this.bufferCodecEventsTotal = 1), this.mediaSourceOpenOrEnded && this.checkPendingTracks());\n  }\n  get sourceBufferTracks() {\n    return Object.keys(this.tracks).reduce((e, t) => {\n      const r = this.tracks[t];\n      return e[t] = {\n        id: r.id,\n        container: r.container,\n        codec: r.codec,\n        levelCodec: r.levelCodec\n      }, e;\n    }, {});\n  }\n  appendChangeType(e, t, r) {\n    const n = `${t};codecs=${r}`, i = {\n      label: `change-type=${n}`,\n      execute: () => {\n        const o = this.tracks[e];\n        if (o) {\n          const a = o.buffer;\n          a != null && a.changeType && (this.log(`changing ${e} sourceBuffer type to ${n}`), a.changeType(n), o.codec = r, o.container = t);\n        }\n        this.shiftAndExecuteNext(e);\n      },\n      onStart: () => {\n      },\n      onComplete: () => {\n      },\n      onError: (o) => {\n        this.warn(`Failed to change ${e} SourceBuffer type`, o);\n      }\n    };\n    this.append(i, e, this.isPending(this.tracks[e]));\n  }\n  blockAudio(e) {\n    var t;\n    const r = e.start, n = r + e.duration * 0.05;\n    if (((t = this.fragmentTracker.getAppendedFrag(r, pe.MAIN)) == null ? void 0 : t.gap) === !0)\n      return;\n    const o = {\n      label: \"block-audio\",\n      execute: () => {\n        var a;\n        const l = this.tracks.video;\n        (this.lastVideoAppendEnd > n || l != null && l.buffer && Ce.isBuffered(l.buffer, n) || ((a = this.fragmentTracker.getAppendedFrag(n, pe.MAIN)) == null ? void 0 : a.gap) === !0) && (this.blockedAudioAppend = null, this.shiftAndExecuteNext(\"audio\"));\n      },\n      onStart: () => {\n      },\n      onComplete: () => {\n      },\n      onError: (a) => {\n        this.warn(\"Error executing block-audio operation\", a);\n      }\n    };\n    this.blockedAudioAppend = {\n      op: o,\n      frag: e\n    }, this.append(o, \"audio\", !0);\n  }\n  unblockAudio() {\n    const {\n      blockedAudioAppend: e,\n      operationQueue: t\n    } = this;\n    e && t && (this.blockedAudioAppend = null, t.unblockAudio(e.op));\n  }\n  onBufferAppending(e, t) {\n    const {\n      tracks: r\n    } = this, {\n      data: n,\n      type: i,\n      parent: o,\n      frag: a,\n      part: l,\n      chunkMeta: c,\n      offset: u\n    } = t, d = c.buffering[i], {\n      sn: h,\n      cc: f\n    } = a, p = self.performance.now();\n    d.start = p;\n    const y = a.stats.buffering, E = l ? l.stats.buffering : null;\n    y.start === 0 && (y.start = p), E && E.start === 0 && (E.start = p);\n    const b = r.audio;\n    let R = !1;\n    i === \"audio\" && (b == null ? void 0 : b.container) === \"audio/mpeg\" && (R = !this.lastMpegAudioChunk || c.id === 1 || this.lastMpegAudioChunk.sn !== c.sn, this.lastMpegAudioChunk = c);\n    const A = r.video, F = A == null ? void 0 : A.buffer;\n    if (F && h !== \"initSegment\") {\n      const K = l || a, j = this.blockedAudioAppend;\n      if (i === \"audio\" && o !== \"main\" && !this.blockedAudioAppend && !(A.ending || A.ended)) {\n        const k = K.start + K.duration * 0.05, $ = F.buffered, W = this.currentOp(\"video\");\n        !$.length && !W ? this.blockAudio(K) : !W && !Ce.isBuffered(F, k) && this.lastVideoAppendEnd < k && this.blockAudio(K);\n      } else if (i === \"video\") {\n        const C = K.end;\n        if (j) {\n          const k = j.frag.start;\n          (C > k || C < this.lastVideoAppendEnd || Ce.isBuffered(F, k)) && this.unblockAudio();\n        }\n        this.lastVideoAppendEnd = C;\n      }\n    }\n    const M = (l || a).start, H = {\n      label: `append-${i}`,\n      execute: () => {\n        var K;\n        d.executeStart = self.performance.now();\n        const j = (K = this.tracks[i]) == null ? void 0 : K.buffer;\n        j && (R ? this.updateTimestampOffset(j, M, 0.1, i, h, f) : u !== void 0 && ue(u) && this.updateTimestampOffset(j, u, 1e-6, i, h, f)), this.appendExecutor(n, i);\n      },\n      onStart: () => {\n      },\n      onComplete: () => {\n        const K = self.performance.now();\n        d.executeEnd = d.end = K, y.first === 0 && (y.first = K), E && E.first === 0 && (E.first = K);\n        const j = {};\n        this.sourceBuffers.forEach(([C, k]) => {\n          C && (j[C] = Ce.getBuffered(k));\n        }), this.appendErrors[i] = 0, i === \"audio\" || i === \"video\" ? this.appendErrors.audiovideo = 0 : (this.appendErrors.audio = 0, this.appendErrors.video = 0), this.hls.trigger(I.BUFFER_APPENDED, {\n          type: i,\n          frag: a,\n          part: l,\n          chunkMeta: c,\n          parent: a.type,\n          timeRanges: j\n        });\n      },\n      onError: (K) => {\n        var j;\n        const C = {\n          type: ve.MEDIA_ERROR,\n          parent: a.type,\n          details: J.BUFFER_APPEND_ERROR,\n          sourceBufferName: i,\n          frag: a,\n          part: l,\n          chunkMeta: c,\n          error: K,\n          err: K,\n          fatal: !1\n        }, k = (j = this.media) == null ? void 0 : j.error;\n        if (K.code === DOMException.QUOTA_EXCEEDED_ERR || K.name == \"QuotaExceededError\" || \"quota\" in K)\n          C.details = J.BUFFER_FULL_ERROR;\n        else if (K.code === DOMException.INVALID_STATE_ERR && this.mediaSourceOpenOrEnded && !k)\n          C.errorAction = An(!0);\n        else if (K.name === Ip && this.sourceBufferCount === 0)\n          C.errorAction = An(!0);\n        else {\n          const $ = ++this.appendErrors[i];\n          this.warn(`Failed ${$}/${this.hls.config.appendErrorMaxRetry} times to append segment in \"${i}\" sourceBuffer (${k || \"no media error\"})`), ($ >= this.hls.config.appendErrorMaxRetry || k) && (C.fatal = !0);\n        }\n        this.hls.trigger(I.ERROR, C);\n      }\n    };\n    this.log(`queuing \"${i}\" append sn: ${h}${l ? \" p: \" + l.index : \"\"} of ${a.type === pe.MAIN ? \"level\" : \"track\"} ${a.level} cc: ${f}`), this.append(H, i, this.isPending(this.tracks[i]));\n  }\n  getFlushOp(e, t, r) {\n    return this.log(`queuing \"${e}\" remove ${t}-${r}`), {\n      label: \"remove\",\n      execute: () => {\n        this.removeExecutor(e, t, r);\n      },\n      onStart: () => {\n      },\n      onComplete: () => {\n        this.hls.trigger(I.BUFFER_FLUSHED, {\n          type: e\n        });\n      },\n      onError: (n) => {\n        this.warn(`Failed to remove ${t}-${r} from \"${e}\" SourceBuffer`, n);\n      }\n    };\n  }\n  onBufferFlushing(e, t) {\n    const {\n      type: r,\n      startOffset: n,\n      endOffset: i\n    } = t;\n    r ? this.append(this.getFlushOp(r, n, i), r) : this.sourceBuffers.forEach(([o]) => {\n      o && this.append(this.getFlushOp(o, n, i), o);\n    });\n  }\n  onFragParsed(e, t) {\n    const {\n      frag: r,\n      part: n\n    } = t, i = [], o = n ? n.elementaryStreams : r.elementaryStreams;\n    o[ot.AUDIOVIDEO] ? i.push(\"audiovideo\") : (o[ot.AUDIO] && i.push(\"audio\"), o[ot.VIDEO] && i.push(\"video\"));\n    const a = () => {\n      const l = self.performance.now();\n      r.stats.buffering.end = l, n && (n.stats.buffering.end = l);\n      const c = n ? n.stats : r.stats;\n      this.hls.trigger(I.FRAG_BUFFERED, {\n        frag: r,\n        part: n,\n        stats: c,\n        id: r.type\n      });\n    };\n    i.length === 0 && this.warn(`Fragments must have at least one ElementaryStreamType set. type: ${r.type} level: ${r.level} sn: ${r.sn}`), this.blockBuffers(a, i).catch((l) => {\n      this.warn(`Fragment buffered callback ${l}`), this.stepOperationQueue(this.sourceBufferTypes);\n    });\n  }\n  onFragChanged(e, t) {\n    this.trimBuffers();\n  }\n  get bufferedToEnd() {\n    return this.sourceBufferCount > 0 && !this.sourceBuffers.some(([e]) => {\n      if (e) {\n        const t = this.tracks[e];\n        if (t)\n          return !t.ended || t.ending;\n      }\n      return !1;\n    });\n  }\n  // on BUFFER_EOS mark matching sourcebuffer(s) as \"ending\" and \"ended\" and queue endOfStream after remaining operations(s)\n  // an undefined data.type will mark all buffers as EOS.\n  onBufferEos(e, t) {\n    var r;\n    this.sourceBuffers.forEach(([o]) => {\n      if (o) {\n        const a = this.tracks[o];\n        (!t.type || t.type === o) && (a.ending = !0, a.ended || (a.ended = !0, this.log(`${o} buffer reached EOS`)));\n      }\n    });\n    const n = ((r = this.overrides) == null ? void 0 : r.endOfStream) !== !1;\n    this.sourceBufferCount > 0 && !this.sourceBuffers.some(([o]) => {\n      var a;\n      return o && !((a = this.tracks[o]) != null && a.ended);\n    }) ? n ? (this.log(\"Queueing EOS\"), this.blockUntilOpen(() => {\n      this.tracksEnded();\n      const {\n        mediaSource: o\n      } = this;\n      if (!o || o.readyState !== \"open\") {\n        o && this.log(`Could not call mediaSource.endOfStream(). mediaSource.readyState: ${o.readyState}`);\n        return;\n      }\n      this.log(\"Calling mediaSource.endOfStream()\"), o.endOfStream(), this.hls.trigger(I.BUFFERED_TO_END, void 0);\n    })) : (this.tracksEnded(), this.hls.trigger(I.BUFFERED_TO_END, void 0)) : t.type === \"video\" && this.unblockAudio();\n  }\n  tracksEnded() {\n    this.sourceBuffers.forEach(([e]) => {\n      if (e !== null) {\n        const t = this.tracks[e];\n        t && (t.ending = !1);\n      }\n    });\n  }\n  onLevelUpdated(e, {\n    details: t\n  }) {\n    t.fragments.length && (this.details = t, this.updateDuration());\n  }\n  updateDuration() {\n    this.blockUntilOpen(() => {\n      const e = this.getDurationAndRange();\n      e && this.updateMediaSource(e);\n    });\n  }\n  onError(e, t) {\n    if (t.details === J.BUFFER_APPEND_ERROR && t.frag) {\n      var r;\n      const n = (r = t.errorAction) == null ? void 0 : r.nextAutoLevel;\n      ue(n) && n !== t.frag.level && this.resetAppendErrors();\n    }\n  }\n  resetAppendErrors() {\n    this.appendErrors = {\n      audio: 0,\n      video: 0,\n      audiovideo: 0\n    };\n  }\n  trimBuffers() {\n    const {\n      hls: e,\n      details: t,\n      media: r\n    } = this;\n    if (!r || t === null || !this.sourceBufferCount)\n      return;\n    const n = e.config, i = r.currentTime, o = t.levelTargetDuration, a = t.live && n.liveBackBufferLength !== null ? n.liveBackBufferLength : n.backBufferLength;\n    if (ue(a) && a >= 0) {\n      const c = Math.max(a, o), u = Math.floor(i / o) * o - c;\n      this.flushBackBuffer(i, o, u);\n    }\n    const l = n.frontBufferFlushThreshold;\n    if (ue(l) && l > 0) {\n      const c = Math.max(n.maxBufferLength, l), u = Math.max(c, o), d = Math.floor(i / o) * o + u;\n      this.flushFrontBuffer(i, o, d);\n    }\n  }\n  flushBackBuffer(e, t, r) {\n    this.sourceBuffers.forEach(([n, i]) => {\n      if (i) {\n        const a = Ce.getBuffered(i);\n        if (a.length > 0 && r > a.start(0)) {\n          var o;\n          this.hls.trigger(I.BACK_BUFFER_REACHED, {\n            bufferEnd: r\n          });\n          const l = this.tracks[n];\n          if ((o = this.details) != null && o.live)\n            this.hls.trigger(I.LIVE_BACK_BUFFER_REACHED, {\n              bufferEnd: r\n            });\n          else if (l != null && l.ended) {\n            this.log(`Cannot flush ${n} back buffer while SourceBuffer is in ended state`);\n            return;\n          }\n          this.hls.trigger(I.BUFFER_FLUSHING, {\n            startOffset: 0,\n            endOffset: r,\n            type: n\n          });\n        }\n      }\n    });\n  }\n  flushFrontBuffer(e, t, r) {\n    this.sourceBuffers.forEach(([n, i]) => {\n      if (i) {\n        const o = Ce.getBuffered(i), a = o.length;\n        if (a < 2)\n          return;\n        const l = o.start(a - 1), c = o.end(a - 1);\n        if (r > l || e >= l && e <= c)\n          return;\n        this.hls.trigger(I.BUFFER_FLUSHING, {\n          startOffset: l,\n          endOffset: 1 / 0,\n          type: n\n        });\n      }\n    });\n  }\n  /**\n   * Update Media Source duration to current level duration or override to Infinity if configuration parameter\n   * 'liveDurationInfinity` is set to `true`\n   * More details: https://github.com/video-dev/hls.js/issues/355\n   */\n  getDurationAndRange() {\n    var e;\n    const {\n      details: t,\n      mediaSource: r\n    } = this;\n    if (!t || !this.media || (r == null ? void 0 : r.readyState) !== \"open\")\n      return null;\n    const n = t.edge;\n    if (t.live && this.hls.config.liveDurationInfinity) {\n      if (t.fragments.length && r.setLiveSeekableRange) {\n        const c = Math.max(0, t.fragmentStart), u = Math.max(c, n);\n        return {\n          duration: 1 / 0,\n          start: c,\n          end: u\n        };\n      }\n      return {\n        duration: 1 / 0\n      };\n    }\n    const i = (e = this.overrides) == null ? void 0 : e.duration;\n    if (i)\n      return ue(i) ? {\n        duration: i\n      } : null;\n    const o = this.media.duration, a = ue(r.duration) ? r.duration : 0;\n    return n > a && n > o || !ue(o) ? {\n      duration: n\n    } : null;\n  }\n  updateMediaSource({\n    duration: e,\n    start: t,\n    end: r\n  }) {\n    const n = this.mediaSource;\n    !this.media || !n || n.readyState !== \"open\" || (n.duration !== e && (ue(e) && this.log(`Updating MediaSource duration to ${e.toFixed(3)}`), n.duration = e), t !== void 0 && r !== void 0 && (this.log(`MediaSource duration is set to ${n.duration}. Setting seekable range to ${t}-${r}.`), n.setLiveSeekableRange(t, r)));\n  }\n  get tracksReady() {\n    const e = this.pendingTrackCount;\n    return e > 0 && (e >= this.bufferCodecEventsTotal || this.isPending(this.tracks.audiovideo));\n  }\n  checkPendingTracks() {\n    const {\n      bufferCodecEventsTotal: e,\n      pendingTrackCount: t,\n      tracks: r\n    } = this;\n    if (this.log(`checkPendingTracks (pending: ${t} codec events expected: ${e}) ${at(r)}`), this.tracksReady) {\n      var n;\n      const i = (n = this.transferData) == null ? void 0 : n.tracks;\n      i && Object.keys(i).length ? this.attachTransferred() : this.createSourceBuffers();\n    }\n  }\n  bufferCreated() {\n    if (this.sourceBufferCount) {\n      const e = {};\n      this.sourceBuffers.forEach(([t, r]) => {\n        if (t) {\n          const n = this.tracks[t];\n          e[t] = {\n            buffer: r,\n            container: n.container,\n            codec: n.codec,\n            supplemental: n.supplemental,\n            levelCodec: n.levelCodec,\n            id: n.id,\n            metadata: n.metadata\n          };\n        }\n      }), this.hls.trigger(I.BUFFER_CREATED, {\n        tracks: e\n      }), this.log(`SourceBuffers created. Running queue: ${this.operationQueue}`), this.sourceBuffers.forEach(([t]) => {\n        this.executeNext(t);\n      });\n    } else {\n      const e = new Error(\"could not create source buffer for media codec(s)\");\n      this.hls.trigger(I.ERROR, {\n        type: ve.MEDIA_ERROR,\n        details: J.BUFFER_INCOMPATIBLE_CODECS_ERROR,\n        fatal: !0,\n        error: e,\n        reason: e.message\n      });\n    }\n  }\n  createSourceBuffers() {\n    const {\n      tracks: e,\n      sourceBuffers: t,\n      mediaSource: r\n    } = this;\n    if (!r)\n      throw new Error(\"createSourceBuffers called when mediaSource was null\");\n    for (const i in e) {\n      const o = i, a = e[o];\n      if (this.isPending(a)) {\n        const l = this.getTrackCodec(a, o), c = `${a.container};codecs=${l}`;\n        a.codec = l, this.log(`creating sourceBuffer(${c})${this.currentOp(o) ? \" Queued\" : \"\"} ${at(a)}`);\n        try {\n          const u = r.addSourceBuffer(c), d = Sl(o), h = [o, u];\n          t[d] = h, a.buffer = u;\n        } catch (u) {\n          var n;\n          this.error(`error while trying to add sourceBuffer: ${u.message}`), this.shiftAndExecuteNext(o), (n = this.operationQueue) == null || n.removeBlockers(), delete this.tracks[o], this.hls.trigger(I.ERROR, {\n            type: ve.MEDIA_ERROR,\n            details: J.BUFFER_ADD_CODEC_ERROR,\n            fatal: !1,\n            error: u,\n            sourceBufferName: o,\n            mimeType: c,\n            parent: a.id\n          });\n          return;\n        }\n        this.trackSourceBuffer(o, a);\n      }\n    }\n    this.bufferCreated();\n  }\n  getTrackCodec(e, t) {\n    const r = e.supplemental;\n    let n = e.codec;\n    r && (t === \"video\" || t === \"audiovideo\") && gi(r, \"video\") && (n = XS(n, r));\n    const i = fo(n, e.levelCodec);\n    return i ? t.slice(0, 5) === \"audio\" ? Xo(i, this.appendSource) : i : \"\";\n  }\n  trackSourceBuffer(e, t) {\n    const r = t.buffer;\n    if (!r)\n      return;\n    const n = this.getTrackCodec(t, e);\n    this.tracks[e] = {\n      buffer: r,\n      codec: n,\n      container: t.container,\n      levelCodec: t.levelCodec,\n      supplemental: t.supplemental,\n      metadata: t.metadata,\n      id: t.id,\n      listeners: []\n    }, this.removeBufferListeners(e), this.addBufferListener(e, \"updatestart\", this.onSBUpdateStart), this.addBufferListener(e, \"updateend\", this.onSBUpdateEnd), this.addBufferListener(e, \"error\", this.onSBUpdateError), this.appendSource && this.addBufferListener(e, \"bufferedchange\", (i, o) => {\n      const a = o.removedRanges;\n      a != null && a.length && this.hls.trigger(I.BUFFER_FLUSHED, {\n        type: i\n      });\n    });\n  }\n  get mediaSrc() {\n    var e, t;\n    const r = ((e = this.media) == null || (t = e.querySelector) == null ? void 0 : t.call(e, \"source\")) || this.media;\n    return r == null ? void 0 : r.src;\n  }\n  onSBUpdateStart(e) {\n    const t = this.currentOp(e);\n    t && t.onStart();\n  }\n  onSBUpdateEnd(e) {\n    var t;\n    if (((t = this.mediaSource) == null ? void 0 : t.readyState) === \"closed\") {\n      this.resetBuffer(e);\n      return;\n    }\n    const r = this.currentOp(e);\n    r && (r.onComplete(), this.shiftAndExecuteNext(e));\n  }\n  onSBUpdateError(e, t) {\n    var r;\n    const n = new Error(`${e} SourceBuffer error. MediaSource readyState: ${(r = this.mediaSource) == null ? void 0 : r.readyState}`);\n    this.error(`${n}`, t), this.hls.trigger(I.ERROR, {\n      type: ve.MEDIA_ERROR,\n      details: J.BUFFER_APPENDING_ERROR,\n      sourceBufferName: e,\n      error: n,\n      fatal: !1\n    });\n    const i = this.currentOp(e);\n    i && i.onError(n);\n  }\n  updateTimestampOffset(e, t, r, n, i, o) {\n    const a = t - e.timestampOffset;\n    Math.abs(a) >= r && (this.log(`Updating ${n} SourceBuffer timestampOffset to ${t} (sn: ${i} cc: ${o})`), e.timestampOffset = t);\n  }\n  // This method must result in an updateend event; if remove is not called, onSBUpdateEnd must be called manually\n  removeExecutor(e, t, r) {\n    const {\n      media: n,\n      mediaSource: i\n    } = this, o = this.tracks[e], a = o == null ? void 0 : o.buffer;\n    if (!n || !i || !a) {\n      this.warn(`Attempting to remove from the ${e} SourceBuffer, but it does not exist`), this.shiftAndExecuteNext(e);\n      return;\n    }\n    const l = ue(n.duration) ? n.duration : 1 / 0, c = ue(i.duration) ? i.duration : 1 / 0, u = Math.max(0, t), d = Math.min(r, l, c);\n    d > u && (!o.ending || o.ended) ? (o.ended = !1, this.log(`Removing [${u},${d}] from the ${e} SourceBuffer`), a.remove(u, d)) : this.shiftAndExecuteNext(e);\n  }\n  // This method must result in an updateend event; if append is not called, onSBUpdateEnd must be called manually\n  appendExecutor(e, t) {\n    const r = this.tracks[t], n = r == null ? void 0 : r.buffer;\n    if (!n)\n      throw new a2(`Attempting to append to the ${t} SourceBuffer, but it does not exist`);\n    r.ending = !1, r.ended = !1, n.appendBuffer(e);\n  }\n  blockUntilOpen(e) {\n    if (this.isUpdating() || this.isQueued())\n      this.blockBuffers(e).catch((t) => {\n        this.warn(`SourceBuffer blocked callback ${t}`), this.stepOperationQueue(this.sourceBufferTypes);\n      });\n    else\n      try {\n        e();\n      } catch (t) {\n        this.warn(`Callback run without blocking ${this.operationQueue} ${t}`);\n      }\n  }\n  isUpdating() {\n    return this.sourceBuffers.some(([e, t]) => e && t.updating);\n  }\n  isQueued() {\n    return this.sourceBuffers.some(([e]) => e && !!this.currentOp(e));\n  }\n  isPending(e) {\n    return !!e && !e.buffer;\n  }\n  // Enqueues an operation to each SourceBuffer queue which, upon execution, resolves a promise. When all promises\n  // resolve, the onUnblocked function is executed. Functions calling this method do not need to unblock the queue\n  // upon completion, since we already do it here\n  blockBuffers(e, t = this.sourceBufferTypes) {\n    if (!t.length)\n      return this.log(\"Blocking operation requested, but no SourceBuffers exist\"), Promise.resolve().then(e);\n    const {\n      operationQueue: r\n    } = this, n = t.map((o) => this.appendBlocker(o));\n    return t.length > 1 && !!this.blockedAudioAppend && this.unblockAudio(), Promise.all(n).then((o) => {\n      r === this.operationQueue && (e(), this.stepOperationQueue(this.sourceBufferTypes));\n    });\n  }\n  stepOperationQueue(e) {\n    e.forEach((t) => {\n      var r;\n      const n = (r = this.tracks[t]) == null ? void 0 : r.buffer;\n      !n || n.updating || this.shiftAndExecuteNext(t);\n    });\n  }\n  append(e, t, r) {\n    this.operationQueue && this.operationQueue.append(e, t, r);\n  }\n  appendBlocker(e) {\n    if (this.operationQueue)\n      return this.operationQueue.appendBlocker(e);\n  }\n  currentOp(e) {\n    return this.operationQueue ? this.operationQueue.current(e) : null;\n  }\n  executeNext(e) {\n    e && this.operationQueue && this.operationQueue.executeNext(e);\n  }\n  shiftAndExecuteNext(e) {\n    this.operationQueue && this.operationQueue.shiftAndExecuteNext(e);\n  }\n  get pendingTrackCount() {\n    return Object.keys(this.tracks).reduce((e, t) => e + (this.isPending(this.tracks[t]) ? 1 : 0), 0);\n  }\n  get sourceBufferCount() {\n    return this.sourceBuffers.reduce((e, [t]) => e + (t ? 1 : 0), 0);\n  }\n  get sourceBufferTypes() {\n    return this.sourceBuffers.map(([e]) => e).filter((e) => !!e);\n  }\n  addBufferListener(e, t, r) {\n    const n = this.tracks[e];\n    if (!n)\n      return;\n    const i = n.buffer;\n    if (!i)\n      return;\n    const o = r.bind(this, e);\n    n.listeners.push({\n      event: t,\n      listener: o\n    }), i.addEventListener(t, o);\n  }\n  removeBufferListeners(e) {\n    const t = this.tracks[e];\n    if (!t)\n      return;\n    const r = t.buffer;\n    r && (t.listeners.forEach((n) => {\n      r.removeEventListener(n.event, n.listener);\n    }), t.listeners.length = 0);\n  }\n}\nfunction Hh(s) {\n  const e = s.querySelectorAll(\"source\");\n  [].slice.call(e).forEach((t) => {\n    s.removeChild(t);\n  });\n}\nfunction c2(s, e) {\n  const t = self.document.createElement(\"source\");\n  t.type = \"video/mp4\", t.src = e, s.appendChild(t);\n}\nfunction Sl(s) {\n  return s === \"audio\" ? 1 : 0;\n}\nclass Du {\n  constructor(e) {\n    this.hls = void 0, this.autoLevelCapping = void 0, this.firstLevel = void 0, this.media = void 0, this.restrictedLevels = void 0, this.timer = void 0, this.clientRect = void 0, this.streamController = void 0, this.hls = e, this.autoLevelCapping = Number.POSITIVE_INFINITY, this.firstLevel = -1, this.media = null, this.restrictedLevels = [], this.timer = void 0, this.clientRect = null, this.registerListeners();\n  }\n  setStreamController(e) {\n    this.streamController = e;\n  }\n  destroy() {\n    this.hls && this.unregisterListener(), this.timer && this.stopCapping(), this.media = null, this.clientRect = null, this.hls = this.streamController = null;\n  }\n  registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e.on(I.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this), e.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.on(I.BUFFER_CODECS, this.onBufferCodecs, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this);\n  }\n  unregisterListener() {\n    const {\n      hls: e\n    } = this;\n    e.off(I.FPS_DROP_LEVEL_CAPPING, this.onFpsDropLevelCapping, this), e.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.off(I.BUFFER_CODECS, this.onBufferCodecs, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this);\n  }\n  onFpsDropLevelCapping(e, t) {\n    const r = this.hls.levels[t.droppedLevel];\n    this.isLevelAllowed(r) && this.restrictedLevels.push({\n      bitrate: r.bitrate,\n      height: r.height,\n      width: r.width\n    });\n  }\n  onMediaAttaching(e, t) {\n    this.media = t.media instanceof HTMLVideoElement ? t.media : null, this.clientRect = null, this.timer && this.hls.levels.length && this.detectPlayerSize();\n  }\n  onManifestParsed(e, t) {\n    const r = this.hls;\n    this.restrictedLevels = [], this.firstLevel = t.firstLevel, r.config.capLevelToPlayerSize && t.video && this.startCapping();\n  }\n  onLevelsUpdated(e, t) {\n    this.timer && ue(this.autoLevelCapping) && this.detectPlayerSize();\n  }\n  // Only activate capping when playing a video stream; otherwise, multi-bitrate audio-only streams will be restricted\n  // to the first level\n  onBufferCodecs(e, t) {\n    this.hls.config.capLevelToPlayerSize && t.video && this.startCapping();\n  }\n  onMediaDetaching() {\n    this.stopCapping(), this.media = null;\n  }\n  detectPlayerSize() {\n    if (this.media) {\n      if (this.mediaHeight <= 0 || this.mediaWidth <= 0) {\n        this.clientRect = null;\n        return;\n      }\n      const e = this.hls.levels;\n      if (e.length) {\n        const t = this.hls, r = this.getMaxLevel(e.length - 1);\n        r !== this.autoLevelCapping && t.logger.log(`Setting autoLevelCapping to ${r}: ${e[r].height}p@${e[r].bitrate} for media ${this.mediaWidth}x${this.mediaHeight}`), t.autoLevelCapping = r, t.autoLevelEnabled && t.autoLevelCapping > this.autoLevelCapping && this.streamController && this.streamController.nextLevelSwitch(), this.autoLevelCapping = t.autoLevelCapping;\n      }\n    }\n  }\n  /*\n   * returns level should be the one with the dimensions equal or greater than the media (player) dimensions (so the video will be downscaled)\n   */\n  getMaxLevel(e) {\n    const t = this.hls.levels;\n    if (!t.length)\n      return -1;\n    const r = t.filter((n, i) => this.isLevelAllowed(n) && i <= e);\n    return this.clientRect = null, Du.getMaxLevelByMediaSize(r, this.mediaWidth, this.mediaHeight);\n  }\n  startCapping() {\n    this.timer || (this.autoLevelCapping = Number.POSITIVE_INFINITY, self.clearInterval(this.timer), this.timer = self.setInterval(this.detectPlayerSize.bind(this), 1e3), this.detectPlayerSize());\n  }\n  stopCapping() {\n    this.restrictedLevels = [], this.firstLevel = -1, this.autoLevelCapping = Number.POSITIVE_INFINITY, this.timer && (self.clearInterval(this.timer), this.timer = void 0);\n  }\n  getDimensions() {\n    if (this.clientRect)\n      return this.clientRect;\n    const e = this.media, t = {\n      width: 0,\n      height: 0\n    };\n    if (e) {\n      const r = e.getBoundingClientRect();\n      t.width = r.width, t.height = r.height, !t.width && !t.height && (t.width = r.right - r.left || e.width || 0, t.height = r.bottom - r.top || e.height || 0);\n    }\n    return this.clientRect = t, t;\n  }\n  get mediaWidth() {\n    return this.getDimensions().width * this.contentScaleFactor;\n  }\n  get mediaHeight() {\n    return this.getDimensions().height * this.contentScaleFactor;\n  }\n  get contentScaleFactor() {\n    let e = 1;\n    if (!this.hls.config.ignoreDevicePixelRatio)\n      try {\n        e = self.devicePixelRatio;\n      } catch {\n      }\n    return Math.min(e, this.hls.config.maxDevicePixelRatio);\n  }\n  isLevelAllowed(e) {\n    return !this.restrictedLevels.some((r) => e.bitrate === r.bitrate && e.width === r.width && e.height === r.height);\n  }\n  static getMaxLevelByMediaSize(e, t, r) {\n    if (!(e != null && e.length))\n      return -1;\n    const n = (a, l) => l ? a.width !== l.width || a.height !== l.height : !0;\n    let i = e.length - 1;\n    const o = Math.max(t, r);\n    for (let a = 0; a < e.length; a += 1) {\n      const l = e[a];\n      if ((l.width >= o || l.height >= o) && n(l, e[a + 1])) {\n        i = a;\n        break;\n      }\n    }\n    return i;\n  }\n}\nconst u2 = {\n  /**\n   * text file, such as a manifest or playlist\n   */\n  MANIFEST: \"m\",\n  /**\n   * audio only\n   */\n  AUDIO: \"a\",\n  /**\n   * video only\n   */\n  VIDEO: \"v\",\n  /**\n   * muxed audio and video\n   */\n  MUXED: \"av\",\n  /**\n   * init segment\n   */\n  INIT: \"i\",\n  /**\n   * caption or subtitle\n   */\n  CAPTION: \"c\",\n  /**\n   * ISOBMFF timed text track\n   */\n  TIMED_TEXT: \"tt\",\n  /**\n   * cryptographic key, license or certificate.\n   */\n  KEY: \"k\",\n  /**\n   * other\n   */\n  OTHER: \"o\"\n}, hr = u2, d2 = {\n  /**\n   * HTTP Live Streaming (HLS)\n   */\n  HLS: \"h\"\n}, h2 = d2;\nclass Jr {\n  constructor(e, t) {\n    Array.isArray(e) && (e = e.map((r) => r instanceof Jr ? r : new Jr(r))), this.value = e, this.params = t;\n  }\n}\nconst f2 = \"Dict\";\nfunction g2(s) {\n  return Array.isArray(s) ? JSON.stringify(s) : s instanceof Map ? \"Map{}\" : s instanceof Set ? \"Set{}\" : typeof s == \"object\" ? JSON.stringify(s) : String(s);\n}\nfunction p2(s, e, t, r) {\n  return new Error(`failed to ${s} \"${g2(e)}\" as ${t}`, {\n    cause: r\n  });\n}\nfunction Qr(s, e, t) {\n  return p2(\"serialize\", s, e, t);\n}\nclass _p {\n  constructor(e) {\n    this.description = e;\n  }\n}\nconst qh = \"Bare Item\", m2 = \"Boolean\";\nfunction y2(s) {\n  if (typeof s != \"boolean\")\n    throw Qr(s, m2);\n  return s ? \"?1\" : \"?0\";\n}\nfunction v2(s) {\n  return btoa(String.fromCharCode(...s));\n}\nconst E2 = \"Byte Sequence\";\nfunction x2(s) {\n  if (ArrayBuffer.isView(s) === !1)\n    throw Qr(s, E2);\n  return `:${v2(s)}:`;\n}\nconst S2 = \"Integer\";\nfunction b2(s) {\n  return s < -999999999999999 || 999999999999999 < s;\n}\nfunction Rp(s) {\n  if (b2(s))\n    throw Qr(s, S2);\n  return s.toString();\n}\nfunction T2(s) {\n  return `@${Rp(s.getTime() / 1e3)}`;\n}\nfunction Lp(s, e) {\n  if (s < 0)\n    return -Lp(-s, e);\n  const t = Math.pow(10, e);\n  if (Math.abs(s * t % 1 - 0.5) < Number.EPSILON) {\n    const n = Math.floor(s * t);\n    return (n % 2 === 0 ? n : n + 1) / t;\n  } else\n    return Math.round(s * t) / t;\n}\nconst w2 = \"Decimal\";\nfunction A2(s) {\n  const e = Lp(s, 3);\n  if (Math.floor(Math.abs(e)).toString().length > 12)\n    throw Qr(s, w2);\n  const t = e.toString();\n  return t.includes(\".\") ? t : `${t}.0`;\n}\nconst I2 = \"String\", _2 = /[\\x00-\\x1f\\x7f]+/;\nfunction R2(s) {\n  if (_2.test(s))\n    throw Qr(s, I2);\n  return `\"${s.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"')}\"`;\n}\nfunction L2(s) {\n  return s.description || s.toString().slice(7, -1);\n}\nconst C2 = \"Token\";\nfunction Wh(s) {\n  const e = L2(s);\n  if (/^([a-zA-Z*])([!#$%&'*+\\-.^_`|~\\w:/]*)$/.test(e) === !1)\n    throw Qr(e, C2);\n  return e;\n}\nfunction vc(s) {\n  switch (typeof s) {\n    case \"number\":\n      if (!ue(s))\n        throw Qr(s, qh);\n      return Number.isInteger(s) ? Rp(s) : A2(s);\n    case \"string\":\n      return R2(s);\n    case \"symbol\":\n      return Wh(s);\n    case \"boolean\":\n      return y2(s);\n    case \"object\":\n      if (s instanceof Date)\n        return T2(s);\n      if (s instanceof Uint8Array)\n        return x2(s);\n      if (s instanceof _p)\n        return Wh(s);\n    default:\n      throw Qr(s, qh);\n  }\n}\nconst k2 = \"Key\";\nfunction Ec(s) {\n  if (/^[a-z*][a-z0-9\\-_.*]*$/.test(s) === !1)\n    throw Qr(s, k2);\n  return s;\n}\nfunction Pu(s) {\n  return s == null ? \"\" : Object.entries(s).map(([e, t]) => t === !0 ? `;${Ec(e)}` : `;${Ec(e)}=${vc(t)}`).join(\"\");\n}\nfunction Cp(s) {\n  return s instanceof Jr ? `${vc(s.value)}${Pu(s.params)}` : vc(s);\n}\nfunction D2(s) {\n  return `(${s.value.map(Cp).join(\" \")})${Pu(s.params)}`;\n}\nfunction P2(s, e = {\n  whitespace: !0\n}) {\n  if (typeof s != \"object\" || s == null)\n    throw Qr(s, f2);\n  const t = s instanceof Map ? s.entries() : Object.entries(s), r = e != null && e.whitespace ? \" \" : \"\";\n  return Array.from(t).map(([n, i]) => {\n    i instanceof Jr || (i = new Jr(i));\n    let o = Ec(n);\n    return i.value === !0 ? o += Pu(i.params) : (o += \"=\", Array.isArray(i.value) ? o += D2(i) : o += Cp(i)), o;\n  }).join(`,${r}`);\n}\nfunction kp(s, e) {\n  return P2(s, e);\n}\nconst $r = \"CMCD-Object\", yt = \"CMCD-Request\", Fs = \"CMCD-Session\", bs = \"CMCD-Status\", M2 = {\n  // Object\n  br: $r,\n  ab: $r,\n  d: $r,\n  ot: $r,\n  tb: $r,\n  tpb: $r,\n  lb: $r,\n  tab: $r,\n  lab: $r,\n  url: $r,\n  // Request\n  pb: yt,\n  bl: yt,\n  tbl: yt,\n  dl: yt,\n  ltc: yt,\n  mtp: yt,\n  nor: yt,\n  nrr: yt,\n  rc: yt,\n  sn: yt,\n  sta: yt,\n  su: yt,\n  ttfb: yt,\n  ttfbb: yt,\n  ttlb: yt,\n  cmsdd: yt,\n  cmsds: yt,\n  smrt: yt,\n  df: yt,\n  cs: yt,\n  // TODO: Which header to put the `ts` field is not defined yet.\n  ts: yt,\n  // Session\n  cid: Fs,\n  pr: Fs,\n  sf: Fs,\n  sid: Fs,\n  st: Fs,\n  v: Fs,\n  msd: Fs,\n  // Status\n  bs,\n  bsd: bs,\n  cdn: bs,\n  rtp: bs,\n  bg: bs,\n  pt: bs,\n  ec: bs,\n  e: bs\n}, O2 = {\n  /**\n   * keys whose values vary with each request.\n   */\n  REQUEST: yt\n};\nfunction B2(s) {\n  return Object.keys(s).reduce((e, t) => {\n    var r;\n    return (r = s[t]) === null || r === void 0 || r.forEach((n) => e[n] = t), e;\n  }, {});\n}\nfunction F2(s, e) {\n  const t = {};\n  if (!s)\n    return t;\n  const r = Object.keys(s), n = e ? B2(e) : {};\n  return r.reduce((i, o) => {\n    var a;\n    const l = M2[o] || n[o] || O2.REQUEST, c = (a = i[l]) !== null && a !== void 0 ? a : i[l] = {};\n    return c[o] = s[o], i;\n  }, t);\n}\nfunction N2(s) {\n  return [\"ot\", \"sf\", \"st\", \"e\", \"sta\"].includes(s);\n}\nfunction U2(s) {\n  return typeof s == \"number\" ? ue(s) : s != null && s !== \"\" && s !== !1;\n}\nconst Dp = \"event\";\nfunction $2(s, e) {\n  const t = new URL(s), r = new URL(e);\n  if (t.origin !== r.origin)\n    return s;\n  const n = t.pathname.split(\"/\").slice(1), i = r.pathname.split(\"/\").slice(1, -1);\n  for (; n[0] === i[0]; )\n    n.shift(), i.shift();\n  for (; i.length; )\n    i.shift(), n.unshift(\"..\");\n  return n.join(\"/\") + t.search + t.hash;\n}\nconst vo = (s) => Math.round(s), xc = (s, e) => Array.isArray(s) ? s.map((t) => xc(t, e)) : s instanceof Jr && typeof s.value == \"string\" ? new Jr(xc(s.value, e), s.params) : (e.baseUrl && (s = $2(s, e.baseUrl)), e.version === 1 ? encodeURIComponent(s) : s), Xi = (s) => vo(s / 100) * 100, G2 = (s, e) => {\n  let t = s;\n  return e.version >= 2 && (s instanceof Jr && typeof s.value == \"string\" ? t = new Jr([s]) : typeof s == \"string\" && (t = [s])), xc(t, e);\n}, V2 = {\n  /**\n   * Bitrate (kbps) rounded integer\n   */\n  br: vo,\n  /**\n   * Duration (milliseconds) rounded integer\n   */\n  d: vo,\n  /**\n   * Buffer Length (milliseconds) rounded nearest 100ms\n   */\n  bl: Xi,\n  /**\n   * Deadline (milliseconds) rounded nearest 100ms\n   */\n  dl: Xi,\n  /**\n   * Measured Throughput (kbps) rounded nearest 100kbps\n   */\n  mtp: Xi,\n  /**\n   * Next Object Request URL encoded\n   */\n  nor: G2,\n  /**\n   * Requested maximum throughput (kbps) rounded nearest 100kbps\n   */\n  rtp: Xi,\n  /**\n   * Top Bitrate (kbps) rounded integer\n   */\n  tb: vo\n}, Pp = \"request\", Mp = \"response\", Mu = [\"ab\", \"bg\", \"bl\", \"br\", \"bs\", \"bsd\", \"cdn\", \"cid\", \"cs\", \"df\", \"ec\", \"lab\", \"lb\", \"ltc\", \"msd\", \"mtp\", \"pb\", \"pr\", \"pt\", \"sf\", \"sid\", \"sn\", \"st\", \"sta\", \"tab\", \"tb\", \"tbl\", \"tpb\", \"ts\", \"v\"], j2 = [\"e\"], K2 = /^[a-zA-Z0-9-.]+-[a-zA-Z0-9-.]+$/;\nfunction Ea(s) {\n  return K2.test(s);\n}\nfunction H2(s) {\n  return Mu.includes(s) || j2.includes(s) || Ea(s);\n}\nconst Op = [\"d\", \"dl\", \"nor\", \"ot\", \"rtp\", \"su\"];\nfunction q2(s) {\n  return Mu.includes(s) || Op.includes(s) || Ea(s);\n}\nconst W2 = [\"cmsdd\", \"cmsds\", \"rc\", \"smrt\", \"ttfb\", \"ttfbb\", \"ttlb\", \"url\"];\nfunction z2(s) {\n  return Mu.includes(s) || Op.includes(s) || W2.includes(s) || Ea(s);\n}\nconst Y2 = [\"bl\", \"br\", \"bs\", \"cid\", \"d\", \"dl\", \"mtp\", \"nor\", \"nrr\", \"ot\", \"pr\", \"rtp\", \"sf\", \"sid\", \"st\", \"su\", \"tb\", \"v\"];\nfunction Z2(s) {\n  return Y2.includes(s) || Ea(s);\n}\nconst X2 = {\n  [Mp]: z2,\n  [Dp]: H2,\n  [Pp]: q2\n};\nfunction Bp(s, e = {}) {\n  const t = {};\n  if (s == null || typeof s != \"object\")\n    return t;\n  const r = e.version || s.v || 1, n = e.reportingMode || Pp, i = r === 1 ? Z2 : X2[n];\n  let o = Object.keys(s).filter(i);\n  const a = e.filter;\n  typeof a == \"function\" && (o = o.filter(a));\n  const l = n === Mp || n === Dp;\n  l && !o.includes(\"ts\") && o.push(\"ts\"), r > 1 && !o.includes(\"v\") && o.push(\"v\");\n  const c = nt({}, V2, e.formatters), u = {\n    version: r,\n    reportingMode: n,\n    baseUrl: e.baseUrl\n  };\n  return o.sort().forEach((d) => {\n    let h = s[d];\n    const f = c[d];\n    if (typeof f == \"function\" && (h = f(h, u)), d === \"v\") {\n      if (r === 1)\n        return;\n      h = r;\n    }\n    d == \"pr\" && h === 1 || (l && d === \"ts\" && !ue(h) && (h = Date.now()), U2(h) && (N2(d) && typeof h == \"string\" && (h = new _p(h)), t[d] = h));\n  }), t;\n}\nfunction J2(s, e = {}) {\n  const t = {};\n  if (!s)\n    return t;\n  const r = Bp(s, e), n = F2(r, e == null ? void 0 : e.customHeaderMap);\n  return Object.entries(n).reduce((i, [o, a]) => {\n    const l = kp(a, {\n      whitespace: !1\n    });\n    return l && (i[o] = l), i;\n  }, t);\n}\nfunction Q2(s, e, t) {\n  return nt(s, J2(e, t));\n}\nconst ew = \"CMCD\";\nfunction tw(s, e = {}) {\n  return s ? kp(Bp(s, e), {\n    whitespace: !1\n  }) : \"\";\n}\nfunction rw(s, e = {}) {\n  if (!s)\n    return \"\";\n  const t = tw(s, e);\n  return encodeURIComponent(t);\n}\nfunction sw(s, e = {}) {\n  if (!s)\n    return \"\";\n  const t = rw(s, e);\n  return `${ew}=${t}`;\n}\nconst zh = /CMCD=[^&#]+/;\nfunction nw(s, e, t) {\n  const r = sw(e, t);\n  if (!r)\n    return s;\n  if (zh.test(s))\n    return s.replace(zh, r);\n  const n = s.includes(\"?\") ? \"&\" : \"?\";\n  return `${s}${n}${r}`;\n}\nclass iw {\n  constructor(e) {\n    this.hls = void 0, this.config = void 0, this.media = void 0, this.sid = void 0, this.cid = void 0, this.useHeaders = !1, this.includeKeys = void 0, this.initialized = !1, this.starved = !1, this.buffering = !0, this.audioBuffer = void 0, this.videoBuffer = void 0, this.onWaiting = () => {\n      this.initialized && (this.starved = !0), this.buffering = !0;\n    }, this.onPlaying = () => {\n      this.initialized || (this.initialized = !0), this.buffering = !1;\n    }, this.applyPlaylistData = (n) => {\n      try {\n        this.apply(n, {\n          ot: hr.MANIFEST,\n          su: !this.initialized\n        });\n      } catch (i) {\n        this.hls.logger.warn(\"Could not generate manifest CMCD data.\", i);\n      }\n    }, this.applyFragmentData = (n) => {\n      try {\n        const {\n          frag: i,\n          part: o\n        } = n, a = this.hls.levels[i.level], l = this.getObjectType(i), c = {\n          d: (o || i).duration * 1e3,\n          ot: l\n        };\n        (l === hr.VIDEO || l === hr.AUDIO || l == hr.MUXED) && (c.br = a.bitrate / 1e3, c.tb = this.getTopBandwidth(l) / 1e3, c.bl = this.getBufferLength(l));\n        const u = o ? this.getNextPart(o) : this.getNextFrag(i);\n        u != null && u.url && u.url !== i.url && (c.nor = u.url), this.apply(n, c);\n      } catch (i) {\n        this.hls.logger.warn(\"Could not generate segment CMCD data.\", i);\n      }\n    }, this.hls = e;\n    const t = this.config = e.config, {\n      cmcd: r\n    } = t;\n    r != null && (t.pLoader = this.createPlaylistLoader(), t.fLoader = this.createFragmentLoader(), this.sid = r.sessionId || e.sessionId, this.cid = r.contentId, this.useHeaders = r.useHeaders === !0, this.includeKeys = r.includeKeys, this.registerListeners());\n  }\n  registerListeners() {\n    const e = this.hls;\n    e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHED, this.onMediaDetached, this), e.on(I.BUFFER_CREATED, this.onBufferCreated, this);\n  }\n  unregisterListeners() {\n    const e = this.hls;\n    e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHED, this.onMediaDetached, this), e.off(I.BUFFER_CREATED, this.onBufferCreated, this);\n  }\n  destroy() {\n    this.unregisterListeners(), this.onMediaDetached(), this.hls = this.config = this.audioBuffer = this.videoBuffer = null, this.onWaiting = this.onPlaying = this.media = null;\n  }\n  onMediaAttached(e, t) {\n    this.media = t.media, this.media.addEventListener(\"waiting\", this.onWaiting), this.media.addEventListener(\"playing\", this.onPlaying);\n  }\n  onMediaDetached() {\n    this.media && (this.media.removeEventListener(\"waiting\", this.onWaiting), this.media.removeEventListener(\"playing\", this.onPlaying), this.media = null);\n  }\n  onBufferCreated(e, t) {\n    var r, n;\n    this.audioBuffer = (r = t.tracks.audio) == null ? void 0 : r.buffer, this.videoBuffer = (n = t.tracks.video) == null ? void 0 : n.buffer;\n  }\n  /**\n   * Create baseline CMCD data\n   */\n  createData() {\n    var e;\n    return {\n      v: 1,\n      sf: h2.HLS,\n      sid: this.sid,\n      cid: this.cid,\n      pr: (e = this.media) == null ? void 0 : e.playbackRate,\n      mtp: this.hls.bandwidthEstimate / 1e3\n    };\n  }\n  /**\n   * Apply CMCD data to a request.\n   */\n  apply(e, t = {}) {\n    nt(t, this.createData());\n    const r = t.ot === hr.INIT || t.ot === hr.VIDEO || t.ot === hr.MUXED;\n    this.starved && r && (t.bs = !0, t.su = !0, this.starved = !1), t.su == null && (t.su = this.buffering);\n    const {\n      includeKeys: n\n    } = this;\n    n && (t = Object.keys(t).reduce((o, a) => (n.includes(a) && (o[a] = t[a]), o), {}));\n    const i = {\n      baseUrl: e.url\n    };\n    this.useHeaders ? (e.headers || (e.headers = {}), Q2(e.headers, t, i)) : e.url = nw(e.url, t, i);\n  }\n  getNextFrag(e) {\n    var t;\n    const r = (t = this.hls.levels[e.level]) == null ? void 0 : t.details;\n    if (r) {\n      const n = e.sn - r.startSN;\n      return r.fragments[n + 1];\n    }\n  }\n  getNextPart(e) {\n    var t;\n    const {\n      index: r,\n      fragment: n\n    } = e, i = (t = this.hls.levels[n.level]) == null || (t = t.details) == null ? void 0 : t.partList;\n    if (i) {\n      const {\n        sn: o\n      } = n;\n      for (let a = i.length - 1; a >= 0; a--) {\n        const l = i[a];\n        if (l.index === r && l.fragment.sn === o)\n          return i[a + 1];\n      }\n    }\n  }\n  /**\n   * The CMCD object type.\n   */\n  getObjectType(e) {\n    const {\n      type: t\n    } = e;\n    if (t === \"subtitle\")\n      return hr.TIMED_TEXT;\n    if (e.sn === \"initSegment\")\n      return hr.INIT;\n    if (t === \"audio\")\n      return hr.AUDIO;\n    if (t === \"main\")\n      return this.hls.audioTracks.length ? hr.VIDEO : hr.MUXED;\n  }\n  /**\n   * Get the highest bitrate.\n   */\n  getTopBandwidth(e) {\n    let t = 0, r;\n    const n = this.hls;\n    if (e === hr.AUDIO)\n      r = n.audioTracks;\n    else {\n      const i = n.maxAutoLevel, o = i > -1 ? i + 1 : n.levels.length;\n      r = n.levels.slice(0, o);\n    }\n    return r.forEach((i) => {\n      i.bitrate > t && (t = i.bitrate);\n    }), t > 0 ? t : NaN;\n  }\n  /**\n   * Get the buffer length for a media type in milliseconds\n   */\n  getBufferLength(e) {\n    const t = this.media, r = e === hr.AUDIO ? this.audioBuffer : this.videoBuffer;\n    return !r || !t ? NaN : Ce.bufferInfo(r, t.currentTime, this.config.maxBufferHole).len * 1e3;\n  }\n  /**\n   * Create a playlist loader\n   */\n  createPlaylistLoader() {\n    const {\n      pLoader: e\n    } = this.config, t = this.applyPlaylistData, r = e || this.config.loader;\n    return class {\n      constructor(i) {\n        this.loader = void 0, this.loader = new r(i);\n      }\n      get stats() {\n        return this.loader.stats;\n      }\n      get context() {\n        return this.loader.context;\n      }\n      destroy() {\n        this.loader.destroy();\n      }\n      abort() {\n        this.loader.abort();\n      }\n      load(i, o, a) {\n        t(i), this.loader.load(i, o, a);\n      }\n    };\n  }\n  /**\n   * Create a playlist loader\n   */\n  createFragmentLoader() {\n    const {\n      fLoader: e\n    } = this.config, t = this.applyFragmentData, r = e || this.config.loader;\n    return class {\n      constructor(i) {\n        this.loader = void 0, this.loader = new r(i);\n      }\n      get stats() {\n        return this.loader.stats;\n      }\n      get context() {\n        return this.loader.context;\n      }\n      destroy() {\n        this.loader.destroy();\n      }\n      abort() {\n        this.loader.abort();\n      }\n      load(i, o, a) {\n        t(i), this.loader.load(i, o, a);\n      }\n    };\n  }\n}\nconst ow = 3e5;\nclass aw extends Lr {\n  constructor(e) {\n    super(\"content-steering\", e.logger), this.hls = void 0, this.loader = null, this.uri = null, this.pathwayId = \".\", this._pathwayPriority = null, this.timeToLoad = 300, this.reloadTimer = -1, this.updated = 0, this.started = !1, this.enabled = !0, this.levels = null, this.audioTracks = null, this.subtitleTracks = null, this.penalizedPathways = {}, this.hls = e, this.registerListeners();\n  }\n  registerListeners() {\n    const e = this.hls;\n    e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.ERROR, this.onError, this);\n  }\n  unregisterListeners() {\n    const e = this.hls;\n    e && (e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.ERROR, this.onError, this));\n  }\n  pathways() {\n    return (this.levels || []).reduce((e, t) => (e.indexOf(t.pathwayId) === -1 && e.push(t.pathwayId), e), []);\n  }\n  get pathwayPriority() {\n    return this._pathwayPriority;\n  }\n  set pathwayPriority(e) {\n    this.updatePathwayPriority(e);\n  }\n  startLoad() {\n    if (this.started = !0, this.clearTimeout(), this.enabled && this.uri) {\n      if (this.updated) {\n        const e = this.timeToLoad * 1e3 - (performance.now() - this.updated);\n        if (e > 0) {\n          this.scheduleRefresh(this.uri, e);\n          return;\n        }\n      }\n      this.loadSteeringManifest(this.uri);\n    }\n  }\n  stopLoad() {\n    this.started = !1, this.loader && (this.loader.destroy(), this.loader = null), this.clearTimeout();\n  }\n  clearTimeout() {\n    this.reloadTimer !== -1 && (self.clearTimeout(this.reloadTimer), this.reloadTimer = -1);\n  }\n  destroy() {\n    this.unregisterListeners(), this.stopLoad(), this.hls = null, this.levels = this.audioTracks = this.subtitleTracks = null;\n  }\n  removeLevel(e) {\n    const t = this.levels;\n    t && (this.levels = t.filter((r) => r !== e));\n  }\n  onManifestLoading() {\n    this.stopLoad(), this.enabled = !0, this.timeToLoad = 300, this.updated = 0, this.uri = null, this.pathwayId = \".\", this.levels = this.audioTracks = this.subtitleTracks = null;\n  }\n  onManifestLoaded(e, t) {\n    const {\n      contentSteering: r\n    } = t;\n    r !== null && (this.pathwayId = r.pathwayId, this.uri = r.uri, this.started && this.startLoad());\n  }\n  onManifestParsed(e, t) {\n    this.audioTracks = t.audioTracks, this.subtitleTracks = t.subtitleTracks;\n  }\n  onError(e, t) {\n    const {\n      errorAction: r\n    } = t;\n    if ((r == null ? void 0 : r.action) === Zt.SendAlternateToPenaltyBox && r.flags === vr.MoveAllAlternatesMatchingHost) {\n      const n = this.levels;\n      let i = this._pathwayPriority, o = this.pathwayId;\n      if (t.context) {\n        const {\n          groupId: a,\n          pathwayId: l,\n          type: c\n        } = t.context;\n        a && n ? o = this.getPathwayForGroupId(a, c, o) : l && (o = l);\n      }\n      o in this.penalizedPathways || (this.penalizedPathways[o] = performance.now()), !i && n && (i = this.pathways()), i && i.length > 1 && (this.updatePathwayPriority(i), r.resolved = this.pathwayId !== o), t.details === J.BUFFER_APPEND_ERROR && !t.fatal ? r.resolved = !0 : r.resolved || this.warn(`Could not resolve ${t.details} (\"${t.error.message}\") with content-steering for Pathway: ${o} levels: ${n && n.length} priorities: ${at(i)} penalized: ${at(this.penalizedPathways)}`);\n    }\n  }\n  filterParsedLevels(e) {\n    this.levels = e;\n    let t = this.getLevelsForPathway(this.pathwayId);\n    if (t.length === 0) {\n      const r = e[0].pathwayId;\n      this.log(`No levels found in Pathway ${this.pathwayId}. Setting initial Pathway to \"${r}\"`), t = this.getLevelsForPathway(r), this.pathwayId = r;\n    }\n    return t.length !== e.length && this.log(`Found ${t.length}/${e.length} levels in Pathway \"${this.pathwayId}\"`), t;\n  }\n  getLevelsForPathway(e) {\n    return this.levels === null ? [] : this.levels.filter((t) => e === t.pathwayId);\n  }\n  updatePathwayPriority(e) {\n    this._pathwayPriority = e;\n    let t;\n    const r = this.penalizedPathways, n = performance.now();\n    Object.keys(r).forEach((i) => {\n      n - r[i] > ow && delete r[i];\n    });\n    for (let i = 0; i < e.length; i++) {\n      const o = e[i];\n      if (o in r)\n        continue;\n      if (o === this.pathwayId)\n        return;\n      const a = this.hls.nextLoadLevel, l = this.hls.levels[a];\n      if (t = this.getLevelsForPathway(o), t.length > 0) {\n        this.log(`Setting Pathway to \"${o}\"`), this.pathwayId = o, rp(t), this.hls.trigger(I.LEVELS_UPDATED, {\n          levels: t\n        });\n        const c = this.hls.levels[a];\n        l && c && this.levels && (c.attrs[\"STABLE-VARIANT-ID\"] !== l.attrs[\"STABLE-VARIANT-ID\"] && c.bitrate !== l.bitrate && this.log(`Unstable Pathways change from bitrate ${l.bitrate} to ${c.bitrate}`), this.hls.nextLoadLevel = a);\n        break;\n      }\n    }\n  }\n  getPathwayForGroupId(e, t, r) {\n    const n = this.getLevelsForPathway(r).concat(this.levels || []);\n    for (let i = 0; i < n.length; i++)\n      if (t === Ke.AUDIO_TRACK && n[i].hasAudioGroup(e) || t === Ke.SUBTITLE_TRACK && n[i].hasSubtitleGroup(e))\n        return n[i].pathwayId;\n    return r;\n  }\n  clonePathways(e) {\n    const t = this.levels;\n    if (!t)\n      return;\n    const r = {}, n = {};\n    e.forEach((i) => {\n      const {\n        ID: o,\n        \"BASE-ID\": a,\n        \"URI-REPLACEMENT\": l\n      } = i;\n      if (t.some((u) => u.pathwayId === o))\n        return;\n      const c = this.getLevelsForPathway(a).map((u) => {\n        const d = new gt(u.attrs);\n        d[\"PATHWAY-ID\"] = o;\n        const h = d.AUDIO && `${d.AUDIO}_clone_${o}`, f = d.SUBTITLES && `${d.SUBTITLES}_clone_${o}`;\n        h && (r[d.AUDIO] = h, d.AUDIO = h), f && (n[d.SUBTITLES] = f, d.SUBTITLES = f);\n        const p = Fp(u.uri, d[\"STABLE-VARIANT-ID\"], \"PER-VARIANT-URIS\", l), y = new mi({\n          attrs: d,\n          audioCodec: u.audioCodec,\n          bitrate: u.bitrate,\n          height: u.height,\n          name: u.name,\n          url: p,\n          videoCodec: u.videoCodec,\n          width: u.width\n        });\n        if (u.audioGroups)\n          for (let E = 1; E < u.audioGroups.length; E++)\n            y.addGroupId(\"audio\", `${u.audioGroups[E]}_clone_${o}`);\n        if (u.subtitleGroups)\n          for (let E = 1; E < u.subtitleGroups.length; E++)\n            y.addGroupId(\"text\", `${u.subtitleGroups[E]}_clone_${o}`);\n        return y;\n      });\n      t.push(...c), Yh(this.audioTracks, r, l, o), Yh(this.subtitleTracks, n, l, o);\n    });\n  }\n  loadSteeringManifest(e) {\n    const t = this.hls.config, r = t.loader;\n    this.loader && this.loader.destroy(), this.loader = new r(t);\n    let n;\n    try {\n      n = new self.URL(e);\n    } catch {\n      this.enabled = !1, this.log(`Failed to parse Steering Manifest URI: ${e}`);\n      return;\n    }\n    if (n.protocol !== \"data:\") {\n      const u = (this.hls.bandwidthEstimate || t.abrEwmaDefaultEstimate) | 0;\n      n.searchParams.set(\"_HLS_pathway\", this.pathwayId), n.searchParams.set(\"_HLS_throughput\", \"\" + u);\n    }\n    const i = {\n      responseType: \"json\",\n      url: n.href\n    }, o = t.steeringManifestLoadPolicy.default, a = o.errorRetry || o.timeoutRetry || {}, l = {\n      loadPolicy: o,\n      timeout: o.maxLoadTimeMs,\n      maxRetry: a.maxNumRetry || 0,\n      retryDelay: a.retryDelayMs || 0,\n      maxRetryDelay: a.maxRetryDelayMs || 0\n    }, c = {\n      onSuccess: (u, d, h, f) => {\n        this.log(`Loaded steering manifest: \"${n}\"`);\n        const p = u.data;\n        if ((p == null ? void 0 : p.VERSION) !== 1) {\n          this.log(`Steering VERSION ${p.VERSION} not supported!`);\n          return;\n        }\n        this.updated = performance.now(), this.timeToLoad = p.TTL;\n        const {\n          \"RELOAD-URI\": y,\n          \"PATHWAY-CLONES\": E,\n          \"PATHWAY-PRIORITY\": b\n        } = p;\n        if (y)\n          try {\n            this.uri = new self.URL(y, n).href;\n          } catch {\n            this.enabled = !1, this.log(`Failed to parse Steering Manifest RELOAD-URI: ${y}`);\n            return;\n          }\n        this.scheduleRefresh(this.uri || h.url), E && this.clonePathways(E);\n        const R = {\n          steeringManifest: p,\n          url: n.toString()\n        };\n        this.hls.trigger(I.STEERING_MANIFEST_LOADED, R), b && this.updatePathwayPriority(b);\n      },\n      onError: (u, d, h, f) => {\n        if (this.log(`Error loading steering manifest: ${u.code} ${u.text} (${d.url})`), this.stopLoad(), u.code === 410) {\n          this.enabled = !1, this.log(`Steering manifest ${d.url} no longer available`);\n          return;\n        }\n        let p = this.timeToLoad * 1e3;\n        if (u.code === 429) {\n          const y = this.loader;\n          if (typeof (y == null ? void 0 : y.getResponseHeader) == \"function\") {\n            const E = y.getResponseHeader(\"Retry-After\");\n            E && (p = parseFloat(E) * 1e3);\n          }\n          this.log(`Steering manifest ${d.url} rate limited`);\n          return;\n        }\n        this.scheduleRefresh(this.uri || d.url, p);\n      },\n      onTimeout: (u, d, h) => {\n        this.log(`Timeout loading steering manifest (${d.url})`), this.scheduleRefresh(this.uri || d.url);\n      }\n    };\n    this.log(`Requesting steering manifest: ${n}`), this.loader.load(i, l, c);\n  }\n  scheduleRefresh(e, t = this.timeToLoad * 1e3) {\n    this.clearTimeout(), this.reloadTimer = self.setTimeout(() => {\n      var r;\n      const n = (r = this.hls) == null ? void 0 : r.media;\n      if (n && !n.ended) {\n        this.loadSteeringManifest(e);\n        return;\n      }\n      this.scheduleRefresh(e, this.timeToLoad * 1e3);\n    }, t);\n  }\n}\nfunction Yh(s, e, t, r) {\n  s && Object.keys(e).forEach((n) => {\n    const i = s.filter((o) => o.groupId === n).map((o) => {\n      const a = nt({}, o);\n      return a.details = void 0, a.attrs = new gt(a.attrs), a.url = a.attrs.URI = Fp(o.url, o.attrs[\"STABLE-RENDITION-ID\"], \"PER-RENDITION-URIS\", t), a.groupId = a.attrs[\"GROUP-ID\"] = e[n], a.attrs[\"PATHWAY-ID\"] = r, a;\n    });\n    s.push(...i);\n  });\n}\nfunction Fp(s, e, t, r) {\n  const {\n    HOST: n,\n    PARAMS: i,\n    [t]: o\n  } = r;\n  let a;\n  e && (a = o == null ? void 0 : o[e], a && (s = a));\n  const l = new self.URL(s);\n  return n && !a && (l.host = n), i && Object.keys(i).sort().forEach((c) => {\n    c && l.searchParams.set(c, i[c]);\n  }), l.href;\n}\nclass _n extends Lr {\n  constructor(e) {\n    super(\"eme\", e.logger), this.hls = void 0, this.config = void 0, this.media = null, this.keyFormatPromise = null, this.keySystemAccessPromises = {}, this._requestLicenseFailureCount = 0, this.mediaKeySessions = [], this.keyIdToKeySessionPromise = {}, this.mediaKeys = null, this.setMediaKeysQueue = _n.CDMCleanupPromise ? [_n.CDMCleanupPromise] : [], this.bannedKeyIds = {}, this.onMediaEncrypted = (t) => {\n      const {\n        initDataType: r,\n        initData: n\n      } = t, i = `\"${t.type}\" event: init data type: \"${r}\"`;\n      if (this.debug(i), n !== null) {\n        if (!this.keyFormatPromise) {\n          let o = Object.keys(this.keySystemAccessPromises);\n          o.length || (o = zn(this.config));\n          const a = o.map(fl).filter((l) => !!l);\n          this.keyFormatPromise = this.getKeyFormatPromise(a);\n        }\n        this.keyFormatPromise.then((o) => {\n          const a = po(o);\n          if (r !== \"sinf\" || a !== mt.FAIRPLAY) {\n            this.log(`Ignoring \"${t.type}\" event with init data type: \"${r}\" for selected key-system ${a}`);\n            return;\n          }\n          let l;\n          try {\n            const f = jt(new Uint8Array(n)), p = bu(JSON.parse(f).sinf), y = Pg(p);\n            if (!y)\n              throw new Error(\"'schm' box missing or not cbcs/cenc with schi > tenc\");\n            l = new Uint8Array(y.subarray(8, 24));\n          } catch (f) {\n            this.warn(`${i} Failed to parse sinf: ${f}`);\n            return;\n          }\n          const c = fr(l), {\n            keyIdToKeySessionPromise: u,\n            mediaKeySessions: d\n          } = this;\n          let h = u[c];\n          for (let f = 0; f < d.length; f++) {\n            const p = d[f], y = p.decryptdata;\n            if (!y.keyId)\n              continue;\n            const E = fr(y.keyId);\n            if (xu(l, y.keyId) || y.uri.replace(/-/g, \"\").indexOf(c) !== -1) {\n              if (h = u[E], !h)\n                continue;\n              if (y.pssh)\n                break;\n              delete u[E], y.pssh = new Uint8Array(n), y.keyId = l, h = u[c] = h.then(() => this.generateRequestWithPreferredKeySession(p, r, n, \"encrypted-event-key-match\")), h.catch((b) => this.handleError(b));\n              break;\n            }\n          }\n          h || this.handleError(new Error(`Key ID ${c} not encountered in playlist. Key-system sessions ${d.length}.`));\n        }).catch((o) => this.handleError(o));\n      }\n    }, this.onWaitingForKey = (t) => {\n      this.log(`\"${t.type}\" event`);\n    }, this.hls = e, this.config = e.config, this.registerListeners();\n  }\n  destroy() {\n    this.onDestroying(), this.onMediaDetached();\n    const e = this.config;\n    e.requestMediaKeySystemAccessFunc = null, e.licenseXhrSetup = e.licenseResponseCallback = void 0, e.drmSystems = e.drmSystemOptions = {}, this.hls = this.config = this.keyIdToKeySessionPromise = null, this.onMediaEncrypted = this.onWaitingForKey = null;\n  }\n  registerListeners() {\n    this.hls.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), this.hls.on(I.MEDIA_DETACHED, this.onMediaDetached, this), this.hls.on(I.MANIFEST_LOADING, this.onManifestLoading, this), this.hls.on(I.MANIFEST_LOADED, this.onManifestLoaded, this), this.hls.on(I.DESTROYING, this.onDestroying, this);\n  }\n  unregisterListeners() {\n    this.hls.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), this.hls.off(I.MEDIA_DETACHED, this.onMediaDetached, this), this.hls.off(I.MANIFEST_LOADING, this.onManifestLoading, this), this.hls.off(I.MANIFEST_LOADED, this.onManifestLoaded, this), this.hls.off(I.DESTROYING, this.onDestroying, this);\n  }\n  getLicenseServerUrl(e) {\n    const {\n      drmSystems: t,\n      widevineLicenseUrl: r\n    } = this.config, n = t == null ? void 0 : t[e];\n    if (n)\n      return n.licenseUrl;\n    if (e === mt.WIDEVINE && r)\n      return r;\n  }\n  getLicenseServerUrlOrThrow(e) {\n    const t = this.getLicenseServerUrl(e);\n    if (t === void 0)\n      throw new Error(`no license server URL configured for key-system \"${e}\"`);\n    return t;\n  }\n  getServerCertificateUrl(e) {\n    const {\n      drmSystems: t\n    } = this.config, r = t == null ? void 0 : t[e];\n    if (r)\n      return r.serverCertificateUrl;\n    this.log(`No Server Certificate in config.drmSystems[\"${e}\"]`);\n  }\n  attemptKeySystemAccess(e) {\n    const t = this.hls.levels, r = (o, a, l) => !!o && l.indexOf(o) === a, n = t.map((o) => o.audioCodec).filter(r), i = t.map((o) => o.videoCodec).filter(r);\n    return n.length + i.length === 0 && i.push(\"avc1.42e01e\"), new Promise((o, a) => {\n      const l = (c) => {\n        const u = c.shift();\n        this.getMediaKeysPromise(u, n, i).then((d) => o({\n          keySystem: u,\n          mediaKeys: d\n        })).catch((d) => {\n          c.length ? l(c) : d instanceof yr ? a(d) : a(new yr({\n            type: ve.KEY_SYSTEM_ERROR,\n            details: J.KEY_SYSTEM_NO_ACCESS,\n            error: d,\n            fatal: !0\n          }, d.message));\n        });\n      };\n      l(e);\n    });\n  }\n  requestMediaKeySystemAccess(e, t) {\n    const {\n      requestMediaKeySystemAccessFunc: r\n    } = this.config;\n    if (typeof r != \"function\") {\n      let n = `Configured requestMediaKeySystemAccess is not a function ${r}`;\n      return Yg === null && self.location.protocol === \"http:\" && (n = `navigator.requestMediaKeySystemAccess is not available over insecure protocol ${location.protocol}`), Promise.reject(new Error(n));\n    }\n    return r(e, t);\n  }\n  getMediaKeysPromise(e, t, r) {\n    var n;\n    const i = Gb(e, t, r, this.config.drmSystemOptions || {});\n    let o = this.keySystemAccessPromises[e], a = (n = o) == null ? void 0 : n.keySystemAccess;\n    if (!a) {\n      this.log(`Requesting encrypted media \"${e}\" key-system access with config: ${at(i)}`), a = this.requestMediaKeySystemAccess(e, i);\n      const l = o = this.keySystemAccessPromises[e] = {\n        keySystemAccess: a\n      };\n      return a.catch((c) => {\n        this.log(`Failed to obtain access to key-system \"${e}\": ${c}`);\n      }), a.then((c) => {\n        this.log(`Access for key-system \"${c.keySystem}\" obtained`);\n        const u = this.fetchServerCertificate(e);\n        this.log(`Create media-keys for \"${e}\"`);\n        const d = l.mediaKeys = c.createMediaKeys().then((h) => (this.log(`Media-keys created for \"${e}\"`), l.hasMediaKeys = !0, u.then((f) => f ? this.setMediaKeysServerCertificate(h, e, f) : h)));\n        return d.catch((h) => {\n          this.error(`Failed to create media-keys for \"${e}\"}: ${h}`);\n        }), d;\n      });\n    }\n    return a.then(() => o.mediaKeys);\n  }\n  createMediaKeySessionContext({\n    decryptdata: e,\n    keySystem: t,\n    mediaKeys: r\n  }) {\n    this.log(`Creating key-system session \"${t}\" keyId: ${fr(e.keyId || [])} keyUri: ${e.uri}`);\n    const n = r.createSession(), i = {\n      decryptdata: e,\n      keySystem: t,\n      mediaKeys: r,\n      mediaKeysSession: n,\n      keyStatus: \"status-pending\"\n    };\n    return this.mediaKeySessions.push(i), i;\n  }\n  renewKeySession(e) {\n    const t = e.decryptdata;\n    if (t.pssh) {\n      const r = this.createMediaKeySessionContext(e), n = Ji(t), i = \"cenc\";\n      this.keyIdToKeySessionPromise[n] = this.generateRequestWithPreferredKeySession(r, i, t.pssh.buffer, \"expired\");\n    } else\n      this.warn(\"Could not renew expired session. Missing pssh initData.\");\n    this.removeSession(e);\n  }\n  updateKeySession(e, t) {\n    const r = e.mediaKeysSession;\n    return this.log(`Updating key-session \"${r.sessionId}\" for keyId ${fr(e.decryptdata.keyId || [])}\n      } (data length: ${t.byteLength})`), r.update(t);\n  }\n  getSelectedKeySystemFormats() {\n    return Object.keys(this.keySystemAccessPromises).map((e) => ({\n      keySystem: e,\n      hasMediaKeys: this.keySystemAccessPromises[e].hasMediaKeys\n    })).filter(({\n      hasMediaKeys: e\n    }) => !!e).map(({\n      keySystem: e\n    }) => fl(e)).filter((e) => !!e);\n  }\n  getKeySystemAccess(e) {\n    return this.getKeySystemSelectionPromise(e).then(({\n      keySystem: t,\n      mediaKeys: r\n    }) => this.attemptSetMediaKeys(t, r));\n  }\n  selectKeySystem(e) {\n    return new Promise((t, r) => {\n      this.getKeySystemSelectionPromise(e).then(({\n        keySystem: n\n      }) => {\n        const i = fl(n);\n        i ? t(i) : r(new Error(`Unable to find format for key-system \"${n}\"`));\n      }).catch(r);\n    });\n  }\n  selectKeySystemFormat(e) {\n    const t = Object.keys(e.levelkeys || {});\n    return this.keyFormatPromise || (this.log(`Selecting key-system from fragment (sn: ${e.sn} ${e.type}: ${e.level}) key formats ${t.join(\", \")}`), this.keyFormatPromise = this.getKeyFormatPromise(t)), this.keyFormatPromise;\n  }\n  getKeyFormatPromise(e) {\n    const t = zn(this.config), r = e.map(po).filter((n) => !!n && t.indexOf(n) !== -1);\n    return this.selectKeySystem(r);\n  }\n  getKeyStatus(e) {\n    const {\n      mediaKeySessions: t\n    } = this;\n    for (let r = 0; r < t.length; r++) {\n      const n = lw(e, t[r]);\n      if (n)\n        return n;\n    }\n  }\n  loadKey(e) {\n    const t = e.keyInfo.decryptdata, r = Ji(t), n = this.bannedKeyIds[r];\n    if (n || this.getKeyStatus(t) === \"internal-error\") {\n      const a = Zh(n || \"internal-error\", t);\n      return this.handleError(a, e.frag), Promise.reject(a);\n    }\n    const i = `(keyId: ${r} format: \"${t.keyFormat}\" method: ${t.method} uri: ${t.uri})`;\n    this.log(`Starting session for key ${i}`);\n    const o = this.keyIdToKeySessionPromise[r];\n    if (!o) {\n      const a = this.getKeySystemForKeyPromise(t).then(({\n        keySystem: l,\n        mediaKeys: c\n      }) => (this.throwIfDestroyed(), this.log(`Handle encrypted media sn: ${e.frag.sn} ${e.frag.type}: ${e.frag.level} using key ${i}`), this.attemptSetMediaKeys(l, c).then(() => (this.throwIfDestroyed(), this.createMediaKeySessionContext({\n        keySystem: l,\n        mediaKeys: c,\n        decryptdata: t\n      }))))).then((l) => {\n        const c = \"cenc\", u = t.pssh ? t.pssh.buffer : null;\n        return this.generateRequestWithPreferredKeySession(l, c, u, \"playlist-key\");\n      });\n      return a.catch((l) => this.handleError(l, e.frag)), this.keyIdToKeySessionPromise[r] = a, a;\n    }\n    return o.catch((a) => {\n      if (a instanceof yr) {\n        const l = tt({}, a.data);\n        this.getKeyStatus(t) === \"internal-error\" && (l.decryptdata = t);\n        const c = new yr(l, a.message);\n        this.handleError(c, e.frag);\n      }\n    }), o;\n  }\n  throwIfDestroyed(e = \"Invalid state\") {\n    if (!this.hls)\n      throw new Error(\"invalid state\");\n  }\n  handleError(e, t) {\n    if (this.hls)\n      if (e instanceof yr) {\n        t && (e.data.frag = t);\n        const r = e.data.decryptdata;\n        this.error(`${e.message}${r ? ` (${fr(r.keyId || [])})` : \"\"}`), this.hls.trigger(I.ERROR, e.data);\n      } else\n        this.error(e.message), this.hls.trigger(I.ERROR, {\n          type: ve.KEY_SYSTEM_ERROR,\n          details: J.KEY_SYSTEM_NO_KEYS,\n          error: e,\n          fatal: !0\n        });\n  }\n  getKeySystemForKeyPromise(e) {\n    const t = Ji(e), r = this.keyIdToKeySessionPromise[t];\n    if (!r) {\n      const n = po(e.keyFormat), i = n ? [n] : zn(this.config);\n      return this.attemptKeySystemAccess(i);\n    }\n    return r;\n  }\n  getKeySystemSelectionPromise(e) {\n    if (e.length || (e = zn(this.config)), e.length === 0)\n      throw new yr({\n        type: ve.KEY_SYSTEM_ERROR,\n        details: J.KEY_SYSTEM_NO_CONFIGURED_LICENSE,\n        fatal: !0\n      }, `Missing key-system license configuration options ${at({\n        drmSystems: this.config.drmSystems\n      })}`);\n    return this.attemptKeySystemAccess(e);\n  }\n  attemptSetMediaKeys(e, t) {\n    if (this.mediaKeys === t)\n      return Promise.resolve();\n    const r = this.setMediaKeysQueue.slice();\n    this.log(`Setting media-keys for \"${e}\"`);\n    const n = Promise.all(r).then(() => {\n      if (!this.media)\n        throw this.mediaKeys = null, new Error(\"Attempted to set mediaKeys without media element attached\");\n      return this.media.setMediaKeys(t);\n    });\n    return this.mediaKeys = t, this.setMediaKeysQueue.push(n), n.then(() => {\n      this.log(`Media-keys set for \"${e}\"`), r.push(n), this.setMediaKeysQueue = this.setMediaKeysQueue.filter((i) => r.indexOf(i) === -1);\n    });\n  }\n  generateRequestWithPreferredKeySession(e, t, r, n) {\n    var i;\n    const o = (i = this.config.drmSystems) == null || (i = i[e.keySystem]) == null ? void 0 : i.generateRequest;\n    if (o)\n      try {\n        const p = o.call(this.hls, t, r, e);\n        if (!p)\n          throw new Error(\"Invalid response from configured generateRequest filter\");\n        t = p.initDataType, r = p.initData ? p.initData : null, e.decryptdata.pssh = r ? new Uint8Array(r) : null;\n      } catch (p) {\n        if (this.warn(p.message), this.hls && this.hls.config.debug)\n          throw p;\n      }\n    if (r === null)\n      return this.log(`Skipping key-session request for \"${n}\" (no initData)`), Promise.resolve(e);\n    const a = Ji(e.decryptdata), l = e.decryptdata.uri;\n    this.log(`Generating key-session request for \"${n}\" keyId: ${a} URI: ${l} (init data type: ${t} length: ${r.byteLength})`);\n    const c = new wu(), u = e._onmessage = (p) => {\n      const y = e.mediaKeysSession;\n      if (!y) {\n        c.emit(\"error\", new Error(\"invalid state\"));\n        return;\n      }\n      const {\n        messageType: E,\n        message: b\n      } = p;\n      this.log(`\"${E}\" message event for session \"${y.sessionId}\" message size: ${b.byteLength}`), E === \"license-request\" || E === \"license-renewal\" ? this.renewLicense(e, b).catch((R) => {\n        c.eventNames().length ? c.emit(\"error\", R) : this.handleError(R);\n      }) : E === \"license-release\" ? e.keySystem === mt.FAIRPLAY && this.updateKeySession(e, hc(\"acknowledged\")).then(() => this.removeSession(e)).catch((R) => this.handleError(R)) : this.warn(`unhandled media key message type \"${E}\"`);\n    }, d = (p, y) => {\n      y.keyStatus = p;\n      let E;\n      p.startsWith(\"usable\") ? c.emit(\"resolved\") : p === \"internal-error\" || p === \"output-restricted\" || p === \"output-downscaled\" ? E = Zh(p, y.decryptdata) : p === \"expired\" ? E = new Error(`key expired (keyId: ${a})`) : p === \"released\" ? E = new Error(\"key released\") : p === \"status-pending\" || this.warn(`unhandled key status change \"${p}\" (keyId: ${a})`), E && (c.eventNames().length ? c.emit(\"error\", E) : this.handleError(E));\n    }, h = e._onkeystatuseschange = (p) => {\n      if (!e.mediaKeysSession) {\n        c.emit(\"error\", new Error(\"invalid state\"));\n        return;\n      }\n      const E = this.getKeyStatuses(e);\n      if (!Object.keys(E).some((F) => E[F] !== \"status-pending\"))\n        return;\n      if (E[a] === \"expired\") {\n        this.log(`Expired key ${at(E)} in key-session \"${e.mediaKeysSession.sessionId}\"`), this.renewKeySession(e);\n        return;\n      }\n      let R = E[a];\n      if (R)\n        d(R, e);\n      else {\n        var A;\n        e.keyStatusTimeouts || (e.keyStatusTimeouts = {}), (A = e.keyStatusTimeouts)[a] || (A[a] = self.setTimeout(() => {\n          if (!e.mediaKeysSession || !this.mediaKeys)\n            return;\n          const M = this.getKeyStatus(e.decryptdata);\n          if (M && M !== \"status-pending\")\n            return this.log(`No status for keyId ${a} in key-session \"${e.mediaKeysSession.sessionId}\". Using session key-status ${M} from other session.`), d(M, e);\n          this.log(`key status for ${a} in key-session \"${e.mediaKeysSession.sessionId}\" timed out after 0ms`), R = \"internal-error\", d(R, e);\n        }, 0)), this.log(`No status for keyId ${a} (${at(E)}).`);\n      }\n    };\n    cr(e.mediaKeysSession, \"message\", u), cr(e.mediaKeysSession, \"keystatuseschange\", h);\n    const f = new Promise((p, y) => {\n      c.on(\"error\", y), c.on(\"resolved\", p);\n    });\n    return e.mediaKeysSession.generateRequest(t, r).then(() => {\n      this.log(`Request generated for key-session \"${e.mediaKeysSession.sessionId}\" keyId: ${a} URI: ${l}`);\n    }).catch((p) => {\n      throw new yr({\n        type: ve.KEY_SYSTEM_ERROR,\n        details: J.KEY_SYSTEM_NO_SESSION,\n        error: p,\n        decryptdata: e.decryptdata,\n        fatal: !1\n      }, `Error generating key-session request: ${p}`);\n    }).then(() => f).catch((p) => (c.removeAllListeners(), this.removeSession(e).then(() => {\n      throw p;\n    }))).then(() => (c.removeAllListeners(), e));\n  }\n  getKeyStatuses(e) {\n    const t = {};\n    return e.mediaKeysSession.keyStatuses.forEach((r, n) => {\n      if (typeof n == \"string\" && typeof r == \"object\") {\n        const a = n;\n        n = r, r = a;\n      }\n      const i = \"buffer\" in n ? new Uint8Array(n.buffer, n.byteOffset, n.byteLength) : new Uint8Array(n);\n      e.keySystem === mt.PLAYREADY && i.length === 16 && zg(i);\n      const o = fr(i);\n      r === \"internal-error\" && (this.bannedKeyIds[o] = r), this.log(`key status change \"${r}\" for keyStatuses keyId: ${o} key-session \"${e.mediaKeysSession.sessionId}\"`), t[o] = r;\n    }), t;\n  }\n  fetchServerCertificate(e) {\n    const t = this.config, r = t.loader, n = new r(t), i = this.getServerCertificateUrl(e);\n    return i ? (this.log(`Fetching server certificate for \"${e}\"`), new Promise((o, a) => {\n      const l = {\n        responseType: \"arraybuffer\",\n        url: i\n      }, c = t.certLoadPolicy.default, u = {\n        loadPolicy: c,\n        timeout: c.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0\n      }, d = {\n        onSuccess: (h, f, p, y) => {\n          o(h.data);\n        },\n        onError: (h, f, p, y) => {\n          a(new yr({\n            type: ve.KEY_SYSTEM_ERROR,\n            details: J.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,\n            fatal: !0,\n            networkDetails: p,\n            response: tt({\n              url: l.url,\n              data: void 0\n            }, h)\n          }, `\"${e}\" certificate request failed (${i}). Status: ${h.code} (${h.text})`));\n        },\n        onTimeout: (h, f, p) => {\n          a(new yr({\n            type: ve.KEY_SYSTEM_ERROR,\n            details: J.KEY_SYSTEM_SERVER_CERTIFICATE_REQUEST_FAILED,\n            fatal: !0,\n            networkDetails: p,\n            response: {\n              url: l.url,\n              data: void 0\n            }\n          }, `\"${e}\" certificate request timed out (${i})`));\n        },\n        onAbort: (h, f, p) => {\n          a(new Error(\"aborted\"));\n        }\n      };\n      n.load(l, u, d);\n    })) : Promise.resolve();\n  }\n  setMediaKeysServerCertificate(e, t, r) {\n    return new Promise((n, i) => {\n      e.setServerCertificate(r).then((o) => {\n        this.log(`setServerCertificate ${o ? \"success\" : \"not supported by CDM\"} (${r.byteLength}) on \"${t}\"`), n(e);\n      }).catch((o) => {\n        i(new yr({\n          type: ve.KEY_SYSTEM_ERROR,\n          details: J.KEY_SYSTEM_SERVER_CERTIFICATE_UPDATE_FAILED,\n          error: o,\n          fatal: !0\n        }, o.message));\n      });\n    });\n  }\n  renewLicense(e, t) {\n    return this.requestLicense(e, new Uint8Array(t)).then((r) => this.updateKeySession(e, new Uint8Array(r)).catch((n) => {\n      throw new yr({\n        type: ve.KEY_SYSTEM_ERROR,\n        details: J.KEY_SYSTEM_SESSION_UPDATE_FAILED,\n        decryptdata: e.decryptdata,\n        error: n,\n        fatal: !1\n      }, n.message);\n    }));\n  }\n  unpackPlayReadyKeyMessage(e, t) {\n    const r = String.fromCharCode.apply(null, new Uint16Array(t.buffer));\n    if (!r.includes(\"PlayReadyKeyMessage\"))\n      return e.setRequestHeader(\"Content-Type\", \"text/xml; charset=utf-8\"), t;\n    const n = new DOMParser().parseFromString(r, \"application/xml\"), i = n.querySelectorAll(\"HttpHeader\");\n    if (i.length > 0) {\n      let u;\n      for (let d = 0, h = i.length; d < h; d++) {\n        var o, a;\n        u = i[d];\n        const f = (o = u.querySelector(\"name\")) == null ? void 0 : o.textContent, p = (a = u.querySelector(\"value\")) == null ? void 0 : a.textContent;\n        f && p && e.setRequestHeader(f, p);\n      }\n    }\n    const l = n.querySelector(\"Challenge\"), c = l == null ? void 0 : l.textContent;\n    if (!c)\n      throw new Error(\"Cannot find <Challenge> in key message\");\n    return hc(atob(c));\n  }\n  setupLicenseXHR(e, t, r, n) {\n    const i = this.config.licenseXhrSetup;\n    return i ? Promise.resolve().then(() => {\n      if (!r.decryptdata)\n        throw new Error(\"Key removed\");\n      return i.call(this.hls, e, t, r, n);\n    }).catch((o) => {\n      if (!r.decryptdata)\n        throw o;\n      return e.open(\"POST\", t, !0), i.call(this.hls, e, t, r, n);\n    }).then((o) => (e.readyState || e.open(\"POST\", t, !0), {\n      xhr: e,\n      licenseChallenge: o || n\n    })) : (e.open(\"POST\", t, !0), Promise.resolve({\n      xhr: e,\n      licenseChallenge: n\n    }));\n  }\n  requestLicense(e, t) {\n    const r = this.config.keyLoadPolicy.default;\n    return new Promise((n, i) => {\n      const o = this.getLicenseServerUrlOrThrow(e.keySystem);\n      this.log(`Sending license request to URL: ${o}`);\n      const a = new XMLHttpRequest();\n      a.responseType = \"arraybuffer\", a.onreadystatechange = () => {\n        if (!this.hls || !e.mediaKeysSession)\n          return i(new Error(\"invalid state\"));\n        if (a.readyState === 4)\n          if (a.status === 200) {\n            this._requestLicenseFailureCount = 0;\n            let l = a.response;\n            this.log(`License received ${l instanceof ArrayBuffer ? l.byteLength : l}`);\n            const c = this.config.licenseResponseCallback;\n            if (c)\n              try {\n                l = c.call(this.hls, a, o, e);\n              } catch (u) {\n                this.error(u);\n              }\n            n(l);\n          } else {\n            const l = r.errorRetry, c = l ? l.maxNumRetry : 0;\n            if (this._requestLicenseFailureCount++, this._requestLicenseFailureCount > c || a.status >= 400 && a.status < 500)\n              i(new yr({\n                type: ve.KEY_SYSTEM_ERROR,\n                details: J.KEY_SYSTEM_LICENSE_REQUEST_FAILED,\n                decryptdata: e.decryptdata,\n                fatal: !0,\n                networkDetails: a,\n                response: {\n                  url: o,\n                  data: void 0,\n                  code: a.status,\n                  text: a.statusText\n                }\n              }, `License Request XHR failed (${o}). Status: ${a.status} (${a.statusText})`));\n            else {\n              const u = c - this._requestLicenseFailureCount + 1;\n              this.warn(`Retrying license request, ${u} attempts left`), this.requestLicense(e, t).then(n, i);\n            }\n          }\n      }, e.licenseXhr && e.licenseXhr.readyState !== XMLHttpRequest.DONE && e.licenseXhr.abort(), e.licenseXhr = a, this.setupLicenseXHR(a, o, e, t).then(({\n        xhr: l,\n        licenseChallenge: c\n      }) => {\n        e.keySystem == mt.PLAYREADY && (c = this.unpackPlayReadyKeyMessage(l, c)), l.send(c);\n      }).catch(i);\n    });\n  }\n  onDestroying() {\n    this.unregisterListeners(), this._clear();\n  }\n  onMediaAttached(e, t) {\n    if (!this.config.emeEnabled)\n      return;\n    const r = t.media;\n    this.media = r, cr(r, \"encrypted\", this.onMediaEncrypted), cr(r, \"waitingforkey\", this.onWaitingForKey);\n  }\n  onMediaDetached() {\n    const e = this.media;\n    e && (pr(e, \"encrypted\", this.onMediaEncrypted), pr(e, \"waitingforkey\", this.onWaitingForKey), this.media = null, this.mediaKeys = null);\n  }\n  _clear() {\n    var e;\n    if (this._requestLicenseFailureCount = 0, this.keyIdToKeySessionPromise = {}, this.bannedKeyIds = {}, !this.mediaKeys && !this.mediaKeySessions.length)\n      return;\n    const t = this.media, r = this.mediaKeySessions.slice();\n    this.mediaKeySessions = [], this.mediaKeys = null, yi.clearKeyUriToKeyIdMap();\n    const n = r.length;\n    _n.CDMCleanupPromise = Promise.all(r.map((i) => this.removeSession(i)).concat((t == null || (e = t.setMediaKeys(null)) == null ? void 0 : e.catch((i) => {\n      this.log(`Could not clear media keys: ${i}`), this.hls && this.hls.trigger(I.ERROR, {\n        type: ve.OTHER_ERROR,\n        details: J.KEY_SYSTEM_DESTROY_MEDIA_KEYS_ERROR,\n        fatal: !1,\n        error: new Error(`Could not clear media keys: ${i}`)\n      });\n    })) || Promise.resolve())).catch((i) => {\n      this.log(`Could not close sessions and clear media keys: ${i}`), this.hls && this.hls.trigger(I.ERROR, {\n        type: ve.OTHER_ERROR,\n        details: J.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR,\n        fatal: !1,\n        error: new Error(`Could not close sessions and clear media keys: ${i}`)\n      });\n    }).then(() => {\n      n && this.log(\"finished closing key sessions and clearing media keys\");\n    });\n  }\n  onManifestLoading() {\n    this.keyFormatPromise = null, this.bannedKeyIds = {};\n  }\n  onManifestLoaded(e, {\n    sessionKeys: t\n  }) {\n    if (!(!t || !this.config.emeEnabled) && !this.keyFormatPromise) {\n      const r = t.reduce((n, i) => (n.indexOf(i.keyFormat) === -1 && n.push(i.keyFormat), n), []);\n      this.log(`Selecting key-system from session-keys ${r.join(\", \")}`), this.keyFormatPromise = this.getKeyFormatPromise(r);\n    }\n  }\n  removeSession(e) {\n    const {\n      mediaKeysSession: t,\n      licenseXhr: r,\n      decryptdata: n\n    } = e;\n    if (t) {\n      this.log(`Remove licenses and keys and close session \"${t.sessionId}\" keyId: ${fr((n == null ? void 0 : n.keyId) || [])}`), e._onmessage && (t.removeEventListener(\"message\", e._onmessage), e._onmessage = void 0), e._onkeystatuseschange && (t.removeEventListener(\"keystatuseschange\", e._onkeystatuseschange), e._onkeystatuseschange = void 0), r && r.readyState !== XMLHttpRequest.DONE && r.abort(), e.mediaKeysSession = e.decryptdata = e.licenseXhr = void 0;\n      const i = this.mediaKeySessions.indexOf(e);\n      i > -1 && this.mediaKeySessions.splice(i, 1);\n      const {\n        keyStatusTimeouts: o\n      } = e;\n      o && Object.keys(o).forEach((c) => self.clearTimeout(o[c]));\n      const {\n        drmSystemOptions: a\n      } = this.config;\n      return (jb(a) ? new Promise((c, u) => {\n        self.setTimeout(() => u(new Error(\"MediaKeySession.remove() timeout\")), 8e3), t.remove().then(c).catch(u);\n      }) : Promise.resolve()).catch((c) => {\n        this.log(`Could not remove session: ${c}`), this.hls && this.hls.trigger(I.ERROR, {\n          type: ve.OTHER_ERROR,\n          details: J.KEY_SYSTEM_DESTROY_REMOVE_SESSION_ERROR,\n          fatal: !1,\n          error: new Error(`Could not remove session: ${c}`)\n        });\n      }).then(() => t.close()).catch((c) => {\n        this.log(`Could not close session: ${c}`), this.hls && this.hls.trigger(I.ERROR, {\n          type: ve.OTHER_ERROR,\n          details: J.KEY_SYSTEM_DESTROY_CLOSE_SESSION_ERROR,\n          fatal: !1,\n          error: new Error(`Could not close session: ${c}`)\n        });\n      });\n    }\n    return Promise.resolve();\n  }\n}\n_n.CDMCleanupPromise = void 0;\nfunction Ji(s) {\n  if (!s)\n    throw new Error(\"Could not read keyId of undefined decryptdata\");\n  if (s.keyId === null)\n    throw new Error(\"keyId is null\");\n  return fr(s.keyId);\n}\nfunction lw(s, e) {\n  if (s.keyId && e.mediaKeysSession.keyStatuses.has(s.keyId))\n    return e.mediaKeysSession.keyStatuses.get(s.keyId);\n  if (s.matches(e.decryptdata))\n    return e.keyStatus;\n}\nclass yr extends Error {\n  constructor(e, t) {\n    super(t), this.data = void 0, e.error || (e.error = new Error(t)), this.data = e, e.err = e.error;\n  }\n}\nfunction Zh(s, e) {\n  const t = s === \"output-restricted\", r = t ? J.KEY_SYSTEM_STATUS_OUTPUT_RESTRICTED : J.KEY_SYSTEM_STATUS_INTERNAL_ERROR;\n  return new yr({\n    type: ve.KEY_SYSTEM_ERROR,\n    details: r,\n    fatal: !1,\n    decryptdata: e\n  }, t ? \"HDCP level output restricted\" : `key status changed to \"${s}\"`);\n}\nclass cw {\n  constructor(e) {\n    this.hls = void 0, this.isVideoPlaybackQualityAvailable = !1, this.timer = void 0, this.media = null, this.lastTime = void 0, this.lastDroppedFrames = 0, this.lastDecodedFrames = 0, this.streamController = void 0, this.hls = e, this.registerListeners();\n  }\n  setStreamController(e) {\n    this.streamController = e;\n  }\n  registerListeners() {\n    this.hls.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), this.hls.on(I.MEDIA_DETACHING, this.onMediaDetaching, this);\n  }\n  unregisterListeners() {\n    this.hls.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), this.hls.off(I.MEDIA_DETACHING, this.onMediaDetaching, this);\n  }\n  destroy() {\n    this.timer && clearInterval(this.timer), this.unregisterListeners(), this.isVideoPlaybackQualityAvailable = !1, this.media = null;\n  }\n  onMediaAttaching(e, t) {\n    const r = this.hls.config;\n    if (r.capLevelOnFPSDrop) {\n      const n = t.media instanceof self.HTMLVideoElement ? t.media : null;\n      this.media = n, n && typeof n.getVideoPlaybackQuality == \"function\" && (this.isVideoPlaybackQualityAvailable = !0), self.clearInterval(this.timer), this.timer = self.setInterval(this.checkFPSInterval.bind(this), r.fpsDroppedMonitoringPeriod);\n    }\n  }\n  onMediaDetaching() {\n    this.media = null;\n  }\n  checkFPS(e, t, r) {\n    const n = performance.now();\n    if (t) {\n      if (this.lastTime) {\n        const i = n - this.lastTime, o = r - this.lastDroppedFrames, a = t - this.lastDecodedFrames, l = 1e3 * o / i, c = this.hls;\n        if (c.trigger(I.FPS_DROP, {\n          currentDropped: o,\n          currentDecoded: a,\n          totalDroppedFrames: r\n        }), l > 0 && o > c.config.fpsDroppedMonitoringThreshold * a) {\n          let u = c.currentLevel;\n          c.logger.warn(\"drop FPS ratio greater than max allowed value for currentLevel: \" + u), u > 0 && (c.autoLevelCapping === -1 || c.autoLevelCapping >= u) && (u = u - 1, c.trigger(I.FPS_DROP_LEVEL_CAPPING, {\n            level: u,\n            droppedLevel: c.currentLevel\n          }), c.autoLevelCapping = u, this.streamController.nextLevelSwitch());\n        }\n      }\n      this.lastTime = n, this.lastDroppedFrames = r, this.lastDecodedFrames = t;\n    }\n  }\n  checkFPSInterval() {\n    const e = this.media;\n    if (e)\n      if (this.isVideoPlaybackQualityAvailable) {\n        const t = e.getVideoPlaybackQuality();\n        this.checkFPS(e, t.totalVideoFrames, t.droppedVideoFrames);\n      } else\n        this.checkFPS(e, e.webkitDecodedFrameCount, e.webkitDroppedFrameCount);\n  }\n}\nfunction Np(s, e) {\n  let t;\n  try {\n    t = new Event(\"addtrack\");\n  } catch {\n    t = document.createEvent(\"Event\"), t.initEvent(\"addtrack\", !1, !1);\n  }\n  t.track = s, e.dispatchEvent(t);\n}\nfunction Up(s, e) {\n  const t = s.mode;\n  if (t === \"disabled\" && (s.mode = \"hidden\"), s.cues && !s.cues.getCueById(e.id))\n    try {\n      if (s.addCue(e), !s.cues.getCueById(e.id))\n        throw new Error(`addCue is failed for: ${e}`);\n    } catch (r) {\n      rt.debug(`[texttrack-utils]: ${r}`);\n      try {\n        const n = new self.TextTrackCue(e.startTime, e.endTime, e.text);\n        n.id = e.id, s.addCue(n);\n      } catch (n) {\n        rt.debug(`[texttrack-utils]: Legacy TextTrackCue fallback failed: ${n}`);\n      }\n    }\n  t === \"disabled\" && (s.mode = t);\n}\nfunction Sn(s, e) {\n  const t = s.mode;\n  if (t === \"disabled\" && (s.mode = \"hidden\"), s.cues)\n    for (let r = s.cues.length; r--; )\n      e && s.cues[r].removeEventListener(\"enter\", e), s.removeCue(s.cues[r]);\n  t === \"disabled\" && (s.mode = t);\n}\nfunction Sc(s, e, t, r) {\n  const n = s.mode;\n  if (n === \"disabled\" && (s.mode = \"hidden\"), s.cues && s.cues.length > 0) {\n    const i = dw(s.cues, e, t);\n    for (let o = 0; o < i.length; o++)\n      (!r || r(i[o])) && s.removeCue(i[o]);\n  }\n  n === \"disabled\" && (s.mode = n);\n}\nfunction uw(s, e) {\n  if (e <= s[0].startTime)\n    return 0;\n  const t = s.length - 1;\n  if (e > s[t].endTime)\n    return -1;\n  let r = 0, n = t, i;\n  for (; r <= n; )\n    if (i = Math.floor((n + r) / 2), e < s[i].startTime)\n      n = i - 1;\n    else if (e > s[i].startTime && r < t)\n      r = i + 1;\n    else\n      return i;\n  return s[r].startTime - e < e - s[n].startTime ? r : n;\n}\nfunction dw(s, e, t) {\n  const r = [], n = uw(s, e);\n  if (n > -1)\n    for (let i = n, o = s.length; i < o; i++) {\n      const a = s[i];\n      if (a.startTime >= e && a.endTime <= t)\n        r.push(a);\n      else if (a.startTime > t)\n        return r;\n    }\n  return r;\n}\nfunction Eo(s) {\n  const e = [];\n  for (let t = 0; t < s.length; t++) {\n    const r = s[t];\n    (r.kind === \"subtitles\" || r.kind === \"captions\") && r.label && e.push(s[t]);\n  }\n  return e;\n}\nclass hw extends ku {\n  constructor(e) {\n    super(e, \"subtitle-track-controller\"), this.media = null, this.tracks = [], this.groupIds = null, this.tracksInGroup = [], this.trackId = -1, this.currentTrack = null, this.selectDefaultTrack = !0, this.queuedDefaultTrack = -1, this.useTextTrackPolling = !1, this.subtitlePollingInterval = -1, this._subtitleDisplay = !0, this.asyncPollTrackChange = () => this.pollTrackChange(0), this.onTextTracksChanged = () => {\n      if (this.useTextTrackPolling || self.clearInterval(this.subtitlePollingInterval), !this.media || !this.hls.config.renderTextTracksNatively)\n        return;\n      let t = null;\n      const r = Eo(this.media.textTracks);\n      for (let i = 0; i < r.length; i++)\n        if (r[i].mode === \"hidden\")\n          t = r[i];\n        else if (r[i].mode === \"showing\") {\n          t = r[i];\n          break;\n        }\n      const n = this.findTrackForTextTrack(t);\n      this.subtitleTrack !== n && this.setSubtitleTrack(n);\n    }, this.registerListeners();\n  }\n  destroy() {\n    this.unregisterListeners(), this.tracks.length = 0, this.tracksInGroup.length = 0, this.currentTrack = null, this.onTextTracksChanged = this.asyncPollTrackChange = null, super.destroy();\n  }\n  get subtitleDisplay() {\n    return this._subtitleDisplay;\n  }\n  set subtitleDisplay(e) {\n    this._subtitleDisplay = e, this.trackId > -1 && this.toggleTrackModes();\n  }\n  registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.LEVEL_LOADING, this.onLevelLoading, this), e.on(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.on(I.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this), e.on(I.ERROR, this.onError, this);\n  }\n  unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.LEVEL_LOADING, this.onLevelLoading, this), e.off(I.LEVEL_SWITCHING, this.onLevelSwitching, this), e.off(I.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this), e.off(I.ERROR, this.onError, this);\n  }\n  // Listen for subtitle track change, then extract the current track ID.\n  onMediaAttached(e, t) {\n    this.media = t.media, this.media && (this.queuedDefaultTrack > -1 && (this.subtitleTrack = this.queuedDefaultTrack, this.queuedDefaultTrack = -1), this.useTextTrackPolling = !(this.media.textTracks && \"onchange\" in this.media.textTracks), this.useTextTrackPolling ? this.pollTrackChange(500) : this.media.textTracks.addEventListener(\"change\", this.asyncPollTrackChange));\n  }\n  pollTrackChange(e) {\n    self.clearInterval(this.subtitlePollingInterval), this.subtitlePollingInterval = self.setInterval(this.onTextTracksChanged, e);\n  }\n  onMediaDetaching(e, t) {\n    const r = this.media;\n    if (!r)\n      return;\n    const n = !!t.transferMedia;\n    if (self.clearInterval(this.subtitlePollingInterval), this.useTextTrackPolling || r.textTracks.removeEventListener(\"change\", this.asyncPollTrackChange), this.trackId > -1 && (this.queuedDefaultTrack = this.trackId), this.subtitleTrack = -1, this.media = null, n)\n      return;\n    Eo(r.textTracks).forEach((o) => {\n      Sn(o);\n    });\n  }\n  onManifestLoading() {\n    this.tracks = [], this.groupIds = null, this.tracksInGroup = [], this.trackId = -1, this.currentTrack = null, this.selectDefaultTrack = !0;\n  }\n  // Fired whenever a new manifest is loaded.\n  onManifestParsed(e, t) {\n    this.tracks = t.subtitleTracks;\n  }\n  onSubtitleTrackLoaded(e, t) {\n    const {\n      id: r,\n      groupId: n,\n      details: i\n    } = t, o = this.tracksInGroup[r];\n    if (!o || o.groupId !== n) {\n      this.warn(`Subtitle track with id:${r} and group:${n} not found in active group ${o == null ? void 0 : o.groupId}`);\n      return;\n    }\n    const a = o.details;\n    o.details = t.details, this.log(`Subtitle track ${r} \"${o.name}\" lang:${o.lang} group:${n} loaded [${i.startSN}-${i.endSN}]`), r === this.trackId && this.playlistLoaded(r, t, a);\n  }\n  onLevelLoading(e, t) {\n    this.switchLevel(t.level);\n  }\n  onLevelSwitching(e, t) {\n    this.switchLevel(t.level);\n  }\n  switchLevel(e) {\n    const t = this.hls.levels[e];\n    if (!t)\n      return;\n    const r = t.subtitleGroups || null, n = this.groupIds;\n    let i = this.currentTrack;\n    if (!r || (n == null ? void 0 : n.length) !== (r == null ? void 0 : r.length) || r != null && r.some((o) => (n == null ? void 0 : n.indexOf(o)) === -1)) {\n      this.groupIds = r, this.trackId = -1, this.currentTrack = null;\n      const o = this.tracks.filter((u) => !r || r.indexOf(u.groupId) !== -1);\n      if (o.length)\n        this.selectDefaultTrack && !o.some((u) => u.default) && (this.selectDefaultTrack = !1), o.forEach((u, d) => {\n          u.id = d;\n        });\n      else if (!i && !this.tracksInGroup.length)\n        return;\n      this.tracksInGroup = o;\n      const a = this.hls.config.subtitlePreference;\n      if (!i && a) {\n        this.selectDefaultTrack = !1;\n        const u = Wr(a, o);\n        if (u > -1)\n          i = o[u];\n        else {\n          const d = Wr(a, this.tracks);\n          i = this.tracks[d];\n        }\n      }\n      let l = this.findTrackId(i);\n      l === -1 && i && (l = this.findTrackId(null));\n      const c = {\n        subtitleTracks: o\n      };\n      this.log(`Updating subtitle tracks, ${o.length} track(s) found in \"${r == null ? void 0 : r.join(\",\")}\" group-id`), this.hls.trigger(I.SUBTITLE_TRACKS_UPDATED, c), l !== -1 && this.trackId === -1 && this.setSubtitleTrack(l);\n    }\n  }\n  findTrackId(e) {\n    const t = this.tracksInGroup, r = this.selectDefaultTrack;\n    for (let n = 0; n < t.length; n++) {\n      const i = t[n];\n      if (!(r && !i.default || !r && !e) && (!e || qs(i, e)))\n        return n;\n    }\n    if (e) {\n      for (let n = 0; n < t.length; n++) {\n        const i = t[n];\n        if (Si(e.attrs, i.attrs, [\"LANGUAGE\", \"ASSOC-LANGUAGE\", \"CHARACTERISTICS\"]))\n          return n;\n      }\n      for (let n = 0; n < t.length; n++) {\n        const i = t[n];\n        if (Si(e.attrs, i.attrs, [\"LANGUAGE\"]))\n          return n;\n      }\n    }\n    return -1;\n  }\n  findTrackForTextTrack(e) {\n    if (e) {\n      const t = this.tracksInGroup;\n      for (let r = 0; r < t.length; r++) {\n        const n = t[r];\n        if (yc(n, e))\n          return r;\n      }\n    }\n    return -1;\n  }\n  onError(e, t) {\n    t.fatal || !t.context || t.context.type === Ke.SUBTITLE_TRACK && t.context.id === this.trackId && (!this.groupIds || this.groupIds.indexOf(t.context.groupId) !== -1) && this.checkRetry(t);\n  }\n  get allSubtitleTracks() {\n    return this.tracks;\n  }\n  /** get alternate subtitle tracks list from playlist **/\n  get subtitleTracks() {\n    return this.tracksInGroup;\n  }\n  /** get/set index of the selected subtitle track (based on index in subtitle track lists) **/\n  get subtitleTrack() {\n    return this.trackId;\n  }\n  set subtitleTrack(e) {\n    this.selectDefaultTrack = !1, this.setSubtitleTrack(e);\n  }\n  setSubtitleOption(e) {\n    if (this.hls.config.subtitlePreference = e, e) {\n      if (e.id === -1)\n        return this.setSubtitleTrack(-1), null;\n      const t = this.allSubtitleTracks;\n      if (this.selectDefaultTrack = !1, t.length) {\n        const r = this.currentTrack;\n        if (r && qs(e, r))\n          return r;\n        const n = Wr(e, this.tracksInGroup);\n        if (n > -1) {\n          const i = this.tracksInGroup[n];\n          return this.setSubtitleTrack(n), i;\n        } else {\n          if (r)\n            return null;\n          {\n            const i = Wr(e, t);\n            if (i > -1)\n              return t[i];\n          }\n        }\n      }\n    }\n    return null;\n  }\n  loadPlaylist(e) {\n    super.loadPlaylist(), this.shouldLoadPlaylist(this.currentTrack) && this.scheduleLoading(this.currentTrack, e);\n  }\n  loadingPlaylist(e, t) {\n    super.loadingPlaylist(e, t);\n    const r = e.id, n = e.groupId, i = this.getUrlWithDirectives(e.url, t), o = e.details, a = o == null ? void 0 : o.age;\n    this.log(`Loading subtitle ${r} \"${e.name}\" lang:${e.lang} group:${n}${(t == null ? void 0 : t.msn) !== void 0 ? \" at sn \" + t.msn + \" part \" + t.part : \"\"}${a && o.live ? \" age \" + a.toFixed(1) + (o.type && \" \" + o.type || \"\") : \"\"} ${i}`), this.hls.trigger(I.SUBTITLE_TRACK_LOADING, {\n      url: i,\n      id: r,\n      groupId: n,\n      deliveryDirectives: t || null,\n      track: e\n    });\n  }\n  /**\n   * Disables the old subtitleTrack and sets current mode on the next subtitleTrack.\n   * This operates on the DOM textTracks.\n   * A value of -1 will disable all subtitle tracks.\n   */\n  toggleTrackModes() {\n    const {\n      media: e\n    } = this;\n    if (!e)\n      return;\n    const t = Eo(e.textTracks), r = this.currentTrack;\n    let n;\n    if (r && (n = t.filter((i) => yc(r, i))[0], n || this.warn(`Unable to find subtitle TextTrack with name \"${r.name}\" and language \"${r.lang}\"`)), [].slice.call(t).forEach((i) => {\n      i.mode !== \"disabled\" && i !== n && (i.mode = \"disabled\");\n    }), n) {\n      const i = this.subtitleDisplay ? \"showing\" : \"hidden\";\n      n.mode !== i && (n.mode = i);\n    }\n  }\n  /**\n   * This method is responsible for validating the subtitle index and periodically reloading if live.\n   * Dispatches the SUBTITLE_TRACK_SWITCH event, which instructs the subtitle-stream-controller to load the selected track.\n   */\n  setSubtitleTrack(e) {\n    const t = this.tracksInGroup;\n    if (!this.media) {\n      this.queuedDefaultTrack = e;\n      return;\n    }\n    if (e < -1 || e >= t.length || !ue(e)) {\n      this.warn(`Invalid subtitle track id: ${e}`);\n      return;\n    }\n    this.selectDefaultTrack = !1;\n    const r = this.currentTrack, n = t[e] || null;\n    if (this.trackId = e, this.currentTrack = n, this.toggleTrackModes(), !n) {\n      this.hls.trigger(I.SUBTITLE_TRACK_SWITCH, {\n        id: e\n      });\n      return;\n    }\n    const i = !!n.details && !n.details.live;\n    if (e === this.trackId && n === r && i)\n      return;\n    this.log(`Switching to subtitle-track ${e}` + (n ? ` \"${n.name}\" lang:${n.lang} group:${n.groupId}` : \"\"));\n    const {\n      id: o,\n      groupId: a = \"\",\n      name: l,\n      type: c,\n      url: u\n    } = n;\n    this.hls.trigger(I.SUBTITLE_TRACK_SWITCH, {\n      id: o,\n      groupId: a,\n      name: l,\n      type: c,\n      url: u\n    });\n    const d = this.switchParams(n.url, r == null ? void 0 : r.details, n.details);\n    this.loadPlaylist(d);\n  }\n}\nfunction fw() {\n  try {\n    return crypto.randomUUID();\n  } catch {\n    try {\n      const e = URL.createObjectURL(new Blob()), t = e.toString();\n      return URL.revokeObjectURL(e), t.slice(t.lastIndexOf(\"/\") + 1);\n    } catch {\n      let t = (/* @__PURE__ */ new Date()).getTime();\n      return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, (n) => {\n        const i = (t + Math.random() * 16) % 16 | 0;\n        return t = Math.floor(t / 16), (n == \"x\" ? i : i & 3 | 8).toString(16);\n      });\n    }\n  }\n}\nfunction Xn(s) {\n  let e = 5381, t = s.length;\n  for (; t; )\n    e = e * 33 ^ s.charCodeAt(--t);\n  return (e >>> 0).toString();\n}\nconst Rn = 0.025;\nlet ia = /* @__PURE__ */ (function(s) {\n  return s[s.Point = 0] = \"Point\", s[s.Range = 1] = \"Range\", s;\n})({});\nfunction gw(s, e, t) {\n  return `${s.identifier}-${t + 1}-${Xn(e)}`;\n}\nclass pw {\n  constructor(e, t) {\n    this.base = void 0, this._duration = null, this._timelineStart = null, this.appendInPlaceDisabled = void 0, this.appendInPlaceStarted = void 0, this.dateRange = void 0, this.hasPlayed = !1, this.cumulativeDuration = 0, this.resumeOffset = NaN, this.playoutLimit = NaN, this.restrictions = {\n      skip: !1,\n      jump: !1\n    }, this.snapOptions = {\n      out: !1,\n      in: !1\n    }, this.assetList = [], this.assetListLoader = void 0, this.assetListResponse = null, this.resumeAnchor = void 0, this.error = void 0, this.resetOnResume = void 0, this.base = t, this.dateRange = e, this.setDateRange(e);\n  }\n  setDateRange(e) {\n    this.dateRange = e, this.resumeOffset = e.attr.optionalFloat(\"X-RESUME-OFFSET\", this.resumeOffset), this.playoutLimit = e.attr.optionalFloat(\"X-PLAYOUT-LIMIT\", this.playoutLimit), this.restrictions = e.attr.enumeratedStringList(\"X-RESTRICT\", this.restrictions), this.snapOptions = e.attr.enumeratedStringList(\"X-SNAP\", this.snapOptions);\n  }\n  reset() {\n    var e;\n    this.appendInPlaceStarted = !1, (e = this.assetListLoader) == null || e.destroy(), this.assetListLoader = void 0, this.supplementsPrimary || (this.assetListResponse = null, this.assetList = [], this._duration = null);\n  }\n  isAssetPastPlayoutLimit(e) {\n    var t;\n    if (e > 0 && e >= this.assetList.length)\n      return !0;\n    const r = this.playoutLimit;\n    return e <= 0 || isNaN(r) ? !1 : r === 0 ? !0 : (((t = this.assetList[e]) == null ? void 0 : t.startOffset) || 0) > r;\n  }\n  findAssetIndex(e) {\n    return this.assetList.indexOf(e);\n  }\n  get identifier() {\n    return this.dateRange.id;\n  }\n  get startDate() {\n    return this.dateRange.startDate;\n  }\n  get startTime() {\n    const e = this.dateRange.startTime;\n    if (this.snapOptions.out) {\n      const t = this.dateRange.tagAnchor;\n      if (t)\n        return bl(e, t);\n    }\n    return e;\n  }\n  get startOffset() {\n    return this.cue.pre ? 0 : this.startTime;\n  }\n  get startIsAligned() {\n    if (this.startTime === 0 || this.snapOptions.out)\n      return !0;\n    const e = this.dateRange.tagAnchor;\n    if (e) {\n      const t = this.dateRange.startTime, r = bl(t, e);\n      return t - r < 0.1;\n    }\n    return !1;\n  }\n  get resumptionOffset() {\n    const e = this.resumeOffset, t = ue(e) ? e : this.duration;\n    return this.cumulativeDuration + t;\n  }\n  get resumeTime() {\n    const e = this.startOffset + this.resumptionOffset;\n    if (this.snapOptions.in) {\n      const t = this.resumeAnchor;\n      if (t)\n        return bl(e, t);\n    }\n    return e;\n  }\n  get appendInPlace() {\n    return this.appendInPlaceStarted ? !0 : this.appendInPlaceDisabled ? !1 : !!(!this.cue.once && !this.cue.pre && // preroll starts at startPosition before startPosition is known (live)\n    this.startIsAligned && (isNaN(this.playoutLimit) && isNaN(this.resumeOffset) || this.resumeOffset && this.duration && Math.abs(this.resumeOffset - this.duration) < Rn));\n  }\n  set appendInPlace(e) {\n    if (this.appendInPlaceStarted) {\n      this.resetOnResume = !e;\n      return;\n    }\n    this.appendInPlaceDisabled = !e;\n  }\n  // Extended timeline start time\n  get timelineStart() {\n    return this._timelineStart !== null ? this._timelineStart : this.startTime;\n  }\n  set timelineStart(e) {\n    this._timelineStart = e;\n  }\n  get duration() {\n    const e = this.playoutLimit;\n    let t;\n    return this._duration !== null ? t = this._duration : this.dateRange.duration ? t = this.dateRange.duration : t = this.dateRange.plannedDuration || 0, !isNaN(e) && e < t && (t = e), t;\n  }\n  set duration(e) {\n    this._duration = e;\n  }\n  get cue() {\n    return this.dateRange.cue;\n  }\n  get timelineOccupancy() {\n    return this.dateRange.attr[\"X-TIMELINE-OCCUPIES\"] === \"RANGE\" ? ia.Range : ia.Point;\n  }\n  get supplementsPrimary() {\n    return this.dateRange.attr[\"X-TIMELINE-STYLE\"] === \"PRIMARY\";\n  }\n  get contentMayVary() {\n    return this.dateRange.attr[\"X-CONTENT-MAY-VARY\"] !== \"NO\";\n  }\n  get assetUrl() {\n    return this.dateRange.attr[\"X-ASSET-URI\"];\n  }\n  get assetListUrl() {\n    return this.dateRange.attr[\"X-ASSET-LIST\"];\n  }\n  get baseUrl() {\n    return this.base.url;\n  }\n  get assetListLoaded() {\n    return this.assetList.length > 0 || this.assetListResponse !== null;\n  }\n  toString() {\n    return mw(this);\n  }\n}\nfunction bl(s, e) {\n  return s - e.start < e.duration / 2 && !(Math.abs(s - (e.start + e.duration)) < Rn) ? e.start : e.start + e.duration;\n}\nfunction $p(s, e, t) {\n  const r = new self.URL(s, t);\n  return r.protocol !== \"data:\" && r.searchParams.set(\"_HLS_primary_id\", e), r;\n}\nfunction Tl(s, e) {\n  for (; (t = s.assetList[++e]) != null && t.error; )\n    var t;\n  return e;\n}\nfunction mw(s) {\n  return `[\"${s.identifier}\" ${s.cue.pre ? \"<pre>\" : s.cue.post ? \"<post>\" : \"\"}${s.timelineStart.toFixed(2)}-${s.resumeTime.toFixed(2)}]`;\n}\nfunction vn(s) {\n  const e = s.timelineStart, t = s.duration || 0;\n  return `[\"${s.identifier}\" ${e.toFixed(2)}-${(e + t).toFixed(2)}]`;\n}\nclass yw {\n  constructor(e, t, r, n) {\n    this.hls = void 0, this.interstitial = void 0, this.assetItem = void 0, this.tracks = null, this.hasDetails = !1, this.mediaAttached = null, this._currentTime = void 0, this._bufferedEosTime = void 0, this.checkPlayout = () => {\n      this.reachedPlayout(this.currentTime) && this.hls && this.hls.trigger(I.PLAYOUT_LIMIT_REACHED, {});\n    };\n    const i = this.hls = new e(t);\n    this.interstitial = r, this.assetItem = n;\n    const o = () => {\n      this.hasDetails = !0;\n    };\n    i.once(I.LEVEL_LOADED, o), i.once(I.AUDIO_TRACK_LOADED, o), i.once(I.SUBTITLE_TRACK_LOADED, o), i.on(I.MEDIA_ATTACHING, (a, {\n      media: l\n    }) => {\n      this.removeMediaListeners(), this.mediaAttached = l, this.interstitial.playoutLimit && (l.addEventListener(\"timeupdate\", this.checkPlayout), this.appendInPlace && i.on(I.BUFFER_APPENDED, () => {\n        const u = this.bufferedEnd;\n        this.reachedPlayout(u) && (this._bufferedEosTime = u, i.trigger(I.BUFFERED_TO_END, void 0));\n      }));\n    });\n  }\n  get appendInPlace() {\n    return this.interstitial.appendInPlace;\n  }\n  loadSource() {\n    const e = this.hls;\n    if (e)\n      if (e.url)\n        e.levels.length && !e.started && e.startLoad(-1, !0);\n      else {\n        let t = this.assetItem.uri;\n        try {\n          t = $p(t, e.config.primarySessionId || \"\").href;\n        } catch {\n        }\n        e.loadSource(t);\n      }\n  }\n  bufferedInPlaceToEnd(e) {\n    var t;\n    if (!this.appendInPlace)\n      return !1;\n    if ((t = this.hls) != null && t.bufferedToEnd)\n      return !0;\n    if (!e)\n      return !1;\n    const r = Math.min(this._bufferedEosTime || 1 / 0, this.duration), n = this.timelineOffset, i = Ce.bufferInfo(e, n, 0);\n    return this.getAssetTime(i.end) >= r - 0.02;\n  }\n  reachedPlayout(e) {\n    const r = this.interstitial.playoutLimit;\n    return this.startOffset + e >= r;\n  }\n  get destroyed() {\n    var e;\n    return !((e = this.hls) != null && e.userConfig);\n  }\n  get assetId() {\n    return this.assetItem.identifier;\n  }\n  get interstitialId() {\n    return this.assetItem.parentIdentifier;\n  }\n  get media() {\n    var e;\n    return ((e = this.hls) == null ? void 0 : e.media) || null;\n  }\n  get bufferedEnd() {\n    const e = this.media || this.mediaAttached;\n    if (!e)\n      return this._bufferedEosTime ? this._bufferedEosTime : this.currentTime;\n    const t = Ce.bufferInfo(e, e.currentTime, 1e-3);\n    return this.getAssetTime(t.end);\n  }\n  get currentTime() {\n    const e = this.media || this.mediaAttached;\n    return e ? this.getAssetTime(e.currentTime) : this._currentTime || 0;\n  }\n  get duration() {\n    const e = this.assetItem.duration;\n    if (!e)\n      return 0;\n    const t = this.interstitial.playoutLimit;\n    if (t) {\n      const r = t - this.startOffset;\n      if (r > 0 && r < e)\n        return r;\n    }\n    return e;\n  }\n  get remaining() {\n    const e = this.duration;\n    return e ? Math.max(0, e - this.currentTime) : 0;\n  }\n  get startOffset() {\n    return this.assetItem.startOffset;\n  }\n  get timelineOffset() {\n    var e;\n    return ((e = this.hls) == null ? void 0 : e.config.timelineOffset) || 0;\n  }\n  set timelineOffset(e) {\n    const t = this.timelineOffset;\n    if (e !== t) {\n      const r = e - t;\n      if (Math.abs(r) > 1 / 9e4 && this.hls) {\n        if (this.hasDetails)\n          throw new Error(\"Cannot set timelineOffset after playlists are loaded\");\n        this.hls.config.timelineOffset = e;\n      }\n    }\n  }\n  getAssetTime(e) {\n    const t = this.timelineOffset, r = this.duration;\n    return Math.min(Math.max(0, e - t), r);\n  }\n  removeMediaListeners() {\n    const e = this.mediaAttached;\n    e && (this._currentTime = e.currentTime, this.bufferSnapShot(), e.removeEventListener(\"timeupdate\", this.checkPlayout));\n  }\n  bufferSnapShot() {\n    if (this.mediaAttached) {\n      var e;\n      (e = this.hls) != null && e.bufferedToEnd && (this._bufferedEosTime = this.bufferedEnd);\n    }\n  }\n  destroy() {\n    this.removeMediaListeners(), this.hls && this.hls.destroy(), this.hls = null, this.tracks = this.mediaAttached = this.checkPlayout = null;\n  }\n  attachMedia(e) {\n    var t;\n    this.loadSource(), (t = this.hls) == null || t.attachMedia(e);\n  }\n  detachMedia() {\n    var e;\n    this.removeMediaListeners(), this.mediaAttached = null, (e = this.hls) == null || e.detachMedia();\n  }\n  resumeBuffering() {\n    var e;\n    (e = this.hls) == null || e.resumeBuffering();\n  }\n  pauseBuffering() {\n    var e;\n    (e = this.hls) == null || e.pauseBuffering();\n  }\n  transferMedia() {\n    var e;\n    return this.bufferSnapShot(), ((e = this.hls) == null ? void 0 : e.transferMedia()) || null;\n  }\n  resetDetails() {\n    const e = this.hls;\n    if (e && this.hasDetails) {\n      e.stopLoad();\n      const t = (r) => delete r.details;\n      e.levels.forEach(t), e.allAudioTracks.forEach(t), e.allSubtitleTracks.forEach(t), this.hasDetails = !1;\n    }\n  }\n  on(e, t, r) {\n    var n;\n    (n = this.hls) == null || n.on(e, t);\n  }\n  once(e, t, r) {\n    var n;\n    (n = this.hls) == null || n.once(e, t);\n  }\n  off(e, t, r) {\n    var n;\n    (n = this.hls) == null || n.off(e, t);\n  }\n  toString() {\n    var e;\n    return `HlsAssetPlayer: ${vn(this.assetItem)} ${(e = this.hls) == null ? void 0 : e.sessionId} ${this.appendInPlace ? \"append-in-place\" : \"\"}`;\n  }\n}\nconst Xh = 0.033;\nclass vw extends Lr {\n  constructor(e, t) {\n    super(\"interstitials-sched\", t), this.onScheduleUpdate = void 0, this.eventMap = {}, this.events = null, this.items = null, this.durations = {\n      primary: 0,\n      playout: 0,\n      integrated: 0\n    }, this.onScheduleUpdate = e;\n  }\n  destroy() {\n    this.reset(), this.onScheduleUpdate = null;\n  }\n  reset() {\n    this.eventMap = {}, this.setDurations(0, 0, 0), this.events && this.events.forEach((e) => e.reset()), this.events = this.items = null;\n  }\n  resetErrorsInRange(e, t) {\n    return this.events ? this.events.reduce((r, n) => e <= n.startOffset && t > n.startOffset ? (delete n.error, r + 1) : r, 0) : 0;\n  }\n  get duration() {\n    const e = this.items;\n    return e ? e[e.length - 1].end : 0;\n  }\n  get length() {\n    return this.items ? this.items.length : 0;\n  }\n  getEvent(e) {\n    return e && this.eventMap[e] || null;\n  }\n  hasEvent(e) {\n    return e in this.eventMap;\n  }\n  findItemIndex(e, t) {\n    if (e.event)\n      return this.findEventIndex(e.event.identifier);\n    let r = -1;\n    e.nextEvent ? r = this.findEventIndex(e.nextEvent.identifier) - 1 : e.previousEvent && (r = this.findEventIndex(e.previousEvent.identifier) + 1);\n    const n = this.items;\n    if (n)\n      for (n[r] || (t === void 0 && (t = e.start), r = this.findItemIndexAtTime(t)); r >= 0 && (i = n[r]) != null && i.event; ) {\n        var i;\n        r--;\n      }\n    return r;\n  }\n  findItemIndexAtTime(e, t) {\n    const r = this.items;\n    if (r)\n      for (let n = 0; n < r.length; n++) {\n        let i = r[n];\n        if (t && t !== \"primary\" && (i = i[t]), e === i.start || e > i.start && e < i.end)\n          return n;\n      }\n    return -1;\n  }\n  findJumpRestrictedIndex(e, t) {\n    const r = this.items;\n    if (r)\n      for (let n = e; n <= t && r[n]; n++) {\n        const i = r[n].event;\n        if (i != null && i.restrictions.jump && !i.appendInPlace)\n          return n;\n      }\n    return -1;\n  }\n  findEventIndex(e) {\n    const t = this.items;\n    if (t)\n      for (let n = t.length; n--; ) {\n        var r;\n        if (((r = t[n].event) == null ? void 0 : r.identifier) === e)\n          return n;\n      }\n    return -1;\n  }\n  findAssetIndex(e, t) {\n    const r = e.assetList, n = r.length;\n    if (n > 1)\n      for (let i = 0; i < n; i++) {\n        const o = r[i];\n        if (!o.error) {\n          const a = o.timelineStart;\n          if (t === a || t > a && (t < a + (o.duration || 0) || i === n - 1))\n            return i;\n        }\n      }\n    return 0;\n  }\n  get assetIdAtEnd() {\n    var e;\n    const t = (e = this.items) == null || (e = e[this.length - 1]) == null ? void 0 : e.event;\n    if (t) {\n      const r = t.assetList, n = r[r.length - 1];\n      if (n)\n        return n.identifier;\n    }\n    return null;\n  }\n  parseInterstitialDateRanges(e, t) {\n    const r = e.main.details, {\n      dateRanges: n\n    } = r, i = this.events, o = this.parseDateRanges(n, {\n      url: r.url\n    }, t), a = Object.keys(n), l = i ? i.filter((c) => !a.includes(c.identifier)) : [];\n    o.length && o.sort((c, u) => {\n      const d = c.cue.pre, h = c.cue.post, f = u.cue.pre, p = u.cue.post;\n      if (d && !f)\n        return -1;\n      if (f && !d || h && !p)\n        return 1;\n      if (p && !h)\n        return -1;\n      if (!d && !f && !h && !p) {\n        const y = c.startTime, E = u.startTime;\n        if (y !== E)\n          return y - E;\n      }\n      return c.dateRange.tagOrder - u.dateRange.tagOrder;\n    }), this.events = o, l.forEach((c) => {\n      this.removeEvent(c);\n    }), this.updateSchedule(e, l);\n  }\n  updateSchedule(e, t = [], r = !1) {\n    const n = this.events || [];\n    if (n.length || t.length || this.length < 2) {\n      const i = this.items, o = this.parseSchedule(n, e);\n      (r || t.length || (i == null ? void 0 : i.length) !== o.length || o.some((l, c) => Math.abs(l.playout.start - i[c].playout.start) > 5e-3 || Math.abs(l.playout.end - i[c].playout.end) > 5e-3)) && (this.items = o, this.onScheduleUpdate(t, i));\n    }\n  }\n  parseDateRanges(e, t, r) {\n    const n = [], i = Object.keys(e);\n    for (let o = 0; o < i.length; o++) {\n      const a = i[o], l = e[a];\n      if (l.isInterstitial) {\n        let c = this.eventMap[a];\n        c ? c.setDateRange(l) : (c = new pw(l, t), this.eventMap[a] = c, r === !1 && (c.appendInPlace = r)), n.push(c);\n      }\n    }\n    return n;\n  }\n  parseSchedule(e, t) {\n    const r = [], n = t.main.details, i = n.live ? 1 / 0 : n.edge;\n    let o = 0;\n    if (e = e.filter((l) => !l.error && !(l.cue.once && l.hasPlayed)), e.length) {\n      this.resolveOffsets(e, t);\n      let l = 0, c = 0;\n      if (e.forEach((u, d) => {\n        const h = u.cue.pre, f = u.cue.post, p = e[d - 1] || null, y = u.appendInPlace, E = f ? i : u.startOffset, b = u.duration, R = u.timelineOccupancy === ia.Range ? b : 0, A = u.resumptionOffset, F = (p == null ? void 0 : p.startTime) === E, M = E + u.cumulativeDuration;\n        let H = y ? M + b : E + A;\n        if (h || !f && E <= 0) {\n          const j = c;\n          c += R, u.timelineStart = M;\n          const C = o;\n          o += b, r.push({\n            event: u,\n            start: M,\n            end: H,\n            playout: {\n              start: C,\n              end: o\n            },\n            integrated: {\n              start: j,\n              end: c\n            }\n          });\n        } else if (E <= i) {\n          if (!F) {\n            const k = E - l;\n            if (k > Xh) {\n              const $ = l, W = c;\n              c += k;\n              const _ = o;\n              o += k;\n              const g = {\n                previousEvent: e[d - 1] || null,\n                nextEvent: u,\n                start: $,\n                end: $ + k,\n                playout: {\n                  start: _,\n                  end: o\n                },\n                integrated: {\n                  start: W,\n                  end: c\n                }\n              };\n              r.push(g);\n            } else k > 0 && p && (p.cumulativeDuration += k, r[r.length - 1].end = E);\n          }\n          f && (H = M), u.timelineStart = M;\n          const j = c;\n          c += R;\n          const C = o;\n          o += b, r.push({\n            event: u,\n            start: M,\n            end: H,\n            playout: {\n              start: C,\n              end: o\n            },\n            integrated: {\n              start: j,\n              end: c\n            }\n          });\n        } else\n          return;\n        const K = u.resumeTime;\n        f || K > i ? l = i : l = K;\n      }), l < i) {\n        var a;\n        const u = l, d = c, h = i - l;\n        c += h;\n        const f = o;\n        o += h, r.push({\n          previousEvent: ((a = r[r.length - 1]) == null ? void 0 : a.event) || null,\n          nextEvent: null,\n          start: l,\n          end: u + h,\n          playout: {\n            start: f,\n            end: o\n          },\n          integrated: {\n            start: d,\n            end: c\n          }\n        });\n      }\n      this.setDurations(i, o, c);\n    } else\n      r.push({\n        previousEvent: null,\n        nextEvent: null,\n        start: 0,\n        end: i,\n        playout: {\n          start: 0,\n          end: i\n        },\n        integrated: {\n          start: 0,\n          end: i\n        }\n      }), this.setDurations(i, i, i);\n    return r;\n  }\n  setDurations(e, t, r) {\n    this.durations = {\n      primary: e,\n      playout: t,\n      integrated: r\n    };\n  }\n  resolveOffsets(e, t) {\n    const r = t.main.details, n = r.live ? 1 / 0 : r.edge;\n    let i = 0, o = -1;\n    e.forEach((a, l) => {\n      const c = a.cue.pre, u = a.cue.post, d = c ? 0 : u ? n : a.startTime;\n      this.updateAssetDurations(a), o === d ? a.cumulativeDuration = i : (i = 0, o = d), !u && a.snapOptions.in && (a.resumeAnchor = Js(null, r.fragments, a.startOffset + a.resumptionOffset, 0, 0) || void 0), a.appendInPlace && !a.appendInPlaceStarted && (this.primaryCanResumeInPlaceAt(a, t) || (a.appendInPlace = !1)), !a.appendInPlace && l + 1 < e.length && e[l + 1].startTime - e[l].resumeTime < Xh && (e[l + 1].appendInPlace = !1, e[l + 1].appendInPlace && this.warn(`Could not change append strategy for abutting event ${a}`));\n      const f = ue(a.resumeOffset) ? a.resumeOffset : a.duration;\n      i += f;\n    });\n  }\n  primaryCanResumeInPlaceAt(e, t) {\n    const r = e.resumeTime, n = e.startTime + e.resumptionOffset;\n    return Math.abs(r - n) > Rn ? (this.log(`\"${e.identifier}\" resumption ${r} not aligned with estimated timeline end ${n}`), !1) : !Object.keys(t).some((o) => {\n      const a = t[o].details, l = a.edge;\n      if (r >= l)\n        return this.log(`\"${e.identifier}\" resumption ${r} past ${o} playlist end ${l}`), !1;\n      const c = Js(null, a.fragments, r);\n      if (!c)\n        return this.log(`\"${e.identifier}\" resumption ${r} does not align with any fragments in ${o} playlist (${a.fragStart}-${a.fragmentEnd})`), !0;\n      const u = o === \"audio\" ? 0.175 : 0;\n      return Math.abs(c.start - r) < Rn + u || Math.abs(c.end - r) < Rn + u ? !1 : (this.log(`\"${e.identifier}\" resumption ${r} not aligned with ${o} fragment bounds (${c.start}-${c.end} sn: ${c.sn} cc: ${c.cc})`), !0);\n    });\n  }\n  updateAssetDurations(e) {\n    if (!e.assetListLoaded)\n      return;\n    const t = e.timelineStart;\n    let r = 0, n = !1, i = !1;\n    for (let o = 0; o < e.assetList.length; o++) {\n      const a = e.assetList[o], l = t + r;\n      a.startOffset = r, a.timelineStart = l, n || (n = a.duration === null), i || (i = !!a.error);\n      const c = a.error ? 0 : a.duration || 0;\n      r += c;\n    }\n    n && !i ? e.duration = Math.max(r, e.duration) : e.duration = r;\n  }\n  removeEvent(e) {\n    e.reset(), delete this.eventMap[e.identifier];\n  }\n}\nfunction kr(s) {\n  return `[${s.event ? '\"' + s.event.identifier + '\"' : \"primary\"}: ${s.start.toFixed(2)}-${s.end.toFixed(2)}]`;\n}\nclass Ew {\n  constructor(e) {\n    this.hls = void 0, this.hls = e;\n  }\n  destroy() {\n    this.hls = null;\n  }\n  loadAssetList(e, t) {\n    const r = e.assetListUrl;\n    let n;\n    try {\n      n = $p(r, this.hls.sessionId, e.baseUrl);\n    } catch (h) {\n      const f = this.assignAssetListError(e, J.ASSET_LIST_LOAD_ERROR, h, r);\n      this.hls.trigger(I.ERROR, f);\n      return;\n    }\n    t && n.protocol !== \"data:\" && n.searchParams.set(\"_HLS_start_offset\", \"\" + t);\n    const i = this.hls.config, o = i.loader, a = new o(i), l = {\n      responseType: \"json\",\n      url: n.href\n    }, c = i.interstitialAssetListLoadPolicy.default, u = {\n      loadPolicy: c,\n      timeout: c.maxLoadTimeMs,\n      maxRetry: 0,\n      retryDelay: 0,\n      maxRetryDelay: 0\n    }, d = {\n      onSuccess: (h, f, p, y) => {\n        const E = h.data, b = E == null ? void 0 : E.ASSETS;\n        if (!Array.isArray(b)) {\n          const R = this.assignAssetListError(e, J.ASSET_LIST_PARSING_ERROR, new Error(\"Invalid interstitial asset list\"), p.url, f, y);\n          this.hls.trigger(I.ERROR, R);\n          return;\n        }\n        e.assetListResponse = E, this.hls.trigger(I.ASSET_LIST_LOADED, {\n          event: e,\n          assetListResponse: E,\n          networkDetails: y\n        });\n      },\n      onError: (h, f, p, y) => {\n        const E = this.assignAssetListError(e, J.ASSET_LIST_LOAD_ERROR, new Error(`Error loading X-ASSET-LIST: HTTP status ${h.code} ${h.text} (${f.url})`), f.url, y, p);\n        this.hls.trigger(I.ERROR, E);\n      },\n      onTimeout: (h, f, p) => {\n        const y = this.assignAssetListError(e, J.ASSET_LIST_LOAD_TIMEOUT, new Error(`Timeout loading X-ASSET-LIST (${f.url})`), f.url, h, p);\n        this.hls.trigger(I.ERROR, y);\n      }\n    };\n    return a.load(l, u, d), this.hls.trigger(I.ASSET_LIST_LOADING, {\n      event: e\n    }), a;\n  }\n  assignAssetListError(e, t, r, n, i, o) {\n    return e.error = r, {\n      type: ve.NETWORK_ERROR,\n      details: t,\n      fatal: !1,\n      interstitial: e,\n      url: n,\n      error: r,\n      networkDetails: o,\n      stats: i\n    };\n  }\n}\nfunction Jh(s) {\n  s == null || s.play().catch(() => {\n  });\n}\nfunction Qi(s, e) {\n  return `[${s}] Advancing timeline position to ${e}`;\n}\nclass xw extends Lr {\n  constructor(e, t) {\n    super(\"interstitials\", e.logger), this.HlsPlayerClass = void 0, this.hls = void 0, this.assetListLoader = void 0, this.mediaSelection = null, this.altSelection = null, this.media = null, this.detachedData = null, this.requiredTracks = null, this.manager = null, this.playerQueue = [], this.bufferedPos = -1, this.timelinePos = -1, this.schedule = void 0, this.playingItem = null, this.bufferingItem = null, this.waitingItem = null, this.endedItem = null, this.playingAsset = null, this.endedAsset = null, this.bufferingAsset = null, this.shouldPlay = !1, this.onPlay = () => {\n      this.shouldPlay = !0;\n    }, this.onPause = () => {\n      this.shouldPlay = !1;\n    }, this.onSeeking = () => {\n      const r = this.currentTime;\n      if (r === void 0 || this.playbackDisabled || !this.schedule)\n        return;\n      const n = r - this.timelinePos;\n      if (Math.abs(n) < 1 / 7056e5)\n        return;\n      const o = n <= -0.01;\n      this.timelinePos = r, this.bufferedPos = r;\n      const a = this.playingItem;\n      if (!a) {\n        this.checkBuffer();\n        return;\n      }\n      if (o && this.schedule.resetErrorsInRange(r, r - n) && this.updateSchedule(!0), this.checkBuffer(), o && r < a.start || r >= a.end) {\n        var l;\n        const f = this.findItemIndex(a);\n        let p = this.schedule.findItemIndexAtTime(r);\n        if (p === -1 && (p = f + (o ? -1 : 1), this.log(`seeked ${o ? \"back \" : \"\"}to position not covered by schedule ${r} (resolving from ${f} to ${p})`)), !this.isInterstitial(a) && (l = this.media) != null && l.paused && (this.shouldPlay = !1), !o && p > f) {\n          const y = this.schedule.findJumpRestrictedIndex(f + 1, p);\n          if (y > f) {\n            this.setSchedulePosition(y);\n            return;\n          }\n        }\n        this.setSchedulePosition(p);\n        return;\n      }\n      const c = this.playingAsset;\n      if (!c) {\n        if (this.playingLastItem && this.isInterstitial(a)) {\n          const f = a.event.assetList[0];\n          f && (this.endedItem = this.playingItem, this.playingItem = null, this.setScheduleToAssetAtTime(r, f));\n        }\n        return;\n      }\n      const u = c.timelineStart, d = c.duration || 0;\n      if (o && r < u || r >= u + d) {\n        var h;\n        (h = a.event) != null && h.appendInPlace && (this.clearInterstitial(a.event, a), this.flushFrontBuffer(r)), this.setScheduleToAssetAtTime(r, c);\n      }\n    }, this.onTimeupdate = () => {\n      const r = this.currentTime;\n      if (r === void 0 || this.playbackDisabled)\n        return;\n      if (r > this.timelinePos)\n        this.timelinePos = r, r > this.bufferedPos && this.checkBuffer();\n      else\n        return;\n      const n = this.playingItem;\n      if (!n || this.playingLastItem)\n        return;\n      if (r >= n.end) {\n        this.timelinePos = n.end;\n        const a = this.findItemIndex(n);\n        this.setSchedulePosition(a + 1);\n      }\n      const i = this.playingAsset;\n      if (!i)\n        return;\n      const o = i.timelineStart + (i.duration || 0);\n      r >= o && this.setScheduleToAssetAtTime(r, i);\n    }, this.onScheduleUpdate = (r, n) => {\n      const i = this.schedule;\n      if (!i)\n        return;\n      const o = this.playingItem, a = i.events || [], l = i.items || [], c = i.durations, u = r.map((y) => y.identifier), d = !!(a.length || u.length);\n      (d || n) && this.log(`INTERSTITIALS_UPDATED (${a.length}): ${a}\nSchedule: ${l.map((y) => kr(y))} pos: ${this.timelinePos}`), u.length && this.log(`Removed events ${u}`);\n      let h = null, f = null;\n      o && (h = this.updateItem(o, this.timelinePos), this.itemsMatch(o, h) ? this.playingItem = h : this.waitingItem = this.endedItem = null), this.waitingItem = this.updateItem(this.waitingItem), this.endedItem = this.updateItem(this.endedItem);\n      const p = this.bufferingItem;\n      if (p && (f = this.updateItem(p, this.bufferedPos), this.itemsMatch(p, f) ? this.bufferingItem = f : p.event && (this.bufferingItem = this.playingItem, this.clearInterstitial(p.event, null))), r.forEach((y) => {\n        y.assetList.forEach((E) => {\n          this.clearAssetPlayer(E.identifier, null);\n        });\n      }), this.playerQueue.forEach((y) => {\n        if (y.interstitial.appendInPlace) {\n          const E = y.assetItem.timelineStart, b = y.timelineOffset - E;\n          if (b)\n            try {\n              y.timelineOffset = E;\n            } catch (R) {\n              Math.abs(b) > Rn && this.warn(`${R} (\"${y.assetId}\" ${y.timelineOffset}->${E})`);\n            }\n        }\n      }), d || n) {\n        if (this.hls.trigger(I.INTERSTITIALS_UPDATED, {\n          events: a.slice(0),\n          schedule: l.slice(0),\n          durations: c,\n          removedIds: u\n        }), this.isInterstitial(o) && u.includes(o.event.identifier)) {\n          this.warn(`Interstitial \"${o.event.identifier}\" removed while playing`), this.primaryFallback(o.event);\n          return;\n        }\n        o && this.trimInPlace(h, o), p && f !== h && this.trimInPlace(f, p), this.checkBuffer();\n      }\n    }, this.hls = e, this.HlsPlayerClass = t, this.assetListLoader = new Ew(e), this.schedule = new vw(this.onScheduleUpdate, e.logger), this.registerListeners();\n  }\n  registerListeners() {\n    const e = this.hls;\n    e && (e.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.on(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.on(I.AUDIO_TRACK_UPDATED, this.onAudioTrackUpdated, this), e.on(I.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this), e.on(I.SUBTITLE_TRACK_UPDATED, this.onSubtitleTrackUpdated, this), e.on(I.EVENT_CUE_ENTER, this.onInterstitialCueEnter, this), e.on(I.ASSET_LIST_LOADED, this.onAssetListLoaded, this), e.on(I.BUFFER_APPENDED, this.onBufferAppended, this), e.on(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.on(I.BUFFERED_TO_END, this.onBufferedToEnd, this), e.on(I.MEDIA_ENDED, this.onMediaEnded, this), e.on(I.ERROR, this.onError, this), e.on(I.DESTROYING, this.onDestroying, this));\n  }\n  unregisterListeners() {\n    const e = this.hls;\n    e && (e.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.off(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.off(I.AUDIO_TRACK_UPDATED, this.onAudioTrackUpdated, this), e.off(I.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this), e.off(I.SUBTITLE_TRACK_UPDATED, this.onSubtitleTrackUpdated, this), e.off(I.EVENT_CUE_ENTER, this.onInterstitialCueEnter, this), e.off(I.ASSET_LIST_LOADED, this.onAssetListLoaded, this), e.off(I.BUFFER_CODECS, this.onBufferCodecs, this), e.off(I.BUFFER_APPENDED, this.onBufferAppended, this), e.off(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.off(I.BUFFERED_TO_END, this.onBufferedToEnd, this), e.off(I.MEDIA_ENDED, this.onMediaEnded, this), e.off(I.ERROR, this.onError, this), e.off(I.DESTROYING, this.onDestroying, this));\n  }\n  startLoad() {\n    this.resumeBuffering();\n  }\n  stopLoad() {\n    this.pauseBuffering();\n  }\n  resumeBuffering() {\n    var e;\n    (e = this.getBufferingPlayer()) == null || e.resumeBuffering();\n  }\n  pauseBuffering() {\n    var e;\n    (e = this.getBufferingPlayer()) == null || e.pauseBuffering();\n  }\n  destroy() {\n    this.unregisterListeners(), this.stopLoad(), this.assetListLoader && this.assetListLoader.destroy(), this.emptyPlayerQueue(), this.clearScheduleState(), this.schedule && this.schedule.destroy(), this.media = this.detachedData = this.mediaSelection = this.requiredTracks = this.altSelection = this.schedule = this.manager = null, this.hls = this.HlsPlayerClass = this.log = null, this.assetListLoader = null, this.onPlay = this.onPause = this.onSeeking = this.onTimeupdate = null, this.onScheduleUpdate = null;\n  }\n  onDestroying() {\n    const e = this.primaryMedia || this.media;\n    e && this.removeMediaListeners(e);\n  }\n  removeMediaListeners(e) {\n    pr(e, \"play\", this.onPlay), pr(e, \"pause\", this.onPause), pr(e, \"seeking\", this.onSeeking), pr(e, \"timeupdate\", this.onTimeupdate);\n  }\n  onMediaAttaching(e, t) {\n    const r = this.media = t.media;\n    cr(r, \"seeking\", this.onSeeking), cr(r, \"timeupdate\", this.onTimeupdate), cr(r, \"play\", this.onPlay), cr(r, \"pause\", this.onPause);\n  }\n  onMediaAttached(e, t) {\n    const r = this.effectivePlayingItem, n = this.detachedData;\n    if (this.detachedData = null, r === null)\n      this.checkStart();\n    else if (!n) {\n      this.clearScheduleState();\n      const i = this.findItemIndex(r);\n      this.setSchedulePosition(i);\n    }\n  }\n  clearScheduleState() {\n    this.log(\"clear schedule state\"), this.playingItem = this.bufferingItem = this.waitingItem = this.endedItem = this.playingAsset = this.endedAsset = this.bufferingAsset = null;\n  }\n  onMediaDetaching(e, t) {\n    const r = !!t.transferMedia, n = this.media;\n    if (this.media = null, !r && (n && this.removeMediaListeners(n), this.detachedData)) {\n      const i = this.getBufferingPlayer();\n      i && (this.log(`Removing schedule state for detachedData and ${i}`), this.playingAsset = this.endedAsset = this.bufferingAsset = this.bufferingItem = this.waitingItem = this.detachedData = null, i.detachMedia()), this.shouldPlay = !1;\n    }\n  }\n  get interstitialsManager() {\n    if (!this.hls)\n      return null;\n    if (this.manager)\n      return this.manager;\n    const e = this, t = () => e.bufferingItem || e.waitingItem, r = (d) => d && e.getAssetPlayer(d.identifier), n = (d, h, f, p, y) => {\n      if (d) {\n        let E = d[h].start;\n        const b = d.event;\n        if (b) {\n          if (h === \"playout\" || b.timelineOccupancy !== ia.Point) {\n            const R = r(f);\n            (R == null ? void 0 : R.interstitial) === b && (E += R.assetItem.startOffset + R[y]);\n          }\n        } else {\n          const R = p === \"bufferedPos\" ? o() : e[p];\n          E += R - d.start;\n        }\n        return E;\n      }\n      return 0;\n    }, i = (d, h) => {\n      var f;\n      if (d !== 0 && h !== \"primary\" && (f = e.schedule) != null && f.length) {\n        var p;\n        const y = e.schedule.findItemIndexAtTime(d), E = (p = e.schedule.items) == null ? void 0 : p[y];\n        if (E) {\n          const b = E[h].start - E.start;\n          return d + b;\n        }\n      }\n      return d;\n    }, o = () => {\n      const d = e.bufferedPos;\n      return d === Number.MAX_VALUE ? a(\"primary\") : Math.max(d, 0);\n    }, a = (d) => {\n      var h, f;\n      return (h = e.primaryDetails) != null && h.live ? e.primaryDetails.edge : ((f = e.schedule) == null ? void 0 : f.durations[d]) || 0;\n    }, l = (d, h) => {\n      var f, p;\n      const y = e.effectivePlayingItem;\n      if (y != null && (f = y.event) != null && f.restrictions.skip || !e.schedule)\n        return;\n      e.log(`seek to ${d} \"${h}\"`);\n      const E = e.effectivePlayingItem, b = e.schedule.findItemIndexAtTime(d, h), R = (p = e.schedule.items) == null ? void 0 : p[b], A = e.getBufferingPlayer(), F = A == null ? void 0 : A.interstitial, M = F == null ? void 0 : F.appendInPlace, H = E && e.itemsMatch(E, R);\n      if (E && (M || H)) {\n        const K = r(e.playingAsset), j = (K == null ? void 0 : K.media) || e.primaryMedia;\n        if (j) {\n          const C = h === \"primary\" ? j.currentTime : n(E, h, e.playingAsset, \"timelinePos\", \"currentTime\"), k = d - C, $ = (M ? C : j.currentTime) + k;\n          if ($ >= 0 && (!K || M || $ <= K.duration)) {\n            j.currentTime = $;\n            return;\n          }\n        }\n      }\n      if (R) {\n        let K = d;\n        if (h !== \"primary\") {\n          const C = R[h].start, k = d - C;\n          K = R.start + k;\n        }\n        const j = !e.isInterstitial(R);\n        if ((!e.isInterstitial(E) || E.event.appendInPlace) && (j || R.event.appendInPlace)) {\n          const C = e.media || (M ? A == null ? void 0 : A.media : null);\n          C && (C.currentTime = K);\n        } else if (E) {\n          const C = e.findItemIndex(E);\n          if (b > C) {\n            const $ = e.schedule.findJumpRestrictedIndex(C + 1, b);\n            if ($ > C) {\n              e.setSchedulePosition($);\n              return;\n            }\n          }\n          let k = 0;\n          if (j)\n            e.timelinePos = K, e.checkBuffer();\n          else {\n            const $ = R.event.assetList, W = d - (R[h] || R).start;\n            for (let _ = $.length; _--; ) {\n              const g = $[_];\n              if (g.duration && W >= g.startOffset && W < g.startOffset + g.duration) {\n                k = _;\n                break;\n              }\n            }\n          }\n          e.setSchedulePosition(b, k);\n        }\n      }\n    }, c = () => {\n      const d = e.effectivePlayingItem;\n      if (e.isInterstitial(d))\n        return d;\n      const h = t();\n      return e.isInterstitial(h) ? h : null;\n    }, u = {\n      get bufferedEnd() {\n        const d = t(), h = e.bufferingItem;\n        if (h && h === d) {\n          var f;\n          return n(h, \"playout\", e.bufferingAsset, \"bufferedPos\", \"bufferedEnd\") - h.playout.start || ((f = e.bufferingAsset) == null ? void 0 : f.startOffset) || 0;\n        }\n        return 0;\n      },\n      get currentTime() {\n        const d = c(), h = e.effectivePlayingItem;\n        return h && h === d ? n(h, \"playout\", e.effectivePlayingAsset, \"timelinePos\", \"currentTime\") - h.playout.start : 0;\n      },\n      set currentTime(d) {\n        const h = c(), f = e.effectivePlayingItem;\n        f && f === h && l(d + f.playout.start, \"playout\");\n      },\n      get duration() {\n        const d = c();\n        return d ? d.playout.end - d.playout.start : 0;\n      },\n      get assetPlayers() {\n        var d;\n        const h = (d = c()) == null ? void 0 : d.event.assetList;\n        return h ? h.map((f) => e.getAssetPlayer(f.identifier)) : [];\n      },\n      get playingIndex() {\n        var d;\n        const h = (d = c()) == null ? void 0 : d.event;\n        return h && e.effectivePlayingAsset ? h.findAssetIndex(e.effectivePlayingAsset) : -1;\n      },\n      get scheduleItem() {\n        return c();\n      }\n    };\n    return this.manager = {\n      get events() {\n        var d;\n        return ((d = e.schedule) == null || (d = d.events) == null ? void 0 : d.slice(0)) || [];\n      },\n      get schedule() {\n        var d;\n        return ((d = e.schedule) == null || (d = d.items) == null ? void 0 : d.slice(0)) || [];\n      },\n      get interstitialPlayer() {\n        return c() ? u : null;\n      },\n      get playerQueue() {\n        return e.playerQueue.slice(0);\n      },\n      get bufferingAsset() {\n        return e.bufferingAsset;\n      },\n      get bufferingItem() {\n        return t();\n      },\n      get bufferingIndex() {\n        const d = t();\n        return e.findItemIndex(d);\n      },\n      get playingAsset() {\n        return e.effectivePlayingAsset;\n      },\n      get playingItem() {\n        return e.effectivePlayingItem;\n      },\n      get playingIndex() {\n        const d = e.effectivePlayingItem;\n        return e.findItemIndex(d);\n      },\n      primary: {\n        get bufferedEnd() {\n          return o();\n        },\n        get currentTime() {\n          const d = e.timelinePos;\n          return d > 0 ? d : 0;\n        },\n        set currentTime(d) {\n          l(d, \"primary\");\n        },\n        get duration() {\n          return a(\"primary\");\n        },\n        get seekableStart() {\n          var d;\n          return ((d = e.primaryDetails) == null ? void 0 : d.fragmentStart) || 0;\n        }\n      },\n      integrated: {\n        get bufferedEnd() {\n          return n(t(), \"integrated\", e.bufferingAsset, \"bufferedPos\", \"bufferedEnd\");\n        },\n        get currentTime() {\n          return n(e.effectivePlayingItem, \"integrated\", e.effectivePlayingAsset, \"timelinePos\", \"currentTime\");\n        },\n        set currentTime(d) {\n          l(d, \"integrated\");\n        },\n        get duration() {\n          return a(\"integrated\");\n        },\n        get seekableStart() {\n          var d;\n          return i(((d = e.primaryDetails) == null ? void 0 : d.fragmentStart) || 0, \"integrated\");\n        }\n      },\n      skip: () => {\n        const d = e.effectivePlayingItem, h = d == null ? void 0 : d.event;\n        if (h && !h.restrictions.skip) {\n          const f = e.findItemIndex(d);\n          if (h.appendInPlace) {\n            const p = d.playout.start + d.event.duration;\n            l(p + 1e-3, \"playout\");\n          } else\n            e.advanceAfterAssetEnded(h, f, 1 / 0);\n        }\n      }\n    };\n  }\n  // Schedule getters\n  get effectivePlayingItem() {\n    return this.waitingItem || this.playingItem || this.endedItem;\n  }\n  get effectivePlayingAsset() {\n    return this.playingAsset || this.endedAsset;\n  }\n  get playingLastItem() {\n    var e;\n    const t = this.playingItem, r = (e = this.schedule) == null ? void 0 : e.items;\n    return !this.playbackStarted || !t || !r ? !1 : this.findItemIndex(t) === r.length - 1;\n  }\n  get playbackStarted() {\n    return this.effectivePlayingItem !== null;\n  }\n  // Media getters and event callbacks\n  get currentTime() {\n    var e, t;\n    if (this.mediaSelection === null)\n      return;\n    const r = this.waitingItem || this.playingItem;\n    if (this.isInterstitial(r) && !r.event.appendInPlace)\n      return;\n    let n = this.media;\n    !n && (e = this.bufferingItem) != null && (e = e.event) != null && e.appendInPlace && (n = this.primaryMedia);\n    const i = (t = n) == null ? void 0 : t.currentTime;\n    if (!(i === void 0 || !ue(i)))\n      return i;\n  }\n  get primaryMedia() {\n    var e;\n    return this.media || ((e = this.detachedData) == null ? void 0 : e.media) || null;\n  }\n  isInterstitial(e) {\n    return !!(e != null && e.event);\n  }\n  retreiveMediaSource(e, t) {\n    const r = this.getAssetPlayer(e);\n    r && this.transferMediaFromPlayer(r, t);\n  }\n  transferMediaFromPlayer(e, t) {\n    const r = e.interstitial.appendInPlace, n = e.media;\n    if (r && n === this.primaryMedia) {\n      if (this.bufferingAsset = null, (!t || this.isInterstitial(t) && !t.event.appendInPlace) && t && n) {\n        this.detachedData = {\n          media: n\n        };\n        return;\n      }\n      const i = e.transferMedia();\n      this.log(`transfer MediaSource from ${e} ${at(i)}`), this.detachedData = i;\n    } else t && n && (this.shouldPlay || (this.shouldPlay = !n.paused));\n  }\n  transferMediaTo(e, t) {\n    var r, n;\n    if (e.media === t)\n      return;\n    let i = null;\n    const o = this.hls, a = e !== o, l = a && e.interstitial.appendInPlace, c = (r = this.detachedData) == null ? void 0 : r.mediaSource;\n    let u;\n    if (o.media)\n      l && (i = o.transferMedia(), this.detachedData = i), u = \"Primary\";\n    else if (c) {\n      const p = this.getBufferingPlayer();\n      p ? (i = p.transferMedia(), u = `${p}`) : u = \"detached MediaSource\";\n    } else\n      u = \"detached media\";\n    if (!i) {\n      if (c)\n        i = this.detachedData, this.log(`using detachedData: MediaSource ${at(i)}`);\n      else if (!this.detachedData || o.media === t) {\n        const p = this.playerQueue;\n        p.length > 1 && p.forEach((y) => {\n          if (a && y.interstitial.appendInPlace !== l) {\n            const E = y.interstitial;\n            this.clearInterstitial(y.interstitial, null), E.appendInPlace = !1, E.appendInPlace && this.warn(`Could not change append strategy for queued assets ${E}`);\n          }\n        }), this.hls.detachMedia(), this.detachedData = {\n          media: t\n        };\n      }\n    }\n    const d = i && \"mediaSource\" in i && ((n = i.mediaSource) == null ? void 0 : n.readyState) !== \"closed\", h = d && i ? i : t;\n    this.log(`${d ? \"transfering MediaSource\" : \"attaching media\"} to ${a ? e : \"Primary\"} from ${u} (media.currentTime: ${t.currentTime})`);\n    const f = this.schedule;\n    if (h === i && f) {\n      const p = a && e.assetId === f.assetIdAtEnd;\n      h.overrides = {\n        duration: f.duration,\n        endOfStream: !a || p,\n        cueRemoval: !a\n      };\n    }\n    e.attachMedia(h);\n  }\n  onInterstitialCueEnter() {\n    this.onTimeupdate();\n  }\n  // Scheduling methods\n  checkStart() {\n    const e = this.schedule, t = e == null ? void 0 : e.events;\n    if (!t || this.playbackDisabled || !this.media)\n      return;\n    this.bufferedPos === -1 && (this.bufferedPos = 0);\n    const r = this.timelinePos, n = this.effectivePlayingItem;\n    if (r === -1) {\n      const i = this.hls.startPosition;\n      if (this.log(Qi(\"checkStart\", i)), this.timelinePos = i, t.length && t[0].cue.pre) {\n        const o = e.findEventIndex(t[0].identifier);\n        this.setSchedulePosition(o);\n      } else if (i >= 0 || !this.primaryLive) {\n        const o = this.timelinePos = i > 0 ? i : 0, a = e.findItemIndexAtTime(o);\n        this.setSchedulePosition(a);\n      }\n    } else if (n && !this.playingItem) {\n      const i = e.findItemIndex(n);\n      this.setSchedulePosition(i);\n    }\n  }\n  advanceAssetBuffering(e, t) {\n    const r = e.event, n = r.findAssetIndex(t), i = Tl(r, n);\n    if (!r.isAssetPastPlayoutLimit(i))\n      this.bufferedToEvent(e, i);\n    else if (this.schedule) {\n      var o;\n      const a = (o = this.schedule.items) == null ? void 0 : o[this.findItemIndex(e) + 1];\n      a && this.bufferedToItem(a);\n    }\n  }\n  advanceAfterAssetEnded(e, t, r) {\n    const n = Tl(e, r);\n    if (e.isAssetPastPlayoutLimit(n)) {\n      if (this.schedule) {\n        const i = this.schedule.items;\n        if (i) {\n          const o = t + 1, a = i.length;\n          if (o >= a) {\n            this.setSchedulePosition(-1);\n            return;\n          }\n          const l = e.resumeTime;\n          this.timelinePos < l && (this.log(Qi(\"advanceAfterAssetEnded\", l)), this.timelinePos = l, e.appendInPlace && this.advanceInPlace(l), this.checkBuffer(this.bufferedPos < l)), this.setSchedulePosition(o);\n        }\n      }\n    } else {\n      if (e.appendInPlace) {\n        const i = e.assetList[n];\n        i && this.advanceInPlace(i.timelineStart);\n      }\n      this.setSchedulePosition(t, n);\n    }\n  }\n  setScheduleToAssetAtTime(e, t) {\n    const r = this.schedule;\n    if (!r)\n      return;\n    const n = t.parentIdentifier, i = r.getEvent(n);\n    if (i) {\n      const o = r.findEventIndex(n), a = r.findAssetIndex(i, e);\n      this.advanceAfterAssetEnded(i, o, a - 1);\n    }\n  }\n  setSchedulePosition(e, t) {\n    var r;\n    const n = (r = this.schedule) == null ? void 0 : r.items;\n    if (!n || this.playbackDisabled)\n      return;\n    const i = e >= 0 ? n[e] : null;\n    this.log(`setSchedulePosition ${e}, ${t} (${i && kr(i)}) pos: ${this.timelinePos}`);\n    const o = this.waitingItem || this.playingItem, a = this.playingLastItem;\n    if (this.isInterstitial(o)) {\n      const u = o.event, d = this.playingAsset, h = d == null ? void 0 : d.identifier, f = h ? this.getAssetPlayer(h) : null;\n      if (f && h && (!this.eventItemsMatch(o, i) || t !== void 0 && h !== u.assetList[t].identifier)) {\n        var l;\n        const p = u.findAssetIndex(d);\n        if (this.log(`INTERSTITIAL_ASSET_ENDED ${p + 1}/${u.assetList.length} ${vn(d)}`), this.endedAsset = d, this.playingAsset = null, this.hls.trigger(I.INTERSTITIAL_ASSET_ENDED, {\n          asset: d,\n          assetListIndex: p,\n          event: u,\n          schedule: n.slice(0),\n          scheduleIndex: e,\n          player: f\n        }), o !== this.playingItem) {\n          this.itemsMatch(o, this.playingItem) && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n          !this.playingAsset && this.advanceAfterAssetEnded(u, this.findItemIndex(this.playingItem), p);\n          return;\n        }\n        this.retreiveMediaSource(h, i), f.media && !((l = this.detachedData) != null && l.mediaSource) && f.detachMedia();\n      }\n      if (!this.eventItemsMatch(o, i) && (this.endedItem = o, this.playingItem = null, this.log(`INTERSTITIAL_ENDED ${u} ${kr(o)}`), u.hasPlayed = !0, this.hls.trigger(I.INTERSTITIAL_ENDED, {\n        event: u,\n        schedule: n.slice(0),\n        scheduleIndex: e\n      }), u.cue.once)) {\n        var c;\n        this.updateSchedule();\n        const p = (c = this.schedule) == null ? void 0 : c.items;\n        if (i && p) {\n          const y = this.findItemIndex(i);\n          this.advanceSchedule(y, p, t, o, a);\n        }\n        return;\n      }\n    }\n    this.advanceSchedule(e, n, t, o, a);\n  }\n  advanceSchedule(e, t, r, n, i) {\n    const o = this.schedule;\n    if (!o)\n      return;\n    const a = t[e] || null, l = this.primaryMedia, c = this.playerQueue;\n    if (c.length && c.forEach((u) => {\n      const d = u.interstitial, h = o.findEventIndex(d.identifier);\n      (h < e || h > e + 1) && this.clearInterstitial(d, a);\n    }), this.isInterstitial(a)) {\n      this.timelinePos = Math.min(Math.max(this.timelinePos, a.start), a.end);\n      const u = a.event;\n      if (r === void 0) {\n        r = o.findAssetIndex(u, this.timelinePos);\n        const p = Tl(u, r - 1);\n        if (u.isAssetPastPlayoutLimit(p) || u.appendInPlace && this.timelinePos === a.end) {\n          this.advanceAfterAssetEnded(u, e, r);\n          return;\n        }\n        r = p;\n      }\n      const d = this.waitingItem;\n      this.assetsBuffered(a, l) || this.setBufferingItem(a);\n      let h = this.preloadAssets(u, r);\n      if (this.eventItemsMatch(a, d || n) || (this.waitingItem = a, this.log(`INTERSTITIAL_STARTED ${kr(a)} ${u.appendInPlace ? \"append in place\" : \"\"}`), this.hls.trigger(I.INTERSTITIAL_STARTED, {\n        event: u,\n        schedule: t.slice(0),\n        scheduleIndex: e\n      })), !u.assetListLoaded) {\n        this.log(`Waiting for ASSET-LIST to complete loading ${u}`);\n        return;\n      }\n      if (u.assetListLoader && (u.assetListLoader.destroy(), u.assetListLoader = void 0), !l) {\n        this.log(`Waiting for attachMedia to start Interstitial ${u}`);\n        return;\n      }\n      this.waitingItem = this.endedItem = null, this.playingItem = a;\n      const f = u.assetList[r];\n      if (!f) {\n        this.advanceAfterAssetEnded(u, e, r || 0);\n        return;\n      }\n      if (h || (h = this.getAssetPlayer(f.identifier)), h === null || h.destroyed) {\n        const p = u.assetList.length;\n        this.warn(`asset ${r + 1}/${p} player destroyed ${u}`), h = this.createAssetPlayer(u, f, r), h.loadSource();\n      }\n      if (!this.eventItemsMatch(a, this.bufferingItem) && u.appendInPlace && this.isAssetBuffered(f))\n        return;\n      this.startAssetPlayer(h, r, t, e, l), this.shouldPlay && Jh(h.media);\n    } else a ? (this.resumePrimary(a, e, n), this.shouldPlay && Jh(this.hls.media)) : i && this.isInterstitial(n) && (this.endedItem = null, this.playingItem = n, n.event.appendInPlace || this.attachPrimary(o.durations.primary, null));\n  }\n  get playbackDisabled() {\n    return this.hls.config.enableInterstitialPlayback === !1;\n  }\n  get primaryDetails() {\n    var e;\n    return (e = this.mediaSelection) == null ? void 0 : e.main.details;\n  }\n  get primaryLive() {\n    var e;\n    return !!((e = this.primaryDetails) != null && e.live);\n  }\n  resumePrimary(e, t, r) {\n    var n, i;\n    if (this.playingItem = e, this.playingAsset = this.endedAsset = null, this.waitingItem = this.endedItem = null, this.bufferedToItem(e), this.log(`resuming ${kr(e)}`), !((n = this.detachedData) != null && n.mediaSource)) {\n      let a = this.timelinePos;\n      (a < e.start || a >= e.end) && (a = this.getPrimaryResumption(e, t), this.log(Qi(\"resumePrimary\", a)), this.timelinePos = a), this.attachPrimary(a, e);\n    }\n    if (!r)\n      return;\n    const o = (i = this.schedule) == null ? void 0 : i.items;\n    o && (this.log(`INTERSTITIALS_PRIMARY_RESUMED ${kr(e)}`), this.hls.trigger(I.INTERSTITIALS_PRIMARY_RESUMED, {\n      schedule: o.slice(0),\n      scheduleIndex: t\n    }), this.checkBuffer());\n  }\n  getPrimaryResumption(e, t) {\n    const r = e.start;\n    if (this.primaryLive) {\n      const n = this.primaryDetails;\n      if (t === 0)\n        return this.hls.startPosition;\n      if (n && (r < n.fragmentStart || r > n.edge))\n        return this.hls.liveSyncPosition || -1;\n    }\n    return r;\n  }\n  isAssetBuffered(e) {\n    const t = this.getAssetPlayer(e.identifier);\n    return t != null && t.hls ? t.hls.bufferedToEnd : Ce.bufferInfo(this.primaryMedia, this.timelinePos, 0).end + 1 >= e.timelineStart + (e.duration || 0);\n  }\n  attachPrimary(e, t, r) {\n    t ? this.setBufferingItem(t) : this.bufferingItem = this.playingItem, this.bufferingAsset = null;\n    const n = this.primaryMedia;\n    if (!n)\n      return;\n    const i = this.hls;\n    i.media ? this.checkBuffer() : (this.transferMediaTo(i, n), r && this.startLoadingPrimaryAt(e, r)), r || (this.log(Qi(\"attachPrimary\", e)), this.timelinePos = e, this.startLoadingPrimaryAt(e, r));\n  }\n  startLoadingPrimaryAt(e, t) {\n    var r;\n    const n = this.hls;\n    !n.loadingEnabled || !n.media || Math.abs((((r = n.mainForwardBufferInfo) == null ? void 0 : r.start) || n.media.currentTime) - e) > 0.5 ? n.startLoad(e, t) : n.bufferingEnabled || n.resumeBuffering();\n  }\n  // HLS.js event callbacks\n  onManifestLoading() {\n    var e;\n    this.stopLoad(), (e = this.schedule) == null || e.reset(), this.emptyPlayerQueue(), this.clearScheduleState(), this.shouldPlay = !1, this.bufferedPos = this.timelinePos = -1, this.mediaSelection = this.altSelection = this.manager = this.requiredTracks = null, this.hls.off(I.BUFFER_CODECS, this.onBufferCodecs, this), this.hls.on(I.BUFFER_CODECS, this.onBufferCodecs, this);\n  }\n  onLevelUpdated(e, t) {\n    if (t.level === -1 || !this.schedule)\n      return;\n    const r = this.hls.levels[t.level];\n    if (!r.details)\n      return;\n    const n = tt(tt({}, this.mediaSelection || this.altSelection), {}, {\n      main: r\n    });\n    this.mediaSelection = n, this.schedule.parseInterstitialDateRanges(n, this.hls.config.interstitialAppendInPlace), !this.effectivePlayingItem && this.schedule.items && this.checkStart();\n  }\n  onAudioTrackUpdated(e, t) {\n    const r = this.hls.audioTracks[t.id], n = this.mediaSelection;\n    if (!n) {\n      this.altSelection = tt(tt({}, this.altSelection), {}, {\n        audio: r\n      });\n      return;\n    }\n    const i = tt(tt({}, n), {}, {\n      audio: r\n    });\n    this.mediaSelection = i;\n  }\n  onSubtitleTrackUpdated(e, t) {\n    const r = this.hls.subtitleTracks[t.id], n = this.mediaSelection;\n    if (!n) {\n      this.altSelection = tt(tt({}, this.altSelection), {}, {\n        subtitles: r\n      });\n      return;\n    }\n    const i = tt(tt({}, n), {}, {\n      subtitles: r\n    });\n    this.mediaSelection = i;\n  }\n  onAudioTrackSwitching(e, t) {\n    const r = ch(t);\n    this.playerQueue.forEach(({\n      hls: n\n    }) => n && (n.setAudioOption(t) || n.setAudioOption(r)));\n  }\n  onSubtitleTrackSwitch(e, t) {\n    const r = ch(t);\n    this.playerQueue.forEach(({\n      hls: n\n    }) => n && (n.setSubtitleOption(t) || t.id !== -1 && n.setSubtitleOption(r)));\n  }\n  onBufferCodecs(e, t) {\n    const r = t.tracks;\n    r && (this.requiredTracks = r);\n  }\n  onBufferAppended(e, t) {\n    this.checkBuffer();\n  }\n  onBufferFlushed(e, t) {\n    const r = this.playingItem;\n    if (r && !this.itemsMatch(r, this.bufferingItem) && !this.isInterstitial(r)) {\n      const n = this.timelinePos;\n      this.bufferedPos = n, this.checkBuffer();\n    }\n  }\n  onBufferedToEnd(e) {\n    if (!this.schedule)\n      return;\n    const t = this.schedule.events;\n    if (this.bufferedPos < Number.MAX_VALUE && t) {\n      for (let n = 0; n < t.length; n++) {\n        const i = t[n];\n        if (i.cue.post) {\n          var r;\n          const o = this.schedule.findEventIndex(i.identifier), a = (r = this.schedule.items) == null ? void 0 : r[o];\n          this.isInterstitial(a) && this.eventItemsMatch(a, this.bufferingItem) && this.bufferedToItem(a, 0);\n          break;\n        }\n      }\n      this.bufferedPos = Number.MAX_VALUE;\n    }\n  }\n  onMediaEnded(e) {\n    const t = this.playingItem;\n    if (!this.playingLastItem && t) {\n      const r = this.findItemIndex(t);\n      this.setSchedulePosition(r + 1);\n    } else\n      this.shouldPlay = !1;\n  }\n  updateItem(e, t) {\n    var r;\n    const n = (r = this.schedule) == null ? void 0 : r.items;\n    if (e && n) {\n      const i = this.findItemIndex(e, t);\n      return n[i] || null;\n    }\n    return null;\n  }\n  trimInPlace(e, t) {\n    if (this.isInterstitial(e) && e.event.appendInPlace && t.end - e.end > 0.25) {\n      e.event.assetList.forEach((i, o) => {\n        e.event.isAssetPastPlayoutLimit(o) && this.clearAssetPlayer(i.identifier, null);\n      });\n      const r = e.end + 0.25, n = Ce.bufferInfo(this.primaryMedia, r, 0);\n      (n.end > r || (n.nextStart || 0) > r) && (this.log(`trim buffered interstitial ${kr(e)} (was ${kr(t)})`), this.attachPrimary(r, null, !0), this.flushFrontBuffer(r));\n    }\n  }\n  itemsMatch(e, t) {\n    return !!t && (e === t || e.event && t.event && this.eventItemsMatch(e, t) || !e.event && !t.event && this.findItemIndex(e) === this.findItemIndex(t));\n  }\n  eventItemsMatch(e, t) {\n    var r;\n    return !!t && (e === t || e.event.identifier === ((r = t.event) == null ? void 0 : r.identifier));\n  }\n  findItemIndex(e, t) {\n    return e && this.schedule ? this.schedule.findItemIndex(e, t) : -1;\n  }\n  updateSchedule(e = !1) {\n    var t;\n    const r = this.mediaSelection;\n    r && ((t = this.schedule) == null || t.updateSchedule(r, [], e));\n  }\n  // Schedule buffer control\n  checkBuffer(e) {\n    var t;\n    const r = (t = this.schedule) == null ? void 0 : t.items;\n    if (!r)\n      return;\n    const n = Ce.bufferInfo(this.primaryMedia, this.timelinePos, 0);\n    e && (this.bufferedPos = this.timelinePos), e || (e = n.len < 1), this.updateBufferedPos(n.end, r, e);\n  }\n  updateBufferedPos(e, t, r) {\n    const n = this.schedule, i = this.bufferingItem;\n    if (this.bufferedPos > e || !n)\n      return;\n    if (t.length === 1 && this.itemsMatch(t[0], i)) {\n      this.bufferedPos = e;\n      return;\n    }\n    const o = this.playingItem, a = this.findItemIndex(o);\n    let l = n.findItemIndexAtTime(e);\n    if (this.bufferedPos < e) {\n      var c;\n      const u = this.findItemIndex(i), d = Math.min(u + 1, t.length - 1), h = t[d];\n      if ((l === -1 && i && e >= i.end || (c = h.event) != null && c.appendInPlace && e + 0.01 >= h.start) && (l = d), this.isInterstitial(i)) {\n        const f = i.event;\n        if (d - a > 1 && f.appendInPlace === !1 || f.assetList.length === 0 && f.assetListLoader)\n          return;\n      }\n      if (this.bufferedPos = e, l > u && l > a)\n        this.bufferedToItem(h);\n      else {\n        const f = this.primaryDetails;\n        this.primaryLive && f && e > f.edge - f.targetduration && h.start < f.edge + this.hls.config.interstitialLiveLookAhead && this.isInterstitial(h) && this.preloadAssets(h.event, 0);\n      }\n    } else r && o && !this.itemsMatch(o, i) && (l === a ? this.bufferedToItem(o) : l === a + 1 && this.bufferedToItem(t[l]));\n  }\n  assetsBuffered(e, t) {\n    return e.event.assetList.length === 0 ? !1 : !e.event.assetList.some((n) => {\n      const i = this.getAssetPlayer(n.identifier);\n      return !(i != null && i.bufferedInPlaceToEnd(t));\n    });\n  }\n  setBufferingItem(e) {\n    const t = this.bufferingItem, r = this.schedule;\n    if (!this.itemsMatch(e, t) && r) {\n      const {\n        items: n,\n        events: i\n      } = r;\n      if (!n || !i)\n        return t;\n      const o = this.isInterstitial(e), a = this.getBufferingPlayer();\n      this.bufferingItem = e, this.bufferedPos = Math.max(e.start, Math.min(e.end, this.timelinePos));\n      const l = a ? a.remaining : t ? t.end - this.timelinePos : 0;\n      if (this.log(`INTERSTITIALS_BUFFERED_TO_BOUNDARY ${kr(e)}` + (t ? ` (${l.toFixed(2)} remaining)` : \"\")), !this.playbackDisabled)\n        if (o) {\n          const c = r.findAssetIndex(e.event, this.bufferedPos);\n          e.event.assetList.forEach((u, d) => {\n            const h = this.getAssetPlayer(u.identifier);\n            h && (d === c && h.loadSource(), h.resumeBuffering());\n          });\n        } else\n          this.hls.resumeBuffering(), this.playerQueue.forEach((c) => c.pauseBuffering());\n      this.hls.trigger(I.INTERSTITIALS_BUFFERED_TO_BOUNDARY, {\n        events: i.slice(0),\n        schedule: n.slice(0),\n        bufferingIndex: this.findItemIndex(e),\n        playingIndex: this.findItemIndex(this.playingItem)\n      });\n    } else this.bufferingItem !== e && (this.bufferingItem = e);\n    return t;\n  }\n  bufferedToItem(e, t = 0) {\n    const r = this.setBufferingItem(e);\n    if (!this.playbackDisabled) {\n      if (this.isInterstitial(e))\n        this.bufferedToEvent(e, t);\n      else if (r !== null) {\n        this.bufferingAsset = null;\n        const n = this.detachedData;\n        n ? n.mediaSource ? this.attachPrimary(e.start, e, !0) : this.preloadPrimary(e) : this.preloadPrimary(e);\n      }\n    }\n  }\n  preloadPrimary(e) {\n    const t = this.findItemIndex(e), r = this.getPrimaryResumption(e, t);\n    this.startLoadingPrimaryAt(r);\n  }\n  bufferedToEvent(e, t) {\n    const r = e.event, n = r.assetList.length === 0 && !r.assetListLoader, i = r.cue.once;\n    if (n || !i) {\n      const o = this.preloadAssets(r, t);\n      if (o != null && o.interstitial.appendInPlace) {\n        const a = this.primaryMedia;\n        a && this.bufferAssetPlayer(o, a);\n      }\n    }\n  }\n  preloadAssets(e, t) {\n    const r = e.assetUrl, n = e.assetList.length, i = n === 0 && !e.assetListLoader, o = e.cue.once;\n    if (i) {\n      const l = e.timelineStart;\n      if (e.appendInPlace) {\n        var a;\n        const h = this.playingItem;\n        !this.isInterstitial(h) && (h == null || (a = h.nextEvent) == null ? void 0 : a.identifier) === e.identifier && this.flushFrontBuffer(l + 0.25);\n      }\n      let c, u = 0;\n      if (!this.playingItem && this.primaryLive && (u = this.hls.startPosition, u === -1 && (u = this.hls.liveSyncPosition || 0)), u && !(e.cue.pre || e.cue.post)) {\n        const h = u - l;\n        h > 0 && (c = Math.round(h * 1e3) / 1e3);\n      }\n      if (this.log(`Load interstitial asset ${t + 1}/${r ? 1 : n} ${e}${c ? ` live-start: ${u} start-offset: ${c}` : \"\"}`), r)\n        return this.createAsset(e, 0, 0, l, e.duration, r);\n      const d = this.assetListLoader.loadAssetList(e, c);\n      d && (e.assetListLoader = d);\n    } else if (!o && n) {\n      for (let c = t; c < n; c++) {\n        const u = e.assetList[c], d = this.getAssetPlayerQueueIndex(u.identifier);\n        (d === -1 || this.playerQueue[d].destroyed) && !u.error && this.createAssetPlayer(e, u, c);\n      }\n      const l = e.assetList[t];\n      if (l) {\n        const c = this.getAssetPlayer(l.identifier);\n        return c && c.loadSource(), c;\n      }\n    }\n    return null;\n  }\n  flushFrontBuffer(e) {\n    const t = this.requiredTracks;\n    if (!t)\n      return;\n    this.log(`Removing front buffer starting at ${e}`), Object.keys(t).forEach((n) => {\n      this.hls.trigger(I.BUFFER_FLUSHING, {\n        startOffset: e,\n        endOffset: 1 / 0,\n        type: n\n      });\n    });\n  }\n  // Interstitial Asset Player control\n  getAssetPlayerQueueIndex(e) {\n    const t = this.playerQueue;\n    for (let r = 0; r < t.length; r++)\n      if (e === t[r].assetId)\n        return r;\n    return -1;\n  }\n  getAssetPlayer(e) {\n    const t = this.getAssetPlayerQueueIndex(e);\n    return this.playerQueue[t] || null;\n  }\n  getBufferingPlayer() {\n    const {\n      playerQueue: e,\n      primaryMedia: t\n    } = this;\n    if (t) {\n      for (let r = 0; r < e.length; r++)\n        if (e[r].media === t)\n          return e[r];\n    }\n    return null;\n  }\n  createAsset(e, t, r, n, i, o) {\n    const a = {\n      parentIdentifier: e.identifier,\n      identifier: gw(e, o, t),\n      duration: i,\n      startOffset: r,\n      timelineStart: n,\n      uri: o\n    };\n    return this.createAssetPlayer(e, a, t);\n  }\n  createAssetPlayer(e, t, r) {\n    const n = this.hls, i = n.userConfig;\n    let o = i.videoPreference;\n    const a = n.loadLevelObj || n.levels[n.currentLevel];\n    (o || a) && (o = nt({}, o), a.videoCodec && (o.videoCodec = a.videoCodec), a.videoRange && (o.allowedVideoRanges = [a.videoRange]));\n    const l = n.audioTracks[n.audioTrack], c = n.subtitleTracks[n.subtitleTrack];\n    let u = 0;\n    if (this.primaryLive || e.appendInPlace) {\n      const F = this.timelinePos - t.timelineStart;\n      if (F > 1) {\n        const M = t.duration;\n        M && F < M && (u = F);\n      }\n    }\n    const d = t.identifier, h = tt(tt({}, i), {}, {\n      maxMaxBufferLength: Math.min(180, n.config.maxMaxBufferLength),\n      autoStartLoad: !0,\n      startFragPrefetch: !0,\n      primarySessionId: n.sessionId,\n      assetPlayerId: d,\n      abrEwmaDefaultEstimate: n.bandwidthEstimate,\n      interstitialsController: void 0,\n      startPosition: u,\n      liveDurationInfinity: !1,\n      testBandwidth: !1,\n      videoPreference: o,\n      audioPreference: l || i.audioPreference,\n      subtitlePreference: c || i.subtitlePreference\n    });\n    e.appendInPlace && (e.appendInPlaceStarted = !0, t.timelineStart && (h.timelineOffset = t.timelineStart));\n    const f = h.cmcd;\n    f != null && f.sessionId && f.contentId && (h.cmcd = nt({}, f, {\n      contentId: Xn(t.uri)\n    })), this.getAssetPlayer(d) && this.warn(`Duplicate date range identifier ${e} and asset ${d}`);\n    const p = new yw(this.HlsPlayerClass, h, e, t);\n    this.playerQueue.push(p), e.assetList[r] = t;\n    let y = !0;\n    const E = (F) => {\n      if (F.live) {\n        var M;\n        const j = new Error(`Interstitials MUST be VOD assets ${e}`), C = {\n          fatal: !0,\n          type: ve.OTHER_ERROR,\n          details: J.INTERSTITIAL_ASSET_ITEM_ERROR,\n          error: j\n        }, k = ((M = this.schedule) == null ? void 0 : M.findEventIndex(e.identifier)) || -1;\n        this.handleAssetItemError(C, e, k, r, j.message);\n        return;\n      }\n      const H = F.edge - F.fragmentStart, K = t.duration;\n      (y || K === null || H > K) && (y = !1, this.log(`Interstitial asset \"${d}\" duration change ${K} > ${H}`), t.duration = H, this.updateSchedule());\n    };\n    p.on(I.LEVEL_UPDATED, (F, {\n      details: M\n    }) => E(M)), p.on(I.LEVEL_PTS_UPDATED, (F, {\n      details: M\n    }) => E(M)), p.on(I.EVENT_CUE_ENTER, () => this.onInterstitialCueEnter());\n    const b = (F, M) => {\n      const H = this.getAssetPlayer(d);\n      if (H && M.tracks) {\n        H.off(I.BUFFER_CODECS, b), H.tracks = M.tracks;\n        const K = this.primaryMedia;\n        this.bufferingAsset === H.assetItem && K && !H.media && this.bufferAssetPlayer(H, K);\n      }\n    };\n    p.on(I.BUFFER_CODECS, b);\n    const R = () => {\n      var F;\n      const M = this.getAssetPlayer(d);\n      if (this.log(`buffered to end of asset ${M}`), !M || !this.schedule)\n        return;\n      const H = this.schedule.findEventIndex(e.identifier), K = (F = this.schedule.items) == null ? void 0 : F[H];\n      this.isInterstitial(K) && this.advanceAssetBuffering(K, t);\n    };\n    p.on(I.BUFFERED_TO_END, R);\n    const A = (F) => () => {\n      if (!this.getAssetPlayer(d) || !this.schedule)\n        return;\n      this.shouldPlay = !0;\n      const H = this.schedule.findEventIndex(e.identifier);\n      this.advanceAfterAssetEnded(e, H, F);\n    };\n    return p.once(I.MEDIA_ENDED, A(r)), p.once(I.PLAYOUT_LIMIT_REACHED, A(1 / 0)), p.on(I.ERROR, (F, M) => {\n      if (!this.schedule)\n        return;\n      const H = this.getAssetPlayer(d);\n      if (M.details === J.BUFFER_STALLED_ERROR) {\n        if (H != null && H.appendInPlace) {\n          this.handleInPlaceStall(e);\n          return;\n        }\n        this.onTimeupdate(), this.checkBuffer(!0);\n        return;\n      }\n      this.handleAssetItemError(M, e, this.schedule.findEventIndex(e.identifier), r, `Asset player error ${M.error} ${e}`);\n    }), p.on(I.DESTROYING, () => {\n      if (!this.getAssetPlayer(d) || !this.schedule)\n        return;\n      const M = new Error(`Asset player destroyed unexpectedly ${d}`), H = {\n        fatal: !0,\n        type: ve.OTHER_ERROR,\n        details: J.INTERSTITIAL_ASSET_ITEM_ERROR,\n        error: M\n      };\n      this.handleAssetItemError(H, e, this.schedule.findEventIndex(e.identifier), r, M.message);\n    }), this.log(`INTERSTITIAL_ASSET_PLAYER_CREATED ${vn(t)}`), this.hls.trigger(I.INTERSTITIAL_ASSET_PLAYER_CREATED, {\n      asset: t,\n      assetListIndex: r,\n      event: e,\n      player: p\n    }), p;\n  }\n  clearInterstitial(e, t) {\n    e.assetList.forEach((r) => {\n      this.clearAssetPlayer(r.identifier, t);\n    }), e.reset();\n  }\n  resetAssetPlayer(e) {\n    const t = this.getAssetPlayerQueueIndex(e);\n    if (t !== -1) {\n      this.log(`reset asset player \"${e}\" after error`);\n      const r = this.playerQueue[t];\n      this.transferMediaFromPlayer(r, null), r.resetDetails();\n    }\n  }\n  clearAssetPlayer(e, t) {\n    const r = this.getAssetPlayerQueueIndex(e);\n    if (r !== -1) {\n      const n = this.playerQueue[r];\n      this.log(`clear ${n} toSegment: ${t && kr(t)}`), this.transferMediaFromPlayer(n, t), this.playerQueue.splice(r, 1), n.destroy();\n    }\n  }\n  emptyPlayerQueue() {\n    let e;\n    for (; e = this.playerQueue.pop(); )\n      e.destroy();\n    this.playerQueue = [];\n  }\n  startAssetPlayer(e, t, r, n, i) {\n    const {\n      interstitial: o,\n      assetItem: a,\n      assetId: l\n    } = e, c = o.assetList.length, u = this.playingAsset;\n    this.endedAsset = null, this.playingAsset = a, (!u || u.identifier !== l) && (u && (this.clearAssetPlayer(u.identifier, r[n]), delete u.error), this.log(`INTERSTITIAL_ASSET_STARTED ${t + 1}/${c} ${vn(a)}`), this.hls.trigger(I.INTERSTITIAL_ASSET_STARTED, {\n      asset: a,\n      assetListIndex: t,\n      event: o,\n      schedule: r.slice(0),\n      scheduleIndex: n,\n      player: e\n    })), this.bufferAssetPlayer(e, i);\n  }\n  bufferAssetPlayer(e, t) {\n    var r, n;\n    if (!this.schedule)\n      return;\n    const {\n      interstitial: i,\n      assetItem: o\n    } = e, a = this.schedule.findEventIndex(i.identifier), l = (r = this.schedule.items) == null ? void 0 : r[a];\n    if (!l)\n      return;\n    e.loadSource(), this.setBufferingItem(l), this.bufferingAsset = o;\n    const c = this.getBufferingPlayer();\n    if (c === e)\n      return;\n    const u = i.appendInPlace;\n    if (u && (c == null ? void 0 : c.interstitial.appendInPlace) === !1)\n      return;\n    const d = (c == null ? void 0 : c.tracks) || ((n = this.detachedData) == null ? void 0 : n.tracks) || this.requiredTracks;\n    if (u && o !== this.playingAsset) {\n      if (!e.tracks) {\n        this.log(`Waiting for track info before buffering ${e}`);\n        return;\n      }\n      if (d && !Ag(d, e.tracks)) {\n        const h = new Error(`Asset ${vn(o)} SourceBuffer tracks ('${Object.keys(e.tracks)}') are not compatible with primary content tracks ('${Object.keys(d)}')`), f = {\n          fatal: !0,\n          type: ve.OTHER_ERROR,\n          details: J.INTERSTITIAL_ASSET_ITEM_ERROR,\n          error: h\n        }, p = i.findAssetIndex(o);\n        this.handleAssetItemError(f, i, a, p, h.message);\n        return;\n      }\n    }\n    this.transferMediaTo(e, t);\n  }\n  handleInPlaceStall(e) {\n    const t = this.schedule, r = this.primaryMedia;\n    if (!t || !r)\n      return;\n    const n = r.currentTime, i = t.findAssetIndex(e, n), o = e.assetList[i];\n    if (o) {\n      const a = this.getAssetPlayer(o.identifier);\n      if (a) {\n        const l = a.currentTime || n - o.timelineStart, c = a.duration - l;\n        if (this.warn(`Stalled at ${l} of ${l + c} in ${a} ${e} (media.currentTime: ${n})`), l && (c / r.playbackRate < 0.5 || a.bufferedInPlaceToEnd(r)) && a.hls) {\n          const u = t.findEventIndex(e.identifier);\n          this.advanceAfterAssetEnded(e, u, i);\n        }\n      }\n    }\n  }\n  advanceInPlace(e) {\n    const t = this.primaryMedia;\n    t && t.currentTime < e && (t.currentTime = e);\n  }\n  handleAssetItemError(e, t, r, n, i) {\n    if (e.details === J.BUFFER_STALLED_ERROR)\n      return;\n    const o = t.assetList[n] || null;\n    if (this.warn(`INTERSTITIAL_ASSET_ERROR ${o && vn(o)} ${e.error}`), !this.schedule)\n      return;\n    const a = (o == null ? void 0 : o.identifier) || \"\", l = this.getAssetPlayerQueueIndex(a), c = this.playerQueue[l] || null, u = this.schedule.items, d = nt({}, e, {\n      fatal: !1,\n      errorAction: An(!0),\n      asset: o,\n      assetListIndex: n,\n      event: t,\n      schedule: u,\n      scheduleIndex: r,\n      player: c\n    });\n    if (this.hls.trigger(I.INTERSTITIAL_ASSET_ERROR, d), !e.fatal)\n      return;\n    const h = this.playingAsset, f = this.bufferingAsset, p = new Error(i);\n    if (o && (this.clearAssetPlayer(a, null), o.error = p), !t.assetList.some((y) => !y.error))\n      t.error = p;\n    else\n      for (let y = n; y < t.assetList.length; y++)\n        this.resetAssetPlayer(t.assetList[y].identifier);\n    this.updateSchedule(!0), t.error ? this.primaryFallback(t) : h && h.identifier === a ? this.advanceAfterAssetEnded(t, r, n) : f && f.identifier === a && this.isInterstitial(this.bufferingItem) && this.advanceAssetBuffering(this.bufferingItem, f);\n  }\n  primaryFallback(e) {\n    const t = e.timelineStart, r = this.effectivePlayingItem;\n    if (r) {\n      this.log(`Fallback to primary from event \"${e.identifier}\" start: ${t} pos: ${this.timelinePos} playing: ${kr(r)} error: ${e.error}`);\n      let n = this.timelinePos;\n      n === -1 && (n = this.hls.startPosition);\n      const i = this.updateItem(r, n);\n      if (this.itemsMatch(r, i) && this.clearInterstitial(e, null), e.appendInPlace && (this.attachPrimary(t, null), this.flushFrontBuffer(t)), !this.schedule)\n        return;\n      const o = this.schedule.findItemIndexAtTime(n);\n      this.setSchedulePosition(o);\n    } else\n      this.checkStart();\n  }\n  // Asset List loading\n  onAssetListLoaded(e, t) {\n    var r, n;\n    const i = t.event, o = i.identifier, a = t.assetListResponse.ASSETS;\n    if (!((r = this.schedule) != null && r.hasEvent(o)))\n      return;\n    const l = i.timelineStart, c = i.duration;\n    let u = 0;\n    a.forEach((y, E) => {\n      const b = parseFloat(y.DURATION);\n      this.createAsset(i, E, u, l + u, b, y.URI), u += b;\n    }), i.duration = u, this.log(`Loaded asset-list with duration: ${u} (was: ${c}) ${i}`);\n    const d = this.waitingItem, h = (d == null ? void 0 : d.event.identifier) === o;\n    this.updateSchedule();\n    const f = (n = this.bufferingItem) == null ? void 0 : n.event;\n    if (h) {\n      var p;\n      const y = this.schedule.findEventIndex(o), E = (p = this.schedule.items) == null ? void 0 : p[y];\n      if (E) {\n        if (!this.playingItem && this.timelinePos > E.end && this.schedule.findItemIndexAtTime(this.timelinePos) !== y) {\n          i.error = new Error(`Interstitial no longer within playback range ${this.timelinePos} ${i}`), this.updateSchedule(!0), this.primaryFallback(i);\n          return;\n        }\n        this.setBufferingItem(E);\n      }\n      this.setSchedulePosition(y);\n    } else if ((f == null ? void 0 : f.identifier) === o) {\n      const y = i.assetList[0];\n      if (y) {\n        const E = this.getAssetPlayer(y.identifier);\n        if (f.appendInPlace) {\n          const b = this.primaryMedia;\n          E && b && this.bufferAssetPlayer(E, b);\n        } else E && E.loadSource();\n      }\n    }\n  }\n  onError(e, t) {\n    if (this.schedule)\n      switch (t.details) {\n        case J.ASSET_LIST_PARSING_ERROR:\n        case J.ASSET_LIST_LOAD_ERROR:\n        case J.ASSET_LIST_LOAD_TIMEOUT: {\n          const r = t.interstitial;\n          r && (this.updateSchedule(!0), this.primaryFallback(r));\n          break;\n        }\n        case J.BUFFER_STALLED_ERROR: {\n          const r = this.endedItem || this.waitingItem || this.playingItem;\n          if (this.isInterstitial(r) && r.event.appendInPlace) {\n            this.handleInPlaceStall(r.event);\n            return;\n          }\n          this.log(`Primary player stall @${this.timelinePos} bufferedPos: ${this.bufferedPos}`), this.onTimeupdate(), this.checkBuffer(!0);\n          break;\n        }\n      }\n  }\n}\nconst Qh = 500;\nclass Sw extends Tu {\n  constructor(e, t, r) {\n    super(e, t, r, \"subtitle-stream-controller\", pe.SUBTITLE), this.currentTrackId = -1, this.tracksBuffered = [], this.mainDetails = null, this.registerListeners();\n  }\n  onHandlerDestroying() {\n    this.unregisterListeners(), super.onHandlerDestroying(), this.mainDetails = null;\n  }\n  registerListeners() {\n    super.registerListeners();\n    const {\n      hls: e\n    } = this;\n    e.on(I.LEVEL_LOADED, this.onLevelLoaded, this), e.on(I.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this), e.on(I.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this), e.on(I.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this), e.on(I.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this), e.on(I.BUFFER_FLUSHING, this.onBufferFlushing, this);\n  }\n  unregisterListeners() {\n    super.unregisterListeners();\n    const {\n      hls: e\n    } = this;\n    e.off(I.LEVEL_LOADED, this.onLevelLoaded, this), e.off(I.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this), e.off(I.SUBTITLE_TRACK_SWITCH, this.onSubtitleTrackSwitch, this), e.off(I.SUBTITLE_TRACK_LOADED, this.onSubtitleTrackLoaded, this), e.off(I.SUBTITLE_FRAG_PROCESSED, this.onSubtitleFragProcessed, this), e.off(I.BUFFER_FLUSHING, this.onBufferFlushing, this);\n  }\n  startLoad(e, t) {\n    this.stopLoad(), this.state = ne.IDLE, this.setInterval(Qh), this.nextLoadPosition = this.lastCurrentTime = e + this.timelineOffset, this.startPosition = t ? -1 : e, this.tick();\n  }\n  onManifestLoading() {\n    super.onManifestLoading(), this.mainDetails = null;\n  }\n  onMediaDetaching(e, t) {\n    this.tracksBuffered = [], super.onMediaDetaching(e, t);\n  }\n  onLevelLoaded(e, t) {\n    this.mainDetails = t.details;\n  }\n  onSubtitleFragProcessed(e, t) {\n    const {\n      frag: r,\n      success: n\n    } = t;\n    if (this.fragContextChanged(r) || (Vt(r) && (this.fragPrevious = r), this.state = ne.IDLE), !n)\n      return;\n    const i = this.tracksBuffered[this.currentTrackId];\n    if (!i)\n      return;\n    let o;\n    const a = r.start;\n    for (let c = 0; c < i.length; c++)\n      if (a >= i[c].start && a <= i[c].end) {\n        o = i[c];\n        break;\n      }\n    const l = r.start + r.duration;\n    o ? o.end = l : (o = {\n      start: a,\n      end: l\n    }, i.push(o)), this.fragmentTracker.fragBuffered(r), this.fragBufferedComplete(r, null), this.media && this.tick();\n  }\n  onBufferFlushing(e, t) {\n    const {\n      startOffset: r,\n      endOffset: n\n    } = t;\n    if (r === 0 && n !== Number.POSITIVE_INFINITY) {\n      const i = n - 1;\n      if (i <= 0)\n        return;\n      t.endOffsetSubtitles = Math.max(0, i), this.tracksBuffered.forEach((o) => {\n        for (let a = 0; a < o.length; ) {\n          if (o[a].end <= i) {\n            o.shift();\n            continue;\n          } else if (o[a].start < i)\n            o[a].start = i;\n          else\n            break;\n          a++;\n        }\n      }), this.fragmentTracker.removeFragmentsInRange(r, i, pe.SUBTITLE);\n    }\n  }\n  // If something goes wrong, proceed to next frag, if we were processing one.\n  onError(e, t) {\n    const r = t.frag;\n    (r == null ? void 0 : r.type) === pe.SUBTITLE && (t.details === J.FRAG_GAP && this.fragmentTracker.fragBuffered(r, !0), this.fragCurrent && this.fragCurrent.abortRequests(), this.state !== ne.STOPPED && (this.state = ne.IDLE));\n  }\n  // Got all new subtitle levels.\n  onSubtitleTracksUpdated(e, {\n    subtitleTracks: t\n  }) {\n    if (this.levels && Ap(this.levels, t)) {\n      this.levels = t.map((r) => new mi(r));\n      return;\n    }\n    this.tracksBuffered = [], this.levels = t.map((r) => {\n      const n = new mi(r);\n      return this.tracksBuffered[n.id] = [], n;\n    }), this.fragmentTracker.removeFragmentsInRange(0, Number.POSITIVE_INFINITY, pe.SUBTITLE), this.fragPrevious = null, this.mediaBuffer = null;\n  }\n  onSubtitleTrackSwitch(e, t) {\n    var r;\n    if (this.currentTrackId = t.id, !((r = this.levels) != null && r.length) || this.currentTrackId === -1) {\n      this.clearInterval();\n      return;\n    }\n    const n = this.levels[this.currentTrackId];\n    n != null && n.details ? this.mediaBuffer = this.mediaBufferTimeRanges : this.mediaBuffer = null, n && this.state !== ne.STOPPED && this.setInterval(Qh);\n  }\n  // Got a new set of subtitle fragments.\n  onSubtitleTrackLoaded(e, t) {\n    var r;\n    const {\n      currentTrackId: n,\n      levels: i\n    } = this, {\n      details: o,\n      id: a\n    } = t;\n    if (!i) {\n      this.warn(`Subtitle tracks were reset while loading level ${a}`);\n      return;\n    }\n    const l = i[a];\n    if (a >= i.length || !l)\n      return;\n    this.log(`Subtitle track ${a} loaded [${o.startSN},${o.endSN}]${o.lastPartSn ? `[part-${o.lastPartSn}-${o.lastPartIndex}]` : \"\"},duration:${o.totalduration}`), this.mediaBuffer = this.mediaBufferTimeRanges;\n    let c = 0;\n    if (o.live || (r = l.details) != null && r.live) {\n      if (o.deltaUpdateFailed)\n        return;\n      const d = this.mainDetails;\n      if (!d) {\n        this.startFragRequested = !1;\n        return;\n      }\n      const h = d.fragments[0];\n      if (!l.details)\n        o.hasProgramDateTime && d.hasProgramDateTime ? (sa(o, d), c = o.fragmentStart) : h && (c = h.start, gc(o, c));\n      else {\n        var u;\n        c = this.alignPlaylists(o, l.details, (u = this.levelLastLoaded) == null ? void 0 : u.details), c === 0 && h && (c = h.start, gc(o, c));\n      }\n      d && !this.startFragRequested && this.setStartPosition(d, c);\n    }\n    l.details = o, this.levelLastLoaded = l, a === n && (this.hls.trigger(I.SUBTITLE_TRACK_UPDATED, {\n      details: o,\n      id: a,\n      groupId: t.groupId\n    }), this.tick(), o.live && !this.fragCurrent && this.media && this.state === ne.IDLE && (Js(null, o.fragments, this.media.currentTime, 0) || (this.warn(\"Subtitle playlist not aligned with playback\"), l.details = void 0)));\n  }\n  _handleFragmentLoadComplete(e) {\n    const {\n      frag: t,\n      payload: r\n    } = e, n = t.decryptdata, i = this.hls;\n    if (!this.fragContextChanged(t) && r && r.byteLength > 0 && n != null && n.key && n.iv && In(n.method)) {\n      const o = performance.now();\n      this.decrypter.decrypt(new Uint8Array(r), n.key.buffer, n.iv.buffer, Su(n.method)).catch((a) => {\n        throw i.trigger(I.ERROR, {\n          type: ve.MEDIA_ERROR,\n          details: J.FRAG_DECRYPT_ERROR,\n          fatal: !1,\n          error: a,\n          reason: a.message,\n          frag: t\n        }), a;\n      }).then((a) => {\n        const l = performance.now();\n        i.trigger(I.FRAG_DECRYPTED, {\n          frag: t,\n          payload: a,\n          stats: {\n            tstart: o,\n            tdecrypt: l\n          }\n        });\n      }).catch((a) => {\n        this.warn(`${a.name}: ${a.message}`), this.state = ne.IDLE;\n      });\n    }\n  }\n  doTick() {\n    if (!this.media) {\n      this.state = ne.IDLE;\n      return;\n    }\n    if (this.state === ne.IDLE) {\n      const {\n        currentTrackId: e,\n        levels: t\n      } = this, r = t == null ? void 0 : t[e];\n      if (!r || !t.length || !r.details || this.waitForLive(r))\n        return;\n      const {\n        config: n\n      } = this, i = this.getLoadPosition(), o = Ce.bufferedInfo(this.tracksBuffered[this.currentTrackId] || [], i, n.maxBufferHole), {\n        end: a,\n        len: l\n      } = o, c = r.details, u = this.hls.maxBufferLength + c.levelTargetDuration;\n      if (l > u)\n        return;\n      const d = c.fragments, h = d.length, f = c.edge;\n      let p = null;\n      const y = this.fragPrevious;\n      if (a < f) {\n        const R = n.maxFragLookUpTolerance, A = a > f - R ? 0 : R;\n        p = Js(y, d, Math.max(d[0].start, a), A), !p && y && y.start < d[0].start && (p = d[0]);\n      } else\n        p = d[h - 1];\n      if (p = this.filterReplacedPrimary(p, r.details), !p)\n        return;\n      const E = p.sn - c.startSN, b = d[E - 1];\n      if (b && b.cc === p.cc && this.fragmentTracker.getState(b) === Ht.NOT_LOADED && (p = b), this.fragmentTracker.getState(p) === Ht.NOT_LOADED) {\n        const R = this.mapToInitFragWhenRequired(p);\n        R && this.loadFragment(R, r, a);\n      }\n    }\n  }\n  loadFragment(e, t, r) {\n    Vt(e) ? super.loadFragment(e, t, r) : this._loadInitSegment(e, t);\n  }\n  get mediaBufferTimeRanges() {\n    return new bw(this.tracksBuffered[this.currentTrackId] || []);\n  }\n}\nclass bw {\n  constructor(e) {\n    this.buffered = void 0;\n    const t = (r, n, i) => {\n      if (n = n >>> 0, n > i - 1)\n        throw new DOMException(`Failed to execute '${r}' on 'TimeRanges': The index provided (${n}) is greater than the maximum bound (${i})`);\n      return e[n][r];\n    };\n    this.buffered = {\n      get length() {\n        return e.length;\n      },\n      end(r) {\n        return t(\"end\", r, e.length);\n      },\n      start(r) {\n        return t(\"start\", r, e.length);\n      }\n    };\n  }\n}\nconst Tw = {\n  42: 225,\n  // lowercase a, acute accent\n  92: 233,\n  // lowercase e, acute accent\n  94: 237,\n  // lowercase i, acute accent\n  95: 243,\n  // lowercase o, acute accent\n  96: 250,\n  // lowercase u, acute accent\n  123: 231,\n  // lowercase c with cedilla\n  124: 247,\n  // division symbol\n  125: 209,\n  // uppercase N tilde\n  126: 241,\n  // lowercase n tilde\n  127: 9608,\n  // Full block\n  // THIS BLOCK INCLUDES THE 16 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n  // THAT COME FROM HI BYTE=0x11 AND LOW BETWEEN 0x30 AND 0x3F\n  // THIS MEANS THAT \\x50 MUST BE ADDED TO THE VALUES\n  128: 174,\n  // Registered symbol (R)\n  129: 176,\n  // degree sign\n  130: 189,\n  // 1/2 symbol\n  131: 191,\n  // Inverted (open) question mark\n  132: 8482,\n  // Trademark symbol (TM)\n  133: 162,\n  // Cents symbol\n  134: 163,\n  // Pounds sterling\n  135: 9834,\n  // Music 8'th note\n  136: 224,\n  // lowercase a, grave accent\n  137: 32,\n  // transparent space (regular)\n  138: 232,\n  // lowercase e, grave accent\n  139: 226,\n  // lowercase a, circumflex accent\n  140: 234,\n  // lowercase e, circumflex accent\n  141: 238,\n  // lowercase i, circumflex accent\n  142: 244,\n  // lowercase o, circumflex accent\n  143: 251,\n  // lowercase u, circumflex accent\n  // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n  // THAT COME FROM HI BYTE=0x12 AND LOW BETWEEN 0x20 AND 0x3F\n  144: 193,\n  // capital letter A with acute\n  145: 201,\n  // capital letter E with acute\n  146: 211,\n  // capital letter O with acute\n  147: 218,\n  // capital letter U with acute\n  148: 220,\n  // capital letter U with diaresis\n  149: 252,\n  // lowercase letter U with diaeresis\n  150: 8216,\n  // opening single quote\n  151: 161,\n  // inverted exclamation mark\n  152: 42,\n  // asterisk\n  153: 8217,\n  // closing single quote\n  154: 9473,\n  // box drawings heavy horizontal\n  155: 169,\n  // copyright sign\n  156: 8480,\n  // Service mark\n  157: 8226,\n  // (round) bullet\n  158: 8220,\n  // Left double quotation mark\n  159: 8221,\n  // Right double quotation mark\n  160: 192,\n  // uppercase A, grave accent\n  161: 194,\n  // uppercase A, circumflex\n  162: 199,\n  // uppercase C with cedilla\n  163: 200,\n  // uppercase E, grave accent\n  164: 202,\n  // uppercase E, circumflex\n  165: 203,\n  // capital letter E with diaresis\n  166: 235,\n  // lowercase letter e with diaresis\n  167: 206,\n  // uppercase I, circumflex\n  168: 207,\n  // uppercase I, with diaresis\n  169: 239,\n  // lowercase i, with diaresis\n  170: 212,\n  // uppercase O, circumflex\n  171: 217,\n  // uppercase U, grave accent\n  172: 249,\n  // lowercase u, grave accent\n  173: 219,\n  // uppercase U, circumflex\n  174: 171,\n  // left-pointing double angle quotation mark\n  175: 187,\n  // right-pointing double angle quotation mark\n  // THIS BLOCK INCLUDES THE 32 EXTENDED (TWO-BYTE) LINE 21 CHARACTERS\n  // THAT COME FROM HI BYTE=0x13 AND LOW BETWEEN 0x20 AND 0x3F\n  176: 195,\n  // Uppercase A, tilde\n  177: 227,\n  // Lowercase a, tilde\n  178: 205,\n  // Uppercase I, acute accent\n  179: 204,\n  // Uppercase I, grave accent\n  180: 236,\n  // Lowercase i, grave accent\n  181: 210,\n  // Uppercase O, grave accent\n  182: 242,\n  // Lowercase o, grave accent\n  183: 213,\n  // Uppercase O, tilde\n  184: 245,\n  // Lowercase o, tilde\n  185: 123,\n  // Open curly brace\n  186: 125,\n  // Closing curly brace\n  187: 92,\n  // Backslash\n  188: 94,\n  // Caret\n  189: 95,\n  // Underscore\n  190: 124,\n  // Pipe (vertical line)\n  191: 8764,\n  // Tilde operator\n  192: 196,\n  // Uppercase A, umlaut\n  193: 228,\n  // Lowercase A, umlaut\n  194: 214,\n  // Uppercase O, umlaut\n  195: 246,\n  // Lowercase o, umlaut\n  196: 223,\n  // Esszett (sharp S)\n  197: 165,\n  // Yen symbol\n  198: 164,\n  // Generic currency sign\n  199: 9475,\n  // Box drawings heavy vertical\n  200: 197,\n  // Uppercase A, ring\n  201: 229,\n  // Lowercase A, ring\n  202: 216,\n  // Uppercase O, stroke\n  203: 248,\n  // Lowercase o, strok\n  204: 9487,\n  // Box drawings heavy down and right\n  205: 9491,\n  // Box drawings heavy down and left\n  206: 9495,\n  // Box drawings heavy up and right\n  207: 9499\n  // Box drawings heavy up and left\n}, Gp = (s) => String.fromCharCode(Tw[s] || s), Dr = 15, is = 100, ww = {\n  17: 1,\n  18: 3,\n  21: 5,\n  22: 7,\n  23: 9,\n  16: 11,\n  19: 12,\n  20: 14\n}, Aw = {\n  17: 2,\n  18: 4,\n  21: 6,\n  22: 8,\n  23: 10,\n  19: 13,\n  20: 15\n}, Iw = {\n  25: 1,\n  26: 3,\n  29: 5,\n  30: 7,\n  31: 9,\n  24: 11,\n  27: 12,\n  28: 14\n}, _w = {\n  25: 2,\n  26: 4,\n  29: 6,\n  30: 8,\n  31: 10,\n  27: 13,\n  28: 15\n}, Rw = [\"white\", \"green\", \"blue\", \"cyan\", \"red\", \"yellow\", \"magenta\", \"black\", \"transparent\"];\nclass Lw {\n  constructor() {\n    this.time = null, this.verboseLevel = 0;\n  }\n  log(e, t) {\n    if (this.verboseLevel >= e) {\n      const r = typeof t == \"function\" ? t() : t;\n      rt.log(`${this.time} [${e}] ${r}`);\n    }\n  }\n}\nconst Ns = function(e) {\n  const t = [];\n  for (let r = 0; r < e.length; r++)\n    t.push(e[r].toString(16));\n  return t;\n};\nclass Vp {\n  constructor() {\n    this.foreground = \"white\", this.underline = !1, this.italics = !1, this.background = \"black\", this.flash = !1;\n  }\n  reset() {\n    this.foreground = \"white\", this.underline = !1, this.italics = !1, this.background = \"black\", this.flash = !1;\n  }\n  setStyles(e) {\n    const t = [\"foreground\", \"underline\", \"italics\", \"background\", \"flash\"];\n    for (let r = 0; r < t.length; r++) {\n      const n = t[r];\n      e.hasOwnProperty(n) && (this[n] = e[n]);\n    }\n  }\n  isDefault() {\n    return this.foreground === \"white\" && !this.underline && !this.italics && this.background === \"black\" && !this.flash;\n  }\n  equals(e) {\n    return this.foreground === e.foreground && this.underline === e.underline && this.italics === e.italics && this.background === e.background && this.flash === e.flash;\n  }\n  copy(e) {\n    this.foreground = e.foreground, this.underline = e.underline, this.italics = e.italics, this.background = e.background, this.flash = e.flash;\n  }\n  toString() {\n    return \"color=\" + this.foreground + \", underline=\" + this.underline + \", italics=\" + this.italics + \", background=\" + this.background + \", flash=\" + this.flash;\n  }\n}\nclass Cw {\n  constructor() {\n    this.uchar = \" \", this.penState = new Vp();\n  }\n  reset() {\n    this.uchar = \" \", this.penState.reset();\n  }\n  setChar(e, t) {\n    this.uchar = e, this.penState.copy(t);\n  }\n  setPenState(e) {\n    this.penState.copy(e);\n  }\n  equals(e) {\n    return this.uchar === e.uchar && this.penState.equals(e.penState);\n  }\n  copy(e) {\n    this.uchar = e.uchar, this.penState.copy(e.penState);\n  }\n  isEmpty() {\n    return this.uchar === \" \" && this.penState.isDefault();\n  }\n}\nclass kw {\n  constructor(e) {\n    this.chars = [], this.pos = 0, this.currPenState = new Vp(), this.cueStartTime = null, this.logger = void 0;\n    for (let t = 0; t < is; t++)\n      this.chars.push(new Cw());\n    this.logger = e;\n  }\n  equals(e) {\n    for (let t = 0; t < is; t++)\n      if (!this.chars[t].equals(e.chars[t]))\n        return !1;\n    return !0;\n  }\n  copy(e) {\n    for (let t = 0; t < is; t++)\n      this.chars[t].copy(e.chars[t]);\n  }\n  isEmpty() {\n    let e = !0;\n    for (let t = 0; t < is; t++)\n      if (!this.chars[t].isEmpty()) {\n        e = !1;\n        break;\n      }\n    return e;\n  }\n  /**\n   *  Set the cursor to a valid column.\n   */\n  setCursor(e) {\n    this.pos !== e && (this.pos = e), this.pos < 0 ? (this.logger.log(3, \"Negative cursor position \" + this.pos), this.pos = 0) : this.pos > is && (this.logger.log(3, \"Too large cursor position \" + this.pos), this.pos = is);\n  }\n  /**\n   * Move the cursor relative to current position.\n   */\n  moveCursor(e) {\n    const t = this.pos + e;\n    if (e > 1)\n      for (let r = this.pos + 1; r < t + 1; r++)\n        this.chars[r].setPenState(this.currPenState);\n    this.setCursor(t);\n  }\n  /**\n   * Backspace, move one step back and clear character.\n   */\n  backSpace() {\n    this.moveCursor(-1), this.chars[this.pos].setChar(\" \", this.currPenState);\n  }\n  insertChar(e) {\n    e >= 144 && this.backSpace();\n    const t = Gp(e);\n    if (this.pos >= is) {\n      this.logger.log(0, () => \"Cannot insert \" + e.toString(16) + \" (\" + t + \") at position \" + this.pos + \". Skipping it!\");\n      return;\n    }\n    this.chars[this.pos].setChar(t, this.currPenState), this.moveCursor(1);\n  }\n  clearFromPos(e) {\n    let t;\n    for (t = e; t < is; t++)\n      this.chars[t].reset();\n  }\n  clear() {\n    this.clearFromPos(0), this.pos = 0, this.currPenState.reset();\n  }\n  clearToEndOfRow() {\n    this.clearFromPos(this.pos);\n  }\n  getTextString() {\n    const e = [];\n    let t = !0;\n    for (let r = 0; r < is; r++) {\n      const n = this.chars[r].uchar;\n      n !== \" \" && (t = !1), e.push(n);\n    }\n    return t ? \"\" : e.join(\"\");\n  }\n  setPenStyles(e) {\n    this.currPenState.setStyles(e), this.chars[this.pos].setPenState(this.currPenState);\n  }\n}\nclass wl {\n  constructor(e) {\n    this.rows = [], this.currRow = Dr - 1, this.nrRollUpRows = null, this.lastOutputScreen = null, this.logger = void 0;\n    for (let t = 0; t < Dr; t++)\n      this.rows.push(new kw(e));\n    this.logger = e;\n  }\n  reset() {\n    for (let e = 0; e < Dr; e++)\n      this.rows[e].clear();\n    this.currRow = Dr - 1;\n  }\n  equals(e) {\n    let t = !0;\n    for (let r = 0; r < Dr; r++)\n      if (!this.rows[r].equals(e.rows[r])) {\n        t = !1;\n        break;\n      }\n    return t;\n  }\n  copy(e) {\n    for (let t = 0; t < Dr; t++)\n      this.rows[t].copy(e.rows[t]);\n  }\n  isEmpty() {\n    let e = !0;\n    for (let t = 0; t < Dr; t++)\n      if (!this.rows[t].isEmpty()) {\n        e = !1;\n        break;\n      }\n    return e;\n  }\n  backSpace() {\n    this.rows[this.currRow].backSpace();\n  }\n  clearToEndOfRow() {\n    this.rows[this.currRow].clearToEndOfRow();\n  }\n  /**\n   * Insert a character (without styling) in the current row.\n   */\n  insertChar(e) {\n    this.rows[this.currRow].insertChar(e);\n  }\n  setPen(e) {\n    this.rows[this.currRow].setPenStyles(e);\n  }\n  moveCursor(e) {\n    this.rows[this.currRow].moveCursor(e);\n  }\n  setCursor(e) {\n    this.logger.log(2, \"setCursor: \" + e), this.rows[this.currRow].setCursor(e);\n  }\n  setPAC(e) {\n    this.logger.log(2, () => \"pacData = \" + at(e));\n    let t = e.row - 1;\n    if (this.nrRollUpRows && t < this.nrRollUpRows - 1 && (t = this.nrRollUpRows - 1), this.nrRollUpRows && this.currRow !== t) {\n      for (let a = 0; a < Dr; a++)\n        this.rows[a].clear();\n      const i = this.currRow + 1 - this.nrRollUpRows, o = this.lastOutputScreen;\n      if (o) {\n        const a = o.rows[i].cueStartTime, l = this.logger.time;\n        if (a !== null && l !== null && a < l)\n          for (let c = 0; c < this.nrRollUpRows; c++)\n            this.rows[t - this.nrRollUpRows + c + 1].copy(o.rows[i + c]);\n      }\n    }\n    this.currRow = t;\n    const r = this.rows[this.currRow];\n    if (e.indent !== null) {\n      const i = e.indent, o = Math.max(i - 1, 0);\n      r.setCursor(e.indent), e.color = r.chars[o].penState.foreground;\n    }\n    const n = {\n      foreground: e.color,\n      underline: e.underline,\n      italics: e.italics,\n      background: \"black\",\n      flash: !1\n    };\n    this.setPen(n);\n  }\n  /**\n   * Set background/extra foreground, but first do back_space, and then insert space (backwards compatibility).\n   */\n  setBkgData(e) {\n    this.logger.log(2, () => \"bkgData = \" + at(e)), this.backSpace(), this.setPen(e), this.insertChar(32);\n  }\n  setRollUpRows(e) {\n    this.nrRollUpRows = e;\n  }\n  rollUp() {\n    if (this.nrRollUpRows === null) {\n      this.logger.log(3, \"roll_up but nrRollUpRows not set yet\");\n      return;\n    }\n    this.logger.log(1, () => this.getDisplayText());\n    const e = this.currRow + 1 - this.nrRollUpRows, t = this.rows.splice(e, 1)[0];\n    t.clear(), this.rows.splice(this.currRow, 0, t), this.logger.log(2, \"Rolling up\");\n  }\n  /**\n   * Get all non-empty rows with as unicode text.\n   */\n  getDisplayText(e) {\n    e = e || !1;\n    const t = [];\n    let r = \"\", n = -1;\n    for (let i = 0; i < Dr; i++) {\n      const o = this.rows[i].getTextString();\n      o && (n = i + 1, e ? t.push(\"Row \" + n + \": '\" + o + \"'\") : t.push(o.trim()));\n    }\n    return t.length > 0 && (e ? r = \"[\" + t.join(\" | \") + \"]\" : r = t.join(`\n`)), r;\n  }\n  getTextAndFormat() {\n    return this.rows;\n  }\n}\nclass ef {\n  constructor(e, t, r) {\n    this.chNr = void 0, this.outputFilter = void 0, this.mode = void 0, this.verbose = void 0, this.displayedMemory = void 0, this.nonDisplayedMemory = void 0, this.lastOutputScreen = void 0, this.currRollUpRow = void 0, this.writeScreen = void 0, this.cueStartTime = void 0, this.logger = void 0, this.chNr = e, this.outputFilter = t, this.mode = null, this.verbose = 0, this.displayedMemory = new wl(r), this.nonDisplayedMemory = new wl(r), this.lastOutputScreen = new wl(r), this.currRollUpRow = this.displayedMemory.rows[Dr - 1], this.writeScreen = this.displayedMemory, this.mode = null, this.cueStartTime = null, this.logger = r;\n  }\n  reset() {\n    this.mode = null, this.displayedMemory.reset(), this.nonDisplayedMemory.reset(), this.lastOutputScreen.reset(), this.outputFilter.reset(), this.currRollUpRow = this.displayedMemory.rows[Dr - 1], this.writeScreen = this.displayedMemory, this.mode = null, this.cueStartTime = null;\n  }\n  getHandler() {\n    return this.outputFilter;\n  }\n  setHandler(e) {\n    this.outputFilter = e;\n  }\n  setPAC(e) {\n    this.writeScreen.setPAC(e);\n  }\n  setBkgData(e) {\n    this.writeScreen.setBkgData(e);\n  }\n  setMode(e) {\n    e !== this.mode && (this.mode = e, this.logger.log(2, () => \"MODE=\" + e), this.mode === \"MODE_POP-ON\" ? this.writeScreen = this.nonDisplayedMemory : (this.writeScreen = this.displayedMemory, this.writeScreen.reset()), this.mode !== \"MODE_ROLL-UP\" && (this.displayedMemory.nrRollUpRows = null, this.nonDisplayedMemory.nrRollUpRows = null), this.mode = e);\n  }\n  insertChars(e) {\n    for (let r = 0; r < e.length; r++)\n      this.writeScreen.insertChar(e[r]);\n    const t = this.writeScreen === this.displayedMemory ? \"DISP\" : \"NON_DISP\";\n    this.logger.log(2, () => t + \": \" + this.writeScreen.getDisplayText(!0)), (this.mode === \"MODE_PAINT-ON\" || this.mode === \"MODE_ROLL-UP\") && (this.logger.log(1, () => \"DISPLAYED: \" + this.displayedMemory.getDisplayText(!0)), this.outputDataUpdate());\n  }\n  ccRCL() {\n    this.logger.log(2, \"RCL - Resume Caption Loading\"), this.setMode(\"MODE_POP-ON\");\n  }\n  ccBS() {\n    this.logger.log(2, \"BS - BackSpace\"), this.mode !== \"MODE_TEXT\" && (this.writeScreen.backSpace(), this.writeScreen === this.displayedMemory && this.outputDataUpdate());\n  }\n  ccAOF() {\n  }\n  ccAON() {\n  }\n  ccDER() {\n    this.logger.log(2, \"DER- Delete to End of Row\"), this.writeScreen.clearToEndOfRow(), this.outputDataUpdate();\n  }\n  ccRU(e) {\n    this.logger.log(2, \"RU(\" + e + \") - Roll Up\"), this.writeScreen = this.displayedMemory, this.setMode(\"MODE_ROLL-UP\"), this.writeScreen.setRollUpRows(e);\n  }\n  ccFON() {\n    this.logger.log(2, \"FON - Flash On\"), this.writeScreen.setPen({\n      flash: !0\n    });\n  }\n  ccRDC() {\n    this.logger.log(2, \"RDC - Resume Direct Captioning\"), this.setMode(\"MODE_PAINT-ON\");\n  }\n  ccTR() {\n    this.logger.log(2, \"TR\"), this.setMode(\"MODE_TEXT\");\n  }\n  ccRTD() {\n    this.logger.log(2, \"RTD\"), this.setMode(\"MODE_TEXT\");\n  }\n  ccEDM() {\n    this.logger.log(2, \"EDM - Erase Displayed Memory\"), this.displayedMemory.reset(), this.outputDataUpdate(!0);\n  }\n  ccCR() {\n    this.logger.log(2, \"CR - Carriage Return\"), this.writeScreen.rollUp(), this.outputDataUpdate(!0);\n  }\n  ccENM() {\n    this.logger.log(2, \"ENM - Erase Non-displayed Memory\"), this.nonDisplayedMemory.reset();\n  }\n  ccEOC() {\n    if (this.logger.log(2, \"EOC - End Of Caption\"), this.mode === \"MODE_POP-ON\") {\n      const e = this.displayedMemory;\n      this.displayedMemory = this.nonDisplayedMemory, this.nonDisplayedMemory = e, this.writeScreen = this.nonDisplayedMemory, this.logger.log(1, () => \"DISP: \" + this.displayedMemory.getDisplayText());\n    }\n    this.outputDataUpdate(!0);\n  }\n  ccTO(e) {\n    this.logger.log(2, \"TO(\" + e + \") - Tab Offset\"), this.writeScreen.moveCursor(e);\n  }\n  ccMIDROW(e) {\n    const t = {\n      flash: !1\n    };\n    if (t.underline = e % 2 === 1, t.italics = e >= 46, t.italics)\n      t.foreground = \"white\";\n    else {\n      const r = Math.floor(e / 2) - 16, n = [\"white\", \"green\", \"blue\", \"cyan\", \"red\", \"yellow\", \"magenta\"];\n      t.foreground = n[r];\n    }\n    this.logger.log(2, \"MIDROW: \" + at(t)), this.writeScreen.setPen(t);\n  }\n  outputDataUpdate(e = !1) {\n    const t = this.logger.time;\n    t !== null && this.outputFilter && (this.cueStartTime === null && !this.displayedMemory.isEmpty() ? this.cueStartTime = t : this.displayedMemory.equals(this.lastOutputScreen) || (this.outputFilter.newCue(this.cueStartTime, t, this.lastOutputScreen), e && this.outputFilter.dispatchCue && this.outputFilter.dispatchCue(), this.cueStartTime = this.displayedMemory.isEmpty() ? null : t), this.lastOutputScreen.copy(this.displayedMemory));\n  }\n  cueSplitAtTime(e) {\n    this.outputFilter && (this.displayedMemory.isEmpty() || (this.outputFilter.newCue && this.outputFilter.newCue(this.cueStartTime, e, this.displayedMemory), this.cueStartTime = e));\n  }\n}\nclass tf {\n  constructor(e, t, r) {\n    this.channels = void 0, this.currentChannel = 0, this.cmdHistory = Pw(), this.logger = void 0;\n    const n = this.logger = new Lw();\n    this.channels = [null, new ef(e, t, n), new ef(e + 1, r, n)];\n  }\n  getHandler(e) {\n    return this.channels[e].getHandler();\n  }\n  setHandler(e, t) {\n    this.channels[e].setHandler(t);\n  }\n  /**\n   * Add data for time t in forms of list of bytes (unsigned ints). The bytes are treated as pairs.\n   */\n  addData(e, t) {\n    this.logger.time = e;\n    for (let r = 0; r < t.length; r += 2) {\n      const n = t[r] & 127, i = t[r + 1] & 127;\n      let o = !1, a = null;\n      if (n === 0 && i === 0)\n        continue;\n      this.logger.log(3, () => \"[\" + Ns([t[r], t[r + 1]]) + \"] -> (\" + Ns([n, i]) + \")\");\n      const l = this.cmdHistory;\n      if (n >= 16 && n <= 31) {\n        if (Dw(n, i, l)) {\n          eo(null, null, l), this.logger.log(3, () => \"Repeated command (\" + Ns([n, i]) + \") is dropped\");\n          continue;\n        }\n        eo(n, i, this.cmdHistory), o = this.parseCmd(n, i), o || (o = this.parseMidrow(n, i)), o || (o = this.parsePAC(n, i)), o || (o = this.parseBackgroundAttributes(n, i));\n      } else\n        eo(null, null, l);\n      if (!o && (a = this.parseChars(n, i), a)) {\n        const u = this.currentChannel;\n        u && u > 0 ? this.channels[u].insertChars(a) : this.logger.log(2, \"No channel found yet. TEXT-MODE?\");\n      }\n      !o && !a && this.logger.log(2, () => \"Couldn't parse cleaned data \" + Ns([n, i]) + \" orig: \" + Ns([t[r], t[r + 1]]));\n    }\n  }\n  /**\n   * Parse Command.\n   * @returns True if a command was found\n   */\n  parseCmd(e, t) {\n    const r = (e === 20 || e === 28 || e === 21 || e === 29) && t >= 32 && t <= 47, n = (e === 23 || e === 31) && t >= 33 && t <= 35;\n    if (!(r || n))\n      return !1;\n    const i = e === 20 || e === 21 || e === 23 ? 1 : 2, o = this.channels[i];\n    return e === 20 || e === 21 || e === 28 || e === 29 ? t === 32 ? o.ccRCL() : t === 33 ? o.ccBS() : t === 34 ? o.ccAOF() : t === 35 ? o.ccAON() : t === 36 ? o.ccDER() : t === 37 ? o.ccRU(2) : t === 38 ? o.ccRU(3) : t === 39 ? o.ccRU(4) : t === 40 ? o.ccFON() : t === 41 ? o.ccRDC() : t === 42 ? o.ccTR() : t === 43 ? o.ccRTD() : t === 44 ? o.ccEDM() : t === 45 ? o.ccCR() : t === 46 ? o.ccENM() : t === 47 && o.ccEOC() : o.ccTO(t - 32), this.currentChannel = i, !0;\n  }\n  /**\n   * Parse midrow styling command\n   */\n  parseMidrow(e, t) {\n    let r = 0;\n    if ((e === 17 || e === 25) && t >= 32 && t <= 47) {\n      if (e === 17 ? r = 1 : r = 2, r !== this.currentChannel)\n        return this.logger.log(0, \"Mismatch channel in midrow parsing\"), !1;\n      const n = this.channels[r];\n      return n ? (n.ccMIDROW(t), this.logger.log(3, () => \"MIDROW (\" + Ns([e, t]) + \")\"), !0) : !1;\n    }\n    return !1;\n  }\n  /**\n   * Parse Preable Access Codes (Table 53).\n   * @returns {Boolean} Tells if PAC found\n   */\n  parsePAC(e, t) {\n    let r;\n    const n = (e >= 17 && e <= 23 || e >= 25 && e <= 31) && t >= 64 && t <= 127, i = (e === 16 || e === 24) && t >= 64 && t <= 95;\n    if (!(n || i))\n      return !1;\n    const o = e <= 23 ? 1 : 2;\n    t >= 64 && t <= 95 ? r = o === 1 ? ww[e] : Iw[e] : r = o === 1 ? Aw[e] : _w[e];\n    const a = this.channels[o];\n    return a ? (a.setPAC(this.interpretPAC(r, t)), this.currentChannel = o, !0) : !1;\n  }\n  /**\n   * Interpret the second byte of the pac, and return the information.\n   * @returns pacData with style parameters\n   */\n  interpretPAC(e, t) {\n    let r;\n    const n = {\n      color: null,\n      italics: !1,\n      indent: null,\n      underline: !1,\n      row: e\n    };\n    return t > 95 ? r = t - 96 : r = t - 64, n.underline = (r & 1) === 1, r <= 13 ? n.color = [\"white\", \"green\", \"blue\", \"cyan\", \"red\", \"yellow\", \"magenta\", \"white\"][Math.floor(r / 2)] : r <= 15 ? (n.italics = !0, n.color = \"white\") : n.indent = Math.floor((r - 16) / 2) * 4, n;\n  }\n  /**\n   * Parse characters.\n   * @returns An array with 1 to 2 codes corresponding to chars, if found. null otherwise.\n   */\n  parseChars(e, t) {\n    let r, n = null, i = null;\n    if (e >= 25 ? (r = 2, i = e - 8) : (r = 1, i = e), i >= 17 && i <= 19) {\n      let o;\n      i === 17 ? o = t + 80 : i === 18 ? o = t + 112 : o = t + 144, this.logger.log(2, () => \"Special char '\" + Gp(o) + \"' in channel \" + r), n = [o];\n    } else e >= 32 && e <= 127 && (n = t === 0 ? [e] : [e, t]);\n    return n && this.logger.log(3, () => \"Char codes =  \" + Ns(n).join(\",\")), n;\n  }\n  /**\n   * Parse extended background attributes as well as new foreground color black.\n   * @returns True if background attributes are found\n   */\n  parseBackgroundAttributes(e, t) {\n    const r = (e === 16 || e === 24) && t >= 32 && t <= 47, n = (e === 23 || e === 31) && t >= 45 && t <= 47;\n    if (!(r || n))\n      return !1;\n    let i;\n    const o = {};\n    e === 16 || e === 24 ? (i = Math.floor((t - 32) / 2), o.background = Rw[i], t % 2 === 1 && (o.background = o.background + \"_semi\")) : t === 45 ? o.background = \"transparent\" : (o.foreground = \"black\", t === 47 && (o.underline = !0));\n    const a = e <= 23 ? 1 : 2;\n    return this.channels[a].setBkgData(o), !0;\n  }\n  /**\n   * Reset state of parser and its channels.\n   */\n  reset() {\n    for (let e = 0; e < Object.keys(this.channels).length; e++) {\n      const t = this.channels[e];\n      t && t.reset();\n    }\n    eo(null, null, this.cmdHistory);\n  }\n  /**\n   * Trigger the generation of a cue, and the start of a new one if displayScreens are not empty.\n   */\n  cueSplitAtTime(e) {\n    for (let t = 0; t < this.channels.length; t++) {\n      const r = this.channels[t];\n      r && r.cueSplitAtTime(e);\n    }\n  }\n}\nfunction eo(s, e, t) {\n  t.a = s, t.b = e;\n}\nfunction Dw(s, e, t) {\n  return t.a === s && t.b === e;\n}\nfunction Pw() {\n  return {\n    a: null,\n    b: null\n  };\n}\nvar Ou = (function() {\n  if (ra != null && ra.VTTCue)\n    return self.VTTCue;\n  const s = [\"\", \"lr\", \"rl\"], e = [\"start\", \"middle\", \"end\", \"left\", \"right\"];\n  function t(a, l) {\n    if (typeof l != \"string\" || !Array.isArray(a))\n      return !1;\n    const c = l.toLowerCase();\n    return ~a.indexOf(c) ? c : !1;\n  }\n  function r(a) {\n    return t(s, a);\n  }\n  function n(a) {\n    return t(e, a);\n  }\n  function i(a, ...l) {\n    let c = 1;\n    for (; c < arguments.length; c++) {\n      const u = arguments[c];\n      for (const d in u)\n        a[d] = u[d];\n    }\n    return a;\n  }\n  function o(a, l, c) {\n    const u = this, d = {\n      enumerable: !0\n    };\n    u.hasBeenReset = !1;\n    let h = \"\", f = !1, p = a, y = l, E = c, b = null, R = \"\", A = !0, F = \"auto\", M = \"start\", H = 50, K = \"middle\", j = 50, C = \"middle\";\n    Object.defineProperty(u, \"id\", i({}, d, {\n      get: function() {\n        return h;\n      },\n      set: function(k) {\n        h = \"\" + k;\n      }\n    })), Object.defineProperty(u, \"pauseOnExit\", i({}, d, {\n      get: function() {\n        return f;\n      },\n      set: function(k) {\n        f = !!k;\n      }\n    })), Object.defineProperty(u, \"startTime\", i({}, d, {\n      get: function() {\n        return p;\n      },\n      set: function(k) {\n        if (typeof k != \"number\")\n          throw new TypeError(\"Start time must be set to a number.\");\n        p = k, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"endTime\", i({}, d, {\n      get: function() {\n        return y;\n      },\n      set: function(k) {\n        if (typeof k != \"number\")\n          throw new TypeError(\"End time must be set to a number.\");\n        y = k, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"text\", i({}, d, {\n      get: function() {\n        return E;\n      },\n      set: function(k) {\n        E = \"\" + k, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"region\", i({}, d, {\n      get: function() {\n        return b;\n      },\n      set: function(k) {\n        b = k, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"vertical\", i({}, d, {\n      get: function() {\n        return R;\n      },\n      set: function(k) {\n        const $ = r(k);\n        if ($ === !1)\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        R = $, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"snapToLines\", i({}, d, {\n      get: function() {\n        return A;\n      },\n      set: function(k) {\n        A = !!k, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"line\", i({}, d, {\n      get: function() {\n        return F;\n      },\n      set: function(k) {\n        if (typeof k != \"number\" && k !== \"auto\")\n          throw new SyntaxError(\"An invalid number or illegal string was specified.\");\n        F = k, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"lineAlign\", i({}, d, {\n      get: function() {\n        return M;\n      },\n      set: function(k) {\n        const $ = n(k);\n        if (!$)\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        M = $, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"position\", i({}, d, {\n      get: function() {\n        return H;\n      },\n      set: function(k) {\n        if (k < 0 || k > 100)\n          throw new Error(\"Position must be between 0 and 100.\");\n        H = k, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"positionAlign\", i({}, d, {\n      get: function() {\n        return K;\n      },\n      set: function(k) {\n        const $ = n(k);\n        if (!$)\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        K = $, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"size\", i({}, d, {\n      get: function() {\n        return j;\n      },\n      set: function(k) {\n        if (k < 0 || k > 100)\n          throw new Error(\"Size must be between 0 and 100.\");\n        j = k, this.hasBeenReset = !0;\n      }\n    })), Object.defineProperty(u, \"align\", i({}, d, {\n      get: function() {\n        return C;\n      },\n      set: function(k) {\n        const $ = n(k);\n        if (!$)\n          throw new SyntaxError(\"An invalid or illegal string was specified.\");\n        C = $, this.hasBeenReset = !0;\n      }\n    })), u.displayState = void 0;\n  }\n  return o.prototype.getCueAsHTML = function() {\n    return self.WebVTT.convertCueToDOMTree(self, this.text);\n  }, o;\n})();\nclass Mw {\n  decode(e, t) {\n    if (!e)\n      return \"\";\n    if (typeof e != \"string\")\n      throw new Error(\"Error - expected string data.\");\n    return decodeURIComponent(encodeURIComponent(e));\n  }\n}\nfunction jp(s) {\n  function e(r, n, i, o) {\n    return (r | 0) * 3600 + (n | 0) * 60 + (i | 0) + parseFloat(o || 0);\n  }\n  const t = s.match(/^(?:(\\d+):)?(\\d{2}):(\\d{2})(\\.\\d+)?/);\n  return t ? parseFloat(t[2]) > 59 ? e(t[2], t[3], 0, t[4]) : e(t[1], t[2], t[3], t[4]) : null;\n}\nclass Ow {\n  constructor() {\n    this.values = /* @__PURE__ */ Object.create(null);\n  }\n  // Only accept the first assignment to any key.\n  set(e, t) {\n    !this.get(e) && t !== \"\" && (this.values[e] = t);\n  }\n  // Return the value for a key, or a default value.\n  // If 'defaultKey' is passed then 'dflt' is assumed to be an object with\n  // a number of possible default values as properties where 'defaultKey' is\n  // the key of the property that will be chosen; otherwise it's assumed to be\n  // a single value.\n  get(e, t, r) {\n    return r ? this.has(e) ? this.values[e] : t[r] : this.has(e) ? this.values[e] : t;\n  }\n  // Check whether we have a value for a key.\n  has(e) {\n    return e in this.values;\n  }\n  // Accept a setting if its one of the given alternatives.\n  alt(e, t, r) {\n    for (let n = 0; n < r.length; ++n)\n      if (t === r[n]) {\n        this.set(e, t);\n        break;\n      }\n  }\n  // Accept a setting if its a valid (signed) integer.\n  integer(e, t) {\n    /^-?\\d+$/.test(t) && this.set(e, parseInt(t, 10));\n  }\n  // Accept a setting if its a valid percentage.\n  percent(e, t) {\n    if (/^([\\d]{1,3})(\\.[\\d]*)?%$/.test(t)) {\n      const r = parseFloat(t);\n      if (r >= 0 && r <= 100)\n        return this.set(e, r), !0;\n    }\n    return !1;\n  }\n}\nfunction Kp(s, e, t, r) {\n  const n = r ? s.split(r) : [s];\n  for (const i in n) {\n    if (typeof n[i] != \"string\")\n      continue;\n    const o = n[i].split(t);\n    if (o.length !== 2)\n      continue;\n    const a = o[0], l = o[1];\n    e(a, l);\n  }\n}\nconst bc = new Ou(0, 0, \"\"), to = bc.align === \"middle\" ? \"middle\" : \"center\";\nfunction Bw(s, e, t) {\n  const r = s;\n  function n() {\n    const a = jp(s);\n    if (a === null)\n      throw new Error(\"Malformed timestamp: \" + r);\n    return s = s.replace(/^[^\\sa-zA-Z-]+/, \"\"), a;\n  }\n  function i(a, l) {\n    const c = new Ow();\n    Kp(a, function(h, f) {\n      let p;\n      switch (h) {\n        case \"region\":\n          for (let y = t.length - 1; y >= 0; y--)\n            if (t[y].id === f) {\n              c.set(h, t[y].region);\n              break;\n            }\n          break;\n        case \"vertical\":\n          c.alt(h, f, [\"rl\", \"lr\"]);\n          break;\n        case \"line\":\n          p = f.split(\",\"), c.integer(h, p[0]), c.percent(h, p[0]) && c.set(\"snapToLines\", !1), c.alt(h, p[0], [\"auto\"]), p.length === 2 && c.alt(\"lineAlign\", p[1], [\"start\", to, \"end\"]);\n          break;\n        case \"position\":\n          p = f.split(\",\"), c.percent(h, p[0]), p.length === 2 && c.alt(\"positionAlign\", p[1], [\"start\", to, \"end\", \"line-left\", \"line-right\", \"auto\"]);\n          break;\n        case \"size\":\n          c.percent(h, f);\n          break;\n        case \"align\":\n          c.alt(h, f, [\"start\", to, \"end\", \"left\", \"right\"]);\n          break;\n      }\n    }, /:/, /\\s/), l.region = c.get(\"region\", null), l.vertical = c.get(\"vertical\", \"\");\n    let u = c.get(\"line\", \"auto\");\n    u === \"auto\" && bc.line === -1 && (u = -1), l.line = u, l.lineAlign = c.get(\"lineAlign\", \"start\"), l.snapToLines = c.get(\"snapToLines\", !0), l.size = c.get(\"size\", 100), l.align = c.get(\"align\", to);\n    let d = c.get(\"position\", \"auto\");\n    d === \"auto\" && bc.position === 50 && (d = l.align === \"start\" || l.align === \"left\" ? 0 : l.align === \"end\" || l.align === \"right\" ? 100 : 50), l.position = d;\n  }\n  function o() {\n    s = s.replace(/^\\s+/, \"\");\n  }\n  if (o(), e.startTime = n(), o(), s.slice(0, 3) !== \"-->\")\n    throw new Error(\"Malformed time stamp (time stamps must be separated by '-->'): \" + r);\n  s = s.slice(3), o(), e.endTime = n(), o(), i(s, e);\n}\nfunction Hp(s) {\n  return s.replace(/<br(?: \\/)?>/gi, `\n`);\n}\nclass Fw {\n  constructor() {\n    this.state = \"INITIAL\", this.buffer = \"\", this.decoder = new Mw(), this.regionList = [], this.cue = null, this.oncue = void 0, this.onparsingerror = void 0, this.onflush = void 0;\n  }\n  parse(e) {\n    const t = this;\n    e && (t.buffer += t.decoder.decode(e, {\n      stream: !0\n    }));\n    function r() {\n      let i = t.buffer, o = 0;\n      for (i = Hp(i); o < i.length && i[o] !== \"\\r\" && i[o] !== `\n`; )\n        ++o;\n      const a = i.slice(0, o);\n      return i[o] === \"\\r\" && ++o, i[o] === `\n` && ++o, t.buffer = i.slice(o), a;\n    }\n    function n(i) {\n      Kp(i, function(o, a) {\n      }, /:/);\n    }\n    try {\n      let i = \"\";\n      if (t.state === \"INITIAL\") {\n        if (!/\\r\\n|\\n/.test(t.buffer))\n          return this;\n        i = r();\n        const a = i.match(/^()?WEBVTT([ \\t].*)?$/);\n        if (!(a != null && a[0]))\n          throw new Error(\"Malformed WebVTT signature.\");\n        t.state = \"HEADER\";\n      }\n      let o = !1;\n      for (; t.buffer; ) {\n        if (!/\\r\\n|\\n/.test(t.buffer))\n          return this;\n        switch (o ? o = !1 : i = r(), t.state) {\n          case \"HEADER\":\n            /:/.test(i) ? n(i) : i || (t.state = \"ID\");\n            continue;\n          case \"NOTE\":\n            i || (t.state = \"ID\");\n            continue;\n          case \"ID\":\n            if (/^NOTE($|[ \\t])/.test(i)) {\n              t.state = \"NOTE\";\n              break;\n            }\n            if (!i)\n              continue;\n            if (t.cue = new Ou(0, 0, \"\"), t.state = \"CUE\", i.indexOf(\"-->\") === -1) {\n              t.cue.id = i;\n              continue;\n            }\n          // Process line as start of a cue.\n          /* falls through */\n          case \"CUE\":\n            if (!t.cue) {\n              t.state = \"BADCUE\";\n              continue;\n            }\n            try {\n              Bw(i, t.cue, t.regionList);\n            } catch {\n              t.cue = null, t.state = \"BADCUE\";\n              continue;\n            }\n            t.state = \"CUETEXT\";\n            continue;\n          case \"CUETEXT\":\n            {\n              const a = i.indexOf(\"-->\") !== -1;\n              if (!i || a && (o = !0)) {\n                t.oncue && t.cue && t.oncue(t.cue), t.cue = null, t.state = \"ID\";\n                continue;\n              }\n              if (t.cue === null)\n                continue;\n              t.cue.text && (t.cue.text += `\n`), t.cue.text += i;\n            }\n            continue;\n          case \"BADCUE\":\n            i || (t.state = \"ID\");\n        }\n      }\n    } catch {\n      t.state === \"CUETEXT\" && t.cue && t.oncue && t.oncue(t.cue), t.cue = null, t.state = t.state === \"INITIAL\" ? \"BADWEBVTT\" : \"BADCUE\";\n    }\n    return this;\n  }\n  flush() {\n    const e = this;\n    try {\n      if ((e.cue || e.state === \"HEADER\") && (e.buffer += `\n\n`, e.parse()), e.state === \"INITIAL\" || e.state === \"BADWEBVTT\")\n        throw new Error(\"Malformed WebVTT signature.\");\n    } catch (t) {\n      e.onparsingerror && e.onparsingerror(t);\n    }\n    return e.onflush && e.onflush(), this;\n  }\n}\nconst Nw = /\\r\\n|\\n\\r|\\n|\\r/g, Al = function(e, t, r = 0) {\n  return e.slice(r, r + t.length) === t;\n}, Uw = function(e) {\n  let t = parseInt(e.slice(-3));\n  const r = parseInt(e.slice(-6, -4)), n = parseInt(e.slice(-9, -7)), i = e.length > 9 ? parseInt(e.substring(0, e.indexOf(\":\"))) : 0;\n  if (!ue(t) || !ue(r) || !ue(n) || !ue(i))\n    throw Error(`Malformed X-TIMESTAMP-MAP: Local:${e}`);\n  return t += 1e3 * r, t += 60 * 1e3 * n, t += 3600 * 1e3 * i, t;\n};\nfunction Bu(s, e, t) {\n  return Xn(s.toString()) + Xn(e.toString()) + Xn(t);\n}\nconst $w = function(e, t, r) {\n  let n = e[t], i = e[n.prevCC];\n  if (!i || !i.new && n.new) {\n    e.ccOffset = e.presentationOffset = n.start, n.new = !1;\n    return;\n  }\n  for (; (o = i) != null && o.new; ) {\n    var o;\n    e.ccOffset += n.start - i.start, n.new = !1, n = i, i = e[n.prevCC];\n  }\n  e.presentationOffset = r;\n};\nfunction Gw(s, e, t, r, n, i, o) {\n  const a = new Fw(), l = Tr(new Uint8Array(s)).trim().replace(Nw, `\n`).split(`\n`), c = [], u = e ? WT(e.baseTime, e.timescale) : 0;\n  let d = \"00:00.000\", h = 0, f = 0, p, y = !0;\n  a.oncue = function(E) {\n    const b = t[r];\n    let R = t.ccOffset;\n    const A = (h - u) / 9e4;\n    if (b != null && b.new && (f !== void 0 ? R = t.ccOffset = b.start : $w(t, r, A)), A) {\n      if (!e) {\n        p = new Error(\"Missing initPTS for VTT MPEGTS\");\n        return;\n      }\n      R = A - t.presentationOffset;\n    }\n    const F = E.endTime - E.startTime, M = Ar((E.startTime + R - f) * 9e4, n * 9e4) / 9e4;\n    E.startTime = Math.max(M, 0), E.endTime = Math.max(M + F, 0);\n    const H = E.text.trim();\n    E.text = decodeURIComponent(encodeURIComponent(H)), E.id || (E.id = Bu(E.startTime, E.endTime, H)), E.endTime > 0 && c.push(E);\n  }, a.onparsingerror = function(E) {\n    p = E;\n  }, a.onflush = function() {\n    if (p) {\n      o(p);\n      return;\n    }\n    i(c);\n  }, l.forEach((E) => {\n    if (y)\n      if (Al(E, \"X-TIMESTAMP-MAP=\")) {\n        y = !1, E.slice(16).split(\",\").forEach((b) => {\n          Al(b, \"LOCAL:\") ? d = b.slice(6) : Al(b, \"MPEGTS:\") && (h = parseInt(b.slice(7)));\n        });\n        try {\n          f = Uw(d) / 1e3;\n        } catch (b) {\n          p = b;\n        }\n        return;\n      } else E === \"\" && (y = !1);\n    a.parse(E + `\n`);\n  }), a.flush();\n}\nconst Il = \"stpp.ttml.im1t\", qp = /^(\\d{2,}):(\\d{2}):(\\d{2}):(\\d{2})\\.?(\\d+)?$/, Wp = /^(\\d*(?:\\.\\d*)?)(h|m|s|ms|f|t)$/, Vw = {\n  left: \"start\",\n  center: \"center\",\n  right: \"end\",\n  start: \"start\",\n  end: \"end\"\n};\nfunction rf(s, e, t, r) {\n  const n = Ge(new Uint8Array(s), [\"mdat\"]);\n  if (n.length === 0) {\n    r(new Error(\"Could not parse IMSC1 mdat\"));\n    return;\n  }\n  const i = n.map((a) => Tr(a)), o = qT(e.baseTime, 1, e.timescale);\n  try {\n    i.forEach((a) => t(jw(a, o)));\n  } catch (a) {\n    r(a);\n  }\n}\nfunction jw(s, e) {\n  const n = new DOMParser().parseFromString(s, \"text/xml\").getElementsByTagName(\"tt\")[0];\n  if (!n)\n    throw new Error(\"Invalid ttml\");\n  const i = {\n    frameRate: 30,\n    subFrameRate: 1,\n    frameRateMultiplier: 0,\n    tickRate: 0\n  }, o = Object.keys(i).reduce((d, h) => (d[h] = n.getAttribute(`ttp:${h}`) || i[h], d), {}), a = n.getAttribute(\"xml:space\") !== \"preserve\", l = sf(_l(n, \"styling\", \"style\")), c = sf(_l(n, \"layout\", \"region\")), u = _l(n, \"body\", \"[begin]\");\n  return [].map.call(u, (d) => {\n    const h = zp(d, a);\n    if (!h || !d.hasAttribute(\"begin\"))\n      return null;\n    const f = Ll(d.getAttribute(\"begin\"), o), p = Ll(d.getAttribute(\"dur\"), o);\n    let y = Ll(d.getAttribute(\"end\"), o);\n    if (f === null)\n      throw nf(d);\n    if (y === null) {\n      if (p === null)\n        throw nf(d);\n      y = f + p;\n    }\n    const E = new Ou(f - e, y - e, h);\n    E.id = Bu(E.startTime, E.endTime, E.text);\n    const b = c[d.getAttribute(\"region\")], R = l[d.getAttribute(\"style\")], A = Kw(b, R, l), {\n      textAlign: F\n    } = A;\n    if (F) {\n      const M = Vw[F];\n      M && (E.lineAlign = M), E.align = F;\n    }\n    return nt(E, A), E;\n  }).filter((d) => d !== null);\n}\nfunction _l(s, e, t) {\n  const r = s.getElementsByTagName(e)[0];\n  return r ? [].slice.call(r.querySelectorAll(t)) : [];\n}\nfunction sf(s) {\n  return s.reduce((e, t) => {\n    const r = t.getAttribute(\"xml:id\");\n    return r && (e[r] = t), e;\n  }, {});\n}\nfunction zp(s, e) {\n  return [].slice.call(s.childNodes).reduce((t, r, n) => {\n    var i;\n    return r.nodeName === \"br\" && n ? t + `\n` : (i = r.childNodes) != null && i.length ? zp(r, e) : e ? t + r.textContent.trim().replace(/\\s+/g, \" \") : t + r.textContent;\n  }, \"\");\n}\nfunction Kw(s, e, t) {\n  const r = \"http://www.w3.org/ns/ttml#styling\";\n  let n = null;\n  const i = [\n    \"displayAlign\",\n    \"textAlign\",\n    \"color\",\n    \"backgroundColor\",\n    \"fontSize\",\n    \"fontFamily\"\n    // 'fontWeight',\n    // 'lineHeight',\n    // 'wrapOption',\n    // 'fontStyle',\n    // 'direction',\n    // 'writingMode'\n  ], o = s != null && s.hasAttribute(\"style\") ? s.getAttribute(\"style\") : null;\n  return o && t.hasOwnProperty(o) && (n = t[o]), i.reduce((a, l) => {\n    const c = Rl(e, r, l) || Rl(s, r, l) || Rl(n, r, l);\n    return c && (a[l] = c), a;\n  }, {});\n}\nfunction Rl(s, e, t) {\n  return s && s.hasAttributeNS(e, t) ? s.getAttributeNS(e, t) : null;\n}\nfunction nf(s) {\n  return new Error(`Could not parse ttml timestamp ${s}`);\n}\nfunction Ll(s, e) {\n  if (!s)\n    return null;\n  let t = jp(s);\n  return t === null && (qp.test(s) ? t = Hw(s, e) : Wp.test(s) && (t = qw(s, e))), t;\n}\nfunction Hw(s, e) {\n  const t = qp.exec(s), r = (t[4] | 0) + (t[5] | 0) / e.subFrameRate;\n  return (t[1] | 0) * 3600 + (t[2] | 0) * 60 + (t[3] | 0) + r / e.frameRate;\n}\nfunction qw(s, e) {\n  const t = Wp.exec(s), r = Number(t[1]);\n  switch (t[2]) {\n    case \"h\":\n      return r * 3600;\n    case \"m\":\n      return r * 60;\n    case \"ms\":\n      return r * 1e3;\n    case \"f\":\n      return r / e.frameRate;\n    case \"t\":\n      return r / e.tickRate;\n  }\n  return r;\n}\nclass ro {\n  constructor(e, t) {\n    this.timelineController = void 0, this.cueRanges = [], this.trackName = void 0, this.startTime = null, this.endTime = null, this.screen = null, this.timelineController = e, this.trackName = t;\n  }\n  dispatchCue() {\n    this.startTime !== null && (this.timelineController.addCues(this.trackName, this.startTime, this.endTime, this.screen, this.cueRanges), this.startTime = null);\n  }\n  newCue(e, t, r) {\n    (this.startTime === null || this.startTime > e) && (this.startTime = e), this.endTime = t, this.screen = r, this.timelineController.createCaptionsTrack(this.trackName);\n  }\n  reset() {\n    this.cueRanges = [], this.startTime = null;\n  }\n}\nclass Ww {\n  constructor(e) {\n    this.hls = void 0, this.media = null, this.config = void 0, this.enabled = !0, this.Cues = void 0, this.textTracks = [], this.tracks = [], this.initPTS = [], this.unparsedVttFrags = [], this.captionsTracks = {}, this.nonNativeCaptionsTracks = {}, this.cea608Parser1 = void 0, this.cea608Parser2 = void 0, this.lastCc = -1, this.lastSn = -1, this.lastPartIndex = -1, this.prevCC = -1, this.vttCCs = af(), this.captionsProperties = void 0, this.hls = e, this.config = e.config, this.Cues = e.config.cueHandler, this.captionsProperties = {\n      textTrack1: {\n        label: this.config.captionsTextTrack1Label,\n        languageCode: this.config.captionsTextTrack1LanguageCode\n      },\n      textTrack2: {\n        label: this.config.captionsTextTrack2Label,\n        languageCode: this.config.captionsTextTrack2LanguageCode\n      },\n      textTrack3: {\n        label: this.config.captionsTextTrack3Label,\n        languageCode: this.config.captionsTextTrack3LanguageCode\n      },\n      textTrack4: {\n        label: this.config.captionsTextTrack4Label,\n        languageCode: this.config.captionsTextTrack4LanguageCode\n      }\n    }, e.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.on(I.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this), e.on(I.FRAG_LOADING, this.onFragLoading, this), e.on(I.FRAG_LOADED, this.onFragLoaded, this), e.on(I.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this), e.on(I.FRAG_DECRYPTED, this.onFragDecrypted, this), e.on(I.INIT_PTS_FOUND, this.onInitPtsFound, this), e.on(I.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this), e.on(I.BUFFER_FLUSHING, this.onBufferFlushing, this);\n  }\n  destroy() {\n    const {\n      hls: e\n    } = this;\n    e.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.off(I.SUBTITLE_TRACKS_UPDATED, this.onSubtitleTracksUpdated, this), e.off(I.FRAG_LOADING, this.onFragLoading, this), e.off(I.FRAG_LOADED, this.onFragLoaded, this), e.off(I.FRAG_PARSING_USERDATA, this.onFragParsingUserdata, this), e.off(I.FRAG_DECRYPTED, this.onFragDecrypted, this), e.off(I.INIT_PTS_FOUND, this.onInitPtsFound, this), e.off(I.SUBTITLE_TRACKS_CLEARED, this.onSubtitleTracksCleared, this), e.off(I.BUFFER_FLUSHING, this.onBufferFlushing, this), this.hls = this.config = this.media = null, this.cea608Parser1 = this.cea608Parser2 = void 0;\n  }\n  initCea608Parsers() {\n    const e = new ro(this, \"textTrack1\"), t = new ro(this, \"textTrack2\"), r = new ro(this, \"textTrack3\"), n = new ro(this, \"textTrack4\");\n    this.cea608Parser1 = new tf(1, e, t), this.cea608Parser2 = new tf(3, r, n);\n  }\n  addCues(e, t, r, n, i) {\n    let o = !1;\n    for (let a = i.length; a--; ) {\n      const l = i[a], c = zw(l[0], l[1], t, r);\n      if (c >= 0 && (l[0] = Math.min(l[0], t), l[1] = Math.max(l[1], r), o = !0, c / (r - t) > 0.5))\n        return;\n    }\n    if (o || i.push([t, r]), this.config.renderTextTracksNatively) {\n      const a = this.captionsTracks[e];\n      this.Cues.newCue(a, t, r, n);\n    } else {\n      const a = this.Cues.newCue(null, t, r, n);\n      this.hls.trigger(I.CUES_PARSED, {\n        type: \"captions\",\n        cues: a,\n        track: e\n      });\n    }\n  }\n  // Triggered when an initial PTS is found; used for synchronisation of WebVTT.\n  onInitPtsFound(e, {\n    frag: t,\n    id: r,\n    initPTS: n,\n    timescale: i,\n    trackId: o\n  }) {\n    const {\n      unparsedVttFrags: a\n    } = this;\n    r === pe.MAIN && (this.initPTS[t.cc] = {\n      baseTime: n,\n      timescale: i,\n      trackId: o\n    }), a.length && (this.unparsedVttFrags = [], a.forEach((l) => {\n      this.initPTS[l.frag.cc] ? this.onFragLoaded(I.FRAG_LOADED, l) : this.hls.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n        success: !1,\n        frag: l.frag,\n        error: new Error(\"Subtitle discontinuity domain does not match main\")\n      });\n    }));\n  }\n  getExistingTrack(e, t) {\n    const {\n      media: r\n    } = this;\n    if (r)\n      for (let n = 0; n < r.textTracks.length; n++) {\n        const i = r.textTracks[n];\n        if (of(i, {\n          name: e,\n          lang: t,\n          characteristics: \"transcribes-spoken-dialog,describes-music-and-sound\"\n        }))\n          return i;\n      }\n    return null;\n  }\n  createCaptionsTrack(e) {\n    this.config.renderTextTracksNatively ? this.createNativeTrack(e) : this.createNonNativeTrack(e);\n  }\n  createNativeTrack(e) {\n    if (this.captionsTracks[e])\n      return;\n    const {\n      captionsProperties: t,\n      captionsTracks: r,\n      media: n\n    } = this, {\n      label: i,\n      languageCode: o\n    } = t[e], a = this.getExistingTrack(i, o);\n    if (a)\n      r[e] = a, Sn(r[e]), Np(r[e], n);\n    else {\n      const l = this.createTextTrack(\"captions\", i, o);\n      l && (l[e] = !0, r[e] = l);\n    }\n  }\n  createNonNativeTrack(e) {\n    if (this.nonNativeCaptionsTracks[e])\n      return;\n    const t = this.captionsProperties[e];\n    if (!t)\n      return;\n    const r = t.label, n = {\n      _id: e,\n      label: r,\n      kind: \"captions\",\n      default: t.media ? !!t.media.default : !1,\n      closedCaptions: t.media\n    };\n    this.nonNativeCaptionsTracks[e] = n, this.hls.trigger(I.NON_NATIVE_TEXT_TRACKS_FOUND, {\n      tracks: [n]\n    });\n  }\n  createTextTrack(e, t, r) {\n    const n = this.media;\n    if (n)\n      return n.addTextTrack(e, t, r);\n  }\n  onMediaAttaching(e, t) {\n    this.media = t.media, t.mediaSource || this._cleanTracks();\n  }\n  onMediaDetaching(e, t) {\n    const r = !!t.transferMedia;\n    if (this.media = null, r)\n      return;\n    const {\n      captionsTracks: n\n    } = this;\n    Object.keys(n).forEach((i) => {\n      Sn(n[i]), delete n[i];\n    }), this.nonNativeCaptionsTracks = {};\n  }\n  onManifestLoading() {\n    this.lastCc = -1, this.lastSn = -1, this.lastPartIndex = -1, this.prevCC = -1, this.vttCCs = af(), this._cleanTracks(), this.tracks = [], this.captionsTracks = {}, this.nonNativeCaptionsTracks = {}, this.textTracks = [], this.unparsedVttFrags = [], this.initPTS = [], this.cea608Parser1 && this.cea608Parser2 && (this.cea608Parser1.reset(), this.cea608Parser2.reset());\n  }\n  _cleanTracks() {\n    const {\n      media: e\n    } = this;\n    if (!e)\n      return;\n    const t = e.textTracks;\n    if (t)\n      for (let r = 0; r < t.length; r++)\n        Sn(t[r]);\n  }\n  onSubtitleTracksUpdated(e, t) {\n    const r = t.subtitleTracks || [], n = r.some((i) => i.textCodec === Il);\n    if (this.config.enableWebVTT || n && this.config.enableIMSC1) {\n      if (Ap(this.tracks, r)) {\n        this.tracks = r;\n        return;\n      }\n      if (this.textTracks = [], this.tracks = r, this.config.renderTextTracksNatively) {\n        const o = this.media, a = o ? Eo(o.textTracks) : null;\n        if (this.tracks.forEach((l, c) => {\n          let u;\n          if (a) {\n            let d = null;\n            for (let h = 0; h < a.length; h++)\n              if (a[h] && of(a[h], l)) {\n                d = a[h], a[h] = null;\n                break;\n              }\n            d && (u = d);\n          }\n          if (u)\n            Sn(u);\n          else {\n            const d = Yp(l);\n            u = this.createTextTrack(d, l.name, l.lang), u && (u.mode = \"disabled\");\n          }\n          u && this.textTracks.push(u);\n        }), a != null && a.length) {\n          const l = a.filter((c) => c !== null).map((c) => c.label);\n          l.length && this.hls.logger.warn(`Media element contains unused subtitle tracks: ${l.join(\", \")}. Replace media element for each source to clear TextTracks and captions menu.`);\n        }\n      } else if (this.tracks.length) {\n        const o = this.tracks.map((a) => ({\n          label: a.name,\n          kind: a.type.toLowerCase(),\n          default: a.default,\n          subtitleTrack: a\n        }));\n        this.hls.trigger(I.NON_NATIVE_TEXT_TRACKS_FOUND, {\n          tracks: o\n        });\n      }\n    }\n  }\n  onManifestLoaded(e, t) {\n    this.config.enableCEA708Captions && t.captions && t.captions.forEach((r) => {\n      const n = /(?:CC|SERVICE)([1-4])/.exec(r.instreamId);\n      if (!n)\n        return;\n      const i = `textTrack${n[1]}`, o = this.captionsProperties[i];\n      o && (o.label = r.name, r.lang && (o.languageCode = r.lang), o.media = r);\n    });\n  }\n  closedCaptionsForLevel(e) {\n    const t = this.hls.levels[e.level];\n    return t == null ? void 0 : t.attrs[\"CLOSED-CAPTIONS\"];\n  }\n  onFragLoading(e, t) {\n    if (this.enabled && t.frag.type === pe.MAIN) {\n      var r, n;\n      const {\n        cea608Parser1: i,\n        cea608Parser2: o,\n        lastSn: a\n      } = this, {\n        cc: l,\n        sn: c\n      } = t.frag, u = (r = (n = t.part) == null ? void 0 : n.index) != null ? r : -1;\n      i && o && (c !== a + 1 || c === a && u !== this.lastPartIndex + 1 || l !== this.lastCc) && (i.reset(), o.reset()), this.lastCc = l, this.lastSn = c, this.lastPartIndex = u;\n    }\n  }\n  onFragLoaded(e, t) {\n    const {\n      frag: r,\n      payload: n\n    } = t;\n    if (r.type === pe.SUBTITLE)\n      if (n.byteLength) {\n        const i = r.decryptdata, o = \"stats\" in t;\n        if (i == null || !i.encrypted || o) {\n          const a = this.tracks[r.level], l = this.vttCCs;\n          l[r.cc] || (l[r.cc] = {\n            start: r.start,\n            prevCC: this.prevCC,\n            new: !0\n          }, this.prevCC = r.cc), a && a.textCodec === Il ? this._parseIMSC1(r, n) : this._parseVTTs(t);\n        }\n      } else\n        this.hls.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n          success: !1,\n          frag: r,\n          error: new Error(\"Empty subtitle payload\")\n        });\n  }\n  _parseIMSC1(e, t) {\n    const r = this.hls;\n    rf(t, this.initPTS[e.cc], (n) => {\n      this._appendCues(n, e.level), r.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n        success: !0,\n        frag: e\n      });\n    }, (n) => {\n      r.logger.log(`Failed to parse IMSC1: ${n}`), r.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n        success: !1,\n        frag: e,\n        error: n\n      });\n    });\n  }\n  _parseVTTs(e) {\n    var t;\n    const {\n      frag: r,\n      payload: n\n    } = e, {\n      initPTS: i,\n      unparsedVttFrags: o\n    } = this, a = i.length - 1;\n    if (!i[r.cc] && a === -1) {\n      o.push(e);\n      return;\n    }\n    const l = this.hls, c = (t = r.initSegment) != null && t.data ? _r(r.initSegment.data, new Uint8Array(n)).buffer : n;\n    Gw(c, this.initPTS[r.cc], this.vttCCs, r.cc, r.start, (u) => {\n      this._appendCues(u, r.level), l.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n        success: !0,\n        frag: r\n      });\n    }, (u) => {\n      const d = u.message === \"Missing initPTS for VTT MPEGTS\";\n      d ? o.push(e) : this._fallbackToIMSC1(r, n), l.logger.log(`Failed to parse VTT cue: ${u}`), !(d && a > r.cc) && l.trigger(I.SUBTITLE_FRAG_PROCESSED, {\n        success: !1,\n        frag: r,\n        error: u\n      });\n    });\n  }\n  _fallbackToIMSC1(e, t) {\n    const r = this.tracks[e.level];\n    r.textCodec || rf(t, this.initPTS[e.cc], () => {\n      r.textCodec = Il, this._parseIMSC1(e, t);\n    }, () => {\n      r.textCodec = \"wvtt\";\n    });\n  }\n  _appendCues(e, t) {\n    const r = this.hls;\n    if (this.config.renderTextTracksNatively) {\n      const n = this.textTracks[t];\n      if (!n || n.mode === \"disabled\")\n        return;\n      e.forEach((i) => Up(n, i));\n    } else {\n      const n = this.tracks[t];\n      if (!n)\n        return;\n      const i = n.default ? \"default\" : \"subtitles\" + t;\n      r.trigger(I.CUES_PARSED, {\n        type: \"subtitles\",\n        cues: e,\n        track: i\n      });\n    }\n  }\n  onFragDecrypted(e, t) {\n    const {\n      frag: r\n    } = t;\n    r.type === pe.SUBTITLE && this.onFragLoaded(I.FRAG_LOADED, t);\n  }\n  onSubtitleTracksCleared() {\n    this.tracks = [], this.captionsTracks = {};\n  }\n  onFragParsingUserdata(e, t) {\n    if (!this.enabled || !this.config.enableCEA708Captions)\n      return;\n    const {\n      frag: r,\n      samples: n\n    } = t;\n    if (!(r.type === pe.MAIN && this.closedCaptionsForLevel(r) === \"NONE\"))\n      for (let i = 0; i < n.length; i++) {\n        const o = n[i].bytes;\n        if (o) {\n          this.cea608Parser1 || this.initCea608Parsers();\n          const a = this.extractCea608Data(o);\n          this.cea608Parser1.addData(n[i].pts, a[0]), this.cea608Parser2.addData(n[i].pts, a[1]);\n        }\n      }\n  }\n  onBufferFlushing(e, {\n    startOffset: t,\n    endOffset: r,\n    endOffsetSubtitles: n,\n    type: i\n  }) {\n    const {\n      media: o\n    } = this;\n    if (!(!o || o.currentTime < r)) {\n      if (!i || i === \"video\") {\n        const {\n          captionsTracks: a\n        } = this;\n        Object.keys(a).forEach((l) => Sc(a[l], t, r));\n      }\n      if (this.config.renderTextTracksNatively && t === 0 && n !== void 0) {\n        const {\n          textTracks: a\n        } = this;\n        Object.keys(a).forEach((l) => Sc(a[l], t, n));\n      }\n    }\n  }\n  extractCea608Data(e) {\n    const t = [[], []], r = e[0] & 31;\n    let n = 2;\n    for (let i = 0; i < r; i++) {\n      const o = e[n++], a = 127 & e[n++], l = 127 & e[n++];\n      if (a === 0 && l === 0)\n        continue;\n      if ((4 & o) !== 0) {\n        const u = 3 & o;\n        (u === 0 || u === 1) && (t[u].push(a), t[u].push(l));\n      }\n    }\n    return t;\n  }\n}\nfunction Yp(s) {\n  return s.characteristics && /transcribes-spoken-dialog/gi.test(s.characteristics) && /describes-music-and-sound/gi.test(s.characteristics) ? \"captions\" : \"subtitles\";\n}\nfunction of(s, e) {\n  return !!s && s.kind === Yp(e) && yc(e, s);\n}\nfunction zw(s, e, t, r) {\n  return Math.min(e, r) - Math.max(s, t);\n}\nfunction af() {\n  return {\n    ccOffset: 0,\n    presentationOffset: 0,\n    0: {\n      start: 0,\n      prevCC: -1,\n      new: !0\n    }\n  };\n}\nconst Yw = /\\s/, Zw = {\n  newCue(s, e, t, r) {\n    const n = [];\n    let i, o, a, l, c;\n    const u = self.VTTCue || self.TextTrackCue;\n    for (let h = 0; h < r.rows.length; h++)\n      if (i = r.rows[h], a = !0, l = 0, c = \"\", !i.isEmpty()) {\n        var d;\n        for (let y = 0; y < i.chars.length; y++)\n          Yw.test(i.chars[y].uchar) && a ? l++ : (c += i.chars[y].uchar, a = !1);\n        i.cueStartTime = e, e === t && (t += 1e-4), l >= 16 ? l-- : l++;\n        const f = Hp(c.trim()), p = Bu(e, t, f);\n        s != null && (d = s.cues) != null && d.getCueById(p) || (o = new u(e, t, f), o.id = p, o.line = h + 1, o.align = \"left\", o.position = 10 + Math.min(80, Math.floor(l * 8 / 32) * 10), n.push(o));\n      }\n    return s && n.length && (n.sort((h, f) => h.line === \"auto\" || f.line === \"auto\" ? 0 : h.line > 8 && f.line > 8 ? f.line - h.line : h.line - f.line), n.forEach((h) => Up(s, h))), n;\n  }\n};\nfunction Xw() {\n  if (\n    // @ts-ignore\n    self.fetch && self.AbortController && self.ReadableStream && self.Request\n  )\n    try {\n      return new self.ReadableStream({}), !0;\n    } catch {\n    }\n  return !1;\n}\nconst Jw = /(\\d+)-(\\d+)\\/(\\d+)/;\nclass lf {\n  constructor(e) {\n    this.fetchSetup = void 0, this.requestTimeout = void 0, this.request = null, this.response = null, this.controller = void 0, this.context = null, this.config = null, this.callbacks = null, this.stats = void 0, this.loader = null, this.fetchSetup = e.fetchSetup || rA, this.controller = new self.AbortController(), this.stats = new fu();\n  }\n  destroy() {\n    this.loader = this.callbacks = this.context = this.config = this.request = null, this.abortInternal(), this.response = null, this.fetchSetup = this.controller = this.stats = null;\n  }\n  abortInternal() {\n    this.controller && !this.stats.loading.end && (this.stats.aborted = !0, this.controller.abort());\n  }\n  abort() {\n    var e;\n    this.abortInternal(), (e = this.callbacks) != null && e.onAbort && this.callbacks.onAbort(this.stats, this.context, this.response);\n  }\n  load(e, t, r) {\n    const n = this.stats;\n    if (n.loading.start)\n      throw new Error(\"Loader can only be used once.\");\n    n.loading.start = self.performance.now();\n    const i = Qw(e, this.controller.signal), o = e.responseType === \"arraybuffer\", a = o ? \"byteLength\" : \"length\", {\n      maxTimeToFirstByteMs: l,\n      maxLoadTimeMs: c\n    } = t.loadPolicy;\n    this.context = e, this.config = t, this.callbacks = r, this.request = this.fetchSetup(e, i), self.clearTimeout(this.requestTimeout), t.timeout = l && ue(l) ? l : c, this.requestTimeout = self.setTimeout(() => {\n      this.callbacks && (this.abortInternal(), this.callbacks.onTimeout(n, e, this.response));\n    }, t.timeout), (xi(this.request) ? this.request.then(self.fetch) : self.fetch(this.request)).then((d) => {\n      var h;\n      this.response = this.loader = d;\n      const f = Math.max(self.performance.now(), n.loading.start);\n      if (self.clearTimeout(this.requestTimeout), t.timeout = c, this.requestTimeout = self.setTimeout(() => {\n        this.callbacks && (this.abortInternal(), this.callbacks.onTimeout(n, e, this.response));\n      }, c - (f - n.loading.start)), !d.ok) {\n        const {\n          status: y,\n          statusText: E\n        } = d;\n        throw new sA(E || \"fetch, bad network response\", y, d);\n      }\n      n.loading.first = f, n.total = tA(d.headers) || n.total;\n      const p = (h = this.callbacks) == null ? void 0 : h.onProgress;\n      return p && ue(t.highWaterMark) ? this.loadProgressively(d, n, e, t.highWaterMark, p) : o ? d.arrayBuffer() : e.responseType === \"json\" ? d.json() : d.text();\n    }).then((d) => {\n      var h, f;\n      const p = this.response;\n      if (!p)\n        throw new Error(\"loader destroyed\");\n      self.clearTimeout(this.requestTimeout), n.loading.end = Math.max(self.performance.now(), n.loading.first);\n      const y = d[a];\n      y && (n.loaded = n.total = y);\n      const E = {\n        url: p.url,\n        data: d,\n        code: p.status\n      }, b = (h = this.callbacks) == null ? void 0 : h.onProgress;\n      b && !ue(t.highWaterMark) && b(n, e, d, p), (f = this.callbacks) == null || f.onSuccess(E, n, e, p);\n    }).catch((d) => {\n      var h;\n      if (self.clearTimeout(this.requestTimeout), n.aborted)\n        return;\n      const f = d && d.code || 0, p = d ? d.message : null;\n      (h = this.callbacks) == null || h.onError({\n        code: f,\n        text: p\n      }, e, d ? d.details : null, n);\n    });\n  }\n  getCacheAge() {\n    let e = null;\n    if (this.response) {\n      const t = this.response.headers.get(\"age\");\n      e = t ? parseFloat(t) : null;\n    }\n    return e;\n  }\n  getResponseHeader(e) {\n    return this.response ? this.response.headers.get(e) : null;\n  }\n  loadProgressively(e, t, r, n = 0, i) {\n    const o = new ip(), a = e.body.getReader(), l = () => a.read().then((c) => {\n      if (c.done)\n        return o.dataLength && i(t, r, o.flush().buffer, e), Promise.resolve(new ArrayBuffer(0));\n      const u = c.value, d = u.length;\n      return t.loaded += d, d < n || o.dataLength ? (o.push(u), o.dataLength >= n && i(t, r, o.flush().buffer, e)) : i(t, r, u.buffer, e), l();\n    }).catch(() => Promise.reject());\n    return l();\n  }\n}\nfunction Qw(s, e) {\n  const t = {\n    method: \"GET\",\n    mode: \"cors\",\n    credentials: \"same-origin\",\n    signal: e,\n    headers: new self.Headers(nt({}, s.headers))\n  };\n  return s.rangeEnd && t.headers.set(\"Range\", \"bytes=\" + s.rangeStart + \"-\" + String(s.rangeEnd - 1)), t;\n}\nfunction eA(s) {\n  const e = Jw.exec(s);\n  if (e)\n    return parseInt(e[2]) - parseInt(e[1]) + 1;\n}\nfunction tA(s) {\n  const e = s.get(\"Content-Range\");\n  if (e) {\n    const r = eA(e);\n    if (ue(r))\n      return r;\n  }\n  const t = s.get(\"Content-Length\");\n  if (t)\n    return parseInt(t);\n}\nfunction rA(s, e) {\n  return new self.Request(s.url, e);\n}\nclass sA extends Error {\n  constructor(e, t, r) {\n    super(e), this.code = void 0, this.details = void 0, this.code = t, this.details = r;\n  }\n}\nconst nA = /^age:\\s*[\\d.]+\\s*$/im;\nclass Zp {\n  constructor(e) {\n    this.xhrSetup = void 0, this.requestTimeout = void 0, this.retryTimeout = void 0, this.retryDelay = void 0, this.config = null, this.callbacks = null, this.context = null, this.loader = null, this.stats = void 0, this.xhrSetup = e && e.xhrSetup || null, this.stats = new fu(), this.retryDelay = 0;\n  }\n  destroy() {\n    this.callbacks = null, this.abortInternal(), this.loader = null, this.config = null, this.context = null, this.xhrSetup = null;\n  }\n  abortInternal() {\n    const e = this.loader;\n    self.clearTimeout(this.requestTimeout), self.clearTimeout(this.retryTimeout), e && (e.onreadystatechange = null, e.onprogress = null, e.readyState !== 4 && (this.stats.aborted = !0, e.abort()));\n  }\n  abort() {\n    var e;\n    this.abortInternal(), (e = this.callbacks) != null && e.onAbort && this.callbacks.onAbort(this.stats, this.context, this.loader);\n  }\n  load(e, t, r) {\n    if (this.stats.loading.start)\n      throw new Error(\"Loader can only be used once.\");\n    this.stats.loading.start = self.performance.now(), this.context = e, this.config = t, this.callbacks = r, this.loadInternal();\n  }\n  loadInternal() {\n    const {\n      config: e,\n      context: t\n    } = this;\n    if (!e || !t)\n      return;\n    const r = this.loader = new self.XMLHttpRequest(), n = this.stats;\n    n.loading.first = 0, n.loaded = 0, n.aborted = !1;\n    const i = this.xhrSetup;\n    i ? Promise.resolve().then(() => {\n      if (!(this.loader !== r || this.stats.aborted))\n        return i(r, t.url);\n    }).catch((o) => {\n      if (!(this.loader !== r || this.stats.aborted))\n        return r.open(\"GET\", t.url, !0), i(r, t.url);\n    }).then(() => {\n      this.loader !== r || this.stats.aborted || this.openAndSendXhr(r, t, e);\n    }).catch((o) => {\n      var a;\n      (a = this.callbacks) == null || a.onError({\n        code: r.status,\n        text: o.message\n      }, t, r, n);\n    }) : this.openAndSendXhr(r, t, e);\n  }\n  openAndSendXhr(e, t, r) {\n    e.readyState || e.open(\"GET\", t.url, !0);\n    const n = t.headers, {\n      maxTimeToFirstByteMs: i,\n      maxLoadTimeMs: o\n    } = r.loadPolicy;\n    if (n)\n      for (const a in n)\n        e.setRequestHeader(a, n[a]);\n    t.rangeEnd && e.setRequestHeader(\"Range\", \"bytes=\" + t.rangeStart + \"-\" + (t.rangeEnd - 1)), e.onreadystatechange = this.readystatechange.bind(this), e.onprogress = this.loadprogress.bind(this), e.responseType = t.responseType, self.clearTimeout(this.requestTimeout), r.timeout = i && ue(i) ? i : o, this.requestTimeout = self.setTimeout(this.loadtimeout.bind(this), r.timeout), e.send();\n  }\n  readystatechange() {\n    const {\n      context: e,\n      loader: t,\n      stats: r\n    } = this;\n    if (!e || !t)\n      return;\n    const n = t.readyState, i = this.config;\n    if (!r.aborted && n >= 2 && (r.loading.first === 0 && (r.loading.first = Math.max(self.performance.now(), r.loading.start), i.timeout !== i.loadPolicy.maxLoadTimeMs && (self.clearTimeout(this.requestTimeout), i.timeout = i.loadPolicy.maxLoadTimeMs, this.requestTimeout = self.setTimeout(this.loadtimeout.bind(this), i.loadPolicy.maxLoadTimeMs - (r.loading.first - r.loading.start)))), n === 4)) {\n      self.clearTimeout(this.requestTimeout), t.onreadystatechange = null, t.onprogress = null;\n      const c = t.status, u = t.responseType === \"text\" ? t.responseText : null;\n      if (c >= 200 && c < 300) {\n        const p = u ?? t.response;\n        if (p != null) {\n          var o, a;\n          r.loading.end = Math.max(self.performance.now(), r.loading.first);\n          const y = t.responseType === \"arraybuffer\" ? p.byteLength : p.length;\n          r.loaded = r.total = y, r.bwEstimate = r.total * 8e3 / (r.loading.end - r.loading.first);\n          const E = (o = this.callbacks) == null ? void 0 : o.onProgress;\n          E && E(r, e, p, t);\n          const b = {\n            url: t.responseURL,\n            data: p,\n            code: c\n          };\n          (a = this.callbacks) == null || a.onSuccess(b, r, e, t);\n          return;\n        }\n      }\n      const d = i.loadPolicy.errorRetry, h = r.retry, f = {\n        url: e.url,\n        data: void 0,\n        code: c\n      };\n      if (ta(d, h, !1, f))\n        this.retry(d);\n      else {\n        var l;\n        rt.error(`${c} while loading ${e.url}`), (l = this.callbacks) == null || l.onError({\n          code: c,\n          text: t.statusText\n        }, e, t, r);\n      }\n    }\n  }\n  loadtimeout() {\n    if (!this.config) return;\n    const e = this.config.loadPolicy.timeoutRetry, t = this.stats.retry;\n    if (ta(e, t, !0))\n      this.retry(e);\n    else {\n      var r;\n      rt.warn(`timeout while loading ${(r = this.context) == null ? void 0 : r.url}`);\n      const n = this.callbacks;\n      n && (this.abortInternal(), n.onTimeout(this.stats, this.context, this.loader));\n    }\n  }\n  retry(e) {\n    const {\n      context: t,\n      stats: r\n    } = this;\n    this.retryDelay = yu(e, r.retry), r.retry++, rt.warn(`${status ? \"HTTP Status \" + status : \"Timeout\"} while loading ${t == null ? void 0 : t.url}, retrying ${r.retry}/${e.maxNumRetry} in ${this.retryDelay}ms`), this.abortInternal(), this.loader = null, self.clearTimeout(this.retryTimeout), this.retryTimeout = self.setTimeout(this.loadInternal.bind(this), this.retryDelay);\n  }\n  loadprogress(e) {\n    const t = this.stats;\n    t.loaded = e.loaded, e.lengthComputable && (t.total = e.total);\n  }\n  getCacheAge() {\n    let e = null;\n    if (this.loader && nA.test(this.loader.getAllResponseHeaders())) {\n      const t = this.loader.getResponseHeader(\"age\");\n      e = t ? parseFloat(t) : null;\n    }\n    return e;\n  }\n  getResponseHeader(e) {\n    return this.loader && new RegExp(`^${e}:\\\\s*[\\\\d.]+\\\\s*$`, \"im\").test(this.loader.getAllResponseHeaders()) ? this.loader.getResponseHeader(e) : null;\n  }\n}\nconst iA = {\n  maxTimeToFirstByteMs: 8e3,\n  maxLoadTimeMs: 2e4,\n  timeoutRetry: null,\n  errorRetry: null\n}, oA = tt(tt({\n  autoStartLoad: !0,\n  // used by stream-controller\n  startPosition: -1,\n  // used by stream-controller\n  defaultAudioCodec: void 0,\n  // used by stream-controller\n  debug: !1,\n  // used by logger\n  capLevelOnFPSDrop: !1,\n  // used by fps-controller\n  capLevelToPlayerSize: !1,\n  // used by cap-level-controller\n  ignoreDevicePixelRatio: !1,\n  // used by cap-level-controller\n  maxDevicePixelRatio: Number.POSITIVE_INFINITY,\n  // used by cap-level-controller\n  preferManagedMediaSource: !0,\n  initialLiveManifestSize: 1,\n  // used by stream-controller\n  maxBufferLength: 30,\n  // used by stream-controller\n  backBufferLength: 1 / 0,\n  // used by buffer-controller\n  frontBufferFlushThreshold: 1 / 0,\n  startOnSegmentBoundary: !1,\n  // used by stream-controller\n  maxBufferSize: 60 * 1e3 * 1e3,\n  // used by stream-controller\n  maxFragLookUpTolerance: 0.25,\n  // used by stream-controller\n  maxBufferHole: 0.1,\n  // used by stream-controller and gap-controller\n  detectStallWithCurrentTimeMs: 1250,\n  // used by gap-controller\n  highBufferWatchdogPeriod: 2,\n  // used by gap-controller\n  nudgeOffset: 0.1,\n  // used by gap-controller\n  nudgeMaxRetry: 3,\n  // used by gap-controller\n  nudgeOnVideoHole: !0,\n  // used by gap-controller\n  liveSyncMode: \"edge\",\n  // used by stream-controller\n  liveSyncDurationCount: 3,\n  // used by latency-controller\n  liveSyncOnStallIncrease: 1,\n  // used by latency-controller\n  liveMaxLatencyDurationCount: 1 / 0,\n  // used by latency-controller\n  liveSyncDuration: void 0,\n  // used by latency-controller\n  liveMaxLatencyDuration: void 0,\n  // used by latency-controller\n  maxLiveSyncPlaybackRate: 1,\n  // used by latency-controller\n  liveDurationInfinity: !1,\n  // used by buffer-controller\n  /**\n   * @deprecated use backBufferLength\n   */\n  liveBackBufferLength: null,\n  // used by buffer-controller\n  maxMaxBufferLength: 600,\n  // used by stream-controller\n  enableWorker: !0,\n  // used by transmuxer\n  workerPath: null,\n  // used by transmuxer\n  enableSoftwareAES: !0,\n  // used by decrypter\n  startLevel: void 0,\n  // used by level-controller\n  startFragPrefetch: !1,\n  // used by stream-controller\n  fpsDroppedMonitoringPeriod: 5e3,\n  // used by fps-controller\n  fpsDroppedMonitoringThreshold: 0.2,\n  // used by fps-controller\n  appendErrorMaxRetry: 3,\n  // used by buffer-controller\n  ignorePlaylistParsingErrors: !1,\n  loader: Zp,\n  // loader: FetchLoader,\n  fLoader: void 0,\n  // used by fragment-loader\n  pLoader: void 0,\n  // used by playlist-loader\n  xhrSetup: void 0,\n  // used by xhr-loader\n  licenseXhrSetup: void 0,\n  // used by eme-controller\n  licenseResponseCallback: void 0,\n  // used by eme-controller\n  abrController: yb,\n  bufferController: l2,\n  capLevelController: Du,\n  errorController: bb,\n  fpsController: cw,\n  stretchShortVideoTrack: !1,\n  // used by mp4-remuxer\n  maxAudioFramesDrift: 1,\n  // used by mp4-remuxer\n  forceKeyFrameOnDiscontinuity: !0,\n  // used by ts-demuxer\n  abrEwmaFastLive: 3,\n  // used by abr-controller\n  abrEwmaSlowLive: 9,\n  // used by abr-controller\n  abrEwmaFastVoD: 3,\n  // used by abr-controller\n  abrEwmaSlowVoD: 9,\n  // used by abr-controller\n  abrEwmaDefaultEstimate: 5e5,\n  // 500 kbps  // used by abr-controller\n  abrEwmaDefaultEstimateMax: 5e6,\n  // 5 mbps\n  abrBandWidthFactor: 0.95,\n  // used by abr-controller\n  abrBandWidthUpFactor: 0.7,\n  // used by abr-controller\n  abrMaxWithRealBitrate: !1,\n  // used by abr-controller\n  maxStarvationDelay: 4,\n  // used by abr-controller\n  maxLoadingDelay: 4,\n  // used by abr-controller\n  minAutoBitrate: 0,\n  // used by hls\n  emeEnabled: !1,\n  // used by eme-controller\n  widevineLicenseUrl: void 0,\n  // used by eme-controller\n  drmSystems: {},\n  // used by eme-controller\n  drmSystemOptions: {},\n  // used by eme-controller\n  requestMediaKeySystemAccessFunc: Yg,\n  // used by eme-controller\n  requireKeySystemAccessOnStart: !1,\n  // used by eme-controller\n  testBandwidth: !0,\n  progressive: !1,\n  lowLatencyMode: !0,\n  cmcd: void 0,\n  enableDateRangeMetadataCues: !0,\n  enableEmsgMetadataCues: !0,\n  enableEmsgKLVMetadata: !1,\n  enableID3MetadataCues: !0,\n  enableInterstitialPlayback: !0,\n  interstitialAppendInPlace: !0,\n  interstitialLiveLookAhead: 10,\n  useMediaCapabilities: !0,\n  preserveManualLevelOnError: !1,\n  certLoadPolicy: {\n    default: iA\n  },\n  keyLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 8e3,\n      maxLoadTimeMs: 2e4,\n      timeoutRetry: {\n        maxNumRetry: 1,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 2e4,\n        backoff: \"linear\"\n      },\n      errorRetry: {\n        maxNumRetry: 8,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 2e4,\n        backoff: \"linear\"\n      }\n    }\n  },\n  manifestLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 1 / 0,\n      maxLoadTimeMs: 2e4,\n      timeoutRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0\n      },\n      errorRetry: {\n        maxNumRetry: 1,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 8e3\n      }\n    }\n  },\n  playlistLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 1e4,\n      maxLoadTimeMs: 2e4,\n      timeoutRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0\n      },\n      errorRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 8e3\n      }\n    }\n  },\n  fragLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 1e4,\n      maxLoadTimeMs: 12e4,\n      timeoutRetry: {\n        maxNumRetry: 4,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0\n      },\n      errorRetry: {\n        maxNumRetry: 6,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 8e3\n      }\n    }\n  },\n  steeringManifestLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 1e4,\n      maxLoadTimeMs: 2e4,\n      timeoutRetry: {\n        maxNumRetry: 2,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0\n      },\n      errorRetry: {\n        maxNumRetry: 1,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 8e3\n      }\n    }\n  },\n  interstitialAssetListLoadPolicy: {\n    default: {\n      maxTimeToFirstByteMs: 1e4,\n      maxLoadTimeMs: 3e4,\n      timeoutRetry: {\n        maxNumRetry: 0,\n        retryDelayMs: 0,\n        maxRetryDelayMs: 0\n      },\n      errorRetry: {\n        maxNumRetry: 0,\n        retryDelayMs: 1e3,\n        maxRetryDelayMs: 8e3\n      }\n    }\n  },\n  // These default settings are deprecated in favor of the above policies\n  // and are maintained for backwards compatibility\n  manifestLoadingTimeOut: 1e4,\n  manifestLoadingMaxRetry: 1,\n  manifestLoadingRetryDelay: 1e3,\n  manifestLoadingMaxRetryTimeout: 64e3,\n  levelLoadingTimeOut: 1e4,\n  levelLoadingMaxRetry: 4,\n  levelLoadingRetryDelay: 1e3,\n  levelLoadingMaxRetryTimeout: 64e3,\n  fragLoadingTimeOut: 2e4,\n  fragLoadingMaxRetry: 6,\n  fragLoadingRetryDelay: 1e3,\n  fragLoadingMaxRetryTimeout: 64e3\n}, aA()), {}, {\n  subtitleStreamController: Sw,\n  subtitleTrackController: hw,\n  timelineController: Ww,\n  audioStreamController: n2,\n  audioTrackController: i2,\n  emeController: _n,\n  cmcdController: iw,\n  contentSteeringController: aw,\n  interstitialsController: xw\n});\nfunction aA() {\n  return {\n    cueHandler: Zw,\n    // used by timeline-controller\n    enableWebVTT: !0,\n    // used by timeline-controller\n    enableIMSC1: !0,\n    // used by timeline-controller\n    enableCEA708Captions: !0,\n    // used by timeline-controller\n    captionsTextTrack1Label: \"English\",\n    // used by timeline-controller\n    captionsTextTrack1LanguageCode: \"en\",\n    // used by timeline-controller\n    captionsTextTrack2Label: \"Spanish\",\n    // used by timeline-controller\n    captionsTextTrack2LanguageCode: \"es\",\n    // used by timeline-controller\n    captionsTextTrack3Label: \"Unknown CC\",\n    // used by timeline-controller\n    captionsTextTrack3LanguageCode: \"\",\n    // used by timeline-controller\n    captionsTextTrack4Label: \"Unknown CC\",\n    // used by timeline-controller\n    captionsTextTrack4LanguageCode: \"\",\n    // used by timeline-controller\n    renderTextTracksNatively: !0\n  };\n}\nfunction lA(s, e, t) {\n  if ((e.liveSyncDurationCount || e.liveMaxLatencyDurationCount) && (e.liveSyncDuration || e.liveMaxLatencyDuration))\n    throw new Error(\"Illegal hls.js config: don't mix up liveSyncDurationCount/liveMaxLatencyDurationCount and liveSyncDuration/liveMaxLatencyDuration\");\n  if (e.liveMaxLatencyDurationCount !== void 0 && (e.liveSyncDurationCount === void 0 || e.liveMaxLatencyDurationCount <= e.liveSyncDurationCount))\n    throw new Error('Illegal hls.js config: \"liveMaxLatencyDurationCount\" must be greater than \"liveSyncDurationCount\"');\n  if (e.liveMaxLatencyDuration !== void 0 && (e.liveSyncDuration === void 0 || e.liveMaxLatencyDuration <= e.liveSyncDuration))\n    throw new Error('Illegal hls.js config: \"liveMaxLatencyDuration\" must be greater than \"liveSyncDuration\"');\n  const r = Tc(s), n = [\"manifest\", \"level\", \"frag\"], i = [\"TimeOut\", \"MaxRetry\", \"RetryDelay\", \"MaxRetryTimeout\"];\n  return n.forEach((o) => {\n    const a = `${o === \"level\" ? \"playlist\" : o}LoadPolicy`, l = e[a] === void 0, c = [];\n    i.forEach((u) => {\n      const d = `${o}Loading${u}`, h = e[d];\n      if (h !== void 0 && l) {\n        c.push(d);\n        const f = r[a].default;\n        switch (e[a] = {\n          default: f\n        }, u) {\n          case \"TimeOut\":\n            f.maxLoadTimeMs = h, f.maxTimeToFirstByteMs = h;\n            break;\n          case \"MaxRetry\":\n            f.errorRetry.maxNumRetry = h, f.timeoutRetry.maxNumRetry = h;\n            break;\n          case \"RetryDelay\":\n            f.errorRetry.retryDelayMs = h, f.timeoutRetry.retryDelayMs = h;\n            break;\n          case \"MaxRetryTimeout\":\n            f.errorRetry.maxRetryDelayMs = h, f.timeoutRetry.maxRetryDelayMs = h;\n            break;\n        }\n      }\n    }), c.length && t.warn(`hls.js config: \"${c.join('\", \"')}\" setting(s) are deprecated, use \"${a}\": ${at(e[a])}`);\n  }), tt(tt({}, r), e);\n}\nfunction Tc(s) {\n  return s && typeof s == \"object\" ? Array.isArray(s) ? s.map(Tc) : Object.keys(s).reduce((e, t) => (e[t] = Tc(s[t]), e), {}) : s;\n}\nfunction cA(s, e) {\n  const t = s.loader;\n  t !== lf && t !== Zp ? (e.log(\"[config]: Custom loader detected, cannot enable progressive streaming\"), s.progressive = !1) : Xw() && (s.loader = lf, s.progressive = !0, s.enableSoftwareAES = !0, e.log(\"[config]: Progressive streaming enabled, using FetchLoader\"));\n}\nconst xo = 2, uA = 0.1, dA = 0.05, hA = 100;\nclass fA extends Hg {\n  constructor(e, t) {\n    super(\"gap-controller\", e.logger), this.hls = void 0, this.fragmentTracker = void 0, this.media = null, this.mediaSource = void 0, this.nudgeRetry = 0, this.stallReported = !1, this.stalled = null, this.moved = !1, this.seeking = !1, this.buffered = {}, this.lastCurrentTime = 0, this.ended = 0, this.waiting = 0, this.onMediaPlaying = () => {\n      this.ended = 0, this.waiting = 0;\n    }, this.onMediaWaiting = () => {\n      var r;\n      (r = this.media) != null && r.seeking || (this.waiting = self.performance.now(), this.tick());\n    }, this.onMediaEnded = () => {\n      if (this.hls) {\n        var r;\n        this.ended = ((r = this.media) == null ? void 0 : r.currentTime) || 1, this.hls.trigger(I.MEDIA_ENDED, {\n          stalled: !1\n        });\n      }\n    }, this.hls = e, this.fragmentTracker = t, this.registerListeners();\n  }\n  registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e && (e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.BUFFER_APPENDED, this.onBufferAppended, this));\n  }\n  unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e && (e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.BUFFER_APPENDED, this.onBufferAppended, this));\n  }\n  destroy() {\n    super.destroy(), this.unregisterListeners(), this.media = this.hls = this.fragmentTracker = null, this.mediaSource = void 0;\n  }\n  onMediaAttached(e, t) {\n    this.setInterval(hA), this.mediaSource = t.mediaSource;\n    const r = this.media = t.media;\n    cr(r, \"playing\", this.onMediaPlaying), cr(r, \"waiting\", this.onMediaWaiting), cr(r, \"ended\", this.onMediaEnded);\n  }\n  onMediaDetaching(e, t) {\n    this.clearInterval();\n    const {\n      media: r\n    } = this;\n    r && (pr(r, \"playing\", this.onMediaPlaying), pr(r, \"waiting\", this.onMediaWaiting), pr(r, \"ended\", this.onMediaEnded), this.media = null), this.mediaSource = void 0;\n  }\n  onBufferAppended(e, t) {\n    this.buffered = t.timeRanges;\n  }\n  get hasBuffered() {\n    return Object.keys(this.buffered).length > 0;\n  }\n  tick() {\n    var e;\n    if (!((e = this.media) != null && e.readyState) || !this.hasBuffered)\n      return;\n    const t = this.media.currentTime;\n    this.poll(t, this.lastCurrentTime), this.lastCurrentTime = t;\n  }\n  /**\n   * Checks if the playhead is stuck within a gap, and if so, attempts to free it.\n   * A gap is an unbuffered range between two buffered ranges (or the start and the first buffered range).\n   *\n   * @param lastCurrentTime - Previously read playhead position\n   */\n  poll(e, t) {\n    var r, n;\n    const i = (r = this.hls) == null ? void 0 : r.config;\n    if (!i)\n      return;\n    const o = this.media;\n    if (!o)\n      return;\n    const {\n      seeking: a\n    } = o, l = this.seeking && !a, c = !this.seeking && a, u = o.paused && !a || o.ended || o.playbackRate === 0;\n    if (this.seeking = a, e !== t) {\n      t && (this.ended = 0), this.moved = !0, a || (this.nudgeRetry = 0, i.nudgeOnVideoHole && !u && e > t && this.nudgeOnVideoHole(e, t)), this.waiting === 0 && this.stallResolved(e);\n      return;\n    }\n    if (c || l) {\n      l && this.stallResolved(e);\n      return;\n    }\n    if (u) {\n      this.nudgeRetry = 0, this.stallResolved(e), !this.ended && o.ended && this.hls && (this.ended = e || 1, this.hls.trigger(I.MEDIA_ENDED, {\n        stalled: !1\n      }));\n      return;\n    }\n    if (!Ce.getBuffered(o).length) {\n      this.nudgeRetry = 0;\n      return;\n    }\n    const d = Ce.bufferInfo(o, e, 0), h = d.nextStart || 0, f = this.fragmentTracker;\n    if (a && f && this.hls) {\n      const H = cf(this.hls.inFlightFragments, e), K = d.len > xo, j = !h || H || h - e > xo && !f.getPartialFragment(e);\n      if (K || j)\n        return;\n      this.moved = !1;\n    }\n    const p = (n = this.hls) == null ? void 0 : n.latestLevelDetails;\n    if (!this.moved && this.stalled !== null && f) {\n      if (!(d.len > 0) && !h)\n        return;\n      const K = Math.max(h, d.start || 0) - e, C = !!(p != null && p.live) ? p.targetduration * 2 : xo, k = so(e, f);\n      if (K > 0 && (K <= C || k)) {\n        o.paused || this._trySkipBufferHole(k);\n        return;\n      }\n    }\n    const y = i.detectStallWithCurrentTimeMs, E = self.performance.now(), b = this.waiting;\n    let R = this.stalled;\n    if (R === null)\n      if (b > 0 && E - b < y)\n        R = this.stalled = b;\n      else {\n        this.stalled = E;\n        return;\n      }\n    const A = E - R;\n    if (!a && (A >= y || b) && this.hls) {\n      var F;\n      if (((F = this.mediaSource) == null ? void 0 : F.readyState) === \"ended\" && !(p != null && p.live) && Math.abs(e - ((p == null ? void 0 : p.edge) || 0)) < 1) {\n        if (this.ended)\n          return;\n        this.ended = e || 1, this.hls.trigger(I.MEDIA_ENDED, {\n          stalled: !0\n        });\n        return;\n      }\n      if (this._reportStall(d), !this.media || !this.hls)\n        return;\n    }\n    const M = Ce.bufferInfo(o, e, i.maxBufferHole);\n    this._tryFixBufferStall(M, A, e);\n  }\n  stallResolved(e) {\n    const t = this.stalled;\n    if (t && this.hls && (this.stalled = null, this.stallReported)) {\n      const r = self.performance.now() - t;\n      this.log(`playback not stuck anymore @${e}, after ${Math.round(r)}ms`), this.stallReported = !1, this.waiting = 0, this.hls.trigger(I.STALL_RESOLVED, {});\n    }\n  }\n  nudgeOnVideoHole(e, t) {\n    var r;\n    const n = this.buffered.video;\n    if (this.hls && this.media && this.fragmentTracker && (r = this.buffered.audio) != null && r.length && n && n.length > 1 && e > n.end(0)) {\n      const i = Ce.bufferedInfo(Ce.timeRangesToArray(this.buffered.audio), e, 0);\n      if (i.len > 1 && t >= i.start) {\n        const o = Ce.timeRangesToArray(n), a = Ce.bufferedInfo(o, t, 0).bufferedIndex;\n        if (a > -1 && a < o.length - 1) {\n          const l = Ce.bufferedInfo(o, e, 0).bufferedIndex, c = o[a].end, u = o[a + 1].start;\n          if ((l === -1 || l > a) && u - c < 1 && // `maxBufferHole` may be too small and setting it to 0 should not disable this feature\n          e - c < 2) {\n            const d = new Error(`nudging playhead to flush pipeline after video hole. currentTime: ${e} hole: ${c} -> ${u} buffered index: ${l}`);\n            this.warn(d.message), this.media.currentTime += 1e-6;\n            let h = so(e, this.fragmentTracker);\n            h && \"fragment\" in h ? h = h.fragment : h || (h = void 0);\n            const f = Ce.bufferInfo(this.media, e, 0);\n            this.hls.trigger(I.ERROR, {\n              type: ve.MEDIA_ERROR,\n              details: J.BUFFER_SEEK_OVER_HOLE,\n              fatal: !1,\n              error: d,\n              reason: d.message,\n              frag: h,\n              buffer: f.len,\n              bufferInfo: f\n            });\n          }\n        }\n      }\n    }\n  }\n  /**\n   * Detects and attempts to fix known buffer stalling issues.\n   * @param bufferInfo - The properties of the current buffer.\n   * @param stalledDurationMs - The amount of time Hls.js has been stalling for.\n   * @private\n   */\n  _tryFixBufferStall(e, t, r) {\n    var n, i;\n    const {\n      fragmentTracker: o,\n      media: a\n    } = this, l = (n = this.hls) == null ? void 0 : n.config;\n    if (!a || !o || !l)\n      return;\n    const c = (i = this.hls) == null ? void 0 : i.latestLevelDetails, u = so(r, o);\n    if ((u || c != null && c.live && r < c.fragmentStart) && (this._trySkipBufferHole(u) || !this.media))\n      return;\n    const d = e.buffered, h = this.adjacentTraversal(e, r);\n    (d && d.length > 1 && e.len > l.maxBufferHole || e.nextStart && (e.nextStart - r < l.maxBufferHole || h)) && (t > l.highBufferWatchdogPeriod * 1e3 || this.waiting) && (this.warn(\"Trying to nudge playhead over buffer-hole\"), this._tryNudgeBuffer(e));\n  }\n  adjacentTraversal(e, t) {\n    const r = this.fragmentTracker, n = e.nextStart;\n    if (r && n) {\n      const i = r.getFragAtPos(t, pe.MAIN), o = r.getFragAtPos(n, pe.MAIN);\n      if (i && o)\n        return o.sn - i.sn < 2;\n    }\n    return !1;\n  }\n  /**\n   * Triggers a BUFFER_STALLED_ERROR event, but only once per stall period.\n   * @param bufferLen - The playhead distance from the end of the current buffer segment.\n   * @private\n   */\n  _reportStall(e) {\n    const {\n      hls: t,\n      media: r,\n      stallReported: n,\n      stalled: i\n    } = this;\n    if (!n && i !== null && r && t) {\n      this.stallReported = !0;\n      const o = new Error(`Playback stalling at @${r.currentTime} due to low buffer (${at(e)})`);\n      this.warn(o.message), t.trigger(I.ERROR, {\n        type: ve.MEDIA_ERROR,\n        details: J.BUFFER_STALLED_ERROR,\n        fatal: !1,\n        error: o,\n        buffer: e.len,\n        bufferInfo: e,\n        stalled: {\n          start: i\n        }\n      });\n    }\n  }\n  /**\n   * Attempts to fix buffer stalls by jumping over known gaps caused by partial fragments\n   * @param appended - The fragment or part found at the current time (where playback is stalling).\n   * @private\n   */\n  _trySkipBufferHole(e) {\n    var t;\n    const {\n      fragmentTracker: r,\n      media: n\n    } = this, i = (t = this.hls) == null ? void 0 : t.config;\n    if (!n || !r || !i)\n      return 0;\n    const o = n.currentTime, a = Ce.bufferInfo(n, o, 0), l = o < a.start ? a.start : a.nextStart;\n    if (l && this.hls) {\n      const u = a.len <= i.maxBufferHole, d = a.len > 0 && a.len < 1 && n.readyState < 3, h = l - o;\n      if (h > 0 && (u || d)) {\n        if (h > i.maxBufferHole) {\n          let p = !1;\n          if (o === 0) {\n            const y = r.getAppendedFrag(0, pe.MAIN);\n            y && l < y.end && (p = !0);\n          }\n          if (!p && e) {\n            var c;\n            if (!((c = this.hls.loadLevelObj) != null && c.details) || cf(this.hls.inFlightFragments, l))\n              return 0;\n            let E = !1, b = e.end;\n            for (; b < l; ) {\n              const R = so(b, r);\n              if (R)\n                b += R.duration;\n              else {\n                E = !0;\n                break;\n              }\n            }\n            if (E)\n              return 0;\n          }\n        }\n        const f = Math.max(l + dA, o + uA);\n        if (this.warn(`skipping hole, adjusting currentTime from ${o} to ${f}`), this.moved = !0, n.currentTime = f, !(e != null && e.gap)) {\n          const p = new Error(`fragment loaded with buffer holes, seeking from ${o} to ${f}`), y = {\n            type: ve.MEDIA_ERROR,\n            details: J.BUFFER_SEEK_OVER_HOLE,\n            fatal: !1,\n            error: p,\n            reason: p.message,\n            buffer: a.len,\n            bufferInfo: a\n          };\n          e && (\"fragment\" in e ? y.part = e : y.frag = e), this.hls.trigger(I.ERROR, y);\n        }\n        return f;\n      }\n    }\n    return 0;\n  }\n  /**\n   * Attempts to fix buffer stalls by advancing the mediaElement's current time by a small amount.\n   * @private\n   */\n  _tryNudgeBuffer(e) {\n    const {\n      hls: t,\n      media: r,\n      nudgeRetry: n\n    } = this, i = t == null ? void 0 : t.config;\n    if (!r || !i)\n      return 0;\n    const o = r.currentTime;\n    if (this.nudgeRetry++, n < i.nudgeMaxRetry) {\n      const a = o + (n + 1) * i.nudgeOffset, l = new Error(`Nudging 'currentTime' from ${o} to ${a}`);\n      this.warn(l.message), r.currentTime = a, t.trigger(I.ERROR, {\n        type: ve.MEDIA_ERROR,\n        details: J.BUFFER_NUDGE_ON_STALL,\n        error: l,\n        fatal: !1,\n        buffer: e.len,\n        bufferInfo: e\n      });\n    } else {\n      const a = new Error(`Playhead still not moving while enough data buffered @${o} after ${i.nudgeMaxRetry} nudges`);\n      this.error(a.message), t.trigger(I.ERROR, {\n        type: ve.MEDIA_ERROR,\n        details: J.BUFFER_STALLED_ERROR,\n        error: a,\n        fatal: !0,\n        buffer: e.len,\n        bufferInfo: e\n      });\n    }\n  }\n}\nfunction cf(s, e) {\n  const t = uf(s.main);\n  if (t && t.start <= e)\n    return t;\n  const r = uf(s.audio);\n  return r && r.start <= e ? r : null;\n}\nfunction uf(s) {\n  if (!s)\n    return null;\n  switch (s.state) {\n    case ne.IDLE:\n    case ne.STOPPED:\n    case ne.ENDED:\n    case ne.ERROR:\n      return null;\n  }\n  return s.frag;\n}\nfunction so(s, e) {\n  return e.getAppendedFrag(s, pe.MAIN) || e.getPartialFragment(s);\n}\nconst gA = 0.25;\nfunction wc() {\n  if (!(typeof self > \"u\"))\n    return self.VTTCue || self.TextTrackCue;\n}\nfunction Cl(s, e, t, r, n) {\n  let i = new s(e, t, \"\");\n  try {\n    i.value = r, n && (i.type = n);\n  } catch {\n    i = new s(e, t, at(n ? tt({\n      type: n\n    }, r) : r));\n  }\n  return i;\n}\nconst no = (() => {\n  const s = wc();\n  try {\n    s && new s(0, Number.POSITIVE_INFINITY, \"\");\n  } catch {\n    return Number.MAX_VALUE;\n  }\n  return Number.POSITIVE_INFINITY;\n})();\nclass pA {\n  constructor(e) {\n    this.hls = void 0, this.id3Track = null, this.media = null, this.dateRangeCuesAppended = {}, this.removeCues = !0, this.assetCue = void 0, this.onEventCueEnter = () => {\n      this.hls && this.hls.trigger(I.EVENT_CUE_ENTER, {});\n    }, this.hls = e, this._registerListeners();\n  }\n  destroy() {\n    this._unregisterListeners(), this.id3Track = null, this.media = null, this.dateRangeCuesAppended = {}, this.hls = this.onEventCueEnter = null;\n  }\n  _registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e && (e.on(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this), e.on(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.on(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.on(I.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this));\n  }\n  _unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e && (e.off(I.MEDIA_ATTACHING, this.onMediaAttaching, this), e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this), e.off(I.BUFFER_FLUSHING, this.onBufferFlushing, this), e.off(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.off(I.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this));\n  }\n  // Add ID3 metatadata text track.\n  onMediaAttaching(e, t) {\n    var r;\n    this.media = t.media, ((r = t.overrides) == null ? void 0 : r.cueRemoval) === !1 && (this.removeCues = !1);\n  }\n  onMediaAttached() {\n    var e;\n    const t = (e = this.hls) == null ? void 0 : e.latestLevelDetails;\n    t && this.updateDateRangeCues(t);\n  }\n  onMediaDetaching(e, t) {\n    this.media = null, !t.transferMedia && (this.id3Track && (this.removeCues && Sn(this.id3Track, this.onEventCueEnter), this.id3Track = null), this.dateRangeCuesAppended = {});\n  }\n  onManifestLoading() {\n    this.dateRangeCuesAppended = {};\n  }\n  createTrack(e) {\n    const t = this.getID3Track(e.textTracks);\n    return t.mode = \"hidden\", t;\n  }\n  getID3Track(e) {\n    if (this.media) {\n      for (let t = 0; t < e.length; t++) {\n        const r = e[t];\n        if (r.kind === \"metadata\" && r.label === \"id3\")\n          return Np(r, this.media), r;\n      }\n      return this.media.addTextTrack(\"metadata\", \"id3\");\n    }\n  }\n  onFragParsingMetadata(e, t) {\n    if (!this.media || !this.hls)\n      return;\n    const {\n      enableEmsgMetadataCues: r,\n      enableID3MetadataCues: n\n    } = this.hls.config;\n    if (!r && !n)\n      return;\n    const {\n      samples: i\n    } = t;\n    this.id3Track || (this.id3Track = this.createTrack(this.media));\n    const o = wc();\n    if (o)\n      for (let a = 0; a < i.length; a++) {\n        const l = i[a].type;\n        if (l === br.emsg && !r || !n)\n          continue;\n        const c = hp(i[a].data), u = i[a].pts;\n        let d = u + i[a].duration;\n        d > no && (d = no), d - u <= 0 && (d = u + gA);\n        for (let f = 0; f < c.length; f++) {\n          const p = c[f];\n          if (!fp(p)) {\n            this.updateId3CueEnds(u, l);\n            const y = Cl(o, u, d, p, l);\n            y && this.id3Track.addCue(y);\n          }\n        }\n      }\n  }\n  updateId3CueEnds(e, t) {\n    var r;\n    const n = (r = this.id3Track) == null ? void 0 : r.cues;\n    if (n)\n      for (let i = n.length; i--; ) {\n        const o = n[i];\n        o.type === t && o.startTime < e && o.endTime === no && (o.endTime = e);\n      }\n  }\n  onBufferFlushing(e, {\n    startOffset: t,\n    endOffset: r,\n    type: n\n  }) {\n    const {\n      id3Track: i,\n      hls: o\n    } = this;\n    if (!o)\n      return;\n    const {\n      config: {\n        enableEmsgMetadataCues: a,\n        enableID3MetadataCues: l\n      }\n    } = o;\n    if (i && (a || l)) {\n      let c;\n      n === \"audio\" ? c = (u) => u.type === br.audioId3 && l : n === \"video\" ? c = (u) => u.type === br.emsg && a : c = (u) => u.type === br.audioId3 && l || u.type === br.emsg && a, Sc(i, t, r, c);\n    }\n  }\n  onLevelUpdated(e, {\n    details: t\n  }) {\n    this.updateDateRangeCues(t, !0);\n  }\n  onLevelPtsUpdated(e, t) {\n    Math.abs(t.drift) > 0.01 && this.updateDateRangeCues(t.details);\n  }\n  updateDateRangeCues(e, t) {\n    if (!this.hls || !this.media)\n      return;\n    const {\n      assetPlayerId: r,\n      timelineOffset: n,\n      enableDateRangeMetadataCues: i,\n      interstitialsController: o\n    } = this.hls.config;\n    if (!i)\n      return;\n    const a = wc();\n    if (r && n && !o) {\n      const {\n        fragmentStart: y,\n        fragmentEnd: E\n      } = e;\n      let b = this.assetCue;\n      b ? (b.startTime = y, b.endTime = E) : a && (b = this.assetCue = Cl(a, y, E, {\n        assetPlayerId: this.hls.config.assetPlayerId\n      }, \"hlsjs.interstitial.asset\"), b && (b.id = r, this.id3Track || (this.id3Track = this.createTrack(this.media)), this.id3Track.addCue(b), b.addEventListener(\"enter\", this.onEventCueEnter)));\n    }\n    if (!e.hasProgramDateTime)\n      return;\n    const {\n      id3Track: l\n    } = this, {\n      dateRanges: c\n    } = e, u = Object.keys(c);\n    let d = this.dateRangeCuesAppended;\n    if (l && t) {\n      var h;\n      if ((h = l.cues) != null && h.length) {\n        const y = Object.keys(d).filter((E) => !u.includes(E));\n        for (let E = y.length; E--; ) {\n          var f;\n          const b = y[E], R = (f = d[b]) == null ? void 0 : f.cues;\n          delete d[b], R && Object.keys(R).forEach((A) => {\n            const F = R[A];\n            if (F) {\n              F.removeEventListener(\"enter\", this.onEventCueEnter);\n              try {\n                l.removeCue(F);\n              } catch {\n              }\n            }\n          });\n        }\n      } else\n        d = this.dateRangeCuesAppended = {};\n    }\n    const p = e.fragments[e.fragments.length - 1];\n    if (!(u.length === 0 || !ue(p == null ? void 0 : p.programDateTime))) {\n      this.id3Track || (this.id3Track = this.createTrack(this.media));\n      for (let y = 0; y < u.length; y++) {\n        const E = u[y], b = c[E], R = b.startTime, A = d[E], F = (A == null ? void 0 : A.cues) || {};\n        let M = (A == null ? void 0 : A.durationKnown) || !1, H = no;\n        const {\n          duration: K,\n          endDate: j\n        } = b;\n        if (j && K !== null)\n          H = R + K, M = !0;\n        else if (b.endOnNext && !M) {\n          const k = u.reduce(($, W) => {\n            if (W !== b.id) {\n              const _ = c[W];\n              if (_.class === b.class && _.startDate > b.startDate && (!$ || b.startDate < $.startDate))\n                return _;\n            }\n            return $;\n          }, null);\n          k && (H = k.startTime, M = !0);\n        }\n        const C = Object.keys(b.attr);\n        for (let k = 0; k < C.length; k++) {\n          const $ = C[k];\n          if (!Ob($))\n            continue;\n          const W = F[$];\n          if (W)\n            M && !(A != null && A.durationKnown) ? W.endTime = H : Math.abs(W.startTime - R) > 0.01 && (W.startTime = R, W.endTime = H);\n          else if (a) {\n            let _ = b.attr[$];\n            Bb($) && (_ = Ig(_));\n            const x = Cl(a, R, H, {\n              key: $,\n              data: _\n            }, br.dateRange);\n            x && (x.id = E, this.id3Track.addCue(x), F[$] = x, o && ($ === \"X-ASSET-LIST\" || $ === \"X-ASSET-URL\") && x.addEventListener(\"enter\", this.onEventCueEnter));\n          }\n        }\n        d[E] = {\n          cues: F,\n          dateRange: b,\n          durationKnown: M\n        };\n      }\n    }\n  }\n}\nclass mA {\n  constructor(e) {\n    this.hls = void 0, this.config = void 0, this.media = null, this.currentTime = 0, this.stallCount = 0, this._latency = null, this._targetLatencyUpdated = !1, this.onTimeupdate = () => {\n      const {\n        media: t\n      } = this, r = this.levelDetails;\n      if (!t || !r)\n        return;\n      this.currentTime = t.currentTime;\n      const n = this.computeLatency();\n      if (n === null)\n        return;\n      this._latency = n;\n      const {\n        lowLatencyMode: i,\n        maxLiveSyncPlaybackRate: o\n      } = this.config;\n      if (!i || o === 1 || !r.live)\n        return;\n      const a = this.targetLatency;\n      if (a === null)\n        return;\n      const l = n - a, c = Math.min(this.maxLatency, a + r.targetduration);\n      if (l < c && l > 0.05 && this.forwardBufferLength > 1) {\n        const d = Math.min(2, Math.max(1, o)), h = Math.round(2 / (1 + Math.exp(-0.75 * l - this.edgeStalled)) * 20) / 20, f = Math.min(d, Math.max(1, h));\n        this.changeMediaPlaybackRate(t, f);\n      } else t.playbackRate !== 1 && t.playbackRate !== 0 && this.changeMediaPlaybackRate(t, 1);\n    }, this.hls = e, this.config = e.config, this.registerListeners();\n  }\n  get levelDetails() {\n    var e;\n    return ((e = this.hls) == null ? void 0 : e.latestLevelDetails) || null;\n  }\n  get latency() {\n    return this._latency || 0;\n  }\n  get maxLatency() {\n    const {\n      config: e\n    } = this;\n    if (e.liveMaxLatencyDuration !== void 0)\n      return e.liveMaxLatencyDuration;\n    const t = this.levelDetails;\n    return t ? e.liveMaxLatencyDurationCount * t.targetduration : 0;\n  }\n  get targetLatency() {\n    const e = this.levelDetails;\n    if (e === null || this.hls === null)\n      return null;\n    const {\n      holdBack: t,\n      partHoldBack: r,\n      targetduration: n\n    } = e, {\n      liveSyncDuration: i,\n      liveSyncDurationCount: o,\n      lowLatencyMode: a\n    } = this.config, l = this.hls.userConfig;\n    let c = a && r || t;\n    (this._targetLatencyUpdated || l.liveSyncDuration || l.liveSyncDurationCount || c === 0) && (c = i !== void 0 ? i : o * n);\n    const u = n;\n    return c + Math.min(this.stallCount * this.config.liveSyncOnStallIncrease, u);\n  }\n  set targetLatency(e) {\n    this.stallCount = 0, this.config.liveSyncDuration = e, this._targetLatencyUpdated = !0;\n  }\n  get liveSyncPosition() {\n    const e = this.estimateLiveEdge(), t = this.targetLatency;\n    if (e === null || t === null)\n      return null;\n    const r = this.levelDetails;\n    if (r === null)\n      return null;\n    const n = r.edge, i = e - t - this.edgeStalled, o = n - r.totalduration, a = n - (this.config.lowLatencyMode && r.partTarget || r.targetduration);\n    return Math.min(Math.max(o, i), a);\n  }\n  get drift() {\n    const e = this.levelDetails;\n    return e === null ? 1 : e.drift;\n  }\n  get edgeStalled() {\n    const e = this.levelDetails;\n    if (e === null)\n      return 0;\n    const t = (this.config.lowLatencyMode && e.partTarget || e.targetduration) * 3;\n    return Math.max(e.age - t, 0);\n  }\n  get forwardBufferLength() {\n    const {\n      media: e\n    } = this, t = this.levelDetails;\n    if (!e || !t)\n      return 0;\n    const r = e.buffered.length;\n    return (r ? e.buffered.end(r - 1) : t.edge) - this.currentTime;\n  }\n  destroy() {\n    this.unregisterListeners(), this.onMediaDetaching(), this.hls = null;\n  }\n  registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e && (e.on(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.on(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.on(I.ERROR, this.onError, this));\n  }\n  unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e && (e.off(I.MEDIA_ATTACHED, this.onMediaAttached, this), e.off(I.MEDIA_DETACHING, this.onMediaDetaching, this), e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.LEVEL_UPDATED, this.onLevelUpdated, this), e.off(I.ERROR, this.onError, this));\n  }\n  onMediaAttached(e, t) {\n    this.media = t.media, this.media.addEventListener(\"timeupdate\", this.onTimeupdate);\n  }\n  onMediaDetaching() {\n    this.media && (this.media.removeEventListener(\"timeupdate\", this.onTimeupdate), this.media = null);\n  }\n  onManifestLoading() {\n    this._latency = null, this.stallCount = 0;\n  }\n  onLevelUpdated(e, {\n    details: t\n  }) {\n    t.advanced && this.onTimeupdate(), !t.live && this.media && this.media.removeEventListener(\"timeupdate\", this.onTimeupdate);\n  }\n  onError(e, t) {\n    var r;\n    t.details === J.BUFFER_STALLED_ERROR && (this.stallCount++, this.hls && (r = this.levelDetails) != null && r.live && this.hls.logger.warn(\"[latency-controller]: Stall detected, adjusting target latency\"));\n  }\n  changeMediaPlaybackRate(e, t) {\n    var r, n;\n    e.playbackRate !== t && ((r = this.hls) == null || r.logger.debug(`[latency-controller]: latency=${this.latency.toFixed(3)}, targetLatency=${(n = this.targetLatency) == null ? void 0 : n.toFixed(3)}, forwardBufferLength=${this.forwardBufferLength.toFixed(3)}: adjusting playback rate from ${e.playbackRate} to ${t}`), e.playbackRate = t);\n  }\n  estimateLiveEdge() {\n    const e = this.levelDetails;\n    return e === null ? null : e.edge + e.age;\n  }\n  computeLatency() {\n    const e = this.estimateLiveEdge();\n    return e === null ? null : e - this.currentTime;\n  }\n}\nclass yA extends ku {\n  constructor(e, t) {\n    super(e, \"level-controller\"), this._levels = [], this._firstLevel = -1, this._maxAutoLevel = -1, this._startLevel = void 0, this.currentLevel = null, this.currentLevelIndex = -1, this.manualLevelIndex = -1, this.steering = void 0, this.onParsedComplete = void 0, this.steering = t, this._registerListeners();\n  }\n  _registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.on(I.LEVEL_LOADED, this.onLevelLoaded, this), e.on(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.on(I.FRAG_BUFFERED, this.onFragBuffered, this), e.on(I.ERROR, this.onError, this);\n  }\n  _unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.MANIFEST_LOADED, this.onManifestLoaded, this), e.off(I.LEVEL_LOADED, this.onLevelLoaded, this), e.off(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.off(I.FRAG_BUFFERED, this.onFragBuffered, this), e.off(I.ERROR, this.onError, this);\n  }\n  destroy() {\n    this._unregisterListeners(), this.steering = null, this.resetLevels(), super.destroy();\n  }\n  stopLoad() {\n    this._levels.forEach((t) => {\n      t.loadError = 0, t.fragmentError = 0;\n    }), super.stopLoad();\n  }\n  resetLevels() {\n    this._startLevel = void 0, this.manualLevelIndex = -1, this.currentLevelIndex = -1, this.currentLevel = null, this._levels = [], this._maxAutoLevel = -1;\n  }\n  onManifestLoading(e, t) {\n    this.resetLevels();\n  }\n  onManifestLoaded(e, t) {\n    const r = this.hls.config.preferManagedMediaSource, n = [], i = {}, o = {};\n    let a = !1, l = !1, c = !1;\n    t.levels.forEach((u) => {\n      const d = u.attrs;\n      let {\n        audioCodec: h,\n        videoCodec: f\n      } = u;\n      h && (u.audioCodec = h = Xo(h, r) || void 0), f && (f = u.videoCodec = JS(f));\n      const {\n        width: p,\n        height: y,\n        unknownCodecs: E\n      } = u, b = (E == null ? void 0 : E.length) || 0;\n      if (a || (a = !!(p && y)), l || (l = !!f), c || (c = !!h), b || h && !this.isAudioSupported(h) || f && !this.isVideoSupported(f)) {\n        this.log(`Some or all CODECS not supported \"${d.CODECS}\"`);\n        return;\n      }\n      const {\n        CODECS: R,\n        \"FRAME-RATE\": A,\n        \"HDCP-LEVEL\": F,\n        \"PATHWAY-ID\": M,\n        RESOLUTION: H,\n        \"VIDEO-RANGE\": K\n      } = d, C = `${`${M || \".\"}-`}${u.bitrate}-${H}-${A}-${R}-${K}-${F}`;\n      if (i[C])\n        if (i[C].uri !== u.url && !u.attrs[\"PATHWAY-ID\"]) {\n          const k = o[C] += 1;\n          u.attrs[\"PATHWAY-ID\"] = new Array(k + 1).join(\".\");\n          const $ = this.createLevel(u);\n          i[C] = $, n.push($);\n        } else\n          i[C].addGroupId(\"audio\", d.AUDIO), i[C].addGroupId(\"text\", d.SUBTITLES);\n      else {\n        const k = this.createLevel(u);\n        i[C] = k, o[C] = 1, n.push(k);\n      }\n    }), this.filterAndSortMediaOptions(n, t, a, l, c);\n  }\n  createLevel(e) {\n    const t = new mi(e), r = e.supplemental;\n    if (r != null && r.videoCodec && !this.isVideoSupported(r.videoCodec)) {\n      const n = new Error(`SUPPLEMENTAL-CODECS not supported \"${r.videoCodec}\"`);\n      this.log(n.message), t.supportedResult = Fg(n, []);\n    }\n    return t;\n  }\n  isAudioSupported(e) {\n    return gi(e, \"audio\", this.hls.config.preferManagedMediaSource);\n  }\n  isVideoSupported(e) {\n    return gi(e, \"video\", this.hls.config.preferManagedMediaSource);\n  }\n  filterAndSortMediaOptions(e, t, r, n, i) {\n    var o;\n    let a = [], l = [], c = e;\n    const u = ((o = t.stats) == null ? void 0 : o.parsing) || {};\n    if ((r || n) && i && (c = c.filter(({\n      videoCodec: R,\n      videoRange: A,\n      width: F,\n      height: M\n    }) => (!!R || !!(F && M)) && lb(A))), c.length === 0) {\n      Promise.resolve().then(() => {\n        if (this.hls) {\n          let R = \"no level with compatible codecs found in manifest\", A = R;\n          t.levels.length && (A = `one or more CODECS in variant not supported: ${at(t.levels.map((M) => M.attrs.CODECS).filter((M, H, K) => K.indexOf(M) === H))}`, this.warn(A), R += ` (${A})`);\n          const F = new Error(R);\n          this.hls.trigger(I.ERROR, {\n            type: ve.MEDIA_ERROR,\n            details: J.MANIFEST_INCOMPATIBLE_CODECS_ERROR,\n            fatal: !0,\n            url: t.url,\n            error: F,\n            reason: A\n          });\n        }\n      }), u.end = performance.now();\n      return;\n    }\n    t.audioTracks && (a = t.audioTracks.filter((R) => !R.audioCodec || this.isAudioSupported(R.audioCodec)), df(a)), t.subtitles && (l = t.subtitles, df(l));\n    const d = c.slice(0);\n    c.sort((R, A) => {\n      if (R.attrs[\"HDCP-LEVEL\"] !== A.attrs[\"HDCP-LEVEL\"])\n        return (R.attrs[\"HDCP-LEVEL\"] || \"\") > (A.attrs[\"HDCP-LEVEL\"] || \"\") ? 1 : -1;\n      if (r && R.height !== A.height)\n        return R.height - A.height;\n      if (R.frameRate !== A.frameRate)\n        return R.frameRate - A.frameRate;\n      if (R.videoRange !== A.videoRange)\n        return Jo.indexOf(R.videoRange) - Jo.indexOf(A.videoRange);\n      if (R.videoCodec !== A.videoCodec) {\n        const F = sh(R.videoCodec), M = sh(A.videoCodec);\n        if (F !== M)\n          return M - F;\n      }\n      if (R.uri === A.uri && R.codecSet !== A.codecSet) {\n        const F = Zo(R.codecSet), M = Zo(A.codecSet);\n        if (F !== M)\n          return M - F;\n      }\n      return R.averageBitrate !== A.averageBitrate ? R.averageBitrate - A.averageBitrate : 0;\n    });\n    let h = d[0];\n    if (this.steering && (c = this.steering.filterParsedLevels(c), c.length !== d.length)) {\n      for (let R = 0; R < d.length; R++)\n        if (d[R].pathwayId === c[0].pathwayId) {\n          h = d[R];\n          break;\n        }\n    }\n    this._levels = c;\n    for (let R = 0; R < c.length; R++)\n      if (c[R] === h) {\n        var f;\n        this._firstLevel = R;\n        const A = h.bitrate, F = this.hls.bandwidthEstimate;\n        if (this.log(`manifest loaded, ${c.length} level(s) found, first bitrate: ${A}`), ((f = this.hls.userConfig) == null ? void 0 : f.abrEwmaDefaultEstimate) === void 0) {\n          const M = Math.min(A, this.hls.config.abrEwmaDefaultEstimateMax);\n          M > F && F === this.hls.abrEwmaDefaultEstimate && (this.hls.bandwidthEstimate = M);\n        }\n        break;\n      }\n    const p = i && !n, y = this.hls.config, E = !!(y.audioStreamController && y.audioTrackController), b = {\n      levels: c,\n      audioTracks: a,\n      subtitleTracks: l,\n      sessionData: t.sessionData,\n      sessionKeys: t.sessionKeys,\n      firstLevel: this._firstLevel,\n      stats: t.stats,\n      audio: i,\n      video: n,\n      altAudio: E && !p && a.some((R) => !!R.url)\n    };\n    u.end = performance.now(), this.hls.trigger(I.MANIFEST_PARSED, b);\n  }\n  get levels() {\n    return this._levels.length === 0 ? null : this._levels;\n  }\n  get loadLevelObj() {\n    return this.currentLevel;\n  }\n  get level() {\n    return this.currentLevelIndex;\n  }\n  set level(e) {\n    const t = this._levels;\n    if (t.length === 0)\n      return;\n    if (e < 0 || e >= t.length) {\n      const u = new Error(\"invalid level idx\"), d = e < 0;\n      if (this.hls.trigger(I.ERROR, {\n        type: ve.OTHER_ERROR,\n        details: J.LEVEL_SWITCH_ERROR,\n        level: e,\n        fatal: d,\n        error: u,\n        reason: u.message\n      }), d)\n        return;\n      e = Math.min(e, t.length - 1);\n    }\n    const r = this.currentLevelIndex, n = this.currentLevel, i = n ? n.attrs[\"PATHWAY-ID\"] : void 0, o = t[e], a = o.attrs[\"PATHWAY-ID\"];\n    if (this.currentLevelIndex = e, this.currentLevel = o, r === e && n && i === a)\n      return;\n    this.log(`Switching to level ${e} (${o.height ? o.height + \"p \" : \"\"}${o.videoRange ? o.videoRange + \" \" : \"\"}${o.codecSet ? o.codecSet + \" \" : \"\"}@${o.bitrate})${a ? \" with Pathway \" + a : \"\"} from level ${r}${i ? \" with Pathway \" + i : \"\"}`);\n    const l = {\n      level: e,\n      attrs: o.attrs,\n      details: o.details,\n      bitrate: o.bitrate,\n      averageBitrate: o.averageBitrate,\n      maxBitrate: o.maxBitrate,\n      realBitrate: o.realBitrate,\n      width: o.width,\n      height: o.height,\n      codecSet: o.codecSet,\n      audioCodec: o.audioCodec,\n      videoCodec: o.videoCodec,\n      audioGroups: o.audioGroups,\n      subtitleGroups: o.subtitleGroups,\n      loaded: o.loaded,\n      loadError: o.loadError,\n      fragmentError: o.fragmentError,\n      name: o.name,\n      id: o.id,\n      uri: o.uri,\n      url: o.url,\n      urlId: 0,\n      audioGroupIds: o.audioGroupIds,\n      textGroupIds: o.textGroupIds\n    };\n    this.hls.trigger(I.LEVEL_SWITCHING, l);\n    const c = o.details;\n    if (!c || c.live) {\n      const u = this.switchParams(o.uri, n == null ? void 0 : n.details, c);\n      this.loadPlaylist(u);\n    }\n  }\n  get manualLevel() {\n    return this.manualLevelIndex;\n  }\n  set manualLevel(e) {\n    this.manualLevelIndex = e, this._startLevel === void 0 && (this._startLevel = e), e !== -1 && (this.level = e);\n  }\n  get firstLevel() {\n    return this._firstLevel;\n  }\n  set firstLevel(e) {\n    this._firstLevel = e;\n  }\n  get startLevel() {\n    if (this._startLevel === void 0) {\n      const e = this.hls.config.startLevel;\n      return e !== void 0 ? e : this.hls.firstAutoLevel;\n    }\n    return this._startLevel;\n  }\n  set startLevel(e) {\n    this._startLevel = e;\n  }\n  get pathways() {\n    return this.steering ? this.steering.pathways() : [];\n  }\n  get pathwayPriority() {\n    return this.steering ? this.steering.pathwayPriority : null;\n  }\n  set pathwayPriority(e) {\n    if (this.steering) {\n      const t = this.steering.pathways(), r = e.filter((n) => t.indexOf(n) !== -1);\n      if (e.length < 1) {\n        this.warn(`pathwayPriority ${e} should contain at least one pathway from list: ${t}`);\n        return;\n      }\n      this.steering.pathwayPriority = r;\n    }\n  }\n  onError(e, t) {\n    t.fatal || !t.context || t.context.type === Ke.LEVEL && t.context.level === this.level && this.checkRetry(t);\n  }\n  // reset errors on the successful load of a fragment\n  onFragBuffered(e, {\n    frag: t\n  }) {\n    if (t !== void 0 && t.type === pe.MAIN) {\n      const r = t.elementaryStreams;\n      if (!Object.keys(r).some((i) => !!r[i]))\n        return;\n      const n = this._levels[t.level];\n      n != null && n.loadError && (this.log(`Resetting level error count of ${n.loadError} on frag buffered`), n.loadError = 0);\n    }\n  }\n  onLevelLoaded(e, t) {\n    var r;\n    const {\n      level: n,\n      details: i\n    } = t, o = t.levelInfo;\n    if (!o) {\n      var a;\n      this.warn(`Invalid level index ${n}`), (a = t.deliveryDirectives) != null && a.skip && (i.deltaUpdateFailed = !0);\n      return;\n    }\n    if (o === this.currentLevel || t.withoutMultiVariant) {\n      o.fragmentError === 0 && (o.loadError = 0);\n      let l = o.details;\n      l === t.details && l.advanced && (l = void 0), this.playlistLoaded(n, t, l);\n    } else (r = t.deliveryDirectives) != null && r.skip && (i.deltaUpdateFailed = !0);\n  }\n  loadPlaylist(e) {\n    super.loadPlaylist(), this.shouldLoadPlaylist(this.currentLevel) && this.scheduleLoading(this.currentLevel, e);\n  }\n  loadingPlaylist(e, t) {\n    super.loadingPlaylist(e, t);\n    const r = this.getUrlWithDirectives(e.uri, t), n = this.currentLevelIndex, i = e.attrs[\"PATHWAY-ID\"], o = e.details, a = o == null ? void 0 : o.age;\n    this.log(`Loading level index ${n}${(t == null ? void 0 : t.msn) !== void 0 ? \" at sn \" + t.msn + \" part \" + t.part : \"\"}${i ? \" Pathway \" + i : \"\"}${a && o.live ? \" age \" + a.toFixed(1) + (o.type && \" \" + o.type || \"\") : \"\"} ${r}`), this.hls.trigger(I.LEVEL_LOADING, {\n      url: r,\n      level: n,\n      levelInfo: e,\n      pathwayId: e.attrs[\"PATHWAY-ID\"],\n      id: 0,\n      // Deprecated Level urlId\n      deliveryDirectives: t || null\n    });\n  }\n  get nextLoadLevel() {\n    return this.manualLevelIndex !== -1 ? this.manualLevelIndex : this.hls.nextAutoLevel;\n  }\n  set nextLoadLevel(e) {\n    this.level = e, this.manualLevelIndex === -1 && (this.hls.nextAutoLevel = e);\n  }\n  removeLevel(e) {\n    var t;\n    if (this._levels.length === 1)\n      return;\n    const r = this._levels.filter((i, o) => o !== e ? !0 : (this.steering && this.steering.removeLevel(i), i === this.currentLevel && (this.currentLevel = null, this.currentLevelIndex = -1, i.details && i.details.fragments.forEach((a) => a.level = -1)), !1));\n    rp(r), this._levels = r, this.currentLevelIndex > -1 && (t = this.currentLevel) != null && t.details && (this.currentLevelIndex = this.currentLevel.details.fragments[0].level), this.manualLevelIndex > -1 && (this.manualLevelIndex = this.currentLevelIndex);\n    const n = r.length - 1;\n    this._firstLevel = Math.min(this._firstLevel, n), this._startLevel && (this._startLevel = Math.min(this._startLevel, n)), this.hls.trigger(I.LEVELS_UPDATED, {\n      levels: r\n    });\n  }\n  onLevelsUpdated(e, {\n    levels: t\n  }) {\n    this._levels = t;\n  }\n  checkMaxAutoUpdated() {\n    const {\n      autoLevelCapping: e,\n      maxAutoLevel: t,\n      maxHdcpLevel: r\n    } = this.hls;\n    this._maxAutoLevel !== t && (this._maxAutoLevel = t, this.hls.trigger(I.MAX_AUTO_LEVEL_UPDATED, {\n      autoLevelCapping: e,\n      levels: this.levels,\n      maxAutoLevel: t,\n      minAutoLevel: this.hls.minAutoLevel,\n      maxHdcpLevel: r\n    }));\n  }\n}\nfunction df(s) {\n  const e = {};\n  s.forEach((t) => {\n    const r = t.groupId || \"\";\n    t.id = e[r] = e[r] || 0, e[r]++;\n  });\n}\nfunction Xp() {\n  return self.SourceBuffer || self.WebKitSourceBuffer;\n}\nfunction Jp() {\n  if (!Ms())\n    return !1;\n  const e = Xp();\n  return !e || e.prototype && typeof e.prototype.appendBuffer == \"function\" && typeof e.prototype.remove == \"function\";\n}\nfunction vA() {\n  if (!Jp())\n    return !1;\n  const s = Ms();\n  return typeof (s == null ? void 0 : s.isTypeSupported) == \"function\" && ([\"avc1.42E01E,mp4a.40.2\", \"av01.0.01M.08\", \"vp09.00.50.08\"].some((e) => s.isTypeSupported(pi(e, \"video\"))) || [\"mp4a.40.2\", \"fLaC\"].some((e) => s.isTypeSupported(pi(e, \"audio\"))));\n}\nfunction EA() {\n  var s;\n  const e = Xp();\n  return typeof (e == null || (s = e.prototype) == null ? void 0 : s.changeType) == \"function\";\n}\nconst xA = 100;\nclass SA extends Tu {\n  constructor(e, t, r) {\n    super(e, t, r, \"stream-controller\", pe.MAIN), this.audioCodecSwap = !1, this.level = -1, this._forceStartLoad = !1, this._hasEnoughToStart = !1, this.altAudio = 0, this.audioOnly = !1, this.fragPlaying = null, this.fragLastKbps = 0, this.couldBacktrack = !1, this.backtrackFragment = null, this.audioCodecSwitch = !1, this.videoBuffer = null, this.onMediaPlaying = () => {\n      this.tick();\n    }, this.onMediaSeeked = () => {\n      const n = this.media, i = n ? n.currentTime : null;\n      if (i === null || !ue(i) || (this.log(`Media seeked to ${i.toFixed(3)}`), !this.getBufferedFrag(i)))\n        return;\n      const o = this.getFwdBufferInfoAtPos(n, i, pe.MAIN, 0);\n      if (o === null || o.len === 0) {\n        this.warn(`Main forward buffer length at ${i} on \"seeked\" event ${o ? o.len : \"empty\"})`);\n        return;\n      }\n      this.tick();\n    }, this.registerListeners();\n  }\n  registerListeners() {\n    super.registerListeners();\n    const {\n      hls: e\n    } = this;\n    e.on(I.MANIFEST_PARSED, this.onManifestParsed, this), e.on(I.LEVEL_LOADING, this.onLevelLoading, this), e.on(I.LEVEL_LOADED, this.onLevelLoaded, this), e.on(I.FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, this), e.on(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.on(I.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this), e.on(I.BUFFER_CREATED, this.onBufferCreated, this), e.on(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.on(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.on(I.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n  unregisterListeners() {\n    super.unregisterListeners();\n    const {\n      hls: e\n    } = this;\n    e.off(I.MANIFEST_PARSED, this.onManifestParsed, this), e.off(I.LEVEL_LOADED, this.onLevelLoaded, this), e.off(I.FRAG_LOAD_EMERGENCY_ABORTED, this.onFragLoadEmergencyAborted, this), e.off(I.AUDIO_TRACK_SWITCHING, this.onAudioTrackSwitching, this), e.off(I.AUDIO_TRACK_SWITCHED, this.onAudioTrackSwitched, this), e.off(I.BUFFER_CREATED, this.onBufferCreated, this), e.off(I.BUFFER_FLUSHED, this.onBufferFlushed, this), e.off(I.LEVELS_UPDATED, this.onLevelsUpdated, this), e.off(I.FRAG_BUFFERED, this.onFragBuffered, this);\n  }\n  onHandlerDestroying() {\n    this.onMediaPlaying = this.onMediaSeeked = null, this.unregisterListeners(), super.onHandlerDestroying();\n  }\n  startLoad(e, t) {\n    if (this.levels) {\n      const {\n        lastCurrentTime: r,\n        hls: n\n      } = this;\n      if (this.stopLoad(), this.setInterval(xA), this.level = -1, !this.startFragRequested) {\n        let i = n.startLevel;\n        i === -1 && (n.config.testBandwidth && this.levels.length > 1 ? (i = 0, this.bitrateTest = !0) : i = n.firstAutoLevel), n.nextLoadLevel = i, this.level = n.loadLevel, this._hasEnoughToStart = !!t;\n      }\n      r > 0 && e === -1 && !t && (this.log(`Override startPosition with lastCurrentTime @${r.toFixed(3)}`), e = r), this.state = ne.IDLE, this.nextLoadPosition = this.lastCurrentTime = e + this.timelineOffset, this.startPosition = t ? -1 : e, this.tick();\n    } else\n      this._forceStartLoad = !0, this.state = ne.STOPPED;\n  }\n  stopLoad() {\n    this._forceStartLoad = !1, super.stopLoad();\n  }\n  doTick() {\n    switch (this.state) {\n      case ne.WAITING_LEVEL: {\n        const {\n          levels: e,\n          level: t\n        } = this, r = e == null ? void 0 : e[t], n = r == null ? void 0 : r.details;\n        if (n && (!n.live || this.levelLastLoaded === r && !this.waitForLive(r))) {\n          if (this.waitForCdnTuneIn(n))\n            break;\n          this.state = ne.IDLE;\n          break;\n        } else if (this.hls.nextLoadLevel !== this.level) {\n          this.state = ne.IDLE;\n          break;\n        }\n        break;\n      }\n      case ne.FRAG_LOADING_WAITING_RETRY:\n        this.checkRetryDate();\n        break;\n    }\n    this.state === ne.IDLE && this.doTickIdle(), this.onTickEnd();\n  }\n  onTickEnd() {\n    var e;\n    super.onTickEnd(), (e = this.media) != null && e.readyState && this.media.seeking === !1 && (this.lastCurrentTime = this.media.currentTime), this.checkFragmentChanged();\n  }\n  doTickIdle() {\n    const {\n      hls: e,\n      levelLastLoaded: t,\n      levels: r,\n      media: n\n    } = this;\n    if (t === null || !n && !this.primaryPrefetch && (this.startFragRequested || !e.config.startFragPrefetch) || this.altAudio && this.audioOnly)\n      return;\n    const i = this.buffering ? e.nextLoadLevel : e.loadLevel;\n    if (!(r != null && r[i]))\n      return;\n    const o = r[i], a = this.getMainFwdBufferInfo();\n    if (a === null)\n      return;\n    const l = this.getLevelDetails();\n    if (l && this._streamEnded(a, l)) {\n      const y = {};\n      this.altAudio === 2 && (y.type = \"video\"), this.hls.trigger(I.BUFFER_EOS, y), this.state = ne.ENDED;\n      return;\n    }\n    if (!this.buffering)\n      return;\n    e.loadLevel !== i && e.manualLevel === -1 && this.log(`Adapting to level ${i} from level ${this.level}`), this.level = e.nextLoadLevel = i;\n    const c = o.details;\n    if (!c || this.state === ne.WAITING_LEVEL || this.waitForLive(o)) {\n      this.level = i, this.state = ne.WAITING_LEVEL, this.startFragRequested = !1;\n      return;\n    }\n    const u = a.len, d = this.getMaxBufferLength(o.maxBitrate);\n    if (u >= d)\n      return;\n    this.backtrackFragment && this.backtrackFragment.start > a.end && (this.backtrackFragment = null);\n    const h = this.backtrackFragment ? this.backtrackFragment.start : a.end;\n    let f = this.getNextFragment(h, c);\n    if (this.couldBacktrack && !this.fragPrevious && f && Vt(f) && this.fragmentTracker.getState(f) !== Ht.OK) {\n      var p;\n      const E = ((p = this.backtrackFragment) != null ? p : f).sn - c.startSN, b = c.fragments[E - 1];\n      b && f.cc === b.cc && (f = b, this.fragmentTracker.removeFragment(b));\n    } else this.backtrackFragment && a.len && (this.backtrackFragment = null);\n    if (f && this.isLoopLoading(f, h)) {\n      if (!f.gap) {\n        const E = this.audioOnly && !this.altAudio ? ot.AUDIO : ot.VIDEO, b = (E === ot.VIDEO ? this.videoBuffer : this.mediaBuffer) || this.media;\n        b && this.afterBufferFlushed(b, E, pe.MAIN);\n      }\n      f = this.getNextFragmentLoopLoading(f, c, a, pe.MAIN, d);\n    }\n    f && (f.initSegment && !f.initSegment.data && !this.bitrateTest && (f = f.initSegment), this.loadFragment(f, o, h));\n  }\n  loadFragment(e, t, r) {\n    const n = this.fragmentTracker.getState(e);\n    n === Ht.NOT_LOADED || n === Ht.PARTIAL ? Vt(e) ? this.bitrateTest ? (this.log(`Fragment ${e.sn} of level ${e.level} is being downloaded to test bitrate and will not be buffered`), this._loadBitrateTestFrag(e, t)) : super.loadFragment(e, t, r) : this._loadInitSegment(e, t) : this.clearTrackerIfNeeded(e);\n  }\n  getBufferedFrag(e) {\n    return this.fragmentTracker.getBufferedFrag(e, pe.MAIN);\n  }\n  followingBufferedFrag(e) {\n    return e ? this.getBufferedFrag(e.end + 0.5) : null;\n  }\n  /*\n    on immediate level switch :\n     - pause playback if playing\n     - cancel any pending load request\n     - and trigger a buffer flush\n  */\n  immediateLevelSwitch() {\n    this.abortCurrentFrag(), this.flushMainBuffer(0, Number.POSITIVE_INFINITY);\n  }\n  /**\n   * try to switch ASAP without breaking video playback:\n   * in order to ensure smooth but quick level switching,\n   * we need to find the next flushable buffer range\n   * we should take into account new segment fetch time\n   */\n  nextLevelSwitch() {\n    const {\n      levels: e,\n      media: t\n    } = this;\n    if (t != null && t.readyState) {\n      let r;\n      const n = this.getAppendedFrag(t.currentTime);\n      n && n.start > 1 && this.flushMainBuffer(0, n.start - 1);\n      const i = this.getLevelDetails();\n      if (i != null && i.live) {\n        const a = this.getMainFwdBufferInfo();\n        if (!a || a.len < i.targetduration * 2)\n          return;\n      }\n      if (!t.paused && e) {\n        const a = this.hls.nextLoadLevel, l = e[a], c = this.fragLastKbps;\n        c && this.fragCurrent ? r = this.fragCurrent.duration * l.maxBitrate / (1e3 * c) + 1 : r = 0;\n      } else\n        r = 0;\n      const o = this.getBufferedFrag(t.currentTime + r);\n      if (o) {\n        const a = this.followingBufferedFrag(o);\n        if (a) {\n          this.abortCurrentFrag();\n          const l = a.maxStartPTS ? a.maxStartPTS : a.start, c = a.duration, u = Math.max(o.end, l + Math.min(Math.max(c - this.config.maxFragLookUpTolerance, c * (this.couldBacktrack ? 0.5 : 0.125)), c * (this.couldBacktrack ? 0.75 : 0.25)));\n          this.flushMainBuffer(u, Number.POSITIVE_INFINITY);\n        }\n      }\n    }\n  }\n  abortCurrentFrag() {\n    const e = this.fragCurrent;\n    switch (this.fragCurrent = null, this.backtrackFragment = null, e && (e.abortRequests(), this.fragmentTracker.removeFragment(e)), this.state) {\n      case ne.KEY_LOADING:\n      case ne.FRAG_LOADING:\n      case ne.FRAG_LOADING_WAITING_RETRY:\n      case ne.PARSING:\n      case ne.PARSED:\n        this.state = ne.IDLE;\n        break;\n    }\n    this.nextLoadPosition = this.getLoadPosition();\n  }\n  flushMainBuffer(e, t) {\n    super.flushMainBuffer(e, t, this.altAudio === 2 ? \"video\" : null);\n  }\n  onMediaAttached(e, t) {\n    super.onMediaAttached(e, t);\n    const r = t.media;\n    cr(r, \"playing\", this.onMediaPlaying), cr(r, \"seeked\", this.onMediaSeeked);\n  }\n  onMediaDetaching(e, t) {\n    const {\n      media: r\n    } = this;\n    r && (pr(r, \"playing\", this.onMediaPlaying), pr(r, \"seeked\", this.onMediaSeeked)), this.videoBuffer = null, this.fragPlaying = null, super.onMediaDetaching(e, t), !t.transferMedia && (this._hasEnoughToStart = !1);\n  }\n  onManifestLoading() {\n    super.onManifestLoading(), this.log(\"Trigger BUFFER_RESET\"), this.hls.trigger(I.BUFFER_RESET, void 0), this.couldBacktrack = !1, this.fragLastKbps = 0, this.fragPlaying = this.backtrackFragment = null, this.altAudio = 0, this.audioOnly = !1;\n  }\n  onManifestParsed(e, t) {\n    let r = !1, n = !1;\n    for (let i = 0; i < t.levels.length; i++) {\n      const o = t.levels[i].audioCodec;\n      o && (r = r || o.indexOf(\"mp4a.40.2\") !== -1, n = n || o.indexOf(\"mp4a.40.5\") !== -1);\n    }\n    this.audioCodecSwitch = r && n && !EA(), this.audioCodecSwitch && this.log(\"Both AAC/HE-AAC audio found in levels; declaring level codec as HE-AAC\"), this.levels = t.levels, this.startFragRequested = !1;\n  }\n  onLevelLoading(e, t) {\n    const {\n      levels: r\n    } = this;\n    if (!r || this.state !== ne.IDLE)\n      return;\n    const n = t.levelInfo;\n    (!n.details || n.details.live && (this.levelLastLoaded !== n || n.details.expired) || this.waitForCdnTuneIn(n.details)) && (this.state = ne.WAITING_LEVEL);\n  }\n  onLevelLoaded(e, t) {\n    var r;\n    const {\n      levels: n,\n      startFragRequested: i\n    } = this, o = t.level, a = t.details, l = a.totalduration;\n    if (!n) {\n      this.warn(`Levels were reset while loading level ${o}`);\n      return;\n    }\n    this.log(`Level ${o} loaded [${a.startSN},${a.endSN}]${a.lastPartSn ? `[part-${a.lastPartSn}-${a.lastPartIndex}]` : \"\"}, cc [${a.startCC}, ${a.endCC}] duration:${l}`);\n    const c = t.levelInfo, u = this.fragCurrent;\n    u && (this.state === ne.FRAG_LOADING || this.state === ne.FRAG_LOADING_WAITING_RETRY) && u.level !== t.level && u.loader && this.abortCurrentFrag();\n    let d = 0;\n    if (a.live || (r = c.details) != null && r.live) {\n      var h;\n      if (this.checkLiveUpdate(a), a.deltaUpdateFailed)\n        return;\n      d = this.alignPlaylists(a, c.details, (h = this.levelLastLoaded) == null ? void 0 : h.details);\n    }\n    if (c.details = a, this.levelLastLoaded = c, i || this.setStartPosition(a, d), this.hls.trigger(I.LEVEL_UPDATED, {\n      details: a,\n      level: o\n    }), this.state === ne.WAITING_LEVEL) {\n      if (this.waitForCdnTuneIn(a))\n        return;\n      this.state = ne.IDLE;\n    }\n    i && a.live && this.synchronizeToLiveEdge(a), this.tick();\n  }\n  synchronizeToLiveEdge(e) {\n    const {\n      config: t,\n      media: r\n    } = this;\n    if (!r)\n      return;\n    const n = this.hls.liveSyncPosition, i = this.getLoadPosition(), o = e.fragmentStart, a = e.edge, l = i >= o - t.maxFragLookUpTolerance && i <= a;\n    if (n !== null && r.duration > n && (i < n || !l)) {\n      const u = t.liveMaxLatencyDuration !== void 0 ? t.liveMaxLatencyDuration : t.liveMaxLatencyDurationCount * e.targetduration;\n      if ((!l && r.readyState < 4 || i < a - u) && (this._hasEnoughToStart || (this.nextLoadPosition = n), r.readyState))\n        if (this.warn(`Playback: ${i.toFixed(3)} is located too far from the end of live sliding playlist: ${a}, reset currentTime to : ${n.toFixed(3)}`), this.config.liveSyncMode === \"buffered\") {\n          var c;\n          const d = Ce.bufferInfo(r, n, 0);\n          if (!((c = d.buffered) != null && c.length)) {\n            r.currentTime = n;\n            return;\n          }\n          if (d.start <= i) {\n            r.currentTime = n;\n            return;\n          }\n          const {\n            nextStart: f\n          } = Ce.bufferedInfo(d.buffered, i, 0);\n          f && (r.currentTime = f);\n        } else\n          r.currentTime = n;\n    }\n  }\n  _handleFragmentLoadProgress(e) {\n    var t;\n    const r = e.frag, {\n      part: n,\n      payload: i\n    } = e, {\n      levels: o\n    } = this;\n    if (!o) {\n      this.warn(`Levels were reset while fragment load was in progress. Fragment ${r.sn} of level ${r.level} will not be buffered`);\n      return;\n    }\n    const a = o[r.level];\n    if (!a) {\n      this.warn(`Level ${r.level} not found on progress`);\n      return;\n    }\n    const l = a.details;\n    if (!l) {\n      this.warn(`Dropping fragment ${r.sn} of level ${r.level} after level details were reset`), this.fragmentTracker.removeFragment(r);\n      return;\n    }\n    const c = a.videoCodec, u = l.PTSKnown || !l.live, d = (t = r.initSegment) == null ? void 0 : t.data, h = this._getAudioCodec(a), f = this.transmuxer = this.transmuxer || new wp(this.hls, pe.MAIN, this._handleTransmuxComplete.bind(this), this._handleTransmuxerFlush.bind(this)), p = n ? n.index : -1, y = p !== -1, E = new Eu(r.level, r.sn, r.stats.chunkCount, i.byteLength, p, y), b = this.initPTS[r.cc];\n    f.push(i, d, h, c, r, n, l.totalduration, u, E, b);\n  }\n  onAudioTrackSwitching(e, t) {\n    const r = this.hls, n = this.altAudio === 2;\n    if (Qo(t.url, r))\n      this.altAudio = 1;\n    else {\n      if (this.mediaBuffer !== this.media) {\n        this.log(\"Switching on main audio, use media.buffered to schedule main fragment loading\"), this.mediaBuffer = this.media;\n        const o = this.fragCurrent;\n        o && (this.log(\"Switching to main audio track, cancel main fragment load\"), o.abortRequests(), this.fragmentTracker.removeFragment(o)), this.resetTransmuxer(), this.resetLoadingState();\n      } else this.audioOnly && this.resetTransmuxer();\n      if (n) {\n        this.fragmentTracker.removeAllFragments(), r.once(I.BUFFER_FLUSHED, () => {\n          this.hls && this.hls.trigger(I.AUDIO_TRACK_SWITCHED, t);\n        }), r.trigger(I.BUFFER_FLUSHING, {\n          startOffset: 0,\n          endOffset: Number.POSITIVE_INFINITY,\n          type: null\n        });\n        return;\n      }\n      r.trigger(I.AUDIO_TRACK_SWITCHED, t);\n    }\n  }\n  onAudioTrackSwitched(e, t) {\n    const r = Qo(t.url, this.hls);\n    if (r) {\n      const n = this.videoBuffer;\n      n && this.mediaBuffer !== n && (this.log(\"Switching on alternate audio, use video.buffered to schedule main fragment loading\"), this.mediaBuffer = n);\n    }\n    this.altAudio = r ? 2 : 0, this.tick();\n  }\n  onBufferCreated(e, t) {\n    const r = t.tracks;\n    let n, i, o = !1;\n    for (const a in r) {\n      const l = r[a];\n      if (l.id === \"main\") {\n        if (i = a, n = l, a === \"video\") {\n          const c = r[a];\n          c && (this.videoBuffer = c.buffer);\n        }\n      } else\n        o = !0;\n    }\n    o && n ? (this.log(`Alternate track found, use ${i}.buffered to schedule main fragment loading`), this.mediaBuffer = n.buffer) : this.mediaBuffer = this.media;\n  }\n  onFragBuffered(e, t) {\n    const {\n      frag: r,\n      part: n\n    } = t, i = r.type === pe.MAIN;\n    if (i) {\n      if (this.fragContextChanged(r)) {\n        this.warn(`Fragment ${r.sn}${n ? \" p: \" + n.index : \"\"} of level ${r.level} finished buffering, but was aborted. state: ${this.state}`), this.state === ne.PARSED && (this.state = ne.IDLE);\n        return;\n      }\n      const a = n ? n.stats : r.stats;\n      this.fragLastKbps = Math.round(8 * a.total / (a.buffering.end - a.loading.first)), Vt(r) && (this.fragPrevious = r), this.fragBufferedComplete(r, n);\n    }\n    const o = this.media;\n    o && (!this._hasEnoughToStart && Ce.getBuffered(o).length && (this._hasEnoughToStart = !0, this.seekToStartPos()), i && this.tick());\n  }\n  get hasEnoughToStart() {\n    return this._hasEnoughToStart;\n  }\n  onError(e, t) {\n    var r;\n    if (t.fatal) {\n      this.state = ne.ERROR;\n      return;\n    }\n    switch (t.details) {\n      case J.FRAG_GAP:\n      case J.FRAG_PARSING_ERROR:\n      case J.FRAG_DECRYPT_ERROR:\n      case J.FRAG_LOAD_ERROR:\n      case J.FRAG_LOAD_TIMEOUT:\n      case J.KEY_LOAD_ERROR:\n      case J.KEY_LOAD_TIMEOUT:\n        this.onFragmentOrKeyLoadError(pe.MAIN, t);\n        break;\n      case J.LEVEL_LOAD_ERROR:\n      case J.LEVEL_LOAD_TIMEOUT:\n      case J.LEVEL_PARSING_ERROR:\n        !t.levelRetry && this.state === ne.WAITING_LEVEL && ((r = t.context) == null ? void 0 : r.type) === Ke.LEVEL && (this.state = ne.IDLE);\n        break;\n      case J.BUFFER_ADD_CODEC_ERROR:\n      case J.BUFFER_APPEND_ERROR:\n        if (t.parent !== \"main\")\n          return;\n        this.reduceLengthAndFlushBuffer(t) && this.resetLoadingState();\n        break;\n      case J.BUFFER_FULL_ERROR:\n        if (t.parent !== \"main\")\n          return;\n        this.reduceLengthAndFlushBuffer(t) && (!this.config.interstitialsController && this.config.assetPlayerId ? this._hasEnoughToStart = !0 : this.flushMainBuffer(0, Number.POSITIVE_INFINITY));\n        break;\n      case J.INTERNAL_EXCEPTION:\n        this.recoverWorkerError(t);\n        break;\n    }\n  }\n  onFragLoadEmergencyAborted() {\n    this.state = ne.IDLE, this._hasEnoughToStart || (this.startFragRequested = !1, this.nextLoadPosition = this.lastCurrentTime), this.tickImmediate();\n  }\n  onBufferFlushed(e, {\n    type: t\n  }) {\n    if (t !== ot.AUDIO || !this.altAudio) {\n      const r = (t === ot.VIDEO ? this.videoBuffer : this.mediaBuffer) || this.media;\n      r && (this.afterBufferFlushed(r, t, pe.MAIN), this.tick());\n    }\n  }\n  onLevelsUpdated(e, t) {\n    this.level > -1 && this.fragCurrent && (this.level = this.fragCurrent.level, this.level === -1 && this.resetWhenMissingContext(this.fragCurrent)), this.levels = t.levels;\n  }\n  swapAudioCodec() {\n    this.audioCodecSwap = !this.audioCodecSwap;\n  }\n  /**\n   * Seeks to the set startPosition if not equal to the mediaElement's current time.\n   */\n  seekToStartPos() {\n    const {\n      media: e\n    } = this;\n    if (!e)\n      return;\n    const t = e.currentTime;\n    let r = this.startPosition;\n    if (r >= 0 && t < r) {\n      if (e.seeking) {\n        this.log(`could not seek to ${r}, already seeking at ${t}`);\n        return;\n      }\n      const n = this.timelineOffset;\n      n && r && (r += n);\n      const i = this.getLevelDetails(), o = Ce.getBuffered(e), a = o.length ? o.start(0) : 0, l = a - r, c = Math.max(this.config.maxBufferHole, this.config.maxFragLookUpTolerance);\n      (this.config.startOnSegmentBoundary || l > 0 && (l < c || this.loadingParts && l < 2 * ((i == null ? void 0 : i.partTarget) || 0))) && (this.log(`adjusting start position by ${l} to match buffer start`), r += l, this.startPosition = r), t < r && (this.log(`seek to target start position ${r} from current time ${t} buffer start ${a}`), e.currentTime = r);\n    }\n  }\n  _getAudioCodec(e) {\n    let t = this.config.defaultAudioCodec || e.audioCodec;\n    return this.audioCodecSwap && t && (this.log(\"Swapping audio codec\"), t.indexOf(\"mp4a.40.5\") !== -1 ? t = \"mp4a.40.2\" : t = \"mp4a.40.5\"), t;\n  }\n  _loadBitrateTestFrag(e, t) {\n    e.bitrateTest = !0, this._doFragLoad(e, t).then((r) => {\n      const {\n        hls: n\n      } = this, i = r == null ? void 0 : r.frag;\n      if (!i || this.fragContextChanged(i))\n        return;\n      t.fragmentError = 0, this.state = ne.IDLE, this.startFragRequested = !1, this.bitrateTest = !1;\n      const o = i.stats;\n      o.parsing.start = o.parsing.end = o.buffering.start = o.buffering.end = self.performance.now(), n.trigger(I.FRAG_LOADED, r), i.bitrateTest = !1;\n    }).catch((r) => {\n      this.state === ne.STOPPED || this.state === ne.ERROR || (this.warn(r), this.resetFragmentLoading(e));\n    });\n  }\n  _handleTransmuxComplete(e) {\n    const t = this.playlistType, {\n      hls: r\n    } = this, {\n      remuxResult: n,\n      chunkMeta: i\n    } = e, o = this.getCurrentContext(i);\n    if (!o) {\n      this.resetWhenMissingContext(i);\n      return;\n    }\n    const {\n      frag: a,\n      part: l,\n      level: c\n    } = o, {\n      video: u,\n      text: d,\n      id3: h,\n      initSegment: f\n    } = n, {\n      details: p\n    } = c, y = this.altAudio ? void 0 : n.audio;\n    if (this.fragContextChanged(a)) {\n      this.fragmentTracker.removeFragment(a);\n      return;\n    }\n    if (this.state = ne.PARSING, f) {\n      const E = f.tracks;\n      if (E) {\n        const F = a.initSegment || a;\n        if (this.unhandledEncryptionError(f, a))\n          return;\n        this._bufferInitSegment(c, E, F, i), r.trigger(I.FRAG_PARSING_INIT_SEGMENT, {\n          frag: F,\n          id: t,\n          tracks: E\n        });\n      }\n      const b = f.initPTS, R = f.timescale, A = this.initPTS[a.cc];\n      if (ue(b) && (!A || A.baseTime !== b || A.timescale !== R)) {\n        const F = f.trackId;\n        this.initPTS[a.cc] = {\n          baseTime: b,\n          timescale: R,\n          trackId: F\n        }, r.trigger(I.INIT_PTS_FOUND, {\n          frag: a,\n          id: t,\n          initPTS: b,\n          timescale: R,\n          trackId: F\n        });\n      }\n    }\n    if (u && p) {\n      y && u.type === \"audiovideo\" && this.logMuxedErr(a);\n      const E = p.fragments[a.sn - 1 - p.startSN], b = a.sn === p.startSN, R = !E || a.cc > E.cc;\n      if (n.independent !== !1) {\n        const {\n          startPTS: A,\n          endPTS: F,\n          startDTS: M,\n          endDTS: H\n        } = u;\n        if (l)\n          l.elementaryStreams[u.type] = {\n            startPTS: A,\n            endPTS: F,\n            startDTS: M,\n            endDTS: H\n          };\n        else if (u.firstKeyFrame && u.independent && i.id === 1 && !R && (this.couldBacktrack = !0), u.dropped && u.independent) {\n          const K = this.getMainFwdBufferInfo(), j = (K ? K.end : this.getLoadPosition()) + this.config.maxBufferHole, C = u.firstKeyFramePTS ? u.firstKeyFramePTS : A;\n          if (!b && j < C - this.config.maxBufferHole && !R) {\n            this.backtrack(a);\n            return;\n          } else R && (a.gap = !0);\n          a.setElementaryStreamInfo(u.type, a.start, F, a.start, H, !0);\n        } else b && A - (p.appliedTimelineOffset || 0) > xo && (a.gap = !0);\n        a.setElementaryStreamInfo(u.type, A, F, M, H), this.backtrackFragment && (this.backtrackFragment = a), this.bufferFragmentData(u, a, l, i, b || R);\n      } else if (b || R)\n        a.gap = !0;\n      else {\n        this.backtrack(a);\n        return;\n      }\n    }\n    if (y) {\n      const {\n        startPTS: E,\n        endPTS: b,\n        startDTS: R,\n        endDTS: A\n      } = y;\n      l && (l.elementaryStreams[ot.AUDIO] = {\n        startPTS: E,\n        endPTS: b,\n        startDTS: R,\n        endDTS: A\n      }), a.setElementaryStreamInfo(ot.AUDIO, E, b, R, A), this.bufferFragmentData(y, a, l, i);\n    }\n    if (p && h != null && h.samples.length) {\n      const E = {\n        id: t,\n        frag: a,\n        details: p,\n        samples: h.samples\n      };\n      r.trigger(I.FRAG_PARSING_METADATA, E);\n    }\n    if (p && d) {\n      const E = {\n        id: t,\n        frag: a,\n        details: p,\n        samples: d.samples\n      };\n      r.trigger(I.FRAG_PARSING_USERDATA, E);\n    }\n  }\n  logMuxedErr(e) {\n    this.warn(`${Vt(e) ? \"Media\" : \"Init\"} segment with muxed audiovideo where only video expected: ${e.url}`);\n  }\n  _bufferInitSegment(e, t, r, n) {\n    if (this.state !== ne.PARSING)\n      return;\n    this.audioOnly = !!t.audio && !t.video, this.altAudio && !this.audioOnly && (delete t.audio, t.audiovideo && this.logMuxedErr(r));\n    const {\n      audio: i,\n      video: o,\n      audiovideo: a\n    } = t;\n    if (i) {\n      const c = e.audioCodec;\n      let u = fo(i.codec, c);\n      u === \"mp4a\" && (u = \"mp4a.40.5\");\n      const d = navigator.userAgent.toLowerCase();\n      if (this.audioCodecSwitch) {\n        u && (u.indexOf(\"mp4a.40.5\") !== -1 ? u = \"mp4a.40.2\" : u = \"mp4a.40.5\");\n        const h = i.metadata;\n        h && \"channelCount\" in h && (h.channelCount || 1) !== 1 && d.indexOf(\"firefox\") === -1 && (u = \"mp4a.40.5\");\n      }\n      u && u.indexOf(\"mp4a.40.5\") !== -1 && d.indexOf(\"android\") !== -1 && i.container !== \"audio/mpeg\" && (u = \"mp4a.40.2\", this.log(`Android: force audio codec to ${u}`)), c && c !== u && this.log(`Swapping manifest audio codec \"${c}\" for \"${u}\"`), i.levelCodec = u, i.id = pe.MAIN, this.log(`Init audio buffer, container:${i.container}, codecs[selected/level/parsed]=[${u || \"\"}/${c || \"\"}/${i.codec}]`), delete t.audiovideo;\n    }\n    if (o) {\n      o.levelCodec = e.videoCodec, o.id = pe.MAIN;\n      const c = o.codec;\n      if ((c == null ? void 0 : c.length) === 4)\n        switch (c) {\n          case \"hvc1\":\n          case \"hev1\":\n            o.codec = \"hvc1.1.6.L120.90\";\n            break;\n          case \"av01\":\n            o.codec = \"av01.0.04M.08\";\n            break;\n          case \"avc1\":\n            o.codec = \"avc1.42e01e\";\n            break;\n        }\n      this.log(`Init video buffer, container:${o.container}, codecs[level/parsed]=[${e.videoCodec || \"\"}/${c}]${o.codec !== c ? \" parsed-corrected=\" + o.codec : \"\"}${o.supplemental ? \" supplemental=\" + o.supplemental : \"\"}`), delete t.audiovideo;\n    }\n    a && (this.log(`Init audiovideo buffer, container:${a.container}, codecs[level/parsed]=[${e.codecs}/${a.codec}]`), delete t.video, delete t.audio);\n    const l = Object.keys(t);\n    if (l.length) {\n      if (this.hls.trigger(I.BUFFER_CODECS, t), !this.hls)\n        return;\n      l.forEach((c) => {\n        const d = t[c].initSegment;\n        d != null && d.byteLength && this.hls.trigger(I.BUFFER_APPENDING, {\n          type: c,\n          data: d,\n          frag: r,\n          part: null,\n          chunkMeta: n,\n          parent: r.type\n        });\n      });\n    }\n    this.tickImmediate();\n  }\n  getMainFwdBufferInfo() {\n    const e = this.mediaBuffer && this.altAudio === 2 ? this.mediaBuffer : this.media;\n    return this.getFwdBufferInfo(e, pe.MAIN);\n  }\n  get maxBufferLength() {\n    const {\n      levels: e,\n      level: t\n    } = this, r = e == null ? void 0 : e[t];\n    return r ? this.getMaxBufferLength(r.maxBitrate) : this.config.maxBufferLength;\n  }\n  backtrack(e) {\n    this.couldBacktrack = !0, this.backtrackFragment = e, this.resetTransmuxer(), this.flushBufferGap(e), this.fragmentTracker.removeFragment(e), this.fragPrevious = null, this.nextLoadPosition = e.start, this.state = ne.IDLE;\n  }\n  checkFragmentChanged() {\n    const e = this.media;\n    let t = null;\n    if (e && e.readyState > 1 && e.seeking === !1) {\n      const r = e.currentTime;\n      if (Ce.isBuffered(e, r) ? t = this.getAppendedFrag(r) : Ce.isBuffered(e, r + 0.1) && (t = this.getAppendedFrag(r + 0.1)), t) {\n        this.backtrackFragment = null;\n        const n = this.fragPlaying, i = t.level;\n        (!n || t.sn !== n.sn || n.level !== i) && (this.fragPlaying = t, this.hls.trigger(I.FRAG_CHANGED, {\n          frag: t\n        }), (!n || n.level !== i) && this.hls.trigger(I.LEVEL_SWITCHED, {\n          level: i\n        }));\n      }\n    }\n  }\n  get nextLevel() {\n    const e = this.nextBufferedFrag;\n    return e ? e.level : -1;\n  }\n  get currentFrag() {\n    var e;\n    if (this.fragPlaying)\n      return this.fragPlaying;\n    const t = ((e = this.media) == null ? void 0 : e.currentTime) || this.lastCurrentTime;\n    return ue(t) ? this.getAppendedFrag(t) : null;\n  }\n  get currentProgramDateTime() {\n    var e;\n    const t = ((e = this.media) == null ? void 0 : e.currentTime) || this.lastCurrentTime;\n    if (ue(t)) {\n      const r = this.getLevelDetails(), n = this.currentFrag || (r ? Js(null, r.fragments, t) : null);\n      if (n) {\n        const i = n.programDateTime;\n        if (i !== null) {\n          const o = i + (t - n.start) * 1e3;\n          return new Date(o);\n        }\n      }\n    }\n    return null;\n  }\n  get currentLevel() {\n    const e = this.currentFrag;\n    return e ? e.level : -1;\n  }\n  get nextBufferedFrag() {\n    const e = this.currentFrag;\n    return e ? this.followingBufferedFrag(e) : null;\n  }\n  get forceStartLoad() {\n    return this._forceStartLoad;\n  }\n}\nclass bA extends Lr {\n  constructor(e, t) {\n    super(\"key-loader\", t), this.config = void 0, this.keyIdToKeyInfo = {}, this.emeController = null, this.config = e;\n  }\n  abort(e) {\n    for (const r in this.keyIdToKeyInfo) {\n      const n = this.keyIdToKeyInfo[r].loader;\n      if (n) {\n        var t;\n        if (e && e !== ((t = n.context) == null ? void 0 : t.frag.type))\n          return;\n        n.abort();\n      }\n    }\n  }\n  detach() {\n    for (const e in this.keyIdToKeyInfo) {\n      const t = this.keyIdToKeyInfo[e];\n      (t.mediaKeySessionContext || t.decryptdata.isCommonEncryption) && delete this.keyIdToKeyInfo[e];\n    }\n  }\n  destroy() {\n    this.detach();\n    for (const e in this.keyIdToKeyInfo) {\n      const t = this.keyIdToKeyInfo[e].loader;\n      t && t.destroy();\n    }\n    this.keyIdToKeyInfo = {};\n  }\n  createKeyLoadError(e, t = J.KEY_LOAD_ERROR, r, n, i) {\n    return new as({\n      type: ve.NETWORK_ERROR,\n      details: t,\n      fatal: !1,\n      frag: e,\n      response: i,\n      error: r,\n      networkDetails: n\n    });\n  }\n  loadClear(e, t, r) {\n    if (this.emeController && this.config.emeEnabled && !this.emeController.getSelectedKeySystemFormats().length) {\n      if (t.length)\n        for (let n = 0, i = t.length; n < i; n++) {\n          const o = t[n];\n          if (e.cc <= o.cc && (!Vt(e) || !Vt(o) || e.sn < o.sn) || !r && n == i - 1)\n            return this.emeController.selectKeySystemFormat(o).then((a) => {\n              if (!this.emeController)\n                return;\n              o.setKeyFormat(a);\n              const l = po(a);\n              if (l)\n                return this.emeController.getKeySystemAccess([l]);\n            });\n        }\n      if (this.config.requireKeySystemAccessOnStart) {\n        const n = zn(this.config);\n        if (n.length)\n          return this.emeController.getKeySystemAccess(n);\n      }\n    }\n    return null;\n  }\n  load(e) {\n    return !e.decryptdata && e.encrypted && this.emeController && this.config.emeEnabled ? this.emeController.selectKeySystemFormat(e).then((t) => this.loadInternal(e, t)) : this.loadInternal(e);\n  }\n  loadInternal(e, t) {\n    var r, n;\n    t && e.setKeyFormat(t);\n    const i = e.decryptdata;\n    if (!i) {\n      const c = new Error(t ? `Expected frag.decryptdata to be defined after setting format ${t}` : `Missing decryption data on fragment in onKeyLoading (emeEnabled with controller: ${this.emeController && this.config.emeEnabled})`);\n      return Promise.reject(this.createKeyLoadError(e, J.KEY_LOAD_ERROR, c));\n    }\n    const o = i.uri;\n    if (!o)\n      return Promise.reject(this.createKeyLoadError(e, J.KEY_LOAD_ERROR, new Error(`Invalid key URI: \"${o}\"`)));\n    const a = kl(i);\n    let l = this.keyIdToKeyInfo[a];\n    if ((r = l) != null && r.decryptdata.key)\n      return i.key = l.decryptdata.key, Promise.resolve({\n        frag: e,\n        keyInfo: l\n      });\n    if (this.emeController && (n = l) != null && n.keyLoadPromise)\n      switch (this.emeController.getKeyStatus(l.decryptdata)) {\n        case \"usable\":\n        case \"usable-in-future\":\n          return l.keyLoadPromise.then((u) => {\n            const {\n              keyInfo: d\n            } = u;\n            return i.key = d.decryptdata.key, {\n              frag: e,\n              keyInfo: d\n            };\n          });\n      }\n    switch (this.log(`${this.keyIdToKeyInfo[a] ? \"Rel\" : \"L\"}oading${i.keyId ? \" keyId: \" + fr(i.keyId) : \"\"} URI: ${i.uri} from ${e.type} ${e.level}`), l = this.keyIdToKeyInfo[a] = {\n      decryptdata: i,\n      keyLoadPromise: null,\n      loader: null,\n      mediaKeySessionContext: null\n    }, i.method) {\n      case \"SAMPLE-AES\":\n      case \"SAMPLE-AES-CENC\":\n      case \"SAMPLE-AES-CTR\":\n        return i.keyFormat === \"identity\" ? this.loadKeyHTTP(l, e) : this.loadKeyEME(l, e);\n      case \"AES-128\":\n      case \"AES-256\":\n      case \"AES-256-CTR\":\n        return this.loadKeyHTTP(l, e);\n      default:\n        return Promise.reject(this.createKeyLoadError(e, J.KEY_LOAD_ERROR, new Error(`Key supplied with unsupported METHOD: \"${i.method}\"`)));\n    }\n  }\n  loadKeyEME(e, t) {\n    const r = {\n      frag: t,\n      keyInfo: e\n    };\n    if (this.emeController && this.config.emeEnabled) {\n      const n = this.emeController.loadKey(r);\n      return (e.keyLoadPromise = n.then((i) => (e.mediaKeySessionContext = i, r))).catch((i) => {\n        throw e.keyLoadPromise = null, \"data\" in i && (i.data.frag = t), i;\n      });\n    }\n    return Promise.resolve(r);\n  }\n  loadKeyHTTP(e, t) {\n    const r = this.config, n = r.loader, i = new n(r);\n    return t.keyLoader = e.loader = i, e.keyLoadPromise = new Promise((o, a) => {\n      const l = {\n        keyInfo: e,\n        frag: t,\n        responseType: \"arraybuffer\",\n        url: e.decryptdata.uri\n      }, c = r.keyLoadPolicy.default, u = {\n        loadPolicy: c,\n        timeout: c.maxLoadTimeMs,\n        maxRetry: 0,\n        retryDelay: 0,\n        maxRetryDelay: 0\n      }, d = {\n        onSuccess: (h, f, p, y) => {\n          const {\n            frag: E,\n            keyInfo: b\n          } = p, R = kl(b.decryptdata);\n          if (!E.decryptdata || b !== this.keyIdToKeyInfo[R])\n            return a(this.createKeyLoadError(E, J.KEY_LOAD_ERROR, new Error(\"after key load, decryptdata unset or changed\"), y));\n          b.decryptdata.key = E.decryptdata.key = new Uint8Array(h.data), E.keyLoader = null, b.loader = null, o({\n            frag: E,\n            keyInfo: b\n          });\n        },\n        onError: (h, f, p, y) => {\n          this.resetLoader(f), a(this.createKeyLoadError(t, J.KEY_LOAD_ERROR, new Error(`HTTP Error ${h.code} loading key ${h.text}`), p, tt({\n            url: l.url,\n            data: void 0\n          }, h)));\n        },\n        onTimeout: (h, f, p) => {\n          this.resetLoader(f), a(this.createKeyLoadError(t, J.KEY_LOAD_TIMEOUT, new Error(\"key loading timed out\"), p));\n        },\n        onAbort: (h, f, p) => {\n          this.resetLoader(f), a(this.createKeyLoadError(t, J.INTERNAL_ABORTED, new Error(\"key loading aborted\"), p));\n        }\n      };\n      i.load(l, u, d);\n    });\n  }\n  resetLoader(e) {\n    const {\n      frag: t,\n      keyInfo: r,\n      url: n\n    } = e, i = r.loader;\n    t.keyLoader === i && (t.keyLoader = null, r.loader = null);\n    const o = kl(r.decryptdata) || n;\n    delete this.keyIdToKeyInfo[o], i && i.destroy();\n  }\n}\nfunction kl(s) {\n  if (s.keyFormat !== lr.FAIRPLAY) {\n    const e = s.keyId;\n    if (e)\n      return fr(e);\n  }\n  return s.uri;\n}\nfunction hf(s) {\n  const {\n    type: e\n  } = s;\n  switch (e) {\n    case Ke.AUDIO_TRACK:\n      return pe.AUDIO;\n    case Ke.SUBTITLE_TRACK:\n      return pe.SUBTITLE;\n    default:\n      return pe.MAIN;\n  }\n}\nfunction Dl(s, e) {\n  let t = s.url;\n  return (t === void 0 || t.indexOf(\"data:\") === 0) && (t = e.url), t;\n}\nclass TA {\n  constructor(e) {\n    this.hls = void 0, this.loaders = /* @__PURE__ */ Object.create(null), this.variableList = null, this.onManifestLoaded = this.checkAutostartLoad, this.hls = e, this.registerListeners();\n  }\n  startLoad(e) {\n  }\n  stopLoad() {\n    this.destroyInternalLoaders();\n  }\n  registerListeners() {\n    const {\n      hls: e\n    } = this;\n    e.on(I.MANIFEST_LOADING, this.onManifestLoading, this), e.on(I.LEVEL_LOADING, this.onLevelLoading, this), e.on(I.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this), e.on(I.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this), e.on(I.LEVELS_UPDATED, this.onLevelsUpdated, this);\n  }\n  unregisterListeners() {\n    const {\n      hls: e\n    } = this;\n    e.off(I.MANIFEST_LOADING, this.onManifestLoading, this), e.off(I.LEVEL_LOADING, this.onLevelLoading, this), e.off(I.AUDIO_TRACK_LOADING, this.onAudioTrackLoading, this), e.off(I.SUBTITLE_TRACK_LOADING, this.onSubtitleTrackLoading, this), e.off(I.LEVELS_UPDATED, this.onLevelsUpdated, this);\n  }\n  /**\n   * Returns defaults or configured loader-type overloads (pLoader and loader config params)\n   */\n  createInternalLoader(e) {\n    const t = this.hls.config, r = t.pLoader, n = t.loader, i = r || n, o = new i(t);\n    return this.loaders[e.type] = o, o;\n  }\n  getInternalLoader(e) {\n    return this.loaders[e.type];\n  }\n  resetInternalLoader(e) {\n    this.loaders[e] && delete this.loaders[e];\n  }\n  /**\n   * Call `destroy` on all internal loader instances mapped (one per context type)\n   */\n  destroyInternalLoaders() {\n    for (const e in this.loaders) {\n      const t = this.loaders[e];\n      t && t.destroy(), this.resetInternalLoader(e);\n    }\n  }\n  destroy() {\n    this.variableList = null, this.unregisterListeners(), this.destroyInternalLoaders();\n  }\n  onManifestLoading(e, t) {\n    const {\n      url: r\n    } = t;\n    this.variableList = null, this.load({\n      id: null,\n      level: 0,\n      responseType: \"text\",\n      type: Ke.MANIFEST,\n      url: r,\n      deliveryDirectives: null,\n      levelOrTrack: null\n    });\n  }\n  onLevelLoading(e, t) {\n    const {\n      id: r,\n      level: n,\n      pathwayId: i,\n      url: o,\n      deliveryDirectives: a,\n      levelInfo: l\n    } = t;\n    this.load({\n      id: r,\n      level: n,\n      pathwayId: i,\n      responseType: \"text\",\n      type: Ke.LEVEL,\n      url: o,\n      deliveryDirectives: a,\n      levelOrTrack: l\n    });\n  }\n  onAudioTrackLoading(e, t) {\n    const {\n      id: r,\n      groupId: n,\n      url: i,\n      deliveryDirectives: o,\n      track: a\n    } = t;\n    this.load({\n      id: r,\n      groupId: n,\n      level: null,\n      responseType: \"text\",\n      type: Ke.AUDIO_TRACK,\n      url: i,\n      deliveryDirectives: o,\n      levelOrTrack: a\n    });\n  }\n  onSubtitleTrackLoading(e, t) {\n    const {\n      id: r,\n      groupId: n,\n      url: i,\n      deliveryDirectives: o,\n      track: a\n    } = t;\n    this.load({\n      id: r,\n      groupId: n,\n      level: null,\n      responseType: \"text\",\n      type: Ke.SUBTITLE_TRACK,\n      url: i,\n      deliveryDirectives: o,\n      levelOrTrack: a\n    });\n  }\n  onLevelsUpdated(e, t) {\n    const r = this.loaders[Ke.LEVEL];\n    if (r) {\n      const n = r.context;\n      n && !t.levels.some((i) => i === n.levelOrTrack) && (r.abort(), delete this.loaders[Ke.LEVEL]);\n    }\n  }\n  load(e) {\n    var t;\n    const r = this.hls.config;\n    let n = this.getInternalLoader(e);\n    if (n) {\n      const c = this.hls.logger, u = n.context;\n      if (u && u.levelOrTrack === e.levelOrTrack && (u.url === e.url || u.deliveryDirectives && !e.deliveryDirectives)) {\n        u.url === e.url ? c.log(`[playlist-loader]: ignore ${e.url} ongoing request`) : c.log(`[playlist-loader]: ignore ${e.url} in favor of ${u.url}`);\n        return;\n      }\n      c.log(`[playlist-loader]: aborting previous loader for type: ${e.type}`), n.abort();\n    }\n    let i;\n    if (e.type === Ke.MANIFEST ? i = r.manifestLoadPolicy.default : i = nt({}, r.playlistLoadPolicy.default, {\n      timeoutRetry: null,\n      errorRetry: null\n    }), n = this.createInternalLoader(e), ue((t = e.deliveryDirectives) == null ? void 0 : t.part)) {\n      let c;\n      if (e.type === Ke.LEVEL && e.level !== null ? c = this.hls.levels[e.level].details : e.type === Ke.AUDIO_TRACK && e.id !== null ? c = this.hls.audioTracks[e.id].details : e.type === Ke.SUBTITLE_TRACK && e.id !== null && (c = this.hls.subtitleTracks[e.id].details), c) {\n        const u = c.partTarget, d = c.targetduration;\n        if (u && d) {\n          const h = Math.max(u * 3, d * 0.8) * 1e3;\n          i = nt({}, i, {\n            maxTimeToFirstByteMs: Math.min(h, i.maxTimeToFirstByteMs),\n            maxLoadTimeMs: Math.min(h, i.maxTimeToFirstByteMs)\n          });\n        }\n      }\n    }\n    const o = i.errorRetry || i.timeoutRetry || {}, a = {\n      loadPolicy: i,\n      timeout: i.maxLoadTimeMs,\n      maxRetry: o.maxNumRetry || 0,\n      retryDelay: o.retryDelayMs || 0,\n      maxRetryDelay: o.maxRetryDelayMs || 0\n    }, l = {\n      onSuccess: (c, u, d, h) => {\n        const f = this.getInternalLoader(d);\n        this.resetInternalLoader(d.type);\n        const p = c.data;\n        u.parsing.start = performance.now(), zr.isMediaPlaylist(p) || d.type !== Ke.MANIFEST ? this.handleTrackOrLevelPlaylist(c, u, d, h || null, f) : this.handleMasterPlaylist(c, u, d, h);\n      },\n      onError: (c, u, d, h) => {\n        this.handleNetworkError(u, d, !1, c, h);\n      },\n      onTimeout: (c, u, d) => {\n        this.handleNetworkError(u, d, !0, void 0, c);\n      }\n    };\n    n.load(e, a, l);\n  }\n  checkAutostartLoad() {\n    if (!this.hls)\n      return;\n    const {\n      config: {\n        autoStartLoad: e,\n        startPosition: t\n      },\n      forceStartLoad: r\n    } = this.hls;\n    (e || r) && (this.hls.logger.log(`${e ? \"auto\" : \"force\"} startLoad with configured startPosition ${t}`), this.hls.startLoad(t));\n  }\n  handleMasterPlaylist(e, t, r, n) {\n    const i = this.hls, o = e.data, a = Dl(e, r), l = zr.parseMasterPlaylist(o, a);\n    if (l.playlistParsingError) {\n      t.parsing.end = performance.now(), this.handleManifestParsingError(e, r, l.playlistParsingError, n, t);\n      return;\n    }\n    const {\n      contentSteering: c,\n      levels: u,\n      sessionData: d,\n      sessionKeys: h,\n      startTimeOffset: f,\n      variableList: p\n    } = l;\n    this.variableList = p, u.forEach((R) => {\n      const {\n        unknownCodecs: A\n      } = R;\n      if (A) {\n        const {\n          preferManagedMediaSource: F\n        } = this.hls.config;\n        let {\n          audioCodec: M,\n          videoCodec: H\n        } = R;\n        for (let K = A.length; K--; ) {\n          const j = A[K];\n          gi(j, \"audio\", F) ? (R.audioCodec = M = M ? `${M},${j}` : j, Fn.audio[M.substring(0, 4)] = 2, A.splice(K, 1)) : gi(j, \"video\", F) && (R.videoCodec = H = H ? `${H},${j}` : j, Fn.video[H.substring(0, 4)] = 2, A.splice(K, 1));\n        }\n      }\n    });\n    const {\n      AUDIO: y = [],\n      SUBTITLES: E,\n      \"CLOSED-CAPTIONS\": b\n    } = zr.parseMasterPlaylistMedia(o, a, l);\n    y.length && !y.some((A) => !A.url) && u[0].audioCodec && !u[0].attrs.AUDIO && (this.hls.logger.log(\"[playlist-loader]: audio codec signaled in quality level, but no embedded audio track signaled, create one\"), y.unshift({\n      type: \"main\",\n      name: \"main\",\n      groupId: \"main\",\n      default: !1,\n      autoselect: !1,\n      forced: !1,\n      id: -1,\n      attrs: new gt({}),\n      bitrate: 0,\n      url: \"\"\n    })), i.trigger(I.MANIFEST_LOADED, {\n      levels: u,\n      audioTracks: y,\n      subtitles: E,\n      captions: b,\n      contentSteering: c,\n      url: a,\n      stats: t,\n      networkDetails: n,\n      sessionData: d,\n      sessionKeys: h,\n      startTimeOffset: f,\n      variableList: p\n    });\n  }\n  handleTrackOrLevelPlaylist(e, t, r, n, i) {\n    const o = this.hls, {\n      id: a,\n      level: l,\n      type: c\n    } = r, u = Dl(e, r), d = ue(l) ? l : ue(a) ? a : 0, h = hf(r), f = zr.parseLevelPlaylist(e.data, u, d, h, 0, this.variableList);\n    if (c === Ke.MANIFEST) {\n      const p = {\n        attrs: new gt({}),\n        bitrate: 0,\n        details: f,\n        name: \"\",\n        url: u\n      };\n      f.requestScheduled = t.loading.start + Qg(f, 0), o.trigger(I.MANIFEST_LOADED, {\n        levels: [p],\n        audioTracks: [],\n        url: u,\n        stats: t,\n        networkDetails: n,\n        sessionData: null,\n        sessionKeys: null,\n        contentSteering: null,\n        startTimeOffset: null,\n        variableList: null\n      });\n    }\n    t.parsing.end = performance.now(), r.levelDetails = f, this.handlePlaylistLoaded(f, e, t, r, n, i);\n  }\n  handleManifestParsingError(e, t, r, n, i) {\n    this.hls.trigger(I.ERROR, {\n      type: ve.NETWORK_ERROR,\n      details: J.MANIFEST_PARSING_ERROR,\n      fatal: t.type === Ke.MANIFEST,\n      url: e.url,\n      err: r,\n      error: r,\n      reason: r.message,\n      response: e,\n      context: t,\n      networkDetails: n,\n      stats: i\n    });\n  }\n  handleNetworkError(e, t, r = !1, n, i) {\n    let o = `A network ${r ? \"timeout\" : \"error\" + (n ? \" (status \" + n.code + \")\" : \"\")} occurred while loading ${e.type}`;\n    e.type === Ke.LEVEL ? o += `: ${e.level} id: ${e.id}` : (e.type === Ke.AUDIO_TRACK || e.type === Ke.SUBTITLE_TRACK) && (o += ` id: ${e.id} group-id: \"${e.groupId}\"`);\n    const a = new Error(o);\n    this.hls.logger.warn(`[playlist-loader]: ${o}`);\n    let l = J.UNKNOWN, c = !1;\n    const u = this.getInternalLoader(e);\n    switch (e.type) {\n      case Ke.MANIFEST:\n        l = r ? J.MANIFEST_LOAD_TIMEOUT : J.MANIFEST_LOAD_ERROR, c = !0;\n        break;\n      case Ke.LEVEL:\n        l = r ? J.LEVEL_LOAD_TIMEOUT : J.LEVEL_LOAD_ERROR, c = !1;\n        break;\n      case Ke.AUDIO_TRACK:\n        l = r ? J.AUDIO_TRACK_LOAD_TIMEOUT : J.AUDIO_TRACK_LOAD_ERROR, c = !1;\n        break;\n      case Ke.SUBTITLE_TRACK:\n        l = r ? J.SUBTITLE_TRACK_LOAD_TIMEOUT : J.SUBTITLE_LOAD_ERROR, c = !1;\n        break;\n    }\n    u && this.resetInternalLoader(e.type);\n    const d = {\n      type: ve.NETWORK_ERROR,\n      details: l,\n      fatal: c,\n      url: e.url,\n      loader: u,\n      context: e,\n      error: a,\n      networkDetails: t,\n      stats: i\n    };\n    if (n) {\n      const h = (t == null ? void 0 : t.url) || e.url;\n      d.response = tt({\n        url: h,\n        data: void 0\n      }, n);\n    }\n    this.hls.trigger(I.ERROR, d);\n  }\n  handlePlaylistLoaded(e, t, r, n, i, o) {\n    const a = this.hls, {\n      type: l,\n      level: c,\n      levelOrTrack: u,\n      id: d,\n      groupId: h,\n      deliveryDirectives: f\n    } = n, p = Dl(t, n), y = hf(n);\n    let E = typeof n.level == \"number\" && y === pe.MAIN ? c : void 0;\n    const b = e.playlistParsingError;\n    if (b) {\n      if (this.hls.logger.warn(`${b} ${e.url}`), !a.config.ignorePlaylistParsingErrors) {\n        a.trigger(I.ERROR, {\n          type: ve.NETWORK_ERROR,\n          details: J.LEVEL_PARSING_ERROR,\n          fatal: !1,\n          url: p,\n          error: b,\n          reason: b.message,\n          response: t,\n          context: n,\n          level: E,\n          parent: y,\n          networkDetails: i,\n          stats: r\n        });\n        return;\n      }\n      e.playlistParsingError = null;\n    }\n    if (!e.fragments.length) {\n      const R = e.playlistParsingError = new Error(\"No Segments found in Playlist\");\n      a.trigger(I.ERROR, {\n        type: ve.NETWORK_ERROR,\n        details: J.LEVEL_EMPTY_ERROR,\n        fatal: !1,\n        url: p,\n        error: R,\n        reason: R.message,\n        response: t,\n        context: n,\n        level: E,\n        parent: y,\n        networkDetails: i,\n        stats: r\n      });\n      return;\n    }\n    switch (e.live && o && (o.getCacheAge && (e.ageHeader = o.getCacheAge() || 0), (!o.getCacheAge || isNaN(e.ageHeader)) && (e.ageHeader = 0)), l) {\n      case Ke.MANIFEST:\n      case Ke.LEVEL:\n        if (E) {\n          if (!u)\n            E = 0;\n          else if (u !== a.levels[E]) {\n            const R = a.levels.indexOf(u);\n            R > -1 && (E = R);\n          }\n        }\n        a.trigger(I.LEVEL_LOADED, {\n          details: e,\n          levelInfo: u || a.levels[0],\n          level: E || 0,\n          id: d || 0,\n          stats: r,\n          networkDetails: i,\n          deliveryDirectives: f,\n          withoutMultiVariant: l === Ke.MANIFEST\n        });\n        break;\n      case Ke.AUDIO_TRACK:\n        a.trigger(I.AUDIO_TRACK_LOADED, {\n          details: e,\n          track: u,\n          id: d || 0,\n          groupId: h || \"\",\n          stats: r,\n          networkDetails: i,\n          deliveryDirectives: f\n        });\n        break;\n      case Ke.SUBTITLE_TRACK:\n        a.trigger(I.SUBTITLE_TRACK_LOADED, {\n          details: e,\n          track: u,\n          id: d || 0,\n          groupId: h || \"\",\n          stats: r,\n          networkDetails: i,\n          deliveryDirectives: f\n        });\n        break;\n    }\n  }\n}\nclass Hr {\n  /**\n   * Get the video-dev/hls.js package version.\n   */\n  static get version() {\n    return vi;\n  }\n  /**\n   * Check if the required MediaSource Extensions are available.\n   */\n  static isMSESupported() {\n    return Jp();\n  }\n  /**\n   * Check if MediaSource Extensions are available and isTypeSupported checks pass for any baseline codecs.\n   */\n  static isSupported() {\n    return vA();\n  }\n  /**\n   * Get the MediaSource global used for MSE playback (ManagedMediaSource, MediaSource, or WebKitMediaSource).\n   */\n  static getMediaSource() {\n    return Ms();\n  }\n  static get Events() {\n    return I;\n  }\n  static get MetadataSchema() {\n    return br;\n  }\n  static get ErrorTypes() {\n    return ve;\n  }\n  static get ErrorDetails() {\n    return J;\n  }\n  /**\n   * Get the default configuration applied to new instances.\n   */\n  static get DefaultConfig() {\n    return Hr.defaultConfig ? Hr.defaultConfig : oA;\n  }\n  /**\n   * Replace the default configuration applied to new instances.\n   */\n  static set DefaultConfig(e) {\n    Hr.defaultConfig = e;\n  }\n  /**\n   * Creates an instance of an HLS client that can attach to exactly one `HTMLMediaElement`.\n   * @param userConfig - Configuration options applied over `Hls.DefaultConfig`\n   */\n  constructor(e = {}) {\n    this.config = void 0, this.userConfig = void 0, this.logger = void 0, this.coreComponents = void 0, this.networkControllers = void 0, this._emitter = new wu(), this._autoLevelCapping = -1, this._maxHdcpLevel = null, this.abrController = void 0, this.bufferController = void 0, this.capLevelController = void 0, this.latencyController = void 0, this.levelController = void 0, this.streamController = void 0, this.audioStreamController = void 0, this.subtititleStreamController = void 0, this.audioTrackController = void 0, this.subtitleTrackController = void 0, this.interstitialsController = void 0, this.gapController = void 0, this.emeController = void 0, this.cmcdController = void 0, this._media = null, this._url = null, this._sessionId = void 0, this.triggeringException = void 0, this.started = !1;\n    const t = this.logger = LS(e.debug || !1, \"Hls instance\", e.assetPlayerId), r = this.config = lA(Hr.DefaultConfig, e, t);\n    this.userConfig = e, r.progressive && cA(r, t);\n    const {\n      abrController: n,\n      bufferController: i,\n      capLevelController: o,\n      errorController: a,\n      fpsController: l\n    } = r, c = new a(this), u = this.abrController = new n(this), d = new Tb(this), h = r.interstitialsController, f = h ? this.interstitialsController = new h(this, Hr) : null, p = this.bufferController = new i(this, d), y = this.capLevelController = new o(this), E = new l(this), b = new TA(this), R = r.contentSteeringController, A = R ? new R(this) : null, F = this.levelController = new yA(this, A), M = new pA(this), H = new bA(this.config, this.logger), K = this.streamController = new SA(this, d, H), j = this.gapController = new fA(this, d);\n    y.setStreamController(K), E.setStreamController(K);\n    const C = [b, F, K];\n    f && C.splice(1, 0, f), A && C.splice(1, 0, A), this.networkControllers = C;\n    const k = [u, p, j, y, E, M, d];\n    this.audioTrackController = this.createController(r.audioTrackController, C);\n    const $ = r.audioStreamController;\n    $ && C.push(this.audioStreamController = new $(this, d, H)), this.subtitleTrackController = this.createController(r.subtitleTrackController, C);\n    const W = r.subtitleStreamController;\n    W && C.push(this.subtititleStreamController = new W(this, d, H)), this.createController(r.timelineController, k), H.emeController = this.emeController = this.createController(r.emeController, k), this.cmcdController = this.createController(r.cmcdController, k), this.latencyController = this.createController(mA, k), this.coreComponents = k, C.push(c);\n    const _ = c.onErrorOut;\n    typeof _ == \"function\" && this.on(I.ERROR, _, c), this.on(I.MANIFEST_LOADED, b.onManifestLoaded, b);\n  }\n  createController(e, t) {\n    if (e) {\n      const r = new e(this);\n      return t && t.push(r), r;\n    }\n    return null;\n  }\n  // Delegate the EventEmitter through the public API of Hls.js\n  on(e, t, r = this) {\n    this._emitter.on(e, t, r);\n  }\n  once(e, t, r = this) {\n    this._emitter.once(e, t, r);\n  }\n  removeAllListeners(e) {\n    this._emitter.removeAllListeners(e);\n  }\n  off(e, t, r = this, n) {\n    this._emitter.off(e, t, r, n);\n  }\n  listeners(e) {\n    return this._emitter.listeners(e);\n  }\n  emit(e, t, r) {\n    return this._emitter.emit(e, t, r);\n  }\n  trigger(e, t) {\n    if (this.config.debug)\n      return this.emit(e, e, t);\n    try {\n      return this.emit(e, e, t);\n    } catch (r) {\n      if (this.logger.error(\"An internal error happened while handling event \" + e + '. Error message: \"' + r.message + '\". Here is a stacktrace:', r), !this.triggeringException) {\n        this.triggeringException = !0;\n        const n = e === I.ERROR;\n        this.trigger(I.ERROR, {\n          type: ve.OTHER_ERROR,\n          details: J.INTERNAL_EXCEPTION,\n          fatal: n,\n          event: e,\n          error: r\n        }), this.triggeringException = !1;\n      }\n    }\n    return !1;\n  }\n  listenerCount(e) {\n    return this._emitter.listenerCount(e);\n  }\n  /**\n   * Dispose of the instance\n   */\n  destroy() {\n    this.logger.log(\"destroy\"), this.trigger(I.DESTROYING, void 0), this.detachMedia(), this.removeAllListeners(), this._autoLevelCapping = -1, this._url = null, this.networkControllers.forEach((t) => t.destroy()), this.networkControllers.length = 0, this.coreComponents.forEach((t) => t.destroy()), this.coreComponents.length = 0;\n    const e = this.config;\n    e.xhrSetup = e.fetchSetup = void 0, this.userConfig = null;\n  }\n  /**\n   * Attaches Hls.js to a media element\n   */\n  attachMedia(e) {\n    if (!e || \"media\" in e && !e.media) {\n      const i = new Error(`attachMedia failed: invalid argument (${e})`);\n      this.trigger(I.ERROR, {\n        type: ve.OTHER_ERROR,\n        details: J.ATTACH_MEDIA_ERROR,\n        fatal: !0,\n        error: i\n      });\n      return;\n    }\n    this.logger.log(\"attachMedia\"), this._media && (this.logger.warn(\"media must be detached before attaching\"), this.detachMedia());\n    const t = \"media\" in e, r = t ? e.media : e, n = t ? e : {\n      media: r\n    };\n    this._media = r, this.trigger(I.MEDIA_ATTACHING, n);\n  }\n  /**\n   * Detach Hls.js from the media\n   */\n  detachMedia() {\n    this.logger.log(\"detachMedia\"), this.trigger(I.MEDIA_DETACHING, {}), this._media = null;\n  }\n  /**\n   * Detach HTMLMediaElement, MediaSource, and SourceBuffers without reset, for attaching to another instance\n   */\n  transferMedia() {\n    this._media = null;\n    const e = this.bufferController.transferMedia();\n    return this.trigger(I.MEDIA_DETACHING, {\n      transferMedia: e\n    }), e;\n  }\n  /**\n   * Set the source URL. Can be relative or absolute.\n   */\n  loadSource(e) {\n    this.stopLoad();\n    const t = this.media, r = this._url, n = this._url = hu.buildAbsoluteURL(self.location.href, e, {\n      alwaysNormalize: !0\n    });\n    this._autoLevelCapping = -1, this._maxHdcpLevel = null, this.logger.log(`loadSource:${n}`), t && r && (r !== n || this.bufferController.hasSourceTypes()) && (this.detachMedia(), this.attachMedia(t)), this.trigger(I.MANIFEST_LOADING, {\n      url: e\n    });\n  }\n  /**\n   * Gets the currently loaded URL\n   */\n  get url() {\n    return this._url;\n  }\n  /**\n   * Whether or not enough has been buffered to seek to start position or use `media.currentTime` to determine next load position\n   */\n  get hasEnoughToStart() {\n    return this.streamController.hasEnoughToStart;\n  }\n  /**\n   * Get the startPosition set on startLoad(position) or on autostart with config.startPosition\n   */\n  get startPosition() {\n    return this.streamController.startPositionValue;\n  }\n  /**\n   * Start loading data from the stream source.\n   * Depending on default config, client starts loading automatically when a source is set.\n   *\n   * @param startPosition - Set the start position to stream from.\n   * Defaults to -1 (None: starts from earliest point)\n   */\n  startLoad(e = -1, t) {\n    this.logger.log(`startLoad(${e + (t ? \", <skip seek to start>\" : \"\")})`), this.started = !0, this.resumeBuffering();\n    for (let r = 0; r < this.networkControllers.length && (this.networkControllers[r].startLoad(e, t), !(!this.started || !this.networkControllers)); r++)\n      ;\n  }\n  /**\n   * Stop loading of any stream data.\n   */\n  stopLoad() {\n    this.logger.log(\"stopLoad\"), this.started = !1;\n    for (let e = 0; e < this.networkControllers.length && (this.networkControllers[e].stopLoad(), !(this.started || !this.networkControllers)); e++)\n      ;\n  }\n  /**\n   * Returns whether loading, toggled with `startLoad()` and `stopLoad()`, is active or not`.\n   */\n  get loadingEnabled() {\n    return this.started;\n  }\n  /**\n   * Returns state of fragment loading toggled by calling `pauseBuffering()` and `resumeBuffering()`.\n   */\n  get bufferingEnabled() {\n    return this.streamController.bufferingEnabled;\n  }\n  /**\n   * Resumes stream controller segment loading after `pauseBuffering` has been called.\n   */\n  resumeBuffering() {\n    this.bufferingEnabled || (this.logger.log(\"resume buffering\"), this.networkControllers.forEach((e) => {\n      e.resumeBuffering && e.resumeBuffering();\n    }));\n  }\n  /**\n   * Prevents stream controller from loading new segments until `resumeBuffering` is called.\n   * This allows for media buffering to be paused without interupting playlist loading.\n   */\n  pauseBuffering() {\n    this.bufferingEnabled && (this.logger.log(\"pause buffering\"), this.networkControllers.forEach((e) => {\n      e.pauseBuffering && e.pauseBuffering();\n    }));\n  }\n  get inFlightFragments() {\n    const e = {\n      [pe.MAIN]: this.streamController.inFlightFrag\n    };\n    return this.audioStreamController && (e[pe.AUDIO] = this.audioStreamController.inFlightFrag), this.subtititleStreamController && (e[pe.SUBTITLE] = this.subtititleStreamController.inFlightFrag), e;\n  }\n  /**\n   * Swap through possible audio codecs in the stream (for example to switch from stereo to 5.1)\n   */\n  swapAudioCodec() {\n    this.logger.log(\"swapAudioCodec\"), this.streamController.swapAudioCodec();\n  }\n  /**\n   * When the media-element fails, this allows to detach and then re-attach it\n   * as one call (convenience method).\n   *\n   * Automatic recovery of media-errors by this process is configurable.\n   */\n  recoverMediaError() {\n    this.logger.log(\"recoverMediaError\");\n    const e = this._media, t = e == null ? void 0 : e.currentTime;\n    this.detachMedia(), e && (this.attachMedia(e), t && this.startLoad(t));\n  }\n  removeLevel(e) {\n    this.levelController.removeLevel(e);\n  }\n  /**\n   * @returns a UUID for this player instance\n   */\n  get sessionId() {\n    let e = this._sessionId;\n    return e || (e = this._sessionId = fw()), e;\n  }\n  /**\n   * @returns an array of levels (variants) sorted by HDCP-LEVEL, RESOLUTION (height), FRAME-RATE, CODECS, VIDEO-RANGE, and BANDWIDTH\n   */\n  get levels() {\n    const e = this.levelController.levels;\n    return e || [];\n  }\n  /**\n   * @returns LevelDetails of last loaded level (variant) or `null` prior to loading a media playlist.\n   */\n  get latestLevelDetails() {\n    return this.streamController.getLevelDetails() || null;\n  }\n  /**\n   * @returns Level object of selected level (variant) or `null` prior to selecting a level or once the level is removed.\n   */\n  get loadLevelObj() {\n    return this.levelController.loadLevelObj;\n  }\n  /**\n   * Index of quality level (variant) currently played\n   */\n  get currentLevel() {\n    return this.streamController.currentLevel;\n  }\n  /**\n   * Set quality level index immediately. This will flush the current buffer to replace the quality asap. That means playback will interrupt at least shortly to re-buffer and re-sync eventually. Set to -1 for automatic level selection.\n   */\n  set currentLevel(e) {\n    this.logger.log(`set currentLevel:${e}`), this.levelController.manualLevel = e, this.streamController.immediateLevelSwitch();\n  }\n  /**\n   * Index of next quality level loaded as scheduled by stream controller.\n   */\n  get nextLevel() {\n    return this.streamController.nextLevel;\n  }\n  /**\n   * Set quality level index for next loaded data.\n   * This will switch the video quality asap, without interrupting playback.\n   * May abort current loading of data, and flush parts of buffer (outside currently played fragment region).\n   * @param newLevel - Pass -1 for automatic level selection\n   */\n  set nextLevel(e) {\n    this.logger.log(`set nextLevel:${e}`), this.levelController.manualLevel = e, this.streamController.nextLevelSwitch();\n  }\n  /**\n   * Return the quality level of the currently or last (of none is loaded currently) segment\n   */\n  get loadLevel() {\n    return this.levelController.level;\n  }\n  /**\n   * Set quality level index for next loaded data in a conservative way.\n   * This will switch the quality without flushing, but interrupt current loading.\n   * Thus the moment when the quality switch will appear in effect will only be after the already existing buffer.\n   * @param newLevel - Pass -1 for automatic level selection\n   */\n  set loadLevel(e) {\n    this.logger.log(`set loadLevel:${e}`), this.levelController.manualLevel = e;\n  }\n  /**\n   * get next quality level loaded\n   */\n  get nextLoadLevel() {\n    return this.levelController.nextLoadLevel;\n  }\n  /**\n   * Set quality level of next loaded segment in a fully \"non-destructive\" way.\n   * Same as `loadLevel` but will wait for next switch (until current loading is done).\n   */\n  set nextLoadLevel(e) {\n    this.levelController.nextLoadLevel = e;\n  }\n  /**\n   * Return \"first level\": like a default level, if not set,\n   * falls back to index of first level referenced in manifest\n   */\n  get firstLevel() {\n    return Math.max(this.levelController.firstLevel, this.minAutoLevel);\n  }\n  /**\n   * Sets \"first-level\", see getter.\n   */\n  set firstLevel(e) {\n    this.logger.log(`set firstLevel:${e}`), this.levelController.firstLevel = e;\n  }\n  /**\n   * Return the desired start level for the first fragment that will be loaded.\n   * The default value of -1 indicates automatic start level selection.\n   * Setting hls.nextAutoLevel without setting a startLevel will result in\n   * the nextAutoLevel value being used for one fragment load.\n   */\n  get startLevel() {\n    const e = this.levelController.startLevel;\n    return e === -1 && this.abrController.forcedAutoLevel > -1 ? this.abrController.forcedAutoLevel : e;\n  }\n  /**\n   * set  start level (level of first fragment that will be played back)\n   * if not overrided by user, first level appearing in manifest will be used as start level\n   * if -1 : automatic start level selection, playback will start from level matching download bandwidth\n   * (determined from download of first segment)\n   */\n  set startLevel(e) {\n    this.logger.log(`set startLevel:${e}`), e !== -1 && (e = Math.max(e, this.minAutoLevel)), this.levelController.startLevel = e;\n  }\n  /**\n   * Whether level capping is enabled.\n   * Default value is set via `config.capLevelToPlayerSize`.\n   */\n  get capLevelToPlayerSize() {\n    return this.config.capLevelToPlayerSize;\n  }\n  /**\n   * Enables or disables level capping. If disabled after previously enabled, `nextLevelSwitch` will be immediately called.\n   */\n  set capLevelToPlayerSize(e) {\n    const t = !!e;\n    t !== this.config.capLevelToPlayerSize && (t ? this.capLevelController.startCapping() : (this.capLevelController.stopCapping(), this.autoLevelCapping = -1, this.streamController.nextLevelSwitch()), this.config.capLevelToPlayerSize = t);\n  }\n  /**\n   * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`)\n   */\n  get autoLevelCapping() {\n    return this._autoLevelCapping;\n  }\n  /**\n   * Returns the current bandwidth estimate in bits per second, when available. Otherwise, `NaN` is returned.\n   */\n  get bandwidthEstimate() {\n    const {\n      bwEstimator: e\n    } = this.abrController;\n    return e ? e.getEstimate() : NaN;\n  }\n  set bandwidthEstimate(e) {\n    this.abrController.resetEstimator(e);\n  }\n  get abrEwmaDefaultEstimate() {\n    const {\n      bwEstimator: e\n    } = this.abrController;\n    return e ? e.defaultEstimate : NaN;\n  }\n  /**\n   * get time to first byte estimate\n   * @type {number}\n   */\n  get ttfbEstimate() {\n    const {\n      bwEstimator: e\n    } = this.abrController;\n    return e ? e.getEstimateTTFB() : NaN;\n  }\n  /**\n   * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`)\n   */\n  set autoLevelCapping(e) {\n    this._autoLevelCapping !== e && (this.logger.log(`set autoLevelCapping:${e}`), this._autoLevelCapping = e, this.levelController.checkMaxAutoUpdated());\n  }\n  get maxHdcpLevel() {\n    return this._maxHdcpLevel;\n  }\n  set maxHdcpLevel(e) {\n    ab(e) && this._maxHdcpLevel !== e && (this._maxHdcpLevel = e, this.levelController.checkMaxAutoUpdated());\n  }\n  /**\n   * True when automatic level selection enabled\n   */\n  get autoLevelEnabled() {\n    return this.levelController.manualLevel === -1;\n  }\n  /**\n   * Level set manually (if any)\n   */\n  get manualLevel() {\n    return this.levelController.manualLevel;\n  }\n  /**\n   * min level selectable in auto mode according to config.minAutoBitrate\n   */\n  get minAutoLevel() {\n    const {\n      levels: e,\n      config: {\n        minAutoBitrate: t\n      }\n    } = this;\n    if (!e) return 0;\n    const r = e.length;\n    for (let n = 0; n < r; n++)\n      if (e[n].maxBitrate >= t)\n        return n;\n    return 0;\n  }\n  /**\n   * max level selectable in auto mode according to autoLevelCapping\n   */\n  get maxAutoLevel() {\n    const {\n      levels: e,\n      autoLevelCapping: t,\n      maxHdcpLevel: r\n    } = this;\n    let n;\n    if (t === -1 && e != null && e.length ? n = e.length - 1 : n = t, r)\n      for (let i = n; i--; ) {\n        const o = e[i].attrs[\"HDCP-LEVEL\"];\n        if (o && o <= r)\n          return i;\n      }\n    return n;\n  }\n  get firstAutoLevel() {\n    return this.abrController.firstAutoLevel;\n  }\n  /**\n   * next automatically selected quality level\n   */\n  get nextAutoLevel() {\n    return this.abrController.nextAutoLevel;\n  }\n  /**\n   * this setter is used to force next auto level.\n   * this is useful to force a switch down in auto mode:\n   * in case of load error on level N, hls.js can set nextAutoLevel to N-1 for example)\n   * forced value is valid for one fragment. upon successful frag loading at forced level,\n   * this value will be resetted to -1 by ABR controller.\n   */\n  set nextAutoLevel(e) {\n    this.abrController.nextAutoLevel = e;\n  }\n  /**\n   * get the datetime value relative to media.currentTime for the active level Program Date Time if present\n   */\n  get playingDate() {\n    return this.streamController.currentProgramDateTime;\n  }\n  get mainForwardBufferInfo() {\n    return this.streamController.getMainFwdBufferInfo();\n  }\n  get maxBufferLength() {\n    return this.streamController.maxBufferLength;\n  }\n  /**\n   * Find and select the best matching audio track, making a level switch when a Group change is necessary.\n   * Updates `hls.config.audioPreference`. Returns the selected track, or null when no matching track is found.\n   */\n  setAudioOption(e) {\n    var t;\n    return ((t = this.audioTrackController) == null ? void 0 : t.setAudioOption(e)) || null;\n  }\n  /**\n   * Find and select the best matching subtitle track, making a level switch when a Group change is necessary.\n   * Updates `hls.config.subtitlePreference`. Returns the selected track, or null when no matching track is found.\n   */\n  setSubtitleOption(e) {\n    var t;\n    return ((t = this.subtitleTrackController) == null ? void 0 : t.setSubtitleOption(e)) || null;\n  }\n  /**\n   * Get the complete list of audio tracks across all media groups\n   */\n  get allAudioTracks() {\n    const e = this.audioTrackController;\n    return e ? e.allAudioTracks : [];\n  }\n  /**\n   * Get the list of selectable audio tracks\n   */\n  get audioTracks() {\n    const e = this.audioTrackController;\n    return e ? e.audioTracks : [];\n  }\n  /**\n   * index of the selected audio track (index in audio track lists)\n   */\n  get audioTrack() {\n    const e = this.audioTrackController;\n    return e ? e.audioTrack : -1;\n  }\n  /**\n   * selects an audio track, based on its index in audio track lists\n   */\n  set audioTrack(e) {\n    const t = this.audioTrackController;\n    t && (t.audioTrack = e);\n  }\n  /**\n   * get the complete list of subtitle tracks across all media groups\n   */\n  get allSubtitleTracks() {\n    const e = this.subtitleTrackController;\n    return e ? e.allSubtitleTracks : [];\n  }\n  /**\n   * get alternate subtitle tracks list from playlist\n   */\n  get subtitleTracks() {\n    const e = this.subtitleTrackController;\n    return e ? e.subtitleTracks : [];\n  }\n  /**\n   * index of the selected subtitle track (index in subtitle track lists)\n   */\n  get subtitleTrack() {\n    const e = this.subtitleTrackController;\n    return e ? e.subtitleTrack : -1;\n  }\n  get media() {\n    return this._media;\n  }\n  /**\n   * select an subtitle track, based on its index in subtitle track lists\n   */\n  set subtitleTrack(e) {\n    const t = this.subtitleTrackController;\n    t && (t.subtitleTrack = e);\n  }\n  /**\n   * Whether subtitle display is enabled or not\n   */\n  get subtitleDisplay() {\n    const e = this.subtitleTrackController;\n    return e ? e.subtitleDisplay : !1;\n  }\n  /**\n   * Enable/disable subtitle display rendering\n   */\n  set subtitleDisplay(e) {\n    const t = this.subtitleTrackController;\n    t && (t.subtitleDisplay = e);\n  }\n  /**\n   * get mode for Low-Latency HLS loading\n   */\n  get lowLatencyMode() {\n    return this.config.lowLatencyMode;\n  }\n  /**\n   * Enable/disable Low-Latency HLS part playlist and segment loading, and start live streams at playlist PART-HOLD-BACK rather than HOLD-BACK.\n   */\n  set lowLatencyMode(e) {\n    this.config.lowLatencyMode = e;\n  }\n  /**\n   * Position (in seconds) of live sync point (ie edge of live position minus safety delay defined by ```hls.config.liveSyncDuration```)\n   * @returns null prior to loading live Playlist\n   */\n  get liveSyncPosition() {\n    return this.latencyController.liveSyncPosition;\n  }\n  /**\n   * Estimated position (in seconds) of live edge (ie edge of live playlist plus time sync playlist advanced)\n   * @returns 0 before first playlist is loaded\n   */\n  get latency() {\n    return this.latencyController.latency;\n  }\n  /**\n   * maximum distance from the edge before the player seeks forward to ```hls.liveSyncPosition```\n   * configured using ```liveMaxLatencyDurationCount``` (multiple of target duration) or ```liveMaxLatencyDuration```\n   * @returns 0 before first playlist is loaded\n   */\n  get maxLatency() {\n    return this.latencyController.maxLatency;\n  }\n  /**\n   * target distance from the edge as calculated by the latency controller\n   */\n  get targetLatency() {\n    return this.latencyController.targetLatency;\n  }\n  set targetLatency(e) {\n    this.latencyController.targetLatency = e;\n  }\n  /**\n   * the rate at which the edge of the current live playlist is advancing or 1 if there is none\n   */\n  get drift() {\n    return this.latencyController.drift;\n  }\n  /**\n   * set to true when startLoad is called before MANIFEST_PARSED event\n   */\n  get forceStartLoad() {\n    return this.streamController.forceStartLoad;\n  }\n  /**\n   * ContentSteering pathways getter\n   */\n  get pathways() {\n    return this.levelController.pathways;\n  }\n  /**\n   * ContentSteering pathwayPriority getter/setter\n   */\n  get pathwayPriority() {\n    return this.levelController.pathwayPriority;\n  }\n  set pathwayPriority(e) {\n    this.levelController.pathwayPriority = e;\n  }\n  /**\n   * returns true when all SourceBuffers are buffered to the end\n   */\n  get bufferedToEnd() {\n    var e;\n    return !!((e = this.bufferController) != null && e.bufferedToEnd);\n  }\n  /**\n   * returns Interstitials Program Manager\n   */\n  get interstitialsManager() {\n    var e;\n    return ((e = this.interstitialsController) == null ? void 0 : e.interstitialsManager) || null;\n  }\n  /**\n   * returns mediaCapabilities.decodingInfo for a variant/rendition\n   */\n  getMediaDecodingInfo(e, t = this.allAudioTracks) {\n    const r = $g(t);\n    return Ng(e, r, navigator.mediaCapabilities);\n  }\n}\nHr.defaultConfig = void 0;\nconst on = \"https://sdk-api.neynar.com\", wA = \"https://api.allorigins.win/get\", bi = \"https://i.imgur.com/gxH8azy.png\";\nvar AA = {\n  SDK_VERSION: '\"1.2.15\"'\n};\nconst IA = AA.SDK_VERSION, an = async (s, e = {}) => (e.headers = {\n  ...e.headers,\n  \"x-sdk\": \"react\",\n  \"x-sdk-version\": IA\n}, fetch(s, e));\nasync function _A({\n  type: s,\n  identifier: e,\n  viewerFid: t,\n  client_id: r\n}) {\n  try {\n    let n = `${on}/v2/farcaster/cast?type=${s}&identifier=${e}${t ? `&viewer_fid=${t}` : \"\"}&client_id=${r}`;\n    const o = await (await an(n)).json();\n    return (o == null ? void 0 : o.cast) || null;\n  } catch (n) {\n    return console.error(\"Error fetching cast by identifier\", n), null;\n  }\n}\nconst RA = ({\n  type: s,\n  identifier: e,\n  viewerFid: t,\n  allowReactions: r = !1,\n  renderEmbeds: n = !0,\n  renderFrames: i = !1,\n  onLikeBtnPress: o,\n  onRecastBtnPress: a,\n  onCommentBtnPress: l,\n  onFrameBtnPress: c,\n  containerStyles: u,\n  textStyles: d\n}) => {\n  var F;\n  const {\n    client_id: h\n  } = ts(), [f, p] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(null), [y, E] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(!0), [b, R] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(null), A = (f == null ? void 0 : f.author.fid) === t;\n  return react__WEBPACK_IMPORTED_MODULE_0___default().useEffect(() => {\n    s && e && (E(!0), R(null), _A({\n      type: s,\n      identifier: e,\n      viewerFid: t,\n      client_id: h\n    }).then((M) => {\n      p(M);\n    }).catch((M) => {\n      R(M);\n    }).finally(() => {\n      E(!1);\n    }));\n  }, [s, e, t, h]), y ? /* @__PURE__ */ q.jsx(\"div\", {\n    style: {\n      padding: \"20px\"\n    },\n    children: \"Loading...\"\n  }) : !f || b ? /* @__PURE__ */ q.jsx(\"div\", {\n    children: \"Error: could not fetch cast data\"\n  }) : i && !c ? /* @__PURE__ */ q.jsx(\"div\", {\n    children: \"Error: onFrameBtnPress must be provided when renderEmbeds is true.\"\n  }) : /* @__PURE__ */ q.jsx(oa, {\n    username: f.author.username,\n    displayName: f.author.display_name,\n    avatarImgUrl: f.author.pfp_url,\n    text: f.text,\n    hash: f.hash,\n    reactions: f.reactions,\n    replies: f.replies.count,\n    embeds: f.embeds ?? [],\n    frames: f.frames ?? [],\n    renderEmbeds: n,\n    renderFrames: i,\n    channel: f.channel ? {\n      id: f.channel.id,\n      name: f.channel.name,\n      url: f.parent_url\n    } : void 0,\n    viewerFid: t,\n    allowReactions: r,\n    hasPowerBadge: f.author.power_badge,\n    appAvatarImgUrl: ((F = f.app) == null ? void 0 : F.pfp_url) || null,\n    isOwnProfile: A,\n    containerStyles: u,\n    textStyles: d,\n    onLikeBtnPress: o,\n    onRecastBtnPress: a,\n    onCommentBtnPress: l,\n    onFrameBtnPress: c,\n    timestamp: f.timestamp\n  });\n}, LA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"a\")({\n  classes: [\"s1uo4lx4\"]\n}), Pl = /* @__PURE__ */ new Map(), io = /* @__PURE__ */ new Map(), ff = /* @__PURE__ */ new Map(), gf = (s) => new Promise((e) => setTimeout(e, s)), Qp = async (s, e = 0) => {\n  const t = new URL(s).hostname;\n  if (ff.get(t))\n    return {\n      ogImage: \"\",\n      ogTitle: \"\",\n      ogDescription: \"\"\n    };\n  if (Pl.has(s))\n    return Pl.get(s);\n  if (io.has(s))\n    return io.get(s);\n  const r = (async () => {\n    try {\n      await gf(100);\n      const n = await fetch(`${wA}?url=${encodeURIComponent(s)}`, {\n        method: \"GET\"\n      });\n      if (!n.ok) {\n        if (n.status === 429 && e < 5) {\n          const E = Math.pow(2, e) * 1e3;\n          return await gf(E), Qp(s, e + 1);\n        }\n        throw ff.set(t, !0), new Error(`Failed to fetch Open Graph data: ${n.statusText}`);\n      }\n      const i = await n.json(), a = new DOMParser().parseFromString(i.contents, \"text/html\"), l = a.querySelector('meta[property=\"og:image\"]'), c = a.querySelector('meta[property=\"og:title\"]'), u = a.querySelector('meta[property=\"og:description\"]'), d = a.querySelector(\"title\"), h = l && l.getAttribute(\"content\") || \"\", f = c ? c.getAttribute(\"content\") || \"\" : d ? d.innerText : \"\", p = u && u.getAttribute(\"content\") || \"\", y = {\n        ogImage: h,\n        ogTitle: f,\n        ogDescription: p\n      };\n      return Pl.set(s, y), y;\n    } catch (n) {\n      return console.error(\"Error fetching Open Graph data\", n), {\n        ogImage: \"\",\n        ogTitle: \"\",\n        ogDescription: \"\"\n      };\n    } finally {\n      io.delete(s);\n    }\n  })();\n  return io.set(s, r), r;\n}, Ac = [];\nlet Ml = 0;\nconst CA = 5, kA = (s) => {\n  Ac.push(s), em();\n}, em = async () => {\n  if (Ml >= CA || Ac.length === 0)\n    return;\n  Ml++;\n  const s = Ac.shift();\n  s && await s(), Ml--, em();\n}, DA = ({\n  src: s,\n  alt: e,\n  style: t\n}) => /* @__PURE__ */ q.jsx(\"img\", {\n  src: s,\n  alt: e,\n  style: {\n    display: \"block\",\n    height: \"auto\",\n    maxHeight: \"150px\",\n    width: \"auto\",\n    maxWidth: \"100%\",\n    objectFit: \"cover\",\n    border: \"1px solid grey\",\n    borderRadius: \"10px\",\n    margin: \"4px 0\",\n    ...t\n  }\n}), PA = ({\n  url: s\n}) => {\n  const e = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null);\n  return react__WEBPACK_IMPORTED_MODULE_0___default().useEffect(() => {\n    if (e.current)\n      if (Hr.isSupported() && s.endsWith(\".m3u8\")) {\n        const t = new Hr();\n        t.loadSource(s), t.attachMedia(e.current), t.on(Hr.Events.MANIFEST_PARSED, () => {\n          e.current.play();\n        });\n      } else\n        e.current.src = s, e.current.addEventListener(\"loadedmetadata\", () => {\n          e.current.play();\n        });\n  }, [s]), /* @__PURE__ */ q.jsx(\"video\", {\n    ref: e,\n    controls: !0,\n    muted: !0,\n    style: {\n      width: \"auto\",\n      maxWidth: \"100%\",\n      maxHeight: \"400px\",\n      borderRadius: \"10px\",\n      margin: \"10px 0\",\n      objectFit: \"contain\"\n    }\n  });\n}, MA = (s) => /\\.(jpeg|jpg|gif|png|webp|bmp|svg)$/.test(s) || s.startsWith(\"https://imagedelivery.net\"), OA = (s, e, t) => {\n  const [r, n] = react__WEBPACK_IMPORTED_MODULE_0___default().useState([]), i = react__WEBPACK_IMPORTED_MODULE_0___default().useCallback(async (o) => (await Promise.all(o.map(async (l) => {\n    if (l.url) {\n      const c = l.url;\n      return MA(c) ? /* @__PURE__ */ q.jsx(DA, {\n        src: c,\n        alt: \"Embedded image\"\n      }, c) : c.endsWith(\".m3u8\") || c.endsWith(\".mp4\") ? /* @__PURE__ */ q.jsx(PA, {\n        url: c\n      }, c) : new Promise((u) => {\n        kA(async () => {\n          const {\n            ogImage: d,\n            ogTitle: h\n          } = await Qp(c), f = new URL(c).hostname.replace(\"www.\", \"\");\n          u(/* @__PURE__ */ q.jsxs(LA, {\n            href: c,\n            target: \"_blank\",\n            rel: \"noreferrer\",\n            children: [d && /* @__PURE__ */ q.jsx(\"img\", {\n              src: d,\n              alt: h,\n              style: {\n                width: \"50px\",\n                height: \"50px\",\n                objectFit: \"cover\",\n                borderRadius: \"5px\"\n              }\n            }), /* @__PURE__ */ q.jsxs(\"div\", {\n              style: {\n                display: \"flex\",\n                flexDirection: \"column\"\n              },\n              children: [/* @__PURE__ */ q.jsx(\"p\", {\n                style: {\n                  margin: 0\n                },\n                children: h || c\n              }), /* @__PURE__ */ q.jsx(\"p\", {\n                style: {\n                  margin: 0,\n                  color: \"grey\",\n                  fontSize: \"12px\"\n                },\n                children: f\n              })]\n            })]\n          }, c));\n        });\n      });\n    } else if (l.cast_id)\n      return /* @__PURE__ */ q.jsx(\"div\", {\n        style: {\n          maxWidth: \"85%\"\n        },\n        children: /* @__PURE__ */ q.jsx(RA, {\n          type: \"hash\",\n          identifier: l.cast_id.hash,\n          viewerFid: t,\n          allowReactions: e,\n          renderEmbeds: !1\n        }, l.cast_id.fid)\n      }, `cast-${l.cast_id.hash}`);\n    return null;\n  }))).filter((l) => l !== null), [e, t]);\n  return react__WEBPACK_IMPORTED_MODULE_0___default().useEffect(() => {\n    i(s).then(n);\n  }, [s, i]), r;\n}, tm = ({\n  onClick: s\n}) => /* @__PURE__ */ q.jsx(\"svg\", {\n  width: \"18\",\n  height: \"17\",\n  viewBox: \"0 0 18 17\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\",\n  onClick: (e) => s ? s(e) : void 0,\n  style: {\n    cursor: \"pointer\"\n  },\n  children: /* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M6.22857 12.6828H7.01285C7.01285 12.2496 6.66172 11.8985 6.22857 11.8985V12.6828ZM6.22857 15.8199H5.4443C5.4443 16.1137 5.60848 16.3828 5.8697 16.5172C6.13092 16.6517 6.44537 16.6288 6.68443 16.4581L6.22857 15.8199ZM10.6205 12.6828V11.8985C10.4571 11.8985 10.2977 11.9496 10.1647 12.0446L10.6205 12.6828ZM1.78428 3.27146C1.78428 2.54955 2.3695 1.96433 3.09141 1.96433V0.395777C1.50321 0.395777 0.215723 1.68327 0.215723 3.27146H1.78428ZM1.78428 10.5914V3.27146H0.215723V10.5914H1.78428ZM3.0914 11.8985C2.3695 11.8985 1.78428 11.3133 1.78428 10.5914H0.215723C0.215723 12.1796 1.50321 13.4671 3.0914 13.4671V11.8985ZM6.22857 11.8985H3.0914V13.4671H6.22857V11.8985ZM7.01285 15.8199V12.6828H5.4443V15.8199H7.01285ZM10.1647 12.0446L5.77272 15.1817L6.68443 16.4581L11.0764 13.321L10.1647 12.0446ZM14.5941 11.8985H10.6205V13.4671H14.5941V11.8985ZM15.9013 10.5914C15.9013 11.3133 15.316 11.8985 14.5941 11.8985V13.4671C16.1823 13.4671 17.4698 12.1796 17.4698 10.5914H15.9013ZM15.9013 3.27146V10.5914H17.4698V3.27146H15.9013ZM14.5941 1.96433C15.316 1.96433 15.9013 2.54955 15.9013 3.27146H17.4698C17.4698 1.68326 16.1823 0.395777 14.5941 0.395777V1.96433ZM3.09141 1.96433H14.5941V0.395777H3.09141V1.96433Z\",\n    fill: \"#A0A3AD\"\n  })\n}), BA = ({\n  fill: s,\n  onClick: e\n}) => /* @__PURE__ */ q.jsxs(\"svg\", {\n  width: \"16\",\n  height: \"15\",\n  viewBox: \"0 0 16 15\",\n  fill: s || \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\",\n  onClick: (t) => e ? e(t) : void 0,\n  style: {\n    cursor: \"pointer\"\n  },\n  children: [/* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M14.9245 14.2506C14.7258 14.2506 14.5352 14.1716 14.3946 14.0311C14.2541 13.8905 14.1751 13.6999 14.1751 13.5011V10.5034H11.1774C10.9787 10.5034 10.7881 10.4245 10.6475 10.2839C10.507 10.1434 10.428 9.95279 10.428 9.75403C10.428 9.55527 10.507 9.36465 10.6475 9.22411C10.7881 9.08357 10.9787 9.00461 11.1774 9.00461H14.9245C15.1233 9.00461 15.3139 9.08357 15.4545 9.22411C15.595 9.36465 15.674 9.55527 15.674 9.75403V13.5011C15.674 13.6999 15.595 13.8905 15.4545 14.0311C15.3139 14.1716 15.1233 14.2506 14.9245 14.2506ZM5.18207 6.00693H1.43497C1.23621 6.00693 1.04559 5.92797 0.905047 5.78743C0.764503 5.64688 0.685547 5.45627 0.685547 5.25751V1.51041C0.685547 1.31165 0.764503 1.12103 0.905047 0.980486C1.04559 0.839943 1.23621 0.760986 1.43497 0.760986C1.63373 0.760986 1.82434 0.839943 1.96489 0.980486C2.10543 1.12103 2.18439 1.31165 2.18439 1.51041V4.50809H5.18207C5.38083 4.50809 5.57145 4.58704 5.71199 4.72759C5.85253 4.86813 5.93149 5.05875 5.93149 5.25751C5.93149 5.45627 5.85253 5.64688 5.71199 5.78743C5.57145 5.92797 5.38083 6.00693 5.18207 6.00693Z\",\n    fill: s || \"#A0A3AD\"\n  }), /* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M8.17934 15C6.33556 15.0003 4.55637 14.3209 3.18205 13.0918C1.80774 11.8627 0.934766 10.17 0.730106 8.33765C0.719281 8.23923 0.727945 8.13965 0.755606 8.04458C0.783266 7.94951 0.82938 7.86083 0.891315 7.78358C1.0164 7.62758 1.19833 7.52765 1.39709 7.50579C1.59585 7.48393 1.79515 7.54191 1.95116 7.667C2.10716 7.79208 2.20708 7.97401 2.22895 8.17277C2.37708 9.52376 2.97983 10.7843 3.93838 11.7478C4.89692 12.7113 6.15438 13.3205 7.50459 13.4755C8.85479 13.6306 10.2176 13.3223 11.3696 12.6012C12.5216 11.8801 13.3944 10.789 13.845 9.50674C13.8731 9.40817 13.9211 9.31642 13.986 9.23714C14.051 9.15787 14.1316 9.09277 14.2227 9.04586C14.3138 8.99895 14.4136 8.97123 14.5159 8.96442C14.6181 8.95761 14.7207 8.97185 14.8173 9.00625C14.9138 9.04066 15.0023 9.09451 15.0772 9.16446C15.1521 9.23442 15.2118 9.31899 15.2528 9.41296C15.2937 9.50693 15.3149 9.6083 15.3151 9.71079C15.3153 9.81329 15.2944 9.91473 15.2539 10.0089C14.7359 11.4705 13.7774 12.7355 12.5103 13.6294C11.2432 14.5233 9.73002 15.0022 8.17934 15ZM14.8792 7.50579C14.6939 7.50691 14.5148 7.43937 14.3764 7.3162C14.238 7.19302 14.1501 7.02295 14.1297 6.8388C13.975 5.49429 13.3699 4.24169 12.4128 3.28476C11.4558 2.32782 10.2031 1.72285 8.85858 1.56824C7.51405 1.41364 6.15676 1.7185 5.0075 2.43324C3.85823 3.14798 2.9846 4.23054 2.52872 5.50484C2.50062 5.6034 2.4526 5.69516 2.38763 5.77443C2.32266 5.85371 2.24212 5.91881 2.15099 5.96572C2.05987 6.01263 1.96008 6.04035 1.85781 6.04716C1.75555 6.05397 1.65297 6.03973 1.55642 6.00532C1.45988 5.97092 1.37141 5.91707 1.29651 5.84712C1.2216 5.77716 1.16183 5.69258 1.12091 5.59861C1.07999 5.50464 1.05878 5.40328 1.05859 5.30078C1.0584 5.19829 1.07923 5.09685 1.1198 5.00273C1.68406 3.40202 2.77497 2.04025 4.21397 1.14029C5.65297 0.240337 7.35485 -0.144505 9.04106 0.0487522C10.7273 0.242009 12.2979 1.00192 13.496 2.20411C14.6941 3.4063 15.4486 4.97958 15.6361 6.66644C15.6571 6.86306 15.5997 7.06004 15.4761 7.21445C15.3526 7.36887 15.173 7.4682 14.9766 7.4908L14.8792 7.50579Z\",\n    fill: s || \"#A0A3AD\"\n  })]\n}), rm = ({\n  fill: s,\n  onClick: e\n}) => /* @__PURE__ */ q.jsxs(\"svg\", {\n  width: \"17\",\n  height: \"15\",\n  viewBox: \"0 0 17 15\",\n  fill: s ? \"red\" : \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\",\n  onClick: (t) => e ? e(t) : void 0,\n  style: {\n    cursor: \"pointer\"\n  },\n  children: [/* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M13.8719 2.25042L14.2947 1.58984L13.8719 2.25042C15.2467 3.13022 15.7676 5.22206 14.8856 7.61317C14.0436 9.89583 11.9555 12.2374 8.51573 13.3648C5.07606 12.2374 2.98799 9.89584 2.14596 7.61316C1.26392 5.22203 1.7848 3.13022 3.15951 2.25042L3.15951 2.25042C4.58542 1.33783 5.64997 1.52983 6.39945 1.92503C7.21272 2.35388 7.73108 3.07114 7.86143 3.26838L8.51573 4.25838L9.17002 3.26838C9.30038 3.07113 9.81873 2.35388 10.632 1.92503C11.3815 1.52983 12.446 1.33783 13.8719 2.25042Z\",\n    stroke: s || \"#A0A3AD\",\n    strokeWidth: \"1.56855\"\n  }), /* @__PURE__ */ q.jsx(\"mask\", {\n    id: \"path-2-inside-1_187_1051\",\n    fill: \"white\",\n    children: /* @__PURE__ */ q.jsx(\"path\", {\n      d: \"M8.58444 13.9397C7.76139 13.6864 7.05334 13.3937 6.29976 12.9825C5.95633 12.7951 5.62285 12.5895 5.3003 12.3681C5.14416 12.2609 4.99108 12.1493 4.84063 12.0343C4.78132 11.9889 4.88038 12.0652 4.82156 12.0195C4.80388 12.0058 4.7863 11.9919 4.76869 11.9781C4.73364 11.9505 4.69884 11.9225 4.66413 11.8945C4.58948 11.8342 4.51582 11.7727 4.4428 11.7105C3.90499 11.252 3.41381 10.7389 2.98016 10.1809C3.01856 10.2303 2.97651 10.176 2.97064 10.1683C2.9583 10.1522 2.94604 10.1359 2.9338 10.1197C2.90939 10.0874 2.88527 10.0548 2.86126 10.0221C2.80961 9.95189 2.75908 9.8808 2.70932 9.8092C2.61492 9.67345 2.52441 9.535 2.4371 9.39457C2.2673 9.12145 2.11213 8.83926 1.97147 8.55006C1.93849 8.48228 1.90657 8.41396 1.87531 8.34537C1.85978 8.3113 1.84459 8.27709 1.82948 8.24284C1.82195 8.22575 1.81456 8.20864 1.80714 8.19152C1.80167 8.17889 1.76856 8.10061 1.79664 8.16736C1.73728 8.0262 1.68205 7.88329 1.63029 7.73916C1.52982 7.45942 1.44498 7.17407 1.37575 6.88502C1.34218 6.74492 1.31301 6.60379 1.28746 6.46202C1.2754 6.39502 1.2645 6.32782 1.2543 6.26052C1.24925 6.22713 1.24453 6.19369 1.23994 6.16023C1.25136 6.24358 1.23495 6.11772 1.23231 6.09532C1.20042 5.82444 1.18535 5.55158 1.18721 5.27885C1.18811 5.14691 1.19374 5.01501 1.20334 4.88343C1.20788 4.82128 1.21368 4.75922 1.22023 4.69726C1.2235 4.66651 1.22713 4.6358 1.23089 4.60511C1.23278 4.58982 1.23477 4.57457 1.23678 4.5593C1.22562 4.64425 1.23563 4.56956 1.23823 4.55163C1.27428 4.30419 1.32861 4.05943 1.40097 3.82006C1.43614 3.70375 1.47635 3.58899 1.52072 3.47587C1.53125 3.449 1.54219 3.42229 1.55326 3.39564C1.51941 3.47716 1.55889 3.38334 1.56717 3.36464C1.59226 3.30803 1.61886 3.25209 1.64643 3.19664C1.75101 2.98624 1.87476 2.78549 2.01534 2.59724C2.02371 2.58603 2.03221 2.57492 2.04071 2.5638C1.99275 2.62656 2.02446 2.58496 2.03493 2.57169C2.05223 2.54974 2.06993 2.52808 2.08773 2.50653C2.12631 2.45984 2.16629 2.41434 2.20713 2.36962C2.28587 2.28341 2.36926 2.20151 2.456 2.12339C2.49787 2.08568 2.54084 2.0492 2.58443 2.01352C2.60631 1.99561 2.62852 1.97808 2.65084 1.9607C2.58164 2.01466 2.67191 1.94557 2.68962 1.93265C2.83338 1.8277 2.98587 1.7348 3.14013 1.6463C3.54393 1.41459 3.92437 1.25567 4.3831 1.15072C4.47716 1.12921 4.57219 1.11204 4.6676 1.09771C4.74483 1.08611 4.61527 1.10399 4.69217 1.09444C4.71513 1.0916 4.73817 1.08917 4.76119 1.08677C4.81403 1.08124 4.86704 1.07739 4.92007 1.07423C5.10084 1.06348 5.28237 1.06851 5.46252 1.0864C5.48336 1.08846 5.50417 1.09092 5.52495 1.09338C5.59508 1.10167 5.46943 1.08526 5.53899 1.09521C5.57965 1.10103 5.62016 1.10795 5.66059 1.11524C5.74647 1.13073 5.83159 1.1503 5.91604 1.17227C6.0728 1.21311 6.22621 1.26621 6.37595 1.32786C6.31111 1.30115 6.41877 1.34702 6.43584 1.35477C6.46987 1.3702 6.50356 1.38639 6.53714 1.4028C6.60865 1.43779 6.67886 1.47543 6.74817 1.51462C6.87662 1.58723 7.00062 1.66753 7.12092 1.7529C7.14882 1.77271 7.17637 1.79297 7.20383 1.81338C7.21739 1.82348 7.23087 1.8337 7.24432 1.84396C7.29158 1.87992 7.1988 1.80839 7.24529 1.84482C7.30109 1.88853 7.35568 1.93375 7.40949 1.97982C7.50652 2.06288 7.59994 2.15008 7.69053 2.24011C7.84008 2.38879 7.98044 2.54677 8.11149 2.71194C8.12572 2.72987 8.17533 2.79414 8.11485 2.7157C8.12636 2.73065 8.13776 2.74568 8.1491 2.76075C8.1694 2.78769 8.18934 2.81491 8.20905 2.8423C8.23825 2.88286 8.2667 2.92398 8.29429 2.96566C8.40374 3.131 8.6286 3.131 8.73805 2.96566C8.76707 2.92181 8.79712 2.87866 8.82785 2.83598C8.84783 2.80823 8.86819 2.78075 8.88875 2.75344C8.90242 2.73529 8.94928 2.67474 8.88935 2.75214C8.90409 2.73312 8.919 2.71424 8.93399 2.69542C9.0671 2.52834 9.21071 2.36968 9.36261 2.21954C9.45411 2.12907 9.5493 2.04234 9.64732 1.95897C9.69737 1.91641 9.74847 1.87507 9.80017 1.83456C9.7388 1.88263 9.82694 1.81457 9.84213 1.80327C9.87427 1.77937 9.90683 1.75606 9.9396 1.73301C10.0608 1.64773 10.1866 1.56915 10.3159 1.49682C10.3802 1.46084 10.4457 1.42703 10.5119 1.39467C10.5455 1.37823 10.5795 1.36251 10.6136 1.34704C10.6308 1.33926 10.6481 1.33171 10.6654 1.32417C10.6915 1.31296 10.6885 1.3142 10.6564 1.3279C10.6681 1.32303 10.6798 1.31822 10.6916 1.31349C10.8423 1.25235 10.9973 1.20246 11.1548 1.16239C11.2332 1.14248 11.3123 1.12599 11.3918 1.11166C11.4323 1.10435 11.473 1.09815 11.5138 1.09231C11.4471 1.10186 11.5171 1.09226 11.5281 1.09095C11.5559 1.08767 11.5838 1.08499 11.6117 1.0824C11.793 1.06553 11.9757 1.06513 12.1573 1.0771C12.203 1.08011 12.2485 1.08444 12.294 1.08921C12.3172 1.09163 12.3402 1.0945 12.3633 1.09734C12.3036 1.08994 12.3813 1.10022 12.3881 1.10123C12.4921 1.11685 12.5952 1.13785 12.6975 1.16193C13.1586 1.27048 13.5378 1.44037 13.9464 1.67761C14.0904 1.76129 14.2314 1.8507 14.3656 1.9495C14.377 1.95791 14.3884 1.96648 14.3997 1.97503C14.4419 2.00688 14.351 1.93696 14.3926 1.96945C14.4149 1.98683 14.4369 2.00462 14.4588 2.02252C14.5059 2.06115 14.5519 2.1013 14.5971 2.14228C14.6835 2.22073 14.7656 2.30388 14.8439 2.39035C14.8815 2.43176 14.9178 2.47427 14.9534 2.51736C14.9712 2.53891 14.9887 2.56077 15.006 2.58274C15.0384 2.62388 14.9682 2.53335 15 2.575C15.0114 2.58983 15.0225 2.60479 15.0336 2.61978C15.1736 2.80871 15.2946 3.01142 15.3985 3.22224C15.4238 3.27356 15.4477 3.32553 15.4709 3.37782C15.4767 3.39096 15.4824 3.40414 15.4881 3.41734C15.5093 3.46656 15.464 3.35945 15.4845 3.40902C15.4975 3.44013 15.5099 3.47148 15.5221 3.50289C15.5661 3.61632 15.6049 3.73175 15.6398 3.84833C15.7115 4.08832 15.763 4.33416 15.7984 4.58204C15.8064 4.63806 15.7901 4.51842 15.7975 4.57463C15.7995 4.58992 15.8014 4.60521 15.8033 4.6205C15.807 4.6512 15.8104 4.68197 15.8137 4.71273C15.8208 4.77994 15.8264 4.84732 15.8312 4.91474C15.8404 5.04658 15.8447 5.17876 15.8453 5.31093C15.8464 5.58418 15.8287 5.85737 15.7961 6.12862C15.7941 6.14529 15.7919 6.16192 15.7898 6.17856C15.7822 6.23827 15.7983 6.11722 15.7901 6.17697C15.7855 6.21044 15.7806 6.24389 15.7755 6.27731C15.7644 6.35031 15.752 6.4231 15.7388 6.49573C15.7129 6.63769 15.6823 6.7788 15.6484 6.91905C15.5784 7.20843 15.4909 7.49348 15.3897 7.77343C15.3648 7.84232 15.3388 7.9108 15.3121 7.97902C15.2987 8.01338 15.2849 8.0476 15.2711 8.08179C15.2641 8.09896 15.257 8.11604 15.25 8.13315C15.2452 8.14458 15.2405 8.15598 15.2357 8.16738C15.2496 8.13453 15.251 8.13117 15.2399 8.15734C15.1786 8.30137 15.1131 8.44355 15.0443 8.58416C14.9028 8.87351 14.7451 9.15483 14.5745 9.42799C14.4868 9.56844 14.395 9.70634 14.3002 9.84213C14.254 9.90821 14.2069 9.97355 14.1592 10.0385C14.1351 10.0711 14.1108 10.1036 14.0864 10.136C14.0741 10.1522 14.0617 10.1684 14.0494 10.1845C14.0319 10.2073 14.0329 10.2061 14.0522 10.181C14.0439 10.1918 14.0355 10.2025 14.0271 10.2132C13.8135 10.4869 13.5849 10.7488 13.3445 10.9992C13.0948 11.2594 12.8309 11.5058 12.556 11.7391C12.4884 11.7965 12.4199 11.8528 12.3509 11.9086C12.3162 11.9366 12.2812 11.9643 12.2461 11.992C12.2285 12.0058 12.2108 12.0196 12.1931 12.0333C12.2377 11.9987 12.1636 12.0558 12.156 12.0616C12.005 12.1765 11.8508 12.2871 11.6942 12.3941C11.3706 12.6153 11.0348 12.8185 10.6904 13.0055C10.5122 13.1023 10.3313 13.1939 10.1484 13.2815C10.059 13.3243 9.96904 13.3658 9.87868 13.4064C9.8331 13.4269 9.78733 13.4469 9.74151 13.4669C9.7185 13.4769 9.69541 13.4868 9.67233 13.4966C9.6442 13.5086 9.64146 13.5098 9.66417 13.5002C9.64864 13.5067 9.63313 13.5132 9.61758 13.5196C9.2349 13.6788 8.84398 13.8179 8.44786 13.9398C8.31409 13.9809 8.2304 14.1178 8.26839 14.2559C8.3047 14.3878 8.45064 14.4765 8.5845 14.4353C10.1534 13.9525 11.626 13.1871 12.8857 12.131C13.9425 11.245 14.8349 10.1456 15.4543 8.91165C15.9942 7.83608 16.3357 6.64744 16.3583 5.43967C16.3774 4.41628 16.149 3.35704 15.5742 2.49789C15.2929 2.07732 14.9371 1.71816 14.5205 1.43134C13.7956 0.932295 12.9294 0.592822 12.045 0.557214C10.7717 0.505949 9.60126 1.17157 8.7697 2.09685C8.59779 2.28813 8.43634 2.49172 8.29431 2.70629C8.44223 2.70629 8.59015 2.70629 8.73807 2.70629C8.22434 1.93023 7.48255 1.25338 6.6264 0.880424C5.9305 0.577258 5.18555 0.490164 4.43721 0.617179C3.98766 0.69348 3.55546 0.856508 3.14849 1.05915C2.81945 1.22296 2.50653 1.41842 2.22115 1.65017C1.44904 2.27713 0.973026 3.20995 0.783732 4.17519C0.56509 5.29004 0.68737 6.45381 1.02051 7.53339C1.41084 8.79827 2.09407 9.95916 2.95641 10.9589C3.94757 12.1081 5.19614 13.0306 6.5582 13.6933C7.16712 13.9896 7.8008 14.2362 8.44788 14.4353C8.58174 14.4765 8.72768 14.3878 8.76399 14.2559C8.80189 14.1177 8.71821 13.9809 8.58444 13.9397Z\"\n    })\n  }), /* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M8.58444 13.9397C7.76139 13.6864 7.05334 13.3937 6.29976 12.9825C5.95633 12.7951 5.62285 12.5895 5.3003 12.3681C5.14416 12.2609 4.99108 12.1493 4.84063 12.0343C4.78132 11.9889 4.88038 12.0652 4.82156 12.0195C4.80388 12.0058 4.7863 11.9919 4.76869 11.9781C4.73364 11.9505 4.69884 11.9225 4.66413 11.8945C4.58948 11.8342 4.51582 11.7727 4.4428 11.7105C3.90499 11.252 3.41381 10.7389 2.98016 10.1809C3.01856 10.2303 2.97651 10.176 2.97064 10.1683C2.9583 10.1522 2.94604 10.1359 2.9338 10.1197C2.90939 10.0874 2.88527 10.0548 2.86126 10.0221C2.80961 9.95189 2.75908 9.8808 2.70932 9.8092C2.61492 9.67345 2.52441 9.535 2.4371 9.39457C2.2673 9.12145 2.11213 8.83926 1.97147 8.55006C1.93849 8.48228 1.90657 8.41396 1.87531 8.34537C1.85978 8.3113 1.84459 8.27709 1.82948 8.24284C1.82195 8.22575 1.81456 8.20864 1.80714 8.19152C1.80167 8.17889 1.76856 8.10061 1.79664 8.16736C1.73728 8.0262 1.68205 7.88329 1.63029 7.73916C1.52982 7.45942 1.44498 7.17407 1.37575 6.88502C1.34218 6.74492 1.31301 6.60379 1.28746 6.46202C1.2754 6.39502 1.2645 6.32782 1.2543 6.26052C1.24925 6.22713 1.24453 6.19369 1.23994 6.16023C1.25136 6.24358 1.23495 6.11772 1.23231 6.09532C1.20042 5.82444 1.18535 5.55158 1.18721 5.27885C1.18811 5.14691 1.19374 5.01501 1.20334 4.88343C1.20788 4.82128 1.21368 4.75922 1.22023 4.69726C1.2235 4.66651 1.22713 4.6358 1.23089 4.60511C1.23278 4.58982 1.23477 4.57457 1.23678 4.5593C1.22562 4.64425 1.23563 4.56956 1.23823 4.55163C1.27428 4.30419 1.32861 4.05943 1.40097 3.82006C1.43614 3.70375 1.47635 3.58899 1.52072 3.47587C1.53125 3.449 1.54219 3.42229 1.55326 3.39564C1.51941 3.47716 1.55889 3.38334 1.56717 3.36464C1.59226 3.30803 1.61886 3.25209 1.64643 3.19664C1.75101 2.98624 1.87476 2.78549 2.01534 2.59724C2.02371 2.58603 2.03221 2.57492 2.04071 2.5638C1.99275 2.62656 2.02446 2.58496 2.03493 2.57169C2.05223 2.54974 2.06993 2.52808 2.08773 2.50653C2.12631 2.45984 2.16629 2.41434 2.20713 2.36962C2.28587 2.28341 2.36926 2.20151 2.456 2.12339C2.49787 2.08568 2.54084 2.0492 2.58443 2.01352C2.60631 1.99561 2.62852 1.97808 2.65084 1.9607C2.58164 2.01466 2.67191 1.94557 2.68962 1.93265C2.83338 1.8277 2.98587 1.7348 3.14013 1.6463C3.54393 1.41459 3.92437 1.25567 4.3831 1.15072C4.47716 1.12921 4.57219 1.11204 4.6676 1.09771C4.74483 1.08611 4.61527 1.10399 4.69217 1.09444C4.71513 1.0916 4.73817 1.08917 4.76119 1.08677C4.81403 1.08124 4.86704 1.07739 4.92007 1.07423C5.10084 1.06348 5.28237 1.06851 5.46252 1.0864C5.48336 1.08846 5.50417 1.09092 5.52495 1.09338C5.59508 1.10167 5.46943 1.08526 5.53899 1.09521C5.57965 1.10103 5.62016 1.10795 5.66059 1.11524C5.74647 1.13073 5.83159 1.1503 5.91604 1.17227C6.0728 1.21311 6.22621 1.26621 6.37595 1.32786C6.31111 1.30115 6.41877 1.34702 6.43584 1.35477C6.46987 1.3702 6.50356 1.38639 6.53714 1.4028C6.60865 1.43779 6.67886 1.47543 6.74817 1.51462C6.87662 1.58723 7.00062 1.66753 7.12092 1.7529C7.14882 1.77271 7.17637 1.79297 7.20383 1.81338C7.21739 1.82348 7.23087 1.8337 7.24432 1.84396C7.29158 1.87992 7.1988 1.80839 7.24529 1.84482C7.30109 1.88853 7.35568 1.93375 7.40949 1.97982C7.50652 2.06288 7.59994 2.15008 7.69053 2.24011C7.84008 2.38879 7.98044 2.54677 8.11149 2.71194C8.12572 2.72987 8.17533 2.79414 8.11485 2.7157C8.12636 2.73065 8.13776 2.74568 8.1491 2.76075C8.1694 2.78769 8.18934 2.81491 8.20905 2.8423C8.23825 2.88286 8.2667 2.92398 8.29429 2.96566C8.40374 3.131 8.6286 3.131 8.73805 2.96566C8.76707 2.92181 8.79712 2.87866 8.82785 2.83598C8.84783 2.80823 8.86819 2.78075 8.88875 2.75344C8.90242 2.73529 8.94928 2.67474 8.88935 2.75214C8.90409 2.73312 8.919 2.71424 8.93399 2.69542C9.0671 2.52834 9.21071 2.36968 9.36261 2.21954C9.45411 2.12907 9.5493 2.04234 9.64732 1.95897C9.69737 1.91641 9.74847 1.87507 9.80017 1.83456C9.7388 1.88263 9.82694 1.81457 9.84213 1.80327C9.87427 1.77937 9.90683 1.75606 9.9396 1.73301C10.0608 1.64773 10.1866 1.56915 10.3159 1.49682C10.3802 1.46084 10.4457 1.42703 10.5119 1.39467C10.5455 1.37823 10.5795 1.36251 10.6136 1.34704C10.6308 1.33926 10.6481 1.33171 10.6654 1.32417C10.6915 1.31296 10.6885 1.3142 10.6564 1.3279C10.6681 1.32303 10.6798 1.31822 10.6916 1.31349C10.8423 1.25235 10.9973 1.20246 11.1548 1.16239C11.2332 1.14248 11.3123 1.12599 11.3918 1.11166C11.4323 1.10435 11.473 1.09815 11.5138 1.09231C11.4471 1.10186 11.5171 1.09226 11.5281 1.09095C11.5559 1.08767 11.5838 1.08499 11.6117 1.0824C11.793 1.06553 11.9757 1.06513 12.1573 1.0771C12.203 1.08011 12.2485 1.08444 12.294 1.08921C12.3172 1.09163 12.3402 1.0945 12.3633 1.09734C12.3036 1.08994 12.3813 1.10022 12.3881 1.10123C12.4921 1.11685 12.5952 1.13785 12.6975 1.16193C13.1586 1.27048 13.5378 1.44037 13.9464 1.67761C14.0904 1.76129 14.2314 1.8507 14.3656 1.9495C14.377 1.95791 14.3884 1.96648 14.3997 1.97503C14.4419 2.00688 14.351 1.93696 14.3926 1.96945C14.4149 1.98683 14.4369 2.00462 14.4588 2.02252C14.5059 2.06115 14.5519 2.1013 14.5971 2.14228C14.6835 2.22073 14.7656 2.30388 14.8439 2.39035C14.8815 2.43176 14.9178 2.47427 14.9534 2.51736C14.9712 2.53891 14.9887 2.56077 15.006 2.58274C15.0384 2.62388 14.9682 2.53335 15 2.575C15.0114 2.58983 15.0225 2.60479 15.0336 2.61978C15.1736 2.80871 15.2946 3.01142 15.3985 3.22224C15.4238 3.27356 15.4477 3.32553 15.4709 3.37782C15.4767 3.39096 15.4824 3.40414 15.4881 3.41734C15.5093 3.46656 15.464 3.35945 15.4845 3.40902C15.4975 3.44013 15.5099 3.47148 15.5221 3.50289C15.5661 3.61632 15.6049 3.73175 15.6398 3.84833C15.7115 4.08832 15.763 4.33416 15.7984 4.58204C15.8064 4.63806 15.7901 4.51842 15.7975 4.57463C15.7995 4.58992 15.8014 4.60521 15.8033 4.6205C15.807 4.6512 15.8104 4.68197 15.8137 4.71273C15.8208 4.77994 15.8264 4.84732 15.8312 4.91474C15.8404 5.04658 15.8447 5.17876 15.8453 5.31093C15.8464 5.58418 15.8287 5.85737 15.7961 6.12862C15.7941 6.14529 15.7919 6.16192 15.7898 6.17856C15.7822 6.23827 15.7983 6.11722 15.7901 6.17697C15.7855 6.21044 15.7806 6.24389 15.7755 6.27731C15.7644 6.35031 15.752 6.4231 15.7388 6.49573C15.7129 6.63769 15.6823 6.7788 15.6484 6.91905C15.5784 7.20843 15.4909 7.49348 15.3897 7.77343C15.3648 7.84232 15.3388 7.9108 15.3121 7.97902C15.2987 8.01338 15.2849 8.0476 15.2711 8.08179C15.2641 8.09896 15.257 8.11604 15.25 8.13315C15.2452 8.14458 15.2405 8.15598 15.2357 8.16738C15.2496 8.13453 15.251 8.13117 15.2399 8.15734C15.1786 8.30137 15.1131 8.44355 15.0443 8.58416C14.9028 8.87351 14.7451 9.15483 14.5745 9.42799C14.4868 9.56844 14.395 9.70634 14.3002 9.84213C14.254 9.90821 14.2069 9.97355 14.1592 10.0385C14.1351 10.0711 14.1108 10.1036 14.0864 10.136C14.0741 10.1522 14.0617 10.1684 14.0494 10.1845C14.0319 10.2073 14.0329 10.2061 14.0522 10.181C14.0439 10.1918 14.0355 10.2025 14.0271 10.2132C13.8135 10.4869 13.5849 10.7488 13.3445 10.9992C13.0948 11.2594 12.8309 11.5058 12.556 11.7391C12.4884 11.7965 12.4199 11.8528 12.3509 11.9086C12.3162 11.9366 12.2812 11.9643 12.2461 11.992C12.2285 12.0058 12.2108 12.0196 12.1931 12.0333C12.2377 11.9987 12.1636 12.0558 12.156 12.0616C12.005 12.1765 11.8508 12.2871 11.6942 12.3941C11.3706 12.6153 11.0348 12.8185 10.6904 13.0055C10.5122 13.1023 10.3313 13.1939 10.1484 13.2815C10.059 13.3243 9.96904 13.3658 9.87868 13.4064C9.8331 13.4269 9.78733 13.4469 9.74151 13.4669C9.7185 13.4769 9.69541 13.4868 9.67233 13.4966C9.6442 13.5086 9.64146 13.5098 9.66417 13.5002C9.64864 13.5067 9.63313 13.5132 9.61758 13.5196C9.2349 13.6788 8.84398 13.8179 8.44786 13.9398C8.31409 13.9809 8.2304 14.1178 8.26839 14.2559C8.3047 14.3878 8.45064 14.4765 8.5845 14.4353C10.1534 13.9525 11.626 13.1871 12.8857 12.131C13.9425 11.245 14.8349 10.1456 15.4543 8.91165C15.9942 7.83608 16.3357 6.64744 16.3583 5.43967C16.3774 4.41628 16.149 3.35704 15.5742 2.49789C15.2929 2.07732 14.9371 1.71816 14.5205 1.43134C13.7956 0.932295 12.9294 0.592822 12.045 0.557214C10.7717 0.505949 9.60126 1.17157 8.7697 2.09685C8.59779 2.28813 8.43634 2.49172 8.29431 2.70629C8.44223 2.70629 8.59015 2.70629 8.73807 2.70629C8.22434 1.93023 7.48255 1.25338 6.6264 0.880424C5.9305 0.577258 5.18555 0.490164 4.43721 0.617179C3.98766 0.69348 3.55546 0.856508 3.14849 1.05915C2.81945 1.22296 2.50653 1.41842 2.22115 1.65017C1.44904 2.27713 0.973026 3.20995 0.783732 4.17519C0.56509 5.29004 0.68737 6.45381 1.02051 7.53339C1.41084 8.79827 2.09407 9.95916 2.95641 10.9589C3.94757 12.1081 5.19614 13.0306 6.5582 13.6933C7.16712 13.9896 7.8008 14.2362 8.44788 14.4353C8.58174 14.4765 8.72768 14.3878 8.76399 14.2559C8.80189 14.1177 8.71821 13.9809 8.58444 13.9397Z\",\n    stroke: s || \"#A0A3AD\",\n    strokeWidth: \"3.13711\",\n    mask: \"url(#path-2-inside-1_187_1051)\"\n  })]\n});\nfunction sm({\n  onClick: s,\n  size: e = 24\n}) {\n  return /* @__PURE__ */ q.jsx(\"svg\", {\n    \"aria-hidden\": \"true\",\n    focusable: \"false\",\n    role: \"img\",\n    viewBox: \"0 0 16 16\",\n    width: e,\n    height: e,\n    fill: \"#4A4A4A\",\n    style: {\n      display: \"inline-block\",\n      userSelect: \"none\",\n      verticalAlign: \"text-bottom\",\n      overflow: \"visible\",\n      cursor: \"pointer\",\n      padding: \"4px\"\n    },\n    onClick: s,\n    children: /* @__PURE__ */ q.jsx(\"path\", {\n      d: \"M3.72 3.72a.75.75 0 0 1 1.06 0L8 6.94l3.22-3.22a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734L9.06 8l3.22 3.22a.749.749 0 0 1-.326 1.275.749.749 0 0 1-.734-.215L8 9.06l-3.22 3.22a.751.751 0 0 1-1.042-.018.751.751 0 0 1-.018-1.042L6.94 8 3.72 4.78a.75.75 0 0 1 0-1.06Z\"\n    })\n  });\n}\nconst FA = () => Ir, NA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(FA())({\n  classes: [\"rect7e5\"]\n}), UA = () => Ir, $A = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(UA())({\n  classes: [\"p13mqntt\"]\n}), GA = () => Ir, VA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(GA())({\n  classes: [\"p1r47dz2\"]\n}), jA = () => Ir, KA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(jA())({\n  classes: [\"cnojpqv\"]\n}), HA = ({\n  hash: s,\n  reactions: e,\n  onComment: t,\n  onRecast: r,\n  onLike: n,\n  isLiked: i\n}) => {\n  const {\n    client_id: o,\n    user: a,\n    isAuthenticated: l\n  } = ts(), [c, u] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(!1), [d, h] = react__WEBPACK_IMPORTED_MODULE_0___default().useState({\n    top: 0,\n    left: 0\n  }), [f, p] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(null), [y, E] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(i), [b, R] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(!1), A = react__WEBPACK_IMPORTED_MODULE_0___default().useRef(null), F = react__WEBPACK_IMPORTED_MODULE_0___default().useRef({\n    comment: null,\n    recast: null,\n    like: null\n  });\n  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    E(e.likes.some((H) => H.fid === (a == null ? void 0 : a.fid))), R(e.recasts.some((H) => H.fid === (a == null ? void 0 : a.fid)));\n  }, [e, a]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    const H = localStorage.getItem(jn.NEYNAR_AUTHENTICATED_USER);\n    if (H)\n      try {\n        p(JSON.parse(H).signer_uuid);\n      } catch (K) {\n        console.error(\"Error parsing JSON from local storage:\", K), p(null);\n      }\n    else\n      console.warn(\"No NEYNAR_AUTHENTICATED_USER found in local storage.\");\n  }, [l]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    (f || l) && c && u(!1);\n  }, [f, l, c]);\n  const M = async (H, K) => {\n    if (f)\n      switch (K) {\n        case \"comment\":\n          if (t)\n            t();\n          else\n            throw new Error(\"No comment handler function provided\");\n          break;\n        case \"recast\":\n          if (r)\n            R(r());\n          else\n            throw new Error(\"No recast handler function provided\");\n          break;\n        case \"like\":\n          if (n)\n            E(n());\n          else\n            throw new Error(\"No like handler function provided\");\n          break;\n      }\n    const j = F.current[K];\n    if (j) {\n      const C = j.getBoundingClientRect(), k = A.current;\n      if (k) {\n        const $ = k.getBoundingClientRect();\n        h({\n          top: C.top - $.height - 10,\n          left: C.left + C.width / 2 - $.width / 2\n        });\n      }\n    }\n  };\n  return /* @__PURE__ */ q.jsxs(NA, {\n    children: [c && /* @__PURE__ */ q.jsxs($A, {\n      ref: A,\n      style: {\n        top: d.top,\n        left: d.left\n      },\n      children: [/* @__PURE__ */ q.jsx(VA, {\n        children: /* @__PURE__ */ q.jsx(pS, {\n          variant: gs.NEYNAR\n        })\n      }), /* @__PURE__ */ q.jsx(KA, {\n        children: /* @__PURE__ */ q.jsx(sm, {\n          onClick: () => u(!1),\n          size: 16\n        })\n      })]\n    }), /* @__PURE__ */ q.jsx(Ir, {\n      style: {\n        display: \"flex\",\n        justifyContent: \"space-between\",\n        alignItems: \"center\"\n      },\n      children: /* @__PURE__ */ q.jsxs(Ir, {\n        spacingVertical: \"15px\",\n        style: {\n          display: \"flex\",\n          gap: \"42px\"\n        },\n        children: [/* @__PURE__ */ q.jsx(\"div\", {\n          ref: (H) => F.current.comment = H,\n          children: /* @__PURE__ */ q.jsx(tm, {\n            onClick: (H) => M(H, \"comment\")\n          })\n        }), /* @__PURE__ */ q.jsx(\"div\", {\n          ref: (H) => F.current.recast = H,\n          children: /* @__PURE__ */ q.jsx(BA, {\n            fill: b ? \"green\" : void 0,\n            onClick: (H) => M(H, \"recast\")\n          })\n        }), /* @__PURE__ */ q.jsx(\"div\", {\n          ref: (H) => F.current.like = H,\n          children: /* @__PURE__ */ q.jsx(rm, {\n            fill: y ? \"red\" : void 0,\n            onClick: (H) => M(H, \"like\")\n          })\n        })]\n      })\n    })]\n  });\n};\nfunction qA({\n  onClick: s\n}) {\n  return /* @__PURE__ */ q.jsx(\"svg\", {\n    style: {\n      cursor: \"pointer\"\n    },\n    width: \"16\",\n    height: \"15\",\n    viewBox: \"0 0 16 15\",\n    fill: \"none\",\n    xmlns: \"http://www.w3.org/2000/svg\",\n    onClick: (e) => s ? s(e) : void 0,\n    children: /* @__PURE__ */ q.jsx(\"path\", {\n      d: \"M15.2003 7.49063C14.7504 7.49063 14.4504 7.79057 14.4504 8.24048V12.7396C14.4504 13.1895 14.1505 13.4894 13.7006 13.4894H3.20268C2.75277 13.4894 2.45283 13.1895 2.45283 12.7396V8.24048C2.45283 7.79057 2.15289 7.49063 1.70298 7.49063C1.25307 7.49063 0.953125 7.79057 0.953125 8.24048V12.7396C0.953125 14.0143 1.92793 14.9891 3.20268 14.9891H13.7006C14.9753 14.9891 15.9501 14.0143 15.9501 12.7396V8.24048C15.9501 7.79057 15.6502 7.49063 15.2003 7.49063ZM5.97713 4.26627L7.70178 2.54161V9.74018C7.70178 10.1901 8.00172 10.49 8.45163 10.49C8.90155 10.49 9.20149 10.1901 9.20149 9.74018V2.54161L10.9261 4.26627C11.2261 4.56621 11.676 4.56621 11.9759 4.26627C12.2759 3.96633 12.2759 3.51642 11.9759 3.21648L8.97653 0.217073C8.90155 0.142088 8.82656 0.0671031 8.75157 0.0671031C8.6016 -0.00788202 8.37665 -0.00788202 8.15169 0.0671031C8.07671 0.0671031 8.00172 0.142088 7.92674 0.217073L4.92734 3.21648C4.62739 3.51642 4.62739 3.96633 4.92734 4.26627C5.22728 4.56621 5.67719 4.56621 5.97713 4.26627Z\",\n      fill: \"#A0A3AD\"\n    })\n  });\n}\nconst Ic = ({\n  url: s\n}) => {\n  const [e, t] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(!1), r = async (n) => {\n    try {\n      await navigator.clipboard.writeText(s), t(!0), setTimeout(() => {\n        t(!1);\n      }, 2e3);\n    } catch (i) {\n      console.error(\"Failed to copy the text to clipboard:\", i);\n    }\n  };\n  return /* @__PURE__ */ q.jsx(\"div\", {\n    children: e ? /* @__PURE__ */ q.jsx(\"svg\", {\n      style: {\n        cursor: \"pointer\",\n        fill: \"green\"\n      },\n      width: \"16\",\n      height: \"15\",\n      viewBox: \"0 0 16 15\",\n      xmlns: \"http://www.w3.org/2000/svg\",\n      children: /* @__PURE__ */ q.jsx(\"path\", {\n        d: \"M5.99967 12.8136L1.71967 8.53364L0.559673 9.69364L5.99967 15.1336L16.4397 4.69364L15.2797 3.53364L5.99967 12.8136Z\"\n      })\n    }) : /* @__PURE__ */ q.jsx(qA, {\n      onClick: r\n    })\n  });\n}, WA = () => /* @__PURE__ */ q.jsxs(\"svg\", {\n  width: \"10\",\n  height: \"10\",\n  viewBox: \"0 0 10 10\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\",\n  children: [/* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M5.85855 0.555664H8.31281M8.31281 0.555664V2.73754M8.31281 0.555664L4.31445 4.11122\",\n    stroke: \"#FFFFFF\",\n    \"stroke-linecap\": \"round\",\n    \"stroke-linejoin\": \"round\"\n  }), /* @__PURE__ */ q.jsx(\"path\", {\n    \"fill-rule\": \"evenodd\",\n    \"clip-rule\": \"evenodd\",\n    d: \"M3.31445 1H1.31445C0.762168 1 0.314453 1.44772 0.314453 2V8C0.314453 8.55228 0.762168 9 1.31445 9H7.31445C7.86674 9 8.31445 8.55228 8.31445 8V6H7.31445V8H1.31445V2H3.31445V1Z\",\n    fill: \"#FFFFFF\"\n  })]\n}), zA = () => /* @__PURE__ */ q.jsx(\"svg\", {\n  width: \"10\",\n  height: \"14\",\n  viewBox: \"0 0 10 14\",\n  fill: \"none\",\n  xmlns: \"http://www.w3.org/2000/svg\",\n  children: /* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M5.01451 12.5187L4.96833 12.5174L4.93914 12.522C4.93113 12.516 4.92402 12.5087 4.91808 12.5005L4.51231 12.7926L4.91808 12.5005C4.9049 12.4822 4.89824 12.46 4.89913 12.4375L4.89953 12.4275V12.4176V8.81194V8.31194H4.39953H1.8876H1.88753C1.76188 8.31196 1.63853 8.27825 1.53036 8.21433C1.42218 8.1504 1.33315 8.05862 1.27256 7.94854C1.21196 7.83847 1.18203 7.71415 1.18588 7.58856C1.18973 7.46301 1.2272 7.34079 1.29438 7.23466C1.2944 7.23463 1.29442 7.23459 1.29444 7.23456L4.90001 1.54377L4.90567 1.53483L4.91095 1.52567C4.92227 1.50601 4.93988 1.49074 4.96094 1.48232C4.982 1.47389 5.00528 1.47281 5.02703 1.47924L5.02912 1.47985C5.05077 1.48614 5.06969 1.4995 5.08286 1.5178C5.09603 1.53609 5.1027 1.55827 5.1018 1.58079L5.10141 1.59073V1.60067V5.20631V5.70631H5.60141H8.11333H8.1134C8.23905 5.70629 8.3624 5.74 8.47058 5.80392C8.57875 5.86784 8.66778 5.95963 8.72838 6.06971C8.78897 6.17978 8.81891 6.3041 8.81506 6.42969C8.81121 6.55528 8.77371 6.67753 8.70649 6.78369L5.10232 12.4723C5.10219 12.4725 5.10205 12.4727 5.10191 12.4729C5.09255 12.4873 5.07969 12.499 5.06452 12.507C5.04914 12.5152 5.03191 12.5192 5.01451 12.5187Z\",\n    stroke: \"#FFFFFF\"\n  })\n}), YA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"button\")({\n  classes: [\"f1hmcrrf\"]\n}), ZA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"f1ki4il6\"]\n}), XA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"bgnz0ud\"]\n}), JA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"img\")({\n  classes: [\"f1gbget9\"]\n}), QA = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"f4rwe4i\"]\n}), eI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"f1qellgw\"]\n}), tI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"input\")({\n  classes: [\"i1hgxwhi\"]\n}), rI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"s1ahcfax\"]\n}), sI = () => {\n  const s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n  return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    if (s.current) {\n      let e = 0;\n      const t = () => {\n        e += 6, s.current && (s.current.style.transform = `rotate(${e}deg)`), requestAnimationFrame(t);\n      };\n      requestAnimationFrame(t);\n    }\n  }, []), /* @__PURE__ */ q.jsx(\"svg\", {\n    ref: s,\n    xmlns: \"http://www.w3.org/2000/svg\",\n    fill: \"none\",\n    viewBox: \"0 0 24 24\",\n    strokeWidth: \"1.5\",\n    stroke: \"currentColor\",\n    className: \"size-6 text-white\",\n    style: {\n      width: \"24px\",\n      height: \"24px\"\n    },\n    children: /* @__PURE__ */ q.jsx(\"path\", {\n      strokeLinecap: \"round\",\n      strokeLinejoin: \"round\",\n      d: \"M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99\"\n    })\n  });\n};\nfunction nI({\n  number: s,\n  text: e,\n  actionType: t,\n  target: r,\n  frameUrl: n,\n  handleOnClick: i\n}) {\n  return /* @__PURE__ */ q.jsxs(YA, {\n    onClick: () => i(s),\n    children: [e, (t === \"link\" || t === \"post_redirect\" || t === \"mint\") && /* @__PURE__ */ q.jsx(WA, {}), t === \"tx\" && /* @__PURE__ */ q.jsx(zA, {})]\n  });\n}\nfunction iI({\n  frame: s,\n  onFrameBtnPress: e\n}) {\n  var h;\n  const [t, r] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(s), [n, i] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), [o, a] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), l = () => {\n    const f = t.buttons.map((p) => /* @__PURE__ */ q.jsx(nI, {\n      number: p.index,\n      text: p.title,\n      actionType: p.action_type,\n      target: p.target,\n      frameUrl: s.frames_url,\n      handleOnClick: (y) => {\n        a(!0), e(y, t, r, n).finally(() => a(!1));\n      }\n    }, p.index));\n    return /* @__PURE__ */ q.jsx(XA, {\n      children: f\n    });\n  }, c = (f) => {\n    i(f);\n  }, u = (f) => {\n    try {\n      return new URL(f).hostname.replace(\"www.\", \"\");\n    } catch {\n      return \"\";\n    }\n  }, d = () => {\n    switch (t.image_aspect_ratio) {\n      case \"1:1\":\n        return {\n          aspectRatio: \"1 / 1\"\n        };\n      case \"1.91:1\":\n        return {\n          aspectRatio: \"1.91 / 1\"\n        };\n      default:\n        return {\n          aspectRatio: \"1.91 / 1\"\n        };\n    }\n  };\n  return /* @__PURE__ */ q.jsxs(q.Fragment, {\n    children: [/* @__PURE__ */ q.jsxs(ZA, {\n      children: [o && /* @__PURE__ */ q.jsx(rI, {\n        children: /* @__PURE__ */ q.jsx(sI, {})\n      }), t.frames_url && /* @__PURE__ */ q.jsxs(q.Fragment, {\n        children: [/* @__PURE__ */ q.jsx(\"a\", {\n          href: t.frames_url,\n          target: \"_blank\",\n          rel: \"noopener noreferrer\",\n          style: {\n            width: \"100%\"\n          },\n          children: /* @__PURE__ */ q.jsx(JA, {\n            src: t.image,\n            alt: `Frame image for ${t.frames_url}`,\n            style: d()\n          })\n        }), ((h = t.input) == null ? void 0 : h.text) && /* @__PURE__ */ q.jsx(tI, {\n          type: \"text\",\n          placeholder: t.input.text,\n          value: n,\n          onChange: (f) => c(f.target.value)\n        }), l()]\n      })]\n    }), t.frames_url && /* @__PURE__ */ q.jsx(QA, {\n      children: u(t.frames_url)\n    })]\n  });\n}\nconst oI = ({\n  frame: s,\n  onFrameBtnPress: e\n}) => /* @__PURE__ */ q.jsx(eI, {\n  children: s ? /* @__PURE__ */ q.jsx(iI, {\n    frame: s,\n    onFrameBtnPress: e\n  }) : /* @__PURE__ */ q.jsx(q.Fragment, {})\n}), aI = ({\n  url: s,\n  onFrameBtnPress: e,\n  initialFrame: t\n}) => {\n  const {\n    client_id: r,\n    showToast: n\n  } = ts(), [i] = du(jn.NEYNAR_AUTHENTICATED_USER, null), [o, a] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [l, c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(t || null), [u, d] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null);\n  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    i ? a(i.signer_uuid) : console.warn(\"No NEYNAR_AUTHENTICATED_USER found in local storage.\");\n  }, [i]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    t || (async () => {\n      try {\n        const y = await lI(`${on}/v2/farcaster/frame/crawl?url=${s}&client_id=${r}`, {\n          method: \"GET\"\n        });\n        if (y.ok) {\n          const b = (await y.json()).frame;\n          if (Object.keys(b).length === 0)\n            throw new Error(\"No frame data available\");\n          c(b), d(null);\n        } else\n          throw new Error(`HTTP error! status: ${y.status}`);\n      } catch (y) {\n        console.error(`An error occurred: ${y}`), d(`Failed to fetch: ${y.message}`);\n      }\n    })();\n  }, [s, n, t]);\n  const h = (p) => {\n    if (typeof p != \"object\" || p === null) return !1;\n    const y = [\"version\", \"image\", \"buttons\", \"frames_url\"];\n    for (const E of y)\n      if (!(E in p)) return !1;\n    return !(!Array.isArray(p.buttons) || p.buttons.some((E) => typeof E.index != \"number\"));\n  }, f = async (p, y, E, b) => {\n    try {\n      const R = await e(p, y, E, b);\n      if (!h(R))\n        throw new Error(\"Invalid frame data received\");\n      E(R);\n    } catch (R) {\n      n(xg.Error, `An error occurred while processing the button press: ${R}`);\n    }\n  };\n  return u ? /* @__PURE__ */ q.jsx(\"div\", {\n    style: {\n      color: \"red\",\n      padding: \"10px\",\n      border: \"1px solid red\",\n      borderRadius: \"5px\"\n    },\n    children: u\n  }) : /* @__PURE__ */ q.jsx(oI, {\n    frame: l,\n    onFrameBtnPress: f\n  });\n};\nfunction lI(s, e, t = 8e3) {\n  return Promise.race([an(s, e), new Promise((r, n) => setTimeout(() => n(new Error(\"Request timed out\")), t))]);\n}\nfunction pf(s) {\n  const e = Math.min(s, 1e9);\n  return e >= 1e9 ? Math.floor(e / 1e8) / 10 + \"B\" : e >= 1e6 ? Math.floor(e / 1e5) / 10 + \"M\" : e >= 1e3 ? Math.floor(e / 100) / 10 + \"K\" : e.toString();\n}\nfunction cI(s) {\n  if (!s)\n    return console.error(\"Error: Timestamp is undefined or empty.\"), \"Invalid timestamp\";\n  const e = new Date(s);\n  if (isNaN(e.getTime()))\n    return console.error(\"Error: Invalid timestamp provided:\", s), \"Invalid timestamp\";\n  const t = /* @__PURE__ */ new Date(), n = new Intl.DateTimeFormat(void 0, {\n    hour: \"numeric\",\n    minute: \"2-digit\",\n    hour12: !0\n  }).format(e).replace(\" \", \"\"), i = t.toDateString() === e.toDateString(), o = new Date(t.setDate(t.getDate() - 1)).toDateString() === e.toDateString();\n  if (i)\n    return `${n}, today`;\n  if (o)\n    return `${n}, yesterday`;\n  const a = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"], l = e.getDate(), c = a[e.getMonth()], u = e.getFullYear(), h = `${c} ${((f) => {\n    if (f > 3 && f < 21) return `${f}th`;\n    const p = [\"st\", \"nd\", \"rd\"], y = f % 10;\n    return `${f}${p[y - 1] || \"th\"}`;\n  })(l)} ${u}`;\n  return `${n}, ${h}`;\n}\nconst uI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"sxqvxvq\"]\n}), dI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"a\")({\n  classes: [\"s3kamov\"]\n}), hI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"m1wrvvhk\"]\n}), fI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"t1lcaq27\"]\n}), gI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"ugtp1wh\"]\n}), pI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"l1dqpn4e\"]\n}), mI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"l1bjnv2t\"]\n}), mf = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"e15yf123\"]\n}), yI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"rxra94g\"]\n}), yf = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"s1whgqrs\"]\n}), vI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"p\")({\n  classes: [\"dz8marf\"]\n}), oa = react__WEBPACK_IMPORTED_MODULE_0___default().memo(({\n  username: s,\n  displayName: e,\n  avatarImgUrl: t,\n  text: r = \"\",\n  hash: n,\n  reactions: i,\n  replies: o,\n  embeds: a = [],\n  frames: l = [],\n  channel: c,\n  viewerFid: u,\n  hasPowerBadge: d,\n  isEmbed: h = !0,\n  allowReactions: f,\n  renderEmbeds: p,\n  renderFrames: y,\n  onLikeBtnPress: E,\n  onRecastBtnPress: b,\n  onCommentBtnPress: R,\n  onFrameBtnPress: A,\n  direct_replies: F,\n  containerStyles: M,\n  textStyles: H,\n  timestamp: K,\n  appAvatarImgUrl: j\n}) => {\n  const [C, k] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(i.likes_count), [$, W] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(i.likes.some((V) => V.fid === u)), _ = /* @__PURE__ */ q.jsx(mI, {\n    children: ES(r, a)\n  }), g = (a == null ? void 0 : a.length) === 1, x = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => l.map((V) => V.frames_url), [l]), w = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => a.filter((V) => !x.includes(V.url)), [a, x]), D = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)((V) => {\n    V.currentTarget.src = bi;\n  }, []);\n  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    W(i.likes.some((V) => V.fid === u));\n  }, [i.likes, u]);\n  const O = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => E && E() ? (k((L) => L + 1), W(!$), !0) : !1, [E]), U = OA(w, f, u);\n  return /* @__PURE__ */ q.jsx(uI, {\n    style: {\n      ...M,\n      borderWidth: h ? \"1px\" : \"0\"\n    },\n    children: /* @__PURE__ */ q.jsxs(Pr, {\n      children: [/* @__PURE__ */ q.jsx(Ir, {\n        spacingRight: \"10px\",\n        children: /* @__PURE__ */ q.jsx(Yo, {\n          src: t && t.length > 0 ? t : bi,\n          width: \"20px\",\n          height: \"20px\",\n          onError: D,\n          loading: \"lazy\",\n          alt: `${e ?? \"Skeleton\"} Avatar`\n        })\n      }), /* @__PURE__ */ q.jsxs(hI, {\n        children: [/* @__PURE__ */ q.jsxs(Pr, {\n          flexGrow: 1,\n          alignItems: \"center\",\n          children: [/* @__PURE__ */ q.jsxs(Pr, {\n            children: [/* @__PURE__ */ q.jsx(vI, {\n              children: e\n            }), \" \", j && /* @__PURE__ */ q.jsx(Ir, {\n              spacingLeft: \"5px\",\n              children: /* @__PURE__ */ q.jsx(\"img\", {\n                style: {\n                  padding: \"2px\",\n                  borderWidth: \"0.5px\"\n                },\n                className: \"border-white rounded-full\",\n                src: j,\n                width: \"18\",\n                height: \"18\",\n                onError: (V) => {\n                  V.currentTarget.style.display = \"none\";\n                }\n              })\n            })]\n          }), /* @__PURE__ */ q.jsxs(Pr, {\n            alignItems: \"center\",\n            children: [/* @__PURE__ */ q.jsxs(gI, {\n              children: [\"@\", s, \" ·\"]\n            }), \" \", /* @__PURE__ */ q.jsx(fI, {\n              style: {\n                color: \"#999999\",\n                fontSize: \"14px\",\n                fontFamily: \"Work Sans\"\n              },\n              children: cI(K)\n            })]\n          })]\n        }), /* @__PURE__ */ q.jsx(Ir, {\n          style: {\n            marginTop: \"10px\"\n          },\n          children: /* @__PURE__ */ q.jsx(pI, {\n            style: H,\n            children: _\n          })\n        }), p && w && w.length > 0 ? /* @__PURE__ */ q.jsx(mf, {\n          style: {\n            margin: g ? \"4px 0\" : \"0\"\n          },\n          children: U.map((V, L) => /* @__PURE__ */ q.jsx(\"div\", {\n            style: {\n              width: \"100%\"\n            },\n            children: V\n          }, L))\n        }) : /* @__PURE__ */ q.jsx(q.Fragment, {}), y && l && l.length > 0 ? /* @__PURE__ */ q.jsx(mf, {\n          children: l.map((V) => /* @__PURE__ */ q.jsx(aI, {\n            url: V.frames_url,\n            initialFrame: V,\n            onFrameBtnPress: A\n          }, V.frames_url))\n        }) : null, /* @__PURE__ */ q.jsxs(yI, {\n          style: {\n            justifyContent: f ? \"space-between\" : \"flex-end\"\n          },\n          children: [f && /* @__PURE__ */ q.jsx(HA, {\n            hash: n,\n            reactions: i,\n            onComment: R,\n            onRecast: b,\n            onLike: O,\n            isLiked: $\n          }), f && s && n && /* @__PURE__ */ q.jsx(Ic, {\n            url: `https://farcaster.xyz/${s}/${n.slice(0, 10)}`\n          })]\n        }), /* @__PURE__ */ q.jsxs(yf, {\n          style: {\n            justifyContent: f ? \"\" : \"space-between\",\n            marginTop: \"10px\"\n          },\n          children: [/* @__PURE__ */ q.jsxs(yf, {\n            style: {\n              justifyContent: f ? \"\" : \"space-between\",\n              gap: 6\n            },\n            children: [/* @__PURE__ */ q.jsxs(\"div\", {\n              style: {\n                display: \"flex\",\n                alignItems: \"center\",\n                gap: \"4px\",\n                color: \"#999999\"\n              },\n              children: [/* @__PURE__ */ q.jsx(tm, {}), o]\n            }), /* @__PURE__ */ q.jsx(\"div\", {\n              style: {\n                padding: \"0px 10px\"\n              }\n            }), /* @__PURE__ */ q.jsxs(\"div\", {\n              style: {\n                display: \"flex\",\n                alignItems: \"center\",\n                gap: \"4px\",\n                color: \"#999999\"\n              },\n              children: [/* @__PURE__ */ q.jsx(rm, {}), \" \", C]\n            }), c && /* @__PURE__ */ q.jsxs(q.Fragment, {\n              children: [/* @__PURE__ */ q.jsx(\"div\", {}), /* @__PURE__ */ q.jsxs(dI, {\n                href: `https://farcaster.xyz/~/channel/${c.id}`,\n                target: \"_blank\",\n                children: [\"/\", c.id]\n              })]\n            })]\n          }), !f && s && n && /* @__PURE__ */ q.jsx(Ic, {\n            url: `https://farcaster.xyz/${s}/${n.slice(0, 10)}`\n          })]\n        })]\n      })]\n    })\n  });\n}), EI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"s1m6ob1a\"]\n}), vf = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"r1esevc7\"]\n}), Ef = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"vxb1f00\"]\n}), xI = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"htv0qz7\"]\n}), xf = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"rzksy2\"]\n});\nfunction SI(s) {\n  return /* @__PURE__ */ q.jsx(EI, {\n    children: s.casts.map((e, t) => /* @__PURE__ */ q.jsxs(vf, {\n      children: [t !== 0 && /* @__PURE__ */ q.jsx(Ef, {\n        style: {\n          left: \"42px\"\n        }\n      }), /* @__PURE__ */ q.jsxs(xf, {\n        children: [/* @__PURE__ */ q.jsx(oa, {\n          isEmbed: !1,\n          ...e\n        }), t === 0 && /* @__PURE__ */ q.jsx(xI, {}), e.direct_replies && e.direct_replies.length > 0 && e.direct_replies.map((r, n) => /* @__PURE__ */ q.jsxs(vf, {\n          children: [/* @__PURE__ */ q.jsx(Ef, {\n            style: {\n              left: \"42px\"\n            }\n          }), /* @__PURE__ */ q.jsx(xf, {\n            children: /* @__PURE__ */ q.jsx(oa, {\n              isEmbed: !1,\n              ...r\n            })\n          })]\n        }, n))]\n      })]\n    }, t))\n  });\n}\nasync function bI({\n  type: s,\n  identifier: e,\n  replyDepth: t = 2,\n  includeChronologicalParentCasts: r = !1,\n  limit: n = 20,\n  viewerFid: i,\n  clientId: o\n}) {\n  try {\n    let a = `${on}/v2/farcaster/cast/conversation?identifier=${encodeURIComponent(e)}&type=${s}&reply_depth=${t}&include_chronological_parent_casts=${r}&limit=${n}&client_id=${o}`;\n    return i && (a += `&viewer_fid=${i}`), await (await an(a, {\n      method: \"GET\",\n      headers: {\n        accept: \"application/json\"\n      }\n    })).json() || null;\n  } catch (a) {\n    return console.error(\"Error fetching conversation\", a), null;\n  }\n}\nfunction nm(s) {\n  return {\n    username: s.author.username,\n    displayName: s.author.display_name,\n    avatarImgUrl: s.author.pfp_url,\n    text: s.text,\n    hash: s.hash,\n    reactions: s.reactions,\n    replies: s.replies.count,\n    embeds: s.embeds,\n    frames: s.frames,\n    renderEmbeds: s.renderEmbeds,\n    channel: s.channel,\n    viewerFid: 2,\n    hasPowerBadge: s.author.power_badge,\n    appAvatarImgUrl: s.app.pfp_url,\n    isOwnProfile: !1,\n    allowReactions: !0,\n    renderFrames: !1,\n    direct_replies: s.direct_replies ? s.direct_replies.map(nm) : [],\n    timestamp: s.timestamp\n  };\n}\nfunction TI(s) {\n  const e = [];\n  return s.cast && e.push(nm(s.cast)), e;\n}\nconst mR = ({\n  type: s,\n  identifier: e,\n  replyDepth: t = 2,\n  includeChronologicalParentCasts: r = !1,\n  limit: n = 20,\n  viewerFid: i\n}) => {\n  const {\n    client_id: o\n  } = ts(), [a, l] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(null), [c, u] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(!0), [d, h] = react__WEBPACK_IMPORTED_MODULE_0___default().useState(null);\n  return react__WEBPACK_IMPORTED_MODULE_0___default().useEffect(() => {\n    u(!0), h(null), bI({\n      type: s,\n      identifier: e,\n      replyDepth: t,\n      includeChronologicalParentCasts: r,\n      limit: n,\n      viewerFid: i,\n      clientId: o\n    }).then((f) => {\n      l(f);\n    }).catch((f) => {\n      h(f);\n    }).finally(() => {\n      u(!1);\n    });\n  }, [s, e, t, r, n, i, o]), c ? /* @__PURE__ */ q.jsx(q.Fragment, {\n    children: \" \"\n  }) : d ? /* @__PURE__ */ q.jsx(q.Fragment, {\n    children: \" \"\n  }) : /* @__PURE__ */ q.jsx(SI, {\n    casts: TI(a.conversation)\n  });\n};\nvar Ol = { exports: {} }, Bl = {};\n/**\n * @license React\n * use-sync-external-store-shim.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nvar Sf;\nfunction wI() {\n  if (Sf) return Bl;\n  Sf = 1;\n  var s = (react__WEBPACK_IMPORTED_MODULE_0___default());\n  function e(d, h) {\n    return d === h && (d !== 0 || 1 / d === 1 / h) || d !== d && h !== h;\n  }\n  var t = typeof Object.is == \"function\" ? Object.is : e, r = s.useState, n = s.useEffect, i = s.useLayoutEffect, o = s.useDebugValue;\n  function a(d, h) {\n    var f = h(), p = r({ inst: { value: f, getSnapshot: h } }), y = p[0].inst, E = p[1];\n    return i(\n      function() {\n        y.value = f, y.getSnapshot = h, l(y) && E({ inst: y });\n      },\n      [d, f, h]\n    ), n(\n      function() {\n        return l(y) && E({ inst: y }), d(function() {\n          l(y) && E({ inst: y });\n        });\n      },\n      [d]\n    ), o(f), f;\n  }\n  function l(d) {\n    var h = d.getSnapshot;\n    d = d.value;\n    try {\n      var f = h();\n      return !t(d, f);\n    } catch {\n      return !0;\n    }\n  }\n  function c(d, h) {\n    return h();\n  }\n  var u = typeof window > \"u\" || typeof window.document > \"u\" || typeof window.document.createElement > \"u\" ? c : a;\n  return Bl.useSyncExternalStore = s.useSyncExternalStore !== void 0 ? s.useSyncExternalStore : u, Bl;\n}\nvar bf;\nfunction AI() {\n  return bf || (bf = 1, Ol.exports = wI()), Ol.exports;\n}\nvar im = AI();\nconst om = 0, am = 1, lm = 2, Tf = 3;\nvar wf = Object.prototype.hasOwnProperty;\nfunction _c(s, e) {\n  var t, r;\n  if (s === e) return !0;\n  if (s && e && (t = s.constructor) === e.constructor) {\n    if (t === Date) return s.getTime() === e.getTime();\n    if (t === RegExp) return s.toString() === e.toString();\n    if (t === Array) {\n      if ((r = s.length) === e.length)\n        for (; r-- && _c(s[r], e[r]); ) ;\n      return r === -1;\n    }\n    if (!t || typeof s == \"object\") {\n      r = 0;\n      for (t in s)\n        if (wf.call(s, t) && ++r && !wf.call(e, t) || !(t in e) || !_c(s[t], e[t])) return !1;\n      return Object.keys(e).length === r;\n    }\n  }\n  return s !== s && e !== e;\n}\nconst qr = /* @__PURE__ */ new WeakMap(), Cs = () => {\n}, qt = (\n  /*#__NOINLINE__*/\n  Cs()\n), Rc = Object, $e = (s) => s === qt, Mr = (s) => typeof s == \"function\", Bs = (s, e) => ({\n  ...s,\n  ...e\n}), cm = (s) => Mr(s.then), Fl = {}, oo = {}, Fu = \"undefined\", Pi = typeof window != Fu, Lc = typeof document != Fu, II = Pi && \"Deno\" in window, _I = () => Pi && typeof window.requestAnimationFrame != Fu, _s = (s, e) => {\n  const t = qr.get(s);\n  return [\n    // Getter\n    () => !$e(e) && s.get(e) || Fl,\n    // Setter\n    (r) => {\n      if (!$e(e)) {\n        const n = s.get(e);\n        e in oo || (oo[e] = n), t[5](e, Bs(n, r), n || Fl);\n      }\n    },\n    // Subscriber\n    t[6],\n    // Get server cache snapshot\n    () => !$e(e) && e in oo ? oo[e] : !$e(e) && s.get(e) || Fl\n  ];\n};\nlet Cc = !0;\nconst RI = () => Cc, [kc, Dc] = Pi && window.addEventListener ? [\n  window.addEventListener.bind(window),\n  window.removeEventListener.bind(window)\n] : [\n  Cs,\n  Cs\n], LI = () => {\n  const s = Lc && document.visibilityState;\n  return $e(s) || s !== \"hidden\";\n}, CI = (s) => (Lc && document.addEventListener(\"visibilitychange\", s), kc(\"focus\", s), () => {\n  Lc && document.removeEventListener(\"visibilitychange\", s), Dc(\"focus\", s);\n}), kI = (s) => {\n  const e = () => {\n    Cc = !0, s();\n  }, t = () => {\n    Cc = !1;\n  };\n  return kc(\"online\", e), kc(\"offline\", t), () => {\n    Dc(\"online\", e), Dc(\"offline\", t);\n  };\n}, DI = {\n  isOnline: RI,\n  isVisible: LI\n}, PI = {\n  initFocus: CI,\n  initReconnect: kI\n}, Af = !(react__WEBPACK_IMPORTED_MODULE_0___default().useId), Ti = !Pi || II, MI = (s) => _I() ? window.requestAnimationFrame(s) : setTimeout(s, 1), So = Ti ? react__WEBPACK_IMPORTED_MODULE_0__.useEffect : react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect, Nl = typeof navigator < \"u\" && navigator.connection, If = !Ti && Nl && ([\n  \"slow-2g\",\n  \"2g\"\n].includes(Nl.effectiveType) || Nl.saveData), ao = /* @__PURE__ */ new WeakMap(), OI = (s) => Rc.prototype.toString.call(s), Ul = (s, e) => s === `[object ${e}]`;\nlet BI = 0;\nconst Pc = (s) => {\n  const e = typeof s, t = OI(s), r = Ul(t, \"Date\"), n = Ul(t, \"RegExp\"), i = Ul(t, \"Object\");\n  let o, a;\n  if (Rc(s) === s && !r && !n) {\n    if (o = ao.get(s), o) return o;\n    if (o = ++BI + \"~\", ao.set(s, o), Array.isArray(s)) {\n      for (o = \"@\", a = 0; a < s.length; a++)\n        o += Pc(s[a]) + \",\";\n      ao.set(s, o);\n    }\n    if (i) {\n      o = \"#\";\n      const l = Rc.keys(s).sort();\n      for (; !$e(a = l.pop()); )\n        $e(s[a]) || (o += a + \":\" + Pc(s[a]) + \",\");\n      ao.set(s, o);\n    }\n  } else\n    o = r ? s.toJSON() : e == \"symbol\" ? s.toString() : e == \"string\" ? JSON.stringify(s) : \"\" + s;\n  return o;\n}, wi = (s) => {\n  if (Mr(s))\n    try {\n      s = s();\n    } catch {\n      s = \"\";\n    }\n  const e = s;\n  return s = typeof s == \"string\" ? s : (Array.isArray(s) ? s.length : s) ? Pc(s) : \"\", [\n    s,\n    e\n  ];\n};\nlet FI = 0;\nconst Mc = () => ++FI;\nasync function um(...s) {\n  const [e, t, r, n] = s, i = Bs({\n    populateCache: !0,\n    throwOnError: !0\n  }, typeof n == \"boolean\" ? {\n    revalidate: n\n  } : n || {});\n  let o = i.populateCache;\n  const a = i.rollbackOnError;\n  let l = i.optimisticData;\n  const c = (h) => typeof a == \"function\" ? a(h) : a !== !1, u = i.throwOnError;\n  if (Mr(t)) {\n    const h = t, f = [], p = e.keys();\n    for (const y of p)\n      // Skip the special useSWRInfinite and useSWRSubscription keys.\n      !/^\\$(inf|sub)\\$/.test(y) && h(e.get(y)._k) && f.push(y);\n    return Promise.all(f.map(d));\n  }\n  return d(t);\n  async function d(h) {\n    const [f] = wi(h);\n    if (!f) return;\n    const [p, y] = _s(e, f), [E, b, R, A] = qr.get(e), F = () => {\n      const g = E[f];\n      return (Mr(i.revalidate) ? i.revalidate(p().data, h) : i.revalidate !== !1) && (delete R[f], delete A[f], g && g[0]) ? g[0](lm).then(() => p().data) : p().data;\n    };\n    if (s.length < 3)\n      return F();\n    let M = r, H, K = !1;\n    const j = Mc();\n    b[f] = [\n      j,\n      0\n    ];\n    const C = !$e(l), k = p(), $ = k.data, W = k._c, _ = $e(W) ? $ : W;\n    if (C && (l = Mr(l) ? l(_, $) : l, y({\n      data: l,\n      _c: _\n    })), Mr(M))\n      try {\n        M = M(_);\n      } catch (g) {\n        H = g, K = !0;\n      }\n    if (M && cm(M))\n      if (M = await M.catch((g) => {\n        H = g, K = !0;\n      }), j !== b[f][0]) {\n        if (K) throw H;\n        return M;\n      } else K && C && c(H) && (o = !0, y({\n        data: _,\n        _c: qt\n      }));\n    if (o && !K)\n      if (Mr(o)) {\n        const g = o(M, _);\n        y({\n          data: g,\n          error: qt,\n          _c: qt\n        });\n      } else\n        y({\n          data: M,\n          error: qt,\n          _c: qt\n        });\n    if (b[f][1] = Mc(), Promise.resolve(F()).then(() => {\n      y({\n        _c: qt\n      });\n    }), K) {\n      if (u) throw H;\n      return;\n    }\n    return M;\n  }\n}\nconst _f = (s, e) => {\n  for (const t in s)\n    s[t][0] && s[t][0](e);\n}, NI = (s, e) => {\n  if (!qr.has(s)) {\n    const t = Bs(PI, e), r = /* @__PURE__ */ Object.create(null), n = um.bind(qt, s);\n    let i = Cs;\n    const o = /* @__PURE__ */ Object.create(null), a = (u, d) => {\n      const h = o[u] || [];\n      return o[u] = h, h.push(d), () => h.splice(h.indexOf(d), 1);\n    }, l = (u, d, h) => {\n      s.set(u, d);\n      const f = o[u];\n      if (f)\n        for (const p of f)\n          p(d, h);\n    }, c = () => {\n      if (!qr.has(s) && (qr.set(s, [\n        r,\n        /* @__PURE__ */ Object.create(null),\n        /* @__PURE__ */ Object.create(null),\n        /* @__PURE__ */ Object.create(null),\n        n,\n        l,\n        a\n      ]), !Ti)) {\n        const u = t.initFocus(setTimeout.bind(qt, _f.bind(qt, r, om))), d = t.initReconnect(setTimeout.bind(qt, _f.bind(qt, r, am)));\n        i = () => {\n          u && u(), d && d(), qr.delete(s);\n        };\n      }\n    };\n    return c(), [\n      s,\n      n,\n      c,\n      i\n    ];\n  }\n  return [\n    s,\n    qr.get(s)[4]\n  ];\n}, UI = (s, e, t, r, n) => {\n  const i = t.errorRetryCount, o = n.retryCount, a = ~~((Math.random() + 0.5) * (1 << (o < 8 ? o : 8))) * t.errorRetryInterval;\n  !$e(i) && o > i || setTimeout(r, a, n);\n}, $I = _c, [Nu, GI] = NI(/* @__PURE__ */ new Map()), VI = Bs(\n  {\n    // events\n    onLoadingSlow: Cs,\n    onSuccess: Cs,\n    onError: Cs,\n    onErrorRetry: UI,\n    onDiscarded: Cs,\n    // switches\n    revalidateOnFocus: !0,\n    revalidateOnReconnect: !0,\n    revalidateIfStale: !0,\n    shouldRetryOnError: !0,\n    // timeouts\n    errorRetryInterval: If ? 1e4 : 5e3,\n    focusThrottleInterval: 5 * 1e3,\n    dedupingInterval: 2 * 1e3,\n    loadingTimeout: If ? 5e3 : 3e3,\n    // providers\n    compare: $I,\n    isPaused: () => !1,\n    cache: Nu,\n    mutate: GI,\n    fallback: {}\n  },\n  // use web preset by default\n  DI\n), jI = (s, e) => {\n  const t = Bs(s, e);\n  if (e) {\n    const { use: r, fallback: n } = s, { use: i, fallback: o } = e;\n    r && i && (t.use = r.concat(i)), n && o && (t.fallback = Bs(n, o));\n  }\n  return t;\n}, KI = (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)({}), dm = \"$inf$\", hm = Pi && window.__SWR_DEVTOOLS_USE__, HI = hm ? window.__SWR_DEVTOOLS_USE__ : [], qI = () => {\n  hm && (window.__SWR_DEVTOOLS_REACT__ = (react__WEBPACK_IMPORTED_MODULE_0___default()));\n}, fm = (s) => Mr(s[1]) ? [\n  s[0],\n  s[1],\n  s[2] || {}\n] : [\n  s[0],\n  null,\n  (s[1] === null ? s[2] : s[1]) || {}\n], WI = () => {\n  const s = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(KI);\n  return (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => Bs(VI, s), [\n    s\n  ]);\n}, zI = (s) => (e, t, r) => s(e, t && ((...i) => {\n  const [o] = wi(e), [, , , a] = qr.get(Nu);\n  if (o.startsWith(dm))\n    return t(...i);\n  const l = a[o];\n  return $e(l) ? t(...i) : (delete a[o], l);\n}), r), YI = HI.concat(zI), ZI = (s) => function(...t) {\n  const r = WI(), [n, i, o] = fm(t), a = jI(r, o);\n  let l = s;\n  const { use: c } = a, u = (c || []).concat(YI);\n  for (let d = u.length; d--; )\n    l = u[d](l);\n  return l(n, i || a.fetcher || null, a);\n}, XI = (s, e, t) => {\n  const r = e[s] || (e[s] = []);\n  return r.push(t), () => {\n    const n = r.indexOf(t);\n    n >= 0 && (r[n] = r[r.length - 1], r.pop());\n  };\n}, JI = (s, e) => (...t) => {\n  const [r, n, i] = fm(t), o = (i.use || []).concat(e);\n  return s(r, n, {\n    ...i,\n    use: o\n  });\n};\nqI();\nconst $l = (react__WEBPACK_IMPORTED_MODULE_0___default().use) || // This extra generic is to avoid TypeScript mixing up the generic and JSX sytax\n// and emitting an error.\n// We assume that this is only for the `use(thenable)` case, not `use(context)`.\n// https://github.com/facebook/react/blob/aed00dacfb79d17c53218404c52b1c7aa59c4a89/packages/react-server/src/ReactFizzThenable.js#L45\n((s) => {\n  switch (s.status) {\n    case \"pending\":\n      throw s;\n    case \"fulfilled\":\n      return s.value;\n    case \"rejected\":\n      throw s.reason;\n    default:\n      throw s.status = \"pending\", s.then((e) => {\n        s.status = \"fulfilled\", s.value = e;\n      }, (e) => {\n        s.status = \"rejected\", s.reason = e;\n      }), s;\n  }\n}), Gl = {\n  dedupe: !0\n}, Rf = Promise.resolve(qt), QI = (s, e, t) => {\n  const { cache: r, compare: n, suspense: i, fallbackData: o, revalidateOnMount: a, revalidateIfStale: l, refreshInterval: c, refreshWhenHidden: u, refreshWhenOffline: d, keepPreviousData: h } = t, [f, p, y, E] = qr.get(r), [b, R] = wi(s), A = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!1), F = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!1), M = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(b), H = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(e), K = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(t), j = () => K.current, C = () => j().isVisible() && j().isOnline(), [k, $, W, _] = _s(r, b), g = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)({}).current, x = $e(o) ? $e(t.fallback) ? qt : t.fallback[b] : o, w = (_e, xe) => {\n    for (const Be in g) {\n      const ye = Be;\n      if (ye === \"data\") {\n        if (!n(_e[ye], xe[ye]) && (!$e(_e[ye]) || !n(N, xe[ye])))\n          return !1;\n      } else if (xe[ye] !== _e[ye])\n        return !1;\n    }\n    return !0;\n  }, D = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n    const _e = !b || !e ? !1 : $e(a) ? j().isPaused() || i ? !1 : l !== !1 : a, xe = (we) => {\n      const Ne = Bs(we);\n      return delete Ne._k, _e ? {\n        isValidating: !0,\n        isLoading: !0,\n        ...Ne\n      } : Ne;\n    }, Be = k(), ye = _(), be = xe(Be), Fe = Be === ye ? be : xe(ye);\n    let Xe = be;\n    return [\n      () => {\n        const we = xe(k());\n        return w(we, Xe) ? (Xe.data = we.data, Xe.isLoading = we.isLoading, Xe.isValidating = we.isValidating, Xe.error = we.error, Xe) : (Xe = we, we);\n      },\n      () => Fe\n    ];\n  }, [\n    r,\n    b\n  ]), O = im.useSyncExternalStore((0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n    (_e) => W(b, (xe, Be) => {\n      w(Be, xe) || _e();\n    }),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      r,\n      b\n    ]\n  ), D[0], D[1]), U = !A.current, V = f[b] && f[b].length > 0, L = O.data, m = $e(L) ? x && cm(x) ? $l(x) : x : L, v = O.error, P = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(m), N = h ? $e(L) ? $e(P.current) ? m : P.current : L : m, Y = V && !$e(v) ? !1 : U && !$e(a) ? a : j().isPaused() ? !1 : i ? $e(m) ? !1 : l : $e(m) || l, ee = !!(b && e && U && Y), ie = $e(O.isValidating) ? ee : O.isValidating, le = $e(O.isLoading) ? ee : O.isLoading, Te = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n    async (_e) => {\n      const xe = H.current;\n      if (!b || !xe || F.current || j().isPaused())\n        return !1;\n      let Be, ye, be = !0;\n      const Fe = _e || {}, Xe = !y[b] || !Fe.dedupe, we = () => Af ? !F.current && b === M.current && A.current : b === M.current, Ne = {\n        isValidating: !1,\n        isLoading: !1\n      }, dt = () => {\n        $(Ne);\n      }, Je = () => {\n        const it = y[b];\n        it && it[1] === ye && delete y[b];\n      }, Qe = {\n        isValidating: !0\n      };\n      $e(k().data) && (Qe.isLoading = !0);\n      try {\n        if (Xe && ($(Qe), t.loadingTimeout && $e(k().data) && setTimeout(() => {\n          be && we() && j().onLoadingSlow(b, t);\n        }, t.loadingTimeout), y[b] = [\n          xe(R),\n          Mc()\n        ]), [Be, ye] = y[b], Be = await Be, Xe && setTimeout(Je, t.dedupingInterval), !y[b] || y[b][1] !== ye)\n          return Xe && we() && j().onDiscarded(b), !1;\n        Ne.error = qt;\n        const it = p[b];\n        if (!$e(it) && // case 1\n        (ye <= it[0] || // case 2\n        ye <= it[1] || // case 3\n        it[1] === 0))\n          return dt(), Xe && we() && j().onDiscarded(b), !1;\n        const je = k().data;\n        Ne.data = n(je, Be) ? je : Be, Xe && we() && j().onSuccess(Be, b, t);\n      } catch (it) {\n        Je();\n        const je = j(), { shouldRetryOnError: B } = je;\n        je.isPaused() || (Ne.error = it, Xe && we() && (je.onError(it, b, je), (B === !0 || Mr(B) && B(it)) && (!j().revalidateOnFocus || !j().revalidateOnReconnect || C()) && je.onErrorRetry(it, b, je, (S) => {\n          const T = f[b];\n          T && T[0] && T[0](Tf, S);\n        }, {\n          retryCount: (Fe.retryCount || 0) + 1,\n          dedupe: !0\n        })));\n      }\n      return be = !1, dt(), !0;\n    },\n    // `setState` is immutable, and `eventsCallback`, `fnArg`, and\n    // `keyValidating` are depending on `key`, so we can exclude them from\n    // the deps array.\n    //\n    // FIXME:\n    // `fn` and `config` might be changed during the lifecycle,\n    // but they might be changed every render like this.\n    // `useSWR('key', () => fetch('/api/'), { suspense: true })`\n    // So we omit the values from the deps array\n    // even though it might cause unexpected behaviors.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      b,\n      r\n    ]\n  ), De = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n    // Use callback to make sure `keyRef.current` returns latest result every time\n    (..._e) => um(r, M.current, ..._e),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    []\n  );\n  if (So(() => {\n    H.current = e, K.current = t, $e(L) || (P.current = L);\n  }), So(() => {\n    if (!b) return;\n    const _e = Te.bind(qt, Gl);\n    let xe = 0;\n    j().revalidateOnFocus && (xe = Date.now() + j().focusThrottleInterval);\n    const ye = XI(b, f, (be, Fe = {}) => {\n      if (be == om) {\n        const Xe = Date.now();\n        j().revalidateOnFocus && Xe > xe && C() && (xe = Xe + j().focusThrottleInterval, _e());\n      } else if (be == am)\n        j().revalidateOnReconnect && C() && _e();\n      else {\n        if (be == lm)\n          return Te();\n        if (be == Tf)\n          return Te(Fe);\n      }\n    });\n    return F.current = !1, M.current = b, A.current = !0, $({\n      _k: R\n    }), Y && (y[b] || ($e(m) || Ti ? _e() : MI(_e))), () => {\n      F.current = !0, ye();\n    };\n  }, [\n    b\n  ]), So(() => {\n    let _e;\n    function xe() {\n      const ye = Mr(c) ? c(k().data) : c;\n      ye && _e !== -1 && (_e = setTimeout(Be, ye));\n    }\n    function Be() {\n      !k().error && (u || j().isVisible()) && (d || j().isOnline()) ? Te(Gl).then(xe) : xe();\n    }\n    return xe(), () => {\n      _e && (clearTimeout(_e), _e = -1);\n    };\n  }, [\n    c,\n    u,\n    d,\n    b\n  ]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useDebugValue)(N), i) {\n    const _e = b && $e(m);\n    if (!Af && Ti && _e)\n      throw new Error(\"Fallback data is required when using Suspense in SSR.\");\n    _e && (H.current = e, K.current = t, F.current = !1);\n    const xe = E[b], Be = !$e(xe) && _e ? De(xe) : Rf;\n    if ($l(Be), !$e(v) && _e)\n      throw v;\n    const ye = _e ? Te(Gl) : Rf;\n    !$e(N) && _e && (ye.status = \"fulfilled\", ye.value = !0), $l(ye);\n  }\n  return {\n    mutate: De,\n    get data() {\n      return g.data = !0, N;\n    },\n    get error() {\n      return g.error = !0, v;\n    },\n    get isValidating() {\n      return g.isValidating = !0, ie;\n    },\n    get isLoading() {\n      return g.isLoading = !0, le;\n    }\n  };\n}, e_ = ZI(QI), t_ = () => {\n}, r_ = (\n  /*#__NOINLINE__*/\n  t_()\n), Oc = Object, Lf = (s) => s === r_, s_ = (s) => typeof s == \"function\", lo = /* @__PURE__ */ new WeakMap(), n_ = (s) => Oc.prototype.toString.call(s), Vl = (s, e) => s === `[object ${e}]`;\nlet i_ = 0;\nconst Bc = (s) => {\n  const e = typeof s, t = n_(s), r = Vl(t, \"Date\"), n = Vl(t, \"RegExp\"), i = Vl(t, \"Object\");\n  let o, a;\n  if (Oc(s) === s && !r && !n) {\n    if (o = lo.get(s), o) return o;\n    if (o = ++i_ + \"~\", lo.set(s, o), Array.isArray(s)) {\n      for (o = \"@\", a = 0; a < s.length; a++)\n        o += Bc(s[a]) + \",\";\n      lo.set(s, o);\n    }\n    if (i) {\n      o = \"#\";\n      const l = Oc.keys(s).sort();\n      for (; !Lf(a = l.pop()); )\n        Lf(s[a]) || (o += a + \":\" + Bc(s[a]) + \",\");\n      lo.set(s, o);\n    }\n  } else\n    o = r ? s.toJSON() : e == \"symbol\" ? s.toString() : e == \"string\" ? JSON.stringify(s) : \"\" + s;\n  return o;\n}, o_ = (s) => {\n  if (s_(s))\n    try {\n      s = s();\n    } catch {\n      s = \"\";\n    }\n  const e = s;\n  return s = typeof s == \"string\" ? s : (Array.isArray(s) ? s.length : s) ? Bc(s) : \"\", [\n    s,\n    e\n  ];\n}, a_ = (s) => o_(s ? s(0, null) : null)[0], jl = Promise.resolve(), l_ = (s) => (e, t, r) => {\n  const n = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(!1), { cache: i, initialSize: o = 1, revalidateAll: a = !1, persistSize: l = !1, revalidateFirstPage: c = !0, revalidateOnMount: u = !1, parallel: d = !1 } = r, [, , , h] = qr.get(Nu);\n  let f;\n  try {\n    f = a_(e), f && (f = dm + f);\n  } catch {\n  }\n  const [p, y, E] = _s(i, f), b = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => $e(p()._l) ? o : p()._l, [\n    i,\n    f,\n    o\n  ]);\n  im.useSyncExternalStore((0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n    (j) => f ? E(f, () => {\n      j();\n    }) : () => {\n    },\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      i,\n      f\n    ]\n  ), b, b);\n  const R = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n    const j = p()._l;\n    return $e(j) ? o : j;\n  }, [\n    f,\n    o\n  ]), A = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(R());\n  So(() => {\n    if (!n.current) {\n      n.current = !0;\n      return;\n    }\n    f && y({\n      _l: l ? A.current : R()\n    });\n  }, [\n    f,\n    i\n  ]);\n  const F = u && !n.current, M = s(f, async (j) => {\n    const C = p()._i, k = p()._r;\n    y({\n      _r: qt\n    });\n    const $ = [], W = R(), [_] = _s(i, j), g = _().data, x = [];\n    let w = null;\n    for (let D = 0; D < W; ++D) {\n      const [O, U] = wi(e(D, d ? null : w));\n      if (!O)\n        break;\n      const [V, L] = _s(i, O);\n      let m = V().data;\n      const v = a || C || $e(m) || c && !D && !$e(g) || F || g && !$e(g[D]) && !r.compare(g[D], m);\n      if (t && (typeof k == \"function\" ? k(m, U) : v)) {\n        const P = async () => {\n          if (!(O in h))\n            m = await t(U);\n          else {\n            const Y = h[O];\n            delete h[O], m = await Y;\n          }\n          L({\n            data: m,\n            _k: U\n          }), $[D] = m;\n        };\n        d ? x.push(P) : await P();\n      } else\n        $[D] = m;\n      d || (w = m);\n    }\n    return d && await Promise.all(x.map((D) => D())), y({\n      _i: qt\n    }), $;\n  }, r), H = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n    // eslint-disable-next-line func-names\n    function(j, C) {\n      const k = typeof C == \"boolean\" ? {\n        revalidate: C\n      } : C || {}, $ = k.revalidate !== !1;\n      return f ? ($ && ($e(j) ? y({\n        _i: !0,\n        _r: k.revalidate\n      }) : y({\n        _i: !1,\n        _r: k.revalidate\n      })), arguments.length ? M.mutate(j, {\n        ...k,\n        revalidate: $\n      }) : M.mutate()) : jl;\n    },\n    // swr.mutate is always the same reference\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      f,\n      i\n    ]\n  ), K = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n    (j) => {\n      if (!f) return jl;\n      const [, C] = _s(i, f);\n      let k;\n      if (Mr(j) ? k = j(R()) : typeof j == \"number\" && (k = j), typeof k != \"number\") return jl;\n      C({\n        _l: k\n      }), A.current = k;\n      const $ = [], [W] = _s(i, f);\n      let _ = null;\n      for (let g = 0; g < k; ++g) {\n        const [x] = wi(e(g, _)), [w] = _s(i, x), D = x ? w().data : qt;\n        if ($e(D))\n          return H(W().data);\n        $.push(D), _ = D;\n      }\n      return H($);\n    },\n    // exclude getKey from the dependencies, which isn't allowed to change during the lifecycle\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [\n      f,\n      i,\n      H,\n      R\n    ]\n  );\n  return {\n    size: R(),\n    setSize: K,\n    mutate: H,\n    get data() {\n      return M.data;\n    },\n    get error() {\n      return M.error;\n    },\n    get isValidating() {\n      return M.isValidating;\n    },\n    get isLoading() {\n      return M.isLoading;\n    }\n  };\n}, c_ = JI(e_, l_), u_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"sfmkqcr\"]\n}), d_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"hrldtio\"]\n}), h_ = (0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(({\n  casts: s,\n  cursor: e\n}) => /* @__PURE__ */ q.jsx(u_, {\n  children: s.map((t, r) => /* @__PURE__ */ q.jsxs((react__WEBPACK_IMPORTED_MODULE_0___default().Fragment), {\n    children: [/* @__PURE__ */ q.jsx(oa, {\n      isEmbed: !1,\n      ...t\n    }), r < s.length - 1 && /* @__PURE__ */ q.jsx(d_, {})]\n  }, t.hash))\n}));\nfunction f_(s) {\n  return s ? s.map((e) => {\n    var r, n, i, o, a;\n    const t = e != null && e.replies && typeof e.replies == \"object\" ? Number(e.replies.count) || 0 : Number(e == null ? void 0 : e.replies) || 0;\n    return {\n      username: ((r = e == null ? void 0 : e.author) == null ? void 0 : r.username) ?? \"\",\n      displayName: ((n = e == null ? void 0 : e.author) == null ? void 0 : n.display_name) ?? \"\",\n      avatarImgUrl: ((i = e == null ? void 0 : e.author) == null ? void 0 : i.pfp_url) ?? \"\",\n      text: (e == null ? void 0 : e.text) ?? \"\",\n      hash: (e == null ? void 0 : e.hash) ?? \"\",\n      reactions: (e == null ? void 0 : e.reactions) ?? [],\n      replies: t,\n      embeds: (e == null ? void 0 : e.embeds) ?? [],\n      frames: (e == null ? void 0 : e.frames) ?? [],\n      renderEmbeds: (e == null ? void 0 : e.renderEmbeds) ?? !0,\n      channel: (e == null ? void 0 : e.channel) ?? \"\",\n      viewerFid: 2,\n      hasPowerBadge: ((o = e == null ? void 0 : e.author) == null ? void 0 : o.power_badge) ?? !1,\n      appAvatarImgUrl: ((a = e == null ? void 0 : e.app) == null ? void 0 : a.pfp_url) ?? \"\",\n      isOwnProfile: !1,\n      allowReactions: !0,\n      renderFrames: !1,\n      timestamp: e.timestamp ?? \"\"\n    };\n  }) : [];\n}\nconst g_ = (s) => an(s).then(async (e) => await e.json()), p_ = (s, e, t, r, n) => {\n  if (e && (!e.casts || !e.casts.length)) return null;\n  let i = `${on}/v2/farcaster/feed${t ? \"\" : \"?\"}`;\n  const o = new URLSearchParams();\n  t && (i += `${t}?`), n && (i += `client_id=${n}`), e && (i += `&cursor=${e.next.cursor}`);\n  const a = (l, c) => {\n    c != null && !i.includes(`${l}=`) && o.append(l, String(c));\n  };\n  if (r) {\n    Object.entries(r).forEach(([c, u]) => {\n      const d = c.replace(/([a-z])([A-Z])/g, \"$1_$2\").toLowerCase();\n      a(d, u);\n    });\n    const l = o.toString();\n    l && (i += i.includes(\"?\") ? `&${l}` : `?${l}`);\n  }\n  if (Object.keys(r).length > 1)\n    return i;\n}, yR = ({\n  path: s,\n  ...e\n}) => {\n  var f;\n  const {\n    client_id: t\n  } = ts(), r = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), [n, i] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), o = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null), {\n    data: a,\n    error: l,\n    size: c,\n    setSize: u,\n    isValidating: d\n  } = c_((p, y) => p_(p, y, s, e, t), g_), h = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => {\n    if (!a) return [];\n    const p = a.flatMap((E) => (E == null ? void 0 : E.casts) ?? []), y = Array.from(new Set(p.map((E) => E.hash))).map((E) => p.find((b) => b.hash === E));\n    return f_(y);\n  }, [a]);\n  return (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => (o.current && o.current.disconnect(), o.current = new IntersectionObserver((p) => {\n    var E, b;\n    const [y] = p;\n    y.isIntersecting && !n && !d && a && ((b = (E = a[a.length - 1]) == null ? void 0 : E.next) != null && b.cursor) && (i(!0), u(c + 1).then(() => i(!1)));\n  }, {\n    rootMargin: \"100px\"\n  }), r.current && o.current.observe(r.current), () => {\n    o.current && o.current.disconnect();\n  }), [r.current, n, d, a, c]), l ? /* @__PURE__ */ q.jsx(\"div\", {\n    children: \"Error fetching feed data\"\n  }) : /* @__PURE__ */ q.jsxs(\"div\", {\n    children: [h.length !== 0 ? /* @__PURE__ */ q.jsx(h_, {\n      casts: h,\n      cursor: \"\"\n    }) : /* @__PURE__ */ q.jsx(\"div\", {\n      children: (f = a == null ? void 0 : a[0]) == null ? void 0 : f.message\n    }), d && /* @__PURE__ */ q.jsxs(\"div\", {\n      style: {\n        display: \"flex\",\n        justifyContent: \"center\",\n        padding: \"10px\"\n      },\n      children: [/* @__PURE__ */ q.jsxs(\"span\", {\n        style: {\n          animation: \"blink 1.5s infinite\"\n        },\n        children: [\"Loading\", /* @__PURE__ */ q.jsx(\"span\", {\n          className: \"dots\",\n          children: \"...\"\n        })]\n      }), /* @__PURE__ */ q.jsx(\"style\", {\n        children: `\n                        @keyframes blink {\n                            0% { opacity: 1; }\n                            50% { opacity: 0; }\n                            100% { opacity: 1; }\n                        }\n                    `\n      })]\n    }), /* @__PURE__ */ q.jsx(\"div\", {\n      ref: r\n    })]\n  });\n}, m_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"button\")({\n  classes: [\"b1bqug8r\"]\n}), y_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"button\")({\n  classes: [\"b1mra45w\"]\n}), Cf = \"https://farcaster.xyz\", gm = /(^|\\s)\\/\\w+/g, pm = /@\\w+/g, mm = /((https?:\\/\\/)?([a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})(\\/[^\\s]*)?)/g, kf = new RegExp(`(${gm.source})|(${pm.source})|(${mm.source})`, \"g\"), v_ = (s) => gm.test(s) ? `${Cf}/~/channel${s.trim()}` : pm.test(s) ? `${Cf}/${s.substring(1)}` : mm.test(s) ? s.startsWith(\"http\") ? s : `http://${s}` : \"\", E_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"a\")({\n  classes: [\"sby9wa2\"]\n}), x_ = (s) => {\n  if (!s) return [];\n  const e = [];\n  let t = 0, r;\n  for (; (r = kf.exec(s)) !== null; ) {\n    const n = r.index;\n    t < n && e.push(s.slice(t, n));\n    const i = v_(r[0]), o = r[0].trim().startsWith(\"/\");\n    e.push(/* @__PURE__ */ q.jsx(\"span\", {\n      children: /* @__PURE__ */ q.jsx(E_, {\n        href: i,\n        target: \"_blank\",\n        style: o ? {\n          marginLeft: 3.5\n        } : {},\n        children: r[0]\n      }, n)\n    })), t = kf.lastIndex;\n  }\n  return t < s.length && e.push(s.slice(t)), e;\n}, S_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"sdahm58\"]\n}), b_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"mziqyxp\"]\n}), T_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"uz7tpmf\"]\n}), w_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"d1rxlwac\"]\n}), A_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"ugc6yqp\"]\n}), Df = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"porjf9a\"]\n}), I_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"ttt7x9x\"]\n}), Pf = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"b1wbe9o6\"]\n}), __ = (0,react__WEBPACK_IMPORTED_MODULE_0__.memo)(({\n  fid: s,\n  username: e,\n  displayName: t,\n  avatarImgUrl: r,\n  bio: n,\n  followers: i,\n  following: o,\n  hasPowerBadge: a,\n  isFollowing: l,\n  isOwnProfile: c,\n  onCast: u,\n  containerStyles: d\n}) => {\n  const h = x_(n), f = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => pf(o), [o]), p = (0,react__WEBPACK_IMPORTED_MODULE_0__.useMemo)(() => pf(i), [i]), y = () => {\n    window.open(\"https://farcaster.xyz/~/settings\", \"_blank\");\n  }, E = {\n    color: d == null ? void 0 : d.color\n  };\n  return /* @__PURE__ */ q.jsxs(S_, {\n    style: d,\n    children: [c && u && /* @__PURE__ */ q.jsxs(Pr, {\n      alignItems: \"center\",\n      justifyContent: \"space-between\",\n      spacingBottom: \"20px\",\n      children: [/* @__PURE__ */ q.jsxs(A_, {\n        children: [\"@\", e]\n      }), /* @__PURE__ */ q.jsx(m_, {\n        onClick: u,\n        children: \"Cast\"\n      })]\n    }), /* @__PURE__ */ q.jsx(Pr, {\n      children: /* @__PURE__ */ q.jsxs(b_, {\n        children: [/* @__PURE__ */ q.jsxs(Pr, {\n          alignItems: \"center\",\n          flexGrow: 1,\n          style: {\n            gap: \"10px\"\n          },\n          children: [/* @__PURE__ */ q.jsx(Ir, {\n            children: /* @__PURE__ */ q.jsx(Yo, {\n              width: \"20px\",\n              height: \"20px\",\n              src: r ?? bi,\n              loading: \"lazy\",\n              alt: `${t ?? \"Skeleton\"} Avatar`\n            })\n          }), /* @__PURE__ */ q.jsx(Pr, {\n            children: /* @__PURE__ */ q.jsx(w_, {\n              children: t || `!${s}`\n            })\n          }), /* @__PURE__ */ q.jsxs(Pr, {\n            alignItems: \"center\",\n            children: [/* @__PURE__ */ q.jsxs(T_, {\n              children: [\"@\", e]\n            }), l && /* @__PURE__ */ q.jsx(I_, {\n              children: \"Follows you\"\n            })]\n          }), /* @__PURE__ */ q.jsx(Pr, {\n            children: c && /* @__PURE__ */ q.jsx(y_, {\n              onClick: y,\n              children: \"Edit Profile\"\n            })\n          })]\n        }), (h == null ? void 0 : h.length) !== 0 ? /* @__PURE__ */ q.jsx(Pf, {\n          children: h\n        }) : /* @__PURE__ */ q.jsx(Pf, {\n          style: {\n            padding: \"26px 0px\"\n          }\n        }), /* @__PURE__ */ q.jsxs(Pr, {\n          style: {\n            justifyContent: \"space-between\",\n            display: \"flex\",\n            alignItems: \"center\"\n          },\n          children: [/* @__PURE__ */ q.jsxs(Df, {\n            children: [/* @__PURE__ */ q.jsx(\"strong\", {\n              style: E,\n              children: f\n            }), \" \", \"Following\"]\n          }), /* @__PURE__ */ q.jsxs(Df, {\n            children: [/* @__PURE__ */ q.jsx(\"strong\", {\n              style: E,\n              children: p\n            }), \" \", \"Followers\"]\n          }), e && /* @__PURE__ */ q.jsx(Ir, {\n            style: {\n              marginLeft: \"auto\"\n            },\n            children: /* @__PURE__ */ q.jsx(Ic, {\n              url: `https://farcaster.xyz/${e}`\n            })\n          })]\n        })]\n      })\n    })]\n  });\n});\nasync function R_({\n  fid: s,\n  viewerFid: e,\n  clientId: t\n}) {\n  var r;\n  try {\n    let n = `${on}/v2/farcaster/user/bulk?client_id=${t}&fids=${s}`;\n    e && (n += `&viewer_fid=${e}`);\n    const o = await (await an(n)).json();\n    return ((r = o == null ? void 0 : o.users) == null ? void 0 : r[0]) ?? null;\n  } catch (n) {\n    return console.error(\"Error fetching user by fid\", n), null;\n  }\n}\nconst vR = ({\n  fid: s,\n  viewerFid: e,\n  containerStyles: t\n}) => {\n  var h;\n  const {\n    client_id: r\n  } = ts(), [n, i] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), [o, a] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!0), [l, c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(null), u = (n == null ? void 0 : n.fid) === e;\n  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    s && (a(!0), c(null), R_({\n      fid: s,\n      viewerFid: e,\n      clientId: r\n    }).then((f) => {\n      i(f);\n    }).catch((f) => {\n      c(f);\n    }).finally(() => {\n      a(!1);\n    }));\n  }, [s, e]);\n  const d = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => {\n  }, []);\n  return o ? /* @__PURE__ */ q.jsx(\"div\", {\n    style: {\n      padding: \"20px\"\n    },\n    children: \"Loading...\"\n  }) : !n || l ? /* @__PURE__ */ q.jsx(\"div\", {\n    children: \"Error fetching user data\"\n  }) : /* @__PURE__ */ q.jsx(__, {\n    fid: s,\n    username: n.username,\n    displayName: n.display_name,\n    avatarImgUrl: n.pfp_url,\n    bio: n.profile.bio.text,\n    followers: n.follower_count,\n    following: n.following_count,\n    hasPowerBadge: n.power_badge,\n    isOwnProfile: u,\n    isFollowing: (h = n.viewer_context) == null ? void 0 : h.followed_by,\n    onCast: d,\n    containerStyles: t\n  });\n}, L_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"ul\")({\n  classes: [\"d12rx4om\"]\n}), C_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"li\")({\n  classes: [\"lrpm6lp\"]\n}), k_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"img\")({\n  classes: [\"a1e9hg3b\"]\n}), D_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"u1aqay1i\"]\n}), P_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"d1m0njq\"]\n}), M_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"u1lvlbuo\"]\n}), O_ = ({\n  users: s,\n  onSelect: e,\n  customStyles: t = {}\n}) => /* @__PURE__ */ q.jsx(L_, {\n  style: {\n    ...t == null ? void 0 : t.dropdown\n  },\n  children: s.map((r) => /* @__PURE__ */ q.jsxs(C_, {\n    style: {\n      ...t == null ? void 0 : t.listItem\n    },\n    onClick: () => e(r),\n    children: [/* @__PURE__ */ q.jsx(k_, {\n      style: {\n        ...t == null ? void 0 : t.avatar\n      },\n      src: r.pfp_url,\n      alt: r.username\n    }), /* @__PURE__ */ q.jsxs(D_, {\n      style: {\n        ...t.userInfo\n      },\n      children: [/* @__PURE__ */ q.jsx(P_, {\n        children: r.display_name\n      }), /* @__PURE__ */ q.jsxs(M_, {\n        children: [\"@\", r.username]\n      })]\n    })]\n  }, r.fid))\n}), B_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"c9hm20t\"]\n}), F_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"input\")({\n  classes: [\"i80sd8h\"]\n});\nasync function N_({\n  q: s,\n  viewerFid: e,\n  client_id: t\n}) {\n  var r;\n  try {\n    let n = `${on}/v2/farcaster/user/search?q=${s}&limit=5${e ? `&viewer_fid=${e}` : \"\"}&client_id=${t}`;\n    const o = await (await an(n)).json();\n    return ((r = o == null ? void 0 : o.result) == null ? void 0 : r.users) || [];\n  } catch {\n    return null;\n  }\n}\nconst ER = ({\n  value: s,\n  onChange: e,\n  style: t = {},\n  placeholder: r = \"Enter username\",\n  disabled: n = !1,\n  viewerFid: i,\n  customStyles: o = {},\n  limit: a = null\n}) => {\n  const {\n    client_id: l\n  } = ts(), [c, u] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), [d, h] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), [f, p] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), y = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    const M = (s == null ? void 0 : s.split(\",\")) || [];\n    if (!M[M.length - 1]) {\n      u(\"\");\n      return;\n    }\n    u(M[M.length - 1].trim());\n  }, [s]), (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    c !== \"\" && !/^\\d+$/.test(c) ? E(c) : h(!1);\n  }, [c]);\n  const E = async (M) => {\n    const H = await N_({\n      q: M,\n      viewerFid: i,\n      client_id: l\n    });\n    H && (p(H), h(!0));\n  }, b = (M) => {\n    const H = M.target.value;\n    e(H);\n  }, R = (M) => {\n    let H = s.split(\",\");\n    a !== null && H.length >= a ? H[H.length - 1] = M.fid.toString() : H.push(M.fid.toString());\n    const K = H.join(\",\");\n    e(K), u(\"\"), h(!1);\n  }, A = () => {\n    c && isNaN(Number(c)) && h(!0);\n  }, F = () => {\n    setTimeout(() => h(!1), 200);\n  };\n  return /* @__PURE__ */ q.jsxs(B_, {\n    style: t,\n    children: [/* @__PURE__ */ q.jsx(F_, {\n      ref: y,\n      type: \"text\",\n      value: s,\n      onChange: b,\n      onFocus: A,\n      onBlur: F,\n      placeholder: r,\n      disabled: n\n    }), d && /* @__PURE__ */ q.jsx(O_, {\n      users: f,\n      onSelect: R,\n      customStyles: o\n    })]\n  });\n}, U_ = ({\n  color: s = \"#855DCD\"\n}) => /* @__PURE__ */ q.jsxs(\"svg\", {\n  xmlns: \"http://www.w3.org/2000/svg\",\n  width: \"24\",\n  height: \"24\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: s,\n  \"stroke-width\": \"2\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  className: \"lucide lucide-search\",\n  children: [/* @__PURE__ */ q.jsx(\"circle\", {\n    cx: \"11\",\n    cy: \"11\",\n    r: \"8\"\n  }), /* @__PURE__ */ q.jsx(\"path\", {\n    d: \"m21 21-4.3-4.3\"\n  })]\n}), $_ = ({\n  color: s = \"#855DCD\"\n}) => /* @__PURE__ */ q.jsx(\"svg\", {\n  xmlns: \"http://www.w3.org/2000/svg\",\n  width: \"24\",\n  height: \"24\",\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: s,\n  \"stroke-width\": \"2\",\n  \"stroke-linecap\": \"round\",\n  \"stroke-linejoin\": \"round\",\n  className: \"lucide lucide-loader-circle\",\n  children: /* @__PURE__ */ q.jsx(\"path\", {\n    d: \"M21 12a9 9 0 1 1-6.219-8.56\"\n  })\n}), G_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"ig7kcuc\"]\n}), V_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"input\")({\n  classes: [\"sh7z7k6\"]\n}), j_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"s14ai203\"]\n}), K_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"if18nd6\"]\n}), H_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"sd833lb\"]\n}), q_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"ugo586m\"]\n}), W_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"ukwty1d\"]\n}), z_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"u77olmy\"]\n}), Y_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"s1xvkxww\"]\n}), Z_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"s1f6b1ja\"]\n}), X_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"udiufd8\"]\n}), J_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"f1b8a2h0\"]\n}), Q_ = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"div\")({\n  classes: [\"l1yq26j0\"]\n}), eR = /* @__PURE__ */ (0,_pigment_css_react__WEBPACK_IMPORTED_MODULE_1__.styled)(\"li\")({\n  classes: [\"s18mk47k\"]\n}), xR = ({\n  width: s,\n  height: e,\n  selectedUsers: t,\n  onSelectUsers: r,\n  ...n\n}) => {\n  const {\n    client_id: i\n  } = ts(), {\n    user: o,\n    isAuthenticated: a\n  } = Eg(), [l, c] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(\"\"), [u, d] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)([]), [h, f] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(!1), p = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null);\n  (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n    function M(H) {\n      p.current && !p.current.contains(H.target) && (d([]), c(\"\"));\n    }\n    return document.addEventListener(\"mousedown\", M), () => {\n      document.removeEventListener(\"mousedown\", M);\n    };\n  }, []);\n  const b = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(((M, H) => {\n    let K;\n    return (...j) => {\n      clearTimeout(K), K = setTimeout(() => M(...j), H);\n    };\n  })(async (M, H) => {\n    var K;\n    if (!M) {\n      d([]);\n      return;\n    }\n    f(!0);\n    try {\n      const C = await (await an(H)).json();\n      d(((K = C == null ? void 0 : C.result) == null ? void 0 : K.users) || []);\n    } catch (j) {\n      console.error(\"Error fetching data:\", j);\n    } finally {\n      f(!1);\n    }\n  }, 500), []), R = (M) => {\n    const H = `${on}/v2/farcaster/user/search?q=${M.target.value}&client_id=${i}${a ? `&viewer_fid=${o == null ? void 0 : o.fid}` : \"\"})`;\n    c(M.target.value), b(M.target.value, H);\n  }, A = (M) => {\n    t.some((H) => H.username === M.username) || (r([...t, M]), c(\"\"), d([]));\n  }, F = (M) => {\n    r(t.filter((H) => H.username !== M));\n  };\n  return /* @__PURE__ */ q.jsxs(G_, {\n    ref: p,\n    style: {\n      width: s\n    },\n    children: [/* @__PURE__ */ q.jsxs(K_, {\n      children: [t.map((M) => /* @__PURE__ */ q.jsxs(H_, {\n        children: [/* @__PURE__ */ q.jsx(Yo, {\n          src: M.pfp_url ?? bi,\n          alt: `${M.username} Avatar`,\n          style: {\n            width: \"24px\",\n            height: \"24px\",\n            borderRadius: \"50%\"\n          }\n        }), /* @__PURE__ */ q.jsx(\"span\", {\n          style: {\n            marginLeft: \"8px\"\n          },\n          children: M.display_name\n        }), /* @__PURE__ */ q.jsx(sm, {\n          size: 20,\n          onClick: () => F(M.username)\n        })]\n      }, M.username)), /* @__PURE__ */ q.jsxs(Y_, {\n        children: [/* @__PURE__ */ q.jsx(Z_, {\n          children: /* @__PURE__ */ q.jsx(U_, {\n            color: \"#855DCD\"\n          })\n        }), /* @__PURE__ */ q.jsx(V_, {\n          ...n,\n          value: l,\n          onChange: R,\n          placeholder: \"Type to search users\",\n          style: {\n            width: s || \"100%\",\n            height: e || \"40px\"\n          }\n        })]\n      })]\n    }), h ? /* @__PURE__ */ q.jsx(Q_, {\n      children: /* @__PURE__ */ q.jsx($_, {\n        color: \"#855DCD\"\n      })\n    }) : u.length !== 0 && /* @__PURE__ */ q.jsx(j_, {\n      children: u.map((M) => /* @__PURE__ */ q.jsxs(eR, {\n        onClick: () => A(M),\n        children: [/* @__PURE__ */ q.jsx(Yo, {\n          src: M.pfp_url ?? bi,\n          alt: `${M.username} Avatar`,\n          style: {\n            width: \"40px\",\n            height: \"40px\",\n            borderRadius: \"50%\"\n          }\n        }), /* @__PURE__ */ q.jsxs(q_, {\n          children: [/* @__PURE__ */ q.jsx(W_, {\n            children: M.display_name\n          }), /* @__PURE__ */ q.jsxs(X_, {\n            children: [/* @__PURE__ */ q.jsxs(z_, {\n              children: [\"@\", M.username]\n            }), M.viewer_context && (M.viewer_context.following || M.viewer_context.followed_by) && /* @__PURE__ */ q.jsx(J_, {\n              children: M.viewer_context.following && M.viewer_context.followed_by ? \"Following each other\" : M.viewer_context.following ? \"Following\" : M.viewer_context.followed_by ? \"Follows you\" : null\n            })]\n          })]\n        })]\n      }, M.username))\n    })]\n  });\n};\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AbmV5bmFyL3JlYWN0L2Rpc3QvYnVuZGxlLmVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQSwwQ0FBMEMsMERBQTBEO0FBQ3BHO0FBQ2tEO0FBQ3lKO0FBQzNNO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxXQUFXLGFBQWE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QjtBQUN2Qix5QkFBeUIsaUJBQWlCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHNCQUFzQix5Q0FBeUM7QUFDL0Q7QUFDQSxPQUFPO0FBQ1A7QUFDQSxzQkFBc0IscUJBQXFCO0FBQzNDO0FBQ0EsT0FBTztBQUNQO0FBQ0Esc0JBQXNCLG1CQUFtQjtBQUN6QztBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDRCQUE0QixrQ0FBa0M7QUFDOUQ7QUFDQTtBQUNBLDRCQUE0QixnQ0FBZ0M7QUFDNUQ7QUFDQTtBQUNBLDRCQUE0QixrQ0FBa0M7QUFDOUQ7QUFDQTtBQUNBLDRCQUE0QixpQ0FBaUM7QUFDN0Q7QUFDQTtBQUNBLDRCQUE0QixtQ0FBbUM7QUFDL0Q7QUFDQTtBQUNBLDRCQUE0QixpQ0FBaUM7QUFDN0Q7QUFDQTtBQUNBLDRCQUE0QixrQ0FBa0M7QUFDOUQ7QUFDQTtBQUNBLDRCQUE0QixpQ0FBaUM7QUFDN0Q7QUFDQTtBQUNBLDRCQUE0QixtQ0FBbUM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsNEJBQTRCLGdDQUFnQztBQUM1RDtBQUNBO0FBQ0EsNEJBQTRCLCtCQUErQjtBQUMzRDtBQUNBO0FBQ0EsNEJBQTRCLGlDQUFpQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLDRCQUE0QiwwQkFBMEI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsNEJBQTRCLHFDQUFxQztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxjQUFjO0FBQ3BELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxxQkFBcUI7QUFDM0QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHFCQUFxQjtBQUMzRCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxZQUFZLG9CQUFvQjtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsbUJBQW1CO0FBQy9DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxZQUFZLG9CQUFvQixpQ0FBaUMsb0JBQW9CO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwyQkFBMkI7QUFDMUM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsMkJBQTJCO0FBQzlDLHFCQUFxQjtBQUNyQixXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsMkJBQTJCO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixRQUFRO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsaUJBQWlCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSw2Q0FBNkMsbUJBQW1CO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJELEVBQUU7QUFDN0Q7QUFDQTtBQUNBLG9EQUFvRCxXQUFXLHNCQUFzQixVQUFVO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsK0ZBQStGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0EsYUFBYTtBQUNiLElBQUk7QUFDSjtBQUNBLGVBQWU7QUFDZjtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGFBQWE7QUFDYixJQUFJLDJEQUEyRCxxQkFBcUIsSUFBSTtBQUN4RjtBQUNBO0FBQ0E7QUFDQSxZQUFZLG9CQUFvQjtBQUNoQztBQUNBO0FBQ0E7QUFDQSx5REFBeUQsZ0NBQWdDO0FBQ3pGO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFlBQVksb0JBQW9CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxTQUFTO0FBQ3JCLHVDQUF1Qyx1Q0FBdUM7QUFDOUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxRQUFRO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGNBQWM7QUFDekM7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsT0FBTztBQUM3QjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixPQUFPO0FBQzdCO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLE9BQU87QUFDN0I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHdEQUF3RCxFQUFFO0FBQzFELEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQixTQUFTO0FBQzlCO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxRQUFRO0FBQ1IsbURBQW1ELFNBQVM7QUFDNUQ7QUFDQSwyQkFBMkIsU0FBUztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIsUUFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixPQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixPQUFPO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLE9BQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGtCQUFrQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsd0JBQXdCO0FBQ3JDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGFBQWEscUJBQXFCO0FBQ2xDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxhQUFhLHdCQUF3QjtBQUNyQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxhQUFhLHFCQUFxQjtBQUNsQztBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIsd0JBQXdCO0FBQ3REO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyx5QkFBeUI7QUFDM0Q7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4Qix3QkFBd0I7QUFDdEQ7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHlCQUF5QjtBQUMzRDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFdBQVc7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrQkFBa0IsV0FBVyxHQUFHLEVBQUU7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLG9CQUFvQixXQUFXLEdBQUcsRUFBRSxLQUFLLGFBQWE7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLEdBQUc7QUFDekIsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLEVBQUUsbURBQW1ELFNBQVM7QUFDckYsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLEVBQUU7QUFDbkMseU9BQXlPLEVBQUUsYUFBYSxFQUFFO0FBQzFQLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxZQUFZO0FBQ3pCLGdCQUFnQixrQkFBa0IsRUFBRSxFQUFFO0FBQ3RDLGdCQUFnQixjQUFjLEVBQUUsRUFBRTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELElBQUksU0FBUyxJQUFJLEtBQUssWUFBWSxFQUFFLEdBQUcsa0JBQWtCLElBQUksS0FBSyxnQkFBZ0IsRUFBRSxHQUFHLGVBQWUsZ0JBQWdCLEVBQUUsR0FBRztBQUNsTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixFQUFFO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0JBQW9CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixRQUFRO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLGtDQUFrQztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGdEQUFnRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFFBQVE7QUFDOUI7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUpBQXlKLGFBQWE7QUFDdEs7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsY0FBYztBQUNoQztBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixPQUFPO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsY0FBYztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGtDQUFrQztBQUM5QyxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQSxlQUFlLFlBQVk7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSwyQ0FBMkM7QUFDdkQsVUFBVSxTQUFTO0FBQ25CO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLFlBQVksMEJBQTBCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksdUVBQXVFO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSw2Q0FBNkMsSUFBSTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGlEQUFpRDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0EscUJBQXFCLFFBQVE7QUFDN0I7QUFDQTtBQUNBO0FBQ0EsVUFBVSxpREFBaUQ7QUFDM0Qsb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGlIQUFpSDtBQUM3SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0EscUJBQXFCLFFBQVE7QUFDN0I7QUFDQTtBQUNBO0FBQ0EsVUFBVSxpSEFBaUg7QUFDM0gsb0JBQW9CLFFBQVE7QUFDNUI7QUFDQSwwRUFBMEUsYUFBYTtBQUN2RjtBQUNBO0FBQ0E7QUFDQSxPQUFPLGFBQWEsaURBQWlELGFBQWEsZ0RBQWdELFVBQVUsZ0RBQWdELGFBQWEsZ0RBQWdELGFBQWEsZ0RBQWdELGFBQWEsZ0RBQWdELGFBQWEsZ0RBQWdELGFBQWE7QUFDN2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsRUFBRTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixFQUFFLDJCQUEyQixFQUFFLDBCQUEwQixFQUFFLFlBQVksU0FBUztBQUN2RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsT0FBTztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGVBQWU7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxFQUFFLHlCQUF5QixFQUFFLFFBQVEsRUFBRTtBQUN2RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQVU7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxVQUFVO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsZUFBZTtBQUN4QjtBQUNBO0FBQ0E7QUFDQSxTQUFTLGdCQUFnQjtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGtCQUFrQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxhQUFhLGtCQUFrQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFFBQVE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLFVBQVUsZ0NBQWdDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxVQUFVLG1EQUFtRDtBQUM3RDtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsUUFBUTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksNEJBQTRCO0FBQ3hDO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQSxzQkFBc0IsT0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixlQUFlO0FBQ25DLGNBQWMsa0VBQWtFO0FBQ2hGO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwyQkFBMkI7QUFDL0MsY0FBYywyQ0FBMkM7QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGtCQUFrQjtBQUMzQjtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFFBQVE7QUFDMUI7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxPQUFPO0FBQzdDO0FBQ0E7QUFDQSxzQkFBc0IsT0FBTztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osbUJBQW1CLFNBQVM7QUFDNUI7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSxzQ0FBc0MsR0FBRztBQUN6QztBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsR0FBRztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixHQUFHO0FBQ2xDLDJDQUEyQyxTQUFTO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCLDZDQUE2QyxlQUFlO0FBQzVEO0FBQ0EsVUFBVSxPQUFPO0FBQ2pCLFVBQVUsSUFBSSxxQkFBcUI7QUFDbkM7QUFDQTtBQUNBLGVBQWU7QUFDZixNQUFNO0FBQ04sZUFBZTtBQUNmO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLG1CQUFtQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLGFBQWE7QUFDYixHQUFHO0FBQ0gsWUFBWSxhQUFhO0FBQ3pCO0FBQ0E7QUFDQSxZQUFZLHlCQUF5QjtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGFBQWE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsYUFBYTtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHVCQUF1QjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELFlBQVk7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsbUJBQW1CLFVBQVUsbUJBQW1CO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTyxPQUFPLG1CQUFtQjtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYSxPQUFPLHlCQUF5QixVQUFVLHlCQUF5QjtBQUM5RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGFBQWE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtQ0FBbUM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILFVBQVUsYUFBYSxPQUFPLHdCQUF3QjtBQUN0RDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFlBQVksZ0NBQWdDO0FBQzVDLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EsWUFBWSxzQ0FBc0M7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBLFlBQVksd0JBQXdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsT0FBTztBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsaURBQWlELGtDQUFrQztBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxVQUFVLGdEQUFnRDtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyRUFBMkU7QUFDM0U7QUFDQSxzQkFBc0IsVUFBVTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELFdBQVc7QUFDWCxhQUFhO0FBQ2I7QUFDQTtBQUNBLENBQUMsd0JBQXdCLGlCQUFpQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsaUJBQWlCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQSw2QkFBNkIsY0FBYztBQUMzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLFFBQVE7QUFDekM7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLGNBQWM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRSxPQUFPO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGVBQWU7QUFDOUM7QUFDQTtBQUNBLHdGQUF3RixPQUFPO0FBQy9GO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRCxPQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0Esd0JBQXdCLGlCQUFpQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsZUFBZSxpQkFBaUI7QUFDaEM7QUFDQTtBQUNBLE9BQU87QUFDUCxlQUFlLHNEQUFzRDtBQUNyRTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QyxpQkFBaUI7QUFDekQ7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELG9CQUFvQjtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixhQUFhO0FBQzVDO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxvQkFBb0I7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLDZDQUE2QyxpQkFBaUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsY0FBYztBQUN6QztBQUNBLE9BQU87QUFDUCx3REFBd0QsaUJBQWlCO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFFBQVE7QUFDbkM7QUFDQSxPQUFPO0FBQ1A7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsY0FBYztBQUNwRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixpQkFBaUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1AsZUFBZSx3QkFBd0I7QUFDdkM7QUFDQSx3QkFBd0IsY0FBYztBQUN0QztBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSx3QkFBd0IsY0FBYztBQUN0QztBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSx3QkFBd0IsY0FBYztBQUN0QztBQUNBO0FBQ0EsaUJBQWlCLGNBQWM7QUFDL0I7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQixjQUFjO0FBQzdDO0FBQ0EsZUFBZSx5QkFBeUI7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsY0FBYztBQUMvQjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0M7QUFDQSxlQUFlLHlCQUF5QjtBQUN4QztBQUNBO0FBQ0EsaUJBQWlCLGNBQWM7QUFDL0I7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLE9BQU87QUFDL0IscUhBQXFILFFBQVE7QUFDN0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0Msa0JBQWtCO0FBQ3hEO0FBQ0E7QUFDQSx1R0FBdUcsUUFBUTtBQUMvRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLCtCQUErQixpQkFBaUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLGtDQUFrQyw0QkFBNEI7QUFDOUQ7QUFDQTtBQUNBLGdDQUFnQyxjQUFjO0FBQzlDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxRQUFRO0FBQzVDO0FBQ0Esc0JBQXNCLE9BQU87QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixPQUFPO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLGlCQUFpQjtBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQywrQkFBK0I7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQSx3QkFBd0IsOENBQThDO0FBQ3RFO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLHNDQUFzQztBQUNoRTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxxQkFBcUI7QUFDcEM7QUFDQTtBQUNBLHdDQUF3QyxpQkFBaUI7QUFDekQ7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsUUFBUTtBQUNwQztBQUNBLDJFQUEyRSxrQkFBa0I7QUFDN0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsVUFBVTtBQUNWLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsZ0VBQWdFLFFBQVE7QUFDeEU7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsNkNBQTZDLFFBQVE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsZ0ZBQWdGLDBCQUEwQjtBQUMxRztBQUNBLCtDQUErQyxhQUFhO0FBQzVELGlDQUFpQyxrQ0FBa0M7QUFDbkU7QUFDQSw4QkFBOEIsU0FBUztBQUN2QztBQUNBLGtDQUFrQyxtQ0FBbUM7QUFDckU7QUFDQSw4QkFBOEIsU0FBUztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxnQ0FBZ0M7QUFDNUYsaUNBQWlDLGtDQUFrQztBQUNuRTtBQUNBLDhCQUE4QixTQUFTO0FBQ3ZDO0FBQ0EsaUNBQWlDLGtDQUFrQztBQUNuRTtBQUNBLDhCQUE4QixTQUFTO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQSxpQkFBaUIsWUFBWTtBQUM3QjtBQUNBLGlCQUFpQixZQUFZO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw0QkFBNEI7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLDZDQUE2QyxRQUFRO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLE9BQU87QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtELGNBQWM7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSwrQkFBK0IsY0FBYztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLGNBQWM7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNB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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRCxzQ0FBc0MsR0FBRywrQkFBK0I7QUFDeEUsY0FBYztBQUNkLHNCQUFzQjtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsUUFBUTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0RBQXNELFFBQVE7QUFDOUQ7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDRCQUE0QixLQUFLLGVBQWU7QUFDbkU7QUFDQSwwQ0FBMEMsNEJBQTRCO0FBQ3RFO0FBQ0Esb0JBQW9CLDRCQUE0QjtBQUNoRDtBQUNBO0FBQ0Esb0JBQW9CLDBCQUEwQixtQkFBbUI7QUFDakUsdUJBQXVCO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxXQUFXLGFBQWE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxPQUFPO0FBQzdEO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQ0FBMEMsT0FBTztBQUNqRDtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RCxPQUFPO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxPQUFPO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNELFlBQVksMkVBQTJFO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsY0FBYyxTQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxjQUFjLFNBQVM7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsWUFBWSwyQkFBMkIsZ0NBQWdDLGFBQWE7QUFDcEY7QUFDQTtBQUNBLFlBQVksVUFBVSxvQkFBb0IsYUFBYTtBQUN2RDtBQUNBO0FBQ0EsYUFBYTtBQUNiLEdBQUc7QUFDSDtBQUNBLFlBQVksbUJBQW1CO0FBQy9CO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQSxVQUFVLFdBQVc7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sb0VBQW9FLEVBQUUsUUFBUSxTQUFTO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQix1Q0FBdUMsZUFBZTtBQUN0RDtBQUNBLFVBQVUsYUFBYTtBQUN2QixVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsVUFBVSxVQUFVO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHlDQUF5QztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZixNQUFNO0FBQ04sK0NBQStDLEVBQUUsd0JBQXdCLEdBQUcsa0JBQWtCLEVBQUU7QUFDaEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxFQUFFO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksbUJBQW1CO0FBQy9CO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGFBQWE7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLGFBQWE7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLE9BQU87QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLG1CQUFtQixVQUFVLG1CQUFtQjtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhLHlCQUF5QixtQkFBbUI7QUFDdkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxtQkFBbUIsVUFBVSxtQkFBbUI7QUFDOUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsVUFBVTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG1DQUFtQyxVQUFVLGFBQWEsVUFBVSxhQUFhO0FBQ2pHO0FBQ0EsUUFBUTtBQUNSLGdCQUFnQixhQUFhO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxVQUFVO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixtQ0FBbUMsVUFBVSxlQUFlO0FBQzVFO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsbUJBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLGNBQWMsbUJBQW1CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixtQ0FBbUM7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsVUFBVSxRQUFRLCtEQUErRCxtQkFBbUI7QUFDcEc7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx5Q0FBeUM7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSx1REFBdUQ7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLGNBQWM7QUFDakI7QUFDQSx3QkFBd0I7QUFDeEIsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsb0ZBQW9GLGVBQWUsT0FBTyxvQkFBb0IsT0FBTyx1RUFBdUU7QUFDNU07QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsRUFBRTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLEdBQUc7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGFBQWE7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsMEJBQTBCO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLHVDQUF1QztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0EsWUFBWSxvQkFBb0I7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCLFlBQVksaUNBQWlDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsWUFBWSxhQUFhO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFVBQVUseUJBQXlCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSwyQkFBMkI7QUFDM0IsR0FBRztBQUNIO0FBQ0E7QUFDQSxVQUFVLGdEQUFnRDtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixlQUFlO0FBQ3ZDLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixVQUFVLGFBQWEsbUNBQW1DO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0IsZ0NBQWdDO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLDhCQUE4QjtBQUNwRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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O0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxJQUFJLGFBQWE7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLDZDQUE2QztBQUM5QztBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLG9CQUFvQjtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0RBQWdELElBQUk7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBLGdC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QUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsVUFBVTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRUFBcUUsT0FBTztBQUM1RSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxjQUFjLHFCQUFxQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUVBQXFFLHFCQUFxQjtBQUMxRjtBQUNB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLE9BQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsS0FBSztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyx1QkFBdUI7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJFQUEyRSxjQUFjLG9CQUFvQixPQUFPLEtBQUssTUFBTTtBQUMvSDtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNB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WTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLEVBQUUsS0FBSyxTQUFTLEVBQUU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQix3QkFBd0I7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsUUFBUTtBQUNSLDZCQUE2QixLQUFLO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ05BQWdOLG1CQUFtQjtBQUNuTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1SEFBdUgsZUFBZTtBQUN0STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLEtBQUs7QUFDL0I7QUFDQTtBQUNBLG9EQUFvRCxHQUFHLEdBQUcsYUFBYSx1QkFBdUIsc0RBQXNELEtBQUssd0NBQXdDLFlBQVksa0JBQWtCLHVFQUF1RSxHQUFHLGtCQUFrQixRQUFRO0FBQ25VO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBFQUEwRSxHQUFHLFFBQVEsVUFBVTtBQUMvRjtBQUNBLDZCQUE2QixLQUFLO0FBQ2xDLGdCQUFnQixtQkFBbUIsNkNBQTZDLEdBQUcsTUFBTSxXQUFXLElBQUksRUFBRTtBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLEtBQUs7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sMkJBQTJCLEtBQUs7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsMkJBQTJCLEtBQUs7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLDJDQUEyQyxRQUFRLEVBQUUsT0FBTztBQUM1RDtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxVQUFVO0FBQ3hEO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsMkNBQTJDLFFBQVEsRUFBRSxPQUFPO0FBQzVEO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxVQUFVO0FBQ3hEO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLDZCQUE2QjtBQUMxRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsS0FBSztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxvQkFBb0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBKQUEwSixFQUFFO0FBQzVKLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsRUFBRSxnREFBZ0QsRUFBRTtBQUNoRixNQUFNO0FBQ04sZ0dBQWdHLFVBQVU7QUFDMUc7QUFDQSxJQUFJO0FBQ0o7QUFDQSxnSUFBZ0ksRUFBRTtBQUNsSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDLElBQUk7QUFDSix3SUFBd0ksRUFBRTtBQUMxSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0Isa0JBQWtCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLDJCQUEyQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsRUFBRSxjQUFjLEdBQUc7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxFQUFFLHNDQUFzQyxLQUFLO0FBQzVGO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOLDBIQUEwSCxRQUFRLEtBQUssRUFBRTtBQUN6STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBzQ0FBMHNDO0FBQzFzQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsS0FBSztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsRUFBRTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLEVBQUU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsU0FBUyxFQUFFO0FBQzFDO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSwrQkFBK0IsU0FBUyxFQUFFO0FBQzFDO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLFVBQVU7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLElBQUk7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLEdBQUcsT0FBTztBQUNmO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLEtBQUs7QUFDN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixPQUFPO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsT0FBTztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixPQUFPO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLG1CQUFtQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsbUJBQW1CO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGtCQUFrQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RUFBd0UsT0FBTztBQUMvRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQix3QkFBd0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsT0FBTztBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxPQUFPO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLE9BQU87QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1LQUFtSztBQUNuSztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtCQUFrQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0EsdUJBQXVCLFFBQVE7QUFDL0I7QUFDQSxxQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFNBQVM7QUFDdEM7QUFDQTtBQUNB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixPQUFPO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQixVQUFVO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0EsV0FBVyxHQUFHO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxrQ0FBa0M7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QsMEJBQTBCO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsT0FBTztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQjtBQUNBO0FBQ0EscUhBQXFILE9BQU87QUFDNUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsS0FBSztBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLEtBQUs7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixjQUFjO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0EsZ0JBQWdCLGtCQUFrQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLG1DQUFtQyxRQUFRLGlCQUFpQixFQUFFLEdBQUcsUUFBUTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsT0FBTztBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQSxzQkFBc0IsaUJBQWlCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FB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O0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELFVBQVU7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOLGdEQUFnRCxTQUFTLE1BQU0sS0FBSyxFQUFFLHVDQUF1QyxLQUFLLHlDQUF5QyxFQUFFLFFBQVE7QUFDcks7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTyw4QkFBOEIsR0FBRyxtQkFBbUIsT0FBTyxHQUFHLEVBQUUsR0FBRyxFQUFFLGFBQWEsRUFBRTtBQUMzRjtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0QsU0FBUyxLQUFLLEtBQUs7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5SEFBeUgsYUFBYTtBQUN0STtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1osVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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LDJGQUEyRixHQUFHO0FBQzlGO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLDJGQUEyRixhQUFhO0FBQ3hHO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EscUNBQXFDLEdBQUc7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSxnSUFBZ0ksYUFBYSxpR0FBaUcsV0FBVyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7QUFDOVI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04saURBQWlELEdBQUcseUJBQXlCLEVBQUUsSUFBSSxNQUFNO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU8scURBQXFELG9CQUFvQjtBQUNoRjtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRCxhQUFhLFNBQVMsRUFBRTtBQUMzRSx1REFBdUQsRUFBRSxHQUFHLG9DQUFvQyxFQUFFLE1BQU07QUFDeEc7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsZ0VBQWdFLFVBQVU7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkIsR0FBRyw4Q0FBOEMsdURBQXVEO0FBQ25JLGtCQUFrQixFQUFFO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxHQUFHLGtDQUFrQyxHQUFHLE9BQU8sR0FBRyxNQUFNLEVBQUU7QUFDeEc7QUFDQSxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxpREFBaUQsR0FBRztBQUNwRDtBQUNBO0FBQ0E7QUFDQSwyRUFBMkUsRUFBRSxHQUFHLEVBQUUsYUFBYSxHQUFHO0FBQ2xHO0FBQ0Esb0RBQW9EO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRCxHQUFHO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsRUFBRTtBQUNyRCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLG1EQUFtRCxxQkFBcUIsRUFBRSxFQUFFO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdEQUF3RDtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1GQUFtRixFQUFFLElBQUksWUFBWSxJQUFJLGNBQWMsWUFBWSxnQkFBZ0IsR0FBRyxpQkFBaUI7QUFDdks7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5RUFBeUUsNkJBQTZCO0FBQ3RHO0FBQ0E7QUFDQSxnQ0FBZ0MsR0FBRyxHQUFHLE1BQU0sT0FBTyxFQUFFO0FBQ3JEO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxNQUFNO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHNCQUFzQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MsRUFBRTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSw4Q0FBOEM7QUFDM0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlFQUF5RSxFQUFFLE1BQU0sTUFBTSxFQUFFLE1BQU0sR0FBRyxNQUFNO0FBQ3hHO0FBQ0E7QUFDQSw4QkFBOEIsWUFBWSxFQUFFLGFBQWE7QUFDekQ7QUFDQTtBQUNBLGFBQWEsMEJBQTBCLEdBQUcsYUFBYTtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLFdBQVcsRUFBRTtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsSUFBSTtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxlQUFlO0FBQ3hCO0FBQ0EsU0FBUyxVQUFVO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBLFlBQVksR0FBRyxHQUFHLEVBQUU7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04scUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUixpQ0FBaUMsUUFBUTtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtWQUErVjtBQUMvVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsMkNBQTJDO0FBQ3BEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxhQUFhLElBQUksaURBQWlELEVBQUUsMkJBQTJCLEdBQUcsd0JBQXdCO0FBQ3hJO0FBQ0E7QUFDQTtBQUNBLGNBQWMsYUFBYSxJQUFJLGFBQWEsR0FBRyxtQkFBbUI7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1R0FBdUc7QUFDdkc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLEtBQUs7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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O0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRCxFQUFFLHlDQUF5QyxFQUFFLHVDQUF1QyxFQUFFO0FBQzNJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixXQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUU7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixjQUFjO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsV0FBVztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLFFBQVE7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsUUFBUTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixRQUFRO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEIsdUJBQXVCO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLFNBQVM7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHVDQUF1QztBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsMEJBQTBCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHNCQUFzQjtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLLGdEQUFnRDtBQUNyRDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLEtBQUssOENBQThDO0FBQ25EO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssNENBQTRDO0FBQ2pEO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUsseUNBQXlDO0FBQzlDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSywyQ0FBMkM7QUFDaEQ7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxLQUFLLDZDQUE2QztBQUNsRDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssZ0RBQWdEO0FBQ3JEO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSyx5Q0FBeUM7QUFDOUM7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyw4Q0FBOEM7QUFDbkQ7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLDZDQUE2QztBQUNsRDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLLGtEQUFrRDtBQUN2RDtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUsseUNBQXlDO0FBQzlDO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUssMENBQTBDO0FBQy9DO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsRUFBRSxNQUFNLEVBQUU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLElBQUk7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsUUFBUTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEIsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSxVQUFVO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLG9EQUFvRCxFQUFFO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLDBCQUEwQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQSx3Q0FBd0MsR0FBRyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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O0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixHQUFHLGdCQUFnQixNQUFNO0FBQzdDO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsNENBQTRDO0FBQ25GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sNERBQTRELDhDQUE4QyxnQkFBZ0IsMkJBQTJCLGFBQWEsUUFBUSxHQUFHLGVBQWUsS0FBSyxnQkFBZ0I7QUFDak47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxFQUFFO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLFdBQVc7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiwrQkFBK0I7QUFDaEQ7QUFDQSxtQkFBbUIsRUFBRSxTQUFTLEVBQUU7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSyx5Q0FBeUMsZUFBZSxvQ0FBb0MsRUFBRSxLQUFLLFNBQVM7QUFDakgsR0FBRyxXQUFXO0FBQ2Q7QUFDQTtBQUNBLDRIQUE0SDtBQUM1SDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ1FBQWdRO0FBQ2hRO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOENBQThDLEVBQUUsVUFBVSxjQUFjLHNGQUFzRjtBQUM5SjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFHQUFxRyxHQUFHLFFBQVEsR0FBRyxLQUFLLEdBQUcsa0JBQWtCLEVBQUU7QUFDL0k7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxFQUFFLHVCQUF1QixFQUFFO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzTEFBc0wsR0FBRyw4R0FBOEcsR0FBRyxvQkFBb0IsR0FBRyxlQUFlLEVBQUU7QUFDbFY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDBCQUEwQiwyREFBMkQsTUFBTTtBQUM1RztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1S0FBdUssRUFBRSxnRUFBZ0UsRUFBRSxTQUFTLEVBQUUsZ0ZBQWdGLFlBQVksbUNBQW1DLFFBQVEsR0FBRyxRQUFRLEdBQUcsUUFBUTtBQUNuWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDLFlBQVksMEJBQTBCLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxvREFBb0QsRUFBRSx3REFBd0Q7QUFDOU47QUFDQSx3REFBd0QsWUFBWSwwQkFBMEIsU0FBUyxHQUFHLFFBQVE7QUFDbEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsT0FBTztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhGQUE4RixFQUFFLHdGQUF3Riw2Q0FBNkM7QUFDck87QUFDQTtBQUNBO0FBQ0E7QUFDQSx3R0FBd0csRUFBRTtBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQSx3QkFBd0IscUNBQXFDLFFBQVEseUNBQXlDLE9BQU8sT0FBTyxPQUFPLFFBQVEsRUFBRSxRQUFRO0FBQ3JKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtIQUErSCxTQUFTO0FBQ3hJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0Esc0dBQXNHLFFBQVEsY0FBYyxPQUFPO0FBQ25JO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCxPQUFPLHVEQUF1RCxPQUFPLGNBQWMsTUFBTTtBQUN0SjtBQUNBO0FBQ0EscUVBQXFFLE9BQU87QUFDNUU7QUFDQTtBQUNBLDZFQUE2RTtBQUM3RTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxNQUFNO0FBQ04sd0NBQXdDLHNCQUFzQiwwQ0FBMEMsRUFBRTtBQUMxRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLCtCQUErQixLQUFLO0FBQ3BDO0FBQ0EseURBQXlELEVBQUUsR0FBRyxFQUFFLDBHQUEwRyxFQUFFLEdBQUcsRUFBRTtBQUNqTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLHlCQUF5QixpRUFBaUUseUJBQXlCLE9BQU87QUFDMUgsb0NBQW9DLFNBQVMsTUFBTSxLQUFLLGlGQUFpRixNQUFNLGFBQWEsVUFBVTtBQUN0SztBQUNBLCtDQUErQyxFQUFFO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxHQUFHLEVBQUUsTUFBTTtBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0I7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUVBQW1FLEVBQUU7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzRUFBc0U7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsMEZBQTBGLEVBQUU7QUFDNUY7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLHdDQUF3QztBQUN6RSxvQkFBb0Isa0lBQWtJO0FBQ3RKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDRIQUE0SDtBQUNoSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLEVBQUU7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxFQUFFO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsRUFBRTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxFQUFFO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNDQUFzQyxFQUFFO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZFQUE2RSxFQUFFO0FBQy9FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLHNCQUFzQixLQUFLO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdEO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsZUFBZSxHQUFHLDBCQUEwQixFQUFFLGNBQWMsRUFBRSxFQUFFLG1CQUFtQixFQUFFLE9BQU8sYUFBYSxFQUFFO0FBQzNHO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNULE9BQU87QUFDUCxLQUFLO0FBQ0wsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsaUJBQWlCLHFEQUFXO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0EsS0FBSztBQUNMLEdBQUc7QUFDSCxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsQ0FB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QTtBQUNBLDJCQUEyQixjQUFjO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsa0JBQWtCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsSUFBSSxTQUFTO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FB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O0FBQ0E7QUFDQSxXQUFXO0FBQ1gsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixZQUFZO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiLFdBQVc7QUFDWCxTQUFTO0FBQ1QsT0FBTztBQUNQLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFrQkUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5leW5hci9yZWFjdC9kaXN0L2J1bmRsZS5lcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgeW0gPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgdm0gPSAocywgZSwgdCkgPT4gZSBpbiBzID8geW0ocywgZSwgeyBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwLCB2YWx1ZTogdCB9KSA6IHNbZV0gPSB0O1xudmFyIENyID0gKHMsIGUsIHQpID0+IHZtKHMsIHR5cGVvZiBlICE9IFwic3ltYm9sXCIgPyBlICsgXCJcIiA6IGUsIHQpO1xuaW1wb3J0IHsgc3R5bGVkIGFzIGRlIH0gZnJvbSBcIkBwaWdtZW50LWNzcy9yZWFjdFwiO1xuaW1wb3J0IHN0LCB7IGNyZWF0ZUNvbnRleHQgYXMgYWEsIHVzZU1lbW8gYXMgWnIsIHVzZUNvbnRleHQgYXMgQWksIHVzZVN0YXRlIGFzIHFlLCB1c2VSZWYgYXMgYnQsIHVzZUNhbGxiYWNrIGFzIHV0LCB1c2VFZmZlY3QgYXMgZnQsIHVzZUxheW91dEVmZmVjdCBhcyBFbSwgdXNlRGVidWdWYWx1ZSBhcyB4bSwgbWVtbyBhcyBNZiB9IGZyb20gXCJyZWFjdFwiO1xuY29uc3QgR3IgPSB7XG4gIHZhcnM6IHtcbiAgICBjb2xvcnM6IHtcbiAgICAgIHByaW1hcnk6IFwidmFyKC0tY29sb3JzLXByaW1hcnkpXCJcbiAgICB9LFxuICAgIHR5cG9ncmFwaHk6IHtcbiAgICAgIGZvbnRzOiB7XG4gICAgICAgIGJhc2U6IFwidmFyKC0tdHlwb2dyYXBoeS1mb250cy1iYXNlKVwiXG4gICAgICB9LFxuICAgICAgZm9udFdlaWdodHM6IHtcbiAgICAgICAgcmVndWxhcjogXCJ2YXIoLS10eXBvZ3JhcGh5LWZvbnRXZWlnaHRzLXJlZ3VsYXIpXCIsXG4gICAgICAgIGJvbGQ6IFwidmFyKC0tdHlwb2dyYXBoeS1mb250V2VpZ2h0cy1ib2xkKVwiXG4gICAgICB9LFxuICAgICAgZm9udFNpemVzOiB7XG4gICAgICAgIGxhcmdlOiBcInZhcigtLXR5cG9ncmFwaHktZm9udFNpemVzLWxhcmdlKVwiLFxuICAgICAgICBtZWRpdW06IFwidmFyKC0tdHlwb2dyYXBoeS1mb250U2l6ZXMtbWVkaXVtKVwiLFxuICAgICAgICBzbWFsbDogXCJ2YXIoLS10eXBvZ3JhcGh5LWZvbnRTaXplcy1zbWFsbClcIlxuICAgICAgfVxuICAgIH0sXG4gICAgcGFsZXR0ZToge1xuICAgICAgYmFja2dyb3VuZDogXCJ2YXIoLS1wYWxldHRlLWJhY2tncm91bmQpXCIsXG4gICAgICBib3JkZXI6IFwidmFyKC0tcGFsZXR0ZS1ib3JkZXIpXCIsXG4gICAgICB0ZXh0OiBcInZhcigtLXBhbGV0dGUtdGV4dClcIixcbiAgICAgIHRleHRNdXRlZDogXCJ2YXIoLS1wYWxldHRlLXRleHRNdXRlZClcIlxuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIEZjKHMpIHtcbiAgcmV0dXJuIHMgJiYgcy5fX2VzTW9kdWxlICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBcImRlZmF1bHRcIikgPyBzLmRlZmF1bHQgOiBzO1xufVxuZnVuY3Rpb24gTmMocykge1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIFwiX19lc01vZHVsZVwiKSkgcmV0dXJuIHM7XG4gIHZhciBlID0gcy5kZWZhdWx0O1xuICBpZiAodHlwZW9mIGUgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdmFyIHQgPSBmdW5jdGlvbiByKCkge1xuICAgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiByID8gUmVmbGVjdC5jb25zdHJ1Y3QoZSwgYXJndW1lbnRzLCB0aGlzLmNvbnN0cnVjdG9yKSA6IGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICAgIHQucHJvdG90eXBlID0gZS5wcm90b3R5cGU7XG4gIH0gZWxzZSB0ID0ge307XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogITBcbiAgfSksIE9iamVjdC5rZXlzKHMpLmZvckVhY2goZnVuY3Rpb24ocikge1xuICAgIHZhciBuID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzLCByKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodCwgciwgbi5nZXQgPyBuIDoge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gc1tyXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSksIHQ7XG59XG52YXIgVWEgPSB7IGV4cG9ydHM6IHt9IH0sIEtuID0ge307XG4vKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1qc3gtcnVudGltZS5wcm9kdWN0aW9uLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xudmFyIFd1O1xuZnVuY3Rpb24gU20oKSB7XG4gIGlmIChXdSkgcmV0dXJuIEtuO1xuICBXdSA9IDE7XG4gIHZhciBzID0gU3ltYm9sLmZvcihcInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50XCIpLCBlID0gU3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpO1xuICBmdW5jdGlvbiB0KHIsIG4sIGkpIHtcbiAgICB2YXIgbyA9IG51bGw7XG4gICAgaWYgKGkgIT09IHZvaWQgMCAmJiAobyA9IFwiXCIgKyBpKSwgbi5rZXkgIT09IHZvaWQgMCAmJiAobyA9IFwiXCIgKyBuLmtleSksIFwia2V5XCIgaW4gbikge1xuICAgICAgaSA9IHt9O1xuICAgICAgZm9yICh2YXIgYSBpbiBuKVxuICAgICAgICBhICE9PSBcImtleVwiICYmIChpW2FdID0gblthXSk7XG4gICAgfSBlbHNlIGkgPSBuO1xuICAgIHJldHVybiBuID0gaS5yZWYsIHtcbiAgICAgICQkdHlwZW9mOiBzLFxuICAgICAgdHlwZTogcixcbiAgICAgIGtleTogbyxcbiAgICAgIHJlZjogbiAhPT0gdm9pZCAwID8gbiA6IG51bGwsXG4gICAgICBwcm9wczogaVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIEtuLkZyYWdtZW50ID0gZSwgS24uanN4ID0gdCwgS24uanN4cyA9IHQsIEtuO1xufVxudmFyIHp1O1xuZnVuY3Rpb24gYm0oKSB7XG4gIHJldHVybiB6dSB8fCAoenUgPSAxLCBVYS5leHBvcnRzID0gU20oKSksIFVhLmV4cG9ydHM7XG59XG52YXIgcSA9IGJtKCk7XG5sZXQgVW4gPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IodCwgciA9IHt9KSB7XG4gICAgc3VwZXIodCwgci5jYXVzZSA/IHsgY2F1c2U6IHIuY2F1c2UgfSA6IHZvaWQgMCk7XG4gICAgQ3IodGhpcywgXCJuYW1lXCIsIFwiQmFzZUVycm9yXCIpO1xuICAgIENyKHRoaXMsIFwiY2F1c2VcIik7XG4gICAgdGhpcy5jYXVzZSA9IHIuY2F1c2U7XG4gIH1cbn07XG5jbGFzcyBUbSBleHRlbmRzIFVuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJJbnZhbGlkIGRvbWFpbiBtYW5pZmVzdFwiKTtcbiAgICBDcih0aGlzLCBcIm5hbWVcIiwgXCJBZGRNaW5pQXBwLkludmFsaWREb21haW5NYW5pZmVzdFwiKTtcbiAgfVxufVxubGV0IHdtID0gY2xhc3MgZXh0ZW5kcyBVbiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiQWRkIG1pbmlhcHAgcmVqZWN0ZWQgYnkgdXNlclwiKTtcbiAgICBDcih0aGlzLCBcIm5hbWVcIiwgXCJBZGRNaW5pQXBwLlJlamVjdGVkQnlVc2VyXCIpO1xuICB9XG59LCBPZiA9IGNsYXNzIGV4dGVuZHMgVW4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlNpZ24gaW4gcmVqZWN0ZWQgYnkgdXNlclwiKTtcbiAgICBDcih0aGlzLCBcIm5hbWVcIiwgXCJTaWduSW4uUmVqZWN0ZWRCeVVzZXJcIik7XG4gIH1cbn07XG5jbGFzcyBBbSBleHRlbmRzIFVuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJTaWduIG1hbmlmZXN0IHJlamVjdGVkIGJ5IHVzZXJcIik7XG4gICAgQ3IodGhpcywgXCJuYW1lXCIsIFwiU2lnbk1hbmlmZXN0LlJlamVjdGVkQnlVc2VyXCIpO1xuICB9XG59XG5jbGFzcyBJbSBleHRlbmRzIFVuIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJJbnZhbGlkIGRvbWFpbiBwcm92aWRlZFwiKTtcbiAgICBDcih0aGlzLCBcIm5hbWVcIiwgXCJTaWduTWFuaWZlc3QuSW52YWxpZERvbWFpblwiKTtcbiAgfVxufVxuY2xhc3MgX20gZXh0ZW5kcyBVbiB7XG4gIGNvbnN0cnVjdG9yKHQgPSBcIk1hbmlmZXN0IHNpZ25pbmcgZmFpbGVkXCIpIHtcbiAgICBzdXBlcih0KTtcbiAgICBDcih0aGlzLCBcIm5hbWVcIiwgXCJTaWduTWFuaWZlc3QuR2VuZXJpY0Vycm9yXCIpO1xuICB9XG59XG52YXIgWmU7XG4oZnVuY3Rpb24ocykge1xuICBzLmFzc2VydEVxdWFsID0gKG4pID0+IHtcbiAgfTtcbiAgZnVuY3Rpb24gZShuKSB7XG4gIH1cbiAgcy5hc3NlcnRJcyA9IGU7XG4gIGZ1bmN0aW9uIHQobikge1xuICAgIHRocm93IG5ldyBFcnJvcigpO1xuICB9XG4gIHMuYXNzZXJ0TmV2ZXIgPSB0LCBzLmFycmF5VG9FbnVtID0gKG4pID0+IHtcbiAgICBjb25zdCBpID0ge307XG4gICAgZm9yIChjb25zdCBvIG9mIG4pXG4gICAgICBpW29dID0gbztcbiAgICByZXR1cm4gaTtcbiAgfSwgcy5nZXRWYWxpZEVudW1WYWx1ZXMgPSAobikgPT4ge1xuICAgIGNvbnN0IGkgPSBzLm9iamVjdEtleXMobikuZmlsdGVyKChhKSA9PiB0eXBlb2YgbltuW2FdXSAhPSBcIm51bWJlclwiKSwgbyA9IHt9O1xuICAgIGZvciAoY29uc3QgYSBvZiBpKVxuICAgICAgb1thXSA9IG5bYV07XG4gICAgcmV0dXJuIHMub2JqZWN0VmFsdWVzKG8pO1xuICB9LCBzLm9iamVjdFZhbHVlcyA9IChuKSA9PiBzLm9iamVjdEtleXMobikubWFwKGZ1bmN0aW9uKGkpIHtcbiAgICByZXR1cm4gbltpXTtcbiAgfSksIHMub2JqZWN0S2V5cyA9IHR5cGVvZiBPYmplY3Qua2V5cyA9PSBcImZ1bmN0aW9uXCIgPyAobikgPT4gT2JqZWN0LmtleXMobikgOiAobikgPT4ge1xuICAgIGNvbnN0IGkgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG8gaW4gbilcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLCBvKSAmJiBpLnB1c2gobyk7XG4gICAgcmV0dXJuIGk7XG4gIH0sIHMuZmluZCA9IChuLCBpKSA9PiB7XG4gICAgZm9yIChjb25zdCBvIG9mIG4pXG4gICAgICBpZiAoaShvKSlcbiAgICAgICAgcmV0dXJuIG87XG4gIH0sIHMuaXNJbnRlZ2VyID0gdHlwZW9mIE51bWJlci5pc0ludGVnZXIgPT0gXCJmdW5jdGlvblwiID8gKG4pID0+IE51bWJlci5pc0ludGVnZXIobikgOiAobikgPT4gdHlwZW9mIG4gPT0gXCJudW1iZXJcIiAmJiBOdW1iZXIuaXNGaW5pdGUobikgJiYgTWF0aC5mbG9vcihuKSA9PT0gbjtcbiAgZnVuY3Rpb24gcihuLCBpID0gXCIgfCBcIikge1xuICAgIHJldHVybiBuLm1hcCgobykgPT4gdHlwZW9mIG8gPT0gXCJzdHJpbmdcIiA/IGAnJHtvfSdgIDogbykuam9pbihpKTtcbiAgfVxuICBzLmpvaW5WYWx1ZXMgPSByLCBzLmpzb25TdHJpbmdpZnlSZXBsYWNlciA9IChuLCBpKSA9PiB0eXBlb2YgaSA9PSBcImJpZ2ludFwiID8gaS50b1N0cmluZygpIDogaTtcbn0pKFplIHx8IChaZSA9IHt9KSk7XG52YXIgWXU7XG4oZnVuY3Rpb24ocykge1xuICBzLm1lcmdlU2hhcGVzID0gKGUsIHQpID0+ICh7XG4gICAgLi4uZSxcbiAgICAuLi50XG4gICAgLy8gc2Vjb25kIG92ZXJ3cml0ZXMgZmlyc3RcbiAgfSk7XG59KShZdSB8fCAoWXUgPSB7fSkpO1xuY29uc3QgbWUgPSBaZS5hcnJheVRvRW51bShbXG4gIFwic3RyaW5nXCIsXG4gIFwibmFuXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiaW50ZWdlclwiLFxuICBcImZsb2F0XCIsXG4gIFwiYm9vbGVhblwiLFxuICBcImRhdGVcIixcbiAgXCJiaWdpbnRcIixcbiAgXCJzeW1ib2xcIixcbiAgXCJmdW5jdGlvblwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcIm51bGxcIixcbiAgXCJhcnJheVwiLFxuICBcIm9iamVjdFwiLFxuICBcInVua25vd25cIixcbiAgXCJwcm9taXNlXCIsXG4gIFwidm9pZFwiLFxuICBcIm5ldmVyXCIsXG4gIFwibWFwXCIsXG4gIFwic2V0XCJcbl0pLCB3cyA9IChzKSA9PiB7XG4gIHN3aXRjaCAodHlwZW9mIHMpIHtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gbWUudW5kZWZpbmVkO1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBtZS5zdHJpbmc7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIE51bWJlci5pc05hTihzKSA/IG1lLm5hbiA6IG1lLm51bWJlcjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIG1lLmJvb2xlYW47XG4gICAgY2FzZSBcImZ1bmN0aW9uXCI6XG4gICAgICByZXR1cm4gbWUuZnVuY3Rpb247XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIG1lLmJpZ2ludDtcbiAgICBjYXNlIFwic3ltYm9sXCI6XG4gICAgICByZXR1cm4gbWUuc3ltYm9sO1xuICAgIGNhc2UgXCJvYmplY3RcIjpcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHMpID8gbWUuYXJyYXkgOiBzID09PSBudWxsID8gbWUubnVsbCA6IHMudGhlbiAmJiB0eXBlb2Ygcy50aGVuID09IFwiZnVuY3Rpb25cIiAmJiBzLmNhdGNoICYmIHR5cGVvZiBzLmNhdGNoID09IFwiZnVuY3Rpb25cIiA/IG1lLnByb21pc2UgOiB0eXBlb2YgTWFwIDwgXCJ1XCIgJiYgcyBpbnN0YW5jZW9mIE1hcCA/IG1lLm1hcCA6IHR5cGVvZiBTZXQgPCBcInVcIiAmJiBzIGluc3RhbmNlb2YgU2V0ID8gbWUuc2V0IDogdHlwZW9mIERhdGUgPCBcInVcIiAmJiBzIGluc3RhbmNlb2YgRGF0ZSA/IG1lLmRhdGUgOiBtZS5vYmplY3Q7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBtZS51bmtub3duO1xuICB9XG59LCBhZSA9IFplLmFycmF5VG9FbnVtKFtcbiAgXCJpbnZhbGlkX3R5cGVcIixcbiAgXCJpbnZhbGlkX2xpdGVyYWxcIixcbiAgXCJjdXN0b21cIixcbiAgXCJpbnZhbGlkX3VuaW9uXCIsXG4gIFwiaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yXCIsXG4gIFwiaW52YWxpZF9lbnVtX3ZhbHVlXCIsXG4gIFwidW5yZWNvZ25pemVkX2tleXNcIixcbiAgXCJpbnZhbGlkX2FyZ3VtZW50c1wiLFxuICBcImludmFsaWRfcmV0dXJuX3R5cGVcIixcbiAgXCJpbnZhbGlkX2RhdGVcIixcbiAgXCJpbnZhbGlkX3N0cmluZ1wiLFxuICBcInRvb19zbWFsbFwiLFxuICBcInRvb19iaWdcIixcbiAgXCJpbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlc1wiLFxuICBcIm5vdF9tdWx0aXBsZV9vZlwiLFxuICBcIm5vdF9maW5pdGVcIlxuXSk7XG5jbGFzcyBwcyBleHRlbmRzIEVycm9yIHtcbiAgZ2V0IGVycm9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5pc3N1ZXM7XG4gIH1cbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHN1cGVyKCksIHRoaXMuaXNzdWVzID0gW10sIHRoaXMuYWRkSXNzdWUgPSAocikgPT4ge1xuICAgICAgdGhpcy5pc3N1ZXMgPSBbLi4udGhpcy5pc3N1ZXMsIHJdO1xuICAgIH0sIHRoaXMuYWRkSXNzdWVzID0gKHIgPSBbXSkgPT4ge1xuICAgICAgdGhpcy5pc3N1ZXMgPSBbLi4udGhpcy5pc3N1ZXMsIC4uLnJdO1xuICAgIH07XG4gICAgY29uc3QgdCA9IG5ldy50YXJnZXQucHJvdG90eXBlO1xuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZiA/IE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCB0KSA6IHRoaXMuX19wcm90b19fID0gdCwgdGhpcy5uYW1lID0gXCJab2RFcnJvclwiLCB0aGlzLmlzc3VlcyA9IGU7XG4gIH1cbiAgZm9ybWF0KGUpIHtcbiAgICBjb25zdCB0ID0gZSB8fCBmdW5jdGlvbihpKSB7XG4gICAgICByZXR1cm4gaS5tZXNzYWdlO1xuICAgIH0sIHIgPSB7IF9lcnJvcnM6IFtdIH0sIG4gPSAoaSkgPT4ge1xuICAgICAgZm9yIChjb25zdCBvIG9mIGkuaXNzdWVzKVxuICAgICAgICBpZiAoby5jb2RlID09PSBcImludmFsaWRfdW5pb25cIilcbiAgICAgICAgICBvLnVuaW9uRXJyb3JzLm1hcChuKTtcbiAgICAgICAgZWxzZSBpZiAoby5jb2RlID09PSBcImludmFsaWRfcmV0dXJuX3R5cGVcIilcbiAgICAgICAgICBuKG8ucmV0dXJuVHlwZUVycm9yKTtcbiAgICAgICAgZWxzZSBpZiAoby5jb2RlID09PSBcImludmFsaWRfYXJndW1lbnRzXCIpXG4gICAgICAgICAgbihvLmFyZ3VtZW50c0Vycm9yKTtcbiAgICAgICAgZWxzZSBpZiAoby5wYXRoLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICByLl9lcnJvcnMucHVzaCh0KG8pKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgbGV0IGEgPSByLCBsID0gMDtcbiAgICAgICAgICBmb3IgKDsgbCA8IG8ucGF0aC5sZW5ndGg7ICkge1xuICAgICAgICAgICAgY29uc3QgYyA9IG8ucGF0aFtsXTtcbiAgICAgICAgICAgIGwgPT09IG8ucGF0aC5sZW5ndGggLSAxID8gKGFbY10gPSBhW2NdIHx8IHsgX2Vycm9yczogW10gfSwgYVtjXS5fZXJyb3JzLnB1c2godChvKSkpIDogYVtjXSA9IGFbY10gfHwgeyBfZXJyb3JzOiBbXSB9LCBhID0gYVtjXSwgbCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIG4odGhpcyksIHI7XG4gIH1cbiAgc3RhdGljIGFzc2VydChlKSB7XG4gICAgaWYgKCEoZSBpbnN0YW5jZW9mIHBzKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IGEgWm9kRXJyb3I6ICR7ZX1gKTtcbiAgfVxuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tZXNzYWdlO1xuICB9XG4gIGdldCBtZXNzYWdlKCkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmlzc3VlcywgWmUuanNvblN0cmluZ2lmeVJlcGxhY2VyLCAyKTtcbiAgfVxuICBnZXQgaXNFbXB0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc3N1ZXMubGVuZ3RoID09PSAwO1xuICB9XG4gIGZsYXR0ZW4oZSA9ICh0KSA9PiB0Lm1lc3NhZ2UpIHtcbiAgICBjb25zdCB0ID0ge30sIHIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG4gb2YgdGhpcy5pc3N1ZXMpXG4gICAgICBpZiAobi5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgaSA9IG4ucGF0aFswXTtcbiAgICAgICAgdFtpXSA9IHRbaV0gfHwgW10sIHRbaV0ucHVzaChlKG4pKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICByLnB1c2goZShuKSk7XG4gICAgcmV0dXJuIHsgZm9ybUVycm9yczogciwgZmllbGRFcnJvcnM6IHQgfTtcbiAgfVxuICBnZXQgZm9ybUVycm9ycygpIHtcbiAgICByZXR1cm4gdGhpcy5mbGF0dGVuKCk7XG4gIH1cbn1cbnBzLmNyZWF0ZSA9IChzKSA9PiBuZXcgcHMocyk7XG5jb25zdCBLbCA9IChzLCBlKSA9PiB7XG4gIGxldCB0O1xuICBzd2l0Y2ggKHMuY29kZSkge1xuICAgIGNhc2UgYWUuaW52YWxpZF90eXBlOlxuICAgICAgcy5yZWNlaXZlZCA9PT0gbWUudW5kZWZpbmVkID8gdCA9IFwiUmVxdWlyZWRcIiA6IHQgPSBgRXhwZWN0ZWQgJHtzLmV4cGVjdGVkfSwgcmVjZWl2ZWQgJHtzLnJlY2VpdmVkfWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLmludmFsaWRfbGl0ZXJhbDpcbiAgICAgIHQgPSBgSW52YWxpZCBsaXRlcmFsIHZhbHVlLCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KHMuZXhwZWN0ZWQsIFplLmpzb25TdHJpbmdpZnlSZXBsYWNlcil9YDtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYWUudW5yZWNvZ25pemVkX2tleXM6XG4gICAgICB0ID0gYFVucmVjb2duaXplZCBrZXkocykgaW4gb2JqZWN0OiAke1plLmpvaW5WYWx1ZXMocy5rZXlzLCBcIiwgXCIpfWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLmludmFsaWRfdW5pb246XG4gICAgICB0ID0gXCJJbnZhbGlkIGlucHV0XCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcjpcbiAgICAgIHQgPSBgSW52YWxpZCBkaXNjcmltaW5hdG9yIHZhbHVlLiBFeHBlY3RlZCAke1plLmpvaW5WYWx1ZXMocy5vcHRpb25zKX1gO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhZS5pbnZhbGlkX2VudW1fdmFsdWU6XG4gICAgICB0ID0gYEludmFsaWQgZW51bSB2YWx1ZS4gRXhwZWN0ZWQgJHtaZS5qb2luVmFsdWVzKHMub3B0aW9ucyl9LCByZWNlaXZlZCAnJHtzLnJlY2VpdmVkfSdgO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhZS5pbnZhbGlkX2FyZ3VtZW50czpcbiAgICAgIHQgPSBcIkludmFsaWQgZnVuY3Rpb24gYXJndW1lbnRzXCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLmludmFsaWRfcmV0dXJuX3R5cGU6XG4gICAgICB0ID0gXCJJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlXCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLmludmFsaWRfZGF0ZTpcbiAgICAgIHQgPSBcIkludmFsaWQgZGF0ZVwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhZS5pbnZhbGlkX3N0cmluZzpcbiAgICAgIHR5cGVvZiBzLnZhbGlkYXRpb24gPT0gXCJvYmplY3RcIiA/IFwiaW5jbHVkZXNcIiBpbiBzLnZhbGlkYXRpb24gPyAodCA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IGluY2x1ZGUgXCIke3MudmFsaWRhdGlvbi5pbmNsdWRlc31cImAsIHR5cGVvZiBzLnZhbGlkYXRpb24ucG9zaXRpb24gPT0gXCJudW1iZXJcIiAmJiAodCA9IGAke3R9IGF0IG9uZSBvciBtb3JlIHBvc2l0aW9ucyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJHtzLnZhbGlkYXRpb24ucG9zaXRpb259YCkpIDogXCJzdGFydHNXaXRoXCIgaW4gcy52YWxpZGF0aW9uID8gdCA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggXCIke3MudmFsaWRhdGlvbi5zdGFydHNXaXRofVwiYCA6IFwiZW5kc1dpdGhcIiBpbiBzLnZhbGlkYXRpb24gPyB0ID0gYEludmFsaWQgaW5wdXQ6IG11c3QgZW5kIHdpdGggXCIke3MudmFsaWRhdGlvbi5lbmRzV2l0aH1cImAgOiBaZS5hc3NlcnROZXZlcihzLnZhbGlkYXRpb24pIDogcy52YWxpZGF0aW9uICE9PSBcInJlZ2V4XCIgPyB0ID0gYEludmFsaWQgJHtzLnZhbGlkYXRpb259YCA6IHQgPSBcIkludmFsaWRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYWUudG9vX3NtYWxsOlxuICAgICAgcy50eXBlID09PSBcImFycmF5XCIgPyB0ID0gYEFycmF5IG11c3QgY29udGFpbiAke3MuZXhhY3QgPyBcImV4YWN0bHlcIiA6IHMuaW5jbHVzaXZlID8gXCJhdCBsZWFzdFwiIDogXCJtb3JlIHRoYW5cIn0gJHtzLm1pbmltdW19IGVsZW1lbnQocylgIDogcy50eXBlID09PSBcInN0cmluZ1wiID8gdCA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7cy5leGFjdCA/IFwiZXhhY3RseVwiIDogcy5pbmNsdXNpdmUgPyBcImF0IGxlYXN0XCIgOiBcIm92ZXJcIn0gJHtzLm1pbmltdW19IGNoYXJhY3RlcihzKWAgOiBzLnR5cGUgPT09IFwibnVtYmVyXCIgPyB0ID0gYE51bWJlciBtdXN0IGJlICR7cy5leGFjdCA/IFwiZXhhY3RseSBlcXVhbCB0byBcIiA6IHMuaW5jbHVzaXZlID8gXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gXCIgOiBcImdyZWF0ZXIgdGhhbiBcIn0ke3MubWluaW11bX1gIDogcy50eXBlID09PSBcImJpZ2ludFwiID8gdCA9IGBOdW1iZXIgbXVzdCBiZSAke3MuZXhhY3QgPyBcImV4YWN0bHkgZXF1YWwgdG8gXCIgOiBzLmluY2x1c2l2ZSA/IFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFwiIDogXCJncmVhdGVyIHRoYW4gXCJ9JHtzLm1pbmltdW19YCA6IHMudHlwZSA9PT0gXCJkYXRlXCIgPyB0ID0gYERhdGUgbXVzdCBiZSAke3MuZXhhY3QgPyBcImV4YWN0bHkgZXF1YWwgdG8gXCIgOiBzLmluY2x1c2l2ZSA/IFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFwiIDogXCJncmVhdGVyIHRoYW4gXCJ9JHtuZXcgRGF0ZShOdW1iZXIocy5taW5pbXVtKSl9YCA6IHQgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYWUudG9vX2JpZzpcbiAgICAgIHMudHlwZSA9PT0gXCJhcnJheVwiID8gdCA9IGBBcnJheSBtdXN0IGNvbnRhaW4gJHtzLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBzLmluY2x1c2l2ZSA/IFwiYXQgbW9zdFwiIDogXCJsZXNzIHRoYW5cIn0gJHtzLm1heGltdW19IGVsZW1lbnQocylgIDogcy50eXBlID09PSBcInN0cmluZ1wiID8gdCA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7cy5leGFjdCA/IFwiZXhhY3RseVwiIDogcy5pbmNsdXNpdmUgPyBcImF0IG1vc3RcIiA6IFwidW5kZXJcIn0gJHtzLm1heGltdW19IGNoYXJhY3RlcihzKWAgOiBzLnR5cGUgPT09IFwibnVtYmVyXCIgPyB0ID0gYE51bWJlciBtdXN0IGJlICR7cy5leGFjdCA/IFwiZXhhY3RseVwiIDogcy5pbmNsdXNpdmUgPyBcImxlc3MgdGhhbiBvciBlcXVhbCB0b1wiIDogXCJsZXNzIHRoYW5cIn0gJHtzLm1heGltdW19YCA6IHMudHlwZSA9PT0gXCJiaWdpbnRcIiA/IHQgPSBgQmlnSW50IG11c3QgYmUgJHtzLmV4YWN0ID8gXCJleGFjdGx5XCIgOiBzLmluY2x1c2l2ZSA/IFwibGVzcyB0aGFuIG9yIGVxdWFsIHRvXCIgOiBcImxlc3MgdGhhblwifSAke3MubWF4aW11bX1gIDogcy50eXBlID09PSBcImRhdGVcIiA/IHQgPSBgRGF0ZSBtdXN0IGJlICR7cy5leGFjdCA/IFwiZXhhY3RseVwiIDogcy5pbmNsdXNpdmUgPyBcInNtYWxsZXIgdGhhbiBvciBlcXVhbCB0b1wiIDogXCJzbWFsbGVyIHRoYW5cIn0gJHtuZXcgRGF0ZShOdW1iZXIocy5tYXhpbXVtKSl9YCA6IHQgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYWUuY3VzdG9tOlxuICAgICAgdCA9IFwiSW52YWxpZCBpbnB1dFwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBhZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlczpcbiAgICAgIHQgPSBcIkludGVyc2VjdGlvbiByZXN1bHRzIGNvdWxkIG5vdCBiZSBtZXJnZWRcIjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgYWUubm90X211bHRpcGxlX29mOlxuICAgICAgdCA9IGBOdW1iZXIgbXVzdCBiZSBhIG11bHRpcGxlIG9mICR7cy5tdWx0aXBsZU9mfWA7XG4gICAgICBicmVhaztcbiAgICBjYXNlIGFlLm5vdF9maW5pdGU6XG4gICAgICB0ID0gXCJOdW1iZXIgbXVzdCBiZSBmaW5pdGVcIjtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0ID0gZS5kZWZhdWx0RXJyb3IsIFplLmFzc2VydE5ldmVyKHMpO1xuICB9XG4gIHJldHVybiB7IG1lc3NhZ2U6IHQgfTtcbn07XG5sZXQgUm0gPSBLbDtcbmZ1bmN0aW9uIExtKCkge1xuICByZXR1cm4gUm07XG59XG5jb25zdCBDbSA9IChzKSA9PiB7XG4gIGNvbnN0IHsgZGF0YTogZSwgcGF0aDogdCwgZXJyb3JNYXBzOiByLCBpc3N1ZURhdGE6IG4gfSA9IHMsIGkgPSBbLi4udCwgLi4ubi5wYXRoIHx8IFtdXSwgbyA9IHtcbiAgICAuLi5uLFxuICAgIHBhdGg6IGlcbiAgfTtcbiAgaWYgKG4ubWVzc2FnZSAhPT0gdm9pZCAwKVxuICAgIHJldHVybiB7XG4gICAgICAuLi5uLFxuICAgICAgcGF0aDogaSxcbiAgICAgIG1lc3NhZ2U6IG4ubWVzc2FnZVxuICAgIH07XG4gIGxldCBhID0gXCJcIjtcbiAgY29uc3QgbCA9IHIuZmlsdGVyKChjKSA9PiAhIWMpLnNsaWNlKCkucmV2ZXJzZSgpO1xuICBmb3IgKGNvbnN0IGMgb2YgbClcbiAgICBhID0gYyhvLCB7IGRhdGE6IGUsIGRlZmF1bHRFcnJvcjogYSB9KS5tZXNzYWdlO1xuICByZXR1cm4ge1xuICAgIC4uLm4sXG4gICAgcGF0aDogaSxcbiAgICBtZXNzYWdlOiBhXG4gIH07XG59O1xuZnVuY3Rpb24gaGUocywgZSkge1xuICBjb25zdCB0ID0gTG0oKSwgciA9IENtKHtcbiAgICBpc3N1ZURhdGE6IGUsXG4gICAgZGF0YTogcy5kYXRhLFxuICAgIHBhdGg6IHMucGF0aCxcbiAgICBlcnJvck1hcHM6IFtcbiAgICAgIHMuY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCxcbiAgICAgIC8vIGNvbnRleHR1YWwgZXJyb3IgbWFwIGlzIGZpcnN0IHByaW9yaXR5XG4gICAgICBzLnNjaGVtYUVycm9yTWFwLFxuICAgICAgLy8gdGhlbiBzY2hlbWEtYm91bmQgbWFwIGlmIGF2YWlsYWJsZVxuICAgICAgdCxcbiAgICAgIC8vIHRoZW4gZ2xvYmFsIG92ZXJyaWRlIG1hcFxuICAgICAgdCA9PT0gS2wgPyB2b2lkIDAgOiBLbFxuICAgICAgLy8gdGhlbiBnbG9iYWwgZGVmYXVsdCBtYXBcbiAgICBdLmZpbHRlcigobikgPT4gISFuKVxuICB9KTtcbiAgcy5jb21tb24uaXNzdWVzLnB1c2gocik7XG59XG5jbGFzcyB3ciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudmFsdWUgPSBcInZhbGlkXCI7XG4gIH1cbiAgZGlydHkoKSB7XG4gICAgdGhpcy52YWx1ZSA9PT0gXCJ2YWxpZFwiICYmICh0aGlzLnZhbHVlID0gXCJkaXJ0eVwiKTtcbiAgfVxuICBhYm9ydCgpIHtcbiAgICB0aGlzLnZhbHVlICE9PSBcImFib3J0ZWRcIiAmJiAodGhpcy52YWx1ZSA9IFwiYWJvcnRlZFwiKTtcbiAgfVxuICBzdGF0aWMgbWVyZ2VBcnJheShlLCB0KSB7XG4gICAgY29uc3QgciA9IFtdO1xuICAgIGZvciAoY29uc3QgbiBvZiB0KSB7XG4gICAgICBpZiAobi5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICByZXR1cm4gUmU7XG4gICAgICBuLnN0YXR1cyA9PT0gXCJkaXJ0eVwiICYmIGUuZGlydHkoKSwgci5wdXNoKG4udmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4geyBzdGF0dXM6IGUudmFsdWUsIHZhbHVlOiByIH07XG4gIH1cbiAgc3RhdGljIGFzeW5jIG1lcmdlT2JqZWN0QXN5bmMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG4gb2YgdCkge1xuICAgICAgY29uc3QgaSA9IGF3YWl0IG4ua2V5LCBvID0gYXdhaXQgbi52YWx1ZTtcbiAgICAgIHIucHVzaCh7XG4gICAgICAgIGtleTogaSxcbiAgICAgICAgdmFsdWU6IG9cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gd3IubWVyZ2VPYmplY3RTeW5jKGUsIHIpO1xuICB9XG4gIHN0YXRpYyBtZXJnZU9iamVjdFN5bmMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB7fTtcbiAgICBmb3IgKGNvbnN0IG4gb2YgdCkge1xuICAgICAgY29uc3QgeyBrZXk6IGksIHZhbHVlOiBvIH0gPSBuO1xuICAgICAgaWYgKGkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCBvLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgIHJldHVybiBSZTtcbiAgICAgIGkuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgZS5kaXJ0eSgpLCBvLnN0YXR1cyA9PT0gXCJkaXJ0eVwiICYmIGUuZGlydHkoKSwgaS52YWx1ZSAhPT0gXCJfX3Byb3RvX19cIiAmJiAodHlwZW9mIG8udmFsdWUgPCBcInVcIiB8fCBuLmFsd2F5c1NldCkgJiYgKHJbaS52YWx1ZV0gPSBvLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdHVzOiBlLnZhbHVlLCB2YWx1ZTogciB9O1xuICB9XG59XG5jb25zdCBSZSA9IE9iamVjdC5mcmVlemUoe1xuICBzdGF0dXM6IFwiYWJvcnRlZFwiXG59KSwgV24gPSAocykgPT4gKHsgc3RhdHVzOiBcImRpcnR5XCIsIHZhbHVlOiBzIH0pLCBSciA9IChzKSA9PiAoeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IHMgfSksIFp1ID0gKHMpID0+IHMuc3RhdHVzID09PSBcImFib3J0ZWRcIiwgWHUgPSAocykgPT4gcy5zdGF0dXMgPT09IFwiZGlydHlcIiwgTG4gPSAocykgPT4gcy5zdGF0dXMgPT09IFwidmFsaWRcIiwgYm8gPSAocykgPT4gdHlwZW9mIFByb21pc2UgPCBcInVcIiAmJiBzIGluc3RhbmNlb2YgUHJvbWlzZTtcbnZhciBFZTtcbihmdW5jdGlvbihzKSB7XG4gIHMuZXJyVG9PYmogPSAoZSkgPT4gdHlwZW9mIGUgPT0gXCJzdHJpbmdcIiA/IHsgbWVzc2FnZTogZSB9IDogZSB8fCB7fSwgcy50b1N0cmluZyA9IChlKSA9PiB0eXBlb2YgZSA9PSBcInN0cmluZ1wiID8gZSA6IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUubWVzc2FnZTtcbn0pKEVlIHx8IChFZSA9IHt9KSk7XG5jbGFzcyBEcyB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4pIHtcbiAgICB0aGlzLl9jYWNoZWRQYXRoID0gW10sIHRoaXMucGFyZW50ID0gZSwgdGhpcy5kYXRhID0gdCwgdGhpcy5fcGF0aCA9IHIsIHRoaXMuX2tleSA9IG47XG4gIH1cbiAgZ2V0IHBhdGgoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlZFBhdGgubGVuZ3RoIHx8IChBcnJheS5pc0FycmF5KHRoaXMuX2tleSkgPyB0aGlzLl9jYWNoZWRQYXRoLnB1c2goLi4udGhpcy5fcGF0aCwgLi4udGhpcy5fa2V5KSA6IHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCB0aGlzLl9rZXkpKSwgdGhpcy5fY2FjaGVkUGF0aDtcbiAgfVxufVxuY29uc3QgSnUgPSAocywgZSkgPT4ge1xuICBpZiAoTG4oZSkpXG4gICAgcmV0dXJuIHsgc3VjY2VzczogITAsIGRhdGE6IGUudmFsdWUgfTtcbiAgaWYgKCFzLmNvbW1vbi5pc3N1ZXMubGVuZ3RoKVxuICAgIHRocm93IG5ldyBFcnJvcihcIlZhbGlkYXRpb24gZmFpbGVkIGJ1dCBubyBpc3N1ZXMgZGV0ZWN0ZWQuXCIpO1xuICByZXR1cm4ge1xuICAgIHN1Y2Nlc3M6ICExLFxuICAgIGdldCBlcnJvcigpIHtcbiAgICAgIGlmICh0aGlzLl9lcnJvcilcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yO1xuICAgICAgY29uc3QgdCA9IG5ldyBwcyhzLmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yID0gdCwgdGhpcy5fZXJyb3I7XG4gICAgfVxuICB9O1xufTtcbmZ1bmN0aW9uIFZlKHMpIHtcbiAgaWYgKCFzKVxuICAgIHJldHVybiB7fTtcbiAgY29uc3QgeyBlcnJvck1hcDogZSwgaW52YWxpZF90eXBlX2Vycm9yOiB0LCByZXF1aXJlZF9lcnJvcjogciwgZGVzY3JpcHRpb246IG4gfSA9IHM7XG4gIGlmIChlICYmICh0IHx8IHIpKVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdXNlIFwiaW52YWxpZF90eXBlX2Vycm9yXCIgb3IgXCJyZXF1aXJlZF9lcnJvclwiIGluIGNvbmp1bmN0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1hcC5gKTtcbiAgcmV0dXJuIGUgPyB7IGVycm9yTWFwOiBlLCBkZXNjcmlwdGlvbjogbiB9IDogeyBlcnJvck1hcDogKG8sIGEpID0+IHtcbiAgICBjb25zdCB7IG1lc3NhZ2U6IGwgfSA9IHM7XG4gICAgcmV0dXJuIG8uY29kZSA9PT0gXCJpbnZhbGlkX2VudW1fdmFsdWVcIiA/IHsgbWVzc2FnZTogbCA/PyBhLmRlZmF1bHRFcnJvciB9IDogdHlwZW9mIGEuZGF0YSA+IFwidVwiID8geyBtZXNzYWdlOiBsID8/IHIgPz8gYS5kZWZhdWx0RXJyb3IgfSA6IG8uY29kZSAhPT0gXCJpbnZhbGlkX3R5cGVcIiA/IHsgbWVzc2FnZTogYS5kZWZhdWx0RXJyb3IgfSA6IHsgbWVzc2FnZTogbCA/PyB0ID8/IGEuZGVmYXVsdEVycm9yIH07XG4gIH0sIGRlc2NyaXB0aW9uOiBuIH07XG59XG5jbGFzcyBZZSB7XG4gIGdldCBkZXNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLmRlc2NyaXB0aW9uO1xuICB9XG4gIF9nZXRUeXBlKGUpIHtcbiAgICByZXR1cm4gd3MoZS5kYXRhKTtcbiAgfVxuICBfZ2V0T3JSZXR1cm5DdHgoZSwgdCkge1xuICAgIHJldHVybiB0IHx8IHtcbiAgICAgIGNvbW1vbjogZS5wYXJlbnQuY29tbW9uLFxuICAgICAgZGF0YTogZS5kYXRhLFxuICAgICAgcGFyc2VkVHlwZTogd3MoZS5kYXRhKSxcbiAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICBwYXRoOiBlLnBhdGgsXG4gICAgICBwYXJlbnQ6IGUucGFyZW50XG4gICAgfTtcbiAgfVxuICBfcHJvY2Vzc0lucHV0UGFyYW1zKGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBuZXcgd3IoKSxcbiAgICAgIGN0eDoge1xuICAgICAgICBjb21tb246IGUucGFyZW50LmNvbW1vbixcbiAgICAgICAgZGF0YTogZS5kYXRhLFxuICAgICAgICBwYXJzZWRUeXBlOiB3cyhlLmRhdGEpLFxuICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICBwYXRoOiBlLnBhdGgsXG4gICAgICAgIHBhcmVudDogZS5wYXJlbnRcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIF9wYXJzZVN5bmMoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLl9wYXJzZShlKTtcbiAgICBpZiAoYm8odCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jaHJvbm91cyBwYXJzZSBlbmNvdW50ZXJlZCBwcm9taXNlLlwiKTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICBfcGFyc2VBc3luYyhlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuX3BhcnNlKGUpO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodCk7XG4gIH1cbiAgcGFyc2UoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnNhZmVQYXJzZShlLCB0KTtcbiAgICBpZiAoci5zdWNjZXNzKVxuICAgICAgcmV0dXJuIHIuZGF0YTtcbiAgICB0aHJvdyByLmVycm9yO1xuICB9XG4gIHNhZmVQYXJzZShlLCB0KSB7XG4gICAgY29uc3QgciA9IHtcbiAgICAgIGNvbW1vbjoge1xuICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICBhc3luYzogKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuYXN5bmMpID8/ICExLFxuICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZXJyb3JNYXBcbiAgICAgIH0sXG4gICAgICBwYXRoOiAodCA9PSBudWxsID8gdm9pZCAwIDogdC5wYXRoKSB8fCBbXSxcbiAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICBkYXRhOiBlLFxuICAgICAgcGFyc2VkVHlwZTogd3MoZSlcbiAgICB9LCBuID0gdGhpcy5fcGFyc2VTeW5jKHsgZGF0YTogZSwgcGF0aDogci5wYXRoLCBwYXJlbnQ6IHIgfSk7XG4gICAgcmV0dXJuIEp1KHIsIG4pO1xuICB9XG4gIFwifnZhbGlkYXRlXCIoZSkge1xuICAgIHZhciByLCBuO1xuICAgIGNvbnN0IHQgPSB7XG4gICAgICBjb21tb246IHtcbiAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgYXN5bmM6ICEhdGhpc1tcIn5zdGFuZGFyZFwiXS5hc3luY1xuICAgICAgfSxcbiAgICAgIHBhdGg6IFtdLFxuICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgIGRhdGE6IGUsXG4gICAgICBwYXJzZWRUeXBlOiB3cyhlKVxuICAgIH07XG4gICAgaWYgKCF0aGlzW1wifnN0YW5kYXJkXCJdLmFzeW5jKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuX3BhcnNlU3luYyh7IGRhdGE6IGUsIHBhdGg6IFtdLCBwYXJlbnQ6IHQgfSk7XG4gICAgICAgIHJldHVybiBMbihpKSA/IHtcbiAgICAgICAgICB2YWx1ZTogaS52YWx1ZVxuICAgICAgICB9IDoge1xuICAgICAgICAgIGlzc3VlczogdC5jb21tb24uaXNzdWVzXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChpKSB7XG4gICAgICAgIChuID0gKHIgPSBpID09IG51bGwgPyB2b2lkIDAgOiBpLm1lc3NhZ2UpID09IG51bGwgPyB2b2lkIDAgOiByLnRvTG93ZXJDYXNlKCkpICE9IG51bGwgJiYgbi5pbmNsdWRlcyhcImVuY291bnRlcmVkXCIpICYmICh0aGlzW1wifnN0YW5kYXJkXCJdLmFzeW5jID0gITApLCB0LmNvbW1vbiA9IHtcbiAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgIGFzeW5jOiAhMFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIHJldHVybiB0aGlzLl9wYXJzZUFzeW5jKHsgZGF0YTogZSwgcGF0aDogW10sIHBhcmVudDogdCB9KS50aGVuKChpKSA9PiBMbihpKSA/IHtcbiAgICAgIHZhbHVlOiBpLnZhbHVlXG4gICAgfSA6IHtcbiAgICAgIGlzc3VlczogdC5jb21tb24uaXNzdWVzXG4gICAgfSk7XG4gIH1cbiAgYXN5bmMgcGFyc2VBc3luYyhlLCB0KSB7XG4gICAgY29uc3QgciA9IGF3YWl0IHRoaXMuc2FmZVBhcnNlQXN5bmMoZSwgdCk7XG4gICAgaWYgKHIuc3VjY2VzcylcbiAgICAgIHJldHVybiByLmRhdGE7XG4gICAgdGhyb3cgci5lcnJvcjtcbiAgfVxuICBhc3luYyBzYWZlUGFyc2VBc3luYyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHtcbiAgICAgIGNvbW1vbjoge1xuICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICBjb250ZXh0dWFsRXJyb3JNYXA6IHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZXJyb3JNYXAsXG4gICAgICAgIGFzeW5jOiAhMFxuICAgICAgfSxcbiAgICAgIHBhdGg6ICh0ID09IG51bGwgPyB2b2lkIDAgOiB0LnBhdGgpIHx8IFtdLFxuICAgICAgc2NoZW1hRXJyb3JNYXA6IHRoaXMuX2RlZi5lcnJvck1hcCxcbiAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgIGRhdGE6IGUsXG4gICAgICBwYXJzZWRUeXBlOiB3cyhlKVxuICAgIH0sIG4gPSB0aGlzLl9wYXJzZSh7IGRhdGE6IGUsIHBhdGg6IHIucGF0aCwgcGFyZW50OiByIH0pLCBpID0gYXdhaXQgKGJvKG4pID8gbiA6IFByb21pc2UucmVzb2x2ZShuKSk7XG4gICAgcmV0dXJuIEp1KHIsIGkpO1xuICB9XG4gIHJlZmluZShlLCB0KSB7XG4gICAgY29uc3QgciA9IChuKSA9PiB0eXBlb2YgdCA9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB0ID4gXCJ1XCIgPyB7IG1lc3NhZ2U6IHQgfSA6IHR5cGVvZiB0ID09IFwiZnVuY3Rpb25cIiA/IHQobikgOiB0O1xuICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KChuLCBpKSA9PiB7XG4gICAgICBjb25zdCBvID0gZShuKSwgYSA9ICgpID0+IGkuYWRkSXNzdWUoe1xuICAgICAgICBjb2RlOiBhZS5jdXN0b20sXG4gICAgICAgIC4uLnIobilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHR5cGVvZiBQcm9taXNlIDwgXCJ1XCIgJiYgbyBpbnN0YW5jZW9mIFByb21pc2UgPyBvLnRoZW4oKGwpID0+IGwgPyAhMCA6IChhKCksICExKSkgOiBvID8gITAgOiAoYSgpLCAhMSk7XG4gICAgfSk7XG4gIH1cbiAgcmVmaW5lbWVudChlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuX3JlZmluZW1lbnQoKHIsIG4pID0+IGUocikgPyAhMCA6IChuLmFkZElzc3VlKHR5cGVvZiB0ID09IFwiZnVuY3Rpb25cIiA/IHQociwgbikgOiB0KSwgITEpKTtcbiAgfVxuICBfcmVmaW5lbWVudChlKSB7XG4gICAgcmV0dXJuIG5ldyBZcyh7XG4gICAgICBzY2hlbWE6IHRoaXMsXG4gICAgICB0eXBlTmFtZToga2UuWm9kRWZmZWN0cyxcbiAgICAgIGVmZmVjdDogeyB0eXBlOiBcInJlZmluZW1lbnRcIiwgcmVmaW5lbWVudDogZSB9XG4gICAgfSk7XG4gIH1cbiAgc3VwZXJSZWZpbmUoZSkge1xuICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KGUpO1xuICB9XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLnNwYSA9IHRoaXMuc2FmZVBhcnNlQXN5bmMsIHRoaXMuX2RlZiA9IGUsIHRoaXMucGFyc2UgPSB0aGlzLnBhcnNlLmJpbmQodGhpcyksIHRoaXMuc2FmZVBhcnNlID0gdGhpcy5zYWZlUGFyc2UuYmluZCh0aGlzKSwgdGhpcy5wYXJzZUFzeW5jID0gdGhpcy5wYXJzZUFzeW5jLmJpbmQodGhpcyksIHRoaXMuc2FmZVBhcnNlQXN5bmMgPSB0aGlzLnNhZmVQYXJzZUFzeW5jLmJpbmQodGhpcyksIHRoaXMuc3BhID0gdGhpcy5zcGEuYmluZCh0aGlzKSwgdGhpcy5yZWZpbmUgPSB0aGlzLnJlZmluZS5iaW5kKHRoaXMpLCB0aGlzLnJlZmluZW1lbnQgPSB0aGlzLnJlZmluZW1lbnQuYmluZCh0aGlzKSwgdGhpcy5zdXBlclJlZmluZSA9IHRoaXMuc3VwZXJSZWZpbmUuYmluZCh0aGlzKSwgdGhpcy5vcHRpb25hbCA9IHRoaXMub3B0aW9uYWwuYmluZCh0aGlzKSwgdGhpcy5udWxsYWJsZSA9IHRoaXMubnVsbGFibGUuYmluZCh0aGlzKSwgdGhpcy5udWxsaXNoID0gdGhpcy5udWxsaXNoLmJpbmQodGhpcyksIHRoaXMuYXJyYXkgPSB0aGlzLmFycmF5LmJpbmQodGhpcyksIHRoaXMucHJvbWlzZSA9IHRoaXMucHJvbWlzZS5iaW5kKHRoaXMpLCB0aGlzLm9yID0gdGhpcy5vci5iaW5kKHRoaXMpLCB0aGlzLmFuZCA9IHRoaXMuYW5kLmJpbmQodGhpcyksIHRoaXMudHJhbnNmb3JtID0gdGhpcy50cmFuc2Zvcm0uYmluZCh0aGlzKSwgdGhpcy5icmFuZCA9IHRoaXMuYnJhbmQuYmluZCh0aGlzKSwgdGhpcy5kZWZhdWx0ID0gdGhpcy5kZWZhdWx0LmJpbmQodGhpcyksIHRoaXMuY2F0Y2ggPSB0aGlzLmNhdGNoLmJpbmQodGhpcyksIHRoaXMuZGVzY3JpYmUgPSB0aGlzLmRlc2NyaWJlLmJpbmQodGhpcyksIHRoaXMucGlwZSA9IHRoaXMucGlwZS5iaW5kKHRoaXMpLCB0aGlzLnJlYWRvbmx5ID0gdGhpcy5yZWFkb25seS5iaW5kKHRoaXMpLCB0aGlzLmlzTnVsbGFibGUgPSB0aGlzLmlzTnVsbGFibGUuYmluZCh0aGlzKSwgdGhpcy5pc09wdGlvbmFsID0gdGhpcy5pc09wdGlvbmFsLmJpbmQodGhpcyksIHRoaXNbXCJ+c3RhbmRhcmRcIl0gPSB7XG4gICAgICB2ZXJzaW9uOiAxLFxuICAgICAgdmVuZG9yOiBcInpvZFwiLFxuICAgICAgdmFsaWRhdGU6ICh0KSA9PiB0aGlzW1wifnZhbGlkYXRlXCJdKHQpXG4gICAgfTtcbiAgfVxuICBvcHRpb25hbCgpIHtcbiAgICByZXR1cm4gZnMuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gIH1cbiAgbnVsbGFibGUoKSB7XG4gICAgcmV0dXJuIFpzLmNyZWF0ZSh0aGlzLCB0aGlzLl9kZWYpO1xuICB9XG4gIG51bGxpc2goKSB7XG4gICAgcmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpO1xuICB9XG4gIGFycmF5KCkge1xuICAgIHJldHVybiBZci5jcmVhdGUodGhpcyk7XG4gIH1cbiAgcHJvbWlzZSgpIHtcbiAgICByZXR1cm4gX28uY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gIH1cbiAgb3IoZSkge1xuICAgIHJldHVybiB3by5jcmVhdGUoW3RoaXMsIGVdLCB0aGlzLl9kZWYpO1xuICB9XG4gIGFuZChlKSB7XG4gICAgcmV0dXJuIEFvLmNyZWF0ZSh0aGlzLCBlLCB0aGlzLl9kZWYpO1xuICB9XG4gIHRyYW5zZm9ybShlKSB7XG4gICAgcmV0dXJuIG5ldyBZcyh7XG4gICAgICAuLi5WZSh0aGlzLl9kZWYpLFxuICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgdHlwZU5hbWU6IGtlLlpvZEVmZmVjdHMsXG4gICAgICBlZmZlY3Q6IHsgdHlwZTogXCJ0cmFuc2Zvcm1cIiwgdHJhbnNmb3JtOiBlIH1cbiAgICB9KTtcbiAgfVxuICBkZWZhdWx0KGUpIHtcbiAgICBjb25zdCB0ID0gdHlwZW9mIGUgPT0gXCJmdW5jdGlvblwiID8gZSA6ICgpID0+IGU7XG4gICAgcmV0dXJuIG5ldyBSbyh7XG4gICAgICAuLi5WZSh0aGlzLl9kZWYpLFxuICAgICAgaW5uZXJUeXBlOiB0aGlzLFxuICAgICAgZGVmYXVsdFZhbHVlOiB0LFxuICAgICAgdHlwZU5hbWU6IGtlLlpvZERlZmF1bHRcbiAgICB9KTtcbiAgfVxuICBicmFuZCgpIHtcbiAgICByZXR1cm4gbmV3IFVmKHtcbiAgICAgIHR5cGVOYW1lOiBrZS5ab2RCcmFuZGVkLFxuICAgICAgdHlwZTogdGhpcyxcbiAgICAgIC4uLlZlKHRoaXMuX2RlZilcbiAgICB9KTtcbiAgfVxuICBjYXRjaChlKSB7XG4gICAgY29uc3QgdCA9IHR5cGVvZiBlID09IFwiZnVuY3Rpb25cIiA/IGUgOiAoKSA9PiBlO1xuICAgIHJldHVybiBuZXcgTG8oe1xuICAgICAgLi4uVmUodGhpcy5fZGVmKSxcbiAgICAgIGlubmVyVHlwZTogdGhpcyxcbiAgICAgIGNhdGNoVmFsdWU6IHQsXG4gICAgICB0eXBlTmFtZToga2UuWm9kQ2F0Y2hcbiAgICB9KTtcbiAgfVxuICBkZXNjcmliZShlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIG5ldyB0KHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGRlc2NyaXB0aW9uOiBlXG4gICAgfSk7XG4gIH1cbiAgcGlwZShlKSB7XG4gICAgcmV0dXJuICRjLmNyZWF0ZSh0aGlzLCBlKTtcbiAgfVxuICByZWFkb25seSgpIHtcbiAgICByZXR1cm4gQ28uY3JlYXRlKHRoaXMpO1xuICB9XG4gIGlzT3B0aW9uYWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2FmZVBhcnNlKHZvaWQgMCkuc3VjY2VzcztcbiAgfVxuICBpc051bGxhYmxlKCkge1xuICAgIHJldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzO1xuICB9XG59XG5jb25zdCBrbSA9IC9eY1teXFxzLV17OCx9JC9pLCBEbSA9IC9eWzAtOWEtel0rJC8sIFBtID0gL15bMC05QS1ISktNTlAtVFYtWl17MjZ9JC9pLCBNbSA9IC9eWzAtOWEtZkEtRl17OH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17NH1cXGItWzAtOWEtZkEtRl17MTJ9JC9pLCBPbSA9IC9eW2EtejAtOV8tXXsyMX0kL2ksIEJtID0gL15bQS1aYS16MC05LV9dK1xcLltBLVphLXowLTktX10rXFwuW0EtWmEtejAtOS1fXSokLywgRm0gPSAvXlstK10/UCg/ISQpKD86KD86Wy0rXT9cXGQrWSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtZJCkpPyg/Oig/OlstK10/XFxkK00pfCg/OlstK10/XFxkK1suLF1cXGQrTSQpKT8oPzooPzpbLStdP1xcZCtXKXwoPzpbLStdP1xcZCtbLixdXFxkK1ckKSk/KD86KD86Wy0rXT9cXGQrRCl8KD86Wy0rXT9cXGQrWy4sXVxcZCtEJCkpPyg/OlQoPz1bXFxkKy1dKSg/Oig/OlstK10/XFxkK0gpfCg/OlstK10/XFxkK1suLF1cXGQrSCQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86Wy0rXT9cXGQrKD86Wy4sXVxcZCspP1MpPyk/PyQvLCBObSA9IC9eKD8hXFwuKSg/IS4qXFwuXFwuKShbQS1aMC05XycrXFwtXFwuXSopW0EtWjAtOV8rLV1AKFtBLVowLTldW0EtWjAtOVxcLV0qXFwuKStbQS1aXXsyLH0kL2ksIFVtID0gXCJeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJFwiO1xubGV0ICRhO1xuY29uc3QgJG0gPSAvXig/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKSQvLCBHbSA9IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwvKDNbMC0yXXxbMTJdP1swLTldKSQvLCBWbSA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7Nyw3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl17MCw0fSl7MCw0fSVbMC05YS16QS1aXXsxLH18OjooZmZmZig6MHsxLDR9KXswLDF9Oil7MCwxfSgoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSlcXC4pezMsM30oMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pKSQvLCBqbSA9IC9eKChbMC05YS1mQS1GXXsxLDR9Oil7Nyw3fVswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDd9OnwoWzAtOWEtZkEtRl17MSw0fTopezEsNn06WzAtOWEtZkEtRl17MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsNX0oOlswLTlhLWZBLUZdezEsNH0pezEsMn18KFswLTlhLWZBLUZdezEsNH06KXsxLDR9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDN9fChbMC05YS1mQS1GXXsxLDR9Oil7MSwzfSg6WzAtOWEtZkEtRl17MSw0fSl7MSw0fXwoWzAtOWEtZkEtRl17MSw0fTopezEsMn0oOlswLTlhLWZBLUZdezEsNH0pezEsNX18WzAtOWEtZkEtRl17MSw0fTooKDpbMC05YS1mQS1GXXsxLDR9KXsxLDZ9KXw6KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw3fXw6KXxmZTgwOig6WzAtOWEtZkEtRl17MCw0fSl7MCw0fSVbMC05YS16QS1aXXsxLH18OjooZmZmZig6MHsxLDR9KXswLDF9Oil7MCwxfSgoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKXwoWzAtOWEtZkEtRl17MSw0fTopezEsNH06KCgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSlcXC4pezMsM30oMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pKVxcLygxMlswLThdfDFbMDFdWzAtOV18WzEtOV0/WzAtOV0pJC8sIEttID0gL14oWzAtOWEtekEtWisvXXs0fSkqKChbMC05YS16QS1aKy9dezJ9PT0pfChbMC05YS16QS1aKy9dezN9PSkpPyQvLCBIbSA9IC9eKFswLTlhLXpBLVotX117NH0pKigoWzAtOWEtekEtWi1fXXsyfSg9PSk/KXwoWzAtOWEtekEtWi1fXXszfSg9KT8pKT8kLywgQmYgPSBcIigoXFxcXGRcXFxcZFsyNDY4XVswNDhdfFxcXFxkXFxcXGRbMTM1NzldWzI2XXxcXFxcZFxcXFxkMFs0OF18WzAyNDY4XVswNDhdMDB8WzEzNTc5XVsyNl0wMCktMDItMjl8XFxcXGR7NH0tKCgwWzEzNTc4XXwxWzAyXSktKDBbMS05XXxbMTJdXFxcXGR8M1swMV0pfCgwWzQ2OV18MTEpLSgwWzEtOV18WzEyXVxcXFxkfDMwKXwoMDIpLSgwWzEtOV18MVxcXFxkfDJbMC04XSkpKVwiLCBxbSA9IG5ldyBSZWdFeHAoYF4ke0JmfSRgKTtcbmZ1bmN0aW9uIEZmKHMpIHtcbiAgbGV0IGUgPSBcIlswLTVdXFxcXGRcIjtcbiAgcy5wcmVjaXNpb24gPyBlID0gYCR7ZX1cXFxcLlxcXFxkeyR7cy5wcmVjaXNpb259fWAgOiBzLnByZWNpc2lvbiA9PSBudWxsICYmIChlID0gYCR7ZX0oXFxcXC5cXFxcZCspP2ApO1xuICBjb25zdCB0ID0gcy5wcmVjaXNpb24gPyBcIitcIiA6IFwiP1wiO1xuICByZXR1cm4gYChbMDFdXFxcXGR8MlswLTNdKTpbMC01XVxcXFxkKDoke2V9KSR7dH1gO1xufVxuZnVuY3Rpb24gV20ocykge1xuICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7RmYocyl9JGApO1xufVxuZnVuY3Rpb24gem0ocykge1xuICBsZXQgZSA9IGAke0JmfVQke0ZmKHMpfWA7XG4gIGNvbnN0IHQgPSBbXTtcbiAgcmV0dXJuIHQucHVzaChzLmxvY2FsID8gXCJaP1wiIDogXCJaXCIpLCBzLm9mZnNldCAmJiB0LnB1c2goXCIoWystXVxcXFxkezJ9Oj9cXFxcZHsyfSlcIiksIGUgPSBgJHtlfSgke3Quam9pbihcInxcIil9KWAsIG5ldyBSZWdFeHAoYF4ke2V9JGApO1xufVxuZnVuY3Rpb24gWW0ocywgZSkge1xuICByZXR1cm4gISEoKGUgPT09IFwidjRcIiB8fCAhZSkgJiYgJG0udGVzdChzKSB8fCAoZSA9PT0gXCJ2NlwiIHx8ICFlKSAmJiBWbS50ZXN0KHMpKTtcbn1cbmZ1bmN0aW9uIFptKHMsIGUpIHtcbiAgaWYgKCFCbS50ZXN0KHMpKVxuICAgIHJldHVybiAhMTtcbiAgdHJ5IHtcbiAgICBjb25zdCBbdF0gPSBzLnNwbGl0KFwiLlwiKTtcbiAgICBpZiAoIXQpXG4gICAgICByZXR1cm4gITE7XG4gICAgY29uc3QgciA9IHQucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIikucGFkRW5kKHQubGVuZ3RoICsgKDQgLSB0Lmxlbmd0aCAlIDQpICUgNCwgXCI9XCIpLCBuID0gSlNPTi5wYXJzZShhdG9iKHIpKTtcbiAgICByZXR1cm4gISh0eXBlb2YgbiAhPSBcIm9iamVjdFwiIHx8IG4gPT09IG51bGwgfHwgXCJ0eXBcIiBpbiBuICYmIChuID09IG51bGwgPyB2b2lkIDAgOiBuLnR5cCkgIT09IFwiSldUXCIgfHwgIW4uYWxnIHx8IGUgJiYgbi5hbGcgIT09IGUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gITE7XG4gIH1cbn1cbmZ1bmN0aW9uIFhtKHMsIGUpIHtcbiAgcmV0dXJuICEhKChlID09PSBcInY0XCIgfHwgIWUpICYmIEdtLnRlc3QocykgfHwgKGUgPT09IFwidjZcIiB8fCAhZSkgJiYgam0udGVzdChzKSk7XG59XG5jbGFzcyBScyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSAmJiAoZS5kYXRhID0gU3RyaW5nKGUuZGF0YSkpLCB0aGlzLl9nZXRUeXBlKGUpICE9PSBtZS5zdHJpbmcpIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShpLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLnN0cmluZyxcbiAgICAgICAgcmVjZWl2ZWQ6IGkucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICBjb25zdCByID0gbmV3IHdyKCk7XG4gICAgbGV0IG47XG4gICAgZm9yIChjb25zdCBpIG9mIHRoaXMuX2RlZi5jaGVja3MpXG4gICAgICBpZiAoaS5raW5kID09PSBcIm1pblwiKVxuICAgICAgICBlLmRhdGEubGVuZ3RoIDwgaS52YWx1ZSAmJiAobiA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsIG4pLCBoZShuLCB7XG4gICAgICAgICAgY29kZTogYWUudG9vX3NtYWxsLFxuICAgICAgICAgIG1pbmltdW06IGkudmFsdWUsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgICAgIGV4YWN0OiAhMSxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwibWF4XCIpXG4gICAgICAgIGUuZGF0YS5sZW5ndGggPiBpLnZhbHVlICYmIChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgICBjb2RlOiBhZS50b29fYmlnLFxuICAgICAgICAgIG1heGltdW06IGkudmFsdWUsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgICAgIGV4YWN0OiAhMSxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgY29uc3QgbyA9IGUuZGF0YS5sZW5ndGggPiBpLnZhbHVlLCBhID0gZS5kYXRhLmxlbmd0aCA8IGkudmFsdWU7XG4gICAgICAgIChvIHx8IGEpICYmIChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIG8gPyBoZShuLCB7XG4gICAgICAgICAgY29kZTogYWUudG9vX2JpZyxcbiAgICAgICAgICBtYXhpbXVtOiBpLnZhbHVlLFxuICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgICAgICBleGFjdDogITAsXG4gICAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICAgIH0pIDogYSAmJiBoZShuLCB7XG4gICAgICAgICAgY29kZTogYWUudG9vX3NtYWxsLFxuICAgICAgICAgIG1pbmltdW06IGkudmFsdWUsXG4gICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgICAgIGV4YWN0OiAhMCxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICB9IGVsc2UgaWYgKGkua2luZCA9PT0gXCJlbWFpbFwiKVxuICAgICAgICBObS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1haWxcIixcbiAgICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwiZW1vamlcIilcbiAgICAgICAgJGEgfHwgKCRhID0gbmV3IFJlZ0V4cChVbSwgXCJ1XCIpKSwgJGEudGVzdChlLmRhdGEpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgICB2YWxpZGF0aW9uOiBcImVtb2ppXCIsXG4gICAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICAgIH0pLCByLmRpcnR5KCkpO1xuICAgICAgZWxzZSBpZiAoaS5raW5kID09PSBcInV1aWRcIilcbiAgICAgICAgTW0udGVzdChlLmRhdGEpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgICB2YWxpZGF0aW9uOiBcInV1aWRcIixcbiAgICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwibmFub2lkXCIpXG4gICAgICAgIE9tLnRlc3QoZS5kYXRhKSB8fCAobiA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsIG4pLCBoZShuLCB7XG4gICAgICAgICAgdmFsaWRhdGlvbjogXCJuYW5vaWRcIixcbiAgICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwiY3VpZFwiKVxuICAgICAgICBrbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZFwiLFxuICAgICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgICB9KSwgci5kaXJ0eSgpKTtcbiAgICAgIGVsc2UgaWYgKGkua2luZCA9PT0gXCJjdWlkMlwiKVxuICAgICAgICBEbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZDJcIixcbiAgICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgICAgfSksIHIuZGlydHkoKSk7XG4gICAgICBlbHNlIGlmIChpLmtpbmQgPT09IFwidWxpZFwiKVxuICAgICAgICBQbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICAgIHZhbGlkYXRpb246IFwidWxpZFwiLFxuICAgICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgICB9KSwgci5kaXJ0eSgpKTtcbiAgICAgIGVsc2UgaWYgKGkua2luZCA9PT0gXCJ1cmxcIilcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBuZXcgVVJMKGUuZGF0YSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1cmxcIixcbiAgICAgICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICAgICAgfSksIHIuZGlydHkoKTtcbiAgICAgICAgfVxuICAgICAgZWxzZSBpLmtpbmQgPT09IFwicmVnZXhcIiA/IChpLnJlZ2V4Lmxhc3RJbmRleCA9IDAsIGkucmVnZXgudGVzdChlLmRhdGEpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgdmFsaWRhdGlvbjogXCJyZWdleFwiLFxuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSkgOiBpLmtpbmQgPT09IFwidHJpbVwiID8gZS5kYXRhID0gZS5kYXRhLnRyaW0oKSA6IGkua2luZCA9PT0gXCJpbmNsdWRlc1wiID8gZS5kYXRhLmluY2x1ZGVzKGkudmFsdWUsIGkucG9zaXRpb24pIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgIHZhbGlkYXRpb246IHsgaW5jbHVkZXM6IGkudmFsdWUsIHBvc2l0aW9uOiBpLnBvc2l0aW9uIH0sXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIHIuZGlydHkoKSkgOiBpLmtpbmQgPT09IFwidG9Mb3dlckNhc2VcIiA/IGUuZGF0YSA9IGUuZGF0YS50b0xvd2VyQ2FzZSgpIDogaS5raW5kID09PSBcInRvVXBwZXJDYXNlXCIgPyBlLmRhdGEgPSBlLmRhdGEudG9VcHBlckNhc2UoKSA6IGkua2luZCA9PT0gXCJzdGFydHNXaXRoXCIgPyBlLmRhdGEuc3RhcnRzV2l0aChpLnZhbHVlKSB8fCAobiA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsIG4pLCBoZShuLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICB2YWxpZGF0aW9uOiB7IHN0YXJ0c1dpdGg6IGkudmFsdWUgfSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJlbmRzV2l0aFwiID8gZS5kYXRhLmVuZHNXaXRoKGkudmFsdWUpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgIHZhbGlkYXRpb246IHsgZW5kc1dpdGg6IGkudmFsdWUgfSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJkYXRldGltZVwiID8gem0oaSkudGVzdChlLmRhdGEpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgIHZhbGlkYXRpb246IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJkYXRlXCIgPyBxbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgdmFsaWRhdGlvbjogXCJkYXRlXCIsXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIHIuZGlydHkoKSkgOiBpLmtpbmQgPT09IFwidGltZVwiID8gV20oaSkudGVzdChlLmRhdGEpIHx8IChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgIHZhbGlkYXRpb246IFwidGltZVwiLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogaS5raW5kID09PSBcImR1cmF0aW9uXCIgPyBGbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICB2YWxpZGF0aW9uOiBcImR1cmF0aW9uXCIsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogaS5raW5kID09PSBcImlwXCIgPyBZbShlLmRhdGEsIGkudmVyc2lvbikgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICB2YWxpZGF0aW9uOiBcImlwXCIsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogaS5raW5kID09PSBcImp3dFwiID8gWm0oZS5kYXRhLCBpLmFsZykgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICB2YWxpZGF0aW9uOiBcImp3dFwiLFxuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJjaWRyXCIgPyBYbShlLmRhdGEsIGkudmVyc2lvbikgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICB2YWxpZGF0aW9uOiBcImNpZHJcIixcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIHIuZGlydHkoKSkgOiBpLmtpbmQgPT09IFwiYmFzZTY0XCIgPyBLbS50ZXN0KGUuZGF0YSkgfHwgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICB2YWxpZGF0aW9uOiBcImJhc2U2NFwiLFxuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJiYXNlNjR1cmxcIiA/IEhtLnRlc3QoZS5kYXRhKSB8fCAobiA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsIG4pLCBoZShuLCB7XG4gICAgICAgIHZhbGlkYXRpb246IFwiYmFzZTY0dXJsXCIsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2VcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogWmUuYXNzZXJ0TmV2ZXIoaSk7XG4gICAgcmV0dXJuIHsgc3RhdHVzOiByLnZhbHVlLCB2YWx1ZTogZS5kYXRhIH07XG4gIH1cbiAgX3JlZ2V4KGUsIHQsIHIpIHtcbiAgICByZXR1cm4gdGhpcy5yZWZpbmVtZW50KChuKSA9PiBlLnRlc3QobiksIHtcbiAgICAgIHZhbGlkYXRpb246IHQsXG4gICAgICBjb2RlOiBhZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgIC4uLkVlLmVyclRvT2JqKHIpXG4gICAgfSk7XG4gIH1cbiAgX2FkZENoZWNrKGUpIHtcbiAgICByZXR1cm4gbmV3IFJzKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGVdXG4gICAgfSk7XG4gIH1cbiAgZW1haWwoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1haWxcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgdXJsKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInVybFwiLCAuLi5FZS5lcnJUb09iaihlKSB9KTtcbiAgfVxuICBlbW9qaShlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJlbW9qaVwiLCAuLi5FZS5lcnJUb09iaihlKSB9KTtcbiAgfVxuICB1dWlkKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcInV1aWRcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgbmFub2lkKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcIm5hbm9pZFwiLCAuLi5FZS5lcnJUb09iaihlKSB9KTtcbiAgfVxuICBjdWlkKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImN1aWRcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgY3VpZDIoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiY3VpZDJcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgdWxpZChlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1bGlkXCIsIC4uLkVlLmVyclRvT2JqKGUpIH0pO1xuICB9XG4gIGJhc2U2NChlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJiYXNlNjRcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgYmFzZTY0dXJsKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJiYXNlNjR1cmxcIixcbiAgICAgIC4uLkVlLmVyclRvT2JqKGUpXG4gICAgfSk7XG4gIH1cbiAgand0KGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImp3dFwiLCAuLi5FZS5lcnJUb09iaihlKSB9KTtcbiAgfVxuICBpcChlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJpcFwiLCAuLi5FZS5lcnJUb09iaihlKSB9KTtcbiAgfVxuICBjaWRyKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImNpZHJcIiwgLi4uRWUuZXJyVG9PYmooZSkgfSk7XG4gIH1cbiAgZGF0ZXRpbWUoZSkge1xuICAgIHJldHVybiB0eXBlb2YgZSA9PSBcInN0cmluZ1wiID8gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgb2Zmc2V0OiAhMSxcbiAgICAgIGxvY2FsOiAhMSxcbiAgICAgIG1lc3NhZ2U6IGVcbiAgICB9KSA6IHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwiZGF0ZXRpbWVcIixcbiAgICAgIHByZWNpc2lvbjogdHlwZW9mIChlID09IG51bGwgPyB2b2lkIDAgOiBlLnByZWNpc2lvbikgPiBcInVcIiA/IG51bGwgOiBlID09IG51bGwgPyB2b2lkIDAgOiBlLnByZWNpc2lvbixcbiAgICAgIG9mZnNldDogKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUub2Zmc2V0KSA/PyAhMSxcbiAgICAgIGxvY2FsOiAoZSA9PSBudWxsID8gdm9pZCAwIDogZS5sb2NhbCkgPz8gITEsXG4gICAgICAuLi5FZS5lcnJUb09iaihlID09IG51bGwgPyB2b2lkIDAgOiBlLm1lc3NhZ2UpXG4gICAgfSk7XG4gIH1cbiAgZGF0ZShlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJkYXRlXCIsIG1lc3NhZ2U6IGUgfSk7XG4gIH1cbiAgdGltZShlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBlID09IFwic3RyaW5nXCIgPyB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcInRpbWVcIixcbiAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgIG1lc3NhZ2U6IGVcbiAgICB9KSA6IHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwidGltZVwiLFxuICAgICAgcHJlY2lzaW9uOiB0eXBlb2YgKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUucHJlY2lzaW9uKSA+IFwidVwiID8gbnVsbCA6IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUucHJlY2lzaW9uLFxuICAgICAgLi4uRWUuZXJyVG9PYmooZSA9PSBudWxsID8gdm9pZCAwIDogZS5tZXNzYWdlKVxuICAgIH0pO1xuICB9XG4gIGR1cmF0aW9uKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImR1cmF0aW9uXCIsIC4uLkVlLmVyclRvT2JqKGUpIH0pO1xuICB9XG4gIHJlZ2V4KGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJyZWdleFwiLFxuICAgICAgcmVnZXg6IGUsXG4gICAgICAuLi5FZS5lcnJUb09iaih0KVxuICAgIH0pO1xuICB9XG4gIGluY2x1ZGVzKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJpbmNsdWRlc1wiLFxuICAgICAgdmFsdWU6IGUsXG4gICAgICBwb3NpdGlvbjogdCA9PSBudWxsID8gdm9pZCAwIDogdC5wb3NpdGlvbixcbiAgICAgIC4uLkVlLmVyclRvT2JqKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQubWVzc2FnZSlcbiAgICB9KTtcbiAgfVxuICBzdGFydHNXaXRoKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJzdGFydHNXaXRoXCIsXG4gICAgICB2YWx1ZTogZSxcbiAgICAgIC4uLkVlLmVyclRvT2JqKHQpXG4gICAgfSk7XG4gIH1cbiAgZW5kc1dpdGgoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcImVuZHNXaXRoXCIsXG4gICAgICB2YWx1ZTogZSxcbiAgICAgIC4uLkVlLmVyclRvT2JqKHQpXG4gICAgfSk7XG4gIH1cbiAgbWluKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtaW5cIixcbiAgICAgIHZhbHVlOiBlLFxuICAgICAgLi4uRWUuZXJyVG9PYmoodClcbiAgICB9KTtcbiAgfVxuICBtYXgoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgdmFsdWU6IGUsXG4gICAgICAuLi5FZS5lcnJUb09iaih0KVxuICAgIH0pO1xuICB9XG4gIGxlbmd0aChlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwibGVuZ3RoXCIsXG4gICAgICB2YWx1ZTogZSxcbiAgICAgIC4uLkVlLmVyclRvT2JqKHQpXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gYC5taW4oMSlgXG4gICAqL1xuICBub25lbXB0eShlKSB7XG4gICAgcmV0dXJuIHRoaXMubWluKDEsIEVlLmVyclRvT2JqKGUpKTtcbiAgfVxuICB0cmltKCkge1xuICAgIHJldHVybiBuZXcgUnMoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRyaW1cIiB9XVxuICAgIH0pO1xuICB9XG4gIHRvTG93ZXJDYXNlKCkge1xuICAgIHJldHVybiBuZXcgUnMoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgeyBraW5kOiBcInRvTG93ZXJDYXNlXCIgfV1cbiAgICB9KTtcbiAgfVxuICB0b1VwcGVyQ2FzZSgpIHtcbiAgICByZXR1cm4gbmV3IFJzKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b1VwcGVyQ2FzZVwiIH1dXG4gICAgfSk7XG4gIH1cbiAgZ2V0IGlzRGF0ZXRpbWUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwiZGF0ZXRpbWVcIik7XG4gIH1cbiAgZ2V0IGlzRGF0ZSgpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJkYXRlXCIpO1xuICB9XG4gIGdldCBpc1RpbWUoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwidGltZVwiKTtcbiAgfVxuICBnZXQgaXNEdXJhdGlvbigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJkdXJhdGlvblwiKTtcbiAgfVxuICBnZXQgaXNFbWFpbCgpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJlbWFpbFwiKTtcbiAgfVxuICBnZXQgaXNVUkwoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwidXJsXCIpO1xuICB9XG4gIGdldCBpc0Vtb2ppKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoZSkgPT4gZS5raW5kID09PSBcImVtb2ppXCIpO1xuICB9XG4gIGdldCBpc1VVSUQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwidXVpZFwiKTtcbiAgfVxuICBnZXQgaXNOQU5PSUQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwibmFub2lkXCIpO1xuICB9XG4gIGdldCBpc0NVSUQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwiY3VpZFwiKTtcbiAgfVxuICBnZXQgaXNDVUlEMigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJjdWlkMlwiKTtcbiAgfVxuICBnZXQgaXNVTElEKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoZSkgPT4gZS5raW5kID09PSBcInVsaWRcIik7XG4gIH1cbiAgZ2V0IGlzSVAoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwiaXBcIik7XG4gIH1cbiAgZ2V0IGlzQ0lEUigpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJjaWRyXCIpO1xuICB9XG4gIGdldCBpc0Jhc2U2NCgpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGUpID0+IGUua2luZCA9PT0gXCJiYXNlNjRcIik7XG4gIH1cbiAgZ2V0IGlzQmFzZTY0dXJsKCkge1xuICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoZSkgPT4gZS5raW5kID09PSBcImJhc2U2NHVybFwiKTtcbiAgfVxuICBnZXQgbWluTGVuZ3RoKCkge1xuICAgIGxldCBlID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcylcbiAgICAgIHQua2luZCA9PT0gXCJtaW5cIiAmJiAoZSA9PT0gbnVsbCB8fCB0LnZhbHVlID4gZSkgJiYgKGUgPSB0LnZhbHVlKTtcbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXQgbWF4TGVuZ3RoKCkge1xuICAgIGxldCBlID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcylcbiAgICAgIHQua2luZCA9PT0gXCJtYXhcIiAmJiAoZSA9PT0gbnVsbCB8fCB0LnZhbHVlIDwgZSkgJiYgKGUgPSB0LnZhbHVlKTtcbiAgICByZXR1cm4gZTtcbiAgfVxufVxuUnMuY3JlYXRlID0gKHMpID0+IG5ldyBScyh7XG4gIGNoZWNrczogW10sXG4gIHR5cGVOYW1lOiBrZS5ab2RTdHJpbmcsXG4gIGNvZXJjZTogKHMgPT0gbnVsbCA/IHZvaWQgMCA6IHMuY29lcmNlKSA/PyAhMSxcbiAgLi4uVmUocylcbn0pO1xuZnVuY3Rpb24gSm0ocywgZSkge1xuICBjb25zdCB0ID0gKHMudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoLCByID0gKGUudG9TdHJpbmcoKS5zcGxpdChcIi5cIilbMV0gfHwgXCJcIikubGVuZ3RoLCBuID0gdCA+IHIgPyB0IDogciwgaSA9IE51bWJlci5wYXJzZUludChzLnRvRml4ZWQobikucmVwbGFjZShcIi5cIiwgXCJcIikpLCBvID0gTnVtYmVyLnBhcnNlSW50KGUudG9GaXhlZChuKS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gIHJldHVybiBpICUgbyAvIDEwICoqIG47XG59XG5jbGFzcyBDbiBleHRlbmRzIFllIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5taW4gPSB0aGlzLmd0ZSwgdGhpcy5tYXggPSB0aGlzLmx0ZSwgdGhpcy5zdGVwID0gdGhpcy5tdWx0aXBsZU9mO1xuICB9XG4gIF9wYXJzZShlKSB7XG4gICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UgJiYgKGUuZGF0YSA9IE51bWJlcihlLmRhdGEpKSwgdGhpcy5fZ2V0VHlwZShlKSAhPT0gbWUubnVtYmVyKSB7XG4gICAgICBjb25zdCBpID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgICByZXR1cm4gaGUoaSwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgIGV4cGVjdGVkOiBtZS5udW1iZXIsXG4gICAgICAgIHJlY2VpdmVkOiBpLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgbGV0IHI7XG4gICAgY29uc3QgbiA9IG5ldyB3cigpO1xuICAgIGZvciAoY29uc3QgaSBvZiB0aGlzLl9kZWYuY2hlY2tzKVxuICAgICAgaS5raW5kID09PSBcImludFwiID8gWmUuaXNJbnRlZ2VyKGUuZGF0YSkgfHwgKHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCByKSwgaGUociwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgIGV4cGVjdGVkOiBcImludGVnZXJcIixcbiAgICAgICAgcmVjZWl2ZWQ6IFwiZmxvYXRcIixcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgbi5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJtaW5cIiA/IChpLmluY2x1c2l2ZSA/IGUuZGF0YSA8IGkudmFsdWUgOiBlLmRhdGEgPD0gaS52YWx1ZSkgJiYgKHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCByKSwgaGUociwge1xuICAgICAgICBjb2RlOiBhZS50b29fc21hbGwsXG4gICAgICAgIG1pbmltdW06IGkudmFsdWUsXG4gICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgIGluY2x1c2l2ZTogaS5pbmNsdXNpdmUsXG4gICAgICAgIGV4YWN0OiAhMSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgbi5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJtYXhcIiA/IChpLmluY2x1c2l2ZSA/IGUuZGF0YSA+IGkudmFsdWUgOiBlLmRhdGEgPj0gaS52YWx1ZSkgJiYgKHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCByKSwgaGUociwge1xuICAgICAgICBjb2RlOiBhZS50b29fYmlnLFxuICAgICAgICBtYXhpbXVtOiBpLnZhbHVlLFxuICAgICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgICBpbmNsdXNpdmU6IGkuaW5jbHVzaXZlLFxuICAgICAgICBleGFjdDogITEsXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIG4uZGlydHkoKSkgOiBpLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiID8gSm0oZS5kYXRhLCBpLnZhbHVlKSAhPT0gMCAmJiAociA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUsIHIpLCBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLm5vdF9tdWx0aXBsZV9vZixcbiAgICAgICAgbXVsdGlwbGVPZjogaS52YWx1ZSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgbi5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJmaW5pdGVcIiA/IE51bWJlci5pc0Zpbml0ZShlLmRhdGEpIHx8IChyID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgciksIGhlKHIsIHtcbiAgICAgICAgY29kZTogYWUubm90X2Zpbml0ZSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgbi5kaXJ0eSgpKSA6IFplLmFzc2VydE5ldmVyKGkpO1xuICAgIHJldHVybiB7IHN0YXR1czogbi52YWx1ZSwgdmFsdWU6IGUuZGF0YSB9O1xuICB9XG4gIGd0ZShlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgZSwgITAsIEVlLnRvU3RyaW5nKHQpKTtcbiAgfVxuICBndChlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgZSwgITEsIEVlLnRvU3RyaW5nKHQpKTtcbiAgfVxuICBsdGUoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIGUsICEwLCBFZS50b1N0cmluZyh0KSk7XG4gIH1cbiAgbHQoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIGUsICExLCBFZS50b1N0cmluZyh0KSk7XG4gIH1cbiAgc2V0TGltaXQoZSwgdCwgciwgbikge1xuICAgIHJldHVybiBuZXcgQ24oe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgY2hlY2tzOiBbXG4gICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgIHtcbiAgICAgICAgICBraW5kOiBlLFxuICAgICAgICAgIHZhbHVlOiB0LFxuICAgICAgICAgIGluY2x1c2l2ZTogcixcbiAgICAgICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhuKVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gIH1cbiAgX2FkZENoZWNrKGUpIHtcbiAgICByZXR1cm4gbmV3IENuKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGVdXG4gICAgfSk7XG4gIH1cbiAgaW50KGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJpbnRcIixcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKGUpXG4gICAgfSk7XG4gIH1cbiAgcG9zaXRpdmUoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgdmFsdWU6IDAsXG4gICAgICBpbmNsdXNpdmU6ICExLFxuICAgICAgbWVzc2FnZTogRWUudG9TdHJpbmcoZSlcbiAgICB9KTtcbiAgfVxuICBuZWdhdGl2ZShlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICB2YWx1ZTogMCxcbiAgICAgIGluY2x1c2l2ZTogITEsXG4gICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhlKVxuICAgIH0pO1xuICB9XG4gIG5vbnBvc2l0aXZlKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtYXhcIixcbiAgICAgIHZhbHVlOiAwLFxuICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKGUpXG4gICAgfSk7XG4gIH1cbiAgbm9ubmVnYXRpdmUoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgdmFsdWU6IDAsXG4gICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgbWVzc2FnZTogRWUudG9TdHJpbmcoZSlcbiAgICB9KTtcbiAgfVxuICBtdWx0aXBsZU9mKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtdWx0aXBsZU9mXCIsXG4gICAgICB2YWx1ZTogZSxcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKHQpXG4gICAgfSk7XG4gIH1cbiAgZmluaXRlKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJmaW5pdGVcIixcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKGUpXG4gICAgfSk7XG4gIH1cbiAgc2FmZShlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgdmFsdWU6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgbWVzc2FnZTogRWUudG9TdHJpbmcoZSlcbiAgICB9KS5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtYXhcIixcbiAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICB2YWx1ZTogTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsXG4gICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhlKVxuICAgIH0pO1xuICB9XG4gIGdldCBtaW5WYWx1ZSgpIHtcbiAgICBsZXQgZSA9IG51bGw7XG4gICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2RlZi5jaGVja3MpXG4gICAgICB0LmtpbmQgPT09IFwibWluXCIgJiYgKGUgPT09IG51bGwgfHwgdC52YWx1ZSA+IGUpICYmIChlID0gdC52YWx1ZSk7XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgZ2V0IG1heFZhbHVlKCkge1xuICAgIGxldCBlID0gbnVsbDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fZGVmLmNoZWNrcylcbiAgICAgIHQua2luZCA9PT0gXCJtYXhcIiAmJiAoZSA9PT0gbnVsbCB8fCB0LnZhbHVlIDwgZSkgJiYgKGUgPSB0LnZhbHVlKTtcbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXQgaXNJbnQoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChlKSA9PiBlLmtpbmQgPT09IFwiaW50XCIgfHwgZS5raW5kID09PSBcIm11bHRpcGxlT2ZcIiAmJiBaZS5pc0ludGVnZXIoZS52YWx1ZSkpO1xuICB9XG4gIGdldCBpc0Zpbml0ZSgpIHtcbiAgICBsZXQgZSA9IG51bGwsIHQgPSBudWxsO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICBpZiAoci5raW5kID09PSBcImZpbml0ZVwiIHx8IHIua2luZCA9PT0gXCJpbnRcIiB8fCByLmtpbmQgPT09IFwibXVsdGlwbGVPZlwiKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgICByLmtpbmQgPT09IFwibWluXCIgPyAodCA9PT0gbnVsbCB8fCByLnZhbHVlID4gdCkgJiYgKHQgPSByLnZhbHVlKSA6IHIua2luZCA9PT0gXCJtYXhcIiAmJiAoZSA9PT0gbnVsbCB8fCByLnZhbHVlIDwgZSkgJiYgKGUgPSByLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh0KSAmJiBOdW1iZXIuaXNGaW5pdGUoZSk7XG4gIH1cbn1cbkNuLmNyZWF0ZSA9IChzKSA9PiBuZXcgQ24oe1xuICBjaGVja3M6IFtdLFxuICB0eXBlTmFtZToga2UuWm9kTnVtYmVyLFxuICBjb2VyY2U6IChzID09IG51bGwgPyB2b2lkIDAgOiBzLmNvZXJjZSkgfHwgITEsXG4gIC4uLlZlKHMpXG59KTtcbmNsYXNzIEpuIGV4dGVuZHMgWWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLm1pbiA9IHRoaXMuZ3RlLCB0aGlzLm1heCA9IHRoaXMubHRlO1xuICB9XG4gIF9wYXJzZShlKSB7XG4gICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpXG4gICAgICB0cnkge1xuICAgICAgICBlLmRhdGEgPSBCaWdJbnQoZS5kYXRhKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW52YWxpZElucHV0KGUpO1xuICAgICAgfVxuICAgIGlmICh0aGlzLl9nZXRUeXBlKGUpICE9PSBtZS5iaWdpbnQpXG4gICAgICByZXR1cm4gdGhpcy5fZ2V0SW52YWxpZElucHV0KGUpO1xuICAgIGxldCByO1xuICAgIGNvbnN0IG4gPSBuZXcgd3IoKTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5fZGVmLmNoZWNrcylcbiAgICAgIGkua2luZCA9PT0gXCJtaW5cIiA/IChpLmluY2x1c2l2ZSA/IGUuZGF0YSA8IGkudmFsdWUgOiBlLmRhdGEgPD0gaS52YWx1ZSkgJiYgKHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCByKSwgaGUociwge1xuICAgICAgICBjb2RlOiBhZS50b29fc21hbGwsXG4gICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgIG1pbmltdW06IGkudmFsdWUsXG4gICAgICAgIGluY2x1c2l2ZTogaS5pbmNsdXNpdmUsXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIG4uZGlydHkoKSkgOiBpLmtpbmQgPT09IFwibWF4XCIgPyAoaS5pbmNsdXNpdmUgPyBlLmRhdGEgPiBpLnZhbHVlIDogZS5kYXRhID49IGkudmFsdWUpICYmIChyID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgciksIGhlKHIsIHtcbiAgICAgICAgY29kZTogYWUudG9vX2JpZyxcbiAgICAgICAgdHlwZTogXCJiaWdpbnRcIixcbiAgICAgICAgbWF4aW11bTogaS52YWx1ZSxcbiAgICAgICAgaW5jbHVzaXZlOiBpLmluY2x1c2l2ZSxcbiAgICAgICAgbWVzc2FnZTogaS5tZXNzYWdlXG4gICAgICB9KSwgbi5kaXJ0eSgpKSA6IGkua2luZCA9PT0gXCJtdWx0aXBsZU9mXCIgPyBlLmRhdGEgJSBpLnZhbHVlICE9PSBCaWdJbnQoMCkgJiYgKHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCByKSwgaGUociwge1xuICAgICAgICBjb2RlOiBhZS5ub3RfbXVsdGlwbGVfb2YsXG4gICAgICAgIG11bHRpcGxlT2Y6IGkudmFsdWUsXG4gICAgICAgIG1lc3NhZ2U6IGkubWVzc2FnZVxuICAgICAgfSksIG4uZGlydHkoKSkgOiBaZS5hc3NlcnROZXZlcihpKTtcbiAgICByZXR1cm4geyBzdGF0dXM6IG4udmFsdWUsIHZhbHVlOiBlLmRhdGEgfTtcbiAgfVxuICBfZ2V0SW52YWxpZElucHV0KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgcmV0dXJuIGhlKHQsIHtcbiAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgIGV4cGVjdGVkOiBtZS5iaWdpbnQsXG4gICAgICByZWNlaXZlZDogdC5wYXJzZWRUeXBlXG4gICAgfSksIFJlO1xuICB9XG4gIGd0ZShlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgZSwgITAsIEVlLnRvU3RyaW5nKHQpKTtcbiAgfVxuICBndChlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgZSwgITEsIEVlLnRvU3RyaW5nKHQpKTtcbiAgfVxuICBsdGUoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIGUsICEwLCBFZS50b1N0cmluZyh0KSk7XG4gIH1cbiAgbHQoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIGUsICExLCBFZS50b1N0cmluZyh0KSk7XG4gIH1cbiAgc2V0TGltaXQoZSwgdCwgciwgbikge1xuICAgIHJldHVybiBuZXcgSm4oe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgY2hlY2tzOiBbXG4gICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgIHtcbiAgICAgICAgICBraW5kOiBlLFxuICAgICAgICAgIHZhbHVlOiB0LFxuICAgICAgICAgIGluY2x1c2l2ZTogcixcbiAgICAgICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhuKVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG4gIH1cbiAgX2FkZENoZWNrKGUpIHtcbiAgICByZXR1cm4gbmV3IEpuKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGVdXG4gICAgfSk7XG4gIH1cbiAgcG9zaXRpdmUoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgdmFsdWU6IEJpZ0ludCgwKSxcbiAgICAgIGluY2x1c2l2ZTogITEsXG4gICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhlKVxuICAgIH0pO1xuICB9XG4gIG5lZ2F0aXZlKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtYXhcIixcbiAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICBpbmNsdXNpdmU6ICExLFxuICAgICAgbWVzc2FnZTogRWUudG9TdHJpbmcoZSlcbiAgICB9KTtcbiAgfVxuICBub25wb3NpdGl2ZShlKSB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICB2YWx1ZTogQmlnSW50KDApLFxuICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKGUpXG4gICAgfSk7XG4gIH1cbiAgbm9ubmVnYXRpdmUoZSkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgdmFsdWU6IEJpZ0ludCgwKSxcbiAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICBtZXNzYWdlOiBFZS50b1N0cmluZyhlKVxuICAgIH0pO1xuICB9XG4gIG11bHRpcGxlT2YoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgIHZhbHVlOiBlLFxuICAgICAgbWVzc2FnZTogRWUudG9TdHJpbmcodClcbiAgICB9KTtcbiAgfVxuICBnZXQgbWluVmFsdWUoKSB7XG4gICAgbGV0IGUgPSBudWxsO1xuICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKVxuICAgICAgdC5raW5kID09PSBcIm1pblwiICYmIChlID09PSBudWxsIHx8IHQudmFsdWUgPiBlKSAmJiAoZSA9IHQudmFsdWUpO1xuICAgIHJldHVybiBlO1xuICB9XG4gIGdldCBtYXhWYWx1ZSgpIHtcbiAgICBsZXQgZSA9IG51bGw7XG4gICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2RlZi5jaGVja3MpXG4gICAgICB0LmtpbmQgPT09IFwibWF4XCIgJiYgKGUgPT09IG51bGwgfHwgdC52YWx1ZSA8IGUpICYmIChlID0gdC52YWx1ZSk7XG4gICAgcmV0dXJuIGU7XG4gIH1cbn1cbkpuLmNyZWF0ZSA9IChzKSA9PiBuZXcgSm4oe1xuICBjaGVja3M6IFtdLFxuICB0eXBlTmFtZToga2UuWm9kQmlnSW50LFxuICBjb2VyY2U6IChzID09IG51bGwgPyB2b2lkIDAgOiBzLmNvZXJjZSkgPz8gITEsXG4gIC4uLlZlKHMpXG59KTtcbmNsYXNzIEhsIGV4dGVuZHMgWWUge1xuICBfcGFyc2UoZSkge1xuICAgIGlmICh0aGlzLl9kZWYuY29lcmNlICYmIChlLmRhdGEgPSAhIWUuZGF0YSksIHRoaXMuX2dldFR5cGUoZSkgIT09IG1lLmJvb2xlYW4pIHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLmJvb2xlYW4sXG4gICAgICAgIHJlY2VpdmVkOiByLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgcmV0dXJuIFJyKGUuZGF0YSk7XG4gIH1cbn1cbkhsLmNyZWF0ZSA9IChzKSA9PiBuZXcgSGwoe1xuICB0eXBlTmFtZToga2UuWm9kQm9vbGVhbixcbiAgY29lcmNlOiAocyA9PSBudWxsID8gdm9pZCAwIDogcy5jb2VyY2UpIHx8ICExLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBUbyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSAmJiAoZS5kYXRhID0gbmV3IERhdGUoZS5kYXRhKSksIHRoaXMuX2dldFR5cGUoZSkgIT09IG1lLmRhdGUpIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShpLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLmRhdGUsXG4gICAgICAgIHJlY2VpdmVkOiBpLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgaWYgKE51bWJlci5pc05hTihlLmRhdGEuZ2V0VGltZSgpKSkge1xuICAgICAgY29uc3QgaSA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO1xuICAgICAgcmV0dXJuIGhlKGksIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF9kYXRlXG4gICAgICB9KSwgUmU7XG4gICAgfVxuICAgIGNvbnN0IHIgPSBuZXcgd3IoKTtcbiAgICBsZXQgbjtcbiAgICBmb3IgKGNvbnN0IGkgb2YgdGhpcy5fZGVmLmNoZWNrcylcbiAgICAgIGkua2luZCA9PT0gXCJtaW5cIiA/IGUuZGF0YS5nZXRUaW1lKCkgPCBpLnZhbHVlICYmIChuID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSwgbiksIGhlKG4sIHtcbiAgICAgICAgY29kZTogYWUudG9vX3NtYWxsLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2UsXG4gICAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICAgIGV4YWN0OiAhMSxcbiAgICAgICAgbWluaW11bTogaS52YWx1ZSxcbiAgICAgICAgdHlwZTogXCJkYXRlXCJcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogaS5raW5kID09PSBcIm1heFwiID8gZS5kYXRhLmdldFRpbWUoKSA+IGkudmFsdWUgJiYgKG4gPSB0aGlzLl9nZXRPclJldHVybkN0eChlLCBuKSwgaGUobiwge1xuICAgICAgICBjb2RlOiBhZS50b29fYmlnLFxuICAgICAgICBtZXNzYWdlOiBpLm1lc3NhZ2UsXG4gICAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICAgIGV4YWN0OiAhMSxcbiAgICAgICAgbWF4aW11bTogaS52YWx1ZSxcbiAgICAgICAgdHlwZTogXCJkYXRlXCJcbiAgICAgIH0pLCByLmRpcnR5KCkpIDogWmUuYXNzZXJ0TmV2ZXIoaSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogci52YWx1ZSxcbiAgICAgIHZhbHVlOiBuZXcgRGF0ZShlLmRhdGEuZ2V0VGltZSgpKVxuICAgIH07XG4gIH1cbiAgX2FkZENoZWNrKGUpIHtcbiAgICByZXR1cm4gbmV3IFRvKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGVdXG4gICAgfSk7XG4gIH1cbiAgbWluKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtaW5cIixcbiAgICAgIHZhbHVlOiBlLmdldFRpbWUoKSxcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKHQpXG4gICAgfSk7XG4gIH1cbiAgbWF4KGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAga2luZDogXCJtYXhcIixcbiAgICAgIHZhbHVlOiBlLmdldFRpbWUoKSxcbiAgICAgIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKHQpXG4gICAgfSk7XG4gIH1cbiAgZ2V0IG1pbkRhdGUoKSB7XG4gICAgbGV0IGUgPSBudWxsO1xuICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKVxuICAgICAgdC5raW5kID09PSBcIm1pblwiICYmIChlID09PSBudWxsIHx8IHQudmFsdWUgPiBlKSAmJiAoZSA9IHQudmFsdWUpO1xuICAgIHJldHVybiBlICE9IG51bGwgPyBuZXcgRGF0ZShlKSA6IG51bGw7XG4gIH1cbiAgZ2V0IG1heERhdGUoKSB7XG4gICAgbGV0IGUgPSBudWxsO1xuICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLl9kZWYuY2hlY2tzKVxuICAgICAgdC5raW5kID09PSBcIm1heFwiICYmIChlID09PSBudWxsIHx8IHQudmFsdWUgPCBlKSAmJiAoZSA9IHQudmFsdWUpO1xuICAgIHJldHVybiBlICE9IG51bGwgPyBuZXcgRGF0ZShlKSA6IG51bGw7XG4gIH1cbn1cblRvLmNyZWF0ZSA9IChzKSA9PiBuZXcgVG8oe1xuICBjaGVja3M6IFtdLFxuICBjb2VyY2U6IChzID09IG51bGwgPyB2b2lkIDAgOiBzLmNvZXJjZSkgfHwgITEsXG4gIHR5cGVOYW1lOiBrZS5ab2REYXRlLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBRdSBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodGhpcy5fZ2V0VHlwZShlKSAhPT0gbWUuc3ltYm9sKSB7XG4gICAgICBjb25zdCByID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgICByZXR1cm4gaGUociwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgIGV4cGVjdGVkOiBtZS5zeW1ib2wsXG4gICAgICAgIHJlY2VpdmVkOiByLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgcmV0dXJuIFJyKGUuZGF0YSk7XG4gIH1cbn1cblF1LmNyZWF0ZSA9IChzKSA9PiBuZXcgUXUoe1xuICB0eXBlTmFtZToga2UuWm9kU3ltYm9sLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBxbCBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodGhpcy5fZ2V0VHlwZShlKSAhPT0gbWUudW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCByID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgICByZXR1cm4gaGUociwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgIGV4cGVjdGVkOiBtZS51bmRlZmluZWQsXG4gICAgICAgIHJlY2VpdmVkOiByLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgcmV0dXJuIFJyKGUuZGF0YSk7XG4gIH1cbn1cbnFsLmNyZWF0ZSA9IChzKSA9PiBuZXcgcWwoe1xuICB0eXBlTmFtZToga2UuWm9kVW5kZWZpbmVkLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBXbCBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodGhpcy5fZ2V0VHlwZShlKSAhPT0gbWUubnVsbCkge1xuICAgICAgY29uc3QgciA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO1xuICAgICAgcmV0dXJuIGhlKHIsIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF90eXBlLFxuICAgICAgICBleHBlY3RlZDogbWUubnVsbCxcbiAgICAgICAgcmVjZWl2ZWQ6IHIucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICByZXR1cm4gUnIoZS5kYXRhKTtcbiAgfVxufVxuV2wuY3JlYXRlID0gKHMpID0+IG5ldyBXbCh7XG4gIHR5cGVOYW1lOiBrZS5ab2ROdWxsLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBlZCBleHRlbmRzIFllIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5fYW55ID0gITA7XG4gIH1cbiAgX3BhcnNlKGUpIHtcbiAgICByZXR1cm4gUnIoZS5kYXRhKTtcbiAgfVxufVxuZWQuY3JlYXRlID0gKHMpID0+IG5ldyBlZCh7XG4gIHR5cGVOYW1lOiBrZS5ab2RBbnksXG4gIC4uLlZlKHMpXG59KTtcbmNsYXNzIHRkIGV4dGVuZHMgWWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLl91bmtub3duID0gITA7XG4gIH1cbiAgX3BhcnNlKGUpIHtcbiAgICByZXR1cm4gUnIoZS5kYXRhKTtcbiAgfVxufVxudGQuY3JlYXRlID0gKHMpID0+IG5ldyB0ZCh7XG4gIHR5cGVOYW1lOiBrZS5ab2RVbmtub3duLFxuICAuLi5WZShzKVxufSk7XG5jbGFzcyBQcyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgcmV0dXJuIGhlKHQsIHtcbiAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgIGV4cGVjdGVkOiBtZS5uZXZlcixcbiAgICAgIHJlY2VpdmVkOiB0LnBhcnNlZFR5cGVcbiAgICB9KSwgUmU7XG4gIH1cbn1cblBzLmNyZWF0ZSA9IChzKSA9PiBuZXcgUHMoe1xuICB0eXBlTmFtZToga2UuWm9kTmV2ZXIsXG4gIC4uLlZlKHMpXG59KTtcbmNsYXNzIHJkIGV4dGVuZHMgWWUge1xuICBfcGFyc2UoZSkge1xuICAgIGlmICh0aGlzLl9nZXRUeXBlKGUpICE9PSBtZS51bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLnZvaWQsXG4gICAgICAgIHJlY2VpdmVkOiByLnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgcmV0dXJuIFJyKGUuZGF0YSk7XG4gIH1cbn1cbnJkLmNyZWF0ZSA9IChzKSA9PiBuZXcgcmQoe1xuICB0eXBlTmFtZToga2UuWm9kVm9pZCxcbiAgLi4uVmUocylcbn0pO1xuY2xhc3MgWXIgZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgeyBjdHg6IHQsIHN0YXR1czogciB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLCBuID0gdGhpcy5fZGVmO1xuICAgIGlmICh0LnBhcnNlZFR5cGUgIT09IG1lLmFycmF5KVxuICAgICAgcmV0dXJuIGhlKHQsIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF90eXBlLFxuICAgICAgICBleHBlY3RlZDogbWUuYXJyYXksXG4gICAgICAgIHJlY2VpdmVkOiB0LnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICBpZiAobi5leGFjdExlbmd0aCAhPT0gbnVsbCkge1xuICAgICAgY29uc3QgbyA9IHQuZGF0YS5sZW5ndGggPiBuLmV4YWN0TGVuZ3RoLnZhbHVlLCBhID0gdC5kYXRhLmxlbmd0aCA8IG4uZXhhY3RMZW5ndGgudmFsdWU7XG4gICAgICAobyB8fCBhKSAmJiAoaGUodCwge1xuICAgICAgICBjb2RlOiBvID8gYWUudG9vX2JpZyA6IGFlLnRvb19zbWFsbCxcbiAgICAgICAgbWluaW11bTogYSA/IG4uZXhhY3RMZW5ndGgudmFsdWUgOiB2b2lkIDAsXG4gICAgICAgIG1heGltdW06IG8gPyBuLmV4YWN0TGVuZ3RoLnZhbHVlIDogdm9pZCAwLFxuICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICAgIGV4YWN0OiAhMCxcbiAgICAgICAgbWVzc2FnZTogbi5leGFjdExlbmd0aC5tZXNzYWdlXG4gICAgICB9KSwgci5kaXJ0eSgpKTtcbiAgICB9XG4gICAgaWYgKG4ubWluTGVuZ3RoICE9PSBudWxsICYmIHQuZGF0YS5sZW5ndGggPCBuLm1pbkxlbmd0aC52YWx1ZSAmJiAoaGUodCwge1xuICAgICAgY29kZTogYWUudG9vX3NtYWxsLFxuICAgICAgbWluaW11bTogbi5taW5MZW5ndGgudmFsdWUsXG4gICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgZXhhY3Q6ICExLFxuICAgICAgbWVzc2FnZTogbi5taW5MZW5ndGgubWVzc2FnZVxuICAgIH0pLCByLmRpcnR5KCkpLCBuLm1heExlbmd0aCAhPT0gbnVsbCAmJiB0LmRhdGEubGVuZ3RoID4gbi5tYXhMZW5ndGgudmFsdWUgJiYgKGhlKHQsIHtcbiAgICAgIGNvZGU6IGFlLnRvb19iaWcsXG4gICAgICBtYXhpbXVtOiBuLm1heExlbmd0aC52YWx1ZSxcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGluY2x1c2l2ZTogITAsXG4gICAgICBleGFjdDogITEsXG4gICAgICBtZXNzYWdlOiBuLm1heExlbmd0aC5tZXNzYWdlXG4gICAgfSksIHIuZGlydHkoKSksIHQuY29tbW9uLmFzeW5jKVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFsuLi50LmRhdGFdLm1hcCgobywgYSkgPT4gbi50eXBlLl9wYXJzZUFzeW5jKG5ldyBEcyh0LCBvLCB0LnBhdGgsIGEpKSkpLnRoZW4oKG8pID0+IHdyLm1lcmdlQXJyYXkociwgbykpO1xuICAgIGNvbnN0IGkgPSBbLi4udC5kYXRhXS5tYXAoKG8sIGEpID0+IG4udHlwZS5fcGFyc2VTeW5jKG5ldyBEcyh0LCBvLCB0LnBhdGgsIGEpKSk7XG4gICAgcmV0dXJuIHdyLm1lcmdlQXJyYXkociwgaSk7XG4gIH1cbiAgZ2V0IGVsZW1lbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICB9XG4gIG1pbihlLCB0KSB7XG4gICAgcmV0dXJuIG5ldyBZcih7XG4gICAgICAuLi50aGlzLl9kZWYsXG4gICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IGUsIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKHQpIH1cbiAgICB9KTtcbiAgfVxuICBtYXgoZSwgdCkge1xuICAgIHJldHVybiBuZXcgWXIoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgbWF4TGVuZ3RoOiB7IHZhbHVlOiBlLCBtZXNzYWdlOiBFZS50b1N0cmluZyh0KSB9XG4gICAgfSk7XG4gIH1cbiAgbGVuZ3RoKGUsIHQpIHtcbiAgICByZXR1cm4gbmV3IFlyKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGV4YWN0TGVuZ3RoOiB7IHZhbHVlOiBlLCBtZXNzYWdlOiBFZS50b1N0cmluZyh0KSB9XG4gICAgfSk7XG4gIH1cbiAgbm9uZW1wdHkoZSkge1xuICAgIHJldHVybiB0aGlzLm1pbigxLCBlKTtcbiAgfVxufVxuWXIuY3JlYXRlID0gKHMsIGUpID0+IG5ldyBZcih7XG4gIHR5cGU6IHMsXG4gIG1pbkxlbmd0aDogbnVsbCxcbiAgbWF4TGVuZ3RoOiBudWxsLFxuICBleGFjdExlbmd0aDogbnVsbCxcbiAgdHlwZU5hbWU6IGtlLlpvZEFycmF5LFxuICAuLi5WZShlKVxufSk7XG5mdW5jdGlvbiBtbihzKSB7XG4gIGlmIChzIGluc3RhbmNlb2YgJHQpIHtcbiAgICBjb25zdCBlID0ge307XG4gICAgZm9yIChjb25zdCB0IGluIHMuc2hhcGUpIHtcbiAgICAgIGNvbnN0IHIgPSBzLnNoYXBlW3RdO1xuICAgICAgZVt0XSA9IGZzLmNyZWF0ZShtbihyKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgJHQoe1xuICAgICAgLi4ucy5fZGVmLFxuICAgICAgc2hhcGU6ICgpID0+IGVcbiAgICB9KTtcbiAgfSBlbHNlIHJldHVybiBzIGluc3RhbmNlb2YgWXIgPyBuZXcgWXIoe1xuICAgIC4uLnMuX2RlZixcbiAgICB0eXBlOiBtbihzLmVsZW1lbnQpXG4gIH0pIDogcyBpbnN0YW5jZW9mIGZzID8gZnMuY3JlYXRlKG1uKHMudW53cmFwKCkpKSA6IHMgaW5zdGFuY2VvZiBacyA/IFpzLmNyZWF0ZShtbihzLnVud3JhcCgpKSkgOiBzIGluc3RhbmNlb2YgV3MgPyBXcy5jcmVhdGUocy5pdGVtcy5tYXAoKGUpID0+IG1uKGUpKSkgOiBzO1xufVxuY2xhc3MgJHQgZXh0ZW5kcyBZZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyksIHRoaXMuX2NhY2hlZCA9IG51bGwsIHRoaXMubm9uc3RyaWN0ID0gdGhpcy5wYXNzdGhyb3VnaCwgdGhpcy5hdWdtZW50ID0gdGhpcy5leHRlbmQ7XG4gIH1cbiAgX2dldENhY2hlZCgpIHtcbiAgICBpZiAodGhpcy5fY2FjaGVkICE9PSBudWxsKVxuICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZDtcbiAgICBjb25zdCBlID0gdGhpcy5fZGVmLnNoYXBlKCksIHQgPSBaZS5vYmplY3RLZXlzKGUpO1xuICAgIHJldHVybiB0aGlzLl9jYWNoZWQgPSB7IHNoYXBlOiBlLCBrZXlzOiB0IH0sIHRoaXMuX2NhY2hlZDtcbiAgfVxuICBfcGFyc2UoZSkge1xuICAgIGlmICh0aGlzLl9nZXRUeXBlKGUpICE9PSBtZS5vYmplY3QpIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShjLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLm9iamVjdCxcbiAgICAgICAgcmVjZWl2ZWQ6IGMucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICBjb25zdCB7IHN0YXR1czogciwgY3R4OiBuIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSksIHsgc2hhcGU6IGksIGtleXM6IG8gfSA9IHRoaXMuX2dldENhY2hlZCgpLCBhID0gW107XG4gICAgaWYgKCEodGhpcy5fZGVmLmNhdGNoYWxsIGluc3RhbmNlb2YgUHMgJiYgdGhpcy5fZGVmLnVua25vd25LZXlzID09PSBcInN0cmlwXCIpKVxuICAgICAgZm9yIChjb25zdCBjIGluIG4uZGF0YSlcbiAgICAgICAgby5pbmNsdWRlcyhjKSB8fCBhLnB1c2goYyk7XG4gICAgY29uc3QgbCA9IFtdO1xuICAgIGZvciAoY29uc3QgYyBvZiBvKSB7XG4gICAgICBjb25zdCB1ID0gaVtjXSwgZCA9IG4uZGF0YVtjXTtcbiAgICAgIGwucHVzaCh7XG4gICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGMgfSxcbiAgICAgICAgdmFsdWU6IHUuX3BhcnNlKG5ldyBEcyhuLCBkLCBuLnBhdGgsIGMpKSxcbiAgICAgICAgYWx3YXlzU2V0OiBjIGluIG4uZGF0YVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBQcykge1xuICAgICAgY29uc3QgYyA9IHRoaXMuX2RlZi51bmtub3duS2V5cztcbiAgICAgIGlmIChjID09PSBcInBhc3N0aHJvdWdoXCIpXG4gICAgICAgIGZvciAoY29uc3QgdSBvZiBhKVxuICAgICAgICAgIGwucHVzaCh7XG4gICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiB1IH0sXG4gICAgICAgICAgICB2YWx1ZTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IG4uZGF0YVt1XSB9XG4gICAgICAgICAgfSk7XG4gICAgICBlbHNlIGlmIChjID09PSBcInN0cmljdFwiKVxuICAgICAgICBhLmxlbmd0aCA+IDAgJiYgKGhlKG4sIHtcbiAgICAgICAgICBjb2RlOiBhZS51bnJlY29nbml6ZWRfa2V5cyxcbiAgICAgICAgICBrZXlzOiBhXG4gICAgICAgIH0pLCByLmRpcnR5KCkpO1xuICAgICAgZWxzZSBpZiAoYyAhPT0gXCJzdHJpcFwiKSB0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjID0gdGhpcy5fZGVmLmNhdGNoYWxsO1xuICAgICAgZm9yIChjb25zdCB1IG9mIGEpIHtcbiAgICAgICAgY29uc3QgZCA9IG4uZGF0YVt1XTtcbiAgICAgICAgbC5wdXNoKHtcbiAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiB1IH0sXG4gICAgICAgICAgdmFsdWU6IGMuX3BhcnNlKFxuICAgICAgICAgICAgbmV3IERzKG4sIGQsIG4ucGF0aCwgdSlcbiAgICAgICAgICAgIC8vLCBjdHguY2hpbGQoa2V5KSwgdmFsdWUsIGdldFBhcnNlZFR5cGUodmFsdWUpXG4gICAgICAgICAgKSxcbiAgICAgICAgICBhbHdheXNTZXQ6IHUgaW4gbi5kYXRhXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbi5jb21tb24uYXN5bmMgPyBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGMgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgdSBvZiBsKSB7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCB1LmtleSwgaCA9IGF3YWl0IHUudmFsdWU7XG4gICAgICAgIGMucHVzaCh7XG4gICAgICAgICAga2V5OiBkLFxuICAgICAgICAgIHZhbHVlOiBoLFxuICAgICAgICAgIGFsd2F5c1NldDogdS5hbHdheXNTZXRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYztcbiAgICB9KS50aGVuKChjKSA9PiB3ci5tZXJnZU9iamVjdFN5bmMociwgYykpIDogd3IubWVyZ2VPYmplY3RTeW5jKHIsIGwpO1xuICB9XG4gIGdldCBzaGFwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLnNoYXBlKCk7XG4gIH1cbiAgc3RyaWN0KGUpIHtcbiAgICByZXR1cm4gRWUuZXJyVG9PYmosIG5ldyAkdCh7XG4gICAgICAuLi50aGlzLl9kZWYsXG4gICAgICB1bmtub3duS2V5czogXCJzdHJpY3RcIixcbiAgICAgIC4uLmUgIT09IHZvaWQgMCA/IHtcbiAgICAgICAgZXJyb3JNYXA6ICh0LCByKSA9PiB7XG4gICAgICAgICAgdmFyIGksIG87XG4gICAgICAgICAgY29uc3QgbiA9ICgobyA9IChpID0gdGhpcy5fZGVmKS5lcnJvck1hcCkgPT0gbnVsbCA/IHZvaWQgMCA6IG8uY2FsbChpLCB0LCByKS5tZXNzYWdlKSA/PyByLmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICByZXR1cm4gdC5jb2RlID09PSBcInVucmVjb2duaXplZF9rZXlzXCIgPyB7XG4gICAgICAgICAgICBtZXNzYWdlOiBFZS5lcnJUb09iaihlKS5tZXNzYWdlID8/IG5cbiAgICAgICAgICB9IDoge1xuICAgICAgICAgICAgbWVzc2FnZTogblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH0gOiB7fVxuICAgIH0pO1xuICB9XG4gIHN0cmlwKCkge1xuICAgIHJldHVybiBuZXcgJHQoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgdW5rbm93bktleXM6IFwic3RyaXBcIlxuICAgIH0pO1xuICB9XG4gIHBhc3N0aHJvdWdoKCkge1xuICAgIHJldHVybiBuZXcgJHQoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgdW5rbm93bktleXM6IFwicGFzc3Rocm91Z2hcIlxuICAgIH0pO1xuICB9XG4gIC8vIGNvbnN0IEF1Z21lbnRGYWN0b3J5ID1cbiAgLy8gICA8RGVmIGV4dGVuZHMgWm9kT2JqZWN0RGVmPihkZWY6IERlZikgPT5cbiAgLy8gICA8QXVnbWVudGF0aW9uIGV4dGVuZHMgWm9kUmF3U2hhcGU+KFxuICAvLyAgICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgLy8gICApOiBab2RPYmplY3Q8XG4gIC8vICAgICBleHRlbmRTaGFwZTxSZXR1cm5UeXBlPERlZltcInNoYXBlXCJdPiwgQXVnbWVudGF0aW9uPixcbiAgLy8gICAgIERlZltcInVua25vd25LZXlzXCJdLFxuICAvLyAgICAgRGVmW1wiY2F0Y2hhbGxcIl1cbiAgLy8gICA+ID0+IHtcbiAgLy8gICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgLy8gICAgICAgLi4uZGVmLFxuICAvLyAgICAgICBzaGFwZTogKCkgPT4gKHtcbiAgLy8gICAgICAgICAuLi5kZWYuc2hhcGUoKSxcbiAgLy8gICAgICAgICAuLi5hdWdtZW50YXRpb24sXG4gIC8vICAgICAgIH0pLFxuICAvLyAgICAgfSkgYXMgYW55O1xuICAvLyAgIH07XG4gIGV4dGVuZChlKSB7XG4gICAgcmV0dXJuIG5ldyAkdCh7XG4gICAgICAuLi50aGlzLl9kZWYsXG4gICAgICBzaGFwZTogKCkgPT4gKHtcbiAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgIC4uLmVcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIFByaW9yIHRvIHpvZEAxLjAuMTIgdGhlcmUgd2FzIGEgYnVnIGluIHRoZVxuICAgKiBpbmZlcnJlZCB0eXBlIG9mIG1lcmdlZCBvYmplY3RzLiBQbGVhc2VcbiAgICogdXBncmFkZSBpZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBpc3N1ZXMuXG4gICAqL1xuICBtZXJnZShlKSB7XG4gICAgcmV0dXJuIG5ldyAkdCh7XG4gICAgICB1bmtub3duS2V5czogZS5fZGVmLnVua25vd25LZXlzLFxuICAgICAgY2F0Y2hhbGw6IGUuX2RlZi5jYXRjaGFsbCxcbiAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgLi4uZS5fZGVmLnNoYXBlKClcbiAgICAgIH0pLFxuICAgICAgdHlwZU5hbWU6IGtlLlpvZE9iamVjdFxuICAgIH0pO1xuICB9XG4gIC8vIG1lcmdlPFxuICAvLyAgIEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0LFxuICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIEluY29taW5nW1wic2hhcGVcIl0sXG4gIC8vICAgTmV3T3V0cHV0IGV4dGVuZHMge1xuICAvLyAgICAgW2sgaW4ga2V5b2YgQXVnbWVudGF0aW9uIHwga2V5b2YgT3V0cHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgT3V0cHV0XG4gIC8vICAgICAgID8gT3V0cHV0W2tdXG4gIC8vICAgICAgIDogbmV2ZXI7XG4gIC8vICAgfSxcbiAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHtcbiAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIElucHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9pbnB1dFwiXVxuICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBJbnB1dFxuICAvLyAgICAgICA/IElucHV0W2tdXG4gIC8vICAgICAgIDogbmV2ZXI7XG4gIC8vICAgfVxuICAvLyA+KFxuICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gIC8vICk6IFpvZE9iamVjdDxcbiAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1widW5rbm93bktleXNcIl0sXG4gIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1wiY2F0Y2hhbGxcIl0sXG4gIC8vICAgTmV3T3V0cHV0LFxuICAvLyAgIE5ld0lucHV0XG4gIC8vID4ge1xuICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gIC8vICAgICB1bmtub3duS2V5czogbWVyZ2luZy5fZGVmLnVua25vd25LZXlzLFxuICAvLyAgICAgY2F0Y2hhbGw6IG1lcmdpbmcuX2RlZi5jYXRjaGFsbCxcbiAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAvLyAgICAgICBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKHRoaXMuX2RlZi5zaGFwZSgpLCBtZXJnaW5nLl9kZWYuc2hhcGUoKSksXG4gIC8vICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9iamVjdCxcbiAgLy8gICB9KSBhcyBhbnk7XG4gIC8vICAgcmV0dXJuIG1lcmdlZDtcbiAgLy8gfVxuICBzZXRLZXkoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLmF1Z21lbnQoeyBbZV06IHQgfSk7XG4gIH1cbiAgLy8gbWVyZ2U8SW5jb21pbmcgZXh0ZW5kcyBBbnlab2RPYmplY3Q+KFxuICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gIC8vICk6IC8vWm9kT2JqZWN0PFQgJiBJbmNvbWluZ1tcIl9zaGFwZVwiXSwgVW5rbm93bktleXMsIENhdGNoYWxsPiA9IChtZXJnaW5nKSA9PiB7XG4gIC8vIFpvZE9iamVjdDxcbiAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1widW5rbm93bktleXNcIl0sXG4gIC8vICAgSW5jb21pbmdbXCJfZGVmXCJdW1wiY2F0Y2hhbGxcIl1cbiAgLy8gPiB7XG4gIC8vICAgLy8gY29uc3QgbWVyZ2VkU2hhcGUgPSBvYmplY3RVdGlsLm1lcmdlU2hhcGVzKFxuICAvLyAgIC8vICAgdGhpcy5fZGVmLnNoYXBlKCksXG4gIC8vICAgLy8gICBtZXJnaW5nLl9kZWYuc2hhcGUoKVxuICAvLyAgIC8vICk7XG4gIC8vICAgY29uc3QgbWVyZ2VkOiBhbnkgPSBuZXcgWm9kT2JqZWN0KHtcbiAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gIC8vICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAvLyAgICAgc2hhcGU6ICgpID0+XG4gIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgLy8gICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAvLyAgIH0pIGFzIGFueTtcbiAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAvLyB9XG4gIGNhdGNoYWxsKGUpIHtcbiAgICByZXR1cm4gbmV3ICR0KHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIGNhdGNoYWxsOiBlXG4gICAgfSk7XG4gIH1cbiAgcGljayhlKSB7XG4gICAgY29uc3QgdCA9IHt9O1xuICAgIGZvciAoY29uc3QgciBvZiBaZS5vYmplY3RLZXlzKGUpKVxuICAgICAgZVtyXSAmJiB0aGlzLnNoYXBlW3JdICYmICh0W3JdID0gdGhpcy5zaGFwZVtyXSk7XG4gICAgcmV0dXJuIG5ldyAkdCh7XG4gICAgICAuLi50aGlzLl9kZWYsXG4gICAgICBzaGFwZTogKCkgPT4gdFxuICAgIH0pO1xuICB9XG4gIG9taXQoZSkge1xuICAgIGNvbnN0IHQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgWmUub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSlcbiAgICAgIGVbcl0gfHwgKHRbcl0gPSB0aGlzLnNoYXBlW3JdKTtcbiAgICByZXR1cm4gbmV3ICR0KHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIHNoYXBlOiAoKSA9PiB0XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBkZWVwUGFydGlhbCgpIHtcbiAgICByZXR1cm4gbW4odGhpcyk7XG4gIH1cbiAgcGFydGlhbChlKSB7XG4gICAgY29uc3QgdCA9IHt9O1xuICAgIGZvciAoY29uc3QgciBvZiBaZS5vYmplY3RLZXlzKHRoaXMuc2hhcGUpKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5zaGFwZVtyXTtcbiAgICAgIGUgJiYgIWVbcl0gPyB0W3JdID0gbiA6IHRbcl0gPSBuLm9wdGlvbmFsKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgJHQoe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgc2hhcGU6ICgpID0+IHRcbiAgICB9KTtcbiAgfVxuICByZXF1aXJlZChlKSB7XG4gICAgY29uc3QgdCA9IHt9O1xuICAgIGZvciAoY29uc3QgciBvZiBaZS5vYmplY3RLZXlzKHRoaXMuc2hhcGUpKVxuICAgICAgaWYgKGUgJiYgIWVbcl0pXG4gICAgICAgIHRbcl0gPSB0aGlzLnNoYXBlW3JdO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGxldCBpID0gdGhpcy5zaGFwZVtyXTtcbiAgICAgICAgZm9yICg7IGkgaW5zdGFuY2VvZiBmczsgKVxuICAgICAgICAgIGkgPSBpLl9kZWYuaW5uZXJUeXBlO1xuICAgICAgICB0W3JdID0gaTtcbiAgICAgIH1cbiAgICByZXR1cm4gbmV3ICR0KHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIHNoYXBlOiAoKSA9PiB0XG4gICAgfSk7XG4gIH1cbiAga2V5b2YoKSB7XG4gICAgcmV0dXJuIE5mKFplLm9iamVjdEtleXModGhpcy5zaGFwZSkpO1xuICB9XG59XG4kdC5jcmVhdGUgPSAocywgZSkgPT4gbmV3ICR0KHtcbiAgc2hhcGU6ICgpID0+IHMsXG4gIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gIGNhdGNoYWxsOiBQcy5jcmVhdGUoKSxcbiAgdHlwZU5hbWU6IGtlLlpvZE9iamVjdCxcbiAgLi4uVmUoZSlcbn0pO1xuJHQuc3RyaWN0Q3JlYXRlID0gKHMsIGUpID0+IG5ldyAkdCh7XG4gIHNoYXBlOiAoKSA9PiBzLFxuICB1bmtub3duS2V5czogXCJzdHJpY3RcIixcbiAgY2F0Y2hhbGw6IFBzLmNyZWF0ZSgpLFxuICB0eXBlTmFtZToga2UuWm9kT2JqZWN0LFxuICAuLi5WZShlKVxufSk7XG4kdC5sYXp5Y3JlYXRlID0gKHMsIGUpID0+IG5ldyAkdCh7XG4gIHNoYXBlOiBzLFxuICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICBjYXRjaGFsbDogUHMuY3JlYXRlKCksXG4gIHR5cGVOYW1lOiBrZS5ab2RPYmplY3QsXG4gIC4uLlZlKGUpXG59KTtcbmNsYXNzIHdvIGV4dGVuZHMgWWUge1xuICBfcGFyc2UoZSkge1xuICAgIGNvbnN0IHsgY3R4OiB0IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSksIHIgPSB0aGlzLl9kZWYub3B0aW9ucztcbiAgICBmdW5jdGlvbiBuKGkpIHtcbiAgICAgIGZvciAoY29uc3QgYSBvZiBpKVxuICAgICAgICBpZiAoYS5yZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCIpXG4gICAgICAgICAgcmV0dXJuIGEucmVzdWx0O1xuICAgICAgZm9yIChjb25zdCBhIG9mIGkpXG4gICAgICAgIGlmIChhLnJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICByZXR1cm4gdC5jb21tb24uaXNzdWVzLnB1c2goLi4uYS5jdHguY29tbW9uLmlzc3VlcyksIGEucmVzdWx0O1xuICAgICAgY29uc3QgbyA9IGkubWFwKChhKSA9PiBuZXcgcHMoYS5jdHguY29tbW9uLmlzc3VlcykpO1xuICAgICAgcmV0dXJuIGhlKHQsIHtcbiAgICAgICAgY29kZTogYWUuaW52YWxpZF91bmlvbixcbiAgICAgICAgdW5pb25FcnJvcnM6IG9cbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgaWYgKHQuY29tbW9uLmFzeW5jKVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHIubWFwKGFzeW5jIChpKSA9PiB7XG4gICAgICAgIGNvbnN0IG8gPSB7XG4gICAgICAgICAgLi4udCxcbiAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgIC4uLnQuY29tbW9uLFxuICAgICAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgcGFyZW50OiBudWxsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzdWx0OiBhd2FpdCBpLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgIGRhdGE6IHQuZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IHQucGF0aCxcbiAgICAgICAgICAgIHBhcmVudDogb1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIGN0eDogb1xuICAgICAgICB9O1xuICAgICAgfSkpLnRoZW4obik7XG4gICAge1xuICAgICAgbGV0IGk7XG4gICAgICBjb25zdCBvID0gW107XG4gICAgICBmb3IgKGNvbnN0IGwgb2Ygcikge1xuICAgICAgICBjb25zdCBjID0ge1xuICAgICAgICAgIC4uLnQsXG4gICAgICAgICAgY29tbW9uOiB7XG4gICAgICAgICAgICAuLi50LmNvbW1vbixcbiAgICAgICAgICAgIGlzc3VlczogW11cbiAgICAgICAgICB9LFxuICAgICAgICAgIHBhcmVudDogbnVsbFxuICAgICAgICB9LCB1ID0gbC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICBkYXRhOiB0LmRhdGEsXG4gICAgICAgICAgcGF0aDogdC5wYXRoLFxuICAgICAgICAgIHBhcmVudDogY1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHUuc3RhdHVzID09PSBcInZhbGlkXCIpXG4gICAgICAgICAgcmV0dXJuIHU7XG4gICAgICAgIHUuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgIWkgJiYgKGkgPSB7IHJlc3VsdDogdSwgY3R4OiBjIH0pLCBjLmNvbW1vbi5pc3N1ZXMubGVuZ3RoICYmIG8ucHVzaChjLmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgfVxuICAgICAgaWYgKGkpXG4gICAgICAgIHJldHVybiB0LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5pLmN0eC5jb21tb24uaXNzdWVzKSwgaS5yZXN1bHQ7XG4gICAgICBjb25zdCBhID0gby5tYXAoKGwpID0+IG5ldyBwcyhsKSk7XG4gICAgICByZXR1cm4gaGUodCwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3VuaW9uLFxuICAgICAgICB1bmlvbkVycm9yczogYVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgfVxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnM7XG4gIH1cbn1cbndvLmNyZWF0ZSA9IChzLCBlKSA9PiBuZXcgd28oe1xuICBvcHRpb25zOiBzLFxuICB0eXBlTmFtZToga2UuWm9kVW5pb24sXG4gIC4uLlZlKGUpXG59KTtcbmNvbnN0IG9zID0gKHMpID0+IHMgaW5zdGFuY2VvZiBZbCA/IG9zKHMuc2NoZW1hKSA6IHMgaW5zdGFuY2VvZiBZcyA/IG9zKHMuaW5uZXJUeXBlKCkpIDogcyBpbnN0YW5jZW9mIElvID8gW3MudmFsdWVdIDogcyBpbnN0YW5jZW9mIHpzID8gcy5vcHRpb25zIDogcyBpbnN0YW5jZW9mIFpsID8gWmUub2JqZWN0VmFsdWVzKHMuZW51bSkgOiBzIGluc3RhbmNlb2YgUm8gPyBvcyhzLl9kZWYuaW5uZXJUeXBlKSA6IHMgaW5zdGFuY2VvZiBxbCA/IFt2b2lkIDBdIDogcyBpbnN0YW5jZW9mIFdsID8gW251bGxdIDogcyBpbnN0YW5jZW9mIGZzID8gW3ZvaWQgMCwgLi4ub3Mocy51bndyYXAoKSldIDogcyBpbnN0YW5jZW9mIFpzID8gW251bGwsIC4uLm9zKHMudW53cmFwKCkpXSA6IHMgaW5zdGFuY2VvZiBVZiB8fCBzIGluc3RhbmNlb2YgQ28gPyBvcyhzLnVud3JhcCgpKSA6IHMgaW5zdGFuY2VvZiBMbyA/IG9zKHMuX2RlZi5pbm5lclR5cGUpIDogW107XG5jbGFzcyBVYyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB7IGN0eDogdCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO1xuICAgIGlmICh0LnBhcnNlZFR5cGUgIT09IG1lLm9iamVjdClcbiAgICAgIHJldHVybiBoZSh0LCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLm9iamVjdCxcbiAgICAgICAgcmVjZWl2ZWQ6IHQucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIGNvbnN0IHIgPSB0aGlzLmRpc2NyaW1pbmF0b3IsIG4gPSB0LmRhdGFbcl0sIGkgPSB0aGlzLm9wdGlvbnNNYXAuZ2V0KG4pO1xuICAgIHJldHVybiBpID8gdC5jb21tb24uYXN5bmMgPyBpLl9wYXJzZUFzeW5jKHtcbiAgICAgIGRhdGE6IHQuZGF0YSxcbiAgICAgIHBhdGg6IHQucGF0aCxcbiAgICAgIHBhcmVudDogdFxuICAgIH0pIDogaS5fcGFyc2VTeW5jKHtcbiAgICAgIGRhdGE6IHQuZGF0YSxcbiAgICAgIHBhdGg6IHQucGF0aCxcbiAgICAgIHBhcmVudDogdFxuICAgIH0pIDogKGhlKHQsIHtcbiAgICAgIGNvZGU6IGFlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixcbiAgICAgIG9wdGlvbnM6IEFycmF5LmZyb20odGhpcy5vcHRpb25zTWFwLmtleXMoKSksXG4gICAgICBwYXRoOiBbcl1cbiAgICB9KSwgUmUpO1xuICB9XG4gIGdldCBkaXNjcmltaW5hdG9yKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcjtcbiAgfVxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLm9wdGlvbnM7XG4gIH1cbiAgZ2V0IG9wdGlvbnNNYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5vcHRpb25zTWFwO1xuICB9XG4gIC8qKlxuICAgKiBUaGUgY29uc3RydWN0b3Igb2YgdGhlIGRpc2NyaW1pbmF0ZWQgdW5pb24gc2NoZW1hLiBJdHMgYmVoYXZpb3VyIGlzIHZlcnkgc2ltaWxhciB0byB0aGF0IG9mIHRoZSBub3JtYWwgei51bmlvbigpIGNvbnN0cnVjdG9yLlxuICAgKiBIb3dldmVyLCBpdCBvbmx5IGFsbG93cyBhIHVuaW9uIG9mIG9iamVjdHMsIGFsbCBvZiB3aGljaCBuZWVkIHRvIHNoYXJlIGEgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBtdXN0XG4gICAqIGhhdmUgYSBkaWZmZXJlbnQgdmFsdWUgZm9yIGVhY2ggb2JqZWN0IGluIHRoZSB1bmlvbi5cbiAgICogQHBhcmFtIGRpc2NyaW1pbmF0b3IgdGhlIG5hbWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgcHJvcGVydHlcbiAgICogQHBhcmFtIHR5cGVzIGFuIGFycmF5IG9mIG9iamVjdCBzY2hlbWFzXG4gICAqIEBwYXJhbSBwYXJhbXNcbiAgICovXG4gIHN0YXRpYyBjcmVhdGUoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIGZvciAoY29uc3QgaSBvZiB0KSB7XG4gICAgICBjb25zdCBvID0gb3MoaS5zaGFwZVtlXSk7XG4gICAgICBpZiAoIW8ubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxcYCR7ZX1cXGAgY291bGQgbm90IGJlIGV4dHJhY3RlZCBmcm9tIGFsbCBzY2hlbWEgb3B0aW9uc2ApO1xuICAgICAgZm9yIChjb25zdCBhIG9mIG8pIHtcbiAgICAgICAgaWYgKG4uaGFzKGEpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRGlzY3JpbWluYXRvciBwcm9wZXJ0eSAke1N0cmluZyhlKX0gaGFzIGR1cGxpY2F0ZSB2YWx1ZSAke1N0cmluZyhhKX1gKTtcbiAgICAgICAgbi5zZXQoYSwgaSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWMoe1xuICAgICAgdHlwZU5hbWU6IGtlLlpvZERpc2NyaW1pbmF0ZWRVbmlvbixcbiAgICAgIGRpc2NyaW1pbmF0b3I6IGUsXG4gICAgICBvcHRpb25zOiB0LFxuICAgICAgb3B0aW9uc01hcDogbixcbiAgICAgIC4uLlZlKHIpXG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHpsKHMsIGUpIHtcbiAgY29uc3QgdCA9IHdzKHMpLCByID0gd3MoZSk7XG4gIGlmIChzID09PSBlKVxuICAgIHJldHVybiB7IHZhbGlkOiAhMCwgZGF0YTogcyB9O1xuICBpZiAodCA9PT0gbWUub2JqZWN0ICYmIHIgPT09IG1lLm9iamVjdCkge1xuICAgIGNvbnN0IG4gPSBaZS5vYmplY3RLZXlzKGUpLCBpID0gWmUub2JqZWN0S2V5cyhzKS5maWx0ZXIoKGEpID0+IG4uaW5kZXhPZihhKSAhPT0gLTEpLCBvID0geyAuLi5zLCAuLi5lIH07XG4gICAgZm9yIChjb25zdCBhIG9mIGkpIHtcbiAgICAgIGNvbnN0IGwgPSB6bChzW2FdLCBlW2FdKTtcbiAgICAgIGlmICghbC52YWxpZClcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6ICExIH07XG4gICAgICBvW2FdID0gbC5kYXRhO1xuICAgIH1cbiAgICByZXR1cm4geyB2YWxpZDogITAsIGRhdGE6IG8gfTtcbiAgfSBlbHNlIGlmICh0ID09PSBtZS5hcnJheSAmJiByID09PSBtZS5hcnJheSkge1xuICAgIGlmIChzLmxlbmd0aCAhPT0gZS5sZW5ndGgpXG4gICAgICByZXR1cm4geyB2YWxpZDogITEgfTtcbiAgICBjb25zdCBuID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvID0gc1tpXSwgYSA9IGVbaV0sIGwgPSB6bChvLCBhKTtcbiAgICAgIGlmICghbC52YWxpZClcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6ICExIH07XG4gICAgICBuLnB1c2gobC5kYXRhKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgdmFsaWQ6ICEwLCBkYXRhOiBuIH07XG4gIH0gZWxzZSByZXR1cm4gdCA9PT0gbWUuZGF0ZSAmJiByID09PSBtZS5kYXRlICYmICtzID09ICtlID8geyB2YWxpZDogITAsIGRhdGE6IHMgfSA6IHsgdmFsaWQ6ICExIH07XG59XG5jbGFzcyBBbyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB7IHN0YXR1czogdCwgY3R4OiByIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSksIG4gPSAoaSwgbykgPT4ge1xuICAgICAgaWYgKFp1KGkpIHx8IFp1KG8pKVxuICAgICAgICByZXR1cm4gUmU7XG4gICAgICBjb25zdCBhID0gemwoaS52YWx1ZSwgby52YWx1ZSk7XG4gICAgICByZXR1cm4gYS52YWxpZCA/ICgoWHUoaSkgfHwgWHUobykpICYmIHQuZGlydHkoKSwgeyBzdGF0dXM6IHQudmFsdWUsIHZhbHVlOiBhLmRhdGEgfSkgOiAoaGUociwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlc1xuICAgICAgfSksIFJlKTtcbiAgICB9O1xuICAgIHJldHVybiByLmNvbW1vbi5hc3luYyA/IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZUFzeW5jKHtcbiAgICAgICAgZGF0YTogci5kYXRhLFxuICAgICAgICBwYXRoOiByLnBhdGgsXG4gICAgICAgIHBhcmVudDogclxuICAgICAgfSksXG4gICAgICB0aGlzLl9kZWYucmlnaHQuX3BhcnNlQXN5bmMoe1xuICAgICAgICBkYXRhOiByLmRhdGEsXG4gICAgICAgIHBhdGg6IHIucGF0aCxcbiAgICAgICAgcGFyZW50OiByXG4gICAgICB9KVxuICAgIF0pLnRoZW4oKFtpLCBvXSkgPT4gbihpLCBvKSkgOiBuKHRoaXMuX2RlZi5sZWZ0Ll9wYXJzZVN5bmMoe1xuICAgICAgZGF0YTogci5kYXRhLFxuICAgICAgcGF0aDogci5wYXRoLFxuICAgICAgcGFyZW50OiByXG4gICAgfSksIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VTeW5jKHtcbiAgICAgIGRhdGE6IHIuZGF0YSxcbiAgICAgIHBhdGg6IHIucGF0aCxcbiAgICAgIHBhcmVudDogclxuICAgIH0pKTtcbiAgfVxufVxuQW8uY3JlYXRlID0gKHMsIGUsIHQpID0+IG5ldyBBbyh7XG4gIGxlZnQ6IHMsXG4gIHJpZ2h0OiBlLFxuICB0eXBlTmFtZToga2UuWm9kSW50ZXJzZWN0aW9uLFxuICAuLi5WZSh0KVxufSk7XG5jbGFzcyBXcyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB7IHN0YXR1czogdCwgY3R4OiByIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7XG4gICAgaWYgKHIucGFyc2VkVHlwZSAhPT0gbWUuYXJyYXkpXG4gICAgICByZXR1cm4gaGUociwge1xuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgIGV4cGVjdGVkOiBtZS5hcnJheSxcbiAgICAgICAgcmVjZWl2ZWQ6IHIucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIGlmIChyLmRhdGEubGVuZ3RoIDwgdGhpcy5fZGVmLml0ZW1zLmxlbmd0aClcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLnRvb19zbWFsbCxcbiAgICAgICAgbWluaW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgICAgZXhhY3Q6ICExLFxuICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgIH0pLCBSZTtcbiAgICAhdGhpcy5fZGVmLnJlc3QgJiYgci5kYXRhLmxlbmd0aCA+IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGggJiYgKGhlKHIsIHtcbiAgICAgIGNvZGU6IGFlLnRvb19iaWcsXG4gICAgICBtYXhpbXVtOiB0aGlzLl9kZWYuaXRlbXMubGVuZ3RoLFxuICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgIGV4YWN0OiAhMSxcbiAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgIH0pLCB0LmRpcnR5KCkpO1xuICAgIGNvbnN0IGkgPSBbLi4uci5kYXRhXS5tYXAoKG8sIGEpID0+IHtcbiAgICAgIGNvbnN0IGwgPSB0aGlzLl9kZWYuaXRlbXNbYV0gfHwgdGhpcy5fZGVmLnJlc3Q7XG4gICAgICByZXR1cm4gbCA/IGwuX3BhcnNlKG5ldyBEcyhyLCBvLCByLnBhdGgsIGEpKSA6IG51bGw7XG4gICAgfSkuZmlsdGVyKChvKSA9PiAhIW8pO1xuICAgIHJldHVybiByLmNvbW1vbi5hc3luYyA/IFByb21pc2UuYWxsKGkpLnRoZW4oKG8pID0+IHdyLm1lcmdlQXJyYXkodCwgbykpIDogd3IubWVyZ2VBcnJheSh0LCBpKTtcbiAgfVxuICBnZXQgaXRlbXMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5pdGVtcztcbiAgfVxuICByZXN0KGUpIHtcbiAgICByZXR1cm4gbmV3IFdzKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIHJlc3Q6IGVcbiAgICB9KTtcbiAgfVxufVxuV3MuY3JlYXRlID0gKHMsIGUpID0+IHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHMpKVxuICAgIHRocm93IG5ldyBFcnJvcihcIllvdSBtdXN0IHBhc3MgYW4gYXJyYXkgb2Ygc2NoZW1hcyB0byB6LnR1cGxlKFsgLi4uIF0pXCIpO1xuICByZXR1cm4gbmV3IFdzKHtcbiAgICBpdGVtczogcyxcbiAgICB0eXBlTmFtZToga2UuWm9kVHVwbGUsXG4gICAgcmVzdDogbnVsbCxcbiAgICAuLi5WZShlKVxuICB9KTtcbn07XG5jbGFzcyBzZCBleHRlbmRzIFllIHtcbiAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLmtleVR5cGU7XG4gIH1cbiAgZ2V0IHZhbHVlU2NoZW1hKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICB9XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgeyBzdGF0dXM6IHQsIGN0eDogciB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO1xuICAgIGlmIChyLnBhcnNlZFR5cGUgIT09IG1lLm1hcClcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLm1hcCxcbiAgICAgICAgcmVjZWl2ZWQ6IHIucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIGNvbnN0IG4gPSB0aGlzLl9kZWYua2V5VHlwZSwgaSA9IHRoaXMuX2RlZi52YWx1ZVR5cGUsIG8gPSBbLi4uci5kYXRhLmVudHJpZXMoKV0ubWFwKChbYSwgbF0sIGMpID0+ICh7XG4gICAgICBrZXk6IG4uX3BhcnNlKG5ldyBEcyhyLCBhLCByLnBhdGgsIFtjLCBcImtleVwiXSkpLFxuICAgICAgdmFsdWU6IGkuX3BhcnNlKG5ldyBEcyhyLCBsLCByLnBhdGgsIFtjLCBcInZhbHVlXCJdKSlcbiAgICB9KSk7XG4gICAgaWYgKHIuY29tbW9uLmFzeW5jKSB7XG4gICAgICBjb25zdCBhID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBsIG9mIG8pIHtcbiAgICAgICAgICBjb25zdCBjID0gYXdhaXQgbC5rZXksIHUgPSBhd2FpdCBsLnZhbHVlO1xuICAgICAgICAgIGlmIChjLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIgfHwgdS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgcmV0dXJuIFJlO1xuICAgICAgICAgIChjLnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHUuc3RhdHVzID09PSBcImRpcnR5XCIpICYmIHQuZGlydHkoKSwgYS5zZXQoYy52YWx1ZSwgdS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiB0LnZhbHVlLCB2YWx1ZTogYSB9O1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGEgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgZm9yIChjb25zdCBsIG9mIG8pIHtcbiAgICAgICAgY29uc3QgYyA9IGwua2V5LCB1ID0gbC52YWx1ZTtcbiAgICAgICAgaWYgKGMuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB1LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgcmV0dXJuIFJlO1xuICAgICAgICAoYy5zdGF0dXMgPT09IFwiZGlydHlcIiB8fCB1LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSAmJiB0LmRpcnR5KCksIGEuc2V0KGMudmFsdWUsIHUudmFsdWUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgc3RhdHVzOiB0LnZhbHVlLCB2YWx1ZTogYSB9O1xuICAgIH1cbiAgfVxufVxuc2QuY3JlYXRlID0gKHMsIGUsIHQpID0+IG5ldyBzZCh7XG4gIHZhbHVlVHlwZTogZSxcbiAga2V5VHlwZTogcyxcbiAgdHlwZU5hbWU6IGtlLlpvZE1hcCxcbiAgLi4uVmUodClcbn0pO1xuY2xhc3MgUW4gZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgeyBzdGF0dXM6IHQsIGN0eDogciB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpO1xuICAgIGlmIChyLnBhcnNlZFR5cGUgIT09IG1lLnNldClcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLnNldCxcbiAgICAgICAgcmVjZWl2ZWQ6IHIucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIGNvbnN0IG4gPSB0aGlzLl9kZWY7XG4gICAgbi5taW5TaXplICE9PSBudWxsICYmIHIuZGF0YS5zaXplIDwgbi5taW5TaXplLnZhbHVlICYmIChoZShyLCB7XG4gICAgICBjb2RlOiBhZS50b29fc21hbGwsXG4gICAgICBtaW5pbXVtOiBuLm1pblNpemUudmFsdWUsXG4gICAgICB0eXBlOiBcInNldFwiLFxuICAgICAgaW5jbHVzaXZlOiAhMCxcbiAgICAgIGV4YWN0OiAhMSxcbiAgICAgIG1lc3NhZ2U6IG4ubWluU2l6ZS5tZXNzYWdlXG4gICAgfSksIHQuZGlydHkoKSksIG4ubWF4U2l6ZSAhPT0gbnVsbCAmJiByLmRhdGEuc2l6ZSA+IG4ubWF4U2l6ZS52YWx1ZSAmJiAoaGUociwge1xuICAgICAgY29kZTogYWUudG9vX2JpZyxcbiAgICAgIG1heGltdW06IG4ubWF4U2l6ZS52YWx1ZSxcbiAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICBpbmNsdXNpdmU6ICEwLFxuICAgICAgZXhhY3Q6ICExLFxuICAgICAgbWVzc2FnZTogbi5tYXhTaXplLm1lc3NhZ2VcbiAgICB9KSwgdC5kaXJ0eSgpKTtcbiAgICBjb25zdCBpID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICBmdW5jdGlvbiBvKGwpIHtcbiAgICAgIGNvbnN0IGMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgICAgZm9yIChjb25zdCB1IG9mIGwpIHtcbiAgICAgICAgaWYgKHUuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICByZXR1cm4gUmU7XG4gICAgICAgIHUuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgdC5kaXJ0eSgpLCBjLmFkZCh1LnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHN0YXR1czogdC52YWx1ZSwgdmFsdWU6IGMgfTtcbiAgICB9XG4gICAgY29uc3QgYSA9IFsuLi5yLmRhdGEudmFsdWVzKCldLm1hcCgobCwgYykgPT4gaS5fcGFyc2UobmV3IERzKHIsIGwsIHIucGF0aCwgYykpKTtcbiAgICByZXR1cm4gci5jb21tb24uYXN5bmMgPyBQcm9taXNlLmFsbChhKS50aGVuKChsKSA9PiBvKGwpKSA6IG8oYSk7XG4gIH1cbiAgbWluKGUsIHQpIHtcbiAgICByZXR1cm4gbmV3IFFuKHtcbiAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgIG1pblNpemU6IHsgdmFsdWU6IGUsIG1lc3NhZ2U6IEVlLnRvU3RyaW5nKHQpIH1cbiAgICB9KTtcbiAgfVxuICBtYXgoZSwgdCkge1xuICAgIHJldHVybiBuZXcgUW4oe1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgbWF4U2l6ZTogeyB2YWx1ZTogZSwgbWVzc2FnZTogRWUudG9TdHJpbmcodCkgfVxuICAgIH0pO1xuICB9XG4gIHNpemUoZSwgdCkge1xuICAgIHJldHVybiB0aGlzLm1pbihlLCB0KS5tYXgoZSwgdCk7XG4gIH1cbiAgbm9uZW1wdHkoZSkge1xuICAgIHJldHVybiB0aGlzLm1pbigxLCBlKTtcbiAgfVxufVxuUW4uY3JlYXRlID0gKHMsIGUpID0+IG5ldyBRbih7XG4gIHZhbHVlVHlwZTogcyxcbiAgbWluU2l6ZTogbnVsbCxcbiAgbWF4U2l6ZTogbnVsbCxcbiAgdHlwZU5hbWU6IGtlLlpvZFNldCxcbiAgLi4uVmUoZSlcbn0pO1xuY2xhc3MgWWwgZXh0ZW5kcyBZZSB7XG4gIGdldCBzY2hlbWEoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKTtcbiAgfVxuICBfcGFyc2UoZSkge1xuICAgIGNvbnN0IHsgY3R4OiB0IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKS5fcGFyc2UoeyBkYXRhOiB0LmRhdGEsIHBhdGg6IHQucGF0aCwgcGFyZW50OiB0IH0pO1xuICB9XG59XG5ZbC5jcmVhdGUgPSAocywgZSkgPT4gbmV3IFlsKHtcbiAgZ2V0dGVyOiBzLFxuICB0eXBlTmFtZToga2UuWm9kTGF6eSxcbiAgLi4uVmUoZSlcbn0pO1xuY2xhc3MgSW8gZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgaWYgKGUuZGF0YSAhPT0gdGhpcy5fZGVmLnZhbHVlKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSk7XG4gICAgICByZXR1cm4gaGUodCwge1xuICAgICAgICByZWNlaXZlZDogdC5kYXRhLFxuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX2xpdGVyYWwsXG4gICAgICAgIGV4cGVjdGVkOiB0aGlzLl9kZWYudmFsdWVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBlLmRhdGEgfTtcbiAgfVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZTtcbiAgfVxufVxuSW8uY3JlYXRlID0gKHMsIGUpID0+IG5ldyBJbyh7XG4gIHZhbHVlOiBzLFxuICB0eXBlTmFtZToga2UuWm9kTGl0ZXJhbCxcbiAgLi4uVmUoZSlcbn0pO1xuZnVuY3Rpb24gTmYocywgZSkge1xuICByZXR1cm4gbmV3IHpzKHtcbiAgICB2YWx1ZXM6IHMsXG4gICAgdHlwZU5hbWU6IGtlLlpvZEVudW0sXG4gICAgLi4uVmUoZSlcbiAgfSk7XG59XG5jbGFzcyB6cyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBpZiAodHlwZW9mIGUuZGF0YSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoZSksIHIgPSB0aGlzLl9kZWYudmFsdWVzO1xuICAgICAgcmV0dXJuIGhlKHQsIHtcbiAgICAgICAgZXhwZWN0ZWQ6IFplLmpvaW5WYWx1ZXMociksXG4gICAgICAgIHJlY2VpdmVkOiB0LnBhcnNlZFR5cGUsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICBpZiAodGhpcy5fY2FjaGUgfHwgKHRoaXMuX2NhY2hlID0gbmV3IFNldCh0aGlzLl9kZWYudmFsdWVzKSksICF0aGlzLl9jYWNoZS5oYXMoZS5kYXRhKSkge1xuICAgICAgY29uc3QgdCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpLCByID0gdGhpcy5fZGVmLnZhbHVlcztcbiAgICAgIHJldHVybiBoZSh0LCB7XG4gICAgICAgIHJlY2VpdmVkOiB0LmRhdGEsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgb3B0aW9uczogclxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICByZXR1cm4gUnIoZS5kYXRhKTtcbiAgfVxuICBnZXQgb3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgfVxuICBnZXQgZW51bSgpIHtcbiAgICBjb25zdCBlID0ge307XG4gICAgZm9yIChjb25zdCB0IG9mIHRoaXMuX2RlZi52YWx1ZXMpXG4gICAgICBlW3RdID0gdDtcbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXQgVmFsdWVzKCkge1xuICAgIGNvbnN0IGUgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fZGVmLnZhbHVlcylcbiAgICAgIGVbdF0gPSB0O1xuICAgIHJldHVybiBlO1xuICB9XG4gIGdldCBFbnVtKCkge1xuICAgIGNvbnN0IGUgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5fZGVmLnZhbHVlcylcbiAgICAgIGVbdF0gPSB0O1xuICAgIHJldHVybiBlO1xuICB9XG4gIGV4dHJhY3QoZSwgdCA9IHRoaXMuX2RlZikge1xuICAgIHJldHVybiB6cy5jcmVhdGUoZSwge1xuICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgLi4udFxuICAgIH0pO1xuICB9XG4gIGV4Y2x1ZGUoZSwgdCA9IHRoaXMuX2RlZikge1xuICAgIHJldHVybiB6cy5jcmVhdGUodGhpcy5vcHRpb25zLmZpbHRlcigocikgPT4gIWUuaW5jbHVkZXMocikpLCB7XG4gICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAuLi50XG4gICAgfSk7XG4gIH1cbn1cbnpzLmNyZWF0ZSA9IE5mO1xuY2xhc3MgWmwgZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgdCA9IFplLmdldFZhbGlkRW51bVZhbHVlcyh0aGlzLl9kZWYudmFsdWVzKSwgciA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGUpO1xuICAgIGlmIChyLnBhcnNlZFR5cGUgIT09IG1lLnN0cmluZyAmJiByLnBhcnNlZFR5cGUgIT09IG1lLm51bWJlcikge1xuICAgICAgY29uc3QgbiA9IFplLm9iamVjdFZhbHVlcyh0KTtcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGV4cGVjdGVkOiBaZS5qb2luVmFsdWVzKG4pLFxuICAgICAgICByZWNlaXZlZDogci5wYXJzZWRUeXBlLFxuICAgICAgICBjb2RlOiBhZS5pbnZhbGlkX3R5cGVcbiAgICAgIH0pLCBSZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuX2NhY2hlIHx8ICh0aGlzLl9jYWNoZSA9IG5ldyBTZXQoWmUuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKSksICF0aGlzLl9jYWNoZS5oYXMoZS5kYXRhKSkge1xuICAgICAgY29uc3QgbiA9IFplLm9iamVjdFZhbHVlcyh0KTtcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIHJlY2VpdmVkOiByLmRhdGEsXG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfZW51bV92YWx1ZSxcbiAgICAgICAgb3B0aW9uczogblxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICByZXR1cm4gUnIoZS5kYXRhKTtcbiAgfVxuICBnZXQgZW51bSgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgfVxufVxuWmwuY3JlYXRlID0gKHMsIGUpID0+IG5ldyBabCh7XG4gIHZhbHVlczogcyxcbiAgdHlwZU5hbWU6IGtlLlpvZE5hdGl2ZUVudW0sXG4gIC4uLlZlKGUpXG59KTtcbmNsYXNzIF9vIGV4dGVuZHMgWWUge1xuICB1bndyYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICB9XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgeyBjdHg6IHQgfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKTtcbiAgICBpZiAodC5wYXJzZWRUeXBlICE9PSBtZS5wcm9taXNlICYmIHQuY29tbW9uLmFzeW5jID09PSAhMSlcbiAgICAgIHJldHVybiBoZSh0LCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLnByb21pc2UsXG4gICAgICAgIHJlY2VpdmVkOiB0LnBhcnNlZFR5cGVcbiAgICAgIH0pLCBSZTtcbiAgICBjb25zdCByID0gdC5wYXJzZWRUeXBlID09PSBtZS5wcm9taXNlID8gdC5kYXRhIDogUHJvbWlzZS5yZXNvbHZlKHQuZGF0YSk7XG4gICAgcmV0dXJuIFJyKHIudGhlbigobikgPT4gdGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhuLCB7XG4gICAgICBwYXRoOiB0LnBhdGgsXG4gICAgICBlcnJvck1hcDogdC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwXG4gICAgfSkpKTtcbiAgfVxufVxuX28uY3JlYXRlID0gKHMsIGUpID0+IG5ldyBfbyh7XG4gIHR5cGU6IHMsXG4gIHR5cGVOYW1lOiBrZS5ab2RQcm9taXNlLFxuICAuLi5WZShlKVxufSk7XG5jbGFzcyBZcyBleHRlbmRzIFllIHtcbiAgaW5uZXJUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hO1xuICB9XG4gIHNvdXJjZVR5cGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0ga2UuWm9kRWZmZWN0cyA/IHRoaXMuX2RlZi5zY2hlbWEuc291cmNlVHlwZSgpIDogdGhpcy5fZGVmLnNjaGVtYTtcbiAgfVxuICBfcGFyc2UoZSkge1xuICAgIGNvbnN0IHsgc3RhdHVzOiB0LCBjdHg6IHIgfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSwgbiA9IHRoaXMuX2RlZi5lZmZlY3QgfHwgbnVsbCwgaSA9IHtcbiAgICAgIGFkZElzc3VlOiAobykgPT4ge1xuICAgICAgICBoZShyLCBvKSwgby5mYXRhbCA/IHQuYWJvcnQoKSA6IHQuZGlydHkoKTtcbiAgICAgIH0sXG4gICAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHIucGF0aDtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpLmFkZElzc3VlID0gaS5hZGRJc3N1ZS5iaW5kKGkpLCBuLnR5cGUgPT09IFwicHJlcHJvY2Vzc1wiKSB7XG4gICAgICBjb25zdCBvID0gbi50cmFuc2Zvcm0oci5kYXRhLCBpKTtcbiAgICAgIGlmIChyLmNvbW1vbi5hc3luYylcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShvKS50aGVuKGFzeW5jIChhKSA9PiB7XG4gICAgICAgICAgaWYgKHQudmFsdWUgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgcmV0dXJuIFJlO1xuICAgICAgICAgIGNvbnN0IGwgPSBhd2FpdCB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgIGRhdGE6IGEsXG4gICAgICAgICAgICBwYXRoOiByLnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IHJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiID8gUmUgOiBsLnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHQudmFsdWUgPT09IFwiZGlydHlcIiA/IFduKGwudmFsdWUpIDogbDtcbiAgICAgICAgfSk7XG4gICAgICB7XG4gICAgICAgIGlmICh0LnZhbHVlID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICByZXR1cm4gUmU7XG4gICAgICAgIGNvbnN0IGEgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgIGRhdGE6IG8sXG4gICAgICAgICAgcGF0aDogci5wYXRoLFxuICAgICAgICAgIHBhcmVudDogclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGEuc3RhdHVzID09PSBcImFib3J0ZWRcIiA/IFJlIDogYS5zdGF0dXMgPT09IFwiZGlydHlcIiB8fCB0LnZhbHVlID09PSBcImRpcnR5XCIgPyBXbihhLnZhbHVlKSA6IGE7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuLnR5cGUgPT09IFwicmVmaW5lbWVudFwiKSB7XG4gICAgICBjb25zdCBvID0gKGEpID0+IHtcbiAgICAgICAgY29uc3QgbCA9IG4ucmVmaW5lbWVudChhLCBpKTtcbiAgICAgICAgaWYgKHIuY29tbW9uLmFzeW5jKVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobCk7XG4gICAgICAgIGlmIChsIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3luYyByZWZpbmVtZW50IGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLlwiKTtcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgICB9O1xuICAgICAgaWYgKHIuY29tbW9uLmFzeW5jID09PSAhMSkge1xuICAgICAgICBjb25zdCBhID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtcbiAgICAgICAgICBkYXRhOiByLmRhdGEsXG4gICAgICAgICAgcGF0aDogci5wYXRoLFxuICAgICAgICAgIHBhcmVudDogclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGEuc3RhdHVzID09PSBcImFib3J0ZWRcIiA/IFJlIDogKGEuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgdC5kaXJ0eSgpLCBvKGEudmFsdWUpLCB7IHN0YXR1czogdC52YWx1ZSwgdmFsdWU6IGEudmFsdWUgfSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoeyBkYXRhOiByLmRhdGEsIHBhdGg6IHIucGF0aCwgcGFyZW50OiByIH0pLnRoZW4oKGEpID0+IGEuc3RhdHVzID09PSBcImFib3J0ZWRcIiA/IFJlIDogKGEuc3RhdHVzID09PSBcImRpcnR5XCIgJiYgdC5kaXJ0eSgpLCBvKGEudmFsdWUpLnRoZW4oKCkgPT4gKHsgc3RhdHVzOiB0LnZhbHVlLCB2YWx1ZTogYS52YWx1ZSB9KSkpKTtcbiAgICB9XG4gICAgaWYgKG4udHlwZSA9PT0gXCJ0cmFuc2Zvcm1cIilcbiAgICAgIGlmIChyLmNvbW1vbi5hc3luYyA9PT0gITEpIHtcbiAgICAgICAgY29uc3QgbyA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgZGF0YTogci5kYXRhLFxuICAgICAgICAgIHBhdGg6IHIucGF0aCxcbiAgICAgICAgICBwYXJlbnQ6IHJcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghTG4obykpXG4gICAgICAgICAgcmV0dXJuIFJlO1xuICAgICAgICBjb25zdCBhID0gbi50cmFuc2Zvcm0oby52YWx1ZSwgaSk7XG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBc3luY2hyb25vdXMgdHJhbnNmb3JtIGVuY291bnRlcmVkIGR1cmluZyBzeW5jaHJvbm91cyBwYXJzZSBvcGVyYXRpb24uIFVzZSAucGFyc2VBc3luYyBpbnN0ZWFkLlwiKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiB0LnZhbHVlLCB2YWx1ZTogYSB9O1xuICAgICAgfSBlbHNlXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHsgZGF0YTogci5kYXRhLCBwYXRoOiByLnBhdGgsIHBhcmVudDogciB9KS50aGVuKChvKSA9PiBMbihvKSA/IFByb21pc2UucmVzb2x2ZShuLnRyYW5zZm9ybShvLnZhbHVlLCBpKSkudGhlbigoYSkgPT4gKHtcbiAgICAgICAgICBzdGF0dXM6IHQudmFsdWUsXG4gICAgICAgICAgdmFsdWU6IGFcbiAgICAgICAgfSkpIDogUmUpO1xuICAgIFplLmFzc2VydE5ldmVyKG4pO1xuICB9XG59XG5Zcy5jcmVhdGUgPSAocywgZSwgdCkgPT4gbmV3IFlzKHtcbiAgc2NoZW1hOiBzLFxuICB0eXBlTmFtZToga2UuWm9kRWZmZWN0cyxcbiAgZWZmZWN0OiBlLFxuICAuLi5WZSh0KVxufSk7XG5Zcy5jcmVhdGVXaXRoUHJlcHJvY2VzcyA9IChzLCBlLCB0KSA9PiBuZXcgWXMoe1xuICBzY2hlbWE6IGUsXG4gIGVmZmVjdDogeyB0eXBlOiBcInByZXByb2Nlc3NcIiwgdHJhbnNmb3JtOiBzIH0sXG4gIHR5cGVOYW1lOiBrZS5ab2RFZmZlY3RzLFxuICAuLi5WZSh0KVxufSk7XG5jbGFzcyBmcyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VHlwZShlKSA9PT0gbWUudW5kZWZpbmVkID8gUnIodm9pZCAwKSA6IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpO1xuICB9XG4gIHVud3JhcCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgfVxufVxuZnMuY3JlYXRlID0gKHMsIGUpID0+IG5ldyBmcyh7XG4gIGlubmVyVHlwZTogcyxcbiAgdHlwZU5hbWU6IGtlLlpvZE9wdGlvbmFsLFxuICAuLi5WZShlKVxufSk7XG5jbGFzcyBacyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0VHlwZShlKSA9PT0gbWUubnVsbCA/IFJyKG51bGwpIDogdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2UoZSk7XG4gIH1cbiAgdW53cmFwKCkge1xuICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICB9XG59XG5acy5jcmVhdGUgPSAocywgZSkgPT4gbmV3IFpzKHtcbiAgaW5uZXJUeXBlOiBzLFxuICB0eXBlTmFtZToga2UuWm9kTnVsbGFibGUsXG4gIC4uLlZlKGUpXG59KTtcbmNsYXNzIFJvIGV4dGVuZHMgWWUge1xuICBfcGFyc2UoZSkge1xuICAgIGNvbnN0IHsgY3R4OiB0IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7XG4gICAgbGV0IHIgPSB0LmRhdGE7XG4gICAgcmV0dXJuIHQucGFyc2VkVHlwZSA9PT0gbWUudW5kZWZpbmVkICYmIChyID0gdGhpcy5fZGVmLmRlZmF1bHRWYWx1ZSgpKSwgdGhpcy5fZGVmLmlubmVyVHlwZS5fcGFyc2Uoe1xuICAgICAgZGF0YTogcixcbiAgICAgIHBhdGg6IHQucGF0aCxcbiAgICAgIHBhcmVudDogdFxuICAgIH0pO1xuICB9XG4gIHJlbW92ZURlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gIH1cbn1cblJvLmNyZWF0ZSA9IChzLCBlKSA9PiBuZXcgUm8oe1xuICBpbm5lclR5cGU6IHMsXG4gIHR5cGVOYW1lOiBrZS5ab2REZWZhdWx0LFxuICBkZWZhdWx0VmFsdWU6IHR5cGVvZiBlLmRlZmF1bHQgPT0gXCJmdW5jdGlvblwiID8gZS5kZWZhdWx0IDogKCkgPT4gZS5kZWZhdWx0LFxuICAuLi5WZShlKVxufSk7XG5jbGFzcyBMbyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB7IGN0eDogdCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGUpLCByID0ge1xuICAgICAgLi4udCxcbiAgICAgIGNvbW1vbjoge1xuICAgICAgICAuLi50LmNvbW1vbixcbiAgICAgICAgaXNzdWVzOiBbXVxuICAgICAgfVxuICAgIH0sIG4gPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7XG4gICAgICBkYXRhOiByLmRhdGEsXG4gICAgICBwYXRoOiByLnBhdGgsXG4gICAgICBwYXJlbnQ6IHtcbiAgICAgICAgLi4uclxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBibyhuKSA/IG4udGhlbigoaSkgPT4gKHtcbiAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgdmFsdWU6IGkuc3RhdHVzID09PSBcInZhbGlkXCIgPyBpLnZhbHVlIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBwcyhyLmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dDogci5kYXRhXG4gICAgICB9KVxuICAgIH0pKSA6IHtcbiAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgdmFsdWU6IG4uc3RhdHVzID09PSBcInZhbGlkXCIgPyBuLnZhbHVlIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBwcyhyLmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICB9LFxuICAgICAgICBpbnB1dDogci5kYXRhXG4gICAgICB9KVxuICAgIH07XG4gIH1cbiAgcmVtb3ZlQ2F0Y2goKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gIH1cbn1cbkxvLmNyZWF0ZSA9IChzLCBlKSA9PiBuZXcgTG8oe1xuICBpbm5lclR5cGU6IHMsXG4gIHR5cGVOYW1lOiBrZS5ab2RDYXRjaCxcbiAgY2F0Y2hWYWx1ZTogdHlwZW9mIGUuY2F0Y2ggPT0gXCJmdW5jdGlvblwiID8gZS5jYXRjaCA6ICgpID0+IGUuY2F0Y2gsXG4gIC4uLlZlKGUpXG59KTtcbmNsYXNzIG5kIGV4dGVuZHMgWWUge1xuICBfcGFyc2UoZSkge1xuICAgIGlmICh0aGlzLl9nZXRUeXBlKGUpICE9PSBtZS5uYW4pIHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLl9nZXRPclJldHVybkN0eChlKTtcbiAgICAgIHJldHVybiBoZShyLCB7XG4gICAgICAgIGNvZGU6IGFlLmludmFsaWRfdHlwZSxcbiAgICAgICAgZXhwZWN0ZWQ6IG1lLm5hbixcbiAgICAgICAgcmVjZWl2ZWQ6IHIucGFyc2VkVHlwZVxuICAgICAgfSksIFJlO1xuICAgIH1cbiAgICByZXR1cm4geyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGUuZGF0YSB9O1xuICB9XG59XG5uZC5jcmVhdGUgPSAocykgPT4gbmV3IG5kKHtcbiAgdHlwZU5hbWU6IGtlLlpvZE5hTixcbiAgLi4uVmUocylcbn0pO1xuY2xhc3MgVWYgZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgeyBjdHg6IHQgfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhlKSwgciA9IHQuZGF0YTtcbiAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUuX3BhcnNlKHtcbiAgICAgIGRhdGE6IHIsXG4gICAgICBwYXRoOiB0LnBhdGgsXG4gICAgICBwYXJlbnQ6IHRcbiAgICB9KTtcbiAgfVxuICB1bndyYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICB9XG59XG5jbGFzcyAkYyBleHRlbmRzIFllIHtcbiAgX3BhcnNlKGUpIHtcbiAgICBjb25zdCB7IHN0YXR1czogdCwgY3R4OiByIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoZSk7XG4gICAgaWYgKHIuY29tbW9uLmFzeW5jKVxuICAgICAgcmV0dXJuIChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGkgPSBhd2FpdCB0aGlzLl9kZWYuaW4uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgIGRhdGE6IHIuZGF0YSxcbiAgICAgICAgICBwYXRoOiByLnBhdGgsXG4gICAgICAgICAgcGFyZW50OiByXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiID8gUmUgOiBpLnN0YXR1cyA9PT0gXCJkaXJ0eVwiID8gKHQuZGlydHkoKSwgV24oaS52YWx1ZSkpIDogdGhpcy5fZGVmLm91dC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgZGF0YTogaS52YWx1ZSxcbiAgICAgICAgICBwYXRoOiByLnBhdGgsXG4gICAgICAgICAgcGFyZW50OiByXG4gICAgICAgIH0pO1xuICAgICAgfSkoKTtcbiAgICB7XG4gICAgICBjb25zdCBuID0gdGhpcy5fZGVmLmluLl9wYXJzZVN5bmMoe1xuICAgICAgICBkYXRhOiByLmRhdGEsXG4gICAgICAgIHBhdGg6IHIucGF0aCxcbiAgICAgICAgcGFyZW50OiByXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIgPyBSZSA6IG4uc3RhdHVzID09PSBcImRpcnR5XCIgPyAodC5kaXJ0eSgpLCB7XG4gICAgICAgIHN0YXR1czogXCJkaXJ0eVwiLFxuICAgICAgICB2YWx1ZTogbi52YWx1ZVxuICAgICAgfSkgOiB0aGlzLl9kZWYub3V0Ll9wYXJzZVN5bmMoe1xuICAgICAgICBkYXRhOiBuLnZhbHVlLFxuICAgICAgICBwYXRoOiByLnBhdGgsXG4gICAgICAgIHBhcmVudDogclxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyBjcmVhdGUoZSwgdCkge1xuICAgIHJldHVybiBuZXcgJGMoe1xuICAgICAgaW46IGUsXG4gICAgICBvdXQ6IHQsXG4gICAgICB0eXBlTmFtZToga2UuWm9kUGlwZWxpbmVcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgQ28gZXh0ZW5kcyBZZSB7XG4gIF9wYXJzZShlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGUpLCByID0gKG4pID0+IChMbihuKSAmJiAobi52YWx1ZSA9IE9iamVjdC5mcmVlemUobi52YWx1ZSkpLCBuKTtcbiAgICByZXR1cm4gYm8odCkgPyB0LnRoZW4oKG4pID0+IHIobikpIDogcih0KTtcbiAgfVxuICB1bndyYXAoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gIH1cbn1cbkNvLmNyZWF0ZSA9IChzLCBlKSA9PiBuZXcgQ28oe1xuICBpbm5lclR5cGU6IHMsXG4gIHR5cGVOYW1lOiBrZS5ab2RSZWFkb25seSxcbiAgLi4uVmUoZSlcbn0pO1xudmFyIGtlO1xuKGZ1bmN0aW9uKHMpIHtcbiAgcy5ab2RTdHJpbmcgPSBcIlpvZFN0cmluZ1wiLCBzLlpvZE51bWJlciA9IFwiWm9kTnVtYmVyXCIsIHMuWm9kTmFOID0gXCJab2ROYU5cIiwgcy5ab2RCaWdJbnQgPSBcIlpvZEJpZ0ludFwiLCBzLlpvZEJvb2xlYW4gPSBcIlpvZEJvb2xlYW5cIiwgcy5ab2REYXRlID0gXCJab2REYXRlXCIsIHMuWm9kU3ltYm9sID0gXCJab2RTeW1ib2xcIiwgcy5ab2RVbmRlZmluZWQgPSBcIlpvZFVuZGVmaW5lZFwiLCBzLlpvZE51bGwgPSBcIlpvZE51bGxcIiwgcy5ab2RBbnkgPSBcIlpvZEFueVwiLCBzLlpvZFVua25vd24gPSBcIlpvZFVua25vd25cIiwgcy5ab2ROZXZlciA9IFwiWm9kTmV2ZXJcIiwgcy5ab2RWb2lkID0gXCJab2RWb2lkXCIsIHMuWm9kQXJyYXkgPSBcIlpvZEFycmF5XCIsIHMuWm9kT2JqZWN0ID0gXCJab2RPYmplY3RcIiwgcy5ab2RVbmlvbiA9IFwiWm9kVW5pb25cIiwgcy5ab2REaXNjcmltaW5hdGVkVW5pb24gPSBcIlpvZERpc2NyaW1pbmF0ZWRVbmlvblwiLCBzLlpvZEludGVyc2VjdGlvbiA9IFwiWm9kSW50ZXJzZWN0aW9uXCIsIHMuWm9kVHVwbGUgPSBcIlpvZFR1cGxlXCIsIHMuWm9kUmVjb3JkID0gXCJab2RSZWNvcmRcIiwgcy5ab2RNYXAgPSBcIlpvZE1hcFwiLCBzLlpvZFNldCA9IFwiWm9kU2V0XCIsIHMuWm9kRnVuY3Rpb24gPSBcIlpvZEZ1bmN0aW9uXCIsIHMuWm9kTGF6eSA9IFwiWm9kTGF6eVwiLCBzLlpvZExpdGVyYWwgPSBcIlpvZExpdGVyYWxcIiwgcy5ab2RFbnVtID0gXCJab2RFbnVtXCIsIHMuWm9kRWZmZWN0cyA9IFwiWm9kRWZmZWN0c1wiLCBzLlpvZE5hdGl2ZUVudW0gPSBcIlpvZE5hdGl2ZUVudW1cIiwgcy5ab2RPcHRpb25hbCA9IFwiWm9kT3B0aW9uYWxcIiwgcy5ab2ROdWxsYWJsZSA9IFwiWm9kTnVsbGFibGVcIiwgcy5ab2REZWZhdWx0ID0gXCJab2REZWZhdWx0XCIsIHMuWm9kQ2F0Y2ggPSBcIlpvZENhdGNoXCIsIHMuWm9kUHJvbWlzZSA9IFwiWm9kUHJvbWlzZVwiLCBzLlpvZEJyYW5kZWQgPSBcIlpvZEJyYW5kZWRcIiwgcy5ab2RQaXBlbGluZSA9IFwiWm9kUGlwZWxpbmVcIiwgcy5ab2RSZWFkb25seSA9IFwiWm9kUmVhZG9ubHlcIjtcbn0pKGtlIHx8IChrZSA9IHt9KSk7XG5jb25zdCB4dCA9IFJzLmNyZWF0ZSwgJGYgPSBDbi5jcmVhdGUsIFFtID0gSGwuY3JlYXRlO1xuUHMuY3JlYXRlO1xuY29uc3QgS3MgPSBZci5jcmVhdGUsIEp0ID0gJHQuY3JlYXRlLCBrbyA9IHdvLmNyZWF0ZSwgR2YgPSBVYy5jcmVhdGU7XG5Bby5jcmVhdGU7XG5Xcy5jcmVhdGU7XG5jb25zdCBpciA9IElvLmNyZWF0ZSwgR2MgPSB6cy5jcmVhdGU7XG5fby5jcmVhdGU7XG5mcy5jcmVhdGU7XG5acy5jcmVhdGU7XG5jb25zdCBlMSA9IC9bQCMkJV4mKis9L1xcXFx8fsKrwrtdLywgdDEgPSAvKCF7Mix9fFxcP3syLH18LXsyLH0pLywgcjEgPSAvW1xcdXsxRjMwMH0tXFx1ezFGOUZGfV18W1xcdXsyNzAyfS1cXHV7MjdCMH1dfFtcXHV7MjYwMH0tXFx1ezI2RkZ9XXxbXFx1ezJCMDB9LVxcdXsyQkZGfV0vdSwgJG4gPSAoeyBtYXg6IHMsIG5vU3BhY2VzOiBlIH0gPSB7fSkgPT4gKGUgPyB4dCgpLm1heChzID8/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkucmVnZXgoL15cXFMqJC8sIFwiU3BhY2VzIGFyZSBub3QgYWxsb3dlZFwiKSA6IHh0KCkubWF4KHMgPz8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSkucmVmaW5lKChyKSA9PiAhcjEudGVzdChyKSwge1xuICBtZXNzYWdlOiBcIkVtb2ppcyBhbmQgc3ltYm9scyBhcmUgbm90IGFsbG93ZWRcIlxufSkucmVmaW5lKChyKSA9PiAhZTEudGVzdChyKSwge1xuICBtZXNzYWdlOiBcIlNwZWNpYWwgY2hhcmFjdGVycyAoQCwgIywgJCwgJSwgXiwgJiwgKiwgKywgPSwgLywgXFxcXCwgfCwgfiwgwqssIMK7KSBhcmUgbm90IGFsbG93ZWRcIlxufSkucmVmaW5lKChyKSA9PiAhdDEudGVzdChyKSwge1xuICBtZXNzYWdlOiBcIlJlcGVhdGVkIHB1bmN0dWF0aW9ucyAoISEsID8/LCAtLSkgYXJlIG5vdCBhbGxvd2VkXCJcbn0pLCBvciA9IHh0KCkudXJsKCkuc3RhcnRzV2l0aChcImh0dHBzOi8vXCIsIHsgbWVzc2FnZTogXCJNdXN0IGJlIGFuIGh0dHBzIHVybFwiIH0pLm1heCgxMDI0KS5yZWZpbmUoKHMpID0+ICFzLmluY2x1ZGVzKFwiIFwiKSwge1xuICBtZXNzYWdlOiBcIlVSTCBtdXN0IG5vdCBjb250YWluIHNwYWNlc1wiXG59KS5yZWZpbmUoKHMpID0+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCBlID0gbmV3IFVSTChzKS5ob3N0bmFtZTtcbiAgICByZXR1cm4gIShlID09PSBcImxvY2FsaG9zdFwiIHx8IGUuZW5kc1dpdGgoXCIubG9jYWxob3N0XCIpIHx8IC9eKFxcZHsxLDN9XFwuKXszfVxcZHsxLDN9JC8udGVzdChlKSB8fCBlLnN0YXJ0c1dpdGgoXCJbXCIpICYmIGUuZW5kc1dpdGgoXCJdXCIpKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICExO1xuICB9XG59LCB7XG4gIG1lc3NhZ2U6IFwiVVJMIG11c3Qgbm90IHVzZSBJUCBhZGRyZXNzZXMgb3IgbG9jYWxob3N0XCJcbn0pLCBWYyA9IHh0KCkubWF4KDMyKSwgVmYgPSB4dCgpLm1heCgzMiksIHMxID0gL15bLWEtejAtOV17Myw4fTpbLV9hLXpBLVowLTldezEsMzJ9XFwvKD86Wy1hLXowLTldezMsOH06Wy0uJWEtekEtWjAtOV17MSwxMjh9KD86XFwvWy0uJWEtekEtWjAtOV17MSw3OH0pP3xuYXRpdmUpJC8sIG4xID0geHQoKS5yZWdleChzMSwgeyBtZXNzYWdlOiBcIkludmFsaWQgQ0FJUC0xOSBhc3NldCBJRFwiIH0pLCBqYyA9IHh0KCkucmVnZXgoL14jKFswLTlBLUZdezN9fFswLTlBLUZdezZ9KSQvaSwge1xuICBtZXNzYWdlOiBcIkludmFsaWQgaGV4IGNvbG9yIGNvZGUuIEl0IHNob3VsZCBiZSBpbiB0aGUgZm9ybWF0ICNSUkdHQkIgb3IgI1JHQi5cIlxufSksIGkxID0gL14oPyEuKlxcLlxcLikoW2EtekEtWjAtOV0oW2EtekEtWjAtOS1dKlthLXpBLVowLTldKT9cXC4pK1thLXpBLVpdezIsfSQvLCBvMSA9IHh0KCkubWF4KDEwMjQpLnJlZ2V4KGkxLCB7XG4gIG1lc3NhZ2U6IFwiTXVzdCBiZSBhIHZhbGlkIGRvbWFpbiBuYW1lIChlLmcuLCBleGFtcGxlLmNvbSwgc3ViLmV4YW1wbGUuY29tKVwiXG59KS5yZWZpbmUoKHMpID0+ICFzLmluY2x1ZGVzKFwiOi8vXCIpLCB7XG4gIG1lc3NhZ2U6IFwiRG9tYWluIG11c3Qgbm90IGluY2x1ZGUgcHJvdG9jb2wgKGh0dHA6Ly8sIGh0dHBzOi8vLCBldGMuKVwiXG59KS5yZWZpbmUoKHMpID0+ICFzLmluY2x1ZGVzKFwiL1wiKSwge1xuICBtZXNzYWdlOiBcIkRvbWFpbiBtdXN0IG5vdCBpbmNsdWRlIHBhdGggc2VwYXJhdG9yc1wiXG59KS5yZWZpbmUoKHMpID0+ICFzLmluY2x1ZGVzKFwiQFwiKSwge1xuICBtZXNzYWdlOiBcIkRvbWFpbiBtdXN0IG5vdCBpbmNsdWRlIEAgc3ltYm9sXCJcbn0pLnJlZmluZSgocykgPT4gIXMuaW5jbHVkZXMoXCI6XCIpLCB7XG4gIG1lc3NhZ2U6IFwiRG9tYWluIG11c3Qgbm90IGluY2x1ZGUgcG9ydCBudW1iZXJzXCJcbn0pLCBhMSA9IGtvKFtpcihcIjE6MVwiKSwgaXIoXCIzOjJcIildKSwgbDEgPSBKdCh7XG4gIGhlYWRlcjogeHQoKSxcbiAgcGF5bG9hZDogeHQoKSxcbiAgc2lnbmF0dXJlOiB4dCgpXG59KTtcbkp0KHtcbiAgZmlkOiAkZigpLFxuICB0eXBlOiBpcihcImFwcF9rZXlcIiksXG4gIGtleTogeHQoKS5zdGFydHNXaXRoKFwiMHhcIilcbn0pO1xuY29uc3QgYzEgPSBKdCh7XG4gIHR5cGU6IGlyKFwibGF1bmNoX2ZyYW1lXCIpLFxuICBuYW1lOiBWYyxcbiAgdXJsOiBvci5vcHRpb25hbCgpLFxuICBzcGxhc2hJbWFnZVVybDogb3Iub3B0aW9uYWwoKSxcbiAgc3BsYXNoQmFja2dyb3VuZENvbG9yOiBqYy5vcHRpb25hbCgpXG59KSwgdTEgPSBKdCh7XG4gIHR5cGU6IGlyKFwibGF1bmNoX21pbmlhcHBcIiksXG4gIG5hbWU6IFZjLFxuICB1cmw6IG9yLm9wdGlvbmFsKCksXG4gIHNwbGFzaEltYWdlVXJsOiBvci5vcHRpb25hbCgpLFxuICBzcGxhc2hCYWNrZ3JvdW5kQ29sb3I6IGpjLm9wdGlvbmFsKClcbn0pLCBkMSA9IEp0KHtcbiAgdHlwZTogaXIoXCJ2aWV3X3Rva2VuXCIpLFxuICB0b2tlbjogbjFcbn0pLCBoMSA9IEdmKFwidHlwZVwiLCBbXG4gIHUxLFxuICBkMSxcbiAgLy8gUmVtb3ZlIGFmdGVyIGNvbXBhdGliaWxpdHkgcGVyaW9kXG4gIGMxXG5dKSwgZjEgPSBKdCh7XG4gIHRpdGxlOiBWZixcbiAgYWN0aW9uOiBoMVxufSk7XG5KdCh7XG4gIHZlcnNpb246IGtvKFt4dCgpLCAkZigpXSkudHJhbnNmb3JtKChzKSA9PiBTdHJpbmcocykpLnBpcGUoa28oW2lyKFwibmV4dFwiKSwgaXIoXCIxXCIpXSkpLFxuICBpbWFnZVVybDogb3IsXG4gIGFzcGVjdFJhdGlvOiBhMS5vcHRpb25hbCgpLFxuICBidXR0b246IGYxXG59KTtcbmNvbnN0IGpmID0gSnQoe1xuICB1cmw6IHh0KCksXG4gIHRva2VuOiB4dCgpXG59KTtcbkp0KHtcbiAgbm90aWZpY2F0aW9uSWQ6IHh0KCkubWF4KDEyOCksXG4gIHRpdGxlOiB4dCgpLm1heCgzMiksXG4gIGJvZHk6IHh0KCkubWF4KDEyOCksXG4gIHRhcmdldFVybDogb3IsXG4gIHRva2VuczogeHQoKS5hcnJheSgpLm1heCgxMDApXG59KTtcbkp0KHtcbiAgcmVzdWx0OiBKdCh7XG4gICAgc3VjY2Vzc2Z1bFRva2VuczogS3MoeHQoKSksXG4gICAgaW52YWxpZFRva2VuczogS3MoeHQoKSksXG4gICAgcmF0ZUxpbWl0ZWRUb2tlbnM6IEtzKHh0KCkpXG4gIH0pXG59KTtcbmNvbnN0IGcxID0gSnQoe1xuICBldmVudDogaXIoXCJtaW5pYXBwX2FkZGVkXCIpLFxuICBub3RpZmljYXRpb25EZXRhaWxzOiBqZi5vcHRpb25hbCgpXG59KSwgcDEgPSBKdCh7XG4gIGV2ZW50OiBpcihcIm1pbmlhcHBfcmVtb3ZlZFwiKVxufSksIG0xID0gSnQoe1xuICBldmVudDogaXIoXCJub3RpZmljYXRpb25zX2VuYWJsZWRcIiksXG4gIG5vdGlmaWNhdGlvbkRldGFpbHM6IGpmLnJlcXVpcmVkKClcbn0pLCB5MSA9IEp0KHtcbiAgZXZlbnQ6IGlyKFwibm90aWZpY2F0aW9uc19kaXNhYmxlZFwiKVxufSk7XG5HZihcImV2ZW50XCIsIFtcbiAgZzEsXG4gIHAxLFxuICBtMSxcbiAgeTFcbl0pO1xuY29uc3QgdjEgPSBbXG4gIFwid2FsbGV0LmdldEV0aGVyZXVtUHJvdmlkZXJcIixcbiAgXCJ3YWxsZXQuZ2V0U29sYW5hUHJvdmlkZXJcIixcbiAgXCJhY3Rpb25zLnJlYWR5XCIsXG4gIFwiYWN0aW9ucy5vcGVuVXJsXCIsXG4gIFwiYWN0aW9ucy5jbG9zZVwiLFxuICBcImFjdGlvbnMuc2V0UHJpbWFyeUJ1dHRvblwiLFxuICBcImFjdGlvbnMuYWRkTWluaUFwcFwiLFxuICBcImFjdGlvbnMuc2lnbkluXCIsXG4gIFwiYWN0aW9ucy52aWV3Q2FzdFwiLFxuICBcImFjdGlvbnMudmlld1Byb2ZpbGVcIixcbiAgXCJhY3Rpb25zLmNvbXBvc2VDYXN0XCIsXG4gIFwiYWN0aW9ucy52aWV3VG9rZW5cIixcbiAgXCJhY3Rpb25zLnNlbmRUb2tlblwiLFxuICBcImFjdGlvbnMuc3dhcFRva2VuXCIsXG4gIFwiYWN0aW9ucy5vcGVuTWluaUFwcFwiLFxuICBcImFjdGlvbnMucmVxdWVzdENhbWVyYUFuZE1pY3JvcGhvbmVBY2Nlc3NcIixcbiAgXCJleHBlcmltZW50YWwuc2lnbk1hbmlmZXN0XCIsXG4gIFwiaGFwdGljcy5pbXBhY3RPY2N1cnJlZFwiLFxuICBcImhhcHRpY3Mubm90aWZpY2F0aW9uT2NjdXJyZWRcIixcbiAgXCJoYXB0aWNzLnNlbGVjdGlvbkNoYW5nZWRcIixcbiAgXCJiYWNrXCJcbl0sIEUxID0gW1xuICBcImdhbWVzXCIsXG4gIFwic29jaWFsXCIsXG4gIFwiZmluYW5jZVwiLFxuICBcInV0aWxpdHlcIixcbiAgXCJwcm9kdWN0aXZpdHlcIixcbiAgXCJoZWFsdGgtZml0bmVzc1wiLFxuICBcIm5ld3MtbWVkaWFcIixcbiAgXCJtdXNpY1wiLFxuICBcInNob3BwaW5nXCIsXG4gIFwiZWR1Y2F0aW9uXCIsXG4gIFwiZGV2ZWxvcGVyLXRvb2xzXCIsXG4gIFwiZW50ZXJ0YWlubWVudFwiLFxuICBcImFydC1jcmVhdGl2aXR5XCJcbl0sIHgxID0gR2MoRTEpLCBTMSA9IGtvKFtcbiAgaXIoXCIwLjAuMFwiKSxcbiAgaXIoXCIwLjAuMVwiKSxcbiAgaXIoXCIxXCIpLFxuICBpcihcIm5leHRcIilcbl0pLCBiMSA9ICRuKHsgbWF4OiAzMCB9KSwgVDEgPSAkbih7IG1heDogMTcwIH0pLCB3MSA9IEtzKG9yKS5tYXgoMyksIEExID0gS3MoJG4oeyBtYXg6IDIwLCBub1NwYWNlczogITAgfSkpLm1heCg1KSwgSTEgPSAkbih7IG1heDogMzAgfSksIF8xID0gJG4oeyBtYXg6IDMwIH0pLCBSMSA9ICRuKHsgbWF4OiAxMDAgfSksIEwxID0gUW0oKSwgQzEgPSBbXG4gIFwiZWlwMTU1OjFcIixcbiAgLy8gRXRoZXJldW0gbWFpbm5ldFxuICBcImVpcDE1NTo4NDUzXCIsXG4gIC8vIEJhc2UgbWFpbm5ldFxuICBcImVpcDE1NTo0MjE2MVwiLFxuICAvLyBBcmJpdHJ1bSBPbmVcbiAgXCJlaXAxNTU6NDIxNjE0XCIsXG4gIC8vIEFyYml0cnVtIFNlcG9saWFcbiAgXCJlaXAxNTU6ODQ1MzJcIixcbiAgLy8gQmFzZSBTZXBvbGlhXG4gIFwiZWlwMTU1OjY2NjY2NjY2NlwiLFxuICAvLyBEZWdlblxuICBcImVpcDE1NToxMDBcIixcbiAgLy8gR25vc2lzXG4gIFwiZWlwMTU1OjEwXCIsXG4gIC8vIE9wdGltaXNtXG4gIFwiZWlwMTU1OjExMTU1NDIwXCIsXG4gIC8vIE9wdGltaXNtIFNlcG9saWFcbiAgXCJlaXAxNTU6MTM3XCIsXG4gIC8vIFBvbHlnb25cbiAgXCJlaXAxNTU6MTExNTUxMTFcIixcbiAgLy8gRXRoZXJldW0gU2Vwb2xpYVxuICBcImVpcDE1NTo3Nzc3Nzc3XCIsXG4gIC8vIFpvcmFcbiAgXCJlaXAxNTU6MTMwXCIsXG4gIC8vIFVuaWNoYWluXG4gIFwiZWlwMTU1OjEwMTQzXCIsXG4gIC8vIE1vbmFkIHRlc3RuZXRcbiAgXCJlaXAxNTU6NDIyMjBcIixcbiAgLy8gQ2Vsb1xuICBcInNvbGFuYTo1ZXlrdDRVc0Z2OFA4TkpkVFJFcFkxdnpxS3FaS3ZkcFwiXG4gIC8vIFNvbGFuYVxuXTtcbmZ1bmN0aW9uIEtmKHMpIHtcbiAgY29uc3QgZSA9IG5ldyBTZXQocyk7XG4gIHJldHVybiBBcnJheS5mcm9tKGUpO1xufVxuY29uc3QgazEgPSBLcyhHYyhDMSkpLnRyYW5zZm9ybShLZiksIEQxID0gS3MoR2ModjEpKS50cmFuc2Zvcm0oS2YpLCBpZCA9IEp0KHtcbiAgLy8gMC4wLjAgYW5kIDAuMC4xIGFyZSBub3QgdGVjaG5pY2FsbHkgcGFydCBvZiB0aGUgc3BlYyBidXQga2VwdCBmb3JcbiAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIG5leHQgc2hvdWxkIGFsd2F5cyByZXNvbHZlIHRvIHRoZSBtb3N0IHJlY2VudFxuICAvLyBzY2hlbWEgdmVyc2lvbi5cbiAgdmVyc2lvbjogUzEsXG4gIG5hbWU6IFZjLFxuICBpY29uVXJsOiBvcixcbiAgaG9tZVVybDogb3IsXG4gIC8qKiBkZXByZWNhdGVkLCBzZXQgb2dJbWFnZVVybCBpbnN0ZWFkICovXG4gIGltYWdlVXJsOiBvci5vcHRpb25hbCgpLFxuICAvKiogZGVwcmVjYXRlZCwgd2lsbCByZWx5IG9uIGZjOmZyYW1lL2ZjOm1pbmlhcHAgbWV0YSB0YWcgKi9cbiAgYnV0dG9uVGl0bGU6IFZmLm9wdGlvbmFsKCksXG4gIHNwbGFzaEltYWdlVXJsOiBvci5vcHRpb25hbCgpLFxuICBzcGxhc2hCYWNrZ3JvdW5kQ29sb3I6IGpjLm9wdGlvbmFsKCksXG4gIHdlYmhvb2tVcmw6IG9yLm9wdGlvbmFsKCksXG4gIC8qKiBzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mYXJjYXN0ZXJ4eXovbWluaWFwcHMvZGlzY3Vzc2lvbnMvMTkxICovXG4gIHN1YnRpdGxlOiBiMS5vcHRpb25hbCgpLFxuICBkZXNjcmlwdGlvbjogVDEub3B0aW9uYWwoKSxcbiAgc2NyZWVuc2hvdFVybHM6IHcxLm9wdGlvbmFsKCksXG4gIHByaW1hcnlDYXRlZ29yeTogeDEub3B0aW9uYWwoKSxcbiAgdGFnczogQTEub3B0aW9uYWwoKSxcbiAgaGVyb0ltYWdlVXJsOiBvci5vcHRpb25hbCgpLFxuICB0YWdsaW5lOiBJMS5vcHRpb25hbCgpLFxuICBvZ1RpdGxlOiBfMS5vcHRpb25hbCgpLFxuICBvZ0Rlc2NyaXB0aW9uOiBSMS5vcHRpb25hbCgpLFxuICBvZ0ltYWdlVXJsOiBvci5vcHRpb25hbCgpLFxuICAvKiogc2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmFyY2FzdGVyeHl6L21pbmlhcHBzL2Rpc2N1c3Npb25zLzIwNCAqL1xuICBub2luZGV4OiBMMS5vcHRpb25hbCgpLFxuICAvKiogc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9mYXJjYXN0ZXJ4eXovbWluaWFwcHMvZGlzY3Vzc2lvbnMvMjU2ICovXG4gIHJlcXVpcmVkQ2hhaW5zOiBrMS5vcHRpb25hbCgpLFxuICByZXF1aXJlZENhcGFiaWxpdGllczogRDEub3B0aW9uYWwoKSxcbiAgLyoqIHNlZSBodHRwczovL2dpdGh1Yi5jb20vZmFyY2FzdGVyeHl6L21pbmlhcHBzL2Rpc2N1c3Npb25zLzE1OCAqL1xuICAvKiogRG9jdW1lbnRhdGlvbiB3aWxsIGJlIGFkZGVkIG9uY2UgdGhpcyBmZWF0dXJlIGlzIGZpbmFsaXplZC4gKi9cbiAgY2FzdFNoYXJlVXJsOiBvci5vcHRpb25hbCgpLFxuICAvKiogQ2Fub25pY2FsIGRvbWFpbiBmb3IgdGhlIG1pbmlhcHAgYXBwbGljYXRpb24gKi9cbiAgY2Fub25pY2FsRG9tYWluOiBvMS5vcHRpb25hbCgpXG59KS5yZWZpbmUoKHMpID0+IHtcbiAgaWYgKHMuY2FzdFNoYXJlVXJsID09PSB2b2lkIDApXG4gICAgcmV0dXJuICEwO1xuICB0cnkge1xuICAgIGNvbnN0IGUgPSBuZXcgVVJMKHMuaG9tZVVybCkuaG9zdG5hbWUsIHQgPSBuZXcgVVJMKHMuY2FzdFNoYXJlVXJsKS5ob3N0bmFtZTtcbiAgICByZXR1cm4gZSA9PT0gdDtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuICExO1xuICB9XG59LCB7XG4gIG1lc3NhZ2U6IFwiY2FzdFNoYXJlVXJsIG11c3QgaGF2ZSB0aGUgc2FtZSBkb21haW4gYXMgaG9tZVVybFwiLFxuICBwYXRoOiBbXCJjYXN0U2hhcmVVcmxcIl1cbn0pO1xuSnQoe1xuICBhY2NvdW50QXNzb2NpYXRpb246IGwxLFxuICBtaW5pYXBwOiBpZC5vcHRpb25hbCgpLFxuICAvLyBTdXBwb3J0IGJvdGggJ2ZyYW1lJyBhbmQgJ21pbmlhcHAnIGR1cmluZyB0cmFuc2l0aW9uIHBlcmlvZFxuICBmcmFtZTogaWQub3B0aW9uYWwoKVxufSkucmVmaW5lKChzKSA9PiBzLmZyYW1lICYmIHMubWluaWFwcCA/IEpTT04uc3RyaW5naWZ5KHMuZnJhbWUpID09PSBKU09OLnN0cmluZ2lmeShzLm1pbmlhcHApIDogITAsIHtcbiAgbWVzc2FnZTogJ0lmIGJvdGggXCJmcmFtZVwiIGFuZCBcIm1pbmlhcHBcIiBhcmUgcHJvdmlkZWQsIHRoZXkgbXVzdCBiZSBpZGVudGljYWwnLFxuICBwYXRoOiBbXCJmcmFtZVwiLCBcIm1pbmlhcHBcIl1cbn0pLnRyYW5zZm9ybSgocykgPT4gKHtcbiAgLi4ucyxcbiAgZnJhbWU6IHMuZnJhbWUgPz8gcy5taW5pYXBwXG59KSk7XG52YXIgR2EgPSB7fSwgSG4gPSB7fSwgb2Q7XG5mdW5jdGlvbiBQMSgpIHtcbiAgaWYgKG9kKSByZXR1cm4gSG47XG4gIG9kID0gMSwgSG4uYnl0ZUxlbmd0aCA9IGEsIEhuLnRvQnl0ZUFycmF5ID0gYywgSG4uZnJvbUJ5dGVBcnJheSA9IGg7XG4gIGZvciAodmFyIHMgPSBbXSwgZSA9IFtdLCB0ID0gdHlwZW9mIFVpbnQ4QXJyYXkgPCBcInVcIiA/IFVpbnQ4QXJyYXkgOiBBcnJheSwgciA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrL1wiLCBuID0gMCwgaSA9IHIubGVuZ3RoOyBuIDwgaTsgKytuKVxuICAgIHNbbl0gPSByW25dLCBlW3IuY2hhckNvZGVBdChuKV0gPSBuO1xuICBlWzQ1XSA9IDYyLCBlWzk1XSA9IDYzO1xuICBmdW5jdGlvbiBvKGYpIHtcbiAgICB2YXIgcCA9IGYubGVuZ3RoO1xuICAgIGlmIChwICUgNCA+IDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0XCIpO1xuICAgIHZhciB5ID0gZi5pbmRleE9mKFwiPVwiKTtcbiAgICB5ID09PSAtMSAmJiAoeSA9IHApO1xuICAgIHZhciBFID0geSA9PT0gcCA/IDAgOiA0IC0geSAlIDQ7XG4gICAgcmV0dXJuIFt5LCBFXTtcbiAgfVxuICBmdW5jdGlvbiBhKGYpIHtcbiAgICB2YXIgcCA9IG8oZiksIHkgPSBwWzBdLCBFID0gcFsxXTtcbiAgICByZXR1cm4gKHkgKyBFKSAqIDMgLyA0IC0gRTtcbiAgfVxuICBmdW5jdGlvbiBsKGYsIHAsIHkpIHtcbiAgICByZXR1cm4gKHAgKyB5KSAqIDMgLyA0IC0geTtcbiAgfVxuICBmdW5jdGlvbiBjKGYpIHtcbiAgICB2YXIgcCwgeSA9IG8oZiksIEUgPSB5WzBdLCBiID0geVsxXSwgUiA9IG5ldyB0KGwoZiwgRSwgYikpLCBBID0gMCwgRiA9IGIgPiAwID8gRSAtIDQgOiBFLCBNO1xuICAgIGZvciAoTSA9IDA7IE0gPCBGOyBNICs9IDQpXG4gICAgICBwID0gZVtmLmNoYXJDb2RlQXQoTSldIDw8IDE4IHwgZVtmLmNoYXJDb2RlQXQoTSArIDEpXSA8PCAxMiB8IGVbZi5jaGFyQ29kZUF0KE0gKyAyKV0gPDwgNiB8IGVbZi5jaGFyQ29kZUF0KE0gKyAzKV0sIFJbQSsrXSA9IHAgPj4gMTYgJiAyNTUsIFJbQSsrXSA9IHAgPj4gOCAmIDI1NSwgUltBKytdID0gcCAmIDI1NTtcbiAgICByZXR1cm4gYiA9PT0gMiAmJiAocCA9IGVbZi5jaGFyQ29kZUF0KE0pXSA8PCAyIHwgZVtmLmNoYXJDb2RlQXQoTSArIDEpXSA+PiA0LCBSW0ErK10gPSBwICYgMjU1KSwgYiA9PT0gMSAmJiAocCA9IGVbZi5jaGFyQ29kZUF0KE0pXSA8PCAxMCB8IGVbZi5jaGFyQ29kZUF0KE0gKyAxKV0gPDwgNCB8IGVbZi5jaGFyQ29kZUF0KE0gKyAyKV0gPj4gMiwgUltBKytdID0gcCA+PiA4ICYgMjU1LCBSW0ErK10gPSBwICYgMjU1KSwgUjtcbiAgfVxuICBmdW5jdGlvbiB1KGYpIHtcbiAgICByZXR1cm4gc1tmID4+IDE4ICYgNjNdICsgc1tmID4+IDEyICYgNjNdICsgc1tmID4+IDYgJiA2M10gKyBzW2YgJiA2M107XG4gIH1cbiAgZnVuY3Rpb24gZChmLCBwLCB5KSB7XG4gICAgZm9yICh2YXIgRSwgYiA9IFtdLCBSID0gcDsgUiA8IHk7IFIgKz0gMylcbiAgICAgIEUgPSAoZltSXSA8PCAxNiAmIDE2NzExNjgwKSArIChmW1IgKyAxXSA8PCA4ICYgNjUyODApICsgKGZbUiArIDJdICYgMjU1KSwgYi5wdXNoKHUoRSkpO1xuICAgIHJldHVybiBiLmpvaW4oXCJcIik7XG4gIH1cbiAgZnVuY3Rpb24gaChmKSB7XG4gICAgZm9yICh2YXIgcCwgeSA9IGYubGVuZ3RoLCBFID0geSAlIDMsIGIgPSBbXSwgUiA9IDE2MzgzLCBBID0gMCwgRiA9IHkgLSBFOyBBIDwgRjsgQSArPSBSKVxuICAgICAgYi5wdXNoKGQoZiwgQSwgQSArIFIgPiBGID8gRiA6IEEgKyBSKSk7XG4gICAgcmV0dXJuIEUgPT09IDEgPyAocCA9IGZbeSAtIDFdLCBiLnB1c2goXG4gICAgICBzW3AgPj4gMl0gKyBzW3AgPDwgNCAmIDYzXSArIFwiPT1cIlxuICAgICkpIDogRSA9PT0gMiAmJiAocCA9IChmW3kgLSAyXSA8PCA4KSArIGZbeSAtIDFdLCBiLnB1c2goXG4gICAgICBzW3AgPj4gMTBdICsgc1twID4+IDQgJiA2M10gKyBzW3AgPDwgMiAmIDYzXSArIFwiPVwiXG4gICAgKSksIGIuam9pbihcIlwiKTtcbiAgfVxuICByZXR1cm4gSG47XG59XG52YXIgTWkgPSB7fTtcbi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG52YXIgYWQ7XG5mdW5jdGlvbiBNMSgpIHtcbiAgcmV0dXJuIGFkIHx8IChhZCA9IDEsIE1pLnJlYWQgPSBmdW5jdGlvbihzLCBlLCB0LCByLCBuKSB7XG4gICAgdmFyIGksIG8sIGEgPSBuICogOCAtIHIgLSAxLCBsID0gKDEgPDwgYSkgLSAxLCBjID0gbCA+PiAxLCB1ID0gLTcsIGQgPSB0ID8gbiAtIDEgOiAwLCBoID0gdCA/IC0xIDogMSwgZiA9IHNbZSArIGRdO1xuICAgIGZvciAoZCArPSBoLCBpID0gZiAmICgxIDw8IC11KSAtIDEsIGYgPj49IC11LCB1ICs9IGE7IHUgPiAwOyBpID0gaSAqIDI1NiArIHNbZSArIGRdLCBkICs9IGgsIHUgLT0gOClcbiAgICAgIDtcbiAgICBmb3IgKG8gPSBpICYgKDEgPDwgLXUpIC0gMSwgaSA+Pj0gLXUsIHUgKz0gcjsgdSA+IDA7IG8gPSBvICogMjU2ICsgc1tlICsgZF0sIGQgKz0gaCwgdSAtPSA4KVxuICAgICAgO1xuICAgIGlmIChpID09PSAwKVxuICAgICAgaSA9IDEgLSBjO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGkgPT09IGwpXG4gICAgICAgIHJldHVybiBvID8gTmFOIDogKGYgPyAtMSA6IDEpICogKDEgLyAwKTtcbiAgICAgIG8gPSBvICsgTWF0aC5wb3coMiwgciksIGkgPSBpIC0gYztcbiAgICB9XG4gICAgcmV0dXJuIChmID8gLTEgOiAxKSAqIG8gKiBNYXRoLnBvdygyLCBpIC0gcik7XG4gIH0sIE1pLndyaXRlID0gZnVuY3Rpb24ocywgZSwgdCwgciwgbiwgaSkge1xuICAgIHZhciBvLCBhLCBsLCBjID0gaSAqIDggLSBuIC0gMSwgdSA9ICgxIDw8IGMpIC0gMSwgZCA9IHUgPj4gMSwgaCA9IG4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwLCBmID0gciA/IDAgOiBpIC0gMSwgcCA9IHIgPyAxIDogLTEsIHkgPSBlIDwgMCB8fCBlID09PSAwICYmIDEgLyBlIDwgMCA/IDEgOiAwO1xuICAgIGZvciAoZSA9IE1hdGguYWJzKGUpLCBpc05hTihlKSB8fCBlID09PSAxIC8gMCA/IChhID0gaXNOYU4oZSkgPyAxIDogMCwgbyA9IHUpIDogKG8gPSBNYXRoLmZsb29yKE1hdGgubG9nKGUpIC8gTWF0aC5MTjIpLCBlICogKGwgPSBNYXRoLnBvdygyLCAtbykpIDwgMSAmJiAoby0tLCBsICo9IDIpLCBvICsgZCA+PSAxID8gZSArPSBoIC8gbCA6IGUgKz0gaCAqIE1hdGgucG93KDIsIDEgLSBkKSwgZSAqIGwgPj0gMiAmJiAobysrLCBsIC89IDIpLCBvICsgZCA+PSB1ID8gKGEgPSAwLCBvID0gdSkgOiBvICsgZCA+PSAxID8gKGEgPSAoZSAqIGwgLSAxKSAqIE1hdGgucG93KDIsIG4pLCBvID0gbyArIGQpIDogKGEgPSBlICogTWF0aC5wb3coMiwgZCAtIDEpICogTWF0aC5wb3coMiwgbiksIG8gPSAwKSk7IG4gPj0gODsgc1t0ICsgZl0gPSBhICYgMjU1LCBmICs9IHAsIGEgLz0gMjU2LCBuIC09IDgpXG4gICAgICA7XG4gICAgZm9yIChvID0gbyA8PCBuIHwgYSwgYyArPSBuOyBjID4gMDsgc1t0ICsgZl0gPSBvICYgMjU1LCBmICs9IHAsIG8gLz0gMjU2LCBjIC09IDgpXG4gICAgICA7XG4gICAgc1t0ICsgZiAtIHBdIHw9IHkgKiAxMjg7XG4gIH0pLCBNaTtcbn1cbi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xudmFyIGxkO1xuZnVuY3Rpb24gS2MoKSB7XG4gIHJldHVybiBsZCB8fCAobGQgPSAxLCAoZnVuY3Rpb24ocykge1xuICAgIGNvbnN0IGUgPSBQMSgpLCB0ID0gTTEoKSwgciA9IHR5cGVvZiBTeW1ib2wgPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuZm9yID09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbC5mb3IoXCJub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbVwiKSA6IG51bGw7XG4gICAgcy5CdWZmZXIgPSBhLCBzLlNsb3dCdWZmZXIgPSBSLCBzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTA7XG4gICAgY29uc3QgbiA9IDIxNDc0ODM2NDc7XG4gICAgcy5rTWF4TGVuZ3RoID0gbiwgYS5UWVBFRF9BUlJBWV9TVVBQT1JUID0gaSgpLCAhYS5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlIDwgXCJ1XCIgJiYgdHlwZW9mIGNvbnNvbGUuZXJyb3IgPT0gXCJmdW5jdGlvblwiICYmIGNvbnNvbGUuZXJyb3IoXG4gICAgICBcIlRoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSBgYnVmZmVyYCB2NS54LiBVc2UgYGJ1ZmZlcmAgdjQueCBpZiB5b3UgcmVxdWlyZSBvbGQgYnJvd3NlciBzdXBwb3J0LlwiXG4gICAgKTtcbiAgICBmdW5jdGlvbiBpKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgQiA9IG5ldyBVaW50OEFycmF5KDEpLCBTID0geyBmb286IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiA0MjtcbiAgICAgICAgfSB9O1xuICAgICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKFMsIFVpbnQ4QXJyYXkucHJvdG90eXBlKSwgT2JqZWN0LnNldFByb3RvdHlwZU9mKEIsIFMpLCBCLmZvbygpID09PSA0MjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gITE7XG4gICAgICB9XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSwgXCJwYXJlbnRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoYS5pc0J1ZmZlcih0aGlzKSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXI7XG4gICAgICB9XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLnByb3RvdHlwZSwgXCJvZmZzZXRcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoYS5pc0J1ZmZlcih0aGlzKSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5ieXRlT2Zmc2V0O1xuICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIG8oQikge1xuICAgICAgaWYgKEIgPiBuKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIEIgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJyk7XG4gICAgICBjb25zdCBTID0gbmV3IFVpbnQ4QXJyYXkoQik7XG4gICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKFMsIGEucHJvdG90eXBlKSwgUztcbiAgICB9XG4gICAgZnVuY3Rpb24gYShCLCBTLCBUKSB7XG4gICAgICBpZiAodHlwZW9mIEIgPT0gXCJudW1iZXJcIikge1xuICAgICAgICBpZiAodHlwZW9mIFMgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ1RoZSBcInN0cmluZ1wiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBzdHJpbmcuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiBkKEIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGwoQiwgUywgVCk7XG4gICAgfVxuICAgIGEucG9vbFNpemUgPSA4MTkyO1xuICAgIGZ1bmN0aW9uIGwoQiwgUywgVCkge1xuICAgICAgaWYgKHR5cGVvZiBCID09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBoKEIsIFMpO1xuICAgICAgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhCKSlcbiAgICAgICAgcmV0dXJuIHAoQik7XG4gICAgICBpZiAoQiA9PSBudWxsKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgXCIgKyB0eXBlb2YgQlxuICAgICAgICApO1xuICAgICAgaWYgKGR0KEIsIEFycmF5QnVmZmVyKSB8fCBCICYmIGR0KEIuYnVmZmVyLCBBcnJheUJ1ZmZlcikgfHwgdHlwZW9mIFNoYXJlZEFycmF5QnVmZmVyIDwgXCJ1XCIgJiYgKGR0KEIsIFNoYXJlZEFycmF5QnVmZmVyKSB8fCBCICYmIGR0KEIuYnVmZmVyLCBTaGFyZWRBcnJheUJ1ZmZlcikpKVxuICAgICAgICByZXR1cm4geShCLCBTLCBUKTtcbiAgICAgIGlmICh0eXBlb2YgQiA9PSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdUaGUgXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG9mIHR5cGUgbnVtYmVyLiBSZWNlaXZlZCB0eXBlIG51bWJlcidcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IEcgPSBCLnZhbHVlT2YgJiYgQi52YWx1ZU9mKCk7XG4gICAgICBpZiAoRyAhPSBudWxsICYmIEcgIT09IEIpXG4gICAgICAgIHJldHVybiBhLmZyb20oRywgUywgVCk7XG4gICAgICBjb25zdCBaID0gRShCKTtcbiAgICAgIGlmIChaKSByZXR1cm4gWjtcbiAgICAgIGlmICh0eXBlb2YgU3ltYm9sIDwgXCJ1XCIgJiYgU3ltYm9sLnRvUHJpbWl0aXZlICE9IG51bGwgJiYgdHlwZW9mIEJbU3ltYm9sLnRvUHJpbWl0aXZlXSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgIHJldHVybiBhLmZyb20oQltTeW1ib2wudG9QcmltaXRpdmVdKFwic3RyaW5nXCIpLCBTLCBUKTtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIFwiVGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgXCIgKyB0eXBlb2YgQlxuICAgICAgKTtcbiAgICB9XG4gICAgYS5mcm9tID0gZnVuY3Rpb24oQiwgUywgVCkge1xuICAgICAgcmV0dXJuIGwoQiwgUywgVCk7XG4gICAgfSwgT2JqZWN0LnNldFByb3RvdHlwZU9mKGEucHJvdG90eXBlLCBVaW50OEFycmF5LnByb3RvdHlwZSksIE9iamVjdC5zZXRQcm90b3R5cGVPZihhLCBVaW50OEFycmF5KTtcbiAgICBmdW5jdGlvbiBjKEIpIHtcbiAgICAgIGlmICh0eXBlb2YgQiAhPSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcInNpemVcIiBhcmd1bWVudCBtdXN0IGJlIG9mIHR5cGUgbnVtYmVyJyk7XG4gICAgICBpZiAoQiA8IDApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdUaGUgdmFsdWUgXCInICsgQiArICdcIiBpcyBpbnZhbGlkIGZvciBvcHRpb24gXCJzaXplXCInKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdShCLCBTLCBUKSB7XG4gICAgICByZXR1cm4gYyhCKSwgQiA8PSAwID8gbyhCKSA6IFMgIT09IHZvaWQgMCA/IHR5cGVvZiBUID09IFwic3RyaW5nXCIgPyBvKEIpLmZpbGwoUywgVCkgOiBvKEIpLmZpbGwoUykgOiBvKEIpO1xuICAgIH1cbiAgICBhLmFsbG9jID0gZnVuY3Rpb24oQiwgUywgVCkge1xuICAgICAgcmV0dXJuIHUoQiwgUywgVCk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBkKEIpIHtcbiAgICAgIHJldHVybiBjKEIpLCBvKEIgPCAwID8gMCA6IGIoQikgfCAwKTtcbiAgICB9XG4gICAgYS5hbGxvY1Vuc2FmZSA9IGZ1bmN0aW9uKEIpIHtcbiAgICAgIHJldHVybiBkKEIpO1xuICAgIH0sIGEuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24oQikge1xuICAgICAgcmV0dXJuIGQoQik7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBoKEIsIFMpIHtcbiAgICAgIGlmICgodHlwZW9mIFMgIT0gXCJzdHJpbmdcIiB8fCBTID09PSBcIlwiKSAmJiAoUyA9IFwidXRmOFwiKSwgIWEuaXNFbmNvZGluZyhTKSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiICsgUyk7XG4gICAgICBjb25zdCBUID0gQShCLCBTKSB8IDA7XG4gICAgICBsZXQgRyA9IG8oVCk7XG4gICAgICBjb25zdCBaID0gRy53cml0ZShCLCBTKTtcbiAgICAgIHJldHVybiBaICE9PSBUICYmIChHID0gRy5zbGljZSgwLCBaKSksIEc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGYoQikge1xuICAgICAgY29uc3QgUyA9IEIubGVuZ3RoIDwgMCA/IDAgOiBiKEIubGVuZ3RoKSB8IDAsIFQgPSBvKFMpO1xuICAgICAgZm9yIChsZXQgRyA9IDA7IEcgPCBTOyBHICs9IDEpXG4gICAgICAgIFRbR10gPSBCW0ddICYgMjU1O1xuICAgICAgcmV0dXJuIFQ7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHAoQikge1xuICAgICAgaWYgKGR0KEIsIFVpbnQ4QXJyYXkpKSB7XG4gICAgICAgIGNvbnN0IFMgPSBuZXcgVWludDhBcnJheShCKTtcbiAgICAgICAgcmV0dXJuIHkoUy5idWZmZXIsIFMuYnl0ZU9mZnNldCwgUy5ieXRlTGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmKEIpO1xuICAgIH1cbiAgICBmdW5jdGlvbiB5KEIsIFMsIFQpIHtcbiAgICAgIGlmIChTIDwgMCB8fCBCLmJ5dGVMZW5ndGggPCBTKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJvZmZzZXRcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKTtcbiAgICAgIGlmIChCLmJ5dGVMZW5ndGggPCBTICsgKFQgfHwgMCkpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcImxlbmd0aFwiIGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kcycpO1xuICAgICAgbGV0IEc7XG4gICAgICByZXR1cm4gUyA9PT0gdm9pZCAwICYmIFQgPT09IHZvaWQgMCA/IEcgPSBuZXcgVWludDhBcnJheShCKSA6IFQgPT09IHZvaWQgMCA/IEcgPSBuZXcgVWludDhBcnJheShCLCBTKSA6IEcgPSBuZXcgVWludDhBcnJheShCLCBTLCBUKSwgT2JqZWN0LnNldFByb3RvdHlwZU9mKEcsIGEucHJvdG90eXBlKSwgRztcbiAgICB9XG4gICAgZnVuY3Rpb24gRShCKSB7XG4gICAgICBpZiAoYS5pc0J1ZmZlcihCKSkge1xuICAgICAgICBjb25zdCBTID0gYihCLmxlbmd0aCkgfCAwLCBUID0gbyhTKTtcbiAgICAgICAgcmV0dXJuIFQubGVuZ3RoID09PSAwIHx8IEIuY29weShULCAwLCAwLCBTKSwgVDtcbiAgICAgIH1cbiAgICAgIGlmIChCLmxlbmd0aCAhPT0gdm9pZCAwKVxuICAgICAgICByZXR1cm4gdHlwZW9mIEIubGVuZ3RoICE9IFwibnVtYmVyXCIgfHwgSmUoQi5sZW5ndGgpID8gbygwKSA6IGYoQik7XG4gICAgICBpZiAoQi50eXBlID09PSBcIkJ1ZmZlclwiICYmIEFycmF5LmlzQXJyYXkoQi5kYXRhKSlcbiAgICAgICAgcmV0dXJuIGYoQi5kYXRhKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gYihCKSB7XG4gICAgICBpZiAoQiA+PSBuKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHhcIiArIG4udG9TdHJpbmcoMTYpICsgXCIgYnl0ZXNcIik7XG4gICAgICByZXR1cm4gQiB8IDA7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFIoQikge1xuICAgICAgcmV0dXJuICtCICE9IEIgJiYgKEIgPSAwKSwgYS5hbGxvYygrQik7XG4gICAgfVxuICAgIGEuaXNCdWZmZXIgPSBmdW5jdGlvbihTKSB7XG4gICAgICByZXR1cm4gUyAhPSBudWxsICYmIFMuX2lzQnVmZmVyID09PSAhMCAmJiBTICE9PSBhLnByb3RvdHlwZTtcbiAgICB9LCBhLmNvbXBhcmUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICBpZiAoZHQoUywgVWludDhBcnJheSkgJiYgKFMgPSBhLmZyb20oUywgUy5vZmZzZXQsIFMuYnl0ZUxlbmd0aCkpLCBkdChULCBVaW50OEFycmF5KSAmJiAoVCA9IGEuZnJvbShULCBULm9mZnNldCwgVC5ieXRlTGVuZ3RoKSksICFhLmlzQnVmZmVyKFMpIHx8ICFhLmlzQnVmZmVyKFQpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdUaGUgXCJidWYxXCIsIFwiYnVmMlwiIGFyZ3VtZW50cyBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5J1xuICAgICAgICApO1xuICAgICAgaWYgKFMgPT09IFQpIHJldHVybiAwO1xuICAgICAgbGV0IEcgPSBTLmxlbmd0aCwgWiA9IFQubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgUSA9IDAsIHNlID0gTWF0aC5taW4oRywgWik7IFEgPCBzZTsgKytRKVxuICAgICAgICBpZiAoU1tRXSAhPT0gVFtRXSkge1xuICAgICAgICAgIEcgPSBTW1FdLCBaID0gVFtRXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIEcgPCBaID8gLTEgOiBaIDwgRyA/IDEgOiAwO1xuICAgIH0sIGEuaXNFbmNvZGluZyA9IGZ1bmN0aW9uKFMpIHtcbiAgICAgIHN3aXRjaCAoU3RyaW5nKFMpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgY2FzZSBcImhleFwiOlxuICAgICAgICBjYXNlIFwidXRmOFwiOlxuICAgICAgICBjYXNlIFwidXRmLThcIjpcbiAgICAgICAgY2FzZSBcImFzY2lpXCI6XG4gICAgICAgIGNhc2UgXCJsYXRpbjFcIjpcbiAgICAgICAgY2FzZSBcImJpbmFyeVwiOlxuICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XG4gICAgICAgIGNhc2UgXCJ1Y3MyXCI6XG4gICAgICAgIGNhc2UgXCJ1Y3MtMlwiOlxuICAgICAgICBjYXNlIFwidXRmMTZsZVwiOlxuICAgICAgICBjYXNlIFwidXRmLTE2bGVcIjpcbiAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgfVxuICAgIH0sIGEuY29uY2F0ID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KFMpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtcbiAgICAgIGlmIChTLmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIGEuYWxsb2MoMCk7XG4gICAgICBsZXQgRztcbiAgICAgIGlmIChUID09PSB2b2lkIDApXG4gICAgICAgIGZvciAoVCA9IDAsIEcgPSAwOyBHIDwgUy5sZW5ndGg7ICsrRylcbiAgICAgICAgICBUICs9IFNbR10ubGVuZ3RoO1xuICAgICAgY29uc3QgWiA9IGEuYWxsb2NVbnNhZmUoVCk7XG4gICAgICBsZXQgUSA9IDA7XG4gICAgICBmb3IgKEcgPSAwOyBHIDwgUy5sZW5ndGg7ICsrRykge1xuICAgICAgICBsZXQgc2UgPSBTW0ddO1xuICAgICAgICBpZiAoZHQoc2UsIFVpbnQ4QXJyYXkpKVxuICAgICAgICAgIFEgKyBzZS5sZW5ndGggPiBaLmxlbmd0aCA/IChhLmlzQnVmZmVyKHNlKSB8fCAoc2UgPSBhLmZyb20oc2UpKSwgc2UuY29weShaLCBRKSkgOiBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgICAgICAgIFosXG4gICAgICAgICAgICBzZSxcbiAgICAgICAgICAgIFFcbiAgICAgICAgICApO1xuICAgICAgICBlbHNlIGlmIChhLmlzQnVmZmVyKHNlKSlcbiAgICAgICAgICBzZS5jb3B5KFosIFEpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJyk7XG4gICAgICAgIFEgKz0gc2UubGVuZ3RoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFo7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBBKEIsIFMpIHtcbiAgICAgIGlmIChhLmlzQnVmZmVyKEIpKVxuICAgICAgICByZXR1cm4gQi5sZW5ndGg7XG4gICAgICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KEIpIHx8IGR0KEIsIEFycmF5QnVmZmVyKSlcbiAgICAgICAgcmV0dXJuIEIuYnl0ZUxlbmd0aDtcbiAgICAgIGlmICh0eXBlb2YgQiAhPSBcInN0cmluZ1wiKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICdUaGUgXCJzdHJpbmdcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBvciBBcnJheUJ1ZmZlci4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIEJcbiAgICAgICAgKTtcbiAgICAgIGNvbnN0IFQgPSBCLmxlbmd0aCwgRyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSA9PT0gITA7XG4gICAgICBpZiAoIUcgJiYgVCA9PT0gMCkgcmV0dXJuIDA7XG4gICAgICBsZXQgWiA9ICExO1xuICAgICAgZm9yICg7IDsgKVxuICAgICAgICBzd2l0Y2ggKFMpIHtcbiAgICAgICAgICBjYXNlIFwiYXNjaWlcIjpcbiAgICAgICAgICBjYXNlIFwibGF0aW4xXCI6XG4gICAgICAgICAgY2FzZSBcImJpbmFyeVwiOlxuICAgICAgICAgICAgcmV0dXJuIFQ7XG4gICAgICAgICAgY2FzZSBcInV0ZjhcIjpcbiAgICAgICAgICBjYXNlIFwidXRmLThcIjpcbiAgICAgICAgICAgIHJldHVybiBiZShCKS5sZW5ndGg7XG4gICAgICAgICAgY2FzZSBcInVjczJcIjpcbiAgICAgICAgICBjYXNlIFwidWNzLTJcIjpcbiAgICAgICAgICBjYXNlIFwidXRmMTZsZVwiOlxuICAgICAgICAgIGNhc2UgXCJ1dGYtMTZsZVwiOlxuICAgICAgICAgICAgcmV0dXJuIFQgKiAyO1xuICAgICAgICAgIGNhc2UgXCJoZXhcIjpcbiAgICAgICAgICAgIHJldHVybiBUID4+PiAxO1xuICAgICAgICAgIGNhc2UgXCJiYXNlNjRcIjpcbiAgICAgICAgICAgIHJldHVybiB3ZShCKS5sZW5ndGg7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIGlmIChaKVxuICAgICAgICAgICAgICByZXR1cm4gRyA/IC0xIDogYmUoQikubGVuZ3RoO1xuICAgICAgICAgICAgUyA9IChcIlwiICsgUykudG9Mb3dlckNhc2UoKSwgWiA9ICEwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGEuYnl0ZUxlbmd0aCA9IEE7XG4gICAgZnVuY3Rpb24gRihCLCBTLCBUKSB7XG4gICAgICBsZXQgRyA9ICExO1xuICAgICAgaWYgKChTID09PSB2b2lkIDAgfHwgUyA8IDApICYmIChTID0gMCksIFMgPiB0aGlzLmxlbmd0aCB8fCAoKFQgPT09IHZvaWQgMCB8fCBUID4gdGhpcy5sZW5ndGgpICYmIChUID0gdGhpcy5sZW5ndGgpLCBUIDw9IDApIHx8IChUID4+Pj0gMCwgUyA+Pj49IDAsIFQgPD0gUykpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgZm9yIChCIHx8IChCID0gXCJ1dGY4XCIpOyA7IClcbiAgICAgICAgc3dpdGNoIChCKSB7XG4gICAgICAgICAgY2FzZSBcImhleFwiOlxuICAgICAgICAgICAgcmV0dXJuIFUodGhpcywgUywgVCk7XG4gICAgICAgICAgY2FzZSBcInV0ZjhcIjpcbiAgICAgICAgICBjYXNlIFwidXRmLThcIjpcbiAgICAgICAgICAgIHJldHVybiBnKHRoaXMsIFMsIFQpO1xuICAgICAgICAgIGNhc2UgXCJhc2NpaVwiOlxuICAgICAgICAgICAgcmV0dXJuIEQodGhpcywgUywgVCk7XG4gICAgICAgICAgY2FzZSBcImxhdGluMVwiOlxuICAgICAgICAgIGNhc2UgXCJiaW5hcnlcIjpcbiAgICAgICAgICAgIHJldHVybiBPKHRoaXMsIFMsIFQpO1xuICAgICAgICAgIGNhc2UgXCJiYXNlNjRcIjpcbiAgICAgICAgICAgIHJldHVybiBfKHRoaXMsIFMsIFQpO1xuICAgICAgICAgIGNhc2UgXCJ1Y3MyXCI6XG4gICAgICAgICAgY2FzZSBcInVjcy0yXCI6XG4gICAgICAgICAgY2FzZSBcInV0ZjE2bGVcIjpcbiAgICAgICAgICBjYXNlIFwidXRmLTE2bGVcIjpcbiAgICAgICAgICAgIHJldHVybiBWKHRoaXMsIFMsIFQpO1xuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBpZiAoRykgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlVua25vd24gZW5jb2Rpbmc6IFwiICsgQik7XG4gICAgICAgICAgICBCID0gKEIgKyBcIlwiKS50b0xvd2VyQ2FzZSgpLCBHID0gITA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYS5wcm90b3R5cGUuX2lzQnVmZmVyID0gITA7XG4gICAgZnVuY3Rpb24gTShCLCBTLCBUKSB7XG4gICAgICBjb25zdCBHID0gQltTXTtcbiAgICAgIEJbU10gPSBCW1RdLCBCW1RdID0gRztcbiAgICB9XG4gICAgYS5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBTID0gdGhpcy5sZW5ndGg7XG4gICAgICBpZiAoUyAlIDIgIT09IDApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHNcIik7XG4gICAgICBmb3IgKGxldCBUID0gMDsgVCA8IFM7IFQgKz0gMilcbiAgICAgICAgTSh0aGlzLCBULCBUICsgMSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBhLnByb3RvdHlwZS5zd2FwMzIgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IFMgPSB0aGlzLmxlbmd0aDtcbiAgICAgIGlmIChTICUgNCAhPT0gMClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0c1wiKTtcbiAgICAgIGZvciAobGV0IFQgPSAwOyBUIDwgUzsgVCArPSA0KVxuICAgICAgICBNKHRoaXMsIFQsIFQgKyAzKSwgTSh0aGlzLCBUICsgMSwgVCArIDIpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgYS5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBTID0gdGhpcy5sZW5ndGg7XG4gICAgICBpZiAoUyAlIDggIT09IDApXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHNcIik7XG4gICAgICBmb3IgKGxldCBUID0gMDsgVCA8IFM7IFQgKz0gOClcbiAgICAgICAgTSh0aGlzLCBULCBUICsgNyksIE0odGhpcywgVCArIDEsIFQgKyA2KSwgTSh0aGlzLCBUICsgMiwgVCArIDUpLCBNKHRoaXMsIFQgKyAzLCBUICsgNCk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LCBhLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgUyA9IHRoaXMubGVuZ3RoO1xuICAgICAgcmV0dXJuIFMgPT09IDAgPyBcIlwiIDogYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/IGcodGhpcywgMCwgUykgOiBGLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfSwgYS5wcm90b3R5cGUudG9Mb2NhbGVTdHJpbmcgPSBhLnByb3RvdHlwZS50b1N0cmluZywgYS5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24oUykge1xuICAgICAgaWYgKCFhLmlzQnVmZmVyKFMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlclwiKTtcbiAgICAgIHJldHVybiB0aGlzID09PSBTID8gITAgOiBhLmNvbXBhcmUodGhpcywgUykgPT09IDA7XG4gICAgfSwgYS5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uKCkge1xuICAgICAgbGV0IFMgPSBcIlwiO1xuICAgICAgY29uc3QgVCA9IHMuSU5TUEVDVF9NQVhfQllURVM7XG4gICAgICByZXR1cm4gUyA9IHRoaXMudG9TdHJpbmcoXCJoZXhcIiwgMCwgVCkucmVwbGFjZSgvKC57Mn0pL2csIFwiJDEgXCIpLnRyaW0oKSwgdGhpcy5sZW5ndGggPiBUICYmIChTICs9IFwiIC4uLiBcIiksIFwiPEJ1ZmZlciBcIiArIFMgKyBcIj5cIjtcbiAgICB9LCByICYmIChhLnByb3RvdHlwZVtyXSA9IGEucHJvdG90eXBlLmluc3BlY3QpLCBhLnByb3RvdHlwZS5jb21wYXJlID0gZnVuY3Rpb24oUywgVCwgRywgWiwgUSkge1xuICAgICAgaWYgKGR0KFMsIFVpbnQ4QXJyYXkpICYmIChTID0gYS5mcm9tKFMsIFMub2Zmc2V0LCBTLmJ5dGVMZW5ndGgpKSwgIWEuaXNCdWZmZXIoUykpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ1RoZSBcInRhcmdldFwiIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIHR5cGUgQnVmZmVyIG9yIFVpbnQ4QXJyYXkuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBTXG4gICAgICAgICk7XG4gICAgICBpZiAoVCA9PT0gdm9pZCAwICYmIChUID0gMCksIEcgPT09IHZvaWQgMCAmJiAoRyA9IFMgPyBTLmxlbmd0aCA6IDApLCBaID09PSB2b2lkIDAgJiYgKFogPSAwKSwgUSA9PT0gdm9pZCAwICYmIChRID0gdGhpcy5sZW5ndGgpLCBUIDwgMCB8fCBHID4gUy5sZW5ndGggfHwgWiA8IDAgfHwgUSA+IHRoaXMubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm91dCBvZiByYW5nZSBpbmRleFwiKTtcbiAgICAgIGlmIChaID49IFEgJiYgVCA+PSBHKVxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGlmIChaID49IFEpXG4gICAgICAgIHJldHVybiAtMTtcbiAgICAgIGlmIChUID49IEcpXG4gICAgICAgIHJldHVybiAxO1xuICAgICAgaWYgKFQgPj4+PSAwLCBHID4+Pj0gMCwgWiA+Pj49IDAsIFEgPj4+PSAwLCB0aGlzID09PSBTKSByZXR1cm4gMDtcbiAgICAgIGxldCBzZSA9IFEgLSBaLCBVZSA9IEcgLSBUO1xuICAgICAgY29uc3QgUGUgPSBNYXRoLm1pbihzZSwgVWUpLCBMZSA9IHRoaXMuc2xpY2UoWiwgUSksIGN0ID0gUy5zbGljZShULCBHKTtcbiAgICAgIGZvciAobGV0IEFlID0gMDsgQWUgPCBQZTsgKytBZSlcbiAgICAgICAgaWYgKExlW0FlXSAhPT0gY3RbQWVdKSB7XG4gICAgICAgICAgc2UgPSBMZVtBZV0sIFVlID0gY3RbQWVdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICByZXR1cm4gc2UgPCBVZSA/IC0xIDogVWUgPCBzZSA/IDEgOiAwO1xuICAgIH07XG4gICAgZnVuY3Rpb24gSChCLCBTLCBULCBHLCBaKSB7XG4gICAgICBpZiAoQi5sZW5ndGggPT09IDApIHJldHVybiAtMTtcbiAgICAgIGlmICh0eXBlb2YgVCA9PSBcInN0cmluZ1wiID8gKEcgPSBULCBUID0gMCkgOiBUID4gMjE0NzQ4MzY0NyA/IFQgPSAyMTQ3NDgzNjQ3IDogVCA8IC0yMTQ3NDgzNjQ4ICYmIChUID0gLTIxNDc0ODM2NDgpLCBUID0gK1QsIEplKFQpICYmIChUID0gWiA/IDAgOiBCLmxlbmd0aCAtIDEpLCBUIDwgMCAmJiAoVCA9IEIubGVuZ3RoICsgVCksIFQgPj0gQi5sZW5ndGgpIHtcbiAgICAgICAgaWYgKFopIHJldHVybiAtMTtcbiAgICAgICAgVCA9IEIubGVuZ3RoIC0gMTtcbiAgICAgIH0gZWxzZSBpZiAoVCA8IDApXG4gICAgICAgIGlmIChaKSBUID0gMDtcbiAgICAgICAgZWxzZSByZXR1cm4gLTE7XG4gICAgICBpZiAodHlwZW9mIFMgPT0gXCJzdHJpbmdcIiAmJiAoUyA9IGEuZnJvbShTLCBHKSksIGEuaXNCdWZmZXIoUykpXG4gICAgICAgIHJldHVybiBTLmxlbmd0aCA9PT0gMCA/IC0xIDogSyhCLCBTLCBULCBHLCBaKTtcbiAgICAgIGlmICh0eXBlb2YgUyA9PSBcIm51bWJlclwiKVxuICAgICAgICByZXR1cm4gUyA9IFMgJiAyNTUsIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09IFwiZnVuY3Rpb25cIiA/IFogPyBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoQiwgUywgVCkgOiBVaW50OEFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZi5jYWxsKEIsIFMsIFQpIDogSyhCLCBbU10sIFQsIEcsIFopO1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlclwiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gSyhCLCBTLCBULCBHLCBaKSB7XG4gICAgICBsZXQgUSA9IDEsIHNlID0gQi5sZW5ndGgsIFVlID0gUy5sZW5ndGg7XG4gICAgICBpZiAoRyAhPT0gdm9pZCAwICYmIChHID0gU3RyaW5nKEcpLnRvTG93ZXJDYXNlKCksIEcgPT09IFwidWNzMlwiIHx8IEcgPT09IFwidWNzLTJcIiB8fCBHID09PSBcInV0ZjE2bGVcIiB8fCBHID09PSBcInV0Zi0xNmxlXCIpKSB7XG4gICAgICAgIGlmIChCLmxlbmd0aCA8IDIgfHwgUy5sZW5ndGggPCAyKVxuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgUSA9IDIsIHNlIC89IDIsIFVlIC89IDIsIFQgLz0gMjtcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIFBlKGN0LCBBZSkge1xuICAgICAgICByZXR1cm4gUSA9PT0gMSA/IGN0W0FlXSA6IGN0LnJlYWRVSW50MTZCRShBZSAqIFEpO1xuICAgICAgfVxuICAgICAgbGV0IExlO1xuICAgICAgaWYgKFopIHtcbiAgICAgICAgbGV0IGN0ID0gLTE7XG4gICAgICAgIGZvciAoTGUgPSBUOyBMZSA8IHNlOyBMZSsrKVxuICAgICAgICAgIGlmIChQZShCLCBMZSkgPT09IFBlKFMsIGN0ID09PSAtMSA/IDAgOiBMZSAtIGN0KSkge1xuICAgICAgICAgICAgaWYgKGN0ID09PSAtMSAmJiAoY3QgPSBMZSksIExlIC0gY3QgKyAxID09PSBVZSkgcmV0dXJuIGN0ICogUTtcbiAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIGN0ICE9PSAtMSAmJiAoTGUgLT0gTGUgLSBjdCksIGN0ID0gLTE7XG4gICAgICB9IGVsc2VcbiAgICAgICAgZm9yIChUICsgVWUgPiBzZSAmJiAoVCA9IHNlIC0gVWUpLCBMZSA9IFQ7IExlID49IDA7IExlLS0pIHtcbiAgICAgICAgICBsZXQgY3QgPSAhMDtcbiAgICAgICAgICBmb3IgKGxldCBBZSA9IDA7IEFlIDwgVWU7IEFlKyspXG4gICAgICAgICAgICBpZiAoUGUoQiwgTGUgKyBBZSkgIT09IFBlKFMsIEFlKSkge1xuICAgICAgICAgICAgICBjdCA9ICExO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoY3QpIHJldHVybiBMZTtcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uKFMsIFQsIEcpIHtcbiAgICAgIHJldHVybiB0aGlzLmluZGV4T2YoUywgVCwgRykgIT09IC0xO1xuICAgIH0sIGEucHJvdG90eXBlLmluZGV4T2YgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gSCh0aGlzLCBTLCBULCBHLCAhMCk7XG4gICAgfSwgYS5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gSCh0aGlzLCBTLCBULCBHLCAhMSk7XG4gICAgfTtcbiAgICBmdW5jdGlvbiBqKEIsIFMsIFQsIEcpIHtcbiAgICAgIFQgPSBOdW1iZXIoVCkgfHwgMDtcbiAgICAgIGNvbnN0IFogPSBCLmxlbmd0aCAtIFQ7XG4gICAgICBHID8gKEcgPSBOdW1iZXIoRyksIEcgPiBaICYmIChHID0gWikpIDogRyA9IFo7XG4gICAgICBjb25zdCBRID0gUy5sZW5ndGg7XG4gICAgICBHID4gUSAvIDIgJiYgKEcgPSBRIC8gMik7XG4gICAgICBsZXQgc2U7XG4gICAgICBmb3IgKHNlID0gMDsgc2UgPCBHOyArK3NlKSB7XG4gICAgICAgIGNvbnN0IFVlID0gcGFyc2VJbnQoUy5zdWJzdHIoc2UgKiAyLCAyKSwgMTYpO1xuICAgICAgICBpZiAoSmUoVWUpKSByZXR1cm4gc2U7XG4gICAgICAgIEJbVCArIHNlXSA9IFVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlO1xuICAgIH1cbiAgICBmdW5jdGlvbiBDKEIsIFMsIFQsIEcpIHtcbiAgICAgIHJldHVybiBOZShiZShTLCBCLmxlbmd0aCAtIFQpLCBCLCBULCBHKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gayhCLCBTLCBULCBHKSB7XG4gICAgICByZXR1cm4gTmUoRmUoUyksIEIsIFQsIEcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiAkKEIsIFMsIFQsIEcpIHtcbiAgICAgIHJldHVybiBOZSh3ZShTKSwgQiwgVCwgRyk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFcoQiwgUywgVCwgRykge1xuICAgICAgcmV0dXJuIE5lKFhlKFMsIEIubGVuZ3RoIC0gVCksIEIsIFQsIEcpO1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uKFMsIFQsIEcsIFopIHtcbiAgICAgIGlmIChUID09PSB2b2lkIDApXG4gICAgICAgIFogPSBcInV0ZjhcIiwgRyA9IHRoaXMubGVuZ3RoLCBUID0gMDtcbiAgICAgIGVsc2UgaWYgKEcgPT09IHZvaWQgMCAmJiB0eXBlb2YgVCA9PSBcInN0cmluZ1wiKVxuICAgICAgICBaID0gVCwgRyA9IHRoaXMubGVuZ3RoLCBUID0gMDtcbiAgICAgIGVsc2UgaWYgKGlzRmluaXRlKFQpKVxuICAgICAgICBUID0gVCA+Pj4gMCwgaXNGaW5pdGUoRykgPyAoRyA9IEcgPj4+IDAsIFogPT09IHZvaWQgMCAmJiAoWiA9IFwidXRmOFwiKSkgOiAoWiA9IEcsIEcgPSB2b2lkIDApO1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgXCJCdWZmZXIud3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0WywgbGVuZ3RoXSkgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZFwiXG4gICAgICAgICk7XG4gICAgICBjb25zdCBRID0gdGhpcy5sZW5ndGggLSBUO1xuICAgICAgaWYgKChHID09PSB2b2lkIDAgfHwgRyA+IFEpICYmIChHID0gUSksIFMubGVuZ3RoID4gMCAmJiAoRyA8IDAgfHwgVCA8IDApIHx8IFQgPiB0aGlzLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kc1wiKTtcbiAgICAgIFogfHwgKFogPSBcInV0ZjhcIik7XG4gICAgICBsZXQgc2UgPSAhMTtcbiAgICAgIGZvciAoOyA7IClcbiAgICAgICAgc3dpdGNoIChaKSB7XG4gICAgICAgICAgY2FzZSBcImhleFwiOlxuICAgICAgICAgICAgcmV0dXJuIGoodGhpcywgUywgVCwgRyk7XG4gICAgICAgICAgY2FzZSBcInV0ZjhcIjpcbiAgICAgICAgICBjYXNlIFwidXRmLThcIjpcbiAgICAgICAgICAgIHJldHVybiBDKHRoaXMsIFMsIFQsIEcpO1xuICAgICAgICAgIGNhc2UgXCJhc2NpaVwiOlxuICAgICAgICAgIGNhc2UgXCJsYXRpbjFcIjpcbiAgICAgICAgICBjYXNlIFwiYmluYXJ5XCI6XG4gICAgICAgICAgICByZXR1cm4gayh0aGlzLCBTLCBULCBHKTtcbiAgICAgICAgICBjYXNlIFwiYmFzZTY0XCI6XG4gICAgICAgICAgICByZXR1cm4gJCh0aGlzLCBTLCBULCBHKTtcbiAgICAgICAgICBjYXNlIFwidWNzMlwiOlxuICAgICAgICAgIGNhc2UgXCJ1Y3MtMlwiOlxuICAgICAgICAgIGNhc2UgXCJ1dGYxNmxlXCI6XG4gICAgICAgICAgY2FzZSBcInV0Zi0xNmxlXCI6XG4gICAgICAgICAgICByZXR1cm4gVyh0aGlzLCBTLCBULCBHKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgaWYgKHNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIgKyBaKTtcbiAgICAgICAgICAgIFogPSAoXCJcIiArIFopLnRvTG93ZXJDYXNlKCksIHNlID0gITA7XG4gICAgICAgIH1cbiAgICB9LCBhLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiQnVmZmVyXCIsXG4gICAgICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICAgICAgfTtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIF8oQiwgUywgVCkge1xuICAgICAgcmV0dXJuIFMgPT09IDAgJiYgVCA9PT0gQi5sZW5ndGggPyBlLmZyb21CeXRlQXJyYXkoQikgOiBlLmZyb21CeXRlQXJyYXkoQi5zbGljZShTLCBUKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGcoQiwgUywgVCkge1xuICAgICAgVCA9IE1hdGgubWluKEIubGVuZ3RoLCBUKTtcbiAgICAgIGNvbnN0IEcgPSBbXTtcbiAgICAgIGxldCBaID0gUztcbiAgICAgIGZvciAoOyBaIDwgVDsgKSB7XG4gICAgICAgIGNvbnN0IFEgPSBCW1pdO1xuICAgICAgICBsZXQgc2UgPSBudWxsLCBVZSA9IFEgPiAyMzkgPyA0IDogUSA+IDIyMyA/IDMgOiBRID4gMTkxID8gMiA6IDE7XG4gICAgICAgIGlmIChaICsgVWUgPD0gVCkge1xuICAgICAgICAgIGxldCBQZSwgTGUsIGN0LCBBZTtcbiAgICAgICAgICBzd2l0Y2ggKFVlKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIFEgPCAxMjggJiYgKHNlID0gUSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICBQZSA9IEJbWiArIDFdLCAoUGUgJiAxOTIpID09PSAxMjggJiYgKEFlID0gKFEgJiAzMSkgPDwgNiB8IFBlICYgNjMsIEFlID4gMTI3ICYmIChzZSA9IEFlKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBQZSA9IEJbWiArIDFdLCBMZSA9IEJbWiArIDJdLCAoUGUgJiAxOTIpID09PSAxMjggJiYgKExlICYgMTkyKSA9PT0gMTI4ICYmIChBZSA9IChRICYgMTUpIDw8IDEyIHwgKFBlICYgNjMpIDw8IDYgfCBMZSAmIDYzLCBBZSA+IDIwNDcgJiYgKEFlIDwgNTUyOTYgfHwgQWUgPiA1NzM0MykgJiYgKHNlID0gQWUpKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIFBlID0gQltaICsgMV0sIExlID0gQltaICsgMl0sIGN0ID0gQltaICsgM10sIChQZSAmIDE5MikgPT09IDEyOCAmJiAoTGUgJiAxOTIpID09PSAxMjggJiYgKGN0ICYgMTkyKSA9PT0gMTI4ICYmIChBZSA9IChRICYgMTUpIDw8IDE4IHwgKFBlICYgNjMpIDw8IDEyIHwgKExlICYgNjMpIDw8IDYgfCBjdCAmIDYzLCBBZSA+IDY1NTM1ICYmIEFlIDwgMTExNDExMiAmJiAoc2UgPSBBZSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZSA9PT0gbnVsbCA/IChzZSA9IDY1NTMzLCBVZSA9IDEpIDogc2UgPiA2NTUzNSAmJiAoc2UgLT0gNjU1MzYsIEcucHVzaChzZSA+Pj4gMTAgJiAxMDIzIHwgNTUyOTYpLCBzZSA9IDU2MzIwIHwgc2UgJiAxMDIzKSwgRy5wdXNoKHNlKSwgWiArPSBVZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3KEcpO1xuICAgIH1cbiAgICBjb25zdCB4ID0gNDA5NjtcbiAgICBmdW5jdGlvbiB3KEIpIHtcbiAgICAgIGNvbnN0IFMgPSBCLmxlbmd0aDtcbiAgICAgIGlmIChTIDw9IHgpXG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgQik7XG4gICAgICBsZXQgVCA9IFwiXCIsIEcgPSAwO1xuICAgICAgZm9yICg7IEcgPCBTOyApXG4gICAgICAgIFQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgICAgICBTdHJpbmcsXG4gICAgICAgICAgQi5zbGljZShHLCBHICs9IHgpXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gVDtcbiAgICB9XG4gICAgZnVuY3Rpb24gRChCLCBTLCBUKSB7XG4gICAgICBsZXQgRyA9IFwiXCI7XG4gICAgICBUID0gTWF0aC5taW4oQi5sZW5ndGgsIFQpO1xuICAgICAgZm9yIChsZXQgWiA9IFM7IFogPCBUOyArK1opXG4gICAgICAgIEcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShCW1pdICYgMTI3KTtcbiAgICAgIHJldHVybiBHO1xuICAgIH1cbiAgICBmdW5jdGlvbiBPKEIsIFMsIFQpIHtcbiAgICAgIGxldCBHID0gXCJcIjtcbiAgICAgIFQgPSBNYXRoLm1pbihCLmxlbmd0aCwgVCk7XG4gICAgICBmb3IgKGxldCBaID0gUzsgWiA8IFQ7ICsrWilcbiAgICAgICAgRyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKEJbWl0pO1xuICAgICAgcmV0dXJuIEc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFUoQiwgUywgVCkge1xuICAgICAgY29uc3QgRyA9IEIubGVuZ3RoO1xuICAgICAgKCFTIHx8IFMgPCAwKSAmJiAoUyA9IDApLCAoIVQgfHwgVCA8IDAgfHwgVCA+IEcpICYmIChUID0gRyk7XG4gICAgICBsZXQgWiA9IFwiXCI7XG4gICAgICBmb3IgKGxldCBRID0gUzsgUSA8IFQ7ICsrUSlcbiAgICAgICAgWiArPSBRZVtCW1FdXTtcbiAgICAgIHJldHVybiBaO1xuICAgIH1cbiAgICBmdW5jdGlvbiBWKEIsIFMsIFQpIHtcbiAgICAgIGNvbnN0IEcgPSBCLnNsaWNlKFMsIFQpO1xuICAgICAgbGV0IFogPSBcIlwiO1xuICAgICAgZm9yIChsZXQgUSA9IDA7IFEgPCBHLmxlbmd0aCAtIDE7IFEgKz0gMilcbiAgICAgICAgWiArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKEdbUV0gKyBHW1EgKyAxXSAqIDI1Nik7XG4gICAgICByZXR1cm4gWjtcbiAgICB9XG4gICAgYS5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICBjb25zdCBHID0gdGhpcy5sZW5ndGg7XG4gICAgICBTID0gfn5TLCBUID0gVCA9PT0gdm9pZCAwID8gRyA6IH5+VCwgUyA8IDAgPyAoUyArPSBHLCBTIDwgMCAmJiAoUyA9IDApKSA6IFMgPiBHICYmIChTID0gRyksIFQgPCAwID8gKFQgKz0gRywgVCA8IDAgJiYgKFQgPSAwKSkgOiBUID4gRyAmJiAoVCA9IEcpLCBUIDwgUyAmJiAoVCA9IFMpO1xuICAgICAgY29uc3QgWiA9IHRoaXMuc3ViYXJyYXkoUywgVCk7XG4gICAgICByZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKFosIGEucHJvdG90eXBlKSwgWjtcbiAgICB9O1xuICAgIGZ1bmN0aW9uIEwoQiwgUywgVCkge1xuICAgICAgaWYgKEIgJSAxICE9PSAwIHx8IEIgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIm9mZnNldCBpcyBub3QgdWludFwiKTtcbiAgICAgIGlmIChCICsgUyA+IFQpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aFwiKTtcbiAgICB9XG4gICAgYS5wcm90b3R5cGUucmVhZFVpbnRMRSA9IGEucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICBTID0gUyA+Pj4gMCwgVCA9IFQgPj4+IDAsIEcgfHwgTChTLCBULCB0aGlzLmxlbmd0aCk7XG4gICAgICBsZXQgWiA9IHRoaXNbU10sIFEgPSAxLCBzZSA9IDA7XG4gICAgICBmb3IgKDsgKytzZSA8IFQgJiYgKFEgKj0gMjU2KTsgKVxuICAgICAgICBaICs9IHRoaXNbUyArIHNlXSAqIFE7XG4gICAgICByZXR1cm4gWjtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkVWludEJFID0gYS5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uKFMsIFQsIEcpIHtcbiAgICAgIFMgPSBTID4+PiAwLCBUID0gVCA+Pj4gMCwgRyB8fCBMKFMsIFQsIHRoaXMubGVuZ3RoKTtcbiAgICAgIGxldCBaID0gdGhpc1tTICsgLS1UXSwgUSA9IDE7XG4gICAgICBmb3IgKDsgVCA+IDAgJiYgKFEgKj0gMjU2KTsgKVxuICAgICAgICBaICs9IHRoaXNbUyArIC0tVF0gKiBRO1xuICAgICAgcmV0dXJuIFo7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZFVpbnQ4ID0gYS5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgcmV0dXJuIFMgPSBTID4+PiAwLCBUIHx8IEwoUywgMSwgdGhpcy5sZW5ndGgpLCB0aGlzW1NdO1xuICAgIH0sIGEucHJvdG90eXBlLnJlYWRVaW50MTZMRSA9IGEucHJvdG90eXBlLnJlYWRVSW50MTZMRSA9IGZ1bmN0aW9uKFMsIFQpIHtcbiAgICAgIHJldHVybiBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDIsIHRoaXMubGVuZ3RoKSwgdGhpc1tTXSB8IHRoaXNbUyArIDFdIDw8IDg7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZFVpbnQxNkJFID0gYS5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgcmV0dXJuIFMgPSBTID4+PiAwLCBUIHx8IEwoUywgMiwgdGhpcy5sZW5ndGgpLCB0aGlzW1NdIDw8IDggfCB0aGlzW1MgKyAxXTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkVWludDMyTEUgPSBhLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICByZXR1cm4gUyA9IFMgPj4+IDAsIFQgfHwgTChTLCA0LCB0aGlzLmxlbmd0aCksICh0aGlzW1NdIHwgdGhpc1tTICsgMV0gPDwgOCB8IHRoaXNbUyArIDJdIDw8IDE2KSArIHRoaXNbUyArIDNdICogMTY3NzcyMTY7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZFVpbnQzMkJFID0gYS5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgcmV0dXJuIFMgPSBTID4+PiAwLCBUIHx8IEwoUywgNCwgdGhpcy5sZW5ndGgpLCB0aGlzW1NdICogMTY3NzcyMTYgKyAodGhpc1tTICsgMV0gPDwgMTYgfCB0aGlzW1MgKyAyXSA8PCA4IHwgdGhpc1tTICsgM10pO1xuICAgIH0sIGEucHJvdG90eXBlLnJlYWRCaWdVSW50NjRMRSA9IGl0KGZ1bmN0aW9uKFMpIHtcbiAgICAgIFMgPSBTID4+PiAwLCBfZShTLCBcIm9mZnNldFwiKTtcbiAgICAgIGNvbnN0IFQgPSB0aGlzW1NdLCBHID0gdGhpc1tTICsgN107XG4gICAgICAoVCA9PT0gdm9pZCAwIHx8IEcgPT09IHZvaWQgMCkgJiYgeGUoUywgdGhpcy5sZW5ndGggLSA4KTtcbiAgICAgIGNvbnN0IFogPSBUICsgdGhpc1srK1NdICogMiAqKiA4ICsgdGhpc1srK1NdICogMiAqKiAxNiArIHRoaXNbKytTXSAqIDIgKiogMjQsIFEgPSB0aGlzWysrU10gKyB0aGlzWysrU10gKiAyICoqIDggKyB0aGlzWysrU10gKiAyICoqIDE2ICsgRyAqIDIgKiogMjQ7XG4gICAgICByZXR1cm4gQmlnSW50KFopICsgKEJpZ0ludChRKSA8PCBCaWdJbnQoMzIpKTtcbiAgICB9KSwgYS5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NEJFID0gaXQoZnVuY3Rpb24oUykge1xuICAgICAgUyA9IFMgPj4+IDAsIF9lKFMsIFwib2Zmc2V0XCIpO1xuICAgICAgY29uc3QgVCA9IHRoaXNbU10sIEcgPSB0aGlzW1MgKyA3XTtcbiAgICAgIChUID09PSB2b2lkIDAgfHwgRyA9PT0gdm9pZCAwKSAmJiB4ZShTLCB0aGlzLmxlbmd0aCAtIDgpO1xuICAgICAgY29uc3QgWiA9IFQgKiAyICoqIDI0ICsgdGhpc1srK1NdICogMiAqKiAxNiArIHRoaXNbKytTXSAqIDIgKiogOCArIHRoaXNbKytTXSwgUSA9IHRoaXNbKytTXSAqIDIgKiogMjQgKyB0aGlzWysrU10gKiAyICoqIDE2ICsgdGhpc1srK1NdICogMiAqKiA4ICsgRztcbiAgICAgIHJldHVybiAoQmlnSW50KFopIDw8IEJpZ0ludCgzMikpICsgQmlnSW50KFEpO1xuICAgIH0pLCBhLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICBTID0gUyA+Pj4gMCwgVCA9IFQgPj4+IDAsIEcgfHwgTChTLCBULCB0aGlzLmxlbmd0aCk7XG4gICAgICBsZXQgWiA9IHRoaXNbU10sIFEgPSAxLCBzZSA9IDA7XG4gICAgICBmb3IgKDsgKytzZSA8IFQgJiYgKFEgKj0gMjU2KTsgKVxuICAgICAgICBaICs9IHRoaXNbUyArIHNlXSAqIFE7XG4gICAgICByZXR1cm4gUSAqPSAxMjgsIFogPj0gUSAmJiAoWiAtPSBNYXRoLnBvdygyLCA4ICogVCkpLCBaO1xuICAgIH0sIGEucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uKFMsIFQsIEcpIHtcbiAgICAgIFMgPSBTID4+PiAwLCBUID0gVCA+Pj4gMCwgRyB8fCBMKFMsIFQsIHRoaXMubGVuZ3RoKTtcbiAgICAgIGxldCBaID0gVCwgUSA9IDEsIHNlID0gdGhpc1tTICsgLS1aXTtcbiAgICAgIGZvciAoOyBaID4gMCAmJiAoUSAqPSAyNTYpOyApXG4gICAgICAgIHNlICs9IHRoaXNbUyArIC0tWl0gKiBRO1xuICAgICAgcmV0dXJuIFEgKj0gMTI4LCBzZSA+PSBRICYmIChzZSAtPSBNYXRoLnBvdygyLCA4ICogVCkpLCBzZTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uKFMsIFQpIHtcbiAgICAgIHJldHVybiBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDEsIHRoaXMubGVuZ3RoKSwgdGhpc1tTXSAmIDEyOCA/ICgyNTUgLSB0aGlzW1NdICsgMSkgKiAtMSA6IHRoaXNbU107XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDIsIHRoaXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IEcgPSB0aGlzW1NdIHwgdGhpc1tTICsgMV0gPDwgODtcbiAgICAgIHJldHVybiBHICYgMzI3NjggPyBHIHwgNDI5NDkwMTc2MCA6IEc7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDIsIHRoaXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IEcgPSB0aGlzW1MgKyAxXSB8IHRoaXNbU10gPDwgODtcbiAgICAgIHJldHVybiBHICYgMzI3NjggPyBHIHwgNDI5NDkwMTc2MCA6IEc7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZEludDMyTEUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICByZXR1cm4gUyA9IFMgPj4+IDAsIFQgfHwgTChTLCA0LCB0aGlzLmxlbmd0aCksIHRoaXNbU10gfCB0aGlzW1MgKyAxXSA8PCA4IHwgdGhpc1tTICsgMl0gPDwgMTYgfCB0aGlzW1MgKyAzXSA8PCAyNDtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uKFMsIFQpIHtcbiAgICAgIHJldHVybiBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDQsIHRoaXMubGVuZ3RoKSwgdGhpc1tTXSA8PCAyNCB8IHRoaXNbUyArIDFdIDw8IDE2IHwgdGhpc1tTICsgMl0gPDwgOCB8IHRoaXNbUyArIDNdO1xuICAgIH0sIGEucHJvdG90eXBlLnJlYWRCaWdJbnQ2NExFID0gaXQoZnVuY3Rpb24oUykge1xuICAgICAgUyA9IFMgPj4+IDAsIF9lKFMsIFwib2Zmc2V0XCIpO1xuICAgICAgY29uc3QgVCA9IHRoaXNbU10sIEcgPSB0aGlzW1MgKyA3XTtcbiAgICAgIChUID09PSB2b2lkIDAgfHwgRyA9PT0gdm9pZCAwKSAmJiB4ZShTLCB0aGlzLmxlbmd0aCAtIDgpO1xuICAgICAgY29uc3QgWiA9IHRoaXNbUyArIDRdICsgdGhpc1tTICsgNV0gKiAyICoqIDggKyB0aGlzW1MgKyA2XSAqIDIgKiogMTYgKyAoRyA8PCAyNCk7XG4gICAgICByZXR1cm4gKEJpZ0ludChaKSA8PCBCaWdJbnQoMzIpKSArIEJpZ0ludChUICsgdGhpc1srK1NdICogMiAqKiA4ICsgdGhpc1srK1NdICogMiAqKiAxNiArIHRoaXNbKytTXSAqIDIgKiogMjQpO1xuICAgIH0pLCBhLnByb3RvdHlwZS5yZWFkQmlnSW50NjRCRSA9IGl0KGZ1bmN0aW9uKFMpIHtcbiAgICAgIFMgPSBTID4+PiAwLCBfZShTLCBcIm9mZnNldFwiKTtcbiAgICAgIGNvbnN0IFQgPSB0aGlzW1NdLCBHID0gdGhpc1tTICsgN107XG4gICAgICAoVCA9PT0gdm9pZCAwIHx8IEcgPT09IHZvaWQgMCkgJiYgeGUoUywgdGhpcy5sZW5ndGggLSA4KTtcbiAgICAgIGNvbnN0IFogPSAoVCA8PCAyNCkgKyAvLyBPdmVyZmxvd1xuICAgICAgdGhpc1srK1NdICogMiAqKiAxNiArIHRoaXNbKytTXSAqIDIgKiogOCArIHRoaXNbKytTXTtcbiAgICAgIHJldHVybiAoQmlnSW50KFopIDw8IEJpZ0ludCgzMikpICsgQmlnSW50KHRoaXNbKytTXSAqIDIgKiogMjQgKyB0aGlzWysrU10gKiAyICoqIDE2ICsgdGhpc1srK1NdICogMiAqKiA4ICsgRyk7XG4gICAgfSksIGEucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgcmV0dXJuIFMgPSBTID4+PiAwLCBUIHx8IEwoUywgNCwgdGhpcy5sZW5ndGgpLCB0LnJlYWQodGhpcywgUywgITAsIDIzLCA0KTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uKFMsIFQpIHtcbiAgICAgIHJldHVybiBTID0gUyA+Pj4gMCwgVCB8fCBMKFMsIDQsIHRoaXMubGVuZ3RoKSwgdC5yZWFkKHRoaXMsIFMsICExLCAyMywgNCk7XG4gICAgfSwgYS5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24oUywgVCkge1xuICAgICAgcmV0dXJuIFMgPSBTID4+PiAwLCBUIHx8IEwoUywgOCwgdGhpcy5sZW5ndGgpLCB0LnJlYWQodGhpcywgUywgITAsIDUyLCA4KTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbihTLCBUKSB7XG4gICAgICByZXR1cm4gUyA9IFMgPj4+IDAsIFQgfHwgTChTLCA4LCB0aGlzLmxlbmd0aCksIHQucmVhZCh0aGlzLCBTLCAhMSwgNTIsIDgpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gbShCLCBTLCBULCBHLCBaLCBRKSB7XG4gICAgICBpZiAoIWEuaXNCdWZmZXIoQikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO1xuICAgICAgaWYgKFMgPiBaIHx8IFMgPCBRKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtcbiAgICAgIGlmIChUICsgRyA+IEIubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtcbiAgICB9XG4gICAgYS5wcm90b3R5cGUud3JpdGVVaW50TEUgPSBhLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uKFMsIFQsIEcsIFopIHtcbiAgICAgIGlmIChTID0gK1MsIFQgPSBUID4+PiAwLCBHID0gRyA+Pj4gMCwgIVopIHtcbiAgICAgICAgY29uc3QgVWUgPSBNYXRoLnBvdygyLCA4ICogRykgLSAxO1xuICAgICAgICBtKHRoaXMsIFMsIFQsIEcsIFVlLCAwKTtcbiAgICAgIH1cbiAgICAgIGxldCBRID0gMSwgc2UgPSAwO1xuICAgICAgZm9yICh0aGlzW1RdID0gUyAmIDI1NTsgKytzZSA8IEcgJiYgKFEgKj0gMjU2KTsgKVxuICAgICAgICB0aGlzW1QgKyBzZV0gPSBTIC8gUSAmIDI1NTtcbiAgICAgIHJldHVybiBUICsgRztcbiAgICB9LCBhLnByb3RvdHlwZS53cml0ZVVpbnRCRSA9IGEucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24oUywgVCwgRywgWikge1xuICAgICAgaWYgKFMgPSArUywgVCA9IFQgPj4+IDAsIEcgPSBHID4+PiAwLCAhWikge1xuICAgICAgICBjb25zdCBVZSA9IE1hdGgucG93KDIsIDggKiBHKSAtIDE7XG4gICAgICAgIG0odGhpcywgUywgVCwgRywgVWUsIDApO1xuICAgICAgfVxuICAgICAgbGV0IFEgPSBHIC0gMSwgc2UgPSAxO1xuICAgICAgZm9yICh0aGlzW1QgKyBRXSA9IFMgJiAyNTU7IC0tUSA+PSAwICYmIChzZSAqPSAyNTYpOyApXG4gICAgICAgIHRoaXNbVCArIFFdID0gUyAvIHNlICYgMjU1O1xuICAgICAgcmV0dXJuIFQgKyBHO1xuICAgIH0sIGEucHJvdG90eXBlLndyaXRlVWludDggPSBhLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIEcgfHwgbSh0aGlzLCBTLCBULCAxLCAyNTUsIDApLCB0aGlzW1RdID0gUyAmIDI1NSwgVCArIDE7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVVaW50MTZMRSA9IGEucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gUyA9ICtTLCBUID0gVCA+Pj4gMCwgRyB8fCBtKHRoaXMsIFMsIFQsIDIsIDY1NTM1LCAwKSwgdGhpc1tUXSA9IFMgJiAyNTUsIHRoaXNbVCArIDFdID0gUyA+Pj4gOCwgVCArIDI7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVVaW50MTZCRSA9IGEucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gUyA9ICtTLCBUID0gVCA+Pj4gMCwgRyB8fCBtKHRoaXMsIFMsIFQsIDIsIDY1NTM1LCAwKSwgdGhpc1tUXSA9IFMgPj4+IDgsIHRoaXNbVCArIDFdID0gUyAmIDI1NSwgVCArIDI7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVVaW50MzJMRSA9IGEucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gUyA9ICtTLCBUID0gVCA+Pj4gMCwgRyB8fCBtKHRoaXMsIFMsIFQsIDQsIDQyOTQ5NjcyOTUsIDApLCB0aGlzW1QgKyAzXSA9IFMgPj4+IDI0LCB0aGlzW1QgKyAyXSA9IFMgPj4+IDE2LCB0aGlzW1QgKyAxXSA9IFMgPj4+IDgsIHRoaXNbVF0gPSBTICYgMjU1LCBUICsgNDtcbiAgICB9LCBhLnByb3RvdHlwZS53cml0ZVVpbnQzMkJFID0gYS5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uKFMsIFQsIEcpIHtcbiAgICAgIHJldHVybiBTID0gK1MsIFQgPSBUID4+PiAwLCBHIHx8IG0odGhpcywgUywgVCwgNCwgNDI5NDk2NzI5NSwgMCksIHRoaXNbVF0gPSBTID4+PiAyNCwgdGhpc1tUICsgMV0gPSBTID4+PiAxNiwgdGhpc1tUICsgMl0gPSBTID4+PiA4LCB0aGlzW1QgKyAzXSA9IFMgJiAyNTUsIFQgKyA0O1xuICAgIH07XG4gICAgZnVuY3Rpb24gdihCLCBTLCBULCBHLCBaKSB7XG4gICAgICB6ZShTLCBHLCBaLCBCLCBULCA3KTtcbiAgICAgIGxldCBRID0gTnVtYmVyKFMgJiBCaWdJbnQoNDI5NDk2NzI5NSkpO1xuICAgICAgQltUKytdID0gUSwgUSA9IFEgPj4gOCwgQltUKytdID0gUSwgUSA9IFEgPj4gOCwgQltUKytdID0gUSwgUSA9IFEgPj4gOCwgQltUKytdID0gUTtcbiAgICAgIGxldCBzZSA9IE51bWJlcihTID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoNDI5NDk2NzI5NSkpO1xuICAgICAgcmV0dXJuIEJbVCsrXSA9IHNlLCBzZSA9IHNlID4+IDgsIEJbVCsrXSA9IHNlLCBzZSA9IHNlID4+IDgsIEJbVCsrXSA9IHNlLCBzZSA9IHNlID4+IDgsIEJbVCsrXSA9IHNlLCBUO1xuICAgIH1cbiAgICBmdW5jdGlvbiBQKEIsIFMsIFQsIEcsIFopIHtcbiAgICAgIHplKFMsIEcsIFosIEIsIFQsIDcpO1xuICAgICAgbGV0IFEgPSBOdW1iZXIoUyAmIEJpZ0ludCg0Mjk0OTY3Mjk1KSk7XG4gICAgICBCW1QgKyA3XSA9IFEsIFEgPSBRID4+IDgsIEJbVCArIDZdID0gUSwgUSA9IFEgPj4gOCwgQltUICsgNV0gPSBRLCBRID0gUSA+PiA4LCBCW1QgKyA0XSA9IFE7XG4gICAgICBsZXQgc2UgPSBOdW1iZXIoUyA+PiBCaWdJbnQoMzIpICYgQmlnSW50KDQyOTQ5NjcyOTUpKTtcbiAgICAgIHJldHVybiBCW1QgKyAzXSA9IHNlLCBzZSA9IHNlID4+IDgsIEJbVCArIDJdID0gc2UsIHNlID0gc2UgPj4gOCwgQltUICsgMV0gPSBzZSwgc2UgPSBzZSA+PiA4LCBCW1RdID0gc2UsIFQgKyA4O1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NExFID0gaXQoZnVuY3Rpb24oUywgVCA9IDApIHtcbiAgICAgIHJldHVybiB2KHRoaXMsIFMsIFQsIEJpZ0ludCgwKSwgQmlnSW50KFwiMHhmZmZmZmZmZmZmZmZmZmZmXCIpKTtcbiAgICB9KSwgYS5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRCRSA9IGl0KGZ1bmN0aW9uKFMsIFQgPSAwKSB7XG4gICAgICByZXR1cm4gUCh0aGlzLCBTLCBULCBCaWdJbnQoMCksIEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZlwiKSk7XG4gICAgfSksIGEucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbihTLCBULCBHLCBaKSB7XG4gICAgICBpZiAoUyA9ICtTLCBUID0gVCA+Pj4gMCwgIVopIHtcbiAgICAgICAgY29uc3QgUGUgPSBNYXRoLnBvdygyLCA4ICogRyAtIDEpO1xuICAgICAgICBtKHRoaXMsIFMsIFQsIEcsIFBlIC0gMSwgLVBlKTtcbiAgICAgIH1cbiAgICAgIGxldCBRID0gMCwgc2UgPSAxLCBVZSA9IDA7XG4gICAgICBmb3IgKHRoaXNbVF0gPSBTICYgMjU1OyArK1EgPCBHICYmIChzZSAqPSAyNTYpOyApXG4gICAgICAgIFMgPCAwICYmIFVlID09PSAwICYmIHRoaXNbVCArIFEgLSAxXSAhPT0gMCAmJiAoVWUgPSAxKSwgdGhpc1tUICsgUV0gPSAoUyAvIHNlID4+IDApIC0gVWUgJiAyNTU7XG4gICAgICByZXR1cm4gVCArIEc7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uKFMsIFQsIEcsIFopIHtcbiAgICAgIGlmIChTID0gK1MsIFQgPSBUID4+PiAwLCAhWikge1xuICAgICAgICBjb25zdCBQZSA9IE1hdGgucG93KDIsIDggKiBHIC0gMSk7XG4gICAgICAgIG0odGhpcywgUywgVCwgRywgUGUgLSAxLCAtUGUpO1xuICAgICAgfVxuICAgICAgbGV0IFEgPSBHIC0gMSwgc2UgPSAxLCBVZSA9IDA7XG4gICAgICBmb3IgKHRoaXNbVCArIFFdID0gUyAmIDI1NTsgLS1RID49IDAgJiYgKHNlICo9IDI1Nik7IClcbiAgICAgICAgUyA8IDAgJiYgVWUgPT09IDAgJiYgdGhpc1tUICsgUSArIDFdICE9PSAwICYmIChVZSA9IDEpLCB0aGlzW1QgKyBRXSA9IChTIC8gc2UgPj4gMCkgLSBVZSAmIDI1NTtcbiAgICAgIHJldHVybiBUICsgRztcbiAgICB9LCBhLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gUyA9ICtTLCBUID0gVCA+Pj4gMCwgRyB8fCBtKHRoaXMsIFMsIFQsIDEsIDEyNywgLTEyOCksIFMgPCAwICYmIChTID0gMjU1ICsgUyArIDEpLCB0aGlzW1RdID0gUyAmIDI1NSwgVCArIDE7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIEcgfHwgbSh0aGlzLCBTLCBULCAyLCAzMjc2NywgLTMyNzY4KSwgdGhpc1tUXSA9IFMgJiAyNTUsIHRoaXNbVCArIDFdID0gUyA+Pj4gOCwgVCArIDI7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIEcgfHwgbSh0aGlzLCBTLCBULCAyLCAzMjc2NywgLTMyNzY4KSwgdGhpc1tUXSA9IFMgPj4+IDgsIHRoaXNbVCArIDFdID0gUyAmIDI1NSwgVCArIDI7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIEcgfHwgbSh0aGlzLCBTLCBULCA0LCAyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzY0OCksIHRoaXNbVF0gPSBTICYgMjU1LCB0aGlzW1QgKyAxXSA9IFMgPj4+IDgsIHRoaXNbVCArIDJdID0gUyA+Pj4gMTYsIHRoaXNbVCArIDNdID0gUyA+Pj4gMjQsIFQgKyA0O1xuICAgIH0sIGEucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uKFMsIFQsIEcpIHtcbiAgICAgIHJldHVybiBTID0gK1MsIFQgPSBUID4+PiAwLCBHIHx8IG0odGhpcywgUywgVCwgNCwgMjE0NzQ4MzY0NywgLTIxNDc0ODM2NDgpLCBTIDwgMCAmJiAoUyA9IDQyOTQ5NjcyOTUgKyBTICsgMSksIHRoaXNbVF0gPSBTID4+PiAyNCwgdGhpc1tUICsgMV0gPSBTID4+PiAxNiwgdGhpc1tUICsgMl0gPSBTID4+PiA4LCB0aGlzW1QgKyAzXSA9IFMgJiAyNTUsIFQgKyA0O1xuICAgIH0sIGEucHJvdG90eXBlLndyaXRlQmlnSW50NjRMRSA9IGl0KGZ1bmN0aW9uKFMsIFQgPSAwKSB7XG4gICAgICByZXR1cm4gdih0aGlzLCBTLCBULCAtQmlnSW50KFwiMHg4MDAwMDAwMDAwMDAwMDAwXCIpLCBCaWdJbnQoXCIweDdmZmZmZmZmZmZmZmZmZmZcIikpO1xuICAgIH0pLCBhLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkUgPSBpdChmdW5jdGlvbihTLCBUID0gMCkge1xuICAgICAgcmV0dXJuIFAodGhpcywgUywgVCwgLUJpZ0ludChcIjB4ODAwMDAwMDAwMDAwMDAwMFwiKSwgQmlnSW50KFwiMHg3ZmZmZmZmZmZmZmZmZmZmXCIpKTtcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBOKEIsIFMsIFQsIEcsIFosIFEpIHtcbiAgICAgIGlmIChUICsgRyA+IEIubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTtcbiAgICAgIGlmIChUIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFkoQiwgUywgVCwgRywgWikge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIFogfHwgTihCLCBTLCBULCA0KSwgdC53cml0ZShCLCBTLCBULCBHLCAyMywgNCksIFQgKyA0O1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbihTLCBULCBHKSB7XG4gICAgICByZXR1cm4gWSh0aGlzLCBTLCBULCAhMCwgRyk7XG4gICAgfSwgYS5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIFkodGhpcywgUywgVCwgITEsIEcpO1xuICAgIH07XG4gICAgZnVuY3Rpb24gZWUoQiwgUywgVCwgRywgWikge1xuICAgICAgcmV0dXJuIFMgPSArUywgVCA9IFQgPj4+IDAsIFogfHwgTihCLCBTLCBULCA4KSwgdC53cml0ZShCLCBTLCBULCBHLCA1MiwgOCksIFQgKyA4O1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS53cml0ZURvdWJsZUxFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIGVlKHRoaXMsIFMsIFQsICEwLCBHKTtcbiAgICB9LCBhLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24oUywgVCwgRykge1xuICAgICAgcmV0dXJuIGVlKHRoaXMsIFMsIFQsICExLCBHKTtcbiAgICB9LCBhLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oUywgVCwgRywgWikge1xuICAgICAgaWYgKCFhLmlzQnVmZmVyKFMpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXJndW1lbnQgc2hvdWxkIGJlIGEgQnVmZmVyXCIpO1xuICAgICAgaWYgKEcgfHwgKEcgPSAwKSwgIVogJiYgWiAhPT0gMCAmJiAoWiA9IHRoaXMubGVuZ3RoKSwgVCA+PSBTLmxlbmd0aCAmJiAoVCA9IFMubGVuZ3RoKSwgVCB8fCAoVCA9IDApLCBaID4gMCAmJiBaIDwgRyAmJiAoWiA9IEcpLCBaID09PSBHIHx8IFMubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMDtcbiAgICAgIGlmIChUIDwgMClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzXCIpO1xuICAgICAgaWYgKEcgPCAwIHx8IEcgPj0gdGhpcy5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgaWYgKFogPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNvdXJjZUVuZCBvdXQgb2YgYm91bmRzXCIpO1xuICAgICAgWiA+IHRoaXMubGVuZ3RoICYmIChaID0gdGhpcy5sZW5ndGgpLCBTLmxlbmd0aCAtIFQgPCBaIC0gRyAmJiAoWiA9IFMubGVuZ3RoIC0gVCArIEcpO1xuICAgICAgY29uc3QgUSA9IFogLSBHO1xuICAgICAgcmV0dXJuIHRoaXMgPT09IFMgJiYgdHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmNvcHlXaXRoaW4gPT0gXCJmdW5jdGlvblwiID8gdGhpcy5jb3B5V2l0aGluKFQsIEcsIFopIDogVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICAgIFMsXG4gICAgICAgIHRoaXMuc3ViYXJyYXkoRywgWiksXG4gICAgICAgIFRcbiAgICAgICksIFE7XG4gICAgfSwgYS5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uKFMsIFQsIEcsIFopIHtcbiAgICAgIGlmICh0eXBlb2YgUyA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGlmICh0eXBlb2YgVCA9PSBcInN0cmluZ1wiID8gKFogPSBULCBUID0gMCwgRyA9IHRoaXMubGVuZ3RoKSA6IHR5cGVvZiBHID09IFwic3RyaW5nXCIgJiYgKFogPSBHLCBHID0gdGhpcy5sZW5ndGgpLCBaICE9PSB2b2lkIDAgJiYgdHlwZW9mIFogIT0gXCJzdHJpbmdcIilcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZ1wiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBaID09IFwic3RyaW5nXCIgJiYgIWEuaXNFbmNvZGluZyhaKSlcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiVW5rbm93biBlbmNvZGluZzogXCIgKyBaKTtcbiAgICAgICAgaWYgKFMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY29uc3Qgc2UgPSBTLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgICAgKFogPT09IFwidXRmOFwiICYmIHNlIDwgMTI4IHx8IFogPT09IFwibGF0aW4xXCIpICYmIChTID0gc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgdHlwZW9mIFMgPT0gXCJudW1iZXJcIiA/IFMgPSBTICYgMjU1IDogdHlwZW9mIFMgPT0gXCJib29sZWFuXCIgJiYgKFMgPSBOdW1iZXIoUykpO1xuICAgICAgaWYgKFQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgVCB8fCB0aGlzLmxlbmd0aCA8IEcpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiT3V0IG9mIHJhbmdlIGluZGV4XCIpO1xuICAgICAgaWYgKEcgPD0gVClcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICBUID0gVCA+Pj4gMCwgRyA9IEcgPT09IHZvaWQgMCA/IHRoaXMubGVuZ3RoIDogRyA+Pj4gMCwgUyB8fCAoUyA9IDApO1xuICAgICAgbGV0IFE7XG4gICAgICBpZiAodHlwZW9mIFMgPT0gXCJudW1iZXJcIilcbiAgICAgICAgZm9yIChRID0gVDsgUSA8IEc7ICsrUSlcbiAgICAgICAgICB0aGlzW1FdID0gUztcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBzZSA9IGEuaXNCdWZmZXIoUykgPyBTIDogYS5mcm9tKFMsIFopLCBVZSA9IHNlLmxlbmd0aDtcbiAgICAgICAgaWYgKFVlID09PSAwKVxuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBTICsgJ1wiIGlzIGludmFsaWQgZm9yIGFyZ3VtZW50IFwidmFsdWVcIicpO1xuICAgICAgICBmb3IgKFEgPSAwOyBRIDwgRyAtIFQ7ICsrUSlcbiAgICAgICAgICB0aGlzW1EgKyBUXSA9IHNlW1EgJSBVZV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICAgIGNvbnN0IGllID0ge307XG4gICAgZnVuY3Rpb24gbGUoQiwgUywgVCkge1xuICAgICAgaWVbQl0gPSBjbGFzcyBleHRlbmRzIFQge1xuICAgICAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgICBzdXBlcigpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJtZXNzYWdlXCIsIHtcbiAgICAgICAgICAgIHZhbHVlOiBTLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksXG4gICAgICAgICAgICB3cml0YWJsZTogITAsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEwXG4gICAgICAgICAgfSksIHRoaXMubmFtZSA9IGAke3RoaXMubmFtZX0gWyR7Qn1dYCwgdGhpcy5zdGFjaywgZGVsZXRlIHRoaXMubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBnZXQgY29kZSgpIHtcbiAgICAgICAgICByZXR1cm4gQjtcbiAgICAgICAgfVxuICAgICAgICBzZXQgY29kZShaKSB7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICAgICAgICB2YWx1ZTogWixcbiAgICAgICAgICAgIHdyaXRhYmxlOiAhMFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgIHJldHVybiBgJHt0aGlzLm5hbWV9IFske0J9XTogJHt0aGlzLm1lc3NhZ2V9YDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgbGUoXG4gICAgICBcIkVSUl9CVUZGRVJfT1VUX09GX0JPVU5EU1wiLFxuICAgICAgZnVuY3Rpb24oQikge1xuICAgICAgICByZXR1cm4gQiA/IGAke0J9IGlzIG91dHNpZGUgb2YgYnVmZmVyIGJvdW5kc2AgOiBcIkF0dGVtcHQgdG8gYWNjZXNzIG1lbW9yeSBvdXRzaWRlIGJ1ZmZlciBib3VuZHNcIjtcbiAgICAgIH0sXG4gICAgICBSYW5nZUVycm9yXG4gICAgKSwgbGUoXG4gICAgICBcIkVSUl9JTlZBTElEX0FSR19UWVBFXCIsXG4gICAgICBmdW5jdGlvbihCLCBTKSB7XG4gICAgICAgIHJldHVybiBgVGhlIFwiJHtCfVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgU31gO1xuICAgICAgfSxcbiAgICAgIFR5cGVFcnJvclxuICAgICksIGxlKFxuICAgICAgXCJFUlJfT1VUX09GX1JBTkdFXCIsXG4gICAgICBmdW5jdGlvbihCLCBTLCBUKSB7XG4gICAgICAgIGxldCBHID0gYFRoZSB2YWx1ZSBvZiBcIiR7Qn1cIiBpcyBvdXQgb2YgcmFuZ2UuYCwgWiA9IFQ7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKFQpICYmIE1hdGguYWJzKFQpID4gMiAqKiAzMiA/IFogPSBUZShTdHJpbmcoVCkpIDogdHlwZW9mIFQgPT0gXCJiaWdpbnRcIiAmJiAoWiA9IFN0cmluZyhUKSwgKFQgPiBCaWdJbnQoMikgKiogQmlnSW50KDMyKSB8fCBUIDwgLShCaWdJbnQoMikgKiogQmlnSW50KDMyKSkpICYmIChaID0gVGUoWikpLCBaICs9IFwiblwiKSwgRyArPSBgIEl0IG11c3QgYmUgJHtTfS4gUmVjZWl2ZWQgJHtafWAsIEc7XG4gICAgICB9LFxuICAgICAgUmFuZ2VFcnJvclxuICAgICk7XG4gICAgZnVuY3Rpb24gVGUoQikge1xuICAgICAgbGV0IFMgPSBcIlwiLCBUID0gQi5sZW5ndGg7XG4gICAgICBjb25zdCBHID0gQlswXSA9PT0gXCItXCIgPyAxIDogMDtcbiAgICAgIGZvciAoOyBUID49IEcgKyA0OyBUIC09IDMpXG4gICAgICAgIFMgPSBgXyR7Qi5zbGljZShUIC0gMywgVCl9JHtTfWA7XG4gICAgICByZXR1cm4gYCR7Qi5zbGljZSgwLCBUKX0ke1N9YDtcbiAgICB9XG4gICAgZnVuY3Rpb24gRGUoQiwgUywgVCkge1xuICAgICAgX2UoUywgXCJvZmZzZXRcIiksIChCW1NdID09PSB2b2lkIDAgfHwgQltTICsgVF0gPT09IHZvaWQgMCkgJiYgeGUoUywgQi5sZW5ndGggLSAoVCArIDEpKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gemUoQiwgUywgVCwgRywgWiwgUSkge1xuICAgICAgaWYgKEIgPiBUIHx8IEIgPCBTKSB7XG4gICAgICAgIGNvbnN0IHNlID0gdHlwZW9mIFMgPT0gXCJiaWdpbnRcIiA/IFwiblwiIDogXCJcIjtcbiAgICAgICAgbGV0IFVlO1xuICAgICAgICB0aHJvdyBTID09PSAwIHx8IFMgPT09IEJpZ0ludCgwKSA/IFVlID0gYD49IDAke3NlfSBhbmQgPCAyJHtzZX0gKiogJHsoUSArIDEpICogOH0ke3NlfWAgOiBVZSA9IGA+PSAtKDIke3NlfSAqKiAkeyhRICsgMSkgKiA4IC0gMX0ke3NlfSkgYW5kIDwgMiAqKiAkeyhRICsgMSkgKiA4IC0gMX0ke3NlfWAsIG5ldyBpZS5FUlJfT1VUX09GX1JBTkdFKFwidmFsdWVcIiwgVWUsIEIpO1xuICAgICAgfVxuICAgICAgRGUoRywgWiwgUSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIF9lKEIsIFMpIHtcbiAgICAgIGlmICh0eXBlb2YgQiAhPSBcIm51bWJlclwiKVxuICAgICAgICB0aHJvdyBuZXcgaWUuRVJSX0lOVkFMSURfQVJHX1RZUEUoUywgXCJudW1iZXJcIiwgQik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHhlKEIsIFMsIFQpIHtcbiAgICAgIHRocm93IE1hdGguZmxvb3IoQikgIT09IEIgPyAoX2UoQiwgVCksIG5ldyBpZS5FUlJfT1VUX09GX1JBTkdFKFwib2Zmc2V0XCIsIFwiYW4gaW50ZWdlclwiLCBCKSkgOiBTIDwgMCA/IG5ldyBpZS5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMoKSA6IG5ldyBpZS5FUlJfT1VUX09GX1JBTkdFKFxuICAgICAgICBcIm9mZnNldFwiLFxuICAgICAgICBgPj0gMCBhbmQgPD0gJHtTfWAsXG4gICAgICAgIEJcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IEJlID0gL1teKy8wLTlBLVphLXotX10vZztcbiAgICBmdW5jdGlvbiB5ZShCKSB7XG4gICAgICBpZiAoQiA9IEIuc3BsaXQoXCI9XCIpWzBdLCBCID0gQi50cmltKCkucmVwbGFjZShCZSwgXCJcIiksIEIubGVuZ3RoIDwgMikgcmV0dXJuIFwiXCI7XG4gICAgICBmb3IgKDsgQi5sZW5ndGggJSA0ICE9PSAwOyApXG4gICAgICAgIEIgPSBCICsgXCI9XCI7XG4gICAgICByZXR1cm4gQjtcbiAgICB9XG4gICAgZnVuY3Rpb24gYmUoQiwgUykge1xuICAgICAgUyA9IFMgfHwgMSAvIDA7XG4gICAgICBsZXQgVDtcbiAgICAgIGNvbnN0IEcgPSBCLmxlbmd0aDtcbiAgICAgIGxldCBaID0gbnVsbDtcbiAgICAgIGNvbnN0IFEgPSBbXTtcbiAgICAgIGZvciAobGV0IHNlID0gMDsgc2UgPCBHOyArK3NlKSB7XG4gICAgICAgIGlmIChUID0gQi5jaGFyQ29kZUF0KHNlKSwgVCA+IDU1Mjk1ICYmIFQgPCA1NzM0NCkge1xuICAgICAgICAgIGlmICghWikge1xuICAgICAgICAgICAgaWYgKFQgPiA1NjMxOSkge1xuICAgICAgICAgICAgICAoUyAtPSAzKSA+IC0xICYmIFEucHVzaCgyMzksIDE5MSwgMTg5KTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHNlICsgMSA9PT0gRykge1xuICAgICAgICAgICAgICAoUyAtPSAzKSA+IC0xICYmIFEucHVzaCgyMzksIDE5MSwgMTg5KTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBaID0gVDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoVCA8IDU2MzIwKSB7XG4gICAgICAgICAgICAoUyAtPSAzKSA+IC0xICYmIFEucHVzaCgyMzksIDE5MSwgMTg5KSwgWiA9IFQ7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgVCA9IChaIC0gNTUyOTYgPDwgMTAgfCBUIC0gNTYzMjApICsgNjU1MzY7XG4gICAgICAgIH0gZWxzZSBaICYmIChTIC09IDMpID4gLTEgJiYgUS5wdXNoKDIzOSwgMTkxLCAxODkpO1xuICAgICAgICBpZiAoWiA9IG51bGwsIFQgPCAxMjgpIHtcbiAgICAgICAgICBpZiAoKFMgLT0gMSkgPCAwKSBicmVhaztcbiAgICAgICAgICBRLnB1c2goVCk7XG4gICAgICAgIH0gZWxzZSBpZiAoVCA8IDIwNDgpIHtcbiAgICAgICAgICBpZiAoKFMgLT0gMikgPCAwKSBicmVhaztcbiAgICAgICAgICBRLnB1c2goXG4gICAgICAgICAgICBUID4+IDYgfCAxOTIsXG4gICAgICAgICAgICBUICYgNjMgfCAxMjhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKFQgPCA2NTUzNikge1xuICAgICAgICAgIGlmICgoUyAtPSAzKSA8IDApIGJyZWFrO1xuICAgICAgICAgIFEucHVzaChcbiAgICAgICAgICAgIFQgPj4gMTIgfCAyMjQsXG4gICAgICAgICAgICBUID4+IDYgJiA2MyB8IDEyOCxcbiAgICAgICAgICAgIFQgJiA2MyB8IDEyOFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoVCA8IDExMTQxMTIpIHtcbiAgICAgICAgICBpZiAoKFMgLT0gNCkgPCAwKSBicmVhaztcbiAgICAgICAgICBRLnB1c2goXG4gICAgICAgICAgICBUID4+IDE4IHwgMjQwLFxuICAgICAgICAgICAgVCA+PiAxMiAmIDYzIHwgMTI4LFxuICAgICAgICAgICAgVCA+PiA2ICYgNjMgfCAxMjgsXG4gICAgICAgICAgICBUICYgNjMgfCAxMjhcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvZGUgcG9pbnRcIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gUTtcbiAgICB9XG4gICAgZnVuY3Rpb24gRmUoQikge1xuICAgICAgY29uc3QgUyA9IFtdO1xuICAgICAgZm9yIChsZXQgVCA9IDA7IFQgPCBCLmxlbmd0aDsgKytUKVxuICAgICAgICBTLnB1c2goQi5jaGFyQ29kZUF0KFQpICYgMjU1KTtcbiAgICAgIHJldHVybiBTO1xuICAgIH1cbiAgICBmdW5jdGlvbiBYZShCLCBTKSB7XG4gICAgICBsZXQgVCwgRywgWjtcbiAgICAgIGNvbnN0IFEgPSBbXTtcbiAgICAgIGZvciAobGV0IHNlID0gMDsgc2UgPCBCLmxlbmd0aCAmJiAhKChTIC09IDIpIDwgMCk7ICsrc2UpXG4gICAgICAgIFQgPSBCLmNoYXJDb2RlQXQoc2UpLCBHID0gVCA+PiA4LCBaID0gVCAlIDI1NiwgUS5wdXNoKFopLCBRLnB1c2goRyk7XG4gICAgICByZXR1cm4gUTtcbiAgICB9XG4gICAgZnVuY3Rpb24gd2UoQikge1xuICAgICAgcmV0dXJuIGUudG9CeXRlQXJyYXkoeWUoQikpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBOZShCLCBTLCBULCBHKSB7XG4gICAgICBsZXQgWjtcbiAgICAgIGZvciAoWiA9IDA7IFogPCBHICYmICEoWiArIFQgPj0gUy5sZW5ndGggfHwgWiA+PSBCLmxlbmd0aCk7ICsrWilcbiAgICAgICAgU1taICsgVF0gPSBCW1pdO1xuICAgICAgcmV0dXJuIFo7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGR0KEIsIFMpIHtcbiAgICAgIHJldHVybiBCIGluc3RhbmNlb2YgUyB8fCBCICE9IG51bGwgJiYgQi5jb25zdHJ1Y3RvciAhPSBudWxsICYmIEIuY29uc3RydWN0b3IubmFtZSAhPSBudWxsICYmIEIuY29uc3RydWN0b3IubmFtZSA9PT0gUy5uYW1lO1xuICAgIH1cbiAgICBmdW5jdGlvbiBKZShCKSB7XG4gICAgICByZXR1cm4gQiAhPT0gQjtcbiAgICB9XG4gICAgY29uc3QgUWUgPSAoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBCID0gXCIwMTIzNDU2Nzg5YWJjZGVmXCIsIFMgPSBuZXcgQXJyYXkoMjU2KTtcbiAgICAgIGZvciAobGV0IFQgPSAwOyBUIDwgMTY7ICsrVCkge1xuICAgICAgICBjb25zdCBHID0gVCAqIDE2O1xuICAgICAgICBmb3IgKGxldCBaID0gMDsgWiA8IDE2OyArK1opXG4gICAgICAgICAgU1tHICsgWl0gPSBCW1RdICsgQltaXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBTO1xuICAgIH0pKCk7XG4gICAgZnVuY3Rpb24gaXQoQikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBCaWdJbnQgPiBcInVcIiA/IGplIDogQjtcbiAgICB9XG4gICAgZnVuY3Rpb24gamUoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCaWdJbnQgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG4gIH0pKEdhKSksIEdhO1xufVxudmFyIEhlID0gS2MoKTtcbmNvbnN0IGxuID0gdHlwZW9mIGdsb2JhbFRoaXMgPT0gXCJvYmplY3RcIiAmJiBcImNyeXB0b1wiIGluIGdsb2JhbFRoaXMgPyBnbG9iYWxUaGlzLmNyeXB0byA6IHZvaWQgMDtcbi8qISBub2JsZS1oYXNoZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmZ1bmN0aW9uIElpKHMpIHtcbiAgcmV0dXJuIHMgaW5zdGFuY2VvZiBVaW50OEFycmF5IHx8IEFycmF5QnVmZmVyLmlzVmlldyhzKSAmJiBzLmNvbnN0cnVjdG9yLm5hbWUgPT09IFwiVWludDhBcnJheVwiO1xufVxuZnVuY3Rpb24gWGwocykge1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHMpIHx8IHMgPCAwKVxuICAgIHRocm93IG5ldyBFcnJvcihcInBvc2l0aXZlIGludGVnZXIgZXhwZWN0ZWQsIGdvdCBcIiArIHMpO1xufVxuZnVuY3Rpb24gUXMocywgLi4uZSkge1xuICBpZiAoIUlpKHMpKVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVpbnQ4QXJyYXkgZXhwZWN0ZWRcIik7XG4gIGlmIChlLmxlbmd0aCA+IDAgJiYgIWUuaW5jbHVkZXMocy5sZW5ndGgpKVxuICAgIHRocm93IG5ldyBFcnJvcihcIlVpbnQ4QXJyYXkgZXhwZWN0ZWQgb2YgbGVuZ3RoIFwiICsgZSArIFwiLCBnb3QgbGVuZ3RoPVwiICsgcy5sZW5ndGgpO1xufVxuZnVuY3Rpb24gSGYocykge1xuICBpZiAodHlwZW9mIHMgIT0gXCJmdW5jdGlvblwiIHx8IHR5cGVvZiBzLmNyZWF0ZSAhPSBcImZ1bmN0aW9uXCIpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSGFzaCBzaG91bGQgYmUgd3JhcHBlZCBieSB1dGlscy5jcmVhdGVIYXNoZXJcIik7XG4gIFhsKHMub3V0cHV0TGVuKSwgWGwocy5ibG9ja0xlbik7XG59XG5mdW5jdGlvbiBEbyhzLCBlID0gITApIHtcbiAgaWYgKHMuZGVzdHJveWVkKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkhhc2ggaW5zdGFuY2UgaGFzIGJlZW4gZGVzdHJveWVkXCIpO1xuICBpZiAoZSAmJiBzLmZpbmlzaGVkKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkhhc2gjZGlnZXN0KCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWRcIik7XG59XG5mdW5jdGlvbiBPMShzLCBlKSB7XG4gIFFzKHMpO1xuICBjb25zdCB0ID0gZS5vdXRwdXRMZW47XG4gIGlmIChzLmxlbmd0aCA8IHQpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiZGlnZXN0SW50bygpIGV4cGVjdHMgb3V0cHV0IGJ1ZmZlciBvZiBsZW5ndGggYXQgbGVhc3QgXCIgKyB0KTtcbn1cbmZ1bmN0aW9uIGtuKC4uLnMpIHtcbiAgZm9yIChsZXQgZSA9IDA7IGUgPCBzLmxlbmd0aDsgZSsrKVxuICAgIHNbZV0uZmlsbCgwKTtcbn1cbmZ1bmN0aW9uIFZhKHMpIHtcbiAgcmV0dXJuIG5ldyBEYXRhVmlldyhzLmJ1ZmZlciwgcy5ieXRlT2Zmc2V0LCBzLmJ5dGVMZW5ndGgpO1xufVxuZnVuY3Rpb24gTnIocywgZSkge1xuICByZXR1cm4gcyA8PCAzMiAtIGUgfCBzID4+PiBlO1xufVxuY29uc3QgcWYgPSAvKiBAdHMtaWdub3JlICovIHR5cGVvZiBVaW50OEFycmF5LmZyb20oW10pLnRvSGV4ID09IFwiZnVuY3Rpb25cIiAmJiB0eXBlb2YgVWludDhBcnJheS5mcm9tSGV4ID09IFwiZnVuY3Rpb25cIiwgQjEgPSAvKiBAX19QVVJFX18gKi8gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjU2IH0sIChzLCBlKSA9PiBlLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCBcIjBcIikpO1xuZnVuY3Rpb24gSHMocykge1xuICBpZiAoUXMocyksIHFmKVxuICAgIHJldHVybiBzLnRvSGV4KCk7XG4gIGxldCBlID0gXCJcIjtcbiAgZm9yIChsZXQgdCA9IDA7IHQgPCBzLmxlbmd0aDsgdCsrKVxuICAgIGUgKz0gQjFbc1t0XV07XG4gIHJldHVybiBlO1xufVxuY29uc3QgcnMgPSB7IF8wOiA0OCwgXzk6IDU3LCBBOiA2NSwgRjogNzAsIGE6IDk3LCBmOiAxMDIgfTtcbmZ1bmN0aW9uIGNkKHMpIHtcbiAgaWYgKHMgPj0gcnMuXzAgJiYgcyA8PSBycy5fOSlcbiAgICByZXR1cm4gcyAtIHJzLl8wO1xuICBpZiAocyA+PSBycy5BICYmIHMgPD0gcnMuRilcbiAgICByZXR1cm4gcyAtIChycy5BIC0gMTApO1xuICBpZiAocyA+PSBycy5hICYmIHMgPD0gcnMuZilcbiAgICByZXR1cm4gcyAtIChycy5hIC0gMTApO1xufVxuZnVuY3Rpb24gUG8ocykge1xuICBpZiAodHlwZW9mIHMgIT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgXCIgKyB0eXBlb2Ygcyk7XG4gIGlmIChxZilcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tSGV4KHMpO1xuICBjb25zdCBlID0gcy5sZW5ndGgsIHQgPSBlIC8gMjtcbiAgaWYgKGUgJSAyKVxuICAgIHRocm93IG5ldyBFcnJvcihcImhleCBzdHJpbmcgZXhwZWN0ZWQsIGdvdCB1bnBhZGRlZCBoZXggb2YgbGVuZ3RoIFwiICsgZSk7XG4gIGNvbnN0IHIgPSBuZXcgVWludDhBcnJheSh0KTtcbiAgZm9yIChsZXQgbiA9IDAsIGkgPSAwOyBuIDwgdDsgbisrLCBpICs9IDIpIHtcbiAgICBjb25zdCBvID0gY2Qocy5jaGFyQ29kZUF0KGkpKSwgYSA9IGNkKHMuY2hhckNvZGVBdChpICsgMSkpO1xuICAgIGlmIChvID09PSB2b2lkIDAgfHwgYSA9PT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBsID0gc1tpXSArIHNbaSArIDFdO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3Qgbm9uLWhleCBjaGFyYWN0ZXIgXCInICsgbCArICdcIiBhdCBpbmRleCAnICsgaSk7XG4gICAgfVxuICAgIHJbbl0gPSBvICogMTYgKyBhO1xuICB9XG4gIHJldHVybiByO1xufVxuZnVuY3Rpb24gRjEocykge1xuICBpZiAodHlwZW9mIHMgIT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdHJpbmcgZXhwZWN0ZWRcIik7XG4gIHJldHVybiBuZXcgVWludDhBcnJheShuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUocykpO1xufVxuZnVuY3Rpb24gSGMocykge1xuICByZXR1cm4gdHlwZW9mIHMgPT0gXCJzdHJpbmdcIiAmJiAocyA9IEYxKHMpKSwgUXMocyksIHM7XG59XG5mdW5jdGlvbiBLciguLi5zKSB7XG4gIGxldCBlID0gMDtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCBzLmxlbmd0aDsgcisrKSB7XG4gICAgY29uc3QgbiA9IHNbcl07XG4gICAgUXMobiksIGUgKz0gbi5sZW5ndGg7XG4gIH1cbiAgY29uc3QgdCA9IG5ldyBVaW50OEFycmF5KGUpO1xuICBmb3IgKGxldCByID0gMCwgbiA9IDA7IHIgPCBzLmxlbmd0aDsgcisrKSB7XG4gICAgY29uc3QgaSA9IHNbcl07XG4gICAgdC5zZXQoaSwgbiksIG4gKz0gaS5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIHQ7XG59XG5jbGFzcyBXZiB7XG59XG5mdW5jdGlvbiB6ZihzKSB7XG4gIGNvbnN0IGUgPSAocikgPT4gcygpLnVwZGF0ZShIYyhyKSkuZGlnZXN0KCksIHQgPSBzKCk7XG4gIHJldHVybiBlLm91dHB1dExlbiA9IHQub3V0cHV0TGVuLCBlLmJsb2NrTGVuID0gdC5ibG9ja0xlbiwgZS5jcmVhdGUgPSAoKSA9PiBzKCksIGU7XG59XG5mdW5jdGlvbiBxYyhzID0gMzIpIHtcbiAgaWYgKGxuICYmIHR5cGVvZiBsbi5nZXRSYW5kb21WYWx1ZXMgPT0gXCJmdW5jdGlvblwiKVxuICAgIHJldHVybiBsbi5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkocykpO1xuICBpZiAobG4gJiYgdHlwZW9mIGxuLnJhbmRvbUJ5dGVzID09IFwiZnVuY3Rpb25cIilcbiAgICByZXR1cm4gVWludDhBcnJheS5mcm9tKGxuLnJhbmRvbUJ5dGVzKHMpKTtcbiAgdGhyb3cgbmV3IEVycm9yKFwiY3J5cHRvLmdldFJhbmRvbVZhbHVlcyBtdXN0IGJlIGRlZmluZWRcIik7XG59XG5mdW5jdGlvbiBOMShzLCBlLCB0LCByKSB7XG4gIGlmICh0eXBlb2Ygcy5zZXRCaWdVaW50NjQgPT0gXCJmdW5jdGlvblwiKVxuICAgIHJldHVybiBzLnNldEJpZ1VpbnQ2NChlLCB0LCByKTtcbiAgY29uc3QgbiA9IEJpZ0ludCgzMiksIGkgPSBCaWdJbnQoNDI5NDk2NzI5NSksIG8gPSBOdW1iZXIodCA+PiBuICYgaSksIGEgPSBOdW1iZXIodCAmIGkpLCBsID0gciA/IDQgOiAwLCBjID0gciA/IDAgOiA0O1xuICBzLnNldFVpbnQzMihlICsgbCwgbywgciksIHMuc2V0VWludDMyKGUgKyBjLCBhLCByKTtcbn1cbmZ1bmN0aW9uIFUxKHMsIGUsIHQpIHtcbiAgcmV0dXJuIHMgJiBlIF4gfnMgJiB0O1xufVxuZnVuY3Rpb24gJDEocywgZSwgdCkge1xuICByZXR1cm4gcyAmIGUgXiBzICYgdCBeIGUgJiB0O1xufVxuY2xhc3MgWWYgZXh0ZW5kcyBXZiB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4pIHtcbiAgICBzdXBlcigpLCB0aGlzLmZpbmlzaGVkID0gITEsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy5wb3MgPSAwLCB0aGlzLmRlc3Ryb3llZCA9ICExLCB0aGlzLmJsb2NrTGVuID0gZSwgdGhpcy5vdXRwdXRMZW4gPSB0LCB0aGlzLnBhZE9mZnNldCA9IHIsIHRoaXMuaXNMRSA9IG4sIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoZSksIHRoaXMudmlldyA9IFZhKHRoaXMuYnVmZmVyKTtcbiAgfVxuICB1cGRhdGUoZSkge1xuICAgIERvKHRoaXMpLCBlID0gSGMoZSksIFFzKGUpO1xuICAgIGNvbnN0IHsgdmlldzogdCwgYnVmZmVyOiByLCBibG9ja0xlbjogbiB9ID0gdGhpcywgaSA9IGUubGVuZ3RoO1xuICAgIGZvciAobGV0IG8gPSAwOyBvIDwgaTsgKSB7XG4gICAgICBjb25zdCBhID0gTWF0aC5taW4obiAtIHRoaXMucG9zLCBpIC0gbyk7XG4gICAgICBpZiAoYSA9PT0gbikge1xuICAgICAgICBjb25zdCBsID0gVmEoZSk7XG4gICAgICAgIGZvciAoOyBuIDw9IGkgLSBvOyBvICs9IG4pXG4gICAgICAgICAgdGhpcy5wcm9jZXNzKGwsIG8pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHIuc2V0KGUuc3ViYXJyYXkobywgbyArIGEpLCB0aGlzLnBvcyksIHRoaXMucG9zICs9IGEsIG8gKz0gYSwgdGhpcy5wb3MgPT09IG4gJiYgKHRoaXMucHJvY2Vzcyh0LCAwKSwgdGhpcy5wb3MgPSAwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoICs9IGUubGVuZ3RoLCB0aGlzLnJvdW5kQ2xlYW4oKSwgdGhpcztcbiAgfVxuICBkaWdlc3RJbnRvKGUpIHtcbiAgICBEbyh0aGlzKSwgTzEoZSwgdGhpcyksIHRoaXMuZmluaXNoZWQgPSAhMDtcbiAgICBjb25zdCB7IGJ1ZmZlcjogdCwgdmlldzogciwgYmxvY2tMZW46IG4sIGlzTEU6IGkgfSA9IHRoaXM7XG4gICAgbGV0IHsgcG9zOiBvIH0gPSB0aGlzO1xuICAgIHRbbysrXSA9IDEyOCwga24odGhpcy5idWZmZXIuc3ViYXJyYXkobykpLCB0aGlzLnBhZE9mZnNldCA+IG4gLSBvICYmICh0aGlzLnByb2Nlc3MociwgMCksIG8gPSAwKTtcbiAgICBmb3IgKGxldCBkID0gbzsgZCA8IG47IGQrKylcbiAgICAgIHRbZF0gPSAwO1xuICAgIE4xKHIsIG4gLSA4LCBCaWdJbnQodGhpcy5sZW5ndGggKiA4KSwgaSksIHRoaXMucHJvY2VzcyhyLCAwKTtcbiAgICBjb25zdCBhID0gVmEoZSksIGwgPSB0aGlzLm91dHB1dExlbjtcbiAgICBpZiAobCAlIDQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJfc2hhMjogb3V0cHV0TGVuIHNob3VsZCBiZSBhbGlnbmVkIHRvIDMyYml0XCIpO1xuICAgIGNvbnN0IGMgPSBsIC8gNCwgdSA9IHRoaXMuZ2V0KCk7XG4gICAgaWYgKGMgPiB1Lmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIl9zaGEyOiBvdXRwdXRMZW4gYmlnZ2VyIHRoYW4gc3RhdGVcIik7XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBjOyBkKyspXG4gICAgICBhLnNldFVpbnQzMig0ICogZCwgdVtkXSwgaSk7XG4gIH1cbiAgZGlnZXN0KCkge1xuICAgIGNvbnN0IHsgYnVmZmVyOiBlLCBvdXRwdXRMZW46IHQgfSA9IHRoaXM7XG4gICAgdGhpcy5kaWdlc3RJbnRvKGUpO1xuICAgIGNvbnN0IHIgPSBlLnNsaWNlKDAsIHQpO1xuICAgIHJldHVybiB0aGlzLmRlc3Ryb3koKSwgcjtcbiAgfVxuICBfY2xvbmVJbnRvKGUpIHtcbiAgICBlIHx8IChlID0gbmV3IHRoaXMuY29uc3RydWN0b3IoKSksIGUuc2V0KC4uLnRoaXMuZ2V0KCkpO1xuICAgIGNvbnN0IHsgYmxvY2tMZW46IHQsIGJ1ZmZlcjogciwgbGVuZ3RoOiBuLCBmaW5pc2hlZDogaSwgZGVzdHJveWVkOiBvLCBwb3M6IGEgfSA9IHRoaXM7XG4gICAgcmV0dXJuIGUuZGVzdHJveWVkID0gbywgZS5maW5pc2hlZCA9IGksIGUubGVuZ3RoID0gbiwgZS5wb3MgPSBhLCBuICUgdCAmJiBlLmJ1ZmZlci5zZXQociksIGU7XG4gIH1cbiAgY2xvbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2Nsb25lSW50bygpO1xuICB9XG59XG5jb25zdCBtcyA9IC8qIEBfX1BVUkVfXyAqLyBVaW50MzJBcnJheS5mcm9tKFtcbiAgMTc3OTAzMzcwMyxcbiAgMzE0NDEzNDI3NyxcbiAgMTAxMzkwNDI0MixcbiAgMjc3MzQ4MDc2MixcbiAgMTM1OTg5MzExOSxcbiAgMjYwMDgyMjkyNCxcbiAgNTI4NzM0NjM1LFxuICAxNTQxNDU5MjI1XG5dKSwgUXQgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gIDE3NzkwMzM3MDMsXG4gIDQwODkyMzU3MjAsXG4gIDMxNDQxMzQyNzcsXG4gIDIyMjc4NzM1OTUsXG4gIDEwMTM5MDQyNDIsXG4gIDQyNzExNzU3MjMsXG4gIDI3NzM0ODA3NjIsXG4gIDE1OTU3NTAxMjksXG4gIDEzNTk4OTMxMTksXG4gIDI5MTc1NjUxMzcsXG4gIDI2MDA4MjI5MjQsXG4gIDcyNTUxMTE5OSxcbiAgNTI4NzM0NjM1LFxuICA0MjE1Mzg5NTQ3LFxuICAxNTQxNDU5MjI1LFxuICAzMjcwMzMyMDlcbl0pLCBPaSA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMiAqKiAzMiAtIDEpLCB1ZCA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMzIpO1xuZnVuY3Rpb24gRzEocywgZSA9ICExKSB7XG4gIHJldHVybiBlID8geyBoOiBOdW1iZXIocyAmIE9pKSwgbDogTnVtYmVyKHMgPj4gdWQgJiBPaSkgfSA6IHsgaDogTnVtYmVyKHMgPj4gdWQgJiBPaSkgfCAwLCBsOiBOdW1iZXIocyAmIE9pKSB8IDAgfTtcbn1cbmZ1bmN0aW9uIFYxKHMsIGUgPSAhMSkge1xuICBjb25zdCB0ID0gcy5sZW5ndGg7XG4gIGxldCByID0gbmV3IFVpbnQzMkFycmF5KHQpLCBuID0gbmV3IFVpbnQzMkFycmF5KHQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHQ7IGkrKykge1xuICAgIGNvbnN0IHsgaDogbywgbDogYSB9ID0gRzEoc1tpXSwgZSk7XG4gICAgW3JbaV0sIG5baV1dID0gW28sIGFdO1xuICB9XG4gIHJldHVybiBbciwgbl07XG59XG5jb25zdCBkZCA9IChzLCBlLCB0KSA9PiBzID4+PiB0LCBoZCA9IChzLCBlLCB0KSA9PiBzIDw8IDMyIC0gdCB8IGUgPj4+IHQsIGNuID0gKHMsIGUsIHQpID0+IHMgPj4+IHQgfCBlIDw8IDMyIC0gdCwgdW4gPSAocywgZSwgdCkgPT4gcyA8PCAzMiAtIHQgfCBlID4+PiB0LCBCaSA9IChzLCBlLCB0KSA9PiBzIDw8IDY0IC0gdCB8IGUgPj4+IHQgLSAzMiwgRmkgPSAocywgZSwgdCkgPT4gcyA+Pj4gdCAtIDMyIHwgZSA8PCA2NCAtIHQ7XG5mdW5jdGlvbiBzcyhzLCBlLCB0LCByKSB7XG4gIGNvbnN0IG4gPSAoZSA+Pj4gMCkgKyAociA+Pj4gMCk7XG4gIHJldHVybiB7IGg6IHMgKyB0ICsgKG4gLyAyICoqIDMyIHwgMCkgfCAwLCBsOiBuIHwgMCB9O1xufVxuY29uc3QgajEgPSAocywgZSwgdCkgPT4gKHMgPj4+IDApICsgKGUgPj4+IDApICsgKHQgPj4+IDApLCBLMSA9IChzLCBlLCB0LCByKSA9PiBlICsgdCArIHIgKyAocyAvIDIgKiogMzIgfCAwKSB8IDAsIEgxID0gKHMsIGUsIHQsIHIpID0+IChzID4+PiAwKSArIChlID4+PiAwKSArICh0ID4+PiAwKSArIChyID4+PiAwKSwgcTEgPSAocywgZSwgdCwgciwgbikgPT4gZSArIHQgKyByICsgbiArIChzIC8gMiAqKiAzMiB8IDApIHwgMCwgVzEgPSAocywgZSwgdCwgciwgbikgPT4gKHMgPj4+IDApICsgKGUgPj4+IDApICsgKHQgPj4+IDApICsgKHIgPj4+IDApICsgKG4gPj4+IDApLCB6MSA9IChzLCBlLCB0LCByLCBuLCBpKSA9PiBlICsgdCArIHIgKyBuICsgaSArIChzIC8gMiAqKiAzMiB8IDApIHwgMCwgWTEgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gIDExMTYzNTI0MDgsXG4gIDE4OTk0NDc0NDEsXG4gIDMwNDkzMjM0NzEsXG4gIDM5MjEwMDk1NzMsXG4gIDk2MTk4NzE2MyxcbiAgMTUwODk3MDk5MyxcbiAgMjQ1MzYzNTc0OCxcbiAgMjg3MDc2MzIyMSxcbiAgMzYyNDM4MTA4MCxcbiAgMzEwNTk4NDAxLFxuICA2MDcyMjUyNzgsXG4gIDE0MjY4ODE5ODcsXG4gIDE5MjUwNzgzODgsXG4gIDIxNjIwNzgyMDYsXG4gIDI2MTQ4ODgxMDMsXG4gIDMyNDgyMjI1ODAsXG4gIDM4MzUzOTA0MDEsXG4gIDQwMjIyMjQ3NzQsXG4gIDI2NDM0NzA3OCxcbiAgNjA0ODA3NjI4LFxuICA3NzAyNTU5ODMsXG4gIDEyNDkxNTAxMjIsXG4gIDE1NTUwODE2OTIsXG4gIDE5OTYwNjQ5ODYsXG4gIDI1NTQyMjA4ODIsXG4gIDI4MjE4MzQzNDksXG4gIDI5NTI5OTY4MDgsXG4gIDMyMTAzMTM2NzEsXG4gIDMzMzY1NzE4OTEsXG4gIDM1ODQ1Mjg3MTEsXG4gIDExMzkyNjk5MyxcbiAgMzM4MjQxODk1LFxuICA2NjYzMDcyMDUsXG4gIDc3MzUyOTkxMixcbiAgMTI5NDc1NzM3MixcbiAgMTM5NjE4MjI5MSxcbiAgMTY5NTE4MzcwMCxcbiAgMTk4NjY2MTA1MSxcbiAgMjE3NzAyNjM1MCxcbiAgMjQ1Njk1NjAzNyxcbiAgMjczMDQ4NTkyMSxcbiAgMjgyMDMwMjQxMSxcbiAgMzI1OTczMDgwMCxcbiAgMzM0NTc2NDc3MSxcbiAgMzUxNjA2NTgxNyxcbiAgMzYwMDM1MjgwNCxcbiAgNDA5NDU3MTkwOSxcbiAgMjc1NDIzMzQ0LFxuICA0MzAyMjc3MzQsXG4gIDUwNjk0ODYxNixcbiAgNjU5MDYwNTU2LFxuICA4ODM5OTc4NzcsXG4gIDk1ODEzOTU3MSxcbiAgMTMyMjgyMjIxOCxcbiAgMTUzNzAwMjA2MyxcbiAgMTc0Nzg3Mzc3OSxcbiAgMTk1NTU2MjIyMixcbiAgMjAyNDEwNDgxNSxcbiAgMjIyNzczMDQ1MixcbiAgMjM2MTg1MjQyNCxcbiAgMjQyODQzNjQ3NCxcbiAgMjc1NjczNDE4NyxcbiAgMzIwNDAzMTQ3OSxcbiAgMzMyOTMyNTI5OFxuXSksIHlzID0gLyogQF9fUFVSRV9fICovIG5ldyBVaW50MzJBcnJheSg2NCk7XG5jbGFzcyBaMSBleHRlbmRzIFlmIHtcbiAgY29uc3RydWN0b3IoZSA9IDMyKSB7XG4gICAgc3VwZXIoNjQsIGUsIDgsICExKSwgdGhpcy5BID0gbXNbMF0gfCAwLCB0aGlzLkIgPSBtc1sxXSB8IDAsIHRoaXMuQyA9IG1zWzJdIHwgMCwgdGhpcy5EID0gbXNbM10gfCAwLCB0aGlzLkUgPSBtc1s0XSB8IDAsIHRoaXMuRiA9IG1zWzVdIHwgMCwgdGhpcy5HID0gbXNbNl0gfCAwLCB0aGlzLkggPSBtc1s3XSB8IDA7XG4gIH1cbiAgZ2V0KCkge1xuICAgIGNvbnN0IHsgQTogZSwgQjogdCwgQzogciwgRDogbiwgRTogaSwgRjogbywgRzogYSwgSDogbCB9ID0gdGhpcztcbiAgICByZXR1cm4gW2UsIHQsIHIsIG4sIGksIG8sIGEsIGxdO1xuICB9XG4gIC8vIHByZXR0aWVyLWlnbm9yZVxuICBzZXQoZSwgdCwgciwgbiwgaSwgbywgYSwgbCkge1xuICAgIHRoaXMuQSA9IGUgfCAwLCB0aGlzLkIgPSB0IHwgMCwgdGhpcy5DID0gciB8IDAsIHRoaXMuRCA9IG4gfCAwLCB0aGlzLkUgPSBpIHwgMCwgdGhpcy5GID0gbyB8IDAsIHRoaXMuRyA9IGEgfCAwLCB0aGlzLkggPSBsIHwgMDtcbiAgfVxuICBwcm9jZXNzKGUsIHQpIHtcbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IDE2OyBkKyssIHQgKz0gNClcbiAgICAgIHlzW2RdID0gZS5nZXRVaW50MzIodCwgITEpO1xuICAgIGZvciAobGV0IGQgPSAxNjsgZCA8IDY0OyBkKyspIHtcbiAgICAgIGNvbnN0IGggPSB5c1tkIC0gMTVdLCBmID0geXNbZCAtIDJdLCBwID0gTnIoaCwgNykgXiBOcihoLCAxOCkgXiBoID4+PiAzLCB5ID0gTnIoZiwgMTcpIF4gTnIoZiwgMTkpIF4gZiA+Pj4gMTA7XG4gICAgICB5c1tkXSA9IHkgKyB5c1tkIC0gN10gKyBwICsgeXNbZCAtIDE2XSB8IDA7XG4gICAgfVxuICAgIGxldCB7IEE6IHIsIEI6IG4sIEM6IGksIEQ6IG8sIEU6IGEsIEY6IGwsIEc6IGMsIEg6IHUgfSA9IHRoaXM7XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCA2NDsgZCsrKSB7XG4gICAgICBjb25zdCBoID0gTnIoYSwgNikgXiBOcihhLCAxMSkgXiBOcihhLCAyNSksIGYgPSB1ICsgaCArIFUxKGEsIGwsIGMpICsgWTFbZF0gKyB5c1tkXSB8IDAsIHkgPSAoTnIociwgMikgXiBOcihyLCAxMykgXiBOcihyLCAyMikpICsgJDEociwgbiwgaSkgfCAwO1xuICAgICAgdSA9IGMsIGMgPSBsLCBsID0gYSwgYSA9IG8gKyBmIHwgMCwgbyA9IGksIGkgPSBuLCBuID0gciwgciA9IGYgKyB5IHwgMDtcbiAgICB9XG4gICAgciA9IHIgKyB0aGlzLkEgfCAwLCBuID0gbiArIHRoaXMuQiB8IDAsIGkgPSBpICsgdGhpcy5DIHwgMCwgbyA9IG8gKyB0aGlzLkQgfCAwLCBhID0gYSArIHRoaXMuRSB8IDAsIGwgPSBsICsgdGhpcy5GIHwgMCwgYyA9IGMgKyB0aGlzLkcgfCAwLCB1ID0gdSArIHRoaXMuSCB8IDAsIHRoaXMuc2V0KHIsIG4sIGksIG8sIGEsIGwsIGMsIHUpO1xuICB9XG4gIHJvdW5kQ2xlYW4oKSB7XG4gICAga24oeXMpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCksIGtuKHRoaXMuYnVmZmVyKTtcbiAgfVxufVxuY29uc3QgWmYgPSBWMShbXG4gIFwiMHg0MjhhMmY5OGQ3MjhhZTIyXCIsXG4gIFwiMHg3MTM3NDQ5MTIzZWY2NWNkXCIsXG4gIFwiMHhiNWMwZmJjZmVjNGQzYjJmXCIsXG4gIFwiMHhlOWI1ZGJhNTgxODlkYmJjXCIsXG4gIFwiMHgzOTU2YzI1YmYzNDhiNTM4XCIsXG4gIFwiMHg1OWYxMTFmMWI2MDVkMDE5XCIsXG4gIFwiMHg5MjNmODJhNGFmMTk0ZjliXCIsXG4gIFwiMHhhYjFjNWVkNWRhNmQ4MTE4XCIsXG4gIFwiMHhkODA3YWE5OGEzMDMwMjQyXCIsXG4gIFwiMHgxMjgzNWIwMTQ1NzA2ZmJlXCIsXG4gIFwiMHgyNDMxODViZTRlZTRiMjhjXCIsXG4gIFwiMHg1NTBjN2RjM2Q1ZmZiNGUyXCIsXG4gIFwiMHg3MmJlNWQ3NGYyN2I4OTZmXCIsXG4gIFwiMHg4MGRlYjFmZTNiMTY5NmIxXCIsXG4gIFwiMHg5YmRjMDZhNzI1YzcxMjM1XCIsXG4gIFwiMHhjMTliZjE3NGNmNjkyNjk0XCIsXG4gIFwiMHhlNDliNjljMTllZjE0YWQyXCIsXG4gIFwiMHhlZmJlNDc4NjM4NGYyNWUzXCIsXG4gIFwiMHgwZmMxOWRjNjhiOGNkNWI1XCIsXG4gIFwiMHgyNDBjYTFjYzc3YWM5YzY1XCIsXG4gIFwiMHgyZGU5MmM2ZjU5MmIwMjc1XCIsXG4gIFwiMHg0YTc0ODRhYTZlYTZlNDgzXCIsXG4gIFwiMHg1Y2IwYTlkY2JkNDFmYmQ0XCIsXG4gIFwiMHg3NmY5ODhkYTgzMTE1M2I1XCIsXG4gIFwiMHg5ODNlNTE1MmVlNjZkZmFiXCIsXG4gIFwiMHhhODMxYzY2ZDJkYjQzMjEwXCIsXG4gIFwiMHhiMDAzMjdjODk4ZmIyMTNmXCIsXG4gIFwiMHhiZjU5N2ZjN2JlZWYwZWU0XCIsXG4gIFwiMHhjNmUwMGJmMzNkYTg4ZmMyXCIsXG4gIFwiMHhkNWE3OTE0NzkzMGFhNzI1XCIsXG4gIFwiMHgwNmNhNjM1MWUwMDM4MjZmXCIsXG4gIFwiMHgxNDI5Mjk2NzBhMGU2ZTcwXCIsXG4gIFwiMHgyN2I3MGE4NTQ2ZDIyZmZjXCIsXG4gIFwiMHgyZTFiMjEzODVjMjZjOTI2XCIsXG4gIFwiMHg0ZDJjNmRmYzVhYzQyYWVkXCIsXG4gIFwiMHg1MzM4MGQxMzlkOTViM2RmXCIsXG4gIFwiMHg2NTBhNzM1NDhiYWY2M2RlXCIsXG4gIFwiMHg3NjZhMGFiYjNjNzdiMmE4XCIsXG4gIFwiMHg4MWMyYzkyZTQ3ZWRhZWU2XCIsXG4gIFwiMHg5MjcyMmM4NTE0ODIzNTNiXCIsXG4gIFwiMHhhMmJmZThhMTRjZjEwMzY0XCIsXG4gIFwiMHhhODFhNjY0YmJjNDIzMDAxXCIsXG4gIFwiMHhjMjRiOGI3MGQwZjg5NzkxXCIsXG4gIFwiMHhjNzZjNTFhMzA2NTRiZTMwXCIsXG4gIFwiMHhkMTkyZTgxOWQ2ZWY1MjE4XCIsXG4gIFwiMHhkNjk5MDYyNDU1NjVhOTEwXCIsXG4gIFwiMHhmNDBlMzU4NTU3NzEyMDJhXCIsXG4gIFwiMHgxMDZhYTA3MDMyYmJkMWI4XCIsXG4gIFwiMHgxOWE0YzExNmI4ZDJkMGM4XCIsXG4gIFwiMHgxZTM3NmMwODUxNDFhYjUzXCIsXG4gIFwiMHgyNzQ4Nzc0Y2RmOGVlYjk5XCIsXG4gIFwiMHgzNGIwYmNiNWUxOWI0OGE4XCIsXG4gIFwiMHgzOTFjMGNiM2M1Yzk1YTYzXCIsXG4gIFwiMHg0ZWQ4YWE0YWUzNDE4YWNiXCIsXG4gIFwiMHg1YjljY2E0Zjc3NjNlMzczXCIsXG4gIFwiMHg2ODJlNmZmM2Q2YjJiOGEzXCIsXG4gIFwiMHg3NDhmODJlZTVkZWZiMmZjXCIsXG4gIFwiMHg3OGE1NjM2ZjQzMTcyZjYwXCIsXG4gIFwiMHg4NGM4NzgxNGExZjBhYjcyXCIsXG4gIFwiMHg4Y2M3MDIwODFhNjQzOWVjXCIsXG4gIFwiMHg5MGJlZmZmYTIzNjMxZTI4XCIsXG4gIFwiMHhhNDUwNmNlYmRlODJiZGU5XCIsXG4gIFwiMHhiZWY5YTNmN2IyYzY3OTE1XCIsXG4gIFwiMHhjNjcxNzhmMmUzNzI1MzJiXCIsXG4gIFwiMHhjYTI3M2VjZWVhMjY2MTljXCIsXG4gIFwiMHhkMTg2YjhjNzIxYzBjMjA3XCIsXG4gIFwiMHhlYWRhN2RkNmNkZTBlYjFlXCIsXG4gIFwiMHhmNTdkNGY3ZmVlNmVkMTc4XCIsXG4gIFwiMHgwNmYwNjdhYTcyMTc2ZmJhXCIsXG4gIFwiMHgwYTYzN2RjNWEyYzg5OGE2XCIsXG4gIFwiMHgxMTNmOTgwNGJlZjkwZGFlXCIsXG4gIFwiMHgxYjcxMGIzNTEzMWM0NzFiXCIsXG4gIFwiMHgyOGRiNzdmNTIzMDQ3ZDg0XCIsXG4gIFwiMHgzMmNhYWI3YjQwYzcyNDkzXCIsXG4gIFwiMHgzYzllYmUwYTE1YzliZWJjXCIsXG4gIFwiMHg0MzFkNjdjNDljMTAwZDRjXCIsXG4gIFwiMHg0Y2M1ZDRiZWNiM2U0MmI2XCIsXG4gIFwiMHg1OTdmMjk5Y2ZjNjU3ZTJhXCIsXG4gIFwiMHg1ZmNiNmZhYjNhZDZmYWVjXCIsXG4gIFwiMHg2YzQ0MTk4YzRhNDc1ODE3XCJcbl0ubWFwKChzKSA9PiBCaWdJbnQocykpKSwgWDEgPSBaZlswXSwgSjEgPSBaZlsxXSwgdnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF5KDgwKSwgRXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF5KDgwKTtcbmNsYXNzIFExIGV4dGVuZHMgWWYge1xuICBjb25zdHJ1Y3RvcihlID0gNjQpIHtcbiAgICBzdXBlcigxMjgsIGUsIDE2LCAhMSksIHRoaXMuQWggPSBRdFswXSB8IDAsIHRoaXMuQWwgPSBRdFsxXSB8IDAsIHRoaXMuQmggPSBRdFsyXSB8IDAsIHRoaXMuQmwgPSBRdFszXSB8IDAsIHRoaXMuQ2ggPSBRdFs0XSB8IDAsIHRoaXMuQ2wgPSBRdFs1XSB8IDAsIHRoaXMuRGggPSBRdFs2XSB8IDAsIHRoaXMuRGwgPSBRdFs3XSB8IDAsIHRoaXMuRWggPSBRdFs4XSB8IDAsIHRoaXMuRWwgPSBRdFs5XSB8IDAsIHRoaXMuRmggPSBRdFsxMF0gfCAwLCB0aGlzLkZsID0gUXRbMTFdIHwgMCwgdGhpcy5HaCA9IFF0WzEyXSB8IDAsIHRoaXMuR2wgPSBRdFsxM10gfCAwLCB0aGlzLkhoID0gUXRbMTRdIHwgMCwgdGhpcy5IbCA9IFF0WzE1XSB8IDA7XG4gIH1cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIGdldCgpIHtcbiAgICBjb25zdCB7IEFoOiBlLCBBbDogdCwgQmg6IHIsIEJsOiBuLCBDaDogaSwgQ2w6IG8sIERoOiBhLCBEbDogbCwgRWg6IGMsIEVsOiB1LCBGaDogZCwgRmw6IGgsIEdoOiBmLCBHbDogcCwgSGg6IHksIEhsOiBFIH0gPSB0aGlzO1xuICAgIHJldHVybiBbZSwgdCwgciwgbiwgaSwgbywgYSwgbCwgYywgdSwgZCwgaCwgZiwgcCwgeSwgRV07XG4gIH1cbiAgLy8gcHJldHRpZXItaWdub3JlXG4gIHNldChlLCB0LCByLCBuLCBpLCBvLCBhLCBsLCBjLCB1LCBkLCBoLCBmLCBwLCB5LCBFKSB7XG4gICAgdGhpcy5BaCA9IGUgfCAwLCB0aGlzLkFsID0gdCB8IDAsIHRoaXMuQmggPSByIHwgMCwgdGhpcy5CbCA9IG4gfCAwLCB0aGlzLkNoID0gaSB8IDAsIHRoaXMuQ2wgPSBvIHwgMCwgdGhpcy5EaCA9IGEgfCAwLCB0aGlzLkRsID0gbCB8IDAsIHRoaXMuRWggPSBjIHwgMCwgdGhpcy5FbCA9IHUgfCAwLCB0aGlzLkZoID0gZCB8IDAsIHRoaXMuRmwgPSBoIHwgMCwgdGhpcy5HaCA9IGYgfCAwLCB0aGlzLkdsID0gcCB8IDAsIHRoaXMuSGggPSB5IHwgMCwgdGhpcy5IbCA9IEUgfCAwO1xuICB9XG4gIHByb2Nlc3MoZSwgdCkge1xuICAgIGZvciAobGV0IEEgPSAwOyBBIDwgMTY7IEErKywgdCArPSA0KVxuICAgICAgdnNbQV0gPSBlLmdldFVpbnQzMih0KSwgRXNbQV0gPSBlLmdldFVpbnQzMih0ICs9IDQpO1xuICAgIGZvciAobGV0IEEgPSAxNjsgQSA8IDgwOyBBKyspIHtcbiAgICAgIGNvbnN0IEYgPSB2c1tBIC0gMTVdIHwgMCwgTSA9IEVzW0EgLSAxNV0gfCAwLCBIID0gY24oRiwgTSwgMSkgXiBjbihGLCBNLCA4KSBeIGRkKEYsIE0sIDcpLCBLID0gdW4oRiwgTSwgMSkgXiB1bihGLCBNLCA4KSBeIGhkKEYsIE0sIDcpLCBqID0gdnNbQSAtIDJdIHwgMCwgQyA9IEVzW0EgLSAyXSB8IDAsIGsgPSBjbihqLCBDLCAxOSkgXiBCaShqLCBDLCA2MSkgXiBkZChqLCBDLCA2KSwgJCA9IHVuKGosIEMsIDE5KSBeIEZpKGosIEMsIDYxKSBeIGhkKGosIEMsIDYpLCBXID0gSDEoSywgJCwgRXNbQSAtIDddLCBFc1tBIC0gMTZdKSwgXyA9IHExKFcsIEgsIGssIHZzW0EgLSA3XSwgdnNbQSAtIDE2XSk7XG4gICAgICB2c1tBXSA9IF8gfCAwLCBFc1tBXSA9IFcgfCAwO1xuICAgIH1cbiAgICBsZXQgeyBBaDogciwgQWw6IG4sIEJoOiBpLCBCbDogbywgQ2g6IGEsIENsOiBsLCBEaDogYywgRGw6IHUsIEVoOiBkLCBFbDogaCwgRmg6IGYsIEZsOiBwLCBHaDogeSwgR2w6IEUsIEhoOiBiLCBIbDogUiB9ID0gdGhpcztcbiAgICBmb3IgKGxldCBBID0gMDsgQSA8IDgwOyBBKyspIHtcbiAgICAgIGNvbnN0IEYgPSBjbihkLCBoLCAxNCkgXiBjbihkLCBoLCAxOCkgXiBCaShkLCBoLCA0MSksIE0gPSB1bihkLCBoLCAxNCkgXiB1bihkLCBoLCAxOCkgXiBGaShkLCBoLCA0MSksIEggPSBkICYgZiBeIH5kICYgeSwgSyA9IGggJiBwIF4gfmggJiBFLCBqID0gVzEoUiwgTSwgSywgSjFbQV0sIEVzW0FdKSwgQyA9IHoxKGosIGIsIEYsIEgsIFgxW0FdLCB2c1tBXSksIGsgPSBqIHwgMCwgJCA9IGNuKHIsIG4sIDI4KSBeIEJpKHIsIG4sIDM0KSBeIEJpKHIsIG4sIDM5KSwgVyA9IHVuKHIsIG4sIDI4KSBeIEZpKHIsIG4sIDM0KSBeIEZpKHIsIG4sIDM5KSwgXyA9IHIgJiBpIF4gciAmIGEgXiBpICYgYSwgZyA9IG4gJiBvIF4gbiAmIGwgXiBvICYgbDtcbiAgICAgIGIgPSB5IHwgMCwgUiA9IEUgfCAwLCB5ID0gZiB8IDAsIEUgPSBwIHwgMCwgZiA9IGQgfCAwLCBwID0gaCB8IDAsIHsgaDogZCwgbDogaCB9ID0gc3MoYyB8IDAsIHUgfCAwLCBDIHwgMCwgayB8IDApLCBjID0gYSB8IDAsIHUgPSBsIHwgMCwgYSA9IGkgfCAwLCBsID0gbyB8IDAsIGkgPSByIHwgMCwgbyA9IG4gfCAwO1xuICAgICAgY29uc3QgeCA9IGoxKGssIFcsIGcpO1xuICAgICAgciA9IEsxKHgsIEMsICQsIF8pLCBuID0geCB8IDA7XG4gICAgfVxuICAgICh7IGg6IHIsIGw6IG4gfSA9IHNzKHRoaXMuQWggfCAwLCB0aGlzLkFsIHwgMCwgciB8IDAsIG4gfCAwKSksIHsgaDogaSwgbDogbyB9ID0gc3ModGhpcy5CaCB8IDAsIHRoaXMuQmwgfCAwLCBpIHwgMCwgbyB8IDApLCB7IGg6IGEsIGwgfSA9IHNzKHRoaXMuQ2ggfCAwLCB0aGlzLkNsIHwgMCwgYSB8IDAsIGwgfCAwKSwgeyBoOiBjLCBsOiB1IH0gPSBzcyh0aGlzLkRoIHwgMCwgdGhpcy5EbCB8IDAsIGMgfCAwLCB1IHwgMCksIHsgaDogZCwgbDogaCB9ID0gc3ModGhpcy5FaCB8IDAsIHRoaXMuRWwgfCAwLCBkIHwgMCwgaCB8IDApLCB7IGg6IGYsIGw6IHAgfSA9IHNzKHRoaXMuRmggfCAwLCB0aGlzLkZsIHwgMCwgZiB8IDAsIHAgfCAwKSwgeyBoOiB5LCBsOiBFIH0gPSBzcyh0aGlzLkdoIHwgMCwgdGhpcy5HbCB8IDAsIHkgfCAwLCBFIHwgMCksIHsgaDogYiwgbDogUiB9ID0gc3ModGhpcy5IaCB8IDAsIHRoaXMuSGwgfCAwLCBiIHwgMCwgUiB8IDApLCB0aGlzLnNldChyLCBuLCBpLCBvLCBhLCBsLCBjLCB1LCBkLCBoLCBmLCBwLCB5LCBFLCBiLCBSKTtcbiAgfVxuICByb3VuZENsZWFuKCkge1xuICAgIGtuKHZzLCBFcyk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBrbih0aGlzLmJ1ZmZlciksIHRoaXMuc2V0KDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDApO1xuICB9XG59XG5jb25zdCBYZiA9IC8qIEBfX1BVUkVfXyAqLyB6ZigoKSA9PiBuZXcgWjEoKSksIGV5ID0gLyogQF9fUFVSRV9fICovIHpmKCgpID0+IG5ldyBRMSgpKTtcbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmNvbnN0IFdjID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgwKSwgSmwgPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDEpO1xuZnVuY3Rpb24gWHMocywgZSA9IFwiXCIpIHtcbiAgaWYgKHR5cGVvZiBzICE9IFwiYm9vbGVhblwiKSB7XG4gICAgY29uc3QgdCA9IGUgJiYgYFwiJHtlfVwiYDtcbiAgICB0aHJvdyBuZXcgRXJyb3IodCArIFwiZXhwZWN0ZWQgYm9vbGVhbiwgZ290IHR5cGU9XCIgKyB0eXBlb2Ygcyk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBPcihzLCBlLCB0ID0gXCJcIikge1xuICBjb25zdCByID0gSWkocyksIG4gPSBzID09IG51bGwgPyB2b2lkIDAgOiBzLmxlbmd0aCwgaSA9IGUgIT09IHZvaWQgMDtcbiAgaWYgKCFyIHx8IGkgJiYgbiAhPT0gZSkge1xuICAgIGNvbnN0IG8gPSB0ICYmIGBcIiR7dH1cIiBgLCBhID0gaSA/IGAgb2YgbGVuZ3RoICR7ZX1gIDogXCJcIiwgbCA9IHIgPyBgbGVuZ3RoPSR7bn1gIDogYHR5cGU9JHt0eXBlb2Ygc31gO1xuICAgIHRocm93IG5ldyBFcnJvcihvICsgXCJleHBlY3RlZCBVaW50OEFycmF5XCIgKyBhICsgXCIsIGdvdCBcIiArIGwpO1xuICB9XG4gIHJldHVybiBzO1xufVxuZnVuY3Rpb24gTmkocykge1xuICBjb25zdCBlID0gcy50b1N0cmluZygxNik7XG4gIHJldHVybiBlLmxlbmd0aCAmIDEgPyBcIjBcIiArIGUgOiBlO1xufVxuZnVuY3Rpb24gSmYocykge1xuICBpZiAodHlwZW9mIHMgIT0gXCJzdHJpbmdcIilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgXCIgKyB0eXBlb2Ygcyk7XG4gIHJldHVybiBzID09PSBcIlwiID8gV2MgOiBCaWdJbnQoXCIweFwiICsgcyk7XG59XG5mdW5jdGlvbiBsYShzKSB7XG4gIHJldHVybiBKZihIcyhzKSk7XG59XG5mdW5jdGlvbiBlaShzKSB7XG4gIHJldHVybiBRcyhzKSwgSmYoSHMoVWludDhBcnJheS5mcm9tKHMpLnJldmVyc2UoKSkpO1xufVxuZnVuY3Rpb24gemMocywgZSkge1xuICByZXR1cm4gUG8ocy50b1N0cmluZygxNikucGFkU3RhcnQoZSAqIDIsIFwiMFwiKSk7XG59XG5mdW5jdGlvbiBRZihzLCBlKSB7XG4gIHJldHVybiB6YyhzLCBlKS5yZXZlcnNlKCk7XG59XG5mdW5jdGlvbiBFdChzLCBlLCB0KSB7XG4gIGxldCByO1xuICBpZiAodHlwZW9mIGUgPT0gXCJzdHJpbmdcIilcbiAgICB0cnkge1xuICAgICAgciA9IFBvKGUpO1xuICAgIH0gY2F0Y2ggKGkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihzICsgXCIgbXVzdCBiZSBoZXggc3RyaW5nIG9yIFVpbnQ4QXJyYXksIGNhdXNlOiBcIiArIGkpO1xuICAgIH1cbiAgZWxzZSBpZiAoSWkoZSkpXG4gICAgciA9IFVpbnQ4QXJyYXkuZnJvbShlKTtcbiAgZWxzZVxuICAgIHRocm93IG5ldyBFcnJvcihzICsgXCIgbXVzdCBiZSBoZXggc3RyaW5nIG9yIFVpbnQ4QXJyYXlcIik7XG4gIGNvbnN0IG4gPSByLmxlbmd0aDtcbiAgaWYgKHR5cGVvZiB0ID09IFwibnVtYmVyXCIgJiYgbiAhPT0gdClcbiAgICB0aHJvdyBuZXcgRXJyb3IocyArIFwiIG9mIGxlbmd0aCBcIiArIHQgKyBcIiBleHBlY3RlZCwgZ290IFwiICsgbik7XG4gIHJldHVybiByO1xufVxuZnVuY3Rpb24gZmQocykge1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKHMpO1xufVxuY29uc3QgamEgPSAocykgPT4gdHlwZW9mIHMgPT0gXCJiaWdpbnRcIiAmJiBXYyA8PSBzO1xuZnVuY3Rpb24gdHkocywgZSwgdCkge1xuICByZXR1cm4gamEocykgJiYgamEoZSkgJiYgamEodCkgJiYgZSA8PSBzICYmIHMgPCB0O1xufVxuZnVuY3Rpb24gUWwocywgZSwgdCwgcikge1xuICBpZiAoIXR5KGUsIHQsIHIpKVxuICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIHZhbGlkIFwiICsgcyArIFwiOiBcIiArIHQgKyBcIiA8PSBuIDwgXCIgKyByICsgXCIsIGdvdCBcIiArIGUpO1xufVxuZnVuY3Rpb24gZTAocykge1xuICBsZXQgZTtcbiAgZm9yIChlID0gMDsgcyA+IFdjOyBzID4+PSBKbCwgZSArPSAxKVxuICAgIDtcbiAgcmV0dXJuIGU7XG59XG5jb25zdCBfaSA9IChzKSA9PiAoSmwgPDwgQmlnSW50KHMpKSAtIEpsO1xuZnVuY3Rpb24gcnkocywgZSwgdCkge1xuICBpZiAodHlwZW9mIHMgIT0gXCJudW1iZXJcIiB8fCBzIDwgMilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJoYXNoTGVuIG11c3QgYmUgYSBudW1iZXJcIik7XG4gIGlmICh0eXBlb2YgZSAhPSBcIm51bWJlclwiIHx8IGUgPCAyKVxuICAgIHRocm93IG5ldyBFcnJvcihcInFCeXRlTGVuIG11c3QgYmUgYSBudW1iZXJcIik7XG4gIGlmICh0eXBlb2YgdCAhPSBcImZ1bmN0aW9uXCIpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaG1hY0ZuIG11c3QgYmUgYSBmdW5jdGlvblwiKTtcbiAgY29uc3QgciA9IChmKSA9PiBuZXcgVWludDhBcnJheShmKSwgbiA9IChmKSA9PiBVaW50OEFycmF5Lm9mKGYpO1xuICBsZXQgaSA9IHIocyksIG8gPSByKHMpLCBhID0gMDtcbiAgY29uc3QgbCA9ICgpID0+IHtcbiAgICBpLmZpbGwoMSksIG8uZmlsbCgwKSwgYSA9IDA7XG4gIH0sIGMgPSAoLi4uZikgPT4gdChvLCBpLCAuLi5mKSwgdSA9IChmID0gcigwKSkgPT4ge1xuICAgIG8gPSBjKG4oMCksIGYpLCBpID0gYygpLCBmLmxlbmd0aCAhPT0gMCAmJiAobyA9IGMobigxKSwgZiksIGkgPSBjKCkpO1xuICB9LCBkID0gKCkgPT4ge1xuICAgIGlmIChhKysgPj0gMWUzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZHJiZzogdHJpZWQgMTAwMCB2YWx1ZXNcIik7XG4gICAgbGV0IGYgPSAwO1xuICAgIGNvbnN0IHAgPSBbXTtcbiAgICBmb3IgKDsgZiA8IGU7ICkge1xuICAgICAgaSA9IGMoKTtcbiAgICAgIGNvbnN0IHkgPSBpLnNsaWNlKCk7XG4gICAgICBwLnB1c2goeSksIGYgKz0gaS5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiBLciguLi5wKTtcbiAgfTtcbiAgcmV0dXJuIChmLCBwKSA9PiB7XG4gICAgbCgpLCB1KGYpO1xuICAgIGxldCB5O1xuICAgIGZvciAoOyAhKHkgPSBwKGQoKSkpOyApXG4gICAgICB1KCk7XG4gICAgcmV0dXJuIGwoKSwgeTtcbiAgfTtcbn1cbmZ1bmN0aW9uIFJpKHMsIGUsIHQgPSB7fSkge1xuICBpZiAoIXMgfHwgdHlwZW9mIHMgIT0gXCJvYmplY3RcIilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCB2YWxpZCBvcHRpb25zIG9iamVjdFwiKTtcbiAgZnVuY3Rpb24gcihuLCBpLCBvKSB7XG4gICAgY29uc3QgYSA9IHNbbl07XG4gICAgaWYgKG8gJiYgYSA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGwgPSB0eXBlb2YgYTtcbiAgICBpZiAobCAhPT0gaSB8fCBhID09PSBudWxsKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwYXJhbSBcIiR7bn1cIiBpcyBpbnZhbGlkOiBleHBlY3RlZCAke2l9LCBnb3QgJHtsfWApO1xuICB9XG4gIE9iamVjdC5lbnRyaWVzKGUpLmZvckVhY2goKFtuLCBpXSkgPT4gcihuLCBpLCAhMSkpLCBPYmplY3QuZW50cmllcyh0KS5mb3JFYWNoKChbbiwgaV0pID0+IHIobiwgaSwgITApKTtcbn1cbmZ1bmN0aW9uIE1vKHMpIHtcbiAgY29uc3QgZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICByZXR1cm4gKHQsIC4uLnIpID0+IHtcbiAgICBjb25zdCBuID0gZS5nZXQodCk7XG4gICAgaWYgKG4gIT09IHZvaWQgMClcbiAgICAgIHJldHVybiBuO1xuICAgIGNvbnN0IGkgPSBzKHQsIC4uLnIpO1xuICAgIHJldHVybiBlLnNldCh0LCBpKSwgaTtcbiAgfTtcbn1cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmNvbnN0IGdyID0gQmlnSW50KDApLCBYdCA9IEJpZ0ludCgxKSwgR3MgPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDIpLCB0MCA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMyksIHIwID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCg0KSwgczAgPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDUpLCBzeSA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoNyksIG4wID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCg4KSwgbnkgPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDkpLCBpMCA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMTYpO1xuZnVuY3Rpb24gR3QocywgZSkge1xuICBjb25zdCB0ID0gcyAlIGU7XG4gIHJldHVybiB0ID49IGdyID8gdCA6IGUgKyB0O1xufVxuZnVuY3Rpb24gdnQocywgZSwgdCkge1xuICBsZXQgciA9IHM7XG4gIGZvciAoOyBlLS0gPiBncjsgKVxuICAgIHIgKj0gciwgciAlPSB0O1xuICByZXR1cm4gcjtcbn1cbmZ1bmN0aW9uIGdkKHMsIGUpIHtcbiAgaWYgKHMgPT09IGdyKVxuICAgIHRocm93IG5ldyBFcnJvcihcImludmVydDogZXhwZWN0ZWQgbm9uLXplcm8gbnVtYmVyXCIpO1xuICBpZiAoZSA8PSBncilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZlcnQ6IGV4cGVjdGVkIHBvc2l0aXZlIG1vZHVsdXMsIGdvdCBcIiArIGUpO1xuICBsZXQgdCA9IEd0KHMsIGUpLCByID0gZSwgbiA9IGdyLCBpID0gWHQ7XG4gIGZvciAoOyB0ICE9PSBncjsgKSB7XG4gICAgY29uc3QgYSA9IHIgLyB0LCBsID0gciAlIHQsIGMgPSBuIC0gaSAqIGE7XG4gICAgciA9IHQsIHQgPSBsLCBuID0gaSwgaSA9IGM7XG4gIH1cbiAgaWYgKHIgIT09IFh0KVxuICAgIHRocm93IG5ldyBFcnJvcihcImludmVydDogZG9lcyBub3QgZXhpc3RcIik7XG4gIHJldHVybiBHdChuLCBlKTtcbn1cbmZ1bmN0aW9uIFljKHMsIGUsIHQpIHtcbiAgaWYgKCFzLmVxbChzLnNxcihlKSwgdCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgc3F1YXJlIHJvb3RcIik7XG59XG5mdW5jdGlvbiBvMChzLCBlKSB7XG4gIGNvbnN0IHQgPSAocy5PUkRFUiArIFh0KSAvIHIwLCByID0gcy5wb3coZSwgdCk7XG4gIHJldHVybiBZYyhzLCByLCBlKSwgcjtcbn1cbmZ1bmN0aW9uIGl5KHMsIGUpIHtcbiAgY29uc3QgdCA9IChzLk9SREVSIC0gczApIC8gbjAsIHIgPSBzLm11bChlLCBHcyksIG4gPSBzLnBvdyhyLCB0KSwgaSA9IHMubXVsKGUsIG4pLCBvID0gcy5tdWwocy5tdWwoaSwgR3MpLCBuKSwgYSA9IHMubXVsKGksIHMuc3ViKG8sIHMuT05FKSk7XG4gIHJldHVybiBZYyhzLCBhLCBlKSwgYTtcbn1cbmZ1bmN0aW9uIG95KHMpIHtcbiAgY29uc3QgZSA9IGVuKHMpLCB0ID0gYTAocyksIHIgPSB0KGUsIGUubmVnKGUuT05FKSksIG4gPSB0KGUsIHIpLCBpID0gdChlLCBlLm5lZyhyKSksIG8gPSAocyArIHN5KSAvIGkwO1xuICByZXR1cm4gKGEsIGwpID0+IHtcbiAgICBsZXQgYyA9IGEucG93KGwsIG8pLCB1ID0gYS5tdWwoYywgcik7XG4gICAgY29uc3QgZCA9IGEubXVsKGMsIG4pLCBoID0gYS5tdWwoYywgaSksIGYgPSBhLmVxbChhLnNxcih1KSwgbCksIHAgPSBhLmVxbChhLnNxcihkKSwgbCk7XG4gICAgYyA9IGEuY21vdihjLCB1LCBmKSwgdSA9IGEuY21vdihoLCBkLCBwKTtcbiAgICBjb25zdCB5ID0gYS5lcWwoYS5zcXIodSksIGwpLCBFID0gYS5jbW92KGMsIHUsIHkpO1xuICAgIHJldHVybiBZYyhhLCBFLCBsKSwgRTtcbiAgfTtcbn1cbmZ1bmN0aW9uIGEwKHMpIHtcbiAgaWYgKHMgPCB0MClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJzcXJ0IGlzIG5vdCBkZWZpbmVkIGZvciBzbWFsbCBmaWVsZFwiKTtcbiAgbGV0IGUgPSBzIC0gWHQsIHQgPSAwO1xuICBmb3IgKDsgZSAlIEdzID09PSBncjsgKVxuICAgIGUgLz0gR3MsIHQrKztcbiAgbGV0IHIgPSBHcztcbiAgY29uc3QgbiA9IGVuKHMpO1xuICBmb3IgKDsgcGQobiwgcikgPT09IDE7IClcbiAgICBpZiAocisrID4gMWUzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgc3F1YXJlIHJvb3Q6IHByb2JhYmx5IG5vbi1wcmltZSBQXCIpO1xuICBpZiAodCA9PT0gMSlcbiAgICByZXR1cm4gbzA7XG4gIGxldCBpID0gbi5wb3cociwgZSk7XG4gIGNvbnN0IG8gPSAoZSArIFh0KSAvIEdzO1xuICByZXR1cm4gZnVuY3Rpb24obCwgYykge1xuICAgIGlmIChsLmlzMChjKSlcbiAgICAgIHJldHVybiBjO1xuICAgIGlmIChwZChsLCBjKSAhPT0gMSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIHNxdWFyZSByb290XCIpO1xuICAgIGxldCB1ID0gdCwgZCA9IGwubXVsKGwuT05FLCBpKSwgaCA9IGwucG93KGMsIGUpLCBmID0gbC5wb3coYywgbyk7XG4gICAgZm9yICg7ICFsLmVxbChoLCBsLk9ORSk7ICkge1xuICAgICAgaWYgKGwuaXMwKGgpKVxuICAgICAgICByZXR1cm4gbC5aRVJPO1xuICAgICAgbGV0IHAgPSAxLCB5ID0gbC5zcXIoaCk7XG4gICAgICBmb3IgKDsgIWwuZXFsKHksIGwuT05FKTsgKVxuICAgICAgICBpZiAocCsrLCB5ID0gbC5zcXIoeSksIHAgPT09IHUpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgc3F1YXJlIHJvb3RcIik7XG4gICAgICBjb25zdCBFID0gWHQgPDwgQmlnSW50KHUgLSBwIC0gMSksIGIgPSBsLnBvdyhkLCBFKTtcbiAgICAgIHUgPSBwLCBkID0gbC5zcXIoYiksIGggPSBsLm11bChoLCBkKSwgZiA9IGwubXVsKGYsIGIpO1xuICAgIH1cbiAgICByZXR1cm4gZjtcbiAgfTtcbn1cbmZ1bmN0aW9uIGF5KHMpIHtcbiAgcmV0dXJuIHMgJSByMCA9PT0gdDAgPyBvMCA6IHMgJSBuMCA9PT0gczAgPyBpeSA6IHMgJSBpMCA9PT0gbnkgPyBveShzKSA6IGEwKHMpO1xufVxuY29uc3QgbHkgPSAocywgZSkgPT4gKEd0KHMsIGUpICYgWHQpID09PSBYdCwgY3kgPSBbXG4gIFwiY3JlYXRlXCIsXG4gIFwiaXNWYWxpZFwiLFxuICBcImlzMFwiLFxuICBcIm5lZ1wiLFxuICBcImludlwiLFxuICBcInNxcnRcIixcbiAgXCJzcXJcIixcbiAgXCJlcWxcIixcbiAgXCJhZGRcIixcbiAgXCJzdWJcIixcbiAgXCJtdWxcIixcbiAgXCJwb3dcIixcbiAgXCJkaXZcIixcbiAgXCJhZGROXCIsXG4gIFwic3ViTlwiLFxuICBcIm11bE5cIixcbiAgXCJzcXJOXCJcbl07XG5mdW5jdGlvbiB1eShzKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAgT1JERVI6IFwiYmlnaW50XCIsXG4gICAgTUFTSzogXCJiaWdpbnRcIixcbiAgICBCWVRFUzogXCJudW1iZXJcIixcbiAgICBCSVRTOiBcIm51bWJlclwiXG4gIH0sIHQgPSBjeS5yZWR1Y2UoKHIsIG4pID0+IChyW25dID0gXCJmdW5jdGlvblwiLCByKSwgZSk7XG4gIHJldHVybiBSaShzLCB0KSwgcztcbn1cbmZ1bmN0aW9uIGR5KHMsIGUsIHQpIHtcbiAgaWYgKHQgPCBncilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGV4cG9uZW50LCBuZWdhdGl2ZXMgdW5zdXBwb3J0ZWRcIik7XG4gIGlmICh0ID09PSBncilcbiAgICByZXR1cm4gcy5PTkU7XG4gIGlmICh0ID09PSBYdClcbiAgICByZXR1cm4gZTtcbiAgbGV0IHIgPSBzLk9ORSwgbiA9IGU7XG4gIGZvciAoOyB0ID4gZ3I7IClcbiAgICB0ICYgWHQgJiYgKHIgPSBzLm11bChyLCBuKSksIG4gPSBzLnNxcihuKSwgdCA+Pj0gWHQ7XG4gIHJldHVybiByO1xufVxuZnVuY3Rpb24gbDAocywgZSwgdCA9ICExKSB7XG4gIGNvbnN0IHIgPSBuZXcgQXJyYXkoZS5sZW5ndGgpLmZpbGwodCA/IHMuWkVSTyA6IHZvaWQgMCksIG4gPSBlLnJlZHVjZSgobywgYSwgbCkgPT4gcy5pczAoYSkgPyBvIDogKHJbbF0gPSBvLCBzLm11bChvLCBhKSksIHMuT05FKSwgaSA9IHMuaW52KG4pO1xuICByZXR1cm4gZS5yZWR1Y2VSaWdodCgobywgYSwgbCkgPT4gcy5pczAoYSkgPyBvIDogKHJbbF0gPSBzLm11bChvLCByW2xdKSwgcy5tdWwobywgYSkpLCBpKSwgcjtcbn1cbmZ1bmN0aW9uIHBkKHMsIGUpIHtcbiAgY29uc3QgdCA9IChzLk9SREVSIC0gWHQpIC8gR3MsIHIgPSBzLnBvdyhlLCB0KSwgbiA9IHMuZXFsKHIsIHMuT05FKSwgaSA9IHMuZXFsKHIsIHMuWkVSTyksIG8gPSBzLmVxbChyLCBzLm5lZyhzLk9ORSkpO1xuICBpZiAoIW4gJiYgIWkgJiYgIW8pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBMZWdlbmRyZSBzeW1ib2wgcmVzdWx0XCIpO1xuICByZXR1cm4gbiA/IDEgOiBpID8gMCA6IC0xO1xufVxuZnVuY3Rpb24gYzAocywgZSkge1xuICBlICE9PSB2b2lkIDAgJiYgWGwoZSk7XG4gIGNvbnN0IHQgPSBlICE9PSB2b2lkIDAgPyBlIDogcy50b1N0cmluZygyKS5sZW5ndGgsIHIgPSBNYXRoLmNlaWwodCAvIDgpO1xuICByZXR1cm4geyBuQml0TGVuZ3RoOiB0LCBuQnl0ZUxlbmd0aDogciB9O1xufVxuZnVuY3Rpb24gZW4ocywgZSwgdCA9ICExLCByID0ge30pIHtcbiAgaWYgKHMgPD0gZ3IpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmaWVsZDogZXhwZWN0ZWQgT1JERVIgPiAwLCBnb3QgXCIgKyBzKTtcbiAgbGV0IG4sIGksIG8gPSAhMSwgYTtcbiAgaWYgKHR5cGVvZiBlID09IFwib2JqZWN0XCIgJiYgZSAhPSBudWxsKSB7XG4gICAgaWYgKHIuc3FydCB8fCB0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiY2Fubm90IHNwZWNpZnkgb3B0cyBpbiB0d28gYXJndW1lbnRzXCIpO1xuICAgIGNvbnN0IGggPSBlO1xuICAgIGguQklUUyAmJiAobiA9IGguQklUUyksIGguc3FydCAmJiAoaSA9IGguc3FydCksIHR5cGVvZiBoLmlzTEUgPT0gXCJib29sZWFuXCIgJiYgKHQgPSBoLmlzTEUpLCB0eXBlb2YgaC5tb2RGcm9tQnl0ZXMgPT0gXCJib29sZWFuXCIgJiYgKG8gPSBoLm1vZEZyb21CeXRlcyksIGEgPSBoLmFsbG93ZWRMZW5ndGhzO1xuICB9IGVsc2VcbiAgICB0eXBlb2YgZSA9PSBcIm51bWJlclwiICYmIChuID0gZSksIHIuc3FydCAmJiAoaSA9IHIuc3FydCk7XG4gIGNvbnN0IHsgbkJpdExlbmd0aDogbCwgbkJ5dGVMZW5ndGg6IGMgfSA9IGMwKHMsIG4pO1xuICBpZiAoYyA+IDIwNDgpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmaWVsZDogZXhwZWN0ZWQgT1JERVIgb2YgPD0gMjA0OCBieXRlc1wiKTtcbiAgbGV0IHU7XG4gIGNvbnN0IGQgPSBPYmplY3QuZnJlZXplKHtcbiAgICBPUkRFUjogcyxcbiAgICBpc0xFOiB0LFxuICAgIEJJVFM6IGwsXG4gICAgQllURVM6IGMsXG4gICAgTUFTSzogX2kobCksXG4gICAgWkVSTzogZ3IsXG4gICAgT05FOiBYdCxcbiAgICBhbGxvd2VkTGVuZ3RoczogYSxcbiAgICBjcmVhdGU6IChoKSA9PiBHdChoLCBzKSxcbiAgICBpc1ZhbGlkOiAoaCkgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBoICE9IFwiYmlnaW50XCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgZmllbGQgZWxlbWVudDogZXhwZWN0ZWQgYmlnaW50LCBnb3QgXCIgKyB0eXBlb2YgaCk7XG4gICAgICByZXR1cm4gZ3IgPD0gaCAmJiBoIDwgcztcbiAgICB9LFxuICAgIGlzMDogKGgpID0+IGggPT09IGdyLFxuICAgIC8vIGlzIHZhbGlkIGFuZCBpbnZlcnRpYmxlXG4gICAgaXNWYWxpZE5vdDA6IChoKSA9PiAhZC5pczAoaCkgJiYgZC5pc1ZhbGlkKGgpLFxuICAgIGlzT2RkOiAoaCkgPT4gKGggJiBYdCkgPT09IFh0LFxuICAgIG5lZzogKGgpID0+IEd0KC1oLCBzKSxcbiAgICBlcWw6IChoLCBmKSA9PiBoID09PSBmLFxuICAgIHNxcjogKGgpID0+IEd0KGggKiBoLCBzKSxcbiAgICBhZGQ6IChoLCBmKSA9PiBHdChoICsgZiwgcyksXG4gICAgc3ViOiAoaCwgZikgPT4gR3QoaCAtIGYsIHMpLFxuICAgIG11bDogKGgsIGYpID0+IEd0KGggKiBmLCBzKSxcbiAgICBwb3c6IChoLCBmKSA9PiBkeShkLCBoLCBmKSxcbiAgICBkaXY6IChoLCBmKSA9PiBHdChoICogZ2QoZiwgcyksIHMpLFxuICAgIC8vIFNhbWUgYXMgYWJvdmUsIGJ1dCBkb2Vzbid0IG5vcm1hbGl6ZVxuICAgIHNxck46IChoKSA9PiBoICogaCxcbiAgICBhZGROOiAoaCwgZikgPT4gaCArIGYsXG4gICAgc3ViTjogKGgsIGYpID0+IGggLSBmLFxuICAgIG11bE46IChoLCBmKSA9PiBoICogZixcbiAgICBpbnY6IChoKSA9PiBnZChoLCBzKSxcbiAgICBzcXJ0OiBpIHx8ICgoaCkgPT4gKHUgfHwgKHUgPSBheShzKSksIHUoZCwgaCkpKSxcbiAgICB0b0J5dGVzOiAoaCkgPT4gdCA/IFFmKGgsIGMpIDogemMoaCwgYyksXG4gICAgZnJvbUJ5dGVzOiAoaCwgZiA9ICEwKSA9PiB7XG4gICAgICBpZiAoYSkge1xuICAgICAgICBpZiAoIWEuaW5jbHVkZXMoaC5sZW5ndGgpIHx8IGgubGVuZ3RoID4gYylcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGaWVsZC5mcm9tQnl0ZXM6IGV4cGVjdGVkIFwiICsgYSArIFwiIGJ5dGVzLCBnb3QgXCIgKyBoLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHkgPSBuZXcgVWludDhBcnJheShjKTtcbiAgICAgICAgeS5zZXQoaCwgdCA/IDAgOiB5Lmxlbmd0aCAtIGgubGVuZ3RoKSwgaCA9IHk7XG4gICAgICB9XG4gICAgICBpZiAoaC5sZW5ndGggIT09IGMpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkLmZyb21CeXRlczogZXhwZWN0ZWQgXCIgKyBjICsgXCIgYnl0ZXMsIGdvdCBcIiArIGgubGVuZ3RoKTtcbiAgICAgIGxldCBwID0gdCA/IGVpKGgpIDogbGEoaCk7XG4gICAgICBpZiAobyAmJiAocCA9IEd0KHAsIHMpKSwgIWYgJiYgIWQuaXNWYWxpZChwKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBmaWVsZCBlbGVtZW50OiBvdXRzaWRlIG9mIHJhbmdlIDAuLk9SREVSXCIpO1xuICAgICAgcmV0dXJuIHA7XG4gICAgfSxcbiAgICAvLyBUT0RPOiB3ZSBkb24ndCBuZWVkIGl0IGhlcmUsIG1vdmUgb3V0IHRvIHNlcGFyYXRlIGZuXG4gICAgaW52ZXJ0QmF0Y2g6IChoKSA9PiBsMChkLCBoKSxcbiAgICAvLyBXZSBjYW4ndCBtb3ZlIHRoaXMgb3V0IGJlY2F1c2UgRnA2LCBGcDEyIGltcGxlbWVudCBpdFxuICAgIC8vIGFuZCBpdCdzIHVuY2xlYXIgd2hhdCB0byByZXR1cm4gaW4gdGhlcmUuXG4gICAgY21vdjogKGgsIGYsIHApID0+IHAgPyBmIDogaFxuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoZCk7XG59XG5mdW5jdGlvbiB1MChzKSB7XG4gIGlmICh0eXBlb2YgcyAhPSBcImJpZ2ludFwiKVxuICAgIHRocm93IG5ldyBFcnJvcihcImZpZWxkIG9yZGVyIG11c3QgYmUgYmlnaW50XCIpO1xuICBjb25zdCBlID0gcy50b1N0cmluZygyKS5sZW5ndGg7XG4gIHJldHVybiBNYXRoLmNlaWwoZSAvIDgpO1xufVxuZnVuY3Rpb24gZDAocykge1xuICBjb25zdCBlID0gdTAocyk7XG4gIHJldHVybiBlICsgTWF0aC5jZWlsKGUgLyAyKTtcbn1cbmZ1bmN0aW9uIGh5KHMsIGUsIHQgPSAhMSkge1xuICBjb25zdCByID0gcy5sZW5ndGgsIG4gPSB1MChlKSwgaSA9IGQwKGUpO1xuICBpZiAociA8IDE2IHx8IHIgPCBpIHx8IHIgPiAxMDI0KVxuICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVjdGVkIFwiICsgaSArIFwiLTEwMjQgYnl0ZXMgb2YgaW5wdXQsIGdvdCBcIiArIHIpO1xuICBjb25zdCBvID0gdCA/IGVpKHMpIDogbGEocyksIGEgPSBHdChvLCBlIC0gWHQpICsgWHQ7XG4gIHJldHVybiB0ID8gUWYoYSwgbikgOiB6YyhhLCBuKTtcbn1cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmNvbnN0IERuID0gQmlnSW50KDApLCBWcyA9IEJpZ0ludCgxKTtcbmZ1bmN0aW9uIE9vKHMsIGUpIHtcbiAgY29uc3QgdCA9IGUubmVnYXRlKCk7XG4gIHJldHVybiBzID8gdCA6IGU7XG59XG5mdW5jdGlvbiBqcyhzLCBlKSB7XG4gIGNvbnN0IHQgPSBsMChzLkZwLCBlLm1hcCgocikgPT4gci5aKSk7XG4gIHJldHVybiBlLm1hcCgociwgbikgPT4gcy5mcm9tQWZmaW5lKHIudG9BZmZpbmUodFtuXSkpKTtcbn1cbmZ1bmN0aW9uIGgwKHMsIGUpIHtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihzKSB8fCBzIDw9IDAgfHwgcyA+IGUpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCB3aW5kb3cgc2l6ZSwgZXhwZWN0ZWQgWzEuLlwiICsgZSArIFwiXSwgZ290IFc9XCIgKyBzKTtcbn1cbmZ1bmN0aW9uIEthKHMsIGUpIHtcbiAgaDAocywgZSk7XG4gIGNvbnN0IHQgPSBNYXRoLmNlaWwoZSAvIHMpICsgMSwgciA9IDIgKiogKHMgLSAxKSwgbiA9IDIgKiogcywgaSA9IF9pKHMpLCBvID0gQmlnSW50KHMpO1xuICByZXR1cm4geyB3aW5kb3dzOiB0LCB3aW5kb3dTaXplOiByLCBtYXNrOiBpLCBtYXhOdW1iZXI6IG4sIHNoaWZ0Qnk6IG8gfTtcbn1cbmZ1bmN0aW9uIG1kKHMsIGUsIHQpIHtcbiAgY29uc3QgeyB3aW5kb3dTaXplOiByLCBtYXNrOiBuLCBtYXhOdW1iZXI6IGksIHNoaWZ0Qnk6IG8gfSA9IHQ7XG4gIGxldCBhID0gTnVtYmVyKHMgJiBuKSwgbCA9IHMgPj4gbztcbiAgYSA+IHIgJiYgKGEgLT0gaSwgbCArPSBWcyk7XG4gIGNvbnN0IGMgPSBlICogciwgdSA9IGMgKyBNYXRoLmFicyhhKSAtIDEsIGQgPSBhID09PSAwLCBoID0gYSA8IDAsIGYgPSBlICUgMiAhPT0gMDtcbiAgcmV0dXJuIHsgbmV4dE46IGwsIG9mZnNldDogdSwgaXNaZXJvOiBkLCBpc05lZzogaCwgaXNOZWdGOiBmLCBvZmZzZXRGOiBjIH07XG59XG5mdW5jdGlvbiBmeShzLCBlKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShzKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJhcnJheSBleHBlY3RlZFwiKTtcbiAgcy5mb3JFYWNoKCh0LCByKSA9PiB7XG4gICAgaWYgKCEodCBpbnN0YW5jZW9mIGUpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBwb2ludCBhdCBpbmRleCBcIiArIHIpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGd5KHMsIGUpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHMpKVxuICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5IG9mIHNjYWxhcnMgZXhwZWN0ZWRcIik7XG4gIHMuZm9yRWFjaCgodCwgcikgPT4ge1xuICAgIGlmICghZS5pc1ZhbGlkKHQpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBzY2FsYXIgYXQgaW5kZXggXCIgKyByKTtcbiAgfSk7XG59XG5jb25zdCBIYSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBmMCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gcWEocykge1xuICByZXR1cm4gZjAuZ2V0KHMpIHx8IDE7XG59XG5mdW5jdGlvbiB5ZChzKSB7XG4gIGlmIChzICE9PSBEbilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHdOQUZcIik7XG59XG5jbGFzcyBnMCB7XG4gIC8vIFBhcmFtZXRyaXplZCB3aXRoIGEgZ2l2ZW4gUG9pbnQgY2xhc3MgKG5vdCBpbmRpdmlkdWFsIHBvaW50KVxuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgdGhpcy5CQVNFID0gZS5CQVNFLCB0aGlzLlpFUk8gPSBlLlpFUk8sIHRoaXMuRm4gPSBlLkZuLCB0aGlzLmJpdHMgPSB0O1xuICB9XG4gIC8vIG5vbi1jb25zdCB0aW1lIG11bHRpcGxpY2F0aW9uIGxhZGRlclxuICBfdW5zYWZlTGFkZGVyKGUsIHQsIHIgPSB0aGlzLlpFUk8pIHtcbiAgICBsZXQgbiA9IGU7XG4gICAgZm9yICg7IHQgPiBEbjsgKVxuICAgICAgdCAmIFZzICYmIChyID0gci5hZGQobikpLCBuID0gbi5kb3VibGUoKSwgdCA+Pj0gVnM7XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB3TkFGIHByZWNvbXB1dGF0aW9uIHdpbmRvdy4gVXNlZCBmb3IgY2FjaGluZy5cbiAgICogRGVmYXVsdCB3aW5kb3cgc2l6ZSBpcyBzZXQgYnkgYHV0aWxzLnByZWNvbXB1dGUoKWAgYW5kIGlzIGVxdWFsIHRvIDguXG4gICAqIE51bWJlciBvZiBwcmVjb21wdXRlZCBwb2ludHMgZGVwZW5kcyBvbiB0aGUgY3VydmUgc2l6ZTpcbiAgICogMl4o8J2RiuKIkjEpICogKE1hdGguY2VpbCjwnZGbIC8g8J2RiikgKyAxKSwgd2hlcmU6XG4gICAqIC0g8J2RiiBpcyB0aGUgd2luZG93IHNpemVcbiAgICogLSDwnZGbIGlzIHRoZSBiaXRsZW5ndGggb2YgdGhlIGN1cnZlIG9yZGVyLlxuICAgKiBGb3IgYSAyNTYtYml0IGN1cnZlIGFuZCB3aW5kb3cgc2l6ZSA4LCB0aGUgbnVtYmVyIG9mIHByZWNvbXB1dGVkIHBvaW50cyBpcyAxMjggKiAzMyA9IDQyMjQuXG4gICAqIEBwYXJhbSBwb2ludCBQb2ludCBpbnN0YW5jZVxuICAgKiBAcGFyYW0gVyB3aW5kb3cgc2l6ZVxuICAgKiBAcmV0dXJucyBwcmVjb21wdXRlZCBwb2ludCB0YWJsZXMgZmxhdHRlbmVkIHRvIGEgc2luZ2xlIGFycmF5XG4gICAqL1xuICBwcmVjb21wdXRlV2luZG93KGUsIHQpIHtcbiAgICBjb25zdCB7IHdpbmRvd3M6IHIsIHdpbmRvd1NpemU6IG4gfSA9IEthKHQsIHRoaXMuYml0cyksIGkgPSBbXTtcbiAgICBsZXQgbyA9IGUsIGEgPSBvO1xuICAgIGZvciAobGV0IGwgPSAwOyBsIDwgcjsgbCsrKSB7XG4gICAgICBhID0gbywgaS5wdXNoKGEpO1xuICAgICAgZm9yIChsZXQgYyA9IDE7IGMgPCBuOyBjKyspXG4gICAgICAgIGEgPSBhLmFkZChvKSwgaS5wdXNoKGEpO1xuICAgICAgbyA9IGEuZG91YmxlKCk7XG4gICAgfVxuICAgIHJldHVybiBpO1xuICB9XG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGVjIG11bHRpcGxpY2F0aW9uIHVzaW5nIHByZWNvbXB1dGVkIHRhYmxlcyBhbmQgdy1hcnkgbm9uLWFkamFjZW50IGZvcm0uXG4gICAqIE1vcmUgY29tcGFjdCBpbXBsZW1lbnRhdGlvbjpcbiAgICogaHR0cHM6Ly9naXRodWIuY29tL3BhdWxtaWxsci9ub2JsZS1zZWNwMjU2azEvYmxvYi80N2NiMTY2OWI2ZTUwNmFkNjZiMzVmZTdkNzYxMzJhZTk3NDY1ZGEyL2luZGV4LnRzI0w1MDItTDU0MVxuICAgKiBAcmV0dXJucyByZWFsIGFuZCBmYWtlIChmb3IgY29uc3QtdGltZSkgcG9pbnRzXG4gICAqL1xuICB3TkFGKGUsIHQsIHIpIHtcbiAgICBpZiAoIXRoaXMuRm4uaXNWYWxpZChyKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgc2NhbGFyXCIpO1xuICAgIGxldCBuID0gdGhpcy5aRVJPLCBpID0gdGhpcy5CQVNFO1xuICAgIGNvbnN0IG8gPSBLYShlLCB0aGlzLmJpdHMpO1xuICAgIGZvciAobGV0IGEgPSAwOyBhIDwgby53aW5kb3dzOyBhKyspIHtcbiAgICAgIGNvbnN0IHsgbmV4dE46IGwsIG9mZnNldDogYywgaXNaZXJvOiB1LCBpc05lZzogZCwgaXNOZWdGOiBoLCBvZmZzZXRGOiBmIH0gPSBtZChyLCBhLCBvKTtcbiAgICAgIHIgPSBsLCB1ID8gaSA9IGkuYWRkKE9vKGgsIHRbZl0pKSA6IG4gPSBuLmFkZChPbyhkLCB0W2NdKSk7XG4gICAgfVxuICAgIHJldHVybiB5ZChyKSwgeyBwOiBuLCBmOiBpIH07XG4gIH1cbiAgLyoqXG4gICAqIEltcGxlbWVudHMgZWMgdW5zYWZlIChub24gY29uc3QtdGltZSkgbXVsdGlwbGljYXRpb24gdXNpbmcgcHJlY29tcHV0ZWQgdGFibGVzIGFuZCB3LWFyeSBub24tYWRqYWNlbnQgZm9ybS5cbiAgICogQHBhcmFtIGFjYyBhY2N1bXVsYXRvciBwb2ludCB0byBhZGQgcmVzdWx0IG9mIG11bHRpcGxpY2F0aW9uXG4gICAqIEByZXR1cm5zIHBvaW50XG4gICAqL1xuICB3TkFGVW5zYWZlKGUsIHQsIHIsIG4gPSB0aGlzLlpFUk8pIHtcbiAgICBjb25zdCBpID0gS2EoZSwgdGhpcy5iaXRzKTtcbiAgICBmb3IgKGxldCBvID0gMDsgbyA8IGkud2luZG93cyAmJiByICE9PSBEbjsgbysrKSB7XG4gICAgICBjb25zdCB7IG5leHROOiBhLCBvZmZzZXQ6IGwsIGlzWmVybzogYywgaXNOZWc6IHUgfSA9IG1kKHIsIG8sIGkpO1xuICAgICAgaWYgKHIgPSBhLCAhYykge1xuICAgICAgICBjb25zdCBkID0gdFtsXTtcbiAgICAgICAgbiA9IG4uYWRkKHUgPyBkLm5lZ2F0ZSgpIDogZCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB5ZChyKSwgbjtcbiAgfVxuICBnZXRQcmVjb21wdXRlcyhlLCB0LCByKSB7XG4gICAgbGV0IG4gPSBIYS5nZXQodCk7XG4gICAgcmV0dXJuIG4gfHwgKG4gPSB0aGlzLnByZWNvbXB1dGVXaW5kb3codCwgZSksIGUgIT09IDEgJiYgKHR5cGVvZiByID09IFwiZnVuY3Rpb25cIiAmJiAobiA9IHIobikpLCBIYS5zZXQodCwgbikpKSwgbjtcbiAgfVxuICBjYWNoZWQoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSBxYShlKTtcbiAgICByZXR1cm4gdGhpcy53TkFGKG4sIHRoaXMuZ2V0UHJlY29tcHV0ZXMobiwgZSwgciksIHQpO1xuICB9XG4gIHVuc2FmZShlLCB0LCByLCBuKSB7XG4gICAgY29uc3QgaSA9IHFhKGUpO1xuICAgIHJldHVybiBpID09PSAxID8gdGhpcy5fdW5zYWZlTGFkZGVyKGUsIHQsIG4pIDogdGhpcy53TkFGVW5zYWZlKGksIHRoaXMuZ2V0UHJlY29tcHV0ZXMoaSwgZSwgciksIHQsIG4pO1xuICB9XG4gIC8vIFdlIGNhbGN1bGF0ZSBwcmVjb21wdXRlcyBmb3IgZWxsaXB0aWMgY3VydmUgcG9pbnQgbXVsdGlwbGljYXRpb25cbiAgLy8gdXNpbmcgd2luZG93ZWQgbWV0aG9kLiBUaGlzIHNwZWNpZmllcyB3aW5kb3cgc2l6ZSBhbmRcbiAgLy8gc3RvcmVzIHByZWNvbXB1dGVkIHZhbHVlcy4gVXN1YWxseSBvbmx5IGJhc2UgcG9pbnQgd291bGQgYmUgcHJlY29tcHV0ZWQuXG4gIGNyZWF0ZUNhY2hlKGUsIHQpIHtcbiAgICBoMCh0LCB0aGlzLmJpdHMpLCBmMC5zZXQoZSwgdCksIEhhLmRlbGV0ZShlKTtcbiAgfVxuICBoYXNDYWNoZShlKSB7XG4gICAgcmV0dXJuIHFhKGUpICE9PSAxO1xuICB9XG59XG5mdW5jdGlvbiBweShzLCBlLCB0LCByKSB7XG4gIGxldCBuID0gZSwgaSA9IHMuWkVSTywgbyA9IHMuWkVSTztcbiAgZm9yICg7IHQgPiBEbiB8fCByID4gRG47IClcbiAgICB0ICYgVnMgJiYgKGkgPSBpLmFkZChuKSksIHIgJiBWcyAmJiAobyA9IG8uYWRkKG4pKSwgbiA9IG4uZG91YmxlKCksIHQgPj49IFZzLCByID4+PSBWcztcbiAgcmV0dXJuIHsgcDE6IGksIHAyOiBvIH07XG59XG5mdW5jdGlvbiBwMChzLCBlLCB0LCByKSB7XG4gIGZ5KHQsIHMpLCBneShyLCBlKTtcbiAgY29uc3QgbiA9IHQubGVuZ3RoLCBpID0gci5sZW5ndGg7XG4gIGlmIChuICE9PSBpKVxuICAgIHRocm93IG5ldyBFcnJvcihcImFycmF5cyBvZiBwb2ludHMgYW5kIHNjYWxhcnMgbXVzdCBoYXZlIGVxdWFsIGxlbmd0aFwiKTtcbiAgY29uc3QgbyA9IHMuWkVSTywgYSA9IGUwKEJpZ0ludChuKSk7XG4gIGxldCBsID0gMTtcbiAgYSA+IDEyID8gbCA9IGEgLSAzIDogYSA+IDQgPyBsID0gYSAtIDIgOiBhID4gMCAmJiAobCA9IDIpO1xuICBjb25zdCBjID0gX2kobCksIHUgPSBuZXcgQXJyYXkoTnVtYmVyKGMpICsgMSkuZmlsbChvKSwgZCA9IE1hdGguZmxvb3IoKGUuQklUUyAtIDEpIC8gbCkgKiBsO1xuICBsZXQgaCA9IG87XG4gIGZvciAobGV0IGYgPSBkOyBmID49IDA7IGYgLT0gbCkge1xuICAgIHUuZmlsbChvKTtcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGk7IHkrKykge1xuICAgICAgY29uc3QgRSA9IHJbeV0sIGIgPSBOdW1iZXIoRSA+PiBCaWdJbnQoZikgJiBjKTtcbiAgICAgIHVbYl0gPSB1W2JdLmFkZCh0W3ldKTtcbiAgICB9XG4gICAgbGV0IHAgPSBvO1xuICAgIGZvciAobGV0IHkgPSB1Lmxlbmd0aCAtIDEsIEUgPSBvOyB5ID4gMDsgeS0tKVxuICAgICAgRSA9IEUuYWRkKHVbeV0pLCBwID0gcC5hZGQoRSk7XG4gICAgaWYgKGggPSBoLmFkZChwKSwgZiAhPT0gMClcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgbDsgeSsrKVxuICAgICAgICBoID0gaC5kb3VibGUoKTtcbiAgfVxuICByZXR1cm4gaDtcbn1cbmZ1bmN0aW9uIHZkKHMsIGUsIHQpIHtcbiAgaWYgKGUpIHtcbiAgICBpZiAoZS5PUkRFUiAhPT0gcylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkLk9SREVSIG11c3QgbWF0Y2ggb3JkZXI6IEZwID09IHAsIEZuID09IG5cIik7XG4gICAgcmV0dXJuIHV5KGUpLCBlO1xuICB9IGVsc2VcbiAgICByZXR1cm4gZW4ocywgeyBpc0xFOiB0IH0pO1xufVxuZnVuY3Rpb24gbTAocywgZSwgdCA9IHt9LCByKSB7XG4gIGlmIChyID09PSB2b2lkIDAgJiYgKHIgPSBzID09PSBcImVkd2FyZHNcIiksICFlIHx8IHR5cGVvZiBlICE9IFwib2JqZWN0XCIpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCB2YWxpZCAke3N9IENVUlZFIG9iamVjdGApO1xuICBmb3IgKGNvbnN0IGwgb2YgW1wicFwiLCBcIm5cIiwgXCJoXCJdKSB7XG4gICAgY29uc3QgYyA9IGVbbF07XG4gICAgaWYgKCEodHlwZW9mIGMgPT0gXCJiaWdpbnRcIiAmJiBjID4gRG4pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDVVJWRS4ke2x9IG11c3QgYmUgcG9zaXRpdmUgYmlnaW50YCk7XG4gIH1cbiAgY29uc3QgbiA9IHZkKGUucCwgdC5GcCwgciksIGkgPSB2ZChlLm4sIHQuRm4sIHIpLCBhID0gW1wiR3hcIiwgXCJHeVwiLCBcImFcIiwgcyA9PT0gXCJ3ZWllcnN0cmFzc1wiID8gXCJiXCIgOiBcImRcIl07XG4gIGZvciAoY29uc3QgbCBvZiBhKVxuICAgIGlmICghbi5pc1ZhbGlkKGVbbF0pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDVVJWRS4ke2x9IG11c3QgYmUgdmFsaWQgZmllbGQgZWxlbWVudCBvZiBDVVJWRS5GcGApO1xuICByZXR1cm4gZSA9IE9iamVjdC5mcmVlemUoT2JqZWN0LmFzc2lnbih7fSwgZSkpLCB7IENVUlZFOiBlLCBGcDogbiwgRm46IGkgfTtcbn1cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmNvbnN0IHhzID0gQmlnSW50KDApLCB6dCA9IEJpZ0ludCgxKSwgV2EgPSBCaWdJbnQoMiksIG15ID0gQmlnSW50KDgpO1xuZnVuY3Rpb24geXkocywgZSwgdCwgcikge1xuICBjb25zdCBuID0gcy5zcXIodCksIGkgPSBzLnNxcihyKSwgbyA9IHMuYWRkKHMubXVsKGUuYSwgbiksIGkpLCBhID0gcy5hZGQocy5PTkUsIHMubXVsKGUuZCwgcy5tdWwobiwgaSkpKTtcbiAgcmV0dXJuIHMuZXFsKG8sIGEpO1xufVxuZnVuY3Rpb24gdnkocywgZSA9IHt9KSB7XG4gIGNvbnN0IHQgPSBtMChcImVkd2FyZHNcIiwgcywgZSwgZS5GcEZuTEUpLCB7IEZwOiByLCBGbjogbiB9ID0gdDtcbiAgbGV0IGkgPSB0LkNVUlZFO1xuICBjb25zdCB7IGg6IG8gfSA9IGk7XG4gIFJpKGUsIHt9LCB7IHV2UmF0aW86IFwiZnVuY3Rpb25cIiB9KTtcbiAgY29uc3QgYSA9IFdhIDw8IEJpZ0ludChuLkJZVEVTICogOCkgLSB6dCwgbCA9IChFKSA9PiByLmNyZWF0ZShFKSwgYyA9IGUudXZSYXRpbyB8fCAoKEUsIGIpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHsgaXNWYWxpZDogITAsIHZhbHVlOiByLnNxcnQoci5kaXYoRSwgYikpIH07XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4geyBpc1ZhbGlkOiAhMSwgdmFsdWU6IHhzIH07XG4gICAgfVxuICB9KTtcbiAgaWYgKCF5eShyLCBpLCBpLkd4LCBpLkd5KSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYWQgY3VydmUgcGFyYW1zOiBnZW5lcmF0b3IgcG9pbnRcIik7XG4gIGZ1bmN0aW9uIHUoRSwgYiwgUiA9ICExKSB7XG4gICAgY29uc3QgQSA9IFIgPyB6dCA6IHhzO1xuICAgIHJldHVybiBRbChcImNvb3JkaW5hdGUgXCIgKyBFLCBiLCBBLCBhKSwgYjtcbiAgfVxuICBmdW5jdGlvbiBkKEUpIHtcbiAgICBpZiAoIShFIGluc3RhbmNlb2YgcCkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHRlbmRlZFBvaW50IGV4cGVjdGVkXCIpO1xuICB9XG4gIGNvbnN0IGggPSBNbygoRSwgYikgPT4ge1xuICAgIGNvbnN0IHsgWDogUiwgWTogQSwgWjogRiB9ID0gRSwgTSA9IEUuaXMwKCk7XG4gICAgYiA9PSBudWxsICYmIChiID0gTSA/IG15IDogci5pbnYoRikpO1xuICAgIGNvbnN0IEggPSBsKFIgKiBiKSwgSyA9IGwoQSAqIGIpLCBqID0gci5tdWwoRiwgYik7XG4gICAgaWYgKE0pXG4gICAgICByZXR1cm4geyB4OiB4cywgeTogenQgfTtcbiAgICBpZiAoaiAhPT0genQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZaIHdhcyBpbnZhbGlkXCIpO1xuICAgIHJldHVybiB7IHg6IEgsIHk6IEsgfTtcbiAgfSksIGYgPSBNbygoRSkgPT4ge1xuICAgIGNvbnN0IHsgYTogYiwgZDogUiB9ID0gaTtcbiAgICBpZiAoRS5pczAoKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogWkVST1wiKTtcbiAgICBjb25zdCB7IFg6IEEsIFk6IEYsIFo6IE0sIFQ6IEggfSA9IEUsIEsgPSBsKEEgKiBBKSwgaiA9IGwoRiAqIEYpLCBDID0gbChNICogTSksIGsgPSBsKEMgKiBDKSwgJCA9IGwoSyAqIGIpLCBXID0gbChDICogbCgkICsgaikpLCBfID0gbChrICsgbChSICogbChLICogaikpKTtcbiAgICBpZiAoVyAhPT0gXylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogZXF1YXRpb24gbGVmdCAhPSByaWdodCAoMSlcIik7XG4gICAgY29uc3QgZyA9IGwoQSAqIEYpLCB4ID0gbChNICogSCk7XG4gICAgaWYgKGcgIT09IHgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYWQgcG9pbnQ6IGVxdWF0aW9uIGxlZnQgIT0gcmlnaHQgKDIpXCIpO1xuICAgIHJldHVybiAhMDtcbiAgfSk7XG4gIGNsYXNzIHAge1xuICAgIGNvbnN0cnVjdG9yKGIsIFIsIEEsIEYpIHtcbiAgICAgIHRoaXMuWCA9IHUoXCJ4XCIsIGIpLCB0aGlzLlkgPSB1KFwieVwiLCBSKSwgdGhpcy5aID0gdShcInpcIiwgQSwgITApLCB0aGlzLlQgPSB1KFwidFwiLCBGKSwgT2JqZWN0LmZyZWV6ZSh0aGlzKTtcbiAgICB9XG4gICAgc3RhdGljIENVUlZFKCkge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tQWZmaW5lKGIpIHtcbiAgICAgIGlmIChiIGluc3RhbmNlb2YgcClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXh0ZW5kZWQgcG9pbnQgbm90IGFsbG93ZWRcIik7XG4gICAgICBjb25zdCB7IHg6IFIsIHk6IEEgfSA9IGIgfHwge307XG4gICAgICByZXR1cm4gdShcInhcIiwgUiksIHUoXCJ5XCIsIEEpLCBuZXcgcChSLCBBLCB6dCwgbChSICogQSkpO1xuICAgIH1cbiAgICAvLyBVc2VzIGFsZ28gZnJvbSBSRkM4MDMyIDUuMS4zLlxuICAgIHN0YXRpYyBmcm9tQnl0ZXMoYiwgUiA9ICExKSB7XG4gICAgICBjb25zdCBBID0gci5CWVRFUywgeyBhOiBGLCBkOiBNIH0gPSBpO1xuICAgICAgYiA9IGZkKE9yKGIsIEEsIFwicG9pbnRcIikpLCBYcyhSLCBcInppcDIxNVwiKTtcbiAgICAgIGNvbnN0IEggPSBmZChiKSwgSyA9IGJbQSAtIDFdO1xuICAgICAgSFtBIC0gMV0gPSBLICYgLTEyOTtcbiAgICAgIGNvbnN0IGogPSBlaShIKSwgQyA9IFIgPyBhIDogci5PUkRFUjtcbiAgICAgIFFsKFwicG9pbnQueVwiLCBqLCB4cywgQyk7XG4gICAgICBjb25zdCBrID0gbChqICogaiksICQgPSBsKGsgLSB6dCksIFcgPSBsKE0gKiBrIC0gRik7XG4gICAgICBsZXQgeyBpc1ZhbGlkOiBfLCB2YWx1ZTogZyB9ID0gYygkLCBXKTtcbiAgICAgIGlmICghXylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIHBvaW50OiBpbnZhbGlkIHkgY29vcmRpbmF0ZVwiKTtcbiAgICAgIGNvbnN0IHggPSAoZyAmIHp0KSA9PT0genQsIHcgPSAoSyAmIDEyOCkgIT09IDA7XG4gICAgICBpZiAoIVIgJiYgZyA9PT0geHMgJiYgdylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIHBvaW50OiB4PTAgYW5kIHhfMD0xXCIpO1xuICAgICAgcmV0dXJuIHcgIT09IHggJiYgKGcgPSBsKC1nKSksIHAuZnJvbUFmZmluZSh7IHg6IGcsIHk6IGogfSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tSGV4KGIsIFIgPSAhMSkge1xuICAgICAgcmV0dXJuIHAuZnJvbUJ5dGVzKEV0KFwicG9pbnRcIiwgYiksIFIpO1xuICAgIH1cbiAgICBnZXQgeCgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQWZmaW5lKCkueDtcbiAgICB9XG4gICAgZ2V0IHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0FmZmluZSgpLnk7XG4gICAgfVxuICAgIHByZWNvbXB1dGUoYiA9IDgsIFIgPSAhMCkge1xuICAgICAgcmV0dXJuIHkuY3JlYXRlQ2FjaGUodGhpcywgYiksIFIgfHwgdGhpcy5tdWx0aXBseShXYSksIHRoaXM7XG4gICAgfVxuICAgIC8vIFVzZWZ1bCBpbiBmcm9tQWZmaW5lKCkgLSBub3QgZm9yIGZyb21CeXRlcygpLCB3aGljaCBhbHdheXMgY3JlYXRlZCB2YWxpZCBwb2ludHMuXG4gICAgYXNzZXJ0VmFsaWRpdHkoKSB7XG4gICAgICBmKHRoaXMpO1xuICAgIH1cbiAgICAvLyBDb21wYXJlIG9uZSBwb2ludCB0byBhbm90aGVyLlxuICAgIGVxdWFscyhiKSB7XG4gICAgICBkKGIpO1xuICAgICAgY29uc3QgeyBYOiBSLCBZOiBBLCBaOiBGIH0gPSB0aGlzLCB7IFg6IE0sIFk6IEgsIFo6IEsgfSA9IGIsIGogPSBsKFIgKiBLKSwgQyA9IGwoTSAqIEYpLCBrID0gbChBICogSyksICQgPSBsKEggKiBGKTtcbiAgICAgIHJldHVybiBqID09PSBDICYmIGsgPT09ICQ7XG4gICAgfVxuICAgIGlzMCgpIHtcbiAgICAgIHJldHVybiB0aGlzLmVxdWFscyhwLlpFUk8pO1xuICAgIH1cbiAgICBuZWdhdGUoKSB7XG4gICAgICByZXR1cm4gbmV3IHAobCgtdGhpcy5YKSwgdGhpcy5ZLCB0aGlzLlosIGwoLXRoaXMuVCkpO1xuICAgIH1cbiAgICAvLyBGYXN0IGFsZ28gZm9yIGRvdWJsaW5nIEV4dGVuZGVkIFBvaW50LlxuICAgIC8vIGh0dHBzOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQuaHRtbCNkb3VibGluZy1kYmwtMjAwOC1od2NkXG4gICAgLy8gQ29zdDogNE0gKyA0UyArIDEqYSArIDZhZGQgKyAxKjIuXG4gICAgZG91YmxlKCkge1xuICAgICAgY29uc3QgeyBhOiBiIH0gPSBpLCB7IFg6IFIsIFk6IEEsIFo6IEYgfSA9IHRoaXMsIE0gPSBsKFIgKiBSKSwgSCA9IGwoQSAqIEEpLCBLID0gbChXYSAqIGwoRiAqIEYpKSwgaiA9IGwoYiAqIE0pLCBDID0gUiArIEEsIGsgPSBsKGwoQyAqIEMpIC0gTSAtIEgpLCAkID0gaiArIEgsIFcgPSAkIC0gSywgXyA9IGogLSBILCBnID0gbChrICogVyksIHggPSBsKCQgKiBfKSwgdyA9IGwoayAqIF8pLCBEID0gbChXICogJCk7XG4gICAgICByZXR1cm4gbmV3IHAoZywgeCwgRCwgdyk7XG4gICAgfVxuICAgIC8vIEZhc3QgYWxnbyBmb3IgYWRkaW5nIDIgRXh0ZW5kZWQgUG9pbnRzLlxuICAgIC8vIGh0dHBzOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQuaHRtbCNhZGRpdGlvbi1hZGQtMjAwOC1od2NkXG4gICAgLy8gQ29zdDogOU0gKyAxKmEgKyAxKmQgKyA3YWRkLlxuICAgIGFkZChiKSB7XG4gICAgICBkKGIpO1xuICAgICAgY29uc3QgeyBhOiBSLCBkOiBBIH0gPSBpLCB7IFg6IEYsIFk6IE0sIFo6IEgsIFQ6IEsgfSA9IHRoaXMsIHsgWDogaiwgWTogQywgWjogaywgVDogJCB9ID0gYiwgVyA9IGwoRiAqIGopLCBfID0gbChNICogQyksIGcgPSBsKEsgKiBBICogJCksIHggPSBsKEggKiBrKSwgdyA9IGwoKEYgKyBNKSAqIChqICsgQykgLSBXIC0gXyksIEQgPSB4IC0gZywgTyA9IHggKyBnLCBVID0gbChfIC0gUiAqIFcpLCBWID0gbCh3ICogRCksIEwgPSBsKE8gKiBVKSwgbSA9IGwodyAqIFUpLCB2ID0gbChEICogTyk7XG4gICAgICByZXR1cm4gbmV3IHAoViwgTCwgdiwgbSk7XG4gICAgfVxuICAgIHN1YnRyYWN0KGIpIHtcbiAgICAgIHJldHVybiB0aGlzLmFkZChiLm5lZ2F0ZSgpKTtcbiAgICB9XG4gICAgLy8gQ29uc3RhbnQtdGltZSBtdWx0aXBsaWNhdGlvbi5cbiAgICBtdWx0aXBseShiKSB7XG4gICAgICBpZiAoIW4uaXNWYWxpZE5vdDAoYikpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgc2NhbGFyOiBleHBlY3RlZCAxIDw9IHNjIDwgY3VydmUublwiKTtcbiAgICAgIGNvbnN0IHsgcDogUiwgZjogQSB9ID0geS5jYWNoZWQodGhpcywgYiwgKEYpID0+IGpzKHAsIEYpKTtcbiAgICAgIHJldHVybiBqcyhwLCBbUiwgQV0pWzBdO1xuICAgIH1cbiAgICAvLyBOb24tY29uc3RhbnQtdGltZSBtdWx0aXBsaWNhdGlvbi4gVXNlcyBkb3VibGUtYW5kLWFkZCBhbGdvcml0aG0uXG4gICAgLy8gSXQncyBmYXN0ZXIsIGJ1dCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4geW91IGRvbid0IGNhcmUgYWJvdXRcbiAgICAvLyBhbiBleHBvc2VkIHByaXZhdGUga2V5IGUuZy4gc2lnIHZlcmlmaWNhdGlvbi5cbiAgICAvLyBEb2VzIE5PVCBhbGxvdyBzY2FsYXJzIGhpZ2hlciB0aGFuIENVUlZFLm4uXG4gICAgLy8gQWNjZXB0cyBvcHRpb25hbCBhY2N1bXVsYXRvciB0byBtZXJnZSB3aXRoIG11bHRpcGx5IChpbXBvcnRhbnQgZm9yIHNwYXJzZSBzY2FsYXJzKVxuICAgIG11bHRpcGx5VW5zYWZlKGIsIFIgPSBwLlpFUk8pIHtcbiAgICAgIGlmICghbi5pc1ZhbGlkKGIpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHNjYWxhcjogZXhwZWN0ZWQgMCA8PSBzYyA8IGN1cnZlLm5cIik7XG4gICAgICByZXR1cm4gYiA9PT0geHMgPyBwLlpFUk8gOiB0aGlzLmlzMCgpIHx8IGIgPT09IHp0ID8gdGhpcyA6IHkudW5zYWZlKHRoaXMsIGIsIChBKSA9PiBqcyhwLCBBKSwgUik7XG4gICAgfVxuICAgIC8vIENoZWNrcyBpZiBwb2ludCBpcyBvZiBzbWFsbCBvcmRlci5cbiAgICAvLyBJZiB5b3UgYWRkIHNvbWV0aGluZyB0byBzbWFsbCBvcmRlciBwb2ludCwgeW91IHdpbGwgaGF2ZSBcImRpcnR5XCJcbiAgICAvLyBwb2ludCB3aXRoIHRvcnNpb24gY29tcG9uZW50LlxuICAgIC8vIE11bHRpcGxpZXMgcG9pbnQgYnkgY29mYWN0b3IgYW5kIGNoZWNrcyBpZiB0aGUgcmVzdWx0IGlzIDAuXG4gICAgaXNTbWFsbE9yZGVyKCkge1xuICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlVbnNhZmUobykuaXMwKCk7XG4gICAgfVxuICAgIC8vIE11bHRpcGxpZXMgcG9pbnQgYnkgY3VydmUgb3JkZXIgYW5kIGNoZWNrcyBpZiB0aGUgcmVzdWx0IGlzIDAuXG4gICAgLy8gUmV0dXJucyBgZmFsc2VgIGlzIHRoZSBwb2ludCBpcyBkaXJ0eS5cbiAgICBpc1RvcnNpb25GcmVlKCkge1xuICAgICAgcmV0dXJuIHkudW5zYWZlKHRoaXMsIGkubikuaXMwKCk7XG4gICAgfVxuICAgIC8vIENvbnZlcnRzIEV4dGVuZGVkIHBvaW50IHRvIGRlZmF1bHQgKHgsIHkpIGNvb3JkaW5hdGVzLlxuICAgIC8vIENhbiBhY2NlcHQgcHJlY29tcHV0ZWQgWl4tMSAtIGZvciBleGFtcGxlLCBmcm9tIGludmVydEJhdGNoLlxuICAgIHRvQWZmaW5lKGIpIHtcbiAgICAgIHJldHVybiBoKHRoaXMsIGIpO1xuICAgIH1cbiAgICBjbGVhckNvZmFjdG9yKCkge1xuICAgICAgcmV0dXJuIG8gPT09IHp0ID8gdGhpcyA6IHRoaXMubXVsdGlwbHlVbnNhZmUobyk7XG4gICAgfVxuICAgIHRvQnl0ZXMoKSB7XG4gICAgICBjb25zdCB7IHg6IGIsIHk6IFIgfSA9IHRoaXMudG9BZmZpbmUoKSwgQSA9IHIudG9CeXRlcyhSKTtcbiAgICAgIHJldHVybiBBW0EubGVuZ3RoIC0gMV0gfD0gYiAmIHp0ID8gMTI4IDogMCwgQTtcbiAgICB9XG4gICAgdG9IZXgoKSB7XG4gICAgICByZXR1cm4gSHModGhpcy50b0J5dGVzKCkpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBgPFBvaW50ICR7dGhpcy5pczAoKSA/IFwiWkVST1wiIDogdGhpcy50b0hleCgpfT5gO1xuICAgIH1cbiAgICAvLyBUT0RPOiByZW1vdmVcbiAgICBnZXQgZXgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5YO1xuICAgIH1cbiAgICBnZXQgZXkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5ZO1xuICAgIH1cbiAgICBnZXQgZXooKSB7XG4gICAgICByZXR1cm4gdGhpcy5aO1xuICAgIH1cbiAgICBnZXQgZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5UO1xuICAgIH1cbiAgICBzdGF0aWMgbm9ybWFsaXplWihiKSB7XG4gICAgICByZXR1cm4ganMocCwgYik7XG4gICAgfVxuICAgIHN0YXRpYyBtc20oYiwgUikge1xuICAgICAgcmV0dXJuIHAwKHAsIG4sIGIsIFIpO1xuICAgIH1cbiAgICBfc2V0V2luZG93U2l6ZShiKSB7XG4gICAgICB0aGlzLnByZWNvbXB1dGUoYik7XG4gICAgfVxuICAgIHRvUmF3Qnl0ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0J5dGVzKCk7XG4gICAgfVxuICB9XG4gIHAuQkFTRSA9IG5ldyBwKGkuR3gsIGkuR3ksIHp0LCBsKGkuR3ggKiBpLkd5KSksIHAuWkVSTyA9IG5ldyBwKHhzLCB6dCwgenQsIHhzKSwgcC5GcCA9IHIsIHAuRm4gPSBuO1xuICBjb25zdCB5ID0gbmV3IGcwKHAsIG4uQklUUyk7XG4gIHJldHVybiBwLkJBU0UucHJlY29tcHV0ZSg4KSwgcDtcbn1cbmZ1bmN0aW9uIEV5KHMsIGUsIHQgPSB7fSkge1xuICBpZiAodHlwZW9mIGUgIT0gXCJmdW5jdGlvblwiKVxuICAgIHRocm93IG5ldyBFcnJvcignXCJoYXNoXCIgZnVuY3Rpb24gcGFyYW0gaXMgcmVxdWlyZWQnKTtcbiAgUmkodCwge30sIHtcbiAgICBhZGp1c3RTY2FsYXJCeXRlczogXCJmdW5jdGlvblwiLFxuICAgIHJhbmRvbUJ5dGVzOiBcImZ1bmN0aW9uXCIsXG4gICAgZG9tYWluOiBcImZ1bmN0aW9uXCIsXG4gICAgcHJlaGFzaDogXCJmdW5jdGlvblwiLFxuICAgIG1hcFRvQ3VydmU6IFwiZnVuY3Rpb25cIlxuICB9KTtcbiAgY29uc3QgeyBwcmVoYXNoOiByIH0gPSB0LCB7IEJBU0U6IG4sIEZwOiBpLCBGbjogbyB9ID0gcywgYSA9IHQucmFuZG9tQnl0ZXMgfHwgcWMsIGwgPSB0LmFkanVzdFNjYWxhckJ5dGVzIHx8ICgoQykgPT4gQyksIGMgPSB0LmRvbWFpbiB8fCAoKEMsIGssICQpID0+IHtcbiAgICBpZiAoWHMoJCwgXCJwaGZsYWdcIiksIGsubGVuZ3RoIHx8ICQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0cy9wcmUtaGFzaCBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICByZXR1cm4gQztcbiAgfSk7XG4gIGZ1bmN0aW9uIHUoQykge1xuICAgIHJldHVybiBvLmNyZWF0ZShlaShDKSk7XG4gIH1cbiAgZnVuY3Rpb24gZChDKSB7XG4gICAgY29uc3QgayA9IEEuc2VjcmV0S2V5O1xuICAgIEMgPSBFdChcInByaXZhdGUga2V5XCIsIEMsIGspO1xuICAgIGNvbnN0ICQgPSBFdChcImhhc2hlZCBwcml2YXRlIGtleVwiLCBlKEMpLCAyICogayksIFcgPSBsKCQuc2xpY2UoMCwgaykpLCBfID0gJC5zbGljZShrLCAyICogayksIGcgPSB1KFcpO1xuICAgIHJldHVybiB7IGhlYWQ6IFcsIHByZWZpeDogXywgc2NhbGFyOiBnIH07XG4gIH1cbiAgZnVuY3Rpb24gaChDKSB7XG4gICAgY29uc3QgeyBoZWFkOiBrLCBwcmVmaXg6ICQsIHNjYWxhcjogVyB9ID0gZChDKSwgXyA9IG4ubXVsdGlwbHkoVyksIGcgPSBfLnRvQnl0ZXMoKTtcbiAgICByZXR1cm4geyBoZWFkOiBrLCBwcmVmaXg6ICQsIHNjYWxhcjogVywgcG9pbnQ6IF8sIHBvaW50Qnl0ZXM6IGcgfTtcbiAgfVxuICBmdW5jdGlvbiBmKEMpIHtcbiAgICByZXR1cm4gaChDKS5wb2ludEJ5dGVzO1xuICB9XG4gIGZ1bmN0aW9uIHAoQyA9IFVpbnQ4QXJyYXkub2YoKSwgLi4uaykge1xuICAgIGNvbnN0ICQgPSBLciguLi5rKTtcbiAgICByZXR1cm4gdShlKGMoJCwgRXQoXCJjb250ZXh0XCIsIEMpLCAhIXIpKSk7XG4gIH1cbiAgZnVuY3Rpb24geShDLCBrLCAkID0ge30pIHtcbiAgICBDID0gRXQoXCJtZXNzYWdlXCIsIEMpLCByICYmIChDID0gcihDKSk7XG4gICAgY29uc3QgeyBwcmVmaXg6IFcsIHNjYWxhcjogXywgcG9pbnRCeXRlczogZyB9ID0gaChrKSwgeCA9IHAoJC5jb250ZXh0LCBXLCBDKSwgdyA9IG4ubXVsdGlwbHkoeCkudG9CeXRlcygpLCBEID0gcCgkLmNvbnRleHQsIHcsIGcsIEMpLCBPID0gby5jcmVhdGUoeCArIEQgKiBfKTtcbiAgICBpZiAoIW8uaXNWYWxpZChPKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNpZ24gZmFpbGVkOiBpbnZhbGlkIHNcIik7XG4gICAgY29uc3QgVSA9IEtyKHcsIG8udG9CeXRlcyhPKSk7XG4gICAgcmV0dXJuIE9yKFUsIEEuc2lnbmF0dXJlLCBcInJlc3VsdFwiKTtcbiAgfVxuICBjb25zdCBFID0geyB6aXAyMTU6ICEwIH07XG4gIGZ1bmN0aW9uIGIoQywgaywgJCwgVyA9IEUpIHtcbiAgICBjb25zdCB7IGNvbnRleHQ6IF8sIHppcDIxNTogZyB9ID0gVywgeCA9IEEuc2lnbmF0dXJlO1xuICAgIEMgPSBFdChcInNpZ25hdHVyZVwiLCBDLCB4KSwgayA9IEV0KFwibWVzc2FnZVwiLCBrKSwgJCA9IEV0KFwicHVibGljS2V5XCIsICQsIEEucHVibGljS2V5KSwgZyAhPT0gdm9pZCAwICYmIFhzKGcsIFwiemlwMjE1XCIpLCByICYmIChrID0gcihrKSk7XG4gICAgY29uc3QgdyA9IHggLyAyLCBEID0gQy5zdWJhcnJheSgwLCB3KSwgTyA9IGVpKEMuc3ViYXJyYXkodywgeCkpO1xuICAgIGxldCBVLCBWLCBMO1xuICAgIHRyeSB7XG4gICAgICBVID0gcy5mcm9tQnl0ZXMoJCwgZyksIFYgPSBzLmZyb21CeXRlcyhELCBnKSwgTCA9IG4ubXVsdGlwbHlVbnNhZmUoTyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gITE7XG4gICAgfVxuICAgIGlmICghZyAmJiBVLmlzU21hbGxPcmRlcigpKVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IG0gPSBwKF8sIFYudG9CeXRlcygpLCBVLnRvQnl0ZXMoKSwgayk7XG4gICAgcmV0dXJuIFYuYWRkKFUubXVsdGlwbHlVbnNhZmUobSkpLnN1YnRyYWN0KEwpLmNsZWFyQ29mYWN0b3IoKS5pczAoKTtcbiAgfVxuICBjb25zdCBSID0gaS5CWVRFUywgQSA9IHtcbiAgICBzZWNyZXRLZXk6IFIsXG4gICAgcHVibGljS2V5OiBSLFxuICAgIHNpZ25hdHVyZTogMiAqIFIsXG4gICAgc2VlZDogUlxuICB9O1xuICBmdW5jdGlvbiBGKEMgPSBhKEEuc2VlZCkpIHtcbiAgICByZXR1cm4gT3IoQywgQS5zZWVkLCBcInNlZWRcIik7XG4gIH1cbiAgZnVuY3Rpb24gTShDKSB7XG4gICAgY29uc3QgayA9IGoucmFuZG9tU2VjcmV0S2V5KEMpO1xuICAgIHJldHVybiB7IHNlY3JldEtleTogaywgcHVibGljS2V5OiBmKGspIH07XG4gIH1cbiAgZnVuY3Rpb24gSChDKSB7XG4gICAgcmV0dXJuIElpKEMpICYmIEMubGVuZ3RoID09PSBvLkJZVEVTO1xuICB9XG4gIGZ1bmN0aW9uIEsoQywgaykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gISFzLmZyb21CeXRlcyhDLCBrKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gIH1cbiAgY29uc3QgaiA9IHtcbiAgICBnZXRFeHRlbmRlZFB1YmxpY0tleTogaCxcbiAgICByYW5kb21TZWNyZXRLZXk6IEYsXG4gICAgaXNWYWxpZFNlY3JldEtleTogSCxcbiAgICBpc1ZhbGlkUHVibGljS2V5OiBLLFxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIGVkIHB1YmxpYyBrZXkgdG8geCBwdWJsaWMga2V5LiBVc2VzIGZvcm11bGE6XG4gICAgICogLSBlZDI1NTE5OlxuICAgICAqICAgLSBgKHUsIHYpID0gKCgxK3kpLygxLXkpLCBzcXJ0KC00ODY2NjQpKnUveClgXG4gICAgICogICAtIGAoeCwgeSkgPSAoc3FydCgtNDg2NjY0KSp1L3YsICh1LTEpLyh1KzEpKWBcbiAgICAgKiAtIGVkNDQ4OlxuICAgICAqICAgLSBgKHUsIHYpID0gKCh5LTEpLyh5KzEpLCBzcXJ0KDE1NjMyNCkqdS94KWBcbiAgICAgKiAgIC0gYCh4LCB5KSA9IChzcXJ0KDE1NjMyNCkqdS92LCAoMSt1KS8oMS11KSlgXG4gICAgICovXG4gICAgdG9Nb250Z29tZXJ5KEMpIHtcbiAgICAgIGNvbnN0IHsgeTogayB9ID0gcy5mcm9tQnl0ZXMoQyksICQgPSBBLnB1YmxpY0tleSwgVyA9ICQgPT09IDMyO1xuICAgICAgaWYgKCFXICYmICQgIT09IDU3KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJvbmx5IGRlZmluZWQgZm9yIDI1NTE5IGFuZCA0NDhcIik7XG4gICAgICBjb25zdCBfID0gVyA/IGkuZGl2KHp0ICsgaywgenQgLSBrKSA6IGkuZGl2KGsgLSB6dCwgayArIHp0KTtcbiAgICAgIHJldHVybiBpLnRvQnl0ZXMoXyk7XG4gICAgfSxcbiAgICB0b01vbnRnb21lcnlTZWNyZXQoQykge1xuICAgICAgY29uc3QgayA9IEEuc2VjcmV0S2V5O1xuICAgICAgT3IoQywgayk7XG4gICAgICBjb25zdCAkID0gZShDLnN1YmFycmF5KDAsIGspKTtcbiAgICAgIHJldHVybiBsKCQpLnN1YmFycmF5KDAsIGspO1xuICAgIH0sXG4gICAgLyoqIEBkZXByZWNhdGVkICovXG4gICAgcmFuZG9tUHJpdmF0ZUtleTogRixcbiAgICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgICBwcmVjb21wdXRlKEMgPSA4LCBrID0gcy5CQVNFKSB7XG4gICAgICByZXR1cm4gay5wcmVjb21wdXRlKEMsICExKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICBrZXlnZW46IE0sXG4gICAgZ2V0UHVibGljS2V5OiBmLFxuICAgIHNpZ246IHksXG4gICAgdmVyaWZ5OiBiLFxuICAgIHV0aWxzOiBqLFxuICAgIFBvaW50OiBzLFxuICAgIGxlbmd0aHM6IEFcbiAgfSk7XG59XG5mdW5jdGlvbiB4eShzKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAgYTogcy5hLFxuICAgIGQ6IHMuZCxcbiAgICBwOiBzLkZwLk9SREVSLFxuICAgIG46IHMubixcbiAgICBoOiBzLmgsXG4gICAgR3g6IHMuR3gsXG4gICAgR3k6IHMuR3lcbiAgfSwgdCA9IHMuRnAsIHIgPSBlbihlLm4sIHMubkJpdExlbmd0aCwgITApLCBuID0geyBGcDogdCwgRm46IHIsIHV2UmF0aW86IHMudXZSYXRpbyB9LCBpID0ge1xuICAgIHJhbmRvbUJ5dGVzOiBzLnJhbmRvbUJ5dGVzLFxuICAgIGFkanVzdFNjYWxhckJ5dGVzOiBzLmFkanVzdFNjYWxhckJ5dGVzLFxuICAgIGRvbWFpbjogcy5kb21haW4sXG4gICAgcHJlaGFzaDogcy5wcmVoYXNoLFxuICAgIG1hcFRvQ3VydmU6IHMubWFwVG9DdXJ2ZVxuICB9O1xuICByZXR1cm4geyBDVVJWRTogZSwgY3VydmVPcHRzOiBuLCBoYXNoOiBzLmhhc2gsIGVkZHNhT3B0czogaSB9O1xufVxuZnVuY3Rpb24gU3kocywgZSkge1xuICBjb25zdCB0ID0gZS5Qb2ludDtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIGUsIHtcbiAgICBFeHRlbmRlZFBvaW50OiB0LFxuICAgIENVUlZFOiBzLFxuICAgIG5CaXRMZW5ndGg6IHQuRm4uQklUUyxcbiAgICBuQnl0ZUxlbmd0aDogdC5Gbi5CWVRFU1xuICB9KTtcbn1cbmZ1bmN0aW9uIGJ5KHMpIHtcbiAgY29uc3QgeyBDVVJWRTogZSwgY3VydmVPcHRzOiB0LCBoYXNoOiByLCBlZGRzYU9wdHM6IG4gfSA9IHh5KHMpLCBpID0gdnkoZSwgdCksIG8gPSBFeShpLCByLCBuKTtcbiAgcmV0dXJuIFN5KHMsIG8pO1xufVxuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuY29uc3QgVHkgPSBCaWdJbnQoMSksIEVkID0gQmlnSW50KDIpO1xuQmlnSW50KDMpO1xuY29uc3Qgd3kgPSBCaWdJbnQoNSksIEF5ID0gQmlnSW50KDgpLCBaYyA9IEJpZ0ludChcIjB4N2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlZFwiKSwgeTAgPSB7XG4gIHA6IFpjLFxuICBuOiBCaWdJbnQoXCIweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTRkZWY5ZGVhMmY3OWNkNjU4MTI2MzFhNWNmNWQzZWRcIiksXG4gIGg6IEF5LFxuICBhOiBCaWdJbnQoXCIweDdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWNcIiksXG4gIGQ6IEJpZ0ludChcIjB4NTIwMzZjZWUyYjZmZmU3MzhjYzc0MDc5Nzc3OWU4OTgwMDcwMGE0ZDQxNDFkOGFiNzVlYjRkY2ExMzU5NzhhM1wiKSxcbiAgR3g6IEJpZ0ludChcIjB4MjE2OTM2ZDNjZDZlNTNmZWMwYTRlMjMxZmRkNmRjNWM2OTJjYzc2MDk1MjVhN2IyYzk1NjJkNjA4ZjI1ZDUxYVwiKSxcbiAgR3k6IEJpZ0ludChcIjB4NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY1OFwiKVxufTtcbmZ1bmN0aW9uIEl5KHMpIHtcbiAgY29uc3QgZSA9IEJpZ0ludCgxMCksIHQgPSBCaWdJbnQoMjApLCByID0gQmlnSW50KDQwKSwgbiA9IEJpZ0ludCg4MCksIGkgPSBaYywgYSA9IHMgKiBzICUgaSAqIHMgJSBpLCBsID0gdnQoYSwgRWQsIGkpICogYSAlIGksIGMgPSB2dChsLCBUeSwgaSkgKiBzICUgaSwgdSA9IHZ0KGMsIHd5LCBpKSAqIGMgJSBpLCBkID0gdnQodSwgZSwgaSkgKiB1ICUgaSwgaCA9IHZ0KGQsIHQsIGkpICogZCAlIGksIGYgPSB2dChoLCByLCBpKSAqIGggJSBpLCBwID0gdnQoZiwgbiwgaSkgKiBmICUgaSwgeSA9IHZ0KHAsIG4sIGkpICogZiAlIGksIEUgPSB2dCh5LCBlLCBpKSAqIHUgJSBpO1xuICByZXR1cm4geyBwb3dfcF81Xzg6IHZ0KEUsIEVkLCBpKSAqIHMgJSBpLCBiMjogYSB9O1xufVxuZnVuY3Rpb24gX3kocykge1xuICByZXR1cm4gc1swXSAmPSAyNDgsIHNbMzFdICY9IDEyNywgc1szMV0gfD0gNjQsIHM7XG59XG5jb25zdCB4ZCA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoXCIxOTY4MTE2MTM3NjcwNzUwNTk1NjgwNzA3OTMwNDk4ODU0MjAxNTQ0NjA2NjUxNTkyMzg5MDE2Mjc0NDAyMTA3MzEyMzgyOTc4NDc1MlwiKTtcbmZ1bmN0aW9uIFJ5KHMsIGUpIHtcbiAgY29uc3QgdCA9IFpjLCByID0gR3QoZSAqIGUgKiBlLCB0KSwgbiA9IEd0KHIgKiByICogZSwgdCksIGkgPSBJeShzICogbikucG93X3BfNV84O1xuICBsZXQgbyA9IEd0KHMgKiByICogaSwgdCk7XG4gIGNvbnN0IGEgPSBHdChlICogbyAqIG8sIHQpLCBsID0gbywgYyA9IEd0KG8gKiB4ZCwgdCksIHUgPSBhID09PSBzLCBkID0gYSA9PT0gR3QoLXMsIHQpLCBoID0gYSA9PT0gR3QoLXMgKiB4ZCwgdCk7XG4gIHJldHVybiB1ICYmIChvID0gbCksIChkIHx8IGgpICYmIChvID0gYyksIGx5KG8sIHQpICYmIChvID0gR3QoLW8sIHQpKSwgeyBpc1ZhbGlkOiB1IHx8IGQsIHZhbHVlOiBvIH07XG59XG5jb25zdCBMeSA9IGVuKHkwLnAsIHsgaXNMRTogITAgfSksIEN5ID0ge1xuICAuLi55MCxcbiAgRnA6IEx5LFxuICBoYXNoOiBleSxcbiAgYWRqdXN0U2NhbGFyQnl0ZXM6IF95LFxuICAvLyBkb20yXG4gIC8vIFJhdGlvIG9mIHUgdG8gdi4gQWxsb3dzIHVzIHRvIGNvbWJpbmUgaW52ZXJzaW9uIGFuZCBzcXVhcmUgcm9vdC4gVXNlcyBhbGdvIGZyb20gUkZDODAzMiA1LjEuMy5cbiAgLy8gQ29uc3RhbnQtdGltZSwgdS/iiJp2XG4gIHV2UmF0aW86IFJ5XG59LCBMaSA9IGJ5KEN5KTtcbnZhciBjbyA9IHsgZXhwb3J0czoge30gfTtcbmNvbnN0IGt5ID0ge30sIER5ID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5mcmVlemUoLyogQF9fUFVSRV9fICovIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgZGVmYXVsdDoga3lcbn0sIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogXCJNb2R1bGVcIiB9KSksIFB5ID0gLyogQF9fUFVSRV9fICovIE5jKER5KTtcbnZhciBNeSA9IGNvLmV4cG9ydHMsIFNkO1xuZnVuY3Rpb24gdjAoKSB7XG4gIHJldHVybiBTZCB8fCAoU2QgPSAxLCAoZnVuY3Rpb24ocykge1xuICAgIChmdW5jdGlvbihlLCB0KSB7XG4gICAgICBmdW5jdGlvbiByKF8sIGcpIHtcbiAgICAgICAgaWYgKCFfKSB0aHJvdyBuZXcgRXJyb3IoZyB8fCBcIkFzc2VydGlvbiBmYWlsZWRcIik7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBuKF8sIGcpIHtcbiAgICAgICAgXy5zdXBlcl8gPSBnO1xuICAgICAgICB2YXIgeCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB9O1xuICAgICAgICB4LnByb3RvdHlwZSA9IGcucHJvdG90eXBlLCBfLnByb3RvdHlwZSA9IG5ldyB4KCksIF8ucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gXztcbiAgICAgIH1cbiAgICAgIGZ1bmN0aW9uIGkoXywgZywgeCkge1xuICAgICAgICBpZiAoaS5pc0JOKF8pKVxuICAgICAgICAgIHJldHVybiBfO1xuICAgICAgICB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy53b3JkcyA9IG51bGwsIHRoaXMubGVuZ3RoID0gMCwgdGhpcy5yZWQgPSBudWxsLCBfICE9PSBudWxsICYmICgoZyA9PT0gXCJsZVwiIHx8IGcgPT09IFwiYmVcIikgJiYgKHggPSBnLCBnID0gMTApLCB0aGlzLl9pbml0KF8gfHwgMCwgZyB8fCAxMCwgeCB8fCBcImJlXCIpKTtcbiAgICAgIH1cbiAgICAgIHR5cGVvZiBlID09IFwib2JqZWN0XCIgPyBlLmV4cG9ydHMgPSBpIDogdC5CTiA9IGksIGkuQk4gPSBpLCBpLndvcmRTaXplID0gMjY7XG4gICAgICB2YXIgbztcbiAgICAgIHRyeSB7XG4gICAgICAgIHR5cGVvZiB3aW5kb3cgPCBcInVcIiAmJiB0eXBlb2Ygd2luZG93LkJ1ZmZlciA8IFwidVwiID8gbyA9IHdpbmRvdy5CdWZmZXIgOiBvID0gUHkuQnVmZmVyO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICB9XG4gICAgICBpLmlzQk4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiBnIGluc3RhbmNlb2YgaSA/ICEwIDogZyAhPT0gbnVsbCAmJiB0eXBlb2YgZyA9PSBcIm9iamVjdFwiICYmIGcuY29uc3RydWN0b3Iud29yZFNpemUgPT09IGkud29yZFNpemUgJiYgQXJyYXkuaXNBcnJheShnLndvcmRzKTtcbiAgICAgIH0sIGkubWF4ID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByZXR1cm4gZy5jbXAoeCkgPiAwID8gZyA6IHg7XG4gICAgICB9LCBpLm1pbiA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgcmV0dXJuIGcuY21wKHgpIDwgMCA/IGcgOiB4O1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2luaXQgPSBmdW5jdGlvbihnLCB4LCB3KSB7XG4gICAgICAgIGlmICh0eXBlb2YgZyA9PSBcIm51bWJlclwiKVxuICAgICAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKGcsIHgsIHcpO1xuICAgICAgICBpZiAodHlwZW9mIGcgPT0gXCJvYmplY3RcIilcbiAgICAgICAgICByZXR1cm4gdGhpcy5faW5pdEFycmF5KGcsIHgsIHcpO1xuICAgICAgICB4ID09PSBcImhleFwiICYmICh4ID0gMTYpLCByKHggPT09ICh4IHwgMCkgJiYgeCA+PSAyICYmIHggPD0gMzYpLCBnID0gZy50b1N0cmluZygpLnJlcGxhY2UoL1xccysvZywgXCJcIik7XG4gICAgICAgIHZhciBEID0gMDtcbiAgICAgICAgZ1swXSA9PT0gXCItXCIgJiYgKEQrKywgdGhpcy5uZWdhdGl2ZSA9IDEpLCBEIDwgZy5sZW5ndGggJiYgKHggPT09IDE2ID8gdGhpcy5fcGFyc2VIZXgoZywgRCwgdykgOiAodGhpcy5fcGFyc2VCYXNlKGcsIHgsIEQpLCB3ID09PSBcImxlXCIgJiYgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCB4LCB3KSkpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2luaXROdW1iZXIgPSBmdW5jdGlvbihnLCB4LCB3KSB7XG4gICAgICAgIGcgPCAwICYmICh0aGlzLm5lZ2F0aXZlID0gMSwgZyA9IC1nKSwgZyA8IDY3MTA4ODY0ID8gKHRoaXMud29yZHMgPSBbZyAmIDY3MTA4ODYzXSwgdGhpcy5sZW5ndGggPSAxKSA6IGcgPCA0NTAzNTk5NjI3MzcwNDk2ID8gKHRoaXMud29yZHMgPSBbXG4gICAgICAgICAgZyAmIDY3MTA4ODYzLFxuICAgICAgICAgIGcgLyA2NzEwODg2NCAmIDY3MTA4ODYzXG4gICAgICAgIF0sIHRoaXMubGVuZ3RoID0gMikgOiAocihnIDwgOTAwNzE5OTI1NDc0MDk5MiksIHRoaXMud29yZHMgPSBbXG4gICAgICAgICAgZyAmIDY3MTA4ODYzLFxuICAgICAgICAgIGcgLyA2NzEwODg2NCAmIDY3MTA4ODYzLFxuICAgICAgICAgIDFcbiAgICAgICAgXSwgdGhpcy5sZW5ndGggPSAzKSwgdyA9PT0gXCJsZVwiICYmIHRoaXMuX2luaXRBcnJheSh0aGlzLnRvQXJyYXkoKSwgeCwgdyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5faW5pdEFycmF5ID0gZnVuY3Rpb24oZywgeCwgdykge1xuICAgICAgICBpZiAocih0eXBlb2YgZy5sZW5ndGggPT0gXCJudW1iZXJcIiksIGcubGVuZ3RoIDw9IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXMud29yZHMgPSBbMF0sIHRoaXMubGVuZ3RoID0gMSwgdGhpcztcbiAgICAgICAgdGhpcy5sZW5ndGggPSBNYXRoLmNlaWwoZy5sZW5ndGggLyAzKSwgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgICAgIGZvciAodmFyIEQgPSAwOyBEIDwgdGhpcy5sZW5ndGg7IEQrKylcbiAgICAgICAgICB0aGlzLndvcmRzW0RdID0gMDtcbiAgICAgICAgdmFyIE8sIFUsIFYgPSAwO1xuICAgICAgICBpZiAodyA9PT0gXCJiZVwiKVxuICAgICAgICAgIGZvciAoRCA9IGcubGVuZ3RoIC0gMSwgTyA9IDA7IEQgPj0gMDsgRCAtPSAzKVxuICAgICAgICAgICAgVSA9IGdbRF0gfCBnW0QgLSAxXSA8PCA4IHwgZ1tEIC0gMl0gPDwgMTYsIHRoaXMud29yZHNbT10gfD0gVSA8PCBWICYgNjcxMDg4NjMsIHRoaXMud29yZHNbTyArIDFdID0gVSA+Pj4gMjYgLSBWICYgNjcxMDg4NjMsIFYgKz0gMjQsIFYgPj0gMjYgJiYgKFYgLT0gMjYsIE8rKyk7XG4gICAgICAgIGVsc2UgaWYgKHcgPT09IFwibGVcIilcbiAgICAgICAgICBmb3IgKEQgPSAwLCBPID0gMDsgRCA8IGcubGVuZ3RoOyBEICs9IDMpXG4gICAgICAgICAgICBVID0gZ1tEXSB8IGdbRCArIDFdIDw8IDggfCBnW0QgKyAyXSA8PCAxNiwgdGhpcy53b3Jkc1tPXSB8PSBVIDw8IFYgJiA2NzEwODg2MywgdGhpcy53b3Jkc1tPICsgMV0gPSBVID4+PiAyNiAtIFYgJiA2NzEwODg2MywgViArPSAyNCwgViA+PSAyNiAmJiAoViAtPSAyNiwgTysrKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gYShfLCBnKSB7XG4gICAgICAgIHZhciB4ID0gXy5jaGFyQ29kZUF0KGcpO1xuICAgICAgICBpZiAoeCA+PSA0OCAmJiB4IDw9IDU3KVxuICAgICAgICAgIHJldHVybiB4IC0gNDg7XG4gICAgICAgIGlmICh4ID49IDY1ICYmIHggPD0gNzApXG4gICAgICAgICAgcmV0dXJuIHggLSA1NTtcbiAgICAgICAgaWYgKHggPj0gOTcgJiYgeCA8PSAxMDIpXG4gICAgICAgICAgcmV0dXJuIHggLSA4NztcbiAgICAgICAgcighMSwgXCJJbnZhbGlkIGNoYXJhY3RlciBpbiBcIiArIF8pO1xuICAgICAgfVxuICAgICAgZnVuY3Rpb24gbChfLCBnLCB4KSB7XG4gICAgICAgIHZhciB3ID0gYShfLCB4KTtcbiAgICAgICAgcmV0dXJuIHggLSAxID49IGcgJiYgKHcgfD0gYShfLCB4IC0gMSkgPDwgNCksIHc7XG4gICAgICB9XG4gICAgICBpLnByb3RvdHlwZS5fcGFyc2VIZXggPSBmdW5jdGlvbihnLCB4LCB3KSB7XG4gICAgICAgIHRoaXMubGVuZ3RoID0gTWF0aC5jZWlsKChnLmxlbmd0aCAtIHgpIC8gNiksIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgICAgICBmb3IgKHZhciBEID0gMDsgRCA8IHRoaXMubGVuZ3RoOyBEKyspXG4gICAgICAgICAgdGhpcy53b3Jkc1tEXSA9IDA7XG4gICAgICAgIHZhciBPID0gMCwgVSA9IDAsIFY7XG4gICAgICAgIGlmICh3ID09PSBcImJlXCIpXG4gICAgICAgICAgZm9yIChEID0gZy5sZW5ndGggLSAxOyBEID49IHg7IEQgLT0gMilcbiAgICAgICAgICAgIFYgPSBsKGcsIHgsIEQpIDw8IE8sIHRoaXMud29yZHNbVV0gfD0gViAmIDY3MTA4ODYzLCBPID49IDE4ID8gKE8gLT0gMTgsIFUgKz0gMSwgdGhpcy53b3Jkc1tVXSB8PSBWID4+PiAyNikgOiBPICs9IDg7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHZhciBMID0gZy5sZW5ndGggLSB4O1xuICAgICAgICAgIGZvciAoRCA9IEwgJSAyID09PSAwID8geCArIDEgOiB4OyBEIDwgZy5sZW5ndGg7IEQgKz0gMilcbiAgICAgICAgICAgIFYgPSBsKGcsIHgsIEQpIDw8IE8sIHRoaXMud29yZHNbVV0gfD0gViAmIDY3MTA4ODYzLCBPID49IDE4ID8gKE8gLT0gMTgsIFUgKz0gMSwgdGhpcy53b3Jkc1tVXSB8PSBWID4+PiAyNikgOiBPICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fc3RyaXAoKTtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBjKF8sIGcsIHgsIHcpIHtcbiAgICAgICAgZm9yICh2YXIgRCA9IDAsIE8gPSAwLCBVID0gTWF0aC5taW4oXy5sZW5ndGgsIHgpLCBWID0gZzsgViA8IFU7IFYrKykge1xuICAgICAgICAgIHZhciBMID0gXy5jaGFyQ29kZUF0KFYpIC0gNDg7XG4gICAgICAgICAgRCAqPSB3LCBMID49IDQ5ID8gTyA9IEwgLSA0OSArIDEwIDogTCA+PSAxNyA/IE8gPSBMIC0gMTcgKyAxMCA6IE8gPSBMLCByKEwgPj0gMCAmJiBPIDwgdywgXCJJbnZhbGlkIGNoYXJhY3RlclwiKSwgRCArPSBPO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBEO1xuICAgICAgfVxuICAgICAgaS5wcm90b3R5cGUuX3BhcnNlQmFzZSA9IGZ1bmN0aW9uKGcsIHgsIHcpIHtcbiAgICAgICAgdGhpcy53b3JkcyA9IFswXSwgdGhpcy5sZW5ndGggPSAxO1xuICAgICAgICBmb3IgKHZhciBEID0gMCwgTyA9IDE7IE8gPD0gNjcxMDg4NjM7IE8gKj0geClcbiAgICAgICAgICBEKys7XG4gICAgICAgIEQtLSwgTyA9IE8gLyB4IHwgMDtcbiAgICAgICAgZm9yICh2YXIgVSA9IGcubGVuZ3RoIC0gdywgViA9IFUgJSBELCBMID0gTWF0aC5taW4oVSwgVSAtIFYpICsgdywgbSA9IDAsIHYgPSB3OyB2IDwgTDsgdiArPSBEKVxuICAgICAgICAgIG0gPSBjKGcsIHYsIHYgKyBELCB4KSwgdGhpcy5pbXVsbihPKSwgdGhpcy53b3Jkc1swXSArIG0gPCA2NzEwODg2NCA/IHRoaXMud29yZHNbMF0gKz0gbSA6IHRoaXMuX2lhZGRuKG0pO1xuICAgICAgICBpZiAoViAhPT0gMCkge1xuICAgICAgICAgIHZhciBQID0gMTtcbiAgICAgICAgICBmb3IgKG0gPSBjKGcsIHYsIGcubGVuZ3RoLCB4KSwgdiA9IDA7IHYgPCBWOyB2KyspXG4gICAgICAgICAgICBQICo9IHg7XG4gICAgICAgICAgdGhpcy5pbXVsbihQKSwgdGhpcy53b3Jkc1swXSArIG0gPCA2NzEwODg2NCA/IHRoaXMud29yZHNbMF0gKz0gbSA6IHRoaXMuX2lhZGRuKG0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24oZykge1xuICAgICAgICBnLndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoKTtcbiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCB0aGlzLmxlbmd0aDsgeCsrKVxuICAgICAgICAgIGcud29yZHNbeF0gPSB0aGlzLndvcmRzW3hdO1xuICAgICAgICBnLmxlbmd0aCA9IHRoaXMubGVuZ3RoLCBnLm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZSwgZy5yZWQgPSB0aGlzLnJlZDtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiB1KF8sIGcpIHtcbiAgICAgICAgXy53b3JkcyA9IGcud29yZHMsIF8ubGVuZ3RoID0gZy5sZW5ndGgsIF8ubmVnYXRpdmUgPSBnLm5lZ2F0aXZlLCBfLnJlZCA9IGcucmVkO1xuICAgICAgfVxuICAgICAgaWYgKGkucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24oZykge1xuICAgICAgICB1KGcsIHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuY2xvbmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGcgPSBuZXcgaShudWxsKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weShnKSwgZztcbiAgICAgIH0sIGkucHJvdG90eXBlLl9leHBhbmQgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGZvciAoOyB0aGlzLmxlbmd0aCA8IGc7IClcbiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5fc3RyaXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgZm9yICg7IHRoaXMubGVuZ3RoID4gMSAmJiB0aGlzLndvcmRzW3RoaXMubGVuZ3RoIC0gMV0gPT09IDA7IClcbiAgICAgICAgICB0aGlzLmxlbmd0aC0tO1xuICAgICAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9ub3JtU2lnbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCAmJiAodGhpcy5uZWdhdGl2ZSA9IDApLCB0aGlzO1xuICAgICAgfSwgdHlwZW9mIFN5bWJvbCA8IFwidVwiICYmIHR5cGVvZiBTeW1ib2wuZm9yID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpLnByb3RvdHlwZVtTeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIildID0gZDtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgaS5wcm90b3R5cGUuaW5zcGVjdCA9IGQ7XG4gICAgICAgIH1cbiAgICAgIGVsc2VcbiAgICAgICAgaS5wcm90b3R5cGUuaW5zcGVjdCA9IGQ7XG4gICAgICBmdW5jdGlvbiBkKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucmVkID8gXCI8Qk4tUjogXCIgOiBcIjxCTjogXCIpICsgdGhpcy50b1N0cmluZygxNikgKyBcIj5cIjtcbiAgICAgIH1cbiAgICAgIHZhciBoID0gW1xuICAgICAgICBcIlwiLFxuICAgICAgICBcIjBcIixcbiAgICAgICAgXCIwMFwiLFxuICAgICAgICBcIjAwMFwiLFxuICAgICAgICBcIjAwMDBcIixcbiAgICAgICAgXCIwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIixcbiAgICAgICAgXCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMFwiLFxuICAgICAgICBcIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBcIlxuICAgICAgXSwgZiA9IFtcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMjUsXG4gICAgICAgIDE2LFxuICAgICAgICAxMixcbiAgICAgICAgMTEsXG4gICAgICAgIDEwLFxuICAgICAgICA5LFxuICAgICAgICA4LFxuICAgICAgICA4LFxuICAgICAgICA3LFxuICAgICAgICA3LFxuICAgICAgICA3LFxuICAgICAgICA3LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA2LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1LFxuICAgICAgICA1XG4gICAgICBdLCBwID0gW1xuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAzMzU1NDQzMixcbiAgICAgICAgNDMwNDY3MjEsXG4gICAgICAgIDE2Nzc3MjE2LFxuICAgICAgICA0ODgyODEyNSxcbiAgICAgICAgNjA0NjYxNzYsXG4gICAgICAgIDQwMzUzNjA3LFxuICAgICAgICAxNjc3NzIxNixcbiAgICAgICAgNDMwNDY3MjEsXG4gICAgICAgIDFlNyxcbiAgICAgICAgMTk0ODcxNzEsXG4gICAgICAgIDM1ODMxODA4LFxuICAgICAgICA2Mjc0ODUxNyxcbiAgICAgICAgNzUyOTUzNixcbiAgICAgICAgMTEzOTA2MjUsXG4gICAgICAgIDE2Nzc3MjE2LFxuICAgICAgICAyNDEzNzU2OSxcbiAgICAgICAgMzQwMTIyMjQsXG4gICAgICAgIDQ3MDQ1ODgxLFxuICAgICAgICA2NGU2LFxuICAgICAgICA0MDg0MTAxLFxuICAgICAgICA1MTUzNjMyLFxuICAgICAgICA2NDM2MzQzLFxuICAgICAgICA3OTYyNjI0LFxuICAgICAgICA5NzY1NjI1LFxuICAgICAgICAxMTg4MTM3NixcbiAgICAgICAgMTQzNDg5MDcsXG4gICAgICAgIDE3MjEwMzY4LFxuICAgICAgICAyMDUxMTE0OSxcbiAgICAgICAgMjQzZTUsXG4gICAgICAgIDI4NjI5MTUxLFxuICAgICAgICAzMzU1NDQzMixcbiAgICAgICAgMzkxMzUzOTMsXG4gICAgICAgIDQ1NDM1NDI0LFxuICAgICAgICA1MjUyMTg3NSxcbiAgICAgICAgNjA0NjYxNzZcbiAgICAgIF07XG4gICAgICBpLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgZyA9IGcgfHwgMTAsIHggPSB4IHwgMCB8fCAxO1xuICAgICAgICB2YXIgdztcbiAgICAgICAgaWYgKGcgPT09IDE2IHx8IGcgPT09IFwiaGV4XCIpIHtcbiAgICAgICAgICB3ID0gXCJcIjtcbiAgICAgICAgICBmb3IgKHZhciBEID0gMCwgTyA9IDAsIFUgPSAwOyBVIDwgdGhpcy5sZW5ndGg7IFUrKykge1xuICAgICAgICAgICAgdmFyIFYgPSB0aGlzLndvcmRzW1VdLCBMID0gKChWIDw8IEQgfCBPKSAmIDE2Nzc3MjE1KS50b1N0cmluZygxNik7XG4gICAgICAgICAgICBPID0gViA+Pj4gMjQgLSBEICYgMTY3NzcyMTUsIEQgKz0gMiwgRCA+PSAyNiAmJiAoRCAtPSAyNiwgVS0tKSwgTyAhPT0gMCB8fCBVICE9PSB0aGlzLmxlbmd0aCAtIDEgPyB3ID0gaFs2IC0gTC5sZW5ndGhdICsgTCArIHcgOiB3ID0gTCArIHc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoTyAhPT0gMCAmJiAodyA9IE8udG9TdHJpbmcoMTYpICsgdyk7IHcubGVuZ3RoICUgeCAhPT0gMDsgKVxuICAgICAgICAgICAgdyA9IFwiMFwiICsgdztcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAodyA9IFwiLVwiICsgdyksIHc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGcgPT09IChnIHwgMCkgJiYgZyA+PSAyICYmIGcgPD0gMzYpIHtcbiAgICAgICAgICB2YXIgbSA9IGZbZ10sIHYgPSBwW2ddO1xuICAgICAgICAgIHcgPSBcIlwiO1xuICAgICAgICAgIHZhciBQID0gdGhpcy5jbG9uZSgpO1xuICAgICAgICAgIGZvciAoUC5uZWdhdGl2ZSA9IDA7ICFQLmlzWmVybygpOyApIHtcbiAgICAgICAgICAgIHZhciBOID0gUC5tb2Rybih2KS50b1N0cmluZyhnKTtcbiAgICAgICAgICAgIFAgPSBQLmlkaXZuKHYpLCBQLmlzWmVybygpID8gdyA9IE4gKyB3IDogdyA9IGhbbSAtIE4ubGVuZ3RoXSArIE4gKyB3O1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKHRoaXMuaXNaZXJvKCkgJiYgKHcgPSBcIjBcIiArIHcpOyB3Lmxlbmd0aCAlIHggIT09IDA7IClcbiAgICAgICAgICAgIHcgPSBcIjBcIiArIHc7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDAgJiYgKHcgPSBcIi1cIiArIHcpLCB3O1xuICAgICAgICB9XG4gICAgICAgIHIoITEsIFwiQmFzZSBzaG91bGQgYmUgYmV0d2VlbiAyIGFuZCAzNlwiKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnRvTnVtYmVyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnID0gdGhpcy53b3Jkc1swXTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAyID8gZyArPSB0aGlzLndvcmRzWzFdICogNjcxMDg4NjQgOiB0aGlzLmxlbmd0aCA9PT0gMyAmJiB0aGlzLndvcmRzWzJdID09PSAxID8gZyArPSA0NTAzNTk5NjI3MzcwNDk2ICsgdGhpcy53b3Jkc1sxXSAqIDY3MTA4ODY0IDogdGhpcy5sZW5ndGggPiAyICYmIHIoITEsIFwiTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzXCIpLCB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLWcgOiBnO1xuICAgICAgfSwgaS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvU3RyaW5nKDE2LCAyKTtcbiAgICAgIH0sIG8gJiYgKGkucHJvdG90eXBlLnRvQnVmZmVyID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShvLCBnLCB4KTtcbiAgICAgIH0pLCBpLnByb3RvdHlwZS50b0FycmF5ID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50b0FycmF5TGlrZShBcnJheSwgZywgeCk7XG4gICAgICB9O1xuICAgICAgdmFyIHkgPSBmdW5jdGlvbihnLCB4KSB7XG4gICAgICAgIHJldHVybiBnLmFsbG9jVW5zYWZlID8gZy5hbGxvY1Vuc2FmZSh4KSA6IG5ldyBnKHgpO1xuICAgICAgfTtcbiAgICAgIGkucHJvdG90eXBlLnRvQXJyYXlMaWtlID0gZnVuY3Rpb24oZywgeCwgdykge1xuICAgICAgICB0aGlzLl9zdHJpcCgpO1xuICAgICAgICB2YXIgRCA9IHRoaXMuYnl0ZUxlbmd0aCgpLCBPID0gdyB8fCBNYXRoLm1heCgxLCBEKTtcbiAgICAgICAgcihEIDw9IE8sIFwiYnl0ZSBhcnJheSBsb25nZXIgdGhhbiBkZXNpcmVkIGxlbmd0aFwiKSwgcihPID4gMCwgXCJSZXF1ZXN0ZWQgYXJyYXkgbGVuZ3RoIDw9IDBcIik7XG4gICAgICAgIHZhciBVID0geShnLCBPKSwgViA9IHggPT09IFwibGVcIiA/IFwiTEVcIiA6IFwiQkVcIjtcbiAgICAgICAgcmV0dXJuIHRoaXNbXCJfdG9BcnJheUxpa2VcIiArIFZdKFUsIEQpLCBVO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX3RvQXJyYXlMaWtlTEUgPSBmdW5jdGlvbihnLCB4KSB7XG4gICAgICAgIGZvciAodmFyIHcgPSAwLCBEID0gMCwgTyA9IDAsIFUgPSAwOyBPIDwgdGhpcy5sZW5ndGg7IE8rKykge1xuICAgICAgICAgIHZhciBWID0gdGhpcy53b3Jkc1tPXSA8PCBVIHwgRDtcbiAgICAgICAgICBnW3crK10gPSBWICYgMjU1LCB3IDwgZy5sZW5ndGggJiYgKGdbdysrXSA9IFYgPj4gOCAmIDI1NSksIHcgPCBnLmxlbmd0aCAmJiAoZ1t3KytdID0gViA+PiAxNiAmIDI1NSksIFUgPT09IDYgPyAodyA8IGcubGVuZ3RoICYmIChnW3crK10gPSBWID4+IDI0ICYgMjU1KSwgRCA9IDAsIFUgPSAwKSA6IChEID0gViA+Pj4gMjQsIFUgKz0gMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHcgPCBnLmxlbmd0aClcbiAgICAgICAgICBmb3IgKGdbdysrXSA9IEQ7IHcgPCBnLmxlbmd0aDsgKVxuICAgICAgICAgICAgZ1t3KytdID0gMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLl90b0FycmF5TGlrZUJFID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICBmb3IgKHZhciB3ID0gZy5sZW5ndGggLSAxLCBEID0gMCwgTyA9IDAsIFUgPSAwOyBPIDwgdGhpcy5sZW5ndGg7IE8rKykge1xuICAgICAgICAgIHZhciBWID0gdGhpcy53b3Jkc1tPXSA8PCBVIHwgRDtcbiAgICAgICAgICBnW3ctLV0gPSBWICYgMjU1LCB3ID49IDAgJiYgKGdbdy0tXSA9IFYgPj4gOCAmIDI1NSksIHcgPj0gMCAmJiAoZ1t3LS1dID0gViA+PiAxNiAmIDI1NSksIFUgPT09IDYgPyAodyA+PSAwICYmIChnW3ctLV0gPSBWID4+IDI0ICYgMjU1KSwgRCA9IDAsIFUgPSAwKSA6IChEID0gViA+Pj4gMjQsIFUgKz0gMik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHcgPj0gMClcbiAgICAgICAgICBmb3IgKGdbdy0tXSA9IEQ7IHcgPj0gMDsgKVxuICAgICAgICAgICAgZ1t3LS1dID0gMDtcbiAgICAgIH0sIE1hdGguY2x6MzIgPyBpLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gMzIgLSBNYXRoLmNsejMyKGcpO1xuICAgICAgfSA6IGkucHJvdG90eXBlLl9jb3VudEJpdHMgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHZhciB4ID0gZywgdyA9IDA7XG4gICAgICAgIHJldHVybiB4ID49IDQwOTYgJiYgKHcgKz0gMTMsIHggPj4+PSAxMyksIHggPj0gNjQgJiYgKHcgKz0gNywgeCA+Pj49IDcpLCB4ID49IDggJiYgKHcgKz0gNCwgeCA+Pj49IDQpLCB4ID49IDIgJiYgKHcgKz0gMiwgeCA+Pj49IDIpLCB3ICsgeDtcbiAgICAgIH0sIGkucHJvdG90eXBlLl96ZXJvQml0cyA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgaWYgKGcgPT09IDApIHJldHVybiAyNjtcbiAgICAgICAgdmFyIHggPSBnLCB3ID0gMDtcbiAgICAgICAgcmV0dXJuICh4ICYgODE5MSkgPT09IDAgJiYgKHcgKz0gMTMsIHggPj4+PSAxMyksICh4ICYgMTI3KSA9PT0gMCAmJiAodyArPSA3LCB4ID4+Pj0gNyksICh4ICYgMTUpID09PSAwICYmICh3ICs9IDQsIHggPj4+PSA0KSwgKHggJiAzKSA9PT0gMCAmJiAodyArPSAyLCB4ID4+Pj0gMiksICh4ICYgMSkgPT09IDAgJiYgdysrLCB3O1xuICAgICAgfSwgaS5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnID0gdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdLCB4ID0gdGhpcy5fY291bnRCaXRzKGcpO1xuICAgICAgICByZXR1cm4gKHRoaXMubGVuZ3RoIC0gMSkgKiAyNiArIHg7XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gRShfKSB7XG4gICAgICAgIGZvciAodmFyIGcgPSBuZXcgQXJyYXkoXy5iaXRMZW5ndGgoKSksIHggPSAwOyB4IDwgZy5sZW5ndGg7IHgrKykge1xuICAgICAgICAgIHZhciB3ID0geCAvIDI2IHwgMCwgRCA9IHggJSAyNjtcbiAgICAgICAgICBnW3hdID0gXy53b3Jkc1t3XSA+Pj4gRCAmIDE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGc7XG4gICAgICB9XG4gICAgICBpLnByb3RvdHlwZS56ZXJvQml0cyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5pc1plcm8oKSkgcmV0dXJuIDA7XG4gICAgICAgIGZvciAodmFyIGcgPSAwLCB4ID0gMDsgeCA8IHRoaXMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICB2YXIgdyA9IHRoaXMuX3plcm9CaXRzKHRoaXMud29yZHNbeF0pO1xuICAgICAgICAgIGlmIChnICs9IHcsIHcgIT09IDI2KSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZztcbiAgICAgIH0sIGkucHJvdG90eXBlLmJ5dGVMZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmJpdExlbmd0aCgpIC8gOCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS50b1R3b3MgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gdGhpcy5hYnMoKS5pbm90bihnKS5pYWRkbigxKSA6IHRoaXMuY2xvbmUoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmZyb21Ud29zID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy50ZXN0bihnIC0gMSkgPyB0aGlzLm5vdG4oZykuaWFkZG4oMSkuaW5lZygpIDogdGhpcy5jbG9uZSgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXNOZWcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgIT09IDA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pbmVnID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzWmVybygpIHx8ICh0aGlzLm5lZ2F0aXZlIF49IDEpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgZm9yICg7IHRoaXMubGVuZ3RoIDwgZy5sZW5ndGg7IClcbiAgICAgICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdID0gMDtcbiAgICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBnLmxlbmd0aDsgeCsrKVxuICAgICAgICAgIHRoaXMud29yZHNbeF0gPSB0aGlzLndvcmRzW3hdIHwgZy53b3Jkc1t4XTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pb3IgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKCh0aGlzLm5lZ2F0aXZlIHwgZy5uZWdhdGl2ZSkgPT09IDApLCB0aGlzLml1b3IoZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5vciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaW9yKGcpIDogZy5jbG9uZSgpLmlvcih0aGlzKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnVvciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXVvcihnKSA6IGcuY2xvbmUoKS5pdW9yKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXVhbmQgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHZhciB4O1xuICAgICAgICB0aGlzLmxlbmd0aCA+IGcubGVuZ3RoID8geCA9IGcgOiB4ID0gdGhpcztcbiAgICAgICAgZm9yICh2YXIgdyA9IDA7IHcgPCB4Lmxlbmd0aDsgdysrKVxuICAgICAgICAgIHRoaXMud29yZHNbd10gPSB0aGlzLndvcmRzW3ddICYgZy53b3Jkc1t3XTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0geC5sZW5ndGgsIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pYW5kID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gcigodGhpcy5uZWdhdGl2ZSB8IGcubmVnYXRpdmUpID09PSAwKSwgdGhpcy5pdWFuZChnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmFuZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaWFuZChnKSA6IGcuY2xvbmUoKS5pYW5kKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUudWFuZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXVhbmQoZykgOiBnLmNsb25lKCkuaXVhbmQodGhpcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pdXhvciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHgsIHc7XG4gICAgICAgIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyAoeCA9IHRoaXMsIHcgPSBnKSA6ICh4ID0gZywgdyA9IHRoaXMpO1xuICAgICAgICBmb3IgKHZhciBEID0gMDsgRCA8IHcubGVuZ3RoOyBEKyspXG4gICAgICAgICAgdGhpcy53b3Jkc1tEXSA9IHgud29yZHNbRF0gXiB3LndvcmRzW0RdO1xuICAgICAgICBpZiAodGhpcyAhPT0geClcbiAgICAgICAgICBmb3IgKDsgRCA8IHgubGVuZ3RoOyBEKyspXG4gICAgICAgICAgICB0aGlzLndvcmRzW0RdID0geC53b3Jkc1tEXTtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID0geC5sZW5ndGgsIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5peG9yID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gcigodGhpcy5uZWdhdGl2ZSB8IGcubmVnYXRpdmUpID09PSAwKSwgdGhpcy5pdXhvcihnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnhvciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXhvcihnKSA6IGcuY2xvbmUoKS5peG9yKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUudXhvciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID4gZy5sZW5ndGggPyB0aGlzLmNsb25lKCkuaXV4b3IoZykgOiBnLmNsb25lKCkuaXV4b3IodGhpcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pbm90biA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcih0eXBlb2YgZyA9PSBcIm51bWJlclwiICYmIGcgPj0gMCk7XG4gICAgICAgIHZhciB4ID0gTWF0aC5jZWlsKGcgLyAyNikgfCAwLCB3ID0gZyAlIDI2O1xuICAgICAgICB0aGlzLl9leHBhbmQoeCksIHcgPiAwICYmIHgtLTtcbiAgICAgICAgZm9yICh2YXIgRCA9IDA7IEQgPCB4OyBEKyspXG4gICAgICAgICAgdGhpcy53b3Jkc1tEXSA9IH50aGlzLndvcmRzW0RdICYgNjcxMDg4NjM7XG4gICAgICAgIHJldHVybiB3ID4gMCAmJiAodGhpcy53b3Jkc1tEXSA9IH50aGlzLndvcmRzW0RdICYgNjcxMDg4NjMgPj4gMjYgLSB3KSwgdGhpcy5fc3RyaXAoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLm5vdG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW5vdG4oZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zZXRuID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByKHR5cGVvZiBnID09IFwibnVtYmVyXCIgJiYgZyA+PSAwKTtcbiAgICAgICAgdmFyIHcgPSBnIC8gMjYgfCAwLCBEID0gZyAlIDI2O1xuICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kKHcgKyAxKSwgeCA/IHRoaXMud29yZHNbd10gPSB0aGlzLndvcmRzW3ddIHwgMSA8PCBEIDogdGhpcy53b3Jkc1t3XSA9IHRoaXMud29yZHNbd10gJiB+KDEgPDwgRCksIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeDtcbiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgZy5uZWdhdGl2ZSA9PT0gMClcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHggPSB0aGlzLmlzdWIoZyksIHRoaXMubmVnYXRpdmUgXj0gMSwgdGhpcy5fbm9ybVNpZ24oKTtcbiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgZy5uZWdhdGl2ZSAhPT0gMClcbiAgICAgICAgICByZXR1cm4gZy5uZWdhdGl2ZSA9IDAsIHggPSB0aGlzLmlzdWIoZyksIGcubmVnYXRpdmUgPSAxLCB4Ll9ub3JtU2lnbigpO1xuICAgICAgICB2YXIgdywgRDtcbiAgICAgICAgdGhpcy5sZW5ndGggPiBnLmxlbmd0aCA/ICh3ID0gdGhpcywgRCA9IGcpIDogKHcgPSBnLCBEID0gdGhpcyk7XG4gICAgICAgIGZvciAodmFyIE8gPSAwLCBVID0gMDsgVSA8IEQubGVuZ3RoOyBVKyspXG4gICAgICAgICAgeCA9ICh3LndvcmRzW1VdIHwgMCkgKyAoRC53b3Jkc1tVXSB8IDApICsgTywgdGhpcy53b3Jkc1tVXSA9IHggJiA2NzEwODg2MywgTyA9IHggPj4+IDI2O1xuICAgICAgICBmb3IgKDsgTyAhPT0gMCAmJiBVIDwgdy5sZW5ndGg7IFUrKylcbiAgICAgICAgICB4ID0gKHcud29yZHNbVV0gfCAwKSArIE8sIHRoaXMud29yZHNbVV0gPSB4ICYgNjcxMDg4NjMsIE8gPSB4ID4+PiAyNjtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoID0gdy5sZW5ndGgsIE8gIT09IDApXG4gICAgICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF0gPSBPLCB0aGlzLmxlbmd0aCsrO1xuICAgICAgICBlbHNlIGlmICh3ICE9PSB0aGlzKVxuICAgICAgICAgIGZvciAoOyBVIDwgdy5sZW5ndGg7IFUrKylcbiAgICAgICAgICAgIHRoaXMud29yZHNbVV0gPSB3LndvcmRzW1VdO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHg7XG4gICAgICAgIHJldHVybiBnLm5lZ2F0aXZlICE9PSAwICYmIHRoaXMubmVnYXRpdmUgPT09IDAgPyAoZy5uZWdhdGl2ZSA9IDAsIHggPSB0aGlzLnN1YihnKSwgZy5uZWdhdGl2ZSBePSAxLCB4KSA6IGcubmVnYXRpdmUgPT09IDAgJiYgdGhpcy5uZWdhdGl2ZSAhPT0gMCA/ICh0aGlzLm5lZ2F0aXZlID0gMCwgeCA9IGcuc3ViKHRoaXMpLCB0aGlzLm5lZ2F0aXZlID0gMSwgeCkgOiB0aGlzLmxlbmd0aCA+IGcubGVuZ3RoID8gdGhpcy5jbG9uZSgpLmlhZGQoZykgOiBnLmNsb25lKCkuaWFkZCh0aGlzKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmlzdWIgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGlmIChnLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgZy5uZWdhdGl2ZSA9IDA7XG4gICAgICAgICAgdmFyIHggPSB0aGlzLmlhZGQoZyk7XG4gICAgICAgICAgcmV0dXJuIGcubmVnYXRpdmUgPSAxLCB4Ll9ub3JtU2lnbigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApXG4gICAgICAgICAgcmV0dXJuIHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlhZGQoZyksIHRoaXMubmVnYXRpdmUgPSAxLCB0aGlzLl9ub3JtU2lnbigpO1xuICAgICAgICB2YXIgdyA9IHRoaXMuY21wKGcpO1xuICAgICAgICBpZiAodyA9PT0gMClcbiAgICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMubGVuZ3RoID0gMSwgdGhpcy53b3Jkc1swXSA9IDAsIHRoaXM7XG4gICAgICAgIHZhciBELCBPO1xuICAgICAgICB3ID4gMCA/IChEID0gdGhpcywgTyA9IGcpIDogKEQgPSBnLCBPID0gdGhpcyk7XG4gICAgICAgIGZvciAodmFyIFUgPSAwLCBWID0gMDsgViA8IE8ubGVuZ3RoOyBWKyspXG4gICAgICAgICAgeCA9IChELndvcmRzW1ZdIHwgMCkgLSAoTy53b3Jkc1tWXSB8IDApICsgVSwgVSA9IHggPj4gMjYsIHRoaXMud29yZHNbVl0gPSB4ICYgNjcxMDg4NjM7XG4gICAgICAgIGZvciAoOyBVICE9PSAwICYmIFYgPCBELmxlbmd0aDsgVisrKVxuICAgICAgICAgIHggPSAoRC53b3Jkc1tWXSB8IDApICsgVSwgVSA9IHggPj4gMjYsIHRoaXMud29yZHNbVl0gPSB4ICYgNjcxMDg4NjM7XG4gICAgICAgIGlmIChVID09PSAwICYmIFYgPCBELmxlbmd0aCAmJiBEICE9PSB0aGlzKVxuICAgICAgICAgIGZvciAoOyBWIDwgRC5sZW5ndGg7IFYrKylcbiAgICAgICAgICAgIHRoaXMud29yZHNbVl0gPSBELndvcmRzW1ZdO1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgViksIEQgIT09IHRoaXMgJiYgKHRoaXMubmVnYXRpdmUgPSAxKSwgdGhpcy5fc3RyaXAoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKGcpO1xuICAgICAgfTtcbiAgICAgIGZ1bmN0aW9uIGIoXywgZywgeCkge1xuICAgICAgICB4Lm5lZ2F0aXZlID0gZy5uZWdhdGl2ZSBeIF8ubmVnYXRpdmU7XG4gICAgICAgIHZhciB3ID0gXy5sZW5ndGggKyBnLmxlbmd0aCB8IDA7XG4gICAgICAgIHgubGVuZ3RoID0gdywgdyA9IHcgLSAxIHwgMDtcbiAgICAgICAgdmFyIEQgPSBfLndvcmRzWzBdIHwgMCwgTyA9IGcud29yZHNbMF0gfCAwLCBVID0gRCAqIE8sIFYgPSBVICYgNjcxMDg4NjMsIEwgPSBVIC8gNjcxMDg4NjQgfCAwO1xuICAgICAgICB4LndvcmRzWzBdID0gVjtcbiAgICAgICAgZm9yICh2YXIgbSA9IDE7IG0gPCB3OyBtKyspIHtcbiAgICAgICAgICBmb3IgKHZhciB2ID0gTCA+Pj4gMjYsIFAgPSBMICYgNjcxMDg4NjMsIE4gPSBNYXRoLm1pbihtLCBnLmxlbmd0aCAtIDEpLCBZID0gTWF0aC5tYXgoMCwgbSAtIF8ubGVuZ3RoICsgMSk7IFkgPD0gTjsgWSsrKSB7XG4gICAgICAgICAgICB2YXIgZWUgPSBtIC0gWSB8IDA7XG4gICAgICAgICAgICBEID0gXy53b3Jkc1tlZV0gfCAwLCBPID0gZy53b3Jkc1tZXSB8IDAsIFUgPSBEICogTyArIFAsIHYgKz0gVSAvIDY3MTA4ODY0IHwgMCwgUCA9IFUgJiA2NzEwODg2MztcbiAgICAgICAgICB9XG4gICAgICAgICAgeC53b3Jkc1ttXSA9IFAgfCAwLCBMID0gdiB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEwgIT09IDAgPyB4LndvcmRzW21dID0gTCB8IDAgOiB4Lmxlbmd0aC0tLCB4Ll9zdHJpcCgpO1xuICAgICAgfVxuICAgICAgdmFyIFIgPSBmdW5jdGlvbihnLCB4LCB3KSB7XG4gICAgICAgIHZhciBEID0gZy53b3JkcywgTyA9IHgud29yZHMsIFUgPSB3LndvcmRzLCBWID0gMCwgTCwgbSwgdiwgUCA9IERbMF0gfCAwLCBOID0gUCAmIDgxOTEsIFkgPSBQID4+PiAxMywgZWUgPSBEWzFdIHwgMCwgaWUgPSBlZSAmIDgxOTEsIGxlID0gZWUgPj4+IDEzLCBUZSA9IERbMl0gfCAwLCBEZSA9IFRlICYgODE5MSwgemUgPSBUZSA+Pj4gMTMsIF9lID0gRFszXSB8IDAsIHhlID0gX2UgJiA4MTkxLCBCZSA9IF9lID4+PiAxMywgeWUgPSBEWzRdIHwgMCwgYmUgPSB5ZSAmIDgxOTEsIEZlID0geWUgPj4+IDEzLCBYZSA9IERbNV0gfCAwLCB3ZSA9IFhlICYgODE5MSwgTmUgPSBYZSA+Pj4gMTMsIGR0ID0gRFs2XSB8IDAsIEplID0gZHQgJiA4MTkxLCBRZSA9IGR0ID4+PiAxMywgaXQgPSBEWzddIHwgMCwgamUgPSBpdCAmIDgxOTEsIEIgPSBpdCA+Pj4gMTMsIFMgPSBEWzhdIHwgMCwgVCA9IFMgJiA4MTkxLCBHID0gUyA+Pj4gMTMsIFogPSBEWzldIHwgMCwgUSA9IFogJiA4MTkxLCBzZSA9IFogPj4+IDEzLCBVZSA9IE9bMF0gfCAwLCBQZSA9IFVlICYgODE5MSwgTGUgPSBVZSA+Pj4gMTMsIGN0ID0gT1sxXSB8IDAsIEFlID0gY3QgJiA4MTkxLCBUdCA9IGN0ID4+PiAxMywgVXUgPSBPWzJdIHwgMCwgd3QgPSBVdSAmIDgxOTEsIEF0ID0gVXUgPj4+IDEzLCAkdSA9IE9bM10gfCAwLCBJdCA9ICR1ICYgODE5MSwgX3QgPSAkdSA+Pj4gMTMsIEd1ID0gT1s0XSB8IDAsIFJ0ID0gR3UgJiA4MTkxLCBMdCA9IEd1ID4+PiAxMywgVnUgPSBPWzVdIHwgMCwgQ3QgPSBWdSAmIDgxOTEsIGt0ID0gVnUgPj4+IDEzLCBqdSA9IE9bNl0gfCAwLCBEdCA9IGp1ICYgODE5MSwgUHQgPSBqdSA+Pj4gMTMsIEt1ID0gT1s3XSB8IDAsIE10ID0gS3UgJiA4MTkxLCBPdCA9IEt1ID4+PiAxMywgSHUgPSBPWzhdIHwgMCwgQnQgPSBIdSAmIDgxOTEsIEZ0ID0gSHUgPj4+IDEzLCBxdSA9IE9bOV0gfCAwLCBOdCA9IHF1ICYgODE5MSwgVXQgPSBxdSA+Pj4gMTM7XG4gICAgICAgIHcubmVnYXRpdmUgPSBnLm5lZ2F0aXZlIF4geC5uZWdhdGl2ZSwgdy5sZW5ndGggPSAxOSwgTCA9IE1hdGguaW11bChOLCBQZSksIG0gPSBNYXRoLmltdWwoTiwgTGUpLCBtID0gbSArIE1hdGguaW11bChZLCBQZSkgfCAwLCB2ID0gTWF0aC5pbXVsKFksIExlKTtcbiAgICAgICAgdmFyIHhhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAoeGEgPj4+IDI2KSB8IDAsIHhhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKGllLCBQZSksIG0gPSBNYXRoLmltdWwoaWUsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwobGUsIFBlKSB8IDAsIHYgPSBNYXRoLmltdWwobGUsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoTiwgQWUpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoTiwgVHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoWSwgQWUpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoWSwgVHQpIHwgMDtcbiAgICAgICAgdmFyIFNhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAoU2EgPj4+IDI2KSB8IDAsIFNhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKERlLCBQZSksIG0gPSBNYXRoLmltdWwoRGUsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwoemUsIFBlKSB8IDAsIHYgPSBNYXRoLmltdWwoemUsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoaWUsIEFlKSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGllLCBUdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChsZSwgQWUpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwobGUsIFR0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKE4sIHd0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKE4sIEF0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFksIHd0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFksIEF0KSB8IDA7XG4gICAgICAgIHZhciBiYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgViA9ICh2ICsgKG0gPj4+IDEzKSB8IDApICsgKGJhID4+PiAyNikgfCAwLCBiYSAmPSA2NzEwODg2MywgTCA9IE1hdGguaW11bCh4ZSwgUGUpLCBtID0gTWF0aC5pbXVsKHhlLCBMZSksIG0gPSBtICsgTWF0aC5pbXVsKEJlLCBQZSkgfCAwLCB2ID0gTWF0aC5pbXVsKEJlLCBMZSksIEwgPSBMICsgTWF0aC5pbXVsKERlLCBBZSkgfCAwLCBtID0gbSArIE1hdGguaW11bChEZSwgVHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoemUsIEFlKSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKHplLCBUdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChpZSwgd3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoaWUsIEF0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGxlLCB3dCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChsZSwgQXQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoTiwgSXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoTiwgX3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoWSwgSXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoWSwgX3QpIHwgMDtcbiAgICAgICAgdmFyIFRhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAoVGEgPj4+IDI2KSB8IDAsIFRhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKGJlLCBQZSksIG0gPSBNYXRoLmltdWwoYmUsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIFBlKSB8IDAsIHYgPSBNYXRoLmltdWwoRmUsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoeGUsIEFlKSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHhlLCBUdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCZSwgQWUpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoQmUsIFR0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKERlLCB3dCkgfCAwLCBtID0gbSArIE1hdGguaW11bChEZSwgQXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoemUsIHd0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKHplLCBBdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChpZSwgSXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoaWUsIF90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGxlLCBJdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChsZSwgX3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoTiwgUnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoTiwgTHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoWSwgUnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoWSwgTHQpIHwgMDtcbiAgICAgICAgdmFyIHdhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAod2EgPj4+IDI2KSB8IDAsIHdhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKHdlLCBQZSksIG0gPSBNYXRoLmltdWwod2UsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwoTmUsIFBlKSB8IDAsIHYgPSBNYXRoLmltdWwoTmUsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoYmUsIEFlKSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGJlLCBUdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChGZSwgQWUpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRmUsIFR0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKHhlLCB3dCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh4ZSwgQXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoQmUsIHd0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEJlLCBBdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChEZSwgSXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRGUsIF90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHplLCBJdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bCh6ZSwgX3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoaWUsIFJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGllLCBMdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChsZSwgUnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwobGUsIEx0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKE4sIEN0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKE4sIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFksIEN0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFksIGt0KSB8IDA7XG4gICAgICAgIHZhciBBYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgViA9ICh2ICsgKG0gPj4+IDEzKSB8IDApICsgKEFhID4+PiAyNikgfCAwLCBBYSAmPSA2NzEwODg2MywgTCA9IE1hdGguaW11bChKZSwgUGUpLCBtID0gTWF0aC5pbXVsKEplLCBMZSksIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBQZSkgfCAwLCB2ID0gTWF0aC5pbXVsKFFlLCBMZSksIEwgPSBMICsgTWF0aC5pbXVsKHdlLCBBZSkgfCAwLCBtID0gbSArIE1hdGguaW11bCh3ZSwgVHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoTmUsIEFlKSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKE5lLCBUdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChiZSwgd3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoYmUsIEF0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEZlLCB3dCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChGZSwgQXQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoeGUsIEl0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHhlLCBfdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCZSwgSXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoQmUsIF90KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKERlLCBSdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChEZSwgTHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoemUsIFJ0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKHplLCBMdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChpZSwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoaWUsIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGxlLCBDdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChsZSwga3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoTiwgRHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoTiwgUHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoWSwgRHQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoWSwgUHQpIHwgMDtcbiAgICAgICAgdmFyIElhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAoSWEgPj4+IDI2KSB8IDAsIElhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKGplLCBQZSksIG0gPSBNYXRoLmltdWwoamUsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwoQiwgUGUpIHwgMCwgdiA9IE1hdGguaW11bChCLCBMZSksIEwgPSBMICsgTWF0aC5pbXVsKEplLCBBZSkgfCAwLCBtID0gbSArIE1hdGguaW11bChKZSwgVHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoUWUsIEFlKSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFFlLCBUdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh3ZSwgd3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwod2UsIEF0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKE5lLCB3dCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChOZSwgQXQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoYmUsIEl0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGJlLCBfdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChGZSwgSXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRmUsIF90KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKHhlLCBSdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh4ZSwgTHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoQmUsIFJ0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEJlLCBMdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChEZSwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRGUsIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHplLCBDdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bCh6ZSwga3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoaWUsIER0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGllLCBQdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChsZSwgRHQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwobGUsIFB0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKE4sIE10KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKE4sIE90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFksIE10KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFksIE90KSB8IDA7XG4gICAgICAgIHZhciBfYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgViA9ICh2ICsgKG0gPj4+IDEzKSB8IDApICsgKF9hID4+PiAyNikgfCAwLCBfYSAmPSA2NzEwODg2MywgTCA9IE1hdGguaW11bChULCBQZSksIG0gPSBNYXRoLmltdWwoVCwgTGUpLCBtID0gbSArIE1hdGguaW11bChHLCBQZSkgfCAwLCB2ID0gTWF0aC5pbXVsKEcsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoamUsIEFlKSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBUdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBBZSkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBUdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgd3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIEF0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCB3dCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwgQXQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIEl0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBfdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgSXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIF90KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGJlLCBSdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChiZSwgTHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIFJ0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEZlLCBMdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh4ZSwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoeGUsIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEJlLCBDdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCZSwga3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoRGUsIER0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKERlLCBQdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh6ZSwgRHQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoemUsIFB0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGllLCBNdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChpZSwgT3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwobGUsIE10KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKGxlLCBPdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChOLCBCdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOLCBGdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChZLCBCdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChZLCBGdCkgfCAwO1xuICAgICAgICB2YXIgUmEgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChSYSA+Pj4gMjYpIHwgMCwgUmEgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgUGUpLCBtID0gTWF0aC5pbXVsKFEsIExlKSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIFBlKSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIExlKSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgQWUpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgVHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgQWUpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgVHQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIHd0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBBdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCB3dCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBBdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgSXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIF90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBJdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwgX3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIFJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBMdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgUnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIEx0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGJlLCBDdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChiZSwga3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIEN0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEZlLCBrdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh4ZSwgRHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoeGUsIFB0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEJlLCBEdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCZSwgUHQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoRGUsIE10KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKERlLCBPdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh6ZSwgTXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoemUsIE90KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGllLCBCdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChpZSwgRnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwobGUsIEJ0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKGxlLCBGdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChOLCBOdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOLCBVdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChZLCBOdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChZLCBVdCkgfCAwO1xuICAgICAgICB2YXIgTGEgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChMYSA+Pj4gMjYpIHwgMCwgTGEgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgQWUpLCBtID0gTWF0aC5pbXVsKFEsIFR0KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIEFlKSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIFR0KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgd3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgQXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgd3QpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgQXQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIEl0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBfdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBJdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBfdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgUnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIEx0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBSdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwgTHQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIEN0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBrdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgQ3QpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIGt0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGJlLCBEdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChiZSwgUHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIER0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEZlLCBQdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh4ZSwgTXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoeGUsIE90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEJlLCBNdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCZSwgT3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoRGUsIEJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKERlLCBGdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh6ZSwgQnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoemUsIEZ0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGllLCBOdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChpZSwgVXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwobGUsIE50KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKGxlLCBVdCkgfCAwO1xuICAgICAgICB2YXIgQ2EgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChDYSA+Pj4gMjYpIHwgMCwgQ2EgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgd3QpLCBtID0gTWF0aC5pbXVsKFEsIEF0KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIHd0KSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIEF0KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgSXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgX3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgSXQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgX3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIFJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBMdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBSdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBMdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBDdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwga3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIER0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBQdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgRHQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIFB0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGJlLCBNdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChiZSwgT3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIE10KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEZlLCBPdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh4ZSwgQnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoeGUsIEZ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEJlLCBCdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCZSwgRnQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoRGUsIE50KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKERlLCBVdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh6ZSwgTnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoemUsIFV0KSB8IDA7XG4gICAgICAgIHZhciBrYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgViA9ICh2ICsgKG0gPj4+IDEzKSB8IDApICsgKGthID4+PiAyNikgfCAwLCBrYSAmPSA2NzEwODg2MywgTCA9IE1hdGguaW11bChRLCBJdCksIG0gPSBNYXRoLmltdWwoUSwgX3QpLCBtID0gbSArIE1hdGguaW11bChzZSwgSXQpIHwgMCwgdiA9IE1hdGguaW11bChzZSwgX3QpLCBMID0gTCArIE1hdGguaW11bChULCBSdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChULCBMdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChHLCBSdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChHLCBMdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChqZSwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoamUsIGt0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEIsIEN0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEIsIGt0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKEplLCBEdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChKZSwgUHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoUWUsIER0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFFlLCBQdCkgfCAwLCBMID0gTCArIE1hdGguaW11bCh3ZSwgTXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwod2UsIE90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKE5lLCBNdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChOZSwgT3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoYmUsIEJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGJlLCBGdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChGZSwgQnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRmUsIEZ0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKHhlLCBOdCkgfCAwLCBtID0gbSArIE1hdGguaW11bCh4ZSwgVXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoQmUsIE50KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEJlLCBVdCkgfCAwO1xuICAgICAgICB2YXIgRGEgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChEYSA+Pj4gMjYpIHwgMCwgRGEgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgUnQpLCBtID0gTWF0aC5pbXVsKFEsIEx0KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIFJ0KSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIEx0KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgQ3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwga3QpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgQ3QpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywga3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIER0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBQdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBEdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBQdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgTXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIE90KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBNdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwgT3QpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIEJ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBGdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgQnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIEZ0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKGJlLCBOdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChiZSwgVXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRmUsIE50KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEZlLCBVdCkgfCAwO1xuICAgICAgICB2YXIgUGEgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChQYSA+Pj4gMjYpIHwgMCwgUGEgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgQ3QpLCBtID0gTWF0aC5pbXVsKFEsIGt0KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIEN0KSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIGt0KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgRHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgUHQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgRHQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgUHQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIE10KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBPdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBNdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBPdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChKZSwgQnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoSmUsIEZ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKFFlLCBCdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChRZSwgRnQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwod2UsIE50KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKHdlLCBVdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChOZSwgTnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoTmUsIFV0KSB8IDA7XG4gICAgICAgIHZhciBNYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgViA9ICh2ICsgKG0gPj4+IDEzKSB8IDApICsgKE1hID4+PiAyNikgfCAwLCBNYSAmPSA2NzEwODg2MywgTCA9IE1hdGguaW11bChRLCBEdCksIG0gPSBNYXRoLmltdWwoUSwgUHQpLCBtID0gbSArIE1hdGguaW11bChzZSwgRHQpIHwgMCwgdiA9IE1hdGguaW11bChzZSwgUHQpLCBMID0gTCArIE1hdGguaW11bChULCBNdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChULCBPdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChHLCBNdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChHLCBPdCkgfCAwLCBMID0gTCArIE1hdGguaW11bChqZSwgQnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoamUsIEZ0KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKEIsIEJ0KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKEIsIEZ0KSB8IDAsIEwgPSBMICsgTWF0aC5pbXVsKEplLCBOdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChKZSwgVXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoUWUsIE50KSB8IDAsIHYgPSB2ICsgTWF0aC5pbXVsKFFlLCBVdCkgfCAwO1xuICAgICAgICB2YXIgT2EgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChPYSA+Pj4gMjYpIHwgMCwgT2EgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgTXQpLCBtID0gTWF0aC5pbXVsKFEsIE90KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIE10KSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIE90KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgQnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgRnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgQnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgRnQpIHwgMCwgTCA9IEwgKyBNYXRoLmltdWwoamUsIE50KSB8IDAsIG0gPSBtICsgTWF0aC5pbXVsKGplLCBVdCkgfCAwLCBtID0gbSArIE1hdGguaW11bChCLCBOdCkgfCAwLCB2ID0gdiArIE1hdGguaW11bChCLCBVdCkgfCAwO1xuICAgICAgICB2YXIgQmEgPSAoViArIEwgfCAwKSArICgobSAmIDgxOTEpIDw8IDEzKSB8IDA7XG4gICAgICAgIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChCYSA+Pj4gMjYpIHwgMCwgQmEgJj0gNjcxMDg4NjMsIEwgPSBNYXRoLmltdWwoUSwgQnQpLCBtID0gTWF0aC5pbXVsKFEsIEZ0KSwgbSA9IG0gKyBNYXRoLmltdWwoc2UsIEJ0KSB8IDAsIHYgPSBNYXRoLmltdWwoc2UsIEZ0KSwgTCA9IEwgKyBNYXRoLmltdWwoVCwgTnQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoVCwgVXQpIHwgMCwgbSA9IG0gKyBNYXRoLmltdWwoRywgTnQpIHwgMCwgdiA9IHYgKyBNYXRoLmltdWwoRywgVXQpIHwgMDtcbiAgICAgICAgdmFyIEZhID0gKFYgKyBMIHwgMCkgKyAoKG0gJiA4MTkxKSA8PCAxMykgfCAwO1xuICAgICAgICBWID0gKHYgKyAobSA+Pj4gMTMpIHwgMCkgKyAoRmEgPj4+IDI2KSB8IDAsIEZhICY9IDY3MTA4ODYzLCBMID0gTWF0aC5pbXVsKFEsIE50KSwgbSA9IE1hdGguaW11bChRLCBVdCksIG0gPSBtICsgTWF0aC5pbXVsKHNlLCBOdCkgfCAwLCB2ID0gTWF0aC5pbXVsKHNlLCBVdCk7XG4gICAgICAgIHZhciBOYSA9IChWICsgTCB8IDApICsgKChtICYgODE5MSkgPDwgMTMpIHwgMDtcbiAgICAgICAgcmV0dXJuIFYgPSAodiArIChtID4+PiAxMykgfCAwKSArIChOYSA+Pj4gMjYpIHwgMCwgTmEgJj0gNjcxMDg4NjMsIFVbMF0gPSB4YSwgVVsxXSA9IFNhLCBVWzJdID0gYmEsIFVbM10gPSBUYSwgVVs0XSA9IHdhLCBVWzVdID0gQWEsIFVbNl0gPSBJYSwgVVs3XSA9IF9hLCBVWzhdID0gUmEsIFVbOV0gPSBMYSwgVVsxMF0gPSBDYSwgVVsxMV0gPSBrYSwgVVsxMl0gPSBEYSwgVVsxM10gPSBQYSwgVVsxNF0gPSBNYSwgVVsxNV0gPSBPYSwgVVsxNl0gPSBCYSwgVVsxN10gPSBGYSwgVVsxOF0gPSBOYSwgViAhPT0gMCAmJiAoVVsxOV0gPSBWLCB3Lmxlbmd0aCsrKSwgdztcbiAgICAgIH07XG4gICAgICBNYXRoLmltdWwgfHwgKFIgPSBiKTtcbiAgICAgIGZ1bmN0aW9uIEEoXywgZywgeCkge1xuICAgICAgICB4Lm5lZ2F0aXZlID0gZy5uZWdhdGl2ZSBeIF8ubmVnYXRpdmUsIHgubGVuZ3RoID0gXy5sZW5ndGggKyBnLmxlbmd0aDtcbiAgICAgICAgZm9yICh2YXIgdyA9IDAsIEQgPSAwLCBPID0gMDsgTyA8IHgubGVuZ3RoIC0gMTsgTysrKSB7XG4gICAgICAgICAgdmFyIFUgPSBEO1xuICAgICAgICAgIEQgPSAwO1xuICAgICAgICAgIGZvciAodmFyIFYgPSB3ICYgNjcxMDg4NjMsIEwgPSBNYXRoLm1pbihPLCBnLmxlbmd0aCAtIDEpLCBtID0gTWF0aC5tYXgoMCwgTyAtIF8ubGVuZ3RoICsgMSk7IG0gPD0gTDsgbSsrKSB7XG4gICAgICAgICAgICB2YXIgdiA9IE8gLSBtLCBQID0gXy53b3Jkc1t2XSB8IDAsIE4gPSBnLndvcmRzW21dIHwgMCwgWSA9IFAgKiBOLCBlZSA9IFkgJiA2NzEwODg2MztcbiAgICAgICAgICAgIFUgPSBVICsgKFkgLyA2NzEwODg2NCB8IDApIHwgMCwgZWUgPSBlZSArIFYgfCAwLCBWID0gZWUgJiA2NzEwODg2MywgVSA9IFUgKyAoZWUgPj4+IDI2KSB8IDAsIEQgKz0gVSA+Pj4gMjYsIFUgJj0gNjcxMDg4NjM7XG4gICAgICAgICAgfVxuICAgICAgICAgIHgud29yZHNbT10gPSBWLCB3ID0gVSwgVSA9IEQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHcgIT09IDAgPyB4LndvcmRzW09dID0gdyA6IHgubGVuZ3RoLS0sIHguX3N0cmlwKCk7XG4gICAgICB9XG4gICAgICBmdW5jdGlvbiBGKF8sIGcsIHgpIHtcbiAgICAgICAgcmV0dXJuIEEoXywgZywgeCk7XG4gICAgICB9XG4gICAgICBpLnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgdmFyIHcsIEQgPSB0aGlzLmxlbmd0aCArIGcubGVuZ3RoO1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPT09IDEwICYmIGcubGVuZ3RoID09PSAxMCA/IHcgPSBSKHRoaXMsIGcsIHgpIDogRCA8IDYzID8gdyA9IGIodGhpcywgZywgeCkgOiBEIDwgMTAyNCA/IHcgPSBBKHRoaXMsIGcsIHgpIDogdyA9IEYodGhpcywgZywgeCksIHc7XG4gICAgICB9LCBpLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHZhciB4ID0gbmV3IGkobnVsbCk7XG4gICAgICAgIHJldHVybiB4LndvcmRzID0gbmV3IEFycmF5KHRoaXMubGVuZ3RoICsgZy5sZW5ndGgpLCB0aGlzLm11bFRvKGcsIHgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUubXVsZiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSBuZXcgaShudWxsKTtcbiAgICAgICAgcmV0dXJuIHgud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBnLmxlbmd0aCksIEYodGhpcywgZywgeCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pbXVsID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKGcsIHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaW11bG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHZhciB4ID0gZyA8IDA7XG4gICAgICAgIHggJiYgKGcgPSAtZyksIHIodHlwZW9mIGcgPT0gXCJudW1iZXJcIiksIHIoZyA8IDY3MTA4ODY0KTtcbiAgICAgICAgZm9yICh2YXIgdyA9IDAsIEQgPSAwOyBEIDwgdGhpcy5sZW5ndGg7IEQrKykge1xuICAgICAgICAgIHZhciBPID0gKHRoaXMud29yZHNbRF0gfCAwKSAqIGcsIFUgPSAoTyAmIDY3MTA4ODYzKSArICh3ICYgNjcxMDg4NjMpO1xuICAgICAgICAgIHcgPj49IDI2LCB3ICs9IE8gLyA2NzEwODg2NCB8IDAsIHcgKz0gVSA+Pj4gMjYsIHRoaXMud29yZHNbRF0gPSBVICYgNjcxMDg4NjM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHcgIT09IDAgJiYgKHRoaXMud29yZHNbRF0gPSB3LCB0aGlzLmxlbmd0aCsrKSwgdGhpcy5sZW5ndGggPSBnID09PSAwID8gMSA6IHRoaXMubGVuZ3RoLCB4ID8gdGhpcy5pbmVnKCkgOiB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUubXVsbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbihnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tdWwodGhpcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltdWwodGhpcy5jbG9uZSgpKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSBFKGcpO1xuICAgICAgICBpZiAoeC5sZW5ndGggPT09IDApIHJldHVybiBuZXcgaSgxKTtcbiAgICAgICAgZm9yICh2YXIgdyA9IHRoaXMsIEQgPSAwOyBEIDwgeC5sZW5ndGggJiYgeFtEXSA9PT0gMDsgRCsrLCB3ID0gdy5zcXIoKSlcbiAgICAgICAgICA7XG4gICAgICAgIGlmICgrK0QgPCB4Lmxlbmd0aClcbiAgICAgICAgICBmb3IgKHZhciBPID0gdy5zcXIoKTsgRCA8IHgubGVuZ3RoOyBEKyssIE8gPSBPLnNxcigpKVxuICAgICAgICAgICAgeFtEXSAhPT0gMCAmJiAodyA9IHcubXVsKE8pKTtcbiAgICAgICAgcmV0dXJuIHc7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pdXNobG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHIodHlwZW9mIGcgPT0gXCJudW1iZXJcIiAmJiBnID49IDApO1xuICAgICAgICB2YXIgeCA9IGcgJSAyNiwgdyA9IChnIC0geCkgLyAyNiwgRCA9IDY3MTA4ODYzID4+PiAyNiAtIHggPDwgMjYgLSB4LCBPO1xuICAgICAgICBpZiAoeCAhPT0gMCkge1xuICAgICAgICAgIHZhciBVID0gMDtcbiAgICAgICAgICBmb3IgKE8gPSAwOyBPIDwgdGhpcy5sZW5ndGg7IE8rKykge1xuICAgICAgICAgICAgdmFyIFYgPSB0aGlzLndvcmRzW09dICYgRCwgTCA9ICh0aGlzLndvcmRzW09dIHwgMCkgLSBWIDw8IHg7XG4gICAgICAgICAgICB0aGlzLndvcmRzW09dID0gTCB8IFUsIFUgPSBWID4+PiAyNiAtIHg7XG4gICAgICAgICAgfVxuICAgICAgICAgIFUgJiYgKHRoaXMud29yZHNbT10gPSBVLCB0aGlzLmxlbmd0aCsrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodyAhPT0gMCkge1xuICAgICAgICAgIGZvciAoTyA9IHRoaXMubGVuZ3RoIC0gMTsgTyA+PSAwOyBPLS0pXG4gICAgICAgICAgICB0aGlzLndvcmRzW08gKyB3XSA9IHRoaXMud29yZHNbT107XG4gICAgICAgICAgZm9yIChPID0gMDsgTyA8IHc7IE8rKylcbiAgICAgICAgICAgIHRoaXMud29yZHNbT10gPSAwO1xuICAgICAgICAgIHRoaXMubGVuZ3RoICs9IHc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc2hsbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHIodGhpcy5uZWdhdGl2ZSA9PT0gMCksIHRoaXMuaXVzaGxuKGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXVzaHJuID0gZnVuY3Rpb24oZywgeCwgdykge1xuICAgICAgICByKHR5cGVvZiBnID09IFwibnVtYmVyXCIgJiYgZyA+PSAwKTtcbiAgICAgICAgdmFyIEQ7XG4gICAgICAgIHggPyBEID0gKHggLSB4ICUgMjYpIC8gMjYgOiBEID0gMDtcbiAgICAgICAgdmFyIE8gPSBnICUgMjYsIFUgPSBNYXRoLm1pbigoZyAtIE8pIC8gMjYsIHRoaXMubGVuZ3RoKSwgViA9IDY3MTA4ODYzIF4gNjcxMDg4NjMgPj4+IE8gPDwgTywgTCA9IHc7XG4gICAgICAgIGlmIChEIC09IFUsIEQgPSBNYXRoLm1heCgwLCBEKSwgTCkge1xuICAgICAgICAgIGZvciAodmFyIG0gPSAwOyBtIDwgVTsgbSsrKVxuICAgICAgICAgICAgTC53b3Jkc1ttXSA9IHRoaXMud29yZHNbbV07XG4gICAgICAgICAgTC5sZW5ndGggPSBVO1xuICAgICAgICB9XG4gICAgICAgIGlmIChVICE9PSAwKSBpZiAodGhpcy5sZW5ndGggPiBVKVxuICAgICAgICAgIGZvciAodGhpcy5sZW5ndGggLT0gVSwgbSA9IDA7IG0gPCB0aGlzLmxlbmd0aDsgbSsrKVxuICAgICAgICAgICAgdGhpcy53b3Jkc1ttXSA9IHRoaXMud29yZHNbbSArIFVdO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhpcy53b3Jkc1swXSA9IDAsIHRoaXMubGVuZ3RoID0gMTtcbiAgICAgICAgdmFyIHYgPSAwO1xuICAgICAgICBmb3IgKG0gPSB0aGlzLmxlbmd0aCAtIDE7IG0gPj0gMCAmJiAodiAhPT0gMCB8fCBtID49IEQpOyBtLS0pIHtcbiAgICAgICAgICB2YXIgUCA9IHRoaXMud29yZHNbbV0gfCAwO1xuICAgICAgICAgIHRoaXMud29yZHNbbV0gPSB2IDw8IDI2IC0gTyB8IFAgPj4+IE8sIHYgPSBQICYgVjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTCAmJiB2ICE9PSAwICYmIChMLndvcmRzW0wubGVuZ3RoKytdID0gdiksIHRoaXMubGVuZ3RoID09PSAwICYmICh0aGlzLndvcmRzWzBdID0gMCwgdGhpcy5sZW5ndGggPSAxKSwgdGhpcy5fc3RyaXAoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmlzaHJuID0gZnVuY3Rpb24oZywgeCwgdykge1xuICAgICAgICByZXR1cm4gcih0aGlzLm5lZ2F0aXZlID09PSAwKSwgdGhpcy5pdXNocm4oZywgeCwgdyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zaGxuID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUudXNobG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaGxuKGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuc2hybiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybihnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnVzaHJuID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLml1c2hybihnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnRlc3RuID0gZnVuY3Rpb24oZykge1xuICAgICAgICByKHR5cGVvZiBnID09IFwibnVtYmVyXCIgJiYgZyA+PSAwKTtcbiAgICAgICAgdmFyIHggPSBnICUgMjYsIHcgPSAoZyAtIHgpIC8gMjYsIEQgPSAxIDw8IHg7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA8PSB3KSByZXR1cm4gITE7XG4gICAgICAgIHZhciBPID0gdGhpcy53b3Jkc1t3XTtcbiAgICAgICAgcmV0dXJuICEhKE8gJiBEKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmltYXNrbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcih0eXBlb2YgZyA9PSBcIm51bWJlclwiICYmIGcgPj0gMCk7XG4gICAgICAgIHZhciB4ID0gZyAlIDI2LCB3ID0gKGcgLSB4KSAvIDI2O1xuICAgICAgICBpZiAocih0aGlzLm5lZ2F0aXZlID09PSAwLCBcImltYXNrbiB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmUgbnVtYmVyc1wiKSwgdGhpcy5sZW5ndGggPD0gdylcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaWYgKHggIT09IDAgJiYgdysrLCB0aGlzLmxlbmd0aCA9IE1hdGgubWluKHcsIHRoaXMubGVuZ3RoKSwgeCAhPT0gMCkge1xuICAgICAgICAgIHZhciBEID0gNjcxMDg4NjMgXiA2NzEwODg2MyA+Pj4geCA8PCB4O1xuICAgICAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSAmPSBEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9zdHJpcCgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUubWFza24gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaWFkZG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKHR5cGVvZiBnID09IFwibnVtYmVyXCIpLCByKGcgPCA2NzEwODg2NCksIGcgPCAwID8gdGhpcy5pc3VibigtZykgOiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gdGhpcy5sZW5ndGggPT09IDEgJiYgKHRoaXMud29yZHNbMF0gfCAwKSA8PSBnID8gKHRoaXMud29yZHNbMF0gPSBnIC0gKHRoaXMud29yZHNbMF0gfCAwKSwgdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXMpIDogKHRoaXMubmVnYXRpdmUgPSAwLCB0aGlzLmlzdWJuKGcpLCB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpcykgOiB0aGlzLl9pYWRkbihnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9pYWRkbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSBnO1xuICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbeF0gPj0gNjcxMDg4NjQ7IHgrKylcbiAgICAgICAgICB0aGlzLndvcmRzW3hdIC09IDY3MTA4ODY0LCB4ID09PSB0aGlzLmxlbmd0aCAtIDEgPyB0aGlzLndvcmRzW3ggKyAxXSA9IDEgOiB0aGlzLndvcmRzW3ggKyAxXSsrO1xuICAgICAgICByZXR1cm4gdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgeCArIDEpLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaXN1Ym4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGlmIChyKHR5cGVvZiBnID09IFwibnVtYmVyXCIpLCByKGcgPCA2NzEwODg2NCksIGcgPCAwKSByZXR1cm4gdGhpcy5pYWRkbigtZyk7XG4gICAgICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwKVxuICAgICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMCwgdGhpcy5pYWRkbihnKSwgdGhpcy5uZWdhdGl2ZSA9IDEsIHRoaXM7XG4gICAgICAgIGlmICh0aGlzLndvcmRzWzBdIC09IGcsIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPCAwKVxuICAgICAgICAgIHRoaXMud29yZHNbMF0gPSAtdGhpcy53b3Jkc1swXSwgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHRoaXMubGVuZ3RoICYmIHRoaXMud29yZHNbeF0gPCAwOyB4KyspXG4gICAgICAgICAgICB0aGlzLndvcmRzW3hdICs9IDY3MTA4ODY0LCB0aGlzLndvcmRzW3ggKyAxXSAtPSAxO1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmFkZG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZG4oZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5zdWJuID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWJuKGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaWFicyA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSA9IDAsIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5hYnMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5faXNobG5zdWJtdWwgPSBmdW5jdGlvbihnLCB4LCB3KSB7XG4gICAgICAgIHZhciBEID0gZy5sZW5ndGggKyB3LCBPO1xuICAgICAgICB0aGlzLl9leHBhbmQoRCk7XG4gICAgICAgIHZhciBVLCBWID0gMDtcbiAgICAgICAgZm9yIChPID0gMDsgTyA8IGcubGVuZ3RoOyBPKyspIHtcbiAgICAgICAgICBVID0gKHRoaXMud29yZHNbTyArIHddIHwgMCkgKyBWO1xuICAgICAgICAgIHZhciBMID0gKGcud29yZHNbT10gfCAwKSAqIHg7XG4gICAgICAgICAgVSAtPSBMICYgNjcxMDg4NjMsIFYgPSAoVSA+PiAyNikgLSAoTCAvIDY3MTA4ODY0IHwgMCksIHRoaXMud29yZHNbTyArIHddID0gVSAmIDY3MTA4ODYzO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoOyBPIDwgdGhpcy5sZW5ndGggLSB3OyBPKyspXG4gICAgICAgICAgVSA9ICh0aGlzLndvcmRzW08gKyB3XSB8IDApICsgViwgViA9IFUgPj4gMjYsIHRoaXMud29yZHNbTyArIHddID0gVSAmIDY3MTA4ODYzO1xuICAgICAgICBpZiAoViA9PT0gMCkgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gICAgICAgIGZvciAocihWID09PSAtMSksIFYgPSAwLCBPID0gMDsgTyA8IHRoaXMubGVuZ3RoOyBPKyspXG4gICAgICAgICAgVSA9IC0odGhpcy53b3Jkc1tPXSB8IDApICsgViwgViA9IFUgPj4gMjYsIHRoaXMud29yZHNbT10gPSBVICYgNjcxMDg4NjM7XG4gICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlID0gMSwgdGhpcy5fc3RyaXAoKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl93b3JkRGl2ID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICB2YXIgdyA9IHRoaXMubGVuZ3RoIC0gZy5sZW5ndGgsIEQgPSB0aGlzLmNsb25lKCksIE8gPSBnLCBVID0gTy53b3Jkc1tPLmxlbmd0aCAtIDFdIHwgMCwgViA9IHRoaXMuX2NvdW50Qml0cyhVKTtcbiAgICAgICAgdyA9IDI2IC0gViwgdyAhPT0gMCAmJiAoTyA9IE8udXNobG4odyksIEQuaXVzaGxuKHcpLCBVID0gTy53b3Jkc1tPLmxlbmd0aCAtIDFdIHwgMCk7XG4gICAgICAgIHZhciBMID0gRC5sZW5ndGggLSBPLmxlbmd0aCwgbTtcbiAgICAgICAgaWYgKHggIT09IFwibW9kXCIpIHtcbiAgICAgICAgICBtID0gbmV3IGkobnVsbCksIG0ubGVuZ3RoID0gTCArIDEsIG0ud29yZHMgPSBuZXcgQXJyYXkobS5sZW5ndGgpO1xuICAgICAgICAgIGZvciAodmFyIHYgPSAwOyB2IDwgbS5sZW5ndGg7IHYrKylcbiAgICAgICAgICAgIG0ud29yZHNbdl0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHZhciBQID0gRC5jbG9uZSgpLl9pc2hsbnN1Ym11bChPLCAxLCBMKTtcbiAgICAgICAgUC5uZWdhdGl2ZSA9PT0gMCAmJiAoRCA9IFAsIG0gJiYgKG0ud29yZHNbTF0gPSAxKSk7XG4gICAgICAgIGZvciAodmFyIE4gPSBMIC0gMTsgTiA+PSAwOyBOLS0pIHtcbiAgICAgICAgICB2YXIgWSA9IChELndvcmRzW08ubGVuZ3RoICsgTl0gfCAwKSAqIDY3MTA4ODY0ICsgKEQud29yZHNbTy5sZW5ndGggKyBOIC0gMV0gfCAwKTtcbiAgICAgICAgICBmb3IgKFkgPSBNYXRoLm1pbihZIC8gVSB8IDAsIDY3MTA4ODYzKSwgRC5faXNobG5zdWJtdWwoTywgWSwgTik7IEQubmVnYXRpdmUgIT09IDA7IClcbiAgICAgICAgICAgIFktLSwgRC5uZWdhdGl2ZSA9IDAsIEQuX2lzaGxuc3VibXVsKE8sIDEsIE4pLCBELmlzWmVybygpIHx8IChELm5lZ2F0aXZlIF49IDEpO1xuICAgICAgICAgIG0gJiYgKG0ud29yZHNbTl0gPSBZKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbSAmJiBtLl9zdHJpcCgpLCBELl9zdHJpcCgpLCB4ICE9PSBcImRpdlwiICYmIHcgIT09IDAgJiYgRC5pdXNocm4odyksIHtcbiAgICAgICAgICBkaXY6IG0gfHwgbnVsbCxcbiAgICAgICAgICBtb2Q6IERcbiAgICAgICAgfTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmRpdm1vZCA9IGZ1bmN0aW9uKGcsIHgsIHcpIHtcbiAgICAgICAgaWYgKHIoIWcuaXNaZXJvKCkpLCB0aGlzLmlzWmVybygpKVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXY6IG5ldyBpKDApLFxuICAgICAgICAgICAgbW9kOiBuZXcgaSgwKVxuICAgICAgICAgIH07XG4gICAgICAgIHZhciBELCBPLCBVO1xuICAgICAgICByZXR1cm4gdGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiBnLm5lZ2F0aXZlID09PSAwID8gKFUgPSB0aGlzLm5lZygpLmRpdm1vZChnLCB4KSwgeCAhPT0gXCJtb2RcIiAmJiAoRCA9IFUuZGl2Lm5lZygpKSwgeCAhPT0gXCJkaXZcIiAmJiAoTyA9IFUubW9kLm5lZygpLCB3ICYmIE8ubmVnYXRpdmUgIT09IDAgJiYgTy5pYWRkKGcpKSwge1xuICAgICAgICAgIGRpdjogRCxcbiAgICAgICAgICBtb2Q6IE9cbiAgICAgICAgfSkgOiB0aGlzLm5lZ2F0aXZlID09PSAwICYmIGcubmVnYXRpdmUgIT09IDAgPyAoVSA9IHRoaXMuZGl2bW9kKGcubmVnKCksIHgpLCB4ICE9PSBcIm1vZFwiICYmIChEID0gVS5kaXYubmVnKCkpLCB7XG4gICAgICAgICAgZGl2OiBELFxuICAgICAgICAgIG1vZDogVS5tb2RcbiAgICAgICAgfSkgOiAodGhpcy5uZWdhdGl2ZSAmIGcubmVnYXRpdmUpICE9PSAwID8gKFUgPSB0aGlzLm5lZygpLmRpdm1vZChnLm5lZygpLCB4KSwgeCAhPT0gXCJkaXZcIiAmJiAoTyA9IFUubW9kLm5lZygpLCB3ICYmIE8ubmVnYXRpdmUgIT09IDAgJiYgTy5pc3ViKGcpKSwge1xuICAgICAgICAgIGRpdjogVS5kaXYsXG4gICAgICAgICAgbW9kOiBPXG4gICAgICAgIH0pIDogZy5sZW5ndGggPiB0aGlzLmxlbmd0aCB8fCB0aGlzLmNtcChnKSA8IDAgPyB7XG4gICAgICAgICAgZGl2OiBuZXcgaSgwKSxcbiAgICAgICAgICBtb2Q6IHRoaXNcbiAgICAgICAgfSA6IGcubGVuZ3RoID09PSAxID8geCA9PT0gXCJkaXZcIiA/IHtcbiAgICAgICAgICBkaXY6IHRoaXMuZGl2bihnLndvcmRzWzBdKSxcbiAgICAgICAgICBtb2Q6IG51bGxcbiAgICAgICAgfSA6IHggPT09IFwibW9kXCIgPyB7XG4gICAgICAgICAgZGl2OiBudWxsLFxuICAgICAgICAgIG1vZDogbmV3IGkodGhpcy5tb2RybihnLndvcmRzWzBdKSlcbiAgICAgICAgfSA6IHtcbiAgICAgICAgICBkaXY6IHRoaXMuZGl2bihnLndvcmRzWzBdKSxcbiAgICAgICAgICBtb2Q6IG5ldyBpKHRoaXMubW9kcm4oZy53b3Jkc1swXSkpXG4gICAgICAgIH0gOiB0aGlzLl93b3JkRGl2KGcsIHgpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QoZywgXCJkaXZcIiwgITEpLmRpdjtcbiAgICAgIH0sIGkucHJvdG90eXBlLm1vZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGl2bW9kKGcsIFwibW9kXCIsICExKS5tb2Q7XG4gICAgICB9LCBpLnByb3RvdHlwZS51bW9kID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXZtb2QoZywgXCJtb2RcIiwgITApLm1vZDtcbiAgICAgIH0sIGkucHJvdG90eXBlLmRpdlJvdW5kID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IHRoaXMuZGl2bW9kKGcpO1xuICAgICAgICBpZiAoeC5tb2QuaXNaZXJvKCkpIHJldHVybiB4LmRpdjtcbiAgICAgICAgdmFyIHcgPSB4LmRpdi5uZWdhdGl2ZSAhPT0gMCA/IHgubW9kLmlzdWIoZykgOiB4Lm1vZCwgRCA9IGcudXNocm4oMSksIE8gPSBnLmFuZGxuKDEpLCBVID0gdy5jbXAoRCk7XG4gICAgICAgIHJldHVybiBVIDwgMCB8fCBPID09PSAxICYmIFUgPT09IDAgPyB4LmRpdiA6IHguZGl2Lm5lZ2F0aXZlICE9PSAwID8geC5kaXYuaXN1Ym4oMSkgOiB4LmRpdi5pYWRkbigxKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLm1vZHJuID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IGcgPCAwO1xuICAgICAgICB4ICYmIChnID0gLWcpLCByKGcgPD0gNjcxMDg4NjMpO1xuICAgICAgICBmb3IgKHZhciB3ID0gKDEgPDwgMjYpICUgZywgRCA9IDAsIE8gPSB0aGlzLmxlbmd0aCAtIDE7IE8gPj0gMDsgTy0tKVxuICAgICAgICAgIEQgPSAodyAqIEQgKyAodGhpcy53b3Jkc1tPXSB8IDApKSAlIGc7XG4gICAgICAgIHJldHVybiB4ID8gLUQgOiBEO1xuICAgICAgfSwgaS5wcm90b3R5cGUubW9kbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kcm4oZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSBnIDwgMDtcbiAgICAgICAgeCAmJiAoZyA9IC1nKSwgcihnIDw9IDY3MTA4ODYzKTtcbiAgICAgICAgZm9yICh2YXIgdyA9IDAsIEQgPSB0aGlzLmxlbmd0aCAtIDE7IEQgPj0gMDsgRC0tKSB7XG4gICAgICAgICAgdmFyIE8gPSAodGhpcy53b3Jkc1tEXSB8IDApICsgdyAqIDY3MTA4ODY0O1xuICAgICAgICAgIHRoaXMud29yZHNbRF0gPSBPIC8gZyB8IDAsIHcgPSBPICUgZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fc3RyaXAoKSwgeCA/IHRoaXMuaW5lZygpIDogdGhpcztcbiAgICAgIH0sIGkucHJvdG90eXBlLmRpdm4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWRpdm4oZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5lZ2NkID0gZnVuY3Rpb24oZykge1xuICAgICAgICByKGcubmVnYXRpdmUgPT09IDApLCByKCFnLmlzWmVybygpKTtcbiAgICAgICAgdmFyIHggPSB0aGlzLCB3ID0gZy5jbG9uZSgpO1xuICAgICAgICB4Lm5lZ2F0aXZlICE9PSAwID8geCA9IHgudW1vZChnKSA6IHggPSB4LmNsb25lKCk7XG4gICAgICAgIGZvciAodmFyIEQgPSBuZXcgaSgxKSwgTyA9IG5ldyBpKDApLCBVID0gbmV3IGkoMCksIFYgPSBuZXcgaSgxKSwgTCA9IDA7IHguaXNFdmVuKCkgJiYgdy5pc0V2ZW4oKTsgKVxuICAgICAgICAgIHguaXVzaHJuKDEpLCB3Lml1c2hybigxKSwgKytMO1xuICAgICAgICBmb3IgKHZhciBtID0gdy5jbG9uZSgpLCB2ID0geC5jbG9uZSgpOyAheC5pc1plcm8oKTsgKSB7XG4gICAgICAgICAgZm9yICh2YXIgUCA9IDAsIE4gPSAxOyAoeC53b3Jkc1swXSAmIE4pID09PSAwICYmIFAgPCAyNjsgKytQLCBOIDw8PSAxKSA7XG4gICAgICAgICAgaWYgKFAgPiAwKVxuICAgICAgICAgICAgZm9yICh4Lml1c2hybihQKTsgUC0tID4gMDsgKVxuICAgICAgICAgICAgICAoRC5pc09kZCgpIHx8IE8uaXNPZGQoKSkgJiYgKEQuaWFkZChtKSwgTy5pc3ViKHYpKSwgRC5pdXNocm4oMSksIE8uaXVzaHJuKDEpO1xuICAgICAgICAgIGZvciAodmFyIFkgPSAwLCBlZSA9IDE7ICh3LndvcmRzWzBdICYgZWUpID09PSAwICYmIFkgPCAyNjsgKytZLCBlZSA8PD0gMSkgO1xuICAgICAgICAgIGlmIChZID4gMClcbiAgICAgICAgICAgIGZvciAody5pdXNocm4oWSk7IFktLSA+IDA7IClcbiAgICAgICAgICAgICAgKFUuaXNPZGQoKSB8fCBWLmlzT2RkKCkpICYmIChVLmlhZGQobSksIFYuaXN1Yih2KSksIFUuaXVzaHJuKDEpLCBWLml1c2hybigxKTtcbiAgICAgICAgICB4LmNtcCh3KSA+PSAwID8gKHguaXN1Yih3KSwgRC5pc3ViKFUpLCBPLmlzdWIoVikpIDogKHcuaXN1Yih4KSwgVS5pc3ViKEQpLCBWLmlzdWIoTykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYTogVSxcbiAgICAgICAgICBiOiBWLFxuICAgICAgICAgIGdjZDogdy5pdXNobG4oTClcbiAgICAgICAgfTtcbiAgICAgIH0sIGkucHJvdG90eXBlLl9pbnZtcCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcihnLm5lZ2F0aXZlID09PSAwKSwgcighZy5pc1plcm8oKSk7XG4gICAgICAgIHZhciB4ID0gdGhpcywgdyA9IGcuY2xvbmUoKTtcbiAgICAgICAgeC5uZWdhdGl2ZSAhPT0gMCA/IHggPSB4LnVtb2QoZykgOiB4ID0geC5jbG9uZSgpO1xuICAgICAgICBmb3IgKHZhciBEID0gbmV3IGkoMSksIE8gPSBuZXcgaSgwKSwgVSA9IHcuY2xvbmUoKTsgeC5jbXBuKDEpID4gMCAmJiB3LmNtcG4oMSkgPiAwOyApIHtcbiAgICAgICAgICBmb3IgKHZhciBWID0gMCwgTCA9IDE7ICh4LndvcmRzWzBdICYgTCkgPT09IDAgJiYgViA8IDI2OyArK1YsIEwgPDw9IDEpIDtcbiAgICAgICAgICBpZiAoViA+IDApXG4gICAgICAgICAgICBmb3IgKHguaXVzaHJuKFYpOyBWLS0gPiAwOyApXG4gICAgICAgICAgICAgIEQuaXNPZGQoKSAmJiBELmlhZGQoVSksIEQuaXVzaHJuKDEpO1xuICAgICAgICAgIGZvciAodmFyIG0gPSAwLCB2ID0gMTsgKHcud29yZHNbMF0gJiB2KSA9PT0gMCAmJiBtIDwgMjY7ICsrbSwgdiA8PD0gMSkgO1xuICAgICAgICAgIGlmIChtID4gMClcbiAgICAgICAgICAgIGZvciAody5pdXNocm4obSk7IG0tLSA+IDA7IClcbiAgICAgICAgICAgICAgTy5pc09kZCgpICYmIE8uaWFkZChVKSwgTy5pdXNocm4oMSk7XG4gICAgICAgICAgeC5jbXAodykgPj0gMCA/ICh4LmlzdWIodyksIEQuaXN1YihPKSkgOiAody5pc3ViKHgpLCBPLmlzdWIoRCkpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBQO1xuICAgICAgICByZXR1cm4geC5jbXBuKDEpID09PSAwID8gUCA9IEQgOiBQID0gTywgUC5jbXBuKDApIDwgMCAmJiBQLmlhZGQoZyksIFA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gZy5hYnMoKTtcbiAgICAgICAgaWYgKGcuaXNaZXJvKCkpIHJldHVybiB0aGlzLmFicygpO1xuICAgICAgICB2YXIgeCA9IHRoaXMuY2xvbmUoKSwgdyA9IGcuY2xvbmUoKTtcbiAgICAgICAgeC5uZWdhdGl2ZSA9IDAsIHcubmVnYXRpdmUgPSAwO1xuICAgICAgICBmb3IgKHZhciBEID0gMDsgeC5pc0V2ZW4oKSAmJiB3LmlzRXZlbigpOyBEKyspXG4gICAgICAgICAgeC5pdXNocm4oMSksIHcuaXVzaHJuKDEpO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgZm9yICg7IHguaXNFdmVuKCk7IClcbiAgICAgICAgICAgIHguaXVzaHJuKDEpO1xuICAgICAgICAgIGZvciAoOyB3LmlzRXZlbigpOyApXG4gICAgICAgICAgICB3Lml1c2hybigxKTtcbiAgICAgICAgICB2YXIgTyA9IHguY21wKHcpO1xuICAgICAgICAgIGlmIChPIDwgMCkge1xuICAgICAgICAgICAgdmFyIFUgPSB4O1xuICAgICAgICAgICAgeCA9IHcsIHcgPSBVO1xuICAgICAgICAgIH0gZWxzZSBpZiAoTyA9PT0gMCB8fCB3LmNtcG4oMSkgPT09IDApXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB4LmlzdWIodyk7XG4gICAgICAgIH0gd2hpbGUgKCEwKTtcbiAgICAgICAgcmV0dXJuIHcuaXVzaGxuKEQpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWdjZChnKS5hLnVtb2QoZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc0V2ZW4gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc09kZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMud29yZHNbMF0gJiAxKSA9PT0gMTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmFuZGxuID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy53b3Jkc1swXSAmIGc7XG4gICAgICB9LCBpLnByb3RvdHlwZS5iaW5jbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcih0eXBlb2YgZyA9PSBcIm51bWJlclwiKTtcbiAgICAgICAgdmFyIHggPSBnICUgMjYsIHcgPSAoZyAtIHgpIC8gMjYsIEQgPSAxIDw8IHg7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA8PSB3KVxuICAgICAgICAgIHJldHVybiB0aGlzLl9leHBhbmQodyArIDEpLCB0aGlzLndvcmRzW3ddIHw9IEQsIHRoaXM7XG4gICAgICAgIGZvciAodmFyIE8gPSBELCBVID0gdzsgTyAhPT0gMCAmJiBVIDwgdGhpcy5sZW5ndGg7IFUrKykge1xuICAgICAgICAgIHZhciBWID0gdGhpcy53b3Jkc1tVXSB8IDA7XG4gICAgICAgICAgViArPSBPLCBPID0gViA+Pj4gMjYsIFYgJj0gNjcxMDg4NjMsIHRoaXMud29yZHNbVV0gPSBWO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPICE9PSAwICYmICh0aGlzLndvcmRzW1VdID0gTywgdGhpcy5sZW5ndGgrKyksIHRoaXM7XG4gICAgICB9LCBpLnByb3RvdHlwZS5pc1plcm8gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5jbXBuID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IGcgPCAwO1xuICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCAmJiAheCkgcmV0dXJuIC0xO1xuICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiB4KSByZXR1cm4gMTtcbiAgICAgICAgdGhpcy5fc3RyaXAoKTtcbiAgICAgICAgdmFyIHc7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IDEpXG4gICAgICAgICAgdyA9IDE7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHggJiYgKGcgPSAtZyksIHIoZyA8PSA2NzEwODg2MywgXCJOdW1iZXIgaXMgdG9vIGJpZ1wiKTtcbiAgICAgICAgICB2YXIgRCA9IHRoaXMud29yZHNbMF0gfCAwO1xuICAgICAgICAgIHcgPSBEID09PSBnID8gMCA6IEQgPCBnID8gLTEgOiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLXcgfCAwIDogdztcbiAgICAgIH0sIGkucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgZy5uZWdhdGl2ZSA9PT0gMCkgcmV0dXJuIC0xO1xuICAgICAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBnLm5lZ2F0aXZlICE9PSAwKSByZXR1cm4gMTtcbiAgICAgICAgdmFyIHggPSB0aGlzLnVjbXAoZyk7XG4gICAgICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwID8gLXggfCAwIDogeDtcbiAgICAgIH0sIGkucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA+IGcubGVuZ3RoKSByZXR1cm4gMTtcbiAgICAgICAgaWYgKHRoaXMubGVuZ3RoIDwgZy5sZW5ndGgpIHJldHVybiAtMTtcbiAgICAgICAgZm9yICh2YXIgeCA9IDAsIHcgPSB0aGlzLmxlbmd0aCAtIDE7IHcgPj0gMDsgdy0tKSB7XG4gICAgICAgICAgdmFyIEQgPSB0aGlzLndvcmRzW3ddIHwgMCwgTyA9IGcud29yZHNbd10gfCAwO1xuICAgICAgICAgIGlmIChEICE9PSBPKSB7XG4gICAgICAgICAgICBEIDwgTyA/IHggPSAtMSA6IEQgPiBPICYmICh4ID0gMSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHg7XG4gICAgICB9LCBpLnByb3RvdHlwZS5ndG4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNtcG4oZykgPT09IDE7XG4gICAgICB9LCBpLnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGcpID09PSAxO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ3RlbiA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihnKSA+PSAwO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZ3RlID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5jbXAoZykgPj0gMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLmx0biA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wbihnKSA9PT0gLTE7XG4gICAgICB9LCBpLnByb3RvdHlwZS5sdCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGcpID09PSAtMTtcbiAgICAgIH0sIGkucHJvdG90eXBlLmx0ZW4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNtcG4oZykgPD0gMDtcbiAgICAgIH0sIGkucHJvdG90eXBlLmx0ZSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGcpIDw9IDA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5lcW4gPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNtcG4oZykgPT09IDA7XG4gICAgICB9LCBpLnByb3RvdHlwZS5lcSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY21wKGcpID09PSAwO1xuICAgICAgfSwgaS5yZWQgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiBuZXcgJChnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnRvUmVkID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gcighdGhpcy5yZWQsIFwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dFwiKSwgcih0aGlzLm5lZ2F0aXZlID09PSAwLCBcInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzXCIpLCBnLmNvbnZlcnRUbyh0aGlzKS5fZm9yY2VSZWQoZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5mcm9tUmVkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcImZyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHRcIiksIHRoaXMucmVkLmNvbnZlcnRGcm9tKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUuX2ZvcmNlUmVkID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWQgPSBnLCB0aGlzO1xuICAgICAgfSwgaS5wcm90b3R5cGUuZm9yY2VSZWQgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKCF0aGlzLnJlZCwgXCJBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0XCIpLCB0aGlzLl9mb3JjZVJlZChnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlZEFkZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsIFwicmVkQWRkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSwgdGhpcy5yZWQuYWRkKHRoaXMsIGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVkSUFkZCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsIFwicmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksIHRoaXMucmVkLmlhZGQodGhpcywgZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWRTdWIgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcInJlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksIHRoaXMucmVkLnN1Yih0aGlzLCBnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlZElTdWIgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcInJlZElTdWIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLCB0aGlzLnJlZC5pc3ViKHRoaXMsIGcpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVkU2hsID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgXCJyZWRTaGwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLCB0aGlzLnJlZC5zaGwodGhpcywgZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWRNdWwgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksIHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsIGcpLCB0aGlzLnJlZC5tdWwodGhpcywgZyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWRJTXVsID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgXCJyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLCB0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLCBnKSwgdGhpcy5yZWQuaW11bCh0aGlzLCBnKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlZFNxciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgXCJyZWRTcXIgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuc3FyKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVkSVNxciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcih0aGlzLnJlZCwgXCJyZWRJU3FyIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLmlzcXIodGhpcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWRTcXJ0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcInJlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzXCIpLCB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSwgdGhpcy5yZWQuc3FydCh0aGlzKTtcbiAgICAgIH0sIGkucHJvdG90eXBlLnJlZEludm0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHIodGhpcy5yZWQsIFwicmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5pbnZtKHRoaXMpO1xuICAgICAgfSwgaS5wcm90b3R5cGUucmVkTmVnID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkLCBcInJlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnNcIiksIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLCB0aGlzLnJlZC5uZWcodGhpcyk7XG4gICAgICB9LCBpLnByb3RvdHlwZS5yZWRQb3cgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiByKHRoaXMucmVkICYmICFnLnJlZCwgXCJyZWRQb3cobm9ybWFsTnVtKVwiKSwgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksIHRoaXMucmVkLnBvdyh0aGlzLCBnKTtcbiAgICAgIH07XG4gICAgICB2YXIgTSA9IHtcbiAgICAgICAgazI1NjogbnVsbCxcbiAgICAgICAgcDIyNDogbnVsbCxcbiAgICAgICAgcDE5MjogbnVsbCxcbiAgICAgICAgcDI1NTE5OiBudWxsXG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gSChfLCBnKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IF8sIHRoaXMucCA9IG5ldyBpKGcsIDE2KSwgdGhpcy5uID0gdGhpcy5wLmJpdExlbmd0aCgpLCB0aGlzLmsgPSBuZXcgaSgxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCksIHRoaXMudG1wID0gdGhpcy5fdG1wKCk7XG4gICAgICB9XG4gICAgICBILnByb3RvdHlwZS5fdG1wID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBnID0gbmV3IGkobnVsbCk7XG4gICAgICAgIHJldHVybiBnLndvcmRzID0gbmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4gLyAxMykpLCBnO1xuICAgICAgfSwgSC5wcm90b3R5cGUuaXJlZHVjZSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSBnLCB3O1xuICAgICAgICBkb1xuICAgICAgICAgIHRoaXMuc3BsaXQoeCwgdGhpcy50bXApLCB4ID0gdGhpcy5pbXVsSyh4KSwgeCA9IHguaWFkZCh0aGlzLnRtcCksIHcgPSB4LmJpdExlbmd0aCgpO1xuICAgICAgICB3aGlsZSAodyA+IHRoaXMubik7XG4gICAgICAgIHZhciBEID0gdyA8IHRoaXMubiA/IC0xIDogeC51Y21wKHRoaXMucCk7XG4gICAgICAgIHJldHVybiBEID09PSAwID8gKHgud29yZHNbMF0gPSAwLCB4Lmxlbmd0aCA9IDEpIDogRCA+IDAgPyB4LmlzdWIodGhpcy5wKSA6IHguc3RyaXAgIT09IHZvaWQgMCA/IHguc3RyaXAoKSA6IHguX3N0cmlwKCksIHg7XG4gICAgICB9LCBILnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgZy5pdXNocm4odGhpcy5uLCAwLCB4KTtcbiAgICAgIH0sIEgucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gZy5pbXVsKHRoaXMuayk7XG4gICAgICB9O1xuICAgICAgZnVuY3Rpb24gSygpIHtcbiAgICAgICAgSC5jYWxsKFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgXCJrMjU2XCIsXG4gICAgICAgICAgXCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZlwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBuKEssIEgpLCBLLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgZm9yICh2YXIgdyA9IDQxOTQzMDMsIEQgPSBNYXRoLm1pbihnLmxlbmd0aCwgOSksIE8gPSAwOyBPIDwgRDsgTysrKVxuICAgICAgICAgIHgud29yZHNbT10gPSBnLndvcmRzW09dO1xuICAgICAgICBpZiAoeC5sZW5ndGggPSBELCBnLmxlbmd0aCA8PSA5KSB7XG4gICAgICAgICAgZy53b3Jkc1swXSA9IDAsIGcubGVuZ3RoID0gMTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIFUgPSBnLndvcmRzWzldO1xuICAgICAgICBmb3IgKHgud29yZHNbeC5sZW5ndGgrK10gPSBVICYgdywgTyA9IDEwOyBPIDwgZy5sZW5ndGg7IE8rKykge1xuICAgICAgICAgIHZhciBWID0gZy53b3Jkc1tPXSB8IDA7XG4gICAgICAgICAgZy53b3Jkc1tPIC0gMTBdID0gKFYgJiB3KSA8PCA0IHwgVSA+Pj4gMjIsIFUgPSBWO1xuICAgICAgICB9XG4gICAgICAgIFUgPj4+PSAyMiwgZy53b3Jkc1tPIC0gMTBdID0gVSwgVSA9PT0gMCAmJiBnLmxlbmd0aCA+IDEwID8gZy5sZW5ndGggLT0gMTAgOiBnLmxlbmd0aCAtPSA5O1xuICAgICAgfSwgSy5wcm90b3R5cGUuaW11bEsgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIGcud29yZHNbZy5sZW5ndGhdID0gMCwgZy53b3Jkc1tnLmxlbmd0aCArIDFdID0gMCwgZy5sZW5ndGggKz0gMjtcbiAgICAgICAgZm9yICh2YXIgeCA9IDAsIHcgPSAwOyB3IDwgZy5sZW5ndGg7IHcrKykge1xuICAgICAgICAgIHZhciBEID0gZy53b3Jkc1t3XSB8IDA7XG4gICAgICAgICAgeCArPSBEICogOTc3LCBnLndvcmRzW3ddID0geCAmIDY3MTA4ODYzLCB4ID0gRCAqIDY0ICsgKHggLyA2NzEwODg2NCB8IDApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnLndvcmRzW2cubGVuZ3RoIC0gMV0gPT09IDAgJiYgKGcubGVuZ3RoLS0sIGcud29yZHNbZy5sZW5ndGggLSAxXSA9PT0gMCAmJiBnLmxlbmd0aC0tKSwgZztcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBqKCkge1xuICAgICAgICBILmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcInAyMjRcIixcbiAgICAgICAgICBcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG4oaiwgSCk7XG4gICAgICBmdW5jdGlvbiBDKCkge1xuICAgICAgICBILmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcInAxOTJcIixcbiAgICAgICAgICBcImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG4oQywgSCk7XG4gICAgICBmdW5jdGlvbiBrKCkge1xuICAgICAgICBILmNhbGwoXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgICBcIjI1NTE5XCIsXG4gICAgICAgICAgXCI3ZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmVkXCJcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG4oaywgSCksIGsucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24oZykge1xuICAgICAgICBmb3IgKHZhciB4ID0gMCwgdyA9IDA7IHcgPCBnLmxlbmd0aDsgdysrKSB7XG4gICAgICAgICAgdmFyIEQgPSAoZy53b3Jkc1t3XSB8IDApICogMTkgKyB4LCBPID0gRCAmIDY3MTA4ODYzO1xuICAgICAgICAgIEQgPj4+PSAyNiwgZy53b3Jkc1t3XSA9IE8sIHggPSBEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB4ICE9PSAwICYmIChnLndvcmRzW2cubGVuZ3RoKytdID0geCksIGc7XG4gICAgICB9LCBpLl9wcmltZSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgaWYgKE1bZ10pIHJldHVybiBNW2ddO1xuICAgICAgICB2YXIgeDtcbiAgICAgICAgaWYgKGcgPT09IFwiazI1NlwiKVxuICAgICAgICAgIHggPSBuZXcgSygpO1xuICAgICAgICBlbHNlIGlmIChnID09PSBcInAyMjRcIilcbiAgICAgICAgICB4ID0gbmV3IGooKTtcbiAgICAgICAgZWxzZSBpZiAoZyA9PT0gXCJwMTkyXCIpXG4gICAgICAgICAgeCA9IG5ldyBDKCk7XG4gICAgICAgIGVsc2UgaWYgKGcgPT09IFwicDI1NTE5XCIpXG4gICAgICAgICAgeCA9IG5ldyBrKCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIHByaW1lIFwiICsgZyk7XG4gICAgICAgIHJldHVybiBNW2ddID0geCwgeDtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiAkKF8pIHtcbiAgICAgICAgaWYgKHR5cGVvZiBfID09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICB2YXIgZyA9IGkuX3ByaW1lKF8pO1xuICAgICAgICAgIHRoaXMubSA9IGcucCwgdGhpcy5wcmltZSA9IGc7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHIoXy5ndG4oMSksIFwibW9kdWx1cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxXCIpLCB0aGlzLm0gPSBfLCB0aGlzLnByaW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICAgICQucHJvdG90eXBlLl92ZXJpZnkxID0gZnVuY3Rpb24oZykge1xuICAgICAgICByKGcubmVnYXRpdmUgPT09IDAsIFwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXNcIiksIHIoZy5yZWQsIFwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiKTtcbiAgICAgIH0sICQucHJvdG90eXBlLl92ZXJpZnkyID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByKChnLm5lZ2F0aXZlIHwgeC5uZWdhdGl2ZSkgPT09IDAsIFwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXNcIiksIHIoXG4gICAgICAgICAgZy5yZWQgJiYgZy5yZWQgPT09IHgucmVkLFxuICAgICAgICAgIFwicmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVyc1wiXG4gICAgICAgICk7XG4gICAgICB9LCAkLnByb3RvdHlwZS5pbW9kID0gZnVuY3Rpb24oZykge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmltZSA/IHRoaXMucHJpbWUuaXJlZHVjZShnKS5fZm9yY2VSZWQodGhpcykgOiAodShnLCBnLnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcykpLCBnKTtcbiAgICAgIH0sICQucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIGcuaXNaZXJvKCkgPyBnLmNsb25lKCkgOiB0aGlzLm0uc3ViKGcpLl9mb3JjZVJlZCh0aGlzKTtcbiAgICAgIH0sICQucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgdGhpcy5fdmVyaWZ5MihnLCB4KTtcbiAgICAgICAgdmFyIHcgPSBnLmFkZCh4KTtcbiAgICAgICAgcmV0dXJuIHcuY21wKHRoaXMubSkgPj0gMCAmJiB3LmlzdWIodGhpcy5tKSwgdy5fZm9yY2VSZWQodGhpcyk7XG4gICAgICB9LCAkLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICB0aGlzLl92ZXJpZnkyKGcsIHgpO1xuICAgICAgICB2YXIgdyA9IGcuaWFkZCh4KTtcbiAgICAgICAgcmV0dXJuIHcuY21wKHRoaXMubSkgPj0gMCAmJiB3LmlzdWIodGhpcy5tKSwgdztcbiAgICAgIH0sICQucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgdGhpcy5fdmVyaWZ5MihnLCB4KTtcbiAgICAgICAgdmFyIHcgPSBnLnN1Yih4KTtcbiAgICAgICAgcmV0dXJuIHcuY21wbigwKSA8IDAgJiYgdy5pYWRkKHRoaXMubSksIHcuX2ZvcmNlUmVkKHRoaXMpO1xuICAgICAgfSwgJC5wcm90b3R5cGUuaXN1YiA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgdGhpcy5fdmVyaWZ5MihnLCB4KTtcbiAgICAgICAgdmFyIHcgPSBnLmlzdWIoeCk7XG4gICAgICAgIHJldHVybiB3LmNtcG4oMCkgPCAwICYmIHcuaWFkZCh0aGlzLm0pLCB3O1xuICAgICAgfSwgJC5wcm90b3R5cGUuc2hsID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5MShnKSwgdGhpcy5pbW9kKGcudXNobG4oeCkpO1xuICAgICAgfSwgJC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uKGcsIHgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcmlmeTIoZywgeCksIHRoaXMuaW1vZChnLmltdWwoeCkpO1xuICAgICAgfSwgJC5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyaWZ5MihnLCB4KSwgdGhpcy5pbW9kKGcubXVsKHgpKTtcbiAgICAgIH0sICQucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmltdWwoZywgZy5jbG9uZSgpKTtcbiAgICAgIH0sICQucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubXVsKGcsIGcpO1xuICAgICAgfSwgJC5wcm90b3R5cGUuc3FydCA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgaWYgKGcuaXNaZXJvKCkpIHJldHVybiBnLmNsb25lKCk7XG4gICAgICAgIHZhciB4ID0gdGhpcy5tLmFuZGxuKDMpO1xuICAgICAgICBpZiAocih4ICUgMiA9PT0gMSksIHggPT09IDMpIHtcbiAgICAgICAgICB2YXIgdyA9IHRoaXMubS5hZGQobmV3IGkoMSkpLml1c2hybigyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wb3coZywgdyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yICh2YXIgRCA9IHRoaXMubS5zdWJuKDEpLCBPID0gMDsgIUQuaXNaZXJvKCkgJiYgRC5hbmRsbigxKSA9PT0gMDsgKVxuICAgICAgICAgIE8rKywgRC5pdXNocm4oMSk7XG4gICAgICAgIHIoIUQuaXNaZXJvKCkpO1xuICAgICAgICB2YXIgVSA9IG5ldyBpKDEpLnRvUmVkKHRoaXMpLCBWID0gVS5yZWROZWcoKSwgTCA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKSwgbSA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICAgICAgZm9yIChtID0gbmV3IGkoMiAqIG0gKiBtKS50b1JlZCh0aGlzKTsgdGhpcy5wb3cobSwgTCkuY21wKFYpICE9PSAwOyApXG4gICAgICAgICAgbS5yZWRJQWRkKFYpO1xuICAgICAgICBmb3IgKHZhciB2ID0gdGhpcy5wb3cobSwgRCksIFAgPSB0aGlzLnBvdyhnLCBELmFkZG4oMSkuaXVzaHJuKDEpKSwgTiA9IHRoaXMucG93KGcsIEQpLCBZID0gTzsgTi5jbXAoVSkgIT09IDA7ICkge1xuICAgICAgICAgIGZvciAodmFyIGVlID0gTiwgaWUgPSAwOyBlZS5jbXAoVSkgIT09IDA7IGllKyspXG4gICAgICAgICAgICBlZSA9IGVlLnJlZFNxcigpO1xuICAgICAgICAgIHIoaWUgPCBZKTtcbiAgICAgICAgICB2YXIgbGUgPSB0aGlzLnBvdyh2LCBuZXcgaSgxKS5pdXNobG4oWSAtIGllIC0gMSkpO1xuICAgICAgICAgIFAgPSBQLnJlZE11bChsZSksIHYgPSBsZS5yZWRTcXIoKSwgTiA9IE4ucmVkTXVsKHYpLCBZID0gaWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFA7XG4gICAgICB9LCAkLnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IGcuX2ludm1wKHRoaXMubSk7XG4gICAgICAgIHJldHVybiB4Lm5lZ2F0aXZlICE9PSAwID8gKHgubmVnYXRpdmUgPSAwLCB0aGlzLmltb2QoeCkucmVkTmVnKCkpIDogdGhpcy5pbW9kKHgpO1xuICAgICAgfSwgJC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICBpZiAoeC5pc1plcm8oKSkgcmV0dXJuIG5ldyBpKDEpLnRvUmVkKHRoaXMpO1xuICAgICAgICBpZiAoeC5jbXBuKDEpID09PSAwKSByZXR1cm4gZy5jbG9uZSgpO1xuICAgICAgICB2YXIgdyA9IDQsIEQgPSBuZXcgQXJyYXkoMSA8PCB3KTtcbiAgICAgICAgRFswXSA9IG5ldyBpKDEpLnRvUmVkKHRoaXMpLCBEWzFdID0gZztcbiAgICAgICAgZm9yICh2YXIgTyA9IDI7IE8gPCBELmxlbmd0aDsgTysrKVxuICAgICAgICAgIERbT10gPSB0aGlzLm11bChEW08gLSAxXSwgZyk7XG4gICAgICAgIHZhciBVID0gRFswXSwgViA9IDAsIEwgPSAwLCBtID0geC5iaXRMZW5ndGgoKSAlIDI2O1xuICAgICAgICBmb3IgKG0gPT09IDAgJiYgKG0gPSAyNiksIE8gPSB4Lmxlbmd0aCAtIDE7IE8gPj0gMDsgTy0tKSB7XG4gICAgICAgICAgZm9yICh2YXIgdiA9IHgud29yZHNbT10sIFAgPSBtIC0gMTsgUCA+PSAwOyBQLS0pIHtcbiAgICAgICAgICAgIHZhciBOID0gdiA+PiBQICYgMTtcbiAgICAgICAgICAgIGlmIChVICE9PSBEWzBdICYmIChVID0gdGhpcy5zcXIoVSkpLCBOID09PSAwICYmIFYgPT09IDApIHtcbiAgICAgICAgICAgICAgTCA9IDA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgViA8PD0gMSwgViB8PSBOLCBMKyssICEoTCAhPT0gdyAmJiAoTyAhPT0gMCB8fCBQICE9PSAwKSkgJiYgKFUgPSB0aGlzLm11bChVLCBEW1ZdKSwgTCA9IDAsIFYgPSAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbSA9IDI2O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVO1xuICAgICAgfSwgJC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IGcudW1vZCh0aGlzLm0pO1xuICAgICAgICByZXR1cm4geCA9PT0gZyA/IHguY2xvbmUoKSA6IHg7XG4gICAgICB9LCAkLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSBnLmNsb25lKCk7XG4gICAgICAgIHJldHVybiB4LnJlZCA9IG51bGwsIHg7XG4gICAgICB9LCBpLm1vbnQgPSBmdW5jdGlvbihnKSB7XG4gICAgICAgIHJldHVybiBuZXcgVyhnKTtcbiAgICAgIH07XG4gICAgICBmdW5jdGlvbiBXKF8pIHtcbiAgICAgICAgJC5jYWxsKHRoaXMsIF8pLCB0aGlzLnNoaWZ0ID0gdGhpcy5tLmJpdExlbmd0aCgpLCB0aGlzLnNoaWZ0ICUgMjYgIT09IDAgJiYgKHRoaXMuc2hpZnQgKz0gMjYgLSB0aGlzLnNoaWZ0ICUgMjYpLCB0aGlzLnIgPSBuZXcgaSgxKS5pdXNobG4odGhpcy5zaGlmdCksIHRoaXMucjIgPSB0aGlzLmltb2QodGhpcy5yLnNxcigpKSwgdGhpcy5yaW52ID0gdGhpcy5yLl9pbnZtcCh0aGlzLm0pLCB0aGlzLm1pbnYgPSB0aGlzLnJpbnYubXVsKHRoaXMucikuaXN1Ym4oMSkuZGl2KHRoaXMubSksIHRoaXMubWludiA9IHRoaXMubWludi51bW9kKHRoaXMuciksIHRoaXMubWludiA9IHRoaXMuci5zdWIodGhpcy5taW52KTtcbiAgICAgIH1cbiAgICAgIG4oVywgJCksIFcucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW1vZChnLnVzaGxuKHRoaXMuc2hpZnQpKTtcbiAgICAgIH0sIFcucHJvdG90eXBlLmNvbnZlcnRGcm9tID0gZnVuY3Rpb24oZykge1xuICAgICAgICB2YXIgeCA9IHRoaXMuaW1vZChnLm11bCh0aGlzLnJpbnYpKTtcbiAgICAgICAgcmV0dXJuIHgucmVkID0gbnVsbCwgeDtcbiAgICAgIH0sIFcucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbihnLCB4KSB7XG4gICAgICAgIGlmIChnLmlzWmVybygpIHx8IHguaXNaZXJvKCkpXG4gICAgICAgICAgcmV0dXJuIGcud29yZHNbMF0gPSAwLCBnLmxlbmd0aCA9IDEsIGc7XG4gICAgICAgIHZhciB3ID0gZy5pbXVsKHgpLCBEID0gdy5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksIE8gPSB3LmlzdWIoRCkuaXVzaHJuKHRoaXMuc2hpZnQpLCBVID0gTztcbiAgICAgICAgcmV0dXJuIE8uY21wKHRoaXMubSkgPj0gMCA/IFUgPSBPLmlzdWIodGhpcy5tKSA6IE8uY21wbigwKSA8IDAgJiYgKFUgPSBPLmlhZGQodGhpcy5tKSksIFUuX2ZvcmNlUmVkKHRoaXMpO1xuICAgICAgfSwgVy5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24oZywgeCkge1xuICAgICAgICBpZiAoZy5pc1plcm8oKSB8fCB4LmlzWmVybygpKSByZXR1cm4gbmV3IGkoMCkuX2ZvcmNlUmVkKHRoaXMpO1xuICAgICAgICB2YXIgdyA9IGcubXVsKHgpLCBEID0gdy5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksIE8gPSB3LmlzdWIoRCkuaXVzaHJuKHRoaXMuc2hpZnQpLCBVID0gTztcbiAgICAgICAgcmV0dXJuIE8uY21wKHRoaXMubSkgPj0gMCA/IFUgPSBPLmlzdWIodGhpcy5tKSA6IE8uY21wbigwKSA8IDAgJiYgKFUgPSBPLmlhZGQodGhpcy5tKSksIFUuX2ZvcmNlUmVkKHRoaXMpO1xuICAgICAgfSwgVy5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uKGcpIHtcbiAgICAgICAgdmFyIHggPSB0aGlzLmltb2QoZy5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpO1xuICAgICAgICByZXR1cm4geC5fZm9yY2VSZWQodGhpcyk7XG4gICAgICB9O1xuICAgIH0pKHMsIE15KTtcbiAgfSkoY28pKSwgY28uZXhwb3J0cztcbn1cbnZhciBPeSA9IHYwKCk7XG5jb25zdCBiZCA9IC8qIEBfX1BVUkVfXyAqLyBGYyhPeSk7XG52YXIgVWkgPSB7IGV4cG9ydHM6IHt9IH07XG4vKiEgc2FmZS1idWZmZXIuIE1JVCBMaWNlbnNlLiBGZXJvc3MgQWJvdWtoYWRpamVoIDxodHRwczovL2Zlcm9zcy5vcmcvb3BlbnNvdXJjZT4gKi9cbnZhciBUZDtcbmZ1bmN0aW9uIEJ5KCkge1xuICByZXR1cm4gVGQgfHwgKFRkID0gMSwgKGZ1bmN0aW9uKHMsIGUpIHtcbiAgICB2YXIgdCA9IEtjKCksIHIgPSB0LkJ1ZmZlcjtcbiAgICBmdW5jdGlvbiBuKG8sIGEpIHtcbiAgICAgIGZvciAodmFyIGwgaW4gbylcbiAgICAgICAgYVtsXSA9IG9bbF07XG4gICAgfVxuICAgIHIuZnJvbSAmJiByLmFsbG9jICYmIHIuYWxsb2NVbnNhZmUgJiYgci5hbGxvY1Vuc2FmZVNsb3cgPyBzLmV4cG9ydHMgPSB0IDogKG4odCwgZSksIGUuQnVmZmVyID0gaSk7XG4gICAgZnVuY3Rpb24gaShvLCBhLCBsKSB7XG4gICAgICByZXR1cm4gcihvLCBhLCBsKTtcbiAgICB9XG4gICAgaS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHIucHJvdG90eXBlKSwgbihyLCBpKSwgaS5mcm9tID0gZnVuY3Rpb24obywgYSwgbCkge1xuICAgICAgaWYgKHR5cGVvZiBvID09IFwibnVtYmVyXCIpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlclwiKTtcbiAgICAgIHJldHVybiByKG8sIGEsIGwpO1xuICAgIH0sIGkuYWxsb2MgPSBmdW5jdGlvbihvLCBhLCBsKSB7XG4gICAgICBpZiAodHlwZW9mIG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7XG4gICAgICB2YXIgYyA9IHIobyk7XG4gICAgICByZXR1cm4gYSAhPT0gdm9pZCAwID8gdHlwZW9mIGwgPT0gXCJzdHJpbmdcIiA/IGMuZmlsbChhLCBsKSA6IGMuZmlsbChhKSA6IGMuZmlsbCgwKSwgYztcbiAgICB9LCBpLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24obykge1xuICAgICAgaWYgKHR5cGVvZiBvICE9IFwibnVtYmVyXCIpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyXCIpO1xuICAgICAgcmV0dXJuIHIobyk7XG4gICAgfSwgaS5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbihvKSB7XG4gICAgICBpZiAodHlwZW9mIG8gIT0gXCJudW1iZXJcIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXJcIik7XG4gICAgICByZXR1cm4gdC5TbG93QnVmZmVyKG8pO1xuICAgIH07XG4gIH0pKFVpLCBVaS5leHBvcnRzKSksIFVpLmV4cG9ydHM7XG59XG52YXIgemEsIHdkO1xuZnVuY3Rpb24gRTAoKSB7XG4gIGlmICh3ZCkgcmV0dXJuIHphO1xuICB3ZCA9IDE7XG4gIHZhciBzID0gQnkoKS5CdWZmZXI7XG4gIGZ1bmN0aW9uIGUodCkge1xuICAgIGlmICh0Lmxlbmd0aCA+PSAyNTUpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQWxwaGFiZXQgdG9vIGxvbmdcIik7XG4gICAgZm9yICh2YXIgciA9IG5ldyBVaW50OEFycmF5KDI1NiksIG4gPSAwOyBuIDwgci5sZW5ndGg7IG4rKylcbiAgICAgIHJbbl0gPSAyNTU7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbyA9IHQuY2hhckF0KGkpLCBhID0gby5jaGFyQ29kZUF0KDApO1xuICAgICAgaWYgKHJbYV0gIT09IDI1NSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihvICsgXCIgaXMgYW1iaWd1b3VzXCIpO1xuICAgICAgclthXSA9IGk7XG4gICAgfVxuICAgIHZhciBsID0gdC5sZW5ndGgsIGMgPSB0LmNoYXJBdCgwKSwgdSA9IE1hdGgubG9nKGwpIC8gTWF0aC5sb2coMjU2KSwgZCA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyhsKTtcbiAgICBmdW5jdGlvbiBoKHkpIHtcbiAgICAgIGlmICgoQXJyYXkuaXNBcnJheSh5KSB8fCB5IGluc3RhbmNlb2YgVWludDhBcnJheSkgJiYgKHkgPSBzLmZyb20oeSkpLCAhcy5pc0J1ZmZlcih5KSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkV4cGVjdGVkIEJ1ZmZlclwiKTtcbiAgICAgIGlmICh5Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICBmb3IgKHZhciBFID0gMCwgYiA9IDAsIFIgPSAwLCBBID0geS5sZW5ndGg7IFIgIT09IEEgJiYgeVtSXSA9PT0gMDsgKVxuICAgICAgICBSKyssIEUrKztcbiAgICAgIGZvciAodmFyIEYgPSAoQSAtIFIpICogZCArIDEgPj4+IDAsIE0gPSBuZXcgVWludDhBcnJheShGKTsgUiAhPT0gQTsgKSB7XG4gICAgICAgIGZvciAodmFyIEggPSB5W1JdLCBLID0gMCwgaiA9IEYgLSAxOyAoSCAhPT0gMCB8fCBLIDwgYikgJiYgaiAhPT0gLTE7IGotLSwgSysrKVxuICAgICAgICAgIEggKz0gMjU2ICogTVtqXSA+Pj4gMCwgTVtqXSA9IEggJSBsID4+PiAwLCBIID0gSCAvIGwgPj4+IDA7XG4gICAgICAgIGlmIChIICE9PSAwKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vbi16ZXJvIGNhcnJ5XCIpO1xuICAgICAgICBiID0gSywgUisrO1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgQyA9IEYgLSBiOyBDICE9PSBGICYmIE1bQ10gPT09IDA7IClcbiAgICAgICAgQysrO1xuICAgICAgZm9yICh2YXIgayA9IGMucmVwZWF0KEUpOyBDIDwgRjsgKytDKVxuICAgICAgICBrICs9IHQuY2hhckF0KE1bQ10pO1xuICAgICAgcmV0dXJuIGs7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGYoeSkge1xuICAgICAgaWYgKHR5cGVvZiB5ICE9IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFeHBlY3RlZCBTdHJpbmdcIik7XG4gICAgICBpZiAoeS5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiBzLmFsbG9jKDApO1xuICAgICAgZm9yICh2YXIgRSA9IDAsIGIgPSAwLCBSID0gMDsgeVtFXSA9PT0gYzsgKVxuICAgICAgICBiKyssIEUrKztcbiAgICAgIGZvciAodmFyIEEgPSAoeS5sZW5ndGggLSBFKSAqIHUgKyAxID4+PiAwLCBGID0gbmV3IFVpbnQ4QXJyYXkoQSk7IEUgPCB5Lmxlbmd0aDsgKSB7XG4gICAgICAgIHZhciBNID0geS5jaGFyQ29kZUF0KEUpO1xuICAgICAgICBpZiAoTSA+IDI1NSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIHZhciBIID0gcltNXTtcbiAgICAgICAgaWYgKEggPT09IDI1NSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGZvciAodmFyIEsgPSAwLCBqID0gQSAtIDE7IChIICE9PSAwIHx8IEsgPCBSKSAmJiBqICE9PSAtMTsgai0tLCBLKyspXG4gICAgICAgICAgSCArPSBsICogRltqXSA+Pj4gMCwgRltqXSA9IEggJSAyNTYgPj4+IDAsIEggPSBIIC8gMjU2ID4+PiAwO1xuICAgICAgICBpZiAoSCAhPT0gMClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb24temVybyBjYXJyeVwiKTtcbiAgICAgICAgUiA9IEssIEUrKztcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIEMgPSBBIC0gUjsgQyAhPT0gQSAmJiBGW0NdID09PSAwOyApXG4gICAgICAgIEMrKztcbiAgICAgIHZhciBrID0gcy5hbGxvY1Vuc2FmZShiICsgKEEgLSBDKSk7XG4gICAgICBrLmZpbGwoMCwgMCwgYik7XG4gICAgICBmb3IgKHZhciAkID0gYjsgQyAhPT0gQTsgKVxuICAgICAgICBrWyQrK10gPSBGW0MrK107XG4gICAgICByZXR1cm4gaztcbiAgICB9XG4gICAgZnVuY3Rpb24gcCh5KSB7XG4gICAgICB2YXIgRSA9IGYoeSk7XG4gICAgICBpZiAoRSlcbiAgICAgICAgcmV0dXJuIEU7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb24tYmFzZVwiICsgbCArIFwiIGNoYXJhY3RlclwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGVuY29kZTogaCxcbiAgICAgIGRlY29kZVVuc2FmZTogZixcbiAgICAgIGRlY29kZTogcFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHphID0gZSwgemE7XG59XG52YXIgWWEsIEFkO1xuZnVuY3Rpb24gRnkoKSB7XG4gIGlmIChBZCkgcmV0dXJuIFlhO1xuICBBZCA9IDE7XG4gIHZhciBzID0gRTAoKSwgZSA9IFwiMTIzNDU2Nzg5QUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamttbm9wcXJzdHV2d3h5elwiO1xuICByZXR1cm4gWWEgPSBzKGUpLCBZYTtcbn1cbnZhciBOeSA9IEZ5KCk7XG5jb25zdCBhciA9IC8qIEBfX1BVUkVfXyAqLyBGYyhOeSksIElkID0gWGY7XG52YXIgZXQgPSB7fSwgWmEsIF9kO1xuZnVuY3Rpb24gVXkoKSB7XG4gIGlmIChfZCkgcmV0dXJuIFphO1xuICBfZCA9IDE7XG4gIHZhciBzID0gRTAoKSwgZSA9IFwiMTIzNDU2Nzg5QUJDREVGR0hKS0xNTlBRUlNUVVZXWFlaYWJjZGVmZ2hpamttbm9wcXJzdHV2d3h5elwiO1xuICByZXR1cm4gWmEgPSBzKGUpLCBaYTtcbn1cbmZ1bmN0aW9uIHVzKHMsIGUsIHQpIHtcbiAgcmV0dXJuIGUgPD0gcyAmJiBzIDw9IHQ7XG59XG5mdW5jdGlvbiBjYShzKSB7XG4gIGlmIChzID09PSB2b2lkIDApIHJldHVybiB7fTtcbiAgaWYgKHMgPT09IE9iamVjdChzKSkgcmV0dXJuIHM7XG4gIHRocm93IFR5cGVFcnJvcihcIkNvdWxkIG5vdCBjb252ZXJ0IGFyZ3VtZW50IHRvIGRpY3Rpb25hcnlcIik7XG59XG5mdW5jdGlvbiAkeShzKSB7XG4gIGZvciAodmFyIGUgPSBTdHJpbmcocyksIHQgPSBlLmxlbmd0aCwgciA9IDAsIG4gPSBbXTsgciA8IHQ7ICkge1xuICAgIHZhciBpID0gZS5jaGFyQ29kZUF0KHIpO1xuICAgIGlmIChpIDwgNTUyOTYgfHwgaSA+IDU3MzQzKVxuICAgICAgbi5wdXNoKGkpO1xuICAgIGVsc2UgaWYgKDU2MzIwIDw9IGkgJiYgaSA8PSA1NzM0MylcbiAgICAgIG4ucHVzaCg2NTUzMyk7XG4gICAgZWxzZSBpZiAoNTUyOTYgPD0gaSAmJiBpIDw9IDU2MzE5KVxuICAgICAgaWYgKHIgPT09IHQgLSAxKVxuICAgICAgICBuLnB1c2goNjU1MzMpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBvID0gcy5jaGFyQ29kZUF0KHIgKyAxKTtcbiAgICAgICAgaWYgKDU2MzIwIDw9IG8gJiYgbyA8PSA1NzM0Mykge1xuICAgICAgICAgIHZhciBhID0gaSAmIDEwMjMsIGwgPSBvICYgMTAyMztcbiAgICAgICAgICBuLnB1c2goNjU1MzYgKyAoYSA8PCAxMCkgKyBsKSwgciArPSAxO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBuLnB1c2goNjU1MzMpO1xuICAgICAgfVxuICAgIHIgKz0gMTtcbiAgfVxuICByZXR1cm4gbjtcbn1cbmZ1bmN0aW9uIEd5KHMpIHtcbiAgZm9yICh2YXIgZSA9IFwiXCIsIHQgPSAwOyB0IDwgcy5sZW5ndGg7ICsrdCkge1xuICAgIHZhciByID0gc1t0XTtcbiAgICByIDw9IDY1NTM1ID8gZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHIpIDogKHIgLT0gNjU1MzYsIGUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShcbiAgICAgIChyID4+IDEwKSArIDU1Mjk2LFxuICAgICAgKHIgJiAxMDIzKSArIDU2MzIwXG4gICAgKSk7XG4gIH1cbiAgcmV0dXJuIGU7XG59XG52YXIgQm8gPSAtMTtcbmZ1bmN0aW9uIFhjKHMpIHtcbiAgdGhpcy50b2tlbnMgPSBbXS5zbGljZS5jYWxsKHMpO1xufVxuWGMucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBlbmQtb2Ytc3RyZWFtIGhhcyBiZWVuIGhpdC5cbiAgICovXG4gIGVuZE9mU3RyZWFtOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gIXRoaXMudG9rZW5zLmxlbmd0aDtcbiAgfSxcbiAgLyoqXG4gICAqIFdoZW4gYSB0b2tlbiBpcyByZWFkIGZyb20gYSBzdHJlYW0sIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGVcbiAgICogc3RyZWFtIG11c3QgYmUgcmV0dXJuZWQgYW5kIHN1YnNlcXVlbnRseSByZW1vdmVkLCBhbmRcbiAgICogZW5kLW9mLXN0cmVhbSBtdXN0IGJlIHJldHVybmVkIG90aGVyd2lzZS5cbiAgICpcbiAgICogQHJldHVybiB7bnVtYmVyfSBHZXQgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgc3RyZWFtLCBvclxuICAgKiBlbmRfb2Zfc3RyZWFtLlxuICAgKi9cbiAgcmVhZDogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5zLmxlbmd0aCA/IHRoaXMudG9rZW5zLnNoaWZ0KCkgOiBCbztcbiAgfSxcbiAgLyoqXG4gICAqIFdoZW4gb25lIG9yIG1vcmUgdG9rZW5zIGFyZSBwcmVwZW5kZWQgdG8gYSBzdHJlYW0sIHRob3NlIHRva2Vuc1xuICAgKiBtdXN0IGJlIGluc2VydGVkLCBpbiBnaXZlbiBvcmRlciwgYmVmb3JlIHRoZSBmaXJzdCB0b2tlbiBpbiB0aGVcbiAgICogc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gdG9rZW4gVGhlIHRva2VuKHMpIHRvIHByZXBlbmQgdG8gdGhlIHN0cmVhbS5cbiAgICovXG4gIHByZXBlbmQ6IGZ1bmN0aW9uKHMpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzKSlcbiAgICAgIGZvciAodmFyIGUgPSAoXG4gICAgICAgIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki9cbiAgICAgICAgc1xuICAgICAgKTsgZS5sZW5ndGg7IClcbiAgICAgICAgdGhpcy50b2tlbnMudW5zaGlmdChlLnBvcCgpKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLnRva2Vucy51bnNoaWZ0KHMpO1xuICB9LFxuICAvKipcbiAgICogV2hlbiBvbmUgb3IgbW9yZSB0b2tlbnMgYXJlIHB1c2hlZCB0byBhIHN0cmVhbSwgdGhvc2UgdG9rZW5zXG4gICAqIG11c3QgYmUgaW5zZXJ0ZWQsIGluIGdpdmVuIG9yZGVyLCBhZnRlciB0aGUgbGFzdCB0b2tlbiBpbiB0aGVcbiAgICogc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gdG9rZW4gVGhlIHRva2VucyhzKSB0byBwcmVwZW5kIHRvIHRoZSBzdHJlYW0uXG4gICAqL1xuICBwdXNoOiBmdW5jdGlvbihzKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocykpXG4gICAgICBmb3IgKHZhciBlID0gKFxuICAgICAgICAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovXG4gICAgICAgIHNcbiAgICAgICk7IGUubGVuZ3RoOyApXG4gICAgICAgIHRoaXMudG9rZW5zLnB1c2goZS5zaGlmdCgpKTtcbiAgICBlbHNlXG4gICAgICB0aGlzLnRva2Vucy5wdXNoKHMpO1xuICB9XG59O1xudmFyIFBuID0gLTE7XG5mdW5jdGlvbiBYYShzLCBlKSB7XG4gIGlmIChzKVxuICAgIHRocm93IFR5cGVFcnJvcihcIkRlY29kZXIgZXJyb3JcIik7XG4gIHJldHVybiBlIHx8IDY1NTMzO1xufVxudmFyIEZvID0gXCJ1dGYtOFwiO1xuZnVuY3Rpb24gTm8ocywgZSkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTm8pKVxuICAgIHJldHVybiBuZXcgTm8ocywgZSk7XG4gIGlmIChzID0gcyAhPT0gdm9pZCAwID8gU3RyaW5nKHMpLnRvTG93ZXJDYXNlKCkgOiBGbywgcyAhPT0gRm8pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRW5jb2Rpbmcgbm90IHN1cHBvcnRlZC4gT25seSB1dGYtOCBpcyBzdXBwb3J0ZWRcIik7XG4gIGUgPSBjYShlKSwgdGhpcy5fc3RyZWFtaW5nID0gITEsIHRoaXMuX0JPTXNlZW4gPSAhMSwgdGhpcy5fZGVjb2RlciA9IG51bGwsIHRoaXMuX2ZhdGFsID0gISFlLmZhdGFsLCB0aGlzLl9pZ25vcmVCT00gPSAhIWUuaWdub3JlQk9NLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJlbmNvZGluZ1wiLCB7IHZhbHVlOiBcInV0Zi04XCIgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImZhdGFsXCIsIHsgdmFsdWU6IHRoaXMuX2ZhdGFsIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJpZ25vcmVCT01cIiwgeyB2YWx1ZTogdGhpcy5faWdub3JlQk9NIH0pO1xufVxuTm8ucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlclZpZXc9fSBpbnB1dCBUaGUgYnVmZmVyIG9mIGJ5dGVzIHRvIGRlY29kZS5cbiAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nLlxuICAgKi9cbiAgZGVjb2RlOiBmdW5jdGlvbihlLCB0KSB7XG4gICAgdmFyIHI7XG4gICAgdHlwZW9mIGUgPT0gXCJvYmplY3RcIiAmJiBlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyByID0gbmV3IFVpbnQ4QXJyYXkoZSkgOiB0eXBlb2YgZSA9PSBcIm9iamVjdFwiICYmIFwiYnVmZmVyXCIgaW4gZSAmJiBlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gciA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgZS5idWZmZXIsXG4gICAgICBlLmJ5dGVPZmZzZXQsXG4gICAgICBlLmJ5dGVMZW5ndGhcbiAgICApIDogciA9IG5ldyBVaW50OEFycmF5KDApLCB0ID0gY2EodCksIHRoaXMuX3N0cmVhbWluZyB8fCAodGhpcy5fZGVjb2RlciA9IG5ldyBWeSh7IGZhdGFsOiB0aGlzLl9mYXRhbCB9KSwgdGhpcy5fQk9Nc2VlbiA9ICExKSwgdGhpcy5fc3RyZWFtaW5nID0gISF0LnN0cmVhbTtcbiAgICBmb3IgKHZhciBuID0gbmV3IFhjKHIpLCBpID0gW10sIG87ICFuLmVuZE9mU3RyZWFtKCkgJiYgKG8gPSB0aGlzLl9kZWNvZGVyLmhhbmRsZXIobiwgbi5yZWFkKCkpLCBvICE9PSBQbik7IClcbiAgICAgIG8gIT09IG51bGwgJiYgKEFycmF5LmlzQXJyYXkobykgPyBpLnB1c2guYXBwbHkoXG4gICAgICAgIGksXG4gICAgICAgIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki9cbiAgICAgICAgb1xuICAgICAgKSA6IGkucHVzaChvKSk7XG4gICAgaWYgKCF0aGlzLl9zdHJlYW1pbmcpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG8gPSB0aGlzLl9kZWNvZGVyLmhhbmRsZXIobiwgbi5yZWFkKCkpLCBvID09PSBQbilcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgbyAhPT0gbnVsbCAmJiAoQXJyYXkuaXNBcnJheShvKSA/IGkucHVzaC5hcHBseShcbiAgICAgICAgICBpLFxuICAgICAgICAgIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki9cbiAgICAgICAgICBvXG4gICAgICAgICkgOiBpLnB1c2gobykpO1xuICAgICAgfSB3aGlsZSAoIW4uZW5kT2ZTdHJlYW0oKSk7XG4gICAgICB0aGlzLl9kZWNvZGVyID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGkubGVuZ3RoICYmIFtcInV0Zi04XCJdLmluZGV4T2YodGhpcy5lbmNvZGluZykgIT09IC0xICYmICF0aGlzLl9pZ25vcmVCT00gJiYgIXRoaXMuX0JPTXNlZW4gJiYgKGlbMF0gPT09IDY1Mjc5ID8gKHRoaXMuX0JPTXNlZW4gPSAhMCwgaS5zaGlmdCgpKSA6IHRoaXMuX0JPTXNlZW4gPSAhMCksIEd5KGkpO1xuICB9XG59O1xuZnVuY3Rpb24gVW8ocywgZSkge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVW8pKVxuICAgIHJldHVybiBuZXcgVW8ocywgZSk7XG4gIGlmIChzID0gcyAhPT0gdm9pZCAwID8gU3RyaW5nKHMpLnRvTG93ZXJDYXNlKCkgOiBGbywgcyAhPT0gRm8pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRW5jb2Rpbmcgbm90IHN1cHBvcnRlZC4gT25seSB1dGYtOCBpcyBzdXBwb3J0ZWRcIik7XG4gIGUgPSBjYShlKSwgdGhpcy5fc3RyZWFtaW5nID0gITEsIHRoaXMuX2VuY29kZXIgPSBudWxsLCB0aGlzLl9vcHRpb25zID0geyBmYXRhbDogISFlLmZhdGFsIH0sIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImVuY29kaW5nXCIsIHsgdmFsdWU6IFwidXRmLThcIiB9KTtcbn1cblVvLnByb3RvdHlwZSA9IHtcbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0X3N0cmluZyBUaGUgc3RyaW5nIHRvIGVuY29kZS5cbiAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gICAqIEByZXR1cm4ge1VpbnQ4QXJyYXl9IEVuY29kZWQgYnl0ZXMsIGFzIGEgVWludDhBcnJheS5cbiAgICovXG4gIGVuY29kZTogZnVuY3Rpb24oZSwgdCkge1xuICAgIGUgPSBlID8gU3RyaW5nKGUpIDogXCJcIiwgdCA9IGNhKHQpLCB0aGlzLl9zdHJlYW1pbmcgfHwgKHRoaXMuX2VuY29kZXIgPSBuZXcgankodGhpcy5fb3B0aW9ucykpLCB0aGlzLl9zdHJlYW1pbmcgPSAhIXQuc3RyZWFtO1xuICAgIGZvciAodmFyIHIgPSBbXSwgbiA9IG5ldyBYYygkeShlKSksIGk7ICFuLmVuZE9mU3RyZWFtKCkgJiYgKGkgPSB0aGlzLl9lbmNvZGVyLmhhbmRsZXIobiwgbi5yZWFkKCkpLCBpICE9PSBQbik7IClcbiAgICAgIEFycmF5LmlzQXJyYXkoaSkgPyByLnB1c2guYXBwbHkoXG4gICAgICAgIHIsXG4gICAgICAgIC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki9cbiAgICAgICAgaVxuICAgICAgKSA6IHIucHVzaChpKTtcbiAgICBpZiAoIXRoaXMuX3N0cmVhbWluZykge1xuICAgICAgZm9yICg7IGkgPSB0aGlzLl9lbmNvZGVyLmhhbmRsZXIobiwgbi5yZWFkKCkpLCBpICE9PSBQbjsgKVxuICAgICAgICBBcnJheS5pc0FycmF5KGkpID8gci5wdXNoLmFwcGx5KFxuICAgICAgICAgIHIsXG4gICAgICAgICAgLyoqQHR5cGUgeyFBcnJheS48bnVtYmVyPn0qL1xuICAgICAgICAgIGlcbiAgICAgICAgKSA6IHIucHVzaChpKTtcbiAgICAgIHRoaXMuX2VuY29kZXIgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkocik7XG4gIH1cbn07XG5mdW5jdGlvbiBWeShzKSB7XG4gIHZhciBlID0gcy5mYXRhbCwgdCA9IDAsIHIgPSAwLCBuID0gMCwgaSA9IDEyOCwgbyA9IDE5MTtcbiAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oYSwgbCkge1xuICAgIGlmIChsID09PSBCbyAmJiBuICE9PSAwKVxuICAgICAgcmV0dXJuIG4gPSAwLCBYYShlKTtcbiAgICBpZiAobCA9PT0gQm8pXG4gICAgICByZXR1cm4gUG47XG4gICAgaWYgKG4gPT09IDApIHtcbiAgICAgIGlmICh1cyhsLCAwLCAxMjcpKVxuICAgICAgICByZXR1cm4gbDtcbiAgICAgIGlmICh1cyhsLCAxOTQsIDIyMykpXG4gICAgICAgIG4gPSAxLCB0ID0gbCAtIDE5MjtcbiAgICAgIGVsc2UgaWYgKHVzKGwsIDIyNCwgMjM5KSlcbiAgICAgICAgbCA9PT0gMjI0ICYmIChpID0gMTYwKSwgbCA9PT0gMjM3ICYmIChvID0gMTU5KSwgbiA9IDIsIHQgPSBsIC0gMjI0O1xuICAgICAgZWxzZSBpZiAodXMobCwgMjQwLCAyNDQpKVxuICAgICAgICBsID09PSAyNDAgJiYgKGkgPSAxNDQpLCBsID09PSAyNDQgJiYgKG8gPSAxNDMpLCBuID0gMywgdCA9IGwgLSAyNDA7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiBYYShlKTtcbiAgICAgIHJldHVybiB0ID0gdCA8PCA2ICogbiwgbnVsbDtcbiAgICB9XG4gICAgaWYgKCF1cyhsLCBpLCBvKSlcbiAgICAgIHJldHVybiB0ID0gbiA9IHIgPSAwLCBpID0gMTI4LCBvID0gMTkxLCBhLnByZXBlbmQobCksIFhhKGUpO1xuICAgIGlmIChpID0gMTI4LCBvID0gMTkxLCByICs9IDEsIHQgKz0gbCAtIDEyOCA8PCA2ICogKG4gLSByKSwgciAhPT0gbilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIHZhciBjID0gdDtcbiAgICByZXR1cm4gdCA9IG4gPSByID0gMCwgYztcbiAgfTtcbn1cbmZ1bmN0aW9uIGp5KHMpIHtcbiAgcy5mYXRhbCwgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oZSwgdCkge1xuICAgIGlmICh0ID09PSBCbylcbiAgICAgIHJldHVybiBQbjtcbiAgICBpZiAodXModCwgMCwgMTI3KSlcbiAgICAgIHJldHVybiB0O1xuICAgIHZhciByLCBuO1xuICAgIHVzKHQsIDEyOCwgMjA0NykgPyAociA9IDEsIG4gPSAxOTIpIDogdXModCwgMjA0OCwgNjU1MzUpID8gKHIgPSAyLCBuID0gMjI0KSA6IHVzKHQsIDY1NTM2LCAxMTE0MTExKSAmJiAociA9IDMsIG4gPSAyNDApO1xuICAgIGZvciAodmFyIGkgPSBbKHQgPj4gNiAqIHIpICsgbl07IHIgPiAwOyApIHtcbiAgICAgIHZhciBvID0gdCA+PiA2ICogKHIgLSAxKTtcbiAgICAgIGkucHVzaCgxMjggfCBvICYgNjMpLCByIC09IDE7XG4gICAgfVxuICAgIHJldHVybiBpO1xuICB9O1xufVxuY29uc3QgS3kgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmZyZWV6ZSgvKiBAX19QVVJFX18gKi8gT2JqZWN0LmRlZmluZVByb3BlcnR5KHtcbiAgX19wcm90b19fOiBudWxsLFxuICBUZXh0RGVjb2RlcjogTm8sXG4gIFRleHRFbmNvZGVyOiBVb1xufSwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiBcIk1vZHVsZVwiIH0pKSwgSHkgPSAvKiBAX19QVVJFX18gKi8gTmMoS3kpO1xudmFyIFJkO1xuZnVuY3Rpb24gcXkoKSB7XG4gIGlmIChSZCkgcmV0dXJuIGV0O1xuICBSZCA9IDE7XG4gIHZhciBzID0gZXQgJiYgZXQuX19jcmVhdGVCaW5kaW5nIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKEMsIGssICQsIFcpIHtcbiAgICBXID09PSB2b2lkIDAgJiYgKFcgPSAkKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KEMsIFcsIHsgZW51bWVyYWJsZTogITAsIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ga1skXTtcbiAgICB9IH0pO1xuICB9KSA6IChmdW5jdGlvbihDLCBrLCAkLCBXKSB7XG4gICAgVyA9PT0gdm9pZCAwICYmIChXID0gJCksIENbV10gPSBrWyRdO1xuICB9KSksIGUgPSBldCAmJiBldC5fX3NldE1vZHVsZURlZmF1bHQgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24oQywgaykge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiAhMCwgdmFsdWU6IGsgfSk7XG4gIH0pIDogZnVuY3Rpb24oQywgaykge1xuICAgIEMuZGVmYXVsdCA9IGs7XG4gIH0pLCB0ID0gZXQgJiYgZXQuX19kZWNvcmF0ZSB8fCBmdW5jdGlvbihDLCBrLCAkLCBXKSB7XG4gICAgdmFyIF8gPSBhcmd1bWVudHMubGVuZ3RoLCBnID0gXyA8IDMgPyBrIDogVyA9PT0gbnVsbCA/IFcgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGssICQpIDogVywgeDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PSBcImZ1bmN0aW9uXCIpIGcgPSBSZWZsZWN0LmRlY29yYXRlKEMsIGssICQsIFcpO1xuICAgIGVsc2UgZm9yICh2YXIgdyA9IEMubGVuZ3RoIC0gMTsgdyA+PSAwOyB3LS0pICh4ID0gQ1t3XSkgJiYgKGcgPSAoXyA8IDMgPyB4KGcpIDogXyA+IDMgPyB4KGssICQsIGcpIDogeChrLCAkKSkgfHwgZyk7XG4gICAgcmV0dXJuIF8gPiAzICYmIGcgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KGssICQsIGcpLCBnO1xuICB9LCByID0gZXQgJiYgZXQuX19pbXBvcnRTdGFyIHx8IGZ1bmN0aW9uKEMpIHtcbiAgICBpZiAoQyAmJiBDLl9fZXNNb2R1bGUpIHJldHVybiBDO1xuICAgIHZhciBrID0ge307XG4gICAgaWYgKEMgIT0gbnVsbCkgZm9yICh2YXIgJCBpbiBDKSAkICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChDLCAkKSAmJiBzKGssIEMsICQpO1xuICAgIHJldHVybiBlKGssIEMpLCBrO1xuICB9LCBuID0gZXQgJiYgZXQuX19pbXBvcnREZWZhdWx0IHx8IGZ1bmN0aW9uKEMpIHtcbiAgICByZXR1cm4gQyAmJiBDLl9fZXNNb2R1bGUgPyBDIDogeyBkZWZhdWx0OiBDIH07XG4gIH07XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShldCwgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6ICEwIH0pLCBldC5kZXNlcmlhbGl6ZVVuY2hlY2tlZCA9IGV0LmRlc2VyaWFsaXplID0gZXQuc2VyaWFsaXplID0gZXQuQmluYXJ5UmVhZGVyID0gZXQuQmluYXJ5V3JpdGVyID0gZXQuQm9yc2hFcnJvciA9IGV0LmJhc2VEZWNvZGUgPSBldC5iYXNlRW5jb2RlID0gdm9pZCAwO1xuICBjb25zdCBpID0gbih2MCgpKSwgbyA9IG4oVXkoKSksIGEgPSByKEh5KSwgbCA9IHR5cGVvZiBUZXh0RGVjb2RlciAhPSBcImZ1bmN0aW9uXCIgPyBhLlRleHREZWNvZGVyIDogVGV4dERlY29kZXIsIGMgPSBuZXcgbChcInV0Zi04XCIsIHsgZmF0YWw6ICEwIH0pO1xuICBmdW5jdGlvbiB1KEMpIHtcbiAgICByZXR1cm4gdHlwZW9mIEMgPT0gXCJzdHJpbmdcIiAmJiAoQyA9IEJ1ZmZlci5mcm9tKEMsIFwidXRmOFwiKSksIG8uZGVmYXVsdC5lbmNvZGUoQnVmZmVyLmZyb20oQykpO1xuICB9XG4gIGV0LmJhc2VFbmNvZGUgPSB1O1xuICBmdW5jdGlvbiBkKEMpIHtcbiAgICByZXR1cm4gQnVmZmVyLmZyb20oby5kZWZhdWx0LmRlY29kZShDKSk7XG4gIH1cbiAgZXQuYmFzZURlY29kZSA9IGQ7XG4gIGNvbnN0IGggPSAxMDI0O1xuICBjbGFzcyBmIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGspIHtcbiAgICAgIHN1cGVyKGspLCB0aGlzLmZpZWxkUGF0aCA9IFtdLCB0aGlzLm9yaWdpbmFsTWVzc2FnZSA9IGs7XG4gICAgfVxuICAgIGFkZFRvRmllbGRQYXRoKGspIHtcbiAgICAgIHRoaXMuZmllbGRQYXRoLnNwbGljZSgwLCAwLCBrKSwgdGhpcy5tZXNzYWdlID0gdGhpcy5vcmlnaW5hbE1lc3NhZ2UgKyBcIjogXCIgKyB0aGlzLmZpZWxkUGF0aC5qb2luKFwiLlwiKTtcbiAgICB9XG4gIH1cbiAgZXQuQm9yc2hFcnJvciA9IGY7XG4gIGNsYXNzIHAge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgdGhpcy5idWYgPSBCdWZmZXIuYWxsb2MoaCksIHRoaXMubGVuZ3RoID0gMDtcbiAgICB9XG4gICAgbWF5YmVSZXNpemUoKSB7XG4gICAgICB0aGlzLmJ1Zi5sZW5ndGggPCAxNiArIHRoaXMubGVuZ3RoICYmICh0aGlzLmJ1ZiA9IEJ1ZmZlci5jb25jYXQoW3RoaXMuYnVmLCBCdWZmZXIuYWxsb2MoaCldKSk7XG4gICAgfVxuICAgIHdyaXRlVTgoaykge1xuICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpLCB0aGlzLmJ1Zi53cml0ZVVJbnQ4KGssIHRoaXMubGVuZ3RoKSwgdGhpcy5sZW5ndGggKz0gMTtcbiAgICB9XG4gICAgd3JpdGVVMTYoaykge1xuICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpLCB0aGlzLmJ1Zi53cml0ZVVJbnQxNkxFKGssIHRoaXMubGVuZ3RoKSwgdGhpcy5sZW5ndGggKz0gMjtcbiAgICB9XG4gICAgd3JpdGVVMzIoaykge1xuICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpLCB0aGlzLmJ1Zi53cml0ZVVJbnQzMkxFKGssIHRoaXMubGVuZ3RoKSwgdGhpcy5sZW5ndGggKz0gNDtcbiAgICB9XG4gICAgd3JpdGVVNjQoaykge1xuICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpLCB0aGlzLndyaXRlQnVmZmVyKEJ1ZmZlci5mcm9tKG5ldyBpLmRlZmF1bHQoaykudG9BcnJheShcImxlXCIsIDgpKSk7XG4gICAgfVxuICAgIHdyaXRlVTEyOChrKSB7XG4gICAgICB0aGlzLm1heWJlUmVzaXplKCksIHRoaXMud3JpdGVCdWZmZXIoQnVmZmVyLmZyb20obmV3IGkuZGVmYXVsdChrKS50b0FycmF5KFwibGVcIiwgMTYpKSk7XG4gICAgfVxuICAgIHdyaXRlVTI1NihrKSB7XG4gICAgICB0aGlzLm1heWJlUmVzaXplKCksIHRoaXMud3JpdGVCdWZmZXIoQnVmZmVyLmZyb20obmV3IGkuZGVmYXVsdChrKS50b0FycmF5KFwibGVcIiwgMzIpKSk7XG4gICAgfVxuICAgIHdyaXRlVTUxMihrKSB7XG4gICAgICB0aGlzLm1heWJlUmVzaXplKCksIHRoaXMud3JpdGVCdWZmZXIoQnVmZmVyLmZyb20obmV3IGkuZGVmYXVsdChrKS50b0FycmF5KFwibGVcIiwgNjQpKSk7XG4gICAgfVxuICAgIHdyaXRlQnVmZmVyKGspIHtcbiAgICAgIHRoaXMuYnVmID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICAgIEJ1ZmZlci5mcm9tKHRoaXMuYnVmLnN1YmFycmF5KDAsIHRoaXMubGVuZ3RoKSksXG4gICAgICAgIGssXG4gICAgICAgIEJ1ZmZlci5hbGxvYyhoKVxuICAgICAgXSksIHRoaXMubGVuZ3RoICs9IGsubGVuZ3RoO1xuICAgIH1cbiAgICB3cml0ZVN0cmluZyhrKSB7XG4gICAgICB0aGlzLm1heWJlUmVzaXplKCk7XG4gICAgICBjb25zdCAkID0gQnVmZmVyLmZyb20oaywgXCJ1dGY4XCIpO1xuICAgICAgdGhpcy53cml0ZVUzMigkLmxlbmd0aCksIHRoaXMud3JpdGVCdWZmZXIoJCk7XG4gICAgfVxuICAgIHdyaXRlRml4ZWRBcnJheShrKSB7XG4gICAgICB0aGlzLndyaXRlQnVmZmVyKEJ1ZmZlci5mcm9tKGspKTtcbiAgICB9XG4gICAgd3JpdGVBcnJheShrLCAkKSB7XG4gICAgICB0aGlzLm1heWJlUmVzaXplKCksIHRoaXMud3JpdGVVMzIoay5sZW5ndGgpO1xuICAgICAgZm9yIChjb25zdCBXIG9mIGspXG4gICAgICAgIHRoaXMubWF5YmVSZXNpemUoKSwgJChXKTtcbiAgICB9XG4gICAgdG9BcnJheSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1Zi5zdWJhcnJheSgwLCB0aGlzLmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIGV0LkJpbmFyeVdyaXRlciA9IHA7XG4gIGZ1bmN0aW9uIHkoQywgaywgJCkge1xuICAgIGNvbnN0IFcgPSAkLnZhbHVlO1xuICAgICQudmFsdWUgPSBmdW5jdGlvbiguLi5fKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gVy5hcHBseSh0aGlzLCBfKTtcbiAgICAgIH0gY2F0Y2ggKGcpIHtcbiAgICAgICAgaWYgKGcgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSB7XG4gICAgICAgICAgY29uc3QgeCA9IGcuY29kZTtcbiAgICAgICAgICBpZiAoW1wiRVJSX0JVRkZFUl9PVVRfT0ZfQk9VTkRTXCIsIFwiRVJSX09VVF9PRl9SQU5HRVwiXS5pbmRleE9mKHgpID49IDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgZihcIlJlYWNoZWQgdGhlIGVuZCBvZiBidWZmZXIgd2hlbiBkZXNlcmlhbGl6aW5nXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGc7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBjbGFzcyBFIHtcbiAgICBjb25zdHJ1Y3RvcihrKSB7XG4gICAgICB0aGlzLmJ1ZiA9IGssIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgcmVhZFU4KCkge1xuICAgICAgY29uc3QgayA9IHRoaXMuYnVmLnJlYWRVSW50OCh0aGlzLm9mZnNldCk7XG4gICAgICByZXR1cm4gdGhpcy5vZmZzZXQgKz0gMSwgaztcbiAgICB9XG4gICAgcmVhZFUxNigpIHtcbiAgICAgIGNvbnN0IGsgPSB0aGlzLmJ1Zi5yZWFkVUludDE2TEUodGhpcy5vZmZzZXQpO1xuICAgICAgcmV0dXJuIHRoaXMub2Zmc2V0ICs9IDIsIGs7XG4gICAgfVxuICAgIHJlYWRVMzIoKSB7XG4gICAgICBjb25zdCBrID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMub2Zmc2V0KTtcbiAgICAgIHJldHVybiB0aGlzLm9mZnNldCArPSA0LCBrO1xuICAgIH1cbiAgICByZWFkVTY0KCkge1xuICAgICAgY29uc3QgayA9IHRoaXMucmVhZEJ1ZmZlcig4KTtcbiAgICAgIHJldHVybiBuZXcgaS5kZWZhdWx0KGssIFwibGVcIik7XG4gICAgfVxuICAgIHJlYWRVMTI4KCkge1xuICAgICAgY29uc3QgayA9IHRoaXMucmVhZEJ1ZmZlcigxNik7XG4gICAgICByZXR1cm4gbmV3IGkuZGVmYXVsdChrLCBcImxlXCIpO1xuICAgIH1cbiAgICByZWFkVTI1NigpIHtcbiAgICAgIGNvbnN0IGsgPSB0aGlzLnJlYWRCdWZmZXIoMzIpO1xuICAgICAgcmV0dXJuIG5ldyBpLmRlZmF1bHQoaywgXCJsZVwiKTtcbiAgICB9XG4gICAgcmVhZFU1MTIoKSB7XG4gICAgICBjb25zdCBrID0gdGhpcy5yZWFkQnVmZmVyKDY0KTtcbiAgICAgIHJldHVybiBuZXcgaS5kZWZhdWx0KGssIFwibGVcIik7XG4gICAgfVxuICAgIHJlYWRCdWZmZXIoaykge1xuICAgICAgaWYgKHRoaXMub2Zmc2V0ICsgayA+IHRoaXMuYnVmLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IGYoYEV4cGVjdGVkIGJ1ZmZlciBsZW5ndGggJHtrfSBpc24ndCB3aXRoaW4gYm91bmRzYCk7XG4gICAgICBjb25zdCAkID0gdGhpcy5idWYuc2xpY2UodGhpcy5vZmZzZXQsIHRoaXMub2Zmc2V0ICsgayk7XG4gICAgICByZXR1cm4gdGhpcy5vZmZzZXQgKz0gaywgJDtcbiAgICB9XG4gICAgcmVhZFN0cmluZygpIHtcbiAgICAgIGNvbnN0IGsgPSB0aGlzLnJlYWRVMzIoKSwgJCA9IHRoaXMucmVhZEJ1ZmZlcihrKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBjLmRlY29kZSgkKTtcbiAgICAgIH0gY2F0Y2ggKFcpIHtcbiAgICAgICAgdGhyb3cgbmV3IGYoYEVycm9yIGRlY29kaW5nIFVURi04IHN0cmluZzogJHtXfWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZWFkRml4ZWRBcnJheShrKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5yZWFkQnVmZmVyKGspKTtcbiAgICB9XG4gICAgcmVhZEFycmF5KGspIHtcbiAgICAgIGNvbnN0ICQgPSB0aGlzLnJlYWRVMzIoKSwgVyA9IEFycmF5KCk7XG4gICAgICBmb3IgKGxldCBfID0gMDsgXyA8ICQ7ICsrXylcbiAgICAgICAgVy5wdXNoKGsoKSk7XG4gICAgICByZXR1cm4gVztcbiAgICB9XG4gIH1cbiAgdChbXG4gICAgeVxuICBdLCBFLnByb3RvdHlwZSwgXCJyZWFkVThcIiwgbnVsbCksIHQoW1xuICAgIHlcbiAgXSwgRS5wcm90b3R5cGUsIFwicmVhZFUxNlwiLCBudWxsKSwgdChbXG4gICAgeVxuICBdLCBFLnByb3RvdHlwZSwgXCJyZWFkVTMyXCIsIG51bGwpLCB0KFtcbiAgICB5XG4gIF0sIEUucHJvdG90eXBlLCBcInJlYWRVNjRcIiwgbnVsbCksIHQoW1xuICAgIHlcbiAgXSwgRS5wcm90b3R5cGUsIFwicmVhZFUxMjhcIiwgbnVsbCksIHQoW1xuICAgIHlcbiAgXSwgRS5wcm90b3R5cGUsIFwicmVhZFUyNTZcIiwgbnVsbCksIHQoW1xuICAgIHlcbiAgXSwgRS5wcm90b3R5cGUsIFwicmVhZFU1MTJcIiwgbnVsbCksIHQoW1xuICAgIHlcbiAgXSwgRS5wcm90b3R5cGUsIFwicmVhZFN0cmluZ1wiLCBudWxsKSwgdChbXG4gICAgeVxuICBdLCBFLnByb3RvdHlwZSwgXCJyZWFkRml4ZWRBcnJheVwiLCBudWxsKSwgdChbXG4gICAgeVxuICBdLCBFLnByb3RvdHlwZSwgXCJyZWFkQXJyYXlcIiwgbnVsbCksIGV0LkJpbmFyeVJlYWRlciA9IEU7XG4gIGZ1bmN0aW9uIGIoQykge1xuICAgIHJldHVybiBDLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgQy5zbGljZSgxKTtcbiAgfVxuICBmdW5jdGlvbiBSKEMsIGssICQsIFcsIF8pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHR5cGVvZiBXID09IFwic3RyaW5nXCIpXG4gICAgICAgIF9bYHdyaXRlJHtiKFcpfWBdKCQpO1xuICAgICAgZWxzZSBpZiAoVyBpbnN0YW5jZW9mIEFycmF5KVxuICAgICAgICBpZiAodHlwZW9mIFdbMF0gPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGlmICgkLmxlbmd0aCAhPT0gV1swXSlcbiAgICAgICAgICAgIHRocm93IG5ldyBmKGBFeHBlY3RpbmcgYnl0ZSBhcnJheSBvZiBsZW5ndGggJHtXWzBdfSwgYnV0IGdvdCAkeyQubGVuZ3RofSBieXRlc2ApO1xuICAgICAgICAgIF8ud3JpdGVGaXhlZEFycmF5KCQpO1xuICAgICAgICB9IGVsc2UgaWYgKFcubGVuZ3RoID09PSAyICYmIHR5cGVvZiBXWzFdID09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICBpZiAoJC5sZW5ndGggIT09IFdbMV0pXG4gICAgICAgICAgICB0aHJvdyBuZXcgZihgRXhwZWN0aW5nIGJ5dGUgYXJyYXkgb2YgbGVuZ3RoICR7V1sxXX0sIGJ1dCBnb3QgJHskLmxlbmd0aH0gYnl0ZXNgKTtcbiAgICAgICAgICBmb3IgKGxldCBnID0gMDsgZyA8IFdbMV07IGcrKylcbiAgICAgICAgICAgIFIoQywgbnVsbCwgJFtnXSwgV1swXSwgXyk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIF8ud3JpdGVBcnJheSgkLCAoZykgPT4ge1xuICAgICAgICAgICAgUihDLCBrLCBnLCBXWzBdLCBfKTtcbiAgICAgICAgICB9KTtcbiAgICAgIGVsc2UgaWYgKFcua2luZCAhPT0gdm9pZCAwKVxuICAgICAgICBzd2l0Y2ggKFcua2luZCkge1xuICAgICAgICAgIGNhc2UgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgJCA9PSBudWxsID8gXy53cml0ZVU4KDApIDogKF8ud3JpdGVVOCgxKSwgUihDLCBrLCAkLCBXLnR5cGUsIF8pKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwibWFwXCI6IHtcbiAgICAgICAgICAgIF8ud3JpdGVVMzIoJC5zaXplKSwgJC5mb3JFYWNoKChnLCB4KSA9PiB7XG4gICAgICAgICAgICAgIFIoQywgaywgeCwgVy5rZXksIF8pLCBSKEMsIGssIGcsIFcudmFsdWUsIF8pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBmKGBGaWVsZFR5cGUgJHtXfSB1bnJlY29nbml6ZWRgKTtcbiAgICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICBBKEMsICQsIF8pO1xuICAgIH0gY2F0Y2ggKGcpIHtcbiAgICAgIHRocm93IGcgaW5zdGFuY2VvZiBmICYmIGcuYWRkVG9GaWVsZFBhdGgoayksIGc7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIEEoQywgaywgJCkge1xuICAgIGlmICh0eXBlb2Ygay5ib3JzaFNlcmlhbGl6ZSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGsuYm9yc2hTZXJpYWxpemUoJCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IFcgPSBDLmdldChrLmNvbnN0cnVjdG9yKTtcbiAgICBpZiAoIVcpXG4gICAgICB0aHJvdyBuZXcgZihgQ2xhc3MgJHtrLmNvbnN0cnVjdG9yLm5hbWV9IGlzIG1pc3NpbmcgaW4gc2NoZW1hYCk7XG4gICAgaWYgKFcua2luZCA9PT0gXCJzdHJ1Y3RcIilcbiAgICAgIFcuZmllbGRzLm1hcCgoW18sIGddKSA9PiB7XG4gICAgICAgIFIoQywgXywga1tfXSwgZywgJCk7XG4gICAgICB9KTtcbiAgICBlbHNlIGlmIChXLmtpbmQgPT09IFwiZW51bVwiKSB7XG4gICAgICBjb25zdCBfID0ga1tXLmZpZWxkXTtcbiAgICAgIGZvciAobGV0IGcgPSAwOyBnIDwgVy52YWx1ZXMubGVuZ3RoOyArK2cpIHtcbiAgICAgICAgY29uc3QgW3gsIHddID0gVy52YWx1ZXNbZ107XG4gICAgICAgIGlmICh4ID09PSBfKSB7XG4gICAgICAgICAgJC53cml0ZVU4KGcpLCBSKEMsIHgsIGtbeF0sIHcsICQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlXG4gICAgICB0aHJvdyBuZXcgZihgVW5leHBlY3RlZCBzY2hlbWEga2luZDogJHtXLmtpbmR9IGZvciAke2suY29uc3RydWN0b3IubmFtZX1gKTtcbiAgfVxuICBmdW5jdGlvbiBGKEMsIGssICQgPSBwKSB7XG4gICAgY29uc3QgVyA9IG5ldyAkKCk7XG4gICAgcmV0dXJuIEEoQywgaywgVyksIFcudG9BcnJheSgpO1xuICB9XG4gIGV0LnNlcmlhbGl6ZSA9IEY7XG4gIGZ1bmN0aW9uIE0oQywgaywgJCwgVykge1xuICAgIHRyeSB7XG4gICAgICBpZiAodHlwZW9mICQgPT0gXCJzdHJpbmdcIilcbiAgICAgICAgcmV0dXJuIFdbYHJlYWQke2IoJCl9YF0oKTtcbiAgICAgIGlmICgkIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiAkWzBdID09IFwibnVtYmVyXCIpXG4gICAgICAgICAgcmV0dXJuIFcucmVhZEZpeGVkQXJyYXkoJFswXSk7XG4gICAgICAgIGlmICh0eXBlb2YgJFsxXSA9PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgY29uc3QgXyA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGcgPSAwOyBnIDwgJFsxXTsgZysrKVxuICAgICAgICAgICAgXy5wdXNoKE0oQywgbnVsbCwgJFswXSwgVykpO1xuICAgICAgICAgIHJldHVybiBfO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICByZXR1cm4gVy5yZWFkQXJyYXkoKCkgPT4gTShDLCBrLCAkWzBdLCBXKSk7XG4gICAgICB9XG4gICAgICBpZiAoJC5raW5kID09PSBcIm9wdGlvblwiKVxuICAgICAgICByZXR1cm4gVy5yZWFkVTgoKSA/IE0oQywgaywgJC50eXBlLCBXKSA6IHZvaWQgMDtcbiAgICAgIGlmICgkLmtpbmQgPT09IFwibWFwXCIpIHtcbiAgICAgICAgbGV0IF8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgICBjb25zdCBnID0gVy5yZWFkVTMyKCk7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgZzsgeCsrKSB7XG4gICAgICAgICAgY29uc3QgdyA9IE0oQywgaywgJC5rZXksIFcpLCBEID0gTShDLCBrLCAkLnZhbHVlLCBXKTtcbiAgICAgICAgICBfLnNldCh3LCBEKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gXztcbiAgICAgIH1cbiAgICAgIHJldHVybiBIKEMsICQsIFcpO1xuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHRocm93IF8gaW5zdGFuY2VvZiBmICYmIF8uYWRkVG9GaWVsZFBhdGgoayksIF87XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIEgoQywgaywgJCkge1xuICAgIGlmICh0eXBlb2Ygay5ib3JzaERlc2VyaWFsaXplID09IFwiZnVuY3Rpb25cIilcbiAgICAgIHJldHVybiBrLmJvcnNoRGVzZXJpYWxpemUoJCk7XG4gICAgY29uc3QgVyA9IEMuZ2V0KGspO1xuICAgIGlmICghVylcbiAgICAgIHRocm93IG5ldyBmKGBDbGFzcyAke2submFtZX0gaXMgbWlzc2luZyBpbiBzY2hlbWFgKTtcbiAgICBpZiAoVy5raW5kID09PSBcInN0cnVjdFwiKSB7XG4gICAgICBjb25zdCBfID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtnLCB4XSBvZiBDLmdldChrKS5maWVsZHMpXG4gICAgICAgIF9bZ10gPSBNKEMsIGcsIHgsICQpO1xuICAgICAgcmV0dXJuIG5ldyBrKF8pO1xuICAgIH1cbiAgICBpZiAoVy5raW5kID09PSBcImVudW1cIikge1xuICAgICAgY29uc3QgXyA9ICQucmVhZFU4KCk7XG4gICAgICBpZiAoXyA+PSBXLnZhbHVlcy5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBmKGBFbnVtIGluZGV4OiAke199IGlzIG91dCBvZiByYW5nZWApO1xuICAgICAgY29uc3QgW2csIHhdID0gVy52YWx1ZXNbX10sIHcgPSBNKEMsIGcsIHgsICQpO1xuICAgICAgcmV0dXJuIG5ldyBrKHsgW2ddOiB3IH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgZihgVW5leHBlY3RlZCBzY2hlbWEga2luZDogJHtXLmtpbmR9IGZvciAke2suY29uc3RydWN0b3IubmFtZX1gKTtcbiAgfVxuICBmdW5jdGlvbiBLKEMsIGssICQsIFcgPSBFKSB7XG4gICAgY29uc3QgXyA9IG5ldyBXKCQpLCBnID0gSChDLCBrLCBfKTtcbiAgICBpZiAoXy5vZmZzZXQgPCAkLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBmKGBVbmV4cGVjdGVkICR7JC5sZW5ndGggLSBfLm9mZnNldH0gYnl0ZXMgYWZ0ZXIgZGVzZXJpYWxpemVkIGRhdGFgKTtcbiAgICByZXR1cm4gZztcbiAgfVxuICBldC5kZXNlcmlhbGl6ZSA9IEs7XG4gIGZ1bmN0aW9uIGooQywgaywgJCwgVyA9IEUpIHtcbiAgICBjb25zdCBfID0gbmV3IFcoJCk7XG4gICAgcmV0dXJuIEgoQywgaywgXyk7XG4gIH1cbiAgcmV0dXJuIGV0LmRlc2VyaWFsaXplVW5jaGVja2VkID0gaiwgZXQ7XG59XG52YXIgSmEgPSBxeSgpLCByZSA9IHt9LCBMZDtcbmZ1bmN0aW9uIFd5KCkge1xuICBpZiAoTGQpIHJldHVybiByZTtcbiAgTGQgPSAxLCBPYmplY3QuZGVmaW5lUHJvcGVydHkocmUsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiAhMCB9KSwgcmUuczE2ID0gcmUuczggPSByZS5udTY0YmUgPSByZS51NDhiZSA9IHJlLnU0MGJlID0gcmUudTMyYmUgPSByZS51MjRiZSA9IHJlLnUxNmJlID0gcmUubnU2NCA9IHJlLnU0OCA9IHJlLnU0MCA9IHJlLnUzMiA9IHJlLnUyNCA9IHJlLnUxNiA9IHJlLnU4ID0gcmUub2Zmc2V0ID0gcmUuZ3JlZWR5ID0gcmUuQ29uc3RhbnQgPSByZS5VVEY4ID0gcmUuQ1N0cmluZyA9IHJlLkJsb2IgPSByZS5Cb29sZWFuID0gcmUuQml0RmllbGQgPSByZS5CaXRTdHJ1Y3R1cmUgPSByZS5WYXJpYW50TGF5b3V0ID0gcmUuVW5pb24gPSByZS5VbmlvbkxheW91dERpc2NyaW1pbmF0b3IgPSByZS5VbmlvbkRpc2NyaW1pbmF0b3IgPSByZS5TdHJ1Y3R1cmUgPSByZS5TZXF1ZW5jZSA9IHJlLkRvdWJsZUJFID0gcmUuRG91YmxlID0gcmUuRmxvYXRCRSA9IHJlLkZsb2F0ID0gcmUuTmVhckludDY0QkUgPSByZS5OZWFySW50NjQgPSByZS5OZWFyVUludDY0QkUgPSByZS5OZWFyVUludDY0ID0gcmUuSW50QkUgPSByZS5JbnQgPSByZS5VSW50QkUgPSByZS5VSW50ID0gcmUuT2Zmc2V0TGF5b3V0ID0gcmUuR3JlZWR5Q291bnQgPSByZS5FeHRlcm5hbExheW91dCA9IHJlLmJpbmRDb25zdHJ1Y3RvckxheW91dCA9IHJlLm5hbWVXaXRoUHJvcGVydHkgPSByZS5MYXlvdXQgPSByZS51aW50OEFycmF5VG9CdWZmZXIgPSByZS5jaGVja1VpbnQ4QXJyYXkgPSB2b2lkIDAsIHJlLmNvbnN0YW50ID0gcmUudXRmOCA9IHJlLmNzdHIgPSByZS5ibG9iID0gcmUudW5pb25MYXlvdXREaXNjcmltaW5hdG9yID0gcmUudW5pb24gPSByZS5zZXEgPSByZS5iaXRzID0gcmUuc3RydWN0ID0gcmUuZjY0YmUgPSByZS5mNjQgPSByZS5mMzJiZSA9IHJlLmYzMiA9IHJlLm5zNjRiZSA9IHJlLnM0OGJlID0gcmUuczQwYmUgPSByZS5zMzJiZSA9IHJlLnMyNGJlID0gcmUuczE2YmUgPSByZS5uczY0ID0gcmUuczQ4ID0gcmUuczQwID0gcmUuczMyID0gcmUuczI0ID0gdm9pZCAwO1xuICBjb25zdCBzID0gS2MoKTtcbiAgZnVuY3Rpb24gZShtKSB7XG4gICAgaWYgKCEobSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImIgbXVzdCBiZSBhIFVpbnQ4QXJyYXlcIik7XG4gIH1cbiAgcmUuY2hlY2tVaW50OEFycmF5ID0gZTtcbiAgZnVuY3Rpb24gdChtKSB7XG4gICAgcmV0dXJuIGUobSksIHMuQnVmZmVyLmZyb20obS5idWZmZXIsIG0uYnl0ZU9mZnNldCwgbS5sZW5ndGgpO1xuICB9XG4gIHJlLnVpbnQ4QXJyYXlUb0J1ZmZlciA9IHQ7XG4gIGxldCByID0gY2xhc3Mge1xuICAgIGNvbnN0cnVjdG9yKHYsIFApIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2KSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInNwYW4gbXVzdCBiZSBhbiBpbnRlZ2VyXCIpO1xuICAgICAgdGhpcy5zcGFuID0gdiwgdGhpcy5wcm9wZXJ0eSA9IFA7XG4gICAgfVxuICAgIC8qKiBGdW5jdGlvbiB0byBjcmVhdGUgYW4gT2JqZWN0IGludG8gd2hpY2ggZGVjb2RlZCBwcm9wZXJ0aWVzIHdpbGxcbiAgICAgKiBiZSB3cml0dGVuLlxuICAgICAqXG4gICAgICogVXNlZCBvbmx5IGZvciBsYXlvdXRzIHRoYXQge0BsaW5rIExheW91dCNkZWNvZGV8ZGVjb2RlfSB0byBPYmplY3RcbiAgICAgKiBpbnN0YW5jZXMsIHdoaWNoIG1lYW5zOlxuICAgICAqICoge0BsaW5rIFN0cnVjdHVyZX1cbiAgICAgKiAqIHtAbGluayBVbmlvbn1cbiAgICAgKiAqIHtAbGluayBWYXJpYW50TGF5b3V0fVxuICAgICAqICoge0BsaW5rIEJpdFN0cnVjdHVyZX1cbiAgICAgKlxuICAgICAqIElmIGxlZnQgdW5kZWZpbmVkIHRoZSBKYXZhU2NyaXB0IHJlcHJlc2VudGF0aW9uIG9mIHRoZXNlIGxheW91dHNcbiAgICAgKiB3aWxsIGJlIE9iamVjdCBpbnN0YW5jZXMuXG4gICAgICpcbiAgICAgKiBTZWUge0BsaW5rIGJpbmRDb25zdHJ1Y3RvckxheW91dH0uXG4gICAgICovXG4gICAgbWFrZURlc3RpbmF0aW9uT2JqZWN0KCkge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHNwYW4gb2YgYSBzcGVjaWZpYyBpbnN0YW5jZSBvZiBhIGxheW91dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gYiAtIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyBhbiBlbmNvZGVkIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvZmZzZXRdIC0gdGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZW5jb2RlZCBpbnN0YW5jZVxuICAgICAqIHN0YXJ0cy4gIElmIGFic2VudCBhIHplcm8gb2Zmc2V0IGlzIGluZmVycmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TnVtYmVyfSAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgY292ZXJlZCBieSB0aGUgbGF5b3V0XG4gICAgICogaW5zdGFuY2UuICBJZiB0aGlzIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzIHRoZVxuICAgICAqIGRlZmluaXRpb24tdGltZSBjb25zdGFudCB7QGxpbmsgTGF5b3V0I3NwYW58c3Bhbn0gd2lsbCBiZVxuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHRocm93cyB7UmFuZ2VFcnJvcn0gLSBpZiB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBjYW5ub3QgYmVcbiAgICAgKiBkZXRlcm1pbmVkLlxuICAgICAqL1xuICAgIGdldFNwYW4odiwgUCkge1xuICAgICAgaWYgKDAgPiB0aGlzLnNwYW4pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiaW5kZXRlcm1pbmF0ZSBzcGFuXCIpO1xuICAgICAgcmV0dXJuIHRoaXMuc3BhbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVwbGljYXRlIHRoZSBsYXlvdXQgdXNpbmcgYSBuZXcgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBnZXQgYSBzdHJ1Y3R1cmFsbHktZXF1aXZhbGVudCBsYXlvdXRcbiAgICAgKiB3aXRoIGEgZGlmZmVyZW50IG5hbWUgc2luY2UgYWxsIHtAbGluayBMYXlvdXR9IGluc3RhbmNlcyBhcmVcbiAgICAgKiBpbW11dGFibGUuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGlzIGlzIGEgc2hhbGxvdyBjb3B5LiAgQWxsIGZpZWxkcyBleGNlcHQge0BsaW5rXG4gICAgICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fSBhcmUgc3RyaWN0bHkgZXF1YWwgdG8gdGhlIG9yaWdpbiBsYXlvdXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgLSB0aGUgdmFsdWUgZm9yIHtAbGlua1xuICAgICAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0gaW4gdGhlIHJlcGxpY2EuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TGF5b3V0fSAtIHRoZSBjb3B5IHdpdGgge0BsaW5rIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX1cbiAgICAgKiBzZXQgdG8gYHByb3BlcnR5YC5cbiAgICAgKi9cbiAgICByZXBsaWNhdGUodikge1xuICAgICAgY29uc3QgUCA9IE9iamVjdC5jcmVhdGUodGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oUCwgdGhpcyksIFAucHJvcGVydHkgPSB2LCBQO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gb2JqZWN0IGZyb20gbGF5b3V0IHByb3BlcnRpZXMgYW5kIGFuIGFycmF5IG9mIHZhbHVlcy5cbiAgICAgKlxuICAgICAqICoqTk9URSoqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBgdW5kZWZpbmVkYCBpZiBpbnZva2VkIG9uIGEgbGF5b3V0XG4gICAgICogdGhhdCBkb2VzIG5vdCByZXR1cm4gaXRzIHZhbHVlIGFzIGFuIE9iamVjdC4gIE9iamVjdHMgYXJlXG4gICAgICogcmV0dXJuZWQgZm9yIHRoaW5ncyB0aGF0IGFyZSBhIHtAbGluayBTdHJ1Y3R1cmV9LCB3aGljaCBpbmNsdWRlc1xuICAgICAqIHtAbGluayBWYXJpYW50TGF5b3V0fHZhcmlhbnQgbGF5b3V0c30gaWYgdGhleSBhcmUgc3RydWN0dXJlcywgYW5kXG4gICAgICogZXhjbHVkZXMge0BsaW5rIFVuaW9ufXMuICBJZiB5b3Ugd2FudCB0aGlzIGZlYXR1cmUgZm9yIGEgdW5pb25cbiAgICAgKiB5b3UgbXVzdCB1c2Uge0BsaW5rIFVuaW9uLmdldFZhcmlhbnR8Z2V0VmFyaWFudH0gdG8gc2VsZWN0IHRoZVxuICAgICAqIGRlc2lyZWQgbGF5b3V0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIC0gYW4gYXJyYXkgb2YgdmFsdWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGVcbiAgICAgKiBkZWZhdWx0IG9yZGVyIGZvciBwcm9wZXJ0aWVzLiAgQXMgd2l0aCB7QGxpbmsgTGF5b3V0I2RlY29kZXxkZWNvZGV9XG4gICAgICogbGF5b3V0IGVsZW1lbnRzIHRoYXQgaGF2ZSBubyBwcm9wZXJ0eSBuYW1lIGFyZSBza2lwcGVkIHdoZW5cbiAgICAgKiBpdGVyYXRpbmcgb3ZlciB0aGUgYXJyYXkgdmFsdWVzLiAgT25seSB0aGUgdG9wLWxldmVsIHByb3BlcnRpZXMgYXJlXG4gICAgICogYXNzaWduZWQ7IGFyZ3VtZW50cyBhcmUgbm90IGFzc2lnbmVkIHRvIHByb3BlcnRpZXMgb2YgY29udGFpbmVkXG4gICAgICogbGF5b3V0cy4gIEFueSB1bnVzZWQgdmFsdWVzIGFyZSBpZ25vcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7KE9iamVjdHx1bmRlZmluZWQpfVxuICAgICAqL1xuICAgIGZyb21BcnJheSh2KSB7XG4gICAgfVxuICB9O1xuICByZS5MYXlvdXQgPSByO1xuICBmdW5jdGlvbiBuKG0sIHYpIHtcbiAgICByZXR1cm4gdi5wcm9wZXJ0eSA/IG0gKyBcIltcIiArIHYucHJvcGVydHkgKyBcIl1cIiA6IG07XG4gIH1cbiAgcmUubmFtZVdpdGhQcm9wZXJ0eSA9IG47XG4gIGZ1bmN0aW9uIGkobSwgdikge1xuICAgIGlmICh0eXBlb2YgbSAhPSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2xhc3MgbXVzdCBiZSBjb25zdHJ1Y3RvclwiKTtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG0sIFwibGF5b3V0X1wiKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNsYXNzIGlzIGFscmVhZHkgYm91bmQgdG8gYSBsYXlvdXRcIik7XG4gICAgaWYgKCEodiAmJiB2IGluc3RhbmNlb2YgcikpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGF5b3V0IG11c3QgYmUgYSBMYXlvdXRcIik7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2LCBcImJvdW5kQ29uc3RydWN0b3JfXCIpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibGF5b3V0IGlzIGFscmVhZHkgYm91bmQgdG8gYSBjb25zdHJ1Y3RvclwiKTtcbiAgICBtLmxheW91dF8gPSB2LCB2LmJvdW5kQ29uc3RydWN0b3JfID0gbSwgdi5tYWtlRGVzdGluYXRpb25PYmplY3QgPSAoKCkgPT4gbmV3IG0oKSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtLnByb3RvdHlwZSwgXCJlbmNvZGVcIiwge1xuICAgICAgdmFsdWUoUCwgTikge1xuICAgICAgICByZXR1cm4gdi5lbmNvZGUodGhpcywgUCwgTik7XG4gICAgICB9LFxuICAgICAgd3JpdGFibGU6ICEwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtLCBcImRlY29kZVwiLCB7XG4gICAgICB2YWx1ZShQLCBOKSB7XG4gICAgICAgIHJldHVybiB2LmRlY29kZShQLCBOKTtcbiAgICAgIH0sXG4gICAgICB3cml0YWJsZTogITBcbiAgICB9KTtcbiAgfVxuICByZS5iaW5kQ29uc3RydWN0b3JMYXlvdXQgPSBpO1xuICBjbGFzcyBvIGV4dGVuZHMgciB7XG4gICAgLyoqXG4gICAgICogUmV0dXJuIGB0cnVlYCBpZmYgdGhlIGV4dGVybmFsIGxheW91dCBkZWNvZGVzIHRvIGFuIHVuc2lnbmVkXG4gICAgICogaW50ZWdlciBsYXlvdXQuXG4gICAgICpcbiAgICAgKiBJbiB0aGF0IGNhc2UgaXQgY2FuIGJlIHVzZWQgYXMgdGhlIHNvdXJjZSBvZiB7QGxpbmtcbiAgICAgKiBTZXF1ZW5jZSNjb3VudHxTZXF1ZW5jZSBjb3VudHN9LCB7QGxpbmsgQmxvYiNsZW5ndGh8QmxvYiBsZW5ndGhzfSxcbiAgICAgKiBvciBhcyB7QGxpbmsgVW5pb25MYXlvdXREaXNjcmltaW5hdG9yI2xheW91dHxleHRlcm5hbCB1bmlvblxuICAgICAqIGRpc2NyaW1pbmF0b3JzfS5cbiAgICAgKlxuICAgICAqIEBhYnN0cmFjdFxuICAgICAqL1xuICAgIGlzQ291bnQoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHRlcm5hbExheW91dCBpcyBhYnN0cmFjdFwiKTtcbiAgICB9XG4gIH1cbiAgcmUuRXh0ZXJuYWxMYXlvdXQgPSBvO1xuICBjbGFzcyBhIGV4dGVuZHMgbyB7XG4gICAgY29uc3RydWN0b3IodiA9IDEsIFApIHtcbiAgICAgIGlmICghTnVtYmVyLmlzSW50ZWdlcih2KSB8fCAwID49IHYpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJlbGVtZW50U3BhbiBtdXN0IGJlIGEgKHBvc2l0aXZlKSBpbnRlZ2VyXCIpO1xuICAgICAgc3VwZXIoLTEsIFApLCB0aGlzLmVsZW1lbnRTcGFuID0gdjtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGlzQ291bnQoKSB7XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGUodik7XG4gICAgICBjb25zdCBOID0gdi5sZW5ndGggLSBQO1xuICAgICAgcmV0dXJuIE1hdGguZmxvb3IoTiAvIHRoaXMuZWxlbWVudFNwYW4pO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHYsIFAsIE4pIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgfVxuICByZS5HcmVlZHlDb3VudCA9IGE7XG4gIGNsYXNzIGwgZXh0ZW5kcyBvIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQID0gMCwgTikge1xuICAgICAgaWYgKCEodiBpbnN0YW5jZW9mIHIpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibGF5b3V0IG11c3QgYmUgYSBMYXlvdXRcIik7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoUCkpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJvZmZzZXQgbXVzdCBiZSBpbnRlZ2VyIG9yIHVuZGVmaW5lZFwiKTtcbiAgICAgIHN1cGVyKHYuc3BhbiwgTiB8fCB2LnByb3BlcnR5KSwgdGhpcy5sYXlvdXQgPSB2LCB0aGlzLm9mZnNldCA9IFA7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBpc0NvdW50KCkge1xuICAgICAgcmV0dXJuIHRoaXMubGF5b3V0IGluc3RhbmNlb2YgYyB8fCB0aGlzLmxheW91dCBpbnN0YW5jZW9mIHU7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmxheW91dC5kZWNvZGUodiwgUCArIHRoaXMub2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMubGF5b3V0LmVuY29kZSh2LCBQLCBOICsgdGhpcy5vZmZzZXQpO1xuICAgIH1cbiAgfVxuICByZS5PZmZzZXRMYXlvdXQgPSBsO1xuICBjbGFzcyBjIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3IodiwgUCkge1xuICAgICAgaWYgKHN1cGVyKHYsIFApLCA2IDwgdGhpcy5zcGFuKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInNwYW4gbXVzdCBub3QgZXhjZWVkIDYgYnl0ZXNcIik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIHJldHVybiB0KHYpLnJlYWRVSW50TEUoUCwgdGhpcy5zcGFuKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgcmV0dXJuIHQoUCkud3JpdGVVSW50TEUodiwgTiwgdGhpcy5zcGFuKSwgdGhpcy5zcGFuO1xuICAgIH1cbiAgfVxuICByZS5VSW50ID0gYztcbiAgY2xhc3MgdSBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYsIFApIHtcbiAgICAgIGlmIChzdXBlcih2LCBQKSwgNiA8IHRoaXMuc3BhbilcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzcGFuIG11c3Qgbm90IGV4Y2VlZCA2IGJ5dGVzXCIpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKHYsIFAgPSAwKSB7XG4gICAgICByZXR1cm4gdCh2KS5yZWFkVUludEJFKFAsIHRoaXMuc3Bhbik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIHJldHVybiB0KFApLndyaXRlVUludEJFKHYsIE4sIHRoaXMuc3BhbiksIHRoaXMuc3BhbjtcbiAgICB9XG4gIH1cbiAgcmUuVUludEJFID0gdTtcbiAgY2xhc3MgZCBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYsIFApIHtcbiAgICAgIGlmIChzdXBlcih2LCBQKSwgNiA8IHRoaXMuc3BhbilcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJzcGFuIG11c3Qgbm90IGV4Y2VlZCA2IGJ5dGVzXCIpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKHYsIFAgPSAwKSB7XG4gICAgICByZXR1cm4gdCh2KS5yZWFkSW50TEUoUCwgdGhpcy5zcGFuKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgcmV0dXJuIHQoUCkud3JpdGVJbnRMRSh2LCBOLCB0aGlzLnNwYW4pLCB0aGlzLnNwYW47XG4gICAgfVxuICB9XG4gIHJlLkludCA9IGQ7XG4gIGNsYXNzIGggZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQKSB7XG4gICAgICBpZiAoc3VwZXIodiwgUCksIDYgPCB0aGlzLnNwYW4pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwic3BhbiBtdXN0IG5vdCBleGNlZWQgNiBieXRlc1wiKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZSh2LCBQID0gMCkge1xuICAgICAgcmV0dXJuIHQodikucmVhZEludEJFKFAsIHRoaXMuc3Bhbik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIHJldHVybiB0KFApLndyaXRlSW50QkUodiwgTiwgdGhpcy5zcGFuKSwgdGhpcy5zcGFuO1xuICAgIH1cbiAgfVxuICByZS5JbnRCRSA9IGg7XG4gIGNvbnN0IGYgPSBNYXRoLnBvdygyLCAzMik7XG4gIGZ1bmN0aW9uIHAobSkge1xuICAgIGNvbnN0IHYgPSBNYXRoLmZsb29yKG0gLyBmKSwgUCA9IG0gLSB2ICogZjtcbiAgICByZXR1cm4geyBoaTMyOiB2LCBsbzMyOiBQIH07XG4gIH1cbiAgZnVuY3Rpb24geShtLCB2KSB7XG4gICAgcmV0dXJuIG0gKiBmICsgdjtcbiAgfVxuICBjbGFzcyBFIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3Iodikge1xuICAgICAgc3VwZXIoOCwgdik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSB0KHYpLCBZID0gTi5yZWFkVUludDMyTEUoUCksIGVlID0gTi5yZWFkVUludDMyTEUoUCArIDQpO1xuICAgICAgcmV0dXJuIHkoZWUsIFkpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHYsIFAsIE4gPSAwKSB7XG4gICAgICBjb25zdCBZID0gcCh2KSwgZWUgPSB0KFApO1xuICAgICAgcmV0dXJuIGVlLndyaXRlVUludDMyTEUoWS5sbzMyLCBOKSwgZWUud3JpdGVVSW50MzJMRShZLmhpMzIsIE4gKyA0KSwgODtcbiAgICB9XG4gIH1cbiAgcmUuTmVhclVJbnQ2NCA9IEU7XG4gIGNsYXNzIGIgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgICBzdXBlcig4LCB2KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZSh2LCBQID0gMCkge1xuICAgICAgY29uc3QgTiA9IHQodiksIFkgPSBOLnJlYWRVSW50MzJCRShQKSwgZWUgPSBOLnJlYWRVSW50MzJCRShQICsgNCk7XG4gICAgICByZXR1cm4geShZLCBlZSk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIGNvbnN0IFkgPSBwKHYpLCBlZSA9IHQoUCk7XG4gICAgICByZXR1cm4gZWUud3JpdGVVSW50MzJCRShZLmhpMzIsIE4pLCBlZS53cml0ZVVJbnQzMkJFKFkubG8zMiwgTiArIDQpLCA4O1xuICAgIH1cbiAgfVxuICByZS5OZWFyVUludDY0QkUgPSBiO1xuICBjbGFzcyBSIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3Iodikge1xuICAgICAgc3VwZXIoOCwgdik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSB0KHYpLCBZID0gTi5yZWFkVUludDMyTEUoUCksIGVlID0gTi5yZWFkSW50MzJMRShQICsgNCk7XG4gICAgICByZXR1cm4geShlZSwgWSk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIGNvbnN0IFkgPSBwKHYpLCBlZSA9IHQoUCk7XG4gICAgICByZXR1cm4gZWUud3JpdGVVSW50MzJMRShZLmxvMzIsIE4pLCBlZS53cml0ZUludDMyTEUoWS5oaTMyLCBOICsgNCksIDg7XG4gICAgfVxuICB9XG4gIHJlLk5lYXJJbnQ2NCA9IFI7XG4gIGNsYXNzIEEgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgICBzdXBlcig4LCB2KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZSh2LCBQID0gMCkge1xuICAgICAgY29uc3QgTiA9IHQodiksIFkgPSBOLnJlYWRJbnQzMkJFKFApLCBlZSA9IE4ucmVhZFVJbnQzMkJFKFAgKyA0KTtcbiAgICAgIHJldHVybiB5KFksIGVlKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgY29uc3QgWSA9IHAodiksIGVlID0gdChQKTtcbiAgICAgIHJldHVybiBlZS53cml0ZUludDMyQkUoWS5oaTMyLCBOKSwgZWUud3JpdGVVSW50MzJCRShZLmxvMzIsIE4gKyA0KSwgODtcbiAgICB9XG4gIH1cbiAgcmUuTmVhckludDY0QkUgPSBBO1xuICBjbGFzcyBGIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3Iodikge1xuICAgICAgc3VwZXIoNCwgdik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIHJldHVybiB0KHYpLnJlYWRGbG9hdExFKFApO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHYsIFAsIE4gPSAwKSB7XG4gICAgICByZXR1cm4gdChQKS53cml0ZUZsb2F0TEUodiwgTiksIDQ7XG4gICAgfVxuICB9XG4gIHJlLkZsb2F0ID0gRjtcbiAgY2xhc3MgTSBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYpIHtcbiAgICAgIHN1cGVyKDQsIHYpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKHYsIFAgPSAwKSB7XG4gICAgICByZXR1cm4gdCh2KS5yZWFkRmxvYXRCRShQKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgcmV0dXJuIHQoUCkud3JpdGVGbG9hdEJFKHYsIE4pLCA0O1xuICAgIH1cbiAgfVxuICByZS5GbG9hdEJFID0gTTtcbiAgY2xhc3MgSCBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYpIHtcbiAgICAgIHN1cGVyKDgsIHYpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKHYsIFAgPSAwKSB7XG4gICAgICByZXR1cm4gdCh2KS5yZWFkRG91YmxlTEUoUCk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIHJldHVybiB0KFApLndyaXRlRG91YmxlTEUodiwgTiksIDg7XG4gICAgfVxuICB9XG4gIHJlLkRvdWJsZSA9IEg7XG4gIGNsYXNzIEsgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgICBzdXBlcig4LCB2KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZSh2LCBQID0gMCkge1xuICAgICAgcmV0dXJuIHQodikucmVhZERvdWJsZUJFKFApO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHYsIFAsIE4gPSAwKSB7XG4gICAgICByZXR1cm4gdChQKS53cml0ZURvdWJsZUJFKHYsIE4pLCA4O1xuICAgIH1cbiAgfVxuICByZS5Eb3VibGVCRSA9IEs7XG4gIGNsYXNzIGogZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQLCBOKSB7XG4gICAgICBpZiAoISh2IGluc3RhbmNlb2YgcikpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJlbGVtZW50TGF5b3V0IG11c3QgYmUgYSBMYXlvdXRcIik7XG4gICAgICBpZiAoIShQIGluc3RhbmNlb2YgbyAmJiBQLmlzQ291bnQoKSB8fCBOdW1iZXIuaXNJbnRlZ2VyKFApICYmIDAgPD0gUCkpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjb3VudCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIG9yIGFuIHVuc2lnbmVkIGludGVnZXIgRXh0ZXJuYWxMYXlvdXRcIik7XG4gICAgICBsZXQgWSA9IC0xO1xuICAgICAgIShQIGluc3RhbmNlb2YgbykgJiYgMCA8IHYuc3BhbiAmJiAoWSA9IFAgKiB2LnNwYW4pLCBzdXBlcihZLCBOKSwgdGhpcy5lbGVtZW50TGF5b3V0ID0gdiwgdGhpcy5jb3VudCA9IFA7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBnZXRTcGFuKHYsIFAgPSAwKSB7XG4gICAgICBpZiAoMCA8PSB0aGlzLnNwYW4pXG4gICAgICAgIHJldHVybiB0aGlzLnNwYW47XG4gICAgICBsZXQgTiA9IDAsIFkgPSB0aGlzLmNvdW50O1xuICAgICAgaWYgKFkgaW5zdGFuY2VvZiBvICYmIChZID0gWS5kZWNvZGUodiwgUCkpLCAwIDwgdGhpcy5lbGVtZW50TGF5b3V0LnNwYW4pXG4gICAgICAgIE4gPSBZICogdGhpcy5lbGVtZW50TGF5b3V0LnNwYW47XG4gICAgICBlbHNlIHtcbiAgICAgICAgbGV0IGVlID0gMDtcbiAgICAgICAgZm9yICg7IGVlIDwgWTsgKVxuICAgICAgICAgIE4gKz0gdGhpcy5lbGVtZW50TGF5b3V0LmdldFNwYW4odiwgUCArIE4pLCArK2VlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE47XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSBbXTtcbiAgICAgIGxldCBZID0gMCwgZWUgPSB0aGlzLmNvdW50O1xuICAgICAgZm9yIChlZSBpbnN0YW5jZW9mIG8gJiYgKGVlID0gZWUuZGVjb2RlKHYsIFApKTsgWSA8IGVlOyApXG4gICAgICAgIE4ucHVzaCh0aGlzLmVsZW1lbnRMYXlvdXQuZGVjb2RlKHYsIFApKSwgUCArPSB0aGlzLmVsZW1lbnRMYXlvdXQuZ2V0U3Bhbih2LCBQKSwgWSArPSAxO1xuICAgICAgcmV0dXJuIE47XG4gICAgfVxuICAgIC8qKiBJbXBsZW1lbnQge0BsaW5rIExheW91dCNlbmNvZGV8ZW5jb2RlfSBmb3Ige0BsaW5rIFNlcXVlbmNlfS5cbiAgICAgKlxuICAgICAqICoqTk9URSoqIElmIGBzcmNgIGlzIHNob3J0ZXIgdGhhbiB7QGxpbmsgU2VxdWVuY2UjY291bnR8Y291bnR9IHRoZW5cbiAgICAgKiB0aGUgdW51c2VkIHNwYWNlIGluIHRoZSBidWZmZXIgaXMgbGVmdCB1bmNoYW5nZWQuICBJZiBgc3JjYCBpc1xuICAgICAqIGxvbmdlciB0aGFuIHtAbGluayBTZXF1ZW5jZSNjb3VudHxjb3VudH0gdGhlIHVubmVlZGVkIGVsZW1lbnRzIGFyZVxuICAgICAqIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBJZiB7QGxpbmsgTGF5b3V0I2NvdW50fGNvdW50fSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmtcbiAgICAgKiBFeHRlcm5hbExheW91dH0gdGhlbiB0aGUgbGVuZ3RoIG9mIGBzcmNgIHdpbGwgYmUgZW5jb2RlZCBhcyB0aGVcbiAgICAgKiBjb3VudCBhZnRlciBgc3JjYCBpcyBlbmNvZGVkLiAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgY29uc3QgWSA9IHRoaXMuZWxlbWVudExheW91dCwgZWUgPSB2LnJlZHVjZSgoaWUsIGxlKSA9PiBpZSArIFkuZW5jb2RlKGxlLCBQLCBOICsgaWUpLCAwKTtcbiAgICAgIHJldHVybiB0aGlzLmNvdW50IGluc3RhbmNlb2YgbyAmJiB0aGlzLmNvdW50LmVuY29kZSh2Lmxlbmd0aCwgUCwgTiksIGVlO1xuICAgIH1cbiAgfVxuICByZS5TZXF1ZW5jZSA9IGo7XG4gIGNsYXNzIEMgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQLCBOKSB7XG4gICAgICBpZiAoIShBcnJheS5pc0FycmF5KHYpICYmIHYucmVkdWNlKChlZSwgaWUpID0+IGVlICYmIGllIGluc3RhbmNlb2YgciwgITApKSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImZpZWxkcyBtdXN0IGJlIGFycmF5IG9mIExheW91dCBpbnN0YW5jZXNcIik7XG4gICAgICB0eXBlb2YgUCA9PSBcImJvb2xlYW5cIiAmJiBOID09PSB2b2lkIDAgJiYgKE4gPSBQLCBQID0gdm9pZCAwKTtcbiAgICAgIGZvciAoY29uc3QgZWUgb2YgdilcbiAgICAgICAgaWYgKDAgPiBlZS5zcGFuICYmIGVlLnByb3BlcnR5ID09PSB2b2lkIDApXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZmllbGRzIGNhbm5vdCBjb250YWluIHVubmFtZWQgdmFyaWFibGUtbGVuZ3RoIGxheW91dFwiKTtcbiAgICAgIGxldCBZID0gLTE7XG4gICAgICB0cnkge1xuICAgICAgICBZID0gdi5yZWR1Y2UoKGVlLCBpZSkgPT4gZWUgKyBpZS5nZXRTcGFuKCksIDApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICB9XG4gICAgICBzdXBlcihZLCBQKSwgdGhpcy5maWVsZHMgPSB2LCB0aGlzLmRlY29kZVByZWZpeGVzID0gISFOO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZ2V0U3Bhbih2LCBQID0gMCkge1xuICAgICAgaWYgKDAgPD0gdGhpcy5zcGFuKVxuICAgICAgICByZXR1cm4gdGhpcy5zcGFuO1xuICAgICAgbGV0IE4gPSAwO1xuICAgICAgdHJ5IHtcbiAgICAgICAgTiA9IHRoaXMuZmllbGRzLnJlZHVjZSgoWSwgZWUpID0+IHtcbiAgICAgICAgICBjb25zdCBpZSA9IGVlLmdldFNwYW4odiwgUCk7XG4gICAgICAgICAgcmV0dXJuIFAgKz0gaWUsIFkgKyBpZTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJpbmRldGVybWluYXRlIHNwYW5cIik7XG4gICAgICB9XG4gICAgICByZXR1cm4gTjtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZSh2LCBQID0gMCkge1xuICAgICAgZSh2KTtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLm1ha2VEZXN0aW5hdGlvbk9iamVjdCgpO1xuICAgICAgZm9yIChjb25zdCBZIG9mIHRoaXMuZmllbGRzKVxuICAgICAgICBpZiAoWS5wcm9wZXJ0eSAhPT0gdm9pZCAwICYmIChOW1kucHJvcGVydHldID0gWS5kZWNvZGUodiwgUCkpLCBQICs9IFkuZ2V0U3Bhbih2LCBQKSwgdGhpcy5kZWNvZGVQcmVmaXhlcyAmJiB2Lmxlbmd0aCA9PT0gUClcbiAgICAgICAgICBicmVhaztcbiAgICAgIHJldHVybiBOO1xuICAgIH1cbiAgICAvKiogSW1wbGVtZW50IHtAbGluayBMYXlvdXQjZW5jb2RlfGVuY29kZX0gZm9yIHtAbGluayBTdHJ1Y3R1cmV9LlxuICAgICAqXG4gICAgICogSWYgYHNyY2AgaXMgbWlzc2luZyBhIHByb3BlcnR5IGZvciBhIG1lbWJlciB3aXRoIGEgZGVmaW5lZCB7QGxpbmtcbiAgICAgKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9IHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lvbiBvZiB0aGUgYnVmZmVyIGlzXG4gICAgICogbGVmdCB1bm1vZGlmaWVkLiAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgY29uc3QgWSA9IE47XG4gICAgICBsZXQgZWUgPSAwLCBpZSA9IDA7XG4gICAgICBmb3IgKGNvbnN0IGxlIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgIGxldCBUZSA9IGxlLnNwYW47XG4gICAgICAgIGlmIChpZSA9IDAgPCBUZSA/IFRlIDogMCwgbGUucHJvcGVydHkgIT09IHZvaWQgMCkge1xuICAgICAgICAgIGNvbnN0IERlID0gdltsZS5wcm9wZXJ0eV07XG4gICAgICAgICAgRGUgIT09IHZvaWQgMCAmJiAoaWUgPSBsZS5lbmNvZGUoRGUsIFAsIE4pLCAwID4gVGUgJiYgKFRlID0gbGUuZ2V0U3BhbihQLCBOKSkpO1xuICAgICAgICB9XG4gICAgICAgIGVlID0gTiwgTiArPSBUZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlZSArIGllIC0gWTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGZyb21BcnJheSh2KSB7XG4gICAgICBjb25zdCBQID0gdGhpcy5tYWtlRGVzdGluYXRpb25PYmplY3QoKTtcbiAgICAgIGZvciAoY29uc3QgTiBvZiB0aGlzLmZpZWxkcylcbiAgICAgICAgTi5wcm9wZXJ0eSAhPT0gdm9pZCAwICYmIDAgPCB2Lmxlbmd0aCAmJiAoUFtOLnByb3BlcnR5XSA9IHYuc2hpZnQoKSk7XG4gICAgICByZXR1cm4gUDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFjY2VzcyB0byB0aGUgbGF5b3V0IG9mIGEgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgLSB0aGUgc3RydWN0dXJlIG1lbWJlciBvZiBpbnRlcmVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xheW91dH0gLSB0aGUgbGF5b3V0IGFzc29jaWF0ZWQgd2l0aCBgcHJvcGVydHlgLCBvclxuICAgICAqIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyBzdWNoIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGxheW91dEZvcih2KSB7XG4gICAgICBpZiAodHlwZW9mIHYgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInByb3BlcnR5IG11c3QgYmUgc3RyaW5nXCIpO1xuICAgICAgZm9yIChjb25zdCBQIG9mIHRoaXMuZmllbGRzKVxuICAgICAgICBpZiAoUC5wcm9wZXJ0eSA9PT0gdilcbiAgICAgICAgICByZXR1cm4gUDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvZmZzZXQgb2YgYSBzdHJ1Y3R1cmUgbWVtYmVyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IC0gdGhlIHN0cnVjdHVyZSBtZW1iZXIgb2YgaW50ZXJlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtOdW1iZXJ9IC0gdGhlIG9mZnNldCBpbiBieXRlcyB0byB0aGUgc3RhcnQgb2YgYHByb3BlcnR5YFxuICAgICAqIHdpdGhpbiB0aGUgc3RydWN0dXJlLCBvciB1bmRlZmluZWQgaWYgYHByb3BlcnR5YCBpcyBub3QgYSBmaWVsZFxuICAgICAqIHdpdGhpbiB0aGUgc3RydWN0dXJlLiAgSWYgdGhlIHByb3BlcnR5IGlzIGEgbWVtYmVyIGJ1dCBmb2xsb3dzIGFcbiAgICAgKiB2YXJpYWJsZS1sZW5ndGggc3RydWN0dXJlIG1lbWJlciBhIG5lZ2F0aXZlIG51bWJlciB3aWxsIGJlXG4gICAgICogcmV0dXJuZWQuXG4gICAgICovXG4gICAgb2Zmc2V0T2Yodikge1xuICAgICAgaWYgKHR5cGVvZiB2ICE9IFwic3RyaW5nXCIpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJwcm9wZXJ0eSBtdXN0IGJlIHN0cmluZ1wiKTtcbiAgICAgIGxldCBQID0gMDtcbiAgICAgIGZvciAoY29uc3QgTiBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgICBpZiAoTi5wcm9wZXJ0eSA9PT0gdilcbiAgICAgICAgICByZXR1cm4gUDtcbiAgICAgICAgMCA+IE4uc3BhbiA/IFAgPSAtMSA6IDAgPD0gUCAmJiAoUCArPSBOLnNwYW4pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZS5TdHJ1Y3R1cmUgPSBDO1xuICBjbGFzcyBrIHtcbiAgICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgICB0aGlzLnByb3BlcnR5ID0gdjtcbiAgICB9XG4gICAgLyoqIEFuYWxvZyB0byB7QGxpbmsgTGF5b3V0I2RlY29kZXxMYXlvdXQgZGVjb2RlfSBmb3IgdW5pb24gZGlzY3JpbWluYXRvcnMuXG4gICAgICpcbiAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgbmVlZCBub3QgcmVmZXJlbmNlIHRoZSBidWZmZXIgaWZcbiAgICAgKiB2YXJpYW50IGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSB0aHJvdWdoIG90aGVyIG1lYW5zLiAqL1xuICAgIGRlY29kZSh2LCBQKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmlvbkRpc2NyaW1pbmF0b3IgaXMgYWJzdHJhY3RcIik7XG4gICAgfVxuICAgIC8qKiBBbmFsb2cgdG8ge0BsaW5rIExheW91dCNkZWNvZGV8TGF5b3V0IGVuY29kZX0gZm9yIHVuaW9uIGRpc2NyaW1pbmF0b3JzLlxuICAgICAqXG4gICAgICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIG5lZWQgbm90IHN0b3JlIHRoZSB2YWx1ZSBpZlxuICAgICAqIHZhcmlhbnQgaW5mb3JtYXRpb24gaXMgbWFpbnRhaW5lZCB0aHJvdWdoIG90aGVyIG1lYW5zLiAqL1xuICAgIGVuY29kZSh2LCBQLCBOKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmlvbkRpc2NyaW1pbmF0b3IgaXMgYWJzdHJhY3RcIik7XG4gICAgfVxuICB9XG4gIHJlLlVuaW9uRGlzY3JpbWluYXRvciA9IGs7XG4gIGNsYXNzICQgZXh0ZW5kcyBrIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQKSB7XG4gICAgICBpZiAoISh2IGluc3RhbmNlb2YgbyAmJiB2LmlzQ291bnQoKSkpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJsYXlvdXQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyIEV4dGVybmFsTGF5b3V0XCIpO1xuICAgICAgc3VwZXIoUCB8fCB2LnByb3BlcnR5IHx8IFwidmFyaWFudFwiKSwgdGhpcy5sYXlvdXQgPSB2O1xuICAgIH1cbiAgICAvKiogRGVsZWdhdGUgZGVjb2RpbmcgdG8ge0BsaW5rIFVuaW9uTGF5b3V0RGlzY3JpbWluYXRvciNsYXlvdXR8bGF5b3V0fS4gKi9cbiAgICBkZWNvZGUodiwgUCkge1xuICAgICAgcmV0dXJuIHRoaXMubGF5b3V0LmRlY29kZSh2LCBQKTtcbiAgICB9XG4gICAgLyoqIERlbGVnYXRlIGVuY29kaW5nIHRvIHtAbGluayBVbmlvbkxheW91dERpc2NyaW1pbmF0b3IjbGF5b3V0fGxheW91dH0uICovXG4gICAgZW5jb2RlKHYsIFAsIE4pIHtcbiAgICAgIHJldHVybiB0aGlzLmxheW91dC5lbmNvZGUodiwgUCwgTik7XG4gICAgfVxuICB9XG4gIHJlLlVuaW9uTGF5b3V0RGlzY3JpbWluYXRvciA9ICQ7XG4gIGNsYXNzIFcgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQLCBOKSB7XG4gICAgICBsZXQgWTtcbiAgICAgIGlmICh2IGluc3RhbmNlb2YgYyB8fCB2IGluc3RhbmNlb2YgdSlcbiAgICAgICAgWSA9IG5ldyAkKG5ldyBsKHYpKTtcbiAgICAgIGVsc2UgaWYgKHYgaW5zdGFuY2VvZiBvICYmIHYuaXNDb3VudCgpKVxuICAgICAgICBZID0gbmV3ICQodik7XG4gICAgICBlbHNlIGlmICh2IGluc3RhbmNlb2YgaylcbiAgICAgICAgWSA9IHY7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJkaXNjciBtdXN0IGJlIGEgVW5pb25EaXNjcmltaW5hdG9yIG9yIGFuIHVuc2lnbmVkIGludGVnZXIgbGF5b3V0XCIpO1xuICAgICAgaWYgKFAgPT09IHZvaWQgMCAmJiAoUCA9IG51bGwpLCAhKFAgPT09IG51bGwgfHwgUCBpbnN0YW5jZW9mIHIpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiZGVmYXVsdExheW91dCBtdXN0IGJlIG51bGwgb3IgYSBMYXlvdXRcIik7XG4gICAgICBpZiAoUCAhPT0gbnVsbCkge1xuICAgICAgICBpZiAoMCA+IFAuc3BhbilcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJkZWZhdWx0TGF5b3V0IG11c3QgaGF2ZSBjb25zdGFudCBzcGFuXCIpO1xuICAgICAgICBQLnByb3BlcnR5ID09PSB2b2lkIDAgJiYgKFAgPSBQLnJlcGxpY2F0ZShcImNvbnRlbnRcIikpO1xuICAgICAgfVxuICAgICAgbGV0IGVlID0gLTE7XG4gICAgICBQICYmIChlZSA9IFAuc3BhbiwgMCA8PSBlZSAmJiAodiBpbnN0YW5jZW9mIGMgfHwgdiBpbnN0YW5jZW9mIHUpICYmIChlZSArPSBZLmxheW91dC5zcGFuKSksIHN1cGVyKGVlLCBOKSwgdGhpcy5kaXNjcmltaW5hdG9yID0gWSwgdGhpcy51c2VzUHJlZml4RGlzY3JpbWluYXRvciA9IHYgaW5zdGFuY2VvZiBjIHx8IHYgaW5zdGFuY2VvZiB1LCB0aGlzLmRlZmF1bHRMYXlvdXQgPSBQLCB0aGlzLnJlZ2lzdHJ5ID0ge307XG4gICAgICBsZXQgaWUgPSB0aGlzLmRlZmF1bHRHZXRTb3VyY2VWYXJpYW50LmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmdldFNvdXJjZVZhcmlhbnQgPSBmdW5jdGlvbihsZSkge1xuICAgICAgICByZXR1cm4gaWUobGUpO1xuICAgICAgfSwgdGhpcy5jb25maWdHZXRTb3VyY2VWYXJpYW50ID0gZnVuY3Rpb24obGUpIHtcbiAgICAgICAgaWUgPSBsZS5iaW5kKHRoaXMpO1xuICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGdldFNwYW4odiwgUCA9IDApIHtcbiAgICAgIGlmICgwIDw9IHRoaXMuc3BhbilcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BhbjtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLmdldFZhcmlhbnQodiwgUCk7XG4gICAgICBpZiAoIU4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInVuYWJsZSB0byBkZXRlcm1pbmUgc3BhbiBmb3IgdW5yZWNvZ25pemVkIHZhcmlhbnRcIik7XG4gICAgICByZXR1cm4gTi5nZXRTcGFuKHYsIFApO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdG8gaW5mZXIgYSByZWdpc3RlcmVkIFVuaW9uIHZhcmlhbnQgY29tcGF0aWJsZSB3aXRoIGBzcmNgLlxuICAgICAqXG4gICAgICogVGhlIGZpcnN0IHNhdGlzZmllZCBydWxlIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgZGVmaW5lcyB0aGVcbiAgICAgKiByZXR1cm4gdmFsdWU6XG4gICAgICogKiBJZiBgc3JjYCBoYXMgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgVW5pb24gZGlzY3JpbWluYXRvciBhbmRcbiAgICAgKiAgIHRoZSBkZWZhdWx0IGxheW91dCwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAgKiAgIHZhbHVlIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5ICh0aGlzIGVuc3VyZXMgdGhlIGRlZmF1bHRcbiAgICAgKiAgIGxheW91dCB3aWxsIGJlIHVzZWQpO1xuICAgICAqICogSWYgYHNyY2AgaGFzIGEgcHJvcGVydHkgbWF0Y2hpbmcgdGhlIFVuaW9uIGRpc2NyaW1pbmF0b3IsIHRoZVxuICAgICAqICAgdmFsdWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgaWRlbnRpZmllcyBhIHJlZ2lzdGVyZWQgdmFyaWFudCwgYW5kXG4gICAgICogICBlaXRoZXIgKGEpIHRoZSB2YXJpYW50IGhhcyBubyBsYXlvdXQsIG9yIChiKSBgc3JjYCBoYXMgdGhlXG4gICAgICogICB2YXJpYW50J3MgcHJvcGVydHksIHRoZW4gdGhlIHZhcmlhbnQgaXMgcmV0dXJuZWQgKGJlY2F1c2UgdGhlXG4gICAgICogICBzb3VyY2Ugc2F0aXNmaWVzIHRoZSBjb25zdHJhaW50cyBvZiB0aGUgdmFyaWFudCBpdCBpZGVudGlmaWVzKTtcbiAgICAgKiAqIElmIGBzcmNgIGRvZXMgbm90IGhhdmUgYSBwcm9wZXJ0eSBtYXRjaGluZyB0aGUgVW5pb25cbiAgICAgKiAgIGRpc2NyaW1pbmF0b3IsIGJ1dCBkb2VzIGhhdmUgYSBwcm9wZXJ0eSBtYXRjaGluZyBhIHJlZ2lzdGVyZWRcbiAgICAgKiAgIHZhcmlhbnQsIHRoZW4gdGhlIHZhcmlhbnQgaXMgcmV0dXJuZWQgKGJlY2F1c2UgdGhlIHNvdXJjZVxuICAgICAqICAgbWF0Y2hlcyBhIHZhcmlhbnQgd2l0aG91dCBhbiBleHBsaWNpdCBjb25mbGljdCk7XG4gICAgICogKiBBbiBlcnJvciBpcyB0aHJvd24gKGJlY2F1c2Ugd2UgZWl0aGVyIGNhbid0IGlkZW50aWZ5IGEgdmFyaWFudCxcbiAgICAgKiAgIG9yIHdlIHdlcmUgZXhwbGljaXRseSB0b2xkIHRoZSB2YXJpYW50IGJ1dCBjYW4ndCBzYXRpc2Z5IGl0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzcmMgLSBhbiBvYmplY3QgcHJlc3VtZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoXG4gICAgICogdGhlIGNvbnRlbnQgb2YgdGhlIFVuaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7KHVuZGVmaW5lZHxWYXJpYW50TGF5b3V0KX0gLSBhcyBkZXNjcmliZWQgYWJvdmUuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBpZiBgc3JjYCBjYW5ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgZGVmYXVsdCBvclxuICAgICAqIHJlZ2lzdGVyZWQgdmFyaWFudC5cbiAgICAgKi9cbiAgICBkZWZhdWx0R2V0U291cmNlVmFyaWFudCh2KSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIHRoaXMuZGlzY3JpbWluYXRvci5wcm9wZXJ0eSkpIHtcbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdExheW91dCAmJiB0aGlzLmRlZmF1bHRMYXlvdXQucHJvcGVydHkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIHRoaXMuZGVmYXVsdExheW91dC5wcm9wZXJ0eSkpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBQID0gdGhpcy5yZWdpc3RyeVt2W3RoaXMuZGlzY3JpbWluYXRvci5wcm9wZXJ0eV1dO1xuICAgICAgICBpZiAoUCAmJiAoIVAubGF5b3V0IHx8IFAucHJvcGVydHkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIFAucHJvcGVydHkpKSlcbiAgICAgICAgICByZXR1cm4gUDtcbiAgICAgIH0gZWxzZVxuICAgICAgICBmb3IgKGNvbnN0IFAgaW4gdGhpcy5yZWdpc3RyeSkge1xuICAgICAgICAgIGNvbnN0IE4gPSB0aGlzLnJlZ2lzdHJ5W1BdO1xuICAgICAgICAgIGlmIChOLnByb3BlcnR5ICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2LCBOLnByb3BlcnR5KSlcbiAgICAgICAgICAgIHJldHVybiBOO1xuICAgICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gaW5mZXIgc3JjIHZhcmlhbnRcIik7XG4gICAgfVxuICAgIC8qKiBJbXBsZW1lbnQge0BsaW5rIExheW91dCNkZWNvZGV8ZGVjb2RlfSBmb3Ige0BsaW5rIFVuaW9ufS5cbiAgICAgKlxuICAgICAqIElmIHRoZSB2YXJpYW50IGlzIHtAbGluayBVbmlvbiNhZGRWYXJpYW50fHJlZ2lzdGVyZWR9IHRoZSByZXR1cm5cbiAgICAgKiB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiB0aGF0IHZhcmlhbnQsIHdpdGggbm8gZXhwbGljaXRcbiAgICAgKiBkaXNjcmltaW5hdG9yLiAgT3RoZXJ3aXNlIHRoZSB7QGxpbmsgVW5pb24jZGVmYXVsdExheW91dHxkZWZhdWx0XG4gICAgICogbGF5b3V0fSBpcyB1c2VkIHRvIGRlY29kZSB0aGUgY29udGVudC4gKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGxldCBOO1xuICAgICAgY29uc3QgWSA9IHRoaXMuZGlzY3JpbWluYXRvciwgZWUgPSBZLmRlY29kZSh2LCBQKSwgaWUgPSB0aGlzLnJlZ2lzdHJ5W2VlXTtcbiAgICAgIGlmIChpZSA9PT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnN0IGxlID0gdGhpcy5kZWZhdWx0TGF5b3V0O1xuICAgICAgICBsZXQgVGUgPSAwO1xuICAgICAgICB0aGlzLnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yICYmIChUZSA9IFkubGF5b3V0LnNwYW4pLCBOID0gdGhpcy5tYWtlRGVzdGluYXRpb25PYmplY3QoKSwgTltZLnByb3BlcnR5XSA9IGVlLCBOW2xlLnByb3BlcnR5XSA9IGxlLmRlY29kZSh2LCBQICsgVGUpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIE4gPSBpZS5kZWNvZGUodiwgUCk7XG4gICAgICByZXR1cm4gTjtcbiAgICB9XG4gICAgLyoqIEltcGxlbWVudCB7QGxpbmsgTGF5b3V0I2VuY29kZXxlbmNvZGV9IGZvciB7QGxpbmsgVW5pb259LlxuICAgICAqXG4gICAgICogVGhpcyBBUEkgYXNzdW1lcyB0aGUgYHNyY2Agb2JqZWN0IGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgdW5pb24nc1xuICAgICAqIHtAbGluayBVbmlvbiNkZWZhdWx0TGF5b3V0fGRlZmF1bHQgbGF5b3V0fS4gIFRvIGVuY29kZSB2YXJpYW50c1xuICAgICAqIHVzZSB0aGUgYXBwcm9wcmlhdGUgdmFyaWFudC1zcGVjaWZpYyB7QGxpbmsgVmFyaWFudExheW91dCNlbmNvZGV9XG4gICAgICogbWV0aG9kLiAqL1xuICAgIGVuY29kZSh2LCBQLCBOID0gMCkge1xuICAgICAgY29uc3QgWSA9IHRoaXMuZ2V0U291cmNlVmFyaWFudCh2KTtcbiAgICAgIGlmIChZID09PSB2b2lkIDApIHtcbiAgICAgICAgY29uc3QgZWUgPSB0aGlzLmRpc2NyaW1pbmF0b3IsIGllID0gdGhpcy5kZWZhdWx0TGF5b3V0O1xuICAgICAgICBsZXQgbGUgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy51c2VzUHJlZml4RGlzY3JpbWluYXRvciAmJiAobGUgPSBlZS5sYXlvdXQuc3BhbiksIGVlLmVuY29kZSh2W2VlLnByb3BlcnR5XSwgUCwgTiksIGxlICsgaWUuZW5jb2RlKHZbaWUucHJvcGVydHldLCBQLCBOICsgbGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFkuZW5jb2RlKHYsIFAsIE4pO1xuICAgIH1cbiAgICAvKiogUmVnaXN0ZXIgYSBuZXcgdmFyaWFudCBzdHJ1Y3R1cmUgd2l0aGluIGEgdW5pb24uICBUaGUgbmV3bHlcbiAgICAgKiBjcmVhdGVkIHZhcmlhbnQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gdmFyaWFudCAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAgICAgKiBWYXJpYW50TGF5b3V0I3ZhcmlhbnR8dmFyaWFudH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0xheW91dH0gbGF5b3V0IC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICAgICAqIFZhcmlhbnRMYXlvdXQjbGF5b3V0fGxheW91dH0uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gICAgICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge1ZhcmlhbnRMYXlvdXR9ICovXG4gICAgYWRkVmFyaWFudCh2LCBQLCBOKSB7XG4gICAgICBjb25zdCBZID0gbmV3IF8odGhpcywgdiwgUCwgTik7XG4gICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeVt2XSA9IFksIFk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGF5b3V0IGFzc29jaWF0ZWQgd2l0aCBhIHJlZ2lzdGVyZWQgdmFyaWFudC5cbiAgICAgKlxuICAgICAqIElmIGB2YmAgZG9lcyBub3QgcHJvZHVjZSBhIHJlZ2lzdGVyZWQgdmFyaWFudCB0aGUgZnVuY3Rpb24gcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsoTnVtYmVyfFVpbnQ4QXJyYXkpfSB2YiAtIGVpdGhlciB0aGUgdmFyaWFudCBudW1iZXIsIG9yIGFcbiAgICAgKiBidWZmZXIgZnJvbSB3aGljaCB0aGUgZGlzY3JpbWluYXRvciBpcyB0byBiZSByZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIG9mZnNldCBpbnRvIGB2YmAgZm9yIHRoZSBzdGFydCBvZiB0aGVcbiAgICAgKiB1bmlvbi4gIFVzZWQgb25seSB3aGVuIGB2YmAgaXMgYW4gaW5zdGFuY2Ugb2Yge1VpbnQ4QXJyYXl9LlxuICAgICAqXG4gICAgICogQHJldHVybiB7KHtWYXJpYW50TGF5b3V0fXx1bmRlZmluZWQpfVxuICAgICAqL1xuICAgIGdldFZhcmlhbnQodiwgUCA9IDApIHtcbiAgICAgIGxldCBOO1xuICAgICAgcmV0dXJuIHYgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gTiA9IHRoaXMuZGlzY3JpbWluYXRvci5kZWNvZGUodiwgUCkgOiBOID0gdiwgdGhpcy5yZWdpc3RyeVtOXTtcbiAgICB9XG4gIH1cbiAgcmUuVW5pb24gPSBXO1xuICBjbGFzcyBfIGV4dGVuZHMgciB7XG4gICAgY29uc3RydWN0b3IodiwgUCwgTiwgWSkge1xuICAgICAgaWYgKCEodiBpbnN0YW5jZW9mIFcpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwidW5pb24gbXVzdCBiZSBhIFVuaW9uXCIpO1xuICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKFApIHx8IDAgPiBQKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwidmFyaWFudCBtdXN0IGJlIGEgKG5vbi1uZWdhdGl2ZSkgaW50ZWdlclwiKTtcbiAgICAgIGlmICh0eXBlb2YgTiA9PSBcInN0cmluZ1wiICYmIFkgPT09IHZvaWQgMCAmJiAoWSA9IE4sIE4gPSBudWxsKSwgTikge1xuICAgICAgICBpZiAoIShOIGluc3RhbmNlb2YgcikpXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxheW91dCBtdXN0IGJlIGEgTGF5b3V0XCIpO1xuICAgICAgICBpZiAodi5kZWZhdWx0TGF5b3V0ICE9PSBudWxsICYmIDAgPD0gTi5zcGFuICYmIE4uc3BhbiA+IHYuZGVmYXVsdExheW91dC5zcGFuKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInZhcmlhbnQgc3BhbiBleGNlZWRzIHNwYW4gb2YgY29udGFpbmluZyB1bmlvblwiKTtcbiAgICAgICAgaWYgKHR5cGVvZiBZICE9IFwic3RyaW5nXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInZhcmlhbnQgbXVzdCBoYXZlIGEgU3RyaW5nIHByb3BlcnR5XCIpO1xuICAgICAgfVxuICAgICAgbGV0IGVlID0gdi5zcGFuO1xuICAgICAgMCA+IHYuc3BhbiAmJiAoZWUgPSBOID8gTi5zcGFuIDogMCwgMCA8PSBlZSAmJiB2LnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yICYmIChlZSArPSB2LmRpc2NyaW1pbmF0b3IubGF5b3V0LnNwYW4pKSwgc3VwZXIoZWUsIFkpLCB0aGlzLnVuaW9uID0gdiwgdGhpcy52YXJpYW50ID0gUCwgdGhpcy5sYXlvdXQgPSBOIHx8IG51bGw7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBnZXRTcGFuKHYsIFAgPSAwKSB7XG4gICAgICBpZiAoMCA8PSB0aGlzLnNwYW4pXG4gICAgICAgIHJldHVybiB0aGlzLnNwYW47XG4gICAgICBsZXQgTiA9IDA7XG4gICAgICB0aGlzLnVuaW9uLnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yICYmIChOID0gdGhpcy51bmlvbi5kaXNjcmltaW5hdG9yLmxheW91dC5zcGFuKTtcbiAgICAgIGxldCBZID0gMDtcbiAgICAgIHJldHVybiB0aGlzLmxheW91dCAmJiAoWSA9IHRoaXMubGF5b3V0LmdldFNwYW4odiwgUCArIE4pKSwgTiArIFk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLm1ha2VEZXN0aW5hdGlvbk9iamVjdCgpO1xuICAgICAgaWYgKHRoaXMgIT09IHRoaXMudW5pb24uZ2V0VmFyaWFudCh2LCBQKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmFyaWFudCBtaXNtYXRjaFwiKTtcbiAgICAgIGxldCBZID0gMDtcbiAgICAgIHJldHVybiB0aGlzLnVuaW9uLnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yICYmIChZID0gdGhpcy51bmlvbi5kaXNjcmltaW5hdG9yLmxheW91dC5zcGFuKSwgdGhpcy5sYXlvdXQgPyBOW3RoaXMucHJvcGVydHldID0gdGhpcy5sYXlvdXQuZGVjb2RlKHYsIFAgKyBZKSA6IHRoaXMucHJvcGVydHkgPyBOW3RoaXMucHJvcGVydHldID0gITAgOiB0aGlzLnVuaW9uLnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yICYmIChOW3RoaXMudW5pb24uZGlzY3JpbWluYXRvci5wcm9wZXJ0eV0gPSB0aGlzLnZhcmlhbnQpLCBOO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHYsIFAsIE4gPSAwKSB7XG4gICAgICBsZXQgWSA9IDA7XG4gICAgICBpZiAodGhpcy51bmlvbi51c2VzUHJlZml4RGlzY3JpbWluYXRvciAmJiAoWSA9IHRoaXMudW5pb24uZGlzY3JpbWluYXRvci5sYXlvdXQuc3BhbiksIHRoaXMubGF5b3V0ICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodiwgdGhpcy5wcm9wZXJ0eSkpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ2YXJpYW50IGxhY2tzIHByb3BlcnR5IFwiICsgdGhpcy5wcm9wZXJ0eSk7XG4gICAgICB0aGlzLnVuaW9uLmRpc2NyaW1pbmF0b3IuZW5jb2RlKHRoaXMudmFyaWFudCwgUCwgTik7XG4gICAgICBsZXQgZWUgPSBZO1xuICAgICAgaWYgKHRoaXMubGF5b3V0ICYmICh0aGlzLmxheW91dC5lbmNvZGUodlt0aGlzLnByb3BlcnR5XSwgUCwgTiArIFkpLCBlZSArPSB0aGlzLmxheW91dC5nZXRTcGFuKFAsIE4gKyBZKSwgMCA8PSB0aGlzLnVuaW9uLnNwYW4gJiYgZWUgPiB0aGlzLnVuaW9uLnNwYW4pKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJlbmNvZGVkIHZhcmlhbnQgb3ZlcnJ1bnMgY29udGFpbmluZyB1bmlvblwiKTtcbiAgICAgIHJldHVybiBlZTtcbiAgICB9XG4gICAgLyoqIERlbGVnYXRlIHtAbGluayBMYXlvdXQjZnJvbUFycmF5fGZyb21BcnJheX0gdG8ge0BsaW5rXG4gICAgICogVmFyaWFudExheW91dCNsYXlvdXR8bGF5b3V0fS4gKi9cbiAgICBmcm9tQXJyYXkodikge1xuICAgICAgaWYgKHRoaXMubGF5b3V0KVxuICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQuZnJvbUFycmF5KHYpO1xuICAgIH1cbiAgfVxuICByZS5WYXJpYW50TGF5b3V0ID0gXztcbiAgZnVuY3Rpb24gZyhtKSB7XG4gICAgcmV0dXJuIDAgPiBtICYmIChtICs9IDQyOTQ5NjcyOTYpLCBtO1xuICB9XG4gIGNsYXNzIHggZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQLCBOKSB7XG4gICAgICBpZiAoISh2IGluc3RhbmNlb2YgYyB8fCB2IGluc3RhbmNlb2YgdSkpXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJ3b3JkIG11c3QgYmUgYSBVSW50IG9yIFVJbnRCRSBsYXlvdXRcIik7XG4gICAgICBpZiAodHlwZW9mIFAgPT0gXCJzdHJpbmdcIiAmJiBOID09PSB2b2lkIDAgJiYgKE4gPSBQLCBQID0gITEpLCA0IDwgdi5zcGFuKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIndvcmQgY2Fubm90IGV4Y2VlZCAzMiBiaXRzXCIpO1xuICAgICAgc3VwZXIodi5zcGFuLCBOKSwgdGhpcy53b3JkID0gdiwgdGhpcy5tc2IgPSAhIVAsIHRoaXMuZmllbGRzID0gW107XG4gICAgICBsZXQgWSA9IDA7XG4gICAgICB0aGlzLl9wYWNrZWRTZXRWYWx1ZSA9IGZ1bmN0aW9uKGVlKSB7XG4gICAgICAgIHJldHVybiBZID0gZyhlZSksIHRoaXM7XG4gICAgICB9LCB0aGlzLl9wYWNrZWRHZXRWYWx1ZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gWTtcbiAgICAgIH07XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLm1ha2VEZXN0aW5hdGlvbk9iamVjdCgpLCBZID0gdGhpcy53b3JkLmRlY29kZSh2LCBQKTtcbiAgICAgIHRoaXMuX3BhY2tlZFNldFZhbHVlKFkpO1xuICAgICAgZm9yIChjb25zdCBlZSBvZiB0aGlzLmZpZWxkcylcbiAgICAgICAgZWUucHJvcGVydHkgIT09IHZvaWQgMCAmJiAoTltlZS5wcm9wZXJ0eV0gPSBlZS5kZWNvZGUodikpO1xuICAgICAgcmV0dXJuIE47XG4gICAgfVxuICAgIC8qKiBJbXBsZW1lbnQge0BsaW5rIExheW91dCNlbmNvZGV8ZW5jb2RlfSBmb3Ige0BsaW5rIEJpdFN0cnVjdHVyZX0uXG4gICAgICpcbiAgICAgKiBJZiBgc3JjYCBpcyBtaXNzaW5nIGEgcHJvcGVydHkgZm9yIGEgbWVtYmVyIHdpdGggYSBkZWZpbmVkIHtAbGlua1xuICAgICAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0gdGhlIGNvcnJlc3BvbmRpbmcgcmVnaW9uIG9mIHRoZSBwYWNrZWRcbiAgICAgKiB2YWx1ZSBpcyBsZWZ0IHVubW9kaWZpZWQuICBVbnVzZWQgYml0cyBhcmUgYWxzbyBsZWZ0IHVubW9kaWZpZWQuICovXG4gICAgZW5jb2RlKHYsIFAsIE4gPSAwKSB7XG4gICAgICBjb25zdCBZID0gdGhpcy53b3JkLmRlY29kZShQLCBOKTtcbiAgICAgIHRoaXMuX3BhY2tlZFNldFZhbHVlKFkpO1xuICAgICAgZm9yIChjb25zdCBlZSBvZiB0aGlzLmZpZWxkcylcbiAgICAgICAgaWYgKGVlLnByb3BlcnR5ICE9PSB2b2lkIDApIHtcbiAgICAgICAgICBjb25zdCBpZSA9IHZbZWUucHJvcGVydHldO1xuICAgICAgICAgIGllICE9PSB2b2lkIDAgJiYgZWUuZW5jb2RlKGllKTtcbiAgICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMud29yZC5lbmNvZGUodGhpcy5fcGFja2VkR2V0VmFsdWUoKSwgUCwgTik7XG4gICAgfVxuICAgIC8qKiBSZWdpc3RlciBhIG5ldyBiaXRmaWVsZCB3aXRoIGEgY29udGFpbmluZyBiaXQgc3RydWN0dXJlLiAgVGhlXG4gICAgICogcmVzdWx0aW5nIGJpdGZpZWxkIGlzIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGJpdHMgLSBpbml0aWFsaXplciBmb3Ige0BsaW5rIEJpdEZpZWxkI2JpdHN8Yml0c30uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gICAgICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0JpdEZpZWxkfSAqL1xuICAgIGFkZEZpZWxkKHYsIFApIHtcbiAgICAgIGNvbnN0IE4gPSBuZXcgdyh0aGlzLCB2LCBQKTtcbiAgICAgIHJldHVybiB0aGlzLmZpZWxkcy5wdXNoKE4pLCBOO1xuICAgIH1cbiAgICAvKiogQXMgd2l0aCB7QGxpbmsgQml0U3RydWN0dXJlI2FkZEZpZWxkfGFkZEZpZWxkfSBmb3Igc2luZ2xlLWJpdFxuICAgICAqIGZpZWxkcyB3aXRoIGBib29sZWFuYCB2YWx1ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAgICAgKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gKi9cbiAgICAvLyBgQm9vbGVhbmAgY29uZmxpY3RzIHdpdGggdGhlIG5hdGl2ZSBwcmltaXRpdmUgdHlwZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgYWRkQm9vbGVhbih2KSB7XG4gICAgICBjb25zdCBQID0gbmV3IEQodGhpcywgdik7XG4gICAgICByZXR1cm4gdGhpcy5maWVsZHMucHVzaChQKSwgUDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogR2V0IGFjY2VzcyB0byB0aGUgYml0IGZpZWxkIGZvciBhIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IC0gdGhlIGJpdCBmaWVsZCBvZiBpbnRlcmVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0JpdEZpZWxkfSAtIHRoZSBmaWVsZCBhc3NvY2lhdGVkIHdpdGggYHByb3BlcnR5YCwgb3JcbiAgICAgKiB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm8gc3VjaCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBmaWVsZEZvcih2KSB7XG4gICAgICBpZiAodHlwZW9mIHYgIT0gXCJzdHJpbmdcIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcInByb3BlcnR5IG11c3QgYmUgc3RyaW5nXCIpO1xuICAgICAgZm9yIChjb25zdCBQIG9mIHRoaXMuZmllbGRzKVxuICAgICAgICBpZiAoUC5wcm9wZXJ0eSA9PT0gdilcbiAgICAgICAgICByZXR1cm4gUDtcbiAgICB9XG4gIH1cbiAgcmUuQml0U3RydWN0dXJlID0geDtcbiAgY2xhc3MgdyB7XG4gICAgY29uc3RydWN0b3IodiwgUCwgTikge1xuICAgICAgaWYgKCEodiBpbnN0YW5jZW9mIHgpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY29udGFpbmVyIG11c3QgYmUgYSBCaXRTdHJ1Y3R1cmVcIik7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoUCkgfHwgMCA+PSBQKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYml0cyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJcIik7XG4gICAgICBjb25zdCBZID0gOCAqIHYuc3BhbiwgZWUgPSB2LmZpZWxkcy5yZWR1Y2UoKGllLCBsZSkgPT4gaWUgKyBsZS5iaXRzLCAwKTtcbiAgICAgIGlmIChQICsgZWUgPiBZKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiaXRzIHRvbyBsb25nIGZvciBzcGFuIHJlbWFpbmRlciAoXCIgKyAoWSAtIGVlKSArIFwiIG9mIFwiICsgWSArIFwiIHJlbWFpbilcIik7XG4gICAgICB0aGlzLmNvbnRhaW5lciA9IHYsIHRoaXMuYml0cyA9IFAsIHRoaXMudmFsdWVNYXNrID0gKDEgPDwgUCkgLSAxLCBQID09PSAzMiAmJiAodGhpcy52YWx1ZU1hc2sgPSA0Mjk0OTY3Mjk1KSwgdGhpcy5zdGFydCA9IGVlLCB0aGlzLmNvbnRhaW5lci5tc2IgJiYgKHRoaXMuc3RhcnQgPSBZIC0gZWUgLSBQKSwgdGhpcy53b3JkTWFzayA9IGcodGhpcy52YWx1ZU1hc2sgPDwgdGhpcy5zdGFydCksIHRoaXMucHJvcGVydHkgPSBOO1xuICAgIH1cbiAgICAvKiogU3RvcmUgYSB2YWx1ZSBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIHN1YnNlcXVlbmNlIG9mIHRoZSBjb250YWluaW5nXG4gICAgICogYml0IGZpZWxkLiAqL1xuICAgIGRlY29kZSh2LCBQKSB7XG4gICAgICBjb25zdCBOID0gdGhpcy5jb250YWluZXIuX3BhY2tlZEdldFZhbHVlKCk7XG4gICAgICByZXR1cm4gZyhOICYgdGhpcy53b3JkTWFzaykgPj4+IHRoaXMuc3RhcnQ7XG4gICAgfVxuICAgIC8qKiBTdG9yZSBhIHZhbHVlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgc3Vic2VxdWVuY2Ugb2YgdGhlIGNvbnRhaW5pbmdcbiAgICAgKiBiaXQgZmllbGQuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGlzIGlzIG5vdCBhIHNwZWNpYWxpemF0aW9uIG9mIHtAbGlua1xuICAgICAqIExheW91dCNlbmNvZGV8TGF5b3V0LmVuY29kZX0gYW5kIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4gKi9cbiAgICBlbmNvZGUodikge1xuICAgICAgaWYgKHR5cGVvZiB2ICE9IFwibnVtYmVyXCIgfHwgIU51bWJlci5pc0ludGVnZXIodikgfHwgdiAhPT0gZyh2ICYgdGhpcy52YWx1ZU1hc2spKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG4oXCJCaXRGaWVsZC5lbmNvZGVcIiwgdGhpcykgKyBcIiB2YWx1ZSBtdXN0IGJlIGludGVnZXIgbm90IGV4Y2VlZGluZyBcIiArIHRoaXMudmFsdWVNYXNrKTtcbiAgICAgIGNvbnN0IFAgPSB0aGlzLmNvbnRhaW5lci5fcGFja2VkR2V0VmFsdWUoKSwgTiA9IGcodiA8PCB0aGlzLnN0YXJ0KTtcbiAgICAgIHRoaXMuY29udGFpbmVyLl9wYWNrZWRTZXRWYWx1ZShnKFAgJiB+dGhpcy53b3JkTWFzaykgfCBOKTtcbiAgICB9XG4gIH1cbiAgcmUuQml0RmllbGQgPSB3O1xuICBjbGFzcyBEIGV4dGVuZHMgdyB7XG4gICAgY29uc3RydWN0b3IodiwgUCkge1xuICAgICAgc3VwZXIodiwgMSwgUCk7XG4gICAgfVxuICAgIC8qKiBPdmVycmlkZSB7QGxpbmsgQml0RmllbGQjZGVjb2RlfGRlY29kZX0gZm9yIHtAbGluayBCb29sZWFufEJvb2xlYW59LlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICovXG4gICAgZGVjb2RlKHYsIFApIHtcbiAgICAgIHJldHVybiAhIXN1cGVyLmRlY29kZSh2LCBQKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2KSB7XG4gICAgICB0eXBlb2YgdiA9PSBcImJvb2xlYW5cIiAmJiAodiA9ICt2KSwgc3VwZXIuZW5jb2RlKHYpO1xuICAgIH1cbiAgfVxuICByZS5Cb29sZWFuID0gRDtcbiAgY2xhc3MgTyBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYsIFApIHtcbiAgICAgIGlmICghKHYgaW5zdGFuY2VvZiBvICYmIHYuaXNDb3VudCgpIHx8IE51bWJlci5pc0ludGVnZXIodikgJiYgMCA8PSB2KSlcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImxlbmd0aCBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIgb3IgYW4gdW5zaWduZWQgaW50ZWdlciBFeHRlcm5hbExheW91dFwiKTtcbiAgICAgIGxldCBOID0gLTE7XG4gICAgICB2IGluc3RhbmNlb2YgbyB8fCAoTiA9IHYpLCBzdXBlcihOLCBQKSwgdGhpcy5sZW5ndGggPSB2O1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZ2V0U3Bhbih2LCBQKSB7XG4gICAgICBsZXQgTiA9IHRoaXMuc3BhbjtcbiAgICAgIHJldHVybiAwID4gTiAmJiAoTiA9IHRoaXMubGVuZ3RoLmRlY29kZSh2LCBQKSksIE47XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGxldCBOID0gdGhpcy5zcGFuO1xuICAgICAgcmV0dXJuIDAgPiBOICYmIChOID0gdGhpcy5sZW5ndGguZGVjb2RlKHYsIFApKSwgdCh2KS5zbGljZShQLCBQICsgTik7XG4gICAgfVxuICAgIC8qKiBJbXBsZW1lbnQge0BsaW5rIExheW91dCNlbmNvZGV8ZW5jb2RlfSBmb3Ige0BsaW5rIEJsb2J9LlxuICAgICAqXG4gICAgICogKipOT1RFKiogSWYge0BsaW5rIExheW91dCNjb3VudHxjb3VudH0gaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rXG4gICAgICogRXh0ZXJuYWxMYXlvdXR9IHRoZW4gdGhlIGxlbmd0aCBvZiBgc3JjYCB3aWxsIGJlIGVuY29kZWQgYXMgdGhlXG4gICAgICogY291bnQgYWZ0ZXIgYHNyY2AgaXMgZW5jb2RlZC4gKi9cbiAgICBlbmNvZGUodiwgUCwgTikge1xuICAgICAgbGV0IFkgPSB0aGlzLmxlbmd0aDtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCBpbnN0YW5jZW9mIG8gJiYgKFkgPSB2Lmxlbmd0aCksICEodiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgJiYgWSA9PT0gdi5sZW5ndGgpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG4oXCJCbG9iLmVuY29kZVwiLCB0aGlzKSArIFwiIHJlcXVpcmVzIChsZW5ndGggXCIgKyBZICsgXCIpIFVpbnQ4QXJyYXkgYXMgc3JjXCIpO1xuICAgICAgaWYgKE4gKyBZID4gUC5sZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwiZW5jb2Rpbmcgb3ZlcnJ1bnMgVWludDhBcnJheVwiKTtcbiAgICAgIGNvbnN0IGVlID0gdCh2KTtcbiAgICAgIHJldHVybiB0KFApLndyaXRlKGVlLnRvU3RyaW5nKFwiaGV4XCIpLCBOLCBZLCBcImhleFwiKSwgdGhpcy5sZW5ndGggaW5zdGFuY2VvZiBvICYmIHRoaXMubGVuZ3RoLmVuY29kZShZLCBQLCBOKSwgWTtcbiAgICB9XG4gIH1cbiAgcmUuQmxvYiA9IE87XG4gIGNsYXNzIFUgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2KSB7XG4gICAgICBzdXBlcigtMSwgdik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBnZXRTcGFuKHYsIFAgPSAwKSB7XG4gICAgICBlKHYpO1xuICAgICAgbGV0IE4gPSBQO1xuICAgICAgZm9yICg7IE4gPCB2Lmxlbmd0aCAmJiB2W05dICE9PSAwOyApXG4gICAgICAgIE4gKz0gMTtcbiAgICAgIHJldHVybiAxICsgTiAtIFA7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCA9IDApIHtcbiAgICAgIGNvbnN0IE4gPSB0aGlzLmdldFNwYW4odiwgUCk7XG4gICAgICByZXR1cm4gdCh2KS5zbGljZShQLCBQICsgTiAtIDEpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIHR5cGVvZiB2ICE9IFwic3RyaW5nXCIgJiYgKHYgPSBTdHJpbmcodikpO1xuICAgICAgY29uc3QgWSA9IHMuQnVmZmVyLmZyb20odiwgXCJ1dGY4XCIpLCBlZSA9IFkubGVuZ3RoO1xuICAgICAgaWYgKE4gKyBlZSA+IFAubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcImVuY29kaW5nIG92ZXJydW5zIEJ1ZmZlclwiKTtcbiAgICAgIGNvbnN0IGllID0gdChQKTtcbiAgICAgIHJldHVybiBZLmNvcHkoaWUsIE4pLCBpZVtOICsgZWVdID0gMCwgZWUgKyAxO1xuICAgIH1cbiAgfVxuICByZS5DU3RyaW5nID0gVTtcbiAgY2xhc3MgViBleHRlbmRzIHIge1xuICAgIGNvbnN0cnVjdG9yKHYsIFApIHtcbiAgICAgIGlmICh0eXBlb2YgdiA9PSBcInN0cmluZ1wiICYmIFAgPT09IHZvaWQgMCAmJiAoUCA9IHYsIHYgPSB2b2lkIDApLCB2ID09PSB2b2lkIDApXG4gICAgICAgIHYgPSAtMTtcbiAgICAgIGVsc2UgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKHYpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwibWF4U3BhbiBtdXN0IGJlIGFuIGludGVnZXJcIik7XG4gICAgICBzdXBlcigtMSwgUCksIHRoaXMubWF4U3BhbiA9IHY7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBnZXRTcGFuKHYsIFAgPSAwKSB7XG4gICAgICByZXR1cm4gZSh2KSwgdi5sZW5ndGggLSBQO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKHYsIFAgPSAwKSB7XG4gICAgICBjb25zdCBOID0gdGhpcy5nZXRTcGFuKHYsIFApO1xuICAgICAgaWYgKDAgPD0gdGhpcy5tYXhTcGFuICYmIHRoaXMubWF4U3BhbiA8IE4pXG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKFwidGV4dCBsZW5ndGggZXhjZWVkcyBtYXhTcGFuXCIpO1xuICAgICAgcmV0dXJuIHQodikuc2xpY2UoUCwgUCArIE4pLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTiA9IDApIHtcbiAgICAgIHR5cGVvZiB2ICE9IFwic3RyaW5nXCIgJiYgKHYgPSBTdHJpbmcodikpO1xuICAgICAgY29uc3QgWSA9IHMuQnVmZmVyLmZyb20odiwgXCJ1dGY4XCIpLCBlZSA9IFkubGVuZ3RoO1xuICAgICAgaWYgKDAgPD0gdGhpcy5tYXhTcGFuICYmIHRoaXMubWF4U3BhbiA8IGVlKVxuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcInRleHQgbGVuZ3RoIGV4Y2VlZHMgbWF4U3BhblwiKTtcbiAgICAgIGlmIChOICsgZWUgPiBQLmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJlbmNvZGluZyBvdmVycnVucyBCdWZmZXJcIik7XG4gICAgICByZXR1cm4gWS5jb3B5KHQoUCksIE4pLCBlZTtcbiAgICB9XG4gIH1cbiAgcmUuVVRGOCA9IFY7XG4gIGNsYXNzIEwgZXh0ZW5kcyByIHtcbiAgICBjb25zdHJ1Y3Rvcih2LCBQKSB7XG4gICAgICBzdXBlcigwLCBQKSwgdGhpcy52YWx1ZSA9IHY7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUodiwgUCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUodiwgUCwgTikge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG4gIHJldHVybiByZS5Db25zdGFudCA9IEwsIHJlLmdyZWVkeSA9ICgobSwgdikgPT4gbmV3IGEobSwgdikpLCByZS5vZmZzZXQgPSAoKG0sIHYsIFApID0+IG5ldyBsKG0sIHYsIFApKSwgcmUudTggPSAoKG0pID0+IG5ldyBjKDEsIG0pKSwgcmUudTE2ID0gKChtKSA9PiBuZXcgYygyLCBtKSksIHJlLnUyNCA9ICgobSkgPT4gbmV3IGMoMywgbSkpLCByZS51MzIgPSAoKG0pID0+IG5ldyBjKDQsIG0pKSwgcmUudTQwID0gKChtKSA9PiBuZXcgYyg1LCBtKSksIHJlLnU0OCA9ICgobSkgPT4gbmV3IGMoNiwgbSkpLCByZS5udTY0ID0gKChtKSA9PiBuZXcgRShtKSksIHJlLnUxNmJlID0gKChtKSA9PiBuZXcgdSgyLCBtKSksIHJlLnUyNGJlID0gKChtKSA9PiBuZXcgdSgzLCBtKSksIHJlLnUzMmJlID0gKChtKSA9PiBuZXcgdSg0LCBtKSksIHJlLnU0MGJlID0gKChtKSA9PiBuZXcgdSg1LCBtKSksIHJlLnU0OGJlID0gKChtKSA9PiBuZXcgdSg2LCBtKSksIHJlLm51NjRiZSA9ICgobSkgPT4gbmV3IGIobSkpLCByZS5zOCA9ICgobSkgPT4gbmV3IGQoMSwgbSkpLCByZS5zMTYgPSAoKG0pID0+IG5ldyBkKDIsIG0pKSwgcmUuczI0ID0gKChtKSA9PiBuZXcgZCgzLCBtKSksIHJlLnMzMiA9ICgobSkgPT4gbmV3IGQoNCwgbSkpLCByZS5zNDAgPSAoKG0pID0+IG5ldyBkKDUsIG0pKSwgcmUuczQ4ID0gKChtKSA9PiBuZXcgZCg2LCBtKSksIHJlLm5zNjQgPSAoKG0pID0+IG5ldyBSKG0pKSwgcmUuczE2YmUgPSAoKG0pID0+IG5ldyBoKDIsIG0pKSwgcmUuczI0YmUgPSAoKG0pID0+IG5ldyBoKDMsIG0pKSwgcmUuczMyYmUgPSAoKG0pID0+IG5ldyBoKDQsIG0pKSwgcmUuczQwYmUgPSAoKG0pID0+IG5ldyBoKDUsIG0pKSwgcmUuczQ4YmUgPSAoKG0pID0+IG5ldyBoKDYsIG0pKSwgcmUubnM2NGJlID0gKChtKSA9PiBuZXcgQShtKSksIHJlLmYzMiA9ICgobSkgPT4gbmV3IEYobSkpLCByZS5mMzJiZSA9ICgobSkgPT4gbmV3IE0obSkpLCByZS5mNjQgPSAoKG0pID0+IG5ldyBIKG0pKSwgcmUuZjY0YmUgPSAoKG0pID0+IG5ldyBLKG0pKSwgcmUuc3RydWN0ID0gKChtLCB2LCBQKSA9PiBuZXcgQyhtLCB2LCBQKSksIHJlLmJpdHMgPSAoKG0sIHYsIFApID0+IG5ldyB4KG0sIHYsIFApKSwgcmUuc2VxID0gKChtLCB2LCBQKSA9PiBuZXcgaihtLCB2LCBQKSksIHJlLnVuaW9uID0gKChtLCB2LCBQKSA9PiBuZXcgVyhtLCB2LCBQKSksIHJlLnVuaW9uTGF5b3V0RGlzY3JpbWluYXRvciA9ICgobSwgdikgPT4gbmV3ICQobSwgdikpLCByZS5ibG9iID0gKChtLCB2KSA9PiBuZXcgTyhtLCB2KSksIHJlLmNzdHIgPSAoKG0pID0+IG5ldyBVKG0pKSwgcmUudXRmOCA9ICgobSwgdikgPT4gbmV3IFYobSwgdikpLCByZS5jb25zdGFudCA9ICgobSwgdikgPT4gbmV3IEwobSwgdikpLCByZTtcbn1cbnZhciB6ID0gV3koKSwgenkgPSA4MDc4ZTMsIFl5ID0gODA3ODAwMSwgWnkgPSA4MDc4MDA0LCBYeSA9IDgwNzgwMDUsIEp5ID0gODA3ODAwNiwgUXkgPSA4MDc4MDExO1xuZnVuY3Rpb24geDAocykge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzKSA/IFwiJTVCXCIgKyBzLm1hcCh4MCkuam9pbihcbiAgICBcIiUyQyUyMFwiXG4gICAgLyogXCIsIFwiICovXG4gICkgKyAvKiBcIl1cIiAqL1xuICBcIiU1RFwiIDogdHlwZW9mIHMgPT0gXCJiaWdpbnRcIiA/IGAke3N9bmAgOiBlbmNvZGVVUklDb21wb25lbnQoXG4gICAgU3RyaW5nKFxuICAgICAgcyAhPSBudWxsICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZihzKSA9PT0gbnVsbCA/IChcbiAgICAgICAgLy8gUGxhaW4gb2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSBkb24ndCBoYXZlIGEgYHRvU3RyaW5nYCBtZXRob2QuXG4gICAgICAgIC8vIENvbnZlcnQgdGhlbSBiZWZvcmUgc3RyaW5naWZ5aW5nIHRoZW0uXG4gICAgICAgIHsgLi4ucyB9XG4gICAgICApIDogc1xuICAgIClcbiAgKTtcbn1cbmZ1bmN0aW9uIGV2KFtzLCBlXSkge1xuICByZXR1cm4gYCR7c309JHt4MChlKX1gO1xufVxuZnVuY3Rpb24gdHYocykge1xuICBjb25zdCBlID0gT2JqZWN0LmVudHJpZXMocykubWFwKGV2KS5qb2luKFwiJlwiKTtcbiAgcmV0dXJuIGJ0b2EoZSk7XG59XG5mdW5jdGlvbiBydihzLCBlID0ge30pIHtcbiAge1xuICAgIGxldCB0ID0gYFNvbGFuYSBlcnJvciAjJHtzfTsgRGVjb2RlIHRoaXMgZXJyb3IgYnkgcnVubmluZyBcXGBucHggQHNvbGFuYS9lcnJvcnMgZGVjb2RlIC0tICR7c31gO1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGggJiYgKHQgKz0gYCAnJHt0dihlKX0nYCksIGAke3R9XFxgYDtcbiAgfVxufVxudmFyIGJuID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKC4uLltlLCB0XSkge1xuICAgIGxldCByLCBuO1xuICAgIGlmICh0KSB7XG4gICAgICBjb25zdCB7IGNhdXNlOiBvLCAuLi5hIH0gPSB0O1xuICAgICAgbyAmJiAobiA9IHsgY2F1c2U6IG8gfSksIE9iamVjdC5rZXlzKGEpLmxlbmd0aCA+IDAgJiYgKHIgPSBhKTtcbiAgICB9XG4gICAgY29uc3QgaSA9IHJ2KGUsIHIpO1xuICAgIHN1cGVyKGksIG4pO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB0aGUgcm9vdCBjYXVzZSBvZiB0aGlzIHtAbGluayBTb2xhbmFFcnJvcn0sIGlmIGFueS5cbiAgICAgKlxuICAgICAqIEZvciBleGFtcGxlLCBhIHRyYW5zYWN0aW9uIGVycm9yIG1pZ2h0IGhhdmUgYW4gaW5zdHJ1Y3Rpb24gZXJyb3IgYXMgaXRzIHJvb3QgY2F1c2UuIEluIHRoaXNcbiAgICAgKiBjYXNlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgaW5zdHJ1Y3Rpb24gZXJyb3Igb24gdGhlIHRyYW5zYWN0aW9uIGVycm9yIGFzIGBjYXVzZWAuXG4gICAgICovXG4gICAgQ3IodGhpcywgXCJjYXVzZVwiLCB0aGlzLmNhdXNlKTtcbiAgICAvKipcbiAgICAgKiBDb250YWlucyBjb250ZXh0IHRoYXQgY2FuIGFzc2lzdCBpbiB1bmRlcnN0YW5kaW5nIG9yIHJlY292ZXJpbmcgZnJvbSBhIHtAbGluayBTb2xhbmFFcnJvcn0uXG4gICAgICovXG4gICAgQ3IodGhpcywgXCJjb250ZXh0XCIpO1xuICAgIHRoaXMuY29udGV4dCA9IHtcbiAgICAgIF9fY29kZTogZSxcbiAgICAgIC4uLnJcbiAgICB9LCB0aGlzLm5hbWUgPSBcIlNvbGFuYUVycm9yXCI7XG4gIH1cbn07XG5mdW5jdGlvbiBzdihzLCBlKSB7XG4gIHJldHVybiBcImZpeGVkU2l6ZVwiIGluIGUgPyBlLmZpeGVkU2l6ZSA6IGUuZ2V0U2l6ZUZyb21WYWx1ZShzKTtcbn1cbmZ1bmN0aW9uIG52KHMpIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIC4uLnMsXG4gICAgZW5jb2RlOiAoZSkgPT4ge1xuICAgICAgY29uc3QgdCA9IG5ldyBVaW50OEFycmF5KHN2KGUsIHMpKTtcbiAgICAgIHJldHVybiBzLndyaXRlKGUsIHQsIDApLCB0O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBpdihzKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAuLi5zLFxuICAgIGRlY29kZTogKGUsIHQgPSAwKSA9PiBzLnJlYWQoZSwgdClbMF1cbiAgfSk7XG59XG5mdW5jdGlvbiBkbihzKSB7XG4gIHJldHVybiBcImZpeGVkU2l6ZVwiIGluIHMgJiYgdHlwZW9mIHMuZml4ZWRTaXplID09IFwibnVtYmVyXCI7XG59XG5mdW5jdGlvbiBvdihzLCBlKSB7XG4gIGlmIChkbihzKSAhPT0gZG4oZSkpXG4gICAgdGhyb3cgbmV3IGJuKFp5KTtcbiAgaWYgKGRuKHMpICYmIGRuKGUpICYmIHMuZml4ZWRTaXplICE9PSBlLmZpeGVkU2l6ZSlcbiAgICB0aHJvdyBuZXcgYm4oWHksIHtcbiAgICAgIGRlY29kZXJGaXhlZFNpemU6IGUuZml4ZWRTaXplLFxuICAgICAgZW5jb2RlckZpeGVkU2l6ZTogcy5maXhlZFNpemVcbiAgICB9KTtcbiAgaWYgKCFkbihzKSAmJiAhZG4oZSkgJiYgcy5tYXhTaXplICE9PSBlLm1heFNpemUpXG4gICAgdGhyb3cgbmV3IGJuKEp5LCB7XG4gICAgICBkZWNvZGVyTWF4U2l6ZTogZS5tYXhTaXplLFxuICAgICAgZW5jb2Rlck1heFNpemU6IHMubWF4U2l6ZVxuICAgIH0pO1xuICByZXR1cm4ge1xuICAgIC4uLmUsXG4gICAgLi4ucyxcbiAgICBkZWNvZGU6IGUuZGVjb2RlLFxuICAgIGVuY29kZTogcy5lbmNvZGUsXG4gICAgcmVhZDogZS5yZWFkLFxuICAgIHdyaXRlOiBzLndyaXRlXG4gIH07XG59XG5mdW5jdGlvbiBhdihzLCBlLCB0ID0gMCkge1xuICBpZiAoZS5sZW5ndGggLSB0IDw9IDApXG4gICAgdGhyb3cgbmV3IGJuKHp5LCB7XG4gICAgICBjb2RlY0Rlc2NyaXB0aW9uOiBzXG4gICAgfSk7XG59XG5mdW5jdGlvbiBsdihzLCBlLCB0LCByID0gMCkge1xuICBjb25zdCBuID0gdC5sZW5ndGggLSByO1xuICBpZiAobiA8IGUpXG4gICAgdGhyb3cgbmV3IGJuKFl5LCB7XG4gICAgICBieXRlc0xlbmd0aDogbixcbiAgICAgIGNvZGVjRGVzY3JpcHRpb246IHMsXG4gICAgICBleHBlY3RlZDogZVxuICAgIH0pO1xufVxuZnVuY3Rpb24gY3YocywgZSwgdCwgcikge1xuICBpZiAociA8IGUgfHwgciA+IHQpXG4gICAgdGhyb3cgbmV3IGJuKFF5LCB7XG4gICAgICBjb2RlY0Rlc2NyaXB0aW9uOiBzLFxuICAgICAgbWF4OiB0LFxuICAgICAgbWluOiBlLFxuICAgICAgdmFsdWU6IHJcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIFMwKHMpIHtcbiAgcmV0dXJuIChzID09IG51bGwgPyB2b2lkIDAgOiBzLmVuZGlhbikgIT09IDE7XG59XG5mdW5jdGlvbiB1dihzKSB7XG4gIHJldHVybiBudih7XG4gICAgZml4ZWRTaXplOiBzLnNpemUsXG4gICAgd3JpdGUoZSwgdCwgcikge1xuICAgICAgcy5yYW5nZSAmJiBjdihzLm5hbWUsIHMucmFuZ2VbMF0sIHMucmFuZ2VbMV0sIGUpO1xuICAgICAgY29uc3QgbiA9IG5ldyBBcnJheUJ1ZmZlcihzLnNpemUpO1xuICAgICAgcmV0dXJuIHMuc2V0KG5ldyBEYXRhVmlldyhuKSwgZSwgUzAocy5jb25maWcpKSwgdC5zZXQobmV3IFVpbnQ4QXJyYXkobiksIHIpLCByICsgcy5zaXplO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBkdihzKSB7XG4gIHJldHVybiBpdih7XG4gICAgZml4ZWRTaXplOiBzLnNpemUsXG4gICAgcmVhZChlLCB0ID0gMCkge1xuICAgICAgYXYocy5uYW1lLCBlLCB0KSwgbHYocy5uYW1lLCBzLnNpemUsIGUsIHQpO1xuICAgICAgY29uc3QgciA9IG5ldyBEYXRhVmlldyhodihlLCB0LCBzLnNpemUpKTtcbiAgICAgIHJldHVybiBbcy5nZXQociwgUzAocy5jb25maWcpKSwgdCArIHMuc2l6ZV07XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGh2KHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IHMuYnl0ZU9mZnNldCArIChlID8/IDApLCBuID0gdCA/PyBzLmJ5dGVMZW5ndGg7XG4gIHJldHVybiBzLmJ1ZmZlci5zbGljZShyLCByICsgbik7XG59XG52YXIgZnYgPSAocyA9IHt9KSA9PiB1dih7XG4gIGNvbmZpZzogcyxcbiAgbmFtZTogXCJ1NjRcIixcbiAgcmFuZ2U6IFswbiwgQmlnSW50KFwiMHhmZmZmZmZmZmZmZmZmZmZmXCIpXSxcbiAgc2V0OiAoZSwgdCwgcikgPT4gZS5zZXRCaWdVaW50NjQoMCwgQmlnSW50KHQpLCByKSxcbiAgc2l6ZTogOFxufSksIGd2ID0gKHMgPSB7fSkgPT4gZHYoe1xuICBjb25maWc6IHMsXG4gIGdldDogKGUsIHQpID0+IGUuZ2V0QmlnVWludDY0KDAsIHQpLFxuICBuYW1lOiBcInU2NFwiLFxuICBzaXplOiA4XG59KSwgcHYgPSAocyA9IHt9KSA9PiBvdihmdihzKSwgZ3YocykpO1xuY2xhc3MgbXYgZXh0ZW5kcyBUeXBlRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgbGV0IHI7XG4gICAgY29uc3QgeyBtZXNzYWdlOiBuLCBleHBsYW5hdGlvbjogaSwgLi4ubyB9ID0gZSwgeyBwYXRoOiBhIH0gPSBlLCBsID0gYS5sZW5ndGggPT09IDAgPyBuIDogYEF0IHBhdGg6ICR7YS5qb2luKFwiLlwiKX0gLS0gJHtufWA7XG4gICAgc3VwZXIoaSA/PyBsKSwgaSAhPSBudWxsICYmICh0aGlzLmNhdXNlID0gbCksIE9iamVjdC5hc3NpZ24odGhpcywgbyksIHRoaXMubmFtZSA9IHRoaXMuY29uc3RydWN0b3IubmFtZSwgdGhpcy5mYWlsdXJlcyA9ICgpID0+IHIgPz8gKHIgPSBbZSwgLi4udCgpXSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHl2KHMpIHtcbiAgcmV0dXJuIENpKHMpICYmIHR5cGVvZiBzW1N5bWJvbC5pdGVyYXRvcl0gPT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gQ2kocykge1xuICByZXR1cm4gdHlwZW9mIHMgPT0gXCJvYmplY3RcIiAmJiBzICE9IG51bGw7XG59XG5mdW5jdGlvbiAkbyhzKSB7XG4gIHJldHVybiBDaShzKSAmJiAhQXJyYXkuaXNBcnJheShzKTtcbn1cbmZ1bmN0aW9uIEJyKHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBzID09IFwic3ltYm9sXCIgPyBzLnRvU3RyaW5nKCkgOiB0eXBlb2YgcyA9PSBcInN0cmluZ1wiID8gSlNPTi5zdHJpbmdpZnkocykgOiBgJHtzfWA7XG59XG5mdW5jdGlvbiB2dihzKSB7XG4gIGNvbnN0IHsgZG9uZTogZSwgdmFsdWU6IHQgfSA9IHMubmV4dCgpO1xuICByZXR1cm4gZSA/IHZvaWQgMCA6IHQ7XG59XG5mdW5jdGlvbiBFdihzLCBlLCB0LCByKSB7XG4gIGlmIChzID09PSAhMClcbiAgICByZXR1cm47XG4gIHMgPT09ICExID8gcyA9IHt9IDogdHlwZW9mIHMgPT0gXCJzdHJpbmdcIiAmJiAocyA9IHsgbWVzc2FnZTogcyB9KTtcbiAgY29uc3QgeyBwYXRoOiBuLCBicmFuY2g6IGkgfSA9IGUsIHsgdHlwZTogbyB9ID0gdCwgeyByZWZpbmVtZW50OiBhLCBtZXNzYWdlOiBsID0gYEV4cGVjdGVkIGEgdmFsdWUgb2YgdHlwZSBcXGAke299XFxgJHthID8gYCB3aXRoIHJlZmluZW1lbnQgXFxgJHthfVxcYGAgOiBcIlwifSwgYnV0IHJlY2VpdmVkOiBcXGAke0JyKHIpfVxcYGAgfSA9IHM7XG4gIHJldHVybiB7XG4gICAgdmFsdWU6IHIsXG4gICAgdHlwZTogbyxcbiAgICByZWZpbmVtZW50OiBhLFxuICAgIGtleTogbltuLmxlbmd0aCAtIDFdLFxuICAgIHBhdGg6IG4sXG4gICAgYnJhbmNoOiBpLFxuICAgIC4uLnMsXG4gICAgbWVzc2FnZTogbFxuICB9O1xufVxuZnVuY3Rpb24qIENkKHMsIGUsIHQsIHIpIHtcbiAgeXYocykgfHwgKHMgPSBbc10pO1xuICBmb3IgKGNvbnN0IG4gb2Ygcykge1xuICAgIGNvbnN0IGkgPSBFdihuLCBlLCB0LCByKTtcbiAgICBpICYmICh5aWVsZCBpKTtcbiAgfVxufVxuZnVuY3Rpb24qIEpjKHMsIGUsIHQgPSB7fSkge1xuICBjb25zdCB7IHBhdGg6IHIgPSBbXSwgYnJhbmNoOiBuID0gW3NdLCBjb2VyY2U6IGkgPSAhMSwgbWFzazogbyA9ICExIH0gPSB0LCBhID0geyBwYXRoOiByLCBicmFuY2g6IG4sIG1hc2s6IG8gfTtcbiAgaSAmJiAocyA9IGUuY29lcmNlcihzLCBhKSk7XG4gIGxldCBsID0gXCJ2YWxpZFwiO1xuICBmb3IgKGNvbnN0IGMgb2YgZS52YWxpZGF0b3IocywgYSkpXG4gICAgYy5leHBsYW5hdGlvbiA9IHQubWVzc2FnZSwgbCA9IFwibm90X3ZhbGlkXCIsIHlpZWxkIFtjLCB2b2lkIDBdO1xuICBmb3IgKGxldCBbYywgdSwgZF0gb2YgZS5lbnRyaWVzKHMsIGEpKSB7XG4gICAgY29uc3QgaCA9IEpjKHUsIGQsIHtcbiAgICAgIHBhdGg6IGMgPT09IHZvaWQgMCA/IHIgOiBbLi4uciwgY10sXG4gICAgICBicmFuY2g6IGMgPT09IHZvaWQgMCA/IG4gOiBbLi4ubiwgdV0sXG4gICAgICBjb2VyY2U6IGksXG4gICAgICBtYXNrOiBvLFxuICAgICAgbWVzc2FnZTogdC5tZXNzYWdlXG4gICAgfSk7XG4gICAgZm9yIChjb25zdCBmIG9mIGgpXG4gICAgICBmWzBdID8gKGwgPSBmWzBdLnJlZmluZW1lbnQgIT0gbnVsbCA/IFwibm90X3JlZmluZWRcIiA6IFwibm90X3ZhbGlkXCIsIHlpZWxkIFtmWzBdLCB2b2lkIDBdKSA6IGkgJiYgKHUgPSBmWzFdLCBjID09PSB2b2lkIDAgPyBzID0gdSA6IHMgaW5zdGFuY2VvZiBNYXAgPyBzLnNldChjLCB1KSA6IHMgaW5zdGFuY2VvZiBTZXQgPyBzLmFkZCh1KSA6IENpKHMpICYmICh1ICE9PSB2b2lkIDAgfHwgYyBpbiBzKSAmJiAoc1tjXSA9IHUpKTtcbiAgfVxuICBpZiAobCAhPT0gXCJub3RfdmFsaWRcIilcbiAgICBmb3IgKGNvbnN0IGMgb2YgZS5yZWZpbmVyKHMsIGEpKVxuICAgICAgYy5leHBsYW5hdGlvbiA9IHQubWVzc2FnZSwgbCA9IFwibm90X3JlZmluZWRcIiwgeWllbGQgW2MsIHZvaWQgMF07XG4gIGwgPT09IFwidmFsaWRcIiAmJiAoeWllbGQgW3ZvaWQgMCwgc10pO1xufVxubGV0IGVzID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgY29uc3QgeyB0eXBlOiB0LCBzY2hlbWE6IHIsIHZhbGlkYXRvcjogbiwgcmVmaW5lcjogaSwgY29lcmNlcjogbyA9IChsKSA9PiBsLCBlbnRyaWVzOiBhID0gZnVuY3Rpb24qICgpIHtcbiAgICB9IH0gPSBlO1xuICAgIHRoaXMudHlwZSA9IHQsIHRoaXMuc2NoZW1hID0gciwgdGhpcy5lbnRyaWVzID0gYSwgdGhpcy5jb2VyY2VyID0gbywgbiA/IHRoaXMudmFsaWRhdG9yID0gKGwsIGMpID0+IHtcbiAgICAgIGNvbnN0IHUgPSBuKGwsIGMpO1xuICAgICAgcmV0dXJuIENkKHUsIGMsIHRoaXMsIGwpO1xuICAgIH0gOiB0aGlzLnZhbGlkYXRvciA9ICgpID0+IFtdLCBpID8gdGhpcy5yZWZpbmVyID0gKGwsIGMpID0+IHtcbiAgICAgIGNvbnN0IHUgPSBpKGwsIGMpO1xuICAgICAgcmV0dXJuIENkKHUsIGMsIHRoaXMsIGwpO1xuICAgIH0gOiB0aGlzLnJlZmluZXIgPSAoKSA9PiBbXTtcbiAgfVxuICAvKipcbiAgICogQXNzZXJ0IHRoYXQgYSB2YWx1ZSBwYXNzZXMgdGhlIHN0cnVjdCdzIHZhbGlkYXRpb24sIHRocm93aW5nIGlmIGl0IGRvZXNuJ3QuXG4gICAqL1xuICBhc3NlcnQoZSwgdCkge1xuICAgIHJldHVybiB4dihlLCB0aGlzLCB0KTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgdmFsdWUgd2l0aCB0aGUgc3RydWN0J3MgY29lcmNpb24gbG9naWMsIHRoZW4gdmFsaWRhdGUgaXQuXG4gICAqL1xuICBjcmVhdGUoZSwgdCkge1xuICAgIHJldHVybiB0aShlLCB0aGlzLCB0KTtcbiAgfVxuICAvKipcbiAgICogQ2hlY2sgaWYgYSB2YWx1ZSBwYXNzZXMgdGhlIHN0cnVjdCdzIHZhbGlkYXRpb24uXG4gICAqL1xuICBpcyhlKSB7XG4gICAgcmV0dXJuIGIwKGUsIHRoaXMpO1xuICB9XG4gIC8qKlxuICAgKiBNYXNrIGEgdmFsdWUsIGNvZXJjaW5nIGFuZCB2YWxpZGF0aW5nIGl0LCBidXQgcmV0dXJuaW5nIG9ubHkgdGhlIHN1YnNldCBvZlxuICAgKiBwcm9wZXJ0aWVzIGRlZmluZWQgYnkgdGhlIHN0cnVjdCdzIHNjaGVtYS4gTWFza2luZyBhcHBsaWVzIHJlY3Vyc2l2ZWx5IHRvXG4gICAqIHByb3BzIG9mIGBvYmplY3RgIHN0cnVjdHMgb25seS5cbiAgICovXG4gIG1hc2soZSwgdCkge1xuICAgIHJldHVybiBTdihlLCB0aGlzLCB0KTtcbiAgfVxuICAvKipcbiAgICogVmFsaWRhdGUgYSB2YWx1ZSB3aXRoIHRoZSBzdHJ1Y3QncyB2YWxpZGF0aW9uIGxvZ2ljLCByZXR1cm5pbmcgYSB0dXBsZVxuICAgKiByZXByZXNlbnRpbmcgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogWW91IG1heSBvcHRpb25hbGx5IHBhc3MgYHRydWVgIGZvciB0aGUgYGNvZXJjZWAgYXJndW1lbnQgdG8gY29lcmNlXG4gICAqIHRoZSB2YWx1ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byB2YWxpZGF0ZSBpdC4gSWYgeW91IGRvLCB0aGUgcmVzdWx0IHdpbGxcbiAgICogY29udGFpbiB0aGUgY29lcmNlZCByZXN1bHQgd2hlbiBzdWNjZXNzZnVsLiBBbHNvLCBgbWFza2Agd2lsbCB0dXJuIG9uXG4gICAqIG1hc2tpbmcgb2YgdGhlIHVua25vd24gYG9iamVjdGAgcHJvcHMgcmVjdXJzaXZlbHkgaWYgcGFzc2VkLlxuICAgKi9cbiAgdmFsaWRhdGUoZSwgdCA9IHt9KSB7XG4gICAgcmV0dXJuIGtpKGUsIHRoaXMsIHQpO1xuICB9XG59O1xuZnVuY3Rpb24geHYocywgZSwgdCkge1xuICBjb25zdCByID0ga2kocywgZSwgeyBtZXNzYWdlOiB0IH0pO1xuICBpZiAoclswXSlcbiAgICB0aHJvdyByWzBdO1xufVxuZnVuY3Rpb24gdGkocywgZSwgdCkge1xuICBjb25zdCByID0ga2kocywgZSwgeyBjb2VyY2U6ICEwLCBtZXNzYWdlOiB0IH0pO1xuICBpZiAoclswXSlcbiAgICB0aHJvdyByWzBdO1xuICByZXR1cm4gclsxXTtcbn1cbmZ1bmN0aW9uIFN2KHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IGtpKHMsIGUsIHsgY29lcmNlOiAhMCwgbWFzazogITAsIG1lc3NhZ2U6IHQgfSk7XG4gIGlmIChyWzBdKVxuICAgIHRocm93IHJbMF07XG4gIHJldHVybiByWzFdO1xufVxuZnVuY3Rpb24gYjAocywgZSkge1xuICByZXR1cm4gIWtpKHMsIGUpWzBdO1xufVxuZnVuY3Rpb24ga2kocywgZSwgdCA9IHt9KSB7XG4gIGNvbnN0IHIgPSBKYyhzLCBlLCB0KSwgbiA9IHZ2KHIpO1xuICByZXR1cm4gblswXSA/IFtuZXcgbXYoblswXSwgZnVuY3Rpb24qICgpIHtcbiAgICBmb3IgKGNvbnN0IG8gb2YgcilcbiAgICAgIG9bMF0gJiYgKHlpZWxkIG9bMF0pO1xuICB9KSwgdm9pZCAwXSA6IFt2b2lkIDAsIG5bMV1dO1xufVxuZnVuY3Rpb24gdG4ocywgZSkge1xuICByZXR1cm4gbmV3IGVzKHsgdHlwZTogcywgc2NoZW1hOiBudWxsLCB2YWxpZGF0b3I6IGUgfSk7XG59XG5mdW5jdGlvbiBidigpIHtcbiAgcmV0dXJuIHRuKFwiYW55XCIsICgpID0+ICEwKTtcbn1cbmZ1bmN0aW9uIGZlKHMpIHtcbiAgcmV0dXJuIG5ldyBlcyh7XG4gICAgdHlwZTogXCJhcnJheVwiLFxuICAgIHNjaGVtYTogcyxcbiAgICAqZW50cmllcyhlKSB7XG4gICAgICBpZiAocyAmJiBBcnJheS5pc0FycmF5KGUpKVxuICAgICAgICBmb3IgKGNvbnN0IFt0LCByXSBvZiBlLmVudHJpZXMoKSlcbiAgICAgICAgICB5aWVsZCBbdCwgciwgc107XG4gICAgfSxcbiAgICBjb2VyY2VyKGUpIHtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KGUpID8gZS5zbGljZSgpIDogZTtcbiAgICB9LFxuICAgIHZhbGlkYXRvcihlKSB7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheShlKSB8fCBgRXhwZWN0ZWQgYW4gYXJyYXkgdmFsdWUsIGJ1dCByZWNlaXZlZDogJHtCcihlKX1gO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBYcigpIHtcbiAgcmV0dXJuIHRuKFwiYm9vbGVhblwiLCAocykgPT4gdHlwZW9mIHMgPT0gXCJib29sZWFuXCIpO1xufVxuZnVuY3Rpb24gUWMocykge1xuICByZXR1cm4gdG4oXCJpbnN0YW5jZVwiLCAoZSkgPT4gZSBpbnN0YW5jZW9mIHMgfHwgYEV4cGVjdGVkIGEgXFxgJHtzLm5hbWV9XFxgIGluc3RhbmNlLCBidXQgcmVjZWl2ZWQ6ICR7QnIoZSl9YCk7XG59XG5mdW5jdGlvbiBwdChzKSB7XG4gIGNvbnN0IGUgPSBCcihzKSwgdCA9IHR5cGVvZiBzO1xuICByZXR1cm4gbmV3IGVzKHtcbiAgICB0eXBlOiBcImxpdGVyYWxcIixcbiAgICBzY2hlbWE6IHQgPT09IFwic3RyaW5nXCIgfHwgdCA9PT0gXCJudW1iZXJcIiB8fCB0ID09PSBcImJvb2xlYW5cIiA/IHMgOiBudWxsLFxuICAgIHZhbGlkYXRvcihyKSB7XG4gICAgICByZXR1cm4gciA9PT0gcyB8fCBgRXhwZWN0ZWQgdGhlIGxpdGVyYWwgXFxgJHtlfVxcYCwgYnV0IHJlY2VpdmVkOiAke0JyKHIpfWA7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIFR2KCkge1xuICByZXR1cm4gdG4oXCJuZXZlclwiLCAoKSA9PiAhMSk7XG59XG5mdW5jdGlvbiBnZShzKSB7XG4gIHJldHVybiBuZXcgZXMoe1xuICAgIC4uLnMsXG4gICAgdmFsaWRhdG9yOiAoZSwgdCkgPT4gZSA9PT0gbnVsbCB8fCBzLnZhbGlkYXRvcihlLCB0KSxcbiAgICByZWZpbmVyOiAoZSwgdCkgPT4gZSA9PT0gbnVsbCB8fCBzLnJlZmluZXIoZSwgdClcbiAgfSk7XG59XG5mdW5jdGlvbiB0ZSgpIHtcbiAgcmV0dXJuIHRuKFwibnVtYmVyXCIsIChzKSA9PiB0eXBlb2YgcyA9PSBcIm51bWJlclwiICYmICFpc05hTihzKSB8fCBgRXhwZWN0ZWQgYSBudW1iZXIsIGJ1dCByZWNlaXZlZDogJHtCcihzKX1gKTtcbn1cbmZ1bmN0aW9uIFNlKHMpIHtcbiAgcmV0dXJuIG5ldyBlcyh7XG4gICAgLi4ucyxcbiAgICB2YWxpZGF0b3I6IChlLCB0KSA9PiBlID09PSB2b2lkIDAgfHwgcy52YWxpZGF0b3IoZSwgdCksXG4gICAgcmVmaW5lcjogKGUsIHQpID0+IGUgPT09IHZvaWQgMCB8fCBzLnJlZmluZXIoZSwgdClcbiAgfSk7XG59XG5mdW5jdGlvbiBUMChzLCBlKSB7XG4gIHJldHVybiBuZXcgZXMoe1xuICAgIHR5cGU6IFwicmVjb3JkXCIsXG4gICAgc2NoZW1hOiBudWxsLFxuICAgICplbnRyaWVzKHQpIHtcbiAgICAgIGlmIChDaSh0KSlcbiAgICAgICAgZm9yIChjb25zdCByIGluIHQpIHtcbiAgICAgICAgICBjb25zdCBuID0gdFtyXTtcbiAgICAgICAgICB5aWVsZCBbciwgciwgc10sIHlpZWxkIFtyLCBuLCBlXTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgdmFsaWRhdG9yKHQpIHtcbiAgICAgIHJldHVybiAkbyh0KSB8fCBgRXhwZWN0ZWQgYW4gb2JqZWN0LCBidXQgcmVjZWl2ZWQ6ICR7QnIodCl9YDtcbiAgICB9LFxuICAgIGNvZXJjZXIodCkge1xuICAgICAgcmV0dXJuICRvKHQpID8geyAuLi50IH0gOiB0O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBjZSgpIHtcbiAgcmV0dXJuIHRuKFwic3RyaW5nXCIsIChzKSA9PiB0eXBlb2YgcyA9PSBcInN0cmluZ1wiIHx8IGBFeHBlY3RlZCBhIHN0cmluZywgYnV0IHJlY2VpdmVkOiAke0JyKHMpfWApO1xufVxuZnVuY3Rpb24gZXUocykge1xuICBjb25zdCBlID0gVHYoKTtcbiAgcmV0dXJuIG5ldyBlcyh7XG4gICAgdHlwZTogXCJ0dXBsZVwiLFxuICAgIHNjaGVtYTogbnVsbCxcbiAgICAqZW50cmllcyh0KSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh0KSkge1xuICAgICAgICBjb25zdCByID0gTWF0aC5tYXgocy5sZW5ndGgsIHQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCByOyBuKyspXG4gICAgICAgICAgeWllbGQgW24sIHRbbl0sIHNbbl0gfHwgZV07XG4gICAgICB9XG4gICAgfSxcbiAgICB2YWxpZGF0b3IodCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgfHwgYEV4cGVjdGVkIGFuIGFycmF5LCBidXQgcmVjZWl2ZWQ6ICR7QnIodCl9YDtcbiAgICB9LFxuICAgIGNvZXJjZXIodCkge1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodCkgPyB0LnNsaWNlKCkgOiB0O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBvZShzKSB7XG4gIGNvbnN0IGUgPSBPYmplY3Qua2V5cyhzKTtcbiAgcmV0dXJuIG5ldyBlcyh7XG4gICAgdHlwZTogXCJ0eXBlXCIsXG4gICAgc2NoZW1hOiBzLFxuICAgICplbnRyaWVzKHQpIHtcbiAgICAgIGlmIChDaSh0KSlcbiAgICAgICAgZm9yIChjb25zdCByIG9mIGUpXG4gICAgICAgICAgeWllbGQgW3IsIHRbcl0sIHNbcl1dO1xuICAgIH0sXG4gICAgdmFsaWRhdG9yKHQpIHtcbiAgICAgIHJldHVybiAkbyh0KSB8fCBgRXhwZWN0ZWQgYW4gb2JqZWN0LCBidXQgcmVjZWl2ZWQ6ICR7QnIodCl9YDtcbiAgICB9LFxuICAgIGNvZXJjZXIodCkge1xuICAgICAgcmV0dXJuICRvKHQpID8geyAuLi50IH0gOiB0O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiB1cihzKSB7XG4gIGNvbnN0IGUgPSBzLm1hcCgodCkgPT4gdC50eXBlKS5qb2luKFwiIHwgXCIpO1xuICByZXR1cm4gbmV3IGVzKHtcbiAgICB0eXBlOiBcInVuaW9uXCIsXG4gICAgc2NoZW1hOiBudWxsLFxuICAgIGNvZXJjZXIodCwgcikge1xuICAgICAgZm9yIChjb25zdCBuIG9mIHMpIHtcbiAgICAgICAgY29uc3QgW2ksIG9dID0gbi52YWxpZGF0ZSh0LCB7XG4gICAgICAgICAgY29lcmNlOiAhMCxcbiAgICAgICAgICBtYXNrOiByLm1hc2tcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghaSlcbiAgICAgICAgICByZXR1cm4gbztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0O1xuICAgIH0sXG4gICAgdmFsaWRhdG9yKHQsIHIpIHtcbiAgICAgIGNvbnN0IG4gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBzKSB7XG4gICAgICAgIGNvbnN0IFsuLi5vXSA9IEpjKHQsIGksIHIpLCBbYV0gPSBvO1xuICAgICAgICBpZiAoYVswXSlcbiAgICAgICAgICBmb3IgKGNvbnN0IFtsXSBvZiBvKVxuICAgICAgICAgICAgbCAmJiBuLnB1c2gobCk7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gW1xuICAgICAgICBgRXhwZWN0ZWQgdGhlIHZhbHVlIHRvIHNhdGlzZnkgYSB1bmlvbiBvZiBcXGAke2V9XFxgLCBidXQgcmVjZWl2ZWQ6ICR7QnIodCl9YCxcbiAgICAgICAgLi4ublxuICAgICAgXTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gR24oKSB7XG4gIHJldHVybiB0bihcInVua25vd25cIiwgKCkgPT4gITApO1xufVxuZnVuY3Rpb24gRGkocywgZSwgdCkge1xuICByZXR1cm4gbmV3IGVzKHtcbiAgICAuLi5zLFxuICAgIGNvZXJjZXI6IChyLCBuKSA9PiBiMChyLCBlKSA/IHMuY29lcmNlcih0KHIsIG4pLCBuKSA6IHMuY29lcmNlcihyLCBuKVxuICB9KTtcbn1cbnZhciAkaSwgd3YgPSBuZXcgVWludDhBcnJheSgxNik7XG5mdW5jdGlvbiB3MCgpIHtcbiAgaWYgKCEkaSAmJiAoJGkgPSB0eXBlb2YgY3J5cHRvIDwgXCJ1XCIgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyAmJiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzLmJpbmQoY3J5cHRvKSB8fCB0eXBlb2YgbXNDcnlwdG8gPCBcInVcIiAmJiB0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09IFwiZnVuY3Rpb25cIiAmJiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMuYmluZChtc0NyeXB0byksICEkaSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY3J5cHRvLmdldFJhbmRvbVZhbHVlcygpIG5vdCBzdXBwb3J0ZWQuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQjZ2V0cmFuZG9tdmFsdWVzLW5vdC1zdXBwb3J0ZWRcIik7XG4gIHJldHVybiAkaSh3dik7XG59XG5jb25zdCBBdiA9IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTtcbmZ1bmN0aW9uIHVhKHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBzID09IFwic3RyaW5nXCIgJiYgQXYudGVzdChzKTtcbn1cbnZhciBZdCA9IFtdO1xuZm9yICh2YXIgUWEgPSAwOyBRYSA8IDI1NjsgKytRYSlcbiAgWXQucHVzaCgoUWEgKyAyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSkpO1xuZnVuY3Rpb24gZGEocykge1xuICB2YXIgZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdm9pZCAwID8gYXJndW1lbnRzWzFdIDogMCwgdCA9IChZdFtzW2UgKyAwXV0gKyBZdFtzW2UgKyAxXV0gKyBZdFtzW2UgKyAyXV0gKyBZdFtzW2UgKyAzXV0gKyBcIi1cIiArIFl0W3NbZSArIDRdXSArIFl0W3NbZSArIDVdXSArIFwiLVwiICsgWXRbc1tlICsgNl1dICsgWXRbc1tlICsgN11dICsgXCItXCIgKyBZdFtzW2UgKyA4XV0gKyBZdFtzW2UgKyA5XV0gKyBcIi1cIiArIFl0W3NbZSArIDEwXV0gKyBZdFtzW2UgKyAxMV1dICsgWXRbc1tlICsgMTJdXSArIFl0W3NbZSArIDEzXV0gKyBZdFtzW2UgKyAxNF1dICsgWXRbc1tlICsgMTVdXSkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCF1YSh0KSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWRcIik7XG4gIHJldHVybiB0O1xufVxudmFyIGtkLCBlbCwgdGwgPSAwLCBybCA9IDA7XG5mdW5jdGlvbiBJdihzLCBlLCB0KSB7XG4gIHZhciByID0gZSAmJiB0IHx8IDAsIG4gPSBlIHx8IG5ldyBBcnJheSgxNik7XG4gIHMgPSBzIHx8IHt9O1xuICB2YXIgaSA9IHMubm9kZSB8fCBrZCwgbyA9IHMuY2xvY2tzZXEgIT09IHZvaWQgMCA/IHMuY2xvY2tzZXEgOiBlbDtcbiAgaWYgKGkgPT0gbnVsbCB8fCBvID09IG51bGwpIHtcbiAgICB2YXIgYSA9IHMucmFuZG9tIHx8IChzLnJuZyB8fCB3MCkoKTtcbiAgICBpID09IG51bGwgJiYgKGkgPSBrZCA9IFthWzBdIHwgMSwgYVsxXSwgYVsyXSwgYVszXSwgYVs0XSwgYVs1XV0pLCBvID09IG51bGwgJiYgKG8gPSBlbCA9IChhWzZdIDw8IDggfCBhWzddKSAmIDE2MzgzKTtcbiAgfVxuICB2YXIgbCA9IHMubXNlY3MgIT09IHZvaWQgMCA/IHMubXNlY3MgOiBEYXRlLm5vdygpLCBjID0gcy5uc2VjcyAhPT0gdm9pZCAwID8gcy5uc2VjcyA6IHJsICsgMSwgdSA9IGwgLSB0bCArIChjIC0gcmwpIC8gMWU0O1xuICBpZiAodSA8IDAgJiYgcy5jbG9ja3NlcSA9PT0gdm9pZCAwICYmIChvID0gbyArIDEgJiAxNjM4MyksICh1IDwgMCB8fCBsID4gdGwpICYmIHMubnNlY3MgPT09IHZvaWQgMCAmJiAoYyA9IDApLCBjID49IDFlNClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlY1wiKTtcbiAgdGwgPSBsLCBybCA9IGMsIGVsID0gbywgbCArPSAxMjIxOTI5MjhlNTtcbiAgdmFyIGQgPSAoKGwgJiAyNjg0MzU0NTUpICogMWU0ICsgYykgJSA0Mjk0OTY3Mjk2O1xuICBuW3IrK10gPSBkID4+PiAyNCAmIDI1NSwgbltyKytdID0gZCA+Pj4gMTYgJiAyNTUsIG5bcisrXSA9IGQgPj4+IDggJiAyNTUsIG5bcisrXSA9IGQgJiAyNTU7XG4gIHZhciBoID0gbCAvIDQyOTQ5NjcyOTYgKiAxZTQgJiAyNjg0MzU0NTU7XG4gIG5bcisrXSA9IGggPj4+IDggJiAyNTUsIG5bcisrXSA9IGggJiAyNTUsIG5bcisrXSA9IGggPj4+IDI0ICYgMTUgfCAxNiwgbltyKytdID0gaCA+Pj4gMTYgJiAyNTUsIG5bcisrXSA9IG8gPj4+IDggfCAxMjgsIG5bcisrXSA9IG8gJiAyNTU7XG4gIGZvciAodmFyIGYgPSAwOyBmIDwgNjsgKytmKVxuICAgIG5bciArIGZdID0gaVtmXTtcbiAgcmV0dXJuIGUgfHwgZGEobik7XG59XG5mdW5jdGlvbiBBMChzKSB7XG4gIGlmICghdWEocykpXG4gICAgdGhyb3cgVHlwZUVycm9yKFwiSW52YWxpZCBVVUlEXCIpO1xuICB2YXIgZSwgdCA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgcmV0dXJuIHRbMF0gPSAoZSA9IHBhcnNlSW50KHMuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0LCB0WzFdID0gZSA+Pj4gMTYgJiAyNTUsIHRbMl0gPSBlID4+PiA4ICYgMjU1LCB0WzNdID0gZSAmIDI1NSwgdFs0XSA9IChlID0gcGFyc2VJbnQocy5zbGljZSg5LCAxMyksIDE2KSkgPj4+IDgsIHRbNV0gPSBlICYgMjU1LCB0WzZdID0gKGUgPSBwYXJzZUludChzLnNsaWNlKDE0LCAxOCksIDE2KSkgPj4+IDgsIHRbN10gPSBlICYgMjU1LCB0WzhdID0gKGUgPSBwYXJzZUludChzLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDgsIHRbOV0gPSBlICYgMjU1LCB0WzEwXSA9IChlID0gcGFyc2VJbnQocy5zbGljZSgyNCwgMzYpLCAxNikpIC8gMTA5OTUxMTYyNzc3NiAmIDI1NSwgdFsxMV0gPSBlIC8gNDI5NDk2NzI5NiAmIDI1NSwgdFsxMl0gPSBlID4+PiAyNCAmIDI1NSwgdFsxM10gPSBlID4+PiAxNiAmIDI1NSwgdFsxNF0gPSBlID4+PiA4ICYgMjU1LCB0WzE1XSA9IGUgJiAyNTUsIHQ7XG59XG5mdW5jdGlvbiBfdihzKSB7XG4gIHMgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQocykpO1xuICBmb3IgKHZhciBlID0gW10sIHQgPSAwOyB0IDwgcy5sZW5ndGg7ICsrdClcbiAgICBlLnB1c2gocy5jaGFyQ29kZUF0KHQpKTtcbiAgcmV0dXJuIGU7XG59XG52YXIgUnYgPSBcIjZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOFwiLCBMdiA9IFwiNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4XCI7XG5mdW5jdGlvbiBJMChzLCBlLCB0KSB7XG4gIGZ1bmN0aW9uIHIobiwgaSwgbywgYSkge1xuICAgIGlmICh0eXBlb2YgbiA9PSBcInN0cmluZ1wiICYmIChuID0gX3YobikpLCB0eXBlb2YgaSA9PSBcInN0cmluZ1wiICYmIChpID0gQTAoaSkpLCBpLmxlbmd0aCAhPT0gMTYpXG4gICAgICB0aHJvdyBUeXBlRXJyb3IoXCJOYW1lc3BhY2UgbXVzdCBiZSBhcnJheS1saWtlICgxNiBpdGVyYWJsZSBpbnRlZ2VyIHZhbHVlcywgMC0yNTUpXCIpO1xuICAgIHZhciBsID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyBuLmxlbmd0aCk7XG4gICAgaWYgKGwuc2V0KGkpLCBsLnNldChuLCBpLmxlbmd0aCksIGwgPSB0KGwpLCBsWzZdID0gbFs2XSAmIDE1IHwgZSwgbFs4XSA9IGxbOF0gJiA2MyB8IDEyOCwgbykge1xuICAgICAgYSA9IGEgfHwgMDtcbiAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgMTY7ICsrYylcbiAgICAgICAgb1thICsgY10gPSBsW2NdO1xuICAgICAgcmV0dXJuIG87XG4gICAgfVxuICAgIHJldHVybiBkYShsKTtcbiAgfVxuICB0cnkge1xuICAgIHIubmFtZSA9IHM7XG4gIH0gY2F0Y2gge1xuICB9XG4gIHJldHVybiByLkROUyA9IFJ2LCByLlVSTCA9IEx2LCByO1xufVxuZnVuY3Rpb24gQ3Yocykge1xuICBpZiAodHlwZW9mIHMgPT0gXCJzdHJpbmdcIikge1xuICAgIHZhciBlID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHMpKTtcbiAgICBzID0gbmV3IFVpbnQ4QXJyYXkoZS5sZW5ndGgpO1xuICAgIGZvciAodmFyIHQgPSAwOyB0IDwgZS5sZW5ndGg7ICsrdClcbiAgICAgIHNbdF0gPSBlLmNoYXJDb2RlQXQodCk7XG4gIH1cbiAgcmV0dXJuIGt2KER2KFB2KHMpLCBzLmxlbmd0aCAqIDgpKTtcbn1cbmZ1bmN0aW9uIGt2KHMpIHtcbiAgZm9yICh2YXIgZSA9IFtdLCB0ID0gcy5sZW5ndGggKiAzMiwgciA9IFwiMDEyMzQ1Njc4OWFiY2RlZlwiLCBuID0gMDsgbiA8IHQ7IG4gKz0gOCkge1xuICAgIHZhciBpID0gc1tuID4+IDVdID4+PiBuICUgMzIgJiAyNTUsIG8gPSBwYXJzZUludChyLmNoYXJBdChpID4+PiA0ICYgMTUpICsgci5jaGFyQXQoaSAmIDE1KSwgMTYpO1xuICAgIGUucHVzaChvKTtcbiAgfVxuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIF8wKHMpIHtcbiAgcmV0dXJuIChzICsgNjQgPj4+IDkgPDwgNCkgKyAxNCArIDE7XG59XG5mdW5jdGlvbiBEdihzLCBlKSB7XG4gIHNbZSA+PiA1XSB8PSAxMjggPDwgZSAlIDMyLCBzW18wKGUpIC0gMV0gPSBlO1xuICBmb3IgKHZhciB0ID0gMTczMjU4NDE5MywgciA9IC0yNzE3MzM4NzksIG4gPSAtMTczMjU4NDE5NCwgaSA9IDI3MTczMzg3OCwgbyA9IDA7IG8gPCBzLmxlbmd0aDsgbyArPSAxNikge1xuICAgIHZhciBhID0gdCwgbCA9IHIsIGMgPSBuLCB1ID0gaTtcbiAgICB0ID0gZXIodCwgciwgbiwgaSwgc1tvXSwgNywgLTY4MDg3NjkzNiksIGkgPSBlcihpLCB0LCByLCBuLCBzW28gKyAxXSwgMTIsIC0zODk1NjQ1ODYpLCBuID0gZXIobiwgaSwgdCwgciwgc1tvICsgMl0sIDE3LCA2MDYxMDU4MTkpLCByID0gZXIociwgbiwgaSwgdCwgc1tvICsgM10sIDIyLCAtMTA0NDUyNTMzMCksIHQgPSBlcih0LCByLCBuLCBpLCBzW28gKyA0XSwgNywgLTE3NjQxODg5NyksIGkgPSBlcihpLCB0LCByLCBuLCBzW28gKyA1XSwgMTIsIDEyMDAwODA0MjYpLCBuID0gZXIobiwgaSwgdCwgciwgc1tvICsgNl0sIDE3LCAtMTQ3MzIzMTM0MSksIHIgPSBlcihyLCBuLCBpLCB0LCBzW28gKyA3XSwgMjIsIC00NTcwNTk4MyksIHQgPSBlcih0LCByLCBuLCBpLCBzW28gKyA4XSwgNywgMTc3MDAzNTQxNiksIGkgPSBlcihpLCB0LCByLCBuLCBzW28gKyA5XSwgMTIsIC0xOTU4NDE0NDE3KSwgbiA9IGVyKG4sIGksIHQsIHIsIHNbbyArIDEwXSwgMTcsIC00MjA2MyksIHIgPSBlcihyLCBuLCBpLCB0LCBzW28gKyAxMV0sIDIyLCAtMTk5MDQwNDE2MiksIHQgPSBlcih0LCByLCBuLCBpLCBzW28gKyAxMl0sIDcsIDE4MDQ2MDM2ODIpLCBpID0gZXIoaSwgdCwgciwgbiwgc1tvICsgMTNdLCAxMiwgLTQwMzQxMTAxKSwgbiA9IGVyKG4sIGksIHQsIHIsIHNbbyArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKSwgciA9IGVyKHIsIG4sIGksIHQsIHNbbyArIDE1XSwgMjIsIDEyMzY1MzUzMjkpLCB0ID0gdHIodCwgciwgbiwgaSwgc1tvICsgMV0sIDUsIC0xNjU3OTY1MTApLCBpID0gdHIoaSwgdCwgciwgbiwgc1tvICsgNl0sIDksIC0xMDY5NTAxNjMyKSwgbiA9IHRyKG4sIGksIHQsIHIsIHNbbyArIDExXSwgMTQsIDY0MzcxNzcxMyksIHIgPSB0cihyLCBuLCBpLCB0LCBzW29dLCAyMCwgLTM3Mzg5NzMwMiksIHQgPSB0cih0LCByLCBuLCBpLCBzW28gKyA1XSwgNSwgLTcwMTU1ODY5MSksIGkgPSB0cihpLCB0LCByLCBuLCBzW28gKyAxMF0sIDksIDM4MDE2MDgzKSwgbiA9IHRyKG4sIGksIHQsIHIsIHNbbyArIDE1XSwgMTQsIC02NjA0NzgzMzUpLCByID0gdHIociwgbiwgaSwgdCwgc1tvICsgNF0sIDIwLCAtNDA1NTM3ODQ4KSwgdCA9IHRyKHQsIHIsIG4sIGksIHNbbyArIDldLCA1LCA1Njg0NDY0MzgpLCBpID0gdHIoaSwgdCwgciwgbiwgc1tvICsgMTRdLCA5LCAtMTAxOTgwMzY5MCksIG4gPSB0cihuLCBpLCB0LCByLCBzW28gKyAzXSwgMTQsIC0xODczNjM5NjEpLCByID0gdHIociwgbiwgaSwgdCwgc1tvICsgOF0sIDIwLCAxMTYzNTMxNTAxKSwgdCA9IHRyKHQsIHIsIG4sIGksIHNbbyArIDEzXSwgNSwgLTE0NDQ2ODE0NjcpLCBpID0gdHIoaSwgdCwgciwgbiwgc1tvICsgMl0sIDksIC01MTQwMzc4NCksIG4gPSB0cihuLCBpLCB0LCByLCBzW28gKyA3XSwgMTQsIDE3MzUzMjg0NzMpLCByID0gdHIociwgbiwgaSwgdCwgc1tvICsgMTJdLCAyMCwgLTE5MjY2MDc3MzQpLCB0ID0gcnIodCwgciwgbiwgaSwgc1tvICsgNV0sIDQsIC0zNzg1NTgpLCBpID0gcnIoaSwgdCwgciwgbiwgc1tvICsgOF0sIDExLCAtMjAyMjU3NDQ2MyksIG4gPSBycihuLCBpLCB0LCByLCBzW28gKyAxMV0sIDE2LCAxODM5MDMwNTYyKSwgciA9IHJyKHIsIG4sIGksIHQsIHNbbyArIDE0XSwgMjMsIC0zNTMwOTU1NiksIHQgPSBycih0LCByLCBuLCBpLCBzW28gKyAxXSwgNCwgLTE1MzA5OTIwNjApLCBpID0gcnIoaSwgdCwgciwgbiwgc1tvICsgNF0sIDExLCAxMjcyODkzMzUzKSwgbiA9IHJyKG4sIGksIHQsIHIsIHNbbyArIDddLCAxNiwgLTE1NTQ5NzYzMiksIHIgPSBycihyLCBuLCBpLCB0LCBzW28gKyAxMF0sIDIzLCAtMTA5NDczMDY0MCksIHQgPSBycih0LCByLCBuLCBpLCBzW28gKyAxM10sIDQsIDY4MTI3OTE3NCksIGkgPSBycihpLCB0LCByLCBuLCBzW29dLCAxMSwgLTM1ODUzNzIyMiksIG4gPSBycihuLCBpLCB0LCByLCBzW28gKyAzXSwgMTYsIC03MjI1MjE5NzkpLCByID0gcnIociwgbiwgaSwgdCwgc1tvICsgNl0sIDIzLCA3NjAyOTE4OSksIHQgPSBycih0LCByLCBuLCBpLCBzW28gKyA5XSwgNCwgLTY0MDM2NDQ4NyksIGkgPSBycihpLCB0LCByLCBuLCBzW28gKyAxMl0sIDExLCAtNDIxODE1ODM1KSwgbiA9IHJyKG4sIGksIHQsIHIsIHNbbyArIDE1XSwgMTYsIDUzMDc0MjUyMCksIHIgPSBycihyLCBuLCBpLCB0LCBzW28gKyAyXSwgMjMsIC05OTUzMzg2NTEpLCB0ID0gc3IodCwgciwgbiwgaSwgc1tvXSwgNiwgLTE5ODYzMDg0NCksIGkgPSBzcihpLCB0LCByLCBuLCBzW28gKyA3XSwgMTAsIDExMjY4OTE0MTUpLCBuID0gc3IobiwgaSwgdCwgciwgc1tvICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpLCByID0gc3IociwgbiwgaSwgdCwgc1tvICsgNV0sIDIxLCAtNTc0MzQwNTUpLCB0ID0gc3IodCwgciwgbiwgaSwgc1tvICsgMTJdLCA2LCAxNzAwNDg1NTcxKSwgaSA9IHNyKGksIHQsIHIsIG4sIHNbbyArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpLCBuID0gc3IobiwgaSwgdCwgciwgc1tvICsgMTBdLCAxNSwgLTEwNTE1MjMpLCByID0gc3IociwgbiwgaSwgdCwgc1tvICsgMV0sIDIxLCAtMjA1NDkyMjc5OSksIHQgPSBzcih0LCByLCBuLCBpLCBzW28gKyA4XSwgNiwgMTg3MzMxMzM1OSksIGkgPSBzcihpLCB0LCByLCBuLCBzW28gKyAxNV0sIDEwLCAtMzA2MTE3NDQpLCBuID0gc3IobiwgaSwgdCwgciwgc1tvICsgNl0sIDE1LCAtMTU2MDE5ODM4MCksIHIgPSBzcihyLCBuLCBpLCB0LCBzW28gKyAxM10sIDIxLCAxMzA5MTUxNjQ5KSwgdCA9IHNyKHQsIHIsIG4sIGksIHNbbyArIDRdLCA2LCAtMTQ1NTIzMDcwKSwgaSA9IHNyKGksIHQsIHIsIG4sIHNbbyArIDExXSwgMTAsIC0xMTIwMjEwMzc5KSwgbiA9IHNyKG4sIGksIHQsIHIsIHNbbyArIDJdLCAxNSwgNzE4Nzg3MjU5KSwgciA9IHNyKHIsIG4sIGksIHQsIHNbbyArIDldLCAyMSwgLTM0MzQ4NTU1MSksIHQgPSBMcyh0LCBhKSwgciA9IExzKHIsIGwpLCBuID0gTHMobiwgYyksIGkgPSBMcyhpLCB1KTtcbiAgfVxuICByZXR1cm4gW3QsIHIsIG4sIGldO1xufVxuZnVuY3Rpb24gUHYocykge1xuICBpZiAocy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuIFtdO1xuICBmb3IgKHZhciBlID0gcy5sZW5ndGggKiA4LCB0ID0gbmV3IFVpbnQzMkFycmF5KF8wKGUpKSwgciA9IDA7IHIgPCBlOyByICs9IDgpXG4gICAgdFtyID4+IDVdIHw9IChzW3IgLyA4XSAmIDI1NSkgPDwgciAlIDMyO1xuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIExzKHMsIGUpIHtcbiAgdmFyIHQgPSAocyAmIDY1NTM1KSArIChlICYgNjU1MzUpLCByID0gKHMgPj4gMTYpICsgKGUgPj4gMTYpICsgKHQgPj4gMTYpO1xuICByZXR1cm4gciA8PCAxNiB8IHQgJiA2NTUzNTtcbn1cbmZ1bmN0aW9uIE12KHMsIGUpIHtcbiAgcmV0dXJuIHMgPDwgZSB8IHMgPj4+IDMyIC0gZTtcbn1cbmZ1bmN0aW9uIGhhKHMsIGUsIHQsIHIsIG4sIGkpIHtcbiAgcmV0dXJuIExzKE12KExzKExzKGUsIHMpLCBMcyhyLCBpKSksIG4pLCB0KTtcbn1cbmZ1bmN0aW9uIGVyKHMsIGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgcmV0dXJuIGhhKGUgJiB0IHwgfmUgJiByLCBzLCBlLCBuLCBpLCBvKTtcbn1cbmZ1bmN0aW9uIHRyKHMsIGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgcmV0dXJuIGhhKGUgJiByIHwgdCAmIH5yLCBzLCBlLCBuLCBpLCBvKTtcbn1cbmZ1bmN0aW9uIHJyKHMsIGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgcmV0dXJuIGhhKGUgXiB0IF4gciwgcywgZSwgbiwgaSwgbyk7XG59XG5mdW5jdGlvbiBzcihzLCBlLCB0LCByLCBuLCBpLCBvKSB7XG4gIHJldHVybiBoYSh0IF4gKGUgfCB+ciksIHMsIGUsIG4sIGksIG8pO1xufVxudmFyIE92ID0gSTAoXCJ2M1wiLCA0OCwgQ3YpO1xuZnVuY3Rpb24gQnYocywgZSwgdCkge1xuICBzID0gcyB8fCB7fTtcbiAgdmFyIHIgPSBzLnJhbmRvbSB8fCAocy5ybmcgfHwgdzApKCk7XG4gIGlmIChyWzZdID0gcls2XSAmIDE1IHwgNjQsIHJbOF0gPSByWzhdICYgNjMgfCAxMjgsIGUpIHtcbiAgICB0ID0gdCB8fCAwO1xuICAgIGZvciAodmFyIG4gPSAwOyBuIDwgMTY7ICsrbilcbiAgICAgIGVbdCArIG5dID0gcltuXTtcbiAgICByZXR1cm4gZTtcbiAgfVxuICByZXR1cm4gZGEocik7XG59XG5mdW5jdGlvbiBGdihzLCBlLCB0LCByKSB7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBlICYgdCBeIH5lICYgcjtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZSBeIHQgXiByO1xuICAgIGNhc2UgMjpcbiAgICAgIHJldHVybiBlICYgdCBeIGUgJiByIF4gdCAmIHI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIGUgXiB0IF4gcjtcbiAgfVxufVxuZnVuY3Rpb24gc2wocywgZSkge1xuICByZXR1cm4gcyA8PCBlIHwgcyA+Pj4gMzIgLSBlO1xufVxuZnVuY3Rpb24gTnYocykge1xuICB2YXIgZSA9IFsxNTE4NTAwMjQ5LCAxODU5Nzc1MzkzLCAyNDAwOTU5NzA4LCAzMzk1NDY5NzgyXSwgdCA9IFsxNzMyNTg0MTkzLCA0MDIzMjMzNDE3LCAyNTYyMzgzMTAyLCAyNzE3MzM4NzgsIDMyODUzNzc1MjBdO1xuICBpZiAodHlwZW9mIHMgPT0gXCJzdHJpbmdcIikge1xuICAgIHZhciByID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHMpKTtcbiAgICBzID0gW107XG4gICAgZm9yICh2YXIgbiA9IDA7IG4gPCByLmxlbmd0aDsgKytuKVxuICAgICAgcy5wdXNoKHIuY2hhckNvZGVBdChuKSk7XG4gIH0gZWxzZSBBcnJheS5pc0FycmF5KHMpIHx8IChzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwocykpO1xuICBzLnB1c2goMTI4KTtcbiAgZm9yICh2YXIgaSA9IHMubGVuZ3RoIC8gNCArIDIsIG8gPSBNYXRoLmNlaWwoaSAvIDE2KSwgYSA9IG5ldyBBcnJheShvKSwgbCA9IDA7IGwgPCBvOyArK2wpIHtcbiAgICBmb3IgKHZhciBjID0gbmV3IFVpbnQzMkFycmF5KDE2KSwgdSA9IDA7IHUgPCAxNjsgKyt1KVxuICAgICAgY1t1XSA9IHNbbCAqIDY0ICsgdSAqIDRdIDw8IDI0IHwgc1tsICogNjQgKyB1ICogNCArIDFdIDw8IDE2IHwgc1tsICogNjQgKyB1ICogNCArIDJdIDw8IDggfCBzW2wgKiA2NCArIHUgKiA0ICsgM107XG4gICAgYVtsXSA9IGM7XG4gIH1cbiAgYVtvIC0gMV1bMTRdID0gKHMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpLCBhW28gLSAxXVsxNF0gPSBNYXRoLmZsb29yKGFbbyAtIDFdWzE0XSksIGFbbyAtIDFdWzE1XSA9IChzLmxlbmd0aCAtIDEpICogOCAmIDQyOTQ5NjcyOTU7XG4gIGZvciAodmFyIGQgPSAwOyBkIDwgbzsgKytkKSB7XG4gICAgZm9yICh2YXIgaCA9IG5ldyBVaW50MzJBcnJheSg4MCksIGYgPSAwOyBmIDwgMTY7ICsrZilcbiAgICAgIGhbZl0gPSBhW2RdW2ZdO1xuICAgIGZvciAodmFyIHAgPSAxNjsgcCA8IDgwOyArK3ApXG4gICAgICBoW3BdID0gc2woaFtwIC0gM10gXiBoW3AgLSA4XSBeIGhbcCAtIDE0XSBeIGhbcCAtIDE2XSwgMSk7XG4gICAgZm9yICh2YXIgeSA9IHRbMF0sIEUgPSB0WzFdLCBiID0gdFsyXSwgUiA9IHRbM10sIEEgPSB0WzRdLCBGID0gMDsgRiA8IDgwOyArK0YpIHtcbiAgICAgIHZhciBNID0gTWF0aC5mbG9vcihGIC8gMjApLCBIID0gc2woeSwgNSkgKyBGdihNLCBFLCBiLCBSKSArIEEgKyBlW01dICsgaFtGXSA+Pj4gMDtcbiAgICAgIEEgPSBSLCBSID0gYiwgYiA9IHNsKEUsIDMwKSA+Pj4gMCwgRSA9IHksIHkgPSBIO1xuICAgIH1cbiAgICB0WzBdID0gdFswXSArIHkgPj4+IDAsIHRbMV0gPSB0WzFdICsgRSA+Pj4gMCwgdFsyXSA9IHRbMl0gKyBiID4+PiAwLCB0WzNdID0gdFszXSArIFIgPj4+IDAsIHRbNF0gPSB0WzRdICsgQSA+Pj4gMDtcbiAgfVxuICByZXR1cm4gW3RbMF0gPj4gMjQgJiAyNTUsIHRbMF0gPj4gMTYgJiAyNTUsIHRbMF0gPj4gOCAmIDI1NSwgdFswXSAmIDI1NSwgdFsxXSA+PiAyNCAmIDI1NSwgdFsxXSA+PiAxNiAmIDI1NSwgdFsxXSA+PiA4ICYgMjU1LCB0WzFdICYgMjU1LCB0WzJdID4+IDI0ICYgMjU1LCB0WzJdID4+IDE2ICYgMjU1LCB0WzJdID4+IDggJiAyNTUsIHRbMl0gJiAyNTUsIHRbM10gPj4gMjQgJiAyNTUsIHRbM10gPj4gMTYgJiAyNTUsIHRbM10gPj4gOCAmIDI1NSwgdFszXSAmIDI1NSwgdFs0XSA+PiAyNCAmIDI1NSwgdFs0XSA+PiAxNiAmIDI1NSwgdFs0XSA+PiA4ICYgMjU1LCB0WzRdICYgMjU1XTtcbn1cbnZhciBVdiA9IEkwKFwidjVcIiwgODAsIE52KTtcbmNvbnN0ICR2ID0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIjtcbmZ1bmN0aW9uIEd2KHMpIHtcbiAgaWYgKCF1YShzKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJJbnZhbGlkIFVVSURcIik7XG4gIHJldHVybiBwYXJzZUludChzLnN1YnN0cigxNCwgMSksIDE2KTtcbn1cbmNvbnN0IFZ2ID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5mcmVlemUoLyogQF9fUFVSRV9fICovIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7XG4gIF9fcHJvdG9fXzogbnVsbCxcbiAgTklMOiAkdixcbiAgcGFyc2U6IEEwLFxuICBzdHJpbmdpZnk6IGRhLFxuICB2MTogSXYsXG4gIHYzOiBPdixcbiAgdjQ6IEJ2LFxuICB2NTogVXYsXG4gIHZhbGlkYXRlOiB1YSxcbiAgdmVyc2lvbjogR3Zcbn0sIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogXCJNb2R1bGVcIiB9KSksIFIwID0gLyogQF9fUFVSRV9fICovIE5jKFZ2KTtcbnZhciBubCwgRGQ7XG5mdW5jdGlvbiBqdigpIHtcbiAgaWYgKERkKSByZXR1cm4gbmw7XG4gIERkID0gMTtcbiAgY29uc3QgcyA9IFIwLnY0O1xuICByZXR1cm4gbmwgPSBmdW5jdGlvbih0LCByLCBuLCBpKSB7XG4gICAgaWYgKHR5cGVvZiB0ICE9IFwic3RyaW5nXCIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHQgKyBcIiBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICAgIGkgPSBpIHx8IHt9O1xuICAgIGNvbnN0IG8gPSB0eXBlb2YgaS52ZXJzaW9uID09IFwibnVtYmVyXCIgPyBpLnZlcnNpb24gOiAyO1xuICAgIGlmIChvICE9PSAxICYmIG8gIT09IDIpXG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKG8gKyBcIiBtdXN0IGJlIDEgb3IgMlwiKTtcbiAgICBjb25zdCBhID0ge1xuICAgICAgbWV0aG9kOiB0XG4gICAgfTtcbiAgICBpZiAobyA9PT0gMiAmJiAoYS5qc29ucnBjID0gXCIyLjBcIiksIHIpIHtcbiAgICAgIGlmICh0eXBlb2YgciAhPSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHIpKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHIgKyBcIiBtdXN0IGJlIGFuIG9iamVjdCwgYXJyYXkgb3Igb21pdHRlZFwiKTtcbiAgICAgIGEucGFyYW1zID0gcjtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBuID4gXCJ1XCIpIHtcbiAgICAgIGNvbnN0IGwgPSB0eXBlb2YgaS5nZW5lcmF0b3IgPT0gXCJmdW5jdGlvblwiID8gaS5nZW5lcmF0b3IgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHMoKTtcbiAgICAgIH07XG4gICAgICBhLmlkID0gbChhLCBpKTtcbiAgICB9IGVsc2UgbyA9PT0gMiAmJiBuID09PSBudWxsID8gaS5ub3RpZmljYXRpb25JZE51bGwgJiYgKGEuaWQgPSBudWxsKSA6IGEuaWQgPSBuO1xuICAgIHJldHVybiBhO1xuICB9LCBubDtcbn1cbnZhciBpbCwgUGQ7XG5mdW5jdGlvbiBLdigpIHtcbiAgaWYgKFBkKSByZXR1cm4gaWw7XG4gIFBkID0gMTtcbiAgY29uc3QgcyA9IFIwLnY0LCBlID0ganYoKSwgdCA9IGZ1bmN0aW9uKHIsIG4pIHtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgdCkpXG4gICAgICByZXR1cm4gbmV3IHQociwgbik7XG4gICAgbiB8fCAobiA9IHt9KSwgdGhpcy5vcHRpb25zID0ge1xuICAgICAgcmV2aXZlcjogdHlwZW9mIG4ucmV2aXZlciA8IFwidVwiID8gbi5yZXZpdmVyIDogbnVsbCxcbiAgICAgIHJlcGxhY2VyOiB0eXBlb2Ygbi5yZXBsYWNlciA8IFwidVwiID8gbi5yZXBsYWNlciA6IG51bGwsXG4gICAgICBnZW5lcmF0b3I6IHR5cGVvZiBuLmdlbmVyYXRvciA8IFwidVwiID8gbi5nZW5lcmF0b3IgOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHMoKTtcbiAgICAgIH0sXG4gICAgICB2ZXJzaW9uOiB0eXBlb2Ygbi52ZXJzaW9uIDwgXCJ1XCIgPyBuLnZlcnNpb24gOiAyLFxuICAgICAgbm90aWZpY2F0aW9uSWROdWxsOiB0eXBlb2Ygbi5ub3RpZmljYXRpb25JZE51bGwgPT0gXCJib29sZWFuXCIgPyBuLm5vdGlmaWNhdGlvbklkTnVsbCA6ICExXG4gICAgfSwgdGhpcy5jYWxsU2VydmVyID0gcjtcbiAgfTtcbiAgcmV0dXJuIGlsID0gdCwgdC5wcm90b3R5cGUucmVxdWVzdCA9IGZ1bmN0aW9uKHIsIG4sIGksIG8pIHtcbiAgICBjb25zdCBhID0gdGhpcztcbiAgICBsZXQgbCA9IG51bGw7XG4gICAgY29uc3QgYyA9IEFycmF5LmlzQXJyYXkocikgJiYgdHlwZW9mIG4gPT0gXCJmdW5jdGlvblwiO1xuICAgIGlmICh0aGlzLm9wdGlvbnMudmVyc2lvbiA9PT0gMSAmJiBjKVxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkpTT04tUlBDIDEuMCBkb2VzIG5vdCBzdXBwb3J0IGJhdGNoaW5nXCIpO1xuICAgIGlmIChjIHx8ICFjICYmIHIgJiYgdHlwZW9mIHIgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICBvID0gbiwgbCA9IHI7XG4gICAgZWxzZSB7XG4gICAgICB0eXBlb2YgaSA9PSBcImZ1bmN0aW9uXCIgJiYgKG8gPSBpLCBpID0gdm9pZCAwKTtcbiAgICAgIGNvbnN0IGggPSB0eXBlb2YgbyA9PSBcImZ1bmN0aW9uXCI7XG4gICAgICB0cnkge1xuICAgICAgICBsID0gZShyLCBuLCBpLCB7XG4gICAgICAgICAgZ2VuZXJhdG9yOiB0aGlzLm9wdGlvbnMuZ2VuZXJhdG9yLFxuICAgICAgICAgIHZlcnNpb246IHRoaXMub3B0aW9ucy52ZXJzaW9uLFxuICAgICAgICAgIG5vdGlmaWNhdGlvbklkTnVsbDogdGhpcy5vcHRpb25zLm5vdGlmaWNhdGlvbklkTnVsbFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGYpIHtcbiAgICAgICAgaWYgKGgpXG4gICAgICAgICAgcmV0dXJuIG8oZik7XG4gICAgICAgIHRocm93IGY7XG4gICAgICB9XG4gICAgICBpZiAoIWgpXG4gICAgICAgIHJldHVybiBsO1xuICAgIH1cbiAgICBsZXQgZDtcbiAgICB0cnkge1xuICAgICAgZCA9IEpTT04uc3RyaW5naWZ5KGwsIHRoaXMub3B0aW9ucy5yZXBsYWNlcik7XG4gICAgfSBjYXRjaCAoaCkge1xuICAgICAgcmV0dXJuIG8oaCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhbGxTZXJ2ZXIoZCwgZnVuY3Rpb24oaCwgZikge1xuICAgICAgYS5fcGFyc2VSZXNwb25zZShoLCBmLCBvKTtcbiAgICB9KSwgbDtcbiAgfSwgdC5wcm90b3R5cGUuX3BhcnNlUmVzcG9uc2UgPSBmdW5jdGlvbihyLCBuLCBpKSB7XG4gICAgaWYgKHIpIHtcbiAgICAgIGkocik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghbilcbiAgICAgIHJldHVybiBpKCk7XG4gICAgbGV0IG87XG4gICAgdHJ5IHtcbiAgICAgIG8gPSBKU09OLnBhcnNlKG4sIHRoaXMub3B0aW9ucy5yZXZpdmVyKTtcbiAgICB9IGNhdGNoIChhKSB7XG4gICAgICByZXR1cm4gaShhKTtcbiAgICB9XG4gICAgaWYgKGkubGVuZ3RoID09PSAzKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkobykpIHtcbiAgICAgICAgY29uc3QgYSA9IGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgICByZXR1cm4gdHlwZW9mIGMuZXJyb3IgPCBcInVcIjtcbiAgICAgICAgfSwgbCA9IGZ1bmN0aW9uKGMpIHtcbiAgICAgICAgICByZXR1cm4gIWEoYyk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpKG51bGwsIG8uZmlsdGVyKGEpLCBvLmZpbHRlcihsKSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIGkobnVsbCwgby5lcnJvciwgby5yZXN1bHQpO1xuICAgIGkobnVsbCwgbyk7XG4gIH0sIGlsO1xufVxuS3YoKTtcbnZhciBvbCA9IHsgZXhwb3J0czoge30gfSwgTWQ7XG5mdW5jdGlvbiBIdigpIHtcbiAgcmV0dXJuIE1kIHx8IChNZCA9IDEsIChmdW5jdGlvbihzKSB7XG4gICAgdmFyIGUgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LCB0ID0gXCJ+XCI7XG4gICAgZnVuY3Rpb24gcigpIHtcbiAgICB9XG4gICAgT2JqZWN0LmNyZWF0ZSAmJiAoci5wcm90b3R5cGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgbmV3IHIoKS5fX3Byb3RvX18gfHwgKHQgPSAhMSkpO1xuICAgIGZ1bmN0aW9uIG4obCwgYywgdSkge1xuICAgICAgdGhpcy5mbiA9IGwsIHRoaXMuY29udGV4dCA9IGMsIHRoaXMub25jZSA9IHUgfHwgITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGkobCwgYywgdSwgZCwgaCkge1xuICAgICAgaWYgKHR5cGVvZiB1ICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICB2YXIgZiA9IG5ldyBuKHUsIGQgfHwgbCwgaCksIHAgPSB0ID8gdCArIGMgOiBjO1xuICAgICAgcmV0dXJuIGwuX2V2ZW50c1twXSA/IGwuX2V2ZW50c1twXS5mbiA/IGwuX2V2ZW50c1twXSA9IFtsLl9ldmVudHNbcF0sIGZdIDogbC5fZXZlbnRzW3BdLnB1c2goZikgOiAobC5fZXZlbnRzW3BdID0gZiwgbC5fZXZlbnRzQ291bnQrKyksIGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG8obCwgYykge1xuICAgICAgLS1sLl9ldmVudHNDb3VudCA9PT0gMCA/IGwuX2V2ZW50cyA9IG5ldyByKCkgOiBkZWxldGUgbC5fZXZlbnRzW2NdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhKCkge1xuICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IHIoKSwgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYyA9IFtdLCB1LCBkO1xuICAgICAgaWYgKHRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSByZXR1cm4gYztcbiAgICAgIGZvciAoZCBpbiB1ID0gdGhpcy5fZXZlbnRzKVxuICAgICAgICBlLmNhbGwodSwgZCkgJiYgYy5wdXNoKHQgPyBkLnNsaWNlKDEpIDogZCk7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA/IGMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModSkpIDogYztcbiAgICB9LCBhLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbihjKSB7XG4gICAgICB2YXIgdSA9IHQgPyB0ICsgYyA6IGMsIGQgPSB0aGlzLl9ldmVudHNbdV07XG4gICAgICBpZiAoIWQpIHJldHVybiBbXTtcbiAgICAgIGlmIChkLmZuKSByZXR1cm4gW2QuZm5dO1xuICAgICAgZm9yICh2YXIgaCA9IDAsIGYgPSBkLmxlbmd0aCwgcCA9IG5ldyBBcnJheShmKTsgaCA8IGY7IGgrKylcbiAgICAgICAgcFtoXSA9IGRbaF0uZm47XG4gICAgICByZXR1cm4gcDtcbiAgICB9LCBhLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oYykge1xuICAgICAgdmFyIHUgPSB0ID8gdCArIGMgOiBjLCBkID0gdGhpcy5fZXZlbnRzW3VdO1xuICAgICAgcmV0dXJuIGQgPyBkLmZuID8gMSA6IGQubGVuZ3RoIDogMDtcbiAgICB9LCBhLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oYywgdSwgZCwgaCwgZiwgcCkge1xuICAgICAgdmFyIHkgPSB0ID8gdCArIGMgOiBjO1xuICAgICAgaWYgKCF0aGlzLl9ldmVudHNbeV0pIHJldHVybiAhMTtcbiAgICAgIHZhciBFID0gdGhpcy5fZXZlbnRzW3ldLCBiID0gYXJndW1lbnRzLmxlbmd0aCwgUiwgQTtcbiAgICAgIGlmIChFLmZuKSB7XG4gICAgICAgIHN3aXRjaCAoRS5vbmNlICYmIHRoaXMucmVtb3ZlTGlzdGVuZXIoYywgRS5mbiwgdm9pZCAwLCAhMCksIGIpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gRS5mbi5jYWxsKEUuY29udGV4dCksICEwO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBFLmZuLmNhbGwoRS5jb250ZXh0LCB1KSwgITA7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIEUuZm4uY2FsbChFLmNvbnRleHQsIHUsIGQpLCAhMDtcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gRS5mbi5jYWxsKEUuY29udGV4dCwgdSwgZCwgaCksICEwO1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJldHVybiBFLmZuLmNhbGwoRS5jb250ZXh0LCB1LCBkLCBoLCBmKSwgITA7XG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIEUuZm4uY2FsbChFLmNvbnRleHQsIHUsIGQsIGgsIGYsIHApLCAhMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKEEgPSAxLCBSID0gbmV3IEFycmF5KGIgLSAxKTsgQSA8IGI7IEErKylcbiAgICAgICAgICBSW0EgLSAxXSA9IGFyZ3VtZW50c1tBXTtcbiAgICAgICAgRS5mbi5hcHBseShFLmNvbnRleHQsIFIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIEYgPSBFLmxlbmd0aCwgTTtcbiAgICAgICAgZm9yIChBID0gMDsgQSA8IEY7IEErKylcbiAgICAgICAgICBzd2l0Y2ggKEVbQV0ub25jZSAmJiB0aGlzLnJlbW92ZUxpc3RlbmVyKGMsIEVbQV0uZm4sIHZvaWQgMCwgITApLCBiKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIEVbQV0uZm4uY2FsbChFW0FdLmNvbnRleHQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgRVtBXS5mbi5jYWxsKEVbQV0uY29udGV4dCwgdSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBFW0FdLmZuLmNhbGwoRVtBXS5jb250ZXh0LCB1LCBkKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIEVbQV0uZm4uY2FsbChFW0FdLmNvbnRleHQsIHUsIGQsIGgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGlmICghUikgZm9yIChNID0gMSwgUiA9IG5ldyBBcnJheShiIC0gMSk7IE0gPCBiOyBNKyspXG4gICAgICAgICAgICAgICAgUltNIC0gMV0gPSBhcmd1bWVudHNbTV07XG4gICAgICAgICAgICAgIEVbQV0uZm4uYXBwbHkoRVtBXS5jb250ZXh0LCBSKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gITA7XG4gICAgfSwgYS5wcm90b3R5cGUub24gPSBmdW5jdGlvbihjLCB1LCBkKSB7XG4gICAgICByZXR1cm4gaSh0aGlzLCBjLCB1LCBkLCAhMSk7XG4gICAgfSwgYS5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGMsIHUsIGQpIHtcbiAgICAgIHJldHVybiBpKHRoaXMsIGMsIHUsIGQsICEwKTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGMsIHUsIGQsIGgpIHtcbiAgICAgIHZhciBmID0gdCA/IHQgKyBjIDogYztcbiAgICAgIGlmICghdGhpcy5fZXZlbnRzW2ZdKSByZXR1cm4gdGhpcztcbiAgICAgIGlmICghdSlcbiAgICAgICAgcmV0dXJuIG8odGhpcywgZiksIHRoaXM7XG4gICAgICB2YXIgcCA9IHRoaXMuX2V2ZW50c1tmXTtcbiAgICAgIGlmIChwLmZuKVxuICAgICAgICBwLmZuID09PSB1ICYmICghaCB8fCBwLm9uY2UpICYmICghZCB8fCBwLmNvbnRleHQgPT09IGQpICYmIG8odGhpcywgZik7XG4gICAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgeSA9IDAsIEUgPSBbXSwgYiA9IHAubGVuZ3RoOyB5IDwgYjsgeSsrKVxuICAgICAgICAgIChwW3ldLmZuICE9PSB1IHx8IGggJiYgIXBbeV0ub25jZSB8fCBkICYmIHBbeV0uY29udGV4dCAhPT0gZCkgJiYgRS5wdXNoKHBbeV0pO1xuICAgICAgICBFLmxlbmd0aCA/IHRoaXMuX2V2ZW50c1tmXSA9IEUubGVuZ3RoID09PSAxID8gRVswXSA6IEUgOiBvKHRoaXMsIGYpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgYS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oYykge1xuICAgICAgdmFyIHU7XG4gICAgICByZXR1cm4gYyA/ICh1ID0gdCA/IHQgKyBjIDogYywgdGhpcy5fZXZlbnRzW3VdICYmIG8odGhpcywgdSkpIDogKHRoaXMuX2V2ZW50cyA9IG5ldyByKCksIHRoaXMuX2V2ZW50c0NvdW50ID0gMCksIHRoaXM7XG4gICAgfSwgYS5wcm90b3R5cGUub2ZmID0gYS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsIGEucHJvdG90eXBlLmFkZExpc3RlbmVyID0gYS5wcm90b3R5cGUub24sIGEucHJlZml4ZWQgPSB0LCBhLkV2ZW50RW1pdHRlciA9IGEsIHMuZXhwb3J0cyA9IGE7XG4gIH0pKG9sKSksIG9sLmV4cG9ydHM7XG59XG52YXIgcXYgPSBIdigpO1xuY29uc3QgTDAgPSAvKiBAX19QVVJFX18gKi8gRmMocXYpO1xuY2xhc3MgQzAgZXh0ZW5kcyBXZiB7XG4gIGNvbnN0cnVjdG9yKGUsIHQpIHtcbiAgICBzdXBlcigpLCB0aGlzLmZpbmlzaGVkID0gITEsIHRoaXMuZGVzdHJveWVkID0gITEsIEhmKGUpO1xuICAgIGNvbnN0IHIgPSBIYyh0KTtcbiAgICBpZiAodGhpcy5pSGFzaCA9IGUuY3JlYXRlKCksIHR5cGVvZiB0aGlzLmlIYXNoLnVwZGF0ZSAhPSBcImZ1bmN0aW9uXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFeHBlY3RlZCBpbnN0YW5jZSBvZiBjbGFzcyB3aGljaCBleHRlbmRzIHV0aWxzLkhhc2hcIik7XG4gICAgdGhpcy5ibG9ja0xlbiA9IHRoaXMuaUhhc2guYmxvY2tMZW4sIHRoaXMub3V0cHV0TGVuID0gdGhpcy5pSGFzaC5vdXRwdXRMZW47XG4gICAgY29uc3QgbiA9IHRoaXMuYmxvY2tMZW4sIGkgPSBuZXcgVWludDhBcnJheShuKTtcbiAgICBpLnNldChyLmxlbmd0aCA+IG4gPyBlLmNyZWF0ZSgpLnVwZGF0ZShyKS5kaWdlc3QoKSA6IHIpO1xuICAgIGZvciAobGV0IG8gPSAwOyBvIDwgaS5sZW5ndGg7IG8rKylcbiAgICAgIGlbb10gXj0gNTQ7XG4gICAgdGhpcy5pSGFzaC51cGRhdGUoaSksIHRoaXMub0hhc2ggPSBlLmNyZWF0ZSgpO1xuICAgIGZvciAobGV0IG8gPSAwOyBvIDwgaS5sZW5ndGg7IG8rKylcbiAgICAgIGlbb10gXj0gMTA2O1xuICAgIHRoaXMub0hhc2gudXBkYXRlKGkpLCBrbihpKTtcbiAgfVxuICB1cGRhdGUoZSkge1xuICAgIHJldHVybiBEbyh0aGlzKSwgdGhpcy5pSGFzaC51cGRhdGUoZSksIHRoaXM7XG4gIH1cbiAgZGlnZXN0SW50byhlKSB7XG4gICAgRG8odGhpcyksIFFzKGUsIHRoaXMub3V0cHV0TGVuKSwgdGhpcy5maW5pc2hlZCA9ICEwLCB0aGlzLmlIYXNoLmRpZ2VzdEludG8oZSksIHRoaXMub0hhc2gudXBkYXRlKGUpLCB0aGlzLm9IYXNoLmRpZ2VzdEludG8oZSksIHRoaXMuZGVzdHJveSgpO1xuICB9XG4gIGRpZ2VzdCgpIHtcbiAgICBjb25zdCBlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5vSGFzaC5vdXRwdXRMZW4pO1xuICAgIHJldHVybiB0aGlzLmRpZ2VzdEludG8oZSksIGU7XG4gIH1cbiAgX2Nsb25lSW50byhlKSB7XG4gICAgZSB8fCAoZSA9IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLCB7fSkpO1xuICAgIGNvbnN0IHsgb0hhc2g6IHQsIGlIYXNoOiByLCBmaW5pc2hlZDogbiwgZGVzdHJveWVkOiBpLCBibG9ja0xlbjogbywgb3V0cHV0TGVuOiBhIH0gPSB0aGlzO1xuICAgIHJldHVybiBlID0gZSwgZS5maW5pc2hlZCA9IG4sIGUuZGVzdHJveWVkID0gaSwgZS5ibG9ja0xlbiA9IG8sIGUub3V0cHV0TGVuID0gYSwgZS5vSGFzaCA9IHQuX2Nsb25lSW50byhlLm9IYXNoKSwgZS5pSGFzaCA9IHIuX2Nsb25lSW50byhlLmlIYXNoKSwgZTtcbiAgfVxuICBjbG9uZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2xvbmVJbnRvKCk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9ICEwLCB0aGlzLm9IYXNoLmRlc3Ryb3koKSwgdGhpcy5pSGFzaC5kZXN0cm95KCk7XG4gIH1cbn1cbmNvbnN0IGswID0gKHMsIGUsIHQpID0+IG5ldyBDMChzLCBlKS51cGRhdGUodCkuZGlnZXN0KCk7XG5rMC5jcmVhdGUgPSAocywgZSkgPT4gbmV3IEMwKHMsIGUpO1xuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuY29uc3QgT2QgPSAocywgZSkgPT4gKHMgKyAocyA+PSAwID8gZSA6IC1lKSAvIEQwKSAvIGU7XG5mdW5jdGlvbiBXdihzLCBlLCB0KSB7XG4gIGNvbnN0IFtbciwgbl0sIFtpLCBvXV0gPSBlLCBhID0gT2QobyAqIHMsIHQpLCBsID0gT2QoLW4gKiBzLCB0KTtcbiAgbGV0IGMgPSBzIC0gYSAqIHIgLSBsICogaSwgdSA9IC1hICogbiAtIGwgKiBvO1xuICBjb25zdCBkID0gYyA8IGhzLCBoID0gdSA8IGhzO1xuICBkICYmIChjID0gLWMpLCBoICYmICh1ID0gLXUpO1xuICBjb25zdCBmID0gX2koTWF0aC5jZWlsKGUwKHQpIC8gMikpICsgVG47XG4gIGlmIChjIDwgaHMgfHwgYyA+PSBmIHx8IHUgPCBocyB8fCB1ID49IGYpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwic3BsaXRTY2FsYXIgKGVuZG9tb3JwaGlzbSk6IGZhaWxlZCwgaz1cIiArIHMpO1xuICByZXR1cm4geyBrMW5lZzogZCwgazE6IGMsIGsybmVnOiBoLCBrMjogdSB9O1xufVxuZnVuY3Rpb24gZWMocykge1xuICBpZiAoIVtcImNvbXBhY3RcIiwgXCJyZWNvdmVyZWRcIiwgXCJkZXJcIl0uaW5jbHVkZXMocykpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdTaWduYXR1cmUgZm9ybWF0IG11c3QgYmUgXCJjb21wYWN0XCIsIFwicmVjb3ZlcmVkXCIsIG9yIFwiZGVyXCInKTtcbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBhbChzLCBlKSB7XG4gIGNvbnN0IHQgPSB7fTtcbiAgZm9yIChsZXQgciBvZiBPYmplY3Qua2V5cyhlKSlcbiAgICB0W3JdID0gc1tyXSA9PT0gdm9pZCAwID8gZVtyXSA6IHNbcl07XG4gIHJldHVybiBYcyh0Lmxvd1MsIFwibG93U1wiKSwgWHModC5wcmVoYXNoLCBcInByZWhhc2hcIiksIHQuZm9ybWF0ICE9PSB2b2lkIDAgJiYgZWModC5mb3JtYXQpLCB0O1xufVxuY2xhc3MgenYgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGUgPSBcIlwiKSB7XG4gICAgc3VwZXIoZSk7XG4gIH1cbn1cbmNvbnN0IGNzID0ge1xuICAvLyBhc24uMSBERVIgZW5jb2RpbmcgdXRpbHNcbiAgRXJyOiB6dixcbiAgLy8gQmFzaWMgYnVpbGRpbmcgYmxvY2sgaXMgVExWIChUYWctTGVuZ3RoLVZhbHVlKVxuICBfdGx2OiB7XG4gICAgZW5jb2RlOiAocywgZSkgPT4ge1xuICAgICAgY29uc3QgeyBFcnI6IHQgfSA9IGNzO1xuICAgICAgaWYgKHMgPCAwIHx8IHMgPiAyNTYpXG4gICAgICAgIHRocm93IG5ldyB0KFwidGx2LmVuY29kZTogd3JvbmcgdGFnXCIpO1xuICAgICAgaWYgKGUubGVuZ3RoICYgMSlcbiAgICAgICAgdGhyb3cgbmV3IHQoXCJ0bHYuZW5jb2RlOiB1bnBhZGRlZCBkYXRhXCIpO1xuICAgICAgY29uc3QgciA9IGUubGVuZ3RoIC8gMiwgbiA9IE5pKHIpO1xuICAgICAgaWYgKG4ubGVuZ3RoIC8gMiAmIDEyOClcbiAgICAgICAgdGhyb3cgbmV3IHQoXCJ0bHYuZW5jb2RlOiBsb25nIGZvcm0gbGVuZ3RoIHRvbyBiaWdcIik7XG4gICAgICBjb25zdCBpID0gciA+IDEyNyA/IE5pKG4ubGVuZ3RoIC8gMiB8IDEyOCkgOiBcIlwiO1xuICAgICAgcmV0dXJuIE5pKHMpICsgaSArIG4gKyBlO1xuICAgIH0sXG4gICAgLy8gdiAtIHZhbHVlLCBsIC0gbGVmdCBieXRlcyAodW5wYXJzZWQpXG4gICAgZGVjb2RlKHMsIGUpIHtcbiAgICAgIGNvbnN0IHsgRXJyOiB0IH0gPSBjcztcbiAgICAgIGxldCByID0gMDtcbiAgICAgIGlmIChzIDwgMCB8fCBzID4gMjU2KVxuICAgICAgICB0aHJvdyBuZXcgdChcInRsdi5lbmNvZGU6IHdyb25nIHRhZ1wiKTtcbiAgICAgIGlmIChlLmxlbmd0aCA8IDIgfHwgZVtyKytdICE9PSBzKVxuICAgICAgICB0aHJvdyBuZXcgdChcInRsdi5kZWNvZGU6IHdyb25nIHRsdlwiKTtcbiAgICAgIGNvbnN0IG4gPSBlW3IrK10sIGkgPSAhIShuICYgMTI4KTtcbiAgICAgIGxldCBvID0gMDtcbiAgICAgIGlmICghaSlcbiAgICAgICAgbyA9IG47XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgbCA9IG4gJiAxMjc7XG4gICAgICAgIGlmICghbClcbiAgICAgICAgICB0aHJvdyBuZXcgdChcInRsdi5kZWNvZGUobG9uZyk6IGluZGVmaW5pdGUgbGVuZ3RoIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgIGlmIChsID4gNClcbiAgICAgICAgICB0aHJvdyBuZXcgdChcInRsdi5kZWNvZGUobG9uZyk6IGJ5dGUgbGVuZ3RoIGlzIHRvbyBiaWdcIik7XG4gICAgICAgIGNvbnN0IGMgPSBlLnN1YmFycmF5KHIsIHIgKyBsKTtcbiAgICAgICAgaWYgKGMubGVuZ3RoICE9PSBsKVxuICAgICAgICAgIHRocm93IG5ldyB0KFwidGx2LmRlY29kZTogbGVuZ3RoIGJ5dGVzIG5vdCBjb21wbGV0ZVwiKTtcbiAgICAgICAgaWYgKGNbMF0gPT09IDApXG4gICAgICAgICAgdGhyb3cgbmV3IHQoXCJ0bHYuZGVjb2RlKGxvbmcpOiB6ZXJvIGxlZnRtb3N0IGJ5dGVcIik7XG4gICAgICAgIGZvciAoY29uc3QgdSBvZiBjKVxuICAgICAgICAgIG8gPSBvIDw8IDggfCB1O1xuICAgICAgICBpZiAociArPSBsLCBvIDwgMTI4KVxuICAgICAgICAgIHRocm93IG5ldyB0KFwidGx2LmRlY29kZShsb25nKTogbm90IG1pbmltYWwgZW5jb2RpbmdcIik7XG4gICAgICB9XG4gICAgICBjb25zdCBhID0gZS5zdWJhcnJheShyLCByICsgbyk7XG4gICAgICBpZiAoYS5sZW5ndGggIT09IG8pXG4gICAgICAgIHRocm93IG5ldyB0KFwidGx2LmRlY29kZTogd3JvbmcgdmFsdWUgbGVuZ3RoXCIpO1xuICAgICAgcmV0dXJuIHsgdjogYSwgbDogZS5zdWJhcnJheShyICsgbykgfTtcbiAgICB9XG4gIH0sXG4gIC8vIGh0dHBzOi8vY3J5cHRvLnN0YWNrZXhjaGFuZ2UuY29tL2EvNTc3MzQgTGVmdG1vc3QgYml0IG9mIGZpcnN0IGJ5dGUgaXMgJ25lZ2F0aXZlJyBmbGFnLFxuICAvLyBzaW5jZSB3ZSBhbHdheXMgdXNlIHBvc2l0aXZlIGludGVnZXJzIGhlcmUuIEl0IG11c3QgYWx3YXlzIGJlIGVtcHR5OlxuICAvLyAtIGFkZCB6ZXJvIGJ5dGUgaWYgZXhpc3RzXG4gIC8vIC0gaWYgbmV4dCBieXRlIGRvZXNuJ3QgaGF2ZSBhIGZsYWcsIGxlYWRpbmcgemVybyBpcyBub3QgYWxsb3dlZCAobWluaW1hbCBlbmNvZGluZylcbiAgX2ludDoge1xuICAgIGVuY29kZShzKSB7XG4gICAgICBjb25zdCB7IEVycjogZSB9ID0gY3M7XG4gICAgICBpZiAocyA8IGhzKVxuICAgICAgICB0aHJvdyBuZXcgZShcImludGVnZXI6IG5lZ2F0aXZlIGludGVnZXJzIGFyZSBub3QgYWxsb3dlZFwiKTtcbiAgICAgIGxldCB0ID0gTmkocyk7XG4gICAgICBpZiAoTnVtYmVyLnBhcnNlSW50KHRbMF0sIDE2KSAmIDggJiYgKHQgPSBcIjAwXCIgKyB0KSwgdC5sZW5ndGggJiAxKVxuICAgICAgICB0aHJvdyBuZXcgZShcInVuZXhwZWN0ZWQgREVSIHBhcnNpbmcgYXNzZXJ0aW9uOiB1bnBhZGRlZCBoZXhcIik7XG4gICAgICByZXR1cm4gdDtcbiAgICB9LFxuICAgIGRlY29kZShzKSB7XG4gICAgICBjb25zdCB7IEVycjogZSB9ID0gY3M7XG4gICAgICBpZiAoc1swXSAmIDEyOClcbiAgICAgICAgdGhyb3cgbmV3IGUoXCJpbnZhbGlkIHNpZ25hdHVyZSBpbnRlZ2VyOiBuZWdhdGl2ZVwiKTtcbiAgICAgIGlmIChzWzBdID09PSAwICYmICEoc1sxXSAmIDEyOCkpXG4gICAgICAgIHRocm93IG5ldyBlKFwiaW52YWxpZCBzaWduYXR1cmUgaW50ZWdlcjogdW5uZWNlc3NhcnkgbGVhZGluZyB6ZXJvXCIpO1xuICAgICAgcmV0dXJuIGxhKHMpO1xuICAgIH1cbiAgfSxcbiAgdG9TaWcocykge1xuICAgIGNvbnN0IHsgRXJyOiBlLCBfaW50OiB0LCBfdGx2OiByIH0gPSBjcywgbiA9IEV0KFwic2lnbmF0dXJlXCIsIHMpLCB7IHY6IGksIGw6IG8gfSA9IHIuZGVjb2RlKDQ4LCBuKTtcbiAgICBpZiAoby5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgZShcImludmFsaWQgc2lnbmF0dXJlOiBsZWZ0IGJ5dGVzIGFmdGVyIHBhcnNpbmdcIik7XG4gICAgY29uc3QgeyB2OiBhLCBsIH0gPSByLmRlY29kZSgyLCBpKSwgeyB2OiBjLCBsOiB1IH0gPSByLmRlY29kZSgyLCBsKTtcbiAgICBpZiAodS5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgZShcImludmFsaWQgc2lnbmF0dXJlOiBsZWZ0IGJ5dGVzIGFmdGVyIHBhcnNpbmdcIik7XG4gICAgcmV0dXJuIHsgcjogdC5kZWNvZGUoYSksIHM6IHQuZGVjb2RlKGMpIH07XG4gIH0sXG4gIGhleEZyb21TaWcocykge1xuICAgIGNvbnN0IHsgX3RsdjogZSwgX2ludDogdCB9ID0gY3MsIHIgPSBlLmVuY29kZSgyLCB0LmVuY29kZShzLnIpKSwgbiA9IGUuZW5jb2RlKDIsIHQuZW5jb2RlKHMucykpLCBpID0gciArIG47XG4gICAgcmV0dXJuIGUuZW5jb2RlKDQ4LCBpKTtcbiAgfVxufSwgaHMgPSBCaWdJbnQoMCksIFRuID0gQmlnSW50KDEpLCBEMCA9IEJpZ0ludCgyKSwgR2kgPSBCaWdJbnQoMyksIFl2ID0gQmlnSW50KDQpO1xuZnVuY3Rpb24gRW4ocywgZSkge1xuICBjb25zdCB7IEJZVEVTOiB0IH0gPSBzO1xuICBsZXQgcjtcbiAgaWYgKHR5cGVvZiBlID09IFwiYmlnaW50XCIpXG4gICAgciA9IGU7XG4gIGVsc2Uge1xuICAgIGxldCBuID0gRXQoXCJwcml2YXRlIGtleVwiLCBlKTtcbiAgICB0cnkge1xuICAgICAgciA9IHMuZnJvbUJ5dGVzKG4pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHByaXZhdGUga2V5OiBleHBlY3RlZCB1aThhIG9mIHNpemUgJHt0fSwgZ290ICR7dHlwZW9mIGV9YCk7XG4gICAgfVxuICB9XG4gIGlmICghcy5pc1ZhbGlkTm90MChyKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHByaXZhdGUga2V5OiBvdXQgb2YgcmFuZ2UgWzEuLk4tMV1cIik7XG4gIHJldHVybiByO1xufVxuZnVuY3Rpb24gWnYocywgZSA9IHt9KSB7XG4gIGNvbnN0IHQgPSBtMChcIndlaWVyc3RyYXNzXCIsIHMsIGUpLCB7IEZwOiByLCBGbjogbiB9ID0gdDtcbiAgbGV0IGkgPSB0LkNVUlZFO1xuICBjb25zdCB7IGg6IG8sIG46IGEgfSA9IGk7XG4gIFJpKGUsIHt9LCB7XG4gICAgYWxsb3dJbmZpbml0eVBvaW50OiBcImJvb2xlYW5cIixcbiAgICBjbGVhckNvZmFjdG9yOiBcImZ1bmN0aW9uXCIsXG4gICAgaXNUb3JzaW9uRnJlZTogXCJmdW5jdGlvblwiLFxuICAgIGZyb21CeXRlczogXCJmdW5jdGlvblwiLFxuICAgIHRvQnl0ZXM6IFwiZnVuY3Rpb25cIixcbiAgICBlbmRvOiBcIm9iamVjdFwiLFxuICAgIHdyYXBQcml2YXRlS2V5OiBcImJvb2xlYW5cIlxuICB9KTtcbiAgY29uc3QgeyBlbmRvOiBsIH0gPSBlO1xuICBpZiAobCAmJiAoIXIuaXMwKGkuYSkgfHwgdHlwZW9mIGwuYmV0YSAhPSBcImJpZ2ludFwiIHx8ICFBcnJheS5pc0FycmF5KGwuYmFzaXNlcykpKVxuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBlbmRvOiBleHBlY3RlZCBcImJldGFcIjogYmlnaW50IGFuZCBcImJhc2lzZXNcIjogYXJyYXknKTtcbiAgY29uc3QgYyA9IE0wKHIsIG4pO1xuICBmdW5jdGlvbiB1KCkge1xuICAgIGlmICghci5pc09kZClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNvbXByZXNzaW9uIGlzIG5vdCBzdXBwb3J0ZWQ6IEZpZWxkIGRvZXMgbm90IGhhdmUgLmlzT2RkKClcIik7XG4gIH1cbiAgZnVuY3Rpb24gZChXLCBfLCBnKSB7XG4gICAgY29uc3QgeyB4LCB5OiB3IH0gPSBfLnRvQWZmaW5lKCksIEQgPSByLnRvQnl0ZXMoeCk7XG4gICAgaWYgKFhzKGcsIFwiaXNDb21wcmVzc2VkXCIpLCBnKSB7XG4gICAgICB1KCk7XG4gICAgICBjb25zdCBPID0gIXIuaXNPZGQodyk7XG4gICAgICByZXR1cm4gS3IoUDAoTyksIEQpO1xuICAgIH0gZWxzZVxuICAgICAgcmV0dXJuIEtyKFVpbnQ4QXJyYXkub2YoNCksIEQsIHIudG9CeXRlcyh3KSk7XG4gIH1cbiAgZnVuY3Rpb24gaChXKSB7XG4gICAgT3IoVywgdm9pZCAwLCBcIlBvaW50XCIpO1xuICAgIGNvbnN0IHsgcHVibGljS2V5OiBfLCBwdWJsaWNLZXlVbmNvbXByZXNzZWQ6IGcgfSA9IGMsIHggPSBXLmxlbmd0aCwgdyA9IFdbMF0sIEQgPSBXLnN1YmFycmF5KDEpO1xuICAgIGlmICh4ID09PSBfICYmICh3ID09PSAyIHx8IHcgPT09IDMpKSB7XG4gICAgICBjb25zdCBPID0gci5mcm9tQnl0ZXMoRCk7XG4gICAgICBpZiAoIXIuaXNWYWxpZChPKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIHBvaW50OiBpcyBub3Qgb24gY3VydmUsIHdyb25nIHhcIik7XG4gICAgICBjb25zdCBVID0geShPKTtcbiAgICAgIGxldCBWO1xuICAgICAgdHJ5IHtcbiAgICAgICAgViA9IHIuc3FydChVKTtcbiAgICAgIH0gY2F0Y2ggKHYpIHtcbiAgICAgICAgY29uc3QgUCA9IHYgaW5zdGFuY2VvZiBFcnJvciA/IFwiOiBcIiArIHYubWVzc2FnZSA6IFwiXCI7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogaXMgbm90IG9uIGN1cnZlLCBzcXJ0IGVycm9yXCIgKyBQKTtcbiAgICAgIH1cbiAgICAgIHUoKTtcbiAgICAgIGNvbnN0IEwgPSByLmlzT2RkKFYpO1xuICAgICAgcmV0dXJuICh3ICYgMSkgPT09IDEgIT09IEwgJiYgKFYgPSByLm5lZyhWKSksIHsgeDogTywgeTogViB9O1xuICAgIH0gZWxzZSBpZiAoeCA9PT0gZyAmJiB3ID09PSA0KSB7XG4gICAgICBjb25zdCBPID0gci5CWVRFUywgVSA9IHIuZnJvbUJ5dGVzKEQuc3ViYXJyYXkoMCwgTykpLCBWID0gci5mcm9tQnl0ZXMoRC5zdWJhcnJheShPLCBPICogMikpO1xuICAgICAgaWYgKCFFKFUsIFYpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYWQgcG9pbnQ6IGlzIG5vdCBvbiBjdXJ2ZVwiKTtcbiAgICAgIHJldHVybiB7IHg6IFUsIHk6IFYgfTtcbiAgICB9IGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvcihgYmFkIHBvaW50OiBnb3QgbGVuZ3RoICR7eH0sIGV4cGVjdGVkIGNvbXByZXNzZWQ9JHtffSBvciB1bmNvbXByZXNzZWQ9JHtnfWApO1xuICB9XG4gIGNvbnN0IGYgPSBlLnRvQnl0ZXMgfHwgZCwgcCA9IGUuZnJvbUJ5dGVzIHx8IGg7XG4gIGZ1bmN0aW9uIHkoVykge1xuICAgIGNvbnN0IF8gPSByLnNxcihXKSwgZyA9IHIubXVsKF8sIFcpO1xuICAgIHJldHVybiByLmFkZChyLmFkZChnLCByLm11bChXLCBpLmEpKSwgaS5iKTtcbiAgfVxuICBmdW5jdGlvbiBFKFcsIF8pIHtcbiAgICBjb25zdCBnID0gci5zcXIoXyksIHggPSB5KFcpO1xuICAgIHJldHVybiByLmVxbChnLCB4KTtcbiAgfVxuICBpZiAoIUUoaS5HeCwgaS5HeSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiYmFkIGN1cnZlIHBhcmFtczogZ2VuZXJhdG9yIHBvaW50XCIpO1xuICBjb25zdCBiID0gci5tdWwoci5wb3coaS5hLCBHaSksIFl2KSwgUiA9IHIubXVsKHIuc3FyKGkuYiksIEJpZ0ludCgyNykpO1xuICBpZiAoci5pczAoci5hZGQoYiwgUikpKVxuICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBjdXJ2ZSBwYXJhbXM6IGEgb3IgYlwiKTtcbiAgZnVuY3Rpb24gQShXLCBfLCBnID0gITEpIHtcbiAgICBpZiAoIXIuaXNWYWxpZChfKSB8fCBnICYmIHIuaXMwKF8pKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYWQgcG9pbnQgY29vcmRpbmF0ZSAke1d9YCk7XG4gICAgcmV0dXJuIF87XG4gIH1cbiAgZnVuY3Rpb24gRihXKSB7XG4gICAgaWYgKCEoVyBpbnN0YW5jZW9mIEMpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUHJvamVjdGl2ZVBvaW50IGV4cGVjdGVkXCIpO1xuICB9XG4gIGZ1bmN0aW9uIE0oVykge1xuICAgIGlmICghbCB8fCAhbC5iYXNpc2VzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gZW5kb1wiKTtcbiAgICByZXR1cm4gV3YoVywgbC5iYXNpc2VzLCBuLk9SREVSKTtcbiAgfVxuICBjb25zdCBIID0gTW8oKFcsIF8pID0+IHtcbiAgICBjb25zdCB7IFg6IGcsIFk6IHgsIFo6IHcgfSA9IFc7XG4gICAgaWYgKHIuZXFsKHcsIHIuT05FKSlcbiAgICAgIHJldHVybiB7IHg6IGcsIHk6IHggfTtcbiAgICBjb25zdCBEID0gVy5pczAoKTtcbiAgICBfID09IG51bGwgJiYgKF8gPSBEID8gci5PTkUgOiByLmludih3KSk7XG4gICAgY29uc3QgTyA9IHIubXVsKGcsIF8pLCBVID0gci5tdWwoeCwgXyksIFYgPSByLm11bCh3LCBfKTtcbiAgICBpZiAoRClcbiAgICAgIHJldHVybiB7IHg6IHIuWkVSTywgeTogci5aRVJPIH07XG4gICAgaWYgKCFyLmVxbChWLCByLk9ORSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZaIHdhcyBpbnZhbGlkXCIpO1xuICAgIHJldHVybiB7IHg6IE8sIHk6IFUgfTtcbiAgfSksIEsgPSBNbygoVykgPT4ge1xuICAgIGlmIChXLmlzMCgpKSB7XG4gICAgICBpZiAoZS5hbGxvd0luZmluaXR5UG9pbnQgJiYgIXIuaXMwKFcuWSkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogWkVST1wiKTtcbiAgICB9XG4gICAgY29uc3QgeyB4OiBfLCB5OiBnIH0gPSBXLnRvQWZmaW5lKCk7XG4gICAgaWYgKCFyLmlzVmFsaWQoXykgfHwgIXIuaXNWYWxpZChnKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogeCBvciB5IG5vdCBmaWVsZCBlbGVtZW50c1wiKTtcbiAgICBpZiAoIUUoXywgZykpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJiYWQgcG9pbnQ6IGVxdWF0aW9uIGxlZnQgIT0gcmlnaHRcIik7XG4gICAgaWYgKCFXLmlzVG9yc2lvbkZyZWUoKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhZCBwb2ludDogbm90IGluIHByaW1lLW9yZGVyIHN1Ymdyb3VwXCIpO1xuICAgIHJldHVybiAhMDtcbiAgfSk7XG4gIGZ1bmN0aW9uIGooVywgXywgZywgeCwgdykge1xuICAgIHJldHVybiBnID0gbmV3IEMoci5tdWwoZy5YLCBXKSwgZy5ZLCBnLlopLCBfID0gT28oeCwgXyksIGcgPSBPbyh3LCBnKSwgXy5hZGQoZyk7XG4gIH1cbiAgY2xhc3MgQyB7XG4gICAgLyoqIERvZXMgTk9UIHZhbGlkYXRlIGlmIHRoZSBwb2ludCBpcyB2YWxpZC4gVXNlIGAuYXNzZXJ0VmFsaWRpdHkoKWAuICovXG4gICAgY29uc3RydWN0b3IoXywgZywgeCkge1xuICAgICAgdGhpcy5YID0gQShcInhcIiwgXyksIHRoaXMuWSA9IEEoXCJ5XCIsIGcsICEwKSwgdGhpcy5aID0gQShcInpcIiwgeCksIE9iamVjdC5mcmVlemUodGhpcyk7XG4gICAgfVxuICAgIHN0YXRpYyBDVVJWRSgpIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICAvKiogRG9lcyBOT1QgdmFsaWRhdGUgaWYgdGhlIHBvaW50IGlzIHZhbGlkLiBVc2UgYC5hc3NlcnRWYWxpZGl0eSgpYC4gKi9cbiAgICBzdGF0aWMgZnJvbUFmZmluZShfKSB7XG4gICAgICBjb25zdCB7IHg6IGcsIHk6IHggfSA9IF8gfHwge307XG4gICAgICBpZiAoIV8gfHwgIXIuaXNWYWxpZChnKSB8fCAhci5pc1ZhbGlkKHgpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIGFmZmluZSBwb2ludFwiKTtcbiAgICAgIGlmIChfIGluc3RhbmNlb2YgQylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicHJvamVjdGl2ZSBwb2ludCBub3QgYWxsb3dlZFwiKTtcbiAgICAgIHJldHVybiByLmlzMChnKSAmJiByLmlzMCh4KSA/IEMuWkVSTyA6IG5ldyBDKGcsIHgsIHIuT05FKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21CeXRlcyhfKSB7XG4gICAgICBjb25zdCBnID0gQy5mcm9tQWZmaW5lKHAoT3IoXywgdm9pZCAwLCBcInBvaW50XCIpKSk7XG4gICAgICByZXR1cm4gZy5hc3NlcnRWYWxpZGl0eSgpLCBnO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUhleChfKSB7XG4gICAgICByZXR1cm4gQy5mcm9tQnl0ZXMoRXQoXCJwb2ludEhleFwiLCBfKSk7XG4gICAgfVxuICAgIGdldCB4KCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9BZmZpbmUoKS54O1xuICAgIH1cbiAgICBnZXQgeSgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQWZmaW5lKCkueTtcbiAgICB9XG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBAcGFyYW0gd2luZG93U2l6ZVxuICAgICAqIEBwYXJhbSBpc0xhenkgdHJ1ZSB3aWxsIGRlZmVyIHRhYmxlIGNvbXB1dGF0aW9uIHVudGlsIHRoZSBmaXJzdCBtdWx0aXBsaWNhdGlvblxuICAgICAqIEByZXR1cm5zXG4gICAgICovXG4gICAgcHJlY29tcHV0ZShfID0gOCwgZyA9ICEwKSB7XG4gICAgICByZXR1cm4gJC5jcmVhdGVDYWNoZSh0aGlzLCBfKSwgZyB8fCB0aGlzLm11bHRpcGx5KEdpKSwgdGhpcztcbiAgICB9XG4gICAgLy8gVE9ETzogcmV0dXJuIGB0aGlzYFxuICAgIC8qKiBBIHBvaW50IG9uIGN1cnZlIGlzIHZhbGlkIGlmIGl0IGNvbmZvcm1zIHRvIGVxdWF0aW9uLiAqL1xuICAgIGFzc2VydFZhbGlkaXR5KCkge1xuICAgICAgSyh0aGlzKTtcbiAgICB9XG4gICAgaGFzRXZlblkoKSB7XG4gICAgICBjb25zdCB7IHk6IF8gfSA9IHRoaXMudG9BZmZpbmUoKTtcbiAgICAgIGlmICghci5pc09kZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgZG9lc24ndCBzdXBwb3J0IGlzT2RkXCIpO1xuICAgICAgcmV0dXJuICFyLmlzT2RkKF8pO1xuICAgIH1cbiAgICAvKiogQ29tcGFyZSBvbmUgcG9pbnQgdG8gYW5vdGhlci4gKi9cbiAgICBlcXVhbHMoXykge1xuICAgICAgRihfKTtcbiAgICAgIGNvbnN0IHsgWDogZywgWTogeCwgWjogdyB9ID0gdGhpcywgeyBYOiBELCBZOiBPLCBaOiBVIH0gPSBfLCBWID0gci5lcWwoci5tdWwoZywgVSksIHIubXVsKEQsIHcpKSwgTCA9IHIuZXFsKHIubXVsKHgsIFUpLCByLm11bChPLCB3KSk7XG4gICAgICByZXR1cm4gViAmJiBMO1xuICAgIH1cbiAgICAvKiogRmxpcHMgcG9pbnQgdG8gb25lIGNvcnJlc3BvbmRpbmcgdG8gKHgsIC15KSBpbiBBZmZpbmUgY29vcmRpbmF0ZXMuICovXG4gICAgbmVnYXRlKCkge1xuICAgICAgcmV0dXJuIG5ldyBDKHRoaXMuWCwgci5uZWcodGhpcy5ZKSwgdGhpcy5aKTtcbiAgICB9XG4gICAgLy8gUmVuZXMtQ29zdGVsbG8tQmF0aW5hIGV4Y2VwdGlvbi1mcmVlIGRvdWJsaW5nIGZvcm11bGEuXG4gICAgLy8gVGhlcmUgaXMgMzAlIGZhc3RlciBKYWNvYmlhbiBmb3JtdWxhLCBidXQgaXQgaXMgbm90IGNvbXBsZXRlLlxuICAgIC8vIGh0dHBzOi8vZXByaW50LmlhY3Iub3JnLzIwMTUvMTA2MCwgYWxnb3JpdGhtIDNcbiAgICAvLyBDb3N0OiA4TSArIDNTICsgMyphICsgMipiMyArIDE1YWRkLlxuICAgIGRvdWJsZSgpIHtcbiAgICAgIGNvbnN0IHsgYTogXywgYjogZyB9ID0gaSwgeCA9IHIubXVsKGcsIEdpKSwgeyBYOiB3LCBZOiBELCBaOiBPIH0gPSB0aGlzO1xuICAgICAgbGV0IFUgPSByLlpFUk8sIFYgPSByLlpFUk8sIEwgPSByLlpFUk8sIG0gPSByLm11bCh3LCB3KSwgdiA9IHIubXVsKEQsIEQpLCBQID0gci5tdWwoTywgTyksIE4gPSByLm11bCh3LCBEKTtcbiAgICAgIHJldHVybiBOID0gci5hZGQoTiwgTiksIEwgPSByLm11bCh3LCBPKSwgTCA9IHIuYWRkKEwsIEwpLCBVID0gci5tdWwoXywgTCksIFYgPSByLm11bCh4LCBQKSwgViA9IHIuYWRkKFUsIFYpLCBVID0gci5zdWIodiwgViksIFYgPSByLmFkZCh2LCBWKSwgViA9IHIubXVsKFUsIFYpLCBVID0gci5tdWwoTiwgVSksIEwgPSByLm11bCh4LCBMKSwgUCA9IHIubXVsKF8sIFApLCBOID0gci5zdWIobSwgUCksIE4gPSByLm11bChfLCBOKSwgTiA9IHIuYWRkKE4sIEwpLCBMID0gci5hZGQobSwgbSksIG0gPSByLmFkZChMLCBtKSwgbSA9IHIuYWRkKG0sIFApLCBtID0gci5tdWwobSwgTiksIFYgPSByLmFkZChWLCBtKSwgUCA9IHIubXVsKEQsIE8pLCBQID0gci5hZGQoUCwgUCksIG0gPSByLm11bChQLCBOKSwgVSA9IHIuc3ViKFUsIG0pLCBMID0gci5tdWwoUCwgdiksIEwgPSByLmFkZChMLCBMKSwgTCA9IHIuYWRkKEwsIEwpLCBuZXcgQyhVLCBWLCBMKTtcbiAgICB9XG4gICAgLy8gUmVuZXMtQ29zdGVsbG8tQmF0aW5hIGV4Y2VwdGlvbi1mcmVlIGFkZGl0aW9uIGZvcm11bGEuXG4gICAgLy8gVGhlcmUgaXMgMzAlIGZhc3RlciBKYWNvYmlhbiBmb3JtdWxhLCBidXQgaXQgaXMgbm90IGNvbXBsZXRlLlxuICAgIC8vIGh0dHBzOi8vZXByaW50LmlhY3Iub3JnLzIwMTUvMTA2MCwgYWxnb3JpdGhtIDFcbiAgICAvLyBDb3N0OiAxMk0gKyAwUyArIDMqYSArIDMqYjMgKyAyM2FkZC5cbiAgICBhZGQoXykge1xuICAgICAgRihfKTtcbiAgICAgIGNvbnN0IHsgWDogZywgWTogeCwgWjogdyB9ID0gdGhpcywgeyBYOiBELCBZOiBPLCBaOiBVIH0gPSBfO1xuICAgICAgbGV0IFYgPSByLlpFUk8sIEwgPSByLlpFUk8sIG0gPSByLlpFUk87XG4gICAgICBjb25zdCB2ID0gaS5hLCBQID0gci5tdWwoaS5iLCBHaSk7XG4gICAgICBsZXQgTiA9IHIubXVsKGcsIEQpLCBZID0gci5tdWwoeCwgTyksIGVlID0gci5tdWwodywgVSksIGllID0gci5hZGQoZywgeCksIGxlID0gci5hZGQoRCwgTyk7XG4gICAgICBpZSA9IHIubXVsKGllLCBsZSksIGxlID0gci5hZGQoTiwgWSksIGllID0gci5zdWIoaWUsIGxlKSwgbGUgPSByLmFkZChnLCB3KTtcbiAgICAgIGxldCBUZSA9IHIuYWRkKEQsIFUpO1xuICAgICAgcmV0dXJuIGxlID0gci5tdWwobGUsIFRlKSwgVGUgPSByLmFkZChOLCBlZSksIGxlID0gci5zdWIobGUsIFRlKSwgVGUgPSByLmFkZCh4LCB3KSwgViA9IHIuYWRkKE8sIFUpLCBUZSA9IHIubXVsKFRlLCBWKSwgViA9IHIuYWRkKFksIGVlKSwgVGUgPSByLnN1YihUZSwgViksIG0gPSByLm11bCh2LCBsZSksIFYgPSByLm11bChQLCBlZSksIG0gPSByLmFkZChWLCBtKSwgViA9IHIuc3ViKFksIG0pLCBtID0gci5hZGQoWSwgbSksIEwgPSByLm11bChWLCBtKSwgWSA9IHIuYWRkKE4sIE4pLCBZID0gci5hZGQoWSwgTiksIGVlID0gci5tdWwodiwgZWUpLCBsZSA9IHIubXVsKFAsIGxlKSwgWSA9IHIuYWRkKFksIGVlKSwgZWUgPSByLnN1YihOLCBlZSksIGVlID0gci5tdWwodiwgZWUpLCBsZSA9IHIuYWRkKGxlLCBlZSksIE4gPSByLm11bChZLCBsZSksIEwgPSByLmFkZChMLCBOKSwgTiA9IHIubXVsKFRlLCBsZSksIFYgPSByLm11bChpZSwgViksIFYgPSByLnN1YihWLCBOKSwgTiA9IHIubXVsKGllLCBZKSwgbSA9IHIubXVsKFRlLCBtKSwgbSA9IHIuYWRkKG0sIE4pLCBuZXcgQyhWLCBMLCBtKTtcbiAgICB9XG4gICAgc3VidHJhY3QoXykge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkKF8ubmVnYXRlKCkpO1xuICAgIH1cbiAgICBpczAoKSB7XG4gICAgICByZXR1cm4gdGhpcy5lcXVhbHMoQy5aRVJPKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ29uc3RhbnQgdGltZSBtdWx0aXBsaWNhdGlvbi5cbiAgICAgKiBVc2VzIHdOQUYgbWV0aG9kLiBXaW5kb3dlZCBtZXRob2QgbWF5IGJlIDEwJSBmYXN0ZXIsXG4gICAgICogYnV0IHRha2VzIDJ4IGxvbmdlciB0byBnZW5lcmF0ZSBhbmQgY29uc3VtZXMgMnggbWVtb3J5LlxuICAgICAqIFVzZXMgcHJlY29tcHV0ZXMgd2hlbiBhdmFpbGFibGUuXG4gICAgICogVXNlcyBlbmRvbW9ycGhpc20gZm9yIEtvYmxpdHogY3VydmVzLlxuICAgICAqIEBwYXJhbSBzY2FsYXIgYnkgd2hpY2ggdGhlIHBvaW50IHdvdWxkIGJlIG11bHRpcGxpZWRcbiAgICAgKiBAcmV0dXJucyBOZXcgcG9pbnRcbiAgICAgKi9cbiAgICBtdWx0aXBseShfKSB7XG4gICAgICBjb25zdCB7IGVuZG86IGcgfSA9IGU7XG4gICAgICBpZiAoIW4uaXNWYWxpZE5vdDAoXykpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgc2NhbGFyOiBvdXQgb2YgcmFuZ2VcIik7XG4gICAgICBsZXQgeCwgdztcbiAgICAgIGNvbnN0IEQgPSAoTykgPT4gJC5jYWNoZWQodGhpcywgTywgKFUpID0+IGpzKEMsIFUpKTtcbiAgICAgIGlmIChnKSB7XG4gICAgICAgIGNvbnN0IHsgazFuZWc6IE8sIGsxOiBVLCBrMm5lZzogViwgazI6IEwgfSA9IE0oXyksIHsgcDogbSwgZjogdiB9ID0gRChVKSwgeyBwOiBQLCBmOiBOIH0gPSBEKEwpO1xuICAgICAgICB3ID0gdi5hZGQoTiksIHggPSBqKGcuYmV0YSwgbSwgUCwgTywgVik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB7IHA6IE8sIGY6IFUgfSA9IEQoXyk7XG4gICAgICAgIHggPSBPLCB3ID0gVTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBqcyhDLCBbeCwgd10pWzBdO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBOb24tY29uc3RhbnQtdGltZSBtdWx0aXBsaWNhdGlvbi4gVXNlcyBkb3VibGUtYW5kLWFkZCBhbGdvcml0aG0uXG4gICAgICogSXQncyBmYXN0ZXIsIGJ1dCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4geW91IGRvbid0IGNhcmUgYWJvdXRcbiAgICAgKiBhbiBleHBvc2VkIHNlY3JldCBrZXkgZS5nLiBzaWcgdmVyaWZpY2F0aW9uLCB3aGljaCB3b3JrcyBvdmVyICpwdWJsaWMqIGtleXMuXG4gICAgICovXG4gICAgbXVsdGlwbHlVbnNhZmUoXykge1xuICAgICAgY29uc3QgeyBlbmRvOiBnIH0gPSBlLCB4ID0gdGhpcztcbiAgICAgIGlmICghbi5pc1ZhbGlkKF8pKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIHNjYWxhcjogb3V0IG9mIHJhbmdlXCIpO1xuICAgICAgaWYgKF8gPT09IGhzIHx8IHguaXMwKCkpXG4gICAgICAgIHJldHVybiBDLlpFUk87XG4gICAgICBpZiAoXyA9PT0gVG4pXG4gICAgICAgIHJldHVybiB4O1xuICAgICAgaWYgKCQuaGFzQ2FjaGUodGhpcykpXG4gICAgICAgIHJldHVybiB0aGlzLm11bHRpcGx5KF8pO1xuICAgICAgaWYgKGcpIHtcbiAgICAgICAgY29uc3QgeyBrMW5lZzogdywgazE6IEQsIGsybmVnOiBPLCBrMjogVSB9ID0gTShfKSwgeyBwMTogViwgcDI6IEwgfSA9IHB5KEMsIHgsIEQsIFUpO1xuICAgICAgICByZXR1cm4gaihnLmJldGEsIFYsIEwsIHcsIE8pO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHJldHVybiAkLnVuc2FmZSh4LCBfKTtcbiAgICB9XG4gICAgbXVsdGlwbHlBbmRBZGRVbnNhZmUoXywgZywgeCkge1xuICAgICAgY29uc3QgdyA9IHRoaXMubXVsdGlwbHlVbnNhZmUoZykuYWRkKF8ubXVsdGlwbHlVbnNhZmUoeCkpO1xuICAgICAgcmV0dXJuIHcuaXMwKCkgPyB2b2lkIDAgOiB3O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0cyBQcm9qZWN0aXZlIHBvaW50IHRvIGFmZmluZSAoeCwgeSkgY29vcmRpbmF0ZXMuXG4gICAgICogQHBhcmFtIGludmVydGVkWiBaXi0xIChpbnZlcnRlZCB6ZXJvKSAtIG9wdGlvbmFsLCBwcmVjb21wdXRhdGlvbiBpcyB1c2VmdWwgZm9yIGludmVydEJhdGNoXG4gICAgICovXG4gICAgdG9BZmZpbmUoXykge1xuICAgICAgcmV0dXJuIEgodGhpcywgXyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIFBvaW50IGlzIGZyZWUgb2YgdG9yc2lvbiBlbGVtZW50cyAoaXMgaW4gcHJpbWUgc3ViZ3JvdXApLlxuICAgICAqIEFsd2F5cyB0b3JzaW9uLWZyZWUgZm9yIGNvZmFjdG9yPTEgY3VydmVzLlxuICAgICAqL1xuICAgIGlzVG9yc2lvbkZyZWUoKSB7XG4gICAgICBjb25zdCB7IGlzVG9yc2lvbkZyZWU6IF8gfSA9IGU7XG4gICAgICByZXR1cm4gbyA9PT0gVG4gPyAhMCA6IF8gPyBfKEMsIHRoaXMpIDogJC51bnNhZmUodGhpcywgYSkuaXMwKCk7XG4gICAgfVxuICAgIGNsZWFyQ29mYWN0b3IoKSB7XG4gICAgICBjb25zdCB7IGNsZWFyQ29mYWN0b3I6IF8gfSA9IGU7XG4gICAgICByZXR1cm4gbyA9PT0gVG4gPyB0aGlzIDogXyA/IF8oQywgdGhpcykgOiB0aGlzLm11bHRpcGx5VW5zYWZlKG8pO1xuICAgIH1cbiAgICBpc1NtYWxsT3JkZXIoKSB7XG4gICAgICByZXR1cm4gdGhpcy5tdWx0aXBseVVuc2FmZShvKS5pczAoKTtcbiAgICB9XG4gICAgdG9CeXRlcyhfID0gITApIHtcbiAgICAgIHJldHVybiBYcyhfLCBcImlzQ29tcHJlc3NlZFwiKSwgdGhpcy5hc3NlcnRWYWxpZGl0eSgpLCBmKEMsIHRoaXMsIF8pO1xuICAgIH1cbiAgICB0b0hleChfID0gITApIHtcbiAgICAgIHJldHVybiBIcyh0aGlzLnRvQnl0ZXMoXykpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgIHJldHVybiBgPFBvaW50ICR7dGhpcy5pczAoKSA/IFwiWkVST1wiIDogdGhpcy50b0hleCgpfT5gO1xuICAgIH1cbiAgICAvLyBUT0RPOiByZW1vdmVcbiAgICBnZXQgcHgoKSB7XG4gICAgICByZXR1cm4gdGhpcy5YO1xuICAgIH1cbiAgICBnZXQgcHkoKSB7XG4gICAgICByZXR1cm4gdGhpcy5YO1xuICAgIH1cbiAgICBnZXQgcHooKSB7XG4gICAgICByZXR1cm4gdGhpcy5aO1xuICAgIH1cbiAgICB0b1Jhd0J5dGVzKF8gPSAhMCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9CeXRlcyhfKTtcbiAgICB9XG4gICAgX3NldFdpbmRvd1NpemUoXykge1xuICAgICAgdGhpcy5wcmVjb21wdXRlKF8pO1xuICAgIH1cbiAgICBzdGF0aWMgbm9ybWFsaXplWihfKSB7XG4gICAgICByZXR1cm4ganMoQywgXyk7XG4gICAgfVxuICAgIHN0YXRpYyBtc20oXywgZykge1xuICAgICAgcmV0dXJuIHAwKEMsIG4sIF8sIGcpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbVByaXZhdGVLZXkoXykge1xuICAgICAgcmV0dXJuIEMuQkFTRS5tdWx0aXBseShFbihuLCBfKSk7XG4gICAgfVxuICB9XG4gIEMuQkFTRSA9IG5ldyBDKGkuR3gsIGkuR3ksIHIuT05FKSwgQy5aRVJPID0gbmV3IEMoci5aRVJPLCByLk9ORSwgci5aRVJPKSwgQy5GcCA9IHIsIEMuRm4gPSBuO1xuICBjb25zdCBrID0gbi5CSVRTLCAkID0gbmV3IGcwKEMsIGUuZW5kbyA/IE1hdGguY2VpbChrIC8gMikgOiBrKTtcbiAgcmV0dXJuIEMuQkFTRS5wcmVjb21wdXRlKDgpLCBDO1xufVxuZnVuY3Rpb24gUDAocykge1xuICByZXR1cm4gVWludDhBcnJheS5vZihzID8gMiA6IDMpO1xufVxuZnVuY3Rpb24gTTAocywgZSkge1xuICByZXR1cm4ge1xuICAgIHNlY3JldEtleTogZS5CWVRFUyxcbiAgICBwdWJsaWNLZXk6IDEgKyBzLkJZVEVTLFxuICAgIHB1YmxpY0tleVVuY29tcHJlc3NlZDogMSArIDIgKiBzLkJZVEVTLFxuICAgIHB1YmxpY0tleUhhc1ByZWZpeDogITAsXG4gICAgc2lnbmF0dXJlOiAyICogZS5CWVRFU1xuICB9O1xufVxuZnVuY3Rpb24gWHYocywgZSA9IHt9KSB7XG4gIGNvbnN0IHsgRm46IHQgfSA9IHMsIHIgPSBlLnJhbmRvbUJ5dGVzIHx8IHFjLCBuID0gT2JqZWN0LmFzc2lnbihNMChzLkZwLCB0KSwgeyBzZWVkOiBkMCh0Lk9SREVSKSB9KTtcbiAgZnVuY3Rpb24gaShmKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhIUVuKHQsIGYpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBvKGYsIHApIHtcbiAgICBjb25zdCB7IHB1YmxpY0tleTogeSwgcHVibGljS2V5VW5jb21wcmVzc2VkOiBFIH0gPSBuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBiID0gZi5sZW5ndGg7XG4gICAgICByZXR1cm4gcCA9PT0gITAgJiYgYiAhPT0geSB8fCBwID09PSAhMSAmJiBiICE9PSBFID8gITEgOiAhIXMuZnJvbUJ5dGVzKGYpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBhKGYgPSByKG4uc2VlZCkpIHtcbiAgICByZXR1cm4gaHkoT3IoZiwgbi5zZWVkLCBcInNlZWRcIiksIHQuT1JERVIpO1xuICB9XG4gIGZ1bmN0aW9uIGwoZiwgcCA9ICEwKSB7XG4gICAgcmV0dXJuIHMuQkFTRS5tdWx0aXBseShFbih0LCBmKSkudG9CeXRlcyhwKTtcbiAgfVxuICBmdW5jdGlvbiBjKGYpIHtcbiAgICBjb25zdCBwID0gYShmKTtcbiAgICByZXR1cm4geyBzZWNyZXRLZXk6IHAsIHB1YmxpY0tleTogbChwKSB9O1xuICB9XG4gIGZ1bmN0aW9uIHUoZikge1xuICAgIGlmICh0eXBlb2YgZiA9PSBcImJpZ2ludFwiKVxuICAgICAgcmV0dXJuICExO1xuICAgIGlmIChmIGluc3RhbmNlb2YgcylcbiAgICAgIHJldHVybiAhMDtcbiAgICBjb25zdCB7IHNlY3JldEtleTogcCwgcHVibGljS2V5OiB5LCBwdWJsaWNLZXlVbmNvbXByZXNzZWQ6IEUgfSA9IG47XG4gICAgaWYgKHQuYWxsb3dlZExlbmd0aHMgfHwgcCA9PT0geSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBiID0gRXQoXCJrZXlcIiwgZikubGVuZ3RoO1xuICAgIHJldHVybiBiID09PSB5IHx8IGIgPT09IEU7XG4gIH1cbiAgZnVuY3Rpb24gZChmLCBwLCB5ID0gITApIHtcbiAgICBpZiAodShmKSA9PT0gITApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJmaXJzdCBhcmcgbXVzdCBiZSBwcml2YXRlIGtleVwiKTtcbiAgICBpZiAodShwKSA9PT0gITEpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzZWNvbmQgYXJnIG11c3QgYmUgcHVibGljIGtleVwiKTtcbiAgICBjb25zdCBFID0gRW4odCwgZik7XG4gICAgcmV0dXJuIHMuZnJvbUhleChwKS5tdWx0aXBseShFKS50b0J5dGVzKHkpO1xuICB9XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHsgZ2V0UHVibGljS2V5OiBsLCBnZXRTaGFyZWRTZWNyZXQ6IGQsIGtleWdlbjogYywgUG9pbnQ6IHMsIHV0aWxzOiB7XG4gICAgaXNWYWxpZFNlY3JldEtleTogaSxcbiAgICBpc1ZhbGlkUHVibGljS2V5OiBvLFxuICAgIHJhbmRvbVNlY3JldEtleTogYSxcbiAgICAvLyBUT0RPOiByZW1vdmVcbiAgICBpc1ZhbGlkUHJpdmF0ZUtleTogaSxcbiAgICByYW5kb21Qcml2YXRlS2V5OiBhLFxuICAgIG5vcm1Qcml2YXRlS2V5VG9TY2FsYXI6IChmKSA9PiBFbih0LCBmKSxcbiAgICBwcmVjb21wdXRlKGYgPSA4LCBwID0gcy5CQVNFKSB7XG4gICAgICByZXR1cm4gcC5wcmVjb21wdXRlKGYsICExKTtcbiAgICB9XG4gIH0sIGxlbmd0aHM6IG4gfSk7XG59XG5mdW5jdGlvbiBKdihzLCBlLCB0ID0ge30pIHtcbiAgSGYoZSksIFJpKHQsIHt9LCB7XG4gICAgaG1hYzogXCJmdW5jdGlvblwiLFxuICAgIGxvd1M6IFwiYm9vbGVhblwiLFxuICAgIHJhbmRvbUJ5dGVzOiBcImZ1bmN0aW9uXCIsXG4gICAgYml0czJpbnQ6IFwiZnVuY3Rpb25cIixcbiAgICBiaXRzMmludF9tb2ROOiBcImZ1bmN0aW9uXCJcbiAgfSk7XG4gIGNvbnN0IHIgPSB0LnJhbmRvbUJ5dGVzIHx8IHFjLCBuID0gdC5obWFjIHx8ICgoZywgLi4ueCkgPT4gazAoZSwgZywgS3IoLi4ueCkpKSwgeyBGcDogaSwgRm46IG8gfSA9IHMsIHsgT1JERVI6IGEsIEJJVFM6IGwgfSA9IG8sIHsga2V5Z2VuOiBjLCBnZXRQdWJsaWNLZXk6IHUsIGdldFNoYXJlZFNlY3JldDogZCwgdXRpbHM6IGgsIGxlbmd0aHM6IGYgfSA9IFh2KHMsIHQpLCBwID0ge1xuICAgIHByZWhhc2g6ICExLFxuICAgIGxvd1M6IHR5cGVvZiB0Lmxvd1MgPT0gXCJib29sZWFuXCIgPyB0Lmxvd1MgOiAhMSxcbiAgICBmb3JtYXQ6IHZvaWQgMCxcbiAgICAvLydjb21wYWN0JyBhcyBFQ0RTQVNpZ0Zvcm1hdCxcbiAgICBleHRyYUVudHJvcHk6ICExXG4gIH0sIHkgPSBcImNvbXBhY3RcIjtcbiAgZnVuY3Rpb24gRShnKSB7XG4gICAgY29uc3QgeCA9IGEgPj4gVG47XG4gICAgcmV0dXJuIGcgPiB4O1xuICB9XG4gIGZ1bmN0aW9uIGIoZywgeCkge1xuICAgIGlmICghby5pc1ZhbGlkTm90MCh4KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBzaWduYXR1cmUgJHtnfTogb3V0IG9mIHJhbmdlIDEuLlBvaW50LkZuLk9SREVSYCk7XG4gICAgcmV0dXJuIHg7XG4gIH1cbiAgZnVuY3Rpb24gUihnLCB4KSB7XG4gICAgZWMoeCk7XG4gICAgY29uc3QgdyA9IGYuc2lnbmF0dXJlLCBEID0geCA9PT0gXCJjb21wYWN0XCIgPyB3IDogeCA9PT0gXCJyZWNvdmVyZWRcIiA/IHcgKyAxIDogdm9pZCAwO1xuICAgIHJldHVybiBPcihnLCBELCBgJHt4fSBzaWduYXR1cmVgKTtcbiAgfVxuICBjbGFzcyBBIHtcbiAgICBjb25zdHJ1Y3Rvcih4LCB3LCBEKSB7XG4gICAgICB0aGlzLnIgPSBiKFwiclwiLCB4KSwgdGhpcy5zID0gYihcInNcIiwgdyksIEQgIT0gbnVsbCAmJiAodGhpcy5yZWNvdmVyeSA9IEQpLCBPYmplY3QuZnJlZXplKHRoaXMpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbUJ5dGVzKHgsIHcgPSB5KSB7XG4gICAgICBSKHgsIHcpO1xuICAgICAgbGV0IEQ7XG4gICAgICBpZiAodyA9PT0gXCJkZXJcIikge1xuICAgICAgICBjb25zdCB7IHI6IEwsIHM6IG0gfSA9IGNzLnRvU2lnKE9yKHgpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBBKEwsIG0pO1xuICAgICAgfVxuICAgICAgdyA9PT0gXCJyZWNvdmVyZWRcIiAmJiAoRCA9IHhbMF0sIHcgPSBcImNvbXBhY3RcIiwgeCA9IHguc3ViYXJyYXkoMSkpO1xuICAgICAgY29uc3QgTyA9IG8uQllURVMsIFUgPSB4LnN1YmFycmF5KDAsIE8pLCBWID0geC5zdWJhcnJheShPLCBPICogMik7XG4gICAgICByZXR1cm4gbmV3IEEoby5mcm9tQnl0ZXMoVSksIG8uZnJvbUJ5dGVzKFYpLCBEKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21IZXgoeCwgdykge1xuICAgICAgcmV0dXJuIHRoaXMuZnJvbUJ5dGVzKFBvKHgpLCB3KTtcbiAgICB9XG4gICAgYWRkUmVjb3ZlcnlCaXQoeCkge1xuICAgICAgcmV0dXJuIG5ldyBBKHRoaXMuciwgdGhpcy5zLCB4KTtcbiAgICB9XG4gICAgcmVjb3ZlclB1YmxpY0tleSh4KSB7XG4gICAgICBjb25zdCB3ID0gaS5PUkRFUiwgeyByOiBELCBzOiBPLCByZWNvdmVyeTogVSB9ID0gdGhpcztcbiAgICAgIGlmIChVID09IG51bGwgfHwgIVswLCAxLCAyLCAzXS5pbmNsdWRlcyhVKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVjb3ZlcnkgaWQgaW52YWxpZFwiKTtcbiAgICAgIGlmIChhICogRDAgPCB3ICYmIFUgPiAxKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWNvdmVyeSBpZCBpcyBhbWJpZ3VvdXMgZm9yIGg+MSBjdXJ2ZVwiKTtcbiAgICAgIGNvbnN0IEwgPSBVID09PSAyIHx8IFUgPT09IDMgPyBEICsgYSA6IEQ7XG4gICAgICBpZiAoIWkuaXNWYWxpZChMKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicmVjb3ZlcnkgaWQgMiBvciAzIGludmFsaWRcIik7XG4gICAgICBjb25zdCBtID0gaS50b0J5dGVzKEwpLCB2ID0gcy5mcm9tQnl0ZXMoS3IoUDAoKFUgJiAxKSA9PT0gMCksIG0pKSwgUCA9IG8uaW52KEwpLCBOID0gTShFdChcIm1zZ0hhc2hcIiwgeCkpLCBZID0gby5jcmVhdGUoLU4gKiBQKSwgZWUgPSBvLmNyZWF0ZShPICogUCksIGllID0gcy5CQVNFLm11bHRpcGx5VW5zYWZlKFkpLmFkZCh2Lm11bHRpcGx5VW5zYWZlKGVlKSk7XG4gICAgICBpZiAoaWUuaXMwKCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInBvaW50IGF0IGluZmluaWZ5XCIpO1xuICAgICAgcmV0dXJuIGllLmFzc2VydFZhbGlkaXR5KCksIGllO1xuICAgIH1cbiAgICAvLyBTaWduYXR1cmVzIHNob3VsZCBiZSBsb3ctcywgdG8gcHJldmVudCBtYWxsZWFiaWxpdHkuXG4gICAgaGFzSGlnaFMoKSB7XG4gICAgICByZXR1cm4gRSh0aGlzLnMpO1xuICAgIH1cbiAgICB0b0J5dGVzKHggPSB5KSB7XG4gICAgICBpZiAoZWMoeCksIHggPT09IFwiZGVyXCIpXG4gICAgICAgIHJldHVybiBQbyhjcy5oZXhGcm9tU2lnKHRoaXMpKTtcbiAgICAgIGNvbnN0IHcgPSBvLnRvQnl0ZXModGhpcy5yKSwgRCA9IG8udG9CeXRlcyh0aGlzLnMpO1xuICAgICAgaWYgKHggPT09IFwicmVjb3ZlcmVkXCIpIHtcbiAgICAgICAgaWYgKHRoaXMucmVjb3ZlcnkgPT0gbnVsbClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJyZWNvdmVyeSBiaXQgbXVzdCBiZSBwcmVzZW50XCIpO1xuICAgICAgICByZXR1cm4gS3IoVWludDhBcnJheS5vZih0aGlzLnJlY292ZXJ5KSwgdywgRCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gS3IodywgRCk7XG4gICAgfVxuICAgIHRvSGV4KHgpIHtcbiAgICAgIHJldHVybiBIcyh0aGlzLnRvQnl0ZXMoeCkpO1xuICAgIH1cbiAgICAvLyBUT0RPOiByZW1vdmVcbiAgICBhc3NlcnRWYWxpZGl0eSgpIHtcbiAgICB9XG4gICAgc3RhdGljIGZyb21Db21wYWN0KHgpIHtcbiAgICAgIHJldHVybiBBLmZyb21CeXRlcyhFdChcInNpZ1wiLCB4KSwgXCJjb21wYWN0XCIpO1xuICAgIH1cbiAgICBzdGF0aWMgZnJvbURFUih4KSB7XG4gICAgICByZXR1cm4gQS5mcm9tQnl0ZXMoRXQoXCJzaWdcIiwgeCksIFwiZGVyXCIpO1xuICAgIH1cbiAgICBub3JtYWxpemVTKCkge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzSGlnaFMoKSA/IG5ldyBBKHRoaXMuciwgby5uZWcodGhpcy5zKSwgdGhpcy5yZWNvdmVyeSkgOiB0aGlzO1xuICAgIH1cbiAgICB0b0RFUlJhd0J5dGVzKCkge1xuICAgICAgcmV0dXJuIHRoaXMudG9CeXRlcyhcImRlclwiKTtcbiAgICB9XG4gICAgdG9ERVJIZXgoKSB7XG4gICAgICByZXR1cm4gSHModGhpcy50b0J5dGVzKFwiZGVyXCIpKTtcbiAgICB9XG4gICAgdG9Db21wYWN0UmF3Qnl0ZXMoKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0J5dGVzKFwiY29tcGFjdFwiKTtcbiAgICB9XG4gICAgdG9Db21wYWN0SGV4KCkge1xuICAgICAgcmV0dXJuIEhzKHRoaXMudG9CeXRlcyhcImNvbXBhY3RcIikpO1xuICAgIH1cbiAgfVxuICBjb25zdCBGID0gdC5iaXRzMmludCB8fCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHgubGVuZ3RoID4gODE5MilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImlucHV0IGlzIHRvbyBsYXJnZVwiKTtcbiAgICBjb25zdCB3ID0gbGEoeCksIEQgPSB4Lmxlbmd0aCAqIDggLSBsO1xuICAgIHJldHVybiBEID4gMCA/IHcgPj4gQmlnSW50KEQpIDogdztcbiAgfSwgTSA9IHQuYml0czJpbnRfbW9kTiB8fCBmdW5jdGlvbih4KSB7XG4gICAgcmV0dXJuIG8uY3JlYXRlKEYoeCkpO1xuICB9LCBIID0gX2kobCk7XG4gIGZ1bmN0aW9uIEsoZykge1xuICAgIHJldHVybiBRbChcIm51bSA8IDJeXCIgKyBsLCBnLCBocywgSCksIG8udG9CeXRlcyhnKTtcbiAgfVxuICBmdW5jdGlvbiBqKGcsIHgpIHtcbiAgICByZXR1cm4gT3IoZywgdm9pZCAwLCBcIm1lc3NhZ2VcIiksIHggPyBPcihlKGcpLCB2b2lkIDAsIFwicHJlaGFzaGVkIG1lc3NhZ2VcIikgOiBnO1xuICB9XG4gIGZ1bmN0aW9uIEMoZywgeCwgdykge1xuICAgIGlmIChbXCJyZWNvdmVyZWRcIiwgXCJjYW5vbmljYWxcIl0uc29tZSgoWSkgPT4gWSBpbiB3KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInNpZ24oKSBsZWdhY3kgb3B0aW9ucyBub3Qgc3VwcG9ydGVkXCIpO1xuICAgIGNvbnN0IHsgbG93UzogRCwgcHJlaGFzaDogTywgZXh0cmFFbnRyb3B5OiBVIH0gPSBhbCh3LCBwKTtcbiAgICBnID0gaihnLCBPKTtcbiAgICBjb25zdCBWID0gTShnKSwgTCA9IEVuKG8sIHgpLCBtID0gW0soTCksIEsoVildO1xuICAgIGlmIChVICE9IG51bGwgJiYgVSAhPT0gITEpIHtcbiAgICAgIGNvbnN0IFkgPSBVID09PSAhMCA/IHIoZi5zZWNyZXRLZXkpIDogVTtcbiAgICAgIG0ucHVzaChFdChcImV4dHJhRW50cm9weVwiLCBZKSk7XG4gICAgfVxuICAgIGNvbnN0IHYgPSBLciguLi5tKSwgUCA9IFY7XG4gICAgZnVuY3Rpb24gTihZKSB7XG4gICAgICBjb25zdCBlZSA9IEYoWSk7XG4gICAgICBpZiAoIW8uaXNWYWxpZE5vdDAoZWUpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBpZSA9IG8uaW52KGVlKSwgbGUgPSBzLkJBU0UubXVsdGlwbHkoZWUpLnRvQWZmaW5lKCksIFRlID0gby5jcmVhdGUobGUueCk7XG4gICAgICBpZiAoVGUgPT09IGhzKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBEZSA9IG8uY3JlYXRlKGllICogby5jcmVhdGUoUCArIFRlICogTCkpO1xuICAgICAgaWYgKERlID09PSBocylcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbGV0IHplID0gKGxlLnggPT09IFRlID8gMCA6IDIpIHwgTnVtYmVyKGxlLnkgJiBUbiksIF9lID0gRGU7XG4gICAgICByZXR1cm4gRCAmJiBFKERlKSAmJiAoX2UgPSBvLm5lZyhEZSksIHplIF49IDEpLCBuZXcgQShUZSwgX2UsIHplKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc2VlZDogdiwgazJzaWc6IE4gfTtcbiAgfVxuICBmdW5jdGlvbiBrKGcsIHgsIHcgPSB7fSkge1xuICAgIGcgPSBFdChcIm1lc3NhZ2VcIiwgZyk7XG4gICAgY29uc3QgeyBzZWVkOiBELCBrMnNpZzogTyB9ID0gQyhnLCB4LCB3KTtcbiAgICByZXR1cm4gcnkoZS5vdXRwdXRMZW4sIG8uQllURVMsIG4pKEQsIE8pO1xuICB9XG4gIGZ1bmN0aW9uICQoZykge1xuICAgIGxldCB4O1xuICAgIGNvbnN0IHcgPSB0eXBlb2YgZyA9PSBcInN0cmluZ1wiIHx8IElpKGcpLCBEID0gIXcgJiYgZyAhPT0gbnVsbCAmJiB0eXBlb2YgZyA9PSBcIm9iamVjdFwiICYmIHR5cGVvZiBnLnIgPT0gXCJiaWdpbnRcIiAmJiB0eXBlb2YgZy5zID09IFwiYmlnaW50XCI7XG4gICAgaWYgKCF3ICYmICFEKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBzaWduYXR1cmUsIGV4cGVjdGVkIFVpbnQ4QXJyYXksIGhleCBzdHJpbmcgb3IgU2lnbmF0dXJlIGluc3RhbmNlXCIpO1xuICAgIGlmIChEKVxuICAgICAgeCA9IG5ldyBBKGcuciwgZy5zKTtcbiAgICBlbHNlIGlmICh3KSB7XG4gICAgICB0cnkge1xuICAgICAgICB4ID0gQS5mcm9tQnl0ZXMoRXQoXCJzaWdcIiwgZyksIFwiZGVyXCIpO1xuICAgICAgfSBjYXRjaCAoTykge1xuICAgICAgICBpZiAoIShPIGluc3RhbmNlb2YgY3MuRXJyKSlcbiAgICAgICAgICB0aHJvdyBPO1xuICAgICAgfVxuICAgICAgaWYgKCF4KVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHggPSBBLmZyb21CeXRlcyhFdChcInNpZ1wiLCBnKSwgXCJjb21wYWN0XCIpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gITE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHggfHwgITE7XG4gIH1cbiAgZnVuY3Rpb24gVyhnLCB4LCB3LCBEID0ge30pIHtcbiAgICBjb25zdCB7IGxvd1M6IE8sIHByZWhhc2g6IFUsIGZvcm1hdDogViB9ID0gYWwoRCwgcCk7XG4gICAgaWYgKHcgPSBFdChcInB1YmxpY0tleVwiLCB3KSwgeCA9IGooRXQoXCJtZXNzYWdlXCIsIHgpLCBVKSwgXCJzdHJpY3RcIiBpbiBEKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwib3B0aW9ucy5zdHJpY3Qgd2FzIHJlbmFtZWQgdG8gbG93U1wiKTtcbiAgICBjb25zdCBMID0gViA9PT0gdm9pZCAwID8gJChnKSA6IEEuZnJvbUJ5dGVzKEV0KFwic2lnXCIsIGcpLCBWKTtcbiAgICBpZiAoTCA9PT0gITEpXG4gICAgICByZXR1cm4gITE7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG0gPSBzLmZyb21CeXRlcyh3KTtcbiAgICAgIGlmIChPICYmIEwuaGFzSGlnaFMoKSlcbiAgICAgICAgcmV0dXJuICExO1xuICAgICAgY29uc3QgeyByOiB2LCBzOiBQIH0gPSBMLCBOID0gTSh4KSwgWSA9IG8uaW52KFApLCBlZSA9IG8uY3JlYXRlKE4gKiBZKSwgaWUgPSBvLmNyZWF0ZSh2ICogWSksIGxlID0gcy5CQVNFLm11bHRpcGx5VW5zYWZlKGVlKS5hZGQobS5tdWx0aXBseVVuc2FmZShpZSkpO1xuICAgICAgcmV0dXJuIGxlLmlzMCgpID8gITEgOiBvLmNyZWF0ZShsZS54KSA9PT0gdjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gXyhnLCB4LCB3ID0ge30pIHtcbiAgICBjb25zdCB7IHByZWhhc2g6IEQgfSA9IGFsKHcsIHApO1xuICAgIHJldHVybiB4ID0gaih4LCBEKSwgQS5mcm9tQnl0ZXMoZywgXCJyZWNvdmVyZWRcIikucmVjb3ZlclB1YmxpY0tleSh4KS50b0J5dGVzKCk7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIGtleWdlbjogYyxcbiAgICBnZXRQdWJsaWNLZXk6IHUsXG4gICAgZ2V0U2hhcmVkU2VjcmV0OiBkLFxuICAgIHV0aWxzOiBoLFxuICAgIGxlbmd0aHM6IGYsXG4gICAgUG9pbnQ6IHMsXG4gICAgc2lnbjogayxcbiAgICB2ZXJpZnk6IFcsXG4gICAgcmVjb3ZlclB1YmxpY0tleTogXyxcbiAgICBTaWduYXR1cmU6IEEsXG4gICAgaGFzaDogZVxuICB9KTtcbn1cbmZ1bmN0aW9uIFF2KHMpIHtcbiAgY29uc3QgZSA9IHtcbiAgICBhOiBzLmEsXG4gICAgYjogcy5iLFxuICAgIHA6IHMuRnAuT1JERVIsXG4gICAgbjogcy5uLFxuICAgIGg6IHMuaCxcbiAgICBHeDogcy5HeCxcbiAgICBHeTogcy5HeVxuICB9LCB0ID0gcy5GcDtcbiAgbGV0IHIgPSBzLmFsbG93ZWRQcml2YXRlS2V5TGVuZ3RocyA/IEFycmF5LmZyb20obmV3IFNldChzLmFsbG93ZWRQcml2YXRlS2V5TGVuZ3Rocy5tYXAoKG8pID0+IE1hdGguY2VpbChvIC8gMikpKSkgOiB2b2lkIDA7XG4gIGNvbnN0IG4gPSBlbihlLm4sIHtcbiAgICBCSVRTOiBzLm5CaXRMZW5ndGgsXG4gICAgYWxsb3dlZExlbmd0aHM6IHIsXG4gICAgbW9kRnJvbUJ5dGVzOiBzLndyYXBQcml2YXRlS2V5XG4gIH0pLCBpID0ge1xuICAgIEZwOiB0LFxuICAgIEZuOiBuLFxuICAgIGFsbG93SW5maW5pdHlQb2ludDogcy5hbGxvd0luZmluaXR5UG9pbnQsXG4gICAgZW5kbzogcy5lbmRvLFxuICAgIGlzVG9yc2lvbkZyZWU6IHMuaXNUb3JzaW9uRnJlZSxcbiAgICBjbGVhckNvZmFjdG9yOiBzLmNsZWFyQ29mYWN0b3IsXG4gICAgZnJvbUJ5dGVzOiBzLmZyb21CeXRlcyxcbiAgICB0b0J5dGVzOiBzLnRvQnl0ZXNcbiAgfTtcbiAgcmV0dXJuIHsgQ1VSVkU6IGUsIGN1cnZlT3B0czogaSB9O1xufVxuZnVuY3Rpb24gZUUocykge1xuICBjb25zdCB7IENVUlZFOiBlLCBjdXJ2ZU9wdHM6IHQgfSA9IFF2KHMpLCByID0ge1xuICAgIGhtYWM6IHMuaG1hYyxcbiAgICByYW5kb21CeXRlczogcy5yYW5kb21CeXRlcyxcbiAgICBsb3dTOiBzLmxvd1MsXG4gICAgYml0czJpbnQ6IHMuYml0czJpbnQsXG4gICAgYml0czJpbnRfbW9kTjogcy5iaXRzMmludF9tb2ROXG4gIH07XG4gIHJldHVybiB7IENVUlZFOiBlLCBjdXJ2ZU9wdHM6IHQsIGhhc2g6IHMuaGFzaCwgZWNkc2FPcHRzOiByIH07XG59XG5mdW5jdGlvbiB0RShzLCBlKSB7XG4gIGNvbnN0IHQgPSBlLlBvaW50O1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgZSwge1xuICAgIFByb2plY3RpdmVQb2ludDogdCxcbiAgICBDVVJWRTogT2JqZWN0LmFzc2lnbih7fSwgcywgYzAodC5Gbi5PUkRFUiwgdC5Gbi5CSVRTKSlcbiAgfSk7XG59XG5mdW5jdGlvbiByRShzKSB7XG4gIGNvbnN0IHsgQ1VSVkU6IGUsIGN1cnZlT3B0czogdCwgaGFzaDogciwgZWNkc2FPcHRzOiBuIH0gPSBlRShzKSwgaSA9IFp2KGUsIHQpLCBvID0gSnYoaSwgciwgbik7XG4gIHJldHVybiB0RShzLCBvKTtcbn1cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmZ1bmN0aW9uIHNFKHMsIGUpIHtcbiAgY29uc3QgdCA9IChyKSA9PiByRSh7IC4uLnMsIGhhc2g6IHIgfSk7XG4gIHJldHVybiB7IC4uLnQoZSksIGNyZWF0ZTogdCB9O1xufVxuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuY29uc3QgdHUgPSB7XG4gIHA6IEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmVmZmZmZmMyZlwiKSxcbiAgbjogQmlnSW50KFwiMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWJhYWVkY2U2YWY0OGEwM2JiZmQyNWU4Y2QwMzY0MTQxXCIpLFxuICBoOiBCaWdJbnQoMSksXG4gIGE6IEJpZ0ludCgwKSxcbiAgYjogQmlnSW50KDcpLFxuICBHeDogQmlnSW50KFwiMHg3OWJlNjY3ZWY5ZGNiYmFjNTVhMDYyOTVjZTg3MGIwNzAyOWJmY2RiMmRjZTI4ZDk1OWYyODE1YjE2ZjgxNzk4XCIpLFxuICBHeTogQmlnSW50KFwiMHg0ODNhZGE3NzI2YTNjNDY1NWRhNGZiZmMwZTExMDhhOGZkMTdiNDQ4YTY4NTU0MTk5YzQ3ZDA4ZmZiMTBkNGI4XCIpXG59LCBuRSA9IHtcbiAgYmV0YTogQmlnSW50KFwiMHg3YWU5NmEyYjY1N2MwNzEwNmU2NDQ3OWVhYzM0MzRlOTljZjA0OTc1MTJmNTg5OTVjMTM5NmMyODcxOTUwMWVlXCIpLFxuICBiYXNpc2VzOiBbXG4gICAgW0JpZ0ludChcIjB4MzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTVcIiksIC1CaWdJbnQoXCIweGU0NDM3ZWQ2MDEwZTg4Mjg2ZjU0N2ZhOTBhYmZlNGMzXCIpXSxcbiAgICBbQmlnSW50KFwiMHgxMTRjYTUwZjdhOGUyZjNmNjU3YzExMDhkOWQ0NGNmZDhcIiksIEJpZ0ludChcIjB4MzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTVcIildXG4gIF1cbn0sIEJkID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgyKTtcbmZ1bmN0aW9uIGlFKHMpIHtcbiAgY29uc3QgZSA9IHR1LnAsIHQgPSBCaWdJbnQoMyksIHIgPSBCaWdJbnQoNiksIG4gPSBCaWdJbnQoMTEpLCBpID0gQmlnSW50KDIyKSwgbyA9IEJpZ0ludCgyMyksIGEgPSBCaWdJbnQoNDQpLCBsID0gQmlnSW50KDg4KSwgYyA9IHMgKiBzICogcyAlIGUsIHUgPSBjICogYyAqIHMgJSBlLCBkID0gdnQodSwgdCwgZSkgKiB1ICUgZSwgaCA9IHZ0KGQsIHQsIGUpICogdSAlIGUsIGYgPSB2dChoLCBCZCwgZSkgKiBjICUgZSwgcCA9IHZ0KGYsIG4sIGUpICogZiAlIGUsIHkgPSB2dChwLCBpLCBlKSAqIHAgJSBlLCBFID0gdnQoeSwgYSwgZSkgKiB5ICUgZSwgYiA9IHZ0KEUsIGwsIGUpICogRSAlIGUsIFIgPSB2dChiLCBhLCBlKSAqIHkgJSBlLCBBID0gdnQoUiwgdCwgZSkgKiB1ICUgZSwgRiA9IHZ0KEEsIG8sIGUpICogcCAlIGUsIE0gPSB2dChGLCByLCBlKSAqIGMgJSBlLCBIID0gdnQoTSwgQmQsIGUpO1xuICBpZiAoIXRjLmVxbCh0Yy5zcXIoSCksIHMpKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIHNxdWFyZSByb290XCIpO1xuICByZXR1cm4gSDtcbn1cbmNvbnN0IHRjID0gZW4odHUucCwgeyBzcXJ0OiBpRSB9KSwgb0UgPSBzRSh7IC4uLnR1LCBGcDogdGMsIGxvd1M6ICEwLCBlbmRvOiBuRSB9LCBYZik7XG5MaS51dGlscy5yYW5kb21Qcml2YXRlS2V5O1xuTGkuZ2V0UHVibGljS2V5O1xuZnVuY3Rpb24gRmQocykge1xuICB0cnkge1xuICAgIHJldHVybiBMaS5FeHRlbmRlZFBvaW50LmZyb21IZXgocyksICEwO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gITE7XG4gIH1cbn1cbmNvbnN0IE8wID0gKHMsIGUpID0+IExpLnNpZ24ocywgZS5zbGljZSgwLCAzMikpLCBhRSA9IExpLnZlcmlmeSwgcnUgPSAocykgPT4gSGUuQnVmZmVyLmlzQnVmZmVyKHMpID8gcyA6IHMgaW5zdGFuY2VvZiBVaW50OEFycmF5ID8gSGUuQnVmZmVyLmZyb20ocy5idWZmZXIsIHMuYnl0ZU9mZnNldCwgcy5ieXRlTGVuZ3RoKSA6IEhlLkJ1ZmZlci5mcm9tKHMpO1xuY2xhc3MgbEUge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBlKTtcbiAgfVxuICBlbmNvZGUoKSB7XG4gICAgcmV0dXJuIEhlLkJ1ZmZlci5mcm9tKEphLnNlcmlhbGl6ZSh1bywgdGhpcykpO1xuICB9XG4gIHN0YXRpYyBkZWNvZGUoZSkge1xuICAgIHJldHVybiBKYS5kZXNlcmlhbGl6ZSh1bywgdGhpcywgZSk7XG4gIH1cbiAgc3RhdGljIGRlY29kZVVuY2hlY2tlZChlKSB7XG4gICAgcmV0dXJuIEphLmRlc2VyaWFsaXplVW5jaGVja2VkKHVvLCB0aGlzLCBlKTtcbiAgfVxufVxuY29uc3QgdW8gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xudmFyIEIwO1xuY29uc3QgY0UgPSAzMiwga3MgPSAzMjtcbmZ1bmN0aW9uIHVFKHMpIHtcbiAgcmV0dXJuIHMuX2JuICE9PSB2b2lkIDA7XG59XG5sZXQgTmQgPSAxO1xuY2xhc3MgT2UgZXh0ZW5kcyBsRSB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgUHVibGljS2V5IG9iamVjdFxuICAgKiBAcGFyYW0gdmFsdWUgZWQyNTUxOSBwdWJsaWMga2V5IGFzIGJ1ZmZlciBvciBiYXNlLTU4IGVuY29kZWQgc3RyaW5nXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgaWYgKHN1cGVyKHt9KSwgdGhpcy5fYm4gPSB2b2lkIDAsIHVFKGUpKVxuICAgICAgdGhpcy5fYm4gPSBlLl9ibjtcbiAgICBlbHNlIHtcbiAgICAgIGlmICh0eXBlb2YgZSA9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnN0IHQgPSBhci5kZWNvZGUoZSk7XG4gICAgICAgIGlmICh0Lmxlbmd0aCAhPSBrcylcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHB1YmxpYyBrZXkgaW5wdXRcIik7XG4gICAgICAgIHRoaXMuX2JuID0gbmV3IGJkKHQpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIHRoaXMuX2JuID0gbmV3IGJkKGUpO1xuICAgICAgaWYgKHRoaXMuX2JuLmJ5dGVMZW5ndGgoKSA+IGtzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHB1YmxpYyBrZXkgaW5wdXRcIik7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgdW5pcXVlIFB1YmxpY0tleSBmb3IgdGVzdHMgYW5kIGJlbmNobWFya3MgdXNpbmcgYSBjb3VudGVyXG4gICAqL1xuICBzdGF0aWMgdW5pcXVlKCkge1xuICAgIGNvbnN0IGUgPSBuZXcgT2UoTmQpO1xuICAgIHJldHVybiBOZCArPSAxLCBuZXcgT2UoZS50b0J1ZmZlcigpKTtcbiAgfVxuICAvKipcbiAgICogRGVmYXVsdCBwdWJsaWMga2V5IHZhbHVlLiBUaGUgYmFzZTU4LWVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlzIGFsbCBvbmVzIChhcyBzZWVuIGJlbG93KVxuICAgKiBUaGUgdW5kZXJseWluZyBCTiBudW1iZXIgaXMgMzIgYnl0ZXMgdGhhdCBhcmUgYWxsIHplcm9zXG4gICAqL1xuICAvKipcbiAgICogQ2hlY2tzIGlmIHR3byBwdWJsaWNLZXlzIGFyZSBlcXVhbFxuICAgKi9cbiAgZXF1YWxzKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fYm4uZXEoZS5fYm4pO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGJhc2UtNTggcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXlcbiAgICovXG4gIHRvQmFzZTU4KCkge1xuICAgIHJldHVybiBhci5lbmNvZGUodGhpcy50b0J5dGVzKCkpO1xuICB9XG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4gdGhpcy50b0Jhc2U1OCgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGJ5dGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXkgaW4gYmlnIGVuZGlhblxuICAgKi9cbiAgdG9CeXRlcygpIHtcbiAgICBjb25zdCBlID0gdGhpcy50b0J1ZmZlcigpO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShlLmJ1ZmZlciwgZS5ieXRlT2Zmc2V0LCBlLmJ5dGVMZW5ndGgpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIEJ1ZmZlciByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleSBpbiBiaWcgZW5kaWFuXG4gICAqL1xuICB0b0J1ZmZlcigpIHtcbiAgICBjb25zdCBlID0gdGhpcy5fYm4udG9BcnJheUxpa2UoSGUuQnVmZmVyKTtcbiAgICBpZiAoZS5sZW5ndGggPT09IGtzKVxuICAgICAgcmV0dXJuIGU7XG4gICAgY29uc3QgdCA9IEhlLkJ1ZmZlci5hbGxvYygzMik7XG4gICAgcmV0dXJuIGUuY29weSh0LCAzMiAtIGUubGVuZ3RoKSwgdDtcbiAgfVxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuIGBQdWJsaWNLZXkoJHt0aGlzLnRvU3RyaW5nKCl9KWA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgYmFzZS01OCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleVxuICAgKi9cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9CYXNlNTgoKTtcbiAgfVxuICAvKipcbiAgICogRGVyaXZlIGEgcHVibGljIGtleSBmcm9tIGFub3RoZXIga2V5LCBhIHNlZWQsIGFuZCBhIHByb2dyYW0gSUQuXG4gICAqIFRoZSBwcm9ncmFtIElEIHdpbGwgYWxzbyBzZXJ2ZSBhcyB0aGUgb3duZXIgb2YgdGhlIHB1YmxpYyBrZXksIGdpdmluZ1xuICAgKiBpdCBwZXJtaXNzaW9uIHRvIHdyaXRlIGRhdGEgdG8gdGhlIGFjY291bnQuXG4gICAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWF3YWl0ICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVXaXRoU2VlZChlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IEhlLkJ1ZmZlci5jb25jYXQoW2UudG9CdWZmZXIoKSwgSGUuQnVmZmVyLmZyb20odCksIHIudG9CdWZmZXIoKV0pLCBpID0gSWQobik7XG4gICAgcmV0dXJuIG5ldyBPZShpKTtcbiAgfVxuICAvKipcbiAgICogRGVyaXZlIGEgcHJvZ3JhbSBhZGRyZXNzIGZyb20gc2VlZHMgYW5kIGEgcHJvZ3JhbSBJRC5cbiAgICovXG4gIC8qIGVzbGludC1kaXNhYmxlIHJlcXVpcmUtYXdhaXQgKi9cbiAgc3RhdGljIGNyZWF0ZVByb2dyYW1BZGRyZXNzU3luYyhlLCB0KSB7XG4gICAgbGV0IHIgPSBIZS5CdWZmZXIuYWxsb2MoMCk7XG4gICAgZS5mb3JFYWNoKGZ1bmN0aW9uKGkpIHtcbiAgICAgIGlmIChpLmxlbmd0aCA+IGNFKVxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTWF4IHNlZWQgbGVuZ3RoIGV4Y2VlZGVkXCIpO1xuICAgICAgciA9IEhlLkJ1ZmZlci5jb25jYXQoW3IsIHJ1KGkpXSk7XG4gICAgfSksIHIgPSBIZS5CdWZmZXIuY29uY2F0KFtyLCB0LnRvQnVmZmVyKCksIEhlLkJ1ZmZlci5mcm9tKFwiUHJvZ3JhbURlcml2ZWRBZGRyZXNzXCIpXSk7XG4gICAgY29uc3QgbiA9IElkKHIpO1xuICAgIGlmIChGZChuKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgc2VlZHMsIGFkZHJlc3MgbXVzdCBmYWxsIG9mZiB0aGUgY3VydmVcIik7XG4gICAgcmV0dXJuIG5ldyBPZShuKTtcbiAgfVxuICAvKipcbiAgICogQXN5bmMgdmVyc2lvbiBvZiBjcmVhdGVQcm9ncmFtQWRkcmVzc1N5bmNcbiAgICogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgY3JlYXRlUHJvZ3JhbUFkZHJlc3NTeW5jfSBpbnN0ZWFkXG4gICAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZSByZXF1aXJlLWF3YWl0ICovXG4gIHN0YXRpYyBhc3luYyBjcmVhdGVQcm9ncmFtQWRkcmVzcyhlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlUHJvZ3JhbUFkZHJlc3NTeW5jKGUsIHQpO1xuICB9XG4gIC8qKlxuICAgKiBGaW5kIGEgdmFsaWQgcHJvZ3JhbSBhZGRyZXNzXG4gICAqXG4gICAqIFZhbGlkIHByb2dyYW0gYWRkcmVzc2VzIG11c3QgZmFsbCBvZmYgdGhlIGVkMjU1MTkgY3VydmUuICBUaGlzIGZ1bmN0aW9uXG4gICAqIGl0ZXJhdGVzIGEgbm9uY2UgdW50aWwgaXQgZmluZHMgb25lIHRoYXQgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBzZWVkc1xuICAgKiByZXN1bHRzIGluIGEgdmFsaWQgcHJvZ3JhbSBhZGRyZXNzLlxuICAgKi9cbiAgc3RhdGljIGZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoZSwgdCkge1xuICAgIGxldCByID0gMjU1LCBuO1xuICAgIGZvciAoOyByICE9IDA7ICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaSA9IGUuY29uY2F0KEhlLkJ1ZmZlci5mcm9tKFtyXSkpO1xuICAgICAgICBuID0gdGhpcy5jcmVhdGVQcm9ncmFtQWRkcmVzc1N5bmMoaSwgdCk7XG4gICAgICB9IGNhdGNoIChpKSB7XG4gICAgICAgIGlmIChpIGluc3RhbmNlb2YgVHlwZUVycm9yKVxuICAgICAgICAgIHRocm93IGk7XG4gICAgICAgIHItLTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gW24sIHJdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gZmluZCBhIHZpYWJsZSBwcm9ncmFtIGFkZHJlc3Mgbm9uY2VcIik7XG4gIH1cbiAgLyoqXG4gICAqIEFzeW5jIHZlcnNpb24gb2YgZmluZFByb2dyYW1BZGRyZXNzU3luY1xuICAgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBmaW5kUHJvZ3JhbUFkZHJlc3NTeW5jfSBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZFByb2dyYW1BZGRyZXNzKGUsIHQpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKGUsIHQpO1xuICB9XG4gIC8qKlxuICAgKiBDaGVjayB0aGF0IGEgcHVia2V5IGlzIG9uIHRoZSBlZDI1NTE5IGN1cnZlLlxuICAgKi9cbiAgc3RhdGljIGlzT25DdXJ2ZShlKSB7XG4gICAgY29uc3QgdCA9IG5ldyBPZShlKTtcbiAgICByZXR1cm4gRmQodC50b0J5dGVzKCkpO1xuICB9XG59XG5CMCA9IE9lO1xuT2UuZGVmYXVsdCA9IG5ldyBCMChcIjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xudW8uc2V0KE9lLCB7XG4gIGtpbmQ6IFwic3RydWN0XCIsXG4gIGZpZWxkczogW1tcIl9iblwiLCBcInUyNTZcIl1dXG59KTtcbm5ldyBPZShcIkJQRkxvYWRlcjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5jb25zdCB3biA9IDEyMzIsIHN1ID0gMTI3LCBHbyA9IDY0O1xuY2xhc3MgVm8ge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgdGhpcy5zdGF0aWNBY2NvdW50S2V5cyA9IHZvaWQgMCwgdGhpcy5hY2NvdW50S2V5c0Zyb21Mb29rdXBzID0gdm9pZCAwLCB0aGlzLnN0YXRpY0FjY291bnRLZXlzID0gZSwgdGhpcy5hY2NvdW50S2V5c0Zyb21Mb29rdXBzID0gdDtcbiAgfVxuICBrZXlTZWdtZW50cygpIHtcbiAgICBjb25zdCBlID0gW3RoaXMuc3RhdGljQWNjb3VudEtleXNdO1xuICAgIHJldHVybiB0aGlzLmFjY291bnRLZXlzRnJvbUxvb2t1cHMgJiYgKGUucHVzaCh0aGlzLmFjY291bnRLZXlzRnJvbUxvb2t1cHMud3JpdGFibGUpLCBlLnB1c2godGhpcy5hY2NvdW50S2V5c0Zyb21Mb29rdXBzLnJlYWRvbmx5KSksIGU7XG4gIH1cbiAgZ2V0KGUpIHtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5rZXlTZWdtZW50cygpKSB7XG4gICAgICBpZiAoZSA8IHQubGVuZ3RoKVxuICAgICAgICByZXR1cm4gdFtlXTtcbiAgICAgIGUgLT0gdC5sZW5ndGg7XG4gICAgfVxuICB9XG4gIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMua2V5U2VnbWVudHMoKS5mbGF0KCkubGVuZ3RoO1xuICB9XG4gIGNvbXBpbGVJbnN0cnVjdGlvbnMoZSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IDI1NilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFjY291bnQgaW5kZXggb3ZlcmZsb3cgZW5jb3VudGVyZWQgZHVyaW5nIGNvbXBpbGF0aW9uXCIpO1xuICAgIGNvbnN0IHIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIHRoaXMua2V5U2VnbWVudHMoKS5mbGF0KCkuZm9yRWFjaCgoaSwgbykgPT4ge1xuICAgICAgci5zZXQoaS50b0Jhc2U1OCgpLCBvKTtcbiAgICB9KTtcbiAgICBjb25zdCBuID0gKGkpID0+IHtcbiAgICAgIGNvbnN0IG8gPSByLmdldChpLnRvQmFzZTU4KCkpO1xuICAgICAgaWYgKG8gPT09IHZvaWQgMCkgdGhyb3cgbmV3IEVycm9yKFwiRW5jb3VudGVyZWQgYW4gdW5rbm93biBpbnN0cnVjdGlvbiBhY2NvdW50IGtleSBkdXJpbmcgY29tcGlsYXRpb25cIik7XG4gICAgICByZXR1cm4gbztcbiAgICB9O1xuICAgIHJldHVybiBlLm1hcCgoaSkgPT4gKHtcbiAgICAgIHByb2dyYW1JZEluZGV4OiBuKGkucHJvZ3JhbUlkKSxcbiAgICAgIGFjY291bnRLZXlJbmRleGVzOiBpLmtleXMubWFwKChvKSA9PiBuKG8ucHVia2V5KSksXG4gICAgICBkYXRhOiBpLmRhdGFcbiAgICB9KSk7XG4gIH1cbn1cbmNvbnN0IFdlID0gKHMgPSBcInB1YmxpY0tleVwiKSA9PiB6LmJsb2IoMzIsIHMpLCBkRSA9IChzID0gXCJzaWduYXR1cmVcIikgPT4gei5ibG9iKDY0LCBzKSwgeG4gPSAocyA9IFwic3RyaW5nXCIpID0+IHtcbiAgY29uc3QgZSA9IHouc3RydWN0KFt6LnUzMihcImxlbmd0aFwiKSwgei51MzIoXCJsZW5ndGhQYWRkaW5nXCIpLCB6LmJsb2Ioei5vZmZzZXQoei51MzIoKSwgLTgpLCBcImNoYXJzXCIpXSwgcyksIHQgPSBlLmRlY29kZS5iaW5kKGUpLCByID0gZS5lbmNvZGUuYmluZChlKSwgbiA9IGU7XG4gIHJldHVybiBuLmRlY29kZSA9IChpLCBvKSA9PiB0KGksIG8pLmNoYXJzLnRvU3RyaW5nKCksIG4uZW5jb2RlID0gKGksIG8sIGEpID0+IHtcbiAgICBjb25zdCBsID0ge1xuICAgICAgY2hhcnM6IEhlLkJ1ZmZlci5mcm9tKGksIFwidXRmOFwiKVxuICAgIH07XG4gICAgcmV0dXJuIHIobCwgbywgYSk7XG4gIH0sIG4uYWxsb2MgPSAoaSkgPT4gei51MzIoKS5zcGFuICsgei51MzIoKS5zcGFuICsgSGUuQnVmZmVyLmZyb20oaSwgXCJ1dGY4XCIpLmxlbmd0aCwgbjtcbn0sIGhFID0gKHMgPSBcImF1dGhvcml6ZWRcIikgPT4gei5zdHJ1Y3QoW1dlKFwic3Rha2VyXCIpLCBXZShcIndpdGhkcmF3ZXJcIildLCBzKSwgZkUgPSAocyA9IFwibG9ja3VwXCIpID0+IHouc3RydWN0KFt6Lm5zNjQoXCJ1bml4VGltZXN0YW1wXCIpLCB6Lm5zNjQoXCJlcG9jaFwiKSwgV2UoXCJjdXN0b2RpYW5cIildLCBzKSwgZ0UgPSAocyA9IFwidm90ZUluaXRcIikgPT4gei5zdHJ1Y3QoW1dlKFwibm9kZVB1YmtleVwiKSwgV2UoXCJhdXRob3JpemVkVm90ZXJcIiksIFdlKFwiYXV0aG9yaXplZFdpdGhkcmF3ZXJcIiksIHoudTgoXCJjb21taXNzaW9uXCIpXSwgcyksIHBFID0gKHMgPSBcInZvdGVBdXRob3JpemVXaXRoU2VlZEFyZ3NcIikgPT4gei5zdHJ1Y3QoW3oudTMyKFwidm90ZUF1dGhvcml6YXRpb25UeXBlXCIpLCBXZShcImN1cnJlbnRBdXRob3JpdHlEZXJpdmVkS2V5T3duZXJQdWJrZXlcIiksIHhuKFwiY3VycmVudEF1dGhvcml0eURlcml2ZWRLZXlTZWVkXCIpLCBXZShcIm5ld0F1dGhvcml6ZWRcIildLCBzKTtcbmZ1bmN0aW9uIEVyKHMpIHtcbiAgbGV0IGUgPSAwLCB0ID0gMDtcbiAgZm9yICg7IDsgKSB7XG4gICAgbGV0IHIgPSBzLnNoaWZ0KCk7XG4gICAgaWYgKGUgfD0gKHIgJiAxMjcpIDw8IHQgKiA3LCB0ICs9IDEsIChyICYgMTI4KSA9PT0gMClcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBlO1xufVxuZnVuY3Rpb24geHIocywgZSkge1xuICBsZXQgdCA9IGU7XG4gIGZvciAoOyA7ICkge1xuICAgIGxldCByID0gdCAmIDEyNztcbiAgICBpZiAodCA+Pj0gNywgdCA9PSAwKSB7XG4gICAgICBzLnB1c2gocik7XG4gICAgICBicmVhaztcbiAgICB9IGVsc2VcbiAgICAgIHIgfD0gMTI4LCBzLnB1c2gocik7XG4gIH1cbn1cbmZ1bmN0aW9uIEt0KHMsIGUpIHtcbiAgaWYgKCFzKVxuICAgIHRocm93IG5ldyBFcnJvcihlIHx8IFwiQXNzZXJ0aW9uIGZhaWxlZFwiKTtcbn1cbmNsYXNzIGZhIHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHRoaXMucGF5ZXIgPSB2b2lkIDAsIHRoaXMua2V5TWV0YU1hcCA9IHZvaWQgMCwgdGhpcy5wYXllciA9IGUsIHRoaXMua2V5TWV0YU1hcCA9IHQ7XG4gIH1cbiAgc3RhdGljIGNvbXBpbGUoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBuID0gKG8pID0+IHtcbiAgICAgIGNvbnN0IGEgPSBvLnRvQmFzZTU4KCk7XG4gICAgICBsZXQgbCA9IHIuZ2V0KGEpO1xuICAgICAgcmV0dXJuIGwgPT09IHZvaWQgMCAmJiAobCA9IHtcbiAgICAgICAgaXNTaWduZXI6ICExLFxuICAgICAgICBpc1dyaXRhYmxlOiAhMSxcbiAgICAgICAgaXNJbnZva2VkOiAhMVxuICAgICAgfSwgci5zZXQoYSwgbCkpLCBsO1xuICAgIH0sIGkgPSBuKHQpO1xuICAgIGkuaXNTaWduZXIgPSAhMCwgaS5pc1dyaXRhYmxlID0gITA7XG4gICAgZm9yIChjb25zdCBvIG9mIGUpIHtcbiAgICAgIG4oby5wcm9ncmFtSWQpLmlzSW52b2tlZCA9ICEwO1xuICAgICAgZm9yIChjb25zdCBhIG9mIG8ua2V5cykge1xuICAgICAgICBjb25zdCBsID0gbihhLnB1YmtleSk7XG4gICAgICAgIGwuaXNTaWduZXIgfHwgKGwuaXNTaWduZXIgPSBhLmlzU2lnbmVyKSwgbC5pc1dyaXRhYmxlIHx8IChsLmlzV3JpdGFibGUgPSBhLmlzV3JpdGFibGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IGZhKHQsIHIpO1xuICB9XG4gIGdldE1lc3NhZ2VDb21wb25lbnRzKCkge1xuICAgIGNvbnN0IGUgPSBbLi4udGhpcy5rZXlNZXRhTWFwLmVudHJpZXMoKV07XG4gICAgS3QoZS5sZW5ndGggPD0gMjU2LCBcIk1heCBzdGF0aWMgYWNjb3VudCBrZXlzIGxlbmd0aCBleGNlZWRlZFwiKTtcbiAgICBjb25zdCB0ID0gZS5maWx0ZXIoKFssIGxdKSA9PiBsLmlzU2lnbmVyICYmIGwuaXNXcml0YWJsZSksIHIgPSBlLmZpbHRlcigoWywgbF0pID0+IGwuaXNTaWduZXIgJiYgIWwuaXNXcml0YWJsZSksIG4gPSBlLmZpbHRlcigoWywgbF0pID0+ICFsLmlzU2lnbmVyICYmIGwuaXNXcml0YWJsZSksIGkgPSBlLmZpbHRlcigoWywgbF0pID0+ICFsLmlzU2lnbmVyICYmICFsLmlzV3JpdGFibGUpLCBvID0ge1xuICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiB0Lmxlbmd0aCArIHIubGVuZ3RoLFxuICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogci5sZW5ndGgsXG4gICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IGkubGVuZ3RoXG4gICAgfTtcbiAgICB7XG4gICAgICBLdCh0Lmxlbmd0aCA+IDAsIFwiRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIHdyaXRhYmxlIHNpZ25lciBrZXlcIik7XG4gICAgICBjb25zdCBbbF0gPSB0WzBdO1xuICAgICAgS3QobCA9PT0gdGhpcy5wYXllci50b0Jhc2U1OCgpLCBcIkV4cGVjdGVkIGZpcnN0IHdyaXRhYmxlIHNpZ25lciBrZXkgdG8gYmUgdGhlIGZlZSBwYXllclwiKTtcbiAgICB9XG4gICAgY29uc3QgYSA9IFsuLi50Lm1hcCgoW2xdKSA9PiBuZXcgT2UobCkpLCAuLi5yLm1hcCgoW2xdKSA9PiBuZXcgT2UobCkpLCAuLi5uLm1hcCgoW2xdKSA9PiBuZXcgT2UobCkpLCAuLi5pLm1hcCgoW2xdKSA9PiBuZXcgT2UobCkpXTtcbiAgICByZXR1cm4gW28sIGFdO1xuICB9XG4gIGV4dHJhY3RUYWJsZUxvb2t1cChlKSB7XG4gICAgY29uc3QgW3QsIHJdID0gdGhpcy5kcmFpbktleXNGb3VuZEluTG9va3VwVGFibGUoZS5zdGF0ZS5hZGRyZXNzZXMsIChvKSA9PiAhby5pc1NpZ25lciAmJiAhby5pc0ludm9rZWQgJiYgby5pc1dyaXRhYmxlKSwgW24sIGldID0gdGhpcy5kcmFpbktleXNGb3VuZEluTG9va3VwVGFibGUoZS5zdGF0ZS5hZGRyZXNzZXMsIChvKSA9PiAhby5pc1NpZ25lciAmJiAhby5pc0ludm9rZWQgJiYgIW8uaXNXcml0YWJsZSk7XG4gICAgaWYgKCEodC5sZW5ndGggPT09IDAgJiYgbi5sZW5ndGggPT09IDApKVxuICAgICAgcmV0dXJuIFt7XG4gICAgICAgIGFjY291bnRLZXk6IGUua2V5LFxuICAgICAgICB3cml0YWJsZUluZGV4ZXM6IHQsXG4gICAgICAgIHJlYWRvbmx5SW5kZXhlczogblxuICAgICAgfSwge1xuICAgICAgICB3cml0YWJsZTogcixcbiAgICAgICAgcmVhZG9ubHk6IGlcbiAgICAgIH1dO1xuICB9XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZHJhaW5LZXlzRm91bmRJbkxvb2t1cFRhYmxlKGUsIHQpIHtcbiAgICBjb25zdCByID0gbmV3IEFycmF5KCksIG4gPSBuZXcgQXJyYXkoKTtcbiAgICBmb3IgKGNvbnN0IFtpLCBvXSBvZiB0aGlzLmtleU1ldGFNYXAuZW50cmllcygpKVxuICAgICAgaWYgKHQobykpIHtcbiAgICAgICAgY29uc3QgYSA9IG5ldyBPZShpKSwgbCA9IGUuZmluZEluZGV4KChjKSA9PiBjLmVxdWFscyhhKSk7XG4gICAgICAgIGwgPj0gMCAmJiAoS3QobCA8IDI1NiwgXCJNYXggbG9va3VwIHRhYmxlIGluZGV4IGV4Y2VlZGVkXCIpLCByLnB1c2gobCksIG4ucHVzaChhKSwgdGhpcy5rZXlNZXRhTWFwLmRlbGV0ZShpKSk7XG4gICAgICB9XG4gICAgcmV0dXJuIFtyLCBuXTtcbiAgfVxufVxuY29uc3QgRjAgPSBcIlJlYWNoZWQgZW5kIG9mIGJ1ZmZlciB1bmV4cGVjdGVkbHlcIjtcbmZ1bmN0aW9uIGRzKHMpIHtcbiAgaWYgKHMubGVuZ3RoID09PSAwKVxuICAgIHRocm93IG5ldyBFcnJvcihGMCk7XG4gIHJldHVybiBzLnNoaWZ0KCk7XG59XG5mdW5jdGlvbiBTcihzLCAuLi5lKSB7XG4gIGNvbnN0IFt0XSA9IGU7XG4gIGlmIChlLmxlbmd0aCA9PT0gMiA/IHQgKyAoZVsxXSA/PyAwKSA+IHMubGVuZ3RoIDogdCA+PSBzLmxlbmd0aClcbiAgICB0aHJvdyBuZXcgRXJyb3IoRjApO1xuICByZXR1cm4gcy5zcGxpY2UoLi4uZSk7XG59XG5jbGFzcyBNbiB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmhlYWRlciA9IHZvaWQgMCwgdGhpcy5hY2NvdW50S2V5cyA9IHZvaWQgMCwgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSB2b2lkIDAsIHRoaXMuaW5zdHJ1Y3Rpb25zID0gdm9pZCAwLCB0aGlzLmluZGV4VG9Qcm9ncmFtSWRzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgdGhpcy5oZWFkZXIgPSBlLmhlYWRlciwgdGhpcy5hY2NvdW50S2V5cyA9IGUuYWNjb3VudEtleXMubWFwKCh0KSA9PiBuZXcgT2UodCkpLCB0aGlzLnJlY2VudEJsb2NraGFzaCA9IGUucmVjZW50QmxvY2toYXNoLCB0aGlzLmluc3RydWN0aW9ucyA9IGUuaW5zdHJ1Y3Rpb25zLCB0aGlzLmluc3RydWN0aW9ucy5mb3JFYWNoKCh0KSA9PiB0aGlzLmluZGV4VG9Qcm9ncmFtSWRzLnNldCh0LnByb2dyYW1JZEluZGV4LCB0aGlzLmFjY291bnRLZXlzW3QucHJvZ3JhbUlkSW5kZXhdKSk7XG4gIH1cbiAgZ2V0IHZlcnNpb24oKSB7XG4gICAgcmV0dXJuIFwibGVnYWN5XCI7XG4gIH1cbiAgZ2V0IHN0YXRpY0FjY291bnRLZXlzKCkge1xuICAgIHJldHVybiB0aGlzLmFjY291bnRLZXlzO1xuICB9XG4gIGdldCBjb21waWxlZEluc3RydWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbnMubWFwKChlKSA9PiAoe1xuICAgICAgcHJvZ3JhbUlkSW5kZXg6IGUucHJvZ3JhbUlkSW5kZXgsXG4gICAgICBhY2NvdW50S2V5SW5kZXhlczogZS5hY2NvdW50cyxcbiAgICAgIGRhdGE6IGFyLmRlY29kZShlLmRhdGEpXG4gICAgfSkpO1xuICB9XG4gIGdldCBhZGRyZXNzVGFibGVMb29rdXBzKCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBnZXRBY2NvdW50S2V5cygpIHtcbiAgICByZXR1cm4gbmV3IFZvKHRoaXMuc3RhdGljQWNjb3VudEtleXMpO1xuICB9XG4gIHN0YXRpYyBjb21waWxlKGUpIHtcbiAgICBjb25zdCB0ID0gZmEuY29tcGlsZShlLmluc3RydWN0aW9ucywgZS5wYXllcktleSksIFtyLCBuXSA9IHQuZ2V0TWVzc2FnZUNvbXBvbmVudHMoKSwgbyA9IG5ldyBWbyhuKS5jb21waWxlSW5zdHJ1Y3Rpb25zKGUuaW5zdHJ1Y3Rpb25zKS5tYXAoKGEpID0+ICh7XG4gICAgICBwcm9ncmFtSWRJbmRleDogYS5wcm9ncmFtSWRJbmRleCxcbiAgICAgIGFjY291bnRzOiBhLmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgZGF0YTogYXIuZW5jb2RlKGEuZGF0YSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIG5ldyBNbih7XG4gICAgICBoZWFkZXI6IHIsXG4gICAgICBhY2NvdW50S2V5czogbixcbiAgICAgIHJlY2VudEJsb2NraGFzaDogZS5yZWNlbnRCbG9ja2hhc2gsXG4gICAgICBpbnN0cnVjdGlvbnM6IG9cbiAgICB9KTtcbiAgfVxuICBpc0FjY291bnRTaWduZXIoZSkge1xuICAgIHJldHVybiBlIDwgdGhpcy5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzO1xuICB9XG4gIGlzQWNjb3VudFdyaXRhYmxlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzO1xuICAgIGlmIChlID49IHRoaXMuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcykge1xuICAgICAgY29uc3QgciA9IGUgLSB0LCBpID0gdGhpcy5hY2NvdW50S2V5cy5sZW5ndGggLSB0IC0gdGhpcy5oZWFkZXIubnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzO1xuICAgICAgcmV0dXJuIHIgPCBpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByID0gdCAtIHRoaXMuaGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM7XG4gICAgICByZXR1cm4gZSA8IHI7XG4gICAgfVxuICB9XG4gIGlzUHJvZ3JhbUlkKGUpIHtcbiAgICByZXR1cm4gdGhpcy5pbmRleFRvUHJvZ3JhbUlkcy5oYXMoZSk7XG4gIH1cbiAgcHJvZ3JhbUlkcygpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuaW5kZXhUb1Byb2dyYW1JZHMudmFsdWVzKCldO1xuICB9XG4gIG5vblByb2dyYW1JZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWNjb3VudEtleXMuZmlsdGVyKChlLCB0KSA9PiAhdGhpcy5pc1Byb2dyYW1JZCh0KSk7XG4gIH1cbiAgc2VyaWFsaXplKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmFjY291bnRLZXlzLmxlbmd0aDtcbiAgICBsZXQgdCA9IFtdO1xuICAgIHhyKHQsIGUpO1xuICAgIGNvbnN0IHIgPSB0aGlzLmluc3RydWN0aW9ucy5tYXAoKGQpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWNjb3VudHM6IGgsXG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBmXG4gICAgICB9ID0gZCwgcCA9IEFycmF5LmZyb20oYXIuZGVjb2RlKGQuZGF0YSkpO1xuICAgICAgbGV0IHkgPSBbXTtcbiAgICAgIHhyKHksIGgubGVuZ3RoKTtcbiAgICAgIGxldCBFID0gW107XG4gICAgICByZXR1cm4geHIoRSwgcC5sZW5ndGgpLCB7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBmLFxuICAgICAgICBrZXlJbmRpY2VzQ291bnQ6IEhlLkJ1ZmZlci5mcm9tKHkpLFxuICAgICAgICBrZXlJbmRpY2VzOiBoLFxuICAgICAgICBkYXRhTGVuZ3RoOiBIZS5CdWZmZXIuZnJvbShFKSxcbiAgICAgICAgZGF0YTogcFxuICAgICAgfTtcbiAgICB9KTtcbiAgICBsZXQgbiA9IFtdO1xuICAgIHhyKG4sIHIubGVuZ3RoKTtcbiAgICBsZXQgaSA9IEhlLkJ1ZmZlci5hbGxvYyh3bik7XG4gICAgSGUuQnVmZmVyLmZyb20obikuY29weShpKTtcbiAgICBsZXQgbyA9IG4ubGVuZ3RoO1xuICAgIHIuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgY29uc3QgZiA9IHouc3RydWN0KFt6LnU4KFwicHJvZ3JhbUlkSW5kZXhcIiksIHouYmxvYihkLmtleUluZGljZXNDb3VudC5sZW5ndGgsIFwia2V5SW5kaWNlc0NvdW50XCIpLCB6LnNlcSh6LnU4KFwia2V5SW5kZXhcIiksIGQua2V5SW5kaWNlcy5sZW5ndGgsIFwia2V5SW5kaWNlc1wiKSwgei5ibG9iKGQuZGF0YUxlbmd0aC5sZW5ndGgsIFwiZGF0YUxlbmd0aFwiKSwgei5zZXEoei51OChcInVzZXJkYXR1bVwiKSwgZC5kYXRhLmxlbmd0aCwgXCJkYXRhXCIpXSkuZW5jb2RlKGQsIGksIG8pO1xuICAgICAgbyArPSBmO1xuICAgIH0pLCBpID0gaS5zbGljZSgwLCBvKTtcbiAgICBjb25zdCBhID0gei5zdHJ1Y3QoW3ouYmxvYigxLCBcIm51bVJlcXVpcmVkU2lnbmF0dXJlc1wiKSwgei5ibG9iKDEsIFwibnVtUmVhZG9ubHlTaWduZWRBY2NvdW50c1wiKSwgei5ibG9iKDEsIFwibnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzXCIpLCB6LmJsb2IodC5sZW5ndGgsIFwia2V5Q291bnRcIiksIHouc2VxKFdlKFwia2V5XCIpLCBlLCBcImtleXNcIiksIFdlKFwicmVjZW50QmxvY2toYXNoXCIpXSksIGwgPSB7XG4gICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IEhlLkJ1ZmZlci5mcm9tKFt0aGlzLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXNdKSxcbiAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM6IEhlLkJ1ZmZlci5mcm9tKFt0aGlzLmhlYWRlci5udW1SZWFkb25seVNpZ25lZEFjY291bnRzXSksXG4gICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IEhlLkJ1ZmZlci5mcm9tKFt0aGlzLmhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHNdKSxcbiAgICAgIGtleUNvdW50OiBIZS5CdWZmZXIuZnJvbSh0KSxcbiAgICAgIGtleXM6IHRoaXMuYWNjb3VudEtleXMubWFwKChkKSA9PiBydShkLnRvQnl0ZXMoKSkpLFxuICAgICAgcmVjZW50QmxvY2toYXNoOiBhci5kZWNvZGUodGhpcy5yZWNlbnRCbG9ja2hhc2gpXG4gICAgfTtcbiAgICBsZXQgYyA9IEhlLkJ1ZmZlci5hbGxvYygyMDQ4KTtcbiAgICBjb25zdCB1ID0gYS5lbmNvZGUobCwgYyk7XG4gICAgcmV0dXJuIGkuY29weShjLCB1KSwgYy5zbGljZSgwLCB1ICsgaS5sZW5ndGgpO1xuICB9XG4gIC8qKlxuICAgKiBEZWNvZGUgYSBjb21waWxlZCBtZXNzYWdlIGludG8gYSBNZXNzYWdlIG9iamVjdC5cbiAgICovXG4gIHN0YXRpYyBmcm9tKGUpIHtcbiAgICBsZXQgdCA9IFsuLi5lXTtcbiAgICBjb25zdCByID0gZHModCk7XG4gICAgaWYgKHIgIT09IChyICYgc3UpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVmVyc2lvbmVkIG1lc3NhZ2VzIG11c3QgYmUgZGVzZXJpYWxpemVkIHdpdGggVmVyc2lvbmVkTWVzc2FnZS5kZXNlcmlhbGl6ZSgpXCIpO1xuICAgIGNvbnN0IG4gPSBkcyh0KSwgaSA9IGRzKHQpLCBvID0gRXIodCk7XG4gICAgbGV0IGEgPSBbXTtcbiAgICBmb3IgKGxldCBoID0gMDsgaCA8IG87IGgrKykge1xuICAgICAgY29uc3QgZiA9IFNyKHQsIDAsIGtzKTtcbiAgICAgIGEucHVzaChuZXcgT2UoSGUuQnVmZmVyLmZyb20oZikpKTtcbiAgICB9XG4gICAgY29uc3QgbCA9IFNyKHQsIDAsIGtzKSwgYyA9IEVyKHQpO1xuICAgIGxldCB1ID0gW107XG4gICAgZm9yIChsZXQgaCA9IDA7IGggPCBjOyBoKyspIHtcbiAgICAgIGNvbnN0IGYgPSBkcyh0KSwgcCA9IEVyKHQpLCB5ID0gU3IodCwgMCwgcCksIEUgPSBFcih0KSwgYiA9IFNyKHQsIDAsIEUpLCBSID0gYXIuZW5jb2RlKEhlLkJ1ZmZlci5mcm9tKGIpKTtcbiAgICAgIHUucHVzaCh7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBmLFxuICAgICAgICBhY2NvdW50czogeSxcbiAgICAgICAgZGF0YTogUlxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGQgPSB7XG4gICAgICBoZWFkZXI6IHtcbiAgICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiByLFxuICAgICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiBuLFxuICAgICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IGlcbiAgICAgIH0sXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IGFyLmVuY29kZShIZS5CdWZmZXIuZnJvbShsKSksXG4gICAgICBhY2NvdW50S2V5czogYSxcbiAgICAgIGluc3RydWN0aW9uczogdVxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBNbihkKTtcbiAgfVxufVxuY2xhc3Mgam8ge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5oZWFkZXIgPSB2b2lkIDAsIHRoaXMuc3RhdGljQWNjb3VudEtleXMgPSB2b2lkIDAsIHRoaXMucmVjZW50QmxvY2toYXNoID0gdm9pZCAwLCB0aGlzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zID0gdm9pZCAwLCB0aGlzLmFkZHJlc3NUYWJsZUxvb2t1cHMgPSB2b2lkIDAsIHRoaXMuaGVhZGVyID0gZS5oZWFkZXIsIHRoaXMuc3RhdGljQWNjb3VudEtleXMgPSBlLnN0YXRpY0FjY291bnRLZXlzLCB0aGlzLnJlY2VudEJsb2NraGFzaCA9IGUucmVjZW50QmxvY2toYXNoLCB0aGlzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zID0gZS5jb21waWxlZEluc3RydWN0aW9ucywgdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzID0gZS5hZGRyZXNzVGFibGVMb29rdXBzO1xuICB9XG4gIGdldCB2ZXJzaW9uKCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGdldCBudW1BY2NvdW50S2V5c0Zyb21Mb29rdXBzKCkge1xuICAgIGxldCBlID0gMDtcbiAgICBmb3IgKGNvbnN0IHQgb2YgdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzKVxuICAgICAgZSArPSB0LnJlYWRvbmx5SW5kZXhlcy5sZW5ndGggKyB0LndyaXRhYmxlSW5kZXhlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgZ2V0QWNjb3VudEtleXMoZSkge1xuICAgIGxldCB0O1xuICAgIGlmIChlICYmIFwiYWNjb3VudEtleXNGcm9tTG9va3Vwc1wiIGluIGUgJiYgZS5hY2NvdW50S2V5c0Zyb21Mb29rdXBzKSB7XG4gICAgICBpZiAodGhpcy5udW1BY2NvdW50S2V5c0Zyb21Mb29rdXBzICE9IGUuYWNjb3VudEtleXNGcm9tTG9va3Vwcy53cml0YWJsZS5sZW5ndGggKyBlLmFjY291bnRLZXlzRnJvbUxvb2t1cHMucmVhZG9ubHkubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJGYWlsZWQgdG8gZ2V0IGFjY291bnQga2V5cyBiZWNhdXNlIG9mIGEgbWlzbWF0Y2ggaW4gdGhlIG51bWJlciBvZiBhY2NvdW50IGtleXMgZnJvbSBsb29rdXBzXCIpO1xuICAgICAgdCA9IGUuYWNjb3VudEtleXNGcm9tTG9va3VwcztcbiAgICB9IGVsc2UgaWYgKGUgJiYgXCJhZGRyZXNzTG9va3VwVGFibGVBY2NvdW50c1wiIGluIGUgJiYgZS5hZGRyZXNzTG9va3VwVGFibGVBY2NvdW50cylcbiAgICAgIHQgPSB0aGlzLnJlc29sdmVBZGRyZXNzVGFibGVMb29rdXBzKGUuYWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudHMpO1xuICAgIGVsc2UgaWYgKHRoaXMuYWRkcmVzc1RhYmxlTG9va3Vwcy5sZW5ndGggPiAwKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIGdldCBhY2NvdW50IGtleXMgYmVjYXVzZSBhZGRyZXNzIHRhYmxlIGxvb2t1cHMgd2VyZSBub3QgcmVzb2x2ZWRcIik7XG4gICAgcmV0dXJuIG5ldyBWbyh0aGlzLnN0YXRpY0FjY291bnRLZXlzLCB0KTtcbiAgfVxuICBpc0FjY291bnRTaWduZXIoZSkge1xuICAgIHJldHVybiBlIDwgdGhpcy5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzO1xuICB9XG4gIGlzQWNjb3VudFdyaXRhYmxlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLCByID0gdGhpcy5zdGF0aWNBY2NvdW50S2V5cy5sZW5ndGg7XG4gICAgaWYgKGUgPj0gcikge1xuICAgICAgY29uc3QgbiA9IGUgLSByLCBpID0gdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzLnJlZHVjZSgobywgYSkgPT4gbyArIGEud3JpdGFibGVJbmRleGVzLmxlbmd0aCwgMCk7XG4gICAgICByZXR1cm4gbiA8IGk7XG4gICAgfSBlbHNlIGlmIChlID49IHRoaXMuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcykge1xuICAgICAgY29uc3QgbiA9IGUgLSB0LCBvID0gciAtIHQgLSB0aGlzLmhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM7XG4gICAgICByZXR1cm4gbiA8IG87XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG4gPSB0IC0gdGhpcy5oZWFkZXIubnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cztcbiAgICAgIHJldHVybiBlIDwgbjtcbiAgICB9XG4gIH1cbiAgcmVzb2x2ZUFkZHJlc3NUYWJsZUxvb2t1cHMoZSkge1xuICAgIGNvbnN0IHQgPSB7XG4gICAgICB3cml0YWJsZTogW10sXG4gICAgICByZWFkb25seTogW11cbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmFkZHJlc3NUYWJsZUxvb2t1cHMpIHtcbiAgICAgIGNvbnN0IG4gPSBlLmZpbmQoKGkpID0+IGkua2V5LmVxdWFscyhyLmFjY291bnRLZXkpKTtcbiAgICAgIGlmICghbilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCBhZGRyZXNzIGxvb2t1cCB0YWJsZSBhY2NvdW50IGZvciB0YWJsZSBrZXkgJHtyLmFjY291bnRLZXkudG9CYXNlNTgoKX1gKTtcbiAgICAgIGZvciAoY29uc3QgaSBvZiByLndyaXRhYmxlSW5kZXhlcylcbiAgICAgICAgaWYgKGkgPCBuLnN0YXRlLmFkZHJlc3Nlcy5sZW5ndGgpXG4gICAgICAgICAgdC53cml0YWJsZS5wdXNoKG4uc3RhdGUuYWRkcmVzc2VzW2ldKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgYWRkcmVzcyBmb3IgaW5kZXggJHtpfSBpbiBhZGRyZXNzIGxvb2t1cCB0YWJsZSAke3IuYWNjb3VudEtleS50b0Jhc2U1OCgpfWApO1xuICAgICAgZm9yIChjb25zdCBpIG9mIHIucmVhZG9ubHlJbmRleGVzKVxuICAgICAgICBpZiAoaSA8IG4uc3RhdGUuYWRkcmVzc2VzLmxlbmd0aClcbiAgICAgICAgICB0LnJlYWRvbmx5LnB1c2gobi5zdGF0ZS5hZGRyZXNzZXNbaV0pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCBhZGRyZXNzIGZvciBpbmRleCAke2l9IGluIGFkZHJlc3MgbG9va3VwIHRhYmxlICR7ci5hY2NvdW50S2V5LnRvQmFzZTU4KCl9YCk7XG4gICAgfVxuICAgIHJldHVybiB0O1xuICB9XG4gIHN0YXRpYyBjb21waWxlKGUpIHtcbiAgICBjb25zdCB0ID0gZmEuY29tcGlsZShlLmluc3RydWN0aW9ucywgZS5wYXllcktleSksIHIgPSBuZXcgQXJyYXkoKSwgbiA9IHtcbiAgICAgIHdyaXRhYmxlOiBuZXcgQXJyYXkoKSxcbiAgICAgIHJlYWRvbmx5OiBuZXcgQXJyYXkoKVxuICAgIH0sIGkgPSBlLmFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzIHx8IFtdO1xuICAgIGZvciAoY29uc3QgdSBvZiBpKSB7XG4gICAgICBjb25zdCBkID0gdC5leHRyYWN0VGFibGVMb29rdXAodSk7XG4gICAgICBpZiAoZCAhPT0gdm9pZCAwKSB7XG4gICAgICAgIGNvbnN0IFtoLCB7XG4gICAgICAgICAgd3JpdGFibGU6IGYsXG4gICAgICAgICAgcmVhZG9ubHk6IHBcbiAgICAgICAgfV0gPSBkO1xuICAgICAgICByLnB1c2goaCksIG4ud3JpdGFibGUucHVzaCguLi5mKSwgbi5yZWFkb25seS5wdXNoKC4uLnApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBbbywgYV0gPSB0LmdldE1lc3NhZ2VDb21wb25lbnRzKCksIGMgPSBuZXcgVm8oYSwgbikuY29tcGlsZUluc3RydWN0aW9ucyhlLmluc3RydWN0aW9ucyk7XG4gICAgcmV0dXJuIG5ldyBqbyh7XG4gICAgICBoZWFkZXI6IG8sXG4gICAgICBzdGF0aWNBY2NvdW50S2V5czogYSxcbiAgICAgIHJlY2VudEJsb2NraGFzaDogZS5yZWNlbnRCbG9ja2hhc2gsXG4gICAgICBjb21waWxlZEluc3RydWN0aW9uczogYyxcbiAgICAgIGFkZHJlc3NUYWJsZUxvb2t1cHM6IHJcbiAgICB9KTtcbiAgfVxuICBzZXJpYWxpemUoKSB7XG4gICAgY29uc3QgZSA9IEFycmF5KCk7XG4gICAgeHIoZSwgdGhpcy5zdGF0aWNBY2NvdW50S2V5cy5sZW5ndGgpO1xuICAgIGNvbnN0IHQgPSB0aGlzLnNlcmlhbGl6ZUluc3RydWN0aW9ucygpLCByID0gQXJyYXkoKTtcbiAgICB4cihyLCB0aGlzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLmxlbmd0aCk7XG4gICAgY29uc3QgbiA9IHRoaXMuc2VyaWFsaXplQWRkcmVzc1RhYmxlTG9va3VwcygpLCBpID0gQXJyYXkoKTtcbiAgICB4cihpLCB0aGlzLmFkZHJlc3NUYWJsZUxvb2t1cHMubGVuZ3RoKTtcbiAgICBjb25zdCBvID0gei5zdHJ1Y3QoW3oudTgoXCJwcmVmaXhcIiksIHouc3RydWN0KFt6LnU4KFwibnVtUmVxdWlyZWRTaWduYXR1cmVzXCIpLCB6LnU4KFwibnVtUmVhZG9ubHlTaWduZWRBY2NvdW50c1wiKSwgei51OChcIm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50c1wiKV0sIFwiaGVhZGVyXCIpLCB6LmJsb2IoZS5sZW5ndGgsIFwic3RhdGljQWNjb3VudEtleXNMZW5ndGhcIiksIHouc2VxKFdlKCksIHRoaXMuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoLCBcInN0YXRpY0FjY291bnRLZXlzXCIpLCBXZShcInJlY2VudEJsb2NraGFzaFwiKSwgei5ibG9iKHIubGVuZ3RoLCBcImluc3RydWN0aW9uc0xlbmd0aFwiKSwgei5ibG9iKHQubGVuZ3RoLCBcInNlcmlhbGl6ZWRJbnN0cnVjdGlvbnNcIiksIHouYmxvYihpLmxlbmd0aCwgXCJhZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoXCIpLCB6LmJsb2Iobi5sZW5ndGgsIFwic2VyaWFsaXplZEFkZHJlc3NUYWJsZUxvb2t1cHNcIildKSwgYSA9IG5ldyBVaW50OEFycmF5KHduKSwgYyA9IG8uZW5jb2RlKHtcbiAgICAgIHByZWZpeDogMTI4LFxuICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcixcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzTGVuZ3RoOiBuZXcgVWludDhBcnJheShlKSxcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzOiB0aGlzLnN0YXRpY0FjY291bnRLZXlzLm1hcCgodSkgPT4gdS50b0J5dGVzKCkpLFxuICAgICAgcmVjZW50QmxvY2toYXNoOiBhci5kZWNvZGUodGhpcy5yZWNlbnRCbG9ja2hhc2gpLFxuICAgICAgaW5zdHJ1Y3Rpb25zTGVuZ3RoOiBuZXcgVWludDhBcnJheShyKSxcbiAgICAgIHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnM6IHQsXG4gICAgICBhZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoOiBuZXcgVWludDhBcnJheShpKSxcbiAgICAgIHNlcmlhbGl6ZWRBZGRyZXNzVGFibGVMb29rdXBzOiBuXG4gICAgfSwgYSk7XG4gICAgcmV0dXJuIGEuc2xpY2UoMCwgYyk7XG4gIH1cbiAgc2VyaWFsaXplSW5zdHJ1Y3Rpb25zKCkge1xuICAgIGxldCBlID0gMDtcbiAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkod24pO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBjb25zdCBuID0gQXJyYXkoKTtcbiAgICAgIHhyKG4sIHIuYWNjb3VudEtleUluZGV4ZXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGkgPSBBcnJheSgpO1xuICAgICAgeHIoaSwgci5kYXRhLmxlbmd0aCk7XG4gICAgICBjb25zdCBvID0gei5zdHJ1Y3QoW3oudTgoXCJwcm9ncmFtSWRJbmRleFwiKSwgei5ibG9iKG4ubGVuZ3RoLCBcImVuY29kZWRBY2NvdW50S2V5SW5kZXhlc0xlbmd0aFwiKSwgei5zZXEoei51OCgpLCByLmFjY291bnRLZXlJbmRleGVzLmxlbmd0aCwgXCJhY2NvdW50S2V5SW5kZXhlc1wiKSwgei5ibG9iKGkubGVuZ3RoLCBcImVuY29kZWREYXRhTGVuZ3RoXCIpLCB6LmJsb2Ioci5kYXRhLmxlbmd0aCwgXCJkYXRhXCIpXSk7XG4gICAgICBlICs9IG8uZW5jb2RlKHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IHIucHJvZ3JhbUlkSW5kZXgsXG4gICAgICAgIGVuY29kZWRBY2NvdW50S2V5SW5kZXhlc0xlbmd0aDogbmV3IFVpbnQ4QXJyYXkobiksXG4gICAgICAgIGFjY291bnRLZXlJbmRleGVzOiByLmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgICBlbmNvZGVkRGF0YUxlbmd0aDogbmV3IFVpbnQ4QXJyYXkoaSksXG4gICAgICAgIGRhdGE6IHIuZGF0YVxuICAgICAgfSwgdCwgZSk7XG4gICAgfVxuICAgIHJldHVybiB0LnNsaWNlKDAsIGUpO1xuICB9XG4gIHNlcmlhbGl6ZUFkZHJlc3NUYWJsZUxvb2t1cHMoKSB7XG4gICAgbGV0IGUgPSAwO1xuICAgIGNvbnN0IHQgPSBuZXcgVWludDhBcnJheSh3bik7XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuYWRkcmVzc1RhYmxlTG9va3Vwcykge1xuICAgICAgY29uc3QgbiA9IEFycmF5KCk7XG4gICAgICB4cihuLCByLndyaXRhYmxlSW5kZXhlcy5sZW5ndGgpO1xuICAgICAgY29uc3QgaSA9IEFycmF5KCk7XG4gICAgICB4cihpLCByLnJlYWRvbmx5SW5kZXhlcy5sZW5ndGgpO1xuICAgICAgY29uc3QgbyA9IHouc3RydWN0KFtXZShcImFjY291bnRLZXlcIiksIHouYmxvYihuLmxlbmd0aCwgXCJlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoXCIpLCB6LnNlcSh6LnU4KCksIHIud3JpdGFibGVJbmRleGVzLmxlbmd0aCwgXCJ3cml0YWJsZUluZGV4ZXNcIiksIHouYmxvYihpLmxlbmd0aCwgXCJlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoXCIpLCB6LnNlcSh6LnU4KCksIHIucmVhZG9ubHlJbmRleGVzLmxlbmd0aCwgXCJyZWFkb25seUluZGV4ZXNcIildKTtcbiAgICAgIGUgKz0gby5lbmNvZGUoe1xuICAgICAgICBhY2NvdW50S2V5OiByLmFjY291bnRLZXkudG9CeXRlcygpLFxuICAgICAgICBlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoOiBuZXcgVWludDhBcnJheShuKSxcbiAgICAgICAgd3JpdGFibGVJbmRleGVzOiByLndyaXRhYmxlSW5kZXhlcyxcbiAgICAgICAgZW5jb2RlZFJlYWRvbmx5SW5kZXhlc0xlbmd0aDogbmV3IFVpbnQ4QXJyYXkoaSksXG4gICAgICAgIHJlYWRvbmx5SW5kZXhlczogci5yZWFkb25seUluZGV4ZXNcbiAgICAgIH0sIHQsIGUpO1xuICAgIH1cbiAgICByZXR1cm4gdC5zbGljZSgwLCBlKTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoZSkge1xuICAgIGxldCB0ID0gWy4uLmVdO1xuICAgIGNvbnN0IHIgPSBkcyh0KSwgbiA9IHIgJiBzdTtcbiAgICBLdChyICE9PSBuLCBcIkV4cGVjdGVkIHZlcnNpb25lZCBtZXNzYWdlIGJ1dCByZWNlaXZlZCBsZWdhY3kgbWVzc2FnZVwiKTtcbiAgICBjb25zdCBpID0gbjtcbiAgICBLdChpID09PSAwLCBgRXhwZWN0ZWQgdmVyc2lvbmVkIG1lc3NhZ2Ugd2l0aCB2ZXJzaW9uIDAgYnV0IGZvdW5kIHZlcnNpb24gJHtpfWApO1xuICAgIGNvbnN0IG8gPSB7XG4gICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IGRzKHQpLFxuICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogZHModCksXG4gICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IGRzKHQpXG4gICAgfSwgYSA9IFtdLCBsID0gRXIodCk7XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPCBsOyBwKyspXG4gICAgICBhLnB1c2gobmV3IE9lKFNyKHQsIDAsIGtzKSkpO1xuICAgIGNvbnN0IGMgPSBhci5lbmNvZGUoU3IodCwgMCwga3MpKSwgdSA9IEVyKHQpLCBkID0gW107XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPCB1OyBwKyspIHtcbiAgICAgIGNvbnN0IHkgPSBkcyh0KSwgRSA9IEVyKHQpLCBiID0gU3IodCwgMCwgRSksIFIgPSBFcih0KSwgQSA9IG5ldyBVaW50OEFycmF5KFNyKHQsIDAsIFIpKTtcbiAgICAgIGQucHVzaCh7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiB5LFxuICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogYixcbiAgICAgICAgZGF0YTogQVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGggPSBFcih0KSwgZiA9IFtdO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDwgaDsgcCsrKSB7XG4gICAgICBjb25zdCB5ID0gbmV3IE9lKFNyKHQsIDAsIGtzKSksIEUgPSBFcih0KSwgYiA9IFNyKHQsIDAsIEUpLCBSID0gRXIodCksIEEgPSBTcih0LCAwLCBSKTtcbiAgICAgIGYucHVzaCh7XG4gICAgICAgIGFjY291bnRLZXk6IHksXG4gICAgICAgIHdyaXRhYmxlSW5kZXhlczogYixcbiAgICAgICAgcmVhZG9ubHlJbmRleGVzOiBBXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBqbyh7XG4gICAgICBoZWFkZXI6IG8sXG4gICAgICBzdGF0aWNBY2NvdW50S2V5czogYSxcbiAgICAgIHJlY2VudEJsb2NraGFzaDogYyxcbiAgICAgIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zOiBkLFxuICAgICAgYWRkcmVzc1RhYmxlTG9va3VwczogZlxuICAgIH0pO1xuICB9XG59XG5jb25zdCBudSA9IHtcbiAgZGVzZXJpYWxpemVNZXNzYWdlVmVyc2lvbihzKSB7XG4gICAgY29uc3QgZSA9IHNbMF0sIHQgPSBlICYgc3U7XG4gICAgcmV0dXJuIHQgPT09IGUgPyBcImxlZ2FjeVwiIDogdDtcbiAgfSxcbiAgZGVzZXJpYWxpemU6IChzKSA9PiB7XG4gICAgY29uc3QgZSA9IG51LmRlc2VyaWFsaXplTWVzc2FnZVZlcnNpb24ocyk7XG4gICAgaWYgKGUgPT09IFwibGVnYWN5XCIpXG4gICAgICByZXR1cm4gTW4uZnJvbShzKTtcbiAgICBpZiAoZSA9PT0gMClcbiAgICAgIHJldHVybiBqby5kZXNlcmlhbGl6ZShzKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRyYW5zYWN0aW9uIG1lc3NhZ2UgdmVyc2lvbiAke2V9IGRlc2VyaWFsaXphdGlvbiBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gIH1cbn0sIG1FID0gSGUuQnVmZmVyLmFsbG9jKEdvKS5maWxsKDApO1xuY2xhc3MgVWQge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5rZXlzID0gdm9pZCAwLCB0aGlzLnByb2dyYW1JZCA9IHZvaWQgMCwgdGhpcy5kYXRhID0gSGUuQnVmZmVyLmFsbG9jKDApLCB0aGlzLnByb2dyYW1JZCA9IGUucHJvZ3JhbUlkLCB0aGlzLmtleXMgPSBlLmtleXMsIGUuZGF0YSAmJiAodGhpcy5kYXRhID0gZS5kYXRhKTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGtleXM6IHRoaXMua2V5cy5tYXAoKHtcbiAgICAgICAgcHVia2V5OiBlLFxuICAgICAgICBpc1NpZ25lcjogdCxcbiAgICAgICAgaXNXcml0YWJsZTogclxuICAgICAgfSkgPT4gKHtcbiAgICAgICAgcHVia2V5OiBlLnRvSlNPTigpLFxuICAgICAgICBpc1NpZ25lcjogdCxcbiAgICAgICAgaXNXcml0YWJsZTogclxuICAgICAgfSkpLFxuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZC50b0pTT04oKSxcbiAgICAgIGRhdGE6IFsuLi50aGlzLmRhdGFdXG4gICAgfTtcbiAgfVxufVxuY2xhc3MgS28ge1xuICAvKipcbiAgICogVGhlIGZpcnN0IChwYXllcikgVHJhbnNhY3Rpb24gc2lnbmF0dXJlXG4gICAqXG4gICAqIEByZXR1cm5zIHtCdWZmZXIgfCBudWxsfSBCdWZmZXIgb2YgcGF5ZXIncyBzaWduYXR1cmVcbiAgICovXG4gIGdldCBzaWduYXR1cmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlcy5sZW5ndGggPiAwID8gdGhpcy5zaWduYXR1cmVzWzBdLnNpZ25hdHVyZSA6IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFRoZSB0cmFuc2FjdGlvbiBmZWUgcGF5ZXJcbiAgICovXG4gIC8vIENvbnN0cnVjdCBhIHRyYW5zYWN0aW9uIHdpdGggYSBibG9ja2hhc2ggYW5kIGxhc3RWYWxpZEJsb2NrSGVpZ2h0XG4gIC8vIENvbnN0cnVjdCBhIHRyYW5zYWN0aW9uIHVzaW5nIGEgZHVyYWJsZSBub25jZVxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgYFRyYW5zYWN0aW9uQ3RvckZpZWxkc2AgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHZlcnNpb24uXG4gICAqIFBsZWFzZSBzdXBwbHkgYSBgVHJhbnNhY3Rpb25CbG9ja2hhc2hDdG9yYCBpbnN0ZWFkLlxuICAgKi9cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhbiBlbXB0eSBUcmFuc2FjdGlvblxuICAgKi9cbiAgY29uc3RydWN0b3IoZSkge1xuICAgIGlmICh0aGlzLnNpZ25hdHVyZXMgPSBbXSwgdGhpcy5mZWVQYXllciA9IHZvaWQgMCwgdGhpcy5pbnN0cnVjdGlvbnMgPSBbXSwgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSB2b2lkIDAsIHRoaXMubGFzdFZhbGlkQmxvY2tIZWlnaHQgPSB2b2lkIDAsIHRoaXMubm9uY2VJbmZvID0gdm9pZCAwLCB0aGlzLm1pbk5vbmNlQ29udGV4dFNsb3QgPSB2b2lkIDAsIHRoaXMuX21lc3NhZ2UgPSB2b2lkIDAsIHRoaXMuX2pzb24gPSB2b2lkIDAsICEhZSlcbiAgICAgIGlmIChlLmZlZVBheWVyICYmICh0aGlzLmZlZVBheWVyID0gZS5mZWVQYXllciksIGUuc2lnbmF0dXJlcyAmJiAodGhpcy5zaWduYXR1cmVzID0gZS5zaWduYXR1cmVzKSwgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwibm9uY2VJbmZvXCIpKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBtaW5Db250ZXh0U2xvdDogdCxcbiAgICAgICAgICBub25jZUluZm86IHJcbiAgICAgICAgfSA9IGU7XG4gICAgICAgIHRoaXMubWluTm9uY2VDb250ZXh0U2xvdCA9IHQsIHRoaXMubm9uY2VJbmZvID0gcjtcbiAgICAgIH0gZWxzZSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsIFwibGFzdFZhbGlkQmxvY2tIZWlnaHRcIikpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGJsb2NraGFzaDogdCxcbiAgICAgICAgICBsYXN0VmFsaWRCbG9ja0hlaWdodDogclxuICAgICAgICB9ID0gZTtcbiAgICAgICAgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSB0LCB0aGlzLmxhc3RWYWxpZEJsb2NrSGVpZ2h0ID0gcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICByZWNlbnRCbG9ja2hhc2g6IHQsXG4gICAgICAgICAgbm9uY2VJbmZvOiByXG4gICAgICAgIH0gPSBlO1xuICAgICAgICByICYmICh0aGlzLm5vbmNlSW5mbyA9IHIpLCB0aGlzLnJlY2VudEJsb2NraGFzaCA9IHQ7XG4gICAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgdG9KU09OKCkge1xuICAgIHJldHVybiB7XG4gICAgICByZWNlbnRCbG9ja2hhc2g6IHRoaXMucmVjZW50QmxvY2toYXNoIHx8IG51bGwsXG4gICAgICBmZWVQYXllcjogdGhpcy5mZWVQYXllciA/IHRoaXMuZmVlUGF5ZXIudG9KU09OKCkgOiBudWxsLFxuICAgICAgbm9uY2VJbmZvOiB0aGlzLm5vbmNlSW5mbyA/IHtcbiAgICAgICAgbm9uY2U6IHRoaXMubm9uY2VJbmZvLm5vbmNlLFxuICAgICAgICBub25jZUluc3RydWN0aW9uOiB0aGlzLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uLnRvSlNPTigpXG4gICAgICB9IDogbnVsbCxcbiAgICAgIGluc3RydWN0aW9uczogdGhpcy5pbnN0cnVjdGlvbnMubWFwKChlKSA9PiBlLnRvSlNPTigpKSxcbiAgICAgIHNpZ25lcnM6IHRoaXMuc2lnbmF0dXJlcy5tYXAoKHtcbiAgICAgICAgcHVibGljS2V5OiBlXG4gICAgICB9KSA9PiBlLnRvSlNPTigpKVxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEFkZCBvbmUgb3IgbW9yZSBpbnN0cnVjdGlvbnMgdG8gdGhpcyBUcmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0FycmF5PCBUcmFuc2FjdGlvbiB8IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24gfCBUcmFuc2FjdGlvbkluc3RydWN0aW9uQ3RvckZpZWxkcyA+fSBpdGVtcyAtIEluc3RydWN0aW9ucyB0byBhZGQgdG8gdGhlIFRyYW5zYWN0aW9uXG4gICAqL1xuICBhZGQoLi4uZSkge1xuICAgIGlmIChlLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGluc3RydWN0aW9uc1wiKTtcbiAgICByZXR1cm4gZS5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICBcImluc3RydWN0aW9uc1wiIGluIHQgPyB0aGlzLmluc3RydWN0aW9ucyA9IHRoaXMuaW5zdHJ1Y3Rpb25zLmNvbmNhdCh0Lmluc3RydWN0aW9ucykgOiBcImRhdGFcIiBpbiB0ICYmIFwicHJvZ3JhbUlkXCIgaW4gdCAmJiBcImtleXNcIiBpbiB0ID8gdGhpcy5pbnN0cnVjdGlvbnMucHVzaCh0KSA6IHRoaXMuaW5zdHJ1Y3Rpb25zLnB1c2gobmV3IFVkKHQpKTtcbiAgICB9KSwgdGhpcztcbiAgfVxuICAvKipcbiAgICogQ29tcGlsZSB0cmFuc2FjdGlvbiBkYXRhXG4gICAqL1xuICBjb21waWxlTWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2FnZSAmJiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fanNvbikpXG4gICAgICByZXR1cm4gdGhpcy5fbWVzc2FnZTtcbiAgICBsZXQgZSwgdDtcbiAgICBpZiAodGhpcy5ub25jZUluZm8gPyAoZSA9IHRoaXMubm9uY2VJbmZvLm5vbmNlLCB0aGlzLmluc3RydWN0aW9uc1swXSAhPSB0aGlzLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uID8gdCA9IFt0aGlzLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uLCAuLi50aGlzLmluc3RydWN0aW9uc10gOiB0ID0gdGhpcy5pbnN0cnVjdGlvbnMpIDogKGUgPSB0aGlzLnJlY2VudEJsb2NraGFzaCwgdCA9IHRoaXMuaW5zdHJ1Y3Rpb25zKSwgIWUpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmFuc2FjdGlvbiByZWNlbnRCbG9ja2hhc2ggcmVxdWlyZWRcIik7XG4gICAgdC5sZW5ndGggPCAxICYmIGNvbnNvbGUud2FybihcIk5vIGluc3RydWN0aW9ucyBwcm92aWRlZFwiKTtcbiAgICBsZXQgcjtcbiAgICBpZiAodGhpcy5mZWVQYXllcilcbiAgICAgIHIgPSB0aGlzLmZlZVBheWVyO1xuICAgIGVsc2UgaWYgKHRoaXMuc2lnbmF0dXJlcy5sZW5ndGggPiAwICYmIHRoaXMuc2lnbmF0dXJlc1swXS5wdWJsaWNLZXkpXG4gICAgICByID0gdGhpcy5zaWduYXR1cmVzWzBdLnB1YmxpY0tleTtcbiAgICBlbHNlXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcmFuc2FjdGlvbiBmZWUgcGF5ZXIgcmVxdWlyZWRcIik7XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCB0Lmxlbmd0aDsgeSsrKVxuICAgICAgaWYgKHRbeV0ucHJvZ3JhbUlkID09PSB2b2lkIDApXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gaW5zdHJ1Y3Rpb24gaW5kZXggJHt5fSBoYXMgdW5kZWZpbmVkIHByb2dyYW0gaWRgKTtcbiAgICBjb25zdCBuID0gW10sIGkgPSBbXTtcbiAgICB0LmZvckVhY2goKHkpID0+IHtcbiAgICAgIHkua2V5cy5mb3JFYWNoKChiKSA9PiB7XG4gICAgICAgIGkucHVzaCh7XG4gICAgICAgICAgLi4uYlxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgRSA9IHkucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICBuLmluY2x1ZGVzKEUpIHx8IG4ucHVzaChFKTtcbiAgICB9KSwgbi5mb3JFYWNoKCh5KSA9PiB7XG4gICAgICBpLnB1c2goe1xuICAgICAgICBwdWJrZXk6IG5ldyBPZSh5KSxcbiAgICAgICAgaXNTaWduZXI6ICExLFxuICAgICAgICBpc1dyaXRhYmxlOiAhMVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgbyA9IFtdO1xuICAgIGkuZm9yRWFjaCgoeSkgPT4ge1xuICAgICAgY29uc3QgRSA9IHkucHVia2V5LnRvU3RyaW5nKCksIGIgPSBvLmZpbmRJbmRleCgoUikgPT4gUi5wdWJrZXkudG9TdHJpbmcoKSA9PT0gRSk7XG4gICAgICBiID4gLTEgPyAob1tiXS5pc1dyaXRhYmxlID0gb1tiXS5pc1dyaXRhYmxlIHx8IHkuaXNXcml0YWJsZSwgb1tiXS5pc1NpZ25lciA9IG9bYl0uaXNTaWduZXIgfHwgeS5pc1NpZ25lcikgOiBvLnB1c2goeSk7XG4gICAgfSksIG8uc29ydChmdW5jdGlvbih5LCBFKSB7XG4gICAgICBpZiAoeS5pc1NpZ25lciAhPT0gRS5pc1NpZ25lcilcbiAgICAgICAgcmV0dXJuIHkuaXNTaWduZXIgPyAtMSA6IDE7XG4gICAgICBpZiAoeS5pc1dyaXRhYmxlICE9PSBFLmlzV3JpdGFibGUpXG4gICAgICAgIHJldHVybiB5LmlzV3JpdGFibGUgPyAtMSA6IDE7XG4gICAgICBjb25zdCBiID0ge1xuICAgICAgICBsb2NhbGVNYXRjaGVyOiBcImJlc3QgZml0XCIsXG4gICAgICAgIHVzYWdlOiBcInNvcnRcIixcbiAgICAgICAgc2Vuc2l0aXZpdHk6IFwidmFyaWFudFwiLFxuICAgICAgICBpZ25vcmVQdW5jdHVhdGlvbjogITEsXG4gICAgICAgIG51bWVyaWM6ICExLFxuICAgICAgICBjYXNlRmlyc3Q6IFwibG93ZXJcIlxuICAgICAgfTtcbiAgICAgIHJldHVybiB5LnB1YmtleS50b0Jhc2U1OCgpLmxvY2FsZUNvbXBhcmUoRS5wdWJrZXkudG9CYXNlNTgoKSwgXCJlblwiLCBiKTtcbiAgICB9KTtcbiAgICBjb25zdCBhID0gby5maW5kSW5kZXgoKHkpID0+IHkucHVia2V5LmVxdWFscyhyKSk7XG4gICAgaWYgKGEgPiAtMSkge1xuICAgICAgY29uc3QgW3ldID0gby5zcGxpY2UoYSwgMSk7XG4gICAgICB5LmlzU2lnbmVyID0gITAsIHkuaXNXcml0YWJsZSA9ICEwLCBvLnVuc2hpZnQoeSk7XG4gICAgfSBlbHNlXG4gICAgICBvLnVuc2hpZnQoe1xuICAgICAgICBwdWJrZXk6IHIsXG4gICAgICAgIGlzU2lnbmVyOiAhMCxcbiAgICAgICAgaXNXcml0YWJsZTogITBcbiAgICAgIH0pO1xuICAgIGZvciAoY29uc3QgeSBvZiB0aGlzLnNpZ25hdHVyZXMpIHtcbiAgICAgIGNvbnN0IEUgPSBvLmZpbmRJbmRleCgoYikgPT4gYi5wdWJrZXkuZXF1YWxzKHkucHVibGljS2V5KSk7XG4gICAgICBpZiAoRSA+IC0xKVxuICAgICAgICBvW0VdLmlzU2lnbmVyIHx8IChvW0VdLmlzU2lnbmVyID0gITAsIGNvbnNvbGUud2FybihcIlRyYW5zYWN0aW9uIHJlZmVyZW5jZXMgYSBzaWduYXR1cmUgdGhhdCBpcyB1bm5lY2Vzc2FyeSwgb25seSB0aGUgZmVlIHBheWVyIGFuZCBpbnN0cnVjdGlvbiBzaWduZXIgYWNjb3VudHMgc2hvdWxkIHNpZ24gYSB0cmFuc2FjdGlvbi4gVGhpcyBiZWhhdmlvciBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIHRocm93IGFuIGVycm9yIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gcmVsZWFzZS5cIikpO1xuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gc2lnbmVyOiAke3kucHVibGljS2V5LnRvU3RyaW5nKCl9YCk7XG4gICAgfVxuICAgIGxldCBsID0gMCwgYyA9IDAsIHUgPSAwO1xuICAgIGNvbnN0IGQgPSBbXSwgaCA9IFtdO1xuICAgIG8uZm9yRWFjaCgoe1xuICAgICAgcHVia2V5OiB5LFxuICAgICAgaXNTaWduZXI6IEUsXG4gICAgICBpc1dyaXRhYmxlOiBiXG4gICAgfSkgPT4ge1xuICAgICAgRSA/IChkLnB1c2goeS50b1N0cmluZygpKSwgbCArPSAxLCBiIHx8IChjICs9IDEpKSA6IChoLnB1c2goeS50b1N0cmluZygpKSwgYiB8fCAodSArPSAxKSk7XG4gICAgfSk7XG4gICAgY29uc3QgZiA9IGQuY29uY2F0KGgpLCBwID0gdC5tYXAoKHkpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZGF0YTogRSxcbiAgICAgICAgcHJvZ3JhbUlkOiBiXG4gICAgICB9ID0geTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBmLmluZGV4T2YoYi50b1N0cmluZygpKSxcbiAgICAgICAgYWNjb3VudHM6IHkua2V5cy5tYXAoKFIpID0+IGYuaW5kZXhPZihSLnB1YmtleS50b1N0cmluZygpKSksXG4gICAgICAgIGRhdGE6IGFyLmVuY29kZShFKVxuICAgICAgfTtcbiAgICB9KTtcbiAgICByZXR1cm4gcC5mb3JFYWNoKCh5KSA9PiB7XG4gICAgICBLdCh5LnByb2dyYW1JZEluZGV4ID49IDApLCB5LmFjY291bnRzLmZvckVhY2goKEUpID0+IEt0KEUgPj0gMCkpO1xuICAgIH0pLCBuZXcgTW4oe1xuICAgICAgaGVhZGVyOiB7XG4gICAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogbCxcbiAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogYyxcbiAgICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiB1XG4gICAgICB9LFxuICAgICAgYWNjb3VudEtleXM6IGYsXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IGUsXG4gICAgICBpbnN0cnVjdGlvbnM6IHBcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfY29tcGlsZSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5jb21waWxlTWVzc2FnZSgpLCB0ID0gZS5hY2NvdW50S2V5cy5zbGljZSgwLCBlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMpO1xuICAgIHJldHVybiB0aGlzLnNpZ25hdHVyZXMubGVuZ3RoID09PSB0Lmxlbmd0aCAmJiB0aGlzLnNpZ25hdHVyZXMuZXZlcnkoKG4sIGkpID0+IHRbaV0uZXF1YWxzKG4ucHVibGljS2V5KSkgfHwgKHRoaXMuc2lnbmF0dXJlcyA9IHQubWFwKChyKSA9PiAoe1xuICAgICAgc2lnbmF0dXJlOiBudWxsLFxuICAgICAgcHVibGljS2V5OiByXG4gICAgfSkpKSwgZTtcbiAgfVxuICAvKipcbiAgICogR2V0IGEgYnVmZmVyIG9mIHRoZSBUcmFuc2FjdGlvbiBkYXRhIHRoYXQgbmVlZCB0byBiZSBjb3ZlcmVkIGJ5IHNpZ25hdHVyZXNcbiAgICovXG4gIHNlcmlhbGl6ZU1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBpbGUoKS5zZXJpYWxpemUoKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBlc3RpbWF0ZWQgZmVlIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7Q29ubmVjdGlvbn0gY29ubmVjdGlvbiBDb25uZWN0aW9uIHRvIFJQQyBFbmRwb2ludC5cbiAgICpcbiAgICogQHJldHVybnMge1Byb21pc2U8bnVtYmVyIHwgbnVsbD59IFRoZSBlc3RpbWF0ZWQgZmVlIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIGdldEVzdGltYXRlZEZlZShlKSB7XG4gICAgcmV0dXJuIChhd2FpdCBlLmdldEZlZUZvck1lc3NhZ2UodGhpcy5jb21waWxlTWVzc2FnZSgpKSkudmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHB1YmxpYyBrZXlzIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzaWduIHRoZSBUcmFuc2FjdGlvbi5cbiAgICogVGhlIGZpcnN0IHNpZ25lciB3aWxsIGJlIHVzZWQgYXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBwYXllciBhY2NvdW50LlxuICAgKlxuICAgKiBTaWduYXR1cmVzIGNhbiBiZSBhZGRlZCB3aXRoIGVpdGhlciBgcGFydGlhbFNpZ25gIG9yIGBhZGRTaWduYXR1cmVgXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgc2luY2UgdjAuODQuMC4gT25seSB0aGUgZmVlIHBheWVyIG5lZWRzIHRvIGJlXG4gICAqIHNwZWNpZmllZCBhbmQgaXQgY2FuIGJlIHNldCBpbiB0aGUgVHJhbnNhY3Rpb24gY29uc3RydWN0b3Igb3Igd2l0aCB0aGVcbiAgICogYGZlZVBheWVyYCBwcm9wZXJ0eS5cbiAgICovXG4gIHNldFNpZ25lcnMoLi4uZSkge1xuICAgIGlmIChlLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNpZ25lcnNcIik7XG4gICAgY29uc3QgdCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgdGhpcy5zaWduYXR1cmVzID0gZS5maWx0ZXIoKHIpID0+IHtcbiAgICAgIGNvbnN0IG4gPSByLnRvU3RyaW5nKCk7XG4gICAgICByZXR1cm4gdC5oYXMobikgPyAhMSA6ICh0LmFkZChuKSwgITApO1xuICAgIH0pLm1hcCgocikgPT4gKHtcbiAgICAgIHNpZ25hdHVyZTogbnVsbCxcbiAgICAgIHB1YmxpY0tleTogclxuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogU2lnbiB0aGUgVHJhbnNhY3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHNpZ25lcnMuIE11bHRpcGxlIHNpZ25hdHVyZXMgbWF5XG4gICAqIGJlIGFwcGxpZWQgdG8gYSBUcmFuc2FjdGlvbi4gVGhlIGZpcnN0IHNpZ25hdHVyZSBpcyBjb25zaWRlcmVkIFwicHJpbWFyeVwiXG4gICAqIGFuZCBpcyB1c2VkIGlkZW50aWZ5IGFuZCBjb25maXJtIHRyYW5zYWN0aW9ucy5cbiAgICpcbiAgICogSWYgdGhlIFRyYW5zYWN0aW9uIGBmZWVQYXllcmAgaXMgbm90IHNldCwgdGhlIGZpcnN0IHNpZ25lciB3aWxsIGJlIHVzZWRcbiAgICogYXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBwYXllciBhY2NvdW50LlxuICAgKlxuICAgKiBUcmFuc2FjdGlvbiBmaWVsZHMgc2hvdWxkIG5vdCBiZSBtb2RpZmllZCBhZnRlciB0aGUgZmlyc3QgY2FsbCB0byBgc2lnbmAsXG4gICAqIGFzIGRvaW5nIHNvIG1heSBpbnZhbGlkYXRlIHRoZSBzaWduYXR1cmUgYW5kIGNhdXNlIHRoZSBUcmFuc2FjdGlvbiB0byBiZVxuICAgKiByZWplY3RlZC5cbiAgICpcbiAgICogVGhlIFRyYW5zYWN0aW9uIG11c3QgYmUgYXNzaWduZWQgYSB2YWxpZCBgcmVjZW50QmxvY2toYXNoYCBiZWZvcmUgaW52b2tpbmcgdGhpcyBtZXRob2RcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTxTaWduZXI+fSBzaWduZXJzIEFycmF5IG9mIHNpZ25lcnMgdGhhdCB3aWxsIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBzaWduKC4uLmUpIHtcbiAgICBpZiAoZS5sZW5ndGggPT09IDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBzaWduZXJzXCIpO1xuICAgIGNvbnN0IHQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpLCByID0gW107XG4gICAgZm9yIChjb25zdCBpIG9mIGUpIHtcbiAgICAgIGNvbnN0IG8gPSBpLnB1YmxpY0tleS50b1N0cmluZygpO1xuICAgICAgdC5oYXMobykgfHwgKHQuYWRkKG8pLCByLnB1c2goaSkpO1xuICAgIH1cbiAgICB0aGlzLnNpZ25hdHVyZXMgPSByLm1hcCgoaSkgPT4gKHtcbiAgICAgIHNpZ25hdHVyZTogbnVsbCxcbiAgICAgIHB1YmxpY0tleTogaS5wdWJsaWNLZXlcbiAgICB9KSk7XG4gICAgY29uc3QgbiA9IHRoaXMuX2NvbXBpbGUoKTtcbiAgICB0aGlzLl9wYXJ0aWFsU2lnbihuLCAuLi5yKTtcbiAgfVxuICAvKipcbiAgICogUGFydGlhbGx5IHNpZ24gYSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgYWNjb3VudHMuIEFsbCBhY2NvdW50cyBtdXN0XG4gICAqIGNvcnJlc3BvbmQgdG8gZWl0aGVyIHRoZSBmZWUgcGF5ZXIgb3IgYSBzaWduZXIgYWNjb3VudCBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogaW5zdHJ1Y3Rpb25zLlxuICAgKlxuICAgKiBBbGwgdGhlIGNhdmVhdHMgZnJvbSB0aGUgYHNpZ25gIG1ldGhvZCBhcHBseSB0byBgcGFydGlhbFNpZ25gXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8U2lnbmVyPn0gc2lnbmVycyBBcnJheSBvZiBzaWduZXJzIHRoYXQgd2lsbCBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgcGFydGlhbFNpZ24oLi4uZSkge1xuICAgIGlmIChlLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHNpZ25lcnNcIik7XG4gICAgY29uc3QgdCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCksIHIgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgZSkge1xuICAgICAgY29uc3QgbyA9IGkucHVibGljS2V5LnRvU3RyaW5nKCk7XG4gICAgICB0LmhhcyhvKSB8fCAodC5hZGQobyksIHIucHVzaChpKSk7XG4gICAgfVxuICAgIGNvbnN0IG4gPSB0aGlzLl9jb21waWxlKCk7XG4gICAgdGhpcy5fcGFydGlhbFNpZ24obiwgLi4ucik7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3BhcnRpYWxTaWduKGUsIC4uLnQpIHtcbiAgICBjb25zdCByID0gZS5zZXJpYWxpemUoKTtcbiAgICB0LmZvckVhY2goKG4pID0+IHtcbiAgICAgIGNvbnN0IGkgPSBPMChyLCBuLnNlY3JldEtleSk7XG4gICAgICB0aGlzLl9hZGRTaWduYXR1cmUobi5wdWJsaWNLZXksIHJ1KGkpKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQWRkIGFuIGV4dGVybmFsbHkgY3JlYXRlZCBzaWduYXR1cmUgdG8gYSB0cmFuc2FjdGlvbi4gVGhlIHB1YmxpYyBrZXlcbiAgICogbXVzdCBjb3JyZXNwb25kIHRvIGVpdGhlciB0aGUgZmVlIHBheWVyIG9yIGEgc2lnbmVyIGFjY291bnQgaW4gdGhlIHRyYW5zYWN0aW9uXG4gICAqIGluc3RydWN0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIHtQdWJsaWNLZXl9IHB1YmtleSBQdWJsaWMga2V5IHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBzaWduYXR1cmUgQW4gZXh0ZXJuYWxseSBjcmVhdGVkIHNpZ25hdHVyZSB0byBhZGQgdG8gdGhlIHRyYW5zYWN0aW9uLlxuICAgKi9cbiAgYWRkU2lnbmF0dXJlKGUsIHQpIHtcbiAgICB0aGlzLl9jb21waWxlKCksIHRoaXMuX2FkZFNpZ25hdHVyZShlLCB0KTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfYWRkU2lnbmF0dXJlKGUsIHQpIHtcbiAgICBLdCh0Lmxlbmd0aCA9PT0gNjQpO1xuICAgIGNvbnN0IHIgPSB0aGlzLnNpZ25hdHVyZXMuZmluZEluZGV4KChuKSA9PiBlLmVxdWFscyhuLnB1YmxpY0tleSkpO1xuICAgIGlmIChyIDwgMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihgdW5rbm93biBzaWduZXI6ICR7ZS50b1N0cmluZygpfWApO1xuICAgIHRoaXMuc2lnbmF0dXJlc1tyXS5zaWduYXR1cmUgPSBIZS5CdWZmZXIuZnJvbSh0KTtcbiAgfVxuICAvKipcbiAgICogVmVyaWZ5IHNpZ25hdHVyZXMgb2YgYSBUcmFuc2FjdGlvblxuICAgKiBPcHRpb25hbCBwYXJhbWV0ZXIgc3BlY2lmaWVzIGlmIHdlJ3JlIGV4cGVjdGluZyBhIGZ1bGx5IHNpZ25lZCBUcmFuc2FjdGlvbiBvciBhIHBhcnRpYWxseSBzaWduZWQgb25lLlxuICAgKiBJZiBubyBib29sZWFuIGlzIHByb3ZpZGVkLCB3ZSBleHBlY3QgYSBmdWxseSBzaWduZWQgVHJhbnNhY3Rpb24gYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSBbcmVxdWlyZUFsbFNpZ25hdHVyZXM9dHJ1ZV0gUmVxdWlyZSBhIGZ1bGx5IHNpZ25lZCBUcmFuc2FjdGlvblxuICAgKi9cbiAgdmVyaWZ5U2lnbmF0dXJlcyhlID0gITApIHtcbiAgICByZXR1cm4gIXRoaXMuX2dldE1lc3NhZ2VTaWduZWRuZXNzRXJyb3JzKHRoaXMuc2VyaWFsaXplTWVzc2FnZSgpLCBlKTtcbiAgfVxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfZ2V0TWVzc2FnZVNpZ25lZG5lc3NFcnJvcnMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHtcbiAgICAgIHNpZ25hdHVyZTogbixcbiAgICAgIHB1YmxpY0tleTogaVxuICAgIH0gb2YgdGhpcy5zaWduYXR1cmVzKVxuICAgICAgbiA9PT0gbnVsbCA/IHQgJiYgKHIubWlzc2luZyB8fCAoci5taXNzaW5nID0gW10pKS5wdXNoKGkpIDogYUUobiwgZSwgaS50b0J5dGVzKCkpIHx8IChyLmludmFsaWQgfHwgKHIuaW52YWxpZCA9IFtdKSkucHVzaChpKTtcbiAgICByZXR1cm4gci5pbnZhbGlkIHx8IHIubWlzc2luZyA/IHIgOiB2b2lkIDA7XG4gIH1cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0aGUgVHJhbnNhY3Rpb24gaW4gdGhlIHdpcmUgZm9ybWF0LlxuICAgKlxuICAgKiBAcGFyYW0ge0J1ZmZlcn0gW2NvbmZpZ10gQ29uZmlnIG9mIHRyYW5zYWN0aW9uLlxuICAgKlxuICAgKiBAcmV0dXJucyB7QnVmZmVyfSBTaWduYXR1cmUgb2YgdHJhbnNhY3Rpb24gaW4gd2lyZSBmb3JtYXQuXG4gICAqL1xuICBzZXJpYWxpemUoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiB0LFxuICAgICAgdmVyaWZ5U2lnbmF0dXJlczogclxuICAgIH0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiAhMCxcbiAgICAgIHZlcmlmeVNpZ25hdHVyZXM6ICEwXG4gICAgfSwgZSksIG4gPSB0aGlzLnNlcmlhbGl6ZU1lc3NhZ2UoKTtcbiAgICBpZiAocikge1xuICAgICAgY29uc3QgaSA9IHRoaXMuX2dldE1lc3NhZ2VTaWduZWRuZXNzRXJyb3JzKG4sIHQpO1xuICAgICAgaWYgKGkpIHtcbiAgICAgICAgbGV0IG8gPSBcIlNpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkLlwiO1xuICAgICAgICB0aHJvdyBpLmludmFsaWQgJiYgKG8gKz0gYFxuSW52YWxpZCBzaWduYXR1cmUgZm9yIHB1YmxpYyBrZXkke2kuaW52YWxpZC5sZW5ndGggPT09IDEgPyBcIlwiIDogXCIocylcIn0gW1xcYCR7aS5pbnZhbGlkLm1hcCgoYSkgPT4gYS50b0Jhc2U1OCgpKS5qb2luKFwiYCwgYFwiKX1cXGBdLmApLCBpLm1pc3NpbmcgJiYgKG8gKz0gYFxuTWlzc2luZyBzaWduYXR1cmUgZm9yIHB1YmxpYyBrZXkke2kubWlzc2luZy5sZW5ndGggPT09IDEgPyBcIlwiIDogXCIocylcIn0gW1xcYCR7aS5taXNzaW5nLm1hcCgoYSkgPT4gYS50b0Jhc2U1OCgpKS5qb2luKFwiYCwgYFwiKX1cXGBdLmApLCBuZXcgRXJyb3Iobyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemUobik7XG4gIH1cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3NlcmlhbGl6ZShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2lnbmF0dXJlczogdFxuICAgIH0gPSB0aGlzLCByID0gW107XG4gICAgeHIociwgdC5sZW5ndGgpO1xuICAgIGNvbnN0IG4gPSByLmxlbmd0aCArIHQubGVuZ3RoICogNjQgKyBlLmxlbmd0aCwgaSA9IEhlLkJ1ZmZlci5hbGxvYyhuKTtcbiAgICByZXR1cm4gS3QodC5sZW5ndGggPCAyNTYpLCBIZS5CdWZmZXIuZnJvbShyKS5jb3B5KGksIDApLCB0LmZvckVhY2goKHtcbiAgICAgIHNpZ25hdHVyZTogb1xuICAgIH0sIGEpID0+IHtcbiAgICAgIG8gIT09IG51bGwgJiYgKEt0KG8ubGVuZ3RoID09PSA2NCwgXCJzaWduYXR1cmUgaGFzIGludmFsaWQgbGVuZ3RoXCIpLCBIZS5CdWZmZXIuZnJvbShvKS5jb3B5KGksIHIubGVuZ3RoICsgYSAqIDY0KSk7XG4gICAgfSksIGUuY29weShpLCByLmxlbmd0aCArIHQubGVuZ3RoICogNjQpLCBLdChpLmxlbmd0aCA8PSB3biwgYFRyYW5zYWN0aW9uIHRvbyBsYXJnZTogJHtpLmxlbmd0aH0gPiAke3dufWApLCBpO1xuICB9XG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIG1ldGhvZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldCBrZXlzKCkge1xuICAgIHJldHVybiBLdCh0aGlzLmluc3RydWN0aW9ucy5sZW5ndGggPT09IDEpLCB0aGlzLmluc3RydWN0aW9uc1swXS5rZXlzLm1hcCgoZSkgPT4gZS5wdWJrZXkpO1xuICB9XG4gIC8qKlxuICAgKiBEZXByZWNhdGVkIG1ldGhvZFxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGdldCBwcm9ncmFtSWQoKSB7XG4gICAgcmV0dXJuIEt0KHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMSksIHRoaXMuaW5zdHJ1Y3Rpb25zWzBdLnByb2dyYW1JZDtcbiAgfVxuICAvKipcbiAgICogRGVwcmVjYXRlZCBtZXRob2RcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXQgZGF0YSgpIHtcbiAgICByZXR1cm4gS3QodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoID09PSAxKSwgdGhpcy5pbnN0cnVjdGlvbnNbMF0uZGF0YTtcbiAgfVxuICAvKipcbiAgICogUGFyc2UgYSB3aXJlIHRyYW5zYWN0aW9uIGludG8gYSBUcmFuc2FjdGlvbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyIHwgVWludDhBcnJheSB8IEFycmF5PG51bWJlcj59IGJ1ZmZlciBTaWduYXR1cmUgb2Ygd2lyZSBUcmFuc2FjdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb259IFRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmF0dXJlXG4gICAqL1xuICBzdGF0aWMgZnJvbShlKSB7XG4gICAgbGV0IHQgPSBbLi4uZV07XG4gICAgY29uc3QgciA9IEVyKHQpO1xuICAgIGxldCBuID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByOyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSBTcih0LCAwLCBHbyk7XG4gICAgICBuLnB1c2goYXIuZW5jb2RlKEhlLkJ1ZmZlci5mcm9tKG8pKSk7XG4gICAgfVxuICAgIHJldHVybiBLby5wb3B1bGF0ZShNbi5mcm9tKHQpLCBuKTtcbiAgfVxuICAvKipcbiAgICogUG9wdWxhdGUgVHJhbnNhY3Rpb24gb2JqZWN0IGZyb20gbWVzc2FnZSBhbmQgc2lnbmF0dXJlc1xuICAgKlxuICAgKiBAcGFyYW0ge01lc3NhZ2V9IG1lc3NhZ2UgTWVzc2FnZSBvZiB0cmFuc2FjdGlvblxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHNpZ25hdHVyZXMgTGlzdCBvZiBzaWduYXR1cmVzIHRvIGFzc2lnbiB0byB0aGUgdHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHJldHVybnMge1RyYW5zYWN0aW9ufSBUaGUgcG9wdWxhdGVkIFRyYW5zYWN0aW9uXG4gICAqL1xuICBzdGF0aWMgcG9wdWxhdGUoZSwgdCA9IFtdKSB7XG4gICAgY29uc3QgciA9IG5ldyBLbygpO1xuICAgIHJldHVybiByLnJlY2VudEJsb2NraGFzaCA9IGUucmVjZW50QmxvY2toYXNoLCBlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMgPiAwICYmIChyLmZlZVBheWVyID0gZS5hY2NvdW50S2V5c1swXSksIHQuZm9yRWFjaCgobiwgaSkgPT4ge1xuICAgICAgY29uc3QgbyA9IHtcbiAgICAgICAgc2lnbmF0dXJlOiBuID09IGFyLmVuY29kZShtRSkgPyBudWxsIDogYXIuZGVjb2RlKG4pLFxuICAgICAgICBwdWJsaWNLZXk6IGUuYWNjb3VudEtleXNbaV1cbiAgICAgIH07XG4gICAgICByLnNpZ25hdHVyZXMucHVzaChvKTtcbiAgICB9KSwgZS5pbnN0cnVjdGlvbnMuZm9yRWFjaCgobikgPT4ge1xuICAgICAgY29uc3QgaSA9IG4uYWNjb3VudHMubWFwKChvKSA9PiB7XG4gICAgICAgIGNvbnN0IGEgPSBlLmFjY291bnRLZXlzW29dO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHB1YmtleTogYSxcbiAgICAgICAgICBpc1NpZ25lcjogci5zaWduYXR1cmVzLnNvbWUoKGwpID0+IGwucHVibGljS2V5LnRvU3RyaW5nKCkgPT09IGEudG9TdHJpbmcoKSkgfHwgZS5pc0FjY291bnRTaWduZXIobyksXG4gICAgICAgICAgaXNXcml0YWJsZTogZS5pc0FjY291bnRXcml0YWJsZShvKVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgICByLmluc3RydWN0aW9ucy5wdXNoKG5ldyBVZCh7XG4gICAgICAgIGtleXM6IGksXG4gICAgICAgIHByb2dyYW1JZDogZS5hY2NvdW50S2V5c1tuLnByb2dyYW1JZEluZGV4XSxcbiAgICAgICAgZGF0YTogYXIuZGVjb2RlKG4uZGF0YSlcbiAgICAgIH0pKTtcbiAgICB9KSwgci5fbWVzc2FnZSA9IGUsIHIuX2pzb24gPSByLnRvSlNPTigpLCByO1xuICB9XG59XG5jbGFzcyBpdSB7XG4gIGdldCB2ZXJzaW9uKCkge1xuICAgIHJldHVybiB0aGlzLm1lc3NhZ2UudmVyc2lvbjtcbiAgfVxuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgaWYgKHRoaXMuc2lnbmF0dXJlcyA9IHZvaWQgMCwgdGhpcy5tZXNzYWdlID0gdm9pZCAwLCB0ICE9PSB2b2lkIDApXG4gICAgICBLdCh0Lmxlbmd0aCA9PT0gZS5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLCBcIkV4cGVjdGVkIHNpZ25hdHVyZXMgbGVuZ3RoIHRvIGJlIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgcmVxdWlyZWQgc2lnbmF0dXJlc1wiKSwgdGhpcy5zaWduYXR1cmVzID0gdDtcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IHIgPSBbXTtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgZS5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzOyBuKyspXG4gICAgICAgIHIucHVzaChuZXcgVWludDhBcnJheShHbykpO1xuICAgICAgdGhpcy5zaWduYXR1cmVzID0gcjtcbiAgICB9XG4gICAgdGhpcy5tZXNzYWdlID0gZTtcbiAgfVxuICBzZXJpYWxpemUoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubWVzc2FnZS5zZXJpYWxpemUoKSwgdCA9IEFycmF5KCk7XG4gICAgeHIodCwgdGhpcy5zaWduYXR1cmVzLmxlbmd0aCk7XG4gICAgY29uc3QgciA9IHouc3RydWN0KFt6LmJsb2IodC5sZW5ndGgsIFwiZW5jb2RlZFNpZ25hdHVyZXNMZW5ndGhcIiksIHouc2VxKGRFKCksIHRoaXMuc2lnbmF0dXJlcy5sZW5ndGgsIFwic2lnbmF0dXJlc1wiKSwgei5ibG9iKGUubGVuZ3RoLCBcInNlcmlhbGl6ZWRNZXNzYWdlXCIpXSksIG4gPSBuZXcgVWludDhBcnJheSgyMDQ4KSwgaSA9IHIuZW5jb2RlKHtcbiAgICAgIGVuY29kZWRTaWduYXR1cmVzTGVuZ3RoOiBuZXcgVWludDhBcnJheSh0KSxcbiAgICAgIHNpZ25hdHVyZXM6IHRoaXMuc2lnbmF0dXJlcyxcbiAgICAgIHNlcmlhbGl6ZWRNZXNzYWdlOiBlXG4gICAgfSwgbik7XG4gICAgcmV0dXJuIG4uc2xpY2UoMCwgaSk7XG4gIH1cbiAgc3RhdGljIGRlc2VyaWFsaXplKGUpIHtcbiAgICBsZXQgdCA9IFsuLi5lXTtcbiAgICBjb25zdCByID0gW10sIG4gPSBFcih0KTtcbiAgICBmb3IgKGxldCBvID0gMDsgbyA8IG47IG8rKylcbiAgICAgIHIucHVzaChuZXcgVWludDhBcnJheShTcih0LCAwLCBHbykpKTtcbiAgICBjb25zdCBpID0gbnUuZGVzZXJpYWxpemUobmV3IFVpbnQ4QXJyYXkodCkpO1xuICAgIHJldHVybiBuZXcgaXUoaSwgcik7XG4gIH1cbiAgc2lnbihlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMubWVzc2FnZS5zZXJpYWxpemUoKSwgciA9IHRoaXMubWVzc2FnZS5zdGF0aWNBY2NvdW50S2V5cy5zbGljZSgwLCB0aGlzLm1lc3NhZ2UuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyk7XG4gICAgZm9yIChjb25zdCBuIG9mIGUpIHtcbiAgICAgIGNvbnN0IGkgPSByLmZpbmRJbmRleCgobykgPT4gby5lcXVhbHMobi5wdWJsaWNLZXkpKTtcbiAgICAgIEt0KGkgPj0gMCwgYENhbm5vdCBzaWduIHdpdGggbm9uIHNpZ25lciBrZXkgJHtuLnB1YmxpY0tleS50b0Jhc2U1OCgpfWApLCB0aGlzLnNpZ25hdHVyZXNbaV0gPSBPMCh0LCBuLnNlY3JldEtleSk7XG4gICAgfVxuICB9XG4gIGFkZFNpZ25hdHVyZShlLCB0KSB7XG4gICAgS3QodC5ieXRlTGVuZ3RoID09PSA2NCwgXCJTaWduYXR1cmUgbXVzdCBiZSA2NCBieXRlcyBsb25nXCIpO1xuICAgIGNvbnN0IG4gPSB0aGlzLm1lc3NhZ2Uuc3RhdGljQWNjb3VudEtleXMuc2xpY2UoMCwgdGhpcy5tZXNzYWdlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMpLmZpbmRJbmRleCgoaSkgPT4gaS5lcXVhbHMoZSkpO1xuICAgIEt0KG4gPj0gMCwgYENhbiBub3QgYWRkIHNpZ25hdHVyZTsgXFxgJHtlLnRvQmFzZTU4KCl9XFxgIGlzIG5vdCByZXF1aXJlZCB0byBzaWduIHRoaXMgdHJhbnNhY3Rpb25gKSwgdGhpcy5zaWduYXR1cmVzW25dID0gdDtcbiAgfVxufVxubmV3IE9lKFwiU3lzdmFyQzFvY2sxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbm5ldyBPZShcIlN5c3ZhckVwb2NoU2NoZWR1MWUxMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5uZXcgT2UoXCJTeXN2YXIxbnN0cnVjdGlvbnMxMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xubmV3IE9lKFwiU3lzdmFyUmVjZW50QjFvY2tIYXNoZXMxMTExMTExMTExMTExMTExMTExMVwiKTtcbm5ldyBPZShcIlN5c3ZhclJlbnQxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5uZXcgT2UoXCJTeXN2YXJSZXdhcmRzMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xubmV3IE9lKFwiU3lzdmFyUzFvdEhhc2hlczExMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbm5ldyBPZShcIlN5c3ZhclMxb3RIaXN0b3J5MTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5uZXcgT2UoXCJTeXN2YXJTdGFrZUhpc3RvcnkxMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xuY29uc3QgeUUgPSB6Lm51NjQoXCJsYW1wb3J0c1BlclNpZ25hdHVyZVwiKSwgdkUgPSB6LnN0cnVjdChbei51MzIoXCJ2ZXJzaW9uXCIpLCB6LnUzMihcInN0YXRlXCIpLCBXZShcImF1dGhvcml6ZWRQdWJrZXlcIiksIFdlKFwibm9uY2VcIiksIHouc3RydWN0KFt5RV0sIFwiZmVlQ2FsY3VsYXRvclwiKV0pO1xudkUuc3BhbjtcbmZ1bmN0aW9uIE9uKHMpIHtcbiAgY29uc3QgZSA9IHouYmxvYig4LCBzKSwgdCA9IGUuZGVjb2RlLmJpbmQoZSksIHIgPSBlLmVuY29kZS5iaW5kKGUpLCBuID0gZSwgaSA9IHB2KCk7XG4gIHJldHVybiBuLmRlY29kZSA9IChvLCBhKSA9PiB7XG4gICAgY29uc3QgbCA9IHQobywgYSk7XG4gICAgcmV0dXJuIGkuZGVjb2RlKGwpO1xuICB9LCBuLmVuY29kZSA9IChvLCBhLCBsKSA9PiB7XG4gICAgY29uc3QgYyA9IGkuZW5jb2RlKG8pO1xuICAgIHJldHVybiByKGMsIGEsIGwpO1xuICB9LCBuO1xufVxuT2JqZWN0LmZyZWV6ZSh7XG4gIENyZWF0ZToge1xuICAgIGluZGV4OiAwLFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIiksIHoubnM2NChcImxhbXBvcnRzXCIpLCB6Lm5zNjQoXCJzcGFjZVwiKSwgV2UoXCJwcm9ncmFtSWRcIildKVxuICB9LFxuICBBc3NpZ246IHtcbiAgICBpbmRleDogMSxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBXZShcInByb2dyYW1JZFwiKV0pXG4gIH0sXG4gIFRyYW5zZmVyOiB7XG4gICAgaW5kZXg6IDIsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgT24oXCJsYW1wb3J0c1wiKV0pXG4gIH0sXG4gIENyZWF0ZVdpdGhTZWVkOiB7XG4gICAgaW5kZXg6IDMsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgV2UoXCJiYXNlXCIpLCB4bihcInNlZWRcIiksIHoubnM2NChcImxhbXBvcnRzXCIpLCB6Lm5zNjQoXCJzcGFjZVwiKSwgV2UoXCJwcm9ncmFtSWRcIildKVxuICB9LFxuICBBZHZhbmNlTm9uY2VBY2NvdW50OiB7XG4gICAgaW5kZXg6IDQsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKV0pXG4gIH0sXG4gIFdpdGhkcmF3Tm9uY2VBY2NvdW50OiB7XG4gICAgaW5kZXg6IDUsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgei5uczY0KFwibGFtcG9ydHNcIildKVxuICB9LFxuICBJbml0aWFsaXplTm9uY2VBY2NvdW50OiB7XG4gICAgaW5kZXg6IDYsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgV2UoXCJhdXRob3JpemVkXCIpXSlcbiAgfSxcbiAgQXV0aG9yaXplTm9uY2VBY2NvdW50OiB7XG4gICAgaW5kZXg6IDcsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgV2UoXCJhdXRob3JpemVkXCIpXSlcbiAgfSxcbiAgQWxsb2NhdGU6IHtcbiAgICBpbmRleDogOCxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCB6Lm5zNjQoXCJzcGFjZVwiKV0pXG4gIH0sXG4gIEFsbG9jYXRlV2l0aFNlZWQ6IHtcbiAgICBpbmRleDogOSxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBXZShcImJhc2VcIiksIHhuKFwic2VlZFwiKSwgei5uczY0KFwic3BhY2VcIiksIFdlKFwicHJvZ3JhbUlkXCIpXSlcbiAgfSxcbiAgQXNzaWduV2l0aFNlZWQ6IHtcbiAgICBpbmRleDogMTAsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgV2UoXCJiYXNlXCIpLCB4bihcInNlZWRcIiksIFdlKFwicHJvZ3JhbUlkXCIpXSlcbiAgfSxcbiAgVHJhbnNmZXJXaXRoU2VlZDoge1xuICAgIGluZGV4OiAxMSxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBPbihcImxhbXBvcnRzXCIpLCB4bihcInNlZWRcIiksIFdlKFwicHJvZ3JhbUlkXCIpXSlcbiAgfSxcbiAgVXBncmFkZU5vbmNlQWNjb3VudDoge1xuICAgIGluZGV4OiAxMixcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpXSlcbiAgfVxufSk7XG5uZXcgT2UoXCIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbm5ldyBPZShcIkJQRkxvYWRlcjIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG56LnN0cnVjdChbXG4gIHoudTMyKFwidHlwZUluZGV4XCIpLFxuICBPbihcImRlYWN0aXZhdGlvblNsb3RcIiksXG4gIHoubnU2NChcImxhc3RFeHRlbmRlZFNsb3RcIiksXG4gIHoudTgoXCJsYXN0RXh0ZW5kZWRTdGFydEluZGV4XCIpLFxuICB6LnU4KCksXG4gIC8vIG9wdGlvblxuICB6LnNlcShXZSgpLCB6Lm9mZnNldCh6LnU4KCksIC0xKSwgXCJhdXRob3JpdHlcIilcbl0pO1xuY29uc3QgU3QgPSBEaShRYyhPZSksIGNlKCksIChzKSA9PiBuZXcgT2UocykpLCBOMCA9IGV1KFtjZSgpLCBwdChcImJhc2U2NFwiKV0pLCBvdSA9IERpKFFjKEhlLkJ1ZmZlciksIE4wLCAocykgPT4gSGUuQnVmZmVyLmZyb20oc1swXSwgXCJiYXNlNjRcIikpO1xuZnVuY3Rpb24gVTAocykge1xuICByZXR1cm4gdXIoW29lKHtcbiAgICBqc29ucnBjOiBwdChcIjIuMFwiKSxcbiAgICBpZDogY2UoKSxcbiAgICByZXN1bHQ6IHNcbiAgfSksIG9lKHtcbiAgICBqc29ucnBjOiBwdChcIjIuMFwiKSxcbiAgICBpZDogY2UoKSxcbiAgICBlcnJvcjogb2Uoe1xuICAgICAgY29kZTogR24oKSxcbiAgICAgIG1lc3NhZ2U6IGNlKCksXG4gICAgICBkYXRhOiBTZShidigpKVxuICAgIH0pXG4gIH0pXSk7XG59XG5jb25zdCBFRSA9IFUwKEduKCkpO1xuZnVuY3Rpb24gbHQocykge1xuICByZXR1cm4gRGkoVTAocyksIEVFLCAoZSkgPT4gXCJlcnJvclwiIGluIGUgPyBlIDoge1xuICAgIC4uLmUsXG4gICAgcmVzdWx0OiB0aShlLnJlc3VsdCwgcylcbiAgfSk7XG59XG5mdW5jdGlvbiBGcihzKSB7XG4gIHJldHVybiBsdChvZSh7XG4gICAgY29udGV4dDogb2Uoe1xuICAgICAgc2xvdDogdGUoKVxuICAgIH0pLFxuICAgIHZhbHVlOiBzXG4gIH0pKTtcbn1cbmZ1bmN0aW9uIGdhKHMpIHtcbiAgcmV0dXJuIG9lKHtcbiAgICBjb250ZXh0OiBvZSh7XG4gICAgICBzbG90OiB0ZSgpXG4gICAgfSksXG4gICAgdmFsdWU6IHNcbiAgfSk7XG59XG5jb25zdCB4RSA9IG9lKHtcbiAgZm91bmRhdGlvbjogdGUoKSxcbiAgZm91bmRhdGlvblRlcm06IHRlKCksXG4gIGluaXRpYWw6IHRlKCksXG4gIHRhcGVyOiB0ZSgpLFxuICB0ZXJtaW5hbDogdGUoKVxufSk7XG5sdChmZShnZShvZSh7XG4gIGVwb2NoOiB0ZSgpLFxuICBlZmZlY3RpdmVTbG90OiB0ZSgpLFxuICBhbW91bnQ6IHRlKCksXG4gIHBvc3RCYWxhbmNlOiB0ZSgpLFxuICBjb21taXNzaW9uOiBTZShnZSh0ZSgpKSlcbn0pKSkpO1xuY29uc3QgU0UgPSBmZShvZSh7XG4gIHNsb3Q6IHRlKCksXG4gIHByaW9yaXRpemF0aW9uRmVlOiB0ZSgpXG59KSksIGJFID0gb2Uoe1xuICB0b3RhbDogdGUoKSxcbiAgdmFsaWRhdG9yOiB0ZSgpLFxuICBmb3VuZGF0aW9uOiB0ZSgpLFxuICBlcG9jaDogdGUoKVxufSksIFRFID0gb2Uoe1xuICBlcG9jaDogdGUoKSxcbiAgc2xvdEluZGV4OiB0ZSgpLFxuICBzbG90c0luRXBvY2g6IHRlKCksXG4gIGFic29sdXRlU2xvdDogdGUoKSxcbiAgYmxvY2tIZWlnaHQ6IFNlKHRlKCkpLFxuICB0cmFuc2FjdGlvbkNvdW50OiBTZSh0ZSgpKVxufSksIHdFID0gb2Uoe1xuICBzbG90c1BlckVwb2NoOiB0ZSgpLFxuICBsZWFkZXJTY2hlZHVsZVNsb3RPZmZzZXQ6IHRlKCksXG4gIHdhcm11cDogWHIoKSxcbiAgZmlyc3ROb3JtYWxFcG9jaDogdGUoKSxcbiAgZmlyc3ROb3JtYWxTbG90OiB0ZSgpXG59KSwgQUUgPSBUMChjZSgpLCBmZSh0ZSgpKSksIHJuID0gZ2UodXIoW29lKHt9KSwgY2UoKV0pKSwgSUUgPSBvZSh7XG4gIGVycjogcm5cbn0pLCBfRSA9IHB0KFwicmVjZWl2ZWRTaWduYXR1cmVcIik7XG5vZSh7XG4gIFwic29sYW5hLWNvcmVcIjogY2UoKSxcbiAgXCJmZWF0dXJlLXNldFwiOiBTZSh0ZSgpKVxufSk7XG5jb25zdCBSRSA9IG9lKHtcbiAgcHJvZ3JhbTogY2UoKSxcbiAgcHJvZ3JhbUlkOiBTdCxcbiAgcGFyc2VkOiBHbigpXG59KSwgTEUgPSBvZSh7XG4gIHByb2dyYW1JZDogU3QsXG4gIGFjY291bnRzOiBmZShTdCksXG4gIGRhdGE6IGNlKClcbn0pO1xuRnIob2Uoe1xuICBlcnI6IGdlKHVyKFtvZSh7fSksIGNlKCldKSksXG4gIGxvZ3M6IGdlKGZlKGNlKCkpKSxcbiAgYWNjb3VudHM6IFNlKGdlKGZlKGdlKG9lKHtcbiAgICBleGVjdXRhYmxlOiBYcigpLFxuICAgIG93bmVyOiBjZSgpLFxuICAgIGxhbXBvcnRzOiB0ZSgpLFxuICAgIGRhdGE6IGZlKGNlKCkpLFxuICAgIHJlbnRFcG9jaDogU2UodGUoKSlcbiAgfSkpKSkpLFxuICB1bml0c0NvbnN1bWVkOiBTZSh0ZSgpKSxcbiAgcmV0dXJuRGF0YTogU2UoZ2Uob2Uoe1xuICAgIHByb2dyYW1JZDogY2UoKSxcbiAgICBkYXRhOiBldShbY2UoKSwgcHQoXCJiYXNlNjRcIildKVxuICB9KSkpLFxuICBpbm5lckluc3RydWN0aW9uczogU2UoZ2UoZmUob2Uoe1xuICAgIGluZGV4OiB0ZSgpLFxuICAgIGluc3RydWN0aW9uczogZmUodXIoW1JFLCBMRV0pKVxuICB9KSkpKVxufSkpO1xuRnIob2Uoe1xuICBieUlkZW50aXR5OiBUMChjZSgpLCBmZSh0ZSgpKSksXG4gIHJhbmdlOiBvZSh7XG4gICAgZmlyc3RTbG90OiB0ZSgpLFxuICAgIGxhc3RTbG90OiB0ZSgpXG4gIH0pXG59KSk7XG5sdCh4RSk7XG5sdChiRSk7XG5sdChTRSk7XG5sdChURSk7XG5sdCh3RSk7XG5sdChBRSk7XG5sdCh0ZSgpKTtcbkZyKG9lKHtcbiAgdG90YWw6IHRlKCksXG4gIGNpcmN1bGF0aW5nOiB0ZSgpLFxuICBub25DaXJjdWxhdGluZzogdGUoKSxcbiAgbm9uQ2lyY3VsYXRpbmdBY2NvdW50czogZmUoU3QpXG59KSk7XG5jb25zdCBDRSA9IG9lKHtcbiAgYW1vdW50OiBjZSgpLFxuICB1aUFtb3VudDogZ2UodGUoKSksXG4gIGRlY2ltYWxzOiB0ZSgpLFxuICB1aUFtb3VudFN0cmluZzogU2UoY2UoKSlcbn0pO1xuRnIoZmUob2Uoe1xuICBhZGRyZXNzOiBTdCxcbiAgYW1vdW50OiBjZSgpLFxuICB1aUFtb3VudDogZ2UodGUoKSksXG4gIGRlY2ltYWxzOiB0ZSgpLFxuICB1aUFtb3VudFN0cmluZzogU2UoY2UoKSlcbn0pKSk7XG5GcihmZShvZSh7XG4gIHB1YmtleTogU3QsXG4gIGFjY291bnQ6IG9lKHtcbiAgICBleGVjdXRhYmxlOiBYcigpLFxuICAgIG93bmVyOiBTdCxcbiAgICBsYW1wb3J0czogdGUoKSxcbiAgICBkYXRhOiBvdSxcbiAgICByZW50RXBvY2g6IHRlKClcbiAgfSlcbn0pKSk7XG5jb25zdCByYyA9IG9lKHtcbiAgcHJvZ3JhbTogY2UoKSxcbiAgcGFyc2VkOiBHbigpLFxuICBzcGFjZTogdGUoKVxufSk7XG5GcihmZShvZSh7XG4gIHB1YmtleTogU3QsXG4gIGFjY291bnQ6IG9lKHtcbiAgICBleGVjdXRhYmxlOiBYcigpLFxuICAgIG93bmVyOiBTdCxcbiAgICBsYW1wb3J0czogdGUoKSxcbiAgICBkYXRhOiByYyxcbiAgICByZW50RXBvY2g6IHRlKClcbiAgfSlcbn0pKSk7XG5GcihmZShvZSh7XG4gIGxhbXBvcnRzOiB0ZSgpLFxuICBhZGRyZXNzOiBTdFxufSkpKTtcbmNvbnN0IGF1ID0gb2Uoe1xuICBleGVjdXRhYmxlOiBYcigpLFxuICBvd25lcjogU3QsXG4gIGxhbXBvcnRzOiB0ZSgpLFxuICBkYXRhOiBvdSxcbiAgcmVudEVwb2NoOiB0ZSgpXG59KTtcbm9lKHtcbiAgcHVia2V5OiBTdCxcbiAgYWNjb3VudDogYXVcbn0pO1xuY29uc3Qga0UgPSBEaSh1cihbUWMoSGUuQnVmZmVyKSwgcmNdKSwgdXIoW04wLCByY10pLCAocykgPT4gQXJyYXkuaXNBcnJheShzKSA/IHRpKHMsIG91KSA6IHMpLCBERSA9IG9lKHtcbiAgZXhlY3V0YWJsZTogWHIoKSxcbiAgb3duZXI6IFN0LFxuICBsYW1wb3J0czogdGUoKSxcbiAgZGF0YToga0UsXG4gIHJlbnRFcG9jaDogdGUoKVxufSk7XG5vZSh7XG4gIHB1YmtleTogU3QsXG4gIGFjY291bnQ6IERFXG59KTtcbm9lKHtcbiAgc3RhdGU6IHVyKFtwdChcImFjdGl2ZVwiKSwgcHQoXCJpbmFjdGl2ZVwiKSwgcHQoXCJhY3RpdmF0aW5nXCIpLCBwdChcImRlYWN0aXZhdGluZ1wiKV0pLFxuICBhY3RpdmU6IHRlKCksXG4gIGluYWN0aXZlOiB0ZSgpXG59KTtcbmx0KGZlKG9lKHtcbiAgc2lnbmF0dXJlOiBjZSgpLFxuICBzbG90OiB0ZSgpLFxuICBlcnI6IHJuLFxuICBtZW1vOiBnZShjZSgpKSxcbiAgYmxvY2tUaW1lOiBTZShnZSh0ZSgpKSlcbn0pKSk7XG5sdChmZShvZSh7XG4gIHNpZ25hdHVyZTogY2UoKSxcbiAgc2xvdDogdGUoKSxcbiAgZXJyOiBybixcbiAgbWVtbzogZ2UoY2UoKSksXG4gIGJsb2NrVGltZTogU2UoZ2UodGUoKSkpXG59KSkpO1xub2Uoe1xuICBzdWJzY3JpcHRpb246IHRlKCksXG4gIHJlc3VsdDogZ2EoYXUpXG59KTtcbmNvbnN0IFBFID0gb2Uoe1xuICBwdWJrZXk6IFN0LFxuICBhY2NvdW50OiBhdVxufSk7XG5vZSh7XG4gIHN1YnNjcmlwdGlvbjogdGUoKSxcbiAgcmVzdWx0OiBnYShQRSlcbn0pO1xuY29uc3QgTUUgPSBvZSh7XG4gIHBhcmVudDogdGUoKSxcbiAgc2xvdDogdGUoKSxcbiAgcm9vdDogdGUoKVxufSk7XG5vZSh7XG4gIHN1YnNjcmlwdGlvbjogdGUoKSxcbiAgcmVzdWx0OiBNRVxufSk7XG5jb25zdCBPRSA9IHVyKFtvZSh7XG4gIHR5cGU6IHVyKFtwdChcImZpcnN0U2hyZWRSZWNlaXZlZFwiKSwgcHQoXCJjb21wbGV0ZWRcIiksIHB0KFwib3B0aW1pc3RpY0NvbmZpcm1hdGlvblwiKSwgcHQoXCJyb290XCIpXSksXG4gIHNsb3Q6IHRlKCksXG4gIHRpbWVzdGFtcDogdGUoKVxufSksIG9lKHtcbiAgdHlwZTogcHQoXCJjcmVhdGVkQmFua1wiKSxcbiAgcGFyZW50OiB0ZSgpLFxuICBzbG90OiB0ZSgpLFxuICB0aW1lc3RhbXA6IHRlKClcbn0pLCBvZSh7XG4gIHR5cGU6IHB0KFwiZnJvemVuXCIpLFxuICBzbG90OiB0ZSgpLFxuICB0aW1lc3RhbXA6IHRlKCksXG4gIHN0YXRzOiBvZSh7XG4gICAgbnVtVHJhbnNhY3Rpb25FbnRyaWVzOiB0ZSgpLFxuICAgIG51bVN1Y2Nlc3NmdWxUcmFuc2FjdGlvbnM6IHRlKCksXG4gICAgbnVtRmFpbGVkVHJhbnNhY3Rpb25zOiB0ZSgpLFxuICAgIG1heFRyYW5zYWN0aW9uc1BlckVudHJ5OiB0ZSgpXG4gIH0pXG59KSwgb2Uoe1xuICB0eXBlOiBwdChcImRlYWRcIiksXG4gIHNsb3Q6IHRlKCksXG4gIHRpbWVzdGFtcDogdGUoKSxcbiAgZXJyOiBjZSgpXG59KV0pO1xub2Uoe1xuICBzdWJzY3JpcHRpb246IHRlKCksXG4gIHJlc3VsdDogT0Vcbn0pO1xub2Uoe1xuICBzdWJzY3JpcHRpb246IHRlKCksXG4gIHJlc3VsdDogZ2EodXIoW0lFLCBfRV0pKVxufSk7XG5vZSh7XG4gIHN1YnNjcmlwdGlvbjogdGUoKSxcbiAgcmVzdWx0OiB0ZSgpXG59KTtcbm9lKHtcbiAgcHVia2V5OiBjZSgpLFxuICBnb3NzaXA6IGdlKGNlKCkpLFxuICB0cHU6IGdlKGNlKCkpLFxuICBycGM6IGdlKGNlKCkpLFxuICB2ZXJzaW9uOiBnZShjZSgpKVxufSk7XG5jb25zdCAkZCA9IG9lKHtcbiAgdm90ZVB1YmtleTogY2UoKSxcbiAgbm9kZVB1YmtleTogY2UoKSxcbiAgYWN0aXZhdGVkU3Rha2U6IHRlKCksXG4gIGVwb2NoVm90ZUFjY291bnQ6IFhyKCksXG4gIGVwb2NoQ3JlZGl0czogZmUoZXUoW3RlKCksIHRlKCksIHRlKCldKSksXG4gIGNvbW1pc3Npb246IHRlKCksXG4gIGxhc3RWb3RlOiB0ZSgpLFxuICByb290U2xvdDogZ2UodGUoKSlcbn0pO1xubHQob2Uoe1xuICBjdXJyZW50OiBmZSgkZCksXG4gIGRlbGlucXVlbnQ6IGZlKCRkKVxufSkpO1xuY29uc3QgQkUgPSB1cihbcHQoXCJwcm9jZXNzZWRcIiksIHB0KFwiY29uZmlybWVkXCIpLCBwdChcImZpbmFsaXplZFwiKV0pLCBGRSA9IG9lKHtcbiAgc2xvdDogdGUoKSxcbiAgY29uZmlybWF0aW9uczogZ2UodGUoKSksXG4gIGVycjogcm4sXG4gIGNvbmZpcm1hdGlvblN0YXR1czogU2UoQkUpXG59KTtcbkZyKGZlKGdlKEZFKSkpO1xubHQodGUoKSk7XG5jb25zdCAkMCA9IG9lKHtcbiAgYWNjb3VudEtleTogU3QsXG4gIHdyaXRhYmxlSW5kZXhlczogZmUodGUoKSksXG4gIHJlYWRvbmx5SW5kZXhlczogZmUodGUoKSlcbn0pLCBsdSA9IG9lKHtcbiAgc2lnbmF0dXJlczogZmUoY2UoKSksXG4gIG1lc3NhZ2U6IG9lKHtcbiAgICBhY2NvdW50S2V5czogZmUoY2UoKSksXG4gICAgaGVhZGVyOiBvZSh7XG4gICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IHRlKCksXG4gICAgICBudW1SZWFkb25seVNpZ25lZEFjY291bnRzOiB0ZSgpLFxuICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiB0ZSgpXG4gICAgfSksXG4gICAgaW5zdHJ1Y3Rpb25zOiBmZShvZSh7XG4gICAgICBhY2NvdW50czogZmUodGUoKSksXG4gICAgICBkYXRhOiBjZSgpLFxuICAgICAgcHJvZ3JhbUlkSW5kZXg6IHRlKClcbiAgICB9KSksXG4gICAgcmVjZW50QmxvY2toYXNoOiBjZSgpLFxuICAgIGFkZHJlc3NUYWJsZUxvb2t1cHM6IFNlKGZlKCQwKSlcbiAgfSlcbn0pLCBHMCA9IG9lKHtcbiAgcHVia2V5OiBTdCxcbiAgc2lnbmVyOiBYcigpLFxuICB3cml0YWJsZTogWHIoKSxcbiAgc291cmNlOiBTZSh1cihbcHQoXCJ0cmFuc2FjdGlvblwiKSwgcHQoXCJsb29rdXBUYWJsZVwiKV0pKVxufSksIFYwID0gb2Uoe1xuICBhY2NvdW50S2V5czogZmUoRzApLFxuICBzaWduYXR1cmVzOiBmZShjZSgpKVxufSksIGowID0gb2Uoe1xuICBwYXJzZWQ6IEduKCksXG4gIHByb2dyYW06IGNlKCksXG4gIHByb2dyYW1JZDogU3Rcbn0pLCBLMCA9IG9lKHtcbiAgYWNjb3VudHM6IGZlKFN0KSxcbiAgZGF0YTogY2UoKSxcbiAgcHJvZ3JhbUlkOiBTdFxufSksIE5FID0gdXIoW0swLCBqMF0pLCBVRSA9IHVyKFtvZSh7XG4gIHBhcnNlZDogR24oKSxcbiAgcHJvZ3JhbTogY2UoKSxcbiAgcHJvZ3JhbUlkOiBjZSgpXG59KSwgb2Uoe1xuICBhY2NvdW50czogZmUoY2UoKSksXG4gIGRhdGE6IGNlKCksXG4gIHByb2dyYW1JZDogY2UoKVxufSldKSwgSDAgPSBEaShORSwgVUUsIChzKSA9PiBcImFjY291bnRzXCIgaW4gcyA/IHRpKHMsIEswKSA6IHRpKHMsIGowKSksIHEwID0gb2Uoe1xuICBzaWduYXR1cmVzOiBmZShjZSgpKSxcbiAgbWVzc2FnZTogb2Uoe1xuICAgIGFjY291bnRLZXlzOiBmZShHMCksXG4gICAgaW5zdHJ1Y3Rpb25zOiBmZShIMCksXG4gICAgcmVjZW50QmxvY2toYXNoOiBjZSgpLFxuICAgIGFkZHJlc3NUYWJsZUxvb2t1cHM6IFNlKGdlKGZlKCQwKSkpXG4gIH0pXG59KSwgSG8gPSBvZSh7XG4gIGFjY291bnRJbmRleDogdGUoKSxcbiAgbWludDogY2UoKSxcbiAgb3duZXI6IFNlKGNlKCkpLFxuICBwcm9ncmFtSWQ6IFNlKGNlKCkpLFxuICB1aVRva2VuQW1vdW50OiBDRVxufSksIFcwID0gb2Uoe1xuICB3cml0YWJsZTogZmUoU3QpLFxuICByZWFkb25seTogZmUoU3QpXG59KSwgcGEgPSBvZSh7XG4gIGVycjogcm4sXG4gIGZlZTogdGUoKSxcbiAgaW5uZXJJbnN0cnVjdGlvbnM6IFNlKGdlKGZlKG9lKHtcbiAgICBpbmRleDogdGUoKSxcbiAgICBpbnN0cnVjdGlvbnM6IGZlKG9lKHtcbiAgICAgIGFjY291bnRzOiBmZSh0ZSgpKSxcbiAgICAgIGRhdGE6IGNlKCksXG4gICAgICBwcm9ncmFtSWRJbmRleDogdGUoKVxuICAgIH0pKVxuICB9KSkpKSxcbiAgcHJlQmFsYW5jZXM6IGZlKHRlKCkpLFxuICBwb3N0QmFsYW5jZXM6IGZlKHRlKCkpLFxuICBsb2dNZXNzYWdlczogU2UoZ2UoZmUoY2UoKSkpKSxcbiAgcHJlVG9rZW5CYWxhbmNlczogU2UoZ2UoZmUoSG8pKSksXG4gIHBvc3RUb2tlbkJhbGFuY2VzOiBTZShnZShmZShIbykpKSxcbiAgbG9hZGVkQWRkcmVzc2VzOiBTZShXMCksXG4gIGNvbXB1dGVVbml0c0NvbnN1bWVkOiBTZSh0ZSgpKSxcbiAgY29zdFVuaXRzOiBTZSh0ZSgpKVxufSksIGN1ID0gb2Uoe1xuICBlcnI6IHJuLFxuICBmZWU6IHRlKCksXG4gIGlubmVySW5zdHJ1Y3Rpb25zOiBTZShnZShmZShvZSh7XG4gICAgaW5kZXg6IHRlKCksXG4gICAgaW5zdHJ1Y3Rpb25zOiBmZShIMClcbiAgfSkpKSksXG4gIHByZUJhbGFuY2VzOiBmZSh0ZSgpKSxcbiAgcG9zdEJhbGFuY2VzOiBmZSh0ZSgpKSxcbiAgbG9nTWVzc2FnZXM6IFNlKGdlKGZlKGNlKCkpKSksXG4gIHByZVRva2VuQmFsYW5jZXM6IFNlKGdlKGZlKEhvKSkpLFxuICBwb3N0VG9rZW5CYWxhbmNlczogU2UoZ2UoZmUoSG8pKSksXG4gIGxvYWRlZEFkZHJlc3NlczogU2UoVzApLFxuICBjb21wdXRlVW5pdHNDb25zdW1lZDogU2UodGUoKSksXG4gIGNvc3RVbml0czogU2UodGUoKSlcbn0pLCBWbiA9IHVyKFtwdCgwKSwgcHQoXCJsZWdhY3lcIildKSwgc24gPSBvZSh7XG4gIHB1YmtleTogY2UoKSxcbiAgbGFtcG9ydHM6IHRlKCksXG4gIHBvc3RCYWxhbmNlOiBnZSh0ZSgpKSxcbiAgcmV3YXJkVHlwZTogZ2UoY2UoKSksXG4gIGNvbW1pc3Npb246IFNlKGdlKHRlKCkpKVxufSk7XG5sdChnZShvZSh7XG4gIGJsb2NraGFzaDogY2UoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IGNlKCksXG4gIHBhcmVudFNsb3Q6IHRlKCksXG4gIHRyYW5zYWN0aW9uczogZmUob2Uoe1xuICAgIHRyYW5zYWN0aW9uOiBsdSxcbiAgICBtZXRhOiBnZShwYSksXG4gICAgdmVyc2lvbjogU2UoVm4pXG4gIH0pKSxcbiAgcmV3YXJkczogU2UoZmUoc24pKSxcbiAgYmxvY2tUaW1lOiBnZSh0ZSgpKSxcbiAgYmxvY2tIZWlnaHQ6IGdlKHRlKCkpXG59KSkpO1xubHQoZ2Uob2Uoe1xuICBibG9ja2hhc2g6IGNlKCksXG4gIHByZXZpb3VzQmxvY2toYXNoOiBjZSgpLFxuICBwYXJlbnRTbG90OiB0ZSgpLFxuICByZXdhcmRzOiBTZShmZShzbikpLFxuICBibG9ja1RpbWU6IGdlKHRlKCkpLFxuICBibG9ja0hlaWdodDogZ2UodGUoKSlcbn0pKSk7XG5sdChnZShvZSh7XG4gIGJsb2NraGFzaDogY2UoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IGNlKCksXG4gIHBhcmVudFNsb3Q6IHRlKCksXG4gIHRyYW5zYWN0aW9uczogZmUob2Uoe1xuICAgIHRyYW5zYWN0aW9uOiBWMCxcbiAgICBtZXRhOiBnZShwYSksXG4gICAgdmVyc2lvbjogU2UoVm4pXG4gIH0pKSxcbiAgcmV3YXJkczogU2UoZmUoc24pKSxcbiAgYmxvY2tUaW1lOiBnZSh0ZSgpKSxcbiAgYmxvY2tIZWlnaHQ6IGdlKHRlKCkpXG59KSkpO1xubHQoZ2Uob2Uoe1xuICBibG9ja2hhc2g6IGNlKCksXG4gIHByZXZpb3VzQmxvY2toYXNoOiBjZSgpLFxuICBwYXJlbnRTbG90OiB0ZSgpLFxuICB0cmFuc2FjdGlvbnM6IGZlKG9lKHtcbiAgICB0cmFuc2FjdGlvbjogcTAsXG4gICAgbWV0YTogZ2UoY3UpLFxuICAgIHZlcnNpb246IFNlKFZuKVxuICB9KSksXG4gIHJld2FyZHM6IFNlKGZlKHNuKSksXG4gIGJsb2NrVGltZTogZ2UodGUoKSksXG4gIGJsb2NrSGVpZ2h0OiBnZSh0ZSgpKVxufSkpKTtcbmx0KGdlKG9lKHtcbiAgYmxvY2toYXNoOiBjZSgpLFxuICBwcmV2aW91c0Jsb2NraGFzaDogY2UoKSxcbiAgcGFyZW50U2xvdDogdGUoKSxcbiAgdHJhbnNhY3Rpb25zOiBmZShvZSh7XG4gICAgdHJhbnNhY3Rpb246IFYwLFxuICAgIG1ldGE6IGdlKGN1KSxcbiAgICB2ZXJzaW9uOiBTZShWbilcbiAgfSkpLFxuICByZXdhcmRzOiBTZShmZShzbikpLFxuICBibG9ja1RpbWU6IGdlKHRlKCkpLFxuICBibG9ja0hlaWdodDogZ2UodGUoKSlcbn0pKSk7XG5sdChnZShvZSh7XG4gIGJsb2NraGFzaDogY2UoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IGNlKCksXG4gIHBhcmVudFNsb3Q6IHRlKCksXG4gIHJld2FyZHM6IFNlKGZlKHNuKSksXG4gIGJsb2NrVGltZTogZ2UodGUoKSksXG4gIGJsb2NrSGVpZ2h0OiBnZSh0ZSgpKVxufSkpKTtcbmx0KGdlKG9lKHtcbiAgYmxvY2toYXNoOiBjZSgpLFxuICBwcmV2aW91c0Jsb2NraGFzaDogY2UoKSxcbiAgcGFyZW50U2xvdDogdGUoKSxcbiAgdHJhbnNhY3Rpb25zOiBmZShvZSh7XG4gICAgdHJhbnNhY3Rpb246IGx1LFxuICAgIG1ldGE6IGdlKHBhKVxuICB9KSksXG4gIHJld2FyZHM6IFNlKGZlKHNuKSksXG4gIGJsb2NrVGltZTogZ2UodGUoKSlcbn0pKSk7XG5sdChnZShvZSh7XG4gIGJsb2NraGFzaDogY2UoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IGNlKCksXG4gIHBhcmVudFNsb3Q6IHRlKCksXG4gIHNpZ25hdHVyZXM6IGZlKGNlKCkpLFxuICBibG9ja1RpbWU6IGdlKHRlKCkpXG59KSkpO1xubHQoZ2Uob2Uoe1xuICBzbG90OiB0ZSgpLFxuICBtZXRhOiBnZShwYSksXG4gIGJsb2NrVGltZTogU2UoZ2UodGUoKSkpLFxuICB0cmFuc2FjdGlvbjogbHUsXG4gIHZlcnNpb246IFNlKFZuKVxufSkpKTtcbmx0KGdlKG9lKHtcbiAgc2xvdDogdGUoKSxcbiAgdHJhbnNhY3Rpb246IHEwLFxuICBtZXRhOiBnZShjdSksXG4gIGJsb2NrVGltZTogU2UoZ2UodGUoKSkpLFxuICB2ZXJzaW9uOiBTZShWbilcbn0pKSk7XG5GcihvZSh7XG4gIGJsb2NraGFzaDogY2UoKSxcbiAgbGFzdFZhbGlkQmxvY2tIZWlnaHQ6IHRlKClcbn0pKTtcbkZyKFhyKCkpO1xuY29uc3QgJEUgPSBvZSh7XG4gIHNsb3Q6IHRlKCksXG4gIG51bVRyYW5zYWN0aW9uczogdGUoKSxcbiAgbnVtU2xvdHM6IHRlKCksXG4gIHNhbXBsZVBlcmlvZFNlY3M6IHRlKClcbn0pO1xubHQoZmUoJEUpKTtcbkZyKGdlKG9lKHtcbiAgZmVlQ2FsY3VsYXRvcjogb2Uoe1xuICAgIGxhbXBvcnRzUGVyU2lnbmF0dXJlOiB0ZSgpXG4gIH0pXG59KSkpO1xubHQoY2UoKSk7XG5sdChjZSgpKTtcbmNvbnN0IEdFID0gb2Uoe1xuICBlcnI6IHJuLFxuICBsb2dzOiBmZShjZSgpKSxcbiAgc2lnbmF0dXJlOiBjZSgpXG59KTtcbm9lKHtcbiAgcmVzdWx0OiBnYShHRSksXG4gIHN1YnNjcmlwdGlvbjogdGUoKVxufSk7XG5PYmplY3QuZnJlZXplKHtcbiAgQ3JlYXRlTG9va3VwVGFibGU6IHtcbiAgICBpbmRleDogMCxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBPbihcInJlY2VudFNsb3RcIiksIHoudTgoXCJidW1wU2VlZFwiKV0pXG4gIH0sXG4gIEZyZWV6ZUxvb2t1cFRhYmxlOiB7XG4gICAgaW5kZXg6IDEsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKV0pXG4gIH0sXG4gIEV4dGVuZExvb2t1cFRhYmxlOiB7XG4gICAgaW5kZXg6IDIsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgT24oKSwgei5zZXEoV2UoKSwgei5vZmZzZXQoei51MzIoKSwgLTgpLCBcImFkZHJlc3Nlc1wiKV0pXG4gIH0sXG4gIERlYWN0aXZhdGVMb29rdXBUYWJsZToge1xuICAgIGluZGV4OiAzLFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIildKVxuICB9LFxuICBDbG9zZUxvb2t1cFRhYmxlOiB7XG4gICAgaW5kZXg6IDQsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKV0pXG4gIH1cbn0pO1xubmV3IE9lKFwiQWRkcmVzc0xvb2t1cFRhYjFlMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbk9iamVjdC5mcmVlemUoe1xuICBSZXF1ZXN0VW5pdHM6IHtcbiAgICBpbmRleDogMCxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnU4KFwiaW5zdHJ1Y3Rpb25cIiksIHoudTMyKFwidW5pdHNcIiksIHoudTMyKFwiYWRkaXRpb25hbEZlZVwiKV0pXG4gIH0sXG4gIFJlcXVlc3RIZWFwRnJhbWU6IHtcbiAgICBpbmRleDogMSxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnU4KFwiaW5zdHJ1Y3Rpb25cIiksIHoudTMyKFwiYnl0ZXNcIildKVxuICB9LFxuICBTZXRDb21wdXRlVW5pdExpbWl0OiB7XG4gICAgaW5kZXg6IDIsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51OChcImluc3RydWN0aW9uXCIpLCB6LnUzMihcInVuaXRzXCIpXSlcbiAgfSxcbiAgU2V0Q29tcHV0ZVVuaXRQcmljZToge1xuICAgIGluZGV4OiAzLFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTgoXCJpbnN0cnVjdGlvblwiKSwgT24oXCJtaWNyb0xhbXBvcnRzXCIpXSlcbiAgfVxufSk7XG5uZXcgT2UoXCJDb21wdXRlQnVkZ2V0MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xuei5zdHJ1Y3QoW3oudTgoXCJudW1TaWduYXR1cmVzXCIpLCB6LnU4KFwicGFkZGluZ1wiKSwgei51MTYoXCJzaWduYXR1cmVPZmZzZXRcIiksIHoudTE2KFwic2lnbmF0dXJlSW5zdHJ1Y3Rpb25JbmRleFwiKSwgei51MTYoXCJwdWJsaWNLZXlPZmZzZXRcIiksIHoudTE2KFwicHVibGljS2V5SW5zdHJ1Y3Rpb25JbmRleFwiKSwgei51MTYoXCJtZXNzYWdlRGF0YU9mZnNldFwiKSwgei51MTYoXCJtZXNzYWdlRGF0YVNpemVcIiksIHoudTE2KFwibWVzc2FnZUluc3RydWN0aW9uSW5kZXhcIildKTtcbm5ldyBPZShcIkVkMjU1MTlTaWdWZXJpZnkxMTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5vRS51dGlscy5pc1ZhbGlkUHJpdmF0ZUtleTtcbnouc3RydWN0KFt6LnU4KFwibnVtU2lnbmF0dXJlc1wiKSwgei51MTYoXCJzaWduYXR1cmVPZmZzZXRcIiksIHoudTgoXCJzaWduYXR1cmVJbnN0cnVjdGlvbkluZGV4XCIpLCB6LnUxNihcImV0aEFkZHJlc3NPZmZzZXRcIiksIHoudTgoXCJldGhBZGRyZXNzSW5zdHJ1Y3Rpb25JbmRleFwiKSwgei51MTYoXCJtZXNzYWdlRGF0YU9mZnNldFwiKSwgei51MTYoXCJtZXNzYWdlRGF0YVNpemVcIiksIHoudTgoXCJtZXNzYWdlSW5zdHJ1Y3Rpb25JbmRleFwiKSwgei5ibG9iKDIwLCBcImV0aEFkZHJlc3NcIiksIHouYmxvYig2NCwgXCJzaWduYXR1cmVcIiksIHoudTgoXCJyZWNvdmVyeUlkXCIpXSk7XG5uZXcgT2UoXCJLZWNjYWtTZWNwMjU2azExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xudmFyIHowO1xubmV3IE9lKFwiU3Rha2VDb25maWcxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbmNsYXNzIFkwIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBMb2NrdXAgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgdGhpcy51bml4VGltZXN0YW1wID0gdm9pZCAwLCB0aGlzLmVwb2NoID0gdm9pZCAwLCB0aGlzLmN1c3RvZGlhbiA9IHZvaWQgMCwgdGhpcy51bml4VGltZXN0YW1wID0gZSwgdGhpcy5lcG9jaCA9IHQsIHRoaXMuY3VzdG9kaWFuID0gcjtcbiAgfVxuICAvKipcbiAgICogRGVmYXVsdCwgaW5hY3RpdmUgTG9ja3VwIHZhbHVlXG4gICAqL1xufVxuejAgPSBZMDtcblkwLmRlZmF1bHQgPSBuZXcgejAoMCwgMCwgT2UuZGVmYXVsdCk7XG5PYmplY3QuZnJlZXplKHtcbiAgSW5pdGlhbGl6ZToge1xuICAgIGluZGV4OiAwLFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIiksIGhFKCksIGZFKCldKVxuICB9LFxuICBBdXRob3JpemU6IHtcbiAgICBpbmRleDogMSxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBXZShcIm5ld0F1dGhvcml6ZWRcIiksIHoudTMyKFwic3Rha2VBdXRob3JpemF0aW9uVHlwZVwiKV0pXG4gIH0sXG4gIERlbGVnYXRlOiB7XG4gICAgaW5kZXg6IDIsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKV0pXG4gIH0sXG4gIFNwbGl0OiB7XG4gICAgaW5kZXg6IDMsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgei5uczY0KFwibGFtcG9ydHNcIildKVxuICB9LFxuICBXaXRoZHJhdzoge1xuICAgIGluZGV4OiA0LFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIiksIHoubnM2NChcImxhbXBvcnRzXCIpXSlcbiAgfSxcbiAgRGVhY3RpdmF0ZToge1xuICAgIGluZGV4OiA1LFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIildKVxuICB9LFxuICBNZXJnZToge1xuICAgIGluZGV4OiA3LFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIildKVxuICB9LFxuICBBdXRob3JpemVXaXRoU2VlZDoge1xuICAgIGluZGV4OiA4LFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIiksIFdlKFwibmV3QXV0aG9yaXplZFwiKSwgei51MzIoXCJzdGFrZUF1dGhvcml6YXRpb25UeXBlXCIpLCB4bihcImF1dGhvcml0eVNlZWRcIiksIFdlKFwiYXV0aG9yaXR5T3duZXJcIildKVxuICB9XG59KTtcbm5ldyBPZShcIlN0YWtlMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFcIik7XG5PYmplY3QuZnJlZXplKHtcbiAgSW5pdGlhbGl6ZUFjY291bnQ6IHtcbiAgICBpbmRleDogMCxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBnRSgpXSlcbiAgfSxcbiAgQXV0aG9yaXplOiB7XG4gICAgaW5kZXg6IDEsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgV2UoXCJuZXdBdXRob3JpemVkXCIpLCB6LnUzMihcInZvdGVBdXRob3JpemF0aW9uVHlwZVwiKV0pXG4gIH0sXG4gIFdpdGhkcmF3OiB7XG4gICAgaW5kZXg6IDMsXG4gICAgbGF5b3V0OiB6LnN0cnVjdChbei51MzIoXCJpbnN0cnVjdGlvblwiKSwgei5uczY0KFwibGFtcG9ydHNcIildKVxuICB9LFxuICBVcGRhdGVWYWxpZGF0b3JJZGVudGl0eToge1xuICAgIGluZGV4OiA0LFxuICAgIGxheW91dDogei5zdHJ1Y3QoW3oudTMyKFwiaW5zdHJ1Y3Rpb25cIildKVxuICB9LFxuICBBdXRob3JpemVXaXRoU2VlZDoge1xuICAgIGluZGV4OiAxMCxcbiAgICBsYXlvdXQ6IHouc3RydWN0KFt6LnUzMihcImluc3RydWN0aW9uXCIpLCBwRSgpXSlcbiAgfVxufSk7XG5uZXcgT2UoXCJWb3RlMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xubmV3IE9lKFwiVmExaWRhdG9yMW5mbzExMTExMTExMTExMTExMTExMTExMTExMTExMTExMVwiKTtcbm9lKHtcbiAgbmFtZTogY2UoKSxcbiAgd2Vic2l0ZTogU2UoY2UoKSksXG4gIGRldGFpbHM6IFNlKGNlKCkpLFxuICBpY29uVXJsOiBTZShjZSgpKSxcbiAga2V5YmFzZVVzZXJuYW1lOiBTZShjZSgpKVxufSk7XG5uZXcgT2UoXCJWb3RlMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExXCIpO1xuei5zdHJ1Y3QoW1xuICBXZShcIm5vZGVQdWJrZXlcIiksXG4gIFdlKFwiYXV0aG9yaXplZFdpdGhkcmF3ZXJcIiksXG4gIHoudTgoXCJjb21taXNzaW9uXCIpLFxuICB6Lm51NjQoKSxcbiAgLy8gdm90ZXMubGVuZ3RoXG4gIHouc2VxKHouc3RydWN0KFt6Lm51NjQoXCJzbG90XCIpLCB6LnUzMihcImNvbmZpcm1hdGlvbkNvdW50XCIpXSksIHoub2Zmc2V0KHoudTMyKCksIC04KSwgXCJ2b3Rlc1wiKSxcbiAgei51OChcInJvb3RTbG90VmFsaWRcIiksXG4gIHoubnU2NChcInJvb3RTbG90XCIpLFxuICB6Lm51NjQoKSxcbiAgLy8gYXV0aG9yaXplZFZvdGVycy5sZW5ndGhcbiAgei5zZXEoei5zdHJ1Y3QoW3oubnU2NChcImVwb2NoXCIpLCBXZShcImF1dGhvcml6ZWRWb3RlclwiKV0pLCB6Lm9mZnNldCh6LnUzMigpLCAtOCksIFwiYXV0aG9yaXplZFZvdGVyc1wiKSxcbiAgei5zdHJ1Y3QoW3ouc2VxKHouc3RydWN0KFtXZShcImF1dGhvcml6ZWRQdWJrZXlcIiksIHoubnU2NChcImVwb2NoT2ZMYXN0QXV0aG9yaXplZFN3aXRjaFwiKSwgei5udTY0KFwidGFyZ2V0RXBvY2hcIildKSwgMzIsIFwiYnVmXCIpLCB6Lm51NjQoXCJpZHhcIiksIHoudTgoXCJpc0VtcHR5XCIpXSwgXCJwcmlvclZvdGVyc1wiKSxcbiAgei5udTY0KCksXG4gIC8vIGVwb2NoQ3JlZGl0cy5sZW5ndGhcbiAgei5zZXEoei5zdHJ1Y3QoW3oubnU2NChcImVwb2NoXCIpLCB6Lm51NjQoXCJjcmVkaXRzXCIpLCB6Lm51NjQoXCJwcmV2Q3JlZGl0c1wiKV0pLCB6Lm9mZnNldCh6LnUzMigpLCAtOCksIFwiZXBvY2hDcmVkaXRzXCIpLFxuICB6LnN0cnVjdChbei5udTY0KFwic2xvdFwiKSwgei5udTY0KFwidGltZXN0YW1wXCIpXSwgXCJsYXN0VGltZXN0YW1wXCIpXG5dKTtcbmNvbnN0IFZFID0gKHMpID0+ICh7XG4gIHJlcXVlc3Q6IHMsXG4gIHNpZ25NZXNzYWdlOiAoZSkgPT4gcyh7IG1ldGhvZDogXCJzaWduTWVzc2FnZVwiLCBwYXJhbXM6IHsgbWVzc2FnZTogZSB9IH0pLFxuICBzaWduVHJhbnNhY3Rpb246IChlKSA9PiBzKHsgbWV0aG9kOiBcInNpZ25UcmFuc2FjdGlvblwiLCBwYXJhbXM6IHsgdHJhbnNhY3Rpb246IGUgfSB9KSxcbiAgc2lnbkFuZFNlbmRUcmFuc2FjdGlvbjogKGUpID0+IHMoe1xuICAgIG1ldGhvZDogXCJzaWduQW5kU2VuZFRyYW5zYWN0aW9uXCIsXG4gICAgcGFyYW1zOiBlXG4gIH0pXG59KTtcbmZ1bmN0aW9uIEdkKHMpIHtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKHMuc2VyaWFsaXplKHtcbiAgICB2ZXJpZnlTaWduYXR1cmVzOiAhMVxuICB9KSkudG9TdHJpbmcoXCJiYXNlNjRcIik7XG59XG5mdW5jdGlvbiBqRShzKSB7XG4gIGNvbnN0IGUgPSBCdWZmZXIuZnJvbShzLCBcImJhc2U2NFwiKTtcbiAgcmV0dXJuIG51LmRlc2VyaWFsaXplTWVzc2FnZVZlcnNpb24oZSkgPT09IFwibGVnYWN5XCIgPyBpdS5kZXNlcmlhbGl6ZShlKSA6IEtvLmZyb20oZSk7XG59XG5mdW5jdGlvbiBLRShzKSB7XG4gIHJldHVybiBhc3luYyAodCkgPT4ge1xuICAgIGlmICh0Lm1ldGhvZCA9PT0gXCJjb25uZWN0XCIpXG4gICAgICByZXR1cm4gYXdhaXQgcyh0KTtcbiAgICBpZiAodC5tZXRob2QgPT09IFwic2lnbk1lc3NhZ2VcIilcbiAgICAgIHJldHVybiBhd2FpdCBzKHQpO1xuICAgIGlmICh0Lm1ldGhvZCA9PT0gXCJzaWduQW5kU2VuZFRyYW5zYWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IHsgdHJhbnNhY3Rpb246IHIgfSA9IHQucGFyYW1zLCBuID0ge1xuICAgICAgICB0cmFuc2FjdGlvbjogR2QocilcbiAgICAgIH07XG4gICAgICByZXR1cm4gYXdhaXQgcyh7XG4gICAgICAgIG1ldGhvZDogXCJzaWduQW5kU2VuZFRyYW5zYWN0aW9uXCIsXG4gICAgICAgIHBhcmFtczogblxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0Lm1ldGhvZCA9PT0gXCJzaWduVHJhbnNhY3Rpb25cIikge1xuICAgICAgY29uc3QgeyB0cmFuc2FjdGlvbjogciB9ID0gdC5wYXJhbXMsIG4gPSB7XG4gICAgICAgIHRyYW5zYWN0aW9uOiBHZChyKVxuICAgICAgfSwgeyBzaWduZWRUcmFuc2FjdGlvbjogaSB9ID0gYXdhaXQgcyh7XG4gICAgICAgIG1ldGhvZDogXCJzaWduVHJhbnNhY3Rpb25cIixcbiAgICAgICAgcGFyYW1zOiBuXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHNpZ25lZFRyYW5zYWN0aW9uOiBqRShpKSB9O1xuICAgIH1cbiAgfTtcbn1cbmNvbnN0IEhFID0gKHsgbWluaUFwcEhvc3Q6IHMsIGVtaXR0ZXI6IGUgfSkgPT4ge1xuICBsZXQgdCwgciA9IG51bGw7XG4gIHJldHVybiB7XG4gICAgdmlzaWJsZTogITEsXG4gICAgZ2V0IG9uYmFjaygpIHtcbiAgICAgIHJldHVybiByO1xuICAgIH0sXG4gICAgc2V0IG9uYmFjayhuKSB7XG4gICAgICByICYmIGUucmVtb3ZlTGlzdGVuZXIoXCJiYWNrTmF2aWdhdGlvblRyaWdnZXJlZFwiLCByKSwgciA9IG4sIG4gJiYgZS5hZGRMaXN0ZW5lcihcImJhY2tOYXZpZ2F0aW9uVHJpZ2dlcmVkXCIsIG4pO1xuICAgIH0sXG4gICAgYXN5bmMgc2hvdygpIHtcbiAgICAgIGF3YWl0IHMudXBkYXRlQmFja1N0YXRlKHtcbiAgICAgICAgdmlzaWJsZTogITBcbiAgICAgIH0pLCB0aGlzLnZpc2libGUgPSAhMDtcbiAgICB9LFxuICAgIGFzeW5jIGhpZGUoKSB7XG4gICAgICBhd2FpdCBzLnVwZGF0ZUJhY2tTdGF0ZSh7XG4gICAgICAgIHZpc2libGU6ICExXG4gICAgICB9KSwgdGhpcy52aXNpYmxlID0gITE7XG4gICAgfSxcbiAgICBhc3luYyBlbmFibGVXZWJOYXZpZ2F0aW9uKCkge1xuICAgICAgdCA9IHFFKHtcbiAgICAgICAgYmFjazogdGhpcyxcbiAgICAgICAgZW1pdHRlcjogZVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBhc3luYyBkaXNhYmxlV2ViTmF2aWdhdGlvbigpIHtcbiAgICAgIHQgPT0gbnVsbCB8fCB0KCksIHQgPSB2b2lkIDA7XG4gICAgfVxuICB9O1xufTtcbmZ1bmN0aW9uIHFFKHsgZW1pdHRlcjogcywgYmFjazogZSB9KSB7XG4gIGNvbnN0IHQgPSBXRSgpO1xuICBpZiAodClcbiAgICByZXR1cm4gekUoeyBlbWl0dGVyOiBzLCBiYWNrOiBlLCBuYXZpZ2F0aW9uOiB0IH0pO1xuICBpZiAodHlwZW9mIHdpbmRvdyA8IFwidVwiKVxuICAgIHJldHVybiBZRSh7IGVtaXR0ZXI6IHMsIGJhY2s6IGUsIHdpbmRvdyB9KTtcbn1cbmZ1bmN0aW9uIFdFKCkge1xuICBpZiAodHlwZW9mIHdpbmRvdyA8IFwidVwiICYmIHdpbmRvdy5uYXZpZ2F0aW9uICE9PSB2b2lkIDApXG4gICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0aW9uO1xufVxuZnVuY3Rpb24gekUoeyBlbWl0dGVyOiBzLCBiYWNrOiBlLCBuYXZpZ2F0aW9uOiB0IH0pIHtcbiAgZnVuY3Rpb24gcigpIHtcbiAgICB0LmNhbkdvQmFjayA/IGUuc2hvdygpIDogZS5oaWRlKCk7XG4gIH1cbiAgZnVuY3Rpb24gbigpIHtcbiAgICBlLnZpc2libGUgJiYgdC5jYW5Hb0JhY2sgJiYgdC5iYWNrKCk7XG4gIH1cbiAgcmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcihcIm5hdmlnYXRlc3VjY2Vzc1wiLCByKSwgcy5hZGRMaXN0ZW5lcihcImJhY2tOYXZpZ2F0aW9uVHJpZ2dlcmVkXCIsIG4pLCAoKSA9PiB7XG4gICAgdC5yZW1vdmVFdmVudExpc3RlbmVyKFwibmF2aWdhdGVzdWNjZXNzXCIsIHIpLCBzLnJlbW92ZUxpc3RlbmVyKFwiYmFja05hdmlnYXRpb25UcmlnZ2VyZWRcIiwgbik7XG4gIH07XG59XG5mdW5jdGlvbiBZRSh7IGVtaXR0ZXI6IHMsIGJhY2s6IGUsIHdpbmRvdzogdCB9KSB7XG4gIGUuc2hvdygpO1xuICBmdW5jdGlvbiByKCkge1xuICAgIGUudmlzaWJsZSAmJiB0Lmhpc3RvcnkuYmFjaygpO1xuICB9XG4gIHJldHVybiBzLmFkZExpc3RlbmVyKFwiYmFja05hdmlnYXRpb25UcmlnZ2VyZWRcIiwgciksICgpID0+IHtcbiAgICBzLnJlbW92ZUxpc3RlbmVyKFwiYmFja05hdmlnYXRpb25UcmlnZ2VyZWRcIiwgcik7XG4gIH07XG59XG5jb25zdCBaRSA9IFwiMC4xLjFcIjtcbmZ1bmN0aW9uIFhFKCkge1xuICByZXR1cm4gWkU7XG59XG5sZXQgSkUgPSBjbGFzcyBzYyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZSwgdCA9IHt9KSB7XG4gICAgY29uc3QgciA9ICgoKSA9PiB7XG4gICAgICB2YXIgbDtcbiAgICAgIGlmICh0LmNhdXNlIGluc3RhbmNlb2Ygc2MpIHtcbiAgICAgICAgaWYgKHQuY2F1c2UuZGV0YWlscylcbiAgICAgICAgICByZXR1cm4gdC5jYXVzZS5kZXRhaWxzO1xuICAgICAgICBpZiAodC5jYXVzZS5zaG9ydE1lc3NhZ2UpXG4gICAgICAgICAgcmV0dXJuIHQuY2F1c2Uuc2hvcnRNZXNzYWdlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChsID0gdC5jYXVzZSkgIT0gbnVsbCAmJiBsLm1lc3NhZ2UgPyB0LmNhdXNlLm1lc3NhZ2UgOiB0LmRldGFpbHM7XG4gICAgfSkoKSwgbiA9IHQuY2F1c2UgaW5zdGFuY2VvZiBzYyAmJiB0LmNhdXNlLmRvY3NQYXRoIHx8IHQuZG9jc1BhdGgsIG8gPSBgaHR0cHM6Ly9veGxpYi5zaCR7biA/PyBcIlwifWAsIGEgPSBbXG4gICAgICBlIHx8IFwiQW4gZXJyb3Igb2NjdXJyZWQuXCIsXG4gICAgICAuLi50Lm1ldGFNZXNzYWdlcyA/IFtcIlwiLCAuLi50Lm1ldGFNZXNzYWdlc10gOiBbXSxcbiAgICAgIC4uLnIgfHwgbiA/IFtcbiAgICAgICAgXCJcIixcbiAgICAgICAgciA/IGBEZXRhaWxzOiAke3J9YCA6IHZvaWQgMCxcbiAgICAgICAgbiA/IGBTZWU6ICR7b31gIDogdm9pZCAwXG4gICAgICBdIDogW11cbiAgICBdLmZpbHRlcigobCkgPT4gdHlwZW9mIGwgPT0gXCJzdHJpbmdcIikuam9pbihgXG5gKTtcbiAgICBzdXBlcihhLCB0LmNhdXNlID8geyBjYXVzZTogdC5jYXVzZSB9IDogdm9pZCAwKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiZGV0YWlsc1wiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogdm9pZCAwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRvY3NcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IHZvaWQgMFxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJkb2NzUGF0aFwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogdm9pZCAwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNob3J0TWVzc2FnZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogdm9pZCAwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNhdXNlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJCYXNlRXJyb3JcIlxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJ2ZXJzaW9uXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBgb3hAJHtYRSgpfWBcbiAgICB9KSwgdGhpcy5jYXVzZSA9IHQuY2F1c2UsIHRoaXMuZGV0YWlscyA9IHIsIHRoaXMuZG9jcyA9IG8sIHRoaXMuZG9jc1BhdGggPSBuLCB0aGlzLnNob3J0TWVzc2FnZSA9IGU7XG4gIH1cbiAgd2FsayhlKSB7XG4gICAgcmV0dXJuIFowKHRoaXMsIGUpO1xuICB9XG59O1xuZnVuY3Rpb24gWjAocywgZSkge1xuICByZXR1cm4gZSAhPSBudWxsICYmIGUocykgPyBzIDogcyAmJiB0eXBlb2YgcyA9PSBcIm9iamVjdFwiICYmIFwiY2F1c2VcIiBpbiBzICYmIHMuY2F1c2UgPyBaMChzLmNhdXNlLCBlKSA6IGUgPyBudWxsIDogcztcbn1cbmZ1bmN0aW9uIFgwKHMsIGUgPSB7fSkge1xuICBjb25zdCB7IHJhdzogdCA9ICExIH0gPSBlLCByID0gcztcbiAgaWYgKHQpXG4gICAgcmV0dXJuIHM7XG4gIGlmIChyLmVycm9yKSB7XG4gICAgY29uc3QgeyBjb2RlOiBuIH0gPSByLmVycm9yLCBpID0gbiA9PT0gQm4uY29kZSA/IEJuIDogbiA9PT0gcmkuY29kZSA/IHJpIDogbiA9PT0gZGkuY29kZSA/IGRpIDogbiA9PT0gY2kuY29kZSA/IGNpIDogbiA9PT0gYWkuY29kZSA/IGFpIDogbiA9PT0gdWkuY29kZSA/IHVpIDogbiA9PT0gb2kuY29kZSA/IG9pIDogbiA9PT0gaGkuY29kZSA/IGhpIDogbiA9PT0gc2kuY29kZSA/IHNpIDogbiA9PT0gbmkuY29kZSA/IG5pIDogbiA9PT0gaWkuY29kZSA/IGlpIDogbiA9PT0gbGkuY29kZSA/IGxpIDogbXI7XG4gICAgdGhyb3cgbmV3IGkoci5lcnJvcik7XG4gIH1cbiAgcmV0dXJuIHIucmVzdWx0O1xufVxubGV0IG1yID0gY2xhc3MgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICBjb25zdCB7IGNvZGU6IHQsIG1lc3NhZ2U6IHIsIGRhdGE6IG4gfSA9IGU7XG4gICAgc3VwZXIociksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUnBjUmVzcG9uc2UuQmFzZUVycm9yXCJcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogdm9pZCAwXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRhdGFcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IHZvaWQgMFxuICAgIH0pLCB0aGlzLmNvZGUgPSB0LCB0aGlzLmRhdGEgPSBuO1xuICB9XG59O1xuY2xhc3MgcmkgZXh0ZW5kcyBtciB7XG4gIGNvbnN0cnVjdG9yKGUgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiTWlzc2luZyBvciBpbnZhbGlkIHBhcmFtZXRlcnMuXCIsXG4gICAgICAuLi5lLFxuICAgICAgY29kZTogcmkuY29kZVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiAtMzJlM1xuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLkludmFsaWRJbnB1dEVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KHJpLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogLTMyZTNcbn0pO1xuY2xhc3Mgc2kgZXh0ZW5kcyBtciB7XG4gIGNvbnN0cnVjdG9yKGUgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiUmVxdWVzdGVkIHJlc291cmNlIG5vdCBmb3VuZC5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiBzaS5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjAwMVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLlJlc291cmNlTm90Rm91bmRFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShzaSwgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IC0zMjAwMVxufSk7XG5jbGFzcyBuaSBleHRlbmRzIG1yIHtcbiAgY29uc3RydWN0b3IoZSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogXCJSZXF1ZXN0ZWQgcmVzb3VyY2Ugbm90IGF2YWlsYWJsZS5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiBuaS5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjAwMlxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLlJlc291cmNlVW5hdmFpbGFibGVFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShuaSwgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IC0zMjAwMlxufSk7XG5jbGFzcyBpaSBleHRlbmRzIG1yIHtcbiAgY29uc3RydWN0b3IoZSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogXCJUcmFuc2FjdGlvbiBjcmVhdGlvbiBmYWlsZWQuXCIsXG4gICAgICAuLi5lLFxuICAgICAgY29kZTogaWkuY29kZVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiAtMzIwMDNcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJScGNSZXNwb25zZS5UcmFuc2FjdGlvblJlamVjdGVkRXJyb3JcIlxuICAgIH0pO1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoaWksIFwiY29kZVwiLCB7XG4gIGVudW1lcmFibGU6ICEwLFxuICBjb25maWd1cmFibGU6ICEwLFxuICB3cml0YWJsZTogITAsXG4gIHZhbHVlOiAtMzIwMDNcbn0pO1xuY2xhc3Mgb2kgZXh0ZW5kcyBtciB7XG4gIGNvbnN0cnVjdG9yKGUgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiBvaS5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjAwNFxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLk1ldGhvZE5vdFN1cHBvcnRlZEVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KG9pLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogLTMyMDA0XG59KTtcbmNsYXNzIGFpIGV4dGVuZHMgbXIge1xuICBjb25zdHJ1Y3RvcihlID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBcIlJhdGUgbGltaXQgZXhjZWVkZWQuXCIsXG4gICAgICAuLi5lLFxuICAgICAgY29kZTogYWkuY29kZVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiAtMzIwMDVcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJScGNSZXNwb25zZS5MaW1pdEV4Y2VlZGVkRXJyb3JcIlxuICAgIH0pO1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoYWksIFwiY29kZVwiLCB7XG4gIGVudW1lcmFibGU6ICEwLFxuICBjb25maWd1cmFibGU6ICEwLFxuICB3cml0YWJsZTogITAsXG4gIHZhbHVlOiAtMzIwMDVcbn0pO1xuY2xhc3MgbGkgZXh0ZW5kcyBtciB7XG4gIGNvbnN0cnVjdG9yKGUgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiSlNPTi1SUEMgdmVyc2lvbiBub3Qgc3VwcG9ydGVkLlwiLFxuICAgICAgLi4uZSxcbiAgICAgIGNvZGU6IGxpLmNvZGVcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogLTMyMDA2XG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUnBjUmVzcG9uc2UuVmVyc2lvbk5vdFN1cHBvcnRlZEVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGxpLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogLTMyMDA2XG59KTtcbmNsYXNzIGNpIGV4dGVuZHMgbXIge1xuICBjb25zdHJ1Y3RvcihlID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBcIklucHV0IGlzIG5vdCBhIHZhbGlkIEpTT04tUlBDIHJlcXVlc3QuXCIsXG4gICAgICAuLi5lLFxuICAgICAgY29kZTogY2kuY29kZVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiAtMzI2MDBcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJScGNSZXNwb25zZS5JbnZhbGlkUmVxdWVzdEVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGNpLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogLTMyNjAwXG59KTtcbmNsYXNzIHVpIGV4dGVuZHMgbXIge1xuICBjb25zdHJ1Y3RvcihlID0ge30pIHtcbiAgICBzdXBlcih7XG4gICAgICBtZXNzYWdlOiBcIk1ldGhvZCBkb2VzIG5vdCBleGlzdC5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiB1aS5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjYwMVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLk1ldGhvZE5vdEZvdW5kRXJyb3JcIlxuICAgIH0pO1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkodWksIFwiY29kZVwiLCB7XG4gIGVudW1lcmFibGU6ICEwLFxuICBjb25maWd1cmFibGU6ICEwLFxuICB3cml0YWJsZTogITAsXG4gIHZhbHVlOiAtMzI2MDFcbn0pO1xuY2xhc3MgZGkgZXh0ZW5kcyBtciB7XG4gIGNvbnN0cnVjdG9yKGUgPSB7fSkge1xuICAgIHN1cGVyKHtcbiAgICAgIG1lc3NhZ2U6IFwiSW52YWxpZCBtZXRob2QgcGFyYW1ldGVycy5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiBkaS5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjYwMlxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLkludmFsaWRQYXJhbXNFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkaSwgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IC0zMjYwMlxufSk7XG5jbGFzcyBCbiBleHRlbmRzIG1yIHtcbiAgY29uc3RydWN0b3IoZSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogXCJJbnRlcm5hbCBKU09OLVJQQyBlcnJvci5cIixcbiAgICAgIC4uLmUsXG4gICAgICBjb2RlOiBCbi5jb2RlXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IC0zMjYwM1xuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlJwY1Jlc3BvbnNlLkludGVybmFsRXJyb3JFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCbiwgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IC0zMjYwM1xufSk7XG5jbGFzcyBoaSBleHRlbmRzIG1yIHtcbiAgY29uc3RydWN0b3IoZSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgbWVzc2FnZTogXCJGYWlsZWQgdG8gcGFyc2UgSlNPTi1SUEMgcmVzcG9uc2UuXCIsXG4gICAgICAuLi5lLFxuICAgICAgY29kZTogaGkuY29kZVxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiAtMzI3MDBcbiAgICB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJScGNSZXNwb25zZS5QYXJzZUVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGhpLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogLTMyNzAwXG59KTtcbmNsYXNzIG5uIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIodCksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUHJvdmlkZXJScGNFcnJvclwiXG4gICAgfSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IHZvaWQgMFxuICAgIH0pLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJkZXRhaWxzXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICB9KSwgdGhpcy5jb2RlID0gZSwgdGhpcy5kZXRhaWxzID0gdDtcbiAgfVxufVxuY2xhc3MgSjAgZXh0ZW5kcyBubiB7XG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZTogZSA9IFwiVGhlIHVzZXIgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuXCIgfSA9IHt9KSB7XG4gICAgc3VwZXIoNDAwMSwgZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUHJvdmlkZXIuVXNlclJlamVjdGVkUmVxdWVzdEVycm9yXCJcbiAgICB9KTtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEowLCBcImNvZGVcIiwge1xuICBlbnVtZXJhYmxlOiAhMCxcbiAgY29uZmlndXJhYmxlOiAhMCxcbiAgd3JpdGFibGU6ICEwLFxuICB2YWx1ZTogNDAwMVxufSk7XG5jbGFzcyBRMCBleHRlbmRzIG5uIHtcbiAgY29uc3RydWN0b3IoeyBtZXNzYWdlOiBlID0gXCJUaGUgcmVxdWVzdGVkIG1ldGhvZCBhbmQvb3IgYWNjb3VudCBoYXMgbm90IGJlZW4gYXV0aG9yaXplZCBieSB0aGUgdXNlci5cIiB9ID0ge30pIHtcbiAgICBzdXBlcig0MTAwLCBlKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICBlbnVtZXJhYmxlOiAhMCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogITAsXG4gICAgICB3cml0YWJsZTogITAsXG4gICAgICB2YWx1ZTogXCJQcm92aWRlci5VbmF1dGhvcml6ZWRFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShRMCwgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IDQxMDBcbn0pO1xuY2xhc3MgZWcgZXh0ZW5kcyBubiB7XG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZTogZSA9IFwiVGhlIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBtZXRob2QuXCIgfSA9IHt9KSB7XG4gICAgc3VwZXIoNDIwMCwgZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUHJvdmlkZXIuVW5zdXBwb3J0ZWRNZXRob2RFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlZywgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IDQyMDBcbn0pO1xuY2xhc3MgdGcgZXh0ZW5kcyBubiB7XG4gIGNvbnN0cnVjdG9yKHsgbWVzc2FnZTogZSA9IFwiVGhlIHByb3ZpZGVyIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIGFsbCBjaGFpbnMuXCIgfSA9IHt9KSB7XG4gICAgc3VwZXIoNDkwMCwgZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUHJvdmlkZXIuRGlzY29ubmVjdGVkRXJyb3JcIlxuICAgIH0pO1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkodGcsIFwiY29kZVwiLCB7XG4gIGVudW1lcmFibGU6ICEwLFxuICBjb25maWd1cmFibGU6ICEwLFxuICB3cml0YWJsZTogITAsXG4gIHZhbHVlOiA0OTAwXG59KTtcbmNsYXNzIHJnIGV4dGVuZHMgbm4ge1xuICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2U6IGUgPSBcIlRoZSBwcm92aWRlciBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSByZXF1ZXN0ZWQgY2hhaW4uXCIgfSA9IHt9KSB7XG4gICAgc3VwZXIoNDkwMSwgZSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgZW51bWVyYWJsZTogITAsXG4gICAgICBjb25maWd1cmFibGU6ICEwLFxuICAgICAgd3JpdGFibGU6ICEwLFxuICAgICAgdmFsdWU6IFwiUHJvdmlkZXIuQ2hhaW5EaXNjb25uZWN0ZWRFcnJvclwiXG4gICAgfSk7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZywgXCJjb2RlXCIsIHtcbiAgZW51bWVyYWJsZTogITAsXG4gIGNvbmZpZ3VyYWJsZTogITAsXG4gIHdyaXRhYmxlOiAhMCxcbiAgdmFsdWU6IDQ5MDFcbn0pO1xuZnVuY3Rpb24gUUUoKSB7XG4gIGNvbnN0IHMgPSBuZXcgTDAoKTtcbiAgcmV0dXJuIHtcbiAgICBnZXQgZXZlbnROYW1lcygpIHtcbiAgICAgIHJldHVybiBzLmV2ZW50TmFtZXMuYmluZChzKTtcbiAgICB9LFxuICAgIGdldCBsaXN0ZW5lckNvdW50KCkge1xuICAgICAgcmV0dXJuIHMubGlzdGVuZXJDb3VudC5iaW5kKHMpO1xuICAgIH0sXG4gICAgZ2V0IGxpc3RlbmVycygpIHtcbiAgICAgIHJldHVybiBzLmxpc3RlbmVycy5iaW5kKHMpO1xuICAgIH0sXG4gICAgYWRkTGlzdGVuZXI6IHMuYWRkTGlzdGVuZXIuYmluZChzKSxcbiAgICBlbWl0OiBzLmVtaXQuYmluZChzKSxcbiAgICBvZmY6IHMub2ZmLmJpbmQocyksXG4gICAgb246IHMub24uYmluZChzKSxcbiAgICBvbmNlOiBzLm9uY2UuYmluZChzKSxcbiAgICByZW1vdmVBbGxMaXN0ZW5lcnM6IHMucmVtb3ZlQWxsTGlzdGVuZXJzLmJpbmQocyksXG4gICAgcmVtb3ZlTGlzdGVuZXI6IHMucmVtb3ZlTGlzdGVuZXIuYmluZChzKVxuICB9O1xufVxuZnVuY3Rpb24gZXgocywgZSA9IHt9KSB7XG4gIHZhciByLCBuO1xuICBjb25zdCB7IGluY2x1ZGVFdmVudHM6IHQgPSAhMCB9ID0gZTtcbiAgaWYgKCFzKVxuICAgIHRocm93IG5ldyB0eCgpO1xuICByZXR1cm4ge1xuICAgIC4uLnQgPyB7XG4gICAgICBvbjogKHIgPSBzLm9uKSA9PSBudWxsID8gdm9pZCAwIDogci5iaW5kKHMpLFxuICAgICAgcmVtb3ZlTGlzdGVuZXI6IChuID0gcy5yZW1vdmVMaXN0ZW5lcikgPT0gbnVsbCA/IHZvaWQgMCA6IG4uYmluZChzKVxuICAgIH0gOiB7fSxcbiAgICBhc3luYyByZXF1ZXN0KGkpIHtcbiAgICAgIGNvbnN0IG8gPSBhd2FpdCBzLnJlcXVlc3QoaSk7XG4gICAgICByZXR1cm4gbyAmJiB0eXBlb2YgbyA9PSBcIm9iamVjdFwiICYmIFwianNvbnJwY1wiIGluIG8gPyBYMChvKSA6IG87XG4gICAgfVxuICB9O1xufVxuY2xhc3MgdHggZXh0ZW5kcyBKRSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFwiYHByb3ZpZGVyYCBpcyB1bmRlZmluZWQuXCIpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgIGVudW1lcmFibGU6ICEwLFxuICAgICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgIHZhbHVlOiBcIlByb3ZpZGVyLklzVW5kZWZpbmVkRXJyb3JcIlxuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiByeChzID0ge30pIHtcbiAgbGV0IGUgPSBzLmlkID8/IDA7XG4gIHJldHVybiB7XG4gICAgcHJlcGFyZSh0KSB7XG4gICAgICByZXR1cm4gc3goe1xuICAgICAgICBpZDogZSsrLFxuICAgICAgICAuLi50XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGdldCBpZCgpIHtcbiAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIHN4KHMpIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zLFxuICAgIGpzb25ycGM6IFwiMi4wXCJcbiAgfTtcbn1cbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmNvbnN0IHNnID0gU3ltYm9sKFwiQ29tbGluay5wcm94eVwiKSwgbnggPSBTeW1ib2woXCJDb21saW5rLmVuZHBvaW50XCIpLCBpeCA9IFN5bWJvbChcIkNvbWxpbmsucmVsZWFzZVByb3h5XCIpLCBsbCA9IFN5bWJvbChcIkNvbWxpbmsuZmluYWxpemVyXCIpLCBobyA9IFN5bWJvbChcIkNvbWxpbmsudGhyb3duXCIpLCBuZyA9IChzKSA9PiB0eXBlb2YgcyA9PSBcIm9iamVjdFwiICYmIHMgIT09IG51bGwgfHwgdHlwZW9mIHMgPT0gXCJmdW5jdGlvblwiLCBveCA9IHtcbiAgY2FuSGFuZGxlOiAocykgPT4gbmcocykgJiYgc1tzZ10sXG4gIHNlcmlhbGl6ZShzKSB7XG4gICAgY29uc3QgeyBwb3J0MTogZSwgcG9ydDI6IHQgfSA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHJldHVybiBvZyhzLCBlKSwgW3QsIFt0XV07XG4gIH0sXG4gIGRlc2VyaWFsaXplKHMpIHtcbiAgICByZXR1cm4gcy5zdGFydCgpLCBsZyhzKTtcbiAgfVxufSwgYXggPSB7XG4gIGNhbkhhbmRsZTogKHMpID0+IG5nKHMpICYmIGhvIGluIHMsXG4gIHNlcmlhbGl6ZSh7IHZhbHVlOiBzIH0pIHtcbiAgICBsZXQgZTtcbiAgICByZXR1cm4gcyBpbnN0YW5jZW9mIEVycm9yID8gZSA9IHtcbiAgICAgIGlzRXJyb3I6ICEwLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgbWVzc2FnZTogcy5tZXNzYWdlLFxuICAgICAgICBuYW1lOiBzLm5hbWUsXG4gICAgICAgIHN0YWNrOiBzLnN0YWNrXG4gICAgICB9XG4gICAgfSA6IGUgPSB7IGlzRXJyb3I6ICExLCB2YWx1ZTogcyB9LCBbZSwgW11dO1xuICB9LFxuICBkZXNlcmlhbGl6ZShzKSB7XG4gICAgdGhyb3cgcy5pc0Vycm9yID8gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3Iocy52YWx1ZS5tZXNzYWdlKSwgcy52YWx1ZSkgOiBzLnZhbHVlO1xuICB9XG59LCBpZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKFtcbiAgW1wicHJveHlcIiwgb3hdLFxuICBbXCJ0aHJvd1wiLCBheF1cbl0pO1xuZnVuY3Rpb24gbHgocywgZSkge1xuICBmb3IgKGNvbnN0IHQgb2YgcylcbiAgICBpZiAoZSA9PT0gdCB8fCB0ID09PSBcIipcIiB8fCB0IGluc3RhbmNlb2YgUmVnRXhwICYmIHQudGVzdChlKSlcbiAgICAgIHJldHVybiAhMDtcbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gb2cocywgZSA9IGdsb2JhbFRoaXMsIHQgPSBbXCIqXCJdKSB7XG4gIGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZnVuY3Rpb24gcihuKSB7XG4gICAgaWYgKCFuIHx8ICFuLmRhdGEpXG4gICAgICByZXR1cm47XG4gICAgaWYgKCFseCh0LCBuLm9yaWdpbikpIHtcbiAgICAgIGNvbnNvbGUud2FybihgSW52YWxpZCBvcmlnaW4gJyR7bi5vcmlnaW59JyBmb3IgY29tbGluayBwcm94eWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IGlkOiBpLCB0eXBlOiBvLCBwYXRoOiBhIH0gPSBPYmplY3QuYXNzaWduKHsgcGF0aDogW10gfSwgbi5kYXRhKSwgbCA9IChuLmRhdGEuYXJndW1lbnRMaXN0IHx8IFtdKS5tYXAoJHMpO1xuICAgIGxldCBjO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1ID0gYS5zbGljZSgwLCAtMSkucmVkdWNlKChoLCBmKSA9PiBoW2ZdLCBzKSwgZCA9IGEucmVkdWNlKChoLCBmKSA9PiBoW2ZdLCBzKTtcbiAgICAgIHN3aXRjaCAobykge1xuICAgICAgICBjYXNlIFwiR0VUXCI6XG4gICAgICAgICAgYyA9IGQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJTRVRcIjpcbiAgICAgICAgICB1W2Euc2xpY2UoLTEpWzBdXSA9ICRzKG4uZGF0YS52YWx1ZSksIGMgPSAhMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFQUExZXCI6XG4gICAgICAgICAgYyA9IGQuYXBwbHkodSwgbCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJDT05TVFJVQ1RcIjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBoID0gbmV3IGQoLi4ubCk7XG4gICAgICAgICAgICBjID0gZ3goaCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRU5EUE9JTlRcIjpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCB7IHBvcnQxOiBoLCBwb3J0MjogZiB9ID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgICAgICBvZyhzLCBmKSwgYyA9IGZ4KGgsIFtoXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiUkVMRUFTRVwiOlxuICAgICAgICAgIGMgPSB2b2lkIDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKHUpIHtcbiAgICAgIGMgPSB7IHZhbHVlOiB1LCBbaG9dOiAwIH07XG4gICAgfVxuICAgIFByb21pc2UucmVzb2x2ZShjKS5jYXRjaCgodSkgPT4gKHsgdmFsdWU6IHUsIFtob106IDAgfSkpLnRoZW4oKHUpID0+IHtcbiAgICAgIGNvbnN0IFtkLCBoXSA9IHpvKHUpO1xuICAgICAgZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGQpLCB7IGlkOiBpIH0pLCBoKSwgbyA9PT0gXCJSRUxFQVNFXCIgJiYgKGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgciksIGFnKGUpLCBsbCBpbiBzICYmIHR5cGVvZiBzW2xsXSA9PSBcImZ1bmN0aW9uXCIgJiYgc1tsbF0oKSk7XG4gICAgfSkuY2F0Y2goKHUpID0+IHtcbiAgICAgIGNvbnN0IFtkLCBoXSA9IHpvKHtcbiAgICAgICAgdmFsdWU6IG5ldyBUeXBlRXJyb3IoXCJVbnNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWVcIiksXG4gICAgICAgIFtob106IDBcbiAgICAgIH0pO1xuICAgICAgZS5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGQpLCB7IGlkOiBpIH0pLCBoKTtcbiAgICB9KTtcbiAgfSksIGUuc3RhcnQgJiYgZS5zdGFydCgpO1xufVxuZnVuY3Rpb24gY3gocykge1xuICByZXR1cm4gcy5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIk1lc3NhZ2VQb3J0XCI7XG59XG5mdW5jdGlvbiBhZyhzKSB7XG4gIGN4KHMpICYmIHMuY2xvc2UoKTtcbn1cbmZ1bmN0aW9uIGxnKHMsIGUpIHtcbiAgY29uc3QgdCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIHJldHVybiBzLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGZ1bmN0aW9uKG4pIHtcbiAgICBjb25zdCB7IGRhdGE6IGkgfSA9IG47XG4gICAgaWYgKCFpIHx8ICFpLmlkKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG8gPSB0LmdldChpLmlkKTtcbiAgICBpZiAobylcbiAgICAgIHRyeSB7XG4gICAgICAgIG8oaSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICB0LmRlbGV0ZShpLmlkKTtcbiAgICAgIH1cbiAgfSksIG5jKHMsIHQsIFtdLCBlKTtcbn1cbmZ1bmN0aW9uIFZpKHMpIHtcbiAgaWYgKHMpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiUHJveHkgaGFzIGJlZW4gcmVsZWFzZWQgYW5kIGlzIG5vdCB1c2VhYmxlXCIpO1xufVxuZnVuY3Rpb24gY2cocykge1xuICByZXR1cm4geW4ocywgLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwge1xuICAgIHR5cGU6IFwiUkVMRUFTRVwiXG4gIH0pLnRoZW4oKCkgPT4ge1xuICAgIGFnKHMpO1xuICB9KTtcbn1cbmNvbnN0IHFvID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCksIFdvID0gXCJGaW5hbGl6YXRpb25SZWdpc3RyeVwiIGluIGdsb2JhbFRoaXMgJiYgbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChzKSA9PiB7XG4gIGNvbnN0IGUgPSAocW8uZ2V0KHMpIHx8IDApIC0gMTtcbiAgcW8uc2V0KHMsIGUpLCBlID09PSAwICYmIGNnKHMpO1xufSk7XG5mdW5jdGlvbiB1eChzLCBlKSB7XG4gIGNvbnN0IHQgPSAocW8uZ2V0KGUpIHx8IDApICsgMTtcbiAgcW8uc2V0KGUsIHQpLCBXbyAmJiBXby5yZWdpc3RlcihzLCBlLCBzKTtcbn1cbmZ1bmN0aW9uIGR4KHMpIHtcbiAgV28gJiYgV28udW5yZWdpc3RlcihzKTtcbn1cbmZ1bmN0aW9uIG5jKHMsIGUsIHQgPSBbXSwgciA9IGZ1bmN0aW9uKCkge1xufSkge1xuICBsZXQgbiA9ICExO1xuICBjb25zdCBpID0gbmV3IFByb3h5KHIsIHtcbiAgICBnZXQobywgYSkge1xuICAgICAgaWYgKFZpKG4pLCBhID09PSBpeClcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBkeChpKSwgY2cocyksIGUuY2xlYXIoKSwgbiA9ICEwO1xuICAgICAgICB9O1xuICAgICAgaWYgKGEgPT09IFwidGhlblwiKSB7XG4gICAgICAgIGlmICh0Lmxlbmd0aCA9PT0gMClcbiAgICAgICAgICByZXR1cm4geyB0aGVuOiAoKSA9PiBpIH07XG4gICAgICAgIGNvbnN0IGwgPSB5bihzLCBlLCB7XG4gICAgICAgICAgdHlwZTogXCJHRVRcIixcbiAgICAgICAgICBwYXRoOiB0Lm1hcCgoYykgPT4gYy50b1N0cmluZygpKVxuICAgICAgICB9KS50aGVuKCRzKTtcbiAgICAgICAgcmV0dXJuIGwudGhlbi5iaW5kKGwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5jKHMsIGUsIFsuLi50LCBhXSk7XG4gICAgfSxcbiAgICBzZXQobywgYSwgbCkge1xuICAgICAgVmkobik7XG4gICAgICBjb25zdCBbYywgdV0gPSB6byhsKTtcbiAgICAgIHJldHVybiB5bihzLCBlLCB7XG4gICAgICAgIHR5cGU6IFwiU0VUXCIsXG4gICAgICAgIHBhdGg6IFsuLi50LCBhXS5tYXAoKGQpID0+IGQudG9TdHJpbmcoKSksXG4gICAgICAgIHZhbHVlOiBjXG4gICAgICB9LCB1KS50aGVuKCRzKTtcbiAgICB9LFxuICAgIGFwcGx5KG8sIGEsIGwpIHtcbiAgICAgIFZpKG4pO1xuICAgICAgY29uc3QgYyA9IHRbdC5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChjID09PSBueClcbiAgICAgICAgcmV0dXJuIHluKHMsIGUsIHtcbiAgICAgICAgICB0eXBlOiBcIkVORFBPSU5UXCJcbiAgICAgICAgfSkudGhlbigkcyk7XG4gICAgICBpZiAoYyA9PT0gXCJiaW5kXCIpXG4gICAgICAgIHJldHVybiBuYyhzLCBlLCB0LnNsaWNlKDAsIC0xKSk7XG4gICAgICBjb25zdCBbdSwgZF0gPSBWZChsKTtcbiAgICAgIHJldHVybiB5bihzLCBlLCB7XG4gICAgICAgIHR5cGU6IFwiQVBQTFlcIixcbiAgICAgICAgcGF0aDogdC5tYXAoKGgpID0+IGgudG9TdHJpbmcoKSksXG4gICAgICAgIGFyZ3VtZW50TGlzdDogdVxuICAgICAgfSwgZCkudGhlbigkcyk7XG4gICAgfSxcbiAgICBjb25zdHJ1Y3QobywgYSkge1xuICAgICAgVmkobik7XG4gICAgICBjb25zdCBbbCwgY10gPSBWZChhKTtcbiAgICAgIHJldHVybiB5bihzLCBlLCB7XG4gICAgICAgIHR5cGU6IFwiQ09OU1RSVUNUXCIsXG4gICAgICAgIHBhdGg6IHQubWFwKCh1KSA9PiB1LnRvU3RyaW5nKCkpLFxuICAgICAgICBhcmd1bWVudExpc3Q6IGxcbiAgICAgIH0sIGMpLnRoZW4oJHMpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB1eChpLCBzKSwgaTtcbn1cbmZ1bmN0aW9uIGh4KHMpIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHMpO1xufVxuZnVuY3Rpb24gVmQocykge1xuICBjb25zdCBlID0gcy5tYXAoem8pO1xuICByZXR1cm4gW2UubWFwKCh0KSA9PiB0WzBdKSwgaHgoZS5tYXAoKHQpID0+IHRbMV0pKV07XG59XG5jb25zdCB1ZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuZnVuY3Rpb24gZngocywgZSkge1xuICByZXR1cm4gdWcuc2V0KHMsIGUpLCBzO1xufVxuZnVuY3Rpb24gZ3gocykge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihzLCB7IFtzZ106ICEwIH0pO1xufVxuZnVuY3Rpb24gcHgocywgZSA9IGdsb2JhbFRoaXMsIHQgPSBcIipcIikge1xuICByZXR1cm4ge1xuICAgIHBvc3RNZXNzYWdlOiAociwgbikgPT4gcy5wb3N0TWVzc2FnZShyLCB0LCBuKSxcbiAgICBhZGRFdmVudExpc3RlbmVyOiBlLmFkZEV2ZW50TGlzdGVuZXIuYmluZChlKSxcbiAgICByZW1vdmVFdmVudExpc3RlbmVyOiBlLnJlbW92ZUV2ZW50TGlzdGVuZXIuYmluZChlKVxuICB9O1xufVxuZnVuY3Rpb24gem8ocykge1xuICBmb3IgKGNvbnN0IFtlLCB0XSBvZiBpZylcbiAgICBpZiAodC5jYW5IYW5kbGUocykpIHtcbiAgICAgIGNvbnN0IFtyLCBuXSA9IHQuc2VyaWFsaXplKHMpO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6IFwiSEFORExFUlwiLFxuICAgICAgICAgIG5hbWU6IGUsXG4gICAgICAgICAgdmFsdWU6IHJcbiAgICAgICAgfSxcbiAgICAgICAgblxuICAgICAgXTtcbiAgICB9XG4gIHJldHVybiBbXG4gICAge1xuICAgICAgdHlwZTogXCJSQVdcIixcbiAgICAgIHZhbHVlOiBzXG4gICAgfSxcbiAgICB1Zy5nZXQocykgfHwgW11cbiAgXTtcbn1cbmZ1bmN0aW9uICRzKHMpIHtcbiAgc3dpdGNoIChzLnR5cGUpIHtcbiAgICBjYXNlIFwiSEFORExFUlwiOlxuICAgICAgcmV0dXJuIGlnLmdldChzLm5hbWUpLmRlc2VyaWFsaXplKHMudmFsdWUpO1xuICAgIGNhc2UgXCJSQVdcIjpcbiAgICAgIHJldHVybiBzLnZhbHVlO1xuICB9XG59XG5mdW5jdGlvbiB5bihzLCBlLCB0LCByKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgobikgPT4ge1xuICAgIGNvbnN0IGkgPSBteCgpO1xuICAgIGUuc2V0KGksIG4pLCBzLnN0YXJ0ICYmIHMuc3RhcnQoKSwgcy5wb3N0TWVzc2FnZShPYmplY3QuYXNzaWduKHsgaWQ6IGkgfSwgdCksIHIpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIG14KCkge1xuICByZXR1cm4gbmV3IEFycmF5KDQpLmZpbGwoMCkubWFwKCgpID0+IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpLmpvaW4oXCItXCIpO1xufVxuY29uc3QgeXggPSB7XG4gIHBvc3RNZXNzYWdlKCkge1xuICB9LFxuICBhZGRFdmVudExpc3RlbmVyOiAoKSA9PiB7XG4gIH0sXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXI6ICgpID0+IHtcbiAgfVxufSwgdnggPSB7XG4gIHBvc3RNZXNzYWdlOiAocykgPT4ge1xuICAgIHdpbmRvdy5SZWFjdE5hdGl2ZVdlYlZpZXcucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkocykpO1xuICB9LFxuICBhZGRFdmVudExpc3RlbmVyOiAocywgZSwgLi4udCkgPT4ge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJGYXJjYXN0ZXJGcmFtZUNhbGxiYWNrXCIsIGUsIC4uLnQpO1xuICB9LFxuICByZW1vdmVFdmVudExpc3RlbmVyOiAocywgZSkgPT4ge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJGYXJjYXN0ZXJGcmFtZUNhbGxiYWNrXCIsIGUpO1xuICB9XG59LCBFeCA9IHR5cGVvZiB3aW5kb3cgPiBcInVcIiA/IHl4IDogd2luZG93ICE9IG51bGwgJiYgd2luZG93LlJlYWN0TmF0aXZlV2ViVmlldyA/IHZ4IDogcHgoKHdpbmRvdyA9PSBudWxsID8gdm9pZCAwIDogd2luZG93LnBhcmVudCkgPz8gd2luZG93KSwgTWUgPSBsZyhFeCksIHV1ID0gUUUoKSwgeHggPSByeCgpO1xuZnVuY3Rpb24gU3goeyBjb2RlOiBzLCBkZXRhaWxzOiBlIH0pIHtcbiAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSA0MDAxOlxuICAgICAgcmV0dXJuIG5ldyBKMCgpO1xuICAgIGNhc2UgNDEwMDpcbiAgICAgIHJldHVybiBuZXcgUTAoKTtcbiAgICBjYXNlIDQyMDA6XG4gICAgICByZXR1cm4gbmV3IGVnKCk7XG4gICAgY2FzZSA0OTAwOlxuICAgICAgcmV0dXJuIG5ldyB0ZygpO1xuICAgIGNhc2UgNDkwMTpcbiAgICAgIHJldHVybiBuZXcgcmcoKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG5ldyBubihzLCBlID8/IFwiVW5rbm93biBwcm92aWRlciBSUEMgZXJyb3JcIik7XG4gIH1cbn1cbmNvbnN0IGZpID0gZXgoe1xuICAuLi51dSxcbiAgYXN5bmMgcmVxdWVzdChzKSB7XG4gICAgY29uc3QgZSA9IHh4LnByZXBhcmUocyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHQgPSBhd2FpdCBNZS5ldGhQcm92aWRlclJlcXVlc3RWMihlKS50aGVuKChyKSA9PiBYMChyLCB7IHJlcXVlc3Q6IGUsIHJhdzogITAgfSkpO1xuICAgICAgaWYgKHQuZXJyb3IpXG4gICAgICAgIHRocm93IFN4KHQuZXJyb3IpO1xuICAgICAgcmV0dXJuIHQucmVzdWx0O1xuICAgIH0gY2F0Y2ggKHQpIHtcbiAgICAgIGlmICh0IGluc3RhbmNlb2YgRXJyb3IgJiYgdC5tZXNzYWdlLm1hdGNoKC9jYW5ub3QgcmVhZCBwcm9wZXJ0eSAnYXBwbHknL2kpKVxuICAgICAgICByZXR1cm4gYXdhaXQgTWUuZXRoUHJvdmlkZXJSZXF1ZXN0KGUpO1xuICAgICAgdGhyb3cgdCBpbnN0YW5jZW9mIG5uIHx8IHQgaW5zdGFuY2VvZiBtciA/IHQgOiBuZXcgQm4oe1xuICAgICAgICBtZXNzYWdlOiB0IGluc3RhbmNlb2YgRXJyb3IgPyB0Lm1lc3NhZ2UgOiB2b2lkIDBcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSk7XG5hc3luYyBmdW5jdGlvbiBieCgpIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzID0gYXdhaXQgTWUuZ2V0Q2FwYWJpbGl0aWVzKCk7XG4gICAgcmV0dXJuICFzLmluY2x1ZGVzKFwid2FsbGV0LmdldEV0aGVyZXVtUHJvdmlkZXJcIikgJiYgIXMuaW5jbHVkZXMoXCJ3YWxsZXQuZ2V0RXZtUHJvdmlkZXJcIikgPyB2b2lkIDAgOiBmaTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZpO1xuICB9XG59XG5mdW5jdGlvbiBkZyhzKSB7XG4gIGNvbnN0IGUgPSBuZXcgQ3VzdG9tRXZlbnQoXCJlaXA2OTYzOmFubm91bmNlUHJvdmlkZXJcIiwgeyBkZXRhaWw6IE9iamVjdC5mcmVlemUocykgfSk7XG4gIHdpbmRvdy5kaXNwYXRjaEV2ZW50KGUpO1xuICBjb25zdCB0ID0gKCkgPT4gd2luZG93LmRpc3BhdGNoRXZlbnQoZSk7XG4gIHJldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImVpcDY5NjM6cmVxdWVzdFByb3ZpZGVyXCIsIHQpLCAoKSA9PiB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVpcDY5NjM6cmVxdWVzdFByb3ZpZGVyXCIsIHQpO1xufVxudHlwZW9mIGRvY3VtZW50IDwgXCJ1XCIgJiYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJlaXA2OTYzOnJlcXVlc3RQcm92aWRlclwiLCAoKSA9PiB7XG4gIE1lLmVpcDY5NjNSZXF1ZXN0UHJvdmlkZXIoKTtcbn0pLCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRmFyY2FzdGVyRnJhbWVFdGhQcm92aWRlckV2ZW50XCIsIChzKSA9PiB7XG4gIGlmIChzIGluc3RhbmNlb2YgTWVzc2FnZUV2ZW50KSB7XG4gICAgY29uc3QgZSA9IHMuZGF0YTtcbiAgICB1dS5lbWl0KGUuZXZlbnQsIC4uLmUucGFyYW1zKTtcbiAgfVxufSksIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJGYXJjYXN0ZXJGcmFtZUV2ZW50XCIsIChzKSA9PiB7XG4gIGlmIChzIGluc3RhbmNlb2YgTWVzc2FnZUV2ZW50KSB7XG4gICAgY29uc3QgZSA9IHMuZGF0YTtcbiAgICBlLmV2ZW50ID09PSBcImVpcDY5NjM6YW5ub3VuY2VQcm92aWRlclwiICYmIGRnKHtcbiAgICAgIGluZm86IGUuaW5mbyxcbiAgICAgIHByb3ZpZGVyOiBmaVxuICAgIH0pO1xuICB9XG59KSk7XG50eXBlb2Ygd2luZG93IDwgXCJ1XCIgJiYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZWlwNjk2MzpyZXF1ZXN0UHJvdmlkZXJcIiwgKCkgPT4ge1xuICBNZS5laXA2OTYzUmVxdWVzdFByb3ZpZGVyKCk7XG59KSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChzKSA9PiB7XG4gIGlmIChzIGluc3RhbmNlb2YgTWVzc2FnZUV2ZW50ICYmIHMuZGF0YS50eXBlID09PSBcImZyYW1lRXRoUHJvdmlkZXJFdmVudFwiKSB7XG4gICAgY29uc3QgZSA9IHMuZGF0YTtcbiAgICB1dS5lbWl0KGUuZXZlbnQsIC4uLmUucGFyYW1zKTtcbiAgfVxufSksIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCAocykgPT4ge1xuICBpZiAocyBpbnN0YW5jZW9mIE1lc3NhZ2VFdmVudCAmJiBzLmRhdGEudHlwZSA9PT0gXCJmcmFtZUV2ZW50XCIpIHtcbiAgICBjb25zdCBlID0gcy5kYXRhLmV2ZW50O1xuICAgIGUuZXZlbnQgPT09IFwiZWlwNjk2Mzphbm5vdW5jZVByb3ZpZGVyXCIgJiYgZGcoe1xuICAgICAgaW5mbzogZS5pbmZvLFxuICAgICAgcHJvdmlkZXI6IGZpXG4gICAgfSk7XG4gIH1cbn0pKTtcbm5ldyBUZXh0RW5jb2RlcigpO1xuY29uc3QgaGcgPSBuZXcgVGV4dERlY29kZXIoKSwgVHggPSAocykgPT4ge1xuICBjb25zdCBlID0gYXRvYihzKSwgdCA9IG5ldyBVaW50OEFycmF5KGUubGVuZ3RoKTtcbiAgZm9yIChsZXQgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKVxuICAgIHRbcl0gPSBlLmNoYXJDb2RlQXQocik7XG4gIHJldHVybiB0O1xufSwgd3ggPSAocykgPT4ge1xuICBsZXQgZSA9IHM7XG4gIGUgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIChlID0gaGcuZGVjb2RlKGUpKSwgZSA9IGUucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIikucmVwbGFjZSgvXFxzL2csIFwiXCIpO1xuICB0cnkge1xuICAgIHJldHVybiBUeChlKTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBpbnB1dCB0byBiZSBkZWNvZGVkIGlzIG5vdCBjb3JyZWN0bHkgZW5jb2RlZC5cIik7XG4gIH1cbn0sIEF4ID0gd3g7XG5mdW5jdGlvbiBJeChzKSB7XG4gIHJldHVybiB0eXBlb2YgcyA9PSBcIm9iamVjdFwiICYmIHMgIT09IG51bGw7XG59XG5mdW5jdGlvbiBfeChzKSB7XG4gIGlmICghSXgocykgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHMpICE9PSBcIltvYmplY3QgT2JqZWN0XVwiKVxuICAgIHJldHVybiAhMTtcbiAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihzKSA9PT0gbnVsbClcbiAgICByZXR1cm4gITA7XG4gIGxldCBlID0gcztcbiAgZm9yICg7IE9iamVjdC5nZXRQcm90b3R5cGVPZihlKSAhPT0gbnVsbDsgKVxuICAgIGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7XG4gIHJldHVybiBPYmplY3QuZ2V0UHJvdG90eXBlT2YocykgPT09IGU7XG59XG5jbGFzcyBkciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHZhciByO1xuICAgIHN1cGVyKGUsIHQpLCB0aGlzLmNvZGUgPSBcIkVSUl9KT1NFX0dFTkVSSUNcIiwgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lLCAociA9IEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSA9PSBudWxsIHx8IHIuY2FsbChFcnJvciwgdGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gIH1cbn1cbmRyLmNvZGUgPSBcIkVSUl9KT1NFX0dFTkVSSUNcIjtcbmNsYXNzIFJ4IGV4dGVuZHMgZHIge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByID0gXCJ1bnNwZWNpZmllZFwiLCBuID0gXCJ1bnNwZWNpZmllZFwiKSB7XG4gICAgc3VwZXIoZSwgeyBjYXVzZTogeyBjbGFpbTogciwgcmVhc29uOiBuLCBwYXlsb2FkOiB0IH0gfSksIHRoaXMuY29kZSA9IFwiRVJSX0pXVF9DTEFJTV9WQUxJREFUSU9OX0ZBSUxFRFwiLCB0aGlzLmNsYWltID0gciwgdGhpcy5yZWFzb24gPSBuLCB0aGlzLnBheWxvYWQgPSB0O1xuICB9XG59XG5SeC5jb2RlID0gXCJFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEXCI7XG5jbGFzcyBMeCBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoZSwgdCwgciA9IFwidW5zcGVjaWZpZWRcIiwgbiA9IFwidW5zcGVjaWZpZWRcIikge1xuICAgIHN1cGVyKGUsIHsgY2F1c2U6IHsgY2xhaW06IHIsIHJlYXNvbjogbiwgcGF5bG9hZDogdCB9IH0pLCB0aGlzLmNvZGUgPSBcIkVSUl9KV1RfRVhQSVJFRFwiLCB0aGlzLmNsYWltID0gciwgdGhpcy5yZWFzb24gPSBuLCB0aGlzLnBheWxvYWQgPSB0O1xuICB9XG59XG5MeC5jb2RlID0gXCJFUlJfSldUX0VYUElSRURcIjtcbmNsYXNzIEN4IGV4dGVuZHMgZHIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmNvZGUgPSBcIkVSUl9KT1NFX0FMR19OT1RfQUxMT1dFRFwiO1xuICB9XG59XG5DeC5jb2RlID0gXCJFUlJfSk9TRV9BTEdfTk9UX0FMTE9XRURcIjtcbmNsYXNzIGt4IGV4dGVuZHMgZHIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpLCB0aGlzLmNvZGUgPSBcIkVSUl9KT1NFX05PVF9TVVBQT1JURURcIjtcbiAgfVxufVxua3guY29kZSA9IFwiRVJSX0pPU0VfTk9UX1NVUFBPUlRFRFwiO1xuY2xhc3MgRHggZXh0ZW5kcyBkciB7XG4gIGNvbnN0cnVjdG9yKGUgPSBcImRlY3J5cHRpb24gb3BlcmF0aW9uIGZhaWxlZFwiLCB0KSB7XG4gICAgc3VwZXIoZSwgdCksIHRoaXMuY29kZSA9IFwiRVJSX0pXRV9ERUNSWVBUSU9OX0ZBSUxFRFwiO1xuICB9XG59XG5EeC5jb2RlID0gXCJFUlJfSldFX0RFQ1JZUFRJT05fRkFJTEVEXCI7XG5jbGFzcyBQeCBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5jb2RlID0gXCJFUlJfSldFX0lOVkFMSURcIjtcbiAgfVxufVxuUHguY29kZSA9IFwiRVJSX0pXRV9JTlZBTElEXCI7XG5jbGFzcyBNeCBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5jb2RlID0gXCJFUlJfSldTX0lOVkFMSURcIjtcbiAgfVxufVxuTXguY29kZSA9IFwiRVJSX0pXU19JTlZBTElEXCI7XG5jbGFzcyBUcyBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5jb2RlID0gXCJFUlJfSldUX0lOVkFMSURcIjtcbiAgfVxufVxuVHMuY29kZSA9IFwiRVJSX0pXVF9JTlZBTElEXCI7XG5jbGFzcyBPeCBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5jb2RlID0gXCJFUlJfSldLX0lOVkFMSURcIjtcbiAgfVxufVxuT3guY29kZSA9IFwiRVJSX0pXS19JTlZBTElEXCI7XG5jbGFzcyBCeCBleHRlbmRzIGRyIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKSwgdGhpcy5jb2RlID0gXCJFUlJfSldLU19JTlZBTElEXCI7XG4gIH1cbn1cbkJ4LmNvZGUgPSBcIkVSUl9KV0tTX0lOVkFMSURcIjtcbmNsYXNzIEZ4IGV4dGVuZHMgZHIge1xuICBjb25zdHJ1Y3RvcihlID0gXCJubyBhcHBsaWNhYmxlIGtleSBmb3VuZCBpbiB0aGUgSlNPTiBXZWIgS2V5IFNldFwiLCB0KSB7XG4gICAgc3VwZXIoZSwgdCksIHRoaXMuY29kZSA9IFwiRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZXCI7XG4gIH1cbn1cbkZ4LmNvZGUgPSBcIkVSUl9KV0tTX05PX01BVENISU5HX0tFWVwiO1xuY2xhc3MgTnggZXh0ZW5kcyBkciB7XG4gIGNvbnN0cnVjdG9yKGUgPSBcIm11bHRpcGxlIG1hdGNoaW5nIGtleXMgZm91bmQgaW4gdGhlIEpTT04gV2ViIEtleSBTZXRcIiwgdCkge1xuICAgIHN1cGVyKGUsIHQpLCB0aGlzLmNvZGUgPSBcIkVSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVNcIjtcbiAgfVxufVxuTnguY29kZSA9IFwiRVJSX0pXS1NfTVVMVElQTEVfTUFUQ0hJTkdfS0VZU1wiO1xuY2xhc3MgVXggZXh0ZW5kcyBkciB7XG4gIGNvbnN0cnVjdG9yKGUgPSBcInJlcXVlc3QgdGltZWQgb3V0XCIsIHQpIHtcbiAgICBzdXBlcihlLCB0KSwgdGhpcy5jb2RlID0gXCJFUlJfSldLU19USU1FT1VUXCI7XG4gIH1cbn1cblV4LmNvZGUgPSBcIkVSUl9KV0tTX1RJTUVPVVRcIjtcbmNsYXNzICR4IGV4dGVuZHMgZHIge1xuICBjb25zdHJ1Y3RvcihlID0gXCJzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZFwiLCB0KSB7XG4gICAgc3VwZXIoZSwgdCksIHRoaXMuY29kZSA9IFwiRVJSX0pXU19TSUdOQVRVUkVfVkVSSUZJQ0FUSU9OX0ZBSUxFRFwiO1xuICB9XG59XG4keC5jb2RlID0gXCJFUlJfSldTX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTEVEXCI7XG5mdW5jdGlvbiBHeChzKSB7XG4gIGlmICh0eXBlb2YgcyAhPSBcInN0cmluZ1wiKVxuICAgIHRocm93IG5ldyBUcyhcIkpXVHMgbXVzdCB1c2UgQ29tcGFjdCBKV1Mgc2VyaWFsaXphdGlvbiwgSldUIG11c3QgYmUgYSBzdHJpbmdcIik7XG4gIGNvbnN0IHsgMTogZSwgbGVuZ3RoOiB0IH0gPSBzLnNwbGl0KFwiLlwiKTtcbiAgaWYgKHQgPT09IDUpXG4gICAgdGhyb3cgbmV3IFRzKFwiT25seSBKV1RzIHVzaW5nIENvbXBhY3QgSldTIHNlcmlhbGl6YXRpb24gY2FuIGJlIGRlY29kZWRcIik7XG4gIGlmICh0ICE9PSAzKVxuICAgIHRocm93IG5ldyBUcyhcIkludmFsaWQgSldUXCIpO1xuICBpZiAoIWUpXG4gICAgdGhyb3cgbmV3IFRzKFwiSldUcyBtdXN0IGNvbnRhaW4gYSBwYXlsb2FkXCIpO1xuICBsZXQgcjtcbiAgdHJ5IHtcbiAgICByID0gQXgoZSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBUcyhcIkZhaWxlZCB0byBiYXNlNjR1cmwgZGVjb2RlIHRoZSBwYXlsb2FkXCIpO1xuICB9XG4gIGxldCBuO1xuICB0cnkge1xuICAgIG4gPSBKU09OLnBhcnNlKGhnLmRlY29kZShyKSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBUcyhcIkZhaWxlZCB0byBwYXJzZSB0aGUgZGVjb2RlZCBwYXlsb2FkIGFzIEpTT05cIik7XG4gIH1cbiAgaWYgKCFfeChuKSlcbiAgICB0aHJvdyBuZXcgVHMoXCJJbnZhbGlkIEpXVCBDbGFpbXMgU2V0XCIpO1xuICByZXR1cm4gbjtcbn1cbmZ1bmN0aW9uIFZ4KHMpIHtcbiAgcmV0dXJuIEd4KHMpO1xufVxuY2xhc3MgbWEgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGUsIHQgPSB7fSkge1xuICAgIGNvbnN0IHIgPSAoKCkgPT4ge1xuICAgICAgdmFyIGk7XG4gICAgICBpZiAodC5jYXVzZSBpbnN0YW5jZW9mIG1hKSB7XG4gICAgICAgIGlmICh0LmNhdXNlLmRldGFpbHMpXG4gICAgICAgICAgcmV0dXJuIHQuY2F1c2UuZGV0YWlscztcbiAgICAgICAgaWYgKHQuY2F1c2Uuc2hvcnRNZXNzYWdlKVxuICAgICAgICAgIHJldHVybiB0LmNhdXNlLnNob3J0TWVzc2FnZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0LmNhdXNlICYmIFwiZGV0YWlsc1wiIGluIHQuY2F1c2UgJiYgdHlwZW9mIHQuY2F1c2UuZGV0YWlscyA9PSBcInN0cmluZ1wiID8gdC5jYXVzZS5kZXRhaWxzIDogKGkgPSB0LmNhdXNlKSAhPSBudWxsICYmIGkubWVzc2FnZSA/IHQuY2F1c2UubWVzc2FnZSA6IHQuZGV0YWlscztcbiAgICB9KSgpLCBuID0gW1xuICAgICAgZSB8fCBcIkFuIGVycm9yIG9jY3VycmVkLlwiLFxuICAgICAgLi4udC5tZXRhTWVzc2FnZXMgPyBbXCJcIiwgLi4udC5tZXRhTWVzc2FnZXNdIDogW10sXG4gICAgICAuLi5yID8gW1xuICAgICAgICBcIlwiLFxuICAgICAgICByID8gYERldGFpbHM6ICR7cn1gIDogdm9pZCAwXG4gICAgICBdIDogW11cbiAgICBdLmZpbHRlcigoaSkgPT4gdHlwZW9mIGkgPT0gXCJzdHJpbmdcIikuam9pbihgXG5gKTtcbiAgICBzdXBlcihuLCB0LmNhdXNlID8geyBjYXVzZTogdC5jYXVzZSB9IDogdm9pZCAwKSwgdGhpcy5uYW1lID0gXCJCYXNlRXJyb3JcIiwgdGhpcy5jYXVzZSA9IHQuY2F1c2UsIHRoaXMuZGV0YWlscyA9IHIsIHRoaXMuc2hvcnRNZXNzYWdlID0gZTtcbiAgfVxufVxuY2xhc3MgZmcgZXh0ZW5kcyBtYSB7XG4gIGNvbnN0cnVjdG9yKHsgc3RhdHVzOiBlIH0pIHtcbiAgICBzdXBlcihgUmVxdWVzdCBmYWlsZWQgd2l0aCBzdGF0dXMgJHtlfWApLCB0aGlzLm5hbWUgPSBcIlJlcXVlc3RGYWlsZWRFcnJvclwiO1xuICB9XG59XG5jbGFzcyBqeCBleHRlbmRzIG1hIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHN1cGVyKGUpLCB0aGlzLm5hbWUgPSBcIkludmFsaWRUb2tlblwiO1xuICB9XG59XG5hc3luYyBmdW5jdGlvbiBLeCh7IG9yaWdpbjogcyB9KSB7XG4gIGNvbnN0IGUgPSBhd2FpdCBmZXRjaChgJHtzfS9ub25jZWAsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiXG4gIH0pO1xuICBpZiAoIWUub2spXG4gICAgdGhyb3cgbmV3IGZnKHsgc3RhdHVzOiBlLnN0YXR1cyB9KTtcbiAgcmV0dXJuIGF3YWl0IGUuanNvbigpO1xufVxuYXN5bmMgZnVuY3Rpb24gSHgoeyBvcmlnaW46IHMgfSwgZSkge1xuICBjb25zdCB0ID0gYXdhaXQgZmV0Y2goYCR7c30vdmVyaWZ5LXNpd2ZgLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0pLFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGUpXG4gIH0pO1xuICBpZiAoIXQub2spXG4gICAgdGhyb3cgbmV3IGZnKHsgc3RhdHVzOiB0LnN0YXR1cyB9KTtcbiAgY29uc3QgciA9IGF3YWl0IHQuanNvbigpO1xuICBpZiAoci52YWxpZCA9PT0gITEpXG4gICAgdGhyb3cgbmV3IGp4KHIubWVzc2FnZSA/PyBcInVua25vd25cIik7XG4gIHJldHVybiB7IHRva2VuOiByLnRva2VuIH07XG59XG5mdW5jdGlvbiBxeChzID0ge30pIHtcbiAgcmV0dXJuIHtcbiAgICBvcmlnaW46IHMub3JpZ2luID8/IFwiaHR0cHM6Ly9hdXRoLmZhcmNhc3Rlci54eXpcIlxuICB9O1xufVxuZnVuY3Rpb24gV3gocyA9IHt9KSB7XG4gIGNvbnN0IGUgPSBxeChzKTtcbiAgcmV0dXJuIHtcbiAgICBnZW5lcmF0ZU5vbmNlOiAoKSA9PiBLeChlKSxcbiAgICB2ZXJpZnlTaXdmOiAodCkgPT4gSHgoZSwgdClcbiAgfTtcbn1cbmNvbnN0IHp4ID0gL14oPzooPzxzY2hlbWU+W2EtekEtWl1bYS16QS1aMC05Ky0uXSopOlxcL1xcLyk/KD88ZG9tYWluPlthLXpBLVowLTkrLS5dKig/OjpbMC05XXsxLDV9KT8pICg/OndhbnRzIHlvdSB0byBzaWduIGluIHdpdGggeW91ciBFdGhlcmV1bSBhY2NvdW50OlxcbikoPzxhZGRyZXNzPjB4W2EtZkEtRjAtOV17NDB9KVxcblxcbig/Oig/PHN0YXRlbWVudD4uKilcXG5cXG4pPy8sIFl4ID0gLyg/OlVSSTogKD88dXJpPi4rKSlcXG4oPzpWZXJzaW9uOiAoPzx2ZXJzaW9uPi4rKSlcXG4oPzpDaGFpbiBJRDogKD88Y2hhaW5JZD5cXGQrKSlcXG4oPzpOb25jZTogKD88bm9uY2U+W2EtekEtWjAtOV0rKSlcXG4oPzpJc3N1ZWQgQXQ6ICg/PGlzc3VlZEF0Pi4rKSkoPzpcXG5FeHBpcmF0aW9uIFRpbWU6ICg/PGV4cGlyYXRpb25UaW1lPi4rKSk/KD86XFxuTm90IEJlZm9yZTogKD88bm90QmVmb3JlPi4rKSk/KD86XFxuUmVxdWVzdCBJRDogKD88cmVxdWVzdElkPi4rKSk/LztcbmZ1bmN0aW9uIFp4KHMpIHtcbiAgdmFyIGQsIGgsIGY7XG4gIGNvbnN0IHsgc2NoZW1lOiBlLCBzdGF0ZW1lbnQ6IHQsIC4uLnIgfSA9ICgoZCA9IHMubWF0Y2goengpKSA9PSBudWxsID8gdm9pZCAwIDogZC5ncm91cHMpID8/IHt9LCB7IGNoYWluSWQ6IG4sIGV4cGlyYXRpb25UaW1lOiBpLCBpc3N1ZWRBdDogbywgbm90QmVmb3JlOiBhLCByZXF1ZXN0SWQ6IGwsIC4uLmMgfSA9ICgoaCA9IHMubWF0Y2goWXgpKSA9PSBudWxsID8gdm9pZCAwIDogaC5ncm91cHMpID8/IHt9LCB1ID0gKGYgPSBzLnNwbGl0KFwiUmVzb3VyY2VzOlwiKVsxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGYuc3BsaXQoYFxuLSBgKS5zbGljZSgxKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5yLFxuICAgIC4uLmMsXG4gICAgLi4ubiA/IHsgY2hhaW5JZDogTnVtYmVyKG4pIH0gOiB7fSxcbiAgICAuLi5pID8geyBleHBpcmF0aW9uVGltZTogbmV3IERhdGUoaSkgfSA6IHt9LFxuICAgIC4uLm8gPyB7IGlzc3VlZEF0OiBuZXcgRGF0ZShvKSB9IDoge30sXG4gICAgLi4uYSA/IHsgbm90QmVmb3JlOiBuZXcgRGF0ZShhKSB9IDoge30sXG4gICAgLi4ubCA/IHsgcmVxdWVzdElkOiBsIH0gOiB7fSxcbiAgICAuLi51ID8geyByZXNvdXJjZXM6IHUgfSA6IHt9LFxuICAgIC4uLmUgPyB7IHNjaGVtZTogZSB9IDoge30sXG4gICAgLi4udCA/IHsgc3RhdGVtZW50OiB0IH0gOiB7fVxuICB9O1xufVxuY29uc3QgamQgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcbiAgbGV0IHMsIGU7XG4gIGFzeW5jIGZ1bmN0aW9uIHQocikge1xuICAgIGNvbnN0IG4gPSBXeCh7XG4gICAgICBvcmlnaW46IHIucXVpY2tBdXRoU2VydmVyT3JpZ2luXG4gICAgfSksIHsgbm9uY2U6IGkgfSA9IGF3YWl0IG4uZ2VuZXJhdGVOb25jZSgpLCBvID0gYXdhaXQgTWUuc2lnbkluKHtcbiAgICAgIG5vbmNlOiBpLFxuICAgICAgYWNjZXB0QXV0aEFkZHJlc3M6ICEwXG4gICAgfSk7XG4gICAgaWYgKG8ucmVzdWx0KSB7XG4gICAgICBjb25zdCBhID0gWngoby5yZXN1bHQubWVzc2FnZSk7XG4gICAgICBpZiAoIWEuZG9tYWluKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNaXNzaW5nIGRvbWFpbiBvbiBTSVdFIG1lc3NhZ2VcIik7XG4gICAgICBjb25zdCBsID0gYXdhaXQgbi52ZXJpZnlTaXdmKHtcbiAgICAgICAgZG9tYWluOiBhLmRvbWFpbixcbiAgICAgICAgbWVzc2FnZTogby5yZXN1bHQubWVzc2FnZSxcbiAgICAgICAgc2lnbmF0dXJlOiBvLnJlc3VsdC5zaWduYXR1cmVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHMgPSB7XG4gICAgICAgIHRva2VuOiBsLnRva2VuLFxuICAgICAgICBwYXlsb2FkOiBWeChsLnRva2VuKVxuICAgICAgfSwgbDtcbiAgICB9XG4gICAgdGhyb3cgby5lcnJvci50eXBlID09PSBcInJlamVjdGVkX2J5X3VzZXJcIiA/IG5ldyBPZigpIDogbmV3IEVycm9yKFwiVW5yZWFjaGFibGVcIik7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBnZXQgdG9rZW4oKSB7XG4gICAgICBpZiAocyAmJiBuZXcgRGF0ZShzLnBheWxvYWQuZXhwICogMWUzKSA+IG5ldyBEYXRlKERhdGUubm93KCkgKyAxNWUzKSlcbiAgICAgICAgcmV0dXJuIHMudG9rZW47XG4gICAgfSxcbiAgICBhc3luYyBnZXRUb2tlbihyID0ge30pIHtcbiAgICAgIGNvbnN0IG4gPSByLmZvcmNlID8/ICExO1xuICAgICAgcmV0dXJuIHMgJiYgIW4gJiYgbmV3IERhdGUocy5wYXlsb2FkLmV4cCAqIDFlMykgPiBuZXcgRGF0ZShEYXRlLm5vdygpICsgMTVlMykgPyB7IHRva2VuOiBzLnRva2VuIH0gOiAoZSB8fCAoZSA9IHQocikpLCBlLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICBlID0gdm9pZCAwO1xuICAgICAgfSksIGUpO1xuICAgIH0sXG4gICAgYXN5bmMgZmV0Y2gociwgbikge1xuICAgICAgY29uc3QgeyB0b2tlbjogaSB9ID0gYXdhaXQgdGhpcy5nZXRUb2tlbigpLCBvID0gbmV3IEhlYWRlcnMobiA9PSBudWxsID8gdm9pZCAwIDogbi5oZWFkZXJzKTtcbiAgICAgIHJldHVybiBvLnNldChcIkF1dGhvcml6YXRpb25cIiwgYEJlYXJlciAke2l9YCksIGZldGNoKHIsIHtcbiAgICAgICAgLi4ubixcbiAgICAgICAgaGVhZGVyczogb1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufSkoKTtcbmZ1bmN0aW9uIFh4KCkge1xuICBjb25zdCBzID0gbmV3IEwwKCk7XG4gIHJldHVybiB7XG4gICAgZ2V0IGV2ZW50TmFtZXMoKSB7XG4gICAgICByZXR1cm4gcy5ldmVudE5hbWVzLmJpbmQocyk7XG4gICAgfSxcbiAgICBnZXQgbGlzdGVuZXJDb3VudCgpIHtcbiAgICAgIHJldHVybiBzLmxpc3RlbmVyQ291bnQuYmluZChzKTtcbiAgICB9LFxuICAgIGdldCBsaXN0ZW5lcnMoKSB7XG4gICAgICByZXR1cm4gcy5saXN0ZW5lcnMuYmluZChzKTtcbiAgICB9LFxuICAgIGFkZExpc3RlbmVyOiBzLmFkZExpc3RlbmVyLmJpbmQocyksXG4gICAgZW1pdDogcy5lbWl0LmJpbmQocyksXG4gICAgb2ZmOiBzLm9mZi5iaW5kKHMpLFxuICAgIG9uOiBzLm9uLmJpbmQocyksXG4gICAgb25jZTogcy5vbmNlLmJpbmQocyksXG4gICAgcmVtb3ZlQWxsTGlzdGVuZXJzOiBzLnJlbW92ZUFsbExpc3RlbmVycy5iaW5kKHMpLFxuICAgIHJlbW92ZUxpc3RlbmVyOiBzLnJlbW92ZUxpc3RlbmVyLmJpbmQocylcbiAgfTtcbn1cbmNvbnN0IG5yID0gWHgoKSwgeyBzb2xhbmFQcm92aWRlclJlcXVlc3Q6IEtkIH0gPSBNZTtcbmxldCBnZztcbktkICYmIChnZyA9IFZFKEtFKEtkKSkpO1xuYXN5bmMgZnVuY3Rpb24gSGQoKSB7XG4gIGxldCBzO1xuICB0cnkge1xuICAgIHMgPSBhd2FpdCBNZS5nZXRDYXBhYmlsaXRpZXMoKTtcbiAgfSBjYXRjaCB7XG4gIH1cbiAgaWYgKHMgIT0gbnVsbCAmJiBzLmluY2x1ZGVzKFwid2FsbGV0LmdldFNvbGFuYVByb3ZpZGVyXCIpKVxuICAgIHJldHVybiBnZztcbn1cbmxldCBxZCA9IG51bGw7XG5hc3luYyBmdW5jdGlvbiBKeChzID0gMWUzKSB7XG4gIGlmIChxZCA9PT0gITApXG4gICAgcmV0dXJuICEwO1xuICBpZiAodHlwZW9mIHdpbmRvdyA+IFwidVwiIHx8ICF3aW5kb3cuUmVhY3ROYXRpdmVXZWJWaWV3ICYmIHdpbmRvdyA9PT0gd2luZG93LnBhcmVudClcbiAgICByZXR1cm4gITE7XG4gIGNvbnN0IGUgPSBhd2FpdCBQcm9taXNlLnJhY2UoW1xuICAgIE1lLmNvbnRleHQudGhlbigodCkgPT4gISF0KSxcbiAgICAvLyBDaGVjayBpZiBjb250ZXh0IHJlc29sdmVzIHRvIHRydXRoeVxuICAgIG5ldyBQcm9taXNlKCh0KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHQoITEpLCBzKTtcbiAgICB9KVxuICBdKS5jYXRjaCgoKSA9PiAhMSk7XG4gIHJldHVybiBlICYmIChxZCA9ICEwKSwgZTtcbn1cbmNvbnN0IFdkID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCBzID0gYXdhaXQgTWUuYWRkRnJhbWUoKTtcbiAgaWYgKHMucmVzdWx0KVxuICAgIHJldHVybiBzLnJlc3VsdDtcbiAgdGhyb3cgcy5lcnJvci50eXBlID09PSBcImludmFsaWRfZG9tYWluX21hbmlmZXN0XCIgPyBuZXcgVG0oKSA6IHMuZXJyb3IudHlwZSA9PT0gXCJyZWplY3RlZF9ieV91c2VyXCIgPyBuZXcgd20oKSA6IG5ldyBFcnJvcihcIlVucmVhY2hhYmxlXCIpO1xufSwgaHQgPSB7XG4gIC4uLm5yLFxuICBnZXRDYXBhYmlsaXRpZXM6IE1lLmdldENhcGFiaWxpdGllcyxcbiAgZ2V0Q2hhaW5zOiBNZS5nZXRDaGFpbnMsXG4gIGlzSW5NaW5pQXBwOiBKeCxcbiAgY29udGV4dDogTWUuY29udGV4dCxcbiAgYmFjazogSEUoeyBtaW5pQXBwSG9zdDogTWUsIGVtaXR0ZXI6IG5yIH0pLFxuICBxdWlja0F1dGg6IGpkLFxuICBhY3Rpb25zOiB7XG4gICAgc2V0UHJpbWFyeUJ1dHRvbjogTWUuc2V0UHJpbWFyeUJ1dHRvbi5iaW5kKE1lKSxcbiAgICByZWFkeTogYXN5bmMgKHMgPSB7fSkgPT4gYXdhaXQgTWUucmVhZHkocyksXG4gICAgY2xvc2U6IE1lLmNsb3NlLmJpbmQoTWUpLFxuICAgIHZpZXdDYXN0OiBNZS52aWV3Q2FzdC5iaW5kKE1lKSxcbiAgICB2aWV3UHJvZmlsZTogTWUudmlld1Byb2ZpbGUuYmluZChNZSksXG4gICAgb3Blbk1pbmlBcHA6IE1lLm9wZW5NaW5pQXBwLmJpbmQoTWUpLFxuICAgIHNpZ25JbjogYXN5bmMgKHMpID0+IHtcbiAgICAgIGNvbnN0IGUgPSBhd2FpdCBNZS5zaWduSW4ocyk7XG4gICAgICBpZiAoZS5yZXN1bHQpXG4gICAgICAgIHJldHVybiBlLnJlc3VsdDtcbiAgICAgIHRocm93IGUuZXJyb3IudHlwZSA9PT0gXCJyZWplY3RlZF9ieV91c2VyXCIgPyBuZXcgT2YoKSA6IG5ldyBFcnJvcihcIlVucmVhY2hhYmxlXCIpO1xuICAgIH0sXG4gICAgb3BlblVybDogKHMpID0+IHtcbiAgICAgIGNvbnN0IGUgPSB0eXBlb2YgcyA9PSBcInN0cmluZ1wiID8gcyA6IHMudXJsO1xuICAgICAgcmV0dXJuIE1lLm9wZW5VcmwoZS50cmltKCkpO1xuICAgIH0sXG4gICAgYWRkRnJhbWU6IFdkLFxuICAgIGFkZE1pbmlBcHA6IFdkLFxuICAgIGNvbXBvc2VDYXN0KHMgPSB7fSkge1xuICAgICAgcmV0dXJuIE1lLmNvbXBvc2VDYXN0KHMpO1xuICAgIH0sXG4gICAgdmlld1Rva2VuOiBNZS52aWV3VG9rZW4uYmluZChNZSksXG4gICAgc2VuZFRva2VuOiBNZS5zZW5kVG9rZW4uYmluZChNZSksXG4gICAgc3dhcFRva2VuOiBNZS5zd2FwVG9rZW4uYmluZChNZSksXG4gICAgcmVxdWVzdENhbWVyYUFuZE1pY3JvcGhvbmVBY2Nlc3M6IE1lLnJlcXVlc3RDYW1lcmFBbmRNaWNyb3Bob25lQWNjZXNzLmJpbmQoTWUpXG4gIH0sXG4gIGV4cGVyaW1lbnRhbDoge1xuICAgIGdldFNvbGFuYVByb3ZpZGVyOiBIZCxcbiAgICBzaWduTWFuaWZlc3Q6IGFzeW5jIChzKSA9PiB7XG4gICAgICBjb25zdCBlID0gYXdhaXQgTWUuc2lnbk1hbmlmZXN0KHMpO1xuICAgICAgaWYgKGUucmVzdWx0KVxuICAgICAgICByZXR1cm4gZS5yZXN1bHQ7XG4gICAgICB0aHJvdyBlLmVycm9yLnR5cGUgPT09IFwicmVqZWN0ZWRfYnlfdXNlclwiID8gbmV3IEFtKCkgOiBlLmVycm9yLnR5cGUgPT09IFwiaW52YWxpZF9kb21haW5cIiA/IG5ldyBJbSgpIDogZS5lcnJvci50eXBlID09PSBcImdlbmVyaWNfZXJyb3JcIiA/IG5ldyBfbShlLmVycm9yLm1lc3NhZ2UpIDogbmV3IEVycm9yKFwiVW5yZWFjaGFibGVcIik7XG4gICAgfSxcbiAgICBxdWlja0F1dGgocykge1xuICAgICAgcmV0dXJuIGpkLmdldFRva2VuKHMpO1xuICAgIH1cbiAgfSxcbiAgd2FsbGV0OiB7XG4gICAgZXRoUHJvdmlkZXI6IGZpLFxuICAgIGdldEV0aGVyZXVtUHJvdmlkZXI6IGJ4LFxuICAgIGdldFNvbGFuYVByb3ZpZGVyOiBIZFxuICB9LFxuICBoYXB0aWNzOiB7XG4gICAgaW1wYWN0T2NjdXJyZWQ6IE1lLmltcGFjdE9jY3VycmVkLmJpbmQoTWUpLFxuICAgIG5vdGlmaWNhdGlvbk9jY3VycmVkOiBNZS5ub3RpZmljYXRpb25PY2N1cnJlZC5iaW5kKE1lKSxcbiAgICBzZWxlY3Rpb25DaGFuZ2VkOiBNZS5zZWxlY3Rpb25DaGFuZ2VkLmJpbmQoTWUpXG4gIH1cbn07XG50eXBlb2YgZG9jdW1lbnQgPCBcInVcIiAmJiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRmFyY2FzdGVyRnJhbWVFdmVudFwiLCAocykgPT4ge1xuICBpZiAocyBpbnN0YW5jZW9mIE1lc3NhZ2VFdmVudCkge1xuICAgIGNvbnN0IGUgPSBzLmRhdGE7XG4gICAgZS5ldmVudCA9PT0gXCJwcmltYXJ5X2J1dHRvbl9jbGlja2VkXCIgPyBuci5lbWl0KFwicHJpbWFyeUJ1dHRvbkNsaWNrZWRcIikgOiBlLmV2ZW50ID09PSBcIm1pbmlhcHBfYWRkZWRcIiA/IG5yLmVtaXQoXCJtaW5pQXBwQWRkZWRcIiwge1xuICAgICAgbm90aWZpY2F0aW9uRGV0YWlsczogZS5ub3RpZmljYXRpb25EZXRhaWxzXG4gICAgfSkgOiBlLmV2ZW50ID09PSBcIm1pbmlhcHBfYWRkX3JlamVjdGVkXCIgPyBuci5lbWl0KFwibWluaUFwcEFkZFJlamVjdGVkXCIsIHsgcmVhc29uOiBlLnJlYXNvbiB9KSA6IGUuZXZlbnQgPT09IFwibWluaWFwcF9yZW1vdmVkXCIgPyBuci5lbWl0KFwibWluaUFwcFJlbW92ZWRcIikgOiBlLmV2ZW50ID09PSBcIm5vdGlmaWNhdGlvbnNfZW5hYmxlZFwiID8gbnIuZW1pdChcIm5vdGlmaWNhdGlvbnNFbmFibGVkXCIsIHtcbiAgICAgIG5vdGlmaWNhdGlvbkRldGFpbHM6IGUubm90aWZpY2F0aW9uRGV0YWlsc1xuICAgIH0pIDogZS5ldmVudCA9PT0gXCJub3RpZmljYXRpb25zX2Rpc2FibGVkXCIgPyBuci5lbWl0KFwibm90aWZpY2F0aW9uc0Rpc2FibGVkXCIpIDogZS5ldmVudCA9PT0gXCJiYWNrX25hdmlnYXRpb25fdHJpZ2dlcmVkXCIgJiYgbnIuZW1pdChcImJhY2tOYXZpZ2F0aW9uVHJpZ2dlcmVkXCIpO1xuICB9XG59KTtcbnR5cGVvZiB3aW5kb3cgPCBcInVcIiAmJiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKHMpID0+IHtcbiAgaWYgKHMgaW5zdGFuY2VvZiBNZXNzYWdlRXZlbnQgJiYgcy5kYXRhLnR5cGUgPT09IFwiZnJhbWVFdmVudFwiKSB7XG4gICAgY29uc3QgZSA9IHMuZGF0YS5ldmVudDtcbiAgICBlLmV2ZW50ID09PSBcInByaW1hcnlfYnV0dG9uX2NsaWNrZWRcIiA/IG5yLmVtaXQoXCJwcmltYXJ5QnV0dG9uQ2xpY2tlZFwiKSA6IGUuZXZlbnQgPT09IFwibWluaWFwcF9hZGRlZFwiID8gbnIuZW1pdChcIm1pbmlBcHBBZGRlZFwiLCB7XG4gICAgICBub3RpZmljYXRpb25EZXRhaWxzOiBlLm5vdGlmaWNhdGlvbkRldGFpbHNcbiAgICB9KSA6IGUuZXZlbnQgPT09IFwibWluaWFwcF9hZGRfcmVqZWN0ZWRcIiA/IG5yLmVtaXQoXCJtaW5pQXBwQWRkUmVqZWN0ZWRcIiwgeyByZWFzb246IGUucmVhc29uIH0pIDogZS5ldmVudCA9PT0gXCJtaW5pYXBwX3JlbW92ZWRcIiA/IG5yLmVtaXQoXCJtaW5pQXBwUmVtb3ZlZFwiKSA6IGUuZXZlbnQgPT09IFwibm90aWZpY2F0aW9uc19lbmFibGVkXCIgPyBuci5lbWl0KFwibm90aWZpY2F0aW9uc0VuYWJsZWRcIiwge1xuICAgICAgbm90aWZpY2F0aW9uRGV0YWlsczogZS5ub3RpZmljYXRpb25EZXRhaWxzXG4gICAgfSkgOiBlLmV2ZW50ID09PSBcIm5vdGlmaWNhdGlvbnNfZGlzYWJsZWRcIiA/IG5yLmVtaXQoXCJub3RpZmljYXRpb25zRGlzYWJsZWRcIikgOiBlLmV2ZW50ID09PSBcImJhY2tfbmF2aWdhdGlvbl90cmlnZ2VyZWRcIiAmJiBuci5lbWl0KFwiYmFja05hdmlnYXRpb25UcmlnZ2VyZWRcIik7XG4gIH1cbn0pO1xuZnVuY3Rpb24gUXgocykge1xuICBpZiAodHlwZW9mIHdpbmRvdyA+IFwidVwiKVxuICAgIHJldHVybjtcbiAgY29uc3QgZSA9ICh0KSA9PiBzKHQuZGV0YWlsKTtcbiAgcmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiZWlwNjk2Mzphbm5vdW5jZVByb3ZpZGVyXCIsIGUpLCB3aW5kb3cuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJlaXA2OTYzOnJlcXVlc3RQcm92aWRlclwiKSksICgpID0+IHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiZWlwNjk2Mzphbm5vdW5jZVByb3ZpZGVyXCIsIGUpO1xufVxuZnVuY3Rpb24gZVMoKSB7XG4gIGNvbnN0IHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBsZXQgZSA9IFtdO1xuICBjb25zdCB0ID0gKCkgPT4gUXgoKG4pID0+IHtcbiAgICBlLnNvbWUoKHsgaW5mbzogaSB9KSA9PiBpLnV1aWQgPT09IG4uaW5mby51dWlkKSB8fCAoZSA9IFsuLi5lLCBuXSwgcy5mb3JFYWNoKChpKSA9PiBpKGUsIHsgYWRkZWQ6IFtuXSB9KSkpO1xuICB9KTtcbiAgbGV0IHIgPSB0KCk7XG4gIHJldHVybiB7XG4gICAgX2xpc3RlbmVycygpIHtcbiAgICAgIHJldHVybiBzO1xuICAgIH0sXG4gICAgY2xlYXIoKSB7XG4gICAgICBzLmZvckVhY2goKG4pID0+IG4oW10sIHsgcmVtb3ZlZDogWy4uLmVdIH0pKSwgZSA9IFtdO1xuICAgIH0sXG4gICAgZGVzdHJveSgpIHtcbiAgICAgIHRoaXMuY2xlYXIoKSwgcy5jbGVhcigpLCByID09IG51bGwgfHwgcigpO1xuICAgIH0sXG4gICAgZmluZFByb3ZpZGVyKHsgcmRuczogbiB9KSB7XG4gICAgICByZXR1cm4gZS5maW5kKChpKSA9PiBpLmluZm8ucmRucyA9PT0gbik7XG4gICAgfSxcbiAgICBnZXRQcm92aWRlcnMoKSB7XG4gICAgICByZXR1cm4gZTtcbiAgICB9LFxuICAgIHJlc2V0KCkge1xuICAgICAgdGhpcy5jbGVhcigpLCByID09IG51bGwgfHwgcigpLCByID0gdCgpO1xuICAgIH0sXG4gICAgc3Vic2NyaWJlKG4sIHsgZW1pdEltbWVkaWF0ZWx5OiBpIH0gPSB7fSkge1xuICAgICAgcmV0dXJuIHMuYWRkKG4pLCBpICYmIG4oZSwgeyBhZGRlZDogZSB9KSwgKCkgPT4gcy5kZWxldGUobik7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdFMocywgZSA9IHt9LCB0KSB7XG4gIGlmICghdCB8fCB0ID09PSBcIlwiKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhcIkFtcGxpdHVkZTogU2tpcHBpbmcgZXZlbnQgdHJhY2tpbmcgLSBubyB1c2VySWQgYXZhaWxhYmxlIHlldFwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgciA9IHtcbiAgICBldmVudF90eXBlOiBzLFxuICAgIGFwaV9rZXk6IFwiMGM0ZmU0NjE3MWI5YmI4ZWNhMmNhNjFlYjcxZjJlMTlcIixcbiAgICB0aW1lOiBEYXRlLm5vdygpLFxuICAgIHVzZXJfaWQ6IHQsXG4gICAgLi4uT2JqZWN0LmtleXMoZSkubGVuZ3RoICYmIHtcbiAgICAgIGV2ZW50X3Byb3BlcnRpZXM6IGVcbiAgICB9XG4gIH07XG4gIGZldGNoKFwiaHR0cHM6Ly9hcGkyLmFtcGxpdHVkZS5jb20vMi9odHRwYXBpXCIsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiXG4gICAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBhcGlfa2V5OiBcIjBjNGZlNDYxNzFiOWJiOGVjYTJjYTYxZWI3MWYyZTE5XCIsXG4gICAgICBldmVudHM6IFtyXVxuICAgIH0pXG4gIH0pLnRoZW4oKG4pID0+IHtcbiAgICBuLm9rIHx8IGNvbnNvbGUuZGVidWcoXCJBbXBsaXR1ZGUgcmVzcG9uc2UgZXJyb3I6XCIsIG4uc3RhdHVzLCBuLnN0YXR1c1RleHQpO1xuICB9KS5jYXRjaCgobikgPT4ge1xuICAgIGNvbnNvbGUuZGVidWcoXCJBbXBsaXR1ZGUgdHJhY2tpbmcgZXJyb3I6XCIsIG4pO1xuICB9KTtcbn1cbmNvbnN0IHBnID0gYWEoe1xuICBhbmFseXRpY3NFbmFibGVkOiAhMSxcbiAgYmFja0J1dHRvbkVuYWJsZWQ6ICExLFxuICByZXR1cm5Vcmw6IHZvaWQgMFxufSksIG1nID0gc3QuY3JlYXRlQ29udGV4dCh2b2lkIDApO1xuZnVuY3Rpb24gclMoKSB7XG4gIGNvbnN0IHtcbiAgICBhbmFseXRpY3NFbmFibGVkOiBzLFxuICAgIGJhY2tCdXR0b25FbmFibGVkOiBlLFxuICAgIHJldHVyblVybDogdFxuICB9ID0gQWkocGcpLCBbciwgbl0gPSBxZSghMSksIFtpLCBvXSA9IHFlKG51bGwpLCBbYSwgbF0gPSBxZSghMSksIFtjLCB1XSA9IHFlKG51bGwpLCBbZCwgaF0gPSBxZShcIlwiKSwgW2YsIHBdID0gcWUoe30pLCBbeSwgRV0gPSBxZShcIlwiKSwgW2IsIFJdID0gcWUoW10pLCBbQSwgRl0gPSBxZShcIlwiKSwgTSA9IGJ0KC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCkpLCBIID0gYnQoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSksIEsgPSBidCh7fSksIGogPSBidChcIlwiKTtcbiAgSy5jdXJyZW50ID0gZiwgai5jdXJyZW50ID0geTtcbiAgY29uc3QgQyA9IHV0KChtLCB2ID0ge30sIFApID0+IHtcbiAgICBzICYmIHRTKG0sIHYsIFApO1xuICB9LCBbc10pLCBrID0gdXQoKG0pID0+IHtcbiAgICBSKCh2KSA9PiB7XG4gICAgICBjb25zdCBQID0gWy4uLnYsIG1dO1xuICAgICAgcmV0dXJuIEMoXCJuYXZpZ2F0aW9uLnNldEFjdGl2ZVRhYlwiLCB7XG4gICAgICAgIC4uLksuY3VycmVudCxcbiAgICAgICAgdG9UYWI6IG0sXG4gICAgICAgIGhpc3RvcnlMZW5ndGg6IFAubGVuZ3RoXG4gICAgICB9LCBqLmN1cnJlbnQpLCBQO1xuICAgIH0pLCBGKG0pO1xuICB9LCBbQ10pLCAkID0gdXQoYXN5bmMgKG0pID0+IHtcbiAgICBjb25zdCB2ID0gdHlwZW9mIG0gPT0gXCJzdHJpbmdcIiA/IG0gOiBtLnVybDtcbiAgICBhd2FpdCBodC5pc0luTWluaUFwcCgpID8gYXdhaXQgaHQuYWN0aW9ucy5vcGVuVXJsKHYpIDogd2luZG93Lm9wZW4odiwgXCJfYmxhbmtcIik7XG4gIH0sIFtdKSwgVyA9IHV0KGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBodC5pc0luTWluaUFwcCgpID8gYXdhaXQgaHQuYWN0aW9ucy5jbG9zZSgpIDogd2luZG93LmNsb3NlKCk7XG4gIH0sIFtdKSwgXyA9IHV0KCgpID0+IHtcbiAgICBSKChtKSA9PiB7XG4gICAgICBpZiAobS5sZW5ndGggPT09IDApXG4gICAgICAgIHJldHVybiB0ICYmICQodCksIG07XG4gICAgICBjb25zdCB2ID0gbS5zbGljZSgwLCAtMSksIFAgPSB2Lmxlbmd0aCA+IDAgPyB2W3YubGVuZ3RoIC0gMV0gOiBcIlwiO1xuICAgICAgcmV0dXJuIEYoUCksIEMoXCJuYXZpZ2F0aW9uLm5hdkJhY2tcIiwge1xuICAgICAgICAuLi5LLmN1cnJlbnQsXG4gICAgICAgIGZyb21UYWI6IG1bbS5sZW5ndGggLSAxXSxcbiAgICAgICAgdG9UYWI6IFAsXG4gICAgICAgIGhpc3RvcnlMZW5ndGg6IHYubGVuZ3RoXG4gICAgICB9LCBqLmN1cnJlbnQpLCB2O1xuICAgIH0pO1xuICB9LCBbQywgdCwgJF0pLCBnID0gdXQoKG0pID0+IHtcbiAgICBSKFttXSksIEYobSksIEMoXCJuYXZpZ2F0aW9uLnNldEluaXRpYWxUYWJcIiwge1xuICAgICAgLi4uSy5jdXJyZW50LFxuICAgICAgdGFiOiBtXG4gICAgfSwgai5jdXJyZW50KTtcbiAgfSwgW0NdKSwgeCA9IHV0KGFzeW5jIChtKSA9PiAoQyhcImhhcHRpY3MuaW1wYWN0T2NjdXJyZWRcIiwge1xuICAgIC4uLksuY3VycmVudCxcbiAgICBoYXB0aWNUeXBlOiBtXG4gIH0sIGouY3VycmVudCksIGh0LmhhcHRpY3MuaW1wYWN0T2NjdXJyZWQobSkpLCBbQ10pLCB3ID0gdXQoYXN5bmMgKG0pID0+IChDKFwiaGFwdGljcy5ub3RpZmljYXRpb25PY2N1cnJlZFwiLCB7XG4gICAgLi4uSy5jdXJyZW50LFxuICAgIGhhcHRpY1R5cGU6IG1cbiAgfSwgai5jdXJyZW50KSwgaHQuaGFwdGljcy5ub3RpZmljYXRpb25PY2N1cnJlZChtKSksIFtDXSksIEQgPSB1dChhc3luYyAoKSA9PiAoQyhcImhhcHRpY3Muc2VsZWN0aW9uQ2hhbmdlZFwiLCB7XG4gICAgLi4uSy5jdXJyZW50XG4gIH0sIGouY3VycmVudCksIGh0LmhhcHRpY3Muc2VsZWN0aW9uQ2hhbmdlZCgpKSwgW0NdKSwgTyA9IHV0KGFzeW5jIChtLCB2KSA9PiAodiAmJiBzICYmIEMoXCJjYXN0LmNvbXBvc2VkXCIsIHtcbiAgICAuLi5LLmN1cnJlbnQsXG4gICAgY2FzdFRleHQ6IG0gPT0gbnVsbCA/IHZvaWQgMCA6IG0udGV4dCxcbiAgICBzb3VyY2U6IHZcbiAgfSwgai5jdXJyZW50KSwgaHQuYWN0aW9ucy5jb21wb3NlQ2FzdChtKSksIFtzLCBDXSksIFUgPSBidChfKTtcbiAgVS5jdXJyZW50ID0gXywgZnQoKCkgPT4ge1xuICAgIGlmIChyKVxuICAgICAgcmV0dXJuO1xuICAgIGxldCBtID0gITAsIHYgPSBudWxsO1xuICAgIGNvbnN0IFAgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBOID0gYXdhaXQgaHQuY29udGV4dDtcbiAgICAgIGlmICghbSkgcmV0dXJuO1xuICAgICAgaWYgKG8oTiksIGh0Lm9uKFwibWluaUFwcEFkZGVkXCIsICh7XG4gICAgICAgIG5vdGlmaWNhdGlvbkRldGFpbHM6IGVlXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGwoITApLCB1KGVlID8/IG51bGwpLCBoKFwiRnJhbWUgYWRkZWRcIiksIEMoXCJmcmFtZS5hZGRlZFwiLCBLLmN1cnJlbnQsIGouY3VycmVudCk7XG4gICAgICB9KSwgaHQub24oXCJtaW5pQXBwQWRkUmVqZWN0ZWRcIiwgKHtcbiAgICAgICAgcmVhc29uOiBlZVxuICAgICAgfSkgPT4ge1xuICAgICAgICBsKCExKSwgaChgRnJhbWUgYWRkIHJlamVjdGVkOiAke2VlfWApLCBDKFwiZnJhbWUuYWRkLnJlamVjdGVkXCIsIEsuY3VycmVudCwgai5jdXJyZW50KTtcbiAgICAgIH0pLCBodC5vbihcIm1pbmlBcHBSZW1vdmVkXCIsICgpID0+IHtcbiAgICAgICAgbCghMSksIGgoXCJGcmFtZSByZW1vdmVkXCIpLCBDKFwiZnJhbWUucmVtb3ZlZFwiLCBLLmN1cnJlbnQsIGouY3VycmVudCk7XG4gICAgICB9KSwgaHQub24oXCJub3RpZmljYXRpb25zRW5hYmxlZFwiLCAoe1xuICAgICAgICBub3RpZmljYXRpb25EZXRhaWxzOiBlZVxuICAgICAgfSkgPT4ge1xuICAgICAgICB1KGVlID8/IG51bGwpLCBoKFwiTm90aWZpY2F0aW9ucyBlbmFibGVkXCIpLCBDKFwibm90aWZpY2F0aW9ucy5lbmFibGVkXCIsIEsuY3VycmVudCwgai5jdXJyZW50KTtcbiAgICAgIH0pLCBodC5vbihcIm5vdGlmaWNhdGlvbnNEaXNhYmxlZFwiLCAoKSA9PiB7XG4gICAgICAgIHUobnVsbCksIGgoXCJOb3RpZmljYXRpb25zIGRpc2FibGVkXCIpLCBDKFwibm90aWZpY2F0aW9ucy5kaXNhYmxlZFwiLCBLLmN1cnJlbnQsIGouY3VycmVudCk7XG4gICAgICB9KSwgaHQub24oXCJwcmltYXJ5QnV0dG9uQ2xpY2tlZFwiLCAoKSA9PiB7XG4gICAgICAgIGgoXCJQcmltYXJ5IGJ1dHRvbiBjbGlja2VkXCIpLCBDKFwicHJpbWFyeS1idXR0b24uY2xpY2tlZFwiLCBLLmN1cnJlbnQsIGouY3VycmVudCk7XG4gICAgICB9KSwgdiA9IGVTKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIH0pLCBhd2FpdCBodC5hY3Rpb25zLnJlYWR5KCksIGUpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaHQuYmFjay5vbmJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICBDKFwiYmFjay1idXR0b24uY2xpY2tlZFwiLCBLLmN1cnJlbnQsIGouY3VycmVudCksIFUuY3VycmVudCgpO1xuICAgICAgICAgIH0sIGF3YWl0IGh0LmJhY2suc2hvdygpO1xuICAgICAgICB9IGNhdGNoIChlZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIkJhY2sgYnV0dG9uIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjbGllbnQ6XCIsIGVlKTtcbiAgICAgICAgfVxuICAgICAgbSAmJiBuKCEwKTtcbiAgICB9O1xuICAgIGlmIChodClcbiAgICAgIHJldHVybiBQKCksICgpID0+IHtcbiAgICAgICAgbSA9ICExLCBodC5yZW1vdmVBbGxMaXN0ZW5lcnMoKSwgaHQuYmFjay5vbmJhY2sgPSBudWxsLCBodC5iYWNrLmhpZGUoKSwgdiAmJiB2KCksIEguY3VycmVudC5mb3JFYWNoKChOKSA9PiBjbGVhclRpbWVvdXQoTikpLCBILmN1cnJlbnQuY2xlYXIoKSwgTS5jdXJyZW50LmNsZWFyKCk7XG4gICAgICB9O1xuICB9LCBbXG4gICAgLy8gT25seSBpbmNsdWRlIHN0YWJsZSByZWZlcmVuY2VzIHRoYXQgd29uJ3QgY2hhbmdlXG4gICAgZSxcbiAgICBDXG4gIF0pLCBmdCgoKSA9PiB7XG4gICAgaSAhPSBudWxsICYmIGkudXNlciAmJiAoaSAhPSBudWxsICYmIGkuY2xpZW50KSAmJiAocCh7XG4gICAgICB1c2VybmFtZTogaS51c2VyLnVzZXJuYW1lLFxuICAgICAgY2xpZW50RmlkOiBpLmNsaWVudC5jbGllbnRGaWRcbiAgICB9KSwgRShgJHtpLnVzZXIuZmlkfWApLCBDKFwiZnJhbWUub3BlbmVkXCIsIHtcbiAgICAgIHVzZXJuYW1lOiBpLnVzZXIudXNlcm5hbWUsXG4gICAgICBjbGllbnRGaWQ6IGkuY2xpZW50LmNsaWVudEZpZCxcbiAgICAgIGxvY2F0aW9uOiBpLmxvY2F0aW9uLFxuICAgICAgYWRkZWQ6IGkuY2xpZW50LmFkZGVkXG4gICAgfSwgYCR7aS51c2VyLmZpZH1gKSk7XG4gIH0sIFtpLCBDXSk7XG4gIGNvbnN0IFtWLCBMXSA9IHFlKFwiXCIpO1xuICByZXR1cm4gZnQoKCkgPT4ge1xuICAgIGNvbnN0IG0gPSAoKSA9PiB7XG4gICAgICBMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICB9O1xuICAgIG0oKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBtKTtcbiAgICBjb25zdCB2ID0gd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlLCBQID0gd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlO1xuICAgIHJldHVybiB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUgPSBmdW5jdGlvbiguLi5OKSB7XG4gICAgICB2LmFwcGx5KHdpbmRvdy5oaXN0b3J5LCBOKSwgbSgpO1xuICAgIH0sIHdpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSA9IGZ1bmN0aW9uKC4uLk4pIHtcbiAgICAgIFAuYXBwbHkod2luZG93Lmhpc3RvcnksIE4pLCBtKCk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb3BzdGF0ZVwiLCBtKSwgd2luZG93Lmhpc3RvcnkucHVzaFN0YXRlID0gdiwgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlID0gUDtcbiAgICB9O1xuICB9LCBbXSksIGZ0KCgpID0+IHtcbiAgICB2YXIgWSwgZWU7XG4gICAgaWYgKCEoKFkgPSBpID09IG51bGwgPyB2b2lkIDAgOiBpLnVzZXIpICE9IG51bGwgJiYgWS5maWQpIHx8ICEoKGVlID0gaSA9PSBudWxsID8gdm9pZCAwIDogaS5jbGllbnQpICE9IG51bGwgJiYgZWUuY2xpZW50RmlkKSB8fCAhVilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBtID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSwgdiA9IG0uZ2V0KFwidXRtX3NvdXJjZVwiKSwgUCA9IG0uZ2V0KFwidXRtX21lZGl1bVwiKSwgTiA9IG0uZ2V0KFwidXRtX2NhbXBhaWduXCIpO1xuICAgIGlmICh2ID09PSBcIm5leW5hclwiICYmIChQICE9IG51bGwgJiYgUC5zdGFydHNXaXRoKFwic2hhcmUtY2FzdC1cIikpKSB7XG4gICAgICBjb25zdCBpZSA9IFAucmVwbGFjZShcInNoYXJlLWNhc3QtXCIsIFwiXCIpO1xuICAgICAgQyhcImNhc3Quc2hhcmVkXCIsIHtcbiAgICAgICAgdXNlcm5hbWU6IGkudXNlci51c2VybmFtZSxcbiAgICAgICAgY2xpZW50RmlkOiBpLmNsaWVudC5jbGllbnRGaWQsXG4gICAgICAgIHNoYXJlZEJ5RmlkOiBpZVxuICAgICAgfSwgYCR7aS51c2VyLmZpZH1gKTtcbiAgICB9XG4gICAgaWYgKHYgPT09IFwibmV5bmFyXCIgJiYgTikge1xuICAgICAgY29uc3QgaWUgPSBgJHtOfV8ke2kudXNlci5maWR9XyR7RGF0ZS5ub3coKX1gO1xuICAgICAgaWYgKE0uY3VycmVudC5oYXMoaWUpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBUZSA9IEguY3VycmVudC5nZXQoaWUpO1xuICAgICAgVGUgJiYgY2xlYXJUaW1lb3V0KFRlKSwgTS5jdXJyZW50LmFkZChpZSk7XG4gICAgICBjb25zdCBEZSA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHplID0gYXdhaXQgZmV0Y2goXCJodHRwczovL2FwaS5uZXluYXIuY29tL3YyL2ZhcmNhc3Rlci9mcmFtZS9ub3RpZmljYXRpb25zL29wZW5cIiwge1xuICAgICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgIGNhbXBhaWduX2lkOiBOLFxuICAgICAgICAgICAgICBmaWQ6IGkudXNlci5maWQsXG4gICAgICAgICAgICAgIGFwcF9maWQ6IGkuY2xpZW50LmNsaWVudEZpZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB6ZS5vayB8fCBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHRvIG1hcmsgbm90aWZpY2F0aW9uIGFzIG9wZW5lZDogXCIsIGF3YWl0IHplLnRleHQoKSk7XG4gICAgICAgIH0gY2F0Y2ggKHplKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIG1hcmtpbmcgbm90aWZpY2F0aW9uIGFzIG9wZW5lZDogXCIsIHplKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBNLmN1cnJlbnQuZGVsZXRlKGllKSwgSC5jdXJyZW50LmRlbGV0ZShpZSk7XG4gICAgICAgIH1cbiAgICAgIH0sIDFlMyk7XG4gICAgICBILmN1cnJlbnQuc2V0KGllLCBEZSk7XG4gICAgfVxuICB9LCBbaSwgQywgVl0pLCB7XG4gICAgLi4uaHQsXG4gICAgaXNTREtMb2FkZWQ6IHIsXG4gICAgY29udGV4dDogaSxcbiAgICBhZGRlZDogYSxcbiAgICBub3RpZmljYXRpb25EZXRhaWxzOiBjLFxuICAgIGxhc3RFdmVudDogZCxcbiAgICBjdXJyZW50VGFiOiBBLFxuICAgIHNldEFjdGl2ZVRhYjogayxcbiAgICBzZXRJbml0aWFsVGFiOiBnLFxuICAgIGhhcHRpY3M6IHtcbiAgICAgIGltcGFjdE9jY3VycmVkOiB4LFxuICAgICAgbm90aWZpY2F0aW9uT2NjdXJyZWQ6IHcsXG4gICAgICBzZWxlY3Rpb25DaGFuZ2VkOiBEXG4gICAgfSxcbiAgICBhY3Rpb25zOiB7XG4gICAgICAuLi5odC5hY3Rpb25zLFxuICAgICAgb3BlblVybDogJCxcbiAgICAgIGNsb3NlOiBXLFxuICAgICAgY29tcG9zZUNhc3Q6IE9cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBzUyh7XG4gIGNoaWxkcmVuOiBzXG59KSB7XG4gIGNvbnN0IGUgPSByUygpO1xuICByZXR1cm4gZS5pc1NES0xvYWRlZCA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChtZy5Qcm92aWRlciwge1xuICAgIHZhbHVlOiBlLFxuICAgIGNoaWxkcmVuOiBzXG4gIH0pIDogbnVsbDtcbn1cbmZ1bmN0aW9uIGRSKHtcbiAgY2hpbGRyZW46IHMsXG4gIGFuYWx5dGljc0VuYWJsZWQ6IGUgPSAhMSxcbiAgYmFja0J1dHRvbkVuYWJsZWQ6IHQgPSAhMSxcbiAgcmV0dXJuVXJsOiByXG59KSB7XG4gIGNvbnN0IG4gPSBacigoKSA9PiAoe1xuICAgIGFuYWx5dGljc0VuYWJsZWQ6IGUsXG4gICAgYmFja0J1dHRvbkVuYWJsZWQ6IHQsXG4gICAgcmV0dXJuVXJsOiByXG4gIH0pLCBbZSwgdCwgcl0pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KHBnLlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IG4sXG4gICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChzUywge1xuICAgICAgY2hpbGRyZW46IHNcbiAgICB9KVxuICB9KTtcbn1cbmZ1bmN0aW9uIGhSKCkge1xuICBjb25zdCBzID0gQWkobWcpO1xuICBpZiAocyA9PT0gdm9pZCAwKVxuICAgIHRocm93IG5ldyBFcnJvcihcInVzZU1pbmlBcHAgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIE1pbmlBcHBQcm92aWRlclwiKTtcbiAgcmV0dXJuIHM7XG59XG52YXIgeWcgPSAvKiBAX19QVVJFX18gKi8gKChzKSA9PiAocy5MaWdodCA9IFwibGlnaHRcIiwgcy5EYXJrID0gXCJkYXJrXCIsIHMpKSh5ZyB8fCB7fSksIGdzID0gLyogQF9fUFVSRV9fICovICgocykgPT4gKHMuRkFSQ0FTVEVSID0gXCJmYXJjYXN0ZXJcIiwgcy5ORVlOQVIgPSBcIm5leW5hclwiLCBzLldBUlBDQVNUID0gXCJ3YXJwY2FzdFwiLCBzKSkoZ3MgfHwge30pO1xuZnVuY3Rpb24gZHUocywgZSA9IFwiXCIsIHtcbiAgc2VyaWFsaXplOiB0ID0gSlNPTi5zdHJpbmdpZnksXG4gIGRlc2VyaWFsaXplOiByID0gSlNPTi5wYXJzZVxufSA9IHt9KSB7XG4gIGNvbnN0IFtuLCBpXSA9IHFlKCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA+IFwidVwiKVxuICAgICAgcmV0dXJuIGU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGwgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0ocyk7XG4gICAgICByZXR1cm4gbCA/IHIobCkgOiBlO1xuICAgIH0gY2F0Y2ggKGwpIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiRXJyb3IgcmVhZGluZyBmcm9tIGxvY2FsU3RvcmFnZVwiLCBsKSwgZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW24sIChsKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGMgPSBsIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBsKG4pIDogbDtcbiAgICAgIGkoYyksIHR5cGVvZiB3aW5kb3cgPCBcInVcIiAmJiB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0ocywgdChjKSk7XG4gICAgfSBjYXRjaCAoYykge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHdyaXRpbmcgdG8gbG9jYWxTdG9yYWdlXCIsIGMpO1xuICAgIH1cbiAgfSwgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0ocyksIGkoZSk7XG4gICAgfSBjYXRjaCAobCkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHJlbW92aW5nIGZyb20gbG9jYWxTdG9yYWdlXCIsIGwpO1xuICAgIH1cbiAgfV07XG59XG52YXIgam4gPSAvKiBAX19QVVJFX18gKi8gKChzKSA9PiAocy5ORVlOQVJfQVVUSEVOVElDQVRFRF9VU0VSID0gXCJuZXluYXJfYXV0aGVudGljYXRlZF91c2VyXCIsIHMpKShqbiB8fCB7fSk7XG5jb25zdCB2ZyA9IGFhKHZvaWQgMCksIG5TID0gKHtcbiAgY2hpbGRyZW46IHMsXG4gIF9zZXRJc0F1dGhlbnRpY2F0ZWQ6IGUsXG4gIF9zZXRVc2VyOiB0LFxuICBfb25BdXRoU3VjY2VzczogcixcbiAgX29uU2lnbm91dDogblxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgaXNBdXRoZW50aWNhdGVkOiBpXG4gIH0gPSB0cygpLCBbbywgYV0gPSBxZSghMSksIFtsLCBjXSA9IHFlKG51bGwpLCBbdV0gPSBkdShqbi5ORVlOQVJfQVVUSEVOVElDQVRFRF9VU0VSKTtcbiAgZnQoKCkgPT4ge1xuICAgIGUobyk7XG4gIH0sIFtvXSksIGZ0KCgpID0+IHtcbiAgICBhKGkpO1xuICB9LCBbaV0pLCBmdCgoKSA9PiB7XG4gICAgdSA/IChjKHUpLCBhKCEwKSkgOiAoYyhudWxsKSwgYSghMSkpO1xuICB9LCBbXSksIGZ0KCgpID0+IHtcbiAgICB0KGwpO1xuICB9LCBbbF0pO1xuICBjb25zdCBkID0gKHApID0+IHtcbiAgICByICYmIHIocCk7XG4gIH0sIGggPSAocCkgPT4ge1xuICAgIG4gJiYgbihwKTtcbiAgfSwgZiA9IFpyKCgpID0+ICh7XG4gICAgaXNBdXRoZW50aWNhdGVkOiBvLFxuICAgIHVzZXI6IGwsXG4gICAgc2V0SXNBdXRoZW50aWNhdGVkOiBhLFxuICAgIHNldFVzZXI6IGMsXG4gICAgb25BdXRoU3VjY2VzczogZCxcbiAgICBvblNpZ25vdXQ6IGhcbiAgfSksIFtvLCBsXSk7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3godmcuUHJvdmlkZXIsIHtcbiAgICB2YWx1ZTogZixcbiAgICBjaGlsZHJlbjogc1xuICB9KTtcbn0sIEVnID0gKCkgPT4ge1xuICBjb25zdCBzID0gQWkodmcpO1xuICBpZiAoIXMpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlQXV0aCBtdXN0IGJlIHVzZWQgd2l0aGluIGEgQXV0aENvbnRleHRQcm92aWRlclwiKTtcbiAgcmV0dXJuIHM7XG59LCBpUyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInRiYW9tN2NcIl1cbn0pLCBvUyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInQxZmY0NHppXCJdLFxuICB2YXJpYW50czogW3tcbiAgICBwcm9wczoge1xuICAgICAgdHlwZTogXCJzdWNjZXNzXCJcbiAgICB9LFxuICAgIGNsYXNzTmFtZTogXCJ0MWZmNDR6aS0xXCJcbiAgfSwge1xuICAgIHByb3BzOiB7XG4gICAgICB0eXBlOiBcImVycm9yXCJcbiAgICB9LFxuICAgIGNsYXNzTmFtZTogXCJ0MWZmNDR6aS0yXCJcbiAgfSwge1xuICAgIHByb3BzOiB7XG4gICAgICB0eXBlOiBcIndhcm5pbmdcIlxuICAgIH0sXG4gICAgY2xhc3NOYW1lOiBcInQxZmY0NHppLTNcIlxuICB9LCB7XG4gICAgcHJvcHM6IHtcbiAgICAgIHR5cGU6IFwiaW5mb1wiXG4gICAgfSxcbiAgICBjbGFzc05hbWU6IFwidDFmZjQ0emktNFwiXG4gIH1dXG59KTtcbnZhciB4ZyA9IC8qIEBfX1BVUkVfXyAqLyAoKHMpID0+IChzLlN1Y2Nlc3MgPSBcInN1Y2Nlc3NcIiwgcy5FcnJvciA9IFwiZXJyb3JcIiwgcy5XYXJuaW5nID0gXCJ3YXJuaW5nXCIsIHMuSW5mbyA9IFwiaW5mb1wiLCBzKSkoeGcgfHwge30pO1xuY29uc3QgU2cgPSBhYSh2b2lkIDApLCBmUiA9ICh7XG4gIGNoaWxkcmVuOiBzLFxuICBzZXR0aW5nczoge1xuICAgIGNsaWVudElkOiBlLFxuICAgIGRlZmF1bHRUaGVtZTogdCA9IHlnLkxpZ2h0LFxuICAgIGV2ZW50c0NhbGxiYWNrczogclxuICB9XG59KSA9PiB7XG4gIGNvbnN0IFtuXSA9IHFlKGUpLCBbaSwgb10gPSBxZSghMSksIFthLCBsXSA9IHFlKHQpLCBbYywgdV0gPSBxZShbXSksIFtkLCBoXSA9IHFlKG51bGwpLCBmID0gKEEsIEYpID0+IHtcbiAgICBjb25zdCBNID0ge1xuICAgICAgdHlwZTogQSxcbiAgICAgIG1lc3NhZ2U6IEZcbiAgICB9O1xuICAgIHUoKEgpID0+IFsuLi5ILCBNXSksIHNldFRpbWVvdXQoKCkgPT4gcChNKSwgNWUzKTtcbiAgfSwgcCA9IChBKSA9PiB7XG4gICAgdSgoRikgPT4gRi5maWx0ZXIoKE0pID0+IE0gIT09IEEpKTtcbiAgfTtcbiAgZnQoKCkgPT4ge1xuICAgIGNvbnN0IEEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwiOnJvb3RcIik7XG4gICAgQSAmJiAoYSA9PT0gXCJsaWdodFwiID8gKEEuY2xhc3NMaXN0LmFkZChcInRoZW1lLWxpZ2h0XCIpLCBBLmNsYXNzTGlzdC5yZW1vdmUoXCJ0aGVtZS1kYXJrXCIpKSA6IGEgPT09IFwiZGFya1wiICYmIChBLmNsYXNzTGlzdC5hZGQoXCJ0aGVtZS1kYXJrXCIpLCBBLmNsYXNzTGlzdC5yZW1vdmUoXCJ0aGVtZS1saWdodFwiKSkpO1xuICB9LCBbYV0pO1xuICBjb25zdCB5ID0gKEEpID0+IHtcbiAgICBvKEEpO1xuICB9LCBFID0gKEEpID0+IHtcbiAgICBoKEEpO1xuICB9LCBiID0gKCkgPT4ge1xuICAgIGlmIChkKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNpZ25lcl91dWlkOiBBLFxuICAgICAgICAuLi5GXG4gICAgICB9ID0gZDtcbiAgICAgIGgobnVsbCksIG8oITEpLCBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShqbi5ORVlOQVJfQVVUSEVOVElDQVRFRF9VU0VSKSwgciAhPSBudWxsICYmIHIub25TaWdub3V0ICYmIHIub25TaWdub3V0KEYpO1xuICAgIH1cbiAgfSwgUiA9IFpyKCgpID0+ICh7XG4gICAgY2xpZW50X2lkOiBuLFxuICAgIHRoZW1lOiBhLFxuICAgIGlzQXV0aGVudGljYXRlZDogaSxcbiAgICB1c2VyOiBkLFxuICAgIHNldFRoZW1lOiBsLFxuICAgIHNob3dUb2FzdDogZixcbiAgICBsb2dvdXRVc2VyOiBiXG4gIH0pLCBbbiwgYSwgaSwgZCwgbCwgZiwgYl0pO1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KFNnLlByb3ZpZGVyLCB7XG4gICAgdmFsdWU6IFIsXG4gICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoblMsIHtcbiAgICAgIF9zZXRJc0F1dGhlbnRpY2F0ZWQ6IHksXG4gICAgICBfc2V0VXNlcjogRSxcbiAgICAgIF9vbkF1dGhTdWNjZXNzOiByID09IG51bGwgPyB2b2lkIDAgOiByLm9uQXV0aFN1Y2Nlc3MsXG4gICAgICBfb25TaWdub3V0OiByID09IG51bGwgPyB2b2lkIDAgOiByLm9uU2lnbm91dCxcbiAgICAgIGNoaWxkcmVuOiBbcywgLyogQF9fUFVSRV9fICovIHEuanN4KGlTLCB7XG4gICAgICAgIGNoaWxkcmVuOiBjLm1hcCgoQSwgRikgPT4gLyogQF9fUFVSRV9fICovIHEuanN4KG9TLCB7XG4gICAgICAgICAgdHlwZTogQS50eXBlLFxuICAgICAgICAgIGNoaWxkcmVuOiBBLm1lc3NhZ2VcbiAgICAgICAgfSwgRikpXG4gICAgICB9KV1cbiAgICB9KVxuICB9KTtcbn0sIHRzID0gKCkgPT4ge1xuICBjb25zdCBzID0gQWkoU2cpO1xuICBpZiAoIXMpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwidXNlTmV5bmFyQ29udGV4dCBtdXN0IGJlIHVzZWQgd2l0aGluIGEgTmV5bmFyQ29udGV4dFByb3ZpZGVyXCIpO1xuICByZXR1cm4gcztcbn0sIGFTID0gKCkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhcInN2Z1wiLCB7XG4gIHdpZHRoOiBcIjE4XCIsXG4gIGhlaWdodDogXCIxN1wiLFxuICB2aWV3Qm94OiBcIjAgMCAxOCAxN1wiLFxuICBmaWxsOiBcIm5vbmVcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMy43MjIyIDBINC4yNzc3OEMyLjE5MTM3IDAgMC41IDEuNjkxMzcgMC41IDMuNzc3NzhWMTMuMjIyMkMwLjUgMTUuMzA4NiAyLjE5MTM3IDE3IDQuMjc3NzggMTdIMTMuNzIyMkMxNS44MDg2IDE3IDE3LjUgMTUuMzA4NiAxNy41IDEzLjIyMjJWMy43Nzc3OEMxNy41IDEuNjkxMzcgMTUuODA4NiAwIDEzLjcyMjIgMFpcIixcbiAgICBmaWxsOiBcIiM4NTVEQ0RcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgZDogXCJNNC44ODI4MSAyLjY0NDUzSDEzLjExODRWMTQuMzU1NkgxMS45MDk1VjguOTkxMkgxMS44OTc2QzExLjc2NCA3LjUwODU5IDEwLjUxOCA2LjM0Njc1IDkuMDAwNTkgNi4zNDY3NUM3LjQ4MzIgNi4zNDY3NSA2LjIzNzE3IDcuNTA4NTkgNi4xMDM1NiA4Ljk5MTJINi4wOTE3VjE0LjM1NTZINC44ODI4MVYyLjY0NDUzWlwiLFxuICAgIGZpbGw6IFwid2hpdGVcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgZDogXCJNMi42OTE0MSA0LjMwNjY0TDMuMTgyNTIgNS45Njg4NkgzLjU5ODA3VjEyLjY5MzNDMy4zODk0MyAxMi42OTMzIDMuMjIwMyAxMi44NjI1IDMuMjIwMyAxMy4wNzExVjEzLjUyNDRIMy4xNDQ3NEMyLjkzNjEgMTMuNTI0NCAyLjc2Njk2IDEzLjY5MzYgMi43NjY5NiAxMy45MDIyVjE0LjM1NTVINi45OTgwN1YxMy45MDIyQzYuOTk4MDcgMTMuNjkzNiA2LjgyODkzIDEzLjUyNDQgNi42MjAzIDEzLjUyNDRINi41NDQ3NFYxMy4wNzExQzYuNTQ0NzQgMTIuODYyNSA2LjM3NTYgMTIuNjkzMyA2LjE2Njk2IDEyLjY5MzNINS43MTM2M1Y0LjMwNjY0SDIuNjkxNDFaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xMS45ODU0IDEyLjY5MzNDMTEuNzc2OCAxMi42OTMzIDExLjYwNzYgMTIuODYyNSAxMS42MDc2IDEzLjA3MTFWMTMuNTI0NEgxMS41MzIxQzExLjMyMzUgMTMuNTI0NCAxMS4xNTQzIDEzLjY5MzYgMTEuMTU0MyAxMy45MDIyVjE0LjM1NTVIMTUuMzg1NFYxMy45MDIyQzE1LjM4NTQgMTMuNjkzNiAxNS4yMTYyIDEzLjUyNDQgMTUuMDA3NiAxMy41MjQ0SDE0LjkzMjFWMTMuMDcxMUMxNC45MzIxIDEyLjg2MjUgMTQuNzYyOSAxMi42OTMzIDE0LjU1NDMgMTIuNjkzM1Y1Ljk2ODg2SDE0Ljk2OTlMMTUuNDYxIDQuMzA2NjRIMTIuNDM4N1YxMi42OTMzSDExLjk4NTRaXCIsXG4gICAgZmlsbDogXCJ3aGl0ZVwiXG4gIH0pXVxufSksIHpkID0gKCkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhcInN2Z1wiLCB7XG4gIHdpZHRoOiBcIjMyXCIsXG4gIGhlaWdodDogXCIxN1wiLFxuICB2aWV3Qm94OiBcIjAgMCA1MCAyOFwiLFxuICBmaWxsOiBcIm5vbmVcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTM4LjM3NDQgMTMuNzMxMUMzOC4zNzQ0IDE2LjEyMDkgMzcuNzYzOSAxOC4zNjggMzYuNjkwNCAyMC4zMjUyQzMyLjU2ODUgMTkuODUyNSAyNy44NDcgMTguOTUwMyAyMi44OTk5IDE3LjYyNDdDMjAuNDA1OCAxNi45NTY0IDE4LjAxNTEgMTYuMjIzNiAxNS43Njk3IDE1LjQ0OTVMMTUuNzY5MyAxNS40NDg2QzE1Ljc1NzkgMTUuNDQ1IDE1Ljc0NjUgMTUuNDQxMyAxNS43MzUxIDE1LjQzNzZDMTUuNjQ0OCAxNS40MDY0IDE1LjU1NDcgMTUuMzc1MiAxNS40NjQ5IDE1LjM0MzlDMTIuODk3OCAxNC4zOTkgMTEuMjM1NiAxMi4yMDU2IDExLjQxNjggMTAuMDMxNUwxMS40NDgyIDEwLjAzOTlMMTEuNDIxNSAxMC4wMTMzQzEzLjA0MjcgNC4yMzYxMiAxOC4zNDgzIDAgMjQuNjQzNCAwQzMyLjIyNjggMCAzOC4zNzQ0IDYuMTQ3NjIgMzguMzc0NCAxMy43MzExWlwiLFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGNsaXBSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBkOiBcIk0xMS4zODA0IDE3LjI5ODdDMTIuNDg4MiAxNi41MzEzIDEzLjk2NTggMTYuMTgwNCAxNS41MDAyIDE2LjM5NTNDMTcuNzczMSAxNy4xNTYgMjAuMTY4MiAxNy44NzgyIDIyLjY1MzUgMTguNTQ0MUMyNy4zOTcgMTkuODE1MSAzMS45NTg0IDIwLjc0NDQgMzYuMDgzMyAyMS4zMjc1QzMzLjYyMyAyNS4wMjUyIDI5LjQxNzcgMjcuNDYxOSAyNC42NDM0IDI3LjQ2MTlDMTguMjk0IDI3LjQ2MTkgMTIuOTUxMSAyMy4xNTI0IDExLjM4MDQgMTcuMjk4N1pcIixcbiAgICBmaWxsOiBcImJsYWNrXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGZpbGxSdWxlOiBcImV2ZW5vZGRcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNNDMuMDkxNyAxMy40NDU4QzQxLjY0NjEgMTIuNjY0OCAzOS45NzU2IDExLjg3NTkgMzguMTIzMyAxMS4xMDI5QzM4LjAzNjMgMTAuNjU0NCAzNy45Mjc1IDEwLjIxMzYgMzcuNzk4MSA5Ljc4MTc0QzM5Ljk4MDYgMTAuNjY0OCA0MS45NDAzIDExLjU3NTIgNDMuNjEzOSAxMi40Nzk0QzQ1LjcwMDcgMTMuNjA2OSA0Ny4zNzAzIDE0LjczOTQgNDguNDcxNCAxNS44MTZDNDkuNTM1NiAxNi44NTY2IDUwLjIyOTUgMTguMDA2MyA0OS45MyAxOS4xMjQxQzQ5LjYzMDQgMjAuMjQxOSA0OC40NTQ3IDIwLjg5MDYgNDcuMDEyOCAyMS4yNTk3QzQ1LjUyMDkgMjEuNjQxNSA0My41MDg3IDIxLjc4NzUgNDEuMTM3NyAyMS43MjA2QzM5LjYwNDYgMjEuNjc3MyAzNy45MDgyIDIxLjU0NDQgMzYuMDg2NCAyMS4zMjM0QzM2LjMwODYgMjAuOTg5MSAzNi41MTY1IDIwLjY0NDYgMzYuNzA5NCAyMC4yOTA2QzM4LjMxMzQgMjAuNDczMyAzOS44MDkxIDIwLjU4NDEgNDEuMTY4NyAyMC42MjI1QzQzLjQ5NDYgMjAuNjg4MiA0NS4zOTA4IDIwLjU0MDkgNDYuNzQwNCAyMC4xOTU1QzQ4LjE0IDE5LjgzNzMgNDguNzM4OSAxOS4zMjQ5IDQ4Ljg2ODkgMTguODM5OEM0OC45OTg5IDE4LjM1NDcgNDguNzM2NCAxNy42MTE1IDQ3LjcwMzQgMTYuNjAxNUM0Ni43MDczIDE1LjYyNzUgNDUuMTM4OCAxNC41NTE5IDQzLjA5MTcgMTMuNDQ1OFpNOC44NjIyOSAzLjE2NzcyQzEwLjc1ODMgMy4yMjEyOCAxMi45MDM4IDMuNDExNzcgMTUuMjI3OCAzLjczNjYxQzE0Ljg5NzQgNC4wNDgwMyAxNC41ODI0IDQuMzc1NjYgMTQuMjg0MSA0LjcxODIyQzEyLjMwMTYgNC40NjMxNCAxMC40Njc4IDQuMzEyIDguODMxMjcgNC4yNjU3N0M2LjUwNTQxIDQuMjAwMDYgNC42MDkyIDQuMzQ3MzcgMy4yNTk1OCA0LjY5Mjc5QzEuODYwMDEgNS4wNTA5OSAxLjI2MTA3IDUuNTYzNDIgMS4xMzEwOSA2LjA0ODQ5QzEuMDAxMTIgNi41MzM1NiAxLjI2MzYgNy4yNzY4MSAyLjI5NjU3IDguMjg2OEMzLjI5MjY3IDkuMjYwNzUgNC44NjExOCAxMC4zMzY0IDYuOTA4MjggMTEuNDQyNUM2Ljk0MTgxIDExLjQ2MDYgNi45NzU0NiAxMS40Nzg3IDcuMDA5MjMgMTEuNDk2OEM2Ljg0MjUxIDExLjU5MzggNi43MjU3NCAxMS43MTYxIDYuNjYzNTMgMTEuODY0NUM2LjU3NzkxIDEyLjA2ODggNi42MDAxMyAxMi4zMTIxIDYuNzIwMTMgMTIuNTg3NEM2LjYwNzU3IDEyLjUyNzkgNi40OTYyMyAxMi40Njg0IDYuMzg2MTIgMTIuNDA4OUM0LjI5OTI2IDExLjI4MTQgMi42Mjk3MSAxMC4xNDg5IDEuNTI4NiA5LjA3MjIzQzAuNDY0MzY3IDguMDMxNjYgLTAuMjI5NDg1IDYuODgyIDAuMDcwMDM1NCA1Ljc2NDE4QzAuMzY5NTU2IDQuNjQ2MzUgMS41NDUyOCAzLjk5NzY0IDIuOTg3MjIgMy42Mjg2QzQuNDc5MTEgMy4yNDY3NyA2LjQ5MTI2IDMuMTAwNzQgOC44NjIyOSAzLjE2NzcyWlwiLFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwiZWxsaXBzZVwiLCB7XG4gICAgY3g6IFwiNS45NDg2NlwiLFxuICAgIGN5OiBcIjExLjUzMDlcIixcbiAgICByeDogXCIzLjc2MDA5XCIsXG4gICAgcnk6IFwiMC41NzU4MzJcIixcbiAgICB0cmFuc2Zvcm06IFwicm90YXRlKDI5LjI4MjQgNS45NDg2NiAxMS41MzA5KVwiLFxuICAgIGZpbGw6IFwiYmxhY2tcIlxuICB9KV1cbn0pLCBsUyA9ICgpID0+IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoXCJzdmdcIiwge1xuICB3aWR0aDogXCIxN1wiLFxuICBoZWlnaHQ6IFwiMTdcIixcbiAgdmlld0JveDogXCIwIDAgMTcgMTdcIixcbiAgZmlsbDogXCJub25lXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KFwibWFza1wiLCB7XG4gICAgaWQ6IFwibWFzazBfODc1XzQ4XCIsXG4gICAgbWFza1VuaXRzOiBcInVzZXJTcGFjZU9uVXNlXCIsXG4gICAgeDogXCIwXCIsXG4gICAgeTogXCIwXCIsXG4gICAgd2lkdGg6IFwiMTdcIixcbiAgICBoZWlnaHQ6IFwiMTdcIixcbiAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgICBkOiBcIk0xNi45OTQ3IDBIMFYxNi45OTQ3SDE2Ljk5NDdWMFpcIixcbiAgICAgIGZpbGw6IFwid2hpdGVcIlxuICAgIH0pXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFwiZ1wiLCB7XG4gICAgbWFzazogXCJ1cmwoI21hc2swXzg3NV80OClcIixcbiAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgICAgZDogXCJNMTIuNzg3MSAxNi45OTQ3SDQuMjA3NjVDMS44ODc1NSAxNi45OTQ3IDAgMTUuMTA3MyAwIDEyLjc4NzFWNC4yMDc3MUMwIDEuODg3NTYgMS44ODc1NSAwIDQuMjA3NjUgMEgxMi43ODcxQzE1LjEwNzIgMCAxNi45OTQ3IDEuODg3NTYgMTYuOTk0NyA0LjIwNzcxVjEyLjc4NzFDMTYuOTk0NyAxNS4xMDczIDE1LjEwNzIgMTYuOTk0NyAxMi43ODcxIDE2Ljk5NDdaXCIsXG4gICAgICBmaWxsOiBcIiM0NzJBOTFcIlxuICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICAgIGQ6IFwiTTExLjE1MjMgNS4zNzg5MUwxMC4zMTQzIDguNTI2MDFMOS40NzM2NCA1LjM3ODkxSDcuNTM4OTNMNi42OTAxNyA4LjU0OTE5TDUuODQ0MTkgNS4zNzg5MUgzLjY0MDYyTDUuNjg4MjMgMTIuMzM3MUg3LjU4OTMxTDguNDk4MzUgOS4xMDU5OUw5LjQwNzM2IDEyLjMzNzFIMTEuMzEyNUwxMy4zNTU3IDUuMzc4OTFIMTEuMTUyM1pcIixcbiAgICAgIGZpbGw6IFwid2hpdGVcIlxuICAgIH0pXVxuICB9KV1cbn0pO1xudmFyIGNTID0ge307XG5jb25zdCBpYyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImltZ1wiKSh7XG4gIGNsYXNzZXM6IFtcImlwcGZzcXJcIl1cbn0pLCB1UyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImJ1dHRvblwiKSh7XG4gIGNsYXNzZXM6IFtcImIxeXpzc2piXCJdXG59KSwgZFMgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJtMXhuOGIyZVwiXVxufSksIGhTID0gLyogQF9fUFVSRV9fICovIGRlKFwiYnV0dG9uXCIpKHtcbiAgY2xhc3NlczogW1wibXd1aXF5Z1wiXVxufSksIGZTID0gKHMsIGUpID0+IHtcbiAgaWYgKGUpXG4gICAgcmV0dXJuIGU7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgZ3MuRkFSQ0FTVEVSOlxuICAgICAgcmV0dXJuIFwiU2lnbiBpbiB3aXRoIEZhcmNhc3RlclwiO1xuICAgIGNhc2UgZ3MuTkVZTkFSOlxuICAgICAgcmV0dXJuIFwiU2lnbiBpbiB3aXRoIE5leW5hclwiO1xuICAgIGNhc2UgZ3MuV0FSUENBU1Q6XG4gICAgICByZXR1cm4gXCJTaWduIGluIHdpdGggV2FycGNhc3RcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFwiU2lnbiBpbiB3aXRoIE5leW5hclwiO1xuICB9XG59LCBnUyA9IChzLCBlLCB0KSA9PiB7XG4gIGlmIChlKVxuICAgIHJldHVybiBlO1xuICBpZiAodClcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KGljLCB7XG4gICAgICBzcmM6IHQsXG4gICAgICBhbHQ6IFwiQ3VzdG9tIGxvZ29cIlxuICAgIH0pO1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIGdzLkZBUkNBU1RFUjpcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3goYVMsIHt9KTtcbiAgICBjYXNlIGdzLk5FWU5BUjpcbiAgICAgIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3goemQsIHt9KTtcbiAgICBjYXNlIGdzLldBUlBDQVNUOlxuICAgICAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChsUywge30pO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KHpkLCB7fSk7XG4gIH1cbn0sIHBTID0gKHtcbiAgY2hpbGRyZW46IHMsXG4gIGxhYmVsOiBlLFxuICB2YXJpYW50OiB0ID0gZ3MuTkVZTkFSLFxuICBpY29uOiByLFxuICBjdXN0b21Mb2dvVXJsOiBuLFxuICBtb2RhbFN0eWxlOiBpID0ge30sXG4gIG1vZGFsQnV0dG9uU3R5bGU6IG8gPSB7fSxcbiAgLi4uYVxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgY2xpZW50X2lkOiBsLFxuICAgIHVzZXI6IGMsXG4gICAgaXNBdXRoZW50aWNhdGVkOiB1XG4gIH0gPSB0cygpLCB7XG4gICAgc2V0SXNBdXRoZW50aWNhdGVkOiBkLFxuICAgIHNldFVzZXI6IGgsXG4gICAgb25BdXRoU3VjY2VzczogZixcbiAgICBvblNpZ25vdXQ6IHBcbiAgfSA9IEVnKCksIFt5LCBFLCBiXSA9IGR1KGpuLk5FWU5BUl9BVVRIRU5USUNBVEVEX1VTRVIpLCBbUiwgQV0gPSBxZSghMSksIEYgPSBidChudWxsKSwgTSA9IGAke2NTLk5FWU5BUl9MT0dJTl9VUkwgPz8gXCJodHRwczovL2FwcC5uZXluYXIuY29tL2xvZ2luXCJ9P2NsaWVudF9pZD0ke2x9YCwgSCA9IG5ldyBVUkwoTSkub3JpZ2luLCBLID0gYnQobnVsbCksIGogPSB1dChhc3luYyAoZykgPT4ge1xuICAgIHZhciB4O1xuICAgIGlmIChnLm9yaWdpbiA9PT0gSCAmJiBnLmRhdGEgJiYgZy5kYXRhLmlzX2F1dGhlbnRpY2F0ZWQpIHtcbiAgICAgIGQoITApLCAoeCA9IEYuY3VycmVudCkgPT0gbnVsbCB8fCB4LmNsb3NlKCksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBqKTtcbiAgICAgIGNvbnN0IHcgPSB7XG4gICAgICAgIHNpZ25lcl91dWlkOiBnLmRhdGEuc2lnbmVyX3V1aWQsXG4gICAgICAgIC4uLmcuZGF0YS51c2VyXG4gICAgICB9O1xuICAgICAgRSh3KSwgaCh3KSwgZih7XG4gICAgICAgIHVzZXI6IHdcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW2wsIGRdKSwgQyA9IHV0KCgpID0+IHtcbiAgICBjb25zdCB3ID0gd2luZG93LnNjcmVlbi53aWR0aCAvIDIgLSAzMDAsIE8gPSBgd2lkdGg9NjAwLGhlaWdodD03MDAsdG9wPSR7d2luZG93LnNjcmVlbi5oZWlnaHQgLyAyIC0gNzAwIC8gMn0sbGVmdD0ke3d9YDtcbiAgICBpZiAoRi5jdXJyZW50ID0gd2luZG93Lm9wZW4oTSwgXCJfYmxhbmtcIiwgTyksICFGLmN1cnJlbnQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gb3BlbiB0aGUgYXV0aGVudGljYXRpb24gd2luZG93LiBQbGVhc2UgY2hlY2sgeW91ciBwb3AtdXAgYmxvY2tlciBzZXR0aW5ncy5cIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBqLCAhMSk7XG4gIH0sIFtsLCBqXSksIGsgPSAoKSA9PiB7XG4gICAgaWYgKGMpIHtcbiAgICAgIGNvbnN0IGcgPSBjO1xuICAgICAgYigpLCBkKCExKSwgVygpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBzaWduZXJfdXVpZDogeCxcbiAgICAgICAgLi4ud1xuICAgICAgfSA9IGc7XG4gICAgICBwKHcpO1xuICAgIH1cbiAgfSwgJCA9ICgpID0+IEEoITApLCBXID0gKCkgPT4gQSghMSk7XG4gIGZ0KCgpID0+ICgpID0+IHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgaik7XG4gIH0sIFtqXSk7XG4gIGNvbnN0IF8gPSB1dCgoZykgPT4ge1xuICAgIEsuY3VycmVudCAmJiAhSy5jdXJyZW50LmNvbnRhaW5zKGcudGFyZ2V0KSAmJiBXKCk7XG4gIH0sIFtdKTtcbiAgcmV0dXJuIGZ0KCgpID0+IChSID8gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBfKSA6IGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgXyksICgpID0+IHtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIF8pO1xuICB9KSwgW1IsIF9dKSwgLyogQF9fUFVSRV9fICovIHEuanN4cyhxLkZyYWdtZW50LCB7XG4gICAgY2hpbGRyZW46IFtSICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoZFMsIHtcbiAgICAgIHN0eWxlOiBpLFxuICAgICAgcmVmOiBLLFxuICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goaWMsIHtcbiAgICAgICAgc3JjOiBjID09IG51bGwgPyB2b2lkIDAgOiBjLnBmcF91cmwsXG4gICAgICAgIGFsdDogYyA9PSBudWxsID8gdm9pZCAwIDogYy51c2VybmFtZVxuICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoXCJzcGFuXCIsIHtcbiAgICAgICAgY2hpbGRyZW46IFtcIkBcIiwgYyA9PSBudWxsID8gdm9pZCAwIDogYy51c2VybmFtZV1cbiAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goaFMsIHtcbiAgICAgICAgc3R5bGU6IG8sXG4gICAgICAgIG9uQ2xpY2s6IGssXG4gICAgICAgIGNoaWxkcmVuOiBcIlNpZ24gb3V0XCJcbiAgICAgIH0pXVxuICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3godVMsIHtcbiAgICAgIG9uQ2xpY2s6IHUgPyAkIDogQyxcbiAgICAgIC4uLmEsXG4gICAgICBjaGlsZHJlbjogdSA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMocS5GcmFnbWVudCwge1xuICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChpYywge1xuICAgICAgICAgIHNyYzogYyA9PSBudWxsID8gdm9pZCAwIDogYy5wZnBfdXJsLFxuICAgICAgICAgIGFsdDogYCR7YyA9PSBudWxsID8gdm9pZCAwIDogYy51c2VybmFtZX0gcHJvZmlsZSBwaWN0dXJlYFxuICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4cyhcInNwYW5cIiwge1xuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBtYXJnaW5MZWZ0OiBcIjEwcHhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2hpbGRyZW46IFtcIkBcIiwgYyA9PSBudWxsID8gdm9pZCAwIDogYy51c2VybmFtZV1cbiAgICAgICAgfSldXG4gICAgICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMocS5GcmFnbWVudCwge1xuICAgICAgICBjaGlsZHJlbjogW2dTKHQsIHIsIG4pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgbWFyZ2luTGVmdDogXCI1cHhcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2hpbGRyZW46IGZTKHQsIGUpXG4gICAgICAgIH0pXVxuICAgICAgfSlcbiAgICB9KV1cbiAgfSk7XG59LCBZbyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImltZ1wiKSh7XG4gIGNsYXNzZXM6IFtcImExMXB0MHhwXCJdLFxuICB2YXJzOiB7XG4gICAgXCJhMTFwdDB4cC0wXCI6IFsocywgZSA9IEdyKSA9PiBzLndpZHRoIHx8IFwiNDVweFwiLCAhMV0sXG4gICAgXCJhMTFwdDB4cC0xXCI6IFsocywgZSA9IEdyKSA9PiBzLndpZHRoIHx8IFwiNDVweFwiLCAhMV1cbiAgfVxufSksIFlkID0gXCJodHRwczovL2ZhcmNhc3Rlci54eXpcIiwgYmcgPSAvKF58XFxzKVxcL1xcdysvZywgVGcgPSAvQFxcdysoXFwuZXRoKT8vZywgd2cgPSAvKChodHRwcz86XFwvXFwvKT8oW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLH0pKFxcL1teXFxzXSopPykvZywgWmQgPSBuZXcgUmVnRXhwKGAoJHtiZy5zb3VyY2V9KXwoJHtUZy5zb3VyY2V9KXwoJHt3Zy5zb3VyY2V9KWAsIFwiZ1wiKSwgbVMgPSAocykgPT4gYmcudGVzdChzKSA/IGAke1lkfS9+L2NoYW5uZWwke3MudHJpbSgpfWAgOiBUZy50ZXN0KHMpID8gYCR7WWR9LyR7cy5zdWJzdHJpbmcoMSl9YCA6IHdnLnRlc3QocykgPyBzLnN0YXJ0c1dpdGgoXCJodHRwXCIpID8gcyA6IGBodHRwOi8vJHtzfWAgOiBcIlwiLCB5UyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImFcIikoe1xuICBjbGFzc2VzOiBbXCJzNHh5bXFzXCJdXG59KSwgdlMgPSAocykgPT4gcy5maWx0ZXIoKGUpID0+IGUudXJsKS5tYXAoKGUpID0+IGUudXJsKSwgRVMgPSAocywgZSkgPT4ge1xuICBpZiAoIXMpIHJldHVybiBbXTtcbiAgY29uc3QgdCA9IHZTKGUpLCByID0gW107XG4gIGxldCBuID0gMCwgaTtcbiAgZm9yICg7IChpID0gWmQuZXhlYyhzKSkgIT09IG51bGw7ICkge1xuICAgIGNvbnN0IG8gPSBpLmluZGV4O1xuICAgIG4gPCBvICYmIHIucHVzaChzLnNsaWNlKG4sIG8pKTtcbiAgICBjb25zdCBhID0gaVswXS50cmltKCk7XG4gICAgaWYgKHQuaW5jbHVkZXMoYSkpXG4gICAgICByLnB1c2goYSk7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBsID0gbVMoYSk7XG4gICAgICByLnB1c2goLyogQF9fUFVSRV9fICovIHEuanN4KHlTLCB7XG4gICAgICAgIGhyZWY6IGwsXG4gICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgY2hpbGRyZW46IGFcbiAgICAgIH0sIG8pKTtcbiAgICB9XG4gICAgbiA9IFpkLmxhc3RJbmRleDtcbiAgfVxuICByZXR1cm4gbiA8IHMubGVuZ3RoICYmIHIucHVzaChzLnNsaWNlKG4pKSwgcjtcbn0sIElyID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiYmU4N20wbVwiXSxcbiAgdmFyczoge1xuICAgIFwiYmU4N20wbS0wXCI6IFsocywgZSA9IEdyKSA9PiBzLmFsaWduSXRlbXMgfHwgXCJmbGV4LXN0YXJ0XCIsICExXSxcbiAgICBcImJlODdtMG0tMVwiOiBbKHMsIGUgPSBHcikgPT4gcy5qdXN0aWZ5Q29udGVudCB8fCBcImZsZXgtc3RhcnRcIiwgITFdLFxuICAgIFwiYmU4N20wbS0yXCI6IFsocywgZSA9IEdyKSA9PiBzLmZsZXhHcm93IHx8IFwiaW5pdGlhbFwiLCAhMF0sXG4gICAgXCJiZTg3bTBtLTNcIjogWyhzLCBlID0gR3IpID0+IHMuZmxleFNocmluayB8fCBcImluaXRpYWxcIiwgITBdLFxuICAgIFwiYmU4N20wbS00XCI6IFsocywgZSA9IEdyKSA9PiBzLnNwYWNpbmcgPz8gcy5zcGFjaW5nVmVydGljYWwgPz8gcy5zcGFjaW5nVG9wID8/IFwiMHB4XCIsICExXSxcbiAgICBcImJlODdtMG0tNVwiOiBbKHMsIGUgPSBHcikgPT4gcy5zcGFjaW5nID8/IHMuc3BhY2luZ0hvcml6b250YWwgPz8gcy5zcGFjaW5nUmlnaHQgPz8gXCIwcHhcIiwgITFdLFxuICAgIFwiYmU4N20wbS02XCI6IFsocywgZSA9IEdyKSA9PiBzLnNwYWNpbmcgPz8gcy5zcGFjaW5nVmVydGljYWwgPz8gcy5zcGFjaW5nQm90dG9tID8/IFwiMHB4XCIsICExXSxcbiAgICBcImJlODdtMG0tN1wiOiBbKHMsIGUgPSBHcikgPT4gcy5zcGFjaW5nID8/IHMuc3BhY2luZ0hvcml6b250YWwgPz8gcy5zcGFjaW5nTGVmdCA/PyBcIjBweFwiLCAhMV1cbiAgfVxufSksIHhTID0gKCkgPT4gSXIsIFByID0gLyogQF9fUFVSRV9fICovIGRlKHhTKCkpKHtcbiAgY2xhc3NlczogW1wiaGExZHZwaVwiXVxufSksIHVlID0gTnVtYmVyLmlzRmluaXRlIHx8IGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBzID09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUocyk7XG59LCBTUyA9IE51bWJlci5pc1NhZmVJbnRlZ2VyIHx8IGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHR5cGVvZiBzID09IFwibnVtYmVyXCIgJiYgTWF0aC5hYnMocykgPD0gYlM7XG59LCBiUyA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSIHx8IDkwMDcxOTkyNTQ3NDA5OTE7XG5sZXQgdmUgPSAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHMuTkVUV09SS19FUlJPUiA9IFwibmV0d29ya0Vycm9yXCIsIHMuTUVESUFfRVJST1IgPSBcIm1lZGlhRXJyb3JcIiwgcy5LRVlfU1lTVEVNX0VSUk9SID0gXCJrZXlTeXN0ZW1FcnJvclwiLCBzLk1VWF9FUlJPUiA9IFwibXV4RXJyb3JcIiwgcy5PVEhFUl9FUlJPUiA9IFwib3RoZXJFcnJvclwiLCBzO1xufSkoe30pLCBKID0gLyogQF9fUFVSRV9fICovIChmdW5jdGlvbihzKSB7XG4gIHJldHVybiBzLktFWV9TWVNURU1fTk9fS0VZUyA9IFwia2V5U3lzdGVtTm9LZXlzXCIsIHMuS0VZX1NZU1RFTV9OT19BQ0NFU1MgPSBcImtleVN5c3RlbU5vQWNjZXNzXCIsIHMuS0VZX1NZU1RFTV9OT19TRVNTSU9OID0gXCJrZXlTeXN0ZW1Ob1Nlc3Npb25cIiwgcy5LRVlfU1lTVEVNX05PX0NPTkZJR1VSRURfTElDRU5TRSA9IFwia2V5U3lzdGVtTm9Db25maWd1cmVkTGljZW5zZVwiLCBzLktFWV9TWVNURU1fTElDRU5TRV9SRVFVRVNUX0ZBSUxFRCA9IFwia2V5U3lzdGVtTGljZW5zZVJlcXVlc3RGYWlsZWRcIiwgcy5LRVlfU1lTVEVNX1NFUlZFUl9DRVJUSUZJQ0FURV9SRVFVRVNUX0ZBSUxFRCA9IFwia2V5U3lzdGVtU2VydmVyQ2VydGlmaWNhdGVSZXF1ZXN0RmFpbGVkXCIsIHMuS0VZX1NZU1RFTV9TRVJWRVJfQ0VSVElGSUNBVEVfVVBEQVRFX0ZBSUxFRCA9IFwia2V5U3lzdGVtU2VydmVyQ2VydGlmaWNhdGVVcGRhdGVGYWlsZWRcIiwgcy5LRVlfU1lTVEVNX1NFU1NJT05fVVBEQVRFX0ZBSUxFRCA9IFwia2V5U3lzdGVtU2Vzc2lvblVwZGF0ZUZhaWxlZFwiLCBzLktFWV9TWVNURU1fU1RBVFVTX09VVFBVVF9SRVNUUklDVEVEID0gXCJrZXlTeXN0ZW1TdGF0dXNPdXRwdXRSZXN0cmljdGVkXCIsIHMuS0VZX1NZU1RFTV9TVEFUVVNfSU5URVJOQUxfRVJST1IgPSBcImtleVN5c3RlbVN0YXR1c0ludGVybmFsRXJyb3JcIiwgcy5LRVlfU1lTVEVNX0RFU1RST1lfTUVESUFfS0VZU19FUlJPUiA9IFwia2V5U3lzdGVtRGVzdHJveU1lZGlhS2V5c0Vycm9yXCIsIHMuS0VZX1NZU1RFTV9ERVNUUk9ZX0NMT1NFX1NFU1NJT05fRVJST1IgPSBcImtleVN5c3RlbURlc3Ryb3lDbG9zZVNlc3Npb25FcnJvclwiLCBzLktFWV9TWVNURU1fREVTVFJPWV9SRU1PVkVfU0VTU0lPTl9FUlJPUiA9IFwia2V5U3lzdGVtRGVzdHJveVJlbW92ZVNlc3Npb25FcnJvclwiLCBzLk1BTklGRVNUX0xPQURfRVJST1IgPSBcIm1hbmlmZXN0TG9hZEVycm9yXCIsIHMuTUFOSUZFU1RfTE9BRF9USU1FT1VUID0gXCJtYW5pZmVzdExvYWRUaW1lT3V0XCIsIHMuTUFOSUZFU1RfUEFSU0lOR19FUlJPUiA9IFwibWFuaWZlc3RQYXJzaW5nRXJyb3JcIiwgcy5NQU5JRkVTVF9JTkNPTVBBVElCTEVfQ09ERUNTX0VSUk9SID0gXCJtYW5pZmVzdEluY29tcGF0aWJsZUNvZGVjc0Vycm9yXCIsIHMuTEVWRUxfRU1QVFlfRVJST1IgPSBcImxldmVsRW1wdHlFcnJvclwiLCBzLkxFVkVMX0xPQURfRVJST1IgPSBcImxldmVsTG9hZEVycm9yXCIsIHMuTEVWRUxfTE9BRF9USU1FT1VUID0gXCJsZXZlbExvYWRUaW1lT3V0XCIsIHMuTEVWRUxfUEFSU0lOR19FUlJPUiA9IFwibGV2ZWxQYXJzaW5nRXJyb3JcIiwgcy5MRVZFTF9TV0lUQ0hfRVJST1IgPSBcImxldmVsU3dpdGNoRXJyb3JcIiwgcy5BVURJT19UUkFDS19MT0FEX0VSUk9SID0gXCJhdWRpb1RyYWNrTG9hZEVycm9yXCIsIHMuQVVESU9fVFJBQ0tfTE9BRF9USU1FT1VUID0gXCJhdWRpb1RyYWNrTG9hZFRpbWVPdXRcIiwgcy5TVUJUSVRMRV9MT0FEX0VSUk9SID0gXCJzdWJ0aXRsZVRyYWNrTG9hZEVycm9yXCIsIHMuU1VCVElUTEVfVFJBQ0tfTE9BRF9USU1FT1VUID0gXCJzdWJ0aXRsZVRyYWNrTG9hZFRpbWVPdXRcIiwgcy5GUkFHX0xPQURfRVJST1IgPSBcImZyYWdMb2FkRXJyb3JcIiwgcy5GUkFHX0xPQURfVElNRU9VVCA9IFwiZnJhZ0xvYWRUaW1lT3V0XCIsIHMuRlJBR19ERUNSWVBUX0VSUk9SID0gXCJmcmFnRGVjcnlwdEVycm9yXCIsIHMuRlJBR19QQVJTSU5HX0VSUk9SID0gXCJmcmFnUGFyc2luZ0Vycm9yXCIsIHMuRlJBR19HQVAgPSBcImZyYWdHYXBcIiwgcy5SRU1VWF9BTExPQ19FUlJPUiA9IFwicmVtdXhBbGxvY0Vycm9yXCIsIHMuS0VZX0xPQURfRVJST1IgPSBcImtleUxvYWRFcnJvclwiLCBzLktFWV9MT0FEX1RJTUVPVVQgPSBcImtleUxvYWRUaW1lT3V0XCIsIHMuQlVGRkVSX0FERF9DT0RFQ19FUlJPUiA9IFwiYnVmZmVyQWRkQ29kZWNFcnJvclwiLCBzLkJVRkZFUl9JTkNPTVBBVElCTEVfQ09ERUNTX0VSUk9SID0gXCJidWZmZXJJbmNvbXBhdGlibGVDb2RlY3NFcnJvclwiLCBzLkJVRkZFUl9BUFBFTkRfRVJST1IgPSBcImJ1ZmZlckFwcGVuZEVycm9yXCIsIHMuQlVGRkVSX0FQUEVORElOR19FUlJPUiA9IFwiYnVmZmVyQXBwZW5kaW5nRXJyb3JcIiwgcy5CVUZGRVJfU1RBTExFRF9FUlJPUiA9IFwiYnVmZmVyU3RhbGxlZEVycm9yXCIsIHMuQlVGRkVSX0ZVTExfRVJST1IgPSBcImJ1ZmZlckZ1bGxFcnJvclwiLCBzLkJVRkZFUl9TRUVLX09WRVJfSE9MRSA9IFwiYnVmZmVyU2Vla092ZXJIb2xlXCIsIHMuQlVGRkVSX05VREdFX09OX1NUQUxMID0gXCJidWZmZXJOdWRnZU9uU3RhbGxcIiwgcy5BU1NFVF9MSVNUX0xPQURfRVJST1IgPSBcImFzc2V0TGlzdExvYWRFcnJvclwiLCBzLkFTU0VUX0xJU1RfTE9BRF9USU1FT1VUID0gXCJhc3NldExpc3RMb2FkVGltZW91dFwiLCBzLkFTU0VUX0xJU1RfUEFSU0lOR19FUlJPUiA9IFwiYXNzZXRMaXN0UGFyc2luZ0Vycm9yXCIsIHMuSU5URVJTVElUSUFMX0FTU0VUX0lURU1fRVJST1IgPSBcImludGVyc3RpdGlhbEFzc2V0SXRlbUVycm9yXCIsIHMuSU5URVJOQUxfRVhDRVBUSU9OID0gXCJpbnRlcm5hbEV4Y2VwdGlvblwiLCBzLklOVEVSTkFMX0FCT1JURUQgPSBcImFib3J0ZWRcIiwgcy5BVFRBQ0hfTUVESUFfRVJST1IgPSBcImF0dGFjaE1lZGlhRXJyb3JcIiwgcy5VTktOT1dOID0gXCJ1bmtub3duXCIsIHM7XG59KSh7fSksIEkgPSAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHMuTUVESUFfQVRUQUNISU5HID0gXCJobHNNZWRpYUF0dGFjaGluZ1wiLCBzLk1FRElBX0FUVEFDSEVEID0gXCJobHNNZWRpYUF0dGFjaGVkXCIsIHMuTUVESUFfREVUQUNISU5HID0gXCJobHNNZWRpYURldGFjaGluZ1wiLCBzLk1FRElBX0RFVEFDSEVEID0gXCJobHNNZWRpYURldGFjaGVkXCIsIHMuTUVESUFfRU5ERUQgPSBcImhsc01lZGlhRW5kZWRcIiwgcy5TVEFMTF9SRVNPTFZFRCA9IFwiaGxzU3RhbGxSZXNvbHZlZFwiLCBzLkJVRkZFUl9SRVNFVCA9IFwiaGxzQnVmZmVyUmVzZXRcIiwgcy5CVUZGRVJfQ09ERUNTID0gXCJobHNCdWZmZXJDb2RlY3NcIiwgcy5CVUZGRVJfQ1JFQVRFRCA9IFwiaGxzQnVmZmVyQ3JlYXRlZFwiLCBzLkJVRkZFUl9BUFBFTkRJTkcgPSBcImhsc0J1ZmZlckFwcGVuZGluZ1wiLCBzLkJVRkZFUl9BUFBFTkRFRCA9IFwiaGxzQnVmZmVyQXBwZW5kZWRcIiwgcy5CVUZGRVJfRU9TID0gXCJobHNCdWZmZXJFb3NcIiwgcy5CVUZGRVJFRF9UT19FTkQgPSBcImhsc0J1ZmZlcmVkVG9FbmRcIiwgcy5CVUZGRVJfRkxVU0hJTkcgPSBcImhsc0J1ZmZlckZsdXNoaW5nXCIsIHMuQlVGRkVSX0ZMVVNIRUQgPSBcImhsc0J1ZmZlckZsdXNoZWRcIiwgcy5NQU5JRkVTVF9MT0FESU5HID0gXCJobHNNYW5pZmVzdExvYWRpbmdcIiwgcy5NQU5JRkVTVF9MT0FERUQgPSBcImhsc01hbmlmZXN0TG9hZGVkXCIsIHMuTUFOSUZFU1RfUEFSU0VEID0gXCJobHNNYW5pZmVzdFBhcnNlZFwiLCBzLkxFVkVMX1NXSVRDSElORyA9IFwiaGxzTGV2ZWxTd2l0Y2hpbmdcIiwgcy5MRVZFTF9TV0lUQ0hFRCA9IFwiaGxzTGV2ZWxTd2l0Y2hlZFwiLCBzLkxFVkVMX0xPQURJTkcgPSBcImhsc0xldmVsTG9hZGluZ1wiLCBzLkxFVkVMX0xPQURFRCA9IFwiaGxzTGV2ZWxMb2FkZWRcIiwgcy5MRVZFTF9VUERBVEVEID0gXCJobHNMZXZlbFVwZGF0ZWRcIiwgcy5MRVZFTF9QVFNfVVBEQVRFRCA9IFwiaGxzTGV2ZWxQdHNVcGRhdGVkXCIsIHMuTEVWRUxTX1VQREFURUQgPSBcImhsc0xldmVsc1VwZGF0ZWRcIiwgcy5BVURJT19UUkFDS1NfVVBEQVRFRCA9IFwiaGxzQXVkaW9UcmFja3NVcGRhdGVkXCIsIHMuQVVESU9fVFJBQ0tfU1dJVENISU5HID0gXCJobHNBdWRpb1RyYWNrU3dpdGNoaW5nXCIsIHMuQVVESU9fVFJBQ0tfU1dJVENIRUQgPSBcImhsc0F1ZGlvVHJhY2tTd2l0Y2hlZFwiLCBzLkFVRElPX1RSQUNLX0xPQURJTkcgPSBcImhsc0F1ZGlvVHJhY2tMb2FkaW5nXCIsIHMuQVVESU9fVFJBQ0tfTE9BREVEID0gXCJobHNBdWRpb1RyYWNrTG9hZGVkXCIsIHMuQVVESU9fVFJBQ0tfVVBEQVRFRCA9IFwiaGxzQXVkaW9UcmFja1VwZGF0ZWRcIiwgcy5TVUJUSVRMRV9UUkFDS1NfVVBEQVRFRCA9IFwiaGxzU3VidGl0bGVUcmFja3NVcGRhdGVkXCIsIHMuU1VCVElUTEVfVFJBQ0tTX0NMRUFSRUQgPSBcImhsc1N1YnRpdGxlVHJhY2tzQ2xlYXJlZFwiLCBzLlNVQlRJVExFX1RSQUNLX1NXSVRDSCA9IFwiaGxzU3VidGl0bGVUcmFja1N3aXRjaFwiLCBzLlNVQlRJVExFX1RSQUNLX0xPQURJTkcgPSBcImhsc1N1YnRpdGxlVHJhY2tMb2FkaW5nXCIsIHMuU1VCVElUTEVfVFJBQ0tfTE9BREVEID0gXCJobHNTdWJ0aXRsZVRyYWNrTG9hZGVkXCIsIHMuU1VCVElUTEVfVFJBQ0tfVVBEQVRFRCA9IFwiaGxzU3VidGl0bGVUcmFja1VwZGF0ZWRcIiwgcy5TVUJUSVRMRV9GUkFHX1BST0NFU1NFRCA9IFwiaGxzU3VidGl0bGVGcmFnUHJvY2Vzc2VkXCIsIHMuQ1VFU19QQVJTRUQgPSBcImhsc0N1ZXNQYXJzZWRcIiwgcy5OT05fTkFUSVZFX1RFWFRfVFJBQ0tTX0ZPVU5EID0gXCJobHNOb25OYXRpdmVUZXh0VHJhY2tzRm91bmRcIiwgcy5JTklUX1BUU19GT1VORCA9IFwiaGxzSW5pdFB0c0ZvdW5kXCIsIHMuRlJBR19MT0FESU5HID0gXCJobHNGcmFnTG9hZGluZ1wiLCBzLkZSQUdfTE9BRF9FTUVSR0VOQ1lfQUJPUlRFRCA9IFwiaGxzRnJhZ0xvYWRFbWVyZ2VuY3lBYm9ydGVkXCIsIHMuRlJBR19MT0FERUQgPSBcImhsc0ZyYWdMb2FkZWRcIiwgcy5GUkFHX0RFQ1JZUFRFRCA9IFwiaGxzRnJhZ0RlY3J5cHRlZFwiLCBzLkZSQUdfUEFSU0lOR19JTklUX1NFR01FTlQgPSBcImhsc0ZyYWdQYXJzaW5nSW5pdFNlZ21lbnRcIiwgcy5GUkFHX1BBUlNJTkdfVVNFUkRBVEEgPSBcImhsc0ZyYWdQYXJzaW5nVXNlcmRhdGFcIiwgcy5GUkFHX1BBUlNJTkdfTUVUQURBVEEgPSBcImhsc0ZyYWdQYXJzaW5nTWV0YWRhdGFcIiwgcy5GUkFHX1BBUlNFRCA9IFwiaGxzRnJhZ1BhcnNlZFwiLCBzLkZSQUdfQlVGRkVSRUQgPSBcImhsc0ZyYWdCdWZmZXJlZFwiLCBzLkZSQUdfQ0hBTkdFRCA9IFwiaGxzRnJhZ0NoYW5nZWRcIiwgcy5GUFNfRFJPUCA9IFwiaGxzRnBzRHJvcFwiLCBzLkZQU19EUk9QX0xFVkVMX0NBUFBJTkcgPSBcImhsc0Zwc0Ryb3BMZXZlbENhcHBpbmdcIiwgcy5NQVhfQVVUT19MRVZFTF9VUERBVEVEID0gXCJobHNNYXhBdXRvTGV2ZWxVcGRhdGVkXCIsIHMuRVJST1IgPSBcImhsc0Vycm9yXCIsIHMuREVTVFJPWUlORyA9IFwiaGxzRGVzdHJveWluZ1wiLCBzLktFWV9MT0FESU5HID0gXCJobHNLZXlMb2FkaW5nXCIsIHMuS0VZX0xPQURFRCA9IFwiaGxzS2V5TG9hZGVkXCIsIHMuTElWRV9CQUNLX0JVRkZFUl9SRUFDSEVEID0gXCJobHNMaXZlQmFja0J1ZmZlclJlYWNoZWRcIiwgcy5CQUNLX0JVRkZFUl9SRUFDSEVEID0gXCJobHNCYWNrQnVmZmVyUmVhY2hlZFwiLCBzLlNURUVSSU5HX01BTklGRVNUX0xPQURFRCA9IFwiaGxzU3RlZXJpbmdNYW5pZmVzdExvYWRlZFwiLCBzLkFTU0VUX0xJU1RfTE9BRElORyA9IFwiaGxzQXNzZXRMaXN0TG9hZGluZ1wiLCBzLkFTU0VUX0xJU1RfTE9BREVEID0gXCJobHNBc3NldExpc3RMb2FkZWRcIiwgcy5JTlRFUlNUSVRJQUxTX1VQREFURUQgPSBcImhsc0ludGVyc3RpdGlhbHNVcGRhdGVkXCIsIHMuSU5URVJTVElUSUFMU19CVUZGRVJFRF9UT19CT1VOREFSWSA9IFwiaGxzSW50ZXJzdGl0aWFsc0J1ZmZlcmVkVG9Cb3VuZGFyeVwiLCBzLklOVEVSU1RJVElBTF9BU1NFVF9QTEFZRVJfQ1JFQVRFRCA9IFwiaGxzSW50ZXJzdGl0aWFsQXNzZXRQbGF5ZXJDcmVhdGVkXCIsIHMuSU5URVJTVElUSUFMX1NUQVJURUQgPSBcImhsc0ludGVyc3RpdGlhbFN0YXJ0ZWRcIiwgcy5JTlRFUlNUSVRJQUxfQVNTRVRfU1RBUlRFRCA9IFwiaGxzSW50ZXJzdGl0aWFsQXNzZXRTdGFydGVkXCIsIHMuSU5URVJTVElUSUFMX0FTU0VUX0VOREVEID0gXCJobHNJbnRlcnN0aXRpYWxBc3NldEVuZGVkXCIsIHMuSU5URVJTVElUSUFMX0FTU0VUX0VSUk9SID0gXCJobHNJbnRlcnN0aXRpYWxBc3NldEVycm9yXCIsIHMuSU5URVJTVElUSUFMX0VOREVEID0gXCJobHNJbnRlcnN0aXRpYWxFbmRlZFwiLCBzLklOVEVSU1RJVElBTFNfUFJJTUFSWV9SRVNVTUVEID0gXCJobHNJbnRlcnN0aXRpYWxzUHJpbWFyeVJlc3VtZWRcIiwgcy5QTEFZT1VUX0xJTUlUX1JFQUNIRUQgPSBcImhsc1BsYXlvdXRMaW1pdFJlYWNoZWRcIiwgcy5FVkVOVF9DVUVfRU5URVIgPSBcImhsc0V2ZW50Q3VlRW50ZXJcIiwgcztcbn0pKHt9KTtcbnZhciBLZSA9IHtcbiAgTUFOSUZFU1Q6IFwibWFuaWZlc3RcIixcbiAgTEVWRUw6IFwibGV2ZWxcIixcbiAgQVVESU9fVFJBQ0s6IFwiYXVkaW9UcmFja1wiLFxuICBTVUJUSVRMRV9UUkFDSzogXCJzdWJ0aXRsZVRyYWNrXCJcbn0sIHBlID0ge1xuICBNQUlOOiBcIm1haW5cIixcbiAgQVVESU86IFwiYXVkaW9cIixcbiAgU1VCVElUTEU6IFwic3VidGl0bGVcIlxufTtcbmNsYXNzIGhuIHtcbiAgLy8gIEFib3V0IGhhbGYgb2YgdGhlIGVzdGltYXRlZCB2YWx1ZSB3aWxsIGJlIGZyb20gdGhlIGxhc3QgfGhhbGZMaWZlfCBzYW1wbGVzIGJ5IHdlaWdodC5cbiAgY29uc3RydWN0b3IoZSwgdCA9IDAsIHIgPSAwKSB7XG4gICAgdGhpcy5oYWxmTGlmZSA9IHZvaWQgMCwgdGhpcy5hbHBoYV8gPSB2b2lkIDAsIHRoaXMuZXN0aW1hdGVfID0gdm9pZCAwLCB0aGlzLnRvdGFsV2VpZ2h0XyA9IHZvaWQgMCwgdGhpcy5oYWxmTGlmZSA9IGUsIHRoaXMuYWxwaGFfID0gZSA/IE1hdGguZXhwKE1hdGgubG9nKDAuNSkgLyBlKSA6IDAsIHRoaXMuZXN0aW1hdGVfID0gdCwgdGhpcy50b3RhbFdlaWdodF8gPSByO1xuICB9XG4gIHNhbXBsZShlLCB0KSB7XG4gICAgY29uc3QgciA9IE1hdGgucG93KHRoaXMuYWxwaGFfLCBlKTtcbiAgICB0aGlzLmVzdGltYXRlXyA9IHQgKiAoMSAtIHIpICsgciAqIHRoaXMuZXN0aW1hdGVfLCB0aGlzLnRvdGFsV2VpZ2h0XyArPSBlO1xuICB9XG4gIGdldFRvdGFsV2VpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLnRvdGFsV2VpZ2h0XztcbiAgfVxuICBnZXRFc3RpbWF0ZSgpIHtcbiAgICBpZiAodGhpcy5hbHBoYV8pIHtcbiAgICAgIGNvbnN0IGUgPSAxIC0gTWF0aC5wb3codGhpcy5hbHBoYV8sIHRoaXMudG90YWxXZWlnaHRfKTtcbiAgICAgIGlmIChlKVxuICAgICAgICByZXR1cm4gdGhpcy5lc3RpbWF0ZV8gLyBlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5lc3RpbWF0ZV87XG4gIH1cbn1cbmNsYXNzIFRTIHtcbiAgY29uc3RydWN0b3IoZSwgdCwgciwgbiA9IDEwMCkge1xuICAgIHRoaXMuZGVmYXVsdEVzdGltYXRlXyA9IHZvaWQgMCwgdGhpcy5taW5XZWlnaHRfID0gdm9pZCAwLCB0aGlzLm1pbkRlbGF5TXNfID0gdm9pZCAwLCB0aGlzLnNsb3dfID0gdm9pZCAwLCB0aGlzLmZhc3RfID0gdm9pZCAwLCB0aGlzLmRlZmF1bHRUVEZCXyA9IHZvaWQgMCwgdGhpcy50dGZiXyA9IHZvaWQgMCwgdGhpcy5kZWZhdWx0RXN0aW1hdGVfID0gciwgdGhpcy5taW5XZWlnaHRfID0gMWUtMywgdGhpcy5taW5EZWxheU1zXyA9IDUwLCB0aGlzLnNsb3dfID0gbmV3IGhuKGUpLCB0aGlzLmZhc3RfID0gbmV3IGhuKHQpLCB0aGlzLmRlZmF1bHRUVEZCXyA9IG4sIHRoaXMudHRmYl8gPSBuZXcgaG4oZSk7XG4gIH1cbiAgdXBkYXRlKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBzbG93XzogcixcbiAgICAgIGZhc3RfOiBuLFxuICAgICAgdHRmYl86IGlcbiAgICB9ID0gdGhpcztcbiAgICByLmhhbGZMaWZlICE9PSBlICYmICh0aGlzLnNsb3dfID0gbmV3IGhuKGUsIHIuZ2V0RXN0aW1hdGUoKSwgci5nZXRUb3RhbFdlaWdodCgpKSksIG4uaGFsZkxpZmUgIT09IHQgJiYgKHRoaXMuZmFzdF8gPSBuZXcgaG4odCwgbi5nZXRFc3RpbWF0ZSgpLCBuLmdldFRvdGFsV2VpZ2h0KCkpKSwgaS5oYWxmTGlmZSAhPT0gZSAmJiAodGhpcy50dGZiXyA9IG5ldyBobihlLCBpLmdldEVzdGltYXRlKCksIGkuZ2V0VG90YWxXZWlnaHQoKSkpO1xuICB9XG4gIHNhbXBsZShlLCB0KSB7XG4gICAgZSA9IE1hdGgubWF4KGUsIHRoaXMubWluRGVsYXlNc18pO1xuICAgIGNvbnN0IHIgPSA4ICogdCwgbiA9IGUgLyAxZTMsIGkgPSByIC8gbjtcbiAgICB0aGlzLmZhc3RfLnNhbXBsZShuLCBpKSwgdGhpcy5zbG93Xy5zYW1wbGUobiwgaSk7XG4gIH1cbiAgc2FtcGxlVFRGQihlKSB7XG4gICAgY29uc3QgdCA9IGUgLyAxZTMsIHIgPSBNYXRoLnNxcnQoMikgKiBNYXRoLmV4cCgtTWF0aC5wb3codCwgMikgLyAyKTtcbiAgICB0aGlzLnR0ZmJfLnNhbXBsZShyLCBNYXRoLm1heChlLCA1KSk7XG4gIH1cbiAgY2FuRXN0aW1hdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZmFzdF8uZ2V0VG90YWxXZWlnaHQoKSA+PSB0aGlzLm1pbldlaWdodF87XG4gIH1cbiAgZ2V0RXN0aW1hdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2FuRXN0aW1hdGUoKSA/IE1hdGgubWluKHRoaXMuZmFzdF8uZ2V0RXN0aW1hdGUoKSwgdGhpcy5zbG93Xy5nZXRFc3RpbWF0ZSgpKSA6IHRoaXMuZGVmYXVsdEVzdGltYXRlXztcbiAgfVxuICBnZXRFc3RpbWF0ZVRURkIoKSB7XG4gICAgcmV0dXJuIHRoaXMudHRmYl8uZ2V0VG90YWxXZWlnaHQoKSA+PSB0aGlzLm1pbldlaWdodF8gPyB0aGlzLnR0ZmJfLmdldEVzdGltYXRlKCkgOiB0aGlzLmRlZmF1bHRUVEZCXztcbiAgfVxuICBnZXQgZGVmYXVsdEVzdGltYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmRlZmF1bHRFc3RpbWF0ZV87XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgfVxufVxuZnVuY3Rpb24gd1MocywgZSwgdCkge1xuICByZXR1cm4gKGUgPSBJUyhlKSkgaW4gcyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShzLCBlLCB7XG4gICAgdmFsdWU6IHQsXG4gICAgZW51bWVyYWJsZTogITAsXG4gICAgY29uZmlndXJhYmxlOiAhMCxcbiAgICB3cml0YWJsZTogITBcbiAgfSkgOiBzW2VdID0gdCwgcztcbn1cbmZ1bmN0aW9uIG50KCkge1xuICByZXR1cm4gbnQgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbihzKSB7XG4gICAgZm9yICh2YXIgZSA9IDE7IGUgPCBhcmd1bWVudHMubGVuZ3RoOyBlKyspIHtcbiAgICAgIHZhciB0ID0gYXJndW1lbnRzW2VdO1xuICAgICAgZm9yICh2YXIgciBpbiB0KSAoe30pLmhhc093blByb3BlcnR5LmNhbGwodCwgcikgJiYgKHNbcl0gPSB0W3JdKTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG4gIH0sIG50LmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7XG59XG5mdW5jdGlvbiBYZChzLCBlKSB7XG4gIHZhciB0ID0gT2JqZWN0LmtleXMocyk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpO1xuICAgIGUgJiYgKHIgPSByLmZpbHRlcihmdW5jdGlvbihuKSB7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzLCBuKS5lbnVtZXJhYmxlO1xuICAgIH0pKSwgdC5wdXNoLmFwcGx5KHQsIHIpO1xuICB9XG4gIHJldHVybiB0O1xufVxuZnVuY3Rpb24gdHQocykge1xuICBmb3IgKHZhciBlID0gMTsgZSA8IGFyZ3VtZW50cy5sZW5ndGg7IGUrKykge1xuICAgIHZhciB0ID0gYXJndW1lbnRzW2VdICE9IG51bGwgPyBhcmd1bWVudHNbZV0gOiB7fTtcbiAgICBlICUgMiA/IFhkKE9iamVjdCh0KSwgITApLmZvckVhY2goZnVuY3Rpb24ocikge1xuICAgICAgd1MocywgciwgdFtyXSk7XG4gICAgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHMsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHQpKSA6IFhkKE9iamVjdCh0KSkuZm9yRWFjaChmdW5jdGlvbihyKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocywgciwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCByKSk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBBUyhzLCBlKSB7XG4gIGlmICh0eXBlb2YgcyAhPSBcIm9iamVjdFwiIHx8ICFzKSByZXR1cm4gcztcbiAgdmFyIHQgPSBzW1N5bWJvbC50b1ByaW1pdGl2ZV07XG4gIGlmICh0ICE9PSB2b2lkIDApIHtcbiAgICB2YXIgciA9IHQuY2FsbChzLCBlKTtcbiAgICBpZiAodHlwZW9mIHIgIT0gXCJvYmplY3RcIikgcmV0dXJuIHI7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuXCIpO1xuICB9XG4gIHJldHVybiAoZSA9PT0gXCJzdHJpbmdcIiA/IFN0cmluZyA6IE51bWJlcikocyk7XG59XG5mdW5jdGlvbiBJUyhzKSB7XG4gIHZhciBlID0gQVMocywgXCJzdHJpbmdcIik7XG4gIHJldHVybiB0eXBlb2YgZSA9PSBcInN5bWJvbFwiID8gZSA6IGUgKyBcIlwiO1xufVxuY2xhc3MgTHIge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgdGhpcy50cmFjZSA9IHZvaWQgMCwgdGhpcy5kZWJ1ZyA9IHZvaWQgMCwgdGhpcy5sb2cgPSB2b2lkIDAsIHRoaXMud2FybiA9IHZvaWQgMCwgdGhpcy5pbmZvID0gdm9pZCAwLCB0aGlzLmVycm9yID0gdm9pZCAwO1xuICAgIGNvbnN0IHIgPSBgWyR7ZX1dOmA7XG4gICAgdGhpcy50cmFjZSA9IEFzLCB0aGlzLmRlYnVnID0gdC5kZWJ1Zy5iaW5kKG51bGwsIHIpLCB0aGlzLmxvZyA9IHQubG9nLmJpbmQobnVsbCwgciksIHRoaXMud2FybiA9IHQud2Fybi5iaW5kKG51bGwsIHIpLCB0aGlzLmluZm8gPSB0LmluZm8uYmluZChudWxsLCByKSwgdGhpcy5lcnJvciA9IHQuZXJyb3IuYmluZChudWxsLCByKTtcbiAgfVxufVxuY29uc3QgQXMgPSBmdW5jdGlvbigpIHtcbn0sIF9TID0ge1xuICB0cmFjZTogQXMsXG4gIGRlYnVnOiBBcyxcbiAgbG9nOiBBcyxcbiAgd2FybjogQXMsXG4gIGluZm86IEFzLFxuICBlcnJvcjogQXNcbn07XG5mdW5jdGlvbiBvYygpIHtcbiAgcmV0dXJuIG50KHt9LCBfUyk7XG59XG5mdW5jdGlvbiBSUyhzLCBlKSB7XG4gIGNvbnN0IHQgPSBzZWxmLmNvbnNvbGVbc107XG4gIHJldHVybiB0ID8gdC5iaW5kKHNlbGYuY29uc29sZSwgYCR7ZSA/IFwiW1wiICsgZSArIFwiXSBcIiA6IFwiXCJ9WyR7c31dID5gKSA6IEFzO1xufVxuZnVuY3Rpb24gSmQocywgZSwgdCkge1xuICByZXR1cm4gZVtzXSA/IGVbc10uYmluZChlKSA6IFJTKHMsIHQpO1xufVxuY29uc3QgYWMgPSBvYygpO1xuZnVuY3Rpb24gTFMocywgZSwgdCkge1xuICBjb25zdCByID0gb2MoKTtcbiAgaWYgKHR5cGVvZiBjb25zb2xlID09IFwib2JqZWN0XCIgJiYgcyA9PT0gITAgfHwgdHlwZW9mIHMgPT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IG4gPSBbXG4gICAgICAvLyBSZW1vdmUgb3V0IGZyb20gbGlzdCBoZXJlIHRvIGhhcmQtZGlzYWJsZSBhIGxvZy1sZXZlbFxuICAgICAgLy8gJ3RyYWNlJyxcbiAgICAgIFwiZGVidWdcIixcbiAgICAgIFwibG9nXCIsXG4gICAgICBcImluZm9cIixcbiAgICAgIFwid2FyblwiLFxuICAgICAgXCJlcnJvclwiXG4gICAgXTtcbiAgICBuLmZvckVhY2goKGkpID0+IHtcbiAgICAgIHJbaV0gPSBKZChpLCBzLCB0KTtcbiAgICB9KTtcbiAgICB0cnkge1xuICAgICAgci5sb2coYERlYnVnIGxvZ3MgZW5hYmxlZCBmb3IgXCIke2V9XCIgaW4gaGxzLmpzIHZlcnNpb24gMS42LjEyYCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gb2MoKTtcbiAgICB9XG4gICAgbi5mb3JFYWNoKChpKSA9PiB7XG4gICAgICBhY1tpXSA9IEpkKGksIHMpO1xuICAgIH0pO1xuICB9IGVsc2VcbiAgICBudChhYywgcik7XG4gIHJldHVybiByO1xufVxuY29uc3QgcnQgPSBhYztcbmZ1bmN0aW9uIE1zKHMgPSAhMCkge1xuICByZXR1cm4gdHlwZW9mIHNlbGYgPiBcInVcIiA/IHZvaWQgMCA6IChzIHx8ICFzZWxmLk1lZGlhU291cmNlKSAmJiBzZWxmLk1hbmFnZWRNZWRpYVNvdXJjZSB8fCBzZWxmLk1lZGlhU291cmNlIHx8IHNlbGYuV2ViS2l0TWVkaWFTb3VyY2U7XG59XG5mdW5jdGlvbiBDUyhzKSB7XG4gIHJldHVybiB0eXBlb2Ygc2VsZiA8IFwidVwiICYmIHMgPT09IHNlbGYuTWFuYWdlZE1lZGlhU291cmNlO1xufVxuZnVuY3Rpb24gQWcocywgZSkge1xuICBjb25zdCB0ID0gT2JqZWN0LmtleXMocyksIHIgPSBPYmplY3Qua2V5cyhlKSwgbiA9IHQubGVuZ3RoLCBpID0gci5sZW5ndGg7XG4gIHJldHVybiAhbiB8fCAhaSB8fCBuID09PSBpICYmICF0LnNvbWUoKG8pID0+IHIuaW5kZXhPZihvKSA9PT0gLTEpO1xufVxuZnVuY3Rpb24gVHIocywgZSA9ICExKSB7XG4gIGlmICh0eXBlb2YgVGV4dERlY29kZXIgPCBcInVcIikge1xuICAgIGNvbnN0IGMgPSBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiKS5kZWNvZGUocyk7XG4gICAgaWYgKGUpIHtcbiAgICAgIGNvbnN0IHUgPSBjLmluZGV4T2YoXCJcXDBcIik7XG4gICAgICByZXR1cm4gdSAhPT0gLTEgPyBjLnN1YnN0cmluZygwLCB1KSA6IGM7XG4gICAgfVxuICAgIHJldHVybiBjLnJlcGxhY2UoL1xcMC9nLCBcIlwiKTtcbiAgfVxuICBjb25zdCB0ID0gcy5sZW5ndGg7XG4gIGxldCByLCBuLCBpLCBvID0gXCJcIiwgYSA9IDA7XG4gIGZvciAoOyBhIDwgdDsgKSB7XG4gICAgaWYgKHIgPSBzW2ErK10sIHIgPT09IDAgJiYgZSlcbiAgICAgIHJldHVybiBvO1xuICAgIGlmIChyID09PSAwIHx8IHIgPT09IDMpXG4gICAgICBjb250aW51ZTtcbiAgICBzd2l0Y2ggKHIgPj4gNCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgY2FzZSAxOlxuICAgICAgY2FzZSAyOlxuICAgICAgY2FzZSAzOlxuICAgICAgY2FzZSA0OlxuICAgICAgY2FzZSA1OlxuICAgICAgY2FzZSA2OlxuICAgICAgY2FzZSA3OlxuICAgICAgICBvICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxMjpcbiAgICAgIGNhc2UgMTM6XG4gICAgICAgIG4gPSBzW2ErK10sIG8gKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgociAmIDMxKSA8PCA2IHwgbiAmIDYzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDE0OlxuICAgICAgICBuID0gc1thKytdLCBpID0gc1thKytdLCBvICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKHIgJiAxNSkgPDwgMTIgfCAobiAmIDYzKSA8PCA2IHwgKGkgJiA2MykgPDwgMCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbztcbn1cbmZ1bmN0aW9uIGZyKHMpIHtcbiAgbGV0IGUgPSBcIlwiO1xuICBmb3IgKGxldCB0ID0gMDsgdCA8IHMubGVuZ3RoOyB0KyspIHtcbiAgICBsZXQgciA9IHNbdF0udG9TdHJpbmcoMTYpO1xuICAgIHIubGVuZ3RoIDwgMiAmJiAociA9IFwiMFwiICsgciksIGUgKz0gcjtcbiAgfVxuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIElnKHMpIHtcbiAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShzLnJlcGxhY2UoL14weC8sIFwiXCIpLnJlcGxhY2UoLyhbXFxkYS1mQS1GXXsyfSkgPy9nLCBcIjB4JDEgXCIpLnJlcGxhY2UoLyArJC8sIFwiXCIpLnNwbGl0KFwiIFwiKSkuYnVmZmVyO1xufVxuZnVuY3Rpb24ga1Mocykge1xuICByZXR1cm4gcyAmJiBzLl9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIFwiZGVmYXVsdFwiKSA/IHMuZGVmYXVsdCA6IHM7XG59XG52YXIgY2wgPSB7IGV4cG9ydHM6IHt9IH0sIFFkO1xuZnVuY3Rpb24gRFMoKSB7XG4gIHJldHVybiBRZCB8fCAoUWQgPSAxLCAoZnVuY3Rpb24ocywgZSkge1xuICAgIChmdW5jdGlvbih0KSB7XG4gICAgICB2YXIgciA9IC9eKD89KCg/OlthLXpBLVowLTkrXFwtLl0rOik/KSlcXDEoPz0oKD86XFwvXFwvW15cXC8/I10qKT8pKVxcMig/PSgoPzooPzpbXj8jXFwvXSpcXC8pKlteOz8jXFwvXSopPykpXFwzKCg/OjtbXj8jXSopPykoXFw/W14jXSopPygjW15dKik/JC8sIG4gPSAvXig/PShbXlxcLz8jXSopKVxcMShbXl0qKSQvLCBpID0gLyg/OlxcL3xeKVxcLig/PVxcLykvZywgbyA9IC8oPzpcXC98XilcXC5cXC5cXC8oPyFcXC5cXC5cXC8pW15cXC9dKig/PVxcLykvZywgYSA9IHtcbiAgICAgICAgLy8gSWYgb3B0cy5hbHdheXNOb3JtYWxpemUgaXMgdHJ1ZSB0aGVuIHRoZSBwYXRoIHdpbGwgYWx3YXlzIGJlIG5vcm1hbGl6ZWQgZXZlbiB3aGVuIGl0IHN0YXJ0cyB3aXRoIC8gb3IgLy9cbiAgICAgICAgLy8gRS5nXG4gICAgICAgIC8vIFdpdGggb3B0cy5hbHdheXNOb3JtYWxpemUgPSBmYWxzZSAoZGVmYXVsdCwgc3BlYyBjb21wbGlhbnQpXG4gICAgICAgIC8vIGh0dHA6Ly9hLmNvbS9iL2NkICsgL2UvZi8uLi9nID0+IGh0dHA6Ly9hLmNvbS9lL2YvLi4vZ1xuICAgICAgICAvLyBXaXRoIG9wdHMuYWx3YXlzTm9ybWFsaXplID0gdHJ1ZSAobm90IHNwZWMgY29tcGxpYW50KVxuICAgICAgICAvLyBodHRwOi8vYS5jb20vYi9jZCArIC9lL2YvLi4vZyA9PiBodHRwOi8vYS5jb20vZS9nXG4gICAgICAgIGJ1aWxkQWJzb2x1dGVVUkw6IGZ1bmN0aW9uKGwsIGMsIHUpIHtcbiAgICAgICAgICBpZiAodSA9IHUgfHwge30sIGwgPSBsLnRyaW0oKSwgYyA9IGMudHJpbSgpLCAhYykge1xuICAgICAgICAgICAgaWYgKCF1LmFsd2F5c05vcm1hbGl6ZSlcbiAgICAgICAgICAgICAgcmV0dXJuIGw7XG4gICAgICAgICAgICB2YXIgZCA9IGEucGFyc2VVUkwobCk7XG4gICAgICAgICAgICBpZiAoIWQpXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkVycm9yIHRyeWluZyB0byBwYXJzZSBiYXNlIFVSTC5cIik7XG4gICAgICAgICAgICByZXR1cm4gZC5wYXRoID0gYS5ub3JtYWxpemVQYXRoKFxuICAgICAgICAgICAgICBkLnBhdGhcbiAgICAgICAgICAgICksIGEuYnVpbGRVUkxGcm9tUGFydHMoZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHZhciBoID0gYS5wYXJzZVVSTChjKTtcbiAgICAgICAgICBpZiAoIWgpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciB0cnlpbmcgdG8gcGFyc2UgcmVsYXRpdmUgVVJMLlwiKTtcbiAgICAgICAgICBpZiAoaC5zY2hlbWUpXG4gICAgICAgICAgICByZXR1cm4gdS5hbHdheXNOb3JtYWxpemUgPyAoaC5wYXRoID0gYS5ub3JtYWxpemVQYXRoKGgucGF0aCksIGEuYnVpbGRVUkxGcm9tUGFydHMoaCkpIDogYztcbiAgICAgICAgICB2YXIgZiA9IGEucGFyc2VVUkwobCk7XG4gICAgICAgICAgaWYgKCFmKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgdHJ5aW5nIHRvIHBhcnNlIGJhc2UgVVJMLlwiKTtcbiAgICAgICAgICBpZiAoIWYubmV0TG9jICYmIGYucGF0aCAmJiBmLnBhdGhbMF0gIT09IFwiL1wiKSB7XG4gICAgICAgICAgICB2YXIgcCA9IG4uZXhlYyhmLnBhdGgpO1xuICAgICAgICAgICAgZi5uZXRMb2MgPSBwWzFdLCBmLnBhdGggPSBwWzJdO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmLm5ldExvYyAmJiAhZi5wYXRoICYmIChmLnBhdGggPSBcIi9cIik7XG4gICAgICAgICAgdmFyIHkgPSB7XG4gICAgICAgICAgICAvLyAyYykgT3RoZXJ3aXNlLCB0aGUgZW1iZWRkZWQgVVJMIGluaGVyaXRzIHRoZSBzY2hlbWUgb2ZcbiAgICAgICAgICAgIC8vIHRoZSBiYXNlIFVSTC5cbiAgICAgICAgICAgIHNjaGVtZTogZi5zY2hlbWUsXG4gICAgICAgICAgICBuZXRMb2M6IGgubmV0TG9jLFxuICAgICAgICAgICAgcGF0aDogbnVsbCxcbiAgICAgICAgICAgIHBhcmFtczogaC5wYXJhbXMsXG4gICAgICAgICAgICBxdWVyeTogaC5xdWVyeSxcbiAgICAgICAgICAgIGZyYWdtZW50OiBoLmZyYWdtZW50XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoIWgubmV0TG9jICYmICh5Lm5ldExvYyA9IGYubmV0TG9jLCBoLnBhdGhbMF0gIT09IFwiL1wiKSlcbiAgICAgICAgICAgIGlmICghaC5wYXRoKVxuICAgICAgICAgICAgICB5LnBhdGggPSBmLnBhdGgsIGgucGFyYW1zIHx8ICh5LnBhcmFtcyA9IGYucGFyYW1zLCBoLnF1ZXJ5IHx8ICh5LnF1ZXJ5ID0gZi5xdWVyeSkpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIHZhciBFID0gZi5wYXRoLCBiID0gRS5zdWJzdHJpbmcoMCwgRS5sYXN0SW5kZXhPZihcIi9cIikgKyAxKSArIGgucGF0aDtcbiAgICAgICAgICAgICAgeS5wYXRoID0gYS5ub3JtYWxpemVQYXRoKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB5LnBhdGggPT09IG51bGwgJiYgKHkucGF0aCA9IHUuYWx3YXlzTm9ybWFsaXplID8gYS5ub3JtYWxpemVQYXRoKGgucGF0aCkgOiBoLnBhdGgpLCBhLmJ1aWxkVVJMRnJvbVBhcnRzKHkpO1xuICAgICAgICB9LFxuICAgICAgICBwYXJzZVVSTDogZnVuY3Rpb24obCkge1xuICAgICAgICAgIHZhciBjID0gci5leGVjKGwpO1xuICAgICAgICAgIHJldHVybiBjID8ge1xuICAgICAgICAgICAgc2NoZW1lOiBjWzFdIHx8IFwiXCIsXG4gICAgICAgICAgICBuZXRMb2M6IGNbMl0gfHwgXCJcIixcbiAgICAgICAgICAgIHBhdGg6IGNbM10gfHwgXCJcIixcbiAgICAgICAgICAgIHBhcmFtczogY1s0XSB8fCBcIlwiLFxuICAgICAgICAgICAgcXVlcnk6IGNbNV0gfHwgXCJcIixcbiAgICAgICAgICAgIGZyYWdtZW50OiBjWzZdIHx8IFwiXCJcbiAgICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgbm9ybWFsaXplUGF0aDogZnVuY3Rpb24obCkge1xuICAgICAgICAgIGZvciAobCA9IGwuc3BsaXQoXCJcIikucmV2ZXJzZSgpLmpvaW4oXCJcIikucmVwbGFjZShpLCBcIlwiKTsgbC5sZW5ndGggIT09IChsID0gbC5yZXBsYWNlKG8sIFwiXCIpKS5sZW5ndGg7IClcbiAgICAgICAgICAgIDtcbiAgICAgICAgICByZXR1cm4gbC5zcGxpdChcIlwiKS5yZXZlcnNlKCkuam9pbihcIlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgYnVpbGRVUkxGcm9tUGFydHM6IGZ1bmN0aW9uKGwpIHtcbiAgICAgICAgICByZXR1cm4gbC5zY2hlbWUgKyBsLm5ldExvYyArIGwucGF0aCArIGwucGFyYW1zICsgbC5xdWVyeSArIGwuZnJhZ21lbnQ7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBzLmV4cG9ydHMgPSBhO1xuICAgIH0pKCk7XG4gIH0pKGNsKSksIGNsLmV4cG9ydHM7XG59XG52YXIgaHUgPSBEUygpO1xuY2xhc3MgZnUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmFib3J0ZWQgPSAhMSwgdGhpcy5sb2FkZWQgPSAwLCB0aGlzLnJldHJ5ID0gMCwgdGhpcy50b3RhbCA9IDAsIHRoaXMuY2h1bmtDb3VudCA9IDAsIHRoaXMuYndFc3RpbWF0ZSA9IDAsIHRoaXMubG9hZGluZyA9IHtcbiAgICAgIHN0YXJ0OiAwLFxuICAgICAgZmlyc3Q6IDAsXG4gICAgICBlbmQ6IDBcbiAgICB9LCB0aGlzLnBhcnNpbmcgPSB7XG4gICAgICBzdGFydDogMCxcbiAgICAgIGVuZDogMFxuICAgIH0sIHRoaXMuYnVmZmVyaW5nID0ge1xuICAgICAgc3RhcnQ6IDAsXG4gICAgICBmaXJzdDogMCxcbiAgICAgIGVuZDogMFxuICAgIH07XG4gIH1cbn1cbnZhciBvdCA9IHtcbiAgQVVESU86IFwiYXVkaW9cIixcbiAgVklERU86IFwidmlkZW9cIixcbiAgQVVESU9WSURFTzogXCJhdWRpb3ZpZGVvXCJcbn07XG5jbGFzcyBfZyB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLl9ieXRlUmFuZ2UgPSBudWxsLCB0aGlzLl91cmwgPSBudWxsLCB0aGlzLl9zdGF0cyA9IG51bGwsIHRoaXMuX3N0cmVhbXMgPSBudWxsLCB0aGlzLmJhc2UgPSB2b2lkIDAsIHRoaXMucmVsdXJsID0gdm9pZCAwLCB0eXBlb2YgZSA9PSBcInN0cmluZ1wiICYmIChlID0ge1xuICAgICAgdXJsOiBlXG4gICAgfSksIHRoaXMuYmFzZSA9IGUsIE1TKHRoaXMsIFwic3RhdHNcIik7XG4gIH1cbiAgLy8gc2V0Qnl0ZVJhbmdlIGNvbnZlcnRzIGEgRVhULVgtQllURVJBTkdFIGF0dHJpYnV0ZSBpbnRvIGEgdHdvIGVsZW1lbnQgYXJyYXlcbiAgc2V0Qnl0ZVJhbmdlKGUsIHQpIHtcbiAgICBjb25zdCByID0gZS5zcGxpdChcIkBcIiwgMik7XG4gICAgbGV0IG47XG4gICAgci5sZW5ndGggPT09IDEgPyBuID0gKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuYnl0ZVJhbmdlRW5kT2Zmc2V0KSB8fCAwIDogbiA9IHBhcnNlSW50KHJbMV0pLCB0aGlzLl9ieXRlUmFuZ2UgPSBbbiwgcGFyc2VJbnQoclswXSkgKyBuXTtcbiAgfVxuICBnZXQgYmFzZXVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlLnVybDtcbiAgfVxuICBnZXQgYnl0ZVJhbmdlKCkge1xuICAgIHJldHVybiB0aGlzLl9ieXRlUmFuZ2UgPT09IG51bGwgPyBbXSA6IHRoaXMuX2J5dGVSYW5nZTtcbiAgfVxuICBnZXQgYnl0ZVJhbmdlU3RhcnRPZmZzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnl0ZVJhbmdlWzBdO1xuICB9XG4gIGdldCBieXRlUmFuZ2VFbmRPZmZzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnl0ZVJhbmdlWzFdO1xuICB9XG4gIGdldCBlbGVtZW50YXJ5U3RyZWFtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RyZWFtcyA9PT0gbnVsbCAmJiAodGhpcy5fc3RyZWFtcyA9IHtcbiAgICAgIFtvdC5BVURJT106IG51bGwsXG4gICAgICBbb3QuVklERU9dOiBudWxsLFxuICAgICAgW290LkFVRElPVklERU9dOiBudWxsXG4gICAgfSksIHRoaXMuX3N0cmVhbXM7XG4gIH1cbiAgc2V0IGVsZW1lbnRhcnlTdHJlYW1zKGUpIHtcbiAgICB0aGlzLl9zdHJlYW1zID0gZTtcbiAgfVxuICBnZXQgaGFzU3RhdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRzICE9PSBudWxsO1xuICB9XG4gIGdldCBoYXNTdHJlYW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9zdHJlYW1zICE9PSBudWxsO1xuICB9XG4gIGdldCBzdGF0cygpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHMgPT09IG51bGwgJiYgKHRoaXMuX3N0YXRzID0gbmV3IGZ1KCkpLCB0aGlzLl9zdGF0cztcbiAgfVxuICBzZXQgc3RhdHMoZSkge1xuICAgIHRoaXMuX3N0YXRzID0gZTtcbiAgfVxuICBnZXQgdXJsKCkge1xuICAgIHJldHVybiAhdGhpcy5fdXJsICYmIHRoaXMuYmFzZXVybCAmJiB0aGlzLnJlbHVybCAmJiAodGhpcy5fdXJsID0gaHUuYnVpbGRBYnNvbHV0ZVVSTCh0aGlzLmJhc2V1cmwsIHRoaXMucmVsdXJsLCB7XG4gICAgICBhbHdheXNOb3JtYWxpemU6ICEwXG4gICAgfSkpLCB0aGlzLl91cmwgfHwgXCJcIjtcbiAgfVxuICBzZXQgdXJsKGUpIHtcbiAgICB0aGlzLl91cmwgPSBlO1xuICB9XG4gIGNsZWFyRWxlbWVudGFyeVN0cmVhbUluZm8oKSB7XG4gICAgY29uc3Qge1xuICAgICAgZWxlbWVudGFyeVN0cmVhbXM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlW290LkFVRElPXSA9IG51bGwsIGVbb3QuVklERU9dID0gbnVsbCwgZVtvdC5BVURJT1ZJREVPXSA9IG51bGw7XG4gIH1cbn1cbmZ1bmN0aW9uIFZ0KHMpIHtcbiAgcmV0dXJuIHMuc24gIT09IFwiaW5pdFNlZ21lbnRcIjtcbn1cbmNsYXNzIHVsIGV4dGVuZHMgX2cge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIodCksIHRoaXMuX2RlY3J5cHRkYXRhID0gbnVsbCwgdGhpcy5fcHJvZ3JhbURhdGVUaW1lID0gbnVsbCwgdGhpcy5fcmVmID0gbnVsbCwgdGhpcy5fYml0cmF0ZSA9IHZvaWQgMCwgdGhpcy5yYXdQcm9ncmFtRGF0ZVRpbWUgPSBudWxsLCB0aGlzLnRhZ0xpc3QgPSBbXSwgdGhpcy5kdXJhdGlvbiA9IDAsIHRoaXMuc24gPSAwLCB0aGlzLmxldmVsa2V5cyA9IHZvaWQgMCwgdGhpcy50eXBlID0gdm9pZCAwLCB0aGlzLmxvYWRlciA9IG51bGwsIHRoaXMua2V5TG9hZGVyID0gbnVsbCwgdGhpcy5sZXZlbCA9IC0xLCB0aGlzLmNjID0gMCwgdGhpcy5zdGFydFBUUyA9IHZvaWQgMCwgdGhpcy5lbmRQVFMgPSB2b2lkIDAsIHRoaXMuc3RhcnREVFMgPSB2b2lkIDAsIHRoaXMuZW5kRFRTID0gdm9pZCAwLCB0aGlzLnN0YXJ0ID0gMCwgdGhpcy5wbGF5bGlzdE9mZnNldCA9IDAsIHRoaXMuZGVsdGFQVFMgPSB2b2lkIDAsIHRoaXMubWF4U3RhcnRQVFMgPSB2b2lkIDAsIHRoaXMubWluRW5kUFRTID0gdm9pZCAwLCB0aGlzLmRhdGEgPSB2b2lkIDAsIHRoaXMuYml0cmF0ZVRlc3QgPSAhMSwgdGhpcy50aXRsZSA9IG51bGwsIHRoaXMuaW5pdFNlZ21lbnQgPSBudWxsLCB0aGlzLmVuZExpc3QgPSB2b2lkIDAsIHRoaXMuZ2FwID0gdm9pZCAwLCB0aGlzLnVybElkID0gMCwgdGhpcy50eXBlID0gZTtcbiAgfVxuICBnZXQgYnl0ZUxlbmd0aCgpIHtcbiAgICBpZiAodGhpcy5oYXNTdGF0cykge1xuICAgICAgY29uc3QgZSA9IHRoaXMuc3RhdHMudG90YWw7XG4gICAgICBpZiAoZSlcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIGlmICh0aGlzLmJ5dGVSYW5nZS5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGUgPSB0aGlzLmJ5dGVSYW5nZVswXSwgdCA9IHRoaXMuYnl0ZVJhbmdlWzFdO1xuICAgICAgaWYgKHVlKGUpICYmIHVlKHQpKVxuICAgICAgICByZXR1cm4gdCAtIGU7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBiaXRyYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmJ5dGVMZW5ndGggPyB0aGlzLmJ5dGVMZW5ndGggKiA4IC8gdGhpcy5kdXJhdGlvbiA6IHRoaXMuX2JpdHJhdGUgPyB0aGlzLl9iaXRyYXRlIDogbnVsbDtcbiAgfVxuICBzZXQgYml0cmF0ZShlKSB7XG4gICAgdGhpcy5fYml0cmF0ZSA9IGU7XG4gIH1cbiAgZ2V0IGRlY3J5cHRkYXRhKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsa2V5czogZVxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghZSAmJiAhdGhpcy5fZGVjcnlwdGRhdGEpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpZiAoIXRoaXMuX2RlY3J5cHRkYXRhICYmIHRoaXMubGV2ZWxrZXlzICYmICF0aGlzLmxldmVsa2V5cy5OT05FKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5sZXZlbGtleXMuaWRlbnRpdHk7XG4gICAgICBpZiAodClcbiAgICAgICAgdGhpcy5fZGVjcnlwdGRhdGEgPSB0LmdldERlY3J5cHREYXRhKHRoaXMuc24pO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHIgPSBPYmplY3Qua2V5cyh0aGlzLmxldmVsa2V5cyk7XG4gICAgICAgIGlmIChyLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIGNvbnN0IG4gPSB0aGlzLl9kZWNyeXB0ZGF0YSA9IHRoaXMubGV2ZWxrZXlzW3JbMF1dIHx8IG51bGw7XG4gICAgICAgICAgaWYgKG4pXG4gICAgICAgICAgICByZXR1cm4gbi5nZXREZWNyeXB0RGF0YSh0aGlzLnNuKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGVjcnlwdGRhdGE7XG4gIH1cbiAgZ2V0IGVuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydCArIHRoaXMuZHVyYXRpb247XG4gIH1cbiAgZ2V0IGVuZFByb2dyYW1EYXRlVGltZSgpIHtcbiAgICBpZiAodGhpcy5wcm9ncmFtRGF0ZVRpbWUgPT09IG51bGwpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBlID0gdWUodGhpcy5kdXJhdGlvbikgPyB0aGlzLmR1cmF0aW9uIDogMDtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmFtRGF0ZVRpbWUgKyBlICogMWUzO1xuICB9XG4gIGdldCBlbmNyeXB0ZWQoKSB7XG4gICAgdmFyIGU7XG4gICAgaWYgKChlID0gdGhpcy5fZGVjcnlwdGRhdGEpICE9IG51bGwgJiYgZS5lbmNyeXB0ZWQpXG4gICAgICByZXR1cm4gITA7XG4gICAgaWYgKHRoaXMubGV2ZWxrZXlzKSB7XG4gICAgICB2YXIgdDtcbiAgICAgIGNvbnN0IHIgPSBPYmplY3Qua2V5cyh0aGlzLmxldmVsa2V5cyksIG4gPSByLmxlbmd0aDtcbiAgICAgIGlmIChuID4gMSB8fCBuID09PSAxICYmICh0ID0gdGhpcy5sZXZlbGtleXNbclswXV0pICE9IG51bGwgJiYgdC5lbmNyeXB0ZWQpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGdldCBwcm9ncmFtRGF0ZVRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb2dyYW1EYXRlVGltZSA9PT0gbnVsbCAmJiB0aGlzLnJhd1Byb2dyYW1EYXRlVGltZSAmJiAodGhpcy5wcm9ncmFtRGF0ZVRpbWUgPSBEYXRlLnBhcnNlKHRoaXMucmF3UHJvZ3JhbURhdGVUaW1lKSksIHRoaXMuX3Byb2dyYW1EYXRlVGltZTtcbiAgfVxuICBzZXQgcHJvZ3JhbURhdGVUaW1lKGUpIHtcbiAgICBpZiAoIXVlKGUpKSB7XG4gICAgICB0aGlzLl9wcm9ncmFtRGF0ZVRpbWUgPSB0aGlzLnJhd1Byb2dyYW1EYXRlVGltZSA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3Byb2dyYW1EYXRlVGltZSA9IGU7XG4gIH1cbiAgZ2V0IHJlZigpIHtcbiAgICByZXR1cm4gVnQodGhpcykgPyAodGhpcy5fcmVmIHx8ICh0aGlzLl9yZWYgPSB7XG4gICAgICBiYXNlOiB0aGlzLmJhc2UsXG4gICAgICBzdGFydDogdGhpcy5zdGFydCxcbiAgICAgIGR1cmF0aW9uOiB0aGlzLmR1cmF0aW9uLFxuICAgICAgc246IHRoaXMuc24sXG4gICAgICBwcm9ncmFtRGF0ZVRpbWU6IHRoaXMucHJvZ3JhbURhdGVUaW1lXG4gICAgfSksIHRoaXMuX3JlZikgOiBudWxsO1xuICB9XG4gIGFkZFN0YXJ0KGUpIHtcbiAgICB0aGlzLnNldFN0YXJ0KHRoaXMuc3RhcnQgKyBlKTtcbiAgfVxuICBzZXRTdGFydChlKSB7XG4gICAgdGhpcy5zdGFydCA9IGUsIHRoaXMuX3JlZiAmJiAodGhpcy5fcmVmLnN0YXJ0ID0gZSk7XG4gIH1cbiAgc2V0RHVyYXRpb24oZSkge1xuICAgIHRoaXMuZHVyYXRpb24gPSBlLCB0aGlzLl9yZWYgJiYgKHRoaXMuX3JlZi5kdXJhdGlvbiA9IGUpO1xuICB9XG4gIHNldEtleUZvcm1hdChlKSB7XG4gICAgaWYgKHRoaXMubGV2ZWxrZXlzKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5sZXZlbGtleXNbZV07XG4gICAgICB0ICYmICF0aGlzLl9kZWNyeXB0ZGF0YSAmJiAodGhpcy5fZGVjcnlwdGRhdGEgPSB0LmdldERlY3J5cHREYXRhKHRoaXMuc24pKTtcbiAgICB9XG4gIH1cbiAgYWJvcnRSZXF1ZXN0cygpIHtcbiAgICB2YXIgZSwgdDtcbiAgICAoZSA9IHRoaXMubG9hZGVyKSA9PSBudWxsIHx8IGUuYWJvcnQoKSwgKHQgPSB0aGlzLmtleUxvYWRlcikgPT0gbnVsbCB8fCB0LmFib3J0KCk7XG4gIH1cbiAgc2V0RWxlbWVudGFyeVN0cmVhbUluZm8oZSwgdCwgciwgbiwgaSwgbyA9ICExKSB7XG4gICAgY29uc3Qge1xuICAgICAgZWxlbWVudGFyeVN0cmVhbXM6IGFcbiAgICB9ID0gdGhpcywgbCA9IGFbZV07XG4gICAgaWYgKCFsKSB7XG4gICAgICBhW2VdID0ge1xuICAgICAgICBzdGFydFBUUzogdCxcbiAgICAgICAgZW5kUFRTOiByLFxuICAgICAgICBzdGFydERUUzogbixcbiAgICAgICAgZW5kRFRTOiBpLFxuICAgICAgICBwYXJ0aWFsOiBvXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsLnN0YXJ0UFRTID0gTWF0aC5taW4obC5zdGFydFBUUywgdCksIGwuZW5kUFRTID0gTWF0aC5tYXgobC5lbmRQVFMsIHIpLCBsLnN0YXJ0RFRTID0gTWF0aC5taW4obC5zdGFydERUUywgbiksIGwuZW5kRFRTID0gTWF0aC5tYXgobC5lbmREVFMsIGkpO1xuICB9XG59XG5jbGFzcyBQUyBleHRlbmRzIF9nIHtcbiAgY29uc3RydWN0b3IoZSwgdCwgciwgbiwgaSkge1xuICAgIHN1cGVyKHIpLCB0aGlzLmZyYWdPZmZzZXQgPSAwLCB0aGlzLmR1cmF0aW9uID0gMCwgdGhpcy5nYXAgPSAhMSwgdGhpcy5pbmRlcGVuZGVudCA9ICExLCB0aGlzLnJlbHVybCA9IHZvaWQgMCwgdGhpcy5mcmFnbWVudCA9IHZvaWQgMCwgdGhpcy5pbmRleCA9IHZvaWQgMCwgdGhpcy5kdXJhdGlvbiA9IGUuZGVjaW1hbEZsb2F0aW5nUG9pbnQoXCJEVVJBVElPTlwiKSwgdGhpcy5nYXAgPSBlLmJvb2woXCJHQVBcIiksIHRoaXMuaW5kZXBlbmRlbnQgPSBlLmJvb2woXCJJTkRFUEVOREVOVFwiKSwgdGhpcy5yZWx1cmwgPSBlLmVudW1lcmF0ZWRTdHJpbmcoXCJVUklcIiksIHRoaXMuZnJhZ21lbnQgPSB0LCB0aGlzLmluZGV4ID0gbjtcbiAgICBjb25zdCBvID0gZS5lbnVtZXJhdGVkU3RyaW5nKFwiQllURVJBTkdFXCIpO1xuICAgIG8gJiYgdGhpcy5zZXRCeXRlUmFuZ2UobywgaSksIGkgJiYgKHRoaXMuZnJhZ09mZnNldCA9IGkuZnJhZ09mZnNldCArIGkuZHVyYXRpb24pO1xuICB9XG4gIGdldCBzdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy5mcmFnbWVudC5zdGFydCArIHRoaXMuZnJhZ09mZnNldDtcbiAgfVxuICBnZXQgZW5kKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0ICsgdGhpcy5kdXJhdGlvbjtcbiAgfVxuICBnZXQgbG9hZGVkKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGVsZW1lbnRhcnlTdHJlYW1zOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgcmV0dXJuICEhKGUuYXVkaW8gfHwgZS52aWRlbyB8fCBlLmF1ZGlvdmlkZW8pO1xuICB9XG59XG5mdW5jdGlvbiBSZyhzLCBlKSB7XG4gIGNvbnN0IHQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yocyk7XG4gIGlmICh0KSB7XG4gICAgY29uc3QgciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCwgZSk7XG4gICAgcmV0dXJuIHIgfHwgUmcodCwgZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIE1TKHMsIGUpIHtcbiAgY29uc3QgdCA9IFJnKHMsIGUpO1xuICB0ICYmICh0LmVudW1lcmFibGUgPSAhMCwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHMsIGUsIHQpKTtcbn1cbmNvbnN0IGVoID0gTWF0aC5wb3coMiwgMzIpIC0gMSwgT1MgPSBbXS5wdXNoLCBMZyA9IHtcbiAgdmlkZW86IDEsXG4gIGF1ZGlvOiAyLFxuICBpZDM6IDMsXG4gIHRleHQ6IDRcbn07XG5mdW5jdGlvbiBqdChzKSB7XG4gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHMpO1xufVxuZnVuY3Rpb24gQ2cocywgZSkge1xuICBjb25zdCB0ID0gc1tlXSA8PCA4IHwgc1tlICsgMV07XG4gIHJldHVybiB0IDwgMCA/IDY1NTM2ICsgdCA6IHQ7XG59XG5mdW5jdGlvbiBJZShzLCBlKSB7XG4gIGNvbnN0IHQgPSBrZyhzLCBlKTtcbiAgcmV0dXJuIHQgPCAwID8gNDI5NDk2NzI5NiArIHQgOiB0O1xufVxuZnVuY3Rpb24gdGgocywgZSkge1xuICBsZXQgdCA9IEllKHMsIGUpO1xuICByZXR1cm4gdCAqPSBNYXRoLnBvdygyLCAzMiksIHQgKz0gSWUocywgZSArIDQpLCB0O1xufVxuZnVuY3Rpb24ga2cocywgZSkge1xuICByZXR1cm4gc1tlXSA8PCAyNCB8IHNbZSArIDFdIDw8IDE2IHwgc1tlICsgMl0gPDwgOCB8IHNbZSArIDNdO1xufVxuZnVuY3Rpb24gQlMocykge1xuICBjb25zdCBlID0gcy5ieXRlTGVuZ3RoO1xuICBmb3IgKGxldCB0ID0gMDsgdCA8IGU7ICkge1xuICAgIGNvbnN0IHIgPSBJZShzLCB0KTtcbiAgICBpZiAociA+IDggJiYgc1t0ICsgNF0gPT09IDEwOSAmJiBzW3QgKyA1XSA9PT0gMTExICYmIHNbdCArIDZdID09PSAxMTEgJiYgc1t0ICsgN10gPT09IDEwMilcbiAgICAgIHJldHVybiAhMDtcbiAgICB0ID0gciA+IDEgPyB0ICsgciA6IGU7XG4gIH1cbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gR2UocywgZSkge1xuICBjb25zdCB0ID0gW107XG4gIGlmICghZS5sZW5ndGgpXG4gICAgcmV0dXJuIHQ7XG4gIGNvbnN0IHIgPSBzLmJ5dGVMZW5ndGg7XG4gIGZvciAobGV0IG4gPSAwOyBuIDwgcjsgKSB7XG4gICAgY29uc3QgaSA9IEllKHMsIG4pLCBvID0ganQocy5zdWJhcnJheShuICsgNCwgbiArIDgpKSwgYSA9IGkgPiAxID8gbiArIGkgOiByO1xuICAgIGlmIChvID09PSBlWzBdKVxuICAgICAgaWYgKGUubGVuZ3RoID09PSAxKVxuICAgICAgICB0LnB1c2gocy5zdWJhcnJheShuICsgOCwgYSkpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGwgPSBHZShzLnN1YmFycmF5KG4gKyA4LCBhKSwgZS5zbGljZSgxKSk7XG4gICAgICAgIGwubGVuZ3RoICYmIE9TLmFwcGx5KHQsIGwpO1xuICAgICAgfVxuICAgIG4gPSBhO1xuICB9XG4gIHJldHVybiB0O1xufVxuZnVuY3Rpb24gRlMocykge1xuICBjb25zdCBlID0gW10sIHQgPSBzWzBdO1xuICBsZXQgciA9IDg7XG4gIGNvbnN0IG4gPSBJZShzLCByKTtcbiAgciArPSA0O1xuICBsZXQgaSA9IDAsIG8gPSAwO1xuICB0ID09PSAwID8gKGkgPSBJZShzLCByKSwgbyA9IEllKHMsIHIgKyA0KSwgciArPSA4KSA6IChpID0gdGgocywgciksIG8gPSB0aChzLCByICsgOCksIHIgKz0gMTYpLCByICs9IDI7XG4gIGxldCBhID0gcy5sZW5ndGggKyBvO1xuICBjb25zdCBsID0gQ2cocywgcik7XG4gIHIgKz0gMjtcbiAgZm9yIChsZXQgYyA9IDA7IGMgPCBsOyBjKyspIHtcbiAgICBsZXQgdSA9IHI7XG4gICAgY29uc3QgZCA9IEllKHMsIHUpO1xuICAgIHUgKz0gNDtcbiAgICBjb25zdCBoID0gZCAmIDIxNDc0ODM2NDc7XG4gICAgaWYgKChkICYgMjE0NzQ4MzY0OCkgPj4+IDMxID09PSAxKVxuICAgICAgcmV0dXJuIHJ0Lndhcm4oXCJTSURYIGhhcyBoaWVyYXJjaGljYWwgcmVmZXJlbmNlcyAobm90IHN1cHBvcnRlZClcIiksIG51bGw7XG4gICAgY29uc3QgcCA9IEllKHMsIHUpO1xuICAgIHUgKz0gNCwgZS5wdXNoKHtcbiAgICAgIHJlZmVyZW5jZVNpemU6IGgsXG4gICAgICBzdWJzZWdtZW50RHVyYXRpb246IHAsXG4gICAgICAvLyB1bnNjYWxlZFxuICAgICAgaW5mbzoge1xuICAgICAgICBkdXJhdGlvbjogcCAvIG4sXG4gICAgICAgIHN0YXJ0OiBhLFxuICAgICAgICBlbmQ6IGEgKyBoIC0gMVxuICAgICAgfVxuICAgIH0pLCBhICs9IGgsIHUgKz0gNCwgciA9IHU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlYXJsaWVzdFByZXNlbnRhdGlvblRpbWU6IGksXG4gICAgdGltZXNjYWxlOiBuLFxuICAgIHZlcnNpb246IHQsXG4gICAgcmVmZXJlbmNlc0NvdW50OiBsLFxuICAgIHJlZmVyZW5jZXM6IGVcbiAgfTtcbn1cbmZ1bmN0aW9uIERnKHMpIHtcbiAgY29uc3QgZSA9IFtdLCB0ID0gR2UocywgW1wibW9vdlwiLCBcInRyYWtcIl0pO1xuICBmb3IgKGxldCBuID0gMDsgbiA8IHQubGVuZ3RoOyBuKyspIHtcbiAgICBjb25zdCBpID0gdFtuXSwgbyA9IEdlKGksIFtcInRraGRcIl0pWzBdO1xuICAgIGlmIChvKSB7XG4gICAgICBsZXQgYSA9IG9bMF07XG4gICAgICBjb25zdCBsID0gSWUobywgYSA9PT0gMCA/IDEyIDogMjApLCBjID0gR2UoaSwgW1wibWRpYVwiLCBcIm1kaGRcIl0pWzBdO1xuICAgICAgaWYgKGMpIHtcbiAgICAgICAgYSA9IGNbMF07XG4gICAgICAgIGNvbnN0IHUgPSBJZShjLCBhID09PSAwID8gMTIgOiAyMCksIGQgPSBHZShpLCBbXCJtZGlhXCIsIFwiaGRsclwiXSlbMF07XG4gICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgY29uc3QgaCA9IGp0KGQuc3ViYXJyYXkoOCwgMTIpKSwgZiA9IHtcbiAgICAgICAgICAgIHNvdW46IG90LkFVRElPLFxuICAgICAgICAgICAgdmlkZTogb3QuVklERU9cbiAgICAgICAgICB9W2hdLCBwID0gR2UoaSwgW1wibWRpYVwiLCBcIm1pbmZcIiwgXCJzdGJsXCIsIFwic3RzZFwiXSlbMF0sIHkgPSBOUyhwKTtcbiAgICAgICAgICBmID8gKGVbbF0gPSB7XG4gICAgICAgICAgICB0aW1lc2NhbGU6IHUsXG4gICAgICAgICAgICB0eXBlOiBmLFxuICAgICAgICAgICAgc3RzZDogeVxuICAgICAgICAgIH0sIGVbZl0gPSB0dCh7XG4gICAgICAgICAgICB0aW1lc2NhbGU6IHUsXG4gICAgICAgICAgICBpZDogbFxuICAgICAgICAgIH0sIHkpKSA6IGVbbF0gPSB7XG4gICAgICAgICAgICB0aW1lc2NhbGU6IHUsXG4gICAgICAgICAgICB0eXBlOiBoLFxuICAgICAgICAgICAgc3RzZDogeVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIEdlKHMsIFtcIm1vb3ZcIiwgXCJtdmV4XCIsIFwidHJleFwiXSkuZm9yRWFjaCgobikgPT4ge1xuICAgIGNvbnN0IGkgPSBJZShuLCA0KSwgbyA9IGVbaV07XG4gICAgbyAmJiAoby5kZWZhdWx0ID0ge1xuICAgICAgZHVyYXRpb246IEllKG4sIDEyKSxcbiAgICAgIGZsYWdzOiBJZShuLCAyMClcbiAgICB9KTtcbiAgfSksIGU7XG59XG5mdW5jdGlvbiBOUyhzKSB7XG4gIGNvbnN0IGUgPSBzLnN1YmFycmF5KDgpLCB0ID0gZS5zdWJhcnJheSg4NiksIHIgPSBqdChlLnN1YmFycmF5KDQsIDgpKTtcbiAgbGV0IG4gPSByLCBpO1xuICBjb25zdCBvID0gciA9PT0gXCJlbmNhXCIgfHwgciA9PT0gXCJlbmN2XCI7XG4gIGlmIChvKSB7XG4gICAgY29uc3QgYyA9IEdlKGUsIFtyXSlbMF0uc3ViYXJyYXkociA9PT0gXCJlbmNhXCIgPyAyOCA6IDc4KTtcbiAgICBHZShjLCBbXCJzaW5mXCJdKS5mb3JFYWNoKChkKSA9PiB7XG4gICAgICBjb25zdCBoID0gR2UoZCwgW1wic2NobVwiXSlbMF07XG4gICAgICBpZiAoaCkge1xuICAgICAgICBjb25zdCBmID0ganQoaC5zdWJhcnJheSg0LCA4KSk7XG4gICAgICAgIGlmIChmID09PSBcImNiY3NcIiB8fCBmID09PSBcImNlbmNcIikge1xuICAgICAgICAgIGNvbnN0IHAgPSBHZShkLCBbXCJmcm1hXCJdKVswXTtcbiAgICAgICAgICBwICYmIChuID0ganQocCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgYSA9IG47XG4gIHN3aXRjaCAobikge1xuICAgIGNhc2UgXCJhdmMxXCI6XG4gICAgY2FzZSBcImF2YzJcIjpcbiAgICBjYXNlIFwiYXZjM1wiOlxuICAgIGNhc2UgXCJhdmM0XCI6IHtcbiAgICAgIGNvbnN0IGwgPSBHZSh0LCBbXCJhdmNDXCJdKVswXTtcbiAgICAgIGwgJiYgbC5sZW5ndGggPiAzICYmIChuICs9IFwiLlwiICsgS2kobFsxXSkgKyBLaShsWzJdKSArIEtpKGxbM10pLCBpID0gamkoYSA9PT0gXCJhdmMxXCIgPyBcImR2YTFcIiA6IFwiZHZhdlwiLCB0KSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcIm1wNGFcIjoge1xuICAgICAgY29uc3QgbCA9IEdlKGUsIFtyXSlbMF0sIGMgPSBHZShsLnN1YmFycmF5KDI4KSwgW1wiZXNkc1wiXSlbMF07XG4gICAgICBpZiAoYyAmJiBjLmxlbmd0aCA+IDcpIHtcbiAgICAgICAgbGV0IHUgPSA0O1xuICAgICAgICBpZiAoY1t1KytdICE9PSAzKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB1ID0gZGwoYywgdSksIHUgKz0gMjtcbiAgICAgICAgY29uc3QgZCA9IGNbdSsrXTtcbiAgICAgICAgaWYgKGQgJiAxMjggJiYgKHUgKz0gMiksIGQgJiA2NCAmJiAodSArPSBjW3UrK10pLCBjW3UrK10gIT09IDQpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIHUgPSBkbChjLCB1KTtcbiAgICAgICAgY29uc3QgaCA9IGNbdSsrXTtcbiAgICAgICAgaWYgKGggPT09IDY0KVxuICAgICAgICAgIG4gKz0gXCIuXCIgKyBLaShoKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAodSArPSAxMiwgY1t1KytdICE9PSA1KVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB1ID0gZGwoYywgdSk7XG4gICAgICAgIGNvbnN0IGYgPSBjW3UrK107XG4gICAgICAgIGxldCBwID0gKGYgJiAyNDgpID4+IDM7XG4gICAgICAgIHAgPT09IDMxICYmIChwICs9IDEgKyAoKGYgJiA3KSA8PCAzKSArICgoY1t1XSAmIDIyNCkgPj4gNSkpLCBuICs9IFwiLlwiICsgcDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwiaHZjMVwiOlxuICAgIGNhc2UgXCJoZXYxXCI6IHtcbiAgICAgIGNvbnN0IGwgPSBHZSh0LCBbXCJodmNDXCJdKVswXTtcbiAgICAgIGlmIChsICYmIGwubGVuZ3RoID4gMTIpIHtcbiAgICAgICAgY29uc3QgYyA9IGxbMV0sIHUgPSBbXCJcIiwgXCJBXCIsIFwiQlwiLCBcIkNcIl1bYyA+PiA2XSwgZCA9IGMgJiAzMSwgaCA9IEllKGwsIDIpLCBmID0gKGMgJiAzMikgPj4gNSA/IFwiSFwiIDogXCJMXCIsIHAgPSBsWzEyXSwgeSA9IGwuc3ViYXJyYXkoNiwgMTIpO1xuICAgICAgICBuICs9IFwiLlwiICsgdSArIGQsIG4gKz0gXCIuXCIgKyBVUyhoKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSwgbiArPSBcIi5cIiArIGYgKyBwO1xuICAgICAgICBsZXQgRSA9IFwiXCI7XG4gICAgICAgIGZvciAobGV0IGIgPSB5Lmxlbmd0aDsgYi0tOyApIHtcbiAgICAgICAgICBjb25zdCBSID0geVtiXTtcbiAgICAgICAgICAoUiB8fCBFKSAmJiAoRSA9IFwiLlwiICsgUi50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArIEUpO1xuICAgICAgICB9XG4gICAgICAgIG4gKz0gRTtcbiAgICAgIH1cbiAgICAgIGkgPSBqaShhID09IFwiaGV2MVwiID8gXCJkdmhlXCIgOiBcImR2aDFcIiwgdCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBcImR2aDFcIjpcbiAgICBjYXNlIFwiZHZoZVwiOlxuICAgIGNhc2UgXCJkdmF2XCI6XG4gICAgY2FzZSBcImR2YTFcIjpcbiAgICBjYXNlIFwiZGF2MVwiOiB7XG4gICAgICBuID0gamkobiwgdCkgfHwgbjtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlIFwidnAwOVwiOiB7XG4gICAgICBjb25zdCBsID0gR2UodCwgW1widnBjQ1wiXSlbMF07XG4gICAgICBpZiAobCAmJiBsLmxlbmd0aCA+IDYpIHtcbiAgICAgICAgY29uc3QgYyA9IGxbNF0sIHUgPSBsWzVdLCBkID0gbFs2XSA+PiA0ICYgMTU7XG4gICAgICAgIG4gKz0gXCIuXCIgKyBWcihjKSArIFwiLlwiICsgVnIodSkgKyBcIi5cIiArIFZyKGQpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgXCJhdjAxXCI6IHtcbiAgICAgIGNvbnN0IGwgPSBHZSh0LCBbXCJhdjFDXCJdKVswXTtcbiAgICAgIGlmIChsICYmIGwubGVuZ3RoID4gMikge1xuICAgICAgICBjb25zdCBjID0gbFsxXSA+Pj4gNSwgdSA9IGxbMV0gJiAzMSwgZCA9IGxbMl0gPj4+IDcgPyBcIkhcIiA6IFwiTVwiLCBoID0gKGxbMl0gJiA2NCkgPj4gNiwgZiA9IChsWzJdICYgMzIpID4+IDUsIHAgPSBjID09PSAyICYmIGggPyBmID8gMTIgOiAxMCA6IGggPyAxMCA6IDgsIHkgPSAobFsyXSAmIDE2KSA+PiA0LCBFID0gKGxbMl0gJiA4KSA+PiAzLCBiID0gKGxbMl0gJiA0KSA+PiAyLCBSID0gbFsyXSAmIDM7XG4gICAgICAgIG4gKz0gXCIuXCIgKyBjICsgXCIuXCIgKyBWcih1KSArIGQgKyBcIi5cIiArIFZyKHApICsgXCIuXCIgKyB5ICsgXCIuXCIgKyBFICsgYiArIFIgKyBcIi5cIiArIFZyKDEpICsgXCIuXCIgKyBWcigxKSArIFwiLlwiICsgVnIoMSkgKyBcIi5cIiArIDAsIGkgPSBqaShcImRhdjFcIiwgdCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBjb2RlYzogbixcbiAgICBlbmNyeXB0ZWQ6IG8sXG4gICAgc3VwcGxlbWVudGFsOiBpXG4gIH07XG59XG5mdW5jdGlvbiBqaShzLCBlKSB7XG4gIGNvbnN0IHQgPSBHZShlLCBbXCJkdnZDXCJdKSwgciA9IHQubGVuZ3RoID8gdFswXSA6IEdlKGUsIFtcImR2Y0NcIl0pWzBdO1xuICBpZiAocikge1xuICAgIGNvbnN0IG4gPSByWzJdID4+IDEgJiAxMjcsIGkgPSByWzJdIDw8IDUgJiAzMiB8IHJbM10gPj4gMyAmIDMxO1xuICAgIHJldHVybiBzICsgXCIuXCIgKyBWcihuKSArIFwiLlwiICsgVnIoaSk7XG4gIH1cbn1cbmZ1bmN0aW9uIFVTKHMpIHtcbiAgbGV0IGUgPSAwO1xuICBmb3IgKGxldCB0ID0gMDsgdCA8IDMyOyB0KyspXG4gICAgZSB8PSAocyA+PiB0ICYgMSkgPDwgMzEgLSB0O1xuICByZXR1cm4gZSA+Pj4gMDtcbn1cbmZ1bmN0aW9uIGRsKHMsIGUpIHtcbiAgY29uc3QgdCA9IGUgKyA1O1xuICBmb3IgKDsgc1tlKytdICYgMTI4ICYmIGUgPCB0OyApXG4gICAgO1xuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIEtpKHMpIHtcbiAgcmV0dXJuIChcIjBcIiArIHMudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCkpLnNsaWNlKC0yKTtcbn1cbmZ1bmN0aW9uIFZyKHMpIHtcbiAgcmV0dXJuIChzIDwgMTAgPyBcIjBcIiA6IFwiXCIpICsgcztcbn1cbmZ1bmN0aW9uICRTKHMsIGUpIHtcbiAgaWYgKCFzIHx8ICFlKVxuICAgIHJldHVybjtcbiAgY29uc3QgdCA9IGUua2V5SWQ7XG4gIHQgJiYgZS5pc0NvbW1vbkVuY3J5cHRpb24gJiYgR2UocywgW1wibW9vdlwiLCBcInRyYWtcIl0pLmZvckVhY2goKG4pID0+IHtcbiAgICBjb25zdCBvID0gR2UobiwgW1wibWRpYVwiLCBcIm1pbmZcIiwgXCJzdGJsXCIsIFwic3RzZFwiXSlbMF0uc3ViYXJyYXkoOCk7XG4gICAgbGV0IGEgPSBHZShvLCBbXCJlbmNhXCJdKTtcbiAgICBjb25zdCBsID0gYS5sZW5ndGggPiAwO1xuICAgIGwgfHwgKGEgPSBHZShvLCBbXCJlbmN2XCJdKSksIGEuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgY29uc3QgdSA9IGwgPyBjLnN1YmFycmF5KDI4KSA6IGMuc3ViYXJyYXkoNzgpO1xuICAgICAgR2UodSwgW1wic2luZlwiXSkuZm9yRWFjaCgoaCkgPT4ge1xuICAgICAgICBjb25zdCBmID0gUGcoaCk7XG4gICAgICAgIGlmIChmKSB7XG4gICAgICAgICAgY29uc3QgcCA9IGYuc3ViYXJyYXkoOCwgMjQpO1xuICAgICAgICAgIHAuc29tZSgoeSkgPT4geSAhPT0gMCkgfHwgKHJ0LmxvZyhgW2VtZV0gUGF0Y2hpbmcga2V5SWQgaW4gJ2VuYyR7bCA/IFwiYVwiIDogXCJ2XCJ9PnNpbmY+PnRlbmMnIGJveDogJHtmcihwKX0gLT4gJHtmcih0KX1gKSwgZi5zZXQodCwgOCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBQZyhzKSB7XG4gIGNvbnN0IGUgPSBHZShzLCBbXCJzY2htXCJdKVswXTtcbiAgaWYgKGUpIHtcbiAgICBjb25zdCB0ID0ganQoZS5zdWJhcnJheSg0LCA4KSk7XG4gICAgaWYgKHQgPT09IFwiY2Jjc1wiIHx8IHQgPT09IFwiY2VuY1wiKVxuICAgICAgcmV0dXJuIEdlKHMsIFtcInNjaGlcIiwgXCJ0ZW5jXCJdKVswXTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIEdTKHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IHt9LCBuID0gR2UocywgW1wibW9vZlwiLCBcInRyYWZcIl0pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG4ubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBvID0gbltpXSwgYSA9IEdlKG8sIFtcInRmaGRcIl0pWzBdLCBsID0gSWUoYSwgNCksIGMgPSBlW2xdO1xuICAgIGlmICghYylcbiAgICAgIGNvbnRpbnVlO1xuICAgIHJbbF0gfHwgKHJbbF0gPSB7XG4gICAgICBzdGFydDogTmFOLFxuICAgICAgZHVyYXRpb246IDAsXG4gICAgICBzYW1wbGVDb3VudDogMCxcbiAgICAgIHRpbWVzY2FsZTogYy50aW1lc2NhbGUsXG4gICAgICB0eXBlOiBjLnR5cGVcbiAgICB9KTtcbiAgICBjb25zdCB1ID0gcltsXSwgZCA9IEdlKG8sIFtcInRmZHRcIl0pWzBdO1xuICAgIGlmIChkKSB7XG4gICAgICBjb25zdCBBID0gZFswXTtcbiAgICAgIGxldCBGID0gSWUoZCwgNCk7XG4gICAgICBBID09PSAxICYmIChGID09PSBlaCA/IHQud2FybihcIlttcDQtZGVtdXhlcl06IElnbm9yaW5nIGFzc3VtZWQgaW52YWxpZCBzaWduZWQgNjQtYml0IHRyYWNrIGZyYWdtZW50IGRlY29kZSB0aW1lXCIpIDogKEYgKj0gZWggKyAxLCBGICs9IEllKGQsIDgpKSksIHVlKEYpICYmICghdWUodS5zdGFydCkgfHwgRiA8IHUuc3RhcnQpICYmICh1LnN0YXJ0ID0gRik7XG4gICAgfVxuICAgIGNvbnN0IGggPSBjLmRlZmF1bHQsIGYgPSBJZShhLCAwKSB8IChoID09IG51bGwgPyB2b2lkIDAgOiBoLmZsYWdzKTtcbiAgICBsZXQgcCA9IChoID09IG51bGwgPyB2b2lkIDAgOiBoLmR1cmF0aW9uKSB8fCAwO1xuICAgIGYgJiA4ICYmIChmICYgMiA/IHAgPSBJZShhLCAxMikgOiBwID0gSWUoYSwgOCkpO1xuICAgIGNvbnN0IHkgPSBHZShvLCBbXCJ0cnVuXCJdKTtcbiAgICBsZXQgRSA9IHUuc3RhcnQgfHwgMCwgYiA9IDAsIFIgPSBwO1xuICAgIGZvciAobGV0IEEgPSAwOyBBIDwgeS5sZW5ndGg7IEErKykge1xuICAgICAgY29uc3QgRiA9IHlbQV0sIE0gPSBJZShGLCA0KSwgSCA9IHUuc2FtcGxlQ291bnQ7XG4gICAgICB1LnNhbXBsZUNvdW50ICs9IE07XG4gICAgICBjb25zdCBLID0gRlszXSAmIDEsIGogPSBGWzNdICYgNCwgQyA9IEZbMl0gJiAxLCBrID0gRlsyXSAmIDIsICQgPSBGWzJdICYgNCwgVyA9IEZbMl0gJiA4O1xuICAgICAgbGV0IF8gPSA4LCBnID0gTTtcbiAgICAgIGZvciAoSyAmJiAoXyArPSA0KSwgaiAmJiBNICYmICghKEZbXyArIDFdICYgMSkgJiYgdS5rZXlGcmFtZUluZGV4ID09PSB2b2lkIDAgJiYgKHUua2V5RnJhbWVJbmRleCA9IEgpLCBfICs9IDQsIEMgPyAoUiA9IEllKEYsIF8pLCBfICs9IDQpIDogUiA9IHAsIGsgJiYgKF8gKz0gNCksIFcgJiYgKF8gKz0gNCksIEUgKz0gUiwgYiArPSBSLCBnLS0pOyBnLS07IClcbiAgICAgICAgQyA/IChSID0gSWUoRiwgXyksIF8gKz0gNCkgOiBSID0gcCwgayAmJiAoXyArPSA0KSwgJCAmJiAoRltfICsgMV0gJiAxIHx8IHUua2V5RnJhbWVJbmRleCA9PT0gdm9pZCAwICYmICh1LmtleUZyYW1lSW5kZXggPSB1LnNhbXBsZUNvdW50IC0gKGcgKyAxKSwgdS5rZXlGcmFtZVN0YXJ0ID0gRSksIF8gKz0gNCksIFcgJiYgKF8gKz0gNCksIEUgKz0gUiwgYiArPSBSO1xuICAgICAgIWIgJiYgcCAmJiAoYiArPSBwICogTSk7XG4gICAgfVxuICAgIHUuZHVyYXRpb24gKz0gYjtcbiAgfVxuICBpZiAoIU9iamVjdC5rZXlzKHIpLnNvbWUoKGkpID0+IHJbaV0uZHVyYXRpb24pKSB7XG4gICAgbGV0IGkgPSAxIC8gMCwgbyA9IDA7XG4gICAgY29uc3QgYSA9IEdlKHMsIFtcInNpZHhcIl0pO1xuICAgIGZvciAobGV0IGwgPSAwOyBsIDwgYS5sZW5ndGg7IGwrKykge1xuICAgICAgY29uc3QgYyA9IEZTKGFbbF0pO1xuICAgICAgaWYgKGMgIT0gbnVsbCAmJiBjLnJlZmVyZW5jZXMpIHtcbiAgICAgICAgaSA9IE1hdGgubWluKGksIGMuZWFybGllc3RQcmVzZW50YXRpb25UaW1lIC8gYy50aW1lc2NhbGUpO1xuICAgICAgICBjb25zdCB1ID0gYy5yZWZlcmVuY2VzLnJlZHVjZSgoZCwgaCkgPT4gZCArIGguaW5mby5kdXJhdGlvbiB8fCAwLCAwKTtcbiAgICAgICAgbyA9IE1hdGgubWF4KG8sIHUgKyBjLmVhcmxpZXN0UHJlc2VudGF0aW9uVGltZSAvIGMudGltZXNjYWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbyAmJiB1ZShvKSAmJiBPYmplY3Qua2V5cyhyKS5mb3JFYWNoKChsKSA9PiB7XG4gICAgICByW2xdLmR1cmF0aW9uIHx8IChyW2xdLmR1cmF0aW9uID0gbyAqIHJbbF0udGltZXNjYWxlIC0gcltsXS5zdGFydCk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiBWUyhzKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAgdmFsaWQ6IG51bGwsXG4gICAgcmVtYWluZGVyOiBudWxsXG4gIH0sIHQgPSBHZShzLCBbXCJtb29mXCJdKTtcbiAgaWYgKHQubGVuZ3RoIDwgMilcbiAgICByZXR1cm4gZS5yZW1haW5kZXIgPSBzLCBlO1xuICBjb25zdCByID0gdFt0Lmxlbmd0aCAtIDFdO1xuICByZXR1cm4gZS52YWxpZCA9IHMuc2xpY2UoMCwgci5ieXRlT2Zmc2V0IC0gOCksIGUucmVtYWluZGVyID0gcy5zbGljZShyLmJ5dGVPZmZzZXQgLSA4KSwgZTtcbn1cbmZ1bmN0aW9uIF9yKHMsIGUpIHtcbiAgY29uc3QgdCA9IG5ldyBVaW50OEFycmF5KHMubGVuZ3RoICsgZS5sZW5ndGgpO1xuICByZXR1cm4gdC5zZXQocyksIHQuc2V0KGUsIHMubGVuZ3RoKSwgdDtcbn1cbmZ1bmN0aW9uIHJoKHMsIGUpIHtcbiAgY29uc3QgdCA9IFtdLCByID0gZS5zYW1wbGVzLCBuID0gZS50aW1lc2NhbGUsIGkgPSBlLmlkO1xuICBsZXQgbyA9ICExO1xuICByZXR1cm4gR2UociwgW1wibW9vZlwiXSkubWFwKChsKSA9PiB7XG4gICAgY29uc3QgYyA9IGwuYnl0ZU9mZnNldCAtIDg7XG4gICAgR2UobCwgW1widHJhZlwiXSkubWFwKChkKSA9PiB7XG4gICAgICBjb25zdCBoID0gR2UoZCwgW1widGZkdFwiXSkubWFwKChmKSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBmWzBdO1xuICAgICAgICBsZXQgeSA9IEllKGYsIDQpO1xuICAgICAgICByZXR1cm4gcCA9PT0gMSAmJiAoeSAqPSBNYXRoLnBvdygyLCAzMiksIHkgKz0gSWUoZiwgOCkpLCB5IC8gbjtcbiAgICAgIH0pWzBdO1xuICAgICAgcmV0dXJuIGggIT09IHZvaWQgMCAmJiAocyA9IGgpLCBHZShkLCBbXCJ0ZmhkXCJdKS5tYXAoKGYpID0+IHtcbiAgICAgICAgY29uc3QgcCA9IEllKGYsIDQpLCB5ID0gSWUoZiwgMCkgJiAxNjc3NzIxNSwgRSA9ICh5ICYgMSkgIT09IDAsIGIgPSAoeSAmIDIpICE9PSAwLCBSID0gKHkgJiA4KSAhPT0gMDtcbiAgICAgICAgbGV0IEEgPSAwO1xuICAgICAgICBjb25zdCBGID0gKHkgJiAxNikgIT09IDA7XG4gICAgICAgIGxldCBNID0gMDtcbiAgICAgICAgY29uc3QgSCA9ICh5ICYgMzIpICE9PSAwO1xuICAgICAgICBsZXQgSyA9IDg7XG4gICAgICAgIHAgPT09IGkgJiYgKEUgJiYgKEsgKz0gOCksIGIgJiYgKEsgKz0gNCksIFIgJiYgKEEgPSBJZShmLCBLKSwgSyArPSA0KSwgRiAmJiAoTSA9IEllKGYsIEspLCBLICs9IDQpLCBIICYmIChLICs9IDQpLCBlLnR5cGUgPT09IFwidmlkZW9cIiAmJiAobyA9IHlhKGUuY29kZWMpKSwgR2UoZCwgW1widHJ1blwiXSkubWFwKChqKSA9PiB7XG4gICAgICAgICAgY29uc3QgQyA9IGpbMF0sIGsgPSBJZShqLCAwKSAmIDE2Nzc3MjE1LCAkID0gKGsgJiAxKSAhPT0gMDtcbiAgICAgICAgICBsZXQgVyA9IDA7XG4gICAgICAgICAgY29uc3QgXyA9IChrICYgNCkgIT09IDAsIGcgPSAoayAmIDI1NikgIT09IDA7XG4gICAgICAgICAgbGV0IHggPSAwO1xuICAgICAgICAgIGNvbnN0IHcgPSAoayAmIDUxMikgIT09IDA7XG4gICAgICAgICAgbGV0IEQgPSAwO1xuICAgICAgICAgIGNvbnN0IE8gPSAoayAmIDEwMjQpICE9PSAwLCBVID0gKGsgJiAyMDQ4KSAhPT0gMDtcbiAgICAgICAgICBsZXQgViA9IDA7XG4gICAgICAgICAgY29uc3QgTCA9IEllKGosIDQpO1xuICAgICAgICAgIGxldCBtID0gODtcbiAgICAgICAgICAkICYmIChXID0gSWUoaiwgbSksIG0gKz0gNCksIF8gJiYgKG0gKz0gNCk7XG4gICAgICAgICAgbGV0IHYgPSBXICsgYztcbiAgICAgICAgICBmb3IgKGxldCBQID0gMDsgUCA8IEw7IFArKykge1xuICAgICAgICAgICAgaWYgKGcgPyAoeCA9IEllKGosIG0pLCBtICs9IDQpIDogeCA9IEEsIHcgPyAoRCA9IEllKGosIG0pLCBtICs9IDQpIDogRCA9IE0sIE8gJiYgKG0gKz0gNCksIFUgJiYgKEMgPT09IDAgPyBWID0gSWUoaiwgbSkgOiBWID0ga2coaiwgbSksIG0gKz0gNCksIGUudHlwZSA9PT0gb3QuVklERU8pIHtcbiAgICAgICAgICAgICAgbGV0IE4gPSAwO1xuICAgICAgICAgICAgICBmb3IgKDsgTiA8IEQ7ICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFkgPSBJZShyLCB2KTtcbiAgICAgICAgICAgICAgICBpZiAodiArPSA0LCBqUyhvLCByW3ZdKSkge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZWUgPSByLnN1YmFycmF5KHYsIHYgKyBZKTtcbiAgICAgICAgICAgICAgICAgIGd1KGVlLCBvID8gMiA6IDEsIHMgKyBWIC8gbiwgdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHYgKz0gWSwgTiArPSBZICsgNDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcyArPSB4IC8gbjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KSwgdDtcbn1cbmZ1bmN0aW9uIHlhKHMpIHtcbiAgaWYgKCFzKVxuICAgIHJldHVybiAhMTtcbiAgY29uc3QgZSA9IHMuc3Vic3RyaW5nKDAsIDQpO1xuICByZXR1cm4gZSA9PT0gXCJodmMxXCIgfHwgZSA9PT0gXCJoZXYxXCIgfHwgLy8gRG9sYnkgVmlzaW9uXG4gIGUgPT09IFwiZHZoMVwiIHx8IGUgPT09IFwiZHZoZVwiO1xufVxuZnVuY3Rpb24galMocywgZSkge1xuICBpZiAocykge1xuICAgIGNvbnN0IHQgPSBlID4+IDEgJiA2MztcbiAgICByZXR1cm4gdCA9PT0gMzkgfHwgdCA9PT0gNDA7XG4gIH0gZWxzZVxuICAgIHJldHVybiAoZSAmIDMxKSA9PT0gNjtcbn1cbmZ1bmN0aW9uIGd1KHMsIGUsIHQsIHIpIHtcbiAgY29uc3QgbiA9IE1nKHMpO1xuICBsZXQgaSA9IDA7XG4gIGkgKz0gZTtcbiAgbGV0IG8gPSAwLCBhID0gMCwgbCA9IDA7XG4gIGZvciAoOyBpIDwgbi5sZW5ndGg7ICkge1xuICAgIG8gPSAwO1xuICAgIGRvIHtcbiAgICAgIGlmIChpID49IG4ubGVuZ3RoKVxuICAgICAgICBicmVhaztcbiAgICAgIGwgPSBuW2krK10sIG8gKz0gbDtcbiAgICB9IHdoaWxlIChsID09PSAyNTUpO1xuICAgIGEgPSAwO1xuICAgIGRvIHtcbiAgICAgIGlmIChpID49IG4ubGVuZ3RoKVxuICAgICAgICBicmVhaztcbiAgICAgIGwgPSBuW2krK10sIGEgKz0gbDtcbiAgICB9IHdoaWxlIChsID09PSAyNTUpO1xuICAgIGNvbnN0IGMgPSBuLmxlbmd0aCAtIGk7XG4gICAgbGV0IHUgPSBpO1xuICAgIGlmIChhIDwgYylcbiAgICAgIGkgKz0gYTtcbiAgICBlbHNlIGlmIChhID4gYykge1xuICAgICAgcnQuZXJyb3IoYE1hbGZvcm1lZCBTRUkgcGF5bG9hZC4gJHthfSBpcyB0b28gc21hbGwsIG9ubHkgJHtjfSBieXRlcyBsZWZ0IHRvIHBhcnNlLmApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChvID09PSA0KSB7XG4gICAgICBpZiAoblt1KytdID09PSAxODEpIHtcbiAgICAgICAgY29uc3QgaCA9IENnKG4sIHUpO1xuICAgICAgICBpZiAodSArPSAyLCBoID09PSA0OSkge1xuICAgICAgICAgIGNvbnN0IGYgPSBJZShuLCB1KTtcbiAgICAgICAgICBpZiAodSArPSA0LCBmID09PSAxMTk1NDU2ODIwKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gblt1KytdO1xuICAgICAgICAgICAgaWYgKHAgPT09IDMpIHtcbiAgICAgICAgICAgICAgY29uc3QgeSA9IG5bdSsrXSwgRSA9IDMxICYgeSwgYiA9IDY0ICYgeSwgUiA9IGIgPyAyICsgRSAqIDMgOiAwLCBBID0gbmV3IFVpbnQ4QXJyYXkoUik7XG4gICAgICAgICAgICAgIGlmIChiKSB7XG4gICAgICAgICAgICAgICAgQVswXSA9IHk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgRiA9IDE7IEYgPCBSOyBGKyspXG4gICAgICAgICAgICAgICAgICBBW0ZdID0gblt1KytdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHIucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogcCxcbiAgICAgICAgICAgICAgICBwYXlsb2FkVHlwZTogbyxcbiAgICAgICAgICAgICAgICBwdHM6IHQsXG4gICAgICAgICAgICAgICAgYnl0ZXM6IEFcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvID09PSA1ICYmIGEgPiAxNikge1xuICAgICAgY29uc3QgZCA9IFtdO1xuICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCAxNjsgcCsrKSB7XG4gICAgICAgIGNvbnN0IHkgPSBuW3UrK10udG9TdHJpbmcoMTYpO1xuICAgICAgICBkLnB1c2goeS5sZW5ndGggPT0gMSA/IFwiMFwiICsgeSA6IHkpLCAocCA9PT0gMyB8fCBwID09PSA1IHx8IHAgPT09IDcgfHwgcCA9PT0gOSkgJiYgZC5wdXNoKFwiLVwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGggPSBhIC0gMTYsIGYgPSBuZXcgVWludDhBcnJheShoKTtcbiAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgaDsgcCsrKVxuICAgICAgICBmW3BdID0gblt1KytdO1xuICAgICAgci5wdXNoKHtcbiAgICAgICAgcGF5bG9hZFR5cGU6IG8sXG4gICAgICAgIHB0czogdCxcbiAgICAgICAgdXVpZDogZC5qb2luKFwiXCIpLFxuICAgICAgICB1c2VyRGF0YTogVHIoZiksXG4gICAgICAgIHVzZXJEYXRhQnl0ZXM6IGZcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gTWcocykge1xuICBjb25zdCBlID0gcy5ieXRlTGVuZ3RoLCB0ID0gW107XG4gIGxldCByID0gMTtcbiAgZm9yICg7IHIgPCBlIC0gMjsgKVxuICAgIHNbcl0gPT09IDAgJiYgc1tyICsgMV0gPT09IDAgJiYgc1tyICsgMl0gPT09IDMgPyAodC5wdXNoKHIgKyAyKSwgciArPSAyKSA6IHIrKztcbiAgaWYgKHQubGVuZ3RoID09PSAwKVxuICAgIHJldHVybiBzO1xuICBjb25zdCBuID0gZSAtIHQubGVuZ3RoLCBpID0gbmV3IFVpbnQ4QXJyYXkobik7XG4gIGxldCBvID0gMDtcbiAgZm9yIChyID0gMDsgciA8IG47IG8rKywgcisrKVxuICAgIG8gPT09IHRbMF0gJiYgKG8rKywgdC5zaGlmdCgpKSwgaVtyXSA9IHNbb107XG4gIHJldHVybiBpO1xufVxuZnVuY3Rpb24gS1Mocykge1xuICBjb25zdCBlID0gc1swXTtcbiAgbGV0IHQgPSBcIlwiLCByID0gXCJcIiwgbiA9IDAsIGkgPSAwLCBvID0gMCwgYSA9IDAsIGwgPSAwLCBjID0gMDtcbiAgaWYgKGUgPT09IDApIHtcbiAgICBmb3IgKDsganQocy5zdWJhcnJheShjLCBjICsgMSkpICE9PSBcIlxcMFwiOyApXG4gICAgICB0ICs9IGp0KHMuc3ViYXJyYXkoYywgYyArIDEpKSwgYyArPSAxO1xuICAgIGZvciAodCArPSBqdChzLnN1YmFycmF5KGMsIGMgKyAxKSksIGMgKz0gMTsganQocy5zdWJhcnJheShjLCBjICsgMSkpICE9PSBcIlxcMFwiOyApXG4gICAgICByICs9IGp0KHMuc3ViYXJyYXkoYywgYyArIDEpKSwgYyArPSAxO1xuICAgIHIgKz0ganQocy5zdWJhcnJheShjLCBjICsgMSkpLCBjICs9IDEsIG4gPSBJZShzLCAxMiksIGkgPSBJZShzLCAxNiksIGEgPSBJZShzLCAyMCksIGwgPSBJZShzLCAyNCksIGMgPSAyODtcbiAgfSBlbHNlIGlmIChlID09PSAxKSB7XG4gICAgYyArPSA0LCBuID0gSWUocywgYyksIGMgKz0gNDtcbiAgICBjb25zdCBkID0gSWUocywgYyk7XG4gICAgYyArPSA0O1xuICAgIGNvbnN0IGggPSBJZShzLCBjKTtcbiAgICBmb3IgKGMgKz0gNCwgbyA9IDIgKiogMzIgKiBkICsgaCwgU1MobykgfHwgKG8gPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgcnQud2FybihcIlByZXNlbnRhdGlvbiB0aW1lIGV4Y2VlZHMgc2FmZSBpbnRlZ2VyIGxpbWl0IGFuZCB3cmFwcGVkIHRvIG1heCBzYWZlIGludGVnZXIgaW4gcGFyc2luZyBlbXNnIGJveFwiKSksIGEgPSBJZShzLCBjKSwgYyArPSA0LCBsID0gSWUocywgYyksIGMgKz0gNDsganQocy5zdWJhcnJheShjLCBjICsgMSkpICE9PSBcIlxcMFwiOyApXG4gICAgICB0ICs9IGp0KHMuc3ViYXJyYXkoYywgYyArIDEpKSwgYyArPSAxO1xuICAgIGZvciAodCArPSBqdChzLnN1YmFycmF5KGMsIGMgKyAxKSksIGMgKz0gMTsganQocy5zdWJhcnJheShjLCBjICsgMSkpICE9PSBcIlxcMFwiOyApXG4gICAgICByICs9IGp0KHMuc3ViYXJyYXkoYywgYyArIDEpKSwgYyArPSAxO1xuICAgIHIgKz0ganQocy5zdWJhcnJheShjLCBjICsgMSkpLCBjICs9IDE7XG4gIH1cbiAgY29uc3QgdSA9IHMuc3ViYXJyYXkoYywgcy5ieXRlTGVuZ3RoKTtcbiAgcmV0dXJuIHtcbiAgICBzY2hlbWVJZFVyaTogdCxcbiAgICB2YWx1ZTogcixcbiAgICB0aW1lU2NhbGU6IG4sXG4gICAgcHJlc2VudGF0aW9uVGltZTogbyxcbiAgICBwcmVzZW50YXRpb25UaW1lRGVsdGE6IGksXG4gICAgZXZlbnREdXJhdGlvbjogYSxcbiAgICBpZDogbCxcbiAgICBwYXlsb2FkOiB1XG4gIH07XG59XG5mdW5jdGlvbiBIUyhzLCAuLi5lKSB7XG4gIGNvbnN0IHQgPSBlLmxlbmd0aDtcbiAgbGV0IHIgPSA4LCBuID0gdDtcbiAgZm9yICg7IG4tLTsgKVxuICAgIHIgKz0gZVtuXS5ieXRlTGVuZ3RoO1xuICBjb25zdCBpID0gbmV3IFVpbnQ4QXJyYXkocik7XG4gIGZvciAoaVswXSA9IHIgPj4gMjQgJiAyNTUsIGlbMV0gPSByID4+IDE2ICYgMjU1LCBpWzJdID0gciA+PiA4ICYgMjU1LCBpWzNdID0gciAmIDI1NSwgaS5zZXQocywgNCksIG4gPSAwLCByID0gODsgbiA8IHQ7IG4rKylcbiAgICBpLnNldChlW25dLCByKSwgciArPSBlW25dLmJ5dGVMZW5ndGg7XG4gIHJldHVybiBpO1xufVxuZnVuY3Rpb24gcVMocywgZSwgdCkge1xuICBpZiAocy5ieXRlTGVuZ3RoICE9PSAxNilcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcIkludmFsaWQgc3lzdGVtIGlkXCIpO1xuICBsZXQgciwgbjtcbiAgciA9IDAsIG4gPSBuZXcgVWludDhBcnJheSgpO1xuICBsZXQgaTtcbiAgciA+IDAgPyAoaSA9IG5ldyBVaW50OEFycmF5KDQpLCBlLmxlbmd0aCA+IDAgJiYgbmV3IERhdGFWaWV3KGkuYnVmZmVyKS5zZXRVaW50MzIoMCwgZS5sZW5ndGgsICExKSkgOiBpID0gbmV3IFVpbnQ4QXJyYXkoKTtcbiAgY29uc3QgbyA9IG5ldyBVaW50OEFycmF5KDQpO1xuICByZXR1cm4gdC5ieXRlTGVuZ3RoID4gMCAmJiBuZXcgRGF0YVZpZXcoby5idWZmZXIpLnNldFVpbnQzMigwLCB0LmJ5dGVMZW5ndGgsICExKSwgSFMoXG4gICAgWzExMiwgMTE1LCAxMTUsIDEwNF0sXG4gICAgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgcixcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMFxuICAgICAgLy8gRmxhZ3NcbiAgICBdKSxcbiAgICBzLFxuICAgIC8vIDE2IGJ5dGVzXG4gICAgaSxcbiAgICBuLFxuICAgIG8sXG4gICAgdFxuICApO1xufVxuZnVuY3Rpb24gV1Mocykge1xuICBjb25zdCBlID0gW107XG4gIGlmIChzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICBjb25zdCB0ID0gcy5ieXRlTGVuZ3RoO1xuICAgIGxldCByID0gMDtcbiAgICBmb3IgKDsgciArIDMyIDwgdDsgKSB7XG4gICAgICBjb25zdCBuID0gbmV3IERhdGFWaWV3KHMsIHIpLCBpID0gelMobik7XG4gICAgICBlLnB1c2goaSksIHIgKz0gaS5zaXplO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIHpTKHMpIHtcbiAgY29uc3QgZSA9IHMuZ2V0VWludDMyKDApLCB0ID0gcy5ieXRlT2Zmc2V0LCByID0gcy5ieXRlTGVuZ3RoO1xuICBpZiAociA8IGUpXG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldDogdCxcbiAgICAgIHNpemU6IHJcbiAgICB9O1xuICBpZiAocy5nZXRVaW50MzIoNCkgIT09IDE4ODY2MTQzNzYpXG4gICAgcmV0dXJuIHtcbiAgICAgIG9mZnNldDogdCxcbiAgICAgIHNpemU6IGVcbiAgICB9O1xuICBjb25zdCBpID0gcy5nZXRVaW50MzIoOCkgPj4+IDI0O1xuICBpZiAoaSAhPT0gMCAmJiBpICE9PSAxKVxuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXQ6IHQsXG4gICAgICBzaXplOiBlXG4gICAgfTtcbiAgY29uc3QgbyA9IHMuYnVmZmVyLCBhID0gZnIobmV3IFVpbnQ4QXJyYXkobywgdCArIDEyLCAxNikpO1xuICBsZXQgbCA9IG51bGwsIGMgPSBudWxsLCB1ID0gMDtcbiAgaWYgKGkgPT09IDApXG4gICAgdSA9IDI4O1xuICBlbHNlIHtcbiAgICBjb25zdCBoID0gcy5nZXRVaW50MzIoMjgpO1xuICAgIGlmICghaCB8fCByIDwgMzIgKyBoICogMTYpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBvZmZzZXQ6IHQsXG4gICAgICAgIHNpemU6IGVcbiAgICAgIH07XG4gICAgbCA9IFtdO1xuICAgIGZvciAobGV0IGYgPSAwOyBmIDwgaDsgZisrKVxuICAgICAgbC5wdXNoKG5ldyBVaW50OEFycmF5KG8sIHQgKyAzMiArIGYgKiAxNiwgMTYpKTtcbiAgICB1ID0gMzIgKyBoICogMTY7XG4gIH1cbiAgaWYgKCF1KVxuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXQ6IHQsXG4gICAgICBzaXplOiBlXG4gICAgfTtcbiAgY29uc3QgZCA9IHMuZ2V0VWludDMyKHUpO1xuICByZXR1cm4gZSAtIDMyIDwgZCA/IHtcbiAgICBvZmZzZXQ6IHQsXG4gICAgc2l6ZTogZVxuICB9IDogKGMgPSBuZXcgVWludDhBcnJheShvLCB0ICsgdSArIDQsIGQpLCB7XG4gICAgdmVyc2lvbjogaSxcbiAgICBzeXN0ZW1JZDogYSxcbiAgICBraWRzOiBsLFxuICAgIGRhdGE6IGMsXG4gICAgb2Zmc2V0OiB0LFxuICAgIHNpemU6IGVcbiAgfSk7XG59XG5jb25zdCBPZyA9ICgpID0+IC9cXChXaW5kb3dzLitGaXJlZm94XFwvL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSwgRm4gPSB7XG4gIGF1ZGlvOiB7XG4gICAgYTNkczogMSxcbiAgICBcImFjLTNcIjogMC45NSxcbiAgICBcImFjLTRcIjogMSxcbiAgICBhbGFjOiAwLjksXG4gICAgYWxhdzogMSxcbiAgICBkcmExOiAxLFxuICAgIFwiZHRzK1wiOiAxLFxuICAgIFwiZHRzLVwiOiAxLFxuICAgIGR0c2M6IDEsXG4gICAgZHRzZTogMSxcbiAgICBkdHNoOiAxLFxuICAgIFwiZWMtM1wiOiAwLjksXG4gICAgZW5jYTogMSxcbiAgICBmTGFDOiAwLjksXG4gICAgLy8gTVA0LVJBIGxpc3RlZCBjb2RlYyBlbnRyeSBmb3IgRkxBQ1xuICAgIGZsYWM6IDAuOSxcbiAgICAvLyBsZWdhY3kgYnJvd3NlciBjb2RlYyBuYW1lIGZvciBGTEFDXG4gICAgRkxBQzogMC45LFxuICAgIC8vIHNvbWUgbWFuaWZlc3RzIG1heSBsaXN0IFwiRkxBQ1wiIHdpdGggQXBwbGUncyB0b29sc1xuICAgIGc3MTk6IDEsXG4gICAgZzcyNjogMSxcbiAgICBtNGFlOiAxLFxuICAgIG1oYTE6IDEsXG4gICAgbWhhMjogMSxcbiAgICBtaG0xOiAxLFxuICAgIG1obTI6IDEsXG4gICAgbWxwYTogMSxcbiAgICBtcDRhOiAxLFxuICAgIFwicmF3IFwiOiAxLFxuICAgIE9wdXM6IDEsXG4gICAgb3B1czogMSxcbiAgICAvLyBicm93c2VycyBleHBlY3QgdGhpcyB0byBiZSBsb3dlcmNhc2UgZGVzcGl0ZSBNUDRSQSBzYXlzICdPcHVzJ1xuICAgIHNhbXI6IDEsXG4gICAgc2F3YjogMSxcbiAgICBzYXdwOiAxLFxuICAgIHNldmM6IDEsXG4gICAgc3FjcDogMSxcbiAgICBzc212OiAxLFxuICAgIHR3b3M6IDEsXG4gICAgdWxhdzogMVxuICB9LFxuICB2aWRlbzoge1xuICAgIGF2YzE6IDEsXG4gICAgYXZjMjogMSxcbiAgICBhdmMzOiAxLFxuICAgIGF2YzQ6IDEsXG4gICAgYXZjcDogMSxcbiAgICBhdjAxOiAwLjgsXG4gICAgZGF2MTogMC44LFxuICAgIGRyYWM6IDEsXG4gICAgZHZhMTogMSxcbiAgICBkdmF2OiAxLFxuICAgIGR2aDE6IDAuNyxcbiAgICBkdmhlOiAwLjcsXG4gICAgZW5jdjogMSxcbiAgICBoZXYxOiAwLjc1LFxuICAgIGh2YzE6IDAuNzUsXG4gICAgbWpwMjogMSxcbiAgICBtcDR2OiAxLFxuICAgIG12YzE6IDEsXG4gICAgbXZjMjogMSxcbiAgICBtdmMzOiAxLFxuICAgIG12YzQ6IDEsXG4gICAgcmVzdjogMSxcbiAgICBydjYwOiAxLFxuICAgIHMyNjM6IDEsXG4gICAgc3ZjMTogMSxcbiAgICBzdmMyOiAxLFxuICAgIFwidmMtMVwiOiAxLFxuICAgIHZwMDg6IDEsXG4gICAgdnAwOTogMC45XG4gIH0sXG4gIHRleHQ6IHtcbiAgICBzdHBwOiAxLFxuICAgIHd2dHQ6IDFcbiAgfVxufTtcbmZ1bmN0aW9uIHB1KHMsIGUpIHtcbiAgY29uc3QgdCA9IEZuW2VdO1xuICByZXR1cm4gISF0ICYmICEhdFtzLnNsaWNlKDAsIDQpXTtcbn1cbmZ1bmN0aW9uIGdpKHMsIGUsIHQgPSAhMCkge1xuICByZXR1cm4gIXMuc3BsaXQoXCIsXCIpLnNvbWUoKHIpID0+ICFtdShyLCBlLCB0KSk7XG59XG5mdW5jdGlvbiBtdShzLCBlLCB0ID0gITApIHtcbiAgdmFyIHI7XG4gIGNvbnN0IG4gPSBNcyh0KTtcbiAgcmV0dXJuIChyID0gbiA9PSBudWxsID8gdm9pZCAwIDogbi5pc1R5cGVTdXBwb3J0ZWQocGkocywgZSkpKSAhPSBudWxsID8gciA6ICExO1xufVxuZnVuY3Rpb24gcGkocywgZSkge1xuICByZXR1cm4gYCR7ZX0vbXA0O2NvZGVjcz0ke3N9YDtcbn1cbmZ1bmN0aW9uIHNoKHMpIHtcbiAgaWYgKHMpIHtcbiAgICBjb25zdCBlID0gcy5zdWJzdHJpbmcoMCwgNCk7XG4gICAgcmV0dXJuIEZuLnZpZGVvW2VdO1xuICB9XG4gIHJldHVybiAyO1xufVxuZnVuY3Rpb24gWm8ocykge1xuICBjb25zdCBlID0gT2coKTtcbiAgcmV0dXJuIHMuc3BsaXQoXCIsXCIpLnJlZHVjZSgodCwgcikgPT4ge1xuICAgIGNvbnN0IGkgPSBlICYmIHlhKHIpID8gOSA6IEZuLnZpZGVvW3JdO1xuICAgIHJldHVybiBpID8gKGkgKiAyICsgdCkgLyAodCA/IDMgOiAyKSA6IChGbi5hdWRpb1tyXSArIHQpIC8gKHQgPyAyIDogMSk7XG4gIH0sIDApO1xufVxuY29uc3QgaGwgPSB7fTtcbmZ1bmN0aW9uIFlTKHMsIGUgPSAhMCkge1xuICBpZiAoaGxbc10pXG4gICAgcmV0dXJuIGhsW3NdO1xuICBjb25zdCB0ID0ge1xuICAgIC8vIElkZWFseSBmTGFDIGFuZCBPcHVzIHdvdWxkIGJlIGZpcnN0IChzcGVjLWNvbXBsaWFudCkgYnV0XG4gICAgLy8gc29tZSBicm93c2VycyB3aWxsIHJlcG9ydCB0aGF0IGZMYUMgaXMgc3VwcG9ydGVkIHRoZW4gZmFpbC5cbiAgICAvLyBzZWU6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTE0MjI3MjhcbiAgICBmbGFjOiBbXCJmbGFjXCIsIFwiZkxhQ1wiLCBcIkZMQUNcIl0sXG4gICAgb3B1czogW1wib3B1c1wiLCBcIk9wdXNcIl0sXG4gICAgLy8gUmVwbGFjZSBhdWRpbyBjb2RlYyBpbmZvIGlmIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBtcDRhLjQwLjM0LFxuICAgIC8vIGFuZCBkZW11eGVyIGNhbiBmYWxsYmFjayB0byAnYXVkaW8vbXBlZycgb3IgJ2F1ZGlvL21wNDtjb2RlY3M9XCJtcDNcIidcbiAgICBcIm1wNGEuNDAuMzRcIjogW1wibXAzXCJdXG4gIH1bc107XG4gIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykge1xuICAgIHZhciByO1xuICAgIGlmIChtdSh0W25dLCBcImF1ZGlvXCIsIGUpKVxuICAgICAgcmV0dXJuIGhsW3NdID0gdFtuXSwgdFtuXTtcbiAgICBpZiAodFtuXSA9PT0gXCJtcDNcIiAmJiAociA9IE1zKGUpKSAhPSBudWxsICYmIHIuaXNUeXBlU3VwcG9ydGVkKFwiYXVkaW8vbXBlZ1wiKSlcbiAgICAgIHJldHVybiBcIlwiO1xuICB9XG4gIHJldHVybiBzO1xufVxuY29uc3QgWlMgPSAvZmxhY3xvcHVzfG1wNGFcXC40MFxcLjM0L2k7XG5mdW5jdGlvbiBYbyhzLCBlID0gITApIHtcbiAgcmV0dXJuIHMucmVwbGFjZShaUywgKHQpID0+IFlTKHQudG9Mb3dlckNhc2UoKSwgZSkpO1xufVxuZnVuY3Rpb24gWFMocywgZSkge1xuICBjb25zdCB0ID0gW107XG4gIGlmIChzKSB7XG4gICAgY29uc3QgciA9IHMuc3BsaXQoXCIsXCIpO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgci5sZW5ndGg7IG4rKylcbiAgICAgIHB1KHJbbl0sIFwidmlkZW9cIikgfHwgdC5wdXNoKHJbbl0pO1xuICB9XG4gIHJldHVybiBlICYmIHQucHVzaChlKSwgdC5qb2luKFwiLFwiKTtcbn1cbmZ1bmN0aW9uIGZvKHMsIGUpIHtcbiAgaWYgKHMgJiYgKHMubGVuZ3RoID4gNCB8fCBbXCJhYy0zXCIsIFwiZWMtM1wiLCBcImFsYWNcIiwgXCJmTGFDXCIsIFwiT3B1c1wiXS5pbmRleE9mKHMpICE9PSAtMSkgJiYgKG5oKHMsIFwiYXVkaW9cIikgfHwgbmgocywgXCJ2aWRlb1wiKSkpXG4gICAgcmV0dXJuIHM7XG4gIGlmIChlKSB7XG4gICAgY29uc3QgdCA9IGUuc3BsaXQoXCIsXCIpO1xuICAgIGlmICh0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChzKSB7XG4gICAgICAgIGZvciAobGV0IHIgPSB0Lmxlbmd0aDsgci0tOyApXG4gICAgICAgICAgaWYgKHRbcl0uc3Vic3RyaW5nKDAsIDQpID09PSBzLnN1YnN0cmluZygwLCA0KSlcbiAgICAgICAgICAgIHJldHVybiB0W3JdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRbMF07XG4gICAgfVxuICB9XG4gIHJldHVybiBlIHx8IHM7XG59XG5mdW5jdGlvbiBuaChzLCBlKSB7XG4gIHJldHVybiBwdShzLCBlKSAmJiBtdShzLCBlKTtcbn1cbmZ1bmN0aW9uIEpTKHMpIHtcbiAgY29uc3QgZSA9IHMuc3BsaXQoXCIsXCIpO1xuICBmb3IgKGxldCB0ID0gMDsgdCA8IGUubGVuZ3RoOyB0KyspIHtcbiAgICBjb25zdCByID0gZVt0XS5zcGxpdChcIi5cIik7XG4gICAgci5sZW5ndGggPiAyICYmIHJbMF0gPT09IFwiYXZjMVwiICYmIChlW3RdID0gYGF2YzEuJHtwYXJzZUludChyWzFdKS50b1N0cmluZygxNil9JHsoXCIwMDBcIiArIHBhcnNlSW50KHJbMl0pLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTQpfWApO1xuICB9XG4gIHJldHVybiBlLmpvaW4oXCIsXCIpO1xufVxuZnVuY3Rpb24gUVMocykge1xuICBpZiAocy5zdGFydHNXaXRoKFwiYXYwMS5cIikpIHtcbiAgICBjb25zdCBlID0gcy5zcGxpdChcIi5cIiksIHQgPSBbXCIwXCIsIFwiMTExXCIsIFwiMDFcIiwgXCIwMVwiLCBcIjAxXCIsIFwiMFwiXTtcbiAgICBmb3IgKGxldCByID0gZS5sZW5ndGg7IHIgPiA0ICYmIHIgPCAxMDsgcisrKVxuICAgICAgZVtyXSA9IHRbciAtIDRdO1xuICAgIHJldHVybiBlLmpvaW4oXCIuXCIpO1xuICB9XG4gIHJldHVybiBzO1xufVxuZnVuY3Rpb24gaWgocykge1xuICBjb25zdCBlID0gTXMocykgfHwge1xuICAgIGlzVHlwZVN1cHBvcnRlZDogKCkgPT4gITFcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBtcGVnOiBlLmlzVHlwZVN1cHBvcnRlZChcImF1ZGlvL21wZWdcIiksXG4gICAgbXAzOiBlLmlzVHlwZVN1cHBvcnRlZCgnYXVkaW8vbXA0OyBjb2RlY3M9XCJtcDNcIicpLFxuICAgIGFjMzogZS5pc1R5cGVTdXBwb3J0ZWQoJ2F1ZGlvL21wNDsgY29kZWNzPVwiYWMtM1wiJylcbiAgfTtcbn1cbmZ1bmN0aW9uIGxjKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXi4rY29kZWNzPVtcIiddPyhbXlwiJ10rKS4qJC8sIFwiJDFcIik7XG59XG5jb25zdCBlYiA9IHtcbiAgc3VwcG9ydGVkOiAhMCxcbiAgcG93ZXJFZmZpY2llbnQ6ICEwLFxuICBzbW9vdGg6ICEwXG4gIC8vIGtleVN5c3RlbUFjY2VzczogbnVsbCxcbn0sIHRiID0ge1xuICBzdXBwb3J0ZWQ6ICExLFxuICBzbW9vdGg6ICExLFxuICBwb3dlckVmZmljaWVudDogITFcbiAgLy8ga2V5U3lzdGVtQWNjZXNzOiBudWxsLFxufSwgQmcgPSB7XG4gIHN1cHBvcnRlZDogITAsXG4gIGNvbmZpZ3VyYXRpb25zOiBbXSxcbiAgZGVjb2RpbmdJbmZvUmVzdWx0czogW2ViXVxufTtcbmZ1bmN0aW9uIEZnKHMsIGUpIHtcbiAgcmV0dXJuIHtcbiAgICBzdXBwb3J0ZWQ6ICExLFxuICAgIGNvbmZpZ3VyYXRpb25zOiBlLFxuICAgIGRlY29kaW5nSW5mb1Jlc3VsdHM6IFt0Yl0sXG4gICAgZXJyb3I6IHNcbiAgfTtcbn1cbmZ1bmN0aW9uIHJiKHMsIGUsIHQsIHIsIG4sIGkpIHtcbiAgY29uc3QgbyA9IHMudmlkZW9Db2RlYywgYSA9IHMuYXVkaW9Db2RlYyA/IHMuYXVkaW9Hcm91cHMgOiBudWxsLCBsID0gaSA9PSBudWxsID8gdm9pZCAwIDogaS5hdWRpb0NvZGVjLCBjID0gaSA9PSBudWxsID8gdm9pZCAwIDogaS5jaGFubmVscywgdSA9IGMgPyBwYXJzZUludChjKSA6IGwgPyAxIC8gMCA6IDI7XG4gIGxldCBkID0gbnVsbDtcbiAgaWYgKGEgIT0gbnVsbCAmJiBhLmxlbmd0aClcbiAgICB0cnkge1xuICAgICAgYS5sZW5ndGggPT09IDEgJiYgYVswXSA/IGQgPSBlLmdyb3Vwc1thWzBdXS5jaGFubmVscyA6IGQgPSBhLnJlZHVjZSgoaCwgZikgPT4ge1xuICAgICAgICBpZiAoZikge1xuICAgICAgICAgIGNvbnN0IHAgPSBlLmdyb3Vwc1tmXTtcbiAgICAgICAgICBpZiAoIXApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF1ZGlvIHRyYWNrIGdyb3VwICR7Zn0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgT2JqZWN0LmtleXMocC5jaGFubmVscykuZm9yRWFjaCgoeSkgPT4ge1xuICAgICAgICAgICAgaFt5XSA9IChoW3ldIHx8IDApICsgcC5jaGFubmVsc1t5XTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaDtcbiAgICAgIH0sIHtcbiAgICAgICAgMjogMFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gITA7XG4gICAgfVxuICByZXR1cm4gbyAhPT0gdm9pZCAwICYmIC8vIEZvcmNlIG1lZGlhIGNhcGFiaWxpdGllcyBjaGVjayBmb3IgSEVWQyB0byBhdm9pZCBmYWlsdXJlIG9uIFdpbmRvd3NcbiAgKG8uc3BsaXQoXCIsXCIpLnNvbWUoKGgpID0+IHlhKGgpKSB8fCBzLndpZHRoID4gMTkyMCAmJiBzLmhlaWdodCA+IDEwODggfHwgcy5oZWlnaHQgPiAxOTIwICYmIHMud2lkdGggPiAxMDg4IHx8IHMuZnJhbWVSYXRlID4gTWF0aC5tYXgociwgMzApIHx8IHMudmlkZW9SYW5nZSAhPT0gXCJTRFJcIiAmJiBzLnZpZGVvUmFuZ2UgIT09IHQgfHwgcy5iaXRyYXRlID4gTWF0aC5tYXgobiwgOGU2KSkgfHwgISFkICYmIHVlKHUpICYmIE9iamVjdC5rZXlzKGQpLnNvbWUoKGgpID0+IHBhcnNlSW50KGgpID4gdSk7XG59XG5mdW5jdGlvbiBOZyhzLCBlLCB0LCByID0ge30pIHtcbiAgY29uc3QgbiA9IHMudmlkZW9Db2RlYztcbiAgaWYgKCFuICYmICFzLmF1ZGlvQ29kZWMgfHwgIXQpXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShCZyk7XG4gIGNvbnN0IGkgPSBbXSwgbyA9IHNiKHMpLCBhID0gby5sZW5ndGgsIGwgPSBuYihzLCBlLCBhID4gMCksIGMgPSBsLmxlbmd0aDtcbiAgZm9yIChsZXQgdSA9IGEgfHwgMSAqIGMgfHwgMTsgdS0tOyApIHtcbiAgICBjb25zdCBkID0ge1xuICAgICAgdHlwZTogXCJtZWRpYS1zb3VyY2VcIlxuICAgIH07XG4gICAgaWYgKGEgJiYgKGQudmlkZW8gPSBvW3UgJSBhXSksIGMpIHtcbiAgICAgIGQuYXVkaW8gPSBsW3UgJSBjXTtcbiAgICAgIGNvbnN0IGggPSBkLmF1ZGlvLmJpdHJhdGU7XG4gICAgICBkLnZpZGVvICYmIGggJiYgKGQudmlkZW8uYml0cmF0ZSAtPSBoKTtcbiAgICB9XG4gICAgaS5wdXNoKGQpO1xuICB9XG4gIGlmIChuKSB7XG4gICAgY29uc3QgdSA9IG5hdmlnYXRvci51c2VyQWdlbnQ7XG4gICAgaWYgKG4uc3BsaXQoXCIsXCIpLnNvbWUoKGQpID0+IHlhKGQpKSAmJiBPZygpKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShGZyhuZXcgRXJyb3IoYE92ZXJyaWRpbmcgV2luZG93cyBGaXJlZm94IEhFVkMgTWVkaWFDYXBhYmlsaXRpZXMgcmVzdWx0IGJhc2VkIG9uIHVzZXItYWdlbnQgc3RyaW5nOiAoJHt1fSlgKSwgaSkpO1xuICB9XG4gIHJldHVybiBQcm9taXNlLmFsbChpLm1hcCgodSkgPT4ge1xuICAgIGNvbnN0IGQgPSBvYih1KTtcbiAgICByZXR1cm4gcltkXSB8fCAocltkXSA9IHQuZGVjb2RpbmdJbmZvKHUpKTtcbiAgfSkpLnRoZW4oKHUpID0+ICh7XG4gICAgc3VwcG9ydGVkOiAhdS5zb21lKChkKSA9PiAhZC5zdXBwb3J0ZWQpLFxuICAgIGNvbmZpZ3VyYXRpb25zOiBpLFxuICAgIGRlY29kaW5nSW5mb1Jlc3VsdHM6IHVcbiAgfSkpLmNhdGNoKCh1KSA9PiAoe1xuICAgIHN1cHBvcnRlZDogITEsXG4gICAgY29uZmlndXJhdGlvbnM6IGksXG4gICAgZGVjb2RpbmdJbmZvUmVzdWx0czogW10sXG4gICAgZXJyb3I6IHVcbiAgfSkpO1xufVxuZnVuY3Rpb24gc2Iocykge1xuICB2YXIgZTtcbiAgY29uc3QgdCA9IChlID0gcy52aWRlb0NvZGVjKSA9PSBudWxsID8gdm9pZCAwIDogZS5zcGxpdChcIixcIiksIHIgPSBVZyhzKSwgbiA9IHMud2lkdGggfHwgNjQwLCBpID0gcy5oZWlnaHQgfHwgNDgwLCBvID0gcy5mcmFtZVJhdGUgfHwgMzAsIGEgPSBzLnZpZGVvUmFuZ2UudG9Mb3dlckNhc2UoKTtcbiAgcmV0dXJuIHQgPyB0Lm1hcCgobCkgPT4ge1xuICAgIGNvbnN0IGMgPSB7XG4gICAgICBjb250ZW50VHlwZTogcGkoUVMobCksIFwidmlkZW9cIiksXG4gICAgICB3aWR0aDogbixcbiAgICAgIGhlaWdodDogaSxcbiAgICAgIGJpdHJhdGU6IHIsXG4gICAgICBmcmFtZXJhdGU6IG9cbiAgICB9O1xuICAgIHJldHVybiBhICE9PSBcInNkclwiICYmIChjLnRyYW5zZmVyRnVuY3Rpb24gPSBhKSwgYztcbiAgfSkgOiBbXTtcbn1cbmZ1bmN0aW9uIG5iKHMsIGUsIHQpIHtcbiAgdmFyIHI7XG4gIGNvbnN0IG4gPSAociA9IHMuYXVkaW9Db2RlYykgPT0gbnVsbCA/IHZvaWQgMCA6IHIuc3BsaXQoXCIsXCIpLCBpID0gVWcocyk7XG4gIHJldHVybiBuICYmIHMuYXVkaW9Hcm91cHMgPyBzLmF1ZGlvR3JvdXBzLnJlZHVjZSgobywgYSkgPT4ge1xuICAgIHZhciBsO1xuICAgIGNvbnN0IGMgPSBhID8gKGwgPSBlLmdyb3Vwc1thXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGwudHJhY2tzIDogbnVsbDtcbiAgICByZXR1cm4gYyA/IGMucmVkdWNlKCh1LCBkKSA9PiB7XG4gICAgICBpZiAoZC5ncm91cElkID09PSBhKSB7XG4gICAgICAgIGNvbnN0IGggPSBwYXJzZUZsb2F0KGQuY2hhbm5lbHMgfHwgXCJcIik7XG4gICAgICAgIG4uZm9yRWFjaCgoZikgPT4ge1xuICAgICAgICAgIGNvbnN0IHAgPSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZTogcGkoZiwgXCJhdWRpb1wiKSxcbiAgICAgICAgICAgIGJpdHJhdGU6IHQgPyBpYihmLCBpKSA6IGlcbiAgICAgICAgICB9O1xuICAgICAgICAgIGggJiYgKHAuY2hhbm5lbHMgPSBcIlwiICsgaCksIHUucHVzaChwKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdTtcbiAgICB9LCBvKSA6IG87XG4gIH0sIFtdKSA6IFtdO1xufVxuZnVuY3Rpb24gaWIocywgZSkge1xuICBpZiAoZSA8PSAxKVxuICAgIHJldHVybiAxO1xuICBsZXQgdCA9IDEyOGUzO1xuICByZXR1cm4gcyA9PT0gXCJlYy0zXCIgPyB0ID0gNzY4ZTMgOiBzID09PSBcImFjLTNcIiAmJiAodCA9IDY0ZTQpLCBNYXRoLm1pbihlIC8gMiwgdCk7XG59XG5mdW5jdGlvbiBVZyhzKSB7XG4gIHJldHVybiBNYXRoLmNlaWwoTWF0aC5tYXgocy5iaXRyYXRlICogMC45LCBzLmF2ZXJhZ2VCaXRyYXRlKSAvIDFlMykgKiAxZTMgfHwgMTtcbn1cbmZ1bmN0aW9uIG9iKHMpIHtcbiAgbGV0IGUgPSBcIlwiO1xuICBjb25zdCB7XG4gICAgYXVkaW86IHQsXG4gICAgdmlkZW86IHJcbiAgfSA9IHM7XG4gIGlmIChyKSB7XG4gICAgY29uc3QgbiA9IGxjKHIuY29udGVudFR5cGUpO1xuICAgIGUgKz0gYCR7bn1fciR7ci5oZWlnaHR9eCR7ci53aWR0aH1mJHtNYXRoLmNlaWwoci5mcmFtZXJhdGUpfSR7ci50cmFuc2ZlckZ1bmN0aW9uIHx8IFwic2RcIn1fJHtNYXRoLmNlaWwoci5iaXRyYXRlIC8gMWU1KX1gO1xuICB9XG4gIGlmICh0KSB7XG4gICAgY29uc3QgbiA9IGxjKHQuY29udGVudFR5cGUpO1xuICAgIGUgKz0gYCR7ciA/IFwiX1wiIDogXCJcIn0ke259X2Mke3QuY2hhbm5lbHN9YDtcbiAgfVxuICByZXR1cm4gZTtcbn1cbmNvbnN0IGNjID0gW1wiTk9ORVwiLCBcIlRZUEUtMFwiLCBcIlRZUEUtMVwiLCBudWxsXTtcbmZ1bmN0aW9uIGFiKHMpIHtcbiAgcmV0dXJuIGNjLmluZGV4T2YocykgPiAtMTtcbn1cbmNvbnN0IEpvID0gW1wiU0RSXCIsIFwiUFFcIiwgXCJITEdcIl07XG5mdW5jdGlvbiBsYihzKSB7XG4gIHJldHVybiAhIXMgJiYgSm8uaW5kZXhPZihzKSA+IC0xO1xufVxudmFyIGdvID0ge1xuICBObzogXCJcIixcbiAgWWVzOiBcIllFU1wiLFxuICB2MjogXCJ2MlwiXG59O1xuZnVuY3Rpb24gb2gocykge1xuICBjb25zdCB7XG4gICAgY2FuU2tpcFVudGlsOiBlLFxuICAgIGNhblNraXBEYXRlUmFuZ2VzOiB0LFxuICAgIGFnZTogclxuICB9ID0gcywgbiA9IHIgPCBlIC8gMjtcbiAgcmV0dXJuIGUgJiYgbiA/IHQgPyBnby52MiA6IGdvLlllcyA6IGdvLk5vO1xufVxuY2xhc3MgYWgge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgdGhpcy5tc24gPSB2b2lkIDAsIHRoaXMucGFydCA9IHZvaWQgMCwgdGhpcy5za2lwID0gdm9pZCAwLCB0aGlzLm1zbiA9IGUsIHRoaXMucGFydCA9IHQsIHRoaXMuc2tpcCA9IHI7XG4gIH1cbiAgYWRkRGlyZWN0aXZlcyhlKSB7XG4gICAgY29uc3QgdCA9IG5ldyBzZWxmLlVSTChlKTtcbiAgICByZXR1cm4gdGhpcy5tc24gIT09IHZvaWQgMCAmJiB0LnNlYXJjaFBhcmFtcy5zZXQoXCJfSExTX21zblwiLCB0aGlzLm1zbi50b1N0cmluZygpKSwgdGhpcy5wYXJ0ICE9PSB2b2lkIDAgJiYgdC5zZWFyY2hQYXJhbXMuc2V0KFwiX0hMU19wYXJ0XCIsIHRoaXMucGFydC50b1N0cmluZygpKSwgdGhpcy5za2lwICYmIHQuc2VhcmNoUGFyYW1zLnNldChcIl9ITFNfc2tpcFwiLCB0aGlzLnNraXApLCB0LmhyZWY7XG4gIH1cbn1cbmNsYXNzIG1pIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIGlmICh0aGlzLl9hdHRycyA9IHZvaWQgMCwgdGhpcy5hdWRpb0NvZGVjID0gdm9pZCAwLCB0aGlzLmJpdHJhdGUgPSB2b2lkIDAsIHRoaXMuY29kZWNTZXQgPSB2b2lkIDAsIHRoaXMudXJsID0gdm9pZCAwLCB0aGlzLmZyYW1lUmF0ZSA9IHZvaWQgMCwgdGhpcy5oZWlnaHQgPSB2b2lkIDAsIHRoaXMuaWQgPSB2b2lkIDAsIHRoaXMubmFtZSA9IHZvaWQgMCwgdGhpcy5zdXBwbGVtZW50YWwgPSB2b2lkIDAsIHRoaXMudmlkZW9Db2RlYyA9IHZvaWQgMCwgdGhpcy53aWR0aCA9IHZvaWQgMCwgdGhpcy5kZXRhaWxzID0gdm9pZCAwLCB0aGlzLmZyYWdtZW50RXJyb3IgPSAwLCB0aGlzLmxvYWRFcnJvciA9IDAsIHRoaXMubG9hZGVkID0gdm9pZCAwLCB0aGlzLnJlYWxCaXRyYXRlID0gMCwgdGhpcy5zdXBwb3J0ZWRQcm9taXNlID0gdm9pZCAwLCB0aGlzLnN1cHBvcnRlZFJlc3VsdCA9IHZvaWQgMCwgdGhpcy5fYXZnQml0cmF0ZSA9IDAsIHRoaXMuX2F1ZGlvR3JvdXBzID0gdm9pZCAwLCB0aGlzLl9zdWJ0aXRsZUdyb3VwcyA9IHZvaWQgMCwgdGhpcy5fdXJsSWQgPSAwLCB0aGlzLnVybCA9IFtlLnVybF0sIHRoaXMuX2F0dHJzID0gW2UuYXR0cnNdLCB0aGlzLmJpdHJhdGUgPSBlLmJpdHJhdGUsIGUuZGV0YWlscyAmJiAodGhpcy5kZXRhaWxzID0gZS5kZXRhaWxzKSwgdGhpcy5pZCA9IGUuaWQgfHwgMCwgdGhpcy5uYW1lID0gZS5uYW1lLCB0aGlzLndpZHRoID0gZS53aWR0aCB8fCAwLCB0aGlzLmhlaWdodCA9IGUuaGVpZ2h0IHx8IDAsIHRoaXMuZnJhbWVSYXRlID0gZS5hdHRycy5vcHRpb25hbEZsb2F0KFwiRlJBTUUtUkFURVwiLCAwKSwgdGhpcy5fYXZnQml0cmF0ZSA9IGUuYXR0cnMuZGVjaW1hbEludGVnZXIoXCJBVkVSQUdFLUJBTkRXSURUSFwiKSwgdGhpcy5hdWRpb0NvZGVjID0gZS5hdWRpb0NvZGVjLCB0aGlzLnZpZGVvQ29kZWMgPSBlLnZpZGVvQ29kZWMsIHRoaXMuY29kZWNTZXQgPSBbZS52aWRlb0NvZGVjLCBlLmF1ZGlvQ29kZWNdLmZpbHRlcigocikgPT4gISFyKS5tYXAoKHIpID0+IHIuc3Vic3RyaW5nKDAsIDQpKS5qb2luKFwiLFwiKSwgXCJzdXBwbGVtZW50YWxcIiBpbiBlKSB7XG4gICAgICB2YXIgdDtcbiAgICAgIHRoaXMuc3VwcGxlbWVudGFsID0gZS5zdXBwbGVtZW50YWw7XG4gICAgICBjb25zdCByID0gKHQgPSBlLnN1cHBsZW1lbnRhbCkgPT0gbnVsbCA/IHZvaWQgMCA6IHQudmlkZW9Db2RlYztcbiAgICAgIHIgJiYgciAhPT0gZS52aWRlb0NvZGVjICYmICh0aGlzLmNvZGVjU2V0ICs9IGAsJHtyLnN1YnN0cmluZygwLCA0KX1gKTtcbiAgICB9XG4gICAgdGhpcy5hZGRHcm91cElkKFwiYXVkaW9cIiwgZS5hdHRycy5BVURJTyksIHRoaXMuYWRkR3JvdXBJZChcInRleHRcIiwgZS5hdHRycy5TVUJUSVRMRVMpO1xuICB9XG4gIGdldCBtYXhCaXRyYXRlKCkge1xuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLnJlYWxCaXRyYXRlLCB0aGlzLmJpdHJhdGUpO1xuICB9XG4gIGdldCBhdmVyYWdlQml0cmF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fYXZnQml0cmF0ZSB8fCB0aGlzLnJlYWxCaXRyYXRlIHx8IHRoaXMuYml0cmF0ZTtcbiAgfVxuICBnZXQgYXR0cnMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2F0dHJzWzBdO1xuICB9XG4gIGdldCBjb2RlY3MoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0cnMuQ09ERUNTIHx8IFwiXCI7XG4gIH1cbiAgZ2V0IHBhdGh3YXlJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyc1tcIlBBVEhXQVktSURcIl0gfHwgXCIuXCI7XG4gIH1cbiAgZ2V0IHZpZGVvUmFuZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0cnNbXCJWSURFTy1SQU5HRVwiXSB8fCBcIlNEUlwiO1xuICB9XG4gIGdldCBzY29yZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRycy5vcHRpb25hbEZsb2F0KFwiU0NPUkVcIiwgMCk7XG4gIH1cbiAgZ2V0IHVyaSgpIHtcbiAgICByZXR1cm4gdGhpcy51cmxbMF0gfHwgXCJcIjtcbiAgfVxuICBoYXNBdWRpb0dyb3VwKGUpIHtcbiAgICByZXR1cm4gbGgodGhpcy5fYXVkaW9Hcm91cHMsIGUpO1xuICB9XG4gIGhhc1N1YnRpdGxlR3JvdXAoZSkge1xuICAgIHJldHVybiBsaCh0aGlzLl9zdWJ0aXRsZUdyb3VwcywgZSk7XG4gIH1cbiAgZ2V0IGF1ZGlvR3JvdXBzKCkge1xuICAgIHJldHVybiB0aGlzLl9hdWRpb0dyb3VwcztcbiAgfVxuICBnZXQgc3VidGl0bGVHcm91cHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N1YnRpdGxlR3JvdXBzO1xuICB9XG4gIGFkZEdyb3VwSWQoZSwgdCkge1xuICAgIGlmICh0KSB7XG4gICAgICBpZiAoZSA9PT0gXCJhdWRpb1wiKSB7XG4gICAgICAgIGxldCByID0gdGhpcy5fYXVkaW9Hcm91cHM7XG4gICAgICAgIHIgfHwgKHIgPSB0aGlzLl9hdWRpb0dyb3VwcyA9IFtdKSwgci5pbmRleE9mKHQpID09PSAtMSAmJiByLnB1c2godCk7XG4gICAgICB9IGVsc2UgaWYgKGUgPT09IFwidGV4dFwiKSB7XG4gICAgICAgIGxldCByID0gdGhpcy5fc3VidGl0bGVHcm91cHM7XG4gICAgICAgIHIgfHwgKHIgPSB0aGlzLl9zdWJ0aXRsZUdyb3VwcyA9IFtdKSwgci5pbmRleE9mKHQpID09PSAtMSAmJiByLnB1c2godCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vIERlcHJlY2F0ZWQgbWV0aG9kcyAocmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICBnZXQgdXJsSWQoKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgc2V0IHVybElkKGUpIHtcbiAgfVxuICBnZXQgYXVkaW9Hcm91cElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5hdWRpb0dyb3VwcyA/IFt0aGlzLmF1ZGlvR3JvdXBJZF0gOiB2b2lkIDA7XG4gIH1cbiAgZ2V0IHRleHRHcm91cElkcygpIHtcbiAgICByZXR1cm4gdGhpcy5zdWJ0aXRsZUdyb3VwcyA/IFt0aGlzLnRleHRHcm91cElkXSA6IHZvaWQgMDtcbiAgfVxuICBnZXQgYXVkaW9Hcm91cElkKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAoZSA9IHRoaXMuYXVkaW9Hcm91cHMpID09IG51bGwgPyB2b2lkIDAgOiBlWzBdO1xuICB9XG4gIGdldCB0ZXh0R3JvdXBJZCgpIHtcbiAgICB2YXIgZTtcbiAgICByZXR1cm4gKGUgPSB0aGlzLnN1YnRpdGxlR3JvdXBzKSA9PSBudWxsID8gdm9pZCAwIDogZVswXTtcbiAgfVxuICBhZGRGYWxsYmFjaygpIHtcbiAgfVxufVxuZnVuY3Rpb24gbGgocywgZSkge1xuICByZXR1cm4gIWUgfHwgIXMgPyAhMSA6IHMuaW5kZXhPZihlKSAhPT0gLTE7XG59XG5mdW5jdGlvbiBjYigpIHtcbiAgaWYgKHR5cGVvZiBtYXRjaE1lZGlhID09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IHMgPSBtYXRjaE1lZGlhKFwiKGR5bmFtaWMtcmFuZ2U6IGhpZ2gpXCIpLCBlID0gbWF0Y2hNZWRpYShcImJhZCBxdWVyeVwiKTtcbiAgICBpZiAocy5tZWRpYSAhPT0gZS5tZWRpYSlcbiAgICAgIHJldHVybiBzLm1hdGNoZXMgPT09ICEwO1xuICB9XG4gIHJldHVybiAhMTtcbn1cbmZ1bmN0aW9uIHViKHMsIGUpIHtcbiAgbGV0IHQgPSAhMSwgciA9IFtdO1xuICBpZiAocyAmJiAodCA9IHMgIT09IFwiU0RSXCIsIHIgPSBbc10pLCBlKSB7XG4gICAgciA9IGUuYWxsb3dlZFZpZGVvUmFuZ2VzIHx8IEpvLnNsaWNlKDApO1xuICAgIGNvbnN0IG4gPSByLmpvaW4oXCJcIikgIT09IFwiU0RSXCIgJiYgIWUudmlkZW9Db2RlYztcbiAgICB0ID0gZS5wcmVmZXJIRFIgIT09IHZvaWQgMCA/IGUucHJlZmVySERSIDogbiAmJiBjYigpLCB0IHx8IChyID0gW1wiU0RSXCJdKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHByZWZlckhEUjogdCxcbiAgICBhbGxvd2VkVmlkZW9SYW5nZXM6IHJcbiAgfTtcbn1cbmNvbnN0IGRiID0gKHMpID0+IHtcbiAgY29uc3QgZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha1NldCgpO1xuICByZXR1cm4gKHQsIHIpID0+IHtcbiAgICBpZiAocyAmJiAociA9IHModCwgcikpLCB0eXBlb2YgciA9PSBcIm9iamVjdFwiICYmIHIgIT09IG51bGwpIHtcbiAgICAgIGlmIChlLmhhcyhyKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZS5hZGQocik7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9O1xufSwgYXQgPSAocywgZSkgPT4gSlNPTi5zdHJpbmdpZnkocywgZGIoZSkpO1xuZnVuY3Rpb24gaGIocywgZSwgdCwgciwgbikge1xuICBjb25zdCBpID0gT2JqZWN0LmtleXMocyksIG8gPSByID09IG51bGwgPyB2b2lkIDAgOiByLmNoYW5uZWxzLCBhID0gciA9PSBudWxsID8gdm9pZCAwIDogci5hdWRpb0NvZGVjLCBsID0gbiA9PSBudWxsID8gdm9pZCAwIDogbi52aWRlb0NvZGVjLCBjID0gbyAmJiBwYXJzZUludChvKSA9PT0gMjtcbiAgbGV0IHUgPSAhMSwgZCA9ICExLCBoID0gMSAvIDAsIGYgPSAxIC8gMCwgcCA9IDEgLyAwLCB5ID0gMSAvIDAsIEUgPSAwLCBiID0gW107XG4gIGNvbnN0IHtcbiAgICBwcmVmZXJIRFI6IFIsXG4gICAgYWxsb3dlZFZpZGVvUmFuZ2VzOiBBXG4gIH0gPSB1YihlLCBuKTtcbiAgZm9yIChsZXQgaiA9IGkubGVuZ3RoOyBqLS07ICkge1xuICAgIGNvbnN0IEMgPSBzW2lbal1dO1xuICAgIHUgfHwgKHUgPSBDLmNoYW5uZWxzWzJdID4gMCksIGggPSBNYXRoLm1pbihoLCBDLm1pbkhlaWdodCksIGYgPSBNYXRoLm1pbihmLCBDLm1pbkZyYW1lcmF0ZSksIHAgPSBNYXRoLm1pbihwLCBDLm1pbkJpdHJhdGUpLCBBLmZpbHRlcigoJCkgPT4gQy52aWRlb1Jhbmdlc1skXSA+IDApLmxlbmd0aCA+IDAgJiYgKGQgPSAhMCk7XG4gIH1cbiAgaCA9IHVlKGgpID8gaCA6IDAsIGYgPSB1ZShmKSA/IGYgOiAwO1xuICBjb25zdCBGID0gTWF0aC5tYXgoMTA4MCwgaCksIE0gPSBNYXRoLm1heCgzMCwgZik7XG4gIHAgPSB1ZShwKSA/IHAgOiB0LCB0ID0gTWF0aC5tYXgocCwgdCksIGQgfHwgKGUgPSB2b2lkIDApO1xuICBjb25zdCBIID0gaS5sZW5ndGggPiAxO1xuICByZXR1cm4ge1xuICAgIGNvZGVjU2V0OiBpLnJlZHVjZSgoaiwgQykgPT4ge1xuICAgICAgY29uc3QgayA9IHNbQ107XG4gICAgICBpZiAoQyA9PT0gailcbiAgICAgICAgcmV0dXJuIGo7XG4gICAgICBpZiAoYiA9IGQgPyBBLmZpbHRlcigoJCkgPT4gay52aWRlb1Jhbmdlc1skXSA+IDApIDogW10sIEgpIHtcbiAgICAgICAgaWYgKGsubWluQml0cmF0ZSA+IHQpXG4gICAgICAgICAgcmV0dXJuIFVyKEMsIGBtaW4gYml0cmF0ZSBvZiAke2subWluQml0cmF0ZX0gPiBjdXJyZW50IGVzdGltYXRlIG9mICR7dH1gKSwgajtcbiAgICAgICAgaWYgKCFrLmhhc0RlZmF1bHRBdWRpbylcbiAgICAgICAgICByZXR1cm4gVXIoQywgXCJubyByZW5kaXRpb25zIHdpdGggZGVmYXVsdCBvciBhdXRvLXNlbGVjdCBzb3VuZCBmb3VuZFwiKSwgajtcbiAgICAgICAgaWYgKGEgJiYgQy5pbmRleE9mKGEuc3Vic3RyaW5nKDAsIDQpKSAlIDUgIT09IDApXG4gICAgICAgICAgcmV0dXJuIFVyKEMsIGBhdWRpbyBjb2RlYyBwcmVmZXJlbmNlIFwiJHthfVwiIG5vdCBmb3VuZGApLCBqO1xuICAgICAgICBpZiAobyAmJiAhYykge1xuICAgICAgICAgIGlmICghay5jaGFubmVsc1tvXSlcbiAgICAgICAgICAgIHJldHVybiBVcihDLCBgbm8gcmVuZGl0aW9ucyB3aXRoICR7b30gY2hhbm5lbCBzb3VuZCBmb3VuZCAoY2hhbm5lbHMgb3B0aW9uczogJHtPYmplY3Qua2V5cyhrLmNoYW5uZWxzKX0pYCksIGo7XG4gICAgICAgIH0gZWxzZSBpZiAoKCFhIHx8IGMpICYmIHUgJiYgay5jaGFubmVsc1syXSA9PT0gMClcbiAgICAgICAgICByZXR1cm4gVXIoQywgXCJubyByZW5kaXRpb25zIHdpdGggc3RlcmVvIHNvdW5kIGZvdW5kXCIpLCBqO1xuICAgICAgICBpZiAoay5taW5IZWlnaHQgPiBGKVxuICAgICAgICAgIHJldHVybiBVcihDLCBgbWluIHJlc29sdXRpb24gb2YgJHtrLm1pbkhlaWdodH0gPiBtYXhpbXVtIG9mICR7Rn1gKSwgajtcbiAgICAgICAgaWYgKGsubWluRnJhbWVyYXRlID4gTSlcbiAgICAgICAgICByZXR1cm4gVXIoQywgYG1pbiBmcmFtZXJhdGUgb2YgJHtrLm1pbkZyYW1lcmF0ZX0gPiBtYXhpbXVtIG9mICR7TX1gKSwgajtcbiAgICAgICAgaWYgKCFiLnNvbWUoKCQpID0+IGsudmlkZW9SYW5nZXNbJF0gPiAwKSlcbiAgICAgICAgICByZXR1cm4gVXIoQywgYG5vIHZhcmlhbnRzIHdpdGggVklERU8tUkFOR0Ugb2YgJHthdChiKX0gZm91bmRgKSwgajtcbiAgICAgICAgaWYgKGwgJiYgQy5pbmRleE9mKGwuc3Vic3RyaW5nKDAsIDQpKSAlIDUgIT09IDApXG4gICAgICAgICAgcmV0dXJuIFVyKEMsIGB2aWRlbyBjb2RlYyBwcmVmZXJlbmNlIFwiJHtsfVwiIG5vdCBmb3VuZGApLCBqO1xuICAgICAgICBpZiAoay5tYXhTY29yZSA8IEUpXG4gICAgICAgICAgcmV0dXJuIFVyKEMsIGBtYXggc2NvcmUgb2YgJHtrLm1heFNjb3JlfSA8IHNlbGVjdGVkIG1heCBvZiAke0V9YCksIGo7XG4gICAgICB9XG4gICAgICByZXR1cm4gaiAmJiAoWm8oQykgPj0gWm8oaikgfHwgay5mcmFnbWVudEVycm9yID4gc1tqXS5mcmFnbWVudEVycm9yKSA/IGogOiAoeSA9IGsubWluSW5kZXgsIEUgPSBrLm1heFNjb3JlLCBDKTtcbiAgICB9LCB2b2lkIDApLFxuICAgIHZpZGVvUmFuZ2VzOiBiLFxuICAgIHByZWZlckhEUjogUixcbiAgICBtaW5GcmFtZXJhdGU6IGYsXG4gICAgbWluQml0cmF0ZTogcCxcbiAgICBtaW5JbmRleDogeVxuICB9O1xufVxuZnVuY3Rpb24gVXIocywgZSkge1xuICBydC5sb2coYFthYnJdIHN0YXJ0IGNhbmRpZGF0ZXMgd2l0aCBcIiR7c31cIiBpZ25vcmVkIGJlY2F1c2UgJHtlfWApO1xufVxuZnVuY3Rpb24gJGcocykge1xuICByZXR1cm4gcy5yZWR1Y2UoKGUsIHQpID0+IHtcbiAgICBsZXQgciA9IGUuZ3JvdXBzW3QuZ3JvdXBJZF07XG4gICAgciB8fCAociA9IGUuZ3JvdXBzW3QuZ3JvdXBJZF0gPSB7XG4gICAgICB0cmFja3M6IFtdLFxuICAgICAgY2hhbm5lbHM6IHtcbiAgICAgICAgMjogMFxuICAgICAgfSxcbiAgICAgIGhhc0RlZmF1bHQ6ICExLFxuICAgICAgaGFzQXV0b1NlbGVjdDogITFcbiAgICB9KSwgci50cmFja3MucHVzaCh0KTtcbiAgICBjb25zdCBuID0gdC5jaGFubmVscyB8fCBcIjJcIjtcbiAgICByZXR1cm4gci5jaGFubmVsc1tuXSA9IChyLmNoYW5uZWxzW25dIHx8IDApICsgMSwgci5oYXNEZWZhdWx0ID0gci5oYXNEZWZhdWx0IHx8IHQuZGVmYXVsdCwgci5oYXNBdXRvU2VsZWN0ID0gci5oYXNBdXRvU2VsZWN0IHx8IHQuYXV0b3NlbGVjdCwgci5oYXNEZWZhdWx0ICYmIChlLmhhc0RlZmF1bHRBdWRpbyA9ICEwKSwgci5oYXNBdXRvU2VsZWN0ICYmIChlLmhhc0F1dG9TZWxlY3RBdWRpbyA9ICEwKSwgZTtcbiAgfSwge1xuICAgIGhhc0RlZmF1bHRBdWRpbzogITEsXG4gICAgaGFzQXV0b1NlbGVjdEF1ZGlvOiAhMSxcbiAgICBncm91cHM6IHt9XG4gIH0pO1xufVxuZnVuY3Rpb24gZmIocywgZSwgdCwgcikge1xuICByZXR1cm4gcy5zbGljZSh0LCByICsgMSkucmVkdWNlKChuLCBpLCBvKSA9PiB7XG4gICAgaWYgKCFpLmNvZGVjU2V0KVxuICAgICAgcmV0dXJuIG47XG4gICAgY29uc3QgYSA9IGkuYXVkaW9Hcm91cHM7XG4gICAgbGV0IGwgPSBuW2kuY29kZWNTZXRdO1xuICAgIGwgfHwgKG5baS5jb2RlY1NldF0gPSBsID0ge1xuICAgICAgbWluQml0cmF0ZTogMSAvIDAsXG4gICAgICBtaW5IZWlnaHQ6IDEgLyAwLFxuICAgICAgbWluRnJhbWVyYXRlOiAxIC8gMCxcbiAgICAgIG1pbkluZGV4OiBvLFxuICAgICAgbWF4U2NvcmU6IDAsXG4gICAgICB2aWRlb1Jhbmdlczoge1xuICAgICAgICBTRFI6IDBcbiAgICAgIH0sXG4gICAgICBjaGFubmVsczoge1xuICAgICAgICAyOiAwXG4gICAgICB9LFxuICAgICAgaGFzRGVmYXVsdEF1ZGlvOiAhYSxcbiAgICAgIGZyYWdtZW50RXJyb3I6IDBcbiAgICB9KSwgbC5taW5CaXRyYXRlID0gTWF0aC5taW4obC5taW5CaXRyYXRlLCBpLmJpdHJhdGUpO1xuICAgIGNvbnN0IGMgPSBNYXRoLm1pbihpLmhlaWdodCwgaS53aWR0aCk7XG4gICAgcmV0dXJuIGwubWluSGVpZ2h0ID0gTWF0aC5taW4obC5taW5IZWlnaHQsIGMpLCBsLm1pbkZyYW1lcmF0ZSA9IE1hdGgubWluKGwubWluRnJhbWVyYXRlLCBpLmZyYW1lUmF0ZSksIGwubWluSW5kZXggPSBNYXRoLm1pbihsLm1pbkluZGV4LCBvKSwgbC5tYXhTY29yZSA9IE1hdGgubWF4KGwubWF4U2NvcmUsIGkuc2NvcmUpLCBsLmZyYWdtZW50RXJyb3IgKz0gaS5mcmFnbWVudEVycm9yLCBsLnZpZGVvUmFuZ2VzW2kudmlkZW9SYW5nZV0gPSAobC52aWRlb1Jhbmdlc1tpLnZpZGVvUmFuZ2VdIHx8IDApICsgMSwgYSAmJiBhLmZvckVhY2goKHUpID0+IHtcbiAgICAgIGlmICghdSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgZCA9IGUuZ3JvdXBzW3VdO1xuICAgICAgZCAmJiAobC5oYXNEZWZhdWx0QXVkaW8gPSBsLmhhc0RlZmF1bHRBdWRpbyB8fCBlLmhhc0RlZmF1bHRBdWRpbyA/IGQuaGFzRGVmYXVsdCA6IGQuaGFzQXV0b1NlbGVjdCB8fCAhZS5oYXNEZWZhdWx0QXVkaW8gJiYgIWUuaGFzQXV0b1NlbGVjdEF1ZGlvLCBPYmplY3Qua2V5cyhkLmNoYW5uZWxzKS5mb3JFYWNoKChoKSA9PiB7XG4gICAgICAgIGwuY2hhbm5lbHNbaF0gPSAobC5jaGFubmVsc1toXSB8fCAwKSArIGQuY2hhbm5lbHNbaF07XG4gICAgICB9KSk7XG4gICAgfSksIG47XG4gIH0sIHt9KTtcbn1cbmZ1bmN0aW9uIGNoKHMpIHtcbiAgaWYgKCFzKVxuICAgIHJldHVybiBzO1xuICBjb25zdCB7XG4gICAgbGFuZzogZSxcbiAgICBhc3NvY0xhbmc6IHQsXG4gICAgY2hhcmFjdGVyaXN0aWNzOiByLFxuICAgIGNoYW5uZWxzOiBuLFxuICAgIGF1ZGlvQ29kZWM6IGlcbiAgfSA9IHM7XG4gIHJldHVybiB7XG4gICAgbGFuZzogZSxcbiAgICBhc3NvY0xhbmc6IHQsXG4gICAgY2hhcmFjdGVyaXN0aWNzOiByLFxuICAgIGNoYW5uZWxzOiBuLFxuICAgIGF1ZGlvQ29kZWM6IGlcbiAgfTtcbn1cbmZ1bmN0aW9uIFdyKHMsIGUsIHQpIHtcbiAgaWYgKFwiYXR0cnNcIiBpbiBzKSB7XG4gICAgY29uc3QgciA9IGUuaW5kZXhPZihzKTtcbiAgICBpZiAociAhPT0gLTEpXG4gICAgICByZXR1cm4gcjtcbiAgfVxuICBmb3IgKGxldCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspIHtcbiAgICBjb25zdCBuID0gZVtyXTtcbiAgICBpZiAocXMocywgbiwgdCkpXG4gICAgICByZXR1cm4gcjtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBxcyhzLCBlLCB0KSB7XG4gIGNvbnN0IHtcbiAgICBncm91cElkOiByLFxuICAgIG5hbWU6IG4sXG4gICAgbGFuZzogaSxcbiAgICBhc3NvY0xhbmc6IG8sXG4gICAgZGVmYXVsdDogYVxuICB9ID0gcywgbCA9IHMuZm9yY2VkO1xuICByZXR1cm4gKHIgPT09IHZvaWQgMCB8fCBlLmdyb3VwSWQgPT09IHIpICYmIChuID09PSB2b2lkIDAgfHwgZS5uYW1lID09PSBuKSAmJiAoaSA9PT0gdm9pZCAwIHx8IGdiKGksIGUubGFuZykpICYmIChpID09PSB2b2lkIDAgfHwgZS5hc3NvY0xhbmcgPT09IG8pICYmIChhID09PSB2b2lkIDAgfHwgZS5kZWZhdWx0ID09PSBhKSAmJiAobCA9PT0gdm9pZCAwIHx8IGUuZm9yY2VkID09PSBsKSAmJiAoIShcImNoYXJhY3RlcmlzdGljc1wiIGluIHMpIHx8IHBiKHMuY2hhcmFjdGVyaXN0aWNzIHx8IFwiXCIsIGUuY2hhcmFjdGVyaXN0aWNzKSkgJiYgKHQgPT09IHZvaWQgMCB8fCB0KHMsIGUpKTtcbn1cbmZ1bmN0aW9uIGdiKHMsIGUgPSBcIi0tXCIpIHtcbiAgcmV0dXJuIHMubGVuZ3RoID09PSBlLmxlbmd0aCA/IHMgPT09IGUgOiBzLnN0YXJ0c1dpdGgoZSkgfHwgZS5zdGFydHNXaXRoKHMpO1xufVxuZnVuY3Rpb24gcGIocywgZSA9IFwiXCIpIHtcbiAgY29uc3QgdCA9IHMuc3BsaXQoXCIsXCIpLCByID0gZS5zcGxpdChcIixcIik7XG4gIHJldHVybiB0Lmxlbmd0aCA9PT0gci5sZW5ndGggJiYgIXQuc29tZSgobikgPT4gci5pbmRleE9mKG4pID09PSAtMSk7XG59XG5mdW5jdGlvbiBVcyhzLCBlKSB7XG4gIGNvbnN0IHtcbiAgICBhdWRpb0NvZGVjOiB0LFxuICAgIGNoYW5uZWxzOiByXG4gIH0gPSBzO1xuICByZXR1cm4gKHQgPT09IHZvaWQgMCB8fCAoZS5hdWRpb0NvZGVjIHx8IFwiXCIpLnN1YnN0cmluZygwLCA0KSA9PT0gdC5zdWJzdHJpbmcoMCwgNCkpICYmIChyID09PSB2b2lkIDAgfHwgciA9PT0gKGUuY2hhbm5lbHMgfHwgXCIyXCIpKTtcbn1cbmZ1bmN0aW9uIG1iKHMsIGUsIHQsIHIsIG4pIHtcbiAgY29uc3QgaSA9IGVbcl0sIGEgPSBlLnJlZHVjZSgoaCwgZiwgcCkgPT4ge1xuICAgIGNvbnN0IHkgPSBmLnVyaTtcbiAgICByZXR1cm4gKGhbeV0gfHwgKGhbeV0gPSBbXSkpLnB1c2gocCksIGg7XG4gIH0sIHt9KVtpLnVyaV07XG4gIGEubGVuZ3RoID4gMSAmJiAociA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIGEpKTtcbiAgY29uc3QgbCA9IGkudmlkZW9SYW5nZSwgYyA9IGkuZnJhbWVSYXRlLCB1ID0gaS5jb2RlY1NldC5zdWJzdHJpbmcoMCwgNCksIGQgPSB1aChlLCByLCAoaCkgPT4ge1xuICAgIGlmIChoLnZpZGVvUmFuZ2UgIT09IGwgfHwgaC5mcmFtZVJhdGUgIT09IGMgfHwgaC5jb2RlY1NldC5zdWJzdHJpbmcoMCwgNCkgIT09IHUpXG4gICAgICByZXR1cm4gITE7XG4gICAgY29uc3QgZiA9IGguYXVkaW9Hcm91cHMsIHAgPSB0LmZpbHRlcigoeSkgPT4gIWYgfHwgZi5pbmRleE9mKHkuZ3JvdXBJZCkgIT09IC0xKTtcbiAgICByZXR1cm4gV3IocywgcCwgbikgPiAtMTtcbiAgfSk7XG4gIHJldHVybiBkID4gLTEgPyBkIDogdWgoZSwgciwgKGgpID0+IHtcbiAgICBjb25zdCBmID0gaC5hdWRpb0dyb3VwcywgcCA9IHQuZmlsdGVyKCh5KSA9PiAhZiB8fCBmLmluZGV4T2YoeS5ncm91cElkKSAhPT0gLTEpO1xuICAgIHJldHVybiBXcihzLCBwLCBuKSA+IC0xO1xuICB9KTtcbn1cbmZ1bmN0aW9uIHVoKHMsIGUsIHQpIHtcbiAgZm9yIChsZXQgciA9IGU7IHIgPiAtMTsgci0tKVxuICAgIGlmICh0KHNbcl0pKVxuICAgICAgcmV0dXJuIHI7XG4gIGZvciAobGV0IHIgPSBlICsgMTsgciA8IHMubGVuZ3RoOyByKyspXG4gICAgaWYgKHQoc1tyXSkpXG4gICAgICByZXR1cm4gcjtcbiAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gUW8ocywgZSkge1xuICB2YXIgdDtcbiAgcmV0dXJuICEhcyAmJiBzICE9PSAoKHQgPSBlLmxvYWRMZXZlbE9iaikgPT0gbnVsbCA/IHZvaWQgMCA6IHQudXJpKTtcbn1cbmNsYXNzIHliIGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoXCJhYnJcIiwgZS5sb2dnZXIpLCB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5sYXN0TGV2ZWxMb2FkU2VjID0gMCwgdGhpcy5sYXN0TG9hZGVkRnJhZ0xldmVsID0gLTEsIHRoaXMuZmlyc3RTZWxlY3Rpb24gPSAtMSwgdGhpcy5fbmV4dEF1dG9MZXZlbCA9IC0xLCB0aGlzLm5leHRBdXRvTGV2ZWxLZXkgPSBcIlwiLCB0aGlzLmF1ZGlvVHJhY2tzQnlHcm91cCA9IG51bGwsIHRoaXMuY29kZWNUaWVycyA9IG51bGwsIHRoaXMudGltZXIgPSAtMSwgdGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMucGFydEN1cnJlbnQgPSBudWxsLCB0aGlzLmJpdHJhdGVUZXN0RGVsYXkgPSAwLCB0aGlzLnJlYnVmZmVyTm90aWNlID0gLTEsIHRoaXMuc3VwcG9ydGVkQ2FjaGUgPSB7fSwgdGhpcy5id0VzdGltYXRvciA9IHZvaWQgMCwgdGhpcy5fYWJhbmRvblJ1bGVzQ2hlY2sgPSAodCkgPT4ge1xuICAgICAgdmFyIHI7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGZyYWdDdXJyZW50OiBuLFxuICAgICAgICBwYXJ0Q3VycmVudDogaSxcbiAgICAgICAgaGxzOiBvXG4gICAgICB9ID0gdGhpcywge1xuICAgICAgICBhdXRvTGV2ZWxFbmFibGVkOiBhLFxuICAgICAgICBtZWRpYTogbFxuICAgICAgfSA9IG87XG4gICAgICBpZiAoIW4gfHwgIWwpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGMgPSBwZXJmb3JtYW5jZS5ub3coKSwgdSA9IGkgPyBpLnN0YXRzIDogbi5zdGF0cywgZCA9IGkgPyBpLmR1cmF0aW9uIDogbi5kdXJhdGlvbiwgaCA9IGMgLSB1LmxvYWRpbmcuc3RhcnQsIGYgPSBvLm1pbkF1dG9MZXZlbCwgcCA9IG4ubGV2ZWwsIHkgPSB0aGlzLl9uZXh0QXV0b0xldmVsO1xuICAgICAgaWYgKHUuYWJvcnRlZCB8fCB1LmxvYWRlZCAmJiB1LmxvYWRlZCA9PT0gdS50b3RhbCB8fCBwIDw9IGYpIHtcbiAgICAgICAgdGhpcy5jbGVhclRpbWVyKCksIHRoaXMuX25leHRBdXRvTGV2ZWwgPSAtMTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFhKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBFID0geSA+IC0xICYmIHkgIT09IHAsIGIgPSAhIXQgfHwgRTtcbiAgICAgIGlmICghYiAmJiAobC5wYXVzZWQgfHwgIWwucGxheWJhY2tSYXRlIHx8ICFsLnJlYWR5U3RhdGUpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBSID0gby5tYWluRm9yd2FyZEJ1ZmZlckluZm87XG4gICAgICBpZiAoIWIgJiYgUiA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgQSA9IHRoaXMuYndFc3RpbWF0b3IuZ2V0RXN0aW1hdGVUVEZCKCksIEYgPSBNYXRoLmFicyhsLnBsYXliYWNrUmF0ZSk7XG4gICAgICBpZiAoaCA8PSBNYXRoLm1heChBLCAxZTMgKiAoZCAvIChGICogMikpKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgTSA9IFIgPyBSLmxlbiAvIEYgOiAwLCBIID0gdS5sb2FkaW5nLmZpcnN0ID8gdS5sb2FkaW5nLmZpcnN0IC0gdS5sb2FkaW5nLnN0YXJ0IDogLTEsIEsgPSB1LmxvYWRlZCAmJiBIID4gLTEsIGogPSB0aGlzLmdldEJ3RXN0aW1hdGUoKSwgQyA9IG8ubGV2ZWxzLCBrID0gQ1twXSwgJCA9IE1hdGgubWF4KHUubG9hZGVkLCBNYXRoLnJvdW5kKGQgKiAobi5iaXRyYXRlIHx8IGsuYXZlcmFnZUJpdHJhdGUpIC8gOCkpO1xuICAgICAgbGV0IFcgPSBLID8gaCAtIEggOiBoO1xuICAgICAgVyA8IDEgJiYgSyAmJiAoVyA9IE1hdGgubWluKGgsIHUubG9hZGVkICogOCAvIGopKTtcbiAgICAgIGNvbnN0IF8gPSBLID8gdS5sb2FkZWQgKiAxZTMgLyBXIDogMCwgZyA9IEEgLyAxZTMsIHggPSBfID8gKCQgLSB1LmxvYWRlZCkgLyBfIDogJCAqIDggLyBqICsgZztcbiAgICAgIGlmICh4IDw9IE0pXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHcgPSBfID8gXyAqIDggOiBqLCBEID0gKChyID0gKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZGV0YWlscykgfHwgdGhpcy5obHMubGF0ZXN0TGV2ZWxEZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogci5saXZlKSA9PT0gITAsIE8gPSB0aGlzLmhscy5jb25maWcuYWJyQmFuZFdpZHRoVXBGYWN0b3I7XG4gICAgICBsZXQgVSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgVjtcbiAgICAgIGZvciAoViA9IHAgLSAxOyBWID4gZjsgVi0tKSB7XG4gICAgICAgIGNvbnN0IFAgPSBDW1ZdLm1heEJpdHJhdGUsIE4gPSAhQ1tWXS5kZXRhaWxzIHx8IEQ7XG4gICAgICAgIGlmIChVID0gdGhpcy5nZXRUaW1lVG9Mb2FkRnJhZyhnLCB3LCBkICogUCwgTiksIFUgPCBNYXRoLm1pbihNLCBkICsgZykpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoVSA+PSB4IHx8IFUgPiBkICogMTApXG4gICAgICAgIHJldHVybjtcbiAgICAgIEsgPyB0aGlzLmJ3RXN0aW1hdG9yLnNhbXBsZShoIC0gTWF0aC5taW4oQSwgSCksIHUubG9hZGVkKSA6IHRoaXMuYndFc3RpbWF0b3Iuc2FtcGxlVFRGQihoKTtcbiAgICAgIGNvbnN0IEwgPSBDW1ZdLm1heEJpdHJhdGU7XG4gICAgICB0aGlzLmdldEJ3RXN0aW1hdGUoKSAqIE8gPiBMICYmIHRoaXMucmVzZXRFc3RpbWF0b3IoTCk7XG4gICAgICBjb25zdCBtID0gdGhpcy5maW5kQmVzdExldmVsKEwsIGYsIFYsIDAsIE0sIDEsIDEpO1xuICAgICAgbSA+IC0xICYmIChWID0gbSksIHRoaXMud2FybihgRnJhZ21lbnQgJHtuLnNufSR7aSA/IFwiIHBhcnQgXCIgKyBpLmluZGV4IDogXCJcIn0gb2YgbGV2ZWwgJHtwfSBpcyBsb2FkaW5nIHRvbyBzbG93bHk7XG4gICAgICBGcmFnbWVudCBkdXJhdGlvbjogJHtuLmR1cmF0aW9uLnRvRml4ZWQoMyl9XG4gICAgICBUaW1lIHRvIHVuZGVyYnVmZmVyOiAke00udG9GaXhlZCgzKX0gc1xuICAgICAgRXN0aW1hdGVkIGxvYWQgdGltZSBmb3IgY3VycmVudCBmcmFnbWVudDogJHt4LnRvRml4ZWQoMyl9IHNcbiAgICAgIEVzdGltYXRlZCBsb2FkIHRpbWUgZm9yIGRvd24gc3dpdGNoIGZyYWdtZW50OiAke1UudG9GaXhlZCgzKX0gc1xuICAgICAgVFRGQiBlc3RpbWF0ZTogJHtIIHwgMH0gbXNcbiAgICAgIEN1cnJlbnQgQlcgZXN0aW1hdGU6ICR7dWUoaikgPyBqIHwgMCA6IFwiVW5rbm93blwifSBicHNcbiAgICAgIE5ldyBCVyBlc3RpbWF0ZTogJHt0aGlzLmdldEJ3RXN0aW1hdGUoKSB8IDB9IGJwc1xuICAgICAgU3dpdGNoaW5nIHRvIGxldmVsICR7Vn0gQCAke0wgfCAwfSBicHNgKSwgby5uZXh0TG9hZExldmVsID0gby5uZXh0QXV0b0xldmVsID0gViwgdGhpcy5jbGVhclRpbWVyKCk7XG4gICAgICBjb25zdCB2ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jbGVhclRpbWVyKCksIHRoaXMuZnJhZ0N1cnJlbnQgPT09IG4gJiYgdGhpcy5obHMubG9hZExldmVsID09PSBWICYmIFYgPiAwKSB7XG4gICAgICAgICAgY29uc3QgUCA9IHRoaXMuZ2V0U3RhcnZhdGlvbkRlbGF5KCk7XG4gICAgICAgICAgaWYgKHRoaXMud2FybihgQWJvcnRpbmcgaW5mbGlnaHQgcmVxdWVzdCAke1YgPiAwID8gXCJhbmQgc3dpdGNoaW5nIGRvd25cIiA6IFwiXCJ9XG4gICAgICBGcmFnbWVudCBkdXJhdGlvbjogJHtuLmR1cmF0aW9uLnRvRml4ZWQoMyl9IHNcbiAgICAgIFRpbWUgdG8gdW5kZXJidWZmZXI6ICR7UC50b0ZpeGVkKDMpfSBzYCksIG4uYWJvcnRSZXF1ZXN0cygpLCB0aGlzLmZyYWdDdXJyZW50ID0gdGhpcy5wYXJ0Q3VycmVudCA9IG51bGwsIFYgPiBmKSB7XG4gICAgICAgICAgICBsZXQgTiA9IHRoaXMuZmluZEJlc3RMZXZlbCh0aGlzLmhscy5sZXZlbHNbZl0uYml0cmF0ZSwgZiwgViwgMCwgUCwgMSwgMSk7XG4gICAgICAgICAgICBOID09PSAtMSAmJiAoTiA9IGYpLCB0aGlzLmhscy5uZXh0TG9hZExldmVsID0gdGhpcy5obHMubmV4dEF1dG9MZXZlbCA9IE4sIHRoaXMucmVzZXRFc3RpbWF0b3IodGhpcy5obHMubGV2ZWxzW05dLmJpdHJhdGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIEUgfHwgeCA+IFUgKiAyID8gdigpIDogdGhpcy50aW1lciA9IHNlbGYuc2V0SW50ZXJ2YWwodiwgVSAqIDFlMyksIG8udHJpZ2dlcihJLkZSQUdfTE9BRF9FTUVSR0VOQ1lfQUJPUlRFRCwge1xuICAgICAgICBmcmFnOiBuLFxuICAgICAgICBwYXJ0OiBpLFxuICAgICAgICBzdGF0czogdVxuICAgICAgfSk7XG4gICAgfSwgdGhpcy5obHMgPSBlLCB0aGlzLmJ3RXN0aW1hdG9yID0gdGhpcy5pbml0RXN0aW1hdG9yKCksIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICByZXNldEVzdGltYXRvcihlKSB7XG4gICAgZSAmJiAodGhpcy5sb2coYHNldHRpbmcgaW5pdGlhbCBid2UgdG8gJHtlfWApLCB0aGlzLmhscy5jb25maWcuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZSA9IGUpLCB0aGlzLmZpcnN0U2VsZWN0aW9uID0gLTEsIHRoaXMuYndFc3RpbWF0b3IgPSB0aGlzLmluaXRFc3RpbWF0b3IoKTtcbiAgfVxuICBpbml0RXN0aW1hdG9yKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmhscy5jb25maWc7XG4gICAgcmV0dXJuIG5ldyBUUyhlLmFickV3bWFTbG93Vm9ELCBlLmFickV3bWFGYXN0Vm9ELCBlLmFickV3bWFEZWZhdWx0RXN0aW1hdGUpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLkZSQUdfTE9BRElORywgdGhpcy5vbkZyYWdMb2FkaW5nLCB0aGlzKSwgZS5vbihJLkZSQUdfTE9BREVELCB0aGlzLm9uRnJhZ0xvYWRlZCwgdGhpcyksIGUub24oSS5GUkFHX0JVRkZFUkVELCB0aGlzLm9uRnJhZ0J1ZmZlcmVkLCB0aGlzKSwgZS5vbihJLkxFVkVMX1NXSVRDSElORywgdGhpcy5vbkxldmVsU3dpdGNoaW5nLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURFRCwgdGhpcy5vbkxldmVsTG9hZGVkLCB0aGlzKSwgZS5vbihJLkxFVkVMU19VUERBVEVELCB0aGlzLm9uTGV2ZWxzVXBkYXRlZCwgdGhpcyksIGUub24oSS5NQVhfQVVUT19MRVZFTF9VUERBVEVELCB0aGlzLm9uTWF4QXV0b0xldmVsVXBkYXRlZCwgdGhpcyksIGUub24oSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUgJiYgKGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuRlJBR19MT0FESU5HLCB0aGlzLm9uRnJhZ0xvYWRpbmcsIHRoaXMpLCBlLm9mZihJLkZSQUdfTE9BREVELCB0aGlzLm9uRnJhZ0xvYWRlZCwgdGhpcyksIGUub2ZmKEkuRlJBR19CVUZGRVJFRCwgdGhpcy5vbkZyYWdCdWZmZXJlZCwgdGhpcyksIGUub2ZmKEkuTEVWRUxfU1dJVENISU5HLCB0aGlzLm9uTGV2ZWxTd2l0Y2hpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX0xPQURFRCwgdGhpcy5vbkxldmVsTG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5MRVZFTFNfVVBEQVRFRCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLk1BWF9BVVRPX0xFVkVMX1VQREFURUQsIHRoaXMub25NYXhBdXRvTGV2ZWxVcGRhdGVkLCB0aGlzKSwgZS5vZmYoSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKSk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5jbGVhclRpbWVyKCksIHRoaXMuaGxzID0gdGhpcy5fYWJhbmRvblJ1bGVzQ2hlY2sgPSB0aGlzLnN1cHBvcnRlZENhY2hlID0gbnVsbCwgdGhpcy5mcmFnQ3VycmVudCA9IHRoaXMucGFydEN1cnJlbnQgPSBudWxsO1xuICB9XG4gIG9uTWFuaWZlc3RMb2FkaW5nKGUsIHQpIHtcbiAgICB0aGlzLmxhc3RMb2FkZWRGcmFnTGV2ZWwgPSAtMSwgdGhpcy5maXJzdFNlbGVjdGlvbiA9IC0xLCB0aGlzLmxhc3RMZXZlbExvYWRTZWMgPSAwLCB0aGlzLnN1cHBvcnRlZENhY2hlID0ge30sIHRoaXMuZnJhZ0N1cnJlbnQgPSB0aGlzLnBhcnRDdXJyZW50ID0gbnVsbCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQoKSwgdGhpcy5jbGVhclRpbWVyKCk7XG4gIH1cbiAgb25MZXZlbHNVcGRhdGVkKCkge1xuICAgIHRoaXMubGFzdExvYWRlZEZyYWdMZXZlbCA+IC0xICYmIHRoaXMuZnJhZ0N1cnJlbnQgJiYgKHRoaXMubGFzdExvYWRlZEZyYWdMZXZlbCA9IHRoaXMuZnJhZ0N1cnJlbnQubGV2ZWwpLCB0aGlzLl9uZXh0QXV0b0xldmVsID0gLTEsIHRoaXMub25NYXhBdXRvTGV2ZWxVcGRhdGVkKCksIHRoaXMuY29kZWNUaWVycyA9IG51bGwsIHRoaXMuYXVkaW9UcmFja3NCeUdyb3VwID0gbnVsbDtcbiAgfVxuICBvbk1heEF1dG9MZXZlbFVwZGF0ZWQoKSB7XG4gICAgdGhpcy5maXJzdFNlbGVjdGlvbiA9IC0xLCB0aGlzLm5leHRBdXRvTGV2ZWxLZXkgPSBcIlwiO1xuICB9XG4gIG9uRnJhZ0xvYWRpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0LmZyYWc7XG4gICAgaWYgKCF0aGlzLmlnbm9yZUZyYWdtZW50KHIpKSB7XG4gICAgICBpZiAoIXIuYml0cmF0ZVRlc3QpIHtcbiAgICAgICAgdmFyIG47XG4gICAgICAgIHRoaXMuZnJhZ0N1cnJlbnQgPSByLCB0aGlzLnBhcnRDdXJyZW50ID0gKG4gPSB0LnBhcnQpICE9IG51bGwgPyBuIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xlYXJUaW1lcigpLCB0aGlzLnRpbWVyID0gc2VsZi5zZXRJbnRlcnZhbCh0aGlzLl9hYmFuZG9uUnVsZXNDaGVjaywgMTAwKTtcbiAgICB9XG4gIH1cbiAgb25MZXZlbFN3aXRjaGluZyhlLCB0KSB7XG4gICAgdGhpcy5jbGVhclRpbWVyKCk7XG4gIH1cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgaWYgKCF0LmZhdGFsKVxuICAgICAgc3dpdGNoICh0LmRldGFpbHMpIHtcbiAgICAgICAgY2FzZSBKLkJVRkZFUl9BRERfQ09ERUNfRVJST1I6XG4gICAgICAgIGNhc2UgSi5CVUZGRVJfQVBQRU5EX0VSUk9SOlxuICAgICAgICAgIHRoaXMubGFzdExvYWRlZEZyYWdMZXZlbCA9IC0xLCB0aGlzLmZpcnN0U2VsZWN0aW9uID0gLTE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgSi5GUkFHX0xPQURfVElNRU9VVDoge1xuICAgICAgICAgIGNvbnN0IHIgPSB0LmZyYWcsIHtcbiAgICAgICAgICAgIGZyYWdDdXJyZW50OiBuLFxuICAgICAgICAgICAgcGFydEN1cnJlbnQ6IGlcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICBpZiAociAmJiBuICYmIHIuc24gPT09IG4uc24gJiYgci5sZXZlbCA9PT0gbi5sZXZlbCkge1xuICAgICAgICAgICAgY29uc3QgbyA9IHBlcmZvcm1hbmNlLm5vdygpLCBhID0gaSA/IGkuc3RhdHMgOiByLnN0YXRzLCBsID0gbyAtIGEubG9hZGluZy5zdGFydCwgYyA9IGEubG9hZGluZy5maXJzdCA/IGEubG9hZGluZy5maXJzdCAtIGEubG9hZGluZy5zdGFydCA6IC0xO1xuICAgICAgICAgICAgaWYgKGEubG9hZGVkICYmIGMgPiAtMSkge1xuICAgICAgICAgICAgICBjb25zdCBkID0gdGhpcy5id0VzdGltYXRvci5nZXRFc3RpbWF0ZVRURkIoKTtcbiAgICAgICAgICAgICAgdGhpcy5id0VzdGltYXRvci5zYW1wbGUobCAtIE1hdGgubWluKGQsIGMpLCBhLmxvYWRlZCk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgdGhpcy5id0VzdGltYXRvci5zYW1wbGVUVEZCKGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICB9XG4gIGdldFRpbWVUb0xvYWRGcmFnKGUsIHQsIHIsIG4pIHtcbiAgICBjb25zdCBpID0gZSArIHIgLyB0LCBvID0gbiA/IGUgKyB0aGlzLmxhc3RMZXZlbExvYWRTZWMgOiAwO1xuICAgIHJldHVybiBpICsgbztcbiAgfVxuICBvbkxldmVsTG9hZGVkKGUsIHQpIHtcbiAgICBjb25zdCByID0gdGhpcy5obHMuY29uZmlnLCB7XG4gICAgICBsb2FkaW5nOiBuXG4gICAgfSA9IHQuc3RhdHMsIGkgPSBuLmVuZCAtIG4uZmlyc3Q7XG4gICAgdWUoaSkgJiYgKHRoaXMubGFzdExldmVsTG9hZFNlYyA9IGkgLyAxZTMpLCB0LmRldGFpbHMubGl2ZSA/IHRoaXMuYndFc3RpbWF0b3IudXBkYXRlKHIuYWJyRXdtYVNsb3dMaXZlLCByLmFickV3bWFGYXN0TGl2ZSkgOiB0aGlzLmJ3RXN0aW1hdG9yLnVwZGF0ZShyLmFickV3bWFTbG93Vm9ELCByLmFickV3bWFGYXN0Vm9EKSwgdGhpcy50aW1lciA+IC0xICYmIHRoaXMuX2FiYW5kb25SdWxlc0NoZWNrKHQubGV2ZWxJbmZvKTtcbiAgfVxuICBvbkZyYWdMb2FkZWQoZSwge1xuICAgIGZyYWc6IHQsXG4gICAgcGFydDogclxuICB9KSB7XG4gICAgY29uc3QgbiA9IHIgPyByLnN0YXRzIDogdC5zdGF0cztcbiAgICBpZiAodC50eXBlID09PSBwZS5NQUlOICYmIHRoaXMuYndFc3RpbWF0b3Iuc2FtcGxlVFRGQihuLmxvYWRpbmcuZmlyc3QgLSBuLmxvYWRpbmcuc3RhcnQpLCAhdGhpcy5pZ25vcmVGcmFnbWVudCh0KSkge1xuICAgICAgaWYgKHRoaXMuY2xlYXJUaW1lcigpLCB0LmxldmVsID09PSB0aGlzLl9uZXh0QXV0b0xldmVsICYmICh0aGlzLl9uZXh0QXV0b0xldmVsID0gLTEpLCB0aGlzLmZpcnN0U2VsZWN0aW9uID0gLTEsIHRoaXMuaGxzLmNvbmZpZy5hYnJNYXhXaXRoUmVhbEJpdHJhdGUpIHtcbiAgICAgICAgY29uc3QgaSA9IHIgPyByLmR1cmF0aW9uIDogdC5kdXJhdGlvbiwgbyA9IHRoaXMuaGxzLmxldmVsc1t0LmxldmVsXSwgYSA9IChvLmxvYWRlZCA/IG8ubG9hZGVkLmJ5dGVzIDogMCkgKyBuLmxvYWRlZCwgbCA9IChvLmxvYWRlZCA/IG8ubG9hZGVkLmR1cmF0aW9uIDogMCkgKyBpO1xuICAgICAgICBvLmxvYWRlZCA9IHtcbiAgICAgICAgICBieXRlczogYSxcbiAgICAgICAgICBkdXJhdGlvbjogbFxuICAgICAgICB9LCBvLnJlYWxCaXRyYXRlID0gTWF0aC5yb3VuZCg4ICogYSAvIGwpO1xuICAgICAgfVxuICAgICAgaWYgKHQuYml0cmF0ZVRlc3QpIHtcbiAgICAgICAgY29uc3QgaSA9IHtcbiAgICAgICAgICBzdGF0czogbixcbiAgICAgICAgICBmcmFnOiB0LFxuICAgICAgICAgIHBhcnQ6IHIsXG4gICAgICAgICAgaWQ6IHQudHlwZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm9uRnJhZ0J1ZmZlcmVkKEkuRlJBR19CVUZGRVJFRCwgaSksIHQuYml0cmF0ZVRlc3QgPSAhMTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB0aGlzLmxhc3RMb2FkZWRGcmFnTGV2ZWwgPSB0LmxldmVsO1xuICAgIH1cbiAgfVxuICBvbkZyYWdCdWZmZXJlZChlLCB0KSB7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZzogcixcbiAgICAgIHBhcnQ6IG5cbiAgICB9ID0gdCwgaSA9IG4gIT0gbnVsbCAmJiBuLnN0YXRzLmxvYWRlZCA/IG4uc3RhdHMgOiByLnN0YXRzO1xuICAgIGlmIChpLmFib3J0ZWQgfHwgdGhpcy5pZ25vcmVGcmFnbWVudChyKSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBvID0gaS5wYXJzaW5nLmVuZCAtIGkubG9hZGluZy5zdGFydCAtIE1hdGgubWluKGkubG9hZGluZy5maXJzdCAtIGkubG9hZGluZy5zdGFydCwgdGhpcy5id0VzdGltYXRvci5nZXRFc3RpbWF0ZVRURkIoKSk7XG4gICAgdGhpcy5id0VzdGltYXRvci5zYW1wbGUobywgaS5sb2FkZWQpLCBpLmJ3RXN0aW1hdGUgPSB0aGlzLmdldEJ3RXN0aW1hdGUoKSwgci5iaXRyYXRlVGVzdCA/IHRoaXMuYml0cmF0ZVRlc3REZWxheSA9IG8gLyAxZTMgOiB0aGlzLmJpdHJhdGVUZXN0RGVsYXkgPSAwO1xuICB9XG4gIGlnbm9yZUZyYWdtZW50KGUpIHtcbiAgICByZXR1cm4gZS50eXBlICE9PSBwZS5NQUlOIHx8IGUuc24gPT09IFwiaW5pdFNlZ21lbnRcIjtcbiAgfVxuICBjbGVhclRpbWVyKCkge1xuICAgIHRoaXMudGltZXIgPiAtMSAmJiAoc2VsZi5jbGVhckludGVydmFsKHRoaXMudGltZXIpLCB0aGlzLnRpbWVyID0gLTEpO1xuICB9XG4gIGdldCBmaXJzdEF1dG9MZXZlbCgpIHtcbiAgICBjb25zdCB7XG4gICAgICBtYXhBdXRvTGV2ZWw6IGUsXG4gICAgICBtaW5BdXRvTGV2ZWw6IHRcbiAgICB9ID0gdGhpcy5obHMsIHIgPSB0aGlzLmdldEJ3RXN0aW1hdGUoKSwgbiA9IHRoaXMuaGxzLmNvbmZpZy5tYXhTdGFydmF0aW9uRGVsYXksIGkgPSB0aGlzLmZpbmRCZXN0TGV2ZWwociwgdCwgZSwgMCwgbiwgMSwgMSk7XG4gICAgaWYgKGkgPiAtMSlcbiAgICAgIHJldHVybiBpO1xuICAgIGNvbnN0IG8gPSB0aGlzLmhscy5maXJzdExldmVsLCBhID0gTWF0aC5taW4oTWF0aC5tYXgobywgdCksIGUpO1xuICAgIHJldHVybiB0aGlzLndhcm4oYENvdWxkIG5vdCBmaW5kIGJlc3Qgc3RhcnRpbmcgYXV0byBsZXZlbC4gRGVmYXVsdGluZyB0byBmaXJzdCBpbiBwbGF5bGlzdCAke299IGNsYW1wZWQgdG8gJHthfWApLCBhO1xuICB9XG4gIGdldCBmb3JjZWRBdXRvTGV2ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMubmV4dEF1dG9MZXZlbEtleSA/IC0xIDogdGhpcy5fbmV4dEF1dG9MZXZlbDtcbiAgfVxuICAvLyByZXR1cm4gbmV4dCBhdXRvIGxldmVsXG4gIGdldCBuZXh0QXV0b0xldmVsKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmZvcmNlZEF1dG9MZXZlbCwgciA9IHRoaXMuYndFc3RpbWF0b3IuY2FuRXN0aW1hdGUoKSwgbiA9IHRoaXMubGFzdExvYWRlZEZyYWdMZXZlbCA+IC0xO1xuICAgIGlmIChlICE9PSAtMSAmJiAoIXIgfHwgIW4gfHwgdGhpcy5uZXh0QXV0b0xldmVsS2V5ID09PSB0aGlzLmdldEF1dG9MZXZlbEtleSgpKSlcbiAgICAgIHJldHVybiBlO1xuICAgIGNvbnN0IGkgPSByICYmIG4gPyB0aGlzLmdldE5leHRBQlJBdXRvTGV2ZWwoKSA6IHRoaXMuZmlyc3RBdXRvTGV2ZWw7XG4gICAgaWYgKGUgIT09IC0xKSB7XG4gICAgICBjb25zdCBvID0gdGhpcy5obHMubGV2ZWxzO1xuICAgICAgaWYgKG8ubGVuZ3RoID4gTWF0aC5tYXgoZSwgaSkgJiYgb1tlXS5sb2FkRXJyb3IgPD0gb1tpXS5sb2FkRXJyb3IpXG4gICAgICAgIHJldHVybiBlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbmV4dEF1dG9MZXZlbCA9IGksIHRoaXMubmV4dEF1dG9MZXZlbEtleSA9IHRoaXMuZ2V0QXV0b0xldmVsS2V5KCksIGk7XG4gIH1cbiAgZ2V0QXV0b0xldmVsS2V5KCkge1xuICAgIHJldHVybiBgJHt0aGlzLmdldEJ3RXN0aW1hdGUoKX1fJHt0aGlzLmdldFN0YXJ2YXRpb25EZWxheSgpLnRvRml4ZWQoMil9YDtcbiAgfVxuICBnZXROZXh0QUJSQXV0b0xldmVsKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWdDdXJyZW50OiBlLFxuICAgICAgcGFydEN1cnJlbnQ6IHQsXG4gICAgICBobHM6IHJcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoci5sZXZlbHMubGVuZ3RoIDw9IDEpXG4gICAgICByZXR1cm4gci5sb2FkTGV2ZWw7XG4gICAgY29uc3Qge1xuICAgICAgbWF4QXV0b0xldmVsOiBuLFxuICAgICAgY29uZmlnOiBpLFxuICAgICAgbWluQXV0b0xldmVsOiBvXG4gICAgfSA9IHIsIGEgPSB0ID8gdC5kdXJhdGlvbiA6IGUgPyBlLmR1cmF0aW9uIDogMCwgbCA9IHRoaXMuZ2V0QndFc3RpbWF0ZSgpLCBjID0gdGhpcy5nZXRTdGFydmF0aW9uRGVsYXkoKTtcbiAgICBsZXQgdSA9IGkuYWJyQmFuZFdpZHRoRmFjdG9yLCBkID0gaS5hYnJCYW5kV2lkdGhVcEZhY3RvcjtcbiAgICBpZiAoYykge1xuICAgICAgY29uc3QgRSA9IHRoaXMuZmluZEJlc3RMZXZlbChsLCBvLCBuLCBjLCAwLCB1LCBkKTtcbiAgICAgIGlmIChFID49IDApXG4gICAgICAgIHJldHVybiB0aGlzLnJlYnVmZmVyTm90aWNlID0gLTEsIEU7XG4gICAgfVxuICAgIGxldCBoID0gYSA/IE1hdGgubWluKGEsIGkubWF4U3RhcnZhdGlvbkRlbGF5KSA6IGkubWF4U3RhcnZhdGlvbkRlbGF5O1xuICAgIGlmICghYykge1xuICAgICAgY29uc3QgRSA9IHRoaXMuYml0cmF0ZVRlc3REZWxheTtcbiAgICAgIEUgJiYgKGggPSAoYSA/IE1hdGgubWluKGEsIGkubWF4TG9hZGluZ0RlbGF5KSA6IGkubWF4TG9hZGluZ0RlbGF5KSAtIEUsIHRoaXMuaW5mbyhgYml0cmF0ZSB0ZXN0IHRvb2sgJHtNYXRoLnJvdW5kKDFlMyAqIEUpfW1zLCBzZXQgZmlyc3QgZnJhZ21lbnQgbWF4IGZldGNoRHVyYXRpb24gdG8gJHtNYXRoLnJvdW5kKDFlMyAqIGgpfSBtc2ApLCB1ID0gZCA9IDEpO1xuICAgIH1cbiAgICBjb25zdCBmID0gdGhpcy5maW5kQmVzdExldmVsKGwsIG8sIG4sIGMsIGgsIHUsIGQpO1xuICAgIGlmICh0aGlzLnJlYnVmZmVyTm90aWNlICE9PSBmICYmICh0aGlzLnJlYnVmZmVyTm90aWNlID0gZiwgdGhpcy5pbmZvKGAke2MgPyBcInJlYnVmZmVyaW5nIGV4cGVjdGVkXCIgOiBcImJ1ZmZlciBpcyBlbXB0eVwifSwgb3B0aW1hbCBxdWFsaXR5IGxldmVsICR7Zn1gKSksIGYgPiAtMSlcbiAgICAgIHJldHVybiBmO1xuICAgIGNvbnN0IHAgPSByLmxldmVsc1tvXSwgeSA9IHIubG9hZExldmVsT2JqO1xuICAgIHJldHVybiB5ICYmIChwID09IG51bGwgPyB2b2lkIDAgOiBwLmJpdHJhdGUpIDwgeS5iaXRyYXRlID8gbyA6IHIubG9hZExldmVsO1xuICB9XG4gIGdldFN0YXJ2YXRpb25EZWxheSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHMsIHQgPSBlLm1lZGlhO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybiAxIC8gMDtcbiAgICBjb25zdCByID0gdCAmJiB0LnBsYXliYWNrUmF0ZSAhPT0gMCA/IE1hdGguYWJzKHQucGxheWJhY2tSYXRlKSA6IDEsIG4gPSBlLm1haW5Gb3J3YXJkQnVmZmVySW5mbztcbiAgICByZXR1cm4gKG4gPyBuLmxlbiA6IDApIC8gcjtcbiAgfVxuICBnZXRCd0VzdGltYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmJ3RXN0aW1hdG9yLmNhbkVzdGltYXRlKCkgPyB0aGlzLmJ3RXN0aW1hdG9yLmdldEVzdGltYXRlKCkgOiB0aGlzLmhscy5jb25maWcuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZTtcbiAgfVxuICBmaW5kQmVzdExldmVsKGUsIHQsIHIsIG4sIGksIG8sIGEpIHtcbiAgICB2YXIgbDtcbiAgICBjb25zdCBjID0gbiArIGksIHUgPSB0aGlzLmxhc3RMb2FkZWRGcmFnTGV2ZWwsIGQgPSB1ID09PSAtMSA/IHRoaXMuaGxzLmZpcnN0TGV2ZWwgOiB1LCB7XG4gICAgICBmcmFnQ3VycmVudDogaCxcbiAgICAgIHBhcnRDdXJyZW50OiBmXG4gICAgfSA9IHRoaXMsIHtcbiAgICAgIGxldmVsczogcCxcbiAgICAgIGFsbEF1ZGlvVHJhY2tzOiB5LFxuICAgICAgbG9hZExldmVsOiBFLFxuICAgICAgY29uZmlnOiBiXG4gICAgfSA9IHRoaXMuaGxzO1xuICAgIGlmIChwLmxlbmd0aCA9PT0gMSlcbiAgICAgIHJldHVybiAwO1xuICAgIGNvbnN0IFIgPSBwW2RdLCBBID0gISEoKGwgPSB0aGlzLmhscy5sYXRlc3RMZXZlbERldGFpbHMpICE9IG51bGwgJiYgbC5saXZlKSwgRiA9IEUgPT09IC0xIHx8IHUgPT09IC0xO1xuICAgIGxldCBNLCBIID0gXCJTRFJcIiwgSyA9IChSID09IG51bGwgPyB2b2lkIDAgOiBSLmZyYW1lUmF0ZSkgfHwgMDtcbiAgICBjb25zdCB7XG4gICAgICBhdWRpb1ByZWZlcmVuY2U6IGosXG4gICAgICB2aWRlb1ByZWZlcmVuY2U6IENcbiAgICB9ID0gYiwgayA9IHRoaXMuYXVkaW9UcmFja3NCeUdyb3VwIHx8ICh0aGlzLmF1ZGlvVHJhY2tzQnlHcm91cCA9ICRnKHkpKTtcbiAgICBsZXQgJCA9IC0xO1xuICAgIGlmIChGKSB7XG4gICAgICBpZiAodGhpcy5maXJzdFNlbGVjdGlvbiAhPT0gLTEpXG4gICAgICAgIHJldHVybiB0aGlzLmZpcnN0U2VsZWN0aW9uO1xuICAgICAgY29uc3QgdyA9IHRoaXMuY29kZWNUaWVycyB8fCAodGhpcy5jb2RlY1RpZXJzID0gZmIocCwgaywgdCwgcikpLCBEID0gaGIodywgSCwgZSwgaiwgQyksIHtcbiAgICAgICAgY29kZWNTZXQ6IE8sXG4gICAgICAgIHZpZGVvUmFuZ2VzOiBVLFxuICAgICAgICBtaW5GcmFtZXJhdGU6IFYsXG4gICAgICAgIG1pbkJpdHJhdGU6IEwsXG4gICAgICAgIG1pbkluZGV4OiBtLFxuICAgICAgICBwcmVmZXJIRFI6IHZcbiAgICAgIH0gPSBEO1xuICAgICAgJCA9IG0sIE0gPSBPLCBIID0gdiA/IFVbVS5sZW5ndGggLSAxXSA6IFVbMF0sIEsgPSBWLCBlID0gTWF0aC5tYXgoZSwgTCksIHRoaXMubG9nKGBwaWNrZWQgc3RhcnQgdGllciAke2F0KEQpfWApO1xuICAgIH0gZWxzZVxuICAgICAgTSA9IFIgPT0gbnVsbCA/IHZvaWQgMCA6IFIuY29kZWNTZXQsIEggPSBSID09IG51bGwgPyB2b2lkIDAgOiBSLnZpZGVvUmFuZ2U7XG4gICAgY29uc3QgVyA9IGYgPyBmLmR1cmF0aW9uIDogaCA/IGguZHVyYXRpb24gOiAwLCBfID0gdGhpcy5id0VzdGltYXRvci5nZXRFc3RpbWF0ZVRURkIoKSAvIDFlMywgZyA9IFtdO1xuICAgIGZvciAobGV0IHcgPSByOyB3ID49IHQ7IHctLSkge1xuICAgICAgdmFyIHg7XG4gICAgICBjb25zdCBEID0gcFt3XSwgTyA9IHcgPiBkO1xuICAgICAgaWYgKCFEKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGlmIChiLnVzZU1lZGlhQ2FwYWJpbGl0aWVzICYmICFELnN1cHBvcnRlZFJlc3VsdCAmJiAhRC5zdXBwb3J0ZWRQcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IE4gPSBuYXZpZ2F0b3IubWVkaWFDYXBhYmlsaXRpZXM7XG4gICAgICAgIHR5cGVvZiAoTiA9PSBudWxsID8gdm9pZCAwIDogTi5kZWNvZGluZ0luZm8pID09IFwiZnVuY3Rpb25cIiAmJiByYihELCBrLCBILCBLLCBlLCBqKSA/IChELnN1cHBvcnRlZFByb21pc2UgPSBOZyhELCBrLCBOLCB0aGlzLnN1cHBvcnRlZENhY2hlKSwgRC5zdXBwb3J0ZWRQcm9taXNlLnRoZW4oKFkpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuaGxzKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIEQuc3VwcG9ydGVkUmVzdWx0ID0gWTtcbiAgICAgICAgICBjb25zdCBlZSA9IHRoaXMuaGxzLmxldmVscywgaWUgPSBlZS5pbmRleE9mKEQpO1xuICAgICAgICAgIFkuZXJyb3IgPyB0aGlzLndhcm4oYE1lZGlhQ2FwYWJpbGl0aWVzIGRlY29kaW5nSW5mbyBlcnJvcjogXCIke1kuZXJyb3J9XCIgZm9yIGxldmVsICR7aWV9ICR7YXQoWSl9YCkgOiBZLnN1cHBvcnRlZCA/IFkuZGVjb2RpbmdJbmZvUmVzdWx0cy5zb21lKChsZSkgPT4gbGUuc21vb3RoID09PSAhMSB8fCBsZS5wb3dlckVmZmljaWVudCA9PT0gITEpICYmIHRoaXMubG9nKGBNZWRpYUNhcGFiaWxpdGllcyBkZWNvZGluZ0luZm8gZm9yIGxldmVsICR7aWV9IG5vdCBzbW9vdGggb3IgcG93ZXJFZmZpY2llbnQ6ICR7YXQoWSl9YCkgOiAodGhpcy53YXJuKGBVbnN1cHBvcnRlZCBNZWRpYUNhcGFiaWxpdGllcyBkZWNvZGluZ0luZm8gcmVzdWx0IGZvciBsZXZlbCAke2llfSAke2F0KFkpfWApLCBpZSA+IC0xICYmIGVlLmxlbmd0aCA+IDEgJiYgKHRoaXMubG9nKGBSZW1vdmluZyB1bnN1cHBvcnRlZCBsZXZlbCAke2llfWApLCB0aGlzLmhscy5yZW1vdmVMZXZlbChpZSksIHRoaXMuaGxzLmxvYWRMZXZlbCA9PT0gLTEgJiYgKHRoaXMuaGxzLm5leHRMb2FkTGV2ZWwgPSAwKSkpO1xuICAgICAgICB9KS5jYXRjaCgoWSkgPT4ge1xuICAgICAgICAgIHRoaXMud2FybihgRXJyb3IgaGFuZGxpbmcgTWVkaWFDYXBhYmlsaXRpZXMgZGVjb2RpbmdJbmZvOiAke1l9YCk7XG4gICAgICAgIH0pKSA6IEQuc3VwcG9ydGVkUmVzdWx0ID0gQmc7XG4gICAgICB9XG4gICAgICBpZiAoKE0gJiYgRC5jb2RlY1NldCAhPT0gTSB8fCBIICYmIEQudmlkZW9SYW5nZSAhPT0gSCB8fCBPICYmIEsgPiBELmZyYW1lUmF0ZSB8fCAhTyAmJiBLID4gMCAmJiBLIDwgRC5mcmFtZVJhdGUgfHwgKHggPSBELnN1cHBvcnRlZFJlc3VsdCkgIT0gbnVsbCAmJiAoeCA9IHguZGVjb2RpbmdJbmZvUmVzdWx0cykgIT0gbnVsbCAmJiB4LnNvbWUoKE4pID0+IE4uc21vb3RoID09PSAhMSkpICYmICghRiB8fCB3ICE9PSAkKSkge1xuICAgICAgICBnLnB1c2godyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgVSA9IEQuZGV0YWlscywgViA9IChmID8gVSA9PSBudWxsID8gdm9pZCAwIDogVS5wYXJ0VGFyZ2V0IDogVSA9PSBudWxsID8gdm9pZCAwIDogVS5hdmVyYWdldGFyZ2V0ZHVyYXRpb24pIHx8IFc7XG4gICAgICBsZXQgTDtcbiAgICAgIE8gPyBMID0gYSAqIGUgOiBMID0gbyAqIGU7XG4gICAgICBjb25zdCBtID0gVyAmJiBuID49IFcgKiAyICYmIGkgPT09IDAgPyBELmF2ZXJhZ2VCaXRyYXRlIDogRC5tYXhCaXRyYXRlLCB2ID0gdGhpcy5nZXRUaW1lVG9Mb2FkRnJhZyhfLCBMLCBtICogViwgVSA9PT0gdm9pZCAwKTtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gaWYgYWRqdXN0ZWQgYncgaXMgZ3JlYXRlciB0aGFuIGxldmVsIGJpdHJhdGUgQU5EXG4gICAgICAgIEwgPj0gbSAmJiAvLyBubyBsZXZlbCBjaGFuZ2UsIG9yIG5ldyBsZXZlbCBoYXMgbm8gZXJyb3IgaGlzdG9yeVxuICAgICAgICAodyA9PT0gdSB8fCBELmxvYWRFcnJvciA9PT0gMCAmJiBELmZyYWdtZW50RXJyb3IgPT09IDApICYmIC8vIGZyYWdtZW50IGZldGNoRHVyYXRpb24gdW5rbm93biBPUiBsaXZlIHN0cmVhbSBPUiBmcmFnbWVudCBmZXRjaER1cmF0aW9uIGxlc3MgdGhhbiBtYXggYWxsb3dlZCBmZXRjaCBkdXJhdGlvbiwgdGhlbiB0aGlzIGxldmVsIG1hdGNoZXNcbiAgICAgICAgLy8gd2UgZG9uJ3QgYWNjb3VudCBmb3IgbWF4IEZldGNoIER1cmF0aW9uIGZvciBsaXZlIHN0cmVhbXMsIHRoaXMgaXMgdG8gYXZvaWQgc3dpdGNoaW5nIGRvd24gd2hlbiBuZWFyIHRoZSBlZGdlIG9mIGxpdmUgc2xpZGluZyB3aW5kb3cgLi4uXG4gICAgICAgIC8vIHNwZWNpYWwgY2FzZSB0byBzdXBwb3J0IHN0YXJ0TGV2ZWwgPSAtMSAoYml0cmF0ZVRlc3QpIG9uIGxpdmUgc3RyZWFtcyA6IGluIHRoYXQgY2FzZSB3ZSBzaG91bGQgbm90IGV4aXQgbG9vcCBzbyB0aGF0IGZpbmRCZXN0TGV2ZWwgd2lsbCByZXR1cm4gLTFcbiAgICAgICAgKHYgPD0gXyB8fCAhdWUodikgfHwgQSAmJiAhdGhpcy5iaXRyYXRlVGVzdERlbGF5IHx8IHYgPCBjKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IE4gPSB0aGlzLmZvcmNlZEF1dG9MZXZlbDtcbiAgICAgICAgcmV0dXJuIHcgIT09IEUgJiYgKE4gPT09IC0xIHx8IE4gIT09IEUpICYmIChnLmxlbmd0aCAmJiB0aGlzLnRyYWNlKGBTa2lwcGVkIGxldmVsKHMpICR7Zy5qb2luKFwiLFwiKX0gb2YgJHtyfSBtYXggd2l0aCBDT0RFQ1MgYW5kIFZJREVPLVJBTkdFOlwiJHtwW2dbMF1dLmNvZGVjc31cIiAke3BbZ1swXV0udmlkZW9SYW5nZX07IG5vdCBjb21wYXRpYmxlIHdpdGggXCIke019XCIgJHtIfWApLCB0aGlzLmluZm8oYHN3aXRjaCBjYW5kaWRhdGU6JHtkfS0+JHt3fSBhZGp1c3RlZGJ3KCR7TWF0aC5yb3VuZChMKX0pLWJpdHJhdGU9JHtNYXRoLnJvdW5kKEwgLSBtKX0gdHRmYjoke18udG9GaXhlZCgxKX0gYXZnRHVyYXRpb246JHtWLnRvRml4ZWQoMSl9IG1heEZldGNoRHVyYXRpb246JHtjLnRvRml4ZWQoMSl9IGZldGNoRHVyYXRpb246JHt2LnRvRml4ZWQoMSl9IGZpcnN0U2VsZWN0aW9uOiR7Rn0gY29kZWNTZXQ6JHtELmNvZGVjU2V0fSB2aWRlb1JhbmdlOiR7RC52aWRlb1JhbmdlfSBobHMubG9hZExldmVsOiR7RX1gKSksIEYgJiYgKHRoaXMuZmlyc3RTZWxlY3Rpb24gPSB3KSwgdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHNldCBuZXh0QXV0b0xldmVsKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5kZXJpdmVOZXh0QXV0b0xldmVsKGUpO1xuICAgIHRoaXMuX25leHRBdXRvTGV2ZWwgIT09IHQgJiYgKHRoaXMubmV4dEF1dG9MZXZlbEtleSA9IFwiXCIsIHRoaXMuX25leHRBdXRvTGV2ZWwgPSB0KTtcbiAgfVxuICBkZXJpdmVOZXh0QXV0b0xldmVsKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBtYXhBdXRvTGV2ZWw6IHQsXG4gICAgICBtaW5BdXRvTGV2ZWw6IHJcbiAgICB9ID0gdGhpcy5obHM7XG4gICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGUsIHIpLCB0KTtcbiAgfVxufVxuY29uc3QgR2cgPSB7XG4gIC8qKlxuICAgKiBTZWFyY2hlcyBmb3IgYW4gaXRlbSBpbiBhbiBhcnJheSB3aGljaCBtYXRjaGVzIGEgY2VydGFpbiBjb25kaXRpb24uXG4gICAqIFRoaXMgcmVxdWlyZXMgdGhlIGNvbmRpdGlvbiB0byBvbmx5IG1hdGNoIG9uZSBpdGVtIGluIHRoZSBhcnJheSxcbiAgICogYW5kIGZvciB0aGUgYXJyYXkgdG8gYmUgb3JkZXJlZC5cbiAgICpcbiAgICogQHBhcmFtIGxpc3QgVGhlIGFycmF5IHRvIHNlYXJjaC5cbiAgICogQHBhcmFtIGNvbXBhcmlzb25GblxuICAgKiAgICAgIENhbGxlZCBhbmQgcHJvdmlkZWQgYSBjYW5kaWRhdGUgaXRlbSBhcyB0aGUgZmlyc3QgYXJndW1lbnQuXG4gICAqICAgICAgU2hvdWxkIHJldHVybjpcbiAgICogICAgICAgICAgPiAtMSBpZiB0aGUgaXRlbSBzaG91bGQgYmUgbG9jYXRlZCBhdCBhIGxvd2VyIGluZGV4IHRoYW4gdGhlIHByb3ZpZGVkIGl0ZW0uXG4gICAqICAgICAgICAgID4gMSBpZiB0aGUgaXRlbSBzaG91bGQgYmUgbG9jYXRlZCBhdCBhIGhpZ2hlciBpbmRleCB0aGFuIHRoZSBwcm92aWRlZCBpdGVtLlxuICAgKiAgICAgICAgICA+IDAgaWYgdGhlIGl0ZW0gaXMgdGhlIGl0ZW0geW91J3JlIGxvb2tpbmcgZm9yLlxuICAgKlxuICAgKiBAcmV0dXJucyB0aGUgb2JqZWN0IGlmIGZvdW5kLCBvdGhlcndpc2UgcmV0dXJucyBudWxsXG4gICAqL1xuICBzZWFyY2g6IGZ1bmN0aW9uKHMsIGUpIHtcbiAgICBsZXQgdCA9IDAsIHIgPSBzLmxlbmd0aCAtIDEsIG4gPSBudWxsLCBpID0gbnVsbDtcbiAgICBmb3IgKDsgdCA8PSByOyApIHtcbiAgICAgIG4gPSAodCArIHIpIC8gMiB8IDAsIGkgPSBzW25dO1xuICAgICAgY29uc3QgbyA9IGUoaSk7XG4gICAgICBpZiAobyA+IDApXG4gICAgICAgIHQgPSBuICsgMTtcbiAgICAgIGVsc2UgaWYgKG8gPCAwKVxuICAgICAgICByID0gbiAtIDE7XG4gICAgICBlbHNlXG4gICAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcbmZ1bmN0aW9uIHZiKHMsIGUsIHQpIHtcbiAgaWYgKGUgPT09IG51bGwgfHwgIUFycmF5LmlzQXJyYXkocykgfHwgIXMubGVuZ3RoIHx8ICF1ZShlKSlcbiAgICByZXR1cm4gbnVsbDtcbiAgY29uc3QgciA9IHNbMF0ucHJvZ3JhbURhdGVUaW1lO1xuICBpZiAoZSA8IChyIHx8IDApKVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCBuID0gc1tzLmxlbmd0aCAtIDFdLmVuZFByb2dyYW1EYXRlVGltZTtcbiAgaWYgKGUgPj0gKG4gfHwgMCkpXG4gICAgcmV0dXJuIG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG8gPSBzW2ldO1xuICAgIGlmICh4YihlLCB0LCBvKSlcbiAgICAgIHJldHVybiBvO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuZnVuY3Rpb24gSnMocywgZSwgdCA9IDAsIHIgPSAwLCBuID0gNWUtMykge1xuICBsZXQgaSA9IG51bGw7XG4gIGlmIChzKSB7XG4gICAgaSA9IGVbMSArIHMuc24gLSBlWzBdLnNuXSB8fCBudWxsO1xuICAgIGNvbnN0IGEgPSBzLmVuZERUUyAtIHQ7XG4gICAgYSA+IDAgJiYgYSA8IDE1ZS03ICYmICh0ICs9IDE1ZS03KSwgaSAmJiBzLmxldmVsICE9PSBpLmxldmVsICYmIGkuZW5kIDw9IHMuZW5kICYmIChpID0gZVsyICsgcy5zbiAtIGVbMF0uc25dIHx8IG51bGwpO1xuICB9IGVsc2UgdCA9PT0gMCAmJiBlWzBdLnN0YXJ0ID09PSAwICYmIChpID0gZVswXSk7XG4gIGlmIChpICYmICgoIXMgfHwgcy5sZXZlbCA9PT0gaS5sZXZlbCkgJiYgZGgodCwgciwgaSkgPT09IDAgfHwgRWIoaSwgcywgTWF0aC5taW4obiwgcikpKSlcbiAgICByZXR1cm4gaTtcbiAgY29uc3QgbyA9IEdnLnNlYXJjaChlLCBkaC5iaW5kKG51bGwsIHQsIHIpKTtcbiAgcmV0dXJuIG8gJiYgKG8gIT09IHMgfHwgIWkpID8gbyA6IGk7XG59XG5mdW5jdGlvbiBFYihzLCBlLCB0KSB7XG4gIGlmIChlICYmIGUuc3RhcnQgPT09IDAgJiYgZS5sZXZlbCA8IHMubGV2ZWwgJiYgKGUuZW5kUFRTIHx8IDApID4gMCkge1xuICAgIGNvbnN0IHIgPSBlLnRhZ0xpc3QucmVkdWNlKChuLCBpKSA9PiAoaVswXSA9PT0gXCJJTkZcIiAmJiAobiArPSBwYXJzZUZsb2F0KGlbMV0pKSwgbiksIHQpO1xuICAgIHJldHVybiBzLnN0YXJ0IDw9IHI7XG4gIH1cbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gZGgocyA9IDAsIGUgPSAwLCB0KSB7XG4gIGlmICh0LnN0YXJ0IDw9IHMgJiYgdC5zdGFydCArIHQuZHVyYXRpb24gPiBzKVxuICAgIHJldHVybiAwO1xuICBjb25zdCByID0gTWF0aC5taW4oZSwgdC5kdXJhdGlvbiArICh0LmRlbHRhUFRTID8gdC5kZWx0YVBUUyA6IDApKTtcbiAgcmV0dXJuIHQuc3RhcnQgKyB0LmR1cmF0aW9uIC0gciA8PSBzID8gMSA6IHQuc3RhcnQgLSByID4gcyAmJiB0LnN0YXJ0ID8gLTEgOiAwO1xufVxuZnVuY3Rpb24geGIocywgZSwgdCkge1xuICBjb25zdCByID0gTWF0aC5taW4oZSwgdC5kdXJhdGlvbiArICh0LmRlbHRhUFRTID8gdC5kZWx0YVBUUyA6IDApKSAqIDFlMztcbiAgcmV0dXJuICh0LmVuZFByb2dyYW1EYXRlVGltZSB8fCAwKSAtIHIgPiBzO1xufVxuZnVuY3Rpb24gVmcocywgZSwgdCkge1xuICBpZiAocyAmJiBzLnN0YXJ0Q0MgPD0gZSAmJiBzLmVuZENDID49IGUpIHtcbiAgICBsZXQgciA9IHMuZnJhZ21lbnRzO1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWdtZW50SGludDogblxuICAgIH0gPSBzO1xuICAgIG4gJiYgKHIgPSByLmNvbmNhdChuKSk7XG4gICAgbGV0IGk7XG4gICAgcmV0dXJuIEdnLnNlYXJjaChyLCAobykgPT4gby5jYyA8IGUgPyAxIDogby5jYyA+IGUgPyAtMSA6IChpID0gbywgby5lbmQgPD0gdCA/IDEgOiBvLnN0YXJ0ID4gdCA/IC0xIDogMCkpLCBpIHx8IG51bGw7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiBlYShzKSB7XG4gIHN3aXRjaCAocy5kZXRhaWxzKSB7XG4gICAgY2FzZSBKLkZSQUdfTE9BRF9USU1FT1VUOlxuICAgIGNhc2UgSi5LRVlfTE9BRF9USU1FT1VUOlxuICAgIGNhc2UgSi5MRVZFTF9MT0FEX1RJTUVPVVQ6XG4gICAgY2FzZSBKLk1BTklGRVNUX0xPQURfVElNRU9VVDpcbiAgICAgIHJldHVybiAhMDtcbiAgfVxuICByZXR1cm4gITE7XG59XG5mdW5jdGlvbiBqZyhzKSB7XG4gIHJldHVybiBzLmRldGFpbHMuc3RhcnRzV2l0aChcImtleVwiKTtcbn1cbmZ1bmN0aW9uIEtnKHMpIHtcbiAgcmV0dXJuIGpnKHMpICYmICEhcy5mcmFnICYmICFzLmZyYWcuZGVjcnlwdGRhdGE7XG59XG5mdW5jdGlvbiBoaChzLCBlKSB7XG4gIGNvbnN0IHQgPSBlYShlKTtcbiAgcmV0dXJuIHMuZGVmYXVsdFtgJHt0ID8gXCJ0aW1lb3V0XCIgOiBcImVycm9yXCJ9UmV0cnlgXTtcbn1cbmZ1bmN0aW9uIHl1KHMsIGUpIHtcbiAgY29uc3QgdCA9IHMuYmFja29mZiA9PT0gXCJsaW5lYXJcIiA/IDEgOiBNYXRoLnBvdygyLCBlKTtcbiAgcmV0dXJuIE1hdGgubWluKHQgKiBzLnJldHJ5RGVsYXlNcywgcy5tYXhSZXRyeURlbGF5TXMpO1xufVxuZnVuY3Rpb24gZmgocykge1xuICByZXR1cm4gdHQodHQoe30sIHMpLCB7XG4gICAgZXJyb3JSZXRyeTogbnVsbCxcbiAgICB0aW1lb3V0UmV0cnk6IG51bGxcbiAgfSk7XG59XG5mdW5jdGlvbiB0YShzLCBlLCB0LCByKSB7XG4gIGlmICghcylcbiAgICByZXR1cm4gITE7XG4gIGNvbnN0IG4gPSByID09IG51bGwgPyB2b2lkIDAgOiByLmNvZGUsIGkgPSBlIDwgcy5tYXhOdW1SZXRyeSAmJiAoU2IobikgfHwgISF0KTtcbiAgcmV0dXJuIHMuc2hvdWxkUmV0cnkgPyBzLnNob3VsZFJldHJ5KHMsIGUsIHQsIHIsIGkpIDogaTtcbn1cbmZ1bmN0aW9uIFNiKHMpIHtcbiAgcmV0dXJuIHVjKHMpIHx8ICEhcyAmJiAocyA8IDQwMCB8fCBzID4gNDk5KTtcbn1cbmZ1bmN0aW9uIHVjKHMpIHtcbiAgcmV0dXJuIHMgPT09IDAgJiYgbmF2aWdhdG9yLm9uTGluZSA9PT0gITE7XG59XG52YXIgWnQgPSB7XG4gIERvTm90aGluZzogMCxcbiAgU2VuZEFsdGVybmF0ZVRvUGVuYWx0eUJveDogMixcbiAgUmVtb3ZlQWx0ZXJuYXRlUGVybWFuZW50bHk6IDMsXG4gIFJldHJ5UmVxdWVzdDogNVxufSwgdnIgPSB7XG4gIE5vbmU6IDAsXG4gIE1vdmVBbGxBbHRlcm5hdGVzTWF0Y2hpbmdIb3N0OiAxLFxuICBNb3ZlQWxsQWx0ZXJuYXRlc01hdGNoaW5nSERDUDogMixcbiAgTW92ZUFsbEFsdGVybmF0ZXNNYXRjaGluZ0tleTogNFxufTtcbmNsYXNzIGJiIGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoXCJlcnJvci1jb250cm9sbGVyXCIsIGUubG9nZ2VyKSwgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMucGxheWxpc3RFcnJvciA9IDAsIHRoaXMuaGxzID0gZSwgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmhscztcbiAgICBlLm9uKEkuRVJST1IsIHRoaXMub25FcnJvciwgdGhpcyksIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuaGxzO1xuICAgIGUgJiYgKGUub2ZmKEkuRVJST1IsIHRoaXMub25FcnJvciwgdGhpcyksIGUub2ZmKEkuRVJST1IsIHRoaXMub25FcnJvck91dCwgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuTEVWRUxfVVBEQVRFRCwgdGhpcy5vbkxldmVsVXBkYXRlZCwgdGhpcykpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHRoaXMuaGxzID0gbnVsbDtcbiAgfVxuICBzdGFydExvYWQoZSkge1xuICB9XG4gIHN0b3BMb2FkKCkge1xuICAgIHRoaXMucGxheWxpc3RFcnJvciA9IDA7XG4gIH1cbiAgZ2V0VmFyaWFudExldmVsSW5kZXgoZSkge1xuICAgIHJldHVybiAoZSA9PSBudWxsID8gdm9pZCAwIDogZS50eXBlKSA9PT0gcGUuTUFJTiA/IGUubGV2ZWwgOiB0aGlzLmdldFZhcmlhbnRJbmRleCgpO1xuICB9XG4gIGdldFZhcmlhbnRJbmRleCgpIHtcbiAgICB2YXIgZTtcbiAgICBjb25zdCB0ID0gdGhpcy5obHMsIHIgPSB0LmN1cnJlbnRMZXZlbDtcbiAgICByZXR1cm4gKGUgPSB0LmxvYWRMZXZlbE9iaikgIT0gbnVsbCAmJiBlLmRldGFpbHMgfHwgciA9PT0gLTEgPyB0LmxvYWRMZXZlbCA6IHI7XG4gIH1cbiAgdmFyaWFudEhhc0tleShlLCB0KSB7XG4gICAgaWYgKGUpIHtcbiAgICAgIHZhciByO1xuICAgICAgaWYgKChyID0gZS5kZXRhaWxzKSAhPSBudWxsICYmIHIuaGFzS2V5KHQpKVxuICAgICAgICByZXR1cm4gITA7XG4gICAgICBjb25zdCBuID0gZS5hdWRpb0dyb3VwcztcbiAgICAgIGlmIChuKVxuICAgICAgICByZXR1cm4gdGhpcy5obHMuYWxsQXVkaW9UcmFja3MuZmlsdGVyKChvKSA9PiBuLmluZGV4T2Yoby5ncm91cElkKSA+PSAwKS5zb21lKChvKSA9PiB7XG4gICAgICAgICAgdmFyIGE7XG4gICAgICAgICAgcmV0dXJuIChhID0gby5kZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogYS5oYXNLZXkodCk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5wbGF5bGlzdEVycm9yID0gMDtcbiAgfVxuICBvbkxldmVsVXBkYXRlZCgpIHtcbiAgICB0aGlzLnBsYXlsaXN0RXJyb3IgPSAwO1xuICB9XG4gIG9uRXJyb3IoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGlmICh0LmZhdGFsKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSB0aGlzLmhscywgaSA9IHQuY29udGV4dDtcbiAgICBzd2l0Y2ggKHQuZGV0YWlscykge1xuICAgICAgY2FzZSBKLkZSQUdfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5GUkFHX0xPQURfVElNRU9VVDpcbiAgICAgIGNhc2UgSi5LRVlfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5LRVlfTE9BRF9USU1FT1VUOlxuICAgICAgICB0LmVycm9yQWN0aW9uID0gdGhpcy5nZXRGcmFnUmV0cnlPclN3aXRjaEFjdGlvbih0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBKLkZSQUdfUEFSU0lOR19FUlJPUjpcbiAgICAgICAgaWYgKChyID0gdC5mcmFnKSAhPSBudWxsICYmIHIuZ2FwKSB7XG4gICAgICAgICAgdC5lcnJvckFjdGlvbiA9IEFuKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICBjYXNlIEouRlJBR19HQVA6XG4gICAgICBjYXNlIEouRlJBR19ERUNSWVBUX0VSUk9SOiB7XG4gICAgICAgIHQuZXJyb3JBY3Rpb24gPSB0aGlzLmdldEZyYWdSZXRyeU9yU3dpdGNoQWN0aW9uKHQpLCB0LmVycm9yQWN0aW9uLmFjdGlvbiA9IFp0LlNlbmRBbHRlcm5hdGVUb1BlbmFsdHlCb3g7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgSi5MRVZFTF9FTVBUWV9FUlJPUjpcbiAgICAgIGNhc2UgSi5MRVZFTF9QQVJTSU5HX0VSUk9SOlxuICAgICAgICB7XG4gICAgICAgICAgdmFyIG87XG4gICAgICAgICAgY29uc3QgbCA9IHQucGFyZW50ID09PSBwZS5NQUlOID8gdC5sZXZlbCA6IG4ubG9hZExldmVsO1xuICAgICAgICAgIHQuZGV0YWlscyA9PT0gSi5MRVZFTF9FTVBUWV9FUlJPUiAmJiAoKG8gPSB0LmNvbnRleHQpICE9IG51bGwgJiYgKG8gPSBvLmxldmVsRGV0YWlscykgIT0gbnVsbCAmJiBvLmxpdmUpID8gdC5lcnJvckFjdGlvbiA9IHRoaXMuZ2V0UGxheWxpc3RSZXRyeU9yU3dpdGNoQWN0aW9uKHQsIGwpIDogKHQubGV2ZWxSZXRyeSA9ICExLCB0LmVycm9yQWN0aW9uID0gdGhpcy5nZXRMZXZlbFN3aXRjaEFjdGlvbih0LCBsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBKLkxFVkVMX0xPQURfRVJST1I6XG4gICAgICBjYXNlIEouTEVWRUxfTE9BRF9USU1FT1VUOlxuICAgICAgICB0eXBlb2YgKGkgPT0gbnVsbCA/IHZvaWQgMCA6IGkubGV2ZWwpID09IFwibnVtYmVyXCIgJiYgKHQuZXJyb3JBY3Rpb24gPSB0aGlzLmdldFBsYXlsaXN0UmV0cnlPclN3aXRjaEFjdGlvbih0LCBpLmxldmVsKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgSi5BVURJT19UUkFDS19MT0FEX0VSUk9SOlxuICAgICAgY2FzZSBKLkFVRElPX1RSQUNLX0xPQURfVElNRU9VVDpcbiAgICAgIGNhc2UgSi5TVUJUSVRMRV9MT0FEX0VSUk9SOlxuICAgICAgY2FzZSBKLlNVQlRJVExFX1RSQUNLX0xPQURfVElNRU9VVDpcbiAgICAgICAgaWYgKGkpIHtcbiAgICAgICAgICBjb25zdCBsID0gbi5sb2FkTGV2ZWxPYmo7XG4gICAgICAgICAgaWYgKGwgJiYgKGkudHlwZSA9PT0gS2UuQVVESU9fVFJBQ0sgJiYgbC5oYXNBdWRpb0dyb3VwKGkuZ3JvdXBJZCkgfHwgaS50eXBlID09PSBLZS5TVUJUSVRMRV9UUkFDSyAmJiBsLmhhc1N1YnRpdGxlR3JvdXAoaS5ncm91cElkKSkpIHtcbiAgICAgICAgICAgIHQuZXJyb3JBY3Rpb24gPSB0aGlzLmdldFBsYXlsaXN0UmV0cnlPclN3aXRjaEFjdGlvbih0LCBuLmxvYWRMZXZlbCksIHQuZXJyb3JBY3Rpb24uYWN0aW9uID0gWnQuU2VuZEFsdGVybmF0ZVRvUGVuYWx0eUJveCwgdC5lcnJvckFjdGlvbi5mbGFncyA9IHZyLk1vdmVBbGxBbHRlcm5hdGVzTWF0Y2hpbmdIb3N0O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIEouS0VZX1NZU1RFTV9TVEFUVVNfT1VUUFVUX1JFU1RSSUNURUQ6XG4gICAgICAgIHQuZXJyb3JBY3Rpb24gPSB7XG4gICAgICAgICAgYWN0aW9uOiBadC5TZW5kQWx0ZXJuYXRlVG9QZW5hbHR5Qm94LFxuICAgICAgICAgIGZsYWdzOiB2ci5Nb3ZlQWxsQWx0ZXJuYXRlc01hdGNoaW5nSERDUFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIEouS0VZX1NZU1RFTV9TRVNTSU9OX1VQREFURV9GQUlMRUQ6XG4gICAgICBjYXNlIEouS0VZX1NZU1RFTV9TVEFUVVNfSU5URVJOQUxfRVJST1I6XG4gICAgICBjYXNlIEouS0VZX1NZU1RFTV9OT19TRVNTSU9OOlxuICAgICAgICB0LmVycm9yQWN0aW9uID0ge1xuICAgICAgICAgIGFjdGlvbjogWnQuU2VuZEFsdGVybmF0ZVRvUGVuYWx0eUJveCxcbiAgICAgICAgICBmbGFnczogdnIuTW92ZUFsbEFsdGVybmF0ZXNNYXRjaGluZ0tleVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIEouQlVGRkVSX0FERF9DT0RFQ19FUlJPUjpcbiAgICAgIGNhc2UgSi5SRU1VWF9BTExPQ19FUlJPUjpcbiAgICAgIGNhc2UgSi5CVUZGRVJfQVBQRU5EX0VSUk9SOlxuICAgICAgICBpZiAoIXQuZXJyb3JBY3Rpb24pIHtcbiAgICAgICAgICB2YXIgYTtcbiAgICAgICAgICB0LmVycm9yQWN0aW9uID0gdGhpcy5nZXRMZXZlbFN3aXRjaEFjdGlvbih0LCAoYSA9IHQubGV2ZWwpICE9IG51bGwgPyBhIDogbi5sb2FkTGV2ZWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgSi5JTlRFUk5BTF9FWENFUFRJT046XG4gICAgICBjYXNlIEouQlVGRkVSX0FQUEVORElOR19FUlJPUjpcbiAgICAgIGNhc2UgSi5CVUZGRVJfRlVMTF9FUlJPUjpcbiAgICAgIGNhc2UgSi5MRVZFTF9TV0lUQ0hfRVJST1I6XG4gICAgICBjYXNlIEouQlVGRkVSX1NUQUxMRURfRVJST1I6XG4gICAgICBjYXNlIEouQlVGRkVSX1NFRUtfT1ZFUl9IT0xFOlxuICAgICAgY2FzZSBKLkJVRkZFUl9OVURHRV9PTl9TVEFMTDpcbiAgICAgICAgdC5lcnJvckFjdGlvbiA9IEFuKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdC50eXBlID09PSB2ZS5LRVlfU1lTVEVNX0VSUk9SICYmICh0LmxldmVsUmV0cnkgPSAhMSwgdC5lcnJvckFjdGlvbiA9IEFuKCkpO1xuICB9XG4gIGdldFBsYXlsaXN0UmV0cnlPclN3aXRjaEFjdGlvbihlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLCBuID0gaGgoci5jb25maWcucGxheWxpc3RMb2FkUG9saWN5LCBlKSwgaSA9IHRoaXMucGxheWxpc3RFcnJvcisrO1xuICAgIGlmICh0YShuLCBpLCBlYShlKSwgZS5yZXNwb25zZSkpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IFp0LlJldHJ5UmVxdWVzdCxcbiAgICAgICAgZmxhZ3M6IHZyLk5vbmUsXG4gICAgICAgIHJldHJ5Q29uZmlnOiBuLFxuICAgICAgICByZXRyeUNvdW50OiBpXG4gICAgICB9O1xuICAgIGNvbnN0IGEgPSB0aGlzLmdldExldmVsU3dpdGNoQWN0aW9uKGUsIHQpO1xuICAgIHJldHVybiBuICYmIChhLnJldHJ5Q29uZmlnID0gbiwgYS5yZXRyeUNvdW50ID0gaSksIGE7XG4gIH1cbiAgZ2V0RnJhZ1JldHJ5T3JTd2l0Y2hBY3Rpb24oZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmhscywgciA9IHRoaXMuZ2V0VmFyaWFudExldmVsSW5kZXgoZS5mcmFnKSwgbiA9IHQubGV2ZWxzW3JdLCB7XG4gICAgICBmcmFnTG9hZFBvbGljeTogaSxcbiAgICAgIGtleUxvYWRQb2xpY3k6IG9cbiAgICB9ID0gdC5jb25maWcsIGEgPSBoaChqZyhlKSA/IG8gOiBpLCBlKSwgbCA9IHQubGV2ZWxzLnJlZHVjZSgodSwgZCkgPT4gdSArIGQuZnJhZ21lbnRFcnJvciwgMCk7XG4gICAgaWYgKG4gJiYgKGUuZGV0YWlscyAhPT0gSi5GUkFHX0dBUCAmJiBuLmZyYWdtZW50RXJyb3IrKywgIUtnKGUpICYmIHRhKGEsIGwsIGVhKGUpLCBlLnJlc3BvbnNlKSkpXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IFp0LlJldHJ5UmVxdWVzdCxcbiAgICAgICAgZmxhZ3M6IHZyLk5vbmUsXG4gICAgICAgIHJldHJ5Q29uZmlnOiBhLFxuICAgICAgICByZXRyeUNvdW50OiBsXG4gICAgICB9O1xuICAgIGNvbnN0IGMgPSB0aGlzLmdldExldmVsU3dpdGNoQWN0aW9uKGUsIHIpO1xuICAgIHJldHVybiBhICYmIChjLnJldHJ5Q29uZmlnID0gYSwgYy5yZXRyeUNvdW50ID0gbCksIGM7XG4gIH1cbiAgZ2V0TGV2ZWxTd2l0Y2hBY3Rpb24oZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmhscztcbiAgICB0ID09IG51bGwgJiYgKHQgPSByLmxvYWRMZXZlbCk7XG4gICAgY29uc3QgbiA9IHRoaXMuaGxzLmxldmVsc1t0XTtcbiAgICBpZiAobikge1xuICAgICAgdmFyIGksIG87XG4gICAgICBjb25zdCBjID0gZS5kZXRhaWxzO1xuICAgICAgbi5sb2FkRXJyb3IrKywgYyA9PT0gSi5CVUZGRVJfQVBQRU5EX0VSUk9SICYmIG4uZnJhZ21lbnRFcnJvcisrO1xuICAgICAgbGV0IHUgPSAtMTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGV2ZWxzOiBkLFxuICAgICAgICBsb2FkTGV2ZWw6IGgsXG4gICAgICAgIG1pbkF1dG9MZXZlbDogZixcbiAgICAgICAgbWF4QXV0b0xldmVsOiBwXG4gICAgICB9ID0gcjtcbiAgICAgICFyLmF1dG9MZXZlbEVuYWJsZWQgJiYgIXIuY29uZmlnLnByZXNlcnZlTWFudWFsTGV2ZWxPbkVycm9yICYmIChyLmxvYWRMZXZlbCA9IC0xKTtcbiAgICAgIGNvbnN0IHkgPSAoaSA9IGUuZnJhZykgPT0gbnVsbCA/IHZvaWQgMCA6IGkudHlwZSwgYiA9ICh5ID09PSBwZS5BVURJTyAmJiBjID09PSBKLkZSQUdfUEFSU0lOR19FUlJPUiB8fCBlLnNvdXJjZUJ1ZmZlck5hbWUgPT09IFwiYXVkaW9cIiAmJiAoYyA9PT0gSi5CVUZGRVJfQUREX0NPREVDX0VSUk9SIHx8IGMgPT09IEouQlVGRkVSX0FQUEVORF9FUlJPUikpICYmIGQuc29tZSgoe1xuICAgICAgICBhdWRpb0NvZGVjOiBIXG4gICAgICB9KSA9PiBuLmF1ZGlvQ29kZWMgIT09IEgpLCBBID0gZS5zb3VyY2VCdWZmZXJOYW1lID09PSBcInZpZGVvXCIgJiYgKGMgPT09IEouQlVGRkVSX0FERF9DT0RFQ19FUlJPUiB8fCBjID09PSBKLkJVRkZFUl9BUFBFTkRfRVJST1IpICYmIGQuc29tZSgoe1xuICAgICAgICBjb2RlY1NldDogSCxcbiAgICAgICAgYXVkaW9Db2RlYzogS1xuICAgICAgfSkgPT4gbi5jb2RlY1NldCAhPT0gSCAmJiBuLmF1ZGlvQ29kZWMgPT09IEspLCB7XG4gICAgICAgIHR5cGU6IEYsXG4gICAgICAgIGdyb3VwSWQ6IE1cbiAgICAgIH0gPSAobyA9IGUuY29udGV4dCkgIT0gbnVsbCA/IG8gOiB7fTtcbiAgICAgIGZvciAobGV0IEggPSBkLmxlbmd0aDsgSC0tOyApIHtcbiAgICAgICAgY29uc3QgSyA9IChIICsgaCkgJSBkLmxlbmd0aDtcbiAgICAgICAgaWYgKEsgIT09IGggJiYgSyA+PSBmICYmIEsgPD0gcCAmJiBkW0tdLmxvYWRFcnJvciA9PT0gMCkge1xuICAgICAgICAgIHZhciBhLCBsO1xuICAgICAgICAgIGNvbnN0IGogPSBkW0tdO1xuICAgICAgICAgIGlmIChjID09PSBKLkZSQUdfR0FQICYmIHkgPT09IHBlLk1BSU4gJiYgZS5mcmFnKSB7XG4gICAgICAgICAgICBjb25zdCBDID0gZFtLXS5kZXRhaWxzO1xuICAgICAgICAgICAgaWYgKEMpIHtcbiAgICAgICAgICAgICAgY29uc3QgayA9IEpzKGUuZnJhZywgQy5mcmFnbWVudHMsIGUuZnJhZy5zdGFydCk7XG4gICAgICAgICAgICAgIGlmIChrICE9IG51bGwgJiYgay5nYXApXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChGID09PSBLZS5BVURJT19UUkFDSyAmJiBqLmhhc0F1ZGlvR3JvdXAoTSkgfHwgRiA9PT0gS2UuU1VCVElUTEVfVFJBQ0sgJiYgai5oYXNTdWJ0aXRsZUdyb3VwKE0pKVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICh5ID09PSBwZS5BVURJTyAmJiAoYSA9IG4uYXVkaW9Hcm91cHMpICE9IG51bGwgJiYgYS5zb21lKChDKSA9PiBqLmhhc0F1ZGlvR3JvdXAoQykpIHx8IHkgPT09IHBlLlNVQlRJVExFICYmIChsID0gbi5zdWJ0aXRsZUdyb3VwcykgIT0gbnVsbCAmJiBsLnNvbWUoKEMpID0+IGouaGFzU3VidGl0bGVHcm91cChDKSkgfHwgYiAmJiBuLmF1ZGlvQ29kZWMgPT09IGouYXVkaW9Db2RlYyB8fCBBICYmIG4uY29kZWNTZXQgPT09IGouY29kZWNTZXQgfHwgIWIgJiYgbi5jb2RlY1NldCAhPT0gai5jb2RlY1NldClcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHUgPSBLO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodSA+IC0xICYmIHIubG9hZExldmVsICE9PSB1KVxuICAgICAgICByZXR1cm4gZS5sZXZlbFJldHJ5ID0gITAsIHRoaXMucGxheWxpc3RFcnJvciA9IDAsIHtcbiAgICAgICAgICBhY3Rpb246IFp0LlNlbmRBbHRlcm5hdGVUb1BlbmFsdHlCb3gsXG4gICAgICAgICAgZmxhZ3M6IHZyLk5vbmUsXG4gICAgICAgICAgbmV4dEF1dG9MZXZlbDogdVxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBadC5TZW5kQWx0ZXJuYXRlVG9QZW5hbHR5Qm94LFxuICAgICAgZmxhZ3M6IHZyLk1vdmVBbGxBbHRlcm5hdGVzTWF0Y2hpbmdIb3N0XG4gICAgfTtcbiAgfVxuICBvbkVycm9yT3V0KGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBzd2l0Y2ggKChyID0gdC5lcnJvckFjdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IHIuYWN0aW9uKSB7XG4gICAgICBjYXNlIFp0LkRvTm90aGluZzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFp0LlNlbmRBbHRlcm5hdGVUb1BlbmFsdHlCb3g6XG4gICAgICAgIHRoaXMuc2VuZEFsdGVybmF0ZVRvUGVuYWx0eUJveCh0KSwgIXQuZXJyb3JBY3Rpb24ucmVzb2x2ZWQgJiYgdC5kZXRhaWxzICE9PSBKLkZSQUdfR0FQID8gdC5mYXRhbCA9ICEwIDogL01lZGlhU291cmNlIHJlYWR5U3RhdGU6IGVuZGVkLy50ZXN0KHQuZXJyb3IubWVzc2FnZSkgJiYgKHRoaXMud2FybihgTWVkaWFTb3VyY2UgZW5kZWQgYWZ0ZXIgXCIke3Quc291cmNlQnVmZmVyTmFtZX1cIiBzb3VyY2VCdWZmZXIgYXBwZW5kIGVycm9yLiBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBtZWRpYSBlcnJvci5gKSwgdGhpcy5obHMucmVjb3Zlck1lZGlhRXJyb3IoKSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAodC5mYXRhbCkge1xuICAgICAgdGhpcy5obHMuc3RvcExvYWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgc2VuZEFsdGVybmF0ZVRvUGVuYWx0eUJveChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuaGxzLCByID0gZS5lcnJvckFjdGlvbjtcbiAgICBpZiAoIXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgZmxhZ3M6IG5cbiAgICB9ID0gciwgaSA9IHIubmV4dEF1dG9MZXZlbDtcbiAgICBzd2l0Y2ggKG4pIHtcbiAgICAgIGNhc2UgdnIuTm9uZTpcbiAgICAgICAgdGhpcy5zd2l0Y2hMZXZlbChlLCBpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIHZyLk1vdmVBbGxBbHRlcm5hdGVzTWF0Y2hpbmdIRENQOiB7XG4gICAgICAgIGNvbnN0IGwgPSB0aGlzLmdldFZhcmlhbnRMZXZlbEluZGV4KGUuZnJhZyksIGMgPSB0LmxldmVsc1tsXSwgdSA9IGMgPT0gbnVsbCA/IHZvaWQgMCA6IGMuYXR0cnNbXCJIRENQLUxFVkVMXCJdO1xuICAgICAgICBpZiAoci5oZGNwTGV2ZWwgPSB1LCB1ID09PSBcIk5PTkVcIilcbiAgICAgICAgICB0aGlzLndhcm4oXCJIRENQIHBvbGljeSByZXN0aWN0ZWQgb3V0cHV0IHdpdGggSERDUC1MRVZFTD1OT05FXCIpO1xuICAgICAgICBlbHNlIGlmICh1KSB7XG4gICAgICAgICAgdC5tYXhIZGNwTGV2ZWwgPSBjY1tjYy5pbmRleE9mKHUpIC0gMV0sIHIucmVzb2x2ZWQgPSAhMCwgdGhpcy53YXJuKGBSZXN0cmljdGluZyBwbGF5YmFjayB0byBIRENQLUxFVkVMIG9mIFwiJHt0Lm1heEhkY3BMZXZlbH1cIiBvciBsb3dlcmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZmFsbHRocm91Z2hcbiAgICAgIGNhc2UgdnIuTW92ZUFsbEFsdGVybmF0ZXNNYXRjaGluZ0tleToge1xuICAgICAgICBjb25zdCBsID0gZS5kZWNyeXB0ZGF0YTtcbiAgICAgICAgaWYgKGwpIHtcbiAgICAgICAgICBjb25zdCBjID0gdGhpcy5obHMubGV2ZWxzLCB1ID0gYy5sZW5ndGg7XG4gICAgICAgICAgZm9yIChsZXQgaCA9IHU7IGgtLTsgKVxuICAgICAgICAgICAgaWYgKHRoaXMudmFyaWFudEhhc0tleShjW2hdLCBsKSkge1xuICAgICAgICAgICAgICB2YXIgbywgYTtcbiAgICAgICAgICAgICAgdGhpcy5sb2coYEJhbm5lZCBrZXkgZm91bmQgaW4gbGV2ZWwgJHtofSAoJHtjW2hdLmJpdHJhdGV9YnBzKSBvciBhdWRpbyBncm91cCBcIiR7KG8gPSBjW2hdLmF1ZGlvR3JvdXBzKSA9PSBudWxsID8gdm9pZCAwIDogby5qb2luKFwiLFwiKX1cIiAoJHsoYSA9IGUuZnJhZykgPT0gbnVsbCA/IHZvaWQgMCA6IGEudHlwZX0gZnJhZ21lbnQpICR7ZnIobC5rZXlJZCB8fCBbXSl9YCksIGNbaF0uZnJhZ21lbnRFcnJvcisrLCBjW2hdLmxvYWRFcnJvcisrLCB0aGlzLmxvZyhgUmVtb3ZpbmcgbGV2ZWwgJHtofSB3aXRoIGtleSBlcnJvciAoJHtlLmVycm9yfSlgKSwgdGhpcy5obHMucmVtb3ZlTGV2ZWwoaCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZCA9IGUuZnJhZztcbiAgICAgICAgICBpZiAodGhpcy5obHMubGV2ZWxzLmxlbmd0aCA8IHUpXG4gICAgICAgICAgICByLnJlc29sdmVkID0gITA7XG4gICAgICAgICAgZWxzZSBpZiAoZCAmJiBkLnR5cGUgIT09IHBlLk1BSU4pIHtcbiAgICAgICAgICAgIGNvbnN0IGggPSBkLmRlY3J5cHRkYXRhO1xuICAgICAgICAgICAgaCAmJiAhbC5tYXRjaGVzKGgpICYmIChyLnJlc29sdmVkID0gITApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgci5yZXNvbHZlZCB8fCB0aGlzLnN3aXRjaExldmVsKGUsIGkpO1xuICB9XG4gIHN3aXRjaExldmVsKGUsIHQpIHtcbiAgICBpZiAodCAhPT0gdm9pZCAwICYmIGUuZXJyb3JBY3Rpb24gJiYgKHRoaXMud2Fybihgc3dpdGNoaW5nIHRvIGxldmVsICR7dH0gYWZ0ZXIgJHtlLmRldGFpbHN9YCksIHRoaXMuaGxzLm5leHRBdXRvTGV2ZWwgPSB0LCBlLmVycm9yQWN0aW9uLnJlc29sdmVkID0gITAsIHRoaXMuaGxzLm5leHRMb2FkTGV2ZWwgPSB0aGlzLmhscy5uZXh0QXV0b0xldmVsLCBlLmRldGFpbHMgPT09IEouQlVGRkVSX0FERF9DT0RFQ19FUlJPUiAmJiBlLm1pbWVUeXBlICYmIGUuc291cmNlQnVmZmVyTmFtZSAhPT0gXCJhdWRpb3ZpZGVvXCIpKSB7XG4gICAgICBjb25zdCByID0gbGMoZS5taW1lVHlwZSksIG4gPSB0aGlzLmhscy5sZXZlbHM7XG4gICAgICBmb3IgKGxldCBpID0gbi5sZW5ndGg7IGktLTsgKVxuICAgICAgICBuW2ldW2Ake2Uuc291cmNlQnVmZmVyTmFtZX1Db2RlY2BdID09PSByICYmICh0aGlzLmxvZyhgUmVtb3ZpbmcgbGV2ZWwgJHtpfSBmb3IgJHtlLmRldGFpbHN9IChcIiR7cn1cIiBub3Qgc3VwcG9ydGVkKWApLCB0aGlzLmhscy5yZW1vdmVMZXZlbChpKSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBBbihzKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAgYWN0aW9uOiBadC5Eb05vdGhpbmcsXG4gICAgZmxhZ3M6IHZyLk5vbmVcbiAgfTtcbiAgcmV0dXJuIHMgJiYgKGUucmVzb2x2ZWQgPSAhMCksIGU7XG59XG52YXIgSHQgPSB7XG4gIE5PVF9MT0FERUQ6IFwiTk9UX0xPQURFRFwiLFxuICBBUFBFTkRJTkc6IFwiQVBQRU5ESU5HXCIsXG4gIFBBUlRJQUw6IFwiUEFSVElBTFwiLFxuICBPSzogXCJPS1wiXG59O1xuY2xhc3MgVGIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5hY3RpdmVQYXJ0TGlzdHMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgdGhpcy5lbmRMaXN0RnJhZ21lbnRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuZnJhZ21lbnRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMudGltZVJhbmdlcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLmJ1ZmZlclBhZGRpbmcgPSAwLjIsIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmhhc0dhcHMgPSAhMSwgdGhpcy5obHMgPSBlLCB0aGlzLl9yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIF9yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlICYmIChlLm9uKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub24oSS5CVUZGRVJfQVBQRU5ERUQsIHRoaXMub25CdWZmZXJBcHBlbmRlZCwgdGhpcyksIGUub24oSS5GUkFHX0JVRkZFUkVELCB0aGlzLm9uRnJhZ0J1ZmZlcmVkLCB0aGlzKSwgZS5vbihJLkZSQUdfTE9BREVELCB0aGlzLm9uRnJhZ0xvYWRlZCwgdGhpcykpO1xuICB9XG4gIF91bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUgJiYgKGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0FQUEVOREVELCB0aGlzLm9uQnVmZmVyQXBwZW5kZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfQlVGRkVSRUQsIHRoaXMub25GcmFnQnVmZmVyZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfTE9BREVELCB0aGlzLm9uRnJhZ0xvYWRlZCwgdGhpcykpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fdW5yZWdpc3Rlckxpc3RlbmVycygpLCB0aGlzLmhscyA9IC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmZyYWdtZW50cyA9IC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmFjdGl2ZVBhcnRMaXN0cyA9IC8vIEB0cy1pZ25vcmVcbiAgICB0aGlzLmVuZExpc3RGcmFnbWVudHMgPSB0aGlzLnRpbWVSYW5nZXMgPSBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBGcmFnbWVudCBvciBQYXJ0IHdpdGggYW4gYXBwZW5kZWQgcmFuZ2UgdGhhdCBtYXRjaGVzIHRoZSBwb3NpdGlvbiBhbmQgbGV2ZWxUeXBlXG4gICAqIE90aGVyd2lzZSwgcmV0dXJuIG51bGxcbiAgICovXG4gIGdldEFwcGVuZGVkRnJhZyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuYWN0aXZlUGFydExpc3RzW3RdO1xuICAgIGlmIChyKVxuICAgICAgZm9yIChsZXQgbiA9IHIubGVuZ3RoOyBuLS07ICkge1xuICAgICAgICBjb25zdCBpID0gcltuXTtcbiAgICAgICAgaWYgKCFpKVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBpZiAoaS5zdGFydCA8PSBlICYmIGUgPD0gaS5lbmQgJiYgaS5sb2FkZWQpXG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0QnVmZmVyZWRGcmFnKGUsIHQpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm4gYSBidWZmZXJlZCBGcmFnbWVudCB0aGF0IG1hdGNoZXMgdGhlIHBvc2l0aW9uIGFuZCBsZXZlbFR5cGUuXG4gICAqIEEgYnVmZmVyZWQgRnJhZ21lbnQgaXMgb25lIHdob3NlIGxvYWRpbmcsIHBhcnNpbmcgYW5kIGFwcGVuZGluZyBpcyBkb25lIChjb21wbGV0ZWQgb3IgXCJwYXJ0aWFsXCIgbWVhbmluZyBhYm9ydGVkKS5cbiAgICogSWYgbm90IGZvdW5kIGFueSBGcmFnbWVudCwgcmV0dXJuIG51bGxcbiAgICovXG4gIGdldEJ1ZmZlcmVkRnJhZyhlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RnJhZ0F0UG9zKGUsIHQsICEwKTtcbiAgfVxuICBnZXRGcmFnQXRQb3MoZSwgdCwgcikge1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWdtZW50czogblxuICAgIH0gPSB0aGlzLCBpID0gT2JqZWN0LmtleXMobik7XG4gICAgZm9yIChsZXQgbyA9IGkubGVuZ3RoOyBvLS07ICkge1xuICAgICAgY29uc3QgYSA9IG5baVtvXV07XG4gICAgICBpZiAoKGEgPT0gbnVsbCA/IHZvaWQgMCA6IGEuYm9keS50eXBlKSA9PT0gdCAmJiAoIXIgfHwgYS5idWZmZXJlZCkpIHtcbiAgICAgICAgY29uc3QgbCA9IGEuYm9keTtcbiAgICAgICAgaWYgKGwuc3RhcnQgPD0gZSAmJiBlIDw9IGwuZW5kKVxuICAgICAgICAgIHJldHVybiBsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvKipcbiAgICogUGFydGlhbCBmcmFnbWVudHMgZWZmZWN0ZWQgYnkgY29kZWQgZnJhbWUgZXZpY3Rpb24gd2lsbCBiZSByZW1vdmVkXG4gICAqIFRoZSBicm93c2VyIHdpbGwgdW5sb2FkIHBhcnRzIG9mIHRoZSBidWZmZXIgdG8gZnJlZSB1cCBtZW1vcnkgZm9yIG5ldyBidWZmZXIgZGF0YVxuICAgKiBGcmFnbWVudHMgd2lsbCBuZWVkIHRvIGJlIHJlbG9hZGVkIHdoZW4gdGhlIGJ1ZmZlciBpcyBmcmVlZCB1cCwgcmVtb3ZpbmcgcGFydGlhbCBmcmFnbWVudHMgd2lsbCBhbGxvdyB0aGVtIHRvIHJlbG9hZChzaW5jZSB0aGVyZSBtaWdodCBiZSBwYXJ0cyB0aGF0IGFyZSBzdGlsbCBwbGF5YWJsZSlcbiAgICovXG4gIGRldGVjdEV2aWN0ZWRGcmFnbWVudHMoZSwgdCwgciwgbiwgaSkge1xuICAgIHRoaXMudGltZVJhbmdlcyAmJiAodGhpcy50aW1lUmFuZ2VzW2VdID0gdCk7XG4gICAgY29uc3QgbyA9IChuID09IG51bGwgPyB2b2lkIDAgOiBuLmZyYWdtZW50LnNuKSB8fCAtMTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmZyYWdtZW50cykuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgY29uc3QgbCA9IHRoaXMuZnJhZ21lbnRzW2FdO1xuICAgICAgaWYgKCFsIHx8IG8gPj0gbC5ib2R5LnNuKVxuICAgICAgICByZXR1cm47XG4gICAgICBpZiAoIWwuYnVmZmVyZWQgJiYgKCFsLmxvYWRlZCB8fCBpKSkge1xuICAgICAgICBsLmJvZHkudHlwZSA9PT0gciAmJiB0aGlzLnJlbW92ZUZyYWdtZW50KGwuYm9keSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGMgPSBsLnJhbmdlW2VdO1xuICAgICAgaWYgKGMpIHtcbiAgICAgICAgaWYgKGMudGltZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZUZyYWdtZW50KGwuYm9keSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGMudGltZS5zb21lKCh1KSA9PiB7XG4gICAgICAgICAgY29uc3QgZCA9ICF0aGlzLmlzVGltZUJ1ZmZlcmVkKHUuc3RhcnRQVFMsIHUuZW5kUFRTLCB0KTtcbiAgICAgICAgICByZXR1cm4gZCAmJiB0aGlzLnJlbW92ZUZyYWdtZW50KGwuYm9keSksIGQ7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGZyYWdtZW50IHBhc3NlZCBpbiBpcyBsb2FkZWQgaW4gdGhlIGJ1ZmZlciBwcm9wZXJseVxuICAgKiBQYXJ0aWFsbHkgbG9hZGVkIGZyYWdtZW50cyB3aWxsIGJlIHJlZ2lzdGVyZWQgYXMgYSBwYXJ0aWFsIGZyYWdtZW50XG4gICAqL1xuICBkZXRlY3RQYXJ0aWFsRnJhZ21lbnRzKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy50aW1lUmFuZ2VzO1xuICAgIGlmICghdCB8fCBlLmZyYWcuc24gPT09IFwiaW5pdFNlZ21lbnRcIilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByID0gZS5mcmFnLCBuID0gZm4ociksIGkgPSB0aGlzLmZyYWdtZW50c1tuXTtcbiAgICBpZiAoIWkgfHwgaS5idWZmZXJlZCAmJiByLmdhcClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBvID0gIXIucmVsdXJsO1xuICAgIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGEpID0+IHtcbiAgICAgIGNvbnN0IGwgPSByLmVsZW1lbnRhcnlTdHJlYW1zW2FdO1xuICAgICAgaWYgKCFsKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBjID0gdFthXSwgdSA9IG8gfHwgbC5wYXJ0aWFsID09PSAhMDtcbiAgICAgIGkucmFuZ2VbYV0gPSB0aGlzLmdldEJ1ZmZlcmVkVGltZXMociwgZS5wYXJ0LCB1LCBjKTtcbiAgICB9KSwgaS5sb2FkZWQgPSBudWxsLCBPYmplY3Qua2V5cyhpLnJhbmdlKS5sZW5ndGggPyAoaS5idWZmZXJlZCA9ICEwLCAoaS5ib2R5LmVuZExpc3QgPSByLmVuZExpc3QgfHwgaS5ib2R5LmVuZExpc3QpICYmICh0aGlzLmVuZExpc3RGcmFnbWVudHNbaS5ib2R5LnR5cGVdID0gaSksIEhpKGkpIHx8IHRoaXMucmVtb3ZlUGFydHMoci5zbiAtIDEsIHIudHlwZSkpIDogdGhpcy5yZW1vdmVGcmFnbWVudChpLmJvZHkpO1xuICB9XG4gIHJlbW92ZVBhcnRzKGUsIHQpIHtcbiAgICBjb25zdCByID0gdGhpcy5hY3RpdmVQYXJ0TGlzdHNbdF07XG4gICAgciAmJiAodGhpcy5hY3RpdmVQYXJ0TGlzdHNbdF0gPSBnaChyLCAobikgPT4gbi5mcmFnbWVudC5zbiA+PSBlKSk7XG4gIH1cbiAgZnJhZ0J1ZmZlcmVkKGUsIHQpIHtcbiAgICBjb25zdCByID0gZm4oZSk7XG4gICAgbGV0IG4gPSB0aGlzLmZyYWdtZW50c1tyXTtcbiAgICAhbiAmJiB0ICYmIChuID0gdGhpcy5mcmFnbWVudHNbcl0gPSB7XG4gICAgICBib2R5OiBlLFxuICAgICAgYXBwZW5kZWRQVFM6IG51bGwsXG4gICAgICBsb2FkZWQ6IG51bGwsXG4gICAgICBidWZmZXJlZDogITEsXG4gICAgICByYW5nZTogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB9LCBlLmdhcCAmJiAodGhpcy5oYXNHYXBzID0gITApKSwgbiAmJiAobi5sb2FkZWQgPSBudWxsLCBuLmJ1ZmZlcmVkID0gITApO1xuICB9XG4gIGdldEJ1ZmZlcmVkVGltZXMoZSwgdCwgciwgbikge1xuICAgIGNvbnN0IGkgPSB7XG4gICAgICB0aW1lOiBbXSxcbiAgICAgIHBhcnRpYWw6IHJcbiAgICB9LCBvID0gZS5zdGFydCwgYSA9IGUuZW5kLCBsID0gZS5taW5FbmRQVFMgfHwgYSwgYyA9IGUubWF4U3RhcnRQVFMgfHwgbztcbiAgICBmb3IgKGxldCB1ID0gMDsgdSA8IG4ubGVuZ3RoOyB1KyspIHtcbiAgICAgIGNvbnN0IGQgPSBuLnN0YXJ0KHUpIC0gdGhpcy5idWZmZXJQYWRkaW5nLCBoID0gbi5lbmQodSkgKyB0aGlzLmJ1ZmZlclBhZGRpbmc7XG4gICAgICBpZiAoYyA+PSBkICYmIGwgPD0gaCkge1xuICAgICAgICBpLnRpbWUucHVzaCh7XG4gICAgICAgICAgc3RhcnRQVFM6IE1hdGgubWF4KG8sIG4uc3RhcnQodSkpLFxuICAgICAgICAgIGVuZFBUUzogTWF0aC5taW4oYSwgbi5lbmQodSkpXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSBpZiAobyA8IGggJiYgYSA+IGQpIHtcbiAgICAgICAgY29uc3QgZiA9IE1hdGgubWF4KG8sIG4uc3RhcnQodSkpLCBwID0gTWF0aC5taW4oYSwgbi5lbmQodSkpO1xuICAgICAgICBwID4gZiAmJiAoaS5wYXJ0aWFsID0gITAsIGkudGltZS5wdXNoKHtcbiAgICAgICAgICBzdGFydFBUUzogZixcbiAgICAgICAgICBlbmRQVFM6IHBcbiAgICAgICAgfSkpO1xuICAgICAgfSBlbHNlIGlmIChhIDw9IGQpXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gaTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgcGFydGlhbCBmcmFnbWVudCBmb3IgYSBjZXJ0YWluIHRpbWVcbiAgICovXG4gIGdldFBhcnRpYWxGcmFnbWVudChlKSB7XG4gICAgbGV0IHQgPSBudWxsLCByLCBuLCBpLCBvID0gMDtcbiAgICBjb25zdCB7XG4gICAgICBidWZmZXJQYWRkaW5nOiBhLFxuICAgICAgZnJhZ21lbnRzOiBsXG4gICAgfSA9IHRoaXM7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGwpLmZvckVhY2goKGMpID0+IHtcbiAgICAgIGNvbnN0IHUgPSBsW2NdO1xuICAgICAgdSAmJiBIaSh1KSAmJiAobiA9IHUuYm9keS5zdGFydCAtIGEsIGkgPSB1LmJvZHkuZW5kICsgYSwgZSA+PSBuICYmIGUgPD0gaSAmJiAociA9IE1hdGgubWluKGUgLSBuLCBpIC0gZSksIG8gPD0gciAmJiAodCA9IHUuYm9keSwgbyA9IHIpKSk7XG4gICAgfSksIHQ7XG4gIH1cbiAgaXNFbmRMaXN0QXBwZW5kZWQoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmVuZExpc3RGcmFnbWVudHNbZV07XG4gICAgcmV0dXJuIHQgIT09IHZvaWQgMCAmJiAodC5idWZmZXJlZCB8fCBIaSh0KSk7XG4gIH1cbiAgZ2V0U3RhdGUoZSkge1xuICAgIGNvbnN0IHQgPSBmbihlKSwgciA9IHRoaXMuZnJhZ21lbnRzW3RdO1xuICAgIHJldHVybiByID8gci5idWZmZXJlZCA/IEhpKHIpID8gSHQuUEFSVElBTCA6IEh0Lk9LIDogSHQuQVBQRU5ESU5HIDogSHQuTk9UX0xPQURFRDtcbiAgfVxuICBpc1RpbWVCdWZmZXJlZChlLCB0LCByKSB7XG4gICAgbGV0IG4sIGk7XG4gICAgZm9yIChsZXQgbyA9IDA7IG8gPCByLmxlbmd0aDsgbysrKSB7XG4gICAgICBpZiAobiA9IHIuc3RhcnQobykgLSB0aGlzLmJ1ZmZlclBhZGRpbmcsIGkgPSByLmVuZChvKSArIHRoaXMuYnVmZmVyUGFkZGluZywgZSA+PSBuICYmIHQgPD0gaSlcbiAgICAgICAgcmV0dXJuICEwO1xuICAgICAgaWYgKHQgPD0gbilcbiAgICAgICAgcmV0dXJuICExO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5yZW1vdmVBbGxGcmFnbWVudHMoKTtcbiAgfVxuICBvbkZyYWdMb2FkZWQoZSwgdCkge1xuICAgIGlmICh0LmZyYWcuc24gPT09IFwiaW5pdFNlZ21lbnRcIiB8fCB0LmZyYWcuYml0cmF0ZVRlc3QpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHQuZnJhZywgbiA9IHQucGFydCA/IG51bGwgOiB0LCBpID0gZm4ocik7XG4gICAgdGhpcy5mcmFnbWVudHNbaV0gPSB7XG4gICAgICBib2R5OiByLFxuICAgICAgYXBwZW5kZWRQVFM6IG51bGwsXG4gICAgICBsb2FkZWQ6IG4sXG4gICAgICBidWZmZXJlZDogITEsXG4gICAgICByYW5nZTogLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbClcbiAgICB9O1xuICB9XG4gIG9uQnVmZmVyQXBwZW5kZWQoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IHIsXG4gICAgICBwYXJ0OiBuLFxuICAgICAgdGltZVJhbmdlczogaSxcbiAgICAgIHR5cGU6IG9cbiAgICB9ID0gdDtcbiAgICBpZiAoci5zbiA9PT0gXCJpbml0U2VnbWVudFwiKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGEgPSByLnR5cGU7XG4gICAgaWYgKG4pIHtcbiAgICAgIGxldCBjID0gdGhpcy5hY3RpdmVQYXJ0TGlzdHNbYV07XG4gICAgICBjIHx8ICh0aGlzLmFjdGl2ZVBhcnRMaXN0c1thXSA9IGMgPSBbXSksIGMucHVzaChuKTtcbiAgICB9XG4gICAgdGhpcy50aW1lUmFuZ2VzID0gaTtcbiAgICBjb25zdCBsID0gaVtvXTtcbiAgICB0aGlzLmRldGVjdEV2aWN0ZWRGcmFnbWVudHMobywgbCwgYSwgbik7XG4gIH1cbiAgb25GcmFnQnVmZmVyZWQoZSwgdCkge1xuICAgIHRoaXMuZGV0ZWN0UGFydGlhbEZyYWdtZW50cyh0KTtcbiAgfVxuICBoYXNGcmFnbWVudChlKSB7XG4gICAgY29uc3QgdCA9IGZuKGUpO1xuICAgIHJldHVybiAhIXRoaXMuZnJhZ21lbnRzW3RdO1xuICB9XG4gIGhhc0ZyYWdtZW50cyhlKSB7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZ21lbnRzOiB0XG4gICAgfSA9IHRoaXMsIHIgPSBPYmplY3Qua2V5cyh0KTtcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm4gci5sZW5ndGggPiAwO1xuICAgIGZvciAobGV0IG4gPSByLmxlbmd0aDsgbi0tOyApIHtcbiAgICAgIGNvbnN0IGkgPSB0W3Jbbl1dO1xuICAgICAgaWYgKChpID09IG51bGwgPyB2b2lkIDAgOiBpLmJvZHkudHlwZSkgPT09IGUpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGhhc1BhcnRzKGUpIHtcbiAgICB2YXIgdDtcbiAgICByZXR1cm4gISEoKHQgPSB0aGlzLmFjdGl2ZVBhcnRMaXN0c1tlXSkgIT0gbnVsbCAmJiB0Lmxlbmd0aCk7XG4gIH1cbiAgcmVtb3ZlRnJhZ21lbnRzSW5SYW5nZShlLCB0LCByLCBuLCBpKSB7XG4gICAgbiAmJiAhdGhpcy5oYXNHYXBzIHx8IE9iamVjdC5rZXlzKHRoaXMuZnJhZ21lbnRzKS5mb3JFYWNoKChvKSA9PiB7XG4gICAgICBjb25zdCBhID0gdGhpcy5mcmFnbWVudHNbb107XG4gICAgICBpZiAoIWEpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGwgPSBhLmJvZHk7XG4gICAgICBsLnR5cGUgIT09IHIgfHwgbiAmJiAhbC5nYXAgfHwgbC5zdGFydCA8IHQgJiYgbC5lbmQgPiBlICYmIChhLmJ1ZmZlcmVkIHx8IGkpICYmIHRoaXMucmVtb3ZlRnJhZ21lbnQobCk7XG4gICAgfSk7XG4gIH1cbiAgcmVtb3ZlRnJhZ21lbnQoZSkge1xuICAgIGNvbnN0IHQgPSBmbihlKTtcbiAgICBlLmNsZWFyRWxlbWVudGFyeVN0cmVhbUluZm8oKTtcbiAgICBjb25zdCByID0gdGhpcy5hY3RpdmVQYXJ0TGlzdHNbZS50eXBlXTtcbiAgICBpZiAocikge1xuICAgICAgY29uc3QgbiA9IGUuc247XG4gICAgICB0aGlzLmFjdGl2ZVBhcnRMaXN0c1tlLnR5cGVdID0gZ2gociwgKGkpID0+IGkuZnJhZ21lbnQuc24gIT09IG4pO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5mcmFnbWVudHNbdF0sIGUuZW5kTGlzdCAmJiBkZWxldGUgdGhpcy5lbmRMaXN0RnJhZ21lbnRzW2UudHlwZV07XG4gIH1cbiAgcmVtb3ZlQWxsRnJhZ21lbnRzKCkge1xuICAgIHZhciBlO1xuICAgIHRoaXMuZnJhZ21lbnRzID0gLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksIHRoaXMuZW5kTGlzdEZyYWdtZW50cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLmFjdGl2ZVBhcnRMaXN0cyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLmhhc0dhcHMgPSAhMTtcbiAgICBjb25zdCB0ID0gKGUgPSB0aGlzLmhscykgPT0gbnVsbCB8fCAoZSA9IGUubGF0ZXN0TGV2ZWxEZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogZS5wYXJ0TGlzdDtcbiAgICB0ICYmIHQuZm9yRWFjaCgocikgPT4gci5jbGVhckVsZW1lbnRhcnlTdHJlYW1JbmZvKCkpO1xuICB9XG59XG5mdW5jdGlvbiBIaShzKSB7XG4gIHZhciBlLCB0LCByO1xuICByZXR1cm4gcy5idWZmZXJlZCAmJiAhIShzLmJvZHkuZ2FwIHx8IChlID0gcy5yYW5nZS52aWRlbykgIT0gbnVsbCAmJiBlLnBhcnRpYWwgfHwgKHQgPSBzLnJhbmdlLmF1ZGlvKSAhPSBudWxsICYmIHQucGFydGlhbCB8fCAociA9IHMucmFuZ2UuYXVkaW92aWRlbykgIT0gbnVsbCAmJiByLnBhcnRpYWwpO1xufVxuZnVuY3Rpb24gZm4ocykge1xuICByZXR1cm4gYCR7cy50eXBlfV8ke3MubGV2ZWx9XyR7cy5zbn1gO1xufVxuZnVuY3Rpb24gZ2gocywgZSkge1xuICByZXR1cm4gcy5maWx0ZXIoKHQpID0+IHtcbiAgICBjb25zdCByID0gZSh0KTtcbiAgICByZXR1cm4gciB8fCB0LmNsZWFyRWxlbWVudGFyeVN0cmVhbUluZm8oKSwgcjtcbiAgfSk7XG59XG52YXIgT3MgPSB7XG4gIGNiYzogMCxcbiAgY3RyOiAxXG59O1xuY2xhc3Mgd2Ige1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgdGhpcy5zdWJ0bGUgPSB2b2lkIDAsIHRoaXMuYWVzSVYgPSB2b2lkIDAsIHRoaXMuYWVzTW9kZSA9IHZvaWQgMCwgdGhpcy5zdWJ0bGUgPSBlLCB0aGlzLmFlc0lWID0gdCwgdGhpcy5hZXNNb2RlID0gcjtcbiAgfVxuICBkZWNyeXB0KGUsIHQpIHtcbiAgICBzd2l0Y2ggKHRoaXMuYWVzTW9kZSkge1xuICAgICAgY2FzZSBPcy5jYmM6XG4gICAgICAgIHJldHVybiB0aGlzLnN1YnRsZS5kZWNyeXB0KHtcbiAgICAgICAgICBuYW1lOiBcIkFFUy1DQkNcIixcbiAgICAgICAgICBpdjogdGhpcy5hZXNJVlxuICAgICAgICB9LCB0LCBlKTtcbiAgICAgIGNhc2UgT3MuY3RyOlxuICAgICAgICByZXR1cm4gdGhpcy5zdWJ0bGUuZGVjcnlwdChcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBcIkFFUy1DVFJcIixcbiAgICAgICAgICAgIGNvdW50ZXI6IHRoaXMuYWVzSVYsXG4gICAgICAgICAgICBsZW5ndGg6IDY0XG4gICAgICAgICAgfSxcbiAgICAgICAgICAvLzY0IDogTklTVCBTUDgwMC0zOEEgc3RhbmRhcmQgc3VnZ2VzdHMgdGhhdCB0aGUgY291bnRlciBzaG91bGQgb2NjdXB5IGhhbGYgb2YgdGhlIGNvdW50ZXIgYmxvY2tcbiAgICAgICAgICB0LFxuICAgICAgICAgIGVcbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgW0FFU0NyeXB0b10gaW52YWxpZCBhZXMgbW9kZSAke3RoaXMuYWVzTW9kZX1gKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIEFiKHMpIHtcbiAgY29uc3QgZSA9IHMuYnl0ZUxlbmd0aCwgdCA9IGUgJiYgbmV3IERhdGFWaWV3KHMuYnVmZmVyKS5nZXRVaW50OChlIC0gMSk7XG4gIHJldHVybiB0ID8gcy5zbGljZSgwLCBlIC0gdCkgOiBzO1xufVxuY2xhc3MgSWIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJjb24gPSBbMCwgMSwgMiwgNCwgOCwgMTYsIDMyLCA2NCwgMTI4LCAyNywgNTRdLCB0aGlzLnN1Yk1peCA9IFtuZXcgVWludDMyQXJyYXkoMjU2KSwgbmV3IFVpbnQzMkFycmF5KDI1NiksIG5ldyBVaW50MzJBcnJheSgyNTYpLCBuZXcgVWludDMyQXJyYXkoMjU2KV0sIHRoaXMuaW52U3ViTWl4ID0gW25ldyBVaW50MzJBcnJheSgyNTYpLCBuZXcgVWludDMyQXJyYXkoMjU2KSwgbmV3IFVpbnQzMkFycmF5KDI1NiksIG5ldyBVaW50MzJBcnJheSgyNTYpXSwgdGhpcy5zQm94ID0gbmV3IFVpbnQzMkFycmF5KDI1NiksIHRoaXMuaW52U0JveCA9IG5ldyBVaW50MzJBcnJheSgyNTYpLCB0aGlzLmtleSA9IG5ldyBVaW50MzJBcnJheSgwKSwgdGhpcy5rc1Jvd3MgPSAwLCB0aGlzLmtleVNpemUgPSAwLCB0aGlzLmtleVNjaGVkdWxlID0gdm9pZCAwLCB0aGlzLmludktleVNjaGVkdWxlID0gdm9pZCAwLCB0aGlzLmluaXRUYWJsZSgpO1xuICB9XG4gIC8vIFVzaW5nIHZpZXcuZ2V0VWludDMyKCkgYWxzbyBzd2FwcyB0aGUgYnl0ZSBvcmRlci5cbiAgdWludDhBcnJheVRvVWludDMyQXJyYXlfKGUpIHtcbiAgICBjb25zdCB0ID0gbmV3IERhdGFWaWV3KGUpLCByID0gbmV3IFVpbnQzMkFycmF5KDQpO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgNDsgbisrKVxuICAgICAgcltuXSA9IHQuZ2V0VWludDMyKG4gKiA0KTtcbiAgICByZXR1cm4gcjtcbiAgfVxuICBpbml0VGFibGUoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuc0JveCwgdCA9IHRoaXMuaW52U0JveCwgciA9IHRoaXMuc3ViTWl4LCBuID0gclswXSwgaSA9IHJbMV0sIG8gPSByWzJdLCBhID0gclszXSwgbCA9IHRoaXMuaW52U3ViTWl4LCBjID0gbFswXSwgdSA9IGxbMV0sIGQgPSBsWzJdLCBoID0gbFszXSwgZiA9IG5ldyBVaW50MzJBcnJheSgyNTYpO1xuICAgIGxldCBwID0gMCwgeSA9IDAsIEUgPSAwO1xuICAgIGZvciAoRSA9IDA7IEUgPCAyNTY7IEUrKylcbiAgICAgIEUgPCAxMjggPyBmW0VdID0gRSA8PCAxIDogZltFXSA9IEUgPDwgMSBeIDI4MztcbiAgICBmb3IgKEUgPSAwOyBFIDwgMjU2OyBFKyspIHtcbiAgICAgIGxldCBiID0geSBeIHkgPDwgMSBeIHkgPDwgMiBeIHkgPDwgMyBeIHkgPDwgNDtcbiAgICAgIGIgPSBiID4+PiA4IF4gYiAmIDI1NSBeIDk5LCBlW3BdID0gYiwgdFtiXSA9IHA7XG4gICAgICBjb25zdCBSID0gZltwXSwgQSA9IGZbUl0sIEYgPSBmW0FdO1xuICAgICAgbGV0IE0gPSBmW2JdICogMjU3IF4gYiAqIDE2ODQzMDA4O1xuICAgICAgbltwXSA9IE0gPDwgMjQgfCBNID4+PiA4LCBpW3BdID0gTSA8PCAxNiB8IE0gPj4+IDE2LCBvW3BdID0gTSA8PCA4IHwgTSA+Pj4gMjQsIGFbcF0gPSBNLCBNID0gRiAqIDE2ODQzMDA5IF4gQSAqIDY1NTM3IF4gUiAqIDI1NyBeIHAgKiAxNjg0MzAwOCwgY1tiXSA9IE0gPDwgMjQgfCBNID4+PiA4LCB1W2JdID0gTSA8PCAxNiB8IE0gPj4+IDE2LCBkW2JdID0gTSA8PCA4IHwgTSA+Pj4gMjQsIGhbYl0gPSBNLCBwID8gKHAgPSBSIF4gZltmW2ZbRiBeIFJdXV0sIHkgXj0gZltmW3ldXSkgOiBwID0geSA9IDE7XG4gICAgfVxuICB9XG4gIGV4cGFuZEtleShlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMudWludDhBcnJheVRvVWludDMyQXJyYXlfKGUpO1xuICAgIGxldCByID0gITAsIG4gPSAwO1xuICAgIGZvciAoOyBuIDwgdC5sZW5ndGggJiYgcjsgKVxuICAgICAgciA9IHRbbl0gPT09IHRoaXMua2V5W25dLCBuKys7XG4gICAgaWYgKHIpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5rZXkgPSB0O1xuICAgIGNvbnN0IGkgPSB0aGlzLmtleVNpemUgPSB0Lmxlbmd0aDtcbiAgICBpZiAoaSAhPT0gNCAmJiBpICE9PSA2ICYmIGkgIT09IDgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGFlcyBrZXkgc2l6ZT1cIiArIGkpO1xuICAgIGNvbnN0IG8gPSB0aGlzLmtzUm93cyA9IChpICsgNiArIDEpICogNDtcbiAgICBsZXQgYSwgbDtcbiAgICBjb25zdCBjID0gdGhpcy5rZXlTY2hlZHVsZSA9IG5ldyBVaW50MzJBcnJheShvKSwgdSA9IHRoaXMuaW52S2V5U2NoZWR1bGUgPSBuZXcgVWludDMyQXJyYXkobyksIGQgPSB0aGlzLnNCb3gsIGggPSB0aGlzLnJjb24sIGYgPSB0aGlzLmludlN1Yk1peCwgcCA9IGZbMF0sIHkgPSBmWzFdLCBFID0gZlsyXSwgYiA9IGZbM107XG4gICAgbGV0IFIsIEE7XG4gICAgZm9yIChhID0gMDsgYSA8IG87IGErKykge1xuICAgICAgaWYgKGEgPCBpKSB7XG4gICAgICAgIFIgPSBjW2FdID0gdFthXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBBID0gUiwgYSAlIGkgPT09IDAgPyAoQSA9IEEgPDwgOCB8IEEgPj4+IDI0LCBBID0gZFtBID4+PiAyNF0gPDwgMjQgfCBkW0EgPj4+IDE2ICYgMjU1XSA8PCAxNiB8IGRbQSA+Pj4gOCAmIDI1NV0gPDwgOCB8IGRbQSAmIDI1NV0sIEEgXj0gaFthIC8gaSB8IDBdIDw8IDI0KSA6IGkgPiA2ICYmIGEgJSBpID09PSA0ICYmIChBID0gZFtBID4+PiAyNF0gPDwgMjQgfCBkW0EgPj4+IDE2ICYgMjU1XSA8PCAxNiB8IGRbQSA+Pj4gOCAmIDI1NV0gPDwgOCB8IGRbQSAmIDI1NV0pLCBjW2FdID0gUiA9IChjW2EgLSBpXSBeIEEpID4+PiAwO1xuICAgIH1cbiAgICBmb3IgKGwgPSAwOyBsIDwgbzsgbCsrKVxuICAgICAgYSA9IG8gLSBsLCBsICYgMyA/IEEgPSBjW2FdIDogQSA9IGNbYSAtIDRdLCBsIDwgNCB8fCBhIDw9IDQgPyB1W2xdID0gQSA6IHVbbF0gPSBwW2RbQSA+Pj4gMjRdXSBeIHlbZFtBID4+PiAxNiAmIDI1NV1dIF4gRVtkW0EgPj4+IDggJiAyNTVdXSBeIGJbZFtBICYgMjU1XV0sIHVbbF0gPSB1W2xdID4+PiAwO1xuICB9XG4gIC8vIEFkZGluZyB0aGlzIGFzIGEgbWV0aG9kIGdyZWF0bHkgaW1wcm92ZXMgcGVyZm9ybWFuY2UuXG4gIG5ldHdvcmtUb0hvc3RPcmRlclN3YXAoZSkge1xuICAgIHJldHVybiBlIDw8IDI0IHwgKGUgJiA2NTI4MCkgPDwgOCB8IChlICYgMTY3MTE2ODApID4+IDggfCBlID4+PiAyNDtcbiAgfVxuICBkZWNyeXB0KGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdGhpcy5rZXlTaXplICsgNiwgaSA9IHRoaXMuaW52S2V5U2NoZWR1bGUsIG8gPSB0aGlzLmludlNCb3gsIGEgPSB0aGlzLmludlN1Yk1peCwgbCA9IGFbMF0sIGMgPSBhWzFdLCB1ID0gYVsyXSwgZCA9IGFbM10sIGggPSB0aGlzLnVpbnQ4QXJyYXlUb1VpbnQzMkFycmF5XyhyKTtcbiAgICBsZXQgZiA9IGhbMF0sIHAgPSBoWzFdLCB5ID0gaFsyXSwgRSA9IGhbM107XG4gICAgY29uc3QgYiA9IG5ldyBJbnQzMkFycmF5KGUpLCBSID0gbmV3IEludDMyQXJyYXkoYi5sZW5ndGgpO1xuICAgIGxldCBBLCBGLCBNLCBILCBLLCBqLCBDLCBrLCAkLCBXLCBfLCBnLCB4LCB3O1xuICAgIGNvbnN0IEQgPSB0aGlzLm5ldHdvcmtUb0hvc3RPcmRlclN3YXA7XG4gICAgZm9yICg7IHQgPCBiLmxlbmd0aDsgKSB7XG4gICAgICBmb3IgKCQgPSBEKGJbdF0pLCBXID0gRChiW3QgKyAxXSksIF8gPSBEKGJbdCArIDJdKSwgZyA9IEQoYlt0ICsgM10pLCBLID0gJCBeIGlbMF0sIGogPSBnIF4gaVsxXSwgQyA9IF8gXiBpWzJdLCBrID0gVyBeIGlbM10sIHggPSA0LCB3ID0gMTsgdyA8IG47IHcrKylcbiAgICAgICAgQSA9IGxbSyA+Pj4gMjRdIF4gY1tqID4+IDE2ICYgMjU1XSBeIHVbQyA+PiA4ICYgMjU1XSBeIGRbayAmIDI1NV0gXiBpW3hdLCBGID0gbFtqID4+PiAyNF0gXiBjW0MgPj4gMTYgJiAyNTVdIF4gdVtrID4+IDggJiAyNTVdIF4gZFtLICYgMjU1XSBeIGlbeCArIDFdLCBNID0gbFtDID4+PiAyNF0gXiBjW2sgPj4gMTYgJiAyNTVdIF4gdVtLID4+IDggJiAyNTVdIF4gZFtqICYgMjU1XSBeIGlbeCArIDJdLCBIID0gbFtrID4+PiAyNF0gXiBjW0sgPj4gMTYgJiAyNTVdIF4gdVtqID4+IDggJiAyNTVdIF4gZFtDICYgMjU1XSBeIGlbeCArIDNdLCBLID0gQSwgaiA9IEYsIEMgPSBNLCBrID0gSCwgeCA9IHggKyA0O1xuICAgICAgQSA9IG9bSyA+Pj4gMjRdIDw8IDI0IF4gb1tqID4+IDE2ICYgMjU1XSA8PCAxNiBeIG9bQyA+PiA4ICYgMjU1XSA8PCA4IF4gb1trICYgMjU1XSBeIGlbeF0sIEYgPSBvW2ogPj4+IDI0XSA8PCAyNCBeIG9bQyA+PiAxNiAmIDI1NV0gPDwgMTYgXiBvW2sgPj4gOCAmIDI1NV0gPDwgOCBeIG9bSyAmIDI1NV0gXiBpW3ggKyAxXSwgTSA9IG9bQyA+Pj4gMjRdIDw8IDI0IF4gb1trID4+IDE2ICYgMjU1XSA8PCAxNiBeIG9bSyA+PiA4ICYgMjU1XSA8PCA4IF4gb1tqICYgMjU1XSBeIGlbeCArIDJdLCBIID0gb1trID4+PiAyNF0gPDwgMjQgXiBvW0sgPj4gMTYgJiAyNTVdIDw8IDE2IF4gb1tqID4+IDggJiAyNTVdIDw8IDggXiBvW0MgJiAyNTVdIF4gaVt4ICsgM10sIFJbdF0gPSBEKEEgXiBmKSwgUlt0ICsgMV0gPSBEKEggXiBwKSwgUlt0ICsgMl0gPSBEKE0gXiB5KSwgUlt0ICsgM10gPSBEKEYgXiBFKSwgZiA9ICQsIHAgPSBXLCB5ID0gXywgRSA9IGcsIHQgPSB0ICsgNDtcbiAgICB9XG4gICAgcmV0dXJuIFIuYnVmZmVyO1xuICB9XG59XG5jbGFzcyBfYiB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIpIHtcbiAgICB0aGlzLnN1YnRsZSA9IHZvaWQgMCwgdGhpcy5rZXkgPSB2b2lkIDAsIHRoaXMuYWVzTW9kZSA9IHZvaWQgMCwgdGhpcy5zdWJ0bGUgPSBlLCB0aGlzLmtleSA9IHQsIHRoaXMuYWVzTW9kZSA9IHI7XG4gIH1cbiAgZXhwYW5kS2V5KCkge1xuICAgIGNvbnN0IGUgPSBSYih0aGlzLmFlc01vZGUpO1xuICAgIHJldHVybiB0aGlzLnN1YnRsZS5pbXBvcnRLZXkoXCJyYXdcIiwgdGhpcy5rZXksIHtcbiAgICAgIG5hbWU6IGVcbiAgICB9LCAhMSwgW1wiZW5jcnlwdFwiLCBcImRlY3J5cHRcIl0pO1xuICB9XG59XG5mdW5jdGlvbiBSYihzKSB7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgT3MuY2JjOlxuICAgICAgcmV0dXJuIFwiQUVTLUNCQ1wiO1xuICAgIGNhc2UgT3MuY3RyOlxuICAgICAgcmV0dXJuIFwiQUVTLUNUUlwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFtGYXN0QUVTS2V5XSBpbnZhbGlkIGFlcyBtb2RlICR7c31gKTtcbiAgfVxufVxuY29uc3QgTGIgPSAxNjtcbmNsYXNzIHZ1IHtcbiAgY29uc3RydWN0b3IoZSwge1xuICAgIHJlbW92ZVBLQ1M3UGFkZGluZzogdCA9ICEwXG4gIH0gPSB7fSkge1xuICAgIGlmICh0aGlzLmxvZ0VuYWJsZWQgPSAhMCwgdGhpcy5yZW1vdmVQS0NTN1BhZGRpbmcgPSB2b2lkIDAsIHRoaXMuc3VidGxlID0gbnVsbCwgdGhpcy5zb2Z0d2FyZURlY3J5cHRlciA9IG51bGwsIHRoaXMua2V5ID0gbnVsbCwgdGhpcy5mYXN0QWVzS2V5ID0gbnVsbCwgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbCwgdGhpcy5jdXJyZW50SVYgPSBudWxsLCB0aGlzLmN1cnJlbnRSZXN1bHQgPSBudWxsLCB0aGlzLnVzZVNvZnR3YXJlID0gdm9pZCAwLCB0aGlzLmVuYWJsZVNvZnR3YXJlQUVTID0gdm9pZCAwLCB0aGlzLmVuYWJsZVNvZnR3YXJlQUVTID0gZS5lbmFibGVTb2Z0d2FyZUFFUywgdGhpcy5yZW1vdmVQS0NTN1BhZGRpbmcgPSB0LCB0KVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgciA9IHNlbGYuY3J5cHRvO1xuICAgICAgICByICYmICh0aGlzLnN1YnRsZSA9IHIuc3VidGxlIHx8IHIud2Via2l0U3VidGxlKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgfVxuICAgIHRoaXMudXNlU29mdHdhcmUgPSAhdGhpcy5zdWJ0bGU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnN1YnRsZSA9IG51bGwsIHRoaXMuc29mdHdhcmVEZWNyeXB0ZXIgPSBudWxsLCB0aGlzLmtleSA9IG51bGwsIHRoaXMuZmFzdEFlc0tleSA9IG51bGwsIHRoaXMucmVtYWluZGVyRGF0YSA9IG51bGwsIHRoaXMuY3VycmVudElWID0gbnVsbCwgdGhpcy5jdXJyZW50UmVzdWx0ID0gbnVsbDtcbiAgfVxuICBpc1N5bmMoKSB7XG4gICAgcmV0dXJuIHRoaXMudXNlU29mdHdhcmU7XG4gIH1cbiAgZmx1c2goKSB7XG4gICAgY29uc3Qge1xuICAgICAgY3VycmVudFJlc3VsdDogZSxcbiAgICAgIHJlbWFpbmRlckRhdGE6IHRcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIWUgfHwgdClcbiAgICAgIHJldHVybiB0aGlzLnJlc2V0KCksIG51bGw7XG4gICAgY29uc3QgciA9IG5ldyBVaW50OEFycmF5KGUpO1xuICAgIHJldHVybiB0aGlzLnJlc2V0KCksIHRoaXMucmVtb3ZlUEtDUzdQYWRkaW5nID8gQWIocikgOiByO1xuICB9XG4gIHJlc2V0KCkge1xuICAgIHRoaXMuY3VycmVudFJlc3VsdCA9IG51bGwsIHRoaXMuY3VycmVudElWID0gbnVsbCwgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbCwgdGhpcy5zb2Z0d2FyZURlY3J5cHRlciAmJiAodGhpcy5zb2Z0d2FyZURlY3J5cHRlciA9IG51bGwpO1xuICB9XG4gIGRlY3J5cHQoZSwgdCwgciwgbikge1xuICAgIHJldHVybiB0aGlzLnVzZVNvZnR3YXJlID8gbmV3IFByb21pc2UoKGksIG8pID0+IHtcbiAgICAgIGNvbnN0IGEgPSBBcnJheUJ1ZmZlci5pc1ZpZXcoZSkgPyBlIDogbmV3IFVpbnQ4QXJyYXkoZSk7XG4gICAgICB0aGlzLnNvZnR3YXJlRGVjcnlwdChhLCB0LCByLCBuKTtcbiAgICAgIGNvbnN0IGwgPSB0aGlzLmZsdXNoKCk7XG4gICAgICBsID8gaShsLmJ1ZmZlcikgOiBvKG5ldyBFcnJvcihcIltzb2Z0d2FyZURlY3J5cHRdIEZhaWxlZCB0byBkZWNyeXB0IGRhdGFcIikpO1xuICAgIH0pIDogdGhpcy53ZWJDcnlwdG9EZWNyeXB0KG5ldyBVaW50OEFycmF5KGUpLCB0LCByLCBuKTtcbiAgfVxuICAvLyBTb2Z0d2FyZSBkZWNyeXB0aW9uIGlzIHByb2dyZXNzaXZlLiBQcm9ncmVzc2l2ZSBkZWNyeXB0aW9uIG1heSBub3QgcmV0dXJuIGEgcmVzdWx0IG9uIGVhY2ggY2FsbC4gQW55IGNhY2hlZFxuICAvLyBkYXRhIGlzIGhhbmRsZWQgaW4gdGhlIGZsdXNoKCkgY2FsbFxuICBzb2Z0d2FyZURlY3J5cHQoZSwgdCwgciwgbikge1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRJVjogaSxcbiAgICAgIGN1cnJlbnRSZXN1bHQ6IG8sXG4gICAgICByZW1haW5kZXJEYXRhOiBhXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKG4gIT09IE9zLmNiYyB8fCB0LmJ5dGVMZW5ndGggIT09IDE2KVxuICAgICAgcmV0dXJuIHJ0Lndhcm4oXCJTb2Z0d2FyZURlY3J5cHQ6IGNhbiBvbmx5IGhhbmRsZSBBRVMtMTI4LUNCQ1wiKSwgbnVsbDtcbiAgICB0aGlzLmxvZ09uY2UoXCJKUyBBRVMgZGVjcnlwdFwiKSwgYSAmJiAoZSA9IF9yKGEsIGUpLCB0aGlzLnJlbWFpbmRlckRhdGEgPSBudWxsKTtcbiAgICBjb25zdCBsID0gdGhpcy5nZXRWYWxpZENodW5rKGUpO1xuICAgIGlmICghbC5sZW5ndGgpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBpICYmIChyID0gaSk7XG4gICAgbGV0IGMgPSB0aGlzLnNvZnR3YXJlRGVjcnlwdGVyO1xuICAgIGMgfHwgKGMgPSB0aGlzLnNvZnR3YXJlRGVjcnlwdGVyID0gbmV3IEliKCkpLCBjLmV4cGFuZEtleSh0KTtcbiAgICBjb25zdCB1ID0gbztcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UmVzdWx0ID0gYy5kZWNyeXB0KGwuYnVmZmVyLCAwLCByKSwgdGhpcy5jdXJyZW50SVYgPSBsLnNsaWNlKC0xNikuYnVmZmVyLCB1IHx8IG51bGw7XG4gIH1cbiAgd2ViQ3J5cHRvRGVjcnlwdChlLCB0LCByLCBuKSB7XG4gICAgaWYgKHRoaXMua2V5ICE9PSB0IHx8ICF0aGlzLmZhc3RBZXNLZXkpIHtcbiAgICAgIGlmICghdGhpcy5zdWJ0bGUpXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5vbldlYkNyeXB0b0Vycm9yKGUsIHQsIHIsIG4pKTtcbiAgICAgIHRoaXMua2V5ID0gdCwgdGhpcy5mYXN0QWVzS2V5ID0gbmV3IF9iKHRoaXMuc3VidGxlLCB0LCBuKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmFzdEFlc0tleS5leHBhbmRLZXkoKS50aGVuKChpKSA9PiB0aGlzLnN1YnRsZSA/ICh0aGlzLmxvZ09uY2UoXCJXZWJDcnlwdG8gQUVTIGRlY3J5cHRcIiksIG5ldyB3Yih0aGlzLnN1YnRsZSwgbmV3IFVpbnQ4QXJyYXkociksIG4pLmRlY3J5cHQoZS5idWZmZXIsIGkpKSA6IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIndlYiBjcnlwdG8gbm90IGluaXRpYWxpemVkXCIpKSkuY2F0Y2goKGkpID0+IChydC53YXJuKGBbZGVjcnlwdGVyXTogV2ViQ3J5cHRvIEVycm9yLCBkaXNhYmxlIFdlYkNyeXB0byBBUEksICR7aS5uYW1lfTogJHtpLm1lc3NhZ2V9YCksIHRoaXMub25XZWJDcnlwdG9FcnJvcihlLCB0LCByLCBuKSkpO1xuICB9XG4gIG9uV2ViQ3J5cHRvRXJyb3IoZSwgdCwgciwgbikge1xuICAgIGNvbnN0IGkgPSB0aGlzLmVuYWJsZVNvZnR3YXJlQUVTO1xuICAgIGlmIChpKSB7XG4gICAgICB0aGlzLnVzZVNvZnR3YXJlID0gITAsIHRoaXMubG9nRW5hYmxlZCA9ICEwLCB0aGlzLnNvZnR3YXJlRGVjcnlwdChlLCB0LCByLCBuKTtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLmZsdXNoKCk7XG4gICAgICBpZiAobylcbiAgICAgICAgcmV0dXJuIG8uYnVmZmVyO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJXZWJDcnlwdG9cIiArIChpID8gXCIgYW5kIHNvZnR3YXJlRGVjcnlwdFwiIDogXCJcIikgKyBcIjogZmFpbGVkIHRvIGRlY3J5cHQgZGF0YVwiKTtcbiAgfVxuICBnZXRWYWxpZENodW5rKGUpIHtcbiAgICBsZXQgdCA9IGU7XG4gICAgY29uc3QgciA9IGUubGVuZ3RoIC0gZS5sZW5ndGggJSBMYjtcbiAgICByZXR1cm4gciAhPT0gZS5sZW5ndGggJiYgKHQgPSBlLnNsaWNlKDAsIHIpLCB0aGlzLnJlbWFpbmRlckRhdGEgPSBlLnNsaWNlKHIpKSwgdDtcbiAgfVxuICBsb2dPbmNlKGUpIHtcbiAgICB0aGlzLmxvZ0VuYWJsZWQgJiYgKHJ0LmxvZyhgW2RlY3J5cHRlcl06ICR7ZX1gKSwgdGhpcy5sb2dFbmFibGVkID0gITEpO1xuICB9XG59XG5jb25zdCBwaCA9IE1hdGgucG93KDIsIDE3KTtcbmNsYXNzIENiIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuY29uZmlnID0gdm9pZCAwLCB0aGlzLmxvYWRlciA9IG51bGwsIHRoaXMucGFydExvYWRUaW1lb3V0ID0gLTEsIHRoaXMuY29uZmlnID0gZTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMubG9hZGVyICYmICh0aGlzLmxvYWRlci5kZXN0cm95KCksIHRoaXMubG9hZGVyID0gbnVsbCk7XG4gIH1cbiAgYWJvcnQoKSB7XG4gICAgdGhpcy5sb2FkZXIgJiYgdGhpcy5sb2FkZXIuYWJvcnQoKTtcbiAgfVxuICBsb2FkKGUsIHQpIHtcbiAgICBjb25zdCByID0gZS51cmw7XG4gICAgaWYgKCFyKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBhcyh7XG4gICAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouRlJBR19MT0FEX0VSUk9SLFxuICAgICAgICBmYXRhbDogITEsXG4gICAgICAgIGZyYWc6IGUsXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYEZyYWdtZW50IGRvZXMgbm90IGhhdmUgYSAke3IgPyBcInBhcnQgbGlzdFwiIDogXCJ1cmxcIn1gKSxcbiAgICAgICAgbmV0d29ya0RldGFpbHM6IG51bGxcbiAgICAgIH0pKTtcbiAgICB0aGlzLmFib3J0KCk7XG4gICAgY29uc3QgbiA9IHRoaXMuY29uZmlnLCBpID0gbi5mTG9hZGVyLCBvID0gbi5sb2FkZXI7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChhLCBsKSA9PiB7XG4gICAgICBpZiAodGhpcy5sb2FkZXIgJiYgdGhpcy5sb2FkZXIuZGVzdHJveSgpLCBlLmdhcClcbiAgICAgICAgaWYgKGUudGFnTGlzdC5zb21lKChwKSA9PiBwWzBdID09PSBcIkdBUFwiKSkge1xuICAgICAgICAgIGwoeWgoZSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgZS5nYXAgPSAhMTtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmxvYWRlciA9IGkgPyBuZXcgaShuKSA6IG5ldyBvKG4pLCB1ID0gbWgoZSk7XG4gICAgICBlLmxvYWRlciA9IGM7XG4gICAgICBjb25zdCBkID0gZmgobi5mcmFnTG9hZFBvbGljeS5kZWZhdWx0KSwgaCA9IHtcbiAgICAgICAgbG9hZFBvbGljeTogZCxcbiAgICAgICAgdGltZW91dDogZC5tYXhMb2FkVGltZU1zLFxuICAgICAgICBtYXhSZXRyeTogMCxcbiAgICAgICAgcmV0cnlEZWxheTogMCxcbiAgICAgICAgbWF4UmV0cnlEZWxheTogMCxcbiAgICAgICAgaGlnaFdhdGVyTWFyazogZS5zbiA9PT0gXCJpbml0U2VnbWVudFwiID8gMSAvIDAgOiBwaFxuICAgICAgfTtcbiAgICAgIGUuc3RhdHMgPSBjLnN0YXRzO1xuICAgICAgY29uc3QgZiA9IHtcbiAgICAgICAgb25TdWNjZXNzOiAocCwgeSwgRSwgYikgPT4ge1xuICAgICAgICAgIHRoaXMucmVzZXRMb2FkZXIoZSwgYyk7XG4gICAgICAgICAgbGV0IFIgPSBwLmRhdGE7XG4gICAgICAgICAgRS5yZXNldElWICYmIGUuZGVjcnlwdGRhdGEgJiYgKGUuZGVjcnlwdGRhdGEuaXYgPSBuZXcgVWludDhBcnJheShSLnNsaWNlKDAsIDE2KSksIFIgPSBSLnNsaWNlKDE2KSksIGEoe1xuICAgICAgICAgICAgZnJhZzogZSxcbiAgICAgICAgICAgIHBhcnQ6IG51bGwsXG4gICAgICAgICAgICBwYXlsb2FkOiBSLFxuICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IGJcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogKHAsIHksIEUsIGIpID0+IHtcbiAgICAgICAgICB0aGlzLnJlc2V0TG9hZGVyKGUsIGMpLCBsKG5ldyBhcyh7XG4gICAgICAgICAgICB0eXBlOiB2ZS5ORVRXT1JLX0VSUk9SLFxuICAgICAgICAgICAgZGV0YWlsczogSi5GUkFHX0xPQURfRVJST1IsXG4gICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgcmVzcG9uc2U6IHR0KHtcbiAgICAgICAgICAgICAgdXJsOiByLFxuICAgICAgICAgICAgICBkYXRhOiB2b2lkIDBcbiAgICAgICAgICAgIH0sIHApLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihgSFRUUCBFcnJvciAke3AuY29kZX0gJHtwLnRleHR9YCksXG4gICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogRSxcbiAgICAgICAgICAgIHN0YXRzOiBiXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBvbkFib3J0OiAocCwgeSwgRSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVzZXRMb2FkZXIoZSwgYyksIGwobmV3IGFzKHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLklOVEVSTkFMX0FCT1JURUQsXG4gICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIkFib3J0ZWRcIiksXG4gICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogRSxcbiAgICAgICAgICAgIHN0YXRzOiBwXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgICAgICBvblRpbWVvdXQ6IChwLCB5LCBFKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXNldExvYWRlcihlLCBjKSwgbChuZXcgYXMoe1xuICAgICAgICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgICAgICAgIGRldGFpbHM6IEouRlJBR19MT0FEX1RJTUVPVVQsXG4gICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihgVGltZW91dCBhZnRlciAke2gudGltZW91dH1tc2ApLFxuICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IEUsXG4gICAgICAgICAgICBzdGF0czogcFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHQgJiYgKGYub25Qcm9ncmVzcyA9IChwLCB5LCBFLCBiKSA9PiB0KHtcbiAgICAgICAgZnJhZzogZSxcbiAgICAgICAgcGFydDogbnVsbCxcbiAgICAgICAgcGF5bG9hZDogRSxcbiAgICAgICAgbmV0d29ya0RldGFpbHM6IGJcbiAgICAgIH0pKSwgYy5sb2FkKHUsIGgsIGYpO1xuICAgIH0pO1xuICB9XG4gIGxvYWRQYXJ0KGUsIHQsIHIpIHtcbiAgICB0aGlzLmFib3J0KCk7XG4gICAgY29uc3QgbiA9IHRoaXMuY29uZmlnLCBpID0gbi5mTG9hZGVyLCBvID0gbi5sb2FkZXI7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChhLCBsKSA9PiB7XG4gICAgICBpZiAodGhpcy5sb2FkZXIgJiYgdGhpcy5sb2FkZXIuZGVzdHJveSgpLCBlLmdhcCB8fCB0LmdhcCkge1xuICAgICAgICBsKHloKGUsIHQpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgYyA9IHRoaXMubG9hZGVyID0gaSA/IG5ldyBpKG4pIDogbmV3IG8obiksIHUgPSBtaChlLCB0KTtcbiAgICAgIGUubG9hZGVyID0gYztcbiAgICAgIGNvbnN0IGQgPSBmaChuLmZyYWdMb2FkUG9saWN5LmRlZmF1bHQpLCBoID0ge1xuICAgICAgICBsb2FkUG9saWN5OiBkLFxuICAgICAgICB0aW1lb3V0OiBkLm1heExvYWRUaW1lTXMsXG4gICAgICAgIG1heFJldHJ5OiAwLFxuICAgICAgICByZXRyeURlbGF5OiAwLFxuICAgICAgICBtYXhSZXRyeURlbGF5OiAwLFxuICAgICAgICBoaWdoV2F0ZXJNYXJrOiBwaFxuICAgICAgfTtcbiAgICAgIHQuc3RhdHMgPSBjLnN0YXRzLCBjLmxvYWQodSwgaCwge1xuICAgICAgICBvblN1Y2Nlc3M6IChmLCBwLCB5LCBFKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXNldExvYWRlcihlLCBjKSwgdGhpcy51cGRhdGVTdGF0c0Zyb21QYXJ0KGUsIHQpO1xuICAgICAgICAgIGNvbnN0IGIgPSB7XG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgcGFydDogdCxcbiAgICAgICAgICAgIHBheWxvYWQ6IGYuZGF0YSxcbiAgICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiBFXG4gICAgICAgICAgfTtcbiAgICAgICAgICByKGIpLCBhKGIpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiAoZiwgcCwgeSwgRSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVzZXRMb2FkZXIoZSwgYyksIGwobmV3IGFzKHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLkZSQUdfTE9BRF9FUlJPUixcbiAgICAgICAgICAgIGZhdGFsOiAhMSxcbiAgICAgICAgICAgIGZyYWc6IGUsXG4gICAgICAgICAgICBwYXJ0OiB0LFxuICAgICAgICAgICAgcmVzcG9uc2U6IHR0KHtcbiAgICAgICAgICAgICAgdXJsOiB1LnVybCxcbiAgICAgICAgICAgICAgZGF0YTogdm9pZCAwXG4gICAgICAgICAgICB9LCBmKSxcbiAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYEhUVFAgRXJyb3IgJHtmLmNvZGV9ICR7Zi50ZXh0fWApLFxuICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IHksXG4gICAgICAgICAgICBzdGF0czogRVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25BYm9ydDogKGYsIHAsIHkpID0+IHtcbiAgICAgICAgICBlLnN0YXRzLmFib3J0ZWQgPSB0LnN0YXRzLmFib3J0ZWQsIHRoaXMucmVzZXRMb2FkZXIoZSwgYyksIGwobmV3IGFzKHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLklOVEVSTkFMX0FCT1JURUQsXG4gICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgcGFydDogdCxcbiAgICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoXCJBYm9ydGVkXCIpLFxuICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IHksXG4gICAgICAgICAgICBzdGF0czogZlxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25UaW1lb3V0OiAoZiwgcCwgeSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVzZXRMb2FkZXIoZSwgYyksIGwobmV3IGFzKHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLkZSQUdfTE9BRF9USU1FT1VULFxuICAgICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgICAgZnJhZzogZSxcbiAgICAgICAgICAgIHBhcnQ6IHQsXG4gICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKGBUaW1lb3V0IGFmdGVyICR7aC50aW1lb3V0fW1zYCksXG4gICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogeSxcbiAgICAgICAgICAgIHN0YXRzOiBmXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICB1cGRhdGVTdGF0c0Zyb21QYXJ0KGUsIHQpIHtcbiAgICBjb25zdCByID0gZS5zdGF0cywgbiA9IHQuc3RhdHMsIGkgPSBuLnRvdGFsO1xuICAgIGlmIChyLmxvYWRlZCArPSBuLmxvYWRlZCwgaSkge1xuICAgICAgY29uc3QgbCA9IE1hdGgucm91bmQoZS5kdXJhdGlvbiAvIHQuZHVyYXRpb24pLCBjID0gTWF0aC5taW4oTWF0aC5yb3VuZChyLmxvYWRlZCAvIGkpLCBsKSwgZCA9IChsIC0gYykgKiBNYXRoLnJvdW5kKHIubG9hZGVkIC8gYyk7XG4gICAgICByLnRvdGFsID0gci5sb2FkZWQgKyBkO1xuICAgIH0gZWxzZVxuICAgICAgci50b3RhbCA9IE1hdGgubWF4KHIubG9hZGVkLCByLnRvdGFsKTtcbiAgICBjb25zdCBvID0gci5sb2FkaW5nLCBhID0gbi5sb2FkaW5nO1xuICAgIG8uc3RhcnQgPyBvLmZpcnN0ICs9IGEuZmlyc3QgLSBhLnN0YXJ0IDogKG8uc3RhcnQgPSBhLnN0YXJ0LCBvLmZpcnN0ID0gYS5maXJzdCksIG8uZW5kID0gYS5lbmQ7XG4gIH1cbiAgcmVzZXRMb2FkZXIoZSwgdCkge1xuICAgIGUubG9hZGVyID0gbnVsbCwgdGhpcy5sb2FkZXIgPT09IHQgJiYgKHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucGFydExvYWRUaW1lb3V0KSwgdGhpcy5sb2FkZXIgPSBudWxsKSwgdC5kZXN0cm95KCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG1oKHMsIGUgPSBudWxsKSB7XG4gIGNvbnN0IHQgPSBlIHx8IHMsIHIgPSB7XG4gICAgZnJhZzogcyxcbiAgICBwYXJ0OiBlLFxuICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgIHVybDogdC51cmwsXG4gICAgaGVhZGVyczoge30sXG4gICAgcmFuZ2VTdGFydDogMCxcbiAgICByYW5nZUVuZDogMFxuICB9LCBuID0gdC5ieXRlUmFuZ2VTdGFydE9mZnNldCwgaSA9IHQuYnl0ZVJhbmdlRW5kT2Zmc2V0O1xuICBpZiAodWUobikgJiYgdWUoaSkpIHtcbiAgICB2YXIgbztcbiAgICBsZXQgYSA9IG4sIGwgPSBpO1xuICAgIGlmIChzLnNuID09PSBcImluaXRTZWdtZW50XCIgJiYga2IoKG8gPSBzLmRlY3J5cHRkYXRhKSA9PSBudWxsID8gdm9pZCAwIDogby5tZXRob2QpKSB7XG4gICAgICBjb25zdCBjID0gaSAtIG47XG4gICAgICBjICUgMTYgJiYgKGwgPSBpICsgKDE2IC0gYyAlIDE2KSksIG4gIT09IDAgJiYgKHIucmVzZXRJViA9ICEwLCBhID0gbiAtIDE2KTtcbiAgICB9XG4gICAgci5yYW5nZVN0YXJ0ID0gYSwgci5yYW5nZUVuZCA9IGw7XG4gIH1cbiAgcmV0dXJuIHI7XG59XG5mdW5jdGlvbiB5aChzLCBlKSB7XG4gIGNvbnN0IHQgPSBuZXcgRXJyb3IoYEdBUCAke3MuZ2FwID8gXCJ0YWdcIiA6IFwiYXR0cmlidXRlXCJ9IGZvdW5kYCksIHIgPSB7XG4gICAgdHlwZTogdmUuTUVESUFfRVJST1IsXG4gICAgZGV0YWlsczogSi5GUkFHX0dBUCxcbiAgICBmYXRhbDogITEsXG4gICAgZnJhZzogcyxcbiAgICBlcnJvcjogdCxcbiAgICBuZXR3b3JrRGV0YWlsczogbnVsbFxuICB9O1xuICByZXR1cm4gZSAmJiAoci5wYXJ0ID0gZSksIChlIHx8IHMpLnN0YXRzLmFib3J0ZWQgPSAhMCwgbmV3IGFzKHIpO1xufVxuZnVuY3Rpb24ga2Iocykge1xuICByZXR1cm4gcyA9PT0gXCJBRVMtMTI4XCIgfHwgcyA9PT0gXCJBRVMtMjU2XCI7XG59XG5jbGFzcyBhcyBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHN1cGVyKGUuZXJyb3IubWVzc2FnZSksIHRoaXMuZGF0YSA9IHZvaWQgMCwgdGhpcy5kYXRhID0gZTtcbiAgfVxufVxuY2xhc3MgSGcgZXh0ZW5kcyBMciB7XG4gIGNvbnN0cnVjdG9yKGUsIHQpIHtcbiAgICBzdXBlcihlLCB0KSwgdGhpcy5fYm91bmRUaWNrID0gdm9pZCAwLCB0aGlzLl90aWNrVGltZXIgPSBudWxsLCB0aGlzLl90aWNrSW50ZXJ2YWwgPSBudWxsLCB0aGlzLl90aWNrQ2FsbENvdW50ID0gMCwgdGhpcy5fYm91bmRUaWNrID0gdGhpcy50aWNrLmJpbmQodGhpcyk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLm9uSGFuZGxlckRlc3Ryb3lpbmcoKSwgdGhpcy5vbkhhbmRsZXJEZXN0cm95ZWQoKTtcbiAgfVxuICBvbkhhbmRsZXJEZXN0cm95aW5nKCkge1xuICAgIHRoaXMuY2xlYXJOZXh0VGljaygpLCB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcbiAgfVxuICBvbkhhbmRsZXJEZXN0cm95ZWQoKSB7XG4gIH1cbiAgaGFzSW50ZXJ2YWwoKSB7XG4gICAgcmV0dXJuICEhdGhpcy5fdGlja0ludGVydmFsO1xuICB9XG4gIGhhc05leHRUaWNrKCkge1xuICAgIHJldHVybiAhIXRoaXMuX3RpY2tUaW1lcjtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIG1pbGxpcyAtIEludGVydmFsIHRpbWUgKG1zKVxuICAgKiBAZXR1cm5zIFRydWUgd2hlbiBpbnRlcnZhbCBoYXMgYmVlbiBzY2hlZHVsZWQsIGZhbHNlIHdoZW4gYWxyZWFkeSBzY2hlZHVsZWQgKG5vIGVmZmVjdClcbiAgICovXG4gIHNldEludGVydmFsKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fdGlja0ludGVydmFsID8gITEgOiAodGhpcy5fdGlja0NhbGxDb3VudCA9IDAsIHRoaXMuX3RpY2tJbnRlcnZhbCA9IHNlbGYuc2V0SW50ZXJ2YWwodGhpcy5fYm91bmRUaWNrLCBlKSwgITApO1xuICB9XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gaW50ZXJ2YWwgd2FzIGNsZWFyZWQsIGZhbHNlIHdoZW4gbm9uZSB3YXMgc2V0IChubyBlZmZlY3QpXG4gICAqL1xuICBjbGVhckludGVydmFsKCkge1xuICAgIHJldHVybiB0aGlzLl90aWNrSW50ZXJ2YWwgPyAoc2VsZi5jbGVhckludGVydmFsKHRoaXMuX3RpY2tJbnRlcnZhbCksIHRoaXMuX3RpY2tJbnRlcnZhbCA9IG51bGwsICEwKSA6ICExO1xuICB9XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUcnVlIHdoZW4gdGltZW91dCB3YXMgY2xlYXJlZCwgZmFsc2Ugd2hlbiBub25lIHdhcyBzZXQgKG5vIGVmZmVjdClcbiAgICovXG4gIGNsZWFyTmV4dFRpY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuX3RpY2tUaW1lciA/IChzZWxmLmNsZWFyVGltZW91dCh0aGlzLl90aWNrVGltZXIpLCB0aGlzLl90aWNrVGltZXIgPSBudWxsLCAhMCkgOiAhMTtcbiAgfVxuICAvKipcbiAgICogV2lsbCBjYWxsIHRoZSBzdWJjbGFzcyBkb1RpY2sgaW1wbGVtZW50YXRpb24gaW4gdGhpcyBtYWluIGxvb3AgdGlja1xuICAgKiBvciBpbiB0aGUgbmV4dCBvbmUgKHZpYSBzZXRUaW1lb3V0KCwwKSkgaW4gY2FzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZFxuICAgKiBpbiB0aGlzIHRpY2sgKGluIGNhc2UgdGhpcyBpcyBhIHJlLWVudHJhbnQgY2FsbCkuXG4gICAqL1xuICB0aWNrKCkge1xuICAgIHRoaXMuX3RpY2tDYWxsQ291bnQrKywgdGhpcy5fdGlja0NhbGxDb3VudCA9PT0gMSAmJiAodGhpcy5kb1RpY2soKSwgdGhpcy5fdGlja0NhbGxDb3VudCA+IDEgJiYgdGhpcy50aWNrSW1tZWRpYXRlKCksIHRoaXMuX3RpY2tDYWxsQ291bnQgPSAwKTtcbiAgfVxuICB0aWNrSW1tZWRpYXRlKCkge1xuICAgIHRoaXMuY2xlYXJOZXh0VGljaygpLCB0aGlzLl90aWNrVGltZXIgPSBzZWxmLnNldFRpbWVvdXQodGhpcy5fYm91bmRUaWNrLCAwKTtcbiAgfVxuICAvKipcbiAgICogRm9yIHN1YmNsYXNzIHRvIGltcGxlbWVudCB0YXNrIGxvZ2ljXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgZG9UaWNrKCkge1xuICB9XG59XG5jbGFzcyBFdSB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4gPSAwLCBpID0gLTEsIG8gPSAhMSkge1xuICAgIHRoaXMubGV2ZWwgPSB2b2lkIDAsIHRoaXMuc24gPSB2b2lkIDAsIHRoaXMucGFydCA9IHZvaWQgMCwgdGhpcy5pZCA9IHZvaWQgMCwgdGhpcy5zaXplID0gdm9pZCAwLCB0aGlzLnBhcnRpYWwgPSB2b2lkIDAsIHRoaXMudHJhbnNtdXhpbmcgPSBxaSgpLCB0aGlzLmJ1ZmZlcmluZyA9IHtcbiAgICAgIGF1ZGlvOiBxaSgpLFxuICAgICAgdmlkZW86IHFpKCksXG4gICAgICBhdWRpb3ZpZGVvOiBxaSgpXG4gICAgfSwgdGhpcy5sZXZlbCA9IGUsIHRoaXMuc24gPSB0LCB0aGlzLmlkID0gciwgdGhpcy5zaXplID0gbiwgdGhpcy5wYXJ0ID0gaSwgdGhpcy5wYXJ0aWFsID0gbztcbiAgfVxufVxuZnVuY3Rpb24gcWkoKSB7XG4gIHJldHVybiB7XG4gICAgc3RhcnQ6IDAsXG4gICAgZXhlY3V0ZVN0YXJ0OiAwLFxuICAgIGV4ZWN1dGVFbmQ6IDAsXG4gICAgZW5kOiAwXG4gIH07XG59XG5jb25zdCB2aCA9IHtcbiAgbGVuZ3RoOiAwLFxuICBzdGFydDogKCkgPT4gMCxcbiAgZW5kOiAoKSA9PiAwXG59O1xuY2xhc3MgQ2Uge1xuICAvKipcbiAgICogUmV0dXJuIHRydWUgaWYgYG1lZGlhYCdzIGJ1ZmZlcmVkIGluY2x1ZGUgYHBvc2l0aW9uYFxuICAgKi9cbiAgc3RhdGljIGlzQnVmZmVyZWQoZSwgdCkge1xuICAgIGlmIChlKSB7XG4gICAgICBjb25zdCByID0gQ2UuZ2V0QnVmZmVyZWQoZSk7XG4gICAgICBmb3IgKGxldCBuID0gci5sZW5ndGg7IG4tLTsgKVxuICAgICAgICBpZiAodCA+PSByLnN0YXJ0KG4pICYmIHQgPD0gci5lbmQobikpXG4gICAgICAgICAgcmV0dXJuICEwO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgc3RhdGljIGJ1ZmZlcmVkUmFuZ2VzKGUpIHtcbiAgICBpZiAoZSkge1xuICAgICAgY29uc3QgdCA9IENlLmdldEJ1ZmZlcmVkKGUpO1xuICAgICAgcmV0dXJuIENlLnRpbWVSYW5nZXNUb0FycmF5KHQpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG4gIH1cbiAgc3RhdGljIHRpbWVSYW5nZXNUb0FycmF5KGUpIHtcbiAgICBjb25zdCB0ID0gW107XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKVxuICAgICAgdC5wdXNoKHtcbiAgICAgICAgc3RhcnQ6IGUuc3RhcnQociksXG4gICAgICAgIGVuZDogZS5lbmQocilcbiAgICAgIH0pO1xuICAgIHJldHVybiB0O1xuICB9XG4gIHN0YXRpYyBidWZmZXJJbmZvKGUsIHQsIHIpIHtcbiAgICBpZiAoZSkge1xuICAgICAgY29uc3QgbiA9IENlLmJ1ZmZlcmVkUmFuZ2VzKGUpO1xuICAgICAgaWYgKG4ubGVuZ3RoKVxuICAgICAgICByZXR1cm4gQ2UuYnVmZmVyZWRJbmZvKG4sIHQsIHIpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgbGVuOiAwLFxuICAgICAgc3RhcnQ6IHQsXG4gICAgICBlbmQ6IHQsXG4gICAgICBidWZmZXJlZEluZGV4OiAtMVxuICAgIH07XG4gIH1cbiAgc3RhdGljIGJ1ZmZlcmVkSW5mbyhlLCB0LCByKSB7XG4gICAgdCA9IE1hdGgubWF4KDAsIHQpLCBlLmxlbmd0aCA+IDEgJiYgZS5zb3J0KCh1LCBkKSA9PiB1LnN0YXJ0IC0gZC5zdGFydCB8fCBkLmVuZCAtIHUuZW5kKTtcbiAgICBsZXQgbiA9IC0xLCBpID0gW107XG4gICAgaWYgKHIpXG4gICAgICBmb3IgKGxldCB1ID0gMDsgdSA8IGUubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgdCA+PSBlW3VdLnN0YXJ0ICYmIHQgPD0gZVt1XS5lbmQgJiYgKG4gPSB1KTtcbiAgICAgICAgY29uc3QgZCA9IGkubGVuZ3RoO1xuICAgICAgICBpZiAoZCkge1xuICAgICAgICAgIGNvbnN0IGggPSBpW2QgLSAxXS5lbmQ7XG4gICAgICAgICAgZVt1XS5zdGFydCAtIGggPCByID8gZVt1XS5lbmQgPiBoICYmIChpW2QgLSAxXS5lbmQgPSBlW3VdLmVuZCkgOiBpLnB1c2goZVt1XSk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGkucHVzaChlW3VdKTtcbiAgICAgIH1cbiAgICBlbHNlXG4gICAgICBpID0gZTtcbiAgICBsZXQgbyA9IDAsIGEsIGwgPSB0LCBjID0gdDtcbiAgICBmb3IgKGxldCB1ID0gMDsgdSA8IGkubGVuZ3RoOyB1KyspIHtcbiAgICAgIGNvbnN0IGQgPSBpW3VdLnN0YXJ0LCBoID0gaVt1XS5lbmQ7XG4gICAgICBpZiAobiA9PT0gLTEgJiYgdCA+PSBkICYmIHQgPD0gaCAmJiAobiA9IHUpLCB0ICsgciA+PSBkICYmIHQgPCBoKVxuICAgICAgICBsID0gZCwgYyA9IGgsIG8gPSBjIC0gdDtcbiAgICAgIGVsc2UgaWYgKHQgKyByIDwgZCkge1xuICAgICAgICBhID0gZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBsZW46IG8sXG4gICAgICBzdGFydDogbCB8fCAwLFxuICAgICAgZW5kOiBjIHx8IDAsXG4gICAgICBuZXh0U3RhcnQ6IGEsXG4gICAgICBidWZmZXJlZDogZSxcbiAgICAgIGJ1ZmZlcmVkSW5kZXg6IG5cbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBTYWZlIG1ldGhvZCB0byBnZXQgYnVmZmVyZWQgcHJvcGVydHkuXG4gICAqIFNvdXJjZUJ1ZmZlci5idWZmZXJlZCBtYXkgdGhyb3cgaWYgU291cmNlQnVmZmVyIGlzIHJlbW92ZWQgZnJvbSBpdCdzIE1lZGlhU291cmNlXG4gICAqL1xuICBzdGF0aWMgZ2V0QnVmZmVyZWQoZSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZS5idWZmZXJlZCB8fCB2aDtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICByZXR1cm4gcnQubG9nKFwiZmFpbGVkIHRvIGdldCBtZWRpYS5idWZmZXJlZFwiLCB0KSwgdmg7XG4gICAgfVxuICB9XG59XG5jb25zdCBxZyA9IC9cXHtcXCQoW2EtekEtWjAtOS1fXSspXFx9L2c7XG5mdW5jdGlvbiBFaChzKSB7XG4gIHJldHVybiBxZy50ZXN0KHMpO1xufVxuZnVuY3Rpb24gZGMocywgZSkge1xuICBpZiAocy52YXJpYWJsZUxpc3QgIT09IG51bGwgfHwgcy5oYXNWYXJpYWJsZVJlZnMpIHtcbiAgICBjb25zdCB0ID0gcy52YXJpYWJsZUxpc3Q7XG4gICAgcmV0dXJuIGUucmVwbGFjZShxZywgKHIpID0+IHtcbiAgICAgIGNvbnN0IG4gPSByLnN1YnN0cmluZygyLCByLmxlbmd0aCAtIDEpLCBpID0gdCA9PSBudWxsID8gdm9pZCAwIDogdFtuXTtcbiAgICAgIHJldHVybiBpID09PSB2b2lkIDAgPyAocy5wbGF5bGlzdFBhcnNpbmdFcnJvciB8fCAocy5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG5ldyBFcnJvcihgTWlzc2luZyBwcmVjZWRpbmcgRVhULVgtREVGSU5FIHRhZyBmb3IgVmFyaWFibGUgUmVmZXJlbmNlOiBcIiR7bn1cImApKSwgcikgOiBpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuZnVuY3Rpb24geGgocywgZSwgdCkge1xuICBsZXQgciA9IHMudmFyaWFibGVMaXN0O1xuICByIHx8IChzLnZhcmlhYmxlTGlzdCA9IHIgPSB7fSk7XG4gIGxldCBuLCBpO1xuICBpZiAoXCJRVUVSWVBBUkFNXCIgaW4gZSkge1xuICAgIG4gPSBlLlFVRVJZUEFSQU07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG8gPSBuZXcgc2VsZi5VUkwodCkuc2VhcmNoUGFyYW1zO1xuICAgICAgaWYgKG8uaGFzKG4pKVxuICAgICAgICBpID0gby5nZXQobik7XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgXCIke259XCIgZG9lcyBub3QgbWF0Y2ggYW55IHF1ZXJ5IHBhcmFtZXRlciBpbiBVUkk6IFwiJHt0fVwiYCk7XG4gICAgfSBjYXRjaCAobykge1xuICAgICAgcy5wbGF5bGlzdFBhcnNpbmdFcnJvciB8fCAocy5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG5ldyBFcnJvcihgRVhULVgtREVGSU5FIFFVRVJZUEFSQU06ICR7by5tZXNzYWdlfWApKTtcbiAgICB9XG4gIH0gZWxzZVxuICAgIG4gPSBlLk5BTUUsIGkgPSBlLlZBTFVFO1xuICBuIGluIHIgPyBzLnBsYXlsaXN0UGFyc2luZ0Vycm9yIHx8IChzLnBsYXlsaXN0UGFyc2luZ0Vycm9yID0gbmV3IEVycm9yKGBFWFQtWC1ERUZJTkUgZHVwbGljYXRlIFZhcmlhYmxlIE5hbWUgZGVjbGFyYXRpb25zOiBcIiR7bn1cImApKSA6IHJbbl0gPSBpIHx8IFwiXCI7XG59XG5mdW5jdGlvbiBEYihzLCBlLCB0KSB7XG4gIGNvbnN0IHIgPSBlLklNUE9SVDtcbiAgaWYgKHQgJiYgciBpbiB0KSB7XG4gICAgbGV0IG4gPSBzLnZhcmlhYmxlTGlzdDtcbiAgICBuIHx8IChzLnZhcmlhYmxlTGlzdCA9IG4gPSB7fSksIG5bcl0gPSB0W3JdO1xuICB9IGVsc2VcbiAgICBzLnBsYXlsaXN0UGFyc2luZ0Vycm9yIHx8IChzLnBsYXlsaXN0UGFyc2luZ0Vycm9yID0gbmV3IEVycm9yKGBFWFQtWC1ERUZJTkUgSU1QT1JUIGF0dHJpYnV0ZSBub3QgZm91bmQgaW4gTXVsdGl2YXJpYW50IFBsYXlsaXN0OiBcIiR7cn1cImApKTtcbn1cbmNvbnN0IFBiID0gL14oXFxkKyl4KFxcZCspJC8sIFNoID0gLyguKz8pPShcIi4qP1wifC4qPykoPzosfCQpL2c7XG5jbGFzcyBndCB7XG4gIGNvbnN0cnVjdG9yKGUsIHQpIHtcbiAgICB0eXBlb2YgZSA9PSBcInN0cmluZ1wiICYmIChlID0gZ3QucGFyc2VBdHRyTGlzdChlLCB0KSksIG50KHRoaXMsIGUpO1xuICB9XG4gIGdldCBjbGllbnRBdHRycygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcykuZmlsdGVyKChlKSA9PiBlLnN1YnN0cmluZygwLCAyKSA9PT0gXCJYLVwiKTtcbiAgfVxuICBkZWNpbWFsSW50ZWdlcihlKSB7XG4gICAgY29uc3QgdCA9IHBhcnNlSW50KHRoaXNbZV0sIDEwKTtcbiAgICByZXR1cm4gdCA+IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSID8gMSAvIDAgOiB0O1xuICB9XG4gIGhleGFkZWNpbWFsSW50ZWdlcihlKSB7XG4gICAgaWYgKHRoaXNbZV0pIHtcbiAgICAgIGxldCB0ID0gKHRoaXNbZV0gfHwgXCIweFwiKS5zbGljZSgyKTtcbiAgICAgIHQgPSAodC5sZW5ndGggJiAxID8gXCIwXCIgOiBcIlwiKSArIHQ7XG4gICAgICBjb25zdCByID0gbmV3IFVpbnQ4QXJyYXkodC5sZW5ndGggLyAyKTtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGggLyAyOyBuKyspXG4gICAgICAgIHJbbl0gPSBwYXJzZUludCh0LnNsaWNlKG4gKiAyLCBuICogMiArIDIpLCAxNik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaGV4YWRlY2ltYWxJbnRlZ2VyQXNOdW1iZXIoZSkge1xuICAgIGNvbnN0IHQgPSBwYXJzZUludCh0aGlzW2VdLCAxNik7XG4gICAgcmV0dXJuIHQgPiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiA/IDEgLyAwIDogdDtcbiAgfVxuICBkZWNpbWFsRmxvYXRpbmdQb2ludChlKSB7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQodGhpc1tlXSk7XG4gIH1cbiAgb3B0aW9uYWxGbG9hdChlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXNbZV07XG4gICAgcmV0dXJuIHIgPyBwYXJzZUZsb2F0KHIpIDogdDtcbiAgfVxuICBlbnVtZXJhdGVkU3RyaW5nKGUpIHtcbiAgICByZXR1cm4gdGhpc1tlXTtcbiAgfVxuICBlbnVtZXJhdGVkU3RyaW5nTGlzdChlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXNbZV07XG4gICAgcmV0dXJuIChyID8gci5zcGxpdCgvWyAsXSsvKSA6IFtdKS5yZWR1Y2UoKG4sIGkpID0+IChuW2kudG9Mb3dlckNhc2UoKV0gPSAhMCwgbiksIHQpO1xuICB9XG4gIGJvb2woZSkge1xuICAgIHJldHVybiB0aGlzW2VdID09PSBcIllFU1wiO1xuICB9XG4gIGRlY2ltYWxSZXNvbHV0aW9uKGUpIHtcbiAgICBjb25zdCB0ID0gUGIuZXhlYyh0aGlzW2VdKTtcbiAgICBpZiAodCAhPT0gbnVsbClcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHdpZHRoOiBwYXJzZUludCh0WzFdLCAxMCksXG4gICAgICAgIGhlaWdodDogcGFyc2VJbnQodFsyXSwgMTApXG4gICAgICB9O1xuICB9XG4gIHN0YXRpYyBwYXJzZUF0dHJMaXN0KGUsIHQpIHtcbiAgICBsZXQgcjtcbiAgICBjb25zdCBuID0ge307XG4gICAgZm9yIChTaC5sYXN0SW5kZXggPSAwOyAociA9IFNoLmV4ZWMoZSkpICE9PSBudWxsOyApIHtcbiAgICAgIGNvbnN0IG8gPSByWzFdLnRyaW0oKTtcbiAgICAgIGxldCBhID0gclsyXTtcbiAgICAgIGNvbnN0IGwgPSBhLmluZGV4T2YoJ1wiJykgPT09IDAgJiYgYS5sYXN0SW5kZXhPZignXCInKSA9PT0gYS5sZW5ndGggLSAxO1xuICAgICAgbGV0IGMgPSAhMTtcbiAgICAgIGlmIChsKVxuICAgICAgICBhID0gYS5zbGljZSgxLCAtMSk7XG4gICAgICBlbHNlXG4gICAgICAgIHN3aXRjaCAobykge1xuICAgICAgICAgIGNhc2UgXCJJVlwiOlxuICAgICAgICAgIGNhc2UgXCJTQ1RFMzUtQ01EXCI6XG4gICAgICAgICAgY2FzZSBcIlNDVEUzNS1JTlwiOlxuICAgICAgICAgIGNhc2UgXCJTQ1RFMzUtT1VUXCI6XG4gICAgICAgICAgICBjID0gITA7XG4gICAgICAgIH1cbiAgICAgIGlmICh0ICYmIChsIHx8IGMpKVxuICAgICAgICBhID0gZGModCwgYSk7XG4gICAgICBlbHNlIGlmICghYyAmJiAhbClcbiAgICAgICAgc3dpdGNoIChvKSB7XG4gICAgICAgICAgY2FzZSBcIkNMT1NFRC1DQVBUSU9OU1wiOlxuICAgICAgICAgICAgaWYgKGEgPT09IFwiTk9ORVwiKVxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAvLyBmYWxscyB0aHJvdWdoXG4gICAgICAgICAgY2FzZSBcIkFMTE9XRUQtQ1BDXCI6XG4gICAgICAgICAgY2FzZSBcIkNMQVNTXCI6XG4gICAgICAgICAgY2FzZSBcIkFTU09DLUxBTkdVQUdFXCI6XG4gICAgICAgICAgY2FzZSBcIkFVRElPXCI6XG4gICAgICAgICAgY2FzZSBcIkJZVEVSQU5HRVwiOlxuICAgICAgICAgIGNhc2UgXCJDSEFOTkVMU1wiOlxuICAgICAgICAgIGNhc2UgXCJDSEFSQUNURVJJU1RJQ1NcIjpcbiAgICAgICAgICBjYXNlIFwiQ09ERUNTXCI6XG4gICAgICAgICAgY2FzZSBcIkRBVEEtSURcIjpcbiAgICAgICAgICBjYXNlIFwiRU5ELURBVEVcIjpcbiAgICAgICAgICBjYXNlIFwiR1JPVVAtSURcIjpcbiAgICAgICAgICBjYXNlIFwiSURcIjpcbiAgICAgICAgICBjYXNlIFwiSU1QT1JUXCI6XG4gICAgICAgICAgY2FzZSBcIklOU1RSRUFNLUlEXCI6XG4gICAgICAgICAgY2FzZSBcIktFWUZPUk1BVFwiOlxuICAgICAgICAgIGNhc2UgXCJLRVlGT1JNQVRWRVJTSU9OU1wiOlxuICAgICAgICAgIGNhc2UgXCJMQU5HVUFHRVwiOlxuICAgICAgICAgIGNhc2UgXCJOQU1FXCI6XG4gICAgICAgICAgY2FzZSBcIlBBVEhXQVktSURcIjpcbiAgICAgICAgICBjYXNlIFwiUVVFUllQQVJBTVwiOlxuICAgICAgICAgIGNhc2UgXCJSRUNFTlRMWS1SRU1PVkVELURBVEVSQU5HRVNcIjpcbiAgICAgICAgICBjYXNlIFwiU0VSVkVSLVVSSVwiOlxuICAgICAgICAgIGNhc2UgXCJTVEFCTEUtUkVORElUSU9OLUlEXCI6XG4gICAgICAgICAgY2FzZSBcIlNUQUJMRS1WQVJJQU5ULUlEXCI6XG4gICAgICAgICAgY2FzZSBcIlNUQVJULURBVEVcIjpcbiAgICAgICAgICBjYXNlIFwiU1VCVElUTEVTXCI6XG4gICAgICAgICAgY2FzZSBcIlNVUFBMRU1FTlRBTC1DT0RFQ1NcIjpcbiAgICAgICAgICBjYXNlIFwiVVJJXCI6XG4gICAgICAgICAgY2FzZSBcIlZBTFVFXCI6XG4gICAgICAgICAgY2FzZSBcIlZJREVPXCI6XG4gICAgICAgICAgY2FzZSBcIlgtQVNTRVQtTElTVFwiOlxuICAgICAgICAgIGNhc2UgXCJYLUFTU0VULVVSSVwiOlxuICAgICAgICAgICAgcnQud2FybihgJHtlfTogYXR0cmlidXRlICR7b30gaXMgbWlzc2luZyBxdW90ZXNgKTtcbiAgICAgICAgfVxuICAgICAgbltvXSA9IGE7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG59XG5jb25zdCBNYiA9IFwiY29tLmFwcGxlLmhscy5pbnRlcnN0aXRpYWxcIjtcbmZ1bmN0aW9uIE9iKHMpIHtcbiAgcmV0dXJuIHMgIT09IFwiSURcIiAmJiBzICE9PSBcIkNMQVNTXCIgJiYgcyAhPT0gXCJDVUVcIiAmJiBzICE9PSBcIlNUQVJULURBVEVcIiAmJiBzICE9PSBcIkRVUkFUSU9OXCIgJiYgcyAhPT0gXCJFTkQtREFURVwiICYmIHMgIT09IFwiRU5ELU9OLU5FWFRcIjtcbn1cbmZ1bmN0aW9uIEJiKHMpIHtcbiAgcmV0dXJuIHMgPT09IFwiU0NURTM1LU9VVFwiIHx8IHMgPT09IFwiU0NURTM1LUlOXCIgfHwgcyA9PT0gXCJTQ1RFMzUtQ01EXCI7XG59XG5jbGFzcyBXZyB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIgPSAwKSB7XG4gICAgdmFyIG47XG4gICAgaWYgKHRoaXMuYXR0ciA9IHZvaWQgMCwgdGhpcy50YWdBbmNob3IgPSB2b2lkIDAsIHRoaXMudGFnT3JkZXIgPSB2b2lkIDAsIHRoaXMuX3N0YXJ0RGF0ZSA9IHZvaWQgMCwgdGhpcy5fZW5kRGF0ZSA9IHZvaWQgMCwgdGhpcy5fZGF0ZUF0RW5kID0gdm9pZCAwLCB0aGlzLl9jdWUgPSB2b2lkIDAsIHRoaXMuX2JhZFZhbHVlRm9yU2FtZUlkID0gdm9pZCAwLCB0aGlzLnRhZ0FuY2hvciA9ICh0ID09IG51bGwgPyB2b2lkIDAgOiB0LnRhZ0FuY2hvcikgfHwgbnVsbCwgdGhpcy50YWdPcmRlciA9IChuID0gdCA9PSBudWxsID8gdm9pZCAwIDogdC50YWdPcmRlcikgIT0gbnVsbCA/IG4gOiByLCB0KSB7XG4gICAgICBjb25zdCBpID0gdC5hdHRyO1xuICAgICAgZm9yIChjb25zdCBvIGluIGkpXG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwgbykgJiYgZVtvXSAhPT0gaVtvXSkge1xuICAgICAgICAgIHJ0Lndhcm4oYERBVEVSQU5HRSB0YWcgYXR0cmlidXRlOiBcIiR7b31cIiBkb2VzIG5vdCBtYXRjaCBmb3IgdGFncyB3aXRoIElEOiBcIiR7ZS5JRH1cImApLCB0aGlzLl9iYWRWYWx1ZUZvclNhbWVJZCA9IG87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIGUgPSBudChuZXcgZ3Qoe30pLCBpLCBlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYXR0ciA9IGUsIHQgPyAodGhpcy5fc3RhcnREYXRlID0gdC5fc3RhcnREYXRlLCB0aGlzLl9jdWUgPSB0Ll9jdWUsIHRoaXMuX2VuZERhdGUgPSB0Ll9lbmREYXRlLCB0aGlzLl9kYXRlQXRFbmQgPSB0Ll9kYXRlQXRFbmQpIDogdGhpcy5fc3RhcnREYXRlID0gbmV3IERhdGUoZVtcIlNUQVJULURBVEVcIl0pLCBcIkVORC1EQVRFXCIgaW4gdGhpcy5hdHRyKSB7XG4gICAgICBjb25zdCBpID0gKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZW5kRGF0ZSkgfHwgbmV3IERhdGUodGhpcy5hdHRyW1wiRU5ELURBVEVcIl0pO1xuICAgICAgdWUoaS5nZXRUaW1lKCkpICYmICh0aGlzLl9lbmREYXRlID0gaSk7XG4gICAgfVxuICB9XG4gIGdldCBpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyLklEO1xuICB9XG4gIGdldCBjbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5hdHRyLkNMQVNTO1xuICB9XG4gIGdldCBjdWUoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuX2N1ZTtcbiAgICByZXR1cm4gZSA9PT0gdm9pZCAwID8gdGhpcy5fY3VlID0gdGhpcy5hdHRyLmVudW1lcmF0ZWRTdHJpbmdMaXN0KHRoaXMuYXR0ci5DVUUgPyBcIkNVRVwiIDogXCJYLUNVRVwiLCB7XG4gICAgICBwcmU6ICExLFxuICAgICAgcG9zdDogITEsXG4gICAgICBvbmNlOiAhMVxuICAgIH0pIDogZTtcbiAgfVxuICBnZXQgc3RhcnRUaW1lKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRhZ0FuY2hvcjogZVxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiBlID09PSBudWxsIHx8IGUucHJvZ3JhbURhdGVUaW1lID09PSBudWxsID8gKHJ0Lndhcm4oYEV4cGVjdGVkIHRhZ0FuY2hvciBGcmFnbWVudCB3aXRoIFBEVCBzZXQgZm9yIERhdGVSYW5nZSBcIiR7dGhpcy5pZH1cIjogJHtlfWApLCBOYU4pIDogZS5zdGFydCArICh0aGlzLnN0YXJ0RGF0ZS5nZXRUaW1lKCkgLSBlLnByb2dyYW1EYXRlVGltZSkgLyAxZTM7XG4gIH1cbiAgZ2V0IHN0YXJ0RGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnREYXRlO1xuICB9XG4gIGdldCBlbmREYXRlKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLl9lbmREYXRlIHx8IHRoaXMuX2RhdGVBdEVuZDtcbiAgICBpZiAoZSlcbiAgICAgIHJldHVybiBlO1xuICAgIGNvbnN0IHQgPSB0aGlzLmR1cmF0aW9uO1xuICAgIHJldHVybiB0ICE9PSBudWxsID8gdGhpcy5fZGF0ZUF0RW5kID0gbmV3IERhdGUodGhpcy5fc3RhcnREYXRlLmdldFRpbWUoKSArIHQgKiAxZTMpIDogbnVsbDtcbiAgfVxuICBnZXQgZHVyYXRpb24oKSB7XG4gICAgaWYgKFwiRFVSQVRJT05cIiBpbiB0aGlzLmF0dHIpIHtcbiAgICAgIGNvbnN0IGUgPSB0aGlzLmF0dHIuZGVjaW1hbEZsb2F0aW5nUG9pbnQoXCJEVVJBVElPTlwiKTtcbiAgICAgIGlmICh1ZShlKSlcbiAgICAgICAgcmV0dXJuIGU7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9lbmREYXRlKVxuICAgICAgcmV0dXJuICh0aGlzLl9lbmREYXRlLmdldFRpbWUoKSAtIHRoaXMuX3N0YXJ0RGF0ZS5nZXRUaW1lKCkpIC8gMWUzO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGdldCBwbGFubmVkRHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIFwiUExBTk5FRC1EVVJBVElPTlwiIGluIHRoaXMuYXR0ciA/IHRoaXMuYXR0ci5kZWNpbWFsRmxvYXRpbmdQb2ludChcIlBMQU5ORUQtRFVSQVRJT05cIikgOiBudWxsO1xuICB9XG4gIGdldCBlbmRPbk5leHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXR0ci5ib29sKFwiRU5ELU9OLU5FWFRcIik7XG4gIH1cbiAgZ2V0IGlzSW50ZXJzdGl0aWFsKCkge1xuICAgIHJldHVybiB0aGlzLmNsYXNzID09PSBNYjtcbiAgfVxuICBnZXQgaXNWYWxpZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLmlkICYmICF0aGlzLl9iYWRWYWx1ZUZvclNhbWVJZCAmJiB1ZSh0aGlzLnN0YXJ0RGF0ZS5nZXRUaW1lKCkpICYmICh0aGlzLmR1cmF0aW9uID09PSBudWxsIHx8IHRoaXMuZHVyYXRpb24gPj0gMCkgJiYgKCF0aGlzLmVuZE9uTmV4dCB8fCAhIXRoaXMuY2xhc3MpICYmICghdGhpcy5hdHRyLkNVRSB8fCAhdGhpcy5jdWUucHJlICYmICF0aGlzLmN1ZS5wb3N0IHx8IHRoaXMuY3VlLnByZSAhPT0gdGhpcy5jdWUucG9zdCkgJiYgKCF0aGlzLmlzSW50ZXJzdGl0aWFsIHx8IFwiWC1BU1NFVC1VUklcIiBpbiB0aGlzLmF0dHIgfHwgXCJYLUFTU0VULUxJU1RcIiBpbiB0aGlzLmF0dHIpO1xuICB9XG59XG5jb25zdCBGYiA9IDEwO1xuY2xhc3MgTmIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5QVFNLbm93biA9ICExLCB0aGlzLmFsaWduZWRTbGlkaW5nID0gITEsIHRoaXMuYXZlcmFnZXRhcmdldGR1cmF0aW9uID0gdm9pZCAwLCB0aGlzLmVuZENDID0gMCwgdGhpcy5lbmRTTiA9IDAsIHRoaXMuZnJhZ21lbnRzID0gdm9pZCAwLCB0aGlzLmZyYWdtZW50SGludCA9IHZvaWQgMCwgdGhpcy5wYXJ0TGlzdCA9IG51bGwsIHRoaXMuZGF0ZVJhbmdlcyA9IHZvaWQgMCwgdGhpcy5kYXRlUmFuZ2VUYWdDb3VudCA9IDAsIHRoaXMubGl2ZSA9ICEwLCB0aGlzLnJlcXVlc3RTY2hlZHVsZWQgPSAtMSwgdGhpcy5hZ2VIZWFkZXIgPSAwLCB0aGlzLmFkdmFuY2VkRGF0ZVRpbWUgPSB2b2lkIDAsIHRoaXMudXBkYXRlZCA9ICEwLCB0aGlzLmFkdmFuY2VkID0gITAsIHRoaXMubWlzc2VzID0gMCwgdGhpcy5zdGFydENDID0gMCwgdGhpcy5zdGFydFNOID0gMCwgdGhpcy5zdGFydFRpbWVPZmZzZXQgPSBudWxsLCB0aGlzLnRhcmdldGR1cmF0aW9uID0gMCwgdGhpcy50b3RhbGR1cmF0aW9uID0gMCwgdGhpcy50eXBlID0gbnVsbCwgdGhpcy51cmwgPSB2b2lkIDAsIHRoaXMubTN1OCA9IFwiXCIsIHRoaXMudmVyc2lvbiA9IG51bGwsIHRoaXMuY2FuQmxvY2tSZWxvYWQgPSAhMSwgdGhpcy5jYW5Ta2lwVW50aWwgPSAwLCB0aGlzLmNhblNraXBEYXRlUmFuZ2VzID0gITEsIHRoaXMuc2tpcHBlZFNlZ21lbnRzID0gMCwgdGhpcy5yZWNlbnRseVJlbW92ZWREYXRlcmFuZ2VzID0gdm9pZCAwLCB0aGlzLnBhcnRIb2xkQmFjayA9IDAsIHRoaXMuaG9sZEJhY2sgPSAwLCB0aGlzLnBhcnRUYXJnZXQgPSAwLCB0aGlzLnByZWxvYWRIaW50ID0gdm9pZCAwLCB0aGlzLnJlbmRpdGlvblJlcG9ydHMgPSB2b2lkIDAsIHRoaXMudHVuZUluR29hbCA9IDAsIHRoaXMuZGVsdGFVcGRhdGVGYWlsZWQgPSB2b2lkIDAsIHRoaXMuZHJpZnRTdGFydFRpbWUgPSAwLCB0aGlzLmRyaWZ0RW5kVGltZSA9IDAsIHRoaXMuZHJpZnRTdGFydCA9IDAsIHRoaXMuZHJpZnRFbmQgPSAwLCB0aGlzLmVuY3J5cHRlZEZyYWdtZW50cyA9IHZvaWQgMCwgdGhpcy5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG51bGwsIHRoaXMudmFyaWFibGVMaXN0ID0gbnVsbCwgdGhpcy5oYXNWYXJpYWJsZVJlZnMgPSAhMSwgdGhpcy5hcHBsaWVkVGltZWxpbmVPZmZzZXQgPSB2b2lkIDAsIHRoaXMuZnJhZ21lbnRzID0gW10sIHRoaXMuZW5jcnlwdGVkRnJhZ21lbnRzID0gW10sIHRoaXMuZGF0ZVJhbmdlcyA9IHt9LCB0aGlzLnVybCA9IGU7XG4gIH1cbiAgcmVsb2FkZWQoZSkge1xuICAgIGlmICghZSkge1xuICAgICAgdGhpcy5hZHZhbmNlZCA9ICEwLCB0aGlzLnVwZGF0ZWQgPSAhMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdCA9IHRoaXMubGFzdFBhcnRTbiAtIGUubGFzdFBhcnRTbiwgciA9IHRoaXMubGFzdFBhcnRJbmRleCAtIGUubGFzdFBhcnRJbmRleDtcbiAgICB0aGlzLnVwZGF0ZWQgPSB0aGlzLmVuZFNOICE9PSBlLmVuZFNOIHx8ICEhciB8fCAhIXQgfHwgIXRoaXMubGl2ZSwgdGhpcy5hZHZhbmNlZCA9IHRoaXMuZW5kU04gPiBlLmVuZFNOIHx8IHQgPiAwIHx8IHQgPT09IDAgJiYgciA+IDAsIHRoaXMudXBkYXRlZCB8fCB0aGlzLmFkdmFuY2VkID8gdGhpcy5taXNzZXMgPSBNYXRoLmZsb29yKGUubWlzc2VzICogMC42KSA6IHRoaXMubWlzc2VzID0gZS5taXNzZXMgKyAxO1xuICB9XG4gIGhhc0tleShlKSB7XG4gICAgcmV0dXJuIHRoaXMuZW5jcnlwdGVkRnJhZ21lbnRzLnNvbWUoKHQpID0+IHtcbiAgICAgIGxldCByID0gdC5kZWNyeXB0ZGF0YTtcbiAgICAgIHJldHVybiByIHx8ICh0LnNldEtleUZvcm1hdChlLmtleUZvcm1hdCksIHIgPSB0LmRlY3J5cHRkYXRhKSwgISFyICYmIGUubWF0Y2hlcyhyKTtcbiAgICB9KTtcbiAgfVxuICBnZXQgaGFzUHJvZ3JhbURhdGVUaW1lKCkge1xuICAgIHJldHVybiB0aGlzLmZyYWdtZW50cy5sZW5ndGggPyB1ZSh0aGlzLmZyYWdtZW50c1t0aGlzLmZyYWdtZW50cy5sZW5ndGggLSAxXS5wcm9ncmFtRGF0ZVRpbWUpIDogITE7XG4gIH1cbiAgZ2V0IGxldmVsVGFyZ2V0RHVyYXRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuYXZlcmFnZXRhcmdldGR1cmF0aW9uIHx8IHRoaXMudGFyZ2V0ZHVyYXRpb24gfHwgRmI7XG4gIH1cbiAgZ2V0IGRyaWZ0KCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmRyaWZ0RW5kVGltZSAtIHRoaXMuZHJpZnRTdGFydFRpbWU7XG4gICAgcmV0dXJuIGUgPiAwID8gKHRoaXMuZHJpZnRFbmQgLSB0aGlzLmRyaWZ0U3RhcnQpICogMWUzIC8gZSA6IDE7XG4gIH1cbiAgZ2V0IGVkZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFydEVuZCB8fCB0aGlzLmZyYWdtZW50RW5kO1xuICB9XG4gIGdldCBwYXJ0RW5kKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAoZSA9IHRoaXMucGFydExpc3QpICE9IG51bGwgJiYgZS5sZW5ndGggPyB0aGlzLnBhcnRMaXN0W3RoaXMucGFydExpc3QubGVuZ3RoIC0gMV0uZW5kIDogdGhpcy5mcmFnbWVudEVuZDtcbiAgfVxuICBnZXQgZnJhZ21lbnRFbmQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJhZ21lbnRzLmxlbmd0aCA/IHRoaXMuZnJhZ21lbnRzW3RoaXMuZnJhZ21lbnRzLmxlbmd0aCAtIDFdLmVuZCA6IDA7XG4gIH1cbiAgZ2V0IGZyYWdtZW50U3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZnJhZ21lbnRzLmxlbmd0aCA/IHRoaXMuZnJhZ21lbnRzWzBdLnN0YXJ0IDogMDtcbiAgfVxuICBnZXQgYWdlKCkge1xuICAgIHJldHVybiB0aGlzLmFkdmFuY2VkRGF0ZVRpbWUgPyBNYXRoLm1heChEYXRlLm5vdygpIC0gdGhpcy5hZHZhbmNlZERhdGVUaW1lLCAwKSAvIDFlMyA6IDA7XG4gIH1cbiAgZ2V0IGxhc3RQYXJ0SW5kZXgoKSB7XG4gICAgdmFyIGU7XG4gICAgcmV0dXJuIChlID0gdGhpcy5wYXJ0TGlzdCkgIT0gbnVsbCAmJiBlLmxlbmd0aCA/IHRoaXMucGFydExpc3RbdGhpcy5wYXJ0TGlzdC5sZW5ndGggLSAxXS5pbmRleCA6IC0xO1xuICB9XG4gIGdldCBtYXhQYXJ0SW5kZXgoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMucGFydExpc3Q7XG4gICAgaWYgKGUpIHtcbiAgICAgIGNvbnN0IHQgPSB0aGlzLmxhc3RQYXJ0SW5kZXg7XG4gICAgICBpZiAodCAhPT0gLTEpIHtcbiAgICAgICAgZm9yIChsZXQgciA9IGUubGVuZ3RoOyByLS07IClcbiAgICAgICAgICBpZiAoZVtyXS5pbmRleCA+IHQpXG4gICAgICAgICAgICByZXR1cm4gZVtyXS5pbmRleDtcbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG4gIGdldCBsYXN0UGFydFNuKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAoZSA9IHRoaXMucGFydExpc3QpICE9IG51bGwgJiYgZS5sZW5ndGggPyB0aGlzLnBhcnRMaXN0W3RoaXMucGFydExpc3QubGVuZ3RoIC0gMV0uZnJhZ21lbnQuc24gOiB0aGlzLmVuZFNOO1xuICB9XG4gIGdldCBleHBpcmVkKCkge1xuICAgIGlmICh0aGlzLmxpdmUgJiYgdGhpcy5hZ2UgJiYgdGhpcy5taXNzZXMgPCAzKSB7XG4gICAgICBjb25zdCBlID0gdGhpcy5wYXJ0RW5kIC0gdGhpcy5mcmFnbWVudFN0YXJ0O1xuICAgICAgcmV0dXJuIHRoaXMuYWdlID4gTWF0aC5tYXgoZSwgdGhpcy50b3RhbGR1cmF0aW9uKSArIHRoaXMubGV2ZWxUYXJnZXREdXJhdGlvbjtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG59XG5mdW5jdGlvbiB4dShzLCBlKSB7XG4gIHJldHVybiBzLmxlbmd0aCA9PT0gZS5sZW5ndGggPyAhcy5zb21lKCh0LCByKSA9PiB0ICE9PSBlW3JdKSA6ICExO1xufVxuZnVuY3Rpb24gYmgocywgZSkge1xuICByZXR1cm4gIXMgJiYgIWUgPyAhMCA6ICFzIHx8ICFlID8gITEgOiB4dShzLCBlKTtcbn1cbmZ1bmN0aW9uIEluKHMpIHtcbiAgcmV0dXJuIHMgPT09IFwiQUVTLTEyOFwiIHx8IHMgPT09IFwiQUVTLTI1NlwiIHx8IHMgPT09IFwiQUVTLTI1Ni1DVFJcIjtcbn1cbmZ1bmN0aW9uIFN1KHMpIHtcbiAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSBcIkFFUy0xMjhcIjpcbiAgICBjYXNlIFwiQUVTLTI1NlwiOlxuICAgICAgcmV0dXJuIE9zLmNiYztcbiAgICBjYXNlIFwiQUVTLTI1Ni1DVFJcIjpcbiAgICAgIHJldHVybiBPcy5jdHI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBmdWxsIHNlZ21lbnQgbWV0aG9kICR7c31gKTtcbiAgfVxufVxuZnVuY3Rpb24gYnUocykge1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKGF0b2IocyksIChlKSA9PiBlLmNoYXJDb2RlQXQoMCkpO1xufVxuZnVuY3Rpb24gaGMocykge1xuICByZXR1cm4gVWludDhBcnJheS5mcm9tKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzKSksIChlKSA9PiBlLmNoYXJDb2RlQXQoMCkpO1xufVxuZnVuY3Rpb24gVWIocykge1xuICBjb25zdCBlID0gaGMocykuc3ViYXJyYXkoMCwgMTYpLCB0ID0gbmV3IFVpbnQ4QXJyYXkoMTYpO1xuICByZXR1cm4gdC5zZXQoZSwgMTYgLSBlLmxlbmd0aCksIHQ7XG59XG5mdW5jdGlvbiB6ZyhzKSB7XG4gIGNvbnN0IGUgPSBmdW5jdGlvbihyLCBuLCBpKSB7XG4gICAgY29uc3QgbyA9IHJbbl07XG4gICAgcltuXSA9IHJbaV0sIHJbaV0gPSBvO1xuICB9O1xuICBlKHMsIDAsIDMpLCBlKHMsIDEsIDIpLCBlKHMsIDQsIDUpLCBlKHMsIDYsIDcpO1xufVxuZnVuY3Rpb24gJGIocykge1xuICBjb25zdCBlID0gcy5zcGxpdChcIjpcIik7XG4gIGxldCB0ID0gbnVsbDtcbiAgaWYgKGVbMF0gPT09IFwiZGF0YVwiICYmIGUubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgciA9IGVbMV0uc3BsaXQoXCI7XCIpLCBuID0gcltyLmxlbmd0aCAtIDFdLnNwbGl0KFwiLFwiKTtcbiAgICBpZiAobi5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IGkgPSBuWzBdID09PSBcImJhc2U2NFwiLCBvID0gblsxXTtcbiAgICAgIGkgPyAoci5zcGxpY2UoLTEsIDEpLCB0ID0gYnUobykpIDogdCA9IFViKG8pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdDtcbn1cbmNvbnN0IHJhID0gdHlwZW9mIHNlbGYgPCBcInVcIiA/IHNlbGYgOiB2b2lkIDA7XG52YXIgbXQgPSB7XG4gIENMRUFSS0VZOiBcIm9yZy53My5jbGVhcmtleVwiLFxuICBGQUlSUExBWTogXCJjb20uYXBwbGUuZnBzXCIsXG4gIFBMQVlSRUFEWTogXCJjb20ubWljcm9zb2Z0LnBsYXlyZWFkeVwiLFxuICBXSURFVklORTogXCJjb20ud2lkZXZpbmUuYWxwaGFcIlxufSwgbHIgPSB7XG4gIENMRUFSS0VZOiBcIm9yZy53My5jbGVhcmtleVwiLFxuICBGQUlSUExBWTogXCJjb20uYXBwbGUuc3RyZWFtaW5na2V5ZGVsaXZlcnlcIixcbiAgUExBWVJFQURZOiBcImNvbS5taWNyb3NvZnQucGxheXJlYWR5XCIsXG4gIFdJREVWSU5FOiBcInVybjp1dWlkOmVkZWY4YmE5LTc5ZDYtNGFjZS1hM2M4LTI3ZGNkNTFkMjFlZFwiXG59O1xuZnVuY3Rpb24gcG8ocykge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIGxyLkZBSVJQTEFZOlxuICAgICAgcmV0dXJuIG10LkZBSVJQTEFZO1xuICAgIGNhc2UgbHIuUExBWVJFQURZOlxuICAgICAgcmV0dXJuIG10LlBMQVlSRUFEWTtcbiAgICBjYXNlIGxyLldJREVWSU5FOlxuICAgICAgcmV0dXJuIG10LldJREVWSU5FO1xuICAgIGNhc2UgbHIuQ0xFQVJLRVk6XG4gICAgICByZXR1cm4gbXQuQ0xFQVJLRVk7XG4gIH1cbn1cbmZ1bmN0aW9uIGZsKHMpIHtcbiAgc3dpdGNoIChzKSB7XG4gICAgY2FzZSBtdC5GQUlSUExBWTpcbiAgICAgIHJldHVybiBsci5GQUlSUExBWTtcbiAgICBjYXNlIG10LlBMQVlSRUFEWTpcbiAgICAgIHJldHVybiBsci5QTEFZUkVBRFk7XG4gICAgY2FzZSBtdC5XSURFVklORTpcbiAgICAgIHJldHVybiBsci5XSURFVklORTtcbiAgICBjYXNlIG10LkNMRUFSS0VZOlxuICAgICAgcmV0dXJuIGxyLkNMRUFSS0VZO1xuICB9XG59XG5mdW5jdGlvbiB6bihzKSB7XG4gIGNvbnN0IHtcbiAgICBkcm1TeXN0ZW1zOiBlLFxuICAgIHdpZGV2aW5lTGljZW5zZVVybDogdFxuICB9ID0gcywgciA9IGUgPyBbbXQuRkFJUlBMQVksIG10LldJREVWSU5FLCBtdC5QTEFZUkVBRFksIG10LkNMRUFSS0VZXS5maWx0ZXIoKG4pID0+ICEhZVtuXSkgOiBbXTtcbiAgcmV0dXJuICFyW210LldJREVWSU5FXSAmJiB0ICYmIHIucHVzaChtdC5XSURFVklORSksIHI7XG59XG5jb25zdCBZZyA9IChmdW5jdGlvbihzKSB7XG4gIHJldHVybiByYSAhPSBudWxsICYmIChzID0gcmEubmF2aWdhdG9yKSAhPSBudWxsICYmIHMucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzID8gc2VsZi5uYXZpZ2F0b3IucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzLmJpbmQoc2VsZi5uYXZpZ2F0b3IpIDogbnVsbDtcbn0pKCk7XG5mdW5jdGlvbiBHYihzLCBlLCB0LCByKSB7XG4gIGxldCBuO1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIG10LkZBSVJQTEFZOlxuICAgICAgbiA9IFtcImNlbmNcIiwgXCJzaW5mXCJdO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBtdC5XSURFVklORTpcbiAgICBjYXNlIG10LlBMQVlSRUFEWTpcbiAgICAgIG4gPSBbXCJjZW5jXCJdO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBtdC5DTEVBUktFWTpcbiAgICAgIG4gPSBbXCJjZW5jXCIsIFwia2V5aWRzXCJdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBrZXktc3lzdGVtOiAke3N9YCk7XG4gIH1cbiAgcmV0dXJuIFZiKG4sIGUsIHQsIHIpO1xufVxuZnVuY3Rpb24gVmIocywgZSwgdCwgcikge1xuICByZXR1cm4gW3tcbiAgICBpbml0RGF0YVR5cGVzOiBzLFxuICAgIHBlcnNpc3RlbnRTdGF0ZTogci5wZXJzaXN0ZW50U3RhdGUgfHwgXCJvcHRpb25hbFwiLFxuICAgIGRpc3RpbmN0aXZlSWRlbnRpZmllcjogci5kaXN0aW5jdGl2ZUlkZW50aWZpZXIgfHwgXCJvcHRpb25hbFwiLFxuICAgIHNlc3Npb25UeXBlczogci5zZXNzaW9uVHlwZXMgfHwgW3Iuc2Vzc2lvblR5cGUgfHwgXCJ0ZW1wb3JhcnlcIl0sXG4gICAgYXVkaW9DYXBhYmlsaXRpZXM6IGUubWFwKChpKSA9PiAoe1xuICAgICAgY29udGVudFR5cGU6IGBhdWRpby9tcDQ7IGNvZGVjcz0ke2l9YCxcbiAgICAgIHJvYnVzdG5lc3M6IHIuYXVkaW9Sb2J1c3RuZXNzIHx8IFwiXCIsXG4gICAgICBlbmNyeXB0aW9uU2NoZW1lOiByLmF1ZGlvRW5jcnlwdGlvblNjaGVtZSB8fCBudWxsXG4gICAgfSkpLFxuICAgIHZpZGVvQ2FwYWJpbGl0aWVzOiB0Lm1hcCgoaSkgPT4gKHtcbiAgICAgIGNvbnRlbnRUeXBlOiBgdmlkZW8vbXA0OyBjb2RlY3M9JHtpfWAsXG4gICAgICByb2J1c3RuZXNzOiByLnZpZGVvUm9idXN0bmVzcyB8fCBcIlwiLFxuICAgICAgZW5jcnlwdGlvblNjaGVtZTogci52aWRlb0VuY3J5cHRpb25TY2hlbWUgfHwgbnVsbFxuICAgIH0pKVxuICB9XTtcbn1cbmZ1bmN0aW9uIGpiKHMpIHtcbiAgdmFyIGU7XG4gIHJldHVybiAhIXMgJiYgKHMuc2Vzc2lvblR5cGUgPT09IFwicGVyc2lzdGVudC1saWNlbnNlXCIgfHwgISEoKGUgPSBzLnNlc3Npb25UeXBlcykgIT0gbnVsbCAmJiBlLnNvbWUoKHQpID0+IHQgPT09IFwicGVyc2lzdGVudC1saWNlbnNlXCIpKSk7XG59XG5mdW5jdGlvbiBLYihzKSB7XG4gIGNvbnN0IGUgPSBuZXcgVWludDE2QXJyYXkocy5idWZmZXIsIHMuYnl0ZU9mZnNldCwgcy5ieXRlTGVuZ3RoIC8gMiksIHQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIEFycmF5LmZyb20oZSkpLCByID0gdC5zdWJzdHJpbmcodC5pbmRleE9mKFwiPFwiKSwgdC5sZW5ndGgpLCBvID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhyLCBcInRleHQveG1sXCIpLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiS0lEXCIpWzBdO1xuICBpZiAobykge1xuICAgIGNvbnN0IGEgPSBvLmNoaWxkTm9kZXNbMF0gPyBvLmNoaWxkTm9kZXNbMF0ubm9kZVZhbHVlIDogby5nZXRBdHRyaWJ1dGUoXCJWQUxVRVwiKTtcbiAgICBpZiAoYSkge1xuICAgICAgY29uc3QgbCA9IGJ1KGEpLnN1YmFycmF5KDAsIDE2KTtcbiAgICAgIHJldHVybiB6ZyhsKSwgbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5sZXQgV2kgPSB7fTtcbmNsYXNzIHlpIHtcbiAgc3RhdGljIGNsZWFyS2V5VXJpVG9LZXlJZE1hcCgpIHtcbiAgICBXaSA9IHt9O1xuICB9XG4gIHN0YXRpYyBzZXRLZXlJZEZvclVyaShlLCB0KSB7XG4gICAgV2lbZV0gPSB0O1xuICB9XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4gPSBbMV0sIGkgPSBudWxsLCBvKSB7XG4gICAgdGhpcy51cmkgPSB2b2lkIDAsIHRoaXMubWV0aG9kID0gdm9pZCAwLCB0aGlzLmtleUZvcm1hdCA9IHZvaWQgMCwgdGhpcy5rZXlGb3JtYXRWZXJzaW9ucyA9IHZvaWQgMCwgdGhpcy5lbmNyeXB0ZWQgPSB2b2lkIDAsIHRoaXMuaXNDb21tb25FbmNyeXB0aW9uID0gdm9pZCAwLCB0aGlzLml2ID0gbnVsbCwgdGhpcy5rZXkgPSBudWxsLCB0aGlzLmtleUlkID0gbnVsbCwgdGhpcy5wc3NoID0gbnVsbCwgdGhpcy5tZXRob2QgPSBlLCB0aGlzLnVyaSA9IHQsIHRoaXMua2V5Rm9ybWF0ID0gciwgdGhpcy5rZXlGb3JtYXRWZXJzaW9ucyA9IG4sIHRoaXMuaXYgPSBpLCB0aGlzLmVuY3J5cHRlZCA9IGUgPyBlICE9PSBcIk5PTkVcIiA6ICExLCB0aGlzLmlzQ29tbW9uRW5jcnlwdGlvbiA9IHRoaXMuZW5jcnlwdGVkICYmICFJbihlKSwgbyAhPSBudWxsICYmIG8uc3RhcnRzV2l0aChcIjB4XCIpICYmICh0aGlzLmtleUlkID0gbmV3IFVpbnQ4QXJyYXkoSWcobykpKTtcbiAgfVxuICBtYXRjaGVzKGUpIHtcbiAgICByZXR1cm4gZS51cmkgPT09IHRoaXMudXJpICYmIGUubWV0aG9kID09PSB0aGlzLm1ldGhvZCAmJiBlLmVuY3J5cHRlZCA9PT0gdGhpcy5lbmNyeXB0ZWQgJiYgZS5rZXlGb3JtYXQgPT09IHRoaXMua2V5Rm9ybWF0ICYmIHh1KGUua2V5Rm9ybWF0VmVyc2lvbnMsIHRoaXMua2V5Rm9ybWF0VmVyc2lvbnMpICYmIGJoKGUuaXYsIHRoaXMuaXYpICYmIGJoKGUua2V5SWQsIHRoaXMua2V5SWQpO1xuICB9XG4gIGlzU3VwcG9ydGVkKCkge1xuICAgIGlmICh0aGlzLm1ldGhvZCkge1xuICAgICAgaWYgKEluKHRoaXMubWV0aG9kKSB8fCB0aGlzLm1ldGhvZCA9PT0gXCJOT05FXCIpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICAgIGlmICh0aGlzLmtleUZvcm1hdCA9PT0gXCJpZGVudGl0eVwiKVxuICAgICAgICByZXR1cm4gdGhpcy5tZXRob2QgPT09IFwiU0FNUExFLUFFU1wiO1xuICAgICAgc3dpdGNoICh0aGlzLmtleUZvcm1hdCkge1xuICAgICAgICBjYXNlIGxyLkZBSVJQTEFZOlxuICAgICAgICBjYXNlIGxyLldJREVWSU5FOlxuICAgICAgICBjYXNlIGxyLlBMQVlSRUFEWTpcbiAgICAgICAgY2FzZSBsci5DTEVBUktFWTpcbiAgICAgICAgICByZXR1cm4gW1wiU0FNUExFLUFFU1wiLCBcIlNBTVBMRS1BRVMtQ0VOQ1wiLCBcIlNBTVBMRS1BRVMtQ1RSXCJdLmluZGV4T2YodGhpcy5tZXRob2QpICE9PSAtMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGdldERlY3J5cHREYXRhKGUpIHtcbiAgICBpZiAoIXRoaXMuZW5jcnlwdGVkIHx8ICF0aGlzLnVyaSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGlmIChJbih0aGlzLm1ldGhvZCkpIHtcbiAgICAgIGxldCBuID0gdGhpcy5pdjtcbiAgICAgIHJldHVybiBuIHx8ICh0eXBlb2YgZSAhPSBcIm51bWJlclwiICYmIChydC53YXJuKGBtaXNzaW5nIElWIGZvciBpbml0aWFsaXphdGlvbiBzZWdtZW50IHdpdGggbWV0aG9kPVwiJHt0aGlzLm1ldGhvZH1cIiAtIGNvbXBsaWFuY2UgaXNzdWVgKSwgZSA9IDApLCBuID0gSGIoZSkpLCBuZXcgeWkodGhpcy5tZXRob2QsIHRoaXMudXJpLCBcImlkZW50aXR5XCIsIHRoaXMua2V5Rm9ybWF0VmVyc2lvbnMsIG4pO1xuICAgIH1cbiAgICBpZiAodGhpcy5wc3NoICYmIHRoaXMua2V5SWQpXG4gICAgICByZXR1cm4gdGhpcztcbiAgICBjb25zdCB0ID0gJGIodGhpcy51cmkpO1xuICAgIGlmICh0KVxuICAgICAgc3dpdGNoICh0aGlzLmtleUZvcm1hdCkge1xuICAgICAgICBjYXNlIGxyLldJREVWSU5FOlxuICAgICAgICAgIGlmICh0aGlzLnBzc2ggPSB0LCAhdGhpcy5rZXlJZCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IFdTKHQuYnVmZmVyKTtcbiAgICAgICAgICAgIGlmIChuLmxlbmd0aCkge1xuICAgICAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICAgICAgY29uc3QgaSA9IG5bMF07XG4gICAgICAgICAgICAgIHRoaXMua2V5SWQgPSAociA9IGkua2lkcykgIT0gbnVsbCAmJiByLmxlbmd0aCA/IGkua2lkc1swXSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghdGhpcy5rZXlJZCkge1xuICAgICAgICAgICAgY29uc3QgbiA9IHQubGVuZ3RoIC0gMjI7XG4gICAgICAgICAgICB0aGlzLmtleUlkID0gdC5zdWJhcnJheShuLCBuICsgMTYpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBsci5QTEFZUkVBRFk6IHtcbiAgICAgICAgICBjb25zdCBuID0gbmV3IFVpbnQ4QXJyYXkoWzE1NCwgNCwgMjQwLCAxMjEsIDE1MiwgNjQsIDY2LCAxMzQsIDE3MSwgMTQ2LCAyMzAsIDkxLCAyMjQsIDEzNiwgOTUsIDE0OV0pO1xuICAgICAgICAgIHRoaXMucHNzaCA9IHFTKG4sIG51bGwsIHQpLCB0aGlzLmtleUlkID0gS2IodCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGxldCBuID0gdC5zdWJhcnJheSgwLCAxNik7XG4gICAgICAgICAgaWYgKG4ubGVuZ3RoICE9PSAxNikge1xuICAgICAgICAgICAgY29uc3QgaSA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgICAgICAgICAgIGkuc2V0KG4sIDE2IC0gbi5sZW5ndGgpLCBuID0gaTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5rZXlJZCA9IG47XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBpZiAoIXRoaXMua2V5SWQgfHwgdGhpcy5rZXlJZC5ieXRlTGVuZ3RoICE9PSAxNikge1xuICAgICAgbGV0IG4gPSBXaVt0aGlzLnVyaV07XG4gICAgICBpZiAoIW4pIHtcbiAgICAgICAgY29uc3QgaSA9IE9iamVjdC5rZXlzKFdpKS5sZW5ndGggJSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICAgICAgbiA9IG5ldyBVaW50OEFycmF5KDE2KSwgbmV3IERhdGFWaWV3KG4uYnVmZmVyLCAxMiwgNCkuc2V0VWludDMyKDAsIGkpLCB5aS5zZXRLZXlJZEZvclVyaSh0aGlzLnVyaSwgbik7XG4gICAgICB9XG4gICAgICB0aGlzLmtleUlkID0gbjtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cbmZ1bmN0aW9uIEhiKHMpIHtcbiAgY29uc3QgZSA9IG5ldyBVaW50OEFycmF5KDE2KTtcbiAgZm9yIChsZXQgdCA9IDEyOyB0IDwgMTY7IHQrKylcbiAgICBlW3RdID0gcyA+PiA4ICogKDE1IC0gdCkgJiAyNTU7XG4gIHJldHVybiBlO1xufVxuY29uc3QgVGggPSAvI0VYVC1YLVNUUkVBTS1JTkY6KFteXFxyXFxuXSopKD86W1xcclxcbl0oPzojW15cXHJcXG5dKik/KSooW15cXHJcXG5dKyl8I0VYVC1YLShTRVNTSU9OLURBVEF8U0VTU0lPTi1LRVl8REVGSU5FfENPTlRFTlQtU1RFRVJJTkd8U1RBUlQpOihbXlxcclxcbl0qKVtcXHJcXG5dKy9nLCB3aCA9IC8jRVhULVgtTUVESUE6KC4qKS9nLCBxYiA9IC9eI0VYVCg/OklORnwtWC1UQVJHRVREVVJBVElPTik6L20sIGdsID0gbmV3IFJlZ0V4cChbXG4gIC8jRVhUSU5GOlxccyooXFxkKig/OlxcLlxcZCspPykoPzosKC4qKVxccyspPy8uc291cmNlLFxuICAvLyBkdXJhdGlvbiAoI0VYVElORjo8ZHVyYXRpb24+LDx0aXRsZT4pLCBncm91cCAxID0+IGR1cmF0aW9uLCBncm91cCAyID0+IHRpdGxlXG4gIC8oPyEjKSAqKFxcU1teXFxyXFxuXSopLy5zb3VyY2UsXG4gIC8vIHNlZ21lbnQgVVJJLCBncm91cCAzID0+IHRoZSBVUkkgKG5vdGUgbmV3bGluZSBpcyBub3QgZWF0ZW4pXG4gIC8jLiovLnNvdXJjZVxuICAvLyBBbGwgb3RoZXIgbm9uLXNlZ21lbnQgb3JpZW50ZWQgdGFncyB3aWxsIG1hdGNoIHdpdGggYWxsIGdyb3VwcyBlbXB0eVxuXS5qb2luKFwifFwiKSwgXCJnXCIpLCBXYiA9IG5ldyBSZWdFeHAoWy8jRVhULVgtKFBST0dSQU0tREFURS1USU1FfEJZVEVSQU5HRXxEQVRFUkFOR0V8REVGSU5FfEtFWXxNQVB8UEFSVHxQQVJULUlORnxQTEFZTElTVC1UWVBFfFBSRUxPQUQtSElOVHxSRU5ESVRJT04tUkVQT1JUfFNFUlZFUi1DT05UUk9MfFNLSVB8U1RBUlQpOiguKykvLnNvdXJjZSwgLyNFWFQtWC0oQklUUkFURXxESVNDT05USU5VSVRZLVNFUVVFTkNFfE1FRElBLVNFUVVFTkNFfFRBUkdFVERVUkFUSU9OfFZFUlNJT04pOiAqKFxcZCspLy5zb3VyY2UsIC8jRVhULVgtKERJU0NPTlRJTlVJVFl8RU5ETElTVHxHQVB8SU5ERVBFTkRFTlQtU0VHTUVOVFMpLy5zb3VyY2UsIC8oIykoW146XSopOiguKikvLnNvdXJjZSwgLygjKSguKikoPzouKilcXHI/XFxuPy8uc291cmNlXS5qb2luKFwifFwiKSk7XG5jbGFzcyB6ciB7XG4gIHN0YXRpYyBmaW5kR3JvdXAoZSwgdCkge1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgZS5sZW5ndGg7IHIrKykge1xuICAgICAgY29uc3QgbiA9IGVbcl07XG4gICAgICBpZiAobi5pZCA9PT0gdClcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICB9XG4gIHN0YXRpYyByZXNvbHZlKGUsIHQpIHtcbiAgICByZXR1cm4gaHUuYnVpbGRBYnNvbHV0ZVVSTCh0LCBlLCB7XG4gICAgICBhbHdheXNOb3JtYWxpemU6ICEwXG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGlzTWVkaWFQbGF5bGlzdChlKSB7XG4gICAgcmV0dXJuIHFiLnRlc3QoZSk7XG4gIH1cbiAgc3RhdGljIHBhcnNlTWFzdGVyUGxheWxpc3QoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBFaChlKSwgbiA9IHtcbiAgICAgIGNvbnRlbnRTdGVlcmluZzogbnVsbCxcbiAgICAgIGxldmVsczogW10sXG4gICAgICBwbGF5bGlzdFBhcnNpbmdFcnJvcjogbnVsbCxcbiAgICAgIHNlc3Npb25EYXRhOiBudWxsLFxuICAgICAgc2Vzc2lvbktleXM6IG51bGwsXG4gICAgICBzdGFydFRpbWVPZmZzZXQ6IG51bGwsXG4gICAgICB2YXJpYWJsZUxpc3Q6IG51bGwsXG4gICAgICBoYXNWYXJpYWJsZVJlZnM6IHJcbiAgICB9LCBpID0gW107XG4gICAgaWYgKFRoLmxhc3RJbmRleCA9IDAsICFlLnN0YXJ0c1dpdGgoXCIjRVhUTTNVXCIpKVxuICAgICAgcmV0dXJuIG4ucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBuZXcgRXJyb3IoXCJubyBFWFRNM1UgZGVsaW1pdGVyXCIpLCBuO1xuICAgIGxldCBvO1xuICAgIGZvciAoOyAobyA9IFRoLmV4ZWMoZSkpICE9IG51bGw7IClcbiAgICAgIGlmIChvWzFdKSB7XG4gICAgICAgIHZhciBhO1xuICAgICAgICBjb25zdCBjID0gbmV3IGd0KG9bMV0sIG4pLCB1ID0gZGMobiwgb1syXSksIGQgPSB7XG4gICAgICAgICAgYXR0cnM6IGMsXG4gICAgICAgICAgYml0cmF0ZTogYy5kZWNpbWFsSW50ZWdlcihcIkJBTkRXSURUSFwiKSB8fCBjLmRlY2ltYWxJbnRlZ2VyKFwiQVZFUkFHRS1CQU5EV0lEVEhcIiksXG4gICAgICAgICAgbmFtZTogYy5OQU1FLFxuICAgICAgICAgIHVybDogenIucmVzb2x2ZSh1LCB0KVxuICAgICAgICB9LCBoID0gYy5kZWNpbWFsUmVzb2x1dGlvbihcIlJFU09MVVRJT05cIik7XG4gICAgICAgIGggJiYgKGQud2lkdGggPSBoLndpZHRoLCBkLmhlaWdodCA9IGguaGVpZ2h0KSwgX2goYy5DT0RFQ1MsIGQpO1xuICAgICAgICBjb25zdCBmID0gY1tcIlNVUFBMRU1FTlRBTC1DT0RFQ1NcIl07XG4gICAgICAgIGYgJiYgKGQuc3VwcGxlbWVudGFsID0ge30sIF9oKGYsIGQuc3VwcGxlbWVudGFsKSksIChhID0gZC51bmtub3duQ29kZWNzKSAhPSBudWxsICYmIGEubGVuZ3RoIHx8IGkucHVzaChkKSwgbi5sZXZlbHMucHVzaChkKTtcbiAgICAgIH0gZWxzZSBpZiAob1szXSkge1xuICAgICAgICBjb25zdCBjID0gb1szXSwgdSA9IG9bNF07XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgXCJTRVNTSU9OLURBVEFcIjoge1xuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBndCh1LCBuKSwgaCA9IGRbXCJEQVRBLUlEXCJdO1xuICAgICAgICAgICAgaCAmJiAobi5zZXNzaW9uRGF0YSA9PT0gbnVsbCAmJiAobi5zZXNzaW9uRGF0YSA9IHt9KSwgbi5zZXNzaW9uRGF0YVtoXSA9IGQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJTRVNTSU9OLUtFWVwiOiB7XG4gICAgICAgICAgICBjb25zdCBkID0gQWgodSwgdCwgbik7XG4gICAgICAgICAgICBkLmVuY3J5cHRlZCAmJiBkLmlzU3VwcG9ydGVkKCkgPyAobi5zZXNzaW9uS2V5cyA9PT0gbnVsbCAmJiAobi5zZXNzaW9uS2V5cyA9IFtdKSwgbi5zZXNzaW9uS2V5cy5wdXNoKGQpKSA6IHJ0Lndhcm4oYFtLZXlzXSBJZ25vcmluZyBpbnZhbGlkIEVYVC1YLVNFU1NJT04tS0VZIHRhZzogXCIke3V9XCJgKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiREVGSU5FXCI6IHtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBndCh1LCBuKTtcbiAgICAgICAgICAgICAgeGgobiwgZCwgdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIkNPTlRFTlQtU1RFRVJJTkdcIjoge1xuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBndCh1LCBuKTtcbiAgICAgICAgICAgIG4uY29udGVudFN0ZWVyaW5nID0ge1xuICAgICAgICAgICAgICB1cmk6IHpyLnJlc29sdmUoZFtcIlNFUlZFUi1VUklcIl0sIHQpLFxuICAgICAgICAgICAgICBwYXRod2F5SWQ6IGRbXCJQQVRIV0FZLUlEXCJdIHx8IFwiLlwiXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJTVEFSVFwiOiB7XG4gICAgICAgICAgICBuLnN0YXJ0VGltZU9mZnNldCA9IEloKHUpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgY29uc3QgbCA9IGkubGVuZ3RoID4gMCAmJiBpLmxlbmd0aCA8IG4ubGV2ZWxzLmxlbmd0aDtcbiAgICByZXR1cm4gbi5sZXZlbHMgPSBsID8gaSA6IG4ubGV2ZWxzLCBuLmxldmVscy5sZW5ndGggPT09IDAgJiYgKG4ucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBuZXcgRXJyb3IoXCJubyBsZXZlbHMgZm91bmQgaW4gbWFuaWZlc3RcIikpLCBuO1xuICB9XG4gIHN0YXRpYyBwYXJzZU1hc3RlclBsYXlsaXN0TWVkaWEoZSwgdCwgcikge1xuICAgIGxldCBuO1xuICAgIGNvbnN0IGkgPSB7fSwgbyA9IHIubGV2ZWxzLCBhID0ge1xuICAgICAgQVVESU86IG8ubWFwKChjKSA9PiAoe1xuICAgICAgICBpZDogYy5hdHRycy5BVURJTyxcbiAgICAgICAgYXVkaW9Db2RlYzogYy5hdWRpb0NvZGVjXG4gICAgICB9KSksXG4gICAgICBTVUJUSVRMRVM6IG8ubWFwKChjKSA9PiAoe1xuICAgICAgICBpZDogYy5hdHRycy5TVUJUSVRMRVMsXG4gICAgICAgIHRleHRDb2RlYzogYy50ZXh0Q29kZWNcbiAgICAgIH0pKSxcbiAgICAgIFwiQ0xPU0VELUNBUFRJT05TXCI6IFtdXG4gICAgfTtcbiAgICBsZXQgbCA9IDA7XG4gICAgZm9yICh3aC5sYXN0SW5kZXggPSAwOyAobiA9IHdoLmV4ZWMoZSkpICE9PSBudWxsOyApIHtcbiAgICAgIGNvbnN0IGMgPSBuZXcgZ3QoblsxXSwgciksIHUgPSBjLlRZUEU7XG4gICAgICBpZiAodSkge1xuICAgICAgICBjb25zdCBkID0gYVt1XSwgaCA9IGlbdV0gfHwgW107XG4gICAgICAgIGlbdV0gPSBoO1xuICAgICAgICBjb25zdCBmID0gYy5MQU5HVUFHRSwgcCA9IGNbXCJBU1NPQy1MQU5HVUFHRVwiXSwgeSA9IGMuQ0hBTk5FTFMsIEUgPSBjLkNIQVJBQ1RFUklTVElDUywgYiA9IGNbXCJJTlNUUkVBTS1JRFwiXSwgUiA9IHtcbiAgICAgICAgICBhdHRyczogYyxcbiAgICAgICAgICBiaXRyYXRlOiAwLFxuICAgICAgICAgIGlkOiBsKyssXG4gICAgICAgICAgZ3JvdXBJZDogY1tcIkdST1VQLUlEXCJdIHx8IFwiXCIsXG4gICAgICAgICAgbmFtZTogYy5OQU1FIHx8IGYgfHwgXCJcIixcbiAgICAgICAgICB0eXBlOiB1LFxuICAgICAgICAgIGRlZmF1bHQ6IGMuYm9vbChcIkRFRkFVTFRcIiksXG4gICAgICAgICAgYXV0b3NlbGVjdDogYy5ib29sKFwiQVVUT1NFTEVDVFwiKSxcbiAgICAgICAgICBmb3JjZWQ6IGMuYm9vbChcIkZPUkNFRFwiKSxcbiAgICAgICAgICBsYW5nOiBmLFxuICAgICAgICAgIHVybDogYy5VUkkgPyB6ci5yZXNvbHZlKGMuVVJJLCB0KSA6IFwiXCJcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHAgJiYgKFIuYXNzb2NMYW5nID0gcCksIHkgJiYgKFIuY2hhbm5lbHMgPSB5KSwgRSAmJiAoUi5jaGFyYWN0ZXJpc3RpY3MgPSBFKSwgYiAmJiAoUi5pbnN0cmVhbUlkID0gYiksIGQgIT0gbnVsbCAmJiBkLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IEEgPSB6ci5maW5kR3JvdXAoZCwgUi5ncm91cElkKSB8fCBkWzBdO1xuICAgICAgICAgIFJoKFIsIEEsIFwiYXVkaW9Db2RlY1wiKSwgUmgoUiwgQSwgXCJ0ZXh0Q29kZWNcIik7XG4gICAgICAgIH1cbiAgICAgICAgaC5wdXNoKFIpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaTtcbiAgfVxuICBzdGF0aWMgcGFyc2VMZXZlbFBsYXlsaXN0KGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgICB2YXIgYTtcbiAgICBjb25zdCBsID0ge1xuICAgICAgdXJsOiB0XG4gICAgfSwgYyA9IG5ldyBOYih0KSwgdSA9IGMuZnJhZ21lbnRzLCBkID0gW107XG4gICAgbGV0IGggPSBudWxsLCBmID0gMCwgcCA9IDAsIHkgPSAwLCBFID0gMCwgYiA9IDAsIFIgPSBudWxsLCBBID0gbmV3IHVsKG4sIGwpLCBGLCBNLCBILCBLID0gLTEsIGogPSAhMSwgQyA9IG51bGwsIGs7XG4gICAgaWYgKGdsLmxhc3RJbmRleCA9IDAsIGMubTN1OCA9IGUsIGMuaGFzVmFyaWFibGVSZWZzID0gRWgoZSksICgoYSA9IGdsLmV4ZWMoZSkpID09IG51bGwgPyB2b2lkIDAgOiBhWzBdKSAhPT0gXCIjRVhUTTNVXCIpXG4gICAgICByZXR1cm4gYy5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG5ldyBFcnJvcihcIk1pc3NpbmcgZm9ybWF0IGlkZW50aWZpZXIgI0VYVE0zVVwiKSwgYztcbiAgICBmb3IgKDsgKEYgPSBnbC5leGVjKGUpKSAhPT0gbnVsbDsgKSB7XG4gICAgICBqICYmIChqID0gITEsIEEgPSBuZXcgdWwobiwgbCksIEEucGxheWxpc3RPZmZzZXQgPSB5LCBBLnNldFN0YXJ0KHkpLCBBLnNuID0gZiwgQS5jYyA9IEUsIGIgJiYgKEEuYml0cmF0ZSA9IGIpLCBBLmxldmVsID0gciwgaCAmJiAoQS5pbml0U2VnbWVudCA9IGgsIGgucmF3UHJvZ3JhbURhdGVUaW1lICYmIChBLnJhd1Byb2dyYW1EYXRlVGltZSA9IGgucmF3UHJvZ3JhbURhdGVUaW1lLCBoLnJhd1Byb2dyYW1EYXRlVGltZSA9IG51bGwpLCBDICYmIChBLnNldEJ5dGVSYW5nZShDKSwgQyA9IG51bGwpKSk7XG4gICAgICBjb25zdCBnID0gRlsxXTtcbiAgICAgIGlmIChnKSB7XG4gICAgICAgIEEuZHVyYXRpb24gPSBwYXJzZUZsb2F0KGcpO1xuICAgICAgICBjb25zdCB4ID0gKFwiIFwiICsgRlsyXSkuc2xpY2UoMSk7XG4gICAgICAgIEEudGl0bGUgPSB4IHx8IG51bGwsIEEudGFnTGlzdC5wdXNoKHggPyBbXCJJTkZcIiwgZywgeF0gOiBbXCJJTkZcIiwgZ10pO1xuICAgICAgfSBlbHNlIGlmIChGWzNdKSB7XG4gICAgICAgIGlmICh1ZShBLmR1cmF0aW9uKSkge1xuICAgICAgICAgIEEucGxheWxpc3RPZmZzZXQgPSB5LCBBLnNldFN0YXJ0KHkpLCBIICYmIENoKEEsIEgsIGMpLCBBLnNuID0gZiwgQS5sZXZlbCA9IHIsIEEuY2MgPSBFLCB1LnB1c2goQSk7XG4gICAgICAgICAgY29uc3QgeCA9IChcIiBcIiArIEZbM10pLnNsaWNlKDEpO1xuICAgICAgICAgIEEucmVsdXJsID0gZGMoYywgeCksIGZjKEEsIFIsIGQpLCBSID0gQSwgeSArPSBBLmR1cmF0aW9uLCBmKyssIHAgPSAwLCBqID0gITA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChGID0gRlswXS5tYXRjaChXYiksICFGKSB7XG4gICAgICAgICAgcnQud2FybihcIk5vIG1hdGNoZXMgb24gc2xvdyByZWdleCBtYXRjaCBmb3IgbGV2ZWwgcGxheWxpc3QhXCIpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoTSA9IDE7IE0gPCBGLmxlbmd0aCAmJiBGW01dID09PSB2b2lkIDA7IE0rKylcbiAgICAgICAgICA7XG4gICAgICAgIGNvbnN0IHggPSAoXCIgXCIgKyBGW01dKS5zbGljZSgxKSwgdyA9IChcIiBcIiArIEZbTSArIDFdKS5zbGljZSgxKSwgRCA9IEZbTSArIDJdID8gKFwiIFwiICsgRltNICsgMl0pLnNsaWNlKDEpIDogbnVsbDtcbiAgICAgICAgc3dpdGNoICh4KSB7XG4gICAgICAgICAgY2FzZSBcIkJZVEVSQU5HRVwiOlxuICAgICAgICAgICAgUiA/IEEuc2V0Qnl0ZVJhbmdlKHcsIFIpIDogQS5zZXRCeXRlUmFuZ2Uodyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiUFJPR1JBTS1EQVRFLVRJTUVcIjpcbiAgICAgICAgICAgIEEucmF3UHJvZ3JhbURhdGVUaW1lID0gdywgQS50YWdMaXN0LnB1c2goW1wiUFJPR1JBTS1EQVRFLVRJTUVcIiwgd10pLCBLID09PSAtMSAmJiAoSyA9IHUubGVuZ3RoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJQTEFZTElTVC1UWVBFXCI6XG4gICAgICAgICAgICBjLnR5cGUgJiYgbnMoYywgeCwgRiksIGMudHlwZSA9IHcudG9VcHBlckNhc2UoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJNRURJQS1TRVFVRU5DRVwiOlxuICAgICAgICAgICAgYy5zdGFydFNOICE9PSAwID8gbnMoYywgeCwgRikgOiB1Lmxlbmd0aCA+IDAgJiYga2goYywgeCwgRiksIGYgPSBjLnN0YXJ0U04gPSBwYXJzZUludCh3KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJTS0lQXCI6IHtcbiAgICAgICAgICAgIGMuc2tpcHBlZFNlZ21lbnRzICYmIG5zKGMsIHgsIEYpO1xuICAgICAgICAgICAgY29uc3QgTyA9IG5ldyBndCh3LCBjKSwgVSA9IE8uZGVjaW1hbEludGVnZXIoXCJTS0lQUEVELVNFR01FTlRTXCIpO1xuICAgICAgICAgICAgaWYgKHVlKFUpKSB7XG4gICAgICAgICAgICAgIGMuc2tpcHBlZFNlZ21lbnRzICs9IFU7XG4gICAgICAgICAgICAgIGZvciAobGV0IEwgPSBVOyBMLS07IClcbiAgICAgICAgICAgICAgICB1LnB1c2gobnVsbCk7XG4gICAgICAgICAgICAgIGYgKz0gVTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFYgPSBPLmVudW1lcmF0ZWRTdHJpbmcoXCJSRUNFTlRMWS1SRU1PVkVELURBVEVSQU5HRVNcIik7XG4gICAgICAgICAgICBWICYmIChjLnJlY2VudGx5UmVtb3ZlZERhdGVyYW5nZXMgPSAoYy5yZWNlbnRseVJlbW92ZWREYXRlcmFuZ2VzIHx8IFtdKS5jb25jYXQoVi5zcGxpdChcIlx0XCIpKSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIlRBUkdFVERVUkFUSU9OXCI6XG4gICAgICAgICAgICBjLnRhcmdldGR1cmF0aW9uICE9PSAwICYmIG5zKGMsIHgsIEYpLCBjLnRhcmdldGR1cmF0aW9uID0gTWF0aC5tYXgocGFyc2VJbnQodyksIDEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIlZFUlNJT05cIjpcbiAgICAgICAgICAgIGMudmVyc2lvbiAhPT0gbnVsbCAmJiBucyhjLCB4LCBGKSwgYy52ZXJzaW9uID0gcGFyc2VJbnQodyk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiSU5ERVBFTkRFTlQtU0VHTUVOVFNcIjpcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJFTkRMSVNUXCI6XG4gICAgICAgICAgICBjLmxpdmUgfHwgbnMoYywgeCwgRiksIGMubGl2ZSA9ICExO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIiNcIjpcbiAgICAgICAgICAgICh3IHx8IEQpICYmIEEudGFnTGlzdC5wdXNoKEQgPyBbdywgRF0gOiBbd10pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIkRJU0NPTlRJTlVJVFlcIjpcbiAgICAgICAgICAgIEUrKywgQS50YWdMaXN0LnB1c2goW1wiRElTXCJdKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJHQVBcIjpcbiAgICAgICAgICAgIEEuZ2FwID0gITAsIEEudGFnTGlzdC5wdXNoKFt4XSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiQklUUkFURVwiOlxuICAgICAgICAgICAgQS50YWdMaXN0LnB1c2goW3gsIHddKSwgYiA9IHBhcnNlSW50KHcpICogMWUzLCB1ZShiKSA/IEEuYml0cmF0ZSA9IGIgOiBiID0gMDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJEQVRFUkFOR0VcIjoge1xuICAgICAgICAgICAgY29uc3QgTyA9IG5ldyBndCh3LCBjKSwgVSA9IG5ldyBXZyhPLCBjLmRhdGVSYW5nZXNbTy5JRF0sIGMuZGF0ZVJhbmdlVGFnQ291bnQpO1xuICAgICAgICAgICAgYy5kYXRlUmFuZ2VUYWdDb3VudCsrLCBVLmlzVmFsaWQgfHwgYy5za2lwcGVkU2VnbWVudHMgPyBjLmRhdGVSYW5nZXNbVS5pZF0gPSBVIDogcnQud2FybihgSWdub3JpbmcgaW52YWxpZCBEQVRFUkFOR0UgdGFnOiBcIiR7d31cImApLCBBLnRhZ0xpc3QucHVzaChbXCJFWFQtWC1EQVRFUkFOR0VcIiwgd10pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJERUZJTkVcIjoge1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb25zdCBPID0gbmV3IGd0KHcsIGMpO1xuICAgICAgICAgICAgICBcIklNUE9SVFwiIGluIE8gPyBEYihjLCBPLCBvKSA6IHhoKGMsIE8sIHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJESVNDT05USU5VSVRZLVNFUVVFTkNFXCI6XG4gICAgICAgICAgICBjLnN0YXJ0Q0MgIT09IDAgPyBucyhjLCB4LCBGKSA6IHUubGVuZ3RoID4gMCAmJiBraChjLCB4LCBGKSwgYy5zdGFydENDID0gRSA9IHBhcnNlSW50KHcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIktFWVwiOiB7XG4gICAgICAgICAgICBjb25zdCBPID0gQWgodywgdCwgYyk7XG4gICAgICAgICAgICBpZiAoTy5pc1N1cHBvcnRlZCgpKSB7XG4gICAgICAgICAgICAgIGlmIChPLm1ldGhvZCA9PT0gXCJOT05FXCIpIHtcbiAgICAgICAgICAgICAgICBIID0gdm9pZCAwO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIEggfHwgKEggPSB7fSk7XG4gICAgICAgICAgICAgIGNvbnN0IFUgPSBIW08ua2V5Rm9ybWF0XTtcbiAgICAgICAgICAgICAgVSAhPSBudWxsICYmIFUubWF0Y2hlcyhPKSB8fCAoVSAmJiAoSCA9IG50KHt9LCBIKSksIEhbTy5rZXlGb3JtYXRdID0gTyk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgcnQud2FybihgW0tleXNdIElnbm9yaW5nIHVuc3VwcG9ydGVkIEVYVC1YLUtFWSB0YWc6IFwiJHt3fVwiYCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcIlNUQVJUXCI6XG4gICAgICAgICAgICBjLnN0YXJ0VGltZU9mZnNldCA9IEloKHcpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcIk1BUFwiOiB7XG4gICAgICAgICAgICBjb25zdCBPID0gbmV3IGd0KHcsIGMpO1xuICAgICAgICAgICAgaWYgKEEuZHVyYXRpb24pIHtcbiAgICAgICAgICAgICAgY29uc3QgVSA9IG5ldyB1bChuLCBsKTtcbiAgICAgICAgICAgICAgTGgoVSwgTywgciwgSCksIGggPSBVLCBBLmluaXRTZWdtZW50ID0gaCwgaC5yYXdQcm9ncmFtRGF0ZVRpbWUgJiYgIUEucmF3UHJvZ3JhbURhdGVUaW1lICYmIChBLnJhd1Byb2dyYW1EYXRlVGltZSA9IGgucmF3UHJvZ3JhbURhdGVUaW1lKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IFUgPSBBLmJ5dGVSYW5nZUVuZE9mZnNldDtcbiAgICAgICAgICAgICAgaWYgKFUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBWID0gQS5ieXRlUmFuZ2VTdGFydE9mZnNldDtcbiAgICAgICAgICAgICAgICBDID0gYCR7VSAtIFZ9QCR7Vn1gO1xuICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBDID0gbnVsbDtcbiAgICAgICAgICAgICAgTGgoQSwgTywgciwgSCksIGggPSBBLCBqID0gITA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBoLmNjID0gRTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiU0VSVkVSLUNPTlRST0xcIjoge1xuICAgICAgICAgICAgayAmJiBucyhjLCB4LCBGKSwgayA9IG5ldyBndCh3KSwgYy5jYW5CbG9ja1JlbG9hZCA9IGsuYm9vbChcIkNBTi1CTE9DSy1SRUxPQURcIiksIGMuY2FuU2tpcFVudGlsID0gay5vcHRpb25hbEZsb2F0KFwiQ0FOLVNLSVAtVU5USUxcIiwgMCksIGMuY2FuU2tpcERhdGVSYW5nZXMgPSBjLmNhblNraXBVbnRpbCA+IDAgJiYgay5ib29sKFwiQ0FOLVNLSVAtREFURVJBTkdFU1wiKSwgYy5wYXJ0SG9sZEJhY2sgPSBrLm9wdGlvbmFsRmxvYXQoXCJQQVJULUhPTEQtQkFDS1wiLCAwKSwgYy5ob2xkQmFjayA9IGsub3B0aW9uYWxGbG9hdChcIkhPTEQtQkFDS1wiLCAwKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiUEFSVC1JTkZcIjoge1xuICAgICAgICAgICAgYy5wYXJ0VGFyZ2V0ICYmIG5zKGMsIHgsIEYpO1xuICAgICAgICAgICAgY29uc3QgTyA9IG5ldyBndCh3KTtcbiAgICAgICAgICAgIGMucGFydFRhcmdldCA9IE8uZGVjaW1hbEZsb2F0aW5nUG9pbnQoXCJQQVJULVRBUkdFVFwiKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlIFwiUEFSVFwiOiB7XG4gICAgICAgICAgICBsZXQgTyA9IGMucGFydExpc3Q7XG4gICAgICAgICAgICBPIHx8IChPID0gYy5wYXJ0TGlzdCA9IFtdKTtcbiAgICAgICAgICAgIGNvbnN0IFUgPSBwID4gMCA/IE9bTy5sZW5ndGggLSAxXSA6IHZvaWQgMCwgViA9IHArKywgTCA9IG5ldyBndCh3LCBjKSwgbSA9IG5ldyBQUyhMLCBBLCBsLCBWLCBVKTtcbiAgICAgICAgICAgIE8ucHVzaChtKSwgQS5kdXJhdGlvbiArPSBtLmR1cmF0aW9uO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJQUkVMT0FELUhJTlRcIjoge1xuICAgICAgICAgICAgY29uc3QgTyA9IG5ldyBndCh3LCBjKTtcbiAgICAgICAgICAgIGMucHJlbG9hZEhpbnQgPSBPO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgXCJSRU5ESVRJT04tUkVQT1JUXCI6IHtcbiAgICAgICAgICAgIGNvbnN0IE8gPSBuZXcgZ3QodywgYyk7XG4gICAgICAgICAgICBjLnJlbmRpdGlvblJlcG9ydHMgPSBjLnJlbmRpdGlvblJlcG9ydHMgfHwgW10sIGMucmVuZGl0aW9uUmVwb3J0cy5wdXNoKE8pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICBydC53YXJuKGBsaW5lIHBhcnNlZCBidXQgbm90IGhhbmRsZWQ6ICR7Rn1gKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIFIgJiYgIVIucmVsdXJsID8gKHUucG9wKCksIHkgLT0gUi5kdXJhdGlvbiwgYy5wYXJ0TGlzdCAmJiAoYy5mcmFnbWVudEhpbnQgPSBSKSkgOiBjLnBhcnRMaXN0ICYmIChmYyhBLCBSLCBkKSwgQS5jYyA9IEUsIGMuZnJhZ21lbnRIaW50ID0gQSwgSCAmJiBDaChBLCBILCBjKSksIGMudGFyZ2V0ZHVyYXRpb24gfHwgKGMucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBuZXcgRXJyb3IoXCJNaXNzaW5nIFRhcmdldCBEdXJhdGlvblwiKSk7XG4gICAgY29uc3QgJCA9IHUubGVuZ3RoLCBXID0gdVswXSwgXyA9IHVbJCAtIDFdO1xuICAgIGlmICh5ICs9IGMuc2tpcHBlZFNlZ21lbnRzICogYy50YXJnZXRkdXJhdGlvbiwgeSA+IDAgJiYgJCAmJiBfKSB7XG4gICAgICBjLmF2ZXJhZ2V0YXJnZXRkdXJhdGlvbiA9IHkgLyAkO1xuICAgICAgY29uc3QgZyA9IF8uc247XG4gICAgICBjLmVuZFNOID0gZyAhPT0gXCJpbml0U2VnbWVudFwiID8gZyA6IDAsIGMubGl2ZSB8fCAoXy5lbmRMaXN0ID0gITApLCBLID4gMCAmJiAoWWIodSwgSyksIFcgJiYgZC51bnNoaWZ0KFcpKTtcbiAgICB9XG4gICAgcmV0dXJuIGMuZnJhZ21lbnRIaW50ICYmICh5ICs9IGMuZnJhZ21lbnRIaW50LmR1cmF0aW9uKSwgYy50b3RhbGR1cmF0aW9uID0geSwgZC5sZW5ndGggJiYgYy5kYXRlUmFuZ2VUYWdDb3VudCAmJiBXICYmIFpnKGQsIGMpLCBjLmVuZENDID0gRSwgYztcbiAgfVxufVxuZnVuY3Rpb24gWmcocywgZSkge1xuICBsZXQgdCA9IHMubGVuZ3RoO1xuICBpZiAoIXQpXG4gICAgaWYgKGUuaGFzUHJvZ3JhbURhdGVUaW1lKSB7XG4gICAgICBjb25zdCBhID0gZS5mcmFnbWVudHNbZS5mcmFnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgICBzLnB1c2goYSksIHQrKztcbiAgICB9IGVsc2VcbiAgICAgIHJldHVybjtcbiAgY29uc3QgciA9IHNbdCAtIDFdLCBuID0gZS5saXZlID8gMSAvIDAgOiBlLnRvdGFsZHVyYXRpb24sIGkgPSBPYmplY3Qua2V5cyhlLmRhdGVSYW5nZXMpO1xuICBmb3IgKGxldCBhID0gaS5sZW5ndGg7IGEtLTsgKSB7XG4gICAgY29uc3QgbCA9IGUuZGF0ZVJhbmdlc1tpW2FdXSwgYyA9IGwuc3RhcnREYXRlLmdldFRpbWUoKTtcbiAgICBsLnRhZ0FuY2hvciA9IHIucmVmO1xuICAgIGZvciAobGV0IHUgPSB0OyB1LS07ICkge1xuICAgICAgdmFyIG87XG4gICAgICBpZiAoKChvID0gc1t1XSkgPT0gbnVsbCA/IHZvaWQgMCA6IG8uc24pIDwgZS5zdGFydFNOKVxuICAgICAgICBicmVhaztcbiAgICAgIGNvbnN0IGQgPSB6YihlLCBjLCBzLCB1LCBuKTtcbiAgICAgIGlmIChkICE9PSAtMSkge1xuICAgICAgICBsLnRhZ0FuY2hvciA9IGUuZnJhZ21lbnRzW2RdLnJlZjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiB6YihzLCBlLCB0LCByLCBuKSB7XG4gIGNvbnN0IGkgPSB0W3JdO1xuICBpZiAoaSkge1xuICAgIGNvbnN0IGEgPSBpLnByb2dyYW1EYXRlVGltZTtcbiAgICBpZiAoZSA+PSBhIHx8IHIgPT09IDApIHtcbiAgICAgIHZhciBvO1xuICAgICAgY29uc3QgbCA9ICgoKG8gPSB0W3IgKyAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IG8uc3RhcnQpIHx8IG4pIC0gaS5zdGFydDtcbiAgICAgIGlmIChlIDw9IGEgKyBsICogMWUzKSB7XG4gICAgICAgIGNvbnN0IGMgPSB0W3JdLnNuIC0gcy5zdGFydFNOO1xuICAgICAgICBpZiAoYyA8IDApXG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICBjb25zdCB1ID0gcy5mcmFnbWVudHM7XG4gICAgICAgIGlmICh1Lmxlbmd0aCA+IHQubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgaCA9ICh0W3IgKyAxXSB8fCB1W3UubGVuZ3RoIC0gMV0pLnNuIC0gcy5zdGFydFNOO1xuICAgICAgICAgIGZvciAobGV0IGYgPSBoOyBmID4gYzsgZi0tKSB7XG4gICAgICAgICAgICBjb25zdCBwID0gdVtmXS5wcm9ncmFtRGF0ZVRpbWU7XG4gICAgICAgICAgICBpZiAoZSA+PSBwICYmIGUgPCBwICsgdVtmXS5kdXJhdGlvbiAqIDFlMylcbiAgICAgICAgICAgICAgcmV0dXJuIGY7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59XG5mdW5jdGlvbiBBaChzLCBlLCB0KSB7XG4gIHZhciByLCBuO1xuICBjb25zdCBpID0gbmV3IGd0KHMsIHQpLCBvID0gKHIgPSBpLk1FVEhPRCkgIT0gbnVsbCA/IHIgOiBcIlwiLCBhID0gaS5VUkksIGwgPSBpLmhleGFkZWNpbWFsSW50ZWdlcihcIklWXCIpLCBjID0gaS5LRVlGT1JNQVRWRVJTSU9OUywgdSA9IChuID0gaS5LRVlGT1JNQVQpICE9IG51bGwgPyBuIDogXCJpZGVudGl0eVwiO1xuICBhICYmIGkuSVYgJiYgIWwgJiYgcnQuZXJyb3IoYEludmFsaWQgSVY6ICR7aS5JVn1gKTtcbiAgY29uc3QgZCA9IGEgPyB6ci5yZXNvbHZlKGEsIGUpIDogXCJcIiwgaCA9IChjIHx8IFwiMVwiKS5zcGxpdChcIi9cIikubWFwKE51bWJlcikuZmlsdGVyKE51bWJlci5pc0Zpbml0ZSk7XG4gIHJldHVybiBuZXcgeWkobywgZCwgdSwgaCwgbCwgaS5LRVlJRCk7XG59XG5mdW5jdGlvbiBJaChzKSB7XG4gIGNvbnN0IHQgPSBuZXcgZ3QocykuZGVjaW1hbEZsb2F0aW5nUG9pbnQoXCJUSU1FLU9GRlNFVFwiKTtcbiAgcmV0dXJuIHVlKHQpID8gdCA6IG51bGw7XG59XG5mdW5jdGlvbiBfaChzLCBlKSB7XG4gIGxldCB0ID0gKHMgfHwgXCJcIikuc3BsaXQoL1sgLF0rLykuZmlsdGVyKChyKSA9PiByKTtcbiAgW1widmlkZW9cIiwgXCJhdWRpb1wiLCBcInRleHRcIl0uZm9yRWFjaCgocikgPT4ge1xuICAgIGNvbnN0IG4gPSB0LmZpbHRlcigoaSkgPT4gcHUoaSwgcikpO1xuICAgIG4ubGVuZ3RoICYmIChlW2Ake3J9Q29kZWNgXSA9IG4ubWFwKChpKSA9PiBpLnNwbGl0KFwiL1wiKVswXSkuam9pbihcIixcIiksIHQgPSB0LmZpbHRlcigoaSkgPT4gbi5pbmRleE9mKGkpID09PSAtMSkpO1xuICB9KSwgZS51bmtub3duQ29kZWNzID0gdDtcbn1cbmZ1bmN0aW9uIFJoKHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IGVbdF07XG4gIHIgJiYgKHNbdF0gPSByKTtcbn1cbmZ1bmN0aW9uIFliKHMsIGUpIHtcbiAgbGV0IHQgPSBzW2VdO1xuICBmb3IgKGxldCByID0gZTsgci0tOyApIHtcbiAgICBjb25zdCBuID0gc1tyXTtcbiAgICBpZiAoIW4pXG4gICAgICByZXR1cm47XG4gICAgbi5wcm9ncmFtRGF0ZVRpbWUgPSB0LnByb2dyYW1EYXRlVGltZSAtIG4uZHVyYXRpb24gKiAxZTMsIHQgPSBuO1xuICB9XG59XG5mdW5jdGlvbiBmYyhzLCBlLCB0KSB7XG4gIHMucmF3UHJvZ3JhbURhdGVUaW1lID8gdC5wdXNoKHMpIDogZSAhPSBudWxsICYmIGUucHJvZ3JhbURhdGVUaW1lICYmIChzLnByb2dyYW1EYXRlVGltZSA9IGUuZW5kUHJvZ3JhbURhdGVUaW1lKTtcbn1cbmZ1bmN0aW9uIExoKHMsIGUsIHQsIHIpIHtcbiAgcy5yZWx1cmwgPSBlLlVSSSwgZS5CWVRFUkFOR0UgJiYgcy5zZXRCeXRlUmFuZ2UoZS5CWVRFUkFOR0UpLCBzLmxldmVsID0gdCwgcy5zbiA9IFwiaW5pdFNlZ21lbnRcIiwgciAmJiAocy5sZXZlbGtleXMgPSByKSwgcy5pbml0U2VnbWVudCA9IG51bGw7XG59XG5mdW5jdGlvbiBDaChzLCBlLCB0KSB7XG4gIHMubGV2ZWxrZXlzID0gZTtcbiAgY29uc3Qge1xuICAgIGVuY3J5cHRlZEZyYWdtZW50czogclxuICB9ID0gdDtcbiAgKCFyLmxlbmd0aCB8fCByW3IubGVuZ3RoIC0gMV0ubGV2ZWxrZXlzICE9PSBlKSAmJiBPYmplY3Qua2V5cyhlKS5zb21lKChuKSA9PiBlW25dLmlzQ29tbW9uRW5jcnlwdGlvbikgJiYgci5wdXNoKHMpO1xufVxuZnVuY3Rpb24gbnMocywgZSwgdCkge1xuICBzLnBsYXlsaXN0UGFyc2luZ0Vycm9yID0gbmV3IEVycm9yKGAjRVhULVgtJHtlfSBtdXN0IG5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgKCR7dFswXX0pYCk7XG59XG5mdW5jdGlvbiBraChzLCBlLCB0KSB7XG4gIHMucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBuZXcgRXJyb3IoYCNFWFQtWC0ke2V9IG11c3QgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3QgTWVkaWEgU2VnbWVudCAoJHt0WzBdfSlgKTtcbn1cbmZ1bmN0aW9uIHBsKHMsIGUpIHtcbiAgY29uc3QgdCA9IGUuc3RhcnRQVFM7XG4gIGlmICh1ZSh0KSkge1xuICAgIGxldCByID0gMCwgbjtcbiAgICBlLnNuID4gcy5zbiA/IChyID0gdCAtIHMuc3RhcnQsIG4gPSBzKSA6IChyID0gcy5zdGFydCAtIHQsIG4gPSBlKSwgbi5kdXJhdGlvbiAhPT0gciAmJiBuLnNldER1cmF0aW9uKHIpO1xuICB9IGVsc2UgZS5zbiA+IHMuc24gPyBzLmNjID09PSBlLmNjICYmIHMubWluRW5kUFRTID8gZS5zZXRTdGFydChzLnN0YXJ0ICsgKHMubWluRW5kUFRTIC0gcy5zdGFydCkpIDogZS5zZXRTdGFydChzLnN0YXJ0ICsgcy5kdXJhdGlvbikgOiBlLnNldFN0YXJ0KE1hdGgubWF4KHMuc3RhcnQgLSBlLmR1cmF0aW9uLCAwKSk7XG59XG5mdW5jdGlvbiBYZyhzLCBlLCB0LCByLCBuLCBpLCBvKSB7XG4gIHIgLSB0IDw9IDAgJiYgKG8ud2FybihcIkZyYWdtZW50IHNob3VsZCBoYXZlIGEgcG9zaXRpdmUgZHVyYXRpb25cIiwgZSksIHIgPSB0ICsgZS5kdXJhdGlvbiwgaSA9IG4gKyBlLmR1cmF0aW9uKTtcbiAgbGV0IGwgPSB0LCBjID0gcjtcbiAgY29uc3QgdSA9IGUuc3RhcnRQVFMsIGQgPSBlLmVuZFBUUztcbiAgaWYgKHVlKHUpKSB7XG4gICAgY29uc3QgYiA9IE1hdGguYWJzKHUgLSB0KTtcbiAgICBzICYmIGIgPiBzLnRvdGFsZHVyYXRpb24gPyBvLndhcm4oYG1lZGlhIHRpbWVzdGFtcHMgYW5kIHBsYXlsaXN0IHRpbWVzIGRpZmZlciBieSAke2J9cyBmb3IgbGV2ZWwgJHtlLmxldmVsfSAke3MudXJsfWApIDogdWUoZS5kZWx0YVBUUykgPyBlLmRlbHRhUFRTID0gTWF0aC5tYXgoYiwgZS5kZWx0YVBUUykgOiBlLmRlbHRhUFRTID0gYiwgbCA9IE1hdGgubWF4KHQsIHUpLCB0ID0gTWF0aC5taW4odCwgdSksIG4gPSBlLnN0YXJ0RFRTICE9PSB2b2lkIDAgPyBNYXRoLm1pbihuLCBlLnN0YXJ0RFRTKSA6IG4sIGMgPSBNYXRoLm1pbihyLCBkKSwgciA9IE1hdGgubWF4KHIsIGQpLCBpID0gZS5lbmREVFMgIT09IHZvaWQgMCA/IE1hdGgubWF4KGksIGUuZW5kRFRTKSA6IGk7XG4gIH1cbiAgY29uc3QgaCA9IHQgLSBlLnN0YXJ0O1xuICBlLnN0YXJ0ICE9PSAwICYmIGUuc2V0U3RhcnQodCksIGUuc2V0RHVyYXRpb24ociAtIGUuc3RhcnQpLCBlLnN0YXJ0UFRTID0gdCwgZS5tYXhTdGFydFBUUyA9IGwsIGUuc3RhcnREVFMgPSBuLCBlLmVuZFBUUyA9IHIsIGUubWluRW5kUFRTID0gYywgZS5lbmREVFMgPSBpO1xuICBjb25zdCBmID0gZS5zbjtcbiAgaWYgKCFzIHx8IGYgPCBzLnN0YXJ0U04gfHwgZiA+IHMuZW5kU04pXG4gICAgcmV0dXJuIDA7XG4gIGxldCBwO1xuICBjb25zdCB5ID0gZiAtIHMuc3RhcnRTTiwgRSA9IHMuZnJhZ21lbnRzO1xuICBmb3IgKEVbeV0gPSBlLCBwID0geTsgcCA+IDA7IHAtLSlcbiAgICBwbChFW3BdLCBFW3AgLSAxXSk7XG4gIGZvciAocCA9IHk7IHAgPCBFLmxlbmd0aCAtIDE7IHArKylcbiAgICBwbChFW3BdLCBFW3AgKyAxXSk7XG4gIHJldHVybiBzLmZyYWdtZW50SGludCAmJiBwbChFW0UubGVuZ3RoIC0gMV0sIHMuZnJhZ21lbnRIaW50KSwgcy5QVFNLbm93biA9IHMuYWxpZ25lZFNsaWRpbmcgPSAhMCwgaDtcbn1cbmZ1bmN0aW9uIFpiKHMsIGUsIHQpIHtcbiAgaWYgKHMgPT09IGUpXG4gICAgcmV0dXJuO1xuICBsZXQgciA9IG51bGw7XG4gIGNvbnN0IG4gPSBzLmZyYWdtZW50cztcbiAgZm9yIChsZXQgdSA9IG4ubGVuZ3RoIC0gMTsgdSA+PSAwOyB1LS0pIHtcbiAgICBjb25zdCBkID0gblt1XS5pbml0U2VnbWVudDtcbiAgICBpZiAoZCkge1xuICAgICAgciA9IGQ7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcy5mcmFnbWVudEhpbnQgJiYgZGVsZXRlIHMuZnJhZ21lbnRIaW50LmVuZFBUUztcbiAgbGV0IGk7XG4gIFFiKHMsIGUsICh1LCBkLCBoLCBmKSA9PiB7XG4gICAgaWYgKCghZS5zdGFydENDIHx8IGUuc2tpcHBlZFNlZ21lbnRzKSAmJiBkLmNjICE9PSB1LmNjKSB7XG4gICAgICBjb25zdCBwID0gdS5jYyAtIGQuY2M7XG4gICAgICBmb3IgKGxldCB5ID0gaDsgeSA8IGYubGVuZ3RoOyB5KyspXG4gICAgICAgIGZbeV0uY2MgKz0gcDtcbiAgICAgIGUuZW5kQ0MgPSBmW2YubGVuZ3RoIC0gMV0uY2M7XG4gICAgfVxuICAgIHVlKHUuc3RhcnRQVFMpICYmIHVlKHUuZW5kUFRTKSAmJiAoZC5zZXRTdGFydChkLnN0YXJ0UFRTID0gdS5zdGFydFBUUyksIGQuc3RhcnREVFMgPSB1LnN0YXJ0RFRTLCBkLm1heFN0YXJ0UFRTID0gdS5tYXhTdGFydFBUUywgZC5lbmRQVFMgPSB1LmVuZFBUUywgZC5lbmREVFMgPSB1LmVuZERUUywgZC5taW5FbmRQVFMgPSB1Lm1pbkVuZFBUUywgZC5zZXREdXJhdGlvbih1LmVuZFBUUyAtIHUuc3RhcnRQVFMpLCBkLmR1cmF0aW9uICYmIChpID0gZCksIGUuUFRTS25vd24gPSBlLmFsaWduZWRTbGlkaW5nID0gITApLCB1Lmhhc1N0cmVhbXMgJiYgKGQuZWxlbWVudGFyeVN0cmVhbXMgPSB1LmVsZW1lbnRhcnlTdHJlYW1zKSwgZC5sb2FkZXIgPSB1LmxvYWRlciwgdS5oYXNTdGF0cyAmJiAoZC5zdGF0cyA9IHUuc3RhdHMpLCB1LmluaXRTZWdtZW50ICYmIChkLmluaXRTZWdtZW50ID0gdS5pbml0U2VnbWVudCwgciA9IHUuaW5pdFNlZ21lbnQpO1xuICB9KTtcbiAgY29uc3QgbyA9IGUuZnJhZ21lbnRzLCBhID0gZS5mcmFnbWVudEhpbnQgPyBvLmNvbmNhdChlLmZyYWdtZW50SGludCkgOiBvO1xuICBpZiAociAmJiBhLmZvckVhY2goKHUpID0+IHtcbiAgICB2YXIgZDtcbiAgICB1ICYmICghdS5pbml0U2VnbWVudCB8fCB1LmluaXRTZWdtZW50LnJlbHVybCA9PT0gKChkID0gcikgPT0gbnVsbCA/IHZvaWQgMCA6IGQucmVsdXJsKSkgJiYgKHUuaW5pdFNlZ21lbnQgPSByKTtcbiAgfSksIGUuc2tpcHBlZFNlZ21lbnRzKSB7XG4gICAgaWYgKGUuZGVsdGFVcGRhdGVGYWlsZWQgPSBvLnNvbWUoKHUpID0+ICF1KSwgZS5kZWx0YVVwZGF0ZUZhaWxlZCkge1xuICAgICAgdC53YXJuKFwiW2xldmVsLWhlbHBlcl0gUHJldmlvdXMgcGxheWxpc3QgbWlzc2luZyBzZWdtZW50cyBza2lwcGVkIGluIGRlbHRhIHBsYXlsaXN0XCIpO1xuICAgICAgZm9yIChsZXQgdSA9IGUuc2tpcHBlZFNlZ21lbnRzOyB1LS07IClcbiAgICAgICAgby5zaGlmdCgpO1xuICAgICAgZS5zdGFydFNOID0gb1swXS5zbjtcbiAgICB9IGVsc2Uge1xuICAgICAgZS5jYW5Ta2lwRGF0ZVJhbmdlcyAmJiAoZS5kYXRlUmFuZ2VzID0gWGIocy5kYXRlUmFuZ2VzLCBlLCB0KSk7XG4gICAgICBjb25zdCB1ID0gcy5mcmFnbWVudHMuZmlsdGVyKChkKSA9PiBkLnJhd1Byb2dyYW1EYXRlVGltZSk7XG4gICAgICBpZiAocy5oYXNQcm9ncmFtRGF0ZVRpbWUgJiYgIWUuaGFzUHJvZ3JhbURhdGVUaW1lKVxuICAgICAgICBmb3IgKGxldCBkID0gMTsgZCA8IGEubGVuZ3RoOyBkKyspXG4gICAgICAgICAgYVtkXS5wcm9ncmFtRGF0ZVRpbWUgPT09IG51bGwgJiYgZmMoYVtkXSwgYVtkIC0gMV0sIHUpO1xuICAgICAgWmcodSwgZSk7XG4gICAgfVxuICAgIGUuZW5kQ0MgPSBvW28ubGVuZ3RoIC0gMV0uY2M7XG4gIH1cbiAgaWYgKCFlLnN0YXJ0Q0MpIHtcbiAgICB2YXIgbDtcbiAgICBjb25zdCB1ID0gZXAocywgZS5zdGFydFNOIC0gMSk7XG4gICAgZS5zdGFydENDID0gKGwgPSB1ID09IG51bGwgPyB2b2lkIDAgOiB1LmNjKSAhPSBudWxsID8gbCA6IG9bMF0uY2M7XG4gIH1cbiAgSmIocy5wYXJ0TGlzdCwgZS5wYXJ0TGlzdCwgKHUsIGQpID0+IHtcbiAgICBkLmVsZW1lbnRhcnlTdHJlYW1zID0gdS5lbGVtZW50YXJ5U3RyZWFtcywgZC5zdGF0cyA9IHUuc3RhdHM7XG4gIH0pLCBpID8gWGcoZSwgaSwgaS5zdGFydFBUUywgaS5lbmRQVFMsIGkuc3RhcnREVFMsIGkuZW5kRFRTLCB0KSA6IEpnKHMsIGUpLCBvLmxlbmd0aCAmJiAoZS50b3RhbGR1cmF0aW9uID0gZS5lZGdlIC0gb1swXS5zdGFydCksIGUuZHJpZnRTdGFydFRpbWUgPSBzLmRyaWZ0U3RhcnRUaW1lLCBlLmRyaWZ0U3RhcnQgPSBzLmRyaWZ0U3RhcnQ7XG4gIGNvbnN0IGMgPSBlLmFkdmFuY2VkRGF0ZVRpbWU7XG4gIGlmIChlLmFkdmFuY2VkICYmIGMpIHtcbiAgICBjb25zdCB1ID0gZS5lZGdlO1xuICAgIGUuZHJpZnRTdGFydCB8fCAoZS5kcmlmdFN0YXJ0VGltZSA9IGMsIGUuZHJpZnRTdGFydCA9IHUpLCBlLmRyaWZ0RW5kVGltZSA9IGMsIGUuZHJpZnRFbmQgPSB1O1xuICB9IGVsc2VcbiAgICBlLmRyaWZ0RW5kVGltZSA9IHMuZHJpZnRFbmRUaW1lLCBlLmRyaWZ0RW5kID0gcy5kcmlmdEVuZCwgZS5hZHZhbmNlZERhdGVUaW1lID0gcy5hZHZhbmNlZERhdGVUaW1lO1xuICBlLnJlcXVlc3RTY2hlZHVsZWQgPT09IC0xICYmIChlLnJlcXVlc3RTY2hlZHVsZWQgPSBzLnJlcXVlc3RTY2hlZHVsZWQpO1xufVxuZnVuY3Rpb24gWGIocywgZSwgdCkge1xuICBjb25zdCB7XG4gICAgZGF0ZVJhbmdlczogcixcbiAgICByZWNlbnRseVJlbW92ZWREYXRlcmFuZ2VzOiBuXG4gIH0gPSBlLCBpID0gbnQoe30sIHMpO1xuICBuICYmIG4uZm9yRWFjaCgobCkgPT4ge1xuICAgIGRlbGV0ZSBpW2xdO1xuICB9KTtcbiAgY29uc3QgYSA9IE9iamVjdC5rZXlzKGkpLmxlbmd0aDtcbiAgcmV0dXJuIGEgPyAoT2JqZWN0LmtleXMocikuZm9yRWFjaCgobCkgPT4ge1xuICAgIGNvbnN0IGMgPSBpW2xdLCB1ID0gbmV3IFdnKHJbbF0uYXR0ciwgYyk7XG4gICAgdS5pc1ZhbGlkID8gKGlbbF0gPSB1LCBjIHx8ICh1LnRhZ09yZGVyICs9IGEpKSA6IHQud2FybihgSWdub3JpbmcgaW52YWxpZCBQbGF5bGlzdCBEZWx0YSBVcGRhdGUgREFURVJBTkdFIHRhZzogXCIke2F0KHJbbF0uYXR0cil9XCJgKTtcbiAgfSksIGkpIDogcjtcbn1cbmZ1bmN0aW9uIEpiKHMsIGUsIHQpIHtcbiAgaWYgKHMgJiYgZSkge1xuICAgIGxldCByID0gMDtcbiAgICBmb3IgKGxldCBuID0gMCwgaSA9IHMubGVuZ3RoOyBuIDw9IGk7IG4rKykge1xuICAgICAgY29uc3QgbyA9IHNbbl0sIGEgPSBlW24gKyByXTtcbiAgICAgIG8gJiYgYSAmJiBvLmluZGV4ID09PSBhLmluZGV4ICYmIG8uZnJhZ21lbnQuc24gPT09IGEuZnJhZ21lbnQuc24gPyB0KG8sIGEpIDogci0tO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gUWIocywgZSwgdCkge1xuICBjb25zdCByID0gZS5za2lwcGVkU2VnbWVudHMsIG4gPSBNYXRoLm1heChzLnN0YXJ0U04sIGUuc3RhcnRTTikgLSBlLnN0YXJ0U04sIGkgPSAocy5mcmFnbWVudEhpbnQgPyAxIDogMCkgKyAociA/IGUuZW5kU04gOiBNYXRoLm1pbihzLmVuZFNOLCBlLmVuZFNOKSkgLSBlLnN0YXJ0U04sIG8gPSBlLnN0YXJ0U04gLSBzLnN0YXJ0U04sIGEgPSBlLmZyYWdtZW50SGludCA/IGUuZnJhZ21lbnRzLmNvbmNhdChlLmZyYWdtZW50SGludCkgOiBlLmZyYWdtZW50cywgbCA9IHMuZnJhZ21lbnRIaW50ID8gcy5mcmFnbWVudHMuY29uY2F0KHMuZnJhZ21lbnRIaW50KSA6IHMuZnJhZ21lbnRzO1xuICBmb3IgKGxldCBjID0gbjsgYyA8PSBpOyBjKyspIHtcbiAgICBjb25zdCB1ID0gbFtvICsgY107XG4gICAgbGV0IGQgPSBhW2NdO1xuICAgIGlmIChyICYmICFkICYmIHUgJiYgKGQgPSBlLmZyYWdtZW50c1tjXSA9IHUpLCB1ICYmIGQpIHtcbiAgICAgIHQodSwgZCwgYywgYSk7XG4gICAgICBjb25zdCBoID0gdS5yZWx1cmwsIGYgPSBkLnJlbHVybDtcbiAgICAgIGlmIChoICYmIGVUKGgsIGYpKSB7XG4gICAgICAgIGUucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBEaChgbWVkaWEgc2VxdWVuY2UgbWlzbWF0Y2ggJHtkLnNufTpgLCBzLCBlLCB1LCBkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmICh1LmNjICE9PSBkLmNjKSB7XG4gICAgICAgIGUucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBEaChgZGlzY29udGludWl0eSBzZXF1ZW5jZSBtaXNtYXRjaCAoJHt1LmNjfSE9JHtkLmNjfSlgLCBzLCBlLCB1LCBkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gRGgocywgZSwgdCwgciwgbikge1xuICByZXR1cm4gbmV3IEVycm9yKGAke3N9ICR7bi51cmx9XG5QbGF5bGlzdCBzdGFydGluZyBAJHtlLnN0YXJ0U059XG4ke2UubTN1OH1cblxuUGxheWxpc3Qgc3RhcnRpbmcgQCR7dC5zdGFydFNOfVxuJHt0Lm0zdTh9YCk7XG59XG5mdW5jdGlvbiBKZyhzLCBlLCB0ID0gITApIHtcbiAgY29uc3QgciA9IGUuc3RhcnRTTiArIGUuc2tpcHBlZFNlZ21lbnRzIC0gcy5zdGFydFNOLCBuID0gcy5mcmFnbWVudHMsIGkgPSByID49IDA7XG4gIGxldCBvID0gMDtcbiAgaWYgKGkgJiYgciA8IG4ubGVuZ3RoKVxuICAgIG8gPSBuW3JdLnN0YXJ0O1xuICBlbHNlIGlmIChpICYmIGUuc3RhcnRTTiA9PT0gcy5lbmRTTiArIDEpXG4gICAgbyA9IHMuZnJhZ21lbnRFbmQ7XG4gIGVsc2UgaWYgKGkgJiYgdClcbiAgICBvID0gcy5mcmFnbWVudFN0YXJ0ICsgciAqIGUubGV2ZWxUYXJnZXREdXJhdGlvbjtcbiAgZWxzZSBpZiAoIWUuc2tpcHBlZFNlZ21lbnRzICYmIGUuZnJhZ21lbnRTdGFydCA9PT0gMClcbiAgICBvID0gcy5mcmFnbWVudFN0YXJ0O1xuICBlbHNlXG4gICAgcmV0dXJuO1xuICBnYyhlLCBvKTtcbn1cbmZ1bmN0aW9uIGdjKHMsIGUpIHtcbiAgaWYgKGUpIHtcbiAgICBjb25zdCB0ID0gcy5mcmFnbWVudHM7XG4gICAgZm9yIChsZXQgciA9IHMuc2tpcHBlZFNlZ21lbnRzOyByIDwgdC5sZW5ndGg7IHIrKylcbiAgICAgIHRbcl0uYWRkU3RhcnQoZSk7XG4gICAgcy5mcmFnbWVudEhpbnQgJiYgcy5mcmFnbWVudEhpbnQuYWRkU3RhcnQoZSk7XG4gIH1cbn1cbmZ1bmN0aW9uIFFnKHMsIGUgPSAxIC8gMCkge1xuICBsZXQgdCA9IDFlMyAqIHMudGFyZ2V0ZHVyYXRpb247XG4gIGlmIChzLnVwZGF0ZWQpIHtcbiAgICBjb25zdCByID0gcy5mcmFnbWVudHM7XG4gICAgaWYgKHIubGVuZ3RoICYmIHQgKiA0ID4gZSkge1xuICAgICAgY29uc3QgaSA9IHJbci5sZW5ndGggLSAxXS5kdXJhdGlvbiAqIDFlMztcbiAgICAgIGkgPCB0ICYmICh0ID0gaSk7XG4gICAgfVxuICB9IGVsc2VcbiAgICB0IC89IDI7XG4gIHJldHVybiBNYXRoLnJvdW5kKHQpO1xufVxuZnVuY3Rpb24gZXAocywgZSwgdCkge1xuICBpZiAoIXMpXG4gICAgcmV0dXJuIG51bGw7XG4gIGxldCByID0gcy5mcmFnbWVudHNbZSAtIHMuc3RhcnRTTl07XG4gIHJldHVybiByIHx8IChyID0gcy5mcmFnbWVudEhpbnQsIHIgJiYgci5zbiA9PT0gZSkgPyByIDogZSA8IHMuc3RhcnRTTiAmJiB0ICYmIHQuc24gPT09IGUgPyB0IDogbnVsbDtcbn1cbmZ1bmN0aW9uIFBoKHMsIGUsIHQpIHtcbiAgcmV0dXJuIHMgPyB0cChzLnBhcnRMaXN0LCBlLCB0KSA6IG51bGw7XG59XG5mdW5jdGlvbiB0cChzLCBlLCB0KSB7XG4gIGlmIChzKVxuICAgIGZvciAobGV0IHIgPSBzLmxlbmd0aDsgci0tOyApIHtcbiAgICAgIGNvbnN0IG4gPSBzW3JdO1xuICAgICAgaWYgKG4uaW5kZXggPT09IHQgJiYgbi5mcmFnbWVudC5zbiA9PT0gZSlcbiAgICAgICAgcmV0dXJuIG47XG4gICAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHJwKHMpIHtcbiAgcy5mb3JFYWNoKChlLCB0KSA9PiB7XG4gICAgdmFyIHI7XG4gICAgKHIgPSBlLmRldGFpbHMpID09IG51bGwgfHwgci5mcmFnbWVudHMuZm9yRWFjaCgobikgPT4ge1xuICAgICAgbi5sZXZlbCA9IHQsIG4uaW5pdFNlZ21lbnQgJiYgKG4uaW5pdFNlZ21lbnQubGV2ZWwgPSB0KTtcbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBlVChzLCBlKSB7XG4gIHJldHVybiBzICE9PSBlICYmIGUgPyBNaChzKSAhPT0gTWgoZSkgOiAhMTtcbn1cbmZ1bmN0aW9uIE1oKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvXFw/W14/XSokLywgXCJcIik7XG59XG5mdW5jdGlvbiBZbihzLCBlKSB7XG4gIGZvciAobGV0IHIgPSAwLCBuID0gcy5sZW5ndGg7IHIgPCBuOyByKyspIHtcbiAgICB2YXIgdDtcbiAgICBpZiAoKCh0ID0gc1tyXSkgPT0gbnVsbCA/IHZvaWQgMCA6IHQuY2MpID09PSBlKVxuICAgICAgcmV0dXJuIHNbcl07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5mdW5jdGlvbiB0VChzLCBlKSB7XG4gIHJldHVybiAhIShzICYmIGUuc3RhcnRDQyA8IHMuZW5kQ0MgJiYgZS5lbmRDQyA+IHMuc3RhcnRDQyk7XG59XG5mdW5jdGlvbiBPaChzLCBlKSB7XG4gIGNvbnN0IHQgPSBzLnN0YXJ0ICsgZTtcbiAgcy5zdGFydFBUUyA9IHQsIHMuc2V0U3RhcnQodCksIHMuZW5kUFRTID0gdCArIHMuZHVyYXRpb247XG59XG5mdW5jdGlvbiBzcChzLCBlKSB7XG4gIGNvbnN0IHQgPSBlLmZyYWdtZW50cztcbiAgZm9yIChsZXQgciA9IDAsIG4gPSB0Lmxlbmd0aDsgciA8IG47IHIrKylcbiAgICBPaCh0W3JdLCBzKTtcbiAgZS5mcmFnbWVudEhpbnQgJiYgT2goZS5mcmFnbWVudEhpbnQsIHMpLCBlLmFsaWduZWRTbGlkaW5nID0gITA7XG59XG5mdW5jdGlvbiByVChzLCBlKSB7XG4gIHMgJiYgKG5wKGUsIHMpLCBlLmFsaWduZWRTbGlkaW5nIHx8IHNhKGUsIHMpLCAhZS5hbGlnbmVkU2xpZGluZyAmJiAhZS5za2lwcGVkU2VnbWVudHMgJiYgSmcocywgZSwgITEpKTtcbn1cbmZ1bmN0aW9uIG5wKHMsIGUpIHtcbiAgaWYgKCF0VChlLCBzKSlcbiAgICByZXR1cm47XG4gIGNvbnN0IHQgPSBNYXRoLm1pbihlLmVuZENDLCBzLmVuZENDKSwgciA9IFluKGUuZnJhZ21lbnRzLCB0KSwgbiA9IFluKHMuZnJhZ21lbnRzLCB0KTtcbiAgaWYgKCFyIHx8ICFuKVxuICAgIHJldHVybjtcbiAgcnQubG9nKGBBbGlnbmluZyBwbGF5bGlzdCBhdCBzdGFydCBvZiBkaWNvbnRpbnVpdHkgc2VxdWVuY2UgJHt0fWApO1xuICBjb25zdCBpID0gci5zdGFydCAtIG4uc3RhcnQ7XG4gIHNwKGksIHMpO1xufVxuZnVuY3Rpb24gc2EocywgZSkge1xuICBpZiAoIXMuaGFzUHJvZ3JhbURhdGVUaW1lIHx8ICFlLmhhc1Byb2dyYW1EYXRlVGltZSlcbiAgICByZXR1cm47XG4gIGNvbnN0IHQgPSBzLmZyYWdtZW50cywgciA9IGUuZnJhZ21lbnRzO1xuICBpZiAoIXQubGVuZ3RoIHx8ICFyLmxlbmd0aClcbiAgICByZXR1cm47XG4gIGxldCBuLCBpO1xuICBjb25zdCBvID0gTWF0aC5taW4oZS5lbmRDQywgcy5lbmRDQyk7XG4gIGUuc3RhcnRDQyA8IG8gJiYgcy5zdGFydENDIDwgbyAmJiAobiA9IFluKHIsIG8pLCBpID0gWW4odCwgbykpLCAoIW4gfHwgIWkpICYmIChuID0gcltNYXRoLmZsb29yKHIubGVuZ3RoIC8gMildLCBpID0gWW4odCwgbi5jYykgfHwgdFtNYXRoLmZsb29yKHQubGVuZ3RoIC8gMildKTtcbiAgY29uc3QgYSA9IG4ucHJvZ3JhbURhdGVUaW1lLCBsID0gaS5wcm9ncmFtRGF0ZVRpbWU7XG4gIGlmICghYSB8fCAhbClcbiAgICByZXR1cm47XG4gIGNvbnN0IGMgPSAobCAtIGEpIC8gMWUzIC0gKGkuc3RhcnQgLSBuLnN0YXJ0KTtcbiAgc3AoYywgcyk7XG59XG5mdW5jdGlvbiBjcihzLCBlLCB0KSB7XG4gIHByKHMsIGUsIHQpLCBzLmFkZEV2ZW50TGlzdGVuZXIoZSwgdCk7XG59XG5mdW5jdGlvbiBwcihzLCBlLCB0KSB7XG4gIHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLCB0KTtcbn1cbmNvbnN0IHNUID0ge1xuICB0b1N0cmluZzogZnVuY3Rpb24ocykge1xuICAgIGxldCBlID0gXCJcIjtcbiAgICBjb25zdCB0ID0gcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCB0OyByKyspXG4gICAgICBlICs9IGBbJHtzLnN0YXJ0KHIpLnRvRml4ZWQoMyl9LSR7cy5lbmQocikudG9GaXhlZCgzKX1dYDtcbiAgICByZXR1cm4gZTtcbiAgfVxufSwgbmUgPSB7XG4gIFNUT1BQRUQ6IFwiU1RPUFBFRFwiLFxuICBJRExFOiBcIklETEVcIixcbiAgS0VZX0xPQURJTkc6IFwiS0VZX0xPQURJTkdcIixcbiAgRlJBR19MT0FESU5HOiBcIkZSQUdfTE9BRElOR1wiLFxuICBGUkFHX0xPQURJTkdfV0FJVElOR19SRVRSWTogXCJGUkFHX0xPQURJTkdfV0FJVElOR19SRVRSWVwiLFxuICBXQUlUSU5HX1RSQUNLOiBcIldBSVRJTkdfVFJBQ0tcIixcbiAgUEFSU0lORzogXCJQQVJTSU5HXCIsXG4gIFBBUlNFRDogXCJQQVJTRURcIixcbiAgRU5ERUQ6IFwiRU5ERURcIixcbiAgRVJST1I6IFwiRVJST1JcIixcbiAgV0FJVElOR19JTklUX1BUUzogXCJXQUlUSU5HX0lOSVRfUFRTXCIsXG4gIFdBSVRJTkdfTEVWRUw6IFwiV0FJVElOR19MRVZFTFwiXG59O1xuY2xhc3MgVHUgZXh0ZW5kcyBIZyB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4sIGkpIHtcbiAgICBzdXBlcihuLCBlLmxvZ2dlciksIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGwsIHRoaXMuZnJhZ0N1cnJlbnQgPSBudWxsLCB0aGlzLmZyYWdtZW50VHJhY2tlciA9IHZvaWQgMCwgdGhpcy50cmFuc211eGVyID0gbnVsbCwgdGhpcy5fc3RhdGUgPSBuZS5TVE9QUEVELCB0aGlzLnBsYXlsaXN0VHlwZSA9IHZvaWQgMCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMubWVkaWFCdWZmZXIgPSBudWxsLCB0aGlzLmNvbmZpZyA9IHZvaWQgMCwgdGhpcy5iaXRyYXRlVGVzdCA9ICExLCB0aGlzLmxhc3RDdXJyZW50VGltZSA9IDAsIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IDAsIHRoaXMuc3RhcnRQb3NpdGlvbiA9IDAsIHRoaXMuc3RhcnRUaW1lT2Zmc2V0ID0gbnVsbCwgdGhpcy5yZXRyeURhdGUgPSAwLCB0aGlzLmxldmVscyA9IG51bGwsIHRoaXMuZnJhZ21lbnRMb2FkZXIgPSB2b2lkIDAsIHRoaXMua2V5TG9hZGVyID0gdm9pZCAwLCB0aGlzLmxldmVsTGFzdExvYWRlZCA9IG51bGwsIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITEsIHRoaXMuZGVjcnlwdGVyID0gdm9pZCAwLCB0aGlzLmluaXRQVFMgPSBbXSwgdGhpcy5idWZmZXJpbmcgPSAhMCwgdGhpcy5sb2FkaW5nUGFydHMgPSAhMSwgdGhpcy5sb29wU24gPSB2b2lkIDAsIHRoaXMub25NZWRpYVNlZWtpbmcgPSAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNvbmZpZzogbyxcbiAgICAgICAgZnJhZ0N1cnJlbnQ6IGEsXG4gICAgICAgIG1lZGlhOiBsLFxuICAgICAgICBtZWRpYUJ1ZmZlcjogYyxcbiAgICAgICAgc3RhdGU6IHVcbiAgICAgIH0gPSB0aGlzLCBkID0gbCA/IGwuY3VycmVudFRpbWUgOiAwLCBoID0gQ2UuYnVmZmVySW5mbyhjIHx8IGwsIGQsIG8ubWF4QnVmZmVySG9sZSksIGYgPSAhaC5sZW47XG4gICAgICBpZiAodGhpcy5sb2coYE1lZGlhIHNlZWtpbmcgdG8gJHt1ZShkKSA/IGQudG9GaXhlZCgzKSA6IGR9LCBzdGF0ZTogJHt1fSwgJHtmID8gXCJvdXQgb2ZcIiA6IFwiaW5cIn0gYnVmZmVyYCksIHRoaXMuc3RhdGUgPT09IG5lLkVOREVEKVxuICAgICAgICB0aGlzLnJlc2V0TG9hZGluZ1N0YXRlKCk7XG4gICAgICBlbHNlIGlmIChhKSB7XG4gICAgICAgIGNvbnN0IHAgPSBvLm1heEZyYWdMb29rVXBUb2xlcmFuY2UsIHkgPSBhLnN0YXJ0IC0gcCwgRSA9IGEuc3RhcnQgKyBhLmR1cmF0aW9uICsgcDtcbiAgICAgICAgaWYgKGYgfHwgRSA8IGguc3RhcnQgfHwgeSA+IGguZW5kKSB7XG4gICAgICAgICAgY29uc3QgYiA9IGQgPiBFO1xuICAgICAgICAgIChkIDwgeSB8fCBiKSAmJiAoYiAmJiBhLmxvYWRlciAmJiAodGhpcy5sb2coYENhbmNlbGxpbmcgZnJhZ21lbnQgbG9hZCBmb3Igc2VlayAoc246ICR7YS5zbn0pYCksIGEuYWJvcnRSZXF1ZXN0cygpLCB0aGlzLnJlc2V0TG9hZGluZ1N0YXRlKCkpLCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobCkge1xuICAgICAgICB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudHNJblJhbmdlKGQsIDEgLyAwLCB0aGlzLnBsYXlsaXN0VHlwZSwgITApO1xuICAgICAgICBjb25zdCBwID0gdGhpcy5sYXN0Q3VycmVudFRpbWU7XG4gICAgICAgIGlmIChkID4gcCAmJiAodGhpcy5sYXN0Q3VycmVudFRpbWUgPSBkKSwgIXRoaXMubG9hZGluZ1BhcnRzKSB7XG4gICAgICAgICAgY29uc3QgeSA9IE1hdGgubWF4KGguZW5kLCBkKSwgRSA9IHRoaXMuc2hvdWxkTG9hZFBhcnRzKHRoaXMuZ2V0TGV2ZWxEZXRhaWxzKCksIHkpO1xuICAgICAgICAgIEUgJiYgKHRoaXMubG9nKGBMTC1QYXJ0IGxvYWRpbmcgT04gYWZ0ZXIgc2Vla2luZyB0byAke2QudG9GaXhlZCgyKX0gd2l0aCBidWZmZXIgQCR7eS50b0ZpeGVkKDIpfWApLCB0aGlzLmxvYWRpbmdQYXJ0cyA9IEUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmhscy5oYXNFbm91Z2hUb1N0YXJ0IHx8ICh0aGlzLmxvZyhgU2V0dGluZyAke2YgPyBcInN0YXJ0UG9zaXRpb25cIiA6IFwibmV4dExvYWRQb3NpdGlvblwifSB0byAke2R9IGZvciBzZWVrIHdpdGhvdXQgZW5vdWdoIHRvIHN0YXJ0YCksIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IGQsIGYgJiYgKHRoaXMuc3RhcnRQb3NpdGlvbiA9IGQpKSwgZiAmJiB0aGlzLnN0YXRlID09PSBuZS5JRExFICYmIHRoaXMudGlja0ltbWVkaWF0ZSgpO1xuICAgIH0sIHRoaXMub25NZWRpYUVuZGVkID0gKCkgPT4ge1xuICAgICAgdGhpcy5sb2coXCJzZXR0aW5nIHN0YXJ0UG9zaXRpb24gdG8gMCBiZWNhdXNlIG1lZGlhIGVuZGVkXCIpLCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IDA7XG4gICAgfSwgdGhpcy5wbGF5bGlzdFR5cGUgPSBpLCB0aGlzLmhscyA9IGUsIHRoaXMuZnJhZ21lbnRMb2FkZXIgPSBuZXcgQ2IoZS5jb25maWcpLCB0aGlzLmtleUxvYWRlciA9IHIsIHRoaXMuZnJhZ21lbnRUcmFja2VyID0gdCwgdGhpcy5jb25maWcgPSBlLmNvbmZpZywgdGhpcy5kZWNyeXB0ZXIgPSBuZXcgdnUoZS5jb25maWcpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NRURJQV9BVFRBQ0hFRCwgdGhpcy5vbk1lZGlhQXR0YWNoZWQsIHRoaXMpLCBlLm9uKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpLCBlLm9uKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub24oSS5NQU5JRkVTVF9MT0FERUQsIHRoaXMub25NYW5pZmVzdExvYWRlZCwgdGhpcyksIGUub24oSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub2ZmKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BREVELCB0aGlzLm9uTWFuaWZlc3RMb2FkZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuICB9XG4gIGRvVGljaygpIHtcbiAgICB0aGlzLm9uVGlja0VuZCgpO1xuICB9XG4gIG9uVGlja0VuZCgpIHtcbiAgfVxuICBzdGFydExvYWQoZSkge1xuICB9XG4gIHN0b3BMb2FkKCkge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSBuZS5TVE9QUEVEKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuZnJhZ21lbnRMb2FkZXIuYWJvcnQoKSwgdGhpcy5rZXlMb2FkZXIuYWJvcnQodGhpcy5wbGF5bGlzdFR5cGUpO1xuICAgIGNvbnN0IGUgPSB0aGlzLmZyYWdDdXJyZW50O1xuICAgIGUgIT0gbnVsbCAmJiBlLmxvYWRlciAmJiAoZS5hYm9ydFJlcXVlc3RzKCksIHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KGUpKSwgdGhpcy5yZXNldFRyYW5zbXV4ZXIoKSwgdGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMuZnJhZ1ByZXZpb3VzID0gbnVsbCwgdGhpcy5jbGVhckludGVydmFsKCksIHRoaXMuY2xlYXJOZXh0VGljaygpLCB0aGlzLnN0YXRlID0gbmUuU1RPUFBFRDtcbiAgfVxuICBnZXQgc3RhcnRQb3NpdGlvblZhbHVlKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG5leHRMb2FkUG9zaXRpb246IGUsXG4gICAgICBzdGFydFBvc2l0aW9uOiB0XG4gICAgfSA9IHRoaXM7XG4gICAgcmV0dXJuIHQgPT09IC0xICYmIGUgPyBlIDogdDtcbiAgfVxuICBnZXQgYnVmZmVyaW5nRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5idWZmZXJpbmc7XG4gIH1cbiAgcGF1c2VCdWZmZXJpbmcoKSB7XG4gICAgdGhpcy5idWZmZXJpbmcgPSAhMTtcbiAgfVxuICByZXN1bWVCdWZmZXJpbmcoKSB7XG4gICAgdGhpcy5idWZmZXJpbmcgPSAhMDtcbiAgfVxuICBnZXQgaW5GbGlnaHRGcmFnKCkge1xuICAgIHJldHVybiB7XG4gICAgICBmcmFnOiB0aGlzLmZyYWdDdXJyZW50LFxuICAgICAgc3RhdGU6IHRoaXMuc3RhdGVcbiAgICB9O1xuICB9XG4gIF9zdHJlYW1FbmRlZChlLCB0KSB7XG4gICAgaWYgKHQubGl2ZSB8fCAhdGhpcy5tZWRpYSlcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCByID0gZS5lbmQgfHwgMCwgbiA9IHRoaXMuY29uZmlnLnRpbWVsaW5lT2Zmc2V0IHx8IDA7XG4gICAgaWYgKHIgPD0gbilcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCBpID0gZS5idWZmZXJlZDtcbiAgICB0aGlzLmNvbmZpZy5tYXhCdWZmZXJIb2xlICYmIGkgJiYgaS5sZW5ndGggPiAxICYmIChlID0gQ2UuYnVmZmVyZWRJbmZvKGksIGUuc3RhcnQsIDApKTtcbiAgICBjb25zdCBvID0gZS5uZXh0U3RhcnQ7XG4gICAgaWYgKG8gJiYgbyA+IG4gJiYgbyA8IHQuZWRnZSB8fCB0aGlzLm1lZGlhLmN1cnJlbnRUaW1lIDwgZS5zdGFydClcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCBsID0gdC5wYXJ0TGlzdDtcbiAgICBpZiAobCAhPSBudWxsICYmIGwubGVuZ3RoKSB7XG4gICAgICBjb25zdCB1ID0gbFtsLmxlbmd0aCAtIDFdO1xuICAgICAgcmV0dXJuIENlLmlzQnVmZmVyZWQodGhpcy5tZWRpYSwgdS5zdGFydCArIHUuZHVyYXRpb24gLyAyKTtcbiAgICB9XG4gICAgY29uc3QgYyA9IHQuZnJhZ21lbnRzW3QuZnJhZ21lbnRzLmxlbmd0aCAtIDFdLnR5cGU7XG4gICAgcmV0dXJuIHRoaXMuZnJhZ21lbnRUcmFja2VyLmlzRW5kTGlzdEFwcGVuZGVkKGMpO1xuICB9XG4gIGdldExldmVsRGV0YWlscygpIHtcbiAgICBpZiAodGhpcy5sZXZlbHMgJiYgdGhpcy5sZXZlbExhc3RMb2FkZWQgIT09IG51bGwpXG4gICAgICByZXR1cm4gdGhpcy5sZXZlbExhc3RMb2FkZWQuZGV0YWlscztcbiAgfVxuICBnZXQgdGltZWxpbmVPZmZzZXQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuY29uZmlnLnRpbWVsaW5lT2Zmc2V0O1xuICAgIGlmIChlKSB7XG4gICAgICB2YXIgdDtcbiAgICAgIHJldHVybiAoKHQgPSB0aGlzLmdldExldmVsRGV0YWlscygpKSA9PSBudWxsID8gdm9pZCAwIDogdC5hcHBsaWVkVGltZWxpbmVPZmZzZXQpIHx8IGU7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG4gIG9uTWVkaWFBdHRhY2hlZChlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMubWVkaWEgPSB0aGlzLm1lZGlhQnVmZmVyID0gdC5tZWRpYTtcbiAgICBjcihyLCBcInNlZWtpbmdcIiwgdGhpcy5vbk1lZGlhU2Vla2luZyksIGNyKHIsIFwiZW5kZWRcIiwgdGhpcy5vbk1lZGlhRW5kZWQpO1xuICAgIGNvbnN0IG4gPSB0aGlzLmNvbmZpZztcbiAgICB0aGlzLmxldmVscyAmJiBuLmF1dG9TdGFydExvYWQgJiYgdGhpcy5zdGF0ZSA9PT0gbmUuU1RPUFBFRCAmJiB0aGlzLnN0YXJ0TG9hZChuLnN0YXJ0UG9zaXRpb24pO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAhIXQudHJhbnNmZXJNZWRpYSwgbiA9IHRoaXMubWVkaWE7XG4gICAgaWYgKG4gIT09IG51bGwpIHtcbiAgICAgIGlmIChuLmVuZGVkICYmICh0aGlzLmxvZyhcIk1TRSBkZXRhY2hpbmcgYW5kIHZpZGVvIGVuZGVkLCByZXNldCBzdGFydFBvc2l0aW9uXCIpLCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IDApLCBwcihuLCBcInNlZWtpbmdcIiwgdGhpcy5vbk1lZGlhU2Vla2luZyksIHByKG4sIFwiZW5kZWRcIiwgdGhpcy5vbk1lZGlhRW5kZWQpLCB0aGlzLmtleUxvYWRlciAmJiAhciAmJiB0aGlzLmtleUxvYWRlci5kZXRhY2goKSwgdGhpcy5tZWRpYSA9IHRoaXMubWVkaWFCdWZmZXIgPSBudWxsLCB0aGlzLmxvb3BTbiA9IHZvaWQgMCwgcikge1xuICAgICAgICB0aGlzLnJlc2V0TG9hZGluZ1N0YXRlKCksIHRoaXMucmVzZXRUcmFuc211eGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZGluZ1BhcnRzID0gITEsIHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUFsbEZyYWdtZW50cygpLCB0aGlzLnN0b3BMb2FkKCk7XG4gICAgfVxuICB9XG4gIG9uTWFuaWZlc3RMb2FkaW5nKCkge1xuICAgIHRoaXMuaW5pdFBUUyA9IFtdLCB0aGlzLmxldmVscyA9IHRoaXMubGV2ZWxMYXN0TG9hZGVkID0gdGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMubGFzdEN1cnJlbnRUaW1lID0gdGhpcy5zdGFydFBvc2l0aW9uID0gMCwgdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMTtcbiAgfVxuICBvbkVycm9yKGUsIHQpIHtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGVkKGUsIHQpIHtcbiAgICB0aGlzLnN0YXJ0VGltZU9mZnNldCA9IHQuc3RhcnRUaW1lT2Zmc2V0O1xuICB9XG4gIG9uSGFuZGxlckRlc3Ryb3lpbmcoKSB7XG4gICAgdGhpcy5zdG9wTG9hZCgpLCB0aGlzLnRyYW5zbXV4ZXIgJiYgKHRoaXMudHJhbnNtdXhlci5kZXN0cm95KCksIHRoaXMudHJhbnNtdXhlciA9IG51bGwpLCBzdXBlci5vbkhhbmRsZXJEZXN0cm95aW5nKCksIHRoaXMuaGxzID0gdGhpcy5vbk1lZGlhU2Vla2luZyA9IHRoaXMub25NZWRpYUVuZGVkID0gbnVsbDtcbiAgfVxuICBvbkhhbmRsZXJEZXN0cm95ZWQoKSB7XG4gICAgdGhpcy5zdGF0ZSA9IG5lLlNUT1BQRUQsIHRoaXMuZnJhZ21lbnRMb2FkZXIgJiYgdGhpcy5mcmFnbWVudExvYWRlci5kZXN0cm95KCksIHRoaXMua2V5TG9hZGVyICYmIHRoaXMua2V5TG9hZGVyLmRlc3Ryb3koKSwgdGhpcy5kZWNyeXB0ZXIgJiYgdGhpcy5kZWNyeXB0ZXIuZGVzdHJveSgpLCB0aGlzLmhscyA9IHRoaXMubG9nID0gdGhpcy53YXJuID0gdGhpcy5kZWNyeXB0ZXIgPSB0aGlzLmtleUxvYWRlciA9IHRoaXMuZnJhZ21lbnRMb2FkZXIgPSB0aGlzLmZyYWdtZW50VHJhY2tlciA9IG51bGwsIHN1cGVyLm9uSGFuZGxlckRlc3Ryb3llZCgpO1xuICB9XG4gIGxvYWRGcmFnbWVudChlLCB0LCByKSB7XG4gICAgdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMCwgdGhpcy5fbG9hZEZyYWdGb3JQbGF5YmFjayhlLCB0LCByKTtcbiAgfVxuICBfbG9hZEZyYWdGb3JQbGF5YmFjayhlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IChpKSA9PiB7XG4gICAgICBjb25zdCBvID0gaS5mcmFnO1xuICAgICAgaWYgKHRoaXMuZnJhZ0NvbnRleHRDaGFuZ2VkKG8pKSB7XG4gICAgICAgIHRoaXMud2FybihgJHtvLnR5cGV9IHNuOiAke28uc259JHtpLnBhcnQgPyBcIiBwYXJ0OiBcIiArIGkucGFydC5pbmRleCA6IFwiXCJ9IG9mICR7dGhpcy5mcmFnSW5mbyhvLCAhMSwgaS5wYXJ0KX0pIHdhcyBkcm9wcGVkIGR1cmluZyBkb3dubG9hZC5gKSwgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnQobyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG8uc3RhdHMuY2h1bmtDb3VudCsrLCB0aGlzLl9oYW5kbGVGcmFnbWVudExvYWRQcm9ncmVzcyhpKTtcbiAgICB9O1xuICAgIHRoaXMuX2RvRnJhZ0xvYWQoZSwgdCwgciwgbikudGhlbigoaSkgPT4ge1xuICAgICAgaWYgKCFpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBvID0gdGhpcy5zdGF0ZSwgYSA9IGkuZnJhZztcbiAgICAgIGlmICh0aGlzLmZyYWdDb250ZXh0Q2hhbmdlZChhKSkge1xuICAgICAgICAobyA9PT0gbmUuRlJBR19MT0FESU5HIHx8ICF0aGlzLmZyYWdDdXJyZW50ICYmIG8gPT09IG5lLlBBUlNJTkcpICYmICh0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudChhKSwgdGhpcy5zdGF0ZSA9IG5lLklETEUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcInBheWxvYWRcIiBpbiBpICYmICh0aGlzLmxvZyhgTG9hZGVkICR7YS50eXBlfSBzbjogJHthLnNufSBvZiAke3RoaXMucGxheWxpc3RMYWJlbCgpfSAke2EubGV2ZWx9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5GUkFHX0xPQURFRCwgaSkpLCB0aGlzLl9oYW5kbGVGcmFnbWVudExvYWRDb21wbGV0ZShpKTtcbiAgICB9KS5jYXRjaCgoaSkgPT4ge1xuICAgICAgdGhpcy5zdGF0ZSA9PT0gbmUuU1RPUFBFRCB8fCB0aGlzLnN0YXRlID09PSBuZS5FUlJPUiB8fCAodGhpcy53YXJuKGBGcmFnIGVycm9yOiAkeyhpID09IG51bGwgPyB2b2lkIDAgOiBpLm1lc3NhZ2UpIHx8IGl9YCksIHRoaXMucmVzZXRGcmFnbWVudExvYWRpbmcoZSkpO1xuICAgIH0pO1xuICB9XG4gIGNsZWFyVHJhY2tlcklmTmVlZGVkKGUpIHtcbiAgICB2YXIgdDtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnbWVudFRyYWNrZXI6IHJcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoci5nZXRTdGF0ZShlKSA9PT0gSHQuQVBQRU5ESU5HKSB7XG4gICAgICBjb25zdCBpID0gZS50eXBlLCBvID0gdGhpcy5nZXRGd2RCdWZmZXJJbmZvKHRoaXMubWVkaWFCdWZmZXIsIGkpLCBhID0gTWF0aC5tYXgoZS5kdXJhdGlvbiwgbyA/IG8ubGVuIDogdGhpcy5jb25maWcubWF4QnVmZmVyTGVuZ3RoKSwgbCA9IHRoaXMuYmFja3RyYWNrRnJhZ21lbnQ7XG4gICAgICAoKGwgPyBlLnNuIC0gbC5zbiA6IDApID09PSAxIHx8IHRoaXMucmVkdWNlTWF4QnVmZmVyTGVuZ3RoKGEsIGUuZHVyYXRpb24pKSAmJiByLnJlbW92ZUZyYWdtZW50KGUpO1xuICAgIH0gZWxzZSAoKHQgPSB0aGlzLm1lZGlhQnVmZmVyKSA9PSBudWxsID8gdm9pZCAwIDogdC5idWZmZXJlZC5sZW5ndGgpID09PSAwID8gci5yZW1vdmVBbGxGcmFnbWVudHMoKSA6IHIuaGFzUGFydHMoZS50eXBlKSAmJiAoci5kZXRlY3RQYXJ0aWFsRnJhZ21lbnRzKHtcbiAgICAgIGZyYWc6IGUsXG4gICAgICBwYXJ0OiBudWxsLFxuICAgICAgc3RhdHM6IGUuc3RhdHMsXG4gICAgICBpZDogZS50eXBlXG4gICAgfSksIHIuZ2V0U3RhdGUoZSkgPT09IEh0LlBBUlRJQUwgJiYgci5yZW1vdmVGcmFnbWVudChlKSk7XG4gIH1cbiAgY2hlY2tMaXZlVXBkYXRlKGUpIHtcbiAgICBpZiAoZS51cGRhdGVkICYmICFlLmxpdmUpIHtcbiAgICAgIGNvbnN0IHQgPSBlLmZyYWdtZW50c1tlLmZyYWdtZW50cy5sZW5ndGggLSAxXTtcbiAgICAgIHRoaXMuZnJhZ21lbnRUcmFja2VyLmRldGVjdFBhcnRpYWxGcmFnbWVudHMoe1xuICAgICAgICBmcmFnOiB0LFxuICAgICAgICBwYXJ0OiBudWxsLFxuICAgICAgICBzdGF0czogdC5zdGF0cyxcbiAgICAgICAgaWQ6IHQudHlwZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGUuZnJhZ21lbnRzWzBdIHx8IChlLmRlbHRhVXBkYXRlRmFpbGVkID0gITApO1xuICB9XG4gIHdhaXRGb3JMaXZlKGUpIHtcbiAgICBjb25zdCB0ID0gZS5kZXRhaWxzO1xuICAgIHJldHVybiAodCA9PSBudWxsID8gdm9pZCAwIDogdC5saXZlKSAmJiB0LnR5cGUgIT09IFwiRVZFTlRcIiAmJiAodGhpcy5sZXZlbExhc3RMb2FkZWQgIT09IGUgfHwgdC5leHBpcmVkKTtcbiAgfVxuICBmbHVzaE1haW5CdWZmZXIoZSwgdCwgciA9IG51bGwpIHtcbiAgICBpZiAoIShlIC0gdCkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbiA9IHtcbiAgICAgIHN0YXJ0T2Zmc2V0OiBlLFxuICAgICAgZW5kT2Zmc2V0OiB0LFxuICAgICAgdHlwZTogclxuICAgIH07XG4gICAgdGhpcy5obHMudHJpZ2dlcihJLkJVRkZFUl9GTFVTSElORywgbik7XG4gIH1cbiAgX2xvYWRJbml0U2VnbWVudChlLCB0KSB7XG4gICAgdGhpcy5fZG9GcmFnTG9hZChlLCB0KS50aGVuKChyKSA9PiB7XG4gICAgICBjb25zdCBuID0gciA9PSBudWxsID8gdm9pZCAwIDogci5mcmFnO1xuICAgICAgaWYgKCFuIHx8IHRoaXMuZnJhZ0NvbnRleHRDaGFuZ2VkKG4pIHx8ICF0aGlzLmxldmVscylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5pdCBsb2FkIGFib3J0ZWRcIik7XG4gICAgICByZXR1cm4gcjtcbiAgICB9KS50aGVuKChyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGhsczogblxuICAgICAgfSA9IHRoaXMsIHtcbiAgICAgICAgZnJhZzogaSxcbiAgICAgICAgcGF5bG9hZDogb1xuICAgICAgfSA9IHIsIGEgPSBpLmRlY3J5cHRkYXRhO1xuICAgICAgaWYgKG8gJiYgby5ieXRlTGVuZ3RoID4gMCAmJiBhICE9IG51bGwgJiYgYS5rZXkgJiYgYS5pdiAmJiBJbihhLm1ldGhvZCkpIHtcbiAgICAgICAgY29uc3QgbCA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIHJldHVybiB0aGlzLmRlY3J5cHRlci5kZWNyeXB0KG5ldyBVaW50OEFycmF5KG8pLCBhLmtleS5idWZmZXIsIGEuaXYuYnVmZmVyLCBTdShhLm1ldGhvZCkpLmNhdGNoKChjKSA9PiB7XG4gICAgICAgICAgdGhyb3cgbi50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICAgICAgZGV0YWlsczogSi5GUkFHX0RFQ1JZUFRfRVJST1IsXG4gICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICBlcnJvcjogYyxcbiAgICAgICAgICAgIHJlYXNvbjogYy5tZXNzYWdlLFxuICAgICAgICAgICAgZnJhZzogaVxuICAgICAgICAgIH0pLCBjO1xuICAgICAgICB9KS50aGVuKChjKSA9PiB7XG4gICAgICAgICAgY29uc3QgdSA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgICAgcmV0dXJuIG4udHJpZ2dlcihJLkZSQUdfREVDUllQVEVELCB7XG4gICAgICAgICAgICBmcmFnOiBpLFxuICAgICAgICAgICAgcGF5bG9hZDogYyxcbiAgICAgICAgICAgIHN0YXRzOiB7XG4gICAgICAgICAgICAgIHRzdGFydDogbCxcbiAgICAgICAgICAgICAgdGRlY3J5cHQ6IHVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSwgci5wYXlsb2FkID0gYywgdGhpcy5jb21wbGV0ZUluaXRTZWdtZW50TG9hZChyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5jb21wbGV0ZUluaXRTZWdtZW50TG9hZChyKTtcbiAgICB9KS5jYXRjaCgocikgPT4ge1xuICAgICAgdGhpcy5zdGF0ZSA9PT0gbmUuU1RPUFBFRCB8fCB0aGlzLnN0YXRlID09PSBuZS5FUlJPUiB8fCAodGhpcy53YXJuKHIpLCB0aGlzLnJlc2V0RnJhZ21lbnRMb2FkaW5nKGUpKTtcbiAgICB9KTtcbiAgfVxuICBjb21wbGV0ZUluaXRTZWdtZW50TG9hZChlKSB7XG4gICAgY29uc3Qge1xuICAgICAgbGV2ZWxzOiB0XG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCF0KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaW5pdCBsb2FkIGFib3J0ZWQsIG1pc3NpbmcgbGV2ZWxzXCIpO1xuICAgIGNvbnN0IHIgPSBlLmZyYWcuc3RhdHM7XG4gICAgdGhpcy5zdGF0ZSAhPT0gbmUuU1RPUFBFRCAmJiAodGhpcy5zdGF0ZSA9IG5lLklETEUpLCBlLmZyYWcuZGF0YSA9IG5ldyBVaW50OEFycmF5KGUucGF5bG9hZCksIHIucGFyc2luZy5zdGFydCA9IHIuYnVmZmVyaW5nLnN0YXJ0ID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgci5wYXJzaW5nLmVuZCA9IHIuYnVmZmVyaW5nLmVuZCA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCksIHRoaXMudGljaygpO1xuICB9XG4gIHVuaGFuZGxlZEVuY3J5cHRpb25FcnJvcihlLCB0KSB7XG4gICAgdmFyIHIsIG47XG4gICAgY29uc3QgaSA9IGUudHJhY2tzO1xuICAgIGlmIChpICYmICF0LmVuY3J5cHRlZCAmJiAoKHIgPSBpLmF1ZGlvKSAhPSBudWxsICYmIHIuZW5jcnlwdGVkIHx8IChuID0gaS52aWRlbykgIT0gbnVsbCAmJiBuLmVuY3J5cHRlZCkgJiYgKCF0aGlzLmNvbmZpZy5lbWVFbmFibGVkIHx8ICF0aGlzLmtleUxvYWRlci5lbWVDb250cm9sbGVyKSkge1xuICAgICAgY29uc3QgbyA9IHRoaXMubWVkaWEsIGEgPSBuZXcgRXJyb3IoYEVuY3J5cHRlZCB0cmFjayB3aXRoIG5vIGtleSBpbiAke3RoaXMuZnJhZ0luZm8odCl9IChtZWRpYSAke28gPyBcImF0dGFjaGVkIG1lZGlhS2V5czogXCIgKyBvLm1lZGlhS2V5cyA6IFwiZGV0YWNoZWRcIn0pYCk7XG4gICAgICByZXR1cm4gdGhpcy53YXJuKGEubWVzc2FnZSksICFvIHx8IG8ubWVkaWFLZXlzID8gITEgOiAodGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouS0VZX1NZU1RFTV9OT19LRVlTLFxuICAgICAgICBmYXRhbDogITEsXG4gICAgICAgIGVycm9yOiBhLFxuICAgICAgICBmcmFnOiB0XG4gICAgICB9KSwgdGhpcy5yZXNldFRyYW5zbXV4ZXIoKSwgITApO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgZnJhZ0NvbnRleHRDaGFuZ2VkKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnQ3VycmVudDogdFxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiAhZSB8fCAhdCB8fCBlLnNuICE9PSB0LnNuIHx8IGUubGV2ZWwgIT09IHQubGV2ZWw7XG4gIH1cbiAgZnJhZ0J1ZmZlcmVkQ29tcGxldGUoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLm1lZGlhQnVmZmVyID8gdGhpcy5tZWRpYUJ1ZmZlciA6IHRoaXMubWVkaWE7XG4gICAgaWYgKHRoaXMubG9nKGBCdWZmZXJlZCAke2UudHlwZX0gc246ICR7ZS5zbn0ke3QgPyBcIiBwYXJ0OiBcIiArIHQuaW5kZXggOiBcIlwifSBvZiAke3RoaXMuZnJhZ0luZm8oZSwgITEsIHQpfSA+IGJ1ZmZlcjoke3IgPyBzVC50b1N0cmluZyhDZS5nZXRCdWZmZXJlZChyKSkgOiBcIihkZXRhY2hlZClcIn0pYCksIFZ0KGUpKSB7XG4gICAgICB2YXIgbjtcbiAgICAgIGlmIChlLnR5cGUgIT09IHBlLlNVQlRJVExFKSB7XG4gICAgICAgIGNvbnN0IG8gPSBlLmVsZW1lbnRhcnlTdHJlYW1zO1xuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKG8pLnNvbWUoKGEpID0+ICEhb1thXSkpIHtcbiAgICAgICAgICB0aGlzLnN0YXRlID0gbmUuSURMRTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGkgPSAobiA9IHRoaXMubGV2ZWxzKSA9PSBudWxsID8gdm9pZCAwIDogbltlLmxldmVsXTtcbiAgICAgIGkgIT0gbnVsbCAmJiBpLmZyYWdtZW50RXJyb3IgJiYgKHRoaXMubG9nKGBSZXNldHRpbmcgbGV2ZWwgZnJhZ21lbnQgZXJyb3IgY291bnQgb2YgJHtpLmZyYWdtZW50RXJyb3J9IG9uIGZyYWcgYnVmZmVyZWRgKSwgaS5mcmFnbWVudEVycm9yID0gMCk7XG4gICAgfVxuICAgIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICB9XG4gIF9oYW5kbGVGcmFnbWVudExvYWRDb21wbGV0ZShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgdHJhbnNtdXhlcjogdFxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnOiByLFxuICAgICAgcGFydDogbixcbiAgICAgIHBhcnRzTG9hZGVkOiBpXG4gICAgfSA9IGUsIG8gPSAhaSB8fCBpLmxlbmd0aCA9PT0gMCB8fCBpLnNvbWUoKGwpID0+ICFsKSwgYSA9IG5ldyBFdShyLmxldmVsLCByLnNuLCByLnN0YXRzLmNodW5rQ291bnQgKyAxLCAwLCBuID8gbi5pbmRleCA6IC0xLCAhbyk7XG4gICAgdC5mbHVzaChhKTtcbiAgfVxuICBfaGFuZGxlRnJhZ21lbnRMb2FkUHJvZ3Jlc3MoZSkge1xuICB9XG4gIF9kb0ZyYWdMb2FkKGUsIHQsIHIgPSBudWxsLCBuKSB7XG4gICAgdmFyIGk7XG4gICAgdGhpcy5mcmFnQ3VycmVudCA9IGU7XG4gICAgY29uc3QgbyA9IHQuZGV0YWlscztcbiAgICBpZiAoIXRoaXMubGV2ZWxzIHx8ICFvKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBmcmFnIGxvYWQgYWJvcnRlZCwgbWlzc2luZyBsZXZlbCR7byA/IFwiXCIgOiBcIiBkZXRhaWxcIn1zYCk7XG4gICAgbGV0IGEgPSBudWxsO1xuICAgIGlmIChlLmVuY3J5cHRlZCAmJiAhKChpID0gZS5kZWNyeXB0ZGF0YSkgIT0gbnVsbCAmJiBpLmtleSkpIHtcbiAgICAgIGlmICh0aGlzLmxvZyhgTG9hZGluZyBrZXkgZm9yICR7ZS5zbn0gb2YgWyR7by5zdGFydFNOfS0ke28uZW5kU059XSwgJHt0aGlzLnBsYXlsaXN0TGFiZWwoKX0gJHtlLmxldmVsfWApLCB0aGlzLnN0YXRlID0gbmUuS0VZX0xPQURJTkcsIHRoaXMuZnJhZ0N1cnJlbnQgPSBlLCBhID0gdGhpcy5rZXlMb2FkZXIubG9hZChlKS50aGVuKChoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5mcmFnQ29udGV4dENoYW5nZWQoaC5mcmFnKSlcbiAgICAgICAgICByZXR1cm4gdGhpcy5obHMudHJpZ2dlcihJLktFWV9MT0FERUQsIGgpLCB0aGlzLnN0YXRlID09PSBuZS5LRVlfTE9BRElORyAmJiAodGhpcy5zdGF0ZSA9IG5lLklETEUpLCBoO1xuICAgICAgfSksIHRoaXMuaGxzLnRyaWdnZXIoSS5LRVlfTE9BRElORywge1xuICAgICAgICBmcmFnOiBlXG4gICAgICB9KSwgdGhpcy5mcmFnQ3VycmVudCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nKFwiY29udGV4dCBjaGFuZ2VkIGluIEtFWV9MT0FESU5HXCIpLCBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfSBlbHNlIGUuZW5jcnlwdGVkIHx8IChhID0gdGhpcy5rZXlMb2FkZXIubG9hZENsZWFyKGUsIG8uZW5jcnlwdGVkRnJhZ21lbnRzLCB0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCksIGEgJiYgdGhpcy5sb2coXCJbZW1lXSBibG9ja2luZyBmcmFnIGxvYWQgdW50aWwgbWVkaWEta2V5cyBhY3F1aXJlZFwiKSk7XG4gICAgY29uc3QgbCA9IHRoaXMuZnJhZ1ByZXZpb3VzO1xuICAgIGlmIChWdChlKSAmJiAoIWwgfHwgZS5zbiAhPT0gbC5zbikpIHtcbiAgICAgIGNvbnN0IGggPSB0aGlzLnNob3VsZExvYWRQYXJ0cyh0LmRldGFpbHMsIGUuZW5kKTtcbiAgICAgIGggIT09IHRoaXMubG9hZGluZ1BhcnRzICYmICh0aGlzLmxvZyhgTEwtUGFydCBsb2FkaW5nICR7aCA/IFwiT05cIiA6IFwiT0ZGXCJ9IGxvYWRpbmcgc24gJHtsID09IG51bGwgPyB2b2lkIDAgOiBsLnNufS0+JHtlLnNufWApLCB0aGlzLmxvYWRpbmdQYXJ0cyA9IGgpO1xuICAgIH1cbiAgICBpZiAociA9IE1hdGgubWF4KGUuc3RhcnQsIHIgfHwgMCksIHRoaXMubG9hZGluZ1BhcnRzICYmIFZ0KGUpKSB7XG4gICAgICBjb25zdCBoID0gby5wYXJ0TGlzdDtcbiAgICAgIGlmIChoICYmIG4pIHtcbiAgICAgICAgciA+IG8uZnJhZ21lbnRFbmQgJiYgby5mcmFnbWVudEhpbnQgJiYgKGUgPSBvLmZyYWdtZW50SGludCk7XG4gICAgICAgIGNvbnN0IGYgPSB0aGlzLmdldE5leHRQYXJ0KGgsIGUsIHIpO1xuICAgICAgICBpZiAoZiA+IC0xKSB7XG4gICAgICAgICAgY29uc3QgcCA9IGhbZl07XG4gICAgICAgICAgZSA9IHRoaXMuZnJhZ0N1cnJlbnQgPSBwLmZyYWdtZW50LCB0aGlzLmxvZyhgTG9hZGluZyAke2UudHlwZX0gc246ICR7ZS5zbn0gcGFydDogJHtwLmluZGV4fSAoJHtmfS8ke2gubGVuZ3RoIC0gMX0pIG9mICR7dGhpcy5mcmFnSW5mbyhlLCAhMSwgcCl9KSBjYzogJHtlLmNjfSBbJHtvLnN0YXJ0U059LSR7by5lbmRTTn1dLCB0YXJnZXQ6ICR7cGFyc2VGbG9hdChyLnRvRml4ZWQoMykpfWApLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSBwLnN0YXJ0ICsgcC5kdXJhdGlvbiwgdGhpcy5zdGF0ZSA9IG5lLkZSQUdfTE9BRElORztcbiAgICAgICAgICBsZXQgeTtcbiAgICAgICAgICByZXR1cm4gYSA/IHkgPSBhLnRoZW4oKEUpID0+ICFFIHx8IHRoaXMuZnJhZ0NvbnRleHRDaGFuZ2VkKEUuZnJhZykgPyBudWxsIDogdGhpcy5kb0ZyYWdQYXJ0c0xvYWQoZSwgcCwgdCwgbikpLmNhdGNoKChFKSA9PiB0aGlzLmhhbmRsZUZyYWdMb2FkRXJyb3IoRSkpIDogeSA9IHRoaXMuZG9GcmFnUGFydHNMb2FkKGUsIHAsIHQsIG4pLmNhdGNoKChFKSA9PiB0aGlzLmhhbmRsZUZyYWdMb2FkRXJyb3IoRSkpLCB0aGlzLmhscy50cmlnZ2VyKEkuRlJBR19MT0FESU5HLCB7XG4gICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgcGFydDogcCxcbiAgICAgICAgICAgIHRhcmdldEJ1ZmZlclRpbWU6IHJcbiAgICAgICAgICB9KSwgdGhpcy5mcmFnQ3VycmVudCA9PT0gbnVsbCA/IFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcImZyYWcgbG9hZCBhYm9ydGVkLCBjb250ZXh0IGNoYW5nZWQgaW4gRlJBR19MT0FESU5HIHBhcnRzXCIpKSA6IHk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWUudXJsIHx8IHRoaXMubG9hZGVkRW5kT2ZQYXJ0cyhoLCByKSlcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoVnQoZSkgJiYgdGhpcy5sb2FkaW5nUGFydHMpIHtcbiAgICAgIHZhciBjO1xuICAgICAgdGhpcy5sb2coYExMLVBhcnQgbG9hZGluZyBPRkYgYWZ0ZXIgbmV4dCBwYXJ0IG1pc3MgQCR7ci50b0ZpeGVkKDIpfSBDaGVjayBidWZmZXIgYXQgc246ICR7ZS5zbn0gbG9hZGVkIHBhcnRzOiAkeyhjID0gby5wYXJ0TGlzdCkgPT0gbnVsbCA/IHZvaWQgMCA6IGMuZmlsdGVyKChoKSA9PiBoLmxvYWRlZCkubWFwKChoKSA9PiBgWyR7aC5zdGFydH0tJHtoLmVuZH1dYCl9YCksIHRoaXMubG9hZGluZ1BhcnRzID0gITE7XG4gICAgfSBlbHNlIGlmICghZS51cmwpXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICAgIHRoaXMubG9nKGBMb2FkaW5nICR7ZS50eXBlfSBzbjogJHtlLnNufSBvZiAke3RoaXMuZnJhZ0luZm8oZSwgITEpfSkgY2M6ICR7ZS5jY30gJHtcIltcIiArIG8uc3RhcnRTTiArIFwiLVwiICsgby5lbmRTTiArIFwiXVwifSwgdGFyZ2V0OiAke3BhcnNlRmxvYXQoci50b0ZpeGVkKDMpKX1gKSwgdWUoZS5zbikgJiYgIXRoaXMuYml0cmF0ZVRlc3QgJiYgKHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IGUuc3RhcnQgKyBlLmR1cmF0aW9uKSwgdGhpcy5zdGF0ZSA9IG5lLkZSQUdfTE9BRElORztcbiAgICBjb25zdCB1ID0gdGhpcy5jb25maWcucHJvZ3Jlc3NpdmU7XG4gICAgbGV0IGQ7XG4gICAgcmV0dXJuIHUgJiYgYSA/IGQgPSBhLnRoZW4oKGgpID0+ICFoIHx8IHRoaXMuZnJhZ0NvbnRleHRDaGFuZ2VkKGguZnJhZykgPyBudWxsIDogdGhpcy5mcmFnbWVudExvYWRlci5sb2FkKGUsIG4pKS5jYXRjaCgoaCkgPT4gdGhpcy5oYW5kbGVGcmFnTG9hZEVycm9yKGgpKSA6IGQgPSBQcm9taXNlLmFsbChbdGhpcy5mcmFnbWVudExvYWRlci5sb2FkKGUsIHUgPyBuIDogdm9pZCAwKSwgYV0pLnRoZW4oKFtoXSkgPT4gKCF1ICYmIG4gJiYgbihoKSwgaCkpLmNhdGNoKChoKSA9PiB0aGlzLmhhbmRsZUZyYWdMb2FkRXJyb3IoaCkpLCB0aGlzLmhscy50cmlnZ2VyKEkuRlJBR19MT0FESU5HLCB7XG4gICAgICBmcmFnOiBlLFxuICAgICAgdGFyZ2V0QnVmZmVyVGltZTogclxuICAgIH0pLCB0aGlzLmZyYWdDdXJyZW50ID09PSBudWxsID8gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiZnJhZyBsb2FkIGFib3J0ZWQsIGNvbnRleHQgY2hhbmdlZCBpbiBGUkFHX0xPQURJTkdcIikpIDogZDtcbiAgfVxuICBkb0ZyYWdQYXJ0c0xvYWQoZSwgdCwgciwgbikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoaSwgbykgPT4ge1xuICAgICAgdmFyIGE7XG4gICAgICBjb25zdCBsID0gW10sIGMgPSAoYSA9IHIuZGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IGEucGFydExpc3QsIHUgPSAoZCkgPT4ge1xuICAgICAgICB0aGlzLmZyYWdtZW50TG9hZGVyLmxvYWRQYXJ0KGUsIGQsIG4pLnRoZW4oKGgpID0+IHtcbiAgICAgICAgICBsW2QuaW5kZXhdID0gaDtcbiAgICAgICAgICBjb25zdCBmID0gaC5wYXJ0O1xuICAgICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5GUkFHX0xPQURFRCwgaCk7XG4gICAgICAgICAgY29uc3QgcCA9IFBoKHIuZGV0YWlscywgZS5zbiwgZC5pbmRleCArIDEpIHx8IHRwKGMsIGUuc24sIGQuaW5kZXggKyAxKTtcbiAgICAgICAgICBpZiAocClcbiAgICAgICAgICAgIHUocCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmV0dXJuIGkoe1xuICAgICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgICBwYXJ0OiBmLFxuICAgICAgICAgICAgICBwYXJ0c0xvYWRlZDogbFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKG8pO1xuICAgICAgfTtcbiAgICAgIHUodCk7XG4gICAgfSk7XG4gIH1cbiAgaGFuZGxlRnJhZ0xvYWRFcnJvcihlKSB7XG4gICAgaWYgKFwiZGF0YVwiIGluIGUpIHtcbiAgICAgIGNvbnN0IHQgPSBlLmRhdGE7XG4gICAgICB0LmZyYWcgJiYgdC5kZXRhaWxzID09PSBKLklOVEVSTkFMX0FCT1JURUQgPyB0aGlzLmhhbmRsZUZyYWdMb2FkQWJvcnRlZCh0LmZyYWcsIHQucGFydCkgOiB0LmZyYWcgJiYgdC50eXBlID09PSB2ZS5LRVlfU1lTVEVNX0VSUk9SID8gKHQuZnJhZy5hYm9ydFJlcXVlc3RzKCksIHRoaXMucmVzZXRTdGFydFdoZW5Ob3RMb2FkZWQoKSwgdGhpcy5yZXNldEZyYWdtZW50TG9hZGluZyh0LmZyYWcpKSA6IHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwgdCk7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgdHlwZTogdmUuT1RIRVJfRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouSU5URVJOQUxfRVhDRVBUSU9OLFxuICAgICAgICBlcnI6IGUsXG4gICAgICAgIGVycm9yOiBlLFxuICAgICAgICBmYXRhbDogITBcbiAgICAgIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIF9oYW5kbGVUcmFuc211eGVyRmx1c2goZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmdldEN1cnJlbnRDb250ZXh0KGUpO1xuICAgIGlmICghdCB8fCB0aGlzLnN0YXRlICE9PSBuZS5QQVJTSU5HKSB7XG4gICAgICAhdGhpcy5mcmFnQ3VycmVudCAmJiB0aGlzLnN0YXRlICE9PSBuZS5TVE9QUEVEICYmIHRoaXMuc3RhdGUgIT09IG5lLkVSUk9SICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IHIsXG4gICAgICBwYXJ0OiBuLFxuICAgICAgbGV2ZWw6IGlcbiAgICB9ID0gdCwgbyA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgci5zdGF0cy5wYXJzaW5nLmVuZCA9IG8sIG4gJiYgKG4uc3RhdHMucGFyc2luZy5lbmQgPSBvKTtcbiAgICBjb25zdCBhID0gdGhpcy5nZXRMZXZlbERldGFpbHMoKSwgYyA9IGEgJiYgci5zbiA+IGEuZW5kU04gfHwgdGhpcy5zaG91bGRMb2FkUGFydHMoYSwgci5lbmQpO1xuICAgIGMgIT09IHRoaXMubG9hZGluZ1BhcnRzICYmICh0aGlzLmxvZyhgTEwtUGFydCBsb2FkaW5nICR7YyA/IFwiT05cIiA6IFwiT0ZGXCJ9IGFmdGVyIHBhcnNpbmcgc2VnbWVudCBlbmRpbmcgQCR7ci5lbmQudG9GaXhlZCgyKX1gKSwgdGhpcy5sb2FkaW5nUGFydHMgPSBjKSwgdGhpcy51cGRhdGVMZXZlbFRpbWluZyhyLCBuLCBpLCBlLnBhcnRpYWwpO1xuICB9XG4gIHNob3VsZExvYWRQYXJ0cyhlLCB0KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvd0xhdGVuY3lNb2RlKSB7XG4gICAgICBpZiAoIWUpXG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmdQYXJ0cztcbiAgICAgIGlmIChlLnBhcnRMaXN0KSB7XG4gICAgICAgIHZhciByO1xuICAgICAgICBjb25zdCBpID0gZS5wYXJ0TGlzdFswXTtcbiAgICAgICAgaWYgKGkuZnJhZ21lbnQudHlwZSA9PT0gcGUuU1VCVElUTEUpXG4gICAgICAgICAgcmV0dXJuICExO1xuICAgICAgICBjb25zdCBvID0gaS5lbmQgKyAoKChyID0gZS5mcmFnbWVudEhpbnQpID09IG51bGwgPyB2b2lkIDAgOiByLmR1cmF0aW9uKSB8fCAwKTtcbiAgICAgICAgaWYgKHQgPj0gbykge1xuICAgICAgICAgIHZhciBuO1xuICAgICAgICAgIGlmICgodGhpcy5obHMuaGFzRW5vdWdoVG9TdGFydCA/ICgobiA9IHRoaXMubWVkaWEpID09IG51bGwgPyB2b2lkIDAgOiBuLmN1cnJlbnRUaW1lKSB8fCB0aGlzLmxhc3RDdXJyZW50VGltZSA6IHRoaXMuZ2V0TG9hZFBvc2l0aW9uKCkpID4gaS5zdGFydCAtIGkuZnJhZ21lbnQuZHVyYXRpb24pXG4gICAgICAgICAgICByZXR1cm4gITA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGdldEN1cnJlbnRDb250ZXh0KGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBsZXZlbHM6IHQsXG4gICAgICBmcmFnQ3VycmVudDogclxuICAgIH0gPSB0aGlzLCB7XG4gICAgICBsZXZlbDogbixcbiAgICAgIHNuOiBpLFxuICAgICAgcGFydDogb1xuICAgIH0gPSBlO1xuICAgIGlmICghKHQgIT0gbnVsbCAmJiB0W25dKSlcbiAgICAgIHJldHVybiB0aGlzLndhcm4oYExldmVscyBvYmplY3Qgd2FzIHVuc2V0IHdoaWxlIGJ1ZmZlcmluZyBmcmFnbWVudCAke2l9IG9mICR7dGhpcy5wbGF5bGlzdExhYmVsKCl9ICR7bn0uIFRoZSBjdXJyZW50IGNodW5rIHdpbGwgbm90IGJlIGJ1ZmZlcmVkLmApLCBudWxsO1xuICAgIGNvbnN0IGEgPSB0W25dLCBsID0gYS5kZXRhaWxzLCBjID0gbyA+IC0xID8gUGgobCwgaSwgbykgOiBudWxsLCB1ID0gYyA/IGMuZnJhZ21lbnQgOiBlcChsLCBpLCByKTtcbiAgICByZXR1cm4gdSA/IChyICYmIHIgIT09IHUgJiYgKHUuc3RhdHMgPSByLnN0YXRzKSwge1xuICAgICAgZnJhZzogdSxcbiAgICAgIHBhcnQ6IGMsXG4gICAgICBsZXZlbDogYVxuICAgIH0pIDogbnVsbDtcbiAgfVxuICBidWZmZXJGcmFnbWVudERhdGEoZSwgdCwgciwgbiwgaSkge1xuICAgIGlmICh0aGlzLnN0YXRlICE9PSBuZS5QQVJTSU5HKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIGRhdGExOiBvLFxuICAgICAgZGF0YTI6IGFcbiAgICB9ID0gZTtcbiAgICBsZXQgbCA9IG87XG4gICAgaWYgKGEgJiYgKGwgPSBfcihvLCBhKSksICFsLmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBjID0gdGhpcy5pbml0UFRTW3QuY2NdLCB1ID0gYyA/IC1jLmJhc2VUaW1lIC8gYy50aW1lc2NhbGUgOiB2b2lkIDAsIGQgPSB7XG4gICAgICB0eXBlOiBlLnR5cGUsXG4gICAgICBmcmFnOiB0LFxuICAgICAgcGFydDogcixcbiAgICAgIGNodW5rTWV0YTogbixcbiAgICAgIG9mZnNldDogdSxcbiAgICAgIHBhcmVudDogdC50eXBlLFxuICAgICAgZGF0YTogbFxuICAgIH07XG4gICAgaWYgKHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfQVBQRU5ESU5HLCBkKSwgZS5kcm9wcGVkICYmIGUuaW5kZXBlbmRlbnQgJiYgIXIpIHtcbiAgICAgIGlmIChpKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLmZsdXNoQnVmZmVyR2FwKHQpO1xuICAgIH1cbiAgfVxuICBmbHVzaEJ1ZmZlckdhcChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMubWVkaWE7XG4gICAgaWYgKCF0KVxuICAgICAgcmV0dXJuO1xuICAgIGlmICghQ2UuaXNCdWZmZXJlZCh0LCB0LmN1cnJlbnRUaW1lKSkge1xuICAgICAgdGhpcy5mbHVzaE1haW5CdWZmZXIoMCwgZS5zdGFydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHIgPSB0LmN1cnJlbnRUaW1lLCBuID0gQ2UuYnVmZmVySW5mbyh0LCByLCAwKSwgaSA9IGUuZHVyYXRpb24sIG8gPSBNYXRoLm1pbih0aGlzLmNvbmZpZy5tYXhGcmFnTG9va1VwVG9sZXJhbmNlICogMiwgaSAqIDAuMjUpLCBhID0gTWF0aC5tYXgoTWF0aC5taW4oZS5zdGFydCAtIG8sIG4uZW5kIC0gbyksIHIgKyBvKTtcbiAgICBlLnN0YXJ0IC0gYSA+IG8gJiYgdGhpcy5mbHVzaE1haW5CdWZmZXIoYSwgZS5zdGFydCk7XG4gIH1cbiAgZ2V0RndkQnVmZmVySW5mbyhlLCB0KSB7XG4gICAgdmFyIHI7XG4gICAgY29uc3QgbiA9IHRoaXMuZ2V0TG9hZFBvc2l0aW9uKCk7XG4gICAgaWYgKCF1ZShuKSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG8gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA+IG4gfHwgKHIgPSB0aGlzLm1lZGlhKSAhPSBudWxsICYmIHIucGF1c2VkID8gMCA6IHRoaXMuY29uZmlnLm1heEJ1ZmZlckhvbGU7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RndkQnVmZmVySW5mb0F0UG9zKGUsIG4sIHQsIG8pO1xuICB9XG4gIGdldEZ3ZEJ1ZmZlckluZm9BdFBvcyhlLCB0LCByLCBuKSB7XG4gICAgY29uc3QgaSA9IENlLmJ1ZmZlckluZm8oZSwgdCwgbik7XG4gICAgaWYgKGkubGVuID09PSAwICYmIGkubmV4dFN0YXJ0ICE9PSB2b2lkIDApIHtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRCdWZmZXJlZEZyYWcodCwgcik7XG4gICAgICBpZiAobyAmJiAoaS5uZXh0U3RhcnQgPD0gby5lbmQgfHwgby5nYXApKSB7XG4gICAgICAgIGNvbnN0IGEgPSBNYXRoLm1heChNYXRoLm1pbihpLm5leHRTdGFydCwgby5lbmQpIC0gdCwgbik7XG4gICAgICAgIHJldHVybiBDZS5idWZmZXJJbmZvKGUsIHQsIGEpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaTtcbiAgfVxuICBnZXRNYXhCdWZmZXJMZW5ndGgoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbmZpZzogdFxuICAgIH0gPSB0aGlzO1xuICAgIGxldCByO1xuICAgIHJldHVybiBlID8gciA9IE1hdGgubWF4KDggKiB0Lm1heEJ1ZmZlclNpemUgLyBlLCB0Lm1heEJ1ZmZlckxlbmd0aCkgOiByID0gdC5tYXhCdWZmZXJMZW5ndGgsIE1hdGgubWluKHIsIHQubWF4TWF4QnVmZmVyTGVuZ3RoKTtcbiAgfVxuICByZWR1Y2VNYXhCdWZmZXJMZW5ndGgoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmNvbmZpZywgbiA9IE1hdGgubWF4KE1hdGgubWluKGUgLSB0LCByLm1heEJ1ZmZlckxlbmd0aCksIHQpLCBpID0gTWF0aC5tYXgoZSAtIHQgKiAzLCByLm1heE1heEJ1ZmZlckxlbmd0aCAvIDIsIG4pO1xuICAgIHJldHVybiBpID49IG4gPyAoci5tYXhNYXhCdWZmZXJMZW5ndGggPSBpLCB0aGlzLndhcm4oYFJlZHVjZSBtYXggYnVmZmVyIGxlbmd0aCB0byAke2l9c2ApLCAhMCkgOiAhMTtcbiAgfVxuICBnZXRBcHBlbmRlZEZyYWcoZSwgdCA9IHBlLk1BSU4pIHtcbiAgICBjb25zdCByID0gdGhpcy5mcmFnbWVudFRyYWNrZXIgPyB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRBcHBlbmRlZEZyYWcoZSwgdCkgOiBudWxsO1xuICAgIHJldHVybiByICYmIFwiZnJhZ21lbnRcIiBpbiByID8gci5mcmFnbWVudCA6IHI7XG4gIH1cbiAgZ2V0TmV4dEZyYWdtZW50KGUsIHQpIHtcbiAgICBjb25zdCByID0gdC5mcmFnbWVudHMsIG4gPSByLmxlbmd0aDtcbiAgICBpZiAoIW4pXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB7XG4gICAgICBjb25maWc6IGlcbiAgICB9ID0gdGhpcywgbyA9IHJbMF0uc3RhcnQsIGEgPSBpLmxvd0xhdGVuY3lNb2RlICYmICEhdC5wYXJ0TGlzdDtcbiAgICBsZXQgbCA9IG51bGw7XG4gICAgaWYgKHQubGl2ZSkge1xuICAgICAgY29uc3QgZCA9IGkuaW5pdGlhbExpdmVNYW5pZmVzdFNpemU7XG4gICAgICBpZiAobiA8IGQpXG4gICAgICAgIHJldHVybiB0aGlzLndhcm4oYE5vdCBlbm91Z2ggZnJhZ21lbnRzIHRvIHN0YXJ0IHBsYXliYWNrIChoYXZlOiAke259LCBuZWVkOiAke2R9KWApLCBudWxsO1xuICAgICAgaWYgKCF0LlBUU0tub3duICYmICF0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCAmJiB0aGlzLnN0YXJ0UG9zaXRpb24gPT09IC0xIHx8IGUgPCBvKSB7XG4gICAgICAgIHZhciBjO1xuICAgICAgICBhICYmICF0aGlzLmxvYWRpbmdQYXJ0cyAmJiAodGhpcy5sb2coXCJMTC1QYXJ0IGxvYWRpbmcgT04gZm9yIGluaXRpYWwgbGl2ZSBmcmFnbWVudFwiKSwgdGhpcy5sb2FkaW5nUGFydHMgPSAhMCksIGwgPSB0aGlzLmdldEluaXRpYWxMaXZlRnJhZ21lbnQodCk7XG4gICAgICAgIGNvbnN0IGggPSB0aGlzLmhscy5zdGFydFBvc2l0aW9uLCBmID0gdGhpcy5obHMubGl2ZVN5bmNQb3NpdGlvbiwgcCA9IGwgPyAoaCAhPT0gLTEgJiYgaCA+PSBvID8gaCA6IGYpIHx8IGwuc3RhcnQgOiBlO1xuICAgICAgICB0aGlzLmxvZyhgU2V0dGluZyBzdGFydFBvc2l0aW9uIHRvICR7cH0gdG8gbWF0Y2ggc3RhcnQgZnJhZyBhdCBsaXZlIGVkZ2UuIG1haW5TdGFydDogJHtofSBsaXZlU3luY1Bvc2l0aW9uOiAke2Z9IGZyYWcuc3RhcnQ6ICR7KGMgPSBsKSA9PSBudWxsID8gdm9pZCAwIDogYy5zdGFydH1gKSwgdGhpcy5zdGFydFBvc2l0aW9uID0gdGhpcy5uZXh0TG9hZFBvc2l0aW9uID0gcDtcbiAgICAgIH1cbiAgICB9IGVsc2UgZSA8PSBvICYmIChsID0gclswXSk7XG4gICAgaWYgKCFsKSB7XG4gICAgICBjb25zdCBkID0gdGhpcy5sb2FkaW5nUGFydHMgPyB0LnBhcnRFbmQgOiB0LmZyYWdtZW50RW5kO1xuICAgICAgbCA9IHRoaXMuZ2V0RnJhZ21lbnRBdFBvc2l0aW9uKGUsIGQsIHQpO1xuICAgIH1cbiAgICBsZXQgdSA9IHRoaXMuZmlsdGVyUmVwbGFjZWRQcmltYXJ5KGwsIHQpO1xuICAgIGlmICghdSAmJiBsKSB7XG4gICAgICBjb25zdCBkID0gbC5zbiAtIHQuc3RhcnRTTjtcbiAgICAgIHUgPSB0aGlzLmZpbHRlclJlcGxhY2VkUHJpbWFyeShyW2QgKyAxXSB8fCBudWxsLCB0KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubWFwVG9Jbml0RnJhZ1doZW5SZXF1aXJlZCh1KTtcbiAgfVxuICBpc0xvb3BMb2FkaW5nKGUsIHQpIHtcbiAgICBjb25zdCByID0gdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoZSk7XG4gICAgcmV0dXJuIChyID09PSBIdC5PSyB8fCByID09PSBIdC5QQVJUSUFMICYmICEhZS5nYXApICYmIHRoaXMubmV4dExvYWRQb3NpdGlvbiA+IHQ7XG4gIH1cbiAgZ2V0TmV4dEZyYWdtZW50TG9vcExvYWRpbmcoZSwgdCwgciwgbiwgaSkge1xuICAgIGxldCBvID0gbnVsbDtcbiAgICBpZiAoZS5nYXAgJiYgKG8gPSB0aGlzLmdldE5leHRGcmFnbWVudCh0aGlzLm5leHRMb2FkUG9zaXRpb24sIHQpLCBvICYmICFvLmdhcCAmJiByLm5leHRTdGFydCkpIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmdldEZ3ZEJ1ZmZlckluZm9BdFBvcyh0aGlzLm1lZGlhQnVmZmVyID8gdGhpcy5tZWRpYUJ1ZmZlciA6IHRoaXMubWVkaWEsIHIubmV4dFN0YXJ0LCBuLCAwKTtcbiAgICAgIGlmIChhICE9PSBudWxsICYmIHIubGVuICsgYS5sZW4gPj0gaSkge1xuICAgICAgICBjb25zdCBsID0gby5zbjtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9vcFNuICE9PSBsICYmICh0aGlzLmxvZyhgYnVmZmVyIGZ1bGwgYWZ0ZXIgZ2FwcyBpbiBcIiR7bn1cIiBwbGF5bGlzdCBzdGFydGluZyBhdCBzbjogJHtsfWApLCB0aGlzLmxvb3BTbiA9IGwpLCBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5sb29wU24gPSB2b2lkIDAsIG87XG4gIH1cbiAgZ2V0IHByaW1hcnlQcmVmZXRjaCgpIHtcbiAgICBpZiAoQmgodGhpcy5jb25maWcpKSB7XG4gICAgICB2YXIgZTtcbiAgICAgIGlmICgoZSA9IHRoaXMuaGxzLmludGVyc3RpdGlhbHNNYW5hZ2VyKSA9PSBudWxsIHx8IChlID0gZS5wbGF5aW5nSXRlbSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUuZXZlbnQpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGZpbHRlclJlcGxhY2VkUHJpbWFyeShlLCB0KSB7XG4gICAgaWYgKCFlKVxuICAgICAgcmV0dXJuIGU7XG4gICAgaWYgKEJoKHRoaXMuY29uZmlnKSAmJiBlLnR5cGUgIT09IHBlLlNVQlRJVExFKSB7XG4gICAgICBjb25zdCByID0gdGhpcy5obHMuaW50ZXJzdGl0aWFsc01hbmFnZXIsIG4gPSByID09IG51bGwgPyB2b2lkIDAgOiByLmJ1ZmZlcmluZ0l0ZW07XG4gICAgICBpZiAobikge1xuICAgICAgICBjb25zdCBvID0gbi5ldmVudDtcbiAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICBpZiAoby5hcHBlbmRJblBsYWNlIHx8IE1hdGguYWJzKGUuc3RhcnQgLSBuLnN0YXJ0KSA+IDEgfHwgbi5zdGFydCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGUuZW5kIDw9IG4uc3RhcnQgJiYgKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQubGl2ZSkgPT09ICExIHx8IGUuc3RhcnQgPiBuLmVuZCAmJiBuLm5leHRFdmVudCAmJiAobi5uZXh0RXZlbnQuYXBwZW5kSW5QbGFjZSB8fCBlLnN0YXJ0IC0gbi5lbmQgPiAxKSlcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGkgPSByID09IG51bGwgPyB2b2lkIDAgOiByLnBsYXllclF1ZXVlO1xuICAgICAgaWYgKGkpXG4gICAgICAgIGZvciAobGV0IG8gPSBpLmxlbmd0aDsgby0tOyApIHtcbiAgICAgICAgICBjb25zdCBhID0gaVtvXS5pbnRlcnN0aXRpYWw7XG4gICAgICAgICAgaWYgKGEuYXBwZW5kSW5QbGFjZSAmJiBlLnN0YXJ0ID49IGEuc3RhcnRUaW1lICYmIGUuZW5kIDw9IGEucmVzdW1lVGltZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlO1xuICB9XG4gIG1hcFRvSW5pdEZyYWdXaGVuUmVxdWlyZWQoZSkge1xuICAgIHJldHVybiBlICE9IG51bGwgJiYgZS5pbml0U2VnbWVudCAmJiAhZS5pbml0U2VnbWVudC5kYXRhICYmICF0aGlzLmJpdHJhdGVUZXN0ID8gZS5pbml0U2VnbWVudCA6IGU7XG4gIH1cbiAgZ2V0TmV4dFBhcnQoZSwgdCwgcikge1xuICAgIGxldCBuID0gLTEsIGkgPSAhMSwgbyA9ICEwO1xuICAgIGZvciAobGV0IGEgPSAwLCBsID0gZS5sZW5ndGg7IGEgPCBsOyBhKyspIHtcbiAgICAgIGNvbnN0IGMgPSBlW2FdO1xuICAgICAgaWYgKG8gPSBvICYmICFjLmluZGVwZW5kZW50LCBuID4gLTEgJiYgciA8IGMuc3RhcnQpXG4gICAgICAgIGJyZWFrO1xuICAgICAgY29uc3QgdSA9IGMubG9hZGVkO1xuICAgICAgdSA/IG4gPSAtMSA6IChpIHx8IChjLmluZGVwZW5kZW50IHx8IG8pICYmIGMuZnJhZ21lbnQgPT09IHQpICYmIChjLmZyYWdtZW50ICE9PSB0ICYmIHRoaXMud2FybihgTmVlZCBidWZmZXIgYXQgJHtyfSBidXQgbmV4dCB1bmxvYWRlZCBwYXJ0IHN0YXJ0cyBhdCAke2Muc3RhcnR9YCksIG4gPSBhKSwgaSA9IHU7XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG4gIGxvYWRlZEVuZE9mUGFydHMoZSwgdCkge1xuICAgIGxldCByO1xuICAgIGZvciAobGV0IG4gPSBlLmxlbmd0aDsgbi0tOyApIHtcbiAgICAgIGlmIChyID0gZVtuXSwgIXIubG9hZGVkKVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICBpZiAodCA+IHIuc3RhcnQpXG4gICAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIC8qXG4gICBUaGlzIG1ldGhvZCBpcyB1c2VkIGZpbmQgdGhlIGJlc3QgbWF0Y2hpbmcgZmlyc3QgZnJhZ21lbnQgZm9yIGEgbGl2ZSBwbGF5bGlzdC4gVGhpcyBmcmFnbWVudCBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGVcbiAgIFwic2xpZGluZ1wiIG9mIHRoZSBwbGF5bGlzdCwgd2hpY2ggaXMgaXRzIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiBwbGF5YmFjay4gQWZ0ZXIgc2xpZGluZyB3ZSBjYW4gY29tcHV0ZSB0aGUgcmVhbFxuICAgc3RhcnQgYW5kIGVuZCB0aW1lcyBmb3IgZWFjaCBmcmFnbWVudCBpbiB0aGUgcGxheWxpc3QgKGFmdGVyIHdoaWNoIHRoaXMgbWV0aG9kIHdpbGwgbm90IG5lZWQgdG8gYmUgY2FsbGVkKS5cbiAgKi9cbiAgZ2V0SW5pdGlhbExpdmVGcmFnbWVudChlKSB7XG4gICAgY29uc3QgdCA9IGUuZnJhZ21lbnRzLCByID0gdGhpcy5mcmFnUHJldmlvdXM7XG4gICAgbGV0IG4gPSBudWxsO1xuICAgIGlmIChyKSB7XG4gICAgICBpZiAoZS5oYXNQcm9ncmFtRGF0ZVRpbWUgJiYgKHRoaXMubG9nKGBMaXZlIHBsYXlsaXN0LCBzd2l0Y2hpbmcgcGxheWxpc3QsIGxvYWQgZnJhZyB3aXRoIHNhbWUgUERUOiAke3IucHJvZ3JhbURhdGVUaW1lfWApLCBuID0gdmIodCwgci5lbmRQcm9ncmFtRGF0ZVRpbWUsIHRoaXMuY29uZmlnLm1heEZyYWdMb29rVXBUb2xlcmFuY2UpKSwgIW4pIHtcbiAgICAgICAgY29uc3QgaSA9IHIuc24gKyAxO1xuICAgICAgICBpZiAoaSA+PSBlLnN0YXJ0U04gJiYgaSA8PSBlLmVuZFNOKSB7XG4gICAgICAgICAgY29uc3QgbyA9IHRbaSAtIGUuc3RhcnRTTl07XG4gICAgICAgICAgci5jYyA9PT0gby5jYyAmJiAobiA9IG8sIHRoaXMubG9nKGBMaXZlIHBsYXlsaXN0LCBzd2l0Y2hpbmcgcGxheWxpc3QsIGxvYWQgZnJhZyB3aXRoIG5leHQgU046ICR7bi5zbn1gKSk7XG4gICAgICAgIH1cbiAgICAgICAgbiB8fCAobiA9IFZnKGUsIHIuY2MsIHIuZW5kKSwgbiAmJiB0aGlzLmxvZyhgTGl2ZSBwbGF5bGlzdCwgc3dpdGNoaW5nIHBsYXlsaXN0LCBsb2FkIGZyYWcgd2l0aCBzYW1lIENDOiAke24uc259YCkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpID0gdGhpcy5obHMubGl2ZVN5bmNQb3NpdGlvbjtcbiAgICAgIGkgIT09IG51bGwgJiYgKG4gPSB0aGlzLmdldEZyYWdtZW50QXRQb3NpdGlvbihpLCB0aGlzLmJpdHJhdGVUZXN0ID8gZS5mcmFnbWVudEVuZCA6IGUuZWRnZSwgZSkpO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbiAgfVxuICAvKlxuICBUaGlzIG1ldGhvZCBmaW5kcyB0aGUgYmVzdCBtYXRjaGluZyBmcmFnbWVudCBnaXZlbiB0aGUgcHJvdmlkZWQgcG9zaXRpb24uXG4gICAqL1xuICBnZXRGcmFnbWVudEF0UG9zaXRpb24oZSwgdCwgcikge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbmZpZzogblxuICAgIH0gPSB0aGlzO1xuICAgIGxldCB7XG4gICAgICBmcmFnUHJldmlvdXM6IGlcbiAgICB9ID0gdGhpcywge1xuICAgICAgZnJhZ21lbnRzOiBvLFxuICAgICAgZW5kU046IGFcbiAgICB9ID0gcjtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnbWVudEhpbnQ6IGxcbiAgICB9ID0gciwge1xuICAgICAgbWF4RnJhZ0xvb2tVcFRvbGVyYW5jZTogY1xuICAgIH0gPSBuLCB1ID0gci5wYXJ0TGlzdCwgZCA9ICEhKHRoaXMubG9hZGluZ1BhcnRzICYmIHUgIT0gbnVsbCAmJiB1Lmxlbmd0aCAmJiBsKTtcbiAgICBkICYmICF0aGlzLmJpdHJhdGVUZXN0ICYmIHVbdS5sZW5ndGggLSAxXS5mcmFnbWVudC5zbiA9PT0gbC5zbiAmJiAobyA9IG8uY29uY2F0KGwpLCBhID0gbC5zbik7XG4gICAgbGV0IGg7XG4gICAgaWYgKGUgPCB0KSB7XG4gICAgICB2YXIgZjtcbiAgICAgIGNvbnN0IHkgPSBlIDwgdGhpcy5sYXN0Q3VycmVudFRpbWUgfHwgZSA+IHQgLSBjIHx8IChmID0gdGhpcy5tZWRpYSkgIT0gbnVsbCAmJiBmLnBhdXNlZCB8fCAhdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPyAwIDogYztcbiAgICAgIGggPSBKcyhpLCBvLCBlLCB5KTtcbiAgICB9IGVsc2VcbiAgICAgIGggPSBvW28ubGVuZ3RoIC0gMV07XG4gICAgaWYgKGgpIHtcbiAgICAgIGNvbnN0IHAgPSBoLnNuIC0gci5zdGFydFNOLCB5ID0gdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoaCk7XG4gICAgICBpZiAoKHkgPT09IEh0Lk9LIHx8IHkgPT09IEh0LlBBUlRJQUwgJiYgaC5nYXApICYmIChpID0gaCksIGkgJiYgaC5zbiA9PT0gaS5zbiAmJiAoIWQgfHwgdVswXS5mcmFnbWVudC5zbiA+IGguc24gfHwgIXIubGl2ZSkgJiYgaC5sZXZlbCA9PT0gaS5sZXZlbCkge1xuICAgICAgICBjb25zdCBiID0gb1twICsgMV07XG4gICAgICAgIGguc24gPCBhICYmIHRoaXMuZnJhZ21lbnRUcmFja2VyLmdldFN0YXRlKGIpICE9PSBIdC5PSyA/IGggPSBiIDogaCA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoO1xuICB9XG4gIGFsaWduUGxheWxpc3RzKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gZS5mcmFnbWVudHMubGVuZ3RoO1xuICAgIGlmICghbilcbiAgICAgIHJldHVybiB0aGlzLndhcm4oXCJObyBmcmFnbWVudHMgaW4gbGl2ZSBwbGF5bGlzdFwiKSwgMDtcbiAgICBjb25zdCBpID0gZS5mcmFnbWVudFN0YXJ0LCBvID0gIXQsIGEgPSBlLmFsaWduZWRTbGlkaW5nICYmIHVlKGkpO1xuICAgIGlmIChvIHx8ICFhICYmICFpKSB7XG4gICAgICByVChyLCBlKTtcbiAgICAgIGNvbnN0IGwgPSBlLmZyYWdtZW50U3RhcnQ7XG4gICAgICByZXR1cm4gdGhpcy5sb2coYExpdmUgcGxheWxpc3Qgc2xpZGluZzogJHtsLnRvRml4ZWQoMil9IHN0YXJ0LXNuOiAke3QgPyB0LnN0YXJ0U04gOiBcIm5hXCJ9LT4ke2Uuc3RhcnRTTn0gZnJhZ21lbnRzOiAke259YCksIGw7XG4gICAgfVxuICAgIHJldHVybiBpO1xuICB9XG4gIHdhaXRGb3JDZG5UdW5lSW4oZSkge1xuICAgIHJldHVybiBlLmxpdmUgJiYgZS5jYW5CbG9ja1JlbG9hZCAmJiBlLnBhcnRUYXJnZXQgJiYgZS50dW5lSW5Hb2FsID4gTWF0aC5tYXgoZS5wYXJ0SG9sZEJhY2ssIGUucGFydFRhcmdldCAqIDMpO1xuICB9XG4gIHNldFN0YXJ0UG9zaXRpb24oZSwgdCkge1xuICAgIGxldCByID0gdGhpcy5zdGFydFBvc2l0aW9uO1xuICAgIHIgPCB0ICYmIChyID0gLTEpO1xuICAgIGNvbnN0IG4gPSB0aGlzLnRpbWVsaW5lT2Zmc2V0O1xuICAgIGlmIChyID09PSAtMSkge1xuICAgICAgY29uc3QgaSA9IHRoaXMuc3RhcnRUaW1lT2Zmc2V0ICE9PSBudWxsLCBvID0gaSA/IHRoaXMuc3RhcnRUaW1lT2Zmc2V0IDogZS5zdGFydFRpbWVPZmZzZXQ7XG4gICAgICBvICE9PSBudWxsICYmIHVlKG8pID8gKHIgPSB0ICsgbywgbyA8IDAgJiYgKHIgKz0gZS5lZGdlKSwgciA9IE1hdGgubWluKE1hdGgubWF4KHQsIHIpLCB0ICsgZS50b3RhbGR1cmF0aW9uKSwgdGhpcy5sb2coYFNldHRpbmcgc3RhcnRQb3NpdGlvbiB0byAke3J9IGZvciBzdGFydCB0aW1lIG9mZnNldCAke299IGZvdW5kIGluICR7aSA/IFwibXVsdGl2YXJpYW50XCIgOiBcIm1lZGlhXCJ9IHBsYXlsaXN0YCksIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHIpIDogZS5saXZlID8gKHIgPSB0aGlzLmhscy5saXZlU3luY1Bvc2l0aW9uIHx8IHQsIHRoaXMubG9nKGBTZXR0aW5nIHN0YXJ0UG9zaXRpb24gdG8gLTEgdG8gc3RhcnQgYXQgbGl2ZSBlZGdlICR7cn1gKSwgdGhpcy5zdGFydFBvc2l0aW9uID0gLTEpIDogKHRoaXMubG9nKFwic2V0dGluZyBzdGFydFBvc2l0aW9uIHRvIDAgYnkgZGVmYXVsdFwiKSwgdGhpcy5zdGFydFBvc2l0aW9uID0gciA9IDApLCB0aGlzLmxhc3RDdXJyZW50VGltZSA9IHIgKyBuO1xuICAgIH1cbiAgICB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSByICsgbjtcbiAgfVxuICBnZXRMb2FkUG9zaXRpb24oKSB7XG4gICAgdmFyIGU7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IHRcbiAgICB9ID0gdGhpcztcbiAgICBsZXQgciA9IDA7XG4gICAgcmV0dXJuIChlID0gdGhpcy5obHMpICE9IG51bGwgJiYgZS5oYXNFbm91Z2hUb1N0YXJ0ICYmIHQgPyByID0gdC5jdXJyZW50VGltZSA6IHRoaXMubmV4dExvYWRQb3NpdGlvbiA+PSAwICYmIChyID0gdGhpcy5uZXh0TG9hZFBvc2l0aW9uKSwgcjtcbiAgfVxuICBoYW5kbGVGcmFnTG9hZEFib3J0ZWQoZSwgdCkge1xuICAgIHRoaXMudHJhbnNtdXhlciAmJiBlLnR5cGUgPT09IHRoaXMucGxheWxpc3RUeXBlICYmIFZ0KGUpICYmIGUuc3RhdHMuYWJvcnRlZCAmJiAodGhpcy5sb2coYEZyYWdtZW50ICR7ZS5zbn0ke3QgPyBcIiBwYXJ0IFwiICsgdC5pbmRleCA6IFwiXCJ9IG9mICR7dGhpcy5wbGF5bGlzdExhYmVsKCl9ICR7ZS5sZXZlbH0gd2FzIGFib3J0ZWRgKSwgdGhpcy5yZXNldEZyYWdtZW50TG9hZGluZyhlKSk7XG4gIH1cbiAgcmVzZXRGcmFnbWVudExvYWRpbmcoZSkge1xuICAgICghdGhpcy5mcmFnQ3VycmVudCB8fCAhdGhpcy5mcmFnQ29udGV4dENoYW5nZWQoZSkgJiYgdGhpcy5zdGF0ZSAhPT0gbmUuRlJBR19MT0FESU5HX1dBSVRJTkdfUkVUUlkpICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gIH1cbiAgb25GcmFnbWVudE9yS2V5TG9hZEVycm9yKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBpZiAodC5jaHVua01ldGEgJiYgIXQuZnJhZykge1xuICAgICAgY29uc3QgYiA9IHRoaXMuZ2V0Q3VycmVudENvbnRleHQodC5jaHVua01ldGEpO1xuICAgICAgYiAmJiAodC5mcmFnID0gYi5mcmFnKTtcbiAgICB9XG4gICAgY29uc3QgbiA9IHQuZnJhZztcbiAgICBpZiAoIW4gfHwgbi50eXBlICE9PSBlIHx8ICF0aGlzLmxldmVscylcbiAgICAgIHJldHVybjtcbiAgICBpZiAodGhpcy5mcmFnQ29udGV4dENoYW5nZWQobikpIHtcbiAgICAgIHZhciBpO1xuICAgICAgdGhpcy53YXJuKGBGcmFnIGxvYWQgZXJyb3IgbXVzdCBtYXRjaCBjdXJyZW50IGZyYWcgdG8gcmV0cnkgJHtuLnVybH0gPiAkeyhpID0gdGhpcy5mcmFnQ3VycmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IGkudXJsfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBvID0gdC5kZXRhaWxzID09PSBKLkZSQUdfR0FQO1xuICAgIG8gJiYgdGhpcy5mcmFnbWVudFRyYWNrZXIuZnJhZ0J1ZmZlcmVkKG4sICEwKTtcbiAgICBjb25zdCBhID0gdC5lcnJvckFjdGlvbjtcbiAgICBpZiAoIWEpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBuZS5FUlJPUjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYWN0aW9uOiBsLFxuICAgICAgZmxhZ3M6IGMsXG4gICAgICByZXRyeUNvdW50OiB1ID0gMCxcbiAgICAgIHJldHJ5Q29uZmlnOiBkXG4gICAgfSA9IGEsIGggPSAhIWQsIGYgPSBoICYmIGwgPT09IFp0LlJldHJ5UmVxdWVzdCwgcCA9IGggJiYgIWEucmVzb2x2ZWQgJiYgYyA9PT0gdnIuTW92ZUFsbEFsdGVybmF0ZXNNYXRjaGluZ0hvc3QsIHkgPSAociA9IHRoaXMuaGxzLmxhdGVzdExldmVsRGV0YWlscykgPT0gbnVsbCA/IHZvaWQgMCA6IHIubGl2ZTtcbiAgICBpZiAoIWYgJiYgcCAmJiBWdChuKSAmJiAhbi5lbmRMaXN0ICYmIHkgJiYgIUtnKHQpKVxuICAgICAgdGhpcy5yZXNldEZyYWdtZW50RXJyb3JzKGUpLCB0aGlzLnRyZWF0QXNHYXAobiksIGEucmVzb2x2ZWQgPSAhMDtcbiAgICBlbHNlIGlmICgoZiB8fCBwKSAmJiB1IDwgZC5tYXhOdW1SZXRyeSkge1xuICAgICAgdmFyIEU7XG4gICAgICBjb25zdCBiID0gdWMoKEUgPSB0LnJlc3BvbnNlKSA9PSBudWxsID8gdm9pZCAwIDogRS5jb2RlKSwgUiA9IHl1KGQsIHUpO1xuICAgICAgaWYgKHRoaXMucmVzZXRTdGFydFdoZW5Ob3RMb2FkZWQoKSwgdGhpcy5yZXRyeURhdGUgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpICsgUiwgdGhpcy5zdGF0ZSA9IG5lLkZSQUdfTE9BRElOR19XQUlUSU5HX1JFVFJZLCBhLnJlc29sdmVkID0gITAsIGIpIHtcbiAgICAgICAgdGhpcy5sb2coXCJXYWl0aW5nIGZvciBjb25uZWN0aW9uIChvZmZsaW5lKVwiKSwgdGhpcy5yZXRyeURhdGUgPSAxIC8gMCwgdC5yZWFzb24gPSBcIm9mZmxpbmVcIjtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy53YXJuKGBGcmFnbWVudCAke24uc259IG9mICR7ZX0gJHtuLmxldmVsfSBlcnJvcmVkIHdpdGggJHt0LmRldGFpbHN9LCByZXRyeWluZyBsb2FkaW5nICR7dSArIDF9LyR7ZC5tYXhOdW1SZXRyeX0gaW4gJHtSfW1zYCk7XG4gICAgfSBlbHNlIGlmIChkKVxuICAgICAgaWYgKHRoaXMucmVzZXRGcmFnbWVudEVycm9ycyhlKSwgdSA8IGQubWF4TnVtUmV0cnkpXG4gICAgICAgICFvICYmIGwgIT09IFp0LlJlbW92ZUFsdGVybmF0ZVBlcm1hbmVudGx5ICYmIChhLnJlc29sdmVkID0gITApO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMud2FybihgJHt0LmRldGFpbHN9IHJlYWNoZWQgb3IgZXhjZWVkZWQgbWF4IHJldHJ5ICgke3V9KWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgZWxzZSBsID09PSBadC5TZW5kQWx0ZXJuYXRlVG9QZW5hbHR5Qm94ID8gdGhpcy5zdGF0ZSA9IG5lLldBSVRJTkdfTEVWRUwgOiB0aGlzLnN0YXRlID0gbmUuRVJST1I7XG4gICAgdGhpcy50aWNrSW1tZWRpYXRlKCk7XG4gIH1cbiAgY2hlY2tSZXRyeURhdGUoKSB7XG4gICAgY29uc3QgZSA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCksIHQgPSB0aGlzLnJldHJ5RGF0ZSwgciA9IHQgPT09IDEgLyAwO1xuICAgICghdCB8fCBlID49IHQgfHwgciAmJiAhdWMoMCkpICYmIChyICYmIHRoaXMubG9nKFwiQ29ubmVjdGlvbiByZXN0b3JlZCAob25saW5lKVwiKSwgdGhpcy5yZXNldFN0YXJ0V2hlbk5vdExvYWRlZCgpLCB0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gIH1cbiAgcmVkdWNlTGVuZ3RoQW5kRmx1c2hCdWZmZXIoZSkge1xuICAgIGlmICh0aGlzLnN0YXRlID09PSBuZS5QQVJTSU5HIHx8IHRoaXMuc3RhdGUgPT09IG5lLlBBUlNFRCkge1xuICAgICAgY29uc3QgdCA9IGUuZnJhZywgciA9IGUucGFyZW50LCBuID0gdGhpcy5nZXRGd2RCdWZmZXJJbmZvKHRoaXMubWVkaWFCdWZmZXIsIHIpLCBpID0gbiAmJiBuLmxlbiA+IDAuNTtcbiAgICAgIGkgJiYgdGhpcy5yZWR1Y2VNYXhCdWZmZXJMZW5ndGgobi5sZW4sICh0ID09IG51bGwgPyB2b2lkIDAgOiB0LmR1cmF0aW9uKSB8fCAxMCk7XG4gICAgICBjb25zdCBvID0gIWk7XG4gICAgICByZXR1cm4gbyAmJiB0aGlzLndhcm4oYEJ1ZmZlciBmdWxsIGVycm9yIHdoaWxlIG1lZGlhLmN1cnJlbnRUaW1lICgke3RoaXMuZ2V0TG9hZFBvc2l0aW9uKCl9KSBpcyBub3QgYnVmZmVyZWQsIGZsdXNoICR7cn0gYnVmZmVyYCksIHQgJiYgKHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KHQpLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0LnN0YXJ0KSwgdGhpcy5yZXNldExvYWRpbmdTdGF0ZSgpLCBvO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgcmVzZXRGcmFnbWVudEVycm9ycyhlKSB7XG4gICAgZSA9PT0gcGUuQVVESU8gJiYgKHRoaXMuZnJhZ0N1cnJlbnQgPSBudWxsKSwgdGhpcy5obHMuaGFzRW5vdWdoVG9TdGFydCB8fCAodGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMSksIHRoaXMuc3RhdGUgIT09IG5lLlNUT1BQRUQgJiYgKHRoaXMuc3RhdGUgPSBuZS5JRExFKTtcbiAgfVxuICBhZnRlckJ1ZmZlckZsdXNoZWQoZSwgdCwgcikge1xuICAgIGlmICghZSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBuID0gQ2UuZ2V0QnVmZmVyZWQoZSk7XG4gICAgdGhpcy5mcmFnbWVudFRyYWNrZXIuZGV0ZWN0RXZpY3RlZEZyYWdtZW50cyh0LCBuLCByKSwgdGhpcy5zdGF0ZSA9PT0gbmUuRU5ERUQgJiYgdGhpcy5yZXNldExvYWRpbmdTdGF0ZSgpO1xuICB9XG4gIHJlc2V0TG9hZGluZ1N0YXRlKCkge1xuICAgIHRoaXMubG9nKFwiUmVzZXQgbG9hZGluZyBzdGF0ZVwiKSwgdGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMuZnJhZ1ByZXZpb3VzID0gbnVsbCwgdGhpcy5zdGF0ZSAhPT0gbmUuU1RPUFBFRCAmJiAodGhpcy5zdGF0ZSA9IG5lLklETEUpO1xuICB9XG4gIHJlc2V0U3RhcnRXaGVuTm90TG9hZGVkKCkge1xuICAgIGlmICghdGhpcy5obHMuaGFzRW5vdWdoVG9TdGFydCkge1xuICAgICAgdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMTtcbiAgICAgIGNvbnN0IGUgPSB0aGlzLmxldmVsTGFzdExvYWRlZCwgdCA9IGUgPyBlLmRldGFpbHMgOiBudWxsO1xuICAgICAgdCAhPSBudWxsICYmIHQubGl2ZSA/ICh0aGlzLmxvZyhcInJlc2V0dGluZyBzdGFydFBvc2l0aW9uIGZvciBsaXZlIHN0YXJ0XCIpLCB0aGlzLnN0YXJ0UG9zaXRpb24gPSAtMSwgdGhpcy5zZXRTdGFydFBvc2l0aW9uKHQsIHQuZnJhZ21lbnRTdGFydCksIHRoaXMucmVzZXRMb2FkaW5nU3RhdGUoKSkgOiB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLnN0YXJ0UG9zaXRpb247XG4gICAgfVxuICB9XG4gIHJlc2V0V2hlbk1pc3NpbmdDb250ZXh0KGUpIHtcbiAgICB0aGlzLmxvZyhgTG9hZGluZyBjb250ZXh0IGNoYW5nZWQgd2hpbGUgYnVmZmVyaW5nIHNuICR7ZS5zbn0gb2YgJHt0aGlzLnBsYXlsaXN0TGFiZWwoKX0gJHtlLmxldmVsID09PSAtMSA/IFwiPHJlbW92ZWQ+XCIgOiBlLmxldmVsfS4gVGhpcyBjaHVuayB3aWxsIG5vdCBiZSBidWZmZXJlZC5gKSwgdGhpcy5yZW1vdmVVbmJ1ZmZlcmVkRnJhZ3MoKSwgdGhpcy5yZXNldFN0YXJ0V2hlbk5vdExvYWRlZCgpLCB0aGlzLnJlc2V0TG9hZGluZ1N0YXRlKCk7XG4gIH1cbiAgcmVtb3ZlVW5idWZmZXJlZEZyYWdzKGUgPSAwKSB7XG4gICAgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnRzSW5SYW5nZShlLCAxIC8gMCwgdGhpcy5wbGF5bGlzdFR5cGUsICExLCAhMCk7XG4gIH1cbiAgdXBkYXRlTGV2ZWxUaW1pbmcoZSwgdCwgciwgbikge1xuICAgIGNvbnN0IGkgPSByLmRldGFpbHM7XG4gICAgaWYgKCFpKSB7XG4gICAgICB0aGlzLndhcm4oXCJsZXZlbC5kZXRhaWxzIHVuZGVmaW5lZFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFPYmplY3Qua2V5cyhlLmVsZW1lbnRhcnlTdHJlYW1zKS5yZWR1Y2UoKGwsIGMpID0+IHtcbiAgICAgIGNvbnN0IHUgPSBlLmVsZW1lbnRhcnlTdHJlYW1zW2NdO1xuICAgICAgaWYgKHUpIHtcbiAgICAgICAgY29uc3QgZCA9IHUuZW5kUFRTIC0gdS5zdGFydFBUUztcbiAgICAgICAgaWYgKGQgPD0gMClcbiAgICAgICAgICByZXR1cm4gdGhpcy53YXJuKGBDb3VsZCBub3QgcGFyc2UgZnJhZ21lbnQgJHtlLnNufSAke2N9IGR1cmF0aW9uIHJlbGlhYmx5ICgke2R9KWApLCBsIHx8ICExO1xuICAgICAgICBjb25zdCBoID0gbiA/IDAgOiBYZyhpLCBlLCB1LnN0YXJ0UFRTLCB1LmVuZFBUUywgdS5zdGFydERUUywgdS5lbmREVFMsIHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5obHMudHJpZ2dlcihJLkxFVkVMX1BUU19VUERBVEVELCB7XG4gICAgICAgICAgZGV0YWlsczogaSxcbiAgICAgICAgICBsZXZlbDogcixcbiAgICAgICAgICBkcmlmdDogaCxcbiAgICAgICAgICB0eXBlOiBjLFxuICAgICAgICAgIGZyYWc6IGUsXG4gICAgICAgICAgc3RhcnQ6IHUuc3RhcnRQVFMsXG4gICAgICAgICAgZW5kOiB1LmVuZFBUU1xuICAgICAgICB9KSwgITA7XG4gICAgICB9XG4gICAgICByZXR1cm4gbDtcbiAgICB9LCAhMSkpIHtcbiAgICAgIHZhciBhO1xuICAgICAgaWYgKHIuZnJhZ21lbnRFcnJvciA9PT0gMCAmJiB0aGlzLnRyZWF0QXNHYXAoZSwgciksICgoYSA9IHRoaXMudHJhbnNtdXhlcikgPT0gbnVsbCA/IHZvaWQgMCA6IGEuZXJyb3IpID09PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGwgPSBuZXcgRXJyb3IoYEZvdW5kIG5vIG1lZGlhIGluIGZyYWdtZW50ICR7ZS5zbn0gb2YgJHt0aGlzLnBsYXlsaXN0TGFiZWwoKX0gJHtlLmxldmVsfSByZXNldHRpbmcgdHJhbnNtdXhlciB0byBmYWxsYmFjayB0byBwbGF5bGlzdCB0aW1pbmdgKTtcbiAgICAgICAgaWYgKHRoaXMud2FybihsLm1lc3NhZ2UpLCB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgICBkZXRhaWxzOiBKLkZSQUdfUEFSU0lOR19FUlJPUixcbiAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgZXJyb3I6IGwsXG4gICAgICAgICAgZnJhZzogZSxcbiAgICAgICAgICByZWFzb246IGBGb3VuZCBubyBtZWRpYSBpbiBtc24gJHtlLnNufSBvZiAke3RoaXMucGxheWxpc3RMYWJlbCgpfSBcIiR7ci51cmx9XCJgXG4gICAgICAgIH0pLCAhdGhpcy5obHMpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlc2V0VHJhbnNtdXhlcigpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gbmUuUEFSU0VELCB0aGlzLmxvZyhgUGFyc2VkICR7ZS50eXBlfSBzbjogJHtlLnNufSR7dCA/IFwiIHBhcnQ6IFwiICsgdC5pbmRleCA6IFwiXCJ9IG9mICR7dGhpcy5mcmFnSW5mbyhlLCAhMSwgdCl9KWApLCB0aGlzLmhscy50cmlnZ2VyKEkuRlJBR19QQVJTRUQsIHtcbiAgICAgIGZyYWc6IGUsXG4gICAgICBwYXJ0OiB0XG4gICAgfSk7XG4gIH1cbiAgcGxheWxpc3RMYWJlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5wbGF5bGlzdFR5cGUgPT09IHBlLk1BSU4gPyBcImxldmVsXCIgOiBcInRyYWNrXCI7XG4gIH1cbiAgZnJhZ0luZm8oZSwgdCA9ICEwLCByKSB7XG4gICAgdmFyIG4sIGk7XG4gICAgcmV0dXJuIGAke3RoaXMucGxheWxpc3RMYWJlbCgpfSAke2UubGV2ZWx9ICgke3IgPyBcInBhcnRcIiA6IFwiZnJhZ1wifTpbJHsoKG4gPSB0ICYmICFyID8gZS5zdGFydFBUUyA6IChyIHx8IGUpLnN0YXJ0KSAhPSBudWxsID8gbiA6IE5hTikudG9GaXhlZCgzKX0tJHsoKGkgPSB0ICYmICFyID8gZS5lbmRQVFMgOiAociB8fCBlKS5lbmQpICE9IG51bGwgPyBpIDogTmFOKS50b0ZpeGVkKDMpfV0ke3IgJiYgZS50eXBlID09PSBcIm1haW5cIiA/IFwiSU5ERVBFTkRFTlQ9XCIgKyAoci5pbmRlcGVuZGVudCA/IFwiWUVTXCIgOiBcIk5PXCIpIDogXCJcIn1gO1xuICB9XG4gIHRyZWF0QXNHYXAoZSwgdCkge1xuICAgIHQgJiYgdC5mcmFnbWVudEVycm9yKyssIGUuZ2FwID0gITAsIHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KGUpLCB0aGlzLmZyYWdtZW50VHJhY2tlci5mcmFnQnVmZmVyZWQoZSwgITApO1xuICB9XG4gIHJlc2V0VHJhbnNtdXhlcigpIHtcbiAgICB2YXIgZTtcbiAgICAoZSA9IHRoaXMudHJhbnNtdXhlcikgPT0gbnVsbCB8fCBlLnJlc2V0KCk7XG4gIH1cbiAgcmVjb3ZlcldvcmtlckVycm9yKGUpIHtcbiAgICBlLmV2ZW50ID09PSBcImRlbXV4ZXJXb3JrZXJcIiAmJiAodGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlQWxsRnJhZ21lbnRzKCksIHRoaXMudHJhbnNtdXhlciAmJiAodGhpcy50cmFuc211eGVyLmRlc3Ryb3koKSwgdGhpcy50cmFuc211eGVyID0gbnVsbCksIHRoaXMucmVzZXRTdGFydFdoZW5Ob3RMb2FkZWQoKSwgdGhpcy5yZXNldExvYWRpbmdTdGF0ZSgpKTtcbiAgfVxuICBzZXQgc3RhdGUoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLl9zdGF0ZTtcbiAgICB0ICE9PSBlICYmICh0aGlzLl9zdGF0ZSA9IGUsIHRoaXMubG9nKGAke3R9LT4ke2V9YCkpO1xuICB9XG4gIGdldCBzdGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGU7XG4gIH1cbn1cbmZ1bmN0aW9uIEJoKHMpIHtcbiAgcmV0dXJuICEhcy5pbnRlcnN0aXRpYWxzQ29udHJvbGxlciAmJiBzLmVuYWJsZUludGVyc3RpdGlhbFBsYXliYWNrICE9PSAhMTtcbn1cbmNsYXNzIGlwIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jaHVua3MgPSBbXSwgdGhpcy5kYXRhTGVuZ3RoID0gMDtcbiAgfVxuICBwdXNoKGUpIHtcbiAgICB0aGlzLmNodW5rcy5wdXNoKGUpLCB0aGlzLmRhdGFMZW5ndGggKz0gZS5sZW5ndGg7XG4gIH1cbiAgZmx1c2goKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2h1bmtzOiBlLFxuICAgICAgZGF0YUxlbmd0aDogdFxuICAgIH0gPSB0aGlzO1xuICAgIGxldCByO1xuICAgIGlmIChlLmxlbmd0aClcbiAgICAgIGUubGVuZ3RoID09PSAxID8gciA9IGVbMF0gOiByID0gblQoZSwgdCk7XG4gICAgZWxzZSByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgcmV0dXJuIHRoaXMucmVzZXQoKSwgcjtcbiAgfVxuICByZXNldCgpIHtcbiAgICB0aGlzLmNodW5rcy5sZW5ndGggPSAwLCB0aGlzLmRhdGFMZW5ndGggPSAwO1xuICB9XG59XG5mdW5jdGlvbiBuVChzLCBlKSB7XG4gIGNvbnN0IHQgPSBuZXcgVWludDhBcnJheShlKTtcbiAgbGV0IHIgPSAwO1xuICBmb3IgKGxldCBuID0gMDsgbiA8IHMubGVuZ3RoOyBuKyspIHtcbiAgICBjb25zdCBpID0gc1tuXTtcbiAgICB0LnNldChpLCByKSwgciArPSBpLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gdDtcbn1cbnZhciBtbCA9IHsgZXhwb3J0czoge30gfSwgRmg7XG5mdW5jdGlvbiBpVCgpIHtcbiAgcmV0dXJuIEZoIHx8IChGaCA9IDEsIChmdW5jdGlvbihzKSB7XG4gICAgdmFyIGUgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LCB0ID0gXCJ+XCI7XG4gICAgZnVuY3Rpb24gcigpIHtcbiAgICB9XG4gICAgT2JqZWN0LmNyZWF0ZSAmJiAoci5wcm90b3R5cGUgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgbmV3IHIoKS5fX3Byb3RvX18gfHwgKHQgPSAhMSkpO1xuICAgIGZ1bmN0aW9uIG4obCwgYywgdSkge1xuICAgICAgdGhpcy5mbiA9IGwsIHRoaXMuY29udGV4dCA9IGMsIHRoaXMub25jZSA9IHUgfHwgITE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGkobCwgYywgdSwgZCwgaCkge1xuICAgICAgaWYgKHR5cGVvZiB1ICE9IFwiZnVuY3Rpb25cIilcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlRoZSBsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb25cIik7XG4gICAgICB2YXIgZiA9IG5ldyBuKHUsIGQgfHwgbCwgaCksIHAgPSB0ID8gdCArIGMgOiBjO1xuICAgICAgcmV0dXJuIGwuX2V2ZW50c1twXSA/IGwuX2V2ZW50c1twXS5mbiA/IGwuX2V2ZW50c1twXSA9IFtsLl9ldmVudHNbcF0sIGZdIDogbC5fZXZlbnRzW3BdLnB1c2goZikgOiAobC5fZXZlbnRzW3BdID0gZiwgbC5fZXZlbnRzQ291bnQrKyksIGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG8obCwgYykge1xuICAgICAgLS1sLl9ldmVudHNDb3VudCA9PT0gMCA/IGwuX2V2ZW50cyA9IG5ldyByKCkgOiBkZWxldGUgbC5fZXZlbnRzW2NdO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhKCkge1xuICAgICAgdGhpcy5fZXZlbnRzID0gbmV3IHIoKSwgdGhpcy5fZXZlbnRzQ291bnQgPSAwO1xuICAgIH1cbiAgICBhLnByb3RvdHlwZS5ldmVudE5hbWVzID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgYyA9IFtdLCB1LCBkO1xuICAgICAgaWYgKHRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSByZXR1cm4gYztcbiAgICAgIGZvciAoZCBpbiB1ID0gdGhpcy5fZXZlbnRzKVxuICAgICAgICBlLmNhbGwodSwgZCkgJiYgYy5wdXNoKHQgPyBkLnNsaWNlKDEpIDogZCk7XG4gICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA/IGMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModSkpIDogYztcbiAgICB9LCBhLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbihjKSB7XG4gICAgICB2YXIgdSA9IHQgPyB0ICsgYyA6IGMsIGQgPSB0aGlzLl9ldmVudHNbdV07XG4gICAgICBpZiAoIWQpIHJldHVybiBbXTtcbiAgICAgIGlmIChkLmZuKSByZXR1cm4gW2QuZm5dO1xuICAgICAgZm9yICh2YXIgaCA9IDAsIGYgPSBkLmxlbmd0aCwgcCA9IG5ldyBBcnJheShmKTsgaCA8IGY7IGgrKylcbiAgICAgICAgcFtoXSA9IGRbaF0uZm47XG4gICAgICByZXR1cm4gcDtcbiAgICB9LCBhLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oYykge1xuICAgICAgdmFyIHUgPSB0ID8gdCArIGMgOiBjLCBkID0gdGhpcy5fZXZlbnRzW3VdO1xuICAgICAgcmV0dXJuIGQgPyBkLmZuID8gMSA6IGQubGVuZ3RoIDogMDtcbiAgICB9LCBhLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24oYywgdSwgZCwgaCwgZiwgcCkge1xuICAgICAgdmFyIHkgPSB0ID8gdCArIGMgOiBjO1xuICAgICAgaWYgKCF0aGlzLl9ldmVudHNbeV0pIHJldHVybiAhMTtcbiAgICAgIHZhciBFID0gdGhpcy5fZXZlbnRzW3ldLCBiID0gYXJndW1lbnRzLmxlbmd0aCwgUiwgQTtcbiAgICAgIGlmIChFLmZuKSB7XG4gICAgICAgIHN3aXRjaCAoRS5vbmNlICYmIHRoaXMucmVtb3ZlTGlzdGVuZXIoYywgRS5mbiwgdm9pZCAwLCAhMCksIGIpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gRS5mbi5jYWxsKEUuY29udGV4dCksICEwO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBFLmZuLmNhbGwoRS5jb250ZXh0LCB1KSwgITA7XG4gICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgcmV0dXJuIEUuZm4uY2FsbChFLmNvbnRleHQsIHUsIGQpLCAhMDtcbiAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICByZXR1cm4gRS5mbi5jYWxsKEUuY29udGV4dCwgdSwgZCwgaCksICEwO1xuICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgIHJldHVybiBFLmZuLmNhbGwoRS5jb250ZXh0LCB1LCBkLCBoLCBmKSwgITA7XG4gICAgICAgICAgY2FzZSA2OlxuICAgICAgICAgICAgcmV0dXJuIEUuZm4uY2FsbChFLmNvbnRleHQsIHUsIGQsIGgsIGYsIHApLCAhMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKEEgPSAxLCBSID0gbmV3IEFycmF5KGIgLSAxKTsgQSA8IGI7IEErKylcbiAgICAgICAgICBSW0EgLSAxXSA9IGFyZ3VtZW50c1tBXTtcbiAgICAgICAgRS5mbi5hcHBseShFLmNvbnRleHQsIFIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIEYgPSBFLmxlbmd0aCwgTTtcbiAgICAgICAgZm9yIChBID0gMDsgQSA8IEY7IEErKylcbiAgICAgICAgICBzd2l0Y2ggKEVbQV0ub25jZSAmJiB0aGlzLnJlbW92ZUxpc3RlbmVyKGMsIEVbQV0uZm4sIHZvaWQgMCwgITApLCBiKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIEVbQV0uZm4uY2FsbChFW0FdLmNvbnRleHQpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgRVtBXS5mbi5jYWxsKEVbQV0uY29udGV4dCwgdSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICBFW0FdLmZuLmNhbGwoRVtBXS5jb250ZXh0LCB1LCBkKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgIEVbQV0uZm4uY2FsbChFW0FdLmNvbnRleHQsIHUsIGQsIGgpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGlmICghUikgZm9yIChNID0gMSwgUiA9IG5ldyBBcnJheShiIC0gMSk7IE0gPCBiOyBNKyspXG4gICAgICAgICAgICAgICAgUltNIC0gMV0gPSBhcmd1bWVudHNbTV07XG4gICAgICAgICAgICAgIEVbQV0uZm4uYXBwbHkoRVtBXS5jb250ZXh0LCBSKTtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gITA7XG4gICAgfSwgYS5wcm90b3R5cGUub24gPSBmdW5jdGlvbihjLCB1LCBkKSB7XG4gICAgICByZXR1cm4gaSh0aGlzLCBjLCB1LCBkLCAhMSk7XG4gICAgfSwgYS5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKGMsIHUsIGQpIHtcbiAgICAgIHJldHVybiBpKHRoaXMsIGMsIHUsIGQsICEwKTtcbiAgICB9LCBhLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lciA9IGZ1bmN0aW9uKGMsIHUsIGQsIGgpIHtcbiAgICAgIHZhciBmID0gdCA/IHQgKyBjIDogYztcbiAgICAgIGlmICghdGhpcy5fZXZlbnRzW2ZdKSByZXR1cm4gdGhpcztcbiAgICAgIGlmICghdSlcbiAgICAgICAgcmV0dXJuIG8odGhpcywgZiksIHRoaXM7XG4gICAgICB2YXIgcCA9IHRoaXMuX2V2ZW50c1tmXTtcbiAgICAgIGlmIChwLmZuKVxuICAgICAgICBwLmZuID09PSB1ICYmICghaCB8fCBwLm9uY2UpICYmICghZCB8fCBwLmNvbnRleHQgPT09IGQpICYmIG8odGhpcywgZik7XG4gICAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgeSA9IDAsIEUgPSBbXSwgYiA9IHAubGVuZ3RoOyB5IDwgYjsgeSsrKVxuICAgICAgICAgIChwW3ldLmZuICE9PSB1IHx8IGggJiYgIXBbeV0ub25jZSB8fCBkICYmIHBbeV0uY29udGV4dCAhPT0gZCkgJiYgRS5wdXNoKHBbeV0pO1xuICAgICAgICBFLmxlbmd0aCA/IHRoaXMuX2V2ZW50c1tmXSA9IEUubGVuZ3RoID09PSAxID8gRVswXSA6IEUgOiBvKHRoaXMsIGYpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSwgYS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzID0gZnVuY3Rpb24oYykge1xuICAgICAgdmFyIHU7XG4gICAgICByZXR1cm4gYyA/ICh1ID0gdCA/IHQgKyBjIDogYywgdGhpcy5fZXZlbnRzW3VdICYmIG8odGhpcywgdSkpIDogKHRoaXMuX2V2ZW50cyA9IG5ldyByKCksIHRoaXMuX2V2ZW50c0NvdW50ID0gMCksIHRoaXM7XG4gICAgfSwgYS5wcm90b3R5cGUub2ZmID0gYS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIsIGEucHJvdG90eXBlLmFkZExpc3RlbmVyID0gYS5wcm90b3R5cGUub24sIGEucHJlZml4ZWQgPSB0LCBhLkV2ZW50RW1pdHRlciA9IGEsIHMuZXhwb3J0cyA9IGE7XG4gIH0pKG1sKSksIG1sLmV4cG9ydHM7XG59XG52YXIgb1QgPSBpVCgpLCB3dSA9IC8qIEBfX1BVUkVfXyAqLyBrUyhvVCk7XG5jb25zdCB2aSA9IFwiMS42LjEyXCIsIE5uID0ge307XG5mdW5jdGlvbiBhVCgpIHtcbiAgcmV0dXJuIHR5cGVvZiBfX0hMU19XT1JLRVJfQlVORExFX18gPT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gbFQoKSB7XG4gIGNvbnN0IHMgPSBOblt2aV07XG4gIGlmIChzKVxuICAgIHJldHVybiBzLmNsaWVudENvdW50KyssIHM7XG4gIGNvbnN0IGUgPSBuZXcgc2VsZi5CbG9iKFtgdmFyIGV4cG9ydHM9e307dmFyIG1vZHVsZT17ZXhwb3J0czpleHBvcnRzfTtmdW5jdGlvbiBkZWZpbmUoZil7ZigpfTtkZWZpbmUuYW1kPXRydWU7KCR7X19ITFNfV09SS0VSX0JVTkRMRV9fLnRvU3RyaW5nKCl9KSh0cnVlKTtgXSwge1xuICAgIHR5cGU6IFwidGV4dC9qYXZhc2NyaXB0XCJcbiAgfSksIHQgPSBzZWxmLlVSTC5jcmVhdGVPYmplY3RVUkwoZSksIG4gPSB7XG4gICAgd29ya2VyOiBuZXcgc2VsZi5Xb3JrZXIodCksXG4gICAgb2JqZWN0VVJMOiB0LFxuICAgIGNsaWVudENvdW50OiAxXG4gIH07XG4gIHJldHVybiBOblt2aV0gPSBuLCBuO1xufVxuZnVuY3Rpb24gY1Qocykge1xuICBjb25zdCBlID0gTm5bc107XG4gIGlmIChlKVxuICAgIHJldHVybiBlLmNsaWVudENvdW50KyssIGU7XG4gIGNvbnN0IHQgPSBuZXcgc2VsZi5VUkwocywgc2VsZi5sb2NhdGlvbi5ocmVmKS5ocmVmLCBuID0ge1xuICAgIHdvcmtlcjogbmV3IHNlbGYuV29ya2VyKHQpLFxuICAgIHNjcmlwdFVSTDogdCxcbiAgICBjbGllbnRDb3VudDogMVxuICB9O1xuICByZXR1cm4gTm5bc10gPSBuLCBuO1xufVxuZnVuY3Rpb24gdVQocykge1xuICBjb25zdCBlID0gTm5bcyB8fCB2aV07XG4gIGlmIChlICYmIGUuY2xpZW50Q291bnQtLSA9PT0gMSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHdvcmtlcjogcixcbiAgICAgIG9iamVjdFVSTDogblxuICAgIH0gPSBlO1xuICAgIGRlbGV0ZSBObltzIHx8IHZpXSwgbiAmJiBzZWxmLlVSTC5yZXZva2VPYmplY3RVUkwobiksIHIudGVybWluYXRlKCk7XG4gIH1cbn1cbmZ1bmN0aW9uIG9wKHMsIGUpIHtcbiAgcmV0dXJuIGUgKyAxMCA8PSBzLmxlbmd0aCAmJiBzW2VdID09PSA1MSAmJiBzW2UgKyAxXSA9PT0gNjggJiYgc1tlICsgMl0gPT09IDczICYmIHNbZSArIDNdIDwgMjU1ICYmIHNbZSArIDRdIDwgMjU1ICYmIHNbZSArIDZdIDwgMTI4ICYmIHNbZSArIDddIDwgMTI4ICYmIHNbZSArIDhdIDwgMTI4ICYmIHNbZSArIDldIDwgMTI4O1xufVxuZnVuY3Rpb24gQXUocywgZSkge1xuICByZXR1cm4gZSArIDEwIDw9IHMubGVuZ3RoICYmIHNbZV0gPT09IDczICYmIHNbZSArIDFdID09PSA2OCAmJiBzW2UgKyAyXSA9PT0gNTEgJiYgc1tlICsgM10gPCAyNTUgJiYgc1tlICsgNF0gPCAyNTUgJiYgc1tlICsgNl0gPCAxMjggJiYgc1tlICsgN10gPCAxMjggJiYgc1tlICsgOF0gPCAxMjggJiYgc1tlICsgOV0gPCAxMjg7XG59XG5mdW5jdGlvbiB2YShzLCBlKSB7XG4gIGxldCB0ID0gMDtcbiAgcmV0dXJuIHQgPSAoc1tlXSAmIDEyNykgPDwgMjEsIHQgfD0gKHNbZSArIDFdICYgMTI3KSA8PCAxNCwgdCB8PSAoc1tlICsgMl0gJiAxMjcpIDw8IDcsIHQgfD0gc1tlICsgM10gJiAxMjcsIHQ7XG59XG5mdW5jdGlvbiBFaShzLCBlKSB7XG4gIGNvbnN0IHQgPSBlO1xuICBsZXQgciA9IDA7XG4gIGZvciAoOyBBdShzLCBlKTsgKSB7XG4gICAgciArPSAxMDtcbiAgICBjb25zdCBuID0gdmEocywgZSArIDYpO1xuICAgIHIgKz0gbiwgb3AocywgZSArIDEwKSAmJiAociArPSAxMCksIGUgKz0gcjtcbiAgfVxuICBpZiAociA+IDApXG4gICAgcmV0dXJuIHMuc3ViYXJyYXkodCwgdCArIHIpO1xufVxuZnVuY3Rpb24gZFQocywgZSwgdCwgcikge1xuICBjb25zdCBuID0gWzk2ZTMsIDg4MjAwLCA2NGUzLCA0OGUzLCA0NDEwMCwgMzJlMywgMjRlMywgMjIwNTAsIDE2ZTMsIDEyZTMsIDExMDI1LCA4ZTMsIDczNTBdLCBpID0gZVt0ICsgMl0sIG8gPSBpID4+IDIgJiAxNTtcbiAgaWYgKG8gPiAxMikge1xuICAgIGNvbnN0IGYgPSBuZXcgRXJyb3IoYGludmFsaWQgQURUUyBzYW1wbGluZyBpbmRleDoke299YCk7XG4gICAgcy5lbWl0KEkuRVJST1IsIEkuRVJST1IsIHtcbiAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgZGV0YWlsczogSi5GUkFHX1BBUlNJTkdfRVJST1IsXG4gICAgICBmYXRhbDogITAsXG4gICAgICBlcnJvcjogZixcbiAgICAgIHJlYXNvbjogZi5tZXNzYWdlXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGEgPSAoaSA+PiA2ICYgMykgKyAxLCBsID0gZVt0ICsgM10gPj4gNiAmIDMgfCAoaSAmIDEpIDw8IDIsIGMgPSBcIm1wNGEuNDAuXCIgKyBhLCB1ID0gbltvXTtcbiAgbGV0IGQgPSBvO1xuICAoYSA9PT0gNSB8fCBhID09PSAyOSkgJiYgKGQgLT0gMyk7XG4gIGNvbnN0IGggPSBbYSA8PCAzIHwgKGQgJiAxNCkgPj4gMSwgKGQgJiAxKSA8PCA3IHwgbCA8PCAzXTtcbiAgcmV0dXJuIHJ0LmxvZyhgbWFuaWZlc3QgY29kZWM6JHtyfSwgcGFyc2VkIGNvZGVjOiR7Y30sIGNoYW5uZWxzOiR7bH0sIHJhdGU6JHt1fSAoQURUUyBvYmplY3QgdHlwZToke2F9IHNhbXBsaW5nIGluZGV4OiR7b30pYCksIHtcbiAgICBjb25maWc6IGgsXG4gICAgc2FtcGxlcmF0ZTogdSxcbiAgICBjaGFubmVsQ291bnQ6IGwsXG4gICAgY29kZWM6IGMsXG4gICAgcGFyc2VkQ29kZWM6IGMsXG4gICAgbWFuaWZlc3RDb2RlYzogclxuICB9O1xufVxuZnVuY3Rpb24gYXAocywgZSkge1xuICByZXR1cm4gc1tlXSA9PT0gMjU1ICYmIChzW2UgKyAxXSAmIDI0NikgPT09IDI0MDtcbn1cbmZ1bmN0aW9uIGxwKHMsIGUpIHtcbiAgcmV0dXJuIHNbZSArIDFdICYgMSA/IDcgOiA5O1xufVxuZnVuY3Rpb24gSXUocywgZSkge1xuICByZXR1cm4gKHNbZSArIDNdICYgMykgPDwgMTEgfCBzW2UgKyA0XSA8PCAzIHwgKHNbZSArIDVdICYgMjI0KSA+Pj4gNTtcbn1cbmZ1bmN0aW9uIGhUKHMsIGUpIHtcbiAgcmV0dXJuIGUgKyA1IDwgcy5sZW5ndGg7XG59XG5mdW5jdGlvbiBuYShzLCBlKSB7XG4gIHJldHVybiBlICsgMSA8IHMubGVuZ3RoICYmIGFwKHMsIGUpO1xufVxuZnVuY3Rpb24gZlQocywgZSkge1xuICByZXR1cm4gaFQocywgZSkgJiYgYXAocywgZSkgJiYgSXUocywgZSkgPD0gcy5sZW5ndGggLSBlO1xufVxuZnVuY3Rpb24gZ1QocywgZSkge1xuICBpZiAobmEocywgZSkpIHtcbiAgICBjb25zdCB0ID0gbHAocywgZSk7XG4gICAgaWYgKGUgKyB0ID49IHMubGVuZ3RoKVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IHIgPSBJdShzLCBlKTtcbiAgICBpZiAociA8PSB0KVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IG4gPSBlICsgcjtcbiAgICByZXR1cm4gbiA9PT0gcy5sZW5ndGggfHwgbmEocywgbik7XG4gIH1cbiAgcmV0dXJuICExO1xufVxuZnVuY3Rpb24gY3AocywgZSwgdCwgciwgbikge1xuICBpZiAoIXMuc2FtcGxlcmF0ZSkge1xuICAgIGNvbnN0IGkgPSBkVChlLCB0LCByLCBuKTtcbiAgICBpZiAoIWkpXG4gICAgICByZXR1cm47XG4gICAgbnQocywgaSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHVwKHMpIHtcbiAgcmV0dXJuIDEwMjQgKiA5ZTQgLyBzO1xufVxuZnVuY3Rpb24gcFQocywgZSkge1xuICBjb25zdCB0ID0gbHAocywgZSk7XG4gIGlmIChlICsgdCA8PSBzLmxlbmd0aCkge1xuICAgIGNvbnN0IHIgPSBJdShzLCBlKSAtIHQ7XG4gICAgaWYgKHIgPiAwKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaGVhZGVyTGVuZ3RoOiB0LFxuICAgICAgICBmcmFtZUxlbmd0aDogclxuICAgICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gZHAocywgZSwgdCwgciwgbikge1xuICBjb25zdCBpID0gdXAocy5zYW1wbGVyYXRlKSwgbyA9IHIgKyBuICogaSwgYSA9IHBUKGUsIHQpO1xuICBsZXQgbDtcbiAgaWYgKGEpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcmFtZUxlbmd0aDogZCxcbiAgICAgIGhlYWRlckxlbmd0aDogaFxuICAgIH0gPSBhLCBmID0gaCArIGQsIHAgPSBNYXRoLm1heCgwLCB0ICsgZiAtIGUubGVuZ3RoKTtcbiAgICBwID8gKGwgPSBuZXcgVWludDhBcnJheShmIC0gaCksIGwuc2V0KGUuc3ViYXJyYXkodCArIGgsIGUubGVuZ3RoKSwgMCkpIDogbCA9IGUuc3ViYXJyYXkodCArIGgsIHQgKyBmKTtcbiAgICBjb25zdCB5ID0ge1xuICAgICAgdW5pdDogbCxcbiAgICAgIHB0czogb1xuICAgIH07XG4gICAgcmV0dXJuIHAgfHwgcy5zYW1wbGVzLnB1c2goeSksIHtcbiAgICAgIHNhbXBsZTogeSxcbiAgICAgIGxlbmd0aDogZixcbiAgICAgIG1pc3Npbmc6IHBcbiAgICB9O1xuICB9XG4gIGNvbnN0IGMgPSBlLmxlbmd0aCAtIHQ7XG4gIHJldHVybiBsID0gbmV3IFVpbnQ4QXJyYXkoYyksIGwuc2V0KGUuc3ViYXJyYXkodCwgZS5sZW5ndGgpLCAwKSwge1xuICAgIHNhbXBsZToge1xuICAgICAgdW5pdDogbCxcbiAgICAgIHB0czogb1xuICAgIH0sXG4gICAgbGVuZ3RoOiBjLFxuICAgIG1pc3Npbmc6IC0xXG4gIH07XG59XG5mdW5jdGlvbiBtVChzLCBlKSB7XG4gIHJldHVybiBBdShzLCBlKSAmJiB2YShzLCBlICsgNikgKyAxMCA8PSBzLmxlbmd0aCAtIGU7XG59XG5mdW5jdGlvbiB5VChzKSB7XG4gIHJldHVybiBzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBzIDogcy5ieXRlT2Zmc2V0ID09IDAgJiYgcy5ieXRlTGVuZ3RoID09IHMuYnVmZmVyLmJ5dGVMZW5ndGggPyBzLmJ1ZmZlciA6IG5ldyBVaW50OEFycmF5KHMpLmJ1ZmZlcjtcbn1cbmZ1bmN0aW9uIHlsKHMsIGUgPSAwLCB0ID0gMSAvIDApIHtcbiAgcmV0dXJuIHZUKHMsIGUsIHQsIFVpbnQ4QXJyYXkpO1xufVxuZnVuY3Rpb24gdlQocywgZSwgdCwgcikge1xuICBjb25zdCBuID0gRVQocyk7XG4gIGxldCBpID0gMTtcbiAgXCJCWVRFU19QRVJfRUxFTUVOVFwiIGluIHIgJiYgKGkgPSByLkJZVEVTX1BFUl9FTEVNRU5UKTtcbiAgY29uc3QgbyA9IHhUKHMpID8gcy5ieXRlT2Zmc2V0IDogMCwgYSA9IChvICsgcy5ieXRlTGVuZ3RoKSAvIGksIGwgPSAobyArIGUpIC8gaSwgYyA9IE1hdGguZmxvb3IoTWF0aC5tYXgoMCwgTWF0aC5taW4obCwgYSkpKSwgdSA9IE1hdGguZmxvb3IoTWF0aC5taW4oYyArIE1hdGgubWF4KHQsIDApLCBhKSk7XG4gIHJldHVybiBuZXcgcihuLCBjLCB1IC0gYyk7XG59XG5mdW5jdGlvbiBFVChzKSB7XG4gIHJldHVybiBzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgPyBzIDogcy5idWZmZXI7XG59XG5mdW5jdGlvbiB4VChzKSB7XG4gIHJldHVybiBzICYmIHMuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIgJiYgcy5ieXRlTGVuZ3RoICE9PSB2b2lkIDAgJiYgcy5ieXRlT2Zmc2V0ICE9PSB2b2lkIDA7XG59XG5mdW5jdGlvbiBTVChzKSB7XG4gIGNvbnN0IGUgPSB7XG4gICAga2V5OiBzLnR5cGUsXG4gICAgZGVzY3JpcHRpb246IFwiXCIsXG4gICAgZGF0YTogXCJcIixcbiAgICBtaW1lVHlwZTogbnVsbCxcbiAgICBwaWN0dXJlVHlwZTogbnVsbFxuICB9LCB0ID0gMztcbiAgaWYgKHMuc2l6ZSA8IDIpXG4gICAgcmV0dXJuO1xuICBpZiAocy5kYXRhWzBdICE9PSB0KSB7XG4gICAgY29uc29sZS5sb2coXCJJZ25vcmUgZnJhbWUgd2l0aCB1bnJlY29nbml6ZWQgY2hhcmFjdGVyIGVuY29kaW5nXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCByID0gcy5kYXRhLnN1YmFycmF5KDEpLmluZGV4T2YoMCk7XG4gIGlmIChyID09PSAtMSlcbiAgICByZXR1cm47XG4gIGNvbnN0IG4gPSBUcih5bChzLmRhdGEsIDEsIHIpKSwgaSA9IHMuZGF0YVsyICsgcl0sIG8gPSBzLmRhdGEuc3ViYXJyYXkoMyArIHIpLmluZGV4T2YoMCk7XG4gIGlmIChvID09PSAtMSlcbiAgICByZXR1cm47XG4gIGNvbnN0IGEgPSBUcih5bChzLmRhdGEsIDMgKyByLCBvKSk7XG4gIGxldCBsO1xuICByZXR1cm4gbiA9PT0gXCItLT5cIiA/IGwgPSBUcih5bChzLmRhdGEsIDQgKyByICsgbykpIDogbCA9IHlUKHMuZGF0YS5zdWJhcnJheSg0ICsgciArIG8pKSwgZS5taW1lVHlwZSA9IG4sIGUucGljdHVyZVR5cGUgPSBpLCBlLmRlc2NyaXB0aW9uID0gYSwgZS5kYXRhID0gbCwgZTtcbn1cbmZ1bmN0aW9uIGJUKHMpIHtcbiAgaWYgKHMuc2l6ZSA8IDIpXG4gICAgcmV0dXJuO1xuICBjb25zdCBlID0gVHIocy5kYXRhLCAhMCksIHQgPSBuZXcgVWludDhBcnJheShzLmRhdGEuc3ViYXJyYXkoZS5sZW5ndGggKyAxKSk7XG4gIHJldHVybiB7XG4gICAga2V5OiBzLnR5cGUsXG4gICAgaW5mbzogZSxcbiAgICBkYXRhOiB0LmJ1ZmZlclxuICB9O1xufVxuZnVuY3Rpb24gVFQocykge1xuICBpZiAocy5zaXplIDwgMilcbiAgICByZXR1cm47XG4gIGlmIChzLnR5cGUgPT09IFwiVFhYWFwiKSB7XG4gICAgbGV0IHQgPSAxO1xuICAgIGNvbnN0IHIgPSBUcihzLmRhdGEuc3ViYXJyYXkodCksICEwKTtcbiAgICB0ICs9IHIubGVuZ3RoICsgMTtcbiAgICBjb25zdCBuID0gVHIocy5kYXRhLnN1YmFycmF5KHQpKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBzLnR5cGUsXG4gICAgICBpbmZvOiByLFxuICAgICAgZGF0YTogblxuICAgIH07XG4gIH1cbiAgY29uc3QgZSA9IFRyKHMuZGF0YS5zdWJhcnJheSgxKSk7XG4gIHJldHVybiB7XG4gICAga2V5OiBzLnR5cGUsXG4gICAgaW5mbzogXCJcIixcbiAgICBkYXRhOiBlXG4gIH07XG59XG5mdW5jdGlvbiB3VChzKSB7XG4gIGlmIChzLnR5cGUgPT09IFwiV1hYWFwiKSB7XG4gICAgaWYgKHMuc2l6ZSA8IDIpXG4gICAgICByZXR1cm47XG4gICAgbGV0IHQgPSAxO1xuICAgIGNvbnN0IHIgPSBUcihzLmRhdGEuc3ViYXJyYXkodCksICEwKTtcbiAgICB0ICs9IHIubGVuZ3RoICsgMTtcbiAgICBjb25zdCBuID0gVHIocy5kYXRhLnN1YmFycmF5KHQpKTtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBzLnR5cGUsXG4gICAgICBpbmZvOiByLFxuICAgICAgZGF0YTogblxuICAgIH07XG4gIH1cbiAgY29uc3QgZSA9IFRyKHMuZGF0YSk7XG4gIHJldHVybiB7XG4gICAga2V5OiBzLnR5cGUsXG4gICAgaW5mbzogXCJcIixcbiAgICBkYXRhOiBlXG4gIH07XG59XG5mdW5jdGlvbiBBVChzKSB7XG4gIHJldHVybiBzLnR5cGUgPT09IFwiUFJJVlwiID8gYlQocykgOiBzLnR5cGVbMF0gPT09IFwiV1wiID8gd1QocykgOiBzLnR5cGUgPT09IFwiQVBJQ1wiID8gU1QocykgOiBUVChzKTtcbn1cbmZ1bmN0aW9uIElUKHMpIHtcbiAgY29uc3QgZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoc1swXSwgc1sxXSwgc1syXSwgc1szXSksIHQgPSB2YShzLCA0KSwgciA9IDEwO1xuICByZXR1cm4ge1xuICAgIHR5cGU6IGUsXG4gICAgc2l6ZTogdCxcbiAgICBkYXRhOiBzLnN1YmFycmF5KHIsIHIgKyB0KVxuICB9O1xufVxuY29uc3QgemkgPSAxMCwgX1QgPSAxMDtcbmZ1bmN0aW9uIGhwKHMpIHtcbiAgbGV0IGUgPSAwO1xuICBjb25zdCB0ID0gW107XG4gIGZvciAoOyBBdShzLCBlKTsgKSB7XG4gICAgY29uc3QgciA9IHZhKHMsIGUgKyA2KTtcbiAgICBzW2UgKyA1XSA+PiA2ICYgMSAmJiAoZSArPSB6aSksIGUgKz0gemk7XG4gICAgY29uc3QgbiA9IGUgKyByO1xuICAgIGZvciAoOyBlICsgX1QgPCBuOyApIHtcbiAgICAgIGNvbnN0IGkgPSBJVChzLnN1YmFycmF5KGUpKSwgbyA9IEFUKGkpO1xuICAgICAgbyAmJiB0LnB1c2gobyksIGUgKz0gaS5zaXplICsgemk7XG4gICAgfVxuICAgIG9wKHMsIGUpICYmIChlICs9IHppKTtcbiAgfVxuICByZXR1cm4gdDtcbn1cbmZ1bmN0aW9uIGZwKHMpIHtcbiAgcmV0dXJuIHMgJiYgcy5rZXkgPT09IFwiUFJJVlwiICYmIHMuaW5mbyA9PT0gXCJjb20uYXBwbGUuc3RyZWFtaW5nLnRyYW5zcG9ydFN0cmVhbVRpbWVzdGFtcFwiO1xufVxuZnVuY3Rpb24gUlQocykge1xuICBpZiAocy5kYXRhLmJ5dGVMZW5ndGggPT09IDgpIHtcbiAgICBjb25zdCBlID0gbmV3IFVpbnQ4QXJyYXkocy5kYXRhKSwgdCA9IGVbM10gJiAxO1xuICAgIGxldCByID0gKGVbNF0gPDwgMjMpICsgKGVbNV0gPDwgMTUpICsgKGVbNl0gPDwgNykgKyBlWzddO1xuICAgIHJldHVybiByIC89IDQ1LCB0ICYmIChyICs9IDQ3NzIxODU4ODRlLTIpLCBNYXRoLnJvdW5kKHIpO1xuICB9XG59XG5mdW5jdGlvbiBfdShzKSB7XG4gIGNvbnN0IGUgPSBocChzKTtcbiAgZm9yIChsZXQgdCA9IDA7IHQgPCBlLmxlbmd0aDsgdCsrKSB7XG4gICAgY29uc3QgciA9IGVbdF07XG4gICAgaWYgKGZwKHIpKVxuICAgICAgcmV0dXJuIFJUKHIpO1xuICB9XG59XG5sZXQgYnIgPSAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHMuYXVkaW9JZDMgPSBcIm9yZy5pZDNcIiwgcy5kYXRlUmFuZ2UgPSBcImNvbS5hcHBsZS5xdWlja3RpbWUuSExTXCIsIHMuZW1zZyA9IFwiaHR0cHM6Ly9hb21lZGlhLm9yZy9lbXNnL0lEM1wiLCBzLm1pc2JrbHYgPSBcInVybjptaXNiOktMVjpiaW46MTkxMC4xXCIsIHM7XG59KSh7fSk7XG5mdW5jdGlvbiBqcihzID0gXCJcIiwgZSA9IDllNCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IHMsXG4gICAgaWQ6IC0xLFxuICAgIHBpZDogLTEsXG4gICAgaW5wdXRUaW1lU2NhbGU6IGUsXG4gICAgc2VxdWVuY2VOdW1iZXI6IC0xLFxuICAgIHNhbXBsZXM6IFtdLFxuICAgIGRyb3BwZWQ6IDBcbiAgfTtcbn1cbmNsYXNzIFJ1IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fYXVkaW9UcmFjayA9IHZvaWQgMCwgdGhpcy5faWQzVHJhY2sgPSB2b2lkIDAsIHRoaXMuZnJhbWVJbmRleCA9IDAsIHRoaXMuY2FjaGVkRGF0YSA9IG51bGwsIHRoaXMuYmFzZVBUUyA9IG51bGwsIHRoaXMuaW5pdFBUUyA9IG51bGwsIHRoaXMubGFzdFBUUyA9IG51bGw7XG4gIH1cbiAgcmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgdGhpcy5faWQzVHJhY2sgPSB7XG4gICAgICB0eXBlOiBcImlkM1wiLFxuICAgICAgaWQ6IDMsXG4gICAgICBwaWQ6IC0xLFxuICAgICAgaW5wdXRUaW1lU2NhbGU6IDllNCxcbiAgICAgIHNlcXVlbmNlTnVtYmVyOiAwLFxuICAgICAgc2FtcGxlczogW10sXG4gICAgICBkcm9wcGVkOiAwXG4gICAgfTtcbiAgfVxuICByZXNldFRpbWVTdGFtcChlKSB7XG4gICAgdGhpcy5pbml0UFRTID0gZSwgdGhpcy5yZXNldENvbnRpZ3VpdHkoKTtcbiAgfVxuICByZXNldENvbnRpZ3VpdHkoKSB7XG4gICAgdGhpcy5iYXNlUFRTID0gbnVsbCwgdGhpcy5sYXN0UFRTID0gbnVsbCwgdGhpcy5mcmFtZUluZGV4ID0gMDtcbiAgfVxuICBjYW5QYXJzZShlLCB0KSB7XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGFwcGVuZEZyYW1lKGUsIHQsIHIpIHtcbiAgfVxuICAvLyBmZWVkIGluY29taW5nIGRhdGEgdG8gdGhlIGZyb250IG9mIHRoZSBwYXJzaW5nIHBpcGVsaW5lXG4gIGRlbXV4KGUsIHQpIHtcbiAgICB0aGlzLmNhY2hlZERhdGEgJiYgKGUgPSBfcih0aGlzLmNhY2hlZERhdGEsIGUpLCB0aGlzLmNhY2hlZERhdGEgPSBudWxsKTtcbiAgICBsZXQgciA9IEVpKGUsIDApLCBuID0gciA/IHIubGVuZ3RoIDogMCwgaTtcbiAgICBjb25zdCBvID0gdGhpcy5fYXVkaW9UcmFjaywgYSA9IHRoaXMuX2lkM1RyYWNrLCBsID0gciA/IF91KHIpIDogdm9pZCAwLCBjID0gZS5sZW5ndGg7XG4gICAgZm9yICgodGhpcy5iYXNlUFRTID09PSBudWxsIHx8IHRoaXMuZnJhbWVJbmRleCA9PT0gMCAmJiB1ZShsKSkgJiYgKHRoaXMuYmFzZVBUUyA9IExUKGwsIHQsIHRoaXMuaW5pdFBUUyksIHRoaXMubGFzdFBUUyA9IHRoaXMuYmFzZVBUUyksIHRoaXMubGFzdFBUUyA9PT0gbnVsbCAmJiAodGhpcy5sYXN0UFRTID0gdGhpcy5iYXNlUFRTKSwgciAmJiByLmxlbmd0aCA+IDAgJiYgYS5zYW1wbGVzLnB1c2goe1xuICAgICAgcHRzOiB0aGlzLmxhc3RQVFMsXG4gICAgICBkdHM6IHRoaXMubGFzdFBUUyxcbiAgICAgIGRhdGE6IHIsXG4gICAgICB0eXBlOiBici5hdWRpb0lkMyxcbiAgICAgIGR1cmF0aW9uOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICB9KTsgbiA8IGM7ICkge1xuICAgICAgaWYgKHRoaXMuY2FuUGFyc2UoZSwgbikpIHtcbiAgICAgICAgY29uc3QgdSA9IHRoaXMuYXBwZW5kRnJhbWUobywgZSwgbik7XG4gICAgICAgIHUgPyAodGhpcy5mcmFtZUluZGV4KyssIHRoaXMubGFzdFBUUyA9IHUuc2FtcGxlLnB0cywgbiArPSB1Lmxlbmd0aCwgaSA9IG4pIDogbiA9IGM7XG4gICAgICB9IGVsc2UgbVQoZSwgbikgPyAociA9IEVpKGUsIG4pLCBhLnNhbXBsZXMucHVzaCh7XG4gICAgICAgIHB0czogdGhpcy5sYXN0UFRTLFxuICAgICAgICBkdHM6IHRoaXMubGFzdFBUUyxcbiAgICAgICAgZGF0YTogcixcbiAgICAgICAgdHlwZTogYnIuYXVkaW9JZDMsXG4gICAgICAgIGR1cmF0aW9uOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFlcbiAgICAgIH0pLCBuICs9IHIubGVuZ3RoLCBpID0gbikgOiBuKys7XG4gICAgICBpZiAobiA9PT0gYyAmJiBpICE9PSBjKSB7XG4gICAgICAgIGNvbnN0IHUgPSBlLnNsaWNlKGkpO1xuICAgICAgICB0aGlzLmNhY2hlZERhdGEgPyB0aGlzLmNhY2hlZERhdGEgPSBfcih0aGlzLmNhY2hlZERhdGEsIHUpIDogdGhpcy5jYWNoZWREYXRhID0gdTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGF1ZGlvVHJhY2s6IG8sXG4gICAgICB2aWRlb1RyYWNrOiBqcigpLFxuICAgICAgaWQzVHJhY2s6IGEsXG4gICAgICB0ZXh0VHJhY2s6IGpyKClcbiAgICB9O1xuICB9XG4gIGRlbXV4U2FtcGxlQWVzKGUsIHQsIHIpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBbJHt0aGlzfV0gVGhpcyBkZW11eGVyIGRvZXMgbm90IHN1cHBvcnQgU2FtcGxlLUFFUyBkZWNyeXB0aW9uYCkpO1xuICB9XG4gIGZsdXNoKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5jYWNoZWREYXRhO1xuICAgIHJldHVybiB0ICYmICh0aGlzLmNhY2hlZERhdGEgPSBudWxsLCB0aGlzLmRlbXV4KHQsIDApKSwge1xuICAgICAgYXVkaW9UcmFjazogdGhpcy5fYXVkaW9UcmFjayxcbiAgICAgIHZpZGVvVHJhY2s6IGpyKCksXG4gICAgICBpZDNUcmFjazogdGhpcy5faWQzVHJhY2ssXG4gICAgICB0ZXh0VHJhY2s6IGpyKClcbiAgICB9O1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5jYWNoZWREYXRhID0gbnVsbCwgdGhpcy5fYXVkaW9UcmFjayA9IHRoaXMuX2lkM1RyYWNrID0gdm9pZCAwO1xuICB9XG59XG5jb25zdCBMVCA9IChzLCBlLCB0KSA9PiB7XG4gIGlmICh1ZShzKSlcbiAgICByZXR1cm4gcyAqIDkwO1xuICBjb25zdCByID0gdCA/IHQuYmFzZVRpbWUgKiA5ZTQgLyB0LnRpbWVzY2FsZSA6IDA7XG4gIHJldHVybiBlICogOWU0ICsgcjtcbn07XG5sZXQgWWkgPSBudWxsO1xuY29uc3QgQ1QgPSBbMzIsIDY0LCA5NiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDI4OCwgMzIwLCAzNTIsIDM4NCwgNDE2LCA0NDgsIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMCwgMzg0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzMiwgNDgsIDU2LCA2NCwgODAsIDk2LCAxMTIsIDEyOCwgMTQ0LCAxNjAsIDE3NiwgMTkyLCAyMjQsIDI1NiwgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwXSwga1QgPSBbNDQxMDAsIDQ4ZTMsIDMyZTMsIDIyMDUwLCAyNGUzLCAxNmUzLCAxMTAyNSwgMTJlMywgOGUzXSwgRFQgPSBbXG4gIC8vIE1QRUcgMi41XG4gIFtcbiAgICAwLFxuICAgIC8vIFJlc2VydmVkXG4gICAgNzIsXG4gICAgLy8gTGF5ZXIzXG4gICAgMTQ0LFxuICAgIC8vIExheWVyMlxuICAgIDEyXG4gICAgLy8gTGF5ZXIxXG4gIF0sXG4gIC8vIFJlc2VydmVkXG4gIFtcbiAgICAwLFxuICAgIC8vIFJlc2VydmVkXG4gICAgMCxcbiAgICAvLyBMYXllcjNcbiAgICAwLFxuICAgIC8vIExheWVyMlxuICAgIDBcbiAgICAvLyBMYXllcjFcbiAgXSxcbiAgLy8gTVBFRyAyXG4gIFtcbiAgICAwLFxuICAgIC8vIFJlc2VydmVkXG4gICAgNzIsXG4gICAgLy8gTGF5ZXIzXG4gICAgMTQ0LFxuICAgIC8vIExheWVyMlxuICAgIDEyXG4gICAgLy8gTGF5ZXIxXG4gIF0sXG4gIC8vIE1QRUcgMVxuICBbXG4gICAgMCxcbiAgICAvLyBSZXNlcnZlZFxuICAgIDE0NCxcbiAgICAvLyBMYXllcjNcbiAgICAxNDQsXG4gICAgLy8gTGF5ZXIyXG4gICAgMTJcbiAgICAvLyBMYXllcjFcbiAgXVxuXSwgUFQgPSBbXG4gIDAsXG4gIC8vIFJlc2VydmVkXG4gIDEsXG4gIC8vIExheWVyM1xuICAxLFxuICAvLyBMYXllcjJcbiAgNFxuICAvLyBMYXllcjFcbl07XG5mdW5jdGlvbiBncChzLCBlLCB0LCByLCBuKSB7XG4gIGlmICh0ICsgMjQgPiBlLmxlbmd0aClcbiAgICByZXR1cm47XG4gIGNvbnN0IGkgPSBwcChlLCB0KTtcbiAgaWYgKGkgJiYgdCArIGkuZnJhbWVMZW5ndGggPD0gZS5sZW5ndGgpIHtcbiAgICBjb25zdCBvID0gaS5zYW1wbGVzUGVyRnJhbWUgKiA5ZTQgLyBpLnNhbXBsZVJhdGUsIGEgPSByICsgbiAqIG8sIGwgPSB7XG4gICAgICB1bml0OiBlLnN1YmFycmF5KHQsIHQgKyBpLmZyYW1lTGVuZ3RoKSxcbiAgICAgIHB0czogYSxcbiAgICAgIGR0czogYVxuICAgIH07XG4gICAgcmV0dXJuIHMuY29uZmlnID0gW10sIHMuY2hhbm5lbENvdW50ID0gaS5jaGFubmVsQ291bnQsIHMuc2FtcGxlcmF0ZSA9IGkuc2FtcGxlUmF0ZSwgcy5zYW1wbGVzLnB1c2gobCksIHtcbiAgICAgIHNhbXBsZTogbCxcbiAgICAgIGxlbmd0aDogaS5mcmFtZUxlbmd0aCxcbiAgICAgIG1pc3Npbmc6IDBcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBwcChzLCBlKSB7XG4gIGNvbnN0IHQgPSBzW2UgKyAxXSA+PiAzICYgMywgciA9IHNbZSArIDFdID4+IDEgJiAzLCBuID0gc1tlICsgMl0gPj4gNCAmIDE1LCBpID0gc1tlICsgMl0gPj4gMiAmIDM7XG4gIGlmICh0ICE9PSAxICYmIG4gIT09IDAgJiYgbiAhPT0gMTUgJiYgaSAhPT0gMykge1xuICAgIGNvbnN0IG8gPSBzW2UgKyAyXSA+PiAxICYgMSwgYSA9IHNbZSArIDNdID4+IDYsIGwgPSB0ID09PSAzID8gMyAtIHIgOiByID09PSAzID8gMyA6IDQsIGMgPSBDVFtsICogMTQgKyBuIC0gMV0gKiAxZTMsIGQgPSBrVFsodCA9PT0gMyA/IDAgOiB0ID09PSAyID8gMSA6IDIpICogMyArIGldLCBoID0gYSA9PT0gMyA/IDEgOiAyLCBmID0gRFRbdF1bcl0sIHAgPSBQVFtyXSwgeSA9IGYgKiA4ICogcCwgRSA9IE1hdGguZmxvb3IoZiAqIGMgLyBkICsgbykgKiBwO1xuICAgIGlmIChZaSA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgQSA9IChuYXZpZ2F0b3IudXNlckFnZW50IHx8IFwiXCIpLm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvaSk7XG4gICAgICBZaSA9IEEgPyBwYXJzZUludChBWzFdKSA6IDA7XG4gICAgfVxuICAgIHJldHVybiAhIVlpICYmIFlpIDw9IDg3ICYmIHIgPT09IDIgJiYgYyA+PSAyMjRlMyAmJiBhID09PSAwICYmIChzW2UgKyAzXSA9IHNbZSArIDNdIHwgMTI4KSwge1xuICAgICAgc2FtcGxlUmF0ZTogZCxcbiAgICAgIGNoYW5uZWxDb3VudDogaCxcbiAgICAgIGZyYW1lTGVuZ3RoOiBFLFxuICAgICAgc2FtcGxlc1BlckZyYW1lOiB5XG4gICAgfTtcbiAgfVxufVxuZnVuY3Rpb24gTHUocywgZSkge1xuICByZXR1cm4gc1tlXSA9PT0gMjU1ICYmIChzW2UgKyAxXSAmIDIyNCkgPT09IDIyNCAmJiAoc1tlICsgMV0gJiA2KSAhPT0gMDtcbn1cbmZ1bmN0aW9uIG1wKHMsIGUpIHtcbiAgcmV0dXJuIGUgKyAxIDwgcy5sZW5ndGggJiYgTHUocywgZSk7XG59XG5mdW5jdGlvbiBNVChzLCBlKSB7XG4gIHJldHVybiBMdShzLCBlKSAmJiA0IDw9IHMubGVuZ3RoIC0gZTtcbn1cbmZ1bmN0aW9uIHlwKHMsIGUpIHtcbiAgaWYgKGUgKyAxIDwgcy5sZW5ndGggJiYgTHUocywgZSkpIHtcbiAgICBjb25zdCByID0gcHAocywgZSk7XG4gICAgbGV0IG4gPSA0O1xuICAgIHIgIT0gbnVsbCAmJiByLmZyYW1lTGVuZ3RoICYmIChuID0gci5mcmFtZUxlbmd0aCk7XG4gICAgY29uc3QgaSA9IGUgKyBuO1xuICAgIHJldHVybiBpID09PSBzLmxlbmd0aCB8fCBtcChzLCBpKTtcbiAgfVxuICByZXR1cm4gITE7XG59XG5jbGFzcyBPVCBleHRlbmRzIFJ1IHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHN1cGVyKCksIHRoaXMub2JzZXJ2ZXIgPSB2b2lkIDAsIHRoaXMuY29uZmlnID0gdm9pZCAwLCB0aGlzLm9ic2VydmVyID0gZSwgdGhpcy5jb25maWcgPSB0O1xuICB9XG4gIHJlc2V0SW5pdFNlZ21lbnQoZSwgdCwgciwgbikge1xuICAgIHN1cGVyLnJlc2V0SW5pdFNlZ21lbnQoZSwgdCwgciwgbiksIHRoaXMuX2F1ZGlvVHJhY2sgPSB7XG4gICAgICBjb250YWluZXI6IFwiYXVkaW8vYWR0c1wiLFxuICAgICAgdHlwZTogXCJhdWRpb1wiLFxuICAgICAgaWQ6IDIsXG4gICAgICBwaWQ6IC0xLFxuICAgICAgc2VxdWVuY2VOdW1iZXI6IDAsXG4gICAgICBzZWdtZW50Q29kZWM6IFwiYWFjXCIsXG4gICAgICBzYW1wbGVzOiBbXSxcbiAgICAgIG1hbmlmZXN0Q29kZWM6IHQsXG4gICAgICBkdXJhdGlvbjogbixcbiAgICAgIGlucHV0VGltZVNjYWxlOiA5ZTQsXG4gICAgICBkcm9wcGVkOiAwXG4gICAgfTtcbiAgfVxuICAvLyBTb3VyY2UgZm9yIHByb2JlIGluZm8gLSBodHRwczovL3dpa2kubXVsdGltZWRpYS5jeC9pbmRleC5waHA/dGl0bGU9QURUU1xuICBzdGF0aWMgcHJvYmUoZSwgdCkge1xuICAgIGlmICghZSlcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCByID0gRWkoZSwgMCk7XG4gICAgbGV0IG4gPSAociA9PSBudWxsID8gdm9pZCAwIDogci5sZW5ndGgpIHx8IDA7XG4gICAgaWYgKHlwKGUsIG4pKVxuICAgICAgcmV0dXJuICExO1xuICAgIGZvciAobGV0IGkgPSBlLmxlbmd0aDsgbiA8IGk7IG4rKylcbiAgICAgIGlmIChnVChlLCBuKSlcbiAgICAgICAgcmV0dXJuIHQubG9nKFwiQURUUyBzeW5jIHdvcmQgZm91bmQgIVwiKSwgITA7XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGNhblBhcnNlKGUsIHQpIHtcbiAgICByZXR1cm4gZlQoZSwgdCk7XG4gIH1cbiAgYXBwZW5kRnJhbWUoZSwgdCwgcikge1xuICAgIGNwKGUsIHRoaXMub2JzZXJ2ZXIsIHQsIHIsIGUubWFuaWZlc3RDb2RlYyk7XG4gICAgY29uc3QgbiA9IGRwKGUsIHQsIHIsIHRoaXMuYmFzZVBUUywgdGhpcy5mcmFtZUluZGV4KTtcbiAgICBpZiAobiAmJiBuLm1pc3NpbmcgPT09IDApXG4gICAgICByZXR1cm4gbjtcbiAgfVxufVxuY29uc3QgdnAgPSAocywgZSkgPT4ge1xuICBsZXQgdCA9IDAsIHIgPSA1O1xuICBlICs9IHI7XG4gIGNvbnN0IG4gPSBuZXcgVWludDMyQXJyYXkoMSksIGkgPSBuZXcgVWludDMyQXJyYXkoMSksIG8gPSBuZXcgVWludDhBcnJheSgxKTtcbiAgZm9yICg7IHIgPiAwOyApIHtcbiAgICBvWzBdID0gc1tlXTtcbiAgICBjb25zdCBhID0gTWF0aC5taW4ociwgOCksIGwgPSA4IC0gYTtcbiAgICBpWzBdID0gNDI3ODE5MDA4MCA+Pj4gMjQgKyBsIDw8IGwsIG5bMF0gPSAob1swXSAmIGlbMF0pID4+IGwsIHQgPSB0ID8gdCA8PCBhIHwgblswXSA6IG5bMF0sIGUgKz0gMSwgciAtPSBhO1xuICB9XG4gIHJldHVybiB0O1xufTtcbmNsYXNzIEJUIGV4dGVuZHMgUnUge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoKSwgdGhpcy5vYnNlcnZlciA9IHZvaWQgMCwgdGhpcy5vYnNlcnZlciA9IGU7XG4gIH1cbiAgcmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgc3VwZXIucmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSwgdGhpcy5fYXVkaW9UcmFjayA9IHtcbiAgICAgIGNvbnRhaW5lcjogXCJhdWRpby9hYy0zXCIsXG4gICAgICB0eXBlOiBcImF1ZGlvXCIsXG4gICAgICBpZDogMixcbiAgICAgIHBpZDogLTEsXG4gICAgICBzZXF1ZW5jZU51bWJlcjogMCxcbiAgICAgIHNlZ21lbnRDb2RlYzogXCJhYzNcIixcbiAgICAgIHNhbXBsZXM6IFtdLFxuICAgICAgbWFuaWZlc3RDb2RlYzogdCxcbiAgICAgIGR1cmF0aW9uOiBuLFxuICAgICAgaW5wdXRUaW1lU2NhbGU6IDllNCxcbiAgICAgIGRyb3BwZWQ6IDBcbiAgICB9O1xuICB9XG4gIGNhblBhcnNlKGUsIHQpIHtcbiAgICByZXR1cm4gdCArIDY0IDwgZS5sZW5ndGg7XG4gIH1cbiAgYXBwZW5kRnJhbWUoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSBFcChlLCB0LCByLCB0aGlzLmJhc2VQVFMsIHRoaXMuZnJhbWVJbmRleCk7XG4gICAgaWYgKG4gIT09IC0xKVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2FtcGxlOiBlLnNhbXBsZXNbZS5zYW1wbGVzLmxlbmd0aCAtIDFdLFxuICAgICAgICBsZW5ndGg6IG4sXG4gICAgICAgIG1pc3Npbmc6IDBcbiAgICAgIH07XG4gIH1cbiAgc3RhdGljIHByb2JlKGUpIHtcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm4gITE7XG4gICAgY29uc3QgdCA9IEVpKGUsIDApO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCByID0gdC5sZW5ndGg7XG4gICAgcmV0dXJuIGVbcl0gPT09IDExICYmIGVbciArIDFdID09PSAxMTkgJiYgX3UodCkgIT09IHZvaWQgMCAmJiAvLyBjaGVjayB0aGUgYnNpZCB0byBjb25maXJtIGFjLTNcbiAgICB2cChlLCByKSA8IDE2O1xuICB9XG59XG5mdW5jdGlvbiBFcChzLCBlLCB0LCByLCBuKSB7XG4gIGlmICh0ICsgOCA+IGUubGVuZ3RoIHx8IGVbdF0gIT09IDExIHx8IGVbdCArIDFdICE9PSAxMTkpXG4gICAgcmV0dXJuIC0xO1xuICBjb25zdCBpID0gZVt0ICsgNF0gPj4gNjtcbiAgaWYgKGkgPj0gMylcbiAgICByZXR1cm4gLTE7XG4gIGNvbnN0IGEgPSBbNDhlMywgNDQxMDAsIDMyZTNdW2ldLCBsID0gZVt0ICsgNF0gJiA2MywgdSA9IFs2NCwgNjksIDk2LCA2NCwgNzAsIDk2LCA4MCwgODcsIDEyMCwgODAsIDg4LCAxMjAsIDk2LCAxMDQsIDE0NCwgOTYsIDEwNSwgMTQ0LCAxMTIsIDEyMSwgMTY4LCAxMTIsIDEyMiwgMTY4LCAxMjgsIDEzOSwgMTkyLCAxMjgsIDE0MCwgMTkyLCAxNjAsIDE3NCwgMjQwLCAxNjAsIDE3NSwgMjQwLCAxOTIsIDIwOCwgMjg4LCAxOTIsIDIwOSwgMjg4LCAyMjQsIDI0MywgMzM2LCAyMjQsIDI0NCwgMzM2LCAyNTYsIDI3OCwgMzg0LCAyNTYsIDI3OSwgMzg0LCAzMjAsIDM0OCwgNDgwLCAzMjAsIDM0OSwgNDgwLCAzODQsIDQxNywgNTc2LCAzODQsIDQxOCwgNTc2LCA0NDgsIDQ4NywgNjcyLCA0NDgsIDQ4OCwgNjcyLCA1MTIsIDU1NywgNzY4LCA1MTIsIDU1OCwgNzY4LCA2NDAsIDY5NiwgOTYwLCA2NDAsIDY5NywgOTYwLCA3NjgsIDgzNSwgMTE1MiwgNzY4LCA4MzYsIDExNTIsIDg5NiwgOTc1LCAxMzQ0LCA4OTYsIDk3NiwgMTM0NCwgMTAyNCwgMTExNCwgMTUzNiwgMTAyNCwgMTExNSwgMTUzNiwgMTE1MiwgMTI1MywgMTcyOCwgMTE1MiwgMTI1NCwgMTcyOCwgMTI4MCwgMTM5MywgMTkyMCwgMTI4MCwgMTM5NCwgMTkyMF1bbCAqIDMgKyBpXSAqIDI7XG4gIGlmICh0ICsgdSA+IGUubGVuZ3RoKVxuICAgIHJldHVybiAtMTtcbiAgY29uc3QgZCA9IGVbdCArIDZdID4+IDU7XG4gIGxldCBoID0gMDtcbiAgZCA9PT0gMiA/IGggKz0gMiA6IChkICYgMSAmJiBkICE9PSAxICYmIChoICs9IDIpLCBkICYgNCAmJiAoaCArPSAyKSk7XG4gIGNvbnN0IGYgPSAoZVt0ICsgNl0gPDwgOCB8IGVbdCArIDddKSA+PiAxMiAtIGggJiAxLCB5ID0gWzIsIDEsIDIsIDMsIDMsIDQsIDQsIDVdW2RdICsgZiwgRSA9IGVbdCArIDVdID4+IDMsIGIgPSBlW3QgKyA1XSAmIDcsIFIgPSBuZXcgVWludDhBcnJheShbaSA8PCA2IHwgRSA8PCAxIHwgYiA+PiAyLCAoYiAmIDMpIDw8IDYgfCBkIDw8IDMgfCBmIDw8IDIgfCBsID4+IDQsIGwgPDwgNCAmIDIyNF0pLCBBID0gMTUzNiAvIGEgKiA5ZTQsIEYgPSByICsgbiAqIEEsIE0gPSBlLnN1YmFycmF5KHQsIHQgKyB1KTtcbiAgcmV0dXJuIHMuY29uZmlnID0gUiwgcy5jaGFubmVsQ291bnQgPSB5LCBzLnNhbXBsZXJhdGUgPSBhLCBzLnNhbXBsZXMucHVzaCh7XG4gICAgdW5pdDogTSxcbiAgICBwdHM6IEZcbiAgfSksIHU7XG59XG5jbGFzcyBGVCBleHRlbmRzIFJ1IHtcbiAgcmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgc3VwZXIucmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSwgdGhpcy5fYXVkaW9UcmFjayA9IHtcbiAgICAgIGNvbnRhaW5lcjogXCJhdWRpby9tcGVnXCIsXG4gICAgICB0eXBlOiBcImF1ZGlvXCIsXG4gICAgICBpZDogMixcbiAgICAgIHBpZDogLTEsXG4gICAgICBzZXF1ZW5jZU51bWJlcjogMCxcbiAgICAgIHNlZ21lbnRDb2RlYzogXCJtcDNcIixcbiAgICAgIHNhbXBsZXM6IFtdLFxuICAgICAgbWFuaWZlc3RDb2RlYzogdCxcbiAgICAgIGR1cmF0aW9uOiBuLFxuICAgICAgaW5wdXRUaW1lU2NhbGU6IDllNCxcbiAgICAgIGRyb3BwZWQ6IDBcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBwcm9iZShlKSB7XG4gICAgaWYgKCFlKVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IHQgPSBFaShlLCAwKTtcbiAgICBsZXQgciA9ICh0ID09IG51bGwgPyB2b2lkIDAgOiB0Lmxlbmd0aCkgfHwgMDtcbiAgICBpZiAodCAmJiBlW3JdID09PSAxMSAmJiBlW3IgKyAxXSA9PT0gMTE5ICYmIF91KHQpICE9PSB2b2lkIDAgJiYgLy8gY2hlY2sgdGhlIGJzaWQgdG8gY29uZmlybSBhYy0zIG9yIGVjLTMgKG5vdCBtcDMpXG4gICAgdnAoZSwgcikgPD0gMTYpXG4gICAgICByZXR1cm4gITE7XG4gICAgZm9yIChsZXQgbiA9IGUubGVuZ3RoOyByIDwgbjsgcisrKVxuICAgICAgaWYgKHlwKGUsIHIpKVxuICAgICAgICByZXR1cm4gcnQubG9nKFwiTVBFRyBBdWRpbyBzeW5jIHdvcmQgZm91bmQgIVwiKSwgITA7XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGNhblBhcnNlKGUsIHQpIHtcbiAgICByZXR1cm4gTVQoZSwgdCk7XG4gIH1cbiAgYXBwZW5kRnJhbWUoZSwgdCwgcikge1xuICAgIGlmICh0aGlzLmJhc2VQVFMgIT09IG51bGwpXG4gICAgICByZXR1cm4gZ3AoZSwgdCwgciwgdGhpcy5iYXNlUFRTLCB0aGlzLmZyYW1lSW5kZXgpO1xuICB9XG59XG5jb25zdCBOVCA9IC9cXC9lbXNnWy0vXUlEMy9pO1xuY2xhc3MgVVQge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbCwgdGhpcy50aW1lT2Zmc2V0ID0gMCwgdGhpcy5jb25maWcgPSB2b2lkIDAsIHRoaXMudmlkZW9UcmFjayA9IHZvaWQgMCwgdGhpcy5hdWRpb1RyYWNrID0gdm9pZCAwLCB0aGlzLmlkM1RyYWNrID0gdm9pZCAwLCB0aGlzLnR4dFRyYWNrID0gdm9pZCAwLCB0aGlzLmNvbmZpZyA9IHQ7XG4gIH1cbiAgcmVzZXRUaW1lU3RhbXAoKSB7XG4gIH1cbiAgcmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgY29uc3QgaSA9IHRoaXMudmlkZW9UcmFjayA9IGpyKFwidmlkZW9cIiwgMSksIG8gPSB0aGlzLmF1ZGlvVHJhY2sgPSBqcihcImF1ZGlvXCIsIDEpLCBhID0gdGhpcy50eHRUcmFjayA9IGpyKFwidGV4dFwiLCAxKTtcbiAgICBpZiAodGhpcy5pZDNUcmFjayA9IGpyKFwiaWQzXCIsIDEpLCB0aGlzLnRpbWVPZmZzZXQgPSAwLCAhKGUgIT0gbnVsbCAmJiBlLmJ5dGVMZW5ndGgpKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGwgPSBEZyhlKTtcbiAgICBpZiAobC52aWRlbykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpZDogYyxcbiAgICAgICAgdGltZXNjYWxlOiB1LFxuICAgICAgICBjb2RlYzogZCxcbiAgICAgICAgc3VwcGxlbWVudGFsOiBoXG4gICAgICB9ID0gbC52aWRlbztcbiAgICAgIGkuaWQgPSBjLCBpLnRpbWVzY2FsZSA9IGEudGltZXNjYWxlID0gdSwgaS5jb2RlYyA9IGQsIGkuc3VwcGxlbWVudGFsID0gaDtcbiAgICB9XG4gICAgaWYgKGwuYXVkaW8pIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaWQ6IGMsXG4gICAgICAgIHRpbWVzY2FsZTogdSxcbiAgICAgICAgY29kZWM6IGRcbiAgICAgIH0gPSBsLmF1ZGlvO1xuICAgICAgby5pZCA9IGMsIG8udGltZXNjYWxlID0gdSwgby5jb2RlYyA9IGQ7XG4gICAgfVxuICAgIGEuaWQgPSBMZy50ZXh0LCBpLnNhbXBsZUR1cmF0aW9uID0gMCwgaS5kdXJhdGlvbiA9IG8uZHVyYXRpb24gPSBuO1xuICB9XG4gIHJlc2V0Q29udGlndWl0eSgpIHtcbiAgICB0aGlzLnJlbWFpbmRlckRhdGEgPSBudWxsO1xuICB9XG4gIHN0YXRpYyBwcm9iZShlKSB7XG4gICAgcmV0dXJuIEJTKGUpO1xuICB9XG4gIGRlbXV4KGUsIHQpIHtcbiAgICB0aGlzLnRpbWVPZmZzZXQgPSB0O1xuICAgIGxldCByID0gZTtcbiAgICBjb25zdCBuID0gdGhpcy52aWRlb1RyYWNrLCBpID0gdGhpcy50eHRUcmFjaztcbiAgICBpZiAodGhpcy5jb25maWcucHJvZ3Jlc3NpdmUpIHtcbiAgICAgIHRoaXMucmVtYWluZGVyRGF0YSAmJiAociA9IF9yKHRoaXMucmVtYWluZGVyRGF0YSwgZSkpO1xuICAgICAgY29uc3QgYSA9IFZTKHIpO1xuICAgICAgdGhpcy5yZW1haW5kZXJEYXRhID0gYS5yZW1haW5kZXIsIG4uc2FtcGxlcyA9IGEudmFsaWQgfHwgbmV3IFVpbnQ4QXJyYXkoKTtcbiAgICB9IGVsc2VcbiAgICAgIG4uc2FtcGxlcyA9IHI7XG4gICAgY29uc3QgbyA9IHRoaXMuZXh0cmFjdElEM1RyYWNrKG4sIHQpO1xuICAgIHJldHVybiBpLnNhbXBsZXMgPSByaCh0LCBuKSwge1xuICAgICAgdmlkZW9UcmFjazogbixcbiAgICAgIGF1ZGlvVHJhY2s6IHRoaXMuYXVkaW9UcmFjayxcbiAgICAgIGlkM1RyYWNrOiBvLFxuICAgICAgdGV4dFRyYWNrOiB0aGlzLnR4dFRyYWNrXG4gICAgfTtcbiAgfVxuICBmbHVzaCgpIHtcbiAgICBjb25zdCBlID0gdGhpcy50aW1lT2Zmc2V0LCB0ID0gdGhpcy52aWRlb1RyYWNrLCByID0gdGhpcy50eHRUcmFjaztcbiAgICB0LnNhbXBsZXMgPSB0aGlzLnJlbWFpbmRlckRhdGEgfHwgbmV3IFVpbnQ4QXJyYXkoKSwgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbDtcbiAgICBjb25zdCBuID0gdGhpcy5leHRyYWN0SUQzVHJhY2sodCwgdGhpcy50aW1lT2Zmc2V0KTtcbiAgICByZXR1cm4gci5zYW1wbGVzID0gcmgoZSwgdCksIHtcbiAgICAgIHZpZGVvVHJhY2s6IHQsXG4gICAgICBhdWRpb1RyYWNrOiBqcigpLFxuICAgICAgaWQzVHJhY2s6IG4sXG4gICAgICB0ZXh0VHJhY2s6IGpyKClcbiAgICB9O1xuICB9XG4gIGV4dHJhY3RJRDNUcmFjayhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaWQzVHJhY2s7XG4gICAgaWYgKGUuc2FtcGxlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG4gPSBHZShlLnNhbXBsZXMsIFtcImVtc2dcIl0pO1xuICAgICAgbiAmJiBuLmZvckVhY2goKGkpID0+IHtcbiAgICAgICAgY29uc3QgbyA9IEtTKGkpO1xuICAgICAgICBpZiAoTlQudGVzdChvLnNjaGVtZUlkVXJpKSkge1xuICAgICAgICAgIGNvbnN0IGEgPSBOaChvLCB0KTtcbiAgICAgICAgICBsZXQgbCA9IG8uZXZlbnREdXJhdGlvbiA9PT0gNDI5NDk2NzI5NSA/IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSA6IG8uZXZlbnREdXJhdGlvbiAvIG8udGltZVNjYWxlO1xuICAgICAgICAgIGwgPD0gMWUtMyAmJiAobCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgICAgICAgY29uc3QgYyA9IG8ucGF5bG9hZDtcbiAgICAgICAgICByLnNhbXBsZXMucHVzaCh7XG4gICAgICAgICAgICBkYXRhOiBjLFxuICAgICAgICAgICAgbGVuOiBjLmJ5dGVMZW5ndGgsXG4gICAgICAgICAgICBkdHM6IGEsXG4gICAgICAgICAgICBwdHM6IGEsXG4gICAgICAgICAgICB0eXBlOiBici5lbXNnLFxuICAgICAgICAgICAgZHVyYXRpb246IGxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZy5lbmFibGVFbXNnS0xWTWV0YWRhdGEgJiYgby5zY2hlbWVJZFVyaS5zdGFydHNXaXRoKFwidXJuOm1pc2I6S0xWOmJpbjoxOTEwLjFcIikpIHtcbiAgICAgICAgICBjb25zdCBhID0gTmgobywgdCk7XG4gICAgICAgICAgci5zYW1wbGVzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogby5wYXlsb2FkLFxuICAgICAgICAgICAgbGVuOiBvLnBheWxvYWQuYnl0ZUxlbmd0aCxcbiAgICAgICAgICAgIGR0czogYSxcbiAgICAgICAgICAgIHB0czogYSxcbiAgICAgICAgICAgIHR5cGU6IGJyLm1pc2JrbHYsXG4gICAgICAgICAgICBkdXJhdGlvbjogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICBkZW11eFNhbXBsZUFlcyhlLCB0LCByKSB7XG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIlRoZSBNUDQgZGVtdXhlciBkb2VzIG5vdCBzdXBwb3J0IFNBTVBMRS1BRVMgZGVjcnlwdGlvblwiKSk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbmZpZyA9IG51bGwsIHRoaXMucmVtYWluZGVyRGF0YSA9IG51bGwsIHRoaXMudmlkZW9UcmFjayA9IHRoaXMuYXVkaW9UcmFjayA9IHRoaXMuaWQzVHJhY2sgPSB0aGlzLnR4dFRyYWNrID0gdm9pZCAwO1xuICB9XG59XG5mdW5jdGlvbiBOaChzLCBlKSB7XG4gIHJldHVybiB1ZShzLnByZXNlbnRhdGlvblRpbWUpID8gcy5wcmVzZW50YXRpb25UaW1lIC8gcy50aW1lU2NhbGUgOiBlICsgcy5wcmVzZW50YXRpb25UaW1lRGVsdGEgLyBzLnRpbWVTY2FsZTtcbn1cbmNsYXNzICRUIHtcbiAgY29uc3RydWN0b3IoZSwgdCwgcikge1xuICAgIHRoaXMua2V5RGF0YSA9IHZvaWQgMCwgdGhpcy5kZWNyeXB0ZXIgPSB2b2lkIDAsIHRoaXMua2V5RGF0YSA9IHIsIHRoaXMuZGVjcnlwdGVyID0gbmV3IHZ1KHQsIHtcbiAgICAgIHJlbW92ZVBLQ1M3UGFkZGluZzogITFcbiAgICB9KTtcbiAgfVxuICBkZWNyeXB0QnVmZmVyKGUpIHtcbiAgICByZXR1cm4gdGhpcy5kZWNyeXB0ZXIuZGVjcnlwdChlLCB0aGlzLmtleURhdGEua2V5LmJ1ZmZlciwgdGhpcy5rZXlEYXRhLml2LmJ1ZmZlciwgT3MuY2JjKTtcbiAgfVxuICAvLyBBQUMgLSBlbmNyeXB0IGFsbCBmdWxsIDE2IGJ5dGVzIGJsb2NrcyBzdGFydGluZyBmcm9tIG9mZnNldCAxNlxuICBkZWNyeXB0QWFjU2FtcGxlKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gZVt0XS51bml0O1xuICAgIGlmIChuLmxlbmd0aCA8PSAxNilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gbi5zdWJhcnJheSgxNiwgbi5sZW5ndGggLSBuLmxlbmd0aCAlIDE2KSwgbyA9IGkuYnVmZmVyLnNsaWNlKGkuYnl0ZU9mZnNldCwgaS5ieXRlT2Zmc2V0ICsgaS5sZW5ndGgpO1xuICAgIHRoaXMuZGVjcnlwdEJ1ZmZlcihvKS50aGVuKChhKSA9PiB7XG4gICAgICBjb25zdCBsID0gbmV3IFVpbnQ4QXJyYXkoYSk7XG4gICAgICBuLnNldChsLCAxNiksIHRoaXMuZGVjcnlwdGVyLmlzU3luYygpIHx8IHRoaXMuZGVjcnlwdEFhY1NhbXBsZXMoZSwgdCArIDEsIHIpO1xuICAgIH0pLmNhdGNoKHIpO1xuICB9XG4gIGRlY3J5cHRBYWNTYW1wbGVzKGUsIHQsIHIpIHtcbiAgICBmb3IgKDsgOyB0KyspIHtcbiAgICAgIGlmICh0ID49IGUubGVuZ3RoKSB7XG4gICAgICAgIHIoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCEoZVt0XS51bml0Lmxlbmd0aCA8IDMyKSAmJiAodGhpcy5kZWNyeXB0QWFjU2FtcGxlKGUsIHQsIHIpLCAhdGhpcy5kZWNyeXB0ZXIuaXNTeW5jKCkpKVxuICAgICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIC8vIEFWQyAtIGVuY3J5cHQgb25lIDE2IGJ5dGVzIGJsb2NrIG91dCBvZiB0ZW4sIHN0YXJ0aW5nIGZyb20gb2Zmc2V0IDMyXG4gIGdldEF2Y0VuY3J5cHRlZERhdGEoZSkge1xuICAgIGNvbnN0IHQgPSBNYXRoLmZsb29yKChlLmxlbmd0aCAtIDQ4KSAvIDE2MCkgKiAxNiArIDE2LCByID0gbmV3IEludDhBcnJheSh0KTtcbiAgICBsZXQgbiA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDMyOyBpIDwgZS5sZW5ndGggLSAxNjsgaSArPSAxNjAsIG4gKz0gMTYpXG4gICAgICByLnNldChlLnN1YmFycmF5KGksIGkgKyAxNiksIG4pO1xuICAgIHJldHVybiByO1xuICB9XG4gIGdldEF2Y0RlY3J5cHRlZFVuaXQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBuZXcgVWludDhBcnJheSh0KTtcbiAgICBsZXQgbiA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDMyOyBpIDwgZS5sZW5ndGggLSAxNjsgaSArPSAxNjAsIG4gKz0gMTYpXG4gICAgICBlLnNldChyLnN1YmFycmF5KG4sIG4gKyAxNiksIGkpO1xuICAgIHJldHVybiBlO1xuICB9XG4gIGRlY3J5cHRBdmNTYW1wbGUoZSwgdCwgciwgbiwgaSkge1xuICAgIGNvbnN0IG8gPSBNZyhpLmRhdGEpLCBhID0gdGhpcy5nZXRBdmNFbmNyeXB0ZWREYXRhKG8pO1xuICAgIHRoaXMuZGVjcnlwdEJ1ZmZlcihhLmJ1ZmZlcikudGhlbigobCkgPT4ge1xuICAgICAgaS5kYXRhID0gdGhpcy5nZXRBdmNEZWNyeXB0ZWRVbml0KG8sIGwpLCB0aGlzLmRlY3J5cHRlci5pc1N5bmMoKSB8fCB0aGlzLmRlY3J5cHRBdmNTYW1wbGVzKGUsIHQsIHIgKyAxLCBuKTtcbiAgICB9KS5jYXRjaChuKTtcbiAgfVxuICBkZWNyeXB0QXZjU2FtcGxlcyhlLCB0LCByLCBuKSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBVaW50OEFycmF5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGRlY3J5cHQgc2FtcGxlcyBvZiB0eXBlIFVpbnQ4QXJyYXlcIik7XG4gICAgZm9yICg7IDsgdCsrLCByID0gMCkge1xuICAgICAgaWYgKHQgPj0gZS5sZW5ndGgpIHtcbiAgICAgICAgbigpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpID0gZVt0XS51bml0cztcbiAgICAgIGZvciAoOyAhKHIgPj0gaS5sZW5ndGgpOyByKyspIHtcbiAgICAgICAgY29uc3QgbyA9IGlbcl07XG4gICAgICAgIGlmICghKG8uZGF0YS5sZW5ndGggPD0gNDggfHwgby50eXBlICE9PSAxICYmIG8udHlwZSAhPT0gNSkgJiYgKHRoaXMuZGVjcnlwdEF2Y1NhbXBsZShlLCB0LCByLCBuLCBvKSwgIXRoaXMuZGVjcnlwdGVyLmlzU3luYygpKSlcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jbGFzcyB4cCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuVmlkZW9TYW1wbGUgPSBudWxsO1xuICB9XG4gIGNyZWF0ZVZpZGVvU2FtcGxlKGUsIHQsIHIpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5OiBlLFxuICAgICAgZnJhbWU6ICExLFxuICAgICAgcHRzOiB0LFxuICAgICAgZHRzOiByLFxuICAgICAgdW5pdHM6IFtdLFxuICAgICAgbGVuZ3RoOiAwXG4gICAgfTtcbiAgfVxuICBnZXRMYXN0TmFsVW5pdChlKSB7XG4gICAgdmFyIHQ7XG4gICAgbGV0IHIgPSB0aGlzLlZpZGVvU2FtcGxlLCBuO1xuICAgIGlmICgoIXIgfHwgci51bml0cy5sZW5ndGggPT09IDApICYmIChyID0gZVtlLmxlbmd0aCAtIDFdKSwgKHQgPSByKSAhPSBudWxsICYmIHQudW5pdHMpIHtcbiAgICAgIGNvbnN0IGkgPSByLnVuaXRzO1xuICAgICAgbiA9IGlbaS5sZW5ndGggLSAxXTtcbiAgICB9XG4gICAgcmV0dXJuIG47XG4gIH1cbiAgcHVzaEFjY2Vzc1VuaXQoZSwgdCkge1xuICAgIGlmIChlLnVuaXRzLmxlbmd0aCAmJiBlLmZyYW1lKSB7XG4gICAgICBpZiAoZS5wdHMgPT09IHZvaWQgMCkge1xuICAgICAgICBjb25zdCByID0gdC5zYW1wbGVzLCBuID0gci5sZW5ndGg7XG4gICAgICAgIGlmIChuKSB7XG4gICAgICAgICAgY29uc3QgaSA9IHJbbiAtIDFdO1xuICAgICAgICAgIGUucHRzID0gaS5wdHMsIGUuZHRzID0gaS5kdHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdC5kcm9wcGVkKys7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0LnNhbXBsZXMucHVzaChlKTtcbiAgICB9XG4gIH1cbiAgcGFyc2VOQUx1KGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdC5ieXRlTGVuZ3RoO1xuICAgIGxldCBpID0gZS5uYWx1U3RhdGUgfHwgMDtcbiAgICBjb25zdCBvID0gaSwgYSA9IFtdO1xuICAgIGxldCBsID0gMCwgYywgdSwgZCwgaCA9IC0xLCBmID0gMDtcbiAgICBmb3IgKGkgPT09IC0xICYmIChoID0gMCwgZiA9IHRoaXMuZ2V0TkFMdVR5cGUodCwgMCksIGkgPSAwLCBsID0gMSk7IGwgPCBuOyApIHtcbiAgICAgIGlmIChjID0gdFtsKytdLCAhaSkge1xuICAgICAgICBpID0gYyA/IDAgOiAxO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChpID09PSAxKSB7XG4gICAgICAgIGkgPSBjID8gMCA6IDI7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFjKVxuICAgICAgICBpID0gMztcbiAgICAgIGVsc2UgaWYgKGMgPT09IDEpIHtcbiAgICAgICAgaWYgKHUgPSBsIC0gaSAtIDEsIGggPj0gMCkge1xuICAgICAgICAgIGNvbnN0IHAgPSB7XG4gICAgICAgICAgICBkYXRhOiB0LnN1YmFycmF5KGgsIHUpLFxuICAgICAgICAgICAgdHlwZTogZlxuICAgICAgICAgIH07XG4gICAgICAgICAgYS5wdXNoKHApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHAgPSB0aGlzLmdldExhc3ROYWxVbml0KGUuc2FtcGxlcyk7XG4gICAgICAgICAgcCAmJiAobyAmJiBsIDw9IDQgLSBvICYmIHAuc3RhdGUgJiYgKHAuZGF0YSA9IHAuZGF0YS5zdWJhcnJheSgwLCBwLmRhdGEuYnl0ZUxlbmd0aCAtIG8pKSwgdSA+IDAgJiYgKHAuZGF0YSA9IF9yKHAuZGF0YSwgdC5zdWJhcnJheSgwLCB1KSksIHAuc3RhdGUgPSAwKSk7XG4gICAgICAgIH1cbiAgICAgICAgbCA8IG4gPyAoZCA9IHRoaXMuZ2V0TkFMdVR5cGUodCwgbCksIGggPSBsLCBmID0gZCwgaSA9IDApIDogaSA9IC0xO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGkgPSAwO1xuICAgIH1cbiAgICBpZiAoaCA+PSAwICYmIGkgPj0gMCkge1xuICAgICAgY29uc3QgcCA9IHtcbiAgICAgICAgZGF0YTogdC5zdWJhcnJheShoLCBuKSxcbiAgICAgICAgdHlwZTogZixcbiAgICAgICAgc3RhdGU6IGlcbiAgICAgIH07XG4gICAgICBhLnB1c2gocCk7XG4gICAgfVxuICAgIGlmIChhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgcCA9IHRoaXMuZ2V0TGFzdE5hbFVuaXQoZS5zYW1wbGVzKTtcbiAgICAgIHAgJiYgKHAuZGF0YSA9IF9yKHAuZGF0YSwgdCkpO1xuICAgIH1cbiAgICByZXR1cm4gZS5uYWx1U3RhdGUgPSBpLCBhO1xuICB9XG59XG5jbGFzcyBabiB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmRhdGEgPSB2b2lkIDAsIHRoaXMuYnl0ZXNBdmFpbGFibGUgPSB2b2lkIDAsIHRoaXMud29yZCA9IHZvaWQgMCwgdGhpcy5iaXRzQXZhaWxhYmxlID0gdm9pZCAwLCB0aGlzLmRhdGEgPSBlLCB0aGlzLmJ5dGVzQXZhaWxhYmxlID0gZS5ieXRlTGVuZ3RoLCB0aGlzLndvcmQgPSAwLCB0aGlzLmJpdHNBdmFpbGFibGUgPSAwO1xuICB9XG4gIC8vICgpOnZvaWRcbiAgbG9hZFdvcmQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuZGF0YSwgdCA9IHRoaXMuYnl0ZXNBdmFpbGFibGUsIHIgPSBlLmJ5dGVMZW5ndGggLSB0LCBuID0gbmV3IFVpbnQ4QXJyYXkoNCksIGkgPSBNYXRoLm1pbig0LCB0KTtcbiAgICBpZiAoaSA9PT0gMClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGJ5dGVzIGF2YWlsYWJsZVwiKTtcbiAgICBuLnNldChlLnN1YmFycmF5KHIsIHIgKyBpKSksIHRoaXMud29yZCA9IG5ldyBEYXRhVmlldyhuLmJ1ZmZlcikuZ2V0VWludDMyKDApLCB0aGlzLmJpdHNBdmFpbGFibGUgPSBpICogOCwgdGhpcy5ieXRlc0F2YWlsYWJsZSAtPSBpO1xuICB9XG4gIC8vIChjb3VudDppbnQpOnZvaWRcbiAgc2tpcEJpdHMoZSkge1xuICAgIGxldCB0O1xuICAgIGUgPSBNYXRoLm1pbihlLCB0aGlzLmJ5dGVzQXZhaWxhYmxlICogOCArIHRoaXMuYml0c0F2YWlsYWJsZSksIHRoaXMuYml0c0F2YWlsYWJsZSA+IGUgPyAodGhpcy53b3JkIDw8PSBlLCB0aGlzLmJpdHNBdmFpbGFibGUgLT0gZSkgOiAoZSAtPSB0aGlzLmJpdHNBdmFpbGFibGUsIHQgPSBlID4+IDMsIGUgLT0gdCA8PCAzLCB0aGlzLmJ5dGVzQXZhaWxhYmxlIC09IHQsIHRoaXMubG9hZFdvcmQoKSwgdGhpcy53b3JkIDw8PSBlLCB0aGlzLmJpdHNBdmFpbGFibGUgLT0gZSk7XG4gIH1cbiAgLy8gKHNpemU6aW50KTp1aW50XG4gIHJlYWRCaXRzKGUpIHtcbiAgICBsZXQgdCA9IE1hdGgubWluKHRoaXMuYml0c0F2YWlsYWJsZSwgZSk7XG4gICAgY29uc3QgciA9IHRoaXMud29yZCA+Pj4gMzIgLSB0O1xuICAgIGlmIChlID4gMzIgJiYgcnQuZXJyb3IoXCJDYW5ub3QgcmVhZCBtb3JlIHRoYW4gMzIgYml0cyBhdCBhIHRpbWVcIiksIHRoaXMuYml0c0F2YWlsYWJsZSAtPSB0LCB0aGlzLmJpdHNBdmFpbGFibGUgPiAwKVxuICAgICAgdGhpcy53b3JkIDw8PSB0O1xuICAgIGVsc2UgaWYgKHRoaXMuYnl0ZXNBdmFpbGFibGUgPiAwKVxuICAgICAgdGhpcy5sb2FkV29yZCgpO1xuICAgIGVsc2VcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGJpdHMgYXZhaWxhYmxlXCIpO1xuICAgIHJldHVybiB0ID0gZSAtIHQsIHQgPiAwICYmIHRoaXMuYml0c0F2YWlsYWJsZSA/IHIgPDwgdCB8IHRoaXMucmVhZEJpdHModCkgOiByO1xuICB9XG4gIC8vICgpOnVpbnRcbiAgc2tpcExaKCkge1xuICAgIGxldCBlO1xuICAgIGZvciAoZSA9IDA7IGUgPCB0aGlzLmJpdHNBdmFpbGFibGU7ICsrZSlcbiAgICAgIGlmICgodGhpcy53b3JkICYgMjE0NzQ4MzY0OCA+Pj4gZSkgIT09IDApXG4gICAgICAgIHJldHVybiB0aGlzLndvcmQgPDw9IGUsIHRoaXMuYml0c0F2YWlsYWJsZSAtPSBlLCBlO1xuICAgIHJldHVybiB0aGlzLmxvYWRXb3JkKCksIGUgKyB0aGlzLnNraXBMWigpO1xuICB9XG4gIC8vICgpOnZvaWRcbiAgc2tpcFVFRygpIHtcbiAgICB0aGlzLnNraXBCaXRzKDEgKyB0aGlzLnNraXBMWigpKTtcbiAgfVxuICAvLyAoKTp2b2lkXG4gIHNraXBFRygpIHtcbiAgICB0aGlzLnNraXBCaXRzKDEgKyB0aGlzLnNraXBMWigpKTtcbiAgfVxuICAvLyAoKTp1aW50XG4gIHJlYWRVRUcoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuc2tpcExaKCk7XG4gICAgcmV0dXJuIHRoaXMucmVhZEJpdHMoZSArIDEpIC0gMTtcbiAgfVxuICAvLyAoKTppbnRcbiAgcmVhZEVHKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLnJlYWRVRUcoKTtcbiAgICByZXR1cm4gMSAmIGUgPyAxICsgZSA+Pj4gMSA6IC0xICogKGUgPj4+IDEpO1xuICB9XG4gIC8vIFNvbWUgY29udmVuaWVuY2UgZnVuY3Rpb25zXG4gIC8vIDpCb29sZWFuXG4gIHJlYWRCb29sZWFuKCkge1xuICAgIHJldHVybiB0aGlzLnJlYWRCaXRzKDEpID09PSAxO1xuICB9XG4gIC8vICgpOmludFxuICByZWFkVUJ5dGUoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZEJpdHMoOCk7XG4gIH1cbiAgLy8gKCk6aW50XG4gIHJlYWRVU2hvcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZEJpdHMoMTYpO1xuICB9XG4gIC8vICgpOmludFxuICByZWFkVUludCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkQml0cygzMik7XG4gIH1cbn1cbmNsYXNzIEdUIGV4dGVuZHMgeHAge1xuICBwYXJzZVBFUyhlLCB0LCByLCBuKSB7XG4gICAgY29uc3QgaSA9IHRoaXMucGFyc2VOQUx1KGUsIHIuZGF0YSwgbik7XG4gICAgbGV0IG8gPSB0aGlzLlZpZGVvU2FtcGxlLCBhLCBsID0gITE7XG4gICAgci5kYXRhID0gbnVsbCwgbyAmJiBpLmxlbmd0aCAmJiAhZS5hdWRGb3VuZCAmJiAodGhpcy5wdXNoQWNjZXNzVW5pdChvLCBlKSwgbyA9IHRoaXMuVmlkZW9TYW1wbGUgPSB0aGlzLmNyZWF0ZVZpZGVvU2FtcGxlKCExLCByLnB0cywgci5kdHMpKSwgaS5mb3JFYWNoKChjKSA9PiB7XG4gICAgICB2YXIgdSwgZDtcbiAgICAgIHN3aXRjaCAoYy50eXBlKSB7XG4gICAgICAgIC8vIE5EUlxuICAgICAgICBjYXNlIDE6IHtcbiAgICAgICAgICBsZXQgeSA9ICExO1xuICAgICAgICAgIGEgPSAhMDtcbiAgICAgICAgICBjb25zdCBFID0gYy5kYXRhO1xuICAgICAgICAgIGlmIChsICYmIEUubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgY29uc3QgYiA9IHRoaXMucmVhZFNsaWNlVHlwZShFKTtcbiAgICAgICAgICAgIChiID09PSAyIHx8IGIgPT09IDQgfHwgYiA9PT0gNyB8fCBiID09PSA5KSAmJiAoeSA9ICEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHkpIHtcbiAgICAgICAgICAgIHZhciBoO1xuICAgICAgICAgICAgKGggPSBvKSAhPSBudWxsICYmIGguZnJhbWUgJiYgIW8ua2V5ICYmICh0aGlzLnB1c2hBY2Nlc3NVbml0KG8sIGUpLCBvID0gdGhpcy5WaWRlb1NhbXBsZSA9IG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvIHx8IChvID0gdGhpcy5WaWRlb1NhbXBsZSA9IHRoaXMuY3JlYXRlVmlkZW9TYW1wbGUoITAsIHIucHRzLCByLmR0cykpLCBvLmZyYW1lID0gITAsIG8ua2V5ID0geTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDU6XG4gICAgICAgICAgYSA9ICEwLCAodSA9IG8pICE9IG51bGwgJiYgdS5mcmFtZSAmJiAhby5rZXkgJiYgKHRoaXMucHVzaEFjY2Vzc1VuaXQobywgZSksIG8gPSB0aGlzLlZpZGVvU2FtcGxlID0gbnVsbCksIG8gfHwgKG8gPSB0aGlzLlZpZGVvU2FtcGxlID0gdGhpcy5jcmVhdGVWaWRlb1NhbXBsZSghMCwgci5wdHMsIHIuZHRzKSksIG8ua2V5ID0gITAsIG8uZnJhbWUgPSAhMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gU0VJXG4gICAgICAgIGNhc2UgNjoge1xuICAgICAgICAgIGEgPSAhMCwgZ3UoYy5kYXRhLCAxLCByLnB0cywgdC5zYW1wbGVzKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIDc6IHtcbiAgICAgICAgICB2YXIgZiwgcDtcbiAgICAgICAgICBhID0gITAsIGwgPSAhMDtcbiAgICAgICAgICBjb25zdCB5ID0gYy5kYXRhLCBFID0gdGhpcy5yZWFkU1BTKHkpO1xuICAgICAgICAgIGlmICghZS5zcHMgfHwgZS53aWR0aCAhPT0gRS53aWR0aCB8fCBlLmhlaWdodCAhPT0gRS5oZWlnaHQgfHwgKChmID0gZS5waXhlbFJhdGlvKSA9PSBudWxsID8gdm9pZCAwIDogZlswXSkgIT09IEUucGl4ZWxSYXRpb1swXSB8fCAoKHAgPSBlLnBpeGVsUmF0aW8pID09IG51bGwgPyB2b2lkIDAgOiBwWzFdKSAhPT0gRS5waXhlbFJhdGlvWzFdKSB7XG4gICAgICAgICAgICBlLndpZHRoID0gRS53aWR0aCwgZS5oZWlnaHQgPSBFLmhlaWdodCwgZS5waXhlbFJhdGlvID0gRS5waXhlbFJhdGlvLCBlLnNwcyA9IFt5XTtcbiAgICAgICAgICAgIGNvbnN0IGIgPSB5LnN1YmFycmF5KDEsIDQpO1xuICAgICAgICAgICAgbGV0IFIgPSBcImF2YzEuXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBBID0gMDsgQSA8IDM7IEErKykge1xuICAgICAgICAgICAgICBsZXQgRiA9IGJbQV0udG9TdHJpbmcoMTYpO1xuICAgICAgICAgICAgICBGLmxlbmd0aCA8IDIgJiYgKEYgPSBcIjBcIiArIEYpLCBSICs9IEY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlLmNvZGVjID0gUjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUFBTXG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBhID0gITAsIGUucHBzID0gW2MuZGF0YV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEFVRFxuICAgICAgICBjYXNlIDk6XG4gICAgICAgICAgYSA9ICEwLCBlLmF1ZEZvdW5kID0gITAsIChkID0gbykgIT0gbnVsbCAmJiBkLmZyYW1lICYmICh0aGlzLnB1c2hBY2Nlc3NVbml0KG8sIGUpLCBvID0gbnVsbCksIG8gfHwgKG8gPSB0aGlzLlZpZGVvU2FtcGxlID0gdGhpcy5jcmVhdGVWaWRlb1NhbXBsZSghMSwgci5wdHMsIHIuZHRzKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEZpbGxlciBEYXRhXG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgYSA9ICEwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGEgPSAhMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG8gJiYgYSAmJiBvLnVuaXRzLnB1c2goYyk7XG4gICAgfSksIG4gJiYgbyAmJiAodGhpcy5wdXNoQWNjZXNzVW5pdChvLCBlKSwgdGhpcy5WaWRlb1NhbXBsZSA9IG51bGwpO1xuICB9XG4gIGdldE5BTHVUeXBlKGUsIHQpIHtcbiAgICByZXR1cm4gZVt0XSAmIDMxO1xuICB9XG4gIHJlYWRTbGljZVR5cGUoZSkge1xuICAgIGNvbnN0IHQgPSBuZXcgWm4oZSk7XG4gICAgcmV0dXJuIHQucmVhZFVCeXRlKCksIHQucmVhZFVFRygpLCB0LnJlYWRVRUcoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHNjYWxpbmcgbGlzdCBpcyBvcHRpb25hbGx5IHRyYW5zbWl0dGVkIGFzIHBhcnQgb2YgYSBzZXF1ZW5jZSBwYXJhbWV0ZXJcbiAgICogc2V0IGFuZCBpcyBub3QgcmVsZXZhbnQgdG8gdHJhbnNtdXhpbmcuXG4gICAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhpcyBzY2FsaW5nIGxpc3RcbiAgICogQHNlZSBSZWNvbW1lbmRhdGlvbiBJVFUtVCBILjI2NCwgU2VjdGlvbiA3LjMuMi4xLjEuMVxuICAgKi9cbiAgc2tpcFNjYWxpbmdMaXN0KGUsIHQpIHtcbiAgICBsZXQgciA9IDgsIG4gPSA4LCBpO1xuICAgIGZvciAobGV0IG8gPSAwOyBvIDwgZTsgbysrKVxuICAgICAgbiAhPT0gMCAmJiAoaSA9IHQucmVhZEVHKCksIG4gPSAociArIGkgKyAyNTYpICUgMjU2KSwgciA9IG4gPT09IDAgPyByIDogbjtcbiAgfVxuICAvKipcbiAgICogUmVhZCBhIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQgYW5kIHJldHVybiBzb21lIGludGVyZXN0aW5nIHZpZGVvXG4gICAqIHByb3BlcnRpZXMuIEEgc2VxdWVuY2UgcGFyYW1ldGVyIHNldCBpcyB0aGUgSDI2NCBtZXRhZGF0YSB0aGF0XG4gICAqIGRlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiB1cGNvbWluZyB2aWRlbyBmcmFtZXMuXG4gICAqIEByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGNvbmZpZ3VyYXRpb24gcGFyc2VkIGZyb20gdGhlXG4gICAqIHNlcXVlbmNlIHBhcmFtZXRlciBzZXQsIGluY2x1ZGluZyB0aGUgZGltZW5zaW9ucyBvZiB0aGVcbiAgICogYXNzb2NpYXRlZCB2aWRlbyBmcmFtZXMuXG4gICAqL1xuICByZWFkU1BTKGUpIHtcbiAgICBjb25zdCB0ID0gbmV3IFpuKGUpO1xuICAgIGxldCByID0gMCwgbiA9IDAsIGkgPSAwLCBvID0gMCwgYSwgbCwgYztcbiAgICBjb25zdCB1ID0gdC5yZWFkVUJ5dGUuYmluZCh0KSwgZCA9IHQucmVhZEJpdHMuYmluZCh0KSwgaCA9IHQucmVhZFVFRy5iaW5kKHQpLCBmID0gdC5yZWFkQm9vbGVhbi5iaW5kKHQpLCBwID0gdC5za2lwQml0cy5iaW5kKHQpLCB5ID0gdC5za2lwRUcuYmluZCh0KSwgRSA9IHQuc2tpcFVFRy5iaW5kKHQpLCBiID0gdGhpcy5za2lwU2NhbGluZ0xpc3QuYmluZCh0aGlzKTtcbiAgICB1KCk7XG4gICAgY29uc3QgUiA9IHUoKTtcbiAgICBpZiAoZCg1KSwgcCgzKSwgdSgpLCBFKCksIFIgPT09IDEwMCB8fCBSID09PSAxMTAgfHwgUiA9PT0gMTIyIHx8IFIgPT09IDI0NCB8fCBSID09PSA0NCB8fCBSID09PSA4MyB8fCBSID09PSA4NiB8fCBSID09PSAxMTggfHwgUiA9PT0gMTI4KSB7XG4gICAgICBjb25zdCBqID0gaCgpO1xuICAgICAgaWYgKGogPT09IDMgJiYgcCgxKSwgRSgpLCBFKCksIHAoMSksIGYoKSlcbiAgICAgICAgZm9yIChsID0gaiAhPT0gMyA/IDggOiAxMiwgYyA9IDA7IGMgPCBsOyBjKyspXG4gICAgICAgICAgZigpICYmIChjIDwgNiA/IGIoMTYsIHQpIDogYig2NCwgdCkpO1xuICAgIH1cbiAgICBFKCk7XG4gICAgY29uc3QgQSA9IGgoKTtcbiAgICBpZiAoQSA9PT0gMClcbiAgICAgIGgoKTtcbiAgICBlbHNlIGlmIChBID09PSAxKVxuICAgICAgZm9yIChwKDEpLCB5KCksIHkoKSwgYSA9IGgoKSwgYyA9IDA7IGMgPCBhOyBjKyspXG4gICAgICAgIHkoKTtcbiAgICBFKCksIHAoMSk7XG4gICAgY29uc3QgRiA9IGgoKSwgTSA9IGgoKSwgSCA9IGQoMSk7XG4gICAgSCA9PT0gMCAmJiBwKDEpLCBwKDEpLCBmKCkgJiYgKHIgPSBoKCksIG4gPSBoKCksIGkgPSBoKCksIG8gPSBoKCkpO1xuICAgIGxldCBLID0gWzEsIDFdO1xuICAgIGlmIChmKCkgJiYgZigpKVxuICAgICAgc3dpdGNoICh1KCkpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIEsgPSBbMSwgMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBLID0gWzEyLCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBLID0gWzEwLCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBLID0gWzE2LCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBLID0gWzQwLCAzM107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBLID0gWzI0LCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNzpcbiAgICAgICAgICBLID0gWzIwLCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBLID0gWzMyLCAxMV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBLID0gWzgwLCAzM107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTA6XG4gICAgICAgICAgSyA9IFsxOCwgMTFdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIEsgPSBbMTUsIDExXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxMjpcbiAgICAgICAgICBLID0gWzY0LCAzM107XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTM6XG4gICAgICAgICAgSyA9IFsxNjAsIDk5XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxNDpcbiAgICAgICAgICBLID0gWzQsIDNdO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE1OlxuICAgICAgICAgIEsgPSBbMywgMl07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTY6XG4gICAgICAgICAgSyA9IFsyLCAxXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyNTU6IHtcbiAgICAgICAgICBLID0gW3UoKSA8PCA4IHwgdSgpLCB1KCkgPDwgOCB8IHUoKV07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IE1hdGguY2VpbCgoRiArIDEpICogMTYgLSByICogMiAtIG4gKiAyKSxcbiAgICAgIGhlaWdodDogKDIgLSBIKSAqIChNICsgMSkgKiAxNiAtIChIID8gMiA6IDQpICogKGkgKyBvKSxcbiAgICAgIHBpeGVsUmF0aW86IEtcbiAgICB9O1xuICB9XG59XG5jbGFzcyBWVCBleHRlbmRzIHhwIHtcbiAgY29uc3RydWN0b3IoLi4uZSkge1xuICAgIHN1cGVyKC4uLmUpLCB0aGlzLmluaXRWUFMgPSBudWxsO1xuICB9XG4gIHBhcnNlUEVTKGUsIHQsIHIsIG4pIHtcbiAgICBjb25zdCBpID0gdGhpcy5wYXJzZU5BTHUoZSwgci5kYXRhLCBuKTtcbiAgICBsZXQgbyA9IHRoaXMuVmlkZW9TYW1wbGUsIGEsIGwgPSAhMTtcbiAgICByLmRhdGEgPSBudWxsLCBvICYmIGkubGVuZ3RoICYmICFlLmF1ZEZvdW5kICYmICh0aGlzLnB1c2hBY2Nlc3NVbml0KG8sIGUpLCBvID0gdGhpcy5WaWRlb1NhbXBsZSA9IHRoaXMuY3JlYXRlVmlkZW9TYW1wbGUoITEsIHIucHRzLCByLmR0cykpLCBpLmZvckVhY2goKGMpID0+IHtcbiAgICAgIHZhciB1LCBkO1xuICAgICAgc3dpdGNoIChjLnR5cGUpIHtcbiAgICAgICAgLy8gTk9OLUlEUiwgTk9OIFJBTkRPTSBBQ0NFU1MgU0xJQ0VcbiAgICAgICAgY2FzZSAwOlxuICAgICAgICBjYXNlIDE6XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICBjYXNlIDQ6XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgY2FzZSA2OlxuICAgICAgICBjYXNlIDc6XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgY2FzZSA5OlxuICAgICAgICAgIG8gfHwgKG8gPSB0aGlzLlZpZGVvU2FtcGxlID0gdGhpcy5jcmVhdGVWaWRlb1NhbXBsZSghMSwgci5wdHMsIHIuZHRzKSksIG8uZnJhbWUgPSAhMCwgYSA9ICEwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBDUkEsIEJMQSAocmFuZG9tIGFjY2VzcyBwaWN0dXJlKVxuICAgICAgICBjYXNlIDE2OlxuICAgICAgICBjYXNlIDE3OlxuICAgICAgICBjYXNlIDE4OlxuICAgICAgICBjYXNlIDIxOlxuICAgICAgICAgIGlmIChhID0gITAsIGwpIHtcbiAgICAgICAgICAgIHZhciBoO1xuICAgICAgICAgICAgKGggPSBvKSAhPSBudWxsICYmIGguZnJhbWUgJiYgIW8ua2V5ICYmICh0aGlzLnB1c2hBY2Nlc3NVbml0KG8sIGUpLCBvID0gdGhpcy5WaWRlb1NhbXBsZSA9IG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvIHx8IChvID0gdGhpcy5WaWRlb1NhbXBsZSA9IHRoaXMuY3JlYXRlVmlkZW9TYW1wbGUoITAsIHIucHRzLCByLmR0cykpLCBvLmtleSA9ICEwLCBvLmZyYW1lID0gITA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIElEUlxuICAgICAgICBjYXNlIDE5OlxuICAgICAgICBjYXNlIDIwOlxuICAgICAgICAgIGEgPSAhMCwgKHUgPSBvKSAhPSBudWxsICYmIHUuZnJhbWUgJiYgIW8ua2V5ICYmICh0aGlzLnB1c2hBY2Nlc3NVbml0KG8sIGUpLCBvID0gdGhpcy5WaWRlb1NhbXBsZSA9IG51bGwpLCBvIHx8IChvID0gdGhpcy5WaWRlb1NhbXBsZSA9IHRoaXMuY3JlYXRlVmlkZW9TYW1wbGUoITAsIHIucHRzLCByLmR0cykpLCBvLmtleSA9ICEwLCBvLmZyYW1lID0gITA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFNFSVxuICAgICAgICBjYXNlIDM5OlxuICAgICAgICAgIGEgPSAhMCwgZ3UoXG4gICAgICAgICAgICBjLmRhdGEsXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICAgLy8gTkFMdSBoZWFkZXIgc2l6ZVxuICAgICAgICAgICAgci5wdHMsXG4gICAgICAgICAgICB0LnNhbXBsZXNcbiAgICAgICAgICApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICAvLyBWUFNcbiAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICBhID0gITAsIGUudnBzIHx8ICh0eXBlb2YgZS5wYXJhbXMgIT0gXCJvYmplY3RcIiAmJiAoZS5wYXJhbXMgPSB7fSksIGUucGFyYW1zID0gbnQoZS5wYXJhbXMsIHRoaXMucmVhZFZQUyhjLmRhdGEpKSwgdGhpcy5pbml0VlBTID0gYy5kYXRhKSwgZS52cHMgPSBbYy5kYXRhXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgLy8gU1BTXG4gICAgICAgIGNhc2UgMzM6XG4gICAgICAgICAgaWYgKGEgPSAhMCwgbCA9ICEwLCBlLnZwcyAhPT0gdm9pZCAwICYmIGUudnBzWzBdICE9PSB0aGlzLmluaXRWUFMgJiYgZS5zcHMgIT09IHZvaWQgMCAmJiAhdGhpcy5tYXRjaFNQUyhlLnNwc1swXSwgYy5kYXRhKSAmJiAodGhpcy5pbml0VlBTID0gZS52cHNbMF0sIGUuc3BzID0gZS5wcHMgPSB2b2lkIDApLCAhZS5zcHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGYgPSB0aGlzLnJlYWRTUFMoYy5kYXRhKTtcbiAgICAgICAgICAgIGUud2lkdGggPSBmLndpZHRoLCBlLmhlaWdodCA9IGYuaGVpZ2h0LCBlLnBpeGVsUmF0aW8gPSBmLnBpeGVsUmF0aW8sIGUuY29kZWMgPSBmLmNvZGVjU3RyaW5nLCBlLnNwcyA9IFtdLCB0eXBlb2YgZS5wYXJhbXMgIT0gXCJvYmplY3RcIiAmJiAoZS5wYXJhbXMgPSB7fSk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHAgaW4gZi5wYXJhbXMpXG4gICAgICAgICAgICAgIGUucGFyYW1zW3BdID0gZi5wYXJhbXNbcF07XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMucHVzaFBhcmFtZXRlclNldChlLnNwcywgYy5kYXRhLCBlLnZwcyksIG8gfHwgKG8gPSB0aGlzLlZpZGVvU2FtcGxlID0gdGhpcy5jcmVhdGVWaWRlb1NhbXBsZSghMCwgci5wdHMsIHIuZHRzKSksIG8ua2V5ID0gITA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIFBQU1xuICAgICAgICBjYXNlIDM0OlxuICAgICAgICAgIGlmIChhID0gITAsIHR5cGVvZiBlLnBhcmFtcyA9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBpZiAoIWUucHBzKSB7XG4gICAgICAgICAgICAgIGUucHBzID0gW107XG4gICAgICAgICAgICAgIGNvbnN0IGYgPSB0aGlzLnJlYWRQUFMoYy5kYXRhKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBwIGluIGYpXG4gICAgICAgICAgICAgICAgZS5wYXJhbXNbcF0gPSBmW3BdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5wdXNoUGFyYW1ldGVyU2V0KGUucHBzLCBjLmRhdGEsIGUudnBzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vIEFDQ0VTUyBVTklUIERFTElNSVRFUlxuICAgICAgICBjYXNlIDM1OlxuICAgICAgICAgIGEgPSAhMCwgZS5hdWRGb3VuZCA9ICEwLCAoZCA9IG8pICE9IG51bGwgJiYgZC5mcmFtZSAmJiAodGhpcy5wdXNoQWNjZXNzVW5pdChvLCBlKSwgbyA9IG51bGwpLCBvIHx8IChvID0gdGhpcy5WaWRlb1NhbXBsZSA9IHRoaXMuY3JlYXRlVmlkZW9TYW1wbGUoITEsIHIucHRzLCByLmR0cykpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGEgPSAhMTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG8gJiYgYSAmJiBvLnVuaXRzLnB1c2goYyk7XG4gICAgfSksIG4gJiYgbyAmJiAodGhpcy5wdXNoQWNjZXNzVW5pdChvLCBlKSwgdGhpcy5WaWRlb1NhbXBsZSA9IG51bGwpO1xuICB9XG4gIHB1c2hQYXJhbWV0ZXJTZXQoZSwgdCwgcikge1xuICAgIChyICYmIHJbMF0gPT09IHRoaXMuaW5pdFZQUyB8fCAhciAmJiAhZS5sZW5ndGgpICYmIGUucHVzaCh0KTtcbiAgfVxuICBnZXROQUx1VHlwZShlLCB0KSB7XG4gICAgcmV0dXJuIChlW3RdICYgMTI2KSA+Pj4gMTtcbiAgfVxuICBlYnNwMnJic3AoZSkge1xuICAgIGNvbnN0IHQgPSBuZXcgVWludDhBcnJheShlLmJ5dGVMZW5ndGgpO1xuICAgIGxldCByID0gMDtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IGUuYnl0ZUxlbmd0aDsgbisrKVxuICAgICAgbiA+PSAyICYmIGVbbl0gPT09IDMgJiYgZVtuIC0gMV0gPT09IDAgJiYgZVtuIC0gMl0gPT09IDAgfHwgKHRbcl0gPSBlW25dLCByKyspO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0LmJ1ZmZlciwgMCwgcik7XG4gIH1cbiAgcHVzaEFjY2Vzc1VuaXQoZSwgdCkge1xuICAgIHN1cGVyLnB1c2hBY2Nlc3NVbml0KGUsIHQpLCB0aGlzLmluaXRWUFMgJiYgKHRoaXMuaW5pdFZQUyA9IG51bGwpO1xuICB9XG4gIHJlYWRWUFMoZSkge1xuICAgIGNvbnN0IHQgPSBuZXcgWm4oZSk7XG4gICAgdC5yZWFkVUJ5dGUoKSwgdC5yZWFkVUJ5dGUoKSwgdC5yZWFkQml0cyg0KSwgdC5za2lwQml0cygyKSwgdC5yZWFkQml0cyg2KTtcbiAgICBjb25zdCByID0gdC5yZWFkQml0cygzKSwgbiA9IHQucmVhZEJvb2xlYW4oKTtcbiAgICByZXR1cm4ge1xuICAgICAgbnVtVGVtcG9yYWxMYXllcnM6IHIgKyAxLFxuICAgICAgdGVtcG9yYWxJZE5lc3RlZDogblxuICAgIH07XG4gIH1cbiAgcmVhZFNQUyhlKSB7XG4gICAgY29uc3QgdCA9IG5ldyBabih0aGlzLmVic3AycmJzcChlKSk7XG4gICAgdC5yZWFkVUJ5dGUoKSwgdC5yZWFkVUJ5dGUoKSwgdC5yZWFkQml0cyg0KTtcbiAgICBjb25zdCByID0gdC5yZWFkQml0cygzKTtcbiAgICB0LnJlYWRCb29sZWFuKCk7XG4gICAgY29uc3QgbiA9IHQucmVhZEJpdHMoMiksIGkgPSB0LnJlYWRCb29sZWFuKCksIG8gPSB0LnJlYWRCaXRzKDUpLCBhID0gdC5yZWFkVUJ5dGUoKSwgbCA9IHQucmVhZFVCeXRlKCksIGMgPSB0LnJlYWRVQnl0ZSgpLCB1ID0gdC5yZWFkVUJ5dGUoKSwgZCA9IHQucmVhZFVCeXRlKCksIGggPSB0LnJlYWRVQnl0ZSgpLCBmID0gdC5yZWFkVUJ5dGUoKSwgcCA9IHQucmVhZFVCeXRlKCksIHkgPSB0LnJlYWRVQnl0ZSgpLCBFID0gdC5yZWFkVUJ5dGUoKSwgYiA9IHQucmVhZFVCeXRlKCksIFIgPSBbXSwgQSA9IFtdO1xuICAgIGZvciAobGV0IHllID0gMDsgeWUgPCByOyB5ZSsrKVxuICAgICAgUi5wdXNoKHQucmVhZEJvb2xlYW4oKSksIEEucHVzaCh0LnJlYWRCb29sZWFuKCkpO1xuICAgIGlmIChyID4gMClcbiAgICAgIGZvciAobGV0IHllID0gcjsgeWUgPCA4OyB5ZSsrKVxuICAgICAgICB0LnJlYWRCaXRzKDIpO1xuICAgIGZvciAobGV0IHllID0gMDsgeWUgPCByOyB5ZSsrKVxuICAgICAgUlt5ZV0gJiYgKHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCksIHQucmVhZFVCeXRlKCkpLCBBW3llXSAmJiB0LnJlYWRVQnl0ZSgpO1xuICAgIHQucmVhZFVFRygpO1xuICAgIGNvbnN0IEYgPSB0LnJlYWRVRUcoKTtcbiAgICBGID09IDMgJiYgdC5za2lwQml0cygxKTtcbiAgICBjb25zdCBNID0gdC5yZWFkVUVHKCksIEggPSB0LnJlYWRVRUcoKSwgSyA9IHQucmVhZEJvb2xlYW4oKTtcbiAgICBsZXQgaiA9IDAsIEMgPSAwLCBrID0gMCwgJCA9IDA7XG4gICAgSyAmJiAoaiArPSB0LnJlYWRVRUcoKSwgQyArPSB0LnJlYWRVRUcoKSwgayArPSB0LnJlYWRVRUcoKSwgJCArPSB0LnJlYWRVRUcoKSk7XG4gICAgY29uc3QgVyA9IHQucmVhZFVFRygpLCBfID0gdC5yZWFkVUVHKCksIGcgPSB0LnJlYWRVRUcoKSwgeCA9IHQucmVhZEJvb2xlYW4oKTtcbiAgICBmb3IgKGxldCB5ZSA9IHggPyAwIDogcjsgeWUgPD0gcjsgeWUrKylcbiAgICAgIHQuc2tpcFVFRygpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCk7XG4gICAgaWYgKHQuc2tpcFVFRygpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCksIHQuc2tpcFVFRygpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCksIHQucmVhZEJvb2xlYW4oKSAmJiB0LnJlYWRCb29sZWFuKCkpXG4gICAgICBmb3IgKGxldCBiZSA9IDA7IGJlIDwgNDsgYmUrKylcbiAgICAgICAgZm9yIChsZXQgRmUgPSAwOyBGZSA8IChiZSA9PT0gMyA/IDIgOiA2KTsgRmUrKylcbiAgICAgICAgICBpZiAoIXQucmVhZEJvb2xlYW4oKSlcbiAgICAgICAgICAgIHQucmVhZFVFRygpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgd2UgPSBNYXRoLm1pbig2NCwgMSA8PCA0ICsgKGJlIDw8IDEpKTtcbiAgICAgICAgICAgIGJlID4gMSAmJiB0LnJlYWRFRygpO1xuICAgICAgICAgICAgZm9yIChsZXQgTmUgPSAwOyBOZSA8IHdlOyBOZSsrKVxuICAgICAgICAgICAgICB0LnJlYWRFRygpO1xuICAgICAgICAgIH1cbiAgICB0LnJlYWRCb29sZWFuKCksIHQucmVhZEJvb2xlYW4oKSwgdC5yZWFkQm9vbGVhbigpICYmICh0LnJlYWRVQnl0ZSgpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCksIHQucmVhZEJvb2xlYW4oKSk7XG4gICAgY29uc3QgTyA9IHQucmVhZFVFRygpO1xuICAgIGxldCBVID0gMDtcbiAgICBmb3IgKGxldCB5ZSA9IDA7IHllIDwgTzsgeWUrKykge1xuICAgICAgbGV0IGJlID0gITE7XG4gICAgICBpZiAoeWUgIT09IDAgJiYgKGJlID0gdC5yZWFkQm9vbGVhbigpKSwgYmUpIHtcbiAgICAgICAgeWUgPT09IE8gJiYgdC5yZWFkVUVHKCksIHQucmVhZEJvb2xlYW4oKSwgdC5yZWFkVUVHKCk7XG4gICAgICAgIGxldCBGZSA9IDA7XG4gICAgICAgIGZvciAobGV0IFhlID0gMDsgWGUgPD0gVTsgWGUrKykge1xuICAgICAgICAgIGNvbnN0IHdlID0gdC5yZWFkQm9vbGVhbigpO1xuICAgICAgICAgIGxldCBOZSA9ICExO1xuICAgICAgICAgIHdlIHx8IChOZSA9IHQucmVhZEJvb2xlYW4oKSksICh3ZSB8fCBOZSkgJiYgRmUrKztcbiAgICAgICAgfVxuICAgICAgICBVID0gRmU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBGZSA9IHQucmVhZFVFRygpLCBYZSA9IHQucmVhZFVFRygpO1xuICAgICAgICBVID0gRmUgKyBYZTtcbiAgICAgICAgZm9yIChsZXQgd2UgPSAwOyB3ZSA8IEZlOyB3ZSsrKVxuICAgICAgICAgIHQucmVhZFVFRygpLCB0LnJlYWRCb29sZWFuKCk7XG4gICAgICAgIGZvciAobGV0IHdlID0gMDsgd2UgPCBYZTsgd2UrKylcbiAgICAgICAgICB0LnJlYWRVRUcoKSwgdC5yZWFkQm9vbGVhbigpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodC5yZWFkQm9vbGVhbigpKSB7XG4gICAgICBjb25zdCB5ZSA9IHQucmVhZFVFRygpO1xuICAgICAgZm9yIChsZXQgYmUgPSAwOyBiZSA8IHllOyBiZSsrKSB7XG4gICAgICAgIGZvciAobGV0IEZlID0gMDsgRmUgPCBnICsgNDsgRmUrKylcbiAgICAgICAgICB0LnJlYWRCaXRzKDEpO1xuICAgICAgICB0LnJlYWRCaXRzKDEpO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgTCA9IDAsIG0gPSAxLCB2ID0gMSwgUCA9ICEwLCBOID0gMSwgWSA9IDA7XG4gICAgdC5yZWFkQm9vbGVhbigpLCB0LnJlYWRCb29sZWFuKCk7XG4gICAgbGV0IGVlID0gITE7XG4gICAgaWYgKHQucmVhZEJvb2xlYW4oKSkge1xuICAgICAgaWYgKHQucmVhZEJvb2xlYW4oKSkge1xuICAgICAgICBjb25zdCBkdCA9IHQucmVhZFVCeXRlKCksIEplID0gWzEsIDEyLCAxMCwgMTYsIDQwLCAyNCwgMjAsIDMyLCA4MCwgMTgsIDE1LCA2NCwgMTYwLCA0LCAzLCAyXSwgUWUgPSBbMSwgMTEsIDExLCAxMSwgMzMsIDExLCAxMSwgMTEsIDMzLCAxMSwgMTEsIDMzLCA5OSwgMywgMiwgMV07XG4gICAgICAgIGR0ID4gMCAmJiBkdCA8IDE2ID8gKG0gPSBKZVtkdCAtIDFdLCB2ID0gUWVbZHQgLSAxXSkgOiBkdCA9PT0gMjU1ICYmIChtID0gdC5yZWFkQml0cygxNiksIHYgPSB0LnJlYWRCaXRzKDE2KSk7XG4gICAgICB9XG4gICAgICBpZiAodC5yZWFkQm9vbGVhbigpICYmIHQucmVhZEJvb2xlYW4oKSwgdC5yZWFkQm9vbGVhbigpICYmICh0LnJlYWRCaXRzKDMpLCB0LnJlYWRCb29sZWFuKCksIHQucmVhZEJvb2xlYW4oKSAmJiAodC5yZWFkVUJ5dGUoKSwgdC5yZWFkVUJ5dGUoKSwgdC5yZWFkVUJ5dGUoKSkpLCB0LnJlYWRCb29sZWFuKCkgJiYgKHQucmVhZFVFRygpLCB0LnJlYWRVRUcoKSksIHQucmVhZEJvb2xlYW4oKSwgdC5yZWFkQm9vbGVhbigpLCB0LnJlYWRCb29sZWFuKCksIGVlID0gdC5yZWFkQm9vbGVhbigpLCBlZSAmJiAodC5za2lwVUVHKCksIHQuc2tpcFVFRygpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCkpLCB0LnJlYWRCb29sZWFuKCkgJiYgKE4gPSB0LnJlYWRCaXRzKDMyKSwgWSA9IHQucmVhZEJpdHMoMzIpLCB0LnJlYWRCb29sZWFuKCkgJiYgdC5yZWFkVUVHKCksIHQucmVhZEJvb2xlYW4oKSkpIHtcbiAgICAgICAgY29uc3QgUWUgPSB0LnJlYWRCb29sZWFuKCksIGl0ID0gdC5yZWFkQm9vbGVhbigpO1xuICAgICAgICBsZXQgamUgPSAhMTtcbiAgICAgICAgKFFlIHx8IGl0KSAmJiAoamUgPSB0LnJlYWRCb29sZWFuKCksIGplICYmICh0LnJlYWRVQnl0ZSgpLCB0LnJlYWRCaXRzKDUpLCB0LnJlYWRCb29sZWFuKCksIHQucmVhZEJpdHMoNSkpLCB0LnJlYWRCaXRzKDQpLCB0LnJlYWRCaXRzKDQpLCBqZSAmJiB0LnJlYWRCaXRzKDQpLCB0LnJlYWRCaXRzKDUpLCB0LnJlYWRCaXRzKDUpLCB0LnJlYWRCaXRzKDUpKTtcbiAgICAgICAgZm9yIChsZXQgQiA9IDA7IEIgPD0gcjsgQisrKSB7XG4gICAgICAgICAgUCA9IHQucmVhZEJvb2xlYW4oKTtcbiAgICAgICAgICBjb25zdCBTID0gUCB8fCB0LnJlYWRCb29sZWFuKCk7XG4gICAgICAgICAgbGV0IFQgPSAhMTtcbiAgICAgICAgICBTID8gdC5yZWFkRUcoKSA6IFQgPSB0LnJlYWRCb29sZWFuKCk7XG4gICAgICAgICAgY29uc3QgRyA9IFQgPyAxIDogdC5yZWFkVUVHKCkgKyAxO1xuICAgICAgICAgIGlmIChRZSlcbiAgICAgICAgICAgIGZvciAobGV0IFogPSAwOyBaIDwgRzsgWisrKVxuICAgICAgICAgICAgICB0LnJlYWRVRUcoKSwgdC5yZWFkVUVHKCksIGplICYmICh0LnJlYWRVRUcoKSwgdC5yZWFkVUVHKCkpLCB0LnNraXBCaXRzKDEpO1xuICAgICAgICAgIGlmIChpdClcbiAgICAgICAgICAgIGZvciAobGV0IFogPSAwOyBaIDwgRzsgWisrKVxuICAgICAgICAgICAgICB0LnJlYWRVRUcoKSwgdC5yZWFkVUVHKCksIGplICYmICh0LnJlYWRVRUcoKSwgdC5yZWFkVUVHKCkpLCB0LnNraXBCaXRzKDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0LnJlYWRCb29sZWFuKCkgJiYgKHQucmVhZEJvb2xlYW4oKSwgdC5yZWFkQm9vbGVhbigpLCB0LnJlYWRCb29sZWFuKCksIEwgPSB0LnJlYWRVRUcoKSk7XG4gICAgfVxuICAgIGxldCBsZSA9IE0sIFRlID0gSDtcbiAgICBpZiAoSykge1xuICAgICAgbGV0IHllID0gMSwgYmUgPSAxO1xuICAgICAgRiA9PT0gMSA/IHllID0gYmUgPSAyIDogRiA9PSAyICYmICh5ZSA9IDIpLCBsZSA9IE0gLSB5ZSAqIEMgLSB5ZSAqIGosIFRlID0gSCAtIGJlICogJCAtIGJlICogaztcbiAgICB9XG4gICAgY29uc3QgRGUgPSBuID8gW1wiQVwiLCBcIkJcIiwgXCJDXCJdW25dIDogXCJcIiwgemUgPSBhIDw8IDI0IHwgbCA8PCAxNiB8IGMgPDwgOCB8IHU7XG4gICAgbGV0IF9lID0gMDtcbiAgICBmb3IgKGxldCB5ZSA9IDA7IHllIDwgMzI7IHllKyspXG4gICAgICBfZSA9IChfZSB8ICh6ZSA+PiB5ZSAmIDEpIDw8IDMxIC0geWUpID4+PiAwO1xuICAgIGxldCB4ZSA9IF9lLnRvU3RyaW5nKDE2KTtcbiAgICByZXR1cm4gbyA9PT0gMSAmJiB4ZSA9PT0gXCIyXCIgJiYgKHhlID0gXCI2XCIpLCB7XG4gICAgICBjb2RlY1N0cmluZzogYGh2YzEuJHtEZX0ke299LiR7eGV9LiR7aSA/IFwiSFwiIDogXCJMXCJ9JHtifS5CMGAsXG4gICAgICBwYXJhbXM6IHtcbiAgICAgICAgZ2VuZXJhbF90aWVyX2ZsYWc6IGksXG4gICAgICAgIGdlbmVyYWxfcHJvZmlsZV9pZGM6IG8sXG4gICAgICAgIGdlbmVyYWxfcHJvZmlsZV9zcGFjZTogbixcbiAgICAgICAgZ2VuZXJhbF9wcm9maWxlX2NvbXBhdGliaWxpdHlfZmxhZ3M6IFthLCBsLCBjLCB1XSxcbiAgICAgICAgZ2VuZXJhbF9jb25zdHJhaW50X2luZGljYXRvcl9mbGFnczogW2QsIGgsIGYsIHAsIHksIEVdLFxuICAgICAgICBnZW5lcmFsX2xldmVsX2lkYzogYixcbiAgICAgICAgYml0X2RlcHRoOiBXICsgOCxcbiAgICAgICAgYml0X2RlcHRoX2x1bWFfbWludXM4OiBXLFxuICAgICAgICBiaXRfZGVwdGhfY2hyb21hX21pbnVzODogXyxcbiAgICAgICAgbWluX3NwYXRpYWxfc2VnbWVudGF0aW9uX2lkYzogTCxcbiAgICAgICAgY2hyb21hX2Zvcm1hdF9pZGM6IEYsXG4gICAgICAgIGZyYW1lX3JhdGU6IHtcbiAgICAgICAgICBmaXhlZDogUCxcbiAgICAgICAgICBmcHM6IFkgLyBOXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB3aWR0aDogbGUsXG4gICAgICBoZWlnaHQ6IFRlLFxuICAgICAgcGl4ZWxSYXRpbzogW20sIHZdXG4gICAgfTtcbiAgfVxuICByZWFkUFBTKGUpIHtcbiAgICBjb25zdCB0ID0gbmV3IFpuKHRoaXMuZWJzcDJyYnNwKGUpKTtcbiAgICB0LnJlYWRVQnl0ZSgpLCB0LnJlYWRVQnl0ZSgpLCB0LnNraXBVRUcoKSwgdC5za2lwVUVHKCksIHQuc2tpcEJpdHMoMiksIHQuc2tpcEJpdHMoMyksIHQuc2tpcEJpdHMoMiksIHQuc2tpcFVFRygpLCB0LnNraXBVRUcoKSwgdC5za2lwRUcoKSwgdC5za2lwQml0cygyKSwgdC5yZWFkQm9vbGVhbigpICYmIHQuc2tpcFVFRygpLCB0LnNraXBFRygpLCB0LnNraXBFRygpLCB0LnNraXBCaXRzKDQpO1xuICAgIGNvbnN0IG4gPSB0LnJlYWRCb29sZWFuKCksIGkgPSB0LnJlYWRCb29sZWFuKCk7XG4gICAgbGV0IG8gPSAxO1xuICAgIHJldHVybiBpICYmIG4gPyBvID0gMCA6IGkgPyBvID0gMyA6IG4gJiYgKG8gPSAyKSwge1xuICAgICAgcGFyYWxsZWxpc21UeXBlOiBvXG4gICAgfTtcbiAgfVxuICBtYXRjaFNQUyhlLCB0KSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgZSkuc3Vic3RyKDMpID09PSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHQpLnN1YnN0cigzKTtcbiAgfVxufVxuY29uc3QgV3QgPSAxODg7XG5jbGFzcyBJcyB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4pIHtcbiAgICB0aGlzLmxvZ2dlciA9IHZvaWQgMCwgdGhpcy5vYnNlcnZlciA9IHZvaWQgMCwgdGhpcy5jb25maWcgPSB2b2lkIDAsIHRoaXMudHlwZVN1cHBvcnRlZCA9IHZvaWQgMCwgdGhpcy5zYW1wbGVBZXMgPSBudWxsLCB0aGlzLnBtdFBhcnNlZCA9ICExLCB0aGlzLmF1ZGlvQ29kZWMgPSB2b2lkIDAsIHRoaXMudmlkZW9Db2RlYyA9IHZvaWQgMCwgdGhpcy5fcG10SWQgPSAtMSwgdGhpcy5fdmlkZW9UcmFjayA9IHZvaWQgMCwgdGhpcy5fYXVkaW9UcmFjayA9IHZvaWQgMCwgdGhpcy5faWQzVHJhY2sgPSB2b2lkIDAsIHRoaXMuX3R4dFRyYWNrID0gdm9pZCAwLCB0aGlzLmFhY092ZXJGbG93ID0gbnVsbCwgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbCwgdGhpcy52aWRlb1BhcnNlciA9IHZvaWQgMCwgdGhpcy5vYnNlcnZlciA9IGUsIHRoaXMuY29uZmlnID0gdCwgdGhpcy50eXBlU3VwcG9ydGVkID0gciwgdGhpcy5sb2dnZXIgPSBuLCB0aGlzLnZpZGVvUGFyc2VyID0gbnVsbDtcbiAgfVxuICBzdGF0aWMgcHJvYmUoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBJcy5zeW5jT2Zmc2V0KGUpO1xuICAgIHJldHVybiByID4gMCAmJiB0Lndhcm4oYE1QRUcyLVRTIGRldGVjdGVkIGJ1dCBmaXJzdCBzeW5jIHdvcmQgZm91bmQgQCBvZmZzZXQgJHtyfWApLCByICE9PSAtMTtcbiAgfVxuICBzdGF0aWMgc3luY09mZnNldChlKSB7XG4gICAgY29uc3QgdCA9IGUubGVuZ3RoO1xuICAgIGxldCByID0gTWF0aC5taW4oV3QgKiA1LCB0IC0gV3QpICsgMSwgbiA9IDA7XG4gICAgZm9yICg7IG4gPCByOyApIHtcbiAgICAgIGxldCBpID0gITEsIG8gPSAtMSwgYSA9IDA7XG4gICAgICBmb3IgKGxldCBsID0gbjsgbCA8IHQ7IGwgKz0gV3QpXG4gICAgICAgIGlmIChlW2xdID09PSA3MSAmJiAodCAtIGwgPT09IFd0IHx8IGVbbCArIFd0XSA9PT0gNzEpKSB7XG4gICAgICAgICAgaWYgKGErKywgbyA9PT0gLTEgJiYgKG8gPSBsLCBvICE9PSAwICYmIChyID0gTWF0aC5taW4obyArIFd0ICogOTksIGUubGVuZ3RoIC0gV3QpICsgMSkpLCBpIHx8IChpID0gcGMoZSwgbCkgPT09IDApLCBpICYmIGEgPiAxICYmIChvID09PSAwICYmIGEgPiAyIHx8IGwgKyBXdCA+IHIpKVxuICAgICAgICAgICAgcmV0dXJuIG87XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKGEpXG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIG4rKztcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdHJhY2sgbW9kZWwgaW50ZXJuYWwgdG8gZGVtdXhlciB1c2VkIHRvIGRyaXZlIHJlbXV4aW5nIGlucHV0XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlVHJhY2soZSwgdCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250YWluZXI6IGUgPT09IFwidmlkZW9cIiB8fCBlID09PSBcImF1ZGlvXCIgPyBcInZpZGVvL21wMnRcIiA6IHZvaWQgMCxcbiAgICAgIHR5cGU6IGUsXG4gICAgICBpZDogTGdbZV0sXG4gICAgICBwaWQ6IC0xLFxuICAgICAgaW5wdXRUaW1lU2NhbGU6IDllNCxcbiAgICAgIHNlcXVlbmNlTnVtYmVyOiAwLFxuICAgICAgc2FtcGxlczogW10sXG4gICAgICBkcm9wcGVkOiAwLFxuICAgICAgZHVyYXRpb246IGUgPT09IFwiYXVkaW9cIiA/IHQgOiB2b2lkIDBcbiAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbml0IHNlZ21lbnQgb24gdGhlIGRlbXV4ZXIvcmVtdXhlciBpbnRlcmZhY2UuIE5lZWRlZCBmb3IgZGlzY29udGludWl0aWVzL3RyYWNrLXN3aXRjaGVzIChvciBhdCBzdHJlYW0gc3RhcnQpXG4gICAqIFJlc2V0cyBhbGwgaW50ZXJuYWwgdHJhY2sgaW5zdGFuY2VzIG9mIHRoZSBkZW11eGVyLlxuICAgKi9cbiAgcmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgdGhpcy5wbXRQYXJzZWQgPSAhMSwgdGhpcy5fcG10SWQgPSAtMSwgdGhpcy5fdmlkZW9UcmFjayA9IElzLmNyZWF0ZVRyYWNrKFwidmlkZW9cIiksIHRoaXMuX3ZpZGVvVHJhY2suZHVyYXRpb24gPSBuLCB0aGlzLl9hdWRpb1RyYWNrID0gSXMuY3JlYXRlVHJhY2soXCJhdWRpb1wiLCBuKSwgdGhpcy5faWQzVHJhY2sgPSBJcy5jcmVhdGVUcmFjayhcImlkM1wiKSwgdGhpcy5fdHh0VHJhY2sgPSBJcy5jcmVhdGVUcmFjayhcInRleHRcIiksIHRoaXMuX2F1ZGlvVHJhY2suc2VnbWVudENvZGVjID0gXCJhYWNcIiwgdGhpcy52aWRlb1BhcnNlciA9IG51bGwsIHRoaXMuYWFjT3ZlckZsb3cgPSBudWxsLCB0aGlzLnJlbWFpbmRlckRhdGEgPSBudWxsLCB0aGlzLmF1ZGlvQ29kZWMgPSB0LCB0aGlzLnZpZGVvQ29kZWMgPSByO1xuICB9XG4gIHJlc2V0VGltZVN0YW1wKCkge1xuICB9XG4gIHJlc2V0Q29udGlndWl0eSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBfYXVkaW9UcmFjazogZSxcbiAgICAgIF92aWRlb1RyYWNrOiB0LFxuICAgICAgX2lkM1RyYWNrOiByXG4gICAgfSA9IHRoaXM7XG4gICAgZSAmJiAoZS5wZXNEYXRhID0gbnVsbCksIHQgJiYgKHQucGVzRGF0YSA9IG51bGwpLCByICYmIChyLnBlc0RhdGEgPSBudWxsKSwgdGhpcy5hYWNPdmVyRmxvdyA9IG51bGwsIHRoaXMucmVtYWluZGVyRGF0YSA9IG51bGw7XG4gIH1cbiAgZGVtdXgoZSwgdCwgciA9ICExLCBuID0gITEpIHtcbiAgICByIHx8ICh0aGlzLnNhbXBsZUFlcyA9IG51bGwpO1xuICAgIGxldCBpO1xuICAgIGNvbnN0IG8gPSB0aGlzLl92aWRlb1RyYWNrLCBhID0gdGhpcy5fYXVkaW9UcmFjaywgbCA9IHRoaXMuX2lkM1RyYWNrLCBjID0gdGhpcy5fdHh0VHJhY2s7XG4gICAgbGV0IHUgPSBvLnBpZCwgZCA9IG8ucGVzRGF0YSwgaCA9IGEucGlkLCBmID0gbC5waWQsIHAgPSBhLnBlc0RhdGEsIHkgPSBsLnBlc0RhdGEsIEUgPSBudWxsLCBiID0gdGhpcy5wbXRQYXJzZWQsIFIgPSB0aGlzLl9wbXRJZCwgQSA9IGUubGVuZ3RoO1xuICAgIGlmICh0aGlzLnJlbWFpbmRlckRhdGEgJiYgKGUgPSBfcih0aGlzLnJlbWFpbmRlckRhdGEsIGUpLCBBID0gZS5sZW5ndGgsIHRoaXMucmVtYWluZGVyRGF0YSA9IG51bGwpLCBBIDwgV3QgJiYgIW4pXG4gICAgICByZXR1cm4gdGhpcy5yZW1haW5kZXJEYXRhID0gZSwge1xuICAgICAgICBhdWRpb1RyYWNrOiBhLFxuICAgICAgICB2aWRlb1RyYWNrOiBvLFxuICAgICAgICBpZDNUcmFjazogbCxcbiAgICAgICAgdGV4dFRyYWNrOiBjXG4gICAgICB9O1xuICAgIGNvbnN0IEYgPSBNYXRoLm1heCgwLCBJcy5zeW5jT2Zmc2V0KGUpKTtcbiAgICBBIC09IChBIC0gRikgJSBXdCwgQSA8IGUuYnl0ZUxlbmd0aCAmJiAhbiAmJiAodGhpcy5yZW1haW5kZXJEYXRhID0gbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIsIEEsIGUuYnVmZmVyLmJ5dGVMZW5ndGggLSBBKSk7XG4gICAgbGV0IE0gPSAwO1xuICAgIGZvciAobGV0IEsgPSBGOyBLIDwgQTsgSyArPSBXdClcbiAgICAgIGlmIChlW0tdID09PSA3MSkge1xuICAgICAgICBjb25zdCBqID0gISEoZVtLICsgMV0gJiA2NCksIEMgPSBwYyhlLCBLKSwgayA9IChlW0sgKyAzXSAmIDQ4KSA+PiA0O1xuICAgICAgICBsZXQgJDtcbiAgICAgICAgaWYgKGsgPiAxKSB7XG4gICAgICAgICAgaWYgKCQgPSBLICsgNSArIGVbSyArIDRdLCAkID09PSBLICsgV3QpXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgJCA9IEsgKyA0O1xuICAgICAgICBzd2l0Y2ggKEMpIHtcbiAgICAgICAgICBjYXNlIHU6XG4gICAgICAgICAgICBqICYmIChkICYmIChpID0gZ24oZCwgdGhpcy5sb2dnZXIpKSAmJiAodGhpcy5yZWFkeVZpZGVvUGFyc2VyKG8uc2VnbWVudENvZGVjKSwgdGhpcy52aWRlb1BhcnNlciAhPT0gbnVsbCAmJiB0aGlzLnZpZGVvUGFyc2VyLnBhcnNlUEVTKG8sIGMsIGksICExKSksIGQgPSB7XG4gICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgICBzaXplOiAwXG4gICAgICAgICAgICB9KSwgZCAmJiAoZC5kYXRhLnB1c2goZS5zdWJhcnJheSgkLCBLICsgV3QpKSwgZC5zaXplICs9IEsgKyBXdCAtICQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBoOlxuICAgICAgICAgICAgaWYgKGopIHtcbiAgICAgICAgICAgICAgaWYgKHAgJiYgKGkgPSBnbihwLCB0aGlzLmxvZ2dlcikpKVxuICAgICAgICAgICAgICAgIHN3aXRjaCAoYS5zZWdtZW50Q29kZWMpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJhYWNcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUFBQ1BFUyhhLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICBjYXNlIFwibXAzXCI6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VNUEVHUEVTKGEsIGkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgIGNhc2UgXCJhYzNcIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJzZUFDM1BFUyhhLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBwID0ge1xuICAgICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgICAgIHNpemU6IDBcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHAgJiYgKHAuZGF0YS5wdXNoKGUuc3ViYXJyYXkoJCwgSyArIFd0KSksIHAuc2l6ZSArPSBLICsgV3QgLSAkKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgZjpcbiAgICAgICAgICAgIGogJiYgKHkgJiYgKGkgPSBnbih5LCB0aGlzLmxvZ2dlcikpICYmIHRoaXMucGFyc2VJRDNQRVMobCwgaSksIHkgPSB7XG4gICAgICAgICAgICAgIGRhdGE6IFtdLFxuICAgICAgICAgICAgICBzaXplOiAwXG4gICAgICAgICAgICB9KSwgeSAmJiAoeS5kYXRhLnB1c2goZS5zdWJhcnJheSgkLCBLICsgV3QpKSwgeS5zaXplICs9IEsgKyBXdCAtICQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgaiAmJiAoJCArPSBlWyRdICsgMSksIFIgPSB0aGlzLl9wbXRJZCA9IGpUKGUsICQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBSOiB7XG4gICAgICAgICAgICBqICYmICgkICs9IGVbJF0gKyAxKTtcbiAgICAgICAgICAgIGNvbnN0IFcgPSBLVChlLCAkLCB0aGlzLnR5cGVTdXBwb3J0ZWQsIHIsIHRoaXMub2JzZXJ2ZXIsIHRoaXMubG9nZ2VyKTtcbiAgICAgICAgICAgIHUgPSBXLnZpZGVvUGlkLCB1ID4gMCAmJiAoby5waWQgPSB1LCBvLnNlZ21lbnRDb2RlYyA9IFcuc2VnbWVudFZpZGVvQ29kZWMpLCBoID0gVy5hdWRpb1BpZCwgaCA+IDAgJiYgKGEucGlkID0gaCwgYS5zZWdtZW50Q29kZWMgPSBXLnNlZ21lbnRBdWRpb0NvZGVjKSwgZiA9IFcuaWQzUGlkLCBmID4gMCAmJiAobC5waWQgPSBmKSwgRSAhPT0gbnVsbCAmJiAhYiAmJiAodGhpcy5sb2dnZXIud2FybihgTVBFRy1UUyBQTVQgZm91bmQgYXQgJHtLfSBhZnRlciB1bmtub3duIFBJRCAnJHtFfScuIEJhY2t0cmFja2luZyB0byBzeW5jIGJ5dGUgQCR7Rn0gdG8gcGFyc2UgYWxsIFRTIHBhY2tldHMuYCksIEUgPSBudWxsLCBLID0gRiAtIDE4OCksIGIgPSB0aGlzLnBtdFBhcnNlZCA9ICEwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgMTc6XG4gICAgICAgICAgY2FzZSA4MTkxOlxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIEUgPSBDO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZVxuICAgICAgICBNKys7XG4gICAgTSA+IDAgJiYgbWModGhpcy5vYnNlcnZlciwgbmV3IEVycm9yKGBGb3VuZCAke019IFRTIHBhY2tldC9zIHRoYXQgZG8gbm90IHN0YXJ0IHdpdGggMHg0N2ApLCB2b2lkIDAsIHRoaXMubG9nZ2VyKSwgby5wZXNEYXRhID0gZCwgYS5wZXNEYXRhID0gcCwgbC5wZXNEYXRhID0geTtcbiAgICBjb25zdCBIID0ge1xuICAgICAgYXVkaW9UcmFjazogYSxcbiAgICAgIHZpZGVvVHJhY2s6IG8sXG4gICAgICBpZDNUcmFjazogbCxcbiAgICAgIHRleHRUcmFjazogY1xuICAgIH07XG4gICAgcmV0dXJuIG4gJiYgdGhpcy5leHRyYWN0UmVtYWluaW5nU2FtcGxlcyhIKSwgSDtcbiAgfVxuICBmbHVzaCgpIHtcbiAgICBjb25zdCB7XG4gICAgICByZW1haW5kZXJEYXRhOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgdGhpcy5yZW1haW5kZXJEYXRhID0gbnVsbDtcbiAgICBsZXQgdDtcbiAgICByZXR1cm4gZSA/IHQgPSB0aGlzLmRlbXV4KGUsIC0xLCAhMSwgITApIDogdCA9IHtcbiAgICAgIHZpZGVvVHJhY2s6IHRoaXMuX3ZpZGVvVHJhY2ssXG4gICAgICBhdWRpb1RyYWNrOiB0aGlzLl9hdWRpb1RyYWNrLFxuICAgICAgaWQzVHJhY2s6IHRoaXMuX2lkM1RyYWNrLFxuICAgICAgdGV4dFRyYWNrOiB0aGlzLl90eHRUcmFja1xuICAgIH0sIHRoaXMuZXh0cmFjdFJlbWFpbmluZ1NhbXBsZXModCksIHRoaXMuc2FtcGxlQWVzID8gdGhpcy5kZWNyeXB0KHQsIHRoaXMuc2FtcGxlQWVzKSA6IHQ7XG4gIH1cbiAgZXh0cmFjdFJlbWFpbmluZ1NhbXBsZXMoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGF1ZGlvVHJhY2s6IHQsXG4gICAgICB2aWRlb1RyYWNrOiByLFxuICAgICAgaWQzVHJhY2s6IG4sXG4gICAgICB0ZXh0VHJhY2s6IGlcbiAgICB9ID0gZSwgbyA9IHIucGVzRGF0YSwgYSA9IHQucGVzRGF0YSwgbCA9IG4ucGVzRGF0YTtcbiAgICBsZXQgYztcbiAgICBpZiAobyAmJiAoYyA9IGduKG8sIHRoaXMubG9nZ2VyKSkgPyAodGhpcy5yZWFkeVZpZGVvUGFyc2VyKHIuc2VnbWVudENvZGVjKSwgdGhpcy52aWRlb1BhcnNlciAhPT0gbnVsbCAmJiAodGhpcy52aWRlb1BhcnNlci5wYXJzZVBFUyhyLCBpLCBjLCAhMCksIHIucGVzRGF0YSA9IG51bGwpKSA6IHIucGVzRGF0YSA9IG8sIGEgJiYgKGMgPSBnbihhLCB0aGlzLmxvZ2dlcikpKSB7XG4gICAgICBzd2l0Y2ggKHQuc2VnbWVudENvZGVjKSB7XG4gICAgICAgIGNhc2UgXCJhYWNcIjpcbiAgICAgICAgICB0aGlzLnBhcnNlQUFDUEVTKHQsIGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwibXAzXCI6XG4gICAgICAgICAgdGhpcy5wYXJzZU1QRUdQRVModCwgYyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJhYzNcIjpcbiAgICAgICAgICB0aGlzLnBhcnNlQUMzUEVTKHQsIGMpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdC5wZXNEYXRhID0gbnVsbDtcbiAgICB9IGVsc2VcbiAgICAgIGEgIT0gbnVsbCAmJiBhLnNpemUgJiYgdGhpcy5sb2dnZXIubG9nKFwibGFzdCBBQUMgUEVTIHBhY2tldCB0cnVuY2F0ZWQsbWlnaHQgb3ZlcmxhcCBiZXR3ZWVuIGZyYWdtZW50c1wiKSwgdC5wZXNEYXRhID0gYTtcbiAgICBsICYmIChjID0gZ24obCwgdGhpcy5sb2dnZXIpKSA/ICh0aGlzLnBhcnNlSUQzUEVTKG4sIGMpLCBuLnBlc0RhdGEgPSBudWxsKSA6IG4ucGVzRGF0YSA9IGw7XG4gIH1cbiAgZGVtdXhTYW1wbGVBZXMoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSB0aGlzLmRlbXV4KGUsIHIsICEwLCAhdGhpcy5jb25maWcucHJvZ3Jlc3NpdmUpLCBpID0gdGhpcy5zYW1wbGVBZXMgPSBuZXcgJFQodGhpcy5vYnNlcnZlciwgdGhpcy5jb25maWcsIHQpO1xuICAgIHJldHVybiB0aGlzLmRlY3J5cHQobiwgaSk7XG4gIH1cbiAgcmVhZHlWaWRlb1BhcnNlcihlKSB7XG4gICAgdGhpcy52aWRlb1BhcnNlciA9PT0gbnVsbCAmJiAoZSA9PT0gXCJhdmNcIiA/IHRoaXMudmlkZW9QYXJzZXIgPSBuZXcgR1QoKSA6IGUgPT09IFwiaGV2Y1wiICYmICh0aGlzLnZpZGVvUGFyc2VyID0gbmV3IFZUKCkpKTtcbiAgfVxuICBkZWNyeXB0KGUsIHQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYXVkaW9UcmFjazogbixcbiAgICAgICAgdmlkZW9UcmFjazogaVxuICAgICAgfSA9IGU7XG4gICAgICBuLnNhbXBsZXMgJiYgbi5zZWdtZW50Q29kZWMgPT09IFwiYWFjXCIgPyB0LmRlY3J5cHRBYWNTYW1wbGVzKG4uc2FtcGxlcywgMCwgKCkgPT4ge1xuICAgICAgICBpLnNhbXBsZXMgPyB0LmRlY3J5cHRBdmNTYW1wbGVzKGkuc2FtcGxlcywgMCwgMCwgKCkgPT4ge1xuICAgICAgICAgIHIoZSk7XG4gICAgICAgIH0pIDogcihlKTtcbiAgICAgIH0pIDogaS5zYW1wbGVzICYmIHQuZGVjcnlwdEF2Y1NhbXBsZXMoaS5zYW1wbGVzLCAwLCAwLCAoKSA9PiB7XG4gICAgICAgIHIoZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMub2JzZXJ2ZXIgJiYgdGhpcy5vYnNlcnZlci5yZW1vdmVBbGxMaXN0ZW5lcnMoKSwgdGhpcy5jb25maWcgPSB0aGlzLmxvZ2dlciA9IHRoaXMub2JzZXJ2ZXIgPSBudWxsLCB0aGlzLmFhY092ZXJGbG93ID0gdGhpcy52aWRlb1BhcnNlciA9IHRoaXMucmVtYWluZGVyRGF0YSA9IHRoaXMuc2FtcGxlQWVzID0gbnVsbCwgdGhpcy5fdmlkZW9UcmFjayA9IHRoaXMuX2F1ZGlvVHJhY2sgPSB0aGlzLl9pZDNUcmFjayA9IHRoaXMuX3R4dFRyYWNrID0gdm9pZCAwO1xuICB9XG4gIHBhcnNlQUFDUEVTKGUsIHQpIHtcbiAgICBsZXQgciA9IDA7XG4gICAgY29uc3QgbiA9IHRoaXMuYWFjT3ZlckZsb3c7XG4gICAgbGV0IGkgPSB0LmRhdGE7XG4gICAgaWYgKG4pIHtcbiAgICAgIHRoaXMuYWFjT3ZlckZsb3cgPSBudWxsO1xuICAgICAgY29uc3QgZCA9IG4ubWlzc2luZywgaCA9IG4uc2FtcGxlLnVuaXQuYnl0ZUxlbmd0aDtcbiAgICAgIGlmIChkID09PSAtMSlcbiAgICAgICAgaSA9IF9yKG4uc2FtcGxlLnVuaXQsIGkpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGYgPSBoIC0gZDtcbiAgICAgICAgbi5zYW1wbGUudW5pdC5zZXQoaS5zdWJhcnJheSgwLCBkKSwgZiksIGUuc2FtcGxlcy5wdXNoKG4uc2FtcGxlKSwgciA9IG4ubWlzc2luZztcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IG8sIGE7XG4gICAgZm9yIChvID0gciwgYSA9IGkubGVuZ3RoOyBvIDwgYSAtIDEgJiYgIW5hKGksIG8pOyBvKyspXG4gICAgICA7XG4gICAgaWYgKG8gIT09IHIpIHtcbiAgICAgIGxldCBkO1xuICAgICAgY29uc3QgaCA9IG8gPCBhIC0gMTtcbiAgICAgIGlmIChoID8gZCA9IGBBQUMgUEVTIGRpZCBub3Qgc3RhcnQgd2l0aCBBRFRTIGhlYWRlcixvZmZzZXQ6JHtvfWAgOiBkID0gXCJObyBBRFRTIGhlYWRlciBmb3VuZCBpbiBBQUMgUEVTXCIsIG1jKHRoaXMub2JzZXJ2ZXIsIG5ldyBFcnJvcihkKSwgaCwgdGhpcy5sb2dnZXIpLCAhaClcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjcChlLCB0aGlzLm9ic2VydmVyLCBpLCBvLCB0aGlzLmF1ZGlvQ29kZWMpO1xuICAgIGxldCBsO1xuICAgIGlmICh0LnB0cyAhPT0gdm9pZCAwKVxuICAgICAgbCA9IHQucHRzO1xuICAgIGVsc2UgaWYgKG4pIHtcbiAgICAgIGNvbnN0IGQgPSB1cChlLnNhbXBsZXJhdGUpO1xuICAgICAgbCA9IG4uc2FtcGxlLnB0cyArIGQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJbdHNkZW11eGVyXTogQUFDIFBFUyB1bmtub3duIFBUU1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IGMgPSAwLCB1O1xuICAgIGZvciAoOyBvIDwgYTsgKVxuICAgICAgaWYgKHUgPSBkcChlLCBpLCBvLCBsLCBjKSwgbyArPSB1Lmxlbmd0aCwgdS5taXNzaW5nKSB7XG4gICAgICAgIHRoaXMuYWFjT3ZlckZsb3cgPSB1O1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZVxuICAgICAgICBmb3IgKGMrKzsgbyA8IGEgLSAxICYmICFuYShpLCBvKTsgbysrKVxuICAgICAgICAgIDtcbiAgfVxuICBwYXJzZU1QRUdQRVMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0LmRhdGEsIG4gPSByLmxlbmd0aDtcbiAgICBsZXQgaSA9IDAsIG8gPSAwO1xuICAgIGNvbnN0IGEgPSB0LnB0cztcbiAgICBpZiAoYSA9PT0gdm9pZCAwKSB7XG4gICAgICB0aGlzLmxvZ2dlci53YXJuKFwiW3RzZGVtdXhlcl06IE1QRUcgUEVTIHVua25vd24gUFRTXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKDsgbyA8IG47IClcbiAgICAgIGlmIChtcChyLCBvKSkge1xuICAgICAgICBjb25zdCBsID0gZ3AoZSwgciwgbywgYSwgaSk7XG4gICAgICAgIGlmIChsKVxuICAgICAgICAgIG8gKz0gbC5sZW5ndGgsIGkrKztcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlXG4gICAgICAgIG8rKztcbiAgfVxuICBwYXJzZUFDM1BFUyhlLCB0KSB7XG4gICAge1xuICAgICAgY29uc3QgciA9IHQuZGF0YSwgbiA9IHQucHRzO1xuICAgICAgaWYgKG4gPT09IHZvaWQgMCkge1xuICAgICAgICB0aGlzLmxvZ2dlci53YXJuKFwiW3RzZGVtdXhlcl06IEFDMyBQRVMgdW5rbm93biBQVFNcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGkgPSByLmxlbmd0aDtcbiAgICAgIGxldCBvID0gMCwgYSA9IDAsIGw7XG4gICAgICBmb3IgKDsgYSA8IGkgJiYgKGwgPSBFcChlLCByLCBhLCBuLCBvKyspKSA+IDA7IClcbiAgICAgICAgYSArPSBsO1xuICAgIH1cbiAgfVxuICBwYXJzZUlEM1BFUyhlLCB0KSB7XG4gICAgaWYgKHQucHRzID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMubG9nZ2VyLndhcm4oXCJbdHNkZW11eGVyXTogSUQzIFBFUyB1bmtub3duIFBUU1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgciA9IG50KHt9LCB0LCB7XG4gICAgICB0eXBlOiB0aGlzLl92aWRlb1RyYWNrID8gYnIuZW1zZyA6IGJyLmF1ZGlvSWQzLFxuICAgICAgZHVyYXRpb246IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICAgIH0pO1xuICAgIGUuc2FtcGxlcy5wdXNoKHIpO1xuICB9XG59XG5mdW5jdGlvbiBwYyhzLCBlKSB7XG4gIHJldHVybiAoKHNbZSArIDFdICYgMzEpIDw8IDgpICsgc1tlICsgMl07XG59XG5mdW5jdGlvbiBqVChzLCBlKSB7XG4gIHJldHVybiAoc1tlICsgMTBdICYgMzEpIDw8IDggfCBzW2UgKyAxMV07XG59XG5mdW5jdGlvbiBLVChzLCBlLCB0LCByLCBuLCBpKSB7XG4gIGNvbnN0IG8gPSB7XG4gICAgYXVkaW9QaWQ6IC0xLFxuICAgIHZpZGVvUGlkOiAtMSxcbiAgICBpZDNQaWQ6IC0xLFxuICAgIHNlZ21lbnRWaWRlb0NvZGVjOiBcImF2Y1wiLFxuICAgIHNlZ21lbnRBdWRpb0NvZGVjOiBcImFhY1wiXG4gIH0sIGEgPSAoc1tlICsgMV0gJiAxNSkgPDwgOCB8IHNbZSArIDJdLCBsID0gZSArIDMgKyBhIC0gNCwgYyA9IChzW2UgKyAxMF0gJiAxNSkgPDwgOCB8IHNbZSArIDExXTtcbiAgZm9yIChlICs9IDEyICsgYzsgZSA8IGw7ICkge1xuICAgIGNvbnN0IHUgPSBwYyhzLCBlKSwgZCA9IChzW2UgKyAzXSAmIDE1KSA8PCA4IHwgc1tlICsgNF07XG4gICAgc3dpdGNoIChzW2VdKSB7XG4gICAgICBjYXNlIDIwNzpcbiAgICAgICAgaWYgKCFyKSB7XG4gICAgICAgICAgdmwoXCJBRFRTIEFBQ1wiLCBpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAxNTpcbiAgICAgICAgby5hdWRpb1BpZCA9PT0gLTEgJiYgKG8uYXVkaW9QaWQgPSB1KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBQYWNrZXRpemVkIG1ldGFkYXRhIChJRDMpXG4gICAgICBjYXNlIDIxOlxuICAgICAgICBvLmlkM1BpZCA9PT0gLTEgJiYgKG8uaWQzUGlkID0gdSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyMTk6XG4gICAgICAgIGlmICghcikge1xuICAgICAgICAgIHZsKFwiSC4yNjRcIiwgaSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgMjc6XG4gICAgICAgIG8udmlkZW9QaWQgPT09IC0xICYmIChvLnZpZGVvUGlkID0gdSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgLy8gSVNPL0lFQyAxMTE3Mi0zIChNUEVHLTEgYXVkaW8pXG4gICAgICAvLyBvciBJU08vSUVDIDEzODE4LTMgKE1QRUctMiBoYWx2ZWQgc2FtcGxlIHJhdGUgYXVkaW8pXG4gICAgICBjYXNlIDM6XG4gICAgICBjYXNlIDQ6XG4gICAgICAgICF0Lm1wZWcgJiYgIXQubXAzID8gaS5sb2coXCJNUEVHIGF1ZGlvIGZvdW5kLCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKSA6IG8uYXVkaW9QaWQgPT09IC0xICYmIChvLmF1ZGlvUGlkID0gdSwgby5zZWdtZW50QXVkaW9Db2RlYyA9IFwibXAzXCIpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMTkzOlxuICAgICAgICBpZiAoIXIpIHtcbiAgICAgICAgICB2bChcIkFDLTNcIiwgaSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgIGNhc2UgMTI5OlxuICAgICAgICB0LmFjMyA/IG8uYXVkaW9QaWQgPT09IC0xICYmIChvLmF1ZGlvUGlkID0gdSwgby5zZWdtZW50QXVkaW9Db2RlYyA9IFwiYWMzXCIpIDogaS5sb2coXCJBQy0zIGF1ZGlvIGZvdW5kLCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlclwiKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDY6XG4gICAgICAgIGlmIChvLmF1ZGlvUGlkID09PSAtMSAmJiBkID4gMCkge1xuICAgICAgICAgIGxldCBoID0gZSArIDUsIGYgPSBkO1xuICAgICAgICAgIGZvciAoOyBmID4gMjsgKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKHNbaF0pIHtcbiAgICAgICAgICAgICAgY2FzZSAxMDY6XG4gICAgICAgICAgICAgICAgdC5hYzMgIT09ICEwID8gaS5sb2coXCJBQy0zIGF1ZGlvIGZvdW5kLCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnJvd3NlciBmb3Igbm93XCIpIDogKG8uYXVkaW9QaWQgPSB1LCBvLnNlZ21lbnRBdWRpb0NvZGVjID0gXCJhYzNcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB5ID0gc1toICsgMV0gKyAyO1xuICAgICAgICAgICAgaCArPSB5LCBmIC09IHk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOTQ6XG4gICAgICAvLyBTQU1QTEUtQUVTIEVDM1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgY2FzZSAxMzU6XG4gICAgICAgIHJldHVybiBtYyhuLCBuZXcgRXJyb3IoXCJVbnN1cHBvcnRlZCBFQy0zIGluIE0yVFMgZm91bmRcIiksIHZvaWQgMCwgaSksIG87XG4gICAgICBjYXNlIDM2OlxuICAgICAgICBvLnZpZGVvUGlkID09PSAtMSAmJiAoby52aWRlb1BpZCA9IHUsIG8uc2VnbWVudFZpZGVvQ29kZWMgPSBcImhldmNcIiwgaS5sb2coXCJIRVZDIGluIE0yVFMgZm91bmRcIikpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZSArPSBkICsgNTtcbiAgfVxuICByZXR1cm4gbztcbn1cbmZ1bmN0aW9uIG1jKHMsIGUsIHQsIHIpIHtcbiAgci53YXJuKGBwYXJzaW5nIGVycm9yOiAke2UubWVzc2FnZX1gKSwgcy5lbWl0KEkuRVJST1IsIEkuRVJST1IsIHtcbiAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICBkZXRhaWxzOiBKLkZSQUdfUEFSU0lOR19FUlJPUixcbiAgICBmYXRhbDogITEsXG4gICAgbGV2ZWxSZXRyeTogdCxcbiAgICBlcnJvcjogZSxcbiAgICByZWFzb246IGUubWVzc2FnZVxuICB9KTtcbn1cbmZ1bmN0aW9uIHZsKHMsIGUpIHtcbiAgZS5sb2coYCR7c30gd2l0aCBBRVMtMTI4LUNCQyBlbmNyeXB0aW9uIGZvdW5kIGluIHVuZW5jcnlwdGVkIHN0cmVhbWApO1xufVxuZnVuY3Rpb24gZ24ocywgZSkge1xuICBsZXQgdCA9IDAsIHIsIG4sIGksIG8sIGE7XG4gIGNvbnN0IGwgPSBzLmRhdGE7XG4gIGlmICghcyB8fCBzLnNpemUgPT09IDApXG4gICAgcmV0dXJuIG51bGw7XG4gIGZvciAoOyBsWzBdLmxlbmd0aCA8IDE5ICYmIGwubGVuZ3RoID4gMTsgKVxuICAgIGxbMF0gPSBfcihsWzBdLCBsWzFdKSwgbC5zcGxpY2UoMSwgMSk7XG4gIGlmIChyID0gbFswXSwgKHJbMF0gPDwgMTYpICsgKHJbMV0gPDwgOCkgKyByWzJdID09PSAxKSB7XG4gICAgaWYgKG4gPSAocls0XSA8PCA4KSArIHJbNV0sIG4gJiYgbiA+IHMuc2l6ZSAtIDYpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCB1ID0gcls3XTtcbiAgICB1ICYgMTkyICYmIChvID0gKHJbOV0gJiAxNCkgKiA1MzY4NzA5MTIgKyAvLyAxIDw8IDI5XG4gICAgKHJbMTBdICYgMjU1KSAqIDQxOTQzMDQgKyAvLyAxIDw8IDIyXG4gICAgKHJbMTFdICYgMjU0KSAqIDE2Mzg0ICsgLy8gMSA8PCAxNFxuICAgIChyWzEyXSAmIDI1NSkgKiAxMjggKyAvLyAxIDw8IDdcbiAgICAoclsxM10gJiAyNTQpIC8gMiwgdSAmIDY0ID8gKGEgPSAoclsxNF0gJiAxNCkgKiA1MzY4NzA5MTIgKyAvLyAxIDw8IDI5XG4gICAgKHJbMTVdICYgMjU1KSAqIDQxOTQzMDQgKyAvLyAxIDw8IDIyXG4gICAgKHJbMTZdICYgMjU0KSAqIDE2Mzg0ICsgLy8gMSA8PCAxNFxuICAgIChyWzE3XSAmIDI1NSkgKiAxMjggKyAvLyAxIDw8IDdcbiAgICAoclsxOF0gJiAyNTQpIC8gMiwgbyAtIGEgPiA2MCAqIDllNCAmJiAoZS53YXJuKGAke01hdGgucm91bmQoKG8gLSBhKSAvIDllNCl9cyBkZWx0YSBiZXR3ZWVuIFBUUyBhbmQgRFRTLCBhbGlnbiB0aGVtYCksIG8gPSBhKSkgOiBhID0gbyksIGkgPSByWzhdO1xuICAgIGxldCBkID0gaSArIDk7XG4gICAgaWYgKHMuc2l6ZSA8PSBkKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgcy5zaXplIC09IGQ7XG4gICAgY29uc3QgaCA9IG5ldyBVaW50OEFycmF5KHMuc2l6ZSk7XG4gICAgZm9yIChsZXQgZiA9IDAsIHAgPSBsLmxlbmd0aDsgZiA8IHA7IGYrKykge1xuICAgICAgciA9IGxbZl07XG4gICAgICBsZXQgeSA9IHIuYnl0ZUxlbmd0aDtcbiAgICAgIGlmIChkKVxuICAgICAgICBpZiAoZCA+IHkpIHtcbiAgICAgICAgICBkIC09IHk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHIgPSByLnN1YmFycmF5KGQpLCB5IC09IGQsIGQgPSAwO1xuICAgICAgaC5zZXQociwgdCksIHQgKz0geTtcbiAgICB9XG4gICAgcmV0dXJuIG4gJiYgKG4gLT0gaSArIDMpLCB7XG4gICAgICBkYXRhOiBoLFxuICAgICAgcHRzOiBvLFxuICAgICAgZHRzOiBhLFxuICAgICAgbGVuOiBuXG4gICAgfTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbmNsYXNzIEhUIHtcbiAgc3RhdGljIGdldFNpbGVudEZyYW1lKGUsIHQpIHtcbiAgICBzd2l0Y2ggKGUpIHtcbiAgICAgIGNhc2UgXCJtcDRhLjQwLjJcIjpcbiAgICAgICAgaWYgKHQgPT09IDEpXG4gICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFswLCAyMDAsIDAsIDEyOCwgMzUsIDEyOF0pO1xuICAgICAgICBpZiAodCA9PT0gMilcbiAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzMzLCAwLCA3MywgMTQ0LCAyLCAyNSwgMCwgMzUsIDEyOF0pO1xuICAgICAgICBpZiAodCA9PT0gMylcbiAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzAsIDIwMCwgMCwgMTI4LCAzMiwgMTMyLCAxLCAzOCwgNjQsIDgsIDEwMCwgMCwgMTQyXSk7XG4gICAgICAgIGlmICh0ID09PSA0KVxuICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMCwgMjAwLCAwLCAxMjgsIDMyLCAxMzIsIDEsIDM4LCA2NCwgOCwgMTAwLCAwLCAxMjgsIDQ0LCAxMjgsIDgsIDIsIDU2XSk7XG4gICAgICAgIGlmICh0ID09PSA1KVxuICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMCwgMjAwLCAwLCAxMjgsIDMyLCAxMzIsIDEsIDM4LCA2NCwgOCwgMTAwLCAwLCAxMzAsIDQ4LCA0LCAxNTMsIDAsIDMzLCAxNDQsIDIsIDU2XSk7XG4gICAgICAgIGlmICh0ID09PSA2KVxuICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShbMCwgMjAwLCAwLCAxMjgsIDMyLCAxMzIsIDEsIDM4LCA2NCwgOCwgMTAwLCAwLCAxMzAsIDQ4LCA0LCAxNTMsIDAsIDMzLCAxNDQsIDIsIDAsIDE3OCwgMCwgMzIsIDgsIDIyNF0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIGhhbmRsZSBIRS1BQUMgYmVsb3cgKG1wNGEuNDAuNSAvIG1wNGEuNDAuMjkpXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAodCA9PT0gMSlcbiAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzEsIDY0LCAzNCwgMTI4LCAxNjMsIDc4LCAyMzAsIDEyOCwgMTg2LCA4LCAwLCAwLCAwLCAyOCwgNiwgMjQxLCAxOTMsIDEwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTRdKTtcbiAgICAgICAgaWYgKHQgPT09IDIpXG4gICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsxLCA2NCwgMzQsIDEyOCwgMTYzLCA5NCwgMjMwLCAxMjgsIDE4NiwgOCwgMCwgMCwgMCwgMCwgMTQ5LCAwLCA2LCAyNDEsIDE2MSwgMTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTRdKTtcbiAgICAgICAgaWYgKHQgPT09IDMpXG4gICAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFsxLCA2NCwgMzQsIDEyOCwgMTYzLCA5NCwgMjMwLCAxMjgsIDE4NiwgOCwgMCwgMCwgMCwgMCwgMTQ5LCAwLCA2LCAyNDEsIDE2MSwgMTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTAsIDkwLCA5MCwgOTRdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59XG5jb25zdCBTcyA9IE1hdGgucG93KDIsIDMyKSAtIDE7XG5jbGFzcyBYIHtcbiAgc3RhdGljIGluaXQoKSB7XG4gICAgWC50eXBlcyA9IHtcbiAgICAgIGF2YzE6IFtdLFxuICAgICAgLy8gY29kaW5nbmFtZVxuICAgICAgYXZjQzogW10sXG4gICAgICBodmMxOiBbXSxcbiAgICAgIGh2Y0M6IFtdLFxuICAgICAgYnRydDogW10sXG4gICAgICBkaW5mOiBbXSxcbiAgICAgIGRyZWY6IFtdLFxuICAgICAgZXNkczogW10sXG4gICAgICBmdHlwOiBbXSxcbiAgICAgIGhkbHI6IFtdLFxuICAgICAgbWRhdDogW10sXG4gICAgICBtZGhkOiBbXSxcbiAgICAgIG1kaWE6IFtdLFxuICAgICAgbWZoZDogW10sXG4gICAgICBtaW5mOiBbXSxcbiAgICAgIG1vb2Y6IFtdLFxuICAgICAgbW9vdjogW10sXG4gICAgICBtcDRhOiBbXSxcbiAgICAgIFwiLm1wM1wiOiBbXSxcbiAgICAgIGRhYzM6IFtdLFxuICAgICAgXCJhYy0zXCI6IFtdLFxuICAgICAgbXZleDogW10sXG4gICAgICBtdmhkOiBbXSxcbiAgICAgIHBhc3A6IFtdLFxuICAgICAgc2R0cDogW10sXG4gICAgICBzdGJsOiBbXSxcbiAgICAgIHN0Y286IFtdLFxuICAgICAgc3RzYzogW10sXG4gICAgICBzdHNkOiBbXSxcbiAgICAgIHN0c3o6IFtdLFxuICAgICAgc3R0czogW10sXG4gICAgICB0ZmR0OiBbXSxcbiAgICAgIHRmaGQ6IFtdLFxuICAgICAgdHJhZjogW10sXG4gICAgICB0cmFrOiBbXSxcbiAgICAgIHRydW46IFtdLFxuICAgICAgdHJleDogW10sXG4gICAgICB0a2hkOiBbXSxcbiAgICAgIHZtaGQ6IFtdLFxuICAgICAgc21oZDogW11cbiAgICB9O1xuICAgIGxldCBlO1xuICAgIGZvciAoZSBpbiBYLnR5cGVzKVxuICAgICAgWC50eXBlcy5oYXNPd25Qcm9wZXJ0eShlKSAmJiAoWC50eXBlc1tlXSA9IFtlLmNoYXJDb2RlQXQoMCksIGUuY2hhckNvZGVBdCgxKSwgZS5jaGFyQ29kZUF0KDIpLCBlLmNoYXJDb2RlQXQoMyldKTtcbiAgICBjb25zdCB0ID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCxcbiAgICAgIC8vIHZlcnNpb24gMFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBwcmVfZGVmaW5lZFxuICAgICAgMTE4LFxuICAgICAgMTA1LFxuICAgICAgMTAwLFxuICAgICAgMTAxLFxuICAgICAgLy8gaGFuZGxlcl90eXBlOiAndmlkZSdcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHJlc2VydmVkXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgIDg2LFxuICAgICAgMTA1LFxuICAgICAgMTAwLFxuICAgICAgMTAxLFxuICAgICAgMTExLFxuICAgICAgNzIsXG4gICAgICA5NyxcbiAgICAgIDExMCxcbiAgICAgIDEwMCxcbiAgICAgIDEwOCxcbiAgICAgIDEwMSxcbiAgICAgIDExNCxcbiAgICAgIDBcbiAgICAgIC8vIG5hbWU6ICdWaWRlb0hhbmRsZXInXG4gICAgXSksIHIgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAwLFxuICAgICAgLy8gdmVyc2lvbiAwXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBmbGFnc1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHByZV9kZWZpbmVkXG4gICAgICAxMTUsXG4gICAgICAxMTEsXG4gICAgICAxMTcsXG4gICAgICAxMTAsXG4gICAgICAvLyBoYW5kbGVyX3R5cGU6ICdzb3VuJ1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHJlc2VydmVkXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgODMsXG4gICAgICAxMTEsXG4gICAgICAxMTcsXG4gICAgICAxMTAsXG4gICAgICAxMDAsXG4gICAgICA3MixcbiAgICAgIDk3LFxuICAgICAgMTEwLFxuICAgICAgMTAwLFxuICAgICAgMTA4LFxuICAgICAgMTAxLFxuICAgICAgMTE0LFxuICAgICAgMFxuICAgICAgLy8gbmFtZTogJ1NvdW5kSGFuZGxlcidcbiAgICBdKTtcbiAgICBYLkhETFJfVFlQRVMgPSB7XG4gICAgICB2aWRlbzogdCxcbiAgICAgIGF1ZGlvOiByXG4gICAgfTtcbiAgICBjb25zdCBuID0gbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMCxcbiAgICAgIC8vIHZlcnNpb24gMFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAvLyBlbnRyeV9jb3VudFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMTIsXG4gICAgICAvLyBlbnRyeV9zaXplXG4gICAgICAxMTcsXG4gICAgICAxMTQsXG4gICAgICAxMDgsXG4gICAgICAzMixcbiAgICAgIC8vICd1cmwnIHR5cGVcbiAgICAgIDAsXG4gICAgICAvLyB2ZXJzaW9uIDBcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMVxuICAgICAgLy8gZW50cnlfZmxhZ3NcbiAgICBdKSwgaSA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsXG4gICAgICAvLyB2ZXJzaW9uXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBmbGFnc1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMFxuICAgICAgLy8gZW50cnlfY291bnRcbiAgICBdKTtcbiAgICBYLlNUVFMgPSBYLlNUU0MgPSBYLlNUQ08gPSBpLCBYLlNUU1ogPSBuZXcgVWludDhBcnJheShbXG4gICAgICAwLFxuICAgICAgLy8gdmVyc2lvblxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBzYW1wbGVfc2l6ZVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMFxuICAgICAgLy8gc2FtcGxlX2NvdW50XG4gICAgXSksIFguVk1IRCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsXG4gICAgICAvLyB2ZXJzaW9uXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAvLyBmbGFnc1xuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBncmFwaGljc21vZGVcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMFxuICAgICAgLy8gb3Bjb2xvclxuICAgIF0pLCBYLlNNSEQgPSBuZXcgVWludDhBcnJheShbXG4gICAgICAwLFxuICAgICAgLy8gdmVyc2lvblxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gYmFsYW5jZVxuICAgICAgMCxcbiAgICAgIDBcbiAgICAgIC8vIHJlc2VydmVkXG4gICAgXSksIFguU1RTRCA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsXG4gICAgICAvLyB2ZXJzaW9uIDBcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIGZsYWdzXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAxXG4gICAgXSk7XG4gICAgY29uc3QgbyA9IG5ldyBVaW50OEFycmF5KFsxMDUsIDExNSwgMTExLCAxMDldKSwgYSA9IG5ldyBVaW50OEFycmF5KFs5NywgMTE4LCA5OSwgNDldKSwgbCA9IG5ldyBVaW50OEFycmF5KFswLCAwLCAwLCAxXSk7XG4gICAgWC5GVFlQID0gWC5ib3goWC50eXBlcy5mdHlwLCBvLCBsLCBvLCBhKSwgWC5ESU5GID0gWC5ib3goWC50eXBlcy5kaW5mLCBYLmJveChYLnR5cGVzLmRyZWYsIG4pKTtcbiAgfVxuICBzdGF0aWMgYm94KGUsIC4uLnQpIHtcbiAgICBsZXQgciA9IDgsIG4gPSB0Lmxlbmd0aDtcbiAgICBjb25zdCBpID0gbjtcbiAgICBmb3IgKDsgbi0tOyApXG4gICAgICByICs9IHRbbl0uYnl0ZUxlbmd0aDtcbiAgICBjb25zdCBvID0gbmV3IFVpbnQ4QXJyYXkocik7XG4gICAgZm9yIChvWzBdID0gciA+PiAyNCAmIDI1NSwgb1sxXSA9IHIgPj4gMTYgJiAyNTUsIG9bMl0gPSByID4+IDggJiAyNTUsIG9bM10gPSByICYgMjU1LCBvLnNldChlLCA0KSwgbiA9IDAsIHIgPSA4OyBuIDwgaTsgbisrKVxuICAgICAgby5zZXQodFtuXSwgciksIHIgKz0gdFtuXS5ieXRlTGVuZ3RoO1xuICAgIHJldHVybiBvO1xuICB9XG4gIHN0YXRpYyBoZGxyKGUpIHtcbiAgICByZXR1cm4gWC5ib3goWC50eXBlcy5oZGxyLCBYLkhETFJfVFlQRVNbZV0pO1xuICB9XG4gIHN0YXRpYyBtZGF0KGUpIHtcbiAgICByZXR1cm4gWC5ib3goWC50eXBlcy5tZGF0LCBlKTtcbiAgfVxuICBzdGF0aWMgbWRoZChlLCB0KSB7XG4gICAgdCAqPSBlO1xuICAgIGNvbnN0IHIgPSBNYXRoLmZsb29yKHQgLyAoU3MgKyAxKSksIG4gPSBNYXRoLmZsb29yKHQgJSAoU3MgKyAxKSk7XG4gICAgcmV0dXJuIFguYm94KFgudHlwZXMubWRoZCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMSxcbiAgICAgIC8vIHZlcnNpb24gMVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAyLFxuICAgICAgLy8gY3JlYXRpb25fdGltZVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDMsXG4gICAgICAvLyBtb2RpZmljYXRpb25fdGltZVxuICAgICAgZSA+PiAyNCAmIDI1NSxcbiAgICAgIGUgPj4gMTYgJiAyNTUsXG4gICAgICBlID4+IDggJiAyNTUsXG4gICAgICBlICYgMjU1LFxuICAgICAgLy8gdGltZXNjYWxlXG4gICAgICByID4+IDI0LFxuICAgICAgciA+PiAxNiAmIDI1NSxcbiAgICAgIHIgPj4gOCAmIDI1NSxcbiAgICAgIHIgJiAyNTUsXG4gICAgICBuID4+IDI0LFxuICAgICAgbiA+PiAxNiAmIDI1NSxcbiAgICAgIG4gPj4gOCAmIDI1NSxcbiAgICAgIG4gJiAyNTUsXG4gICAgICA4NSxcbiAgICAgIDE5NixcbiAgICAgIC8vICd1bmQnIGxhbmd1YWdlICh1bmRldGVybWluZWQpXG4gICAgICAwLFxuICAgICAgMFxuICAgIF0pKTtcbiAgfVxuICBzdGF0aWMgbWRpYShlKSB7XG4gICAgcmV0dXJuIFguYm94KFgudHlwZXMubWRpYSwgWC5tZGhkKGUudGltZXNjYWxlIHx8IDAsIGUuZHVyYXRpb24gfHwgMCksIFguaGRscihlLnR5cGUpLCBYLm1pbmYoZSkpO1xuICB9XG4gIHN0YXRpYyBtZmhkKGUpIHtcbiAgICByZXR1cm4gWC5ib3goWC50eXBlcy5tZmhkLCBuZXcgVWludDhBcnJheShbXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIGUgPj4gMjQsXG4gICAgICBlID4+IDE2ICYgMjU1LFxuICAgICAgZSA+PiA4ICYgMjU1LFxuICAgICAgZSAmIDI1NVxuICAgICAgLy8gc2VxdWVuY2VfbnVtYmVyXG4gICAgXSkpO1xuICB9XG4gIHN0YXRpYyBtaW5mKGUpIHtcbiAgICByZXR1cm4gZS50eXBlID09PSBcImF1ZGlvXCIgPyBYLmJveChYLnR5cGVzLm1pbmYsIFguYm94KFgudHlwZXMuc21oZCwgWC5TTUhEKSwgWC5ESU5GLCBYLnN0YmwoZSkpIDogWC5ib3goWC50eXBlcy5taW5mLCBYLmJveChYLnR5cGVzLnZtaGQsIFguVk1IRCksIFguRElORiwgWC5zdGJsKGUpKTtcbiAgfVxuICBzdGF0aWMgbW9vZihlLCB0LCByKSB7XG4gICAgcmV0dXJuIFguYm94KFgudHlwZXMubW9vZiwgWC5tZmhkKGUpLCBYLnRyYWYociwgdCkpO1xuICB9XG4gIHN0YXRpYyBtb292KGUpIHtcbiAgICBsZXQgdCA9IGUubGVuZ3RoO1xuICAgIGNvbnN0IHIgPSBbXTtcbiAgICBmb3IgKDsgdC0tOyApXG4gICAgICByW3RdID0gWC50cmFrKGVbdF0pO1xuICAgIHJldHVybiBYLmJveC5hcHBseShudWxsLCBbWC50eXBlcy5tb292LCBYLm12aGQoZVswXS50aW1lc2NhbGUgfHwgMCwgZVswXS5kdXJhdGlvbiB8fCAwKV0uY29uY2F0KHIpLmNvbmNhdChYLm12ZXgoZSkpKTtcbiAgfVxuICBzdGF0aWMgbXZleChlKSB7XG4gICAgbGV0IHQgPSBlLmxlbmd0aDtcbiAgICBjb25zdCByID0gW107XG4gICAgZm9yICg7IHQtLTsgKVxuICAgICAgclt0XSA9IFgudHJleChlW3RdKTtcbiAgICByZXR1cm4gWC5ib3guYXBwbHkobnVsbCwgW1gudHlwZXMubXZleCwgLi4ucl0pO1xuICB9XG4gIHN0YXRpYyBtdmhkKGUsIHQpIHtcbiAgICB0ICo9IGU7XG4gICAgY29uc3QgciA9IE1hdGguZmxvb3IodCAvIChTcyArIDEpKSwgbiA9IE1hdGguZmxvb3IodCAlIChTcyArIDEpKSwgaSA9IG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDEsXG4gICAgICAvLyB2ZXJzaW9uIDFcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIGZsYWdzXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMixcbiAgICAgIC8vIGNyZWF0aW9uX3RpbWVcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAzLFxuICAgICAgLy8gbW9kaWZpY2F0aW9uX3RpbWVcbiAgICAgIGUgPj4gMjQgJiAyNTUsXG4gICAgICBlID4+IDE2ICYgMjU1LFxuICAgICAgZSA+PiA4ICYgMjU1LFxuICAgICAgZSAmIDI1NSxcbiAgICAgIC8vIHRpbWVzY2FsZVxuICAgICAgciA+PiAyNCxcbiAgICAgIHIgPj4gMTYgJiAyNTUsXG4gICAgICByID4+IDggJiAyNTUsXG4gICAgICByICYgMjU1LFxuICAgICAgbiA+PiAyNCxcbiAgICAgIG4gPj4gMTYgJiAyNTUsXG4gICAgICBuID4+IDggJiAyNTUsXG4gICAgICBuICYgMjU1LFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIDEuMCByYXRlXG4gICAgICAxLFxuICAgICAgMCxcbiAgICAgIC8vIDEuMCB2b2x1bWVcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHJlc2VydmVkXG4gICAgICAwLFxuICAgICAgMSxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDY0LFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gdHJhbnNmb3JtYXRpb246IHVuaXR5IG1hdHJpeFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gcHJlX2RlZmluZWRcbiAgICAgIDI1NSxcbiAgICAgIDI1NSxcbiAgICAgIDI1NSxcbiAgICAgIDI1NVxuICAgICAgLy8gbmV4dF90cmFja19JRFxuICAgIF0pO1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzLm12aGQsIGkpO1xuICB9XG4gIHN0YXRpYyBzZHRwKGUpIHtcbiAgICBjb25zdCB0ID0gZS5zYW1wbGVzIHx8IFtdLCByID0gbmV3IFVpbnQ4QXJyYXkoNCArIHQubGVuZ3RoKTtcbiAgICBsZXQgbiwgaTtcbiAgICBmb3IgKG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKylcbiAgICAgIGkgPSB0W25dLmZsYWdzLCByW24gKyA0XSA9IGkuZGVwZW5kc09uIDw8IDQgfCBpLmlzRGVwZW5kZWRPbiA8PCAyIHwgaS5oYXNSZWR1bmRhbmN5O1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzLnNkdHAsIHIpO1xuICB9XG4gIHN0YXRpYyBzdGJsKGUpIHtcbiAgICByZXR1cm4gWC5ib3goWC50eXBlcy5zdGJsLCBYLnN0c2QoZSksIFguYm94KFgudHlwZXMuc3R0cywgWC5TVFRTKSwgWC5ib3goWC50eXBlcy5zdHNjLCBYLlNUU0MpLCBYLmJveChYLnR5cGVzLnN0c3osIFguU1RTWiksIFguYm94KFgudHlwZXMuc3RjbywgWC5TVENPKSk7XG4gIH1cbiAgc3RhdGljIGF2YzEoZSkge1xuICAgIGxldCB0ID0gW10sIHIgPSBbXSwgbiwgaSwgbztcbiAgICBmb3IgKG4gPSAwOyBuIDwgZS5zcHMubGVuZ3RoOyBuKyspXG4gICAgICBpID0gZS5zcHNbbl0sIG8gPSBpLmJ5dGVMZW5ndGgsIHQucHVzaChvID4+PiA4ICYgMjU1KSwgdC5wdXNoKG8gJiAyNTUpLCB0ID0gdC5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoaSkpO1xuICAgIGZvciAobiA9IDA7IG4gPCBlLnBwcy5sZW5ndGg7IG4rKylcbiAgICAgIGkgPSBlLnBwc1tuXSwgbyA9IGkuYnl0ZUxlbmd0aCwgci5wdXNoKG8gPj4+IDggJiAyNTUpLCByLnB1c2gobyAmIDI1NSksIHIgPSByLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChpKSk7XG4gICAgY29uc3QgYSA9IFguYm94KFgudHlwZXMuYXZjQywgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMSxcbiAgICAgIC8vIHZlcnNpb25cbiAgICAgIHRbM10sXG4gICAgICAvLyBwcm9maWxlXG4gICAgICB0WzRdLFxuICAgICAgLy8gcHJvZmlsZSBjb21wYXRcbiAgICAgIHRbNV0sXG4gICAgICAvLyBsZXZlbFxuICAgICAgMjU1LFxuICAgICAgLy8gbGVuZ3RoU2l6ZU1pbnVzT25lLCBoYXJkLWNvZGVkIHRvIDQgYnl0ZXNcbiAgICAgIDIyNCB8IGUuc3BzLmxlbmd0aFxuICAgICAgLy8gM2JpdCByZXNlcnZlZCAoMTExKSArIG51bU9mU2VxdWVuY2VQYXJhbWV0ZXJTZXRzXG4gICAgXS5jb25jYXQodCkuY29uY2F0KFtcbiAgICAgIGUucHBzLmxlbmd0aFxuICAgICAgLy8gbnVtT2ZQaWN0dXJlUGFyYW1ldGVyU2V0c1xuICAgIF0pLmNvbmNhdChyKSkpLCBsID0gZS53aWR0aCwgYyA9IGUuaGVpZ2h0LCB1ID0gZS5waXhlbFJhdGlvWzBdLCBkID0gZS5waXhlbFJhdGlvWzFdO1xuICAgIHJldHVybiBYLmJveChcbiAgICAgIFgudHlwZXMuYXZjMSxcbiAgICAgIG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgICAgMCxcbiAgICAgICAgMSxcbiAgICAgICAgLy8gZGF0YV9yZWZlcmVuY2VfaW5kZXhcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gcHJlX2RlZmluZWRcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gcmVzZXJ2ZWRcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gcHJlX2RlZmluZWRcbiAgICAgICAgbCA+PiA4ICYgMjU1LFxuICAgICAgICBsICYgMjU1LFxuICAgICAgICAvLyB3aWR0aFxuICAgICAgICBjID4+IDggJiAyNTUsXG4gICAgICAgIGMgJiAyNTUsXG4gICAgICAgIC8vIGhlaWdodFxuICAgICAgICAwLFxuICAgICAgICA3MixcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gaG9yaXpyZXNvbHV0aW9uXG4gICAgICAgIDAsXG4gICAgICAgIDcyLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyB2ZXJ0cmVzb2x1dGlvblxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyByZXNlcnZlZFxuICAgICAgICAwLFxuICAgICAgICAxLFxuICAgICAgICAvLyBmcmFtZV9jb3VudFxuICAgICAgICAxOCxcbiAgICAgICAgMTAwLFxuICAgICAgICA5NyxcbiAgICAgICAgMTA1LFxuICAgICAgICAxMDgsXG4gICAgICAgIC8vIGRhaWx5bW90aW9uL2hscy5qc1xuICAgICAgICAxMjEsXG4gICAgICAgIDEwOSxcbiAgICAgICAgMTExLFxuICAgICAgICAxMTYsXG4gICAgICAgIDEwNSxcbiAgICAgICAgMTExLFxuICAgICAgICAxMTAsXG4gICAgICAgIDQ3LFxuICAgICAgICAxMDQsXG4gICAgICAgIDEwOCxcbiAgICAgICAgMTE1LFxuICAgICAgICA0NixcbiAgICAgICAgMTA2LFxuICAgICAgICAxMTUsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIC8vIGNvbXByZXNzb3JuYW1lXG4gICAgICAgIDAsXG4gICAgICAgIDI0LFxuICAgICAgICAvLyBkZXB0aCA9IDI0XG4gICAgICAgIDE3LFxuICAgICAgICAxN1xuICAgICAgXSksXG4gICAgICAvLyBwcmVfZGVmaW5lZCA9IC0xXG4gICAgICBhLFxuICAgICAgWC5ib3goWC50eXBlcy5idHJ0LCBuZXcgVWludDhBcnJheShbXG4gICAgICAgIDAsXG4gICAgICAgIDI4LFxuICAgICAgICAxNTYsXG4gICAgICAgIDEyOCxcbiAgICAgICAgLy8gYnVmZmVyU2l6ZURCXG4gICAgICAgIDAsXG4gICAgICAgIDQ1LFxuICAgICAgICAxOTgsXG4gICAgICAgIDE5MixcbiAgICAgICAgLy8gbWF4Qml0cmF0ZVxuICAgICAgICAwLFxuICAgICAgICA0NSxcbiAgICAgICAgMTk4LFxuICAgICAgICAxOTJcbiAgICAgIF0pKSxcbiAgICAgIC8vIGF2Z0JpdHJhdGVcbiAgICAgIFguYm94KFgudHlwZXMucGFzcCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICB1ID4+IDI0LFxuICAgICAgICAvLyBoU3BhY2luZ1xuICAgICAgICB1ID4+IDE2ICYgMjU1LFxuICAgICAgICB1ID4+IDggJiAyNTUsXG4gICAgICAgIHUgJiAyNTUsXG4gICAgICAgIGQgPj4gMjQsXG4gICAgICAgIC8vIHZTcGFjaW5nXG4gICAgICAgIGQgPj4gMTYgJiAyNTUsXG4gICAgICAgIGQgPj4gOCAmIDI1NSxcbiAgICAgICAgZCAmIDI1NVxuICAgICAgXSkpXG4gICAgKTtcbiAgfVxuICBzdGF0aWMgZXNkcyhlKSB7XG4gICAgY29uc3QgdCA9IGUuY29uZmlnO1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShbXG4gICAgICAwLFxuICAgICAgLy8gdmVyc2lvbiAwXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBmbGFnc1xuICAgICAgMyxcbiAgICAgIC8vIGRlc2NyaXB0b3JfdHlwZVxuICAgICAgMjUsXG4gICAgICAvLyBsZW5ndGhcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICAgLy8gZXNfaWRcbiAgICAgIDAsXG4gICAgICAvLyBzdHJlYW1fcHJpb3JpdHlcbiAgICAgIDQsXG4gICAgICAvLyBkZXNjcmlwdG9yX3R5cGVcbiAgICAgIDE3LFxuICAgICAgLy8gbGVuZ3RoXG4gICAgICA2NCxcbiAgICAgIC8vIGNvZGVjIDogbXBlZzRfYXVkaW9cbiAgICAgIDIxLFxuICAgICAgLy8gc3RyZWFtX3R5cGVcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIGJ1ZmZlcl9zaXplXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gbWF4Qml0cmF0ZVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIGF2Z0JpdHJhdGVcbiAgICAgIDUsXG4gICAgICAvLyBkZXNjcmlwdG9yX3R5cGVcbiAgICAgIDIsXG4gICAgICAvLyBsZW5ndGhcbiAgICAgIC4uLnQsXG4gICAgICA2LFxuICAgICAgMSxcbiAgICAgIDJcbiAgICAgIC8vIEdBU3BlY2lmaWNDb25maWcpKTsgLy8gbGVuZ3RoICsgYXVkaW8gY29uZmlnIGRlc2NyaXB0b3JcbiAgICBdKTtcbiAgfVxuICBzdGF0aWMgYXVkaW9TdHNkKGUpIHtcbiAgICBjb25zdCB0ID0gZS5zYW1wbGVyYXRlIHx8IDA7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHJlc2VydmVkXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAvLyBkYXRhX3JlZmVyZW5jZV9pbmRleFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIGUuY2hhbm5lbENvdW50IHx8IDAsXG4gICAgICAvLyBjaGFubmVsY291bnRcbiAgICAgIDAsXG4gICAgICAxNixcbiAgICAgIC8vIHNhbXBsZVNpemU6MTZiaXRzXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gcmVzZXJ2ZWQyXG4gICAgICB0ID4+IDggJiAyNTUsXG4gICAgICB0ICYgMjU1LFxuICAgICAgLy9cbiAgICAgIDAsXG4gICAgICAwXG4gICAgXSk7XG4gIH1cbiAgc3RhdGljIG1wNGEoZSkge1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzLm1wNGEsIFguYXVkaW9TdHNkKGUpLCBYLmJveChYLnR5cGVzLmVzZHMsIFguZXNkcyhlKSkpO1xuICB9XG4gIHN0YXRpYyBtcDMoZSkge1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzW1wiLm1wM1wiXSwgWC5hdWRpb1N0c2QoZSkpO1xuICB9XG4gIHN0YXRpYyBhYzMoZSkge1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzW1wiYWMtM1wiXSwgWC5hdWRpb1N0c2QoZSksIFguYm94KFgudHlwZXMuZGFjMywgZS5jb25maWcpKTtcbiAgfVxuICBzdGF0aWMgc3RzZChlKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2VnbWVudENvZGVjOiB0XG4gICAgfSA9IGU7XG4gICAgaWYgKGUudHlwZSA9PT0gXCJhdWRpb1wiKSB7XG4gICAgICBpZiAodCA9PT0gXCJhYWNcIilcbiAgICAgICAgcmV0dXJuIFguYm94KFgudHlwZXMuc3RzZCwgWC5TVFNELCBYLm1wNGEoZSkpO1xuICAgICAgaWYgKHQgPT09IFwiYWMzXCIgJiYgZS5jb25maWcpXG4gICAgICAgIHJldHVybiBYLmJveChYLnR5cGVzLnN0c2QsIFguU1RTRCwgWC5hYzMoZSkpO1xuICAgICAgaWYgKHQgPT09IFwibXAzXCIgJiYgZS5jb2RlYyA9PT0gXCJtcDNcIilcbiAgICAgICAgcmV0dXJuIFguYm94KFgudHlwZXMuc3RzZCwgWC5TVFNELCBYLm1wMyhlKSk7XG4gICAgfSBlbHNlIGlmIChlLnBwcyAmJiBlLnNwcykge1xuICAgICAgaWYgKHQgPT09IFwiYXZjXCIpXG4gICAgICAgIHJldHVybiBYLmJveChYLnR5cGVzLnN0c2QsIFguU1RTRCwgWC5hdmMxKGUpKTtcbiAgICAgIGlmICh0ID09PSBcImhldmNcIiAmJiBlLnZwcylcbiAgICAgICAgcmV0dXJuIFguYm94KFgudHlwZXMuc3RzZCwgWC5TVFNELCBYLmh2YzEoZSkpO1xuICAgIH0gZWxzZVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidmlkZW8gdHJhY2sgbWlzc2luZyBwcHMgb3Igc3BzXCIpO1xuICAgIHRocm93IG5ldyBFcnJvcihgdW5zdXBwb3J0ZWQgJHtlLnR5cGV9IHNlZ21lbnQgY29kZWMgKCR7dH0vJHtlLmNvZGVjfSlgKTtcbiAgfVxuICBzdGF0aWMgdGtoZChlKSB7XG4gICAgY29uc3QgdCA9IGUuaWQsIHIgPSAoZS5kdXJhdGlvbiB8fCAwKSAqIChlLnRpbWVzY2FsZSB8fCAwKSwgbiA9IGUud2lkdGggfHwgMCwgaSA9IGUuaGVpZ2h0IHx8IDAsIG8gPSBNYXRoLmZsb29yKHIgLyAoU3MgKyAxKSksIGEgPSBNYXRoLmZsb29yKHIgJSAoU3MgKyAxKSk7XG4gICAgcmV0dXJuIFguYm94KFgudHlwZXMudGtoZCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgMSxcbiAgICAgIC8vIHZlcnNpb24gMVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICA3LFxuICAgICAgLy8gZmxhZ3NcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAyLFxuICAgICAgLy8gY3JlYXRpb25fdGltZVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDMsXG4gICAgICAvLyBtb2RpZmljYXRpb25fdGltZVxuICAgICAgdCA+PiAyNCAmIDI1NSxcbiAgICAgIHQgPj4gMTYgJiAyNTUsXG4gICAgICB0ID4+IDggJiAyNTUsXG4gICAgICB0ICYgMjU1LFxuICAgICAgLy8gdHJhY2tfSURcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgbyA+PiAyNCxcbiAgICAgIG8gPj4gMTYgJiAyNTUsXG4gICAgICBvID4+IDggJiAyNTUsXG4gICAgICBvICYgMjU1LFxuICAgICAgYSA+PiAyNCxcbiAgICAgIGEgPj4gMTYgJiAyNTUsXG4gICAgICBhID4+IDggJiAyNTUsXG4gICAgICBhICYgMjU1LFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBsYXllclxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBhbHRlcm5hdGVfZ3JvdXBcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gbm9uLWF1ZGlvIHRyYWNrIHZvbHVtZVxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyByZXNlcnZlZFxuICAgICAgMCxcbiAgICAgIDEsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAxLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICA2NCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHRyYW5zZm9ybWF0aW9uOiB1bml0eSBtYXRyaXhcbiAgICAgIG4gPj4gOCAmIDI1NSxcbiAgICAgIG4gJiAyNTUsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIHdpZHRoXG4gICAgICBpID4+IDggJiAyNTUsXG4gICAgICBpICYgMjU1LFxuICAgICAgMCxcbiAgICAgIDBcbiAgICAgIC8vIGhlaWdodFxuICAgIF0pKTtcbiAgfVxuICBzdGF0aWMgdHJhZihlLCB0KSB7XG4gICAgY29uc3QgciA9IFguc2R0cChlKSwgbiA9IGUuaWQsIGkgPSBNYXRoLmZsb29yKHQgLyAoU3MgKyAxKSksIG8gPSBNYXRoLmZsb29yKHQgJSAoU3MgKyAxKSk7XG4gICAgcmV0dXJuIFguYm94KFxuICAgICAgWC50eXBlcy50cmFmLFxuICAgICAgWC5ib3goWC50eXBlcy50ZmhkLCBuZXcgVWludDhBcnJheShbXG4gICAgICAgIDAsXG4gICAgICAgIC8vIHZlcnNpb24gMFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyBmbGFnc1xuICAgICAgICBuID4+IDI0LFxuICAgICAgICBuID4+IDE2ICYgMjU1LFxuICAgICAgICBuID4+IDggJiAyNTUsXG4gICAgICAgIG4gJiAyNTVcbiAgICAgICAgLy8gdHJhY2tfSURcbiAgICAgIF0pKSxcbiAgICAgIFguYm94KFgudHlwZXMudGZkdCwgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAxLFxuICAgICAgICAvLyB2ZXJzaW9uIDFcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gZmxhZ3NcbiAgICAgICAgaSA+PiAyNCxcbiAgICAgICAgaSA+PiAxNiAmIDI1NSxcbiAgICAgICAgaSA+PiA4ICYgMjU1LFxuICAgICAgICBpICYgMjU1LFxuICAgICAgICBvID4+IDI0LFxuICAgICAgICBvID4+IDE2ICYgMjU1LFxuICAgICAgICBvID4+IDggJiAyNTUsXG4gICAgICAgIG8gJiAyNTVcbiAgICAgIF0pKSxcbiAgICAgIFgudHJ1bihlLCByLmxlbmd0aCArIDE2ICsgLy8gdGZoZFxuICAgICAgMjAgKyAvLyB0ZmR0XG4gICAgICA4ICsgLy8gdHJhZiBoZWFkZXJcbiAgICAgIDE2ICsgLy8gbWZoZFxuICAgICAgOCArIC8vIG1vb2YgaGVhZGVyXG4gICAgICA4KSxcbiAgICAgIC8vIG1kYXQgaGVhZGVyXG4gICAgICByXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGUgYSB0cmFjayBib3guXG4gICAqIEBwYXJhbSB0cmFjayBhIHRyYWNrIGRlZmluaXRpb25cbiAgICovXG4gIHN0YXRpYyB0cmFrKGUpIHtcbiAgICByZXR1cm4gZS5kdXJhdGlvbiA9IGUuZHVyYXRpb24gfHwgNDI5NDk2NzI5NSwgWC5ib3goWC50eXBlcy50cmFrLCBYLnRraGQoZSksIFgubWRpYShlKSk7XG4gIH1cbiAgc3RhdGljIHRyZXgoZSkge1xuICAgIGNvbnN0IHQgPSBlLmlkO1xuICAgIHJldHVybiBYLmJveChYLnR5cGVzLnRyZXgsIG5ldyBVaW50OEFycmF5KFtcbiAgICAgIDAsXG4gICAgICAvLyB2ZXJzaW9uIDBcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIC8vIGZsYWdzXG4gICAgICB0ID4+IDI0LFxuICAgICAgdCA+PiAxNiAmIDI1NSxcbiAgICAgIHQgPj4gOCAmIDI1NSxcbiAgICAgIHQgJiAyNTUsXG4gICAgICAvLyB0cmFja19JRFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMSxcbiAgICAgIC8vIGRlZmF1bHRfc2FtcGxlX2Rlc2NyaXB0aW9uX2luZGV4XG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgLy8gZGVmYXVsdF9zYW1wbGVfZHVyYXRpb25cbiAgICAgIDAsXG4gICAgICAwLFxuICAgICAgMCxcbiAgICAgIDAsXG4gICAgICAvLyBkZWZhdWx0X3NhbXBsZV9zaXplXG4gICAgICAwLFxuICAgICAgMSxcbiAgICAgIDAsXG4gICAgICAxXG4gICAgICAvLyBkZWZhdWx0X3NhbXBsZV9mbGFnc1xuICAgIF0pKTtcbiAgfVxuICBzdGF0aWMgdHJ1bihlLCB0KSB7XG4gICAgY29uc3QgciA9IGUuc2FtcGxlcyB8fCBbXSwgbiA9IHIubGVuZ3RoLCBpID0gMTIgKyAxNiAqIG4sIG8gPSBuZXcgVWludDhBcnJheShpKTtcbiAgICBsZXQgYSwgbCwgYywgdSwgZCwgaDtcbiAgICBmb3IgKHQgKz0gOCArIGksIG8uc2V0KFtcbiAgICAgIGUudHlwZSA9PT0gXCJ2aWRlb1wiID8gMSA6IDAsXG4gICAgICAvLyB2ZXJzaW9uIDEgZm9yIHZpZGVvIHdpdGggc2lnbmVkLWludCBzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRcbiAgICAgIDAsXG4gICAgICAxNSxcbiAgICAgIDEsXG4gICAgICAvLyBmbGFnc1xuICAgICAgbiA+Pj4gMjQgJiAyNTUsXG4gICAgICBuID4+PiAxNiAmIDI1NSxcbiAgICAgIG4gPj4+IDggJiAyNTUsXG4gICAgICBuICYgMjU1LFxuICAgICAgLy8gc2FtcGxlX2NvdW50XG4gICAgICB0ID4+PiAyNCAmIDI1NSxcbiAgICAgIHQgPj4+IDE2ICYgMjU1LFxuICAgICAgdCA+Pj4gOCAmIDI1NSxcbiAgICAgIHQgJiAyNTVcbiAgICAgIC8vIGRhdGFfb2Zmc2V0XG4gICAgXSwgMCksIGEgPSAwOyBhIDwgbjsgYSsrKVxuICAgICAgbCA9IHJbYV0sIGMgPSBsLmR1cmF0aW9uLCB1ID0gbC5zaXplLCBkID0gbC5mbGFncywgaCA9IGwuY3RzLCBvLnNldChbXG4gICAgICAgIGMgPj4+IDI0ICYgMjU1LFxuICAgICAgICBjID4+PiAxNiAmIDI1NSxcbiAgICAgICAgYyA+Pj4gOCAmIDI1NSxcbiAgICAgICAgYyAmIDI1NSxcbiAgICAgICAgLy8gc2FtcGxlX2R1cmF0aW9uXG4gICAgICAgIHUgPj4+IDI0ICYgMjU1LFxuICAgICAgICB1ID4+PiAxNiAmIDI1NSxcbiAgICAgICAgdSA+Pj4gOCAmIDI1NSxcbiAgICAgICAgdSAmIDI1NSxcbiAgICAgICAgLy8gc2FtcGxlX3NpemVcbiAgICAgICAgZC5pc0xlYWRpbmcgPDwgMiB8IGQuZGVwZW5kc09uLFxuICAgICAgICBkLmlzRGVwZW5kZWRPbiA8PCA2IHwgZC5oYXNSZWR1bmRhbmN5IDw8IDQgfCBkLnBhZGRpbmdWYWx1ZSA8PCAxIHwgZC5pc05vblN5bmMsXG4gICAgICAgIGQuZGVncmFkUHJpbyAmIDYxNDQwLFxuICAgICAgICBkLmRlZ3JhZFByaW8gJiAxNSxcbiAgICAgICAgLy8gc2FtcGxlX2ZsYWdzXG4gICAgICAgIGggPj4+IDI0ICYgMjU1LFxuICAgICAgICBoID4+PiAxNiAmIDI1NSxcbiAgICAgICAgaCA+Pj4gOCAmIDI1NSxcbiAgICAgICAgaCAmIDI1NVxuICAgICAgICAvLyBzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXRcbiAgICAgIF0sIDEyICsgMTYgKiBhKTtcbiAgICByZXR1cm4gWC5ib3goWC50eXBlcy50cnVuLCBvKTtcbiAgfVxuICBzdGF0aWMgaW5pdFNlZ21lbnQoZSkge1xuICAgIFgudHlwZXMgfHwgWC5pbml0KCk7XG4gICAgY29uc3QgdCA9IFgubW9vdihlKTtcbiAgICByZXR1cm4gX3IoWC5GVFlQLCB0KTtcbiAgfVxuICBzdGF0aWMgaHZjMShlKSB7XG4gICAgY29uc3QgdCA9IGUucGFyYW1zLCByID0gW2UudnBzLCBlLnNwcywgZS5wcHNdLCBuID0gNCwgaSA9IG5ldyBVaW50OEFycmF5KFsxLCB0LmdlbmVyYWxfcHJvZmlsZV9zcGFjZSA8PCA2IHwgKHQuZ2VuZXJhbF90aWVyX2ZsYWcgPyAzMiA6IDApIHwgdC5nZW5lcmFsX3Byb2ZpbGVfaWRjLCB0LmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzWzBdLCB0LmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzWzFdLCB0LmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzWzJdLCB0LmdlbmVyYWxfcHJvZmlsZV9jb21wYXRpYmlsaXR5X2ZsYWdzWzNdLCB0LmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JfZmxhZ3NbMF0sIHQuZ2VuZXJhbF9jb25zdHJhaW50X2luZGljYXRvcl9mbGFnc1sxXSwgdC5nZW5lcmFsX2NvbnN0cmFpbnRfaW5kaWNhdG9yX2ZsYWdzWzJdLCB0LmdlbmVyYWxfY29uc3RyYWludF9pbmRpY2F0b3JfZmxhZ3NbM10sIHQuZ2VuZXJhbF9jb25zdHJhaW50X2luZGljYXRvcl9mbGFnc1s0XSwgdC5nZW5lcmFsX2NvbnN0cmFpbnRfaW5kaWNhdG9yX2ZsYWdzWzVdLCB0LmdlbmVyYWxfbGV2ZWxfaWRjLCAyNDAgfCB0Lm1pbl9zcGF0aWFsX3NlZ21lbnRhdGlvbl9pZGMgPj4gOCwgMjU1ICYgdC5taW5fc3BhdGlhbF9zZWdtZW50YXRpb25faWRjLCAyNTIgfCB0LnBhcmFsbGVsaXNtVHlwZSwgMjUyIHwgdC5jaHJvbWFfZm9ybWF0X2lkYywgMjQ4IHwgdC5iaXRfZGVwdGhfbHVtYV9taW51czgsIDI0OCB8IHQuYml0X2RlcHRoX2Nocm9tYV9taW51czgsIDAsIHBhcnNlSW50KHQuZnJhbWVfcmF0ZS5mcHMpLCBuIC0gMSB8IHQudGVtcG9yYWxfaWRfbmVzdGVkIDw8IDIgfCB0Lm51bV90ZW1wb3JhbF9sYXllcnMgPDwgMyB8ICh0LmZyYW1lX3JhdGUuZml4ZWQgPyA2NCA6IDApLCByLmxlbmd0aF0pO1xuICAgIGxldCBvID0gaS5sZW5ndGg7XG4gICAgZm9yIChsZXQgcCA9IDA7IHAgPCByLmxlbmd0aDsgcCArPSAxKSB7XG4gICAgICBvICs9IDM7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHJbcF0ubGVuZ3RoOyB5ICs9IDEpXG4gICAgICAgIG8gKz0gMiArIHJbcF1beV0ubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBhID0gbmV3IFVpbnQ4QXJyYXkobyk7XG4gICAgYS5zZXQoaSwgMCksIG8gPSBpLmxlbmd0aDtcbiAgICBjb25zdCBsID0gci5sZW5ndGggLSAxO1xuICAgIGZvciAobGV0IHAgPSAwOyBwIDwgci5sZW5ndGg7IHAgKz0gMSkge1xuICAgICAgYS5zZXQobmV3IFVpbnQ4QXJyYXkoWzMyICsgcCB8IChwID09PSBsID8gMTI4IDogMCksIDAsIHJbcF0ubGVuZ3RoXSksIG8pLCBvICs9IDM7XG4gICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IHJbcF0ubGVuZ3RoOyB5ICs9IDEpXG4gICAgICAgIGEuc2V0KG5ldyBVaW50OEFycmF5KFtyW3BdW3ldLmxlbmd0aCA+PiA4LCByW3BdW3ldLmxlbmd0aCAmIDI1NV0pLCBvKSwgbyArPSAyLCBhLnNldChyW3BdW3ldLCBvKSwgbyArPSByW3BdW3ldLmxlbmd0aDtcbiAgICB9XG4gICAgY29uc3QgYyA9IFguYm94KFgudHlwZXMuaHZjQywgYSksIHUgPSBlLndpZHRoLCBkID0gZS5oZWlnaHQsIGggPSBlLnBpeGVsUmF0aW9bMF0sIGYgPSBlLnBpeGVsUmF0aW9bMV07XG4gICAgcmV0dXJuIFguYm94KFxuICAgICAgWC50eXBlcy5odmMxLFxuICAgICAgbmV3IFVpbnQ4QXJyYXkoW1xuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyByZXNlcnZlZFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyByZXNlcnZlZFxuICAgICAgICAwLFxuICAgICAgICAxLFxuICAgICAgICAvLyBkYXRhX3JlZmVyZW5jZV9pbmRleFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyBwcmVfZGVmaW5lZFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyByZXNlcnZlZFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyBwcmVfZGVmaW5lZFxuICAgICAgICB1ID4+IDggJiAyNTUsXG4gICAgICAgIHUgJiAyNTUsXG4gICAgICAgIC8vIHdpZHRoXG4gICAgICAgIGQgPj4gOCAmIDI1NSxcbiAgICAgICAgZCAmIDI1NSxcbiAgICAgICAgLy8gaGVpZ2h0XG4gICAgICAgIDAsXG4gICAgICAgIDcyLFxuICAgICAgICAwLFxuICAgICAgICAwLFxuICAgICAgICAvLyBob3JpenJlc29sdXRpb25cbiAgICAgICAgMCxcbiAgICAgICAgNzIsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIC8vIHZlcnRyZXNvbHV0aW9uXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIDAsXG4gICAgICAgIC8vIHJlc2VydmVkXG4gICAgICAgIDAsXG4gICAgICAgIDEsXG4gICAgICAgIC8vIGZyYW1lX2NvdW50XG4gICAgICAgIDE4LFxuICAgICAgICAxMDAsXG4gICAgICAgIDk3LFxuICAgICAgICAxMDUsXG4gICAgICAgIDEwOCxcbiAgICAgICAgLy8gZGFpbHltb3Rpb24vaGxzLmpzXG4gICAgICAgIDEyMSxcbiAgICAgICAgMTA5LFxuICAgICAgICAxMTEsXG4gICAgICAgIDExNixcbiAgICAgICAgMTA1LFxuICAgICAgICAxMTEsXG4gICAgICAgIDExMCxcbiAgICAgICAgNDcsXG4gICAgICAgIDEwNCxcbiAgICAgICAgMTA4LFxuICAgICAgICAxMTUsXG4gICAgICAgIDQ2LFxuICAgICAgICAxMDYsXG4gICAgICAgIDExNSxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgMCxcbiAgICAgICAgLy8gY29tcHJlc3Nvcm5hbWVcbiAgICAgICAgMCxcbiAgICAgICAgMjQsXG4gICAgICAgIC8vIGRlcHRoID0gMjRcbiAgICAgICAgMTcsXG4gICAgICAgIDE3XG4gICAgICBdKSxcbiAgICAgIC8vIHByZV9kZWZpbmVkID0gLTFcbiAgICAgIGMsXG4gICAgICBYLmJveChYLnR5cGVzLmJ0cnQsIG5ldyBVaW50OEFycmF5KFtcbiAgICAgICAgMCxcbiAgICAgICAgMjgsXG4gICAgICAgIDE1NixcbiAgICAgICAgMTI4LFxuICAgICAgICAvLyBidWZmZXJTaXplREJcbiAgICAgICAgMCxcbiAgICAgICAgNDUsXG4gICAgICAgIDE5OCxcbiAgICAgICAgMTkyLFxuICAgICAgICAvLyBtYXhCaXRyYXRlXG4gICAgICAgIDAsXG4gICAgICAgIDQ1LFxuICAgICAgICAxOTgsXG4gICAgICAgIDE5MlxuICAgICAgXSkpLFxuICAgICAgLy8gYXZnQml0cmF0ZVxuICAgICAgWC5ib3goWC50eXBlcy5wYXNwLCBuZXcgVWludDhBcnJheShbXG4gICAgICAgIGggPj4gMjQsXG4gICAgICAgIC8vIGhTcGFjaW5nXG4gICAgICAgIGggPj4gMTYgJiAyNTUsXG4gICAgICAgIGggPj4gOCAmIDI1NSxcbiAgICAgICAgaCAmIDI1NSxcbiAgICAgICAgZiA+PiAyNCxcbiAgICAgICAgLy8gdlNwYWNpbmdcbiAgICAgICAgZiA+PiAxNiAmIDI1NSxcbiAgICAgICAgZiA+PiA4ICYgMjU1LFxuICAgICAgICBmICYgMjU1XG4gICAgICBdKSlcbiAgICApO1xuICB9XG59XG5YLnR5cGVzID0gdm9pZCAwO1xuWC5IRExSX1RZUEVTID0gdm9pZCAwO1xuWC5TVFRTID0gdm9pZCAwO1xuWC5TVFNDID0gdm9pZCAwO1xuWC5TVENPID0gdm9pZCAwO1xuWC5TVFNaID0gdm9pZCAwO1xuWC5WTUhEID0gdm9pZCAwO1xuWC5TTUhEID0gdm9pZCAwO1xuWC5TVFNEID0gdm9pZCAwO1xuWC5GVFlQID0gdm9pZCAwO1xuWC5ESU5GID0gdm9pZCAwO1xuY29uc3QgU3AgPSA5ZTQ7XG5mdW5jdGlvbiBDdShzLCBlLCB0ID0gMSwgciA9ICExKSB7XG4gIGNvbnN0IG4gPSBzICogZSAqIHQ7XG4gIHJldHVybiByID8gTWF0aC5yb3VuZChuKSA6IG47XG59XG5mdW5jdGlvbiBxVChzLCBlLCB0ID0gMSwgciA9ICExKSB7XG4gIHJldHVybiBDdShzLCBlLCAxIC8gdCwgcik7XG59XG5mdW5jdGlvbiBxbihzLCBlID0gITEpIHtcbiAgcmV0dXJuIEN1KHMsIDFlMywgMSAvIFNwLCBlKTtcbn1cbmZ1bmN0aW9uIFdUKHMsIGUgPSAxKSB7XG4gIHJldHVybiBDdShzLCBTcCwgMSAvIGUpO1xufVxuY29uc3QgelQgPSAxMCAqIDFlMywgWVQgPSAxMDI0LCBaVCA9IDExNTIsIFhUID0gMTUzNjtcbmxldCBwbiA9IG51bGwsIEVsID0gbnVsbDtcbmZ1bmN0aW9uIFVoKHMsIGUsIHQsIHIpIHtcbiAgcmV0dXJuIHtcbiAgICBkdXJhdGlvbjogZSxcbiAgICBzaXplOiB0LFxuICAgIGN0czogcixcbiAgICBmbGFnczoge1xuICAgICAgaXNMZWFkaW5nOiAwLFxuICAgICAgaXNEZXBlbmRlZE9uOiAwLFxuICAgICAgaGFzUmVkdW5kYW5jeTogMCxcbiAgICAgIGRlZ3JhZFByaW86IDAsXG4gICAgICBkZXBlbmRzT246IHMgPyAyIDogMSxcbiAgICAgIGlzTm9uU3luYzogcyA/IDAgOiAxXG4gICAgfVxuICB9O1xufVxuY2xhc3MgbW8gZXh0ZW5kcyBMciB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4pIHtcbiAgICBpZiAoc3VwZXIoXCJtcDQtcmVtdXhlclwiLCBuKSwgdGhpcy5vYnNlcnZlciA9IHZvaWQgMCwgdGhpcy5jb25maWcgPSB2b2lkIDAsIHRoaXMudHlwZVN1cHBvcnRlZCA9IHZvaWQgMCwgdGhpcy5JU0dlbmVyYXRlZCA9ICExLCB0aGlzLl9pbml0UFRTID0gbnVsbCwgdGhpcy5faW5pdERUUyA9IG51bGwsIHRoaXMubmV4dFZpZGVvVHMgPSBudWxsLCB0aGlzLm5leHRBdWRpb1RzID0gbnVsbCwgdGhpcy52aWRlb1NhbXBsZUR1cmF0aW9uID0gbnVsbCwgdGhpcy5pc0F1ZGlvQ29udGlndW91cyA9ICExLCB0aGlzLmlzVmlkZW9Db250aWd1b3VzID0gITEsIHRoaXMudmlkZW9UcmFja0NvbmZpZyA9IHZvaWQgMCwgdGhpcy5vYnNlcnZlciA9IGUsIHRoaXMuY29uZmlnID0gdCwgdGhpcy50eXBlU3VwcG9ydGVkID0gciwgdGhpcy5JU0dlbmVyYXRlZCA9ICExLCBwbiA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgbyA9IChuYXZpZ2F0b3IudXNlckFnZW50IHx8IFwiXCIpLm1hdGNoKC9DaHJvbWVcXC8oXFxkKykvaSk7XG4gICAgICBwbiA9IG8gPyBwYXJzZUludChvWzFdKSA6IDA7XG4gICAgfVxuICAgIGlmIChFbCA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgaSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1NhZmFyaVxcLyhcXGQrKS9pKTtcbiAgICAgIEVsID0gaSA/IHBhcnNlSW50KGlbMV0pIDogMDtcbiAgICB9XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMudmlkZW9UcmFja0NvbmZpZyA9IHRoaXMuX2luaXRQVFMgPSB0aGlzLl9pbml0RFRTID0gbnVsbDtcbiAgfVxuICByZXNldFRpbWVTdGFtcChlKSB7XG4gICAgdGhpcy5sb2coXCJpbml0UFRTICYgaW5pdERUUyByZXNldFwiKSwgdGhpcy5faW5pdFBUUyA9IHRoaXMuX2luaXREVFMgPSBlO1xuICB9XG4gIHJlc2V0TmV4dFRpbWVzdGFtcCgpIHtcbiAgICB0aGlzLmxvZyhcInJlc2V0IG5leHQgdGltZXN0YW1wXCIpLCB0aGlzLmlzVmlkZW9Db250aWd1b3VzID0gITEsIHRoaXMuaXNBdWRpb0NvbnRpZ3VvdXMgPSAhMTtcbiAgfVxuICByZXNldEluaXRTZWdtZW50KCkge1xuICAgIHRoaXMubG9nKFwiSVNHZW5lcmF0ZWQgZmxhZyByZXNldFwiKSwgdGhpcy5JU0dlbmVyYXRlZCA9ICExLCB0aGlzLnZpZGVvVHJhY2tDb25maWcgPSB2b2lkIDA7XG4gIH1cbiAgZ2V0VmlkZW9TdGFydFB0cyhlKSB7XG4gICAgbGV0IHQgPSAhMTtcbiAgICBjb25zdCByID0gZVswXS5wdHMsIG4gPSBlLnJlZHVjZSgoaSwgbykgPT4ge1xuICAgICAgbGV0IGEgPSBvLnB0cywgbCA9IGEgLSBpO1xuICAgICAgcmV0dXJuIGwgPCAtNDI5NDk2NzI5NiAmJiAodCA9ICEwLCBhID0gQXIoYSwgciksIGwgPSBhIC0gaSksIGwgPiAwID8gaSA6IGE7XG4gICAgfSwgcik7XG4gICAgcmV0dXJuIHQgJiYgdGhpcy5kZWJ1ZyhcIlBUUyByb2xsb3ZlciBkZXRlY3RlZFwiKSwgbjtcbiAgfVxuICByZW11eChlLCB0LCByLCBuLCBpLCBvLCBhLCBsKSB7XG4gICAgbGV0IGMsIHUsIGQsIGgsIGYsIHAsIHkgPSBpLCBFID0gaTtcbiAgICBjb25zdCBiID0gZS5waWQgPiAtMSwgUiA9IHQucGlkID4gLTEsIEEgPSB0LnNhbXBsZXMubGVuZ3RoLCBGID0gZS5zYW1wbGVzLmxlbmd0aCA+IDAsIE0gPSBhICYmIEEgPiAwIHx8IEEgPiAxO1xuICAgIGlmICgoIWIgfHwgRikgJiYgKCFSIHx8IE0pIHx8IHRoaXMuSVNHZW5lcmF0ZWQgfHwgYSkge1xuICAgICAgaWYgKHRoaXMuSVNHZW5lcmF0ZWQpIHtcbiAgICAgICAgdmFyIEssIGosIEMsIGs7XG4gICAgICAgIGNvbnN0IGcgPSB0aGlzLnZpZGVvVHJhY2tDb25maWc7XG4gICAgICAgIChnICYmICh0LndpZHRoICE9PSBnLndpZHRoIHx8IHQuaGVpZ2h0ICE9PSBnLmhlaWdodCB8fCAoKEsgPSB0LnBpeGVsUmF0aW8pID09IG51bGwgPyB2b2lkIDAgOiBLWzBdKSAhPT0gKChqID0gZy5waXhlbFJhdGlvKSA9PSBudWxsID8gdm9pZCAwIDogalswXSkgfHwgKChDID0gdC5waXhlbFJhdGlvKSA9PSBudWxsID8gdm9pZCAwIDogQ1sxXSkgIT09ICgoayA9IGcucGl4ZWxSYXRpbykgPT0gbnVsbCA/IHZvaWQgMCA6IGtbMV0pKSB8fCAhZyAmJiBNIHx8IHRoaXMubmV4dEF1ZGlvVHMgPT09IG51bGwgJiYgRikgJiYgdGhpcy5yZXNldEluaXRTZWdtZW50KCk7XG4gICAgICB9XG4gICAgICB0aGlzLklTR2VuZXJhdGVkIHx8IChkID0gdGhpcy5nZW5lcmF0ZUlTKGUsIHQsIGksIG8pKTtcbiAgICAgIGNvbnN0ICQgPSB0aGlzLmlzVmlkZW9Db250aWd1b3VzO1xuICAgICAgbGV0IFcgPSAtMSwgXztcbiAgICAgIGlmIChNICYmIChXID0gSlQodC5zYW1wbGVzKSwgISQgJiYgdGhpcy5jb25maWcuZm9yY2VLZXlGcmFtZU9uRGlzY29udGludWl0eSkpXG4gICAgICAgIGlmIChwID0gITAsIFcgPiAwKSB7XG4gICAgICAgICAgdGhpcy53YXJuKGBEcm9wcGVkICR7V30gb3V0IG9mICR7QX0gdmlkZW8gc2FtcGxlcyBkdWUgdG8gYSBtaXNzaW5nIGtleWZyYW1lYCk7XG4gICAgICAgICAgY29uc3QgZyA9IHRoaXMuZ2V0VmlkZW9TdGFydFB0cyh0LnNhbXBsZXMpO1xuICAgICAgICAgIHQuc2FtcGxlcyA9IHQuc2FtcGxlcy5zbGljZShXKSwgdC5kcm9wcGVkICs9IFcsIEUgKz0gKHQuc2FtcGxlc1swXS5wdHMgLSBnKSAvIHQuaW5wdXRUaW1lU2NhbGUsIF8gPSBFO1xuICAgICAgICB9IGVsc2UgVyA9PT0gLTEgJiYgKHRoaXMud2FybihgTm8ga2V5ZnJhbWUgZm91bmQgb3V0IG9mICR7QX0gdmlkZW8gc2FtcGxlc2ApLCBwID0gITEpO1xuICAgICAgaWYgKHRoaXMuSVNHZW5lcmF0ZWQpIHtcbiAgICAgICAgaWYgKEYgJiYgTSkge1xuICAgICAgICAgIGNvbnN0IGcgPSB0aGlzLmdldFZpZGVvU3RhcnRQdHModC5zYW1wbGVzKSwgdyA9IChBcihlLnNhbXBsZXNbMF0ucHRzLCBnKSAtIGcpIC8gdC5pbnB1dFRpbWVTY2FsZTtcbiAgICAgICAgICB5ICs9IE1hdGgubWF4KDAsIHcpLCBFICs9IE1hdGgubWF4KDAsIC13KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRikge1xuICAgICAgICAgIGlmIChlLnNhbXBsZXJhdGUgfHwgKHRoaXMud2FybihcInJlZ2VuZXJhdGUgSW5pdFNlZ21lbnQgYXMgYXVkaW8gZGV0ZWN0ZWRcIiksIGQgPSB0aGlzLmdlbmVyYXRlSVMoZSwgdCwgaSwgbykpLCB1ID0gdGhpcy5yZW11eEF1ZGlvKGUsIHksIHRoaXMuaXNBdWRpb0NvbnRpZ3VvdXMsIG8sIFIgfHwgTSB8fCBsID09PSBwZS5BVURJTyA/IEUgOiB2b2lkIDApLCBNKSB7XG4gICAgICAgICAgICBjb25zdCBnID0gdSA/IHUuZW5kUFRTIC0gdS5zdGFydFBUUyA6IDA7XG4gICAgICAgICAgICB0LmlucHV0VGltZVNjYWxlIHx8ICh0aGlzLndhcm4oXCJyZWdlbmVyYXRlIEluaXRTZWdtZW50IGFzIHZpZGVvIGRldGVjdGVkXCIpLCBkID0gdGhpcy5nZW5lcmF0ZUlTKGUsIHQsIGksIG8pKSwgYyA9IHRoaXMucmVtdXhWaWRlbyh0LCBFLCAkLCBnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBNICYmIChjID0gdGhpcy5yZW11eFZpZGVvKHQsIEUsICQsIDApKTtcbiAgICAgICAgYyAmJiAoYy5maXJzdEtleUZyYW1lID0gVywgYy5pbmRlcGVuZGVudCA9IFcgIT09IC0xLCBjLmZpcnN0S2V5RnJhbWVQVFMgPSBfKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuSVNHZW5lcmF0ZWQgJiYgdGhpcy5faW5pdFBUUyAmJiB0aGlzLl9pbml0RFRTICYmIChyLnNhbXBsZXMubGVuZ3RoICYmIChmID0gYnAociwgaSwgdGhpcy5faW5pdFBUUywgdGhpcy5faW5pdERUUykpLCBuLnNhbXBsZXMubGVuZ3RoICYmIChoID0gVHAobiwgaSwgdGhpcy5faW5pdFBUUykpKSwge1xuICAgICAgYXVkaW86IHUsXG4gICAgICB2aWRlbzogYyxcbiAgICAgIGluaXRTZWdtZW50OiBkLFxuICAgICAgaW5kZXBlbmRlbnQ6IHAsXG4gICAgICB0ZXh0OiBoLFxuICAgICAgaWQzOiBmXG4gICAgfTtcbiAgfVxuICBnZW5lcmF0ZUlTKGUsIHQsIHIsIG4pIHtcbiAgICBjb25zdCBpID0gZS5zYW1wbGVzLCBvID0gdC5zYW1wbGVzLCBhID0gdGhpcy50eXBlU3VwcG9ydGVkLCBsID0ge30sIGMgPSB0aGlzLl9pbml0UFRTO1xuICAgIGxldCB1ID0gIWMgfHwgbiwgZCA9IFwiYXVkaW8vbXA0XCIsIGgsIGYsIHAsIHkgPSAtMTtcbiAgICBpZiAodSAmJiAoaCA9IGYgPSAxIC8gMCksIGUuY29uZmlnICYmIGkubGVuZ3RoKSB7XG4gICAgICBzd2l0Y2ggKGUudGltZXNjYWxlID0gZS5zYW1wbGVyYXRlLCBlLnNlZ21lbnRDb2RlYykge1xuICAgICAgICBjYXNlIFwibXAzXCI6XG4gICAgICAgICAgYS5tcGVnID8gKGQgPSBcImF1ZGlvL21wZWdcIiwgZS5jb2RlYyA9IFwiXCIpIDogYS5tcDMgJiYgKGUuY29kZWMgPSBcIm1wM1wiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImFjM1wiOlxuICAgICAgICAgIGUuY29kZWMgPSBcImFjLTNcIjtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGwuYXVkaW8gPSB7XG4gICAgICAgIGlkOiBcImF1ZGlvXCIsXG4gICAgICAgIGNvbnRhaW5lcjogZCxcbiAgICAgICAgY29kZWM6IGUuY29kZWMsXG4gICAgICAgIGluaXRTZWdtZW50OiBlLnNlZ21lbnRDb2RlYyA9PT0gXCJtcDNcIiAmJiBhLm1wZWcgPyBuZXcgVWludDhBcnJheSgwKSA6IFguaW5pdFNlZ21lbnQoW2VdKSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBjaGFubmVsQ291bnQ6IGUuY2hhbm5lbENvdW50XG4gICAgICAgIH1cbiAgICAgIH0sIHUgJiYgKHkgPSBlLmlkLCBwID0gZS5pbnB1dFRpbWVTY2FsZSwgIWMgfHwgcCAhPT0gYy50aW1lc2NhbGUgPyBoID0gZiA9IGlbMF0ucHRzIC0gTWF0aC5yb3VuZChwICogcikgOiB1ID0gITEpO1xuICAgIH1cbiAgICBpZiAodC5zcHMgJiYgdC5wcHMgJiYgby5sZW5ndGgpIHtcbiAgICAgIGlmICh0LnRpbWVzY2FsZSA9IHQuaW5wdXRUaW1lU2NhbGUsIGwudmlkZW8gPSB7XG4gICAgICAgIGlkOiBcIm1haW5cIixcbiAgICAgICAgY29udGFpbmVyOiBcInZpZGVvL21wNFwiLFxuICAgICAgICBjb2RlYzogdC5jb2RlYyxcbiAgICAgICAgaW5pdFNlZ21lbnQ6IFguaW5pdFNlZ21lbnQoW3RdKSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICB3aWR0aDogdC53aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IHQuaGVpZ2h0XG4gICAgICAgIH1cbiAgICAgIH0sIHUpXG4gICAgICAgIGlmICh5ID0gdC5pZCwgcCA9IHQuaW5wdXRUaW1lU2NhbGUsICFjIHx8IHAgIT09IGMudGltZXNjYWxlKSB7XG4gICAgICAgICAgY29uc3QgRSA9IHRoaXMuZ2V0VmlkZW9TdGFydFB0cyhvKSwgYiA9IE1hdGgucm91bmQocCAqIHIpO1xuICAgICAgICAgIGYgPSBNYXRoLm1pbihmLCBBcihvWzBdLmR0cywgRSkgLSBiKSwgaCA9IE1hdGgubWluKGgsIEUgLSBiKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgdSA9ICExO1xuICAgICAgdGhpcy52aWRlb1RyYWNrQ29uZmlnID0ge1xuICAgICAgICB3aWR0aDogdC53aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB0LmhlaWdodCxcbiAgICAgICAgcGl4ZWxSYXRpbzogdC5waXhlbFJhdGlvXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmtleXMobCkubGVuZ3RoKVxuICAgICAgcmV0dXJuIHRoaXMuSVNHZW5lcmF0ZWQgPSAhMCwgdSA/IChjICYmIHRoaXMud2FybihgVGltZXN0YW1wcyBhdCBwbGF5bGlzdCB0aW1lOiAke24gPyBcIlwiIDogXCJ+XCJ9JHtyfSAke2ggLyBwfSAhPSBpbml0UFRTOiAke2MuYmFzZVRpbWUgLyBjLnRpbWVzY2FsZX0gKCR7Yy5iYXNlVGltZX0vJHtjLnRpbWVzY2FsZX0pIHRyYWNrSWQ6ICR7Yy50cmFja0lkfWApLCB0aGlzLmxvZyhgRm91bmQgaW5pdFBUUyBhdCBwbGF5bGlzdCB0aW1lOiAke3J9IG9mZnNldDogJHtoIC8gcH0gKCR7aH0vJHtwfSkgdHJhY2tJZDogJHt5fWApLCB0aGlzLl9pbml0UFRTID0ge1xuICAgICAgICBiYXNlVGltZTogaCxcbiAgICAgICAgdGltZXNjYWxlOiBwLFxuICAgICAgICB0cmFja0lkOiB5XG4gICAgICB9LCB0aGlzLl9pbml0RFRTID0ge1xuICAgICAgICBiYXNlVGltZTogZixcbiAgICAgICAgdGltZXNjYWxlOiBwLFxuICAgICAgICB0cmFja0lkOiB5XG4gICAgICB9KSA6IGggPSBwID0gdm9pZCAwLCB7XG4gICAgICAgIHRyYWNrczogbCxcbiAgICAgICAgaW5pdFBUUzogaCxcbiAgICAgICAgdGltZXNjYWxlOiBwLFxuICAgICAgICB0cmFja0lkOiB5XG4gICAgICB9O1xuICB9XG4gIHJlbXV4VmlkZW8oZSwgdCwgciwgbikge1xuICAgIGNvbnN0IGkgPSBlLmlucHV0VGltZVNjYWxlLCBvID0gZS5zYW1wbGVzLCBhID0gW10sIGwgPSBvLmxlbmd0aCwgYyA9IHRoaXMuX2luaXRQVFMsIHUgPSBjLmJhc2VUaW1lICogaSAvIGMudGltZXNjYWxlO1xuICAgIGxldCBkID0gdGhpcy5uZXh0VmlkZW9UcywgaCA9IDgsIGYgPSB0aGlzLnZpZGVvU2FtcGxlRHVyYXRpb24sIHAsIHksIEUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIGIgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIFIgPSAhMTtcbiAgICBpZiAoIXIgfHwgZCA9PT0gbnVsbCkge1xuICAgICAgY29uc3QgTCA9IHUgKyB0ICogaSwgbSA9IG9bMF0ucHRzIC0gQXIob1swXS5kdHMsIG9bMF0ucHRzKTtcbiAgICAgIHBuICYmIGQgIT09IG51bGwgJiYgTWF0aC5hYnMoTCAtIG0gLSAoZCArIHUpKSA8IDE1ZTMgPyByID0gITAgOiBkID0gTCAtIG0gLSB1O1xuICAgIH1cbiAgICBjb25zdCBBID0gZCArIHU7XG4gICAgZm9yIChsZXQgTCA9IDA7IEwgPCBsOyBMKyspIHtcbiAgICAgIGNvbnN0IG0gPSBvW0xdO1xuICAgICAgbS5wdHMgPSBBcihtLnB0cywgQSksIG0uZHRzID0gQXIobS5kdHMsIEEpLCBtLmR0cyA8IG9bTCA+IDAgPyBMIC0gMSA6IExdLmR0cyAmJiAoUiA9ICEwKTtcbiAgICB9XG4gICAgUiAmJiBvLnNvcnQoZnVuY3Rpb24oTCwgbSkge1xuICAgICAgY29uc3QgdiA9IEwuZHRzIC0gbS5kdHMsIFAgPSBMLnB0cyAtIG0ucHRzO1xuICAgICAgcmV0dXJuIHYgfHwgUDtcbiAgICB9KSwgcCA9IG9bMF0uZHRzLCB5ID0gb1tvLmxlbmd0aCAtIDFdLmR0cztcbiAgICBjb25zdCBGID0geSAtIHAsIE0gPSBGID8gTWF0aC5yb3VuZChGIC8gKGwgLSAxKSkgOiBmIHx8IGUuaW5wdXRUaW1lU2NhbGUgLyAzMDtcbiAgICBpZiAocikge1xuICAgICAgY29uc3QgTCA9IHAgLSBBLCBtID0gTCA+IE0sIHYgPSBMIDwgLTE7XG4gICAgICBpZiAoKG0gfHwgdikgJiYgKG0gPyB0aGlzLndhcm4oYCR7KGUuc2VnbWVudENvZGVjIHx8IFwiXCIpLnRvVXBwZXJDYXNlKCl9OiAke3FuKEwsICEwKX0gbXMgKCR7TH1kdHMpIGhvbGUgYmV0d2VlbiBmcmFnbWVudHMgZGV0ZWN0ZWQgYXQgJHt0LnRvRml4ZWQoMyl9YCkgOiB0aGlzLndhcm4oYCR7KGUuc2VnbWVudENvZGVjIHx8IFwiXCIpLnRvVXBwZXJDYXNlKCl9OiAke3FuKC1MLCAhMCl9IG1zICgke0x9ZHRzKSBvdmVybGFwcGluZyBiZXR3ZWVuIGZyYWdtZW50cyBkZXRlY3RlZCBhdCAke3QudG9GaXhlZCgzKX1gKSwgIXYgfHwgQSA+PSBvWzBdLnB0cyB8fCBwbikpIHtcbiAgICAgICAgcCA9IEE7XG4gICAgICAgIGNvbnN0IFAgPSBvWzBdLnB0cyAtIEw7XG4gICAgICAgIGlmIChtKVxuICAgICAgICAgIG9bMF0uZHRzID0gcCwgb1swXS5wdHMgPSBQO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBsZXQgTiA9ICEwO1xuICAgICAgICAgIGZvciAobGV0IFkgPSAwOyBZIDwgby5sZW5ndGggJiYgIShvW1ldLmR0cyA+IFAgJiYgTik7IFkrKykge1xuICAgICAgICAgICAgY29uc3QgZWUgPSBvW1ldLnB0cztcbiAgICAgICAgICAgIGlmIChvW1ldLmR0cyAtPSBMLCBvW1ldLnB0cyAtPSBMLCBZIDwgby5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGllID0gb1tZICsgMV0ucHRzLCBsZSA9IG9bWV0ucHRzLCBUZSA9IGllIDw9IGxlLCBEZSA9IGllIDw9IGVlO1xuICAgICAgICAgICAgICBOID0gVGUgPT0gRGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nKGBWaWRlbzogSW5pdGlhbCBQVFMvRFRTIGFkanVzdGVkOiAke3FuKFAsICEwKX0vJHtxbihwLCAhMCl9LCBkZWx0YTogJHtxbihMLCAhMCl9IG1zYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHAgPSBNYXRoLm1heCgwLCBwKTtcbiAgICBsZXQgSCA9IDAsIEsgPSAwLCBqID0gcDtcbiAgICBmb3IgKGxldCBMID0gMDsgTCA8IGw7IEwrKykge1xuICAgICAgY29uc3QgbSA9IG9bTF0sIHYgPSBtLnVuaXRzLCBQID0gdi5sZW5ndGg7XG4gICAgICBsZXQgTiA9IDA7XG4gICAgICBmb3IgKGxldCBZID0gMDsgWSA8IFA7IFkrKylcbiAgICAgICAgTiArPSB2W1ldLmRhdGEubGVuZ3RoO1xuICAgICAgSyArPSBOLCBIICs9IFAsIG0ubGVuZ3RoID0gTiwgbS5kdHMgPCBqID8gKG0uZHRzID0gaiwgaiArPSBNIC8gNCB8IDAgfHwgMSkgOiBqID0gbS5kdHMsIEUgPSBNYXRoLm1pbihtLnB0cywgRSksIGIgPSBNYXRoLm1heChtLnB0cywgYik7XG4gICAgfVxuICAgIHkgPSBvW2wgLSAxXS5kdHM7XG4gICAgY29uc3QgQyA9IEsgKyA0ICogSCArIDg7XG4gICAgbGV0IGs7XG4gICAgdHJ5IHtcbiAgICAgIGsgPSBuZXcgVWludDhBcnJheShDKTtcbiAgICB9IGNhdGNoIChMKSB7XG4gICAgICB0aGlzLm9ic2VydmVyLmVtaXQoSS5FUlJPUiwgSS5FUlJPUiwge1xuICAgICAgICB0eXBlOiB2ZS5NVVhfRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouUkVNVVhfQUxMT0NfRVJST1IsXG4gICAgICAgIGZhdGFsOiAhMSxcbiAgICAgICAgZXJyb3I6IEwsXG4gICAgICAgIGJ5dGVzOiBDLFxuICAgICAgICByZWFzb246IGBmYWlsIGFsbG9jYXRpbmcgdmlkZW8gbWRhdCAke0N9YFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0ICQgPSBuZXcgRGF0YVZpZXcoay5idWZmZXIpO1xuICAgICQuc2V0VWludDMyKDAsIEMpLCBrLnNldChYLnR5cGVzLm1kYXQsIDQpO1xuICAgIGxldCBXID0gITEsIF8gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIGcgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHggPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIHcgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgZm9yIChsZXQgTCA9IDA7IEwgPCBsOyBMKyspIHtcbiAgICAgIGNvbnN0IG0gPSBvW0xdLCB2ID0gbS51bml0cztcbiAgICAgIGxldCBQID0gMDtcbiAgICAgIGZvciAobGV0IGVlID0gMCwgaWUgPSB2Lmxlbmd0aDsgZWUgPCBpZTsgZWUrKykge1xuICAgICAgICBjb25zdCBsZSA9IHZbZWVdLCBUZSA9IGxlLmRhdGEsIERlID0gbGUuZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAkLnNldFVpbnQzMihoLCBEZSksIGggKz0gNCwgay5zZXQoVGUsIGgpLCBoICs9IERlLCBQICs9IDQgKyBEZTtcbiAgICAgIH1cbiAgICAgIGxldCBOO1xuICAgICAgaWYgKEwgPCBsIC0gMSlcbiAgICAgICAgZiA9IG9bTCArIDFdLmR0cyAtIG0uZHRzLCBOID0gb1tMICsgMV0ucHRzIC0gbS5wdHM7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZWUgPSB0aGlzLmNvbmZpZywgaWUgPSBMID4gMCA/IG0uZHRzIC0gb1tMIC0gMV0uZHRzIDogTTtcbiAgICAgICAgaWYgKE4gPSBMID4gMCA/IG0ucHRzIC0gb1tMIC0gMV0ucHRzIDogTSwgZWUuc3RyZXRjaFNob3J0VmlkZW9UcmFjayAmJiB0aGlzLm5leHRBdWRpb1RzICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgbGUgPSBNYXRoLmZsb29yKGVlLm1heEJ1ZmZlckhvbGUgKiBpKSwgVGUgPSAobiA/IEUgKyBuICogaSA6IHRoaXMubmV4dEF1ZGlvVHMgKyB1KSAtIG0ucHRzO1xuICAgICAgICAgIFRlID4gbGUgPyAoZiA9IFRlIC0gaWUsIGYgPCAwID8gZiA9IGllIDogVyA9ICEwLCB0aGlzLmxvZyhgSXQgaXMgYXBwcm94aW1hdGVseSAke1RlIC8gOTB9IG1zIHRvIHRoZSBuZXh0IHNlZ21lbnQ7IHVzaW5nIGR1cmF0aW9uICR7ZiAvIDkwfSBtcyBmb3IgdGhlIGxhc3QgdmlkZW8gZnJhbWUuYCkpIDogZiA9IGllO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICBmID0gaWU7XG4gICAgICB9XG4gICAgICBjb25zdCBZID0gTWF0aC5yb3VuZChtLnB0cyAtIG0uZHRzKTtcbiAgICAgIF8gPSBNYXRoLm1pbihfLCBmKSwgeCA9IE1hdGgubWF4KHgsIGYpLCBnID0gTWF0aC5taW4oZywgTiksIHcgPSBNYXRoLm1heCh3LCBOKSwgYS5wdXNoKFVoKG0ua2V5LCBmLCBQLCBZKSk7XG4gICAgfVxuICAgIGlmIChhLmxlbmd0aCkge1xuICAgICAgaWYgKHBuKSB7XG4gICAgICAgIGlmIChwbiA8IDcwKSB7XG4gICAgICAgICAgY29uc3QgTCA9IGFbMF0uZmxhZ3M7XG4gICAgICAgICAgTC5kZXBlbmRzT24gPSAyLCBMLmlzTm9uU3luYyA9IDA7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoRWwgJiYgdyAtIGcgPCB4IC0gXyAmJiBNIC8geCA8IDAuMDI1ICYmIGFbMF0uY3RzID09PSAwKSB7XG4gICAgICAgIHRoaXMud2FybihcIkZvdW5kIGlycmVndWxhciBnYXBzIGluIHNhbXBsZSBkdXJhdGlvbi4gVXNpbmcgUFRTIGluc3RlYWQgb2YgRFRTIHRvIGRldGVybWluZSBNUDQgc2FtcGxlIGR1cmF0aW9uLlwiKTtcbiAgICAgICAgbGV0IEwgPSBwO1xuICAgICAgICBmb3IgKGxldCBtID0gMCwgdiA9IGEubGVuZ3RoOyBtIDwgdjsgbSsrKSB7XG4gICAgICAgICAgY29uc3QgUCA9IEwgKyBhW21dLmR1cmF0aW9uLCBOID0gTCArIGFbbV0uY3RzO1xuICAgICAgICAgIGlmIChtIDwgdiAtIDEpIHtcbiAgICAgICAgICAgIGNvbnN0IFkgPSBQICsgYVttICsgMV0uY3RzO1xuICAgICAgICAgICAgYVttXS5kdXJhdGlvbiA9IFkgLSBOO1xuICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgYVttXS5kdXJhdGlvbiA9IG0gPyBhW20gLSAxXS5kdXJhdGlvbiA6IE07XG4gICAgICAgICAgYVttXS5jdHMgPSAwLCBMID0gUDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBmID0gVyB8fCAhZiA/IE0gOiBmO1xuICAgIGNvbnN0IEQgPSB5ICsgZjtcbiAgICB0aGlzLm5leHRWaWRlb1RzID0gZCA9IEQgLSB1LCB0aGlzLnZpZGVvU2FtcGxlRHVyYXRpb24gPSBmLCB0aGlzLmlzVmlkZW9Db250aWd1b3VzID0gITA7XG4gICAgY29uc3QgViA9IHtcbiAgICAgIGRhdGExOiBYLm1vb2YoZS5zZXF1ZW5jZU51bWJlcisrLCBwLCBudChlLCB7XG4gICAgICAgIHNhbXBsZXM6IGFcbiAgICAgIH0pKSxcbiAgICAgIGRhdGEyOiBrLFxuICAgICAgc3RhcnRQVFM6IChFIC0gdSkgLyBpLFxuICAgICAgZW5kUFRTOiAoYiArIGYgLSB1KSAvIGksXG4gICAgICBzdGFydERUUzogKHAgLSB1KSAvIGksXG4gICAgICBlbmREVFM6IGQgLyBpLFxuICAgICAgdHlwZTogXCJ2aWRlb1wiLFxuICAgICAgaGFzQXVkaW86ICExLFxuICAgICAgaGFzVmlkZW86ICEwLFxuICAgICAgbmI6IGEubGVuZ3RoLFxuICAgICAgZHJvcHBlZDogZS5kcm9wcGVkXG4gICAgfTtcbiAgICByZXR1cm4gZS5zYW1wbGVzID0gW10sIGUuZHJvcHBlZCA9IDAsIFY7XG4gIH1cbiAgZ2V0U2FtcGxlc1BlckZyYW1lKGUpIHtcbiAgICBzd2l0Y2ggKGUuc2VnbWVudENvZGVjKSB7XG4gICAgICBjYXNlIFwibXAzXCI6XG4gICAgICAgIHJldHVybiBaVDtcbiAgICAgIGNhc2UgXCJhYzNcIjpcbiAgICAgICAgcmV0dXJuIFhUO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFlUO1xuICAgIH1cbiAgfVxuICByZW11eEF1ZGlvKGUsIHQsIHIsIG4sIGkpIHtcbiAgICBjb25zdCBvID0gZS5pbnB1dFRpbWVTY2FsZSwgYSA9IGUuc2FtcGxlcmF0ZSA/IGUuc2FtcGxlcmF0ZSA6IG8sIGwgPSBvIC8gYSwgYyA9IHRoaXMuZ2V0U2FtcGxlc1BlckZyYW1lKGUpLCB1ID0gYyAqIGwsIGQgPSB0aGlzLl9pbml0UFRTLCBoID0gZS5zZWdtZW50Q29kZWMgPT09IFwibXAzXCIgJiYgdGhpcy50eXBlU3VwcG9ydGVkLm1wZWcsIGYgPSBbXSwgcCA9IGkgIT09IHZvaWQgMDtcbiAgICBsZXQgeSA9IGUuc2FtcGxlcywgRSA9IGggPyAwIDogOCwgYiA9IHRoaXMubmV4dEF1ZGlvVHMgfHwgLTE7XG4gICAgY29uc3QgUiA9IGQuYmFzZVRpbWUgKiBvIC8gZC50aW1lc2NhbGUsIEEgPSBSICsgdCAqIG87XG4gICAgaWYgKHRoaXMuaXNBdWRpb0NvbnRpZ3VvdXMgPSByID0gciB8fCB5Lmxlbmd0aCAmJiBiID4gMCAmJiAobiAmJiBNYXRoLmFicyhBIC0gKGIgKyBSKSkgPCA5ZTMgfHwgTWF0aC5hYnMoQXIoeVswXS5wdHMsIEEpIC0gKGIgKyBSKSkgPCAyMCAqIHUpLCB5LmZvckVhY2goZnVuY3Rpb24odykge1xuICAgICAgdy5wdHMgPSBBcih3LnB0cywgQSk7XG4gICAgfSksICFyIHx8IGIgPCAwKSB7XG4gICAgICBpZiAoeSA9IHkuZmlsdGVyKCh3KSA9PiB3LnB0cyA+PSAwKSwgIXkubGVuZ3RoKVxuICAgICAgICByZXR1cm47XG4gICAgICBpID09PSAwID8gYiA9IDAgOiBuICYmICFwID8gYiA9IE1hdGgubWF4KDAsIEEgLSBSKSA6IGIgPSB5WzBdLnB0cyAtIFI7XG4gICAgfVxuICAgIGlmIChlLnNlZ21lbnRDb2RlYyA9PT0gXCJhYWNcIikge1xuICAgICAgY29uc3QgdyA9IHRoaXMuY29uZmlnLm1heEF1ZGlvRnJhbWVzRHJpZnQ7XG4gICAgICBmb3IgKGxldCBEID0gMCwgTyA9IGIgKyBSOyBEIDwgeS5sZW5ndGg7IEQrKykge1xuICAgICAgICBjb25zdCBVID0geVtEXSwgViA9IFUucHRzLCBMID0gViAtIE8sIG0gPSBNYXRoLmFicygxZTMgKiBMIC8gbyk7XG4gICAgICAgIGlmIChMIDw9IC13ICogdSAmJiBwKVxuICAgICAgICAgIEQgPT09IDAgJiYgKHRoaXMud2FybihgQXVkaW8gZnJhbWUgQCAkeyhWIC8gbykudG9GaXhlZCgzKX1zIG92ZXJsYXBzIG1hcmtlciBieSAke01hdGgucm91bmQoMWUzICogTCAvIG8pfSBtcy5gKSwgdGhpcy5uZXh0QXVkaW9UcyA9IGIgPSBWIC0gUiwgTyA9IFYpO1xuICAgICAgICBlbHNlIGlmIChMID49IHcgKiB1ICYmIG0gPCB6VCAmJiBwKSB7XG4gICAgICAgICAgbGV0IHYgPSBNYXRoLnJvdW5kKEwgLyB1KTtcbiAgICAgICAgICBmb3IgKE8gPSBWIC0gdiAqIHU7IE8gPCAwICYmIHYgJiYgdTsgKVxuICAgICAgICAgICAgdi0tLCBPICs9IHU7XG4gICAgICAgICAgRCA9PT0gMCAmJiAodGhpcy5uZXh0QXVkaW9UcyA9IGIgPSBPIC0gUiksIHRoaXMud2FybihgSW5qZWN0aW5nICR7dn0gYXVkaW8gZnJhbWVzIEAgJHsoKE8gLSBSKSAvIG8pLnRvRml4ZWQoMyl9cyBkdWUgdG8gJHtNYXRoLnJvdW5kKDFlMyAqIEwgLyBvKX0gbXMgZ2FwLmApO1xuICAgICAgICAgIGZvciAobGV0IFAgPSAwOyBQIDwgdjsgUCsrKSB7XG4gICAgICAgICAgICBsZXQgTiA9IEhULmdldFNpbGVudEZyYW1lKGUucGFyc2VkQ29kZWMgfHwgZS5tYW5pZmVzdENvZGVjIHx8IGUuY29kZWMsIGUuY2hhbm5lbENvdW50KTtcbiAgICAgICAgICAgIE4gfHwgKHRoaXMubG9nKFwiVW5hYmxlIHRvIGdldCBzaWxlbnQgZnJhbWUgZm9yIGdpdmVuIGF1ZGlvIGNvZGVjOyBkdXBsaWNhdGluZyBsYXN0IGZyYW1lIGluc3RlYWQuXCIpLCBOID0gVS51bml0LnN1YmFycmF5KCkpLCB5LnNwbGljZShELCAwLCB7XG4gICAgICAgICAgICAgIHVuaXQ6IE4sXG4gICAgICAgICAgICAgIHB0czogT1xuICAgICAgICAgICAgfSksIE8gKz0gdSwgRCsrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBVLnB0cyA9IE8sIE8gKz0gdTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IEYgPSBudWxsLCBNID0gbnVsbCwgSCwgSyA9IDAsIGogPSB5Lmxlbmd0aDtcbiAgICBmb3IgKDsgai0tOyApXG4gICAgICBLICs9IHlbal0udW5pdC5ieXRlTGVuZ3RoO1xuICAgIGZvciAobGV0IHcgPSAwLCBEID0geS5sZW5ndGg7IHcgPCBEOyB3KyspIHtcbiAgICAgIGNvbnN0IE8gPSB5W3ddLCBVID0gTy51bml0O1xuICAgICAgbGV0IFYgPSBPLnB0cztcbiAgICAgIGlmIChNICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IG0gPSBmW3cgLSAxXTtcbiAgICAgICAgbS5kdXJhdGlvbiA9IE1hdGgucm91bmQoKFYgLSBNKSAvIGwpO1xuICAgICAgfSBlbHNlIGlmIChyICYmIGUuc2VnbWVudENvZGVjID09PSBcImFhY1wiICYmIChWID0gYiArIFIpLCBGID0gViwgSyA+IDApIHtcbiAgICAgICAgSyArPSBFO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIEggPSBuZXcgVWludDhBcnJheShLKTtcbiAgICAgICAgfSBjYXRjaCAobSkge1xuICAgICAgICAgIHRoaXMub2JzZXJ2ZXIuZW1pdChJLkVSUk9SLCBJLkVSUk9SLCB7XG4gICAgICAgICAgICB0eXBlOiB2ZS5NVVhfRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLlJFTVVYX0FMTE9DX0VSUk9SLFxuICAgICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgICAgZXJyb3I6IG0sXG4gICAgICAgICAgICBieXRlczogSyxcbiAgICAgICAgICAgIHJlYXNvbjogYGZhaWwgYWxsb2NhdGluZyBhdWRpbyBtZGF0ICR7S31gXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGggfHwgKG5ldyBEYXRhVmlldyhILmJ1ZmZlcikuc2V0VWludDMyKDAsIEspLCBILnNldChYLnR5cGVzLm1kYXQsIDQpKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICByZXR1cm47XG4gICAgICBILnNldChVLCBFKTtcbiAgICAgIGNvbnN0IEwgPSBVLmJ5dGVMZW5ndGg7XG4gICAgICBFICs9IEwsIGYucHVzaChVaCghMCwgYywgTCwgMCkpLCBNID0gVjtcbiAgICB9XG4gICAgY29uc3QgQyA9IGYubGVuZ3RoO1xuICAgIGlmICghQylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBrID0gZltmLmxlbmd0aCAtIDFdO1xuICAgIGIgPSBNIC0gUiwgdGhpcy5uZXh0QXVkaW9UcyA9IGIgKyBsICogay5kdXJhdGlvbjtcbiAgICBjb25zdCAkID0gaCA/IG5ldyBVaW50OEFycmF5KDApIDogWC5tb29mKGUuc2VxdWVuY2VOdW1iZXIrKywgRiAvIGwsIG50KHt9LCBlLCB7XG4gICAgICBzYW1wbGVzOiBmXG4gICAgfSkpO1xuICAgIGUuc2FtcGxlcyA9IFtdO1xuICAgIGNvbnN0IFcgPSAoRiAtIFIpIC8gbywgXyA9IGIgLyBvLCB4ID0ge1xuICAgICAgZGF0YTE6ICQsXG4gICAgICBkYXRhMjogSCxcbiAgICAgIHN0YXJ0UFRTOiBXLFxuICAgICAgZW5kUFRTOiBfLFxuICAgICAgc3RhcnREVFM6IFcsXG4gICAgICBlbmREVFM6IF8sXG4gICAgICB0eXBlOiBcImF1ZGlvXCIsXG4gICAgICBoYXNBdWRpbzogITAsXG4gICAgICBoYXNWaWRlbzogITEsXG4gICAgICBuYjogQ1xuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuaXNBdWRpb0NvbnRpZ3VvdXMgPSAhMCwgeDtcbiAgfVxufVxuZnVuY3Rpb24gQXIocywgZSkge1xuICBsZXQgdDtcbiAgaWYgKGUgPT09IG51bGwpXG4gICAgcmV0dXJuIHM7XG4gIGZvciAoZSA8IHMgPyB0ID0gLTg1ODk5MzQ1OTIgOiB0ID0gODU4OTkzNDU5MjsgTWF0aC5hYnMocyAtIGUpID4gNDI5NDk2NzI5NjsgKVxuICAgIHMgKz0gdDtcbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBKVChzKSB7XG4gIGZvciAobGV0IGUgPSAwOyBlIDwgcy5sZW5ndGg7IGUrKylcbiAgICBpZiAoc1tlXS5rZXkpXG4gICAgICByZXR1cm4gZTtcbiAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gYnAocywgZSwgdCwgcikge1xuICBjb25zdCBuID0gcy5zYW1wbGVzLmxlbmd0aDtcbiAgaWYgKCFuKVxuICAgIHJldHVybjtcbiAgY29uc3QgaSA9IHMuaW5wdXRUaW1lU2NhbGU7XG4gIGZvciAobGV0IGEgPSAwOyBhIDwgbjsgYSsrKSB7XG4gICAgY29uc3QgbCA9IHMuc2FtcGxlc1thXTtcbiAgICBsLnB0cyA9IEFyKGwucHRzIC0gdC5iYXNlVGltZSAqIGkgLyB0LnRpbWVzY2FsZSwgZSAqIGkpIC8gaSwgbC5kdHMgPSBBcihsLmR0cyAtIHIuYmFzZVRpbWUgKiBpIC8gci50aW1lc2NhbGUsIGUgKiBpKSAvIGk7XG4gIH1cbiAgY29uc3QgbyA9IHMuc2FtcGxlcztcbiAgcmV0dXJuIHMuc2FtcGxlcyA9IFtdLCB7XG4gICAgc2FtcGxlczogb1xuICB9O1xufVxuZnVuY3Rpb24gVHAocywgZSwgdCkge1xuICBjb25zdCByID0gcy5zYW1wbGVzLmxlbmd0aDtcbiAgaWYgKCFyKVxuICAgIHJldHVybjtcbiAgY29uc3QgbiA9IHMuaW5wdXRUaW1lU2NhbGU7XG4gIGZvciAobGV0IG8gPSAwOyBvIDwgcjsgbysrKSB7XG4gICAgY29uc3QgYSA9IHMuc2FtcGxlc1tvXTtcbiAgICBhLnB0cyA9IEFyKGEucHRzIC0gdC5iYXNlVGltZSAqIG4gLyB0LnRpbWVzY2FsZSwgZSAqIG4pIC8gbjtcbiAgfVxuICBzLnNhbXBsZXMuc29ydCgobywgYSkgPT4gby5wdHMgLSBhLnB0cyk7XG4gIGNvbnN0IGkgPSBzLnNhbXBsZXM7XG4gIHJldHVybiBzLnNhbXBsZXMgPSBbXSwge1xuICAgIHNhbXBsZXM6IGlcbiAgfTtcbn1cbmNsYXNzIFFUIGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByLCBuKSB7XG4gICAgc3VwZXIoXCJwYXNzdGhyb3VnaC1yZW11eGVyXCIsIG4pLCB0aGlzLmVtaXRJbml0U2VnbWVudCA9ICExLCB0aGlzLmF1ZGlvQ29kZWMgPSB2b2lkIDAsIHRoaXMudmlkZW9Db2RlYyA9IHZvaWQgMCwgdGhpcy5pbml0RGF0YSA9IHZvaWQgMCwgdGhpcy5pbml0UFRTID0gbnVsbCwgdGhpcy5pbml0VHJhY2tzID0gdm9pZCAwLCB0aGlzLmxhc3RFbmRUaW1lID0gbnVsbCwgdGhpcy5pc1ZpZGVvQ29udGlndW91cyA9ICExO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gIH1cbiAgcmVzZXRUaW1lU3RhbXAoZSkge1xuICAgIHRoaXMubGFzdEVuZFRpbWUgPSBudWxsO1xuICAgIGNvbnN0IHQgPSB0aGlzLmluaXRQVFM7XG4gICAgdCAmJiBlICYmIHQuYmFzZVRpbWUgPT09IGUuYmFzZVRpbWUgJiYgdC50aW1lc2NhbGUgPT09IGUudGltZXNjYWxlIHx8ICh0aGlzLmluaXRQVFMgPSBlKTtcbiAgfVxuICByZXNldE5leHRUaW1lc3RhbXAoKSB7XG4gICAgdGhpcy5pc1ZpZGVvQ29udGlndW91cyA9ICExLCB0aGlzLmxhc3RFbmRUaW1lID0gbnVsbDtcbiAgfVxuICByZXNldEluaXRTZWdtZW50KGUsIHQsIHIsIG4pIHtcbiAgICB0aGlzLmF1ZGlvQ29kZWMgPSB0LCB0aGlzLnZpZGVvQ29kZWMgPSByLCB0aGlzLmdlbmVyYXRlSW5pdFNlZ21lbnQoZSwgbiksIHRoaXMuZW1pdEluaXRTZWdtZW50ID0gITA7XG4gIH1cbiAgZ2VuZXJhdGVJbml0U2VnbWVudChlLCB0KSB7XG4gICAgbGV0IHtcbiAgICAgIGF1ZGlvQ29kZWM6IHIsXG4gICAgICB2aWRlb0NvZGVjOiBuXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCEoZSAhPSBudWxsICYmIGUuYnl0ZUxlbmd0aCkpIHtcbiAgICAgIHRoaXMuaW5pdFRyYWNrcyA9IHZvaWQgMCwgdGhpcy5pbml0RGF0YSA9IHZvaWQgMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qge1xuICAgICAgYXVkaW86IGksXG4gICAgICB2aWRlbzogb1xuICAgIH0gPSB0aGlzLmluaXREYXRhID0gRGcoZSk7XG4gICAgaWYgKHQpXG4gICAgICAkUyhlLCB0KTtcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IGwgPSBpIHx8IG87XG4gICAgICBsICE9IG51bGwgJiYgbC5lbmNyeXB0ZWQgJiYgdGhpcy53YXJuKGBJbml0IHNlZ21lbnQgd2l0aCBlbmNyeXB0ZWQgdHJhY2sgd2l0aCBoYXMgbm8ga2V5IChcIiR7bC5jb2RlY31cIikhYCk7XG4gICAgfVxuICAgIGkgJiYgKHIgPSAkaChpLCBvdC5BVURJTywgdGhpcykpLCBvICYmIChuID0gJGgobywgb3QuVklERU8sIHRoaXMpKTtcbiAgICBjb25zdCBhID0ge307XG4gICAgaSAmJiBvID8gYS5hdWRpb3ZpZGVvID0ge1xuICAgICAgY29udGFpbmVyOiBcInZpZGVvL21wNFwiLFxuICAgICAgY29kZWM6IHIgKyBcIixcIiArIG4sXG4gICAgICBzdXBwbGVtZW50YWw6IG8uc3VwcGxlbWVudGFsLFxuICAgICAgZW5jcnlwdGVkOiBvLmVuY3J5cHRlZCxcbiAgICAgIGluaXRTZWdtZW50OiBlLFxuICAgICAgaWQ6IFwibWFpblwiXG4gICAgfSA6IGkgPyBhLmF1ZGlvID0ge1xuICAgICAgY29udGFpbmVyOiBcImF1ZGlvL21wNFwiLFxuICAgICAgY29kZWM6IHIsXG4gICAgICBlbmNyeXB0ZWQ6IGkuZW5jcnlwdGVkLFxuICAgICAgaW5pdFNlZ21lbnQ6IGUsXG4gICAgICBpZDogXCJhdWRpb1wiXG4gICAgfSA6IG8gPyBhLnZpZGVvID0ge1xuICAgICAgY29udGFpbmVyOiBcInZpZGVvL21wNFwiLFxuICAgICAgY29kZWM6IG4sXG4gICAgICBzdXBwbGVtZW50YWw6IG8uc3VwcGxlbWVudGFsLFxuICAgICAgZW5jcnlwdGVkOiBvLmVuY3J5cHRlZCxcbiAgICAgIGluaXRTZWdtZW50OiBlLFxuICAgICAgaWQ6IFwibWFpblwiXG4gICAgfSA6IHRoaXMud2FybihcImluaXRTZWdtZW50IGRvZXMgbm90IGNvbnRhaW4gbW9vdiBvciB0cmFrIGJveGVzLlwiKSwgdGhpcy5pbml0VHJhY2tzID0gYTtcbiAgfVxuICByZW11eChlLCB0LCByLCBuLCBpLCBvKSB7XG4gICAgdmFyIGEsIGw7XG4gICAgbGV0IHtcbiAgICAgIGluaXRQVFM6IGMsXG4gICAgICBsYXN0RW5kVGltZTogdVxuICAgIH0gPSB0aGlzO1xuICAgIGNvbnN0IGQgPSB7XG4gICAgICBhdWRpbzogdm9pZCAwLFxuICAgICAgdmlkZW86IHZvaWQgMCxcbiAgICAgIHRleHQ6IG4sXG4gICAgICBpZDM6IHIsXG4gICAgICBpbml0U2VnbWVudDogdm9pZCAwXG4gICAgfTtcbiAgICB1ZSh1KSB8fCAodSA9IHRoaXMubGFzdEVuZFRpbWUgPSBpIHx8IDApO1xuICAgIGNvbnN0IGggPSB0LnNhbXBsZXM7XG4gICAgaWYgKCFoLmxlbmd0aClcbiAgICAgIHJldHVybiBkO1xuICAgIGNvbnN0IGYgPSB7XG4gICAgICBpbml0UFRTOiB2b2lkIDAsXG4gICAgICB0aW1lc2NhbGU6IHZvaWQgMCxcbiAgICAgIHRyYWNrSWQ6IHZvaWQgMFxuICAgIH07XG4gICAgbGV0IHAgPSB0aGlzLmluaXREYXRhO1xuICAgIGlmICgoYSA9IHApICE9IG51bGwgJiYgYS5sZW5ndGggfHwgKHRoaXMuZ2VuZXJhdGVJbml0U2VnbWVudChoKSwgcCA9IHRoaXMuaW5pdERhdGEpLCAhKChsID0gcCkgIT0gbnVsbCAmJiBsLmxlbmd0aCkpXG4gICAgICByZXR1cm4gdGhpcy53YXJuKFwiRmFpbGVkIHRvIGdlbmVyYXRlIGluaXRTZWdtZW50LlwiKSwgZDtcbiAgICB0aGlzLmVtaXRJbml0U2VnbWVudCAmJiAoZi50cmFja3MgPSB0aGlzLmluaXRUcmFja3MsIHRoaXMuZW1pdEluaXRTZWdtZW50ID0gITEpO1xuICAgIGNvbnN0IHkgPSBHUyhoLCBwLCB0aGlzKSwgRSA9IHAuYXVkaW8gPyB5W3AuYXVkaW8uaWRdIDogbnVsbCwgYiA9IHAudmlkZW8gPyB5W3AudmlkZW8uaWRdIDogbnVsbCwgUiA9IFppKGIsIDEgLyAwKSwgQSA9IFppKEUsIDEgLyAwKSwgRiA9IFppKGIsIDAsICEwKSwgTSA9IFppKEUsIDAsICEwKTtcbiAgICBsZXQgSCA9IGksIEsgPSAwO1xuICAgIGNvbnN0IGogPSBFICYmICghYiB8fCAhYyAmJiBBIDwgUiB8fCBjICYmIGMudHJhY2tJZCA9PT0gcC5hdWRpby5pZCksIEMgPSBqID8gRSA6IGI7XG4gICAgaWYgKEMpIHtcbiAgICAgIGNvbnN0IE8gPSBDLnRpbWVzY2FsZSwgVSA9IEMuc3RhcnQgLSBpICogTywgViA9IGogPyBwLmF1ZGlvLmlkIDogcC52aWRlby5pZDtcbiAgICAgIEggPSBDLnN0YXJ0IC8gTywgSyA9IGogPyBNIC0gQSA6IEYgLSBSLCAobyB8fCAhYykgJiYgKGUyKGMsIEgsIGksIEspIHx8IE8gIT09IGMudGltZXNjYWxlKSAmJiAoYyAmJiB0aGlzLndhcm4oYFRpbWVzdGFtcHMgYXQgcGxheWxpc3QgdGltZTogJHtvID8gXCJcIiA6IFwiflwifSR7aX0gJHtVIC8gT30gIT0gaW5pdFBUUzogJHtjLmJhc2VUaW1lIC8gYy50aW1lc2NhbGV9ICgke2MuYmFzZVRpbWV9LyR7Yy50aW1lc2NhbGV9KSB0cmFja0lkOiAke2MudHJhY2tJZH1gKSwgdGhpcy5sb2coYEZvdW5kIGluaXRQVFMgYXQgcGxheWxpc3QgdGltZTogJHtpfSBvZmZzZXQ6ICR7SCAtIGl9ICgke1V9LyR7T30pIHRyYWNrSWQ6ICR7Vn1gKSwgYyA9IG51bGwsIGYuaW5pdFBUUyA9IFUsIGYudGltZXNjYWxlID0gTywgZi50cmFja0lkID0gVik7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLndhcm4oYE5vIGF1ZGlvIG9yIHZpZGVvIHNhbXBsZXMgZm91bmQgZm9yIGluaXRQVFMgYXQgcGxheWxpc3QgdGltZTogJHtpfWApO1xuICAgIGMgPyAoZi5pbml0UFRTID0gYy5iYXNlVGltZSwgZi50aW1lc2NhbGUgPSBjLnRpbWVzY2FsZSwgZi50cmFja0lkID0gYy50cmFja0lkKSA6ICgoIWYudGltZXNjYWxlIHx8IGYudHJhY2tJZCA9PT0gdm9pZCAwIHx8IGYuaW5pdFBUUyA9PT0gdm9pZCAwKSAmJiAodGhpcy53YXJuKFwiQ291bGQgbm90IHNldCBpbml0UFRTXCIpLCBmLmluaXRQVFMgPSBILCBmLnRpbWVzY2FsZSA9IDEsIGYudHJhY2tJZCA9IC0xKSwgdGhpcy5pbml0UFRTID0gYyA9IHtcbiAgICAgIGJhc2VUaW1lOiBmLmluaXRQVFMsXG4gICAgICB0aW1lc2NhbGU6IGYudGltZXNjYWxlLFxuICAgICAgdHJhY2tJZDogZi50cmFja0lkXG4gICAgfSk7XG4gICAgY29uc3QgayA9IEggLSBjLmJhc2VUaW1lIC8gYy50aW1lc2NhbGUsICQgPSBrICsgSztcbiAgICBLID4gMCA/IHRoaXMubGFzdEVuZFRpbWUgPSAkIDogKHRoaXMud2FybihcIkR1cmF0aW9uIHBhcnNlZCBmcm9tIG1wNCBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIHplcm9cIiksIHRoaXMucmVzZXROZXh0VGltZXN0YW1wKCkpO1xuICAgIGNvbnN0IFcgPSAhIXAuYXVkaW8sIF8gPSAhIXAudmlkZW87XG4gICAgbGV0IGcgPSBcIlwiO1xuICAgIFcgJiYgKGcgKz0gXCJhdWRpb1wiKSwgXyAmJiAoZyArPSBcInZpZGVvXCIpO1xuICAgIGNvbnN0IHggPSAocC5hdWRpbyA/IHAuYXVkaW8uZW5jcnlwdGVkIDogITEpIHx8IChwLnZpZGVvID8gcC52aWRlby5lbmNyeXB0ZWQgOiAhMSksIHcgPSB7XG4gICAgICBkYXRhMTogaCxcbiAgICAgIHN0YXJ0UFRTOiBrLFxuICAgICAgc3RhcnREVFM6IGssXG4gICAgICBlbmRQVFM6ICQsXG4gICAgICBlbmREVFM6ICQsXG4gICAgICB0eXBlOiBnLFxuICAgICAgaGFzQXVkaW86IFcsXG4gICAgICBoYXNWaWRlbzogXyxcbiAgICAgIG5iOiAxLFxuICAgICAgZHJvcHBlZDogMCxcbiAgICAgIGVuY3J5cHRlZDogeFxuICAgIH07XG4gICAgZC5hdWRpbyA9IFcgJiYgIV8gPyB3IDogdm9pZCAwLCBkLnZpZGVvID0gXyA/IHcgOiB2b2lkIDA7XG4gICAgY29uc3QgRCA9IGIgPT0gbnVsbCA/IHZvaWQgMCA6IGIuc2FtcGxlQ291bnQ7XG4gICAgaWYgKEQpIHtcbiAgICAgIGNvbnN0IE8gPSBiLmtleUZyYW1lSW5kZXgsIFUgPSBPICE9PSAtMTtcbiAgICAgIHcubmIgPSBELCB3LmRyb3BwZWQgPSBPID09PSAwIHx8IHRoaXMuaXNWaWRlb0NvbnRpZ3VvdXMgPyAwIDogVSA/IE8gOiBELCB3LmluZGVwZW5kZW50ID0gVSwgdy5maXJzdEtleUZyYW1lID0gTywgVSAmJiBiLmtleUZyYW1lU3RhcnQgJiYgKHcuZmlyc3RLZXlGcmFtZVBUUyA9IChiLmtleUZyYW1lU3RhcnQgLSBjLmJhc2VUaW1lKSAvIGMudGltZXNjYWxlKSwgdGhpcy5pc1ZpZGVvQ29udGlndW91cyB8fCAoZC5pbmRlcGVuZGVudCA9IFUpLCB0aGlzLmlzVmlkZW9Db250aWd1b3VzIHx8ICh0aGlzLmlzVmlkZW9Db250aWd1b3VzID0gVSksIHcuZHJvcHBlZCAmJiB0aGlzLndhcm4oYGZtcDQgZG9lcyBub3Qgc3RhcnQgd2l0aCBJRFI6IGZpcnN0SURSICR7T30vJHtEfSBkcm9wcGVkOiAke3cuZHJvcHBlZH0gc3RhcnQ6ICR7dy5maXJzdEtleUZyYW1lUFRTIHx8IFwiTkFcIn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGQuaW5pdFNlZ21lbnQgPSBmLCBkLmlkMyA9IGJwKHIsIGksIGMsIGMpLCBuLnNhbXBsZXMubGVuZ3RoICYmIChkLnRleHQgPSBUcChuLCBpLCBjKSksIGQ7XG4gIH1cbn1cbmZ1bmN0aW9uIFppKHMsIGUsIHQgPSAhMSkge1xuICByZXR1cm4gKHMgPT0gbnVsbCA/IHZvaWQgMCA6IHMuc3RhcnQpICE9PSB2b2lkIDAgPyAocy5zdGFydCArICh0ID8gcy5kdXJhdGlvbiA6IDApKSAvIHMudGltZXNjYWxlIDogZTtcbn1cbmZ1bmN0aW9uIGUyKHMsIGUsIHQsIHIpIHtcbiAgaWYgKHMgPT09IG51bGwpXG4gICAgcmV0dXJuICEwO1xuICBjb25zdCBuID0gTWF0aC5tYXgociwgMSksIGkgPSBlIC0gcy5iYXNlVGltZSAvIHMudGltZXNjYWxlO1xuICByZXR1cm4gTWF0aC5hYnMoaSAtIHQpID4gbjtcbn1cbmZ1bmN0aW9uICRoKHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IHMuY29kZWM7XG4gIHJldHVybiByICYmIHIubGVuZ3RoID4gNCA/IHIgOiBlID09PSBvdC5BVURJTyA/IHIgPT09IFwiZWMtM1wiIHx8IHIgPT09IFwiYWMtM1wiIHx8IHIgPT09IFwiYWxhY1wiID8gciA6IHIgPT09IFwiZkxhQ1wiIHx8IHIgPT09IFwiT3B1c1wiID8gWG8ociwgITEpIDogKHQud2FybihgVW5oYW5kbGVkIGF1ZGlvIGNvZGVjIFwiJHtyfVwiIGluIG1wNCBNQVBgKSwgciB8fCBcIm1wNGFcIikgOiAodC53YXJuKGBVbmhhbmRsZWQgdmlkZW8gY29kZWMgXCIke3J9XCIgaW4gbXA0IE1BUGApLCByIHx8IFwiYXZjMVwiKTtcbn1cbmxldCBscztcbnRyeSB7XG4gIGxzID0gc2VsZi5wZXJmb3JtYW5jZS5ub3cuYmluZChzZWxmLnBlcmZvcm1hbmNlKTtcbn0gY2F0Y2gge1xuICBscyA9IERhdGUubm93O1xufVxuY29uc3QgeW8gPSBbe1xuICBkZW11eDogVVQsXG4gIHJlbXV4OiBRVFxufSwge1xuICBkZW11eDogSXMsXG4gIHJlbXV4OiBtb1xufSwge1xuICBkZW11eDogT1QsXG4gIHJlbXV4OiBtb1xufSwge1xuICBkZW11eDogRlQsXG4gIHJlbXV4OiBtb1xufV07XG55by5zcGxpY2UoMiwgMCwge1xuICBkZW11eDogQlQsXG4gIHJlbXV4OiBtb1xufSk7XG5jbGFzcyBHaCB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgICB0aGlzLmFzeW5jUmVzdWx0ID0gITEsIHRoaXMubG9nZ2VyID0gdm9pZCAwLCB0aGlzLm9ic2VydmVyID0gdm9pZCAwLCB0aGlzLnR5cGVTdXBwb3J0ZWQgPSB2b2lkIDAsIHRoaXMuY29uZmlnID0gdm9pZCAwLCB0aGlzLmlkID0gdm9pZCAwLCB0aGlzLmRlbXV4ZXIgPSB2b2lkIDAsIHRoaXMucmVtdXhlciA9IHZvaWQgMCwgdGhpcy5kZWNyeXB0ZXIgPSB2b2lkIDAsIHRoaXMucHJvYmUgPSB2b2lkIDAsIHRoaXMuZGVjcnlwdGlvblByb21pc2UgPSBudWxsLCB0aGlzLnRyYW5zbXV4Q29uZmlnID0gdm9pZCAwLCB0aGlzLmN1cnJlbnRUcmFuc211eFN0YXRlID0gdm9pZCAwLCB0aGlzLm9ic2VydmVyID0gZSwgdGhpcy50eXBlU3VwcG9ydGVkID0gdCwgdGhpcy5jb25maWcgPSByLCB0aGlzLmlkID0gaSwgdGhpcy5sb2dnZXIgPSBvO1xuICB9XG4gIGNvbmZpZ3VyZShlKSB7XG4gICAgdGhpcy50cmFuc211eENvbmZpZyA9IGUsIHRoaXMuZGVjcnlwdGVyICYmIHRoaXMuZGVjcnlwdGVyLnJlc2V0KCk7XG4gIH1cbiAgcHVzaChlLCB0LCByLCBuKSB7XG4gICAgY29uc3QgaSA9IHIudHJhbnNtdXhpbmc7XG4gICAgaS5leGVjdXRlU3RhcnQgPSBscygpO1xuICAgIGxldCBvID0gbmV3IFVpbnQ4QXJyYXkoZSk7XG4gICAgY29uc3Qge1xuICAgICAgY3VycmVudFRyYW5zbXV4U3RhdGU6IGEsXG4gICAgICB0cmFuc211eENvbmZpZzogbFxuICAgIH0gPSB0aGlzO1xuICAgIG4gJiYgKHRoaXMuY3VycmVudFRyYW5zbXV4U3RhdGUgPSBuKTtcbiAgICBjb25zdCB7XG4gICAgICBjb250aWd1b3VzOiBjLFxuICAgICAgZGlzY29udGludWl0eTogdSxcbiAgICAgIHRyYWNrU3dpdGNoOiBkLFxuICAgICAgYWNjdXJhdGVUaW1lT2Zmc2V0OiBoLFxuICAgICAgdGltZU9mZnNldDogZixcbiAgICAgIGluaXRTZWdtZW50Q2hhbmdlOiBwXG4gICAgfSA9IG4gfHwgYSwge1xuICAgICAgYXVkaW9Db2RlYzogeSxcbiAgICAgIHZpZGVvQ29kZWM6IEUsXG4gICAgICBkZWZhdWx0SW5pdFB0czogYixcbiAgICAgIGR1cmF0aW9uOiBSLFxuICAgICAgaW5pdFNlZ21lbnREYXRhOiBBXG4gICAgfSA9IGwsIEYgPSB0MihvLCB0KTtcbiAgICBpZiAoRiAmJiBJbihGLm1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IGogPSB0aGlzLmdldERlY3J5cHRlcigpLCBDID0gU3UoRi5tZXRob2QpO1xuICAgICAgaWYgKGouaXNTeW5jKCkpIHtcbiAgICAgICAgbGV0IGsgPSBqLnNvZnR3YXJlRGVjcnlwdChvLCBGLmtleS5idWZmZXIsIEYuaXYuYnVmZmVyLCBDKTtcbiAgICAgICAgaWYgKHIucGFydCA+IC0xKSB7XG4gICAgICAgICAgY29uc3QgVyA9IGouZmx1c2goKTtcbiAgICAgICAgICBrID0gVyAmJiBXLmJ1ZmZlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWspXG4gICAgICAgICAgcmV0dXJuIGkuZXhlY3V0ZUVuZCA9IGxzKCksIHhsKHIpO1xuICAgICAgICBvID0gbmV3IFVpbnQ4QXJyYXkoayk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcmV0dXJuIHRoaXMuYXN5bmNSZXN1bHQgPSAhMCwgdGhpcy5kZWNyeXB0aW9uUHJvbWlzZSA9IGoud2ViQ3J5cHRvRGVjcnlwdChvLCBGLmtleS5idWZmZXIsIEYuaXYuYnVmZmVyLCBDKS50aGVuKChrKSA9PiB7XG4gICAgICAgICAgY29uc3QgJCA9IHRoaXMucHVzaChrLCBudWxsLCByKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5kZWNyeXB0aW9uUHJvbWlzZSA9IG51bGwsICQ7XG4gICAgICAgIH0pLCB0aGlzLmRlY3J5cHRpb25Qcm9taXNlO1xuICAgIH1cbiAgICBjb25zdCBNID0gdGhpcy5uZWVkc1Byb2JpbmcodSwgZCk7XG4gICAgaWYgKE0pIHtcbiAgICAgIGNvbnN0IGogPSB0aGlzLmNvbmZpZ3VyZVRyYW5zbXV4ZXIobyk7XG4gICAgICBpZiAoailcbiAgICAgICAgcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oYFt0cmFuc211eGVyXSAke2oubWVzc2FnZX1gKSwgdGhpcy5vYnNlcnZlci5lbWl0KEkuRVJST1IsIEkuRVJST1IsIHtcbiAgICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgICBkZXRhaWxzOiBKLkZSQUdfUEFSU0lOR19FUlJPUixcbiAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgZXJyb3I6IGosXG4gICAgICAgICAgcmVhc29uOiBqLm1lc3NhZ2VcbiAgICAgICAgfSksIGkuZXhlY3V0ZUVuZCA9IGxzKCksIHhsKHIpO1xuICAgIH1cbiAgICAodSB8fCBkIHx8IHAgfHwgTSkgJiYgdGhpcy5yZXNldEluaXRTZWdtZW50KEEsIHksIEUsIFIsIHQpLCAodSB8fCBwIHx8IE0pICYmIHRoaXMucmVzZXRJbml0aWFsVGltZXN0YW1wKGIpLCBjIHx8IHRoaXMucmVzZXRDb250aWd1aXR5KCk7XG4gICAgY29uc3QgSCA9IHRoaXMudHJhbnNtdXgobywgRiwgZiwgaCwgcik7XG4gICAgdGhpcy5hc3luY1Jlc3VsdCA9IHhpKEgpO1xuICAgIGNvbnN0IEsgPSB0aGlzLmN1cnJlbnRUcmFuc211eFN0YXRlO1xuICAgIHJldHVybiBLLmNvbnRpZ3VvdXMgPSAhMCwgSy5kaXNjb250aW51aXR5ID0gITEsIEsudHJhY2tTd2l0Y2ggPSAhMSwgaS5leGVjdXRlRW5kID0gbHMoKSwgSDtcbiAgfVxuICAvLyBEdWUgdG8gZGF0YSBjYWNoaW5nLCBmbHVzaCBjYWxscyBjYW4gcHJvZHVjZSBtb3JlIHRoYW4gb25lIFRyYW5zbXV4ZXJSZXN1bHQgKGhlbmNlIHRoZSBBcnJheSB0eXBlKVxuICBmbHVzaChlKSB7XG4gICAgY29uc3QgdCA9IGUudHJhbnNtdXhpbmc7XG4gICAgdC5leGVjdXRlU3RhcnQgPSBscygpO1xuICAgIGNvbnN0IHtcbiAgICAgIGRlY3J5cHRlcjogcixcbiAgICAgIGN1cnJlbnRUcmFuc211eFN0YXRlOiBuLFxuICAgICAgZGVjcnlwdGlvblByb21pc2U6IGlcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoaSlcbiAgICAgIHJldHVybiB0aGlzLmFzeW5jUmVzdWx0ID0gITAsIGkudGhlbigoKSA9PiB0aGlzLmZsdXNoKGUpKTtcbiAgICBjb25zdCBvID0gW10sIHtcbiAgICAgIHRpbWVPZmZzZXQ6IGFcbiAgICB9ID0gbjtcbiAgICBpZiAocikge1xuICAgICAgY29uc3QgZCA9IHIuZmx1c2goKTtcbiAgICAgIGQgJiYgby5wdXNoKHRoaXMucHVzaChkLmJ1ZmZlciwgbnVsbCwgZSkpO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBkZW11eGVyOiBsLFxuICAgICAgcmVtdXhlcjogY1xuICAgIH0gPSB0aGlzO1xuICAgIGlmICghbCB8fCAhYykge1xuICAgICAgdC5leGVjdXRlRW5kID0gbHMoKTtcbiAgICAgIGNvbnN0IGQgPSBbeGwoZSldO1xuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNSZXN1bHQgPyBQcm9taXNlLnJlc29sdmUoZCkgOiBkO1xuICAgIH1cbiAgICBjb25zdCB1ID0gbC5mbHVzaChhKTtcbiAgICByZXR1cm4geGkodSkgPyAodGhpcy5hc3luY1Jlc3VsdCA9ICEwLCB1LnRoZW4oKGQpID0+ICh0aGlzLmZsdXNoUmVtdXgobywgZCwgZSksIG8pKSkgOiAodGhpcy5mbHVzaFJlbXV4KG8sIHUsIGUpLCB0aGlzLmFzeW5jUmVzdWx0ID8gUHJvbWlzZS5yZXNvbHZlKG8pIDogbyk7XG4gIH1cbiAgZmx1c2hSZW11eChlLCB0LCByKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXVkaW9UcmFjazogbixcbiAgICAgIHZpZGVvVHJhY2s6IGksXG4gICAgICBpZDNUcmFjazogbyxcbiAgICAgIHRleHRUcmFjazogYVxuICAgIH0gPSB0LCB7XG4gICAgICBhY2N1cmF0ZVRpbWVPZmZzZXQ6IGwsXG4gICAgICB0aW1lT2Zmc2V0OiBjXG4gICAgfSA9IHRoaXMuY3VycmVudFRyYW5zbXV4U3RhdGU7XG4gICAgdGhpcy5sb2dnZXIubG9nKGBbdHJhbnNtdXhlci50c106IEZsdXNoZWQgJHt0aGlzLmlkfSBzbjogJHtyLnNufSR7ci5wYXJ0ID4gLTEgPyBcIiBwYXJ0OiBcIiArIHIucGFydCA6IFwiXCJ9IG9mICR7dGhpcy5pZCA9PT0gcGUuTUFJTiA/IFwibGV2ZWxcIiA6IFwidHJhY2tcIn0gJHtyLmxldmVsfWApO1xuICAgIGNvbnN0IHUgPSB0aGlzLnJlbXV4ZXIucmVtdXgobiwgaSwgbywgYSwgYywgbCwgITAsIHRoaXMuaWQpO1xuICAgIGUucHVzaCh7XG4gICAgICByZW11eFJlc3VsdDogdSxcbiAgICAgIGNodW5rTWV0YTogclxuICAgIH0pLCByLnRyYW5zbXV4aW5nLmV4ZWN1dGVFbmQgPSBscygpO1xuICB9XG4gIHJlc2V0SW5pdGlhbFRpbWVzdGFtcChlKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGVtdXhlcjogdCxcbiAgICAgIHJlbXV4ZXI6IHJcbiAgICB9ID0gdGhpcztcbiAgICAhdCB8fCAhciB8fCAodC5yZXNldFRpbWVTdGFtcChlKSwgci5yZXNldFRpbWVTdGFtcChlKSk7XG4gIH1cbiAgcmVzZXRDb250aWd1aXR5KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRlbXV4ZXI6IGUsXG4gICAgICByZW11eGVyOiB0XG4gICAgfSA9IHRoaXM7XG4gICAgIWUgfHwgIXQgfHwgKGUucmVzZXRDb250aWd1aXR5KCksIHQucmVzZXROZXh0VGltZXN0YW1wKCkpO1xuICB9XG4gIHJlc2V0SW5pdFNlZ21lbnQoZSwgdCwgciwgbiwgaSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRlbXV4ZXI6IG8sXG4gICAgICByZW11eGVyOiBhXG4gICAgfSA9IHRoaXM7XG4gICAgIW8gfHwgIWEgfHwgKG8ucmVzZXRJbml0U2VnbWVudChlLCB0LCByLCBuKSwgYS5yZXNldEluaXRTZWdtZW50KGUsIHQsIHIsIGkpKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuZGVtdXhlciAmJiAodGhpcy5kZW11eGVyLmRlc3Ryb3koKSwgdGhpcy5kZW11eGVyID0gdm9pZCAwKSwgdGhpcy5yZW11eGVyICYmICh0aGlzLnJlbXV4ZXIuZGVzdHJveSgpLCB0aGlzLnJlbXV4ZXIgPSB2b2lkIDApO1xuICB9XG4gIHRyYW5zbXV4KGUsIHQsIHIsIG4sIGkpIHtcbiAgICBsZXQgbztcbiAgICByZXR1cm4gdCAmJiB0Lm1ldGhvZCA9PT0gXCJTQU1QTEUtQUVTXCIgPyBvID0gdGhpcy50cmFuc211eFNhbXBsZUFlcyhlLCB0LCByLCBuLCBpKSA6IG8gPSB0aGlzLnRyYW5zbXV4VW5lbmNyeXB0ZWQoZSwgciwgbiwgaSksIG87XG4gIH1cbiAgdHJhbnNtdXhVbmVuY3J5cHRlZChlLCB0LCByLCBuKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXVkaW9UcmFjazogaSxcbiAgICAgIHZpZGVvVHJhY2s6IG8sXG4gICAgICBpZDNUcmFjazogYSxcbiAgICAgIHRleHRUcmFjazogbFxuICAgIH0gPSB0aGlzLmRlbXV4ZXIuZGVtdXgoZSwgdCwgITEsICF0aGlzLmNvbmZpZy5wcm9ncmVzc2l2ZSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlbXV4UmVzdWx0OiB0aGlzLnJlbXV4ZXIucmVtdXgoaSwgbywgYSwgbCwgdCwgciwgITEsIHRoaXMuaWQpLFxuICAgICAgY2h1bmtNZXRhOiBuXG4gICAgfTtcbiAgfVxuICB0cmFuc211eFNhbXBsZUFlcyhlLCB0LCByLCBuLCBpKSB7XG4gICAgcmV0dXJuIHRoaXMuZGVtdXhlci5kZW11eFNhbXBsZUFlcyhlLCB0LCByKS50aGVuKChvKSA9PiAoe1xuICAgICAgcmVtdXhSZXN1bHQ6IHRoaXMucmVtdXhlci5yZW11eChvLmF1ZGlvVHJhY2ssIG8udmlkZW9UcmFjaywgby5pZDNUcmFjaywgby50ZXh0VHJhY2ssIHIsIG4sICExLCB0aGlzLmlkKSxcbiAgICAgIGNodW5rTWV0YTogaVxuICAgIH0pKTtcbiAgfVxuICBjb25maWd1cmVUcmFuc211eGVyKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb25maWc6IHQsXG4gICAgICBvYnNlcnZlcjogcixcbiAgICAgIHR5cGVTdXBwb3J0ZWQ6IG5cbiAgICB9ID0gdGhpcztcbiAgICBsZXQgaTtcbiAgICBmb3IgKGxldCBkID0gMCwgaCA9IHlvLmxlbmd0aDsgZCA8IGg7IGQrKykge1xuICAgICAgdmFyIG87XG4gICAgICBpZiAoKG8gPSB5b1tkXS5kZW11eCkgIT0gbnVsbCAmJiBvLnByb2JlKGUsIHRoaXMubG9nZ2VyKSkge1xuICAgICAgICBpID0geW9bZF07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWkpXG4gICAgICByZXR1cm4gbmV3IEVycm9yKFwiRmFpbGVkIHRvIGZpbmQgZGVtdXhlciBieSBwcm9iaW5nIGZyYWdtZW50IGRhdGFcIik7XG4gICAgY29uc3QgYSA9IHRoaXMuZGVtdXhlciwgbCA9IHRoaXMucmVtdXhlciwgYyA9IGkucmVtdXgsIHUgPSBpLmRlbXV4O1xuICAgICghbCB8fCAhKGwgaW5zdGFuY2VvZiBjKSkgJiYgKHRoaXMucmVtdXhlciA9IG5ldyBjKHIsIHQsIG4sIHRoaXMubG9nZ2VyKSksICghYSB8fCAhKGEgaW5zdGFuY2VvZiB1KSkgJiYgKHRoaXMuZGVtdXhlciA9IG5ldyB1KHIsIHQsIG4sIHRoaXMubG9nZ2VyKSwgdGhpcy5wcm9iZSA9IHUucHJvYmUpO1xuICB9XG4gIG5lZWRzUHJvYmluZyhlLCB0KSB7XG4gICAgcmV0dXJuICF0aGlzLmRlbXV4ZXIgfHwgIXRoaXMucmVtdXhlciB8fCBlIHx8IHQ7XG4gIH1cbiAgZ2V0RGVjcnlwdGVyKCkge1xuICAgIGxldCBlID0gdGhpcy5kZWNyeXB0ZXI7XG4gICAgcmV0dXJuIGUgfHwgKGUgPSB0aGlzLmRlY3J5cHRlciA9IG5ldyB2dSh0aGlzLmNvbmZpZykpLCBlO1xuICB9XG59XG5mdW5jdGlvbiB0MihzLCBlKSB7XG4gIGxldCB0ID0gbnVsbDtcbiAgcmV0dXJuIHMuYnl0ZUxlbmd0aCA+IDAgJiYgKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUua2V5KSAhPSBudWxsICYmIGUuaXYgIT09IG51bGwgJiYgZS5tZXRob2QgIT0gbnVsbCAmJiAodCA9IGUpLCB0O1xufVxuY29uc3QgeGwgPSAocykgPT4gKHtcbiAgcmVtdXhSZXN1bHQ6IHt9LFxuICBjaHVua01ldGE6IHNcbn0pO1xuZnVuY3Rpb24geGkocykge1xuICByZXR1cm4gXCJ0aGVuXCIgaW4gcyAmJiBzLnRoZW4gaW5zdGFuY2VvZiBGdW5jdGlvbjtcbn1cbmNsYXNzIHIyIHtcbiAgY29uc3RydWN0b3IoZSwgdCwgciwgbiwgaSkge1xuICAgIHRoaXMuYXVkaW9Db2RlYyA9IHZvaWQgMCwgdGhpcy52aWRlb0NvZGVjID0gdm9pZCAwLCB0aGlzLmluaXRTZWdtZW50RGF0YSA9IHZvaWQgMCwgdGhpcy5kdXJhdGlvbiA9IHZvaWQgMCwgdGhpcy5kZWZhdWx0SW5pdFB0cyA9IHZvaWQgMCwgdGhpcy5hdWRpb0NvZGVjID0gZSwgdGhpcy52aWRlb0NvZGVjID0gdCwgdGhpcy5pbml0U2VnbWVudERhdGEgPSByLCB0aGlzLmR1cmF0aW9uID0gbiwgdGhpcy5kZWZhdWx0SW5pdFB0cyA9IGkgfHwgbnVsbDtcbiAgfVxufVxuY2xhc3MgczIge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByLCBuLCBpLCBvKSB7XG4gICAgdGhpcy5kaXNjb250aW51aXR5ID0gdm9pZCAwLCB0aGlzLmNvbnRpZ3VvdXMgPSB2b2lkIDAsIHRoaXMuYWNjdXJhdGVUaW1lT2Zmc2V0ID0gdm9pZCAwLCB0aGlzLnRyYWNrU3dpdGNoID0gdm9pZCAwLCB0aGlzLnRpbWVPZmZzZXQgPSB2b2lkIDAsIHRoaXMuaW5pdFNlZ21lbnRDaGFuZ2UgPSB2b2lkIDAsIHRoaXMuZGlzY29udGludWl0eSA9IGUsIHRoaXMuY29udGlndW91cyA9IHQsIHRoaXMuYWNjdXJhdGVUaW1lT2Zmc2V0ID0gciwgdGhpcy50cmFja1N3aXRjaCA9IG4sIHRoaXMudGltZU9mZnNldCA9IGksIHRoaXMuaW5pdFNlZ21lbnRDaGFuZ2UgPSBvO1xuICB9XG59XG5sZXQgVmggPSAwO1xuY2xhc3Mgd3Age1xuICBjb25zdHJ1Y3RvcihlLCB0LCByLCBuKSB7XG4gICAgdGhpcy5lcnJvciA9IG51bGwsIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmlkID0gdm9pZCAwLCB0aGlzLmluc3RhbmNlTm8gPSBWaCsrLCB0aGlzLm9ic2VydmVyID0gdm9pZCAwLCB0aGlzLmZyYWcgPSBudWxsLCB0aGlzLnBhcnQgPSBudWxsLCB0aGlzLnVzZVdvcmtlciA9IHZvaWQgMCwgdGhpcy53b3JrZXJDb250ZXh0ID0gbnVsbCwgdGhpcy50cmFuc211eGVyID0gbnVsbCwgdGhpcy5vblRyYW5zbXV4Q29tcGxldGUgPSB2b2lkIDAsIHRoaXMub25GbHVzaCA9IHZvaWQgMCwgdGhpcy5vbldvcmtlck1lc3NhZ2UgPSAobCkgPT4ge1xuICAgICAgY29uc3QgYyA9IGwuZGF0YSwgdSA9IHRoaXMuaGxzO1xuICAgICAgaWYgKCEoIXUgfHwgIShjICE9IG51bGwgJiYgYy5ldmVudCkgfHwgYy5pbnN0YW5jZU5vICE9PSB0aGlzLmluc3RhbmNlTm8pKVxuICAgICAgICBzd2l0Y2ggKGMuZXZlbnQpIHtcbiAgICAgICAgICBjYXNlIFwiaW5pdFwiOiB7XG4gICAgICAgICAgICB2YXIgZDtcbiAgICAgICAgICAgIGNvbnN0IGggPSAoZCA9IHRoaXMud29ya2VyQ29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IGQub2JqZWN0VVJMO1xuICAgICAgICAgICAgaCAmJiBzZWxmLlVSTC5yZXZva2VPYmplY3RVUkwoaCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcInRyYW5zbXV4Q29tcGxldGVcIjoge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVUcmFuc211eENvbXBsZXRlKGMuZGF0YSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSBcImZsdXNoXCI6IHtcbiAgICAgICAgICAgIHRoaXMub25GbHVzaChjLmRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHBhc3MgbG9ncyBmcm9tIHRoZSB3b3JrZXIgdGhyZWFkIHRvIHRoZSBtYWluIGxvZ2dlclxuICAgICAgICAgIGNhc2UgXCJ3b3JrZXJMb2dcIjoge1xuICAgICAgICAgICAgdS5sb2dnZXJbYy5kYXRhLmxvZ1R5cGVdICYmIHUubG9nZ2VyW2MuZGF0YS5sb2dUeXBlXShjLmRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYy5kYXRhID0gYy5kYXRhIHx8IHt9LCBjLmRhdGEuZnJhZyA9IHRoaXMuZnJhZywgYy5kYXRhLnBhcnQgPSB0aGlzLnBhcnQsIGMuZGF0YS5pZCA9IHRoaXMuaWQsIHUudHJpZ2dlcihjLmV2ZW50LCBjLmRhdGEpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgdGhpcy5vbldvcmtlckVycm9yID0gKGwpID0+IHtcbiAgICAgIGlmICghdGhpcy5obHMpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGMgPSBuZXcgRXJyb3IoYCR7bC5tZXNzYWdlfSAgKCR7bC5maWxlbmFtZX06JHtsLmxpbmVub30pYCk7XG4gICAgICB0aGlzLmhscy5jb25maWcuZW5hYmxlV29ya2VyID0gITEsIHRoaXMuaGxzLmxvZ2dlci53YXJuKGBFcnJvciBpbiBcIiR7dGhpcy5pZH1cIiBXZWIgV29ya2VyLCBmYWxsYmFjayB0byBpbmxpbmVgKSwgdGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLklOVEVSTkFMX0VYQ0VQVElPTixcbiAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICBldmVudDogXCJkZW11eGVyV29ya2VyXCIsXG4gICAgICAgIGVycm9yOiBjXG4gICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IGkgPSBlLmNvbmZpZztcbiAgICB0aGlzLmhscyA9IGUsIHRoaXMuaWQgPSB0LCB0aGlzLnVzZVdvcmtlciA9ICEhaS5lbmFibGVXb3JrZXIsIHRoaXMub25UcmFuc211eENvbXBsZXRlID0gciwgdGhpcy5vbkZsdXNoID0gbjtcbiAgICBjb25zdCBvID0gKGwsIGMpID0+IHtcbiAgICAgIGMgPSBjIHx8IHt9LCBjLmZyYWcgPSB0aGlzLmZyYWcgfHwgdm9pZCAwLCBsID09PSBJLkVSUk9SICYmIChjID0gYywgYy5wYXJlbnQgPSB0aGlzLmlkLCBjLnBhcnQgPSB0aGlzLnBhcnQsIHRoaXMuZXJyb3IgPSBjLmVycm9yKSwgdGhpcy5obHMudHJpZ2dlcihsLCBjKTtcbiAgICB9O1xuICAgIHRoaXMub2JzZXJ2ZXIgPSBuZXcgd3UoKSwgdGhpcy5vYnNlcnZlci5vbihJLkZSQUdfREVDUllQVEVELCBvKSwgdGhpcy5vYnNlcnZlci5vbihJLkVSUk9SLCBvKTtcbiAgICBjb25zdCBhID0gaWgoaS5wcmVmZXJNYW5hZ2VkTWVkaWFTb3VyY2UpO1xuICAgIGlmICh0aGlzLnVzZVdvcmtlciAmJiB0eXBlb2YgV29ya2VyIDwgXCJ1XCIpIHtcbiAgICAgIGNvbnN0IGwgPSB0aGlzLmhscy5sb2dnZXI7XG4gICAgICBpZiAoaS53b3JrZXJQYXRoIHx8IGFUKCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpLndvcmtlclBhdGggPyAobC5sb2coYGxvYWRpbmcgV2ViIFdvcmtlciAke2kud29ya2VyUGF0aH0gZm9yIFwiJHt0fVwiYCksIHRoaXMud29ya2VyQ29udGV4dCA9IGNUKGkud29ya2VyUGF0aCkpIDogKGwubG9nKGBpbmplY3RpbmcgV2ViIFdvcmtlciBmb3IgXCIke3R9XCJgKSwgdGhpcy53b3JrZXJDb250ZXh0ID0gbFQoKSk7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgd29ya2VyOiB1XG4gICAgICAgICAgfSA9IHRoaXMud29ya2VyQ29udGV4dDtcbiAgICAgICAgICB1LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMub25Xb3JrZXJNZXNzYWdlKSwgdS5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgdGhpcy5vbldvcmtlckVycm9yKSwgdS5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICBpbnN0YW5jZU5vOiB0aGlzLmluc3RhbmNlTm8sXG4gICAgICAgICAgICBjbWQ6IFwiaW5pdFwiLFxuICAgICAgICAgICAgdHlwZVN1cHBvcnRlZDogYSxcbiAgICAgICAgICAgIGlkOiB0LFxuICAgICAgICAgICAgY29uZmlnOiBhdChpKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoICh1KSB7XG4gICAgICAgICAgbC53YXJuKGBFcnJvciBzZXR0aW5nIHVwIFwiJHt0fVwiIFdlYiBXb3JrZXIsIGZhbGxiYWNrIHRvIGlubGluZWAsIHUpLCB0aGlzLnRlcm1pbmF0ZVdvcmtlcigpLCB0aGlzLmVycm9yID0gbnVsbCwgdGhpcy50cmFuc211eGVyID0gbmV3IEdoKHRoaXMub2JzZXJ2ZXIsIGEsIGksIFwiXCIsIHQsIGUubG9nZ2VyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudHJhbnNtdXhlciA9IG5ldyBHaCh0aGlzLm9ic2VydmVyLCBhLCBpLCBcIlwiLCB0LCBlLmxvZ2dlcik7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgaWYgKHRoaXMuZnJhZyA9IG51bGwsIHRoaXMucGFydCA9IG51bGwsIHRoaXMud29ya2VyQ29udGV4dCkge1xuICAgICAgY29uc3QgZSA9IHRoaXMuaW5zdGFuY2VObztcbiAgICAgIHRoaXMuaW5zdGFuY2VObyA9IFZoKys7XG4gICAgICBjb25zdCB0ID0gdGhpcy5obHMuY29uZmlnLCByID0gaWgodC5wcmVmZXJNYW5hZ2VkTWVkaWFTb3VyY2UpO1xuICAgICAgdGhpcy53b3JrZXJDb250ZXh0Lndvcmtlci5wb3N0TWVzc2FnZSh7XG4gICAgICAgIGluc3RhbmNlTm86IHRoaXMuaW5zdGFuY2VObyxcbiAgICAgICAgY21kOiBcInJlc2V0XCIsXG4gICAgICAgIHJlc2V0Tm86IGUsXG4gICAgICAgIHR5cGVTdXBwb3J0ZWQ6IHIsXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBjb25maWc6IGF0KHQpXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgdGVybWluYXRlV29ya2VyKCkge1xuICAgIGlmICh0aGlzLndvcmtlckNvbnRleHQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd29ya2VyOiBlXG4gICAgICB9ID0gdGhpcy53b3JrZXJDb250ZXh0O1xuICAgICAgdGhpcy53b3JrZXJDb250ZXh0ID0gbnVsbCwgZS5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLm9uV29ya2VyTWVzc2FnZSksIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVycm9yXCIsIHRoaXMub25Xb3JrZXJFcnJvciksIHVUKHRoaXMuaGxzLmNvbmZpZy53b3JrZXJQYXRoKTtcbiAgICB9XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy53b3JrZXJDb250ZXh0KVxuICAgICAgdGhpcy50ZXJtaW5hdGVXb3JrZXIoKSwgdGhpcy5vbldvcmtlck1lc3NhZ2UgPSB0aGlzLm9uV29ya2VyRXJyb3IgPSBudWxsO1xuICAgIGVsc2Uge1xuICAgICAgY29uc3QgdCA9IHRoaXMudHJhbnNtdXhlcjtcbiAgICAgIHQgJiYgKHQuZGVzdHJveSgpLCB0aGlzLnRyYW5zbXV4ZXIgPSBudWxsKTtcbiAgICB9XG4gICAgY29uc3QgZSA9IHRoaXMub2JzZXJ2ZXI7XG4gICAgZSAmJiBlLnJlbW92ZUFsbExpc3RlbmVycygpLCB0aGlzLmZyYWcgPSBudWxsLCB0aGlzLnBhcnQgPSBudWxsLCB0aGlzLm9ic2VydmVyID0gbnVsbCwgdGhpcy5obHMgPSBudWxsO1xuICB9XG4gIHB1c2goZSwgdCwgciwgbiwgaSwgbywgYSwgbCwgYywgdSkge1xuICAgIHZhciBkLCBoO1xuICAgIGMudHJhbnNtdXhpbmcuc3RhcnQgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IHtcbiAgICAgIGluc3RhbmNlTm86IGYsXG4gICAgICB0cmFuc211eGVyOiBwXG4gICAgfSA9IHRoaXMsIHkgPSBvID8gby5zdGFydCA6IGkuc3RhcnQsIEUgPSBpLmRlY3J5cHRkYXRhLCBiID0gdGhpcy5mcmFnLCBSID0gIShiICYmIGkuY2MgPT09IGIuY2MpLCBBID0gIShiICYmIGMubGV2ZWwgPT09IGIubGV2ZWwpLCBGID0gYiA/IGMuc24gLSBiLnNuIDogLTEsIE0gPSB0aGlzLnBhcnQgPyBjLnBhcnQgLSB0aGlzLnBhcnQuaW5kZXggOiAtMSwgSCA9IEYgPT09IDAgJiYgYy5pZCA+IDEgJiYgYy5pZCA9PT0gKGIgPT0gbnVsbCA/IHZvaWQgMCA6IGIuc3RhdHMuY2h1bmtDb3VudCksIEsgPSAhQSAmJiAoRiA9PT0gMSB8fCBGID09PSAwICYmIChNID09PSAxIHx8IEggJiYgTSA8PSAwKSksIGogPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpO1xuICAgIChBIHx8IEYgfHwgaS5zdGF0cy5wYXJzaW5nLnN0YXJ0ID09PSAwKSAmJiAoaS5zdGF0cy5wYXJzaW5nLnN0YXJ0ID0gaiksIG8gJiYgKE0gfHwgIUspICYmIChvLnN0YXRzLnBhcnNpbmcuc3RhcnQgPSBqKTtcbiAgICBjb25zdCBDID0gIShiICYmICgoZCA9IGkuaW5pdFNlZ21lbnQpID09IG51bGwgPyB2b2lkIDAgOiBkLnVybCkgPT09ICgoaCA9IGIuaW5pdFNlZ21lbnQpID09IG51bGwgPyB2b2lkIDAgOiBoLnVybCkpLCBrID0gbmV3IHMyKFIsIEssIGwsIEEsIHksIEMpO1xuICAgIGlmICghSyB8fCBSIHx8IEMpIHtcbiAgICAgIHRoaXMuaGxzLmxvZ2dlci5sb2coYFt0cmFuc211eGVyLWludGVyZmFjZV06IFN0YXJ0aW5nIG5ldyB0cmFuc211eCBzZXNzaW9uIGZvciAke2kudHlwZX0gc246ICR7Yy5zbn0ke2MucGFydCA+IC0xID8gXCIgcGFydDogXCIgKyBjLnBhcnQgOiBcIlwifSAke3RoaXMuaWQgPT09IHBlLk1BSU4gPyBcImxldmVsXCIgOiBcInRyYWNrXCJ9OiAke2MubGV2ZWx9IGlkOiAke2MuaWR9XG4gICAgICAgIGRpc2NvbnRpbnVpdHk6ICR7Un1cbiAgICAgICAgdHJhY2tTd2l0Y2g6ICR7QX1cbiAgICAgICAgY29udGlndW91czogJHtLfVxuICAgICAgICBhY2N1cmF0ZVRpbWVPZmZzZXQ6ICR7bH1cbiAgICAgICAgdGltZU9mZnNldDogJHt5fVxuICAgICAgICBpbml0U2VnbWVudENoYW5nZTogJHtDfWApO1xuICAgICAgY29uc3QgJCA9IG5ldyByMihyLCBuLCB0LCBhLCB1KTtcbiAgICAgIHRoaXMuY29uZmlndXJlVHJhbnNtdXhlcigkKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZnJhZyA9IGksIHRoaXMucGFydCA9IG8sIHRoaXMud29ya2VyQ29udGV4dClcbiAgICAgIHRoaXMud29ya2VyQ29udGV4dC53b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBpbnN0YW5jZU5vOiBmLFxuICAgICAgICBjbWQ6IFwiZGVtdXhcIixcbiAgICAgICAgZGF0YTogZSxcbiAgICAgICAgZGVjcnlwdGRhdGE6IEUsXG4gICAgICAgIGNodW5rTWV0YTogYyxcbiAgICAgICAgc3RhdGU6IGtcbiAgICAgIH0sIGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciA/IFtlXSA6IFtdKTtcbiAgICBlbHNlIGlmIChwKSB7XG4gICAgICBjb25zdCAkID0gcC5wdXNoKGUsIEUsIGMsIGspO1xuICAgICAgeGkoJCkgPyAkLnRoZW4oKFcpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVUcmFuc211eENvbXBsZXRlKFcpO1xuICAgICAgfSkuY2F0Y2goKFcpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc211eGVyRXJyb3IoVywgYywgXCJ0cmFuc211eGVyLWludGVyZmFjZSBwdXNoIGVycm9yXCIpO1xuICAgICAgfSkgOiB0aGlzLmhhbmRsZVRyYW5zbXV4Q29tcGxldGUoJCk7XG4gICAgfVxuICB9XG4gIGZsdXNoKGUpIHtcbiAgICBlLnRyYW5zbXV4aW5nLnN0YXJ0ID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKTtcbiAgICBjb25zdCB7XG4gICAgICBpbnN0YW5jZU5vOiB0LFxuICAgICAgdHJhbnNtdXhlcjogclxuICAgIH0gPSB0aGlzO1xuICAgIGlmICh0aGlzLndvcmtlckNvbnRleHQpXG4gICAgICB0aGlzLndvcmtlckNvbnRleHQud29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgaW5zdGFuY2VObzogdCxcbiAgICAgICAgY21kOiBcImZsdXNoXCIsXG4gICAgICAgIGNodW5rTWV0YTogZVxuICAgICAgfSk7XG4gICAgZWxzZSBpZiAocikge1xuICAgICAgY29uc3QgbiA9IHIuZmx1c2goZSk7XG4gICAgICB4aShuKSA/IG4udGhlbigoaSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZsdXNoUmVzdWx0KGksIGUpO1xuICAgICAgfSkuY2F0Y2goKGkpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc211eGVyRXJyb3IoaSwgZSwgXCJ0cmFuc211eGVyLWludGVyZmFjZSBmbHVzaCBlcnJvclwiKTtcbiAgICAgIH0pIDogdGhpcy5oYW5kbGVGbHVzaFJlc3VsdChuLCBlKTtcbiAgICB9XG4gIH1cbiAgdHJhbnNtdXhlckVycm9yKGUsIHQsIHIpIHtcbiAgICB0aGlzLmhscyAmJiAodGhpcy5lcnJvciA9IGUsIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgdHlwZTogdmUuTUVESUFfRVJST1IsXG4gICAgICBkZXRhaWxzOiBKLkZSQUdfUEFSU0lOR19FUlJPUixcbiAgICAgIGNodW5rTWV0YTogdCxcbiAgICAgIGZyYWc6IHRoaXMuZnJhZyB8fCB2b2lkIDAsXG4gICAgICBwYXJ0OiB0aGlzLnBhcnQgfHwgdm9pZCAwLFxuICAgICAgZmF0YWw6ICExLFxuICAgICAgZXJyb3I6IGUsXG4gICAgICBlcnI6IGUsXG4gICAgICByZWFzb246IHJcbiAgICB9KSk7XG4gIH1cbiAgaGFuZGxlRmx1c2hSZXN1bHQoZSwgdCkge1xuICAgIGUuZm9yRWFjaCgocikgPT4ge1xuICAgICAgdGhpcy5oYW5kbGVUcmFuc211eENvbXBsZXRlKHIpO1xuICAgIH0pLCB0aGlzLm9uRmx1c2godCk7XG4gIH1cbiAgY29uZmlndXJlVHJhbnNtdXhlcihlKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW5zdGFuY2VObzogdCxcbiAgICAgIHRyYW5zbXV4ZXI6IHJcbiAgICB9ID0gdGhpcztcbiAgICB0aGlzLndvcmtlckNvbnRleHQgPyB0aGlzLndvcmtlckNvbnRleHQud29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgIGluc3RhbmNlTm86IHQsXG4gICAgICBjbWQ6IFwiY29uZmlndXJlXCIsXG4gICAgICBjb25maWc6IGVcbiAgICB9KSA6IHIgJiYgci5jb25maWd1cmUoZSk7XG4gIH1cbiAgaGFuZGxlVHJhbnNtdXhDb21wbGV0ZShlKSB7XG4gICAgZS5jaHVua01ldGEudHJhbnNtdXhpbmcuZW5kID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgdGhpcy5vblRyYW5zbXV4Q29tcGxldGUoZSk7XG4gIH1cbn1cbmNvbnN0IGpoID0gMTAwO1xuY2xhc3MgbjIgZXh0ZW5kcyBUdSB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIpIHtcbiAgICBzdXBlcihlLCB0LCByLCBcImF1ZGlvLXN0cmVhbS1jb250cm9sbGVyXCIsIHBlLkFVRElPKSwgdGhpcy5tYWluQW5jaG9yID0gbnVsbCwgdGhpcy5tYWluRnJhZ0xvYWRpbmcgPSBudWxsLCB0aGlzLmF1ZGlvT25seSA9ICExLCB0aGlzLmJ1ZmZlcmVkVHJhY2sgPSBudWxsLCB0aGlzLnN3aXRjaGluZ1RyYWNrID0gbnVsbCwgdGhpcy50cmFja0lkID0gLTEsIHRoaXMud2FpdGluZ0RhdGEgPSBudWxsLCB0aGlzLm1haW5EZXRhaWxzID0gbnVsbCwgdGhpcy5mbHVzaGluZyA9ICExLCB0aGlzLmJ1ZmZlckZsdXNoZWQgPSAhMSwgdGhpcy5jYWNoZWRUcmFja0xvYWRlZERhdGEgPSBudWxsLCB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gIH1cbiAgb25IYW5kbGVyRGVzdHJveWluZygpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgc3VwZXIub25IYW5kbGVyRGVzdHJveWluZygpLCB0aGlzLnJlc2V0SXRlbSgpO1xuICB9XG4gIHJlc2V0SXRlbSgpIHtcbiAgICB0aGlzLm1haW5EZXRhaWxzID0gdGhpcy5tYWluQW5jaG9yID0gdGhpcy5tYWluRnJhZ0xvYWRpbmcgPSB0aGlzLmJ1ZmZlcmVkVHJhY2sgPSB0aGlzLnN3aXRjaGluZ1RyYWNrID0gdGhpcy53YWl0aW5nRGF0YSA9IHRoaXMuY2FjaGVkVHJhY2tMb2FkZWREYXRhID0gbnVsbDtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBzdXBlci5yZWdpc3Rlckxpc3RlbmVycygpO1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5MRVZFTF9MT0FERUQsIHRoaXMub25MZXZlbExvYWRlZCwgdGhpcyksIGUub24oSS5BVURJT19UUkFDS1NfVVBEQVRFRCwgdGhpcy5vbkF1ZGlvVHJhY2tzVXBkYXRlZCwgdGhpcyksIGUub24oSS5BVURJT19UUkFDS19TV0lUQ0hJTkcsIHRoaXMub25BdWRpb1RyYWNrU3dpdGNoaW5nLCB0aGlzKSwgZS5vbihJLkFVRElPX1RSQUNLX0xPQURFRCwgdGhpcy5vbkF1ZGlvVHJhY2tMb2FkZWQsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX1JFU0VULCB0aGlzLm9uQnVmZmVyUmVzZXQsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX0NSRUFURUQsIHRoaXMub25CdWZmZXJDcmVhdGVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSEVELCB0aGlzLm9uQnVmZmVyRmx1c2hlZCwgdGhpcyksIGUub24oSS5JTklUX1BUU19GT1VORCwgdGhpcy5vbkluaXRQdHNGb3VuZCwgdGhpcyksIGUub24oSS5GUkFHX0xPQURJTkcsIHRoaXMub25GcmFnTG9hZGluZywgdGhpcyksIGUub24oSS5GUkFHX0JVRkZFUkVELCB0aGlzLm9uRnJhZ0J1ZmZlcmVkLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUgJiYgKHN1cGVyLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgZS5vZmYoSS5MRVZFTF9MT0FERUQsIHRoaXMub25MZXZlbExvYWRlZCwgdGhpcyksIGUub2ZmKEkuQVVESU9fVFJBQ0tTX1VQREFURUQsIHRoaXMub25BdWRpb1RyYWNrc1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkFVRElPX1RSQUNLX1NXSVRDSElORywgdGhpcy5vbkF1ZGlvVHJhY2tTd2l0Y2hpbmcsIHRoaXMpLCBlLm9mZihJLkFVRElPX1RSQUNLX0xPQURFRCwgdGhpcy5vbkF1ZGlvVHJhY2tMb2FkZWQsIHRoaXMpLCBlLm9mZihJLkJVRkZFUl9SRVNFVCwgdGhpcy5vbkJ1ZmZlclJlc2V0LCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfQ1JFQVRFRCwgdGhpcy5vbkJ1ZmZlckNyZWF0ZWQsIHRoaXMpLCBlLm9mZihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfRkxVU0hFRCwgdGhpcy5vbkJ1ZmZlckZsdXNoZWQsIHRoaXMpLCBlLm9mZihJLklOSVRfUFRTX0ZPVU5ELCB0aGlzLm9uSW5pdFB0c0ZvdW5kLCB0aGlzKSwgZS5vZmYoSS5GUkFHX0xPQURJTkcsIHRoaXMub25GcmFnTG9hZGluZywgdGhpcyksIGUub2ZmKEkuRlJBR19CVUZGRVJFRCwgdGhpcy5vbkZyYWdCdWZmZXJlZCwgdGhpcykpO1xuICB9XG4gIC8vIElOSVRfUFRTX0ZPVU5EIGlzIHRyaWdnZXJlZCB3aGVuIHRoZSB2aWRlbyB0cmFjayBwYXJzZWQgaW4gdGhlIHN0cmVhbS1jb250cm9sbGVyIGhhcyBhIG5ldyBQVFMgdmFsdWVcbiAgb25Jbml0UHRzRm91bmQoZSwge1xuICAgIGZyYWc6IHQsXG4gICAgaWQ6IHIsXG4gICAgaW5pdFBUUzogbixcbiAgICB0aW1lc2NhbGU6IGksXG4gICAgdHJhY2tJZDogb1xuICB9KSB7XG4gICAgaWYgKHIgPT09IHBlLk1BSU4pIHtcbiAgICAgIGNvbnN0IGEgPSB0LmNjLCBsID0gdGhpcy5mcmFnQ3VycmVudDtcbiAgICAgIGlmICh0aGlzLmluaXRQVFNbYV0gPSB7XG4gICAgICAgIGJhc2VUaW1lOiBuLFxuICAgICAgICB0aW1lc2NhbGU6IGksXG4gICAgICAgIHRyYWNrSWQ6IG9cbiAgICAgIH0sIHRoaXMubG9nKGBJbml0UFRTIGZvciBjYzogJHthfSBmb3VuZCBmcm9tIG1haW46ICR7biAvIGl9ICgke259LyR7aX0pIHRyYWNrSWQ6ICR7b31gKSwgdGhpcy5tYWluQW5jaG9yID0gdCwgdGhpcy5zdGF0ZSA9PT0gbmUuV0FJVElOR19JTklUX1BUUykge1xuICAgICAgICBjb25zdCBjID0gdGhpcy53YWl0aW5nRGF0YTtcbiAgICAgICAgKCFjICYmICF0aGlzLmxvYWRpbmdQYXJ0cyB8fCBjICYmIGMuZnJhZy5jYyAhPT0gYSkgJiYgdGhpcy5zeW5jV2l0aEFuY2hvcih0LCBjID09IG51bGwgPyB2b2lkIDAgOiBjLmZyYWcpO1xuICAgICAgfSBlbHNlICF0aGlzLmhscy5oYXNFbm91Z2hUb1N0YXJ0ICYmIGwgJiYgbC5jYyAhPT0gYSA/IChsLmFib3J0UmVxdWVzdHMoKSwgdGhpcy5zeW5jV2l0aEFuY2hvcih0LCBsKSkgOiB0aGlzLnN0YXRlID09PSBuZS5JRExFICYmIHRoaXMudGljaygpO1xuICAgIH1cbiAgfVxuICBnZXRMb2FkUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuICF0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCAmJiB0aGlzLm5leHRMb2FkUG9zaXRpb24gPj0gMCA/IHRoaXMubmV4dExvYWRQb3NpdGlvbiA6IHN1cGVyLmdldExvYWRQb3NpdGlvbigpO1xuICB9XG4gIHN5bmNXaXRoQW5jaG9yKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gKChyID0gdGhpcy5tYWluRnJhZ0xvYWRpbmcpID09IG51bGwgPyB2b2lkIDAgOiByLmZyYWcpIHx8IG51bGw7XG4gICAgaWYgKHQgJiYgKG4gPT0gbnVsbCA/IHZvaWQgMCA6IG4uY2MpID09PSB0LmNjKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGkgPSAobiB8fCBlKS5jYywgbyA9IHRoaXMuZ2V0TGV2ZWxEZXRhaWxzKCksIGEgPSB0aGlzLmdldExvYWRQb3NpdGlvbigpLCBsID0gVmcobywgaSwgYSk7XG4gICAgbCAmJiAodGhpcy5sb2coYFN5bmNpbmcgd2l0aCBtYWluIGZyYWcgYXQgJHtsLnN0YXJ0fSBjYyAke2wuY2N9YCksIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITEsIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IGwuc3RhcnQsIHRoaXMucmVzZXRMb2FkaW5nU3RhdGUoKSwgdGhpcy5zdGF0ZSA9PT0gbmUuSURMRSAmJiB0aGlzLmRvVGlja0lkbGUoKSk7XG4gIH1cbiAgc3RhcnRMb2FkKGUsIHQpIHtcbiAgICBpZiAoIXRoaXMubGV2ZWxzKSB7XG4gICAgICB0aGlzLnN0YXJ0UG9zaXRpb24gPSBlLCB0aGlzLnN0YXRlID0gbmUuU1RPUFBFRDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgciA9IHRoaXMubGFzdEN1cnJlbnRUaW1lO1xuICAgIHRoaXMuc3RvcExvYWQoKSwgdGhpcy5zZXRJbnRlcnZhbChqaCksIHIgPiAwICYmIGUgPT09IC0xID8gKHRoaXMubG9nKGBPdmVycmlkZSBzdGFydFBvc2l0aW9uIHdpdGggbGFzdEN1cnJlbnRUaW1lIEAke3IudG9GaXhlZCgzKX1gKSwgZSA9IHIsIHRoaXMuc3RhdGUgPSBuZS5JRExFKSA6IHRoaXMuc3RhdGUgPSBuZS5XQUlUSU5HX1RSQUNLLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IGUgKyB0aGlzLnRpbWVsaW5lT2Zmc2V0LCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0ID8gLTEgOiBlLCB0aGlzLnRpY2soKTtcbiAgfVxuICBkb1RpY2soKSB7XG4gICAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XG4gICAgICBjYXNlIG5lLklETEU6XG4gICAgICAgIHRoaXMuZG9UaWNrSWRsZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgbmUuV0FJVElOR19UUkFDSzoge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgbGV2ZWxzOiBlLFxuICAgICAgICAgIHRyYWNrSWQ6IHRcbiAgICAgICAgfSA9IHRoaXMsIHIgPSBlID09IG51bGwgPyB2b2lkIDAgOiBlW3RdLCBuID0gciA9PSBudWxsID8gdm9pZCAwIDogci5kZXRhaWxzO1xuICAgICAgICBpZiAobiAmJiAhdGhpcy53YWl0Rm9yTGl2ZShyKSkge1xuICAgICAgICAgIGlmICh0aGlzLndhaXRGb3JDZG5UdW5lSW4obikpXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB0aGlzLnN0YXRlID0gbmUuV0FJVElOR19JTklUX1BUUztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgbmUuRlJBR19MT0FESU5HX1dBSVRJTkdfUkVUUlk6IHtcbiAgICAgICAgdGhpcy5jaGVja1JldHJ5RGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgbmUuV0FJVElOR19JTklUX1BUUzoge1xuICAgICAgICBjb25zdCBlID0gdGhpcy53YWl0aW5nRGF0YTtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmcmFnOiB0LFxuICAgICAgICAgICAgcGFydDogcixcbiAgICAgICAgICAgIGNhY2hlOiBuLFxuICAgICAgICAgICAgY29tcGxldGU6IGlcbiAgICAgICAgICB9ID0gZSwgbyA9IHRoaXMubWFpbkFuY2hvcjtcbiAgICAgICAgICBpZiAodGhpcy5pbml0UFRTW3QuY2NdICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgIHRoaXMud2FpdGluZ0RhdGEgPSBudWxsLCB0aGlzLnN0YXRlID0gbmUuRlJBR19MT0FESU5HO1xuICAgICAgICAgICAgY29uc3QgYSA9IG4uZmx1c2goKS5idWZmZXIsIGwgPSB7XG4gICAgICAgICAgICAgIGZyYWc6IHQsXG4gICAgICAgICAgICAgIHBhcnQ6IHIsXG4gICAgICAgICAgICAgIHBheWxvYWQ6IGEsXG4gICAgICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiBudWxsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlRnJhZ21lbnRMb2FkUHJvZ3Jlc3MobCksIGkgJiYgc3VwZXIuX2hhbmRsZUZyYWdtZW50TG9hZENvbXBsZXRlKGwpO1xuICAgICAgICAgIH0gZWxzZSBvICYmIG8uY2MgIT09IGUuZnJhZy5jYyAmJiB0aGlzLnN5bmNXaXRoQW5jaG9yKG8sIGUuZnJhZyk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLm9uVGlja0VuZCgpO1xuICB9XG4gIHJlc2V0TG9hZGluZ1N0YXRlKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLndhaXRpbmdEYXRhO1xuICAgIGUgJiYgKHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KGUuZnJhZyksIHRoaXMud2FpdGluZ0RhdGEgPSBudWxsKSwgc3VwZXIucmVzZXRMb2FkaW5nU3RhdGUoKTtcbiAgfVxuICBvblRpY2tFbmQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlICE9IG51bGwgJiYgZS5yZWFkeVN0YXRlICYmICh0aGlzLmxhc3RDdXJyZW50VGltZSA9IGUuY3VycmVudFRpbWUpO1xuICB9XG4gIGRvVGlja0lkbGUoKSB7XG4gICAgdmFyIGU7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiB0LFxuICAgICAgbGV2ZWxzOiByLFxuICAgICAgbWVkaWE6IG4sXG4gICAgICB0cmFja0lkOiBpXG4gICAgfSA9IHRoaXMsIG8gPSB0LmNvbmZpZztcbiAgICBpZiAoIXRoaXMuYnVmZmVyaW5nIHx8ICFuICYmICF0aGlzLnByaW1hcnlQcmVmZXRjaCAmJiAodGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgfHwgIW8uc3RhcnRGcmFnUHJlZmV0Y2gpIHx8ICEociAhPSBudWxsICYmIHJbaV0pKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGEgPSByW2ldLCBsID0gYS5kZXRhaWxzO1xuICAgIGlmICghbCB8fCB0aGlzLndhaXRGb3JMaXZlKGEpIHx8IHRoaXMud2FpdEZvckNkblR1bmVJbihsKSkge1xuICAgICAgdGhpcy5zdGF0ZSA9IG5lLldBSVRJTkdfVFJBQ0ssIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITE7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGMgPSB0aGlzLm1lZGlhQnVmZmVyID8gdGhpcy5tZWRpYUJ1ZmZlciA6IHRoaXMubWVkaWE7XG4gICAgdGhpcy5idWZmZXJGbHVzaGVkICYmIGMgJiYgKHRoaXMuYnVmZmVyRmx1c2hlZCA9ICExLCB0aGlzLmFmdGVyQnVmZmVyRmx1c2hlZChjLCBvdC5BVURJTywgcGUuQVVESU8pKTtcbiAgICBjb25zdCB1ID0gdGhpcy5nZXRGd2RCdWZmZXJJbmZvKGMsIHBlLkFVRElPKTtcbiAgICBpZiAodSA9PT0gbnVsbClcbiAgICAgIHJldHVybjtcbiAgICBpZiAoIXRoaXMuc3dpdGNoaW5nVHJhY2sgJiYgdGhpcy5fc3RyZWFtRW5kZWQodSwgbCkpIHtcbiAgICAgIHQudHJpZ2dlcihJLkJVRkZFUl9FT1MsIHtcbiAgICAgICAgdHlwZTogXCJhdWRpb1wiXG4gICAgICB9KSwgdGhpcy5zdGF0ZSA9IG5lLkVOREVEO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkID0gdS5sZW4sIGggPSB0Lm1heEJ1ZmZlckxlbmd0aCwgZiA9IGwuZnJhZ21lbnRzLCBwID0gZlswXS5zdGFydCwgeSA9IHRoaXMuZ2V0TG9hZFBvc2l0aW9uKCksIEUgPSB0aGlzLmZsdXNoaW5nID8geSA6IHUuZW5kO1xuICAgIGlmICh0aGlzLnN3aXRjaGluZ1RyYWNrICYmIG4pIHtcbiAgICAgIGNvbnN0IEEgPSB5O1xuICAgICAgbC5QVFNLbm93biAmJiBBIDwgcCAmJiAodS5lbmQgPiBwIHx8IHUubmV4dFN0YXJ0KSAmJiAodGhpcy5sb2coXCJBbHQgYXVkaW8gdHJhY2sgYWhlYWQgb2YgbWFpbiB0cmFjaywgc2VlayB0byBzdGFydCBvZiBhbHQgYXVkaW8gdHJhY2tcIiksIG4uY3VycmVudFRpbWUgPSBwICsgMC4wNSk7XG4gICAgfVxuICAgIGlmIChkID49IGggJiYgIXRoaXMuc3dpdGNoaW5nVHJhY2sgJiYgRSA8IGZbZi5sZW5ndGggLSAxXS5zdGFydClcbiAgICAgIHJldHVybjtcbiAgICBsZXQgYiA9IHRoaXMuZ2V0TmV4dEZyYWdtZW50KEUsIGwpO1xuICAgIGlmIChiICYmIHRoaXMuaXNMb29wTG9hZGluZyhiLCBFKSAmJiAoYiA9IHRoaXMuZ2V0TmV4dEZyYWdtZW50TG9vcExvYWRpbmcoYiwgbCwgdSwgcGUuTUFJTiwgaCkpLCAhYikge1xuICAgICAgdGhpcy5idWZmZXJGbHVzaGVkID0gITA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBSID0gKChlID0gdGhpcy5tYWluRnJhZ0xvYWRpbmcpID09IG51bGwgPyB2b2lkIDAgOiBlLmZyYWcpIHx8IG51bGw7XG4gICAgaWYgKCF0aGlzLmF1ZGlvT25seSAmJiB0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCAmJiBSICYmIFZ0KGIpICYmICFiLmVuZExpc3QgJiYgKCFsLmxpdmUgfHwgIXRoaXMubG9hZGluZ1BhcnRzICYmIEUgPCB0aGlzLmhscy5saXZlU3luY1Bvc2l0aW9uKSAmJiAodGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoUikgPT09IEh0Lk9LICYmICh0aGlzLm1haW5GcmFnTG9hZGluZyA9IFIgPSBudWxsKSwgUiAmJiBWdChSKSkpIHtcbiAgICAgIGlmIChiLnN0YXJ0ID4gUi5lbmQpIHtcbiAgICAgICAgY29uc3QgRiA9IHRoaXMuZnJhZ21lbnRUcmFja2VyLmdldEZyYWdBdFBvcyhFLCBwZS5NQUlOKTtcbiAgICAgICAgRiAmJiBGLmVuZCA+IFIuZW5kICYmIChSID0gRiwgdGhpcy5tYWluRnJhZ0xvYWRpbmcgPSB7XG4gICAgICAgICAgZnJhZzogRixcbiAgICAgICAgICB0YXJnZXRCdWZmZXJUaW1lOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGIuc3RhcnQgPiBSLmVuZClcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmxvYWRGcmFnbWVudChiLCBhLCBFKTtcbiAgfVxuICBvbk1lZGlhRGV0YWNoaW5nKGUsIHQpIHtcbiAgICB0aGlzLmJ1ZmZlckZsdXNoZWQgPSB0aGlzLmZsdXNoaW5nID0gITEsIHN1cGVyLm9uTWVkaWFEZXRhY2hpbmcoZSwgdCk7XG4gIH1cbiAgb25BdWRpb1RyYWNrc1VwZGF0ZWQoZSwge1xuICAgIGF1ZGlvVHJhY2tzOiB0XG4gIH0pIHtcbiAgICB0aGlzLnJlc2V0VHJhbnNtdXhlcigpLCB0aGlzLmxldmVscyA9IHQubWFwKChyKSA9PiBuZXcgbWkocikpO1xuICB9XG4gIG9uQXVkaW9UcmFja1N3aXRjaGluZyhlLCB0KSB7XG4gICAgY29uc3QgciA9ICEhdC51cmw7XG4gICAgdGhpcy50cmFja0lkID0gdC5pZDtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnQ3VycmVudDogblxuICAgIH0gPSB0aGlzO1xuICAgIG4gJiYgKG4uYWJvcnRSZXF1ZXN0cygpLCB0aGlzLnJlbW92ZVVuYnVmZmVyZWRGcmFncyhuLnN0YXJ0KSksIHRoaXMucmVzZXRMb2FkaW5nU3RhdGUoKSwgciA/ICh0aGlzLnN3aXRjaGluZ1RyYWNrID0gdCwgdGhpcy5mbHVzaEF1ZGlvSWZOZWVkZWQodCksIHRoaXMuc3RhdGUgIT09IG5lLlNUT1BQRUQgJiYgKHRoaXMuc2V0SW50ZXJ2YWwoamgpLCB0aGlzLnN0YXRlID0gbmUuSURMRSwgdGhpcy50aWNrKCkpKSA6ICh0aGlzLnJlc2V0VHJhbnNtdXhlcigpLCB0aGlzLnN3aXRjaGluZ1RyYWNrID0gbnVsbCwgdGhpcy5idWZmZXJlZFRyYWNrID0gdCwgdGhpcy5jbGVhckludGVydmFsKCkpO1xuICB9XG4gIG9uTWFuaWZlc3RMb2FkaW5nKCkge1xuICAgIHN1cGVyLm9uTWFuaWZlc3RMb2FkaW5nKCksIHRoaXMuYnVmZmVyRmx1c2hlZCA9IHRoaXMuZmx1c2hpbmcgPSB0aGlzLmF1ZGlvT25seSA9ICExLCB0aGlzLnJlc2V0SXRlbSgpLCB0aGlzLnRyYWNrSWQgPSAtMTtcbiAgfVxuICBvbkxldmVsTG9hZGVkKGUsIHQpIHtcbiAgICB0aGlzLm1haW5EZXRhaWxzID0gdC5kZXRhaWxzO1xuICAgIGNvbnN0IHIgPSB0aGlzLmNhY2hlZFRyYWNrTG9hZGVkRGF0YTtcbiAgICByICYmICh0aGlzLmNhY2hlZFRyYWNrTG9hZGVkRGF0YSA9IG51bGwsIHRoaXMub25BdWRpb1RyYWNrTG9hZGVkKEkuQVVESU9fVFJBQ0tfTE9BREVELCByKSk7XG4gIH1cbiAgb25BdWRpb1RyYWNrTG9hZGVkKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCB7XG4gICAgICBsZXZlbHM6IG5cbiAgICB9ID0gdGhpcywge1xuICAgICAgZGV0YWlsczogaSxcbiAgICAgIGlkOiBvLFxuICAgICAgZ3JvdXBJZDogYSxcbiAgICAgIHRyYWNrOiBsXG4gICAgfSA9IHQ7XG4gICAgaWYgKCFuKSB7XG4gICAgICB0aGlzLndhcm4oYEF1ZGlvIHRyYWNrcyByZXNldCB3aGlsZSBsb2FkaW5nIHRyYWNrICR7b30gXCIke2wubmFtZX1cIiBvZiBcIiR7YX1cImApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjID0gdGhpcy5tYWluRGV0YWlscztcbiAgICBpZiAoIWMgfHwgaS5lbmRDQyA+IGMuZW5kQ0MgfHwgYy5leHBpcmVkKSB7XG4gICAgICB0aGlzLmNhY2hlZFRyYWNrTG9hZGVkRGF0YSA9IHQsIHRoaXMuc3RhdGUgIT09IG5lLlNUT1BQRUQgJiYgKHRoaXMuc3RhdGUgPSBuZS5XQUlUSU5HX1RSQUNLKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5jYWNoZWRUcmFja0xvYWRlZERhdGEgPSBudWxsLCB0aGlzLmxvZyhgQXVkaW8gdHJhY2sgJHtvfSBcIiR7bC5uYW1lfVwiIG9mIFwiJHthfVwiIGxvYWRlZCBbJHtpLnN0YXJ0U059LCR7aS5lbmRTTn1dJHtpLmxhc3RQYXJ0U24gPyBgW3BhcnQtJHtpLmxhc3RQYXJ0U259LSR7aS5sYXN0UGFydEluZGV4fV1gIDogXCJcIn0sZHVyYXRpb246JHtpLnRvdGFsZHVyYXRpb259YCk7XG4gICAgY29uc3QgdSA9IG5bb107XG4gICAgbGV0IGQgPSAwO1xuICAgIGlmIChpLmxpdmUgfHwgKHIgPSB1LmRldGFpbHMpICE9IG51bGwgJiYgci5saXZlKSB7XG4gICAgICBpZiAodGhpcy5jaGVja0xpdmVVcGRhdGUoaSksIGkuZGVsdGFVcGRhdGVGYWlsZWQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGlmICh1LmRldGFpbHMpIHtcbiAgICAgICAgdmFyIGg7XG4gICAgICAgIGQgPSB0aGlzLmFsaWduUGxheWxpc3RzKGksIHUuZGV0YWlscywgKGggPSB0aGlzLmxldmVsTGFzdExvYWRlZCkgPT0gbnVsbCA/IHZvaWQgMCA6IGguZGV0YWlscyk7XG4gICAgICB9XG4gICAgICBpLmFsaWduZWRTbGlkaW5nIHx8IChucChpLCBjKSwgaS5hbGlnbmVkU2xpZGluZyB8fCBzYShpLCBjKSwgZCA9IGkuZnJhZ21lbnRTdGFydCk7XG4gICAgfVxuICAgIHUuZGV0YWlscyA9IGksIHRoaXMubGV2ZWxMYXN0TG9hZGVkID0gdSwgdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgfHwgdGhpcy5zZXRTdGFydFBvc2l0aW9uKGMsIGQpLCB0aGlzLmhscy50cmlnZ2VyKEkuQVVESU9fVFJBQ0tfVVBEQVRFRCwge1xuICAgICAgZGV0YWlsczogaSxcbiAgICAgIGlkOiBvLFxuICAgICAgZ3JvdXBJZDogdC5ncm91cElkXG4gICAgfSksIHRoaXMuc3RhdGUgPT09IG5lLldBSVRJTkdfVFJBQ0sgJiYgIXRoaXMud2FpdEZvckNkblR1bmVJbihpKSAmJiAodGhpcy5zdGF0ZSA9IG5lLklETEUpLCB0aGlzLnRpY2soKTtcbiAgfVxuICBfaGFuZGxlRnJhZ21lbnRMb2FkUHJvZ3Jlc3MoZSkge1xuICAgIHZhciB0O1xuICAgIGNvbnN0IHIgPSBlLmZyYWcsIHtcbiAgICAgIHBhcnQ6IG4sXG4gICAgICBwYXlsb2FkOiBpXG4gICAgfSA9IGUsIHtcbiAgICAgIGNvbmZpZzogbyxcbiAgICAgIHRyYWNrSWQ6IGEsXG4gICAgICBsZXZlbHM6IGxcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIWwpIHtcbiAgICAgIHRoaXMud2FybihgQXVkaW8gdHJhY2tzIHdlcmUgcmVzZXQgd2hpbGUgZnJhZ21lbnQgbG9hZCB3YXMgaW4gcHJvZ3Jlc3MuIEZyYWdtZW50ICR7ci5zbn0gb2YgbGV2ZWwgJHtyLmxldmVsfSB3aWxsIG5vdCBiZSBidWZmZXJlZGApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBjID0gbFthXTtcbiAgICBpZiAoIWMpIHtcbiAgICAgIHRoaXMud2FybihcIkF1ZGlvIHRyYWNrIGlzIHVuZGVmaW5lZCBvbiBmcmFnbWVudCBsb2FkIHByb2dyZXNzXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1ID0gYy5kZXRhaWxzO1xuICAgIGlmICghdSkge1xuICAgICAgdGhpcy53YXJuKFwiQXVkaW8gdHJhY2sgZGV0YWlscyB1bmRlZmluZWQgb24gZnJhZ21lbnQgbG9hZCBwcm9ncmVzc1wiKSwgdGhpcy5yZW1vdmVVbmJ1ZmZlcmVkRnJhZ3Moci5zdGFydCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSBvLmRlZmF1bHRBdWRpb0NvZGVjIHx8IGMuYXVkaW9Db2RlYyB8fCBcIm1wNGEuNDAuMlwiO1xuICAgIGxldCBoID0gdGhpcy50cmFuc211eGVyO1xuICAgIGggfHwgKGggPSB0aGlzLnRyYW5zbXV4ZXIgPSBuZXcgd3AodGhpcy5obHMsIHBlLkFVRElPLCB0aGlzLl9oYW5kbGVUcmFuc211eENvbXBsZXRlLmJpbmQodGhpcyksIHRoaXMuX2hhbmRsZVRyYW5zbXV4ZXJGbHVzaC5iaW5kKHRoaXMpKSk7XG4gICAgY29uc3QgZiA9IHRoaXMuaW5pdFBUU1tyLmNjXSwgcCA9ICh0ID0gci5pbml0U2VnbWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZGF0YTtcbiAgICBpZiAoZiAhPT0gdm9pZCAwKSB7XG4gICAgICBjb25zdCBFID0gbiA/IG4uaW5kZXggOiAtMSwgYiA9IEUgIT09IC0xLCBSID0gbmV3IEV1KHIubGV2ZWwsIHIuc24sIHIuc3RhdHMuY2h1bmtDb3VudCwgaS5ieXRlTGVuZ3RoLCBFLCBiKTtcbiAgICAgIGgucHVzaChpLCBwLCBkLCBcIlwiLCByLCBuLCB1LnRvdGFsZHVyYXRpb24sICExLCBSLCBmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sb2coYFVua25vd24gdmlkZW8gUFRTIGZvciBjYyAke3IuY2N9LCB3YWl0aW5nIGZvciB2aWRlbyBQVFMgYmVmb3JlIGRlbXV4aW5nIGF1ZGlvIGZyYWcgJHtyLnNufSBvZiBbJHt1LnN0YXJ0U059ICwke3UuZW5kU059XSx0cmFjayAke2F9YCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNhY2hlOiB5XG4gICAgICB9ID0gdGhpcy53YWl0aW5nRGF0YSA9IHRoaXMud2FpdGluZ0RhdGEgfHwge1xuICAgICAgICBmcmFnOiByLFxuICAgICAgICBwYXJ0OiBuLFxuICAgICAgICBjYWNoZTogbmV3IGlwKCksXG4gICAgICAgIGNvbXBsZXRlOiAhMVxuICAgICAgfTtcbiAgICAgIHkucHVzaChuZXcgVWludDhBcnJheShpKSksIHRoaXMuc3RhdGUgIT09IG5lLlNUT1BQRUQgJiYgKHRoaXMuc3RhdGUgPSBuZS5XQUlUSU5HX0lOSVRfUFRTKTtcbiAgICB9XG4gIH1cbiAgX2hhbmRsZUZyYWdtZW50TG9hZENvbXBsZXRlKGUpIHtcbiAgICBpZiAodGhpcy53YWl0aW5nRGF0YSkge1xuICAgICAgdGhpcy53YWl0aW5nRGF0YS5jb21wbGV0ZSA9ICEwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzdXBlci5faGFuZGxlRnJhZ21lbnRMb2FkQ29tcGxldGUoZSk7XG4gIH1cbiAgb25CdWZmZXJSZXNldCgpIHtcbiAgICB0aGlzLm1lZGlhQnVmZmVyID0gbnVsbDtcbiAgfVxuICBvbkJ1ZmZlckNyZWF0ZWQoZSwgdCkge1xuICAgIHRoaXMuYnVmZmVyRmx1c2hlZCA9IHRoaXMuZmx1c2hpbmcgPSAhMTtcbiAgICBjb25zdCByID0gdC50cmFja3MuYXVkaW87XG4gICAgciAmJiAodGhpcy5tZWRpYUJ1ZmZlciA9IHIuYnVmZmVyIHx8IG51bGwpO1xuICB9XG4gIG9uRnJhZ0xvYWRpbmcoZSwgdCkge1xuICAgICF0aGlzLmF1ZGlvT25seSAmJiB0LmZyYWcudHlwZSA9PT0gcGUuTUFJTiAmJiBWdCh0LmZyYWcpICYmICh0aGlzLm1haW5GcmFnTG9hZGluZyA9IHQsIHRoaXMuc3RhdGUgPT09IG5lLklETEUgJiYgdGhpcy50aWNrKCkpO1xuICB9XG4gIG9uRnJhZ0J1ZmZlcmVkKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnOiByLFxuICAgICAgcGFydDogblxuICAgIH0gPSB0O1xuICAgIGlmIChyLnR5cGUgIT09IHBlLkFVRElPKSB7XG4gICAgICAhdGhpcy5hdWRpb09ubHkgJiYgci50eXBlID09PSBwZS5NQUlOICYmICFyLmVsZW1lbnRhcnlTdHJlYW1zLnZpZGVvICYmICFyLmVsZW1lbnRhcnlTdHJlYW1zLmF1ZGlvdmlkZW8gJiYgKHRoaXMuYXVkaW9Pbmx5ID0gITAsIHRoaXMubWFpbkZyYWdMb2FkaW5nID0gbnVsbCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmZyYWdDb250ZXh0Q2hhbmdlZChyKSkge1xuICAgICAgdGhpcy53YXJuKGBGcmFnbWVudCAke3Iuc259JHtuID8gXCIgcDogXCIgKyBuLmluZGV4IDogXCJcIn0gb2YgbGV2ZWwgJHtyLmxldmVsfSBmaW5pc2hlZCBidWZmZXJpbmcsIGJ1dCB3YXMgYWJvcnRlZC4gc3RhdGU6ICR7dGhpcy5zdGF0ZX0sIGF1ZGlvU3dpdGNoOiAke3RoaXMuc3dpdGNoaW5nVHJhY2sgPyB0aGlzLnN3aXRjaGluZ1RyYWNrLm5hbWUgOiBcImZhbHNlXCJ9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChWdChyKSkge1xuICAgICAgdGhpcy5mcmFnUHJldmlvdXMgPSByO1xuICAgICAgY29uc3QgaSA9IHRoaXMuc3dpdGNoaW5nVHJhY2s7XG4gICAgICBpICYmICh0aGlzLmJ1ZmZlcmVkVHJhY2sgPSBpLCB0aGlzLnN3aXRjaGluZ1RyYWNrID0gbnVsbCwgdGhpcy5obHMudHJpZ2dlcihJLkFVRElPX1RSQUNLX1NXSVRDSEVELCB0dCh7fSwgaSkpKTtcbiAgICB9XG4gICAgdGhpcy5mcmFnQnVmZmVyZWRDb21wbGV0ZShyLCBuKSwgdGhpcy5tZWRpYSAmJiB0aGlzLnRpY2soKTtcbiAgfVxuICBvbkVycm9yKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBpZiAodC5mYXRhbCkge1xuICAgICAgdGhpcy5zdGF0ZSA9IG5lLkVSUk9SO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzd2l0Y2ggKHQuZGV0YWlscykge1xuICAgICAgY2FzZSBKLkZSQUdfR0FQOlxuICAgICAgY2FzZSBKLkZSQUdfUEFSU0lOR19FUlJPUjpcbiAgICAgIGNhc2UgSi5GUkFHX0RFQ1JZUFRfRVJST1I6XG4gICAgICBjYXNlIEouRlJBR19MT0FEX0VSUk9SOlxuICAgICAgY2FzZSBKLkZSQUdfTE9BRF9USU1FT1VUOlxuICAgICAgY2FzZSBKLktFWV9MT0FEX0VSUk9SOlxuICAgICAgY2FzZSBKLktFWV9MT0FEX1RJTUVPVVQ6XG4gICAgICAgIHRoaXMub25GcmFnbWVudE9yS2V5TG9hZEVycm9yKHBlLkFVRElPLCB0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEouQVVESU9fVFJBQ0tfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5BVURJT19UUkFDS19MT0FEX1RJTUVPVVQ6XG4gICAgICBjYXNlIEouTEVWRUxfUEFSU0lOR19FUlJPUjpcbiAgICAgICAgIXQubGV2ZWxSZXRyeSAmJiB0aGlzLnN0YXRlID09PSBuZS5XQUlUSU5HX1RSQUNLICYmICgociA9IHQuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IHIudHlwZSkgPT09IEtlLkFVRElPX1RSQUNLICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBKLkJVRkZFUl9BRERfQ09ERUNfRVJST1I6XG4gICAgICBjYXNlIEouQlVGRkVSX0FQUEVORF9FUlJPUjpcbiAgICAgICAgaWYgKHQucGFyZW50ICE9PSBcImF1ZGlvXCIpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnJlZHVjZUxlbmd0aEFuZEZsdXNoQnVmZmVyKHQpIHx8IHRoaXMucmVzZXRMb2FkaW5nU3RhdGUoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEouQlVGRkVSX0ZVTExfRVJST1I6XG4gICAgICAgIGlmICh0LnBhcmVudCAhPT0gXCJhdWRpb1wiKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5yZWR1Y2VMZW5ndGhBbmRGbHVzaEJ1ZmZlcih0KSAmJiAodGhpcy5idWZmZXJlZFRyYWNrID0gbnVsbCwgc3VwZXIuZmx1c2hNYWluQnVmZmVyKDAsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgXCJhdWRpb1wiKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBKLklOVEVSTkFMX0VYQ0VQVElPTjpcbiAgICAgICAgdGhpcy5yZWNvdmVyV29ya2VyRXJyb3IodCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBvbkJ1ZmZlckZsdXNoaW5nKGUsIHtcbiAgICB0eXBlOiB0XG4gIH0pIHtcbiAgICB0ICE9PSBvdC5WSURFTyAmJiAodGhpcy5mbHVzaGluZyA9ICEwKTtcbiAgfVxuICBvbkJ1ZmZlckZsdXNoZWQoZSwge1xuICAgIHR5cGU6IHRcbiAgfSkge1xuICAgIGlmICh0ICE9PSBvdC5WSURFTykge1xuICAgICAgdGhpcy5mbHVzaGluZyA9ICExLCB0aGlzLmJ1ZmZlckZsdXNoZWQgPSAhMCwgdGhpcy5zdGF0ZSA9PT0gbmUuRU5ERUQgJiYgKHRoaXMuc3RhdGUgPSBuZS5JRExFKTtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLm1lZGlhQnVmZmVyIHx8IHRoaXMubWVkaWE7XG4gICAgICByICYmICh0aGlzLmFmdGVyQnVmZmVyRmx1c2hlZChyLCB0LCBwZS5BVURJTyksIHRoaXMudGljaygpKTtcbiAgICB9XG4gIH1cbiAgX2hhbmRsZVRyYW5zbXV4Q29tcGxldGUoZSkge1xuICAgIHZhciB0O1xuICAgIGNvbnN0IHIgPSBcImF1ZGlvXCIsIHtcbiAgICAgIGhsczogblxuICAgIH0gPSB0aGlzLCB7XG4gICAgICByZW11eFJlc3VsdDogaSxcbiAgICAgIGNodW5rTWV0YTogb1xuICAgIH0gPSBlLCBhID0gdGhpcy5nZXRDdXJyZW50Q29udGV4dChvKTtcbiAgICBpZiAoIWEpIHtcbiAgICAgIHRoaXMucmVzZXRXaGVuTWlzc2luZ0NvbnRleHQobyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IGwsXG4gICAgICBwYXJ0OiBjLFxuICAgICAgbGV2ZWw6IHVcbiAgICB9ID0gYSwge1xuICAgICAgZGV0YWlsczogZFxuICAgIH0gPSB1LCB7XG4gICAgICBhdWRpbzogaCxcbiAgICAgIHRleHQ6IGYsXG4gICAgICBpZDM6IHAsXG4gICAgICBpbml0U2VnbWVudDogeVxuICAgIH0gPSBpO1xuICAgIGlmICh0aGlzLmZyYWdDb250ZXh0Q2hhbmdlZChsKSB8fCAhZCkge1xuICAgICAgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnQobCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID0gbmUuUEFSU0lORywgdGhpcy5zd2l0Y2hpbmdUcmFjayAmJiBoICYmIHRoaXMuY29tcGxldGVBdWRpb1N3aXRjaCh0aGlzLnN3aXRjaGluZ1RyYWNrKSwgeSAhPSBudWxsICYmIHkudHJhY2tzKSB7XG4gICAgICBjb25zdCBFID0gbC5pbml0U2VnbWVudCB8fCBsO1xuICAgICAgaWYgKHRoaXMudW5oYW5kbGVkRW5jcnlwdGlvbkVycm9yKHksIGwpKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLl9idWZmZXJJbml0U2VnbWVudCh1LCB5LnRyYWNrcywgRSwgbyksIG4udHJpZ2dlcihJLkZSQUdfUEFSU0lOR19JTklUX1NFR01FTlQsIHtcbiAgICAgICAgZnJhZzogRSxcbiAgICAgICAgaWQ6IHIsXG4gICAgICAgIHRyYWNrczogeS50cmFja3NcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoaCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdGFydFBUUzogRSxcbiAgICAgICAgZW5kUFRTOiBiLFxuICAgICAgICBzdGFydERUUzogUixcbiAgICAgICAgZW5kRFRTOiBBXG4gICAgICB9ID0gaDtcbiAgICAgIGMgJiYgKGMuZWxlbWVudGFyeVN0cmVhbXNbb3QuQVVESU9dID0ge1xuICAgICAgICBzdGFydFBUUzogRSxcbiAgICAgICAgZW5kUFRTOiBiLFxuICAgICAgICBzdGFydERUUzogUixcbiAgICAgICAgZW5kRFRTOiBBXG4gICAgICB9KSwgbC5zZXRFbGVtZW50YXJ5U3RyZWFtSW5mbyhvdC5BVURJTywgRSwgYiwgUiwgQSksIHRoaXMuYnVmZmVyRnJhZ21lbnREYXRhKGgsIGwsIGMsIG8pO1xuICAgIH1cbiAgICBpZiAocCAhPSBudWxsICYmICh0ID0gcC5zYW1wbGVzKSAhPSBudWxsICYmIHQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBFID0gbnQoe1xuICAgICAgICBpZDogcixcbiAgICAgICAgZnJhZzogbCxcbiAgICAgICAgZGV0YWlsczogZFxuICAgICAgfSwgcCk7XG4gICAgICBuLnRyaWdnZXIoSS5GUkFHX1BBUlNJTkdfTUVUQURBVEEsIEUpO1xuICAgIH1cbiAgICBpZiAoZikge1xuICAgICAgY29uc3QgRSA9IG50KHtcbiAgICAgICAgaWQ6IHIsXG4gICAgICAgIGZyYWc6IGwsXG4gICAgICAgIGRldGFpbHM6IGRcbiAgICAgIH0sIGYpO1xuICAgICAgbi50cmlnZ2VyKEkuRlJBR19QQVJTSU5HX1VTRVJEQVRBLCBFKTtcbiAgICB9XG4gIH1cbiAgX2J1ZmZlckluaXRTZWdtZW50KGUsIHQsIHIsIG4pIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gbmUuUEFSU0lORyB8fCAodC52aWRlbyAmJiBkZWxldGUgdC52aWRlbywgdC5hdWRpb3ZpZGVvICYmIGRlbGV0ZSB0LmF1ZGlvdmlkZW8sICF0LmF1ZGlvKSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gdC5hdWRpbztcbiAgICBpLmlkID0gcGUuQVVESU87XG4gICAgY29uc3QgbyA9IGUuYXVkaW9Db2RlYztcbiAgICB0aGlzLmxvZyhgSW5pdCBhdWRpbyBidWZmZXIsIGNvbnRhaW5lcjoke2kuY29udGFpbmVyfSwgY29kZWNzW2xldmVsL3BhcnNlZF09WyR7b30vJHtpLmNvZGVjfV1gKSwgbyAmJiBvLnNwbGl0KFwiLFwiKS5sZW5ndGggPT09IDEgJiYgKGkubGV2ZWxDb2RlYyA9IG8pLCB0aGlzLmhscy50cmlnZ2VyKEkuQlVGRkVSX0NPREVDUywgdCk7XG4gICAgY29uc3QgYSA9IGkuaW5pdFNlZ21lbnQ7XG4gICAgaWYgKGEgIT0gbnVsbCAmJiBhLmJ5dGVMZW5ndGgpIHtcbiAgICAgIGNvbnN0IGwgPSB7XG4gICAgICAgIHR5cGU6IFwiYXVkaW9cIixcbiAgICAgICAgZnJhZzogcixcbiAgICAgICAgcGFydDogbnVsbCxcbiAgICAgICAgY2h1bmtNZXRhOiBuLFxuICAgICAgICBwYXJlbnQ6IHIudHlwZSxcbiAgICAgICAgZGF0YTogYVxuICAgICAgfTtcbiAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfQVBQRU5ESU5HLCBsKTtcbiAgICB9XG4gICAgdGhpcy50aWNrSW1tZWRpYXRlKCk7XG4gIH1cbiAgbG9hZEZyYWdtZW50KGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoZSk7XG4gICAgaWYgKHRoaXMuc3dpdGNoaW5nVHJhY2sgfHwgbiA9PT0gSHQuTk9UX0xPQURFRCB8fCBuID09PSBIdC5QQVJUSUFMKSB7XG4gICAgICB2YXIgaTtcbiAgICAgIGlmICghVnQoZSkpXG4gICAgICAgIHRoaXMuX2xvYWRJbml0U2VnbWVudChlLCB0KTtcbiAgICAgIGVsc2UgaWYgKChpID0gdC5kZXRhaWxzKSAhPSBudWxsICYmIGkubGl2ZSAmJiAhdGhpcy5pbml0UFRTW2UuY2NdKSB7XG4gICAgICAgIHRoaXMubG9nKGBXYWl0aW5nIGZvciB2aWRlbyBQVFMgaW4gY29udGludWl0eSBjb3VudGVyICR7ZS5jY30gb2YgbGl2ZSBzdHJlYW0gYmVmb3JlIGxvYWRpbmcgYXVkaW8gZnJhZ21lbnQgJHtlLnNufSBvZiBsZXZlbCAke3RoaXMudHJhY2tJZH1gKSwgdGhpcy5zdGF0ZSA9IG5lLldBSVRJTkdfSU5JVF9QVFM7XG4gICAgICAgIGNvbnN0IG8gPSB0aGlzLm1haW5EZXRhaWxzO1xuICAgICAgICBvICYmIG8uZnJhZ21lbnRTdGFydCAhPT0gdC5kZXRhaWxzLmZyYWdtZW50U3RhcnQgJiYgc2EodC5kZXRhaWxzLCBvKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICBzdXBlci5sb2FkRnJhZ21lbnQoZSwgdCwgcik7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLmNsZWFyVHJhY2tlcklmTmVlZGVkKGUpO1xuICB9XG4gIGZsdXNoQXVkaW9JZk5lZWRlZChlKSB7XG4gICAgaWYgKHRoaXMubWVkaWEgJiYgdGhpcy5idWZmZXJlZFRyYWNrKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWU6IHQsXG4gICAgICAgIGxhbmc6IHIsXG4gICAgICAgIGFzc29jTGFuZzogbixcbiAgICAgICAgY2hhcmFjdGVyaXN0aWNzOiBpLFxuICAgICAgICBhdWRpb0NvZGVjOiBvLFxuICAgICAgICBjaGFubmVsczogYVxuICAgICAgfSA9IHRoaXMuYnVmZmVyZWRUcmFjaztcbiAgICAgIHFzKHtcbiAgICAgICAgbmFtZTogdCxcbiAgICAgICAgbGFuZzogcixcbiAgICAgICAgYXNzb2NMYW5nOiBuLFxuICAgICAgICBjaGFyYWN0ZXJpc3RpY3M6IGksXG4gICAgICAgIGF1ZGlvQ29kZWM6IG8sXG4gICAgICAgIGNoYW5uZWxzOiBhXG4gICAgICB9LCBlLCBVcykgfHwgKFFvKGUudXJsLCB0aGlzLmhscykgPyAodGhpcy5sb2coXCJTd2l0Y2hpbmcgYXVkaW8gdHJhY2sgOiBmbHVzaGluZyBhbGwgYXVkaW9cIiksIHN1cGVyLmZsdXNoTWFpbkJ1ZmZlcigwLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIFwiYXVkaW9cIiksIHRoaXMuYnVmZmVyZWRUcmFjayA9IG51bGwpIDogdGhpcy5idWZmZXJlZFRyYWNrID0gZSk7XG4gICAgfVxuICB9XG4gIGNvbXBsZXRlQXVkaW9Td2l0Y2goZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogdFxuICAgIH0gPSB0aGlzO1xuICAgIHRoaXMuZmx1c2hBdWRpb0lmTmVlZGVkKGUpLCB0aGlzLmJ1ZmZlcmVkVHJhY2sgPSBlLCB0aGlzLnN3aXRjaGluZ1RyYWNrID0gbnVsbCwgdC50cmlnZ2VyKEkuQVVESU9fVFJBQ0tfU1dJVENIRUQsIHR0KHt9LCBlKSk7XG4gIH1cbn1cbmNsYXNzIGt1IGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIodCwgZS5sb2dnZXIpLCB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5jYW5Mb2FkID0gITEsIHRoaXMudGltZXIgPSAtMSwgdGhpcy5obHMgPSBlO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5jbGVhclRpbWVyKCksIHRoaXMuaGxzID0gdGhpcy5sb2cgPSB0aGlzLndhcm4gPSBudWxsO1xuICB9XG4gIGNsZWFyVGltZXIoKSB7XG4gICAgdGhpcy50aW1lciAhPT0gLTEgJiYgKHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpLCB0aGlzLnRpbWVyID0gLTEpO1xuICB9XG4gIHN0YXJ0TG9hZCgpIHtcbiAgICB0aGlzLmNhbkxvYWQgPSAhMCwgdGhpcy5sb2FkUGxheWxpc3QoKTtcbiAgfVxuICBzdG9wTG9hZCgpIHtcbiAgICB0aGlzLmNhbkxvYWQgPSAhMSwgdGhpcy5jbGVhclRpbWVyKCk7XG4gIH1cbiAgc3dpdGNoUGFyYW1zKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdCA9PSBudWxsID8gdm9pZCAwIDogdC5yZW5kaXRpb25SZXBvcnRzO1xuICAgIGlmIChuKSB7XG4gICAgICBsZXQgaSA9IC0xO1xuICAgICAgZm9yIChsZXQgbyA9IDA7IG8gPCBuLmxlbmd0aDsgbysrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBuW29dO1xuICAgICAgICBsZXQgbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsID0gbmV3IHNlbGYuVVJMKGEuVVJJLCB0LnVybCkuaHJlZjtcbiAgICAgICAgfSBjYXRjaCAoYykge1xuICAgICAgICAgIHRoaXMud2FybihgQ291bGQgbm90IGNvbnN0cnVjdCBuZXcgVVJMIGZvciBSZW5kaXRpb24gUmVwb3J0OiAke2N9YCksIGwgPSBhLlVSSSB8fCBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsID09PSBlKSB7XG4gICAgICAgICAgaSA9IG87XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBsID09PSBlLnN1YnN0cmluZygwLCBsLmxlbmd0aCkgJiYgKGkgPSBvKTtcbiAgICAgIH1cbiAgICAgIGlmIChpICE9PSAtMSkge1xuICAgICAgICBjb25zdCBvID0gbltpXSwgYSA9IHBhcnNlSW50KG9bXCJMQVNULU1TTlwiXSkgfHwgdC5sYXN0UGFydFNuO1xuICAgICAgICBsZXQgbCA9IHBhcnNlSW50KG9bXCJMQVNULVBBUlRcIl0pIHx8IHQubGFzdFBhcnRJbmRleDtcbiAgICAgICAgaWYgKHRoaXMuaGxzLmNvbmZpZy5sb3dMYXRlbmN5TW9kZSkge1xuICAgICAgICAgIGNvbnN0IHUgPSBNYXRoLm1pbih0LmFnZSAtIHQucGFydFRhcmdldCwgdC50YXJnZXRkdXJhdGlvbik7XG4gICAgICAgICAgbCA+PSAwICYmIHUgPiB0LnBhcnRUYXJnZXQgJiYgKGwgKz0gMSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYyA9IHIgJiYgb2gocik7XG4gICAgICAgIHJldHVybiBuZXcgYWgoYSwgbCA+PSAwID8gbCA6IHZvaWQgMCwgYyk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxvYWRQbGF5bGlzdChlKSB7XG4gICAgdGhpcy5jbGVhclRpbWVyKCk7XG4gIH1cbiAgbG9hZGluZ1BsYXlsaXN0KGUsIHQpIHtcbiAgICB0aGlzLmNsZWFyVGltZXIoKTtcbiAgfVxuICBzaG91bGRMb2FkUGxheWxpc3QoZSkge1xuICAgIHJldHVybiB0aGlzLmNhbkxvYWQgJiYgISFlICYmICEhZS51cmwgJiYgKCFlLmRldGFpbHMgfHwgZS5kZXRhaWxzLmxpdmUpO1xuICB9XG4gIGdldFVybFdpdGhEaXJlY3RpdmVzKGUsIHQpIHtcbiAgICBpZiAodClcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0LmFkZERpcmVjdGl2ZXMoZSk7XG4gICAgICB9IGNhdGNoIChyKSB7XG4gICAgICAgIHRoaXMud2FybihgQ291bGQgbm90IGNvbnN0cnVjdCBuZXcgVVJMIHdpdGggSExTIERlbGl2ZXJ5IERpcmVjdGl2ZXM6ICR7cn1gKTtcbiAgICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICBwbGF5bGlzdExvYWRlZChlLCB0LCByKSB7XG4gICAgY29uc3Qge1xuICAgICAgZGV0YWlsczogbixcbiAgICAgIHN0YXRzOiBpXG4gICAgfSA9IHQsIG8gPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpLCBhID0gaS5sb2FkaW5nLmZpcnN0ID8gTWF0aC5tYXgoMCwgbyAtIGkubG9hZGluZy5maXJzdCkgOiAwO1xuICAgIG4uYWR2YW5jZWREYXRlVGltZSA9IERhdGUubm93KCkgLSBhO1xuICAgIGNvbnN0IGwgPSB0aGlzLmhscy5jb25maWcudGltZWxpbmVPZmZzZXQ7XG4gICAgaWYgKGwgIT09IG4uYXBwbGllZFRpbWVsaW5lT2Zmc2V0KSB7XG4gICAgICBjb25zdCB1ID0gTWF0aC5tYXgobCB8fCAwLCAwKTtcbiAgICAgIG4uYXBwbGllZFRpbWVsaW5lT2Zmc2V0ID0gdSwgbi5mcmFnbWVudHMuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICBkLnNldFN0YXJ0KGQucGxheWxpc3RPZmZzZXQgKyB1KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAobi5saXZlIHx8IHIgIT0gbnVsbCAmJiByLmxpdmUpIHtcbiAgICAgIGNvbnN0IHUgPSBcImxldmVsSW5mb1wiIGluIHQgPyB0LmxldmVsSW5mbyA6IHQudHJhY2s7XG4gICAgICBpZiAobi5yZWxvYWRlZChyKSwgciAmJiBuLmZyYWdtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIFpiKHIsIG4sIHRoaXMpO1xuICAgICAgICBjb25zdCBSID0gbi5wbGF5bGlzdFBhcnNpbmdFcnJvcjtcbiAgICAgICAgaWYgKFIpIHtcbiAgICAgICAgICB0aGlzLndhcm4oUik7XG4gICAgICAgICAgY29uc3QgQSA9IHRoaXMuaGxzO1xuICAgICAgICAgIGlmICghQS5jb25maWcuaWdub3JlUGxheWxpc3RQYXJzaW5nRXJyb3JzKSB7XG4gICAgICAgICAgICB2YXIgYztcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IEZcbiAgICAgICAgICAgIH0gPSB0O1xuICAgICAgICAgICAgQS50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgICAgICAgICAgZGV0YWlsczogSi5MRVZFTF9QQVJTSU5HX0VSUk9SLFxuICAgICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICAgIHVybDogbi51cmwsXG4gICAgICAgICAgICAgIGVycm9yOiBSLFxuICAgICAgICAgICAgICByZWFzb246IFIubWVzc2FnZSxcbiAgICAgICAgICAgICAgbGV2ZWw6IHQubGV2ZWwgfHwgdm9pZCAwLFxuICAgICAgICAgICAgICBwYXJlbnQ6IChjID0gbi5mcmFnbWVudHNbMF0pID09IG51bGwgPyB2b2lkIDAgOiBjLnR5cGUsXG4gICAgICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiBGLFxuICAgICAgICAgICAgICBzdGF0czogaVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIG4ucGxheWxpc3RQYXJzaW5nRXJyb3IgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuLnJlcXVlc3RTY2hlZHVsZWQgPT09IC0xICYmIChuLnJlcXVlc3RTY2hlZHVsZWQgPSBpLmxvYWRpbmcuc3RhcnQpO1xuICAgICAgY29uc3QgZCA9IHRoaXMuaGxzLm1haW5Gb3J3YXJkQnVmZmVySW5mbywgaCA9IGQgPyBkLmVuZCAtIGQubGVuIDogMCwgZiA9IChuLmVkZ2UgLSBoKSAqIDFlMywgcCA9IFFnKG4sIGYpO1xuICAgICAgaWYgKG4ucmVxdWVzdFNjaGVkdWxlZCArIHAgPCBvID8gbi5yZXF1ZXN0U2NoZWR1bGVkID0gbyA6IG4ucmVxdWVzdFNjaGVkdWxlZCArPSBwLCB0aGlzLmxvZyhgbGl2ZSBwbGF5bGlzdCAke2V9ICR7bi5hZHZhbmNlZCA/IFwiUkVGUkVTSEVEIFwiICsgbi5sYXN0UGFydFNuICsgXCItXCIgKyBuLmxhc3RQYXJ0SW5kZXggOiBuLnVwZGF0ZWQgPyBcIlVQREFURURcIiA6IFwiTUlTU0VEXCJ9YCksICF0aGlzLmNhbkxvYWQgfHwgIW4ubGl2ZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbGV0IHksIEUsIGI7XG4gICAgICBpZiAobi5jYW5CbG9ja1JlbG9hZCAmJiBuLmVuZFNOICYmIG4uYWR2YW5jZWQpIHtcbiAgICAgICAgY29uc3QgUiA9IHRoaXMuaGxzLmNvbmZpZy5sb3dMYXRlbmN5TW9kZSwgQSA9IG4ubGFzdFBhcnRTbiwgRiA9IG4uZW5kU04sIE0gPSBuLmxhc3RQYXJ0SW5kZXgsIEggPSBNICE9PSAtMSwgSyA9IEEgPT09IEY7XG4gICAgICAgIEggPyBLID8gKEUgPSBGICsgMSwgYiA9IFIgPyAwIDogTSkgOiAoRSA9IEEsIGIgPSBSID8gTSArIDEgOiBuLm1heFBhcnRJbmRleCkgOiBFID0gRiArIDE7XG4gICAgICAgIGNvbnN0IGogPSBuLmFnZSwgQyA9IGogKyBuLmFnZUhlYWRlcjtcbiAgICAgICAgbGV0IGsgPSBNYXRoLm1pbihDIC0gbi5wYXJ0VGFyZ2V0LCBuLnRhcmdldGR1cmF0aW9uICogMS41KTtcbiAgICAgICAgaWYgKGsgPiAwKSB7XG4gICAgICAgICAgaWYgKEMgPiBuLnRhcmdldGR1cmF0aW9uICogMylcbiAgICAgICAgICAgIHRoaXMubG9nKGBQbGF5bGlzdCBsYXN0IGFkdmFuY2VkICR7ai50b0ZpeGVkKDIpfXMgYWdvLiBPbWl0dGluZyBzZWdtZW50IGFuZCBwYXJ0IGRpcmVjdGl2ZXMuYCksIEUgPSB2b2lkIDAsIGIgPSB2b2lkIDA7XG4gICAgICAgICAgZWxzZSBpZiAociAhPSBudWxsICYmIHIudHVuZUluR29hbCAmJiBDIC0gbi5wYXJ0VGFyZ2V0ID4gci50dW5lSW5Hb2FsKVxuICAgICAgICAgICAgdGhpcy53YXJuKGBDRE4gVHVuZS1pbiBnb2FsIGluY3JlYXNlZCBmcm9tOiAke3IudHVuZUluR29hbH0gdG86ICR7a30gd2l0aCBwbGF5bGlzdCBhZ2U6ICR7bi5hZ2V9YCksIGsgPSAwO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgJCA9IE1hdGguZmxvb3IoayAvIG4udGFyZ2V0ZHVyYXRpb24pO1xuICAgICAgICAgICAgaWYgKEUgKz0gJCwgYiAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IFcgPSBNYXRoLnJvdW5kKGsgJSBuLnRhcmdldGR1cmF0aW9uIC8gbi5wYXJ0VGFyZ2V0KTtcbiAgICAgICAgICAgICAgYiArPSBXO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5sb2coYENETiBUdW5lLWluIGFnZTogJHtuLmFnZUhlYWRlcn1zIGxhc3QgYWR2YW5jZWQgJHtqLnRvRml4ZWQoMil9cyBnb2FsOiAke2t9IHNraXAgc24gJHskfSB0byBwYXJ0ICR7Yn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbi50dW5lSW5Hb2FsID0gaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoeSA9IHRoaXMuZ2V0RGVsaXZlcnlEaXJlY3RpdmVzKG4sIHQuZGVsaXZlcnlEaXJlY3RpdmVzLCBFLCBiKSwgUiB8fCAhSykge1xuICAgICAgICAgIG4ucmVxdWVzdFNjaGVkdWxlZCA9IG8sIHRoaXMubG9hZGluZ1BsYXlsaXN0KHUsIHkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIChuLmNhbkJsb2NrUmVsb2FkIHx8IG4uY2FuU2tpcFVudGlsKSAmJiAoeSA9IHRoaXMuZ2V0RGVsaXZlcnlEaXJlY3RpdmVzKG4sIHQuZGVsaXZlcnlEaXJlY3RpdmVzLCBFLCBiKSk7XG4gICAgICB5ICYmIEUgIT09IHZvaWQgMCAmJiBuLmNhbkJsb2NrUmVsb2FkICYmIChuLnJlcXVlc3RTY2hlZHVsZWQgPSBpLmxvYWRpbmcuZmlyc3QgKyBNYXRoLm1heChwIC0gYSAqIDIsIHAgLyAyKSksIHRoaXMuc2NoZWR1bGVMb2FkaW5nKHUsIHksIG4pO1xuICAgIH0gZWxzZVxuICAgICAgdGhpcy5jbGVhclRpbWVyKCk7XG4gIH1cbiAgc2NoZWR1bGVMb2FkaW5nKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gciB8fCBlLmRldGFpbHM7XG4gICAgaWYgKCFuKSB7XG4gICAgICB0aGlzLmxvYWRpbmdQbGF5bGlzdChlLCB0KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaSA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCksIG8gPSBuLnJlcXVlc3RTY2hlZHVsZWQ7XG4gICAgaWYgKGkgPj0gbykge1xuICAgICAgdGhpcy5sb2FkaW5nUGxheWxpc3QoZSwgdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGEgPSBvIC0gaTtcbiAgICB0aGlzLmxvZyhgcmVsb2FkIGxpdmUgcGxheWxpc3QgJHtlLm5hbWUgfHwgZS5iaXRyYXRlICsgXCJicHNcIn0gaW4gJHtNYXRoLnJvdW5kKGEpfSBtc2ApLCB0aGlzLmNsZWFyVGltZXIoKSwgdGhpcy50aW1lciA9IHNlbGYuc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWRpbmdQbGF5bGlzdChlLCB0KSwgYSk7XG4gIH1cbiAgZ2V0RGVsaXZlcnlEaXJlY3RpdmVzKGUsIHQsIHIsIG4pIHtcbiAgICBsZXQgaSA9IG9oKGUpO1xuICAgIHJldHVybiB0ICE9IG51bGwgJiYgdC5za2lwICYmIGUuZGVsdGFVcGRhdGVGYWlsZWQgJiYgKHIgPSB0Lm1zbiwgbiA9IHQucGFydCwgaSA9IGdvLk5vKSwgbmV3IGFoKHIsIG4sIGkpO1xuICB9XG4gIGNoZWNrUmV0cnkoZSkge1xuICAgIGNvbnN0IHQgPSBlLmRldGFpbHMsIHIgPSBlYShlKSwgbiA9IGUuZXJyb3JBY3Rpb24sIHtcbiAgICAgIGFjdGlvbjogaSxcbiAgICAgIHJldHJ5Q291bnQ6IG8gPSAwLFxuICAgICAgcmV0cnlDb25maWc6IGFcbiAgICB9ID0gbiB8fCB7fSwgbCA9ICEhbiAmJiAhIWEgJiYgKGkgPT09IFp0LlJldHJ5UmVxdWVzdCB8fCAhbi5yZXNvbHZlZCAmJiBpID09PSBadC5TZW5kQWx0ZXJuYXRlVG9QZW5hbHR5Qm94KTtcbiAgICBpZiAobCkge1xuICAgICAgdmFyIGM7XG4gICAgICBpZiAobyA+PSBhLm1heE51bVJldHJ5KVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICBpZiAociAmJiAoYyA9IGUuY29udGV4dCkgIT0gbnVsbCAmJiBjLmRlbGl2ZXJ5RGlyZWN0aXZlcylcbiAgICAgICAgdGhpcy53YXJuKGBSZXRyeWluZyBwbGF5bGlzdCBsb2FkaW5nICR7byArIDF9LyR7YS5tYXhOdW1SZXRyeX0gYWZ0ZXIgXCIke3R9XCIgd2l0aG91dCBkZWxpdmVyeS1kaXJlY3RpdmVzYCksIHRoaXMubG9hZFBsYXlsaXN0KCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgdSA9IHl1KGEsIG8pO1xuICAgICAgICB0aGlzLmNsZWFyVGltZXIoKSwgdGhpcy50aW1lciA9IHNlbGYuc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWRQbGF5bGlzdCgpLCB1KSwgdGhpcy53YXJuKGBSZXRyeWluZyBwbGF5bGlzdCBsb2FkaW5nICR7byArIDF9LyR7YS5tYXhOdW1SZXRyeX0gYWZ0ZXIgXCIke3R9XCIgaW4gJHt1fW1zYCk7XG4gICAgICB9XG4gICAgICBlLmxldmVsUmV0cnkgPSAhMCwgbi5yZXNvbHZlZCA9ICEwO1xuICAgIH1cbiAgICByZXR1cm4gbDtcbiAgfVxufVxuZnVuY3Rpb24gQXAocywgZSkge1xuICBpZiAocy5sZW5ndGggIT09IGUubGVuZ3RoKVxuICAgIHJldHVybiAhMTtcbiAgZm9yIChsZXQgdCA9IDA7IHQgPCBzLmxlbmd0aDsgdCsrKVxuICAgIGlmICghU2koc1t0XS5hdHRycywgZVt0XS5hdHRycykpXG4gICAgICByZXR1cm4gITE7XG4gIHJldHVybiAhMDtcbn1cbmZ1bmN0aW9uIFNpKHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IHNbXCJTVEFCTEUtUkVORElUSU9OLUlEXCJdO1xuICByZXR1cm4gciAmJiAhdCA/IHIgPT09IGVbXCJTVEFCTEUtUkVORElUSU9OLUlEXCJdIDogISh0IHx8IFtcIkxBTkdVQUdFXCIsIFwiTkFNRVwiLCBcIkNIQVJBQ1RFUklTVElDU1wiLCBcIkFVVE9TRUxFQ1RcIiwgXCJERUZBVUxUXCIsIFwiRk9SQ0VEXCIsIFwiQVNTT0MtTEFOR1VBR0VcIl0pLnNvbWUoKG4pID0+IHNbbl0gIT09IGVbbl0pO1xufVxuZnVuY3Rpb24geWMocywgZSkge1xuICByZXR1cm4gZS5sYWJlbC50b0xvd2VyQ2FzZSgpID09PSBzLm5hbWUudG9Mb3dlckNhc2UoKSAmJiAoIWUubGFuZ3VhZ2UgfHwgZS5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpID09PSAocy5sYW5nIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCkpO1xufVxuY2xhc3MgaTIgZXh0ZW5kcyBrdSB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICBzdXBlcihlLCBcImF1ZGlvLXRyYWNrLWNvbnRyb2xsZXJcIiksIHRoaXMudHJhY2tzID0gW10sIHRoaXMuZ3JvdXBJZHMgPSBudWxsLCB0aGlzLnRyYWNrc0luR3JvdXAgPSBbXSwgdGhpcy50cmFja0lkID0gLTEsIHRoaXMuY3VycmVudFRyYWNrID0gbnVsbCwgdGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgPSAhMCwgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5vbk1hbmlmZXN0UGFyc2VkLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTEVWRUxfU1dJVENISU5HLCB0aGlzLm9uTGV2ZWxTd2l0Y2hpbmcsIHRoaXMpLCBlLm9uKEkuQVVESU9fVFJBQ0tfTE9BREVELCB0aGlzLm9uQXVkaW9UcmFja0xvYWRlZCwgdGhpcyksIGUub24oSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9mZihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1NXSVRDSElORywgdGhpcy5vbkxldmVsU3dpdGNoaW5nLCB0aGlzKSwgZS5vZmYoSS5BVURJT19UUkFDS19MT0FERUQsIHRoaXMub25BdWRpb1RyYWNrTG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudW5yZWdpc3Rlckxpc3RlbmVycygpLCB0aGlzLnRyYWNrcy5sZW5ndGggPSAwLCB0aGlzLnRyYWNrc0luR3JvdXAubGVuZ3RoID0gMCwgdGhpcy5jdXJyZW50VHJhY2sgPSBudWxsLCBzdXBlci5kZXN0cm95KCk7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy50cmFja3MgPSBbXSwgdGhpcy50cmFja3NJbkdyb3VwID0gW10sIHRoaXMuZ3JvdXBJZHMgPSBudWxsLCB0aGlzLmN1cnJlbnRUcmFjayA9IG51bGwsIHRoaXMudHJhY2tJZCA9IC0xLCB0aGlzLnNlbGVjdERlZmF1bHRUcmFjayA9ICEwO1xuICB9XG4gIG9uTWFuaWZlc3RQYXJzZWQoZSwgdCkge1xuICAgIHRoaXMudHJhY2tzID0gdC5hdWRpb1RyYWNrcyB8fCBbXTtcbiAgfVxuICBvbkF1ZGlvVHJhY2tMb2FkZWQoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlkOiByLFxuICAgICAgZ3JvdXBJZDogbixcbiAgICAgIGRldGFpbHM6IGlcbiAgICB9ID0gdCwgbyA9IHRoaXMudHJhY2tzSW5Hcm91cFtyXTtcbiAgICBpZiAoIW8gfHwgby5ncm91cElkICE9PSBuKSB7XG4gICAgICB0aGlzLndhcm4oYEF1ZGlvIHRyYWNrIHdpdGggaWQ6JHtyfSBhbmQgZ3JvdXA6JHtufSBub3QgZm91bmQgaW4gYWN0aXZlIGdyb3VwICR7byA9PSBudWxsID8gdm9pZCAwIDogby5ncm91cElkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhID0gby5kZXRhaWxzO1xuICAgIG8uZGV0YWlscyA9IHQuZGV0YWlscywgdGhpcy5sb2coYEF1ZGlvIHRyYWNrICR7cn0gXCIke28ubmFtZX1cIiBsYW5nOiR7by5sYW5nfSBncm91cDoke259IGxvYWRlZCBbJHtpLnN0YXJ0U059LSR7aS5lbmRTTn1dYCksIHIgPT09IHRoaXMudHJhY2tJZCAmJiB0aGlzLnBsYXlsaXN0TG9hZGVkKHIsIHQsIGEpO1xuICB9XG4gIG9uTGV2ZWxMb2FkaW5nKGUsIHQpIHtcbiAgICB0aGlzLnN3aXRjaExldmVsKHQubGV2ZWwpO1xuICB9XG4gIG9uTGV2ZWxTd2l0Y2hpbmcoZSwgdCkge1xuICAgIHRoaXMuc3dpdGNoTGV2ZWwodC5sZXZlbCk7XG4gIH1cbiAgc3dpdGNoTGV2ZWwoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmhscy5sZXZlbHNbZV07XG4gICAgaWYgKCF0KVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSB0LmF1ZGlvR3JvdXBzIHx8IG51bGwsIG4gPSB0aGlzLmdyb3VwSWRzO1xuICAgIGxldCBpID0gdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgaWYgKCFyIHx8IChuID09IG51bGwgPyB2b2lkIDAgOiBuLmxlbmd0aCkgIT09IChyID09IG51bGwgPyB2b2lkIDAgOiByLmxlbmd0aCkgfHwgciAhPSBudWxsICYmIHIuc29tZSgoYSkgPT4gKG4gPT0gbnVsbCA/IHZvaWQgMCA6IG4uaW5kZXhPZihhKSkgPT09IC0xKSkge1xuICAgICAgdGhpcy5ncm91cElkcyA9IHIsIHRoaXMudHJhY2tJZCA9IC0xLCB0aGlzLmN1cnJlbnRUcmFjayA9IG51bGw7XG4gICAgICBjb25zdCBhID0gdGhpcy50cmFja3MuZmlsdGVyKChoKSA9PiAhciB8fCByLmluZGV4T2YoaC5ncm91cElkKSAhPT0gLTEpO1xuICAgICAgaWYgKGEubGVuZ3RoKVxuICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRUcmFjayAmJiAhYS5zb21lKChoKSA9PiBoLmRlZmF1bHQpICYmICh0aGlzLnNlbGVjdERlZmF1bHRUcmFjayA9ICExKSwgYS5mb3JFYWNoKChoLCBmKSA9PiB7XG4gICAgICAgICAgaC5pZCA9IGY7XG4gICAgICAgIH0pO1xuICAgICAgZWxzZSBpZiAoIWkgJiYgIXRoaXMudHJhY2tzSW5Hcm91cC5sZW5ndGgpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRoaXMudHJhY2tzSW5Hcm91cCA9IGE7XG4gICAgICBjb25zdCBsID0gdGhpcy5obHMuY29uZmlnLmF1ZGlvUHJlZmVyZW5jZTtcbiAgICAgIGlmICghaSAmJiBsKSB7XG4gICAgICAgIGNvbnN0IGggPSBXcihsLCBhLCBVcyk7XG4gICAgICAgIGlmIChoID4gLTEpXG4gICAgICAgICAgaSA9IGFbaF07XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGYgPSBXcihsLCB0aGlzLnRyYWNrcyk7XG4gICAgICAgICAgaSA9IHRoaXMudHJhY2tzW2ZdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgYyA9IHRoaXMuZmluZFRyYWNrSWQoaSk7XG4gICAgICBjID09PSAtMSAmJiBpICYmIChjID0gdGhpcy5maW5kVHJhY2tJZChudWxsKSk7XG4gICAgICBjb25zdCB1ID0ge1xuICAgICAgICBhdWRpb1RyYWNrczogYVxuICAgICAgfTtcbiAgICAgIHRoaXMubG9nKGBVcGRhdGluZyBhdWRpbyB0cmFja3MsICR7YS5sZW5ndGh9IHRyYWNrKHMpIGZvdW5kIGluIGdyb3VwKHMpOiAke3IgPT0gbnVsbCA/IHZvaWQgMCA6IHIuam9pbihcIixcIil9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5BVURJT19UUkFDS1NfVVBEQVRFRCwgdSk7XG4gICAgICBjb25zdCBkID0gdGhpcy50cmFja0lkO1xuICAgICAgaWYgKGMgIT09IC0xICYmIGQgPT09IC0xKVxuICAgICAgICB0aGlzLnNldEF1ZGlvVHJhY2soYyk7XG4gICAgICBlbHNlIGlmIChhLmxlbmd0aCAmJiBkID09PSAtMSkge1xuICAgICAgICB2YXIgbztcbiAgICAgICAgY29uc3QgaCA9IG5ldyBFcnJvcihgTm8gYXVkaW8gdHJhY2sgc2VsZWN0ZWQgZm9yIGN1cnJlbnQgYXVkaW8gZ3JvdXAtSUQocyk6ICR7KG8gPSB0aGlzLmdyb3VwSWRzKSA9PSBudWxsID8gdm9pZCAwIDogby5qb2luKFwiLFwiKX0gdHJhY2sgY291bnQ6ICR7YS5sZW5ndGh9YCk7XG4gICAgICAgIHRoaXMud2FybihoLm1lc3NhZ2UpLCB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgICBkZXRhaWxzOiBKLkFVRElPX1RSQUNLX0xPQURfRVJST1IsXG4gICAgICAgICAgZmF0YWw6ICEwLFxuICAgICAgICAgIGVycm9yOiBoXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBvbkVycm9yKGUsIHQpIHtcbiAgICB0LmZhdGFsIHx8ICF0LmNvbnRleHQgfHwgdC5jb250ZXh0LnR5cGUgPT09IEtlLkFVRElPX1RSQUNLICYmIHQuY29udGV4dC5pZCA9PT0gdGhpcy50cmFja0lkICYmICghdGhpcy5ncm91cElkcyB8fCB0aGlzLmdyb3VwSWRzLmluZGV4T2YodC5jb250ZXh0Lmdyb3VwSWQpICE9PSAtMSkgJiYgdGhpcy5jaGVja1JldHJ5KHQpO1xuICB9XG4gIGdldCBhbGxBdWRpb1RyYWNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3M7XG4gIH1cbiAgZ2V0IGF1ZGlvVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrc0luR3JvdXA7XG4gIH1cbiAgZ2V0IGF1ZGlvVHJhY2soKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhY2tJZDtcbiAgfVxuICBzZXQgYXVkaW9UcmFjayhlKSB7XG4gICAgdGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgPSAhMSwgdGhpcy5zZXRBdWRpb1RyYWNrKGUpO1xuICB9XG4gIHNldEF1ZGlvT3B0aW9uKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5obHM7XG4gICAgaWYgKHQuY29uZmlnLmF1ZGlvUHJlZmVyZW5jZSA9IGUsIGUpIHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLmFsbEF1ZGlvVHJhY2tzO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrID0gITEsIHIubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmN1cnJlbnRUcmFjaztcbiAgICAgICAgaWYgKG4gJiYgcXMoZSwgbiwgVXMpKVxuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICBjb25zdCBpID0gV3IoZSwgdGhpcy50cmFja3NJbkdyb3VwLCBVcyk7XG4gICAgICAgIGlmIChpID4gLTEpIHtcbiAgICAgICAgICBjb25zdCBvID0gdGhpcy50cmFja3NJbkdyb3VwW2ldO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNldEF1ZGlvVHJhY2soaSksIG87XG4gICAgICAgIH0gZWxzZSBpZiAobikge1xuICAgICAgICAgIGxldCBvID0gdC5sb2FkTGV2ZWw7XG4gICAgICAgICAgbyA9PT0gLTEgJiYgKG8gPSB0LmZpcnN0QXV0b0xldmVsKTtcbiAgICAgICAgICBjb25zdCBhID0gbWIoZSwgdC5sZXZlbHMsIHIsIG8sIFVzKTtcbiAgICAgICAgICBpZiAoYSA9PT0gLTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB0Lm5leHRMb2FkTGV2ZWwgPSBhO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlLmNoYW5uZWxzIHx8IGUuYXVkaW9Db2RlYykge1xuICAgICAgICAgIGNvbnN0IG8gPSBXcihlLCByKTtcbiAgICAgICAgICBpZiAobyA+IC0xKVxuICAgICAgICAgICAgcmV0dXJuIHJbb107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgc2V0QXVkaW9UcmFjayhlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMudHJhY2tzSW5Hcm91cDtcbiAgICBpZiAoZSA8IDAgfHwgZSA+PSB0Lmxlbmd0aCkge1xuICAgICAgdGhpcy53YXJuKGBJbnZhbGlkIGF1ZGlvIHRyYWNrIGlkOiAke2V9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrID0gITE7XG4gICAgY29uc3QgciA9IHRoaXMuY3VycmVudFRyYWNrLCBuID0gdFtlXSwgaSA9IG4uZGV0YWlscyAmJiAhbi5kZXRhaWxzLmxpdmU7XG4gICAgaWYgKGUgPT09IHRoaXMudHJhY2tJZCAmJiBuID09PSByICYmIGkgfHwgKHRoaXMubG9nKGBTd2l0Y2hpbmcgdG8gYXVkaW8tdHJhY2sgJHtlfSBcIiR7bi5uYW1lfVwiIGxhbmc6JHtuLmxhbmd9IGdyb3VwOiR7bi5ncm91cElkfSBjaGFubmVsczoke24uY2hhbm5lbHN9YCksIHRoaXMudHJhY2tJZCA9IGUsIHRoaXMuY3VycmVudFRyYWNrID0gbiwgdGhpcy5obHMudHJpZ2dlcihJLkFVRElPX1RSQUNLX1NXSVRDSElORywgdHQoe30sIG4pKSwgaSkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbyA9IHRoaXMuc3dpdGNoUGFyYW1zKG4udXJsLCByID09IG51bGwgPyB2b2lkIDAgOiByLmRldGFpbHMsIG4uZGV0YWlscyk7XG4gICAgdGhpcy5sb2FkUGxheWxpc3Qobyk7XG4gIH1cbiAgZmluZFRyYWNrSWQoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLnRyYWNrc0luR3JvdXA7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICBjb25zdCBuID0gdFtyXTtcbiAgICAgIGlmICghKHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrICYmICFuLmRlZmF1bHQpICYmICghZSB8fCBxcyhlLCBuLCBVcykpKVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9XG4gICAgaWYgKGUpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZTogcixcbiAgICAgICAgbGFuZzogbixcbiAgICAgICAgYXNzb2NMYW5nOiBpLFxuICAgICAgICBjaGFyYWN0ZXJpc3RpY3M6IG8sXG4gICAgICAgIGF1ZGlvQ29kZWM6IGEsXG4gICAgICAgIGNoYW5uZWxzOiBsXG4gICAgICB9ID0gZTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgdC5sZW5ndGg7IGMrKykge1xuICAgICAgICBjb25zdCB1ID0gdFtjXTtcbiAgICAgICAgaWYgKHFzKHtcbiAgICAgICAgICBuYW1lOiByLFxuICAgICAgICAgIGxhbmc6IG4sXG4gICAgICAgICAgYXNzb2NMYW5nOiBpLFxuICAgICAgICAgIGNoYXJhY3RlcmlzdGljczogbyxcbiAgICAgICAgICBhdWRpb0NvZGVjOiBhLFxuICAgICAgICAgIGNoYW5uZWxzOiBsXG4gICAgICAgIH0sIHUsIFVzKSlcbiAgICAgICAgICByZXR1cm4gYztcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgdC5sZW5ndGg7IGMrKykge1xuICAgICAgICBjb25zdCB1ID0gdFtjXTtcbiAgICAgICAgaWYgKFNpKGUuYXR0cnMsIHUuYXR0cnMsIFtcIkxBTkdVQUdFXCIsIFwiQVNTT0MtTEFOR1VBR0VcIiwgXCJDSEFSQUNURVJJU1RJQ1NcIl0pKVxuICAgICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCB0Lmxlbmd0aDsgYysrKSB7XG4gICAgICAgIGNvbnN0IHUgPSB0W2NdO1xuICAgICAgICBpZiAoU2koZS5hdHRycywgdS5hdHRycywgW1wiTEFOR1VBR0VcIl0pKVxuICAgICAgICAgIHJldHVybiBjO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgbG9hZFBsYXlsaXN0KGUpIHtcbiAgICBzdXBlci5sb2FkUGxheWxpc3QoKTtcbiAgICBjb25zdCB0ID0gdGhpcy5jdXJyZW50VHJhY2s7XG4gICAgdGhpcy5zaG91bGRMb2FkUGxheWxpc3QodCkgJiYgUW8odC51cmwsIHRoaXMuaGxzKSAmJiB0aGlzLnNjaGVkdWxlTG9hZGluZyh0LCBlKTtcbiAgfVxuICBsb2FkaW5nUGxheWxpc3QoZSwgdCkge1xuICAgIHN1cGVyLmxvYWRpbmdQbGF5bGlzdChlLCB0KTtcbiAgICBjb25zdCByID0gZS5pZCwgbiA9IGUuZ3JvdXBJZCwgaSA9IHRoaXMuZ2V0VXJsV2l0aERpcmVjdGl2ZXMoZS51cmwsIHQpLCBvID0gZS5kZXRhaWxzLCBhID0gbyA9PSBudWxsID8gdm9pZCAwIDogby5hZ2U7XG4gICAgdGhpcy5sb2coYExvYWRpbmcgYXVkaW8tdHJhY2sgJHtyfSBcIiR7ZS5uYW1lfVwiIGxhbmc6JHtlLmxhbmd9IGdyb3VwOiR7bn0keyh0ID09IG51bGwgPyB2b2lkIDAgOiB0Lm1zbikgIT09IHZvaWQgMCA/IFwiIGF0IHNuIFwiICsgdC5tc24gKyBcIiBwYXJ0IFwiICsgdC5wYXJ0IDogXCJcIn0ke2EgJiYgby5saXZlID8gXCIgYWdlIFwiICsgYS50b0ZpeGVkKDEpICsgKG8udHlwZSAmJiBcIiBcIiArIG8udHlwZSB8fCBcIlwiKSA6IFwiXCJ9ICR7aX1gKSwgdGhpcy5obHMudHJpZ2dlcihJLkFVRElPX1RSQUNLX0xPQURJTkcsIHtcbiAgICAgIHVybDogaSxcbiAgICAgIGlkOiByLFxuICAgICAgZ3JvdXBJZDogbixcbiAgICAgIGRlbGl2ZXJ5RGlyZWN0aXZlczogdCB8fCBudWxsLFxuICAgICAgdHJhY2s6IGVcbiAgICB9KTtcbiAgfVxufVxuY2xhc3MgbzIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy50cmFja3MgPSB2b2lkIDAsIHRoaXMucXVldWVzID0ge1xuICAgICAgdmlkZW86IFtdLFxuICAgICAgYXVkaW86IFtdLFxuICAgICAgYXVkaW92aWRlbzogW11cbiAgICB9LCB0aGlzLnRyYWNrcyA9IGU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnRyYWNrcyA9IHRoaXMucXVldWVzID0gbnVsbDtcbiAgfVxuICBhcHBlbmQoZSwgdCwgcikge1xuICAgIGlmICh0aGlzLnF1ZXVlcyA9PT0gbnVsbCB8fCB0aGlzLnRyYWNrcyA9PT0gbnVsbClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBuID0gdGhpcy5xdWV1ZXNbdF07XG4gICAgbi5wdXNoKGUpLCBuLmxlbmd0aCA9PT0gMSAmJiAhciAmJiB0aGlzLmV4ZWN1dGVOZXh0KHQpO1xuICB9XG4gIGFwcGVuZEJsb2NrZXIoZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgodCkgPT4ge1xuICAgICAgY29uc3QgciA9IHtcbiAgICAgICAgbGFiZWw6IFwiYXN5bmMtYmxvY2tlclwiLFxuICAgICAgICBleGVjdXRlOiB0LFxuICAgICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogKCkgPT4ge1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5hcHBlbmQociwgZSk7XG4gICAgfSk7XG4gIH1cbiAgcHJlcGVuZEJsb2NrZXIoZSkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgodCkgPT4ge1xuICAgICAgaWYgKHRoaXMucXVldWVzKSB7XG4gICAgICAgIGNvbnN0IHIgPSB7XG4gICAgICAgICAgbGFiZWw6IFwiYXN5bmMtYmxvY2tlci1wcmVwZW5kXCIsXG4gICAgICAgICAgZXhlY3V0ZTogdCxcbiAgICAgICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAoKSA9PiB7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnF1ZXVlc1tlXS51bnNoaWZ0KHIpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJlbW92ZUJsb2NrZXJzKCkge1xuICAgIHRoaXMucXVldWVzICE9PSBudWxsICYmIFt0aGlzLnF1ZXVlcy52aWRlbywgdGhpcy5xdWV1ZXMuYXVkaW8sIHRoaXMucXVldWVzLmF1ZGlvdmlkZW9dLmZvckVhY2goKGUpID0+IHtcbiAgICAgIHZhciB0O1xuICAgICAgY29uc3QgciA9ICh0ID0gZVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IHQubGFiZWw7XG4gICAgICAociA9PT0gXCJhc3luYy1ibG9ja2VyXCIgfHwgciA9PT0gXCJhc3luYy1ibG9ja2VyLXByZXBlbmRcIikgJiYgKGVbMF0uZXhlY3V0ZSgpLCBlLnNwbGljZSgwLCAxKSk7XG4gICAgfSk7XG4gIH1cbiAgdW5ibG9ja0F1ZGlvKGUpIHtcbiAgICBpZiAodGhpcy5xdWV1ZXMgPT09IG51bGwpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5xdWV1ZXMuYXVkaW9bMF0gPT09IGUgJiYgdGhpcy5zaGlmdEFuZEV4ZWN1dGVOZXh0KFwiYXVkaW9cIik7XG4gIH1cbiAgZXhlY3V0ZU5leHQoZSkge1xuICAgIGlmICh0aGlzLnF1ZXVlcyA9PT0gbnVsbCB8fCB0aGlzLnRyYWNrcyA9PT0gbnVsbClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB0ID0gdGhpcy5xdWV1ZXNbZV07XG4gICAgaWYgKHQubGVuZ3RoKSB7XG4gICAgICBjb25zdCBuID0gdFswXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG4uZXhlY3V0ZSgpO1xuICAgICAgfSBjYXRjaCAoaSkge1xuICAgICAgICB2YXIgcjtcbiAgICAgICAgaWYgKG4ub25FcnJvcihpKSwgdGhpcy5xdWV1ZXMgPT09IG51bGwgfHwgdGhpcy50cmFja3MgPT09IG51bGwpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBvID0gKHIgPSB0aGlzLnRyYWNrc1tlXSkgPT0gbnVsbCA/IHZvaWQgMCA6IHIuYnVmZmVyO1xuICAgICAgICBvICE9IG51bGwgJiYgby51cGRhdGluZyB8fCB0aGlzLnNoaWZ0QW5kRXhlY3V0ZU5leHQoZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNoaWZ0QW5kRXhlY3V0ZU5leHQoZSkge1xuICAgIHRoaXMucXVldWVzICE9PSBudWxsICYmICh0aGlzLnF1ZXVlc1tlXS5zaGlmdCgpLCB0aGlzLmV4ZWN1dGVOZXh0KGUpKTtcbiAgfVxuICBjdXJyZW50KGUpIHtcbiAgICB2YXIgdDtcbiAgICByZXR1cm4gKCh0ID0gdGhpcy5xdWV1ZXMpID09IG51bGwgPyB2b2lkIDAgOiB0W2VdWzBdKSB8fCBudWxsO1xuICB9XG4gIHRvU3RyaW5nKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHF1ZXVlczogZSxcbiAgICAgIHRyYWNrczogdFxuICAgIH0gPSB0aGlzO1xuICAgIHJldHVybiBlID09PSBudWxsIHx8IHQgPT09IG51bGwgPyBcIjxkZXN0cm95ZWQ+XCIgOiBgXG4ke3RoaXMubGlzdChcInZpZGVvXCIpfVxuJHt0aGlzLmxpc3QoXCJhdWRpb1wiKX1cbiR7dGhpcy5saXN0KFwiYXVkaW92aWRlb1wiKX19YDtcbiAgfVxuICBsaXN0KGUpIHtcbiAgICB2YXIgdCwgcjtcbiAgICByZXR1cm4gKHQgPSB0aGlzLnF1ZXVlcykgIT0gbnVsbCAmJiB0W2VdIHx8IChyID0gdGhpcy50cmFja3MpICE9IG51bGwgJiYgcltlXSA/IGAke2V9OiAoJHt0aGlzLmxpc3RTYkluZm8oZSl9KSAke3RoaXMubGlzdE9wcyhlKX1gIDogXCJcIjtcbiAgfVxuICBsaXN0U2JJbmZvKGUpIHtcbiAgICB2YXIgdDtcbiAgICBjb25zdCByID0gKHQgPSB0aGlzLnRyYWNrcykgPT0gbnVsbCA/IHZvaWQgMCA6IHRbZV0sIG4gPSByID09IG51bGwgPyB2b2lkIDAgOiByLmJ1ZmZlcjtcbiAgICByZXR1cm4gbiA/IGBTb3VyY2VCdWZmZXIke24udXBkYXRpbmcgPyBcIiB1cGRhdGluZ1wiIDogXCJcIn0ke3IuZW5kZWQgPyBcIiBlbmRlZFwiIDogXCJcIn0ke3IuZW5kaW5nID8gXCIgZW5kaW5nXCIgOiBcIlwifWAgOiBcIm5vbmVcIjtcbiAgfVxuICBsaXN0T3BzKGUpIHtcbiAgICB2YXIgdDtcbiAgICByZXR1cm4gKCh0ID0gdGhpcy5xdWV1ZXMpID09IG51bGwgPyB2b2lkIDAgOiB0W2VdLm1hcCgocikgPT4gci5sYWJlbCkuam9pbihcIiwgXCIpKSB8fCBcIlwiO1xuICB9XG59XG5jb25zdCBLaCA9IC8oYXZjWzEyMzRdfGh2YzF8aGV2MXxkdmhbMWVdfHZwMDl8YXYwMSkoPzpcXC5bXi4sXSspKy8sIElwID0gXCJIbHNKc1RyYWNrUmVtb3ZlZEVycm9yXCI7XG5jbGFzcyBhMiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHN1cGVyKGUpLCB0aGlzLm5hbWUgPSBJcDtcbiAgfVxufVxuY2xhc3MgbDIgZXh0ZW5kcyBMciB7XG4gIGNvbnN0cnVjdG9yKGUsIHQpIHtcbiAgICBzdXBlcihcImJ1ZmZlci1jb250cm9sbGVyXCIsIGUubG9nZ2VyKSwgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuZnJhZ21lbnRUcmFja2VyID0gdm9pZCAwLCB0aGlzLmRldGFpbHMgPSBudWxsLCB0aGlzLl9vYmplY3RVcmwgPSBudWxsLCB0aGlzLm9wZXJhdGlvblF1ZXVlID0gbnVsbCwgdGhpcy5idWZmZXJDb2RlY0V2ZW50c1RvdGFsID0gMCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMubWVkaWFTb3VyY2UgPSBudWxsLCB0aGlzLmxhc3RNcGVnQXVkaW9DaHVuayA9IG51bGwsIHRoaXMuYmxvY2tlZEF1ZGlvQXBwZW5kID0gbnVsbCwgdGhpcy5sYXN0VmlkZW9BcHBlbmRFbmQgPSAwLCB0aGlzLmFwcGVuZFNvdXJjZSA9IHZvaWQgMCwgdGhpcy50cmFuc2ZlckRhdGEgPSB2b2lkIDAsIHRoaXMub3ZlcnJpZGVzID0gdm9pZCAwLCB0aGlzLmFwcGVuZEVycm9ycyA9IHtcbiAgICAgIGF1ZGlvOiAwLFxuICAgICAgdmlkZW86IDAsXG4gICAgICBhdWRpb3ZpZGVvOiAwXG4gICAgfSwgdGhpcy50cmFja3MgPSB7fSwgdGhpcy5zb3VyY2VCdWZmZXJzID0gW1tudWxsLCBudWxsXSwgW251bGwsIG51bGxdXSwgdGhpcy5fb25FbmRTdHJlYW1pbmcgPSAocikgPT4ge1xuICAgICAgdmFyIG47XG4gICAgICB0aGlzLmhscyAmJiAoKG4gPSB0aGlzLm1lZGlhU291cmNlKSA9PSBudWxsID8gdm9pZCAwIDogbi5yZWFkeVN0YXRlKSA9PT0gXCJvcGVuXCIgJiYgdGhpcy5obHMucGF1c2VCdWZmZXJpbmcoKTtcbiAgICB9LCB0aGlzLl9vblN0YXJ0U3RyZWFtaW5nID0gKHIpID0+IHtcbiAgICAgIHRoaXMuaGxzICYmIHRoaXMuaGxzLnJlc3VtZUJ1ZmZlcmluZygpO1xuICAgIH0sIHRoaXMuX29uTWVkaWFTb3VyY2VPcGVuID0gKHIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWVkaWE6IG4sXG4gICAgICAgIG1lZGlhU291cmNlOiBpXG4gICAgICB9ID0gdGhpcztcbiAgICAgIHIgJiYgdGhpcy5sb2coXCJNZWRpYSBzb3VyY2Ugb3BlbmVkXCIpLCAhKCFuIHx8ICFpKSAmJiAoaS5yZW1vdmVFdmVudExpc3RlbmVyKFwic291cmNlb3BlblwiLCB0aGlzLl9vbk1lZGlhU291cmNlT3BlbiksIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVtcHRpZWRcIiwgdGhpcy5fb25NZWRpYUVtcHRpZWQpLCB0aGlzLnVwZGF0ZUR1cmF0aW9uKCksIHRoaXMuaGxzLnRyaWdnZXIoSS5NRURJQV9BVFRBQ0hFRCwge1xuICAgICAgICBtZWRpYTogbixcbiAgICAgICAgbWVkaWFTb3VyY2U6IGlcbiAgICAgIH0pLCB0aGlzLm1lZGlhU291cmNlICE9PSBudWxsICYmIHRoaXMuY2hlY2tQZW5kaW5nVHJhY2tzKCkpO1xuICAgIH0sIHRoaXMuX29uTWVkaWFTb3VyY2VDbG9zZSA9ICgpID0+IHtcbiAgICAgIHRoaXMubG9nKFwiTWVkaWEgc291cmNlIGNsb3NlZFwiKTtcbiAgICB9LCB0aGlzLl9vbk1lZGlhU291cmNlRW5kZWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLmxvZyhcIk1lZGlhIHNvdXJjZSBlbmRlZFwiKTtcbiAgICB9LCB0aGlzLl9vbk1lZGlhRW1wdGllZCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWVkaWFTcmM6IHIsXG4gICAgICAgIF9vYmplY3RVcmw6IG5cbiAgICAgIH0gPSB0aGlzO1xuICAgICAgciAhPT0gbiAmJiB0aGlzLmVycm9yKGBNZWRpYSBlbGVtZW50IHNyYyB3YXMgc2V0IHdoaWxlIGF0dGFjaGluZyBNZWRpYVNvdXJjZSAoJHtufSA+ICR7cn0pYCk7XG4gICAgfSwgdGhpcy5obHMgPSBlLCB0aGlzLmZyYWdtZW50VHJhY2tlciA9IHQsIHRoaXMuYXBwZW5kU291cmNlID0gQ1MoTXMoZS5jb25maWcucHJlZmVyTWFuYWdlZE1lZGlhU291cmNlKSksIHRoaXMuaW5pdFRyYWNrcygpLCB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gIH1cbiAgaGFzU291cmNlVHlwZXMoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudHJhY2tzKS5sZW5ndGggPiAwO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHRoaXMuZGV0YWlscyA9IG51bGwsIHRoaXMubGFzdE1wZWdBdWRpb0NodW5rID0gdGhpcy5ibG9ja2VkQXVkaW9BcHBlbmQgPSBudWxsLCB0aGlzLnRyYW5zZmVyRGF0YSA9IHRoaXMub3ZlcnJpZGVzID0gdm9pZCAwLCB0aGlzLm9wZXJhdGlvblF1ZXVlICYmICh0aGlzLm9wZXJhdGlvblF1ZXVlLmRlc3Ryb3koKSwgdGhpcy5vcGVyYXRpb25RdWV1ZSA9IG51bGwpLCB0aGlzLmhscyA9IHRoaXMuZnJhZ21lbnRUcmFja2VyID0gbnVsbCwgdGhpcy5fb25NZWRpYVNvdXJjZU9wZW4gPSB0aGlzLl9vbk1lZGlhU291cmNlQ2xvc2UgPSBudWxsLCB0aGlzLl9vbk1lZGlhU291cmNlRW5kZWQgPSBudWxsLCB0aGlzLl9vblN0YXJ0U3RyZWFtaW5nID0gdGhpcy5fb25FbmRTdHJlYW1pbmcgPSBudWxsO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NRURJQV9BVFRBQ0hJTkcsIHRoaXMub25NZWRpYUF0dGFjaGluZywgdGhpcyksIGUub24oSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5vbk1hbmlmZXN0UGFyc2VkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9SRVNFVCwgdGhpcy5vbkJ1ZmZlclJlc2V0LCB0aGlzKSwgZS5vbihJLkJVRkZFUl9BUFBFTkRJTkcsIHRoaXMub25CdWZmZXJBcHBlbmRpbmcsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX0NPREVDUywgdGhpcy5vbkJ1ZmZlckNvZGVjcywgdGhpcyksIGUub24oSS5CVUZGRVJfRU9TLCB0aGlzLm9uQnVmZmVyRW9zLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKSwgZS5vbihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuRlJBR19QQVJTRUQsIHRoaXMub25GcmFnUGFyc2VkLCB0aGlzKSwgZS5vbihJLkZSQUdfQ0hBTkdFRCwgdGhpcy5vbkZyYWdDaGFuZ2VkLCB0aGlzKSwgZS5vbihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZS5vZmYoSS5NRURJQV9BVFRBQ0hJTkcsIHRoaXMub25NZWRpYUF0dGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpLCBlLm9mZihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9mZihJLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5vbk1hbmlmZXN0UGFyc2VkLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfUkVTRVQsIHRoaXMub25CdWZmZXJSZXNldCwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0FQUEVORElORywgdGhpcy5vbkJ1ZmZlckFwcGVuZGluZywgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0NPREVDUywgdGhpcy5vbkJ1ZmZlckNvZGVjcywgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0VPUywgdGhpcy5vbkJ1ZmZlckVvcywgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0ZMVVNISU5HLCB0aGlzLm9uQnVmZmVyRmx1c2hpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfUEFSU0VELCB0aGlzLm9uRnJhZ1BhcnNlZCwgdGhpcyksIGUub2ZmKEkuRlJBR19DSEFOR0VELCB0aGlzLm9uRnJhZ0NoYW5nZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuICB9XG4gIHRyYW5zZmVyTWVkaWEoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IGUsXG4gICAgICBtZWRpYVNvdXJjZTogdFxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghZSlcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHIgPSB7fTtcbiAgICBpZiAodGhpcy5vcGVyYXRpb25RdWV1ZSkge1xuICAgICAgY29uc3QgaSA9IHRoaXMuaXNVcGRhdGluZygpO1xuICAgICAgaSB8fCB0aGlzLm9wZXJhdGlvblF1ZXVlLnJlbW92ZUJsb2NrZXJzKCk7XG4gICAgICBjb25zdCBvID0gdGhpcy5pc1F1ZXVlZCgpO1xuICAgICAgKGkgfHwgbykgJiYgdGhpcy53YXJuKGBUcmFuc2ZlcmluZyBNZWRpYVNvdXJjZSB3aXRoJHtvID8gXCIgb3BlcmF0aW9ucyBpbiBxdWV1ZVwiIDogXCJcIn0ke2kgPyBcIiB1cGRhdGluZyBTb3VyY2VCdWZmZXIocylcIiA6IFwiXCJ9ICR7dGhpcy5vcGVyYXRpb25RdWV1ZX1gKSwgdGhpcy5vcGVyYXRpb25RdWV1ZS5kZXN0cm95KCk7XG4gICAgfVxuICAgIGNvbnN0IG4gPSB0aGlzLnRyYW5zZmVyRGF0YTtcbiAgICByZXR1cm4gIXRoaXMuc291cmNlQnVmZmVyQ291bnQgJiYgbiAmJiBuLm1lZGlhU291cmNlID09PSB0ID8gbnQociwgbi50cmFja3MpIDogdGhpcy5zb3VyY2VCdWZmZXJzLmZvckVhY2goKGkpID0+IHtcbiAgICAgIGNvbnN0IFtvXSA9IGk7XG4gICAgICBvICYmIChyW29dID0gbnQoe30sIHRoaXMudHJhY2tzW29dKSwgdGhpcy5yZW1vdmVCdWZmZXIobykpLCBpWzBdID0gaVsxXSA9IG51bGw7XG4gICAgfSksIHtcbiAgICAgIG1lZGlhOiBlLFxuICAgICAgbWVkaWFTb3VyY2U6IHQsXG4gICAgICB0cmFja3M6IHJcbiAgICB9O1xuICB9XG4gIGluaXRUcmFja3MoKSB7XG4gICAgY29uc3QgZSA9IHt9O1xuICAgIHRoaXMuc291cmNlQnVmZmVycyA9IFtbbnVsbCwgbnVsbF0sIFtudWxsLCBudWxsXV0sIHRoaXMudHJhY2tzID0gZSwgdGhpcy5yZXNldFF1ZXVlKCksIHRoaXMucmVzZXRBcHBlbmRFcnJvcnMoKSwgdGhpcy5sYXN0TXBlZ0F1ZGlvQ2h1bmsgPSB0aGlzLmJsb2NrZWRBdWRpb0FwcGVuZCA9IG51bGwsIHRoaXMubGFzdFZpZGVvQXBwZW5kRW5kID0gMDtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGluZygpIHtcbiAgICB0aGlzLmJ1ZmZlckNvZGVjRXZlbnRzVG90YWwgPSAwLCB0aGlzLmRldGFpbHMgPSBudWxsO1xuICB9XG4gIG9uTWFuaWZlc3RQYXJzZWQoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGxldCBuID0gMjtcbiAgICAodC5hdWRpbyAmJiAhdC52aWRlbyB8fCAhdC5hbHRBdWRpbykgJiYgKG4gPSAxKSwgdGhpcy5idWZmZXJDb2RlY0V2ZW50c1RvdGFsID0gbiwgdGhpcy5sb2coYCR7bn0gYnVmZmVyQ29kZWMgZXZlbnQocykgZXhwZWN0ZWQuYCksIChyID0gdGhpcy50cmFuc2ZlckRhdGEpICE9IG51bGwgJiYgci5tZWRpYVNvdXJjZSAmJiB0aGlzLnNvdXJjZUJ1ZmZlckNvdW50ICYmIG4gJiYgdGhpcy5idWZmZXJDcmVhdGVkKCk7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGluZyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMubWVkaWEgPSB0Lm1lZGlhO1xuICAgIHRoaXMudHJhbnNmZXJEYXRhID0gdGhpcy5vdmVycmlkZXMgPSB2b2lkIDA7XG4gICAgY29uc3QgbiA9IE1zKHRoaXMuYXBwZW5kU291cmNlKTtcbiAgICBpZiAobikge1xuICAgICAgY29uc3QgaSA9ICEhdC5tZWRpYVNvdXJjZTtcbiAgICAgIChpIHx8IHQub3ZlcnJpZGVzKSAmJiAodGhpcy50cmFuc2ZlckRhdGEgPSB0LCB0aGlzLm92ZXJyaWRlcyA9IHQub3ZlcnJpZGVzKTtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLm1lZGlhU291cmNlID0gdC5tZWRpYVNvdXJjZSB8fCBuZXcgbigpO1xuICAgICAgaWYgKHRoaXMuYXNzaWduTWVkaWFTb3VyY2UobyksIGkpXG4gICAgICAgIHRoaXMuX29iamVjdFVybCA9IHIuc3JjLCB0aGlzLmF0dGFjaFRyYW5zZmVycmVkKCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuX29iamVjdFVybCA9IHNlbGYuVVJMLmNyZWF0ZU9iamVjdFVSTChvKTtcbiAgICAgICAgaWYgKHRoaXMuYXBwZW5kU291cmNlKVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByLnJlbW92ZUF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgIGNvbnN0IGwgPSBzZWxmLk1hbmFnZWRNZWRpYVNvdXJjZTtcbiAgICAgICAgICAgIHIuZGlzYWJsZVJlbW90ZVBsYXliYWNrID0gci5kaXNhYmxlUmVtb3RlUGxheWJhY2sgfHwgbCAmJiBvIGluc3RhbmNlb2YgbCwgSGgociksIGMyKHIsIGEpLCByLmxvYWQoKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHIuc3JjID0gYTtcbiAgICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAgICByLnNyYyA9IGE7XG4gICAgICB9XG4gICAgICByLmFkZEV2ZW50TGlzdGVuZXIoXCJlbXB0aWVkXCIsIHRoaXMuX29uTWVkaWFFbXB0aWVkKTtcbiAgICB9XG4gIH1cbiAgYXNzaWduTWVkaWFTb3VyY2UoZSkge1xuICAgIHZhciB0LCByO1xuICAgIHRoaXMubG9nKGAkeygodCA9IHRoaXMudHJhbnNmZXJEYXRhKSA9PSBudWxsID8gdm9pZCAwIDogdC5tZWRpYVNvdXJjZSkgPT09IGUgPyBcInRyYW5zZmVycmVkXCIgOiBcImNyZWF0ZWRcIn0gbWVkaWEgc291cmNlOiAkeyhyID0gZS5jb25zdHJ1Y3RvcikgPT0gbnVsbCA/IHZvaWQgMCA6IHIubmFtZX1gKSwgZS5hZGRFdmVudExpc3RlbmVyKFwic291cmNlb3BlblwiLCB0aGlzLl9vbk1lZGlhU291cmNlT3BlbiksIGUuYWRkRXZlbnRMaXN0ZW5lcihcInNvdXJjZWVuZGVkXCIsIHRoaXMuX29uTWVkaWFTb3VyY2VFbmRlZCksIGUuYWRkRXZlbnRMaXN0ZW5lcihcInNvdXJjZWNsb3NlXCIsIHRoaXMuX29uTWVkaWFTb3VyY2VDbG9zZSksIHRoaXMuYXBwZW5kU291cmNlICYmIChlLmFkZEV2ZW50TGlzdGVuZXIoXCJzdGFydHN0cmVhbWluZ1wiLCB0aGlzLl9vblN0YXJ0U3RyZWFtaW5nKSwgZS5hZGRFdmVudExpc3RlbmVyKFwiZW5kc3RyZWFtaW5nXCIsIHRoaXMuX29uRW5kU3RyZWFtaW5nKSk7XG4gIH1cbiAgYXR0YWNoVHJhbnNmZXJyZWQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubWVkaWEsIHQgPSB0aGlzLnRyYW5zZmVyRGF0YTtcbiAgICBpZiAoIXQgfHwgIWUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHRoaXMudHJhY2tzLCBuID0gdC50cmFja3MsIGkgPSBuID8gT2JqZWN0LmtleXMobikgOiBudWxsLCBvID0gaSA/IGkubGVuZ3RoIDogMCwgYSA9ICgpID0+IHtcbiAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLm1lZGlhICYmIHRoaXMubWVkaWFTb3VyY2VPcGVuT3JFbmRlZCAmJiB0aGlzLl9vbk1lZGlhU291cmNlT3BlbigpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgICBpZiAobiAmJiBpICYmIG8pIHtcbiAgICAgIGlmICghdGhpcy50cmFja3NSZWFkeSkge1xuICAgICAgICB0aGlzLmhscy5jb25maWcuc3RhcnRGcmFnUHJlZmV0Y2ggPSAhMCwgdGhpcy5sb2coXCJhdHRhY2hUcmFuc2ZlcnJlZDogd2FpdGluZyBmb3IgU291cmNlQnVmZmVyIHRyYWNrIGluZm9cIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxvZyhgYXR0YWNoVHJhbnNmZXJyZWQ6IChidWZmZXJDb2RlY0V2ZW50c1RvdGFsICR7dGhpcy5idWZmZXJDb2RlY0V2ZW50c1RvdGFsfSlcbnJlcXVpcmVkIHRyYWNrczogJHthdChyLCAobCwgYykgPT4gbCA9PT0gXCJpbml0U2VnbWVudFwiID8gdm9pZCAwIDogYyl9O1xudHJhbnNmZXIgdHJhY2tzOiAke2F0KG4sIChsLCBjKSA9PiBsID09PSBcImluaXRTZWdtZW50XCIgPyB2b2lkIDAgOiBjKX19YCksICFBZyhuLCByKSkge1xuICAgICAgICB0Lm1lZGlhU291cmNlID0gbnVsbCwgdC50cmFja3MgPSB2b2lkIDA7XG4gICAgICAgIGNvbnN0IGwgPSBlLmN1cnJlbnRUaW1lLCBjID0gdGhpcy5kZXRhaWxzLCB1ID0gTWF0aC5tYXgobCwgKGMgPT0gbnVsbCA/IHZvaWQgMCA6IGMuZnJhZ21lbnRzWzBdLnN0YXJ0KSB8fCAwKTtcbiAgICAgICAgaWYgKHUgLSBsID4gMSkge1xuICAgICAgICAgIHRoaXMubG9nKGBhdHRhY2hUcmFuc2ZlcnJlZDogd2FpdGluZyBmb3IgcGxheWJhY2sgdG8gcmVhY2ggbmV3IHRyYWNrcyBzdGFydCB0aW1lICR7bH0gLT4gJHt1fWApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLndhcm4oYGF0dGFjaFRyYW5zZmVycmVkOiByZXNldHRpbmcgTWVkaWFTb3VyY2UgZm9yIGluY29tcGF0aWJsZSB0cmFja3MgKFwiJHtPYmplY3Qua2V5cyhuKX1cIi0+XCIke09iamVjdC5rZXlzKHIpfVwiKSBzdGFydCB0aW1lOiAke3V9IGN1cnJlbnRUaW1lOiAke2x9YCksIHRoaXMub25NZWRpYURldGFjaGluZyhJLk1FRElBX0RFVEFDSElORywge30pLCB0aGlzLm9uTWVkaWFBdHRhY2hpbmcoSS5NRURJQV9BVFRBQ0hJTkcsIHQpLCBlLmN1cnJlbnRUaW1lID0gdTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy50cmFuc2ZlckRhdGEgPSB2b2lkIDAsIGkuZm9yRWFjaCgobCkgPT4ge1xuICAgICAgICBjb25zdCBjID0gbCwgdSA9IG5bY107XG4gICAgICAgIGlmICh1KSB7XG4gICAgICAgICAgY29uc3QgZCA9IHUuYnVmZmVyO1xuICAgICAgICAgIGlmIChkKSB7XG4gICAgICAgICAgICBjb25zdCBoID0gdGhpcy5mcmFnbWVudFRyYWNrZXIsIGYgPSB1LmlkO1xuICAgICAgICAgICAgaWYgKGguaGFzRnJhZ21lbnRzKGYpIHx8IGguaGFzUGFydHMoZikpIHtcbiAgICAgICAgICAgICAgY29uc3QgRSA9IENlLmdldEJ1ZmZlcmVkKGQpO1xuICAgICAgICAgICAgICBoLmRldGVjdEV2aWN0ZWRGcmFnbWVudHMoYywgRSwgZiwgbnVsbCwgITApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcCA9IFNsKGMpLCB5ID0gW2MsIGRdO1xuICAgICAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXJzW3BdID0geSwgZC51cGRhdGluZyAmJiB0aGlzLm9wZXJhdGlvblF1ZXVlICYmIHRoaXMub3BlcmF0aW9uUXVldWUucHJlcGVuZEJsb2NrZXIoYyksIHRoaXMudHJhY2tTb3VyY2VCdWZmZXIoYywgdSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSwgYSgpLCB0aGlzLmJ1ZmZlckNyZWF0ZWQoKTtcbiAgICB9IGVsc2VcbiAgICAgIHRoaXMubG9nKFwiYXR0YWNoVHJhbnNmZXJyZWQ6IE1lZGlhU291cmNlIHcvbyBTb3VyY2VCdWZmZXJzXCIpLCBhKCk7XG4gIH1cbiAgZ2V0IG1lZGlhU291cmNlT3Blbk9yRW5kZWQoKSB7XG4gICAgdmFyIGU7XG4gICAgY29uc3QgdCA9IChlID0gdGhpcy5tZWRpYVNvdXJjZSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUucmVhZHlTdGF0ZTtcbiAgICByZXR1cm4gdCA9PT0gXCJvcGVuXCIgfHwgdCA9PT0gXCJlbmRlZFwiO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAhIXQudHJhbnNmZXJNZWRpYTtcbiAgICB0aGlzLnRyYW5zZmVyRGF0YSA9IHRoaXMub3ZlcnJpZGVzID0gdm9pZCAwO1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiBuLFxuICAgICAgbWVkaWFTb3VyY2U6IGksXG4gICAgICBfb2JqZWN0VXJsOiBvXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKGkpIHtcbiAgICAgIGlmICh0aGlzLmxvZyhgbWVkaWEgc291cmNlICR7ciA/IFwidHJhbnNmZXJyaW5nXCIgOiBcImRldGFjaGluZ1wifWApLCByKVxuICAgICAgICB0aGlzLnNvdXJjZUJ1ZmZlcnMuZm9yRWFjaCgoW2FdKSA9PiB7XG4gICAgICAgICAgYSAmJiB0aGlzLnJlbW92ZUJ1ZmZlcihhKTtcbiAgICAgICAgfSksIHRoaXMucmVzZXRRdWV1ZSgpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm1lZGlhU291cmNlT3Blbk9yRW5kZWQpIHtcbiAgICAgICAgICBjb25zdCBhID0gaS5yZWFkeVN0YXRlID09PSBcIm9wZW5cIjtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbCA9IGkuc291cmNlQnVmZmVycztcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSBsLmxlbmd0aDsgYy0tOyApXG4gICAgICAgICAgICAgIGEgJiYgbFtjXS5hYm9ydCgpLCBpLnJlbW92ZVNvdXJjZUJ1ZmZlcihsW2NdKTtcbiAgICAgICAgICAgIGEgJiYgaS5lbmRPZlN0cmVhbSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGwpIHtcbiAgICAgICAgICAgIHRoaXMud2Fybihgb25NZWRpYURldGFjaGluZzogJHtsLm1lc3NhZ2V9IHdoaWxlIGNhbGxpbmcgZW5kT2ZTdHJlYW1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zb3VyY2VCdWZmZXJDb3VudCAmJiB0aGlzLm9uQnVmZmVyUmVzZXQoKTtcbiAgICAgIH1cbiAgICAgIGkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNvdXJjZW9wZW5cIiwgdGhpcy5fb25NZWRpYVNvdXJjZU9wZW4pLCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzb3VyY2VlbmRlZFwiLCB0aGlzLl9vbk1lZGlhU291cmNlRW5kZWQpLCBpLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzb3VyY2VjbG9zZVwiLCB0aGlzLl9vbk1lZGlhU291cmNlQ2xvc2UpLCB0aGlzLmFwcGVuZFNvdXJjZSAmJiAoaS5yZW1vdmVFdmVudExpc3RlbmVyKFwic3RhcnRzdHJlYW1pbmdcIiwgdGhpcy5fb25TdGFydFN0cmVhbWluZyksIGkucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVuZHN0cmVhbWluZ1wiLCB0aGlzLl9vbkVuZFN0cmVhbWluZykpLCB0aGlzLm1lZGlhU291cmNlID0gbnVsbCwgdGhpcy5fb2JqZWN0VXJsID0gbnVsbDtcbiAgICB9XG4gICAgbiAmJiAobi5yZW1vdmVFdmVudExpc3RlbmVyKFwiZW1wdGllZFwiLCB0aGlzLl9vbk1lZGlhRW1wdGllZCksIHIgfHwgKG8gJiYgc2VsZi5VUkwucmV2b2tlT2JqZWN0VVJMKG8pLCB0aGlzLm1lZGlhU3JjID09PSBvID8gKG4ucmVtb3ZlQXR0cmlidXRlKFwic3JjXCIpLCB0aGlzLmFwcGVuZFNvdXJjZSAmJiBIaChuKSwgbi5sb2FkKCkpIDogdGhpcy53YXJuKFwibWVkaWF8c291cmNlLnNyYyB3YXMgY2hhbmdlZCBieSBhIHRoaXJkIHBhcnR5IC0gc2tpcCBjbGVhbnVwXCIpKSwgdGhpcy5tZWRpYSA9IG51bGwpLCB0aGlzLmhscy50cmlnZ2VyKEkuTUVESUFfREVUQUNIRUQsIHQpO1xuICB9XG4gIG9uQnVmZmVyUmVzZXQoKSB7XG4gICAgdGhpcy5zb3VyY2VCdWZmZXJzLmZvckVhY2goKFtlXSkgPT4ge1xuICAgICAgZSAmJiB0aGlzLnJlc2V0QnVmZmVyKGUpO1xuICAgIH0pLCB0aGlzLmluaXRUcmFja3MoKTtcbiAgfVxuICByZXNldEJ1ZmZlcihlKSB7XG4gICAgdmFyIHQ7XG4gICAgY29uc3QgciA9ICh0ID0gdGhpcy50cmFja3NbZV0pID09IG51bGwgPyB2b2lkIDAgOiB0LmJ1ZmZlcjtcbiAgICBpZiAodGhpcy5yZW1vdmVCdWZmZXIoZSksIHIpXG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbjtcbiAgICAgICAgKG4gPSB0aGlzLm1lZGlhU291cmNlKSAhPSBudWxsICYmIG4uc291cmNlQnVmZmVycy5sZW5ndGggJiYgdGhpcy5tZWRpYVNvdXJjZS5yZW1vdmVTb3VyY2VCdWZmZXIocik7XG4gICAgICB9IGNhdGNoIChpKSB7XG4gICAgICAgIHRoaXMud2Fybihgb25CdWZmZXJSZXNldCAke2V9YCwgaSk7XG4gICAgICB9XG4gICAgZGVsZXRlIHRoaXMudHJhY2tzW2VdO1xuICB9XG4gIHJlbW92ZUJ1ZmZlcihlKSB7XG4gICAgdGhpcy5yZW1vdmVCdWZmZXJMaXN0ZW5lcnMoZSksIHRoaXMuc291cmNlQnVmZmVyc1tTbChlKV0gPSBbbnVsbCwgbnVsbF07XG4gICAgY29uc3QgdCA9IHRoaXMudHJhY2tzW2VdO1xuICAgIHQgJiYgKHQuYnVmZmVyID0gdm9pZCAwKTtcbiAgfVxuICByZXNldFF1ZXVlKCkge1xuICAgIHRoaXMub3BlcmF0aW9uUXVldWUgJiYgdGhpcy5vcGVyYXRpb25RdWV1ZS5kZXN0cm95KCksIHRoaXMub3BlcmF0aW9uUXVldWUgPSBuZXcgbzIodGhpcy50cmFja3MpO1xuICB9XG4gIG9uQnVmZmVyQ29kZWNzKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gdGhpcy50cmFja3MsIGkgPSBPYmplY3Qua2V5cyh0KTtcbiAgICB0aGlzLmxvZyhgQlVGRkVSX0NPREVDUzogXCIke2l9XCIgKGN1cnJlbnQgU0IgY291bnQgJHt0aGlzLnNvdXJjZUJ1ZmZlckNvdW50fSlgKTtcbiAgICBjb25zdCBvID0gXCJhdWRpb3ZpZGVvXCIgaW4gdCAmJiAobi5hdWRpbyB8fCBuLnZpZGVvKSB8fCBuLmF1ZGlvdmlkZW8gJiYgKFwiYXVkaW9cIiBpbiB0IHx8IFwidmlkZW9cIiBpbiB0KSwgYSA9ICFvICYmIHRoaXMuc291cmNlQnVmZmVyQ291bnQgJiYgdGhpcy5tZWRpYSAmJiBpLnNvbWUoKGwpID0+ICFuW2xdKTtcbiAgICBpZiAobyB8fCBhKSB7XG4gICAgICB0aGlzLndhcm4oYFVuc3VwcG9ydGVkIHRyYW5zaXRpb24gYmV0d2VlbiBcIiR7T2JqZWN0LmtleXMobil9XCIgYW5kIFwiJHtpfVwiIFNvdXJjZUJ1ZmZlcnNgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaS5mb3JFYWNoKChsKSA9PiB7XG4gICAgICB2YXIgYywgdTtcbiAgICAgIGNvbnN0IGQgPSB0W2xdLCB7XG4gICAgICAgIGlkOiBoLFxuICAgICAgICBjb2RlYzogZixcbiAgICAgICAgbGV2ZWxDb2RlYzogcCxcbiAgICAgICAgY29udGFpbmVyOiB5LFxuICAgICAgICBtZXRhZGF0YTogRSxcbiAgICAgICAgc3VwcGxlbWVudGFsOiBiXG4gICAgICB9ID0gZDtcbiAgICAgIGxldCBSID0gbltsXTtcbiAgICAgIGNvbnN0IEEgPSAoYyA9IHRoaXMudHJhbnNmZXJEYXRhKSA9PSBudWxsIHx8IChjID0gYy50cmFja3MpID09IG51bGwgPyB2b2lkIDAgOiBjW2xdLCBGID0gQSAhPSBudWxsICYmIEEuYnVmZmVyID8gQSA6IFIsIE0gPSAoRiA9PSBudWxsID8gdm9pZCAwIDogRi5wZW5kaW5nQ29kZWMpIHx8IChGID09IG51bGwgPyB2b2lkIDAgOiBGLmNvZGVjKSwgSCA9IEYgPT0gbnVsbCA/IHZvaWQgMCA6IEYubGV2ZWxDb2RlYztcbiAgICAgIFIgfHwgKFIgPSBuW2xdID0ge1xuICAgICAgICBidWZmZXI6IHZvaWQgMCxcbiAgICAgICAgbGlzdGVuZXJzOiBbXSxcbiAgICAgICAgY29kZWM6IGYsXG4gICAgICAgIHN1cHBsZW1lbnRhbDogYixcbiAgICAgICAgY29udGFpbmVyOiB5LFxuICAgICAgICBsZXZlbENvZGVjOiBwLFxuICAgICAgICBtZXRhZGF0YTogRSxcbiAgICAgICAgaWQ6IGhcbiAgICAgIH0pO1xuICAgICAgY29uc3QgSyA9IGZvKE0sIEgpLCBqID0gSyA9PSBudWxsID8gdm9pZCAwIDogSy5yZXBsYWNlKEtoLCBcIiQxXCIpO1xuICAgICAgbGV0IEMgPSBmbyhmLCBwKTtcbiAgICAgIGNvbnN0IGsgPSAodSA9IEMpID09IG51bGwgPyB2b2lkIDAgOiB1LnJlcGxhY2UoS2gsIFwiJDFcIik7XG4gICAgICBDICYmIEsgJiYgaiAhPT0gayAmJiAobC5zbGljZSgwLCA1KSA9PT0gXCJhdWRpb1wiICYmIChDID0gWG8oQywgdGhpcy5hcHBlbmRTb3VyY2UpKSwgdGhpcy5sb2coYHN3aXRjaGluZyBjb2RlYyAke019IHRvICR7Q31gKSwgQyAhPT0gKFIucGVuZGluZ0NvZGVjIHx8IFIuY29kZWMpICYmIChSLnBlbmRpbmdDb2RlYyA9IEMpLCBSLmNvbnRhaW5lciA9IHksIHRoaXMuYXBwZW5kQ2hhbmdlVHlwZShsLCB5LCBDKSk7XG4gICAgfSksICh0aGlzLnRyYWNrc1JlYWR5IHx8IHRoaXMuc291cmNlQnVmZmVyQ291bnQpICYmICh0LnRyYWNrcyA9IHRoaXMuc291cmNlQnVmZmVyVHJhY2tzKSwgIXRoaXMuc291cmNlQnVmZmVyQ291bnQgJiYgKHRoaXMuYnVmZmVyQ29kZWNFdmVudHNUb3RhbCA+IDEgJiYgIXRoaXMudHJhY2tzLnZpZGVvICYmICF0LnZpZGVvICYmICgociA9IHQuYXVkaW8pID09IG51bGwgPyB2b2lkIDAgOiByLmlkKSA9PT0gXCJtYWluXCIgJiYgKHRoaXMubG9nKFwiTWFpbiBhdWRpby1vbmx5XCIpLCB0aGlzLmJ1ZmZlckNvZGVjRXZlbnRzVG90YWwgPSAxKSwgdGhpcy5tZWRpYVNvdXJjZU9wZW5PckVuZGVkICYmIHRoaXMuY2hlY2tQZW5kaW5nVHJhY2tzKCkpO1xuICB9XG4gIGdldCBzb3VyY2VCdWZmZXJUcmFja3MoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudHJhY2tzKS5yZWR1Y2UoKGUsIHQpID0+IHtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLnRyYWNrc1t0XTtcbiAgICAgIHJldHVybiBlW3RdID0ge1xuICAgICAgICBpZDogci5pZCxcbiAgICAgICAgY29udGFpbmVyOiByLmNvbnRhaW5lcixcbiAgICAgICAgY29kZWM6IHIuY29kZWMsXG4gICAgICAgIGxldmVsQ29kZWM6IHIubGV2ZWxDb2RlY1xuICAgICAgfSwgZTtcbiAgICB9LCB7fSk7XG4gIH1cbiAgYXBwZW5kQ2hhbmdlVHlwZShlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IGAke3R9O2NvZGVjcz0ke3J9YCwgaSA9IHtcbiAgICAgIGxhYmVsOiBgY2hhbmdlLXR5cGU9JHtufWAsXG4gICAgICBleGVjdXRlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG8gPSB0aGlzLnRyYWNrc1tlXTtcbiAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICBjb25zdCBhID0gby5idWZmZXI7XG4gICAgICAgICAgYSAhPSBudWxsICYmIGEuY2hhbmdlVHlwZSAmJiAodGhpcy5sb2coYGNoYW5naW5nICR7ZX0gc291cmNlQnVmZmVyIHR5cGUgdG8gJHtufWApLCBhLmNoYW5nZVR5cGUobiksIG8uY29kZWMgPSByLCBvLmNvbnRhaW5lciA9IHQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hpZnRBbmRFeGVjdXRlTmV4dChlKTtcbiAgICAgIH0sXG4gICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChvKSA9PiB7XG4gICAgICAgIHRoaXMud2FybihgRmFpbGVkIHRvIGNoYW5nZSAke2V9IFNvdXJjZUJ1ZmZlciB0eXBlYCwgbyk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmFwcGVuZChpLCBlLCB0aGlzLmlzUGVuZGluZyh0aGlzLnRyYWNrc1tlXSkpO1xuICB9XG4gIGJsb2NrQXVkaW8oZSkge1xuICAgIHZhciB0O1xuICAgIGNvbnN0IHIgPSBlLnN0YXJ0LCBuID0gciArIGUuZHVyYXRpb24gKiAwLjA1O1xuICAgIGlmICgoKHQgPSB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRBcHBlbmRlZEZyYWcociwgcGUuTUFJTikpID09IG51bGwgPyB2b2lkIDAgOiB0LmdhcCkgPT09ICEwKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG8gPSB7XG4gICAgICBsYWJlbDogXCJibG9jay1hdWRpb1wiLFxuICAgICAgZXhlY3V0ZTogKCkgPT4ge1xuICAgICAgICB2YXIgYTtcbiAgICAgICAgY29uc3QgbCA9IHRoaXMudHJhY2tzLnZpZGVvO1xuICAgICAgICAodGhpcy5sYXN0VmlkZW9BcHBlbmRFbmQgPiBuIHx8IGwgIT0gbnVsbCAmJiBsLmJ1ZmZlciAmJiBDZS5pc0J1ZmZlcmVkKGwuYnVmZmVyLCBuKSB8fCAoKGEgPSB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRBcHBlbmRlZEZyYWcobiwgcGUuTUFJTikpID09IG51bGwgPyB2b2lkIDAgOiBhLmdhcCkgPT09ICEwKSAmJiAodGhpcy5ibG9ja2VkQXVkaW9BcHBlbmQgPSBudWxsLCB0aGlzLnNoaWZ0QW5kRXhlY3V0ZU5leHQoXCJhdWRpb1wiKSk7XG4gICAgICB9LFxuICAgICAgb25TdGFydDogKCkgPT4ge1xuICAgICAgfSxcbiAgICAgIG9uQ29tcGxldGU6ICgpID0+IHtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoYSkgPT4ge1xuICAgICAgICB0aGlzLndhcm4oXCJFcnJvciBleGVjdXRpbmcgYmxvY2stYXVkaW8gb3BlcmF0aW9uXCIsIGEpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5ibG9ja2VkQXVkaW9BcHBlbmQgPSB7XG4gICAgICBvcDogbyxcbiAgICAgIGZyYWc6IGVcbiAgICB9LCB0aGlzLmFwcGVuZChvLCBcImF1ZGlvXCIsICEwKTtcbiAgfVxuICB1bmJsb2NrQXVkaW8oKSB7XG4gICAgY29uc3Qge1xuICAgICAgYmxvY2tlZEF1ZGlvQXBwZW5kOiBlLFxuICAgICAgb3BlcmF0aW9uUXVldWU6IHRcbiAgICB9ID0gdGhpcztcbiAgICBlICYmIHQgJiYgKHRoaXMuYmxvY2tlZEF1ZGlvQXBwZW5kID0gbnVsbCwgdC51bmJsb2NrQXVkaW8oZS5vcCkpO1xuICB9XG4gIG9uQnVmZmVyQXBwZW5kaW5nKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICB0cmFja3M6IHJcbiAgICB9ID0gdGhpcywge1xuICAgICAgZGF0YTogbixcbiAgICAgIHR5cGU6IGksXG4gICAgICBwYXJlbnQ6IG8sXG4gICAgICBmcmFnOiBhLFxuICAgICAgcGFydDogbCxcbiAgICAgIGNodW5rTWV0YTogYyxcbiAgICAgIG9mZnNldDogdVxuICAgIH0gPSB0LCBkID0gYy5idWZmZXJpbmdbaV0sIHtcbiAgICAgIHNuOiBoLFxuICAgICAgY2M6IGZcbiAgICB9ID0gYSwgcCA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgZC5zdGFydCA9IHA7XG4gICAgY29uc3QgeSA9IGEuc3RhdHMuYnVmZmVyaW5nLCBFID0gbCA/IGwuc3RhdHMuYnVmZmVyaW5nIDogbnVsbDtcbiAgICB5LnN0YXJ0ID09PSAwICYmICh5LnN0YXJ0ID0gcCksIEUgJiYgRS5zdGFydCA9PT0gMCAmJiAoRS5zdGFydCA9IHApO1xuICAgIGNvbnN0IGIgPSByLmF1ZGlvO1xuICAgIGxldCBSID0gITE7XG4gICAgaSA9PT0gXCJhdWRpb1wiICYmIChiID09IG51bGwgPyB2b2lkIDAgOiBiLmNvbnRhaW5lcikgPT09IFwiYXVkaW8vbXBlZ1wiICYmIChSID0gIXRoaXMubGFzdE1wZWdBdWRpb0NodW5rIHx8IGMuaWQgPT09IDEgfHwgdGhpcy5sYXN0TXBlZ0F1ZGlvQ2h1bmsuc24gIT09IGMuc24sIHRoaXMubGFzdE1wZWdBdWRpb0NodW5rID0gYyk7XG4gICAgY29uc3QgQSA9IHIudmlkZW8sIEYgPSBBID09IG51bGwgPyB2b2lkIDAgOiBBLmJ1ZmZlcjtcbiAgICBpZiAoRiAmJiBoICE9PSBcImluaXRTZWdtZW50XCIpIHtcbiAgICAgIGNvbnN0IEsgPSBsIHx8IGEsIGogPSB0aGlzLmJsb2NrZWRBdWRpb0FwcGVuZDtcbiAgICAgIGlmIChpID09PSBcImF1ZGlvXCIgJiYgbyAhPT0gXCJtYWluXCIgJiYgIXRoaXMuYmxvY2tlZEF1ZGlvQXBwZW5kICYmICEoQS5lbmRpbmcgfHwgQS5lbmRlZCkpIHtcbiAgICAgICAgY29uc3QgayA9IEsuc3RhcnQgKyBLLmR1cmF0aW9uICogMC4wNSwgJCA9IEYuYnVmZmVyZWQsIFcgPSB0aGlzLmN1cnJlbnRPcChcInZpZGVvXCIpO1xuICAgICAgICAhJC5sZW5ndGggJiYgIVcgPyB0aGlzLmJsb2NrQXVkaW8oSykgOiAhVyAmJiAhQ2UuaXNCdWZmZXJlZChGLCBrKSAmJiB0aGlzLmxhc3RWaWRlb0FwcGVuZEVuZCA8IGsgJiYgdGhpcy5ibG9ja0F1ZGlvKEspO1xuICAgICAgfSBlbHNlIGlmIChpID09PSBcInZpZGVvXCIpIHtcbiAgICAgICAgY29uc3QgQyA9IEsuZW5kO1xuICAgICAgICBpZiAoaikge1xuICAgICAgICAgIGNvbnN0IGsgPSBqLmZyYWcuc3RhcnQ7XG4gICAgICAgICAgKEMgPiBrIHx8IEMgPCB0aGlzLmxhc3RWaWRlb0FwcGVuZEVuZCB8fCBDZS5pc0J1ZmZlcmVkKEYsIGspKSAmJiB0aGlzLnVuYmxvY2tBdWRpbygpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGFzdFZpZGVvQXBwZW5kRW5kID0gQztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgTSA9IChsIHx8IGEpLnN0YXJ0LCBIID0ge1xuICAgICAgbGFiZWw6IGBhcHBlbmQtJHtpfWAsXG4gICAgICBleGVjdXRlOiAoKSA9PiB7XG4gICAgICAgIHZhciBLO1xuICAgICAgICBkLmV4ZWN1dGVTdGFydCA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIGNvbnN0IGogPSAoSyA9IHRoaXMudHJhY2tzW2ldKSA9PSBudWxsID8gdm9pZCAwIDogSy5idWZmZXI7XG4gICAgICAgIGogJiYgKFIgPyB0aGlzLnVwZGF0ZVRpbWVzdGFtcE9mZnNldChqLCBNLCAwLjEsIGksIGgsIGYpIDogdSAhPT0gdm9pZCAwICYmIHVlKHUpICYmIHRoaXMudXBkYXRlVGltZXN0YW1wT2Zmc2V0KGosIHUsIDFlLTYsIGksIGgsIGYpKSwgdGhpcy5hcHBlbmRFeGVjdXRvcihuLCBpKTtcbiAgICAgIH0sXG4gICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBLID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgZC5leGVjdXRlRW5kID0gZC5lbmQgPSBLLCB5LmZpcnN0ID09PSAwICYmICh5LmZpcnN0ID0gSyksIEUgJiYgRS5maXJzdCA9PT0gMCAmJiAoRS5maXJzdCA9IEspO1xuICAgICAgICBjb25zdCBqID0ge307XG4gICAgICAgIHRoaXMuc291cmNlQnVmZmVycy5mb3JFYWNoKChbQywga10pID0+IHtcbiAgICAgICAgICBDICYmIChqW0NdID0gQ2UuZ2V0QnVmZmVyZWQoaykpO1xuICAgICAgICB9KSwgdGhpcy5hcHBlbmRFcnJvcnNbaV0gPSAwLCBpID09PSBcImF1ZGlvXCIgfHwgaSA9PT0gXCJ2aWRlb1wiID8gdGhpcy5hcHBlbmRFcnJvcnMuYXVkaW92aWRlbyA9IDAgOiAodGhpcy5hcHBlbmRFcnJvcnMuYXVkaW8gPSAwLCB0aGlzLmFwcGVuZEVycm9ycy52aWRlbyA9IDApLCB0aGlzLmhscy50cmlnZ2VyKEkuQlVGRkVSX0FQUEVOREVELCB7XG4gICAgICAgICAgdHlwZTogaSxcbiAgICAgICAgICBmcmFnOiBhLFxuICAgICAgICAgIHBhcnQ6IGwsXG4gICAgICAgICAgY2h1bmtNZXRhOiBjLFxuICAgICAgICAgIHBhcmVudDogYS50eXBlLFxuICAgICAgICAgIHRpbWVSYW5nZXM6IGpcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKEspID0+IHtcbiAgICAgICAgdmFyIGo7XG4gICAgICAgIGNvbnN0IEMgPSB7XG4gICAgICAgICAgdHlwZTogdmUuTUVESUFfRVJST1IsXG4gICAgICAgICAgcGFyZW50OiBhLnR5cGUsXG4gICAgICAgICAgZGV0YWlsczogSi5CVUZGRVJfQVBQRU5EX0VSUk9SLFxuICAgICAgICAgIHNvdXJjZUJ1ZmZlck5hbWU6IGksXG4gICAgICAgICAgZnJhZzogYSxcbiAgICAgICAgICBwYXJ0OiBsLFxuICAgICAgICAgIGNodW5rTWV0YTogYyxcbiAgICAgICAgICBlcnJvcjogSyxcbiAgICAgICAgICBlcnI6IEssXG4gICAgICAgICAgZmF0YWw6ICExXG4gICAgICAgIH0sIGsgPSAoaiA9IHRoaXMubWVkaWEpID09IG51bGwgPyB2b2lkIDAgOiBqLmVycm9yO1xuICAgICAgICBpZiAoSy5jb2RlID09PSBET01FeGNlcHRpb24uUVVPVEFfRVhDRUVERURfRVJSIHx8IEsubmFtZSA9PSBcIlF1b3RhRXhjZWVkZWRFcnJvclwiIHx8IFwicXVvdGFcIiBpbiBLKVxuICAgICAgICAgIEMuZGV0YWlscyA9IEouQlVGRkVSX0ZVTExfRVJST1I7XG4gICAgICAgIGVsc2UgaWYgKEsuY29kZSA9PT0gRE9NRXhjZXB0aW9uLklOVkFMSURfU1RBVEVfRVJSICYmIHRoaXMubWVkaWFTb3VyY2VPcGVuT3JFbmRlZCAmJiAhaylcbiAgICAgICAgICBDLmVycm9yQWN0aW9uID0gQW4oITApO1xuICAgICAgICBlbHNlIGlmIChLLm5hbWUgPT09IElwICYmIHRoaXMuc291cmNlQnVmZmVyQ291bnQgPT09IDApXG4gICAgICAgICAgQy5lcnJvckFjdGlvbiA9IEFuKCEwKTtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY29uc3QgJCA9ICsrdGhpcy5hcHBlbmRFcnJvcnNbaV07XG4gICAgICAgICAgdGhpcy53YXJuKGBGYWlsZWQgJHskfS8ke3RoaXMuaGxzLmNvbmZpZy5hcHBlbmRFcnJvck1heFJldHJ5fSB0aW1lcyB0byBhcHBlbmQgc2VnbWVudCBpbiBcIiR7aX1cIiBzb3VyY2VCdWZmZXIgKCR7ayB8fCBcIm5vIG1lZGlhIGVycm9yXCJ9KWApLCAoJCA+PSB0aGlzLmhscy5jb25maWcuYXBwZW5kRXJyb3JNYXhSZXRyeSB8fCBrKSAmJiAoQy5mYXRhbCA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIEMpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5sb2coYHF1ZXVpbmcgXCIke2l9XCIgYXBwZW5kIHNuOiAke2h9JHtsID8gXCIgcDogXCIgKyBsLmluZGV4IDogXCJcIn0gb2YgJHthLnR5cGUgPT09IHBlLk1BSU4gPyBcImxldmVsXCIgOiBcInRyYWNrXCJ9ICR7YS5sZXZlbH0gY2M6ICR7Zn1gKSwgdGhpcy5hcHBlbmQoSCwgaSwgdGhpcy5pc1BlbmRpbmcodGhpcy50cmFja3NbaV0pKTtcbiAgfVxuICBnZXRGbHVzaE9wKGUsIHQsIHIpIHtcbiAgICByZXR1cm4gdGhpcy5sb2coYHF1ZXVpbmcgXCIke2V9XCIgcmVtb3ZlICR7dH0tJHtyfWApLCB7XG4gICAgICBsYWJlbDogXCJyZW1vdmVcIixcbiAgICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5yZW1vdmVFeGVjdXRvcihlLCB0LCByKTtcbiAgICAgIH0sXG4gICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICB9LFxuICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuQlVGRkVSX0ZMVVNIRUQsIHtcbiAgICAgICAgICB0eXBlOiBlXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChuKSA9PiB7XG4gICAgICAgIHRoaXMud2FybihgRmFpbGVkIHRvIHJlbW92ZSAke3R9LSR7cn0gZnJvbSBcIiR7ZX1cIiBTb3VyY2VCdWZmZXJgLCBuKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIG9uQnVmZmVyRmx1c2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGU6IHIsXG4gICAgICBzdGFydE9mZnNldDogbixcbiAgICAgIGVuZE9mZnNldDogaVxuICAgIH0gPSB0O1xuICAgIHIgPyB0aGlzLmFwcGVuZCh0aGlzLmdldEZsdXNoT3AociwgbiwgaSksIHIpIDogdGhpcy5zb3VyY2VCdWZmZXJzLmZvckVhY2goKFtvXSkgPT4ge1xuICAgICAgbyAmJiB0aGlzLmFwcGVuZCh0aGlzLmdldEZsdXNoT3AobywgbiwgaSksIG8pO1xuICAgIH0pO1xuICB9XG4gIG9uRnJhZ1BhcnNlZChlLCB0KSB7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZzogcixcbiAgICAgIHBhcnQ6IG5cbiAgICB9ID0gdCwgaSA9IFtdLCBvID0gbiA/IG4uZWxlbWVudGFyeVN0cmVhbXMgOiByLmVsZW1lbnRhcnlTdHJlYW1zO1xuICAgIG9bb3QuQVVESU9WSURFT10gPyBpLnB1c2goXCJhdWRpb3ZpZGVvXCIpIDogKG9bb3QuQVVESU9dICYmIGkucHVzaChcImF1ZGlvXCIpLCBvW290LlZJREVPXSAmJiBpLnB1c2goXCJ2aWRlb1wiKSk7XG4gICAgY29uc3QgYSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGwgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgci5zdGF0cy5idWZmZXJpbmcuZW5kID0gbCwgbiAmJiAobi5zdGF0cy5idWZmZXJpbmcuZW5kID0gbCk7XG4gICAgICBjb25zdCBjID0gbiA/IG4uc3RhdHMgOiByLnN0YXRzO1xuICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkZSQUdfQlVGRkVSRUQsIHtcbiAgICAgICAgZnJhZzogcixcbiAgICAgICAgcGFydDogbixcbiAgICAgICAgc3RhdHM6IGMsXG4gICAgICAgIGlkOiByLnR5cGVcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaS5sZW5ndGggPT09IDAgJiYgdGhpcy53YXJuKGBGcmFnbWVudHMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBFbGVtZW50YXJ5U3RyZWFtVHlwZSBzZXQuIHR5cGU6ICR7ci50eXBlfSBsZXZlbDogJHtyLmxldmVsfSBzbjogJHtyLnNufWApLCB0aGlzLmJsb2NrQnVmZmVycyhhLCBpKS5jYXRjaCgobCkgPT4ge1xuICAgICAgdGhpcy53YXJuKGBGcmFnbWVudCBidWZmZXJlZCBjYWxsYmFjayAke2x9YCksIHRoaXMuc3RlcE9wZXJhdGlvblF1ZXVlKHRoaXMuc291cmNlQnVmZmVyVHlwZXMpO1xuICAgIH0pO1xuICB9XG4gIG9uRnJhZ0NoYW5nZWQoZSwgdCkge1xuICAgIHRoaXMudHJpbUJ1ZmZlcnMoKTtcbiAgfVxuICBnZXQgYnVmZmVyZWRUb0VuZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VCdWZmZXJDb3VudCA+IDAgJiYgIXRoaXMuc291cmNlQnVmZmVycy5zb21lKChbZV0pID0+IHtcbiAgICAgIGlmIChlKSB7XG4gICAgICAgIGNvbnN0IHQgPSB0aGlzLnRyYWNrc1tlXTtcbiAgICAgICAgaWYgKHQpXG4gICAgICAgICAgcmV0dXJuICF0LmVuZGVkIHx8IHQuZW5kaW5nO1xuICAgICAgfVxuICAgICAgcmV0dXJuICExO1xuICAgIH0pO1xuICB9XG4gIC8vIG9uIEJVRkZFUl9FT1MgbWFyayBtYXRjaGluZyBzb3VyY2VidWZmZXIocykgYXMgXCJlbmRpbmdcIiBhbmQgXCJlbmRlZFwiIGFuZCBxdWV1ZSBlbmRPZlN0cmVhbSBhZnRlciByZW1haW5pbmcgb3BlcmF0aW9ucyhzKVxuICAvLyBhbiB1bmRlZmluZWQgZGF0YS50eXBlIHdpbGwgbWFyayBhbGwgYnVmZmVycyBhcyBFT1MuXG4gIG9uQnVmZmVyRW9zKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICB0aGlzLnNvdXJjZUJ1ZmZlcnMuZm9yRWFjaCgoW29dKSA9PiB7XG4gICAgICBpZiAobykge1xuICAgICAgICBjb25zdCBhID0gdGhpcy50cmFja3Nbb107XG4gICAgICAgICghdC50eXBlIHx8IHQudHlwZSA9PT0gbykgJiYgKGEuZW5kaW5nID0gITAsIGEuZW5kZWQgfHwgKGEuZW5kZWQgPSAhMCwgdGhpcy5sb2coYCR7b30gYnVmZmVyIHJlYWNoZWQgRU9TYCkpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBuID0gKChyID0gdGhpcy5vdmVycmlkZXMpID09IG51bGwgPyB2b2lkIDAgOiByLmVuZE9mU3RyZWFtKSAhPT0gITE7XG4gICAgdGhpcy5zb3VyY2VCdWZmZXJDb3VudCA+IDAgJiYgIXRoaXMuc291cmNlQnVmZmVycy5zb21lKChbb10pID0+IHtcbiAgICAgIHZhciBhO1xuICAgICAgcmV0dXJuIG8gJiYgISgoYSA9IHRoaXMudHJhY2tzW29dKSAhPSBudWxsICYmIGEuZW5kZWQpO1xuICAgIH0pID8gbiA/ICh0aGlzLmxvZyhcIlF1ZXVlaW5nIEVPU1wiKSwgdGhpcy5ibG9ja1VudGlsT3BlbigoKSA9PiB7XG4gICAgICB0aGlzLnRyYWNrc0VuZGVkKCk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1lZGlhU291cmNlOiBvXG4gICAgICB9ID0gdGhpcztcbiAgICAgIGlmICghbyB8fCBvLnJlYWR5U3RhdGUgIT09IFwib3BlblwiKSB7XG4gICAgICAgIG8gJiYgdGhpcy5sb2coYENvdWxkIG5vdCBjYWxsIG1lZGlhU291cmNlLmVuZE9mU3RyZWFtKCkuIG1lZGlhU291cmNlLnJlYWR5U3RhdGU6ICR7by5yZWFkeVN0YXRlfWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmxvZyhcIkNhbGxpbmcgbWVkaWFTb3VyY2UuZW5kT2ZTdHJlYW0oKVwiKSwgby5lbmRPZlN0cmVhbSgpLCB0aGlzLmhscy50cmlnZ2VyKEkuQlVGRkVSRURfVE9fRU5ELCB2b2lkIDApO1xuICAgIH0pKSA6ICh0aGlzLnRyYWNrc0VuZGVkKCksIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJFRF9UT19FTkQsIHZvaWQgMCkpIDogdC50eXBlID09PSBcInZpZGVvXCIgJiYgdGhpcy51bmJsb2NrQXVkaW8oKTtcbiAgfVxuICB0cmFja3NFbmRlZCgpIHtcbiAgICB0aGlzLnNvdXJjZUJ1ZmZlcnMuZm9yRWFjaCgoW2VdKSA9PiB7XG4gICAgICBpZiAoZSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0ID0gdGhpcy50cmFja3NbZV07XG4gICAgICAgIHQgJiYgKHQuZW5kaW5nID0gITEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG9uTGV2ZWxVcGRhdGVkKGUsIHtcbiAgICBkZXRhaWxzOiB0XG4gIH0pIHtcbiAgICB0LmZyYWdtZW50cy5sZW5ndGggJiYgKHRoaXMuZGV0YWlscyA9IHQsIHRoaXMudXBkYXRlRHVyYXRpb24oKSk7XG4gIH1cbiAgdXBkYXRlRHVyYXRpb24oKSB7XG4gICAgdGhpcy5ibG9ja1VudGlsT3BlbigoKSA9PiB7XG4gICAgICBjb25zdCBlID0gdGhpcy5nZXREdXJhdGlvbkFuZFJhbmdlKCk7XG4gICAgICBlICYmIHRoaXMudXBkYXRlTWVkaWFTb3VyY2UoZSk7XG4gICAgfSk7XG4gIH1cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgaWYgKHQuZGV0YWlscyA9PT0gSi5CVUZGRVJfQVBQRU5EX0VSUk9SICYmIHQuZnJhZykge1xuICAgICAgdmFyIHI7XG4gICAgICBjb25zdCBuID0gKHIgPSB0LmVycm9yQWN0aW9uKSA9PSBudWxsID8gdm9pZCAwIDogci5uZXh0QXV0b0xldmVsO1xuICAgICAgdWUobikgJiYgbiAhPT0gdC5mcmFnLmxldmVsICYmIHRoaXMucmVzZXRBcHBlbmRFcnJvcnMoKTtcbiAgICB9XG4gIH1cbiAgcmVzZXRBcHBlbmRFcnJvcnMoKSB7XG4gICAgdGhpcy5hcHBlbmRFcnJvcnMgPSB7XG4gICAgICBhdWRpbzogMCxcbiAgICAgIHZpZGVvOiAwLFxuICAgICAgYXVkaW92aWRlbzogMFxuICAgIH07XG4gIH1cbiAgdHJpbUJ1ZmZlcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlLFxuICAgICAgZGV0YWlsczogdCxcbiAgICAgIG1lZGlhOiByXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCFyIHx8IHQgPT09IG51bGwgfHwgIXRoaXMuc291cmNlQnVmZmVyQ291bnQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbiA9IGUuY29uZmlnLCBpID0gci5jdXJyZW50VGltZSwgbyA9IHQubGV2ZWxUYXJnZXREdXJhdGlvbiwgYSA9IHQubGl2ZSAmJiBuLmxpdmVCYWNrQnVmZmVyTGVuZ3RoICE9PSBudWxsID8gbi5saXZlQmFja0J1ZmZlckxlbmd0aCA6IG4uYmFja0J1ZmZlckxlbmd0aDtcbiAgICBpZiAodWUoYSkgJiYgYSA+PSAwKSB7XG4gICAgICBjb25zdCBjID0gTWF0aC5tYXgoYSwgbyksIHUgPSBNYXRoLmZsb29yKGkgLyBvKSAqIG8gLSBjO1xuICAgICAgdGhpcy5mbHVzaEJhY2tCdWZmZXIoaSwgbywgdSk7XG4gICAgfVxuICAgIGNvbnN0IGwgPSBuLmZyb250QnVmZmVyRmx1c2hUaHJlc2hvbGQ7XG4gICAgaWYgKHVlKGwpICYmIGwgPiAwKSB7XG4gICAgICBjb25zdCBjID0gTWF0aC5tYXgobi5tYXhCdWZmZXJMZW5ndGgsIGwpLCB1ID0gTWF0aC5tYXgoYywgbyksIGQgPSBNYXRoLmZsb29yKGkgLyBvKSAqIG8gKyB1O1xuICAgICAgdGhpcy5mbHVzaEZyb250QnVmZmVyKGksIG8sIGQpO1xuICAgIH1cbiAgfVxuICBmbHVzaEJhY2tCdWZmZXIoZSwgdCwgcikge1xuICAgIHRoaXMuc291cmNlQnVmZmVycy5mb3JFYWNoKChbbiwgaV0pID0+IHtcbiAgICAgIGlmIChpKSB7XG4gICAgICAgIGNvbnN0IGEgPSBDZS5nZXRCdWZmZXJlZChpKTtcbiAgICAgICAgaWYgKGEubGVuZ3RoID4gMCAmJiByID4gYS5zdGFydCgwKSkge1xuICAgICAgICAgIHZhciBvO1xuICAgICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5CQUNLX0JVRkZFUl9SRUFDSEVELCB7XG4gICAgICAgICAgICBidWZmZXJFbmQ6IHJcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBsID0gdGhpcy50cmFja3Nbbl07XG4gICAgICAgICAgaWYgKChvID0gdGhpcy5kZXRhaWxzKSAhPSBudWxsICYmIG8ubGl2ZSlcbiAgICAgICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5MSVZFX0JBQ0tfQlVGRkVSX1JFQUNIRUQsIHtcbiAgICAgICAgICAgICAgYnVmZmVyRW5kOiByXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBlbHNlIGlmIChsICE9IG51bGwgJiYgbC5lbmRlZCkge1xuICAgICAgICAgICAgdGhpcy5sb2coYENhbm5vdCBmbHVzaCAke259IGJhY2sgYnVmZmVyIHdoaWxlIFNvdXJjZUJ1ZmZlciBpcyBpbiBlbmRlZCBzdGF0ZWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuQlVGRkVSX0ZMVVNISU5HLCB7XG4gICAgICAgICAgICBzdGFydE9mZnNldDogMCxcbiAgICAgICAgICAgIGVuZE9mZnNldDogcixcbiAgICAgICAgICAgIHR5cGU6IG5cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGZsdXNoRnJvbnRCdWZmZXIoZSwgdCwgcikge1xuICAgIHRoaXMuc291cmNlQnVmZmVycy5mb3JFYWNoKChbbiwgaV0pID0+IHtcbiAgICAgIGlmIChpKSB7XG4gICAgICAgIGNvbnN0IG8gPSBDZS5nZXRCdWZmZXJlZChpKSwgYSA9IG8ubGVuZ3RoO1xuICAgICAgICBpZiAoYSA8IDIpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBsID0gby5zdGFydChhIC0gMSksIGMgPSBvLmVuZChhIC0gMSk7XG4gICAgICAgIGlmIChyID4gbCB8fCBlID49IGwgJiYgZSA8PSBjKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkJVRkZFUl9GTFVTSElORywge1xuICAgICAgICAgIHN0YXJ0T2Zmc2V0OiBsLFxuICAgICAgICAgIGVuZE9mZnNldDogMSAvIDAsXG4gICAgICAgICAgdHlwZTogblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogVXBkYXRlIE1lZGlhIFNvdXJjZSBkdXJhdGlvbiB0byBjdXJyZW50IGxldmVsIGR1cmF0aW9uIG9yIG92ZXJyaWRlIHRvIEluZmluaXR5IGlmIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyXG4gICAqICdsaXZlRHVyYXRpb25JbmZpbml0eWAgaXMgc2V0IHRvIGB0cnVlYFxuICAgKiBNb3JlIGRldGFpbHM6IGh0dHBzOi8vZ2l0aHViLmNvbS92aWRlby1kZXYvaGxzLmpzL2lzc3Vlcy8zNTVcbiAgICovXG4gIGdldER1cmF0aW9uQW5kUmFuZ2UoKSB7XG4gICAgdmFyIGU7XG4gICAgY29uc3Qge1xuICAgICAgZGV0YWlsczogdCxcbiAgICAgIG1lZGlhU291cmNlOiByXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCF0IHx8ICF0aGlzLm1lZGlhIHx8IChyID09IG51bGwgPyB2b2lkIDAgOiByLnJlYWR5U3RhdGUpICE9PSBcIm9wZW5cIilcbiAgICAgIHJldHVybiBudWxsO1xuICAgIGNvbnN0IG4gPSB0LmVkZ2U7XG4gICAgaWYgKHQubGl2ZSAmJiB0aGlzLmhscy5jb25maWcubGl2ZUR1cmF0aW9uSW5maW5pdHkpIHtcbiAgICAgIGlmICh0LmZyYWdtZW50cy5sZW5ndGggJiYgci5zZXRMaXZlU2Vla2FibGVSYW5nZSkge1xuICAgICAgICBjb25zdCBjID0gTWF0aC5tYXgoMCwgdC5mcmFnbWVudFN0YXJ0KSwgdSA9IE1hdGgubWF4KGMsIG4pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGR1cmF0aW9uOiAxIC8gMCxcbiAgICAgICAgICBzdGFydDogYyxcbiAgICAgICAgICBlbmQ6IHVcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGR1cmF0aW9uOiAxIC8gMFxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgaSA9IChlID0gdGhpcy5vdmVycmlkZXMpID09IG51bGwgPyB2b2lkIDAgOiBlLmR1cmF0aW9uO1xuICAgIGlmIChpKVxuICAgICAgcmV0dXJuIHVlKGkpID8ge1xuICAgICAgICBkdXJhdGlvbjogaVxuICAgICAgfSA6IG51bGw7XG4gICAgY29uc3QgbyA9IHRoaXMubWVkaWEuZHVyYXRpb24sIGEgPSB1ZShyLmR1cmF0aW9uKSA/IHIuZHVyYXRpb24gOiAwO1xuICAgIHJldHVybiBuID4gYSAmJiBuID4gbyB8fCAhdWUobykgPyB7XG4gICAgICBkdXJhdGlvbjogblxuICAgIH0gOiBudWxsO1xuICB9XG4gIHVwZGF0ZU1lZGlhU291cmNlKHtcbiAgICBkdXJhdGlvbjogZSxcbiAgICBzdGFydDogdCxcbiAgICBlbmQ6IHJcbiAgfSkge1xuICAgIGNvbnN0IG4gPSB0aGlzLm1lZGlhU291cmNlO1xuICAgICF0aGlzLm1lZGlhIHx8ICFuIHx8IG4ucmVhZHlTdGF0ZSAhPT0gXCJvcGVuXCIgfHwgKG4uZHVyYXRpb24gIT09IGUgJiYgKHVlKGUpICYmIHRoaXMubG9nKGBVcGRhdGluZyBNZWRpYVNvdXJjZSBkdXJhdGlvbiB0byAke2UudG9GaXhlZCgzKX1gKSwgbi5kdXJhdGlvbiA9IGUpLCB0ICE9PSB2b2lkIDAgJiYgciAhPT0gdm9pZCAwICYmICh0aGlzLmxvZyhgTWVkaWFTb3VyY2UgZHVyYXRpb24gaXMgc2V0IHRvICR7bi5kdXJhdGlvbn0uIFNldHRpbmcgc2Vla2FibGUgcmFuZ2UgdG8gJHt0fS0ke3J9LmApLCBuLnNldExpdmVTZWVrYWJsZVJhbmdlKHQsIHIpKSk7XG4gIH1cbiAgZ2V0IHRyYWNrc1JlYWR5KCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLnBlbmRpbmdUcmFja0NvdW50O1xuICAgIHJldHVybiBlID4gMCAmJiAoZSA+PSB0aGlzLmJ1ZmZlckNvZGVjRXZlbnRzVG90YWwgfHwgdGhpcy5pc1BlbmRpbmcodGhpcy50cmFja3MuYXVkaW92aWRlbykpO1xuICB9XG4gIGNoZWNrUGVuZGluZ1RyYWNrcygpIHtcbiAgICBjb25zdCB7XG4gICAgICBidWZmZXJDb2RlY0V2ZW50c1RvdGFsOiBlLFxuICAgICAgcGVuZGluZ1RyYWNrQ291bnQ6IHQsXG4gICAgICB0cmFja3M6IHJcbiAgICB9ID0gdGhpcztcbiAgICBpZiAodGhpcy5sb2coYGNoZWNrUGVuZGluZ1RyYWNrcyAocGVuZGluZzogJHt0fSBjb2RlYyBldmVudHMgZXhwZWN0ZWQ6ICR7ZX0pICR7YXQocil9YCksIHRoaXMudHJhY2tzUmVhZHkpIHtcbiAgICAgIHZhciBuO1xuICAgICAgY29uc3QgaSA9IChuID0gdGhpcy50cmFuc2ZlckRhdGEpID09IG51bGwgPyB2b2lkIDAgOiBuLnRyYWNrcztcbiAgICAgIGkgJiYgT2JqZWN0LmtleXMoaSkubGVuZ3RoID8gdGhpcy5hdHRhY2hUcmFuc2ZlcnJlZCgpIDogdGhpcy5jcmVhdGVTb3VyY2VCdWZmZXJzKCk7XG4gICAgfVxuICB9XG4gIGJ1ZmZlckNyZWF0ZWQoKSB7XG4gICAgaWYgKHRoaXMuc291cmNlQnVmZmVyQ291bnQpIHtcbiAgICAgIGNvbnN0IGUgPSB7fTtcbiAgICAgIHRoaXMuc291cmNlQnVmZmVycy5mb3JFYWNoKChbdCwgcl0pID0+IHtcbiAgICAgICAgaWYgKHQpIHtcbiAgICAgICAgICBjb25zdCBuID0gdGhpcy50cmFja3NbdF07XG4gICAgICAgICAgZVt0XSA9IHtcbiAgICAgICAgICAgIGJ1ZmZlcjogcixcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbi5jb250YWluZXIsXG4gICAgICAgICAgICBjb2RlYzogbi5jb2RlYyxcbiAgICAgICAgICAgIHN1cHBsZW1lbnRhbDogbi5zdXBwbGVtZW50YWwsXG4gICAgICAgICAgICBsZXZlbENvZGVjOiBuLmxldmVsQ29kZWMsXG4gICAgICAgICAgICBpZDogbi5pZCxcbiAgICAgICAgICAgIG1ldGFkYXRhOiBuLm1ldGFkYXRhXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSksIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfQ1JFQVRFRCwge1xuICAgICAgICB0cmFja3M6IGVcbiAgICAgIH0pLCB0aGlzLmxvZyhgU291cmNlQnVmZmVycyBjcmVhdGVkLiBSdW5uaW5nIHF1ZXVlOiAke3RoaXMub3BlcmF0aW9uUXVldWV9YCksIHRoaXMuc291cmNlQnVmZmVycy5mb3JFYWNoKChbdF0pID0+IHtcbiAgICAgICAgdGhpcy5leGVjdXRlTmV4dCh0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlID0gbmV3IEVycm9yKFwiY291bGQgbm90IGNyZWF0ZSBzb3VyY2UgYnVmZmVyIGZvciBtZWRpYSBjb2RlYyhzKVwiKTtcbiAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5CVUZGRVJfSU5DT01QQVRJQkxFX0NPREVDU19FUlJPUixcbiAgICAgICAgZmF0YWw6ICEwLFxuICAgICAgICBlcnJvcjogZSxcbiAgICAgICAgcmVhc29uOiBlLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjcmVhdGVTb3VyY2VCdWZmZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHRyYWNrczogZSxcbiAgICAgIHNvdXJjZUJ1ZmZlcnM6IHQsXG4gICAgICBtZWRpYVNvdXJjZTogclxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImNyZWF0ZVNvdXJjZUJ1ZmZlcnMgY2FsbGVkIHdoZW4gbWVkaWFTb3VyY2Ugd2FzIG51bGxcIik7XG4gICAgZm9yIChjb25zdCBpIGluIGUpIHtcbiAgICAgIGNvbnN0IG8gPSBpLCBhID0gZVtvXTtcbiAgICAgIGlmICh0aGlzLmlzUGVuZGluZyhhKSkge1xuICAgICAgICBjb25zdCBsID0gdGhpcy5nZXRUcmFja0NvZGVjKGEsIG8pLCBjID0gYCR7YS5jb250YWluZXJ9O2NvZGVjcz0ke2x9YDtcbiAgICAgICAgYS5jb2RlYyA9IGwsIHRoaXMubG9nKGBjcmVhdGluZyBzb3VyY2VCdWZmZXIoJHtjfSkke3RoaXMuY3VycmVudE9wKG8pID8gXCIgUXVldWVkXCIgOiBcIlwifSAke2F0KGEpfWApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHUgPSByLmFkZFNvdXJjZUJ1ZmZlcihjKSwgZCA9IFNsKG8pLCBoID0gW28sIHVdO1xuICAgICAgICAgIHRbZF0gPSBoLCBhLmJ1ZmZlciA9IHU7XG4gICAgICAgIH0gY2F0Y2ggKHUpIHtcbiAgICAgICAgICB2YXIgbjtcbiAgICAgICAgICB0aGlzLmVycm9yKGBlcnJvciB3aGlsZSB0cnlpbmcgdG8gYWRkIHNvdXJjZUJ1ZmZlcjogJHt1Lm1lc3NhZ2V9YCksIHRoaXMuc2hpZnRBbmRFeGVjdXRlTmV4dChvKSwgKG4gPSB0aGlzLm9wZXJhdGlvblF1ZXVlKSA9PSBudWxsIHx8IG4ucmVtb3ZlQmxvY2tlcnMoKSwgZGVsZXRlIHRoaXMudHJhY2tzW29dLCB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICAgICAgZGV0YWlsczogSi5CVUZGRVJfQUREX0NPREVDX0VSUk9SLFxuICAgICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgICAgZXJyb3I6IHUsXG4gICAgICAgICAgICBzb3VyY2VCdWZmZXJOYW1lOiBvLFxuICAgICAgICAgICAgbWltZVR5cGU6IGMsXG4gICAgICAgICAgICBwYXJlbnQ6IGEuaWRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50cmFja1NvdXJjZUJ1ZmZlcihvLCBhKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5idWZmZXJDcmVhdGVkKCk7XG4gIH1cbiAgZ2V0VHJhY2tDb2RlYyhlLCB0KSB7XG4gICAgY29uc3QgciA9IGUuc3VwcGxlbWVudGFsO1xuICAgIGxldCBuID0gZS5jb2RlYztcbiAgICByICYmICh0ID09PSBcInZpZGVvXCIgfHwgdCA9PT0gXCJhdWRpb3ZpZGVvXCIpICYmIGdpKHIsIFwidmlkZW9cIikgJiYgKG4gPSBYUyhuLCByKSk7XG4gICAgY29uc3QgaSA9IGZvKG4sIGUubGV2ZWxDb2RlYyk7XG4gICAgcmV0dXJuIGkgPyB0LnNsaWNlKDAsIDUpID09PSBcImF1ZGlvXCIgPyBYbyhpLCB0aGlzLmFwcGVuZFNvdXJjZSkgOiBpIDogXCJcIjtcbiAgfVxuICB0cmFja1NvdXJjZUJ1ZmZlcihlLCB0KSB7XG4gICAgY29uc3QgciA9IHQuYnVmZmVyO1xuICAgIGlmICghcilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBuID0gdGhpcy5nZXRUcmFja0NvZGVjKHQsIGUpO1xuICAgIHRoaXMudHJhY2tzW2VdID0ge1xuICAgICAgYnVmZmVyOiByLFxuICAgICAgY29kZWM6IG4sXG4gICAgICBjb250YWluZXI6IHQuY29udGFpbmVyLFxuICAgICAgbGV2ZWxDb2RlYzogdC5sZXZlbENvZGVjLFxuICAgICAgc3VwcGxlbWVudGFsOiB0LnN1cHBsZW1lbnRhbCxcbiAgICAgIG1ldGFkYXRhOiB0Lm1ldGFkYXRhLFxuICAgICAgaWQ6IHQuaWQsXG4gICAgICBsaXN0ZW5lcnM6IFtdXG4gICAgfSwgdGhpcy5yZW1vdmVCdWZmZXJMaXN0ZW5lcnMoZSksIHRoaXMuYWRkQnVmZmVyTGlzdGVuZXIoZSwgXCJ1cGRhdGVzdGFydFwiLCB0aGlzLm9uU0JVcGRhdGVTdGFydCksIHRoaXMuYWRkQnVmZmVyTGlzdGVuZXIoZSwgXCJ1cGRhdGVlbmRcIiwgdGhpcy5vblNCVXBkYXRlRW5kKSwgdGhpcy5hZGRCdWZmZXJMaXN0ZW5lcihlLCBcImVycm9yXCIsIHRoaXMub25TQlVwZGF0ZUVycm9yKSwgdGhpcy5hcHBlbmRTb3VyY2UgJiYgdGhpcy5hZGRCdWZmZXJMaXN0ZW5lcihlLCBcImJ1ZmZlcmVkY2hhbmdlXCIsIChpLCBvKSA9PiB7XG4gICAgICBjb25zdCBhID0gby5yZW1vdmVkUmFuZ2VzO1xuICAgICAgYSAhPSBudWxsICYmIGEubGVuZ3RoICYmIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfRkxVU0hFRCwge1xuICAgICAgICB0eXBlOiBpXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBnZXQgbWVkaWFTcmMoKSB7XG4gICAgdmFyIGUsIHQ7XG4gICAgY29uc3QgciA9ICgoZSA9IHRoaXMubWVkaWEpID09IG51bGwgfHwgKHQgPSBlLnF1ZXJ5U2VsZWN0b3IpID09IG51bGwgPyB2b2lkIDAgOiB0LmNhbGwoZSwgXCJzb3VyY2VcIikpIHx8IHRoaXMubWVkaWE7XG4gICAgcmV0dXJuIHIgPT0gbnVsbCA/IHZvaWQgMCA6IHIuc3JjO1xuICB9XG4gIG9uU0JVcGRhdGVTdGFydChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuY3VycmVudE9wKGUpO1xuICAgIHQgJiYgdC5vblN0YXJ0KCk7XG4gIH1cbiAgb25TQlVwZGF0ZUVuZChlKSB7XG4gICAgdmFyIHQ7XG4gICAgaWYgKCgodCA9IHRoaXMubWVkaWFTb3VyY2UpID09IG51bGwgPyB2b2lkIDAgOiB0LnJlYWR5U3RhdGUpID09PSBcImNsb3NlZFwiKSB7XG4gICAgICB0aGlzLnJlc2V0QnVmZmVyKGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByID0gdGhpcy5jdXJyZW50T3AoZSk7XG4gICAgciAmJiAoci5vbkNvbXBsZXRlKCksIHRoaXMuc2hpZnRBbmRFeGVjdXRlTmV4dChlKSk7XG4gIH1cbiAgb25TQlVwZGF0ZUVycm9yKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gbmV3IEVycm9yKGAke2V9IFNvdXJjZUJ1ZmZlciBlcnJvci4gTWVkaWFTb3VyY2UgcmVhZHlTdGF0ZTogJHsociA9IHRoaXMubWVkaWFTb3VyY2UpID09IG51bGwgPyB2b2lkIDAgOiByLnJlYWR5U3RhdGV9YCk7XG4gICAgdGhpcy5lcnJvcihgJHtufWAsIHQpLCB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgZGV0YWlsczogSi5CVUZGRVJfQVBQRU5ESU5HX0VSUk9SLFxuICAgICAgc291cmNlQnVmZmVyTmFtZTogZSxcbiAgICAgIGVycm9yOiBuLFxuICAgICAgZmF0YWw6ICExXG4gICAgfSk7XG4gICAgY29uc3QgaSA9IHRoaXMuY3VycmVudE9wKGUpO1xuICAgIGkgJiYgaS5vbkVycm9yKG4pO1xuICB9XG4gIHVwZGF0ZVRpbWVzdGFtcE9mZnNldChlLCB0LCByLCBuLCBpLCBvKSB7XG4gICAgY29uc3QgYSA9IHQgLSBlLnRpbWVzdGFtcE9mZnNldDtcbiAgICBNYXRoLmFicyhhKSA+PSByICYmICh0aGlzLmxvZyhgVXBkYXRpbmcgJHtufSBTb3VyY2VCdWZmZXIgdGltZXN0YW1wT2Zmc2V0IHRvICR7dH0gKHNuOiAke2l9IGNjOiAke299KWApLCBlLnRpbWVzdGFtcE9mZnNldCA9IHQpO1xuICB9XG4gIC8vIFRoaXMgbWV0aG9kIG11c3QgcmVzdWx0IGluIGFuIHVwZGF0ZWVuZCBldmVudDsgaWYgcmVtb3ZlIGlzIG5vdCBjYWxsZWQsIG9uU0JVcGRhdGVFbmQgbXVzdCBiZSBjYWxsZWQgbWFudWFsbHlcbiAgcmVtb3ZlRXhlY3V0b3IoZSwgdCwgcikge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiBuLFxuICAgICAgbWVkaWFTb3VyY2U6IGlcbiAgICB9ID0gdGhpcywgbyA9IHRoaXMudHJhY2tzW2VdLCBhID0gbyA9PSBudWxsID8gdm9pZCAwIDogby5idWZmZXI7XG4gICAgaWYgKCFuIHx8ICFpIHx8ICFhKSB7XG4gICAgICB0aGlzLndhcm4oYEF0dGVtcHRpbmcgdG8gcmVtb3ZlIGZyb20gdGhlICR7ZX0gU291cmNlQnVmZmVyLCBidXQgaXQgZG9lcyBub3QgZXhpc3RgKSwgdGhpcy5zaGlmdEFuZEV4ZWN1dGVOZXh0KGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsID0gdWUobi5kdXJhdGlvbikgPyBuLmR1cmF0aW9uIDogMSAvIDAsIGMgPSB1ZShpLmR1cmF0aW9uKSA/IGkuZHVyYXRpb24gOiAxIC8gMCwgdSA9IE1hdGgubWF4KDAsIHQpLCBkID0gTWF0aC5taW4ociwgbCwgYyk7XG4gICAgZCA+IHUgJiYgKCFvLmVuZGluZyB8fCBvLmVuZGVkKSA/IChvLmVuZGVkID0gITEsIHRoaXMubG9nKGBSZW1vdmluZyBbJHt1fSwke2R9XSBmcm9tIHRoZSAke2V9IFNvdXJjZUJ1ZmZlcmApLCBhLnJlbW92ZSh1LCBkKSkgOiB0aGlzLnNoaWZ0QW5kRXhlY3V0ZU5leHQoZSk7XG4gIH1cbiAgLy8gVGhpcyBtZXRob2QgbXVzdCByZXN1bHQgaW4gYW4gdXBkYXRlZW5kIGV2ZW50OyBpZiBhcHBlbmQgaXMgbm90IGNhbGxlZCwgb25TQlVwZGF0ZUVuZCBtdXN0IGJlIGNhbGxlZCBtYW51YWxseVxuICBhcHBlbmRFeGVjdXRvcihlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMudHJhY2tzW3RdLCBuID0gciA9PSBudWxsID8gdm9pZCAwIDogci5idWZmZXI7XG4gICAgaWYgKCFuKVxuICAgICAgdGhyb3cgbmV3IGEyKGBBdHRlbXB0aW5nIHRvIGFwcGVuZCB0byB0aGUgJHt0fSBTb3VyY2VCdWZmZXIsIGJ1dCBpdCBkb2VzIG5vdCBleGlzdGApO1xuICAgIHIuZW5kaW5nID0gITEsIHIuZW5kZWQgPSAhMSwgbi5hcHBlbmRCdWZmZXIoZSk7XG4gIH1cbiAgYmxvY2tVbnRpbE9wZW4oZSkge1xuICAgIGlmICh0aGlzLmlzVXBkYXRpbmcoKSB8fCB0aGlzLmlzUXVldWVkKCkpXG4gICAgICB0aGlzLmJsb2NrQnVmZmVycyhlKS5jYXRjaCgodCkgPT4ge1xuICAgICAgICB0aGlzLndhcm4oYFNvdXJjZUJ1ZmZlciBibG9ja2VkIGNhbGxiYWNrICR7dH1gKSwgdGhpcy5zdGVwT3BlcmF0aW9uUXVldWUodGhpcy5zb3VyY2VCdWZmZXJUeXBlcyk7XG4gICAgICB9KTtcbiAgICBlbHNlXG4gICAgICB0cnkge1xuICAgICAgICBlKCk7XG4gICAgICB9IGNhdGNoICh0KSB7XG4gICAgICAgIHRoaXMud2FybihgQ2FsbGJhY2sgcnVuIHdpdGhvdXQgYmxvY2tpbmcgJHt0aGlzLm9wZXJhdGlvblF1ZXVlfSAke3R9YCk7XG4gICAgICB9XG4gIH1cbiAgaXNVcGRhdGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VCdWZmZXJzLnNvbWUoKFtlLCB0XSkgPT4gZSAmJiB0LnVwZGF0aW5nKTtcbiAgfVxuICBpc1F1ZXVlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2VCdWZmZXJzLnNvbWUoKFtlXSkgPT4gZSAmJiAhIXRoaXMuY3VycmVudE9wKGUpKTtcbiAgfVxuICBpc1BlbmRpbmcoZSkge1xuICAgIHJldHVybiAhIWUgJiYgIWUuYnVmZmVyO1xuICB9XG4gIC8vIEVucXVldWVzIGFuIG9wZXJhdGlvbiB0byBlYWNoIFNvdXJjZUJ1ZmZlciBxdWV1ZSB3aGljaCwgdXBvbiBleGVjdXRpb24sIHJlc29sdmVzIGEgcHJvbWlzZS4gV2hlbiBhbGwgcHJvbWlzZXNcbiAgLy8gcmVzb2x2ZSwgdGhlIG9uVW5ibG9ja2VkIGZ1bmN0aW9uIGlzIGV4ZWN1dGVkLiBGdW5jdGlvbnMgY2FsbGluZyB0aGlzIG1ldGhvZCBkbyBub3QgbmVlZCB0byB1bmJsb2NrIHRoZSBxdWV1ZVxuICAvLyB1cG9uIGNvbXBsZXRpb24sIHNpbmNlIHdlIGFscmVhZHkgZG8gaXQgaGVyZVxuICBibG9ja0J1ZmZlcnMoZSwgdCA9IHRoaXMuc291cmNlQnVmZmVyVHlwZXMpIHtcbiAgICBpZiAoIXQubGVuZ3RoKVxuICAgICAgcmV0dXJuIHRoaXMubG9nKFwiQmxvY2tpbmcgb3BlcmF0aW9uIHJlcXVlc3RlZCwgYnV0IG5vIFNvdXJjZUJ1ZmZlcnMgZXhpc3RcIiksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oZSk7XG4gICAgY29uc3Qge1xuICAgICAgb3BlcmF0aW9uUXVldWU6IHJcbiAgICB9ID0gdGhpcywgbiA9IHQubWFwKChvKSA9PiB0aGlzLmFwcGVuZEJsb2NrZXIobykpO1xuICAgIHJldHVybiB0Lmxlbmd0aCA+IDEgJiYgISF0aGlzLmJsb2NrZWRBdWRpb0FwcGVuZCAmJiB0aGlzLnVuYmxvY2tBdWRpbygpLCBQcm9taXNlLmFsbChuKS50aGVuKChvKSA9PiB7XG4gICAgICByID09PSB0aGlzLm9wZXJhdGlvblF1ZXVlICYmIChlKCksIHRoaXMuc3RlcE9wZXJhdGlvblF1ZXVlKHRoaXMuc291cmNlQnVmZmVyVHlwZXMpKTtcbiAgICB9KTtcbiAgfVxuICBzdGVwT3BlcmF0aW9uUXVldWUoZSkge1xuICAgIGUuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgdmFyIHI7XG4gICAgICBjb25zdCBuID0gKHIgPSB0aGlzLnRyYWNrc1t0XSkgPT0gbnVsbCA/IHZvaWQgMCA6IHIuYnVmZmVyO1xuICAgICAgIW4gfHwgbi51cGRhdGluZyB8fCB0aGlzLnNoaWZ0QW5kRXhlY3V0ZU5leHQodCk7XG4gICAgfSk7XG4gIH1cbiAgYXBwZW5kKGUsIHQsIHIpIHtcbiAgICB0aGlzLm9wZXJhdGlvblF1ZXVlICYmIHRoaXMub3BlcmF0aW9uUXVldWUuYXBwZW5kKGUsIHQsIHIpO1xuICB9XG4gIGFwcGVuZEJsb2NrZXIoZSkge1xuICAgIGlmICh0aGlzLm9wZXJhdGlvblF1ZXVlKVxuICAgICAgcmV0dXJuIHRoaXMub3BlcmF0aW9uUXVldWUuYXBwZW5kQmxvY2tlcihlKTtcbiAgfVxuICBjdXJyZW50T3AoZSkge1xuICAgIHJldHVybiB0aGlzLm9wZXJhdGlvblF1ZXVlID8gdGhpcy5vcGVyYXRpb25RdWV1ZS5jdXJyZW50KGUpIDogbnVsbDtcbiAgfVxuICBleGVjdXRlTmV4dChlKSB7XG4gICAgZSAmJiB0aGlzLm9wZXJhdGlvblF1ZXVlICYmIHRoaXMub3BlcmF0aW9uUXVldWUuZXhlY3V0ZU5leHQoZSk7XG4gIH1cbiAgc2hpZnRBbmRFeGVjdXRlTmV4dChlKSB7XG4gICAgdGhpcy5vcGVyYXRpb25RdWV1ZSAmJiB0aGlzLm9wZXJhdGlvblF1ZXVlLnNoaWZ0QW5kRXhlY3V0ZU5leHQoZSk7XG4gIH1cbiAgZ2V0IHBlbmRpbmdUcmFja0NvdW50KCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnRyYWNrcykucmVkdWNlKChlLCB0KSA9PiBlICsgKHRoaXMuaXNQZW5kaW5nKHRoaXMudHJhY2tzW3RdKSA/IDEgOiAwKSwgMCk7XG4gIH1cbiAgZ2V0IHNvdXJjZUJ1ZmZlckNvdW50KCkge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUJ1ZmZlcnMucmVkdWNlKChlLCBbdF0pID0+IGUgKyAodCA/IDEgOiAwKSwgMCk7XG4gIH1cbiAgZ2V0IHNvdXJjZUJ1ZmZlclR5cGVzKCkge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUJ1ZmZlcnMubWFwKChbZV0pID0+IGUpLmZpbHRlcigoZSkgPT4gISFlKTtcbiAgfVxuICBhZGRCdWZmZXJMaXN0ZW5lcihlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IHRoaXMudHJhY2tzW2VdO1xuICAgIGlmICghbilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gbi5idWZmZXI7XG4gICAgaWYgKCFpKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG8gPSByLmJpbmQodGhpcywgZSk7XG4gICAgbi5saXN0ZW5lcnMucHVzaCh7XG4gICAgICBldmVudDogdCxcbiAgICAgIGxpc3RlbmVyOiBvXG4gICAgfSksIGkuYWRkRXZlbnRMaXN0ZW5lcih0LCBvKTtcbiAgfVxuICByZW1vdmVCdWZmZXJMaXN0ZW5lcnMoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLnRyYWNrc1tlXTtcbiAgICBpZiAoIXQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHQuYnVmZmVyO1xuICAgIHIgJiYgKHQubGlzdGVuZXJzLmZvckVhY2goKG4pID0+IHtcbiAgICAgIHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLmV2ZW50LCBuLmxpc3RlbmVyKTtcbiAgICB9KSwgdC5saXN0ZW5lcnMubGVuZ3RoID0gMCk7XG4gIH1cbn1cbmZ1bmN0aW9uIEhoKHMpIHtcbiAgY29uc3QgZSA9IHMucXVlcnlTZWxlY3RvckFsbChcInNvdXJjZVwiKTtcbiAgW10uc2xpY2UuY2FsbChlKS5mb3JFYWNoKCh0KSA9PiB7XG4gICAgcy5yZW1vdmVDaGlsZCh0KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBjMihzLCBlKSB7XG4gIGNvbnN0IHQgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzb3VyY2VcIik7XG4gIHQudHlwZSA9IFwidmlkZW8vbXA0XCIsIHQuc3JjID0gZSwgcy5hcHBlbmRDaGlsZCh0KTtcbn1cbmZ1bmN0aW9uIFNsKHMpIHtcbiAgcmV0dXJuIHMgPT09IFwiYXVkaW9cIiA/IDEgOiAwO1xufVxuY2xhc3MgRHUge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuYXV0b0xldmVsQ2FwcGluZyA9IHZvaWQgMCwgdGhpcy5maXJzdExldmVsID0gdm9pZCAwLCB0aGlzLm1lZGlhID0gdm9pZCAwLCB0aGlzLnJlc3RyaWN0ZWRMZXZlbHMgPSB2b2lkIDAsIHRoaXMudGltZXIgPSB2b2lkIDAsIHRoaXMuY2xpZW50UmVjdCA9IHZvaWQgMCwgdGhpcy5zdHJlYW1Db250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmhscyA9IGUsIHRoaXMuYXV0b0xldmVsQ2FwcGluZyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgdGhpcy5maXJzdExldmVsID0gLTEsIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLnJlc3RyaWN0ZWRMZXZlbHMgPSBbXSwgdGhpcy50aW1lciA9IHZvaWQgMCwgdGhpcy5jbGllbnRSZWN0ID0gbnVsbCwgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIHNldFN0cmVhbUNvbnRyb2xsZXIoZSkge1xuICAgIHRoaXMuc3RyZWFtQ29udHJvbGxlciA9IGU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLmhscyAmJiB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcigpLCB0aGlzLnRpbWVyICYmIHRoaXMuc3RvcENhcHBpbmcoKSwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMuY2xpZW50UmVjdCA9IG51bGwsIHRoaXMuaGxzID0gdGhpcy5zdHJlYW1Db250cm9sbGVyID0gbnVsbDtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlLm9uKEkuRlBTX0RST1BfTEVWRUxfQ0FQUElORywgdGhpcy5vbkZwc0Ryb3BMZXZlbENhcHBpbmcsIHRoaXMpLCBlLm9uKEkuTUVESUFfQVRUQUNISU5HLCB0aGlzLm9uTWVkaWFBdHRhY2hpbmcsIHRoaXMpLCBlLm9uKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9uKEkuTEVWRUxTX1VQREFURUQsIHRoaXMub25MZXZlbHNVcGRhdGVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9DT0RFQ1MsIHRoaXMub25CdWZmZXJDb2RlY3MsIHRoaXMpLCBlLm9uKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlLm9mZihJLkZQU19EUk9QX0xFVkVMX0NBUFBJTkcsIHRoaXMub25GcHNEcm9wTGV2ZWxDYXBwaW5nLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9BVFRBQ0hJTkcsIHRoaXMub25NZWRpYUF0dGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9mZihJLkxFVkVMU19VUERBVEVELCB0aGlzLm9uTGV2ZWxzVXBkYXRlZCwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0NPREVDUywgdGhpcy5vbkJ1ZmZlckNvZGVjcywgdGhpcyksIGUub2ZmKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpO1xuICB9XG4gIG9uRnBzRHJvcExldmVsQ2FwcGluZyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLmxldmVsc1t0LmRyb3BwZWRMZXZlbF07XG4gICAgdGhpcy5pc0xldmVsQWxsb3dlZChyKSAmJiB0aGlzLnJlc3RyaWN0ZWRMZXZlbHMucHVzaCh7XG4gICAgICBiaXRyYXRlOiByLmJpdHJhdGUsXG4gICAgICBoZWlnaHQ6IHIuaGVpZ2h0LFxuICAgICAgd2lkdGg6IHIud2lkdGhcbiAgICB9KTtcbiAgfVxuICBvbk1lZGlhQXR0YWNoaW5nKGUsIHQpIHtcbiAgICB0aGlzLm1lZGlhID0gdC5tZWRpYSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgPyB0Lm1lZGlhIDogbnVsbCwgdGhpcy5jbGllbnRSZWN0ID0gbnVsbCwgdGhpcy50aW1lciAmJiB0aGlzLmhscy5sZXZlbHMubGVuZ3RoICYmIHRoaXMuZGV0ZWN0UGxheWVyU2l6ZSgpO1xuICB9XG4gIG9uTWFuaWZlc3RQYXJzZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmhscztcbiAgICB0aGlzLnJlc3RyaWN0ZWRMZXZlbHMgPSBbXSwgdGhpcy5maXJzdExldmVsID0gdC5maXJzdExldmVsLCByLmNvbmZpZy5jYXBMZXZlbFRvUGxheWVyU2l6ZSAmJiB0LnZpZGVvICYmIHRoaXMuc3RhcnRDYXBwaW5nKCk7XG4gIH1cbiAgb25MZXZlbHNVcGRhdGVkKGUsIHQpIHtcbiAgICB0aGlzLnRpbWVyICYmIHVlKHRoaXMuYXV0b0xldmVsQ2FwcGluZykgJiYgdGhpcy5kZXRlY3RQbGF5ZXJTaXplKCk7XG4gIH1cbiAgLy8gT25seSBhY3RpdmF0ZSBjYXBwaW5nIHdoZW4gcGxheWluZyBhIHZpZGVvIHN0cmVhbTsgb3RoZXJ3aXNlLCBtdWx0aS1iaXRyYXRlIGF1ZGlvLW9ubHkgc3RyZWFtcyB3aWxsIGJlIHJlc3RyaWN0ZWRcbiAgLy8gdG8gdGhlIGZpcnN0IGxldmVsXG4gIG9uQnVmZmVyQ29kZWNzKGUsIHQpIHtcbiAgICB0aGlzLmhscy5jb25maWcuY2FwTGV2ZWxUb1BsYXllclNpemUgJiYgdC52aWRlbyAmJiB0aGlzLnN0YXJ0Q2FwcGluZygpO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoKSB7XG4gICAgdGhpcy5zdG9wQ2FwcGluZygpLCB0aGlzLm1lZGlhID0gbnVsbDtcbiAgfVxuICBkZXRlY3RQbGF5ZXJTaXplKCkge1xuICAgIGlmICh0aGlzLm1lZGlhKSB7XG4gICAgICBpZiAodGhpcy5tZWRpYUhlaWdodCA8PSAwIHx8IHRoaXMubWVkaWFXaWR0aCA8PSAwKSB7XG4gICAgICAgIHRoaXMuY2xpZW50UmVjdCA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGUgPSB0aGlzLmhscy5sZXZlbHM7XG4gICAgICBpZiAoZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuaGxzLCByID0gdGhpcy5nZXRNYXhMZXZlbChlLmxlbmd0aCAtIDEpO1xuICAgICAgICByICE9PSB0aGlzLmF1dG9MZXZlbENhcHBpbmcgJiYgdC5sb2dnZXIubG9nKGBTZXR0aW5nIGF1dG9MZXZlbENhcHBpbmcgdG8gJHtyfTogJHtlW3JdLmhlaWdodH1wQCR7ZVtyXS5iaXRyYXRlfSBmb3IgbWVkaWEgJHt0aGlzLm1lZGlhV2lkdGh9eCR7dGhpcy5tZWRpYUhlaWdodH1gKSwgdC5hdXRvTGV2ZWxDYXBwaW5nID0gciwgdC5hdXRvTGV2ZWxFbmFibGVkICYmIHQuYXV0b0xldmVsQ2FwcGluZyA+IHRoaXMuYXV0b0xldmVsQ2FwcGluZyAmJiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgJiYgdGhpcy5zdHJlYW1Db250cm9sbGVyLm5leHRMZXZlbFN3aXRjaCgpLCB0aGlzLmF1dG9MZXZlbENhcHBpbmcgPSB0LmF1dG9MZXZlbENhcHBpbmc7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qXG4gICAqIHJldHVybnMgbGV2ZWwgc2hvdWxkIGJlIHRoZSBvbmUgd2l0aCB0aGUgZGltZW5zaW9ucyBlcXVhbCBvciBncmVhdGVyIHRoYW4gdGhlIG1lZGlhIChwbGF5ZXIpIGRpbWVuc2lvbnMgKHNvIHRoZSB2aWRlbyB3aWxsIGJlIGRvd25zY2FsZWQpXG4gICAqL1xuICBnZXRNYXhMZXZlbChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuaGxzLmxldmVscztcbiAgICBpZiAoIXQubGVuZ3RoKVxuICAgICAgcmV0dXJuIC0xO1xuICAgIGNvbnN0IHIgPSB0LmZpbHRlcigobiwgaSkgPT4gdGhpcy5pc0xldmVsQWxsb3dlZChuKSAmJiBpIDw9IGUpO1xuICAgIHJldHVybiB0aGlzLmNsaWVudFJlY3QgPSBudWxsLCBEdS5nZXRNYXhMZXZlbEJ5TWVkaWFTaXplKHIsIHRoaXMubWVkaWFXaWR0aCwgdGhpcy5tZWRpYUhlaWdodCk7XG4gIH1cbiAgc3RhcnRDYXBwaW5nKCkge1xuICAgIHRoaXMudGltZXIgfHwgKHRoaXMuYXV0b0xldmVsQ2FwcGluZyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgc2VsZi5jbGVhckludGVydmFsKHRoaXMudGltZXIpLCB0aGlzLnRpbWVyID0gc2VsZi5zZXRJbnRlcnZhbCh0aGlzLmRldGVjdFBsYXllclNpemUuYmluZCh0aGlzKSwgMWUzKSwgdGhpcy5kZXRlY3RQbGF5ZXJTaXplKCkpO1xuICB9XG4gIHN0b3BDYXBwaW5nKCkge1xuICAgIHRoaXMucmVzdHJpY3RlZExldmVscyA9IFtdLCB0aGlzLmZpcnN0TGV2ZWwgPSAtMSwgdGhpcy5hdXRvTGV2ZWxDYXBwaW5nID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCB0aGlzLnRpbWVyICYmIChzZWxmLmNsZWFySW50ZXJ2YWwodGhpcy50aW1lciksIHRoaXMudGltZXIgPSB2b2lkIDApO1xuICB9XG4gIGdldERpbWVuc2lvbnMoKSB7XG4gICAgaWYgKHRoaXMuY2xpZW50UmVjdClcbiAgICAgIHJldHVybiB0aGlzLmNsaWVudFJlY3Q7XG4gICAgY29uc3QgZSA9IHRoaXMubWVkaWEsIHQgPSB7XG4gICAgICB3aWR0aDogMCxcbiAgICAgIGhlaWdodDogMFxuICAgIH07XG4gICAgaWYgKGUpIHtcbiAgICAgIGNvbnN0IHIgPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdC53aWR0aCA9IHIud2lkdGgsIHQuaGVpZ2h0ID0gci5oZWlnaHQsICF0LndpZHRoICYmICF0LmhlaWdodCAmJiAodC53aWR0aCA9IHIucmlnaHQgLSByLmxlZnQgfHwgZS53aWR0aCB8fCAwLCB0LmhlaWdodCA9IHIuYm90dG9tIC0gci50b3AgfHwgZS5oZWlnaHQgfHwgMCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsaWVudFJlY3QgPSB0LCB0O1xuICB9XG4gIGdldCBtZWRpYVdpZHRoKCkge1xuICAgIHJldHVybiB0aGlzLmdldERpbWVuc2lvbnMoKS53aWR0aCAqIHRoaXMuY29udGVudFNjYWxlRmFjdG9yO1xuICB9XG4gIGdldCBtZWRpYUhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCkuaGVpZ2h0ICogdGhpcy5jb250ZW50U2NhbGVGYWN0b3I7XG4gIH1cbiAgZ2V0IGNvbnRlbnRTY2FsZUZhY3RvcigpIHtcbiAgICBsZXQgZSA9IDE7XG4gICAgaWYgKCF0aGlzLmhscy5jb25maWcuaWdub3JlRGV2aWNlUGl4ZWxSYXRpbylcbiAgICAgIHRyeSB7XG4gICAgICAgIGUgPSBzZWxmLmRldmljZVBpeGVsUmF0aW87XG4gICAgICB9IGNhdGNoIHtcbiAgICAgIH1cbiAgICByZXR1cm4gTWF0aC5taW4oZSwgdGhpcy5obHMuY29uZmlnLm1heERldmljZVBpeGVsUmF0aW8pO1xuICB9XG4gIGlzTGV2ZWxBbGxvd2VkKGUpIHtcbiAgICByZXR1cm4gIXRoaXMucmVzdHJpY3RlZExldmVscy5zb21lKChyKSA9PiBlLmJpdHJhdGUgPT09IHIuYml0cmF0ZSAmJiBlLndpZHRoID09PSByLndpZHRoICYmIGUuaGVpZ2h0ID09PSByLmhlaWdodCk7XG4gIH1cbiAgc3RhdGljIGdldE1heExldmVsQnlNZWRpYVNpemUoZSwgdCwgcikge1xuICAgIGlmICghKGUgIT0gbnVsbCAmJiBlLmxlbmd0aCkpXG4gICAgICByZXR1cm4gLTE7XG4gICAgY29uc3QgbiA9IChhLCBsKSA9PiBsID8gYS53aWR0aCAhPT0gbC53aWR0aCB8fCBhLmhlaWdodCAhPT0gbC5oZWlnaHQgOiAhMDtcbiAgICBsZXQgaSA9IGUubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBvID0gTWF0aC5tYXgodCwgcik7XG4gICAgZm9yIChsZXQgYSA9IDA7IGEgPCBlLmxlbmd0aDsgYSArPSAxKSB7XG4gICAgICBjb25zdCBsID0gZVthXTtcbiAgICAgIGlmICgobC53aWR0aCA+PSBvIHx8IGwuaGVpZ2h0ID49IG8pICYmIG4obCwgZVthICsgMV0pKSB7XG4gICAgICAgIGkgPSBhO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGk7XG4gIH1cbn1cbmNvbnN0IHUyID0ge1xuICAvKipcbiAgICogdGV4dCBmaWxlLCBzdWNoIGFzIGEgbWFuaWZlc3Qgb3IgcGxheWxpc3RcbiAgICovXG4gIE1BTklGRVNUOiBcIm1cIixcbiAgLyoqXG4gICAqIGF1ZGlvIG9ubHlcbiAgICovXG4gIEFVRElPOiBcImFcIixcbiAgLyoqXG4gICAqIHZpZGVvIG9ubHlcbiAgICovXG4gIFZJREVPOiBcInZcIixcbiAgLyoqXG4gICAqIG11eGVkIGF1ZGlvIGFuZCB2aWRlb1xuICAgKi9cbiAgTVVYRUQ6IFwiYXZcIixcbiAgLyoqXG4gICAqIGluaXQgc2VnbWVudFxuICAgKi9cbiAgSU5JVDogXCJpXCIsXG4gIC8qKlxuICAgKiBjYXB0aW9uIG9yIHN1YnRpdGxlXG4gICAqL1xuICBDQVBUSU9OOiBcImNcIixcbiAgLyoqXG4gICAqIElTT0JNRkYgdGltZWQgdGV4dCB0cmFja1xuICAgKi9cbiAgVElNRURfVEVYVDogXCJ0dFwiLFxuICAvKipcbiAgICogY3J5cHRvZ3JhcGhpYyBrZXksIGxpY2Vuc2Ugb3IgY2VydGlmaWNhdGUuXG4gICAqL1xuICBLRVk6IFwia1wiLFxuICAvKipcbiAgICogb3RoZXJcbiAgICovXG4gIE9USEVSOiBcIm9cIlxufSwgaHIgPSB1MiwgZDIgPSB7XG4gIC8qKlxuICAgKiBIVFRQIExpdmUgU3RyZWFtaW5nIChITFMpXG4gICAqL1xuICBITFM6IFwiaFwiXG59LCBoMiA9IGQyO1xuY2xhc3MgSnIge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgQXJyYXkuaXNBcnJheShlKSAmJiAoZSA9IGUubWFwKChyKSA9PiByIGluc3RhbmNlb2YgSnIgPyByIDogbmV3IEpyKHIpKSksIHRoaXMudmFsdWUgPSBlLCB0aGlzLnBhcmFtcyA9IHQ7XG4gIH1cbn1cbmNvbnN0IGYyID0gXCJEaWN0XCI7XG5mdW5jdGlvbiBnMihzKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHMpID8gSlNPTi5zdHJpbmdpZnkocykgOiBzIGluc3RhbmNlb2YgTWFwID8gXCJNYXB7fVwiIDogcyBpbnN0YW5jZW9mIFNldCA/IFwiU2V0e31cIiA6IHR5cGVvZiBzID09IFwib2JqZWN0XCIgPyBKU09OLnN0cmluZ2lmeShzKSA6IFN0cmluZyhzKTtcbn1cbmZ1bmN0aW9uIHAyKHMsIGUsIHQsIHIpIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihgZmFpbGVkIHRvICR7c30gXCIke2cyKGUpfVwiIGFzICR7dH1gLCB7XG4gICAgY2F1c2U6IHJcbiAgfSk7XG59XG5mdW5jdGlvbiBRcihzLCBlLCB0KSB7XG4gIHJldHVybiBwMihcInNlcmlhbGl6ZVwiLCBzLCBlLCB0KTtcbn1cbmNsYXNzIF9wIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuZGVzY3JpcHRpb24gPSBlO1xuICB9XG59XG5jb25zdCBxaCA9IFwiQmFyZSBJdGVtXCIsIG0yID0gXCJCb29sZWFuXCI7XG5mdW5jdGlvbiB5MihzKSB7XG4gIGlmICh0eXBlb2YgcyAhPSBcImJvb2xlYW5cIilcbiAgICB0aHJvdyBRcihzLCBtMik7XG4gIHJldHVybiBzID8gXCI/MVwiIDogXCI/MFwiO1xufVxuZnVuY3Rpb24gdjIocykge1xuICByZXR1cm4gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLnMpKTtcbn1cbmNvbnN0IEUyID0gXCJCeXRlIFNlcXVlbmNlXCI7XG5mdW5jdGlvbiB4MihzKSB7XG4gIGlmIChBcnJheUJ1ZmZlci5pc1ZpZXcocykgPT09ICExKVxuICAgIHRocm93IFFyKHMsIEUyKTtcbiAgcmV0dXJuIGA6JHt2MihzKX06YDtcbn1cbmNvbnN0IFMyID0gXCJJbnRlZ2VyXCI7XG5mdW5jdGlvbiBiMihzKSB7XG4gIHJldHVybiBzIDwgLTk5OTk5OTk5OTk5OTk5OSB8fCA5OTk5OTk5OTk5OTk5OTkgPCBzO1xufVxuZnVuY3Rpb24gUnAocykge1xuICBpZiAoYjIocykpXG4gICAgdGhyb3cgUXIocywgUzIpO1xuICByZXR1cm4gcy50b1N0cmluZygpO1xufVxuZnVuY3Rpb24gVDIocykge1xuICByZXR1cm4gYEAke1JwKHMuZ2V0VGltZSgpIC8gMWUzKX1gO1xufVxuZnVuY3Rpb24gTHAocywgZSkge1xuICBpZiAocyA8IDApXG4gICAgcmV0dXJuIC1McCgtcywgZSk7XG4gIGNvbnN0IHQgPSBNYXRoLnBvdygxMCwgZSk7XG4gIGlmIChNYXRoLmFicyhzICogdCAlIDEgLSAwLjUpIDwgTnVtYmVyLkVQU0lMT04pIHtcbiAgICBjb25zdCBuID0gTWF0aC5mbG9vcihzICogdCk7XG4gICAgcmV0dXJuIChuICUgMiA9PT0gMCA/IG4gOiBuICsgMSkgLyB0O1xuICB9IGVsc2VcbiAgICByZXR1cm4gTWF0aC5yb3VuZChzICogdCkgLyB0O1xufVxuY29uc3QgdzIgPSBcIkRlY2ltYWxcIjtcbmZ1bmN0aW9uIEEyKHMpIHtcbiAgY29uc3QgZSA9IExwKHMsIDMpO1xuICBpZiAoTWF0aC5mbG9vcihNYXRoLmFicyhlKSkudG9TdHJpbmcoKS5sZW5ndGggPiAxMilcbiAgICB0aHJvdyBRcihzLCB3Mik7XG4gIGNvbnN0IHQgPSBlLnRvU3RyaW5nKCk7XG4gIHJldHVybiB0LmluY2x1ZGVzKFwiLlwiKSA/IHQgOiBgJHt0fS4wYDtcbn1cbmNvbnN0IEkyID0gXCJTdHJpbmdcIiwgXzIgPSAvW1xceDAwLVxceDFmXFx4N2ZdKy87XG5mdW5jdGlvbiBSMihzKSB7XG4gIGlmIChfMi50ZXN0KHMpKVxuICAgIHRocm93IFFyKHMsIEkyKTtcbiAgcmV0dXJuIGBcIiR7cy5yZXBsYWNlKC9cXFxcL2csIFwiXFxcXFxcXFxcIikucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiYDtcbn1cbmZ1bmN0aW9uIEwyKHMpIHtcbiAgcmV0dXJuIHMuZGVzY3JpcHRpb24gfHwgcy50b1N0cmluZygpLnNsaWNlKDcsIC0xKTtcbn1cbmNvbnN0IEMyID0gXCJUb2tlblwiO1xuZnVuY3Rpb24gV2gocykge1xuICBjb25zdCBlID0gTDIocyk7XG4gIGlmICgvXihbYS16QS1aKl0pKFshIyQlJicqK1xcLS5eX2B8flxcdzovXSopJC8udGVzdChlKSA9PT0gITEpXG4gICAgdGhyb3cgUXIoZSwgQzIpO1xuICByZXR1cm4gZTtcbn1cbmZ1bmN0aW9uIHZjKHMpIHtcbiAgc3dpdGNoICh0eXBlb2Ygcykge1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGlmICghdWUocykpXG4gICAgICAgIHRocm93IFFyKHMsIHFoKTtcbiAgICAgIHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHMpID8gUnAocykgOiBBMihzKTtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gUjIocyk7XG4gICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgcmV0dXJuIFdoKHMpO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4geTIocyk7XG4gICAgY2FzZSBcIm9iamVjdFwiOlxuICAgICAgaWYgKHMgaW5zdGFuY2VvZiBEYXRlKVxuICAgICAgICByZXR1cm4gVDIocyk7XG4gICAgICBpZiAocyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpXG4gICAgICAgIHJldHVybiB4MihzKTtcbiAgICAgIGlmIChzIGluc3RhbmNlb2YgX3ApXG4gICAgICAgIHJldHVybiBXaChzKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgUXIocywgcWgpO1xuICB9XG59XG5jb25zdCBrMiA9IFwiS2V5XCI7XG5mdW5jdGlvbiBFYyhzKSB7XG4gIGlmICgvXlthLXoqXVthLXowLTlcXC1fLipdKiQvLnRlc3QocykgPT09ICExKVxuICAgIHRocm93IFFyKHMsIGsyKTtcbiAgcmV0dXJuIHM7XG59XG5mdW5jdGlvbiBQdShzKSB7XG4gIHJldHVybiBzID09IG51bGwgPyBcIlwiIDogT2JqZWN0LmVudHJpZXMocykubWFwKChbZSwgdF0pID0+IHQgPT09ICEwID8gYDske0VjKGUpfWAgOiBgOyR7RWMoZSl9PSR7dmModCl9YCkuam9pbihcIlwiKTtcbn1cbmZ1bmN0aW9uIENwKHMpIHtcbiAgcmV0dXJuIHMgaW5zdGFuY2VvZiBKciA/IGAke3ZjKHMudmFsdWUpfSR7UHUocy5wYXJhbXMpfWAgOiB2YyhzKTtcbn1cbmZ1bmN0aW9uIEQyKHMpIHtcbiAgcmV0dXJuIGAoJHtzLnZhbHVlLm1hcChDcCkuam9pbihcIiBcIil9KSR7UHUocy5wYXJhbXMpfWA7XG59XG5mdW5jdGlvbiBQMihzLCBlID0ge1xuICB3aGl0ZXNwYWNlOiAhMFxufSkge1xuICBpZiAodHlwZW9mIHMgIT0gXCJvYmplY3RcIiB8fCBzID09IG51bGwpXG4gICAgdGhyb3cgUXIocywgZjIpO1xuICBjb25zdCB0ID0gcyBpbnN0YW5jZW9mIE1hcCA/IHMuZW50cmllcygpIDogT2JqZWN0LmVudHJpZXMocyksIHIgPSBlICE9IG51bGwgJiYgZS53aGl0ZXNwYWNlID8gXCIgXCIgOiBcIlwiO1xuICByZXR1cm4gQXJyYXkuZnJvbSh0KS5tYXAoKFtuLCBpXSkgPT4ge1xuICAgIGkgaW5zdGFuY2VvZiBKciB8fCAoaSA9IG5ldyBKcihpKSk7XG4gICAgbGV0IG8gPSBFYyhuKTtcbiAgICByZXR1cm4gaS52YWx1ZSA9PT0gITAgPyBvICs9IFB1KGkucGFyYW1zKSA6IChvICs9IFwiPVwiLCBBcnJheS5pc0FycmF5KGkudmFsdWUpID8gbyArPSBEMihpKSA6IG8gKz0gQ3AoaSkpLCBvO1xuICB9KS5qb2luKGAsJHtyfWApO1xufVxuZnVuY3Rpb24ga3AocywgZSkge1xuICByZXR1cm4gUDIocywgZSk7XG59XG5jb25zdCAkciA9IFwiQ01DRC1PYmplY3RcIiwgeXQgPSBcIkNNQ0QtUmVxdWVzdFwiLCBGcyA9IFwiQ01DRC1TZXNzaW9uXCIsIGJzID0gXCJDTUNELVN0YXR1c1wiLCBNMiA9IHtcbiAgLy8gT2JqZWN0XG4gIGJyOiAkcixcbiAgYWI6ICRyLFxuICBkOiAkcixcbiAgb3Q6ICRyLFxuICB0YjogJHIsXG4gIHRwYjogJHIsXG4gIGxiOiAkcixcbiAgdGFiOiAkcixcbiAgbGFiOiAkcixcbiAgdXJsOiAkcixcbiAgLy8gUmVxdWVzdFxuICBwYjogeXQsXG4gIGJsOiB5dCxcbiAgdGJsOiB5dCxcbiAgZGw6IHl0LFxuICBsdGM6IHl0LFxuICBtdHA6IHl0LFxuICBub3I6IHl0LFxuICBucnI6IHl0LFxuICByYzogeXQsXG4gIHNuOiB5dCxcbiAgc3RhOiB5dCxcbiAgc3U6IHl0LFxuICB0dGZiOiB5dCxcbiAgdHRmYmI6IHl0LFxuICB0dGxiOiB5dCxcbiAgY21zZGQ6IHl0LFxuICBjbXNkczogeXQsXG4gIHNtcnQ6IHl0LFxuICBkZjogeXQsXG4gIGNzOiB5dCxcbiAgLy8gVE9ETzogV2hpY2ggaGVhZGVyIHRvIHB1dCB0aGUgYHRzYCBmaWVsZCBpcyBub3QgZGVmaW5lZCB5ZXQuXG4gIHRzOiB5dCxcbiAgLy8gU2Vzc2lvblxuICBjaWQ6IEZzLFxuICBwcjogRnMsXG4gIHNmOiBGcyxcbiAgc2lkOiBGcyxcbiAgc3Q6IEZzLFxuICB2OiBGcyxcbiAgbXNkOiBGcyxcbiAgLy8gU3RhdHVzXG4gIGJzLFxuICBic2Q6IGJzLFxuICBjZG46IGJzLFxuICBydHA6IGJzLFxuICBiZzogYnMsXG4gIHB0OiBicyxcbiAgZWM6IGJzLFxuICBlOiBic1xufSwgTzIgPSB7XG4gIC8qKlxuICAgKiBrZXlzIHdob3NlIHZhbHVlcyB2YXJ5IHdpdGggZWFjaCByZXF1ZXN0LlxuICAgKi9cbiAgUkVRVUVTVDogeXRcbn07XG5mdW5jdGlvbiBCMihzKSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhzKS5yZWR1Y2UoKGUsIHQpID0+IHtcbiAgICB2YXIgcjtcbiAgICByZXR1cm4gKHIgPSBzW3RdKSA9PT0gbnVsbCB8fCByID09PSB2b2lkIDAgfHwgci5mb3JFYWNoKChuKSA9PiBlW25dID0gdCksIGU7XG4gIH0sIHt9KTtcbn1cbmZ1bmN0aW9uIEYyKHMsIGUpIHtcbiAgY29uc3QgdCA9IHt9O1xuICBpZiAoIXMpXG4gICAgcmV0dXJuIHQ7XG4gIGNvbnN0IHIgPSBPYmplY3Qua2V5cyhzKSwgbiA9IGUgPyBCMihlKSA6IHt9O1xuICByZXR1cm4gci5yZWR1Y2UoKGksIG8pID0+IHtcbiAgICB2YXIgYTtcbiAgICBjb25zdCBsID0gTTJbb10gfHwgbltvXSB8fCBPMi5SRVFVRVNULCBjID0gKGEgPSBpW2xdKSAhPT0gbnVsbCAmJiBhICE9PSB2b2lkIDAgPyBhIDogaVtsXSA9IHt9O1xuICAgIHJldHVybiBjW29dID0gc1tvXSwgaTtcbiAgfSwgdCk7XG59XG5mdW5jdGlvbiBOMihzKSB7XG4gIHJldHVybiBbXCJvdFwiLCBcInNmXCIsIFwic3RcIiwgXCJlXCIsIFwic3RhXCJdLmluY2x1ZGVzKHMpO1xufVxuZnVuY3Rpb24gVTIocykge1xuICByZXR1cm4gdHlwZW9mIHMgPT0gXCJudW1iZXJcIiA/IHVlKHMpIDogcyAhPSBudWxsICYmIHMgIT09IFwiXCIgJiYgcyAhPT0gITE7XG59XG5jb25zdCBEcCA9IFwiZXZlbnRcIjtcbmZ1bmN0aW9uICQyKHMsIGUpIHtcbiAgY29uc3QgdCA9IG5ldyBVUkwocyksIHIgPSBuZXcgVVJMKGUpO1xuICBpZiAodC5vcmlnaW4gIT09IHIub3JpZ2luKVxuICAgIHJldHVybiBzO1xuICBjb25zdCBuID0gdC5wYXRobmFtZS5zcGxpdChcIi9cIikuc2xpY2UoMSksIGkgPSByLnBhdGhuYW1lLnNwbGl0KFwiL1wiKS5zbGljZSgxLCAtMSk7XG4gIGZvciAoOyBuWzBdID09PSBpWzBdOyApXG4gICAgbi5zaGlmdCgpLCBpLnNoaWZ0KCk7XG4gIGZvciAoOyBpLmxlbmd0aDsgKVxuICAgIGkuc2hpZnQoKSwgbi51bnNoaWZ0KFwiLi5cIik7XG4gIHJldHVybiBuLmpvaW4oXCIvXCIpICsgdC5zZWFyY2ggKyB0Lmhhc2g7XG59XG5jb25zdCB2byA9IChzKSA9PiBNYXRoLnJvdW5kKHMpLCB4YyA9IChzLCBlKSA9PiBBcnJheS5pc0FycmF5KHMpID8gcy5tYXAoKHQpID0+IHhjKHQsIGUpKSA6IHMgaW5zdGFuY2VvZiBKciAmJiB0eXBlb2Ygcy52YWx1ZSA9PSBcInN0cmluZ1wiID8gbmV3IEpyKHhjKHMudmFsdWUsIGUpLCBzLnBhcmFtcykgOiAoZS5iYXNlVXJsICYmIChzID0gJDIocywgZS5iYXNlVXJsKSksIGUudmVyc2lvbiA9PT0gMSA/IGVuY29kZVVSSUNvbXBvbmVudChzKSA6IHMpLCBYaSA9IChzKSA9PiB2byhzIC8gMTAwKSAqIDEwMCwgRzIgPSAocywgZSkgPT4ge1xuICBsZXQgdCA9IHM7XG4gIHJldHVybiBlLnZlcnNpb24gPj0gMiAmJiAocyBpbnN0YW5jZW9mIEpyICYmIHR5cGVvZiBzLnZhbHVlID09IFwic3RyaW5nXCIgPyB0ID0gbmV3IEpyKFtzXSkgOiB0eXBlb2YgcyA9PSBcInN0cmluZ1wiICYmICh0ID0gW3NdKSksIHhjKHQsIGUpO1xufSwgVjIgPSB7XG4gIC8qKlxuICAgKiBCaXRyYXRlIChrYnBzKSByb3VuZGVkIGludGVnZXJcbiAgICovXG4gIGJyOiB2byxcbiAgLyoqXG4gICAqIER1cmF0aW9uIChtaWxsaXNlY29uZHMpIHJvdW5kZWQgaW50ZWdlclxuICAgKi9cbiAgZDogdm8sXG4gIC8qKlxuICAgKiBCdWZmZXIgTGVuZ3RoIChtaWxsaXNlY29uZHMpIHJvdW5kZWQgbmVhcmVzdCAxMDBtc1xuICAgKi9cbiAgYmw6IFhpLFxuICAvKipcbiAgICogRGVhZGxpbmUgKG1pbGxpc2Vjb25kcykgcm91bmRlZCBuZWFyZXN0IDEwMG1zXG4gICAqL1xuICBkbDogWGksXG4gIC8qKlxuICAgKiBNZWFzdXJlZCBUaHJvdWdocHV0IChrYnBzKSByb3VuZGVkIG5lYXJlc3QgMTAwa2Jwc1xuICAgKi9cbiAgbXRwOiBYaSxcbiAgLyoqXG4gICAqIE5leHQgT2JqZWN0IFJlcXVlc3QgVVJMIGVuY29kZWRcbiAgICovXG4gIG5vcjogRzIsXG4gIC8qKlxuICAgKiBSZXF1ZXN0ZWQgbWF4aW11bSB0aHJvdWdocHV0IChrYnBzKSByb3VuZGVkIG5lYXJlc3QgMTAwa2Jwc1xuICAgKi9cbiAgcnRwOiBYaSxcbiAgLyoqXG4gICAqIFRvcCBCaXRyYXRlIChrYnBzKSByb3VuZGVkIGludGVnZXJcbiAgICovXG4gIHRiOiB2b1xufSwgUHAgPSBcInJlcXVlc3RcIiwgTXAgPSBcInJlc3BvbnNlXCIsIE11ID0gW1wiYWJcIiwgXCJiZ1wiLCBcImJsXCIsIFwiYnJcIiwgXCJic1wiLCBcImJzZFwiLCBcImNkblwiLCBcImNpZFwiLCBcImNzXCIsIFwiZGZcIiwgXCJlY1wiLCBcImxhYlwiLCBcImxiXCIsIFwibHRjXCIsIFwibXNkXCIsIFwibXRwXCIsIFwicGJcIiwgXCJwclwiLCBcInB0XCIsIFwic2ZcIiwgXCJzaWRcIiwgXCJzblwiLCBcInN0XCIsIFwic3RhXCIsIFwidGFiXCIsIFwidGJcIiwgXCJ0YmxcIiwgXCJ0cGJcIiwgXCJ0c1wiLCBcInZcIl0sIGoyID0gW1wiZVwiXSwgSzIgPSAvXlthLXpBLVowLTktLl0rLVthLXpBLVowLTktLl0rJC87XG5mdW5jdGlvbiBFYShzKSB7XG4gIHJldHVybiBLMi50ZXN0KHMpO1xufVxuZnVuY3Rpb24gSDIocykge1xuICByZXR1cm4gTXUuaW5jbHVkZXMocykgfHwgajIuaW5jbHVkZXMocykgfHwgRWEocyk7XG59XG5jb25zdCBPcCA9IFtcImRcIiwgXCJkbFwiLCBcIm5vclwiLCBcIm90XCIsIFwicnRwXCIsIFwic3VcIl07XG5mdW5jdGlvbiBxMihzKSB7XG4gIHJldHVybiBNdS5pbmNsdWRlcyhzKSB8fCBPcC5pbmNsdWRlcyhzKSB8fCBFYShzKTtcbn1cbmNvbnN0IFcyID0gW1wiY21zZGRcIiwgXCJjbXNkc1wiLCBcInJjXCIsIFwic21ydFwiLCBcInR0ZmJcIiwgXCJ0dGZiYlwiLCBcInR0bGJcIiwgXCJ1cmxcIl07XG5mdW5jdGlvbiB6MihzKSB7XG4gIHJldHVybiBNdS5pbmNsdWRlcyhzKSB8fCBPcC5pbmNsdWRlcyhzKSB8fCBXMi5pbmNsdWRlcyhzKSB8fCBFYShzKTtcbn1cbmNvbnN0IFkyID0gW1wiYmxcIiwgXCJiclwiLCBcImJzXCIsIFwiY2lkXCIsIFwiZFwiLCBcImRsXCIsIFwibXRwXCIsIFwibm9yXCIsIFwibnJyXCIsIFwib3RcIiwgXCJwclwiLCBcInJ0cFwiLCBcInNmXCIsIFwic2lkXCIsIFwic3RcIiwgXCJzdVwiLCBcInRiXCIsIFwidlwiXTtcbmZ1bmN0aW9uIFoyKHMpIHtcbiAgcmV0dXJuIFkyLmluY2x1ZGVzKHMpIHx8IEVhKHMpO1xufVxuY29uc3QgWDIgPSB7XG4gIFtNcF06IHoyLFxuICBbRHBdOiBIMixcbiAgW1BwXTogcTJcbn07XG5mdW5jdGlvbiBCcChzLCBlID0ge30pIHtcbiAgY29uc3QgdCA9IHt9O1xuICBpZiAocyA9PSBudWxsIHx8IHR5cGVvZiBzICE9IFwib2JqZWN0XCIpXG4gICAgcmV0dXJuIHQ7XG4gIGNvbnN0IHIgPSBlLnZlcnNpb24gfHwgcy52IHx8IDEsIG4gPSBlLnJlcG9ydGluZ01vZGUgfHwgUHAsIGkgPSByID09PSAxID8gWjIgOiBYMltuXTtcbiAgbGV0IG8gPSBPYmplY3Qua2V5cyhzKS5maWx0ZXIoaSk7XG4gIGNvbnN0IGEgPSBlLmZpbHRlcjtcbiAgdHlwZW9mIGEgPT0gXCJmdW5jdGlvblwiICYmIChvID0gby5maWx0ZXIoYSkpO1xuICBjb25zdCBsID0gbiA9PT0gTXAgfHwgbiA9PT0gRHA7XG4gIGwgJiYgIW8uaW5jbHVkZXMoXCJ0c1wiKSAmJiBvLnB1c2goXCJ0c1wiKSwgciA+IDEgJiYgIW8uaW5jbHVkZXMoXCJ2XCIpICYmIG8ucHVzaChcInZcIik7XG4gIGNvbnN0IGMgPSBudCh7fSwgVjIsIGUuZm9ybWF0dGVycyksIHUgPSB7XG4gICAgdmVyc2lvbjogcixcbiAgICByZXBvcnRpbmdNb2RlOiBuLFxuICAgIGJhc2VVcmw6IGUuYmFzZVVybFxuICB9O1xuICByZXR1cm4gby5zb3J0KCkuZm9yRWFjaCgoZCkgPT4ge1xuICAgIGxldCBoID0gc1tkXTtcbiAgICBjb25zdCBmID0gY1tkXTtcbiAgICBpZiAodHlwZW9mIGYgPT0gXCJmdW5jdGlvblwiICYmIChoID0gZihoLCB1KSksIGQgPT09IFwidlwiKSB7XG4gICAgICBpZiAociA9PT0gMSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaCA9IHI7XG4gICAgfVxuICAgIGQgPT0gXCJwclwiICYmIGggPT09IDEgfHwgKGwgJiYgZCA9PT0gXCJ0c1wiICYmICF1ZShoKSAmJiAoaCA9IERhdGUubm93KCkpLCBVMihoKSAmJiAoTjIoZCkgJiYgdHlwZW9mIGggPT0gXCJzdHJpbmdcIiAmJiAoaCA9IG5ldyBfcChoKSksIHRbZF0gPSBoKSk7XG4gIH0pLCB0O1xufVxuZnVuY3Rpb24gSjIocywgZSA9IHt9KSB7XG4gIGNvbnN0IHQgPSB7fTtcbiAgaWYgKCFzKVxuICAgIHJldHVybiB0O1xuICBjb25zdCByID0gQnAocywgZSksIG4gPSBGMihyLCBlID09IG51bGwgPyB2b2lkIDAgOiBlLmN1c3RvbUhlYWRlck1hcCk7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhuKS5yZWR1Y2UoKGksIFtvLCBhXSkgPT4ge1xuICAgIGNvbnN0IGwgPSBrcChhLCB7XG4gICAgICB3aGl0ZXNwYWNlOiAhMVxuICAgIH0pO1xuICAgIHJldHVybiBsICYmIChpW29dID0gbCksIGk7XG4gIH0sIHQpO1xufVxuZnVuY3Rpb24gUTIocywgZSwgdCkge1xuICByZXR1cm4gbnQocywgSjIoZSwgdCkpO1xufVxuY29uc3QgZXcgPSBcIkNNQ0RcIjtcbmZ1bmN0aW9uIHR3KHMsIGUgPSB7fSkge1xuICByZXR1cm4gcyA/IGtwKEJwKHMsIGUpLCB7XG4gICAgd2hpdGVzcGFjZTogITFcbiAgfSkgOiBcIlwiO1xufVxuZnVuY3Rpb24gcncocywgZSA9IHt9KSB7XG4gIGlmICghcylcbiAgICByZXR1cm4gXCJcIjtcbiAgY29uc3QgdCA9IHR3KHMsIGUpO1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHQpO1xufVxuZnVuY3Rpb24gc3cocywgZSA9IHt9KSB7XG4gIGlmICghcylcbiAgICByZXR1cm4gXCJcIjtcbiAgY29uc3QgdCA9IHJ3KHMsIGUpO1xuICByZXR1cm4gYCR7ZXd9PSR7dH1gO1xufVxuY29uc3QgemggPSAvQ01DRD1bXiYjXSsvO1xuZnVuY3Rpb24gbncocywgZSwgdCkge1xuICBjb25zdCByID0gc3coZSwgdCk7XG4gIGlmICghcilcbiAgICByZXR1cm4gcztcbiAgaWYgKHpoLnRlc3QocykpXG4gICAgcmV0dXJuIHMucmVwbGFjZSh6aCwgcik7XG4gIGNvbnN0IG4gPSBzLmluY2x1ZGVzKFwiP1wiKSA/IFwiJlwiIDogXCI/XCI7XG4gIHJldHVybiBgJHtzfSR7bn0ke3J9YDtcbn1cbmNsYXNzIGl3IHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmNvbmZpZyA9IHZvaWQgMCwgdGhpcy5tZWRpYSA9IHZvaWQgMCwgdGhpcy5zaWQgPSB2b2lkIDAsIHRoaXMuY2lkID0gdm9pZCAwLCB0aGlzLnVzZUhlYWRlcnMgPSAhMSwgdGhpcy5pbmNsdWRlS2V5cyA9IHZvaWQgMCwgdGhpcy5pbml0aWFsaXplZCA9ICExLCB0aGlzLnN0YXJ2ZWQgPSAhMSwgdGhpcy5idWZmZXJpbmcgPSAhMCwgdGhpcy5hdWRpb0J1ZmZlciA9IHZvaWQgMCwgdGhpcy52aWRlb0J1ZmZlciA9IHZvaWQgMCwgdGhpcy5vbldhaXRpbmcgPSAoKSA9PiB7XG4gICAgICB0aGlzLmluaXRpYWxpemVkICYmICh0aGlzLnN0YXJ2ZWQgPSAhMCksIHRoaXMuYnVmZmVyaW5nID0gITA7XG4gICAgfSwgdGhpcy5vblBsYXlpbmcgPSAoKSA9PiB7XG4gICAgICB0aGlzLmluaXRpYWxpemVkIHx8ICh0aGlzLmluaXRpYWxpemVkID0gITApLCB0aGlzLmJ1ZmZlcmluZyA9ICExO1xuICAgIH0sIHRoaXMuYXBwbHlQbGF5bGlzdERhdGEgPSAobikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5hcHBseShuLCB7XG4gICAgICAgICAgb3Q6IGhyLk1BTklGRVNULFxuICAgICAgICAgIHN1OiAhdGhpcy5pbml0aWFsaXplZFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGkpIHtcbiAgICAgICAgdGhpcy5obHMubG9nZ2VyLndhcm4oXCJDb3VsZCBub3QgZ2VuZXJhdGUgbWFuaWZlc3QgQ01DRCBkYXRhLlwiLCBpKTtcbiAgICAgIH1cbiAgICB9LCB0aGlzLmFwcGx5RnJhZ21lbnREYXRhID0gKG4pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBmcmFnOiBpLFxuICAgICAgICAgIHBhcnQ6IG9cbiAgICAgICAgfSA9IG4sIGEgPSB0aGlzLmhscy5sZXZlbHNbaS5sZXZlbF0sIGwgPSB0aGlzLmdldE9iamVjdFR5cGUoaSksIGMgPSB7XG4gICAgICAgICAgZDogKG8gfHwgaSkuZHVyYXRpb24gKiAxZTMsXG4gICAgICAgICAgb3Q6IGxcbiAgICAgICAgfTtcbiAgICAgICAgKGwgPT09IGhyLlZJREVPIHx8IGwgPT09IGhyLkFVRElPIHx8IGwgPT0gaHIuTVVYRUQpICYmIChjLmJyID0gYS5iaXRyYXRlIC8gMWUzLCBjLnRiID0gdGhpcy5nZXRUb3BCYW5kd2lkdGgobCkgLyAxZTMsIGMuYmwgPSB0aGlzLmdldEJ1ZmZlckxlbmd0aChsKSk7XG4gICAgICAgIGNvbnN0IHUgPSBvID8gdGhpcy5nZXROZXh0UGFydChvKSA6IHRoaXMuZ2V0TmV4dEZyYWcoaSk7XG4gICAgICAgIHUgIT0gbnVsbCAmJiB1LnVybCAmJiB1LnVybCAhPT0gaS51cmwgJiYgKGMubm9yID0gdS51cmwpLCB0aGlzLmFwcGx5KG4sIGMpO1xuICAgICAgfSBjYXRjaCAoaSkge1xuICAgICAgICB0aGlzLmhscy5sb2dnZXIud2FybihcIkNvdWxkIG5vdCBnZW5lcmF0ZSBzZWdtZW50IENNQ0QgZGF0YS5cIiwgaSk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5obHMgPSBlO1xuICAgIGNvbnN0IHQgPSB0aGlzLmNvbmZpZyA9IGUuY29uZmlnLCB7XG4gICAgICBjbWNkOiByXG4gICAgfSA9IHQ7XG4gICAgciAhPSBudWxsICYmICh0LnBMb2FkZXIgPSB0aGlzLmNyZWF0ZVBsYXlsaXN0TG9hZGVyKCksIHQuZkxvYWRlciA9IHRoaXMuY3JlYXRlRnJhZ21lbnRMb2FkZXIoKSwgdGhpcy5zaWQgPSByLnNlc3Npb25JZCB8fCBlLnNlc3Npb25JZCwgdGhpcy5jaWQgPSByLmNvbnRlbnRJZCwgdGhpcy51c2VIZWFkZXJzID0gci51c2VIZWFkZXJzID09PSAhMCwgdGhpcy5pbmNsdWRlS2V5cyA9IHIuaW5jbHVkZUtleXMsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKSk7XG4gIH1cbiAgcmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuaGxzO1xuICAgIGUub24oSS5NRURJQV9BVFRBQ0hFRCwgdGhpcy5vbk1lZGlhQXR0YWNoZWQsIHRoaXMpLCBlLm9uKEkuTUVESUFfREVUQUNIRUQsIHRoaXMub25NZWRpYURldGFjaGVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9DUkVBVEVELCB0aGlzLm9uQnVmZmVyQ3JlYXRlZCwgdGhpcyk7XG4gIH1cbiAgdW5yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHM7XG4gICAgZS5vZmYoSS5NRURJQV9BVFRBQ0hFRCwgdGhpcy5vbk1lZGlhQXR0YWNoZWQsIHRoaXMpLCBlLm9mZihJLk1FRElBX0RFVEFDSEVELCB0aGlzLm9uTWVkaWFEZXRhY2hlZCwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0NSRUFURUQsIHRoaXMub25CdWZmZXJDcmVhdGVkLCB0aGlzKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudW5yZWdpc3Rlckxpc3RlbmVycygpLCB0aGlzLm9uTWVkaWFEZXRhY2hlZCgpLCB0aGlzLmhscyA9IHRoaXMuY29uZmlnID0gdGhpcy5hdWRpb0J1ZmZlciA9IHRoaXMudmlkZW9CdWZmZXIgPSBudWxsLCB0aGlzLm9uV2FpdGluZyA9IHRoaXMub25QbGF5aW5nID0gdGhpcy5tZWRpYSA9IG51bGw7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGVkKGUsIHQpIHtcbiAgICB0aGlzLm1lZGlhID0gdC5tZWRpYSwgdGhpcy5tZWRpYS5hZGRFdmVudExpc3RlbmVyKFwid2FpdGluZ1wiLCB0aGlzLm9uV2FpdGluZyksIHRoaXMubWVkaWEuYWRkRXZlbnRMaXN0ZW5lcihcInBsYXlpbmdcIiwgdGhpcy5vblBsYXlpbmcpO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hlZCgpIHtcbiAgICB0aGlzLm1lZGlhICYmICh0aGlzLm1lZGlhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3YWl0aW5nXCIsIHRoaXMub25XYWl0aW5nKSwgdGhpcy5tZWRpYS5yZW1vdmVFdmVudExpc3RlbmVyKFwicGxheWluZ1wiLCB0aGlzLm9uUGxheWluZyksIHRoaXMubWVkaWEgPSBudWxsKTtcbiAgfVxuICBvbkJ1ZmZlckNyZWF0ZWQoZSwgdCkge1xuICAgIHZhciByLCBuO1xuICAgIHRoaXMuYXVkaW9CdWZmZXIgPSAociA9IHQudHJhY2tzLmF1ZGlvKSA9PSBudWxsID8gdm9pZCAwIDogci5idWZmZXIsIHRoaXMudmlkZW9CdWZmZXIgPSAobiA9IHQudHJhY2tzLnZpZGVvKSA9PSBudWxsID8gdm9pZCAwIDogbi5idWZmZXI7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBiYXNlbGluZSBDTUNEIGRhdGFcbiAgICovXG4gIGNyZWF0ZURhdGEoKSB7XG4gICAgdmFyIGU7XG4gICAgcmV0dXJuIHtcbiAgICAgIHY6IDEsXG4gICAgICBzZjogaDIuSExTLFxuICAgICAgc2lkOiB0aGlzLnNpZCxcbiAgICAgIGNpZDogdGhpcy5jaWQsXG4gICAgICBwcjogKGUgPSB0aGlzLm1lZGlhKSA9PSBudWxsID8gdm9pZCAwIDogZS5wbGF5YmFja1JhdGUsXG4gICAgICBtdHA6IHRoaXMuaGxzLmJhbmR3aWR0aEVzdGltYXRlIC8gMWUzXG4gICAgfTtcbiAgfVxuICAvKipcbiAgICogQXBwbHkgQ01DRCBkYXRhIHRvIGEgcmVxdWVzdC5cbiAgICovXG4gIGFwcGx5KGUsIHQgPSB7fSkge1xuICAgIG50KHQsIHRoaXMuY3JlYXRlRGF0YSgpKTtcbiAgICBjb25zdCByID0gdC5vdCA9PT0gaHIuSU5JVCB8fCB0Lm90ID09PSBoci5WSURFTyB8fCB0Lm90ID09PSBoci5NVVhFRDtcbiAgICB0aGlzLnN0YXJ2ZWQgJiYgciAmJiAodC5icyA9ICEwLCB0LnN1ID0gITAsIHRoaXMuc3RhcnZlZCA9ICExKSwgdC5zdSA9PSBudWxsICYmICh0LnN1ID0gdGhpcy5idWZmZXJpbmcpO1xuICAgIGNvbnN0IHtcbiAgICAgIGluY2x1ZGVLZXlzOiBuXG4gICAgfSA9IHRoaXM7XG4gICAgbiAmJiAodCA9IE9iamVjdC5rZXlzKHQpLnJlZHVjZSgobywgYSkgPT4gKG4uaW5jbHVkZXMoYSkgJiYgKG9bYV0gPSB0W2FdKSwgbyksIHt9KSk7XG4gICAgY29uc3QgaSA9IHtcbiAgICAgIGJhc2VVcmw6IGUudXJsXG4gICAgfTtcbiAgICB0aGlzLnVzZUhlYWRlcnMgPyAoZS5oZWFkZXJzIHx8IChlLmhlYWRlcnMgPSB7fSksIFEyKGUuaGVhZGVycywgdCwgaSkpIDogZS51cmwgPSBudyhlLnVybCwgdCwgaSk7XG4gIH1cbiAgZ2V0TmV4dEZyYWcoZSkge1xuICAgIHZhciB0O1xuICAgIGNvbnN0IHIgPSAodCA9IHRoaXMuaGxzLmxldmVsc1tlLmxldmVsXSkgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZGV0YWlscztcbiAgICBpZiAocikge1xuICAgICAgY29uc3QgbiA9IGUuc24gLSByLnN0YXJ0U047XG4gICAgICByZXR1cm4gci5mcmFnbWVudHNbbiArIDFdO1xuICAgIH1cbiAgfVxuICBnZXROZXh0UGFydChlKSB7XG4gICAgdmFyIHQ7XG4gICAgY29uc3Qge1xuICAgICAgaW5kZXg6IHIsXG4gICAgICBmcmFnbWVudDogblxuICAgIH0gPSBlLCBpID0gKHQgPSB0aGlzLmhscy5sZXZlbHNbbi5sZXZlbF0pID09IG51bGwgfHwgKHQgPSB0LmRldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiB0LnBhcnRMaXN0O1xuICAgIGlmIChpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHNuOiBvXG4gICAgICB9ID0gbjtcbiAgICAgIGZvciAobGV0IGEgPSBpLmxlbmd0aCAtIDE7IGEgPj0gMDsgYS0tKSB7XG4gICAgICAgIGNvbnN0IGwgPSBpW2FdO1xuICAgICAgICBpZiAobC5pbmRleCA9PT0gciAmJiBsLmZyYWdtZW50LnNuID09PSBvKVxuICAgICAgICAgIHJldHVybiBpW2EgKyAxXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoZSBDTUNEIG9iamVjdCB0eXBlLlxuICAgKi9cbiAgZ2V0T2JqZWN0VHlwZShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgdHlwZTogdFxuICAgIH0gPSBlO1xuICAgIGlmICh0ID09PSBcInN1YnRpdGxlXCIpXG4gICAgICByZXR1cm4gaHIuVElNRURfVEVYVDtcbiAgICBpZiAoZS5zbiA9PT0gXCJpbml0U2VnbWVudFwiKVxuICAgICAgcmV0dXJuIGhyLklOSVQ7XG4gICAgaWYgKHQgPT09IFwiYXVkaW9cIilcbiAgICAgIHJldHVybiBoci5BVURJTztcbiAgICBpZiAodCA9PT0gXCJtYWluXCIpXG4gICAgICByZXR1cm4gdGhpcy5obHMuYXVkaW9UcmFja3MubGVuZ3RoID8gaHIuVklERU8gOiBoci5NVVhFRDtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBoaWdoZXN0IGJpdHJhdGUuXG4gICAqL1xuICBnZXRUb3BCYW5kd2lkdGgoZSkge1xuICAgIGxldCB0ID0gMCwgcjtcbiAgICBjb25zdCBuID0gdGhpcy5obHM7XG4gICAgaWYgKGUgPT09IGhyLkFVRElPKVxuICAgICAgciA9IG4uYXVkaW9UcmFja3M7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBpID0gbi5tYXhBdXRvTGV2ZWwsIG8gPSBpID4gLTEgPyBpICsgMSA6IG4ubGV2ZWxzLmxlbmd0aDtcbiAgICAgIHIgPSBuLmxldmVscy5zbGljZSgwLCBvKTtcbiAgICB9XG4gICAgcmV0dXJuIHIuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgaS5iaXRyYXRlID4gdCAmJiAodCA9IGkuYml0cmF0ZSk7XG4gICAgfSksIHQgPiAwID8gdCA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBidWZmZXIgbGVuZ3RoIGZvciBhIG1lZGlhIHR5cGUgaW4gbWlsbGlzZWNvbmRzXG4gICAqL1xuICBnZXRCdWZmZXJMZW5ndGgoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLm1lZGlhLCByID0gZSA9PT0gaHIuQVVESU8gPyB0aGlzLmF1ZGlvQnVmZmVyIDogdGhpcy52aWRlb0J1ZmZlcjtcbiAgICByZXR1cm4gIXIgfHwgIXQgPyBOYU4gOiBDZS5idWZmZXJJbmZvKHIsIHQuY3VycmVudFRpbWUsIHRoaXMuY29uZmlnLm1heEJ1ZmZlckhvbGUpLmxlbiAqIDFlMztcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgcGxheWxpc3QgbG9hZGVyXG4gICAqL1xuICBjcmVhdGVQbGF5bGlzdExvYWRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBwTG9hZGVyOiBlXG4gICAgfSA9IHRoaXMuY29uZmlnLCB0ID0gdGhpcy5hcHBseVBsYXlsaXN0RGF0YSwgciA9IGUgfHwgdGhpcy5jb25maWcubG9hZGVyO1xuICAgIHJldHVybiBjbGFzcyB7XG4gICAgICBjb25zdHJ1Y3RvcihpKSB7XG4gICAgICAgIHRoaXMubG9hZGVyID0gdm9pZCAwLCB0aGlzLmxvYWRlciA9IG5ldyByKGkpO1xuICAgICAgfVxuICAgICAgZ2V0IHN0YXRzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkZXIuc3RhdHM7XG4gICAgICB9XG4gICAgICBnZXQgY29udGV4dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLmNvbnRleHQ7XG4gICAgICB9XG4gICAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmxvYWRlci5kZXN0cm95KCk7XG4gICAgICB9XG4gICAgICBhYm9ydCgpIHtcbiAgICAgICAgdGhpcy5sb2FkZXIuYWJvcnQoKTtcbiAgICAgIH1cbiAgICAgIGxvYWQoaSwgbywgYSkge1xuICAgICAgICB0KGkpLCB0aGlzLmxvYWRlci5sb2FkKGksIG8sIGEpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHBsYXlsaXN0IGxvYWRlclxuICAgKi9cbiAgY3JlYXRlRnJhZ21lbnRMb2FkZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgZkxvYWRlcjogZVxuICAgIH0gPSB0aGlzLmNvbmZpZywgdCA9IHRoaXMuYXBwbHlGcmFnbWVudERhdGEsIHIgPSBlIHx8IHRoaXMuY29uZmlnLmxvYWRlcjtcbiAgICByZXR1cm4gY2xhc3Mge1xuICAgICAgY29uc3RydWN0b3IoaSkge1xuICAgICAgICB0aGlzLmxvYWRlciA9IHZvaWQgMCwgdGhpcy5sb2FkZXIgPSBuZXcgcihpKTtcbiAgICAgIH1cbiAgICAgIGdldCBzdGF0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGVyLnN0YXRzO1xuICAgICAgfVxuICAgICAgZ2V0IGNvbnRleHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRlci5jb250ZXh0O1xuICAgICAgfVxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5sb2FkZXIuZGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgYWJvcnQoKSB7XG4gICAgICAgIHRoaXMubG9hZGVyLmFib3J0KCk7XG4gICAgICB9XG4gICAgICBsb2FkKGksIG8sIGEpIHtcbiAgICAgICAgdChpKSwgdGhpcy5sb2FkZXIubG9hZChpLCBvLCBhKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59XG5jb25zdCBvdyA9IDNlNTtcbmNsYXNzIGF3IGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoXCJjb250ZW50LXN0ZWVyaW5nXCIsIGUubG9nZ2VyKSwgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMubG9hZGVyID0gbnVsbCwgdGhpcy51cmkgPSBudWxsLCB0aGlzLnBhdGh3YXlJZCA9IFwiLlwiLCB0aGlzLl9wYXRod2F5UHJpb3JpdHkgPSBudWxsLCB0aGlzLnRpbWVUb0xvYWQgPSAzMDAsIHRoaXMucmVsb2FkVGltZXIgPSAtMSwgdGhpcy51cGRhdGVkID0gMCwgdGhpcy5zdGFydGVkID0gITEsIHRoaXMuZW5hYmxlZCA9ICEwLCB0aGlzLmxldmVscyA9IG51bGwsIHRoaXMuYXVkaW9UcmFja3MgPSBudWxsLCB0aGlzLnN1YnRpdGxlVHJhY2tzID0gbnVsbCwgdGhpcy5wZW5hbGl6ZWRQYXRod2F5cyA9IHt9LCB0aGlzLmhscyA9IGUsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHM7XG4gICAgZS5vbihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTUFOSUZFU1RfTE9BREVELCB0aGlzLm9uTWFuaWZlc3RMb2FkZWQsIHRoaXMpLCBlLm9uKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9uKEkuRVJST1IsIHRoaXMub25FcnJvciwgdGhpcyk7XG4gIH1cbiAgdW5yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHM7XG4gICAgZSAmJiAoZS5vZmYoSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5NQU5JRkVTVF9MT0FERUQsIHRoaXMub25NYW5pZmVzdExvYWRlZCwgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpKTtcbiAgfVxuICBwYXRod2F5cygpIHtcbiAgICByZXR1cm4gKHRoaXMubGV2ZWxzIHx8IFtdKS5yZWR1Y2UoKGUsIHQpID0+IChlLmluZGV4T2YodC5wYXRod2F5SWQpID09PSAtMSAmJiBlLnB1c2godC5wYXRod2F5SWQpLCBlKSwgW10pO1xuICB9XG4gIGdldCBwYXRod2F5UHJpb3JpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3BhdGh3YXlQcmlvcml0eTtcbiAgfVxuICBzZXQgcGF0aHdheVByaW9yaXR5KGUpIHtcbiAgICB0aGlzLnVwZGF0ZVBhdGh3YXlQcmlvcml0eShlKTtcbiAgfVxuICBzdGFydExvYWQoKSB7XG4gICAgaWYgKHRoaXMuc3RhcnRlZCA9ICEwLCB0aGlzLmNsZWFyVGltZW91dCgpLCB0aGlzLmVuYWJsZWQgJiYgdGhpcy51cmkpIHtcbiAgICAgIGlmICh0aGlzLnVwZGF0ZWQpIHtcbiAgICAgICAgY29uc3QgZSA9IHRoaXMudGltZVRvTG9hZCAqIDFlMyAtIChwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMudXBkYXRlZCk7XG4gICAgICAgIGlmIChlID4gMCkge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKHRoaXMudXJpLCBlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubG9hZFN0ZWVyaW5nTWFuaWZlc3QodGhpcy51cmkpO1xuICAgIH1cbiAgfVxuICBzdG9wTG9hZCgpIHtcbiAgICB0aGlzLnN0YXJ0ZWQgPSAhMSwgdGhpcy5sb2FkZXIgJiYgKHRoaXMubG9hZGVyLmRlc3Ryb3koKSwgdGhpcy5sb2FkZXIgPSBudWxsKSwgdGhpcy5jbGVhclRpbWVvdXQoKTtcbiAgfVxuICBjbGVhclRpbWVvdXQoKSB7XG4gICAgdGhpcy5yZWxvYWRUaW1lciAhPT0gLTEgJiYgKHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVsb2FkVGltZXIpLCB0aGlzLnJlbG9hZFRpbWVyID0gLTEpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHRoaXMuc3RvcExvYWQoKSwgdGhpcy5obHMgPSBudWxsLCB0aGlzLmxldmVscyA9IHRoaXMuYXVkaW9UcmFja3MgPSB0aGlzLnN1YnRpdGxlVHJhY2tzID0gbnVsbDtcbiAgfVxuICByZW1vdmVMZXZlbChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMubGV2ZWxzO1xuICAgIHQgJiYgKHRoaXMubGV2ZWxzID0gdC5maWx0ZXIoKHIpID0+IHIgIT09IGUpKTtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGluZygpIHtcbiAgICB0aGlzLnN0b3BMb2FkKCksIHRoaXMuZW5hYmxlZCA9ICEwLCB0aGlzLnRpbWVUb0xvYWQgPSAzMDAsIHRoaXMudXBkYXRlZCA9IDAsIHRoaXMudXJpID0gbnVsbCwgdGhpcy5wYXRod2F5SWQgPSBcIi5cIiwgdGhpcy5sZXZlbHMgPSB0aGlzLmF1ZGlvVHJhY2tzID0gdGhpcy5zdWJ0aXRsZVRyYWNrcyA9IG51bGw7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRlZChlLCB0KSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGVudFN0ZWVyaW5nOiByXG4gICAgfSA9IHQ7XG4gICAgciAhPT0gbnVsbCAmJiAodGhpcy5wYXRod2F5SWQgPSByLnBhdGh3YXlJZCwgdGhpcy51cmkgPSByLnVyaSwgdGhpcy5zdGFydGVkICYmIHRoaXMuc3RhcnRMb2FkKCkpO1xuICB9XG4gIG9uTWFuaWZlc3RQYXJzZWQoZSwgdCkge1xuICAgIHRoaXMuYXVkaW9UcmFja3MgPSB0LmF1ZGlvVHJhY2tzLCB0aGlzLnN1YnRpdGxlVHJhY2tzID0gdC5zdWJ0aXRsZVRyYWNrcztcbiAgfVxuICBvbkVycm9yKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBlcnJvckFjdGlvbjogclxuICAgIH0gPSB0O1xuICAgIGlmICgociA9PSBudWxsID8gdm9pZCAwIDogci5hY3Rpb24pID09PSBadC5TZW5kQWx0ZXJuYXRlVG9QZW5hbHR5Qm94ICYmIHIuZmxhZ3MgPT09IHZyLk1vdmVBbGxBbHRlcm5hdGVzTWF0Y2hpbmdIb3N0KSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5sZXZlbHM7XG4gICAgICBsZXQgaSA9IHRoaXMuX3BhdGh3YXlQcmlvcml0eSwgbyA9IHRoaXMucGF0aHdheUlkO1xuICAgICAgaWYgKHQuY29udGV4dCkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZ3JvdXBJZDogYSxcbiAgICAgICAgICBwYXRod2F5SWQ6IGwsXG4gICAgICAgICAgdHlwZTogY1xuICAgICAgICB9ID0gdC5jb250ZXh0O1xuICAgICAgICBhICYmIG4gPyBvID0gdGhpcy5nZXRQYXRod2F5Rm9yR3JvdXBJZChhLCBjLCBvKSA6IGwgJiYgKG8gPSBsKTtcbiAgICAgIH1cbiAgICAgIG8gaW4gdGhpcy5wZW5hbGl6ZWRQYXRod2F5cyB8fCAodGhpcy5wZW5hbGl6ZWRQYXRod2F5c1tvXSA9IHBlcmZvcm1hbmNlLm5vdygpKSwgIWkgJiYgbiAmJiAoaSA9IHRoaXMucGF0aHdheXMoKSksIGkgJiYgaS5sZW5ndGggPiAxICYmICh0aGlzLnVwZGF0ZVBhdGh3YXlQcmlvcml0eShpKSwgci5yZXNvbHZlZCA9IHRoaXMucGF0aHdheUlkICE9PSBvKSwgdC5kZXRhaWxzID09PSBKLkJVRkZFUl9BUFBFTkRfRVJST1IgJiYgIXQuZmF0YWwgPyByLnJlc29sdmVkID0gITAgOiByLnJlc29sdmVkIHx8IHRoaXMud2FybihgQ291bGQgbm90IHJlc29sdmUgJHt0LmRldGFpbHN9IChcIiR7dC5lcnJvci5tZXNzYWdlfVwiKSB3aXRoIGNvbnRlbnQtc3RlZXJpbmcgZm9yIFBhdGh3YXk6ICR7b30gbGV2ZWxzOiAke24gJiYgbi5sZW5ndGh9IHByaW9yaXRpZXM6ICR7YXQoaSl9IHBlbmFsaXplZDogJHthdCh0aGlzLnBlbmFsaXplZFBhdGh3YXlzKX1gKTtcbiAgICB9XG4gIH1cbiAgZmlsdGVyUGFyc2VkTGV2ZWxzKGUpIHtcbiAgICB0aGlzLmxldmVscyA9IGU7XG4gICAgbGV0IHQgPSB0aGlzLmdldExldmVsc0ZvclBhdGh3YXkodGhpcy5wYXRod2F5SWQpO1xuICAgIGlmICh0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29uc3QgciA9IGVbMF0ucGF0aHdheUlkO1xuICAgICAgdGhpcy5sb2coYE5vIGxldmVscyBmb3VuZCBpbiBQYXRod2F5ICR7dGhpcy5wYXRod2F5SWR9LiBTZXR0aW5nIGluaXRpYWwgUGF0aHdheSB0byBcIiR7cn1cImApLCB0ID0gdGhpcy5nZXRMZXZlbHNGb3JQYXRod2F5KHIpLCB0aGlzLnBhdGh3YXlJZCA9IHI7XG4gICAgfVxuICAgIHJldHVybiB0Lmxlbmd0aCAhPT0gZS5sZW5ndGggJiYgdGhpcy5sb2coYEZvdW5kICR7dC5sZW5ndGh9LyR7ZS5sZW5ndGh9IGxldmVscyBpbiBQYXRod2F5IFwiJHt0aGlzLnBhdGh3YXlJZH1cImApLCB0O1xuICB9XG4gIGdldExldmVsc0ZvclBhdGh3YXkoZSkge1xuICAgIHJldHVybiB0aGlzLmxldmVscyA9PT0gbnVsbCA/IFtdIDogdGhpcy5sZXZlbHMuZmlsdGVyKCh0KSA9PiBlID09PSB0LnBhdGh3YXlJZCk7XG4gIH1cbiAgdXBkYXRlUGF0aHdheVByaW9yaXR5KGUpIHtcbiAgICB0aGlzLl9wYXRod2F5UHJpb3JpdHkgPSBlO1xuICAgIGxldCB0O1xuICAgIGNvbnN0IHIgPSB0aGlzLnBlbmFsaXplZFBhdGh3YXlzLCBuID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgT2JqZWN0LmtleXMocikuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgbiAtIHJbaV0gPiBvdyAmJiBkZWxldGUgcltpXTtcbiAgICB9KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSBlW2ldO1xuICAgICAgaWYgKG8gaW4gcilcbiAgICAgICAgY29udGludWU7XG4gICAgICBpZiAobyA9PT0gdGhpcy5wYXRod2F5SWQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmhscy5uZXh0TG9hZExldmVsLCBsID0gdGhpcy5obHMubGV2ZWxzW2FdO1xuICAgICAgaWYgKHQgPSB0aGlzLmdldExldmVsc0ZvclBhdGh3YXkobyksIHQubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmxvZyhgU2V0dGluZyBQYXRod2F5IHRvIFwiJHtvfVwiYCksIHRoaXMucGF0aHdheUlkID0gbywgcnAodCksIHRoaXMuaGxzLnRyaWdnZXIoSS5MRVZFTFNfVVBEQVRFRCwge1xuICAgICAgICAgIGxldmVsczogdFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuaGxzLmxldmVsc1thXTtcbiAgICAgICAgbCAmJiBjICYmIHRoaXMubGV2ZWxzICYmIChjLmF0dHJzW1wiU1RBQkxFLVZBUklBTlQtSURcIl0gIT09IGwuYXR0cnNbXCJTVEFCTEUtVkFSSUFOVC1JRFwiXSAmJiBjLmJpdHJhdGUgIT09IGwuYml0cmF0ZSAmJiB0aGlzLmxvZyhgVW5zdGFibGUgUGF0aHdheXMgY2hhbmdlIGZyb20gYml0cmF0ZSAke2wuYml0cmF0ZX0gdG8gJHtjLmJpdHJhdGV9YCksIHRoaXMuaGxzLm5leHRMb2FkTGV2ZWwgPSBhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldFBhdGh3YXlGb3JHcm91cElkKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdGhpcy5nZXRMZXZlbHNGb3JQYXRod2F5KHIpLmNvbmNhdCh0aGlzLmxldmVscyB8fCBbXSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuLmxlbmd0aDsgaSsrKVxuICAgICAgaWYgKHQgPT09IEtlLkFVRElPX1RSQUNLICYmIG5baV0uaGFzQXVkaW9Hcm91cChlKSB8fCB0ID09PSBLZS5TVUJUSVRMRV9UUkFDSyAmJiBuW2ldLmhhc1N1YnRpdGxlR3JvdXAoZSkpXG4gICAgICAgIHJldHVybiBuW2ldLnBhdGh3YXlJZDtcbiAgICByZXR1cm4gcjtcbiAgfVxuICBjbG9uZVBhdGh3YXlzKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5sZXZlbHM7XG4gICAgaWYgKCF0KVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHIgPSB7fSwgbiA9IHt9O1xuICAgIGUuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBJRDogbyxcbiAgICAgICAgXCJCQVNFLUlEXCI6IGEsXG4gICAgICAgIFwiVVJJLVJFUExBQ0VNRU5UXCI6IGxcbiAgICAgIH0gPSBpO1xuICAgICAgaWYgKHQuc29tZSgodSkgPT4gdS5wYXRod2F5SWQgPT09IG8pKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBjID0gdGhpcy5nZXRMZXZlbHNGb3JQYXRod2F5KGEpLm1hcCgodSkgPT4ge1xuICAgICAgICBjb25zdCBkID0gbmV3IGd0KHUuYXR0cnMpO1xuICAgICAgICBkW1wiUEFUSFdBWS1JRFwiXSA9IG87XG4gICAgICAgIGNvbnN0IGggPSBkLkFVRElPICYmIGAke2QuQVVESU99X2Nsb25lXyR7b31gLCBmID0gZC5TVUJUSVRMRVMgJiYgYCR7ZC5TVUJUSVRMRVN9X2Nsb25lXyR7b31gO1xuICAgICAgICBoICYmIChyW2QuQVVESU9dID0gaCwgZC5BVURJTyA9IGgpLCBmICYmIChuW2QuU1VCVElUTEVTXSA9IGYsIGQuU1VCVElUTEVTID0gZik7XG4gICAgICAgIGNvbnN0IHAgPSBGcCh1LnVyaSwgZFtcIlNUQUJMRS1WQVJJQU5ULUlEXCJdLCBcIlBFUi1WQVJJQU5ULVVSSVNcIiwgbCksIHkgPSBuZXcgbWkoe1xuICAgICAgICAgIGF0dHJzOiBkLFxuICAgICAgICAgIGF1ZGlvQ29kZWM6IHUuYXVkaW9Db2RlYyxcbiAgICAgICAgICBiaXRyYXRlOiB1LmJpdHJhdGUsXG4gICAgICAgICAgaGVpZ2h0OiB1LmhlaWdodCxcbiAgICAgICAgICBuYW1lOiB1Lm5hbWUsXG4gICAgICAgICAgdXJsOiBwLFxuICAgICAgICAgIHZpZGVvQ29kZWM6IHUudmlkZW9Db2RlYyxcbiAgICAgICAgICB3aWR0aDogdS53aWR0aFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHUuYXVkaW9Hcm91cHMpXG4gICAgICAgICAgZm9yIChsZXQgRSA9IDE7IEUgPCB1LmF1ZGlvR3JvdXBzLmxlbmd0aDsgRSsrKVxuICAgICAgICAgICAgeS5hZGRHcm91cElkKFwiYXVkaW9cIiwgYCR7dS5hdWRpb0dyb3Vwc1tFXX1fY2xvbmVfJHtvfWApO1xuICAgICAgICBpZiAodS5zdWJ0aXRsZUdyb3VwcylcbiAgICAgICAgICBmb3IgKGxldCBFID0gMTsgRSA8IHUuc3VidGl0bGVHcm91cHMubGVuZ3RoOyBFKyspXG4gICAgICAgICAgICB5LmFkZEdyb3VwSWQoXCJ0ZXh0XCIsIGAke3Uuc3VidGl0bGVHcm91cHNbRV19X2Nsb25lXyR7b31gKTtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgICB9KTtcbiAgICAgIHQucHVzaCguLi5jKSwgWWgodGhpcy5hdWRpb1RyYWNrcywgciwgbCwgbyksIFloKHRoaXMuc3VidGl0bGVUcmFja3MsIG4sIGwsIG8pO1xuICAgIH0pO1xuICB9XG4gIGxvYWRTdGVlcmluZ01hbmlmZXN0KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5obHMuY29uZmlnLCByID0gdC5sb2FkZXI7XG4gICAgdGhpcy5sb2FkZXIgJiYgdGhpcy5sb2FkZXIuZGVzdHJveSgpLCB0aGlzLmxvYWRlciA9IG5ldyByKHQpO1xuICAgIGxldCBuO1xuICAgIHRyeSB7XG4gICAgICBuID0gbmV3IHNlbGYuVVJMKGUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhpcy5lbmFibGVkID0gITEsIHRoaXMubG9nKGBGYWlsZWQgdG8gcGFyc2UgU3RlZXJpbmcgTWFuaWZlc3QgVVJJOiAke2V9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChuLnByb3RvY29sICE9PSBcImRhdGE6XCIpIHtcbiAgICAgIGNvbnN0IHUgPSAodGhpcy5obHMuYmFuZHdpZHRoRXN0aW1hdGUgfHwgdC5hYnJFd21hRGVmYXVsdEVzdGltYXRlKSB8IDA7XG4gICAgICBuLnNlYXJjaFBhcmFtcy5zZXQoXCJfSExTX3BhdGh3YXlcIiwgdGhpcy5wYXRod2F5SWQpLCBuLnNlYXJjaFBhcmFtcy5zZXQoXCJfSExTX3Rocm91Z2hwdXRcIiwgXCJcIiArIHUpO1xuICAgIH1cbiAgICBjb25zdCBpID0ge1xuICAgICAgcmVzcG9uc2VUeXBlOiBcImpzb25cIixcbiAgICAgIHVybDogbi5ocmVmXG4gICAgfSwgbyA9IHQuc3RlZXJpbmdNYW5pZmVzdExvYWRQb2xpY3kuZGVmYXVsdCwgYSA9IG8uZXJyb3JSZXRyeSB8fCBvLnRpbWVvdXRSZXRyeSB8fCB7fSwgbCA9IHtcbiAgICAgIGxvYWRQb2xpY3k6IG8sXG4gICAgICB0aW1lb3V0OiBvLm1heExvYWRUaW1lTXMsXG4gICAgICBtYXhSZXRyeTogYS5tYXhOdW1SZXRyeSB8fCAwLFxuICAgICAgcmV0cnlEZWxheTogYS5yZXRyeURlbGF5TXMgfHwgMCxcbiAgICAgIG1heFJldHJ5RGVsYXk6IGEubWF4UmV0cnlEZWxheU1zIHx8IDBcbiAgICB9LCBjID0ge1xuICAgICAgb25TdWNjZXNzOiAodSwgZCwgaCwgZikgPT4ge1xuICAgICAgICB0aGlzLmxvZyhgTG9hZGVkIHN0ZWVyaW5nIG1hbmlmZXN0OiBcIiR7bn1cImApO1xuICAgICAgICBjb25zdCBwID0gdS5kYXRhO1xuICAgICAgICBpZiAoKHAgPT0gbnVsbCA/IHZvaWQgMCA6IHAuVkVSU0lPTikgIT09IDEpIHtcbiAgICAgICAgICB0aGlzLmxvZyhgU3RlZXJpbmcgVkVSU0lPTiAke3AuVkVSU0lPTn0gbm90IHN1cHBvcnRlZCFgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51cGRhdGVkID0gcGVyZm9ybWFuY2Uubm93KCksIHRoaXMudGltZVRvTG9hZCA9IHAuVFRMO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgXCJSRUxPQUQtVVJJXCI6IHksXG4gICAgICAgICAgXCJQQVRIV0FZLUNMT05FU1wiOiBFLFxuICAgICAgICAgIFwiUEFUSFdBWS1QUklPUklUWVwiOiBiXG4gICAgICAgIH0gPSBwO1xuICAgICAgICBpZiAoeSlcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy51cmkgPSBuZXcgc2VsZi5VUkwoeSwgbikuaHJlZjtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9ICExLCB0aGlzLmxvZyhgRmFpbGVkIHRvIHBhcnNlIFN0ZWVyaW5nIE1hbmlmZXN0IFJFTE9BRC1VUkk6ICR7eX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKHRoaXMudXJpIHx8IGgudXJsKSwgRSAmJiB0aGlzLmNsb25lUGF0aHdheXMoRSk7XG4gICAgICAgIGNvbnN0IFIgPSB7XG4gICAgICAgICAgc3RlZXJpbmdNYW5pZmVzdDogcCxcbiAgICAgICAgICB1cmw6IG4udG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuU1RFRVJJTkdfTUFOSUZFU1RfTE9BREVELCBSKSwgYiAmJiB0aGlzLnVwZGF0ZVBhdGh3YXlQcmlvcml0eShiKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAodSwgZCwgaCwgZikgPT4ge1xuICAgICAgICBpZiAodGhpcy5sb2coYEVycm9yIGxvYWRpbmcgc3RlZXJpbmcgbWFuaWZlc3Q6ICR7dS5jb2RlfSAke3UudGV4dH0gKCR7ZC51cmx9KWApLCB0aGlzLnN0b3BMb2FkKCksIHUuY29kZSA9PT0gNDEwKSB7XG4gICAgICAgICAgdGhpcy5lbmFibGVkID0gITEsIHRoaXMubG9nKGBTdGVlcmluZyBtYW5pZmVzdCAke2QudXJsfSBubyBsb25nZXIgYXZhaWxhYmxlYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwID0gdGhpcy50aW1lVG9Mb2FkICogMWUzO1xuICAgICAgICBpZiAodS5jb2RlID09PSA0MjkpIHtcbiAgICAgICAgICBjb25zdCB5ID0gdGhpcy5sb2FkZXI7XG4gICAgICAgICAgaWYgKHR5cGVvZiAoeSA9PSBudWxsID8gdm9pZCAwIDogeS5nZXRSZXNwb25zZUhlYWRlcikgPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBFID0geS5nZXRSZXNwb25zZUhlYWRlcihcIlJldHJ5LUFmdGVyXCIpO1xuICAgICAgICAgICAgRSAmJiAocCA9IHBhcnNlRmxvYXQoRSkgKiAxZTMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmxvZyhgU3RlZXJpbmcgbWFuaWZlc3QgJHtkLnVybH0gcmF0ZSBsaW1pdGVkYCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKHRoaXMudXJpIHx8IGQudXJsLCBwKTtcbiAgICAgIH0sXG4gICAgICBvblRpbWVvdXQ6ICh1LCBkLCBoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nKGBUaW1lb3V0IGxvYWRpbmcgc3RlZXJpbmcgbWFuaWZlc3QgKCR7ZC51cmx9KWApLCB0aGlzLnNjaGVkdWxlUmVmcmVzaCh0aGlzLnVyaSB8fCBkLnVybCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLmxvZyhgUmVxdWVzdGluZyBzdGVlcmluZyBtYW5pZmVzdDogJHtufWApLCB0aGlzLmxvYWRlci5sb2FkKGksIGwsIGMpO1xuICB9XG4gIHNjaGVkdWxlUmVmcmVzaChlLCB0ID0gdGhpcy50aW1lVG9Mb2FkICogMWUzKSB7XG4gICAgdGhpcy5jbGVhclRpbWVvdXQoKSwgdGhpcy5yZWxvYWRUaW1lciA9IHNlbGYuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB2YXIgcjtcbiAgICAgIGNvbnN0IG4gPSAociA9IHRoaXMuaGxzKSA9PSBudWxsID8gdm9pZCAwIDogci5tZWRpYTtcbiAgICAgIGlmIChuICYmICFuLmVuZGVkKSB7XG4gICAgICAgIHRoaXMubG9hZFN0ZWVyaW5nTWFuaWZlc3QoZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2NoZWR1bGVSZWZyZXNoKGUsIHRoaXMudGltZVRvTG9hZCAqIDFlMyk7XG4gICAgfSwgdCk7XG4gIH1cbn1cbmZ1bmN0aW9uIFloKHMsIGUsIHQsIHIpIHtcbiAgcyAmJiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKChuKSA9PiB7XG4gICAgY29uc3QgaSA9IHMuZmlsdGVyKChvKSA9PiBvLmdyb3VwSWQgPT09IG4pLm1hcCgobykgPT4ge1xuICAgICAgY29uc3QgYSA9IG50KHt9LCBvKTtcbiAgICAgIHJldHVybiBhLmRldGFpbHMgPSB2b2lkIDAsIGEuYXR0cnMgPSBuZXcgZ3QoYS5hdHRycyksIGEudXJsID0gYS5hdHRycy5VUkkgPSBGcChvLnVybCwgby5hdHRyc1tcIlNUQUJMRS1SRU5ESVRJT04tSURcIl0sIFwiUEVSLVJFTkRJVElPTi1VUklTXCIsIHQpLCBhLmdyb3VwSWQgPSBhLmF0dHJzW1wiR1JPVVAtSURcIl0gPSBlW25dLCBhLmF0dHJzW1wiUEFUSFdBWS1JRFwiXSA9IHIsIGE7XG4gICAgfSk7XG4gICAgcy5wdXNoKC4uLmkpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIEZwKHMsIGUsIHQsIHIpIHtcbiAgY29uc3Qge1xuICAgIEhPU1Q6IG4sXG4gICAgUEFSQU1TOiBpLFxuICAgIFt0XTogb1xuICB9ID0gcjtcbiAgbGV0IGE7XG4gIGUgJiYgKGEgPSBvID09IG51bGwgPyB2b2lkIDAgOiBvW2VdLCBhICYmIChzID0gYSkpO1xuICBjb25zdCBsID0gbmV3IHNlbGYuVVJMKHMpO1xuICByZXR1cm4gbiAmJiAhYSAmJiAobC5ob3N0ID0gbiksIGkgJiYgT2JqZWN0LmtleXMoaSkuc29ydCgpLmZvckVhY2goKGMpID0+IHtcbiAgICBjICYmIGwuc2VhcmNoUGFyYW1zLnNldChjLCBpW2NdKTtcbiAgfSksIGwuaHJlZjtcbn1cbmNsYXNzIF9uIGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgc3VwZXIoXCJlbWVcIiwgZS5sb2dnZXIpLCB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5jb25maWcgPSB2b2lkIDAsIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLmtleUZvcm1hdFByb21pc2UgPSBudWxsLCB0aGlzLmtleVN5c3RlbUFjY2Vzc1Byb21pc2VzID0ge30sIHRoaXMuX3JlcXVlc3RMaWNlbnNlRmFpbHVyZUNvdW50ID0gMCwgdGhpcy5tZWRpYUtleVNlc3Npb25zID0gW10sIHRoaXMua2V5SWRUb0tleVNlc3Npb25Qcm9taXNlID0ge30sIHRoaXMubWVkaWFLZXlzID0gbnVsbCwgdGhpcy5zZXRNZWRpYUtleXNRdWV1ZSA9IF9uLkNETUNsZWFudXBQcm9taXNlID8gW19uLkNETUNsZWFudXBQcm9taXNlXSA6IFtdLCB0aGlzLmJhbm5lZEtleUlkcyA9IHt9LCB0aGlzLm9uTWVkaWFFbmNyeXB0ZWQgPSAodCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBpbml0RGF0YVR5cGU6IHIsXG4gICAgICAgIGluaXREYXRhOiBuXG4gICAgICB9ID0gdCwgaSA9IGBcIiR7dC50eXBlfVwiIGV2ZW50OiBpbml0IGRhdGEgdHlwZTogXCIke3J9XCJgO1xuICAgICAgaWYgKHRoaXMuZGVidWcoaSksIG4gIT09IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLmtleUZvcm1hdFByb21pc2UpIHtcbiAgICAgICAgICBsZXQgbyA9IE9iamVjdC5rZXlzKHRoaXMua2V5U3lzdGVtQWNjZXNzUHJvbWlzZXMpO1xuICAgICAgICAgIG8ubGVuZ3RoIHx8IChvID0gem4odGhpcy5jb25maWcpKTtcbiAgICAgICAgICBjb25zdCBhID0gby5tYXAoZmwpLmZpbHRlcigobCkgPT4gISFsKTtcbiAgICAgICAgICB0aGlzLmtleUZvcm1hdFByb21pc2UgPSB0aGlzLmdldEtleUZvcm1hdFByb21pc2UoYSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5rZXlGb3JtYXRQcm9taXNlLnRoZW4oKG8pID0+IHtcbiAgICAgICAgICBjb25zdCBhID0gcG8obyk7XG4gICAgICAgICAgaWYgKHIgIT09IFwic2luZlwiIHx8IGEgIT09IG10LkZBSVJQTEFZKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgSWdub3JpbmcgXCIke3QudHlwZX1cIiBldmVudCB3aXRoIGluaXQgZGF0YSB0eXBlOiBcIiR7cn1cIiBmb3Igc2VsZWN0ZWQga2V5LXN5c3RlbSAke2F9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBsO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmID0ganQobmV3IFVpbnQ4QXJyYXkobikpLCBwID0gYnUoSlNPTi5wYXJzZShmKS5zaW5mKSwgeSA9IFBnKHApO1xuICAgICAgICAgICAgaWYgKCF5KVxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCInc2NobScgYm94IG1pc3Npbmcgb3Igbm90IGNiY3MvY2VuYyB3aXRoIHNjaGkgPiB0ZW5jXCIpO1xuICAgICAgICAgICAgbCA9IG5ldyBVaW50OEFycmF5KHkuc3ViYXJyYXkoOCwgMjQpKTtcbiAgICAgICAgICB9IGNhdGNoIChmKSB7XG4gICAgICAgICAgICB0aGlzLndhcm4oYCR7aX0gRmFpbGVkIHRvIHBhcnNlIHNpbmY6ICR7Zn1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYyA9IGZyKGwpLCB7XG4gICAgICAgICAgICBrZXlJZFRvS2V5U2Vzc2lvblByb21pc2U6IHUsXG4gICAgICAgICAgICBtZWRpYUtleVNlc3Npb25zOiBkXG4gICAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgICAgbGV0IGggPSB1W2NdO1xuICAgICAgICAgIGZvciAobGV0IGYgPSAwOyBmIDwgZC5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgY29uc3QgcCA9IGRbZl0sIHkgPSBwLmRlY3J5cHRkYXRhO1xuICAgICAgICAgICAgaWYgKCF5LmtleUlkKVxuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IEUgPSBmcih5LmtleUlkKTtcbiAgICAgICAgICAgIGlmICh4dShsLCB5LmtleUlkKSB8fCB5LnVyaS5yZXBsYWNlKC8tL2csIFwiXCIpLmluZGV4T2YoYykgIT09IC0xKSB7XG4gICAgICAgICAgICAgIGlmIChoID0gdVtFXSwgIWgpXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIGlmICh5LnBzc2gpXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGRlbGV0ZSB1W0VdLCB5LnBzc2ggPSBuZXcgVWludDhBcnJheShuKSwgeS5rZXlJZCA9IGwsIGggPSB1W2NdID0gaC50aGVuKCgpID0+IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0V2l0aFByZWZlcnJlZEtleVNlc3Npb24ocCwgciwgbiwgXCJlbmNyeXB0ZWQtZXZlbnQta2V5LW1hdGNoXCIpKSwgaC5jYXRjaCgoYikgPT4gdGhpcy5oYW5kbGVFcnJvcihiKSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBoIHx8IHRoaXMuaGFuZGxlRXJyb3IobmV3IEVycm9yKGBLZXkgSUQgJHtjfSBub3QgZW5jb3VudGVyZWQgaW4gcGxheWxpc3QuIEtleS1zeXN0ZW0gc2Vzc2lvbnMgJHtkLmxlbmd0aH0uYCkpO1xuICAgICAgICB9KS5jYXRjaCgobykgPT4gdGhpcy5oYW5kbGVFcnJvcihvKSk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5vbldhaXRpbmdGb3JLZXkgPSAodCkgPT4ge1xuICAgICAgdGhpcy5sb2coYFwiJHt0LnR5cGV9XCIgZXZlbnRgKTtcbiAgICB9LCB0aGlzLmhscyA9IGUsIHRoaXMuY29uZmlnID0gZS5jb25maWcsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMub25EZXN0cm95aW5nKCksIHRoaXMub25NZWRpYURldGFjaGVkKCk7XG4gICAgY29uc3QgZSA9IHRoaXMuY29uZmlnO1xuICAgIGUucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzRnVuYyA9IG51bGwsIGUubGljZW5zZVhoclNldHVwID0gZS5saWNlbnNlUmVzcG9uc2VDYWxsYmFjayA9IHZvaWQgMCwgZS5kcm1TeXN0ZW1zID0gZS5kcm1TeXN0ZW1PcHRpb25zID0ge30sIHRoaXMuaGxzID0gdGhpcy5jb25maWcgPSB0aGlzLmtleUlkVG9LZXlTZXNzaW9uUHJvbWlzZSA9IG51bGwsIHRoaXMub25NZWRpYUVuY3J5cHRlZCA9IHRoaXMub25XYWl0aW5nRm9yS2V5ID0gbnVsbDtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICB0aGlzLmhscy5vbihJLk1FRElBX0FUVEFDSEVELCB0aGlzLm9uTWVkaWFBdHRhY2hlZCwgdGhpcyksIHRoaXMuaGxzLm9uKEkuTUVESUFfREVUQUNIRUQsIHRoaXMub25NZWRpYURldGFjaGVkLCB0aGlzKSwgdGhpcy5obHMub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgdGhpcy5obHMub24oSS5NQU5JRkVTVF9MT0FERUQsIHRoaXMub25NYW5pZmVzdExvYWRlZCwgdGhpcyksIHRoaXMuaGxzLm9uKEkuREVTVFJPWUlORywgdGhpcy5vbkRlc3Ryb3lpbmcsIHRoaXMpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgdGhpcy5obHMub2ZmKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgdGhpcy5obHMub2ZmKEkuTUVESUFfREVUQUNIRUQsIHRoaXMub25NZWRpYURldGFjaGVkLCB0aGlzKSwgdGhpcy5obHMub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIHRoaXMuaGxzLm9mZihJLk1BTklGRVNUX0xPQURFRCwgdGhpcy5vbk1hbmlmZXN0TG9hZGVkLCB0aGlzKSwgdGhpcy5obHMub2ZmKEkuREVTVFJPWUlORywgdGhpcy5vbkRlc3Ryb3lpbmcsIHRoaXMpO1xuICB9XG4gIGdldExpY2Vuc2VTZXJ2ZXJVcmwoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRybVN5c3RlbXM6IHQsXG4gICAgICB3aWRldmluZUxpY2Vuc2VVcmw6IHJcbiAgICB9ID0gdGhpcy5jb25maWcsIG4gPSB0ID09IG51bGwgPyB2b2lkIDAgOiB0W2VdO1xuICAgIGlmIChuKVxuICAgICAgcmV0dXJuIG4ubGljZW5zZVVybDtcbiAgICBpZiAoZSA9PT0gbXQuV0lERVZJTkUgJiYgcilcbiAgICAgIHJldHVybiByO1xuICB9XG4gIGdldExpY2Vuc2VTZXJ2ZXJVcmxPclRocm93KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5nZXRMaWNlbnNlU2VydmVyVXJsKGUpO1xuICAgIGlmICh0ID09PSB2b2lkIDApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxpY2Vuc2Ugc2VydmVyIFVSTCBjb25maWd1cmVkIGZvciBrZXktc3lzdGVtIFwiJHtlfVwiYCk7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgZ2V0U2VydmVyQ2VydGlmaWNhdGVVcmwoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGRybVN5c3RlbXM6IHRcbiAgICB9ID0gdGhpcy5jb25maWcsIHIgPSB0ID09IG51bGwgPyB2b2lkIDAgOiB0W2VdO1xuICAgIGlmIChyKVxuICAgICAgcmV0dXJuIHIuc2VydmVyQ2VydGlmaWNhdGVVcmw7XG4gICAgdGhpcy5sb2coYE5vIFNlcnZlciBDZXJ0aWZpY2F0ZSBpbiBjb25maWcuZHJtU3lzdGVtc1tcIiR7ZX1cIl1gKTtcbiAgfVxuICBhdHRlbXB0S2V5U3lzdGVtQWNjZXNzKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5obHMubGV2ZWxzLCByID0gKG8sIGEsIGwpID0+ICEhbyAmJiBsLmluZGV4T2YobykgPT09IGEsIG4gPSB0Lm1hcCgobykgPT4gby5hdWRpb0NvZGVjKS5maWx0ZXIociksIGkgPSB0Lm1hcCgobykgPT4gby52aWRlb0NvZGVjKS5maWx0ZXIocik7XG4gICAgcmV0dXJuIG4ubGVuZ3RoICsgaS5sZW5ndGggPT09IDAgJiYgaS5wdXNoKFwiYXZjMS40MmUwMWVcIiksIG5ldyBQcm9taXNlKChvLCBhKSA9PiB7XG4gICAgICBjb25zdCBsID0gKGMpID0+IHtcbiAgICAgICAgY29uc3QgdSA9IGMuc2hpZnQoKTtcbiAgICAgICAgdGhpcy5nZXRNZWRpYUtleXNQcm9taXNlKHUsIG4sIGkpLnRoZW4oKGQpID0+IG8oe1xuICAgICAgICAgIGtleVN5c3RlbTogdSxcbiAgICAgICAgICBtZWRpYUtleXM6IGRcbiAgICAgICAgfSkpLmNhdGNoKChkKSA9PiB7XG4gICAgICAgICAgYy5sZW5ndGggPyBsKGMpIDogZCBpbnN0YW5jZW9mIHlyID8gYShkKSA6IGEobmV3IHlyKHtcbiAgICAgICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgICAgICBkZXRhaWxzOiBKLktFWV9TWVNURU1fTk9fQUNDRVNTLFxuICAgICAgICAgICAgZXJyb3I6IGQsXG4gICAgICAgICAgICBmYXRhbDogITBcbiAgICAgICAgICB9LCBkLm1lc3NhZ2UpKTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuICAgICAgbChlKTtcbiAgICB9KTtcbiAgfVxuICByZXF1ZXN0TWVkaWFLZXlTeXN0ZW1BY2Nlc3MoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVlc3RNZWRpYUtleVN5c3RlbUFjY2Vzc0Z1bmM6IHJcbiAgICB9ID0gdGhpcy5jb25maWc7XG4gICAgaWYgKHR5cGVvZiByICE9IFwiZnVuY3Rpb25cIikge1xuICAgICAgbGV0IG4gPSBgQ29uZmlndXJlZCByZXF1ZXN0TWVkaWFLZXlTeXN0ZW1BY2Nlc3MgaXMgbm90IGEgZnVuY3Rpb24gJHtyfWA7XG4gICAgICByZXR1cm4gWWcgPT09IG51bGwgJiYgc2VsZi5sb2NhdGlvbi5wcm90b2NvbCA9PT0gXCJodHRwOlwiICYmIChuID0gYG5hdmlnYXRvci5yZXF1ZXN0TWVkaWFLZXlTeXN0ZW1BY2Nlc3MgaXMgbm90IGF2YWlsYWJsZSBvdmVyIGluc2VjdXJlIHByb3RvY29sICR7bG9jYXRpb24ucHJvdG9jb2x9YCksIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihuKSk7XG4gICAgfVxuICAgIHJldHVybiByKGUsIHQpO1xuICB9XG4gIGdldE1lZGlhS2V5c1Byb21pc2UoZSwgdCwgcikge1xuICAgIHZhciBuO1xuICAgIGNvbnN0IGkgPSBHYihlLCB0LCByLCB0aGlzLmNvbmZpZy5kcm1TeXN0ZW1PcHRpb25zIHx8IHt9KTtcbiAgICBsZXQgbyA9IHRoaXMua2V5U3lzdGVtQWNjZXNzUHJvbWlzZXNbZV0sIGEgPSAobiA9IG8pID09IG51bGwgPyB2b2lkIDAgOiBuLmtleVN5c3RlbUFjY2VzcztcbiAgICBpZiAoIWEpIHtcbiAgICAgIHRoaXMubG9nKGBSZXF1ZXN0aW5nIGVuY3J5cHRlZCBtZWRpYSBcIiR7ZX1cIiBrZXktc3lzdGVtIGFjY2VzcyB3aXRoIGNvbmZpZzogJHthdChpKX1gKSwgYSA9IHRoaXMucmVxdWVzdE1lZGlhS2V5U3lzdGVtQWNjZXNzKGUsIGkpO1xuICAgICAgY29uc3QgbCA9IG8gPSB0aGlzLmtleVN5c3RlbUFjY2Vzc1Byb21pc2VzW2VdID0ge1xuICAgICAgICBrZXlTeXN0ZW1BY2Nlc3M6IGFcbiAgICAgIH07XG4gICAgICByZXR1cm4gYS5jYXRjaCgoYykgPT4ge1xuICAgICAgICB0aGlzLmxvZyhgRmFpbGVkIHRvIG9idGFpbiBhY2Nlc3MgdG8ga2V5LXN5c3RlbSBcIiR7ZX1cIjogJHtjfWApO1xuICAgICAgfSksIGEudGhlbigoYykgPT4ge1xuICAgICAgICB0aGlzLmxvZyhgQWNjZXNzIGZvciBrZXktc3lzdGVtIFwiJHtjLmtleVN5c3RlbX1cIiBvYnRhaW5lZGApO1xuICAgICAgICBjb25zdCB1ID0gdGhpcy5mZXRjaFNlcnZlckNlcnRpZmljYXRlKGUpO1xuICAgICAgICB0aGlzLmxvZyhgQ3JlYXRlIG1lZGlhLWtleXMgZm9yIFwiJHtlfVwiYCk7XG4gICAgICAgIGNvbnN0IGQgPSBsLm1lZGlhS2V5cyA9IGMuY3JlYXRlTWVkaWFLZXlzKCkudGhlbigoaCkgPT4gKHRoaXMubG9nKGBNZWRpYS1rZXlzIGNyZWF0ZWQgZm9yIFwiJHtlfVwiYCksIGwuaGFzTWVkaWFLZXlzID0gITAsIHUudGhlbigoZikgPT4gZiA/IHRoaXMuc2V0TWVkaWFLZXlzU2VydmVyQ2VydGlmaWNhdGUoaCwgZSwgZikgOiBoKSkpO1xuICAgICAgICByZXR1cm4gZC5jYXRjaCgoaCkgPT4ge1xuICAgICAgICAgIHRoaXMuZXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgbWVkaWEta2V5cyBmb3IgXCIke2V9XCJ9OiAke2h9YCk7XG4gICAgICAgIH0pLCBkO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBhLnRoZW4oKCkgPT4gby5tZWRpYUtleXMpO1xuICB9XG4gIGNyZWF0ZU1lZGlhS2V5U2Vzc2lvbkNvbnRleHQoe1xuICAgIGRlY3J5cHRkYXRhOiBlLFxuICAgIGtleVN5c3RlbTogdCxcbiAgICBtZWRpYUtleXM6IHJcbiAgfSkge1xuICAgIHRoaXMubG9nKGBDcmVhdGluZyBrZXktc3lzdGVtIHNlc3Npb24gXCIke3R9XCIga2V5SWQ6ICR7ZnIoZS5rZXlJZCB8fCBbXSl9IGtleVVyaTogJHtlLnVyaX1gKTtcbiAgICBjb25zdCBuID0gci5jcmVhdGVTZXNzaW9uKCksIGkgPSB7XG4gICAgICBkZWNyeXB0ZGF0YTogZSxcbiAgICAgIGtleVN5c3RlbTogdCxcbiAgICAgIG1lZGlhS2V5czogcixcbiAgICAgIG1lZGlhS2V5c1Nlc3Npb246IG4sXG4gICAgICBrZXlTdGF0dXM6IFwic3RhdHVzLXBlbmRpbmdcIlxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubWVkaWFLZXlTZXNzaW9ucy5wdXNoKGkpLCBpO1xuICB9XG4gIHJlbmV3S2V5U2Vzc2lvbihlKSB7XG4gICAgY29uc3QgdCA9IGUuZGVjcnlwdGRhdGE7XG4gICAgaWYgKHQucHNzaCkge1xuICAgICAgY29uc3QgciA9IHRoaXMuY3JlYXRlTWVkaWFLZXlTZXNzaW9uQ29udGV4dChlKSwgbiA9IEppKHQpLCBpID0gXCJjZW5jXCI7XG4gICAgICB0aGlzLmtleUlkVG9LZXlTZXNzaW9uUHJvbWlzZVtuXSA9IHRoaXMuZ2VuZXJhdGVSZXF1ZXN0V2l0aFByZWZlcnJlZEtleVNlc3Npb24ociwgaSwgdC5wc3NoLmJ1ZmZlciwgXCJleHBpcmVkXCIpO1xuICAgIH0gZWxzZVxuICAgICAgdGhpcy53YXJuKFwiQ291bGQgbm90IHJlbmV3IGV4cGlyZWQgc2Vzc2lvbi4gTWlzc2luZyBwc3NoIGluaXREYXRhLlwiKTtcbiAgICB0aGlzLnJlbW92ZVNlc3Npb24oZSk7XG4gIH1cbiAgdXBkYXRlS2V5U2Vzc2lvbihlLCB0KSB7XG4gICAgY29uc3QgciA9IGUubWVkaWFLZXlzU2Vzc2lvbjtcbiAgICByZXR1cm4gdGhpcy5sb2coYFVwZGF0aW5nIGtleS1zZXNzaW9uIFwiJHtyLnNlc3Npb25JZH1cIiBmb3Iga2V5SWQgJHtmcihlLmRlY3J5cHRkYXRhLmtleUlkIHx8IFtdKX1cbiAgICAgIH0gKGRhdGEgbGVuZ3RoOiAke3QuYnl0ZUxlbmd0aH0pYCksIHIudXBkYXRlKHQpO1xuICB9XG4gIGdldFNlbGVjdGVkS2V5U3lzdGVtRm9ybWF0cygpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5rZXlTeXN0ZW1BY2Nlc3NQcm9taXNlcykubWFwKChlKSA9PiAoe1xuICAgICAga2V5U3lzdGVtOiBlLFxuICAgICAgaGFzTWVkaWFLZXlzOiB0aGlzLmtleVN5c3RlbUFjY2Vzc1Byb21pc2VzW2VdLmhhc01lZGlhS2V5c1xuICAgIH0pKS5maWx0ZXIoKHtcbiAgICAgIGhhc01lZGlhS2V5czogZVxuICAgIH0pID0+ICEhZSkubWFwKCh7XG4gICAgICBrZXlTeXN0ZW06IGVcbiAgICB9KSA9PiBmbChlKSkuZmlsdGVyKChlKSA9PiAhIWUpO1xuICB9XG4gIGdldEtleVN5c3RlbUFjY2VzcyhlKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0S2V5U3lzdGVtU2VsZWN0aW9uUHJvbWlzZShlKS50aGVuKCh7XG4gICAgICBrZXlTeXN0ZW06IHQsXG4gICAgICBtZWRpYUtleXM6IHJcbiAgICB9KSA9PiB0aGlzLmF0dGVtcHRTZXRNZWRpYUtleXModCwgcikpO1xuICB9XG4gIHNlbGVjdEtleVN5c3RlbShlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCh0LCByKSA9PiB7XG4gICAgICB0aGlzLmdldEtleVN5c3RlbVNlbGVjdGlvblByb21pc2UoZSkudGhlbigoe1xuICAgICAgICBrZXlTeXN0ZW06IG5cbiAgICAgIH0pID0+IHtcbiAgICAgICAgY29uc3QgaSA9IGZsKG4pO1xuICAgICAgICBpID8gdChpKSA6IHIobmV3IEVycm9yKGBVbmFibGUgdG8gZmluZCBmb3JtYXQgZm9yIGtleS1zeXN0ZW0gXCIke259XCJgKSk7XG4gICAgICB9KS5jYXRjaChyKTtcbiAgICB9KTtcbiAgfVxuICBzZWxlY3RLZXlTeXN0ZW1Gb3JtYXQoZSkge1xuICAgIGNvbnN0IHQgPSBPYmplY3Qua2V5cyhlLmxldmVsa2V5cyB8fCB7fSk7XG4gICAgcmV0dXJuIHRoaXMua2V5Rm9ybWF0UHJvbWlzZSB8fCAodGhpcy5sb2coYFNlbGVjdGluZyBrZXktc3lzdGVtIGZyb20gZnJhZ21lbnQgKHNuOiAke2Uuc259ICR7ZS50eXBlfTogJHtlLmxldmVsfSkga2V5IGZvcm1hdHMgJHt0LmpvaW4oXCIsIFwiKX1gKSwgdGhpcy5rZXlGb3JtYXRQcm9taXNlID0gdGhpcy5nZXRLZXlGb3JtYXRQcm9taXNlKHQpKSwgdGhpcy5rZXlGb3JtYXRQcm9taXNlO1xuICB9XG4gIGdldEtleUZvcm1hdFByb21pc2UoZSkge1xuICAgIGNvbnN0IHQgPSB6bih0aGlzLmNvbmZpZyksIHIgPSBlLm1hcChwbykuZmlsdGVyKChuKSA9PiAhIW4gJiYgdC5pbmRleE9mKG4pICE9PSAtMSk7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0S2V5U3lzdGVtKHIpO1xuICB9XG4gIGdldEtleVN0YXR1cyhlKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWFLZXlTZXNzaW9uczogdFxuICAgIH0gPSB0aGlzO1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgdC5sZW5ndGg7IHIrKykge1xuICAgICAgY29uc3QgbiA9IGx3KGUsIHRbcl0pO1xuICAgICAgaWYgKG4pXG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgfVxuICBsb2FkS2V5KGUpIHtcbiAgICBjb25zdCB0ID0gZS5rZXlJbmZvLmRlY3J5cHRkYXRhLCByID0gSmkodCksIG4gPSB0aGlzLmJhbm5lZEtleUlkc1tyXTtcbiAgICBpZiAobiB8fCB0aGlzLmdldEtleVN0YXR1cyh0KSA9PT0gXCJpbnRlcm5hbC1lcnJvclwiKSB7XG4gICAgICBjb25zdCBhID0gWmgobiB8fCBcImludGVybmFsLWVycm9yXCIsIHQpO1xuICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRXJyb3IoYSwgZS5mcmFnKSwgUHJvbWlzZS5yZWplY3QoYSk7XG4gICAgfVxuICAgIGNvbnN0IGkgPSBgKGtleUlkOiAke3J9IGZvcm1hdDogXCIke3Qua2V5Rm9ybWF0fVwiIG1ldGhvZDogJHt0Lm1ldGhvZH0gdXJpOiAke3QudXJpfSlgO1xuICAgIHRoaXMubG9nKGBTdGFydGluZyBzZXNzaW9uIGZvciBrZXkgJHtpfWApO1xuICAgIGNvbnN0IG8gPSB0aGlzLmtleUlkVG9LZXlTZXNzaW9uUHJvbWlzZVtyXTtcbiAgICBpZiAoIW8pIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmdldEtleVN5c3RlbUZvcktleVByb21pc2UodCkudGhlbigoe1xuICAgICAgICBrZXlTeXN0ZW06IGwsXG4gICAgICAgIG1lZGlhS2V5czogY1xuICAgICAgfSkgPT4gKHRoaXMudGhyb3dJZkRlc3Ryb3llZCgpLCB0aGlzLmxvZyhgSGFuZGxlIGVuY3J5cHRlZCBtZWRpYSBzbjogJHtlLmZyYWcuc259ICR7ZS5mcmFnLnR5cGV9OiAke2UuZnJhZy5sZXZlbH0gdXNpbmcga2V5ICR7aX1gKSwgdGhpcy5hdHRlbXB0U2V0TWVkaWFLZXlzKGwsIGMpLnRoZW4oKCkgPT4gKHRoaXMudGhyb3dJZkRlc3Ryb3llZCgpLCB0aGlzLmNyZWF0ZU1lZGlhS2V5U2Vzc2lvbkNvbnRleHQoe1xuICAgICAgICBrZXlTeXN0ZW06IGwsXG4gICAgICAgIG1lZGlhS2V5czogYyxcbiAgICAgICAgZGVjcnlwdGRhdGE6IHRcbiAgICAgIH0pKSkpKS50aGVuKChsKSA9PiB7XG4gICAgICAgIGNvbnN0IGMgPSBcImNlbmNcIiwgdSA9IHQucHNzaCA/IHQucHNzaC5idWZmZXIgOiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVJlcXVlc3RXaXRoUHJlZmVycmVkS2V5U2Vzc2lvbihsLCBjLCB1LCBcInBsYXlsaXN0LWtleVwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGEuY2F0Y2goKGwpID0+IHRoaXMuaGFuZGxlRXJyb3IobCwgZS5mcmFnKSksIHRoaXMua2V5SWRUb0tleVNlc3Npb25Qcm9taXNlW3JdID0gYSwgYTtcbiAgICB9XG4gICAgcmV0dXJuIG8uY2F0Y2goKGEpID0+IHtcbiAgICAgIGlmIChhIGluc3RhbmNlb2YgeXIpIHtcbiAgICAgICAgY29uc3QgbCA9IHR0KHt9LCBhLmRhdGEpO1xuICAgICAgICB0aGlzLmdldEtleVN0YXR1cyh0KSA9PT0gXCJpbnRlcm5hbC1lcnJvclwiICYmIChsLmRlY3J5cHRkYXRhID0gdCk7XG4gICAgICAgIGNvbnN0IGMgPSBuZXcgeXIobCwgYS5tZXNzYWdlKTtcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihjLCBlLmZyYWcpO1xuICAgICAgfVxuICAgIH0pLCBvO1xuICB9XG4gIHRocm93SWZEZXN0cm95ZWQoZSA9IFwiSW52YWxpZCBzdGF0ZVwiKSB7XG4gICAgaWYgKCF0aGlzLmhscylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImludmFsaWQgc3RhdGVcIik7XG4gIH1cbiAgaGFuZGxlRXJyb3IoZSwgdCkge1xuICAgIGlmICh0aGlzLmhscylcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgeXIpIHtcbiAgICAgICAgdCAmJiAoZS5kYXRhLmZyYWcgPSB0KTtcbiAgICAgICAgY29uc3QgciA9IGUuZGF0YS5kZWNyeXB0ZGF0YTtcbiAgICAgICAgdGhpcy5lcnJvcihgJHtlLm1lc3NhZ2V9JHtyID8gYCAoJHtmcihyLmtleUlkIHx8IFtdKX0pYCA6IFwiXCJ9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwgZS5kYXRhKTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB0aGlzLmVycm9yKGUubWVzc2FnZSksIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgICAgZGV0YWlsczogSi5LRVlfU1lTVEVNX05PX0tFWVMsXG4gICAgICAgICAgZXJyb3I6IGUsXG4gICAgICAgICAgZmF0YWw6ICEwXG4gICAgICAgIH0pO1xuICB9XG4gIGdldEtleVN5c3RlbUZvcktleVByb21pc2UoZSkge1xuICAgIGNvbnN0IHQgPSBKaShlKSwgciA9IHRoaXMua2V5SWRUb0tleVNlc3Npb25Qcm9taXNlW3RdO1xuICAgIGlmICghcikge1xuICAgICAgY29uc3QgbiA9IHBvKGUua2V5Rm9ybWF0KSwgaSA9IG4gPyBbbl0gOiB6bih0aGlzLmNvbmZpZyk7XG4gICAgICByZXR1cm4gdGhpcy5hdHRlbXB0S2V5U3lzdGVtQWNjZXNzKGkpO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfVxuICBnZXRLZXlTeXN0ZW1TZWxlY3Rpb25Qcm9taXNlKGUpIHtcbiAgICBpZiAoZS5sZW5ndGggfHwgKGUgPSB6bih0aGlzLmNvbmZpZykpLCBlLmxlbmd0aCA9PT0gMClcbiAgICAgIHRocm93IG5ldyB5cih7XG4gICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouS0VZX1NZU1RFTV9OT19DT05GSUdVUkVEX0xJQ0VOU0UsXG4gICAgICAgIGZhdGFsOiAhMFxuICAgICAgfSwgYE1pc3Npbmcga2V5LXN5c3RlbSBsaWNlbnNlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyAke2F0KHtcbiAgICAgICAgZHJtU3lzdGVtczogdGhpcy5jb25maWcuZHJtU3lzdGVtc1xuICAgICAgfSl9YCk7XG4gICAgcmV0dXJuIHRoaXMuYXR0ZW1wdEtleVN5c3RlbUFjY2VzcyhlKTtcbiAgfVxuICBhdHRlbXB0U2V0TWVkaWFLZXlzKGUsIHQpIHtcbiAgICBpZiAodGhpcy5tZWRpYUtleXMgPT09IHQpXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgciA9IHRoaXMuc2V0TWVkaWFLZXlzUXVldWUuc2xpY2UoKTtcbiAgICB0aGlzLmxvZyhgU2V0dGluZyBtZWRpYS1rZXlzIGZvciBcIiR7ZX1cImApO1xuICAgIGNvbnN0IG4gPSBQcm9taXNlLmFsbChyKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5tZWRpYSlcbiAgICAgICAgdGhyb3cgdGhpcy5tZWRpYUtleXMgPSBudWxsLCBuZXcgRXJyb3IoXCJBdHRlbXB0ZWQgdG8gc2V0IG1lZGlhS2V5cyB3aXRob3V0IG1lZGlhIGVsZW1lbnQgYXR0YWNoZWRcIik7XG4gICAgICByZXR1cm4gdGhpcy5tZWRpYS5zZXRNZWRpYUtleXModCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMubWVkaWFLZXlzID0gdCwgdGhpcy5zZXRNZWRpYUtleXNRdWV1ZS5wdXNoKG4pLCBuLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5sb2coYE1lZGlhLWtleXMgc2V0IGZvciBcIiR7ZX1cImApLCByLnB1c2gobiksIHRoaXMuc2V0TWVkaWFLZXlzUXVldWUgPSB0aGlzLnNldE1lZGlhS2V5c1F1ZXVlLmZpbHRlcigoaSkgPT4gci5pbmRleE9mKGkpID09PSAtMSk7XG4gICAgfSk7XG4gIH1cbiAgZ2VuZXJhdGVSZXF1ZXN0V2l0aFByZWZlcnJlZEtleVNlc3Npb24oZSwgdCwgciwgbikge1xuICAgIHZhciBpO1xuICAgIGNvbnN0IG8gPSAoaSA9IHRoaXMuY29uZmlnLmRybVN5c3RlbXMpID09IG51bGwgfHwgKGkgPSBpW2Uua2V5U3lzdGVtXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGkuZ2VuZXJhdGVSZXF1ZXN0O1xuICAgIGlmIChvKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcCA9IG8uY2FsbCh0aGlzLmhscywgdCwgciwgZSk7XG4gICAgICAgIGlmICghcClcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIHJlc3BvbnNlIGZyb20gY29uZmlndXJlZCBnZW5lcmF0ZVJlcXVlc3QgZmlsdGVyXCIpO1xuICAgICAgICB0ID0gcC5pbml0RGF0YVR5cGUsIHIgPSBwLmluaXREYXRhID8gcC5pbml0RGF0YSA6IG51bGwsIGUuZGVjcnlwdGRhdGEucHNzaCA9IHIgPyBuZXcgVWludDhBcnJheShyKSA6IG51bGw7XG4gICAgICB9IGNhdGNoIChwKSB7XG4gICAgICAgIGlmICh0aGlzLndhcm4ocC5tZXNzYWdlKSwgdGhpcy5obHMgJiYgdGhpcy5obHMuY29uZmlnLmRlYnVnKVxuICAgICAgICAgIHRocm93IHA7XG4gICAgICB9XG4gICAgaWYgKHIgPT09IG51bGwpXG4gICAgICByZXR1cm4gdGhpcy5sb2coYFNraXBwaW5nIGtleS1zZXNzaW9uIHJlcXVlc3QgZm9yIFwiJHtufVwiIChubyBpbml0RGF0YSlgKSwgUHJvbWlzZS5yZXNvbHZlKGUpO1xuICAgIGNvbnN0IGEgPSBKaShlLmRlY3J5cHRkYXRhKSwgbCA9IGUuZGVjcnlwdGRhdGEudXJpO1xuICAgIHRoaXMubG9nKGBHZW5lcmF0aW5nIGtleS1zZXNzaW9uIHJlcXVlc3QgZm9yIFwiJHtufVwiIGtleUlkOiAke2F9IFVSSTogJHtsfSAoaW5pdCBkYXRhIHR5cGU6ICR7dH0gbGVuZ3RoOiAke3IuYnl0ZUxlbmd0aH0pYCk7XG4gICAgY29uc3QgYyA9IG5ldyB3dSgpLCB1ID0gZS5fb25tZXNzYWdlID0gKHApID0+IHtcbiAgICAgIGNvbnN0IHkgPSBlLm1lZGlhS2V5c1Nlc3Npb247XG4gICAgICBpZiAoIXkpIHtcbiAgICAgICAgYy5lbWl0KFwiZXJyb3JcIiwgbmV3IEVycm9yKFwiaW52YWxpZCBzdGF0ZVwiKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWVzc2FnZVR5cGU6IEUsXG4gICAgICAgIG1lc3NhZ2U6IGJcbiAgICAgIH0gPSBwO1xuICAgICAgdGhpcy5sb2coYFwiJHtFfVwiIG1lc3NhZ2UgZXZlbnQgZm9yIHNlc3Npb24gXCIke3kuc2Vzc2lvbklkfVwiIG1lc3NhZ2Ugc2l6ZTogJHtiLmJ5dGVMZW5ndGh9YCksIEUgPT09IFwibGljZW5zZS1yZXF1ZXN0XCIgfHwgRSA9PT0gXCJsaWNlbnNlLXJlbmV3YWxcIiA/IHRoaXMucmVuZXdMaWNlbnNlKGUsIGIpLmNhdGNoKChSKSA9PiB7XG4gICAgICAgIGMuZXZlbnROYW1lcygpLmxlbmd0aCA/IGMuZW1pdChcImVycm9yXCIsIFIpIDogdGhpcy5oYW5kbGVFcnJvcihSKTtcbiAgICAgIH0pIDogRSA9PT0gXCJsaWNlbnNlLXJlbGVhc2VcIiA/IGUua2V5U3lzdGVtID09PSBtdC5GQUlSUExBWSAmJiB0aGlzLnVwZGF0ZUtleVNlc3Npb24oZSwgaGMoXCJhY2tub3dsZWRnZWRcIikpLnRoZW4oKCkgPT4gdGhpcy5yZW1vdmVTZXNzaW9uKGUpKS5jYXRjaCgoUikgPT4gdGhpcy5oYW5kbGVFcnJvcihSKSkgOiB0aGlzLndhcm4oYHVuaGFuZGxlZCBtZWRpYSBrZXkgbWVzc2FnZSB0eXBlIFwiJHtFfVwiYCk7XG4gICAgfSwgZCA9IChwLCB5KSA9PiB7XG4gICAgICB5LmtleVN0YXR1cyA9IHA7XG4gICAgICBsZXQgRTtcbiAgICAgIHAuc3RhcnRzV2l0aChcInVzYWJsZVwiKSA/IGMuZW1pdChcInJlc29sdmVkXCIpIDogcCA9PT0gXCJpbnRlcm5hbC1lcnJvclwiIHx8IHAgPT09IFwib3V0cHV0LXJlc3RyaWN0ZWRcIiB8fCBwID09PSBcIm91dHB1dC1kb3duc2NhbGVkXCIgPyBFID0gWmgocCwgeS5kZWNyeXB0ZGF0YSkgOiBwID09PSBcImV4cGlyZWRcIiA/IEUgPSBuZXcgRXJyb3IoYGtleSBleHBpcmVkIChrZXlJZDogJHthfSlgKSA6IHAgPT09IFwicmVsZWFzZWRcIiA/IEUgPSBuZXcgRXJyb3IoXCJrZXkgcmVsZWFzZWRcIikgOiBwID09PSBcInN0YXR1cy1wZW5kaW5nXCIgfHwgdGhpcy53YXJuKGB1bmhhbmRsZWQga2V5IHN0YXR1cyBjaGFuZ2UgXCIke3B9XCIgKGtleUlkOiAke2F9KWApLCBFICYmIChjLmV2ZW50TmFtZXMoKS5sZW5ndGggPyBjLmVtaXQoXCJlcnJvclwiLCBFKSA6IHRoaXMuaGFuZGxlRXJyb3IoRSkpO1xuICAgIH0sIGggPSBlLl9vbmtleXN0YXR1c2VzY2hhbmdlID0gKHApID0+IHtcbiAgICAgIGlmICghZS5tZWRpYUtleXNTZXNzaW9uKSB7XG4gICAgICAgIGMuZW1pdChcImVycm9yXCIsIG5ldyBFcnJvcihcImludmFsaWQgc3RhdGVcIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBFID0gdGhpcy5nZXRLZXlTdGF0dXNlcyhlKTtcbiAgICAgIGlmICghT2JqZWN0LmtleXMoRSkuc29tZSgoRikgPT4gRVtGXSAhPT0gXCJzdGF0dXMtcGVuZGluZ1wiKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKEVbYV0gPT09IFwiZXhwaXJlZFwiKSB7XG4gICAgICAgIHRoaXMubG9nKGBFeHBpcmVkIGtleSAke2F0KEUpfSBpbiBrZXktc2Vzc2lvbiBcIiR7ZS5tZWRpYUtleXNTZXNzaW9uLnNlc3Npb25JZH1cImApLCB0aGlzLnJlbmV3S2V5U2Vzc2lvbihlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IFIgPSBFW2FdO1xuICAgICAgaWYgKFIpXG4gICAgICAgIGQoUiwgZSk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdmFyIEE7XG4gICAgICAgIGUua2V5U3RhdHVzVGltZW91dHMgfHwgKGUua2V5U3RhdHVzVGltZW91dHMgPSB7fSksIChBID0gZS5rZXlTdGF0dXNUaW1lb3V0cylbYV0gfHwgKEFbYV0gPSBzZWxmLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICghZS5tZWRpYUtleXNTZXNzaW9uIHx8ICF0aGlzLm1lZGlhS2V5cylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICBjb25zdCBNID0gdGhpcy5nZXRLZXlTdGF0dXMoZS5kZWNyeXB0ZGF0YSk7XG4gICAgICAgICAgaWYgKE0gJiYgTSAhPT0gXCJzdGF0dXMtcGVuZGluZ1wiKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9nKGBObyBzdGF0dXMgZm9yIGtleUlkICR7YX0gaW4ga2V5LXNlc3Npb24gXCIke2UubWVkaWFLZXlzU2Vzc2lvbi5zZXNzaW9uSWR9XCIuIFVzaW5nIHNlc3Npb24ga2V5LXN0YXR1cyAke019IGZyb20gb3RoZXIgc2Vzc2lvbi5gKSwgZChNLCBlKTtcbiAgICAgICAgICB0aGlzLmxvZyhga2V5IHN0YXR1cyBmb3IgJHthfSBpbiBrZXktc2Vzc2lvbiBcIiR7ZS5tZWRpYUtleXNTZXNzaW9uLnNlc3Npb25JZH1cIiB0aW1lZCBvdXQgYWZ0ZXIgMG1zYCksIFIgPSBcImludGVybmFsLWVycm9yXCIsIGQoUiwgZSk7XG4gICAgICAgIH0sIDApKSwgdGhpcy5sb2coYE5vIHN0YXR1cyBmb3Iga2V5SWQgJHthfSAoJHthdChFKX0pLmApO1xuICAgICAgfVxuICAgIH07XG4gICAgY3IoZS5tZWRpYUtleXNTZXNzaW9uLCBcIm1lc3NhZ2VcIiwgdSksIGNyKGUubWVkaWFLZXlzU2Vzc2lvbiwgXCJrZXlzdGF0dXNlc2NoYW5nZVwiLCBoKTtcbiAgICBjb25zdCBmID0gbmV3IFByb21pc2UoKHAsIHkpID0+IHtcbiAgICAgIGMub24oXCJlcnJvclwiLCB5KSwgYy5vbihcInJlc29sdmVkXCIsIHApO1xuICAgIH0pO1xuICAgIHJldHVybiBlLm1lZGlhS2V5c1Nlc3Npb24uZ2VuZXJhdGVSZXF1ZXN0KHQsIHIpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5sb2coYFJlcXVlc3QgZ2VuZXJhdGVkIGZvciBrZXktc2Vzc2lvbiBcIiR7ZS5tZWRpYUtleXNTZXNzaW9uLnNlc3Npb25JZH1cIiBrZXlJZDogJHthfSBVUkk6ICR7bH1gKTtcbiAgICB9KS5jYXRjaCgocCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IHlyKHtcbiAgICAgICAgdHlwZTogdmUuS0VZX1NZU1RFTV9FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5LRVlfU1lTVEVNX05PX1NFU1NJT04sXG4gICAgICAgIGVycm9yOiBwLFxuICAgICAgICBkZWNyeXB0ZGF0YTogZS5kZWNyeXB0ZGF0YSxcbiAgICAgICAgZmF0YWw6ICExXG4gICAgICB9LCBgRXJyb3IgZ2VuZXJhdGluZyBrZXktc2Vzc2lvbiByZXF1ZXN0OiAke3B9YCk7XG4gICAgfSkudGhlbigoKSA9PiBmKS5jYXRjaCgocCkgPT4gKGMucmVtb3ZlQWxsTGlzdGVuZXJzKCksIHRoaXMucmVtb3ZlU2Vzc2lvbihlKS50aGVuKCgpID0+IHtcbiAgICAgIHRocm93IHA7XG4gICAgfSkpKS50aGVuKCgpID0+IChjLnJlbW92ZUFsbExpc3RlbmVycygpLCBlKSk7XG4gIH1cbiAgZ2V0S2V5U3RhdHVzZXMoZSkge1xuICAgIGNvbnN0IHQgPSB7fTtcbiAgICByZXR1cm4gZS5tZWRpYUtleXNTZXNzaW9uLmtleVN0YXR1c2VzLmZvckVhY2goKHIsIG4pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgbiA9PSBcInN0cmluZ1wiICYmIHR5cGVvZiByID09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY29uc3QgYSA9IG47XG4gICAgICAgIG4gPSByLCByID0gYTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGkgPSBcImJ1ZmZlclwiIGluIG4gPyBuZXcgVWludDhBcnJheShuLmJ1ZmZlciwgbi5ieXRlT2Zmc2V0LCBuLmJ5dGVMZW5ndGgpIDogbmV3IFVpbnQ4QXJyYXkobik7XG4gICAgICBlLmtleVN5c3RlbSA9PT0gbXQuUExBWVJFQURZICYmIGkubGVuZ3RoID09PSAxNiAmJiB6ZyhpKTtcbiAgICAgIGNvbnN0IG8gPSBmcihpKTtcbiAgICAgIHIgPT09IFwiaW50ZXJuYWwtZXJyb3JcIiAmJiAodGhpcy5iYW5uZWRLZXlJZHNbb10gPSByKSwgdGhpcy5sb2coYGtleSBzdGF0dXMgY2hhbmdlIFwiJHtyfVwiIGZvciBrZXlTdGF0dXNlcyBrZXlJZDogJHtvfSBrZXktc2Vzc2lvbiBcIiR7ZS5tZWRpYUtleXNTZXNzaW9uLnNlc3Npb25JZH1cImApLCB0W29dID0gcjtcbiAgICB9KSwgdDtcbiAgfVxuICBmZXRjaFNlcnZlckNlcnRpZmljYXRlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5jb25maWcsIHIgPSB0LmxvYWRlciwgbiA9IG5ldyByKHQpLCBpID0gdGhpcy5nZXRTZXJ2ZXJDZXJ0aWZpY2F0ZVVybChlKTtcbiAgICByZXR1cm4gaSA/ICh0aGlzLmxvZyhgRmV0Y2hpbmcgc2VydmVyIGNlcnRpZmljYXRlIGZvciBcIiR7ZX1cImApLCBuZXcgUHJvbWlzZSgobywgYSkgPT4ge1xuICAgICAgY29uc3QgbCA9IHtcbiAgICAgICAgcmVzcG9uc2VUeXBlOiBcImFycmF5YnVmZmVyXCIsXG4gICAgICAgIHVybDogaVxuICAgICAgfSwgYyA9IHQuY2VydExvYWRQb2xpY3kuZGVmYXVsdCwgdSA9IHtcbiAgICAgICAgbG9hZFBvbGljeTogYyxcbiAgICAgICAgdGltZW91dDogYy5tYXhMb2FkVGltZU1zLFxuICAgICAgICBtYXhSZXRyeTogMCxcbiAgICAgICAgcmV0cnlEZWxheTogMCxcbiAgICAgICAgbWF4UmV0cnlEZWxheTogMFxuICAgICAgfSwgZCA9IHtcbiAgICAgICAgb25TdWNjZXNzOiAoaCwgZiwgcCwgeSkgPT4ge1xuICAgICAgICAgIG8oaC5kYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogKGgsIGYsIHAsIHkpID0+IHtcbiAgICAgICAgICBhKG5ldyB5cih7XG4gICAgICAgICAgICB0eXBlOiB2ZS5LRVlfU1lTVEVNX0VSUk9SLFxuICAgICAgICAgICAgZGV0YWlsczogSi5LRVlfU1lTVEVNX1NFUlZFUl9DRVJUSUZJQ0FURV9SRVFVRVNUX0ZBSUxFRCxcbiAgICAgICAgICAgIGZhdGFsOiAhMCxcbiAgICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiBwLFxuICAgICAgICAgICAgcmVzcG9uc2U6IHR0KHtcbiAgICAgICAgICAgICAgdXJsOiBsLnVybCxcbiAgICAgICAgICAgICAgZGF0YTogdm9pZCAwXG4gICAgICAgICAgICB9LCBoKVxuICAgICAgICAgIH0sIGBcIiR7ZX1cIiBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGZhaWxlZCAoJHtpfSkuIFN0YXR1czogJHtoLmNvZGV9ICgke2gudGV4dH0pYCkpO1xuICAgICAgICB9LFxuICAgICAgICBvblRpbWVvdXQ6IChoLCBmLCBwKSA9PiB7XG4gICAgICAgICAgYShuZXcgeXIoe1xuICAgICAgICAgICAgdHlwZTogdmUuS0VZX1NZU1RFTV9FUlJPUixcbiAgICAgICAgICAgIGRldGFpbHM6IEouS0VZX1NZU1RFTV9TRVJWRVJfQ0VSVElGSUNBVEVfUkVRVUVTVF9GQUlMRUQsXG4gICAgICAgICAgICBmYXRhbDogITAsXG4gICAgICAgICAgICBuZXR3b3JrRGV0YWlsczogcCxcbiAgICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICAgIHVybDogbC51cmwsXG4gICAgICAgICAgICAgIGRhdGE6IHZvaWQgMFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGBcIiR7ZX1cIiBjZXJ0aWZpY2F0ZSByZXF1ZXN0IHRpbWVkIG91dCAoJHtpfSlgKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQWJvcnQ6IChoLCBmLCBwKSA9PiB7XG4gICAgICAgICAgYShuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG4ubG9hZChsLCB1LCBkKTtcbiAgICB9KSkgOiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuICBzZXRNZWRpYUtleXNTZXJ2ZXJDZXJ0aWZpY2F0ZShlLCB0LCByKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChuLCBpKSA9PiB7XG4gICAgICBlLnNldFNlcnZlckNlcnRpZmljYXRlKHIpLnRoZW4oKG8pID0+IHtcbiAgICAgICAgdGhpcy5sb2coYHNldFNlcnZlckNlcnRpZmljYXRlICR7byA/IFwic3VjY2Vzc1wiIDogXCJub3Qgc3VwcG9ydGVkIGJ5IENETVwifSAoJHtyLmJ5dGVMZW5ndGh9KSBvbiBcIiR7dH1cImApLCBuKGUpO1xuICAgICAgfSkuY2F0Y2goKG8pID0+IHtcbiAgICAgICAgaShuZXcgeXIoe1xuICAgICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgICAgZGV0YWlsczogSi5LRVlfU1lTVEVNX1NFUlZFUl9DRVJUSUZJQ0FURV9VUERBVEVfRkFJTEVELFxuICAgICAgICAgIGVycm9yOiBvLFxuICAgICAgICAgIGZhdGFsOiAhMFxuICAgICAgICB9LCBvLm1lc3NhZ2UpKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIHJlbmV3TGljZW5zZShlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdExpY2Vuc2UoZSwgbmV3IFVpbnQ4QXJyYXkodCkpLnRoZW4oKHIpID0+IHRoaXMudXBkYXRlS2V5U2Vzc2lvbihlLCBuZXcgVWludDhBcnJheShyKSkuY2F0Y2goKG4pID0+IHtcbiAgICAgIHRocm93IG5ldyB5cih7XG4gICAgICAgIHR5cGU6IHZlLktFWV9TWVNURU1fRVJST1IsXG4gICAgICAgIGRldGFpbHM6IEouS0VZX1NZU1RFTV9TRVNTSU9OX1VQREFURV9GQUlMRUQsXG4gICAgICAgIGRlY3J5cHRkYXRhOiBlLmRlY3J5cHRkYXRhLFxuICAgICAgICBlcnJvcjogbixcbiAgICAgICAgZmF0YWw6ICExXG4gICAgICB9LCBuLm1lc3NhZ2UpO1xuICAgIH0pKTtcbiAgfVxuICB1bnBhY2tQbGF5UmVhZHlLZXlNZXNzYWdlKGUsIHQpIHtcbiAgICBjb25zdCByID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBuZXcgVWludDE2QXJyYXkodC5idWZmZXIpKTtcbiAgICBpZiAoIXIuaW5jbHVkZXMoXCJQbGF5UmVhZHlLZXlNZXNzYWdlXCIpKVxuICAgICAgcmV0dXJuIGUuc2V0UmVxdWVzdEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQveG1sOyBjaGFyc2V0PXV0Zi04XCIpLCB0O1xuICAgIGNvbnN0IG4gPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKHIsIFwiYXBwbGljYXRpb24veG1sXCIpLCBpID0gbi5xdWVyeVNlbGVjdG9yQWxsKFwiSHR0cEhlYWRlclwiKTtcbiAgICBpZiAoaS5sZW5ndGggPiAwKSB7XG4gICAgICBsZXQgdTtcbiAgICAgIGZvciAobGV0IGQgPSAwLCBoID0gaS5sZW5ndGg7IGQgPCBoOyBkKyspIHtcbiAgICAgICAgdmFyIG8sIGE7XG4gICAgICAgIHUgPSBpW2RdO1xuICAgICAgICBjb25zdCBmID0gKG8gPSB1LnF1ZXJ5U2VsZWN0b3IoXCJuYW1lXCIpKSA9PSBudWxsID8gdm9pZCAwIDogby50ZXh0Q29udGVudCwgcCA9IChhID0gdS5xdWVyeVNlbGVjdG9yKFwidmFsdWVcIikpID09IG51bGwgPyB2b2lkIDAgOiBhLnRleHRDb250ZW50O1xuICAgICAgICBmICYmIHAgJiYgZS5zZXRSZXF1ZXN0SGVhZGVyKGYsIHApO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsID0gbi5xdWVyeVNlbGVjdG9yKFwiQ2hhbGxlbmdlXCIpLCBjID0gbCA9PSBudWxsID8gdm9pZCAwIDogbC50ZXh0Q29udGVudDtcbiAgICBpZiAoIWMpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCA8Q2hhbGxlbmdlPiBpbiBrZXkgbWVzc2FnZVwiKTtcbiAgICByZXR1cm4gaGMoYXRvYihjKSk7XG4gIH1cbiAgc2V0dXBMaWNlbnNlWEhSKGUsIHQsIHIsIG4pIHtcbiAgICBjb25zdCBpID0gdGhpcy5jb25maWcubGljZW5zZVhoclNldHVwO1xuICAgIHJldHVybiBpID8gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICBpZiAoIXIuZGVjcnlwdGRhdGEpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIktleSByZW1vdmVkXCIpO1xuICAgICAgcmV0dXJuIGkuY2FsbCh0aGlzLmhscywgZSwgdCwgciwgbik7XG4gICAgfSkuY2F0Y2goKG8pID0+IHtcbiAgICAgIGlmICghci5kZWNyeXB0ZGF0YSlcbiAgICAgICAgdGhyb3cgbztcbiAgICAgIHJldHVybiBlLm9wZW4oXCJQT1NUXCIsIHQsICEwKSwgaS5jYWxsKHRoaXMuaGxzLCBlLCB0LCByLCBuKTtcbiAgICB9KS50aGVuKChvKSA9PiAoZS5yZWFkeVN0YXRlIHx8IGUub3BlbihcIlBPU1RcIiwgdCwgITApLCB7XG4gICAgICB4aHI6IGUsXG4gICAgICBsaWNlbnNlQ2hhbGxlbmdlOiBvIHx8IG5cbiAgICB9KSkgOiAoZS5vcGVuKFwiUE9TVFwiLCB0LCAhMCksIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICB4aHI6IGUsXG4gICAgICBsaWNlbnNlQ2hhbGxlbmdlOiBuXG4gICAgfSkpO1xuICB9XG4gIHJlcXVlc3RMaWNlbnNlKGUsIHQpIHtcbiAgICBjb25zdCByID0gdGhpcy5jb25maWcua2V5TG9hZFBvbGljeS5kZWZhdWx0O1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgobiwgaSkgPT4ge1xuICAgICAgY29uc3QgbyA9IHRoaXMuZ2V0TGljZW5zZVNlcnZlclVybE9yVGhyb3coZS5rZXlTeXN0ZW0pO1xuICAgICAgdGhpcy5sb2coYFNlbmRpbmcgbGljZW5zZSByZXF1ZXN0IHRvIFVSTDogJHtvfWApO1xuICAgICAgY29uc3QgYSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgYS5yZXNwb25zZVR5cGUgPSBcImFycmF5YnVmZmVyXCIsIGEub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaGxzIHx8ICFlLm1lZGlhS2V5c1Nlc3Npb24pXG4gICAgICAgICAgcmV0dXJuIGkobmV3IEVycm9yKFwiaW52YWxpZCBzdGF0ZVwiKSk7XG4gICAgICAgIGlmIChhLnJlYWR5U3RhdGUgPT09IDQpXG4gICAgICAgICAgaWYgKGEuc3RhdHVzID09PSAyMDApIHtcbiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RMaWNlbnNlRmFpbHVyZUNvdW50ID0gMDtcbiAgICAgICAgICAgIGxldCBsID0gYS5yZXNwb25zZTtcbiAgICAgICAgICAgIHRoaXMubG9nKGBMaWNlbnNlIHJlY2VpdmVkICR7bCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gbC5ieXRlTGVuZ3RoIDogbH1gKTtcbiAgICAgICAgICAgIGNvbnN0IGMgPSB0aGlzLmNvbmZpZy5saWNlbnNlUmVzcG9uc2VDYWxsYmFjaztcbiAgICAgICAgICAgIGlmIChjKVxuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGwgPSBjLmNhbGwodGhpcy5obHMsIGEsIG8sIGUpO1xuICAgICAgICAgICAgICB9IGNhdGNoICh1KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5lcnJvcih1KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgbihsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbCA9IHIuZXJyb3JSZXRyeSwgYyA9IGwgPyBsLm1heE51bVJldHJ5IDogMDtcbiAgICAgICAgICAgIGlmICh0aGlzLl9yZXF1ZXN0TGljZW5zZUZhaWx1cmVDb3VudCsrLCB0aGlzLl9yZXF1ZXN0TGljZW5zZUZhaWx1cmVDb3VudCA+IGMgfHwgYS5zdGF0dXMgPj0gNDAwICYmIGEuc3RhdHVzIDwgNTAwKVxuICAgICAgICAgICAgICBpKG5ldyB5cih7XG4gICAgICAgICAgICAgICAgdHlwZTogdmUuS0VZX1NZU1RFTV9FUlJPUixcbiAgICAgICAgICAgICAgICBkZXRhaWxzOiBKLktFWV9TWVNURU1fTElDRU5TRV9SRVFVRVNUX0ZBSUxFRCxcbiAgICAgICAgICAgICAgICBkZWNyeXB0ZGF0YTogZS5kZWNyeXB0ZGF0YSxcbiAgICAgICAgICAgICAgICBmYXRhbDogITAsXG4gICAgICAgICAgICAgICAgbmV0d29ya0RldGFpbHM6IGEsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgICAgICAgICAgIHVybDogbyxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHZvaWQgMCxcbiAgICAgICAgICAgICAgICAgIGNvZGU6IGEuc3RhdHVzLFxuICAgICAgICAgICAgICAgICAgdGV4dDogYS5zdGF0dXNUZXh0XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9LCBgTGljZW5zZSBSZXF1ZXN0IFhIUiBmYWlsZWQgKCR7b30pLiBTdGF0dXM6ICR7YS5zdGF0dXN9ICgke2Euc3RhdHVzVGV4dH0pYCkpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IHUgPSBjIC0gdGhpcy5fcmVxdWVzdExpY2Vuc2VGYWlsdXJlQ291bnQgKyAxO1xuICAgICAgICAgICAgICB0aGlzLndhcm4oYFJldHJ5aW5nIGxpY2Vuc2UgcmVxdWVzdCwgJHt1fSBhdHRlbXB0cyBsZWZ0YCksIHRoaXMucmVxdWVzdExpY2Vuc2UoZSwgdCkudGhlbihuLCBpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9LCBlLmxpY2Vuc2VYaHIgJiYgZS5saWNlbnNlWGhyLnJlYWR5U3RhdGUgIT09IFhNTEh0dHBSZXF1ZXN0LkRPTkUgJiYgZS5saWNlbnNlWGhyLmFib3J0KCksIGUubGljZW5zZVhociA9IGEsIHRoaXMuc2V0dXBMaWNlbnNlWEhSKGEsIG8sIGUsIHQpLnRoZW4oKHtcbiAgICAgICAgeGhyOiBsLFxuICAgICAgICBsaWNlbnNlQ2hhbGxlbmdlOiBjXG4gICAgICB9KSA9PiB7XG4gICAgICAgIGUua2V5U3lzdGVtID09IG10LlBMQVlSRUFEWSAmJiAoYyA9IHRoaXMudW5wYWNrUGxheVJlYWR5S2V5TWVzc2FnZShsLCBjKSksIGwuc2VuZChjKTtcbiAgICAgIH0pLmNhdGNoKGkpO1xuICAgIH0pO1xuICB9XG4gIG9uRGVzdHJveWluZygpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5fY2xlYXIoKTtcbiAgfVxuICBvbk1lZGlhQXR0YWNoZWQoZSwgdCkge1xuICAgIGlmICghdGhpcy5jb25maWcuZW1lRW5hYmxlZClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByID0gdC5tZWRpYTtcbiAgICB0aGlzLm1lZGlhID0gciwgY3IociwgXCJlbmNyeXB0ZWRcIiwgdGhpcy5vbk1lZGlhRW5jcnlwdGVkKSwgY3IociwgXCJ3YWl0aW5nZm9ya2V5XCIsIHRoaXMub25XYWl0aW5nRm9yS2V5KTtcbiAgfVxuICBvbk1lZGlhRGV0YWNoZWQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubWVkaWE7XG4gICAgZSAmJiAocHIoZSwgXCJlbmNyeXB0ZWRcIiwgdGhpcy5vbk1lZGlhRW5jcnlwdGVkKSwgcHIoZSwgXCJ3YWl0aW5nZm9ya2V5XCIsIHRoaXMub25XYWl0aW5nRm9yS2V5KSwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMubWVkaWFLZXlzID0gbnVsbCk7XG4gIH1cbiAgX2NsZWFyKCkge1xuICAgIHZhciBlO1xuICAgIGlmICh0aGlzLl9yZXF1ZXN0TGljZW5zZUZhaWx1cmVDb3VudCA9IDAsIHRoaXMua2V5SWRUb0tleVNlc3Npb25Qcm9taXNlID0ge30sIHRoaXMuYmFubmVkS2V5SWRzID0ge30sICF0aGlzLm1lZGlhS2V5cyAmJiAhdGhpcy5tZWRpYUtleVNlc3Npb25zLmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB0ID0gdGhpcy5tZWRpYSwgciA9IHRoaXMubWVkaWFLZXlTZXNzaW9ucy5zbGljZSgpO1xuICAgIHRoaXMubWVkaWFLZXlTZXNzaW9ucyA9IFtdLCB0aGlzLm1lZGlhS2V5cyA9IG51bGwsIHlpLmNsZWFyS2V5VXJpVG9LZXlJZE1hcCgpO1xuICAgIGNvbnN0IG4gPSByLmxlbmd0aDtcbiAgICBfbi5DRE1DbGVhbnVwUHJvbWlzZSA9IFByb21pc2UuYWxsKHIubWFwKChpKSA9PiB0aGlzLnJlbW92ZVNlc3Npb24oaSkpLmNvbmNhdCgodCA9PSBudWxsIHx8IChlID0gdC5zZXRNZWRpYUtleXMobnVsbCkpID09IG51bGwgPyB2b2lkIDAgOiBlLmNhdGNoKChpKSA9PiB7XG4gICAgICB0aGlzLmxvZyhgQ291bGQgbm90IGNsZWFyIG1lZGlhIGtleXM6ICR7aX1gKSwgdGhpcy5obHMgJiYgdGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLktFWV9TWVNURU1fREVTVFJPWV9NRURJQV9LRVlTX0VSUk9SLFxuICAgICAgICBmYXRhbDogITEsXG4gICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYENvdWxkIG5vdCBjbGVhciBtZWRpYSBrZXlzOiAke2l9YClcbiAgICAgIH0pO1xuICAgIH0pKSB8fCBQcm9taXNlLnJlc29sdmUoKSkpLmNhdGNoKChpKSA9PiB7XG4gICAgICB0aGlzLmxvZyhgQ291bGQgbm90IGNsb3NlIHNlc3Npb25zIGFuZCBjbGVhciBtZWRpYSBrZXlzOiAke2l9YCksIHRoaXMuaGxzICYmIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICB0eXBlOiB2ZS5PVEhFUl9FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5LRVlfU1lTVEVNX0RFU1RST1lfQ0xPU0VfU0VTU0lPTl9FUlJPUixcbiAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICBlcnJvcjogbmV3IEVycm9yKGBDb3VsZCBub3QgY2xvc2Ugc2Vzc2lvbnMgYW5kIGNsZWFyIG1lZGlhIGtleXM6ICR7aX1gKVxuICAgICAgfSk7XG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICBuICYmIHRoaXMubG9nKFwiZmluaXNoZWQgY2xvc2luZyBrZXkgc2Vzc2lvbnMgYW5kIGNsZWFyaW5nIG1lZGlhIGtleXNcIik7XG4gICAgfSk7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5rZXlGb3JtYXRQcm9taXNlID0gbnVsbCwgdGhpcy5iYW5uZWRLZXlJZHMgPSB7fTtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGVkKGUsIHtcbiAgICBzZXNzaW9uS2V5czogdFxuICB9KSB7XG4gICAgaWYgKCEoIXQgfHwgIXRoaXMuY29uZmlnLmVtZUVuYWJsZWQpICYmICF0aGlzLmtleUZvcm1hdFByb21pc2UpIHtcbiAgICAgIGNvbnN0IHIgPSB0LnJlZHVjZSgobiwgaSkgPT4gKG4uaW5kZXhPZihpLmtleUZvcm1hdCkgPT09IC0xICYmIG4ucHVzaChpLmtleUZvcm1hdCksIG4pLCBbXSk7XG4gICAgICB0aGlzLmxvZyhgU2VsZWN0aW5nIGtleS1zeXN0ZW0gZnJvbSBzZXNzaW9uLWtleXMgJHtyLmpvaW4oXCIsIFwiKX1gKSwgdGhpcy5rZXlGb3JtYXRQcm9taXNlID0gdGhpcy5nZXRLZXlGb3JtYXRQcm9taXNlKHIpO1xuICAgIH1cbiAgfVxuICByZW1vdmVTZXNzaW9uKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBtZWRpYUtleXNTZXNzaW9uOiB0LFxuICAgICAgbGljZW5zZVhocjogcixcbiAgICAgIGRlY3J5cHRkYXRhOiBuXG4gICAgfSA9IGU7XG4gICAgaWYgKHQpIHtcbiAgICAgIHRoaXMubG9nKGBSZW1vdmUgbGljZW5zZXMgYW5kIGtleXMgYW5kIGNsb3NlIHNlc3Npb24gXCIke3Quc2Vzc2lvbklkfVwiIGtleUlkOiAke2ZyKChuID09IG51bGwgPyB2b2lkIDAgOiBuLmtleUlkKSB8fCBbXSl9YCksIGUuX29ubWVzc2FnZSAmJiAodC5yZW1vdmVFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCBlLl9vbm1lc3NhZ2UpLCBlLl9vbm1lc3NhZ2UgPSB2b2lkIDApLCBlLl9vbmtleXN0YXR1c2VzY2hhbmdlICYmICh0LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlzdGF0dXNlc2NoYW5nZVwiLCBlLl9vbmtleXN0YXR1c2VzY2hhbmdlKSwgZS5fb25rZXlzdGF0dXNlc2NoYW5nZSA9IHZvaWQgMCksIHIgJiYgci5yZWFkeVN0YXRlICE9PSBYTUxIdHRwUmVxdWVzdC5ET05FICYmIHIuYWJvcnQoKSwgZS5tZWRpYUtleXNTZXNzaW9uID0gZS5kZWNyeXB0ZGF0YSA9IGUubGljZW5zZVhociA9IHZvaWQgMDtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLm1lZGlhS2V5U2Vzc2lvbnMuaW5kZXhPZihlKTtcbiAgICAgIGkgPiAtMSAmJiB0aGlzLm1lZGlhS2V5U2Vzc2lvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgY29uc3Qge1xuICAgICAgICBrZXlTdGF0dXNUaW1lb3V0czogb1xuICAgICAgfSA9IGU7XG4gICAgICBvICYmIE9iamVjdC5rZXlzKG8pLmZvckVhY2goKGMpID0+IHNlbGYuY2xlYXJUaW1lb3V0KG9bY10pKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJtU3lzdGVtT3B0aW9uczogYVxuICAgICAgfSA9IHRoaXMuY29uZmlnO1xuICAgICAgcmV0dXJuIChqYihhKSA/IG5ldyBQcm9taXNlKChjLCB1KSA9PiB7XG4gICAgICAgIHNlbGYuc2V0VGltZW91dCgoKSA9PiB1KG5ldyBFcnJvcihcIk1lZGlhS2V5U2Vzc2lvbi5yZW1vdmUoKSB0aW1lb3V0XCIpKSwgOGUzKSwgdC5yZW1vdmUoKS50aGVuKGMpLmNhdGNoKHUpO1xuICAgICAgfSkgOiBQcm9taXNlLnJlc29sdmUoKSkuY2F0Y2goKGMpID0+IHtcbiAgICAgICAgdGhpcy5sb2coYENvdWxkIG5vdCByZW1vdmUgc2Vzc2lvbjogJHtjfWApLCB0aGlzLmhscyAmJiB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICB0eXBlOiB2ZS5PVEhFUl9FUlJPUixcbiAgICAgICAgICBkZXRhaWxzOiBKLktFWV9TWVNURU1fREVTVFJPWV9SRU1PVkVfU0VTU0lPTl9FUlJPUixcbiAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihgQ291bGQgbm90IHJlbW92ZSBzZXNzaW9uOiAke2N9YClcbiAgICAgICAgfSk7XG4gICAgICB9KS50aGVuKCgpID0+IHQuY2xvc2UoKSkuY2F0Y2goKGMpID0+IHtcbiAgICAgICAgdGhpcy5sb2coYENvdWxkIG5vdCBjbG9zZSBzZXNzaW9uOiAke2N9YCksIHRoaXMuaGxzICYmIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICAgIGRldGFpbHM6IEouS0VZX1NZU1RFTV9ERVNUUk9ZX0NMT1NFX1NFU1NJT05fRVJST1IsXG4gICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgIGVycm9yOiBuZXcgRXJyb3IoYENvdWxkIG5vdCBjbG9zZSBzZXNzaW9uOiAke2N9YClcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG59XG5fbi5DRE1DbGVhbnVwUHJvbWlzZSA9IHZvaWQgMDtcbmZ1bmN0aW9uIEppKHMpIHtcbiAgaWYgKCFzKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCByZWFkIGtleUlkIG9mIHVuZGVmaW5lZCBkZWNyeXB0ZGF0YVwiKTtcbiAgaWYgKHMua2V5SWQgPT09IG51bGwpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwia2V5SWQgaXMgbnVsbFwiKTtcbiAgcmV0dXJuIGZyKHMua2V5SWQpO1xufVxuZnVuY3Rpb24gbHcocywgZSkge1xuICBpZiAocy5rZXlJZCAmJiBlLm1lZGlhS2V5c1Nlc3Npb24ua2V5U3RhdHVzZXMuaGFzKHMua2V5SWQpKVxuICAgIHJldHVybiBlLm1lZGlhS2V5c1Nlc3Npb24ua2V5U3RhdHVzZXMuZ2V0KHMua2V5SWQpO1xuICBpZiAocy5tYXRjaGVzKGUuZGVjcnlwdGRhdGEpKVxuICAgIHJldHVybiBlLmtleVN0YXR1cztcbn1cbmNsYXNzIHlyIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIodCksIHRoaXMuZGF0YSA9IHZvaWQgMCwgZS5lcnJvciB8fCAoZS5lcnJvciA9IG5ldyBFcnJvcih0KSksIHRoaXMuZGF0YSA9IGUsIGUuZXJyID0gZS5lcnJvcjtcbiAgfVxufVxuZnVuY3Rpb24gWmgocywgZSkge1xuICBjb25zdCB0ID0gcyA9PT0gXCJvdXRwdXQtcmVzdHJpY3RlZFwiLCByID0gdCA/IEouS0VZX1NZU1RFTV9TVEFUVVNfT1VUUFVUX1JFU1RSSUNURUQgOiBKLktFWV9TWVNURU1fU1RBVFVTX0lOVEVSTkFMX0VSUk9SO1xuICByZXR1cm4gbmV3IHlyKHtcbiAgICB0eXBlOiB2ZS5LRVlfU1lTVEVNX0VSUk9SLFxuICAgIGRldGFpbHM6IHIsXG4gICAgZmF0YWw6ICExLFxuICAgIGRlY3J5cHRkYXRhOiBlXG4gIH0sIHQgPyBcIkhEQ1AgbGV2ZWwgb3V0cHV0IHJlc3RyaWN0ZWRcIiA6IGBrZXkgc3RhdHVzIGNoYW5nZWQgdG8gXCIke3N9XCJgKTtcbn1cbmNsYXNzIGN3IHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuaGxzID0gdm9pZCAwLCB0aGlzLmlzVmlkZW9QbGF5YmFja1F1YWxpdHlBdmFpbGFibGUgPSAhMSwgdGhpcy50aW1lciA9IHZvaWQgMCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMubGFzdFRpbWUgPSB2b2lkIDAsIHRoaXMubGFzdERyb3BwZWRGcmFtZXMgPSAwLCB0aGlzLmxhc3REZWNvZGVkRnJhbWVzID0gMCwgdGhpcy5zdHJlYW1Db250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmhscyA9IGUsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICBzZXRTdHJlYW1Db250cm9sbGVyKGUpIHtcbiAgICB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSBlO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuaGxzLm9uKEkuTUVESUFfQVRUQUNISU5HLCB0aGlzLm9uTWVkaWFBdHRhY2hpbmcsIHRoaXMpLCB0aGlzLmhscy5vbihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIHRoaXMuaGxzLm9mZihJLk1FRElBX0FUVEFDSElORywgdGhpcy5vbk1lZGlhQXR0YWNoaW5nLCB0aGlzKSwgdGhpcy5obHMub2ZmKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy50aW1lciAmJiBjbGVhckludGVydmFsKHRoaXMudGltZXIpLCB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5pc1ZpZGVvUGxheWJhY2tRdWFsaXR5QXZhaWxhYmxlID0gITEsIHRoaXMubWVkaWEgPSBudWxsO1xuICB9XG4gIG9uTWVkaWFBdHRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmhscy5jb25maWc7XG4gICAgaWYgKHIuY2FwTGV2ZWxPbkZQU0Ryb3ApIHtcbiAgICAgIGNvbnN0IG4gPSB0Lm1lZGlhIGluc3RhbmNlb2Ygc2VsZi5IVE1MVmlkZW9FbGVtZW50ID8gdC5tZWRpYSA6IG51bGw7XG4gICAgICB0aGlzLm1lZGlhID0gbiwgbiAmJiB0eXBlb2Ygbi5nZXRWaWRlb1BsYXliYWNrUXVhbGl0eSA9PSBcImZ1bmN0aW9uXCIgJiYgKHRoaXMuaXNWaWRlb1BsYXliYWNrUXVhbGl0eUF2YWlsYWJsZSA9ICEwKSwgc2VsZi5jbGVhckludGVydmFsKHRoaXMudGltZXIpLCB0aGlzLnRpbWVyID0gc2VsZi5zZXRJbnRlcnZhbCh0aGlzLmNoZWNrRlBTSW50ZXJ2YWwuYmluZCh0aGlzKSwgci5mcHNEcm9wcGVkTW9uaXRvcmluZ1BlcmlvZCk7XG4gICAgfVxuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoKSB7XG4gICAgdGhpcy5tZWRpYSA9IG51bGw7XG4gIH1cbiAgY2hlY2tGUFMoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBpZiAodCkge1xuICAgICAgaWYgKHRoaXMubGFzdFRpbWUpIHtcbiAgICAgICAgY29uc3QgaSA9IG4gLSB0aGlzLmxhc3RUaW1lLCBvID0gciAtIHRoaXMubGFzdERyb3BwZWRGcmFtZXMsIGEgPSB0IC0gdGhpcy5sYXN0RGVjb2RlZEZyYW1lcywgbCA9IDFlMyAqIG8gLyBpLCBjID0gdGhpcy5obHM7XG4gICAgICAgIGlmIChjLnRyaWdnZXIoSS5GUFNfRFJPUCwge1xuICAgICAgICAgIGN1cnJlbnREcm9wcGVkOiBvLFxuICAgICAgICAgIGN1cnJlbnREZWNvZGVkOiBhLFxuICAgICAgICAgIHRvdGFsRHJvcHBlZEZyYW1lczogclxuICAgICAgICB9KSwgbCA+IDAgJiYgbyA+IGMuY29uZmlnLmZwc0Ryb3BwZWRNb25pdG9yaW5nVGhyZXNob2xkICogYSkge1xuICAgICAgICAgIGxldCB1ID0gYy5jdXJyZW50TGV2ZWw7XG4gICAgICAgICAgYy5sb2dnZXIud2FybihcImRyb3AgRlBTIHJhdGlvIGdyZWF0ZXIgdGhhbiBtYXggYWxsb3dlZCB2YWx1ZSBmb3IgY3VycmVudExldmVsOiBcIiArIHUpLCB1ID4gMCAmJiAoYy5hdXRvTGV2ZWxDYXBwaW5nID09PSAtMSB8fCBjLmF1dG9MZXZlbENhcHBpbmcgPj0gdSkgJiYgKHUgPSB1IC0gMSwgYy50cmlnZ2VyKEkuRlBTX0RST1BfTEVWRUxfQ0FQUElORywge1xuICAgICAgICAgICAgbGV2ZWw6IHUsXG4gICAgICAgICAgICBkcm9wcGVkTGV2ZWw6IGMuY3VycmVudExldmVsXG4gICAgICAgICAgfSksIGMuYXV0b0xldmVsQ2FwcGluZyA9IHUsIHRoaXMuc3RyZWFtQ29udHJvbGxlci5uZXh0TGV2ZWxTd2l0Y2goKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFRpbWUgPSBuLCB0aGlzLmxhc3REcm9wcGVkRnJhbWVzID0gciwgdGhpcy5sYXN0RGVjb2RlZEZyYW1lcyA9IHQ7XG4gICAgfVxuICB9XG4gIGNoZWNrRlBTSW50ZXJ2YWwoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubWVkaWE7XG4gICAgaWYgKGUpXG4gICAgICBpZiAodGhpcy5pc1ZpZGVvUGxheWJhY2tRdWFsaXR5QXZhaWxhYmxlKSB7XG4gICAgICAgIGNvbnN0IHQgPSBlLmdldFZpZGVvUGxheWJhY2tRdWFsaXR5KCk7XG4gICAgICAgIHRoaXMuY2hlY2tGUFMoZSwgdC50b3RhbFZpZGVvRnJhbWVzLCB0LmRyb3BwZWRWaWRlb0ZyYW1lcyk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgdGhpcy5jaGVja0ZQUyhlLCBlLndlYmtpdERlY29kZWRGcmFtZUNvdW50LCBlLndlYmtpdERyb3BwZWRGcmFtZUNvdW50KTtcbiAgfVxufVxuZnVuY3Rpb24gTnAocywgZSkge1xuICBsZXQgdDtcbiAgdHJ5IHtcbiAgICB0ID0gbmV3IEV2ZW50KFwiYWRkdHJhY2tcIik7XG4gIH0gY2F0Y2gge1xuICAgIHQgPSBkb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpLCB0LmluaXRFdmVudChcImFkZHRyYWNrXCIsICExLCAhMSk7XG4gIH1cbiAgdC50cmFjayA9IHMsIGUuZGlzcGF0Y2hFdmVudCh0KTtcbn1cbmZ1bmN0aW9uIFVwKHMsIGUpIHtcbiAgY29uc3QgdCA9IHMubW9kZTtcbiAgaWYgKHQgPT09IFwiZGlzYWJsZWRcIiAmJiAocy5tb2RlID0gXCJoaWRkZW5cIiksIHMuY3VlcyAmJiAhcy5jdWVzLmdldEN1ZUJ5SWQoZS5pZCkpXG4gICAgdHJ5IHtcbiAgICAgIGlmIChzLmFkZEN1ZShlKSwgIXMuY3Vlcy5nZXRDdWVCeUlkKGUuaWQpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGFkZEN1ZSBpcyBmYWlsZWQgZm9yOiAke2V9YCk7XG4gICAgfSBjYXRjaCAocikge1xuICAgICAgcnQuZGVidWcoYFt0ZXh0dHJhY2stdXRpbHNdOiAke3J9YCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBuID0gbmV3IHNlbGYuVGV4dFRyYWNrQ3VlKGUuc3RhcnRUaW1lLCBlLmVuZFRpbWUsIGUudGV4dCk7XG4gICAgICAgIG4uaWQgPSBlLmlkLCBzLmFkZEN1ZShuKTtcbiAgICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgICAgcnQuZGVidWcoYFt0ZXh0dHJhY2stdXRpbHNdOiBMZWdhY3kgVGV4dFRyYWNrQ3VlIGZhbGxiYWNrIGZhaWxlZDogJHtufWApO1xuICAgICAgfVxuICAgIH1cbiAgdCA9PT0gXCJkaXNhYmxlZFwiICYmIChzLm1vZGUgPSB0KTtcbn1cbmZ1bmN0aW9uIFNuKHMsIGUpIHtcbiAgY29uc3QgdCA9IHMubW9kZTtcbiAgaWYgKHQgPT09IFwiZGlzYWJsZWRcIiAmJiAocy5tb2RlID0gXCJoaWRkZW5cIiksIHMuY3VlcylcbiAgICBmb3IgKGxldCByID0gcy5jdWVzLmxlbmd0aDsgci0tOyApXG4gICAgICBlICYmIHMuY3Vlc1tyXS5yZW1vdmVFdmVudExpc3RlbmVyKFwiZW50ZXJcIiwgZSksIHMucmVtb3ZlQ3VlKHMuY3Vlc1tyXSk7XG4gIHQgPT09IFwiZGlzYWJsZWRcIiAmJiAocy5tb2RlID0gdCk7XG59XG5mdW5jdGlvbiBTYyhzLCBlLCB0LCByKSB7XG4gIGNvbnN0IG4gPSBzLm1vZGU7XG4gIGlmIChuID09PSBcImRpc2FibGVkXCIgJiYgKHMubW9kZSA9IFwiaGlkZGVuXCIpLCBzLmN1ZXMgJiYgcy5jdWVzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBpID0gZHcocy5jdWVzLCBlLCB0KTtcbiAgICBmb3IgKGxldCBvID0gMDsgbyA8IGkubGVuZ3RoOyBvKyspXG4gICAgICAoIXIgfHwgcihpW29dKSkgJiYgcy5yZW1vdmVDdWUoaVtvXSk7XG4gIH1cbiAgbiA9PT0gXCJkaXNhYmxlZFwiICYmIChzLm1vZGUgPSBuKTtcbn1cbmZ1bmN0aW9uIHV3KHMsIGUpIHtcbiAgaWYgKGUgPD0gc1swXS5zdGFydFRpbWUpXG4gICAgcmV0dXJuIDA7XG4gIGNvbnN0IHQgPSBzLmxlbmd0aCAtIDE7XG4gIGlmIChlID4gc1t0XS5lbmRUaW1lKVxuICAgIHJldHVybiAtMTtcbiAgbGV0IHIgPSAwLCBuID0gdCwgaTtcbiAgZm9yICg7IHIgPD0gbjsgKVxuICAgIGlmIChpID0gTWF0aC5mbG9vcigobiArIHIpIC8gMiksIGUgPCBzW2ldLnN0YXJ0VGltZSlcbiAgICAgIG4gPSBpIC0gMTtcbiAgICBlbHNlIGlmIChlID4gc1tpXS5zdGFydFRpbWUgJiYgciA8IHQpXG4gICAgICByID0gaSArIDE7XG4gICAgZWxzZVxuICAgICAgcmV0dXJuIGk7XG4gIHJldHVybiBzW3JdLnN0YXJ0VGltZSAtIGUgPCBlIC0gc1tuXS5zdGFydFRpbWUgPyByIDogbjtcbn1cbmZ1bmN0aW9uIGR3KHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IFtdLCBuID0gdXcocywgZSk7XG4gIGlmIChuID4gLTEpXG4gICAgZm9yIChsZXQgaSA9IG4sIG8gPSBzLmxlbmd0aDsgaSA8IG87IGkrKykge1xuICAgICAgY29uc3QgYSA9IHNbaV07XG4gICAgICBpZiAoYS5zdGFydFRpbWUgPj0gZSAmJiBhLmVuZFRpbWUgPD0gdClcbiAgICAgICAgci5wdXNoKGEpO1xuICAgICAgZWxzZSBpZiAoYS5zdGFydFRpbWUgPiB0KVxuICAgICAgICByZXR1cm4gcjtcbiAgICB9XG4gIHJldHVybiByO1xufVxuZnVuY3Rpb24gRW8ocykge1xuICBjb25zdCBlID0gW107XG4gIGZvciAobGV0IHQgPSAwOyB0IDwgcy5sZW5ndGg7IHQrKykge1xuICAgIGNvbnN0IHIgPSBzW3RdO1xuICAgIChyLmtpbmQgPT09IFwic3VidGl0bGVzXCIgfHwgci5raW5kID09PSBcImNhcHRpb25zXCIpICYmIHIubGFiZWwgJiYgZS5wdXNoKHNbdF0pO1xuICB9XG4gIHJldHVybiBlO1xufVxuY2xhc3MgaHcgZXh0ZW5kcyBrdSB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICBzdXBlcihlLCBcInN1YnRpdGxlLXRyYWNrLWNvbnRyb2xsZXJcIiksIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLnRyYWNrcyA9IFtdLCB0aGlzLmdyb3VwSWRzID0gbnVsbCwgdGhpcy50cmFja3NJbkdyb3VwID0gW10sIHRoaXMudHJhY2tJZCA9IC0xLCB0aGlzLmN1cnJlbnRUcmFjayA9IG51bGwsIHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrID0gITAsIHRoaXMucXVldWVkRGVmYXVsdFRyYWNrID0gLTEsIHRoaXMudXNlVGV4dFRyYWNrUG9sbGluZyA9ICExLCB0aGlzLnN1YnRpdGxlUG9sbGluZ0ludGVydmFsID0gLTEsIHRoaXMuX3N1YnRpdGxlRGlzcGxheSA9ICEwLCB0aGlzLmFzeW5jUG9sbFRyYWNrQ2hhbmdlID0gKCkgPT4gdGhpcy5wb2xsVHJhY2tDaGFuZ2UoMCksIHRoaXMub25UZXh0VHJhY2tzQ2hhbmdlZCA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLnVzZVRleHRUcmFja1BvbGxpbmcgfHwgc2VsZi5jbGVhckludGVydmFsKHRoaXMuc3VidGl0bGVQb2xsaW5nSW50ZXJ2YWwpLCAhdGhpcy5tZWRpYSB8fCAhdGhpcy5obHMuY29uZmlnLnJlbmRlclRleHRUcmFja3NOYXRpdmVseSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbGV0IHQgPSBudWxsO1xuICAgICAgY29uc3QgciA9IEVvKHRoaXMubWVkaWEudGV4dFRyYWNrcyk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspXG4gICAgICAgIGlmIChyW2ldLm1vZGUgPT09IFwiaGlkZGVuXCIpXG4gICAgICAgICAgdCA9IHJbaV07XG4gICAgICAgIGVsc2UgaWYgKHJbaV0ubW9kZSA9PT0gXCJzaG93aW5nXCIpIHtcbiAgICAgICAgICB0ID0gcltpXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgY29uc3QgbiA9IHRoaXMuZmluZFRyYWNrRm9yVGV4dFRyYWNrKHQpO1xuICAgICAgdGhpcy5zdWJ0aXRsZVRyYWNrICE9PSBuICYmIHRoaXMuc2V0U3VidGl0bGVUcmFjayhuKTtcbiAgICB9LCB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy50cmFja3MubGVuZ3RoID0gMCwgdGhpcy50cmFja3NJbkdyb3VwLmxlbmd0aCA9IDAsIHRoaXMuY3VycmVudFRyYWNrID0gbnVsbCwgdGhpcy5vblRleHRUcmFja3NDaGFuZ2VkID0gdGhpcy5hc3luY1BvbGxUcmFja0NoYW5nZSA9IG51bGwsIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxuICBnZXQgc3VidGl0bGVEaXNwbGF5KCkge1xuICAgIHJldHVybiB0aGlzLl9zdWJ0aXRsZURpc3BsYXk7XG4gIH1cbiAgc2V0IHN1YnRpdGxlRGlzcGxheShlKSB7XG4gICAgdGhpcy5fc3VidGl0bGVEaXNwbGF5ID0gZSwgdGhpcy50cmFja0lkID4gLTEgJiYgdGhpcy50b2dnbGVUcmFja01vZGVzKCk7XG4gIH1cbiAgcmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZS5vbihJLk1FRElBX0FUVEFDSEVELCB0aGlzLm9uTWVkaWFBdHRhY2hlZCwgdGhpcyksIGUub24oSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5vbk1hbmlmZXN0UGFyc2VkLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTEVWRUxfU1dJVENISU5HLCB0aGlzLm9uTGV2ZWxTd2l0Y2hpbmcsIHRoaXMpLCBlLm9uKEkuU1VCVElUTEVfVFJBQ0tfTE9BREVELCB0aGlzLm9uU3VidGl0bGVUcmFja0xvYWRlZCwgdGhpcyksIGUub24oSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub2ZmKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfUEFSU0VELCB0aGlzLm9uTWFuaWZlc3RQYXJzZWQsIHRoaXMpLCBlLm9mZihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1NXSVRDSElORywgdGhpcy5vbkxldmVsU3dpdGNoaW5nLCB0aGlzKSwgZS5vZmYoSS5TVUJUSVRMRV9UUkFDS19MT0FERUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrTG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKTtcbiAgfVxuICAvLyBMaXN0ZW4gZm9yIHN1YnRpdGxlIHRyYWNrIGNoYW5nZSwgdGhlbiBleHRyYWN0IHRoZSBjdXJyZW50IHRyYWNrIElELlxuICBvbk1lZGlhQXR0YWNoZWQoZSwgdCkge1xuICAgIHRoaXMubWVkaWEgPSB0Lm1lZGlhLCB0aGlzLm1lZGlhICYmICh0aGlzLnF1ZXVlZERlZmF1bHRUcmFjayA+IC0xICYmICh0aGlzLnN1YnRpdGxlVHJhY2sgPSB0aGlzLnF1ZXVlZERlZmF1bHRUcmFjaywgdGhpcy5xdWV1ZWREZWZhdWx0VHJhY2sgPSAtMSksIHRoaXMudXNlVGV4dFRyYWNrUG9sbGluZyA9ICEodGhpcy5tZWRpYS50ZXh0VHJhY2tzICYmIFwib25jaGFuZ2VcIiBpbiB0aGlzLm1lZGlhLnRleHRUcmFja3MpLCB0aGlzLnVzZVRleHRUcmFja1BvbGxpbmcgPyB0aGlzLnBvbGxUcmFja0NoYW5nZSg1MDApIDogdGhpcy5tZWRpYS50ZXh0VHJhY2tzLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgdGhpcy5hc3luY1BvbGxUcmFja0NoYW5nZSkpO1xuICB9XG4gIHBvbGxUcmFja0NoYW5nZShlKSB7XG4gICAgc2VsZi5jbGVhckludGVydmFsKHRoaXMuc3VidGl0bGVQb2xsaW5nSW50ZXJ2YWwpLCB0aGlzLnN1YnRpdGxlUG9sbGluZ0ludGVydmFsID0gc2VsZi5zZXRJbnRlcnZhbCh0aGlzLm9uVGV4dFRyYWNrc0NoYW5nZWQsIGUpO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLm1lZGlhO1xuICAgIGlmICghcilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBuID0gISF0LnRyYW5zZmVyTWVkaWE7XG4gICAgaWYgKHNlbGYuY2xlYXJJbnRlcnZhbCh0aGlzLnN1YnRpdGxlUG9sbGluZ0ludGVydmFsKSwgdGhpcy51c2VUZXh0VHJhY2tQb2xsaW5nIHx8IHIudGV4dFRyYWNrcy5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2hhbmdlXCIsIHRoaXMuYXN5bmNQb2xsVHJhY2tDaGFuZ2UpLCB0aGlzLnRyYWNrSWQgPiAtMSAmJiAodGhpcy5xdWV1ZWREZWZhdWx0VHJhY2sgPSB0aGlzLnRyYWNrSWQpLCB0aGlzLnN1YnRpdGxlVHJhY2sgPSAtMSwgdGhpcy5tZWRpYSA9IG51bGwsIG4pXG4gICAgICByZXR1cm47XG4gICAgRW8oci50ZXh0VHJhY2tzKS5mb3JFYWNoKChvKSA9PiB7XG4gICAgICBTbihvKTtcbiAgICB9KTtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGluZygpIHtcbiAgICB0aGlzLnRyYWNrcyA9IFtdLCB0aGlzLmdyb3VwSWRzID0gbnVsbCwgdGhpcy50cmFja3NJbkdyb3VwID0gW10sIHRoaXMudHJhY2tJZCA9IC0xLCB0aGlzLmN1cnJlbnRUcmFjayA9IG51bGwsIHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrID0gITA7XG4gIH1cbiAgLy8gRmlyZWQgd2hlbmV2ZXIgYSBuZXcgbWFuaWZlc3QgaXMgbG9hZGVkLlxuICBvbk1hbmlmZXN0UGFyc2VkKGUsIHQpIHtcbiAgICB0aGlzLnRyYWNrcyA9IHQuc3VidGl0bGVUcmFja3M7XG4gIH1cbiAgb25TdWJ0aXRsZVRyYWNrTG9hZGVkKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBpZDogcixcbiAgICAgIGdyb3VwSWQ6IG4sXG4gICAgICBkZXRhaWxzOiBpXG4gICAgfSA9IHQsIG8gPSB0aGlzLnRyYWNrc0luR3JvdXBbcl07XG4gICAgaWYgKCFvIHx8IG8uZ3JvdXBJZCAhPT0gbikge1xuICAgICAgdGhpcy53YXJuKGBTdWJ0aXRsZSB0cmFjayB3aXRoIGlkOiR7cn0gYW5kIGdyb3VwOiR7bn0gbm90IGZvdW5kIGluIGFjdGl2ZSBncm91cCAke28gPT0gbnVsbCA/IHZvaWQgMCA6IG8uZ3JvdXBJZH1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYSA9IG8uZGV0YWlscztcbiAgICBvLmRldGFpbHMgPSB0LmRldGFpbHMsIHRoaXMubG9nKGBTdWJ0aXRsZSB0cmFjayAke3J9IFwiJHtvLm5hbWV9XCIgbGFuZzoke28ubGFuZ30gZ3JvdXA6JHtufSBsb2FkZWQgWyR7aS5zdGFydFNOfS0ke2kuZW5kU059XWApLCByID09PSB0aGlzLnRyYWNrSWQgJiYgdGhpcy5wbGF5bGlzdExvYWRlZChyLCB0LCBhKTtcbiAgfVxuICBvbkxldmVsTG9hZGluZyhlLCB0KSB7XG4gICAgdGhpcy5zd2l0Y2hMZXZlbCh0LmxldmVsKTtcbiAgfVxuICBvbkxldmVsU3dpdGNoaW5nKGUsIHQpIHtcbiAgICB0aGlzLnN3aXRjaExldmVsKHQubGV2ZWwpO1xuICB9XG4gIHN3aXRjaExldmVsKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5obHMubGV2ZWxzW2VdO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByID0gdC5zdWJ0aXRsZUdyb3VwcyB8fCBudWxsLCBuID0gdGhpcy5ncm91cElkcztcbiAgICBsZXQgaSA9IHRoaXMuY3VycmVudFRyYWNrO1xuICAgIGlmICghciB8fCAobiA9PSBudWxsID8gdm9pZCAwIDogbi5sZW5ndGgpICE9PSAociA9PSBudWxsID8gdm9pZCAwIDogci5sZW5ndGgpIHx8IHIgIT0gbnVsbCAmJiByLnNvbWUoKG8pID0+IChuID09IG51bGwgPyB2b2lkIDAgOiBuLmluZGV4T2YobykpID09PSAtMSkpIHtcbiAgICAgIHRoaXMuZ3JvdXBJZHMgPSByLCB0aGlzLnRyYWNrSWQgPSAtMSwgdGhpcy5jdXJyZW50VHJhY2sgPSBudWxsO1xuICAgICAgY29uc3QgbyA9IHRoaXMudHJhY2tzLmZpbHRlcigodSkgPT4gIXIgfHwgci5pbmRleE9mKHUuZ3JvdXBJZCkgIT09IC0xKTtcbiAgICAgIGlmIChvLmxlbmd0aClcbiAgICAgICAgdGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgJiYgIW8uc29tZSgodSkgPT4gdS5kZWZhdWx0KSAmJiAodGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgPSAhMSksIG8uZm9yRWFjaCgodSwgZCkgPT4ge1xuICAgICAgICAgIHUuaWQgPSBkO1xuICAgICAgICB9KTtcbiAgICAgIGVsc2UgaWYgKCFpICYmICF0aGlzLnRyYWNrc0luR3JvdXAubGVuZ3RoKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnRyYWNrc0luR3JvdXAgPSBvO1xuICAgICAgY29uc3QgYSA9IHRoaXMuaGxzLmNvbmZpZy5zdWJ0aXRsZVByZWZlcmVuY2U7XG4gICAgICBpZiAoIWkgJiYgYSkge1xuICAgICAgICB0aGlzLnNlbGVjdERlZmF1bHRUcmFjayA9ICExO1xuICAgICAgICBjb25zdCB1ID0gV3IoYSwgbyk7XG4gICAgICAgIGlmICh1ID4gLTEpXG4gICAgICAgICAgaSA9IG9bdV07XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGQgPSBXcihhLCB0aGlzLnRyYWNrcyk7XG4gICAgICAgICAgaSA9IHRoaXMudHJhY2tzW2RdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsZXQgbCA9IHRoaXMuZmluZFRyYWNrSWQoaSk7XG4gICAgICBsID09PSAtMSAmJiBpICYmIChsID0gdGhpcy5maW5kVHJhY2tJZChudWxsKSk7XG4gICAgICBjb25zdCBjID0ge1xuICAgICAgICBzdWJ0aXRsZVRyYWNrczogb1xuICAgICAgfTtcbiAgICAgIHRoaXMubG9nKGBVcGRhdGluZyBzdWJ0aXRsZSB0cmFja3MsICR7by5sZW5ndGh9IHRyYWNrKHMpIGZvdW5kIGluIFwiJHtyID09IG51bGwgPyB2b2lkIDAgOiByLmpvaW4oXCIsXCIpfVwiIGdyb3VwLWlkYCksIHRoaXMuaGxzLnRyaWdnZXIoSS5TVUJUSVRMRV9UUkFDS1NfVVBEQVRFRCwgYyksIGwgIT09IC0xICYmIHRoaXMudHJhY2tJZCA9PT0gLTEgJiYgdGhpcy5zZXRTdWJ0aXRsZVRyYWNrKGwpO1xuICAgIH1cbiAgfVxuICBmaW5kVHJhY2tJZChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMudHJhY2tzSW5Hcm91cCwgciA9IHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykge1xuICAgICAgY29uc3QgaSA9IHRbbl07XG4gICAgICBpZiAoIShyICYmICFpLmRlZmF1bHQgfHwgIXIgJiYgIWUpICYmICghZSB8fCBxcyhpLCBlKSkpXG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBpZiAoZSkge1xuICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0Lmxlbmd0aDsgbisrKSB7XG4gICAgICAgIGNvbnN0IGkgPSB0W25dO1xuICAgICAgICBpZiAoU2koZS5hdHRycywgaS5hdHRycywgW1wiTEFOR1VBR0VcIiwgXCJBU1NPQy1MQU5HVUFHRVwiLCBcIkNIQVJBQ1RFUklTVElDU1wiXSkpXG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHQubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgY29uc3QgaSA9IHRbbl07XG4gICAgICAgIGlmIChTaShlLmF0dHJzLCBpLmF0dHJzLCBbXCJMQU5HVUFHRVwiXSkpXG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBmaW5kVHJhY2tGb3JUZXh0VHJhY2soZSkge1xuICAgIGlmIChlKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy50cmFja3NJbkdyb3VwO1xuICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGNvbnN0IG4gPSB0W3JdO1xuICAgICAgICBpZiAoeWMobiwgZSkpXG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBvbkVycm9yKGUsIHQpIHtcbiAgICB0LmZhdGFsIHx8ICF0LmNvbnRleHQgfHwgdC5jb250ZXh0LnR5cGUgPT09IEtlLlNVQlRJVExFX1RSQUNLICYmIHQuY29udGV4dC5pZCA9PT0gdGhpcy50cmFja0lkICYmICghdGhpcy5ncm91cElkcyB8fCB0aGlzLmdyb3VwSWRzLmluZGV4T2YodC5jb250ZXh0Lmdyb3VwSWQpICE9PSAtMSkgJiYgdGhpcy5jaGVja1JldHJ5KHQpO1xuICB9XG4gIGdldCBhbGxTdWJ0aXRsZVRyYWNrcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmFja3M7XG4gIH1cbiAgLyoqIGdldCBhbHRlcm5hdGUgc3VidGl0bGUgdHJhY2tzIGxpc3QgZnJvbSBwbGF5bGlzdCAqKi9cbiAgZ2V0IHN1YnRpdGxlVHJhY2tzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrc0luR3JvdXA7XG4gIH1cbiAgLyoqIGdldC9zZXQgaW5kZXggb2YgdGhlIHNlbGVjdGVkIHN1YnRpdGxlIHRyYWNrIChiYXNlZCBvbiBpbmRleCBpbiBzdWJ0aXRsZSB0cmFjayBsaXN0cykgKiovXG4gIGdldCBzdWJ0aXRsZVRyYWNrKCkge1xuICAgIHJldHVybiB0aGlzLnRyYWNrSWQ7XG4gIH1cbiAgc2V0IHN1YnRpdGxlVHJhY2soZSkge1xuICAgIHRoaXMuc2VsZWN0RGVmYXVsdFRyYWNrID0gITEsIHRoaXMuc2V0U3VidGl0bGVUcmFjayhlKTtcbiAgfVxuICBzZXRTdWJ0aXRsZU9wdGlvbihlKSB7XG4gICAgaWYgKHRoaXMuaGxzLmNvbmZpZy5zdWJ0aXRsZVByZWZlcmVuY2UgPSBlLCBlKSB7XG4gICAgICBpZiAoZS5pZCA9PT0gLTEpXG4gICAgICAgIHJldHVybiB0aGlzLnNldFN1YnRpdGxlVHJhY2soLTEpLCBudWxsO1xuICAgICAgY29uc3QgdCA9IHRoaXMuYWxsU3VidGl0bGVUcmFja3M7XG4gICAgICBpZiAodGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgPSAhMSwgdC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgciA9IHRoaXMuY3VycmVudFRyYWNrO1xuICAgICAgICBpZiAociAmJiBxcyhlLCByKSlcbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgY29uc3QgbiA9IFdyKGUsIHRoaXMudHJhY2tzSW5Hcm91cCk7XG4gICAgICAgIGlmIChuID4gLTEpIHtcbiAgICAgICAgICBjb25zdCBpID0gdGhpcy50cmFja3NJbkdyb3VwW25dO1xuICAgICAgICAgIHJldHVybiB0aGlzLnNldFN1YnRpdGxlVHJhY2sobiksIGk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBpID0gV3IoZSwgdCk7XG4gICAgICAgICAgICBpZiAoaSA+IC0xKVxuICAgICAgICAgICAgICByZXR1cm4gdFtpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgbG9hZFBsYXlsaXN0KGUpIHtcbiAgICBzdXBlci5sb2FkUGxheWxpc3QoKSwgdGhpcy5zaG91bGRMb2FkUGxheWxpc3QodGhpcy5jdXJyZW50VHJhY2spICYmIHRoaXMuc2NoZWR1bGVMb2FkaW5nKHRoaXMuY3VycmVudFRyYWNrLCBlKTtcbiAgfVxuICBsb2FkaW5nUGxheWxpc3QoZSwgdCkge1xuICAgIHN1cGVyLmxvYWRpbmdQbGF5bGlzdChlLCB0KTtcbiAgICBjb25zdCByID0gZS5pZCwgbiA9IGUuZ3JvdXBJZCwgaSA9IHRoaXMuZ2V0VXJsV2l0aERpcmVjdGl2ZXMoZS51cmwsIHQpLCBvID0gZS5kZXRhaWxzLCBhID0gbyA9PSBudWxsID8gdm9pZCAwIDogby5hZ2U7XG4gICAgdGhpcy5sb2coYExvYWRpbmcgc3VidGl0bGUgJHtyfSBcIiR7ZS5uYW1lfVwiIGxhbmc6JHtlLmxhbmd9IGdyb3VwOiR7bn0keyh0ID09IG51bGwgPyB2b2lkIDAgOiB0Lm1zbikgIT09IHZvaWQgMCA/IFwiIGF0IHNuIFwiICsgdC5tc24gKyBcIiBwYXJ0IFwiICsgdC5wYXJ0IDogXCJcIn0ke2EgJiYgby5saXZlID8gXCIgYWdlIFwiICsgYS50b0ZpeGVkKDEpICsgKG8udHlwZSAmJiBcIiBcIiArIG8udHlwZSB8fCBcIlwiKSA6IFwiXCJ9ICR7aX1gKSwgdGhpcy5obHMudHJpZ2dlcihJLlNVQlRJVExFX1RSQUNLX0xPQURJTkcsIHtcbiAgICAgIHVybDogaSxcbiAgICAgIGlkOiByLFxuICAgICAgZ3JvdXBJZDogbixcbiAgICAgIGRlbGl2ZXJ5RGlyZWN0aXZlczogdCB8fCBudWxsLFxuICAgICAgdHJhY2s6IGVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogRGlzYWJsZXMgdGhlIG9sZCBzdWJ0aXRsZVRyYWNrIGFuZCBzZXRzIGN1cnJlbnQgbW9kZSBvbiB0aGUgbmV4dCBzdWJ0aXRsZVRyYWNrLlxuICAgKiBUaGlzIG9wZXJhdGVzIG9uIHRoZSBET00gdGV4dFRyYWNrcy5cbiAgICogQSB2YWx1ZSBvZiAtMSB3aWxsIGRpc2FibGUgYWxsIHN1YnRpdGxlIHRyYWNrcy5cbiAgICovXG4gIHRvZ2dsZVRyYWNrTW9kZXMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IGVcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdCA9IEVvKGUudGV4dFRyYWNrcyksIHIgPSB0aGlzLmN1cnJlbnRUcmFjaztcbiAgICBsZXQgbjtcbiAgICBpZiAociAmJiAobiA9IHQuZmlsdGVyKChpKSA9PiB5YyhyLCBpKSlbMF0sIG4gfHwgdGhpcy53YXJuKGBVbmFibGUgdG8gZmluZCBzdWJ0aXRsZSBUZXh0VHJhY2sgd2l0aCBuYW1lIFwiJHtyLm5hbWV9XCIgYW5kIGxhbmd1YWdlIFwiJHtyLmxhbmd9XCJgKSksIFtdLnNsaWNlLmNhbGwodCkuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgaS5tb2RlICE9PSBcImRpc2FibGVkXCIgJiYgaSAhPT0gbiAmJiAoaS5tb2RlID0gXCJkaXNhYmxlZFwiKTtcbiAgICB9KSwgbikge1xuICAgICAgY29uc3QgaSA9IHRoaXMuc3VidGl0bGVEaXNwbGF5ID8gXCJzaG93aW5nXCIgOiBcImhpZGRlblwiO1xuICAgICAgbi5tb2RlICE9PSBpICYmIChuLm1vZGUgPSBpKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciB2YWxpZGF0aW5nIHRoZSBzdWJ0aXRsZSBpbmRleCBhbmQgcGVyaW9kaWNhbGx5IHJlbG9hZGluZyBpZiBsaXZlLlxuICAgKiBEaXNwYXRjaGVzIHRoZSBTVUJUSVRMRV9UUkFDS19TV0lUQ0ggZXZlbnQsIHdoaWNoIGluc3RydWN0cyB0aGUgc3VidGl0bGUtc3RyZWFtLWNvbnRyb2xsZXIgdG8gbG9hZCB0aGUgc2VsZWN0ZWQgdHJhY2suXG4gICAqL1xuICBzZXRTdWJ0aXRsZVRyYWNrKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy50cmFja3NJbkdyb3VwO1xuICAgIGlmICghdGhpcy5tZWRpYSkge1xuICAgICAgdGhpcy5xdWV1ZWREZWZhdWx0VHJhY2sgPSBlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZSA8IC0xIHx8IGUgPj0gdC5sZW5ndGggfHwgIXVlKGUpKSB7XG4gICAgICB0aGlzLndhcm4oYEludmFsaWQgc3VidGl0bGUgdHJhY2sgaWQ6ICR7ZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3REZWZhdWx0VHJhY2sgPSAhMTtcbiAgICBjb25zdCByID0gdGhpcy5jdXJyZW50VHJhY2ssIG4gPSB0W2VdIHx8IG51bGw7XG4gICAgaWYgKHRoaXMudHJhY2tJZCA9IGUsIHRoaXMuY3VycmVudFRyYWNrID0gbiwgdGhpcy50b2dnbGVUcmFja01vZGVzKCksICFuKSB7XG4gICAgICB0aGlzLmhscy50cmlnZ2VyKEkuU1VCVElUTEVfVFJBQ0tfU1dJVENILCB7XG4gICAgICAgIGlkOiBlXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaSA9ICEhbi5kZXRhaWxzICYmICFuLmRldGFpbHMubGl2ZTtcbiAgICBpZiAoZSA9PT0gdGhpcy50cmFja0lkICYmIG4gPT09IHIgJiYgaSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmxvZyhgU3dpdGNoaW5nIHRvIHN1YnRpdGxlLXRyYWNrICR7ZX1gICsgKG4gPyBgIFwiJHtuLm5hbWV9XCIgbGFuZzoke24ubGFuZ30gZ3JvdXA6JHtuLmdyb3VwSWR9YCA6IFwiXCIpKTtcbiAgICBjb25zdCB7XG4gICAgICBpZDogbyxcbiAgICAgIGdyb3VwSWQ6IGEgPSBcIlwiLFxuICAgICAgbmFtZTogbCxcbiAgICAgIHR5cGU6IGMsXG4gICAgICB1cmw6IHVcbiAgICB9ID0gbjtcbiAgICB0aGlzLmhscy50cmlnZ2VyKEkuU1VCVElUTEVfVFJBQ0tfU1dJVENILCB7XG4gICAgICBpZDogbyxcbiAgICAgIGdyb3VwSWQ6IGEsXG4gICAgICBuYW1lOiBsLFxuICAgICAgdHlwZTogYyxcbiAgICAgIHVybDogdVxuICAgIH0pO1xuICAgIGNvbnN0IGQgPSB0aGlzLnN3aXRjaFBhcmFtcyhuLnVybCwgciA9PSBudWxsID8gdm9pZCAwIDogci5kZXRhaWxzLCBuLmRldGFpbHMpO1xuICAgIHRoaXMubG9hZFBsYXlsaXN0KGQpO1xuICB9XG59XG5mdW5jdGlvbiBmdygpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgfSBjYXRjaCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGUgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKCkpLCB0ID0gZS50b1N0cmluZygpO1xuICAgICAgcmV0dXJuIFVSTC5yZXZva2VPYmplY3RVUkwoZSksIHQuc2xpY2UodC5sYXN0SW5kZXhPZihcIi9cIikgKyAxKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGxldCB0ID0gKC8qIEBfX1BVUkVfXyAqLyBuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7XG4gICAgICByZXR1cm4gXCJ4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHhcIi5yZXBsYWNlKC9beHldL2csIChuKSA9PiB7XG4gICAgICAgIGNvbnN0IGkgPSAodCArIE1hdGgucmFuZG9tKCkgKiAxNikgJSAxNiB8IDA7XG4gICAgICAgIHJldHVybiB0ID0gTWF0aC5mbG9vcih0IC8gMTYpLCAobiA9PSBcInhcIiA/IGkgOiBpICYgMyB8IDgpLnRvU3RyaW5nKDE2KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gWG4ocykge1xuICBsZXQgZSA9IDUzODEsIHQgPSBzLmxlbmd0aDtcbiAgZm9yICg7IHQ7IClcbiAgICBlID0gZSAqIDMzIF4gcy5jaGFyQ29kZUF0KC0tdCk7XG4gIHJldHVybiAoZSA+Pj4gMCkudG9TdHJpbmcoKTtcbn1cbmNvbnN0IFJuID0gMC4wMjU7XG5sZXQgaWEgPSAvKiBAX19QVVJFX18gKi8gKGZ1bmN0aW9uKHMpIHtcbiAgcmV0dXJuIHNbcy5Qb2ludCA9IDBdID0gXCJQb2ludFwiLCBzW3MuUmFuZ2UgPSAxXSA9IFwiUmFuZ2VcIiwgcztcbn0pKHt9KTtcbmZ1bmN0aW9uIGd3KHMsIGUsIHQpIHtcbiAgcmV0dXJuIGAke3MuaWRlbnRpZmllcn0tJHt0ICsgMX0tJHtYbihlKX1gO1xufVxuY2xhc3MgcHcge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgdGhpcy5iYXNlID0gdm9pZCAwLCB0aGlzLl9kdXJhdGlvbiA9IG51bGwsIHRoaXMuX3RpbWVsaW5lU3RhcnQgPSBudWxsLCB0aGlzLmFwcGVuZEluUGxhY2VEaXNhYmxlZCA9IHZvaWQgMCwgdGhpcy5hcHBlbmRJblBsYWNlU3RhcnRlZCA9IHZvaWQgMCwgdGhpcy5kYXRlUmFuZ2UgPSB2b2lkIDAsIHRoaXMuaGFzUGxheWVkID0gITEsIHRoaXMuY3VtdWxhdGl2ZUR1cmF0aW9uID0gMCwgdGhpcy5yZXN1bWVPZmZzZXQgPSBOYU4sIHRoaXMucGxheW91dExpbWl0ID0gTmFOLCB0aGlzLnJlc3RyaWN0aW9ucyA9IHtcbiAgICAgIHNraXA6ICExLFxuICAgICAganVtcDogITFcbiAgICB9LCB0aGlzLnNuYXBPcHRpb25zID0ge1xuICAgICAgb3V0OiAhMSxcbiAgICAgIGluOiAhMVxuICAgIH0sIHRoaXMuYXNzZXRMaXN0ID0gW10sIHRoaXMuYXNzZXRMaXN0TG9hZGVyID0gdm9pZCAwLCB0aGlzLmFzc2V0TGlzdFJlc3BvbnNlID0gbnVsbCwgdGhpcy5yZXN1bWVBbmNob3IgPSB2b2lkIDAsIHRoaXMuZXJyb3IgPSB2b2lkIDAsIHRoaXMucmVzZXRPblJlc3VtZSA9IHZvaWQgMCwgdGhpcy5iYXNlID0gdCwgdGhpcy5kYXRlUmFuZ2UgPSBlLCB0aGlzLnNldERhdGVSYW5nZShlKTtcbiAgfVxuICBzZXREYXRlUmFuZ2UoZSkge1xuICAgIHRoaXMuZGF0ZVJhbmdlID0gZSwgdGhpcy5yZXN1bWVPZmZzZXQgPSBlLmF0dHIub3B0aW9uYWxGbG9hdChcIlgtUkVTVU1FLU9GRlNFVFwiLCB0aGlzLnJlc3VtZU9mZnNldCksIHRoaXMucGxheW91dExpbWl0ID0gZS5hdHRyLm9wdGlvbmFsRmxvYXQoXCJYLVBMQVlPVVQtTElNSVRcIiwgdGhpcy5wbGF5b3V0TGltaXQpLCB0aGlzLnJlc3RyaWN0aW9ucyA9IGUuYXR0ci5lbnVtZXJhdGVkU3RyaW5nTGlzdChcIlgtUkVTVFJJQ1RcIiwgdGhpcy5yZXN0cmljdGlvbnMpLCB0aGlzLnNuYXBPcHRpb25zID0gZS5hdHRyLmVudW1lcmF0ZWRTdHJpbmdMaXN0KFwiWC1TTkFQXCIsIHRoaXMuc25hcE9wdGlvbnMpO1xuICB9XG4gIHJlc2V0KCkge1xuICAgIHZhciBlO1xuICAgIHRoaXMuYXBwZW5kSW5QbGFjZVN0YXJ0ZWQgPSAhMSwgKGUgPSB0aGlzLmFzc2V0TGlzdExvYWRlcikgPT0gbnVsbCB8fCBlLmRlc3Ryb3koKSwgdGhpcy5hc3NldExpc3RMb2FkZXIgPSB2b2lkIDAsIHRoaXMuc3VwcGxlbWVudHNQcmltYXJ5IHx8ICh0aGlzLmFzc2V0TGlzdFJlc3BvbnNlID0gbnVsbCwgdGhpcy5hc3NldExpc3QgPSBbXSwgdGhpcy5fZHVyYXRpb24gPSBudWxsKTtcbiAgfVxuICBpc0Fzc2V0UGFzdFBsYXlvdXRMaW1pdChlKSB7XG4gICAgdmFyIHQ7XG4gICAgaWYgKGUgPiAwICYmIGUgPj0gdGhpcy5hc3NldExpc3QubGVuZ3RoKVxuICAgICAgcmV0dXJuICEwO1xuICAgIGNvbnN0IHIgPSB0aGlzLnBsYXlvdXRMaW1pdDtcbiAgICByZXR1cm4gZSA8PSAwIHx8IGlzTmFOKHIpID8gITEgOiByID09PSAwID8gITAgOiAoKCh0ID0gdGhpcy5hc3NldExpc3RbZV0pID09IG51bGwgPyB2b2lkIDAgOiB0LnN0YXJ0T2Zmc2V0KSB8fCAwKSA+IHI7XG4gIH1cbiAgZmluZEFzc2V0SW5kZXgoZSkge1xuICAgIHJldHVybiB0aGlzLmFzc2V0TGlzdC5pbmRleE9mKGUpO1xuICB9XG4gIGdldCBpZGVudGlmaWVyKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5pZDtcbiAgfVxuICBnZXQgc3RhcnREYXRlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5zdGFydERhdGU7XG4gIH1cbiAgZ2V0IHN0YXJ0VGltZSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5kYXRlUmFuZ2Uuc3RhcnRUaW1lO1xuICAgIGlmICh0aGlzLnNuYXBPcHRpb25zLm91dCkge1xuICAgICAgY29uc3QgdCA9IHRoaXMuZGF0ZVJhbmdlLnRhZ0FuY2hvcjtcbiAgICAgIGlmICh0KVxuICAgICAgICByZXR1cm4gYmwoZSwgdCk7XG4gICAgfVxuICAgIHJldHVybiBlO1xuICB9XG4gIGdldCBzdGFydE9mZnNldCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdWUucHJlID8gMCA6IHRoaXMuc3RhcnRUaW1lO1xuICB9XG4gIGdldCBzdGFydElzQWxpZ25lZCgpIHtcbiAgICBpZiAodGhpcy5zdGFydFRpbWUgPT09IDAgfHwgdGhpcy5zbmFwT3B0aW9ucy5vdXQpXG4gICAgICByZXR1cm4gITA7XG4gICAgY29uc3QgZSA9IHRoaXMuZGF0ZVJhbmdlLnRhZ0FuY2hvcjtcbiAgICBpZiAoZSkge1xuICAgICAgY29uc3QgdCA9IHRoaXMuZGF0ZVJhbmdlLnN0YXJ0VGltZSwgciA9IGJsKHQsIGUpO1xuICAgICAgcmV0dXJuIHQgLSByIDwgMC4xO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgZ2V0IHJlc3VtcHRpb25PZmZzZXQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMucmVzdW1lT2Zmc2V0LCB0ID0gdWUoZSkgPyBlIDogdGhpcy5kdXJhdGlvbjtcbiAgICByZXR1cm4gdGhpcy5jdW11bGF0aXZlRHVyYXRpb24gKyB0O1xuICB9XG4gIGdldCByZXN1bWVUaW1lKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLnN0YXJ0T2Zmc2V0ICsgdGhpcy5yZXN1bXB0aW9uT2Zmc2V0O1xuICAgIGlmICh0aGlzLnNuYXBPcHRpb25zLmluKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5yZXN1bWVBbmNob3I7XG4gICAgICBpZiAodClcbiAgICAgICAgcmV0dXJuIGJsKGUsIHQpO1xuICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXQgYXBwZW5kSW5QbGFjZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRJblBsYWNlU3RhcnRlZCA/ICEwIDogdGhpcy5hcHBlbmRJblBsYWNlRGlzYWJsZWQgPyAhMSA6ICEhKCF0aGlzLmN1ZS5vbmNlICYmICF0aGlzLmN1ZS5wcmUgJiYgLy8gcHJlcm9sbCBzdGFydHMgYXQgc3RhcnRQb3NpdGlvbiBiZWZvcmUgc3RhcnRQb3NpdGlvbiBpcyBrbm93biAobGl2ZSlcbiAgICB0aGlzLnN0YXJ0SXNBbGlnbmVkICYmIChpc05hTih0aGlzLnBsYXlvdXRMaW1pdCkgJiYgaXNOYU4odGhpcy5yZXN1bWVPZmZzZXQpIHx8IHRoaXMucmVzdW1lT2Zmc2V0ICYmIHRoaXMuZHVyYXRpb24gJiYgTWF0aC5hYnModGhpcy5yZXN1bWVPZmZzZXQgLSB0aGlzLmR1cmF0aW9uKSA8IFJuKSk7XG4gIH1cbiAgc2V0IGFwcGVuZEluUGxhY2UoZSkge1xuICAgIGlmICh0aGlzLmFwcGVuZEluUGxhY2VTdGFydGVkKSB7XG4gICAgICB0aGlzLnJlc2V0T25SZXN1bWUgPSAhZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hcHBlbmRJblBsYWNlRGlzYWJsZWQgPSAhZTtcbiAgfVxuICAvLyBFeHRlbmRlZCB0aW1lbGluZSBzdGFydCB0aW1lXG4gIGdldCB0aW1lbGluZVN0YXJ0KCkge1xuICAgIHJldHVybiB0aGlzLl90aW1lbGluZVN0YXJ0ICE9PSBudWxsID8gdGhpcy5fdGltZWxpbmVTdGFydCA6IHRoaXMuc3RhcnRUaW1lO1xuICB9XG4gIHNldCB0aW1lbGluZVN0YXJ0KGUpIHtcbiAgICB0aGlzLl90aW1lbGluZVN0YXJ0ID0gZTtcbiAgfVxuICBnZXQgZHVyYXRpb24oKSB7XG4gICAgY29uc3QgZSA9IHRoaXMucGxheW91dExpbWl0O1xuICAgIGxldCB0O1xuICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbiAhPT0gbnVsbCA/IHQgPSB0aGlzLl9kdXJhdGlvbiA6IHRoaXMuZGF0ZVJhbmdlLmR1cmF0aW9uID8gdCA9IHRoaXMuZGF0ZVJhbmdlLmR1cmF0aW9uIDogdCA9IHRoaXMuZGF0ZVJhbmdlLnBsYW5uZWREdXJhdGlvbiB8fCAwLCAhaXNOYU4oZSkgJiYgZSA8IHQgJiYgKHQgPSBlKSwgdDtcbiAgfVxuICBzZXQgZHVyYXRpb24oZSkge1xuICAgIHRoaXMuX2R1cmF0aW9uID0gZTtcbiAgfVxuICBnZXQgY3VlKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5jdWU7XG4gIH1cbiAgZ2V0IHRpbWVsaW5lT2NjdXBhbmN5KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5hdHRyW1wiWC1USU1FTElORS1PQ0NVUElFU1wiXSA9PT0gXCJSQU5HRVwiID8gaWEuUmFuZ2UgOiBpYS5Qb2ludDtcbiAgfVxuICBnZXQgc3VwcGxlbWVudHNQcmltYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5hdHRyW1wiWC1USU1FTElORS1TVFlMRVwiXSA9PT0gXCJQUklNQVJZXCI7XG4gIH1cbiAgZ2V0IGNvbnRlbnRNYXlWYXJ5KCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5hdHRyW1wiWC1DT05URU5ULU1BWS1WQVJZXCJdICE9PSBcIk5PXCI7XG4gIH1cbiAgZ2V0IGFzc2V0VXJsKCkge1xuICAgIHJldHVybiB0aGlzLmRhdGVSYW5nZS5hdHRyW1wiWC1BU1NFVC1VUklcIl07XG4gIH1cbiAgZ2V0IGFzc2V0TGlzdFVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRlUmFuZ2UuYXR0cltcIlgtQVNTRVQtTElTVFwiXTtcbiAgfVxuICBnZXQgYmFzZVVybCgpIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlLnVybDtcbiAgfVxuICBnZXQgYXNzZXRMaXN0TG9hZGVkKCkge1xuICAgIHJldHVybiB0aGlzLmFzc2V0TGlzdC5sZW5ndGggPiAwIHx8IHRoaXMuYXNzZXRMaXN0UmVzcG9uc2UgIT09IG51bGw7XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIG13KHRoaXMpO1xuICB9XG59XG5mdW5jdGlvbiBibChzLCBlKSB7XG4gIHJldHVybiBzIC0gZS5zdGFydCA8IGUuZHVyYXRpb24gLyAyICYmICEoTWF0aC5hYnMocyAtIChlLnN0YXJ0ICsgZS5kdXJhdGlvbikpIDwgUm4pID8gZS5zdGFydCA6IGUuc3RhcnQgKyBlLmR1cmF0aW9uO1xufVxuZnVuY3Rpb24gJHAocywgZSwgdCkge1xuICBjb25zdCByID0gbmV3IHNlbGYuVVJMKHMsIHQpO1xuICByZXR1cm4gci5wcm90b2NvbCAhPT0gXCJkYXRhOlwiICYmIHIuc2VhcmNoUGFyYW1zLnNldChcIl9ITFNfcHJpbWFyeV9pZFwiLCBlKSwgcjtcbn1cbmZ1bmN0aW9uIFRsKHMsIGUpIHtcbiAgZm9yICg7ICh0ID0gcy5hc3NldExpc3RbKytlXSkgIT0gbnVsbCAmJiB0LmVycm9yOyApXG4gICAgdmFyIHQ7XG4gIHJldHVybiBlO1xufVxuZnVuY3Rpb24gbXcocykge1xuICByZXR1cm4gYFtcIiR7cy5pZGVudGlmaWVyfVwiICR7cy5jdWUucHJlID8gXCI8cHJlPlwiIDogcy5jdWUucG9zdCA/IFwiPHBvc3Q+XCIgOiBcIlwifSR7cy50aW1lbGluZVN0YXJ0LnRvRml4ZWQoMil9LSR7cy5yZXN1bWVUaW1lLnRvRml4ZWQoMil9XWA7XG59XG5mdW5jdGlvbiB2bihzKSB7XG4gIGNvbnN0IGUgPSBzLnRpbWVsaW5lU3RhcnQsIHQgPSBzLmR1cmF0aW9uIHx8IDA7XG4gIHJldHVybiBgW1wiJHtzLmlkZW50aWZpZXJ9XCIgJHtlLnRvRml4ZWQoMil9LSR7KGUgKyB0KS50b0ZpeGVkKDIpfV1gO1xufVxuY2xhc3MgeXcge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByLCBuKSB7XG4gICAgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuaW50ZXJzdGl0aWFsID0gdm9pZCAwLCB0aGlzLmFzc2V0SXRlbSA9IHZvaWQgMCwgdGhpcy50cmFja3MgPSBudWxsLCB0aGlzLmhhc0RldGFpbHMgPSAhMSwgdGhpcy5tZWRpYUF0dGFjaGVkID0gbnVsbCwgdGhpcy5fY3VycmVudFRpbWUgPSB2b2lkIDAsIHRoaXMuX2J1ZmZlcmVkRW9zVGltZSA9IHZvaWQgMCwgdGhpcy5jaGVja1BsYXlvdXQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJlYWNoZWRQbGF5b3V0KHRoaXMuY3VycmVudFRpbWUpICYmIHRoaXMuaGxzICYmIHRoaXMuaGxzLnRyaWdnZXIoSS5QTEFZT1VUX0xJTUlUX1JFQUNIRUQsIHt9KTtcbiAgICB9O1xuICAgIGNvbnN0IGkgPSB0aGlzLmhscyA9IG5ldyBlKHQpO1xuICAgIHRoaXMuaW50ZXJzdGl0aWFsID0gciwgdGhpcy5hc3NldEl0ZW0gPSBuO1xuICAgIGNvbnN0IG8gPSAoKSA9PiB7XG4gICAgICB0aGlzLmhhc0RldGFpbHMgPSAhMDtcbiAgICB9O1xuICAgIGkub25jZShJLkxFVkVMX0xPQURFRCwgbyksIGkub25jZShJLkFVRElPX1RSQUNLX0xPQURFRCwgbyksIGkub25jZShJLlNVQlRJVExFX1RSQUNLX0xPQURFRCwgbyksIGkub24oSS5NRURJQV9BVFRBQ0hJTkcsIChhLCB7XG4gICAgICBtZWRpYTogbFxuICAgIH0pID0+IHtcbiAgICAgIHRoaXMucmVtb3ZlTWVkaWFMaXN0ZW5lcnMoKSwgdGhpcy5tZWRpYUF0dGFjaGVkID0gbCwgdGhpcy5pbnRlcnN0aXRpYWwucGxheW91dExpbWl0ICYmIChsLmFkZEV2ZW50TGlzdGVuZXIoXCJ0aW1ldXBkYXRlXCIsIHRoaXMuY2hlY2tQbGF5b3V0KSwgdGhpcy5hcHBlbmRJblBsYWNlICYmIGkub24oSS5CVUZGRVJfQVBQRU5ERUQsICgpID0+IHtcbiAgICAgICAgY29uc3QgdSA9IHRoaXMuYnVmZmVyZWRFbmQ7XG4gICAgICAgIHRoaXMucmVhY2hlZFBsYXlvdXQodSkgJiYgKHRoaXMuX2J1ZmZlcmVkRW9zVGltZSA9IHUsIGkudHJpZ2dlcihJLkJVRkZFUkVEX1RPX0VORCwgdm9pZCAwKSk7XG4gICAgICB9KSk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0IGFwcGVuZEluUGxhY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJzdGl0aWFsLmFwcGVuZEluUGxhY2U7XG4gIH1cbiAgbG9hZFNvdXJjZSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHM7XG4gICAgaWYgKGUpXG4gICAgICBpZiAoZS51cmwpXG4gICAgICAgIGUubGV2ZWxzLmxlbmd0aCAmJiAhZS5zdGFydGVkICYmIGUuc3RhcnRMb2FkKC0xLCAhMCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgbGV0IHQgPSB0aGlzLmFzc2V0SXRlbS51cmk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdCA9ICRwKHQsIGUuY29uZmlnLnByaW1hcnlTZXNzaW9uSWQgfHwgXCJcIikuaHJlZjtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgIH1cbiAgICAgICAgZS5sb2FkU291cmNlKHQpO1xuICAgICAgfVxuICB9XG4gIGJ1ZmZlcmVkSW5QbGFjZVRvRW5kKGUpIHtcbiAgICB2YXIgdDtcbiAgICBpZiAoIXRoaXMuYXBwZW5kSW5QbGFjZSlcbiAgICAgIHJldHVybiAhMTtcbiAgICBpZiAoKHQgPSB0aGlzLmhscykgIT0gbnVsbCAmJiB0LmJ1ZmZlcmVkVG9FbmQpXG4gICAgICByZXR1cm4gITA7XG4gICAgaWYgKCFlKVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IHIgPSBNYXRoLm1pbih0aGlzLl9idWZmZXJlZEVvc1RpbWUgfHwgMSAvIDAsIHRoaXMuZHVyYXRpb24pLCBuID0gdGhpcy50aW1lbGluZU9mZnNldCwgaSA9IENlLmJ1ZmZlckluZm8oZSwgbiwgMCk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXNzZXRUaW1lKGkuZW5kKSA+PSByIC0gMC4wMjtcbiAgfVxuICByZWFjaGVkUGxheW91dChlKSB7XG4gICAgY29uc3QgciA9IHRoaXMuaW50ZXJzdGl0aWFsLnBsYXlvdXRMaW1pdDtcbiAgICByZXR1cm4gdGhpcy5zdGFydE9mZnNldCArIGUgPj0gcjtcbiAgfVxuICBnZXQgZGVzdHJveWVkKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAhKChlID0gdGhpcy5obHMpICE9IG51bGwgJiYgZS51c2VyQ29uZmlnKTtcbiAgfVxuICBnZXQgYXNzZXRJZCgpIHtcbiAgICByZXR1cm4gdGhpcy5hc3NldEl0ZW0uaWRlbnRpZmllcjtcbiAgfVxuICBnZXQgaW50ZXJzdGl0aWFsSWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXRJdGVtLnBhcmVudElkZW50aWZpZXI7XG4gIH1cbiAgZ2V0IG1lZGlhKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAoKGUgPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IGUubWVkaWEpIHx8IG51bGw7XG4gIH1cbiAgZ2V0IGJ1ZmZlcmVkRW5kKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLm1lZGlhIHx8IHRoaXMubWVkaWFBdHRhY2hlZDtcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm4gdGhpcy5fYnVmZmVyZWRFb3NUaW1lID8gdGhpcy5fYnVmZmVyZWRFb3NUaW1lIDogdGhpcy5jdXJyZW50VGltZTtcbiAgICBjb25zdCB0ID0gQ2UuYnVmZmVySW5mbyhlLCBlLmN1cnJlbnRUaW1lLCAxZS0zKTtcbiAgICByZXR1cm4gdGhpcy5nZXRBc3NldFRpbWUodC5lbmQpO1xuICB9XG4gIGdldCBjdXJyZW50VGltZSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5tZWRpYSB8fCB0aGlzLm1lZGlhQXR0YWNoZWQ7XG4gICAgcmV0dXJuIGUgPyB0aGlzLmdldEFzc2V0VGltZShlLmN1cnJlbnRUaW1lKSA6IHRoaXMuX2N1cnJlbnRUaW1lIHx8IDA7XG4gIH1cbiAgZ2V0IGR1cmF0aW9uKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmFzc2V0SXRlbS5kdXJhdGlvbjtcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm4gMDtcbiAgICBjb25zdCB0ID0gdGhpcy5pbnRlcnN0aXRpYWwucGxheW91dExpbWl0O1xuICAgIGlmICh0KSB7XG4gICAgICBjb25zdCByID0gdCAtIHRoaXMuc3RhcnRPZmZzZXQ7XG4gICAgICBpZiAociA+IDAgJiYgciA8IGUpXG4gICAgICAgIHJldHVybiByO1xuICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXQgcmVtYWluaW5nKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmR1cmF0aW9uO1xuICAgIHJldHVybiBlID8gTWF0aC5tYXgoMCwgZSAtIHRoaXMuY3VycmVudFRpbWUpIDogMDtcbiAgfVxuICBnZXQgc3RhcnRPZmZzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYXNzZXRJdGVtLnN0YXJ0T2Zmc2V0O1xuICB9XG4gIGdldCB0aW1lbGluZU9mZnNldCgpIHtcbiAgICB2YXIgZTtcbiAgICByZXR1cm4gKChlID0gdGhpcy5obHMpID09IG51bGwgPyB2b2lkIDAgOiBlLmNvbmZpZy50aW1lbGluZU9mZnNldCkgfHwgMDtcbiAgfVxuICBzZXQgdGltZWxpbmVPZmZzZXQoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLnRpbWVsaW5lT2Zmc2V0O1xuICAgIGlmIChlICE9PSB0KSB7XG4gICAgICBjb25zdCByID0gZSAtIHQ7XG4gICAgICBpZiAoTWF0aC5hYnMocikgPiAxIC8gOWU0ICYmIHRoaXMuaGxzKSB7XG4gICAgICAgIGlmICh0aGlzLmhhc0RldGFpbHMpXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHNldCB0aW1lbGluZU9mZnNldCBhZnRlciBwbGF5bGlzdHMgYXJlIGxvYWRlZFwiKTtcbiAgICAgICAgdGhpcy5obHMuY29uZmlnLnRpbWVsaW5lT2Zmc2V0ID0gZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0QXNzZXRUaW1lKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy50aW1lbGluZU9mZnNldCwgciA9IHRoaXMuZHVyYXRpb247XG4gICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KDAsIGUgLSB0KSwgcik7XG4gIH1cbiAgcmVtb3ZlTWVkaWFMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubWVkaWFBdHRhY2hlZDtcbiAgICBlICYmICh0aGlzLl9jdXJyZW50VGltZSA9IGUuY3VycmVudFRpbWUsIHRoaXMuYnVmZmVyU25hcFNob3QoKSwgZS5yZW1vdmVFdmVudExpc3RlbmVyKFwidGltZXVwZGF0ZVwiLCB0aGlzLmNoZWNrUGxheW91dCkpO1xuICB9XG4gIGJ1ZmZlclNuYXBTaG90KCkge1xuICAgIGlmICh0aGlzLm1lZGlhQXR0YWNoZWQpIHtcbiAgICAgIHZhciBlO1xuICAgICAgKGUgPSB0aGlzLmhscykgIT0gbnVsbCAmJiBlLmJ1ZmZlcmVkVG9FbmQgJiYgKHRoaXMuX2J1ZmZlcmVkRW9zVGltZSA9IHRoaXMuYnVmZmVyZWRFbmQpO1xuICAgIH1cbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMucmVtb3ZlTWVkaWFMaXN0ZW5lcnMoKSwgdGhpcy5obHMgJiYgdGhpcy5obHMuZGVzdHJveSgpLCB0aGlzLmhscyA9IG51bGwsIHRoaXMudHJhY2tzID0gdGhpcy5tZWRpYUF0dGFjaGVkID0gdGhpcy5jaGVja1BsYXlvdXQgPSBudWxsO1xuICB9XG4gIGF0dGFjaE1lZGlhKGUpIHtcbiAgICB2YXIgdDtcbiAgICB0aGlzLmxvYWRTb3VyY2UoKSwgKHQgPSB0aGlzLmhscykgPT0gbnVsbCB8fCB0LmF0dGFjaE1lZGlhKGUpO1xuICB9XG4gIGRldGFjaE1lZGlhKCkge1xuICAgIHZhciBlO1xuICAgIHRoaXMucmVtb3ZlTWVkaWFMaXN0ZW5lcnMoKSwgdGhpcy5tZWRpYUF0dGFjaGVkID0gbnVsbCwgKGUgPSB0aGlzLmhscykgPT0gbnVsbCB8fCBlLmRldGFjaE1lZGlhKCk7XG4gIH1cbiAgcmVzdW1lQnVmZmVyaW5nKCkge1xuICAgIHZhciBlO1xuICAgIChlID0gdGhpcy5obHMpID09IG51bGwgfHwgZS5yZXN1bWVCdWZmZXJpbmcoKTtcbiAgfVxuICBwYXVzZUJ1ZmZlcmluZygpIHtcbiAgICB2YXIgZTtcbiAgICAoZSA9IHRoaXMuaGxzKSA9PSBudWxsIHx8IGUucGF1c2VCdWZmZXJpbmcoKTtcbiAgfVxuICB0cmFuc2Zlck1lZGlhKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiB0aGlzLmJ1ZmZlclNuYXBTaG90KCksICgoZSA9IHRoaXMuaGxzKSA9PSBudWxsID8gdm9pZCAwIDogZS50cmFuc2Zlck1lZGlhKCkpIHx8IG51bGw7XG4gIH1cbiAgcmVzZXREZXRhaWxzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmhscztcbiAgICBpZiAoZSAmJiB0aGlzLmhhc0RldGFpbHMpIHtcbiAgICAgIGUuc3RvcExvYWQoKTtcbiAgICAgIGNvbnN0IHQgPSAocikgPT4gZGVsZXRlIHIuZGV0YWlscztcbiAgICAgIGUubGV2ZWxzLmZvckVhY2godCksIGUuYWxsQXVkaW9UcmFja3MuZm9yRWFjaCh0KSwgZS5hbGxTdWJ0aXRsZVRyYWNrcy5mb3JFYWNoKHQpLCB0aGlzLmhhc0RldGFpbHMgPSAhMTtcbiAgICB9XG4gIH1cbiAgb24oZSwgdCwgcikge1xuICAgIHZhciBuO1xuICAgIChuID0gdGhpcy5obHMpID09IG51bGwgfHwgbi5vbihlLCB0KTtcbiAgfVxuICBvbmNlKGUsIHQsIHIpIHtcbiAgICB2YXIgbjtcbiAgICAobiA9IHRoaXMuaGxzKSA9PSBudWxsIHx8IG4ub25jZShlLCB0KTtcbiAgfVxuICBvZmYoZSwgdCwgcikge1xuICAgIHZhciBuO1xuICAgIChuID0gdGhpcy5obHMpID09IG51bGwgfHwgbi5vZmYoZSwgdCk7XG4gIH1cbiAgdG9TdHJpbmcoKSB7XG4gICAgdmFyIGU7XG4gICAgcmV0dXJuIGBIbHNBc3NldFBsYXllcjogJHt2bih0aGlzLmFzc2V0SXRlbSl9ICR7KGUgPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IGUuc2Vzc2lvbklkfSAke3RoaXMuYXBwZW5kSW5QbGFjZSA/IFwiYXBwZW5kLWluLXBsYWNlXCIgOiBcIlwifWA7XG4gIH1cbn1cbmNvbnN0IFhoID0gMC4wMzM7XG5jbGFzcyB2dyBleHRlbmRzIExyIHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHN1cGVyKFwiaW50ZXJzdGl0aWFscy1zY2hlZFwiLCB0KSwgdGhpcy5vblNjaGVkdWxlVXBkYXRlID0gdm9pZCAwLCB0aGlzLmV2ZW50TWFwID0ge30sIHRoaXMuZXZlbnRzID0gbnVsbCwgdGhpcy5pdGVtcyA9IG51bGwsIHRoaXMuZHVyYXRpb25zID0ge1xuICAgICAgcHJpbWFyeTogMCxcbiAgICAgIHBsYXlvdXQ6IDAsXG4gICAgICBpbnRlZ3JhdGVkOiAwXG4gICAgfSwgdGhpcy5vblNjaGVkdWxlVXBkYXRlID0gZTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMucmVzZXQoKSwgdGhpcy5vblNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbiAgfVxuICByZXNldCgpIHtcbiAgICB0aGlzLmV2ZW50TWFwID0ge30sIHRoaXMuc2V0RHVyYXRpb25zKDAsIDAsIDApLCB0aGlzLmV2ZW50cyAmJiB0aGlzLmV2ZW50cy5mb3JFYWNoKChlKSA9PiBlLnJlc2V0KCkpLCB0aGlzLmV2ZW50cyA9IHRoaXMuaXRlbXMgPSBudWxsO1xuICB9XG4gIHJlc2V0RXJyb3JzSW5SYW5nZShlLCB0KSB7XG4gICAgcmV0dXJuIHRoaXMuZXZlbnRzID8gdGhpcy5ldmVudHMucmVkdWNlKChyLCBuKSA9PiBlIDw9IG4uc3RhcnRPZmZzZXQgJiYgdCA+IG4uc3RhcnRPZmZzZXQgPyAoZGVsZXRlIG4uZXJyb3IsIHIgKyAxKSA6IHIsIDApIDogMDtcbiAgfVxuICBnZXQgZHVyYXRpb24oKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuaXRlbXM7XG4gICAgcmV0dXJuIGUgPyBlW2UubGVuZ3RoIC0gMV0uZW5kIDogMDtcbiAgfVxuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLml0ZW1zID8gdGhpcy5pdGVtcy5sZW5ndGggOiAwO1xuICB9XG4gIGdldEV2ZW50KGUpIHtcbiAgICByZXR1cm4gZSAmJiB0aGlzLmV2ZW50TWFwW2VdIHx8IG51bGw7XG4gIH1cbiAgaGFzRXZlbnQoZSkge1xuICAgIHJldHVybiBlIGluIHRoaXMuZXZlbnRNYXA7XG4gIH1cbiAgZmluZEl0ZW1JbmRleChlLCB0KSB7XG4gICAgaWYgKGUuZXZlbnQpXG4gICAgICByZXR1cm4gdGhpcy5maW5kRXZlbnRJbmRleChlLmV2ZW50LmlkZW50aWZpZXIpO1xuICAgIGxldCByID0gLTE7XG4gICAgZS5uZXh0RXZlbnQgPyByID0gdGhpcy5maW5kRXZlbnRJbmRleChlLm5leHRFdmVudC5pZGVudGlmaWVyKSAtIDEgOiBlLnByZXZpb3VzRXZlbnQgJiYgKHIgPSB0aGlzLmZpbmRFdmVudEluZGV4KGUucHJldmlvdXNFdmVudC5pZGVudGlmaWVyKSArIDEpO1xuICAgIGNvbnN0IG4gPSB0aGlzLml0ZW1zO1xuICAgIGlmIChuKVxuICAgICAgZm9yIChuW3JdIHx8ICh0ID09PSB2b2lkIDAgJiYgKHQgPSBlLnN0YXJ0KSwgciA9IHRoaXMuZmluZEl0ZW1JbmRleEF0VGltZSh0KSk7IHIgPj0gMCAmJiAoaSA9IG5bcl0pICE9IG51bGwgJiYgaS5ldmVudDsgKSB7XG4gICAgICAgIHZhciBpO1xuICAgICAgICByLS07XG4gICAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgZmluZEl0ZW1JbmRleEF0VGltZShlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaXRlbXM7XG4gICAgaWYgKHIpXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHIubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgbGV0IGkgPSByW25dO1xuICAgICAgICBpZiAodCAmJiB0ICE9PSBcInByaW1hcnlcIiAmJiAoaSA9IGlbdF0pLCBlID09PSBpLnN0YXJ0IHx8IGUgPiBpLnN0YXJ0ICYmIGUgPCBpLmVuZClcbiAgICAgICAgICByZXR1cm4gbjtcbiAgICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgZmluZEp1bXBSZXN0cmljdGVkSW5kZXgoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLml0ZW1zO1xuICAgIGlmIChyKVxuICAgICAgZm9yIChsZXQgbiA9IGU7IG4gPD0gdCAmJiByW25dOyBuKyspIHtcbiAgICAgICAgY29uc3QgaSA9IHJbbl0uZXZlbnQ7XG4gICAgICAgIGlmIChpICE9IG51bGwgJiYgaS5yZXN0cmljdGlvbnMuanVtcCAmJiAhaS5hcHBlbmRJblBsYWNlKVxuICAgICAgICAgIHJldHVybiBuO1xuICAgICAgfVxuICAgIHJldHVybiAtMTtcbiAgfVxuICBmaW5kRXZlbnRJbmRleChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuaXRlbXM7XG4gICAgaWYgKHQpXG4gICAgICBmb3IgKGxldCBuID0gdC5sZW5ndGg7IG4tLTsgKSB7XG4gICAgICAgIHZhciByO1xuICAgICAgICBpZiAoKChyID0gdFtuXS5ldmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IHIuaWRlbnRpZmllcikgPT09IGUpXG4gICAgICAgICAgcmV0dXJuIG47XG4gICAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGZpbmRBc3NldEluZGV4KGUsIHQpIHtcbiAgICBjb25zdCByID0gZS5hc3NldExpc3QsIG4gPSByLmxlbmd0aDtcbiAgICBpZiAobiA+IDEpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgICAgICBjb25zdCBvID0gcltpXTtcbiAgICAgICAgaWYgKCFvLmVycm9yKSB7XG4gICAgICAgICAgY29uc3QgYSA9IG8udGltZWxpbmVTdGFydDtcbiAgICAgICAgICBpZiAodCA9PT0gYSB8fCB0ID4gYSAmJiAodCA8IGEgKyAoby5kdXJhdGlvbiB8fCAwKSB8fCBpID09PSBuIC0gMSkpXG4gICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIHJldHVybiAwO1xuICB9XG4gIGdldCBhc3NldElkQXRFbmQoKSB7XG4gICAgdmFyIGU7XG4gICAgY29uc3QgdCA9IChlID0gdGhpcy5pdGVtcykgPT0gbnVsbCB8fCAoZSA9IGVbdGhpcy5sZW5ndGggLSAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUuZXZlbnQ7XG4gICAgaWYgKHQpIHtcbiAgICAgIGNvbnN0IHIgPSB0LmFzc2V0TGlzdCwgbiA9IHJbci5sZW5ndGggLSAxXTtcbiAgICAgIGlmIChuKVxuICAgICAgICByZXR1cm4gbi5pZGVudGlmaWVyO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBwYXJzZUludGVyc3RpdGlhbERhdGVSYW5nZXMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBlLm1haW4uZGV0YWlscywge1xuICAgICAgZGF0ZVJhbmdlczogblxuICAgIH0gPSByLCBpID0gdGhpcy5ldmVudHMsIG8gPSB0aGlzLnBhcnNlRGF0ZVJhbmdlcyhuLCB7XG4gICAgICB1cmw6IHIudXJsXG4gICAgfSwgdCksIGEgPSBPYmplY3Qua2V5cyhuKSwgbCA9IGkgPyBpLmZpbHRlcigoYykgPT4gIWEuaW5jbHVkZXMoYy5pZGVudGlmaWVyKSkgOiBbXTtcbiAgICBvLmxlbmd0aCAmJiBvLnNvcnQoKGMsIHUpID0+IHtcbiAgICAgIGNvbnN0IGQgPSBjLmN1ZS5wcmUsIGggPSBjLmN1ZS5wb3N0LCBmID0gdS5jdWUucHJlLCBwID0gdS5jdWUucG9zdDtcbiAgICAgIGlmIChkICYmICFmKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAoZiAmJiAhZCB8fCBoICYmICFwKVxuICAgICAgICByZXR1cm4gMTtcbiAgICAgIGlmIChwICYmICFoKVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgICBpZiAoIWQgJiYgIWYgJiYgIWggJiYgIXApIHtcbiAgICAgICAgY29uc3QgeSA9IGMuc3RhcnRUaW1lLCBFID0gdS5zdGFydFRpbWU7XG4gICAgICAgIGlmICh5ICE9PSBFKVxuICAgICAgICAgIHJldHVybiB5IC0gRTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjLmRhdGVSYW5nZS50YWdPcmRlciAtIHUuZGF0ZVJhbmdlLnRhZ09yZGVyO1xuICAgIH0pLCB0aGlzLmV2ZW50cyA9IG8sIGwuZm9yRWFjaCgoYykgPT4ge1xuICAgICAgdGhpcy5yZW1vdmVFdmVudChjKTtcbiAgICB9KSwgdGhpcy51cGRhdGVTY2hlZHVsZShlLCBsKTtcbiAgfVxuICB1cGRhdGVTY2hlZHVsZShlLCB0ID0gW10sIHIgPSAhMSkge1xuICAgIGNvbnN0IG4gPSB0aGlzLmV2ZW50cyB8fCBbXTtcbiAgICBpZiAobi5sZW5ndGggfHwgdC5sZW5ndGggfHwgdGhpcy5sZW5ndGggPCAyKSB7XG4gICAgICBjb25zdCBpID0gdGhpcy5pdGVtcywgbyA9IHRoaXMucGFyc2VTY2hlZHVsZShuLCBlKTtcbiAgICAgIChyIHx8IHQubGVuZ3RoIHx8IChpID09IG51bGwgPyB2b2lkIDAgOiBpLmxlbmd0aCkgIT09IG8ubGVuZ3RoIHx8IG8uc29tZSgobCwgYykgPT4gTWF0aC5hYnMobC5wbGF5b3V0LnN0YXJ0IC0gaVtjXS5wbGF5b3V0LnN0YXJ0KSA+IDVlLTMgfHwgTWF0aC5hYnMobC5wbGF5b3V0LmVuZCAtIGlbY10ucGxheW91dC5lbmQpID4gNWUtMykpICYmICh0aGlzLml0ZW1zID0gbywgdGhpcy5vblNjaGVkdWxlVXBkYXRlKHQsIGkpKTtcbiAgICB9XG4gIH1cbiAgcGFyc2VEYXRlUmFuZ2VzKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gW10sIGkgPSBPYmplY3Qua2V5cyhlKTtcbiAgICBmb3IgKGxldCBvID0gMDsgbyA8IGkubGVuZ3RoOyBvKyspIHtcbiAgICAgIGNvbnN0IGEgPSBpW29dLCBsID0gZVthXTtcbiAgICAgIGlmIChsLmlzSW50ZXJzdGl0aWFsKSB7XG4gICAgICAgIGxldCBjID0gdGhpcy5ldmVudE1hcFthXTtcbiAgICAgICAgYyA/IGMuc2V0RGF0ZVJhbmdlKGwpIDogKGMgPSBuZXcgcHcobCwgdCksIHRoaXMuZXZlbnRNYXBbYV0gPSBjLCByID09PSAhMSAmJiAoYy5hcHBlbmRJblBsYWNlID0gcikpLCBuLnB1c2goYyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuO1xuICB9XG4gIHBhcnNlU2NoZWR1bGUoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBbXSwgbiA9IHQubWFpbi5kZXRhaWxzLCBpID0gbi5saXZlID8gMSAvIDAgOiBuLmVkZ2U7XG4gICAgbGV0IG8gPSAwO1xuICAgIGlmIChlID0gZS5maWx0ZXIoKGwpID0+ICFsLmVycm9yICYmICEobC5jdWUub25jZSAmJiBsLmhhc1BsYXllZCkpLCBlLmxlbmd0aCkge1xuICAgICAgdGhpcy5yZXNvbHZlT2Zmc2V0cyhlLCB0KTtcbiAgICAgIGxldCBsID0gMCwgYyA9IDA7XG4gICAgICBpZiAoZS5mb3JFYWNoKCh1LCBkKSA9PiB7XG4gICAgICAgIGNvbnN0IGggPSB1LmN1ZS5wcmUsIGYgPSB1LmN1ZS5wb3N0LCBwID0gZVtkIC0gMV0gfHwgbnVsbCwgeSA9IHUuYXBwZW5kSW5QbGFjZSwgRSA9IGYgPyBpIDogdS5zdGFydE9mZnNldCwgYiA9IHUuZHVyYXRpb24sIFIgPSB1LnRpbWVsaW5lT2NjdXBhbmN5ID09PSBpYS5SYW5nZSA/IGIgOiAwLCBBID0gdS5yZXN1bXB0aW9uT2Zmc2V0LCBGID0gKHAgPT0gbnVsbCA/IHZvaWQgMCA6IHAuc3RhcnRUaW1lKSA9PT0gRSwgTSA9IEUgKyB1LmN1bXVsYXRpdmVEdXJhdGlvbjtcbiAgICAgICAgbGV0IEggPSB5ID8gTSArIGIgOiBFICsgQTtcbiAgICAgICAgaWYgKGggfHwgIWYgJiYgRSA8PSAwKSB7XG4gICAgICAgICAgY29uc3QgaiA9IGM7XG4gICAgICAgICAgYyArPSBSLCB1LnRpbWVsaW5lU3RhcnQgPSBNO1xuICAgICAgICAgIGNvbnN0IEMgPSBvO1xuICAgICAgICAgIG8gKz0gYiwgci5wdXNoKHtcbiAgICAgICAgICAgIGV2ZW50OiB1LFxuICAgICAgICAgICAgc3RhcnQ6IE0sXG4gICAgICAgICAgICBlbmQ6IEgsXG4gICAgICAgICAgICBwbGF5b3V0OiB7XG4gICAgICAgICAgICAgIHN0YXJ0OiBDLFxuICAgICAgICAgICAgICBlbmQ6IG9cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBpbnRlZ3JhdGVkOiB7XG4gICAgICAgICAgICAgIHN0YXJ0OiBqLFxuICAgICAgICAgICAgICBlbmQ6IGNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChFIDw9IGkpIHtcbiAgICAgICAgICBpZiAoIUYpIHtcbiAgICAgICAgICAgIGNvbnN0IGsgPSBFIC0gbDtcbiAgICAgICAgICAgIGlmIChrID4gWGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgJCA9IGwsIFcgPSBjO1xuICAgICAgICAgICAgICBjICs9IGs7XG4gICAgICAgICAgICAgIGNvbnN0IF8gPSBvO1xuICAgICAgICAgICAgICBvICs9IGs7XG4gICAgICAgICAgICAgIGNvbnN0IGcgPSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNFdmVudDogZVtkIC0gMV0gfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBuZXh0RXZlbnQ6IHUsXG4gICAgICAgICAgICAgICAgc3RhcnQ6ICQsXG4gICAgICAgICAgICAgICAgZW5kOiAkICsgayxcbiAgICAgICAgICAgICAgICBwbGF5b3V0OiB7XG4gICAgICAgICAgICAgICAgICBzdGFydDogXyxcbiAgICAgICAgICAgICAgICAgIGVuZDogb1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW50ZWdyYXRlZDoge1xuICAgICAgICAgICAgICAgICAgc3RhcnQ6IFcsXG4gICAgICAgICAgICAgICAgICBlbmQ6IGNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHIucHVzaChnKTtcbiAgICAgICAgICAgIH0gZWxzZSBrID4gMCAmJiBwICYmIChwLmN1bXVsYXRpdmVEdXJhdGlvbiArPSBrLCByW3IubGVuZ3RoIC0gMV0uZW5kID0gRSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGYgJiYgKEggPSBNKSwgdS50aW1lbGluZVN0YXJ0ID0gTTtcbiAgICAgICAgICBjb25zdCBqID0gYztcbiAgICAgICAgICBjICs9IFI7XG4gICAgICAgICAgY29uc3QgQyA9IG87XG4gICAgICAgICAgbyArPSBiLCByLnB1c2goe1xuICAgICAgICAgICAgZXZlbnQ6IHUsXG4gICAgICAgICAgICBzdGFydDogTSxcbiAgICAgICAgICAgIGVuZDogSCxcbiAgICAgICAgICAgIHBsYXlvdXQ6IHtcbiAgICAgICAgICAgICAgc3RhcnQ6IEMsXG4gICAgICAgICAgICAgIGVuZDogb1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGludGVncmF0ZWQ6IHtcbiAgICAgICAgICAgICAgc3RhcnQ6IGosXG4gICAgICAgICAgICAgIGVuZDogY1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IEsgPSB1LnJlc3VtZVRpbWU7XG4gICAgICAgIGYgfHwgSyA+IGkgPyBsID0gaSA6IGwgPSBLO1xuICAgICAgfSksIGwgPCBpKSB7XG4gICAgICAgIHZhciBhO1xuICAgICAgICBjb25zdCB1ID0gbCwgZCA9IGMsIGggPSBpIC0gbDtcbiAgICAgICAgYyArPSBoO1xuICAgICAgICBjb25zdCBmID0gbztcbiAgICAgICAgbyArPSBoLCByLnB1c2goe1xuICAgICAgICAgIHByZXZpb3VzRXZlbnQ6ICgoYSA9IHJbci5sZW5ndGggLSAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGEuZXZlbnQpIHx8IG51bGwsXG4gICAgICAgICAgbmV4dEV2ZW50OiBudWxsLFxuICAgICAgICAgIHN0YXJ0OiBsLFxuICAgICAgICAgIGVuZDogdSArIGgsXG4gICAgICAgICAgcGxheW91dDoge1xuICAgICAgICAgICAgc3RhcnQ6IGYsXG4gICAgICAgICAgICBlbmQ6IG9cbiAgICAgICAgICB9LFxuICAgICAgICAgIGludGVncmF0ZWQ6IHtcbiAgICAgICAgICAgIHN0YXJ0OiBkLFxuICAgICAgICAgICAgZW5kOiBjXG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0RHVyYXRpb25zKGksIG8sIGMpO1xuICAgIH0gZWxzZVxuICAgICAgci5wdXNoKHtcbiAgICAgICAgcHJldmlvdXNFdmVudDogbnVsbCxcbiAgICAgICAgbmV4dEV2ZW50OiBudWxsLFxuICAgICAgICBzdGFydDogMCxcbiAgICAgICAgZW5kOiBpLFxuICAgICAgICBwbGF5b3V0OiB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiBpXG4gICAgICAgIH0sXG4gICAgICAgIGludGVncmF0ZWQ6IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IGlcbiAgICAgICAgfVxuICAgICAgfSksIHRoaXMuc2V0RHVyYXRpb25zKGksIGksIGkpO1xuICAgIHJldHVybiByO1xuICB9XG4gIHNldER1cmF0aW9ucyhlLCB0LCByKSB7XG4gICAgdGhpcy5kdXJhdGlvbnMgPSB7XG4gICAgICBwcmltYXJ5OiBlLFxuICAgICAgcGxheW91dDogdCxcbiAgICAgIGludGVncmF0ZWQ6IHJcbiAgICB9O1xuICB9XG4gIHJlc29sdmVPZmZzZXRzKGUsIHQpIHtcbiAgICBjb25zdCByID0gdC5tYWluLmRldGFpbHMsIG4gPSByLmxpdmUgPyAxIC8gMCA6IHIuZWRnZTtcbiAgICBsZXQgaSA9IDAsIG8gPSAtMTtcbiAgICBlLmZvckVhY2goKGEsIGwpID0+IHtcbiAgICAgIGNvbnN0IGMgPSBhLmN1ZS5wcmUsIHUgPSBhLmN1ZS5wb3N0LCBkID0gYyA/IDAgOiB1ID8gbiA6IGEuc3RhcnRUaW1lO1xuICAgICAgdGhpcy51cGRhdGVBc3NldER1cmF0aW9ucyhhKSwgbyA9PT0gZCA/IGEuY3VtdWxhdGl2ZUR1cmF0aW9uID0gaSA6IChpID0gMCwgbyA9IGQpLCAhdSAmJiBhLnNuYXBPcHRpb25zLmluICYmIChhLnJlc3VtZUFuY2hvciA9IEpzKG51bGwsIHIuZnJhZ21lbnRzLCBhLnN0YXJ0T2Zmc2V0ICsgYS5yZXN1bXB0aW9uT2Zmc2V0LCAwLCAwKSB8fCB2b2lkIDApLCBhLmFwcGVuZEluUGxhY2UgJiYgIWEuYXBwZW5kSW5QbGFjZVN0YXJ0ZWQgJiYgKHRoaXMucHJpbWFyeUNhblJlc3VtZUluUGxhY2VBdChhLCB0KSB8fCAoYS5hcHBlbmRJblBsYWNlID0gITEpKSwgIWEuYXBwZW5kSW5QbGFjZSAmJiBsICsgMSA8IGUubGVuZ3RoICYmIGVbbCArIDFdLnN0YXJ0VGltZSAtIGVbbF0ucmVzdW1lVGltZSA8IFhoICYmIChlW2wgKyAxXS5hcHBlbmRJblBsYWNlID0gITEsIGVbbCArIDFdLmFwcGVuZEluUGxhY2UgJiYgdGhpcy53YXJuKGBDb3VsZCBub3QgY2hhbmdlIGFwcGVuZCBzdHJhdGVneSBmb3IgYWJ1dHRpbmcgZXZlbnQgJHthfWApKTtcbiAgICAgIGNvbnN0IGYgPSB1ZShhLnJlc3VtZU9mZnNldCkgPyBhLnJlc3VtZU9mZnNldCA6IGEuZHVyYXRpb247XG4gICAgICBpICs9IGY7XG4gICAgfSk7XG4gIH1cbiAgcHJpbWFyeUNhblJlc3VtZUluUGxhY2VBdChlLCB0KSB7XG4gICAgY29uc3QgciA9IGUucmVzdW1lVGltZSwgbiA9IGUuc3RhcnRUaW1lICsgZS5yZXN1bXB0aW9uT2Zmc2V0O1xuICAgIHJldHVybiBNYXRoLmFicyhyIC0gbikgPiBSbiA/ICh0aGlzLmxvZyhgXCIke2UuaWRlbnRpZmllcn1cIiByZXN1bXB0aW9uICR7cn0gbm90IGFsaWduZWQgd2l0aCBlc3RpbWF0ZWQgdGltZWxpbmUgZW5kICR7bn1gKSwgITEpIDogIU9iamVjdC5rZXlzKHQpLnNvbWUoKG8pID0+IHtcbiAgICAgIGNvbnN0IGEgPSB0W29dLmRldGFpbHMsIGwgPSBhLmVkZ2U7XG4gICAgICBpZiAociA+PSBsKVxuICAgICAgICByZXR1cm4gdGhpcy5sb2coYFwiJHtlLmlkZW50aWZpZXJ9XCIgcmVzdW1wdGlvbiAke3J9IHBhc3QgJHtvfSBwbGF5bGlzdCBlbmQgJHtsfWApLCAhMTtcbiAgICAgIGNvbnN0IGMgPSBKcyhudWxsLCBhLmZyYWdtZW50cywgcik7XG4gICAgICBpZiAoIWMpXG4gICAgICAgIHJldHVybiB0aGlzLmxvZyhgXCIke2UuaWRlbnRpZmllcn1cIiByZXN1bXB0aW9uICR7cn0gZG9lcyBub3QgYWxpZ24gd2l0aCBhbnkgZnJhZ21lbnRzIGluICR7b30gcGxheWxpc3QgKCR7YS5mcmFnU3RhcnR9LSR7YS5mcmFnbWVudEVuZH0pYCksICEwO1xuICAgICAgY29uc3QgdSA9IG8gPT09IFwiYXVkaW9cIiA/IDAuMTc1IDogMDtcbiAgICAgIHJldHVybiBNYXRoLmFicyhjLnN0YXJ0IC0gcikgPCBSbiArIHUgfHwgTWF0aC5hYnMoYy5lbmQgLSByKSA8IFJuICsgdSA/ICExIDogKHRoaXMubG9nKGBcIiR7ZS5pZGVudGlmaWVyfVwiIHJlc3VtcHRpb24gJHtyfSBub3QgYWxpZ25lZCB3aXRoICR7b30gZnJhZ21lbnQgYm91bmRzICgke2Muc3RhcnR9LSR7Yy5lbmR9IHNuOiAke2Muc259IGNjOiAke2MuY2N9KWApLCAhMCk7XG4gICAgfSk7XG4gIH1cbiAgdXBkYXRlQXNzZXREdXJhdGlvbnMoZSkge1xuICAgIGlmICghZS5hc3NldExpc3RMb2FkZWQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdCA9IGUudGltZWxpbmVTdGFydDtcbiAgICBsZXQgciA9IDAsIG4gPSAhMSwgaSA9ICExO1xuICAgIGZvciAobGV0IG8gPSAwOyBvIDwgZS5hc3NldExpc3QubGVuZ3RoOyBvKyspIHtcbiAgICAgIGNvbnN0IGEgPSBlLmFzc2V0TGlzdFtvXSwgbCA9IHQgKyByO1xuICAgICAgYS5zdGFydE9mZnNldCA9IHIsIGEudGltZWxpbmVTdGFydCA9IGwsIG4gfHwgKG4gPSBhLmR1cmF0aW9uID09PSBudWxsKSwgaSB8fCAoaSA9ICEhYS5lcnJvcik7XG4gICAgICBjb25zdCBjID0gYS5lcnJvciA/IDAgOiBhLmR1cmF0aW9uIHx8IDA7XG4gICAgICByICs9IGM7XG4gICAgfVxuICAgIG4gJiYgIWkgPyBlLmR1cmF0aW9uID0gTWF0aC5tYXgociwgZS5kdXJhdGlvbikgOiBlLmR1cmF0aW9uID0gcjtcbiAgfVxuICByZW1vdmVFdmVudChlKSB7XG4gICAgZS5yZXNldCgpLCBkZWxldGUgdGhpcy5ldmVudE1hcFtlLmlkZW50aWZpZXJdO1xuICB9XG59XG5mdW5jdGlvbiBrcihzKSB7XG4gIHJldHVybiBgWyR7cy5ldmVudCA/ICdcIicgKyBzLmV2ZW50LmlkZW50aWZpZXIgKyAnXCInIDogXCJwcmltYXJ5XCJ9OiAke3Muc3RhcnQudG9GaXhlZCgyKX0tJHtzLmVuZC50b0ZpeGVkKDIpfV1gO1xufVxuY2xhc3MgRXcge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuaGxzID0gZTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuaGxzID0gbnVsbDtcbiAgfVxuICBsb2FkQXNzZXRMaXN0KGUsIHQpIHtcbiAgICBjb25zdCByID0gZS5hc3NldExpc3RVcmw7XG4gICAgbGV0IG47XG4gICAgdHJ5IHtcbiAgICAgIG4gPSAkcChyLCB0aGlzLmhscy5zZXNzaW9uSWQsIGUuYmFzZVVybCk7XG4gICAgfSBjYXRjaCAoaCkge1xuICAgICAgY29uc3QgZiA9IHRoaXMuYXNzaWduQXNzZXRMaXN0RXJyb3IoZSwgSi5BU1NFVF9MSVNUX0xPQURfRVJST1IsIGgsIHIpO1xuICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCBmKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdCAmJiBuLnByb3RvY29sICE9PSBcImRhdGE6XCIgJiYgbi5zZWFyY2hQYXJhbXMuc2V0KFwiX0hMU19zdGFydF9vZmZzZXRcIiwgXCJcIiArIHQpO1xuICAgIGNvbnN0IGkgPSB0aGlzLmhscy5jb25maWcsIG8gPSBpLmxvYWRlciwgYSA9IG5ldyBvKGkpLCBsID0ge1xuICAgICAgcmVzcG9uc2VUeXBlOiBcImpzb25cIixcbiAgICAgIHVybDogbi5ocmVmXG4gICAgfSwgYyA9IGkuaW50ZXJzdGl0aWFsQXNzZXRMaXN0TG9hZFBvbGljeS5kZWZhdWx0LCB1ID0ge1xuICAgICAgbG9hZFBvbGljeTogYyxcbiAgICAgIHRpbWVvdXQ6IGMubWF4TG9hZFRpbWVNcyxcbiAgICAgIG1heFJldHJ5OiAwLFxuICAgICAgcmV0cnlEZWxheTogMCxcbiAgICAgIG1heFJldHJ5RGVsYXk6IDBcbiAgICB9LCBkID0ge1xuICAgICAgb25TdWNjZXNzOiAoaCwgZiwgcCwgeSkgPT4ge1xuICAgICAgICBjb25zdCBFID0gaC5kYXRhLCBiID0gRSA9PSBudWxsID8gdm9pZCAwIDogRS5BU1NFVFM7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShiKSkge1xuICAgICAgICAgIGNvbnN0IFIgPSB0aGlzLmFzc2lnbkFzc2V0TGlzdEVycm9yKGUsIEouQVNTRVRfTElTVF9QQVJTSU5HX0VSUk9SLCBuZXcgRXJyb3IoXCJJbnZhbGlkIGludGVyc3RpdGlhbCBhc3NldCBsaXN0XCIpLCBwLnVybCwgZiwgeSk7XG4gICAgICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCBSKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZS5hc3NldExpc3RSZXNwb25zZSA9IEUsIHRoaXMuaGxzLnRyaWdnZXIoSS5BU1NFVF9MSVNUX0xPQURFRCwge1xuICAgICAgICAgIGV2ZW50OiBlLFxuICAgICAgICAgIGFzc2V0TGlzdFJlc3BvbnNlOiBFLFxuICAgICAgICAgIG5ldHdvcmtEZXRhaWxzOiB5XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIG9uRXJyb3I6IChoLCBmLCBwLCB5KSA9PiB7XG4gICAgICAgIGNvbnN0IEUgPSB0aGlzLmFzc2lnbkFzc2V0TGlzdEVycm9yKGUsIEouQVNTRVRfTElTVF9MT0FEX0VSUk9SLCBuZXcgRXJyb3IoYEVycm9yIGxvYWRpbmcgWC1BU1NFVC1MSVNUOiBIVFRQIHN0YXR1cyAke2guY29kZX0gJHtoLnRleHR9ICgke2YudXJsfSlgKSwgZi51cmwsIHksIHApO1xuICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIEUpO1xuICAgICAgfSxcbiAgICAgIG9uVGltZW91dDogKGgsIGYsIHApID0+IHtcbiAgICAgICAgY29uc3QgeSA9IHRoaXMuYXNzaWduQXNzZXRMaXN0RXJyb3IoZSwgSi5BU1NFVF9MSVNUX0xPQURfVElNRU9VVCwgbmV3IEVycm9yKGBUaW1lb3V0IGxvYWRpbmcgWC1BU1NFVC1MSVNUICgke2YudXJsfSlgKSwgZi51cmwsIGgsIHApO1xuICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHkpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGEubG9hZChsLCB1LCBkKSwgdGhpcy5obHMudHJpZ2dlcihJLkFTU0VUX0xJU1RfTE9BRElORywge1xuICAgICAgZXZlbnQ6IGVcbiAgICB9KSwgYTtcbiAgfVxuICBhc3NpZ25Bc3NldExpc3RFcnJvcihlLCB0LCByLCBuLCBpLCBvKSB7XG4gICAgcmV0dXJuIGUuZXJyb3IgPSByLCB7XG4gICAgICB0eXBlOiB2ZS5ORVRXT1JLX0VSUk9SLFxuICAgICAgZGV0YWlsczogdCxcbiAgICAgIGZhdGFsOiAhMSxcbiAgICAgIGludGVyc3RpdGlhbDogZSxcbiAgICAgIHVybDogbixcbiAgICAgIGVycm9yOiByLFxuICAgICAgbmV0d29ya0RldGFpbHM6IG8sXG4gICAgICBzdGF0czogaVxuICAgIH07XG4gIH1cbn1cbmZ1bmN0aW9uIEpoKHMpIHtcbiAgcyA9PSBudWxsIHx8IHMucGxheSgpLmNhdGNoKCgpID0+IHtcbiAgfSk7XG59XG5mdW5jdGlvbiBRaShzLCBlKSB7XG4gIHJldHVybiBgWyR7c31dIEFkdmFuY2luZyB0aW1lbGluZSBwb3NpdGlvbiB0byAke2V9YDtcbn1cbmNsYXNzIHh3IGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIoXCJpbnRlcnN0aXRpYWxzXCIsIGUubG9nZ2VyKSwgdGhpcy5IbHNQbGF5ZXJDbGFzcyA9IHZvaWQgMCwgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMuYXNzZXRMaXN0TG9hZGVyID0gdm9pZCAwLCB0aGlzLm1lZGlhU2VsZWN0aW9uID0gbnVsbCwgdGhpcy5hbHRTZWxlY3Rpb24gPSBudWxsLCB0aGlzLm1lZGlhID0gbnVsbCwgdGhpcy5kZXRhY2hlZERhdGEgPSBudWxsLCB0aGlzLnJlcXVpcmVkVHJhY2tzID0gbnVsbCwgdGhpcy5tYW5hZ2VyID0gbnVsbCwgdGhpcy5wbGF5ZXJRdWV1ZSA9IFtdLCB0aGlzLmJ1ZmZlcmVkUG9zID0gLTEsIHRoaXMudGltZWxpbmVQb3MgPSAtMSwgdGhpcy5zY2hlZHVsZSA9IHZvaWQgMCwgdGhpcy5wbGF5aW5nSXRlbSA9IG51bGwsIHRoaXMuYnVmZmVyaW5nSXRlbSA9IG51bGwsIHRoaXMud2FpdGluZ0l0ZW0gPSBudWxsLCB0aGlzLmVuZGVkSXRlbSA9IG51bGwsIHRoaXMucGxheWluZ0Fzc2V0ID0gbnVsbCwgdGhpcy5lbmRlZEFzc2V0ID0gbnVsbCwgdGhpcy5idWZmZXJpbmdBc3NldCA9IG51bGwsIHRoaXMuc2hvdWxkUGxheSA9ICExLCB0aGlzLm9uUGxheSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2hvdWxkUGxheSA9ICEwO1xuICAgIH0sIHRoaXMub25QYXVzZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2hvdWxkUGxheSA9ICExO1xuICAgIH0sIHRoaXMub25TZWVraW5nID0gKCkgPT4ge1xuICAgICAgY29uc3QgciA9IHRoaXMuY3VycmVudFRpbWU7XG4gICAgICBpZiAociA9PT0gdm9pZCAwIHx8IHRoaXMucGxheWJhY2tEaXNhYmxlZCB8fCAhdGhpcy5zY2hlZHVsZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgbiA9IHIgLSB0aGlzLnRpbWVsaW5lUG9zO1xuICAgICAgaWYgKE1hdGguYWJzKG4pIDwgMSAvIDcwNTZlNSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgbyA9IG4gPD0gLTAuMDE7XG4gICAgICB0aGlzLnRpbWVsaW5lUG9zID0gciwgdGhpcy5idWZmZXJlZFBvcyA9IHI7XG4gICAgICBjb25zdCBhID0gdGhpcy5wbGF5aW5nSXRlbTtcbiAgICAgIGlmICghYSkge1xuICAgICAgICB0aGlzLmNoZWNrQnVmZmVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChvICYmIHRoaXMuc2NoZWR1bGUucmVzZXRFcnJvcnNJblJhbmdlKHIsIHIgLSBuKSAmJiB0aGlzLnVwZGF0ZVNjaGVkdWxlKCEwKSwgdGhpcy5jaGVja0J1ZmZlcigpLCBvICYmIHIgPCBhLnN0YXJ0IHx8IHIgPj0gYS5lbmQpIHtcbiAgICAgICAgdmFyIGw7XG4gICAgICAgIGNvbnN0IGYgPSB0aGlzLmZpbmRJdGVtSW5kZXgoYSk7XG4gICAgICAgIGxldCBwID0gdGhpcy5zY2hlZHVsZS5maW5kSXRlbUluZGV4QXRUaW1lKHIpO1xuICAgICAgICBpZiAocCA9PT0gLTEgJiYgKHAgPSBmICsgKG8gPyAtMSA6IDEpLCB0aGlzLmxvZyhgc2Vla2VkICR7byA/IFwiYmFjayBcIiA6IFwiXCJ9dG8gcG9zaXRpb24gbm90IGNvdmVyZWQgYnkgc2NoZWR1bGUgJHtyfSAocmVzb2x2aW5nIGZyb20gJHtmfSB0byAke3B9KWApKSwgIXRoaXMuaXNJbnRlcnN0aXRpYWwoYSkgJiYgKGwgPSB0aGlzLm1lZGlhKSAhPSBudWxsICYmIGwucGF1c2VkICYmICh0aGlzLnNob3VsZFBsYXkgPSAhMSksICFvICYmIHAgPiBmKSB7XG4gICAgICAgICAgY29uc3QgeSA9IHRoaXMuc2NoZWR1bGUuZmluZEp1bXBSZXN0cmljdGVkSW5kZXgoZiArIDEsIHApO1xuICAgICAgICAgIGlmICh5ID4gZikge1xuICAgICAgICAgICAgdGhpcy5zZXRTY2hlZHVsZVBvc2l0aW9uKHkpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNldFNjaGVkdWxlUG9zaXRpb24ocCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGMgPSB0aGlzLnBsYXlpbmdBc3NldDtcbiAgICAgIGlmICghYykge1xuICAgICAgICBpZiAodGhpcy5wbGF5aW5nTGFzdEl0ZW0gJiYgdGhpcy5pc0ludGVyc3RpdGlhbChhKSkge1xuICAgICAgICAgIGNvbnN0IGYgPSBhLmV2ZW50LmFzc2V0TGlzdFswXTtcbiAgICAgICAgICBmICYmICh0aGlzLmVuZGVkSXRlbSA9IHRoaXMucGxheWluZ0l0ZW0sIHRoaXMucGxheWluZ0l0ZW0gPSBudWxsLCB0aGlzLnNldFNjaGVkdWxlVG9Bc3NldEF0VGltZShyLCBmKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdSA9IGMudGltZWxpbmVTdGFydCwgZCA9IGMuZHVyYXRpb24gfHwgMDtcbiAgICAgIGlmIChvICYmIHIgPCB1IHx8IHIgPj0gdSArIGQpIHtcbiAgICAgICAgdmFyIGg7XG4gICAgICAgIChoID0gYS5ldmVudCkgIT0gbnVsbCAmJiBoLmFwcGVuZEluUGxhY2UgJiYgKHRoaXMuY2xlYXJJbnRlcnN0aXRpYWwoYS5ldmVudCwgYSksIHRoaXMuZmx1c2hGcm9udEJ1ZmZlcihyKSksIHRoaXMuc2V0U2NoZWR1bGVUb0Fzc2V0QXRUaW1lKHIsIGMpO1xuICAgICAgfVxuICAgIH0sIHRoaXMub25UaW1ldXBkYXRlID0gKCkgPT4ge1xuICAgICAgY29uc3QgciA9IHRoaXMuY3VycmVudFRpbWU7XG4gICAgICBpZiAociA9PT0gdm9pZCAwIHx8IHRoaXMucGxheWJhY2tEaXNhYmxlZClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKHIgPiB0aGlzLnRpbWVsaW5lUG9zKVxuICAgICAgICB0aGlzLnRpbWVsaW5lUG9zID0gciwgciA+IHRoaXMuYnVmZmVyZWRQb3MgJiYgdGhpcy5jaGVja0J1ZmZlcigpO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBuID0gdGhpcy5wbGF5aW5nSXRlbTtcbiAgICAgIGlmICghbiB8fCB0aGlzLnBsYXlpbmdMYXN0SXRlbSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKHIgPj0gbi5lbmQpIHtcbiAgICAgICAgdGhpcy50aW1lbGluZVBvcyA9IG4uZW5kO1xuICAgICAgICBjb25zdCBhID0gdGhpcy5maW5kSXRlbUluZGV4KG4pO1xuICAgICAgICB0aGlzLnNldFNjaGVkdWxlUG9zaXRpb24oYSArIDEpO1xuICAgICAgfVxuICAgICAgY29uc3QgaSA9IHRoaXMucGxheWluZ0Fzc2V0O1xuICAgICAgaWYgKCFpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBvID0gaS50aW1lbGluZVN0YXJ0ICsgKGkuZHVyYXRpb24gfHwgMCk7XG4gICAgICByID49IG8gJiYgdGhpcy5zZXRTY2hlZHVsZVRvQXNzZXRBdFRpbWUociwgaSk7XG4gICAgfSwgdGhpcy5vblNjaGVkdWxlVXBkYXRlID0gKHIsIG4pID0+IHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLnNjaGVkdWxlO1xuICAgICAgaWYgKCFpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBvID0gdGhpcy5wbGF5aW5nSXRlbSwgYSA9IGkuZXZlbnRzIHx8IFtdLCBsID0gaS5pdGVtcyB8fCBbXSwgYyA9IGkuZHVyYXRpb25zLCB1ID0gci5tYXAoKHkpID0+IHkuaWRlbnRpZmllciksIGQgPSAhIShhLmxlbmd0aCB8fCB1Lmxlbmd0aCk7XG4gICAgICAoZCB8fCBuKSAmJiB0aGlzLmxvZyhgSU5URVJTVElUSUFMU19VUERBVEVEICgke2EubGVuZ3RofSk6ICR7YX1cblNjaGVkdWxlOiAke2wubWFwKCh5KSA9PiBrcih5KSl9IHBvczogJHt0aGlzLnRpbWVsaW5lUG9zfWApLCB1Lmxlbmd0aCAmJiB0aGlzLmxvZyhgUmVtb3ZlZCBldmVudHMgJHt1fWApO1xuICAgICAgbGV0IGggPSBudWxsLCBmID0gbnVsbDtcbiAgICAgIG8gJiYgKGggPSB0aGlzLnVwZGF0ZUl0ZW0obywgdGhpcy50aW1lbGluZVBvcyksIHRoaXMuaXRlbXNNYXRjaChvLCBoKSA/IHRoaXMucGxheWluZ0l0ZW0gPSBoIDogdGhpcy53YWl0aW5nSXRlbSA9IHRoaXMuZW5kZWRJdGVtID0gbnVsbCksIHRoaXMud2FpdGluZ0l0ZW0gPSB0aGlzLnVwZGF0ZUl0ZW0odGhpcy53YWl0aW5nSXRlbSksIHRoaXMuZW5kZWRJdGVtID0gdGhpcy51cGRhdGVJdGVtKHRoaXMuZW5kZWRJdGVtKTtcbiAgICAgIGNvbnN0IHAgPSB0aGlzLmJ1ZmZlcmluZ0l0ZW07XG4gICAgICBpZiAocCAmJiAoZiA9IHRoaXMudXBkYXRlSXRlbShwLCB0aGlzLmJ1ZmZlcmVkUG9zKSwgdGhpcy5pdGVtc01hdGNoKHAsIGYpID8gdGhpcy5idWZmZXJpbmdJdGVtID0gZiA6IHAuZXZlbnQgJiYgKHRoaXMuYnVmZmVyaW5nSXRlbSA9IHRoaXMucGxheWluZ0l0ZW0sIHRoaXMuY2xlYXJJbnRlcnN0aXRpYWwocC5ldmVudCwgbnVsbCkpKSwgci5mb3JFYWNoKCh5KSA9PiB7XG4gICAgICAgIHkuYXNzZXRMaXN0LmZvckVhY2goKEUpID0+IHtcbiAgICAgICAgICB0aGlzLmNsZWFyQXNzZXRQbGF5ZXIoRS5pZGVudGlmaWVyLCBudWxsKTtcbiAgICAgICAgfSk7XG4gICAgICB9KSwgdGhpcy5wbGF5ZXJRdWV1ZS5mb3JFYWNoKCh5KSA9PiB7XG4gICAgICAgIGlmICh5LmludGVyc3RpdGlhbC5hcHBlbmRJblBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgRSA9IHkuYXNzZXRJdGVtLnRpbWVsaW5lU3RhcnQsIGIgPSB5LnRpbWVsaW5lT2Zmc2V0IC0gRTtcbiAgICAgICAgICBpZiAoYilcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHkudGltZWxpbmVPZmZzZXQgPSBFO1xuICAgICAgICAgICAgfSBjYXRjaCAoUikge1xuICAgICAgICAgICAgICBNYXRoLmFicyhiKSA+IFJuICYmIHRoaXMud2FybihgJHtSfSAoXCIke3kuYXNzZXRJZH1cIiAke3kudGltZWxpbmVPZmZzZXR9LT4ke0V9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSwgZCB8fCBuKSB7XG4gICAgICAgIGlmICh0aGlzLmhscy50cmlnZ2VyKEkuSU5URVJTVElUSUFMU19VUERBVEVELCB7XG4gICAgICAgICAgZXZlbnRzOiBhLnNsaWNlKDApLFxuICAgICAgICAgIHNjaGVkdWxlOiBsLnNsaWNlKDApLFxuICAgICAgICAgIGR1cmF0aW9uczogYyxcbiAgICAgICAgICByZW1vdmVkSWRzOiB1XG4gICAgICAgIH0pLCB0aGlzLmlzSW50ZXJzdGl0aWFsKG8pICYmIHUuaW5jbHVkZXMoby5ldmVudC5pZGVudGlmaWVyKSkge1xuICAgICAgICAgIHRoaXMud2FybihgSW50ZXJzdGl0aWFsIFwiJHtvLmV2ZW50LmlkZW50aWZpZXJ9XCIgcmVtb3ZlZCB3aGlsZSBwbGF5aW5nYCksIHRoaXMucHJpbWFyeUZhbGxiYWNrKG8uZXZlbnQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvICYmIHRoaXMudHJpbUluUGxhY2UoaCwgbyksIHAgJiYgZiAhPT0gaCAmJiB0aGlzLnRyaW1JblBsYWNlKGYsIHApLCB0aGlzLmNoZWNrQnVmZmVyKCk7XG4gICAgICB9XG4gICAgfSwgdGhpcy5obHMgPSBlLCB0aGlzLkhsc1BsYXllckNsYXNzID0gdCwgdGhpcy5hc3NldExpc3RMb2FkZXIgPSBuZXcgRXcoZSksIHRoaXMuc2NoZWR1bGUgPSBuZXcgdncodGhpcy5vblNjaGVkdWxlVXBkYXRlLCBlLmxvZ2dlciksIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5obHM7XG4gICAgZSAmJiAoZS5vbihJLk1FRElBX0FUVEFDSElORywgdGhpcy5vbk1lZGlhQXR0YWNoaW5nLCB0aGlzKSwgZS5vbihJLk1FRElBX0FUVEFDSEVELCB0aGlzLm9uTWVkaWFBdHRhY2hlZCwgdGhpcyksIGUub24oSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuQVVESU9fVFJBQ0tfU1dJVENISU5HLCB0aGlzLm9uQXVkaW9UcmFja1N3aXRjaGluZywgdGhpcyksIGUub24oSS5BVURJT19UUkFDS19VUERBVEVELCB0aGlzLm9uQXVkaW9UcmFja1VwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuU1VCVElUTEVfVFJBQ0tfU1dJVENILCB0aGlzLm9uU3VidGl0bGVUcmFja1N3aXRjaCwgdGhpcyksIGUub24oSS5TVUJUSVRMRV9UUkFDS19VUERBVEVELCB0aGlzLm9uU3VidGl0bGVUcmFja1VwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuRVZFTlRfQ1VFX0VOVEVSLCB0aGlzLm9uSW50ZXJzdGl0aWFsQ3VlRW50ZXIsIHRoaXMpLCBlLm9uKEkuQVNTRVRfTElTVF9MT0FERUQsIHRoaXMub25Bc3NldExpc3RMb2FkZWQsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX0FQUEVOREVELCB0aGlzLm9uQnVmZmVyQXBwZW5kZWQsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX0ZMVVNIRUQsIHRoaXMub25CdWZmZXJGbHVzaGVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUkVEX1RPX0VORCwgdGhpcy5vbkJ1ZmZlcmVkVG9FbmQsIHRoaXMpLCBlLm9uKEkuTUVESUFfRU5ERUQsIHRoaXMub25NZWRpYUVuZGVkLCB0aGlzKSwgZS5vbihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpLCBlLm9uKEkuREVTVFJPWUlORywgdGhpcy5vbkRlc3Ryb3lpbmcsIHRoaXMpKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmhscztcbiAgICBlICYmIChlLm9mZihJLk1FRElBX0FUVEFDSElORywgdGhpcy5vbk1lZGlhQXR0YWNoaW5nLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9BVFRBQ0hFRCwgdGhpcy5vbk1lZGlhQXR0YWNoZWQsIHRoaXMpLCBlLm9mZihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vZmYoSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5MRVZFTF9VUERBVEVELCB0aGlzLm9uTGV2ZWxVcGRhdGVkLCB0aGlzKSwgZS5vZmYoSS5BVURJT19UUkFDS19TV0lUQ0hJTkcsIHRoaXMub25BdWRpb1RyYWNrU3dpdGNoaW5nLCB0aGlzKSwgZS5vZmYoSS5BVURJT19UUkFDS19VUERBVEVELCB0aGlzLm9uQXVkaW9UcmFja1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLlNVQlRJVExFX1RSQUNLX1NXSVRDSCwgdGhpcy5vblN1YnRpdGxlVHJhY2tTd2l0Y2gsIHRoaXMpLCBlLm9mZihJLlNVQlRJVExFX1RSQUNLX1VQREFURUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrVXBkYXRlZCwgdGhpcyksIGUub2ZmKEkuRVZFTlRfQ1VFX0VOVEVSLCB0aGlzLm9uSW50ZXJzdGl0aWFsQ3VlRW50ZXIsIHRoaXMpLCBlLm9mZihJLkFTU0VUX0xJU1RfTE9BREVELCB0aGlzLm9uQXNzZXRMaXN0TG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfQ09ERUNTLCB0aGlzLm9uQnVmZmVyQ29kZWNzLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfQVBQRU5ERUQsIHRoaXMub25CdWZmZXJBcHBlbmRlZCwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0ZMVVNIRUQsIHRoaXMub25CdWZmZXJGbHVzaGVkLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJFRF9UT19FTkQsIHRoaXMub25CdWZmZXJlZFRvRW5kLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9FTkRFRCwgdGhpcy5vbk1lZGlhRW5kZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpLCBlLm9mZihJLkRFU1RST1lJTkcsIHRoaXMub25EZXN0cm95aW5nLCB0aGlzKSk7XG4gIH1cbiAgc3RhcnRMb2FkKCkge1xuICAgIHRoaXMucmVzdW1lQnVmZmVyaW5nKCk7XG4gIH1cbiAgc3RvcExvYWQoKSB7XG4gICAgdGhpcy5wYXVzZUJ1ZmZlcmluZygpO1xuICB9XG4gIHJlc3VtZUJ1ZmZlcmluZygpIHtcbiAgICB2YXIgZTtcbiAgICAoZSA9IHRoaXMuZ2V0QnVmZmVyaW5nUGxheWVyKCkpID09IG51bGwgfHwgZS5yZXN1bWVCdWZmZXJpbmcoKTtcbiAgfVxuICBwYXVzZUJ1ZmZlcmluZygpIHtcbiAgICB2YXIgZTtcbiAgICAoZSA9IHRoaXMuZ2V0QnVmZmVyaW5nUGxheWVyKCkpID09IG51bGwgfHwgZS5wYXVzZUJ1ZmZlcmluZygpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHRoaXMuc3RvcExvYWQoKSwgdGhpcy5hc3NldExpc3RMb2FkZXIgJiYgdGhpcy5hc3NldExpc3RMb2FkZXIuZGVzdHJveSgpLCB0aGlzLmVtcHR5UGxheWVyUXVldWUoKSwgdGhpcy5jbGVhclNjaGVkdWxlU3RhdGUoKSwgdGhpcy5zY2hlZHVsZSAmJiB0aGlzLnNjaGVkdWxlLmRlc3Ryb3koKSwgdGhpcy5tZWRpYSA9IHRoaXMuZGV0YWNoZWREYXRhID0gdGhpcy5tZWRpYVNlbGVjdGlvbiA9IHRoaXMucmVxdWlyZWRUcmFja3MgPSB0aGlzLmFsdFNlbGVjdGlvbiA9IHRoaXMuc2NoZWR1bGUgPSB0aGlzLm1hbmFnZXIgPSBudWxsLCB0aGlzLmhscyA9IHRoaXMuSGxzUGxheWVyQ2xhc3MgPSB0aGlzLmxvZyA9IG51bGwsIHRoaXMuYXNzZXRMaXN0TG9hZGVyID0gbnVsbCwgdGhpcy5vblBsYXkgPSB0aGlzLm9uUGF1c2UgPSB0aGlzLm9uU2Vla2luZyA9IHRoaXMub25UaW1ldXBkYXRlID0gbnVsbCwgdGhpcy5vblNjaGVkdWxlVXBkYXRlID0gbnVsbDtcbiAgfVxuICBvbkRlc3Ryb3lpbmcoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMucHJpbWFyeU1lZGlhIHx8IHRoaXMubWVkaWE7XG4gICAgZSAmJiB0aGlzLnJlbW92ZU1lZGlhTGlzdGVuZXJzKGUpO1xuICB9XG4gIHJlbW92ZU1lZGlhTGlzdGVuZXJzKGUpIHtcbiAgICBwcihlLCBcInBsYXlcIiwgdGhpcy5vblBsYXkpLCBwcihlLCBcInBhdXNlXCIsIHRoaXMub25QYXVzZSksIHByKGUsIFwic2Vla2luZ1wiLCB0aGlzLm9uU2Vla2luZyksIHByKGUsIFwidGltZXVwZGF0ZVwiLCB0aGlzLm9uVGltZXVwZGF0ZSk7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGluZyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMubWVkaWEgPSB0Lm1lZGlhO1xuICAgIGNyKHIsIFwic2Vla2luZ1wiLCB0aGlzLm9uU2Vla2luZyksIGNyKHIsIFwidGltZXVwZGF0ZVwiLCB0aGlzLm9uVGltZXVwZGF0ZSksIGNyKHIsIFwicGxheVwiLCB0aGlzLm9uUGxheSksIGNyKHIsIFwicGF1c2VcIiwgdGhpcy5vblBhdXNlKTtcbiAgfVxuICBvbk1lZGlhQXR0YWNoZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmVmZmVjdGl2ZVBsYXlpbmdJdGVtLCBuID0gdGhpcy5kZXRhY2hlZERhdGE7XG4gICAgaWYgKHRoaXMuZGV0YWNoZWREYXRhID0gbnVsbCwgciA9PT0gbnVsbClcbiAgICAgIHRoaXMuY2hlY2tTdGFydCgpO1xuICAgIGVsc2UgaWYgKCFuKSB7XG4gICAgICB0aGlzLmNsZWFyU2NoZWR1bGVTdGF0ZSgpO1xuICAgICAgY29uc3QgaSA9IHRoaXMuZmluZEl0ZW1JbmRleChyKTtcbiAgICAgIHRoaXMuc2V0U2NoZWR1bGVQb3NpdGlvbihpKTtcbiAgICB9XG4gIH1cbiAgY2xlYXJTY2hlZHVsZVN0YXRlKCkge1xuICAgIHRoaXMubG9nKFwiY2xlYXIgc2NoZWR1bGUgc3RhdGVcIiksIHRoaXMucGxheWluZ0l0ZW0gPSB0aGlzLmJ1ZmZlcmluZ0l0ZW0gPSB0aGlzLndhaXRpbmdJdGVtID0gdGhpcy5lbmRlZEl0ZW0gPSB0aGlzLnBsYXlpbmdBc3NldCA9IHRoaXMuZW5kZWRBc3NldCA9IHRoaXMuYnVmZmVyaW5nQXNzZXQgPSBudWxsO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAhIXQudHJhbnNmZXJNZWRpYSwgbiA9IHRoaXMubWVkaWE7XG4gICAgaWYgKHRoaXMubWVkaWEgPSBudWxsLCAhciAmJiAobiAmJiB0aGlzLnJlbW92ZU1lZGlhTGlzdGVuZXJzKG4pLCB0aGlzLmRldGFjaGVkRGF0YSkpIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLmdldEJ1ZmZlcmluZ1BsYXllcigpO1xuICAgICAgaSAmJiAodGhpcy5sb2coYFJlbW92aW5nIHNjaGVkdWxlIHN0YXRlIGZvciBkZXRhY2hlZERhdGEgYW5kICR7aX1gKSwgdGhpcy5wbGF5aW5nQXNzZXQgPSB0aGlzLmVuZGVkQXNzZXQgPSB0aGlzLmJ1ZmZlcmluZ0Fzc2V0ID0gdGhpcy5idWZmZXJpbmdJdGVtID0gdGhpcy53YWl0aW5nSXRlbSA9IHRoaXMuZGV0YWNoZWREYXRhID0gbnVsbCwgaS5kZXRhY2hNZWRpYSgpKSwgdGhpcy5zaG91bGRQbGF5ID0gITE7XG4gICAgfVxuICB9XG4gIGdldCBpbnRlcnN0aXRpYWxzTWFuYWdlcigpIHtcbiAgICBpZiAoIXRoaXMuaGxzKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgaWYgKHRoaXMubWFuYWdlcilcbiAgICAgIHJldHVybiB0aGlzLm1hbmFnZXI7XG4gICAgY29uc3QgZSA9IHRoaXMsIHQgPSAoKSA9PiBlLmJ1ZmZlcmluZ0l0ZW0gfHwgZS53YWl0aW5nSXRlbSwgciA9IChkKSA9PiBkICYmIGUuZ2V0QXNzZXRQbGF5ZXIoZC5pZGVudGlmaWVyKSwgbiA9IChkLCBoLCBmLCBwLCB5KSA9PiB7XG4gICAgICBpZiAoZCkge1xuICAgICAgICBsZXQgRSA9IGRbaF0uc3RhcnQ7XG4gICAgICAgIGNvbnN0IGIgPSBkLmV2ZW50O1xuICAgICAgICBpZiAoYikge1xuICAgICAgICAgIGlmIChoID09PSBcInBsYXlvdXRcIiB8fCBiLnRpbWVsaW5lT2NjdXBhbmN5ICE9PSBpYS5Qb2ludCkge1xuICAgICAgICAgICAgY29uc3QgUiA9IHIoZik7XG4gICAgICAgICAgICAoUiA9PSBudWxsID8gdm9pZCAwIDogUi5pbnRlcnN0aXRpYWwpID09PSBiICYmIChFICs9IFIuYXNzZXRJdGVtLnN0YXJ0T2Zmc2V0ICsgUlt5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IFIgPSBwID09PSBcImJ1ZmZlcmVkUG9zXCIgPyBvKCkgOiBlW3BdO1xuICAgICAgICAgIEUgKz0gUiAtIGQuc3RhcnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEU7XG4gICAgICB9XG4gICAgICByZXR1cm4gMDtcbiAgICB9LCBpID0gKGQsIGgpID0+IHtcbiAgICAgIHZhciBmO1xuICAgICAgaWYgKGQgIT09IDAgJiYgaCAhPT0gXCJwcmltYXJ5XCIgJiYgKGYgPSBlLnNjaGVkdWxlKSAhPSBudWxsICYmIGYubGVuZ3RoKSB7XG4gICAgICAgIHZhciBwO1xuICAgICAgICBjb25zdCB5ID0gZS5zY2hlZHVsZS5maW5kSXRlbUluZGV4QXRUaW1lKGQpLCBFID0gKHAgPSBlLnNjaGVkdWxlLml0ZW1zKSA9PSBudWxsID8gdm9pZCAwIDogcFt5XTtcbiAgICAgICAgaWYgKEUpIHtcbiAgICAgICAgICBjb25zdCBiID0gRVtoXS5zdGFydCAtIEUuc3RhcnQ7XG4gICAgICAgICAgcmV0dXJuIGQgKyBiO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZDtcbiAgICB9LCBvID0gKCkgPT4ge1xuICAgICAgY29uc3QgZCA9IGUuYnVmZmVyZWRQb3M7XG4gICAgICByZXR1cm4gZCA9PT0gTnVtYmVyLk1BWF9WQUxVRSA/IGEoXCJwcmltYXJ5XCIpIDogTWF0aC5tYXgoZCwgMCk7XG4gICAgfSwgYSA9IChkKSA9PiB7XG4gICAgICB2YXIgaCwgZjtcbiAgICAgIHJldHVybiAoaCA9IGUucHJpbWFyeURldGFpbHMpICE9IG51bGwgJiYgaC5saXZlID8gZS5wcmltYXJ5RGV0YWlscy5lZGdlIDogKChmID0gZS5zY2hlZHVsZSkgPT0gbnVsbCA/IHZvaWQgMCA6IGYuZHVyYXRpb25zW2RdKSB8fCAwO1xuICAgIH0sIGwgPSAoZCwgaCkgPT4ge1xuICAgICAgdmFyIGYsIHA7XG4gICAgICBjb25zdCB5ID0gZS5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICAgIGlmICh5ICE9IG51bGwgJiYgKGYgPSB5LmV2ZW50KSAhPSBudWxsICYmIGYucmVzdHJpY3Rpb25zLnNraXAgfHwgIWUuc2NoZWR1bGUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGUubG9nKGBzZWVrIHRvICR7ZH0gXCIke2h9XCJgKTtcbiAgICAgIGNvbnN0IEUgPSBlLmVmZmVjdGl2ZVBsYXlpbmdJdGVtLCBiID0gZS5zY2hlZHVsZS5maW5kSXRlbUluZGV4QXRUaW1lKGQsIGgpLCBSID0gKHAgPSBlLnNjaGVkdWxlLml0ZW1zKSA9PSBudWxsID8gdm9pZCAwIDogcFtiXSwgQSA9IGUuZ2V0QnVmZmVyaW5nUGxheWVyKCksIEYgPSBBID09IG51bGwgPyB2b2lkIDAgOiBBLmludGVyc3RpdGlhbCwgTSA9IEYgPT0gbnVsbCA/IHZvaWQgMCA6IEYuYXBwZW5kSW5QbGFjZSwgSCA9IEUgJiYgZS5pdGVtc01hdGNoKEUsIFIpO1xuICAgICAgaWYgKEUgJiYgKE0gfHwgSCkpIHtcbiAgICAgICAgY29uc3QgSyA9IHIoZS5wbGF5aW5nQXNzZXQpLCBqID0gKEsgPT0gbnVsbCA/IHZvaWQgMCA6IEsubWVkaWEpIHx8IGUucHJpbWFyeU1lZGlhO1xuICAgICAgICBpZiAoaikge1xuICAgICAgICAgIGNvbnN0IEMgPSBoID09PSBcInByaW1hcnlcIiA/IGouY3VycmVudFRpbWUgOiBuKEUsIGgsIGUucGxheWluZ0Fzc2V0LCBcInRpbWVsaW5lUG9zXCIsIFwiY3VycmVudFRpbWVcIiksIGsgPSBkIC0gQywgJCA9IChNID8gQyA6IGouY3VycmVudFRpbWUpICsgaztcbiAgICAgICAgICBpZiAoJCA+PSAwICYmICghSyB8fCBNIHx8ICQgPD0gSy5kdXJhdGlvbikpIHtcbiAgICAgICAgICAgIGouY3VycmVudFRpbWUgPSAkO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKFIpIHtcbiAgICAgICAgbGV0IEsgPSBkO1xuICAgICAgICBpZiAoaCAhPT0gXCJwcmltYXJ5XCIpIHtcbiAgICAgICAgICBjb25zdCBDID0gUltoXS5zdGFydCwgayA9IGQgLSBDO1xuICAgICAgICAgIEsgPSBSLnN0YXJ0ICsgaztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBqID0gIWUuaXNJbnRlcnN0aXRpYWwoUik7XG4gICAgICAgIGlmICgoIWUuaXNJbnRlcnN0aXRpYWwoRSkgfHwgRS5ldmVudC5hcHBlbmRJblBsYWNlKSAmJiAoaiB8fCBSLmV2ZW50LmFwcGVuZEluUGxhY2UpKSB7XG4gICAgICAgICAgY29uc3QgQyA9IGUubWVkaWEgfHwgKE0gPyBBID09IG51bGwgPyB2b2lkIDAgOiBBLm1lZGlhIDogbnVsbCk7XG4gICAgICAgICAgQyAmJiAoQy5jdXJyZW50VGltZSA9IEspO1xuICAgICAgICB9IGVsc2UgaWYgKEUpIHtcbiAgICAgICAgICBjb25zdCBDID0gZS5maW5kSXRlbUluZGV4KEUpO1xuICAgICAgICAgIGlmIChiID4gQykge1xuICAgICAgICAgICAgY29uc3QgJCA9IGUuc2NoZWR1bGUuZmluZEp1bXBSZXN0cmljdGVkSW5kZXgoQyArIDEsIGIpO1xuICAgICAgICAgICAgaWYgKCQgPiBDKSB7XG4gICAgICAgICAgICAgIGUuc2V0U2NoZWR1bGVQb3NpdGlvbigkKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgayA9IDA7XG4gICAgICAgICAgaWYgKGopXG4gICAgICAgICAgICBlLnRpbWVsaW5lUG9zID0gSywgZS5jaGVja0J1ZmZlcigpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgJCA9IFIuZXZlbnQuYXNzZXRMaXN0LCBXID0gZCAtIChSW2hdIHx8IFIpLnN0YXJ0O1xuICAgICAgICAgICAgZm9yIChsZXQgXyA9ICQubGVuZ3RoOyBfLS07ICkge1xuICAgICAgICAgICAgICBjb25zdCBnID0gJFtfXTtcbiAgICAgICAgICAgICAgaWYgKGcuZHVyYXRpb24gJiYgVyA+PSBnLnN0YXJ0T2Zmc2V0ICYmIFcgPCBnLnN0YXJ0T2Zmc2V0ICsgZy5kdXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGsgPSBfO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGUuc2V0U2NoZWR1bGVQb3NpdGlvbihiLCBrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkID0gZS5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICAgIGlmIChlLmlzSW50ZXJzdGl0aWFsKGQpKVxuICAgICAgICByZXR1cm4gZDtcbiAgICAgIGNvbnN0IGggPSB0KCk7XG4gICAgICByZXR1cm4gZS5pc0ludGVyc3RpdGlhbChoKSA/IGggOiBudWxsO1xuICAgIH0sIHUgPSB7XG4gICAgICBnZXQgYnVmZmVyZWRFbmQoKSB7XG4gICAgICAgIGNvbnN0IGQgPSB0KCksIGggPSBlLmJ1ZmZlcmluZ0l0ZW07XG4gICAgICAgIGlmIChoICYmIGggPT09IGQpIHtcbiAgICAgICAgICB2YXIgZjtcbiAgICAgICAgICByZXR1cm4gbihoLCBcInBsYXlvdXRcIiwgZS5idWZmZXJpbmdBc3NldCwgXCJidWZmZXJlZFBvc1wiLCBcImJ1ZmZlcmVkRW5kXCIpIC0gaC5wbGF5b3V0LnN0YXJ0IHx8ICgoZiA9IGUuYnVmZmVyaW5nQXNzZXQpID09IG51bGwgPyB2b2lkIDAgOiBmLnN0YXJ0T2Zmc2V0KSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSxcbiAgICAgIGdldCBjdXJyZW50VGltZSgpIHtcbiAgICAgICAgY29uc3QgZCA9IGMoKSwgaCA9IGUuZWZmZWN0aXZlUGxheWluZ0l0ZW07XG4gICAgICAgIHJldHVybiBoICYmIGggPT09IGQgPyBuKGgsIFwicGxheW91dFwiLCBlLmVmZmVjdGl2ZVBsYXlpbmdBc3NldCwgXCJ0aW1lbGluZVBvc1wiLCBcImN1cnJlbnRUaW1lXCIpIC0gaC5wbGF5b3V0LnN0YXJ0IDogMDtcbiAgICAgIH0sXG4gICAgICBzZXQgY3VycmVudFRpbWUoZCkge1xuICAgICAgICBjb25zdCBoID0gYygpLCBmID0gZS5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICAgICAgZiAmJiBmID09PSBoICYmIGwoZCArIGYucGxheW91dC5zdGFydCwgXCJwbGF5b3V0XCIpO1xuICAgICAgfSxcbiAgICAgIGdldCBkdXJhdGlvbigpIHtcbiAgICAgICAgY29uc3QgZCA9IGMoKTtcbiAgICAgICAgcmV0dXJuIGQgPyBkLnBsYXlvdXQuZW5kIC0gZC5wbGF5b3V0LnN0YXJ0IDogMDtcbiAgICAgIH0sXG4gICAgICBnZXQgYXNzZXRQbGF5ZXJzKCkge1xuICAgICAgICB2YXIgZDtcbiAgICAgICAgY29uc3QgaCA9IChkID0gYygpKSA9PSBudWxsID8gdm9pZCAwIDogZC5ldmVudC5hc3NldExpc3Q7XG4gICAgICAgIHJldHVybiBoID8gaC5tYXAoKGYpID0+IGUuZ2V0QXNzZXRQbGF5ZXIoZi5pZGVudGlmaWVyKSkgOiBbXTtcbiAgICAgIH0sXG4gICAgICBnZXQgcGxheWluZ0luZGV4KCkge1xuICAgICAgICB2YXIgZDtcbiAgICAgICAgY29uc3QgaCA9IChkID0gYygpKSA9PSBudWxsID8gdm9pZCAwIDogZC5ldmVudDtcbiAgICAgICAgcmV0dXJuIGggJiYgZS5lZmZlY3RpdmVQbGF5aW5nQXNzZXQgPyBoLmZpbmRBc3NldEluZGV4KGUuZWZmZWN0aXZlUGxheWluZ0Fzc2V0KSA6IC0xO1xuICAgICAgfSxcbiAgICAgIGdldCBzY2hlZHVsZUl0ZW0oKSB7XG4gICAgICAgIHJldHVybiBjKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VyID0ge1xuICAgICAgZ2V0IGV2ZW50cygpIHtcbiAgICAgICAgdmFyIGQ7XG4gICAgICAgIHJldHVybiAoKGQgPSBlLnNjaGVkdWxlKSA9PSBudWxsIHx8IChkID0gZC5ldmVudHMpID09IG51bGwgPyB2b2lkIDAgOiBkLnNsaWNlKDApKSB8fCBbXTtcbiAgICAgIH0sXG4gICAgICBnZXQgc2NoZWR1bGUoKSB7XG4gICAgICAgIHZhciBkO1xuICAgICAgICByZXR1cm4gKChkID0gZS5zY2hlZHVsZSkgPT0gbnVsbCB8fCAoZCA9IGQuaXRlbXMpID09IG51bGwgPyB2b2lkIDAgOiBkLnNsaWNlKDApKSB8fCBbXTtcbiAgICAgIH0sXG4gICAgICBnZXQgaW50ZXJzdGl0aWFsUGxheWVyKCkge1xuICAgICAgICByZXR1cm4gYygpID8gdSA6IG51bGw7XG4gICAgICB9LFxuICAgICAgZ2V0IHBsYXllclF1ZXVlKCkge1xuICAgICAgICByZXR1cm4gZS5wbGF5ZXJRdWV1ZS5zbGljZSgwKTtcbiAgICAgIH0sXG4gICAgICBnZXQgYnVmZmVyaW5nQXNzZXQoKSB7XG4gICAgICAgIHJldHVybiBlLmJ1ZmZlcmluZ0Fzc2V0O1xuICAgICAgfSxcbiAgICAgIGdldCBidWZmZXJpbmdJdGVtKCkge1xuICAgICAgICByZXR1cm4gdCgpO1xuICAgICAgfSxcbiAgICAgIGdldCBidWZmZXJpbmdJbmRleCgpIHtcbiAgICAgICAgY29uc3QgZCA9IHQoKTtcbiAgICAgICAgcmV0dXJuIGUuZmluZEl0ZW1JbmRleChkKTtcbiAgICAgIH0sXG4gICAgICBnZXQgcGxheWluZ0Fzc2V0KCkge1xuICAgICAgICByZXR1cm4gZS5lZmZlY3RpdmVQbGF5aW5nQXNzZXQ7XG4gICAgICB9LFxuICAgICAgZ2V0IHBsYXlpbmdJdGVtKCkge1xuICAgICAgICByZXR1cm4gZS5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICAgIH0sXG4gICAgICBnZXQgcGxheWluZ0luZGV4KCkge1xuICAgICAgICBjb25zdCBkID0gZS5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICAgICAgcmV0dXJuIGUuZmluZEl0ZW1JbmRleChkKTtcbiAgICAgIH0sXG4gICAgICBwcmltYXJ5OiB7XG4gICAgICAgIGdldCBidWZmZXJlZEVuZCgpIHtcbiAgICAgICAgICByZXR1cm4gbygpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgY3VycmVudFRpbWUoKSB7XG4gICAgICAgICAgY29uc3QgZCA9IGUudGltZWxpbmVQb3M7XG4gICAgICAgICAgcmV0dXJuIGQgPiAwID8gZCA6IDA7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBjdXJyZW50VGltZShkKSB7XG4gICAgICAgICAgbChkLCBcInByaW1hcnlcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBkdXJhdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gYShcInByaW1hcnlcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBzZWVrYWJsZVN0YXJ0KCkge1xuICAgICAgICAgIHZhciBkO1xuICAgICAgICAgIHJldHVybiAoKGQgPSBlLnByaW1hcnlEZXRhaWxzKSA9PSBudWxsID8gdm9pZCAwIDogZC5mcmFnbWVudFN0YXJ0KSB8fCAwO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgaW50ZWdyYXRlZDoge1xuICAgICAgICBnZXQgYnVmZmVyZWRFbmQoKSB7XG4gICAgICAgICAgcmV0dXJuIG4odCgpLCBcImludGVncmF0ZWRcIiwgZS5idWZmZXJpbmdBc3NldCwgXCJidWZmZXJlZFBvc1wiLCBcImJ1ZmZlcmVkRW5kXCIpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgY3VycmVudFRpbWUoKSB7XG4gICAgICAgICAgcmV0dXJuIG4oZS5lZmZlY3RpdmVQbGF5aW5nSXRlbSwgXCJpbnRlZ3JhdGVkXCIsIGUuZWZmZWN0aXZlUGxheWluZ0Fzc2V0LCBcInRpbWVsaW5lUG9zXCIsIFwiY3VycmVudFRpbWVcIik7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCBjdXJyZW50VGltZShkKSB7XG4gICAgICAgICAgbChkLCBcImludGVncmF0ZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBkdXJhdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gYShcImludGVncmF0ZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBzZWVrYWJsZVN0YXJ0KCkge1xuICAgICAgICAgIHZhciBkO1xuICAgICAgICAgIHJldHVybiBpKCgoZCA9IGUucHJpbWFyeURldGFpbHMpID09IG51bGwgPyB2b2lkIDAgOiBkLmZyYWdtZW50U3RhcnQpIHx8IDAsIFwiaW50ZWdyYXRlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNraXA6ICgpID0+IHtcbiAgICAgICAgY29uc3QgZCA9IGUuZWZmZWN0aXZlUGxheWluZ0l0ZW0sIGggPSBkID09IG51bGwgPyB2b2lkIDAgOiBkLmV2ZW50O1xuICAgICAgICBpZiAoaCAmJiAhaC5yZXN0cmljdGlvbnMuc2tpcCkge1xuICAgICAgICAgIGNvbnN0IGYgPSBlLmZpbmRJdGVtSW5kZXgoZCk7XG4gICAgICAgICAgaWYgKGguYXBwZW5kSW5QbGFjZSkge1xuICAgICAgICAgICAgY29uc3QgcCA9IGQucGxheW91dC5zdGFydCArIGQuZXZlbnQuZHVyYXRpb247XG4gICAgICAgICAgICBsKHAgKyAxZS0zLCBcInBsYXlvdXRcIik7XG4gICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICBlLmFkdmFuY2VBZnRlckFzc2V0RW5kZWQoaCwgZiwgMSAvIDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICAvLyBTY2hlZHVsZSBnZXR0ZXJzXG4gIGdldCBlZmZlY3RpdmVQbGF5aW5nSXRlbSgpIHtcbiAgICByZXR1cm4gdGhpcy53YWl0aW5nSXRlbSB8fCB0aGlzLnBsYXlpbmdJdGVtIHx8IHRoaXMuZW5kZWRJdGVtO1xuICB9XG4gIGdldCBlZmZlY3RpdmVQbGF5aW5nQXNzZXQoKSB7XG4gICAgcmV0dXJuIHRoaXMucGxheWluZ0Fzc2V0IHx8IHRoaXMuZW5kZWRBc3NldDtcbiAgfVxuICBnZXQgcGxheWluZ0xhc3RJdGVtKCkge1xuICAgIHZhciBlO1xuICAgIGNvbnN0IHQgPSB0aGlzLnBsYXlpbmdJdGVtLCByID0gKGUgPSB0aGlzLnNjaGVkdWxlKSA9PSBudWxsID8gdm9pZCAwIDogZS5pdGVtcztcbiAgICByZXR1cm4gIXRoaXMucGxheWJhY2tTdGFydGVkIHx8ICF0IHx8ICFyID8gITEgOiB0aGlzLmZpbmRJdGVtSW5kZXgodCkgPT09IHIubGVuZ3RoIC0gMTtcbiAgfVxuICBnZXQgcGxheWJhY2tTdGFydGVkKCkge1xuICAgIHJldHVybiB0aGlzLmVmZmVjdGl2ZVBsYXlpbmdJdGVtICE9PSBudWxsO1xuICB9XG4gIC8vIE1lZGlhIGdldHRlcnMgYW5kIGV2ZW50IGNhbGxiYWNrc1xuICBnZXQgY3VycmVudFRpbWUoKSB7XG4gICAgdmFyIGUsIHQ7XG4gICAgaWYgKHRoaXMubWVkaWFTZWxlY3Rpb24gPT09IG51bGwpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHRoaXMud2FpdGluZ0l0ZW0gfHwgdGhpcy5wbGF5aW5nSXRlbTtcbiAgICBpZiAodGhpcy5pc0ludGVyc3RpdGlhbChyKSAmJiAhci5ldmVudC5hcHBlbmRJblBsYWNlKVxuICAgICAgcmV0dXJuO1xuICAgIGxldCBuID0gdGhpcy5tZWRpYTtcbiAgICAhbiAmJiAoZSA9IHRoaXMuYnVmZmVyaW5nSXRlbSkgIT0gbnVsbCAmJiAoZSA9IGUuZXZlbnQpICE9IG51bGwgJiYgZS5hcHBlbmRJblBsYWNlICYmIChuID0gdGhpcy5wcmltYXJ5TWVkaWEpO1xuICAgIGNvbnN0IGkgPSAodCA9IG4pID09IG51bGwgPyB2b2lkIDAgOiB0LmN1cnJlbnRUaW1lO1xuICAgIGlmICghKGkgPT09IHZvaWQgMCB8fCAhdWUoaSkpKVxuICAgICAgcmV0dXJuIGk7XG4gIH1cbiAgZ2V0IHByaW1hcnlNZWRpYSgpIHtcbiAgICB2YXIgZTtcbiAgICByZXR1cm4gdGhpcy5tZWRpYSB8fCAoKGUgPSB0aGlzLmRldGFjaGVkRGF0YSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUubWVkaWEpIHx8IG51bGw7XG4gIH1cbiAgaXNJbnRlcnN0aXRpYWwoZSkge1xuICAgIHJldHVybiAhIShlICE9IG51bGwgJiYgZS5ldmVudCk7XG4gIH1cbiAgcmV0cmVpdmVNZWRpYVNvdXJjZShlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIoZSk7XG4gICAgciAmJiB0aGlzLnRyYW5zZmVyTWVkaWFGcm9tUGxheWVyKHIsIHQpO1xuICB9XG4gIHRyYW5zZmVyTWVkaWFGcm9tUGxheWVyKGUsIHQpIHtcbiAgICBjb25zdCByID0gZS5pbnRlcnN0aXRpYWwuYXBwZW5kSW5QbGFjZSwgbiA9IGUubWVkaWE7XG4gICAgaWYgKHIgJiYgbiA9PT0gdGhpcy5wcmltYXJ5TWVkaWEpIHtcbiAgICAgIGlmICh0aGlzLmJ1ZmZlcmluZ0Fzc2V0ID0gbnVsbCwgKCF0IHx8IHRoaXMuaXNJbnRlcnN0aXRpYWwodCkgJiYgIXQuZXZlbnQuYXBwZW5kSW5QbGFjZSkgJiYgdCAmJiBuKSB7XG4gICAgICAgIHRoaXMuZGV0YWNoZWREYXRhID0ge1xuICAgICAgICAgIG1lZGlhOiBuXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGkgPSBlLnRyYW5zZmVyTWVkaWEoKTtcbiAgICAgIHRoaXMubG9nKGB0cmFuc2ZlciBNZWRpYVNvdXJjZSBmcm9tICR7ZX0gJHthdChpKX1gKSwgdGhpcy5kZXRhY2hlZERhdGEgPSBpO1xuICAgIH0gZWxzZSB0ICYmIG4gJiYgKHRoaXMuc2hvdWxkUGxheSB8fCAodGhpcy5zaG91bGRQbGF5ID0gIW4ucGF1c2VkKSk7XG4gIH1cbiAgdHJhbnNmZXJNZWRpYVRvKGUsIHQpIHtcbiAgICB2YXIgciwgbjtcbiAgICBpZiAoZS5tZWRpYSA9PT0gdClcbiAgICAgIHJldHVybjtcbiAgICBsZXQgaSA9IG51bGw7XG4gICAgY29uc3QgbyA9IHRoaXMuaGxzLCBhID0gZSAhPT0gbywgbCA9IGEgJiYgZS5pbnRlcnN0aXRpYWwuYXBwZW5kSW5QbGFjZSwgYyA9IChyID0gdGhpcy5kZXRhY2hlZERhdGEpID09IG51bGwgPyB2b2lkIDAgOiByLm1lZGlhU291cmNlO1xuICAgIGxldCB1O1xuICAgIGlmIChvLm1lZGlhKVxuICAgICAgbCAmJiAoaSA9IG8udHJhbnNmZXJNZWRpYSgpLCB0aGlzLmRldGFjaGVkRGF0YSA9IGkpLCB1ID0gXCJQcmltYXJ5XCI7XG4gICAgZWxzZSBpZiAoYykge1xuICAgICAgY29uc3QgcCA9IHRoaXMuZ2V0QnVmZmVyaW5nUGxheWVyKCk7XG4gICAgICBwID8gKGkgPSBwLnRyYW5zZmVyTWVkaWEoKSwgdSA9IGAke3B9YCkgOiB1ID0gXCJkZXRhY2hlZCBNZWRpYVNvdXJjZVwiO1xuICAgIH0gZWxzZVxuICAgICAgdSA9IFwiZGV0YWNoZWQgbWVkaWFcIjtcbiAgICBpZiAoIWkpIHtcbiAgICAgIGlmIChjKVxuICAgICAgICBpID0gdGhpcy5kZXRhY2hlZERhdGEsIHRoaXMubG9nKGB1c2luZyBkZXRhY2hlZERhdGE6IE1lZGlhU291cmNlICR7YXQoaSl9YCk7XG4gICAgICBlbHNlIGlmICghdGhpcy5kZXRhY2hlZERhdGEgfHwgby5tZWRpYSA9PT0gdCkge1xuICAgICAgICBjb25zdCBwID0gdGhpcy5wbGF5ZXJRdWV1ZTtcbiAgICAgICAgcC5sZW5ndGggPiAxICYmIHAuZm9yRWFjaCgoeSkgPT4ge1xuICAgICAgICAgIGlmIChhICYmIHkuaW50ZXJzdGl0aWFsLmFwcGVuZEluUGxhY2UgIT09IGwpIHtcbiAgICAgICAgICAgIGNvbnN0IEUgPSB5LmludGVyc3RpdGlhbDtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJJbnRlcnN0aXRpYWwoeS5pbnRlcnN0aXRpYWwsIG51bGwpLCBFLmFwcGVuZEluUGxhY2UgPSAhMSwgRS5hcHBlbmRJblBsYWNlICYmIHRoaXMud2FybihgQ291bGQgbm90IGNoYW5nZSBhcHBlbmQgc3RyYXRlZ3kgZm9yIHF1ZXVlZCBhc3NldHMgJHtFfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksIHRoaXMuaGxzLmRldGFjaE1lZGlhKCksIHRoaXMuZGV0YWNoZWREYXRhID0ge1xuICAgICAgICAgIG1lZGlhOiB0XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGQgPSBpICYmIFwibWVkaWFTb3VyY2VcIiBpbiBpICYmICgobiA9IGkubWVkaWFTb3VyY2UpID09IG51bGwgPyB2b2lkIDAgOiBuLnJlYWR5U3RhdGUpICE9PSBcImNsb3NlZFwiLCBoID0gZCAmJiBpID8gaSA6IHQ7XG4gICAgdGhpcy5sb2coYCR7ZCA/IFwidHJhbnNmZXJpbmcgTWVkaWFTb3VyY2VcIiA6IFwiYXR0YWNoaW5nIG1lZGlhXCJ9IHRvICR7YSA/IGUgOiBcIlByaW1hcnlcIn0gZnJvbSAke3V9IChtZWRpYS5jdXJyZW50VGltZTogJHt0LmN1cnJlbnRUaW1lfSlgKTtcbiAgICBjb25zdCBmID0gdGhpcy5zY2hlZHVsZTtcbiAgICBpZiAoaCA9PT0gaSAmJiBmKSB7XG4gICAgICBjb25zdCBwID0gYSAmJiBlLmFzc2V0SWQgPT09IGYuYXNzZXRJZEF0RW5kO1xuICAgICAgaC5vdmVycmlkZXMgPSB7XG4gICAgICAgIGR1cmF0aW9uOiBmLmR1cmF0aW9uLFxuICAgICAgICBlbmRPZlN0cmVhbTogIWEgfHwgcCxcbiAgICAgICAgY3VlUmVtb3ZhbDogIWFcbiAgICAgIH07XG4gICAgfVxuICAgIGUuYXR0YWNoTWVkaWEoaCk7XG4gIH1cbiAgb25JbnRlcnN0aXRpYWxDdWVFbnRlcigpIHtcbiAgICB0aGlzLm9uVGltZXVwZGF0ZSgpO1xuICB9XG4gIC8vIFNjaGVkdWxpbmcgbWV0aG9kc1xuICBjaGVja1N0YXJ0KCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLnNjaGVkdWxlLCB0ID0gZSA9PSBudWxsID8gdm9pZCAwIDogZS5ldmVudHM7XG4gICAgaWYgKCF0IHx8IHRoaXMucGxheWJhY2tEaXNhYmxlZCB8fCAhdGhpcy5tZWRpYSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmJ1ZmZlcmVkUG9zID09PSAtMSAmJiAodGhpcy5idWZmZXJlZFBvcyA9IDApO1xuICAgIGNvbnN0IHIgPSB0aGlzLnRpbWVsaW5lUG9zLCBuID0gdGhpcy5lZmZlY3RpdmVQbGF5aW5nSXRlbTtcbiAgICBpZiAociA9PT0gLTEpIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLmhscy5zdGFydFBvc2l0aW9uO1xuICAgICAgaWYgKHRoaXMubG9nKFFpKFwiY2hlY2tTdGFydFwiLCBpKSksIHRoaXMudGltZWxpbmVQb3MgPSBpLCB0Lmxlbmd0aCAmJiB0WzBdLmN1ZS5wcmUpIHtcbiAgICAgICAgY29uc3QgbyA9IGUuZmluZEV2ZW50SW5kZXgodFswXS5pZGVudGlmaWVyKTtcbiAgICAgICAgdGhpcy5zZXRTY2hlZHVsZVBvc2l0aW9uKG8pO1xuICAgICAgfSBlbHNlIGlmIChpID49IDAgfHwgIXRoaXMucHJpbWFyeUxpdmUpIHtcbiAgICAgICAgY29uc3QgbyA9IHRoaXMudGltZWxpbmVQb3MgPSBpID4gMCA/IGkgOiAwLCBhID0gZS5maW5kSXRlbUluZGV4QXRUaW1lKG8pO1xuICAgICAgICB0aGlzLnNldFNjaGVkdWxlUG9zaXRpb24oYSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuICYmICF0aGlzLnBsYXlpbmdJdGVtKSB7XG4gICAgICBjb25zdCBpID0gZS5maW5kSXRlbUluZGV4KG4pO1xuICAgICAgdGhpcy5zZXRTY2hlZHVsZVBvc2l0aW9uKGkpO1xuICAgIH1cbiAgfVxuICBhZHZhbmNlQXNzZXRCdWZmZXJpbmcoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBlLmV2ZW50LCBuID0gci5maW5kQXNzZXRJbmRleCh0KSwgaSA9IFRsKHIsIG4pO1xuICAgIGlmICghci5pc0Fzc2V0UGFzdFBsYXlvdXRMaW1pdChpKSlcbiAgICAgIHRoaXMuYnVmZmVyZWRUb0V2ZW50KGUsIGkpO1xuICAgIGVsc2UgaWYgKHRoaXMuc2NoZWR1bGUpIHtcbiAgICAgIHZhciBvO1xuICAgICAgY29uc3QgYSA9IChvID0gdGhpcy5zY2hlZHVsZS5pdGVtcykgPT0gbnVsbCA/IHZvaWQgMCA6IG9bdGhpcy5maW5kSXRlbUluZGV4KGUpICsgMV07XG4gICAgICBhICYmIHRoaXMuYnVmZmVyZWRUb0l0ZW0oYSk7XG4gICAgfVxuICB9XG4gIGFkdmFuY2VBZnRlckFzc2V0RW5kZWQoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSBUbChlLCByKTtcbiAgICBpZiAoZS5pc0Fzc2V0UGFzdFBsYXlvdXRMaW1pdChuKSkge1xuICAgICAgaWYgKHRoaXMuc2NoZWR1bGUpIHtcbiAgICAgICAgY29uc3QgaSA9IHRoaXMuc2NoZWR1bGUuaXRlbXM7XG4gICAgICAgIGlmIChpKSB7XG4gICAgICAgICAgY29uc3QgbyA9IHQgKyAxLCBhID0gaS5sZW5ndGg7XG4gICAgICAgICAgaWYgKG8gPj0gYSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTY2hlZHVsZVBvc2l0aW9uKC0xKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbCA9IGUucmVzdW1lVGltZTtcbiAgICAgICAgICB0aGlzLnRpbWVsaW5lUG9zIDwgbCAmJiAodGhpcy5sb2coUWkoXCJhZHZhbmNlQWZ0ZXJBc3NldEVuZGVkXCIsIGwpKSwgdGhpcy50aW1lbGluZVBvcyA9IGwsIGUuYXBwZW5kSW5QbGFjZSAmJiB0aGlzLmFkdmFuY2VJblBsYWNlKGwpLCB0aGlzLmNoZWNrQnVmZmVyKHRoaXMuYnVmZmVyZWRQb3MgPCBsKSksIHRoaXMuc2V0U2NoZWR1bGVQb3NpdGlvbihvKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZS5hcHBlbmRJblBsYWNlKSB7XG4gICAgICAgIGNvbnN0IGkgPSBlLmFzc2V0TGlzdFtuXTtcbiAgICAgICAgaSAmJiB0aGlzLmFkdmFuY2VJblBsYWNlKGkudGltZWxpbmVTdGFydCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldFNjaGVkdWxlUG9zaXRpb24odCwgbik7XG4gICAgfVxuICB9XG4gIHNldFNjaGVkdWxlVG9Bc3NldEF0VGltZShlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuc2NoZWR1bGU7XG4gICAgaWYgKCFyKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSB0LnBhcmVudElkZW50aWZpZXIsIGkgPSByLmdldEV2ZW50KG4pO1xuICAgIGlmIChpKSB7XG4gICAgICBjb25zdCBvID0gci5maW5kRXZlbnRJbmRleChuKSwgYSA9IHIuZmluZEFzc2V0SW5kZXgoaSwgZSk7XG4gICAgICB0aGlzLmFkdmFuY2VBZnRlckFzc2V0RW5kZWQoaSwgbywgYSAtIDEpO1xuICAgIH1cbiAgfVxuICBzZXRTY2hlZHVsZVBvc2l0aW9uKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gKHIgPSB0aGlzLnNjaGVkdWxlKSA9PSBudWxsID8gdm9pZCAwIDogci5pdGVtcztcbiAgICBpZiAoIW4gfHwgdGhpcy5wbGF5YmFja0Rpc2FibGVkKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGkgPSBlID49IDAgPyBuW2VdIDogbnVsbDtcbiAgICB0aGlzLmxvZyhgc2V0U2NoZWR1bGVQb3NpdGlvbiAke2V9LCAke3R9ICgke2kgJiYga3IoaSl9KSBwb3M6ICR7dGhpcy50aW1lbGluZVBvc31gKTtcbiAgICBjb25zdCBvID0gdGhpcy53YWl0aW5nSXRlbSB8fCB0aGlzLnBsYXlpbmdJdGVtLCBhID0gdGhpcy5wbGF5aW5nTGFzdEl0ZW07XG4gICAgaWYgKHRoaXMuaXNJbnRlcnN0aXRpYWwobykpIHtcbiAgICAgIGNvbnN0IHUgPSBvLmV2ZW50LCBkID0gdGhpcy5wbGF5aW5nQXNzZXQsIGggPSBkID09IG51bGwgPyB2b2lkIDAgOiBkLmlkZW50aWZpZXIsIGYgPSBoID8gdGhpcy5nZXRBc3NldFBsYXllcihoKSA6IG51bGw7XG4gICAgICBpZiAoZiAmJiBoICYmICghdGhpcy5ldmVudEl0ZW1zTWF0Y2gobywgaSkgfHwgdCAhPT0gdm9pZCAwICYmIGggIT09IHUuYXNzZXRMaXN0W3RdLmlkZW50aWZpZXIpKSB7XG4gICAgICAgIHZhciBsO1xuICAgICAgICBjb25zdCBwID0gdS5maW5kQXNzZXRJbmRleChkKTtcbiAgICAgICAgaWYgKHRoaXMubG9nKGBJTlRFUlNUSVRJQUxfQVNTRVRfRU5ERUQgJHtwICsgMX0vJHt1LmFzc2V0TGlzdC5sZW5ndGh9ICR7dm4oZCl9YCksIHRoaXMuZW5kZWRBc3NldCA9IGQsIHRoaXMucGxheWluZ0Fzc2V0ID0gbnVsbCwgdGhpcy5obHMudHJpZ2dlcihJLklOVEVSU1RJVElBTF9BU1NFVF9FTkRFRCwge1xuICAgICAgICAgIGFzc2V0OiBkLFxuICAgICAgICAgIGFzc2V0TGlzdEluZGV4OiBwLFxuICAgICAgICAgIGV2ZW50OiB1LFxuICAgICAgICAgIHNjaGVkdWxlOiBuLnNsaWNlKDApLFxuICAgICAgICAgIHNjaGVkdWxlSW5kZXg6IGUsXG4gICAgICAgICAgcGxheWVyOiBmXG4gICAgICAgIH0pLCBvICE9PSB0aGlzLnBsYXlpbmdJdGVtKSB7XG4gICAgICAgICAgdGhpcy5pdGVtc01hdGNoKG8sIHRoaXMucGxheWluZ0l0ZW0pICYmIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICAgICAgIXRoaXMucGxheWluZ0Fzc2V0ICYmIHRoaXMuYWR2YW5jZUFmdGVyQXNzZXRFbmRlZCh1LCB0aGlzLmZpbmRJdGVtSW5kZXgodGhpcy5wbGF5aW5nSXRlbSksIHApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJldHJlaXZlTWVkaWFTb3VyY2UoaCwgaSksIGYubWVkaWEgJiYgISgobCA9IHRoaXMuZGV0YWNoZWREYXRhKSAhPSBudWxsICYmIGwubWVkaWFTb3VyY2UpICYmIGYuZGV0YWNoTWVkaWEoKTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5ldmVudEl0ZW1zTWF0Y2gobywgaSkgJiYgKHRoaXMuZW5kZWRJdGVtID0gbywgdGhpcy5wbGF5aW5nSXRlbSA9IG51bGwsIHRoaXMubG9nKGBJTlRFUlNUSVRJQUxfRU5ERUQgJHt1fSAke2tyKG8pfWApLCB1Lmhhc1BsYXllZCA9ICEwLCB0aGlzLmhscy50cmlnZ2VyKEkuSU5URVJTVElUSUFMX0VOREVELCB7XG4gICAgICAgIGV2ZW50OiB1LFxuICAgICAgICBzY2hlZHVsZTogbi5zbGljZSgwKSxcbiAgICAgICAgc2NoZWR1bGVJbmRleDogZVxuICAgICAgfSksIHUuY3VlLm9uY2UpKSB7XG4gICAgICAgIHZhciBjO1xuICAgICAgICB0aGlzLnVwZGF0ZVNjaGVkdWxlKCk7XG4gICAgICAgIGNvbnN0IHAgPSAoYyA9IHRoaXMuc2NoZWR1bGUpID09IG51bGwgPyB2b2lkIDAgOiBjLml0ZW1zO1xuICAgICAgICBpZiAoaSAmJiBwKSB7XG4gICAgICAgICAgY29uc3QgeSA9IHRoaXMuZmluZEl0ZW1JbmRleChpKTtcbiAgICAgICAgICB0aGlzLmFkdmFuY2VTY2hlZHVsZSh5LCBwLCB0LCBvLCBhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWR2YW5jZVNjaGVkdWxlKGUsIG4sIHQsIG8sIGEpO1xuICB9XG4gIGFkdmFuY2VTY2hlZHVsZShlLCB0LCByLCBuLCBpKSB7XG4gICAgY29uc3QgbyA9IHRoaXMuc2NoZWR1bGU7XG4gICAgaWYgKCFvKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGEgPSB0W2VdIHx8IG51bGwsIGwgPSB0aGlzLnByaW1hcnlNZWRpYSwgYyA9IHRoaXMucGxheWVyUXVldWU7XG4gICAgaWYgKGMubGVuZ3RoICYmIGMuZm9yRWFjaCgodSkgPT4ge1xuICAgICAgY29uc3QgZCA9IHUuaW50ZXJzdGl0aWFsLCBoID0gby5maW5kRXZlbnRJbmRleChkLmlkZW50aWZpZXIpO1xuICAgICAgKGggPCBlIHx8IGggPiBlICsgMSkgJiYgdGhpcy5jbGVhckludGVyc3RpdGlhbChkLCBhKTtcbiAgICB9KSwgdGhpcy5pc0ludGVyc3RpdGlhbChhKSkge1xuICAgICAgdGhpcy50aW1lbGluZVBvcyA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMudGltZWxpbmVQb3MsIGEuc3RhcnQpLCBhLmVuZCk7XG4gICAgICBjb25zdCB1ID0gYS5ldmVudDtcbiAgICAgIGlmIChyID09PSB2b2lkIDApIHtcbiAgICAgICAgciA9IG8uZmluZEFzc2V0SW5kZXgodSwgdGhpcy50aW1lbGluZVBvcyk7XG4gICAgICAgIGNvbnN0IHAgPSBUbCh1LCByIC0gMSk7XG4gICAgICAgIGlmICh1LmlzQXNzZXRQYXN0UGxheW91dExpbWl0KHApIHx8IHUuYXBwZW5kSW5QbGFjZSAmJiB0aGlzLnRpbWVsaW5lUG9zID09PSBhLmVuZCkge1xuICAgICAgICAgIHRoaXMuYWR2YW5jZUFmdGVyQXNzZXRFbmRlZCh1LCBlLCByKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgciA9IHA7XG4gICAgICB9XG4gICAgICBjb25zdCBkID0gdGhpcy53YWl0aW5nSXRlbTtcbiAgICAgIHRoaXMuYXNzZXRzQnVmZmVyZWQoYSwgbCkgfHwgdGhpcy5zZXRCdWZmZXJpbmdJdGVtKGEpO1xuICAgICAgbGV0IGggPSB0aGlzLnByZWxvYWRBc3NldHModSwgcik7XG4gICAgICBpZiAodGhpcy5ldmVudEl0ZW1zTWF0Y2goYSwgZCB8fCBuKSB8fCAodGhpcy53YWl0aW5nSXRlbSA9IGEsIHRoaXMubG9nKGBJTlRFUlNUSVRJQUxfU1RBUlRFRCAke2tyKGEpfSAke3UuYXBwZW5kSW5QbGFjZSA/IFwiYXBwZW5kIGluIHBsYWNlXCIgOiBcIlwifWApLCB0aGlzLmhscy50cmlnZ2VyKEkuSU5URVJTVElUSUFMX1NUQVJURUQsIHtcbiAgICAgICAgZXZlbnQ6IHUsXG4gICAgICAgIHNjaGVkdWxlOiB0LnNsaWNlKDApLFxuICAgICAgICBzY2hlZHVsZUluZGV4OiBlXG4gICAgICB9KSksICF1LmFzc2V0TGlzdExvYWRlZCkge1xuICAgICAgICB0aGlzLmxvZyhgV2FpdGluZyBmb3IgQVNTRVQtTElTVCB0byBjb21wbGV0ZSBsb2FkaW5nICR7dX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHUuYXNzZXRMaXN0TG9hZGVyICYmICh1LmFzc2V0TGlzdExvYWRlci5kZXN0cm95KCksIHUuYXNzZXRMaXN0TG9hZGVyID0gdm9pZCAwKSwgIWwpIHtcbiAgICAgICAgdGhpcy5sb2coYFdhaXRpbmcgZm9yIGF0dGFjaE1lZGlhIHRvIHN0YXJ0IEludGVyc3RpdGlhbCAke3V9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMud2FpdGluZ0l0ZW0gPSB0aGlzLmVuZGVkSXRlbSA9IG51bGwsIHRoaXMucGxheWluZ0l0ZW0gPSBhO1xuICAgICAgY29uc3QgZiA9IHUuYXNzZXRMaXN0W3JdO1xuICAgICAgaWYgKCFmKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZUFmdGVyQXNzZXRFbmRlZCh1LCBlLCByIHx8IDApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaCB8fCAoaCA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIoZi5pZGVudGlmaWVyKSksIGggPT09IG51bGwgfHwgaC5kZXN0cm95ZWQpIHtcbiAgICAgICAgY29uc3QgcCA9IHUuYXNzZXRMaXN0Lmxlbmd0aDtcbiAgICAgICAgdGhpcy53YXJuKGBhc3NldCAke3IgKyAxfS8ke3B9IHBsYXllciBkZXN0cm95ZWQgJHt1fWApLCBoID0gdGhpcy5jcmVhdGVBc3NldFBsYXllcih1LCBmLCByKSwgaC5sb2FkU291cmNlKCk7XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuZXZlbnRJdGVtc01hdGNoKGEsIHRoaXMuYnVmZmVyaW5nSXRlbSkgJiYgdS5hcHBlbmRJblBsYWNlICYmIHRoaXMuaXNBc3NldEJ1ZmZlcmVkKGYpKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnN0YXJ0QXNzZXRQbGF5ZXIoaCwgciwgdCwgZSwgbCksIHRoaXMuc2hvdWxkUGxheSAmJiBKaChoLm1lZGlhKTtcbiAgICB9IGVsc2UgYSA/ICh0aGlzLnJlc3VtZVByaW1hcnkoYSwgZSwgbiksIHRoaXMuc2hvdWxkUGxheSAmJiBKaCh0aGlzLmhscy5tZWRpYSkpIDogaSAmJiB0aGlzLmlzSW50ZXJzdGl0aWFsKG4pICYmICh0aGlzLmVuZGVkSXRlbSA9IG51bGwsIHRoaXMucGxheWluZ0l0ZW0gPSBuLCBuLmV2ZW50LmFwcGVuZEluUGxhY2UgfHwgdGhpcy5hdHRhY2hQcmltYXJ5KG8uZHVyYXRpb25zLnByaW1hcnksIG51bGwpKTtcbiAgfVxuICBnZXQgcGxheWJhY2tEaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5obHMuY29uZmlnLmVuYWJsZUludGVyc3RpdGlhbFBsYXliYWNrID09PSAhMTtcbiAgfVxuICBnZXQgcHJpbWFyeURldGFpbHMoKSB7XG4gICAgdmFyIGU7XG4gICAgcmV0dXJuIChlID0gdGhpcy5tZWRpYVNlbGVjdGlvbikgPT0gbnVsbCA/IHZvaWQgMCA6IGUubWFpbi5kZXRhaWxzO1xuICB9XG4gIGdldCBwcmltYXJ5TGl2ZSgpIHtcbiAgICB2YXIgZTtcbiAgICByZXR1cm4gISEoKGUgPSB0aGlzLnByaW1hcnlEZXRhaWxzKSAhPSBudWxsICYmIGUubGl2ZSk7XG4gIH1cbiAgcmVzdW1lUHJpbWFyeShlLCB0LCByKSB7XG4gICAgdmFyIG4sIGk7XG4gICAgaWYgKHRoaXMucGxheWluZ0l0ZW0gPSBlLCB0aGlzLnBsYXlpbmdBc3NldCA9IHRoaXMuZW5kZWRBc3NldCA9IG51bGwsIHRoaXMud2FpdGluZ0l0ZW0gPSB0aGlzLmVuZGVkSXRlbSA9IG51bGwsIHRoaXMuYnVmZmVyZWRUb0l0ZW0oZSksIHRoaXMubG9nKGByZXN1bWluZyAke2tyKGUpfWApLCAhKChuID0gdGhpcy5kZXRhY2hlZERhdGEpICE9IG51bGwgJiYgbi5tZWRpYVNvdXJjZSkpIHtcbiAgICAgIGxldCBhID0gdGhpcy50aW1lbGluZVBvcztcbiAgICAgIChhIDwgZS5zdGFydCB8fCBhID49IGUuZW5kKSAmJiAoYSA9IHRoaXMuZ2V0UHJpbWFyeVJlc3VtcHRpb24oZSwgdCksIHRoaXMubG9nKFFpKFwicmVzdW1lUHJpbWFyeVwiLCBhKSksIHRoaXMudGltZWxpbmVQb3MgPSBhKSwgdGhpcy5hdHRhY2hQcmltYXJ5KGEsIGUpO1xuICAgIH1cbiAgICBpZiAoIXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbyA9IChpID0gdGhpcy5zY2hlZHVsZSkgPT0gbnVsbCA/IHZvaWQgMCA6IGkuaXRlbXM7XG4gICAgbyAmJiAodGhpcy5sb2coYElOVEVSU1RJVElBTFNfUFJJTUFSWV9SRVNVTUVEICR7a3IoZSl9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5JTlRFUlNUSVRJQUxTX1BSSU1BUllfUkVTVU1FRCwge1xuICAgICAgc2NoZWR1bGU6IG8uc2xpY2UoMCksXG4gICAgICBzY2hlZHVsZUluZGV4OiB0XG4gICAgfSksIHRoaXMuY2hlY2tCdWZmZXIoKSk7XG4gIH1cbiAgZ2V0UHJpbWFyeVJlc3VtcHRpb24oZSwgdCkge1xuICAgIGNvbnN0IHIgPSBlLnN0YXJ0O1xuICAgIGlmICh0aGlzLnByaW1hcnlMaXZlKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5wcmltYXJ5RGV0YWlscztcbiAgICAgIGlmICh0ID09PSAwKVxuICAgICAgICByZXR1cm4gdGhpcy5obHMuc3RhcnRQb3NpdGlvbjtcbiAgICAgIGlmIChuICYmIChyIDwgbi5mcmFnbWVudFN0YXJ0IHx8IHIgPiBuLmVkZ2UpKVxuICAgICAgICByZXR1cm4gdGhpcy5obHMubGl2ZVN5bmNQb3NpdGlvbiB8fCAtMTtcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgaXNBc3NldEJ1ZmZlcmVkKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5nZXRBc3NldFBsYXllcihlLmlkZW50aWZpZXIpO1xuICAgIHJldHVybiB0ICE9IG51bGwgJiYgdC5obHMgPyB0Lmhscy5idWZmZXJlZFRvRW5kIDogQ2UuYnVmZmVySW5mbyh0aGlzLnByaW1hcnlNZWRpYSwgdGhpcy50aW1lbGluZVBvcywgMCkuZW5kICsgMSA+PSBlLnRpbWVsaW5lU3RhcnQgKyAoZS5kdXJhdGlvbiB8fCAwKTtcbiAgfVxuICBhdHRhY2hQcmltYXJ5KGUsIHQsIHIpIHtcbiAgICB0ID8gdGhpcy5zZXRCdWZmZXJpbmdJdGVtKHQpIDogdGhpcy5idWZmZXJpbmdJdGVtID0gdGhpcy5wbGF5aW5nSXRlbSwgdGhpcy5idWZmZXJpbmdBc3NldCA9IG51bGw7XG4gICAgY29uc3QgbiA9IHRoaXMucHJpbWFyeU1lZGlhO1xuICAgIGlmICghbilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gdGhpcy5obHM7XG4gICAgaS5tZWRpYSA/IHRoaXMuY2hlY2tCdWZmZXIoKSA6ICh0aGlzLnRyYW5zZmVyTWVkaWFUbyhpLCBuKSwgciAmJiB0aGlzLnN0YXJ0TG9hZGluZ1ByaW1hcnlBdChlLCByKSksIHIgfHwgKHRoaXMubG9nKFFpKFwiYXR0YWNoUHJpbWFyeVwiLCBlKSksIHRoaXMudGltZWxpbmVQb3MgPSBlLCB0aGlzLnN0YXJ0TG9hZGluZ1ByaW1hcnlBdChlLCByKSk7XG4gIH1cbiAgc3RhcnRMb2FkaW5nUHJpbWFyeUF0KGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gdGhpcy5obHM7XG4gICAgIW4ubG9hZGluZ0VuYWJsZWQgfHwgIW4ubWVkaWEgfHwgTWF0aC5hYnMoKCgociA9IG4ubWFpbkZvcndhcmRCdWZmZXJJbmZvKSA9PSBudWxsID8gdm9pZCAwIDogci5zdGFydCkgfHwgbi5tZWRpYS5jdXJyZW50VGltZSkgLSBlKSA+IDAuNSA/IG4uc3RhcnRMb2FkKGUsIHQpIDogbi5idWZmZXJpbmdFbmFibGVkIHx8IG4ucmVzdW1lQnVmZmVyaW5nKCk7XG4gIH1cbiAgLy8gSExTLmpzIGV2ZW50IGNhbGxiYWNrc1xuICBvbk1hbmlmZXN0TG9hZGluZygpIHtcbiAgICB2YXIgZTtcbiAgICB0aGlzLnN0b3BMb2FkKCksIChlID0gdGhpcy5zY2hlZHVsZSkgPT0gbnVsbCB8fCBlLnJlc2V0KCksIHRoaXMuZW1wdHlQbGF5ZXJRdWV1ZSgpLCB0aGlzLmNsZWFyU2NoZWR1bGVTdGF0ZSgpLCB0aGlzLnNob3VsZFBsYXkgPSAhMSwgdGhpcy5idWZmZXJlZFBvcyA9IHRoaXMudGltZWxpbmVQb3MgPSAtMSwgdGhpcy5tZWRpYVNlbGVjdGlvbiA9IHRoaXMuYWx0U2VsZWN0aW9uID0gdGhpcy5tYW5hZ2VyID0gdGhpcy5yZXF1aXJlZFRyYWNrcyA9IG51bGwsIHRoaXMuaGxzLm9mZihJLkJVRkZFUl9DT0RFQ1MsIHRoaXMub25CdWZmZXJDb2RlY3MsIHRoaXMpLCB0aGlzLmhscy5vbihJLkJVRkZFUl9DT0RFQ1MsIHRoaXMub25CdWZmZXJDb2RlY3MsIHRoaXMpO1xuICB9XG4gIG9uTGV2ZWxVcGRhdGVkKGUsIHQpIHtcbiAgICBpZiAodC5sZXZlbCA9PT0gLTEgfHwgIXRoaXMuc2NoZWR1bGUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLmxldmVsc1t0LmxldmVsXTtcbiAgICBpZiAoIXIuZGV0YWlscylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBuID0gdHQodHQoe30sIHRoaXMubWVkaWFTZWxlY3Rpb24gfHwgdGhpcy5hbHRTZWxlY3Rpb24pLCB7fSwge1xuICAgICAgbWFpbjogclxuICAgIH0pO1xuICAgIHRoaXMubWVkaWFTZWxlY3Rpb24gPSBuLCB0aGlzLnNjaGVkdWxlLnBhcnNlSW50ZXJzdGl0aWFsRGF0ZVJhbmdlcyhuLCB0aGlzLmhscy5jb25maWcuaW50ZXJzdGl0aWFsQXBwZW5kSW5QbGFjZSksICF0aGlzLmVmZmVjdGl2ZVBsYXlpbmdJdGVtICYmIHRoaXMuc2NoZWR1bGUuaXRlbXMgJiYgdGhpcy5jaGVja1N0YXJ0KCk7XG4gIH1cbiAgb25BdWRpb1RyYWNrVXBkYXRlZChlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLmF1ZGlvVHJhY2tzW3QuaWRdLCBuID0gdGhpcy5tZWRpYVNlbGVjdGlvbjtcbiAgICBpZiAoIW4pIHtcbiAgICAgIHRoaXMuYWx0U2VsZWN0aW9uID0gdHQodHQoe30sIHRoaXMuYWx0U2VsZWN0aW9uKSwge30sIHtcbiAgICAgICAgYXVkaW86IHJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpID0gdHQodHQoe30sIG4pLCB7fSwge1xuICAgICAgYXVkaW86IHJcbiAgICB9KTtcbiAgICB0aGlzLm1lZGlhU2VsZWN0aW9uID0gaTtcbiAgfVxuICBvblN1YnRpdGxlVHJhY2tVcGRhdGVkKGUsIHQpIHtcbiAgICBjb25zdCByID0gdGhpcy5obHMuc3VidGl0bGVUcmFja3NbdC5pZF0sIG4gPSB0aGlzLm1lZGlhU2VsZWN0aW9uO1xuICAgIGlmICghbikge1xuICAgICAgdGhpcy5hbHRTZWxlY3Rpb24gPSB0dCh0dCh7fSwgdGhpcy5hbHRTZWxlY3Rpb24pLCB7fSwge1xuICAgICAgICBzdWJ0aXRsZXM6IHJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpID0gdHQodHQoe30sIG4pLCB7fSwge1xuICAgICAgc3VidGl0bGVzOiByXG4gICAgfSk7XG4gICAgdGhpcy5tZWRpYVNlbGVjdGlvbiA9IGk7XG4gIH1cbiAgb25BdWRpb1RyYWNrU3dpdGNoaW5nKGUsIHQpIHtcbiAgICBjb25zdCByID0gY2godCk7XG4gICAgdGhpcy5wbGF5ZXJRdWV1ZS5mb3JFYWNoKCh7XG4gICAgICBobHM6IG5cbiAgICB9KSA9PiBuICYmIChuLnNldEF1ZGlvT3B0aW9uKHQpIHx8IG4uc2V0QXVkaW9PcHRpb24ocikpKTtcbiAgfVxuICBvblN1YnRpdGxlVHJhY2tTd2l0Y2goZSwgdCkge1xuICAgIGNvbnN0IHIgPSBjaCh0KTtcbiAgICB0aGlzLnBsYXllclF1ZXVlLmZvckVhY2goKHtcbiAgICAgIGhsczogblxuICAgIH0pID0+IG4gJiYgKG4uc2V0U3VidGl0bGVPcHRpb24odCkgfHwgdC5pZCAhPT0gLTEgJiYgbi5zZXRTdWJ0aXRsZU9wdGlvbihyKSkpO1xuICB9XG4gIG9uQnVmZmVyQ29kZWNzKGUsIHQpIHtcbiAgICBjb25zdCByID0gdC50cmFja3M7XG4gICAgciAmJiAodGhpcy5yZXF1aXJlZFRyYWNrcyA9IHIpO1xuICB9XG4gIG9uQnVmZmVyQXBwZW5kZWQoZSwgdCkge1xuICAgIHRoaXMuY2hlY2tCdWZmZXIoKTtcbiAgfVxuICBvbkJ1ZmZlckZsdXNoZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnBsYXlpbmdJdGVtO1xuICAgIGlmIChyICYmICF0aGlzLml0ZW1zTWF0Y2gociwgdGhpcy5idWZmZXJpbmdJdGVtKSAmJiAhdGhpcy5pc0ludGVyc3RpdGlhbChyKSkge1xuICAgICAgY29uc3QgbiA9IHRoaXMudGltZWxpbmVQb3M7XG4gICAgICB0aGlzLmJ1ZmZlcmVkUG9zID0gbiwgdGhpcy5jaGVja0J1ZmZlcigpO1xuICAgIH1cbiAgfVxuICBvbkJ1ZmZlcmVkVG9FbmQoZSkge1xuICAgIGlmICghdGhpcy5zY2hlZHVsZSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB0ID0gdGhpcy5zY2hlZHVsZS5ldmVudHM7XG4gICAgaWYgKHRoaXMuYnVmZmVyZWRQb3MgPCBOdW1iZXIuTUFYX1ZBTFVFICYmIHQpIHtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgdC5sZW5ndGg7IG4rKykge1xuICAgICAgICBjb25zdCBpID0gdFtuXTtcbiAgICAgICAgaWYgKGkuY3VlLnBvc3QpIHtcbiAgICAgICAgICB2YXIgcjtcbiAgICAgICAgICBjb25zdCBvID0gdGhpcy5zY2hlZHVsZS5maW5kRXZlbnRJbmRleChpLmlkZW50aWZpZXIpLCBhID0gKHIgPSB0aGlzLnNjaGVkdWxlLml0ZW1zKSA9PSBudWxsID8gdm9pZCAwIDogcltvXTtcbiAgICAgICAgICB0aGlzLmlzSW50ZXJzdGl0aWFsKGEpICYmIHRoaXMuZXZlbnRJdGVtc01hdGNoKGEsIHRoaXMuYnVmZmVyaW5nSXRlbSkgJiYgdGhpcy5idWZmZXJlZFRvSXRlbShhLCAwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5idWZmZXJlZFBvcyA9IE51bWJlci5NQVhfVkFMVUU7XG4gICAgfVxuICB9XG4gIG9uTWVkaWFFbmRlZChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMucGxheWluZ0l0ZW07XG4gICAgaWYgKCF0aGlzLnBsYXlpbmdMYXN0SXRlbSAmJiB0KSB7XG4gICAgICBjb25zdCByID0gdGhpcy5maW5kSXRlbUluZGV4KHQpO1xuICAgICAgdGhpcy5zZXRTY2hlZHVsZVBvc2l0aW9uKHIgKyAxKTtcbiAgICB9IGVsc2VcbiAgICAgIHRoaXMuc2hvdWxkUGxheSA9ICExO1xuICB9XG4gIHVwZGF0ZUl0ZW0oZSwgdCkge1xuICAgIHZhciByO1xuICAgIGNvbnN0IG4gPSAociA9IHRoaXMuc2NoZWR1bGUpID09IG51bGwgPyB2b2lkIDAgOiByLml0ZW1zO1xuICAgIGlmIChlICYmIG4pIHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLmZpbmRJdGVtSW5kZXgoZSwgdCk7XG4gICAgICByZXR1cm4gbltpXSB8fCBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB0cmltSW5QbGFjZShlLCB0KSB7XG4gICAgaWYgKHRoaXMuaXNJbnRlcnN0aXRpYWwoZSkgJiYgZS5ldmVudC5hcHBlbmRJblBsYWNlICYmIHQuZW5kIC0gZS5lbmQgPiAwLjI1KSB7XG4gICAgICBlLmV2ZW50LmFzc2V0TGlzdC5mb3JFYWNoKChpLCBvKSA9PiB7XG4gICAgICAgIGUuZXZlbnQuaXNBc3NldFBhc3RQbGF5b3V0TGltaXQobykgJiYgdGhpcy5jbGVhckFzc2V0UGxheWVyKGkuaWRlbnRpZmllciwgbnVsbCk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHIgPSBlLmVuZCArIDAuMjUsIG4gPSBDZS5idWZmZXJJbmZvKHRoaXMucHJpbWFyeU1lZGlhLCByLCAwKTtcbiAgICAgIChuLmVuZCA+IHIgfHwgKG4ubmV4dFN0YXJ0IHx8IDApID4gcikgJiYgKHRoaXMubG9nKGB0cmltIGJ1ZmZlcmVkIGludGVyc3RpdGlhbCAke2tyKGUpfSAod2FzICR7a3IodCl9KWApLCB0aGlzLmF0dGFjaFByaW1hcnkociwgbnVsbCwgITApLCB0aGlzLmZsdXNoRnJvbnRCdWZmZXIocikpO1xuICAgIH1cbiAgfVxuICBpdGVtc01hdGNoKGUsIHQpIHtcbiAgICByZXR1cm4gISF0ICYmIChlID09PSB0IHx8IGUuZXZlbnQgJiYgdC5ldmVudCAmJiB0aGlzLmV2ZW50SXRlbXNNYXRjaChlLCB0KSB8fCAhZS5ldmVudCAmJiAhdC5ldmVudCAmJiB0aGlzLmZpbmRJdGVtSW5kZXgoZSkgPT09IHRoaXMuZmluZEl0ZW1JbmRleCh0KSk7XG4gIH1cbiAgZXZlbnRJdGVtc01hdGNoKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICByZXR1cm4gISF0ICYmIChlID09PSB0IHx8IGUuZXZlbnQuaWRlbnRpZmllciA9PT0gKChyID0gdC5ldmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IHIuaWRlbnRpZmllcikpO1xuICB9XG4gIGZpbmRJdGVtSW5kZXgoZSwgdCkge1xuICAgIHJldHVybiBlICYmIHRoaXMuc2NoZWR1bGUgPyB0aGlzLnNjaGVkdWxlLmZpbmRJdGVtSW5kZXgoZSwgdCkgOiAtMTtcbiAgfVxuICB1cGRhdGVTY2hlZHVsZShlID0gITEpIHtcbiAgICB2YXIgdDtcbiAgICBjb25zdCByID0gdGhpcy5tZWRpYVNlbGVjdGlvbjtcbiAgICByICYmICgodCA9IHRoaXMuc2NoZWR1bGUpID09IG51bGwgfHwgdC51cGRhdGVTY2hlZHVsZShyLCBbXSwgZSkpO1xuICB9XG4gIC8vIFNjaGVkdWxlIGJ1ZmZlciBjb250cm9sXG4gIGNoZWNrQnVmZmVyKGUpIHtcbiAgICB2YXIgdDtcbiAgICBjb25zdCByID0gKHQgPSB0aGlzLnNjaGVkdWxlKSA9PSBudWxsID8gdm9pZCAwIDogdC5pdGVtcztcbiAgICBpZiAoIXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbiA9IENlLmJ1ZmZlckluZm8odGhpcy5wcmltYXJ5TWVkaWEsIHRoaXMudGltZWxpbmVQb3MsIDApO1xuICAgIGUgJiYgKHRoaXMuYnVmZmVyZWRQb3MgPSB0aGlzLnRpbWVsaW5lUG9zKSwgZSB8fCAoZSA9IG4ubGVuIDwgMSksIHRoaXMudXBkYXRlQnVmZmVyZWRQb3Mobi5lbmQsIHIsIGUpO1xuICB9XG4gIHVwZGF0ZUJ1ZmZlcmVkUG9zKGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdGhpcy5zY2hlZHVsZSwgaSA9IHRoaXMuYnVmZmVyaW5nSXRlbTtcbiAgICBpZiAodGhpcy5idWZmZXJlZFBvcyA+IGUgfHwgIW4pXG4gICAgICByZXR1cm47XG4gICAgaWYgKHQubGVuZ3RoID09PSAxICYmIHRoaXMuaXRlbXNNYXRjaCh0WzBdLCBpKSkge1xuICAgICAgdGhpcy5idWZmZXJlZFBvcyA9IGU7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG8gPSB0aGlzLnBsYXlpbmdJdGVtLCBhID0gdGhpcy5maW5kSXRlbUluZGV4KG8pO1xuICAgIGxldCBsID0gbi5maW5kSXRlbUluZGV4QXRUaW1lKGUpO1xuICAgIGlmICh0aGlzLmJ1ZmZlcmVkUG9zIDwgZSkge1xuICAgICAgdmFyIGM7XG4gICAgICBjb25zdCB1ID0gdGhpcy5maW5kSXRlbUluZGV4KGkpLCBkID0gTWF0aC5taW4odSArIDEsIHQubGVuZ3RoIC0gMSksIGggPSB0W2RdO1xuICAgICAgaWYgKChsID09PSAtMSAmJiBpICYmIGUgPj0gaS5lbmQgfHwgKGMgPSBoLmV2ZW50KSAhPSBudWxsICYmIGMuYXBwZW5kSW5QbGFjZSAmJiBlICsgMC4wMSA+PSBoLnN0YXJ0KSAmJiAobCA9IGQpLCB0aGlzLmlzSW50ZXJzdGl0aWFsKGkpKSB7XG4gICAgICAgIGNvbnN0IGYgPSBpLmV2ZW50O1xuICAgICAgICBpZiAoZCAtIGEgPiAxICYmIGYuYXBwZW5kSW5QbGFjZSA9PT0gITEgfHwgZi5hc3NldExpc3QubGVuZ3RoID09PSAwICYmIGYuYXNzZXRMaXN0TG9hZGVyKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmJ1ZmZlcmVkUG9zID0gZSwgbCA+IHUgJiYgbCA+IGEpXG4gICAgICAgIHRoaXMuYnVmZmVyZWRUb0l0ZW0oaCk7XG4gICAgICBlbHNlIHtcbiAgICAgICAgY29uc3QgZiA9IHRoaXMucHJpbWFyeURldGFpbHM7XG4gICAgICAgIHRoaXMucHJpbWFyeUxpdmUgJiYgZiAmJiBlID4gZi5lZGdlIC0gZi50YXJnZXRkdXJhdGlvbiAmJiBoLnN0YXJ0IDwgZi5lZGdlICsgdGhpcy5obHMuY29uZmlnLmludGVyc3RpdGlhbExpdmVMb29rQWhlYWQgJiYgdGhpcy5pc0ludGVyc3RpdGlhbChoKSAmJiB0aGlzLnByZWxvYWRBc3NldHMoaC5ldmVudCwgMCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHIgJiYgbyAmJiAhdGhpcy5pdGVtc01hdGNoKG8sIGkpICYmIChsID09PSBhID8gdGhpcy5idWZmZXJlZFRvSXRlbShvKSA6IGwgPT09IGEgKyAxICYmIHRoaXMuYnVmZmVyZWRUb0l0ZW0odFtsXSkpO1xuICB9XG4gIGFzc2V0c0J1ZmZlcmVkKGUsIHQpIHtcbiAgICByZXR1cm4gZS5ldmVudC5hc3NldExpc3QubGVuZ3RoID09PSAwID8gITEgOiAhZS5ldmVudC5hc3NldExpc3Quc29tZSgobikgPT4ge1xuICAgICAgY29uc3QgaSA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIobi5pZGVudGlmaWVyKTtcbiAgICAgIHJldHVybiAhKGkgIT0gbnVsbCAmJiBpLmJ1ZmZlcmVkSW5QbGFjZVRvRW5kKHQpKTtcbiAgICB9KTtcbiAgfVxuICBzZXRCdWZmZXJpbmdJdGVtKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5idWZmZXJpbmdJdGVtLCByID0gdGhpcy5zY2hlZHVsZTtcbiAgICBpZiAoIXRoaXMuaXRlbXNNYXRjaChlLCB0KSAmJiByKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGl0ZW1zOiBuLFxuICAgICAgICBldmVudHM6IGlcbiAgICAgIH0gPSByO1xuICAgICAgaWYgKCFuIHx8ICFpKVxuICAgICAgICByZXR1cm4gdDtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLmlzSW50ZXJzdGl0aWFsKGUpLCBhID0gdGhpcy5nZXRCdWZmZXJpbmdQbGF5ZXIoKTtcbiAgICAgIHRoaXMuYnVmZmVyaW5nSXRlbSA9IGUsIHRoaXMuYnVmZmVyZWRQb3MgPSBNYXRoLm1heChlLnN0YXJ0LCBNYXRoLm1pbihlLmVuZCwgdGhpcy50aW1lbGluZVBvcykpO1xuICAgICAgY29uc3QgbCA9IGEgPyBhLnJlbWFpbmluZyA6IHQgPyB0LmVuZCAtIHRoaXMudGltZWxpbmVQb3MgOiAwO1xuICAgICAgaWYgKHRoaXMubG9nKGBJTlRFUlNUSVRJQUxTX0JVRkZFUkVEX1RPX0JPVU5EQVJZICR7a3IoZSl9YCArICh0ID8gYCAoJHtsLnRvRml4ZWQoMil9IHJlbWFpbmluZylgIDogXCJcIikpLCAhdGhpcy5wbGF5YmFja0Rpc2FibGVkKVxuICAgICAgICBpZiAobykge1xuICAgICAgICAgIGNvbnN0IGMgPSByLmZpbmRBc3NldEluZGV4KGUuZXZlbnQsIHRoaXMuYnVmZmVyZWRQb3MpO1xuICAgICAgICAgIGUuZXZlbnQuYXNzZXRMaXN0LmZvckVhY2goKHUsIGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGggPSB0aGlzLmdldEFzc2V0UGxheWVyKHUuaWRlbnRpZmllcik7XG4gICAgICAgICAgICBoICYmIChkID09PSBjICYmIGgubG9hZFNvdXJjZSgpLCBoLnJlc3VtZUJ1ZmZlcmluZygpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgdGhpcy5obHMucmVzdW1lQnVmZmVyaW5nKCksIHRoaXMucGxheWVyUXVldWUuZm9yRWFjaCgoYykgPT4gYy5wYXVzZUJ1ZmZlcmluZygpKTtcbiAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5JTlRFUlNUSVRJQUxTX0JVRkZFUkVEX1RPX0JPVU5EQVJZLCB7XG4gICAgICAgIGV2ZW50czogaS5zbGljZSgwKSxcbiAgICAgICAgc2NoZWR1bGU6IG4uc2xpY2UoMCksXG4gICAgICAgIGJ1ZmZlcmluZ0luZGV4OiB0aGlzLmZpbmRJdGVtSW5kZXgoZSksXG4gICAgICAgIHBsYXlpbmdJbmRleDogdGhpcy5maW5kSXRlbUluZGV4KHRoaXMucGxheWluZ0l0ZW0pXG4gICAgICB9KTtcbiAgICB9IGVsc2UgdGhpcy5idWZmZXJpbmdJdGVtICE9PSBlICYmICh0aGlzLmJ1ZmZlcmluZ0l0ZW0gPSBlKTtcbiAgICByZXR1cm4gdDtcbiAgfVxuICBidWZmZXJlZFRvSXRlbShlLCB0ID0gMCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnNldEJ1ZmZlcmluZ0l0ZW0oZSk7XG4gICAgaWYgKCF0aGlzLnBsYXliYWNrRGlzYWJsZWQpIHtcbiAgICAgIGlmICh0aGlzLmlzSW50ZXJzdGl0aWFsKGUpKVxuICAgICAgICB0aGlzLmJ1ZmZlcmVkVG9FdmVudChlLCB0KTtcbiAgICAgIGVsc2UgaWYgKHIgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5idWZmZXJpbmdBc3NldCA9IG51bGw7XG4gICAgICAgIGNvbnN0IG4gPSB0aGlzLmRldGFjaGVkRGF0YTtcbiAgICAgICAgbiA/IG4ubWVkaWFTb3VyY2UgPyB0aGlzLmF0dGFjaFByaW1hcnkoZS5zdGFydCwgZSwgITApIDogdGhpcy5wcmVsb2FkUHJpbWFyeShlKSA6IHRoaXMucHJlbG9hZFByaW1hcnkoZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByZWxvYWRQcmltYXJ5KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5maW5kSXRlbUluZGV4KGUpLCByID0gdGhpcy5nZXRQcmltYXJ5UmVzdW1wdGlvbihlLCB0KTtcbiAgICB0aGlzLnN0YXJ0TG9hZGluZ1ByaW1hcnlBdChyKTtcbiAgfVxuICBidWZmZXJlZFRvRXZlbnQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBlLmV2ZW50LCBuID0gci5hc3NldExpc3QubGVuZ3RoID09PSAwICYmICFyLmFzc2V0TGlzdExvYWRlciwgaSA9IHIuY3VlLm9uY2U7XG4gICAgaWYgKG4gfHwgIWkpIHtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLnByZWxvYWRBc3NldHMociwgdCk7XG4gICAgICBpZiAobyAhPSBudWxsICYmIG8uaW50ZXJzdGl0aWFsLmFwcGVuZEluUGxhY2UpIHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMucHJpbWFyeU1lZGlhO1xuICAgICAgICBhICYmIHRoaXMuYnVmZmVyQXNzZXRQbGF5ZXIobywgYSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHByZWxvYWRBc3NldHMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBlLmFzc2V0VXJsLCBuID0gZS5hc3NldExpc3QubGVuZ3RoLCBpID0gbiA9PT0gMCAmJiAhZS5hc3NldExpc3RMb2FkZXIsIG8gPSBlLmN1ZS5vbmNlO1xuICAgIGlmIChpKSB7XG4gICAgICBjb25zdCBsID0gZS50aW1lbGluZVN0YXJ0O1xuICAgICAgaWYgKGUuYXBwZW5kSW5QbGFjZSkge1xuICAgICAgICB2YXIgYTtcbiAgICAgICAgY29uc3QgaCA9IHRoaXMucGxheWluZ0l0ZW07XG4gICAgICAgICF0aGlzLmlzSW50ZXJzdGl0aWFsKGgpICYmIChoID09IG51bGwgfHwgKGEgPSBoLm5leHRFdmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IGEuaWRlbnRpZmllcikgPT09IGUuaWRlbnRpZmllciAmJiB0aGlzLmZsdXNoRnJvbnRCdWZmZXIobCArIDAuMjUpO1xuICAgICAgfVxuICAgICAgbGV0IGMsIHUgPSAwO1xuICAgICAgaWYgKCF0aGlzLnBsYXlpbmdJdGVtICYmIHRoaXMucHJpbWFyeUxpdmUgJiYgKHUgPSB0aGlzLmhscy5zdGFydFBvc2l0aW9uLCB1ID09PSAtMSAmJiAodSA9IHRoaXMuaGxzLmxpdmVTeW5jUG9zaXRpb24gfHwgMCkpLCB1ICYmICEoZS5jdWUucHJlIHx8IGUuY3VlLnBvc3QpKSB7XG4gICAgICAgIGNvbnN0IGggPSB1IC0gbDtcbiAgICAgICAgaCA+IDAgJiYgKGMgPSBNYXRoLnJvdW5kKGggKiAxZTMpIC8gMWUzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmxvZyhgTG9hZCBpbnRlcnN0aXRpYWwgYXNzZXQgJHt0ICsgMX0vJHtyID8gMSA6IG59ICR7ZX0ke2MgPyBgIGxpdmUtc3RhcnQ6ICR7dX0gc3RhcnQtb2Zmc2V0OiAke2N9YCA6IFwiXCJ9YCksIHIpXG4gICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUFzc2V0KGUsIDAsIDAsIGwsIGUuZHVyYXRpb24sIHIpO1xuICAgICAgY29uc3QgZCA9IHRoaXMuYXNzZXRMaXN0TG9hZGVyLmxvYWRBc3NldExpc3QoZSwgYyk7XG4gICAgICBkICYmIChlLmFzc2V0TGlzdExvYWRlciA9IGQpO1xuICAgIH0gZWxzZSBpZiAoIW8gJiYgbikge1xuICAgICAgZm9yIChsZXQgYyA9IHQ7IGMgPCBuOyBjKyspIHtcbiAgICAgICAgY29uc3QgdSA9IGUuYXNzZXRMaXN0W2NdLCBkID0gdGhpcy5nZXRBc3NldFBsYXllclF1ZXVlSW5kZXgodS5pZGVudGlmaWVyKTtcbiAgICAgICAgKGQgPT09IC0xIHx8IHRoaXMucGxheWVyUXVldWVbZF0uZGVzdHJveWVkKSAmJiAhdS5lcnJvciAmJiB0aGlzLmNyZWF0ZUFzc2V0UGxheWVyKGUsIHUsIGMpO1xuICAgICAgfVxuICAgICAgY29uc3QgbCA9IGUuYXNzZXRMaXN0W3RdO1xuICAgICAgaWYgKGwpIHtcbiAgICAgICAgY29uc3QgYyA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIobC5pZGVudGlmaWVyKTtcbiAgICAgICAgcmV0dXJuIGMgJiYgYy5sb2FkU291cmNlKCksIGM7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGZsdXNoRnJvbnRCdWZmZXIoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLnJlcXVpcmVkVHJhY2tzO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmxvZyhgUmVtb3ZpbmcgZnJvbnQgYnVmZmVyIHN0YXJ0aW5nIGF0ICR7ZX1gKSwgT2JqZWN0LmtleXModCkuZm9yRWFjaCgobikgPT4ge1xuICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkJVRkZFUl9GTFVTSElORywge1xuICAgICAgICBzdGFydE9mZnNldDogZSxcbiAgICAgICAgZW5kT2Zmc2V0OiAxIC8gMCxcbiAgICAgICAgdHlwZTogblxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLy8gSW50ZXJzdGl0aWFsIEFzc2V0IFBsYXllciBjb250cm9sXG4gIGdldEFzc2V0UGxheWVyUXVldWVJbmRleChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMucGxheWVyUXVldWU7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCB0Lmxlbmd0aDsgcisrKVxuICAgICAgaWYgKGUgPT09IHRbcl0uYXNzZXRJZClcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGdldEFzc2V0UGxheWVyKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5nZXRBc3NldFBsYXllclF1ZXVlSW5kZXgoZSk7XG4gICAgcmV0dXJuIHRoaXMucGxheWVyUXVldWVbdF0gfHwgbnVsbDtcbiAgfVxuICBnZXRCdWZmZXJpbmdQbGF5ZXIoKSB7XG4gICAgY29uc3Qge1xuICAgICAgcGxheWVyUXVldWU6IGUsXG4gICAgICBwcmltYXJ5TWVkaWE6IHRcbiAgICB9ID0gdGhpcztcbiAgICBpZiAodCkge1xuICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBlLmxlbmd0aDsgcisrKVxuICAgICAgICBpZiAoZVtyXS5tZWRpYSA9PT0gdClcbiAgICAgICAgICByZXR1cm4gZVtyXTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY3JlYXRlQXNzZXQoZSwgdCwgciwgbiwgaSwgbykge1xuICAgIGNvbnN0IGEgPSB7XG4gICAgICBwYXJlbnRJZGVudGlmaWVyOiBlLmlkZW50aWZpZXIsXG4gICAgICBpZGVudGlmaWVyOiBndyhlLCBvLCB0KSxcbiAgICAgIGR1cmF0aW9uOiBpLFxuICAgICAgc3RhcnRPZmZzZXQ6IHIsXG4gICAgICB0aW1lbGluZVN0YXJ0OiBuLFxuICAgICAgdXJpOiBvXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVBc3NldFBsYXllcihlLCBhLCB0KTtcbiAgfVxuICBjcmVhdGVBc3NldFBsYXllcihlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IHRoaXMuaGxzLCBpID0gbi51c2VyQ29uZmlnO1xuICAgIGxldCBvID0gaS52aWRlb1ByZWZlcmVuY2U7XG4gICAgY29uc3QgYSA9IG4ubG9hZExldmVsT2JqIHx8IG4ubGV2ZWxzW24uY3VycmVudExldmVsXTtcbiAgICAobyB8fCBhKSAmJiAobyA9IG50KHt9LCBvKSwgYS52aWRlb0NvZGVjICYmIChvLnZpZGVvQ29kZWMgPSBhLnZpZGVvQ29kZWMpLCBhLnZpZGVvUmFuZ2UgJiYgKG8uYWxsb3dlZFZpZGVvUmFuZ2VzID0gW2EudmlkZW9SYW5nZV0pKTtcbiAgICBjb25zdCBsID0gbi5hdWRpb1RyYWNrc1tuLmF1ZGlvVHJhY2tdLCBjID0gbi5zdWJ0aXRsZVRyYWNrc1tuLnN1YnRpdGxlVHJhY2tdO1xuICAgIGxldCB1ID0gMDtcbiAgICBpZiAodGhpcy5wcmltYXJ5TGl2ZSB8fCBlLmFwcGVuZEluUGxhY2UpIHtcbiAgICAgIGNvbnN0IEYgPSB0aGlzLnRpbWVsaW5lUG9zIC0gdC50aW1lbGluZVN0YXJ0O1xuICAgICAgaWYgKEYgPiAxKSB7XG4gICAgICAgIGNvbnN0IE0gPSB0LmR1cmF0aW9uO1xuICAgICAgICBNICYmIEYgPCBNICYmICh1ID0gRik7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGQgPSB0LmlkZW50aWZpZXIsIGggPSB0dCh0dCh7fSwgaSksIHt9LCB7XG4gICAgICBtYXhNYXhCdWZmZXJMZW5ndGg6IE1hdGgubWluKDE4MCwgbi5jb25maWcubWF4TWF4QnVmZmVyTGVuZ3RoKSxcbiAgICAgIGF1dG9TdGFydExvYWQ6ICEwLFxuICAgICAgc3RhcnRGcmFnUHJlZmV0Y2g6ICEwLFxuICAgICAgcHJpbWFyeVNlc3Npb25JZDogbi5zZXNzaW9uSWQsXG4gICAgICBhc3NldFBsYXllcklkOiBkLFxuICAgICAgYWJyRXdtYURlZmF1bHRFc3RpbWF0ZTogbi5iYW5kd2lkdGhFc3RpbWF0ZSxcbiAgICAgIGludGVyc3RpdGlhbHNDb250cm9sbGVyOiB2b2lkIDAsXG4gICAgICBzdGFydFBvc2l0aW9uOiB1LFxuICAgICAgbGl2ZUR1cmF0aW9uSW5maW5pdHk6ICExLFxuICAgICAgdGVzdEJhbmR3aWR0aDogITEsXG4gICAgICB2aWRlb1ByZWZlcmVuY2U6IG8sXG4gICAgICBhdWRpb1ByZWZlcmVuY2U6IGwgfHwgaS5hdWRpb1ByZWZlcmVuY2UsXG4gICAgICBzdWJ0aXRsZVByZWZlcmVuY2U6IGMgfHwgaS5zdWJ0aXRsZVByZWZlcmVuY2VcbiAgICB9KTtcbiAgICBlLmFwcGVuZEluUGxhY2UgJiYgKGUuYXBwZW5kSW5QbGFjZVN0YXJ0ZWQgPSAhMCwgdC50aW1lbGluZVN0YXJ0ICYmIChoLnRpbWVsaW5lT2Zmc2V0ID0gdC50aW1lbGluZVN0YXJ0KSk7XG4gICAgY29uc3QgZiA9IGguY21jZDtcbiAgICBmICE9IG51bGwgJiYgZi5zZXNzaW9uSWQgJiYgZi5jb250ZW50SWQgJiYgKGguY21jZCA9IG50KHt9LCBmLCB7XG4gICAgICBjb250ZW50SWQ6IFhuKHQudXJpKVxuICAgIH0pKSwgdGhpcy5nZXRBc3NldFBsYXllcihkKSAmJiB0aGlzLndhcm4oYER1cGxpY2F0ZSBkYXRlIHJhbmdlIGlkZW50aWZpZXIgJHtlfSBhbmQgYXNzZXQgJHtkfWApO1xuICAgIGNvbnN0IHAgPSBuZXcgeXcodGhpcy5IbHNQbGF5ZXJDbGFzcywgaCwgZSwgdCk7XG4gICAgdGhpcy5wbGF5ZXJRdWV1ZS5wdXNoKHApLCBlLmFzc2V0TGlzdFtyXSA9IHQ7XG4gICAgbGV0IHkgPSAhMDtcbiAgICBjb25zdCBFID0gKEYpID0+IHtcbiAgICAgIGlmIChGLmxpdmUpIHtcbiAgICAgICAgdmFyIE07XG4gICAgICAgIGNvbnN0IGogPSBuZXcgRXJyb3IoYEludGVyc3RpdGlhbHMgTVVTVCBiZSBWT0QgYXNzZXRzICR7ZX1gKSwgQyA9IHtcbiAgICAgICAgICBmYXRhbDogITAsXG4gICAgICAgICAgdHlwZTogdmUuT1RIRVJfRVJST1IsXG4gICAgICAgICAgZGV0YWlsczogSi5JTlRFUlNUSVRJQUxfQVNTRVRfSVRFTV9FUlJPUixcbiAgICAgICAgICBlcnJvcjogalxuICAgICAgICB9LCBrID0gKChNID0gdGhpcy5zY2hlZHVsZSkgPT0gbnVsbCA/IHZvaWQgMCA6IE0uZmluZEV2ZW50SW5kZXgoZS5pZGVudGlmaWVyKSkgfHwgLTE7XG4gICAgICAgIHRoaXMuaGFuZGxlQXNzZXRJdGVtRXJyb3IoQywgZSwgaywgciwgai5tZXNzYWdlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgSCA9IEYuZWRnZSAtIEYuZnJhZ21lbnRTdGFydCwgSyA9IHQuZHVyYXRpb247XG4gICAgICAoeSB8fCBLID09PSBudWxsIHx8IEggPiBLKSAmJiAoeSA9ICExLCB0aGlzLmxvZyhgSW50ZXJzdGl0aWFsIGFzc2V0IFwiJHtkfVwiIGR1cmF0aW9uIGNoYW5nZSAke0t9ID4gJHtIfWApLCB0LmR1cmF0aW9uID0gSCwgdGhpcy51cGRhdGVTY2hlZHVsZSgpKTtcbiAgICB9O1xuICAgIHAub24oSS5MRVZFTF9VUERBVEVELCAoRiwge1xuICAgICAgZGV0YWlsczogTVxuICAgIH0pID0+IEUoTSkpLCBwLm9uKEkuTEVWRUxfUFRTX1VQREFURUQsIChGLCB7XG4gICAgICBkZXRhaWxzOiBNXG4gICAgfSkgPT4gRShNKSksIHAub24oSS5FVkVOVF9DVUVfRU5URVIsICgpID0+IHRoaXMub25JbnRlcnN0aXRpYWxDdWVFbnRlcigpKTtcbiAgICBjb25zdCBiID0gKEYsIE0pID0+IHtcbiAgICAgIGNvbnN0IEggPSB0aGlzLmdldEFzc2V0UGxheWVyKGQpO1xuICAgICAgaWYgKEggJiYgTS50cmFja3MpIHtcbiAgICAgICAgSC5vZmYoSS5CVUZGRVJfQ09ERUNTLCBiKSwgSC50cmFja3MgPSBNLnRyYWNrcztcbiAgICAgICAgY29uc3QgSyA9IHRoaXMucHJpbWFyeU1lZGlhO1xuICAgICAgICB0aGlzLmJ1ZmZlcmluZ0Fzc2V0ID09PSBILmFzc2V0SXRlbSAmJiBLICYmICFILm1lZGlhICYmIHRoaXMuYnVmZmVyQXNzZXRQbGF5ZXIoSCwgSyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBwLm9uKEkuQlVGRkVSX0NPREVDUywgYik7XG4gICAgY29uc3QgUiA9ICgpID0+IHtcbiAgICAgIHZhciBGO1xuICAgICAgY29uc3QgTSA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIoZCk7XG4gICAgICBpZiAodGhpcy5sb2coYGJ1ZmZlcmVkIHRvIGVuZCBvZiBhc3NldCAke019YCksICFNIHx8ICF0aGlzLnNjaGVkdWxlKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBIID0gdGhpcy5zY2hlZHVsZS5maW5kRXZlbnRJbmRleChlLmlkZW50aWZpZXIpLCBLID0gKEYgPSB0aGlzLnNjaGVkdWxlLml0ZW1zKSA9PSBudWxsID8gdm9pZCAwIDogRltIXTtcbiAgICAgIHRoaXMuaXNJbnRlcnN0aXRpYWwoSykgJiYgdGhpcy5hZHZhbmNlQXNzZXRCdWZmZXJpbmcoSywgdCk7XG4gICAgfTtcbiAgICBwLm9uKEkuQlVGRkVSRURfVE9fRU5ELCBSKTtcbiAgICBjb25zdCBBID0gKEYpID0+ICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5nZXRBc3NldFBsYXllcihkKSB8fCAhdGhpcy5zY2hlZHVsZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5zaG91bGRQbGF5ID0gITA7XG4gICAgICBjb25zdCBIID0gdGhpcy5zY2hlZHVsZS5maW5kRXZlbnRJbmRleChlLmlkZW50aWZpZXIpO1xuICAgICAgdGhpcy5hZHZhbmNlQWZ0ZXJBc3NldEVuZGVkKGUsIEgsIEYpO1xuICAgIH07XG4gICAgcmV0dXJuIHAub25jZShJLk1FRElBX0VOREVELCBBKHIpKSwgcC5vbmNlKEkuUExBWU9VVF9MSU1JVF9SRUFDSEVELCBBKDEgLyAwKSksIHAub24oSS5FUlJPUiwgKEYsIE0pID0+IHtcbiAgICAgIGlmICghdGhpcy5zY2hlZHVsZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgSCA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXIoZCk7XG4gICAgICBpZiAoTS5kZXRhaWxzID09PSBKLkJVRkZFUl9TVEFMTEVEX0VSUk9SKSB7XG4gICAgICAgIGlmIChIICE9IG51bGwgJiYgSC5hcHBlbmRJblBsYWNlKSB7XG4gICAgICAgICAgdGhpcy5oYW5kbGVJblBsYWNlU3RhbGwoZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25UaW1ldXBkYXRlKCksIHRoaXMuY2hlY2tCdWZmZXIoITApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmhhbmRsZUFzc2V0SXRlbUVycm9yKE0sIGUsIHRoaXMuc2NoZWR1bGUuZmluZEV2ZW50SW5kZXgoZS5pZGVudGlmaWVyKSwgciwgYEFzc2V0IHBsYXllciBlcnJvciAke00uZXJyb3J9ICR7ZX1gKTtcbiAgICB9KSwgcC5vbihJLkRFU1RST1lJTkcsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5nZXRBc3NldFBsYXllcihkKSB8fCAhdGhpcy5zY2hlZHVsZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgTSA9IG5ldyBFcnJvcihgQXNzZXQgcGxheWVyIGRlc3Ryb3llZCB1bmV4cGVjdGVkbHkgJHtkfWApLCBIID0ge1xuICAgICAgICBmYXRhbDogITAsXG4gICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLklOVEVSU1RJVElBTF9BU1NFVF9JVEVNX0VSUk9SLFxuICAgICAgICBlcnJvcjogTVxuICAgICAgfTtcbiAgICAgIHRoaXMuaGFuZGxlQXNzZXRJdGVtRXJyb3IoSCwgZSwgdGhpcy5zY2hlZHVsZS5maW5kRXZlbnRJbmRleChlLmlkZW50aWZpZXIpLCByLCBNLm1lc3NhZ2UpO1xuICAgIH0pLCB0aGlzLmxvZyhgSU5URVJTVElUSUFMX0FTU0VUX1BMQVlFUl9DUkVBVEVEICR7dm4odCl9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5JTlRFUlNUSVRJQUxfQVNTRVRfUExBWUVSX0NSRUFURUQsIHtcbiAgICAgIGFzc2V0OiB0LFxuICAgICAgYXNzZXRMaXN0SW5kZXg6IHIsXG4gICAgICBldmVudDogZSxcbiAgICAgIHBsYXllcjogcFxuICAgIH0pLCBwO1xuICB9XG4gIGNsZWFySW50ZXJzdGl0aWFsKGUsIHQpIHtcbiAgICBlLmFzc2V0TGlzdC5mb3JFYWNoKChyKSA9PiB7XG4gICAgICB0aGlzLmNsZWFyQXNzZXRQbGF5ZXIoci5pZGVudGlmaWVyLCB0KTtcbiAgICB9KSwgZS5yZXNldCgpO1xuICB9XG4gIHJlc2V0QXNzZXRQbGF5ZXIoZSkge1xuICAgIGNvbnN0IHQgPSB0aGlzLmdldEFzc2V0UGxheWVyUXVldWVJbmRleChlKTtcbiAgICBpZiAodCAhPT0gLTEpIHtcbiAgICAgIHRoaXMubG9nKGByZXNldCBhc3NldCBwbGF5ZXIgXCIke2V9XCIgYWZ0ZXIgZXJyb3JgKTtcbiAgICAgIGNvbnN0IHIgPSB0aGlzLnBsYXllclF1ZXVlW3RdO1xuICAgICAgdGhpcy50cmFuc2Zlck1lZGlhRnJvbVBsYXllcihyLCBudWxsKSwgci5yZXNldERldGFpbHMoKTtcbiAgICB9XG4gIH1cbiAgY2xlYXJBc3NldFBsYXllcihlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuZ2V0QXNzZXRQbGF5ZXJRdWV1ZUluZGV4KGUpO1xuICAgIGlmIChyICE9PSAtMSkge1xuICAgICAgY29uc3QgbiA9IHRoaXMucGxheWVyUXVldWVbcl07XG4gICAgICB0aGlzLmxvZyhgY2xlYXIgJHtufSB0b1NlZ21lbnQ6ICR7dCAmJiBrcih0KX1gKSwgdGhpcy50cmFuc2Zlck1lZGlhRnJvbVBsYXllcihuLCB0KSwgdGhpcy5wbGF5ZXJRdWV1ZS5zcGxpY2UociwgMSksIG4uZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuICBlbXB0eVBsYXllclF1ZXVlKCkge1xuICAgIGxldCBlO1xuICAgIGZvciAoOyBlID0gdGhpcy5wbGF5ZXJRdWV1ZS5wb3AoKTsgKVxuICAgICAgZS5kZXN0cm95KCk7XG4gICAgdGhpcy5wbGF5ZXJRdWV1ZSA9IFtdO1xuICB9XG4gIHN0YXJ0QXNzZXRQbGF5ZXIoZSwgdCwgciwgbiwgaSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVyc3RpdGlhbDogbyxcbiAgICAgIGFzc2V0SXRlbTogYSxcbiAgICAgIGFzc2V0SWQ6IGxcbiAgICB9ID0gZSwgYyA9IG8uYXNzZXRMaXN0Lmxlbmd0aCwgdSA9IHRoaXMucGxheWluZ0Fzc2V0O1xuICAgIHRoaXMuZW5kZWRBc3NldCA9IG51bGwsIHRoaXMucGxheWluZ0Fzc2V0ID0gYSwgKCF1IHx8IHUuaWRlbnRpZmllciAhPT0gbCkgJiYgKHUgJiYgKHRoaXMuY2xlYXJBc3NldFBsYXllcih1LmlkZW50aWZpZXIsIHJbbl0pLCBkZWxldGUgdS5lcnJvciksIHRoaXMubG9nKGBJTlRFUlNUSVRJQUxfQVNTRVRfU1RBUlRFRCAke3QgKyAxfS8ke2N9ICR7dm4oYSl9YCksIHRoaXMuaGxzLnRyaWdnZXIoSS5JTlRFUlNUSVRJQUxfQVNTRVRfU1RBUlRFRCwge1xuICAgICAgYXNzZXQ6IGEsXG4gICAgICBhc3NldExpc3RJbmRleDogdCxcbiAgICAgIGV2ZW50OiBvLFxuICAgICAgc2NoZWR1bGU6IHIuc2xpY2UoMCksXG4gICAgICBzY2hlZHVsZUluZGV4OiBuLFxuICAgICAgcGxheWVyOiBlXG4gICAgfSkpLCB0aGlzLmJ1ZmZlckFzc2V0UGxheWVyKGUsIGkpO1xuICB9XG4gIGJ1ZmZlckFzc2V0UGxheWVyKGUsIHQpIHtcbiAgICB2YXIgciwgbjtcbiAgICBpZiAoIXRoaXMuc2NoZWR1bGUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJzdGl0aWFsOiBpLFxuICAgICAgYXNzZXRJdGVtOiBvXG4gICAgfSA9IGUsIGEgPSB0aGlzLnNjaGVkdWxlLmZpbmRFdmVudEluZGV4KGkuaWRlbnRpZmllciksIGwgPSAociA9IHRoaXMuc2NoZWR1bGUuaXRlbXMpID09IG51bGwgPyB2b2lkIDAgOiByW2FdO1xuICAgIGlmICghbClcbiAgICAgIHJldHVybjtcbiAgICBlLmxvYWRTb3VyY2UoKSwgdGhpcy5zZXRCdWZmZXJpbmdJdGVtKGwpLCB0aGlzLmJ1ZmZlcmluZ0Fzc2V0ID0gbztcbiAgICBjb25zdCBjID0gdGhpcy5nZXRCdWZmZXJpbmdQbGF5ZXIoKTtcbiAgICBpZiAoYyA9PT0gZSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB1ID0gaS5hcHBlbmRJblBsYWNlO1xuICAgIGlmICh1ICYmIChjID09IG51bGwgPyB2b2lkIDAgOiBjLmludGVyc3RpdGlhbC5hcHBlbmRJblBsYWNlKSA9PT0gITEpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgZCA9IChjID09IG51bGwgPyB2b2lkIDAgOiBjLnRyYWNrcykgfHwgKChuID0gdGhpcy5kZXRhY2hlZERhdGEpID09IG51bGwgPyB2b2lkIDAgOiBuLnRyYWNrcykgfHwgdGhpcy5yZXF1aXJlZFRyYWNrcztcbiAgICBpZiAodSAmJiBvICE9PSB0aGlzLnBsYXlpbmdBc3NldCkge1xuICAgICAgaWYgKCFlLnRyYWNrcykge1xuICAgICAgICB0aGlzLmxvZyhgV2FpdGluZyBmb3IgdHJhY2sgaW5mbyBiZWZvcmUgYnVmZmVyaW5nICR7ZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGQgJiYgIUFnKGQsIGUudHJhY2tzKSkge1xuICAgICAgICBjb25zdCBoID0gbmV3IEVycm9yKGBBc3NldCAke3ZuKG8pfSBTb3VyY2VCdWZmZXIgdHJhY2tzICgnJHtPYmplY3Qua2V5cyhlLnRyYWNrcyl9JykgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggcHJpbWFyeSBjb250ZW50IHRyYWNrcyAoJyR7T2JqZWN0LmtleXMoZCl9JylgKSwgZiA9IHtcbiAgICAgICAgICBmYXRhbDogITAsXG4gICAgICAgICAgdHlwZTogdmUuT1RIRVJfRVJST1IsXG4gICAgICAgICAgZGV0YWlsczogSi5JTlRFUlNUSVRJQUxfQVNTRVRfSVRFTV9FUlJPUixcbiAgICAgICAgICBlcnJvcjogaFxuICAgICAgICB9LCBwID0gaS5maW5kQXNzZXRJbmRleChvKTtcbiAgICAgICAgdGhpcy5oYW5kbGVBc3NldEl0ZW1FcnJvcihmLCBpLCBhLCBwLCBoLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMudHJhbnNmZXJNZWRpYVRvKGUsIHQpO1xuICB9XG4gIGhhbmRsZUluUGxhY2VTdGFsbChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuc2NoZWR1bGUsIHIgPSB0aGlzLnByaW1hcnlNZWRpYTtcbiAgICBpZiAoIXQgfHwgIXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbiA9IHIuY3VycmVudFRpbWUsIGkgPSB0LmZpbmRBc3NldEluZGV4KGUsIG4pLCBvID0gZS5hc3NldExpc3RbaV07XG4gICAgaWYgKG8pIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLmdldEFzc2V0UGxheWVyKG8uaWRlbnRpZmllcik7XG4gICAgICBpZiAoYSkge1xuICAgICAgICBjb25zdCBsID0gYS5jdXJyZW50VGltZSB8fCBuIC0gby50aW1lbGluZVN0YXJ0LCBjID0gYS5kdXJhdGlvbiAtIGw7XG4gICAgICAgIGlmICh0aGlzLndhcm4oYFN0YWxsZWQgYXQgJHtsfSBvZiAke2wgKyBjfSBpbiAke2F9ICR7ZX0gKG1lZGlhLmN1cnJlbnRUaW1lOiAke259KWApLCBsICYmIChjIC8gci5wbGF5YmFja1JhdGUgPCAwLjUgfHwgYS5idWZmZXJlZEluUGxhY2VUb0VuZChyKSkgJiYgYS5obHMpIHtcbiAgICAgICAgICBjb25zdCB1ID0gdC5maW5kRXZlbnRJbmRleChlLmlkZW50aWZpZXIpO1xuICAgICAgICAgIHRoaXMuYWR2YW5jZUFmdGVyQXNzZXRFbmRlZChlLCB1LCBpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBhZHZhbmNlSW5QbGFjZShlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMucHJpbWFyeU1lZGlhO1xuICAgIHQgJiYgdC5jdXJyZW50VGltZSA8IGUgJiYgKHQuY3VycmVudFRpbWUgPSBlKTtcbiAgfVxuICBoYW5kbGVBc3NldEl0ZW1FcnJvcihlLCB0LCByLCBuLCBpKSB7XG4gICAgaWYgKGUuZGV0YWlscyA9PT0gSi5CVUZGRVJfU1RBTExFRF9FUlJPUilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBvID0gdC5hc3NldExpc3Rbbl0gfHwgbnVsbDtcbiAgICBpZiAodGhpcy53YXJuKGBJTlRFUlNUSVRJQUxfQVNTRVRfRVJST1IgJHtvICYmIHZuKG8pfSAke2UuZXJyb3J9YCksICF0aGlzLnNjaGVkdWxlKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGEgPSAobyA9PSBudWxsID8gdm9pZCAwIDogby5pZGVudGlmaWVyKSB8fCBcIlwiLCBsID0gdGhpcy5nZXRBc3NldFBsYXllclF1ZXVlSW5kZXgoYSksIGMgPSB0aGlzLnBsYXllclF1ZXVlW2xdIHx8IG51bGwsIHUgPSB0aGlzLnNjaGVkdWxlLml0ZW1zLCBkID0gbnQoe30sIGUsIHtcbiAgICAgIGZhdGFsOiAhMSxcbiAgICAgIGVycm9yQWN0aW9uOiBBbighMCksXG4gICAgICBhc3NldDogbyxcbiAgICAgIGFzc2V0TGlzdEluZGV4OiBuLFxuICAgICAgZXZlbnQ6IHQsXG4gICAgICBzY2hlZHVsZTogdSxcbiAgICAgIHNjaGVkdWxlSW5kZXg6IHIsXG4gICAgICBwbGF5ZXI6IGNcbiAgICB9KTtcbiAgICBpZiAodGhpcy5obHMudHJpZ2dlcihJLklOVEVSU1RJVElBTF9BU1NFVF9FUlJPUiwgZCksICFlLmZhdGFsKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGggPSB0aGlzLnBsYXlpbmdBc3NldCwgZiA9IHRoaXMuYnVmZmVyaW5nQXNzZXQsIHAgPSBuZXcgRXJyb3IoaSk7XG4gICAgaWYgKG8gJiYgKHRoaXMuY2xlYXJBc3NldFBsYXllcihhLCBudWxsKSwgby5lcnJvciA9IHApLCAhdC5hc3NldExpc3Quc29tZSgoeSkgPT4gIXkuZXJyb3IpKVxuICAgICAgdC5lcnJvciA9IHA7XG4gICAgZWxzZVxuICAgICAgZm9yIChsZXQgeSA9IG47IHkgPCB0LmFzc2V0TGlzdC5sZW5ndGg7IHkrKylcbiAgICAgICAgdGhpcy5yZXNldEFzc2V0UGxheWVyKHQuYXNzZXRMaXN0W3ldLmlkZW50aWZpZXIpO1xuICAgIHRoaXMudXBkYXRlU2NoZWR1bGUoITApLCB0LmVycm9yID8gdGhpcy5wcmltYXJ5RmFsbGJhY2sodCkgOiBoICYmIGguaWRlbnRpZmllciA9PT0gYSA/IHRoaXMuYWR2YW5jZUFmdGVyQXNzZXRFbmRlZCh0LCByLCBuKSA6IGYgJiYgZi5pZGVudGlmaWVyID09PSBhICYmIHRoaXMuaXNJbnRlcnN0aXRpYWwodGhpcy5idWZmZXJpbmdJdGVtKSAmJiB0aGlzLmFkdmFuY2VBc3NldEJ1ZmZlcmluZyh0aGlzLmJ1ZmZlcmluZ0l0ZW0sIGYpO1xuICB9XG4gIHByaW1hcnlGYWxsYmFjayhlKSB7XG4gICAgY29uc3QgdCA9IGUudGltZWxpbmVTdGFydCwgciA9IHRoaXMuZWZmZWN0aXZlUGxheWluZ0l0ZW07XG4gICAgaWYgKHIpIHtcbiAgICAgIHRoaXMubG9nKGBGYWxsYmFjayB0byBwcmltYXJ5IGZyb20gZXZlbnQgXCIke2UuaWRlbnRpZmllcn1cIiBzdGFydDogJHt0fSBwb3M6ICR7dGhpcy50aW1lbGluZVBvc30gcGxheWluZzogJHtrcihyKX0gZXJyb3I6ICR7ZS5lcnJvcn1gKTtcbiAgICAgIGxldCBuID0gdGhpcy50aW1lbGluZVBvcztcbiAgICAgIG4gPT09IC0xICYmIChuID0gdGhpcy5obHMuc3RhcnRQb3NpdGlvbik7XG4gICAgICBjb25zdCBpID0gdGhpcy51cGRhdGVJdGVtKHIsIG4pO1xuICAgICAgaWYgKHRoaXMuaXRlbXNNYXRjaChyLCBpKSAmJiB0aGlzLmNsZWFySW50ZXJzdGl0aWFsKGUsIG51bGwpLCBlLmFwcGVuZEluUGxhY2UgJiYgKHRoaXMuYXR0YWNoUHJpbWFyeSh0LCBudWxsKSwgdGhpcy5mbHVzaEZyb250QnVmZmVyKHQpKSwgIXRoaXMuc2NoZWR1bGUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLnNjaGVkdWxlLmZpbmRJdGVtSW5kZXhBdFRpbWUobik7XG4gICAgICB0aGlzLnNldFNjaGVkdWxlUG9zaXRpb24obyk7XG4gICAgfSBlbHNlXG4gICAgICB0aGlzLmNoZWNrU3RhcnQoKTtcbiAgfVxuICAvLyBBc3NldCBMaXN0IGxvYWRpbmdcbiAgb25Bc3NldExpc3RMb2FkZWQoZSwgdCkge1xuICAgIHZhciByLCBuO1xuICAgIGNvbnN0IGkgPSB0LmV2ZW50LCBvID0gaS5pZGVudGlmaWVyLCBhID0gdC5hc3NldExpc3RSZXNwb25zZS5BU1NFVFM7XG4gICAgaWYgKCEoKHIgPSB0aGlzLnNjaGVkdWxlKSAhPSBudWxsICYmIHIuaGFzRXZlbnQobykpKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGwgPSBpLnRpbWVsaW5lU3RhcnQsIGMgPSBpLmR1cmF0aW9uO1xuICAgIGxldCB1ID0gMDtcbiAgICBhLmZvckVhY2goKHksIEUpID0+IHtcbiAgICAgIGNvbnN0IGIgPSBwYXJzZUZsb2F0KHkuRFVSQVRJT04pO1xuICAgICAgdGhpcy5jcmVhdGVBc3NldChpLCBFLCB1LCBsICsgdSwgYiwgeS5VUkkpLCB1ICs9IGI7XG4gICAgfSksIGkuZHVyYXRpb24gPSB1LCB0aGlzLmxvZyhgTG9hZGVkIGFzc2V0LWxpc3Qgd2l0aCBkdXJhdGlvbjogJHt1fSAod2FzOiAke2N9KSAke2l9YCk7XG4gICAgY29uc3QgZCA9IHRoaXMud2FpdGluZ0l0ZW0sIGggPSAoZCA9PSBudWxsID8gdm9pZCAwIDogZC5ldmVudC5pZGVudGlmaWVyKSA9PT0gbztcbiAgICB0aGlzLnVwZGF0ZVNjaGVkdWxlKCk7XG4gICAgY29uc3QgZiA9IChuID0gdGhpcy5idWZmZXJpbmdJdGVtKSA9PSBudWxsID8gdm9pZCAwIDogbi5ldmVudDtcbiAgICBpZiAoaCkge1xuICAgICAgdmFyIHA7XG4gICAgICBjb25zdCB5ID0gdGhpcy5zY2hlZHVsZS5maW5kRXZlbnRJbmRleChvKSwgRSA9IChwID0gdGhpcy5zY2hlZHVsZS5pdGVtcykgPT0gbnVsbCA/IHZvaWQgMCA6IHBbeV07XG4gICAgICBpZiAoRSkge1xuICAgICAgICBpZiAoIXRoaXMucGxheWluZ0l0ZW0gJiYgdGhpcy50aW1lbGluZVBvcyA+IEUuZW5kICYmIHRoaXMuc2NoZWR1bGUuZmluZEl0ZW1JbmRleEF0VGltZSh0aGlzLnRpbWVsaW5lUG9zKSAhPT0geSkge1xuICAgICAgICAgIGkuZXJyb3IgPSBuZXcgRXJyb3IoYEludGVyc3RpdGlhbCBubyBsb25nZXIgd2l0aGluIHBsYXliYWNrIHJhbmdlICR7dGhpcy50aW1lbGluZVBvc30gJHtpfWApLCB0aGlzLnVwZGF0ZVNjaGVkdWxlKCEwKSwgdGhpcy5wcmltYXJ5RmFsbGJhY2soaSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0QnVmZmVyaW5nSXRlbShFKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0U2NoZWR1bGVQb3NpdGlvbih5KTtcbiAgICB9IGVsc2UgaWYgKChmID09IG51bGwgPyB2b2lkIDAgOiBmLmlkZW50aWZpZXIpID09PSBvKSB7XG4gICAgICBjb25zdCB5ID0gaS5hc3NldExpc3RbMF07XG4gICAgICBpZiAoeSkge1xuICAgICAgICBjb25zdCBFID0gdGhpcy5nZXRBc3NldFBsYXllcih5LmlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoZi5hcHBlbmRJblBsYWNlKSB7XG4gICAgICAgICAgY29uc3QgYiA9IHRoaXMucHJpbWFyeU1lZGlhO1xuICAgICAgICAgIEUgJiYgYiAmJiB0aGlzLmJ1ZmZlckFzc2V0UGxheWVyKEUsIGIpO1xuICAgICAgICB9IGVsc2UgRSAmJiBFLmxvYWRTb3VyY2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgaWYgKHRoaXMuc2NoZWR1bGUpXG4gICAgICBzd2l0Y2ggKHQuZGV0YWlscykge1xuICAgICAgICBjYXNlIEouQVNTRVRfTElTVF9QQVJTSU5HX0VSUk9SOlxuICAgICAgICBjYXNlIEouQVNTRVRfTElTVF9MT0FEX0VSUk9SOlxuICAgICAgICBjYXNlIEouQVNTRVRfTElTVF9MT0FEX1RJTUVPVVQ6IHtcbiAgICAgICAgICBjb25zdCByID0gdC5pbnRlcnN0aXRpYWw7XG4gICAgICAgICAgciAmJiAodGhpcy51cGRhdGVTY2hlZHVsZSghMCksIHRoaXMucHJpbWFyeUZhbGxiYWNrKHIpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlIEouQlVGRkVSX1NUQUxMRURfRVJST1I6IHtcbiAgICAgICAgICBjb25zdCByID0gdGhpcy5lbmRlZEl0ZW0gfHwgdGhpcy53YWl0aW5nSXRlbSB8fCB0aGlzLnBsYXlpbmdJdGVtO1xuICAgICAgICAgIGlmICh0aGlzLmlzSW50ZXJzdGl0aWFsKHIpICYmIHIuZXZlbnQuYXBwZW5kSW5QbGFjZSkge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVJblBsYWNlU3RhbGwoci5ldmVudCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMubG9nKGBQcmltYXJ5IHBsYXllciBzdGFsbCBAJHt0aGlzLnRpbWVsaW5lUG9zfSBidWZmZXJlZFBvczogJHt0aGlzLmJ1ZmZlcmVkUG9zfWApLCB0aGlzLm9uVGltZXVwZGF0ZSgpLCB0aGlzLmNoZWNrQnVmZmVyKCEwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICB9XG59XG5jb25zdCBRaCA9IDUwMDtcbmNsYXNzIFN3IGV4dGVuZHMgVHUge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgc3VwZXIoZSwgdCwgciwgXCJzdWJ0aXRsZS1zdHJlYW0tY29udHJvbGxlclwiLCBwZS5TVUJUSVRMRSksIHRoaXMuY3VycmVudFRyYWNrSWQgPSAtMSwgdGhpcy50cmFja3NCdWZmZXJlZCA9IFtdLCB0aGlzLm1haW5EZXRhaWxzID0gbnVsbCwgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIG9uSGFuZGxlckRlc3Ryb3lpbmcoKSB7XG4gICAgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHN1cGVyLm9uSGFuZGxlckRlc3Ryb3lpbmcoKSwgdGhpcy5tYWluRGV0YWlscyA9IG51bGw7XG4gIH1cbiAgcmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgc3VwZXIucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlLm9uKEkuTEVWRUxfTE9BREVELCB0aGlzLm9uTGV2ZWxMb2FkZWQsIHRoaXMpLCBlLm9uKEkuU1VCVElUTEVfVFJBQ0tTX1VQREFURUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrc1VwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuU1VCVElUTEVfVFJBQ0tfU1dJVENILCB0aGlzLm9uU3VidGl0bGVUcmFja1N3aXRjaCwgdGhpcyksIGUub24oSS5TVUJUSVRMRV9UUkFDS19MT0FERUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrTG9hZGVkLCB0aGlzKSwgZS5vbihJLlNVQlRJVExFX0ZSQUdfUFJPQ0VTU0VELCB0aGlzLm9uU3VidGl0bGVGcmFnUHJvY2Vzc2VkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKTtcbiAgfVxuICB1bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIHN1cGVyLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlLm9mZihJLkxFVkVMX0xPQURFRCwgdGhpcy5vbkxldmVsTG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5TVUJUSVRMRV9UUkFDS1NfVVBEQVRFRCwgdGhpcy5vblN1YnRpdGxlVHJhY2tzVXBkYXRlZCwgdGhpcyksIGUub2ZmKEkuU1VCVElUTEVfVFJBQ0tfU1dJVENILCB0aGlzLm9uU3VidGl0bGVUcmFja1N3aXRjaCwgdGhpcyksIGUub2ZmKEkuU1VCVElUTEVfVFJBQ0tfTE9BREVELCB0aGlzLm9uU3VidGl0bGVUcmFja0xvYWRlZCwgdGhpcyksIGUub2ZmKEkuU1VCVElUTEVfRlJBR19QUk9DRVNTRUQsIHRoaXMub25TdWJ0aXRsZUZyYWdQcm9jZXNzZWQsIHRoaXMpLCBlLm9mZihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKTtcbiAgfVxuICBzdGFydExvYWQoZSwgdCkge1xuICAgIHRoaXMuc3RvcExvYWQoKSwgdGhpcy5zdGF0ZSA9IG5lLklETEUsIHRoaXMuc2V0SW50ZXJ2YWwoUWgpLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IGUgKyB0aGlzLnRpbWVsaW5lT2Zmc2V0LCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0ID8gLTEgOiBlLCB0aGlzLnRpY2soKTtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGluZygpIHtcbiAgICBzdXBlci5vbk1hbmlmZXN0TG9hZGluZygpLCB0aGlzLm1haW5EZXRhaWxzID0gbnVsbDtcbiAgfVxuICBvbk1lZGlhRGV0YWNoaW5nKGUsIHQpIHtcbiAgICB0aGlzLnRyYWNrc0J1ZmZlcmVkID0gW10sIHN1cGVyLm9uTWVkaWFEZXRhY2hpbmcoZSwgdCk7XG4gIH1cbiAgb25MZXZlbExvYWRlZChlLCB0KSB7XG4gICAgdGhpcy5tYWluRGV0YWlscyA9IHQuZGV0YWlscztcbiAgfVxuICBvblN1YnRpdGxlRnJhZ1Byb2Nlc3NlZChlLCB0KSB7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZzogcixcbiAgICAgIHN1Y2Nlc3M6IG5cbiAgICB9ID0gdDtcbiAgICBpZiAodGhpcy5mcmFnQ29udGV4dENoYW5nZWQocikgfHwgKFZ0KHIpICYmICh0aGlzLmZyYWdQcmV2aW91cyA9IHIpLCB0aGlzLnN0YXRlID0gbmUuSURMRSksICFuKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGkgPSB0aGlzLnRyYWNrc0J1ZmZlcmVkW3RoaXMuY3VycmVudFRyYWNrSWRdO1xuICAgIGlmICghaSlcbiAgICAgIHJldHVybjtcbiAgICBsZXQgbztcbiAgICBjb25zdCBhID0gci5zdGFydDtcbiAgICBmb3IgKGxldCBjID0gMDsgYyA8IGkubGVuZ3RoOyBjKyspXG4gICAgICBpZiAoYSA+PSBpW2NdLnN0YXJ0ICYmIGEgPD0gaVtjXS5lbmQpIHtcbiAgICAgICAgbyA9IGlbY107XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNvbnN0IGwgPSByLnN0YXJ0ICsgci5kdXJhdGlvbjtcbiAgICBvID8gby5lbmQgPSBsIDogKG8gPSB7XG4gICAgICBzdGFydDogYSxcbiAgICAgIGVuZDogbFxuICAgIH0sIGkucHVzaChvKSksIHRoaXMuZnJhZ21lbnRUcmFja2VyLmZyYWdCdWZmZXJlZChyKSwgdGhpcy5mcmFnQnVmZmVyZWRDb21wbGV0ZShyLCBudWxsKSwgdGhpcy5tZWRpYSAmJiB0aGlzLnRpY2soKTtcbiAgfVxuICBvbkJ1ZmZlckZsdXNoaW5nKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdGFydE9mZnNldDogcixcbiAgICAgIGVuZE9mZnNldDogblxuICAgIH0gPSB0O1xuICAgIGlmIChyID09PSAwICYmIG4gIT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkge1xuICAgICAgY29uc3QgaSA9IG4gLSAxO1xuICAgICAgaWYgKGkgPD0gMClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdC5lbmRPZmZzZXRTdWJ0aXRsZXMgPSBNYXRoLm1heCgwLCBpKSwgdGhpcy50cmFja3NCdWZmZXJlZC5mb3JFYWNoKChvKSA9PiB7XG4gICAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgby5sZW5ndGg7ICkge1xuICAgICAgICAgIGlmIChvW2FdLmVuZCA8PSBpKSB7XG4gICAgICAgICAgICBvLnNoaWZ0KCk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9bYV0uc3RhcnQgPCBpKVxuICAgICAgICAgICAgb1thXS5zdGFydCA9IGk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgYSsrO1xuICAgICAgICB9XG4gICAgICB9KSwgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnRzSW5SYW5nZShyLCBpLCBwZS5TVUJUSVRMRSk7XG4gICAgfVxuICB9XG4gIC8vIElmIHNvbWV0aGluZyBnb2VzIHdyb25nLCBwcm9jZWVkIHRvIG5leHQgZnJhZywgaWYgd2Ugd2VyZSBwcm9jZXNzaW5nIG9uZS5cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgY29uc3QgciA9IHQuZnJhZztcbiAgICAociA9PSBudWxsID8gdm9pZCAwIDogci50eXBlKSA9PT0gcGUuU1VCVElUTEUgJiYgKHQuZGV0YWlscyA9PT0gSi5GUkFHX0dBUCAmJiB0aGlzLmZyYWdtZW50VHJhY2tlci5mcmFnQnVmZmVyZWQociwgITApLCB0aGlzLmZyYWdDdXJyZW50ICYmIHRoaXMuZnJhZ0N1cnJlbnQuYWJvcnRSZXF1ZXN0cygpLCB0aGlzLnN0YXRlICE9PSBuZS5TVE9QUEVEICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSkpO1xuICB9XG4gIC8vIEdvdCBhbGwgbmV3IHN1YnRpdGxlIGxldmVscy5cbiAgb25TdWJ0aXRsZVRyYWNrc1VwZGF0ZWQoZSwge1xuICAgIHN1YnRpdGxlVHJhY2tzOiB0XG4gIH0pIHtcbiAgICBpZiAodGhpcy5sZXZlbHMgJiYgQXAodGhpcy5sZXZlbHMsIHQpKSB7XG4gICAgICB0aGlzLmxldmVscyA9IHQubWFwKChyKSA9PiBuZXcgbWkocikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRyYWNrc0J1ZmZlcmVkID0gW10sIHRoaXMubGV2ZWxzID0gdC5tYXAoKHIpID0+IHtcbiAgICAgIGNvbnN0IG4gPSBuZXcgbWkocik7XG4gICAgICByZXR1cm4gdGhpcy50cmFja3NCdWZmZXJlZFtuLmlkXSA9IFtdLCBuO1xuICAgIH0pLCB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudHNJblJhbmdlKDAsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgcGUuU1VCVElUTEUpLCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGwsIHRoaXMubWVkaWFCdWZmZXIgPSBudWxsO1xuICB9XG4gIG9uU3VidGl0bGVUcmFja1N3aXRjaChlLCB0KSB7XG4gICAgdmFyIHI7XG4gICAgaWYgKHRoaXMuY3VycmVudFRyYWNrSWQgPSB0LmlkLCAhKChyID0gdGhpcy5sZXZlbHMpICE9IG51bGwgJiYgci5sZW5ndGgpIHx8IHRoaXMuY3VycmVudFRyYWNrSWQgPT09IC0xKSB7XG4gICAgICB0aGlzLmNsZWFySW50ZXJ2YWwoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbiA9IHRoaXMubGV2ZWxzW3RoaXMuY3VycmVudFRyYWNrSWRdO1xuICAgIG4gIT0gbnVsbCAmJiBuLmRldGFpbHMgPyB0aGlzLm1lZGlhQnVmZmVyID0gdGhpcy5tZWRpYUJ1ZmZlclRpbWVSYW5nZXMgOiB0aGlzLm1lZGlhQnVmZmVyID0gbnVsbCwgbiAmJiB0aGlzLnN0YXRlICE9PSBuZS5TVE9QUEVEICYmIHRoaXMuc2V0SW50ZXJ2YWwoUWgpO1xuICB9XG4gIC8vIEdvdCBhIG5ldyBzZXQgb2Ygc3VidGl0bGUgZnJhZ21lbnRzLlxuICBvblN1YnRpdGxlVHJhY2tMb2FkZWQoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRUcmFja0lkOiBuLFxuICAgICAgbGV2ZWxzOiBpXG4gICAgfSA9IHRoaXMsIHtcbiAgICAgIGRldGFpbHM6IG8sXG4gICAgICBpZDogYVxuICAgIH0gPSB0O1xuICAgIGlmICghaSkge1xuICAgICAgdGhpcy53YXJuKGBTdWJ0aXRsZSB0cmFja3Mgd2VyZSByZXNldCB3aGlsZSBsb2FkaW5nIGxldmVsICR7YX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbCA9IGlbYV07XG4gICAgaWYgKGEgPj0gaS5sZW5ndGggfHwgIWwpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5sb2coYFN1YnRpdGxlIHRyYWNrICR7YX0gbG9hZGVkIFske28uc3RhcnRTTn0sJHtvLmVuZFNOfV0ke28ubGFzdFBhcnRTbiA/IGBbcGFydC0ke28ubGFzdFBhcnRTbn0tJHtvLmxhc3RQYXJ0SW5kZXh9XWAgOiBcIlwifSxkdXJhdGlvbjoke28udG90YWxkdXJhdGlvbn1gKSwgdGhpcy5tZWRpYUJ1ZmZlciA9IHRoaXMubWVkaWFCdWZmZXJUaW1lUmFuZ2VzO1xuICAgIGxldCBjID0gMDtcbiAgICBpZiAoby5saXZlIHx8IChyID0gbC5kZXRhaWxzKSAhPSBudWxsICYmIHIubGl2ZSkge1xuICAgICAgaWYgKG8uZGVsdGFVcGRhdGVGYWlsZWQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGQgPSB0aGlzLm1haW5EZXRhaWxzO1xuICAgICAgaWYgKCFkKSB7XG4gICAgICAgIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITE7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGggPSBkLmZyYWdtZW50c1swXTtcbiAgICAgIGlmICghbC5kZXRhaWxzKVxuICAgICAgICBvLmhhc1Byb2dyYW1EYXRlVGltZSAmJiBkLmhhc1Byb2dyYW1EYXRlVGltZSA/IChzYShvLCBkKSwgYyA9IG8uZnJhZ21lbnRTdGFydCkgOiBoICYmIChjID0gaC5zdGFydCwgZ2MobywgYykpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciB1O1xuICAgICAgICBjID0gdGhpcy5hbGlnblBsYXlsaXN0cyhvLCBsLmRldGFpbHMsICh1ID0gdGhpcy5sZXZlbExhc3RMb2FkZWQpID09IG51bGwgPyB2b2lkIDAgOiB1LmRldGFpbHMpLCBjID09PSAwICYmIGggJiYgKGMgPSBoLnN0YXJ0LCBnYyhvLCBjKSk7XG4gICAgICB9XG4gICAgICBkICYmICF0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCAmJiB0aGlzLnNldFN0YXJ0UG9zaXRpb24oZCwgYyk7XG4gICAgfVxuICAgIGwuZGV0YWlscyA9IG8sIHRoaXMubGV2ZWxMYXN0TG9hZGVkID0gbCwgYSA9PT0gbiAmJiAodGhpcy5obHMudHJpZ2dlcihJLlNVQlRJVExFX1RSQUNLX1VQREFURUQsIHtcbiAgICAgIGRldGFpbHM6IG8sXG4gICAgICBpZDogYSxcbiAgICAgIGdyb3VwSWQ6IHQuZ3JvdXBJZFxuICAgIH0pLCB0aGlzLnRpY2soKSwgby5saXZlICYmICF0aGlzLmZyYWdDdXJyZW50ICYmIHRoaXMubWVkaWEgJiYgdGhpcy5zdGF0ZSA9PT0gbmUuSURMRSAmJiAoSnMobnVsbCwgby5mcmFnbWVudHMsIHRoaXMubWVkaWEuY3VycmVudFRpbWUsIDApIHx8ICh0aGlzLndhcm4oXCJTdWJ0aXRsZSBwbGF5bGlzdCBub3QgYWxpZ25lZCB3aXRoIHBsYXliYWNrXCIpLCBsLmRldGFpbHMgPSB2b2lkIDApKSk7XG4gIH1cbiAgX2hhbmRsZUZyYWdtZW50TG9hZENvbXBsZXRlKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnOiB0LFxuICAgICAgcGF5bG9hZDogclxuICAgIH0gPSBlLCBuID0gdC5kZWNyeXB0ZGF0YSwgaSA9IHRoaXMuaGxzO1xuICAgIGlmICghdGhpcy5mcmFnQ29udGV4dENoYW5nZWQodCkgJiYgciAmJiByLmJ5dGVMZW5ndGggPiAwICYmIG4gIT0gbnVsbCAmJiBuLmtleSAmJiBuLml2ICYmIEluKG4ubWV0aG9kKSkge1xuICAgICAgY29uc3QgbyA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgdGhpcy5kZWNyeXB0ZXIuZGVjcnlwdChuZXcgVWludDhBcnJheShyKSwgbi5rZXkuYnVmZmVyLCBuLml2LmJ1ZmZlciwgU3Uobi5tZXRob2QpKS5jYXRjaCgoYSkgPT4ge1xuICAgICAgICB0aHJvdyBpLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICAgIGRldGFpbHM6IEouRlJBR19ERUNSWVBUX0VSUk9SLFxuICAgICAgICAgIGZhdGFsOiAhMSxcbiAgICAgICAgICBlcnJvcjogYSxcbiAgICAgICAgICByZWFzb246IGEubWVzc2FnZSxcbiAgICAgICAgICBmcmFnOiB0XG4gICAgICAgIH0pLCBhO1xuICAgICAgfSkudGhlbigoYSkgPT4ge1xuICAgICAgICBjb25zdCBsID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgICAgIGkudHJpZ2dlcihJLkZSQUdfREVDUllQVEVELCB7XG4gICAgICAgICAgZnJhZzogdCxcbiAgICAgICAgICBwYXlsb2FkOiBhLFxuICAgICAgICAgIHN0YXRzOiB7XG4gICAgICAgICAgICB0c3RhcnQ6IG8sXG4gICAgICAgICAgICB0ZGVjcnlwdDogbFxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KS5jYXRjaCgoYSkgPT4ge1xuICAgICAgICB0aGlzLndhcm4oYCR7YS5uYW1lfTogJHthLm1lc3NhZ2V9YCksIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIGRvVGljaygpIHtcbiAgICBpZiAoIXRoaXMubWVkaWEpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gbmUuSURMRSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBjdXJyZW50VHJhY2tJZDogZSxcbiAgICAgICAgbGV2ZWxzOiB0XG4gICAgICB9ID0gdGhpcywgciA9IHQgPT0gbnVsbCA/IHZvaWQgMCA6IHRbZV07XG4gICAgICBpZiAoIXIgfHwgIXQubGVuZ3RoIHx8ICFyLmRldGFpbHMgfHwgdGhpcy53YWl0Rm9yTGl2ZShyKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb25maWc6IG5cbiAgICAgIH0gPSB0aGlzLCBpID0gdGhpcy5nZXRMb2FkUG9zaXRpb24oKSwgbyA9IENlLmJ1ZmZlcmVkSW5mbyh0aGlzLnRyYWNrc0J1ZmZlcmVkW3RoaXMuY3VycmVudFRyYWNrSWRdIHx8IFtdLCBpLCBuLm1heEJ1ZmZlckhvbGUpLCB7XG4gICAgICAgIGVuZDogYSxcbiAgICAgICAgbGVuOiBsXG4gICAgICB9ID0gbywgYyA9IHIuZGV0YWlscywgdSA9IHRoaXMuaGxzLm1heEJ1ZmZlckxlbmd0aCArIGMubGV2ZWxUYXJnZXREdXJhdGlvbjtcbiAgICAgIGlmIChsID4gdSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgZCA9IGMuZnJhZ21lbnRzLCBoID0gZC5sZW5ndGgsIGYgPSBjLmVkZ2U7XG4gICAgICBsZXQgcCA9IG51bGw7XG4gICAgICBjb25zdCB5ID0gdGhpcy5mcmFnUHJldmlvdXM7XG4gICAgICBpZiAoYSA8IGYpIHtcbiAgICAgICAgY29uc3QgUiA9IG4ubWF4RnJhZ0xvb2tVcFRvbGVyYW5jZSwgQSA9IGEgPiBmIC0gUiA/IDAgOiBSO1xuICAgICAgICBwID0gSnMoeSwgZCwgTWF0aC5tYXgoZFswXS5zdGFydCwgYSksIEEpLCAhcCAmJiB5ICYmIHkuc3RhcnQgPCBkWzBdLnN0YXJ0ICYmIChwID0gZFswXSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgcCA9IGRbaCAtIDFdO1xuICAgICAgaWYgKHAgPSB0aGlzLmZpbHRlclJlcGxhY2VkUHJpbWFyeShwLCByLmRldGFpbHMpLCAhcClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgRSA9IHAuc24gLSBjLnN0YXJ0U04sIGIgPSBkW0UgLSAxXTtcbiAgICAgIGlmIChiICYmIGIuY2MgPT09IHAuY2MgJiYgdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoYikgPT09IEh0Lk5PVF9MT0FERUQgJiYgKHAgPSBiKSwgdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUocCkgPT09IEh0Lk5PVF9MT0FERUQpIHtcbiAgICAgICAgY29uc3QgUiA9IHRoaXMubWFwVG9Jbml0RnJhZ1doZW5SZXF1aXJlZChwKTtcbiAgICAgICAgUiAmJiB0aGlzLmxvYWRGcmFnbWVudChSLCByLCBhKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbG9hZEZyYWdtZW50KGUsIHQsIHIpIHtcbiAgICBWdChlKSA/IHN1cGVyLmxvYWRGcmFnbWVudChlLCB0LCByKSA6IHRoaXMuX2xvYWRJbml0U2VnbWVudChlLCB0KTtcbiAgfVxuICBnZXQgbWVkaWFCdWZmZXJUaW1lUmFuZ2VzKCkge1xuICAgIHJldHVybiBuZXcgYncodGhpcy50cmFja3NCdWZmZXJlZFt0aGlzLmN1cnJlbnRUcmFja0lkXSB8fCBbXSk7XG4gIH1cbn1cbmNsYXNzIGJ3IHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuYnVmZmVyZWQgPSB2b2lkIDA7XG4gICAgY29uc3QgdCA9IChyLCBuLCBpKSA9PiB7XG4gICAgICBpZiAobiA9IG4gPj4+IDAsIG4gPiBpIC0gMSlcbiAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihgRmFpbGVkIHRvIGV4ZWN1dGUgJyR7cn0nIG9uICdUaW1lUmFuZ2VzJzogVGhlIGluZGV4IHByb3ZpZGVkICgke259KSBpcyBncmVhdGVyIHRoYW4gdGhlIG1heGltdW0gYm91bmQgKCR7aX0pYCk7XG4gICAgICByZXR1cm4gZVtuXVtyXTtcbiAgICB9O1xuICAgIHRoaXMuYnVmZmVyZWQgPSB7XG4gICAgICBnZXQgbGVuZ3RoKCkge1xuICAgICAgICByZXR1cm4gZS5sZW5ndGg7XG4gICAgICB9LFxuICAgICAgZW5kKHIpIHtcbiAgICAgICAgcmV0dXJuIHQoXCJlbmRcIiwgciwgZS5sZW5ndGgpO1xuICAgICAgfSxcbiAgICAgIHN0YXJ0KHIpIHtcbiAgICAgICAgcmV0dXJuIHQoXCJzdGFydFwiLCByLCBlLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuY29uc3QgVHcgPSB7XG4gIDQyOiAyMjUsXG4gIC8vIGxvd2VyY2FzZSBhLCBhY3V0ZSBhY2NlbnRcbiAgOTI6IDIzMyxcbiAgLy8gbG93ZXJjYXNlIGUsIGFjdXRlIGFjY2VudFxuICA5NDogMjM3LFxuICAvLyBsb3dlcmNhc2UgaSwgYWN1dGUgYWNjZW50XG4gIDk1OiAyNDMsXG4gIC8vIGxvd2VyY2FzZSBvLCBhY3V0ZSBhY2NlbnRcbiAgOTY6IDI1MCxcbiAgLy8gbG93ZXJjYXNlIHUsIGFjdXRlIGFjY2VudFxuICAxMjM6IDIzMSxcbiAgLy8gbG93ZXJjYXNlIGMgd2l0aCBjZWRpbGxhXG4gIDEyNDogMjQ3LFxuICAvLyBkaXZpc2lvbiBzeW1ib2xcbiAgMTI1OiAyMDksXG4gIC8vIHVwcGVyY2FzZSBOIHRpbGRlXG4gIDEyNjogMjQxLFxuICAvLyBsb3dlcmNhc2UgbiB0aWxkZVxuICAxMjc6IDk2MDgsXG4gIC8vIEZ1bGwgYmxvY2tcbiAgLy8gVEhJUyBCTE9DSyBJTkNMVURFUyBUSEUgMTYgRVhURU5ERUQgKFRXTy1CWVRFKSBMSU5FIDIxIENIQVJBQ1RFUlNcbiAgLy8gVEhBVCBDT01FIEZST00gSEkgQllURT0weDExIEFORCBMT1cgQkVUV0VFTiAweDMwIEFORCAweDNGXG4gIC8vIFRISVMgTUVBTlMgVEhBVCBcXHg1MCBNVVNUIEJFIEFEREVEIFRPIFRIRSBWQUxVRVNcbiAgMTI4OiAxNzQsXG4gIC8vIFJlZ2lzdGVyZWQgc3ltYm9sIChSKVxuICAxMjk6IDE3NixcbiAgLy8gZGVncmVlIHNpZ25cbiAgMTMwOiAxODksXG4gIC8vIDEvMiBzeW1ib2xcbiAgMTMxOiAxOTEsXG4gIC8vIEludmVydGVkIChvcGVuKSBxdWVzdGlvbiBtYXJrXG4gIDEzMjogODQ4MixcbiAgLy8gVHJhZGVtYXJrIHN5bWJvbCAoVE0pXG4gIDEzMzogMTYyLFxuICAvLyBDZW50cyBzeW1ib2xcbiAgMTM0OiAxNjMsXG4gIC8vIFBvdW5kcyBzdGVybGluZ1xuICAxMzU6IDk4MzQsXG4gIC8vIE11c2ljIDgndGggbm90ZVxuICAxMzY6IDIyNCxcbiAgLy8gbG93ZXJjYXNlIGEsIGdyYXZlIGFjY2VudFxuICAxMzc6IDMyLFxuICAvLyB0cmFuc3BhcmVudCBzcGFjZSAocmVndWxhcilcbiAgMTM4OiAyMzIsXG4gIC8vIGxvd2VyY2FzZSBlLCBncmF2ZSBhY2NlbnRcbiAgMTM5OiAyMjYsXG4gIC8vIGxvd2VyY2FzZSBhLCBjaXJjdW1mbGV4IGFjY2VudFxuICAxNDA6IDIzNCxcbiAgLy8gbG93ZXJjYXNlIGUsIGNpcmN1bWZsZXggYWNjZW50XG4gIDE0MTogMjM4LFxuICAvLyBsb3dlcmNhc2UgaSwgY2lyY3VtZmxleCBhY2NlbnRcbiAgMTQyOiAyNDQsXG4gIC8vIGxvd2VyY2FzZSBvLCBjaXJjdW1mbGV4IGFjY2VudFxuICAxNDM6IDI1MSxcbiAgLy8gbG93ZXJjYXNlIHUsIGNpcmN1bWZsZXggYWNjZW50XG4gIC8vIFRISVMgQkxPQ0sgSU5DTFVERVMgVEhFIDMyIEVYVEVOREVEIChUV08tQllURSkgTElORSAyMSBDSEFSQUNURVJTXG4gIC8vIFRIQVQgQ09NRSBGUk9NIEhJIEJZVEU9MHgxMiBBTkQgTE9XIEJFVFdFRU4gMHgyMCBBTkQgMHgzRlxuICAxNDQ6IDE5MyxcbiAgLy8gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGFjdXRlXG4gIDE0NTogMjAxLFxuICAvLyBjYXBpdGFsIGxldHRlciBFIHdpdGggYWN1dGVcbiAgMTQ2OiAyMTEsXG4gIC8vIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBhY3V0ZVxuICAxNDc6IDIxOCxcbiAgLy8gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGFjdXRlXG4gIDE0ODogMjIwLFxuICAvLyBjYXBpdGFsIGxldHRlciBVIHdpdGggZGlhcmVzaXNcbiAgMTQ5OiAyNTIsXG4gIC8vIGxvd2VyY2FzZSBsZXR0ZXIgVSB3aXRoIGRpYWVyZXNpc1xuICAxNTA6IDgyMTYsXG4gIC8vIG9wZW5pbmcgc2luZ2xlIHF1b3RlXG4gIDE1MTogMTYxLFxuICAvLyBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrXG4gIDE1MjogNDIsXG4gIC8vIGFzdGVyaXNrXG4gIDE1MzogODIxNyxcbiAgLy8gY2xvc2luZyBzaW5nbGUgcXVvdGVcbiAgMTU0OiA5NDczLFxuICAvLyBib3ggZHJhd2luZ3MgaGVhdnkgaG9yaXpvbnRhbFxuICAxNTU6IDE2OSxcbiAgLy8gY29weXJpZ2h0IHNpZ25cbiAgMTU2OiA4NDgwLFxuICAvLyBTZXJ2aWNlIG1hcmtcbiAgMTU3OiA4MjI2LFxuICAvLyAocm91bmQpIGJ1bGxldFxuICAxNTg6IDgyMjAsXG4gIC8vIExlZnQgZG91YmxlIHF1b3RhdGlvbiBtYXJrXG4gIDE1OTogODIyMSxcbiAgLy8gUmlnaHQgZG91YmxlIHF1b3RhdGlvbiBtYXJrXG4gIDE2MDogMTkyLFxuICAvLyB1cHBlcmNhc2UgQSwgZ3JhdmUgYWNjZW50XG4gIDE2MTogMTk0LFxuICAvLyB1cHBlcmNhc2UgQSwgY2lyY3VtZmxleFxuICAxNjI6IDE5OSxcbiAgLy8gdXBwZXJjYXNlIEMgd2l0aCBjZWRpbGxhXG4gIDE2MzogMjAwLFxuICAvLyB1cHBlcmNhc2UgRSwgZ3JhdmUgYWNjZW50XG4gIDE2NDogMjAyLFxuICAvLyB1cHBlcmNhc2UgRSwgY2lyY3VtZmxleFxuICAxNjU6IDIwMyxcbiAgLy8gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGRpYXJlc2lzXG4gIDE2NjogMjM1LFxuICAvLyBsb3dlcmNhc2UgbGV0dGVyIGUgd2l0aCBkaWFyZXNpc1xuICAxNjc6IDIwNixcbiAgLy8gdXBwZXJjYXNlIEksIGNpcmN1bWZsZXhcbiAgMTY4OiAyMDcsXG4gIC8vIHVwcGVyY2FzZSBJLCB3aXRoIGRpYXJlc2lzXG4gIDE2OTogMjM5LFxuICAvLyBsb3dlcmNhc2UgaSwgd2l0aCBkaWFyZXNpc1xuICAxNzA6IDIxMixcbiAgLy8gdXBwZXJjYXNlIE8sIGNpcmN1bWZsZXhcbiAgMTcxOiAyMTcsXG4gIC8vIHVwcGVyY2FzZSBVLCBncmF2ZSBhY2NlbnRcbiAgMTcyOiAyNDksXG4gIC8vIGxvd2VyY2FzZSB1LCBncmF2ZSBhY2NlbnRcbiAgMTczOiAyMTksXG4gIC8vIHVwcGVyY2FzZSBVLCBjaXJjdW1mbGV4XG4gIDE3NDogMTcxLFxuICAvLyBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFya1xuICAxNzU6IDE4NyxcbiAgLy8gcmlnaHQtcG9pbnRpbmcgZG91YmxlIGFuZ2xlIHF1b3RhdGlvbiBtYXJrXG4gIC8vIFRISVMgQkxPQ0sgSU5DTFVERVMgVEhFIDMyIEVYVEVOREVEIChUV08tQllURSkgTElORSAyMSBDSEFSQUNURVJTXG4gIC8vIFRIQVQgQ09NRSBGUk9NIEhJIEJZVEU9MHgxMyBBTkQgTE9XIEJFVFdFRU4gMHgyMCBBTkQgMHgzRlxuICAxNzY6IDE5NSxcbiAgLy8gVXBwZXJjYXNlIEEsIHRpbGRlXG4gIDE3NzogMjI3LFxuICAvLyBMb3dlcmNhc2UgYSwgdGlsZGVcbiAgMTc4OiAyMDUsXG4gIC8vIFVwcGVyY2FzZSBJLCBhY3V0ZSBhY2NlbnRcbiAgMTc5OiAyMDQsXG4gIC8vIFVwcGVyY2FzZSBJLCBncmF2ZSBhY2NlbnRcbiAgMTgwOiAyMzYsXG4gIC8vIExvd2VyY2FzZSBpLCBncmF2ZSBhY2NlbnRcbiAgMTgxOiAyMTAsXG4gIC8vIFVwcGVyY2FzZSBPLCBncmF2ZSBhY2NlbnRcbiAgMTgyOiAyNDIsXG4gIC8vIExvd2VyY2FzZSBvLCBncmF2ZSBhY2NlbnRcbiAgMTgzOiAyMTMsXG4gIC8vIFVwcGVyY2FzZSBPLCB0aWxkZVxuICAxODQ6IDI0NSxcbiAgLy8gTG93ZXJjYXNlIG8sIHRpbGRlXG4gIDE4NTogMTIzLFxuICAvLyBPcGVuIGN1cmx5IGJyYWNlXG4gIDE4NjogMTI1LFxuICAvLyBDbG9zaW5nIGN1cmx5IGJyYWNlXG4gIDE4NzogOTIsXG4gIC8vIEJhY2tzbGFzaFxuICAxODg6IDk0LFxuICAvLyBDYXJldFxuICAxODk6IDk1LFxuICAvLyBVbmRlcnNjb3JlXG4gIDE5MDogMTI0LFxuICAvLyBQaXBlICh2ZXJ0aWNhbCBsaW5lKVxuICAxOTE6IDg3NjQsXG4gIC8vIFRpbGRlIG9wZXJhdG9yXG4gIDE5MjogMTk2LFxuICAvLyBVcHBlcmNhc2UgQSwgdW1sYXV0XG4gIDE5MzogMjI4LFxuICAvLyBMb3dlcmNhc2UgQSwgdW1sYXV0XG4gIDE5NDogMjE0LFxuICAvLyBVcHBlcmNhc2UgTywgdW1sYXV0XG4gIDE5NTogMjQ2LFxuICAvLyBMb3dlcmNhc2UgbywgdW1sYXV0XG4gIDE5NjogMjIzLFxuICAvLyBFc3N6ZXR0IChzaGFycCBTKVxuICAxOTc6IDE2NSxcbiAgLy8gWWVuIHN5bWJvbFxuICAxOTg6IDE2NCxcbiAgLy8gR2VuZXJpYyBjdXJyZW5jeSBzaWduXG4gIDE5OTogOTQ3NSxcbiAgLy8gQm94IGRyYXdpbmdzIGhlYXZ5IHZlcnRpY2FsXG4gIDIwMDogMTk3LFxuICAvLyBVcHBlcmNhc2UgQSwgcmluZ1xuICAyMDE6IDIyOSxcbiAgLy8gTG93ZXJjYXNlIEEsIHJpbmdcbiAgMjAyOiAyMTYsXG4gIC8vIFVwcGVyY2FzZSBPLCBzdHJva2VcbiAgMjAzOiAyNDgsXG4gIC8vIExvd2VyY2FzZSBvLCBzdHJva1xuICAyMDQ6IDk0ODcsXG4gIC8vIEJveCBkcmF3aW5ncyBoZWF2eSBkb3duIGFuZCByaWdodFxuICAyMDU6IDk0OTEsXG4gIC8vIEJveCBkcmF3aW5ncyBoZWF2eSBkb3duIGFuZCBsZWZ0XG4gIDIwNjogOTQ5NSxcbiAgLy8gQm94IGRyYXdpbmdzIGhlYXZ5IHVwIGFuZCByaWdodFxuICAyMDc6IDk0OTlcbiAgLy8gQm94IGRyYXdpbmdzIGhlYXZ5IHVwIGFuZCBsZWZ0XG59LCBHcCA9IChzKSA9PiBTdHJpbmcuZnJvbUNoYXJDb2RlKFR3W3NdIHx8IHMpLCBEciA9IDE1LCBpcyA9IDEwMCwgd3cgPSB7XG4gIDE3OiAxLFxuICAxODogMyxcbiAgMjE6IDUsXG4gIDIyOiA3LFxuICAyMzogOSxcbiAgMTY6IDExLFxuICAxOTogMTIsXG4gIDIwOiAxNFxufSwgQXcgPSB7XG4gIDE3OiAyLFxuICAxODogNCxcbiAgMjE6IDYsXG4gIDIyOiA4LFxuICAyMzogMTAsXG4gIDE5OiAxMyxcbiAgMjA6IDE1XG59LCBJdyA9IHtcbiAgMjU6IDEsXG4gIDI2OiAzLFxuICAyOTogNSxcbiAgMzA6IDcsXG4gIDMxOiA5LFxuICAyNDogMTEsXG4gIDI3OiAxMixcbiAgMjg6IDE0XG59LCBfdyA9IHtcbiAgMjU6IDIsXG4gIDI2OiA0LFxuICAyOTogNixcbiAgMzA6IDgsXG4gIDMxOiAxMCxcbiAgMjc6IDEzLFxuICAyODogMTVcbn0sIFJ3ID0gW1wid2hpdGVcIiwgXCJncmVlblwiLCBcImJsdWVcIiwgXCJjeWFuXCIsIFwicmVkXCIsIFwieWVsbG93XCIsIFwibWFnZW50YVwiLCBcImJsYWNrXCIsIFwidHJhbnNwYXJlbnRcIl07XG5jbGFzcyBMdyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudGltZSA9IG51bGwsIHRoaXMudmVyYm9zZUxldmVsID0gMDtcbiAgfVxuICBsb2coZSwgdCkge1xuICAgIGlmICh0aGlzLnZlcmJvc2VMZXZlbCA+PSBlKSB7XG4gICAgICBjb25zdCByID0gdHlwZW9mIHQgPT0gXCJmdW5jdGlvblwiID8gdCgpIDogdDtcbiAgICAgIHJ0LmxvZyhgJHt0aGlzLnRpbWV9IFske2V9XSAke3J9YCk7XG4gICAgfVxuICB9XG59XG5jb25zdCBOcyA9IGZ1bmN0aW9uKGUpIHtcbiAgY29uc3QgdCA9IFtdO1xuICBmb3IgKGxldCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspXG4gICAgdC5wdXNoKGVbcl0udG9TdHJpbmcoMTYpKTtcbiAgcmV0dXJuIHQ7XG59O1xuY2xhc3MgVnAge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmZvcmVncm91bmQgPSBcIndoaXRlXCIsIHRoaXMudW5kZXJsaW5lID0gITEsIHRoaXMuaXRhbGljcyA9ICExLCB0aGlzLmJhY2tncm91bmQgPSBcImJsYWNrXCIsIHRoaXMuZmxhc2ggPSAhMTtcbiAgfVxuICByZXNldCgpIHtcbiAgICB0aGlzLmZvcmVncm91bmQgPSBcIndoaXRlXCIsIHRoaXMudW5kZXJsaW5lID0gITEsIHRoaXMuaXRhbGljcyA9ICExLCB0aGlzLmJhY2tncm91bmQgPSBcImJsYWNrXCIsIHRoaXMuZmxhc2ggPSAhMTtcbiAgfVxuICBzZXRTdHlsZXMoZSkge1xuICAgIGNvbnN0IHQgPSBbXCJmb3JlZ3JvdW5kXCIsIFwidW5kZXJsaW5lXCIsIFwiaXRhbGljc1wiLCBcImJhY2tncm91bmRcIiwgXCJmbGFzaFwiXTtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHQubGVuZ3RoOyByKyspIHtcbiAgICAgIGNvbnN0IG4gPSB0W3JdO1xuICAgICAgZS5oYXNPd25Qcm9wZXJ0eShuKSAmJiAodGhpc1tuXSA9IGVbbl0pO1xuICAgIH1cbiAgfVxuICBpc0RlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yZWdyb3VuZCA9PT0gXCJ3aGl0ZVwiICYmICF0aGlzLnVuZGVybGluZSAmJiAhdGhpcy5pdGFsaWNzICYmIHRoaXMuYmFja2dyb3VuZCA9PT0gXCJibGFja1wiICYmICF0aGlzLmZsYXNoO1xuICB9XG4gIGVxdWFscyhlKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yZWdyb3VuZCA9PT0gZS5mb3JlZ3JvdW5kICYmIHRoaXMudW5kZXJsaW5lID09PSBlLnVuZGVybGluZSAmJiB0aGlzLml0YWxpY3MgPT09IGUuaXRhbGljcyAmJiB0aGlzLmJhY2tncm91bmQgPT09IGUuYmFja2dyb3VuZCAmJiB0aGlzLmZsYXNoID09PSBlLmZsYXNoO1xuICB9XG4gIGNvcHkoZSkge1xuICAgIHRoaXMuZm9yZWdyb3VuZCA9IGUuZm9yZWdyb3VuZCwgdGhpcy51bmRlcmxpbmUgPSBlLnVuZGVybGluZSwgdGhpcy5pdGFsaWNzID0gZS5pdGFsaWNzLCB0aGlzLmJhY2tncm91bmQgPSBlLmJhY2tncm91bmQsIHRoaXMuZmxhc2ggPSBlLmZsYXNoO1xuICB9XG4gIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiBcImNvbG9yPVwiICsgdGhpcy5mb3JlZ3JvdW5kICsgXCIsIHVuZGVybGluZT1cIiArIHRoaXMudW5kZXJsaW5lICsgXCIsIGl0YWxpY3M9XCIgKyB0aGlzLml0YWxpY3MgKyBcIiwgYmFja2dyb3VuZD1cIiArIHRoaXMuYmFja2dyb3VuZCArIFwiLCBmbGFzaD1cIiArIHRoaXMuZmxhc2g7XG4gIH1cbn1cbmNsYXNzIEN3IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy51Y2hhciA9IFwiIFwiLCB0aGlzLnBlblN0YXRlID0gbmV3IFZwKCk7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy51Y2hhciA9IFwiIFwiLCB0aGlzLnBlblN0YXRlLnJlc2V0KCk7XG4gIH1cbiAgc2V0Q2hhcihlLCB0KSB7XG4gICAgdGhpcy51Y2hhciA9IGUsIHRoaXMucGVuU3RhdGUuY29weSh0KTtcbiAgfVxuICBzZXRQZW5TdGF0ZShlKSB7XG4gICAgdGhpcy5wZW5TdGF0ZS5jb3B5KGUpO1xuICB9XG4gIGVxdWFscyhlKSB7XG4gICAgcmV0dXJuIHRoaXMudWNoYXIgPT09IGUudWNoYXIgJiYgdGhpcy5wZW5TdGF0ZS5lcXVhbHMoZS5wZW5TdGF0ZSk7XG4gIH1cbiAgY29weShlKSB7XG4gICAgdGhpcy51Y2hhciA9IGUudWNoYXIsIHRoaXMucGVuU3RhdGUuY29weShlLnBlblN0YXRlKTtcbiAgfVxuICBpc0VtcHR5KCkge1xuICAgIHJldHVybiB0aGlzLnVjaGFyID09PSBcIiBcIiAmJiB0aGlzLnBlblN0YXRlLmlzRGVmYXVsdCgpO1xuICB9XG59XG5jbGFzcyBrdyB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmNoYXJzID0gW10sIHRoaXMucG9zID0gMCwgdGhpcy5jdXJyUGVuU3RhdGUgPSBuZXcgVnAoKSwgdGhpcy5jdWVTdGFydFRpbWUgPSBudWxsLCB0aGlzLmxvZ2dlciA9IHZvaWQgMDtcbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGlzOyB0KyspXG4gICAgICB0aGlzLmNoYXJzLnB1c2gobmV3IEN3KCkpO1xuICAgIHRoaXMubG9nZ2VyID0gZTtcbiAgfVxuICBlcXVhbHMoZSkge1xuICAgIGZvciAobGV0IHQgPSAwOyB0IDwgaXM7IHQrKylcbiAgICAgIGlmICghdGhpcy5jaGFyc1t0XS5lcXVhbHMoZS5jaGFyc1t0XSkpXG4gICAgICAgIHJldHVybiAhMTtcbiAgICByZXR1cm4gITA7XG4gIH1cbiAgY29weShlKSB7XG4gICAgZm9yIChsZXQgdCA9IDA7IHQgPCBpczsgdCsrKVxuICAgICAgdGhpcy5jaGFyc1t0XS5jb3B5KGUuY2hhcnNbdF0pO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgbGV0IGUgPSAhMDtcbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IGlzOyB0KyspXG4gICAgICBpZiAoIXRoaXMuY2hhcnNbdF0uaXNFbXB0eSgpKSB7XG4gICAgICAgIGUgPSAhMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgLyoqXG4gICAqICBTZXQgdGhlIGN1cnNvciB0byBhIHZhbGlkIGNvbHVtbi5cbiAgICovXG4gIHNldEN1cnNvcihlKSB7XG4gICAgdGhpcy5wb3MgIT09IGUgJiYgKHRoaXMucG9zID0gZSksIHRoaXMucG9zIDwgMCA/ICh0aGlzLmxvZ2dlci5sb2coMywgXCJOZWdhdGl2ZSBjdXJzb3IgcG9zaXRpb24gXCIgKyB0aGlzLnBvcyksIHRoaXMucG9zID0gMCkgOiB0aGlzLnBvcyA+IGlzICYmICh0aGlzLmxvZ2dlci5sb2coMywgXCJUb28gbGFyZ2UgY3Vyc29yIHBvc2l0aW9uIFwiICsgdGhpcy5wb3MpLCB0aGlzLnBvcyA9IGlzKTtcbiAgfVxuICAvKipcbiAgICogTW92ZSB0aGUgY3Vyc29yIHJlbGF0aXZlIHRvIGN1cnJlbnQgcG9zaXRpb24uXG4gICAqL1xuICBtb3ZlQ3Vyc29yKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5wb3MgKyBlO1xuICAgIGlmIChlID4gMSlcbiAgICAgIGZvciAobGV0IHIgPSB0aGlzLnBvcyArIDE7IHIgPCB0ICsgMTsgcisrKVxuICAgICAgICB0aGlzLmNoYXJzW3JdLnNldFBlblN0YXRlKHRoaXMuY3VyclBlblN0YXRlKTtcbiAgICB0aGlzLnNldEN1cnNvcih0KTtcbiAgfVxuICAvKipcbiAgICogQmFja3NwYWNlLCBtb3ZlIG9uZSBzdGVwIGJhY2sgYW5kIGNsZWFyIGNoYXJhY3Rlci5cbiAgICovXG4gIGJhY2tTcGFjZSgpIHtcbiAgICB0aGlzLm1vdmVDdXJzb3IoLTEpLCB0aGlzLmNoYXJzW3RoaXMucG9zXS5zZXRDaGFyKFwiIFwiLCB0aGlzLmN1cnJQZW5TdGF0ZSk7XG4gIH1cbiAgaW5zZXJ0Q2hhcihlKSB7XG4gICAgZSA+PSAxNDQgJiYgdGhpcy5iYWNrU3BhY2UoKTtcbiAgICBjb25zdCB0ID0gR3AoZSk7XG4gICAgaWYgKHRoaXMucG9zID49IGlzKSB7XG4gICAgICB0aGlzLmxvZ2dlci5sb2coMCwgKCkgPT4gXCJDYW5ub3QgaW5zZXJ0IFwiICsgZS50b1N0cmluZygxNikgKyBcIiAoXCIgKyB0ICsgXCIpIGF0IHBvc2l0aW9uIFwiICsgdGhpcy5wb3MgKyBcIi4gU2tpcHBpbmcgaXQhXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNoYXJzW3RoaXMucG9zXS5zZXRDaGFyKHQsIHRoaXMuY3VyclBlblN0YXRlKSwgdGhpcy5tb3ZlQ3Vyc29yKDEpO1xuICB9XG4gIGNsZWFyRnJvbVBvcyhlKSB7XG4gICAgbGV0IHQ7XG4gICAgZm9yICh0ID0gZTsgdCA8IGlzOyB0KyspXG4gICAgICB0aGlzLmNoYXJzW3RdLnJlc2V0KCk7XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy5jbGVhckZyb21Qb3MoMCksIHRoaXMucG9zID0gMCwgdGhpcy5jdXJyUGVuU3RhdGUucmVzZXQoKTtcbiAgfVxuICBjbGVhclRvRW5kT2ZSb3coKSB7XG4gICAgdGhpcy5jbGVhckZyb21Qb3ModGhpcy5wb3MpO1xuICB9XG4gIGdldFRleHRTdHJpbmcoKSB7XG4gICAgY29uc3QgZSA9IFtdO1xuICAgIGxldCB0ID0gITA7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBpczsgcisrKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5jaGFyc1tyXS51Y2hhcjtcbiAgICAgIG4gIT09IFwiIFwiICYmICh0ID0gITEpLCBlLnB1c2gobik7XG4gICAgfVxuICAgIHJldHVybiB0ID8gXCJcIiA6IGUuam9pbihcIlwiKTtcbiAgfVxuICBzZXRQZW5TdHlsZXMoZSkge1xuICAgIHRoaXMuY3VyclBlblN0YXRlLnNldFN0eWxlcyhlKSwgdGhpcy5jaGFyc1t0aGlzLnBvc10uc2V0UGVuU3RhdGUodGhpcy5jdXJyUGVuU3RhdGUpO1xuICB9XG59XG5jbGFzcyB3bCB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLnJvd3MgPSBbXSwgdGhpcy5jdXJyUm93ID0gRHIgLSAxLCB0aGlzLm5yUm9sbFVwUm93cyA9IG51bGwsIHRoaXMubGFzdE91dHB1dFNjcmVlbiA9IG51bGwsIHRoaXMubG9nZ2VyID0gdm9pZCAwO1xuICAgIGZvciAobGV0IHQgPSAwOyB0IDwgRHI7IHQrKylcbiAgICAgIHRoaXMucm93cy5wdXNoKG5ldyBrdyhlKSk7XG4gICAgdGhpcy5sb2dnZXIgPSBlO1xuICB9XG4gIHJlc2V0KCkge1xuICAgIGZvciAobGV0IGUgPSAwOyBlIDwgRHI7IGUrKylcbiAgICAgIHRoaXMucm93c1tlXS5jbGVhcigpO1xuICAgIHRoaXMuY3VyclJvdyA9IERyIC0gMTtcbiAgfVxuICBlcXVhbHMoZSkge1xuICAgIGxldCB0ID0gITA7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCBEcjsgcisrKVxuICAgICAgaWYgKCF0aGlzLnJvd3Nbcl0uZXF1YWxzKGUucm93c1tyXSkpIHtcbiAgICAgICAgdCA9ICExO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICByZXR1cm4gdDtcbiAgfVxuICBjb3B5KGUpIHtcbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IERyOyB0KyspXG4gICAgICB0aGlzLnJvd3NbdF0uY29weShlLnJvd3NbdF0pO1xuICB9XG4gIGlzRW1wdHkoKSB7XG4gICAgbGV0IGUgPSAhMDtcbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IERyOyB0KyspXG4gICAgICBpZiAoIXRoaXMucm93c1t0XS5pc0VtcHR5KCkpIHtcbiAgICAgICAgZSA9ICExO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICBiYWNrU3BhY2UoKSB7XG4gICAgdGhpcy5yb3dzW3RoaXMuY3VyclJvd10uYmFja1NwYWNlKCk7XG4gIH1cbiAgY2xlYXJUb0VuZE9mUm93KCkge1xuICAgIHRoaXMucm93c1t0aGlzLmN1cnJSb3ddLmNsZWFyVG9FbmRPZlJvdygpO1xuICB9XG4gIC8qKlxuICAgKiBJbnNlcnQgYSBjaGFyYWN0ZXIgKHdpdGhvdXQgc3R5bGluZykgaW4gdGhlIGN1cnJlbnQgcm93LlxuICAgKi9cbiAgaW5zZXJ0Q2hhcihlKSB7XG4gICAgdGhpcy5yb3dzW3RoaXMuY3VyclJvd10uaW5zZXJ0Q2hhcihlKTtcbiAgfVxuICBzZXRQZW4oZSkge1xuICAgIHRoaXMucm93c1t0aGlzLmN1cnJSb3ddLnNldFBlblN0eWxlcyhlKTtcbiAgfVxuICBtb3ZlQ3Vyc29yKGUpIHtcbiAgICB0aGlzLnJvd3NbdGhpcy5jdXJyUm93XS5tb3ZlQ3Vyc29yKGUpO1xuICB9XG4gIHNldEN1cnNvcihlKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwic2V0Q3Vyc29yOiBcIiArIGUpLCB0aGlzLnJvd3NbdGhpcy5jdXJyUm93XS5zZXRDdXJzb3IoZSk7XG4gIH1cbiAgc2V0UEFDKGUpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coMiwgKCkgPT4gXCJwYWNEYXRhID0gXCIgKyBhdChlKSk7XG4gICAgbGV0IHQgPSBlLnJvdyAtIDE7XG4gICAgaWYgKHRoaXMubnJSb2xsVXBSb3dzICYmIHQgPCB0aGlzLm5yUm9sbFVwUm93cyAtIDEgJiYgKHQgPSB0aGlzLm5yUm9sbFVwUm93cyAtIDEpLCB0aGlzLm5yUm9sbFVwUm93cyAmJiB0aGlzLmN1cnJSb3cgIT09IHQpIHtcbiAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgRHI7IGErKylcbiAgICAgICAgdGhpcy5yb3dzW2FdLmNsZWFyKCk7XG4gICAgICBjb25zdCBpID0gdGhpcy5jdXJyUm93ICsgMSAtIHRoaXMubnJSb2xsVXBSb3dzLCBvID0gdGhpcy5sYXN0T3V0cHV0U2NyZWVuO1xuICAgICAgaWYgKG8pIHtcbiAgICAgICAgY29uc3QgYSA9IG8ucm93c1tpXS5jdWVTdGFydFRpbWUsIGwgPSB0aGlzLmxvZ2dlci50aW1lO1xuICAgICAgICBpZiAoYSAhPT0gbnVsbCAmJiBsICE9PSBudWxsICYmIGEgPCBsKVxuICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgdGhpcy5uclJvbGxVcFJvd3M7IGMrKylcbiAgICAgICAgICAgIHRoaXMucm93c1t0IC0gdGhpcy5uclJvbGxVcFJvd3MgKyBjICsgMV0uY29weShvLnJvd3NbaSArIGNdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jdXJyUm93ID0gdDtcbiAgICBjb25zdCByID0gdGhpcy5yb3dzW3RoaXMuY3VyclJvd107XG4gICAgaWYgKGUuaW5kZW50ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBpID0gZS5pbmRlbnQsIG8gPSBNYXRoLm1heChpIC0gMSwgMCk7XG4gICAgICByLnNldEN1cnNvcihlLmluZGVudCksIGUuY29sb3IgPSByLmNoYXJzW29dLnBlblN0YXRlLmZvcmVncm91bmQ7XG4gICAgfVxuICAgIGNvbnN0IG4gPSB7XG4gICAgICBmb3JlZ3JvdW5kOiBlLmNvbG9yLFxuICAgICAgdW5kZXJsaW5lOiBlLnVuZGVybGluZSxcbiAgICAgIGl0YWxpY3M6IGUuaXRhbGljcyxcbiAgICAgIGJhY2tncm91bmQ6IFwiYmxhY2tcIixcbiAgICAgIGZsYXNoOiAhMVxuICAgIH07XG4gICAgdGhpcy5zZXRQZW4obik7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBiYWNrZ3JvdW5kL2V4dHJhIGZvcmVncm91bmQsIGJ1dCBmaXJzdCBkbyBiYWNrX3NwYWNlLCBhbmQgdGhlbiBpbnNlcnQgc3BhY2UgKGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KS5cbiAgICovXG4gIHNldEJrZ0RhdGEoZSkge1xuICAgIHRoaXMubG9nZ2VyLmxvZygyLCAoKSA9PiBcImJrZ0RhdGEgPSBcIiArIGF0KGUpKSwgdGhpcy5iYWNrU3BhY2UoKSwgdGhpcy5zZXRQZW4oZSksIHRoaXMuaW5zZXJ0Q2hhcigzMik7XG4gIH1cbiAgc2V0Um9sbFVwUm93cyhlKSB7XG4gICAgdGhpcy5uclJvbGxVcFJvd3MgPSBlO1xuICB9XG4gIHJvbGxVcCgpIHtcbiAgICBpZiAodGhpcy5uclJvbGxVcFJvd3MgPT09IG51bGwpIHtcbiAgICAgIHRoaXMubG9nZ2VyLmxvZygzLCBcInJvbGxfdXAgYnV0IG5yUm9sbFVwUm93cyBub3Qgc2V0IHlldFwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5sb2dnZXIubG9nKDEsICgpID0+IHRoaXMuZ2V0RGlzcGxheVRleHQoKSk7XG4gICAgY29uc3QgZSA9IHRoaXMuY3VyclJvdyArIDEgLSB0aGlzLm5yUm9sbFVwUm93cywgdCA9IHRoaXMucm93cy5zcGxpY2UoZSwgMSlbMF07XG4gICAgdC5jbGVhcigpLCB0aGlzLnJvd3Muc3BsaWNlKHRoaXMuY3VyclJvdywgMCwgdCksIHRoaXMubG9nZ2VyLmxvZygyLCBcIlJvbGxpbmcgdXBcIik7XG4gIH1cbiAgLyoqXG4gICAqIEdldCBhbGwgbm9uLWVtcHR5IHJvd3Mgd2l0aCBhcyB1bmljb2RlIHRleHQuXG4gICAqL1xuICBnZXREaXNwbGF5VGV4dChlKSB7XG4gICAgZSA9IGUgfHwgITE7XG4gICAgY29uc3QgdCA9IFtdO1xuICAgIGxldCByID0gXCJcIiwgbiA9IC0xO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgRHI7IGkrKykge1xuICAgICAgY29uc3QgbyA9IHRoaXMucm93c1tpXS5nZXRUZXh0U3RyaW5nKCk7XG4gICAgICBvICYmIChuID0gaSArIDEsIGUgPyB0LnB1c2goXCJSb3cgXCIgKyBuICsgXCI6ICdcIiArIG8gKyBcIidcIikgOiB0LnB1c2goby50cmltKCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIHQubGVuZ3RoID4gMCAmJiAoZSA/IHIgPSBcIltcIiArIHQuam9pbihcIiB8IFwiKSArIFwiXVwiIDogciA9IHQuam9pbihgXG5gKSksIHI7XG4gIH1cbiAgZ2V0VGV4dEFuZEZvcm1hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5yb3dzO1xuICB9XG59XG5jbGFzcyBlZiB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIpIHtcbiAgICB0aGlzLmNoTnIgPSB2b2lkIDAsIHRoaXMub3V0cHV0RmlsdGVyID0gdm9pZCAwLCB0aGlzLm1vZGUgPSB2b2lkIDAsIHRoaXMudmVyYm9zZSA9IHZvaWQgMCwgdGhpcy5kaXNwbGF5ZWRNZW1vcnkgPSB2b2lkIDAsIHRoaXMubm9uRGlzcGxheWVkTWVtb3J5ID0gdm9pZCAwLCB0aGlzLmxhc3RPdXRwdXRTY3JlZW4gPSB2b2lkIDAsIHRoaXMuY3VyclJvbGxVcFJvdyA9IHZvaWQgMCwgdGhpcy53cml0ZVNjcmVlbiA9IHZvaWQgMCwgdGhpcy5jdWVTdGFydFRpbWUgPSB2b2lkIDAsIHRoaXMubG9nZ2VyID0gdm9pZCAwLCB0aGlzLmNoTnIgPSBlLCB0aGlzLm91dHB1dEZpbHRlciA9IHQsIHRoaXMubW9kZSA9IG51bGwsIHRoaXMudmVyYm9zZSA9IDAsIHRoaXMuZGlzcGxheWVkTWVtb3J5ID0gbmV3IHdsKHIpLCB0aGlzLm5vbkRpc3BsYXllZE1lbW9yeSA9IG5ldyB3bChyKSwgdGhpcy5sYXN0T3V0cHV0U2NyZWVuID0gbmV3IHdsKHIpLCB0aGlzLmN1cnJSb2xsVXBSb3cgPSB0aGlzLmRpc3BsYXllZE1lbW9yeS5yb3dzW0RyIC0gMV0sIHRoaXMud3JpdGVTY3JlZW4gPSB0aGlzLmRpc3BsYXllZE1lbW9yeSwgdGhpcy5tb2RlID0gbnVsbCwgdGhpcy5jdWVTdGFydFRpbWUgPSBudWxsLCB0aGlzLmxvZ2dlciA9IHI7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5tb2RlID0gbnVsbCwgdGhpcy5kaXNwbGF5ZWRNZW1vcnkucmVzZXQoKSwgdGhpcy5ub25EaXNwbGF5ZWRNZW1vcnkucmVzZXQoKSwgdGhpcy5sYXN0T3V0cHV0U2NyZWVuLnJlc2V0KCksIHRoaXMub3V0cHV0RmlsdGVyLnJlc2V0KCksIHRoaXMuY3VyclJvbGxVcFJvdyA9IHRoaXMuZGlzcGxheWVkTWVtb3J5LnJvd3NbRHIgLSAxXSwgdGhpcy53cml0ZVNjcmVlbiA9IHRoaXMuZGlzcGxheWVkTWVtb3J5LCB0aGlzLm1vZGUgPSBudWxsLCB0aGlzLmN1ZVN0YXJ0VGltZSA9IG51bGw7XG4gIH1cbiAgZ2V0SGFuZGxlcigpIHtcbiAgICByZXR1cm4gdGhpcy5vdXRwdXRGaWx0ZXI7XG4gIH1cbiAgc2V0SGFuZGxlcihlKSB7XG4gICAgdGhpcy5vdXRwdXRGaWx0ZXIgPSBlO1xuICB9XG4gIHNldFBBQyhlKSB7XG4gICAgdGhpcy53cml0ZVNjcmVlbi5zZXRQQUMoZSk7XG4gIH1cbiAgc2V0QmtnRGF0YShlKSB7XG4gICAgdGhpcy53cml0ZVNjcmVlbi5zZXRCa2dEYXRhKGUpO1xuICB9XG4gIHNldE1vZGUoZSkge1xuICAgIGUgIT09IHRoaXMubW9kZSAmJiAodGhpcy5tb2RlID0gZSwgdGhpcy5sb2dnZXIubG9nKDIsICgpID0+IFwiTU9ERT1cIiArIGUpLCB0aGlzLm1vZGUgPT09IFwiTU9ERV9QT1AtT05cIiA/IHRoaXMud3JpdGVTY3JlZW4gPSB0aGlzLm5vbkRpc3BsYXllZE1lbW9yeSA6ICh0aGlzLndyaXRlU2NyZWVuID0gdGhpcy5kaXNwbGF5ZWRNZW1vcnksIHRoaXMud3JpdGVTY3JlZW4ucmVzZXQoKSksIHRoaXMubW9kZSAhPT0gXCJNT0RFX1JPTEwtVVBcIiAmJiAodGhpcy5kaXNwbGF5ZWRNZW1vcnkubnJSb2xsVXBSb3dzID0gbnVsbCwgdGhpcy5ub25EaXNwbGF5ZWRNZW1vcnkubnJSb2xsVXBSb3dzID0gbnVsbCksIHRoaXMubW9kZSA9IGUpO1xuICB9XG4gIGluc2VydENoYXJzKGUpIHtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IGUubGVuZ3RoOyByKyspXG4gICAgICB0aGlzLndyaXRlU2NyZWVuLmluc2VydENoYXIoZVtyXSk7XG4gICAgY29uc3QgdCA9IHRoaXMud3JpdGVTY3JlZW4gPT09IHRoaXMuZGlzcGxheWVkTWVtb3J5ID8gXCJESVNQXCIgOiBcIk5PTl9ESVNQXCI7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsICgpID0+IHQgKyBcIjogXCIgKyB0aGlzLndyaXRlU2NyZWVuLmdldERpc3BsYXlUZXh0KCEwKSksICh0aGlzLm1vZGUgPT09IFwiTU9ERV9QQUlOVC1PTlwiIHx8IHRoaXMubW9kZSA9PT0gXCJNT0RFX1JPTEwtVVBcIikgJiYgKHRoaXMubG9nZ2VyLmxvZygxLCAoKSA9PiBcIkRJU1BMQVlFRDogXCIgKyB0aGlzLmRpc3BsYXllZE1lbW9yeS5nZXREaXNwbGF5VGV4dCghMCkpLCB0aGlzLm91dHB1dERhdGFVcGRhdGUoKSk7XG4gIH1cbiAgY2NSQ0woKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiUkNMIC0gUmVzdW1lIENhcHRpb24gTG9hZGluZ1wiKSwgdGhpcy5zZXRNb2RlKFwiTU9ERV9QT1AtT05cIik7XG4gIH1cbiAgY2NCUygpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coMiwgXCJCUyAtIEJhY2tTcGFjZVwiKSwgdGhpcy5tb2RlICE9PSBcIk1PREVfVEVYVFwiICYmICh0aGlzLndyaXRlU2NyZWVuLmJhY2tTcGFjZSgpLCB0aGlzLndyaXRlU2NyZWVuID09PSB0aGlzLmRpc3BsYXllZE1lbW9yeSAmJiB0aGlzLm91dHB1dERhdGFVcGRhdGUoKSk7XG4gIH1cbiAgY2NBT0YoKSB7XG4gIH1cbiAgY2NBT04oKSB7XG4gIH1cbiAgY2NERVIoKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiREVSLSBEZWxldGUgdG8gRW5kIG9mIFJvd1wiKSwgdGhpcy53cml0ZVNjcmVlbi5jbGVhclRvRW5kT2ZSb3coKSwgdGhpcy5vdXRwdXREYXRhVXBkYXRlKCk7XG4gIH1cbiAgY2NSVShlKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiUlUoXCIgKyBlICsgXCIpIC0gUm9sbCBVcFwiKSwgdGhpcy53cml0ZVNjcmVlbiA9IHRoaXMuZGlzcGxheWVkTWVtb3J5LCB0aGlzLnNldE1vZGUoXCJNT0RFX1JPTEwtVVBcIiksIHRoaXMud3JpdGVTY3JlZW4uc2V0Um9sbFVwUm93cyhlKTtcbiAgfVxuICBjY0ZPTigpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coMiwgXCJGT04gLSBGbGFzaCBPblwiKSwgdGhpcy53cml0ZVNjcmVlbi5zZXRQZW4oe1xuICAgICAgZmxhc2g6ICEwXG4gICAgfSk7XG4gIH1cbiAgY2NSREMoKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiUkRDIC0gUmVzdW1lIERpcmVjdCBDYXB0aW9uaW5nXCIpLCB0aGlzLnNldE1vZGUoXCJNT0RFX1BBSU5ULU9OXCIpO1xuICB9XG4gIGNjVFIoKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiVFJcIiksIHRoaXMuc2V0TW9kZShcIk1PREVfVEVYVFwiKTtcbiAgfVxuICBjY1JURCgpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coMiwgXCJSVERcIiksIHRoaXMuc2V0TW9kZShcIk1PREVfVEVYVFwiKTtcbiAgfVxuICBjY0VETSgpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coMiwgXCJFRE0gLSBFcmFzZSBEaXNwbGF5ZWQgTWVtb3J5XCIpLCB0aGlzLmRpc3BsYXllZE1lbW9yeS5yZXNldCgpLCB0aGlzLm91dHB1dERhdGFVcGRhdGUoITApO1xuICB9XG4gIGNjQ1IoKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiQ1IgLSBDYXJyaWFnZSBSZXR1cm5cIiksIHRoaXMud3JpdGVTY3JlZW4ucm9sbFVwKCksIHRoaXMub3V0cHV0RGF0YVVwZGF0ZSghMCk7XG4gIH1cbiAgY2NFTk0oKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiRU5NIC0gRXJhc2UgTm9uLWRpc3BsYXllZCBNZW1vcnlcIiksIHRoaXMubm9uRGlzcGxheWVkTWVtb3J5LnJlc2V0KCk7XG4gIH1cbiAgY2NFT0MoKSB7XG4gICAgaWYgKHRoaXMubG9nZ2VyLmxvZygyLCBcIkVPQyAtIEVuZCBPZiBDYXB0aW9uXCIpLCB0aGlzLm1vZGUgPT09IFwiTU9ERV9QT1AtT05cIikge1xuICAgICAgY29uc3QgZSA9IHRoaXMuZGlzcGxheWVkTWVtb3J5O1xuICAgICAgdGhpcy5kaXNwbGF5ZWRNZW1vcnkgPSB0aGlzLm5vbkRpc3BsYXllZE1lbW9yeSwgdGhpcy5ub25EaXNwbGF5ZWRNZW1vcnkgPSBlLCB0aGlzLndyaXRlU2NyZWVuID0gdGhpcy5ub25EaXNwbGF5ZWRNZW1vcnksIHRoaXMubG9nZ2VyLmxvZygxLCAoKSA9PiBcIkRJU1A6IFwiICsgdGhpcy5kaXNwbGF5ZWRNZW1vcnkuZ2V0RGlzcGxheVRleHQoKSk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0RGF0YVVwZGF0ZSghMCk7XG4gIH1cbiAgY2NUTyhlKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiVE8oXCIgKyBlICsgXCIpIC0gVGFiIE9mZnNldFwiKSwgdGhpcy53cml0ZVNjcmVlbi5tb3ZlQ3Vyc29yKGUpO1xuICB9XG4gIGNjTUlEUk9XKGUpIHtcbiAgICBjb25zdCB0ID0ge1xuICAgICAgZmxhc2g6ICExXG4gICAgfTtcbiAgICBpZiAodC51bmRlcmxpbmUgPSBlICUgMiA9PT0gMSwgdC5pdGFsaWNzID0gZSA+PSA0NiwgdC5pdGFsaWNzKVxuICAgICAgdC5mb3JlZ3JvdW5kID0gXCJ3aGl0ZVwiO1xuICAgIGVsc2Uge1xuICAgICAgY29uc3QgciA9IE1hdGguZmxvb3IoZSAvIDIpIC0gMTYsIG4gPSBbXCJ3aGl0ZVwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiLCBcImN5YW5cIiwgXCJyZWRcIiwgXCJ5ZWxsb3dcIiwgXCJtYWdlbnRhXCJdO1xuICAgICAgdC5mb3JlZ3JvdW5kID0gbltyXTtcbiAgICB9XG4gICAgdGhpcy5sb2dnZXIubG9nKDIsIFwiTUlEUk9XOiBcIiArIGF0KHQpKSwgdGhpcy53cml0ZVNjcmVlbi5zZXRQZW4odCk7XG4gIH1cbiAgb3V0cHV0RGF0YVVwZGF0ZShlID0gITEpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5sb2dnZXIudGltZTtcbiAgICB0ICE9PSBudWxsICYmIHRoaXMub3V0cHV0RmlsdGVyICYmICh0aGlzLmN1ZVN0YXJ0VGltZSA9PT0gbnVsbCAmJiAhdGhpcy5kaXNwbGF5ZWRNZW1vcnkuaXNFbXB0eSgpID8gdGhpcy5jdWVTdGFydFRpbWUgPSB0IDogdGhpcy5kaXNwbGF5ZWRNZW1vcnkuZXF1YWxzKHRoaXMubGFzdE91dHB1dFNjcmVlbikgfHwgKHRoaXMub3V0cHV0RmlsdGVyLm5ld0N1ZSh0aGlzLmN1ZVN0YXJ0VGltZSwgdCwgdGhpcy5sYXN0T3V0cHV0U2NyZWVuKSwgZSAmJiB0aGlzLm91dHB1dEZpbHRlci5kaXNwYXRjaEN1ZSAmJiB0aGlzLm91dHB1dEZpbHRlci5kaXNwYXRjaEN1ZSgpLCB0aGlzLmN1ZVN0YXJ0VGltZSA9IHRoaXMuZGlzcGxheWVkTWVtb3J5LmlzRW1wdHkoKSA/IG51bGwgOiB0KSwgdGhpcy5sYXN0T3V0cHV0U2NyZWVuLmNvcHkodGhpcy5kaXNwbGF5ZWRNZW1vcnkpKTtcbiAgfVxuICBjdWVTcGxpdEF0VGltZShlKSB7XG4gICAgdGhpcy5vdXRwdXRGaWx0ZXIgJiYgKHRoaXMuZGlzcGxheWVkTWVtb3J5LmlzRW1wdHkoKSB8fCAodGhpcy5vdXRwdXRGaWx0ZXIubmV3Q3VlICYmIHRoaXMub3V0cHV0RmlsdGVyLm5ld0N1ZSh0aGlzLmN1ZVN0YXJ0VGltZSwgZSwgdGhpcy5kaXNwbGF5ZWRNZW1vcnkpLCB0aGlzLmN1ZVN0YXJ0VGltZSA9IGUpKTtcbiAgfVxufVxuY2xhc3MgdGYge1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgdGhpcy5jaGFubmVscyA9IHZvaWQgMCwgdGhpcy5jdXJyZW50Q2hhbm5lbCA9IDAsIHRoaXMuY21kSGlzdG9yeSA9IFB3KCksIHRoaXMubG9nZ2VyID0gdm9pZCAwO1xuICAgIGNvbnN0IG4gPSB0aGlzLmxvZ2dlciA9IG5ldyBMdygpO1xuICAgIHRoaXMuY2hhbm5lbHMgPSBbbnVsbCwgbmV3IGVmKGUsIHQsIG4pLCBuZXcgZWYoZSArIDEsIHIsIG4pXTtcbiAgfVxuICBnZXRIYW5kbGVyKGUpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsc1tlXS5nZXRIYW5kbGVyKCk7XG4gIH1cbiAgc2V0SGFuZGxlcihlLCB0KSB7XG4gICAgdGhpcy5jaGFubmVsc1tlXS5zZXRIYW5kbGVyKHQpO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgZGF0YSBmb3IgdGltZSB0IGluIGZvcm1zIG9mIGxpc3Qgb2YgYnl0ZXMgKHVuc2lnbmVkIGludHMpLiBUaGUgYnl0ZXMgYXJlIHRyZWF0ZWQgYXMgcGFpcnMuXG4gICAqL1xuICBhZGREYXRhKGUsIHQpIHtcbiAgICB0aGlzLmxvZ2dlci50aW1lID0gZTtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHQubGVuZ3RoOyByICs9IDIpIHtcbiAgICAgIGNvbnN0IG4gPSB0W3JdICYgMTI3LCBpID0gdFtyICsgMV0gJiAxMjc7XG4gICAgICBsZXQgbyA9ICExLCBhID0gbnVsbDtcbiAgICAgIGlmIChuID09PSAwICYmIGkgPT09IDApXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgdGhpcy5sb2dnZXIubG9nKDMsICgpID0+IFwiW1wiICsgTnMoW3Rbcl0sIHRbciArIDFdXSkgKyBcIl0gLT4gKFwiICsgTnMoW24sIGldKSArIFwiKVwiKTtcbiAgICAgIGNvbnN0IGwgPSB0aGlzLmNtZEhpc3Rvcnk7XG4gICAgICBpZiAobiA+PSAxNiAmJiBuIDw9IDMxKSB7XG4gICAgICAgIGlmIChEdyhuLCBpLCBsKSkge1xuICAgICAgICAgIGVvKG51bGwsIG51bGwsIGwpLCB0aGlzLmxvZ2dlci5sb2coMywgKCkgPT4gXCJSZXBlYXRlZCBjb21tYW5kIChcIiArIE5zKFtuLCBpXSkgKyBcIikgaXMgZHJvcHBlZFwiKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbyhuLCBpLCB0aGlzLmNtZEhpc3RvcnkpLCBvID0gdGhpcy5wYXJzZUNtZChuLCBpKSwgbyB8fCAobyA9IHRoaXMucGFyc2VNaWRyb3cobiwgaSkpLCBvIHx8IChvID0gdGhpcy5wYXJzZVBBQyhuLCBpKSksIG8gfHwgKG8gPSB0aGlzLnBhcnNlQmFja2dyb3VuZEF0dHJpYnV0ZXMobiwgaSkpO1xuICAgICAgfSBlbHNlXG4gICAgICAgIGVvKG51bGwsIG51bGwsIGwpO1xuICAgICAgaWYgKCFvICYmIChhID0gdGhpcy5wYXJzZUNoYXJzKG4sIGkpLCBhKSkge1xuICAgICAgICBjb25zdCB1ID0gdGhpcy5jdXJyZW50Q2hhbm5lbDtcbiAgICAgICAgdSAmJiB1ID4gMCA/IHRoaXMuY2hhbm5lbHNbdV0uaW5zZXJ0Q2hhcnMoYSkgOiB0aGlzLmxvZ2dlci5sb2coMiwgXCJObyBjaGFubmVsIGZvdW5kIHlldC4gVEVYVC1NT0RFP1wiKTtcbiAgICAgIH1cbiAgICAgICFvICYmICFhICYmIHRoaXMubG9nZ2VyLmxvZygyLCAoKSA9PiBcIkNvdWxkbid0IHBhcnNlIGNsZWFuZWQgZGF0YSBcIiArIE5zKFtuLCBpXSkgKyBcIiBvcmlnOiBcIiArIE5zKFt0W3JdLCB0W3IgKyAxXV0pKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlIENvbW1hbmQuXG4gICAqIEByZXR1cm5zIFRydWUgaWYgYSBjb21tYW5kIHdhcyBmb3VuZFxuICAgKi9cbiAgcGFyc2VDbWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAoZSA9PT0gMjAgfHwgZSA9PT0gMjggfHwgZSA9PT0gMjEgfHwgZSA9PT0gMjkpICYmIHQgPj0gMzIgJiYgdCA8PSA0NywgbiA9IChlID09PSAyMyB8fCBlID09PSAzMSkgJiYgdCA+PSAzMyAmJiB0IDw9IDM1O1xuICAgIGlmICghKHIgfHwgbikpXG4gICAgICByZXR1cm4gITE7XG4gICAgY29uc3QgaSA9IGUgPT09IDIwIHx8IGUgPT09IDIxIHx8IGUgPT09IDIzID8gMSA6IDIsIG8gPSB0aGlzLmNoYW5uZWxzW2ldO1xuICAgIHJldHVybiBlID09PSAyMCB8fCBlID09PSAyMSB8fCBlID09PSAyOCB8fCBlID09PSAyOSA/IHQgPT09IDMyID8gby5jY1JDTCgpIDogdCA9PT0gMzMgPyBvLmNjQlMoKSA6IHQgPT09IDM0ID8gby5jY0FPRigpIDogdCA9PT0gMzUgPyBvLmNjQU9OKCkgOiB0ID09PSAzNiA/IG8uY2NERVIoKSA6IHQgPT09IDM3ID8gby5jY1JVKDIpIDogdCA9PT0gMzggPyBvLmNjUlUoMykgOiB0ID09PSAzOSA/IG8uY2NSVSg0KSA6IHQgPT09IDQwID8gby5jY0ZPTigpIDogdCA9PT0gNDEgPyBvLmNjUkRDKCkgOiB0ID09PSA0MiA/IG8uY2NUUigpIDogdCA9PT0gNDMgPyBvLmNjUlREKCkgOiB0ID09PSA0NCA/IG8uY2NFRE0oKSA6IHQgPT09IDQ1ID8gby5jY0NSKCkgOiB0ID09PSA0NiA/IG8uY2NFTk0oKSA6IHQgPT09IDQ3ICYmIG8uY2NFT0MoKSA6IG8uY2NUTyh0IC0gMzIpLCB0aGlzLmN1cnJlbnRDaGFubmVsID0gaSwgITA7XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlIG1pZHJvdyBzdHlsaW5nIGNvbW1hbmRcbiAgICovXG4gIHBhcnNlTWlkcm93KGUsIHQpIHtcbiAgICBsZXQgciA9IDA7XG4gICAgaWYgKChlID09PSAxNyB8fCBlID09PSAyNSkgJiYgdCA+PSAzMiAmJiB0IDw9IDQ3KSB7XG4gICAgICBpZiAoZSA9PT0gMTcgPyByID0gMSA6IHIgPSAyLCByICE9PSB0aGlzLmN1cnJlbnRDaGFubmVsKVxuICAgICAgICByZXR1cm4gdGhpcy5sb2dnZXIubG9nKDAsIFwiTWlzbWF0Y2ggY2hhbm5lbCBpbiBtaWRyb3cgcGFyc2luZ1wiKSwgITE7XG4gICAgICBjb25zdCBuID0gdGhpcy5jaGFubmVsc1tyXTtcbiAgICAgIHJldHVybiBuID8gKG4uY2NNSURST1codCksIHRoaXMubG9nZ2VyLmxvZygzLCAoKSA9PiBcIk1JRFJPVyAoXCIgKyBOcyhbZSwgdF0pICsgXCIpXCIpLCAhMCkgOiAhMTtcbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIC8qKlxuICAgKiBQYXJzZSBQcmVhYmxlIEFjY2VzcyBDb2RlcyAoVGFibGUgNTMpLlxuICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVGVsbHMgaWYgUEFDIGZvdW5kXG4gICAqL1xuICBwYXJzZVBBQyhlLCB0KSB7XG4gICAgbGV0IHI7XG4gICAgY29uc3QgbiA9IChlID49IDE3ICYmIGUgPD0gMjMgfHwgZSA+PSAyNSAmJiBlIDw9IDMxKSAmJiB0ID49IDY0ICYmIHQgPD0gMTI3LCBpID0gKGUgPT09IDE2IHx8IGUgPT09IDI0KSAmJiB0ID49IDY0ICYmIHQgPD0gOTU7XG4gICAgaWYgKCEobiB8fCBpKSlcbiAgICAgIHJldHVybiAhMTtcbiAgICBjb25zdCBvID0gZSA8PSAyMyA/IDEgOiAyO1xuICAgIHQgPj0gNjQgJiYgdCA8PSA5NSA/IHIgPSBvID09PSAxID8gd3dbZV0gOiBJd1tlXSA6IHIgPSBvID09PSAxID8gQXdbZV0gOiBfd1tlXTtcbiAgICBjb25zdCBhID0gdGhpcy5jaGFubmVsc1tvXTtcbiAgICByZXR1cm4gYSA/IChhLnNldFBBQyh0aGlzLmludGVycHJldFBBQyhyLCB0KSksIHRoaXMuY3VycmVudENoYW5uZWwgPSBvLCAhMCkgOiAhMTtcbiAgfVxuICAvKipcbiAgICogSW50ZXJwcmV0IHRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgcGFjLCBhbmQgcmV0dXJuIHRoZSBpbmZvcm1hdGlvbi5cbiAgICogQHJldHVybnMgcGFjRGF0YSB3aXRoIHN0eWxlIHBhcmFtZXRlcnNcbiAgICovXG4gIGludGVycHJldFBBQyhlLCB0KSB7XG4gICAgbGV0IHI7XG4gICAgY29uc3QgbiA9IHtcbiAgICAgIGNvbG9yOiBudWxsLFxuICAgICAgaXRhbGljczogITEsXG4gICAgICBpbmRlbnQ6IG51bGwsXG4gICAgICB1bmRlcmxpbmU6ICExLFxuICAgICAgcm93OiBlXG4gICAgfTtcbiAgICByZXR1cm4gdCA+IDk1ID8gciA9IHQgLSA5NiA6IHIgPSB0IC0gNjQsIG4udW5kZXJsaW5lID0gKHIgJiAxKSA9PT0gMSwgciA8PSAxMyA/IG4uY29sb3IgPSBbXCJ3aGl0ZVwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiLCBcImN5YW5cIiwgXCJyZWRcIiwgXCJ5ZWxsb3dcIiwgXCJtYWdlbnRhXCIsIFwid2hpdGVcIl1bTWF0aC5mbG9vcihyIC8gMildIDogciA8PSAxNSA/IChuLml0YWxpY3MgPSAhMCwgbi5jb2xvciA9IFwid2hpdGVcIikgOiBuLmluZGVudCA9IE1hdGguZmxvb3IoKHIgLSAxNikgLyAyKSAqIDQsIG47XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlIGNoYXJhY3RlcnMuXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IHdpdGggMSB0byAyIGNvZGVzIGNvcnJlc3BvbmRpbmcgdG8gY2hhcnMsIGlmIGZvdW5kLiBudWxsIG90aGVyd2lzZS5cbiAgICovXG4gIHBhcnNlQ2hhcnMoZSwgdCkge1xuICAgIGxldCByLCBuID0gbnVsbCwgaSA9IG51bGw7XG4gICAgaWYgKGUgPj0gMjUgPyAociA9IDIsIGkgPSBlIC0gOCkgOiAociA9IDEsIGkgPSBlKSwgaSA+PSAxNyAmJiBpIDw9IDE5KSB7XG4gICAgICBsZXQgbztcbiAgICAgIGkgPT09IDE3ID8gbyA9IHQgKyA4MCA6IGkgPT09IDE4ID8gbyA9IHQgKyAxMTIgOiBvID0gdCArIDE0NCwgdGhpcy5sb2dnZXIubG9nKDIsICgpID0+IFwiU3BlY2lhbCBjaGFyICdcIiArIEdwKG8pICsgXCInIGluIGNoYW5uZWwgXCIgKyByKSwgbiA9IFtvXTtcbiAgICB9IGVsc2UgZSA+PSAzMiAmJiBlIDw9IDEyNyAmJiAobiA9IHQgPT09IDAgPyBbZV0gOiBbZSwgdF0pO1xuICAgIHJldHVybiBuICYmIHRoaXMubG9nZ2VyLmxvZygzLCAoKSA9PiBcIkNoYXIgY29kZXMgPSAgXCIgKyBOcyhuKS5qb2luKFwiLFwiKSksIG47XG4gIH1cbiAgLyoqXG4gICAqIFBhcnNlIGV4dGVuZGVkIGJhY2tncm91bmQgYXR0cmlidXRlcyBhcyB3ZWxsIGFzIG5ldyBmb3JlZ3JvdW5kIGNvbG9yIGJsYWNrLlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIGJhY2tncm91bmQgYXR0cmlidXRlcyBhcmUgZm91bmRcbiAgICovXG4gIHBhcnNlQmFja2dyb3VuZEF0dHJpYnV0ZXMoZSwgdCkge1xuICAgIGNvbnN0IHIgPSAoZSA9PT0gMTYgfHwgZSA9PT0gMjQpICYmIHQgPj0gMzIgJiYgdCA8PSA0NywgbiA9IChlID09PSAyMyB8fCBlID09PSAzMSkgJiYgdCA+PSA0NSAmJiB0IDw9IDQ3O1xuICAgIGlmICghKHIgfHwgbikpXG4gICAgICByZXR1cm4gITE7XG4gICAgbGV0IGk7XG4gICAgY29uc3QgbyA9IHt9O1xuICAgIGUgPT09IDE2IHx8IGUgPT09IDI0ID8gKGkgPSBNYXRoLmZsb29yKCh0IC0gMzIpIC8gMiksIG8uYmFja2dyb3VuZCA9IFJ3W2ldLCB0ICUgMiA9PT0gMSAmJiAoby5iYWNrZ3JvdW5kID0gby5iYWNrZ3JvdW5kICsgXCJfc2VtaVwiKSkgOiB0ID09PSA0NSA/IG8uYmFja2dyb3VuZCA9IFwidHJhbnNwYXJlbnRcIiA6IChvLmZvcmVncm91bmQgPSBcImJsYWNrXCIsIHQgPT09IDQ3ICYmIChvLnVuZGVybGluZSA9ICEwKSk7XG4gICAgY29uc3QgYSA9IGUgPD0gMjMgPyAxIDogMjtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsc1thXS5zZXRCa2dEYXRhKG8pLCAhMDtcbiAgfVxuICAvKipcbiAgICogUmVzZXQgc3RhdGUgb2YgcGFyc2VyIGFuZCBpdHMgY2hhbm5lbHMuXG4gICAqL1xuICByZXNldCgpIHtcbiAgICBmb3IgKGxldCBlID0gMDsgZSA8IE9iamVjdC5rZXlzKHRoaXMuY2hhbm5lbHMpLmxlbmd0aDsgZSsrKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5jaGFubmVsc1tlXTtcbiAgICAgIHQgJiYgdC5yZXNldCgpO1xuICAgIH1cbiAgICBlbyhudWxsLCBudWxsLCB0aGlzLmNtZEhpc3RvcnkpO1xuICB9XG4gIC8qKlxuICAgKiBUcmlnZ2VyIHRoZSBnZW5lcmF0aW9uIG9mIGEgY3VlLCBhbmQgdGhlIHN0YXJ0IG9mIGEgbmV3IG9uZSBpZiBkaXNwbGF5U2NyZWVucyBhcmUgbm90IGVtcHR5LlxuICAgKi9cbiAgY3VlU3BsaXRBdFRpbWUoZSkge1xuICAgIGZvciAobGV0IHQgPSAwOyB0IDwgdGhpcy5jaGFubmVscy5sZW5ndGg7IHQrKykge1xuICAgICAgY29uc3QgciA9IHRoaXMuY2hhbm5lbHNbdF07XG4gICAgICByICYmIHIuY3VlU3BsaXRBdFRpbWUoZSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBlbyhzLCBlLCB0KSB7XG4gIHQuYSA9IHMsIHQuYiA9IGU7XG59XG5mdW5jdGlvbiBEdyhzLCBlLCB0KSB7XG4gIHJldHVybiB0LmEgPT09IHMgJiYgdC5iID09PSBlO1xufVxuZnVuY3Rpb24gUHcoKSB7XG4gIHJldHVybiB7XG4gICAgYTogbnVsbCxcbiAgICBiOiBudWxsXG4gIH07XG59XG52YXIgT3UgPSAoZnVuY3Rpb24oKSB7XG4gIGlmIChyYSAhPSBudWxsICYmIHJhLlZUVEN1ZSlcbiAgICByZXR1cm4gc2VsZi5WVFRDdWU7XG4gIGNvbnN0IHMgPSBbXCJcIiwgXCJsclwiLCBcInJsXCJdLCBlID0gW1wic3RhcnRcIiwgXCJtaWRkbGVcIiwgXCJlbmRcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl07XG4gIGZ1bmN0aW9uIHQoYSwgbCkge1xuICAgIGlmICh0eXBlb2YgbCAhPSBcInN0cmluZ1wiIHx8ICFBcnJheS5pc0FycmF5KGEpKVxuICAgICAgcmV0dXJuICExO1xuICAgIGNvbnN0IGMgPSBsLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIH5hLmluZGV4T2YoYykgPyBjIDogITE7XG4gIH1cbiAgZnVuY3Rpb24gcihhKSB7XG4gICAgcmV0dXJuIHQocywgYSk7XG4gIH1cbiAgZnVuY3Rpb24gbihhKSB7XG4gICAgcmV0dXJuIHQoZSwgYSk7XG4gIH1cbiAgZnVuY3Rpb24gaShhLCAuLi5sKSB7XG4gICAgbGV0IGMgPSAxO1xuICAgIGZvciAoOyBjIDwgYXJndW1lbnRzLmxlbmd0aDsgYysrKSB7XG4gICAgICBjb25zdCB1ID0gYXJndW1lbnRzW2NdO1xuICAgICAgZm9yIChjb25zdCBkIGluIHUpXG4gICAgICAgIGFbZF0gPSB1W2RdO1xuICAgIH1cbiAgICByZXR1cm4gYTtcbiAgfVxuICBmdW5jdGlvbiBvKGEsIGwsIGMpIHtcbiAgICBjb25zdCB1ID0gdGhpcywgZCA9IHtcbiAgICAgIGVudW1lcmFibGU6ICEwXG4gICAgfTtcbiAgICB1Lmhhc0JlZW5SZXNldCA9ICExO1xuICAgIGxldCBoID0gXCJcIiwgZiA9ICExLCBwID0gYSwgeSA9IGwsIEUgPSBjLCBiID0gbnVsbCwgUiA9IFwiXCIsIEEgPSAhMCwgRiA9IFwiYXV0b1wiLCBNID0gXCJzdGFydFwiLCBIID0gNTAsIEsgPSBcIm1pZGRsZVwiLCBqID0gNTAsIEMgPSBcIm1pZGRsZVwiO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LCBcImlkXCIsIGkoe30sIGQsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBoO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24oaykge1xuICAgICAgICBoID0gXCJcIiArIGs7XG4gICAgICB9XG4gICAgfSkpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodSwgXCJwYXVzZU9uRXhpdFwiLCBpKHt9LCBkLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gZjtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgZiA9ICEhaztcbiAgICAgIH1cbiAgICB9KSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LCBcInN0YXJ0VGltZVwiLCBpKHt9LCBkLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrICE9IFwibnVtYmVyXCIpXG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN0YXJ0IHRpbWUgbXVzdCBiZSBzZXQgdG8gYSBudW1iZXIuXCIpO1xuICAgICAgICBwID0gaywgdGhpcy5oYXNCZWVuUmVzZXQgPSAhMDtcbiAgICAgIH1cbiAgICB9KSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LCBcImVuZFRpbWVcIiwgaSh7fSwgZCwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHk7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgayAhPSBcIm51bWJlclwiKVxuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJFbmQgdGltZSBtdXN0IGJlIHNldCB0byBhIG51bWJlci5cIik7XG4gICAgICAgIHkgPSBrLCB0aGlzLmhhc0JlZW5SZXNldCA9ICEwO1xuICAgICAgfVxuICAgIH0pKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsIFwidGV4dFwiLCBpKHt9LCBkLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gRTtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgRSA9IFwiXCIgKyBrLCB0aGlzLmhhc0JlZW5SZXNldCA9ICEwO1xuICAgICAgfVxuICAgIH0pKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsIFwicmVnaW9uXCIsIGkoe30sIGQsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBiO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24oaykge1xuICAgICAgICBiID0gaywgdGhpcy5oYXNCZWVuUmVzZXQgPSAhMDtcbiAgICAgIH1cbiAgICB9KSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LCBcInZlcnRpY2FsXCIsIGkoe30sIGQsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBSO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24oaykge1xuICAgICAgICBjb25zdCAkID0gcihrKTtcbiAgICAgICAgaWYgKCQgPT09ICExKVxuICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcihcIkFuIGludmFsaWQgb3IgaWxsZWdhbCBzdHJpbmcgd2FzIHNwZWNpZmllZC5cIik7XG4gICAgICAgIFIgPSAkLCB0aGlzLmhhc0JlZW5SZXNldCA9ICEwO1xuICAgICAgfVxuICAgIH0pKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsIFwic25hcFRvTGluZXNcIiwgaSh7fSwgZCwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEE7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIEEgPSAhIWssIHRoaXMuaGFzQmVlblJlc2V0ID0gITA7XG4gICAgICB9XG4gICAgfSkpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodSwgXCJsaW5lXCIsIGkoe30sIGQsIHtcbiAgICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBGO1xuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24oaykge1xuICAgICAgICBpZiAodHlwZW9mIGsgIT0gXCJudW1iZXJcIiAmJiBrICE9PSBcImF1dG9cIilcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBbiBpbnZhbGlkIG51bWJlciBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgRiA9IGssIHRoaXMuaGFzQmVlblJlc2V0ID0gITA7XG4gICAgICB9XG4gICAgfSkpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodSwgXCJsaW5lQWxpZ25cIiwgaSh7fSwgZCwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE07XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGNvbnN0ICQgPSBuKGspO1xuICAgICAgICBpZiAoISQpXG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgTSA9ICQsIHRoaXMuaGFzQmVlblJlc2V0ID0gITA7XG4gICAgICB9XG4gICAgfSkpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkodSwgXCJwb3NpdGlvblwiLCBpKHt9LCBkLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gSDtcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgaWYgKGsgPCAwIHx8IGsgPiAxMDApXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUG9zaXRpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC5cIik7XG4gICAgICAgIEggPSBrLCB0aGlzLmhhc0JlZW5SZXNldCA9ICEwO1xuICAgICAgfVxuICAgIH0pKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsIFwicG9zaXRpb25BbGlnblwiLCBpKHt9LCBkLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gSztcbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgY29uc3QgJCA9IG4oayk7XG4gICAgICAgIGlmICghJClcbiAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJBbiBpbnZhbGlkIG9yIGlsbGVnYWwgc3RyaW5nIHdhcyBzcGVjaWZpZWQuXCIpO1xuICAgICAgICBLID0gJCwgdGhpcy5oYXNCZWVuUmVzZXQgPSAhMDtcbiAgICAgIH1cbiAgICB9KSksIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LCBcInNpemVcIiwgaSh7fSwgZCwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGo7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGlmIChrIDwgMCB8fCBrID4gMTAwKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlNpemUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEwMC5cIik7XG4gICAgICAgIGogPSBrLCB0aGlzLmhhc0JlZW5SZXNldCA9ICEwO1xuICAgICAgfVxuICAgIH0pKSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHUsIFwiYWxpZ25cIiwgaSh7fSwgZCwge1xuICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEM7XG4gICAgICB9LFxuICAgICAgc2V0OiBmdW5jdGlvbihrKSB7XG4gICAgICAgIGNvbnN0ICQgPSBuKGspO1xuICAgICAgICBpZiAoISQpXG4gICAgICAgICAgdGhyb3cgbmV3IFN5bnRheEVycm9yKFwiQW4gaW52YWxpZCBvciBpbGxlZ2FsIHN0cmluZyB3YXMgc3BlY2lmaWVkLlwiKTtcbiAgICAgICAgQyA9ICQsIHRoaXMuaGFzQmVlblJlc2V0ID0gITA7XG4gICAgICB9XG4gICAgfSkpLCB1LmRpc3BsYXlTdGF0ZSA9IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gby5wcm90b3R5cGUuZ2V0Q3VlQXNIVE1MID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNlbGYuV2ViVlRULmNvbnZlcnRDdWVUb0RPTVRyZWUoc2VsZiwgdGhpcy50ZXh0KTtcbiAgfSwgbztcbn0pKCk7XG5jbGFzcyBNdyB7XG4gIGRlY29kZShlLCB0KSB7XG4gICAgaWYgKCFlKVxuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgaWYgKHR5cGVvZiBlICE9IFwic3RyaW5nXCIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJFcnJvciAtIGV4cGVjdGVkIHN0cmluZyBkYXRhLlwiKTtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGVuY29kZVVSSUNvbXBvbmVudChlKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGpwKHMpIHtcbiAgZnVuY3Rpb24gZShyLCBuLCBpLCBvKSB7XG4gICAgcmV0dXJuIChyIHwgMCkgKiAzNjAwICsgKG4gfCAwKSAqIDYwICsgKGkgfCAwKSArIHBhcnNlRmxvYXQobyB8fCAwKTtcbiAgfVxuICBjb25zdCB0ID0gcy5tYXRjaCgvXig/OihcXGQrKTopPyhcXGR7Mn0pOihcXGR7Mn0pKFxcLlxcZCspPy8pO1xuICByZXR1cm4gdCA/IHBhcnNlRmxvYXQodFsyXSkgPiA1OSA/IGUodFsyXSwgdFszXSwgMCwgdFs0XSkgOiBlKHRbMV0sIHRbMl0sIHRbM10sIHRbNF0pIDogbnVsbDtcbn1cbmNsYXNzIE93IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy52YWx1ZXMgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgfVxuICAvLyBPbmx5IGFjY2VwdCB0aGUgZmlyc3QgYXNzaWdubWVudCB0byBhbnkga2V5LlxuICBzZXQoZSwgdCkge1xuICAgICF0aGlzLmdldChlKSAmJiB0ICE9PSBcIlwiICYmICh0aGlzLnZhbHVlc1tlXSA9IHQpO1xuICB9XG4gIC8vIFJldHVybiB0aGUgdmFsdWUgZm9yIGEga2V5LCBvciBhIGRlZmF1bHQgdmFsdWUuXG4gIC8vIElmICdkZWZhdWx0S2V5JyBpcyBwYXNzZWQgdGhlbiAnZGZsdCcgaXMgYXNzdW1lZCB0byBiZSBhbiBvYmplY3Qgd2l0aFxuICAvLyBhIG51bWJlciBvZiBwb3NzaWJsZSBkZWZhdWx0IHZhbHVlcyBhcyBwcm9wZXJ0aWVzIHdoZXJlICdkZWZhdWx0S2V5JyBpc1xuICAvLyB0aGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgY2hvc2VuOyBvdGhlcndpc2UgaXQncyBhc3N1bWVkIHRvIGJlXG4gIC8vIGEgc2luZ2xlIHZhbHVlLlxuICBnZXQoZSwgdCwgcikge1xuICAgIHJldHVybiByID8gdGhpcy5oYXMoZSkgPyB0aGlzLnZhbHVlc1tlXSA6IHRbcl0gOiB0aGlzLmhhcyhlKSA/IHRoaXMudmFsdWVzW2VdIDogdDtcbiAgfVxuICAvLyBDaGVjayB3aGV0aGVyIHdlIGhhdmUgYSB2YWx1ZSBmb3IgYSBrZXkuXG4gIGhhcyhlKSB7XG4gICAgcmV0dXJuIGUgaW4gdGhpcy52YWx1ZXM7XG4gIH1cbiAgLy8gQWNjZXB0IGEgc2V0dGluZyBpZiBpdHMgb25lIG9mIHRoZSBnaXZlbiBhbHRlcm5hdGl2ZXMuXG4gIGFsdChlLCB0LCByKSB7XG4gICAgZm9yIChsZXQgbiA9IDA7IG4gPCByLmxlbmd0aDsgKytuKVxuICAgICAgaWYgKHQgPT09IHJbbl0pIHtcbiAgICAgICAgdGhpcy5zZXQoZSwgdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICB9XG4gIC8vIEFjY2VwdCBhIHNldHRpbmcgaWYgaXRzIGEgdmFsaWQgKHNpZ25lZCkgaW50ZWdlci5cbiAgaW50ZWdlcihlLCB0KSB7XG4gICAgL14tP1xcZCskLy50ZXN0KHQpICYmIHRoaXMuc2V0KGUsIHBhcnNlSW50KHQsIDEwKSk7XG4gIH1cbiAgLy8gQWNjZXB0IGEgc2V0dGluZyBpZiBpdHMgYSB2YWxpZCBwZXJjZW50YWdlLlxuICBwZXJjZW50KGUsIHQpIHtcbiAgICBpZiAoL14oW1xcZF17MSwzfSkoXFwuW1xcZF0qKT8lJC8udGVzdCh0KSkge1xuICAgICAgY29uc3QgciA9IHBhcnNlRmxvYXQodCk7XG4gICAgICBpZiAociA+PSAwICYmIHIgPD0gMTAwKVxuICAgICAgICByZXR1cm4gdGhpcy5zZXQoZSwgciksICEwO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbn1cbmZ1bmN0aW9uIEtwKHMsIGUsIHQsIHIpIHtcbiAgY29uc3QgbiA9IHIgPyBzLnNwbGl0KHIpIDogW3NdO1xuICBmb3IgKGNvbnN0IGkgaW4gbikge1xuICAgIGlmICh0eXBlb2YgbltpXSAhPSBcInN0cmluZ1wiKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgbyA9IG5baV0uc3BsaXQodCk7XG4gICAgaWYgKG8ubGVuZ3RoICE9PSAyKVxuICAgICAgY29udGludWU7XG4gICAgY29uc3QgYSA9IG9bMF0sIGwgPSBvWzFdO1xuICAgIGUoYSwgbCk7XG4gIH1cbn1cbmNvbnN0IGJjID0gbmV3IE91KDAsIDAsIFwiXCIpLCB0byA9IGJjLmFsaWduID09PSBcIm1pZGRsZVwiID8gXCJtaWRkbGVcIiA6IFwiY2VudGVyXCI7XG5mdW5jdGlvbiBCdyhzLCBlLCB0KSB7XG4gIGNvbnN0IHIgPSBzO1xuICBmdW5jdGlvbiBuKCkge1xuICAgIGNvbnN0IGEgPSBqcChzKTtcbiAgICBpZiAoYSA9PT0gbnVsbClcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk1hbGZvcm1lZCB0aW1lc3RhbXA6IFwiICsgcik7XG4gICAgcmV0dXJuIHMgPSBzLnJlcGxhY2UoL15bXlxcc2EtekEtWi1dKy8sIFwiXCIpLCBhO1xuICB9XG4gIGZ1bmN0aW9uIGkoYSwgbCkge1xuICAgIGNvbnN0IGMgPSBuZXcgT3coKTtcbiAgICBLcChhLCBmdW5jdGlvbihoLCBmKSB7XG4gICAgICBsZXQgcDtcbiAgICAgIHN3aXRjaCAoaCkge1xuICAgICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgICAgZm9yIChsZXQgeSA9IHQubGVuZ3RoIC0gMTsgeSA+PSAwOyB5LS0pXG4gICAgICAgICAgICBpZiAodFt5XS5pZCA9PT0gZikge1xuICAgICAgICAgICAgICBjLnNldChoLCB0W3ldLnJlZ2lvbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwidmVydGljYWxcIjpcbiAgICAgICAgICBjLmFsdChoLCBmLCBbXCJybFwiLCBcImxyXCJdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcImxpbmVcIjpcbiAgICAgICAgICBwID0gZi5zcGxpdChcIixcIiksIGMuaW50ZWdlcihoLCBwWzBdKSwgYy5wZXJjZW50KGgsIHBbMF0pICYmIGMuc2V0KFwic25hcFRvTGluZXNcIiwgITEpLCBjLmFsdChoLCBwWzBdLCBbXCJhdXRvXCJdKSwgcC5sZW5ndGggPT09IDIgJiYgYy5hbHQoXCJsaW5lQWxpZ25cIiwgcFsxXSwgW1wic3RhcnRcIiwgdG8sIFwiZW5kXCJdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcInBvc2l0aW9uXCI6XG4gICAgICAgICAgcCA9IGYuc3BsaXQoXCIsXCIpLCBjLnBlcmNlbnQoaCwgcFswXSksIHAubGVuZ3RoID09PSAyICYmIGMuYWx0KFwicG9zaXRpb25BbGlnblwiLCBwWzFdLCBbXCJzdGFydFwiLCB0bywgXCJlbmRcIiwgXCJsaW5lLWxlZnRcIiwgXCJsaW5lLXJpZ2h0XCIsIFwiYXV0b1wiXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJzaXplXCI6XG4gICAgICAgICAgYy5wZXJjZW50KGgsIGYpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiYWxpZ25cIjpcbiAgICAgICAgICBjLmFsdChoLCBmLCBbXCJzdGFydFwiLCB0bywgXCJlbmRcIiwgXCJsZWZ0XCIsIFwicmlnaHRcIl0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0sIC86LywgL1xccy8pLCBsLnJlZ2lvbiA9IGMuZ2V0KFwicmVnaW9uXCIsIG51bGwpLCBsLnZlcnRpY2FsID0gYy5nZXQoXCJ2ZXJ0aWNhbFwiLCBcIlwiKTtcbiAgICBsZXQgdSA9IGMuZ2V0KFwibGluZVwiLCBcImF1dG9cIik7XG4gICAgdSA9PT0gXCJhdXRvXCIgJiYgYmMubGluZSA9PT0gLTEgJiYgKHUgPSAtMSksIGwubGluZSA9IHUsIGwubGluZUFsaWduID0gYy5nZXQoXCJsaW5lQWxpZ25cIiwgXCJzdGFydFwiKSwgbC5zbmFwVG9MaW5lcyA9IGMuZ2V0KFwic25hcFRvTGluZXNcIiwgITApLCBsLnNpemUgPSBjLmdldChcInNpemVcIiwgMTAwKSwgbC5hbGlnbiA9IGMuZ2V0KFwiYWxpZ25cIiwgdG8pO1xuICAgIGxldCBkID0gYy5nZXQoXCJwb3NpdGlvblwiLCBcImF1dG9cIik7XG4gICAgZCA9PT0gXCJhdXRvXCIgJiYgYmMucG9zaXRpb24gPT09IDUwICYmIChkID0gbC5hbGlnbiA9PT0gXCJzdGFydFwiIHx8IGwuYWxpZ24gPT09IFwibGVmdFwiID8gMCA6IGwuYWxpZ24gPT09IFwiZW5kXCIgfHwgbC5hbGlnbiA9PT0gXCJyaWdodFwiID8gMTAwIDogNTApLCBsLnBvc2l0aW9uID0gZDtcbiAgfVxuICBmdW5jdGlvbiBvKCkge1xuICAgIHMgPSBzLnJlcGxhY2UoL15cXHMrLywgXCJcIik7XG4gIH1cbiAgaWYgKG8oKSwgZS5zdGFydFRpbWUgPSBuKCksIG8oKSwgcy5zbGljZSgwLCAzKSAhPT0gXCItLT5cIilcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNYWxmb3JtZWQgdGltZSBzdGFtcCAodGltZSBzdGFtcHMgbXVzdCBiZSBzZXBhcmF0ZWQgYnkgJy0tPicpOiBcIiArIHIpO1xuICBzID0gcy5zbGljZSgzKSwgbygpLCBlLmVuZFRpbWUgPSBuKCksIG8oKSwgaShzLCBlKTtcbn1cbmZ1bmN0aW9uIEhwKHMpIHtcbiAgcmV0dXJuIHMucmVwbGFjZSgvPGJyKD86IFxcLyk/Pi9naSwgYFxuYCk7XG59XG5jbGFzcyBGdyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc3RhdGUgPSBcIklOSVRJQUxcIiwgdGhpcy5idWZmZXIgPSBcIlwiLCB0aGlzLmRlY29kZXIgPSBuZXcgTXcoKSwgdGhpcy5yZWdpb25MaXN0ID0gW10sIHRoaXMuY3VlID0gbnVsbCwgdGhpcy5vbmN1ZSA9IHZvaWQgMCwgdGhpcy5vbnBhcnNpbmdlcnJvciA9IHZvaWQgMCwgdGhpcy5vbmZsdXNoID0gdm9pZCAwO1xuICB9XG4gIHBhcnNlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcztcbiAgICBlICYmICh0LmJ1ZmZlciArPSB0LmRlY29kZXIuZGVjb2RlKGUsIHtcbiAgICAgIHN0cmVhbTogITBcbiAgICB9KSk7XG4gICAgZnVuY3Rpb24gcigpIHtcbiAgICAgIGxldCBpID0gdC5idWZmZXIsIG8gPSAwO1xuICAgICAgZm9yIChpID0gSHAoaSk7IG8gPCBpLmxlbmd0aCAmJiBpW29dICE9PSBcIlxcclwiICYmIGlbb10gIT09IGBcbmA7IClcbiAgICAgICAgKytvO1xuICAgICAgY29uc3QgYSA9IGkuc2xpY2UoMCwgbyk7XG4gICAgICByZXR1cm4gaVtvXSA9PT0gXCJcXHJcIiAmJiArK28sIGlbb10gPT09IGBcbmAgJiYgKytvLCB0LmJ1ZmZlciA9IGkuc2xpY2UobyksIGE7XG4gICAgfVxuICAgIGZ1bmN0aW9uIG4oaSkge1xuICAgICAgS3AoaSwgZnVuY3Rpb24obywgYSkge1xuICAgICAgfSwgLzovKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxldCBpID0gXCJcIjtcbiAgICAgIGlmICh0LnN0YXRlID09PSBcIklOSVRJQUxcIikge1xuICAgICAgICBpZiAoIS9cXHJcXG58XFxuLy50ZXN0KHQuYnVmZmVyKSlcbiAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgaSA9IHIoKTtcbiAgICAgICAgY29uc3QgYSA9IGkubWF0Y2goL14ow6/Cu8K/KT9XRUJWVFQoWyBcXHRdLiopPyQvKTtcbiAgICAgICAgaWYgKCEoYSAhPSBudWxsICYmIGFbMF0pKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1hbGZvcm1lZCBXZWJWVFQgc2lnbmF0dXJlLlwiKTtcbiAgICAgICAgdC5zdGF0ZSA9IFwiSEVBREVSXCI7XG4gICAgICB9XG4gICAgICBsZXQgbyA9ICExO1xuICAgICAgZm9yICg7IHQuYnVmZmVyOyApIHtcbiAgICAgICAgaWYgKCEvXFxyXFxufFxcbi8udGVzdCh0LmJ1ZmZlcikpXG4gICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIHN3aXRjaCAobyA/IG8gPSAhMSA6IGkgPSByKCksIHQuc3RhdGUpIHtcbiAgICAgICAgICBjYXNlIFwiSEVBREVSXCI6XG4gICAgICAgICAgICAvOi8udGVzdChpKSA/IG4oaSkgOiBpIHx8ICh0LnN0YXRlID0gXCJJRFwiKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgXCJOT1RFXCI6XG4gICAgICAgICAgICBpIHx8ICh0LnN0YXRlID0gXCJJRFwiKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNhc2UgXCJJRFwiOlxuICAgICAgICAgICAgaWYgKC9eTk9URSgkfFsgXFx0XSkvLnRlc3QoaSkpIHtcbiAgICAgICAgICAgICAgdC5zdGF0ZSA9IFwiTk9URVwiO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaSlcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBpZiAodC5jdWUgPSBuZXcgT3UoMCwgMCwgXCJcIiksIHQuc3RhdGUgPSBcIkNVRVwiLCBpLmluZGV4T2YoXCItLT5cIikgPT09IC0xKSB7XG4gICAgICAgICAgICAgIHQuY3VlLmlkID0gaTtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgLy8gUHJvY2VzcyBsaW5lIGFzIHN0YXJ0IG9mIGEgY3VlLlxuICAgICAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICAgICAgICBjYXNlIFwiQ1VFXCI6XG4gICAgICAgICAgICBpZiAoIXQuY3VlKSB7XG4gICAgICAgICAgICAgIHQuc3RhdGUgPSBcIkJBRENVRVwiO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIEJ3KGksIHQuY3VlLCB0LnJlZ2lvbkxpc3QpO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHQuY3VlID0gbnVsbCwgdC5zdGF0ZSA9IFwiQkFEQ1VFXCI7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdC5zdGF0ZSA9IFwiQ1VFVEVYVFwiO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBcIkNVRVRFWFRcIjpcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29uc3QgYSA9IGkuaW5kZXhPZihcIi0tPlwiKSAhPT0gLTE7XG4gICAgICAgICAgICAgIGlmICghaSB8fCBhICYmIChvID0gITApKSB7XG4gICAgICAgICAgICAgICAgdC5vbmN1ZSAmJiB0LmN1ZSAmJiB0Lm9uY3VlKHQuY3VlKSwgdC5jdWUgPSBudWxsLCB0LnN0YXRlID0gXCJJRFwiO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh0LmN1ZSA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgdC5jdWUudGV4dCAmJiAodC5jdWUudGV4dCArPSBgXG5gKSwgdC5jdWUudGV4dCArPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgY2FzZSBcIkJBRENVRVwiOlxuICAgICAgICAgICAgaSB8fCAodC5zdGF0ZSA9IFwiSURcIik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHQuc3RhdGUgPT09IFwiQ1VFVEVYVFwiICYmIHQuY3VlICYmIHQub25jdWUgJiYgdC5vbmN1ZSh0LmN1ZSksIHQuY3VlID0gbnVsbCwgdC5zdGF0ZSA9IHQuc3RhdGUgPT09IFwiSU5JVElBTFwiID8gXCJCQURXRUJWVFRcIiA6IFwiQkFEQ1VFXCI7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIGZsdXNoKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzO1xuICAgIHRyeSB7XG4gICAgICBpZiAoKGUuY3VlIHx8IGUuc3RhdGUgPT09IFwiSEVBREVSXCIpICYmIChlLmJ1ZmZlciArPSBgXG5cbmAsIGUucGFyc2UoKSksIGUuc3RhdGUgPT09IFwiSU5JVElBTFwiIHx8IGUuc3RhdGUgPT09IFwiQkFEV0VCVlRUXCIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIk1hbGZvcm1lZCBXZWJWVFQgc2lnbmF0dXJlLlwiKTtcbiAgICB9IGNhdGNoICh0KSB7XG4gICAgICBlLm9ucGFyc2luZ2Vycm9yICYmIGUub25wYXJzaW5nZXJyb3IodCk7XG4gICAgfVxuICAgIHJldHVybiBlLm9uZmx1c2ggJiYgZS5vbmZsdXNoKCksIHRoaXM7XG4gIH1cbn1cbmNvbnN0IE53ID0gL1xcclxcbnxcXG5cXHJ8XFxufFxcci9nLCBBbCA9IGZ1bmN0aW9uKGUsIHQsIHIgPSAwKSB7XG4gIHJldHVybiBlLnNsaWNlKHIsIHIgKyB0Lmxlbmd0aCkgPT09IHQ7XG59LCBVdyA9IGZ1bmN0aW9uKGUpIHtcbiAgbGV0IHQgPSBwYXJzZUludChlLnNsaWNlKC0zKSk7XG4gIGNvbnN0IHIgPSBwYXJzZUludChlLnNsaWNlKC02LCAtNCkpLCBuID0gcGFyc2VJbnQoZS5zbGljZSgtOSwgLTcpKSwgaSA9IGUubGVuZ3RoID4gOSA/IHBhcnNlSW50KGUuc3Vic3RyaW5nKDAsIGUuaW5kZXhPZihcIjpcIikpKSA6IDA7XG4gIGlmICghdWUodCkgfHwgIXVlKHIpIHx8ICF1ZShuKSB8fCAhdWUoaSkpXG4gICAgdGhyb3cgRXJyb3IoYE1hbGZvcm1lZCBYLVRJTUVTVEFNUC1NQVA6IExvY2FsOiR7ZX1gKTtcbiAgcmV0dXJuIHQgKz0gMWUzICogciwgdCArPSA2MCAqIDFlMyAqIG4sIHQgKz0gMzYwMCAqIDFlMyAqIGksIHQ7XG59O1xuZnVuY3Rpb24gQnUocywgZSwgdCkge1xuICByZXR1cm4gWG4ocy50b1N0cmluZygpKSArIFhuKGUudG9TdHJpbmcoKSkgKyBYbih0KTtcbn1cbmNvbnN0ICR3ID0gZnVuY3Rpb24oZSwgdCwgcikge1xuICBsZXQgbiA9IGVbdF0sIGkgPSBlW24ucHJldkNDXTtcbiAgaWYgKCFpIHx8ICFpLm5ldyAmJiBuLm5ldykge1xuICAgIGUuY2NPZmZzZXQgPSBlLnByZXNlbnRhdGlvbk9mZnNldCA9IG4uc3RhcnQsIG4ubmV3ID0gITE7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoOyAobyA9IGkpICE9IG51bGwgJiYgby5uZXc7ICkge1xuICAgIHZhciBvO1xuICAgIGUuY2NPZmZzZXQgKz0gbi5zdGFydCAtIGkuc3RhcnQsIG4ubmV3ID0gITEsIG4gPSBpLCBpID0gZVtuLnByZXZDQ107XG4gIH1cbiAgZS5wcmVzZW50YXRpb25PZmZzZXQgPSByO1xufTtcbmZ1bmN0aW9uIEd3KHMsIGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgY29uc3QgYSA9IG5ldyBGdygpLCBsID0gVHIobmV3IFVpbnQ4QXJyYXkocykpLnRyaW0oKS5yZXBsYWNlKE53LCBgXG5gKS5zcGxpdChgXG5gKSwgYyA9IFtdLCB1ID0gZSA/IFdUKGUuYmFzZVRpbWUsIGUudGltZXNjYWxlKSA6IDA7XG4gIGxldCBkID0gXCIwMDowMC4wMDBcIiwgaCA9IDAsIGYgPSAwLCBwLCB5ID0gITA7XG4gIGEub25jdWUgPSBmdW5jdGlvbihFKSB7XG4gICAgY29uc3QgYiA9IHRbcl07XG4gICAgbGV0IFIgPSB0LmNjT2Zmc2V0O1xuICAgIGNvbnN0IEEgPSAoaCAtIHUpIC8gOWU0O1xuICAgIGlmIChiICE9IG51bGwgJiYgYi5uZXcgJiYgKGYgIT09IHZvaWQgMCA/IFIgPSB0LmNjT2Zmc2V0ID0gYi5zdGFydCA6ICR3KHQsIHIsIEEpKSwgQSkge1xuICAgICAgaWYgKCFlKSB7XG4gICAgICAgIHAgPSBuZXcgRXJyb3IoXCJNaXNzaW5nIGluaXRQVFMgZm9yIFZUVCBNUEVHVFNcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFIgPSBBIC0gdC5wcmVzZW50YXRpb25PZmZzZXQ7XG4gICAgfVxuICAgIGNvbnN0IEYgPSBFLmVuZFRpbWUgLSBFLnN0YXJ0VGltZSwgTSA9IEFyKChFLnN0YXJ0VGltZSArIFIgLSBmKSAqIDllNCwgbiAqIDllNCkgLyA5ZTQ7XG4gICAgRS5zdGFydFRpbWUgPSBNYXRoLm1heChNLCAwKSwgRS5lbmRUaW1lID0gTWF0aC5tYXgoTSArIEYsIDApO1xuICAgIGNvbnN0IEggPSBFLnRleHQudHJpbSgpO1xuICAgIEUudGV4dCA9IGRlY29kZVVSSUNvbXBvbmVudChlbmNvZGVVUklDb21wb25lbnQoSCkpLCBFLmlkIHx8IChFLmlkID0gQnUoRS5zdGFydFRpbWUsIEUuZW5kVGltZSwgSCkpLCBFLmVuZFRpbWUgPiAwICYmIGMucHVzaChFKTtcbiAgfSwgYS5vbnBhcnNpbmdlcnJvciA9IGZ1bmN0aW9uKEUpIHtcbiAgICBwID0gRTtcbiAgfSwgYS5vbmZsdXNoID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHApIHtcbiAgICAgIG8ocCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGkoYyk7XG4gIH0sIGwuZm9yRWFjaCgoRSkgPT4ge1xuICAgIGlmICh5KVxuICAgICAgaWYgKEFsKEUsIFwiWC1USU1FU1RBTVAtTUFQPVwiKSkge1xuICAgICAgICB5ID0gITEsIEUuc2xpY2UoMTYpLnNwbGl0KFwiLFwiKS5mb3JFYWNoKChiKSA9PiB7XG4gICAgICAgICAgQWwoYiwgXCJMT0NBTDpcIikgPyBkID0gYi5zbGljZSg2KSA6IEFsKGIsIFwiTVBFR1RTOlwiKSAmJiAoaCA9IHBhcnNlSW50KGIuc2xpY2UoNykpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZiA9IFV3KGQpIC8gMWUzO1xuICAgICAgICB9IGNhdGNoIChiKSB7XG4gICAgICAgICAgcCA9IGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIEUgPT09IFwiXCIgJiYgKHkgPSAhMSk7XG4gICAgYS5wYXJzZShFICsgYFxuYCk7XG4gIH0pLCBhLmZsdXNoKCk7XG59XG5jb25zdCBJbCA9IFwic3RwcC50dG1sLmltMXRcIiwgcXAgPSAvXihcXGR7Mix9KTooXFxkezJ9KTooXFxkezJ9KTooXFxkezJ9KVxcLj8oXFxkKyk/JC8sIFdwID0gL14oXFxkKig/OlxcLlxcZCopPykoaHxtfHN8bXN8Znx0KSQvLCBWdyA9IHtcbiAgbGVmdDogXCJzdGFydFwiLFxuICBjZW50ZXI6IFwiY2VudGVyXCIsXG4gIHJpZ2h0OiBcImVuZFwiLFxuICBzdGFydDogXCJzdGFydFwiLFxuICBlbmQ6IFwiZW5kXCJcbn07XG5mdW5jdGlvbiByZihzLCBlLCB0LCByKSB7XG4gIGNvbnN0IG4gPSBHZShuZXcgVWludDhBcnJheShzKSwgW1wibWRhdFwiXSk7XG4gIGlmIChuLmxlbmd0aCA9PT0gMCkge1xuICAgIHIobmV3IEVycm9yKFwiQ291bGQgbm90IHBhcnNlIElNU0MxIG1kYXRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBpID0gbi5tYXAoKGEpID0+IFRyKGEpKSwgbyA9IHFUKGUuYmFzZVRpbWUsIDEsIGUudGltZXNjYWxlKTtcbiAgdHJ5IHtcbiAgICBpLmZvckVhY2goKGEpID0+IHQoancoYSwgbykpKTtcbiAgfSBjYXRjaCAoYSkge1xuICAgIHIoYSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGp3KHMsIGUpIHtcbiAgY29uc3QgbiA9IG5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcocywgXCJ0ZXh0L3htbFwiKS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInR0XCIpWzBdO1xuICBpZiAoIW4pXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB0dG1sXCIpO1xuICBjb25zdCBpID0ge1xuICAgIGZyYW1lUmF0ZTogMzAsXG4gICAgc3ViRnJhbWVSYXRlOiAxLFxuICAgIGZyYW1lUmF0ZU11bHRpcGxpZXI6IDAsXG4gICAgdGlja1JhdGU6IDBcbiAgfSwgbyA9IE9iamVjdC5rZXlzKGkpLnJlZHVjZSgoZCwgaCkgPT4gKGRbaF0gPSBuLmdldEF0dHJpYnV0ZShgdHRwOiR7aH1gKSB8fCBpW2hdLCBkKSwge30pLCBhID0gbi5nZXRBdHRyaWJ1dGUoXCJ4bWw6c3BhY2VcIikgIT09IFwicHJlc2VydmVcIiwgbCA9IHNmKF9sKG4sIFwic3R5bGluZ1wiLCBcInN0eWxlXCIpKSwgYyA9IHNmKF9sKG4sIFwibGF5b3V0XCIsIFwicmVnaW9uXCIpKSwgdSA9IF9sKG4sIFwiYm9keVwiLCBcIltiZWdpbl1cIik7XG4gIHJldHVybiBbXS5tYXAuY2FsbCh1LCAoZCkgPT4ge1xuICAgIGNvbnN0IGggPSB6cChkLCBhKTtcbiAgICBpZiAoIWggfHwgIWQuaGFzQXR0cmlidXRlKFwiYmVnaW5cIikpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBmID0gTGwoZC5nZXRBdHRyaWJ1dGUoXCJiZWdpblwiKSwgbyksIHAgPSBMbChkLmdldEF0dHJpYnV0ZShcImR1clwiKSwgbyk7XG4gICAgbGV0IHkgPSBMbChkLmdldEF0dHJpYnV0ZShcImVuZFwiKSwgbyk7XG4gICAgaWYgKGYgPT09IG51bGwpXG4gICAgICB0aHJvdyBuZihkKTtcbiAgICBpZiAoeSA9PT0gbnVsbCkge1xuICAgICAgaWYgKHAgPT09IG51bGwpXG4gICAgICAgIHRocm93IG5mKGQpO1xuICAgICAgeSA9IGYgKyBwO1xuICAgIH1cbiAgICBjb25zdCBFID0gbmV3IE91KGYgLSBlLCB5IC0gZSwgaCk7XG4gICAgRS5pZCA9IEJ1KEUuc3RhcnRUaW1lLCBFLmVuZFRpbWUsIEUudGV4dCk7XG4gICAgY29uc3QgYiA9IGNbZC5nZXRBdHRyaWJ1dGUoXCJyZWdpb25cIildLCBSID0gbFtkLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpXSwgQSA9IEt3KGIsIFIsIGwpLCB7XG4gICAgICB0ZXh0QWxpZ246IEZcbiAgICB9ID0gQTtcbiAgICBpZiAoRikge1xuICAgICAgY29uc3QgTSA9IFZ3W0ZdO1xuICAgICAgTSAmJiAoRS5saW5lQWxpZ24gPSBNKSwgRS5hbGlnbiA9IEY7XG4gICAgfVxuICAgIHJldHVybiBudChFLCBBKSwgRTtcbiAgfSkuZmlsdGVyKChkKSA9PiBkICE9PSBudWxsKTtcbn1cbmZ1bmN0aW9uIF9sKHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IHMuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSlbMF07XG4gIHJldHVybiByID8gW10uc2xpY2UuY2FsbChyLnF1ZXJ5U2VsZWN0b3JBbGwodCkpIDogW107XG59XG5mdW5jdGlvbiBzZihzKSB7XG4gIHJldHVybiBzLnJlZHVjZSgoZSwgdCkgPT4ge1xuICAgIGNvbnN0IHIgPSB0LmdldEF0dHJpYnV0ZShcInhtbDppZFwiKTtcbiAgICByZXR1cm4gciAmJiAoZVtyXSA9IHQpLCBlO1xuICB9LCB7fSk7XG59XG5mdW5jdGlvbiB6cChzLCBlKSB7XG4gIHJldHVybiBbXS5zbGljZS5jYWxsKHMuY2hpbGROb2RlcykucmVkdWNlKCh0LCByLCBuKSA9PiB7XG4gICAgdmFyIGk7XG4gICAgcmV0dXJuIHIubm9kZU5hbWUgPT09IFwiYnJcIiAmJiBuID8gdCArIGBcbmAgOiAoaSA9IHIuY2hpbGROb2RlcykgIT0gbnVsbCAmJiBpLmxlbmd0aCA/IHpwKHIsIGUpIDogZSA/IHQgKyByLnRleHRDb250ZW50LnRyaW0oKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKSA6IHQgKyByLnRleHRDb250ZW50O1xuICB9LCBcIlwiKTtcbn1cbmZ1bmN0aW9uIEt3KHMsIGUsIHQpIHtcbiAgY29uc3QgciA9IFwiaHR0cDovL3d3dy53My5vcmcvbnMvdHRtbCNzdHlsaW5nXCI7XG4gIGxldCBuID0gbnVsbDtcbiAgY29uc3QgaSA9IFtcbiAgICBcImRpc3BsYXlBbGlnblwiLFxuICAgIFwidGV4dEFsaWduXCIsXG4gICAgXCJjb2xvclwiLFxuICAgIFwiYmFja2dyb3VuZENvbG9yXCIsXG4gICAgXCJmb250U2l6ZVwiLFxuICAgIFwiZm9udEZhbWlseVwiXG4gICAgLy8gJ2ZvbnRXZWlnaHQnLFxuICAgIC8vICdsaW5lSGVpZ2h0JyxcbiAgICAvLyAnd3JhcE9wdGlvbicsXG4gICAgLy8gJ2ZvbnRTdHlsZScsXG4gICAgLy8gJ2RpcmVjdGlvbicsXG4gICAgLy8gJ3dyaXRpbmdNb2RlJ1xuICBdLCBvID0gcyAhPSBudWxsICYmIHMuaGFzQXR0cmlidXRlKFwic3R5bGVcIikgPyBzLmdldEF0dHJpYnV0ZShcInN0eWxlXCIpIDogbnVsbDtcbiAgcmV0dXJuIG8gJiYgdC5oYXNPd25Qcm9wZXJ0eShvKSAmJiAobiA9IHRbb10pLCBpLnJlZHVjZSgoYSwgbCkgPT4ge1xuICAgIGNvbnN0IGMgPSBSbChlLCByLCBsKSB8fCBSbChzLCByLCBsKSB8fCBSbChuLCByLCBsKTtcbiAgICByZXR1cm4gYyAmJiAoYVtsXSA9IGMpLCBhO1xuICB9LCB7fSk7XG59XG5mdW5jdGlvbiBSbChzLCBlLCB0KSB7XG4gIHJldHVybiBzICYmIHMuaGFzQXR0cmlidXRlTlMoZSwgdCkgPyBzLmdldEF0dHJpYnV0ZU5TKGUsIHQpIDogbnVsbDtcbn1cbmZ1bmN0aW9uIG5mKHMpIHtcbiAgcmV0dXJuIG5ldyBFcnJvcihgQ291bGQgbm90IHBhcnNlIHR0bWwgdGltZXN0YW1wICR7c31gKTtcbn1cbmZ1bmN0aW9uIExsKHMsIGUpIHtcbiAgaWYgKCFzKVxuICAgIHJldHVybiBudWxsO1xuICBsZXQgdCA9IGpwKHMpO1xuICByZXR1cm4gdCA9PT0gbnVsbCAmJiAocXAudGVzdChzKSA/IHQgPSBIdyhzLCBlKSA6IFdwLnRlc3QocykgJiYgKHQgPSBxdyhzLCBlKSkpLCB0O1xufVxuZnVuY3Rpb24gSHcocywgZSkge1xuICBjb25zdCB0ID0gcXAuZXhlYyhzKSwgciA9ICh0WzRdIHwgMCkgKyAodFs1XSB8IDApIC8gZS5zdWJGcmFtZVJhdGU7XG4gIHJldHVybiAodFsxXSB8IDApICogMzYwMCArICh0WzJdIHwgMCkgKiA2MCArICh0WzNdIHwgMCkgKyByIC8gZS5mcmFtZVJhdGU7XG59XG5mdW5jdGlvbiBxdyhzLCBlKSB7XG4gIGNvbnN0IHQgPSBXcC5leGVjKHMpLCByID0gTnVtYmVyKHRbMV0pO1xuICBzd2l0Y2ggKHRbMl0pIHtcbiAgICBjYXNlIFwiaFwiOlxuICAgICAgcmV0dXJuIHIgKiAzNjAwO1xuICAgIGNhc2UgXCJtXCI6XG4gICAgICByZXR1cm4gciAqIDYwO1xuICAgIGNhc2UgXCJtc1wiOlxuICAgICAgcmV0dXJuIHIgKiAxZTM7XG4gICAgY2FzZSBcImZcIjpcbiAgICAgIHJldHVybiByIC8gZS5mcmFtZVJhdGU7XG4gICAgY2FzZSBcInRcIjpcbiAgICAgIHJldHVybiByIC8gZS50aWNrUmF0ZTtcbiAgfVxuICByZXR1cm4gcjtcbn1cbmNsYXNzIHJvIHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHRoaXMudGltZWxpbmVDb250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmN1ZVJhbmdlcyA9IFtdLCB0aGlzLnRyYWNrTmFtZSA9IHZvaWQgMCwgdGhpcy5zdGFydFRpbWUgPSBudWxsLCB0aGlzLmVuZFRpbWUgPSBudWxsLCB0aGlzLnNjcmVlbiA9IG51bGwsIHRoaXMudGltZWxpbmVDb250cm9sbGVyID0gZSwgdGhpcy50cmFja05hbWUgPSB0O1xuICB9XG4gIGRpc3BhdGNoQ3VlKCkge1xuICAgIHRoaXMuc3RhcnRUaW1lICE9PSBudWxsICYmICh0aGlzLnRpbWVsaW5lQ29udHJvbGxlci5hZGRDdWVzKHRoaXMudHJhY2tOYW1lLCB0aGlzLnN0YXJ0VGltZSwgdGhpcy5lbmRUaW1lLCB0aGlzLnNjcmVlbiwgdGhpcy5jdWVSYW5nZXMpLCB0aGlzLnN0YXJ0VGltZSA9IG51bGwpO1xuICB9XG4gIG5ld0N1ZShlLCB0LCByKSB7XG4gICAgKHRoaXMuc3RhcnRUaW1lID09PSBudWxsIHx8IHRoaXMuc3RhcnRUaW1lID4gZSkgJiYgKHRoaXMuc3RhcnRUaW1lID0gZSksIHRoaXMuZW5kVGltZSA9IHQsIHRoaXMuc2NyZWVuID0gciwgdGhpcy50aW1lbGluZUNvbnRyb2xsZXIuY3JlYXRlQ2FwdGlvbnNUcmFjayh0aGlzLnRyYWNrTmFtZSk7XG4gIH1cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5jdWVSYW5nZXMgPSBbXSwgdGhpcy5zdGFydFRpbWUgPSBudWxsO1xuICB9XG59XG5jbGFzcyBXdyB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMuY29uZmlnID0gdm9pZCAwLCB0aGlzLmVuYWJsZWQgPSAhMCwgdGhpcy5DdWVzID0gdm9pZCAwLCB0aGlzLnRleHRUcmFja3MgPSBbXSwgdGhpcy50cmFja3MgPSBbXSwgdGhpcy5pbml0UFRTID0gW10sIHRoaXMudW5wYXJzZWRWdHRGcmFncyA9IFtdLCB0aGlzLmNhcHRpb25zVHJhY2tzID0ge30sIHRoaXMubm9uTmF0aXZlQ2FwdGlvbnNUcmFja3MgPSB7fSwgdGhpcy5jZWE2MDhQYXJzZXIxID0gdm9pZCAwLCB0aGlzLmNlYTYwOFBhcnNlcjIgPSB2b2lkIDAsIHRoaXMubGFzdENjID0gLTEsIHRoaXMubGFzdFNuID0gLTEsIHRoaXMubGFzdFBhcnRJbmRleCA9IC0xLCB0aGlzLnByZXZDQyA9IC0xLCB0aGlzLnZ0dENDcyA9IGFmKCksIHRoaXMuY2FwdGlvbnNQcm9wZXJ0aWVzID0gdm9pZCAwLCB0aGlzLmhscyA9IGUsIHRoaXMuY29uZmlnID0gZS5jb25maWcsIHRoaXMuQ3VlcyA9IGUuY29uZmlnLmN1ZUhhbmRsZXIsIHRoaXMuY2FwdGlvbnNQcm9wZXJ0aWVzID0ge1xuICAgICAgdGV4dFRyYWNrMToge1xuICAgICAgICBsYWJlbDogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2sxTGFiZWwsXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2sxTGFuZ3VhZ2VDb2RlXG4gICAgICB9LFxuICAgICAgdGV4dFRyYWNrMjoge1xuICAgICAgICBsYWJlbDogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2syTGFiZWwsXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2syTGFuZ3VhZ2VDb2RlXG4gICAgICB9LFxuICAgICAgdGV4dFRyYWNrMzoge1xuICAgICAgICBsYWJlbDogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2szTGFiZWwsXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2szTGFuZ3VhZ2VDb2RlXG4gICAgICB9LFxuICAgICAgdGV4dFRyYWNrNDoge1xuICAgICAgICBsYWJlbDogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2s0TGFiZWwsXG4gICAgICAgIGxhbmd1YWdlQ29kZTogdGhpcy5jb25maWcuY2FwdGlvbnNUZXh0VHJhY2s0TGFuZ3VhZ2VDb2RlXG4gICAgICB9XG4gICAgfSwgZS5vbihJLk1FRElBX0FUVEFDSElORywgdGhpcy5vbk1lZGlhQXR0YWNoaW5nLCB0aGlzKSwgZS5vbihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTUFOSUZFU1RfTE9BREVELCB0aGlzLm9uTWFuaWZlc3RMb2FkZWQsIHRoaXMpLCBlLm9uKEkuU1VCVElUTEVfVFJBQ0tTX1VQREFURUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrc1VwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuRlJBR19MT0FESU5HLCB0aGlzLm9uRnJhZ0xvYWRpbmcsIHRoaXMpLCBlLm9uKEkuRlJBR19MT0FERUQsIHRoaXMub25GcmFnTG9hZGVkLCB0aGlzKSwgZS5vbihJLkZSQUdfUEFSU0lOR19VU0VSREFUQSwgdGhpcy5vbkZyYWdQYXJzaW5nVXNlcmRhdGEsIHRoaXMpLCBlLm9uKEkuRlJBR19ERUNSWVBURUQsIHRoaXMub25GcmFnRGVjcnlwdGVkLCB0aGlzKSwgZS5vbihJLklOSVRfUFRTX0ZPVU5ELCB0aGlzLm9uSW5pdFB0c0ZvdW5kLCB0aGlzKSwgZS5vbihJLlNVQlRJVExFX1RSQUNLU19DTEVBUkVELCB0aGlzLm9uU3VidGl0bGVUcmFja3NDbGVhcmVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSElORywgdGhpcy5vbkJ1ZmZlckZsdXNoaW5nLCB0aGlzKTtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub2ZmKEkuTUVESUFfQVRUQUNISU5HLCB0aGlzLm9uTWVkaWFBdHRhY2hpbmcsIHRoaXMpLCBlLm9mZihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vZmYoSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5NQU5JRkVTVF9MT0FERUQsIHRoaXMub25NYW5pZmVzdExvYWRlZCwgdGhpcyksIGUub2ZmKEkuU1VCVElUTEVfVFJBQ0tTX1VQREFURUQsIHRoaXMub25TdWJ0aXRsZVRyYWNrc1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfTE9BRElORywgdGhpcy5vbkZyYWdMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5GUkFHX0xPQURFRCwgdGhpcy5vbkZyYWdMb2FkZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfUEFSU0lOR19VU0VSREFUQSwgdGhpcy5vbkZyYWdQYXJzaW5nVXNlcmRhdGEsIHRoaXMpLCBlLm9mZihJLkZSQUdfREVDUllQVEVELCB0aGlzLm9uRnJhZ0RlY3J5cHRlZCwgdGhpcyksIGUub2ZmKEkuSU5JVF9QVFNfRk9VTkQsIHRoaXMub25Jbml0UHRzRm91bmQsIHRoaXMpLCBlLm9mZihJLlNVQlRJVExFX1RSQUNLU19DTEVBUkVELCB0aGlzLm9uU3VidGl0bGVUcmFja3NDbGVhcmVkLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfRkxVU0hJTkcsIHRoaXMub25CdWZmZXJGbHVzaGluZywgdGhpcyksIHRoaXMuaGxzID0gdGhpcy5jb25maWcgPSB0aGlzLm1lZGlhID0gbnVsbCwgdGhpcy5jZWE2MDhQYXJzZXIxID0gdGhpcy5jZWE2MDhQYXJzZXIyID0gdm9pZCAwO1xuICB9XG4gIGluaXRDZWE2MDhQYXJzZXJzKCkge1xuICAgIGNvbnN0IGUgPSBuZXcgcm8odGhpcywgXCJ0ZXh0VHJhY2sxXCIpLCB0ID0gbmV3IHJvKHRoaXMsIFwidGV4dFRyYWNrMlwiKSwgciA9IG5ldyBybyh0aGlzLCBcInRleHRUcmFjazNcIiksIG4gPSBuZXcgcm8odGhpcywgXCJ0ZXh0VHJhY2s0XCIpO1xuICAgIHRoaXMuY2VhNjA4UGFyc2VyMSA9IG5ldyB0ZigxLCBlLCB0KSwgdGhpcy5jZWE2MDhQYXJzZXIyID0gbmV3IHRmKDMsIHIsIG4pO1xuICB9XG4gIGFkZEN1ZXMoZSwgdCwgciwgbiwgaSkge1xuICAgIGxldCBvID0gITE7XG4gICAgZm9yIChsZXQgYSA9IGkubGVuZ3RoOyBhLS07ICkge1xuICAgICAgY29uc3QgbCA9IGlbYV0sIGMgPSB6dyhsWzBdLCBsWzFdLCB0LCByKTtcbiAgICAgIGlmIChjID49IDAgJiYgKGxbMF0gPSBNYXRoLm1pbihsWzBdLCB0KSwgbFsxXSA9IE1hdGgubWF4KGxbMV0sIHIpLCBvID0gITAsIGMgLyAociAtIHQpID4gMC41KSlcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobyB8fCBpLnB1c2goW3QsIHJdKSwgdGhpcy5jb25maWcucmVuZGVyVGV4dFRyYWNrc05hdGl2ZWx5KSB7XG4gICAgICBjb25zdCBhID0gdGhpcy5jYXB0aW9uc1RyYWNrc1tlXTtcbiAgICAgIHRoaXMuQ3Vlcy5uZXdDdWUoYSwgdCwgciwgbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLkN1ZXMubmV3Q3VlKG51bGwsIHQsIHIsIG4pO1xuICAgICAgdGhpcy5obHMudHJpZ2dlcihJLkNVRVNfUEFSU0VELCB7XG4gICAgICAgIHR5cGU6IFwiY2FwdGlvbnNcIixcbiAgICAgICAgY3VlczogYSxcbiAgICAgICAgdHJhY2s6IGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICAvLyBUcmlnZ2VyZWQgd2hlbiBhbiBpbml0aWFsIFBUUyBpcyBmb3VuZDsgdXNlZCBmb3Igc3luY2hyb25pc2F0aW9uIG9mIFdlYlZUVC5cbiAgb25Jbml0UHRzRm91bmQoZSwge1xuICAgIGZyYWc6IHQsXG4gICAgaWQ6IHIsXG4gICAgaW5pdFBUUzogbixcbiAgICB0aW1lc2NhbGU6IGksXG4gICAgdHJhY2tJZDogb1xuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgdW5wYXJzZWRWdHRGcmFnczogYVxuICAgIH0gPSB0aGlzO1xuICAgIHIgPT09IHBlLk1BSU4gJiYgKHRoaXMuaW5pdFBUU1t0LmNjXSA9IHtcbiAgICAgIGJhc2VUaW1lOiBuLFxuICAgICAgdGltZXNjYWxlOiBpLFxuICAgICAgdHJhY2tJZDogb1xuICAgIH0pLCBhLmxlbmd0aCAmJiAodGhpcy51bnBhcnNlZFZ0dEZyYWdzID0gW10sIGEuZm9yRWFjaCgobCkgPT4ge1xuICAgICAgdGhpcy5pbml0UFRTW2wuZnJhZy5jY10gPyB0aGlzLm9uRnJhZ0xvYWRlZChJLkZSQUdfTE9BREVELCBsKSA6IHRoaXMuaGxzLnRyaWdnZXIoSS5TVUJUSVRMRV9GUkFHX1BST0NFU1NFRCwge1xuICAgICAgICBzdWNjZXNzOiAhMSxcbiAgICAgICAgZnJhZzogbC5mcmFnLFxuICAgICAgICBlcnJvcjogbmV3IEVycm9yKFwiU3VidGl0bGUgZGlzY29udGludWl0eSBkb21haW4gZG9lcyBub3QgbWF0Y2ggbWFpblwiKVxuICAgICAgfSk7XG4gICAgfSkpO1xuICB9XG4gIGdldEV4aXN0aW5nVHJhY2soZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiByXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKHIpXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHIudGV4dFRyYWNrcy5sZW5ndGg7IG4rKykge1xuICAgICAgICBjb25zdCBpID0gci50ZXh0VHJhY2tzW25dO1xuICAgICAgICBpZiAob2YoaSwge1xuICAgICAgICAgIG5hbWU6IGUsXG4gICAgICAgICAgbGFuZzogdCxcbiAgICAgICAgICBjaGFyYWN0ZXJpc3RpY3M6IFwidHJhbnNjcmliZXMtc3Bva2VuLWRpYWxvZyxkZXNjcmliZXMtbXVzaWMtYW5kLXNvdW5kXCJcbiAgICAgICAgfSkpXG4gICAgICAgICAgcmV0dXJuIGk7XG4gICAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY3JlYXRlQ2FwdGlvbnNUcmFjayhlKSB7XG4gICAgdGhpcy5jb25maWcucmVuZGVyVGV4dFRyYWNrc05hdGl2ZWx5ID8gdGhpcy5jcmVhdGVOYXRpdmVUcmFjayhlKSA6IHRoaXMuY3JlYXRlTm9uTmF0aXZlVHJhY2soZSk7XG4gIH1cbiAgY3JlYXRlTmF0aXZlVHJhY2soZSkge1xuICAgIGlmICh0aGlzLmNhcHRpb25zVHJhY2tzW2VdKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhcHRpb25zUHJvcGVydGllczogdCxcbiAgICAgIGNhcHRpb25zVHJhY2tzOiByLFxuICAgICAgbWVkaWE6IG5cbiAgICB9ID0gdGhpcywge1xuICAgICAgbGFiZWw6IGksXG4gICAgICBsYW5ndWFnZUNvZGU6IG9cbiAgICB9ID0gdFtlXSwgYSA9IHRoaXMuZ2V0RXhpc3RpbmdUcmFjayhpLCBvKTtcbiAgICBpZiAoYSlcbiAgICAgIHJbZV0gPSBhLCBTbihyW2VdKSwgTnAocltlXSwgbik7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBsID0gdGhpcy5jcmVhdGVUZXh0VHJhY2soXCJjYXB0aW9uc1wiLCBpLCBvKTtcbiAgICAgIGwgJiYgKGxbZV0gPSAhMCwgcltlXSA9IGwpO1xuICAgIH1cbiAgfVxuICBjcmVhdGVOb25OYXRpdmVUcmFjayhlKSB7XG4gICAgaWYgKHRoaXMubm9uTmF0aXZlQ2FwdGlvbnNUcmFja3NbZV0pXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdCA9IHRoaXMuY2FwdGlvbnNQcm9wZXJ0aWVzW2VdO1xuICAgIGlmICghdClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByID0gdC5sYWJlbCwgbiA9IHtcbiAgICAgIF9pZDogZSxcbiAgICAgIGxhYmVsOiByLFxuICAgICAga2luZDogXCJjYXB0aW9uc1wiLFxuICAgICAgZGVmYXVsdDogdC5tZWRpYSA/ICEhdC5tZWRpYS5kZWZhdWx0IDogITEsXG4gICAgICBjbG9zZWRDYXB0aW9uczogdC5tZWRpYVxuICAgIH07XG4gICAgdGhpcy5ub25OYXRpdmVDYXB0aW9uc1RyYWNrc1tlXSA9IG4sIHRoaXMuaGxzLnRyaWdnZXIoSS5OT05fTkFUSVZFX1RFWFRfVFJBQ0tTX0ZPVU5ELCB7XG4gICAgICB0cmFja3M6IFtuXVxuICAgIH0pO1xuICB9XG4gIGNyZWF0ZVRleHRUcmFjayhlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IHRoaXMubWVkaWE7XG4gICAgaWYgKG4pXG4gICAgICByZXR1cm4gbi5hZGRUZXh0VHJhY2soZSwgdCwgcik7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGluZyhlLCB0KSB7XG4gICAgdGhpcy5tZWRpYSA9IHQubWVkaWEsIHQubWVkaWFTb3VyY2UgfHwgdGhpcy5fY2xlYW5UcmFja3MoKTtcbiAgfVxuICBvbk1lZGlhRGV0YWNoaW5nKGUsIHQpIHtcbiAgICBjb25zdCByID0gISF0LnRyYW5zZmVyTWVkaWE7XG4gICAgaWYgKHRoaXMubWVkaWEgPSBudWxsLCByKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIGNhcHRpb25zVHJhY2tzOiBuXG4gICAgfSA9IHRoaXM7XG4gICAgT2JqZWN0LmtleXMobikuZm9yRWFjaCgoaSkgPT4ge1xuICAgICAgU24obltpXSksIGRlbGV0ZSBuW2ldO1xuICAgIH0pLCB0aGlzLm5vbk5hdGl2ZUNhcHRpb25zVHJhY2tzID0ge307XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5sYXN0Q2MgPSAtMSwgdGhpcy5sYXN0U24gPSAtMSwgdGhpcy5sYXN0UGFydEluZGV4ID0gLTEsIHRoaXMucHJldkNDID0gLTEsIHRoaXMudnR0Q0NzID0gYWYoKSwgdGhpcy5fY2xlYW5UcmFja3MoKSwgdGhpcy50cmFja3MgPSBbXSwgdGhpcy5jYXB0aW9uc1RyYWNrcyA9IHt9LCB0aGlzLm5vbk5hdGl2ZUNhcHRpb25zVHJhY2tzID0ge30sIHRoaXMudGV4dFRyYWNrcyA9IFtdLCB0aGlzLnVucGFyc2VkVnR0RnJhZ3MgPSBbXSwgdGhpcy5pbml0UFRTID0gW10sIHRoaXMuY2VhNjA4UGFyc2VyMSAmJiB0aGlzLmNlYTYwOFBhcnNlcjIgJiYgKHRoaXMuY2VhNjA4UGFyc2VyMS5yZXNldCgpLCB0aGlzLmNlYTYwOFBhcnNlcjIucmVzZXQoKSk7XG4gIH1cbiAgX2NsZWFuVHJhY2tzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCFlKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHQgPSBlLnRleHRUcmFja3M7XG4gICAgaWYgKHQpXG4gICAgICBmb3IgKGxldCByID0gMDsgciA8IHQubGVuZ3RoOyByKyspXG4gICAgICAgIFNuKHRbcl0pO1xuICB9XG4gIG9uU3VidGl0bGVUcmFja3NVcGRhdGVkKGUsIHQpIHtcbiAgICBjb25zdCByID0gdC5zdWJ0aXRsZVRyYWNrcyB8fCBbXSwgbiA9IHIuc29tZSgoaSkgPT4gaS50ZXh0Q29kZWMgPT09IElsKTtcbiAgICBpZiAodGhpcy5jb25maWcuZW5hYmxlV2ViVlRUIHx8IG4gJiYgdGhpcy5jb25maWcuZW5hYmxlSU1TQzEpIHtcbiAgICAgIGlmIChBcCh0aGlzLnRyYWNrcywgcikpIHtcbiAgICAgICAgdGhpcy50cmFja3MgPSByO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy50ZXh0VHJhY2tzID0gW10sIHRoaXMudHJhY2tzID0gciwgdGhpcy5jb25maWcucmVuZGVyVGV4dFRyYWNrc05hdGl2ZWx5KSB7XG4gICAgICAgIGNvbnN0IG8gPSB0aGlzLm1lZGlhLCBhID0gbyA/IEVvKG8udGV4dFRyYWNrcykgOiBudWxsO1xuICAgICAgICBpZiAodGhpcy50cmFja3MuZm9yRWFjaCgobCwgYykgPT4ge1xuICAgICAgICAgIGxldCB1O1xuICAgICAgICAgIGlmIChhKSB7XG4gICAgICAgICAgICBsZXQgZCA9IG51bGw7XG4gICAgICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGEubGVuZ3RoOyBoKyspXG4gICAgICAgICAgICAgIGlmIChhW2hdICYmIG9mKGFbaF0sIGwpKSB7XG4gICAgICAgICAgICAgICAgZCA9IGFbaF0sIGFbaF0gPSBudWxsO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBkICYmICh1ID0gZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh1KVxuICAgICAgICAgICAgU24odSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkID0gWXAobCk7XG4gICAgICAgICAgICB1ID0gdGhpcy5jcmVhdGVUZXh0VHJhY2soZCwgbC5uYW1lLCBsLmxhbmcpLCB1ICYmICh1Lm1vZGUgPSBcImRpc2FibGVkXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1ICYmIHRoaXMudGV4dFRyYWNrcy5wdXNoKHUpO1xuICAgICAgICB9KSwgYSAhPSBudWxsICYmIGEubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgbCA9IGEuZmlsdGVyKChjKSA9PiBjICE9PSBudWxsKS5tYXAoKGMpID0+IGMubGFiZWwpO1xuICAgICAgICAgIGwubGVuZ3RoICYmIHRoaXMuaGxzLmxvZ2dlci53YXJuKGBNZWRpYSBlbGVtZW50IGNvbnRhaW5zIHVudXNlZCBzdWJ0aXRsZSB0cmFja3M6ICR7bC5qb2luKFwiLCBcIil9LiBSZXBsYWNlIG1lZGlhIGVsZW1lbnQgZm9yIGVhY2ggc291cmNlIHRvIGNsZWFyIFRleHRUcmFja3MgYW5kIGNhcHRpb25zIG1lbnUuYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy50cmFja3MubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG8gPSB0aGlzLnRyYWNrcy5tYXAoKGEpID0+ICh7XG4gICAgICAgICAgbGFiZWw6IGEubmFtZSxcbiAgICAgICAgICBraW5kOiBhLnR5cGUudG9Mb3dlckNhc2UoKSxcbiAgICAgICAgICBkZWZhdWx0OiBhLmRlZmF1bHQsXG4gICAgICAgICAgc3VidGl0bGVUcmFjazogYVxuICAgICAgICB9KSk7XG4gICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5OT05fTkFUSVZFX1RFWFRfVFJBQ0tTX0ZPVU5ELCB7XG4gICAgICAgICAgdHJhY2tzOiBvXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBvbk1hbmlmZXN0TG9hZGVkKGUsIHQpIHtcbiAgICB0aGlzLmNvbmZpZy5lbmFibGVDRUE3MDhDYXB0aW9ucyAmJiB0LmNhcHRpb25zICYmIHQuY2FwdGlvbnMuZm9yRWFjaCgocikgPT4ge1xuICAgICAgY29uc3QgbiA9IC8oPzpDQ3xTRVJWSUNFKShbMS00XSkvLmV4ZWMoci5pbnN0cmVhbUlkKTtcbiAgICAgIGlmICghbilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgaSA9IGB0ZXh0VHJhY2ske25bMV19YCwgbyA9IHRoaXMuY2FwdGlvbnNQcm9wZXJ0aWVzW2ldO1xuICAgICAgbyAmJiAoby5sYWJlbCA9IHIubmFtZSwgci5sYW5nICYmIChvLmxhbmd1YWdlQ29kZSA9IHIubGFuZyksIG8ubWVkaWEgPSByKTtcbiAgICB9KTtcbiAgfVxuICBjbG9zZWRDYXB0aW9uc0ZvckxldmVsKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5obHMubGV2ZWxzW2UubGV2ZWxdO1xuICAgIHJldHVybiB0ID09IG51bGwgPyB2b2lkIDAgOiB0LmF0dHJzW1wiQ0xPU0VELUNBUFRJT05TXCJdO1xuICB9XG4gIG9uRnJhZ0xvYWRpbmcoZSwgdCkge1xuICAgIGlmICh0aGlzLmVuYWJsZWQgJiYgdC5mcmFnLnR5cGUgPT09IHBlLk1BSU4pIHtcbiAgICAgIHZhciByLCBuO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjZWE2MDhQYXJzZXIxOiBpLFxuICAgICAgICBjZWE2MDhQYXJzZXIyOiBvLFxuICAgICAgICBsYXN0U246IGFcbiAgICAgIH0gPSB0aGlzLCB7XG4gICAgICAgIGNjOiBsLFxuICAgICAgICBzbjogY1xuICAgICAgfSA9IHQuZnJhZywgdSA9IChyID0gKG4gPSB0LnBhcnQpID09IG51bGwgPyB2b2lkIDAgOiBuLmluZGV4KSAhPSBudWxsID8gciA6IC0xO1xuICAgICAgaSAmJiBvICYmIChjICE9PSBhICsgMSB8fCBjID09PSBhICYmIHUgIT09IHRoaXMubGFzdFBhcnRJbmRleCArIDEgfHwgbCAhPT0gdGhpcy5sYXN0Q2MpICYmIChpLnJlc2V0KCksIG8ucmVzZXQoKSksIHRoaXMubGFzdENjID0gbCwgdGhpcy5sYXN0U24gPSBjLCB0aGlzLmxhc3RQYXJ0SW5kZXggPSB1O1xuICAgIH1cbiAgfVxuICBvbkZyYWdMb2FkZWQoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IHIsXG4gICAgICBwYXlsb2FkOiBuXG4gICAgfSA9IHQ7XG4gICAgaWYgKHIudHlwZSA9PT0gcGUuU1VCVElUTEUpXG4gICAgICBpZiAobi5ieXRlTGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGkgPSByLmRlY3J5cHRkYXRhLCBvID0gXCJzdGF0c1wiIGluIHQ7XG4gICAgICAgIGlmIChpID09IG51bGwgfHwgIWkuZW5jcnlwdGVkIHx8IG8pIHtcbiAgICAgICAgICBjb25zdCBhID0gdGhpcy50cmFja3Nbci5sZXZlbF0sIGwgPSB0aGlzLnZ0dENDcztcbiAgICAgICAgICBsW3IuY2NdIHx8IChsW3IuY2NdID0ge1xuICAgICAgICAgICAgc3RhcnQ6IHIuc3RhcnQsXG4gICAgICAgICAgICBwcmV2Q0M6IHRoaXMucHJldkNDLFxuICAgICAgICAgICAgbmV3OiAhMFxuICAgICAgICAgIH0sIHRoaXMucHJldkNDID0gci5jYyksIGEgJiYgYS50ZXh0Q29kZWMgPT09IElsID8gdGhpcy5fcGFyc2VJTVNDMShyLCBuKSA6IHRoaXMuX3BhcnNlVlRUcyh0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlXG4gICAgICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5TVUJUSVRMRV9GUkFHX1BST0NFU1NFRCwge1xuICAgICAgICAgIHN1Y2Nlc3M6ICExLFxuICAgICAgICAgIGZyYWc6IHIsXG4gICAgICAgICAgZXJyb3I6IG5ldyBFcnJvcihcIkVtcHR5IHN1YnRpdGxlIHBheWxvYWRcIilcbiAgICAgICAgfSk7XG4gIH1cbiAgX3BhcnNlSU1TQzEoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmhscztcbiAgICByZih0LCB0aGlzLmluaXRQVFNbZS5jY10sIChuKSA9PiB7XG4gICAgICB0aGlzLl9hcHBlbmRDdWVzKG4sIGUubGV2ZWwpLCByLnRyaWdnZXIoSS5TVUJUSVRMRV9GUkFHX1BST0NFU1NFRCwge1xuICAgICAgICBzdWNjZXNzOiAhMCxcbiAgICAgICAgZnJhZzogZVxuICAgICAgfSk7XG4gICAgfSwgKG4pID0+IHtcbiAgICAgIHIubG9nZ2VyLmxvZyhgRmFpbGVkIHRvIHBhcnNlIElNU0MxOiAke259YCksIHIudHJpZ2dlcihJLlNVQlRJVExFX0ZSQUdfUFJPQ0VTU0VELCB7XG4gICAgICAgIHN1Y2Nlc3M6ICExLFxuICAgICAgICBmcmFnOiBlLFxuICAgICAgICBlcnJvcjogblxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgX3BhcnNlVlRUcyhlKSB7XG4gICAgdmFyIHQ7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZzogcixcbiAgICAgIHBheWxvYWQ6IG5cbiAgICB9ID0gZSwge1xuICAgICAgaW5pdFBUUzogaSxcbiAgICAgIHVucGFyc2VkVnR0RnJhZ3M6IG9cbiAgICB9ID0gdGhpcywgYSA9IGkubGVuZ3RoIC0gMTtcbiAgICBpZiAoIWlbci5jY10gJiYgYSA9PT0gLTEpIHtcbiAgICAgIG8ucHVzaChlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbCA9IHRoaXMuaGxzLCBjID0gKHQgPSByLmluaXRTZWdtZW50KSAhPSBudWxsICYmIHQuZGF0YSA/IF9yKHIuaW5pdFNlZ21lbnQuZGF0YSwgbmV3IFVpbnQ4QXJyYXkobikpLmJ1ZmZlciA6IG47XG4gICAgR3coYywgdGhpcy5pbml0UFRTW3IuY2NdLCB0aGlzLnZ0dENDcywgci5jYywgci5zdGFydCwgKHUpID0+IHtcbiAgICAgIHRoaXMuX2FwcGVuZEN1ZXModSwgci5sZXZlbCksIGwudHJpZ2dlcihJLlNVQlRJVExFX0ZSQUdfUFJPQ0VTU0VELCB7XG4gICAgICAgIHN1Y2Nlc3M6ICEwLFxuICAgICAgICBmcmFnOiByXG4gICAgICB9KTtcbiAgICB9LCAodSkgPT4ge1xuICAgICAgY29uc3QgZCA9IHUubWVzc2FnZSA9PT0gXCJNaXNzaW5nIGluaXRQVFMgZm9yIFZUVCBNUEVHVFNcIjtcbiAgICAgIGQgPyBvLnB1c2goZSkgOiB0aGlzLl9mYWxsYmFja1RvSU1TQzEociwgbiksIGwubG9nZ2VyLmxvZyhgRmFpbGVkIHRvIHBhcnNlIFZUVCBjdWU6ICR7dX1gKSwgIShkICYmIGEgPiByLmNjKSAmJiBsLnRyaWdnZXIoSS5TVUJUSVRMRV9GUkFHX1BST0NFU1NFRCwge1xuICAgICAgICBzdWNjZXNzOiAhMSxcbiAgICAgICAgZnJhZzogcixcbiAgICAgICAgZXJyb3I6IHVcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIF9mYWxsYmFja1RvSU1TQzEoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLnRyYWNrc1tlLmxldmVsXTtcbiAgICByLnRleHRDb2RlYyB8fCByZih0LCB0aGlzLmluaXRQVFNbZS5jY10sICgpID0+IHtcbiAgICAgIHIudGV4dENvZGVjID0gSWwsIHRoaXMuX3BhcnNlSU1TQzEoZSwgdCk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgci50ZXh0Q29kZWMgPSBcInd2dHRcIjtcbiAgICB9KTtcbiAgfVxuICBfYXBwZW5kQ3VlcyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzO1xuICAgIGlmICh0aGlzLmNvbmZpZy5yZW5kZXJUZXh0VHJhY2tzTmF0aXZlbHkpIHtcbiAgICAgIGNvbnN0IG4gPSB0aGlzLnRleHRUcmFja3NbdF07XG4gICAgICBpZiAoIW4gfHwgbi5tb2RlID09PSBcImRpc2FibGVkXCIpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGUuZm9yRWFjaCgoaSkgPT4gVXAobiwgaSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuID0gdGhpcy50cmFja3NbdF07XG4gICAgICBpZiAoIW4pXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGkgPSBuLmRlZmF1bHQgPyBcImRlZmF1bHRcIiA6IFwic3VidGl0bGVzXCIgKyB0O1xuICAgICAgci50cmlnZ2VyKEkuQ1VFU19QQVJTRUQsIHtcbiAgICAgICAgdHlwZTogXCJzdWJ0aXRsZXNcIixcbiAgICAgICAgY3VlczogZSxcbiAgICAgICAgdHJhY2s6IGlcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBvbkZyYWdEZWNyeXB0ZWQoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IHJcbiAgICB9ID0gdDtcbiAgICByLnR5cGUgPT09IHBlLlNVQlRJVExFICYmIHRoaXMub25GcmFnTG9hZGVkKEkuRlJBR19MT0FERUQsIHQpO1xuICB9XG4gIG9uU3VidGl0bGVUcmFja3NDbGVhcmVkKCkge1xuICAgIHRoaXMudHJhY2tzID0gW10sIHRoaXMuY2FwdGlvbnNUcmFja3MgPSB7fTtcbiAgfVxuICBvbkZyYWdQYXJzaW5nVXNlcmRhdGEoZSwgdCkge1xuICAgIGlmICghdGhpcy5lbmFibGVkIHx8ICF0aGlzLmNvbmZpZy5lbmFibGVDRUE3MDhDYXB0aW9ucylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnOiByLFxuICAgICAgc2FtcGxlczogblxuICAgIH0gPSB0O1xuICAgIGlmICghKHIudHlwZSA9PT0gcGUuTUFJTiAmJiB0aGlzLmNsb3NlZENhcHRpb25zRm9yTGV2ZWwocikgPT09IFwiTk9ORVwiKSlcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbi5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBvID0gbltpXS5ieXRlcztcbiAgICAgICAgaWYgKG8pIHtcbiAgICAgICAgICB0aGlzLmNlYTYwOFBhcnNlcjEgfHwgdGhpcy5pbml0Q2VhNjA4UGFyc2VycygpO1xuICAgICAgICAgIGNvbnN0IGEgPSB0aGlzLmV4dHJhY3RDZWE2MDhEYXRhKG8pO1xuICAgICAgICAgIHRoaXMuY2VhNjA4UGFyc2VyMS5hZGREYXRhKG5baV0ucHRzLCBhWzBdKSwgdGhpcy5jZWE2MDhQYXJzZXIyLmFkZERhdGEobltpXS5wdHMsIGFbMV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gIH1cbiAgb25CdWZmZXJGbHVzaGluZyhlLCB7XG4gICAgc3RhcnRPZmZzZXQ6IHQsXG4gICAgZW5kT2Zmc2V0OiByLFxuICAgIGVuZE9mZnNldFN1YnRpdGxlczogbixcbiAgICB0eXBlOiBpXG4gIH0pIHtcbiAgICBjb25zdCB7XG4gICAgICBtZWRpYTogb1xuICAgIH0gPSB0aGlzO1xuICAgIGlmICghKCFvIHx8IG8uY3VycmVudFRpbWUgPCByKSkge1xuICAgICAgaWYgKCFpIHx8IGkgPT09IFwidmlkZW9cIikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgY2FwdGlvbnNUcmFja3M6IGFcbiAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgIE9iamVjdC5rZXlzKGEpLmZvckVhY2goKGwpID0+IFNjKGFbbF0sIHQsIHIpKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbmZpZy5yZW5kZXJUZXh0VHJhY2tzTmF0aXZlbHkgJiYgdCA9PT0gMCAmJiBuICE9PSB2b2lkIDApIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHRleHRUcmFja3M6IGFcbiAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgIE9iamVjdC5rZXlzKGEpLmZvckVhY2goKGwpID0+IFNjKGFbbF0sIHQsIG4pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZXh0cmFjdENlYTYwOERhdGEoZSkge1xuICAgIGNvbnN0IHQgPSBbW10sIFtdXSwgciA9IGVbMF0gJiAzMTtcbiAgICBsZXQgbiA9IDI7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByOyBpKyspIHtcbiAgICAgIGNvbnN0IG8gPSBlW24rK10sIGEgPSAxMjcgJiBlW24rK10sIGwgPSAxMjcgJiBlW24rK107XG4gICAgICBpZiAoYSA9PT0gMCAmJiBsID09PSAwKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIGlmICgoNCAmIG8pICE9PSAwKSB7XG4gICAgICAgIGNvbnN0IHUgPSAzICYgbztcbiAgICAgICAgKHUgPT09IDAgfHwgdSA9PT0gMSkgJiYgKHRbdV0ucHVzaChhKSwgdFt1XS5wdXNoKGwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHQ7XG4gIH1cbn1cbmZ1bmN0aW9uIFlwKHMpIHtcbiAgcmV0dXJuIHMuY2hhcmFjdGVyaXN0aWNzICYmIC90cmFuc2NyaWJlcy1zcG9rZW4tZGlhbG9nL2dpLnRlc3Qocy5jaGFyYWN0ZXJpc3RpY3MpICYmIC9kZXNjcmliZXMtbXVzaWMtYW5kLXNvdW5kL2dpLnRlc3Qocy5jaGFyYWN0ZXJpc3RpY3MpID8gXCJjYXB0aW9uc1wiIDogXCJzdWJ0aXRsZXNcIjtcbn1cbmZ1bmN0aW9uIG9mKHMsIGUpIHtcbiAgcmV0dXJuICEhcyAmJiBzLmtpbmQgPT09IFlwKGUpICYmIHljKGUsIHMpO1xufVxuZnVuY3Rpb24gencocywgZSwgdCwgcikge1xuICByZXR1cm4gTWF0aC5taW4oZSwgcikgLSBNYXRoLm1heChzLCB0KTtcbn1cbmZ1bmN0aW9uIGFmKCkge1xuICByZXR1cm4ge1xuICAgIGNjT2Zmc2V0OiAwLFxuICAgIHByZXNlbnRhdGlvbk9mZnNldDogMCxcbiAgICAwOiB7XG4gICAgICBzdGFydDogMCxcbiAgICAgIHByZXZDQzogLTEsXG4gICAgICBuZXc6ICEwXG4gICAgfVxuICB9O1xufVxuY29uc3QgWXcgPSAvXFxzLywgWncgPSB7XG4gIG5ld0N1ZShzLCBlLCB0LCByKSB7XG4gICAgY29uc3QgbiA9IFtdO1xuICAgIGxldCBpLCBvLCBhLCBsLCBjO1xuICAgIGNvbnN0IHUgPSBzZWxmLlZUVEN1ZSB8fCBzZWxmLlRleHRUcmFja0N1ZTtcbiAgICBmb3IgKGxldCBoID0gMDsgaCA8IHIucm93cy5sZW5ndGg7IGgrKylcbiAgICAgIGlmIChpID0gci5yb3dzW2hdLCBhID0gITAsIGwgPSAwLCBjID0gXCJcIiwgIWkuaXNFbXB0eSgpKSB7XG4gICAgICAgIHZhciBkO1xuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGkuY2hhcnMubGVuZ3RoOyB5KyspXG4gICAgICAgICAgWXcudGVzdChpLmNoYXJzW3ldLnVjaGFyKSAmJiBhID8gbCsrIDogKGMgKz0gaS5jaGFyc1t5XS51Y2hhciwgYSA9ICExKTtcbiAgICAgICAgaS5jdWVTdGFydFRpbWUgPSBlLCBlID09PSB0ICYmICh0ICs9IDFlLTQpLCBsID49IDE2ID8gbC0tIDogbCsrO1xuICAgICAgICBjb25zdCBmID0gSHAoYy50cmltKCkpLCBwID0gQnUoZSwgdCwgZik7XG4gICAgICAgIHMgIT0gbnVsbCAmJiAoZCA9IHMuY3VlcykgIT0gbnVsbCAmJiBkLmdldEN1ZUJ5SWQocCkgfHwgKG8gPSBuZXcgdShlLCB0LCBmKSwgby5pZCA9IHAsIG8ubGluZSA9IGggKyAxLCBvLmFsaWduID0gXCJsZWZ0XCIsIG8ucG9zaXRpb24gPSAxMCArIE1hdGgubWluKDgwLCBNYXRoLmZsb29yKGwgKiA4IC8gMzIpICogMTApLCBuLnB1c2gobykpO1xuICAgICAgfVxuICAgIHJldHVybiBzICYmIG4ubGVuZ3RoICYmIChuLnNvcnQoKGgsIGYpID0+IGgubGluZSA9PT0gXCJhdXRvXCIgfHwgZi5saW5lID09PSBcImF1dG9cIiA/IDAgOiBoLmxpbmUgPiA4ICYmIGYubGluZSA+IDggPyBmLmxpbmUgLSBoLmxpbmUgOiBoLmxpbmUgLSBmLmxpbmUpLCBuLmZvckVhY2goKGgpID0+IFVwKHMsIGgpKSksIG47XG4gIH1cbn07XG5mdW5jdGlvbiBYdygpIHtcbiAgaWYgKFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBzZWxmLmZldGNoICYmIHNlbGYuQWJvcnRDb250cm9sbGVyICYmIHNlbGYuUmVhZGFibGVTdHJlYW0gJiYgc2VsZi5SZXF1ZXN0XG4gIClcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBzZWxmLlJlYWRhYmxlU3RyZWFtKHt9KSwgITA7XG4gICAgfSBjYXRjaCB7XG4gICAgfVxuICByZXR1cm4gITE7XG59XG5jb25zdCBKdyA9IC8oXFxkKyktKFxcZCspXFwvKFxcZCspLztcbmNsYXNzIGxmIHtcbiAgY29uc3RydWN0b3IoZSkge1xuICAgIHRoaXMuZmV0Y2hTZXR1cCA9IHZvaWQgMCwgdGhpcy5yZXF1ZXN0VGltZW91dCA9IHZvaWQgMCwgdGhpcy5yZXF1ZXN0ID0gbnVsbCwgdGhpcy5yZXNwb25zZSA9IG51bGwsIHRoaXMuY29udHJvbGxlciA9IHZvaWQgMCwgdGhpcy5jb250ZXh0ID0gbnVsbCwgdGhpcy5jb25maWcgPSBudWxsLCB0aGlzLmNhbGxiYWNrcyA9IG51bGwsIHRoaXMuc3RhdHMgPSB2b2lkIDAsIHRoaXMubG9hZGVyID0gbnVsbCwgdGhpcy5mZXRjaFNldHVwID0gZS5mZXRjaFNldHVwIHx8IHJBLCB0aGlzLmNvbnRyb2xsZXIgPSBuZXcgc2VsZi5BYm9ydENvbnRyb2xsZXIoKSwgdGhpcy5zdGF0cyA9IG5ldyBmdSgpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5sb2FkZXIgPSB0aGlzLmNhbGxiYWNrcyA9IHRoaXMuY29udGV4dCA9IHRoaXMuY29uZmlnID0gdGhpcy5yZXF1ZXN0ID0gbnVsbCwgdGhpcy5hYm9ydEludGVybmFsKCksIHRoaXMucmVzcG9uc2UgPSBudWxsLCB0aGlzLmZldGNoU2V0dXAgPSB0aGlzLmNvbnRyb2xsZXIgPSB0aGlzLnN0YXRzID0gbnVsbDtcbiAgfVxuICBhYm9ydEludGVybmFsKCkge1xuICAgIHRoaXMuY29udHJvbGxlciAmJiAhdGhpcy5zdGF0cy5sb2FkaW5nLmVuZCAmJiAodGhpcy5zdGF0cy5hYm9ydGVkID0gITAsIHRoaXMuY29udHJvbGxlci5hYm9ydCgpKTtcbiAgfVxuICBhYm9ydCgpIHtcbiAgICB2YXIgZTtcbiAgICB0aGlzLmFib3J0SW50ZXJuYWwoKSwgKGUgPSB0aGlzLmNhbGxiYWNrcykgIT0gbnVsbCAmJiBlLm9uQWJvcnQgJiYgdGhpcy5jYWxsYmFja3Mub25BYm9ydCh0aGlzLnN0YXRzLCB0aGlzLmNvbnRleHQsIHRoaXMucmVzcG9uc2UpO1xuICB9XG4gIGxvYWQoZSwgdCwgcikge1xuICAgIGNvbnN0IG4gPSB0aGlzLnN0YXRzO1xuICAgIGlmIChuLmxvYWRpbmcuc3RhcnQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkZXIgY2FuIG9ubHkgYmUgdXNlZCBvbmNlLlwiKTtcbiAgICBuLmxvYWRpbmcuc3RhcnQgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGNvbnN0IGkgPSBRdyhlLCB0aGlzLmNvbnRyb2xsZXIuc2lnbmFsKSwgbyA9IGUucmVzcG9uc2VUeXBlID09PSBcImFycmF5YnVmZmVyXCIsIGEgPSBvID8gXCJieXRlTGVuZ3RoXCIgOiBcImxlbmd0aFwiLCB7XG4gICAgICBtYXhUaW1lVG9GaXJzdEJ5dGVNczogbCxcbiAgICAgIG1heExvYWRUaW1lTXM6IGNcbiAgICB9ID0gdC5sb2FkUG9saWN5O1xuICAgIHRoaXMuY29udGV4dCA9IGUsIHRoaXMuY29uZmlnID0gdCwgdGhpcy5jYWxsYmFja3MgPSByLCB0aGlzLnJlcXVlc3QgPSB0aGlzLmZldGNoU2V0dXAoZSwgaSksIHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCB0LnRpbWVvdXQgPSBsICYmIHVlKGwpID8gbCA6IGMsIHRoaXMucmVxdWVzdFRpbWVvdXQgPSBzZWxmLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5jYWxsYmFja3MgJiYgKHRoaXMuYWJvcnRJbnRlcm5hbCgpLCB0aGlzLmNhbGxiYWNrcy5vblRpbWVvdXQobiwgZSwgdGhpcy5yZXNwb25zZSkpO1xuICAgIH0sIHQudGltZW91dCksICh4aSh0aGlzLnJlcXVlc3QpID8gdGhpcy5yZXF1ZXN0LnRoZW4oc2VsZi5mZXRjaCkgOiBzZWxmLmZldGNoKHRoaXMucmVxdWVzdCkpLnRoZW4oKGQpID0+IHtcbiAgICAgIHZhciBoO1xuICAgICAgdGhpcy5yZXNwb25zZSA9IHRoaXMubG9hZGVyID0gZDtcbiAgICAgIGNvbnN0IGYgPSBNYXRoLm1heChzZWxmLnBlcmZvcm1hbmNlLm5vdygpLCBuLmxvYWRpbmcuc3RhcnQpO1xuICAgICAgaWYgKHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCB0LnRpbWVvdXQgPSBjLCB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gc2VsZi5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5jYWxsYmFja3MgJiYgKHRoaXMuYWJvcnRJbnRlcm5hbCgpLCB0aGlzLmNhbGxiYWNrcy5vblRpbWVvdXQobiwgZSwgdGhpcy5yZXNwb25zZSkpO1xuICAgICAgfSwgYyAtIChmIC0gbi5sb2FkaW5nLnN0YXJ0KSksICFkLm9rKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBzdGF0dXM6IHksXG4gICAgICAgICAgc3RhdHVzVGV4dDogRVxuICAgICAgICB9ID0gZDtcbiAgICAgICAgdGhyb3cgbmV3IHNBKEUgfHwgXCJmZXRjaCwgYmFkIG5ldHdvcmsgcmVzcG9uc2VcIiwgeSwgZCk7XG4gICAgICB9XG4gICAgICBuLmxvYWRpbmcuZmlyc3QgPSBmLCBuLnRvdGFsID0gdEEoZC5oZWFkZXJzKSB8fCBuLnRvdGFsO1xuICAgICAgY29uc3QgcCA9IChoID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgPyB2b2lkIDAgOiBoLm9uUHJvZ3Jlc3M7XG4gICAgICByZXR1cm4gcCAmJiB1ZSh0LmhpZ2hXYXRlck1hcmspID8gdGhpcy5sb2FkUHJvZ3Jlc3NpdmVseShkLCBuLCBlLCB0LmhpZ2hXYXRlck1hcmssIHApIDogbyA/IGQuYXJyYXlCdWZmZXIoKSA6IGUucmVzcG9uc2VUeXBlID09PSBcImpzb25cIiA/IGQuanNvbigpIDogZC50ZXh0KCk7XG4gICAgfSkudGhlbigoZCkgPT4ge1xuICAgICAgdmFyIGgsIGY7XG4gICAgICBjb25zdCBwID0gdGhpcy5yZXNwb25zZTtcbiAgICAgIGlmICghcClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibG9hZGVyIGRlc3Ryb3llZFwiKTtcbiAgICAgIHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCBuLmxvYWRpbmcuZW5kID0gTWF0aC5tYXgoc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgbi5sb2FkaW5nLmZpcnN0KTtcbiAgICAgIGNvbnN0IHkgPSBkW2FdO1xuICAgICAgeSAmJiAobi5sb2FkZWQgPSBuLnRvdGFsID0geSk7XG4gICAgICBjb25zdCBFID0ge1xuICAgICAgICB1cmw6IHAudXJsLFxuICAgICAgICBkYXRhOiBkLFxuICAgICAgICBjb2RlOiBwLnN0YXR1c1xuICAgICAgfSwgYiA9IChoID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgPyB2b2lkIDAgOiBoLm9uUHJvZ3Jlc3M7XG4gICAgICBiICYmICF1ZSh0LmhpZ2hXYXRlck1hcmspICYmIGIobiwgZSwgZCwgcCksIChmID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgfHwgZi5vblN1Y2Nlc3MoRSwgbiwgZSwgcCk7XG4gICAgfSkuY2F0Y2goKGQpID0+IHtcbiAgICAgIHZhciBoO1xuICAgICAgaWYgKHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCBuLmFib3J0ZWQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGYgPSBkICYmIGQuY29kZSB8fCAwLCBwID0gZCA/IGQubWVzc2FnZSA6IG51bGw7XG4gICAgICAoaCA9IHRoaXMuY2FsbGJhY2tzKSA9PSBudWxsIHx8IGgub25FcnJvcih7XG4gICAgICAgIGNvZGU6IGYsXG4gICAgICAgIHRleHQ6IHBcbiAgICAgIH0sIGUsIGQgPyBkLmRldGFpbHMgOiBudWxsLCBuKTtcbiAgICB9KTtcbiAgfVxuICBnZXRDYWNoZUFnZSgpIHtcbiAgICBsZXQgZSA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVzcG9uc2UpIHtcbiAgICAgIGNvbnN0IHQgPSB0aGlzLnJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiYWdlXCIpO1xuICAgICAgZSA9IHQgPyBwYXJzZUZsb2F0KHQpIDogbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGU7XG4gIH1cbiAgZ2V0UmVzcG9uc2VIZWFkZXIoZSkge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlID8gdGhpcy5yZXNwb25zZS5oZWFkZXJzLmdldChlKSA6IG51bGw7XG4gIH1cbiAgbG9hZFByb2dyZXNzaXZlbHkoZSwgdCwgciwgbiA9IDAsIGkpIHtcbiAgICBjb25zdCBvID0gbmV3IGlwKCksIGEgPSBlLmJvZHkuZ2V0UmVhZGVyKCksIGwgPSAoKSA9PiBhLnJlYWQoKS50aGVuKChjKSA9PiB7XG4gICAgICBpZiAoYy5kb25lKVxuICAgICAgICByZXR1cm4gby5kYXRhTGVuZ3RoICYmIGkodCwgciwgby5mbHVzaCgpLmJ1ZmZlciwgZSksIFByb21pc2UucmVzb2x2ZShuZXcgQXJyYXlCdWZmZXIoMCkpO1xuICAgICAgY29uc3QgdSA9IGMudmFsdWUsIGQgPSB1Lmxlbmd0aDtcbiAgICAgIHJldHVybiB0LmxvYWRlZCArPSBkLCBkIDwgbiB8fCBvLmRhdGFMZW5ndGggPyAoby5wdXNoKHUpLCBvLmRhdGFMZW5ndGggPj0gbiAmJiBpKHQsIHIsIG8uZmx1c2goKS5idWZmZXIsIGUpKSA6IGkodCwgciwgdS5idWZmZXIsIGUpLCBsKCk7XG4gICAgfSkuY2F0Y2goKCkgPT4gUHJvbWlzZS5yZWplY3QoKSk7XG4gICAgcmV0dXJuIGwoKTtcbiAgfVxufVxuZnVuY3Rpb24gUXcocywgZSkge1xuICBjb25zdCB0ID0ge1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBtb2RlOiBcImNvcnNcIixcbiAgICBjcmVkZW50aWFsczogXCJzYW1lLW9yaWdpblwiLFxuICAgIHNpZ25hbDogZSxcbiAgICBoZWFkZXJzOiBuZXcgc2VsZi5IZWFkZXJzKG50KHt9LCBzLmhlYWRlcnMpKVxuICB9O1xuICByZXR1cm4gcy5yYW5nZUVuZCAmJiB0LmhlYWRlcnMuc2V0KFwiUmFuZ2VcIiwgXCJieXRlcz1cIiArIHMucmFuZ2VTdGFydCArIFwiLVwiICsgU3RyaW5nKHMucmFuZ2VFbmQgLSAxKSksIHQ7XG59XG5mdW5jdGlvbiBlQShzKSB7XG4gIGNvbnN0IGUgPSBKdy5leGVjKHMpO1xuICBpZiAoZSlcbiAgICByZXR1cm4gcGFyc2VJbnQoZVsyXSkgLSBwYXJzZUludChlWzFdKSArIDE7XG59XG5mdW5jdGlvbiB0QShzKSB7XG4gIGNvbnN0IGUgPSBzLmdldChcIkNvbnRlbnQtUmFuZ2VcIik7XG4gIGlmIChlKSB7XG4gICAgY29uc3QgciA9IGVBKGUpO1xuICAgIGlmICh1ZShyKSlcbiAgICAgIHJldHVybiByO1xuICB9XG4gIGNvbnN0IHQgPSBzLmdldChcIkNvbnRlbnQtTGVuZ3RoXCIpO1xuICBpZiAodClcbiAgICByZXR1cm4gcGFyc2VJbnQodCk7XG59XG5mdW5jdGlvbiByQShzLCBlKSB7XG4gIHJldHVybiBuZXcgc2VsZi5SZXF1ZXN0KHMudXJsLCBlKTtcbn1cbmNsYXNzIHNBIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihlLCB0LCByKSB7XG4gICAgc3VwZXIoZSksIHRoaXMuY29kZSA9IHZvaWQgMCwgdGhpcy5kZXRhaWxzID0gdm9pZCAwLCB0aGlzLmNvZGUgPSB0LCB0aGlzLmRldGFpbHMgPSByO1xuICB9XG59XG5jb25zdCBuQSA9IC9eYWdlOlxccypbXFxkLl0rXFxzKiQvaW07XG5jbGFzcyBacCB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLnhoclNldHVwID0gdm9pZCAwLCB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gdm9pZCAwLCB0aGlzLnJldHJ5VGltZW91dCA9IHZvaWQgMCwgdGhpcy5yZXRyeURlbGF5ID0gdm9pZCAwLCB0aGlzLmNvbmZpZyA9IG51bGwsIHRoaXMuY2FsbGJhY2tzID0gbnVsbCwgdGhpcy5jb250ZXh0ID0gbnVsbCwgdGhpcy5sb2FkZXIgPSBudWxsLCB0aGlzLnN0YXRzID0gdm9pZCAwLCB0aGlzLnhoclNldHVwID0gZSAmJiBlLnhoclNldHVwIHx8IG51bGwsIHRoaXMuc3RhdHMgPSBuZXcgZnUoKSwgdGhpcy5yZXRyeURlbGF5ID0gMDtcbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMuY2FsbGJhY2tzID0gbnVsbCwgdGhpcy5hYm9ydEludGVybmFsKCksIHRoaXMubG9hZGVyID0gbnVsbCwgdGhpcy5jb25maWcgPSBudWxsLCB0aGlzLmNvbnRleHQgPSBudWxsLCB0aGlzLnhoclNldHVwID0gbnVsbDtcbiAgfVxuICBhYm9ydEludGVybmFsKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmxvYWRlcjtcbiAgICBzZWxmLmNsZWFyVGltZW91dCh0aGlzLnJlcXVlc3RUaW1lb3V0KSwgc2VsZi5jbGVhclRpbWVvdXQodGhpcy5yZXRyeVRpbWVvdXQpLCBlICYmIChlLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGwsIGUub25wcm9ncmVzcyA9IG51bGwsIGUucmVhZHlTdGF0ZSAhPT0gNCAmJiAodGhpcy5zdGF0cy5hYm9ydGVkID0gITAsIGUuYWJvcnQoKSkpO1xuICB9XG4gIGFib3J0KCkge1xuICAgIHZhciBlO1xuICAgIHRoaXMuYWJvcnRJbnRlcm5hbCgpLCAoZSA9IHRoaXMuY2FsbGJhY2tzKSAhPSBudWxsICYmIGUub25BYm9ydCAmJiB0aGlzLmNhbGxiYWNrcy5vbkFib3J0KHRoaXMuc3RhdHMsIHRoaXMuY29udGV4dCwgdGhpcy5sb2FkZXIpO1xuICB9XG4gIGxvYWQoZSwgdCwgcikge1xuICAgIGlmICh0aGlzLnN0YXRzLmxvYWRpbmcuc3RhcnQpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2FkZXIgY2FuIG9ubHkgYmUgdXNlZCBvbmNlLlwiKTtcbiAgICB0aGlzLnN0YXRzLmxvYWRpbmcuc3RhcnQgPSBzZWxmLnBlcmZvcm1hbmNlLm5vdygpLCB0aGlzLmNvbnRleHQgPSBlLCB0aGlzLmNvbmZpZyA9IHQsIHRoaXMuY2FsbGJhY2tzID0gciwgdGhpcy5sb2FkSW50ZXJuYWwoKTtcbiAgfVxuICBsb2FkSW50ZXJuYWwoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29uZmlnOiBlLFxuICAgICAgY29udGV4dDogdFxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghZSB8fCAhdClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCByID0gdGhpcy5sb2FkZXIgPSBuZXcgc2VsZi5YTUxIdHRwUmVxdWVzdCgpLCBuID0gdGhpcy5zdGF0cztcbiAgICBuLmxvYWRpbmcuZmlyc3QgPSAwLCBuLmxvYWRlZCA9IDAsIG4uYWJvcnRlZCA9ICExO1xuICAgIGNvbnN0IGkgPSB0aGlzLnhoclNldHVwO1xuICAgIGkgPyBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcbiAgICAgIGlmICghKHRoaXMubG9hZGVyICE9PSByIHx8IHRoaXMuc3RhdHMuYWJvcnRlZCkpXG4gICAgICAgIHJldHVybiBpKHIsIHQudXJsKTtcbiAgICB9KS5jYXRjaCgobykgPT4ge1xuICAgICAgaWYgKCEodGhpcy5sb2FkZXIgIT09IHIgfHwgdGhpcy5zdGF0cy5hYm9ydGVkKSlcbiAgICAgICAgcmV0dXJuIHIub3BlbihcIkdFVFwiLCB0LnVybCwgITApLCBpKHIsIHQudXJsKTtcbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMubG9hZGVyICE9PSByIHx8IHRoaXMuc3RhdHMuYWJvcnRlZCB8fCB0aGlzLm9wZW5BbmRTZW5kWGhyKHIsIHQsIGUpO1xuICAgIH0pLmNhdGNoKChvKSA9PiB7XG4gICAgICB2YXIgYTtcbiAgICAgIChhID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgfHwgYS5vbkVycm9yKHtcbiAgICAgICAgY29kZTogci5zdGF0dXMsXG4gICAgICAgIHRleHQ6IG8ubWVzc2FnZVxuICAgICAgfSwgdCwgciwgbik7XG4gICAgfSkgOiB0aGlzLm9wZW5BbmRTZW5kWGhyKHIsIHQsIGUpO1xuICB9XG4gIG9wZW5BbmRTZW5kWGhyKGUsIHQsIHIpIHtcbiAgICBlLnJlYWR5U3RhdGUgfHwgZS5vcGVuKFwiR0VUXCIsIHQudXJsLCAhMCk7XG4gICAgY29uc3QgbiA9IHQuaGVhZGVycywge1xuICAgICAgbWF4VGltZVRvRmlyc3RCeXRlTXM6IGksXG4gICAgICBtYXhMb2FkVGltZU1zOiBvXG4gICAgfSA9IHIubG9hZFBvbGljeTtcbiAgICBpZiAobilcbiAgICAgIGZvciAoY29uc3QgYSBpbiBuKVxuICAgICAgICBlLnNldFJlcXVlc3RIZWFkZXIoYSwgblthXSk7XG4gICAgdC5yYW5nZUVuZCAmJiBlLnNldFJlcXVlc3RIZWFkZXIoXCJSYW5nZVwiLCBcImJ5dGVzPVwiICsgdC5yYW5nZVN0YXJ0ICsgXCItXCIgKyAodC5yYW5nZUVuZCAtIDEpKSwgZS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSB0aGlzLnJlYWR5c3RhdGVjaGFuZ2UuYmluZCh0aGlzKSwgZS5vbnByb2dyZXNzID0gdGhpcy5sb2FkcHJvZ3Jlc3MuYmluZCh0aGlzKSwgZS5yZXNwb25zZVR5cGUgPSB0LnJlc3BvbnNlVHlwZSwgc2VsZi5jbGVhclRpbWVvdXQodGhpcy5yZXF1ZXN0VGltZW91dCksIHIudGltZW91dCA9IGkgJiYgdWUoaSkgPyBpIDogbywgdGhpcy5yZXF1ZXN0VGltZW91dCA9IHNlbGYuc2V0VGltZW91dCh0aGlzLmxvYWR0aW1lb3V0LmJpbmQodGhpcyksIHIudGltZW91dCksIGUuc2VuZCgpO1xuICB9XG4gIHJlYWR5c3RhdGVjaGFuZ2UoKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGV4dDogZSxcbiAgICAgIGxvYWRlcjogdCxcbiAgICAgIHN0YXRzOiByXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCFlIHx8ICF0KVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSB0LnJlYWR5U3RhdGUsIGkgPSB0aGlzLmNvbmZpZztcbiAgICBpZiAoIXIuYWJvcnRlZCAmJiBuID49IDIgJiYgKHIubG9hZGluZy5maXJzdCA9PT0gMCAmJiAoci5sb2FkaW5nLmZpcnN0ID0gTWF0aC5tYXgoc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgci5sb2FkaW5nLnN0YXJ0KSwgaS50aW1lb3V0ICE9PSBpLmxvYWRQb2xpY3kubWF4TG9hZFRpbWVNcyAmJiAoc2VsZi5jbGVhclRpbWVvdXQodGhpcy5yZXF1ZXN0VGltZW91dCksIGkudGltZW91dCA9IGkubG9hZFBvbGljeS5tYXhMb2FkVGltZU1zLCB0aGlzLnJlcXVlc3RUaW1lb3V0ID0gc2VsZi5zZXRUaW1lb3V0KHRoaXMubG9hZHRpbWVvdXQuYmluZCh0aGlzKSwgaS5sb2FkUG9saWN5Lm1heExvYWRUaW1lTXMgLSAoci5sb2FkaW5nLmZpcnN0IC0gci5sb2FkaW5nLnN0YXJ0KSkpKSwgbiA9PT0gNCkpIHtcbiAgICAgIHNlbGYuY2xlYXJUaW1lb3V0KHRoaXMucmVxdWVzdFRpbWVvdXQpLCB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGwsIHQub25wcm9ncmVzcyA9IG51bGw7XG4gICAgICBjb25zdCBjID0gdC5zdGF0dXMsIHUgPSB0LnJlc3BvbnNlVHlwZSA9PT0gXCJ0ZXh0XCIgPyB0LnJlc3BvbnNlVGV4dCA6IG51bGw7XG4gICAgICBpZiAoYyA+PSAyMDAgJiYgYyA8IDMwMCkge1xuICAgICAgICBjb25zdCBwID0gdSA/PyB0LnJlc3BvbnNlO1xuICAgICAgICBpZiAocCAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIG8sIGE7XG4gICAgICAgICAgci5sb2FkaW5nLmVuZCA9IE1hdGgubWF4KHNlbGYucGVyZm9ybWFuY2Uubm93KCksIHIubG9hZGluZy5maXJzdCk7XG4gICAgICAgICAgY29uc3QgeSA9IHQucmVzcG9uc2VUeXBlID09PSBcImFycmF5YnVmZmVyXCIgPyBwLmJ5dGVMZW5ndGggOiBwLmxlbmd0aDtcbiAgICAgICAgICByLmxvYWRlZCA9IHIudG90YWwgPSB5LCByLmJ3RXN0aW1hdGUgPSByLnRvdGFsICogOGUzIC8gKHIubG9hZGluZy5lbmQgLSByLmxvYWRpbmcuZmlyc3QpO1xuICAgICAgICAgIGNvbnN0IEUgPSAobyA9IHRoaXMuY2FsbGJhY2tzKSA9PSBudWxsID8gdm9pZCAwIDogby5vblByb2dyZXNzO1xuICAgICAgICAgIEUgJiYgRShyLCBlLCBwLCB0KTtcbiAgICAgICAgICBjb25zdCBiID0ge1xuICAgICAgICAgICAgdXJsOiB0LnJlc3BvbnNlVVJMLFxuICAgICAgICAgICAgZGF0YTogcCxcbiAgICAgICAgICAgIGNvZGU6IGNcbiAgICAgICAgICB9O1xuICAgICAgICAgIChhID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgfHwgYS5vblN1Y2Nlc3MoYiwgciwgZSwgdCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkID0gaS5sb2FkUG9saWN5LmVycm9yUmV0cnksIGggPSByLnJldHJ5LCBmID0ge1xuICAgICAgICB1cmw6IGUudXJsLFxuICAgICAgICBkYXRhOiB2b2lkIDAsXG4gICAgICAgIGNvZGU6IGNcbiAgICAgIH07XG4gICAgICBpZiAodGEoZCwgaCwgITEsIGYpKVxuICAgICAgICB0aGlzLnJldHJ5KGQpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHZhciBsO1xuICAgICAgICBydC5lcnJvcihgJHtjfSB3aGlsZSBsb2FkaW5nICR7ZS51cmx9YCksIChsID0gdGhpcy5jYWxsYmFja3MpID09IG51bGwgfHwgbC5vbkVycm9yKHtcbiAgICAgICAgICBjb2RlOiBjLFxuICAgICAgICAgIHRleHQ6IHQuc3RhdHVzVGV4dFxuICAgICAgICB9LCBlLCB0LCByKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbG9hZHRpbWVvdXQoKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZykgcmV0dXJuO1xuICAgIGNvbnN0IGUgPSB0aGlzLmNvbmZpZy5sb2FkUG9saWN5LnRpbWVvdXRSZXRyeSwgdCA9IHRoaXMuc3RhdHMucmV0cnk7XG4gICAgaWYgKHRhKGUsIHQsICEwKSlcbiAgICAgIHRoaXMucmV0cnkoZSk7XG4gICAgZWxzZSB7XG4gICAgICB2YXIgcjtcbiAgICAgIHJ0Lndhcm4oYHRpbWVvdXQgd2hpbGUgbG9hZGluZyAkeyhyID0gdGhpcy5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogci51cmx9YCk7XG4gICAgICBjb25zdCBuID0gdGhpcy5jYWxsYmFja3M7XG4gICAgICBuICYmICh0aGlzLmFib3J0SW50ZXJuYWwoKSwgbi5vblRpbWVvdXQodGhpcy5zdGF0cywgdGhpcy5jb250ZXh0LCB0aGlzLmxvYWRlcikpO1xuICAgIH1cbiAgfVxuICByZXRyeShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29udGV4dDogdCxcbiAgICAgIHN0YXRzOiByXG4gICAgfSA9IHRoaXM7XG4gICAgdGhpcy5yZXRyeURlbGF5ID0geXUoZSwgci5yZXRyeSksIHIucmV0cnkrKywgcnQud2FybihgJHtzdGF0dXMgPyBcIkhUVFAgU3RhdHVzIFwiICsgc3RhdHVzIDogXCJUaW1lb3V0XCJ9IHdoaWxlIGxvYWRpbmcgJHt0ID09IG51bGwgPyB2b2lkIDAgOiB0LnVybH0sIHJldHJ5aW5nICR7ci5yZXRyeX0vJHtlLm1heE51bVJldHJ5fSBpbiAke3RoaXMucmV0cnlEZWxheX1tc2ApLCB0aGlzLmFib3J0SW50ZXJuYWwoKSwgdGhpcy5sb2FkZXIgPSBudWxsLCBzZWxmLmNsZWFyVGltZW91dCh0aGlzLnJldHJ5VGltZW91dCksIHRoaXMucmV0cnlUaW1lb3V0ID0gc2VsZi5zZXRUaW1lb3V0KHRoaXMubG9hZEludGVybmFsLmJpbmQodGhpcyksIHRoaXMucmV0cnlEZWxheSk7XG4gIH1cbiAgbG9hZHByb2dyZXNzKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5zdGF0cztcbiAgICB0LmxvYWRlZCA9IGUubG9hZGVkLCBlLmxlbmd0aENvbXB1dGFibGUgJiYgKHQudG90YWwgPSBlLnRvdGFsKTtcbiAgfVxuICBnZXRDYWNoZUFnZSgpIHtcbiAgICBsZXQgZSA9IG51bGw7XG4gICAgaWYgKHRoaXMubG9hZGVyICYmIG5BLnRlc3QodGhpcy5sb2FkZXIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5sb2FkZXIuZ2V0UmVzcG9uc2VIZWFkZXIoXCJhZ2VcIik7XG4gICAgICBlID0gdCA/IHBhcnNlRmxvYXQodCkgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZTtcbiAgfVxuICBnZXRSZXNwb25zZUhlYWRlcihlKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGVyICYmIG5ldyBSZWdFeHAoYF4ke2V9OlxcXFxzKltcXFxcZC5dK1xcXFxzKiRgLCBcImltXCIpLnRlc3QodGhpcy5sb2FkZXIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpID8gdGhpcy5sb2FkZXIuZ2V0UmVzcG9uc2VIZWFkZXIoZSkgOiBudWxsO1xuICB9XG59XG5jb25zdCBpQSA9IHtcbiAgbWF4VGltZVRvRmlyc3RCeXRlTXM6IDhlMyxcbiAgbWF4TG9hZFRpbWVNczogMmU0LFxuICB0aW1lb3V0UmV0cnk6IG51bGwsXG4gIGVycm9yUmV0cnk6IG51bGxcbn0sIG9BID0gdHQodHQoe1xuICBhdXRvU3RhcnRMb2FkOiAhMCxcbiAgLy8gdXNlZCBieSBzdHJlYW0tY29udHJvbGxlclxuICBzdGFydFBvc2l0aW9uOiAtMSxcbiAgLy8gdXNlZCBieSBzdHJlYW0tY29udHJvbGxlclxuICBkZWZhdWx0QXVkaW9Db2RlYzogdm9pZCAwLFxuICAvLyB1c2VkIGJ5IHN0cmVhbS1jb250cm9sbGVyXG4gIGRlYnVnOiAhMSxcbiAgLy8gdXNlZCBieSBsb2dnZXJcbiAgY2FwTGV2ZWxPbkZQU0Ryb3A6ICExLFxuICAvLyB1c2VkIGJ5IGZwcy1jb250cm9sbGVyXG4gIGNhcExldmVsVG9QbGF5ZXJTaXplOiAhMSxcbiAgLy8gdXNlZCBieSBjYXAtbGV2ZWwtY29udHJvbGxlclxuICBpZ25vcmVEZXZpY2VQaXhlbFJhdGlvOiAhMSxcbiAgLy8gdXNlZCBieSBjYXAtbGV2ZWwtY29udHJvbGxlclxuICBtYXhEZXZpY2VQaXhlbFJhdGlvOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksXG4gIC8vIHVzZWQgYnkgY2FwLWxldmVsLWNvbnRyb2xsZXJcbiAgcHJlZmVyTWFuYWdlZE1lZGlhU291cmNlOiAhMCxcbiAgaW5pdGlhbExpdmVNYW5pZmVzdFNpemU6IDEsXG4gIC8vIHVzZWQgYnkgc3RyZWFtLWNvbnRyb2xsZXJcbiAgbWF4QnVmZmVyTGVuZ3RoOiAzMCxcbiAgLy8gdXNlZCBieSBzdHJlYW0tY29udHJvbGxlclxuICBiYWNrQnVmZmVyTGVuZ3RoOiAxIC8gMCxcbiAgLy8gdXNlZCBieSBidWZmZXItY29udHJvbGxlclxuICBmcm9udEJ1ZmZlckZsdXNoVGhyZXNob2xkOiAxIC8gMCxcbiAgc3RhcnRPblNlZ21lbnRCb3VuZGFyeTogITEsXG4gIC8vIHVzZWQgYnkgc3RyZWFtLWNvbnRyb2xsZXJcbiAgbWF4QnVmZmVyU2l6ZTogNjAgKiAxZTMgKiAxZTMsXG4gIC8vIHVzZWQgYnkgc3RyZWFtLWNvbnRyb2xsZXJcbiAgbWF4RnJhZ0xvb2tVcFRvbGVyYW5jZTogMC4yNSxcbiAgLy8gdXNlZCBieSBzdHJlYW0tY29udHJvbGxlclxuICBtYXhCdWZmZXJIb2xlOiAwLjEsXG4gIC8vIHVzZWQgYnkgc3RyZWFtLWNvbnRyb2xsZXIgYW5kIGdhcC1jb250cm9sbGVyXG4gIGRldGVjdFN0YWxsV2l0aEN1cnJlbnRUaW1lTXM6IDEyNTAsXG4gIC8vIHVzZWQgYnkgZ2FwLWNvbnRyb2xsZXJcbiAgaGlnaEJ1ZmZlcldhdGNoZG9nUGVyaW9kOiAyLFxuICAvLyB1c2VkIGJ5IGdhcC1jb250cm9sbGVyXG4gIG51ZGdlT2Zmc2V0OiAwLjEsXG4gIC8vIHVzZWQgYnkgZ2FwLWNvbnRyb2xsZXJcbiAgbnVkZ2VNYXhSZXRyeTogMyxcbiAgLy8gdXNlZCBieSBnYXAtY29udHJvbGxlclxuICBudWRnZU9uVmlkZW9Ib2xlOiAhMCxcbiAgLy8gdXNlZCBieSBnYXAtY29udHJvbGxlclxuICBsaXZlU3luY01vZGU6IFwiZWRnZVwiLFxuICAvLyB1c2VkIGJ5IHN0cmVhbS1jb250cm9sbGVyXG4gIGxpdmVTeW5jRHVyYXRpb25Db3VudDogMyxcbiAgLy8gdXNlZCBieSBsYXRlbmN5LWNvbnRyb2xsZXJcbiAgbGl2ZVN5bmNPblN0YWxsSW5jcmVhc2U6IDEsXG4gIC8vIHVzZWQgYnkgbGF0ZW5jeS1jb250cm9sbGVyXG4gIGxpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudDogMSAvIDAsXG4gIC8vIHVzZWQgYnkgbGF0ZW5jeS1jb250cm9sbGVyXG4gIGxpdmVTeW5jRHVyYXRpb246IHZvaWQgMCxcbiAgLy8gdXNlZCBieSBsYXRlbmN5LWNvbnRyb2xsZXJcbiAgbGl2ZU1heExhdGVuY3lEdXJhdGlvbjogdm9pZCAwLFxuICAvLyB1c2VkIGJ5IGxhdGVuY3ktY29udHJvbGxlclxuICBtYXhMaXZlU3luY1BsYXliYWNrUmF0ZTogMSxcbiAgLy8gdXNlZCBieSBsYXRlbmN5LWNvbnRyb2xsZXJcbiAgbGl2ZUR1cmF0aW9uSW5maW5pdHk6ICExLFxuICAvLyB1c2VkIGJ5IGJ1ZmZlci1jb250cm9sbGVyXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgYmFja0J1ZmZlckxlbmd0aFxuICAgKi9cbiAgbGl2ZUJhY2tCdWZmZXJMZW5ndGg6IG51bGwsXG4gIC8vIHVzZWQgYnkgYnVmZmVyLWNvbnRyb2xsZXJcbiAgbWF4TWF4QnVmZmVyTGVuZ3RoOiA2MDAsXG4gIC8vIHVzZWQgYnkgc3RyZWFtLWNvbnRyb2xsZXJcbiAgZW5hYmxlV29ya2VyOiAhMCxcbiAgLy8gdXNlZCBieSB0cmFuc211eGVyXG4gIHdvcmtlclBhdGg6IG51bGwsXG4gIC8vIHVzZWQgYnkgdHJhbnNtdXhlclxuICBlbmFibGVTb2Z0d2FyZUFFUzogITAsXG4gIC8vIHVzZWQgYnkgZGVjcnlwdGVyXG4gIHN0YXJ0TGV2ZWw6IHZvaWQgMCxcbiAgLy8gdXNlZCBieSBsZXZlbC1jb250cm9sbGVyXG4gIHN0YXJ0RnJhZ1ByZWZldGNoOiAhMSxcbiAgLy8gdXNlZCBieSBzdHJlYW0tY29udHJvbGxlclxuICBmcHNEcm9wcGVkTW9uaXRvcmluZ1BlcmlvZDogNWUzLFxuICAvLyB1c2VkIGJ5IGZwcy1jb250cm9sbGVyXG4gIGZwc0Ryb3BwZWRNb25pdG9yaW5nVGhyZXNob2xkOiAwLjIsXG4gIC8vIHVzZWQgYnkgZnBzLWNvbnRyb2xsZXJcbiAgYXBwZW5kRXJyb3JNYXhSZXRyeTogMyxcbiAgLy8gdXNlZCBieSBidWZmZXItY29udHJvbGxlclxuICBpZ25vcmVQbGF5bGlzdFBhcnNpbmdFcnJvcnM6ICExLFxuICBsb2FkZXI6IFpwLFxuICAvLyBsb2FkZXI6IEZldGNoTG9hZGVyLFxuICBmTG9hZGVyOiB2b2lkIDAsXG4gIC8vIHVzZWQgYnkgZnJhZ21lbnQtbG9hZGVyXG4gIHBMb2FkZXI6IHZvaWQgMCxcbiAgLy8gdXNlZCBieSBwbGF5bGlzdC1sb2FkZXJcbiAgeGhyU2V0dXA6IHZvaWQgMCxcbiAgLy8gdXNlZCBieSB4aHItbG9hZGVyXG4gIGxpY2Vuc2VYaHJTZXR1cDogdm9pZCAwLFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIGxpY2Vuc2VSZXNwb25zZUNhbGxiYWNrOiB2b2lkIDAsXG4gIC8vIHVzZWQgYnkgZW1lLWNvbnRyb2xsZXJcbiAgYWJyQ29udHJvbGxlcjogeWIsXG4gIGJ1ZmZlckNvbnRyb2xsZXI6IGwyLFxuICBjYXBMZXZlbENvbnRyb2xsZXI6IER1LFxuICBlcnJvckNvbnRyb2xsZXI6IGJiLFxuICBmcHNDb250cm9sbGVyOiBjdyxcbiAgc3RyZXRjaFNob3J0VmlkZW9UcmFjazogITEsXG4gIC8vIHVzZWQgYnkgbXA0LXJlbXV4ZXJcbiAgbWF4QXVkaW9GcmFtZXNEcmlmdDogMSxcbiAgLy8gdXNlZCBieSBtcDQtcmVtdXhlclxuICBmb3JjZUtleUZyYW1lT25EaXNjb250aW51aXR5OiAhMCxcbiAgLy8gdXNlZCBieSB0cy1kZW11eGVyXG4gIGFickV3bWFGYXN0TGl2ZTogMyxcbiAgLy8gdXNlZCBieSBhYnItY29udHJvbGxlclxuICBhYnJFd21hU2xvd0xpdmU6IDksXG4gIC8vIHVzZWQgYnkgYWJyLWNvbnRyb2xsZXJcbiAgYWJyRXdtYUZhc3RWb0Q6IDMsXG4gIC8vIHVzZWQgYnkgYWJyLWNvbnRyb2xsZXJcbiAgYWJyRXdtYVNsb3dWb0Q6IDksXG4gIC8vIHVzZWQgYnkgYWJyLWNvbnRyb2xsZXJcbiAgYWJyRXdtYURlZmF1bHRFc3RpbWF0ZTogNWU1LFxuICAvLyA1MDAga2JwcyAgLy8gdXNlZCBieSBhYnItY29udHJvbGxlclxuICBhYnJFd21hRGVmYXVsdEVzdGltYXRlTWF4OiA1ZTYsXG4gIC8vIDUgbWJwc1xuICBhYnJCYW5kV2lkdGhGYWN0b3I6IDAuOTUsXG4gIC8vIHVzZWQgYnkgYWJyLWNvbnRyb2xsZXJcbiAgYWJyQmFuZFdpZHRoVXBGYWN0b3I6IDAuNyxcbiAgLy8gdXNlZCBieSBhYnItY29udHJvbGxlclxuICBhYnJNYXhXaXRoUmVhbEJpdHJhdGU6ICExLFxuICAvLyB1c2VkIGJ5IGFici1jb250cm9sbGVyXG4gIG1heFN0YXJ2YXRpb25EZWxheTogNCxcbiAgLy8gdXNlZCBieSBhYnItY29udHJvbGxlclxuICBtYXhMb2FkaW5nRGVsYXk6IDQsXG4gIC8vIHVzZWQgYnkgYWJyLWNvbnRyb2xsZXJcbiAgbWluQXV0b0JpdHJhdGU6IDAsXG4gIC8vIHVzZWQgYnkgaGxzXG4gIGVtZUVuYWJsZWQ6ICExLFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIHdpZGV2aW5lTGljZW5zZVVybDogdm9pZCAwLFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIGRybVN5c3RlbXM6IHt9LFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIGRybVN5c3RlbU9wdGlvbnM6IHt9LFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIHJlcXVlc3RNZWRpYUtleVN5c3RlbUFjY2Vzc0Z1bmM6IFlnLFxuICAvLyB1c2VkIGJ5IGVtZS1jb250cm9sbGVyXG4gIHJlcXVpcmVLZXlTeXN0ZW1BY2Nlc3NPblN0YXJ0OiAhMSxcbiAgLy8gdXNlZCBieSBlbWUtY29udHJvbGxlclxuICB0ZXN0QmFuZHdpZHRoOiAhMCxcbiAgcHJvZ3Jlc3NpdmU6ICExLFxuICBsb3dMYXRlbmN5TW9kZTogITAsXG4gIGNtY2Q6IHZvaWQgMCxcbiAgZW5hYmxlRGF0ZVJhbmdlTWV0YWRhdGFDdWVzOiAhMCxcbiAgZW5hYmxlRW1zZ01ldGFkYXRhQ3VlczogITAsXG4gIGVuYWJsZUVtc2dLTFZNZXRhZGF0YTogITEsXG4gIGVuYWJsZUlEM01ldGFkYXRhQ3VlczogITAsXG4gIGVuYWJsZUludGVyc3RpdGlhbFBsYXliYWNrOiAhMCxcbiAgaW50ZXJzdGl0aWFsQXBwZW5kSW5QbGFjZTogITAsXG4gIGludGVyc3RpdGlhbExpdmVMb29rQWhlYWQ6IDEwLFxuICB1c2VNZWRpYUNhcGFiaWxpdGllczogITAsXG4gIHByZXNlcnZlTWFudWFsTGV2ZWxPbkVycm9yOiAhMSxcbiAgY2VydExvYWRQb2xpY3k6IHtcbiAgICBkZWZhdWx0OiBpQVxuICB9LFxuICBrZXlMb2FkUG9saWN5OiB7XG4gICAgZGVmYXVsdDoge1xuICAgICAgbWF4VGltZVRvRmlyc3RCeXRlTXM6IDhlMyxcbiAgICAgIG1heExvYWRUaW1lTXM6IDJlNCxcbiAgICAgIHRpbWVvdXRSZXRyeToge1xuICAgICAgICBtYXhOdW1SZXRyeTogMSxcbiAgICAgICAgcmV0cnlEZWxheU1zOiAxZTMsXG4gICAgICAgIG1heFJldHJ5RGVsYXlNczogMmU0LFxuICAgICAgICBiYWNrb2ZmOiBcImxpbmVhclwiXG4gICAgICB9LFxuICAgICAgZXJyb3JSZXRyeToge1xuICAgICAgICBtYXhOdW1SZXRyeTogOCxcbiAgICAgICAgcmV0cnlEZWxheU1zOiAxZTMsXG4gICAgICAgIG1heFJldHJ5RGVsYXlNczogMmU0LFxuICAgICAgICBiYWNrb2ZmOiBcImxpbmVhclwiXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBtYW5pZmVzdExvYWRQb2xpY3k6IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBtYXhUaW1lVG9GaXJzdEJ5dGVNczogMSAvIDAsXG4gICAgICBtYXhMb2FkVGltZU1zOiAyZTQsXG4gICAgICB0aW1lb3V0UmV0cnk6IHtcbiAgICAgICAgbWF4TnVtUmV0cnk6IDIsXG4gICAgICAgIHJldHJ5RGVsYXlNczogMCxcbiAgICAgICAgbWF4UmV0cnlEZWxheU1zOiAwXG4gICAgICB9LFxuICAgICAgZXJyb3JSZXRyeToge1xuICAgICAgICBtYXhOdW1SZXRyeTogMSxcbiAgICAgICAgcmV0cnlEZWxheU1zOiAxZTMsXG4gICAgICAgIG1heFJldHJ5RGVsYXlNczogOGUzXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBwbGF5bGlzdExvYWRQb2xpY3k6IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBtYXhUaW1lVG9GaXJzdEJ5dGVNczogMWU0LFxuICAgICAgbWF4TG9hZFRpbWVNczogMmU0LFxuICAgICAgdGltZW91dFJldHJ5OiB7XG4gICAgICAgIG1heE51bVJldHJ5OiAyLFxuICAgICAgICByZXRyeURlbGF5TXM6IDAsXG4gICAgICAgIG1heFJldHJ5RGVsYXlNczogMFxuICAgICAgfSxcbiAgICAgIGVycm9yUmV0cnk6IHtcbiAgICAgICAgbWF4TnVtUmV0cnk6IDIsXG4gICAgICAgIHJldHJ5RGVsYXlNczogMWUzLFxuICAgICAgICBtYXhSZXRyeURlbGF5TXM6IDhlM1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZnJhZ0xvYWRQb2xpY3k6IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBtYXhUaW1lVG9GaXJzdEJ5dGVNczogMWU0LFxuICAgICAgbWF4TG9hZFRpbWVNczogMTJlNCxcbiAgICAgIHRpbWVvdXRSZXRyeToge1xuICAgICAgICBtYXhOdW1SZXRyeTogNCxcbiAgICAgICAgcmV0cnlEZWxheU1zOiAwLFxuICAgICAgICBtYXhSZXRyeURlbGF5TXM6IDBcbiAgICAgIH0sXG4gICAgICBlcnJvclJldHJ5OiB7XG4gICAgICAgIG1heE51bVJldHJ5OiA2LFxuICAgICAgICByZXRyeURlbGF5TXM6IDFlMyxcbiAgICAgICAgbWF4UmV0cnlEZWxheU1zOiA4ZTNcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIHN0ZWVyaW5nTWFuaWZlc3RMb2FkUG9saWN5OiB7XG4gICAgZGVmYXVsdDoge1xuICAgICAgbWF4VGltZVRvRmlyc3RCeXRlTXM6IDFlNCxcbiAgICAgIG1heExvYWRUaW1lTXM6IDJlNCxcbiAgICAgIHRpbWVvdXRSZXRyeToge1xuICAgICAgICBtYXhOdW1SZXRyeTogMixcbiAgICAgICAgcmV0cnlEZWxheU1zOiAwLFxuICAgICAgICBtYXhSZXRyeURlbGF5TXM6IDBcbiAgICAgIH0sXG4gICAgICBlcnJvclJldHJ5OiB7XG4gICAgICAgIG1heE51bVJldHJ5OiAxLFxuICAgICAgICByZXRyeURlbGF5TXM6IDFlMyxcbiAgICAgICAgbWF4UmV0cnlEZWxheU1zOiA4ZTNcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIGludGVyc3RpdGlhbEFzc2V0TGlzdExvYWRQb2xpY3k6IHtcbiAgICBkZWZhdWx0OiB7XG4gICAgICBtYXhUaW1lVG9GaXJzdEJ5dGVNczogMWU0LFxuICAgICAgbWF4TG9hZFRpbWVNczogM2U0LFxuICAgICAgdGltZW91dFJldHJ5OiB7XG4gICAgICAgIG1heE51bVJldHJ5OiAwLFxuICAgICAgICByZXRyeURlbGF5TXM6IDAsXG4gICAgICAgIG1heFJldHJ5RGVsYXlNczogMFxuICAgICAgfSxcbiAgICAgIGVycm9yUmV0cnk6IHtcbiAgICAgICAgbWF4TnVtUmV0cnk6IDAsXG4gICAgICAgIHJldHJ5RGVsYXlNczogMWUzLFxuICAgICAgICBtYXhSZXRyeURlbGF5TXM6IDhlM1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLy8gVGhlc2UgZGVmYXVsdCBzZXR0aW5ncyBhcmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgYWJvdmUgcG9saWNpZXNcbiAgLy8gYW5kIGFyZSBtYWludGFpbmVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICBtYW5pZmVzdExvYWRpbmdUaW1lT3V0OiAxZTQsXG4gIG1hbmlmZXN0TG9hZGluZ01heFJldHJ5OiAxLFxuICBtYW5pZmVzdExvYWRpbmdSZXRyeURlbGF5OiAxZTMsXG4gIG1hbmlmZXN0TG9hZGluZ01heFJldHJ5VGltZW91dDogNjRlMyxcbiAgbGV2ZWxMb2FkaW5nVGltZU91dDogMWU0LFxuICBsZXZlbExvYWRpbmdNYXhSZXRyeTogNCxcbiAgbGV2ZWxMb2FkaW5nUmV0cnlEZWxheTogMWUzLFxuICBsZXZlbExvYWRpbmdNYXhSZXRyeVRpbWVvdXQ6IDY0ZTMsXG4gIGZyYWdMb2FkaW5nVGltZU91dDogMmU0LFxuICBmcmFnTG9hZGluZ01heFJldHJ5OiA2LFxuICBmcmFnTG9hZGluZ1JldHJ5RGVsYXk6IDFlMyxcbiAgZnJhZ0xvYWRpbmdNYXhSZXRyeVRpbWVvdXQ6IDY0ZTNcbn0sIGFBKCkpLCB7fSwge1xuICBzdWJ0aXRsZVN0cmVhbUNvbnRyb2xsZXI6IFN3LFxuICBzdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjogaHcsXG4gIHRpbWVsaW5lQ29udHJvbGxlcjogV3csXG4gIGF1ZGlvU3RyZWFtQ29udHJvbGxlcjogbjIsXG4gIGF1ZGlvVHJhY2tDb250cm9sbGVyOiBpMixcbiAgZW1lQ29udHJvbGxlcjogX24sXG4gIGNtY2RDb250cm9sbGVyOiBpdyxcbiAgY29udGVudFN0ZWVyaW5nQ29udHJvbGxlcjogYXcsXG4gIGludGVyc3RpdGlhbHNDb250cm9sbGVyOiB4d1xufSk7XG5mdW5jdGlvbiBhQSgpIHtcbiAgcmV0dXJuIHtcbiAgICBjdWVIYW5kbGVyOiBadyxcbiAgICAvLyB1c2VkIGJ5IHRpbWVsaW5lLWNvbnRyb2xsZXJcbiAgICBlbmFibGVXZWJWVFQ6ICEwLFxuICAgIC8vIHVzZWQgYnkgdGltZWxpbmUtY29udHJvbGxlclxuICAgIGVuYWJsZUlNU0MxOiAhMCxcbiAgICAvLyB1c2VkIGJ5IHRpbWVsaW5lLWNvbnRyb2xsZXJcbiAgICBlbmFibGVDRUE3MDhDYXB0aW9uczogITAsXG4gICAgLy8gdXNlZCBieSB0aW1lbGluZS1jb250cm9sbGVyXG4gICAgY2FwdGlvbnNUZXh0VHJhY2sxTGFiZWw6IFwiRW5nbGlzaFwiLFxuICAgIC8vIHVzZWQgYnkgdGltZWxpbmUtY29udHJvbGxlclxuICAgIGNhcHRpb25zVGV4dFRyYWNrMUxhbmd1YWdlQ29kZTogXCJlblwiLFxuICAgIC8vIHVzZWQgYnkgdGltZWxpbmUtY29udHJvbGxlclxuICAgIGNhcHRpb25zVGV4dFRyYWNrMkxhYmVsOiBcIlNwYW5pc2hcIixcbiAgICAvLyB1c2VkIGJ5IHRpbWVsaW5lLWNvbnRyb2xsZXJcbiAgICBjYXB0aW9uc1RleHRUcmFjazJMYW5ndWFnZUNvZGU6IFwiZXNcIixcbiAgICAvLyB1c2VkIGJ5IHRpbWVsaW5lLWNvbnRyb2xsZXJcbiAgICBjYXB0aW9uc1RleHRUcmFjazNMYWJlbDogXCJVbmtub3duIENDXCIsXG4gICAgLy8gdXNlZCBieSB0aW1lbGluZS1jb250cm9sbGVyXG4gICAgY2FwdGlvbnNUZXh0VHJhY2szTGFuZ3VhZ2VDb2RlOiBcIlwiLFxuICAgIC8vIHVzZWQgYnkgdGltZWxpbmUtY29udHJvbGxlclxuICAgIGNhcHRpb25zVGV4dFRyYWNrNExhYmVsOiBcIlVua25vd24gQ0NcIixcbiAgICAvLyB1c2VkIGJ5IHRpbWVsaW5lLWNvbnRyb2xsZXJcbiAgICBjYXB0aW9uc1RleHRUcmFjazRMYW5ndWFnZUNvZGU6IFwiXCIsXG4gICAgLy8gdXNlZCBieSB0aW1lbGluZS1jb250cm9sbGVyXG4gICAgcmVuZGVyVGV4dFRyYWNrc05hdGl2ZWx5OiAhMFxuICB9O1xufVxuZnVuY3Rpb24gbEEocywgZSwgdCkge1xuICBpZiAoKGUubGl2ZVN5bmNEdXJhdGlvbkNvdW50IHx8IGUubGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50KSAmJiAoZS5saXZlU3luY0R1cmF0aW9uIHx8IGUubGl2ZU1heExhdGVuY3lEdXJhdGlvbikpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSWxsZWdhbCBobHMuanMgY29uZmlnOiBkb24ndCBtaXggdXAgbGl2ZVN5bmNEdXJhdGlvbkNvdW50L2xpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudCBhbmQgbGl2ZVN5bmNEdXJhdGlvbi9saXZlTWF4TGF0ZW5jeUR1cmF0aW9uXCIpO1xuICBpZiAoZS5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uQ291bnQgIT09IHZvaWQgMCAmJiAoZS5saXZlU3luY0R1cmF0aW9uQ291bnQgPT09IHZvaWQgMCB8fCBlLmxpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudCA8PSBlLmxpdmVTeW5jRHVyYXRpb25Db3VudCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbGxlZ2FsIGhscy5qcyBjb25maWc6IFwibGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50XCIgbXVzdCBiZSBncmVhdGVyIHRoYW4gXCJsaXZlU3luY0R1cmF0aW9uQ291bnRcIicpO1xuICBpZiAoZS5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uICE9PSB2b2lkIDAgJiYgKGUubGl2ZVN5bmNEdXJhdGlvbiA9PT0gdm9pZCAwIHx8IGUubGl2ZU1heExhdGVuY3lEdXJhdGlvbiA8PSBlLmxpdmVTeW5jRHVyYXRpb24pKVxuICAgIHRocm93IG5ldyBFcnJvcignSWxsZWdhbCBobHMuanMgY29uZmlnOiBcImxpdmVNYXhMYXRlbmN5RHVyYXRpb25cIiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBcImxpdmVTeW5jRHVyYXRpb25cIicpO1xuICBjb25zdCByID0gVGMocyksIG4gPSBbXCJtYW5pZmVzdFwiLCBcImxldmVsXCIsIFwiZnJhZ1wiXSwgaSA9IFtcIlRpbWVPdXRcIiwgXCJNYXhSZXRyeVwiLCBcIlJldHJ5RGVsYXlcIiwgXCJNYXhSZXRyeVRpbWVvdXRcIl07XG4gIHJldHVybiBuLmZvckVhY2goKG8pID0+IHtcbiAgICBjb25zdCBhID0gYCR7byA9PT0gXCJsZXZlbFwiID8gXCJwbGF5bGlzdFwiIDogb31Mb2FkUG9saWN5YCwgbCA9IGVbYV0gPT09IHZvaWQgMCwgYyA9IFtdO1xuICAgIGkuZm9yRWFjaCgodSkgPT4ge1xuICAgICAgY29uc3QgZCA9IGAke299TG9hZGluZyR7dX1gLCBoID0gZVtkXTtcbiAgICAgIGlmIChoICE9PSB2b2lkIDAgJiYgbCkge1xuICAgICAgICBjLnB1c2goZCk7XG4gICAgICAgIGNvbnN0IGYgPSByW2FdLmRlZmF1bHQ7XG4gICAgICAgIHN3aXRjaCAoZVthXSA9IHtcbiAgICAgICAgICBkZWZhdWx0OiBmXG4gICAgICAgIH0sIHUpIHtcbiAgICAgICAgICBjYXNlIFwiVGltZU91dFwiOlxuICAgICAgICAgICAgZi5tYXhMb2FkVGltZU1zID0gaCwgZi5tYXhUaW1lVG9GaXJzdEJ5dGVNcyA9IGg7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlIFwiTWF4UmV0cnlcIjpcbiAgICAgICAgICAgIGYuZXJyb3JSZXRyeS5tYXhOdW1SZXRyeSA9IGgsIGYudGltZW91dFJldHJ5Lm1heE51bVJldHJ5ID0gaDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJSZXRyeURlbGF5XCI6XG4gICAgICAgICAgICBmLmVycm9yUmV0cnkucmV0cnlEZWxheU1zID0gaCwgZi50aW1lb3V0UmV0cnkucmV0cnlEZWxheU1zID0gaDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJNYXhSZXRyeVRpbWVvdXRcIjpcbiAgICAgICAgICAgIGYuZXJyb3JSZXRyeS5tYXhSZXRyeURlbGF5TXMgPSBoLCBmLnRpbWVvdXRSZXRyeS5tYXhSZXRyeURlbGF5TXMgPSBoO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSwgYy5sZW5ndGggJiYgdC53YXJuKGBobHMuanMgY29uZmlnOiBcIiR7Yy5qb2luKCdcIiwgXCInKX1cIiBzZXR0aW5nKHMpIGFyZSBkZXByZWNhdGVkLCB1c2UgXCIke2F9XCI6ICR7YXQoZVthXSl9YCk7XG4gIH0pLCB0dCh0dCh7fSwgciksIGUpO1xufVxuZnVuY3Rpb24gVGMocykge1xuICByZXR1cm4gcyAmJiB0eXBlb2YgcyA9PSBcIm9iamVjdFwiID8gQXJyYXkuaXNBcnJheShzKSA/IHMubWFwKFRjKSA6IE9iamVjdC5rZXlzKHMpLnJlZHVjZSgoZSwgdCkgPT4gKGVbdF0gPSBUYyhzW3RdKSwgZSksIHt9KSA6IHM7XG59XG5mdW5jdGlvbiBjQShzLCBlKSB7XG4gIGNvbnN0IHQgPSBzLmxvYWRlcjtcbiAgdCAhPT0gbGYgJiYgdCAhPT0gWnAgPyAoZS5sb2coXCJbY29uZmlnXTogQ3VzdG9tIGxvYWRlciBkZXRlY3RlZCwgY2Fubm90IGVuYWJsZSBwcm9ncmVzc2l2ZSBzdHJlYW1pbmdcIiksIHMucHJvZ3Jlc3NpdmUgPSAhMSkgOiBYdygpICYmIChzLmxvYWRlciA9IGxmLCBzLnByb2dyZXNzaXZlID0gITAsIHMuZW5hYmxlU29mdHdhcmVBRVMgPSAhMCwgZS5sb2coXCJbY29uZmlnXTogUHJvZ3Jlc3NpdmUgc3RyZWFtaW5nIGVuYWJsZWQsIHVzaW5nIEZldGNoTG9hZGVyXCIpKTtcbn1cbmNvbnN0IHhvID0gMiwgdUEgPSAwLjEsIGRBID0gMC4wNSwgaEEgPSAxMDA7XG5jbGFzcyBmQSBleHRlbmRzIEhnIHtcbiAgY29uc3RydWN0b3IoZSwgdCkge1xuICAgIHN1cGVyKFwiZ2FwLWNvbnRyb2xsZXJcIiwgZS5sb2dnZXIpLCB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5mcmFnbWVudFRyYWNrZXIgPSB2b2lkIDAsIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLm1lZGlhU291cmNlID0gdm9pZCAwLCB0aGlzLm51ZGdlUmV0cnkgPSAwLCB0aGlzLnN0YWxsUmVwb3J0ZWQgPSAhMSwgdGhpcy5zdGFsbGVkID0gbnVsbCwgdGhpcy5tb3ZlZCA9ICExLCB0aGlzLnNlZWtpbmcgPSAhMSwgdGhpcy5idWZmZXJlZCA9IHt9LCB0aGlzLmxhc3RDdXJyZW50VGltZSA9IDAsIHRoaXMuZW5kZWQgPSAwLCB0aGlzLndhaXRpbmcgPSAwLCB0aGlzLm9uTWVkaWFQbGF5aW5nID0gKCkgPT4ge1xuICAgICAgdGhpcy5lbmRlZCA9IDAsIHRoaXMud2FpdGluZyA9IDA7XG4gICAgfSwgdGhpcy5vbk1lZGlhV2FpdGluZyA9ICgpID0+IHtcbiAgICAgIHZhciByO1xuICAgICAgKHIgPSB0aGlzLm1lZGlhKSAhPSBudWxsICYmIHIuc2Vla2luZyB8fCAodGhpcy53YWl0aW5nID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgdGhpcy50aWNrKCkpO1xuICAgIH0sIHRoaXMub25NZWRpYUVuZGVkID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaGxzKSB7XG4gICAgICAgIHZhciByO1xuICAgICAgICB0aGlzLmVuZGVkID0gKChyID0gdGhpcy5tZWRpYSkgPT0gbnVsbCA/IHZvaWQgMCA6IHIuY3VycmVudFRpbWUpIHx8IDEsIHRoaXMuaGxzLnRyaWdnZXIoSS5NRURJQV9FTkRFRCwge1xuICAgICAgICAgIHN0YWxsZWQ6ICExXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sIHRoaXMuaGxzID0gZSwgdGhpcy5mcmFnbWVudFRyYWNrZXIgPSB0LCB0aGlzLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gIH1cbiAgcmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZSAmJiAoZS5vbihJLk1FRElBX0FUVEFDSEVELCB0aGlzLm9uTWVkaWFBdHRhY2hlZCwgdGhpcyksIGUub24oSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub24oSS5CVUZGRVJfQVBQRU5ERUQsIHRoaXMub25CdWZmZXJBcHBlbmRlZCwgdGhpcykpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZSAmJiAoZS5vZmYoSS5NRURJQV9BVFRBQ0hFRCwgdGhpcy5vbk1lZGlhQXR0YWNoZWQsIHRoaXMpLCBlLm9mZihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vZmYoSS5CVUZGRVJfQVBQRU5ERUQsIHRoaXMub25CdWZmZXJBcHBlbmRlZCwgdGhpcykpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpLCB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5tZWRpYSA9IHRoaXMuaGxzID0gdGhpcy5mcmFnbWVudFRyYWNrZXIgPSBudWxsLCB0aGlzLm1lZGlhU291cmNlID0gdm9pZCAwO1xuICB9XG4gIG9uTWVkaWFBdHRhY2hlZChlLCB0KSB7XG4gICAgdGhpcy5zZXRJbnRlcnZhbChoQSksIHRoaXMubWVkaWFTb3VyY2UgPSB0Lm1lZGlhU291cmNlO1xuICAgIGNvbnN0IHIgPSB0aGlzLm1lZGlhID0gdC5tZWRpYTtcbiAgICBjcihyLCBcInBsYXlpbmdcIiwgdGhpcy5vbk1lZGlhUGxheWluZyksIGNyKHIsIFwid2FpdGluZ1wiLCB0aGlzLm9uTWVkaWFXYWl0aW5nKSwgY3IociwgXCJlbmRlZFwiLCB0aGlzLm9uTWVkaWFFbmRlZCk7XG4gIH1cbiAgb25NZWRpYURldGFjaGluZyhlLCB0KSB7XG4gICAgdGhpcy5jbGVhckludGVydmFsKCk7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IHJcbiAgICB9ID0gdGhpcztcbiAgICByICYmIChwcihyLCBcInBsYXlpbmdcIiwgdGhpcy5vbk1lZGlhUGxheWluZyksIHByKHIsIFwid2FpdGluZ1wiLCB0aGlzLm9uTWVkaWFXYWl0aW5nKSwgcHIociwgXCJlbmRlZFwiLCB0aGlzLm9uTWVkaWFFbmRlZCksIHRoaXMubWVkaWEgPSBudWxsKSwgdGhpcy5tZWRpYVNvdXJjZSA9IHZvaWQgMDtcbiAgfVxuICBvbkJ1ZmZlckFwcGVuZGVkKGUsIHQpIHtcbiAgICB0aGlzLmJ1ZmZlcmVkID0gdC50aW1lUmFuZ2VzO1xuICB9XG4gIGdldCBoYXNCdWZmZXJlZCgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5idWZmZXJlZCkubGVuZ3RoID4gMDtcbiAgfVxuICB0aWNrKCkge1xuICAgIHZhciBlO1xuICAgIGlmICghKChlID0gdGhpcy5tZWRpYSkgIT0gbnVsbCAmJiBlLnJlYWR5U3RhdGUpIHx8ICF0aGlzLmhhc0J1ZmZlcmVkKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHQgPSB0aGlzLm1lZGlhLmN1cnJlbnRUaW1lO1xuICAgIHRoaXMucG9sbCh0LCB0aGlzLmxhc3RDdXJyZW50VGltZSksIHRoaXMubGFzdEN1cnJlbnRUaW1lID0gdDtcbiAgfVxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBwbGF5aGVhZCBpcyBzdHVjayB3aXRoaW4gYSBnYXAsIGFuZCBpZiBzbywgYXR0ZW1wdHMgdG8gZnJlZSBpdC5cbiAgICogQSBnYXAgaXMgYW4gdW5idWZmZXJlZCByYW5nZSBiZXR3ZWVuIHR3byBidWZmZXJlZCByYW5nZXMgKG9yIHRoZSBzdGFydCBhbmQgdGhlIGZpcnN0IGJ1ZmZlcmVkIHJhbmdlKS5cbiAgICpcbiAgICogQHBhcmFtIGxhc3RDdXJyZW50VGltZSAtIFByZXZpb3VzbHkgcmVhZCBwbGF5aGVhZCBwb3NpdGlvblxuICAgKi9cbiAgcG9sbChlLCB0KSB7XG4gICAgdmFyIHIsIG47XG4gICAgY29uc3QgaSA9IChyID0gdGhpcy5obHMpID09IG51bGwgPyB2b2lkIDAgOiByLmNvbmZpZztcbiAgICBpZiAoIWkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbyA9IHRoaXMubWVkaWE7XG4gICAgaWYgKCFvKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIHNlZWtpbmc6IGFcbiAgICB9ID0gbywgbCA9IHRoaXMuc2Vla2luZyAmJiAhYSwgYyA9ICF0aGlzLnNlZWtpbmcgJiYgYSwgdSA9IG8ucGF1c2VkICYmICFhIHx8IG8uZW5kZWQgfHwgby5wbGF5YmFja1JhdGUgPT09IDA7XG4gICAgaWYgKHRoaXMuc2Vla2luZyA9IGEsIGUgIT09IHQpIHtcbiAgICAgIHQgJiYgKHRoaXMuZW5kZWQgPSAwKSwgdGhpcy5tb3ZlZCA9ICEwLCBhIHx8ICh0aGlzLm51ZGdlUmV0cnkgPSAwLCBpLm51ZGdlT25WaWRlb0hvbGUgJiYgIXUgJiYgZSA+IHQgJiYgdGhpcy5udWRnZU9uVmlkZW9Ib2xlKGUsIHQpKSwgdGhpcy53YWl0aW5nID09PSAwICYmIHRoaXMuc3RhbGxSZXNvbHZlZChlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGMgfHwgbCkge1xuICAgICAgbCAmJiB0aGlzLnN0YWxsUmVzb2x2ZWQoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh1KSB7XG4gICAgICB0aGlzLm51ZGdlUmV0cnkgPSAwLCB0aGlzLnN0YWxsUmVzb2x2ZWQoZSksICF0aGlzLmVuZGVkICYmIG8uZW5kZWQgJiYgdGhpcy5obHMgJiYgKHRoaXMuZW5kZWQgPSBlIHx8IDEsIHRoaXMuaGxzLnRyaWdnZXIoSS5NRURJQV9FTkRFRCwge1xuICAgICAgICBzdGFsbGVkOiAhMVxuICAgICAgfSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIUNlLmdldEJ1ZmZlcmVkKG8pLmxlbmd0aCkge1xuICAgICAgdGhpcy5udWRnZVJldHJ5ID0gMDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IENlLmJ1ZmZlckluZm8obywgZSwgMCksIGggPSBkLm5leHRTdGFydCB8fCAwLCBmID0gdGhpcy5mcmFnbWVudFRyYWNrZXI7XG4gICAgaWYgKGEgJiYgZiAmJiB0aGlzLmhscykge1xuICAgICAgY29uc3QgSCA9IGNmKHRoaXMuaGxzLmluRmxpZ2h0RnJhZ21lbnRzLCBlKSwgSyA9IGQubGVuID4geG8sIGogPSAhaCB8fCBIIHx8IGggLSBlID4geG8gJiYgIWYuZ2V0UGFydGlhbEZyYWdtZW50KGUpO1xuICAgICAgaWYgKEsgfHwgailcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5tb3ZlZCA9ICExO1xuICAgIH1cbiAgICBjb25zdCBwID0gKG4gPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IG4ubGF0ZXN0TGV2ZWxEZXRhaWxzO1xuICAgIGlmICghdGhpcy5tb3ZlZCAmJiB0aGlzLnN0YWxsZWQgIT09IG51bGwgJiYgZikge1xuICAgICAgaWYgKCEoZC5sZW4gPiAwKSAmJiAhaClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgSyA9IE1hdGgubWF4KGgsIGQuc3RhcnQgfHwgMCkgLSBlLCBDID0gISEocCAhPSBudWxsICYmIHAubGl2ZSkgPyBwLnRhcmdldGR1cmF0aW9uICogMiA6IHhvLCBrID0gc28oZSwgZik7XG4gICAgICBpZiAoSyA+IDAgJiYgKEsgPD0gQyB8fCBrKSkge1xuICAgICAgICBvLnBhdXNlZCB8fCB0aGlzLl90cnlTa2lwQnVmZmVySG9sZShrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB5ID0gaS5kZXRlY3RTdGFsbFdpdGhDdXJyZW50VGltZU1zLCBFID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKSwgYiA9IHRoaXMud2FpdGluZztcbiAgICBsZXQgUiA9IHRoaXMuc3RhbGxlZDtcbiAgICBpZiAoUiA9PT0gbnVsbClcbiAgICAgIGlmIChiID4gMCAmJiBFIC0gYiA8IHkpXG4gICAgICAgIFIgPSB0aGlzLnN0YWxsZWQgPSBiO1xuICAgICAgZWxzZSB7XG4gICAgICAgIHRoaXMuc3RhbGxlZCA9IEU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICBjb25zdCBBID0gRSAtIFI7XG4gICAgaWYgKCFhICYmIChBID49IHkgfHwgYikgJiYgdGhpcy5obHMpIHtcbiAgICAgIHZhciBGO1xuICAgICAgaWYgKCgoRiA9IHRoaXMubWVkaWFTb3VyY2UpID09IG51bGwgPyB2b2lkIDAgOiBGLnJlYWR5U3RhdGUpID09PSBcImVuZGVkXCIgJiYgIShwICE9IG51bGwgJiYgcC5saXZlKSAmJiBNYXRoLmFicyhlIC0gKChwID09IG51bGwgPyB2b2lkIDAgOiBwLmVkZ2UpIHx8IDApKSA8IDEpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5kZWQpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmVuZGVkID0gZSB8fCAxLCB0aGlzLmhscy50cmlnZ2VyKEkuTUVESUFfRU5ERUQsIHtcbiAgICAgICAgICBzdGFsbGVkOiAhMFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuX3JlcG9ydFN0YWxsKGQpLCAhdGhpcy5tZWRpYSB8fCAhdGhpcy5obHMpXG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgTSA9IENlLmJ1ZmZlckluZm8obywgZSwgaS5tYXhCdWZmZXJIb2xlKTtcbiAgICB0aGlzLl90cnlGaXhCdWZmZXJTdGFsbChNLCBBLCBlKTtcbiAgfVxuICBzdGFsbFJlc29sdmVkKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5zdGFsbGVkO1xuICAgIGlmICh0ICYmIHRoaXMuaGxzICYmICh0aGlzLnN0YWxsZWQgPSBudWxsLCB0aGlzLnN0YWxsUmVwb3J0ZWQpKSB7XG4gICAgICBjb25zdCByID0gc2VsZi5wZXJmb3JtYW5jZS5ub3coKSAtIHQ7XG4gICAgICB0aGlzLmxvZyhgcGxheWJhY2sgbm90IHN0dWNrIGFueW1vcmUgQCR7ZX0sIGFmdGVyICR7TWF0aC5yb3VuZChyKX1tc2ApLCB0aGlzLnN0YWxsUmVwb3J0ZWQgPSAhMSwgdGhpcy53YWl0aW5nID0gMCwgdGhpcy5obHMudHJpZ2dlcihJLlNUQUxMX1JFU09MVkVELCB7fSk7XG4gICAgfVxuICB9XG4gIG51ZGdlT25WaWRlb0hvbGUoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGNvbnN0IG4gPSB0aGlzLmJ1ZmZlcmVkLnZpZGVvO1xuICAgIGlmICh0aGlzLmhscyAmJiB0aGlzLm1lZGlhICYmIHRoaXMuZnJhZ21lbnRUcmFja2VyICYmIChyID0gdGhpcy5idWZmZXJlZC5hdWRpbykgIT0gbnVsbCAmJiByLmxlbmd0aCAmJiBuICYmIG4ubGVuZ3RoID4gMSAmJiBlID4gbi5lbmQoMCkpIHtcbiAgICAgIGNvbnN0IGkgPSBDZS5idWZmZXJlZEluZm8oQ2UudGltZVJhbmdlc1RvQXJyYXkodGhpcy5idWZmZXJlZC5hdWRpbyksIGUsIDApO1xuICAgICAgaWYgKGkubGVuID4gMSAmJiB0ID49IGkuc3RhcnQpIHtcbiAgICAgICAgY29uc3QgbyA9IENlLnRpbWVSYW5nZXNUb0FycmF5KG4pLCBhID0gQ2UuYnVmZmVyZWRJbmZvKG8sIHQsIDApLmJ1ZmZlcmVkSW5kZXg7XG4gICAgICAgIGlmIChhID4gLTEgJiYgYSA8IG8ubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGNvbnN0IGwgPSBDZS5idWZmZXJlZEluZm8obywgZSwgMCkuYnVmZmVyZWRJbmRleCwgYyA9IG9bYV0uZW5kLCB1ID0gb1thICsgMV0uc3RhcnQ7XG4gICAgICAgICAgaWYgKChsID09PSAtMSB8fCBsID4gYSkgJiYgdSAtIGMgPCAxICYmIC8vIGBtYXhCdWZmZXJIb2xlYCBtYXkgYmUgdG9vIHNtYWxsIGFuZCBzZXR0aW5nIGl0IHRvIDAgc2hvdWxkIG5vdCBkaXNhYmxlIHRoaXMgZmVhdHVyZVxuICAgICAgICAgIGUgLSBjIDwgMikge1xuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBFcnJvcihgbnVkZ2luZyBwbGF5aGVhZCB0byBmbHVzaCBwaXBlbGluZSBhZnRlciB2aWRlbyBob2xlLiBjdXJyZW50VGltZTogJHtlfSBob2xlOiAke2N9IC0+ICR7dX0gYnVmZmVyZWQgaW5kZXg6ICR7bH1gKTtcbiAgICAgICAgICAgIHRoaXMud2FybihkLm1lc3NhZ2UpLCB0aGlzLm1lZGlhLmN1cnJlbnRUaW1lICs9IDFlLTY7XG4gICAgICAgICAgICBsZXQgaCA9IHNvKGUsIHRoaXMuZnJhZ21lbnRUcmFja2VyKTtcbiAgICAgICAgICAgIGggJiYgXCJmcmFnbWVudFwiIGluIGggPyBoID0gaC5mcmFnbWVudCA6IGggfHwgKGggPSB2b2lkIDApO1xuICAgICAgICAgICAgY29uc3QgZiA9IENlLmJ1ZmZlckluZm8odGhpcy5tZWRpYSwgZSwgMCk7XG4gICAgICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICAgICAgdHlwZTogdmUuTUVESUFfRVJST1IsXG4gICAgICAgICAgICAgIGRldGFpbHM6IEouQlVGRkVSX1NFRUtfT1ZFUl9IT0xFLFxuICAgICAgICAgICAgICBmYXRhbDogITEsXG4gICAgICAgICAgICAgIGVycm9yOiBkLFxuICAgICAgICAgICAgICByZWFzb246IGQubWVzc2FnZSxcbiAgICAgICAgICAgICAgZnJhZzogaCxcbiAgICAgICAgICAgICAgYnVmZmVyOiBmLmxlbixcbiAgICAgICAgICAgICAgYnVmZmVySW5mbzogZlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBEZXRlY3RzIGFuZCBhdHRlbXB0cyB0byBmaXgga25vd24gYnVmZmVyIHN0YWxsaW5nIGlzc3Vlcy5cbiAgICogQHBhcmFtIGJ1ZmZlckluZm8gLSBUaGUgcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBidWZmZXIuXG4gICAqIEBwYXJhbSBzdGFsbGVkRHVyYXRpb25NcyAtIFRoZSBhbW91bnQgb2YgdGltZSBIbHMuanMgaGFzIGJlZW4gc3RhbGxpbmcgZm9yLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3RyeUZpeEJ1ZmZlclN0YWxsKGUsIHQsIHIpIHtcbiAgICB2YXIgbiwgaTtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnbWVudFRyYWNrZXI6IG8sXG4gICAgICBtZWRpYTogYVxuICAgIH0gPSB0aGlzLCBsID0gKG4gPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IG4uY29uZmlnO1xuICAgIGlmICghYSB8fCAhbyB8fCAhbClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBjID0gKGkgPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IGkubGF0ZXN0TGV2ZWxEZXRhaWxzLCB1ID0gc28ociwgbyk7XG4gICAgaWYgKCh1IHx8IGMgIT0gbnVsbCAmJiBjLmxpdmUgJiYgciA8IGMuZnJhZ21lbnRTdGFydCkgJiYgKHRoaXMuX3RyeVNraXBCdWZmZXJIb2xlKHUpIHx8ICF0aGlzLm1lZGlhKSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBkID0gZS5idWZmZXJlZCwgaCA9IHRoaXMuYWRqYWNlbnRUcmF2ZXJzYWwoZSwgcik7XG4gICAgKGQgJiYgZC5sZW5ndGggPiAxICYmIGUubGVuID4gbC5tYXhCdWZmZXJIb2xlIHx8IGUubmV4dFN0YXJ0ICYmIChlLm5leHRTdGFydCAtIHIgPCBsLm1heEJ1ZmZlckhvbGUgfHwgaCkpICYmICh0ID4gbC5oaWdoQnVmZmVyV2F0Y2hkb2dQZXJpb2QgKiAxZTMgfHwgdGhpcy53YWl0aW5nKSAmJiAodGhpcy53YXJuKFwiVHJ5aW5nIHRvIG51ZGdlIHBsYXloZWFkIG92ZXIgYnVmZmVyLWhvbGVcIiksIHRoaXMuX3RyeU51ZGdlQnVmZmVyKGUpKTtcbiAgfVxuICBhZGphY2VudFRyYXZlcnNhbChlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuZnJhZ21lbnRUcmFja2VyLCBuID0gZS5uZXh0U3RhcnQ7XG4gICAgaWYgKHIgJiYgbikge1xuICAgICAgY29uc3QgaSA9IHIuZ2V0RnJhZ0F0UG9zKHQsIHBlLk1BSU4pLCBvID0gci5nZXRGcmFnQXRQb3MobiwgcGUuTUFJTik7XG4gICAgICBpZiAoaSAmJiBvKVxuICAgICAgICByZXR1cm4gby5zbiAtIGkuc24gPCAyO1xuICAgIH1cbiAgICByZXR1cm4gITE7XG4gIH1cbiAgLyoqXG4gICAqIFRyaWdnZXJzIGEgQlVGRkVSX1NUQUxMRURfRVJST1IgZXZlbnQsIGJ1dCBvbmx5IG9uY2UgcGVyIHN0YWxsIHBlcmlvZC5cbiAgICogQHBhcmFtIGJ1ZmZlckxlbiAtIFRoZSBwbGF5aGVhZCBkaXN0YW5jZSBmcm9tIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIHNlZ21lbnQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVwb3J0U3RhbGwoZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogdCxcbiAgICAgIG1lZGlhOiByLFxuICAgICAgc3RhbGxSZXBvcnRlZDogbixcbiAgICAgIHN0YWxsZWQ6IGlcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIW4gJiYgaSAhPT0gbnVsbCAmJiByICYmIHQpIHtcbiAgICAgIHRoaXMuc3RhbGxSZXBvcnRlZCA9ICEwO1xuICAgICAgY29uc3QgbyA9IG5ldyBFcnJvcihgUGxheWJhY2sgc3RhbGxpbmcgYXQgQCR7ci5jdXJyZW50VGltZX0gZHVlIHRvIGxvdyBidWZmZXIgKCR7YXQoZSl9KWApO1xuICAgICAgdGhpcy53YXJuKG8ubWVzc2FnZSksIHQudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLkJVRkZFUl9TVEFMTEVEX0VSUk9SLFxuICAgICAgICBmYXRhbDogITEsXG4gICAgICAgIGVycm9yOiBvLFxuICAgICAgICBidWZmZXI6IGUubGVuLFxuICAgICAgICBidWZmZXJJbmZvOiBlLFxuICAgICAgICBzdGFsbGVkOiB7XG4gICAgICAgICAgc3RhcnQ6IGlcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byBmaXggYnVmZmVyIHN0YWxscyBieSBqdW1waW5nIG92ZXIga25vd24gZ2FwcyBjYXVzZWQgYnkgcGFydGlhbCBmcmFnbWVudHNcbiAgICogQHBhcmFtIGFwcGVuZGVkIC0gVGhlIGZyYWdtZW50IG9yIHBhcnQgZm91bmQgYXQgdGhlIGN1cnJlbnQgdGltZSAod2hlcmUgcGxheWJhY2sgaXMgc3RhbGxpbmcpLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3RyeVNraXBCdWZmZXJIb2xlKGUpIHtcbiAgICB2YXIgdDtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnbWVudFRyYWNrZXI6IHIsXG4gICAgICBtZWRpYTogblxuICAgIH0gPSB0aGlzLCBpID0gKHQgPSB0aGlzLmhscykgPT0gbnVsbCA/IHZvaWQgMCA6IHQuY29uZmlnO1xuICAgIGlmICghbiB8fCAhciB8fCAhaSlcbiAgICAgIHJldHVybiAwO1xuICAgIGNvbnN0IG8gPSBuLmN1cnJlbnRUaW1lLCBhID0gQ2UuYnVmZmVySW5mbyhuLCBvLCAwKSwgbCA9IG8gPCBhLnN0YXJ0ID8gYS5zdGFydCA6IGEubmV4dFN0YXJ0O1xuICAgIGlmIChsICYmIHRoaXMuaGxzKSB7XG4gICAgICBjb25zdCB1ID0gYS5sZW4gPD0gaS5tYXhCdWZmZXJIb2xlLCBkID0gYS5sZW4gPiAwICYmIGEubGVuIDwgMSAmJiBuLnJlYWR5U3RhdGUgPCAzLCBoID0gbCAtIG87XG4gICAgICBpZiAoaCA+IDAgJiYgKHUgfHwgZCkpIHtcbiAgICAgICAgaWYgKGggPiBpLm1heEJ1ZmZlckhvbGUpIHtcbiAgICAgICAgICBsZXQgcCA9ICExO1xuICAgICAgICAgIGlmIChvID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCB5ID0gci5nZXRBcHBlbmRlZEZyYWcoMCwgcGUuTUFJTik7XG4gICAgICAgICAgICB5ICYmIGwgPCB5LmVuZCAmJiAocCA9ICEwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFwICYmIGUpIHtcbiAgICAgICAgICAgIHZhciBjO1xuICAgICAgICAgICAgaWYgKCEoKGMgPSB0aGlzLmhscy5sb2FkTGV2ZWxPYmopICE9IG51bGwgJiYgYy5kZXRhaWxzKSB8fCBjZih0aGlzLmhscy5pbkZsaWdodEZyYWdtZW50cywgbCkpXG4gICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgICAgbGV0IEUgPSAhMSwgYiA9IGUuZW5kO1xuICAgICAgICAgICAgZm9yICg7IGIgPCBsOyApIHtcbiAgICAgICAgICAgICAgY29uc3QgUiA9IHNvKGIsIHIpO1xuICAgICAgICAgICAgICBpZiAoUilcbiAgICAgICAgICAgICAgICBiICs9IFIuZHVyYXRpb247XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIEUgPSAhMDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKEUpXG4gICAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmID0gTWF0aC5tYXgobCArIGRBLCBvICsgdUEpO1xuICAgICAgICBpZiAodGhpcy53YXJuKGBza2lwcGluZyBob2xlLCBhZGp1c3RpbmcgY3VycmVudFRpbWUgZnJvbSAke299IHRvICR7Zn1gKSwgdGhpcy5tb3ZlZCA9ICEwLCBuLmN1cnJlbnRUaW1lID0gZiwgIShlICE9IG51bGwgJiYgZS5nYXApKSB7XG4gICAgICAgICAgY29uc3QgcCA9IG5ldyBFcnJvcihgZnJhZ21lbnQgbG9hZGVkIHdpdGggYnVmZmVyIGhvbGVzLCBzZWVraW5nIGZyb20gJHtvfSB0byAke2Z9YCksIHkgPSB7XG4gICAgICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgICAgIGRldGFpbHM6IEouQlVGRkVSX1NFRUtfT1ZFUl9IT0xFLFxuICAgICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgICAgZXJyb3I6IHAsXG4gICAgICAgICAgICByZWFzb246IHAubWVzc2FnZSxcbiAgICAgICAgICAgIGJ1ZmZlcjogYS5sZW4sXG4gICAgICAgICAgICBidWZmZXJJbmZvOiBhXG4gICAgICAgICAgfTtcbiAgICAgICAgICBlICYmIChcImZyYWdtZW50XCIgaW4gZSA/IHkucGFydCA9IGUgOiB5LmZyYWcgPSBlKSwgdGhpcy5obHMudHJpZ2dlcihJLkVSUk9SLCB5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZjtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIGZpeCBidWZmZXIgc3RhbGxzIGJ5IGFkdmFuY2luZyB0aGUgbWVkaWFFbGVtZW50J3MgY3VycmVudCB0aW1lIGJ5IGEgc21hbGwgYW1vdW50LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3RyeU51ZGdlQnVmZmVyKGUpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IHQsXG4gICAgICBtZWRpYTogcixcbiAgICAgIG51ZGdlUmV0cnk6IG5cbiAgICB9ID0gdGhpcywgaSA9IHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuY29uZmlnO1xuICAgIGlmICghciB8fCAhaSlcbiAgICAgIHJldHVybiAwO1xuICAgIGNvbnN0IG8gPSByLmN1cnJlbnRUaW1lO1xuICAgIGlmICh0aGlzLm51ZGdlUmV0cnkrKywgbiA8IGkubnVkZ2VNYXhSZXRyeSkge1xuICAgICAgY29uc3QgYSA9IG8gKyAobiArIDEpICogaS5udWRnZU9mZnNldCwgbCA9IG5ldyBFcnJvcihgTnVkZ2luZyAnY3VycmVudFRpbWUnIGZyb20gJHtvfSB0byAke2F9YCk7XG4gICAgICB0aGlzLndhcm4obC5tZXNzYWdlKSwgci5jdXJyZW50VGltZSA9IGEsIHQudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLkJVRkZFUl9OVURHRV9PTl9TVEFMTCxcbiAgICAgICAgZXJyb3I6IGwsXG4gICAgICAgIGZhdGFsOiAhMSxcbiAgICAgICAgYnVmZmVyOiBlLmxlbixcbiAgICAgICAgYnVmZmVySW5mbzogZVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGEgPSBuZXcgRXJyb3IoYFBsYXloZWFkIHN0aWxsIG5vdCBtb3Zpbmcgd2hpbGUgZW5vdWdoIGRhdGEgYnVmZmVyZWQgQCR7b30gYWZ0ZXIgJHtpLm51ZGdlTWF4UmV0cnl9IG51ZGdlc2ApO1xuICAgICAgdGhpcy5lcnJvcihhLm1lc3NhZ2UpLCB0LnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICB0eXBlOiB2ZS5NRURJQV9FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5CVUZGRVJfU1RBTExFRF9FUlJPUixcbiAgICAgICAgZXJyb3I6IGEsXG4gICAgICAgIGZhdGFsOiAhMCxcbiAgICAgICAgYnVmZmVyOiBlLmxlbixcbiAgICAgICAgYnVmZmVySW5mbzogZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjZihzLCBlKSB7XG4gIGNvbnN0IHQgPSB1ZihzLm1haW4pO1xuICBpZiAodCAmJiB0LnN0YXJ0IDw9IGUpXG4gICAgcmV0dXJuIHQ7XG4gIGNvbnN0IHIgPSB1ZihzLmF1ZGlvKTtcbiAgcmV0dXJuIHIgJiYgci5zdGFydCA8PSBlID8gciA6IG51bGw7XG59XG5mdW5jdGlvbiB1ZihzKSB7XG4gIGlmICghcylcbiAgICByZXR1cm4gbnVsbDtcbiAgc3dpdGNoIChzLnN0YXRlKSB7XG4gICAgY2FzZSBuZS5JRExFOlxuICAgIGNhc2UgbmUuU1RPUFBFRDpcbiAgICBjYXNlIG5lLkVOREVEOlxuICAgIGNhc2UgbmUuRVJST1I6XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4gcy5mcmFnO1xufVxuZnVuY3Rpb24gc28ocywgZSkge1xuICByZXR1cm4gZS5nZXRBcHBlbmRlZEZyYWcocywgcGUuTUFJTikgfHwgZS5nZXRQYXJ0aWFsRnJhZ21lbnQocyk7XG59XG5jb25zdCBnQSA9IDAuMjU7XG5mdW5jdGlvbiB3YygpIHtcbiAgaWYgKCEodHlwZW9mIHNlbGYgPiBcInVcIikpXG4gICAgcmV0dXJuIHNlbGYuVlRUQ3VlIHx8IHNlbGYuVGV4dFRyYWNrQ3VlO1xufVxuZnVuY3Rpb24gQ2wocywgZSwgdCwgciwgbikge1xuICBsZXQgaSA9IG5ldyBzKGUsIHQsIFwiXCIpO1xuICB0cnkge1xuICAgIGkudmFsdWUgPSByLCBuICYmIChpLnR5cGUgPSBuKTtcbiAgfSBjYXRjaCB7XG4gICAgaSA9IG5ldyBzKGUsIHQsIGF0KG4gPyB0dCh7XG4gICAgICB0eXBlOiBuXG4gICAgfSwgcikgOiByKSk7XG4gIH1cbiAgcmV0dXJuIGk7XG59XG5jb25zdCBubyA9ICgoKSA9PiB7XG4gIGNvbnN0IHMgPSB3YygpO1xuICB0cnkge1xuICAgIHMgJiYgbmV3IHMoMCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLCBcIlwiKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIE51bWJlci5NQVhfVkFMVUU7XG4gIH1cbiAgcmV0dXJuIE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcbn0pKCk7XG5jbGFzcyBwQSB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5pZDNUcmFjayA9IG51bGwsIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLmRhdGVSYW5nZUN1ZXNBcHBlbmRlZCA9IHt9LCB0aGlzLnJlbW92ZUN1ZXMgPSAhMCwgdGhpcy5hc3NldEN1ZSA9IHZvaWQgMCwgdGhpcy5vbkV2ZW50Q3VlRW50ZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLmhscyAmJiB0aGlzLmhscy50cmlnZ2VyKEkuRVZFTlRfQ1VFX0VOVEVSLCB7fSk7XG4gICAgfSwgdGhpcy5obHMgPSBlLCB0aGlzLl9yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fdW5yZWdpc3Rlckxpc3RlbmVycygpLCB0aGlzLmlkM1RyYWNrID0gbnVsbCwgdGhpcy5tZWRpYSA9IG51bGwsIHRoaXMuZGF0ZVJhbmdlQ3Vlc0FwcGVuZGVkID0ge30sIHRoaXMuaGxzID0gdGhpcy5vbkV2ZW50Q3VlRW50ZXIgPSBudWxsO1xuICB9XG4gIF9yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlICYmIChlLm9uKEkuTUVESUFfQVRUQUNISU5HLCB0aGlzLm9uTWVkaWFBdHRhY2hpbmcsIHRoaXMpLCBlLm9uKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgZS5vbihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuRlJBR19QQVJTSU5HX01FVEFEQVRBLCB0aGlzLm9uRnJhZ1BhcnNpbmdNZXRhZGF0YSwgdGhpcyksIGUub24oSS5CVUZGRVJfRkxVU0hJTkcsIHRoaXMub25CdWZmZXJGbHVzaGluZywgdGhpcyksIGUub24oSS5MRVZFTF9VUERBVEVELCB0aGlzLm9uTGV2ZWxVcGRhdGVkLCB0aGlzKSwgZS5vbihJLkxFVkVMX1BUU19VUERBVEVELCB0aGlzLm9uTGV2ZWxQdHNVcGRhdGVkLCB0aGlzKSk7XG4gIH1cbiAgX3VucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZSAmJiAoZS5vZmYoSS5NRURJQV9BVFRBQ0hJTkcsIHRoaXMub25NZWRpYUF0dGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgZS5vZmYoSS5NRURJQV9ERVRBQ0hJTkcsIHRoaXMub25NZWRpYURldGFjaGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuRlJBR19QQVJTSU5HX01FVEFEQVRBLCB0aGlzLm9uRnJhZ1BhcnNpbmdNZXRhZGF0YSwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0ZMVVNISU5HLCB0aGlzLm9uQnVmZmVyRmx1c2hpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1BUU19VUERBVEVELCB0aGlzLm9uTGV2ZWxQdHNVcGRhdGVkLCB0aGlzKSk7XG4gIH1cbiAgLy8gQWRkIElEMyBtZXRhdGFkYXRhIHRleHQgdHJhY2suXG4gIG9uTWVkaWFBdHRhY2hpbmcoZSwgdCkge1xuICAgIHZhciByO1xuICAgIHRoaXMubWVkaWEgPSB0Lm1lZGlhLCAoKHIgPSB0Lm92ZXJyaWRlcykgPT0gbnVsbCA/IHZvaWQgMCA6IHIuY3VlUmVtb3ZhbCkgPT09ICExICYmICh0aGlzLnJlbW92ZUN1ZXMgPSAhMSk7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGVkKCkge1xuICAgIHZhciBlO1xuICAgIGNvbnN0IHQgPSAoZSA9IHRoaXMuaGxzKSA9PSBudWxsID8gdm9pZCAwIDogZS5sYXRlc3RMZXZlbERldGFpbHM7XG4gICAgdCAmJiB0aGlzLnVwZGF0ZURhdGVSYW5nZUN1ZXModCk7XG4gIH1cbiAgb25NZWRpYURldGFjaGluZyhlLCB0KSB7XG4gICAgdGhpcy5tZWRpYSA9IG51bGwsICF0LnRyYW5zZmVyTWVkaWEgJiYgKHRoaXMuaWQzVHJhY2sgJiYgKHRoaXMucmVtb3ZlQ3VlcyAmJiBTbih0aGlzLmlkM1RyYWNrLCB0aGlzLm9uRXZlbnRDdWVFbnRlciksIHRoaXMuaWQzVHJhY2sgPSBudWxsKSwgdGhpcy5kYXRlUmFuZ2VDdWVzQXBwZW5kZWQgPSB7fSk7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5kYXRlUmFuZ2VDdWVzQXBwZW5kZWQgPSB7fTtcbiAgfVxuICBjcmVhdGVUcmFjayhlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuZ2V0SUQzVHJhY2soZS50ZXh0VHJhY2tzKTtcbiAgICByZXR1cm4gdC5tb2RlID0gXCJoaWRkZW5cIiwgdDtcbiAgfVxuICBnZXRJRDNUcmFjayhlKSB7XG4gICAgaWYgKHRoaXMubWVkaWEpIHtcbiAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgZS5sZW5ndGg7IHQrKykge1xuICAgICAgICBjb25zdCByID0gZVt0XTtcbiAgICAgICAgaWYgKHIua2luZCA9PT0gXCJtZXRhZGF0YVwiICYmIHIubGFiZWwgPT09IFwiaWQzXCIpXG4gICAgICAgICAgcmV0dXJuIE5wKHIsIHRoaXMubWVkaWEpLCByO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMubWVkaWEuYWRkVGV4dFRyYWNrKFwibWV0YWRhdGFcIiwgXCJpZDNcIik7XG4gICAgfVxuICB9XG4gIG9uRnJhZ1BhcnNpbmdNZXRhZGF0YShlLCB0KSB7XG4gICAgaWYgKCF0aGlzLm1lZGlhIHx8ICF0aGlzLmhscylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVFbXNnTWV0YWRhdGFDdWVzOiByLFxuICAgICAgZW5hYmxlSUQzTWV0YWRhdGFDdWVzOiBuXG4gICAgfSA9IHRoaXMuaGxzLmNvbmZpZztcbiAgICBpZiAoIXIgJiYgIW4pXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgc2FtcGxlczogaVxuICAgIH0gPSB0O1xuICAgIHRoaXMuaWQzVHJhY2sgfHwgKHRoaXMuaWQzVHJhY2sgPSB0aGlzLmNyZWF0ZVRyYWNrKHRoaXMubWVkaWEpKTtcbiAgICBjb25zdCBvID0gd2MoKTtcbiAgICBpZiAobylcbiAgICAgIGZvciAobGV0IGEgPSAwOyBhIDwgaS5sZW5ndGg7IGErKykge1xuICAgICAgICBjb25zdCBsID0gaVthXS50eXBlO1xuICAgICAgICBpZiAobCA9PT0gYnIuZW1zZyAmJiAhciB8fCAhbilcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgY29uc3QgYyA9IGhwKGlbYV0uZGF0YSksIHUgPSBpW2FdLnB0cztcbiAgICAgICAgbGV0IGQgPSB1ICsgaVthXS5kdXJhdGlvbjtcbiAgICAgICAgZCA+IG5vICYmIChkID0gbm8pLCBkIC0gdSA8PSAwICYmIChkID0gdSArIGdBKTtcbiAgICAgICAgZm9yIChsZXQgZiA9IDA7IGYgPCBjLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgY29uc3QgcCA9IGNbZl07XG4gICAgICAgICAgaWYgKCFmcChwKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVJZDNDdWVFbmRzKHUsIGwpO1xuICAgICAgICAgICAgY29uc3QgeSA9IENsKG8sIHUsIGQsIHAsIGwpO1xuICAgICAgICAgICAgeSAmJiB0aGlzLmlkM1RyYWNrLmFkZEN1ZSh5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuICB1cGRhdGVJZDNDdWVFbmRzKGUsIHQpIHtcbiAgICB2YXIgcjtcbiAgICBjb25zdCBuID0gKHIgPSB0aGlzLmlkM1RyYWNrKSA9PSBudWxsID8gdm9pZCAwIDogci5jdWVzO1xuICAgIGlmIChuKVxuICAgICAgZm9yIChsZXQgaSA9IG4ubGVuZ3RoOyBpLS07ICkge1xuICAgICAgICBjb25zdCBvID0gbltpXTtcbiAgICAgICAgby50eXBlID09PSB0ICYmIG8uc3RhcnRUaW1lIDwgZSAmJiBvLmVuZFRpbWUgPT09IG5vICYmIChvLmVuZFRpbWUgPSBlKTtcbiAgICAgIH1cbiAgfVxuICBvbkJ1ZmZlckZsdXNoaW5nKGUsIHtcbiAgICBzdGFydE9mZnNldDogdCxcbiAgICBlbmRPZmZzZXQ6IHIsXG4gICAgdHlwZTogblxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgaWQzVHJhY2s6IGksXG4gICAgICBobHM6IG9cbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIW8pXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGVuYWJsZUVtc2dNZXRhZGF0YUN1ZXM6IGEsXG4gICAgICAgIGVuYWJsZUlEM01ldGFkYXRhQ3VlczogbFxuICAgICAgfVxuICAgIH0gPSBvO1xuICAgIGlmIChpICYmIChhIHx8IGwpKSB7XG4gICAgICBsZXQgYztcbiAgICAgIG4gPT09IFwiYXVkaW9cIiA/IGMgPSAodSkgPT4gdS50eXBlID09PSBici5hdWRpb0lkMyAmJiBsIDogbiA9PT0gXCJ2aWRlb1wiID8gYyA9ICh1KSA9PiB1LnR5cGUgPT09IGJyLmVtc2cgJiYgYSA6IGMgPSAodSkgPT4gdS50eXBlID09PSBici5hdWRpb0lkMyAmJiBsIHx8IHUudHlwZSA9PT0gYnIuZW1zZyAmJiBhLCBTYyhpLCB0LCByLCBjKTtcbiAgICB9XG4gIH1cbiAgb25MZXZlbFVwZGF0ZWQoZSwge1xuICAgIGRldGFpbHM6IHRcbiAgfSkge1xuICAgIHRoaXMudXBkYXRlRGF0ZVJhbmdlQ3Vlcyh0LCAhMCk7XG4gIH1cbiAgb25MZXZlbFB0c1VwZGF0ZWQoZSwgdCkge1xuICAgIE1hdGguYWJzKHQuZHJpZnQpID4gMC4wMSAmJiB0aGlzLnVwZGF0ZURhdGVSYW5nZUN1ZXModC5kZXRhaWxzKTtcbiAgfVxuICB1cGRhdGVEYXRlUmFuZ2VDdWVzKGUsIHQpIHtcbiAgICBpZiAoIXRoaXMuaGxzIHx8ICF0aGlzLm1lZGlhKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHtcbiAgICAgIGFzc2V0UGxheWVySWQ6IHIsXG4gICAgICB0aW1lbGluZU9mZnNldDogbixcbiAgICAgIGVuYWJsZURhdGVSYW5nZU1ldGFkYXRhQ3VlczogaSxcbiAgICAgIGludGVyc3RpdGlhbHNDb250cm9sbGVyOiBvXG4gICAgfSA9IHRoaXMuaGxzLmNvbmZpZztcbiAgICBpZiAoIWkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgYSA9IHdjKCk7XG4gICAgaWYgKHIgJiYgbiAmJiAhbykge1xuICAgICAgY29uc3Qge1xuICAgICAgICBmcmFnbWVudFN0YXJ0OiB5LFxuICAgICAgICBmcmFnbWVudEVuZDogRVxuICAgICAgfSA9IGU7XG4gICAgICBsZXQgYiA9IHRoaXMuYXNzZXRDdWU7XG4gICAgICBiID8gKGIuc3RhcnRUaW1lID0geSwgYi5lbmRUaW1lID0gRSkgOiBhICYmIChiID0gdGhpcy5hc3NldEN1ZSA9IENsKGEsIHksIEUsIHtcbiAgICAgICAgYXNzZXRQbGF5ZXJJZDogdGhpcy5obHMuY29uZmlnLmFzc2V0UGxheWVySWRcbiAgICAgIH0sIFwiaGxzanMuaW50ZXJzdGl0aWFsLmFzc2V0XCIpLCBiICYmIChiLmlkID0gciwgdGhpcy5pZDNUcmFjayB8fCAodGhpcy5pZDNUcmFjayA9IHRoaXMuY3JlYXRlVHJhY2sodGhpcy5tZWRpYSkpLCB0aGlzLmlkM1RyYWNrLmFkZEN1ZShiKSwgYi5hZGRFdmVudExpc3RlbmVyKFwiZW50ZXJcIiwgdGhpcy5vbkV2ZW50Q3VlRW50ZXIpKSk7XG4gICAgfVxuICAgIGlmICghZS5oYXNQcm9ncmFtRGF0ZVRpbWUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgaWQzVHJhY2s6IGxcbiAgICB9ID0gdGhpcywge1xuICAgICAgZGF0ZVJhbmdlczogY1xuICAgIH0gPSBlLCB1ID0gT2JqZWN0LmtleXMoYyk7XG4gICAgbGV0IGQgPSB0aGlzLmRhdGVSYW5nZUN1ZXNBcHBlbmRlZDtcbiAgICBpZiAobCAmJiB0KSB7XG4gICAgICB2YXIgaDtcbiAgICAgIGlmICgoaCA9IGwuY3VlcykgIT0gbnVsbCAmJiBoLmxlbmd0aCkge1xuICAgICAgICBjb25zdCB5ID0gT2JqZWN0LmtleXMoZCkuZmlsdGVyKChFKSA9PiAhdS5pbmNsdWRlcyhFKSk7XG4gICAgICAgIGZvciAobGV0IEUgPSB5Lmxlbmd0aDsgRS0tOyApIHtcbiAgICAgICAgICB2YXIgZjtcbiAgICAgICAgICBjb25zdCBiID0geVtFXSwgUiA9IChmID0gZFtiXSkgPT0gbnVsbCA/IHZvaWQgMCA6IGYuY3VlcztcbiAgICAgICAgICBkZWxldGUgZFtiXSwgUiAmJiBPYmplY3Qua2V5cyhSKS5mb3JFYWNoKChBKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBGID0gUltBXTtcbiAgICAgICAgICAgIGlmIChGKSB7XG4gICAgICAgICAgICAgIEYucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImVudGVyXCIsIHRoaXMub25FdmVudEN1ZUVudGVyKTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBsLnJlbW92ZUN1ZShGKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlXG4gICAgICAgIGQgPSB0aGlzLmRhdGVSYW5nZUN1ZXNBcHBlbmRlZCA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBwID0gZS5mcmFnbWVudHNbZS5mcmFnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgaWYgKCEodS5sZW5ndGggPT09IDAgfHwgIXVlKHAgPT0gbnVsbCA/IHZvaWQgMCA6IHAucHJvZ3JhbURhdGVUaW1lKSkpIHtcbiAgICAgIHRoaXMuaWQzVHJhY2sgfHwgKHRoaXMuaWQzVHJhY2sgPSB0aGlzLmNyZWF0ZVRyYWNrKHRoaXMubWVkaWEpKTtcbiAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgdS5sZW5ndGg7IHkrKykge1xuICAgICAgICBjb25zdCBFID0gdVt5XSwgYiA9IGNbRV0sIFIgPSBiLnN0YXJ0VGltZSwgQSA9IGRbRV0sIEYgPSAoQSA9PSBudWxsID8gdm9pZCAwIDogQS5jdWVzKSB8fCB7fTtcbiAgICAgICAgbGV0IE0gPSAoQSA9PSBudWxsID8gdm9pZCAwIDogQS5kdXJhdGlvbktub3duKSB8fCAhMSwgSCA9IG5vO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgZHVyYXRpb246IEssXG4gICAgICAgICAgZW5kRGF0ZTogalxuICAgICAgICB9ID0gYjtcbiAgICAgICAgaWYgKGogJiYgSyAhPT0gbnVsbClcbiAgICAgICAgICBIID0gUiArIEssIE0gPSAhMDtcbiAgICAgICAgZWxzZSBpZiAoYi5lbmRPbk5leHQgJiYgIU0pIHtcbiAgICAgICAgICBjb25zdCBrID0gdS5yZWR1Y2UoKCQsIFcpID0+IHtcbiAgICAgICAgICAgIGlmIChXICE9PSBiLmlkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IF8gPSBjW1ddO1xuICAgICAgICAgICAgICBpZiAoXy5jbGFzcyA9PT0gYi5jbGFzcyAmJiBfLnN0YXJ0RGF0ZSA+IGIuc3RhcnREYXRlICYmICghJCB8fCBiLnN0YXJ0RGF0ZSA8ICQuc3RhcnREYXRlKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gXztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAkO1xuICAgICAgICAgIH0sIG51bGwpO1xuICAgICAgICAgIGsgJiYgKEggPSBrLnN0YXJ0VGltZSwgTSA9ICEwKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBDID0gT2JqZWN0LmtleXMoYi5hdHRyKTtcbiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBDLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgY29uc3QgJCA9IENba107XG4gICAgICAgICAgaWYgKCFPYigkKSlcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IFcgPSBGWyRdO1xuICAgICAgICAgIGlmIChXKVxuICAgICAgICAgICAgTSAmJiAhKEEgIT0gbnVsbCAmJiBBLmR1cmF0aW9uS25vd24pID8gVy5lbmRUaW1lID0gSCA6IE1hdGguYWJzKFcuc3RhcnRUaW1lIC0gUikgPiAwLjAxICYmIChXLnN0YXJ0VGltZSA9IFIsIFcuZW5kVGltZSA9IEgpO1xuICAgICAgICAgIGVsc2UgaWYgKGEpIHtcbiAgICAgICAgICAgIGxldCBfID0gYi5hdHRyWyRdO1xuICAgICAgICAgICAgQmIoJCkgJiYgKF8gPSBJZyhfKSk7XG4gICAgICAgICAgICBjb25zdCB4ID0gQ2woYSwgUiwgSCwge1xuICAgICAgICAgICAgICBrZXk6ICQsXG4gICAgICAgICAgICAgIGRhdGE6IF9cbiAgICAgICAgICAgIH0sIGJyLmRhdGVSYW5nZSk7XG4gICAgICAgICAgICB4ICYmICh4LmlkID0gRSwgdGhpcy5pZDNUcmFjay5hZGRDdWUoeCksIEZbJF0gPSB4LCBvICYmICgkID09PSBcIlgtQVNTRVQtTElTVFwiIHx8ICQgPT09IFwiWC1BU1NFVC1VUkxcIikgJiYgeC5hZGRFdmVudExpc3RlbmVyKFwiZW50ZXJcIiwgdGhpcy5vbkV2ZW50Q3VlRW50ZXIpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZFtFXSA9IHtcbiAgICAgICAgICBjdWVzOiBGLFxuICAgICAgICAgIGRhdGVSYW5nZTogYixcbiAgICAgICAgICBkdXJhdGlvbktub3duOiBNXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5jbGFzcyBtQSB7XG4gIGNvbnN0cnVjdG9yKGUpIHtcbiAgICB0aGlzLmhscyA9IHZvaWQgMCwgdGhpcy5jb25maWcgPSB2b2lkIDAsIHRoaXMubWVkaWEgPSBudWxsLCB0aGlzLmN1cnJlbnRUaW1lID0gMCwgdGhpcy5zdGFsbENvdW50ID0gMCwgdGhpcy5fbGF0ZW5jeSA9IG51bGwsIHRoaXMuX3RhcmdldExhdGVuY3lVcGRhdGVkID0gITEsIHRoaXMub25UaW1ldXBkYXRlID0gKCkgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtZWRpYTogdFxuICAgICAgfSA9IHRoaXMsIHIgPSB0aGlzLmxldmVsRGV0YWlscztcbiAgICAgIGlmICghdCB8fCAhcilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5jdXJyZW50VGltZSA9IHQuY3VycmVudFRpbWU7XG4gICAgICBjb25zdCBuID0gdGhpcy5jb21wdXRlTGF0ZW5jeSgpO1xuICAgICAgaWYgKG4gPT09IG51bGwpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRoaXMuX2xhdGVuY3kgPSBuO1xuICAgICAgY29uc3Qge1xuICAgICAgICBsb3dMYXRlbmN5TW9kZTogaSxcbiAgICAgICAgbWF4TGl2ZVN5bmNQbGF5YmFja1JhdGU6IG9cbiAgICAgIH0gPSB0aGlzLmNvbmZpZztcbiAgICAgIGlmICghaSB8fCBvID09PSAxIHx8ICFyLmxpdmUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IGEgPSB0aGlzLnRhcmdldExhdGVuY3k7XG4gICAgICBpZiAoYSA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgbCA9IG4gLSBhLCBjID0gTWF0aC5taW4odGhpcy5tYXhMYXRlbmN5LCBhICsgci50YXJnZXRkdXJhdGlvbik7XG4gICAgICBpZiAobCA8IGMgJiYgbCA+IDAuMDUgJiYgdGhpcy5mb3J3YXJkQnVmZmVyTGVuZ3RoID4gMSkge1xuICAgICAgICBjb25zdCBkID0gTWF0aC5taW4oMiwgTWF0aC5tYXgoMSwgbykpLCBoID0gTWF0aC5yb3VuZCgyIC8gKDEgKyBNYXRoLmV4cCgtMC43NSAqIGwgLSB0aGlzLmVkZ2VTdGFsbGVkKSkgKiAyMCkgLyAyMCwgZiA9IE1hdGgubWluKGQsIE1hdGgubWF4KDEsIGgpKTtcbiAgICAgICAgdGhpcy5jaGFuZ2VNZWRpYVBsYXliYWNrUmF0ZSh0LCBmKTtcbiAgICAgIH0gZWxzZSB0LnBsYXliYWNrUmF0ZSAhPT0gMSAmJiB0LnBsYXliYWNrUmF0ZSAhPT0gMCAmJiB0aGlzLmNoYW5nZU1lZGlhUGxheWJhY2tSYXRlKHQsIDEpO1xuICAgIH0sIHRoaXMuaGxzID0gZSwgdGhpcy5jb25maWcgPSBlLmNvbmZpZywgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIGdldCBsZXZlbERldGFpbHMoKSB7XG4gICAgdmFyIGU7XG4gICAgcmV0dXJuICgoZSA9IHRoaXMuaGxzKSA9PSBudWxsID8gdm9pZCAwIDogZS5sYXRlc3RMZXZlbERldGFpbHMpIHx8IG51bGw7XG4gIH1cbiAgZ2V0IGxhdGVuY3koKSB7XG4gICAgcmV0dXJuIHRoaXMuX2xhdGVuY3kgfHwgMDtcbiAgfVxuICBnZXQgbWF4TGF0ZW5jeSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb25maWc6IGVcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoZS5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uICE9PSB2b2lkIDApXG4gICAgICByZXR1cm4gZS5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uO1xuICAgIGNvbnN0IHQgPSB0aGlzLmxldmVsRGV0YWlscztcbiAgICByZXR1cm4gdCA/IGUubGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50ICogdC50YXJnZXRkdXJhdGlvbiA6IDA7XG4gIH1cbiAgZ2V0IHRhcmdldExhdGVuY3koKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubGV2ZWxEZXRhaWxzO1xuICAgIGlmIChlID09PSBudWxsIHx8IHRoaXMuaGxzID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3Qge1xuICAgICAgaG9sZEJhY2s6IHQsXG4gICAgICBwYXJ0SG9sZEJhY2s6IHIsXG4gICAgICB0YXJnZXRkdXJhdGlvbjogblxuICAgIH0gPSBlLCB7XG4gICAgICBsaXZlU3luY0R1cmF0aW9uOiBpLFxuICAgICAgbGl2ZVN5bmNEdXJhdGlvbkNvdW50OiBvLFxuICAgICAgbG93TGF0ZW5jeU1vZGU6IGFcbiAgICB9ID0gdGhpcy5jb25maWcsIGwgPSB0aGlzLmhscy51c2VyQ29uZmlnO1xuICAgIGxldCBjID0gYSAmJiByIHx8IHQ7XG4gICAgKHRoaXMuX3RhcmdldExhdGVuY3lVcGRhdGVkIHx8IGwubGl2ZVN5bmNEdXJhdGlvbiB8fCBsLmxpdmVTeW5jRHVyYXRpb25Db3VudCB8fCBjID09PSAwKSAmJiAoYyA9IGkgIT09IHZvaWQgMCA/IGkgOiBvICogbik7XG4gICAgY29uc3QgdSA9IG47XG4gICAgcmV0dXJuIGMgKyBNYXRoLm1pbih0aGlzLnN0YWxsQ291bnQgKiB0aGlzLmNvbmZpZy5saXZlU3luY09uU3RhbGxJbmNyZWFzZSwgdSk7XG4gIH1cbiAgc2V0IHRhcmdldExhdGVuY3koZSkge1xuICAgIHRoaXMuc3RhbGxDb3VudCA9IDAsIHRoaXMuY29uZmlnLmxpdmVTeW5jRHVyYXRpb24gPSBlLCB0aGlzLl90YXJnZXRMYXRlbmN5VXBkYXRlZCA9ICEwO1xuICB9XG4gIGdldCBsaXZlU3luY1Bvc2l0aW9uKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmVzdGltYXRlTGl2ZUVkZ2UoKSwgdCA9IHRoaXMudGFyZ2V0TGF0ZW5jeTtcbiAgICBpZiAoZSA9PT0gbnVsbCB8fCB0ID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgciA9IHRoaXMubGV2ZWxEZXRhaWxzO1xuICAgIGlmIChyID09PSBudWxsKVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbiA9IHIuZWRnZSwgaSA9IGUgLSB0IC0gdGhpcy5lZGdlU3RhbGxlZCwgbyA9IG4gLSByLnRvdGFsZHVyYXRpb24sIGEgPSBuIC0gKHRoaXMuY29uZmlnLmxvd0xhdGVuY3lNb2RlICYmIHIucGFydFRhcmdldCB8fCByLnRhcmdldGR1cmF0aW9uKTtcbiAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgobywgaSksIGEpO1xuICB9XG4gIGdldCBkcmlmdCgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5sZXZlbERldGFpbHM7XG4gICAgcmV0dXJuIGUgPT09IG51bGwgPyAxIDogZS5kcmlmdDtcbiAgfVxuICBnZXQgZWRnZVN0YWxsZWQoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubGV2ZWxEZXRhaWxzO1xuICAgIGlmIChlID09PSBudWxsKVxuICAgICAgcmV0dXJuIDA7XG4gICAgY29uc3QgdCA9ICh0aGlzLmNvbmZpZy5sb3dMYXRlbmN5TW9kZSAmJiBlLnBhcnRUYXJnZXQgfHwgZS50YXJnZXRkdXJhdGlvbikgKiAzO1xuICAgIHJldHVybiBNYXRoLm1heChlLmFnZSAtIHQsIDApO1xuICB9XG4gIGdldCBmb3J3YXJkQnVmZmVyTGVuZ3RoKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiBlXG4gICAgfSA9IHRoaXMsIHQgPSB0aGlzLmxldmVsRGV0YWlscztcbiAgICBpZiAoIWUgfHwgIXQpXG4gICAgICByZXR1cm4gMDtcbiAgICBjb25zdCByID0gZS5idWZmZXJlZC5sZW5ndGg7XG4gICAgcmV0dXJuIChyID8gZS5idWZmZXJlZC5lbmQociAtIDEpIDogdC5lZGdlKSAtIHRoaXMuY3VycmVudFRpbWU7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnVucmVnaXN0ZXJMaXN0ZW5lcnMoKSwgdGhpcy5vbk1lZGlhRGV0YWNoaW5nKCksIHRoaXMuaGxzID0gbnVsbDtcbiAgfVxuICByZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlICYmIChlLm9uKEkuTUVESUFfQVRUQUNIRUQsIHRoaXMub25NZWRpYUF0dGFjaGVkLCB0aGlzKSwgZS5vbihJLk1FRElBX0RFVEFDSElORywgdGhpcy5vbk1lZGlhRGV0YWNoaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTEVWRUxfVVBEQVRFRCwgdGhpcy5vbkxldmVsVXBkYXRlZCwgdGhpcyksIGUub24oSS5FUlJPUiwgdGhpcy5vbkVycm9yLCB0aGlzKSk7XG4gIH1cbiAgdW5yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBjb25zdCB7XG4gICAgICBobHM6IGVcbiAgICB9ID0gdGhpcztcbiAgICBlICYmIChlLm9mZihJLk1FRElBX0FUVEFDSEVELCB0aGlzLm9uTWVkaWFBdHRhY2hlZCwgdGhpcyksIGUub2ZmKEkuTUVESUFfREVUQUNISU5HLCB0aGlzLm9uTWVkaWFEZXRhY2hpbmcsIHRoaXMpLCBlLm9mZihJLk1BTklGRVNUX0xPQURJTkcsIHRoaXMub25NYW5pZmVzdExvYWRpbmcsIHRoaXMpLCBlLm9mZihJLkxFVkVMX1VQREFURUQsIHRoaXMub25MZXZlbFVwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpKTtcbiAgfVxuICBvbk1lZGlhQXR0YWNoZWQoZSwgdCkge1xuICAgIHRoaXMubWVkaWEgPSB0Lm1lZGlhLCB0aGlzLm1lZGlhLmFkZEV2ZW50TGlzdGVuZXIoXCJ0aW1ldXBkYXRlXCIsIHRoaXMub25UaW1ldXBkYXRlKTtcbiAgfVxuICBvbk1lZGlhRGV0YWNoaW5nKCkge1xuICAgIHRoaXMubWVkaWEgJiYgKHRoaXMubWVkaWEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRpbWV1cGRhdGVcIiwgdGhpcy5vblRpbWV1cGRhdGUpLCB0aGlzLm1lZGlhID0gbnVsbCk7XG4gIH1cbiAgb25NYW5pZmVzdExvYWRpbmcoKSB7XG4gICAgdGhpcy5fbGF0ZW5jeSA9IG51bGwsIHRoaXMuc3RhbGxDb3VudCA9IDA7XG4gIH1cbiAgb25MZXZlbFVwZGF0ZWQoZSwge1xuICAgIGRldGFpbHM6IHRcbiAgfSkge1xuICAgIHQuYWR2YW5jZWQgJiYgdGhpcy5vblRpbWV1cGRhdGUoKSwgIXQubGl2ZSAmJiB0aGlzLm1lZGlhICYmIHRoaXMubWVkaWEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRpbWV1cGRhdGVcIiwgdGhpcy5vblRpbWV1cGRhdGUpO1xuICB9XG4gIG9uRXJyb3IoZSwgdCkge1xuICAgIHZhciByO1xuICAgIHQuZGV0YWlscyA9PT0gSi5CVUZGRVJfU1RBTExFRF9FUlJPUiAmJiAodGhpcy5zdGFsbENvdW50KyssIHRoaXMuaGxzICYmIChyID0gdGhpcy5sZXZlbERldGFpbHMpICE9IG51bGwgJiYgci5saXZlICYmIHRoaXMuaGxzLmxvZ2dlci53YXJuKFwiW2xhdGVuY3ktY29udHJvbGxlcl06IFN0YWxsIGRldGVjdGVkLCBhZGp1c3RpbmcgdGFyZ2V0IGxhdGVuY3lcIikpO1xuICB9XG4gIGNoYW5nZU1lZGlhUGxheWJhY2tSYXRlKGUsIHQpIHtcbiAgICB2YXIgciwgbjtcbiAgICBlLnBsYXliYWNrUmF0ZSAhPT0gdCAmJiAoKHIgPSB0aGlzLmhscykgPT0gbnVsbCB8fCByLmxvZ2dlci5kZWJ1ZyhgW2xhdGVuY3ktY29udHJvbGxlcl06IGxhdGVuY3k9JHt0aGlzLmxhdGVuY3kudG9GaXhlZCgzKX0sIHRhcmdldExhdGVuY3k9JHsobiA9IHRoaXMudGFyZ2V0TGF0ZW5jeSkgPT0gbnVsbCA/IHZvaWQgMCA6IG4udG9GaXhlZCgzKX0sIGZvcndhcmRCdWZmZXJMZW5ndGg9JHt0aGlzLmZvcndhcmRCdWZmZXJMZW5ndGgudG9GaXhlZCgzKX06IGFkanVzdGluZyBwbGF5YmFjayByYXRlIGZyb20gJHtlLnBsYXliYWNrUmF0ZX0gdG8gJHt0fWApLCBlLnBsYXliYWNrUmF0ZSA9IHQpO1xuICB9XG4gIGVzdGltYXRlTGl2ZUVkZ2UoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubGV2ZWxEZXRhaWxzO1xuICAgIHJldHVybiBlID09PSBudWxsID8gbnVsbCA6IGUuZWRnZSArIGUuYWdlO1xuICB9XG4gIGNvbXB1dGVMYXRlbmN5KCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmVzdGltYXRlTGl2ZUVkZ2UoKTtcbiAgICByZXR1cm4gZSA9PT0gbnVsbCA/IG51bGwgOiBlIC0gdGhpcy5jdXJyZW50VGltZTtcbiAgfVxufVxuY2xhc3MgeUEgZXh0ZW5kcyBrdSB7XG4gIGNvbnN0cnVjdG9yKGUsIHQpIHtcbiAgICBzdXBlcihlLCBcImxldmVsLWNvbnRyb2xsZXJcIiksIHRoaXMuX2xldmVscyA9IFtdLCB0aGlzLl9maXJzdExldmVsID0gLTEsIHRoaXMuX21heEF1dG9MZXZlbCA9IC0xLCB0aGlzLl9zdGFydExldmVsID0gdm9pZCAwLCB0aGlzLmN1cnJlbnRMZXZlbCA9IG51bGwsIHRoaXMuY3VycmVudExldmVsSW5kZXggPSAtMSwgdGhpcy5tYW51YWxMZXZlbEluZGV4ID0gLTEsIHRoaXMuc3RlZXJpbmcgPSB2b2lkIDAsIHRoaXMub25QYXJzZWRDb21wbGV0ZSA9IHZvaWQgMCwgdGhpcy5zdGVlcmluZyA9IHQsIHRoaXMuX3JlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gIH1cbiAgX3JlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLk1BTklGRVNUX0xPQURFRCwgdGhpcy5vbk1hbmlmZXN0TG9hZGVkLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURFRCwgdGhpcy5vbkxldmVsTG9hZGVkLCB0aGlzKSwgZS5vbihJLkxFVkVMU19VUERBVEVELCB0aGlzLm9uTGV2ZWxzVXBkYXRlZCwgdGhpcyksIGUub24oSS5GUkFHX0JVRkZFUkVELCB0aGlzLm9uRnJhZ0J1ZmZlcmVkLCB0aGlzKSwgZS5vbihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuICB9XG4gIF91bnJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub2ZmKEkuTUFOSUZFU1RfTE9BRElORywgdGhpcy5vbk1hbmlmZXN0TG9hZGluZywgdGhpcyksIGUub2ZmKEkuTUFOSUZFU1RfTE9BREVELCB0aGlzLm9uTWFuaWZlc3RMb2FkZWQsIHRoaXMpLCBlLm9mZihJLkxFVkVMX0xPQURFRCwgdGhpcy5vbkxldmVsTG9hZGVkLCB0aGlzKSwgZS5vZmYoSS5MRVZFTFNfVVBEQVRFRCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfQlVGRkVSRUQsIHRoaXMub25GcmFnQnVmZmVyZWQsIHRoaXMpLCBlLm9mZihJLkVSUk9SLCB0aGlzLm9uRXJyb3IsIHRoaXMpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5fdW5yZWdpc3Rlckxpc3RlbmVycygpLCB0aGlzLnN0ZWVyaW5nID0gbnVsbCwgdGhpcy5yZXNldExldmVscygpLCBzdXBlci5kZXN0cm95KCk7XG4gIH1cbiAgc3RvcExvYWQoKSB7XG4gICAgdGhpcy5fbGV2ZWxzLmZvckVhY2goKHQpID0+IHtcbiAgICAgIHQubG9hZEVycm9yID0gMCwgdC5mcmFnbWVudEVycm9yID0gMDtcbiAgICB9KSwgc3VwZXIuc3RvcExvYWQoKTtcbiAgfVxuICByZXNldExldmVscygpIHtcbiAgICB0aGlzLl9zdGFydExldmVsID0gdm9pZCAwLCB0aGlzLm1hbnVhbExldmVsSW5kZXggPSAtMSwgdGhpcy5jdXJyZW50TGV2ZWxJbmRleCA9IC0xLCB0aGlzLmN1cnJlbnRMZXZlbCA9IG51bGwsIHRoaXMuX2xldmVscyA9IFtdLCB0aGlzLl9tYXhBdXRvTGV2ZWwgPSAtMTtcbiAgfVxuICBvbk1hbmlmZXN0TG9hZGluZyhlLCB0KSB7XG4gICAgdGhpcy5yZXNldExldmVscygpO1xuICB9XG4gIG9uTWFuaWZlc3RMb2FkZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmhscy5jb25maWcucHJlZmVyTWFuYWdlZE1lZGlhU291cmNlLCBuID0gW10sIGkgPSB7fSwgbyA9IHt9O1xuICAgIGxldCBhID0gITEsIGwgPSAhMSwgYyA9ICExO1xuICAgIHQubGV2ZWxzLmZvckVhY2goKHUpID0+IHtcbiAgICAgIGNvbnN0IGQgPSB1LmF0dHJzO1xuICAgICAgbGV0IHtcbiAgICAgICAgYXVkaW9Db2RlYzogaCxcbiAgICAgICAgdmlkZW9Db2RlYzogZlxuICAgICAgfSA9IHU7XG4gICAgICBoICYmICh1LmF1ZGlvQ29kZWMgPSBoID0gWG8oaCwgcikgfHwgdm9pZCAwKSwgZiAmJiAoZiA9IHUudmlkZW9Db2RlYyA9IEpTKGYpKTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGg6IHAsXG4gICAgICAgIGhlaWdodDogeSxcbiAgICAgICAgdW5rbm93bkNvZGVjczogRVxuICAgICAgfSA9IHUsIGIgPSAoRSA9PSBudWxsID8gdm9pZCAwIDogRS5sZW5ndGgpIHx8IDA7XG4gICAgICBpZiAoYSB8fCAoYSA9ICEhKHAgJiYgeSkpLCBsIHx8IChsID0gISFmKSwgYyB8fCAoYyA9ICEhaCksIGIgfHwgaCAmJiAhdGhpcy5pc0F1ZGlvU3VwcG9ydGVkKGgpIHx8IGYgJiYgIXRoaXMuaXNWaWRlb1N1cHBvcnRlZChmKSkge1xuICAgICAgICB0aGlzLmxvZyhgU29tZSBvciBhbGwgQ09ERUNTIG5vdCBzdXBwb3J0ZWQgXCIke2QuQ09ERUNTfVwiYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgQ09ERUNTOiBSLFxuICAgICAgICBcIkZSQU1FLVJBVEVcIjogQSxcbiAgICAgICAgXCJIRENQLUxFVkVMXCI6IEYsXG4gICAgICAgIFwiUEFUSFdBWS1JRFwiOiBNLFxuICAgICAgICBSRVNPTFVUSU9OOiBILFxuICAgICAgICBcIlZJREVPLVJBTkdFXCI6IEtcbiAgICAgIH0gPSBkLCBDID0gYCR7YCR7TSB8fCBcIi5cIn0tYH0ke3UuYml0cmF0ZX0tJHtIfS0ke0F9LSR7Un0tJHtLfS0ke0Z9YDtcbiAgICAgIGlmIChpW0NdKVxuICAgICAgICBpZiAoaVtDXS51cmkgIT09IHUudXJsICYmICF1LmF0dHJzW1wiUEFUSFdBWS1JRFwiXSkge1xuICAgICAgICAgIGNvbnN0IGsgPSBvW0NdICs9IDE7XG4gICAgICAgICAgdS5hdHRyc1tcIlBBVEhXQVktSURcIl0gPSBuZXcgQXJyYXkoayArIDEpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgIGNvbnN0ICQgPSB0aGlzLmNyZWF0ZUxldmVsKHUpO1xuICAgICAgICAgIGlbQ10gPSAkLCBuLnB1c2goJCk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgIGlbQ10uYWRkR3JvdXBJZChcImF1ZGlvXCIsIGQuQVVESU8pLCBpW0NdLmFkZEdyb3VwSWQoXCJ0ZXh0XCIsIGQuU1VCVElUTEVTKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBrID0gdGhpcy5jcmVhdGVMZXZlbCh1KTtcbiAgICAgICAgaVtDXSA9IGssIG9bQ10gPSAxLCBuLnB1c2goayk7XG4gICAgICB9XG4gICAgfSksIHRoaXMuZmlsdGVyQW5kU29ydE1lZGlhT3B0aW9ucyhuLCB0LCBhLCBsLCBjKTtcbiAgfVxuICBjcmVhdGVMZXZlbChlKSB7XG4gICAgY29uc3QgdCA9IG5ldyBtaShlKSwgciA9IGUuc3VwcGxlbWVudGFsO1xuICAgIGlmIChyICE9IG51bGwgJiYgci52aWRlb0NvZGVjICYmICF0aGlzLmlzVmlkZW9TdXBwb3J0ZWQoci52aWRlb0NvZGVjKSkge1xuICAgICAgY29uc3QgbiA9IG5ldyBFcnJvcihgU1VQUExFTUVOVEFMLUNPREVDUyBub3Qgc3VwcG9ydGVkIFwiJHtyLnZpZGVvQ29kZWN9XCJgKTtcbiAgICAgIHRoaXMubG9nKG4ubWVzc2FnZSksIHQuc3VwcG9ydGVkUmVzdWx0ID0gRmcobiwgW10pO1xuICAgIH1cbiAgICByZXR1cm4gdDtcbiAgfVxuICBpc0F1ZGlvU3VwcG9ydGVkKGUpIHtcbiAgICByZXR1cm4gZ2koZSwgXCJhdWRpb1wiLCB0aGlzLmhscy5jb25maWcucHJlZmVyTWFuYWdlZE1lZGlhU291cmNlKTtcbiAgfVxuICBpc1ZpZGVvU3VwcG9ydGVkKGUpIHtcbiAgICByZXR1cm4gZ2koZSwgXCJ2aWRlb1wiLCB0aGlzLmhscy5jb25maWcucHJlZmVyTWFuYWdlZE1lZGlhU291cmNlKTtcbiAgfVxuICBmaWx0ZXJBbmRTb3J0TWVkaWFPcHRpb25zKGUsIHQsIHIsIG4sIGkpIHtcbiAgICB2YXIgbztcbiAgICBsZXQgYSA9IFtdLCBsID0gW10sIGMgPSBlO1xuICAgIGNvbnN0IHUgPSAoKG8gPSB0LnN0YXRzKSA9PSBudWxsID8gdm9pZCAwIDogby5wYXJzaW5nKSB8fCB7fTtcbiAgICBpZiAoKHIgfHwgbikgJiYgaSAmJiAoYyA9IGMuZmlsdGVyKCh7XG4gICAgICB2aWRlb0NvZGVjOiBSLFxuICAgICAgdmlkZW9SYW5nZTogQSxcbiAgICAgIHdpZHRoOiBGLFxuICAgICAgaGVpZ2h0OiBNXG4gICAgfSkgPT4gKCEhUiB8fCAhIShGICYmIE0pKSAmJiBsYihBKSkpLCBjLmxlbmd0aCA9PT0gMCkge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhscykge1xuICAgICAgICAgIGxldCBSID0gXCJubyBsZXZlbCB3aXRoIGNvbXBhdGlibGUgY29kZWNzIGZvdW5kIGluIG1hbmlmZXN0XCIsIEEgPSBSO1xuICAgICAgICAgIHQubGV2ZWxzLmxlbmd0aCAmJiAoQSA9IGBvbmUgb3IgbW9yZSBDT0RFQ1MgaW4gdmFyaWFudCBub3Qgc3VwcG9ydGVkOiAke2F0KHQubGV2ZWxzLm1hcCgoTSkgPT4gTS5hdHRycy5DT0RFQ1MpLmZpbHRlcigoTSwgSCwgSykgPT4gSy5pbmRleE9mKE0pID09PSBIKSl9YCwgdGhpcy53YXJuKEEpLCBSICs9IGAgKCR7QX0pYCk7XG4gICAgICAgICAgY29uc3QgRiA9IG5ldyBFcnJvcihSKTtcbiAgICAgICAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgICAgIHR5cGU6IHZlLk1FRElBX0VSUk9SLFxuICAgICAgICAgICAgZGV0YWlsczogSi5NQU5JRkVTVF9JTkNPTVBBVElCTEVfQ09ERUNTX0VSUk9SLFxuICAgICAgICAgICAgZmF0YWw6ICEwLFxuICAgICAgICAgICAgdXJsOiB0LnVybCxcbiAgICAgICAgICAgIGVycm9yOiBGLFxuICAgICAgICAgICAgcmVhc29uOiBBXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pLCB1LmVuZCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0LmF1ZGlvVHJhY2tzICYmIChhID0gdC5hdWRpb1RyYWNrcy5maWx0ZXIoKFIpID0+ICFSLmF1ZGlvQ29kZWMgfHwgdGhpcy5pc0F1ZGlvU3VwcG9ydGVkKFIuYXVkaW9Db2RlYykpLCBkZihhKSksIHQuc3VidGl0bGVzICYmIChsID0gdC5zdWJ0aXRsZXMsIGRmKGwpKTtcbiAgICBjb25zdCBkID0gYy5zbGljZSgwKTtcbiAgICBjLnNvcnQoKFIsIEEpID0+IHtcbiAgICAgIGlmIChSLmF0dHJzW1wiSERDUC1MRVZFTFwiXSAhPT0gQS5hdHRyc1tcIkhEQ1AtTEVWRUxcIl0pXG4gICAgICAgIHJldHVybiAoUi5hdHRyc1tcIkhEQ1AtTEVWRUxcIl0gfHwgXCJcIikgPiAoQS5hdHRyc1tcIkhEQ1AtTEVWRUxcIl0gfHwgXCJcIikgPyAxIDogLTE7XG4gICAgICBpZiAociAmJiBSLmhlaWdodCAhPT0gQS5oZWlnaHQpXG4gICAgICAgIHJldHVybiBSLmhlaWdodCAtIEEuaGVpZ2h0O1xuICAgICAgaWYgKFIuZnJhbWVSYXRlICE9PSBBLmZyYW1lUmF0ZSlcbiAgICAgICAgcmV0dXJuIFIuZnJhbWVSYXRlIC0gQS5mcmFtZVJhdGU7XG4gICAgICBpZiAoUi52aWRlb1JhbmdlICE9PSBBLnZpZGVvUmFuZ2UpXG4gICAgICAgIHJldHVybiBKby5pbmRleE9mKFIudmlkZW9SYW5nZSkgLSBKby5pbmRleE9mKEEudmlkZW9SYW5nZSk7XG4gICAgICBpZiAoUi52aWRlb0NvZGVjICE9PSBBLnZpZGVvQ29kZWMpIHtcbiAgICAgICAgY29uc3QgRiA9IHNoKFIudmlkZW9Db2RlYyksIE0gPSBzaChBLnZpZGVvQ29kZWMpO1xuICAgICAgICBpZiAoRiAhPT0gTSlcbiAgICAgICAgICByZXR1cm4gTSAtIEY7XG4gICAgICB9XG4gICAgICBpZiAoUi51cmkgPT09IEEudXJpICYmIFIuY29kZWNTZXQgIT09IEEuY29kZWNTZXQpIHtcbiAgICAgICAgY29uc3QgRiA9IFpvKFIuY29kZWNTZXQpLCBNID0gWm8oQS5jb2RlY1NldCk7XG4gICAgICAgIGlmIChGICE9PSBNKVxuICAgICAgICAgIHJldHVybiBNIC0gRjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSLmF2ZXJhZ2VCaXRyYXRlICE9PSBBLmF2ZXJhZ2VCaXRyYXRlID8gUi5hdmVyYWdlQml0cmF0ZSAtIEEuYXZlcmFnZUJpdHJhdGUgOiAwO1xuICAgIH0pO1xuICAgIGxldCBoID0gZFswXTtcbiAgICBpZiAodGhpcy5zdGVlcmluZyAmJiAoYyA9IHRoaXMuc3RlZXJpbmcuZmlsdGVyUGFyc2VkTGV2ZWxzKGMpLCBjLmxlbmd0aCAhPT0gZC5sZW5ndGgpKSB7XG4gICAgICBmb3IgKGxldCBSID0gMDsgUiA8IGQubGVuZ3RoOyBSKyspXG4gICAgICAgIGlmIChkW1JdLnBhdGh3YXlJZCA9PT0gY1swXS5wYXRod2F5SWQpIHtcbiAgICAgICAgICBoID0gZFtSXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9sZXZlbHMgPSBjO1xuICAgIGZvciAobGV0IFIgPSAwOyBSIDwgYy5sZW5ndGg7IFIrKylcbiAgICAgIGlmIChjW1JdID09PSBoKSB7XG4gICAgICAgIHZhciBmO1xuICAgICAgICB0aGlzLl9maXJzdExldmVsID0gUjtcbiAgICAgICAgY29uc3QgQSA9IGguYml0cmF0ZSwgRiA9IHRoaXMuaGxzLmJhbmR3aWR0aEVzdGltYXRlO1xuICAgICAgICBpZiAodGhpcy5sb2coYG1hbmlmZXN0IGxvYWRlZCwgJHtjLmxlbmd0aH0gbGV2ZWwocykgZm91bmQsIGZpcnN0IGJpdHJhdGU6ICR7QX1gKSwgKChmID0gdGhpcy5obHMudXNlckNvbmZpZykgPT0gbnVsbCA/IHZvaWQgMCA6IGYuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZSkgPT09IHZvaWQgMCkge1xuICAgICAgICAgIGNvbnN0IE0gPSBNYXRoLm1pbihBLCB0aGlzLmhscy5jb25maWcuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZU1heCk7XG4gICAgICAgICAgTSA+IEYgJiYgRiA9PT0gdGhpcy5obHMuYWJyRXdtYURlZmF1bHRFc3RpbWF0ZSAmJiAodGhpcy5obHMuYmFuZHdpZHRoRXN0aW1hdGUgPSBNKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICBjb25zdCBwID0gaSAmJiAhbiwgeSA9IHRoaXMuaGxzLmNvbmZpZywgRSA9ICEhKHkuYXVkaW9TdHJlYW1Db250cm9sbGVyICYmIHkuYXVkaW9UcmFja0NvbnRyb2xsZXIpLCBiID0ge1xuICAgICAgbGV2ZWxzOiBjLFxuICAgICAgYXVkaW9UcmFja3M6IGEsXG4gICAgICBzdWJ0aXRsZVRyYWNrczogbCxcbiAgICAgIHNlc3Npb25EYXRhOiB0LnNlc3Npb25EYXRhLFxuICAgICAgc2Vzc2lvbktleXM6IHQuc2Vzc2lvbktleXMsXG4gICAgICBmaXJzdExldmVsOiB0aGlzLl9maXJzdExldmVsLFxuICAgICAgc3RhdHM6IHQuc3RhdHMsXG4gICAgICBhdWRpbzogaSxcbiAgICAgIHZpZGVvOiBuLFxuICAgICAgYWx0QXVkaW86IEUgJiYgIXAgJiYgYS5zb21lKChSKSA9PiAhIVIudXJsKVxuICAgIH07XG4gICAgdS5lbmQgPSBwZXJmb3JtYW5jZS5ub3coKSwgdGhpcy5obHMudHJpZ2dlcihJLk1BTklGRVNUX1BBUlNFRCwgYik7XG4gIH1cbiAgZ2V0IGxldmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWxzLmxlbmd0aCA9PT0gMCA/IG51bGwgOiB0aGlzLl9sZXZlbHM7XG4gIH1cbiAgZ2V0IGxvYWRMZXZlbE9iaigpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50TGV2ZWw7XG4gIH1cbiAgZ2V0IGxldmVsKCkge1xuICAgIHJldHVybiB0aGlzLmN1cnJlbnRMZXZlbEluZGV4O1xuICB9XG4gIHNldCBsZXZlbChlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuX2xldmVscztcbiAgICBpZiAodC5sZW5ndGggPT09IDApXG4gICAgICByZXR1cm47XG4gICAgaWYgKGUgPCAwIHx8IGUgPj0gdC5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHUgPSBuZXcgRXJyb3IoXCJpbnZhbGlkIGxldmVsIGlkeFwiKSwgZCA9IGUgPCAwO1xuICAgICAgaWYgKHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICB0eXBlOiB2ZS5PVEhFUl9FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5MRVZFTF9TV0lUQ0hfRVJST1IsXG4gICAgICAgIGxldmVsOiBlLFxuICAgICAgICBmYXRhbDogZCxcbiAgICAgICAgZXJyb3I6IHUsXG4gICAgICAgIHJlYXNvbjogdS5tZXNzYWdlXG4gICAgICB9KSwgZClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZSA9IE1hdGgubWluKGUsIHQubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIGNvbnN0IHIgPSB0aGlzLmN1cnJlbnRMZXZlbEluZGV4LCBuID0gdGhpcy5jdXJyZW50TGV2ZWwsIGkgPSBuID8gbi5hdHRyc1tcIlBBVEhXQVktSURcIl0gOiB2b2lkIDAsIG8gPSB0W2VdLCBhID0gby5hdHRyc1tcIlBBVEhXQVktSURcIl07XG4gICAgaWYgKHRoaXMuY3VycmVudExldmVsSW5kZXggPSBlLCB0aGlzLmN1cnJlbnRMZXZlbCA9IG8sIHIgPT09IGUgJiYgbiAmJiBpID09PSBhKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMubG9nKGBTd2l0Y2hpbmcgdG8gbGV2ZWwgJHtlfSAoJHtvLmhlaWdodCA/IG8uaGVpZ2h0ICsgXCJwIFwiIDogXCJcIn0ke28udmlkZW9SYW5nZSA/IG8udmlkZW9SYW5nZSArIFwiIFwiIDogXCJcIn0ke28uY29kZWNTZXQgPyBvLmNvZGVjU2V0ICsgXCIgXCIgOiBcIlwifUAke28uYml0cmF0ZX0pJHthID8gXCIgd2l0aCBQYXRod2F5IFwiICsgYSA6IFwiXCJ9IGZyb20gbGV2ZWwgJHtyfSR7aSA/IFwiIHdpdGggUGF0aHdheSBcIiArIGkgOiBcIlwifWApO1xuICAgIGNvbnN0IGwgPSB7XG4gICAgICBsZXZlbDogZSxcbiAgICAgIGF0dHJzOiBvLmF0dHJzLFxuICAgICAgZGV0YWlsczogby5kZXRhaWxzLFxuICAgICAgYml0cmF0ZTogby5iaXRyYXRlLFxuICAgICAgYXZlcmFnZUJpdHJhdGU6IG8uYXZlcmFnZUJpdHJhdGUsXG4gICAgICBtYXhCaXRyYXRlOiBvLm1heEJpdHJhdGUsXG4gICAgICByZWFsQml0cmF0ZTogby5yZWFsQml0cmF0ZSxcbiAgICAgIHdpZHRoOiBvLndpZHRoLFxuICAgICAgaGVpZ2h0OiBvLmhlaWdodCxcbiAgICAgIGNvZGVjU2V0OiBvLmNvZGVjU2V0LFxuICAgICAgYXVkaW9Db2RlYzogby5hdWRpb0NvZGVjLFxuICAgICAgdmlkZW9Db2RlYzogby52aWRlb0NvZGVjLFxuICAgICAgYXVkaW9Hcm91cHM6IG8uYXVkaW9Hcm91cHMsXG4gICAgICBzdWJ0aXRsZUdyb3Vwczogby5zdWJ0aXRsZUdyb3VwcyxcbiAgICAgIGxvYWRlZDogby5sb2FkZWQsXG4gICAgICBsb2FkRXJyb3I6IG8ubG9hZEVycm9yLFxuICAgICAgZnJhZ21lbnRFcnJvcjogby5mcmFnbWVudEVycm9yLFxuICAgICAgbmFtZTogby5uYW1lLFxuICAgICAgaWQ6IG8uaWQsXG4gICAgICB1cmk6IG8udXJpLFxuICAgICAgdXJsOiBvLnVybCxcbiAgICAgIHVybElkOiAwLFxuICAgICAgYXVkaW9Hcm91cElkczogby5hdWRpb0dyb3VwSWRzLFxuICAgICAgdGV4dEdyb3VwSWRzOiBvLnRleHRHcm91cElkc1xuICAgIH07XG4gICAgdGhpcy5obHMudHJpZ2dlcihJLkxFVkVMX1NXSVRDSElORywgbCk7XG4gICAgY29uc3QgYyA9IG8uZGV0YWlscztcbiAgICBpZiAoIWMgfHwgYy5saXZlKSB7XG4gICAgICBjb25zdCB1ID0gdGhpcy5zd2l0Y2hQYXJhbXMoby51cmksIG4gPT0gbnVsbCA/IHZvaWQgMCA6IG4uZGV0YWlscywgYyk7XG4gICAgICB0aGlzLmxvYWRQbGF5bGlzdCh1KTtcbiAgICB9XG4gIH1cbiAgZ2V0IG1hbnVhbExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLm1hbnVhbExldmVsSW5kZXg7XG4gIH1cbiAgc2V0IG1hbnVhbExldmVsKGUpIHtcbiAgICB0aGlzLm1hbnVhbExldmVsSW5kZXggPSBlLCB0aGlzLl9zdGFydExldmVsID09PSB2b2lkIDAgJiYgKHRoaXMuX3N0YXJ0TGV2ZWwgPSBlKSwgZSAhPT0gLTEgJiYgKHRoaXMubGV2ZWwgPSBlKTtcbiAgfVxuICBnZXQgZmlyc3RMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZmlyc3RMZXZlbDtcbiAgfVxuICBzZXQgZmlyc3RMZXZlbChlKSB7XG4gICAgdGhpcy5fZmlyc3RMZXZlbCA9IGU7XG4gIH1cbiAgZ2V0IHN0YXJ0TGV2ZWwoKSB7XG4gICAgaWYgKHRoaXMuX3N0YXJ0TGV2ZWwgPT09IHZvaWQgMCkge1xuICAgICAgY29uc3QgZSA9IHRoaXMuaGxzLmNvbmZpZy5zdGFydExldmVsO1xuICAgICAgcmV0dXJuIGUgIT09IHZvaWQgMCA/IGUgOiB0aGlzLmhscy5maXJzdEF1dG9MZXZlbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0TGV2ZWw7XG4gIH1cbiAgc2V0IHN0YXJ0TGV2ZWwoZSkge1xuICAgIHRoaXMuX3N0YXJ0TGV2ZWwgPSBlO1xuICB9XG4gIGdldCBwYXRod2F5cygpIHtcbiAgICByZXR1cm4gdGhpcy5zdGVlcmluZyA/IHRoaXMuc3RlZXJpbmcucGF0aHdheXMoKSA6IFtdO1xuICB9XG4gIGdldCBwYXRod2F5UHJpb3JpdHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RlZXJpbmcgPyB0aGlzLnN0ZWVyaW5nLnBhdGh3YXlQcmlvcml0eSA6IG51bGw7XG4gIH1cbiAgc2V0IHBhdGh3YXlQcmlvcml0eShlKSB7XG4gICAgaWYgKHRoaXMuc3RlZXJpbmcpIHtcbiAgICAgIGNvbnN0IHQgPSB0aGlzLnN0ZWVyaW5nLnBhdGh3YXlzKCksIHIgPSBlLmZpbHRlcigobikgPT4gdC5pbmRleE9mKG4pICE9PSAtMSk7XG4gICAgICBpZiAoZS5sZW5ndGggPCAxKSB7XG4gICAgICAgIHRoaXMud2FybihgcGF0aHdheVByaW9yaXR5ICR7ZX0gc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3Qgb25lIHBhdGh3YXkgZnJvbSBsaXN0OiAke3R9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc3RlZXJpbmcucGF0aHdheVByaW9yaXR5ID0gcjtcbiAgICB9XG4gIH1cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgdC5mYXRhbCB8fCAhdC5jb250ZXh0IHx8IHQuY29udGV4dC50eXBlID09PSBLZS5MRVZFTCAmJiB0LmNvbnRleHQubGV2ZWwgPT09IHRoaXMubGV2ZWwgJiYgdGhpcy5jaGVja1JldHJ5KHQpO1xuICB9XG4gIC8vIHJlc2V0IGVycm9ycyBvbiB0aGUgc3VjY2Vzc2Z1bCBsb2FkIG9mIGEgZnJhZ21lbnRcbiAgb25GcmFnQnVmZmVyZWQoZSwge1xuICAgIGZyYWc6IHRcbiAgfSkge1xuICAgIGlmICh0ICE9PSB2b2lkIDAgJiYgdC50eXBlID09PSBwZS5NQUlOKSB7XG4gICAgICBjb25zdCByID0gdC5lbGVtZW50YXJ5U3RyZWFtcztcbiAgICAgIGlmICghT2JqZWN0LmtleXMocikuc29tZSgoaSkgPT4gISFyW2ldKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgbiA9IHRoaXMuX2xldmVsc1t0LmxldmVsXTtcbiAgICAgIG4gIT0gbnVsbCAmJiBuLmxvYWRFcnJvciAmJiAodGhpcy5sb2coYFJlc2V0dGluZyBsZXZlbCBlcnJvciBjb3VudCBvZiAke24ubG9hZEVycm9yfSBvbiBmcmFnIGJ1ZmZlcmVkYCksIG4ubG9hZEVycm9yID0gMCk7XG4gICAgfVxuICB9XG4gIG9uTGV2ZWxMb2FkZWQoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsOiBuLFxuICAgICAgZGV0YWlsczogaVxuICAgIH0gPSB0LCBvID0gdC5sZXZlbEluZm87XG4gICAgaWYgKCFvKSB7XG4gICAgICB2YXIgYTtcbiAgICAgIHRoaXMud2FybihgSW52YWxpZCBsZXZlbCBpbmRleCAke259YCksIChhID0gdC5kZWxpdmVyeURpcmVjdGl2ZXMpICE9IG51bGwgJiYgYS5za2lwICYmIChpLmRlbHRhVXBkYXRlRmFpbGVkID0gITApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobyA9PT0gdGhpcy5jdXJyZW50TGV2ZWwgfHwgdC53aXRob3V0TXVsdGlWYXJpYW50KSB7XG4gICAgICBvLmZyYWdtZW50RXJyb3IgPT09IDAgJiYgKG8ubG9hZEVycm9yID0gMCk7XG4gICAgICBsZXQgbCA9IG8uZGV0YWlscztcbiAgICAgIGwgPT09IHQuZGV0YWlscyAmJiBsLmFkdmFuY2VkICYmIChsID0gdm9pZCAwKSwgdGhpcy5wbGF5bGlzdExvYWRlZChuLCB0LCBsKTtcbiAgICB9IGVsc2UgKHIgPSB0LmRlbGl2ZXJ5RGlyZWN0aXZlcykgIT0gbnVsbCAmJiByLnNraXAgJiYgKGkuZGVsdGFVcGRhdGVGYWlsZWQgPSAhMCk7XG4gIH1cbiAgbG9hZFBsYXlsaXN0KGUpIHtcbiAgICBzdXBlci5sb2FkUGxheWxpc3QoKSwgdGhpcy5zaG91bGRMb2FkUGxheWxpc3QodGhpcy5jdXJyZW50TGV2ZWwpICYmIHRoaXMuc2NoZWR1bGVMb2FkaW5nKHRoaXMuY3VycmVudExldmVsLCBlKTtcbiAgfVxuICBsb2FkaW5nUGxheWxpc3QoZSwgdCkge1xuICAgIHN1cGVyLmxvYWRpbmdQbGF5bGlzdChlLCB0KTtcbiAgICBjb25zdCByID0gdGhpcy5nZXRVcmxXaXRoRGlyZWN0aXZlcyhlLnVyaSwgdCksIG4gPSB0aGlzLmN1cnJlbnRMZXZlbEluZGV4LCBpID0gZS5hdHRyc1tcIlBBVEhXQVktSURcIl0sIG8gPSBlLmRldGFpbHMsIGEgPSBvID09IG51bGwgPyB2b2lkIDAgOiBvLmFnZTtcbiAgICB0aGlzLmxvZyhgTG9hZGluZyBsZXZlbCBpbmRleCAke259JHsodCA9PSBudWxsID8gdm9pZCAwIDogdC5tc24pICE9PSB2b2lkIDAgPyBcIiBhdCBzbiBcIiArIHQubXNuICsgXCIgcGFydCBcIiArIHQucGFydCA6IFwiXCJ9JHtpID8gXCIgUGF0aHdheSBcIiArIGkgOiBcIlwifSR7YSAmJiBvLmxpdmUgPyBcIiBhZ2UgXCIgKyBhLnRvRml4ZWQoMSkgKyAoby50eXBlICYmIFwiIFwiICsgby50eXBlIHx8IFwiXCIpIDogXCJcIn0gJHtyfWApLCB0aGlzLmhscy50cmlnZ2VyKEkuTEVWRUxfTE9BRElORywge1xuICAgICAgdXJsOiByLFxuICAgICAgbGV2ZWw6IG4sXG4gICAgICBsZXZlbEluZm86IGUsXG4gICAgICBwYXRod2F5SWQ6IGUuYXR0cnNbXCJQQVRIV0FZLUlEXCJdLFxuICAgICAgaWQ6IDAsXG4gICAgICAvLyBEZXByZWNhdGVkIExldmVsIHVybElkXG4gICAgICBkZWxpdmVyeURpcmVjdGl2ZXM6IHQgfHwgbnVsbFxuICAgIH0pO1xuICB9XG4gIGdldCBuZXh0TG9hZExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLm1hbnVhbExldmVsSW5kZXggIT09IC0xID8gdGhpcy5tYW51YWxMZXZlbEluZGV4IDogdGhpcy5obHMubmV4dEF1dG9MZXZlbDtcbiAgfVxuICBzZXQgbmV4dExvYWRMZXZlbChlKSB7XG4gICAgdGhpcy5sZXZlbCA9IGUsIHRoaXMubWFudWFsTGV2ZWxJbmRleCA9PT0gLTEgJiYgKHRoaXMuaGxzLm5leHRBdXRvTGV2ZWwgPSBlKTtcbiAgfVxuICByZW1vdmVMZXZlbChlKSB7XG4gICAgdmFyIHQ7XG4gICAgaWYgKHRoaXMuX2xldmVscy5sZW5ndGggPT09IDEpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgciA9IHRoaXMuX2xldmVscy5maWx0ZXIoKGksIG8pID0+IG8gIT09IGUgPyAhMCA6ICh0aGlzLnN0ZWVyaW5nICYmIHRoaXMuc3RlZXJpbmcucmVtb3ZlTGV2ZWwoaSksIGkgPT09IHRoaXMuY3VycmVudExldmVsICYmICh0aGlzLmN1cnJlbnRMZXZlbCA9IG51bGwsIHRoaXMuY3VycmVudExldmVsSW5kZXggPSAtMSwgaS5kZXRhaWxzICYmIGkuZGV0YWlscy5mcmFnbWVudHMuZm9yRWFjaCgoYSkgPT4gYS5sZXZlbCA9IC0xKSksICExKSk7XG4gICAgcnAociksIHRoaXMuX2xldmVscyA9IHIsIHRoaXMuY3VycmVudExldmVsSW5kZXggPiAtMSAmJiAodCA9IHRoaXMuY3VycmVudExldmVsKSAhPSBudWxsICYmIHQuZGV0YWlscyAmJiAodGhpcy5jdXJyZW50TGV2ZWxJbmRleCA9IHRoaXMuY3VycmVudExldmVsLmRldGFpbHMuZnJhZ21lbnRzWzBdLmxldmVsKSwgdGhpcy5tYW51YWxMZXZlbEluZGV4ID4gLTEgJiYgKHRoaXMubWFudWFsTGV2ZWxJbmRleCA9IHRoaXMuY3VycmVudExldmVsSW5kZXgpO1xuICAgIGNvbnN0IG4gPSByLmxlbmd0aCAtIDE7XG4gICAgdGhpcy5fZmlyc3RMZXZlbCA9IE1hdGgubWluKHRoaXMuX2ZpcnN0TGV2ZWwsIG4pLCB0aGlzLl9zdGFydExldmVsICYmICh0aGlzLl9zdGFydExldmVsID0gTWF0aC5taW4odGhpcy5fc3RhcnRMZXZlbCwgbikpLCB0aGlzLmhscy50cmlnZ2VyKEkuTEVWRUxTX1VQREFURUQsIHtcbiAgICAgIGxldmVsczogclxuICAgIH0pO1xuICB9XG4gIG9uTGV2ZWxzVXBkYXRlZChlLCB7XG4gICAgbGV2ZWxzOiB0XG4gIH0pIHtcbiAgICB0aGlzLl9sZXZlbHMgPSB0O1xuICB9XG4gIGNoZWNrTWF4QXV0b1VwZGF0ZWQoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYXV0b0xldmVsQ2FwcGluZzogZSxcbiAgICAgIG1heEF1dG9MZXZlbDogdCxcbiAgICAgIG1heEhkY3BMZXZlbDogclxuICAgIH0gPSB0aGlzLmhscztcbiAgICB0aGlzLl9tYXhBdXRvTGV2ZWwgIT09IHQgJiYgKHRoaXMuX21heEF1dG9MZXZlbCA9IHQsIHRoaXMuaGxzLnRyaWdnZXIoSS5NQVhfQVVUT19MRVZFTF9VUERBVEVELCB7XG4gICAgICBhdXRvTGV2ZWxDYXBwaW5nOiBlLFxuICAgICAgbGV2ZWxzOiB0aGlzLmxldmVscyxcbiAgICAgIG1heEF1dG9MZXZlbDogdCxcbiAgICAgIG1pbkF1dG9MZXZlbDogdGhpcy5obHMubWluQXV0b0xldmVsLFxuICAgICAgbWF4SGRjcExldmVsOiByXG4gICAgfSkpO1xuICB9XG59XG5mdW5jdGlvbiBkZihzKSB7XG4gIGNvbnN0IGUgPSB7fTtcbiAgcy5mb3JFYWNoKCh0KSA9PiB7XG4gICAgY29uc3QgciA9IHQuZ3JvdXBJZCB8fCBcIlwiO1xuICAgIHQuaWQgPSBlW3JdID0gZVtyXSB8fCAwLCBlW3JdKys7XG4gIH0pO1xufVxuZnVuY3Rpb24gWHAoKSB7XG4gIHJldHVybiBzZWxmLlNvdXJjZUJ1ZmZlciB8fCBzZWxmLldlYktpdFNvdXJjZUJ1ZmZlcjtcbn1cbmZ1bmN0aW9uIEpwKCkge1xuICBpZiAoIU1zKCkpXG4gICAgcmV0dXJuICExO1xuICBjb25zdCBlID0gWHAoKTtcbiAgcmV0dXJuICFlIHx8IGUucHJvdG90eXBlICYmIHR5cGVvZiBlLnByb3RvdHlwZS5hcHBlbmRCdWZmZXIgPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBlLnByb3RvdHlwZS5yZW1vdmUgPT0gXCJmdW5jdGlvblwiO1xufVxuZnVuY3Rpb24gdkEoKSB7XG4gIGlmICghSnAoKSlcbiAgICByZXR1cm4gITE7XG4gIGNvbnN0IHMgPSBNcygpO1xuICByZXR1cm4gdHlwZW9mIChzID09IG51bGwgPyB2b2lkIDAgOiBzLmlzVHlwZVN1cHBvcnRlZCkgPT0gXCJmdW5jdGlvblwiICYmIChbXCJhdmMxLjQyRTAxRSxtcDRhLjQwLjJcIiwgXCJhdjAxLjAuMDFNLjA4XCIsIFwidnAwOS4wMC41MC4wOFwiXS5zb21lKChlKSA9PiBzLmlzVHlwZVN1cHBvcnRlZChwaShlLCBcInZpZGVvXCIpKSkgfHwgW1wibXA0YS40MC4yXCIsIFwiZkxhQ1wiXS5zb21lKChlKSA9PiBzLmlzVHlwZVN1cHBvcnRlZChwaShlLCBcImF1ZGlvXCIpKSkpO1xufVxuZnVuY3Rpb24gRUEoKSB7XG4gIHZhciBzO1xuICBjb25zdCBlID0gWHAoKTtcbiAgcmV0dXJuIHR5cGVvZiAoZSA9PSBudWxsIHx8IChzID0gZS5wcm90b3R5cGUpID09IG51bGwgPyB2b2lkIDAgOiBzLmNoYW5nZVR5cGUpID09IFwiZnVuY3Rpb25cIjtcbn1cbmNvbnN0IHhBID0gMTAwO1xuY2xhc3MgU0EgZXh0ZW5kcyBUdSB7XG4gIGNvbnN0cnVjdG9yKGUsIHQsIHIpIHtcbiAgICBzdXBlcihlLCB0LCByLCBcInN0cmVhbS1jb250cm9sbGVyXCIsIHBlLk1BSU4pLCB0aGlzLmF1ZGlvQ29kZWNTd2FwID0gITEsIHRoaXMubGV2ZWwgPSAtMSwgdGhpcy5fZm9yY2VTdGFydExvYWQgPSAhMSwgdGhpcy5faGFzRW5vdWdoVG9TdGFydCA9ICExLCB0aGlzLmFsdEF1ZGlvID0gMCwgdGhpcy5hdWRpb09ubHkgPSAhMSwgdGhpcy5mcmFnUGxheWluZyA9IG51bGwsIHRoaXMuZnJhZ0xhc3RLYnBzID0gMCwgdGhpcy5jb3VsZEJhY2t0cmFjayA9ICExLCB0aGlzLmJhY2t0cmFja0ZyYWdtZW50ID0gbnVsbCwgdGhpcy5hdWRpb0NvZGVjU3dpdGNoID0gITEsIHRoaXMudmlkZW9CdWZmZXIgPSBudWxsLCB0aGlzLm9uTWVkaWFQbGF5aW5nID0gKCkgPT4ge1xuICAgICAgdGhpcy50aWNrKCk7XG4gICAgfSwgdGhpcy5vbk1lZGlhU2Vla2VkID0gKCkgPT4ge1xuICAgICAgY29uc3QgbiA9IHRoaXMubWVkaWEsIGkgPSBuID8gbi5jdXJyZW50VGltZSA6IG51bGw7XG4gICAgICBpZiAoaSA9PT0gbnVsbCB8fCAhdWUoaSkgfHwgKHRoaXMubG9nKGBNZWRpYSBzZWVrZWQgdG8gJHtpLnRvRml4ZWQoMyl9YCksICF0aGlzLmdldEJ1ZmZlcmVkRnJhZyhpKSkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IG8gPSB0aGlzLmdldEZ3ZEJ1ZmZlckluZm9BdFBvcyhuLCBpLCBwZS5NQUlOLCAwKTtcbiAgICAgIGlmIChvID09PSBudWxsIHx8IG8ubGVuID09PSAwKSB7XG4gICAgICAgIHRoaXMud2FybihgTWFpbiBmb3J3YXJkIGJ1ZmZlciBsZW5ndGggYXQgJHtpfSBvbiBcInNlZWtlZFwiIGV2ZW50ICR7byA/IG8ubGVuIDogXCJlbXB0eVwifSlgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy50aWNrKCk7XG4gICAgfSwgdGhpcy5yZWdpc3Rlckxpc3RlbmVycygpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIHN1cGVyLnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZS5vbihJLk1BTklGRVNUX1BBUlNFRCwgdGhpcy5vbk1hbmlmZXN0UGFyc2VkLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuTEVWRUxfTE9BREVELCB0aGlzLm9uTGV2ZWxMb2FkZWQsIHRoaXMpLCBlLm9uKEkuRlJBR19MT0FEX0VNRVJHRU5DWV9BQk9SVEVELCB0aGlzLm9uRnJhZ0xvYWRFbWVyZ2VuY3lBYm9ydGVkLCB0aGlzKSwgZS5vbihJLkFVRElPX1RSQUNLX1NXSVRDSElORywgdGhpcy5vbkF1ZGlvVHJhY2tTd2l0Y2hpbmcsIHRoaXMpLCBlLm9uKEkuQVVESU9fVFJBQ0tfU1dJVENIRUQsIHRoaXMub25BdWRpb1RyYWNrU3dpdGNoZWQsIHRoaXMpLCBlLm9uKEkuQlVGRkVSX0NSRUFURUQsIHRoaXMub25CdWZmZXJDcmVhdGVkLCB0aGlzKSwgZS5vbihJLkJVRkZFUl9GTFVTSEVELCB0aGlzLm9uQnVmZmVyRmx1c2hlZCwgdGhpcyksIGUub24oSS5MRVZFTFNfVVBEQVRFRCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQsIHRoaXMpLCBlLm9uKEkuRlJBR19CVUZGRVJFRCwgdGhpcy5vbkZyYWdCdWZmZXJlZCwgdGhpcyk7XG4gIH1cbiAgdW5yZWdpc3Rlckxpc3RlbmVycygpIHtcbiAgICBzdXBlci51bnJlZ2lzdGVyTGlzdGVuZXJzKCk7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZS5vZmYoSS5NQU5JRkVTVF9QQVJTRUQsIHRoaXMub25NYW5pZmVzdFBhcnNlZCwgdGhpcyksIGUub2ZmKEkuTEVWRUxfTE9BREVELCB0aGlzLm9uTGV2ZWxMb2FkZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfTE9BRF9FTUVSR0VOQ1lfQUJPUlRFRCwgdGhpcy5vbkZyYWdMb2FkRW1lcmdlbmN5QWJvcnRlZCwgdGhpcyksIGUub2ZmKEkuQVVESU9fVFJBQ0tfU1dJVENISU5HLCB0aGlzLm9uQXVkaW9UcmFja1N3aXRjaGluZywgdGhpcyksIGUub2ZmKEkuQVVESU9fVFJBQ0tfU1dJVENIRUQsIHRoaXMub25BdWRpb1RyYWNrU3dpdGNoZWQsIHRoaXMpLCBlLm9mZihJLkJVRkZFUl9DUkVBVEVELCB0aGlzLm9uQnVmZmVyQ3JlYXRlZCwgdGhpcyksIGUub2ZmKEkuQlVGRkVSX0ZMVVNIRUQsIHRoaXMub25CdWZmZXJGbHVzaGVkLCB0aGlzKSwgZS5vZmYoSS5MRVZFTFNfVVBEQVRFRCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQsIHRoaXMpLCBlLm9mZihJLkZSQUdfQlVGRkVSRUQsIHRoaXMub25GcmFnQnVmZmVyZWQsIHRoaXMpO1xuICB9XG4gIG9uSGFuZGxlckRlc3Ryb3lpbmcoKSB7XG4gICAgdGhpcy5vbk1lZGlhUGxheWluZyA9IHRoaXMub25NZWRpYVNlZWtlZCA9IG51bGwsIHRoaXMudW5yZWdpc3Rlckxpc3RlbmVycygpLCBzdXBlci5vbkhhbmRsZXJEZXN0cm95aW5nKCk7XG4gIH1cbiAgc3RhcnRMb2FkKGUsIHQpIHtcbiAgICBpZiAodGhpcy5sZXZlbHMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGFzdEN1cnJlbnRUaW1lOiByLFxuICAgICAgICBobHM6IG5cbiAgICAgIH0gPSB0aGlzO1xuICAgICAgaWYgKHRoaXMuc3RvcExvYWQoKSwgdGhpcy5zZXRJbnRlcnZhbCh4QSksIHRoaXMubGV2ZWwgPSAtMSwgIXRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkKSB7XG4gICAgICAgIGxldCBpID0gbi5zdGFydExldmVsO1xuICAgICAgICBpID09PSAtMSAmJiAobi5jb25maWcudGVzdEJhbmR3aWR0aCAmJiB0aGlzLmxldmVscy5sZW5ndGggPiAxID8gKGkgPSAwLCB0aGlzLmJpdHJhdGVUZXN0ID0gITApIDogaSA9IG4uZmlyc3RBdXRvTGV2ZWwpLCBuLm5leHRMb2FkTGV2ZWwgPSBpLCB0aGlzLmxldmVsID0gbi5sb2FkTGV2ZWwsIHRoaXMuX2hhc0Vub3VnaFRvU3RhcnQgPSAhIXQ7XG4gICAgICB9XG4gICAgICByID4gMCAmJiBlID09PSAtMSAmJiAhdCAmJiAodGhpcy5sb2coYE92ZXJyaWRlIHN0YXJ0UG9zaXRpb24gd2l0aCBsYXN0Q3VycmVudFRpbWUgQCR7ci50b0ZpeGVkKDMpfWApLCBlID0gciksIHRoaXMuc3RhdGUgPSBuZS5JRExFLCB0aGlzLm5leHRMb2FkUG9zaXRpb24gPSB0aGlzLmxhc3RDdXJyZW50VGltZSA9IGUgKyB0aGlzLnRpbWVsaW5lT2Zmc2V0LCB0aGlzLnN0YXJ0UG9zaXRpb24gPSB0ID8gLTEgOiBlLCB0aGlzLnRpY2soKTtcbiAgICB9IGVsc2VcbiAgICAgIHRoaXMuX2ZvcmNlU3RhcnRMb2FkID0gITAsIHRoaXMuc3RhdGUgPSBuZS5TVE9QUEVEO1xuICB9XG4gIHN0b3BMb2FkKCkge1xuICAgIHRoaXMuX2ZvcmNlU3RhcnRMb2FkID0gITEsIHN1cGVyLnN0b3BMb2FkKCk7XG4gIH1cbiAgZG9UaWNrKCkge1xuICAgIHN3aXRjaCAodGhpcy5zdGF0ZSkge1xuICAgICAgY2FzZSBuZS5XQUlUSU5HX0xFVkVMOiB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBsZXZlbHM6IGUsXG4gICAgICAgICAgbGV2ZWw6IHRcbiAgICAgICAgfSA9IHRoaXMsIHIgPSBlID09IG51bGwgPyB2b2lkIDAgOiBlW3RdLCBuID0gciA9PSBudWxsID8gdm9pZCAwIDogci5kZXRhaWxzO1xuICAgICAgICBpZiAobiAmJiAoIW4ubGl2ZSB8fCB0aGlzLmxldmVsTGFzdExvYWRlZCA9PT0gciAmJiAhdGhpcy53YWl0Rm9yTGl2ZShyKSkpIHtcbiAgICAgICAgICBpZiAodGhpcy53YWl0Rm9yQ2RuVHVuZUluKG4pKVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgdGhpcy5zdGF0ZSA9IG5lLklETEU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5obHMubmV4dExvYWRMZXZlbCAhPT0gdGhpcy5sZXZlbCkge1xuICAgICAgICAgIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBuZS5GUkFHX0xPQURJTkdfV0FJVElOR19SRVRSWTpcbiAgICAgICAgdGhpcy5jaGVja1JldHJ5RGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5zdGF0ZSA9PT0gbmUuSURMRSAmJiB0aGlzLmRvVGlja0lkbGUoKSwgdGhpcy5vblRpY2tFbmQoKTtcbiAgfVxuICBvblRpY2tFbmQoKSB7XG4gICAgdmFyIGU7XG4gICAgc3VwZXIub25UaWNrRW5kKCksIChlID0gdGhpcy5tZWRpYSkgIT0gbnVsbCAmJiBlLnJlYWR5U3RhdGUgJiYgdGhpcy5tZWRpYS5zZWVraW5nID09PSAhMSAmJiAodGhpcy5sYXN0Q3VycmVudFRpbWUgPSB0aGlzLm1lZGlhLmN1cnJlbnRUaW1lKSwgdGhpcy5jaGVja0ZyYWdtZW50Q2hhbmdlZCgpO1xuICB9XG4gIGRvVGlja0lkbGUoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlLFxuICAgICAgbGV2ZWxMYXN0TG9hZGVkOiB0LFxuICAgICAgbGV2ZWxzOiByLFxuICAgICAgbWVkaWE6IG5cbiAgICB9ID0gdGhpcztcbiAgICBpZiAodCA9PT0gbnVsbCB8fCAhbiAmJiAhdGhpcy5wcmltYXJ5UHJlZmV0Y2ggJiYgKHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkIHx8ICFlLmNvbmZpZy5zdGFydEZyYWdQcmVmZXRjaCkgfHwgdGhpcy5hbHRBdWRpbyAmJiB0aGlzLmF1ZGlvT25seSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gdGhpcy5idWZmZXJpbmcgPyBlLm5leHRMb2FkTGV2ZWwgOiBlLmxvYWRMZXZlbDtcbiAgICBpZiAoIShyICE9IG51bGwgJiYgcltpXSkpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbyA9IHJbaV0sIGEgPSB0aGlzLmdldE1haW5Gd2RCdWZmZXJJbmZvKCk7XG4gICAgaWYgKGEgPT09IG51bGwpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbCA9IHRoaXMuZ2V0TGV2ZWxEZXRhaWxzKCk7XG4gICAgaWYgKGwgJiYgdGhpcy5fc3RyZWFtRW5kZWQoYSwgbCkpIHtcbiAgICAgIGNvbnN0IHkgPSB7fTtcbiAgICAgIHRoaXMuYWx0QXVkaW8gPT09IDIgJiYgKHkudHlwZSA9IFwidmlkZW9cIiksIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfRU9TLCB5KSwgdGhpcy5zdGF0ZSA9IG5lLkVOREVEO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYnVmZmVyaW5nKVxuICAgICAgcmV0dXJuO1xuICAgIGUubG9hZExldmVsICE9PSBpICYmIGUubWFudWFsTGV2ZWwgPT09IC0xICYmIHRoaXMubG9nKGBBZGFwdGluZyB0byBsZXZlbCAke2l9IGZyb20gbGV2ZWwgJHt0aGlzLmxldmVsfWApLCB0aGlzLmxldmVsID0gZS5uZXh0TG9hZExldmVsID0gaTtcbiAgICBjb25zdCBjID0gby5kZXRhaWxzO1xuICAgIGlmICghYyB8fCB0aGlzLnN0YXRlID09PSBuZS5XQUlUSU5HX0xFVkVMIHx8IHRoaXMud2FpdEZvckxpdmUobykpIHtcbiAgICAgIHRoaXMubGV2ZWwgPSBpLCB0aGlzLnN0YXRlID0gbmUuV0FJVElOR19MRVZFTCwgdGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgdSA9IGEubGVuLCBkID0gdGhpcy5nZXRNYXhCdWZmZXJMZW5ndGgoby5tYXhCaXRyYXRlKTtcbiAgICBpZiAodSA+PSBkKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgJiYgdGhpcy5iYWNrdHJhY2tGcmFnbWVudC5zdGFydCA+IGEuZW5kICYmICh0aGlzLmJhY2t0cmFja0ZyYWdtZW50ID0gbnVsbCk7XG4gICAgY29uc3QgaCA9IHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgPyB0aGlzLmJhY2t0cmFja0ZyYWdtZW50LnN0YXJ0IDogYS5lbmQ7XG4gICAgbGV0IGYgPSB0aGlzLmdldE5leHRGcmFnbWVudChoLCBjKTtcbiAgICBpZiAodGhpcy5jb3VsZEJhY2t0cmFjayAmJiAhdGhpcy5mcmFnUHJldmlvdXMgJiYgZiAmJiBWdChmKSAmJiB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRTdGF0ZShmKSAhPT0gSHQuT0spIHtcbiAgICAgIHZhciBwO1xuICAgICAgY29uc3QgRSA9ICgocCA9IHRoaXMuYmFja3RyYWNrRnJhZ21lbnQpICE9IG51bGwgPyBwIDogZikuc24gLSBjLnN0YXJ0U04sIGIgPSBjLmZyYWdtZW50c1tFIC0gMV07XG4gICAgICBiICYmIGYuY2MgPT09IGIuY2MgJiYgKGYgPSBiLCB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudChiKSk7XG4gICAgfSBlbHNlIHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgJiYgYS5sZW4gJiYgKHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgPSBudWxsKTtcbiAgICBpZiAoZiAmJiB0aGlzLmlzTG9vcExvYWRpbmcoZiwgaCkpIHtcbiAgICAgIGlmICghZi5nYXApIHtcbiAgICAgICAgY29uc3QgRSA9IHRoaXMuYXVkaW9Pbmx5ICYmICF0aGlzLmFsdEF1ZGlvID8gb3QuQVVESU8gOiBvdC5WSURFTywgYiA9IChFID09PSBvdC5WSURFTyA/IHRoaXMudmlkZW9CdWZmZXIgOiB0aGlzLm1lZGlhQnVmZmVyKSB8fCB0aGlzLm1lZGlhO1xuICAgICAgICBiICYmIHRoaXMuYWZ0ZXJCdWZmZXJGbHVzaGVkKGIsIEUsIHBlLk1BSU4pO1xuICAgICAgfVxuICAgICAgZiA9IHRoaXMuZ2V0TmV4dEZyYWdtZW50TG9vcExvYWRpbmcoZiwgYywgYSwgcGUuTUFJTiwgZCk7XG4gICAgfVxuICAgIGYgJiYgKGYuaW5pdFNlZ21lbnQgJiYgIWYuaW5pdFNlZ21lbnQuZGF0YSAmJiAhdGhpcy5iaXRyYXRlVGVzdCAmJiAoZiA9IGYuaW5pdFNlZ21lbnQpLCB0aGlzLmxvYWRGcmFnbWVudChmLCBvLCBoKSk7XG4gIH1cbiAgbG9hZEZyYWdtZW50KGUsIHQsIHIpIHtcbiAgICBjb25zdCBuID0gdGhpcy5mcmFnbWVudFRyYWNrZXIuZ2V0U3RhdGUoZSk7XG4gICAgbiA9PT0gSHQuTk9UX0xPQURFRCB8fCBuID09PSBIdC5QQVJUSUFMID8gVnQoZSkgPyB0aGlzLmJpdHJhdGVUZXN0ID8gKHRoaXMubG9nKGBGcmFnbWVudCAke2Uuc259IG9mIGxldmVsICR7ZS5sZXZlbH0gaXMgYmVpbmcgZG93bmxvYWRlZCB0byB0ZXN0IGJpdHJhdGUgYW5kIHdpbGwgbm90IGJlIGJ1ZmZlcmVkYCksIHRoaXMuX2xvYWRCaXRyYXRlVGVzdEZyYWcoZSwgdCkpIDogc3VwZXIubG9hZEZyYWdtZW50KGUsIHQsIHIpIDogdGhpcy5fbG9hZEluaXRTZWdtZW50KGUsIHQpIDogdGhpcy5jbGVhclRyYWNrZXJJZk5lZWRlZChlKTtcbiAgfVxuICBnZXRCdWZmZXJlZEZyYWcoZSkge1xuICAgIHJldHVybiB0aGlzLmZyYWdtZW50VHJhY2tlci5nZXRCdWZmZXJlZEZyYWcoZSwgcGUuTUFJTik7XG4gIH1cbiAgZm9sbG93aW5nQnVmZmVyZWRGcmFnKGUpIHtcbiAgICByZXR1cm4gZSA/IHRoaXMuZ2V0QnVmZmVyZWRGcmFnKGUuZW5kICsgMC41KSA6IG51bGw7XG4gIH1cbiAgLypcbiAgICBvbiBpbW1lZGlhdGUgbGV2ZWwgc3dpdGNoIDpcbiAgICAgLSBwYXVzZSBwbGF5YmFjayBpZiBwbGF5aW5nXG4gICAgIC0gY2FuY2VsIGFueSBwZW5kaW5nIGxvYWQgcmVxdWVzdFxuICAgICAtIGFuZCB0cmlnZ2VyIGEgYnVmZmVyIGZsdXNoXG4gICovXG4gIGltbWVkaWF0ZUxldmVsU3dpdGNoKCkge1xuICAgIHRoaXMuYWJvcnRDdXJyZW50RnJhZygpLCB0aGlzLmZsdXNoTWFpbkJ1ZmZlcigwLCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuICB9XG4gIC8qKlxuICAgKiB0cnkgdG8gc3dpdGNoIEFTQVAgd2l0aG91dCBicmVha2luZyB2aWRlbyBwbGF5YmFjazpcbiAgICogaW4gb3JkZXIgdG8gZW5zdXJlIHNtb290aCBidXQgcXVpY2sgbGV2ZWwgc3dpdGNoaW5nLFxuICAgKiB3ZSBuZWVkIHRvIGZpbmQgdGhlIG5leHQgZmx1c2hhYmxlIGJ1ZmZlciByYW5nZVxuICAgKiB3ZSBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgbmV3IHNlZ21lbnQgZmV0Y2ggdGltZVxuICAgKi9cbiAgbmV4dExldmVsU3dpdGNoKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogZSxcbiAgICAgIG1lZGlhOiB0XG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKHQgIT0gbnVsbCAmJiB0LnJlYWR5U3RhdGUpIHtcbiAgICAgIGxldCByO1xuICAgICAgY29uc3QgbiA9IHRoaXMuZ2V0QXBwZW5kZWRGcmFnKHQuY3VycmVudFRpbWUpO1xuICAgICAgbiAmJiBuLnN0YXJ0ID4gMSAmJiB0aGlzLmZsdXNoTWFpbkJ1ZmZlcigwLCBuLnN0YXJ0IC0gMSk7XG4gICAgICBjb25zdCBpID0gdGhpcy5nZXRMZXZlbERldGFpbHMoKTtcbiAgICAgIGlmIChpICE9IG51bGwgJiYgaS5saXZlKSB7XG4gICAgICAgIGNvbnN0IGEgPSB0aGlzLmdldE1haW5Gd2RCdWZmZXJJbmZvKCk7XG4gICAgICAgIGlmICghYSB8fCBhLmxlbiA8IGkudGFyZ2V0ZHVyYXRpb24gKiAyKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdC5wYXVzZWQgJiYgZSkge1xuICAgICAgICBjb25zdCBhID0gdGhpcy5obHMubmV4dExvYWRMZXZlbCwgbCA9IGVbYV0sIGMgPSB0aGlzLmZyYWdMYXN0S2JwcztcbiAgICAgICAgYyAmJiB0aGlzLmZyYWdDdXJyZW50ID8gciA9IHRoaXMuZnJhZ0N1cnJlbnQuZHVyYXRpb24gKiBsLm1heEJpdHJhdGUgLyAoMWUzICogYykgKyAxIDogciA9IDA7XG4gICAgICB9IGVsc2VcbiAgICAgICAgciA9IDA7XG4gICAgICBjb25zdCBvID0gdGhpcy5nZXRCdWZmZXJlZEZyYWcodC5jdXJyZW50VGltZSArIHIpO1xuICAgICAgaWYgKG8pIHtcbiAgICAgICAgY29uc3QgYSA9IHRoaXMuZm9sbG93aW5nQnVmZmVyZWRGcmFnKG8pO1xuICAgICAgICBpZiAoYSkge1xuICAgICAgICAgIHRoaXMuYWJvcnRDdXJyZW50RnJhZygpO1xuICAgICAgICAgIGNvbnN0IGwgPSBhLm1heFN0YXJ0UFRTID8gYS5tYXhTdGFydFBUUyA6IGEuc3RhcnQsIGMgPSBhLmR1cmF0aW9uLCB1ID0gTWF0aC5tYXgoby5lbmQsIGwgKyBNYXRoLm1pbihNYXRoLm1heChjIC0gdGhpcy5jb25maWcubWF4RnJhZ0xvb2tVcFRvbGVyYW5jZSwgYyAqICh0aGlzLmNvdWxkQmFja3RyYWNrID8gMC41IDogMC4xMjUpKSwgYyAqICh0aGlzLmNvdWxkQmFja3RyYWNrID8gMC43NSA6IDAuMjUpKSk7XG4gICAgICAgICAgdGhpcy5mbHVzaE1haW5CdWZmZXIodSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBhYm9ydEN1cnJlbnRGcmFnKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmZyYWdDdXJyZW50O1xuICAgIHN3aXRjaCAodGhpcy5mcmFnQ3VycmVudCA9IG51bGwsIHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgPSBudWxsLCBlICYmIChlLmFib3J0UmVxdWVzdHMoKSwgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnQoZSkpLCB0aGlzLnN0YXRlKSB7XG4gICAgICBjYXNlIG5lLktFWV9MT0FESU5HOlxuICAgICAgY2FzZSBuZS5GUkFHX0xPQURJTkc6XG4gICAgICBjYXNlIG5lLkZSQUdfTE9BRElOR19XQUlUSU5HX1JFVFJZOlxuICAgICAgY2FzZSBuZS5QQVJTSU5HOlxuICAgICAgY2FzZSBuZS5QQVJTRUQ6XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdGhpcy5uZXh0TG9hZFBvc2l0aW9uID0gdGhpcy5nZXRMb2FkUG9zaXRpb24oKTtcbiAgfVxuICBmbHVzaE1haW5CdWZmZXIoZSwgdCkge1xuICAgIHN1cGVyLmZsdXNoTWFpbkJ1ZmZlcihlLCB0LCB0aGlzLmFsdEF1ZGlvID09PSAyID8gXCJ2aWRlb1wiIDogbnVsbCk7XG4gIH1cbiAgb25NZWRpYUF0dGFjaGVkKGUsIHQpIHtcbiAgICBzdXBlci5vbk1lZGlhQXR0YWNoZWQoZSwgdCk7XG4gICAgY29uc3QgciA9IHQubWVkaWE7XG4gICAgY3IociwgXCJwbGF5aW5nXCIsIHRoaXMub25NZWRpYVBsYXlpbmcpLCBjcihyLCBcInNlZWtlZFwiLCB0aGlzLm9uTWVkaWFTZWVrZWQpO1xuICB9XG4gIG9uTWVkaWFEZXRhY2hpbmcoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG1lZGlhOiByXG4gICAgfSA9IHRoaXM7XG4gICAgciAmJiAocHIociwgXCJwbGF5aW5nXCIsIHRoaXMub25NZWRpYVBsYXlpbmcpLCBwcihyLCBcInNlZWtlZFwiLCB0aGlzLm9uTWVkaWFTZWVrZWQpKSwgdGhpcy52aWRlb0J1ZmZlciA9IG51bGwsIHRoaXMuZnJhZ1BsYXlpbmcgPSBudWxsLCBzdXBlci5vbk1lZGlhRGV0YWNoaW5nKGUsIHQpLCAhdC50cmFuc2Zlck1lZGlhICYmICh0aGlzLl9oYXNFbm91Z2hUb1N0YXJ0ID0gITEpO1xuICB9XG4gIG9uTWFuaWZlc3RMb2FkaW5nKCkge1xuICAgIHN1cGVyLm9uTWFuaWZlc3RMb2FkaW5nKCksIHRoaXMubG9nKFwiVHJpZ2dlciBCVUZGRVJfUkVTRVRcIiksIHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfUkVTRVQsIHZvaWQgMCksIHRoaXMuY291bGRCYWNrdHJhY2sgPSAhMSwgdGhpcy5mcmFnTGFzdEticHMgPSAwLCB0aGlzLmZyYWdQbGF5aW5nID0gdGhpcy5iYWNrdHJhY2tGcmFnbWVudCA9IG51bGwsIHRoaXMuYWx0QXVkaW8gPSAwLCB0aGlzLmF1ZGlvT25seSA9ICExO1xuICB9XG4gIG9uTWFuaWZlc3RQYXJzZWQoZSwgdCkge1xuICAgIGxldCByID0gITEsIG4gPSAhMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHQubGV2ZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBvID0gdC5sZXZlbHNbaV0uYXVkaW9Db2RlYztcbiAgICAgIG8gJiYgKHIgPSByIHx8IG8uaW5kZXhPZihcIm1wNGEuNDAuMlwiKSAhPT0gLTEsIG4gPSBuIHx8IG8uaW5kZXhPZihcIm1wNGEuNDAuNVwiKSAhPT0gLTEpO1xuICAgIH1cbiAgICB0aGlzLmF1ZGlvQ29kZWNTd2l0Y2ggPSByICYmIG4gJiYgIUVBKCksIHRoaXMuYXVkaW9Db2RlY1N3aXRjaCAmJiB0aGlzLmxvZyhcIkJvdGggQUFDL0hFLUFBQyBhdWRpbyBmb3VuZCBpbiBsZXZlbHM7IGRlY2xhcmluZyBsZXZlbCBjb2RlYyBhcyBIRS1BQUNcIiksIHRoaXMubGV2ZWxzID0gdC5sZXZlbHMsIHRoaXMuc3RhcnRGcmFnUmVxdWVzdGVkID0gITE7XG4gIH1cbiAgb25MZXZlbExvYWRpbmcoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogclxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghciB8fCB0aGlzLnN0YXRlICE9PSBuZS5JRExFKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IG4gPSB0LmxldmVsSW5mbztcbiAgICAoIW4uZGV0YWlscyB8fCBuLmRldGFpbHMubGl2ZSAmJiAodGhpcy5sZXZlbExhc3RMb2FkZWQgIT09IG4gfHwgbi5kZXRhaWxzLmV4cGlyZWQpIHx8IHRoaXMud2FpdEZvckNkblR1bmVJbihuLmRldGFpbHMpKSAmJiAodGhpcy5zdGF0ZSA9IG5lLldBSVRJTkdfTEVWRUwpO1xuICB9XG4gIG9uTGV2ZWxMb2FkZWQoZSwgdCkge1xuICAgIHZhciByO1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogbixcbiAgICAgIHN0YXJ0RnJhZ1JlcXVlc3RlZDogaVxuICAgIH0gPSB0aGlzLCBvID0gdC5sZXZlbCwgYSA9IHQuZGV0YWlscywgbCA9IGEudG90YWxkdXJhdGlvbjtcbiAgICBpZiAoIW4pIHtcbiAgICAgIHRoaXMud2FybihgTGV2ZWxzIHdlcmUgcmVzZXQgd2hpbGUgbG9hZGluZyBsZXZlbCAke299YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9nKGBMZXZlbCAke299IGxvYWRlZCBbJHthLnN0YXJ0U059LCR7YS5lbmRTTn1dJHthLmxhc3RQYXJ0U24gPyBgW3BhcnQtJHthLmxhc3RQYXJ0U259LSR7YS5sYXN0UGFydEluZGV4fV1gIDogXCJcIn0sIGNjIFske2Euc3RhcnRDQ30sICR7YS5lbmRDQ31dIGR1cmF0aW9uOiR7bH1gKTtcbiAgICBjb25zdCBjID0gdC5sZXZlbEluZm8sIHUgPSB0aGlzLmZyYWdDdXJyZW50O1xuICAgIHUgJiYgKHRoaXMuc3RhdGUgPT09IG5lLkZSQUdfTE9BRElORyB8fCB0aGlzLnN0YXRlID09PSBuZS5GUkFHX0xPQURJTkdfV0FJVElOR19SRVRSWSkgJiYgdS5sZXZlbCAhPT0gdC5sZXZlbCAmJiB1LmxvYWRlciAmJiB0aGlzLmFib3J0Q3VycmVudEZyYWcoKTtcbiAgICBsZXQgZCA9IDA7XG4gICAgaWYgKGEubGl2ZSB8fCAociA9IGMuZGV0YWlscykgIT0gbnVsbCAmJiByLmxpdmUpIHtcbiAgICAgIHZhciBoO1xuICAgICAgaWYgKHRoaXMuY2hlY2tMaXZlVXBkYXRlKGEpLCBhLmRlbHRhVXBkYXRlRmFpbGVkKVxuICAgICAgICByZXR1cm47XG4gICAgICBkID0gdGhpcy5hbGlnblBsYXlsaXN0cyhhLCBjLmRldGFpbHMsIChoID0gdGhpcy5sZXZlbExhc3RMb2FkZWQpID09IG51bGwgPyB2b2lkIDAgOiBoLmRldGFpbHMpO1xuICAgIH1cbiAgICBpZiAoYy5kZXRhaWxzID0gYSwgdGhpcy5sZXZlbExhc3RMb2FkZWQgPSBjLCBpIHx8IHRoaXMuc2V0U3RhcnRQb3NpdGlvbihhLCBkKSwgdGhpcy5obHMudHJpZ2dlcihJLkxFVkVMX1VQREFURUQsIHtcbiAgICAgIGRldGFpbHM6IGEsXG4gICAgICBsZXZlbDogb1xuICAgIH0pLCB0aGlzLnN0YXRlID09PSBuZS5XQUlUSU5HX0xFVkVMKSB7XG4gICAgICBpZiAodGhpcy53YWl0Rm9yQ2RuVHVuZUluKGEpKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnN0YXRlID0gbmUuSURMRTtcbiAgICB9XG4gICAgaSAmJiBhLmxpdmUgJiYgdGhpcy5zeW5jaHJvbml6ZVRvTGl2ZUVkZ2UoYSksIHRoaXMudGljaygpO1xuICB9XG4gIHN5bmNocm9uaXplVG9MaXZlRWRnZShlKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29uZmlnOiB0LFxuICAgICAgbWVkaWE6IHJcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIXIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgbiA9IHRoaXMuaGxzLmxpdmVTeW5jUG9zaXRpb24sIGkgPSB0aGlzLmdldExvYWRQb3NpdGlvbigpLCBvID0gZS5mcmFnbWVudFN0YXJ0LCBhID0gZS5lZGdlLCBsID0gaSA+PSBvIC0gdC5tYXhGcmFnTG9va1VwVG9sZXJhbmNlICYmIGkgPD0gYTtcbiAgICBpZiAobiAhPT0gbnVsbCAmJiByLmR1cmF0aW9uID4gbiAmJiAoaSA8IG4gfHwgIWwpKSB7XG4gICAgICBjb25zdCB1ID0gdC5saXZlTWF4TGF0ZW5jeUR1cmF0aW9uICE9PSB2b2lkIDAgPyB0LmxpdmVNYXhMYXRlbmN5RHVyYXRpb24gOiB0LmxpdmVNYXhMYXRlbmN5RHVyYXRpb25Db3VudCAqIGUudGFyZ2V0ZHVyYXRpb247XG4gICAgICBpZiAoKCFsICYmIHIucmVhZHlTdGF0ZSA8IDQgfHwgaSA8IGEgLSB1KSAmJiAodGhpcy5faGFzRW5vdWdoVG9TdGFydCB8fCAodGhpcy5uZXh0TG9hZFBvc2l0aW9uID0gbiksIHIucmVhZHlTdGF0ZSkpXG4gICAgICAgIGlmICh0aGlzLndhcm4oYFBsYXliYWNrOiAke2kudG9GaXhlZCgzKX0gaXMgbG9jYXRlZCB0b28gZmFyIGZyb20gdGhlIGVuZCBvZiBsaXZlIHNsaWRpbmcgcGxheWxpc3Q6ICR7YX0sIHJlc2V0IGN1cnJlbnRUaW1lIHRvIDogJHtuLnRvRml4ZWQoMyl9YCksIHRoaXMuY29uZmlnLmxpdmVTeW5jTW9kZSA9PT0gXCJidWZmZXJlZFwiKSB7XG4gICAgICAgICAgdmFyIGM7XG4gICAgICAgICAgY29uc3QgZCA9IENlLmJ1ZmZlckluZm8ociwgbiwgMCk7XG4gICAgICAgICAgaWYgKCEoKGMgPSBkLmJ1ZmZlcmVkKSAhPSBudWxsICYmIGMubGVuZ3RoKSkge1xuICAgICAgICAgICAgci5jdXJyZW50VGltZSA9IG47XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChkLnN0YXJ0IDw9IGkpIHtcbiAgICAgICAgICAgIHIuY3VycmVudFRpbWUgPSBuO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBuZXh0U3RhcnQ6IGZcbiAgICAgICAgICB9ID0gQ2UuYnVmZmVyZWRJbmZvKGQuYnVmZmVyZWQsIGksIDApO1xuICAgICAgICAgIGYgJiYgKHIuY3VycmVudFRpbWUgPSBmKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgci5jdXJyZW50VGltZSA9IG47XG4gICAgfVxuICB9XG4gIF9oYW5kbGVGcmFnbWVudExvYWRQcm9ncmVzcyhlKSB7XG4gICAgdmFyIHQ7XG4gICAgY29uc3QgciA9IGUuZnJhZywge1xuICAgICAgcGFydDogbixcbiAgICAgIHBheWxvYWQ6IGlcbiAgICB9ID0gZSwge1xuICAgICAgbGV2ZWxzOiBvXG4gICAgfSA9IHRoaXM7XG4gICAgaWYgKCFvKSB7XG4gICAgICB0aGlzLndhcm4oYExldmVscyB3ZXJlIHJlc2V0IHdoaWxlIGZyYWdtZW50IGxvYWQgd2FzIGluIHByb2dyZXNzLiBGcmFnbWVudCAke3Iuc259IG9mIGxldmVsICR7ci5sZXZlbH0gd2lsbCBub3QgYmUgYnVmZmVyZWRgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYSA9IG9bci5sZXZlbF07XG4gICAgaWYgKCFhKSB7XG4gICAgICB0aGlzLndhcm4oYExldmVsICR7ci5sZXZlbH0gbm90IGZvdW5kIG9uIHByb2dyZXNzYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGwgPSBhLmRldGFpbHM7XG4gICAgaWYgKCFsKSB7XG4gICAgICB0aGlzLndhcm4oYERyb3BwaW5nIGZyYWdtZW50ICR7ci5zbn0gb2YgbGV2ZWwgJHtyLmxldmVsfSBhZnRlciBsZXZlbCBkZXRhaWxzIHdlcmUgcmVzZXRgKSwgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlRnJhZ21lbnQocik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGMgPSBhLnZpZGVvQ29kZWMsIHUgPSBsLlBUU0tub3duIHx8ICFsLmxpdmUsIGQgPSAodCA9IHIuaW5pdFNlZ21lbnQpID09IG51bGwgPyB2b2lkIDAgOiB0LmRhdGEsIGggPSB0aGlzLl9nZXRBdWRpb0NvZGVjKGEpLCBmID0gdGhpcy50cmFuc211eGVyID0gdGhpcy50cmFuc211eGVyIHx8IG5ldyB3cCh0aGlzLmhscywgcGUuTUFJTiwgdGhpcy5faGFuZGxlVHJhbnNtdXhDb21wbGV0ZS5iaW5kKHRoaXMpLCB0aGlzLl9oYW5kbGVUcmFuc211eGVyRmx1c2guYmluZCh0aGlzKSksIHAgPSBuID8gbi5pbmRleCA6IC0xLCB5ID0gcCAhPT0gLTEsIEUgPSBuZXcgRXUoci5sZXZlbCwgci5zbiwgci5zdGF0cy5jaHVua0NvdW50LCBpLmJ5dGVMZW5ndGgsIHAsIHkpLCBiID0gdGhpcy5pbml0UFRTW3IuY2NdO1xuICAgIGYucHVzaChpLCBkLCBoLCBjLCByLCBuLCBsLnRvdGFsZHVyYXRpb24sIHUsIEUsIGIpO1xuICB9XG4gIG9uQXVkaW9UcmFja1N3aXRjaGluZyhlLCB0KSB7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLCBuID0gdGhpcy5hbHRBdWRpbyA9PT0gMjtcbiAgICBpZiAoUW8odC51cmwsIHIpKVxuICAgICAgdGhpcy5hbHRBdWRpbyA9IDE7XG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5tZWRpYUJ1ZmZlciAhPT0gdGhpcy5tZWRpYSkge1xuICAgICAgICB0aGlzLmxvZyhcIlN3aXRjaGluZyBvbiBtYWluIGF1ZGlvLCB1c2UgbWVkaWEuYnVmZmVyZWQgdG8gc2NoZWR1bGUgbWFpbiBmcmFnbWVudCBsb2FkaW5nXCIpLCB0aGlzLm1lZGlhQnVmZmVyID0gdGhpcy5tZWRpYTtcbiAgICAgICAgY29uc3QgbyA9IHRoaXMuZnJhZ0N1cnJlbnQ7XG4gICAgICAgIG8gJiYgKHRoaXMubG9nKFwiU3dpdGNoaW5nIHRvIG1haW4gYXVkaW8gdHJhY2ssIGNhbmNlbCBtYWluIGZyYWdtZW50IGxvYWRcIiksIG8uYWJvcnRSZXF1ZXN0cygpLCB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudChvKSksIHRoaXMucmVzZXRUcmFuc211eGVyKCksIHRoaXMucmVzZXRMb2FkaW5nU3RhdGUoKTtcbiAgICAgIH0gZWxzZSB0aGlzLmF1ZGlvT25seSAmJiB0aGlzLnJlc2V0VHJhbnNtdXhlcigpO1xuICAgICAgaWYgKG4pIHtcbiAgICAgICAgdGhpcy5mcmFnbWVudFRyYWNrZXIucmVtb3ZlQWxsRnJhZ21lbnRzKCksIHIub25jZShJLkJVRkZFUl9GTFVTSEVELCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5obHMgJiYgdGhpcy5obHMudHJpZ2dlcihJLkFVRElPX1RSQUNLX1NXSVRDSEVELCB0KTtcbiAgICAgICAgfSksIHIudHJpZ2dlcihJLkJVRkZFUl9GTFVTSElORywge1xuICAgICAgICAgIHN0YXJ0T2Zmc2V0OiAwLFxuICAgICAgICAgIGVuZE9mZnNldDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuICAgICAgICAgIHR5cGU6IG51bGxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHIudHJpZ2dlcihJLkFVRElPX1RSQUNLX1NXSVRDSEVELCB0KTtcbiAgICB9XG4gIH1cbiAgb25BdWRpb1RyYWNrU3dpdGNoZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSBRbyh0LnVybCwgdGhpcy5obHMpO1xuICAgIGlmIChyKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy52aWRlb0J1ZmZlcjtcbiAgICAgIG4gJiYgdGhpcy5tZWRpYUJ1ZmZlciAhPT0gbiAmJiAodGhpcy5sb2coXCJTd2l0Y2hpbmcgb24gYWx0ZXJuYXRlIGF1ZGlvLCB1c2UgdmlkZW8uYnVmZmVyZWQgdG8gc2NoZWR1bGUgbWFpbiBmcmFnbWVudCBsb2FkaW5nXCIpLCB0aGlzLm1lZGlhQnVmZmVyID0gbik7XG4gICAgfVxuICAgIHRoaXMuYWx0QXVkaW8gPSByID8gMiA6IDAsIHRoaXMudGljaygpO1xuICB9XG4gIG9uQnVmZmVyQ3JlYXRlZChlLCB0KSB7XG4gICAgY29uc3QgciA9IHQudHJhY2tzO1xuICAgIGxldCBuLCBpLCBvID0gITE7XG4gICAgZm9yIChjb25zdCBhIGluIHIpIHtcbiAgICAgIGNvbnN0IGwgPSByW2FdO1xuICAgICAgaWYgKGwuaWQgPT09IFwibWFpblwiKSB7XG4gICAgICAgIGlmIChpID0gYSwgbiA9IGwsIGEgPT09IFwidmlkZW9cIikge1xuICAgICAgICAgIGNvbnN0IGMgPSByW2FdO1xuICAgICAgICAgIGMgJiYgKHRoaXMudmlkZW9CdWZmZXIgPSBjLmJ1ZmZlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZVxuICAgICAgICBvID0gITA7XG4gICAgfVxuICAgIG8gJiYgbiA/ICh0aGlzLmxvZyhgQWx0ZXJuYXRlIHRyYWNrIGZvdW5kLCB1c2UgJHtpfS5idWZmZXJlZCB0byBzY2hlZHVsZSBtYWluIGZyYWdtZW50IGxvYWRpbmdgKSwgdGhpcy5tZWRpYUJ1ZmZlciA9IG4uYnVmZmVyKSA6IHRoaXMubWVkaWFCdWZmZXIgPSB0aGlzLm1lZGlhO1xuICB9XG4gIG9uRnJhZ0J1ZmZlcmVkKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICBmcmFnOiByLFxuICAgICAgcGFydDogblxuICAgIH0gPSB0LCBpID0gci50eXBlID09PSBwZS5NQUlOO1xuICAgIGlmIChpKSB7XG4gICAgICBpZiAodGhpcy5mcmFnQ29udGV4dENoYW5nZWQocikpIHtcbiAgICAgICAgdGhpcy53YXJuKGBGcmFnbWVudCAke3Iuc259JHtuID8gXCIgcDogXCIgKyBuLmluZGV4IDogXCJcIn0gb2YgbGV2ZWwgJHtyLmxldmVsfSBmaW5pc2hlZCBidWZmZXJpbmcsIGJ1dCB3YXMgYWJvcnRlZC4gc3RhdGU6ICR7dGhpcy5zdGF0ZX1gKSwgdGhpcy5zdGF0ZSA9PT0gbmUuUEFSU0VEICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGEgPSBuID8gbi5zdGF0cyA6IHIuc3RhdHM7XG4gICAgICB0aGlzLmZyYWdMYXN0S2JwcyA9IE1hdGgucm91bmQoOCAqIGEudG90YWwgLyAoYS5idWZmZXJpbmcuZW5kIC0gYS5sb2FkaW5nLmZpcnN0KSksIFZ0KHIpICYmICh0aGlzLmZyYWdQcmV2aW91cyA9IHIpLCB0aGlzLmZyYWdCdWZmZXJlZENvbXBsZXRlKHIsIG4pO1xuICAgIH1cbiAgICBjb25zdCBvID0gdGhpcy5tZWRpYTtcbiAgICBvICYmICghdGhpcy5faGFzRW5vdWdoVG9TdGFydCAmJiBDZS5nZXRCdWZmZXJlZChvKS5sZW5ndGggJiYgKHRoaXMuX2hhc0Vub3VnaFRvU3RhcnQgPSAhMCwgdGhpcy5zZWVrVG9TdGFydFBvcygpKSwgaSAmJiB0aGlzLnRpY2soKSk7XG4gIH1cbiAgZ2V0IGhhc0Vub3VnaFRvU3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2hhc0Vub3VnaFRvU3RhcnQ7XG4gIH1cbiAgb25FcnJvcihlLCB0KSB7XG4gICAgdmFyIHI7XG4gICAgaWYgKHQuZmF0YWwpIHtcbiAgICAgIHRoaXMuc3RhdGUgPSBuZS5FUlJPUjtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3dpdGNoICh0LmRldGFpbHMpIHtcbiAgICAgIGNhc2UgSi5GUkFHX0dBUDpcbiAgICAgIGNhc2UgSi5GUkFHX1BBUlNJTkdfRVJST1I6XG4gICAgICBjYXNlIEouRlJBR19ERUNSWVBUX0VSUk9SOlxuICAgICAgY2FzZSBKLkZSQUdfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5GUkFHX0xPQURfVElNRU9VVDpcbiAgICAgIGNhc2UgSi5LRVlfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5LRVlfTE9BRF9USU1FT1VUOlxuICAgICAgICB0aGlzLm9uRnJhZ21lbnRPcktleUxvYWRFcnJvcihwZS5NQUlOLCB0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEouTEVWRUxfTE9BRF9FUlJPUjpcbiAgICAgIGNhc2UgSi5MRVZFTF9MT0FEX1RJTUVPVVQ6XG4gICAgICBjYXNlIEouTEVWRUxfUEFSU0lOR19FUlJPUjpcbiAgICAgICAgIXQubGV2ZWxSZXRyeSAmJiB0aGlzLnN0YXRlID09PSBuZS5XQUlUSU5HX0xFVkVMICYmICgociA9IHQuY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IHIudHlwZSkgPT09IEtlLkxFVkVMICYmICh0aGlzLnN0YXRlID0gbmUuSURMRSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBKLkJVRkZFUl9BRERfQ09ERUNfRVJST1I6XG4gICAgICBjYXNlIEouQlVGRkVSX0FQUEVORF9FUlJPUjpcbiAgICAgICAgaWYgKHQucGFyZW50ICE9PSBcIm1haW5cIilcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucmVkdWNlTGVuZ3RoQW5kRmx1c2hCdWZmZXIodCkgJiYgdGhpcy5yZXNldExvYWRpbmdTdGF0ZSgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgSi5CVUZGRVJfRlVMTF9FUlJPUjpcbiAgICAgICAgaWYgKHQucGFyZW50ICE9PSBcIm1haW5cIilcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMucmVkdWNlTGVuZ3RoQW5kRmx1c2hCdWZmZXIodCkgJiYgKCF0aGlzLmNvbmZpZy5pbnRlcnN0aXRpYWxzQ29udHJvbGxlciAmJiB0aGlzLmNvbmZpZy5hc3NldFBsYXllcklkID8gdGhpcy5faGFzRW5vdWdoVG9TdGFydCA9ICEwIDogdGhpcy5mbHVzaE1haW5CdWZmZXIoMCwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBKLklOVEVSTkFMX0VYQ0VQVElPTjpcbiAgICAgICAgdGhpcy5yZWNvdmVyV29ya2VyRXJyb3IodCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBvbkZyYWdMb2FkRW1lcmdlbmN5QWJvcnRlZCgpIHtcbiAgICB0aGlzLnN0YXRlID0gbmUuSURMRSwgdGhpcy5faGFzRW5vdWdoVG9TdGFydCB8fCAodGhpcy5zdGFydEZyYWdSZXF1ZXN0ZWQgPSAhMSwgdGhpcy5uZXh0TG9hZFBvc2l0aW9uID0gdGhpcy5sYXN0Q3VycmVudFRpbWUpLCB0aGlzLnRpY2tJbW1lZGlhdGUoKTtcbiAgfVxuICBvbkJ1ZmZlckZsdXNoZWQoZSwge1xuICAgIHR5cGU6IHRcbiAgfSkge1xuICAgIGlmICh0ICE9PSBvdC5BVURJTyB8fCAhdGhpcy5hbHRBdWRpbykge1xuICAgICAgY29uc3QgciA9ICh0ID09PSBvdC5WSURFTyA/IHRoaXMudmlkZW9CdWZmZXIgOiB0aGlzLm1lZGlhQnVmZmVyKSB8fCB0aGlzLm1lZGlhO1xuICAgICAgciAmJiAodGhpcy5hZnRlckJ1ZmZlckZsdXNoZWQociwgdCwgcGUuTUFJTiksIHRoaXMudGljaygpKTtcbiAgICB9XG4gIH1cbiAgb25MZXZlbHNVcGRhdGVkKGUsIHQpIHtcbiAgICB0aGlzLmxldmVsID4gLTEgJiYgdGhpcy5mcmFnQ3VycmVudCAmJiAodGhpcy5sZXZlbCA9IHRoaXMuZnJhZ0N1cnJlbnQubGV2ZWwsIHRoaXMubGV2ZWwgPT09IC0xICYmIHRoaXMucmVzZXRXaGVuTWlzc2luZ0NvbnRleHQodGhpcy5mcmFnQ3VycmVudCkpLCB0aGlzLmxldmVscyA9IHQubGV2ZWxzO1xuICB9XG4gIHN3YXBBdWRpb0NvZGVjKCkge1xuICAgIHRoaXMuYXVkaW9Db2RlY1N3YXAgPSAhdGhpcy5hdWRpb0NvZGVjU3dhcDtcbiAgfVxuICAvKipcbiAgICogU2Vla3MgdG8gdGhlIHNldCBzdGFydFBvc2l0aW9uIGlmIG5vdCBlcXVhbCB0byB0aGUgbWVkaWFFbGVtZW50J3MgY3VycmVudCB0aW1lLlxuICAgKi9cbiAgc2Vla1RvU3RhcnRQb3MoKSB7XG4gICAgY29uc3Qge1xuICAgICAgbWVkaWE6IGVcbiAgICB9ID0gdGhpcztcbiAgICBpZiAoIWUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdCA9IGUuY3VycmVudFRpbWU7XG4gICAgbGV0IHIgPSB0aGlzLnN0YXJ0UG9zaXRpb247XG4gICAgaWYgKHIgPj0gMCAmJiB0IDwgcikge1xuICAgICAgaWYgKGUuc2Vla2luZykge1xuICAgICAgICB0aGlzLmxvZyhgY291bGQgbm90IHNlZWsgdG8gJHtyfSwgYWxyZWFkeSBzZWVraW5nIGF0ICR7dH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbiA9IHRoaXMudGltZWxpbmVPZmZzZXQ7XG4gICAgICBuICYmIHIgJiYgKHIgKz0gbik7XG4gICAgICBjb25zdCBpID0gdGhpcy5nZXRMZXZlbERldGFpbHMoKSwgbyA9IENlLmdldEJ1ZmZlcmVkKGUpLCBhID0gby5sZW5ndGggPyBvLnN0YXJ0KDApIDogMCwgbCA9IGEgLSByLCBjID0gTWF0aC5tYXgodGhpcy5jb25maWcubWF4QnVmZmVySG9sZSwgdGhpcy5jb25maWcubWF4RnJhZ0xvb2tVcFRvbGVyYW5jZSk7XG4gICAgICAodGhpcy5jb25maWcuc3RhcnRPblNlZ21lbnRCb3VuZGFyeSB8fCBsID4gMCAmJiAobCA8IGMgfHwgdGhpcy5sb2FkaW5nUGFydHMgJiYgbCA8IDIgKiAoKGkgPT0gbnVsbCA/IHZvaWQgMCA6IGkucGFydFRhcmdldCkgfHwgMCkpKSAmJiAodGhpcy5sb2coYGFkanVzdGluZyBzdGFydCBwb3NpdGlvbiBieSAke2x9IHRvIG1hdGNoIGJ1ZmZlciBzdGFydGApLCByICs9IGwsIHRoaXMuc3RhcnRQb3NpdGlvbiA9IHIpLCB0IDwgciAmJiAodGhpcy5sb2coYHNlZWsgdG8gdGFyZ2V0IHN0YXJ0IHBvc2l0aW9uICR7cn0gZnJvbSBjdXJyZW50IHRpbWUgJHt0fSBidWZmZXIgc3RhcnQgJHthfWApLCBlLmN1cnJlbnRUaW1lID0gcik7XG4gICAgfVxuICB9XG4gIF9nZXRBdWRpb0NvZGVjKGUpIHtcbiAgICBsZXQgdCA9IHRoaXMuY29uZmlnLmRlZmF1bHRBdWRpb0NvZGVjIHx8IGUuYXVkaW9Db2RlYztcbiAgICByZXR1cm4gdGhpcy5hdWRpb0NvZGVjU3dhcCAmJiB0ICYmICh0aGlzLmxvZyhcIlN3YXBwaW5nIGF1ZGlvIGNvZGVjXCIpLCB0LmluZGV4T2YoXCJtcDRhLjQwLjVcIikgIT09IC0xID8gdCA9IFwibXA0YS40MC4yXCIgOiB0ID0gXCJtcDRhLjQwLjVcIiksIHQ7XG4gIH1cbiAgX2xvYWRCaXRyYXRlVGVzdEZyYWcoZSwgdCkge1xuICAgIGUuYml0cmF0ZVRlc3QgPSAhMCwgdGhpcy5fZG9GcmFnTG9hZChlLCB0KS50aGVuKChyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGhsczogblxuICAgICAgfSA9IHRoaXMsIGkgPSByID09IG51bGwgPyB2b2lkIDAgOiByLmZyYWc7XG4gICAgICBpZiAoIWkgfHwgdGhpcy5mcmFnQ29udGV4dENoYW5nZWQoaSkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHQuZnJhZ21lbnRFcnJvciA9IDAsIHRoaXMuc3RhdGUgPSBuZS5JRExFLCB0aGlzLnN0YXJ0RnJhZ1JlcXVlc3RlZCA9ICExLCB0aGlzLmJpdHJhdGVUZXN0ID0gITE7XG4gICAgICBjb25zdCBvID0gaS5zdGF0cztcbiAgICAgIG8ucGFyc2luZy5zdGFydCA9IG8ucGFyc2luZy5lbmQgPSBvLmJ1ZmZlcmluZy5zdGFydCA9IG8uYnVmZmVyaW5nLmVuZCA9IHNlbGYucGVyZm9ybWFuY2Uubm93KCksIG4udHJpZ2dlcihJLkZSQUdfTE9BREVELCByKSwgaS5iaXRyYXRlVGVzdCA9ICExO1xuICAgIH0pLmNhdGNoKChyKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlID09PSBuZS5TVE9QUEVEIHx8IHRoaXMuc3RhdGUgPT09IG5lLkVSUk9SIHx8ICh0aGlzLndhcm4ociksIHRoaXMucmVzZXRGcmFnbWVudExvYWRpbmcoZSkpO1xuICAgIH0pO1xuICB9XG4gIF9oYW5kbGVUcmFuc211eENvbXBsZXRlKGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5wbGF5bGlzdFR5cGUsIHtcbiAgICAgIGhsczogclxuICAgIH0gPSB0aGlzLCB7XG4gICAgICByZW11eFJlc3VsdDogbixcbiAgICAgIGNodW5rTWV0YTogaVxuICAgIH0gPSBlLCBvID0gdGhpcy5nZXRDdXJyZW50Q29udGV4dChpKTtcbiAgICBpZiAoIW8pIHtcbiAgICAgIHRoaXMucmVzZXRXaGVuTWlzc2luZ0NvbnRleHQoaSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGZyYWc6IGEsXG4gICAgICBwYXJ0OiBsLFxuICAgICAgbGV2ZWw6IGNcbiAgICB9ID0gbywge1xuICAgICAgdmlkZW86IHUsXG4gICAgICB0ZXh0OiBkLFxuICAgICAgaWQzOiBoLFxuICAgICAgaW5pdFNlZ21lbnQ6IGZcbiAgICB9ID0gbiwge1xuICAgICAgZGV0YWlsczogcFxuICAgIH0gPSBjLCB5ID0gdGhpcy5hbHRBdWRpbyA/IHZvaWQgMCA6IG4uYXVkaW87XG4gICAgaWYgKHRoaXMuZnJhZ0NvbnRleHRDaGFuZ2VkKGEpKSB7XG4gICAgICB0aGlzLmZyYWdtZW50VHJhY2tlci5yZW1vdmVGcmFnbWVudChhKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGUgPSBuZS5QQVJTSU5HLCBmKSB7XG4gICAgICBjb25zdCBFID0gZi50cmFja3M7XG4gICAgICBpZiAoRSkge1xuICAgICAgICBjb25zdCBGID0gYS5pbml0U2VnbWVudCB8fCBhO1xuICAgICAgICBpZiAodGhpcy51bmhhbmRsZWRFbmNyeXB0aW9uRXJyb3IoZiwgYSkpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl9idWZmZXJJbml0U2VnbWVudChjLCBFLCBGLCBpKSwgci50cmlnZ2VyKEkuRlJBR19QQVJTSU5HX0lOSVRfU0VHTUVOVCwge1xuICAgICAgICAgIGZyYWc6IEYsXG4gICAgICAgICAgaWQ6IHQsXG4gICAgICAgICAgdHJhY2tzOiBFXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgYiA9IGYuaW5pdFBUUywgUiA9IGYudGltZXNjYWxlLCBBID0gdGhpcy5pbml0UFRTW2EuY2NdO1xuICAgICAgaWYgKHVlKGIpICYmICghQSB8fCBBLmJhc2VUaW1lICE9PSBiIHx8IEEudGltZXNjYWxlICE9PSBSKSkge1xuICAgICAgICBjb25zdCBGID0gZi50cmFja0lkO1xuICAgICAgICB0aGlzLmluaXRQVFNbYS5jY10gPSB7XG4gICAgICAgICAgYmFzZVRpbWU6IGIsXG4gICAgICAgICAgdGltZXNjYWxlOiBSLFxuICAgICAgICAgIHRyYWNrSWQ6IEZcbiAgICAgICAgfSwgci50cmlnZ2VyKEkuSU5JVF9QVFNfRk9VTkQsIHtcbiAgICAgICAgICBmcmFnOiBhLFxuICAgICAgICAgIGlkOiB0LFxuICAgICAgICAgIGluaXRQVFM6IGIsXG4gICAgICAgICAgdGltZXNjYWxlOiBSLFxuICAgICAgICAgIHRyYWNrSWQ6IEZcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh1ICYmIHApIHtcbiAgICAgIHkgJiYgdS50eXBlID09PSBcImF1ZGlvdmlkZW9cIiAmJiB0aGlzLmxvZ011eGVkRXJyKGEpO1xuICAgICAgY29uc3QgRSA9IHAuZnJhZ21lbnRzW2Euc24gLSAxIC0gcC5zdGFydFNOXSwgYiA9IGEuc24gPT09IHAuc3RhcnRTTiwgUiA9ICFFIHx8IGEuY2MgPiBFLmNjO1xuICAgICAgaWYgKG4uaW5kZXBlbmRlbnQgIT09ICExKSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICBzdGFydFBUUzogQSxcbiAgICAgICAgICBlbmRQVFM6IEYsXG4gICAgICAgICAgc3RhcnREVFM6IE0sXG4gICAgICAgICAgZW5kRFRTOiBIXG4gICAgICAgIH0gPSB1O1xuICAgICAgICBpZiAobClcbiAgICAgICAgICBsLmVsZW1lbnRhcnlTdHJlYW1zW3UudHlwZV0gPSB7XG4gICAgICAgICAgICBzdGFydFBUUzogQSxcbiAgICAgICAgICAgIGVuZFBUUzogRixcbiAgICAgICAgICAgIHN0YXJ0RFRTOiBNLFxuICAgICAgICAgICAgZW5kRFRTOiBIXG4gICAgICAgICAgfTtcbiAgICAgICAgZWxzZSBpZiAodS5maXJzdEtleUZyYW1lICYmIHUuaW5kZXBlbmRlbnQgJiYgaS5pZCA9PT0gMSAmJiAhUiAmJiAodGhpcy5jb3VsZEJhY2t0cmFjayA9ICEwKSwgdS5kcm9wcGVkICYmIHUuaW5kZXBlbmRlbnQpIHtcbiAgICAgICAgICBjb25zdCBLID0gdGhpcy5nZXRNYWluRndkQnVmZmVySW5mbygpLCBqID0gKEsgPyBLLmVuZCA6IHRoaXMuZ2V0TG9hZFBvc2l0aW9uKCkpICsgdGhpcy5jb25maWcubWF4QnVmZmVySG9sZSwgQyA9IHUuZmlyc3RLZXlGcmFtZVBUUyA/IHUuZmlyc3RLZXlGcmFtZVBUUyA6IEE7XG4gICAgICAgICAgaWYgKCFiICYmIGogPCBDIC0gdGhpcy5jb25maWcubWF4QnVmZmVySG9sZSAmJiAhUikge1xuICAgICAgICAgICAgdGhpcy5iYWNrdHJhY2soYSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBlbHNlIFIgJiYgKGEuZ2FwID0gITApO1xuICAgICAgICAgIGEuc2V0RWxlbWVudGFyeVN0cmVhbUluZm8odS50eXBlLCBhLnN0YXJ0LCBGLCBhLnN0YXJ0LCBILCAhMCk7XG4gICAgICAgIH0gZWxzZSBiICYmIEEgLSAocC5hcHBsaWVkVGltZWxpbmVPZmZzZXQgfHwgMCkgPiB4byAmJiAoYS5nYXAgPSAhMCk7XG4gICAgICAgIGEuc2V0RWxlbWVudGFyeVN0cmVhbUluZm8odS50eXBlLCBBLCBGLCBNLCBIKSwgdGhpcy5iYWNrdHJhY2tGcmFnbWVudCAmJiAodGhpcy5iYWNrdHJhY2tGcmFnbWVudCA9IGEpLCB0aGlzLmJ1ZmZlckZyYWdtZW50RGF0YSh1LCBhLCBsLCBpLCBiIHx8IFIpO1xuICAgICAgfSBlbHNlIGlmIChiIHx8IFIpXG4gICAgICAgIGEuZ2FwID0gITA7XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5iYWNrdHJhY2soYSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3RhcnRQVFM6IEUsXG4gICAgICAgIGVuZFBUUzogYixcbiAgICAgICAgc3RhcnREVFM6IFIsXG4gICAgICAgIGVuZERUUzogQVxuICAgICAgfSA9IHk7XG4gICAgICBsICYmIChsLmVsZW1lbnRhcnlTdHJlYW1zW290LkFVRElPXSA9IHtcbiAgICAgICAgc3RhcnRQVFM6IEUsXG4gICAgICAgIGVuZFBUUzogYixcbiAgICAgICAgc3RhcnREVFM6IFIsXG4gICAgICAgIGVuZERUUzogQVxuICAgICAgfSksIGEuc2V0RWxlbWVudGFyeVN0cmVhbUluZm8ob3QuQVVESU8sIEUsIGIsIFIsIEEpLCB0aGlzLmJ1ZmZlckZyYWdtZW50RGF0YSh5LCBhLCBsLCBpKTtcbiAgICB9XG4gICAgaWYgKHAgJiYgaCAhPSBudWxsICYmIGguc2FtcGxlcy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IEUgPSB7XG4gICAgICAgIGlkOiB0LFxuICAgICAgICBmcmFnOiBhLFxuICAgICAgICBkZXRhaWxzOiBwLFxuICAgICAgICBzYW1wbGVzOiBoLnNhbXBsZXNcbiAgICAgIH07XG4gICAgICByLnRyaWdnZXIoSS5GUkFHX1BBUlNJTkdfTUVUQURBVEEsIEUpO1xuICAgIH1cbiAgICBpZiAocCAmJiBkKSB7XG4gICAgICBjb25zdCBFID0ge1xuICAgICAgICBpZDogdCxcbiAgICAgICAgZnJhZzogYSxcbiAgICAgICAgZGV0YWlsczogcCxcbiAgICAgICAgc2FtcGxlczogZC5zYW1wbGVzXG4gICAgICB9O1xuICAgICAgci50cmlnZ2VyKEkuRlJBR19QQVJTSU5HX1VTRVJEQVRBLCBFKTtcbiAgICB9XG4gIH1cbiAgbG9nTXV4ZWRFcnIoZSkge1xuICAgIHRoaXMud2FybihgJHtWdChlKSA/IFwiTWVkaWFcIiA6IFwiSW5pdFwifSBzZWdtZW50IHdpdGggbXV4ZWQgYXVkaW92aWRlbyB3aGVyZSBvbmx5IHZpZGVvIGV4cGVjdGVkOiAke2UudXJsfWApO1xuICB9XG4gIF9idWZmZXJJbml0U2VnbWVudChlLCB0LCByLCBuKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUgIT09IG5lLlBBUlNJTkcpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5hdWRpb09ubHkgPSAhIXQuYXVkaW8gJiYgIXQudmlkZW8sIHRoaXMuYWx0QXVkaW8gJiYgIXRoaXMuYXVkaW9Pbmx5ICYmIChkZWxldGUgdC5hdWRpbywgdC5hdWRpb3ZpZGVvICYmIHRoaXMubG9nTXV4ZWRFcnIocikpO1xuICAgIGNvbnN0IHtcbiAgICAgIGF1ZGlvOiBpLFxuICAgICAgdmlkZW86IG8sXG4gICAgICBhdWRpb3ZpZGVvOiBhXG4gICAgfSA9IHQ7XG4gICAgaWYgKGkpIHtcbiAgICAgIGNvbnN0IGMgPSBlLmF1ZGlvQ29kZWM7XG4gICAgICBsZXQgdSA9IGZvKGkuY29kZWMsIGMpO1xuICAgICAgdSA9PT0gXCJtcDRhXCIgJiYgKHUgPSBcIm1wNGEuNDAuNVwiKTtcbiAgICAgIGNvbnN0IGQgPSBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAodGhpcy5hdWRpb0NvZGVjU3dpdGNoKSB7XG4gICAgICAgIHUgJiYgKHUuaW5kZXhPZihcIm1wNGEuNDAuNVwiKSAhPT0gLTEgPyB1ID0gXCJtcDRhLjQwLjJcIiA6IHUgPSBcIm1wNGEuNDAuNVwiKTtcbiAgICAgICAgY29uc3QgaCA9IGkubWV0YWRhdGE7XG4gICAgICAgIGggJiYgXCJjaGFubmVsQ291bnRcIiBpbiBoICYmIChoLmNoYW5uZWxDb3VudCB8fCAxKSAhPT0gMSAmJiBkLmluZGV4T2YoXCJmaXJlZm94XCIpID09PSAtMSAmJiAodSA9IFwibXA0YS40MC41XCIpO1xuICAgICAgfVxuICAgICAgdSAmJiB1LmluZGV4T2YoXCJtcDRhLjQwLjVcIikgIT09IC0xICYmIGQuaW5kZXhPZihcImFuZHJvaWRcIikgIT09IC0xICYmIGkuY29udGFpbmVyICE9PSBcImF1ZGlvL21wZWdcIiAmJiAodSA9IFwibXA0YS40MC4yXCIsIHRoaXMubG9nKGBBbmRyb2lkOiBmb3JjZSBhdWRpbyBjb2RlYyB0byAke3V9YCkpLCBjICYmIGMgIT09IHUgJiYgdGhpcy5sb2coYFN3YXBwaW5nIG1hbmlmZXN0IGF1ZGlvIGNvZGVjIFwiJHtjfVwiIGZvciBcIiR7dX1cImApLCBpLmxldmVsQ29kZWMgPSB1LCBpLmlkID0gcGUuTUFJTiwgdGhpcy5sb2coYEluaXQgYXVkaW8gYnVmZmVyLCBjb250YWluZXI6JHtpLmNvbnRhaW5lcn0sIGNvZGVjc1tzZWxlY3RlZC9sZXZlbC9wYXJzZWRdPVske3UgfHwgXCJcIn0vJHtjIHx8IFwiXCJ9LyR7aS5jb2RlY31dYCksIGRlbGV0ZSB0LmF1ZGlvdmlkZW87XG4gICAgfVxuICAgIGlmIChvKSB7XG4gICAgICBvLmxldmVsQ29kZWMgPSBlLnZpZGVvQ29kZWMsIG8uaWQgPSBwZS5NQUlOO1xuICAgICAgY29uc3QgYyA9IG8uY29kZWM7XG4gICAgICBpZiAoKGMgPT0gbnVsbCA/IHZvaWQgMCA6IGMubGVuZ3RoKSA9PT0gNClcbiAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgY2FzZSBcImh2YzFcIjpcbiAgICAgICAgICBjYXNlIFwiaGV2MVwiOlxuICAgICAgICAgICAgby5jb2RlYyA9IFwiaHZjMS4xLjYuTDEyMC45MFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSBcImF2MDFcIjpcbiAgICAgICAgICAgIG8uY29kZWMgPSBcImF2MDEuMC4wNE0uMDhcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgXCJhdmMxXCI6XG4gICAgICAgICAgICBvLmNvZGVjID0gXCJhdmMxLjQyZTAxZVwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIHRoaXMubG9nKGBJbml0IHZpZGVvIGJ1ZmZlciwgY29udGFpbmVyOiR7by5jb250YWluZXJ9LCBjb2RlY3NbbGV2ZWwvcGFyc2VkXT1bJHtlLnZpZGVvQ29kZWMgfHwgXCJcIn0vJHtjfV0ke28uY29kZWMgIT09IGMgPyBcIiBwYXJzZWQtY29ycmVjdGVkPVwiICsgby5jb2RlYyA6IFwiXCJ9JHtvLnN1cHBsZW1lbnRhbCA/IFwiIHN1cHBsZW1lbnRhbD1cIiArIG8uc3VwcGxlbWVudGFsIDogXCJcIn1gKSwgZGVsZXRlIHQuYXVkaW92aWRlbztcbiAgICB9XG4gICAgYSAmJiAodGhpcy5sb2coYEluaXQgYXVkaW92aWRlbyBidWZmZXIsIGNvbnRhaW5lcjoke2EuY29udGFpbmVyfSwgY29kZWNzW2xldmVsL3BhcnNlZF09WyR7ZS5jb2RlY3N9LyR7YS5jb2RlY31dYCksIGRlbGV0ZSB0LnZpZGVvLCBkZWxldGUgdC5hdWRpbyk7XG4gICAgY29uc3QgbCA9IE9iamVjdC5rZXlzKHQpO1xuICAgIGlmIChsLmxlbmd0aCkge1xuICAgICAgaWYgKHRoaXMuaGxzLnRyaWdnZXIoSS5CVUZGRVJfQ09ERUNTLCB0KSwgIXRoaXMuaGxzKVxuICAgICAgICByZXR1cm47XG4gICAgICBsLmZvckVhY2goKGMpID0+IHtcbiAgICAgICAgY29uc3QgZCA9IHRbY10uaW5pdFNlZ21lbnQ7XG4gICAgICAgIGQgIT0gbnVsbCAmJiBkLmJ5dGVMZW5ndGggJiYgdGhpcy5obHMudHJpZ2dlcihJLkJVRkZFUl9BUFBFTkRJTkcsIHtcbiAgICAgICAgICB0eXBlOiBjLFxuICAgICAgICAgIGRhdGE6IGQsXG4gICAgICAgICAgZnJhZzogcixcbiAgICAgICAgICBwYXJ0OiBudWxsLFxuICAgICAgICAgIGNodW5rTWV0YTogbixcbiAgICAgICAgICBwYXJlbnQ6IHIudHlwZVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLnRpY2tJbW1lZGlhdGUoKTtcbiAgfVxuICBnZXRNYWluRndkQnVmZmVySW5mbygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5tZWRpYUJ1ZmZlciAmJiB0aGlzLmFsdEF1ZGlvID09PSAyID8gdGhpcy5tZWRpYUJ1ZmZlciA6IHRoaXMubWVkaWE7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RndkQnVmZmVySW5mbyhlLCBwZS5NQUlOKTtcbiAgfVxuICBnZXQgbWF4QnVmZmVyTGVuZ3RoKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogZSxcbiAgICAgIGxldmVsOiB0XG4gICAgfSA9IHRoaXMsIHIgPSBlID09IG51bGwgPyB2b2lkIDAgOiBlW3RdO1xuICAgIHJldHVybiByID8gdGhpcy5nZXRNYXhCdWZmZXJMZW5ndGgoci5tYXhCaXRyYXRlKSA6IHRoaXMuY29uZmlnLm1heEJ1ZmZlckxlbmd0aDtcbiAgfVxuICBiYWNrdHJhY2soZSkge1xuICAgIHRoaXMuY291bGRCYWNrdHJhY2sgPSAhMCwgdGhpcy5iYWNrdHJhY2tGcmFnbWVudCA9IGUsIHRoaXMucmVzZXRUcmFuc211eGVyKCksIHRoaXMuZmx1c2hCdWZmZXJHYXAoZSksIHRoaXMuZnJhZ21lbnRUcmFja2VyLnJlbW92ZUZyYWdtZW50KGUpLCB0aGlzLmZyYWdQcmV2aW91cyA9IG51bGwsIHRoaXMubmV4dExvYWRQb3NpdGlvbiA9IGUuc3RhcnQsIHRoaXMuc3RhdGUgPSBuZS5JRExFO1xuICB9XG4gIGNoZWNrRnJhZ21lbnRDaGFuZ2VkKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLm1lZGlhO1xuICAgIGxldCB0ID0gbnVsbDtcbiAgICBpZiAoZSAmJiBlLnJlYWR5U3RhdGUgPiAxICYmIGUuc2Vla2luZyA9PT0gITEpIHtcbiAgICAgIGNvbnN0IHIgPSBlLmN1cnJlbnRUaW1lO1xuICAgICAgaWYgKENlLmlzQnVmZmVyZWQoZSwgcikgPyB0ID0gdGhpcy5nZXRBcHBlbmRlZEZyYWcocikgOiBDZS5pc0J1ZmZlcmVkKGUsIHIgKyAwLjEpICYmICh0ID0gdGhpcy5nZXRBcHBlbmRlZEZyYWcociArIDAuMSkpLCB0KSB7XG4gICAgICAgIHRoaXMuYmFja3RyYWNrRnJhZ21lbnQgPSBudWxsO1xuICAgICAgICBjb25zdCBuID0gdGhpcy5mcmFnUGxheWluZywgaSA9IHQubGV2ZWw7XG4gICAgICAgICghbiB8fCB0LnNuICE9PSBuLnNuIHx8IG4ubGV2ZWwgIT09IGkpICYmICh0aGlzLmZyYWdQbGF5aW5nID0gdCwgdGhpcy5obHMudHJpZ2dlcihJLkZSQUdfQ0hBTkdFRCwge1xuICAgICAgICAgIGZyYWc6IHRcbiAgICAgICAgfSksICghbiB8fCBuLmxldmVsICE9PSBpKSAmJiB0aGlzLmhscy50cmlnZ2VyKEkuTEVWRUxfU1dJVENIRUQsIHtcbiAgICAgICAgICBsZXZlbDogaVxuICAgICAgICB9KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGdldCBuZXh0TGV2ZWwoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMubmV4dEJ1ZmZlcmVkRnJhZztcbiAgICByZXR1cm4gZSA/IGUubGV2ZWwgOiAtMTtcbiAgfVxuICBnZXQgY3VycmVudEZyYWcoKSB7XG4gICAgdmFyIGU7XG4gICAgaWYgKHRoaXMuZnJhZ1BsYXlpbmcpXG4gICAgICByZXR1cm4gdGhpcy5mcmFnUGxheWluZztcbiAgICBjb25zdCB0ID0gKChlID0gdGhpcy5tZWRpYSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUuY3VycmVudFRpbWUpIHx8IHRoaXMubGFzdEN1cnJlbnRUaW1lO1xuICAgIHJldHVybiB1ZSh0KSA/IHRoaXMuZ2V0QXBwZW5kZWRGcmFnKHQpIDogbnVsbDtcbiAgfVxuICBnZXQgY3VycmVudFByb2dyYW1EYXRlVGltZSgpIHtcbiAgICB2YXIgZTtcbiAgICBjb25zdCB0ID0gKChlID0gdGhpcy5tZWRpYSkgPT0gbnVsbCA/IHZvaWQgMCA6IGUuY3VycmVudFRpbWUpIHx8IHRoaXMubGFzdEN1cnJlbnRUaW1lO1xuICAgIGlmICh1ZSh0KSkge1xuICAgICAgY29uc3QgciA9IHRoaXMuZ2V0TGV2ZWxEZXRhaWxzKCksIG4gPSB0aGlzLmN1cnJlbnRGcmFnIHx8IChyID8gSnMobnVsbCwgci5mcmFnbWVudHMsIHQpIDogbnVsbCk7XG4gICAgICBpZiAobikge1xuICAgICAgICBjb25zdCBpID0gbi5wcm9ncmFtRGF0ZVRpbWU7XG4gICAgICAgIGlmIChpICE9PSBudWxsKSB7XG4gICAgICAgICAgY29uc3QgbyA9IGkgKyAodCAtIG4uc3RhcnQpICogMWUzO1xuICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShvKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBnZXQgY3VycmVudExldmVsKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmN1cnJlbnRGcmFnO1xuICAgIHJldHVybiBlID8gZS5sZXZlbCA6IC0xO1xuICB9XG4gIGdldCBuZXh0QnVmZmVyZWRGcmFnKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmN1cnJlbnRGcmFnO1xuICAgIHJldHVybiBlID8gdGhpcy5mb2xsb3dpbmdCdWZmZXJlZEZyYWcoZSkgOiBudWxsO1xuICB9XG4gIGdldCBmb3JjZVN0YXJ0TG9hZCgpIHtcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VTdGFydExvYWQ7XG4gIH1cbn1cbmNsYXNzIGJBIGV4dGVuZHMgTHIge1xuICBjb25zdHJ1Y3RvcihlLCB0KSB7XG4gICAgc3VwZXIoXCJrZXktbG9hZGVyXCIsIHQpLCB0aGlzLmNvbmZpZyA9IHZvaWQgMCwgdGhpcy5rZXlJZFRvS2V5SW5mbyA9IHt9LCB0aGlzLmVtZUNvbnRyb2xsZXIgPSBudWxsLCB0aGlzLmNvbmZpZyA9IGU7XG4gIH1cbiAgYWJvcnQoZSkge1xuICAgIGZvciAoY29uc3QgciBpbiB0aGlzLmtleUlkVG9LZXlJbmZvKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5rZXlJZFRvS2V5SW5mb1tyXS5sb2FkZXI7XG4gICAgICBpZiAobikge1xuICAgICAgICB2YXIgdDtcbiAgICAgICAgaWYgKGUgJiYgZSAhPT0gKCh0ID0gbi5jb250ZXh0KSA9PSBudWxsID8gdm9pZCAwIDogdC5mcmFnLnR5cGUpKVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbi5hYm9ydCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBkZXRhY2goKSB7XG4gICAgZm9yIChjb25zdCBlIGluIHRoaXMua2V5SWRUb0tleUluZm8pIHtcbiAgICAgIGNvbnN0IHQgPSB0aGlzLmtleUlkVG9LZXlJbmZvW2VdO1xuICAgICAgKHQubWVkaWFLZXlTZXNzaW9uQ29udGV4dCB8fCB0LmRlY3J5cHRkYXRhLmlzQ29tbW9uRW5jcnlwdGlvbikgJiYgZGVsZXRlIHRoaXMua2V5SWRUb0tleUluZm9bZV07XG4gICAgfVxuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXRhY2goKTtcbiAgICBmb3IgKGNvbnN0IGUgaW4gdGhpcy5rZXlJZFRvS2V5SW5mbykge1xuICAgICAgY29uc3QgdCA9IHRoaXMua2V5SWRUb0tleUluZm9bZV0ubG9hZGVyO1xuICAgICAgdCAmJiB0LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5rZXlJZFRvS2V5SW5mbyA9IHt9O1xuICB9XG4gIGNyZWF0ZUtleUxvYWRFcnJvcihlLCB0ID0gSi5LRVlfTE9BRF9FUlJPUiwgciwgbiwgaSkge1xuICAgIHJldHVybiBuZXcgYXMoe1xuICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgIGRldGFpbHM6IHQsXG4gICAgICBmYXRhbDogITEsXG4gICAgICBmcmFnOiBlLFxuICAgICAgcmVzcG9uc2U6IGksXG4gICAgICBlcnJvcjogcixcbiAgICAgIG5ldHdvcmtEZXRhaWxzOiBuXG4gICAgfSk7XG4gIH1cbiAgbG9hZENsZWFyKGUsIHQsIHIpIHtcbiAgICBpZiAodGhpcy5lbWVDb250cm9sbGVyICYmIHRoaXMuY29uZmlnLmVtZUVuYWJsZWQgJiYgIXRoaXMuZW1lQ29udHJvbGxlci5nZXRTZWxlY3RlZEtleVN5c3RlbUZvcm1hdHMoKS5sZW5ndGgpIHtcbiAgICAgIGlmICh0Lmxlbmd0aClcbiAgICAgICAgZm9yIChsZXQgbiA9IDAsIGkgPSB0Lmxlbmd0aDsgbiA8IGk7IG4rKykge1xuICAgICAgICAgIGNvbnN0IG8gPSB0W25dO1xuICAgICAgICAgIGlmIChlLmNjIDw9IG8uY2MgJiYgKCFWdChlKSB8fCAhVnQobykgfHwgZS5zbiA8IG8uc24pIHx8ICFyICYmIG4gPT0gaSAtIDEpXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbWVDb250cm9sbGVyLnNlbGVjdEtleVN5c3RlbUZvcm1hdChvKS50aGVuKChhKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghdGhpcy5lbWVDb250cm9sbGVyKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgby5zZXRLZXlGb3JtYXQoYSk7XG4gICAgICAgICAgICAgIGNvbnN0IGwgPSBwbyhhKTtcbiAgICAgICAgICAgICAgaWYgKGwpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW1lQ29udHJvbGxlci5nZXRLZXlTeXN0ZW1BY2Nlc3MoW2xdKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICBpZiAodGhpcy5jb25maWcucmVxdWlyZUtleVN5c3RlbUFjY2Vzc09uU3RhcnQpIHtcbiAgICAgICAgY29uc3QgbiA9IHpuKHRoaXMuY29uZmlnKTtcbiAgICAgICAgaWYgKG4ubGVuZ3RoKVxuICAgICAgICAgIHJldHVybiB0aGlzLmVtZUNvbnRyb2xsZXIuZ2V0S2V5U3lzdGVtQWNjZXNzKG4pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBsb2FkKGUpIHtcbiAgICByZXR1cm4gIWUuZGVjcnlwdGRhdGEgJiYgZS5lbmNyeXB0ZWQgJiYgdGhpcy5lbWVDb250cm9sbGVyICYmIHRoaXMuY29uZmlnLmVtZUVuYWJsZWQgPyB0aGlzLmVtZUNvbnRyb2xsZXIuc2VsZWN0S2V5U3lzdGVtRm9ybWF0KGUpLnRoZW4oKHQpID0+IHRoaXMubG9hZEludGVybmFsKGUsIHQpKSA6IHRoaXMubG9hZEludGVybmFsKGUpO1xuICB9XG4gIGxvYWRJbnRlcm5hbChlLCB0KSB7XG4gICAgdmFyIHIsIG47XG4gICAgdCAmJiBlLnNldEtleUZvcm1hdCh0KTtcbiAgICBjb25zdCBpID0gZS5kZWNyeXB0ZGF0YTtcbiAgICBpZiAoIWkpIHtcbiAgICAgIGNvbnN0IGMgPSBuZXcgRXJyb3IodCA/IGBFeHBlY3RlZCBmcmFnLmRlY3J5cHRkYXRhIHRvIGJlIGRlZmluZWQgYWZ0ZXIgc2V0dGluZyBmb3JtYXQgJHt0fWAgOiBgTWlzc2luZyBkZWNyeXB0aW9uIGRhdGEgb24gZnJhZ21lbnQgaW4gb25LZXlMb2FkaW5nIChlbWVFbmFibGVkIHdpdGggY29udHJvbGxlcjogJHt0aGlzLmVtZUNvbnRyb2xsZXIgJiYgdGhpcy5jb25maWcuZW1lRW5hYmxlZH0pYCk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5jcmVhdGVLZXlMb2FkRXJyb3IoZSwgSi5LRVlfTE9BRF9FUlJPUiwgYykpO1xuICAgIH1cbiAgICBjb25zdCBvID0gaS51cmk7XG4gICAgaWYgKCFvKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHRoaXMuY3JlYXRlS2V5TG9hZEVycm9yKGUsIEouS0VZX0xPQURfRVJST1IsIG5ldyBFcnJvcihgSW52YWxpZCBrZXkgVVJJOiBcIiR7b31cImApKSk7XG4gICAgY29uc3QgYSA9IGtsKGkpO1xuICAgIGxldCBsID0gdGhpcy5rZXlJZFRvS2V5SW5mb1thXTtcbiAgICBpZiAoKHIgPSBsKSAhPSBudWxsICYmIHIuZGVjcnlwdGRhdGEua2V5KVxuICAgICAgcmV0dXJuIGkua2V5ID0gbC5kZWNyeXB0ZGF0YS5rZXksIFByb21pc2UucmVzb2x2ZSh7XG4gICAgICAgIGZyYWc6IGUsXG4gICAgICAgIGtleUluZm86IGxcbiAgICAgIH0pO1xuICAgIGlmICh0aGlzLmVtZUNvbnRyb2xsZXIgJiYgKG4gPSBsKSAhPSBudWxsICYmIG4ua2V5TG9hZFByb21pc2UpXG4gICAgICBzd2l0Y2ggKHRoaXMuZW1lQ29udHJvbGxlci5nZXRLZXlTdGF0dXMobC5kZWNyeXB0ZGF0YSkpIHtcbiAgICAgICAgY2FzZSBcInVzYWJsZVwiOlxuICAgICAgICBjYXNlIFwidXNhYmxlLWluLWZ1dHVyZVwiOlxuICAgICAgICAgIHJldHVybiBsLmtleUxvYWRQcm9taXNlLnRoZW4oKHUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAga2V5SW5mbzogZFxuICAgICAgICAgICAgfSA9IHU7XG4gICAgICAgICAgICByZXR1cm4gaS5rZXkgPSBkLmRlY3J5cHRkYXRhLmtleSwge1xuICAgICAgICAgICAgICBmcmFnOiBlLFxuICAgICAgICAgICAgICBrZXlJbmZvOiBkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgIHN3aXRjaCAodGhpcy5sb2coYCR7dGhpcy5rZXlJZFRvS2V5SW5mb1thXSA/IFwiUmVsXCIgOiBcIkxcIn1vYWRpbmcke2kua2V5SWQgPyBcIiBrZXlJZDogXCIgKyBmcihpLmtleUlkKSA6IFwiXCJ9IFVSSTogJHtpLnVyaX0gZnJvbSAke2UudHlwZX0gJHtlLmxldmVsfWApLCBsID0gdGhpcy5rZXlJZFRvS2V5SW5mb1thXSA9IHtcbiAgICAgIGRlY3J5cHRkYXRhOiBpLFxuICAgICAga2V5TG9hZFByb21pc2U6IG51bGwsXG4gICAgICBsb2FkZXI6IG51bGwsXG4gICAgICBtZWRpYUtleVNlc3Npb25Db250ZXh0OiBudWxsXG4gICAgfSwgaS5tZXRob2QpIHtcbiAgICAgIGNhc2UgXCJTQU1QTEUtQUVTXCI6XG4gICAgICBjYXNlIFwiU0FNUExFLUFFUy1DRU5DXCI6XG4gICAgICBjYXNlIFwiU0FNUExFLUFFUy1DVFJcIjpcbiAgICAgICAgcmV0dXJuIGkua2V5Rm9ybWF0ID09PSBcImlkZW50aXR5XCIgPyB0aGlzLmxvYWRLZXlIVFRQKGwsIGUpIDogdGhpcy5sb2FkS2V5RU1FKGwsIGUpO1xuICAgICAgY2FzZSBcIkFFUy0xMjhcIjpcbiAgICAgIGNhc2UgXCJBRVMtMjU2XCI6XG4gICAgICBjYXNlIFwiQUVTLTI1Ni1DVFJcIjpcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZEtleUhUVFAobCwgZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QodGhpcy5jcmVhdGVLZXlMb2FkRXJyb3IoZSwgSi5LRVlfTE9BRF9FUlJPUiwgbmV3IEVycm9yKGBLZXkgc3VwcGxpZWQgd2l0aCB1bnN1cHBvcnRlZCBNRVRIT0Q6IFwiJHtpLm1ldGhvZH1cImApKSk7XG4gICAgfVxuICB9XG4gIGxvYWRLZXlFTUUoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB7XG4gICAgICBmcmFnOiB0LFxuICAgICAga2V5SW5mbzogZVxuICAgIH07XG4gICAgaWYgKHRoaXMuZW1lQ29udHJvbGxlciAmJiB0aGlzLmNvbmZpZy5lbWVFbmFibGVkKSB7XG4gICAgICBjb25zdCBuID0gdGhpcy5lbWVDb250cm9sbGVyLmxvYWRLZXkocik7XG4gICAgICByZXR1cm4gKGUua2V5TG9hZFByb21pc2UgPSBuLnRoZW4oKGkpID0+IChlLm1lZGlhS2V5U2Vzc2lvbkNvbnRleHQgPSBpLCByKSkpLmNhdGNoKChpKSA9PiB7XG4gICAgICAgIHRocm93IGUua2V5TG9hZFByb21pc2UgPSBudWxsLCBcImRhdGFcIiBpbiBpICYmIChpLmRhdGEuZnJhZyA9IHQpLCBpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocik7XG4gIH1cbiAgbG9hZEtleUhUVFAoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmNvbmZpZywgbiA9IHIubG9hZGVyLCBpID0gbmV3IG4ocik7XG4gICAgcmV0dXJuIHQua2V5TG9hZGVyID0gZS5sb2FkZXIgPSBpLCBlLmtleUxvYWRQcm9taXNlID0gbmV3IFByb21pc2UoKG8sIGEpID0+IHtcbiAgICAgIGNvbnN0IGwgPSB7XG4gICAgICAgIGtleUluZm86IGUsXG4gICAgICAgIGZyYWc6IHQsXG4gICAgICAgIHJlc3BvbnNlVHlwZTogXCJhcnJheWJ1ZmZlclwiLFxuICAgICAgICB1cmw6IGUuZGVjcnlwdGRhdGEudXJpXG4gICAgICB9LCBjID0gci5rZXlMb2FkUG9saWN5LmRlZmF1bHQsIHUgPSB7XG4gICAgICAgIGxvYWRQb2xpY3k6IGMsXG4gICAgICAgIHRpbWVvdXQ6IGMubWF4TG9hZFRpbWVNcyxcbiAgICAgICAgbWF4UmV0cnk6IDAsXG4gICAgICAgIHJldHJ5RGVsYXk6IDAsXG4gICAgICAgIG1heFJldHJ5RGVsYXk6IDBcbiAgICAgIH0sIGQgPSB7XG4gICAgICAgIG9uU3VjY2VzczogKGgsIGYsIHAsIHkpID0+IHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmcmFnOiBFLFxuICAgICAgICAgICAga2V5SW5mbzogYlxuICAgICAgICAgIH0gPSBwLCBSID0ga2woYi5kZWNyeXB0ZGF0YSk7XG4gICAgICAgICAgaWYgKCFFLmRlY3J5cHRkYXRhIHx8IGIgIT09IHRoaXMua2V5SWRUb0tleUluZm9bUl0pXG4gICAgICAgICAgICByZXR1cm4gYSh0aGlzLmNyZWF0ZUtleUxvYWRFcnJvcihFLCBKLktFWV9MT0FEX0VSUk9SLCBuZXcgRXJyb3IoXCJhZnRlciBrZXkgbG9hZCwgZGVjcnlwdGRhdGEgdW5zZXQgb3IgY2hhbmdlZFwiKSwgeSkpO1xuICAgICAgICAgIGIuZGVjcnlwdGRhdGEua2V5ID0gRS5kZWNyeXB0ZGF0YS5rZXkgPSBuZXcgVWludDhBcnJheShoLmRhdGEpLCBFLmtleUxvYWRlciA9IG51bGwsIGIubG9hZGVyID0gbnVsbCwgbyh7XG4gICAgICAgICAgICBmcmFnOiBFLFxuICAgICAgICAgICAga2V5SW5mbzogYlxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiAoaCwgZiwgcCwgeSkgPT4ge1xuICAgICAgICAgIHRoaXMucmVzZXRMb2FkZXIoZiksIGEodGhpcy5jcmVhdGVLZXlMb2FkRXJyb3IodCwgSi5LRVlfTE9BRF9FUlJPUiwgbmV3IEVycm9yKGBIVFRQIEVycm9yICR7aC5jb2RlfSBsb2FkaW5nIGtleSAke2gudGV4dH1gKSwgcCwgdHQoe1xuICAgICAgICAgICAgdXJsOiBsLnVybCxcbiAgICAgICAgICAgIGRhdGE6IHZvaWQgMFxuICAgICAgICAgIH0sIGgpKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVGltZW91dDogKGgsIGYsIHApID0+IHtcbiAgICAgICAgICB0aGlzLnJlc2V0TG9hZGVyKGYpLCBhKHRoaXMuY3JlYXRlS2V5TG9hZEVycm9yKHQsIEouS0VZX0xPQURfVElNRU9VVCwgbmV3IEVycm9yKFwia2V5IGxvYWRpbmcgdGltZWQgb3V0XCIpLCBwKSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uQWJvcnQ6IChoLCBmLCBwKSA9PiB7XG4gICAgICAgICAgdGhpcy5yZXNldExvYWRlcihmKSwgYSh0aGlzLmNyZWF0ZUtleUxvYWRFcnJvcih0LCBKLklOVEVSTkFMX0FCT1JURUQsIG5ldyBFcnJvcihcImtleSBsb2FkaW5nIGFib3J0ZWRcIiksIHApKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGkubG9hZChsLCB1LCBkKTtcbiAgICB9KTtcbiAgfVxuICByZXNldExvYWRlcihlKSB7XG4gICAgY29uc3Qge1xuICAgICAgZnJhZzogdCxcbiAgICAgIGtleUluZm86IHIsXG4gICAgICB1cmw6IG5cbiAgICB9ID0gZSwgaSA9IHIubG9hZGVyO1xuICAgIHQua2V5TG9hZGVyID09PSBpICYmICh0LmtleUxvYWRlciA9IG51bGwsIHIubG9hZGVyID0gbnVsbCk7XG4gICAgY29uc3QgbyA9IGtsKHIuZGVjcnlwdGRhdGEpIHx8IG47XG4gICAgZGVsZXRlIHRoaXMua2V5SWRUb0tleUluZm9bb10sIGkgJiYgaS5kZXN0cm95KCk7XG4gIH1cbn1cbmZ1bmN0aW9uIGtsKHMpIHtcbiAgaWYgKHMua2V5Rm9ybWF0ICE9PSBsci5GQUlSUExBWSkge1xuICAgIGNvbnN0IGUgPSBzLmtleUlkO1xuICAgIGlmIChlKVxuICAgICAgcmV0dXJuIGZyKGUpO1xuICB9XG4gIHJldHVybiBzLnVyaTtcbn1cbmZ1bmN0aW9uIGhmKHMpIHtcbiAgY29uc3Qge1xuICAgIHR5cGU6IGVcbiAgfSA9IHM7XG4gIHN3aXRjaCAoZSkge1xuICAgIGNhc2UgS2UuQVVESU9fVFJBQ0s6XG4gICAgICByZXR1cm4gcGUuQVVESU87XG4gICAgY2FzZSBLZS5TVUJUSVRMRV9UUkFDSzpcbiAgICAgIHJldHVybiBwZS5TVUJUSVRMRTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHBlLk1BSU47XG4gIH1cbn1cbmZ1bmN0aW9uIERsKHMsIGUpIHtcbiAgbGV0IHQgPSBzLnVybDtcbiAgcmV0dXJuICh0ID09PSB2b2lkIDAgfHwgdC5pbmRleE9mKFwiZGF0YTpcIikgPT09IDApICYmICh0ID0gZS51cmwpLCB0O1xufVxuY2xhc3MgVEEge1xuICBjb25zdHJ1Y3RvcihlKSB7XG4gICAgdGhpcy5obHMgPSB2b2lkIDAsIHRoaXMubG9hZGVycyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCB0aGlzLnZhcmlhYmxlTGlzdCA9IG51bGwsIHRoaXMub25NYW5pZmVzdExvYWRlZCA9IHRoaXMuY2hlY2tBdXRvc3RhcnRMb2FkLCB0aGlzLmhscyA9IGUsIHRoaXMucmVnaXN0ZXJMaXN0ZW5lcnMoKTtcbiAgfVxuICBzdGFydExvYWQoZSkge1xuICB9XG4gIHN0b3BMb2FkKCkge1xuICAgIHRoaXMuZGVzdHJveUludGVybmFsTG9hZGVycygpO1xuICB9XG4gIHJlZ2lzdGVyTGlzdGVuZXJzKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGhsczogZVxuICAgIH0gPSB0aGlzO1xuICAgIGUub24oSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vbihJLkxFVkVMX0xPQURJTkcsIHRoaXMub25MZXZlbExvYWRpbmcsIHRoaXMpLCBlLm9uKEkuQVVESU9fVFJBQ0tfTE9BRElORywgdGhpcy5vbkF1ZGlvVHJhY2tMb2FkaW5nLCB0aGlzKSwgZS5vbihJLlNVQlRJVExFX1RSQUNLX0xPQURJTkcsIHRoaXMub25TdWJ0aXRsZVRyYWNrTG9hZGluZywgdGhpcyksIGUub24oSS5MRVZFTFNfVVBEQVRFRCwgdGhpcy5vbkxldmVsc1VwZGF0ZWQsIHRoaXMpO1xuICB9XG4gIHVucmVnaXN0ZXJMaXN0ZW5lcnMoKSB7XG4gICAgY29uc3Qge1xuICAgICAgaGxzOiBlXG4gICAgfSA9IHRoaXM7XG4gICAgZS5vZmYoSS5NQU5JRkVTVF9MT0FESU5HLCB0aGlzLm9uTWFuaWZlc3RMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5MRVZFTF9MT0FESU5HLCB0aGlzLm9uTGV2ZWxMb2FkaW5nLCB0aGlzKSwgZS5vZmYoSS5BVURJT19UUkFDS19MT0FESU5HLCB0aGlzLm9uQXVkaW9UcmFja0xvYWRpbmcsIHRoaXMpLCBlLm9mZihJLlNVQlRJVExFX1RSQUNLX0xPQURJTkcsIHRoaXMub25TdWJ0aXRsZVRyYWNrTG9hZGluZywgdGhpcyksIGUub2ZmKEkuTEVWRUxTX1VQREFURUQsIHRoaXMub25MZXZlbHNVcGRhdGVkLCB0aGlzKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyBkZWZhdWx0cyBvciBjb25maWd1cmVkIGxvYWRlci10eXBlIG92ZXJsb2FkcyAocExvYWRlciBhbmQgbG9hZGVyIGNvbmZpZyBwYXJhbXMpXG4gICAqL1xuICBjcmVhdGVJbnRlcm5hbExvYWRlcihlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuaGxzLmNvbmZpZywgciA9IHQucExvYWRlciwgbiA9IHQubG9hZGVyLCBpID0gciB8fCBuLCBvID0gbmV3IGkodCk7XG4gICAgcmV0dXJuIHRoaXMubG9hZGVyc1tlLnR5cGVdID0gbywgbztcbiAgfVxuICBnZXRJbnRlcm5hbExvYWRlcihlKSB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGVyc1tlLnR5cGVdO1xuICB9XG4gIHJlc2V0SW50ZXJuYWxMb2FkZXIoZSkge1xuICAgIHRoaXMubG9hZGVyc1tlXSAmJiBkZWxldGUgdGhpcy5sb2FkZXJzW2VdO1xuICB9XG4gIC8qKlxuICAgKiBDYWxsIGBkZXN0cm95YCBvbiBhbGwgaW50ZXJuYWwgbG9hZGVyIGluc3RhbmNlcyBtYXBwZWQgKG9uZSBwZXIgY29udGV4dCB0eXBlKVxuICAgKi9cbiAgZGVzdHJveUludGVybmFsTG9hZGVycygpIHtcbiAgICBmb3IgKGNvbnN0IGUgaW4gdGhpcy5sb2FkZXJzKSB7XG4gICAgICBjb25zdCB0ID0gdGhpcy5sb2FkZXJzW2VdO1xuICAgICAgdCAmJiB0LmRlc3Ryb3koKSwgdGhpcy5yZXNldEludGVybmFsTG9hZGVyKGUpO1xuICAgIH1cbiAgfVxuICBkZXN0cm95KCkge1xuICAgIHRoaXMudmFyaWFibGVMaXN0ID0gbnVsbCwgdGhpcy51bnJlZ2lzdGVyTGlzdGVuZXJzKCksIHRoaXMuZGVzdHJveUludGVybmFsTG9hZGVycygpO1xuICB9XG4gIG9uTWFuaWZlc3RMb2FkaW5nKGUsIHQpIHtcbiAgICBjb25zdCB7XG4gICAgICB1cmw6IHJcbiAgICB9ID0gdDtcbiAgICB0aGlzLnZhcmlhYmxlTGlzdCA9IG51bGwsIHRoaXMubG9hZCh7XG4gICAgICBpZDogbnVsbCxcbiAgICAgIGxldmVsOiAwLFxuICAgICAgcmVzcG9uc2VUeXBlOiBcInRleHRcIixcbiAgICAgIHR5cGU6IEtlLk1BTklGRVNULFxuICAgICAgdXJsOiByLFxuICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBudWxsLFxuICAgICAgbGV2ZWxPclRyYWNrOiBudWxsXG4gICAgfSk7XG4gIH1cbiAgb25MZXZlbExvYWRpbmcoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlkOiByLFxuICAgICAgbGV2ZWw6IG4sXG4gICAgICBwYXRod2F5SWQ6IGksXG4gICAgICB1cmw6IG8sXG4gICAgICBkZWxpdmVyeURpcmVjdGl2ZXM6IGEsXG4gICAgICBsZXZlbEluZm86IGxcbiAgICB9ID0gdDtcbiAgICB0aGlzLmxvYWQoe1xuICAgICAgaWQ6IHIsXG4gICAgICBsZXZlbDogbixcbiAgICAgIHBhdGh3YXlJZDogaSxcbiAgICAgIHJlc3BvbnNlVHlwZTogXCJ0ZXh0XCIsXG4gICAgICB0eXBlOiBLZS5MRVZFTCxcbiAgICAgIHVybDogbyxcbiAgICAgIGRlbGl2ZXJ5RGlyZWN0aXZlczogYSxcbiAgICAgIGxldmVsT3JUcmFjazogbFxuICAgIH0pO1xuICB9XG4gIG9uQXVkaW9UcmFja0xvYWRpbmcoZSwgdCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGlkOiByLFxuICAgICAgZ3JvdXBJZDogbixcbiAgICAgIHVybDogaSxcbiAgICAgIGRlbGl2ZXJ5RGlyZWN0aXZlczogbyxcbiAgICAgIHRyYWNrOiBhXG4gICAgfSA9IHQ7XG4gICAgdGhpcy5sb2FkKHtcbiAgICAgIGlkOiByLFxuICAgICAgZ3JvdXBJZDogbixcbiAgICAgIGxldmVsOiBudWxsLFxuICAgICAgcmVzcG9uc2VUeXBlOiBcInRleHRcIixcbiAgICAgIHR5cGU6IEtlLkFVRElPX1RSQUNLLFxuICAgICAgdXJsOiBpLFxuICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBvLFxuICAgICAgbGV2ZWxPclRyYWNrOiBhXG4gICAgfSk7XG4gIH1cbiAgb25TdWJ0aXRsZVRyYWNrTG9hZGluZyhlLCB0KSB7XG4gICAgY29uc3Qge1xuICAgICAgaWQ6IHIsXG4gICAgICBncm91cElkOiBuLFxuICAgICAgdXJsOiBpLFxuICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBvLFxuICAgICAgdHJhY2s6IGFcbiAgICB9ID0gdDtcbiAgICB0aGlzLmxvYWQoe1xuICAgICAgaWQ6IHIsXG4gICAgICBncm91cElkOiBuLFxuICAgICAgbGV2ZWw6IG51bGwsXG4gICAgICByZXNwb25zZVR5cGU6IFwidGV4dFwiLFxuICAgICAgdHlwZTogS2UuU1VCVElUTEVfVFJBQ0ssXG4gICAgICB1cmw6IGksXG4gICAgICBkZWxpdmVyeURpcmVjdGl2ZXM6IG8sXG4gICAgICBsZXZlbE9yVHJhY2s6IGFcbiAgICB9KTtcbiAgfVxuICBvbkxldmVsc1VwZGF0ZWQoZSwgdCkge1xuICAgIGNvbnN0IHIgPSB0aGlzLmxvYWRlcnNbS2UuTEVWRUxdO1xuICAgIGlmIChyKSB7XG4gICAgICBjb25zdCBuID0gci5jb250ZXh0O1xuICAgICAgbiAmJiAhdC5sZXZlbHMuc29tZSgoaSkgPT4gaSA9PT0gbi5sZXZlbE9yVHJhY2spICYmIChyLmFib3J0KCksIGRlbGV0ZSB0aGlzLmxvYWRlcnNbS2UuTEVWRUxdKTtcbiAgICB9XG4gIH1cbiAgbG9hZChlKSB7XG4gICAgdmFyIHQ7XG4gICAgY29uc3QgciA9IHRoaXMuaGxzLmNvbmZpZztcbiAgICBsZXQgbiA9IHRoaXMuZ2V0SW50ZXJuYWxMb2FkZXIoZSk7XG4gICAgaWYgKG4pIHtcbiAgICAgIGNvbnN0IGMgPSB0aGlzLmhscy5sb2dnZXIsIHUgPSBuLmNvbnRleHQ7XG4gICAgICBpZiAodSAmJiB1LmxldmVsT3JUcmFjayA9PT0gZS5sZXZlbE9yVHJhY2sgJiYgKHUudXJsID09PSBlLnVybCB8fCB1LmRlbGl2ZXJ5RGlyZWN0aXZlcyAmJiAhZS5kZWxpdmVyeURpcmVjdGl2ZXMpKSB7XG4gICAgICAgIHUudXJsID09PSBlLnVybCA/IGMubG9nKGBbcGxheWxpc3QtbG9hZGVyXTogaWdub3JlICR7ZS51cmx9IG9uZ29pbmcgcmVxdWVzdGApIDogYy5sb2coYFtwbGF5bGlzdC1sb2FkZXJdOiBpZ25vcmUgJHtlLnVybH0gaW4gZmF2b3Igb2YgJHt1LnVybH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYy5sb2coYFtwbGF5bGlzdC1sb2FkZXJdOiBhYm9ydGluZyBwcmV2aW91cyBsb2FkZXIgZm9yIHR5cGU6ICR7ZS50eXBlfWApLCBuLmFib3J0KCk7XG4gICAgfVxuICAgIGxldCBpO1xuICAgIGlmIChlLnR5cGUgPT09IEtlLk1BTklGRVNUID8gaSA9IHIubWFuaWZlc3RMb2FkUG9saWN5LmRlZmF1bHQgOiBpID0gbnQoe30sIHIucGxheWxpc3RMb2FkUG9saWN5LmRlZmF1bHQsIHtcbiAgICAgIHRpbWVvdXRSZXRyeTogbnVsbCxcbiAgICAgIGVycm9yUmV0cnk6IG51bGxcbiAgICB9KSwgbiA9IHRoaXMuY3JlYXRlSW50ZXJuYWxMb2FkZXIoZSksIHVlKCh0ID0gZS5kZWxpdmVyeURpcmVjdGl2ZXMpID09IG51bGwgPyB2b2lkIDAgOiB0LnBhcnQpKSB7XG4gICAgICBsZXQgYztcbiAgICAgIGlmIChlLnR5cGUgPT09IEtlLkxFVkVMICYmIGUubGV2ZWwgIT09IG51bGwgPyBjID0gdGhpcy5obHMubGV2ZWxzW2UubGV2ZWxdLmRldGFpbHMgOiBlLnR5cGUgPT09IEtlLkFVRElPX1RSQUNLICYmIGUuaWQgIT09IG51bGwgPyBjID0gdGhpcy5obHMuYXVkaW9UcmFja3NbZS5pZF0uZGV0YWlscyA6IGUudHlwZSA9PT0gS2UuU1VCVElUTEVfVFJBQ0sgJiYgZS5pZCAhPT0gbnVsbCAmJiAoYyA9IHRoaXMuaGxzLnN1YnRpdGxlVHJhY2tzW2UuaWRdLmRldGFpbHMpLCBjKSB7XG4gICAgICAgIGNvbnN0IHUgPSBjLnBhcnRUYXJnZXQsIGQgPSBjLnRhcmdldGR1cmF0aW9uO1xuICAgICAgICBpZiAodSAmJiBkKSB7XG4gICAgICAgICAgY29uc3QgaCA9IE1hdGgubWF4KHUgKiAzLCBkICogMC44KSAqIDFlMztcbiAgICAgICAgICBpID0gbnQoe30sIGksIHtcbiAgICAgICAgICAgIG1heFRpbWVUb0ZpcnN0Qnl0ZU1zOiBNYXRoLm1pbihoLCBpLm1heFRpbWVUb0ZpcnN0Qnl0ZU1zKSxcbiAgICAgICAgICAgIG1heExvYWRUaW1lTXM6IE1hdGgubWluKGgsIGkubWF4VGltZVRvRmlyc3RCeXRlTXMpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbyA9IGkuZXJyb3JSZXRyeSB8fCBpLnRpbWVvdXRSZXRyeSB8fCB7fSwgYSA9IHtcbiAgICAgIGxvYWRQb2xpY3k6IGksXG4gICAgICB0aW1lb3V0OiBpLm1heExvYWRUaW1lTXMsXG4gICAgICBtYXhSZXRyeTogby5tYXhOdW1SZXRyeSB8fCAwLFxuICAgICAgcmV0cnlEZWxheTogby5yZXRyeURlbGF5TXMgfHwgMCxcbiAgICAgIG1heFJldHJ5RGVsYXk6IG8ubWF4UmV0cnlEZWxheU1zIHx8IDBcbiAgICB9LCBsID0ge1xuICAgICAgb25TdWNjZXNzOiAoYywgdSwgZCwgaCkgPT4ge1xuICAgICAgICBjb25zdCBmID0gdGhpcy5nZXRJbnRlcm5hbExvYWRlcihkKTtcbiAgICAgICAgdGhpcy5yZXNldEludGVybmFsTG9hZGVyKGQudHlwZSk7XG4gICAgICAgIGNvbnN0IHAgPSBjLmRhdGE7XG4gICAgICAgIHUucGFyc2luZy5zdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpLCB6ci5pc01lZGlhUGxheWxpc3QocCkgfHwgZC50eXBlICE9PSBLZS5NQU5JRkVTVCA/IHRoaXMuaGFuZGxlVHJhY2tPckxldmVsUGxheWxpc3QoYywgdSwgZCwgaCB8fCBudWxsLCBmKSA6IHRoaXMuaGFuZGxlTWFzdGVyUGxheWxpc3QoYywgdSwgZCwgaCk7XG4gICAgICB9LFxuICAgICAgb25FcnJvcjogKGMsIHUsIGQsIGgpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVOZXR3b3JrRXJyb3IodSwgZCwgITEsIGMsIGgpO1xuICAgICAgfSxcbiAgICAgIG9uVGltZW91dDogKGMsIHUsIGQpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVOZXR3b3JrRXJyb3IodSwgZCwgITAsIHZvaWQgMCwgYyk7XG4gICAgICB9XG4gICAgfTtcbiAgICBuLmxvYWQoZSwgYSwgbCk7XG4gIH1cbiAgY2hlY2tBdXRvc3RhcnRMb2FkKCkge1xuICAgIGlmICghdGhpcy5obHMpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qge1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGF1dG9TdGFydExvYWQ6IGUsXG4gICAgICAgIHN0YXJ0UG9zaXRpb246IHRcbiAgICAgIH0sXG4gICAgICBmb3JjZVN0YXJ0TG9hZDogclxuICAgIH0gPSB0aGlzLmhscztcbiAgICAoZSB8fCByKSAmJiAodGhpcy5obHMubG9nZ2VyLmxvZyhgJHtlID8gXCJhdXRvXCIgOiBcImZvcmNlXCJ9IHN0YXJ0TG9hZCB3aXRoIGNvbmZpZ3VyZWQgc3RhcnRQb3NpdGlvbiAke3R9YCksIHRoaXMuaGxzLnN0YXJ0TG9hZCh0KSk7XG4gIH1cbiAgaGFuZGxlTWFzdGVyUGxheWxpc3QoZSwgdCwgciwgbikge1xuICAgIGNvbnN0IGkgPSB0aGlzLmhscywgbyA9IGUuZGF0YSwgYSA9IERsKGUsIHIpLCBsID0genIucGFyc2VNYXN0ZXJQbGF5bGlzdChvLCBhKTtcbiAgICBpZiAobC5wbGF5bGlzdFBhcnNpbmdFcnJvcikge1xuICAgICAgdC5wYXJzaW5nLmVuZCA9IHBlcmZvcm1hbmNlLm5vdygpLCB0aGlzLmhhbmRsZU1hbmlmZXN0UGFyc2luZ0Vycm9yKGUsIHIsIGwucGxheWxpc3RQYXJzaW5nRXJyb3IsIG4sIHQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjb250ZW50U3RlZXJpbmc6IGMsXG4gICAgICBsZXZlbHM6IHUsXG4gICAgICBzZXNzaW9uRGF0YTogZCxcbiAgICAgIHNlc3Npb25LZXlzOiBoLFxuICAgICAgc3RhcnRUaW1lT2Zmc2V0OiBmLFxuICAgICAgdmFyaWFibGVMaXN0OiBwXG4gICAgfSA9IGw7XG4gICAgdGhpcy52YXJpYWJsZUxpc3QgPSBwLCB1LmZvckVhY2goKFIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdW5rbm93bkNvZGVjczogQVxuICAgICAgfSA9IFI7XG4gICAgICBpZiAoQSkge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgcHJlZmVyTWFuYWdlZE1lZGlhU291cmNlOiBGXG4gICAgICAgIH0gPSB0aGlzLmhscy5jb25maWc7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgYXVkaW9Db2RlYzogTSxcbiAgICAgICAgICB2aWRlb0NvZGVjOiBIXG4gICAgICAgIH0gPSBSO1xuICAgICAgICBmb3IgKGxldCBLID0gQS5sZW5ndGg7IEstLTsgKSB7XG4gICAgICAgICAgY29uc3QgaiA9IEFbS107XG4gICAgICAgICAgZ2koaiwgXCJhdWRpb1wiLCBGKSA/IChSLmF1ZGlvQ29kZWMgPSBNID0gTSA/IGAke019LCR7an1gIDogaiwgRm4uYXVkaW9bTS5zdWJzdHJpbmcoMCwgNCldID0gMiwgQS5zcGxpY2UoSywgMSkpIDogZ2koaiwgXCJ2aWRlb1wiLCBGKSAmJiAoUi52aWRlb0NvZGVjID0gSCA9IEggPyBgJHtIfSwke2p9YCA6IGosIEZuLnZpZGVvW0guc3Vic3RyaW5nKDAsIDQpXSA9IDIsIEEuc3BsaWNlKEssIDEpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHtcbiAgICAgIEFVRElPOiB5ID0gW10sXG4gICAgICBTVUJUSVRMRVM6IEUsXG4gICAgICBcIkNMT1NFRC1DQVBUSU9OU1wiOiBiXG4gICAgfSA9IHpyLnBhcnNlTWFzdGVyUGxheWxpc3RNZWRpYShvLCBhLCBsKTtcbiAgICB5Lmxlbmd0aCAmJiAheS5zb21lKChBKSA9PiAhQS51cmwpICYmIHVbMF0uYXVkaW9Db2RlYyAmJiAhdVswXS5hdHRycy5BVURJTyAmJiAodGhpcy5obHMubG9nZ2VyLmxvZyhcIltwbGF5bGlzdC1sb2FkZXJdOiBhdWRpbyBjb2RlYyBzaWduYWxlZCBpbiBxdWFsaXR5IGxldmVsLCBidXQgbm8gZW1iZWRkZWQgYXVkaW8gdHJhY2sgc2lnbmFsZWQsIGNyZWF0ZSBvbmVcIiksIHkudW5zaGlmdCh7XG4gICAgICB0eXBlOiBcIm1haW5cIixcbiAgICAgIG5hbWU6IFwibWFpblwiLFxuICAgICAgZ3JvdXBJZDogXCJtYWluXCIsXG4gICAgICBkZWZhdWx0OiAhMSxcbiAgICAgIGF1dG9zZWxlY3Q6ICExLFxuICAgICAgZm9yY2VkOiAhMSxcbiAgICAgIGlkOiAtMSxcbiAgICAgIGF0dHJzOiBuZXcgZ3Qoe30pLFxuICAgICAgYml0cmF0ZTogMCxcbiAgICAgIHVybDogXCJcIlxuICAgIH0pKSwgaS50cmlnZ2VyKEkuTUFOSUZFU1RfTE9BREVELCB7XG4gICAgICBsZXZlbHM6IHUsXG4gICAgICBhdWRpb1RyYWNrczogeSxcbiAgICAgIHN1YnRpdGxlczogRSxcbiAgICAgIGNhcHRpb25zOiBiLFxuICAgICAgY29udGVudFN0ZWVyaW5nOiBjLFxuICAgICAgdXJsOiBhLFxuICAgICAgc3RhdHM6IHQsXG4gICAgICBuZXR3b3JrRGV0YWlsczogbixcbiAgICAgIHNlc3Npb25EYXRhOiBkLFxuICAgICAgc2Vzc2lvbktleXM6IGgsXG4gICAgICBzdGFydFRpbWVPZmZzZXQ6IGYsXG4gICAgICB2YXJpYWJsZUxpc3Q6IHBcbiAgICB9KTtcbiAgfVxuICBoYW5kbGVUcmFja09yTGV2ZWxQbGF5bGlzdChlLCB0LCByLCBuLCBpKSB7XG4gICAgY29uc3QgbyA9IHRoaXMuaGxzLCB7XG4gICAgICBpZDogYSxcbiAgICAgIGxldmVsOiBsLFxuICAgICAgdHlwZTogY1xuICAgIH0gPSByLCB1ID0gRGwoZSwgciksIGQgPSB1ZShsKSA/IGwgOiB1ZShhKSA/IGEgOiAwLCBoID0gaGYociksIGYgPSB6ci5wYXJzZUxldmVsUGxheWxpc3QoZS5kYXRhLCB1LCBkLCBoLCAwLCB0aGlzLnZhcmlhYmxlTGlzdCk7XG4gICAgaWYgKGMgPT09IEtlLk1BTklGRVNUKSB7XG4gICAgICBjb25zdCBwID0ge1xuICAgICAgICBhdHRyczogbmV3IGd0KHt9KSxcbiAgICAgICAgYml0cmF0ZTogMCxcbiAgICAgICAgZGV0YWlsczogZixcbiAgICAgICAgbmFtZTogXCJcIixcbiAgICAgICAgdXJsOiB1XG4gICAgICB9O1xuICAgICAgZi5yZXF1ZXN0U2NoZWR1bGVkID0gdC5sb2FkaW5nLnN0YXJ0ICsgUWcoZiwgMCksIG8udHJpZ2dlcihJLk1BTklGRVNUX0xPQURFRCwge1xuICAgICAgICBsZXZlbHM6IFtwXSxcbiAgICAgICAgYXVkaW9UcmFja3M6IFtdLFxuICAgICAgICB1cmw6IHUsXG4gICAgICAgIHN0YXRzOiB0LFxuICAgICAgICBuZXR3b3JrRGV0YWlsczogbixcbiAgICAgICAgc2Vzc2lvbkRhdGE6IG51bGwsXG4gICAgICAgIHNlc3Npb25LZXlzOiBudWxsLFxuICAgICAgICBjb250ZW50U3RlZXJpbmc6IG51bGwsXG4gICAgICAgIHN0YXJ0VGltZU9mZnNldDogbnVsbCxcbiAgICAgICAgdmFyaWFibGVMaXN0OiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdC5wYXJzaW5nLmVuZCA9IHBlcmZvcm1hbmNlLm5vdygpLCByLmxldmVsRGV0YWlscyA9IGYsIHRoaXMuaGFuZGxlUGxheWxpc3RMb2FkZWQoZiwgZSwgdCwgciwgbiwgaSk7XG4gIH1cbiAgaGFuZGxlTWFuaWZlc3RQYXJzaW5nRXJyb3IoZSwgdCwgciwgbiwgaSkge1xuICAgIHRoaXMuaGxzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgIGRldGFpbHM6IEouTUFOSUZFU1RfUEFSU0lOR19FUlJPUixcbiAgICAgIGZhdGFsOiB0LnR5cGUgPT09IEtlLk1BTklGRVNULFxuICAgICAgdXJsOiBlLnVybCxcbiAgICAgIGVycjogcixcbiAgICAgIGVycm9yOiByLFxuICAgICAgcmVhc29uOiByLm1lc3NhZ2UsXG4gICAgICByZXNwb25zZTogZSxcbiAgICAgIGNvbnRleHQ6IHQsXG4gICAgICBuZXR3b3JrRGV0YWlsczogbixcbiAgICAgIHN0YXRzOiBpXG4gICAgfSk7XG4gIH1cbiAgaGFuZGxlTmV0d29ya0Vycm9yKGUsIHQsIHIgPSAhMSwgbiwgaSkge1xuICAgIGxldCBvID0gYEEgbmV0d29yayAke3IgPyBcInRpbWVvdXRcIiA6IFwiZXJyb3JcIiArIChuID8gXCIgKHN0YXR1cyBcIiArIG4uY29kZSArIFwiKVwiIDogXCJcIil9IG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgJHtlLnR5cGV9YDtcbiAgICBlLnR5cGUgPT09IEtlLkxFVkVMID8gbyArPSBgOiAke2UubGV2ZWx9IGlkOiAke2UuaWR9YCA6IChlLnR5cGUgPT09IEtlLkFVRElPX1RSQUNLIHx8IGUudHlwZSA9PT0gS2UuU1VCVElUTEVfVFJBQ0spICYmIChvICs9IGAgaWQ6ICR7ZS5pZH0gZ3JvdXAtaWQ6IFwiJHtlLmdyb3VwSWR9XCJgKTtcbiAgICBjb25zdCBhID0gbmV3IEVycm9yKG8pO1xuICAgIHRoaXMuaGxzLmxvZ2dlci53YXJuKGBbcGxheWxpc3QtbG9hZGVyXTogJHtvfWApO1xuICAgIGxldCBsID0gSi5VTktOT1dOLCBjID0gITE7XG4gICAgY29uc3QgdSA9IHRoaXMuZ2V0SW50ZXJuYWxMb2FkZXIoZSk7XG4gICAgc3dpdGNoIChlLnR5cGUpIHtcbiAgICAgIGNhc2UgS2UuTUFOSUZFU1Q6XG4gICAgICAgIGwgPSByID8gSi5NQU5JRkVTVF9MT0FEX1RJTUVPVVQgOiBKLk1BTklGRVNUX0xPQURfRVJST1IsIGMgPSAhMDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEtlLkxFVkVMOlxuICAgICAgICBsID0gciA/IEouTEVWRUxfTE9BRF9USU1FT1VUIDogSi5MRVZFTF9MT0FEX0VSUk9SLCBjID0gITE7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBLZS5BVURJT19UUkFDSzpcbiAgICAgICAgbCA9IHIgPyBKLkFVRElPX1RSQUNLX0xPQURfVElNRU9VVCA6IEouQVVESU9fVFJBQ0tfTE9BRF9FUlJPUiwgYyA9ICExO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgS2UuU1VCVElUTEVfVFJBQ0s6XG4gICAgICAgIGwgPSByID8gSi5TVUJUSVRMRV9UUkFDS19MT0FEX1RJTUVPVVQgOiBKLlNVQlRJVExFX0xPQURfRVJST1IsIGMgPSAhMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHUgJiYgdGhpcy5yZXNldEludGVybmFsTG9hZGVyKGUudHlwZSk7XG4gICAgY29uc3QgZCA9IHtcbiAgICAgIHR5cGU6IHZlLk5FVFdPUktfRVJST1IsXG4gICAgICBkZXRhaWxzOiBsLFxuICAgICAgZmF0YWw6IGMsXG4gICAgICB1cmw6IGUudXJsLFxuICAgICAgbG9hZGVyOiB1LFxuICAgICAgY29udGV4dDogZSxcbiAgICAgIGVycm9yOiBhLFxuICAgICAgbmV0d29ya0RldGFpbHM6IHQsXG4gICAgICBzdGF0czogaVxuICAgIH07XG4gICAgaWYgKG4pIHtcbiAgICAgIGNvbnN0IGggPSAodCA9PSBudWxsID8gdm9pZCAwIDogdC51cmwpIHx8IGUudXJsO1xuICAgICAgZC5yZXNwb25zZSA9IHR0KHtcbiAgICAgICAgdXJsOiBoLFxuICAgICAgICBkYXRhOiB2b2lkIDBcbiAgICAgIH0sIG4pO1xuICAgIH1cbiAgICB0aGlzLmhscy50cmlnZ2VyKEkuRVJST1IsIGQpO1xuICB9XG4gIGhhbmRsZVBsYXlsaXN0TG9hZGVkKGUsIHQsIHIsIG4sIGksIG8pIHtcbiAgICBjb25zdCBhID0gdGhpcy5obHMsIHtcbiAgICAgIHR5cGU6IGwsXG4gICAgICBsZXZlbDogYyxcbiAgICAgIGxldmVsT3JUcmFjazogdSxcbiAgICAgIGlkOiBkLFxuICAgICAgZ3JvdXBJZDogaCxcbiAgICAgIGRlbGl2ZXJ5RGlyZWN0aXZlczogZlxuICAgIH0gPSBuLCBwID0gRGwodCwgbiksIHkgPSBoZihuKTtcbiAgICBsZXQgRSA9IHR5cGVvZiBuLmxldmVsID09IFwibnVtYmVyXCIgJiYgeSA9PT0gcGUuTUFJTiA/IGMgOiB2b2lkIDA7XG4gICAgY29uc3QgYiA9IGUucGxheWxpc3RQYXJzaW5nRXJyb3I7XG4gICAgaWYgKGIpIHtcbiAgICAgIGlmICh0aGlzLmhscy5sb2dnZXIud2FybihgJHtifSAke2UudXJsfWApLCAhYS5jb25maWcuaWdub3JlUGxheWxpc3RQYXJzaW5nRXJyb3JzKSB7XG4gICAgICAgIGEudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgICAgICBkZXRhaWxzOiBKLkxFVkVMX1BBUlNJTkdfRVJST1IsXG4gICAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICAgIHVybDogcCxcbiAgICAgICAgICBlcnJvcjogYixcbiAgICAgICAgICByZWFzb246IGIubWVzc2FnZSxcbiAgICAgICAgICByZXNwb25zZTogdCxcbiAgICAgICAgICBjb250ZXh0OiBuLFxuICAgICAgICAgIGxldmVsOiBFLFxuICAgICAgICAgIHBhcmVudDogeSxcbiAgICAgICAgICBuZXR3b3JrRGV0YWlsczogaSxcbiAgICAgICAgICBzdGF0czogclxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZS5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG51bGw7XG4gICAgfVxuICAgIGlmICghZS5mcmFnbWVudHMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBSID0gZS5wbGF5bGlzdFBhcnNpbmdFcnJvciA9IG5ldyBFcnJvcihcIk5vIFNlZ21lbnRzIGZvdW5kIGluIFBsYXlsaXN0XCIpO1xuICAgICAgYS50cmlnZ2VyKEkuRVJST1IsIHtcbiAgICAgICAgdHlwZTogdmUuTkVUV09SS19FUlJPUixcbiAgICAgICAgZGV0YWlsczogSi5MRVZFTF9FTVBUWV9FUlJPUixcbiAgICAgICAgZmF0YWw6ICExLFxuICAgICAgICB1cmw6IHAsXG4gICAgICAgIGVycm9yOiBSLFxuICAgICAgICByZWFzb246IFIubWVzc2FnZSxcbiAgICAgICAgcmVzcG9uc2U6IHQsXG4gICAgICAgIGNvbnRleHQ6IG4sXG4gICAgICAgIGxldmVsOiBFLFxuICAgICAgICBwYXJlbnQ6IHksXG4gICAgICAgIG5ldHdvcmtEZXRhaWxzOiBpLFxuICAgICAgICBzdGF0czogclxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHN3aXRjaCAoZS5saXZlICYmIG8gJiYgKG8uZ2V0Q2FjaGVBZ2UgJiYgKGUuYWdlSGVhZGVyID0gby5nZXRDYWNoZUFnZSgpIHx8IDApLCAoIW8uZ2V0Q2FjaGVBZ2UgfHwgaXNOYU4oZS5hZ2VIZWFkZXIpKSAmJiAoZS5hZ2VIZWFkZXIgPSAwKSksIGwpIHtcbiAgICAgIGNhc2UgS2UuTUFOSUZFU1Q6XG4gICAgICBjYXNlIEtlLkxFVkVMOlxuICAgICAgICBpZiAoRSkge1xuICAgICAgICAgIGlmICghdSlcbiAgICAgICAgICAgIEUgPSAwO1xuICAgICAgICAgIGVsc2UgaWYgKHUgIT09IGEubGV2ZWxzW0VdKSB7XG4gICAgICAgICAgICBjb25zdCBSID0gYS5sZXZlbHMuaW5kZXhPZih1KTtcbiAgICAgICAgICAgIFIgPiAtMSAmJiAoRSA9IFIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhLnRyaWdnZXIoSS5MRVZFTF9MT0FERUQsIHtcbiAgICAgICAgICBkZXRhaWxzOiBlLFxuICAgICAgICAgIGxldmVsSW5mbzogdSB8fCBhLmxldmVsc1swXSxcbiAgICAgICAgICBsZXZlbDogRSB8fCAwLFxuICAgICAgICAgIGlkOiBkIHx8IDAsXG4gICAgICAgICAgc3RhdHM6IHIsXG4gICAgICAgICAgbmV0d29ya0RldGFpbHM6IGksXG4gICAgICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBmLFxuICAgICAgICAgIHdpdGhvdXRNdWx0aVZhcmlhbnQ6IGwgPT09IEtlLk1BTklGRVNUXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgS2UuQVVESU9fVFJBQ0s6XG4gICAgICAgIGEudHJpZ2dlcihJLkFVRElPX1RSQUNLX0xPQURFRCwge1xuICAgICAgICAgIGRldGFpbHM6IGUsXG4gICAgICAgICAgdHJhY2s6IHUsXG4gICAgICAgICAgaWQ6IGQgfHwgMCxcbiAgICAgICAgICBncm91cElkOiBoIHx8IFwiXCIsXG4gICAgICAgICAgc3RhdHM6IHIsXG4gICAgICAgICAgbmV0d29ya0RldGFpbHM6IGksXG4gICAgICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBmXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgS2UuU1VCVElUTEVfVFJBQ0s6XG4gICAgICAgIGEudHJpZ2dlcihJLlNVQlRJVExFX1RSQUNLX0xPQURFRCwge1xuICAgICAgICAgIGRldGFpbHM6IGUsXG4gICAgICAgICAgdHJhY2s6IHUsXG4gICAgICAgICAgaWQ6IGQgfHwgMCxcbiAgICAgICAgICBncm91cElkOiBoIHx8IFwiXCIsXG4gICAgICAgICAgc3RhdHM6IHIsXG4gICAgICAgICAgbmV0d29ya0RldGFpbHM6IGksXG4gICAgICAgICAgZGVsaXZlcnlEaXJlY3RpdmVzOiBmXG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn1cbmNsYXNzIEhyIHtcbiAgLyoqXG4gICAqIEdldCB0aGUgdmlkZW8tZGV2L2hscy5qcyBwYWNrYWdlIHZlcnNpb24uXG4gICAqL1xuICBzdGF0aWMgZ2V0IHZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHZpO1xuICB9XG4gIC8qKlxuICAgKiBDaGVjayBpZiB0aGUgcmVxdWlyZWQgTWVkaWFTb3VyY2UgRXh0ZW5zaW9ucyBhcmUgYXZhaWxhYmxlLlxuICAgKi9cbiAgc3RhdGljIGlzTVNFU3VwcG9ydGVkKCkge1xuICAgIHJldHVybiBKcCgpO1xuICB9XG4gIC8qKlxuICAgKiBDaGVjayBpZiBNZWRpYVNvdXJjZSBFeHRlbnNpb25zIGFyZSBhdmFpbGFibGUgYW5kIGlzVHlwZVN1cHBvcnRlZCBjaGVja3MgcGFzcyBmb3IgYW55IGJhc2VsaW5lIGNvZGVjcy5cbiAgICovXG4gIHN0YXRpYyBpc1N1cHBvcnRlZCgpIHtcbiAgICByZXR1cm4gdkEoKTtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBNZWRpYVNvdXJjZSBnbG9iYWwgdXNlZCBmb3IgTVNFIHBsYXliYWNrIChNYW5hZ2VkTWVkaWFTb3VyY2UsIE1lZGlhU291cmNlLCBvciBXZWJLaXRNZWRpYVNvdXJjZSkuXG4gICAqL1xuICBzdGF0aWMgZ2V0TWVkaWFTb3VyY2UoKSB7XG4gICAgcmV0dXJuIE1zKCk7XG4gIH1cbiAgc3RhdGljIGdldCBFdmVudHMoKSB7XG4gICAgcmV0dXJuIEk7XG4gIH1cbiAgc3RhdGljIGdldCBNZXRhZGF0YVNjaGVtYSgpIHtcbiAgICByZXR1cm4gYnI7XG4gIH1cbiAgc3RhdGljIGdldCBFcnJvclR5cGVzKCkge1xuICAgIHJldHVybiB2ZTtcbiAgfVxuICBzdGF0aWMgZ2V0IEVycm9yRGV0YWlscygpIHtcbiAgICByZXR1cm4gSjtcbiAgfVxuICAvKipcbiAgICogR2V0IHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXBwbGllZCB0byBuZXcgaW5zdGFuY2VzLlxuICAgKi9cbiAgc3RhdGljIGdldCBEZWZhdWx0Q29uZmlnKCkge1xuICAgIHJldHVybiBIci5kZWZhdWx0Q29uZmlnID8gSHIuZGVmYXVsdENvbmZpZyA6IG9BO1xuICB9XG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXBwbGllZCB0byBuZXcgaW5zdGFuY2VzLlxuICAgKi9cbiAgc3RhdGljIHNldCBEZWZhdWx0Q29uZmlnKGUpIHtcbiAgICBIci5kZWZhdWx0Q29uZmlnID0gZTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBITFMgY2xpZW50IHRoYXQgY2FuIGF0dGFjaCB0byBleGFjdGx5IG9uZSBgSFRNTE1lZGlhRWxlbWVudGAuXG4gICAqIEBwYXJhbSB1c2VyQ29uZmlnIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGFwcGxpZWQgb3ZlciBgSGxzLkRlZmF1bHRDb25maWdgXG4gICAqL1xuICBjb25zdHJ1Y3RvcihlID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IHZvaWQgMCwgdGhpcy51c2VyQ29uZmlnID0gdm9pZCAwLCB0aGlzLmxvZ2dlciA9IHZvaWQgMCwgdGhpcy5jb3JlQ29tcG9uZW50cyA9IHZvaWQgMCwgdGhpcy5uZXR3b3JrQ29udHJvbGxlcnMgPSB2b2lkIDAsIHRoaXMuX2VtaXR0ZXIgPSBuZXcgd3UoKSwgdGhpcy5fYXV0b0xldmVsQ2FwcGluZyA9IC0xLCB0aGlzLl9tYXhIZGNwTGV2ZWwgPSBudWxsLCB0aGlzLmFickNvbnRyb2xsZXIgPSB2b2lkIDAsIHRoaXMuYnVmZmVyQ29udHJvbGxlciA9IHZvaWQgMCwgdGhpcy5jYXBMZXZlbENvbnRyb2xsZXIgPSB2b2lkIDAsIHRoaXMubGF0ZW5jeUNvbnRyb2xsZXIgPSB2b2lkIDAsIHRoaXMubGV2ZWxDb250cm9sbGVyID0gdm9pZCAwLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIgPSB2b2lkIDAsIHRoaXMuYXVkaW9TdHJlYW1Db250cm9sbGVyID0gdm9pZCAwLCB0aGlzLnN1YnRpdGl0bGVTdHJlYW1Db250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmF1ZGlvVHJhY2tDb250cm9sbGVyID0gdm9pZCAwLCB0aGlzLnN1YnRpdGxlVHJhY2tDb250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmludGVyc3RpdGlhbHNDb250cm9sbGVyID0gdm9pZCAwLCB0aGlzLmdhcENvbnRyb2xsZXIgPSB2b2lkIDAsIHRoaXMuZW1lQ29udHJvbGxlciA9IHZvaWQgMCwgdGhpcy5jbWNkQ29udHJvbGxlciA9IHZvaWQgMCwgdGhpcy5fbWVkaWEgPSBudWxsLCB0aGlzLl91cmwgPSBudWxsLCB0aGlzLl9zZXNzaW9uSWQgPSB2b2lkIDAsIHRoaXMudHJpZ2dlcmluZ0V4Y2VwdGlvbiA9IHZvaWQgMCwgdGhpcy5zdGFydGVkID0gITE7XG4gICAgY29uc3QgdCA9IHRoaXMubG9nZ2VyID0gTFMoZS5kZWJ1ZyB8fCAhMSwgXCJIbHMgaW5zdGFuY2VcIiwgZS5hc3NldFBsYXllcklkKSwgciA9IHRoaXMuY29uZmlnID0gbEEoSHIuRGVmYXVsdENvbmZpZywgZSwgdCk7XG4gICAgdGhpcy51c2VyQ29uZmlnID0gZSwgci5wcm9ncmVzc2l2ZSAmJiBjQShyLCB0KTtcbiAgICBjb25zdCB7XG4gICAgICBhYnJDb250cm9sbGVyOiBuLFxuICAgICAgYnVmZmVyQ29udHJvbGxlcjogaSxcbiAgICAgIGNhcExldmVsQ29udHJvbGxlcjogbyxcbiAgICAgIGVycm9yQ29udHJvbGxlcjogYSxcbiAgICAgIGZwc0NvbnRyb2xsZXI6IGxcbiAgICB9ID0gciwgYyA9IG5ldyBhKHRoaXMpLCB1ID0gdGhpcy5hYnJDb250cm9sbGVyID0gbmV3IG4odGhpcyksIGQgPSBuZXcgVGIodGhpcyksIGggPSByLmludGVyc3RpdGlhbHNDb250cm9sbGVyLCBmID0gaCA/IHRoaXMuaW50ZXJzdGl0aWFsc0NvbnRyb2xsZXIgPSBuZXcgaCh0aGlzLCBIcikgOiBudWxsLCBwID0gdGhpcy5idWZmZXJDb250cm9sbGVyID0gbmV3IGkodGhpcywgZCksIHkgPSB0aGlzLmNhcExldmVsQ29udHJvbGxlciA9IG5ldyBvKHRoaXMpLCBFID0gbmV3IGwodGhpcyksIGIgPSBuZXcgVEEodGhpcyksIFIgPSByLmNvbnRlbnRTdGVlcmluZ0NvbnRyb2xsZXIsIEEgPSBSID8gbmV3IFIodGhpcykgOiBudWxsLCBGID0gdGhpcy5sZXZlbENvbnRyb2xsZXIgPSBuZXcgeUEodGhpcywgQSksIE0gPSBuZXcgcEEodGhpcyksIEggPSBuZXcgYkEodGhpcy5jb25maWcsIHRoaXMubG9nZ2VyKSwgSyA9IHRoaXMuc3RyZWFtQ29udHJvbGxlciA9IG5ldyBTQSh0aGlzLCBkLCBIKSwgaiA9IHRoaXMuZ2FwQ29udHJvbGxlciA9IG5ldyBmQSh0aGlzLCBkKTtcbiAgICB5LnNldFN0cmVhbUNvbnRyb2xsZXIoSyksIEUuc2V0U3RyZWFtQ29udHJvbGxlcihLKTtcbiAgICBjb25zdCBDID0gW2IsIEYsIEtdO1xuICAgIGYgJiYgQy5zcGxpY2UoMSwgMCwgZiksIEEgJiYgQy5zcGxpY2UoMSwgMCwgQSksIHRoaXMubmV0d29ya0NvbnRyb2xsZXJzID0gQztcbiAgICBjb25zdCBrID0gW3UsIHAsIGosIHksIEUsIE0sIGRdO1xuICAgIHRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXIgPSB0aGlzLmNyZWF0ZUNvbnRyb2xsZXIoci5hdWRpb1RyYWNrQ29udHJvbGxlciwgQyk7XG4gICAgY29uc3QgJCA9IHIuYXVkaW9TdHJlYW1Db250cm9sbGVyO1xuICAgICQgJiYgQy5wdXNoKHRoaXMuYXVkaW9TdHJlYW1Db250cm9sbGVyID0gbmV3ICQodGhpcywgZCwgSCkpLCB0aGlzLnN1YnRpdGxlVHJhY2tDb250cm9sbGVyID0gdGhpcy5jcmVhdGVDb250cm9sbGVyKHIuc3VidGl0bGVUcmFja0NvbnRyb2xsZXIsIEMpO1xuICAgIGNvbnN0IFcgPSByLnN1YnRpdGxlU3RyZWFtQ29udHJvbGxlcjtcbiAgICBXICYmIEMucHVzaCh0aGlzLnN1YnRpdGl0bGVTdHJlYW1Db250cm9sbGVyID0gbmV3IFcodGhpcywgZCwgSCkpLCB0aGlzLmNyZWF0ZUNvbnRyb2xsZXIoci50aW1lbGluZUNvbnRyb2xsZXIsIGspLCBILmVtZUNvbnRyb2xsZXIgPSB0aGlzLmVtZUNvbnRyb2xsZXIgPSB0aGlzLmNyZWF0ZUNvbnRyb2xsZXIoci5lbWVDb250cm9sbGVyLCBrKSwgdGhpcy5jbWNkQ29udHJvbGxlciA9IHRoaXMuY3JlYXRlQ29udHJvbGxlcihyLmNtY2RDb250cm9sbGVyLCBrKSwgdGhpcy5sYXRlbmN5Q29udHJvbGxlciA9IHRoaXMuY3JlYXRlQ29udHJvbGxlcihtQSwgayksIHRoaXMuY29yZUNvbXBvbmVudHMgPSBrLCBDLnB1c2goYyk7XG4gICAgY29uc3QgXyA9IGMub25FcnJvck91dDtcbiAgICB0eXBlb2YgXyA9PSBcImZ1bmN0aW9uXCIgJiYgdGhpcy5vbihJLkVSUk9SLCBfLCBjKSwgdGhpcy5vbihJLk1BTklGRVNUX0xPQURFRCwgYi5vbk1hbmlmZXN0TG9hZGVkLCBiKTtcbiAgfVxuICBjcmVhdGVDb250cm9sbGVyKGUsIHQpIHtcbiAgICBpZiAoZSkge1xuICAgICAgY29uc3QgciA9IG5ldyBlKHRoaXMpO1xuICAgICAgcmV0dXJuIHQgJiYgdC5wdXNoKHIpLCByO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICAvLyBEZWxlZ2F0ZSB0aGUgRXZlbnRFbWl0dGVyIHRocm91Z2ggdGhlIHB1YmxpYyBBUEkgb2YgSGxzLmpzXG4gIG9uKGUsIHQsIHIgPSB0aGlzKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vbihlLCB0LCByKTtcbiAgfVxuICBvbmNlKGUsIHQsIHIgPSB0aGlzKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vbmNlKGUsIHQsIHIpO1xuICB9XG4gIHJlbW92ZUFsbExpc3RlbmVycyhlKSB7XG4gICAgdGhpcy5fZW1pdHRlci5yZW1vdmVBbGxMaXN0ZW5lcnMoZSk7XG4gIH1cbiAgb2ZmKGUsIHQsIHIgPSB0aGlzLCBuKSB7XG4gICAgdGhpcy5fZW1pdHRlci5vZmYoZSwgdCwgciwgbik7XG4gIH1cbiAgbGlzdGVuZXJzKGUpIHtcbiAgICByZXR1cm4gdGhpcy5fZW1pdHRlci5saXN0ZW5lcnMoZSk7XG4gIH1cbiAgZW1pdChlLCB0LCByKSB7XG4gICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZW1pdChlLCB0LCByKTtcbiAgfVxuICB0cmlnZ2VyKGUsIHQpIHtcbiAgICBpZiAodGhpcy5jb25maWcuZGVidWcpXG4gICAgICByZXR1cm4gdGhpcy5lbWl0KGUsIGUsIHQpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5lbWl0KGUsIGUsIHQpO1xuICAgIH0gY2F0Y2ggKHIpIHtcbiAgICAgIGlmICh0aGlzLmxvZ2dlci5lcnJvcihcIkFuIGludGVybmFsIGVycm9yIGhhcHBlbmVkIHdoaWxlIGhhbmRsaW5nIGV2ZW50IFwiICsgZSArICcuIEVycm9yIG1lc3NhZ2U6IFwiJyArIHIubWVzc2FnZSArICdcIi4gSGVyZSBpcyBhIHN0YWNrdHJhY2U6JywgciksICF0aGlzLnRyaWdnZXJpbmdFeGNlcHRpb24pIHtcbiAgICAgICAgdGhpcy50cmlnZ2VyaW5nRXhjZXB0aW9uID0gITA7XG4gICAgICAgIGNvbnN0IG4gPSBlID09PSBJLkVSUk9SO1xuICAgICAgICB0aGlzLnRyaWdnZXIoSS5FUlJPUiwge1xuICAgICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICAgIGRldGFpbHM6IEouSU5URVJOQUxfRVhDRVBUSU9OLFxuICAgICAgICAgIGZhdGFsOiBuLFxuICAgICAgICAgIGV2ZW50OiBlLFxuICAgICAgICAgIGVycm9yOiByXG4gICAgICAgIH0pLCB0aGlzLnRyaWdnZXJpbmdFeGNlcHRpb24gPSAhMTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuICExO1xuICB9XG4gIGxpc3RlbmVyQ291bnQoZSkge1xuICAgIHJldHVybiB0aGlzLl9lbWl0dGVyLmxpc3RlbmVyQ291bnQoZSk7XG4gIH1cbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgdGhlIGluc3RhbmNlXG4gICAqL1xuICBkZXN0cm95KCkge1xuICAgIHRoaXMubG9nZ2VyLmxvZyhcImRlc3Ryb3lcIiksIHRoaXMudHJpZ2dlcihJLkRFU1RST1lJTkcsIHZvaWQgMCksIHRoaXMuZGV0YWNoTWVkaWEoKSwgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoKSwgdGhpcy5fYXV0b0xldmVsQ2FwcGluZyA9IC0xLCB0aGlzLl91cmwgPSBudWxsLCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5mb3JFYWNoKCh0KSA9PiB0LmRlc3Ryb3koKSksIHRoaXMubmV0d29ya0NvbnRyb2xsZXJzLmxlbmd0aCA9IDAsIHRoaXMuY29yZUNvbXBvbmVudHMuZm9yRWFjaCgodCkgPT4gdC5kZXN0cm95KCkpLCB0aGlzLmNvcmVDb21wb25lbnRzLmxlbmd0aCA9IDA7XG4gICAgY29uc3QgZSA9IHRoaXMuY29uZmlnO1xuICAgIGUueGhyU2V0dXAgPSBlLmZldGNoU2V0dXAgPSB2b2lkIDAsIHRoaXMudXNlckNvbmZpZyA9IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEF0dGFjaGVzIEhscy5qcyB0byBhIG1lZGlhIGVsZW1lbnRcbiAgICovXG4gIGF0dGFjaE1lZGlhKGUpIHtcbiAgICBpZiAoIWUgfHwgXCJtZWRpYVwiIGluIGUgJiYgIWUubWVkaWEpIHtcbiAgICAgIGNvbnN0IGkgPSBuZXcgRXJyb3IoYGF0dGFjaE1lZGlhIGZhaWxlZDogaW52YWxpZCBhcmd1bWVudCAoJHtlfSlgKTtcbiAgICAgIHRoaXMudHJpZ2dlcihJLkVSUk9SLCB7XG4gICAgICAgIHR5cGU6IHZlLk9USEVSX0VSUk9SLFxuICAgICAgICBkZXRhaWxzOiBKLkFUVEFDSF9NRURJQV9FUlJPUixcbiAgICAgICAgZmF0YWw6ICEwLFxuICAgICAgICBlcnJvcjogaVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9nZ2VyLmxvZyhcImF0dGFjaE1lZGlhXCIpLCB0aGlzLl9tZWRpYSAmJiAodGhpcy5sb2dnZXIud2FybihcIm1lZGlhIG11c3QgYmUgZGV0YWNoZWQgYmVmb3JlIGF0dGFjaGluZ1wiKSwgdGhpcy5kZXRhY2hNZWRpYSgpKTtcbiAgICBjb25zdCB0ID0gXCJtZWRpYVwiIGluIGUsIHIgPSB0ID8gZS5tZWRpYSA6IGUsIG4gPSB0ID8gZSA6IHtcbiAgICAgIG1lZGlhOiByXG4gICAgfTtcbiAgICB0aGlzLl9tZWRpYSA9IHIsIHRoaXMudHJpZ2dlcihJLk1FRElBX0FUVEFDSElORywgbik7XG4gIH1cbiAgLyoqXG4gICAqIERldGFjaCBIbHMuanMgZnJvbSB0aGUgbWVkaWFcbiAgICovXG4gIGRldGFjaE1lZGlhKCkge1xuICAgIHRoaXMubG9nZ2VyLmxvZyhcImRldGFjaE1lZGlhXCIpLCB0aGlzLnRyaWdnZXIoSS5NRURJQV9ERVRBQ0hJTkcsIHt9KSwgdGhpcy5fbWVkaWEgPSBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBEZXRhY2ggSFRNTE1lZGlhRWxlbWVudCwgTWVkaWFTb3VyY2UsIGFuZCBTb3VyY2VCdWZmZXJzIHdpdGhvdXQgcmVzZXQsIGZvciBhdHRhY2hpbmcgdG8gYW5vdGhlciBpbnN0YW5jZVxuICAgKi9cbiAgdHJhbnNmZXJNZWRpYSgpIHtcbiAgICB0aGlzLl9tZWRpYSA9IG51bGw7XG4gICAgY29uc3QgZSA9IHRoaXMuYnVmZmVyQ29udHJvbGxlci50cmFuc2Zlck1lZGlhKCk7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlcihJLk1FRElBX0RFVEFDSElORywge1xuICAgICAgdHJhbnNmZXJNZWRpYTogZVxuICAgIH0pLCBlO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIHNvdXJjZSBVUkwuIENhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZS5cbiAgICovXG4gIGxvYWRTb3VyY2UoZSkge1xuICAgIHRoaXMuc3RvcExvYWQoKTtcbiAgICBjb25zdCB0ID0gdGhpcy5tZWRpYSwgciA9IHRoaXMuX3VybCwgbiA9IHRoaXMuX3VybCA9IGh1LmJ1aWxkQWJzb2x1dGVVUkwoc2VsZi5sb2NhdGlvbi5ocmVmLCBlLCB7XG4gICAgICBhbHdheXNOb3JtYWxpemU6ICEwXG4gICAgfSk7XG4gICAgdGhpcy5fYXV0b0xldmVsQ2FwcGluZyA9IC0xLCB0aGlzLl9tYXhIZGNwTGV2ZWwgPSBudWxsLCB0aGlzLmxvZ2dlci5sb2coYGxvYWRTb3VyY2U6JHtufWApLCB0ICYmIHIgJiYgKHIgIT09IG4gfHwgdGhpcy5idWZmZXJDb250cm9sbGVyLmhhc1NvdXJjZVR5cGVzKCkpICYmICh0aGlzLmRldGFjaE1lZGlhKCksIHRoaXMuYXR0YWNoTWVkaWEodCkpLCB0aGlzLnRyaWdnZXIoSS5NQU5JRkVTVF9MT0FESU5HLCB7XG4gICAgICB1cmw6IGVcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudGx5IGxvYWRlZCBVUkxcbiAgICovXG4gIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgZW5vdWdoIGhhcyBiZWVuIGJ1ZmZlcmVkIHRvIHNlZWsgdG8gc3RhcnQgcG9zaXRpb24gb3IgdXNlIGBtZWRpYS5jdXJyZW50VGltZWAgdG8gZGV0ZXJtaW5lIG5leHQgbG9hZCBwb3NpdGlvblxuICAgKi9cbiAgZ2V0IGhhc0Vub3VnaFRvU3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtQ29udHJvbGxlci5oYXNFbm91Z2hUb1N0YXJ0O1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIHN0YXJ0UG9zaXRpb24gc2V0IG9uIHN0YXJ0TG9hZChwb3NpdGlvbikgb3Igb24gYXV0b3N0YXJ0IHdpdGggY29uZmlnLnN0YXJ0UG9zaXRpb25cbiAgICovXG4gIGdldCBzdGFydFBvc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuc3RhcnRQb3NpdGlvblZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBTdGFydCBsb2FkaW5nIGRhdGEgZnJvbSB0aGUgc3RyZWFtIHNvdXJjZS5cbiAgICogRGVwZW5kaW5nIG9uIGRlZmF1bHQgY29uZmlnLCBjbGllbnQgc3RhcnRzIGxvYWRpbmcgYXV0b21hdGljYWxseSB3aGVuIGEgc291cmNlIGlzIHNldC5cbiAgICpcbiAgICogQHBhcmFtIHN0YXJ0UG9zaXRpb24gLSBTZXQgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIHN0cmVhbSBmcm9tLlxuICAgKiBEZWZhdWx0cyB0byAtMSAoTm9uZTogc3RhcnRzIGZyb20gZWFybGllc3QgcG9pbnQpXG4gICAqL1xuICBzdGFydExvYWQoZSA9IC0xLCB0KSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKGBzdGFydExvYWQoJHtlICsgKHQgPyBcIiwgPHNraXAgc2VlayB0byBzdGFydD5cIiA6IFwiXCIpfSlgKSwgdGhpcy5zdGFydGVkID0gITAsIHRoaXMucmVzdW1lQnVmZmVyaW5nKCk7XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5sZW5ndGggJiYgKHRoaXMubmV0d29ya0NvbnRyb2xsZXJzW3JdLnN0YXJ0TG9hZChlLCB0KSwgISghdGhpcy5zdGFydGVkIHx8ICF0aGlzLm5ldHdvcmtDb250cm9sbGVycykpOyByKyspXG4gICAgICA7XG4gIH1cbiAgLyoqXG4gICAqIFN0b3AgbG9hZGluZyBvZiBhbnkgc3RyZWFtIGRhdGEuXG4gICAqL1xuICBzdG9wTG9hZCgpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coXCJzdG9wTG9hZFwiKSwgdGhpcy5zdGFydGVkID0gITE7XG4gICAgZm9yIChsZXQgZSA9IDA7IGUgPCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5sZW5ndGggJiYgKHRoaXMubmV0d29ya0NvbnRyb2xsZXJzW2VdLnN0b3BMb2FkKCksICEodGhpcy5zdGFydGVkIHx8ICF0aGlzLm5ldHdvcmtDb250cm9sbGVycykpOyBlKyspXG4gICAgICA7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBsb2FkaW5nLCB0b2dnbGVkIHdpdGggYHN0YXJ0TG9hZCgpYCBhbmQgYHN0b3BMb2FkKClgLCBpcyBhY3RpdmUgb3Igbm90YC5cbiAgICovXG4gIGdldCBsb2FkaW5nRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydGVkO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHN0YXRlIG9mIGZyYWdtZW50IGxvYWRpbmcgdG9nZ2xlZCBieSBjYWxsaW5nIGBwYXVzZUJ1ZmZlcmluZygpYCBhbmQgYHJlc3VtZUJ1ZmZlcmluZygpYC5cbiAgICovXG4gIGdldCBidWZmZXJpbmdFbmFibGVkKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuYnVmZmVyaW5nRW5hYmxlZDtcbiAgfVxuICAvKipcbiAgICogUmVzdW1lcyBzdHJlYW0gY29udHJvbGxlciBzZWdtZW50IGxvYWRpbmcgYWZ0ZXIgYHBhdXNlQnVmZmVyaW5nYCBoYXMgYmVlbiBjYWxsZWQuXG4gICAqL1xuICByZXN1bWVCdWZmZXJpbmcoKSB7XG4gICAgdGhpcy5idWZmZXJpbmdFbmFibGVkIHx8ICh0aGlzLmxvZ2dlci5sb2coXCJyZXN1bWUgYnVmZmVyaW5nXCIpLCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICBlLnJlc3VtZUJ1ZmZlcmluZyAmJiBlLnJlc3VtZUJ1ZmZlcmluZygpO1xuICAgIH0pKTtcbiAgfVxuICAvKipcbiAgICogUHJldmVudHMgc3RyZWFtIGNvbnRyb2xsZXIgZnJvbSBsb2FkaW5nIG5ldyBzZWdtZW50cyB1bnRpbCBgcmVzdW1lQnVmZmVyaW5nYCBpcyBjYWxsZWQuXG4gICAqIFRoaXMgYWxsb3dzIGZvciBtZWRpYSBidWZmZXJpbmcgdG8gYmUgcGF1c2VkIHdpdGhvdXQgaW50ZXJ1cHRpbmcgcGxheWxpc3QgbG9hZGluZy5cbiAgICovXG4gIHBhdXNlQnVmZmVyaW5nKCkge1xuICAgIHRoaXMuYnVmZmVyaW5nRW5hYmxlZCAmJiAodGhpcy5sb2dnZXIubG9nKFwicGF1c2UgYnVmZmVyaW5nXCIpLCB0aGlzLm5ldHdvcmtDb250cm9sbGVycy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICBlLnBhdXNlQnVmZmVyaW5nICYmIGUucGF1c2VCdWZmZXJpbmcoKTtcbiAgICB9KSk7XG4gIH1cbiAgZ2V0IGluRmxpZ2h0RnJhZ21lbnRzKCkge1xuICAgIGNvbnN0IGUgPSB7XG4gICAgICBbcGUuTUFJTl06IHRoaXMuc3RyZWFtQ29udHJvbGxlci5pbkZsaWdodEZyYWdcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmF1ZGlvU3RyZWFtQ29udHJvbGxlciAmJiAoZVtwZS5BVURJT10gPSB0aGlzLmF1ZGlvU3RyZWFtQ29udHJvbGxlci5pbkZsaWdodEZyYWcpLCB0aGlzLnN1YnRpdGl0bGVTdHJlYW1Db250cm9sbGVyICYmIChlW3BlLlNVQlRJVExFXSA9IHRoaXMuc3VidGl0aXRsZVN0cmVhbUNvbnRyb2xsZXIuaW5GbGlnaHRGcmFnKSwgZTtcbiAgfVxuICAvKipcbiAgICogU3dhcCB0aHJvdWdoIHBvc3NpYmxlIGF1ZGlvIGNvZGVjcyBpbiB0aGUgc3RyZWFtIChmb3IgZXhhbXBsZSB0byBzd2l0Y2ggZnJvbSBzdGVyZW8gdG8gNS4xKVxuICAgKi9cbiAgc3dhcEF1ZGlvQ29kZWMoKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKFwic3dhcEF1ZGlvQ29kZWNcIiksIHRoaXMuc3RyZWFtQ29udHJvbGxlci5zd2FwQXVkaW9Db2RlYygpO1xuICB9XG4gIC8qKlxuICAgKiBXaGVuIHRoZSBtZWRpYS1lbGVtZW50IGZhaWxzLCB0aGlzIGFsbG93cyB0byBkZXRhY2ggYW5kIHRoZW4gcmUtYXR0YWNoIGl0XG4gICAqIGFzIG9uZSBjYWxsIChjb252ZW5pZW5jZSBtZXRob2QpLlxuICAgKlxuICAgKiBBdXRvbWF0aWMgcmVjb3Zlcnkgb2YgbWVkaWEtZXJyb3JzIGJ5IHRoaXMgcHJvY2VzcyBpcyBjb25maWd1cmFibGUuXG4gICAqL1xuICByZWNvdmVyTWVkaWFFcnJvcigpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coXCJyZWNvdmVyTWVkaWFFcnJvclwiKTtcbiAgICBjb25zdCBlID0gdGhpcy5fbWVkaWEsIHQgPSBlID09IG51bGwgPyB2b2lkIDAgOiBlLmN1cnJlbnRUaW1lO1xuICAgIHRoaXMuZGV0YWNoTWVkaWEoKSwgZSAmJiAodGhpcy5hdHRhY2hNZWRpYShlKSwgdCAmJiB0aGlzLnN0YXJ0TG9hZCh0KSk7XG4gIH1cbiAgcmVtb3ZlTGV2ZWwoZSkge1xuICAgIHRoaXMubGV2ZWxDb250cm9sbGVyLnJlbW92ZUxldmVsKGUpO1xuICB9XG4gIC8qKlxuICAgKiBAcmV0dXJucyBhIFVVSUQgZm9yIHRoaXMgcGxheWVyIGluc3RhbmNlXG4gICAqL1xuICBnZXQgc2Vzc2lvbklkKCkge1xuICAgIGxldCBlID0gdGhpcy5fc2Vzc2lvbklkO1xuICAgIHJldHVybiBlIHx8IChlID0gdGhpcy5fc2Vzc2lvbklkID0gZncoKSksIGU7XG4gIH1cbiAgLyoqXG4gICAqIEByZXR1cm5zIGFuIGFycmF5IG9mIGxldmVscyAodmFyaWFudHMpIHNvcnRlZCBieSBIRENQLUxFVkVMLCBSRVNPTFVUSU9OIChoZWlnaHQpLCBGUkFNRS1SQVRFLCBDT0RFQ1MsIFZJREVPLVJBTkdFLCBhbmQgQkFORFdJRFRIXG4gICAqL1xuICBnZXQgbGV2ZWxzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmxldmVsQ29udHJvbGxlci5sZXZlbHM7XG4gICAgcmV0dXJuIGUgfHwgW107XG4gIH1cbiAgLyoqXG4gICAqIEByZXR1cm5zIExldmVsRGV0YWlscyBvZiBsYXN0IGxvYWRlZCBsZXZlbCAodmFyaWFudCkgb3IgYG51bGxgIHByaW9yIHRvIGxvYWRpbmcgYSBtZWRpYSBwbGF5bGlzdC5cbiAgICovXG4gIGdldCBsYXRlc3RMZXZlbERldGFpbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RyZWFtQ29udHJvbGxlci5nZXRMZXZlbERldGFpbHMoKSB8fCBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBAcmV0dXJucyBMZXZlbCBvYmplY3Qgb2Ygc2VsZWN0ZWQgbGV2ZWwgKHZhcmlhbnQpIG9yIGBudWxsYCBwcmlvciB0byBzZWxlY3RpbmcgYSBsZXZlbCBvciBvbmNlIHRoZSBsZXZlbCBpcyByZW1vdmVkLlxuICAgKi9cbiAgZ2V0IGxvYWRMZXZlbE9iaigpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubG9hZExldmVsT2JqO1xuICB9XG4gIC8qKlxuICAgKiBJbmRleCBvZiBxdWFsaXR5IGxldmVsICh2YXJpYW50KSBjdXJyZW50bHkgcGxheWVkXG4gICAqL1xuICBnZXQgY3VycmVudExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuY3VycmVudExldmVsO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgcXVhbGl0eSBsZXZlbCBpbmRleCBpbW1lZGlhdGVseS4gVGhpcyB3aWxsIGZsdXNoIHRoZSBjdXJyZW50IGJ1ZmZlciB0byByZXBsYWNlIHRoZSBxdWFsaXR5IGFzYXAuIFRoYXQgbWVhbnMgcGxheWJhY2sgd2lsbCBpbnRlcnJ1cHQgYXQgbGVhc3Qgc2hvcnRseSB0byByZS1idWZmZXIgYW5kIHJlLXN5bmMgZXZlbnR1YWxseS4gU2V0IHRvIC0xIGZvciBhdXRvbWF0aWMgbGV2ZWwgc2VsZWN0aW9uLlxuICAgKi9cbiAgc2V0IGN1cnJlbnRMZXZlbChlKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKGBzZXQgY3VycmVudExldmVsOiR7ZX1gKSwgdGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWwgPSBlLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuaW1tZWRpYXRlTGV2ZWxTd2l0Y2goKTtcbiAgfVxuICAvKipcbiAgICogSW5kZXggb2YgbmV4dCBxdWFsaXR5IGxldmVsIGxvYWRlZCBhcyBzY2hlZHVsZWQgYnkgc3RyZWFtIGNvbnRyb2xsZXIuXG4gICAqL1xuICBnZXQgbmV4dExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIubmV4dExldmVsO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgcXVhbGl0eSBsZXZlbCBpbmRleCBmb3IgbmV4dCBsb2FkZWQgZGF0YS5cbiAgICogVGhpcyB3aWxsIHN3aXRjaCB0aGUgdmlkZW8gcXVhbGl0eSBhc2FwLCB3aXRob3V0IGludGVycnVwdGluZyBwbGF5YmFjay5cbiAgICogTWF5IGFib3J0IGN1cnJlbnQgbG9hZGluZyBvZiBkYXRhLCBhbmQgZmx1c2ggcGFydHMgb2YgYnVmZmVyIChvdXRzaWRlIGN1cnJlbnRseSBwbGF5ZWQgZnJhZ21lbnQgcmVnaW9uKS5cbiAgICogQHBhcmFtIG5ld0xldmVsIC0gUGFzcyAtMSBmb3IgYXV0b21hdGljIGxldmVsIHNlbGVjdGlvblxuICAgKi9cbiAgc2V0IG5leHRMZXZlbChlKSB7XG4gICAgdGhpcy5sb2dnZXIubG9nKGBzZXQgbmV4dExldmVsOiR7ZX1gKSwgdGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWwgPSBlLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIubmV4dExldmVsU3dpdGNoKCk7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcXVhbGl0eSBsZXZlbCBvZiB0aGUgY3VycmVudGx5IG9yIGxhc3QgKG9mIG5vbmUgaXMgbG9hZGVkIGN1cnJlbnRseSkgc2VnbWVudFxuICAgKi9cbiAgZ2V0IGxvYWRMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubGV2ZWw7XG4gIH1cbiAgLyoqXG4gICAqIFNldCBxdWFsaXR5IGxldmVsIGluZGV4IGZvciBuZXh0IGxvYWRlZCBkYXRhIGluIGEgY29uc2VydmF0aXZlIHdheS5cbiAgICogVGhpcyB3aWxsIHN3aXRjaCB0aGUgcXVhbGl0eSB3aXRob3V0IGZsdXNoaW5nLCBidXQgaW50ZXJydXB0IGN1cnJlbnQgbG9hZGluZy5cbiAgICogVGh1cyB0aGUgbW9tZW50IHdoZW4gdGhlIHF1YWxpdHkgc3dpdGNoIHdpbGwgYXBwZWFyIGluIGVmZmVjdCB3aWxsIG9ubHkgYmUgYWZ0ZXIgdGhlIGFscmVhZHkgZXhpc3RpbmcgYnVmZmVyLlxuICAgKiBAcGFyYW0gbmV3TGV2ZWwgLSBQYXNzIC0xIGZvciBhdXRvbWF0aWMgbGV2ZWwgc2VsZWN0aW9uXG4gICAqL1xuICBzZXQgbG9hZExldmVsKGUpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coYHNldCBsb2FkTGV2ZWw6JHtlfWApLCB0aGlzLmxldmVsQ29udHJvbGxlci5tYW51YWxMZXZlbCA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIGdldCBuZXh0IHF1YWxpdHkgbGV2ZWwgbG9hZGVkXG4gICAqL1xuICBnZXQgbmV4dExvYWRMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubmV4dExvYWRMZXZlbDtcbiAgfVxuICAvKipcbiAgICogU2V0IHF1YWxpdHkgbGV2ZWwgb2YgbmV4dCBsb2FkZWQgc2VnbWVudCBpbiBhIGZ1bGx5IFwibm9uLWRlc3RydWN0aXZlXCIgd2F5LlxuICAgKiBTYW1lIGFzIGBsb2FkTGV2ZWxgIGJ1dCB3aWxsIHdhaXQgZm9yIG5leHQgc3dpdGNoICh1bnRpbCBjdXJyZW50IGxvYWRpbmcgaXMgZG9uZSkuXG4gICAqL1xuICBzZXQgbmV4dExvYWRMZXZlbChlKSB7XG4gICAgdGhpcy5sZXZlbENvbnRyb2xsZXIubmV4dExvYWRMZXZlbCA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIFJldHVybiBcImZpcnN0IGxldmVsXCI6IGxpa2UgYSBkZWZhdWx0IGxldmVsLCBpZiBub3Qgc2V0LFxuICAgKiBmYWxscyBiYWNrIHRvIGluZGV4IG9mIGZpcnN0IGxldmVsIHJlZmVyZW5jZWQgaW4gbWFuaWZlc3RcbiAgICovXG4gIGdldCBmaXJzdExldmVsKCkge1xuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLmxldmVsQ29udHJvbGxlci5maXJzdExldmVsLCB0aGlzLm1pbkF1dG9MZXZlbCk7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgXCJmaXJzdC1sZXZlbFwiLCBzZWUgZ2V0dGVyLlxuICAgKi9cbiAgc2V0IGZpcnN0TGV2ZWwoZSkge1xuICAgIHRoaXMubG9nZ2VyLmxvZyhgc2V0IGZpcnN0TGV2ZWw6JHtlfWApLCB0aGlzLmxldmVsQ29udHJvbGxlci5maXJzdExldmVsID0gZTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJuIHRoZSBkZXNpcmVkIHN0YXJ0IGxldmVsIGZvciB0aGUgZmlyc3QgZnJhZ21lbnQgdGhhdCB3aWxsIGJlIGxvYWRlZC5cbiAgICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgLTEgaW5kaWNhdGVzIGF1dG9tYXRpYyBzdGFydCBsZXZlbCBzZWxlY3Rpb24uXG4gICAqIFNldHRpbmcgaGxzLm5leHRBdXRvTGV2ZWwgd2l0aG91dCBzZXR0aW5nIGEgc3RhcnRMZXZlbCB3aWxsIHJlc3VsdCBpblxuICAgKiB0aGUgbmV4dEF1dG9MZXZlbCB2YWx1ZSBiZWluZyB1c2VkIGZvciBvbmUgZnJhZ21lbnQgbG9hZC5cbiAgICovXG4gIGdldCBzdGFydExldmVsKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmxldmVsQ29udHJvbGxlci5zdGFydExldmVsO1xuICAgIHJldHVybiBlID09PSAtMSAmJiB0aGlzLmFickNvbnRyb2xsZXIuZm9yY2VkQXV0b0xldmVsID4gLTEgPyB0aGlzLmFickNvbnRyb2xsZXIuZm9yY2VkQXV0b0xldmVsIDogZTtcbiAgfVxuICAvKipcbiAgICogc2V0ICBzdGFydCBsZXZlbCAobGV2ZWwgb2YgZmlyc3QgZnJhZ21lbnQgdGhhdCB3aWxsIGJlIHBsYXllZCBiYWNrKVxuICAgKiBpZiBub3Qgb3ZlcnJpZGVkIGJ5IHVzZXIsIGZpcnN0IGxldmVsIGFwcGVhcmluZyBpbiBtYW5pZmVzdCB3aWxsIGJlIHVzZWQgYXMgc3RhcnQgbGV2ZWxcbiAgICogaWYgLTEgOiBhdXRvbWF0aWMgc3RhcnQgbGV2ZWwgc2VsZWN0aW9uLCBwbGF5YmFjayB3aWxsIHN0YXJ0IGZyb20gbGV2ZWwgbWF0Y2hpbmcgZG93bmxvYWQgYmFuZHdpZHRoXG4gICAqIChkZXRlcm1pbmVkIGZyb20gZG93bmxvYWQgb2YgZmlyc3Qgc2VnbWVudClcbiAgICovXG4gIHNldCBzdGFydExldmVsKGUpIHtcbiAgICB0aGlzLmxvZ2dlci5sb2coYHNldCBzdGFydExldmVsOiR7ZX1gKSwgZSAhPT0gLTEgJiYgKGUgPSBNYXRoLm1heChlLCB0aGlzLm1pbkF1dG9MZXZlbCkpLCB0aGlzLmxldmVsQ29udHJvbGxlci5zdGFydExldmVsID0gZTtcbiAgfVxuICAvKipcbiAgICogV2hldGhlciBsZXZlbCBjYXBwaW5nIGlzIGVuYWJsZWQuXG4gICAqIERlZmF1bHQgdmFsdWUgaXMgc2V0IHZpYSBgY29uZmlnLmNhcExldmVsVG9QbGF5ZXJTaXplYC5cbiAgICovXG4gIGdldCBjYXBMZXZlbFRvUGxheWVyU2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcuY2FwTGV2ZWxUb1BsYXllclNpemU7XG4gIH1cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgbGV2ZWwgY2FwcGluZy4gSWYgZGlzYWJsZWQgYWZ0ZXIgcHJldmlvdXNseSBlbmFibGVkLCBgbmV4dExldmVsU3dpdGNoYCB3aWxsIGJlIGltbWVkaWF0ZWx5IGNhbGxlZC5cbiAgICovXG4gIHNldCBjYXBMZXZlbFRvUGxheWVyU2l6ZShlKSB7XG4gICAgY29uc3QgdCA9ICEhZTtcbiAgICB0ICE9PSB0aGlzLmNvbmZpZy5jYXBMZXZlbFRvUGxheWVyU2l6ZSAmJiAodCA/IHRoaXMuY2FwTGV2ZWxDb250cm9sbGVyLnN0YXJ0Q2FwcGluZygpIDogKHRoaXMuY2FwTGV2ZWxDb250cm9sbGVyLnN0b3BDYXBwaW5nKCksIHRoaXMuYXV0b0xldmVsQ2FwcGluZyA9IC0xLCB0aGlzLnN0cmVhbUNvbnRyb2xsZXIubmV4dExldmVsU3dpdGNoKCkpLCB0aGlzLmNvbmZpZy5jYXBMZXZlbFRvUGxheWVyU2l6ZSA9IHQpO1xuICB9XG4gIC8qKlxuICAgKiBDYXBwaW5nL21heCBsZXZlbCB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IGF1dG9tYXRpYyBsZXZlbCBzZWxlY3Rpb24gYWxnb3JpdGhtIChgQUJSQ29udHJvbGxlcmApXG4gICAqL1xuICBnZXQgYXV0b0xldmVsQ2FwcGluZygpIHtcbiAgICByZXR1cm4gdGhpcy5fYXV0b0xldmVsQ2FwcGluZztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBiYW5kd2lkdGggZXN0aW1hdGUgaW4gYml0cyBwZXIgc2Vjb25kLCB3aGVuIGF2YWlsYWJsZS4gT3RoZXJ3aXNlLCBgTmFOYCBpcyByZXR1cm5lZC5cbiAgICovXG4gIGdldCBiYW5kd2lkdGhFc3RpbWF0ZSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBid0VzdGltYXRvcjogZVxuICAgIH0gPSB0aGlzLmFickNvbnRyb2xsZXI7XG4gICAgcmV0dXJuIGUgPyBlLmdldEVzdGltYXRlKCkgOiBOYU47XG4gIH1cbiAgc2V0IGJhbmR3aWR0aEVzdGltYXRlKGUpIHtcbiAgICB0aGlzLmFickNvbnRyb2xsZXIucmVzZXRFc3RpbWF0b3IoZSk7XG4gIH1cbiAgZ2V0IGFickV3bWFEZWZhdWx0RXN0aW1hdGUoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYndFc3RpbWF0b3I6IGVcbiAgICB9ID0gdGhpcy5hYnJDb250cm9sbGVyO1xuICAgIHJldHVybiBlID8gZS5kZWZhdWx0RXN0aW1hdGUgOiBOYU47XG4gIH1cbiAgLyoqXG4gICAqIGdldCB0aW1lIHRvIGZpcnN0IGJ5dGUgZXN0aW1hdGVcbiAgICogQHR5cGUge251bWJlcn1cbiAgICovXG4gIGdldCB0dGZiRXN0aW1hdGUoKSB7XG4gICAgY29uc3Qge1xuICAgICAgYndFc3RpbWF0b3I6IGVcbiAgICB9ID0gdGhpcy5hYnJDb250cm9sbGVyO1xuICAgIHJldHVybiBlID8gZS5nZXRFc3RpbWF0ZVRURkIoKSA6IE5hTjtcbiAgfVxuICAvKipcbiAgICogQ2FwcGluZy9tYXggbGV2ZWwgdmFsdWUgdGhhdCBzaG91bGQgYmUgdXNlZCBieSBhdXRvbWF0aWMgbGV2ZWwgc2VsZWN0aW9uIGFsZ29yaXRobSAoYEFCUkNvbnRyb2xsZXJgKVxuICAgKi9cbiAgc2V0IGF1dG9MZXZlbENhcHBpbmcoZSkge1xuICAgIHRoaXMuX2F1dG9MZXZlbENhcHBpbmcgIT09IGUgJiYgKHRoaXMubG9nZ2VyLmxvZyhgc2V0IGF1dG9MZXZlbENhcHBpbmc6JHtlfWApLCB0aGlzLl9hdXRvTGV2ZWxDYXBwaW5nID0gZSwgdGhpcy5sZXZlbENvbnRyb2xsZXIuY2hlY2tNYXhBdXRvVXBkYXRlZCgpKTtcbiAgfVxuICBnZXQgbWF4SGRjcExldmVsKCkge1xuICAgIHJldHVybiB0aGlzLl9tYXhIZGNwTGV2ZWw7XG4gIH1cbiAgc2V0IG1heEhkY3BMZXZlbChlKSB7XG4gICAgYWIoZSkgJiYgdGhpcy5fbWF4SGRjcExldmVsICE9PSBlICYmICh0aGlzLl9tYXhIZGNwTGV2ZWwgPSBlLCB0aGlzLmxldmVsQ29udHJvbGxlci5jaGVja01heEF1dG9VcGRhdGVkKCkpO1xuICB9XG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gYXV0b21hdGljIGxldmVsIHNlbGVjdGlvbiBlbmFibGVkXG4gICAqL1xuICBnZXQgYXV0b0xldmVsRW5hYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWwgPT09IC0xO1xuICB9XG4gIC8qKlxuICAgKiBMZXZlbCBzZXQgbWFudWFsbHkgKGlmIGFueSlcbiAgICovXG4gIGdldCBtYW51YWxMZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIubWFudWFsTGV2ZWw7XG4gIH1cbiAgLyoqXG4gICAqIG1pbiBsZXZlbCBzZWxlY3RhYmxlIGluIGF1dG8gbW9kZSBhY2NvcmRpbmcgdG8gY29uZmlnLm1pbkF1dG9CaXRyYXRlXG4gICAqL1xuICBnZXQgbWluQXV0b0xldmVsKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICBtaW5BdXRvQml0cmF0ZTogdFxuICAgICAgfVxuICAgIH0gPSB0aGlzO1xuICAgIGlmICghZSkgcmV0dXJuIDA7XG4gICAgY29uc3QgciA9IGUubGVuZ3RoO1xuICAgIGZvciAobGV0IG4gPSAwOyBuIDwgcjsgbisrKVxuICAgICAgaWYgKGVbbl0ubWF4Qml0cmF0ZSA+PSB0KVxuICAgICAgICByZXR1cm4gbjtcbiAgICByZXR1cm4gMDtcbiAgfVxuICAvKipcbiAgICogbWF4IGxldmVsIHNlbGVjdGFibGUgaW4gYXV0byBtb2RlIGFjY29yZGluZyB0byBhdXRvTGV2ZWxDYXBwaW5nXG4gICAqL1xuICBnZXQgbWF4QXV0b0xldmVsKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxldmVsczogZSxcbiAgICAgIGF1dG9MZXZlbENhcHBpbmc6IHQsXG4gICAgICBtYXhIZGNwTGV2ZWw6IHJcbiAgICB9ID0gdGhpcztcbiAgICBsZXQgbjtcbiAgICBpZiAodCA9PT0gLTEgJiYgZSAhPSBudWxsICYmIGUubGVuZ3RoID8gbiA9IGUubGVuZ3RoIC0gMSA6IG4gPSB0LCByKVxuICAgICAgZm9yIChsZXQgaSA9IG47IGktLTsgKSB7XG4gICAgICAgIGNvbnN0IG8gPSBlW2ldLmF0dHJzW1wiSERDUC1MRVZFTFwiXTtcbiAgICAgICAgaWYgKG8gJiYgbyA8PSByKVxuICAgICAgICAgIHJldHVybiBpO1xuICAgICAgfVxuICAgIHJldHVybiBuO1xuICB9XG4gIGdldCBmaXJzdEF1dG9MZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5hYnJDb250cm9sbGVyLmZpcnN0QXV0b0xldmVsO1xuICB9XG4gIC8qKlxuICAgKiBuZXh0IGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgcXVhbGl0eSBsZXZlbFxuICAgKi9cbiAgZ2V0IG5leHRBdXRvTGV2ZWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWJyQ29udHJvbGxlci5uZXh0QXV0b0xldmVsO1xuICB9XG4gIC8qKlxuICAgKiB0aGlzIHNldHRlciBpcyB1c2VkIHRvIGZvcmNlIG5leHQgYXV0byBsZXZlbC5cbiAgICogdGhpcyBpcyB1c2VmdWwgdG8gZm9yY2UgYSBzd2l0Y2ggZG93biBpbiBhdXRvIG1vZGU6XG4gICAqIGluIGNhc2Ugb2YgbG9hZCBlcnJvciBvbiBsZXZlbCBOLCBobHMuanMgY2FuIHNldCBuZXh0QXV0b0xldmVsIHRvIE4tMSBmb3IgZXhhbXBsZSlcbiAgICogZm9yY2VkIHZhbHVlIGlzIHZhbGlkIGZvciBvbmUgZnJhZ21lbnQuIHVwb24gc3VjY2Vzc2Z1bCBmcmFnIGxvYWRpbmcgYXQgZm9yY2VkIGxldmVsLFxuICAgKiB0aGlzIHZhbHVlIHdpbGwgYmUgcmVzZXR0ZWQgdG8gLTEgYnkgQUJSIGNvbnRyb2xsZXIuXG4gICAqL1xuICBzZXQgbmV4dEF1dG9MZXZlbChlKSB7XG4gICAgdGhpcy5hYnJDb250cm9sbGVyLm5leHRBdXRvTGV2ZWwgPSBlO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgdGhlIGRhdGV0aW1lIHZhbHVlIHJlbGF0aXZlIHRvIG1lZGlhLmN1cnJlbnRUaW1lIGZvciB0aGUgYWN0aXZlIGxldmVsIFByb2dyYW0gRGF0ZSBUaW1lIGlmIHByZXNlbnRcbiAgICovXG4gIGdldCBwbGF5aW5nRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyLmN1cnJlbnRQcm9ncmFtRGF0ZVRpbWU7XG4gIH1cbiAgZ2V0IG1haW5Gb3J3YXJkQnVmZmVySW5mbygpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyLmdldE1haW5Gd2RCdWZmZXJJbmZvKCk7XG4gIH1cbiAgZ2V0IG1heEJ1ZmZlckxlbmd0aCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdHJlYW1Db250cm9sbGVyLm1heEJ1ZmZlckxlbmd0aDtcbiAgfVxuICAvKipcbiAgICogRmluZCBhbmQgc2VsZWN0IHRoZSBiZXN0IG1hdGNoaW5nIGF1ZGlvIHRyYWNrLCBtYWtpbmcgYSBsZXZlbCBzd2l0Y2ggd2hlbiBhIEdyb3VwIGNoYW5nZSBpcyBuZWNlc3NhcnkuXG4gICAqIFVwZGF0ZXMgYGhscy5jb25maWcuYXVkaW9QcmVmZXJlbmNlYC4gUmV0dXJucyB0aGUgc2VsZWN0ZWQgdHJhY2ssIG9yIG51bGwgd2hlbiBubyBtYXRjaGluZyB0cmFjayBpcyBmb3VuZC5cbiAgICovXG4gIHNldEF1ZGlvT3B0aW9uKGUpIHtcbiAgICB2YXIgdDtcbiAgICByZXR1cm4gKCh0ID0gdGhpcy5hdWRpb1RyYWNrQ29udHJvbGxlcikgPT0gbnVsbCA/IHZvaWQgMCA6IHQuc2V0QXVkaW9PcHRpb24oZSkpIHx8IG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIEZpbmQgYW5kIHNlbGVjdCB0aGUgYmVzdCBtYXRjaGluZyBzdWJ0aXRsZSB0cmFjaywgbWFraW5nIGEgbGV2ZWwgc3dpdGNoIHdoZW4gYSBHcm91cCBjaGFuZ2UgaXMgbmVjZXNzYXJ5LlxuICAgKiBVcGRhdGVzIGBobHMuY29uZmlnLnN1YnRpdGxlUHJlZmVyZW5jZWAuIFJldHVybnMgdGhlIHNlbGVjdGVkIHRyYWNrLCBvciBudWxsIHdoZW4gbm8gbWF0Y2hpbmcgdHJhY2sgaXMgZm91bmQuXG4gICAqL1xuICBzZXRTdWJ0aXRsZU9wdGlvbihlKSB7XG4gICAgdmFyIHQ7XG4gICAgcmV0dXJuICgodCA9IHRoaXMuc3VidGl0bGVUcmFja0NvbnRyb2xsZXIpID09IG51bGwgPyB2b2lkIDAgOiB0LnNldFN1YnRpdGxlT3B0aW9uKGUpKSB8fCBudWxsO1xuICB9XG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXVkaW8gdHJhY2tzIGFjcm9zcyBhbGwgbWVkaWEgZ3JvdXBzXG4gICAqL1xuICBnZXQgYWxsQXVkaW9UcmFja3MoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXI7XG4gICAgcmV0dXJuIGUgPyBlLmFsbEF1ZGlvVHJhY2tzIDogW107XG4gIH1cbiAgLyoqXG4gICAqIEdldCB0aGUgbGlzdCBvZiBzZWxlY3RhYmxlIGF1ZGlvIHRyYWNrc1xuICAgKi9cbiAgZ2V0IGF1ZGlvVHJhY2tzKCkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmF1ZGlvVHJhY2tDb250cm9sbGVyO1xuICAgIHJldHVybiBlID8gZS5hdWRpb1RyYWNrcyA6IFtdO1xuICB9XG4gIC8qKlxuICAgKiBpbmRleCBvZiB0aGUgc2VsZWN0ZWQgYXVkaW8gdHJhY2sgKGluZGV4IGluIGF1ZGlvIHRyYWNrIGxpc3RzKVxuICAgKi9cbiAgZ2V0IGF1ZGlvVHJhY2soKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXI7XG4gICAgcmV0dXJuIGUgPyBlLmF1ZGlvVHJhY2sgOiAtMTtcbiAgfVxuICAvKipcbiAgICogc2VsZWN0cyBhbiBhdWRpbyB0cmFjaywgYmFzZWQgb24gaXRzIGluZGV4IGluIGF1ZGlvIHRyYWNrIGxpc3RzXG4gICAqL1xuICBzZXQgYXVkaW9UcmFjayhlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuYXVkaW9UcmFja0NvbnRyb2xsZXI7XG4gICAgdCAmJiAodC5hdWRpb1RyYWNrID0gZSk7XG4gIH1cbiAgLyoqXG4gICAqIGdldCB0aGUgY29tcGxldGUgbGlzdCBvZiBzdWJ0aXRsZSB0cmFja3MgYWNyb3NzIGFsbCBtZWRpYSBncm91cHNcbiAgICovXG4gIGdldCBhbGxTdWJ0aXRsZVRyYWNrcygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjtcbiAgICByZXR1cm4gZSA/IGUuYWxsU3VidGl0bGVUcmFja3MgOiBbXTtcbiAgfVxuICAvKipcbiAgICogZ2V0IGFsdGVybmF0ZSBzdWJ0aXRsZSB0cmFja3MgbGlzdCBmcm9tIHBsYXlsaXN0XG4gICAqL1xuICBnZXQgc3VidGl0bGVUcmFja3MoKSB7XG4gICAgY29uc3QgZSA9IHRoaXMuc3VidGl0bGVUcmFja0NvbnRyb2xsZXI7XG4gICAgcmV0dXJuIGUgPyBlLnN1YnRpdGxlVHJhY2tzIDogW107XG4gIH1cbiAgLyoqXG4gICAqIGluZGV4IG9mIHRoZSBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjayAoaW5kZXggaW4gc3VidGl0bGUgdHJhY2sgbGlzdHMpXG4gICAqL1xuICBnZXQgc3VidGl0bGVUcmFjaygpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjtcbiAgICByZXR1cm4gZSA/IGUuc3VidGl0bGVUcmFjayA6IC0xO1xuICB9XG4gIGdldCBtZWRpYSgpIHtcbiAgICByZXR1cm4gdGhpcy5fbWVkaWE7XG4gIH1cbiAgLyoqXG4gICAqIHNlbGVjdCBhbiBzdWJ0aXRsZSB0cmFjaywgYmFzZWQgb24gaXRzIGluZGV4IGluIHN1YnRpdGxlIHRyYWNrIGxpc3RzXG4gICAqL1xuICBzZXQgc3VidGl0bGVUcmFjayhlKSB7XG4gICAgY29uc3QgdCA9IHRoaXMuc3VidGl0bGVUcmFja0NvbnRyb2xsZXI7XG4gICAgdCAmJiAodC5zdWJ0aXRsZVRyYWNrID0gZSk7XG4gIH1cbiAgLyoqXG4gICAqIFdoZXRoZXIgc3VidGl0bGUgZGlzcGxheSBpcyBlbmFibGVkIG9yIG5vdFxuICAgKi9cbiAgZ2V0IHN1YnRpdGxlRGlzcGxheSgpIHtcbiAgICBjb25zdCBlID0gdGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjtcbiAgICByZXR1cm4gZSA/IGUuc3VidGl0bGVEaXNwbGF5IDogITE7XG4gIH1cbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIHN1YnRpdGxlIGRpc3BsYXkgcmVuZGVyaW5nXG4gICAqL1xuICBzZXQgc3VidGl0bGVEaXNwbGF5KGUpIHtcbiAgICBjb25zdCB0ID0gdGhpcy5zdWJ0aXRsZVRyYWNrQ29udHJvbGxlcjtcbiAgICB0ICYmICh0LnN1YnRpdGxlRGlzcGxheSA9IGUpO1xuICB9XG4gIC8qKlxuICAgKiBnZXQgbW9kZSBmb3IgTG93LUxhdGVuY3kgSExTIGxvYWRpbmdcbiAgICovXG4gIGdldCBsb3dMYXRlbmN5TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcubG93TGF0ZW5jeU1vZGU7XG4gIH1cbiAgLyoqXG4gICAqIEVuYWJsZS9kaXNhYmxlIExvdy1MYXRlbmN5IEhMUyBwYXJ0IHBsYXlsaXN0IGFuZCBzZWdtZW50IGxvYWRpbmcsIGFuZCBzdGFydCBsaXZlIHN0cmVhbXMgYXQgcGxheWxpc3QgUEFSVC1IT0xELUJBQ0sgcmF0aGVyIHRoYW4gSE9MRC1CQUNLLlxuICAgKi9cbiAgc2V0IGxvd0xhdGVuY3lNb2RlKGUpIHtcbiAgICB0aGlzLmNvbmZpZy5sb3dMYXRlbmN5TW9kZSA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIFBvc2l0aW9uIChpbiBzZWNvbmRzKSBvZiBsaXZlIHN5bmMgcG9pbnQgKGllIGVkZ2Ugb2YgbGl2ZSBwb3NpdGlvbiBtaW51cyBzYWZldHkgZGVsYXkgZGVmaW5lZCBieSBgYGBobHMuY29uZmlnLmxpdmVTeW5jRHVyYXRpb25gYGApXG4gICAqIEByZXR1cm5zIG51bGwgcHJpb3IgdG8gbG9hZGluZyBsaXZlIFBsYXlsaXN0XG4gICAqL1xuICBnZXQgbGl2ZVN5bmNQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5sYXRlbmN5Q29udHJvbGxlci5saXZlU3luY1Bvc2l0aW9uO1xuICB9XG4gIC8qKlxuICAgKiBFc3RpbWF0ZWQgcG9zaXRpb24gKGluIHNlY29uZHMpIG9mIGxpdmUgZWRnZSAoaWUgZWRnZSBvZiBsaXZlIHBsYXlsaXN0IHBsdXMgdGltZSBzeW5jIHBsYXlsaXN0IGFkdmFuY2VkKVxuICAgKiBAcmV0dXJucyAwIGJlZm9yZSBmaXJzdCBwbGF5bGlzdCBpcyBsb2FkZWRcbiAgICovXG4gIGdldCBsYXRlbmN5KCkge1xuICAgIHJldHVybiB0aGlzLmxhdGVuY3lDb250cm9sbGVyLmxhdGVuY3k7XG4gIH1cbiAgLyoqXG4gICAqIG1heGltdW0gZGlzdGFuY2UgZnJvbSB0aGUgZWRnZSBiZWZvcmUgdGhlIHBsYXllciBzZWVrcyBmb3J3YXJkIHRvIGBgYGhscy5saXZlU3luY1Bvc2l0aW9uYGBgXG4gICAqIGNvbmZpZ3VyZWQgdXNpbmcgYGBgbGl2ZU1heExhdGVuY3lEdXJhdGlvbkNvdW50YGBgIChtdWx0aXBsZSBvZiB0YXJnZXQgZHVyYXRpb24pIG9yIGBgYGxpdmVNYXhMYXRlbmN5RHVyYXRpb25gYGBcbiAgICogQHJldHVybnMgMCBiZWZvcmUgZmlyc3QgcGxheWxpc3QgaXMgbG9hZGVkXG4gICAqL1xuICBnZXQgbWF4TGF0ZW5jeSgpIHtcbiAgICByZXR1cm4gdGhpcy5sYXRlbmN5Q29udHJvbGxlci5tYXhMYXRlbmN5O1xuICB9XG4gIC8qKlxuICAgKiB0YXJnZXQgZGlzdGFuY2UgZnJvbSB0aGUgZWRnZSBhcyBjYWxjdWxhdGVkIGJ5IHRoZSBsYXRlbmN5IGNvbnRyb2xsZXJcbiAgICovXG4gIGdldCB0YXJnZXRMYXRlbmN5KCkge1xuICAgIHJldHVybiB0aGlzLmxhdGVuY3lDb250cm9sbGVyLnRhcmdldExhdGVuY3k7XG4gIH1cbiAgc2V0IHRhcmdldExhdGVuY3koZSkge1xuICAgIHRoaXMubGF0ZW5jeUNvbnRyb2xsZXIudGFyZ2V0TGF0ZW5jeSA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIHRoZSByYXRlIGF0IHdoaWNoIHRoZSBlZGdlIG9mIHRoZSBjdXJyZW50IGxpdmUgcGxheWxpc3QgaXMgYWR2YW5jaW5nIG9yIDEgaWYgdGhlcmUgaXMgbm9uZVxuICAgKi9cbiAgZ2V0IGRyaWZ0KCkge1xuICAgIHJldHVybiB0aGlzLmxhdGVuY3lDb250cm9sbGVyLmRyaWZ0O1xuICB9XG4gIC8qKlxuICAgKiBzZXQgdG8gdHJ1ZSB3aGVuIHN0YXJ0TG9hZCBpcyBjYWxsZWQgYmVmb3JlIE1BTklGRVNUX1BBUlNFRCBldmVudFxuICAgKi9cbiAgZ2V0IGZvcmNlU3RhcnRMb2FkKCkge1xuICAgIHJldHVybiB0aGlzLnN0cmVhbUNvbnRyb2xsZXIuZm9yY2VTdGFydExvYWQ7XG4gIH1cbiAgLyoqXG4gICAqIENvbnRlbnRTdGVlcmluZyBwYXRod2F5cyBnZXR0ZXJcbiAgICovXG4gIGdldCBwYXRod2F5cygpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIucGF0aHdheXM7XG4gIH1cbiAgLyoqXG4gICAqIENvbnRlbnRTdGVlcmluZyBwYXRod2F5UHJpb3JpdHkgZ2V0dGVyL3NldHRlclxuICAgKi9cbiAgZ2V0IHBhdGh3YXlQcmlvcml0eSgpIHtcbiAgICByZXR1cm4gdGhpcy5sZXZlbENvbnRyb2xsZXIucGF0aHdheVByaW9yaXR5O1xuICB9XG4gIHNldCBwYXRod2F5UHJpb3JpdHkoZSkge1xuICAgIHRoaXMubGV2ZWxDb250cm9sbGVyLnBhdGh3YXlQcmlvcml0eSA9IGU7XG4gIH1cbiAgLyoqXG4gICAqIHJldHVybnMgdHJ1ZSB3aGVuIGFsbCBTb3VyY2VCdWZmZXJzIGFyZSBidWZmZXJlZCB0byB0aGUgZW5kXG4gICAqL1xuICBnZXQgYnVmZmVyZWRUb0VuZCgpIHtcbiAgICB2YXIgZTtcbiAgICByZXR1cm4gISEoKGUgPSB0aGlzLmJ1ZmZlckNvbnRyb2xsZXIpICE9IG51bGwgJiYgZS5idWZmZXJlZFRvRW5kKTtcbiAgfVxuICAvKipcbiAgICogcmV0dXJucyBJbnRlcnN0aXRpYWxzIFByb2dyYW0gTWFuYWdlclxuICAgKi9cbiAgZ2V0IGludGVyc3RpdGlhbHNNYW5hZ2VyKCkge1xuICAgIHZhciBlO1xuICAgIHJldHVybiAoKGUgPSB0aGlzLmludGVyc3RpdGlhbHNDb250cm9sbGVyKSA9PSBudWxsID8gdm9pZCAwIDogZS5pbnRlcnN0aXRpYWxzTWFuYWdlcikgfHwgbnVsbDtcbiAgfVxuICAvKipcbiAgICogcmV0dXJucyBtZWRpYUNhcGFiaWxpdGllcy5kZWNvZGluZ0luZm8gZm9yIGEgdmFyaWFudC9yZW5kaXRpb25cbiAgICovXG4gIGdldE1lZGlhRGVjb2RpbmdJbmZvKGUsIHQgPSB0aGlzLmFsbEF1ZGlvVHJhY2tzKSB7XG4gICAgY29uc3QgciA9ICRnKHQpO1xuICAgIHJldHVybiBOZyhlLCByLCBuYXZpZ2F0b3IubWVkaWFDYXBhYmlsaXRpZXMpO1xuICB9XG59XG5Ici5kZWZhdWx0Q29uZmlnID0gdm9pZCAwO1xuY29uc3Qgb24gPSBcImh0dHBzOi8vc2RrLWFwaS5uZXluYXIuY29tXCIsIHdBID0gXCJodHRwczovL2FwaS5hbGxvcmlnaW5zLndpbi9nZXRcIiwgYmkgPSBcImh0dHBzOi8vaS5pbWd1ci5jb20vZ3hIOGF6eS5wbmdcIjtcbnZhciBBQSA9IHtcbiAgU0RLX1ZFUlNJT046ICdcIjEuMi4xNVwiJ1xufTtcbmNvbnN0IElBID0gQUEuU0RLX1ZFUlNJT04sIGFuID0gYXN5bmMgKHMsIGUgPSB7fSkgPT4gKGUuaGVhZGVycyA9IHtcbiAgLi4uZS5oZWFkZXJzLFxuICBcIngtc2RrXCI6IFwicmVhY3RcIixcbiAgXCJ4LXNkay12ZXJzaW9uXCI6IElBXG59LCBmZXRjaChzLCBlKSk7XG5hc3luYyBmdW5jdGlvbiBfQSh7XG4gIHR5cGU6IHMsXG4gIGlkZW50aWZpZXI6IGUsXG4gIHZpZXdlckZpZDogdCxcbiAgY2xpZW50X2lkOiByXG59KSB7XG4gIHRyeSB7XG4gICAgbGV0IG4gPSBgJHtvbn0vdjIvZmFyY2FzdGVyL2Nhc3Q/dHlwZT0ke3N9JmlkZW50aWZpZXI9JHtlfSR7dCA/IGAmdmlld2VyX2ZpZD0ke3R9YCA6IFwiXCJ9JmNsaWVudF9pZD0ke3J9YDtcbiAgICBjb25zdCBvID0gYXdhaXQgKGF3YWl0IGFuKG4pKS5qc29uKCk7XG4gICAgcmV0dXJuIChvID09IG51bGwgPyB2b2lkIDAgOiBvLmNhc3QpIHx8IG51bGw7XG4gIH0gY2F0Y2ggKG4pIHtcbiAgICByZXR1cm4gY29uc29sZS5lcnJvcihcIkVycm9yIGZldGNoaW5nIGNhc3QgYnkgaWRlbnRpZmllclwiLCBuKSwgbnVsbDtcbiAgfVxufVxuY29uc3QgUkEgPSAoe1xuICB0eXBlOiBzLFxuICBpZGVudGlmaWVyOiBlLFxuICB2aWV3ZXJGaWQ6IHQsXG4gIGFsbG93UmVhY3Rpb25zOiByID0gITEsXG4gIHJlbmRlckVtYmVkczogbiA9ICEwLFxuICByZW5kZXJGcmFtZXM6IGkgPSAhMSxcbiAgb25MaWtlQnRuUHJlc3M6IG8sXG4gIG9uUmVjYXN0QnRuUHJlc3M6IGEsXG4gIG9uQ29tbWVudEJ0blByZXNzOiBsLFxuICBvbkZyYW1lQnRuUHJlc3M6IGMsXG4gIGNvbnRhaW5lclN0eWxlczogdSxcbiAgdGV4dFN0eWxlczogZFxufSkgPT4ge1xuICB2YXIgRjtcbiAgY29uc3Qge1xuICAgIGNsaWVudF9pZDogaFxuICB9ID0gdHMoKSwgW2YsIHBdID0gc3QudXNlU3RhdGUobnVsbCksIFt5LCBFXSA9IHN0LnVzZVN0YXRlKCEwKSwgW2IsIFJdID0gc3QudXNlU3RhdGUobnVsbCksIEEgPSAoZiA9PSBudWxsID8gdm9pZCAwIDogZi5hdXRob3IuZmlkKSA9PT0gdDtcbiAgcmV0dXJuIHN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgcyAmJiBlICYmIChFKCEwKSwgUihudWxsKSwgX0Eoe1xuICAgICAgdHlwZTogcyxcbiAgICAgIGlkZW50aWZpZXI6IGUsXG4gICAgICB2aWV3ZXJGaWQ6IHQsXG4gICAgICBjbGllbnRfaWQ6IGhcbiAgICB9KS50aGVuKChNKSA9PiB7XG4gICAgICBwKE0pO1xuICAgIH0pLmNhdGNoKChNKSA9PiB7XG4gICAgICBSKE0pO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgRSghMSk7XG4gICAgfSkpO1xuICB9LCBbcywgZSwgdCwgaF0pLCB5ID8gLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICBzdHlsZToge1xuICAgICAgcGFkZGluZzogXCIyMHB4XCJcbiAgICB9LFxuICAgIGNoaWxkcmVuOiBcIkxvYWRpbmcuLi5cIlxuICB9KSA6ICFmIHx8IGIgPyAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge1xuICAgIGNoaWxkcmVuOiBcIkVycm9yOiBjb3VsZCBub3QgZmV0Y2ggY2FzdCBkYXRhXCJcbiAgfSkgOiBpICYmICFjID8gLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICBjaGlsZHJlbjogXCJFcnJvcjogb25GcmFtZUJ0blByZXNzIG11c3QgYmUgcHJvdmlkZWQgd2hlbiByZW5kZXJFbWJlZHMgaXMgdHJ1ZS5cIlxuICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChvYSwge1xuICAgIHVzZXJuYW1lOiBmLmF1dGhvci51c2VybmFtZSxcbiAgICBkaXNwbGF5TmFtZTogZi5hdXRob3IuZGlzcGxheV9uYW1lLFxuICAgIGF2YXRhckltZ1VybDogZi5hdXRob3IucGZwX3VybCxcbiAgICB0ZXh0OiBmLnRleHQsXG4gICAgaGFzaDogZi5oYXNoLFxuICAgIHJlYWN0aW9uczogZi5yZWFjdGlvbnMsXG4gICAgcmVwbGllczogZi5yZXBsaWVzLmNvdW50LFxuICAgIGVtYmVkczogZi5lbWJlZHMgPz8gW10sXG4gICAgZnJhbWVzOiBmLmZyYW1lcyA/PyBbXSxcbiAgICByZW5kZXJFbWJlZHM6IG4sXG4gICAgcmVuZGVyRnJhbWVzOiBpLFxuICAgIGNoYW5uZWw6IGYuY2hhbm5lbCA/IHtcbiAgICAgIGlkOiBmLmNoYW5uZWwuaWQsXG4gICAgICBuYW1lOiBmLmNoYW5uZWwubmFtZSxcbiAgICAgIHVybDogZi5wYXJlbnRfdXJsXG4gICAgfSA6IHZvaWQgMCxcbiAgICB2aWV3ZXJGaWQ6IHQsXG4gICAgYWxsb3dSZWFjdGlvbnM6IHIsXG4gICAgaGFzUG93ZXJCYWRnZTogZi5hdXRob3IucG93ZXJfYmFkZ2UsXG4gICAgYXBwQXZhdGFySW1nVXJsOiAoKEYgPSBmLmFwcCkgPT0gbnVsbCA/IHZvaWQgMCA6IEYucGZwX3VybCkgfHwgbnVsbCxcbiAgICBpc093blByb2ZpbGU6IEEsXG4gICAgY29udGFpbmVyU3R5bGVzOiB1LFxuICAgIHRleHRTdHlsZXM6IGQsXG4gICAgb25MaWtlQnRuUHJlc3M6IG8sXG4gICAgb25SZWNhc3RCdG5QcmVzczogYSxcbiAgICBvbkNvbW1lbnRCdG5QcmVzczogbCxcbiAgICBvbkZyYW1lQnRuUHJlc3M6IGMsXG4gICAgdGltZXN0YW1wOiBmLnRpbWVzdGFtcFxuICB9KTtcbn0sIExBID0gLyogQF9fUFVSRV9fICovIGRlKFwiYVwiKSh7XG4gIGNsYXNzZXM6IFtcInMxdW80bHg0XCJdXG59KSwgUGwgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBpbyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksIGZmID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSwgZ2YgPSAocykgPT4gbmV3IFByb21pc2UoKGUpID0+IHNldFRpbWVvdXQoZSwgcykpLCBRcCA9IGFzeW5jIChzLCBlID0gMCkgPT4ge1xuICBjb25zdCB0ID0gbmV3IFVSTChzKS5ob3N0bmFtZTtcbiAgaWYgKGZmLmdldCh0KSlcbiAgICByZXR1cm4ge1xuICAgICAgb2dJbWFnZTogXCJcIixcbiAgICAgIG9nVGl0bGU6IFwiXCIsXG4gICAgICBvZ0Rlc2NyaXB0aW9uOiBcIlwiXG4gICAgfTtcbiAgaWYgKFBsLmhhcyhzKSlcbiAgICByZXR1cm4gUGwuZ2V0KHMpO1xuICBpZiAoaW8uaGFzKHMpKVxuICAgIHJldHVybiBpby5nZXQocyk7XG4gIGNvbnN0IHIgPSAoYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBnZigxMDApO1xuICAgICAgY29uc3QgbiA9IGF3YWl0IGZldGNoKGAke3dBfT91cmw9JHtlbmNvZGVVUklDb21wb25lbnQocyl9YCwge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCJcbiAgICAgIH0pO1xuICAgICAgaWYgKCFuLm9rKSB7XG4gICAgICAgIGlmIChuLnN0YXR1cyA9PT0gNDI5ICYmIGUgPCA1KSB7XG4gICAgICAgICAgY29uc3QgRSA9IE1hdGgucG93KDIsIGUpICogMWUzO1xuICAgICAgICAgIHJldHVybiBhd2FpdCBnZihFKSwgUXAocywgZSArIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGZmLnNldCh0LCAhMCksIG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoIE9wZW4gR3JhcGggZGF0YTogJHtuLnN0YXR1c1RleHR9YCk7XG4gICAgICB9XG4gICAgICBjb25zdCBpID0gYXdhaXQgbi5qc29uKCksIGEgPSBuZXcgRE9NUGFyc2VyKCkucGFyc2VGcm9tU3RyaW5nKGkuY29udGVudHMsIFwidGV4dC9odG1sXCIpLCBsID0gYS5xdWVyeVNlbGVjdG9yKCdtZXRhW3Byb3BlcnR5PVwib2c6aW1hZ2VcIl0nKSwgYyA9IGEucXVlcnlTZWxlY3RvcignbWV0YVtwcm9wZXJ0eT1cIm9nOnRpdGxlXCJdJyksIHUgPSBhLnF1ZXJ5U2VsZWN0b3IoJ21ldGFbcHJvcGVydHk9XCJvZzpkZXNjcmlwdGlvblwiXScpLCBkID0gYS5xdWVyeVNlbGVjdG9yKFwidGl0bGVcIiksIGggPSBsICYmIGwuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKSB8fCBcIlwiLCBmID0gYyA/IGMuZ2V0QXR0cmlidXRlKFwiY29udGVudFwiKSB8fCBcIlwiIDogZCA/IGQuaW5uZXJUZXh0IDogXCJcIiwgcCA9IHUgJiYgdS5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpIHx8IFwiXCIsIHkgPSB7XG4gICAgICAgIG9nSW1hZ2U6IGgsXG4gICAgICAgIG9nVGl0bGU6IGYsXG4gICAgICAgIG9nRGVzY3JpcHRpb246IHBcbiAgICAgIH07XG4gICAgICByZXR1cm4gUGwuc2V0KHMsIHkpLCB5O1xuICAgIH0gY2F0Y2ggKG4pIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgT3BlbiBHcmFwaCBkYXRhXCIsIG4pLCB7XG4gICAgICAgIG9nSW1hZ2U6IFwiXCIsXG4gICAgICAgIG9nVGl0bGU6IFwiXCIsXG4gICAgICAgIG9nRGVzY3JpcHRpb246IFwiXCJcbiAgICAgIH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlvLmRlbGV0ZShzKTtcbiAgICB9XG4gIH0pKCk7XG4gIHJldHVybiBpby5zZXQocywgciksIHI7XG59LCBBYyA9IFtdO1xubGV0IE1sID0gMDtcbmNvbnN0IENBID0gNSwga0EgPSAocykgPT4ge1xuICBBYy5wdXNoKHMpLCBlbSgpO1xufSwgZW0gPSBhc3luYyAoKSA9PiB7XG4gIGlmIChNbCA+PSBDQSB8fCBBYy5sZW5ndGggPT09IDApXG4gICAgcmV0dXJuO1xuICBNbCsrO1xuICBjb25zdCBzID0gQWMuc2hpZnQoKTtcbiAgcyAmJiBhd2FpdCBzKCksIE1sLS0sIGVtKCk7XG59LCBEQSA9ICh7XG4gIHNyYzogcyxcbiAgYWx0OiBlLFxuICBzdHlsZTogdFxufSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4KFwiaW1nXCIsIHtcbiAgc3JjOiBzLFxuICBhbHQ6IGUsXG4gIHN0eWxlOiB7XG4gICAgZGlzcGxheTogXCJibG9ja1wiLFxuICAgIGhlaWdodDogXCJhdXRvXCIsXG4gICAgbWF4SGVpZ2h0OiBcIjE1MHB4XCIsXG4gICAgd2lkdGg6IFwiYXV0b1wiLFxuICAgIG1heFdpZHRoOiBcIjEwMCVcIixcbiAgICBvYmplY3RGaXQ6IFwiY292ZXJcIixcbiAgICBib3JkZXI6IFwiMXB4IHNvbGlkIGdyZXlcIixcbiAgICBib3JkZXJSYWRpdXM6IFwiMTBweFwiLFxuICAgIG1hcmdpbjogXCI0cHggMFwiLFxuICAgIC4uLnRcbiAgfVxufSksIFBBID0gKHtcbiAgdXJsOiBzXG59KSA9PiB7XG4gIGNvbnN0IGUgPSBzdC51c2VSZWYobnVsbCk7XG4gIHJldHVybiBzdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChlLmN1cnJlbnQpXG4gICAgICBpZiAoSHIuaXNTdXBwb3J0ZWQoKSAmJiBzLmVuZHNXaXRoKFwiLm0zdThcIikpIHtcbiAgICAgICAgY29uc3QgdCA9IG5ldyBIcigpO1xuICAgICAgICB0LmxvYWRTb3VyY2UocyksIHQuYXR0YWNoTWVkaWEoZS5jdXJyZW50KSwgdC5vbihIci5FdmVudHMuTUFOSUZFU1RfUEFSU0VELCAoKSA9PiB7XG4gICAgICAgICAgZS5jdXJyZW50LnBsYXkoKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2VcbiAgICAgICAgZS5jdXJyZW50LnNyYyA9IHMsIGUuY3VycmVudC5hZGRFdmVudExpc3RlbmVyKFwibG9hZGVkbWV0YWRhdGFcIiwgKCkgPT4ge1xuICAgICAgICAgIGUuY3VycmVudC5wbGF5KCk7XG4gICAgICAgIH0pO1xuICB9LCBbc10pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJ2aWRlb1wiLCB7XG4gICAgcmVmOiBlLFxuICAgIGNvbnRyb2xzOiAhMCxcbiAgICBtdXRlZDogITAsXG4gICAgc3R5bGU6IHtcbiAgICAgIHdpZHRoOiBcImF1dG9cIixcbiAgICAgIG1heFdpZHRoOiBcIjEwMCVcIixcbiAgICAgIG1heEhlaWdodDogXCI0MDBweFwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjEwcHhcIixcbiAgICAgIG1hcmdpbjogXCIxMHB4IDBcIixcbiAgICAgIG9iamVjdEZpdDogXCJjb250YWluXCJcbiAgICB9XG4gIH0pO1xufSwgTUEgPSAocykgPT4gL1xcLihqcGVnfGpwZ3xnaWZ8cG5nfHdlYnB8Ym1wfHN2ZykkLy50ZXN0KHMpIHx8IHMuc3RhcnRzV2l0aChcImh0dHBzOi8vaW1hZ2VkZWxpdmVyeS5uZXRcIiksIE9BID0gKHMsIGUsIHQpID0+IHtcbiAgY29uc3QgW3IsIG5dID0gc3QudXNlU3RhdGUoW10pLCBpID0gc3QudXNlQ2FsbGJhY2soYXN5bmMgKG8pID0+IChhd2FpdCBQcm9taXNlLmFsbChvLm1hcChhc3luYyAobCkgPT4ge1xuICAgIGlmIChsLnVybCkge1xuICAgICAgY29uc3QgYyA9IGwudXJsO1xuICAgICAgcmV0dXJuIE1BKGMpID8gLyogQF9fUFVSRV9fICovIHEuanN4KERBLCB7XG4gICAgICAgIHNyYzogYyxcbiAgICAgICAgYWx0OiBcIkVtYmVkZGVkIGltYWdlXCJcbiAgICAgIH0sIGMpIDogYy5lbmRzV2l0aChcIi5tM3U4XCIpIHx8IGMuZW5kc1dpdGgoXCIubXA0XCIpID8gLyogQF9fUFVSRV9fICovIHEuanN4KFBBLCB7XG4gICAgICAgIHVybDogY1xuICAgICAgfSwgYykgOiBuZXcgUHJvbWlzZSgodSkgPT4ge1xuICAgICAgICBrQShhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgb2dJbWFnZTogZCxcbiAgICAgICAgICAgIG9nVGl0bGU6IGhcbiAgICAgICAgICB9ID0gYXdhaXQgUXAoYyksIGYgPSBuZXcgVVJMKGMpLmhvc3RuYW1lLnJlcGxhY2UoXCJ3d3cuXCIsIFwiXCIpO1xuICAgICAgICAgIHUoLyogQF9fUFVSRV9fICovIHEuanN4cyhMQSwge1xuICAgICAgICAgICAgaHJlZjogYyxcbiAgICAgICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgICAgIHJlbDogXCJub3JlZmVycmVyXCIsXG4gICAgICAgICAgICBjaGlsZHJlbjogW2QgJiYgLyogQF9fUFVSRV9fICovIHEuanN4KFwiaW1nXCIsIHtcbiAgICAgICAgICAgICAgc3JjOiBkLFxuICAgICAgICAgICAgICBhbHQ6IGgsXG4gICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IFwiNTBweFwiLFxuICAgICAgICAgICAgICAgIGhlaWdodDogXCI1MHB4XCIsXG4gICAgICAgICAgICAgICAgb2JqZWN0Rml0OiBcImNvdmVyXCIsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiBcIjVweFwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiBcImNvbHVtblwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KFwicFwiLCB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogMFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGggfHwgY1xuICAgICAgICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwicFwiLCB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiBcImdyZXlcIixcbiAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBcIjEycHhcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW46IGZcbiAgICAgICAgICAgICAgfSldXG4gICAgICAgICAgICB9KV1cbiAgICAgICAgICB9LCBjKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChsLmNhc3RfaWQpXG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICBtYXhXaWR0aDogXCI4NSVcIlxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFJBLCB7XG4gICAgICAgICAgdHlwZTogXCJoYXNoXCIsXG4gICAgICAgICAgaWRlbnRpZmllcjogbC5jYXN0X2lkLmhhc2gsXG4gICAgICAgICAgdmlld2VyRmlkOiB0LFxuICAgICAgICAgIGFsbG93UmVhY3Rpb25zOiBlLFxuICAgICAgICAgIHJlbmRlckVtYmVkczogITFcbiAgICAgICAgfSwgbC5jYXN0X2lkLmZpZClcbiAgICAgIH0sIGBjYXN0LSR7bC5jYXN0X2lkLmhhc2h9YCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0pKSkuZmlsdGVyKChsKSA9PiBsICE9PSBudWxsKSwgW2UsIHRdKTtcbiAgcmV0dXJuIHN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaShzKS50aGVuKG4pO1xuICB9LCBbcywgaV0pLCByO1xufSwgdG0gPSAoe1xuICBvbkNsaWNrOiBzXG59KSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdmdcIiwge1xuICB3aWR0aDogXCIxOFwiLFxuICBoZWlnaHQ6IFwiMTdcIixcbiAgdmlld0JveDogXCIwIDAgMTggMTdcIixcbiAgZmlsbDogXCJub25lXCIsXG4gIHhtbG5zOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXG4gIG9uQ2xpY2s6IChlKSA9PiBzID8gcyhlKSA6IHZvaWQgMCxcbiAgc3R5bGU6IHtcbiAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gIH0sXG4gIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIk02LjIyODU3IDEyLjY4MjhINy4wMTI4NUM3LjAxMjg1IDEyLjI0OTYgNi42NjE3MiAxMS44OTg1IDYuMjI4NTcgMTEuODk4NVYxMi42ODI4Wk02LjIyODU3IDE1LjgxOTlINS40NDQzQzUuNDQ0MyAxNi4xMTM3IDUuNjA4NDggMTYuMzgyOCA1Ljg2OTcgMTYuNTE3MkM2LjEzMDkyIDE2LjY1MTcgNi40NDUzNyAxNi42Mjg4IDYuNjg0NDMgMTYuNDU4MUw2LjIyODU3IDE1LjgxOTlaTTEwLjYyMDUgMTIuNjgyOFYxMS44OTg1QzEwLjQ1NzEgMTEuODk4NSAxMC4yOTc3IDExLjk0OTYgMTAuMTY0NyAxMi4wNDQ2TDEwLjYyMDUgMTIuNjgyOFpNMS43ODQyOCAzLjI3MTQ2QzEuNzg0MjggMi41NDk1NSAyLjM2OTUgMS45NjQzMyAzLjA5MTQxIDEuOTY0MzNWMC4zOTU3NzdDMS41MDMyMSAwLjM5NTc3NyAwLjIxNTcyMyAxLjY4MzI3IDAuMjE1NzIzIDMuMjcxNDZIMS43ODQyOFpNMS43ODQyOCAxMC41OTE0VjMuMjcxNDZIMC4yMTU3MjNWMTAuNTkxNEgxLjc4NDI4Wk0zLjA5MTQgMTEuODk4NUMyLjM2OTUgMTEuODk4NSAxLjc4NDI4IDExLjMxMzMgMS43ODQyOCAxMC41OTE0SDAuMjE1NzIzQzAuMjE1NzIzIDEyLjE3OTYgMS41MDMyMSAxMy40NjcxIDMuMDkxNCAxMy40NjcxVjExLjg5ODVaTTYuMjI4NTcgMTEuODk4NUgzLjA5MTRWMTMuNDY3MUg2LjIyODU3VjExLjg5ODVaTTcuMDEyODUgMTUuODE5OVYxMi42ODI4SDUuNDQ0M1YxNS44MTk5SDcuMDEyODVaTTEwLjE2NDcgMTIuMDQ0Nkw1Ljc3MjcyIDE1LjE4MTdMNi42ODQ0MyAxNi40NTgxTDExLjA3NjQgMTMuMzIxTDEwLjE2NDcgMTIuMDQ0NlpNMTQuNTk0MSAxMS44OTg1SDEwLjYyMDVWMTMuNDY3MUgxNC41OTQxVjExLjg5ODVaTTE1LjkwMTMgMTAuNTkxNEMxNS45MDEzIDExLjMxMzMgMTUuMzE2IDExLjg5ODUgMTQuNTk0MSAxMS44OTg1VjEzLjQ2NzFDMTYuMTgyMyAxMy40NjcxIDE3LjQ2OTggMTIuMTc5NiAxNy40Njk4IDEwLjU5MTRIMTUuOTAxM1pNMTUuOTAxMyAzLjI3MTQ2VjEwLjU5MTRIMTcuNDY5OFYzLjI3MTQ2SDE1LjkwMTNaTTE0LjU5NDEgMS45NjQzM0MxNS4zMTYgMS45NjQzMyAxNS45MDEzIDIuNTQ5NTUgMTUuOTAxMyAzLjI3MTQ2SDE3LjQ2OThDMTcuNDY5OCAxLjY4MzI2IDE2LjE4MjMgMC4zOTU3NzcgMTQuNTk0MSAwLjM5NTc3N1YxLjk2NDMzWk0zLjA5MTQxIDEuOTY0MzNIMTQuNTk0MVYwLjM5NTc3N0gzLjA5MTQxVjEuOTY0MzNaXCIsXG4gICAgZmlsbDogXCIjQTBBM0FEXCJcbiAgfSlcbn0pLCBCQSA9ICh7XG4gIGZpbGw6IHMsXG4gIG9uQ2xpY2s6IGVcbn0pID0+IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoXCJzdmdcIiwge1xuICB3aWR0aDogXCIxNlwiLFxuICBoZWlnaHQ6IFwiMTVcIixcbiAgdmlld0JveDogXCIwIDAgMTYgMTVcIixcbiAgZmlsbDogcyB8fCBcIm5vbmVcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgb25DbGljazogKHQpID0+IGUgPyBlKHQpIDogdm9pZCAwLFxuICBzdHlsZToge1xuICAgIGN1cnNvcjogXCJwb2ludGVyXCJcbiAgfSxcbiAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIk0xNC45MjQ1IDE0LjI1MDZDMTQuNzI1OCAxNC4yNTA2IDE0LjUzNTIgMTQuMTcxNiAxNC4zOTQ2IDE0LjAzMTFDMTQuMjU0MSAxMy44OTA1IDE0LjE3NTEgMTMuNjk5OSAxNC4xNzUxIDEzLjUwMTFWMTAuNTAzNEgxMS4xNzc0QzEwLjk3ODcgMTAuNTAzNCAxMC43ODgxIDEwLjQyNDUgMTAuNjQ3NSAxMC4yODM5QzEwLjUwNyAxMC4xNDM0IDEwLjQyOCA5Ljk1Mjc5IDEwLjQyOCA5Ljc1NDAzQzEwLjQyOCA5LjU1NTI3IDEwLjUwNyA5LjM2NDY1IDEwLjY0NzUgOS4yMjQxMUMxMC43ODgxIDkuMDgzNTcgMTAuOTc4NyA5LjAwNDYxIDExLjE3NzQgOS4wMDQ2MUgxNC45MjQ1QzE1LjEyMzMgOS4wMDQ2MSAxNS4zMTM5IDkuMDgzNTcgMTUuNDU0NSA5LjIyNDExQzE1LjU5NSA5LjM2NDY1IDE1LjY3NCA5LjU1NTI3IDE1LjY3NCA5Ljc1NDAzVjEzLjUwMTFDMTUuNjc0IDEzLjY5OTkgMTUuNTk1IDEzLjg5MDUgMTUuNDU0NSAxNC4wMzExQzE1LjMxMzkgMTQuMTcxNiAxNS4xMjMzIDE0LjI1MDYgMTQuOTI0NSAxNC4yNTA2Wk01LjE4MjA3IDYuMDA2OTNIMS40MzQ5N0MxLjIzNjIxIDYuMDA2OTMgMS4wNDU1OSA1LjkyNzk3IDAuOTA1MDQ3IDUuNzg3NDNDMC43NjQ1MDMgNS42NDY4OCAwLjY4NTU0NyA1LjQ1NjI3IDAuNjg1NTQ3IDUuMjU3NTFWMS41MTA0MUMwLjY4NTU0NyAxLjMxMTY1IDAuNzY0NTAzIDEuMTIxMDMgMC45MDUwNDcgMC45ODA0ODZDMS4wNDU1OSAwLjgzOTk0MyAxLjIzNjIxIDAuNzYwOTg2IDEuNDM0OTcgMC43NjA5ODZDMS42MzM3MyAwLjc2MDk4NiAxLjgyNDM0IDAuODM5OTQzIDEuOTY0ODkgMC45ODA0ODZDMi4xMDU0MyAxLjEyMTAzIDIuMTg0MzkgMS4zMTE2NSAyLjE4NDM5IDEuNTEwNDFWNC41MDgwOUg1LjE4MjA3QzUuMzgwODMgNC41MDgwOSA1LjU3MTQ1IDQuNTg3MDQgNS43MTE5OSA0LjcyNzU5QzUuODUyNTMgNC44NjgxMyA1LjkzMTQ5IDUuMDU4NzUgNS45MzE0OSA1LjI1NzUxQzUuOTMxNDkgNS40NTYyNyA1Ljg1MjUzIDUuNjQ2ODggNS43MTE5OSA1Ljc4NzQzQzUuNTcxNDUgNS45Mjc5NyA1LjM4MDgzIDYuMDA2OTMgNS4xODIwNyA2LjAwNjkzWlwiLFxuICAgIGZpbGw6IHMgfHwgXCIjQTBBM0FEXCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTguMTc5MzQgMTVDNi4zMzU1NiAxNS4wMDAzIDQuNTU2MzcgMTQuMzIwOSAzLjE4MjA1IDEzLjA5MThDMS44MDc3NCAxMS44NjI3IDAuOTM0NzY2IDEwLjE3IDAuNzMwMTA2IDguMzM3NjVDMC43MTkyODEgOC4yMzkyMyAwLjcyNzk0NSA4LjEzOTY1IDAuNzU1NjA2IDguMDQ0NThDMC43ODMyNjYgNy45NDk1MSAwLjgyOTM4IDcuODYwODMgMC44OTEzMTUgNy43ODM1OEMxLjAxNjQgNy42Mjc1OCAxLjE5ODMzIDcuNTI3NjUgMS4zOTcwOSA3LjUwNTc5QzEuNTk1ODUgNy40ODM5MyAxLjc5NTE1IDcuNTQxOTEgMS45NTExNiA3LjY2N0MyLjEwNzE2IDcuNzkyMDggMi4yMDcwOCA3Ljk3NDAxIDIuMjI4OTUgOC4xNzI3N0MyLjM3NzA4IDkuNTIzNzYgMi45Nzk4MyAxMC43ODQzIDMuOTM4MzggMTEuNzQ3OEM0Ljg5NjkyIDEyLjcxMTMgNi4xNTQzOCAxMy4zMjA1IDcuNTA0NTkgMTMuNDc1NUM4Ljg1NDc5IDEzLjYzMDYgMTAuMjE3NiAxMy4zMjIzIDExLjM2OTYgMTIuNjAxMkMxMi41MjE2IDExLjg4MDEgMTMuMzk0NCAxMC43ODkgMTMuODQ1IDkuNTA2NzRDMTMuODczMSA5LjQwODE3IDEzLjkyMTEgOS4zMTY0MiAxMy45ODYgOS4yMzcxNEMxNC4wNTEgOS4xNTc4NyAxNC4xMzE2IDkuMDkyNzcgMTQuMjIyNyA5LjA0NTg2QzE0LjMxMzggOC45OTg5NSAxNC40MTM2IDguOTcxMjMgMTQuNTE1OSA4Ljk2NDQyQzE0LjYxODEgOC45NTc2MSAxNC43MjA3IDguOTcxODUgMTQuODE3MyA5LjAwNjI1QzE0LjkxMzggOS4wNDA2NiAxNS4wMDIzIDkuMDk0NTEgMTUuMDc3MiA5LjE2NDQ2QzE1LjE1MjEgOS4yMzQ0MiAxNS4yMTE4IDkuMzE4OTkgMTUuMjUyOCA5LjQxMjk2QzE1LjI5MzcgOS41MDY5MyAxNS4zMTQ5IDkuNjA4MyAxNS4zMTUxIDkuNzEwNzlDMTUuMzE1MyA5LjgxMzI5IDE1LjI5NDQgOS45MTQ3MyAxNS4yNTM5IDEwLjAwODlDMTQuNzM1OSAxMS40NzA1IDEzLjc3NzQgMTIuNzM1NSAxMi41MTAzIDEzLjYyOTRDMTEuMjQzMiAxNC41MjMzIDkuNzMwMDIgMTUuMDAyMiA4LjE3OTM0IDE1Wk0xNC44NzkyIDcuNTA1NzlDMTQuNjkzOSA3LjUwNjkxIDE0LjUxNDggNy40MzkzNyAxNC4zNzY0IDcuMzE2MkMxNC4yMzggNy4xOTMwMiAxNC4xNTAxIDcuMDIyOTUgMTQuMTI5NyA2LjgzODhDMTMuOTc1IDUuNDk0MjkgMTMuMzY5OSA0LjI0MTY5IDEyLjQxMjggMy4yODQ3NkMxMS40NTU4IDIuMzI3ODIgMTAuMjAzMSAxLjcyMjg1IDguODU4NTggMS41NjgyNEM3LjUxNDA1IDEuNDEzNjQgNi4xNTY3NiAxLjcxODUgNS4wMDc1IDIuNDMzMjRDMy44NTgyMyAzLjE0Nzk4IDIuOTg0NiA0LjIzMDU0IDIuNTI4NzIgNS41MDQ4NEMyLjUwMDYyIDUuNjAzNCAyLjQ1MjYgNS42OTUxNiAyLjM4NzYzIDUuNzc0NDNDMi4zMjI2NiA1Ljg1MzcxIDIuMjQyMTIgNS45MTg4MSAyLjE1MDk5IDUuOTY1NzJDMi4wNTk4NyA2LjAxMjYzIDEuOTYwMDggNi4wNDAzNSAxLjg1NzgxIDYuMDQ3MTZDMS43NTU1NSA2LjA1Mzk3IDEuNjUyOTcgNi4wMzk3MyAxLjU1NjQyIDYuMDA1MzJDMS40NTk4OCA1Ljk3MDkyIDEuMzcxNDEgNS45MTcwNyAxLjI5NjUxIDUuODQ3MTJDMS4yMjE2IDUuNzc3MTYgMS4xNjE4MyA1LjY5MjU4IDEuMTIwOTEgNS41OTg2MUMxLjA3OTk5IDUuNTA0NjQgMS4wNTg3OCA1LjQwMzI4IDEuMDU4NTkgNS4zMDA3OEMxLjA1ODQgNS4xOTgyOSAxLjA3OTIzIDUuMDk2ODUgMS4xMTk4IDUuMDAyNzNDMS42ODQwNiAzLjQwMjAyIDIuNzc0OTcgMi4wNDAyNSA0LjIxMzk3IDEuMTQwMjlDNS42NTI5NyAwLjI0MDMzNyA3LjM1NDg1IC0wLjE0NDUwNSA5LjA0MTA2IDAuMDQ4NzUyMkMxMC43MjczIDAuMjQyMDA5IDEyLjI5NzkgMS4wMDE5MiAxMy40OTYgMi4yMDQxMUMxNC42OTQxIDMuNDA2MyAxNS40NDg2IDQuOTc5NTggMTUuNjM2MSA2LjY2NjQ0QzE1LjY1NzEgNi44NjMwNiAxNS41OTk3IDcuMDYwMDQgMTUuNDc2MSA3LjIxNDQ1QzE1LjM1MjYgNy4zNjg4NyAxNS4xNzMgNy40NjgyIDE0Ljk3NjYgNy40OTA4TDE0Ljg3OTIgNy41MDU3OVpcIixcbiAgICBmaWxsOiBzIHx8IFwiI0EwQTNBRFwiXG4gIH0pXVxufSksIHJtID0gKHtcbiAgZmlsbDogcyxcbiAgb25DbGljazogZVxufSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhcInN2Z1wiLCB7XG4gIHdpZHRoOiBcIjE3XCIsXG4gIGhlaWdodDogXCIxNVwiLFxuICB2aWV3Qm94OiBcIjAgMCAxNyAxNVwiLFxuICBmaWxsOiBzID8gXCJyZWRcIiA6IFwibm9uZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICBvbkNsaWNrOiAodCkgPT4gZSA/IGUodCkgOiB2b2lkIDAsXG4gIHN0eWxlOiB7XG4gICAgY3Vyc29yOiBcInBvaW50ZXJcIlxuICB9LFxuICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTEzLjg3MTkgMi4yNTA0MkwxNC4yOTQ3IDEuNTg5ODRMMTMuODcxOSAyLjI1MDQyQzE1LjI0NjcgMy4xMzAyMiAxNS43Njc2IDUuMjIyMDYgMTQuODg1NiA3LjYxMzE3QzE0LjA0MzYgOS44OTU4MyAxMS45NTU1IDEyLjIzNzQgOC41MTU3MyAxMy4zNjQ4QzUuMDc2MDYgMTIuMjM3NCAyLjk4Nzk5IDkuODk1ODQgMi4xNDU5NiA3LjYxMzE2QzEuMjYzOTIgNS4yMjIwMyAxLjc4NDggMy4xMzAyMiAzLjE1OTUxIDIuMjUwNDJMMy4xNTk1MSAyLjI1MDQyQzQuNTg1NDIgMS4zMzc4MyA1LjY0OTk3IDEuNTI5ODMgNi4zOTk0NSAxLjkyNTAzQzcuMjEyNzIgMi4zNTM4OCA3LjczMTA4IDMuMDcxMTQgNy44NjE0MyAzLjI2ODM4TDguNTE1NzMgNC4yNTgzOEw5LjE3MDAyIDMuMjY4MzhDOS4zMDAzOCAzLjA3MTEzIDkuODE4NzMgMi4zNTM4OCAxMC42MzIgMS45MjUwM0MxMS4zODE1IDEuNTI5ODMgMTIuNDQ2IDEuMzM3ODMgMTMuODcxOSAyLjI1MDQyWlwiLFxuICAgIHN0cm9rZTogcyB8fCBcIiNBMEEzQURcIixcbiAgICBzdHJva2VXaWR0aDogXCIxLjU2ODU1XCJcbiAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcIm1hc2tcIiwge1xuICAgIGlkOiBcInBhdGgtMi1pbnNpZGUtMV8xODdfMTA1MVwiLFxuICAgIGZpbGw6IFwid2hpdGVcIixcbiAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgICBkOiBcIk04LjU4NDQ0IDEzLjkzOTdDNy43NjEzOSAxMy42ODY0IDcuMDUzMzQgMTMuMzkzNyA2LjI5OTc2IDEyLjk4MjVDNS45NTYzMyAxMi43OTUxIDUuNjIyODUgMTIuNTg5NSA1LjMwMDMgMTIuMzY4MUM1LjE0NDE2IDEyLjI2MDkgNC45OTEwOCAxMi4xNDkzIDQuODQwNjMgMTIuMDM0M0M0Ljc4MTMyIDExLjk4ODkgNC44ODAzOCAxMi4wNjUyIDQuODIxNTYgMTIuMDE5NUM0LjgwMzg4IDEyLjAwNTggNC43ODYzIDExLjk5MTkgNC43Njg2OSAxMS45NzgxQzQuNzMzNjQgMTEuOTUwNSA0LjY5ODg0IDExLjkyMjUgNC42NjQxMyAxMS44OTQ1QzQuNTg5NDggMTEuODM0MiA0LjUxNTgyIDExLjc3MjcgNC40NDI4IDExLjcxMDVDMy45MDQ5OSAxMS4yNTIgMy40MTM4MSAxMC43Mzg5IDIuOTgwMTYgMTAuMTgwOUMzLjAxODU2IDEwLjIzMDMgMi45NzY1MSAxMC4xNzYgMi45NzA2NCAxMC4xNjgzQzIuOTU4MyAxMC4xNTIyIDIuOTQ2MDQgMTAuMTM1OSAyLjkzMzggMTAuMTE5N0MyLjkwOTM5IDEwLjA4NzQgMi44ODUyNyAxMC4wNTQ4IDIuODYxMjYgMTAuMDIyMUMyLjgwOTYxIDkuOTUxODkgMi43NTkwOCA5Ljg4MDggMi43MDkzMiA5LjgwOTJDMi42MTQ5MiA5LjY3MzQ1IDIuNTI0NDEgOS41MzUgMi40MzcxIDkuMzk0NTdDMi4yNjczIDkuMTIxNDUgMi4xMTIxMyA4LjgzOTI2IDEuOTcxNDcgOC41NTAwNkMxLjkzODQ5IDguNDgyMjggMS45MDY1NyA4LjQxMzk2IDEuODc1MzEgOC4zNDUzN0MxLjg1OTc4IDguMzExMyAxLjg0NDU5IDguMjc3MDkgMS44Mjk0OCA4LjI0Mjg0QzEuODIxOTUgOC4yMjU3NSAxLjgxNDU2IDguMjA4NjQgMS44MDcxNCA4LjE5MTUyQzEuODAxNjcgOC4xNzg4OSAxLjc2ODU2IDguMTAwNjEgMS43OTY2NCA4LjE2NzM2QzEuNzM3MjggOC4wMjYyIDEuNjgyMDUgNy44ODMyOSAxLjYzMDI5IDcuNzM5MTZDMS41Mjk4MiA3LjQ1OTQyIDEuNDQ0OTggNy4xNzQwNyAxLjM3NTc1IDYuODg1MDJDMS4zNDIxOCA2Ljc0NDkyIDEuMzEzMDEgNi42MDM3OSAxLjI4NzQ2IDYuNDYyMDJDMS4yNzU0IDYuMzk1MDIgMS4yNjQ1IDYuMzI3ODIgMS4yNTQzIDYuMjYwNTJDMS4yNDkyNSA2LjIyNzEzIDEuMjQ0NTMgNi4xOTM2OSAxLjIzOTk0IDYuMTYwMjNDMS4yNTEzNiA2LjI0MzU4IDEuMjM0OTUgNi4xMTc3MiAxLjIzMjMxIDYuMDk1MzJDMS4yMDA0MiA1LjgyNDQ0IDEuMTg1MzUgNS41NTE1OCAxLjE4NzIxIDUuMjc4ODVDMS4xODgxMSA1LjE0NjkxIDEuMTkzNzQgNS4wMTUwMSAxLjIwMzM0IDQuODgzNDNDMS4yMDc4OCA0LjgyMTI4IDEuMjEzNjggNC43NTkyMiAxLjIyMDIzIDQuNjk3MjZDMS4yMjM1IDQuNjY2NTEgMS4yMjcxMyA0LjYzNTggMS4yMzA4OSA0LjYwNTExQzEuMjMyNzggNC41ODk4MiAxLjIzNDc3IDQuNTc0NTcgMS4yMzY3OCA0LjU1OTNDMS4yMjU2MiA0LjY0NDI1IDEuMjM1NjMgNC41Njk1NiAxLjIzODIzIDQuNTUxNjNDMS4yNzQyOCA0LjMwNDE5IDEuMzI4NjEgNC4wNTk0MyAxLjQwMDk3IDMuODIwMDZDMS40MzYxNCAzLjcwMzc1IDEuNDc2MzUgMy41ODg5OSAxLjUyMDcyIDMuNDc1ODdDMS41MzEyNSAzLjQ0OSAxLjU0MjE5IDMuNDIyMjkgMS41NTMyNiAzLjM5NTY0QzEuNTE5NDEgMy40NzcxNiAxLjU1ODg5IDMuMzgzMzQgMS41NjcxNyAzLjM2NDY0QzEuNTkyMjYgMy4zMDgwMyAxLjYxODg2IDMuMjUyMDkgMS42NDY0MyAzLjE5NjY0QzEuNzUxMDEgMi45ODYyNCAxLjg3NDc2IDIuNzg1NDkgMi4wMTUzNCAyLjU5NzI0QzIuMDIzNzEgMi41ODYwMyAyLjAzMjIxIDIuNTc0OTIgMi4wNDA3MSAyLjU2MzhDMS45OTI3NSAyLjYyNjU2IDIuMDI0NDYgMi41ODQ5NiAyLjAzNDkzIDIuNTcxNjlDMi4wNTIyMyAyLjU0OTc0IDIuMDY5OTMgMi41MjgwOCAyLjA4NzczIDIuNTA2NTNDMi4xMjYzMSAyLjQ1OTg0IDIuMTY2MjkgMi40MTQzNCAyLjIwNzEzIDIuMzY5NjJDMi4yODU4NyAyLjI4MzQxIDIuMzY5MjYgMi4yMDE1MSAyLjQ1NiAyLjEyMzM5QzIuNDk3ODcgMi4wODU2OCAyLjU0MDg0IDIuMDQ5MiAyLjU4NDQzIDIuMDEzNTJDMi42MDYzMSAxLjk5NTYxIDIuNjI4NTIgMS45NzgwOCAyLjY1MDg0IDEuOTYwN0MyLjU4MTY0IDIuMDE0NjYgMi42NzE5MSAxLjk0NTU3IDIuNjg5NjIgMS45MzI2NUMyLjgzMzM4IDEuODI3NyAyLjk4NTg3IDEuNzM0OCAzLjE0MDEzIDEuNjQ2M0MzLjU0MzkzIDEuNDE0NTkgMy45MjQzNyAxLjI1NTY3IDQuMzgzMSAxLjE1MDcyQzQuNDc3MTYgMS4xMjkyMSA0LjU3MjE5IDEuMTEyMDQgNC42Njc2IDEuMDk3NzFDNC43NDQ4MyAxLjA4NjExIDQuNjE1MjcgMS4xMDM5OSA0LjY5MjE3IDEuMDk0NDRDNC43MTUxMyAxLjA5MTYgNC43MzgxNyAxLjA4OTE3IDQuNzYxMTkgMS4wODY3N0M0LjgxNDAzIDEuMDgxMjQgNC44NjcwNCAxLjA3NzM5IDQuOTIwMDcgMS4wNzQyM0M1LjEwMDg0IDEuMDYzNDggNS4yODIzNyAxLjA2ODUxIDUuNDYyNTIgMS4wODY0QzUuNDgzMzYgMS4wODg0NiA1LjUwNDE3IDEuMDkwOTIgNS41MjQ5NSAxLjA5MzM4QzUuNTk1MDggMS4xMDE2NyA1LjQ2OTQzIDEuMDg1MjYgNS41Mzg5OSAxLjA5NTIxQzUuNTc5NjUgMS4xMDEwMyA1LjYyMDE2IDEuMTA3OTUgNS42NjA1OSAxLjExNTI0QzUuNzQ2NDcgMS4xMzA3MyA1LjgzMTU5IDEuMTUwMyA1LjkxNjA0IDEuMTcyMjdDNi4wNzI4IDEuMjEzMTEgNi4yMjYyMSAxLjI2NjIxIDYuMzc1OTUgMS4zMjc4NkM2LjMxMTExIDEuMzAxMTUgNi40MTg3NyAxLjM0NzAyIDYuNDM1ODQgMS4zNTQ3N0M2LjQ2OTg3IDEuMzcwMiA2LjUwMzU2IDEuMzg2MzkgNi41MzcxNCAxLjQwMjhDNi42MDg2NSAxLjQzNzc5IDYuNjc4ODYgMS40NzU0MyA2Ljc0ODE3IDEuNTE0NjJDNi44NzY2MiAxLjU4NzIzIDcuMDAwNjIgMS42Njc1MyA3LjEyMDkyIDEuNzUyOUM3LjE0ODgyIDEuNzcyNzEgNy4xNzYzNyAxLjc5Mjk3IDcuMjAzODMgMS44MTMzOEM3LjIxNzM5IDEuODIzNDggNy4yMzA4NyAxLjgzMzcgNy4yNDQzMiAxLjg0Mzk2QzcuMjkxNTggMS44Nzk5MiA3LjE5ODggMS44MDgzOSA3LjI0NTI5IDEuODQ0ODJDNy4zMDEwOSAxLjg4ODUzIDcuMzU1NjggMS45MzM3NSA3LjQwOTQ5IDEuOTc5ODJDNy41MDY1MiAyLjA2Mjg4IDcuNTk5OTQgMi4xNTAwOCA3LjY5MDUzIDIuMjQwMTFDNy44NDAwOCAyLjM4ODc5IDcuOTgwNDQgMi41NDY3NyA4LjExMTQ5IDIuNzExOTRDOC4xMjU3MiAyLjcyOTg3IDguMTc1MzMgMi43OTQxNCA4LjExNDg1IDIuNzE1N0M4LjEyNjM2IDIuNzMwNjUgOC4xMzc3NiAyLjc0NTY4IDguMTQ5MSAyLjc2MDc1QzguMTY5NCAyLjc4NzY5IDguMTg5MzQgMi44MTQ5MSA4LjIwOTA1IDIuODQyM0M4LjIzODI1IDIuODgyODYgOC4yNjY3IDIuOTIzOTggOC4yOTQyOSAyLjk2NTY2QzguNDAzNzQgMy4xMzEgOC42Mjg2IDMuMTMxIDguNzM4MDUgMi45NjU2NkM4Ljc2NzA3IDIuOTIxODEgOC43OTcxMiAyLjg3ODY2IDguODI3ODUgMi44MzU5OEM4Ljg0NzgzIDIuODA4MjMgOC44NjgxOSAyLjc4MDc1IDguODg4NzUgMi43NTM0NEM4LjkwMjQyIDIuNzM1MjkgOC45NDkyOCAyLjY3NDc0IDguODg5MzUgMi43NTIxNEM4LjkwNDA5IDIuNzMzMTIgOC45MTkgMi43MTQyNCA4LjkzMzk5IDIuNjk1NDJDOS4wNjcxIDIuNTI4MzQgOS4yMTA3MSAyLjM2OTY4IDkuMzYyNjEgMi4yMTk1NEM5LjQ1NDExIDIuMTI5MDcgOS41NDkzIDIuMDQyMzQgOS42NDczMiAxLjk1ODk3QzkuNjk3MzcgMS45MTY0MSA5Ljc0ODQ3IDEuODc1MDcgOS44MDAxNyAxLjgzNDU2QzkuNzM4OCAxLjg4MjYzIDkuODI2OTQgMS44MTQ1NyA5Ljg0MjEzIDEuODAzMjdDOS44NzQyNyAxLjc3OTM3IDkuOTA2ODMgMS43NTYwNiA5LjkzOTYgMS43MzMwMUMxMC4wNjA4IDEuNjQ3NzMgMTAuMTg2NiAxLjU2OTE1IDEwLjMxNTkgMS40OTY4MkMxMC4zODAyIDEuNDYwODQgMTAuNDQ1NyAxLjQyNzAzIDEwLjUxMTkgMS4zOTQ2N0MxMC41NDU1IDEuMzc4MjMgMTAuNTc5NSAxLjM2MjUxIDEwLjYxMzYgMS4zNDcwNEMxMC42MzA4IDEuMzM5MjYgMTAuNjQ4MSAxLjMzMTcxIDEwLjY2NTQgMS4zMjQxN0MxMC42OTE1IDEuMzEyOTYgMTAuNjg4NSAxLjMxNDIgMTAuNjU2NCAxLjMyNzlDMTAuNjY4MSAxLjMyMzAzIDEwLjY3OTggMS4zMTgyMiAxMC42OTE2IDEuMzEzNDlDMTAuODQyMyAxLjI1MjM1IDEwLjk5NzMgMS4yMDI0NiAxMS4xNTQ4IDEuMTYyMzlDMTEuMjMzMiAxLjE0MjQ4IDExLjMxMjMgMS4xMjU5OSAxMS4zOTE4IDEuMTExNjZDMTEuNDMyMyAxLjEwNDM1IDExLjQ3MyAxLjA5ODE1IDExLjUxMzggMS4wOTIzMUMxMS40NDcxIDEuMTAxODYgMTEuNTE3MSAxLjA5MjI2IDExLjUyODEgMS4wOTA5NUMxMS41NTU5IDEuMDg3NjcgMTEuNTgzOCAxLjA4NDk5IDExLjYxMTcgMS4wODI0QzExLjc5MyAxLjA2NTUzIDExLjk3NTcgMS4wNjUxMyAxMi4xNTczIDEuMDc3MUMxMi4yMDMgMS4wODAxMSAxMi4yNDg1IDEuMDg0NDQgMTIuMjk0IDEuMDg5MjFDMTIuMzE3MiAxLjA5MTYzIDEyLjM0MDIgMS4wOTQ1IDEyLjM2MzMgMS4wOTczNEMxMi4zMDM2IDEuMDg5OTQgMTIuMzgxMyAxLjEwMDIyIDEyLjM4ODEgMS4xMDEyM0MxMi40OTIxIDEuMTE2ODUgMTIuNTk1MiAxLjEzNzg1IDEyLjY5NzUgMS4xNjE5M0MxMy4xNTg2IDEuMjcwNDggMTMuNTM3OCAxLjQ0MDM3IDEzLjk0NjQgMS42Nzc2MUMxNC4wOTA0IDEuNzYxMjkgMTQuMjMxNCAxLjg1MDcgMTQuMzY1NiAxLjk0OTVDMTQuMzc3IDEuOTU3OTEgMTQuMzg4NCAxLjk2NjQ4IDE0LjM5OTcgMS45NzUwM0MxNC40NDE5IDIuMDA2ODggMTQuMzUxIDEuOTM2OTYgMTQuMzkyNiAxLjk2OTQ1QzE0LjQxNDkgMS45ODY4MyAxNC40MzY5IDIuMDA0NjIgMTQuNDU4OCAyLjAyMjUyQzE0LjUwNTkgMi4wNjExNSAxNC41NTE5IDIuMTAxMyAxNC41OTcxIDIuMTQyMjhDMTQuNjgzNSAyLjIyMDczIDE0Ljc2NTYgMi4zMDM4OCAxNC44NDM5IDIuMzkwMzVDMTQuODgxNSAyLjQzMTc2IDE0LjkxNzggMi40NzQyNyAxNC45NTM0IDIuNTE3MzZDMTQuOTcxMiAyLjUzODkxIDE0Ljk4ODcgMi41NjA3NyAxNS4wMDYgMi41ODI3NEMxNS4wMzg0IDIuNjIzODggMTQuOTY4MiAyLjUzMzM1IDE1IDIuNTc1QzE1LjAxMTQgMi41ODk4MyAxNS4wMjI1IDIuNjA0NzkgMTUuMDMzNiAyLjYxOTc4QzE1LjE3MzYgMi44MDg3MSAxNS4yOTQ2IDMuMDExNDIgMTUuMzk4NSAzLjIyMjI0QzE1LjQyMzggMy4yNzM1NiAxNS40NDc3IDMuMzI1NTMgMTUuNDcwOSAzLjM3NzgyQzE1LjQ3NjcgMy4zOTA5NiAxNS40ODI0IDMuNDA0MTQgMTUuNDg4MSAzLjQxNzM0QzE1LjUwOTMgMy40NjY1NiAxNS40NjQgMy4zNTk0NSAxNS40ODQ1IDMuNDA5MDJDMTUuNDk3NSAzLjQ0MDEzIDE1LjUwOTkgMy40NzE0OCAxNS41MjIxIDMuNTAyODlDMTUuNTY2MSAzLjYxNjMyIDE1LjYwNDkgMy43MzE3NSAxNS42Mzk4IDMuODQ4MzNDMTUuNzExNSA0LjA4ODMyIDE1Ljc2MyA0LjMzNDE2IDE1Ljc5ODQgNC41ODIwNEMxNS44MDY0IDQuNjM4MDYgMTUuNzkwMSA0LjUxODQyIDE1Ljc5NzUgNC41NzQ2M0MxNS43OTk1IDQuNTg5OTIgMTUuODAxNCA0LjYwNTIxIDE1LjgwMzMgNC42MjA1QzE1LjgwNyA0LjY1MTIgMTUuODEwNCA0LjY4MTk3IDE1LjgxMzcgNC43MTI3M0MxNS44MjA4IDQuNzc5OTQgMTUuODI2NCA0Ljg0NzMyIDE1LjgzMTIgNC45MTQ3NEMxNS44NDA0IDUuMDQ2NTggMTUuODQ0NyA1LjE3ODc2IDE1Ljg0NTMgNS4zMTA5M0MxNS44NDY0IDUuNTg0MTggMTUuODI4NyA1Ljg1NzM3IDE1Ljc5NjEgNi4xMjg2MkMxNS43OTQxIDYuMTQ1MjkgMTUuNzkxOSA2LjE2MTkyIDE1Ljc4OTggNi4xNzg1NkMxNS43ODIyIDYuMjM4MjcgMTUuNzk4MyA2LjExNzIyIDE1Ljc5MDEgNi4xNzY5N0MxNS43ODU1IDYuMjEwNDQgMTUuNzgwNiA2LjI0Mzg5IDE1Ljc3NTUgNi4yNzczMUMxNS43NjQ0IDYuMzUwMzEgMTUuNzUyIDYuNDIzMSAxNS43Mzg4IDYuNDk1NzNDMTUuNzEyOSA2LjYzNzY5IDE1LjY4MjMgNi43Nzg4IDE1LjY0ODQgNi45MTkwNUMxNS41Nzg0IDcuMjA4NDMgMTUuNDkwOSA3LjQ5MzQ4IDE1LjM4OTcgNy43NzM0M0MxNS4zNjQ4IDcuODQyMzIgMTUuMzM4OCA3LjkxMDggMTUuMzEyMSA3Ljk3OTAyQzE1LjI5ODcgOC4wMTMzOCAxNS4yODQ5IDguMDQ3NiAxNS4yNzExIDguMDgxNzlDMTUuMjY0MSA4LjA5ODk2IDE1LjI1NyA4LjExNjA0IDE1LjI1IDguMTMzMTVDMTUuMjQ1MiA4LjE0NDU4IDE1LjI0MDUgOC4xNTU5OCAxNS4yMzU3IDguMTY3MzhDMTUuMjQ5NiA4LjEzNDUzIDE1LjI1MSA4LjEzMTE3IDE1LjIzOTkgOC4xNTczNEMxNS4xNzg2IDguMzAxMzcgMTUuMTEzMSA4LjQ0MzU1IDE1LjA0NDMgOC41ODQxNkMxNC45MDI4IDguODczNTEgMTQuNzQ1MSA5LjE1NDgzIDE0LjU3NDUgOS40Mjc5OUMxNC40ODY4IDkuNTY4NDQgMTQuMzk1IDkuNzA2MzQgMTQuMzAwMiA5Ljg0MjEzQzE0LjI1NCA5LjkwODIxIDE0LjIwNjkgOS45NzM1NSAxNC4xNTkyIDEwLjAzODVDMTQuMTM1MSAxMC4wNzExIDE0LjExMDggMTAuMTAzNiAxNC4wODY0IDEwLjEzNkMxNC4wNzQxIDEwLjE1MjIgMTQuMDYxNyAxMC4xNjg0IDE0LjA0OTQgMTAuMTg0NUMxNC4wMzE5IDEwLjIwNzMgMTQuMDMyOSAxMC4yMDYxIDE0LjA1MjIgMTAuMTgxQzE0LjA0MzkgMTAuMTkxOCAxNC4wMzU1IDEwLjIwMjUgMTQuMDI3MSAxMC4yMTMyQzEzLjgxMzUgMTAuNDg2OSAxMy41ODQ5IDEwLjc0ODggMTMuMzQ0NSAxMC45OTkyQzEzLjA5NDggMTEuMjU5NCAxMi44MzA5IDExLjUwNTggMTIuNTU2IDExLjczOTFDMTIuNDg4NCAxMS43OTY1IDEyLjQxOTkgMTEuODUyOCAxMi4zNTA5IDExLjkwODZDMTIuMzE2MiAxMS45MzY2IDEyLjI4MTIgMTEuOTY0MyAxMi4yNDYxIDExLjk5MkMxMi4yMjg1IDEyLjAwNTggMTIuMjEwOCAxMi4wMTk2IDEyLjE5MzEgMTIuMDMzM0MxMi4yMzc3IDExLjk5ODcgMTIuMTYzNiAxMi4wNTU4IDEyLjE1NiAxMi4wNjE2QzEyLjAwNSAxMi4xNzY1IDExLjg1MDggMTIuMjg3MSAxMS42OTQyIDEyLjM5NDFDMTEuMzcwNiAxMi42MTUzIDExLjAzNDggMTIuODE4NSAxMC42OTA0IDEzLjAwNTVDMTAuNTEyMiAxMy4xMDIzIDEwLjMzMTMgMTMuMTkzOSAxMC4xNDg0IDEzLjI4MTVDMTAuMDU5IDEzLjMyNDMgOS45NjkwNCAxMy4zNjU4IDkuODc4NjggMTMuNDA2NEM5LjgzMzEgMTMuNDI2OSA5Ljc4NzMzIDEzLjQ0NjkgOS43NDE1MSAxMy40NjY5QzkuNzE4NSAxMy40NzY5IDkuNjk1NDEgMTMuNDg2OCA5LjY3MjMzIDEzLjQ5NjZDOS42NDQyIDEzLjUwODYgOS42NDE0NiAxMy41MDk4IDkuNjY0MTcgMTMuNTAwMkM5LjY0ODY0IDEzLjUwNjcgOS42MzMxMyAxMy41MTMyIDkuNjE3NTggMTMuNTE5NkM5LjIzNDkgMTMuNjc4OCA4Ljg0Mzk4IDEzLjgxNzkgOC40NDc4NiAxMy45Mzk4QzguMzE0MDkgMTMuOTgwOSA4LjIzMDQgMTQuMTE3OCA4LjI2ODM5IDE0LjI1NTlDOC4zMDQ3IDE0LjM4NzggOC40NTA2NCAxNC40NzY1IDguNTg0NSAxNC40MzUzQzEwLjE1MzQgMTMuOTUyNSAxMS42MjYgMTMuMTg3MSAxMi44ODU3IDEyLjEzMUMxMy45NDI1IDExLjI0NSAxNC44MzQ5IDEwLjE0NTYgMTUuNDU0MyA4LjkxMTY1QzE1Ljk5NDIgNy44MzYwOCAxNi4zMzU3IDYuNjQ3NDQgMTYuMzU4MyA1LjQzOTY3QzE2LjM3NzQgNC40MTYyOCAxNi4xNDkgMy4zNTcwNCAxNS41NzQyIDIuNDk3ODlDMTUuMjkyOSAyLjA3NzMyIDE0LjkzNzEgMS43MTgxNiAxNC41MjA1IDEuNDMxMzRDMTMuNzk1NiAwLjkzMjI5NSAxMi45Mjk0IDAuNTkyODIyIDEyLjA0NSAwLjU1NzIxNEMxMC43NzE3IDAuNTA1OTQ5IDkuNjAxMjYgMS4xNzE1NyA4Ljc2OTcgMi4wOTY4NUM4LjU5Nzc5IDIuMjg4MTMgOC40MzYzNCAyLjQ5MTcyIDguMjk0MzEgMi43MDYyOUM4LjQ0MjIzIDIuNzA2MjkgOC41OTAxNSAyLjcwNjI5IDguNzM4MDcgMi43MDYyOUM4LjIyNDM0IDEuOTMwMjMgNy40ODI1NSAxLjI1MzM4IDYuNjI2NCAwLjg4MDQyNEM1LjkzMDUgMC41NzcyNTggNS4xODU1NSAwLjQ5MDE2NCA0LjQzNzIxIDAuNjE3MTc5QzMuOTg3NjYgMC42OTM0OCAzLjU1NTQ2IDAuODU2NTA4IDMuMTQ4NDkgMS4wNTkxNUMyLjgxOTQ1IDEuMjIyOTYgMi41MDY1MyAxLjQxODQyIDIuMjIxMTUgMS42NTAxN0MxLjQ0OTA0IDIuMjc3MTMgMC45NzMwMjYgMy4yMDk5NSAwLjc4MzczMiA0LjE3NTE5QzAuNTY1MDkgNS4yOTAwNCAwLjY4NzM3IDYuNDUzODEgMS4wMjA1MSA3LjUzMzM5QzEuNDEwODQgOC43OTgyNyAyLjA5NDA3IDkuOTU5MTYgMi45NTY0MSAxMC45NTg5QzMuOTQ3NTcgMTIuMTA4MSA1LjE5NjE0IDEzLjAzMDYgNi41NTgyIDEzLjY5MzNDNy4xNjcxMiAxMy45ODk2IDcuODAwOCAxNC4yMzYyIDguNDQ3ODggMTQuNDM1M0M4LjU4MTc0IDE0LjQ3NjUgOC43Mjc2OCAxNC4zODc4IDguNzYzOTkgMTQuMjU1OUM4LjgwMTg5IDE0LjExNzcgOC43MTgyMSAxMy45ODA5IDguNTg0NDQgMTMuOTM5N1pcIlxuICAgIH0pXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIk04LjU4NDQ0IDEzLjkzOTdDNy43NjEzOSAxMy42ODY0IDcuMDUzMzQgMTMuMzkzNyA2LjI5OTc2IDEyLjk4MjVDNS45NTYzMyAxMi43OTUxIDUuNjIyODUgMTIuNTg5NSA1LjMwMDMgMTIuMzY4MUM1LjE0NDE2IDEyLjI2MDkgNC45OTEwOCAxMi4xNDkzIDQuODQwNjMgMTIuMDM0M0M0Ljc4MTMyIDExLjk4ODkgNC44ODAzOCAxMi4wNjUyIDQuODIxNTYgMTIuMDE5NUM0LjgwMzg4IDEyLjAwNTggNC43ODYzIDExLjk5MTkgNC43Njg2OSAxMS45NzgxQzQuNzMzNjQgMTEuOTUwNSA0LjY5ODg0IDExLjkyMjUgNC42NjQxMyAxMS44OTQ1QzQuNTg5NDggMTEuODM0MiA0LjUxNTgyIDExLjc3MjcgNC40NDI4IDExLjcxMDVDMy45MDQ5OSAxMS4yNTIgMy40MTM4MSAxMC43Mzg5IDIuOTgwMTYgMTAuMTgwOUMzLjAxODU2IDEwLjIzMDMgMi45NzY1MSAxMC4xNzYgMi45NzA2NCAxMC4xNjgzQzIuOTU4MyAxMC4xNTIyIDIuOTQ2MDQgMTAuMTM1OSAyLjkzMzggMTAuMTE5N0MyLjkwOTM5IDEwLjA4NzQgMi44ODUyNyAxMC4wNTQ4IDIuODYxMjYgMTAuMDIyMUMyLjgwOTYxIDkuOTUxODkgMi43NTkwOCA5Ljg4MDggMi43MDkzMiA5LjgwOTJDMi42MTQ5MiA5LjY3MzQ1IDIuNTI0NDEgOS41MzUgMi40MzcxIDkuMzk0NTdDMi4yNjczIDkuMTIxNDUgMi4xMTIxMyA4LjgzOTI2IDEuOTcxNDcgOC41NTAwNkMxLjkzODQ5IDguNDgyMjggMS45MDY1NyA4LjQxMzk2IDEuODc1MzEgOC4zNDUzN0MxLjg1OTc4IDguMzExMyAxLjg0NDU5IDguMjc3MDkgMS44Mjk0OCA4LjI0Mjg0QzEuODIxOTUgOC4yMjU3NSAxLjgxNDU2IDguMjA4NjQgMS44MDcxNCA4LjE5MTUyQzEuODAxNjcgOC4xNzg4OSAxLjc2ODU2IDguMTAwNjEgMS43OTY2NCA4LjE2NzM2QzEuNzM3MjggOC4wMjYyIDEuNjgyMDUgNy44ODMyOSAxLjYzMDI5IDcuNzM5MTZDMS41Mjk4MiA3LjQ1OTQyIDEuNDQ0OTggNy4xNzQwNyAxLjM3NTc1IDYuODg1MDJDMS4zNDIxOCA2Ljc0NDkyIDEuMzEzMDEgNi42MDM3OSAxLjI4NzQ2IDYuNDYyMDJDMS4yNzU0IDYuMzk1MDIgMS4yNjQ1IDYuMzI3ODIgMS4yNTQzIDYuMjYwNTJDMS4yNDkyNSA2LjIyNzEzIDEuMjQ0NTMgNi4xOTM2OSAxLjIzOTk0IDYuMTYwMjNDMS4yNTEzNiA2LjI0MzU4IDEuMjM0OTUgNi4xMTc3MiAxLjIzMjMxIDYuMDk1MzJDMS4yMDA0MiA1LjgyNDQ0IDEuMTg1MzUgNS41NTE1OCAxLjE4NzIxIDUuMjc4ODVDMS4xODgxMSA1LjE0NjkxIDEuMTkzNzQgNS4wMTUwMSAxLjIwMzM0IDQuODgzNDNDMS4yMDc4OCA0LjgyMTI4IDEuMjEzNjggNC43NTkyMiAxLjIyMDIzIDQuNjk3MjZDMS4yMjM1IDQuNjY2NTEgMS4yMjcxMyA0LjYzNTggMS4yMzA4OSA0LjYwNTExQzEuMjMyNzggNC41ODk4MiAxLjIzNDc3IDQuNTc0NTcgMS4yMzY3OCA0LjU1OTNDMS4yMjU2MiA0LjY0NDI1IDEuMjM1NjMgNC41Njk1NiAxLjIzODIzIDQuNTUxNjNDMS4yNzQyOCA0LjMwNDE5IDEuMzI4NjEgNC4wNTk0MyAxLjQwMDk3IDMuODIwMDZDMS40MzYxNCAzLjcwMzc1IDEuNDc2MzUgMy41ODg5OSAxLjUyMDcyIDMuNDc1ODdDMS41MzEyNSAzLjQ0OSAxLjU0MjE5IDMuNDIyMjkgMS41NTMyNiAzLjM5NTY0QzEuNTE5NDEgMy40NzcxNiAxLjU1ODg5IDMuMzgzMzQgMS41NjcxNyAzLjM2NDY0QzEuNTkyMjYgMy4zMDgwMyAxLjYxODg2IDMuMjUyMDkgMS42NDY0MyAzLjE5NjY0QzEuNzUxMDEgMi45ODYyNCAxLjg3NDc2IDIuNzg1NDkgMi4wMTUzNCAyLjU5NzI0QzIuMDIzNzEgMi41ODYwMyAyLjAzMjIxIDIuNTc0OTIgMi4wNDA3MSAyLjU2MzhDMS45OTI3NSAyLjYyNjU2IDIuMDI0NDYgMi41ODQ5NiAyLjAzNDkzIDIuNTcxNjlDMi4wNTIyMyAyLjU0OTc0IDIuMDY5OTMgMi41MjgwOCAyLjA4NzczIDIuNTA2NTNDMi4xMjYzMSAyLjQ1OTg0IDIuMTY2MjkgMi40MTQzNCAyLjIwNzEzIDIuMzY5NjJDMi4yODU4NyAyLjI4MzQxIDIuMzY5MjYgMi4yMDE1MSAyLjQ1NiAyLjEyMzM5QzIuNDk3ODcgMi4wODU2OCAyLjU0MDg0IDIuMDQ5MiAyLjU4NDQzIDIuMDEzNTJDMi42MDYzMSAxLjk5NTYxIDIuNjI4NTIgMS45NzgwOCAyLjY1MDg0IDEuOTYwN0MyLjU4MTY0IDIuMDE0NjYgMi42NzE5MSAxLjk0NTU3IDIuNjg5NjIgMS45MzI2NUMyLjgzMzM4IDEuODI3NyAyLjk4NTg3IDEuNzM0OCAzLjE0MDEzIDEuNjQ2M0MzLjU0MzkzIDEuNDE0NTkgMy45MjQzNyAxLjI1NTY3IDQuMzgzMSAxLjE1MDcyQzQuNDc3MTYgMS4xMjkyMSA0LjU3MjE5IDEuMTEyMDQgNC42Njc2IDEuMDk3NzFDNC43NDQ4MyAxLjA4NjExIDQuNjE1MjcgMS4xMDM5OSA0LjY5MjE3IDEuMDk0NDRDNC43MTUxMyAxLjA5MTYgNC43MzgxNyAxLjA4OTE3IDQuNzYxMTkgMS4wODY3N0M0LjgxNDAzIDEuMDgxMjQgNC44NjcwNCAxLjA3NzM5IDQuOTIwMDcgMS4wNzQyM0M1LjEwMDg0IDEuMDYzNDggNS4yODIzNyAxLjA2ODUxIDUuNDYyNTIgMS4wODY0QzUuNDgzMzYgMS4wODg0NiA1LjUwNDE3IDEuMDkwOTIgNS41MjQ5NSAxLjA5MzM4QzUuNTk1MDggMS4xMDE2NyA1LjQ2OTQzIDEuMDg1MjYgNS41Mzg5OSAxLjA5NTIxQzUuNTc5NjUgMS4xMDEwMyA1LjYyMDE2IDEuMTA3OTUgNS42NjA1OSAxLjExNTI0QzUuNzQ2NDcgMS4xMzA3MyA1LjgzMTU5IDEuMTUwMyA1LjkxNjA0IDEuMTcyMjdDNi4wNzI4IDEuMjEzMTEgNi4yMjYyMSAxLjI2NjIxIDYuMzc1OTUgMS4zMjc4NkM2LjMxMTExIDEuMzAxMTUgNi40MTg3NyAxLjM0NzAyIDYuNDM1ODQgMS4zNTQ3N0M2LjQ2OTg3IDEuMzcwMiA2LjUwMzU2IDEuMzg2MzkgNi41MzcxNCAxLjQwMjhDNi42MDg2NSAxLjQzNzc5IDYuNjc4ODYgMS40NzU0MyA2Ljc0ODE3IDEuNTE0NjJDNi44NzY2MiAxLjU4NzIzIDcuMDAwNjIgMS42Njc1MyA3LjEyMDkyIDEuNzUyOUM3LjE0ODgyIDEuNzcyNzEgNy4xNzYzNyAxLjc5Mjk3IDcuMjAzODMgMS44MTMzOEM3LjIxNzM5IDEuODIzNDggNy4yMzA4NyAxLjgzMzcgNy4yNDQzMiAxLjg0Mzk2QzcuMjkxNTggMS44Nzk5MiA3LjE5ODggMS44MDgzOSA3LjI0NTI5IDEuODQ0ODJDNy4zMDEwOSAxLjg4ODUzIDcuMzU1NjggMS45MzM3NSA3LjQwOTQ5IDEuOTc5ODJDNy41MDY1MiAyLjA2Mjg4IDcuNTk5OTQgMi4xNTAwOCA3LjY5MDUzIDIuMjQwMTFDNy44NDAwOCAyLjM4ODc5IDcuOTgwNDQgMi41NDY3NyA4LjExMTQ5IDIuNzExOTRDOC4xMjU3MiAyLjcyOTg3IDguMTc1MzMgMi43OTQxNCA4LjExNDg1IDIuNzE1N0M4LjEyNjM2IDIuNzMwNjUgOC4xMzc3NiAyLjc0NTY4IDguMTQ5MSAyLjc2MDc1QzguMTY5NCAyLjc4NzY5IDguMTg5MzQgMi44MTQ5MSA4LjIwOTA1IDIuODQyM0M4LjIzODI1IDIuODgyODYgOC4yNjY3IDIuOTIzOTggOC4yOTQyOSAyLjk2NTY2QzguNDAzNzQgMy4xMzEgOC42Mjg2IDMuMTMxIDguNzM4MDUgMi45NjU2NkM4Ljc2NzA3IDIuOTIxODEgOC43OTcxMiAyLjg3ODY2IDguODI3ODUgMi44MzU5OEM4Ljg0NzgzIDIuODA4MjMgOC44NjgxOSAyLjc4MDc1IDguODg4NzUgMi43NTM0NEM4LjkwMjQyIDIuNzM1MjkgOC45NDkyOCAyLjY3NDc0IDguODg5MzUgMi43NTIxNEM4LjkwNDA5IDIuNzMzMTIgOC45MTkgMi43MTQyNCA4LjkzMzk5IDIuNjk1NDJDOS4wNjcxIDIuNTI4MzQgOS4yMTA3MSAyLjM2OTY4IDkuMzYyNjEgMi4yMTk1NEM5LjQ1NDExIDIuMTI5MDcgOS41NDkzIDIuMDQyMzQgOS42NDczMiAxLjk1ODk3QzkuNjk3MzcgMS45MTY0MSA5Ljc0ODQ3IDEuODc1MDcgOS44MDAxNyAxLjgzNDU2QzkuNzM4OCAxLjg4MjYzIDkuODI2OTQgMS44MTQ1NyA5Ljg0MjEzIDEuODAzMjdDOS44NzQyNyAxLjc3OTM3IDkuOTA2ODMgMS43NTYwNiA5LjkzOTYgMS43MzMwMUMxMC4wNjA4IDEuNjQ3NzMgMTAuMTg2NiAxLjU2OTE1IDEwLjMxNTkgMS40OTY4MkMxMC4zODAyIDEuNDYwODQgMTAuNDQ1NyAxLjQyNzAzIDEwLjUxMTkgMS4zOTQ2N0MxMC41NDU1IDEuMzc4MjMgMTAuNTc5NSAxLjM2MjUxIDEwLjYxMzYgMS4zNDcwNEMxMC42MzA4IDEuMzM5MjYgMTAuNjQ4MSAxLjMzMTcxIDEwLjY2NTQgMS4zMjQxN0MxMC42OTE1IDEuMzEyOTYgMTAuNjg4NSAxLjMxNDIgMTAuNjU2NCAxLjMyNzlDMTAuNjY4MSAxLjMyMzAzIDEwLjY3OTggMS4zMTgyMiAxMC42OTE2IDEuMzEzNDlDMTAuODQyMyAxLjI1MjM1IDEwLjk5NzMgMS4yMDI0NiAxMS4xNTQ4IDEuMTYyMzlDMTEuMjMzMiAxLjE0MjQ4IDExLjMxMjMgMS4xMjU5OSAxMS4zOTE4IDEuMTExNjZDMTEuNDMyMyAxLjEwNDM1IDExLjQ3MyAxLjA5ODE1IDExLjUxMzggMS4wOTIzMUMxMS40NDcxIDEuMTAxODYgMTEuNTE3MSAxLjA5MjI2IDExLjUyODEgMS4wOTA5NUMxMS41NTU5IDEuMDg3NjcgMTEuNTgzOCAxLjA4NDk5IDExLjYxMTcgMS4wODI0QzExLjc5MyAxLjA2NTUzIDExLjk3NTcgMS4wNjUxMyAxMi4xNTczIDEuMDc3MUMxMi4yMDMgMS4wODAxMSAxMi4yNDg1IDEuMDg0NDQgMTIuMjk0IDEuMDg5MjFDMTIuMzE3MiAxLjA5MTYzIDEyLjM0MDIgMS4wOTQ1IDEyLjM2MzMgMS4wOTczNEMxMi4zMDM2IDEuMDg5OTQgMTIuMzgxMyAxLjEwMDIyIDEyLjM4ODEgMS4xMDEyM0MxMi40OTIxIDEuMTE2ODUgMTIuNTk1MiAxLjEzNzg1IDEyLjY5NzUgMS4xNjE5M0MxMy4xNTg2IDEuMjcwNDggMTMuNTM3OCAxLjQ0MDM3IDEzLjk0NjQgMS42Nzc2MUMxNC4wOTA0IDEuNzYxMjkgMTQuMjMxNCAxLjg1MDcgMTQuMzY1NiAxLjk0OTVDMTQuMzc3IDEuOTU3OTEgMTQuMzg4NCAxLjk2NjQ4IDE0LjM5OTcgMS45NzUwM0MxNC40NDE5IDIuMDA2ODggMTQuMzUxIDEuOTM2OTYgMTQuMzkyNiAxLjk2OTQ1QzE0LjQxNDkgMS45ODY4MyAxNC40MzY5IDIuMDA0NjIgMTQuNDU4OCAyLjAyMjUyQzE0LjUwNTkgMi4wNjExNSAxNC41NTE5IDIuMTAxMyAxNC41OTcxIDIuMTQyMjhDMTQuNjgzNSAyLjIyMDczIDE0Ljc2NTYgMi4zMDM4OCAxNC44NDM5IDIuMzkwMzVDMTQuODgxNSAyLjQzMTc2IDE0LjkxNzggMi40NzQyNyAxNC45NTM0IDIuNTE3MzZDMTQuOTcxMiAyLjUzODkxIDE0Ljk4ODcgMi41NjA3NyAxNS4wMDYgMi41ODI3NEMxNS4wMzg0IDIuNjIzODggMTQuOTY4MiAyLjUzMzM1IDE1IDIuNTc1QzE1LjAxMTQgMi41ODk4MyAxNS4wMjI1IDIuNjA0NzkgMTUuMDMzNiAyLjYxOTc4QzE1LjE3MzYgMi44MDg3MSAxNS4yOTQ2IDMuMDExNDIgMTUuMzk4NSAzLjIyMjI0QzE1LjQyMzggMy4yNzM1NiAxNS40NDc3IDMuMzI1NTMgMTUuNDcwOSAzLjM3NzgyQzE1LjQ3NjcgMy4zOTA5NiAxNS40ODI0IDMuNDA0MTQgMTUuNDg4MSAzLjQxNzM0QzE1LjUwOTMgMy40NjY1NiAxNS40NjQgMy4zNTk0NSAxNS40ODQ1IDMuNDA5MDJDMTUuNDk3NSAzLjQ0MDEzIDE1LjUwOTkgMy40NzE0OCAxNS41MjIxIDMuNTAyODlDMTUuNTY2MSAzLjYxNjMyIDE1LjYwNDkgMy43MzE3NSAxNS42Mzk4IDMuODQ4MzNDMTUuNzExNSA0LjA4ODMyIDE1Ljc2MyA0LjMzNDE2IDE1Ljc5ODQgNC41ODIwNEMxNS44MDY0IDQuNjM4MDYgMTUuNzkwMSA0LjUxODQyIDE1Ljc5NzUgNC41NzQ2M0MxNS43OTk1IDQuNTg5OTIgMTUuODAxNCA0LjYwNTIxIDE1LjgwMzMgNC42MjA1QzE1LjgwNyA0LjY1MTIgMTUuODEwNCA0LjY4MTk3IDE1LjgxMzcgNC43MTI3M0MxNS44MjA4IDQuNzc5OTQgMTUuODI2NCA0Ljg0NzMyIDE1LjgzMTIgNC45MTQ3NEMxNS44NDA0IDUuMDQ2NTggMTUuODQ0NyA1LjE3ODc2IDE1Ljg0NTMgNS4zMTA5M0MxNS44NDY0IDUuNTg0MTggMTUuODI4NyA1Ljg1NzM3IDE1Ljc5NjEgNi4xMjg2MkMxNS43OTQxIDYuMTQ1MjkgMTUuNzkxOSA2LjE2MTkyIDE1Ljc4OTggNi4xNzg1NkMxNS43ODIyIDYuMjM4MjcgMTUuNzk4MyA2LjExNzIyIDE1Ljc5MDEgNi4xNzY5N0MxNS43ODU1IDYuMjEwNDQgMTUuNzgwNiA2LjI0Mzg5IDE1Ljc3NTUgNi4yNzczMUMxNS43NjQ0IDYuMzUwMzEgMTUuNzUyIDYuNDIzMSAxNS43Mzg4IDYuNDk1NzNDMTUuNzEyOSA2LjYzNzY5IDE1LjY4MjMgNi43Nzg4IDE1LjY0ODQgNi45MTkwNUMxNS41Nzg0IDcuMjA4NDMgMTUuNDkwOSA3LjQ5MzQ4IDE1LjM4OTcgNy43NzM0M0MxNS4zNjQ4IDcuODQyMzIgMTUuMzM4OCA3LjkxMDggMTUuMzEyMSA3Ljk3OTAyQzE1LjI5ODcgOC4wMTMzOCAxNS4yODQ5IDguMDQ3NiAxNS4yNzExIDguMDgxNzlDMTUuMjY0MSA4LjA5ODk2IDE1LjI1NyA4LjExNjA0IDE1LjI1IDguMTMzMTVDMTUuMjQ1MiA4LjE0NDU4IDE1LjI0MDUgOC4xNTU5OCAxNS4yMzU3IDguMTY3MzhDMTUuMjQ5NiA4LjEzNDUzIDE1LjI1MSA4LjEzMTE3IDE1LjIzOTkgOC4xNTczNEMxNS4xNzg2IDguMzAxMzcgMTUuMTEzMSA4LjQ0MzU1IDE1LjA0NDMgOC41ODQxNkMxNC45MDI4IDguODczNTEgMTQuNzQ1MSA5LjE1NDgzIDE0LjU3NDUgOS40Mjc5OUMxNC40ODY4IDkuNTY4NDQgMTQuMzk1IDkuNzA2MzQgMTQuMzAwMiA5Ljg0MjEzQzE0LjI1NCA5LjkwODIxIDE0LjIwNjkgOS45NzM1NSAxNC4xNTkyIDEwLjAzODVDMTQuMTM1MSAxMC4wNzExIDE0LjExMDggMTAuMTAzNiAxNC4wODY0IDEwLjEzNkMxNC4wNzQxIDEwLjE1MjIgMTQuMDYxNyAxMC4xNjg0IDE0LjA0OTQgMTAuMTg0NUMxNC4wMzE5IDEwLjIwNzMgMTQuMDMyOSAxMC4yMDYxIDE0LjA1MjIgMTAuMTgxQzE0LjA0MzkgMTAuMTkxOCAxNC4wMzU1IDEwLjIwMjUgMTQuMDI3MSAxMC4yMTMyQzEzLjgxMzUgMTAuNDg2OSAxMy41ODQ5IDEwLjc0ODggMTMuMzQ0NSAxMC45OTkyQzEzLjA5NDggMTEuMjU5NCAxMi44MzA5IDExLjUwNTggMTIuNTU2IDExLjczOTFDMTIuNDg4NCAxMS43OTY1IDEyLjQxOTkgMTEuODUyOCAxMi4zNTA5IDExLjkwODZDMTIuMzE2MiAxMS45MzY2IDEyLjI4MTIgMTEuOTY0MyAxMi4yNDYxIDExLjk5MkMxMi4yMjg1IDEyLjAwNTggMTIuMjEwOCAxMi4wMTk2IDEyLjE5MzEgMTIuMDMzM0MxMi4yMzc3IDExLjk5ODcgMTIuMTYzNiAxMi4wNTU4IDEyLjE1NiAxMi4wNjE2QzEyLjAwNSAxMi4xNzY1IDExLjg1MDggMTIuMjg3MSAxMS42OTQyIDEyLjM5NDFDMTEuMzcwNiAxMi42MTUzIDExLjAzNDggMTIuODE4NSAxMC42OTA0IDEzLjAwNTVDMTAuNTEyMiAxMy4xMDIzIDEwLjMzMTMgMTMuMTkzOSAxMC4xNDg0IDEzLjI4MTVDMTAuMDU5IDEzLjMyNDMgOS45NjkwNCAxMy4zNjU4IDkuODc4NjggMTMuNDA2NEM5LjgzMzEgMTMuNDI2OSA5Ljc4NzMzIDEzLjQ0NjkgOS43NDE1MSAxMy40NjY5QzkuNzE4NSAxMy40NzY5IDkuNjk1NDEgMTMuNDg2OCA5LjY3MjMzIDEzLjQ5NjZDOS42NDQyIDEzLjUwODYgOS42NDE0NiAxMy41MDk4IDkuNjY0MTcgMTMuNTAwMkM5LjY0ODY0IDEzLjUwNjcgOS42MzMxMyAxMy41MTMyIDkuNjE3NTggMTMuNTE5NkM5LjIzNDkgMTMuNjc4OCA4Ljg0Mzk4IDEzLjgxNzkgOC40NDc4NiAxMy45Mzk4QzguMzE0MDkgMTMuOTgwOSA4LjIzMDQgMTQuMTE3OCA4LjI2ODM5IDE0LjI1NTlDOC4zMDQ3IDE0LjM4NzggOC40NTA2NCAxNC40NzY1IDguNTg0NSAxNC40MzUzQzEwLjE1MzQgMTMuOTUyNSAxMS42MjYgMTMuMTg3MSAxMi44ODU3IDEyLjEzMUMxMy45NDI1IDExLjI0NSAxNC44MzQ5IDEwLjE0NTYgMTUuNDU0MyA4LjkxMTY1QzE1Ljk5NDIgNy44MzYwOCAxNi4zMzU3IDYuNjQ3NDQgMTYuMzU4MyA1LjQzOTY3QzE2LjM3NzQgNC40MTYyOCAxNi4xNDkgMy4zNTcwNCAxNS41NzQyIDIuNDk3ODlDMTUuMjkyOSAyLjA3NzMyIDE0LjkzNzEgMS43MTgxNiAxNC41MjA1IDEuNDMxMzRDMTMuNzk1NiAwLjkzMjI5NSAxMi45Mjk0IDAuNTkyODIyIDEyLjA0NSAwLjU1NzIxNEMxMC43NzE3IDAuNTA1OTQ5IDkuNjAxMjYgMS4xNzE1NyA4Ljc2OTcgMi4wOTY4NUM4LjU5Nzc5IDIuMjg4MTMgOC40MzYzNCAyLjQ5MTcyIDguMjk0MzEgMi43MDYyOUM4LjQ0MjIzIDIuNzA2MjkgOC41OTAxNSAyLjcwNjI5IDguNzM4MDcgMi43MDYyOUM4LjIyNDM0IDEuOTMwMjMgNy40ODI1NSAxLjI1MzM4IDYuNjI2NCAwLjg4MDQyNEM1LjkzMDUgMC41NzcyNTggNS4xODU1NSAwLjQ5MDE2NCA0LjQzNzIxIDAuNjE3MTc5QzMuOTg3NjYgMC42OTM0OCAzLjU1NTQ2IDAuODU2NTA4IDMuMTQ4NDkgMS4wNTkxNUMyLjgxOTQ1IDEuMjIyOTYgMi41MDY1MyAxLjQxODQyIDIuMjIxMTUgMS42NTAxN0MxLjQ0OTA0IDIuMjc3MTMgMC45NzMwMjYgMy4yMDk5NSAwLjc4MzczMiA0LjE3NTE5QzAuNTY1MDkgNS4yOTAwNCAwLjY4NzM3IDYuNDUzODEgMS4wMjA1MSA3LjUzMzM5QzEuNDEwODQgOC43OTgyNyAyLjA5NDA3IDkuOTU5MTYgMi45NTY0MSAxMC45NTg5QzMuOTQ3NTcgMTIuMTA4MSA1LjE5NjE0IDEzLjAzMDYgNi41NTgyIDEzLjY5MzNDNy4xNjcxMiAxMy45ODk2IDcuODAwOCAxNC4yMzYyIDguNDQ3ODggMTQuNDM1M0M4LjU4MTc0IDE0LjQ3NjUgOC43Mjc2OCAxNC4zODc4IDguNzYzOTkgMTQuMjU1OUM4LjgwMTg5IDE0LjExNzcgOC43MTgyMSAxMy45ODA5IDguNTg0NDQgMTMuOTM5N1pcIixcbiAgICBzdHJva2U6IHMgfHwgXCIjQTBBM0FEXCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMy4xMzcxMVwiLFxuICAgIG1hc2s6IFwidXJsKCNwYXRoLTItaW5zaWRlLTFfMTg3XzEwNTEpXCJcbiAgfSldXG59KTtcbmZ1bmN0aW9uIHNtKHtcbiAgb25DbGljazogcyxcbiAgc2l6ZTogZSA9IDI0XG59KSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdmdcIiwge1xuICAgIFwiYXJpYS1oaWRkZW5cIjogXCJ0cnVlXCIsXG4gICAgZm9jdXNhYmxlOiBcImZhbHNlXCIsXG4gICAgcm9sZTogXCJpbWdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAxNiAxNlwiLFxuICAgIHdpZHRoOiBlLFxuICAgIGhlaWdodDogZSxcbiAgICBmaWxsOiBcIiM0QTRBNEFcIixcbiAgICBzdHlsZToge1xuICAgICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICAgIHVzZXJTZWxlY3Q6IFwibm9uZVwiLFxuICAgICAgdmVydGljYWxBbGlnbjogXCJ0ZXh0LWJvdHRvbVwiLFxuICAgICAgb3ZlcmZsb3c6IFwidmlzaWJsZVwiLFxuICAgICAgY3Vyc29yOiBcInBvaW50ZXJcIixcbiAgICAgIHBhZGRpbmc6IFwiNHB4XCJcbiAgICB9LFxuICAgIG9uQ2xpY2s6IHMsXG4gICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgICAgZDogXCJNMy43MiAzLjcyYS43NS43NSAwIDAgMSAxLjA2IDBMOCA2Ljk0bDMuMjItMy4yMmEuNzQ5Ljc0OSAwIDAgMSAxLjI3NS4zMjYuNzQ5Ljc0OSAwIDAgMS0uMjE1LjczNEw5LjA2IDhsMy4yMiAzLjIyYS43NDkuNzQ5IDAgMCAxLS4zMjYgMS4yNzUuNzQ5Ljc0OSAwIDAgMS0uNzM0LS4yMTVMOCA5LjA2bC0zLjIyIDMuMjJhLjc1MS43NTEgMCAwIDEtMS4wNDItLjAxOC43NTEuNzUxIDAgMCAxLS4wMTgtMS4wNDJMNi45NCA4IDMuNzIgNC43OGEuNzUuNzUgMCAwIDEgMC0xLjA2WlwiXG4gICAgfSlcbiAgfSk7XG59XG5jb25zdCBGQSA9ICgpID0+IElyLCBOQSA9IC8qIEBfX1BVUkVfXyAqLyBkZShGQSgpKSh7XG4gIGNsYXNzZXM6IFtcInJlY3Q3ZTVcIl1cbn0pLCBVQSA9ICgpID0+IElyLCAkQSA9IC8qIEBfX1BVUkVfXyAqLyBkZShVQSgpKSh7XG4gIGNsYXNzZXM6IFtcInAxM21xbnR0XCJdXG59KSwgR0EgPSAoKSA9PiBJciwgVkEgPSAvKiBAX19QVVJFX18gKi8gZGUoR0EoKSkoe1xuICBjbGFzc2VzOiBbXCJwMXI0N2R6MlwiXVxufSksIGpBID0gKCkgPT4gSXIsIEtBID0gLyogQF9fUFVSRV9fICovIGRlKGpBKCkpKHtcbiAgY2xhc3NlczogW1wiY25vanBxdlwiXVxufSksIEhBID0gKHtcbiAgaGFzaDogcyxcbiAgcmVhY3Rpb25zOiBlLFxuICBvbkNvbW1lbnQ6IHQsXG4gIG9uUmVjYXN0OiByLFxuICBvbkxpa2U6IG4sXG4gIGlzTGlrZWQ6IGlcbn0pID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaWVudF9pZDogbyxcbiAgICB1c2VyOiBhLFxuICAgIGlzQXV0aGVudGljYXRlZDogbFxuICB9ID0gdHMoKSwgW2MsIHVdID0gc3QudXNlU3RhdGUoITEpLCBbZCwgaF0gPSBzdC51c2VTdGF0ZSh7XG4gICAgdG9wOiAwLFxuICAgIGxlZnQ6IDBcbiAgfSksIFtmLCBwXSA9IHN0LnVzZVN0YXRlKG51bGwpLCBbeSwgRV0gPSBzdC51c2VTdGF0ZShpKSwgW2IsIFJdID0gc3QudXNlU3RhdGUoITEpLCBBID0gc3QudXNlUmVmKG51bGwpLCBGID0gc3QudXNlUmVmKHtcbiAgICBjb21tZW50OiBudWxsLFxuICAgIHJlY2FzdDogbnVsbCxcbiAgICBsaWtlOiBudWxsXG4gIH0pO1xuICBmdCgoKSA9PiB7XG4gICAgRShlLmxpa2VzLnNvbWUoKEgpID0+IEguZmlkID09PSAoYSA9PSBudWxsID8gdm9pZCAwIDogYS5maWQpKSksIFIoZS5yZWNhc3RzLnNvbWUoKEgpID0+IEguZmlkID09PSAoYSA9PSBudWxsID8gdm9pZCAwIDogYS5maWQpKSk7XG4gIH0sIFtlLCBhXSksIGZ0KCgpID0+IHtcbiAgICBjb25zdCBIID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oam4uTkVZTkFSX0FVVEhFTlRJQ0FURURfVVNFUik7XG4gICAgaWYgKEgpXG4gICAgICB0cnkge1xuICAgICAgICBwKEpTT04ucGFyc2UoSCkuc2lnbmVyX3V1aWQpO1xuICAgICAgfSBjYXRjaCAoSykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcGFyc2luZyBKU09OIGZyb20gbG9jYWwgc3RvcmFnZTpcIiwgSyksIHAobnVsbCk7XG4gICAgICB9XG4gICAgZWxzZVxuICAgICAgY29uc29sZS53YXJuKFwiTm8gTkVZTkFSX0FVVEhFTlRJQ0FURURfVVNFUiBmb3VuZCBpbiBsb2NhbCBzdG9yYWdlLlwiKTtcbiAgfSwgW2xdKSwgZnQoKCkgPT4ge1xuICAgIChmIHx8IGwpICYmIGMgJiYgdSghMSk7XG4gIH0sIFtmLCBsLCBjXSk7XG4gIGNvbnN0IE0gPSBhc3luYyAoSCwgSykgPT4ge1xuICAgIGlmIChmKVxuICAgICAgc3dpdGNoIChLKSB7XG4gICAgICAgIGNhc2UgXCJjb21tZW50XCI6XG4gICAgICAgICAgaWYgKHQpXG4gICAgICAgICAgICB0KCk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gY29tbWVudCBoYW5kbGVyIGZ1bmN0aW9uIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicmVjYXN0XCI6XG4gICAgICAgICAgaWYgKHIpXG4gICAgICAgICAgICBSKHIoKSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVjYXN0IGhhbmRsZXIgZnVuY3Rpb24gcHJvdmlkZWRcIik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJsaWtlXCI6XG4gICAgICAgICAgaWYgKG4pXG4gICAgICAgICAgICBFKG4oKSk7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gbGlrZSBoYW5kbGVyIGZ1bmN0aW9uIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIGNvbnN0IGogPSBGLmN1cnJlbnRbS107XG4gICAgaWYgKGopIHtcbiAgICAgIGNvbnN0IEMgPSBqLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBrID0gQS5jdXJyZW50O1xuICAgICAgaWYgKGspIHtcbiAgICAgICAgY29uc3QgJCA9IGsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGgoe1xuICAgICAgICAgIHRvcDogQy50b3AgLSAkLmhlaWdodCAtIDEwLFxuICAgICAgICAgIGxlZnQ6IEMubGVmdCArIEMud2lkdGggLyAyIC0gJC53aWR0aCAvIDJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4cyhOQSwge1xuICAgIGNoaWxkcmVuOiBbYyAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKCRBLCB7XG4gICAgICByZWY6IEEsXG4gICAgICBzdHlsZToge1xuICAgICAgICB0b3A6IGQudG9wLFxuICAgICAgICBsZWZ0OiBkLmxlZnRcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChWQSwge1xuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KHBTLCB7XG4gICAgICAgICAgdmFyaWFudDogZ3MuTkVZTkFSXG4gICAgICAgIH0pXG4gICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KEtBLCB7XG4gICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3goc20sIHtcbiAgICAgICAgICBvbkNsaWNrOiAoKSA9PiB1KCExKSxcbiAgICAgICAgICBzaXplOiAxNlxuICAgICAgICB9KVxuICAgICAgfSldXG4gICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChJciwge1xuICAgICAgc3R5bGU6IHtcbiAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgIGp1c3RpZnlDb250ZW50OiBcInNwYWNlLWJldHdlZW5cIixcbiAgICAgICAgYWxpZ25JdGVtczogXCJjZW50ZXJcIlxuICAgICAgfSxcbiAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKElyLCB7XG4gICAgICAgIHNwYWNpbmdWZXJ0aWNhbDogXCIxNXB4XCIsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgZ2FwOiBcIjQycHhcIlxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImRpdlwiLCB7XG4gICAgICAgICAgcmVmOiAoSCkgPT4gRi5jdXJyZW50LmNvbW1lbnQgPSBILFxuICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3godG0sIHtcbiAgICAgICAgICAgIG9uQ2xpY2s6IChIKSA9PiBNKEgsIFwiY29tbWVudFwiKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge1xuICAgICAgICAgIHJlZjogKEgpID0+IEYuY3VycmVudC5yZWNhc3QgPSBILFxuICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3goQkEsIHtcbiAgICAgICAgICAgIGZpbGw6IGIgPyBcImdyZWVuXCIgOiB2b2lkIDAsXG4gICAgICAgICAgICBvbkNsaWNrOiAoSCkgPT4gTShILCBcInJlY2FzdFwiKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge1xuICAgICAgICAgIHJlZjogKEgpID0+IEYuY3VycmVudC5saWtlID0gSCxcbiAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KHJtLCB7XG4gICAgICAgICAgICBmaWxsOiB5ID8gXCJyZWRcIiA6IHZvaWQgMCxcbiAgICAgICAgICAgIG9uQ2xpY2s6IChIKSA9PiBNKEgsIFwibGlrZVwiKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXVxuICAgICAgfSlcbiAgICB9KV1cbiAgfSk7XG59O1xuZnVuY3Rpb24gcUEoe1xuICBvbkNsaWNrOiBzXG59KSB7XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdmdcIiwge1xuICAgIHN0eWxlOiB7XG4gICAgICBjdXJzb3I6IFwicG9pbnRlclwiXG4gICAgfSxcbiAgICB3aWR0aDogXCIxNlwiLFxuICAgIGhlaWdodDogXCIxNVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDE2IDE1XCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICBvbkNsaWNrOiAoZSkgPT4gcyA/IHMoZSkgOiB2b2lkIDAsXG4gICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgICAgZDogXCJNMTUuMjAwMyA3LjQ5MDYzQzE0Ljc1MDQgNy40OTA2MyAxNC40NTA0IDcuNzkwNTcgMTQuNDUwNCA4LjI0MDQ4VjEyLjczOTZDMTQuNDUwNCAxMy4xODk1IDE0LjE1MDUgMTMuNDg5NCAxMy43MDA2IDEzLjQ4OTRIMy4yMDI2OEMyLjc1Mjc3IDEzLjQ4OTQgMi40NTI4MyAxMy4xODk1IDIuNDUyODMgMTIuNzM5NlY4LjI0MDQ4QzIuNDUyODMgNy43OTA1NyAyLjE1Mjg5IDcuNDkwNjMgMS43MDI5OCA3LjQ5MDYzQzEuMjUzMDcgNy40OTA2MyAwLjk1MzEyNSA3Ljc5MDU3IDAuOTUzMTI1IDguMjQwNDhWMTIuNzM5NkMwLjk1MzEyNSAxNC4wMTQzIDEuOTI3OTMgMTQuOTg5MSAzLjIwMjY4IDE0Ljk4OTFIMTMuNzAwNkMxNC45NzUzIDE0Ljk4OTEgMTUuOTUwMSAxNC4wMTQzIDE1Ljk1MDEgMTIuNzM5NlY4LjI0MDQ4QzE1Ljk1MDEgNy43OTA1NyAxNS42NTAyIDcuNDkwNjMgMTUuMjAwMyA3LjQ5MDYzWk01Ljk3NzEzIDQuMjY2MjdMNy43MDE3OCAyLjU0MTYxVjkuNzQwMThDNy43MDE3OCAxMC4xOTAxIDguMDAxNzIgMTAuNDkgOC40NTE2MyAxMC40OUM4LjkwMTU1IDEwLjQ5IDkuMjAxNDkgMTAuMTkwMSA5LjIwMTQ5IDkuNzQwMThWMi41NDE2MUwxMC45MjYxIDQuMjY2MjdDMTEuMjI2MSA0LjU2NjIxIDExLjY3NiA0LjU2NjIxIDExLjk3NTkgNC4yNjYyN0MxMi4yNzU5IDMuOTY2MzMgMTIuMjc1OSAzLjUxNjQyIDExLjk3NTkgMy4yMTY0OEw4Ljk3NjUzIDAuMjE3MDczQzguOTAxNTUgMC4xNDIwODggOC44MjY1NiAwLjA2NzEwMzEgOC43NTE1NyAwLjA2NzEwMzFDOC42MDE2IC0wLjAwNzg4MjAyIDguMzc2NjUgLTAuMDA3ODgyMDIgOC4xNTE2OSAwLjA2NzEwMzFDOC4wNzY3MSAwLjA2NzEwMzEgOC4wMDE3MiAwLjE0MjA4OCA3LjkyNjc0IDAuMjE3MDczTDQuOTI3MzQgMy4yMTY0OEM0LjYyNzM5IDMuNTE2NDIgNC42MjczOSAzLjk2NjMzIDQuOTI3MzQgNC4yNjYyN0M1LjIyNzI4IDQuNTY2MjEgNS42NzcxOSA0LjU2NjIxIDUuOTc3MTMgNC4yNjYyN1pcIixcbiAgICAgIGZpbGw6IFwiI0EwQTNBRFwiXG4gICAgfSlcbiAgfSk7XG59XG5jb25zdCBJYyA9ICh7XG4gIHVybDogc1xufSkgPT4ge1xuICBjb25zdCBbZSwgdF0gPSBzdC51c2VTdGF0ZSghMSksIHIgPSBhc3luYyAobikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dChzKSwgdCghMCksIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0KCExKTtcbiAgICAgIH0sIDJlMyk7XG4gICAgfSBjYXRjaCAoaSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjb3B5IHRoZSB0ZXh0IHRvIGNsaXBib2FyZDpcIiwgaSk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICBjaGlsZHJlbjogZSA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInN2Z1wiLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBjdXJzb3I6IFwicG9pbnRlclwiLFxuICAgICAgICBmaWxsOiBcImdyZWVuXCJcbiAgICAgIH0sXG4gICAgICB3aWR0aDogXCIxNlwiLFxuICAgICAgaGVpZ2h0OiBcIjE1XCIsXG4gICAgICB2aWV3Qm94OiBcIjAgMCAxNiAxNVwiLFxuICAgICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICAgICAgZDogXCJNNS45OTk2NyAxMi44MTM2TDEuNzE5NjcgOC41MzM2NEwwLjU1OTY3MyA5LjY5MzY0TDUuOTk5NjcgMTUuMTMzNkwxNi40Mzk3IDQuNjkzNjRMMTUuMjc5NyAzLjUzMzY0TDUuOTk5NjcgMTIuODEzNlpcIlxuICAgICAgfSlcbiAgICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChxQSwge1xuICAgICAgb25DbGljazogclxuICAgIH0pXG4gIH0pO1xufSwgV0EgPSAoKSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFwic3ZnXCIsIHtcbiAgd2lkdGg6IFwiMTBcIixcbiAgaGVpZ2h0OiBcIjEwXCIsXG4gIHZpZXdCb3g6IFwiMCAwIDEwIDEwXCIsXG4gIGZpbGw6IFwibm9uZVwiLFxuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUuODU4NTUgMC41NTU2NjRIOC4zMTI4MU04LjMxMjgxIDAuNTU1NjY0VjIuNzM3NTRNOC4zMTI4MSAwLjU1NTY2NEw0LjMxNDQ1IDQuMTExMjJcIixcbiAgICBzdHJva2U6IFwiI0ZGRkZGRlwiLFxuICAgIFwic3Ryb2tlLWxpbmVjYXBcIjogXCJyb3VuZFwiLFxuICAgIFwic3Ryb2tlLWxpbmVqb2luXCI6IFwicm91bmRcIlxuICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgXCJmaWxsLXJ1bGVcIjogXCJldmVub2RkXCIsXG4gICAgXCJjbGlwLXJ1bGVcIjogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMy4zMTQ0NSAxSDEuMzE0NDVDMC43NjIxNjggMSAwLjMxNDQ1MyAxLjQ0NzcyIDAuMzE0NDUzIDJWOEMwLjMxNDQ1MyA4LjU1MjI4IDAuNzYyMTY4IDkgMS4zMTQ0NSA5SDcuMzE0NDVDNy44NjY3NCA5IDguMzE0NDUgOC41NTIyOCA4LjMxNDQ1IDhWNkg3LjMxNDQ1VjhIMS4zMTQ0NVYySDMuMzE0NDVWMVpcIixcbiAgICBmaWxsOiBcIiNGRkZGRkZcIlxuICB9KV1cbn0pLCB6QSA9ICgpID0+IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInN2Z1wiLCB7XG4gIHdpZHRoOiBcIjEwXCIsXG4gIGhlaWdodDogXCIxNFwiLFxuICB2aWV3Qm94OiBcIjAgMCAxMCAxNFwiLFxuICBmaWxsOiBcIm5vbmVcIixcbiAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTUuMDE0NTEgMTIuNTE4N0w0Ljk2ODMzIDEyLjUxNzRMNC45MzkxNCAxMi41MjJDNC45MzExMyAxMi41MTYgNC45MjQwMiAxMi41MDg3IDQuOTE4MDggMTIuNTAwNUw0LjUxMjMxIDEyLjc5MjZMNC45MTgwOCAxMi41MDA1QzQuOTA0OSAxMi40ODIyIDQuODk4MjQgMTIuNDYgNC44OTkxMyAxMi40Mzc1TDQuODk5NTMgMTIuNDI3NVYxMi40MTc2VjguODExOTRWOC4zMTE5NEg0LjM5OTUzSDEuODg3NkgxLjg4NzUzQzEuNzYxODggOC4zMTE5NiAxLjYzODUzIDguMjc4MjUgMS41MzAzNiA4LjIxNDMzQzEuNDIyMTggOC4xNTA0IDEuMzMzMTUgOC4wNTg2MiAxLjI3MjU2IDcuOTQ4NTRDMS4yMTE5NiA3LjgzODQ3IDEuMTgyMDMgNy43MTQxNSAxLjE4NTg4IDcuNTg4NTZDMS4xODk3MyA3LjQ2MzAxIDEuMjI3MiA3LjM0MDc5IDEuMjk0MzggNy4yMzQ2NkMxLjI5NDQgNy4yMzQ2MyAxLjI5NDQyIDcuMjM0NTkgMS4yOTQ0NCA3LjIzNDU2TDQuOTAwMDEgMS41NDM3N0w0LjkwNTY3IDEuNTM0ODNMNC45MTA5NSAxLjUyNTY3QzQuOTIyMjcgMS41MDYwMSA0LjkzOTg4IDEuNDkwNzQgNC45NjA5NCAxLjQ4MjMyQzQuOTgyIDEuNDczODkgNS4wMDUyOCAxLjQ3MjgxIDUuMDI3MDMgMS40NzkyNEw1LjAyOTEyIDEuNDc5ODVDNS4wNTA3NyAxLjQ4NjE0IDUuMDY5NjkgMS40OTk1IDUuMDgyODYgMS41MTc4QzUuMDk2MDMgMS41MzYwOSA1LjEwMjcgMS41NTgyNyA1LjEwMTggMS41ODA3OUw1LjEwMTQxIDEuNTkwNzNWMS42MDA2N1Y1LjIwNjMxVjUuNzA2MzFINS42MDE0MUg4LjExMzMzSDguMTEzNEM4LjIzOTA1IDUuNzA2MjkgOC4zNjI0IDUuNzQgOC40NzA1OCA1LjgwMzkyQzguNTc4NzUgNS44Njc4NCA4LjY2Nzc4IDUuOTU5NjMgOC43MjgzOCA2LjA2OTcxQzguNzg4OTcgNi4xNzk3OCA4LjgxODkxIDYuMzA0MSA4LjgxNTA2IDYuNDI5NjlDOC44MTEyMSA2LjU1NTI4IDguNzczNzEgNi42Nzc1MyA4LjcwNjQ5IDYuNzgzNjlMNS4xMDIzMiAxMi40NzIzQzUuMTAyMTkgMTIuNDcyNSA1LjEwMjA1IDEyLjQ3MjcgNS4xMDE5MSAxMi40NzI5QzUuMDkyNTUgMTIuNDg3MyA1LjA3OTY5IDEyLjQ5OSA1LjA2NDUyIDEyLjUwN0M1LjA0OTE0IDEyLjUxNTIgNS4wMzE5MSAxMi41MTkyIDUuMDE0NTEgMTIuNTE4N1pcIixcbiAgICBzdHJva2U6IFwiI0ZGRkZGRlwiXG4gIH0pXG59KSwgWUEgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJidXR0b25cIikoe1xuICBjbGFzc2VzOiBbXCJmMWhtY3JyZlwiXVxufSksIFpBID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiZjFraTRpbDZcIl1cbn0pLCBYQSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImJnbnowdWRcIl1cbn0pLCBKQSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImltZ1wiKSh7XG4gIGNsYXNzZXM6IFtcImYxZ2JnZXQ5XCJdXG59KSwgUUEgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJmNHJ3ZTRpXCJdXG59KSwgZUkgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJmMXFlbGxnd1wiXVxufSksIHRJID0gLyogQF9fUFVSRV9fICovIGRlKFwiaW5wdXRcIikoe1xuICBjbGFzc2VzOiBbXCJpMWhneHdoaVwiXVxufSksIHJJID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiczFhaGNmYXhcIl1cbn0pLCBzSSA9ICgpID0+IHtcbiAgY29uc3QgcyA9IGJ0KG51bGwpO1xuICByZXR1cm4gZnQoKCkgPT4ge1xuICAgIGlmIChzLmN1cnJlbnQpIHtcbiAgICAgIGxldCBlID0gMDtcbiAgICAgIGNvbnN0IHQgPSAoKSA9PiB7XG4gICAgICAgIGUgKz0gNiwgcy5jdXJyZW50ICYmIChzLmN1cnJlbnQuc3R5bGUudHJhbnNmb3JtID0gYHJvdGF0ZSgke2V9ZGVnKWApLCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCk7XG4gICAgICB9O1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpO1xuICAgIH1cbiAgfSwgW10pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdmdcIiwge1xuICAgIHJlZjogcyxcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIGZpbGw6IFwibm9uZVwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXG4gICAgc3Ryb2tlV2lkdGg6IFwiMS41XCIsXG4gICAgc3Ryb2tlOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIGNsYXNzTmFtZTogXCJzaXplLTYgdGV4dC13aGl0ZVwiLFxuICAgIHN0eWxlOiB7XG4gICAgICB3aWR0aDogXCIyNHB4XCIsXG4gICAgICBoZWlnaHQ6IFwiMjRweFwiXG4gICAgfSxcbiAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFwicGF0aFwiLCB7XG4gICAgICBzdHJva2VMaW5lY2FwOiBcInJvdW5kXCIsXG4gICAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiLFxuICAgICAgZDogXCJNMTYuMDIzIDkuMzQ4aDQuOTkydi0uMDAxTTIuOTg1IDE5LjY0NHYtNC45OTJtMCAwaDQuOTkybS00Ljk5MyAwIDMuMTgxIDMuMTgzYTguMjUgOC4yNSAwIDAgMCAxMy44MDMtMy43TTQuMDMxIDkuODY1YTguMjUgOC4yNSAwIDAgMSAxMy44MDMtMy43bDMuMTgxIDMuMTgybTAtNC45OTF2NC45OVwiXG4gICAgfSlcbiAgfSk7XG59O1xuZnVuY3Rpb24gbkkoe1xuICBudW1iZXI6IHMsXG4gIHRleHQ6IGUsXG4gIGFjdGlvblR5cGU6IHQsXG4gIHRhcmdldDogcixcbiAgZnJhbWVVcmw6IG4sXG4gIGhhbmRsZU9uQ2xpY2s6IGlcbn0pIHtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoWUEsIHtcbiAgICBvbkNsaWNrOiAoKSA9PiBpKHMpLFxuICAgIGNoaWxkcmVuOiBbZSwgKHQgPT09IFwibGlua1wiIHx8IHQgPT09IFwicG9zdF9yZWRpcmVjdFwiIHx8IHQgPT09IFwibWludFwiKSAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goV0EsIHt9KSwgdCA9PT0gXCJ0eFwiICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeCh6QSwge30pXVxuICB9KTtcbn1cbmZ1bmN0aW9uIGlJKHtcbiAgZnJhbWU6IHMsXG4gIG9uRnJhbWVCdG5QcmVzczogZVxufSkge1xuICB2YXIgaDtcbiAgY29uc3QgW3QsIHJdID0gcWUocyksIFtuLCBpXSA9IHFlKFwiXCIpLCBbbywgYV0gPSBxZSghMSksIGwgPSAoKSA9PiB7XG4gICAgY29uc3QgZiA9IHQuYnV0dG9ucy5tYXAoKHApID0+IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChuSSwge1xuICAgICAgbnVtYmVyOiBwLmluZGV4LFxuICAgICAgdGV4dDogcC50aXRsZSxcbiAgICAgIGFjdGlvblR5cGU6IHAuYWN0aW9uX3R5cGUsXG4gICAgICB0YXJnZXQ6IHAudGFyZ2V0LFxuICAgICAgZnJhbWVVcmw6IHMuZnJhbWVzX3VybCxcbiAgICAgIGhhbmRsZU9uQ2xpY2s6ICh5KSA9PiB7XG4gICAgICAgIGEoITApLCBlKHksIHQsIHIsIG4pLmZpbmFsbHkoKCkgPT4gYSghMSkpO1xuICAgICAgfVxuICAgIH0sIHAuaW5kZXgpKTtcbiAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KFhBLCB7XG4gICAgICBjaGlsZHJlbjogZlxuICAgIH0pO1xuICB9LCBjID0gKGYpID0+IHtcbiAgICBpKGYpO1xuICB9LCB1ID0gKGYpID0+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIG5ldyBVUkwoZikuaG9zdG5hbWUucmVwbGFjZShcInd3dy5cIiwgXCJcIik7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH0sIGQgPSAoKSA9PiB7XG4gICAgc3dpdGNoICh0LmltYWdlX2FzcGVjdF9yYXRpbykge1xuICAgICAgY2FzZSBcIjE6MVwiOlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFzcGVjdFJhdGlvOiBcIjEgLyAxXCJcbiAgICAgICAgfTtcbiAgICAgIGNhc2UgXCIxLjkxOjFcIjpcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBhc3BlY3RSYXRpbzogXCIxLjkxIC8gMVwiXG4gICAgICAgIH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFzcGVjdFJhdGlvOiBcIjEuOTEgLyAxXCJcbiAgICAgICAgfTtcbiAgICB9XG4gIH07XG4gIHJldHVybiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKHEuRnJhZ21lbnQsIHtcbiAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoWkEsIHtcbiAgICAgIGNoaWxkcmVuOiBbbyAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3gockksIHtcbiAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChzSSwge30pXG4gICAgICB9KSwgdC5mcmFtZXNfdXJsICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMocS5GcmFnbWVudCwge1xuICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImFcIiwge1xuICAgICAgICAgIGhyZWY6IHQuZnJhbWVzX3VybCxcbiAgICAgICAgICB0YXJnZXQ6IFwiX2JsYW5rXCIsXG4gICAgICAgICAgcmVsOiBcIm5vb3BlbmVyIG5vcmVmZXJyZXJcIixcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KEpBLCB7XG4gICAgICAgICAgICBzcmM6IHQuaW1hZ2UsXG4gICAgICAgICAgICBhbHQ6IGBGcmFtZSBpbWFnZSBmb3IgJHt0LmZyYW1lc191cmx9YCxcbiAgICAgICAgICAgIHN0eWxlOiBkKClcbiAgICAgICAgICB9KVxuICAgICAgICB9KSwgKChoID0gdC5pbnB1dCkgPT0gbnVsbCA/IHZvaWQgMCA6IGgudGV4dCkgJiYgLyogQF9fUFVSRV9fICovIHEuanN4KHRJLCB7XG4gICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgcGxhY2Vob2xkZXI6IHQuaW5wdXQudGV4dCxcbiAgICAgICAgICB2YWx1ZTogbixcbiAgICAgICAgICBvbkNoYW5nZTogKGYpID0+IGMoZi50YXJnZXQudmFsdWUpXG4gICAgICAgIH0pLCBsKCldXG4gICAgICB9KV1cbiAgICB9KSwgdC5mcmFtZXNfdXJsICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChRQSwge1xuICAgICAgY2hpbGRyZW46IHUodC5mcmFtZXNfdXJsKVxuICAgIH0pXVxuICB9KTtcbn1cbmNvbnN0IG9JID0gKHtcbiAgZnJhbWU6IHMsXG4gIG9uRnJhbWVCdG5QcmVzczogZVxufSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4KGVJLCB7XG4gIGNoaWxkcmVuOiBzID8gLyogQF9fUFVSRV9fICovIHEuanN4KGlJLCB7XG4gICAgZnJhbWU6IHMsXG4gICAgb25GcmFtZUJ0blByZXNzOiBlXG4gIH0pIDogLyogQF9fUFVSRV9fICovIHEuanN4KHEuRnJhZ21lbnQsIHt9KVxufSksIGFJID0gKHtcbiAgdXJsOiBzLFxuICBvbkZyYW1lQnRuUHJlc3M6IGUsXG4gIGluaXRpYWxGcmFtZTogdFxufSkgPT4ge1xuICBjb25zdCB7XG4gICAgY2xpZW50X2lkOiByLFxuICAgIHNob3dUb2FzdDogblxuICB9ID0gdHMoKSwgW2ldID0gZHUoam4uTkVZTkFSX0FVVEhFTlRJQ0FURURfVVNFUiwgbnVsbCksIFtvLCBhXSA9IHFlKG51bGwpLCBbbCwgY10gPSBxZSh0IHx8IG51bGwpLCBbdSwgZF0gPSBxZShudWxsKTtcbiAgZnQoKCkgPT4ge1xuICAgIGkgPyBhKGkuc2lnbmVyX3V1aWQpIDogY29uc29sZS53YXJuKFwiTm8gTkVZTkFSX0FVVEhFTlRJQ0FURURfVVNFUiBmb3VuZCBpbiBsb2NhbCBzdG9yYWdlLlwiKTtcbiAgfSwgW2ldKSwgZnQoKCkgPT4ge1xuICAgIHQgfHwgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHkgPSBhd2FpdCBsSShgJHtvbn0vdjIvZmFyY2FzdGVyL2ZyYW1lL2NyYXdsP3VybD0ke3N9JmNsaWVudF9pZD0ke3J9YCwge1xuICAgICAgICAgIG1ldGhvZDogXCJHRVRcIlxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHkub2spIHtcbiAgICAgICAgICBjb25zdCBiID0gKGF3YWl0IHkuanNvbigpKS5mcmFtZTtcbiAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYikubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZnJhbWUgZGF0YSBhdmFpbGFibGVcIik7XG4gICAgICAgICAgYyhiKSwgZChudWxsKTtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBIVFRQIGVycm9yISBzdGF0dXM6ICR7eS5zdGF0dXN9YCk7XG4gICAgICB9IGNhdGNoICh5KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEFuIGVycm9yIG9jY3VycmVkOiAke3l9YCksIGQoYEZhaWxlZCB0byBmZXRjaDogJHt5Lm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfSwgW3MsIG4sIHRdKTtcbiAgY29uc3QgaCA9IChwKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBwICE9IFwib2JqZWN0XCIgfHwgcCA9PT0gbnVsbCkgcmV0dXJuICExO1xuICAgIGNvbnN0IHkgPSBbXCJ2ZXJzaW9uXCIsIFwiaW1hZ2VcIiwgXCJidXR0b25zXCIsIFwiZnJhbWVzX3VybFwiXTtcbiAgICBmb3IgKGNvbnN0IEUgb2YgeSlcbiAgICAgIGlmICghKEUgaW4gcCkpIHJldHVybiAhMTtcbiAgICByZXR1cm4gISghQXJyYXkuaXNBcnJheShwLmJ1dHRvbnMpIHx8IHAuYnV0dG9ucy5zb21lKChFKSA9PiB0eXBlb2YgRS5pbmRleCAhPSBcIm51bWJlclwiKSk7XG4gIH0sIGYgPSBhc3luYyAocCwgeSwgRSwgYikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBSID0gYXdhaXQgZShwLCB5LCBFLCBiKTtcbiAgICAgIGlmICghaChSKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBmcmFtZSBkYXRhIHJlY2VpdmVkXCIpO1xuICAgICAgRShSKTtcbiAgICB9IGNhdGNoIChSKSB7XG4gICAgICBuKHhnLkVycm9yLCBgQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyB0aGUgYnV0dG9uIHByZXNzOiAke1J9YCk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdSA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIGNvbG9yOiBcInJlZFwiLFxuICAgICAgcGFkZGluZzogXCIxMHB4XCIsXG4gICAgICBib3JkZXI6IFwiMXB4IHNvbGlkIHJlZFwiLFxuICAgICAgYm9yZGVyUmFkaXVzOiBcIjVweFwiXG4gICAgfSxcbiAgICBjaGlsZHJlbjogdVxuICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChvSSwge1xuICAgIGZyYW1lOiBsLFxuICAgIG9uRnJhbWVCdG5QcmVzczogZlxuICB9KTtcbn07XG5mdW5jdGlvbiBsSShzLCBlLCB0ID0gOGUzKSB7XG4gIHJldHVybiBQcm9taXNlLnJhY2UoW2FuKHMsIGUpLCBuZXcgUHJvbWlzZSgociwgbikgPT4gc2V0VGltZW91dCgoKSA9PiBuKG5ldyBFcnJvcihcIlJlcXVlc3QgdGltZWQgb3V0XCIpKSwgdCkpXSk7XG59XG5mdW5jdGlvbiBwZihzKSB7XG4gIGNvbnN0IGUgPSBNYXRoLm1pbihzLCAxZTkpO1xuICByZXR1cm4gZSA+PSAxZTkgPyBNYXRoLmZsb29yKGUgLyAxZTgpIC8gMTAgKyBcIkJcIiA6IGUgPj0gMWU2ID8gTWF0aC5mbG9vcihlIC8gMWU1KSAvIDEwICsgXCJNXCIgOiBlID49IDFlMyA/IE1hdGguZmxvb3IoZSAvIDEwMCkgLyAxMCArIFwiS1wiIDogZS50b1N0cmluZygpO1xufVxuZnVuY3Rpb24gY0kocykge1xuICBpZiAoIXMpXG4gICAgcmV0dXJuIGNvbnNvbGUuZXJyb3IoXCJFcnJvcjogVGltZXN0YW1wIGlzIHVuZGVmaW5lZCBvciBlbXB0eS5cIiksIFwiSW52YWxpZCB0aW1lc3RhbXBcIjtcbiAgY29uc3QgZSA9IG5ldyBEYXRlKHMpO1xuICBpZiAoaXNOYU4oZS5nZXRUaW1lKCkpKVxuICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiRXJyb3I6IEludmFsaWQgdGltZXN0YW1wIHByb3ZpZGVkOlwiLCBzKSwgXCJJbnZhbGlkIHRpbWVzdGFtcFwiO1xuICBjb25zdCB0ID0gLyogQF9fUFVSRV9fICovIG5ldyBEYXRlKCksIG4gPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh2b2lkIDAsIHtcbiAgICBob3VyOiBcIm51bWVyaWNcIixcbiAgICBtaW51dGU6IFwiMi1kaWdpdFwiLFxuICAgIGhvdXIxMjogITBcbiAgfSkuZm9ybWF0KGUpLnJlcGxhY2UoXCIgXCIsIFwiXCIpLCBpID0gdC50b0RhdGVTdHJpbmcoKSA9PT0gZS50b0RhdGVTdHJpbmcoKSwgbyA9IG5ldyBEYXRlKHQuc2V0RGF0ZSh0LmdldERhdGUoKSAtIDEpKS50b0RhdGVTdHJpbmcoKSA9PT0gZS50b0RhdGVTdHJpbmcoKTtcbiAgaWYgKGkpXG4gICAgcmV0dXJuIGAke259LCB0b2RheWA7XG4gIGlmIChvKVxuICAgIHJldHVybiBgJHtufSwgeWVzdGVyZGF5YDtcbiAgY29uc3QgYSA9IFtcIkphblwiLCBcIkZlYlwiLCBcIk1hclwiLCBcIkFwclwiLCBcIk1heVwiLCBcIkp1blwiLCBcIkp1bFwiLCBcIkF1Z1wiLCBcIlNlcFwiLCBcIk9jdFwiLCBcIk5vdlwiLCBcIkRlY1wiXSwgbCA9IGUuZ2V0RGF0ZSgpLCBjID0gYVtlLmdldE1vbnRoKCldLCB1ID0gZS5nZXRGdWxsWWVhcigpLCBoID0gYCR7Y30gJHsoKGYpID0+IHtcbiAgICBpZiAoZiA+IDMgJiYgZiA8IDIxKSByZXR1cm4gYCR7Zn10aGA7XG4gICAgY29uc3QgcCA9IFtcInN0XCIsIFwibmRcIiwgXCJyZFwiXSwgeSA9IGYgJSAxMDtcbiAgICByZXR1cm4gYCR7Zn0ke3BbeSAtIDFdIHx8IFwidGhcIn1gO1xuICB9KShsKX0gJHt1fWA7XG4gIHJldHVybiBgJHtufSwgJHtofWA7XG59XG5jb25zdCB1SSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInN4cXZ4dnFcIl1cbn0pLCBkSSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImFcIikoe1xuICBjbGFzc2VzOiBbXCJzM2thbW92XCJdXG59KSwgaEkgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJtMXdydnZoa1wiXVxufSksIGZJID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1widDFsY2FxMjdcIl1cbn0pLCBnSSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInVndHAxd2hcIl1cbn0pLCBwSSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImwxZHFwbjRlXCJdXG59KSwgbUkgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJsMWJqbnYydFwiXVxufSksIG1mID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiZTE1eWYxMjNcIl1cbn0pLCB5SSA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInJ4cmE5NGdcIl1cbn0pLCB5ZiA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInMxd2hncXJzXCJdXG59KSwgdkkgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJwXCIpKHtcbiAgY2xhc3NlczogW1wiZHo4bWFyZlwiXVxufSksIG9hID0gc3QubWVtbygoe1xuICB1c2VybmFtZTogcyxcbiAgZGlzcGxheU5hbWU6IGUsXG4gIGF2YXRhckltZ1VybDogdCxcbiAgdGV4dDogciA9IFwiXCIsXG4gIGhhc2g6IG4sXG4gIHJlYWN0aW9uczogaSxcbiAgcmVwbGllczogbyxcbiAgZW1iZWRzOiBhID0gW10sXG4gIGZyYW1lczogbCA9IFtdLFxuICBjaGFubmVsOiBjLFxuICB2aWV3ZXJGaWQ6IHUsXG4gIGhhc1Bvd2VyQmFkZ2U6IGQsXG4gIGlzRW1iZWQ6IGggPSAhMCxcbiAgYWxsb3dSZWFjdGlvbnM6IGYsXG4gIHJlbmRlckVtYmVkczogcCxcbiAgcmVuZGVyRnJhbWVzOiB5LFxuICBvbkxpa2VCdG5QcmVzczogRSxcbiAgb25SZWNhc3RCdG5QcmVzczogYixcbiAgb25Db21tZW50QnRuUHJlc3M6IFIsXG4gIG9uRnJhbWVCdG5QcmVzczogQSxcbiAgZGlyZWN0X3JlcGxpZXM6IEYsXG4gIGNvbnRhaW5lclN0eWxlczogTSxcbiAgdGV4dFN0eWxlczogSCxcbiAgdGltZXN0YW1wOiBLLFxuICBhcHBBdmF0YXJJbWdVcmw6IGpcbn0pID0+IHtcbiAgY29uc3QgW0MsIGtdID0gcWUoaS5saWtlc19jb3VudCksIFskLCBXXSA9IHFlKGkubGlrZXMuc29tZSgoVikgPT4gVi5maWQgPT09IHUpKSwgXyA9IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChtSSwge1xuICAgIGNoaWxkcmVuOiBFUyhyLCBhKVxuICB9KSwgZyA9IChhID09IG51bGwgPyB2b2lkIDAgOiBhLmxlbmd0aCkgPT09IDEsIHggPSBacigoKSA9PiBsLm1hcCgoVikgPT4gVi5mcmFtZXNfdXJsKSwgW2xdKSwgdyA9IFpyKCgpID0+IGEuZmlsdGVyKChWKSA9PiAheC5pbmNsdWRlcyhWLnVybCkpLCBbYSwgeF0pLCBEID0gdXQoKFYpID0+IHtcbiAgICBWLmN1cnJlbnRUYXJnZXQuc3JjID0gYmk7XG4gIH0sIFtdKTtcbiAgZnQoKCkgPT4ge1xuICAgIFcoaS5saWtlcy5zb21lKChWKSA9PiBWLmZpZCA9PT0gdSkpO1xuICB9LCBbaS5saWtlcywgdV0pO1xuICBjb25zdCBPID0gdXQoKCkgPT4gRSAmJiBFKCkgPyAoaygoTCkgPT4gTCArIDEpLCBXKCEkKSwgITApIDogITEsIFtFXSksIFUgPSBPQSh3LCBmLCB1KTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBxLmpzeCh1SSwge1xuICAgIHN0eWxlOiB7XG4gICAgICAuLi5NLFxuICAgICAgYm9yZGVyV2lkdGg6IGggPyBcIjFweFwiIDogXCIwXCJcbiAgICB9LFxuICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFByLCB7XG4gICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChJciwge1xuICAgICAgICBzcGFjaW5nUmlnaHQ6IFwiMTBweFwiLFxuICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFlvLCB7XG4gICAgICAgICAgc3JjOiB0ICYmIHQubGVuZ3RoID4gMCA/IHQgOiBiaSxcbiAgICAgICAgICB3aWR0aDogXCIyMHB4XCIsXG4gICAgICAgICAgaGVpZ2h0OiBcIjIwcHhcIixcbiAgICAgICAgICBvbkVycm9yOiBELFxuICAgICAgICAgIGxvYWRpbmc6IFwibGF6eVwiLFxuICAgICAgICAgIGFsdDogYCR7ZSA/PyBcIlNrZWxldG9uXCJ9IEF2YXRhcmBcbiAgICAgICAgfSlcbiAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKGhJLCB7XG4gICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyhQciwge1xuICAgICAgICAgIGZsZXhHcm93OiAxLFxuICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3hzKFByLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeCh2SSwge1xuICAgICAgICAgICAgICBjaGlsZHJlbjogZVxuICAgICAgICAgICAgfSksIFwiIFwiLCBqICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChJciwge1xuICAgICAgICAgICAgICBzcGFjaW5nTGVmdDogXCI1cHhcIixcbiAgICAgICAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImltZ1wiLCB7XG4gICAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiMnB4XCIsXG4gICAgICAgICAgICAgICAgICBib3JkZXJXaWR0aDogXCIwLjVweFwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwiYm9yZGVyLXdoaXRlIHJvdW5kZWQtZnVsbFwiLFxuICAgICAgICAgICAgICAgIHNyYzogaixcbiAgICAgICAgICAgICAgICB3aWR0aDogXCIxOFwiLFxuICAgICAgICAgICAgICAgIGhlaWdodDogXCIxOFwiLFxuICAgICAgICAgICAgICAgIG9uRXJyb3I6IChWKSA9PiB7XG4gICAgICAgICAgICAgICAgICBWLmN1cnJlbnRUYXJnZXQuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pXVxuICAgICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFByLCB7XG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3hzKGdJLCB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBbXCJAXCIsIHMsIFwiIMK3XCJdXG4gICAgICAgICAgICB9KSwgXCIgXCIsIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChmSSwge1xuICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgIGNvbG9yOiBcIiM5OTk5OTlcIixcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogXCIxNHB4XCIsXG4gICAgICAgICAgICAgICAgZm9udEZhbWlseTogXCJXb3JrIFNhbnNcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjaGlsZHJlbjogY0koSylcbiAgICAgICAgICAgIH0pXVxuICAgICAgICAgIH0pXVxuICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KElyLCB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIG1hcmdpblRvcDogXCIxMHB4XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3gocEksIHtcbiAgICAgICAgICAgIHN0eWxlOiBILFxuICAgICAgICAgICAgY2hpbGRyZW46IF9cbiAgICAgICAgICB9KVxuICAgICAgICB9KSwgcCAmJiB3ICYmIHcubGVuZ3RoID4gMCA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChtZiwge1xuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBtYXJnaW46IGcgPyBcIjRweCAwXCIgOiBcIjBcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2hpbGRyZW46IFUubWFwKChWLCBMKSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge1xuICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFZcbiAgICAgICAgICB9LCBMKSlcbiAgICAgICAgfSkgOiAvKiBAX19QVVJFX18gKi8gcS5qc3gocS5GcmFnbWVudCwge30pLCB5ICYmIGwgJiYgbC5sZW5ndGggPiAwID8gLyogQF9fUFVSRV9fICovIHEuanN4KG1mLCB7XG4gICAgICAgICAgY2hpbGRyZW46IGwubWFwKChWKSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3goYUksIHtcbiAgICAgICAgICAgIHVybDogVi5mcmFtZXNfdXJsLFxuICAgICAgICAgICAgaW5pdGlhbEZyYW1lOiBWLFxuICAgICAgICAgICAgb25GcmFtZUJ0blByZXNzOiBBXG4gICAgICAgICAgfSwgVi5mcmFtZXNfdXJsKSlcbiAgICAgICAgfSkgOiBudWxsLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKHlJLCB7XG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBmID8gXCJzcGFjZS1iZXR3ZWVuXCIgOiBcImZsZXgtZW5kXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiBbZiAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goSEEsIHtcbiAgICAgICAgICAgIGhhc2g6IG4sXG4gICAgICAgICAgICByZWFjdGlvbnM6IGksXG4gICAgICAgICAgICBvbkNvbW1lbnQ6IFIsXG4gICAgICAgICAgICBvblJlY2FzdDogYixcbiAgICAgICAgICAgIG9uTGlrZTogTyxcbiAgICAgICAgICAgIGlzTGlrZWQ6ICRcbiAgICAgICAgICB9KSwgZiAmJiBzICYmIG4gJiYgLyogQF9fUFVSRV9fICovIHEuanN4KEljLCB7XG4gICAgICAgICAgICB1cmw6IGBodHRwczovL2ZhcmNhc3Rlci54eXovJHtzfS8ke24uc2xpY2UoMCwgMTApfWBcbiAgICAgICAgICB9KV1cbiAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoeWYsIHtcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6IGYgPyBcIlwiIDogXCJzcGFjZS1iZXR3ZWVuXCIsXG4gICAgICAgICAgICBtYXJnaW5Ub3A6IFwiMTBweFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoeWYsIHtcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIGp1c3RpZnlDb250ZW50OiBmID8gXCJcIiA6IFwic3BhY2UtYmV0d2VlblwiLFxuICAgICAgICAgICAgICBnYXA6IDZcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoXCJkaXZcIiwge1xuICAgICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IFwiZmxleFwiLFxuICAgICAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgZ2FwOiBcIjRweFwiLFxuICAgICAgICAgICAgICAgIGNvbG9yOiBcIiM5OTk5OTlcIlxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeCh0bSwge30pLCBvXVxuICAgICAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImRpdlwiLCB7XG4gICAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogXCIwcHggMTBweFwiXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgICAgICBhbGlnbkl0ZW1zOiBcImNlbnRlclwiLFxuICAgICAgICAgICAgICAgIGdhcDogXCI0cHhcIixcbiAgICAgICAgICAgICAgICBjb2xvcjogXCIjOTk5OTk5XCJcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3gocm0sIHt9KSwgXCIgXCIsIENdXG4gICAgICAgICAgICB9KSwgYyAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKHEuRnJhZ21lbnQsIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge30pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKGRJLCB7XG4gICAgICAgICAgICAgICAgaHJlZjogYGh0dHBzOi8vZmFyY2FzdGVyLnh5ei9+L2NoYW5uZWwvJHtjLmlkfWAsXG4gICAgICAgICAgICAgICAgdGFyZ2V0OiBcIl9ibGFua1wiLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXCIvXCIsIGMuaWRdXG4gICAgICAgICAgICAgIH0pXVxuICAgICAgICAgICAgfSldXG4gICAgICAgICAgfSksICFmICYmIHMgJiYgbiAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goSWMsIHtcbiAgICAgICAgICAgIHVybDogYGh0dHBzOi8vZmFyY2FzdGVyLnh5ei8ke3N9LyR7bi5zbGljZSgwLCAxMCl9YFxuICAgICAgICAgIH0pXVxuICAgICAgICB9KV1cbiAgICAgIH0pXVxuICAgIH0pXG4gIH0pO1xufSksIEVJID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiczFtNm9iMWFcIl1cbn0pLCB2ZiA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInIxZXNldmM3XCJdXG59KSwgRWYgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJ2eGIxZjAwXCJdXG59KSwgeEkgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJodHYwcXo3XCJdXG59KSwgeGYgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJyemtzeTJcIl1cbn0pO1xuZnVuY3Rpb24gU0kocykge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4KEVJLCB7XG4gICAgY2hpbGRyZW46IHMuY2FzdHMubWFwKChlLCB0KSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKHZmLCB7XG4gICAgICBjaGlsZHJlbjogW3QgIT09IDAgJiYgLyogQF9fUFVSRV9fICovIHEuanN4KEVmLCB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgbGVmdDogXCI0MnB4XCJcbiAgICAgICAgfVxuICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoeGYsIHtcbiAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3gob2EsIHtcbiAgICAgICAgICBpc0VtYmVkOiAhMSxcbiAgICAgICAgICAuLi5lXG4gICAgICAgIH0pLCB0ID09PSAwICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeCh4SSwge30pLCBlLmRpcmVjdF9yZXBsaWVzICYmIGUuZGlyZWN0X3JlcGxpZXMubGVuZ3RoID4gMCAmJiBlLmRpcmVjdF9yZXBsaWVzLm1hcCgociwgbikgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyh2Ziwge1xuICAgICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KEVmLCB7XG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICBsZWZ0OiBcIjQycHhcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goeGYsIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3gob2EsIHtcbiAgICAgICAgICAgICAgaXNFbWJlZDogITEsXG4gICAgICAgICAgICAgIC4uLnJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSldXG4gICAgICAgIH0sIG4pKV1cbiAgICAgIH0pXVxuICAgIH0sIHQpKVxuICB9KTtcbn1cbmFzeW5jIGZ1bmN0aW9uIGJJKHtcbiAgdHlwZTogcyxcbiAgaWRlbnRpZmllcjogZSxcbiAgcmVwbHlEZXB0aDogdCA9IDIsXG4gIGluY2x1ZGVDaHJvbm9sb2dpY2FsUGFyZW50Q2FzdHM6IHIgPSAhMSxcbiAgbGltaXQ6IG4gPSAyMCxcbiAgdmlld2VyRmlkOiBpLFxuICBjbGllbnRJZDogb1xufSkge1xuICB0cnkge1xuICAgIGxldCBhID0gYCR7b259L3YyL2ZhcmNhc3Rlci9jYXN0L2NvbnZlcnNhdGlvbj9pZGVudGlmaWVyPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfSZ0eXBlPSR7c30mcmVwbHlfZGVwdGg9JHt0fSZpbmNsdWRlX2Nocm9ub2xvZ2ljYWxfcGFyZW50X2Nhc3RzPSR7cn0mbGltaXQ9JHtufSZjbGllbnRfaWQ9JHtvfWA7XG4gICAgcmV0dXJuIGkgJiYgKGEgKz0gYCZ2aWV3ZXJfZmlkPSR7aX1gKSwgYXdhaXQgKGF3YWl0IGFuKGEsIHtcbiAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgYWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgfVxuICAgIH0pKS5qc29uKCkgfHwgbnVsbDtcbiAgfSBjYXRjaCAoYSkge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgY29udmVyc2F0aW9uXCIsIGEpLCBudWxsO1xuICB9XG59XG5mdW5jdGlvbiBubShzKSB7XG4gIHJldHVybiB7XG4gICAgdXNlcm5hbWU6IHMuYXV0aG9yLnVzZXJuYW1lLFxuICAgIGRpc3BsYXlOYW1lOiBzLmF1dGhvci5kaXNwbGF5X25hbWUsXG4gICAgYXZhdGFySW1nVXJsOiBzLmF1dGhvci5wZnBfdXJsLFxuICAgIHRleHQ6IHMudGV4dCxcbiAgICBoYXNoOiBzLmhhc2gsXG4gICAgcmVhY3Rpb25zOiBzLnJlYWN0aW9ucyxcbiAgICByZXBsaWVzOiBzLnJlcGxpZXMuY291bnQsXG4gICAgZW1iZWRzOiBzLmVtYmVkcyxcbiAgICBmcmFtZXM6IHMuZnJhbWVzLFxuICAgIHJlbmRlckVtYmVkczogcy5yZW5kZXJFbWJlZHMsXG4gICAgY2hhbm5lbDogcy5jaGFubmVsLFxuICAgIHZpZXdlckZpZDogMixcbiAgICBoYXNQb3dlckJhZGdlOiBzLmF1dGhvci5wb3dlcl9iYWRnZSxcbiAgICBhcHBBdmF0YXJJbWdVcmw6IHMuYXBwLnBmcF91cmwsXG4gICAgaXNPd25Qcm9maWxlOiAhMSxcbiAgICBhbGxvd1JlYWN0aW9uczogITAsXG4gICAgcmVuZGVyRnJhbWVzOiAhMSxcbiAgICBkaXJlY3RfcmVwbGllczogcy5kaXJlY3RfcmVwbGllcyA/IHMuZGlyZWN0X3JlcGxpZXMubWFwKG5tKSA6IFtdLFxuICAgIHRpbWVzdGFtcDogcy50aW1lc3RhbXBcbiAgfTtcbn1cbmZ1bmN0aW9uIFRJKHMpIHtcbiAgY29uc3QgZSA9IFtdO1xuICByZXR1cm4gcy5jYXN0ICYmIGUucHVzaChubShzLmNhc3QpKSwgZTtcbn1cbmNvbnN0IG1SID0gKHtcbiAgdHlwZTogcyxcbiAgaWRlbnRpZmllcjogZSxcbiAgcmVwbHlEZXB0aDogdCA9IDIsXG4gIGluY2x1ZGVDaHJvbm9sb2dpY2FsUGFyZW50Q2FzdHM6IHIgPSAhMSxcbiAgbGltaXQ6IG4gPSAyMCxcbiAgdmlld2VyRmlkOiBpXG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGllbnRfaWQ6IG9cbiAgfSA9IHRzKCksIFthLCBsXSA9IHN0LnVzZVN0YXRlKG51bGwpLCBbYywgdV0gPSBzdC51c2VTdGF0ZSghMCksIFtkLCBoXSA9IHN0LnVzZVN0YXRlKG51bGwpO1xuICByZXR1cm4gc3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICB1KCEwKSwgaChudWxsKSwgYkkoe1xuICAgICAgdHlwZTogcyxcbiAgICAgIGlkZW50aWZpZXI6IGUsXG4gICAgICByZXBseURlcHRoOiB0LFxuICAgICAgaW5jbHVkZUNocm9ub2xvZ2ljYWxQYXJlbnRDYXN0czogcixcbiAgICAgIGxpbWl0OiBuLFxuICAgICAgdmlld2VyRmlkOiBpLFxuICAgICAgY2xpZW50SWQ6IG9cbiAgICB9KS50aGVuKChmKSA9PiB7XG4gICAgICBsKGYpO1xuICAgIH0pLmNhdGNoKChmKSA9PiB7XG4gICAgICBoKGYpO1xuICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgdSghMSk7XG4gICAgfSk7XG4gIH0sIFtzLCBlLCB0LCByLCBuLCBpLCBvXSksIGMgPyAvKiBAX19QVVJFX18gKi8gcS5qc3gocS5GcmFnbWVudCwge1xuICAgIGNoaWxkcmVuOiBcIiBcIlxuICB9KSA6IGQgPyAvKiBAX19QVVJFX18gKi8gcS5qc3gocS5GcmFnbWVudCwge1xuICAgIGNoaWxkcmVuOiBcIiBcIlxuICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChTSSwge1xuICAgIGNhc3RzOiBUSShhLmNvbnZlcnNhdGlvbilcbiAgfSk7XG59O1xudmFyIE9sID0geyBleHBvcnRzOiB7fSB9LCBCbCA9IHt9O1xuLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogdXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUtc2hpbS5wcm9kdWN0aW9uLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xudmFyIFNmO1xuZnVuY3Rpb24gd0koKSB7XG4gIGlmIChTZikgcmV0dXJuIEJsO1xuICBTZiA9IDE7XG4gIHZhciBzID0gc3Q7XG4gIGZ1bmN0aW9uIGUoZCwgaCkge1xuICAgIHJldHVybiBkID09PSBoICYmIChkICE9PSAwIHx8IDEgLyBkID09PSAxIC8gaCkgfHwgZCAhPT0gZCAmJiBoICE9PSBoO1xuICB9XG4gIHZhciB0ID0gdHlwZW9mIE9iamVjdC5pcyA9PSBcImZ1bmN0aW9uXCIgPyBPYmplY3QuaXMgOiBlLCByID0gcy51c2VTdGF0ZSwgbiA9IHMudXNlRWZmZWN0LCBpID0gcy51c2VMYXlvdXRFZmZlY3QsIG8gPSBzLnVzZURlYnVnVmFsdWU7XG4gIGZ1bmN0aW9uIGEoZCwgaCkge1xuICAgIHZhciBmID0gaCgpLCBwID0gcih7IGluc3Q6IHsgdmFsdWU6IGYsIGdldFNuYXBzaG90OiBoIH0gfSksIHkgPSBwWzBdLmluc3QsIEUgPSBwWzFdO1xuICAgIHJldHVybiBpKFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHkudmFsdWUgPSBmLCB5LmdldFNuYXBzaG90ID0gaCwgbCh5KSAmJiBFKHsgaW5zdDogeSB9KTtcbiAgICAgIH0sXG4gICAgICBbZCwgZiwgaF1cbiAgICApLCBuKFxuICAgICAgZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBsKHkpICYmIEUoeyBpbnN0OiB5IH0pLCBkKGZ1bmN0aW9uKCkge1xuICAgICAgICAgIGwoeSkgJiYgRSh7IGluc3Q6IHkgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIFtkXVxuICAgICksIG8oZiksIGY7XG4gIH1cbiAgZnVuY3Rpb24gbChkKSB7XG4gICAgdmFyIGggPSBkLmdldFNuYXBzaG90O1xuICAgIGQgPSBkLnZhbHVlO1xuICAgIHRyeSB7XG4gICAgICB2YXIgZiA9IGgoKTtcbiAgICAgIHJldHVybiAhdChkLCBmKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiAhMDtcbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gYyhkLCBoKSB7XG4gICAgcmV0dXJuIGgoKTtcbiAgfVxuICB2YXIgdSA9IHR5cGVvZiB3aW5kb3cgPiBcInVcIiB8fCB0eXBlb2Ygd2luZG93LmRvY3VtZW50ID4gXCJ1XCIgfHwgdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50ID4gXCJ1XCIgPyBjIDogYTtcbiAgcmV0dXJuIEJsLnVzZVN5bmNFeHRlcm5hbFN0b3JlID0gcy51c2VTeW5jRXh0ZXJuYWxTdG9yZSAhPT0gdm9pZCAwID8gcy51c2VTeW5jRXh0ZXJuYWxTdG9yZSA6IHUsIEJsO1xufVxudmFyIGJmO1xuZnVuY3Rpb24gQUkoKSB7XG4gIHJldHVybiBiZiB8fCAoYmYgPSAxLCBPbC5leHBvcnRzID0gd0koKSksIE9sLmV4cG9ydHM7XG59XG52YXIgaW0gPSBBSSgpO1xuY29uc3Qgb20gPSAwLCBhbSA9IDEsIGxtID0gMiwgVGYgPSAzO1xudmFyIHdmID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbmZ1bmN0aW9uIF9jKHMsIGUpIHtcbiAgdmFyIHQsIHI7XG4gIGlmIChzID09PSBlKSByZXR1cm4gITA7XG4gIGlmIChzICYmIGUgJiYgKHQgPSBzLmNvbnN0cnVjdG9yKSA9PT0gZS5jb25zdHJ1Y3Rvcikge1xuICAgIGlmICh0ID09PSBEYXRlKSByZXR1cm4gcy5nZXRUaW1lKCkgPT09IGUuZ2V0VGltZSgpO1xuICAgIGlmICh0ID09PSBSZWdFeHApIHJldHVybiBzLnRvU3RyaW5nKCkgPT09IGUudG9TdHJpbmcoKTtcbiAgICBpZiAodCA9PT0gQXJyYXkpIHtcbiAgICAgIGlmICgociA9IHMubGVuZ3RoKSA9PT0gZS5sZW5ndGgpXG4gICAgICAgIGZvciAoOyByLS0gJiYgX2Moc1tyXSwgZVtyXSk7ICkgO1xuICAgICAgcmV0dXJuIHIgPT09IC0xO1xuICAgIH1cbiAgICBpZiAoIXQgfHwgdHlwZW9mIHMgPT0gXCJvYmplY3RcIikge1xuICAgICAgciA9IDA7XG4gICAgICBmb3IgKHQgaW4gcylcbiAgICAgICAgaWYgKHdmLmNhbGwocywgdCkgJiYgKytyICYmICF3Zi5jYWxsKGUsIHQpIHx8ICEodCBpbiBlKSB8fCAhX2Moc1t0XSwgZVt0XSkpIHJldHVybiAhMTtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhlKS5sZW5ndGggPT09IHI7XG4gICAgfVxuICB9XG4gIHJldHVybiBzICE9PSBzICYmIGUgIT09IGU7XG59XG5jb25zdCBxciA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBDcyA9ICgpID0+IHtcbn0sIHF0ID0gKFxuICAvKiNfX05PSU5MSU5FX18qL1xuICBDcygpXG4pLCBSYyA9IE9iamVjdCwgJGUgPSAocykgPT4gcyA9PT0gcXQsIE1yID0gKHMpID0+IHR5cGVvZiBzID09IFwiZnVuY3Rpb25cIiwgQnMgPSAocywgZSkgPT4gKHtcbiAgLi4ucyxcbiAgLi4uZVxufSksIGNtID0gKHMpID0+IE1yKHMudGhlbiksIEZsID0ge30sIG9vID0ge30sIEZ1ID0gXCJ1bmRlZmluZWRcIiwgUGkgPSB0eXBlb2Ygd2luZG93ICE9IEZ1LCBMYyA9IHR5cGVvZiBkb2N1bWVudCAhPSBGdSwgSUkgPSBQaSAmJiBcIkRlbm9cIiBpbiB3aW5kb3csIF9JID0gKCkgPT4gUGkgJiYgdHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT0gRnUsIF9zID0gKHMsIGUpID0+IHtcbiAgY29uc3QgdCA9IHFyLmdldChzKTtcbiAgcmV0dXJuIFtcbiAgICAvLyBHZXR0ZXJcbiAgICAoKSA9PiAhJGUoZSkgJiYgcy5nZXQoZSkgfHwgRmwsXG4gICAgLy8gU2V0dGVyXG4gICAgKHIpID0+IHtcbiAgICAgIGlmICghJGUoZSkpIHtcbiAgICAgICAgY29uc3QgbiA9IHMuZ2V0KGUpO1xuICAgICAgICBlIGluIG9vIHx8IChvb1tlXSA9IG4pLCB0WzVdKGUsIEJzKG4sIHIpLCBuIHx8IEZsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIFN1YnNjcmliZXJcbiAgICB0WzZdLFxuICAgIC8vIEdldCBzZXJ2ZXIgY2FjaGUgc25hcHNob3RcbiAgICAoKSA9PiAhJGUoZSkgJiYgZSBpbiBvbyA/IG9vW2VdIDogISRlKGUpICYmIHMuZ2V0KGUpIHx8IEZsXG4gIF07XG59O1xubGV0IENjID0gITA7XG5jb25zdCBSSSA9ICgpID0+IENjLCBba2MsIERjXSA9IFBpICYmIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyID8gW1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lci5iaW5kKHdpbmRvdyksXG4gIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyLmJpbmQod2luZG93KVxuXSA6IFtcbiAgQ3MsXG4gIENzXG5dLCBMSSA9ICgpID0+IHtcbiAgY29uc3QgcyA9IExjICYmIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZTtcbiAgcmV0dXJuICRlKHMpIHx8IHMgIT09IFwiaGlkZGVuXCI7XG59LCBDSSA9IChzKSA9PiAoTGMgJiYgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgcyksIGtjKFwiZm9jdXNcIiwgcyksICgpID0+IHtcbiAgTGMgJiYgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInZpc2liaWxpdHljaGFuZ2VcIiwgcyksIERjKFwiZm9jdXNcIiwgcyk7XG59KSwga0kgPSAocykgPT4ge1xuICBjb25zdCBlID0gKCkgPT4ge1xuICAgIENjID0gITAsIHMoKTtcbiAgfSwgdCA9ICgpID0+IHtcbiAgICBDYyA9ICExO1xuICB9O1xuICByZXR1cm4ga2MoXCJvbmxpbmVcIiwgZSksIGtjKFwib2ZmbGluZVwiLCB0KSwgKCkgPT4ge1xuICAgIERjKFwib25saW5lXCIsIGUpLCBEYyhcIm9mZmxpbmVcIiwgdCk7XG4gIH07XG59LCBESSA9IHtcbiAgaXNPbmxpbmU6IFJJLFxuICBpc1Zpc2libGU6IExJXG59LCBQSSA9IHtcbiAgaW5pdEZvY3VzOiBDSSxcbiAgaW5pdFJlY29ubmVjdDoga0lcbn0sIEFmID0gIXN0LnVzZUlkLCBUaSA9ICFQaSB8fCBJSSwgTUkgPSAocykgPT4gX0koKSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUocykgOiBzZXRUaW1lb3V0KHMsIDEpLCBTbyA9IFRpID8gZnQgOiBFbSwgTmwgPSB0eXBlb2YgbmF2aWdhdG9yIDwgXCJ1XCIgJiYgbmF2aWdhdG9yLmNvbm5lY3Rpb24sIElmID0gIVRpICYmIE5sICYmIChbXG4gIFwic2xvdy0yZ1wiLFxuICBcIjJnXCJcbl0uaW5jbHVkZXMoTmwuZWZmZWN0aXZlVHlwZSkgfHwgTmwuc2F2ZURhdGEpLCBhbyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBPSSA9IChzKSA9PiBSYy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKSwgVWwgPSAocywgZSkgPT4gcyA9PT0gYFtvYmplY3QgJHtlfV1gO1xubGV0IEJJID0gMDtcbmNvbnN0IFBjID0gKHMpID0+IHtcbiAgY29uc3QgZSA9IHR5cGVvZiBzLCB0ID0gT0kocyksIHIgPSBVbCh0LCBcIkRhdGVcIiksIG4gPSBVbCh0LCBcIlJlZ0V4cFwiKSwgaSA9IFVsKHQsIFwiT2JqZWN0XCIpO1xuICBsZXQgbywgYTtcbiAgaWYgKFJjKHMpID09PSBzICYmICFyICYmICFuKSB7XG4gICAgaWYgKG8gPSBhby5nZXQocyksIG8pIHJldHVybiBvO1xuICAgIGlmIChvID0gKytCSSArIFwiflwiLCBhby5zZXQocywgbyksIEFycmF5LmlzQXJyYXkocykpIHtcbiAgICAgIGZvciAobyA9IFwiQFwiLCBhID0gMDsgYSA8IHMubGVuZ3RoOyBhKyspXG4gICAgICAgIG8gKz0gUGMoc1thXSkgKyBcIixcIjtcbiAgICAgIGFvLnNldChzLCBvKTtcbiAgICB9XG4gICAgaWYgKGkpIHtcbiAgICAgIG8gPSBcIiNcIjtcbiAgICAgIGNvbnN0IGwgPSBSYy5rZXlzKHMpLnNvcnQoKTtcbiAgICAgIGZvciAoOyAhJGUoYSA9IGwucG9wKCkpOyApXG4gICAgICAgICRlKHNbYV0pIHx8IChvICs9IGEgKyBcIjpcIiArIFBjKHNbYV0pICsgXCIsXCIpO1xuICAgICAgYW8uc2V0KHMsIG8pO1xuICAgIH1cbiAgfSBlbHNlXG4gICAgbyA9IHIgPyBzLnRvSlNPTigpIDogZSA9PSBcInN5bWJvbFwiID8gcy50b1N0cmluZygpIDogZSA9PSBcInN0cmluZ1wiID8gSlNPTi5zdHJpbmdpZnkocykgOiBcIlwiICsgcztcbiAgcmV0dXJuIG87XG59LCB3aSA9IChzKSA9PiB7XG4gIGlmIChNcihzKSlcbiAgICB0cnkge1xuICAgICAgcyA9IHMoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHMgPSBcIlwiO1xuICAgIH1cbiAgY29uc3QgZSA9IHM7XG4gIHJldHVybiBzID0gdHlwZW9mIHMgPT0gXCJzdHJpbmdcIiA/IHMgOiAoQXJyYXkuaXNBcnJheShzKSA/IHMubGVuZ3RoIDogcykgPyBQYyhzKSA6IFwiXCIsIFtcbiAgICBzLFxuICAgIGVcbiAgXTtcbn07XG5sZXQgRkkgPSAwO1xuY29uc3QgTWMgPSAoKSA9PiArK0ZJO1xuYXN5bmMgZnVuY3Rpb24gdW0oLi4ucykge1xuICBjb25zdCBbZSwgdCwgciwgbl0gPSBzLCBpID0gQnMoe1xuICAgIHBvcHVsYXRlQ2FjaGU6ICEwLFxuICAgIHRocm93T25FcnJvcjogITBcbiAgfSwgdHlwZW9mIG4gPT0gXCJib29sZWFuXCIgPyB7XG4gICAgcmV2YWxpZGF0ZTogblxuICB9IDogbiB8fCB7fSk7XG4gIGxldCBvID0gaS5wb3B1bGF0ZUNhY2hlO1xuICBjb25zdCBhID0gaS5yb2xsYmFja09uRXJyb3I7XG4gIGxldCBsID0gaS5vcHRpbWlzdGljRGF0YTtcbiAgY29uc3QgYyA9IChoKSA9PiB0eXBlb2YgYSA9PSBcImZ1bmN0aW9uXCIgPyBhKGgpIDogYSAhPT0gITEsIHUgPSBpLnRocm93T25FcnJvcjtcbiAgaWYgKE1yKHQpKSB7XG4gICAgY29uc3QgaCA9IHQsIGYgPSBbXSwgcCA9IGUua2V5cygpO1xuICAgIGZvciAoY29uc3QgeSBvZiBwKVxuICAgICAgLy8gU2tpcCB0aGUgc3BlY2lhbCB1c2VTV1JJbmZpbml0ZSBhbmQgdXNlU1dSU3Vic2NyaXB0aW9uIGtleXMuXG4gICAgICAhL15cXCQoaW5mfHN1YilcXCQvLnRlc3QoeSkgJiYgaChlLmdldCh5KS5faykgJiYgZi5wdXNoKHkpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChmLm1hcChkKSk7XG4gIH1cbiAgcmV0dXJuIGQodCk7XG4gIGFzeW5jIGZ1bmN0aW9uIGQoaCkge1xuICAgIGNvbnN0IFtmXSA9IHdpKGgpO1xuICAgIGlmICghZikgcmV0dXJuO1xuICAgIGNvbnN0IFtwLCB5XSA9IF9zKGUsIGYpLCBbRSwgYiwgUiwgQV0gPSBxci5nZXQoZSksIEYgPSAoKSA9PiB7XG4gICAgICBjb25zdCBnID0gRVtmXTtcbiAgICAgIHJldHVybiAoTXIoaS5yZXZhbGlkYXRlKSA/IGkucmV2YWxpZGF0ZShwKCkuZGF0YSwgaCkgOiBpLnJldmFsaWRhdGUgIT09ICExKSAmJiAoZGVsZXRlIFJbZl0sIGRlbGV0ZSBBW2ZdLCBnICYmIGdbMF0pID8gZ1swXShsbSkudGhlbigoKSA9PiBwKCkuZGF0YSkgOiBwKCkuZGF0YTtcbiAgICB9O1xuICAgIGlmIChzLmxlbmd0aCA8IDMpXG4gICAgICByZXR1cm4gRigpO1xuICAgIGxldCBNID0gciwgSCwgSyA9ICExO1xuICAgIGNvbnN0IGogPSBNYygpO1xuICAgIGJbZl0gPSBbXG4gICAgICBqLFxuICAgICAgMFxuICAgIF07XG4gICAgY29uc3QgQyA9ICEkZShsKSwgayA9IHAoKSwgJCA9IGsuZGF0YSwgVyA9IGsuX2MsIF8gPSAkZShXKSA/ICQgOiBXO1xuICAgIGlmIChDICYmIChsID0gTXIobCkgPyBsKF8sICQpIDogbCwgeSh7XG4gICAgICBkYXRhOiBsLFxuICAgICAgX2M6IF9cbiAgICB9KSksIE1yKE0pKVxuICAgICAgdHJ5IHtcbiAgICAgICAgTSA9IE0oXyk7XG4gICAgICB9IGNhdGNoIChnKSB7XG4gICAgICAgIEggPSBnLCBLID0gITA7XG4gICAgICB9XG4gICAgaWYgKE0gJiYgY20oTSkpXG4gICAgICBpZiAoTSA9IGF3YWl0IE0uY2F0Y2goKGcpID0+IHtcbiAgICAgICAgSCA9IGcsIEsgPSAhMDtcbiAgICAgIH0pLCBqICE9PSBiW2ZdWzBdKSB7XG4gICAgICAgIGlmIChLKSB0aHJvdyBIO1xuICAgICAgICByZXR1cm4gTTtcbiAgICAgIH0gZWxzZSBLICYmIEMgJiYgYyhIKSAmJiAobyA9ICEwLCB5KHtcbiAgICAgICAgZGF0YTogXyxcbiAgICAgICAgX2M6IHF0XG4gICAgICB9KSk7XG4gICAgaWYgKG8gJiYgIUspXG4gICAgICBpZiAoTXIobykpIHtcbiAgICAgICAgY29uc3QgZyA9IG8oTSwgXyk7XG4gICAgICAgIHkoe1xuICAgICAgICAgIGRhdGE6IGcsXG4gICAgICAgICAgZXJyb3I6IHF0LFxuICAgICAgICAgIF9jOiBxdFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZVxuICAgICAgICB5KHtcbiAgICAgICAgICBkYXRhOiBNLFxuICAgICAgICAgIGVycm9yOiBxdCxcbiAgICAgICAgICBfYzogcXRcbiAgICAgICAgfSk7XG4gICAgaWYgKGJbZl1bMV0gPSBNYygpLCBQcm9taXNlLnJlc29sdmUoRigpKS50aGVuKCgpID0+IHtcbiAgICAgIHkoe1xuICAgICAgICBfYzogcXRcbiAgICAgIH0pO1xuICAgIH0pLCBLKSB7XG4gICAgICBpZiAodSkgdGhyb3cgSDtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIE07XG4gIH1cbn1cbmNvbnN0IF9mID0gKHMsIGUpID0+IHtcbiAgZm9yIChjb25zdCB0IGluIHMpXG4gICAgc1t0XVswXSAmJiBzW3RdWzBdKGUpO1xufSwgTkkgPSAocywgZSkgPT4ge1xuICBpZiAoIXFyLmhhcyhzKSkge1xuICAgIGNvbnN0IHQgPSBCcyhQSSwgZSksIHIgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSwgbiA9IHVtLmJpbmQocXQsIHMpO1xuICAgIGxldCBpID0gQ3M7XG4gICAgY29uc3QgbyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLCBhID0gKHUsIGQpID0+IHtcbiAgICAgIGNvbnN0IGggPSBvW3VdIHx8IFtdO1xuICAgICAgcmV0dXJuIG9bdV0gPSBoLCBoLnB1c2goZCksICgpID0+IGguc3BsaWNlKGguaW5kZXhPZihkKSwgMSk7XG4gICAgfSwgbCA9ICh1LCBkLCBoKSA9PiB7XG4gICAgICBzLnNldCh1LCBkKTtcbiAgICAgIGNvbnN0IGYgPSBvW3VdO1xuICAgICAgaWYgKGYpXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiBmKVxuICAgICAgICAgIHAoZCwgaCk7XG4gICAgfSwgYyA9ICgpID0+IHtcbiAgICAgIGlmICghcXIuaGFzKHMpICYmIChxci5zZXQocywgW1xuICAgICAgICByLFxuICAgICAgICAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSxcbiAgICAgICAgLyogQF9fUFVSRV9fICovIE9iamVjdC5jcmVhdGUobnVsbCksXG4gICAgICAgIC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpLFxuICAgICAgICBuLFxuICAgICAgICBsLFxuICAgICAgICBhXG4gICAgICBdKSwgIVRpKSkge1xuICAgICAgICBjb25zdCB1ID0gdC5pbml0Rm9jdXMoc2V0VGltZW91dC5iaW5kKHF0LCBfZi5iaW5kKHF0LCByLCBvbSkpKSwgZCA9IHQuaW5pdFJlY29ubmVjdChzZXRUaW1lb3V0LmJpbmQocXQsIF9mLmJpbmQocXQsIHIsIGFtKSkpO1xuICAgICAgICBpID0gKCkgPT4ge1xuICAgICAgICAgIHUgJiYgdSgpLCBkICYmIGQoKSwgcXIuZGVsZXRlKHMpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGMoKSwgW1xuICAgICAgcyxcbiAgICAgIG4sXG4gICAgICBjLFxuICAgICAgaVxuICAgIF07XG4gIH1cbiAgcmV0dXJuIFtcbiAgICBzLFxuICAgIHFyLmdldChzKVs0XVxuICBdO1xufSwgVUkgPSAocywgZSwgdCwgciwgbikgPT4ge1xuICBjb25zdCBpID0gdC5lcnJvclJldHJ5Q291bnQsIG8gPSBuLnJldHJ5Q291bnQsIGEgPSB+figoTWF0aC5yYW5kb20oKSArIDAuNSkgKiAoMSA8PCAobyA8IDggPyBvIDogOCkpKSAqIHQuZXJyb3JSZXRyeUludGVydmFsO1xuICAhJGUoaSkgJiYgbyA+IGkgfHwgc2V0VGltZW91dChyLCBhLCBuKTtcbn0sICRJID0gX2MsIFtOdSwgR0ldID0gTkkoLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKSksIFZJID0gQnMoXG4gIHtcbiAgICAvLyBldmVudHNcbiAgICBvbkxvYWRpbmdTbG93OiBDcyxcbiAgICBvblN1Y2Nlc3M6IENzLFxuICAgIG9uRXJyb3I6IENzLFxuICAgIG9uRXJyb3JSZXRyeTogVUksXG4gICAgb25EaXNjYXJkZWQ6IENzLFxuICAgIC8vIHN3aXRjaGVzXG4gICAgcmV2YWxpZGF0ZU9uRm9jdXM6ICEwLFxuICAgIHJldmFsaWRhdGVPblJlY29ubmVjdDogITAsXG4gICAgcmV2YWxpZGF0ZUlmU3RhbGU6ICEwLFxuICAgIHNob3VsZFJldHJ5T25FcnJvcjogITAsXG4gICAgLy8gdGltZW91dHNcbiAgICBlcnJvclJldHJ5SW50ZXJ2YWw6IElmID8gMWU0IDogNWUzLFxuICAgIGZvY3VzVGhyb3R0bGVJbnRlcnZhbDogNSAqIDFlMyxcbiAgICBkZWR1cGluZ0ludGVydmFsOiAyICogMWUzLFxuICAgIGxvYWRpbmdUaW1lb3V0OiBJZiA/IDVlMyA6IDNlMyxcbiAgICAvLyBwcm92aWRlcnNcbiAgICBjb21wYXJlOiAkSSxcbiAgICBpc1BhdXNlZDogKCkgPT4gITEsXG4gICAgY2FjaGU6IE51LFxuICAgIG11dGF0ZTogR0ksXG4gICAgZmFsbGJhY2s6IHt9XG4gIH0sXG4gIC8vIHVzZSB3ZWIgcHJlc2V0IGJ5IGRlZmF1bHRcbiAgRElcbiksIGpJID0gKHMsIGUpID0+IHtcbiAgY29uc3QgdCA9IEJzKHMsIGUpO1xuICBpZiAoZSkge1xuICAgIGNvbnN0IHsgdXNlOiByLCBmYWxsYmFjazogbiB9ID0gcywgeyB1c2U6IGksIGZhbGxiYWNrOiBvIH0gPSBlO1xuICAgIHIgJiYgaSAmJiAodC51c2UgPSByLmNvbmNhdChpKSksIG4gJiYgbyAmJiAodC5mYWxsYmFjayA9IEJzKG4sIG8pKTtcbiAgfVxuICByZXR1cm4gdDtcbn0sIEtJID0gYWEoe30pLCBkbSA9IFwiJGluZiRcIiwgaG0gPSBQaSAmJiB3aW5kb3cuX19TV1JfREVWVE9PTFNfVVNFX18sIEhJID0gaG0gPyB3aW5kb3cuX19TV1JfREVWVE9PTFNfVVNFX18gOiBbXSwgcUkgPSAoKSA9PiB7XG4gIGhtICYmICh3aW5kb3cuX19TV1JfREVWVE9PTFNfUkVBQ1RfXyA9IHN0KTtcbn0sIGZtID0gKHMpID0+IE1yKHNbMV0pID8gW1xuICBzWzBdLFxuICBzWzFdLFxuICBzWzJdIHx8IHt9XG5dIDogW1xuICBzWzBdLFxuICBudWxsLFxuICAoc1sxXSA9PT0gbnVsbCA/IHNbMl0gOiBzWzFdKSB8fCB7fVxuXSwgV0kgPSAoKSA9PiB7XG4gIGNvbnN0IHMgPSBBaShLSSk7XG4gIHJldHVybiBacigoKSA9PiBCcyhWSSwgcyksIFtcbiAgICBzXG4gIF0pO1xufSwgekkgPSAocykgPT4gKGUsIHQsIHIpID0+IHMoZSwgdCAmJiAoKC4uLmkpID0+IHtcbiAgY29uc3QgW29dID0gd2koZSksIFssICwgLCBhXSA9IHFyLmdldChOdSk7XG4gIGlmIChvLnN0YXJ0c1dpdGgoZG0pKVxuICAgIHJldHVybiB0KC4uLmkpO1xuICBjb25zdCBsID0gYVtvXTtcbiAgcmV0dXJuICRlKGwpID8gdCguLi5pKSA6IChkZWxldGUgYVtvXSwgbCk7XG59KSwgciksIFlJID0gSEkuY29uY2F0KHpJKSwgWkkgPSAocykgPT4gZnVuY3Rpb24oLi4udCkge1xuICBjb25zdCByID0gV0koKSwgW24sIGksIG9dID0gZm0odCksIGEgPSBqSShyLCBvKTtcbiAgbGV0IGwgPSBzO1xuICBjb25zdCB7IHVzZTogYyB9ID0gYSwgdSA9IChjIHx8IFtdKS5jb25jYXQoWUkpO1xuICBmb3IgKGxldCBkID0gdS5sZW5ndGg7IGQtLTsgKVxuICAgIGwgPSB1W2RdKGwpO1xuICByZXR1cm4gbChuLCBpIHx8IGEuZmV0Y2hlciB8fCBudWxsLCBhKTtcbn0sIFhJID0gKHMsIGUsIHQpID0+IHtcbiAgY29uc3QgciA9IGVbc10gfHwgKGVbc10gPSBbXSk7XG4gIHJldHVybiByLnB1c2godCksICgpID0+IHtcbiAgICBjb25zdCBuID0gci5pbmRleE9mKHQpO1xuICAgIG4gPj0gMCAmJiAocltuXSA9IHJbci5sZW5ndGggLSAxXSwgci5wb3AoKSk7XG4gIH07XG59LCBKSSA9IChzLCBlKSA9PiAoLi4udCkgPT4ge1xuICBjb25zdCBbciwgbiwgaV0gPSBmbSh0KSwgbyA9IChpLnVzZSB8fCBbXSkuY29uY2F0KGUpO1xuICByZXR1cm4gcyhyLCBuLCB7XG4gICAgLi4uaSxcbiAgICB1c2U6IG9cbiAgfSk7XG59O1xucUkoKTtcbmNvbnN0ICRsID0gc3QudXNlIHx8IC8vIFRoaXMgZXh0cmEgZ2VuZXJpYyBpcyB0byBhdm9pZCBUeXBlU2NyaXB0IG1peGluZyB1cCB0aGUgZ2VuZXJpYyBhbmQgSlNYIHN5dGF4XG4vLyBhbmQgZW1pdHRpbmcgYW4gZXJyb3IuXG4vLyBXZSBhc3N1bWUgdGhhdCB0aGlzIGlzIG9ubHkgZm9yIHRoZSBgdXNlKHRoZW5hYmxlKWAgY2FzZSwgbm90IGB1c2UoY29udGV4dClgLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L2Jsb2IvYWVkMDBkYWNmYjc5ZDE3YzUzMjE4NDA0YzUyYjFjN2FhNTljNGE4OS9wYWNrYWdlcy9yZWFjdC1zZXJ2ZXIvc3JjL1JlYWN0Rml6elRoZW5hYmxlLmpzI0w0NVxuKChzKSA9PiB7XG4gIHN3aXRjaCAocy5zdGF0dXMpIHtcbiAgICBjYXNlIFwicGVuZGluZ1wiOlxuICAgICAgdGhyb3cgcztcbiAgICBjYXNlIFwiZnVsZmlsbGVkXCI6XG4gICAgICByZXR1cm4gcy52YWx1ZTtcbiAgICBjYXNlIFwicmVqZWN0ZWRcIjpcbiAgICAgIHRocm93IHMucmVhc29uO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBzLnN0YXR1cyA9IFwicGVuZGluZ1wiLCBzLnRoZW4oKGUpID0+IHtcbiAgICAgICAgcy5zdGF0dXMgPSBcImZ1bGZpbGxlZFwiLCBzLnZhbHVlID0gZTtcbiAgICAgIH0sIChlKSA9PiB7XG4gICAgICAgIHMuc3RhdHVzID0gXCJyZWplY3RlZFwiLCBzLnJlYXNvbiA9IGU7XG4gICAgICB9KSwgcztcbiAgfVxufSksIEdsID0ge1xuICBkZWR1cGU6ICEwXG59LCBSZiA9IFByb21pc2UucmVzb2x2ZShxdCksIFFJID0gKHMsIGUsIHQpID0+IHtcbiAgY29uc3QgeyBjYWNoZTogciwgY29tcGFyZTogbiwgc3VzcGVuc2U6IGksIGZhbGxiYWNrRGF0YTogbywgcmV2YWxpZGF0ZU9uTW91bnQ6IGEsIHJldmFsaWRhdGVJZlN0YWxlOiBsLCByZWZyZXNoSW50ZXJ2YWw6IGMsIHJlZnJlc2hXaGVuSGlkZGVuOiB1LCByZWZyZXNoV2hlbk9mZmxpbmU6IGQsIGtlZXBQcmV2aW91c0RhdGE6IGggfSA9IHQsIFtmLCBwLCB5LCBFXSA9IHFyLmdldChyKSwgW2IsIFJdID0gd2kocyksIEEgPSBidCghMSksIEYgPSBidCghMSksIE0gPSBidChiKSwgSCA9IGJ0KGUpLCBLID0gYnQodCksIGogPSAoKSA9PiBLLmN1cnJlbnQsIEMgPSAoKSA9PiBqKCkuaXNWaXNpYmxlKCkgJiYgaigpLmlzT25saW5lKCksIFtrLCAkLCBXLCBfXSA9IF9zKHIsIGIpLCBnID0gYnQoe30pLmN1cnJlbnQsIHggPSAkZShvKSA/ICRlKHQuZmFsbGJhY2spID8gcXQgOiB0LmZhbGxiYWNrW2JdIDogbywgdyA9IChfZSwgeGUpID0+IHtcbiAgICBmb3IgKGNvbnN0IEJlIGluIGcpIHtcbiAgICAgIGNvbnN0IHllID0gQmU7XG4gICAgICBpZiAoeWUgPT09IFwiZGF0YVwiKSB7XG4gICAgICAgIGlmICghbihfZVt5ZV0sIHhlW3llXSkgJiYgKCEkZShfZVt5ZV0pIHx8ICFuKE4sIHhlW3llXSkpKVxuICAgICAgICAgIHJldHVybiAhMTtcbiAgICAgIH0gZWxzZSBpZiAoeGVbeWVdICE9PSBfZVt5ZV0pXG4gICAgICAgIHJldHVybiAhMTtcbiAgICB9XG4gICAgcmV0dXJuICEwO1xuICB9LCBEID0gWnIoKCkgPT4ge1xuICAgIGNvbnN0IF9lID0gIWIgfHwgIWUgPyAhMSA6ICRlKGEpID8gaigpLmlzUGF1c2VkKCkgfHwgaSA/ICExIDogbCAhPT0gITEgOiBhLCB4ZSA9ICh3ZSkgPT4ge1xuICAgICAgY29uc3QgTmUgPSBCcyh3ZSk7XG4gICAgICByZXR1cm4gZGVsZXRlIE5lLl9rLCBfZSA/IHtcbiAgICAgICAgaXNWYWxpZGF0aW5nOiAhMCxcbiAgICAgICAgaXNMb2FkaW5nOiAhMCxcbiAgICAgICAgLi4uTmVcbiAgICAgIH0gOiBOZTtcbiAgICB9LCBCZSA9IGsoKSwgeWUgPSBfKCksIGJlID0geGUoQmUpLCBGZSA9IEJlID09PSB5ZSA/IGJlIDogeGUoeWUpO1xuICAgIGxldCBYZSA9IGJlO1xuICAgIHJldHVybiBbXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdlID0geGUoaygpKTtcbiAgICAgICAgcmV0dXJuIHcod2UsIFhlKSA/IChYZS5kYXRhID0gd2UuZGF0YSwgWGUuaXNMb2FkaW5nID0gd2UuaXNMb2FkaW5nLCBYZS5pc1ZhbGlkYXRpbmcgPSB3ZS5pc1ZhbGlkYXRpbmcsIFhlLmVycm9yID0gd2UuZXJyb3IsIFhlKSA6IChYZSA9IHdlLCB3ZSk7XG4gICAgICB9LFxuICAgICAgKCkgPT4gRmVcbiAgICBdO1xuICB9LCBbXG4gICAgcixcbiAgICBiXG4gIF0pLCBPID0gaW0udXNlU3luY0V4dGVybmFsU3RvcmUodXQoXG4gICAgKF9lKSA9PiBXKGIsICh4ZSwgQmUpID0+IHtcbiAgICAgIHcoQmUsIHhlKSB8fCBfZSgpO1xuICAgIH0pLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbXG4gICAgICByLFxuICAgICAgYlxuICAgIF1cbiAgKSwgRFswXSwgRFsxXSksIFUgPSAhQS5jdXJyZW50LCBWID0gZltiXSAmJiBmW2JdLmxlbmd0aCA+IDAsIEwgPSBPLmRhdGEsIG0gPSAkZShMKSA/IHggJiYgY20oeCkgPyAkbCh4KSA6IHggOiBMLCB2ID0gTy5lcnJvciwgUCA9IGJ0KG0pLCBOID0gaCA/ICRlKEwpID8gJGUoUC5jdXJyZW50KSA/IG0gOiBQLmN1cnJlbnQgOiBMIDogbSwgWSA9IFYgJiYgISRlKHYpID8gITEgOiBVICYmICEkZShhKSA/IGEgOiBqKCkuaXNQYXVzZWQoKSA/ICExIDogaSA/ICRlKG0pID8gITEgOiBsIDogJGUobSkgfHwgbCwgZWUgPSAhIShiICYmIGUgJiYgVSAmJiBZKSwgaWUgPSAkZShPLmlzVmFsaWRhdGluZykgPyBlZSA6IE8uaXNWYWxpZGF0aW5nLCBsZSA9ICRlKE8uaXNMb2FkaW5nKSA/IGVlIDogTy5pc0xvYWRpbmcsIFRlID0gdXQoXG4gICAgYXN5bmMgKF9lKSA9PiB7XG4gICAgICBjb25zdCB4ZSA9IEguY3VycmVudDtcbiAgICAgIGlmICghYiB8fCAheGUgfHwgRi5jdXJyZW50IHx8IGooKS5pc1BhdXNlZCgpKVxuICAgICAgICByZXR1cm4gITE7XG4gICAgICBsZXQgQmUsIHllLCBiZSA9ICEwO1xuICAgICAgY29uc3QgRmUgPSBfZSB8fCB7fSwgWGUgPSAheVtiXSB8fCAhRmUuZGVkdXBlLCB3ZSA9ICgpID0+IEFmID8gIUYuY3VycmVudCAmJiBiID09PSBNLmN1cnJlbnQgJiYgQS5jdXJyZW50IDogYiA9PT0gTS5jdXJyZW50LCBOZSA9IHtcbiAgICAgICAgaXNWYWxpZGF0aW5nOiAhMSxcbiAgICAgICAgaXNMb2FkaW5nOiAhMVxuICAgICAgfSwgZHQgPSAoKSA9PiB7XG4gICAgICAgICQoTmUpO1xuICAgICAgfSwgSmUgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ID0geVtiXTtcbiAgICAgICAgaXQgJiYgaXRbMV0gPT09IHllICYmIGRlbGV0ZSB5W2JdO1xuICAgICAgfSwgUWUgPSB7XG4gICAgICAgIGlzVmFsaWRhdGluZzogITBcbiAgICAgIH07XG4gICAgICAkZShrKCkuZGF0YSkgJiYgKFFlLmlzTG9hZGluZyA9ICEwKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChYZSAmJiAoJChRZSksIHQubG9hZGluZ1RpbWVvdXQgJiYgJGUoaygpLmRhdGEpICYmIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGJlICYmIHdlKCkgJiYgaigpLm9uTG9hZGluZ1Nsb3coYiwgdCk7XG4gICAgICAgIH0sIHQubG9hZGluZ1RpbWVvdXQpLCB5W2JdID0gW1xuICAgICAgICAgIHhlKFIpLFxuICAgICAgICAgIE1jKClcbiAgICAgICAgXSksIFtCZSwgeWVdID0geVtiXSwgQmUgPSBhd2FpdCBCZSwgWGUgJiYgc2V0VGltZW91dChKZSwgdC5kZWR1cGluZ0ludGVydmFsKSwgIXlbYl0gfHwgeVtiXVsxXSAhPT0geWUpXG4gICAgICAgICAgcmV0dXJuIFhlICYmIHdlKCkgJiYgaigpLm9uRGlzY2FyZGVkKGIpLCAhMTtcbiAgICAgICAgTmUuZXJyb3IgPSBxdDtcbiAgICAgICAgY29uc3QgaXQgPSBwW2JdO1xuICAgICAgICBpZiAoISRlKGl0KSAmJiAvLyBjYXNlIDFcbiAgICAgICAgKHllIDw9IGl0WzBdIHx8IC8vIGNhc2UgMlxuICAgICAgICB5ZSA8PSBpdFsxXSB8fCAvLyBjYXNlIDNcbiAgICAgICAgaXRbMV0gPT09IDApKVxuICAgICAgICAgIHJldHVybiBkdCgpLCBYZSAmJiB3ZSgpICYmIGooKS5vbkRpc2NhcmRlZChiKSwgITE7XG4gICAgICAgIGNvbnN0IGplID0gaygpLmRhdGE7XG4gICAgICAgIE5lLmRhdGEgPSBuKGplLCBCZSkgPyBqZSA6IEJlLCBYZSAmJiB3ZSgpICYmIGooKS5vblN1Y2Nlc3MoQmUsIGIsIHQpO1xuICAgICAgfSBjYXRjaCAoaXQpIHtcbiAgICAgICAgSmUoKTtcbiAgICAgICAgY29uc3QgamUgPSBqKCksIHsgc2hvdWxkUmV0cnlPbkVycm9yOiBCIH0gPSBqZTtcbiAgICAgICAgamUuaXNQYXVzZWQoKSB8fCAoTmUuZXJyb3IgPSBpdCwgWGUgJiYgd2UoKSAmJiAoamUub25FcnJvcihpdCwgYiwgamUpLCAoQiA9PT0gITAgfHwgTXIoQikgJiYgQihpdCkpICYmICghaigpLnJldmFsaWRhdGVPbkZvY3VzIHx8ICFqKCkucmV2YWxpZGF0ZU9uUmVjb25uZWN0IHx8IEMoKSkgJiYgamUub25FcnJvclJldHJ5KGl0LCBiLCBqZSwgKFMpID0+IHtcbiAgICAgICAgICBjb25zdCBUID0gZltiXTtcbiAgICAgICAgICBUICYmIFRbMF0gJiYgVFswXShUZiwgUyk7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICByZXRyeUNvdW50OiAoRmUucmV0cnlDb3VudCB8fCAwKSArIDEsXG4gICAgICAgICAgZGVkdXBlOiAhMFxuICAgICAgICB9KSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGJlID0gITEsIGR0KCksICEwO1xuICAgIH0sXG4gICAgLy8gYHNldFN0YXRlYCBpcyBpbW11dGFibGUsIGFuZCBgZXZlbnRzQ2FsbGJhY2tgLCBgZm5BcmdgLCBhbmRcbiAgICAvLyBga2V5VmFsaWRhdGluZ2AgYXJlIGRlcGVuZGluZyBvbiBga2V5YCwgc28gd2UgY2FuIGV4Y2x1ZGUgdGhlbSBmcm9tXG4gICAgLy8gdGhlIGRlcHMgYXJyYXkuXG4gICAgLy9cbiAgICAvLyBGSVhNRTpcbiAgICAvLyBgZm5gIGFuZCBgY29uZmlnYCBtaWdodCBiZSBjaGFuZ2VkIGR1cmluZyB0aGUgbGlmZWN5Y2xlLFxuICAgIC8vIGJ1dCB0aGV5IG1pZ2h0IGJlIGNoYW5nZWQgZXZlcnkgcmVuZGVyIGxpa2UgdGhpcy5cbiAgICAvLyBgdXNlU1dSKCdrZXknLCAoKSA9PiBmZXRjaCgnL2FwaS8nKSwgeyBzdXNwZW5zZTogdHJ1ZSB9KWBcbiAgICAvLyBTbyB3ZSBvbWl0IHRoZSB2YWx1ZXMgZnJvbSB0aGUgZGVwcyBhcnJheVxuICAgIC8vIGV2ZW4gdGhvdWdoIGl0IG1pZ2h0IGNhdXNlIHVuZXhwZWN0ZWQgYmVoYXZpb3JzLlxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbXG4gICAgICBiLFxuICAgICAgclxuICAgIF1cbiAgKSwgRGUgPSB1dChcbiAgICAvLyBVc2UgY2FsbGJhY2sgdG8gbWFrZSBzdXJlIGBrZXlSZWYuY3VycmVudGAgcmV0dXJucyBsYXRlc3QgcmVzdWx0IGV2ZXJ5IHRpbWVcbiAgICAoLi4uX2UpID0+IHVtKHIsIE0uY3VycmVudCwgLi4uX2UpLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbXVxuICApO1xuICBpZiAoU28oKCkgPT4ge1xuICAgIEguY3VycmVudCA9IGUsIEsuY3VycmVudCA9IHQsICRlKEwpIHx8IChQLmN1cnJlbnQgPSBMKTtcbiAgfSksIFNvKCgpID0+IHtcbiAgICBpZiAoIWIpIHJldHVybjtcbiAgICBjb25zdCBfZSA9IFRlLmJpbmQocXQsIEdsKTtcbiAgICBsZXQgeGUgPSAwO1xuICAgIGooKS5yZXZhbGlkYXRlT25Gb2N1cyAmJiAoeGUgPSBEYXRlLm5vdygpICsgaigpLmZvY3VzVGhyb3R0bGVJbnRlcnZhbCk7XG4gICAgY29uc3QgeWUgPSBYSShiLCBmLCAoYmUsIEZlID0ge30pID0+IHtcbiAgICAgIGlmIChiZSA9PSBvbSkge1xuICAgICAgICBjb25zdCBYZSA9IERhdGUubm93KCk7XG4gICAgICAgIGooKS5yZXZhbGlkYXRlT25Gb2N1cyAmJiBYZSA+IHhlICYmIEMoKSAmJiAoeGUgPSBYZSArIGooKS5mb2N1c1Rocm90dGxlSW50ZXJ2YWwsIF9lKCkpO1xuICAgICAgfSBlbHNlIGlmIChiZSA9PSBhbSlcbiAgICAgICAgaigpLnJldmFsaWRhdGVPblJlY29ubmVjdCAmJiBDKCkgJiYgX2UoKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBpZiAoYmUgPT0gbG0pXG4gICAgICAgICAgcmV0dXJuIFRlKCk7XG4gICAgICAgIGlmIChiZSA9PSBUZilcbiAgICAgICAgICByZXR1cm4gVGUoRmUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBGLmN1cnJlbnQgPSAhMSwgTS5jdXJyZW50ID0gYiwgQS5jdXJyZW50ID0gITAsICQoe1xuICAgICAgX2s6IFJcbiAgICB9KSwgWSAmJiAoeVtiXSB8fCAoJGUobSkgfHwgVGkgPyBfZSgpIDogTUkoX2UpKSksICgpID0+IHtcbiAgICAgIEYuY3VycmVudCA9ICEwLCB5ZSgpO1xuICAgIH07XG4gIH0sIFtcbiAgICBiXG4gIF0pLCBTbygoKSA9PiB7XG4gICAgbGV0IF9lO1xuICAgIGZ1bmN0aW9uIHhlKCkge1xuICAgICAgY29uc3QgeWUgPSBNcihjKSA/IGMoaygpLmRhdGEpIDogYztcbiAgICAgIHllICYmIF9lICE9PSAtMSAmJiAoX2UgPSBzZXRUaW1lb3V0KEJlLCB5ZSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBCZSgpIHtcbiAgICAgICFrKCkuZXJyb3IgJiYgKHUgfHwgaigpLmlzVmlzaWJsZSgpKSAmJiAoZCB8fCBqKCkuaXNPbmxpbmUoKSkgPyBUZShHbCkudGhlbih4ZSkgOiB4ZSgpO1xuICAgIH1cbiAgICByZXR1cm4geGUoKSwgKCkgPT4ge1xuICAgICAgX2UgJiYgKGNsZWFyVGltZW91dChfZSksIF9lID0gLTEpO1xuICAgIH07XG4gIH0sIFtcbiAgICBjLFxuICAgIHUsXG4gICAgZCxcbiAgICBiXG4gIF0pLCB4bShOKSwgaSkge1xuICAgIGNvbnN0IF9lID0gYiAmJiAkZShtKTtcbiAgICBpZiAoIUFmICYmIFRpICYmIF9lKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFsbGJhY2sgZGF0YSBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIFN1c3BlbnNlIGluIFNTUi5cIik7XG4gICAgX2UgJiYgKEguY3VycmVudCA9IGUsIEsuY3VycmVudCA9IHQsIEYuY3VycmVudCA9ICExKTtcbiAgICBjb25zdCB4ZSA9IEVbYl0sIEJlID0gISRlKHhlKSAmJiBfZSA/IERlKHhlKSA6IFJmO1xuICAgIGlmICgkbChCZSksICEkZSh2KSAmJiBfZSlcbiAgICAgIHRocm93IHY7XG4gICAgY29uc3QgeWUgPSBfZSA/IFRlKEdsKSA6IFJmO1xuICAgICEkZShOKSAmJiBfZSAmJiAoeWUuc3RhdHVzID0gXCJmdWxmaWxsZWRcIiwgeWUudmFsdWUgPSAhMCksICRsKHllKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG11dGF0ZTogRGUsXG4gICAgZ2V0IGRhdGEoKSB7XG4gICAgICByZXR1cm4gZy5kYXRhID0gITAsIE47XG4gICAgfSxcbiAgICBnZXQgZXJyb3IoKSB7XG4gICAgICByZXR1cm4gZy5lcnJvciA9ICEwLCB2O1xuICAgIH0sXG4gICAgZ2V0IGlzVmFsaWRhdGluZygpIHtcbiAgICAgIHJldHVybiBnLmlzVmFsaWRhdGluZyA9ICEwLCBpZTtcbiAgICB9LFxuICAgIGdldCBpc0xvYWRpbmcoKSB7XG4gICAgICByZXR1cm4gZy5pc0xvYWRpbmcgPSAhMCwgbGU7XG4gICAgfVxuICB9O1xufSwgZV8gPSBaSShRSSksIHRfID0gKCkgPT4ge1xufSwgcl8gPSAoXG4gIC8qI19fTk9JTkxJTkVfXyovXG4gIHRfKClcbiksIE9jID0gT2JqZWN0LCBMZiA9IChzKSA9PiBzID09PSByXywgc18gPSAocykgPT4gdHlwZW9mIHMgPT0gXCJmdW5jdGlvblwiLCBsbyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpLCBuXyA9IChzKSA9PiBPYy5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChzKSwgVmwgPSAocywgZSkgPT4gcyA9PT0gYFtvYmplY3QgJHtlfV1gO1xubGV0IGlfID0gMDtcbmNvbnN0IEJjID0gKHMpID0+IHtcbiAgY29uc3QgZSA9IHR5cGVvZiBzLCB0ID0gbl8ocyksIHIgPSBWbCh0LCBcIkRhdGVcIiksIG4gPSBWbCh0LCBcIlJlZ0V4cFwiKSwgaSA9IFZsKHQsIFwiT2JqZWN0XCIpO1xuICBsZXQgbywgYTtcbiAgaWYgKE9jKHMpID09PSBzICYmICFyICYmICFuKSB7XG4gICAgaWYgKG8gPSBsby5nZXQocyksIG8pIHJldHVybiBvO1xuICAgIGlmIChvID0gKytpXyArIFwiflwiLCBsby5zZXQocywgbyksIEFycmF5LmlzQXJyYXkocykpIHtcbiAgICAgIGZvciAobyA9IFwiQFwiLCBhID0gMDsgYSA8IHMubGVuZ3RoOyBhKyspXG4gICAgICAgIG8gKz0gQmMoc1thXSkgKyBcIixcIjtcbiAgICAgIGxvLnNldChzLCBvKTtcbiAgICB9XG4gICAgaWYgKGkpIHtcbiAgICAgIG8gPSBcIiNcIjtcbiAgICAgIGNvbnN0IGwgPSBPYy5rZXlzKHMpLnNvcnQoKTtcbiAgICAgIGZvciAoOyAhTGYoYSA9IGwucG9wKCkpOyApXG4gICAgICAgIExmKHNbYV0pIHx8IChvICs9IGEgKyBcIjpcIiArIEJjKHNbYV0pICsgXCIsXCIpO1xuICAgICAgbG8uc2V0KHMsIG8pO1xuICAgIH1cbiAgfSBlbHNlXG4gICAgbyA9IHIgPyBzLnRvSlNPTigpIDogZSA9PSBcInN5bWJvbFwiID8gcy50b1N0cmluZygpIDogZSA9PSBcInN0cmluZ1wiID8gSlNPTi5zdHJpbmdpZnkocykgOiBcIlwiICsgcztcbiAgcmV0dXJuIG87XG59LCBvXyA9IChzKSA9PiB7XG4gIGlmIChzXyhzKSlcbiAgICB0cnkge1xuICAgICAgcyA9IHMoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHMgPSBcIlwiO1xuICAgIH1cbiAgY29uc3QgZSA9IHM7XG4gIHJldHVybiBzID0gdHlwZW9mIHMgPT0gXCJzdHJpbmdcIiA/IHMgOiAoQXJyYXkuaXNBcnJheShzKSA/IHMubGVuZ3RoIDogcykgPyBCYyhzKSA6IFwiXCIsIFtcbiAgICBzLFxuICAgIGVcbiAgXTtcbn0sIGFfID0gKHMpID0+IG9fKHMgPyBzKDAsIG51bGwpIDogbnVsbClbMF0sIGpsID0gUHJvbWlzZS5yZXNvbHZlKCksIGxfID0gKHMpID0+IChlLCB0LCByKSA9PiB7XG4gIGNvbnN0IG4gPSBidCghMSksIHsgY2FjaGU6IGksIGluaXRpYWxTaXplOiBvID0gMSwgcmV2YWxpZGF0ZUFsbDogYSA9ICExLCBwZXJzaXN0U2l6ZTogbCA9ICExLCByZXZhbGlkYXRlRmlyc3RQYWdlOiBjID0gITAsIHJldmFsaWRhdGVPbk1vdW50OiB1ID0gITEsIHBhcmFsbGVsOiBkID0gITEgfSA9IHIsIFssICwgLCBoXSA9IHFyLmdldChOdSk7XG4gIGxldCBmO1xuICB0cnkge1xuICAgIGYgPSBhXyhlKSwgZiAmJiAoZiA9IGRtICsgZik7XG4gIH0gY2F0Y2gge1xuICB9XG4gIGNvbnN0IFtwLCB5LCBFXSA9IF9zKGksIGYpLCBiID0gdXQoKCkgPT4gJGUocCgpLl9sKSA/IG8gOiBwKCkuX2wsIFtcbiAgICBpLFxuICAgIGYsXG4gICAgb1xuICBdKTtcbiAgaW0udXNlU3luY0V4dGVybmFsU3RvcmUodXQoXG4gICAgKGopID0+IGYgPyBFKGYsICgpID0+IHtcbiAgICAgIGooKTtcbiAgICB9KSA6ICgpID0+IHtcbiAgICB9LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbXG4gICAgICBpLFxuICAgICAgZlxuICAgIF1cbiAgKSwgYiwgYik7XG4gIGNvbnN0IFIgPSB1dCgoKSA9PiB7XG4gICAgY29uc3QgaiA9IHAoKS5fbDtcbiAgICByZXR1cm4gJGUoaikgPyBvIDogajtcbiAgfSwgW1xuICAgIGYsXG4gICAgb1xuICBdKSwgQSA9IGJ0KFIoKSk7XG4gIFNvKCgpID0+IHtcbiAgICBpZiAoIW4uY3VycmVudCkge1xuICAgICAgbi5jdXJyZW50ID0gITA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGYgJiYgeSh7XG4gICAgICBfbDogbCA/IEEuY3VycmVudCA6IFIoKVxuICAgIH0pO1xuICB9LCBbXG4gICAgZixcbiAgICBpXG4gIF0pO1xuICBjb25zdCBGID0gdSAmJiAhbi5jdXJyZW50LCBNID0gcyhmLCBhc3luYyAoaikgPT4ge1xuICAgIGNvbnN0IEMgPSBwKCkuX2ksIGsgPSBwKCkuX3I7XG4gICAgeSh7XG4gICAgICBfcjogcXRcbiAgICB9KTtcbiAgICBjb25zdCAkID0gW10sIFcgPSBSKCksIFtfXSA9IF9zKGksIGopLCBnID0gXygpLmRhdGEsIHggPSBbXTtcbiAgICBsZXQgdyA9IG51bGw7XG4gICAgZm9yIChsZXQgRCA9IDA7IEQgPCBXOyArK0QpIHtcbiAgICAgIGNvbnN0IFtPLCBVXSA9IHdpKGUoRCwgZCA/IG51bGwgOiB3KSk7XG4gICAgICBpZiAoIU8pXG4gICAgICAgIGJyZWFrO1xuICAgICAgY29uc3QgW1YsIExdID0gX3MoaSwgTyk7XG4gICAgICBsZXQgbSA9IFYoKS5kYXRhO1xuICAgICAgY29uc3QgdiA9IGEgfHwgQyB8fCAkZShtKSB8fCBjICYmICFEICYmICEkZShnKSB8fCBGIHx8IGcgJiYgISRlKGdbRF0pICYmICFyLmNvbXBhcmUoZ1tEXSwgbSk7XG4gICAgICBpZiAodCAmJiAodHlwZW9mIGsgPT0gXCJmdW5jdGlvblwiID8gayhtLCBVKSA6IHYpKSB7XG4gICAgICAgIGNvbnN0IFAgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCEoTyBpbiBoKSlcbiAgICAgICAgICAgIG0gPSBhd2FpdCB0KFUpO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgWSA9IGhbT107XG4gICAgICAgICAgICBkZWxldGUgaFtPXSwgbSA9IGF3YWl0IFk7XG4gICAgICAgICAgfVxuICAgICAgICAgIEwoe1xuICAgICAgICAgICAgZGF0YTogbSxcbiAgICAgICAgICAgIF9rOiBVXG4gICAgICAgICAgfSksICRbRF0gPSBtO1xuICAgICAgICB9O1xuICAgICAgICBkID8geC5wdXNoKFApIDogYXdhaXQgUCgpO1xuICAgICAgfSBlbHNlXG4gICAgICAgICRbRF0gPSBtO1xuICAgICAgZCB8fCAodyA9IG0pO1xuICAgIH1cbiAgICByZXR1cm4gZCAmJiBhd2FpdCBQcm9taXNlLmFsbCh4Lm1hcCgoRCkgPT4gRCgpKSksIHkoe1xuICAgICAgX2k6IHF0XG4gICAgfSksICQ7XG4gIH0sIHIpLCBIID0gdXQoXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGZ1bmMtbmFtZXNcbiAgICBmdW5jdGlvbihqLCBDKSB7XG4gICAgICBjb25zdCBrID0gdHlwZW9mIEMgPT0gXCJib29sZWFuXCIgPyB7XG4gICAgICAgIHJldmFsaWRhdGU6IENcbiAgICAgIH0gOiBDIHx8IHt9LCAkID0gay5yZXZhbGlkYXRlICE9PSAhMTtcbiAgICAgIHJldHVybiBmID8gKCQgJiYgKCRlKGopID8geSh7XG4gICAgICAgIF9pOiAhMCxcbiAgICAgICAgX3I6IGsucmV2YWxpZGF0ZVxuICAgICAgfSkgOiB5KHtcbiAgICAgICAgX2k6ICExLFxuICAgICAgICBfcjogay5yZXZhbGlkYXRlXG4gICAgICB9KSksIGFyZ3VtZW50cy5sZW5ndGggPyBNLm11dGF0ZShqLCB7XG4gICAgICAgIC4uLmssXG4gICAgICAgIHJldmFsaWRhdGU6ICRcbiAgICAgIH0pIDogTS5tdXRhdGUoKSkgOiBqbDtcbiAgICB9LFxuICAgIC8vIHN3ci5tdXRhdGUgaXMgYWx3YXlzIHRoZSBzYW1lIHJlZmVyZW5jZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgICBbXG4gICAgICBmLFxuICAgICAgaVxuICAgIF1cbiAgKSwgSyA9IHV0KFxuICAgIChqKSA9PiB7XG4gICAgICBpZiAoIWYpIHJldHVybiBqbDtcbiAgICAgIGNvbnN0IFssIENdID0gX3MoaSwgZik7XG4gICAgICBsZXQgaztcbiAgICAgIGlmIChNcihqKSA/IGsgPSBqKFIoKSkgOiB0eXBlb2YgaiA9PSBcIm51bWJlclwiICYmIChrID0gaiksIHR5cGVvZiBrICE9IFwibnVtYmVyXCIpIHJldHVybiBqbDtcbiAgICAgIEMoe1xuICAgICAgICBfbDoga1xuICAgICAgfSksIEEuY3VycmVudCA9IGs7XG4gICAgICBjb25zdCAkID0gW10sIFtXXSA9IF9zKGksIGYpO1xuICAgICAgbGV0IF8gPSBudWxsO1xuICAgICAgZm9yIChsZXQgZyA9IDA7IGcgPCBrOyArK2cpIHtcbiAgICAgICAgY29uc3QgW3hdID0gd2koZShnLCBfKSksIFt3XSA9IF9zKGksIHgpLCBEID0geCA/IHcoKS5kYXRhIDogcXQ7XG4gICAgICAgIGlmICgkZShEKSlcbiAgICAgICAgICByZXR1cm4gSChXKCkuZGF0YSk7XG4gICAgICAgICQucHVzaChEKSwgXyA9IEQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gSCgkKTtcbiAgICB9LFxuICAgIC8vIGV4Y2x1ZGUgZ2V0S2V5IGZyb20gdGhlIGRlcGVuZGVuY2llcywgd2hpY2ggaXNuJ3QgYWxsb3dlZCB0byBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlY3ljbGVcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgW1xuICAgICAgZixcbiAgICAgIGksXG4gICAgICBILFxuICAgICAgUlxuICAgIF1cbiAgKTtcbiAgcmV0dXJuIHtcbiAgICBzaXplOiBSKCksXG4gICAgc2V0U2l6ZTogSyxcbiAgICBtdXRhdGU6IEgsXG4gICAgZ2V0IGRhdGEoKSB7XG4gICAgICByZXR1cm4gTS5kYXRhO1xuICAgIH0sXG4gICAgZ2V0IGVycm9yKCkge1xuICAgICAgcmV0dXJuIE0uZXJyb3I7XG4gICAgfSxcbiAgICBnZXQgaXNWYWxpZGF0aW5nKCkge1xuICAgICAgcmV0dXJuIE0uaXNWYWxpZGF0aW5nO1xuICAgIH0sXG4gICAgZ2V0IGlzTG9hZGluZygpIHtcbiAgICAgIHJldHVybiBNLmlzTG9hZGluZztcbiAgICB9XG4gIH07XG59LCBjXyA9IEpJKGVfLCBsXyksIHVfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wic2Zta3FjclwiXVxufSksIGRfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiaHJsZHRpb1wiXVxufSksIGhfID0gTWYoKHtcbiAgY2FzdHM6IHMsXG4gIGN1cnNvcjogZVxufSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4KHVfLCB7XG4gIGNoaWxkcmVuOiBzLm1hcCgodCwgcikgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhzdC5GcmFnbWVudCwge1xuICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KG9hLCB7XG4gICAgICBpc0VtYmVkOiAhMSxcbiAgICAgIC4uLnRcbiAgICB9KSwgciA8IHMubGVuZ3RoIC0gMSAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goZF8sIHt9KV1cbiAgfSwgdC5oYXNoKSlcbn0pKTtcbmZ1bmN0aW9uIGZfKHMpIHtcbiAgcmV0dXJuIHMgPyBzLm1hcCgoZSkgPT4ge1xuICAgIHZhciByLCBuLCBpLCBvLCBhO1xuICAgIGNvbnN0IHQgPSBlICE9IG51bGwgJiYgZS5yZXBsaWVzICYmIHR5cGVvZiBlLnJlcGxpZXMgPT0gXCJvYmplY3RcIiA/IE51bWJlcihlLnJlcGxpZXMuY291bnQpIHx8IDAgOiBOdW1iZXIoZSA9PSBudWxsID8gdm9pZCAwIDogZS5yZXBsaWVzKSB8fCAwO1xuICAgIHJldHVybiB7XG4gICAgICB1c2VybmFtZTogKChyID0gZSA9PSBudWxsID8gdm9pZCAwIDogZS5hdXRob3IpID09IG51bGwgPyB2b2lkIDAgOiByLnVzZXJuYW1lKSA/PyBcIlwiLFxuICAgICAgZGlzcGxheU5hbWU6ICgobiA9IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUuYXV0aG9yKSA9PSBudWxsID8gdm9pZCAwIDogbi5kaXNwbGF5X25hbWUpID8/IFwiXCIsXG4gICAgICBhdmF0YXJJbWdVcmw6ICgoaSA9IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUuYXV0aG9yKSA9PSBudWxsID8gdm9pZCAwIDogaS5wZnBfdXJsKSA/PyBcIlwiLFxuICAgICAgdGV4dDogKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUudGV4dCkgPz8gXCJcIixcbiAgICAgIGhhc2g6IChlID09IG51bGwgPyB2b2lkIDAgOiBlLmhhc2gpID8/IFwiXCIsXG4gICAgICByZWFjdGlvbnM6IChlID09IG51bGwgPyB2b2lkIDAgOiBlLnJlYWN0aW9ucykgPz8gW10sXG4gICAgICByZXBsaWVzOiB0LFxuICAgICAgZW1iZWRzOiAoZSA9PSBudWxsID8gdm9pZCAwIDogZS5lbWJlZHMpID8/IFtdLFxuICAgICAgZnJhbWVzOiAoZSA9PSBudWxsID8gdm9pZCAwIDogZS5mcmFtZXMpID8/IFtdLFxuICAgICAgcmVuZGVyRW1iZWRzOiAoZSA9PSBudWxsID8gdm9pZCAwIDogZS5yZW5kZXJFbWJlZHMpID8/ICEwLFxuICAgICAgY2hhbm5lbDogKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUuY2hhbm5lbCkgPz8gXCJcIixcbiAgICAgIHZpZXdlckZpZDogMixcbiAgICAgIGhhc1Bvd2VyQmFkZ2U6ICgobyA9IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUuYXV0aG9yKSA9PSBudWxsID8gdm9pZCAwIDogby5wb3dlcl9iYWRnZSkgPz8gITEsXG4gICAgICBhcHBBdmF0YXJJbWdVcmw6ICgoYSA9IGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUuYXBwKSA9PSBudWxsID8gdm9pZCAwIDogYS5wZnBfdXJsKSA/PyBcIlwiLFxuICAgICAgaXNPd25Qcm9maWxlOiAhMSxcbiAgICAgIGFsbG93UmVhY3Rpb25zOiAhMCxcbiAgICAgIHJlbmRlckZyYW1lczogITEsXG4gICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wID8/IFwiXCJcbiAgICB9O1xuICB9KSA6IFtdO1xufVxuY29uc3QgZ18gPSAocykgPT4gYW4ocykudGhlbihhc3luYyAoZSkgPT4gYXdhaXQgZS5qc29uKCkpLCBwXyA9IChzLCBlLCB0LCByLCBuKSA9PiB7XG4gIGlmIChlICYmICghZS5jYXN0cyB8fCAhZS5jYXN0cy5sZW5ndGgpKSByZXR1cm4gbnVsbDtcbiAgbGV0IGkgPSBgJHtvbn0vdjIvZmFyY2FzdGVyL2ZlZWQke3QgPyBcIlwiIDogXCI/XCJ9YDtcbiAgY29uc3QgbyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgdCAmJiAoaSArPSBgJHt0fT9gKSwgbiAmJiAoaSArPSBgY2xpZW50X2lkPSR7bn1gKSwgZSAmJiAoaSArPSBgJmN1cnNvcj0ke2UubmV4dC5jdXJzb3J9YCk7XG4gIGNvbnN0IGEgPSAobCwgYykgPT4ge1xuICAgIGMgIT0gbnVsbCAmJiAhaS5pbmNsdWRlcyhgJHtsfT1gKSAmJiBvLmFwcGVuZChsLCBTdHJpbmcoYykpO1xuICB9O1xuICBpZiAocikge1xuICAgIE9iamVjdC5lbnRyaWVzKHIpLmZvckVhY2goKFtjLCB1XSkgPT4ge1xuICAgICAgY29uc3QgZCA9IGMucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMV8kMlwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgYShkLCB1KTtcbiAgICB9KTtcbiAgICBjb25zdCBsID0gby50b1N0cmluZygpO1xuICAgIGwgJiYgKGkgKz0gaS5pbmNsdWRlcyhcIj9cIikgPyBgJiR7bH1gIDogYD8ke2x9YCk7XG4gIH1cbiAgaWYgKE9iamVjdC5rZXlzKHIpLmxlbmd0aCA+IDEpXG4gICAgcmV0dXJuIGk7XG59LCB5UiA9ICh7XG4gIHBhdGg6IHMsXG4gIC4uLmVcbn0pID0+IHtcbiAgdmFyIGY7XG4gIGNvbnN0IHtcbiAgICBjbGllbnRfaWQ6IHRcbiAgfSA9IHRzKCksIHIgPSBidChudWxsKSwgW24sIGldID0gcWUoITEpLCBvID0gYnQobnVsbCksIHtcbiAgICBkYXRhOiBhLFxuICAgIGVycm9yOiBsLFxuICAgIHNpemU6IGMsXG4gICAgc2V0U2l6ZTogdSxcbiAgICBpc1ZhbGlkYXRpbmc6IGRcbiAgfSA9IGNfKChwLCB5KSA9PiBwXyhwLCB5LCBzLCBlLCB0KSwgZ18pLCBoID0gWnIoKCkgPT4ge1xuICAgIGlmICghYSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHAgPSBhLmZsYXRNYXAoKEUpID0+IChFID09IG51bGwgPyB2b2lkIDAgOiBFLmNhc3RzKSA/PyBbXSksIHkgPSBBcnJheS5mcm9tKG5ldyBTZXQocC5tYXAoKEUpID0+IEUuaGFzaCkpKS5tYXAoKEUpID0+IHAuZmluZCgoYikgPT4gYi5oYXNoID09PSBFKSk7XG4gICAgcmV0dXJuIGZfKHkpO1xuICB9LCBbYV0pO1xuICByZXR1cm4gZnQoKCkgPT4gKG8uY3VycmVudCAmJiBvLmN1cnJlbnQuZGlzY29ubmVjdCgpLCBvLmN1cnJlbnQgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoKHApID0+IHtcbiAgICB2YXIgRSwgYjtcbiAgICBjb25zdCBbeV0gPSBwO1xuICAgIHkuaXNJbnRlcnNlY3RpbmcgJiYgIW4gJiYgIWQgJiYgYSAmJiAoKGIgPSAoRSA9IGFbYS5sZW5ndGggLSAxXSkgPT0gbnVsbCA/IHZvaWQgMCA6IEUubmV4dCkgIT0gbnVsbCAmJiBiLmN1cnNvcikgJiYgKGkoITApLCB1KGMgKyAxKS50aGVuKCgpID0+IGkoITEpKSk7XG4gIH0sIHtcbiAgICByb290TWFyZ2luOiBcIjEwMHB4XCJcbiAgfSksIHIuY3VycmVudCAmJiBvLmN1cnJlbnQub2JzZXJ2ZShyLmN1cnJlbnQpLCAoKSA9PiB7XG4gICAgby5jdXJyZW50ICYmIG8uY3VycmVudC5kaXNjb25uZWN0KCk7XG4gIH0pLCBbci5jdXJyZW50LCBuLCBkLCBhLCBjXSksIGwgPyAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJkaXZcIiwge1xuICAgIGNoaWxkcmVuOiBcIkVycm9yIGZldGNoaW5nIGZlZWQgZGF0YVwiXG4gIH0pIDogLyogQF9fUFVSRV9fICovIHEuanN4cyhcImRpdlwiLCB7XG4gICAgY2hpbGRyZW46IFtoLmxlbmd0aCAhPT0gMCA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChoXywge1xuICAgICAgY2FzdHM6IGgsXG4gICAgICBjdXJzb3I6IFwiXCJcbiAgICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImRpdlwiLCB7XG4gICAgICBjaGlsZHJlbjogKGYgPSBhID09IG51bGwgPyB2b2lkIDAgOiBhWzBdKSA9PSBudWxsID8gdm9pZCAwIDogZi5tZXNzYWdlXG4gICAgfSksIGQgJiYgLyogQF9fUFVSRV9fICovIHEuanN4cyhcImRpdlwiLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6IFwiY2VudGVyXCIsXG4gICAgICAgIHBhZGRpbmc6IFwiMTBweFwiXG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3hzKFwic3BhblwiLCB7XG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgYW5pbWF0aW9uOiBcImJsaW5rIDEuNXMgaW5maW5pdGVcIlxuICAgICAgICB9LFxuICAgICAgICBjaGlsZHJlbjogW1wiTG9hZGluZ1wiLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzcGFuXCIsIHtcbiAgICAgICAgICBjbGFzc05hbWU6IFwiZG90c1wiLFxuICAgICAgICAgIGNoaWxkcmVuOiBcIi4uLlwiXG4gICAgICAgIH0pXVxuICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInN0eWxlXCIsIHtcbiAgICAgICAgY2hpbGRyZW46IGBcbiAgICAgICAgICAgICAgICAgICAgICAgIEBrZXlmcmFtZXMgYmxpbmsge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAlIHsgb3BhY2l0eTogMTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwJSB7IG9wYWNpdHk6IDA7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAlIHsgb3BhY2l0eTogMTsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBgXG4gICAgICB9KV1cbiAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICAgIHJlZjogclxuICAgIH0pXVxuICB9KTtcbn0sIG1fID0gLyogQF9fUFVSRV9fICovIGRlKFwiYnV0dG9uXCIpKHtcbiAgY2xhc3NlczogW1wiYjFicXVnOHJcIl1cbn0pLCB5XyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImJ1dHRvblwiKSh7XG4gIGNsYXNzZXM6IFtcImIxbXJhNDV3XCJdXG59KSwgQ2YgPSBcImh0dHBzOi8vZmFyY2FzdGVyLnh5elwiLCBnbSA9IC8oXnxcXHMpXFwvXFx3Ky9nLCBwbSA9IC9AXFx3Ky9nLCBtbSA9IC8oKGh0dHBzPzpcXC9cXC8pPyhbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsfSkoXFwvW15cXHNdKik/KS9nLCBrZiA9IG5ldyBSZWdFeHAoYCgke2dtLnNvdXJjZX0pfCgke3BtLnNvdXJjZX0pfCgke21tLnNvdXJjZX0pYCwgXCJnXCIpLCB2XyA9IChzKSA9PiBnbS50ZXN0KHMpID8gYCR7Q2Z9L34vY2hhbm5lbCR7cy50cmltKCl9YCA6IHBtLnRlc3QocykgPyBgJHtDZn0vJHtzLnN1YnN0cmluZygxKX1gIDogbW0udGVzdChzKSA/IHMuc3RhcnRzV2l0aChcImh0dHBcIikgPyBzIDogYGh0dHA6Ly8ke3N9YCA6IFwiXCIsIEVfID0gLyogQF9fUFVSRV9fICovIGRlKFwiYVwiKSh7XG4gIGNsYXNzZXM6IFtcInNieTl3YTJcIl1cbn0pLCB4XyA9IChzKSA9PiB7XG4gIGlmICghcykgcmV0dXJuIFtdO1xuICBjb25zdCBlID0gW107XG4gIGxldCB0ID0gMCwgcjtcbiAgZm9yICg7IChyID0ga2YuZXhlYyhzKSkgIT09IG51bGw7ICkge1xuICAgIGNvbnN0IG4gPSByLmluZGV4O1xuICAgIHQgPCBuICYmIGUucHVzaChzLnNsaWNlKHQsIG4pKTtcbiAgICBjb25zdCBpID0gdl8oclswXSksIG8gPSByWzBdLnRyaW0oKS5zdGFydHNXaXRoKFwiL1wiKTtcbiAgICBlLnB1c2goLyogQF9fUFVSRV9fICovIHEuanN4KFwic3BhblwiLCB7XG4gICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KEVfLCB7XG4gICAgICAgIGhyZWY6IGksXG4gICAgICAgIHRhcmdldDogXCJfYmxhbmtcIixcbiAgICAgICAgc3R5bGU6IG8gPyB7XG4gICAgICAgICAgbWFyZ2luTGVmdDogMy41XG4gICAgICAgIH0gOiB7fSxcbiAgICAgICAgY2hpbGRyZW46IHJbMF1cbiAgICAgIH0sIG4pXG4gICAgfSkpLCB0ID0ga2YubGFzdEluZGV4O1xuICB9XG4gIHJldHVybiB0IDwgcy5sZW5ndGggJiYgZS5wdXNoKHMuc2xpY2UodCkpLCBlO1xufSwgU18gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJzZGFobTU4XCJdXG59KSwgYl8gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJtemlxeXhwXCJdXG59KSwgVF8gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJ1ejd0cG1mXCJdXG59KSwgd18gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJkMXJ4bHdhY1wiXVxufSksIEFfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1widWdjNnlxcFwiXVxufSksIERmID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wicG9yamY5YVwiXVxufSksIElfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1widHR0N3g5eFwiXVxufSksIFBmID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiYjF3YmU5bzZcIl1cbn0pLCBfXyA9IE1mKCh7XG4gIGZpZDogcyxcbiAgdXNlcm5hbWU6IGUsXG4gIGRpc3BsYXlOYW1lOiB0LFxuICBhdmF0YXJJbWdVcmw6IHIsXG4gIGJpbzogbixcbiAgZm9sbG93ZXJzOiBpLFxuICBmb2xsb3dpbmc6IG8sXG4gIGhhc1Bvd2VyQmFkZ2U6IGEsXG4gIGlzRm9sbG93aW5nOiBsLFxuICBpc093blByb2ZpbGU6IGMsXG4gIG9uQ2FzdDogdSxcbiAgY29udGFpbmVyU3R5bGVzOiBkXG59KSA9PiB7XG4gIGNvbnN0IGggPSB4XyhuKSwgZiA9IFpyKCgpID0+IHBmKG8pLCBbb10pLCBwID0gWnIoKCkgPT4gcGYoaSksIFtpXSksIHkgPSAoKSA9PiB7XG4gICAgd2luZG93Lm9wZW4oXCJodHRwczovL2ZhcmNhc3Rlci54eXovfi9zZXR0aW5nc1wiLCBcIl9ibGFua1wiKTtcbiAgfSwgRSA9IHtcbiAgICBjb2xvcjogZCA9PSBudWxsID8gdm9pZCAwIDogZC5jb2xvclxuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4cyhTXywge1xuICAgIHN0eWxlOiBkLFxuICAgIGNoaWxkcmVuOiBbYyAmJiB1ICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoUHIsIHtcbiAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsXG4gICAgICBzcGFjaW5nQm90dG9tOiBcIjIwcHhcIixcbiAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyhBXywge1xuICAgICAgICBjaGlsZHJlbjogW1wiQFwiLCBlXVxuICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChtXywge1xuICAgICAgICBvbkNsaWNrOiB1LFxuICAgICAgICBjaGlsZHJlbjogXCJDYXN0XCJcbiAgICAgIH0pXVxuICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goUHIsIHtcbiAgICAgIGNoaWxkcmVuOiAvKiBAX19QVVJFX18gKi8gcS5qc3hzKGJfLCB7XG4gICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyhQciwge1xuICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgZmxleEdyb3c6IDEsXG4gICAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICAgIGdhcDogXCIxMHB4XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KElyLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFlvLCB7XG4gICAgICAgICAgICAgIHdpZHRoOiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgaGVpZ2h0OiBcIjIwcHhcIixcbiAgICAgICAgICAgICAgc3JjOiByID8/IGJpLFxuICAgICAgICAgICAgICBsb2FkaW5nOiBcImxhenlcIixcbiAgICAgICAgICAgICAgYWx0OiBgJHt0ID8/IFwiU2tlbGV0b25cIn0gQXZhdGFyYFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFByLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KHdfLCB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuOiB0IHx8IGAhJHtzfWBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoUHIsIHtcbiAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCIsXG4gICAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoVF8sIHtcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFtcIkBcIiwgZV1cbiAgICAgICAgICAgIH0pLCBsICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChJXywge1xuICAgICAgICAgICAgICBjaGlsZHJlbjogXCJGb2xsb3dzIHlvdVwiXG4gICAgICAgICAgICB9KV1cbiAgICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFByLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogYyAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goeV8sIHtcbiAgICAgICAgICAgICAgb25DbGljazogeSxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IFwiRWRpdCBQcm9maWxlXCJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSldXG4gICAgICAgIH0pLCAoaCA9PSBudWxsID8gdm9pZCAwIDogaC5sZW5ndGgpICE9PSAwID8gLyogQF9fUFVSRV9fICovIHEuanN4KFBmLCB7XG4gICAgICAgICAgY2hpbGRyZW46IGhcbiAgICAgICAgfSkgOiAvKiBAX19QVVJFX18gKi8gcS5qc3goUGYsIHtcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgcGFkZGluZzogXCIyNnB4IDBweFwiXG4gICAgICAgICAgfVxuICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4cyhQciwge1xuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogXCJzcGFjZS1iZXR3ZWVuXCIsXG4gICAgICAgICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgICAgICAgIGFsaWduSXRlbXM6IFwiY2VudGVyXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyhEZiwge1xuICAgICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdHJvbmdcIiwge1xuICAgICAgICAgICAgICBzdHlsZTogRSxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IGZcbiAgICAgICAgICAgIH0pLCBcIiBcIiwgXCJGb2xsb3dpbmdcIl1cbiAgICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4cyhEZiwge1xuICAgICAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdHJvbmdcIiwge1xuICAgICAgICAgICAgICBzdHlsZTogRSxcbiAgICAgICAgICAgICAgY2hpbGRyZW46IHBcbiAgICAgICAgICAgIH0pLCBcIiBcIiwgXCJGb2xsb3dlcnNcIl1cbiAgICAgICAgICB9KSwgZSAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goSXIsIHtcbiAgICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICAgIG1hcmdpbkxlZnQ6IFwiYXV0b1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChJYywge1xuICAgICAgICAgICAgICB1cmw6IGBodHRwczovL2ZhcmNhc3Rlci54eXovJHtlfWBcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSldXG4gICAgICAgIH0pXVxuICAgICAgfSlcbiAgICB9KV1cbiAgfSk7XG59KTtcbmFzeW5jIGZ1bmN0aW9uIFJfKHtcbiAgZmlkOiBzLFxuICB2aWV3ZXJGaWQ6IGUsXG4gIGNsaWVudElkOiB0XG59KSB7XG4gIHZhciByO1xuICB0cnkge1xuICAgIGxldCBuID0gYCR7b259L3YyL2ZhcmNhc3Rlci91c2VyL2J1bGs/Y2xpZW50X2lkPSR7dH0mZmlkcz0ke3N9YDtcbiAgICBlICYmIChuICs9IGAmdmlld2VyX2ZpZD0ke2V9YCk7XG4gICAgY29uc3QgbyA9IGF3YWl0IChhd2FpdCBhbihuKSkuanNvbigpO1xuICAgIHJldHVybiAoKHIgPSBvID09IG51bGwgPyB2b2lkIDAgOiBvLnVzZXJzKSA9PSBudWxsID8gdm9pZCAwIDogclswXSkgPz8gbnVsbDtcbiAgfSBjYXRjaCAobikge1xuICAgIHJldHVybiBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgdXNlciBieSBmaWRcIiwgbiksIG51bGw7XG4gIH1cbn1cbmNvbnN0IHZSID0gKHtcbiAgZmlkOiBzLFxuICB2aWV3ZXJGaWQ6IGUsXG4gIGNvbnRhaW5lclN0eWxlczogdFxufSkgPT4ge1xuICB2YXIgaDtcbiAgY29uc3Qge1xuICAgIGNsaWVudF9pZDogclxuICB9ID0gdHMoKSwgW24sIGldID0gcWUobnVsbCksIFtvLCBhXSA9IHFlKCEwKSwgW2wsIGNdID0gcWUobnVsbCksIHUgPSAobiA9PSBudWxsID8gdm9pZCAwIDogbi5maWQpID09PSBlO1xuICBmdCgoKSA9PiB7XG4gICAgcyAmJiAoYSghMCksIGMobnVsbCksIFJfKHtcbiAgICAgIGZpZDogcyxcbiAgICAgIHZpZXdlckZpZDogZSxcbiAgICAgIGNsaWVudElkOiByXG4gICAgfSkudGhlbigoZikgPT4ge1xuICAgICAgaShmKTtcbiAgICB9KS5jYXRjaCgoZikgPT4ge1xuICAgICAgYyhmKTtcbiAgICB9KS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGEoITEpO1xuICAgIH0pKTtcbiAgfSwgW3MsIGVdKTtcbiAgY29uc3QgZCA9IHV0KCgpID0+IHtcbiAgfSwgW10pO1xuICByZXR1cm4gbyA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImRpdlwiLCB7XG4gICAgc3R5bGU6IHtcbiAgICAgIHBhZGRpbmc6IFwiMjBweFwiXG4gICAgfSxcbiAgICBjaGlsZHJlbjogXCJMb2FkaW5nLi4uXCJcbiAgfSkgOiAhbiB8fCBsID8gLyogQF9fUFVSRV9fICovIHEuanN4KFwiZGl2XCIsIHtcbiAgICBjaGlsZHJlbjogXCJFcnJvciBmZXRjaGluZyB1c2VyIGRhdGFcIlxuICB9KSA6IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChfXywge1xuICAgIGZpZDogcyxcbiAgICB1c2VybmFtZTogbi51c2VybmFtZSxcbiAgICBkaXNwbGF5TmFtZTogbi5kaXNwbGF5X25hbWUsXG4gICAgYXZhdGFySW1nVXJsOiBuLnBmcF91cmwsXG4gICAgYmlvOiBuLnByb2ZpbGUuYmlvLnRleHQsXG4gICAgZm9sbG93ZXJzOiBuLmZvbGxvd2VyX2NvdW50LFxuICAgIGZvbGxvd2luZzogbi5mb2xsb3dpbmdfY291bnQsXG4gICAgaGFzUG93ZXJCYWRnZTogbi5wb3dlcl9iYWRnZSxcbiAgICBpc093blByb2ZpbGU6IHUsXG4gICAgaXNGb2xsb3dpbmc6IChoID0gbi52aWV3ZXJfY29udGV4dCkgPT0gbnVsbCA/IHZvaWQgMCA6IGguZm9sbG93ZWRfYnksXG4gICAgb25DYXN0OiBkLFxuICAgIGNvbnRhaW5lclN0eWxlczogdFxuICB9KTtcbn0sIExfID0gLyogQF9fUFVSRV9fICovIGRlKFwidWxcIikoe1xuICBjbGFzc2VzOiBbXCJkMTJyeDRvbVwiXVxufSksIENfID0gLyogQF9fUFVSRV9fICovIGRlKFwibGlcIikoe1xuICBjbGFzc2VzOiBbXCJscnBtNmxwXCJdXG59KSwga18gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJpbWdcIikoe1xuICBjbGFzc2VzOiBbXCJhMWU5aGczYlwiXVxufSksIERfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1widTFhcWF5MWlcIl1cbn0pLCBQXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImQxbTBuanFcIl1cbn0pLCBNXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInUxbHZsYnVvXCJdXG59KSwgT18gPSAoe1xuICB1c2VyczogcyxcbiAgb25TZWxlY3Q6IGUsXG4gIGN1c3RvbVN0eWxlczogdCA9IHt9XG59KSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3goTF8sIHtcbiAgc3R5bGU6IHtcbiAgICAuLi50ID09IG51bGwgPyB2b2lkIDAgOiB0LmRyb3Bkb3duXG4gIH0sXG4gIGNoaWxkcmVuOiBzLm1hcCgocikgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhDXywge1xuICAgIHN0eWxlOiB7XG4gICAgICAuLi50ID09IG51bGwgPyB2b2lkIDAgOiB0Lmxpc3RJdGVtXG4gICAgfSxcbiAgICBvbkNsaWNrOiAoKSA9PiBlKHIpLFxuICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4KGtfLCB7XG4gICAgICBzdHlsZToge1xuICAgICAgICAuLi50ID09IG51bGwgPyB2b2lkIDAgOiB0LmF2YXRhclxuICAgICAgfSxcbiAgICAgIHNyYzogci5wZnBfdXJsLFxuICAgICAgYWx0OiByLnVzZXJuYW1lXG4gICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoRF8sIHtcbiAgICAgIHN0eWxlOiB7XG4gICAgICAgIC4uLnQudXNlckluZm9cbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChQXywge1xuICAgICAgICBjaGlsZHJlbjogci5kaXNwbGF5X25hbWVcbiAgICAgIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3hzKE1fLCB7XG4gICAgICAgIGNoaWxkcmVuOiBbXCJAXCIsIHIudXNlcm5hbWVdXG4gICAgICB9KV1cbiAgICB9KV1cbiAgfSwgci5maWQpKVxufSksIEJfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiYzlobTIwdFwiXVxufSksIEZfID0gLyogQF9fUFVSRV9fICovIGRlKFwiaW5wdXRcIikoe1xuICBjbGFzc2VzOiBbXCJpODBzZDhoXCJdXG59KTtcbmFzeW5jIGZ1bmN0aW9uIE5fKHtcbiAgcTogcyxcbiAgdmlld2VyRmlkOiBlLFxuICBjbGllbnRfaWQ6IHRcbn0pIHtcbiAgdmFyIHI7XG4gIHRyeSB7XG4gICAgbGV0IG4gPSBgJHtvbn0vdjIvZmFyY2FzdGVyL3VzZXIvc2VhcmNoP3E9JHtzfSZsaW1pdD01JHtlID8gYCZ2aWV3ZXJfZmlkPSR7ZX1gIDogXCJcIn0mY2xpZW50X2lkPSR7dH1gO1xuICAgIGNvbnN0IG8gPSBhd2FpdCAoYXdhaXQgYW4obikpLmpzb24oKTtcbiAgICByZXR1cm4gKChyID0gbyA9PSBudWxsID8gdm9pZCAwIDogby5yZXN1bHQpID09IG51bGwgPyB2b2lkIDAgOiByLnVzZXJzKSB8fCBbXTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cbmNvbnN0IEVSID0gKHtcbiAgdmFsdWU6IHMsXG4gIG9uQ2hhbmdlOiBlLFxuICBzdHlsZTogdCA9IHt9LFxuICBwbGFjZWhvbGRlcjogciA9IFwiRW50ZXIgdXNlcm5hbWVcIixcbiAgZGlzYWJsZWQ6IG4gPSAhMSxcbiAgdmlld2VyRmlkOiBpLFxuICBjdXN0b21TdHlsZXM6IG8gPSB7fSxcbiAgbGltaXQ6IGEgPSBudWxsXG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGllbnRfaWQ6IGxcbiAgfSA9IHRzKCksIFtjLCB1XSA9IHFlKFwiXCIpLCBbZCwgaF0gPSBxZSghMSksIFtmLCBwXSA9IHFlKFtdKSwgeSA9IGJ0KG51bGwpO1xuICBmdCgoKSA9PiB7XG4gICAgY29uc3QgTSA9IChzID09IG51bGwgPyB2b2lkIDAgOiBzLnNwbGl0KFwiLFwiKSkgfHwgW107XG4gICAgaWYgKCFNW00ubGVuZ3RoIC0gMV0pIHtcbiAgICAgIHUoXCJcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHUoTVtNLmxlbmd0aCAtIDFdLnRyaW0oKSk7XG4gIH0sIFtzXSksIGZ0KCgpID0+IHtcbiAgICBjICE9PSBcIlwiICYmICEvXlxcZCskLy50ZXN0KGMpID8gRShjKSA6IGgoITEpO1xuICB9LCBbY10pO1xuICBjb25zdCBFID0gYXN5bmMgKE0pID0+IHtcbiAgICBjb25zdCBIID0gYXdhaXQgTl8oe1xuICAgICAgcTogTSxcbiAgICAgIHZpZXdlckZpZDogaSxcbiAgICAgIGNsaWVudF9pZDogbFxuICAgIH0pO1xuICAgIEggJiYgKHAoSCksIGgoITApKTtcbiAgfSwgYiA9IChNKSA9PiB7XG4gICAgY29uc3QgSCA9IE0udGFyZ2V0LnZhbHVlO1xuICAgIGUoSCk7XG4gIH0sIFIgPSAoTSkgPT4ge1xuICAgIGxldCBIID0gcy5zcGxpdChcIixcIik7XG4gICAgYSAhPT0gbnVsbCAmJiBILmxlbmd0aCA+PSBhID8gSFtILmxlbmd0aCAtIDFdID0gTS5maWQudG9TdHJpbmcoKSA6IEgucHVzaChNLmZpZC50b1N0cmluZygpKTtcbiAgICBjb25zdCBLID0gSC5qb2luKFwiLFwiKTtcbiAgICBlKEspLCB1KFwiXCIpLCBoKCExKTtcbiAgfSwgQSA9ICgpID0+IHtcbiAgICBjICYmIGlzTmFOKE51bWJlcihjKSkgJiYgaCghMCk7XG4gIH0sIEYgPSAoKSA9PiB7XG4gICAgc2V0VGltZW91dCgoKSA9PiBoKCExKSwgMjAwKTtcbiAgfTtcbiAgcmV0dXJuIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoQl8sIHtcbiAgICBzdHlsZTogdCxcbiAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChGXywge1xuICAgICAgcmVmOiB5LFxuICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICB2YWx1ZTogcyxcbiAgICAgIG9uQ2hhbmdlOiBiLFxuICAgICAgb25Gb2N1czogQSxcbiAgICAgIG9uQmx1cjogRixcbiAgICAgIHBsYWNlaG9sZGVyOiByLFxuICAgICAgZGlzYWJsZWQ6IG5cbiAgICB9KSwgZCAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goT18sIHtcbiAgICAgIHVzZXJzOiBmLFxuICAgICAgb25TZWxlY3Q6IFIsXG4gICAgICBjdXN0b21TdHlsZXM6IG9cbiAgICB9KV1cbiAgfSk7XG59LCBVXyA9ICh7XG4gIGNvbG9yOiBzID0gXCIjODU1RENEXCJcbn0pID0+IC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoXCJzdmdcIiwge1xuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB3aWR0aDogXCIyNFwiLFxuICBoZWlnaHQ6IFwiMjRcIixcbiAgdmlld0JveDogXCIwIDAgMjQgMjRcIixcbiAgZmlsbDogXCJub25lXCIsXG4gIHN0cm9rZTogcyxcbiAgXCJzdHJva2Utd2lkdGhcIjogXCIyXCIsXG4gIFwic3Ryb2tlLWxpbmVjYXBcIjogXCJyb3VuZFwiLFxuICBcInN0cm9rZS1saW5lam9pblwiOiBcInJvdW5kXCIsXG4gIGNsYXNzTmFtZTogXCJsdWNpZGUgbHVjaWRlLXNlYXJjaFwiLFxuICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChcImNpcmNsZVwiLCB7XG4gICAgY3g6IFwiMTFcIixcbiAgICBjeTogXCIxMVwiLFxuICAgIHI6IFwiOFwiXG4gIH0pLCAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJwYXRoXCIsIHtcbiAgICBkOiBcIm0yMSAyMS00LjMtNC4zXCJcbiAgfSldXG59KSwgJF8gPSAoe1xuICBjb2xvcjogcyA9IFwiIzg1NURDRFwiXG59KSA9PiAvKiBAX19QVVJFX18gKi8gcS5qc3goXCJzdmdcIiwge1xuICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICB3aWR0aDogXCIyNFwiLFxuICBoZWlnaHQ6IFwiMjRcIixcbiAgdmlld0JveDogXCIwIDAgMjQgMjRcIixcbiAgZmlsbDogXCJub25lXCIsXG4gIHN0cm9rZTogcyxcbiAgXCJzdHJva2Utd2lkdGhcIjogXCIyXCIsXG4gIFwic3Ryb2tlLWxpbmVjYXBcIjogXCJyb3VuZFwiLFxuICBcInN0cm9rZS1saW5lam9pblwiOiBcInJvdW5kXCIsXG4gIGNsYXNzTmFtZTogXCJsdWNpZGUgbHVjaWRlLWxvYWRlci1jaXJjbGVcIixcbiAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInBhdGhcIiwge1xuICAgIGQ6IFwiTTIxIDEyYTkgOSAwIDEgMS02LjIxOS04LjU2XCJcbiAgfSlcbn0pLCBHXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImlnN2tjdWNcIl1cbn0pLCBWXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImlucHV0XCIpKHtcbiAgY2xhc3NlczogW1wic2g3ejdrNlwiXVxufSksIGpfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiczE0YWkyMDNcIl1cbn0pLCBLXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImlmMThuZDZcIl1cbn0pLCBIXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInNkODMzbGJcIl1cbn0pLCBxXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInVnbzU4Nm1cIl1cbn0pLCBXXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInVrd3R5MWRcIl1cbn0pLCB6XyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInU3N29sbXlcIl1cbn0pLCBZXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcInMxeHZreHd3XCJdXG59KSwgWl8gPSAvKiBAX19QVVJFX18gKi8gZGUoXCJkaXZcIikoe1xuICBjbGFzc2VzOiBbXCJzMWY2YjFqYVwiXVxufSksIFhfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1widWRpdWZkOFwiXVxufSksIEpfID0gLyogQF9fUFVSRV9fICovIGRlKFwiZGl2XCIpKHtcbiAgY2xhc3NlczogW1wiZjFiOGEyaDBcIl1cbn0pLCBRXyA9IC8qIEBfX1BVUkVfXyAqLyBkZShcImRpdlwiKSh7XG4gIGNsYXNzZXM6IFtcImwxeXEyNmowXCJdXG59KSwgZVIgPSAvKiBAX19QVVJFX18gKi8gZGUoXCJsaVwiKSh7XG4gIGNsYXNzZXM6IFtcInMxOG1rNDdrXCJdXG59KSwgeFIgPSAoe1xuICB3aWR0aDogcyxcbiAgaGVpZ2h0OiBlLFxuICBzZWxlY3RlZFVzZXJzOiB0LFxuICBvblNlbGVjdFVzZXJzOiByLFxuICAuLi5uXG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjbGllbnRfaWQ6IGlcbiAgfSA9IHRzKCksIHtcbiAgICB1c2VyOiBvLFxuICAgIGlzQXV0aGVudGljYXRlZDogYVxuICB9ID0gRWcoKSwgW2wsIGNdID0gcWUoXCJcIiksIFt1LCBkXSA9IHFlKFtdKSwgW2gsIGZdID0gcWUoITEpLCBwID0gYnQobnVsbCk7XG4gIGZ0KCgpID0+IHtcbiAgICBmdW5jdGlvbiBNKEgpIHtcbiAgICAgIHAuY3VycmVudCAmJiAhcC5jdXJyZW50LmNvbnRhaW5zKEgudGFyZ2V0KSAmJiAoZChbXSksIGMoXCJcIikpO1xuICAgIH1cbiAgICByZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBNKSwgKCkgPT4ge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBNKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIGNvbnN0IGIgPSB1dCgoKE0sIEgpID0+IHtcbiAgICBsZXQgSztcbiAgICByZXR1cm4gKC4uLmopID0+IHtcbiAgICAgIGNsZWFyVGltZW91dChLKSwgSyA9IHNldFRpbWVvdXQoKCkgPT4gTSguLi5qKSwgSCk7XG4gICAgfTtcbiAgfSkoYXN5bmMgKE0sIEgpID0+IHtcbiAgICB2YXIgSztcbiAgICBpZiAoIU0pIHtcbiAgICAgIGQoW10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmKCEwKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgQyA9IGF3YWl0IChhd2FpdCBhbihIKSkuanNvbigpO1xuICAgICAgZCgoKEsgPSBDID09IG51bGwgPyB2b2lkIDAgOiBDLnJlc3VsdCkgPT0gbnVsbCA/IHZvaWQgMCA6IEsudXNlcnMpIHx8IFtdKTtcbiAgICB9IGNhdGNoIChqKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZmV0Y2hpbmcgZGF0YTpcIiwgaik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGYoITEpO1xuICAgIH1cbiAgfSwgNTAwKSwgW10pLCBSID0gKE0pID0+IHtcbiAgICBjb25zdCBIID0gYCR7b259L3YyL2ZhcmNhc3Rlci91c2VyL3NlYXJjaD9xPSR7TS50YXJnZXQudmFsdWV9JmNsaWVudF9pZD0ke2l9JHthID8gYCZ2aWV3ZXJfZmlkPSR7byA9PSBudWxsID8gdm9pZCAwIDogby5maWR9YCA6IFwiXCJ9KWA7XG4gICAgYyhNLnRhcmdldC52YWx1ZSksIGIoTS50YXJnZXQudmFsdWUsIEgpO1xuICB9LCBBID0gKE0pID0+IHtcbiAgICB0LnNvbWUoKEgpID0+IEgudXNlcm5hbWUgPT09IE0udXNlcm5hbWUpIHx8IChyKFsuLi50LCBNXSksIGMoXCJcIiksIGQoW10pKTtcbiAgfSwgRiA9IChNKSA9PiB7XG4gICAgcih0LmZpbHRlcigoSCkgPT4gSC51c2VybmFtZSAhPT0gTSkpO1xuICB9O1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIHEuanN4cyhHXywge1xuICAgIHJlZjogcCxcbiAgICBzdHlsZToge1xuICAgICAgd2lkdGg6IHNcbiAgICB9LFxuICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyhLXywge1xuICAgICAgY2hpbGRyZW46IFt0Lm1hcCgoTSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhIXywge1xuICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChZbywge1xuICAgICAgICAgIHNyYzogTS5wZnBfdXJsID8/IGJpLFxuICAgICAgICAgIGFsdDogYCR7TS51c2VybmFtZX0gQXZhdGFyYCxcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IFwiMjRweFwiLFxuICAgICAgICAgICAgaGVpZ2h0OiBcIjI0cHhcIixcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1MCVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChcInNwYW5cIiwge1xuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICBtYXJnaW5MZWZ0OiBcIjhweFwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjaGlsZHJlbjogTS5kaXNwbGF5X25hbWVcbiAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChzbSwge1xuICAgICAgICAgIHNpemU6IDIwLFxuICAgICAgICAgIG9uQ2xpY2s6ICgpID0+IEYoTS51c2VybmFtZSlcbiAgICAgICAgfSldXG4gICAgICB9LCBNLnVzZXJuYW1lKSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoWV8sIHtcbiAgICAgICAgY2hpbGRyZW46IFsvKiBAX19QVVJFX18gKi8gcS5qc3goWl8sIHtcbiAgICAgICAgICBjaGlsZHJlbjogLyogQF9fUFVSRV9fICovIHEuanN4KFVfLCB7XG4gICAgICAgICAgICBjb2xvcjogXCIjODU1RENEXCJcbiAgICAgICAgICB9KVxuICAgICAgICB9KSwgLyogQF9fUFVSRV9fICovIHEuanN4KFZfLCB7XG4gICAgICAgICAgLi4ubixcbiAgICAgICAgICB2YWx1ZTogbCxcbiAgICAgICAgICBvbkNoYW5nZTogUixcbiAgICAgICAgICBwbGFjZWhvbGRlcjogXCJUeXBlIHRvIHNlYXJjaCB1c2Vyc1wiLFxuICAgICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgICB3aWR0aDogcyB8fCBcIjEwMCVcIixcbiAgICAgICAgICAgIGhlaWdodDogZSB8fCBcIjQwcHhcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSldXG4gICAgICB9KV1cbiAgICB9KSwgaCA/IC8qIEBfX1BVUkVfXyAqLyBxLmpzeChRXywge1xuICAgICAgY2hpbGRyZW46IC8qIEBfX1BVUkVfXyAqLyBxLmpzeCgkXywge1xuICAgICAgICBjb2xvcjogXCIjODU1RENEXCJcbiAgICAgIH0pXG4gICAgfSkgOiB1Lmxlbmd0aCAhPT0gMCAmJiAvKiBAX19QVVJFX18gKi8gcS5qc3goal8sIHtcbiAgICAgIGNoaWxkcmVuOiB1Lm1hcCgoTSkgPT4gLyogQF9fUFVSRV9fICovIHEuanN4cyhlUiwge1xuICAgICAgICBvbkNsaWNrOiAoKSA9PiBBKE0pLFxuICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChZbywge1xuICAgICAgICAgIHNyYzogTS5wZnBfdXJsID8/IGJpLFxuICAgICAgICAgIGFsdDogYCR7TS51c2VybmFtZX0gQXZhdGFyYCxcbiAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgd2lkdGg6IFwiNDBweFwiLFxuICAgICAgICAgICAgaGVpZ2h0OiBcIjQwcHhcIixcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogXCI1MCVcIlxuICAgICAgICAgIH1cbiAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMocV8sIHtcbiAgICAgICAgICBjaGlsZHJlbjogWy8qIEBfX1BVUkVfXyAqLyBxLmpzeChXXywge1xuICAgICAgICAgICAgY2hpbGRyZW46IE0uZGlzcGxheV9uYW1lXG4gICAgICAgICAgfSksIC8qIEBfX1BVUkVfXyAqLyBxLmpzeHMoWF8sIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiBbLyogQF9fUFVSRV9fICovIHEuanN4cyh6Xywge1xuICAgICAgICAgICAgICBjaGlsZHJlbjogW1wiQFwiLCBNLnVzZXJuYW1lXVxuICAgICAgICAgICAgfSksIE0udmlld2VyX2NvbnRleHQgJiYgKE0udmlld2VyX2NvbnRleHQuZm9sbG93aW5nIHx8IE0udmlld2VyX2NvbnRleHQuZm9sbG93ZWRfYnkpICYmIC8qIEBfX1BVUkVfXyAqLyBxLmpzeChKXywge1xuICAgICAgICAgICAgICBjaGlsZHJlbjogTS52aWV3ZXJfY29udGV4dC5mb2xsb3dpbmcgJiYgTS52aWV3ZXJfY29udGV4dC5mb2xsb3dlZF9ieSA/IFwiRm9sbG93aW5nIGVhY2ggb3RoZXJcIiA6IE0udmlld2VyX2NvbnRleHQuZm9sbG93aW5nID8gXCJGb2xsb3dpbmdcIiA6IE0udmlld2VyX2NvbnRleHQuZm9sbG93ZWRfYnkgPyBcIkZvbGxvd3MgeW91XCIgOiBudWxsXG4gICAgICAgICAgICB9KV1cbiAgICAgICAgICB9KV1cbiAgICAgICAgfSldXG4gICAgICB9LCBNLnVzZXJuYW1lKSlcbiAgICB9KV1cbiAgfSk7XG59O1xuZXhwb3J0IHtcbiAgb2EgYXMgQ2FzdENhcmQsXG4gIGRSIGFzIE1pbmlBcHBQcm92aWRlcixcbiAgcFMgYXMgTmV5bmFyQXV0aEJ1dHRvbixcbiAgeFIgYXMgTmV5bmFyQXV0b0NvbXBsZXRlVXNlcixcbiAgUkEgYXMgTmV5bmFyQ2FzdENhcmQsXG4gIGZSIGFzIE5leW5hckNvbnRleHRQcm92aWRlcixcbiAgbVIgYXMgTmV5bmFyQ29udmVyc2F0aW9uTGlzdCxcbiAgeVIgYXMgTmV5bmFyRmVlZExpc3QsXG4gIGFJIGFzIE5leW5hckZyYW1lQ2FyZCxcbiAgdlIgYXMgTmV5bmFyUHJvZmlsZUNhcmQsXG4gIEVSIGFzIE5leW5hclVzZXJEcm9wZG93bixcbiAgZ3MgYXMgU0lXTl92YXJpYW50LFxuICB5ZyBhcyBUaGVtZSxcbiAgZHUgYXMgdXNlTG9jYWxTdG9yYWdlLFxuICBoUiBhcyB1c2VNaW5pQXBwLFxuICB0cyBhcyB1c2VOZXluYXJDb250ZXh0XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@neynar/react/dist/bundle.es.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/_shortw_utils.js":
/*!*********************************************************!*\
  !*** ./node_modules/@noble/curves/esm/_shortw_utils.js ***!
  \*********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   createCurve: () => (/* binding */ createCurve),\n/* harmony export */   getHash: () => (/* binding */ getHash)\n/* harmony export */ });\n/* harmony import */ var _abstract_weierstrass_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./abstract/weierstrass.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/weierstrass.js\");\n/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n/** connects noble-curves to noble-hashes */\nfunction getHash(hash) {\n    return { hash };\n}\n/** @deprecated use new `weierstrass()` and `ecdsa()` methods */\nfunction createCurve(curveDef, defHash) {\n    const create = (hash) => (0,_abstract_weierstrass_js__WEBPACK_IMPORTED_MODULE_0__.weierstrass)({ ...curveDef, hash: hash });\n    return { ...create(defHash), create };\n}\n//# sourceMappingURL=_shortw_utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9fc2hvcnR3X3V0aWxzLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDd0Q7QUFDeEQ7QUFDTztBQUNQLGFBQWE7QUFDYjtBQUNBO0FBQ087QUFDUCw2QkFBNkIscUVBQVcsR0FBRyx5QkFBeUI7QUFDcEUsYUFBYTtBQUNiO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5vYmxlL2N1cnZlcy9lc20vX3Nob3J0d191dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxpdGllcyBmb3Igc2hvcnQgd2VpZXJzdHJhc3MgY3VydmVzLCBjb21iaW5lZCB3aXRoIG5vYmxlLWhhc2hlcy5cbiAqIEBtb2R1bGVcbiAqL1xuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuaW1wb3J0IHsgd2VpZXJzdHJhc3MgfSBmcm9tIFwiLi9hYnN0cmFjdC93ZWllcnN0cmFzcy5qc1wiO1xuLyoqIGNvbm5lY3RzIG5vYmxlLWN1cnZlcyB0byBub2JsZS1oYXNoZXMgKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRIYXNoKGhhc2gpIHtcbiAgICByZXR1cm4geyBoYXNoIH07XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIG5ldyBgd2VpZXJzdHJhc3MoKWAgYW5kIGBlY2RzYSgpYCBtZXRob2RzICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ3VydmUoY3VydmVEZWYsIGRlZkhhc2gpIHtcbiAgICBjb25zdCBjcmVhdGUgPSAoaGFzaCkgPT4gd2VpZXJzdHJhc3MoeyAuLi5jdXJ2ZURlZiwgaGFzaDogaGFzaCB9KTtcbiAgICByZXR1cm4geyAuLi5jcmVhdGUoZGVmSGFzaCksIGNyZWF0ZSB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3Nob3J0d191dGlscy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/_shortw_utils.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/curve.js":
/*!**********************************************************!*\
  !*** ./node_modules/@noble/curves/esm/abstract/curve.js ***!
  \**********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   _createCurveFields: () => (/* binding */ _createCurveFields),\n/* harmony export */   mulEndoUnsafe: () => (/* binding */ mulEndoUnsafe),\n/* harmony export */   negateCt: () => (/* binding */ negateCt),\n/* harmony export */   normalizeZ: () => (/* binding */ normalizeZ),\n/* harmony export */   pippenger: () => (/* binding */ pippenger),\n/* harmony export */   precomputeMSMUnsafe: () => (/* binding */ precomputeMSMUnsafe),\n/* harmony export */   validateBasic: () => (/* binding */ validateBasic),\n/* harmony export */   wNAF: () => (/* binding */ wNAF)\n/* harmony export */ });\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js\");\n/* harmony import */ var _modular_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modular.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/modular.js\");\n/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nfunction negateCt(condition, item) {\n    const neg = item.negate();\n    return condition ? neg : item;\n}\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nfunction normalizeZ(c, points) {\n    const invertedZs = (0,_modular_js__WEBPACK_IMPORTED_MODULE_0__.FpInvertBatch)(c.Fp, points.map((p) => p.Z));\n    return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\nfunction validateW(W, bits) {\n    if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n        throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\nfunction calcWOpts(W, scalarBits) {\n    validateW(W, scalarBits);\n    const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n    const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n    const maxNumber = 2 ** W; // W=8 256\n    const mask = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.bitMask)(W); // W=8 255 == mask 0b11111111\n    const shiftBy = BigInt(W); // W=8 8\n    return { windows, windowSize, mask, maxNumber, shiftBy };\n}\nfunction calcOffsets(n, window, wOpts) {\n    const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n    let wbits = Number(n & mask); // extract W bits.\n    let nextN = n >> shiftBy; // shift number by W bits.\n    // What actually happens here:\n    // const highestBit = Number(mask ^ (mask >> 1n));\n    // let wbits2 = wbits - 1; // skip zero\n    // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n    // split if bits > max: +224 => 256-32\n    if (wbits > windowSize) {\n        // we skip zero, which means instead of `>= size-1`, we do `> size`\n        wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n        nextN += _1n; // +256 (carry)\n    }\n    const offsetStart = window * windowSize;\n    const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n    const isZero = wbits === 0; // is current window slice a 0?\n    const isNeg = wbits < 0; // is current window slice negative?\n    const isNegF = window % 2 !== 0; // fake random statement for noise\n    const offsetF = offsetStart; // fake offset for noise\n    return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\nfunction validateMSMPoints(points, c) {\n    if (!Array.isArray(points))\n        throw new Error('array expected');\n    points.forEach((p, i) => {\n        if (!(p instanceof c))\n            throw new Error('invalid point at index ' + i);\n    });\n}\nfunction validateMSMScalars(scalars, field) {\n    if (!Array.isArray(scalars))\n        throw new Error('array of scalars expected');\n    scalars.forEach((s, i) => {\n        if (!field.isValid(s))\n            throw new Error('invalid scalar at index ' + i);\n    });\n}\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap();\nconst pointWindowSizes = new WeakMap();\nfunction getW(P) {\n    // To disable precomputes:\n    // return 1;\n    return pointWindowSizes.get(P) || 1;\n}\nfunction assert0(n) {\n    if (n !== _0n)\n        throw new Error('invalid wNAF');\n}\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nclass wNAF {\n    // Parametrized with a given Point class (not individual point)\n    constructor(Point, bits) {\n        this.BASE = Point.BASE;\n        this.ZERO = Point.ZERO;\n        this.Fn = Point.Fn;\n        this.bits = bits;\n    }\n    // non-const time multiplication ladder\n    _unsafeLadder(elm, n, p = this.ZERO) {\n        let d = elm;\n        while (n > _0n) {\n            if (n & _1n)\n                p = p.add(d);\n            d = d.double();\n            n >>= _1n;\n        }\n        return p;\n    }\n    /**\n     * Creates a wNAF precomputation window. Used for caching.\n     * Default window size is set by `utils.precompute()` and is equal to 8.\n     * Number of precomputed points depends on the curve size:\n     * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n     * - 𝑊 is the window size\n     * - 𝑛 is the bitlength of the curve order.\n     * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n     * @param point Point instance\n     * @param W window size\n     * @returns precomputed point tables flattened to a single array\n     */\n    precomputeWindow(point, W) {\n        const { windows, windowSize } = calcWOpts(W, this.bits);\n        const points = [];\n        let p = point;\n        let base = p;\n        for (let window = 0; window < windows; window++) {\n            base = p;\n            points.push(base);\n            // i=1, bc we skip 0\n            for (let i = 1; i < windowSize; i++) {\n                base = base.add(p);\n                points.push(base);\n            }\n            p = base.double();\n        }\n        return points;\n    }\n    /**\n     * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n     * More compact implementation:\n     * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n     * @returns real and fake (for const-time) points\n     */\n    wNAF(W, precomputes, n) {\n        // Scalar should be smaller than field order\n        if (!this.Fn.isValid(n))\n            throw new Error('invalid scalar');\n        // Accumulators\n        let p = this.ZERO;\n        let f = this.BASE;\n        // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n        // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n        // there is negate now: it is possible that negated element from low value\n        // would be the same as high element, which will create carry into next window.\n        // It's not obvious how this can fail, but still worth investigating later.\n        const wo = calcWOpts(W, this.bits);\n        for (let window = 0; window < wo.windows; window++) {\n            // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n            const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n            n = nextN;\n            if (isZero) {\n                // bits are 0: add garbage to fake point\n                // Important part for const-time getPublicKey: add random \"noise\" point to f.\n                f = f.add(negateCt(isNegF, precomputes[offsetF]));\n            }\n            else {\n                // bits are 1: add to result point\n                p = p.add(negateCt(isNeg, precomputes[offset]));\n            }\n        }\n        assert0(n);\n        // Return both real and fake points: JIT won't eliminate f.\n        // At this point there is a way to F be infinity-point even if p is not,\n        // which makes it less const-time: around 1 bigint multiply.\n        return { p, f };\n    }\n    /**\n     * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n     * @param acc accumulator point to add result of multiplication\n     * @returns point\n     */\n    wNAFUnsafe(W, precomputes, n, acc = this.ZERO) {\n        const wo = calcWOpts(W, this.bits);\n        for (let window = 0; window < wo.windows; window++) {\n            if (n === _0n)\n                break; // Early-exit, skip 0 value\n            const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n            n = nextN;\n            if (isZero) {\n                // Window bits are 0: skip processing.\n                // Move to next window.\n                continue;\n            }\n            else {\n                const item = precomputes[offset];\n                acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n            }\n        }\n        assert0(n);\n        return acc;\n    }\n    getPrecomputes(W, point, transform) {\n        // Calculate precomputes on a first run, reuse them after\n        let comp = pointPrecomputes.get(point);\n        if (!comp) {\n            comp = this.precomputeWindow(point, W);\n            if (W !== 1) {\n                // Doing transform outside of if brings 15% perf hit\n                if (typeof transform === 'function')\n                    comp = transform(comp);\n                pointPrecomputes.set(point, comp);\n            }\n        }\n        return comp;\n    }\n    cached(point, scalar, transform) {\n        const W = getW(point);\n        return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n    }\n    unsafe(point, scalar, transform, prev) {\n        const W = getW(point);\n        if (W === 1)\n            return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n        return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n    }\n    // We calculate precomputes for elliptic curve point multiplication\n    // using windowed method. This specifies window size and\n    // stores precomputed values. Usually only base point would be precomputed.\n    createCache(P, W) {\n        validateW(W, this.bits);\n        pointWindowSizes.set(P, W);\n        pointPrecomputes.delete(P);\n    }\n    hasCache(elm) {\n        return getW(elm) !== 1;\n    }\n}\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nfunction mulEndoUnsafe(Point, point, k1, k2) {\n    let acc = point;\n    let p1 = Point.ZERO;\n    let p2 = Point.ZERO;\n    while (k1 > _0n || k2 > _0n) {\n        if (k1 & _1n)\n            p1 = p1.add(acc);\n        if (k2 & _1n)\n            p2 = p2.add(acc);\n        acc = acc.double();\n        k1 >>= _1n;\n        k2 >>= _1n;\n    }\n    return { p1, p2 };\n}\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nfunction pippenger(c, fieldN, points, scalars) {\n    // If we split scalars by some window (let's say 8 bits), every chunk will only\n    // take 256 buckets even if there are 4096 scalars, also re-uses double.\n    // TODO:\n    // - https://eprint.iacr.org/2024/750.pdf\n    // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n    // 0 is accepted in scalars\n    validateMSMPoints(points, c);\n    validateMSMScalars(scalars, fieldN);\n    const plength = points.length;\n    const slength = scalars.length;\n    if (plength !== slength)\n        throw new Error('arrays of points and scalars must have equal length');\n    // if (plength === 0) throw new Error('array must be of length >= 2');\n    const zero = c.ZERO;\n    const wbits = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.bitLen)(BigInt(plength));\n    let windowSize = 1; // bits\n    if (wbits > 12)\n        windowSize = wbits - 3;\n    else if (wbits > 4)\n        windowSize = wbits - 2;\n    else if (wbits > 0)\n        windowSize = 2;\n    const MASK = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.bitMask)(windowSize);\n    const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n    const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n    let sum = zero;\n    for (let i = lastBits; i >= 0; i -= windowSize) {\n        buckets.fill(zero);\n        for (let j = 0; j < slength; j++) {\n            const scalar = scalars[j];\n            const wbits = Number((scalar >> BigInt(i)) & MASK);\n            buckets[wbits] = buckets[wbits].add(points[j]);\n        }\n        let resI = zero; // not using this will do small speed-up, but will lose ct\n        // Skip first bucket, because it is zero\n        for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n            sumI = sumI.add(buckets[j]);\n            resI = resI.add(sumI);\n        }\n        sum = sum.add(resI);\n        if (i !== 0)\n            for (let j = 0; j < windowSize; j++)\n                sum = sum.double();\n    }\n    return sum;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nfunction precomputeMSMUnsafe(c, fieldN, points, windowSize) {\n    /**\n     * Performance Analysis of Window-based Precomputation\n     *\n     * Base Case (256-bit scalar, 8-bit window):\n     * - Standard precomputation requires:\n     *   - 31 additions per scalar × 256 scalars = 7,936 ops\n     *   - Plus 255 summary additions = 8,191 total ops\n     *   Note: Summary additions can be optimized via accumulator\n     *\n     * Chunked Precomputation Analysis:\n     * - Using 32 chunks requires:\n     *   - 255 additions per chunk\n     *   - 256 doublings\n     *   - Total: (255 × 32) + 256 = 8,416 ops\n     *\n     * Memory Usage Comparison:\n     * Window Size | Standard Points | Chunked Points\n     * ------------|-----------------|---------------\n     *     4-bit   |     520         |      15\n     *     8-bit   |    4,224        |     255\n     *    10-bit   |   13,824        |   1,023\n     *    16-bit   |  557,056        |  65,535\n     *\n     * Key Advantages:\n     * 1. Enables larger window sizes due to reduced memory overhead\n     * 2. More efficient for smaller scalar counts:\n     *    - 16 chunks: (16 × 255) + 256 = 4,336 ops\n     *    - ~2x faster than standard 8,191 ops\n     *\n     * Limitations:\n     * - Not suitable for plain precomputes (requires 256 constant doublings)\n     * - Performance degrades with larger scalar counts:\n     *   - Optimal for ~256 scalars\n     *   - Less efficient for 4096+ scalars (Pippenger preferred)\n     */\n    validateW(windowSize, fieldN.BITS);\n    validateMSMPoints(points, c);\n    const zero = c.ZERO;\n    const tableSize = 2 ** windowSize - 1; // table size (without zero)\n    const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n    const MASK = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.bitMask)(windowSize);\n    const tables = points.map((p) => {\n        const res = [];\n        for (let i = 0, acc = p; i < tableSize; i++) {\n            res.push(acc);\n            acc = acc.add(p);\n        }\n        return res;\n    });\n    return (scalars) => {\n        validateMSMScalars(scalars, fieldN);\n        if (scalars.length > points.length)\n            throw new Error('array of scalars must be smaller than array of points');\n        let res = zero;\n        for (let i = 0; i < chunks; i++) {\n            // No need to double if accumulator is still zero.\n            if (res !== zero)\n                for (let j = 0; j < windowSize; j++)\n                    res = res.double();\n            const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n            for (let j = 0; j < scalars.length; j++) {\n                const n = scalars[j];\n                const curr = Number((n >> shiftBy) & MASK);\n                if (!curr)\n                    continue; // skip zero scalars chunks\n                res = res.add(tables[j][curr - 1]);\n            }\n        }\n        return res;\n    };\n}\n// TODO: remove\n/** @deprecated */\nfunction validateBasic(curve) {\n    (0,_modular_js__WEBPACK_IMPORTED_MODULE_0__.validateField)(curve.Fp);\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.validateObject)(curve, {\n        n: 'bigint',\n        h: 'bigint',\n        Gx: 'field',\n        Gy: 'field',\n    }, {\n        nBitLength: 'isSafeInteger',\n        nByteLength: 'isSafeInteger',\n    });\n    // Set defaults\n    return Object.freeze({\n        ...(0,_modular_js__WEBPACK_IMPORTED_MODULE_0__.nLength)(curve.n, curve.nBitLength),\n        ...curve,\n        ...{ p: curve.Fp.ORDER },\n    });\n}\nfunction createField(order, field, isLE) {\n    if (field) {\n        if (field.ORDER !== order)\n            throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n        (0,_modular_js__WEBPACK_IMPORTED_MODULE_0__.validateField)(field);\n        return field;\n    }\n    else {\n        return (0,_modular_js__WEBPACK_IMPORTED_MODULE_0__.Field)(order, { isLE });\n    }\n}\n/** Validates CURVE opts and creates fields */\nfunction _createCurveFields(type, CURVE, curveOpts = {}, FpFnLE) {\n    if (FpFnLE === undefined)\n        FpFnLE = type === 'edwards';\n    if (!CURVE || typeof CURVE !== 'object')\n        throw new Error(`expected valid ${type} CURVE object`);\n    for (const p of ['p', 'n', 'h']) {\n        const val = CURVE[p];\n        if (!(typeof val === 'bigint' && val > _0n))\n            throw new Error(`CURVE.${p} must be positive bigint`);\n    }\n    const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n    const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n    const _b = type === 'weierstrass' ? 'b' : 'd';\n    const params = ['Gx', 'Gy', 'a', _b];\n    for (const p of params) {\n        // @ts-ignore\n        if (!Fp.isValid(CURVE[p]))\n            throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n    }\n    CURVE = Object.freeze(Object.assign({}, CURVE));\n    return { CURVE, Fp, Fn };\n}\n//# sourceMappingURL=curve.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC9jdXJ2ZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQzhEO0FBQ2M7QUFDNUU7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCx1QkFBdUIsMERBQWE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDtBQUNuRCxxQ0FBcUM7QUFDckMsOEJBQThCO0FBQzlCLGlCQUFpQixrREFBTyxLQUFLO0FBQzdCLCtCQUErQjtBQUMvQixhQUFhO0FBQ2I7QUFDQTtBQUNBLFlBQVksdUNBQXVDO0FBQ25ELGtDQUFrQztBQUNsQyw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBLCtCQUErQjtBQUMvQixrQ0FBa0Msd0JBQXdCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QixzQkFBc0I7QUFDdEI7QUFDQTtBQUNBLHNEQUFzRDtBQUN0RCxnQ0FBZ0M7QUFDaEMsNkJBQTZCO0FBQzdCLHFDQUFxQztBQUNyQyxpQ0FBaUM7QUFDakMsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isc0JBQXNCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixrQkFBa0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGdCQUFnQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLHFCQUFxQjtBQUNsRDtBQUNBLG9CQUFvQixnREFBZ0Q7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIscUJBQXFCO0FBQ2xEO0FBQ0EsdUJBQXVCO0FBQ3ZCLG9CQUFvQiwrQkFBK0I7QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RDtBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsaURBQU07QUFDeEIsd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixrREFBTztBQUN4Qiw0REFBNEQ7QUFDNUQ7QUFDQTtBQUNBLDJCQUEyQixRQUFRO0FBQ25DO0FBQ0Esd0JBQXdCLGFBQWE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSxzREFBc0QsT0FBTztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLGdCQUFnQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDO0FBQzNDLHdEQUF3RDtBQUN4RCxpQkFBaUIsa0RBQU87QUFDeEI7QUFDQTtBQUNBLGlDQUFpQyxlQUFlO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsWUFBWTtBQUNwQztBQUNBO0FBQ0EsZ0NBQWdDLGdCQUFnQjtBQUNoRDtBQUNBO0FBQ0EsNEJBQTRCLG9CQUFvQjtBQUNoRDtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsSUFBSSwwREFBYTtBQUNqQixJQUFJLHlEQUFjO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLFdBQVcsb0RBQU87QUFDbEI7QUFDQSxhQUFhLG1CQUFtQjtBQUNoQyxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsMERBQWE7QUFDckI7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrREFBSyxVQUFVLE1BQU07QUFDcEM7QUFDQTtBQUNBO0FBQ08sdURBQXVEO0FBQzlEO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxNQUFNO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxHQUFHO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUMsR0FBRztBQUN4QztBQUNBLDBDQUEwQztBQUMxQyxhQUFhO0FBQ2I7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC9jdXJ2ZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1ldGhvZHMgZm9yIGVsbGlwdGljIGN1cnZlIG11bHRpcGxpY2F0aW9uIGJ5IHNjYWxhcnMuXG4gKiBDb250YWlucyB3TkFGLCBwaXBwZW5nZXIuXG4gKiBAbW9kdWxlXG4gKi9cbi8qISBub2JsZS1jdXJ2ZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbmltcG9ydCB7IGJpdExlbiwgYml0TWFzaywgdmFsaWRhdGVPYmplY3QgfSBmcm9tIFwiLi4vdXRpbHMuanNcIjtcbmltcG9ydCB7IEZpZWxkLCBGcEludmVydEJhdGNoLCBuTGVuZ3RoLCB2YWxpZGF0ZUZpZWxkIH0gZnJvbSBcIi4vbW9kdWxhci5qc1wiO1xuY29uc3QgXzBuID0gQmlnSW50KDApO1xuY29uc3QgXzFuID0gQmlnSW50KDEpO1xuZXhwb3J0IGZ1bmN0aW9uIG5lZ2F0ZUN0KGNvbmRpdGlvbiwgaXRlbSkge1xuICAgIGNvbnN0IG5lZyA9IGl0ZW0ubmVnYXRlKCk7XG4gICAgcmV0dXJuIGNvbmRpdGlvbiA/IG5lZyA6IGl0ZW07XG59XG4vKipcbiAqIFRha2VzIGEgYnVuY2ggb2YgUHJvamVjdGl2ZSBQb2ludHMgYnV0IGV4ZWN1dGVzIG9ubHkgb25lXG4gKiBpbnZlcnNpb24gb24gYWxsIG9mIHRoZW0uIEludmVyc2lvbiBpcyB2ZXJ5IHNsb3cgb3BlcmF0aW9uLFxuICogc28gdGhpcyBpbXByb3ZlcyBwZXJmb3JtYW5jZSBtYXNzaXZlbHkuXG4gKiBPcHRpbWl6YXRpb246IGNvbnZlcnRzIGEgbGlzdCBvZiBwcm9qZWN0aXZlIHBvaW50cyB0byBhIGxpc3Qgb2YgaWRlbnRpY2FsIHBvaW50cyB3aXRoIFo9MS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVooYywgcG9pbnRzKSB7XG4gICAgY29uc3QgaW52ZXJ0ZWRacyA9IEZwSW52ZXJ0QmF0Y2goYy5GcCwgcG9pbnRzLm1hcCgocCkgPT4gcC5aKSk7XG4gICAgcmV0dXJuIHBvaW50cy5tYXAoKHAsIGkpID0+IGMuZnJvbUFmZmluZShwLnRvQWZmaW5lKGludmVydGVkWnNbaV0pKSk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZVcoVywgYml0cykge1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoVykgfHwgVyA8PSAwIHx8IFcgPiBiaXRzKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd2luZG93IHNpemUsIGV4cGVjdGVkIFsxLi4nICsgYml0cyArICddLCBnb3QgVz0nICsgVyk7XG59XG5mdW5jdGlvbiBjYWxjV09wdHMoVywgc2NhbGFyQml0cykge1xuICAgIHZhbGlkYXRlVyhXLCBzY2FsYXJCaXRzKTtcbiAgICBjb25zdCB3aW5kb3dzID0gTWF0aC5jZWlsKHNjYWxhckJpdHMgLyBXKSArIDE7IC8vIFc9OCAzMy4gTm90IDMyLCBiZWNhdXNlIHdlIHNraXAgemVyb1xuICAgIGNvbnN0IHdpbmRvd1NpemUgPSAyICoqIChXIC0gMSk7IC8vIFc9OCAxMjguIE5vdCAyNTYsIGJlY2F1c2Ugd2Ugc2tpcCB6ZXJvXG4gICAgY29uc3QgbWF4TnVtYmVyID0gMiAqKiBXOyAvLyBXPTggMjU2XG4gICAgY29uc3QgbWFzayA9IGJpdE1hc2soVyk7IC8vIFc9OCAyNTUgPT0gbWFzayAwYjExMTExMTExXG4gICAgY29uc3Qgc2hpZnRCeSA9IEJpZ0ludChXKTsgLy8gVz04IDhcbiAgICByZXR1cm4geyB3aW5kb3dzLCB3aW5kb3dTaXplLCBtYXNrLCBtYXhOdW1iZXIsIHNoaWZ0QnkgfTtcbn1cbmZ1bmN0aW9uIGNhbGNPZmZzZXRzKG4sIHdpbmRvdywgd09wdHMpIHtcbiAgICBjb25zdCB7IHdpbmRvd1NpemUsIG1hc2ssIG1heE51bWJlciwgc2hpZnRCeSB9ID0gd09wdHM7XG4gICAgbGV0IHdiaXRzID0gTnVtYmVyKG4gJiBtYXNrKTsgLy8gZXh0cmFjdCBXIGJpdHMuXG4gICAgbGV0IG5leHROID0gbiA+PiBzaGlmdEJ5OyAvLyBzaGlmdCBudW1iZXIgYnkgVyBiaXRzLlxuICAgIC8vIFdoYXQgYWN0dWFsbHkgaGFwcGVucyBoZXJlOlxuICAgIC8vIGNvbnN0IGhpZ2hlc3RCaXQgPSBOdW1iZXIobWFzayBeIChtYXNrID4+IDFuKSk7XG4gICAgLy8gbGV0IHdiaXRzMiA9IHdiaXRzIC0gMTsgLy8gc2tpcCB6ZXJvXG4gICAgLy8gaWYgKHdiaXRzMiAmIGhpZ2hlc3RCaXQpIHsgd2JpdHMyIF49IE51bWJlcihtYXNrKTsgLy8gKH4pO1xuICAgIC8vIHNwbGl0IGlmIGJpdHMgPiBtYXg6ICsyMjQgPT4gMjU2LTMyXG4gICAgaWYgKHdiaXRzID4gd2luZG93U2l6ZSkge1xuICAgICAgICAvLyB3ZSBza2lwIHplcm8sIHdoaWNoIG1lYW5zIGluc3RlYWQgb2YgYD49IHNpemUtMWAsIHdlIGRvIGA+IHNpemVgXG4gICAgICAgIHdiaXRzIC09IG1heE51bWJlcjsgLy8gLTMyLCBjYW4gYmUgbWF4TnVtYmVyIC0gd2JpdHMsIGJ1dCB0aGVuIHdlIG5lZWQgdG8gc2V0IGlzTmVnIGhlcmUuXG4gICAgICAgIG5leHROICs9IF8xbjsgLy8gKzI1NiAoY2FycnkpXG4gICAgfVxuICAgIGNvbnN0IG9mZnNldFN0YXJ0ID0gd2luZG93ICogd2luZG93U2l6ZTtcbiAgICBjb25zdCBvZmZzZXQgPSBvZmZzZXRTdGFydCArIE1hdGguYWJzKHdiaXRzKSAtIDE7IC8vIC0xIGJlY2F1c2Ugd2Ugc2tpcCB6ZXJvXG4gICAgY29uc3QgaXNaZXJvID0gd2JpdHMgPT09IDA7IC8vIGlzIGN1cnJlbnQgd2luZG93IHNsaWNlIGEgMD9cbiAgICBjb25zdCBpc05lZyA9IHdiaXRzIDwgMDsgLy8gaXMgY3VycmVudCB3aW5kb3cgc2xpY2UgbmVnYXRpdmU/XG4gICAgY29uc3QgaXNOZWdGID0gd2luZG93ICUgMiAhPT0gMDsgLy8gZmFrZSByYW5kb20gc3RhdGVtZW50IGZvciBub2lzZVxuICAgIGNvbnN0IG9mZnNldEYgPSBvZmZzZXRTdGFydDsgLy8gZmFrZSBvZmZzZXQgZm9yIG5vaXNlXG4gICAgcmV0dXJuIHsgbmV4dE4sIG9mZnNldCwgaXNaZXJvLCBpc05lZywgaXNOZWdGLCBvZmZzZXRGIH07XG59XG5mdW5jdGlvbiB2YWxpZGF0ZU1TTVBvaW50cyhwb2ludHMsIGMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocG9pbnRzKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdhcnJheSBleHBlY3RlZCcpO1xuICAgIHBvaW50cy5mb3JFYWNoKChwLCBpKSA9PiB7XG4gICAgICAgIGlmICghKHAgaW5zdGFuY2VvZiBjKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBwb2ludCBhdCBpbmRleCAnICsgaSk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiB2YWxpZGF0ZU1TTVNjYWxhcnMoc2NhbGFycywgZmllbGQpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2NhbGFycykpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYXJyYXkgb2Ygc2NhbGFycyBleHBlY3RlZCcpO1xuICAgIHNjYWxhcnMuZm9yRWFjaCgocywgaSkgPT4ge1xuICAgICAgICBpZiAoIWZpZWxkLmlzVmFsaWQocykpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgc2NhbGFyIGF0IGluZGV4ICcgKyBpKTtcbiAgICB9KTtcbn1cbi8vIFNpbmNlIHBvaW50cyBpbiBkaWZmZXJlbnQgZ3JvdXBzIGNhbm5vdCBiZSBlcXVhbCAoZGlmZmVyZW50IG9iamVjdCBjb25zdHJ1Y3RvciksXG4vLyB3ZSBjYW4gaGF2ZSBzaW5nbGUgcGxhY2UgdG8gc3RvcmUgcHJlY29tcHV0ZXMuXG4vLyBBbGxvd3MgdG8gbWFrZSBwb2ludHMgZnJvemVuIC8gaW1tdXRhYmxlLlxuY29uc3QgcG9pbnRQcmVjb21wdXRlcyA9IG5ldyBXZWFrTWFwKCk7XG5jb25zdCBwb2ludFdpbmRvd1NpemVzID0gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIGdldFcoUCkge1xuICAgIC8vIFRvIGRpc2FibGUgcHJlY29tcHV0ZXM6XG4gICAgLy8gcmV0dXJuIDE7XG4gICAgcmV0dXJuIHBvaW50V2luZG93U2l6ZXMuZ2V0KFApIHx8IDE7XG59XG5mdW5jdGlvbiBhc3NlcnQwKG4pIHtcbiAgICBpZiAobiAhPT0gXzBuKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgd05BRicpO1xufVxuLyoqXG4gKiBFbGxpcHRpYyBjdXJ2ZSBtdWx0aXBsaWNhdGlvbiBvZiBQb2ludCBieSBzY2FsYXIuIEZyYWdpbGUuXG4gKiBUYWJsZSBnZW5lcmF0aW9uIHRha2VzICoqMzBNQiBvZiByYW0gYW5kIDEwbXMgb24gaGlnaC1lbmQgQ1BVKiosXG4gKiBidXQgbWF5IHRha2UgbXVjaCBsb25nZXIgb24gc2xvdyBkZXZpY2VzLiBBY3R1YWwgZ2VuZXJhdGlvbiB3aWxsIGhhcHBlbiBvblxuICogZmlyc3QgY2FsbCBvZiBgbXVsdGlwbHkoKWAuIEJ5IGRlZmF1bHQsIGBCQVNFYCBwb2ludCBpcyBwcmVjb21wdXRlZC5cbiAqXG4gKiBTY2FsYXJzIHNob3VsZCBhbHdheXMgYmUgbGVzcyB0aGFuIGN1cnZlIG9yZGVyOiB0aGlzIHNob3VsZCBiZSBjaGVja2VkIGluc2lkZSBvZiBhIGN1cnZlIGl0c2VsZi5cbiAqIENyZWF0ZXMgcHJlY29tcHV0YXRpb24gdGFibGVzIGZvciBmYXN0IG11bHRpcGxpY2F0aW9uOlxuICogLSBwcml2YXRlIHNjYWxhciBpcyBzcGxpdCBieSBmaXhlZCBzaXplIHdpbmRvd3Mgb2YgVyBiaXRzXG4gKiAtIGV2ZXJ5IHdpbmRvdyBwb2ludCBpcyBjb2xsZWN0ZWQgZnJvbSB3aW5kb3cncyB0YWJsZSAmIGFkZGVkIHRvIGFjY3VtdWxhdG9yXG4gKiAtIHNpbmNlIHdpbmRvd3MgYXJlIGRpZmZlcmVudCwgc2FtZSBwb2ludCBpbnNpZGUgdGFibGVzIHdvbid0IGJlIGFjY2Vzc2VkIG1vcmUgdGhhbiBvbmNlIHBlciBjYWxjXG4gKiAtIGVhY2ggbXVsdGlwbGljYXRpb24gaXMgJ01hdGguY2VpbChDVVJWRV9PUkRFUiAvIPCdkYopICsgMScgcG9pbnQgYWRkaXRpb25zIChmaXhlZCBmb3IgYW55IHNjYWxhcilcbiAqIC0gKzEgd2luZG93IGlzIG5lY2Nlc3NhcnkgZm9yIHdOQUZcbiAqIC0gd05BRiByZWR1Y2VzIHRhYmxlIHNpemU6IDJ4IGxlc3MgbWVtb3J5ICsgMnggZmFzdGVyIGdlbmVyYXRpb24sIGJ1dCAxMCUgc2xvd2VyIG11bHRpcGxpY2F0aW9uXG4gKlxuICogQHRvZG8gUmVzZWFyY2ggcmV0dXJuaW5nIDJkIEpTIGFycmF5IG9mIHdpbmRvd3MsIGluc3RlYWQgb2YgYSBzaW5nbGUgd2luZG93LlxuICogVGhpcyB3b3VsZCBhbGxvdyB3aW5kb3dzIHRvIGJlIGluIGRpZmZlcmVudCBtZW1vcnkgbG9jYXRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyB3TkFGIHtcbiAgICAvLyBQYXJhbWV0cml6ZWQgd2l0aCBhIGdpdmVuIFBvaW50IGNsYXNzIChub3QgaW5kaXZpZHVhbCBwb2ludClcbiAgICBjb25zdHJ1Y3RvcihQb2ludCwgYml0cykge1xuICAgICAgICB0aGlzLkJBU0UgPSBQb2ludC5CQVNFO1xuICAgICAgICB0aGlzLlpFUk8gPSBQb2ludC5aRVJPO1xuICAgICAgICB0aGlzLkZuID0gUG9pbnQuRm47XG4gICAgICAgIHRoaXMuYml0cyA9IGJpdHM7XG4gICAgfVxuICAgIC8vIG5vbi1jb25zdCB0aW1lIG11bHRpcGxpY2F0aW9uIGxhZGRlclxuICAgIF91bnNhZmVMYWRkZXIoZWxtLCBuLCBwID0gdGhpcy5aRVJPKSB7XG4gICAgICAgIGxldCBkID0gZWxtO1xuICAgICAgICB3aGlsZSAobiA+IF8wbikge1xuICAgICAgICAgICAgaWYgKG4gJiBfMW4pXG4gICAgICAgICAgICAgICAgcCA9IHAuYWRkKGQpO1xuICAgICAgICAgICAgZCA9IGQuZG91YmxlKCk7XG4gICAgICAgICAgICBuID4+PSBfMW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSB3TkFGIHByZWNvbXB1dGF0aW9uIHdpbmRvdy4gVXNlZCBmb3IgY2FjaGluZy5cbiAgICAgKiBEZWZhdWx0IHdpbmRvdyBzaXplIGlzIHNldCBieSBgdXRpbHMucHJlY29tcHV0ZSgpYCBhbmQgaXMgZXF1YWwgdG8gOC5cbiAgICAgKiBOdW1iZXIgb2YgcHJlY29tcHV0ZWQgcG9pbnRzIGRlcGVuZHMgb24gdGhlIGN1cnZlIHNpemU6XG4gICAgICogMl4o8J2RiuKIkjEpICogKE1hdGguY2VpbCjwnZGbIC8g8J2RiikgKyAxKSwgd2hlcmU6XG4gICAgICogLSDwnZGKIGlzIHRoZSB3aW5kb3cgc2l6ZVxuICAgICAqIC0g8J2RmyBpcyB0aGUgYml0bGVuZ3RoIG9mIHRoZSBjdXJ2ZSBvcmRlci5cbiAgICAgKiBGb3IgYSAyNTYtYml0IGN1cnZlIGFuZCB3aW5kb3cgc2l6ZSA4LCB0aGUgbnVtYmVyIG9mIHByZWNvbXB1dGVkIHBvaW50cyBpcyAxMjggKiAzMyA9IDQyMjQuXG4gICAgICogQHBhcmFtIHBvaW50IFBvaW50IGluc3RhbmNlXG4gICAgICogQHBhcmFtIFcgd2luZG93IHNpemVcbiAgICAgKiBAcmV0dXJucyBwcmVjb21wdXRlZCBwb2ludCB0YWJsZXMgZmxhdHRlbmVkIHRvIGEgc2luZ2xlIGFycmF5XG4gICAgICovXG4gICAgcHJlY29tcHV0ZVdpbmRvdyhwb2ludCwgVykge1xuICAgICAgICBjb25zdCB7IHdpbmRvd3MsIHdpbmRvd1NpemUgfSA9IGNhbGNXT3B0cyhXLCB0aGlzLmJpdHMpO1xuICAgICAgICBjb25zdCBwb2ludHMgPSBbXTtcbiAgICAgICAgbGV0IHAgPSBwb2ludDtcbiAgICAgICAgbGV0IGJhc2UgPSBwO1xuICAgICAgICBmb3IgKGxldCB3aW5kb3cgPSAwOyB3aW5kb3cgPCB3aW5kb3dzOyB3aW5kb3crKykge1xuICAgICAgICAgICAgYmFzZSA9IHA7XG4gICAgICAgICAgICBwb2ludHMucHVzaChiYXNlKTtcbiAgICAgICAgICAgIC8vIGk9MSwgYmMgd2Ugc2tpcCAwXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHdpbmRvd1NpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlLmFkZChwKTtcbiAgICAgICAgICAgICAgICBwb2ludHMucHVzaChiYXNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHAgPSBiYXNlLmRvdWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb2ludHM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEltcGxlbWVudHMgZWMgbXVsdGlwbGljYXRpb24gdXNpbmcgcHJlY29tcHV0ZWQgdGFibGVzIGFuZCB3LWFyeSBub24tYWRqYWNlbnQgZm9ybS5cbiAgICAgKiBNb3JlIGNvbXBhY3QgaW1wbGVtZW50YXRpb246XG4gICAgICogaHR0cHM6Ly9naXRodWIuY29tL3BhdWxtaWxsci9ub2JsZS1zZWNwMjU2azEvYmxvYi80N2NiMTY2OWI2ZTUwNmFkNjZiMzVmZTdkNzYxMzJhZTk3NDY1ZGEyL2luZGV4LnRzI0w1MDItTDU0MVxuICAgICAqIEByZXR1cm5zIHJlYWwgYW5kIGZha2UgKGZvciBjb25zdC10aW1lKSBwb2ludHNcbiAgICAgKi9cbiAgICB3TkFGKFcsIHByZWNvbXB1dGVzLCBuKSB7XG4gICAgICAgIC8vIFNjYWxhciBzaG91bGQgYmUgc21hbGxlciB0aGFuIGZpZWxkIG9yZGVyXG4gICAgICAgIGlmICghdGhpcy5Gbi5pc1ZhbGlkKG4pKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNjYWxhcicpO1xuICAgICAgICAvLyBBY2N1bXVsYXRvcnNcbiAgICAgICAgbGV0IHAgPSB0aGlzLlpFUk87XG4gICAgICAgIGxldCBmID0gdGhpcy5CQVNFO1xuICAgICAgICAvLyBUaGlzIGNvZGUgd2FzIGZpcnN0IHdyaXR0ZW4gd2l0aCBhc3N1bXB0aW9uIHRoYXQgJ2YnIGFuZCAncCcgd2lsbCBuZXZlciBiZSBpbmZpbml0eSBwb2ludDpcbiAgICAgICAgLy8gc2luY2UgZWFjaCBhZGRpdGlvbiBpcyBtdWx0aXBsaWVkIGJ5IDIgKiogVywgaXQgY2Fubm90IGNhbmNlbCBlYWNoIG90aGVyLiBIb3dldmVyLFxuICAgICAgICAvLyB0aGVyZSBpcyBuZWdhdGUgbm93OiBpdCBpcyBwb3NzaWJsZSB0aGF0IG5lZ2F0ZWQgZWxlbWVudCBmcm9tIGxvdyB2YWx1ZVxuICAgICAgICAvLyB3b3VsZCBiZSB0aGUgc2FtZSBhcyBoaWdoIGVsZW1lbnQsIHdoaWNoIHdpbGwgY3JlYXRlIGNhcnJ5IGludG8gbmV4dCB3aW5kb3cuXG4gICAgICAgIC8vIEl0J3Mgbm90IG9idmlvdXMgaG93IHRoaXMgY2FuIGZhaWwsIGJ1dCBzdGlsbCB3b3J0aCBpbnZlc3RpZ2F0aW5nIGxhdGVyLlxuICAgICAgICBjb25zdCB3byA9IGNhbGNXT3B0cyhXLCB0aGlzLmJpdHMpO1xuICAgICAgICBmb3IgKGxldCB3aW5kb3cgPSAwOyB3aW5kb3cgPCB3by53aW5kb3dzOyB3aW5kb3crKykge1xuICAgICAgICAgICAgLy8gKG4gPT09IF8wbikgaXMgaGFuZGxlZCBhbmQgbm90IGVhcmx5LWV4aXRlZC4gaXNFdmVuIGFuZCBvZmZzZXRGIGFyZSB1c2VkIGZvciBub2lzZVxuICAgICAgICAgICAgY29uc3QgeyBuZXh0Tiwgb2Zmc2V0LCBpc1plcm8sIGlzTmVnLCBpc05lZ0YsIG9mZnNldEYgfSA9IGNhbGNPZmZzZXRzKG4sIHdpbmRvdywgd28pO1xuICAgICAgICAgICAgbiA9IG5leHROO1xuICAgICAgICAgICAgaWYgKGlzWmVybykge1xuICAgICAgICAgICAgICAgIC8vIGJpdHMgYXJlIDA6IGFkZCBnYXJiYWdlIHRvIGZha2UgcG9pbnRcbiAgICAgICAgICAgICAgICAvLyBJbXBvcnRhbnQgcGFydCBmb3IgY29uc3QtdGltZSBnZXRQdWJsaWNLZXk6IGFkZCByYW5kb20gXCJub2lzZVwiIHBvaW50IHRvIGYuXG4gICAgICAgICAgICAgICAgZiA9IGYuYWRkKG5lZ2F0ZUN0KGlzTmVnRiwgcHJlY29tcHV0ZXNbb2Zmc2V0Rl0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGJpdHMgYXJlIDE6IGFkZCB0byByZXN1bHQgcG9pbnRcbiAgICAgICAgICAgICAgICBwID0gcC5hZGQobmVnYXRlQ3QoaXNOZWcsIHByZWNvbXB1dGVzW29mZnNldF0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhc3NlcnQwKG4pO1xuICAgICAgICAvLyBSZXR1cm4gYm90aCByZWFsIGFuZCBmYWtlIHBvaW50czogSklUIHdvbid0IGVsaW1pbmF0ZSBmLlxuICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZXJlIGlzIGEgd2F5IHRvIEYgYmUgaW5maW5pdHktcG9pbnQgZXZlbiBpZiBwIGlzIG5vdCxcbiAgICAgICAgLy8gd2hpY2ggbWFrZXMgaXQgbGVzcyBjb25zdC10aW1lOiBhcm91bmQgMSBiaWdpbnQgbXVsdGlwbHkuXG4gICAgICAgIHJldHVybiB7IHAsIGYgfTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogSW1wbGVtZW50cyBlYyB1bnNhZmUgKG5vbiBjb25zdC10aW1lKSBtdWx0aXBsaWNhdGlvbiB1c2luZyBwcmVjb21wdXRlZCB0YWJsZXMgYW5kIHctYXJ5IG5vbi1hZGphY2VudCBmb3JtLlxuICAgICAqIEBwYXJhbSBhY2MgYWNjdW11bGF0b3IgcG9pbnQgdG8gYWRkIHJlc3VsdCBvZiBtdWx0aXBsaWNhdGlvblxuICAgICAqIEByZXR1cm5zIHBvaW50XG4gICAgICovXG4gICAgd05BRlVuc2FmZShXLCBwcmVjb21wdXRlcywgbiwgYWNjID0gdGhpcy5aRVJPKSB7XG4gICAgICAgIGNvbnN0IHdvID0gY2FsY1dPcHRzKFcsIHRoaXMuYml0cyk7XG4gICAgICAgIGZvciAobGV0IHdpbmRvdyA9IDA7IHdpbmRvdyA8IHdvLndpbmRvd3M7IHdpbmRvdysrKSB7XG4gICAgICAgICAgICBpZiAobiA9PT0gXzBuKVxuICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBFYXJseS1leGl0LCBza2lwIDAgdmFsdWVcbiAgICAgICAgICAgIGNvbnN0IHsgbmV4dE4sIG9mZnNldCwgaXNaZXJvLCBpc05lZyB9ID0gY2FsY09mZnNldHMobiwgd2luZG93LCB3byk7XG4gICAgICAgICAgICBuID0gbmV4dE47XG4gICAgICAgICAgICBpZiAoaXNaZXJvKSB7XG4gICAgICAgICAgICAgICAgLy8gV2luZG93IGJpdHMgYXJlIDA6IHNraXAgcHJvY2Vzc2luZy5cbiAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIG5leHQgd2luZG93LlxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHByZWNvbXB1dGVzW29mZnNldF07XG4gICAgICAgICAgICAgICAgYWNjID0gYWNjLmFkZChpc05lZyA/IGl0ZW0ubmVnYXRlKCkgOiBpdGVtKTsgLy8gUmUtdXNpbmcgYWNjIGFsbG93cyB0byBzYXZlIGFkZHMgaW4gTVNNXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0MChuKTtcbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9XG4gICAgZ2V0UHJlY29tcHV0ZXMoVywgcG9pbnQsIHRyYW5zZm9ybSkge1xuICAgICAgICAvLyBDYWxjdWxhdGUgcHJlY29tcHV0ZXMgb24gYSBmaXJzdCBydW4sIHJldXNlIHRoZW0gYWZ0ZXJcbiAgICAgICAgbGV0IGNvbXAgPSBwb2ludFByZWNvbXB1dGVzLmdldChwb2ludCk7XG4gICAgICAgIGlmICghY29tcCkge1xuICAgICAgICAgICAgY29tcCA9IHRoaXMucHJlY29tcHV0ZVdpbmRvdyhwb2ludCwgVyk7XG4gICAgICAgICAgICBpZiAoVyAhPT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIERvaW5nIHRyYW5zZm9ybSBvdXRzaWRlIG9mIGlmIGJyaW5ncyAxNSUgcGVyZiBoaXRcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgICAgICAgICAgY29tcCA9IHRyYW5zZm9ybShjb21wKTtcbiAgICAgICAgICAgICAgICBwb2ludFByZWNvbXB1dGVzLnNldChwb2ludCwgY29tcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXA7XG4gICAgfVxuICAgIGNhY2hlZChwb2ludCwgc2NhbGFyLCB0cmFuc2Zvcm0pIHtcbiAgICAgICAgY29uc3QgVyA9IGdldFcocG9pbnQpO1xuICAgICAgICByZXR1cm4gdGhpcy53TkFGKFcsIHRoaXMuZ2V0UHJlY29tcHV0ZXMoVywgcG9pbnQsIHRyYW5zZm9ybSksIHNjYWxhcik7XG4gICAgfVxuICAgIHVuc2FmZShwb2ludCwgc2NhbGFyLCB0cmFuc2Zvcm0sIHByZXYpIHtcbiAgICAgICAgY29uc3QgVyA9IGdldFcocG9pbnQpO1xuICAgICAgICBpZiAoVyA9PT0gMSlcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bnNhZmVMYWRkZXIocG9pbnQsIHNjYWxhciwgcHJldik7IC8vIEZvciBXPTEgbGFkZGVyIGlzIH54MiBmYXN0ZXJcbiAgICAgICAgcmV0dXJuIHRoaXMud05BRlVuc2FmZShXLCB0aGlzLmdldFByZWNvbXB1dGVzKFcsIHBvaW50LCB0cmFuc2Zvcm0pLCBzY2FsYXIsIHByZXYpO1xuICAgIH1cbiAgICAvLyBXZSBjYWxjdWxhdGUgcHJlY29tcHV0ZXMgZm9yIGVsbGlwdGljIGN1cnZlIHBvaW50IG11bHRpcGxpY2F0aW9uXG4gICAgLy8gdXNpbmcgd2luZG93ZWQgbWV0aG9kLiBUaGlzIHNwZWNpZmllcyB3aW5kb3cgc2l6ZSBhbmRcbiAgICAvLyBzdG9yZXMgcHJlY29tcHV0ZWQgdmFsdWVzLiBVc3VhbGx5IG9ubHkgYmFzZSBwb2ludCB3b3VsZCBiZSBwcmVjb21wdXRlZC5cbiAgICBjcmVhdGVDYWNoZShQLCBXKSB7XG4gICAgICAgIHZhbGlkYXRlVyhXLCB0aGlzLmJpdHMpO1xuICAgICAgICBwb2ludFdpbmRvd1NpemVzLnNldChQLCBXKTtcbiAgICAgICAgcG9pbnRQcmVjb21wdXRlcy5kZWxldGUoUCk7XG4gICAgfVxuICAgIGhhc0NhY2hlKGVsbSkge1xuICAgICAgICByZXR1cm4gZ2V0VyhlbG0pICE9PSAxO1xuICAgIH1cbn1cbi8qKlxuICogRW5kb21vcnBoaXNtLXNwZWNpZmljIG11bHRpcGxpY2F0aW9uIGZvciBLb2JsaXR6IGN1cnZlcy5cbiAqIENvc3Q6IDEyOCBkYmwsIDAtMjU2IGFkZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtdWxFbmRvVW5zYWZlKFBvaW50LCBwb2ludCwgazEsIGsyKSB7XG4gICAgbGV0IGFjYyA9IHBvaW50O1xuICAgIGxldCBwMSA9IFBvaW50LlpFUk87XG4gICAgbGV0IHAyID0gUG9pbnQuWkVSTztcbiAgICB3aGlsZSAoazEgPiBfMG4gfHwgazIgPiBfMG4pIHtcbiAgICAgICAgaWYgKGsxICYgXzFuKVxuICAgICAgICAgICAgcDEgPSBwMS5hZGQoYWNjKTtcbiAgICAgICAgaWYgKGsyICYgXzFuKVxuICAgICAgICAgICAgcDIgPSBwMi5hZGQoYWNjKTtcbiAgICAgICAgYWNjID0gYWNjLmRvdWJsZSgpO1xuICAgICAgICBrMSA+Pj0gXzFuO1xuICAgICAgICBrMiA+Pj0gXzFuO1xuICAgIH1cbiAgICByZXR1cm4geyBwMSwgcDIgfTtcbn1cbi8qKlxuICogUGlwcGVuZ2VyIGFsZ29yaXRobSBmb3IgbXVsdGktc2NhbGFyIG11bHRpcGxpY2F0aW9uIChNU00sIFBhICsgUWIgKyBSYyArIC4uLikuXG4gKiAzMHggZmFzdGVyIHZzIG5haXZlIGFkZGl0aW9uIG9uIEw9NDA5NiwgMTB4IGZhc3RlciB0aGFuIHByZWNvbXB1dGVzLlxuICogRm9yIE49MjU0Yml0LCBMPTEsIGl0IGRvZXM6IDEwMjQgQUREICsgMjU0IERCTC4gRm9yIEw9NTogMTUzNiBBREQgKyAyNTQgREJMLlxuICogQWxnb3JpdGhtaWNhbGx5IGNvbnN0YW50LXRpbWUgKGZvciBzYW1lIEwpLCBldmVuIHdoZW4gMSBwb2ludCArIHNjYWxhciwgb3Igd2hlbiBzY2FsYXIgPSAwLlxuICogQHBhcmFtIGMgQ3VydmUgUG9pbnQgY29uc3RydWN0b3JcbiAqIEBwYXJhbSBmaWVsZE4gZmllbGQgb3ZlciBDVVJWRS5OIC0gaW1wb3J0YW50IHRoYXQgaXQncyBub3Qgb3ZlciBDVVJWRS5QXG4gKiBAcGFyYW0gcG9pbnRzIGFycmF5IG9mIEwgY3VydmUgcG9pbnRzXG4gKiBAcGFyYW0gc2NhbGFycyBhcnJheSBvZiBMIHNjYWxhcnMgKGFrYSBzZWNyZXQga2V5cyAvIGJpZ2ludHMpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaXBwZW5nZXIoYywgZmllbGROLCBwb2ludHMsIHNjYWxhcnMpIHtcbiAgICAvLyBJZiB3ZSBzcGxpdCBzY2FsYXJzIGJ5IHNvbWUgd2luZG93IChsZXQncyBzYXkgOCBiaXRzKSwgZXZlcnkgY2h1bmsgd2lsbCBvbmx5XG4gICAgLy8gdGFrZSAyNTYgYnVja2V0cyBldmVuIGlmIHRoZXJlIGFyZSA0MDk2IHNjYWxhcnMsIGFsc28gcmUtdXNlcyBkb3VibGUuXG4gICAgLy8gVE9ETzpcbiAgICAvLyAtIGh0dHBzOi8vZXByaW50LmlhY3Iub3JnLzIwMjQvNzUwLnBkZlxuICAgIC8vIC0gaHR0cHM6Ly90Y2hlcy5pYWNyLm9yZy9pbmRleC5waHAvVENIRVMvYXJ0aWNsZS92aWV3LzEwMjg3XG4gICAgLy8gMCBpcyBhY2NlcHRlZCBpbiBzY2FsYXJzXG4gICAgdmFsaWRhdGVNU01Qb2ludHMocG9pbnRzLCBjKTtcbiAgICB2YWxpZGF0ZU1TTVNjYWxhcnMoc2NhbGFycywgZmllbGROKTtcbiAgICBjb25zdCBwbGVuZ3RoID0gcG9pbnRzLmxlbmd0aDtcbiAgICBjb25zdCBzbGVuZ3RoID0gc2NhbGFycy5sZW5ndGg7XG4gICAgaWYgKHBsZW5ndGggIT09IHNsZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYXJyYXlzIG9mIHBvaW50cyBhbmQgc2NhbGFycyBtdXN0IGhhdmUgZXF1YWwgbGVuZ3RoJyk7XG4gICAgLy8gaWYgKHBsZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcignYXJyYXkgbXVzdCBiZSBvZiBsZW5ndGggPj0gMicpO1xuICAgIGNvbnN0IHplcm8gPSBjLlpFUk87XG4gICAgY29uc3Qgd2JpdHMgPSBiaXRMZW4oQmlnSW50KHBsZW5ndGgpKTtcbiAgICBsZXQgd2luZG93U2l6ZSA9IDE7IC8vIGJpdHNcbiAgICBpZiAod2JpdHMgPiAxMilcbiAgICAgICAgd2luZG93U2l6ZSA9IHdiaXRzIC0gMztcbiAgICBlbHNlIGlmICh3Yml0cyA+IDQpXG4gICAgICAgIHdpbmRvd1NpemUgPSB3Yml0cyAtIDI7XG4gICAgZWxzZSBpZiAod2JpdHMgPiAwKVxuICAgICAgICB3aW5kb3dTaXplID0gMjtcbiAgICBjb25zdCBNQVNLID0gYml0TWFzayh3aW5kb3dTaXplKTtcbiAgICBjb25zdCBidWNrZXRzID0gbmV3IEFycmF5KE51bWJlcihNQVNLKSArIDEpLmZpbGwoemVybyk7IC8vICsxIGZvciB6ZXJvIGFycmF5XG4gICAgY29uc3QgbGFzdEJpdHMgPSBNYXRoLmZsb29yKChmaWVsZE4uQklUUyAtIDEpIC8gd2luZG93U2l6ZSkgKiB3aW5kb3dTaXplO1xuICAgIGxldCBzdW0gPSB6ZXJvO1xuICAgIGZvciAobGV0IGkgPSBsYXN0Qml0czsgaSA+PSAwOyBpIC09IHdpbmRvd1NpemUpIHtcbiAgICAgICAgYnVja2V0cy5maWxsKHplcm8pO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3Qgc2NhbGFyID0gc2NhbGFyc1tqXTtcbiAgICAgICAgICAgIGNvbnN0IHdiaXRzID0gTnVtYmVyKChzY2FsYXIgPj4gQmlnSW50KGkpKSAmIE1BU0spO1xuICAgICAgICAgICAgYnVja2V0c1t3Yml0c10gPSBidWNrZXRzW3diaXRzXS5hZGQocG9pbnRzW2pdKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzSSA9IHplcm87IC8vIG5vdCB1c2luZyB0aGlzIHdpbGwgZG8gc21hbGwgc3BlZWQtdXAsIGJ1dCB3aWxsIGxvc2UgY3RcbiAgICAgICAgLy8gU2tpcCBmaXJzdCBidWNrZXQsIGJlY2F1c2UgaXQgaXMgemVyb1xuICAgICAgICBmb3IgKGxldCBqID0gYnVja2V0cy5sZW5ndGggLSAxLCBzdW1JID0gemVybzsgaiA+IDA7IGotLSkge1xuICAgICAgICAgICAgc3VtSSA9IHN1bUkuYWRkKGJ1Y2tldHNbal0pO1xuICAgICAgICAgICAgcmVzSSA9IHJlc0kuYWRkKHN1bUkpO1xuICAgICAgICB9XG4gICAgICAgIHN1bSA9IHN1bS5hZGQocmVzSSk7XG4gICAgICAgIGlmIChpICE9PSAwKVxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB3aW5kb3dTaXplOyBqKyspXG4gICAgICAgICAgICAgICAgc3VtID0gc3VtLmRvdWJsZSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xufVxuLyoqXG4gKiBQcmVjb21wdXRlZCBtdWx0aS1zY2FsYXIgbXVsdGlwbGljYXRpb24gKE1TTSwgUGEgKyBRYiArIFJjICsgLi4uKS5cbiAqIEBwYXJhbSBjIEN1cnZlIFBvaW50IGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0gZmllbGROIGZpZWxkIG92ZXIgQ1VSVkUuTiAtIGltcG9ydGFudCB0aGF0IGl0J3Mgbm90IG92ZXIgQ1VSVkUuUFxuICogQHBhcmFtIHBvaW50cyBhcnJheSBvZiBMIGN1cnZlIHBvaW50c1xuICogQHJldHVybnMgZnVuY3Rpb24gd2hpY2ggbXVsdGlwbGllcyBwb2ludHMgd2l0aCBzY2FhcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZWNvbXB1dGVNU01VbnNhZmUoYywgZmllbGROLCBwb2ludHMsIHdpbmRvd1NpemUpIHtcbiAgICAvKipcbiAgICAgKiBQZXJmb3JtYW5jZSBBbmFseXNpcyBvZiBXaW5kb3ctYmFzZWQgUHJlY29tcHV0YXRpb25cbiAgICAgKlxuICAgICAqIEJhc2UgQ2FzZSAoMjU2LWJpdCBzY2FsYXIsIDgtYml0IHdpbmRvdyk6XG4gICAgICogLSBTdGFuZGFyZCBwcmVjb21wdXRhdGlvbiByZXF1aXJlczpcbiAgICAgKiAgIC0gMzEgYWRkaXRpb25zIHBlciBzY2FsYXIgw5cgMjU2IHNjYWxhcnMgPSA3LDkzNiBvcHNcbiAgICAgKiAgIC0gUGx1cyAyNTUgc3VtbWFyeSBhZGRpdGlvbnMgPSA4LDE5MSB0b3RhbCBvcHNcbiAgICAgKiAgIE5vdGU6IFN1bW1hcnkgYWRkaXRpb25zIGNhbiBiZSBvcHRpbWl6ZWQgdmlhIGFjY3VtdWxhdG9yXG4gICAgICpcbiAgICAgKiBDaHVua2VkIFByZWNvbXB1dGF0aW9uIEFuYWx5c2lzOlxuICAgICAqIC0gVXNpbmcgMzIgY2h1bmtzIHJlcXVpcmVzOlxuICAgICAqICAgLSAyNTUgYWRkaXRpb25zIHBlciBjaHVua1xuICAgICAqICAgLSAyNTYgZG91YmxpbmdzXG4gICAgICogICAtIFRvdGFsOiAoMjU1IMOXIDMyKSArIDI1NiA9IDgsNDE2IG9wc1xuICAgICAqXG4gICAgICogTWVtb3J5IFVzYWdlIENvbXBhcmlzb246XG4gICAgICogV2luZG93IFNpemUgfCBTdGFuZGFyZCBQb2ludHMgfCBDaHVua2VkIFBvaW50c1xuICAgICAqIC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS1cbiAgICAgKiAgICAgNC1iaXQgICB8ICAgICA1MjAgICAgICAgICB8ICAgICAgMTVcbiAgICAgKiAgICAgOC1iaXQgICB8ICAgIDQsMjI0ICAgICAgICB8ICAgICAyNTVcbiAgICAgKiAgICAxMC1iaXQgICB8ICAgMTMsODI0ICAgICAgICB8ICAgMSwwMjNcbiAgICAgKiAgICAxNi1iaXQgICB8ICA1NTcsMDU2ICAgICAgICB8ICA2NSw1MzVcbiAgICAgKlxuICAgICAqIEtleSBBZHZhbnRhZ2VzOlxuICAgICAqIDEuIEVuYWJsZXMgbGFyZ2VyIHdpbmRvdyBzaXplcyBkdWUgdG8gcmVkdWNlZCBtZW1vcnkgb3ZlcmhlYWRcbiAgICAgKiAyLiBNb3JlIGVmZmljaWVudCBmb3Igc21hbGxlciBzY2FsYXIgY291bnRzOlxuICAgICAqICAgIC0gMTYgY2h1bmtzOiAoMTYgw5cgMjU1KSArIDI1NiA9IDQsMzM2IG9wc1xuICAgICAqICAgIC0gfjJ4IGZhc3RlciB0aGFuIHN0YW5kYXJkIDgsMTkxIG9wc1xuICAgICAqXG4gICAgICogTGltaXRhdGlvbnM6XG4gICAgICogLSBOb3Qgc3VpdGFibGUgZm9yIHBsYWluIHByZWNvbXB1dGVzIChyZXF1aXJlcyAyNTYgY29uc3RhbnQgZG91YmxpbmdzKVxuICAgICAqIC0gUGVyZm9ybWFuY2UgZGVncmFkZXMgd2l0aCBsYXJnZXIgc2NhbGFyIGNvdW50czpcbiAgICAgKiAgIC0gT3B0aW1hbCBmb3IgfjI1NiBzY2FsYXJzXG4gICAgICogICAtIExlc3MgZWZmaWNpZW50IGZvciA0MDk2KyBzY2FsYXJzIChQaXBwZW5nZXIgcHJlZmVycmVkKVxuICAgICAqL1xuICAgIHZhbGlkYXRlVyh3aW5kb3dTaXplLCBmaWVsZE4uQklUUyk7XG4gICAgdmFsaWRhdGVNU01Qb2ludHMocG9pbnRzLCBjKTtcbiAgICBjb25zdCB6ZXJvID0gYy5aRVJPO1xuICAgIGNvbnN0IHRhYmxlU2l6ZSA9IDIgKiogd2luZG93U2l6ZSAtIDE7IC8vIHRhYmxlIHNpemUgKHdpdGhvdXQgemVybylcbiAgICBjb25zdCBjaHVua3MgPSBNYXRoLmNlaWwoZmllbGROLkJJVFMgLyB3aW5kb3dTaXplKTsgLy8gY2h1bmtzIG9mIGl0ZW1cbiAgICBjb25zdCBNQVNLID0gYml0TWFzayh3aW5kb3dTaXplKTtcbiAgICBjb25zdCB0YWJsZXMgPSBwb2ludHMubWFwKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgYWNjID0gcDsgaSA8IHRhYmxlU2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICByZXMucHVzaChhY2MpO1xuICAgICAgICAgICAgYWNjID0gYWNjLmFkZChwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH0pO1xuICAgIHJldHVybiAoc2NhbGFycykgPT4ge1xuICAgICAgICB2YWxpZGF0ZU1TTVNjYWxhcnMoc2NhbGFycywgZmllbGROKTtcbiAgICAgICAgaWYgKHNjYWxhcnMubGVuZ3RoID4gcG9pbnRzLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYXJyYXkgb2Ygc2NhbGFycyBtdXN0IGJlIHNtYWxsZXIgdGhhbiBhcnJheSBvZiBwb2ludHMnKTtcbiAgICAgICAgbGV0IHJlcyA9IHplcm87XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtzOyBpKyspIHtcbiAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZG91YmxlIGlmIGFjY3VtdWxhdG9yIGlzIHN0aWxsIHplcm8uXG4gICAgICAgICAgICBpZiAocmVzICE9PSB6ZXJvKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgd2luZG93U2l6ZTsgaisrKVxuICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMuZG91YmxlKCk7XG4gICAgICAgICAgICBjb25zdCBzaGlmdEJ5ID0gQmlnSW50KGNodW5rcyAqIHdpbmRvd1NpemUgLSAoaSArIDEpICogd2luZG93U2l6ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNjYWxhcnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuID0gc2NhbGFyc1tqXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyID0gTnVtYmVyKChuID4+IHNoaWZ0QnkpICYgTUFTSyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJyKVxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB6ZXJvIHNjYWxhcnMgY2h1bmtzXG4gICAgICAgICAgICAgICAgcmVzID0gcmVzLmFkZCh0YWJsZXNbal1bY3VyciAtIDFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH07XG59XG4vLyBUT0RPOiByZW1vdmVcbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQmFzaWMoY3VydmUpIHtcbiAgICB2YWxpZGF0ZUZpZWxkKGN1cnZlLkZwKTtcbiAgICB2YWxpZGF0ZU9iamVjdChjdXJ2ZSwge1xuICAgICAgICBuOiAnYmlnaW50JyxcbiAgICAgICAgaDogJ2JpZ2ludCcsXG4gICAgICAgIEd4OiAnZmllbGQnLFxuICAgICAgICBHeTogJ2ZpZWxkJyxcbiAgICB9LCB7XG4gICAgICAgIG5CaXRMZW5ndGg6ICdpc1NhZmVJbnRlZ2VyJyxcbiAgICAgICAgbkJ5dGVMZW5ndGg6ICdpc1NhZmVJbnRlZ2VyJyxcbiAgICB9KTtcbiAgICAvLyBTZXQgZGVmYXVsdHNcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIC4uLm5MZW5ndGgoY3VydmUubiwgY3VydmUubkJpdExlbmd0aCksXG4gICAgICAgIC4uLmN1cnZlLFxuICAgICAgICAuLi57IHA6IGN1cnZlLkZwLk9SREVSIH0sXG4gICAgfSk7XG59XG5mdW5jdGlvbiBjcmVhdGVGaWVsZChvcmRlciwgZmllbGQsIGlzTEUpIHtcbiAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgaWYgKGZpZWxkLk9SREVSICE9PSBvcmRlcilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmllbGQuT1JERVIgbXVzdCBtYXRjaCBvcmRlcjogRnAgPT0gcCwgRm4gPT0gbicpO1xuICAgICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIEZpZWxkKG9yZGVyLCB7IGlzTEUgfSk7XG4gICAgfVxufVxuLyoqIFZhbGlkYXRlcyBDVVJWRSBvcHRzIGFuZCBjcmVhdGVzIGZpZWxkcyAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9jcmVhdGVDdXJ2ZUZpZWxkcyh0eXBlLCBDVVJWRSwgY3VydmVPcHRzID0ge30sIEZwRm5MRSkge1xuICAgIGlmIChGcEZuTEUgPT09IHVuZGVmaW5lZClcbiAgICAgICAgRnBGbkxFID0gdHlwZSA9PT0gJ2Vkd2FyZHMnO1xuICAgIGlmICghQ1VSVkUgfHwgdHlwZW9mIENVUlZFICE9PSAnb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBleHBlY3RlZCB2YWxpZCAke3R5cGV9IENVUlZFIG9iamVjdGApO1xuICAgIGZvciAoY29uc3QgcCBvZiBbJ3AnLCAnbicsICdoJ10pIHtcbiAgICAgICAgY29uc3QgdmFsID0gQ1VSVkVbcF07XG4gICAgICAgIGlmICghKHR5cGVvZiB2YWwgPT09ICdiaWdpbnQnICYmIHZhbCA+IF8wbikpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENVUlZFLiR7cH0gbXVzdCBiZSBwb3NpdGl2ZSBiaWdpbnRgKTtcbiAgICB9XG4gICAgY29uc3QgRnAgPSBjcmVhdGVGaWVsZChDVVJWRS5wLCBjdXJ2ZU9wdHMuRnAsIEZwRm5MRSk7XG4gICAgY29uc3QgRm4gPSBjcmVhdGVGaWVsZChDVVJWRS5uLCBjdXJ2ZU9wdHMuRm4sIEZwRm5MRSk7XG4gICAgY29uc3QgX2IgPSB0eXBlID09PSAnd2VpZXJzdHJhc3MnID8gJ2InIDogJ2QnO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsnR3gnLCAnR3knLCAnYScsIF9iXTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgcGFyYW1zKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCFGcC5pc1ZhbGlkKENVUlZFW3BdKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ1VSVkUuJHtwfSBtdXN0IGJlIHZhbGlkIGZpZWxkIGVsZW1lbnQgb2YgQ1VSVkUuRnBgKTtcbiAgICB9XG4gICAgQ1VSVkUgPSBPYmplY3QuZnJlZXplKE9iamVjdC5hc3NpZ24oe30sIENVUlZFKSk7XG4gICAgcmV0dXJuIHsgQ1VSVkUsIEZwLCBGbiB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3VydmUuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/curve.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/edwards.js":
/*!************************************************************!*\
  !*** ./node_modules/@noble/curves/esm/abstract/edwards.js ***!
  \************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   PrimeEdwardsPoint: () => (/* binding */ PrimeEdwardsPoint),\n/* harmony export */   eddsa: () => (/* binding */ eddsa),\n/* harmony export */   edwards: () => (/* binding */ edwards),\n/* harmony export */   twistedEdwards: () => (/* binding */ twistedEdwards)\n/* harmony export */ });\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/* harmony import */ var _curve_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./curve.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/curve.js\");\n/* harmony import */ var _modular_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modular.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/modular.js\");\n/**\n * Twisted Edwards curve. The formula is: ax² + y² = 1 + dx²y².\n * For design rationale of types / exports, see weierstrass module documentation.\n * Untwisted Edwards curves exist, but they aren't used in real-world protocols.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _8n = BigInt(8);\nfunction isEdValidXY(Fp, CURVE, x, y) {\n    const x2 = Fp.sqr(x);\n    const y2 = Fp.sqr(y);\n    const left = Fp.add(Fp.mul(CURVE.a, x2), y2);\n    const right = Fp.add(Fp.ONE, Fp.mul(CURVE.d, Fp.mul(x2, y2)));\n    return Fp.eql(left, right);\n}\nfunction edwards(params, extraOpts = {}) {\n    const validated = (0,_curve_js__WEBPACK_IMPORTED_MODULE_0__._createCurveFields)('edwards', params, extraOpts, extraOpts.FpFnLE);\n    const { Fp, Fn } = validated;\n    let CURVE = validated.CURVE;\n    const { h: cofactor } = CURVE;\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__._validateObject)(extraOpts, {}, { uvRatio: 'function' });\n    // Important:\n    // There are some places where Fp.BYTES is used instead of nByteLength.\n    // So far, everything has been tested with curves of Fp.BYTES == nByteLength.\n    // TODO: test and find curves which behave otherwise.\n    const MASK = _2n << (BigInt(Fn.BYTES * 8) - _1n);\n    const modP = (n) => Fp.create(n); // Function overrides\n    // sqrt(u/v)\n    const uvRatio = extraOpts.uvRatio ||\n        ((u, v) => {\n            try {\n                return { isValid: true, value: Fp.sqrt(Fp.div(u, v)) };\n            }\n            catch (e) {\n                return { isValid: false, value: _0n };\n            }\n        });\n    // Validate whether the passed curve params are valid.\n    // equation ax² + y² = 1 + dx²y² should work for generator point.\n    if (!isEdValidXY(Fp, CURVE, CURVE.Gx, CURVE.Gy))\n        throw new Error('bad curve params: generator point');\n    /**\n     * Asserts coordinate is valid: 0 <= n < MASK.\n     * Coordinates >= Fp.ORDER are allowed for zip215.\n     */\n    function acoord(title, n, banZero = false) {\n        const min = banZero ? _1n : _0n;\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.aInRange)('coordinate ' + title, n, min, MASK);\n        return n;\n    }\n    function aextpoint(other) {\n        if (!(other instanceof Point))\n            throw new Error('ExtendedPoint expected');\n    }\n    // Converts Extended point to default (x, y) coordinates.\n    // Can accept precomputed Z^-1 - for example, from invertBatch.\n    const toAffineMemo = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.memoized)((p, iz) => {\n        const { X, Y, Z } = p;\n        const is0 = p.is0();\n        if (iz == null)\n            iz = is0 ? _8n : Fp.inv(Z); // 8 was chosen arbitrarily\n        const x = modP(X * iz);\n        const y = modP(Y * iz);\n        const zz = Fp.mul(Z, iz);\n        if (is0)\n            return { x: _0n, y: _1n };\n        if (zz !== _1n)\n            throw new Error('invZ was invalid');\n        return { x, y };\n    });\n    const assertValidMemo = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.memoized)((p) => {\n        const { a, d } = CURVE;\n        if (p.is0())\n            throw new Error('bad point: ZERO'); // TODO: optimize, with vars below?\n        // Equation in affine coordinates: ax² + y² = 1 + dx²y²\n        // Equation in projective coordinates (X/Z, Y/Z, Z):  (aX² + Y²)Z² = Z⁴ + dX²Y²\n        const { X, Y, Z, T } = p;\n        const X2 = modP(X * X); // X²\n        const Y2 = modP(Y * Y); // Y²\n        const Z2 = modP(Z * Z); // Z²\n        const Z4 = modP(Z2 * Z2); // Z⁴\n        const aX2 = modP(X2 * a); // aX²\n        const left = modP(Z2 * modP(aX2 + Y2)); // (aX² + Y²)Z²\n        const right = modP(Z4 + modP(d * modP(X2 * Y2))); // Z⁴ + dX²Y²\n        if (left !== right)\n            throw new Error('bad point: equation left != right (1)');\n        // In Extended coordinates we also have T, which is x*y=T/Z: check X*Y == Z*T\n        const XY = modP(X * Y);\n        const ZT = modP(Z * T);\n        if (XY !== ZT)\n            throw new Error('bad point: equation left != right (2)');\n        return true;\n    });\n    // Extended Point works in extended coordinates: (X, Y, Z, T) ∋ (x=X/Z, y=Y/Z, T=xy).\n    // https://en.wikipedia.org/wiki/Twisted_Edwards_curve#Extended_coordinates\n    class Point {\n        constructor(X, Y, Z, T) {\n            this.X = acoord('x', X);\n            this.Y = acoord('y', Y);\n            this.Z = acoord('z', Z, true);\n            this.T = acoord('t', T);\n            Object.freeze(this);\n        }\n        static CURVE() {\n            return CURVE;\n        }\n        static fromAffine(p) {\n            if (p instanceof Point)\n                throw new Error('extended point not allowed');\n            const { x, y } = p || {};\n            acoord('x', x);\n            acoord('y', y);\n            return new Point(x, y, _1n, modP(x * y));\n        }\n        // Uses algo from RFC8032 5.1.3.\n        static fromBytes(bytes, zip215 = false) {\n            const len = Fp.BYTES;\n            const { a, d } = CURVE;\n            bytes = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.copyBytes)((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__._abytes2)(bytes, len, 'point'));\n            (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__._abool2)(zip215, 'zip215');\n            const normed = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.copyBytes)(bytes); // copy again, we'll manipulate it\n            const lastByte = bytes[len - 1]; // select last byte\n            normed[len - 1] = lastByte & ~0x80; // clear last bit\n            const y = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.bytesToNumberLE)(normed);\n            // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.\n            // RFC8032 prohibits >= p, but ZIP215 doesn't\n            // zip215=true:  0 <= y < MASK (2^256 for ed25519)\n            // zip215=false: 0 <= y < P (2^255-19 for ed25519)\n            const max = zip215 ? MASK : Fp.ORDER;\n            (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.aInRange)('point.y', y, _0n, max);\n            // Ed25519: x² = (y²-1)/(dy²+1) mod p. Ed448: x² = (y²-1)/(dy²-1) mod p. Generic case:\n            // ax²+y²=1+dx²y² => y²-1=dx²y²-ax² => y²-1=x²(dy²-a) => x²=(y²-1)/(dy²-a)\n            const y2 = modP(y * y); // denominator is always non-0 mod p.\n            const u = modP(y2 - _1n); // u = y² - 1\n            const v = modP(d * y2 - a); // v = d y² + 1.\n            let { isValid, value: x } = uvRatio(u, v); // √(u/v)\n            if (!isValid)\n                throw new Error('bad point: invalid y coordinate');\n            const isXOdd = (x & _1n) === _1n; // There are 2 square roots. Use x_0 bit to select proper\n            const isLastByteOdd = (lastByte & 0x80) !== 0; // x_0, last bit\n            if (!zip215 && x === _0n && isLastByteOdd)\n                // if x=0 and x_0 = 1, fail\n                throw new Error('bad point: x=0 and x_0=1');\n            if (isLastByteOdd !== isXOdd)\n                x = modP(-x); // if x_0 != x mod 2, set x = p-x\n            return Point.fromAffine({ x, y });\n        }\n        static fromHex(bytes, zip215 = false) {\n            return Point.fromBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.ensureBytes)('point', bytes), zip215);\n        }\n        get x() {\n            return this.toAffine().x;\n        }\n        get y() {\n            return this.toAffine().y;\n        }\n        precompute(windowSize = 8, isLazy = true) {\n            wnaf.createCache(this, windowSize);\n            if (!isLazy)\n                this.multiply(_2n); // random number\n            return this;\n        }\n        // Useful in fromAffine() - not for fromBytes(), which always created valid points.\n        assertValidity() {\n            assertValidMemo(this);\n        }\n        // Compare one point to another.\n        equals(other) {\n            aextpoint(other);\n            const { X: X1, Y: Y1, Z: Z1 } = this;\n            const { X: X2, Y: Y2, Z: Z2 } = other;\n            const X1Z2 = modP(X1 * Z2);\n            const X2Z1 = modP(X2 * Z1);\n            const Y1Z2 = modP(Y1 * Z2);\n            const Y2Z1 = modP(Y2 * Z1);\n            return X1Z2 === X2Z1 && Y1Z2 === Y2Z1;\n        }\n        is0() {\n            return this.equals(Point.ZERO);\n        }\n        negate() {\n            // Flips point sign to a negative one (-x, y in affine coords)\n            return new Point(modP(-this.X), this.Y, this.Z, modP(-this.T));\n        }\n        // Fast algo for doubling Extended Point.\n        // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#doubling-dbl-2008-hwcd\n        // Cost: 4M + 4S + 1*a + 6add + 1*2.\n        double() {\n            const { a } = CURVE;\n            const { X: X1, Y: Y1, Z: Z1 } = this;\n            const A = modP(X1 * X1); // A = X12\n            const B = modP(Y1 * Y1); // B = Y12\n            const C = modP(_2n * modP(Z1 * Z1)); // C = 2*Z12\n            const D = modP(a * A); // D = a*A\n            const x1y1 = X1 + Y1;\n            const E = modP(modP(x1y1 * x1y1) - A - B); // E = (X1+Y1)2-A-B\n            const G = D + B; // G = D+B\n            const F = G - C; // F = G-C\n            const H = D - B; // H = D-B\n            const X3 = modP(E * F); // X3 = E*F\n            const Y3 = modP(G * H); // Y3 = G*H\n            const T3 = modP(E * H); // T3 = E*H\n            const Z3 = modP(F * G); // Z3 = F*G\n            return new Point(X3, Y3, Z3, T3);\n        }\n        // Fast algo for adding 2 Extended Points.\n        // https://hyperelliptic.org/EFD/g1p/auto-twisted-extended.html#addition-add-2008-hwcd\n        // Cost: 9M + 1*a + 1*d + 7add.\n        add(other) {\n            aextpoint(other);\n            const { a, d } = CURVE;\n            const { X: X1, Y: Y1, Z: Z1, T: T1 } = this;\n            const { X: X2, Y: Y2, Z: Z2, T: T2 } = other;\n            const A = modP(X1 * X2); // A = X1*X2\n            const B = modP(Y1 * Y2); // B = Y1*Y2\n            const C = modP(T1 * d * T2); // C = T1*d*T2\n            const D = modP(Z1 * Z2); // D = Z1*Z2\n            const E = modP((X1 + Y1) * (X2 + Y2) - A - B); // E = (X1+Y1)*(X2+Y2)-A-B\n            const F = D - C; // F = D-C\n            const G = D + C; // G = D+C\n            const H = modP(B - a * A); // H = B-a*A\n            const X3 = modP(E * F); // X3 = E*F\n            const Y3 = modP(G * H); // Y3 = G*H\n            const T3 = modP(E * H); // T3 = E*H\n            const Z3 = modP(F * G); // Z3 = F*G\n            return new Point(X3, Y3, Z3, T3);\n        }\n        subtract(other) {\n            return this.add(other.negate());\n        }\n        // Constant-time multiplication.\n        multiply(scalar) {\n            // 1 <= scalar < L\n            if (!Fn.isValidNot0(scalar))\n                throw new Error('invalid scalar: expected 1 <= sc < curve.n');\n            const { p, f } = wnaf.cached(this, scalar, (p) => (0,_curve_js__WEBPACK_IMPORTED_MODULE_0__.normalizeZ)(Point, p));\n            return (0,_curve_js__WEBPACK_IMPORTED_MODULE_0__.normalizeZ)(Point, [p, f])[0];\n        }\n        // Non-constant-time multiplication. Uses double-and-add algorithm.\n        // It's faster, but should only be used when you don't care about\n        // an exposed private key e.g. sig verification.\n        // Does NOT allow scalars higher than CURVE.n.\n        // Accepts optional accumulator to merge with multiply (important for sparse scalars)\n        multiplyUnsafe(scalar, acc = Point.ZERO) {\n            // 0 <= scalar < L\n            if (!Fn.isValid(scalar))\n                throw new Error('invalid scalar: expected 0 <= sc < curve.n');\n            if (scalar === _0n)\n                return Point.ZERO;\n            if (this.is0() || scalar === _1n)\n                return this;\n            return wnaf.unsafe(this, scalar, (p) => (0,_curve_js__WEBPACK_IMPORTED_MODULE_0__.normalizeZ)(Point, p), acc);\n        }\n        // Checks if point is of small order.\n        // If you add something to small order point, you will have \"dirty\"\n        // point with torsion component.\n        // Multiplies point by cofactor and checks if the result is 0.\n        isSmallOrder() {\n            return this.multiplyUnsafe(cofactor).is0();\n        }\n        // Multiplies point by curve order and checks if the result is 0.\n        // Returns `false` is the point is dirty.\n        isTorsionFree() {\n            return wnaf.unsafe(this, CURVE.n).is0();\n        }\n        // Converts Extended point to default (x, y) coordinates.\n        // Can accept precomputed Z^-1 - for example, from invertBatch.\n        toAffine(invertedZ) {\n            return toAffineMemo(this, invertedZ);\n        }\n        clearCofactor() {\n            if (cofactor === _1n)\n                return this;\n            return this.multiplyUnsafe(cofactor);\n        }\n        toBytes() {\n            const { x, y } = this.toAffine();\n            // Fp.toBytes() allows non-canonical encoding of y (>= p).\n            const bytes = Fp.toBytes(y);\n            // Each y has 2 valid points: (x, y), (x,-y).\n            // When compressing, it's enough to store y and use the last byte to encode sign of x\n            bytes[bytes.length - 1] |= x & _1n ? 0x80 : 0;\n            return bytes;\n        }\n        toHex() {\n            return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.bytesToHex)(this.toBytes());\n        }\n        toString() {\n            return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n        }\n        // TODO: remove\n        get ex() {\n            return this.X;\n        }\n        get ey() {\n            return this.Y;\n        }\n        get ez() {\n            return this.Z;\n        }\n        get et() {\n            return this.T;\n        }\n        static normalizeZ(points) {\n            return (0,_curve_js__WEBPACK_IMPORTED_MODULE_0__.normalizeZ)(Point, points);\n        }\n        static msm(points, scalars) {\n            return (0,_curve_js__WEBPACK_IMPORTED_MODULE_0__.pippenger)(Point, Fn, points, scalars);\n        }\n        _setWindowSize(windowSize) {\n            this.precompute(windowSize);\n        }\n        toRawBytes() {\n            return this.toBytes();\n        }\n    }\n    // base / generator point\n    Point.BASE = new Point(CURVE.Gx, CURVE.Gy, _1n, modP(CURVE.Gx * CURVE.Gy));\n    // zero / infinity / identity point\n    Point.ZERO = new Point(_0n, _1n, _1n, _0n); // 0, 1, 1, 0\n    // math field\n    Point.Fp = Fp;\n    // scalar field\n    Point.Fn = Fn;\n    const wnaf = new _curve_js__WEBPACK_IMPORTED_MODULE_0__.wNAF(Point, Fn.BITS);\n    Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n    return Point;\n}\n/**\n * Base class for prime-order points like Ristretto255 and Decaf448.\n * These points eliminate cofactor issues by representing equivalence classes\n * of Edwards curve points.\n */\nclass PrimeEdwardsPoint {\n    constructor(ep) {\n        this.ep = ep;\n    }\n    // Static methods that must be implemented by subclasses\n    static fromBytes(_bytes) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.notImplemented)();\n    }\n    static fromHex(_hex) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.notImplemented)();\n    }\n    get x() {\n        return this.toAffine().x;\n    }\n    get y() {\n        return this.toAffine().y;\n    }\n    // Common implementations\n    clearCofactor() {\n        // no-op for prime-order groups\n        return this;\n    }\n    assertValidity() {\n        this.ep.assertValidity();\n    }\n    toAffine(invertedZ) {\n        return this.ep.toAffine(invertedZ);\n    }\n    toHex() {\n        return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.bytesToHex)(this.toBytes());\n    }\n    toString() {\n        return this.toHex();\n    }\n    isTorsionFree() {\n        return true;\n    }\n    isSmallOrder() {\n        return false;\n    }\n    add(other) {\n        this.assertSame(other);\n        return this.init(this.ep.add(other.ep));\n    }\n    subtract(other) {\n        this.assertSame(other);\n        return this.init(this.ep.subtract(other.ep));\n    }\n    multiply(scalar) {\n        return this.init(this.ep.multiply(scalar));\n    }\n    multiplyUnsafe(scalar) {\n        return this.init(this.ep.multiplyUnsafe(scalar));\n    }\n    double() {\n        return this.init(this.ep.double());\n    }\n    negate() {\n        return this.init(this.ep.negate());\n    }\n    precompute(windowSize, isLazy) {\n        return this.init(this.ep.precompute(windowSize, isLazy));\n    }\n    /** @deprecated use `toBytes` */\n    toRawBytes() {\n        return this.toBytes();\n    }\n}\n/**\n * Initializes EdDSA signatures over given Edwards curve.\n */\nfunction eddsa(Point, cHash, eddsaOpts = {}) {\n    if (typeof cHash !== 'function')\n        throw new Error('\"hash\" function param is required');\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__._validateObject)(eddsaOpts, {}, {\n        adjustScalarBytes: 'function',\n        randomBytes: 'function',\n        domain: 'function',\n        prehash: 'function',\n        mapToCurve: 'function',\n    });\n    const { prehash } = eddsaOpts;\n    const { BASE, Fp, Fn } = Point;\n    const randomBytes = eddsaOpts.randomBytes || _utils_js__WEBPACK_IMPORTED_MODULE_2__.randomBytes;\n    const adjustScalarBytes = eddsaOpts.adjustScalarBytes || ((bytes) => bytes);\n    const domain = eddsaOpts.domain ||\n        ((data, ctx, phflag) => {\n            (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__._abool2)(phflag, 'phflag');\n            if (ctx.length || phflag)\n                throw new Error('Contexts/pre-hash are not supported');\n            return data;\n        }); // NOOP\n    // Little-endian SHA512 with modulo n\n    function modN_LE(hash) {\n        return Fn.create((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.bytesToNumberLE)(hash)); // Not Fn.fromBytes: it has length limit\n    }\n    // Get the hashed private scalar per RFC8032 5.1.5\n    function getPrivateScalar(key) {\n        const len = lengths.secretKey;\n        key = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.ensureBytes)('private key', key, len);\n        // Hash private key with curve's hash function to produce uniformingly random input\n        // Check byte lengths: ensure(64, h(ensure(32, key)))\n        const hashed = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.ensureBytes)('hashed private key', cHash(key), 2 * len);\n        const head = adjustScalarBytes(hashed.slice(0, len)); // clear first half bits, produce FE\n        const prefix = hashed.slice(len, 2 * len); // second half is called key prefix (5.1.6)\n        const scalar = modN_LE(head); // The actual private scalar\n        return { head, prefix, scalar };\n    }\n    /** Convenience method that creates public key from scalar. RFC8032 5.1.5 */\n    function getExtendedPublicKey(secretKey) {\n        const { head, prefix, scalar } = getPrivateScalar(secretKey);\n        const point = BASE.multiply(scalar); // Point on Edwards curve aka public key\n        const pointBytes = point.toBytes();\n        return { head, prefix, scalar, point, pointBytes };\n    }\n    /** Calculates EdDSA pub key. RFC8032 5.1.5. */\n    function getPublicKey(secretKey) {\n        return getExtendedPublicKey(secretKey).pointBytes;\n    }\n    // int('LE', SHA512(dom2(F, C) || msgs)) mod N\n    function hashDomainToScalar(context = Uint8Array.of(), ...msgs) {\n        const msg = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.concatBytes)(...msgs);\n        return modN_LE(cHash(domain(msg, (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.ensureBytes)('context', context), !!prehash)));\n    }\n    /** Signs message with privateKey. RFC8032 5.1.6 */\n    function sign(msg, secretKey, options = {}) {\n        msg = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.ensureBytes)('message', msg);\n        if (prehash)\n            msg = prehash(msg); // for ed25519ph etc.\n        const { prefix, scalar, pointBytes } = getExtendedPublicKey(secretKey);\n        const r = hashDomainToScalar(options.context, prefix, msg); // r = dom2(F, C) || prefix || PH(M)\n        const R = BASE.multiply(r).toBytes(); // R = rG\n        const k = hashDomainToScalar(options.context, R, pointBytes, msg); // R || A || PH(M)\n        const s = Fn.create(r + k * scalar); // S = (r + k * s) mod L\n        if (!Fn.isValid(s))\n            throw new Error('sign failed: invalid s'); // 0 <= s < L\n        const rs = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.concatBytes)(R, Fn.toBytes(s));\n        return (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__._abytes2)(rs, lengths.signature, 'result');\n    }\n    // verification rule is either zip215 or rfc8032 / nist186-5. Consult fromHex:\n    const verifyOpts = { zip215: true };\n    /**\n     * Verifies EdDSA signature against message and public key. RFC8032 5.1.7.\n     * An extended group equation is checked.\n     */\n    function verify(sig, msg, publicKey, options = verifyOpts) {\n        const { context, zip215 } = options;\n        const len = lengths.signature;\n        sig = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.ensureBytes)('signature', sig, len);\n        msg = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.ensureBytes)('message', msg);\n        publicKey = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.ensureBytes)('publicKey', publicKey, lengths.publicKey);\n        if (zip215 !== undefined)\n            (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__._abool2)(zip215, 'zip215');\n        if (prehash)\n            msg = prehash(msg); // for ed25519ph, etc\n        const mid = len / 2;\n        const r = sig.subarray(0, mid);\n        const s = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.bytesToNumberLE)(sig.subarray(mid, len));\n        let A, R, SB;\n        try {\n            // zip215=true is good for consensus-critical apps. =false follows RFC8032 / NIST186-5.\n            // zip215=true:  0 <= y < MASK (2^256 for ed25519)\n            // zip215=false: 0 <= y < P (2^255-19 for ed25519)\n            A = Point.fromBytes(publicKey, zip215);\n            R = Point.fromBytes(r, zip215);\n            SB = BASE.multiplyUnsafe(s); // 0 <= s < l is done inside\n        }\n        catch (error) {\n            return false;\n        }\n        if (!zip215 && A.isSmallOrder())\n            return false; // zip215 allows public keys of small order\n        const k = hashDomainToScalar(context, R.toBytes(), A.toBytes(), msg);\n        const RkA = R.add(A.multiplyUnsafe(k));\n        // Extended group equation\n        // [8][S]B = [8]R + [8][k]A'\n        return RkA.subtract(SB).clearCofactor().is0();\n    }\n    const _size = Fp.BYTES; // 32 for ed25519, 57 for ed448\n    const lengths = {\n        secretKey: _size,\n        publicKey: _size,\n        signature: 2 * _size,\n        seed: _size,\n    };\n    function randomSecretKey(seed = randomBytes(lengths.seed)) {\n        return (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__._abytes2)(seed, lengths.seed, 'seed');\n    }\n    function keygen(seed) {\n        const secretKey = utils.randomSecretKey(seed);\n        return { secretKey, publicKey: getPublicKey(secretKey) };\n    }\n    function isValidSecretKey(key) {\n        return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isBytes)(key) && key.length === Fn.BYTES;\n    }\n    function isValidPublicKey(key, zip215) {\n        try {\n            return !!Point.fromBytes(key, zip215);\n        }\n        catch (error) {\n            return false;\n        }\n    }\n    const utils = {\n        getExtendedPublicKey,\n        randomSecretKey,\n        isValidSecretKey,\n        isValidPublicKey,\n        /**\n         * Converts ed public key to x public key. Uses formula:\n         * - ed25519:\n         *   - `(u, v) = ((1+y)/(1-y), sqrt(-486664)*u/x)`\n         *   - `(x, y) = (sqrt(-486664)*u/v, (u-1)/(u+1))`\n         * - ed448:\n         *   - `(u, v) = ((y-1)/(y+1), sqrt(156324)*u/x)`\n         *   - `(x, y) = (sqrt(156324)*u/v, (1+u)/(1-u))`\n         */\n        toMontgomery(publicKey) {\n            const { y } = Point.fromBytes(publicKey);\n            const size = lengths.publicKey;\n            const is25519 = size === 32;\n            if (!is25519 && size !== 57)\n                throw new Error('only defined for 25519 and 448');\n            const u = is25519 ? Fp.div(_1n + y, _1n - y) : Fp.div(y - _1n, y + _1n);\n            return Fp.toBytes(u);\n        },\n        toMontgomerySecret(secretKey) {\n            const size = lengths.secretKey;\n            (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__._abytes2)(secretKey, size);\n            const hashed = cHash(secretKey.subarray(0, size));\n            return adjustScalarBytes(hashed).subarray(0, size);\n        },\n        /** @deprecated */\n        randomPrivateKey: randomSecretKey,\n        /** @deprecated */\n        precompute(windowSize = 8, point = Point.BASE) {\n            return point.precompute(windowSize, false);\n        },\n    };\n    return Object.freeze({\n        keygen,\n        getPublicKey,\n        sign,\n        verify,\n        utils,\n        Point,\n        lengths,\n    });\n}\nfunction _eddsa_legacy_opts_to_new(c) {\n    const CURVE = {\n        a: c.a,\n        d: c.d,\n        p: c.Fp.ORDER,\n        n: c.n,\n        h: c.h,\n        Gx: c.Gx,\n        Gy: c.Gy,\n    };\n    const Fp = c.Fp;\n    const Fn = (0,_modular_js__WEBPACK_IMPORTED_MODULE_3__.Field)(CURVE.n, c.nBitLength, true);\n    const curveOpts = { Fp, Fn, uvRatio: c.uvRatio };\n    const eddsaOpts = {\n        randomBytes: c.randomBytes,\n        adjustScalarBytes: c.adjustScalarBytes,\n        domain: c.domain,\n        prehash: c.prehash,\n        mapToCurve: c.mapToCurve,\n    };\n    return { CURVE, curveOpts, hash: c.hash, eddsaOpts };\n}\nfunction _eddsa_new_output_to_legacy(c, eddsa) {\n    const Point = eddsa.Point;\n    const legacy = Object.assign({}, eddsa, {\n        ExtendedPoint: Point,\n        CURVE: c,\n        nBitLength: Point.Fn.BITS,\n        nByteLength: Point.Fn.BYTES,\n    });\n    return legacy;\n}\n// TODO: remove. Use eddsa\nfunction twistedEdwards(c) {\n    const { CURVE, curveOpts, hash, eddsaOpts } = _eddsa_legacy_opts_to_new(c);\n    const Point = edwards(CURVE, curveOpts);\n    const EDDSA = eddsa(Point, hash, eddsaOpts);\n    return _eddsa_new_output_to_legacy(c, EDDSA);\n}\n//# sourceMappingURL=edwards.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC9lZHdhcmRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDbU87QUFDcko7QUFDekM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyx1Q0FBdUM7QUFDOUMsc0JBQXNCLDZEQUFrQjtBQUN4QyxZQUFZLFNBQVM7QUFDckI7QUFDQSxZQUFZLGNBQWM7QUFDMUIsSUFBSSwwREFBZSxjQUFjLElBQUkscUJBQXFCO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBLHlCQUF5QjtBQUN6QjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsbURBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixtREFBUTtBQUNqQyxnQkFBZ0IsVUFBVTtBQUMxQjtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsS0FBSztBQUNMLDRCQUE0QixtREFBUTtBQUNwQyxnQkFBZ0IsT0FBTztBQUN2QjtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0EsZ0JBQWdCLGFBQWE7QUFDN0IsZ0NBQWdDO0FBQ2hDLGdDQUFnQztBQUNoQyxnQ0FBZ0M7QUFDaEMsa0NBQWtDO0FBQ2xDLGtDQUFrQztBQUNsQyxnREFBZ0Q7QUFDaEQsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFD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Q0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrREFBSztBQUNwQix3QkFBd0I7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsWUFBWSxvQ0FBb0M7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC9lZHdhcmRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVHdpc3RlZCBFZHdhcmRzIGN1cnZlLiBUaGUgZm9ybXVsYSBpczogYXjCsiArIHnCsiA9IDEgKyBkeMKyecKyLlxuICogRm9yIGRlc2lnbiByYXRpb25hbGUgb2YgdHlwZXMgLyBleHBvcnRzLCBzZWUgd2VpZXJzdHJhc3MgbW9kdWxlIGRvY3VtZW50YXRpb24uXG4gKiBVbnR3aXN0ZWQgRWR3YXJkcyBjdXJ2ZXMgZXhpc3QsIGJ1dCB0aGV5IGFyZW4ndCB1c2VkIGluIHJlYWwtd29ybGQgcHJvdG9jb2xzLlxuICogQG1vZHVsZVxuICovXG4vKiEgbm9ibGUtY3VydmVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG5pbXBvcnQgeyBfdmFsaWRhdGVPYmplY3QsIF9hYm9vbDIgYXMgYWJvb2wsIF9hYnl0ZXMyIGFzIGFieXRlcywgYUluUmFuZ2UsIGJ5dGVzVG9IZXgsIGJ5dGVzVG9OdW1iZXJMRSwgY29uY2F0Qnl0ZXMsIGNvcHlCeXRlcywgZW5zdXJlQnl0ZXMsIGlzQnl0ZXMsIG1lbW9pemVkLCBub3RJbXBsZW1lbnRlZCwgcmFuZG9tQnl0ZXMgYXMgcmFuZG9tQnl0ZXNXZWIsIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG5pbXBvcnQgeyBfY3JlYXRlQ3VydmVGaWVsZHMsIG5vcm1hbGl6ZVosIHBpcHBlbmdlciwgd05BRiwgfSBmcm9tIFwiLi9jdXJ2ZS5qc1wiO1xuaW1wb3J0IHsgRmllbGQgfSBmcm9tIFwiLi9tb2R1bGFyLmpzXCI7XG4vLyBCZSBmcmllbmRseSB0byBiYWQgRUNNQVNjcmlwdCBwYXJzZXJzIGJ5IG5vdCB1c2luZyBiaWdpbnQgbGl0ZXJhbHNcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgXzBuID0gQmlnSW50KDApLCBfMW4gPSBCaWdJbnQoMSksIF8ybiA9IEJpZ0ludCgyKSwgXzhuID0gQmlnSW50KDgpO1xuZnVuY3Rpb24gaXNFZFZhbGlkWFkoRnAsIENVUlZFLCB4LCB5KSB7XG4gICAgY29uc3QgeDIgPSBGcC5zcXIoeCk7XG4gICAgY29uc3QgeTIgPSBGcC5zcXIoeSk7XG4gICAgY29uc3QgbGVmdCA9IEZwLmFkZChGcC5tdWwoQ1VSVkUuYSwgeDIpLCB5Mik7XG4gICAgY29uc3QgcmlnaHQgPSBGcC5hZGQoRnAuT05FLCBGcC5tdWwoQ1VSVkUuZCwgRnAubXVsKHgyLCB5MikpKTtcbiAgICByZXR1cm4gRnAuZXFsKGxlZnQsIHJpZ2h0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBlZHdhcmRzKHBhcmFtcywgZXh0cmFPcHRzID0ge30pIHtcbiAgICBjb25zdCB2YWxpZGF0ZWQgPSBfY3JlYXRlQ3VydmVGaWVsZHMoJ2Vkd2FyZHMnLCBwYXJhbXMsIGV4dHJhT3B0cywgZXh0cmFPcHRzLkZwRm5MRSk7XG4gICAgY29uc3QgeyBGcCwgRm4gfSA9IHZhbGlkYXRlZDtcbiAgICBsZXQgQ1VSVkUgPSB2YWxpZGF0ZWQuQ1VSVkU7XG4gICAgY29uc3QgeyBoOiBjb2ZhY3RvciB9ID0gQ1VSVkU7XG4gICAgX3ZhbGlkYXRlT2JqZWN0KGV4dHJhT3B0cywge30sIHsgdXZSYXRpbzogJ2Z1bmN0aW9uJyB9KTtcbiAgICAvLyBJbXBvcnRhbnQ6XG4gICAgLy8gVGhlcmUgYXJlIHNvbWUgcGxhY2VzIHdoZXJlIEZwLkJZVEVTIGlzIHVzZWQgaW5zdGVhZCBvZiBuQnl0ZUxlbmd0aC5cbiAgICAvLyBTbyBmYXIsIGV2ZXJ5dGhpbmcgaGFzIGJlZW4gdGVzdGVkIHdpdGggY3VydmVzIG9mIEZwLkJZVEVTID09IG5CeXRlTGVuZ3RoLlxuICAgIC8vIFRPRE86IHRlc3QgYW5kIGZpbmQgY3VydmVzIHdoaWNoIGJlaGF2ZSBvdGhlcndpc2UuXG4gICAgY29uc3QgTUFTSyA9IF8ybiA8PCAoQmlnSW50KEZuLkJZVEVTICogOCkgLSBfMW4pO1xuICAgIGNvbnN0IG1vZFAgPSAobikgPT4gRnAuY3JlYXRlKG4pOyAvLyBGdW5jdGlvbiBvdmVycmlkZXNcbiAgICAvLyBzcXJ0KHUvdilcbiAgICBjb25zdCB1dlJhdGlvID0gZXh0cmFPcHRzLnV2UmF0aW8gfHxcbiAgICAgICAgKCh1LCB2KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGlzVmFsaWQ6IHRydWUsIHZhbHVlOiBGcC5zcXJ0KEZwLmRpdih1LCB2KSkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogZmFsc2UsIHZhbHVlOiBfMG4gfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgLy8gVmFsaWRhdGUgd2hldGhlciB0aGUgcGFzc2VkIGN1cnZlIHBhcmFtcyBhcmUgdmFsaWQuXG4gICAgLy8gZXF1YXRpb24gYXjCsiArIHnCsiA9IDEgKyBkeMKyecKyIHNob3VsZCB3b3JrIGZvciBnZW5lcmF0b3IgcG9pbnQuXG4gICAgaWYgKCFpc0VkVmFsaWRYWShGcCwgQ1VSVkUsIENVUlZFLkd4LCBDVVJWRS5HeSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIGN1cnZlIHBhcmFtczogZ2VuZXJhdG9yIHBvaW50Jyk7XG4gICAgLyoqXG4gICAgICogQXNzZXJ0cyBjb29yZGluYXRlIGlzIHZhbGlkOiAwIDw9IG4gPCBNQVNLLlxuICAgICAqIENvb3JkaW5hdGVzID49IEZwLk9SREVSIGFyZSBhbGxvd2VkIGZvciB6aXAyMTUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWNvb3JkKHRpdGxlLCBuLCBiYW5aZXJvID0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgbWluID0gYmFuWmVybyA/IF8xbiA6IF8wbjtcbiAgICAgICAgYUluUmFuZ2UoJ2Nvb3JkaW5hdGUgJyArIHRpdGxlLCBuLCBtaW4sIE1BU0spO1xuICAgICAgICByZXR1cm4gbjtcbiAgICB9XG4gICAgZnVuY3Rpb24gYWV4dHBvaW50KG90aGVyKSB7XG4gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgUG9pbnQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHRlbmRlZFBvaW50IGV4cGVjdGVkJyk7XG4gICAgfVxuICAgIC8vIENvbnZlcnRzIEV4dGVuZGVkIHBvaW50IHRvIGRlZmF1bHQgKHgsIHkpIGNvb3JkaW5hdGVzLlxuICAgIC8vIENhbiBhY2NlcHQgcHJlY29tcHV0ZWQgWl4tMSAtIGZvciBleGFtcGxlLCBmcm9tIGludmVydEJhdGNoLlxuICAgIGNvbnN0IHRvQWZmaW5lTWVtbyA9IG1lbW9pemVkKChwLCBpeikgPT4ge1xuICAgICAgICBjb25zdCB7IFgsIFksIFogfSA9IHA7XG4gICAgICAgIGNvbnN0IGlzMCA9IHAuaXMwKCk7XG4gICAgICAgIGlmIChpeiA9PSBudWxsKVxuICAgICAgICAgICAgaXogPSBpczAgPyBfOG4gOiBGcC5pbnYoWik7IC8vIDggd2FzIGNob3NlbiBhcmJpdHJhcmlseVxuICAgICAgICBjb25zdCB4ID0gbW9kUChYICogaXopO1xuICAgICAgICBjb25zdCB5ID0gbW9kUChZICogaXopO1xuICAgICAgICBjb25zdCB6eiA9IEZwLm11bChaLCBpeik7XG4gICAgICAgIGlmIChpczApXG4gICAgICAgICAgICByZXR1cm4geyB4OiBfMG4sIHk6IF8xbiB9O1xuICAgICAgICBpZiAoenogIT09IF8xbilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52WiB3YXMgaW52YWxpZCcpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgfSk7XG4gICAgY29uc3QgYXNzZXJ0VmFsaWRNZW1vID0gbWVtb2l6ZWQoKHApID0+IHtcbiAgICAgICAgY29uc3QgeyBhLCBkIH0gPSBDVVJWRTtcbiAgICAgICAgaWYgKHAuaXMwKCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwb2ludDogWkVSTycpOyAvLyBUT0RPOiBvcHRpbWl6ZSwgd2l0aCB2YXJzIGJlbG93P1xuICAgICAgICAvLyBFcXVhdGlvbiBpbiBhZmZpbmUgY29vcmRpbmF0ZXM6IGF4wrIgKyB5wrIgPSAxICsgZHjCsnnCslxuICAgICAgICAvLyBFcXVhdGlvbiBpbiBwcm9qZWN0aXZlIGNvb3JkaW5hdGVzIChYL1osIFkvWiwgWik6ICAoYVjCsiArIFnCsilawrIgPSBa4oG0ICsgZFjCslnCslxuICAgICAgICBjb25zdCB7IFgsIFksIFosIFQgfSA9IHA7XG4gICAgICAgIGNvbnN0IFgyID0gbW9kUChYICogWCk7IC8vIFjCslxuICAgICAgICBjb25zdCBZMiA9IG1vZFAoWSAqIFkpOyAvLyBZwrJcbiAgICAgICAgY29uc3QgWjIgPSBtb2RQKFogKiBaKTsgLy8gWsKyXG4gICAgICAgIGNvbnN0IFo0ID0gbW9kUChaMiAqIFoyKTsgLy8gWuKBtFxuICAgICAgICBjb25zdCBhWDIgPSBtb2RQKFgyICogYSk7IC8vIGFYwrJcbiAgICAgICAgY29uc3QgbGVmdCA9IG1vZFAoWjIgKiBtb2RQKGFYMiArIFkyKSk7IC8vIChhWMKyICsgWcKyKVrCslxuICAgICAgICBjb25zdCByaWdodCA9IG1vZFAoWjQgKyBtb2RQKGQgKiBtb2RQKFgyICogWTIpKSk7IC8vIFrigbQgKyBkWMKyWcKyXG4gICAgICAgIGlmIChsZWZ0ICE9PSByaWdodClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIHBvaW50OiBlcXVhdGlvbiBsZWZ0ICE9IHJpZ2h0ICgxKScpO1xuICAgICAgICAvLyBJbiBFeHRlbmRlZCBjb29yZGluYXRlcyB3ZSBhbHNvIGhhdmUgVCwgd2hpY2ggaXMgeCp5PVQvWjogY2hlY2sgWCpZID09IFoqVFxuICAgICAgICBjb25zdCBYWSA9IG1vZFAoWCAqIFkpO1xuICAgICAgICBjb25zdCBaVCA9IG1vZFAoWiAqIFQpO1xuICAgICAgICBpZiAoWFkgIT09IFpUKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcG9pbnQ6IGVxdWF0aW9uIGxlZnQgIT0gcmlnaHQgKDIpJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIC8vIEV4dGVuZGVkIFBvaW50IHdvcmtzIGluIGV4dGVuZGVkIGNvb3JkaW5hdGVzOiAoWCwgWSwgWiwgVCkg4oiLICh4PVgvWiwgeT1ZL1osIFQ9eHkpLlxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1R3aXN0ZWRfRWR3YXJkc19jdXJ2ZSNFeHRlbmRlZF9jb29yZGluYXRlc1xuICAgIGNsYXNzIFBvaW50IHtcbiAgICAgICAgY29uc3RydWN0b3IoWCwgWSwgWiwgVCkge1xuICAgICAgICAgICAgdGhpcy5YID0gYWNvb3JkKCd4JywgWCk7XG4gICAgICAgICAgICB0aGlzLlkgPSBhY29vcmQoJ3knLCBZKTtcbiAgICAgICAgICAgIHRoaXMuWiA9IGFjb29yZCgneicsIFosIHRydWUpO1xuICAgICAgICAgICAgdGhpcy5UID0gYWNvb3JkKCd0JywgVCk7XG4gICAgICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBDVVJWRSgpIHtcbiAgICAgICAgICAgIHJldHVybiBDVVJWRTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZnJvbUFmZmluZShwKSB7XG4gICAgICAgICAgICBpZiAocCBpbnN0YW5jZW9mIFBvaW50KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXh0ZW5kZWQgcG9pbnQgbm90IGFsbG93ZWQnKTtcbiAgICAgICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gcCB8fCB7fTtcbiAgICAgICAgICAgIGFjb29yZCgneCcsIHgpO1xuICAgICAgICAgICAgYWNvb3JkKCd5JywgeSk7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KHgsIHksIF8xbiwgbW9kUCh4ICogeSkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzZXMgYWxnbyBmcm9tIFJGQzgwMzIgNS4xLjMuXG4gICAgICAgIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXMsIHppcDIxNSA9IGZhbHNlKSB7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBGcC5CWVRFUztcbiAgICAgICAgICAgIGNvbnN0IHsgYSwgZCB9ID0gQ1VSVkU7XG4gICAgICAgICAgICBieXRlcyA9IGNvcHlCeXRlcyhhYnl0ZXMoYnl0ZXMsIGxlbiwgJ3BvaW50JykpO1xuICAgICAgICAgICAgYWJvb2woemlwMjE1LCAnemlwMjE1Jyk7XG4gICAgICAgICAgICBjb25zdCBub3JtZWQgPSBjb3B5Qnl0ZXMoYnl0ZXMpOyAvLyBjb3B5IGFnYWluLCB3ZSdsbCBtYW5pcHVsYXRlIGl0XG4gICAgICAgICAgICBjb25zdCBsYXN0Qnl0ZSA9IGJ5dGVzW2xlbiAtIDFdOyAvLyBzZWxlY3QgbGFzdCBieXRlXG4gICAgICAgICAgICBub3JtZWRbbGVuIC0gMV0gPSBsYXN0Qnl0ZSAmIH4weDgwOyAvLyBjbGVhciBsYXN0IGJpdFxuICAgICAgICAgICAgY29uc3QgeSA9IGJ5dGVzVG9OdW1iZXJMRShub3JtZWQpO1xuICAgICAgICAgICAgLy8gemlwMjE1PXRydWUgaXMgZ29vZCBmb3IgY29uc2Vuc3VzLWNyaXRpY2FsIGFwcHMuID1mYWxzZSBmb2xsb3dzIFJGQzgwMzIgLyBOSVNUMTg2LTUuXG4gICAgICAgICAgICAvLyBSRkM4MDMyIHByb2hpYml0cyA+PSBwLCBidXQgWklQMjE1IGRvZXNuJ3RcbiAgICAgICAgICAgIC8vIHppcDIxNT10cnVlOiAgMCA8PSB5IDwgTUFTSyAoMl4yNTYgZm9yIGVkMjU1MTkpXG4gICAgICAgICAgICAvLyB6aXAyMTU9ZmFsc2U6IDAgPD0geSA8IFAgKDJeMjU1LTE5IGZvciBlZDI1NTE5KVxuICAgICAgICAgICAgY29uc3QgbWF4ID0gemlwMjE1ID8gTUFTSyA6IEZwLk9SREVSO1xuICAgICAgICAgICAgYUluUmFuZ2UoJ3BvaW50LnknLCB5LCBfMG4sIG1heCk7XG4gICAgICAgICAgICAvLyBFZDI1NTE5OiB4wrIgPSAoecKyLTEpLyhkecKyKzEpIG1vZCBwLiBFZDQ0ODogeMKyID0gKHnCsi0xKS8oZHnCsi0xKSBtb2QgcC4gR2VuZXJpYyBjYXNlOlxuICAgICAgICAgICAgLy8gYXjCsit5wrI9MStkeMKyecKyID0+IHnCsi0xPWR4wrJ5wrItYXjCsiA9PiB5wrItMT14wrIoZHnCsi1hKSA9PiB4wrI9KHnCsi0xKS8oZHnCsi1hKVxuICAgICAgICAgICAgY29uc3QgeTIgPSBtb2RQKHkgKiB5KTsgLy8gZGVub21pbmF0b3IgaXMgYWx3YXlzIG5vbi0wIG1vZCBwLlxuICAgICAgICAgICAgY29uc3QgdSA9IG1vZFAoeTIgLSBfMW4pOyAvLyB1ID0gecKyIC0gMVxuICAgICAgICAgICAgY29uc3QgdiA9IG1vZFAoZCAqIHkyIC0gYSk7IC8vIHYgPSBkIHnCsiArIDEuXG4gICAgICAgICAgICBsZXQgeyBpc1ZhbGlkLCB2YWx1ZTogeCB9ID0gdXZSYXRpbyh1LCB2KTsgLy8g4oiaKHUvdilcbiAgICAgICAgICAgIGlmICghaXNWYWxpZClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwb2ludDogaW52YWxpZCB5IGNvb3JkaW5hdGUnKTtcbiAgICAgICAgICAgIGNvbnN0IGlzWE9kZCA9ICh4ICYgXzFuKSA9PT0gXzFuOyAvLyBUaGVyZSBhcmUgMiBzcXVhcmUgcm9vdHMuIFVzZSB4XzAgYml0IHRvIHNlbGVjdCBwcm9wZXJcbiAgICAgICAgICAgIGNvbnN0IGlzTGFzdEJ5dGVPZGQgPSAobGFzdEJ5dGUgJiAweDgwKSAhPT0gMDsgLy8geF8wLCBsYXN0IGJpdFxuICAgICAgICAgICAgaWYgKCF6aXAyMTUgJiYgeCA9PT0gXzBuICYmIGlzTGFzdEJ5dGVPZGQpXG4gICAgICAgICAgICAgICAgLy8gaWYgeD0wIGFuZCB4XzAgPSAxLCBmYWlsXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcG9pbnQ6IHg9MCBhbmQgeF8wPTEnKTtcbiAgICAgICAgICAgIGlmIChpc0xhc3RCeXRlT2RkICE9PSBpc1hPZGQpXG4gICAgICAgICAgICAgICAgeCA9IG1vZFAoLXgpOyAvLyBpZiB4XzAgIT0geCBtb2QgMiwgc2V0IHggPSBwLXhcbiAgICAgICAgICAgIHJldHVybiBQb2ludC5mcm9tQWZmaW5lKHsgeCwgeSB9KTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZnJvbUhleChieXRlcywgemlwMjE1ID0gZmFsc2UpIHtcbiAgICAgICAgICAgIHJldHVybiBQb2ludC5mcm9tQnl0ZXMoZW5zdXJlQnl0ZXMoJ3BvaW50JywgYnl0ZXMpLCB6aXAyMTUpO1xuICAgICAgICB9XG4gICAgICAgIGdldCB4KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9BZmZpbmUoKS54O1xuICAgICAgICB9XG4gICAgICAgIGdldCB5KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9BZmZpbmUoKS55O1xuICAgICAgICB9XG4gICAgICAgIHByZWNvbXB1dGUod2luZG93U2l6ZSA9IDgsIGlzTGF6eSA9IHRydWUpIHtcbiAgICAgICAgICAgIHduYWYuY3JlYXRlQ2FjaGUodGhpcywgd2luZG93U2l6ZSk7XG4gICAgICAgICAgICBpZiAoIWlzTGF6eSlcbiAgICAgICAgICAgICAgICB0aGlzLm11bHRpcGx5KF8ybik7IC8vIHJhbmRvbSBudW1iZXJcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIC8vIFVzZWZ1bCBpbiBmcm9tQWZmaW5lKCkgLSBub3QgZm9yIGZyb21CeXRlcygpLCB3aGljaCBhbHdheXMgY3JlYXRlZCB2YWxpZCBwb2ludHMuXG4gICAgICAgIGFzc2VydFZhbGlkaXR5KCkge1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWRNZW1vKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbXBhcmUgb25lIHBvaW50IHRvIGFub3RoZXIuXG4gICAgICAgIGVxdWFscyhvdGhlcikge1xuICAgICAgICAgICAgYWV4dHBvaW50KG90aGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHsgWDogWDEsIFk6IFkxLCBaOiBaMSB9ID0gdGhpcztcbiAgICAgICAgICAgIGNvbnN0IHsgWDogWDIsIFk6IFkyLCBaOiBaMiB9ID0gb3RoZXI7XG4gICAgICAgICAgICBjb25zdCBYMVoyID0gbW9kUChYMSAqIFoyKTtcbiAgICAgICAgICAgIGNvbnN0IFgyWjEgPSBtb2RQKFgyICogWjEpO1xuICAgICAgICAgICAgY29uc3QgWTFaMiA9IG1vZFAoWTEgKiBaMik7XG4gICAgICAgICAgICBjb25zdCBZMloxID0gbW9kUChZMiAqIFoxKTtcbiAgICAgICAgICAgIHJldHVybiBYMVoyID09PSBYMloxICYmIFkxWjIgPT09IFkyWjE7XG4gICAgICAgIH1cbiAgICAgICAgaXMwKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKFBvaW50LlpFUk8pO1xuICAgICAgICB9XG4gICAgICAgIG5lZ2F0ZSgpIHtcbiAgICAgICAgICAgIC8vIEZsaXBzIHBvaW50IHNpZ24gdG8gYSBuZWdhdGl2ZSBvbmUgKC14LCB5IGluIGFmZmluZSBjb29yZHMpXG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KG1vZFAoLXRoaXMuWCksIHRoaXMuWSwgdGhpcy5aLCBtb2RQKC10aGlzLlQpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGYXN0IGFsZ28gZm9yIGRvdWJsaW5nIEV4dGVuZGVkIFBvaW50LlxuICAgICAgICAvLyBodHRwczovL2h5cGVyZWxsaXB0aWMub3JnL0VGRC9nMXAvYXV0by10d2lzdGVkLWV4dGVuZGVkLmh0bWwjZG91YmxpbmctZGJsLTIwMDgtaHdjZFxuICAgICAgICAvLyBDb3N0OiA0TSArIDRTICsgMSphICsgNmFkZCArIDEqMi5cbiAgICAgICAgZG91YmxlKCkge1xuICAgICAgICAgICAgY29uc3QgeyBhIH0gPSBDVVJWRTtcbiAgICAgICAgICAgIGNvbnN0IHsgWDogWDEsIFk6IFkxLCBaOiBaMSB9ID0gdGhpcztcbiAgICAgICAgICAgIGNvbnN0IEEgPSBtb2RQKFgxICogWDEpOyAvLyBBID0gWDEyXG4gICAgICAgICAgICBjb25zdCBCID0gbW9kUChZMSAqIFkxKTsgLy8gQiA9IFkxMlxuICAgICAgICAgICAgY29uc3QgQyA9IG1vZFAoXzJuICogbW9kUChaMSAqIFoxKSk7IC8vIEMgPSAyKloxMlxuICAgICAgICAgICAgY29uc3QgRCA9IG1vZFAoYSAqIEEpOyAvLyBEID0gYSpBXG4gICAgICAgICAgICBjb25zdCB4MXkxID0gWDEgKyBZMTtcbiAgICAgICAgICAgIGNvbnN0IEUgPSBtb2RQKG1vZFAoeDF5MSAqIHgxeTEpIC0gQSAtIEIpOyAvLyBFID0gKFgxK1kxKTItQS1CXG4gICAgICAgICAgICBjb25zdCBHID0gRCArIEI7IC8vIEcgPSBEK0JcbiAgICAgICAgICAgIGNvbnN0IEYgPSBHIC0gQzsgLy8gRiA9IEctQ1xuICAgICAgICAgICAgY29uc3QgSCA9IEQgLSBCOyAvLyBIID0gRC1CXG4gICAgICAgICAgICBjb25zdCBYMyA9IG1vZFAoRSAqIEYpOyAvLyBYMyA9IEUqRlxuICAgICAgICAgICAgY29uc3QgWTMgPSBtb2RQKEcgKiBIKTsgLy8gWTMgPSBHKkhcbiAgICAgICAgICAgIGNvbnN0IFQzID0gbW9kUChFICogSCk7IC8vIFQzID0gRSpIXG4gICAgICAgICAgICBjb25zdCBaMyA9IG1vZFAoRiAqIEcpOyAvLyBaMyA9IEYqR1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChYMywgWTMsIFozLCBUMyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFzdCBhbGdvIGZvciBhZGRpbmcgMiBFeHRlbmRlZCBQb2ludHMuXG4gICAgICAgIC8vIGh0dHBzOi8vaHlwZXJlbGxpcHRpYy5vcmcvRUZEL2cxcC9hdXRvLXR3aXN0ZWQtZXh0ZW5kZWQuaHRtbCNhZGRpdGlvbi1hZGQtMjAwOC1od2NkXG4gICAgICAgIC8vIENvc3Q6IDlNICsgMSphICsgMSpkICsgN2FkZC5cbiAgICAgICAgYWRkKG90aGVyKSB7XG4gICAgICAgICAgICBhZXh0cG9pbnQob3RoZXIpO1xuICAgICAgICAgICAgY29uc3QgeyBhLCBkIH0gPSBDVVJWRTtcbiAgICAgICAgICAgIGNvbnN0IHsgWDogWDEsIFk6IFkxLCBaOiBaMSwgVDogVDEgfSA9IHRoaXM7XG4gICAgICAgICAgICBjb25zdCB7IFg6IFgyLCBZOiBZMiwgWjogWjIsIFQ6IFQyIH0gPSBvdGhlcjtcbiAgICAgICAgICAgIGNvbnN0IEEgPSBtb2RQKFgxICogWDIpOyAvLyBBID0gWDEqWDJcbiAgICAgICAgICAgIGNvbnN0IEIgPSBtb2RQKFkxICogWTIpOyAvLyBCID0gWTEqWTJcbiAgICAgICAgICAgIGNvbnN0IEMgPSBtb2RQKFQxICogZCAqIFQyKTsgLy8gQyA9IFQxKmQqVDJcbiAgICAgICAgICAgIGNvbnN0IEQgPSBtb2RQKFoxICogWjIpOyAvLyBEID0gWjEqWjJcbiAgICAgICAgICAgIGNvbnN0IEUgPSBtb2RQKChYMSArIFkxKSAqIChYMiArIFkyKSAtIEEgLSBCKTsgLy8gRSA9IChYMStZMSkqKFgyK1kyKS1BLUJcbiAgICAgICAgICAgIGNvbnN0IEYgPSBEIC0gQzsgLy8gRiA9IEQtQ1xuICAgICAgICAgICAgY29uc3QgRyA9IEQgKyBDOyAvLyBHID0gRCtDXG4gICAgICAgICAgICBjb25zdCBIID0gbW9kUChCIC0gYSAqIEEpOyAvLyBIID0gQi1hKkFcbiAgICAgICAgICAgIGNvbnN0IFgzID0gbW9kUChFICogRik7IC8vIFgzID0gRSpGXG4gICAgICAgICAgICBjb25zdCBZMyA9IG1vZFAoRyAqIEgpOyAvLyBZMyA9IEcqSFxuICAgICAgICAgICAgY29uc3QgVDMgPSBtb2RQKEUgKiBIKTsgLy8gVDMgPSBFKkhcbiAgICAgICAgICAgIGNvbnN0IFozID0gbW9kUChGICogRyk7IC8vIFozID0gRipHXG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KFgzLCBZMywgWjMsIFQzKTtcbiAgICAgICAgfVxuICAgICAgICBzdWJ0cmFjdChvdGhlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKG90aGVyLm5lZ2F0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb25zdGFudC10aW1lIG11bHRpcGxpY2F0aW9uLlxuICAgICAgICBtdWx0aXBseShzY2FsYXIpIHtcbiAgICAgICAgICAgIC8vIDEgPD0gc2NhbGFyIDwgTFxuICAgICAgICAgICAgaWYgKCFGbi5pc1ZhbGlkTm90MChzY2FsYXIpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzY2FsYXI6IGV4cGVjdGVkIDEgPD0gc2MgPCBjdXJ2ZS5uJyk7XG4gICAgICAgICAgICBjb25zdCB7IHAsIGYgfSA9IHduYWYuY2FjaGVkKHRoaXMsIHNjYWxhciwgKHApID0+IG5vcm1hbGl6ZVooUG9pbnQsIHApKTtcbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVaKFBvaW50LCBbcCwgZl0pWzBdO1xuICAgICAgICB9XG4gICAgICAgIC8vIE5vbi1jb25zdGFudC10aW1lIG11bHRpcGxpY2F0aW9uLiBVc2VzIGRvdWJsZS1hbmQtYWRkIGFsZ29yaXRobS5cbiAgICAgICAgLy8gSXQncyBmYXN0ZXIsIGJ1dCBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4geW91IGRvbid0IGNhcmUgYWJvdXRcbiAgICAgICAgLy8gYW4gZXhwb3NlZCBwcml2YXRlIGtleSBlLmcuIHNpZyB2ZXJpZmljYXRpb24uXG4gICAgICAgIC8vIERvZXMgTk9UIGFsbG93IHNjYWxhcnMgaGlnaGVyIHRoYW4gQ1VSVkUubi5cbiAgICAgICAgLy8gQWNjZXB0cyBvcHRpb25hbCBhY2N1bXVsYXRvciB0byBtZXJnZSB3aXRoIG11bHRpcGx5IChpbXBvcnRhbnQgZm9yIHNwYXJzZSBzY2FsYXJzKVxuICAgICAgICBtdWx0aXBseVVuc2FmZShzY2FsYXIsIGFjYyA9IFBvaW50LlpFUk8pIHtcbiAgICAgICAgICAgIC8vIDAgPD0gc2NhbGFyIDwgTFxuICAgICAgICAgICAgaWYgKCFGbi5pc1ZhbGlkKHNjYWxhcikpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNjYWxhcjogZXhwZWN0ZWQgMCA8PSBzYyA8IGN1cnZlLm4nKTtcbiAgICAgICAgICAgIGlmIChzY2FsYXIgPT09IF8wbilcbiAgICAgICAgICAgICAgICByZXR1cm4gUG9pbnQuWkVSTztcbiAgICAgICAgICAgIGlmICh0aGlzLmlzMCgpIHx8IHNjYWxhciA9PT0gXzFuKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHduYWYudW5zYWZlKHRoaXMsIHNjYWxhciwgKHApID0+IG5vcm1hbGl6ZVooUG9pbnQsIHApLCBhY2MpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrcyBpZiBwb2ludCBpcyBvZiBzbWFsbCBvcmRlci5cbiAgICAgICAgLy8gSWYgeW91IGFkZCBzb21ldGhpbmcgdG8gc21hbGwgb3JkZXIgcG9pbnQsIHlvdSB3aWxsIGhhdmUgXCJkaXJ0eVwiXG4gICAgICAgIC8vIHBvaW50IHdpdGggdG9yc2lvbiBjb21wb25lbnQuXG4gICAgICAgIC8vIE11bHRpcGxpZXMgcG9pbnQgYnkgY29mYWN0b3IgYW5kIGNoZWNrcyBpZiB0aGUgcmVzdWx0IGlzIDAuXG4gICAgICAgIGlzU21hbGxPcmRlcigpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm11bHRpcGx5VW5zYWZlKGNvZmFjdG9yKS5pczAoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBNdWx0aXBsaWVzIHBvaW50IGJ5IGN1cnZlIG9yZGVyIGFuZCBjaGVja3MgaWYgdGhlIHJlc3VsdCBpcyAwLlxuICAgICAgICAvLyBSZXR1cm5zIGBmYWxzZWAgaXMgdGhlIHBvaW50IGlzIGRpcnR5LlxuICAgICAgICBpc1RvcnNpb25GcmVlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHduYWYudW5zYWZlKHRoaXMsIENVUlZFLm4pLmlzMCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbnZlcnRzIEV4dGVuZGVkIHBvaW50IHRvIGRlZmF1bHQgKHgsIHkpIGNvb3JkaW5hdGVzLlxuICAgICAgICAvLyBDYW4gYWNjZXB0IHByZWNvbXB1dGVkIFpeLTEgLSBmb3IgZXhhbXBsZSwgZnJvbSBpbnZlcnRCYXRjaC5cbiAgICAgICAgdG9BZmZpbmUoaW52ZXJ0ZWRaKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9BZmZpbmVNZW1vKHRoaXMsIGludmVydGVkWik7XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJDb2ZhY3RvcigpIHtcbiAgICAgICAgICAgIGlmIChjb2ZhY3RvciA9PT0gXzFuKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlVbnNhZmUoY29mYWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIHRvQnl0ZXMoKSB7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMudG9BZmZpbmUoKTtcbiAgICAgICAgICAgIC8vIEZwLnRvQnl0ZXMoKSBhbGxvd3Mgbm9uLWNhbm9uaWNhbCBlbmNvZGluZyBvZiB5ICg+PSBwKS5cbiAgICAgICAgICAgIGNvbnN0IGJ5dGVzID0gRnAudG9CeXRlcyh5KTtcbiAgICAgICAgICAgIC8vIEVhY2ggeSBoYXMgMiB2YWxpZCBwb2ludHM6ICh4LCB5KSwgKHgsLXkpLlxuICAgICAgICAgICAgLy8gV2hlbiBjb21wcmVzc2luZywgaXQncyBlbm91Z2ggdG8gc3RvcmUgeSBhbmQgdXNlIHRoZSBsYXN0IGJ5dGUgdG8gZW5jb2RlIHNpZ24gb2YgeFxuICAgICAgICAgICAgYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gMV0gfD0geCAmIF8xbiA/IDB4ODAgOiAwO1xuICAgICAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgICAgICB9XG4gICAgICAgIHRvSGV4KCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ5dGVzVG9IZXgodGhpcy50b0J5dGVzKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRvU3RyaW5nKCkge1xuICAgICAgICAgICAgcmV0dXJuIGA8UG9pbnQgJHt0aGlzLmlzMCgpID8gJ1pFUk8nIDogdGhpcy50b0hleCgpfT5gO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE86IHJlbW92ZVxuICAgICAgICBnZXQgZXgoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5YO1xuICAgICAgICB9XG4gICAgICAgIGdldCBleSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IGV6KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuWjtcbiAgICAgICAgfVxuICAgICAgICBnZXQgZXQoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5UO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBub3JtYWxpemVaKHBvaW50cykge1xuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZVooUG9pbnQsIHBvaW50cyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIG1zbShwb2ludHMsIHNjYWxhcnMpIHtcbiAgICAgICAgICAgIHJldHVybiBwaXBwZW5nZXIoUG9pbnQsIEZuLCBwb2ludHMsIHNjYWxhcnMpO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRXaW5kb3dTaXplKHdpbmRvd1NpemUpIHtcbiAgICAgICAgICAgIHRoaXMucHJlY29tcHV0ZSh3aW5kb3dTaXplKTtcbiAgICAgICAgfVxuICAgICAgICB0b1Jhd0J5dGVzKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9CeXRlcygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGJhc2UgLyBnZW5lcmF0b3IgcG9pbnRcbiAgICBQb2ludC5CQVNFID0gbmV3IFBvaW50KENVUlZFLkd4LCBDVVJWRS5HeSwgXzFuLCBtb2RQKENVUlZFLkd4ICogQ1VSVkUuR3kpKTtcbiAgICAvLyB6ZXJvIC8gaW5maW5pdHkgLyBpZGVudGl0eSBwb2ludFxuICAgIFBvaW50LlpFUk8gPSBuZXcgUG9pbnQoXzBuLCBfMW4sIF8xbiwgXzBuKTsgLy8gMCwgMSwgMSwgMFxuICAgIC8vIG1hdGggZmllbGRcbiAgICBQb2ludC5GcCA9IEZwO1xuICAgIC8vIHNjYWxhciBmaWVsZFxuICAgIFBvaW50LkZuID0gRm47XG4gICAgY29uc3Qgd25hZiA9IG5ldyB3TkFGKFBvaW50LCBGbi5CSVRTKTtcbiAgICBQb2ludC5CQVNFLnByZWNvbXB1dGUoOCk7IC8vIEVuYWJsZSBwcmVjb21wdXRlcy4gU2xvd3MgZG93biBmaXJzdCBwdWJsaWNLZXkgY29tcHV0YXRpb24gYnkgMjBtcy5cbiAgICByZXR1cm4gUG9pbnQ7XG59XG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIHByaW1lLW9yZGVyIHBvaW50cyBsaWtlIFJpc3RyZXR0bzI1NSBhbmQgRGVjYWY0NDguXG4gKiBUaGVzZSBwb2ludHMgZWxpbWluYXRlIGNvZmFjdG9yIGlzc3VlcyBieSByZXByZXNlbnRpbmcgZXF1aXZhbGVuY2UgY2xhc3Nlc1xuICogb2YgRWR3YXJkcyBjdXJ2ZSBwb2ludHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcmltZUVkd2FyZHNQb2ludCB7XG4gICAgY29uc3RydWN0b3IoZXApIHtcbiAgICAgICAgdGhpcy5lcCA9IGVwO1xuICAgIH1cbiAgICAvLyBTdGF0aWMgbWV0aG9kcyB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlc1xuICAgIHN0YXRpYyBmcm9tQnl0ZXMoX2J5dGVzKSB7XG4gICAgICAgIG5vdEltcGxlbWVudGVkKCk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tSGV4KF9oZXgpIHtcbiAgICAgICAgbm90SW1wbGVtZW50ZWQoKTtcbiAgICB9XG4gICAgZ2V0IHgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvQWZmaW5lKCkueDtcbiAgICB9XG4gICAgZ2V0IHkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvQWZmaW5lKCkueTtcbiAgICB9XG4gICAgLy8gQ29tbW9uIGltcGxlbWVudGF0aW9uc1xuICAgIGNsZWFyQ29mYWN0b3IoKSB7XG4gICAgICAgIC8vIG5vLW9wIGZvciBwcmltZS1vcmRlciBncm91cHNcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFzc2VydFZhbGlkaXR5KCkge1xuICAgICAgICB0aGlzLmVwLmFzc2VydFZhbGlkaXR5KCk7XG4gICAgfVxuICAgIHRvQWZmaW5lKGludmVydGVkWikge1xuICAgICAgICByZXR1cm4gdGhpcy5lcC50b0FmZmluZShpbnZlcnRlZFopO1xuICAgIH1cbiAgICB0b0hleCgpIHtcbiAgICAgICAgcmV0dXJuIGJ5dGVzVG9IZXgodGhpcy50b0J5dGVzKCkpO1xuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9IZXgoKTtcbiAgICB9XG4gICAgaXNUb3JzaW9uRnJlZSgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlzU21hbGxPcmRlcigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBhZGQob3RoZXIpIHtcbiAgICAgICAgdGhpcy5hc3NlcnRTYW1lKG90aGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5pdCh0aGlzLmVwLmFkZChvdGhlci5lcCkpO1xuICAgIH1cbiAgICBzdWJ0cmFjdChvdGhlcikge1xuICAgICAgICB0aGlzLmFzc2VydFNhbWUob3RoZXIpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbml0KHRoaXMuZXAuc3VidHJhY3Qob3RoZXIuZXApKTtcbiAgICB9XG4gICAgbXVsdGlwbHkoc2NhbGFyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluaXQodGhpcy5lcC5tdWx0aXBseShzY2FsYXIpKTtcbiAgICB9XG4gICAgbXVsdGlwbHlVbnNhZmUoc2NhbGFyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluaXQodGhpcy5lcC5tdWx0aXBseVVuc2FmZShzY2FsYXIpKTtcbiAgICB9XG4gICAgZG91YmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbml0KHRoaXMuZXAuZG91YmxlKCkpO1xuICAgIH1cbiAgICBuZWdhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluaXQodGhpcy5lcC5uZWdhdGUoKSk7XG4gICAgfVxuICAgIHByZWNvbXB1dGUod2luZG93U2l6ZSwgaXNMYXp5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmluaXQodGhpcy5lcC5wcmVjb21wdXRlKHdpbmRvd1NpemUsIGlzTGF6eSkpO1xuICAgIH1cbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIGB0b0J5dGVzYCAqL1xuICAgIHRvUmF3Qnl0ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvQnl0ZXMoKTtcbiAgICB9XG59XG4vKipcbiAqIEluaXRpYWxpemVzIEVkRFNBIHNpZ25hdHVyZXMgb3ZlciBnaXZlbiBFZHdhcmRzIGN1cnZlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWRkc2EoUG9pbnQsIGNIYXNoLCBlZGRzYU9wdHMgPSB7fSkge1xuICAgIGlmICh0eXBlb2YgY0hhc2ggIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignXCJoYXNoXCIgZnVuY3Rpb24gcGFyYW0gaXMgcmVxdWlyZWQnKTtcbiAgICBfdmFsaWRhdGVPYmplY3QoZWRkc2FPcHRzLCB7fSwge1xuICAgICAgICBhZGp1c3RTY2FsYXJCeXRlczogJ2Z1bmN0aW9uJyxcbiAgICAgICAgcmFuZG9tQnl0ZXM6ICdmdW5jdGlvbicsXG4gICAgICAgIGRvbWFpbjogJ2Z1bmN0aW9uJyxcbiAgICAgICAgcHJlaGFzaDogJ2Z1bmN0aW9uJyxcbiAgICAgICAgbWFwVG9DdXJ2ZTogJ2Z1bmN0aW9uJyxcbiAgICB9KTtcbiAgICBjb25zdCB7IHByZWhhc2ggfSA9IGVkZHNhT3B0cztcbiAgICBjb25zdCB7IEJBU0UsIEZwLCBGbiB9ID0gUG9pbnQ7XG4gICAgY29uc3QgcmFuZG9tQnl0ZXMgPSBlZGRzYU9wdHMucmFuZG9tQnl0ZXMgfHwgcmFuZG9tQnl0ZXNXZWI7XG4gICAgY29uc3QgYWRqdXN0U2NhbGFyQnl0ZXMgPSBlZGRzYU9wdHMuYWRqdXN0U2NhbGFyQnl0ZXMgfHwgKChieXRlcykgPT4gYnl0ZXMpO1xuICAgIGNvbnN0IGRvbWFpbiA9IGVkZHNhT3B0cy5kb21haW4gfHxcbiAgICAgICAgKChkYXRhLCBjdHgsIHBoZmxhZykgPT4ge1xuICAgICAgICAgICAgYWJvb2wocGhmbGFnLCAncGhmbGFnJyk7XG4gICAgICAgICAgICBpZiAoY3R4Lmxlbmd0aCB8fCBwaGZsYWcpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0cy9wcmUtaGFzaCBhcmUgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0pOyAvLyBOT09QXG4gICAgLy8gTGl0dGxlLWVuZGlhbiBTSEE1MTIgd2l0aCBtb2R1bG8gblxuICAgIGZ1bmN0aW9uIG1vZE5fTEUoaGFzaCkge1xuICAgICAgICByZXR1cm4gRm4uY3JlYXRlKGJ5dGVzVG9OdW1iZXJMRShoYXNoKSk7IC8vIE5vdCBGbi5mcm9tQnl0ZXM6IGl0IGhhcyBsZW5ndGggbGltaXRcbiAgICB9XG4gICAgLy8gR2V0IHRoZSBoYXNoZWQgcHJpdmF0ZSBzY2FsYXIgcGVyIFJGQzgwMzIgNS4xLjVcbiAgICBmdW5jdGlvbiBnZXRQcml2YXRlU2NhbGFyKGtleSkge1xuICAgICAgICBjb25zdCBsZW4gPSBsZW5ndGhzLnNlY3JldEtleTtcbiAgICAgICAga2V5ID0gZW5zdXJlQnl0ZXMoJ3ByaXZhdGUga2V5Jywga2V5LCBsZW4pO1xuICAgICAgICAvLyBIYXNoIHByaXZhdGUga2V5IHdpdGggY3VydmUncyBoYXNoIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdW5pZm9ybWluZ2x5IHJhbmRvbSBpbnB1dFxuICAgICAgICAvLyBDaGVjayBieXRlIGxlbmd0aHM6IGVuc3VyZSg2NCwgaChlbnN1cmUoMzIsIGtleSkpKVxuICAgICAgICBjb25zdCBoYXNoZWQgPSBlbnN1cmVCeXRlcygnaGFzaGVkIHByaXZhdGUga2V5JywgY0hhc2goa2V5KSwgMiAqIGxlbik7XG4gICAgICAgIGNvbnN0IGhlYWQgPSBhZGp1c3RTY2FsYXJCeXRlcyhoYXNoZWQuc2xpY2UoMCwgbGVuKSk7IC8vIGNsZWFyIGZpcnN0IGhhbGYgYml0cywgcHJvZHVjZSBGRVxuICAgICAgICBjb25zdCBwcmVmaXggPSBoYXNoZWQuc2xpY2UobGVuLCAyICogbGVuKTsgLy8gc2Vjb25kIGhhbGYgaXMgY2FsbGVkIGtleSBwcmVmaXggKDUuMS42KVxuICAgICAgICBjb25zdCBzY2FsYXIgPSBtb2ROX0xFKGhlYWQpOyAvLyBUaGUgYWN0dWFsIHByaXZhdGUgc2NhbGFyXG4gICAgICAgIHJldHVybiB7IGhlYWQsIHByZWZpeCwgc2NhbGFyIH07XG4gICAgfVxuICAgIC8qKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCBjcmVhdGVzIHB1YmxpYyBrZXkgZnJvbSBzY2FsYXIuIFJGQzgwMzIgNS4xLjUgKi9cbiAgICBmdW5jdGlvbiBnZXRFeHRlbmRlZFB1YmxpY0tleShzZWNyZXRLZXkpIHtcbiAgICAgICAgY29uc3QgeyBoZWFkLCBwcmVmaXgsIHNjYWxhciB9ID0gZ2V0UHJpdmF0ZVNjYWxhcihzZWNyZXRLZXkpO1xuICAgICAgICBjb25zdCBwb2ludCA9IEJBU0UubXVsdGlwbHkoc2NhbGFyKTsgLy8gUG9pbnQgb24gRWR3YXJkcyBjdXJ2ZSBha2EgcHVibGljIGtleVxuICAgICAgICBjb25zdCBwb2ludEJ5dGVzID0gcG9pbnQudG9CeXRlcygpO1xuICAgICAgICByZXR1cm4geyBoZWFkLCBwcmVmaXgsIHNjYWxhciwgcG9pbnQsIHBvaW50Qnl0ZXMgfTtcbiAgICB9XG4gICAgLyoqIENhbGN1bGF0ZXMgRWREU0EgcHViIGtleS4gUkZDODAzMiA1LjEuNS4gKi9cbiAgICBmdW5jdGlvbiBnZXRQdWJsaWNLZXkoc2VjcmV0S2V5KSB7XG4gICAgICAgIHJldHVybiBnZXRFeHRlbmRlZFB1YmxpY0tleShzZWNyZXRLZXkpLnBvaW50Qnl0ZXM7XG4gICAgfVxuICAgIC8vIGludCgnTEUnLCBTSEE1MTIoZG9tMihGLCBDKSB8fCBtc2dzKSkgbW9kIE5cbiAgICBmdW5jdGlvbiBoYXNoRG9tYWluVG9TY2FsYXIoY29udGV4dCA9IFVpbnQ4QXJyYXkub2YoKSwgLi4ubXNncykge1xuICAgICAgICBjb25zdCBtc2cgPSBjb25jYXRCeXRlcyguLi5tc2dzKTtcbiAgICAgICAgcmV0dXJuIG1vZE5fTEUoY0hhc2goZG9tYWluKG1zZywgZW5zdXJlQnl0ZXMoJ2NvbnRleHQnLCBjb250ZXh0KSwgISFwcmVoYXNoKSkpO1xuICAgIH1cbiAgICAvKiogU2lnbnMgbWVzc2FnZSB3aXRoIHByaXZhdGVLZXkuIFJGQzgwMzIgNS4xLjYgKi9cbiAgICBmdW5jdGlvbiBzaWduKG1zZywgc2VjcmV0S2V5LCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgbXNnID0gZW5zdXJlQnl0ZXMoJ21lc3NhZ2UnLCBtc2cpO1xuICAgICAgICBpZiAocHJlaGFzaClcbiAgICAgICAgICAgIG1zZyA9IHByZWhhc2gobXNnKTsgLy8gZm9yIGVkMjU1MTlwaCBldGMuXG4gICAgICAgIGNvbnN0IHsgcHJlZml4LCBzY2FsYXIsIHBvaW50Qnl0ZXMgfSA9IGdldEV4dGVuZGVkUHVibGljS2V5KHNlY3JldEtleSk7XG4gICAgICAgIGNvbnN0IHIgPSBoYXNoRG9tYWluVG9TY2FsYXIob3B0aW9ucy5jb250ZXh0LCBwcmVmaXgsIG1zZyk7IC8vIHIgPSBkb20yKEYsIEMpIHx8IHByZWZpeCB8fCBQSChNKVxuICAgICAgICBjb25zdCBSID0gQkFTRS5tdWx0aXBseShyKS50b0J5dGVzKCk7IC8vIFIgPSByR1xuICAgICAgICBjb25zdCBrID0gaGFzaERvbWFpblRvU2NhbGFyKG9wdGlvbnMuY29udGV4dCwgUiwgcG9pbnRCeXRlcywgbXNnKTsgLy8gUiB8fCBBIHx8IFBIKE0pXG4gICAgICAgIGNvbnN0IHMgPSBGbi5jcmVhdGUociArIGsgKiBzY2FsYXIpOyAvLyBTID0gKHIgKyBrICogcykgbW9kIExcbiAgICAgICAgaWYgKCFGbi5pc1ZhbGlkKHMpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduIGZhaWxlZDogaW52YWxpZCBzJyk7IC8vIDAgPD0gcyA8IExcbiAgICAgICAgY29uc3QgcnMgPSBjb25jYXRCeXRlcyhSLCBGbi50b0J5dGVzKHMpKTtcbiAgICAgICAgcmV0dXJuIGFieXRlcyhycywgbGVuZ3Rocy5zaWduYXR1cmUsICdyZXN1bHQnKTtcbiAgICB9XG4gICAgLy8gdmVyaWZpY2F0aW9uIHJ1bGUgaXMgZWl0aGVyIHppcDIxNSBvciByZmM4MDMyIC8gbmlzdDE4Ni01LiBDb25zdWx0IGZyb21IZXg6XG4gICAgY29uc3QgdmVyaWZ5T3B0cyA9IHsgemlwMjE1OiB0cnVlIH07XG4gICAgLyoqXG4gICAgICogVmVyaWZpZXMgRWREU0Egc2lnbmF0dXJlIGFnYWluc3QgbWVzc2FnZSBhbmQgcHVibGljIGtleS4gUkZDODAzMiA1LjEuNy5cbiAgICAgKiBBbiBleHRlbmRlZCBncm91cCBlcXVhdGlvbiBpcyBjaGVja2VkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHZlcmlmeShzaWcsIG1zZywgcHVibGljS2V5LCBvcHRpb25zID0gdmVyaWZ5T3B0cykge1xuICAgICAgICBjb25zdCB7IGNvbnRleHQsIHppcDIxNSB9ID0gb3B0aW9ucztcbiAgICAgICAgY29uc3QgbGVuID0gbGVuZ3Rocy5zaWduYXR1cmU7XG4gICAgICAgIHNpZyA9IGVuc3VyZUJ5dGVzKCdzaWduYXR1cmUnLCBzaWcsIGxlbik7XG4gICAgICAgIG1zZyA9IGVuc3VyZUJ5dGVzKCdtZXNzYWdlJywgbXNnKTtcbiAgICAgICAgcHVibGljS2V5ID0gZW5zdXJlQnl0ZXMoJ3B1YmxpY0tleScsIHB1YmxpY0tleSwgbGVuZ3Rocy5wdWJsaWNLZXkpO1xuICAgICAgICBpZiAoemlwMjE1ICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICBhYm9vbCh6aXAyMTUsICd6aXAyMTUnKTtcbiAgICAgICAgaWYgKHByZWhhc2gpXG4gICAgICAgICAgICBtc2cgPSBwcmVoYXNoKG1zZyk7IC8vIGZvciBlZDI1NTE5cGgsIGV0Y1xuICAgICAgICBjb25zdCBtaWQgPSBsZW4gLyAyO1xuICAgICAgICBjb25zdCByID0gc2lnLnN1YmFycmF5KDAsIG1pZCk7XG4gICAgICAgIGNvbnN0IHMgPSBieXRlc1RvTnVtYmVyTEUoc2lnLnN1YmFycmF5KG1pZCwgbGVuKSk7XG4gICAgICAgIGxldCBBLCBSLCBTQjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIHppcDIxNT10cnVlIGlzIGdvb2QgZm9yIGNvbnNlbnN1cy1jcml0aWNhbCBhcHBzLiA9ZmFsc2UgZm9sbG93cyBSRkM4MDMyIC8gTklTVDE4Ni01LlxuICAgICAgICAgICAgLy8gemlwMjE1PXRydWU6ICAwIDw9IHkgPCBNQVNLICgyXjI1NiBmb3IgZWQyNTUxOSlcbiAgICAgICAgICAgIC8vIHppcDIxNT1mYWxzZTogMCA8PSB5IDwgUCAoMl4yNTUtMTkgZm9yIGVkMjU1MTkpXG4gICAgICAgICAgICBBID0gUG9pbnQuZnJvbUJ5dGVzKHB1YmxpY0tleSwgemlwMjE1KTtcbiAgICAgICAgICAgIFIgPSBQb2ludC5mcm9tQnl0ZXMociwgemlwMjE1KTtcbiAgICAgICAgICAgIFNCID0gQkFTRS5tdWx0aXBseVVuc2FmZShzKTsgLy8gMCA8PSBzIDwgbCBpcyBkb25lIGluc2lkZVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghemlwMjE1ICYmIEEuaXNTbWFsbE9yZGVyKCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHppcDIxNSBhbGxvd3MgcHVibGljIGtleXMgb2Ygc21hbGwgb3JkZXJcbiAgICAgICAgY29uc3QgayA9IGhhc2hEb21haW5Ub1NjYWxhcihjb250ZXh0LCBSLnRvQnl0ZXMoKSwgQS50b0J5dGVzKCksIG1zZyk7XG4gICAgICAgIGNvbnN0IFJrQSA9IFIuYWRkKEEubXVsdGlwbHlVbnNhZmUoaykpO1xuICAgICAgICAvLyBFeHRlbmRlZCBncm91cCBlcXVhdGlvblxuICAgICAgICAvLyBbOF1bU11CID0gWzhdUiArIFs4XVtrXUEnXG4gICAgICAgIHJldHVybiBSa0Euc3VidHJhY3QoU0IpLmNsZWFyQ29mYWN0b3IoKS5pczAoKTtcbiAgICB9XG4gICAgY29uc3QgX3NpemUgPSBGcC5CWVRFUzsgLy8gMzIgZm9yIGVkMjU1MTksIDU3IGZvciBlZDQ0OFxuICAgIGNvbnN0IGxlbmd0aHMgPSB7XG4gICAgICAgIHNlY3JldEtleTogX3NpemUsXG4gICAgICAgIHB1YmxpY0tleTogX3NpemUsXG4gICAgICAgIHNpZ25hdHVyZTogMiAqIF9zaXplLFxuICAgICAgICBzZWVkOiBfc2l6ZSxcbiAgICB9O1xuICAgIGZ1bmN0aW9uIHJhbmRvbVNlY3JldEtleShzZWVkID0gcmFuZG9tQnl0ZXMobGVuZ3Rocy5zZWVkKSkge1xuICAgICAgICByZXR1cm4gYWJ5dGVzKHNlZWQsIGxlbmd0aHMuc2VlZCwgJ3NlZWQnKTtcbiAgICB9XG4gICAgZnVuY3Rpb24ga2V5Z2VuKHNlZWQpIHtcbiAgICAgICAgY29uc3Qgc2VjcmV0S2V5ID0gdXRpbHMucmFuZG9tU2VjcmV0S2V5KHNlZWQpO1xuICAgICAgICByZXR1cm4geyBzZWNyZXRLZXksIHB1YmxpY0tleTogZ2V0UHVibGljS2V5KHNlY3JldEtleSkgfTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNWYWxpZFNlY3JldEtleShrZXkpIHtcbiAgICAgICAgcmV0dXJuIGlzQnl0ZXMoa2V5KSAmJiBrZXkubGVuZ3RoID09PSBGbi5CWVRFUztcbiAgICB9XG4gICAgZnVuY3Rpb24gaXNWYWxpZFB1YmxpY0tleShrZXksIHppcDIxNSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuICEhUG9pbnQuZnJvbUJ5dGVzKGtleSwgemlwMjE1KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB1dGlscyA9IHtcbiAgICAgICAgZ2V0RXh0ZW5kZWRQdWJsaWNLZXksXG4gICAgICAgIHJhbmRvbVNlY3JldEtleSxcbiAgICAgICAgaXNWYWxpZFNlY3JldEtleSxcbiAgICAgICAgaXNWYWxpZFB1YmxpY0tleSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnZlcnRzIGVkIHB1YmxpYyBrZXkgdG8geCBwdWJsaWMga2V5LiBVc2VzIGZvcm11bGE6XG4gICAgICAgICAqIC0gZWQyNTUxOTpcbiAgICAgICAgICogICAtIGAodSwgdikgPSAoKDEreSkvKDEteSksIHNxcnQoLTQ4NjY2NCkqdS94KWBcbiAgICAgICAgICogICAtIGAoeCwgeSkgPSAoc3FydCgtNDg2NjY0KSp1L3YsICh1LTEpLyh1KzEpKWBcbiAgICAgICAgICogLSBlZDQ0ODpcbiAgICAgICAgICogICAtIGAodSwgdikgPSAoKHktMSkvKHkrMSksIHNxcnQoMTU2MzI0KSp1L3gpYFxuICAgICAgICAgKiAgIC0gYCh4LCB5KSA9IChzcXJ0KDE1NjMyNCkqdS92LCAoMSt1KS8oMS11KSlgXG4gICAgICAgICAqL1xuICAgICAgICB0b01vbnRnb21lcnkocHVibGljS2V5KSB7XG4gICAgICAgICAgICBjb25zdCB7IHkgfSA9IFBvaW50LmZyb21CeXRlcyhwdWJsaWNLZXkpO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGxlbmd0aHMucHVibGljS2V5O1xuICAgICAgICAgICAgY29uc3QgaXMyNTUxOSA9IHNpemUgPT09IDMyO1xuICAgICAgICAgICAgaWYgKCFpczI1NTE5ICYmIHNpemUgIT09IDU3KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb25seSBkZWZpbmVkIGZvciAyNTUxOSBhbmQgNDQ4Jyk7XG4gICAgICAgICAgICBjb25zdCB1ID0gaXMyNTUxOSA/IEZwLmRpdihfMW4gKyB5LCBfMW4gLSB5KSA6IEZwLmRpdih5IC0gXzFuLCB5ICsgXzFuKTtcbiAgICAgICAgICAgIHJldHVybiBGcC50b0J5dGVzKHUpO1xuICAgICAgICB9LFxuICAgICAgICB0b01vbnRnb21lcnlTZWNyZXQoc2VjcmV0S2V5KSB7XG4gICAgICAgICAgICBjb25zdCBzaXplID0gbGVuZ3Rocy5zZWNyZXRLZXk7XG4gICAgICAgICAgICBhYnl0ZXMoc2VjcmV0S2V5LCBzaXplKTtcbiAgICAgICAgICAgIGNvbnN0IGhhc2hlZCA9IGNIYXNoKHNlY3JldEtleS5zdWJhcnJheSgwLCBzaXplKSk7XG4gICAgICAgICAgICByZXR1cm4gYWRqdXN0U2NhbGFyQnl0ZXMoaGFzaGVkKS5zdWJhcnJheSgwLCBzaXplKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkICovXG4gICAgICAgIHJhbmRvbVByaXZhdGVLZXk6IHJhbmRvbVNlY3JldEtleSxcbiAgICAgICAgLyoqIEBkZXByZWNhdGVkICovXG4gICAgICAgIHByZWNvbXB1dGUod2luZG93U2l6ZSA9IDgsIHBvaW50ID0gUG9pbnQuQkFTRSkge1xuICAgICAgICAgICAgcmV0dXJuIHBvaW50LnByZWNvbXB1dGUod2luZG93U2l6ZSwgZmFsc2UpO1xuICAgICAgICB9LFxuICAgIH07XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgICBrZXlnZW4sXG4gICAgICAgIGdldFB1YmxpY0tleSxcbiAgICAgICAgc2lnbixcbiAgICAgICAgdmVyaWZ5LFxuICAgICAgICB1dGlscyxcbiAgICAgICAgUG9pbnQsXG4gICAgICAgIGxlbmd0aHMsXG4gICAgfSk7XG59XG5mdW5jdGlvbiBfZWRkc2FfbGVnYWN5X29wdHNfdG9fbmV3KGMpIHtcbiAgICBjb25zdCBDVVJWRSA9IHtcbiAgICAgICAgYTogYy5hLFxuICAgICAgICBkOiBjLmQsXG4gICAgICAgIHA6IGMuRnAuT1JERVIsXG4gICAgICAgIG46IGMubixcbiAgICAgICAgaDogYy5oLFxuICAgICAgICBHeDogYy5HeCxcbiAgICAgICAgR3k6IGMuR3ksXG4gICAgfTtcbiAgICBjb25zdCBGcCA9IGMuRnA7XG4gICAgY29uc3QgRm4gPSBGaWVsZChDVVJWRS5uLCBjLm5CaXRMZW5ndGgsIHRydWUpO1xuICAgIGNvbnN0IGN1cnZlT3B0cyA9IHsgRnAsIEZuLCB1dlJhdGlvOiBjLnV2UmF0aW8gfTtcbiAgICBjb25zdCBlZGRzYU9wdHMgPSB7XG4gICAgICAgIHJhbmRvbUJ5dGVzOiBjLnJhbmRvbUJ5dGVzLFxuICAgICAgICBhZGp1c3RTY2FsYXJCeXRlczogYy5hZGp1c3RTY2FsYXJCeXRlcyxcbiAgICAgICAgZG9tYWluOiBjLmRvbWFpbixcbiAgICAgICAgcHJlaGFzaDogYy5wcmVoYXNoLFxuICAgICAgICBtYXBUb0N1cnZlOiBjLm1hcFRvQ3VydmUsXG4gICAgfTtcbiAgICByZXR1cm4geyBDVVJWRSwgY3VydmVPcHRzLCBoYXNoOiBjLmhhc2gsIGVkZHNhT3B0cyB9O1xufVxuZnVuY3Rpb24gX2VkZHNhX25ld19vdXRwdXRfdG9fbGVnYWN5KGMsIGVkZHNhKSB7XG4gICAgY29uc3QgUG9pbnQgPSBlZGRzYS5Qb2ludDtcbiAgICBjb25zdCBsZWdhY3kgPSBPYmplY3QuYXNzaWduKHt9LCBlZGRzYSwge1xuICAgICAgICBFeHRlbmRlZFBvaW50OiBQb2ludCxcbiAgICAgICAgQ1VSVkU6IGMsXG4gICAgICAgIG5CaXRMZW5ndGg6IFBvaW50LkZuLkJJVFMsXG4gICAgICAgIG5CeXRlTGVuZ3RoOiBQb2ludC5Gbi5CWVRFUyxcbiAgICB9KTtcbiAgICByZXR1cm4gbGVnYWN5O1xufVxuLy8gVE9ETzogcmVtb3ZlLiBVc2UgZWRkc2FcbmV4cG9ydCBmdW5jdGlvbiB0d2lzdGVkRWR3YXJkcyhjKSB7XG4gICAgY29uc3QgeyBDVVJWRSwgY3VydmVPcHRzLCBoYXNoLCBlZGRzYU9wdHMgfSA9IF9lZGRzYV9sZWdhY3lfb3B0c190b19uZXcoYyk7XG4gICAgY29uc3QgUG9pbnQgPSBlZHdhcmRzKENVUlZFLCBjdXJ2ZU9wdHMpO1xuICAgIGNvbnN0IEVERFNBID0gZWRkc2EoUG9pbnQsIGhhc2gsIGVkZHNhT3B0cyk7XG4gICAgcmV0dXJuIF9lZGRzYV9uZXdfb3V0cHV0X3RvX2xlZ2FjeShjLCBFRERTQSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1lZHdhcmRzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/edwards.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/hash-to-curve.js":
/*!******************************************************************!*\
  !*** ./node_modules/@noble/curves/esm/abstract/hash-to-curve.js ***!
  \******************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   _DST_scalar: () => (/* binding */ _DST_scalar),\n/* harmony export */   createHasher: () => (/* binding */ createHasher),\n/* harmony export */   expand_message_xmd: () => (/* binding */ expand_message_xmd),\n/* harmony export */   expand_message_xof: () => (/* binding */ expand_message_xof),\n/* harmony export */   hash_to_field: () => (/* binding */ hash_to_field),\n/* harmony export */   isogenyMap: () => (/* binding */ isogenyMap)\n/* harmony export */ });\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/* harmony import */ var _modular_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modular.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/modular.js\");\n\n\n// Octet Stream to Integer. \"spec\" implementation of os2ip is 2.5x slower vs bytesToNumberBE.\nconst os2ip = _utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberBE;\n// Integer to Octet Stream (numberToBytesBE)\nfunction i2osp(value, length) {\n    anum(value);\n    anum(length);\n    if (value < 0 || value >= 1 << (8 * length))\n        throw new Error('invalid I2OSP input: ' + value);\n    const res = Array.from({ length }).fill(0);\n    for (let i = length - 1; i >= 0; i--) {\n        res[i] = value & 0xff;\n        value >>>= 8;\n    }\n    return new Uint8Array(res);\n}\nfunction strxor(a, b) {\n    const arr = new Uint8Array(a.length);\n    for (let i = 0; i < a.length; i++) {\n        arr[i] = a[i] ^ b[i];\n    }\n    return arr;\n}\nfunction anum(item) {\n    if (!Number.isSafeInteger(item))\n        throw new Error('number expected');\n}\nfunction normDST(DST) {\n    if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.isBytes)(DST) && typeof DST !== 'string')\n        throw new Error('DST must be Uint8Array or string');\n    return typeof DST === 'string' ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.utf8ToBytes)(DST) : DST;\n}\n/**\n * Produces a uniformly random byte string using a cryptographic hash function H that outputs b bits.\n * [RFC 9380 5.3.1](https://www.rfc-editor.org/rfc/rfc9380#section-5.3.1).\n */\nfunction expand_message_xmd(msg, DST, lenInBytes, H) {\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.abytes)(msg);\n    anum(lenInBytes);\n    DST = normDST(DST);\n    // https://www.rfc-editor.org/rfc/rfc9380#section-5.3.3\n    if (DST.length > 255)\n        DST = H((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.concatBytes)((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.utf8ToBytes)('H2C-OVERSIZE-DST-'), DST));\n    const { outputLen: b_in_bytes, blockLen: r_in_bytes } = H;\n    const ell = Math.ceil(lenInBytes / b_in_bytes);\n    if (lenInBytes > 65535 || ell > 255)\n        throw new Error('expand_message_xmd: invalid lenInBytes');\n    const DST_prime = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.concatBytes)(DST, i2osp(DST.length, 1));\n    const Z_pad = i2osp(0, r_in_bytes);\n    const l_i_b_str = i2osp(lenInBytes, 2); // len_in_bytes_str\n    const b = new Array(ell);\n    const b_0 = H((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.concatBytes)(Z_pad, msg, l_i_b_str, i2osp(0, 1), DST_prime));\n    b[0] = H((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.concatBytes)(b_0, i2osp(1, 1), DST_prime));\n    for (let i = 1; i <= ell; i++) {\n        const args = [strxor(b_0, b[i - 1]), i2osp(i + 1, 1), DST_prime];\n        b[i] = H((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.concatBytes)(...args));\n    }\n    const pseudo_random_bytes = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.concatBytes)(...b);\n    return pseudo_random_bytes.slice(0, lenInBytes);\n}\n/**\n * Produces a uniformly random byte string using an extendable-output function (XOF) H.\n * 1. The collision resistance of H MUST be at least k bits.\n * 2. H MUST be an XOF that has been proved indifferentiable from\n *    a random oracle under a reasonable cryptographic assumption.\n * [RFC 9380 5.3.2](https://www.rfc-editor.org/rfc/rfc9380#section-5.3.2).\n */\nfunction expand_message_xof(msg, DST, lenInBytes, k, H) {\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.abytes)(msg);\n    anum(lenInBytes);\n    DST = normDST(DST);\n    // https://www.rfc-editor.org/rfc/rfc9380#section-5.3.3\n    // DST = H('H2C-OVERSIZE-DST-' || a_very_long_DST, Math.ceil((lenInBytes * k) / 8));\n    if (DST.length > 255) {\n        const dkLen = Math.ceil((2 * k) / 8);\n        DST = H.create({ dkLen }).update((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.utf8ToBytes)('H2C-OVERSIZE-DST-')).update(DST).digest();\n    }\n    if (lenInBytes > 65535 || DST.length > 255)\n        throw new Error('expand_message_xof: invalid lenInBytes');\n    return (H.create({ dkLen: lenInBytes })\n        .update(msg)\n        .update(i2osp(lenInBytes, 2))\n        // 2. DST_prime = DST || I2OSP(len(DST), 1)\n        .update(DST)\n        .update(i2osp(DST.length, 1))\n        .digest());\n}\n/**\n * Hashes arbitrary-length byte strings to a list of one or more elements of a finite field F.\n * [RFC 9380 5.2](https://www.rfc-editor.org/rfc/rfc9380#section-5.2).\n * @param msg a byte string containing the message to hash\n * @param count the number of elements of F to output\n * @param options `{DST: string, p: bigint, m: number, k: number, expand: 'xmd' | 'xof', hash: H}`, see above\n * @returns [u_0, ..., u_(count - 1)], a list of field elements.\n */\nfunction hash_to_field(msg, count, options) {\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._validateObject)(options, {\n        p: 'bigint',\n        m: 'number',\n        k: 'number',\n        hash: 'function',\n    });\n    const { p, k, m, hash, expand, DST } = options;\n    if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.isHash)(options.hash))\n        throw new Error('expected valid hash');\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.abytes)(msg);\n    anum(count);\n    const log2p = p.toString(2).length;\n    const L = Math.ceil((log2p + k) / 8); // section 5.1 of ietf draft link above\n    const len_in_bytes = count * m * L;\n    let prb; // pseudo_random_bytes\n    if (expand === 'xmd') {\n        prb = expand_message_xmd(msg, DST, len_in_bytes, hash);\n    }\n    else if (expand === 'xof') {\n        prb = expand_message_xof(msg, DST, len_in_bytes, k, hash);\n    }\n    else if (expand === '_internal_pass') {\n        // for internal tests only\n        prb = msg;\n    }\n    else {\n        throw new Error('expand must be \"xmd\" or \"xof\"');\n    }\n    const u = new Array(count);\n    for (let i = 0; i < count; i++) {\n        const e = new Array(m);\n        for (let j = 0; j < m; j++) {\n            const elm_offset = L * (j + i * m);\n            const tv = prb.subarray(elm_offset, elm_offset + L);\n            e[j] = (0,_modular_js__WEBPACK_IMPORTED_MODULE_2__.mod)(os2ip(tv), p);\n        }\n        u[i] = e;\n    }\n    return u;\n}\nfunction isogenyMap(field, map) {\n    // Make same order as in spec\n    const coeff = map.map((i) => Array.from(i).reverse());\n    return (x, y) => {\n        const [xn, xd, yn, yd] = coeff.map((val) => val.reduce((acc, i) => field.add(field.mul(acc, x), i)));\n        // 6.6.3\n        // Exceptional cases of iso_map are inputs that cause the denominator of\n        // either rational function to evaluate to zero; such cases MUST return\n        // the identity point on E.\n        const [xd_inv, yd_inv] = (0,_modular_js__WEBPACK_IMPORTED_MODULE_2__.FpInvertBatch)(field, [xd, yd], true);\n        x = field.mul(xn, xd_inv); // xNum / xDen\n        y = field.mul(y, field.mul(yn, yd_inv)); // y * (yNum / yDev)\n        return { x, y };\n    };\n}\nconst _DST_scalar = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.utf8ToBytes)('HashToScalar-');\n/** Creates hash-to-curve methods from EC Point and mapToCurve function. See {@link H2CHasher}. */\nfunction createHasher(Point, mapToCurve, defaults) {\n    if (typeof mapToCurve !== 'function')\n        throw new Error('mapToCurve() must be defined');\n    function map(num) {\n        return Point.fromAffine(mapToCurve(num));\n    }\n    function clear(initial) {\n        const P = initial.clearCofactor();\n        if (P.equals(Point.ZERO))\n            return Point.ZERO; // zero will throw in assert\n        P.assertValidity();\n        return P;\n    }\n    return {\n        defaults,\n        hashToCurve(msg, options) {\n            const opts = Object.assign({}, defaults, options);\n            const u = hash_to_field(msg, 2, opts);\n            const u0 = map(u[0]);\n            const u1 = map(u[1]);\n            return clear(u0.add(u1));\n        },\n        encodeToCurve(msg, options) {\n            const optsDst = defaults.encodeDST ? { DST: defaults.encodeDST } : {};\n            const opts = Object.assign({}, defaults, optsDst, options);\n            const u = hash_to_field(msg, 1, opts);\n            const u0 = map(u[0]);\n            return clear(u0);\n        },\n        /** See {@link H2CHasher} */\n        mapToCurve(scalars) {\n            if (!Array.isArray(scalars))\n                throw new Error('expected array of bigints');\n            for (const i of scalars)\n                if (typeof i !== 'bigint')\n                    throw new Error('expected array of bigints');\n            return clear(map(scalars));\n        },\n        // hash_to_scalar can produce 0: https://www.rfc-editor.org/errata/eid8393\n        // RFC 9380, draft-irtf-cfrg-bbs-signatures-08\n        hashToScalar(msg, options) {\n            // @ts-ignore\n            const N = Point.Fn.ORDER;\n            const opts = Object.assign({}, defaults, { p: N, m: 1, DST: _DST_scalar }, options);\n            return hash_to_field(msg, 1, opts)[0][0];\n        },\n    };\n}\n//# sourceMappingURL=hash-to-curve.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC9oYXNoLXRvLWN1cnZlLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFtSDtBQUNqRTtBQUNsRDtBQUNBLGNBQWMsc0RBQWU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFFBQVE7QUFDckMsNkJBQTZCLFFBQVE7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsY0FBYztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLGtEQUFPO0FBQ2hCO0FBQ0EscUNBQXFDLHNEQUFXO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLElBQUksaURBQU07QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixzREFBVyxDQUFDLHNEQUFXO0FBQ3ZDLFlBQVksOENBQThDO0FBQzFEO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixzREFBVztBQUNqQztBQUNBLDRDQUE0QztBQUM1QztBQUNBLGtCQUFrQixzREFBVztBQUM3QixhQUFhLHNEQUFXO0FBQ3hCLG9CQUFvQixVQUFVO0FBQzlCO0FBQ0EsaUJBQWlCLHNEQUFXO0FBQzVCO0FBQ0EsZ0NBQWdDLHNEQUFXO0FBQzNDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsSUFBSSxpREFBTTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5QixPQUFPLFNBQVMsc0RBQVc7QUFDcEQ7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLG1CQUFtQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsNkVBQTZFO0FBQ2pHO0FBQ0E7QUFDTztBQUNQLElBQUksMERBQWU7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsWUFBWSw2QkFBNkI7QUFDekMsU0FBUyxpREFBTTtBQUNmO0FBQ0EsSUFBSSxpREFBTTtBQUNWO0FBQ0E7QUFDQSwwQ0FBMEM7QUFDMUM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixXQUFXO0FBQy9CO0FBQ0Esd0JBQXdCLE9BQU87QUFDL0I7QUFDQTtBQUNBLG1CQUFtQixnREFBRztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQSxpQ0FBaUMsMERBQWE7QUFDOUMsbUNBQW1DO0FBQ25DLGlEQUFpRDtBQUNqRCxpQkFBaUI7QUFDakI7QUFDQTtBQUNPLG9CQUFvQixzREFBVztBQUN0Qyw4RUFBOEUsZ0JBQWdCO0FBQ3ZGO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxtREFBbUQsMEJBQTBCO0FBQzdFLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsaUJBQWlCLGlCQUFpQjtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDLGNBQWMsOEJBQThCO0FBQ3JGO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC9oYXNoLXRvLWN1cnZlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IF92YWxpZGF0ZU9iamVjdCwgYWJ5dGVzLCBieXRlc1RvTnVtYmVyQkUsIGNvbmNhdEJ5dGVzLCBpc0J5dGVzLCBpc0hhc2gsIHV0ZjhUb0J5dGVzLCB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgRnBJbnZlcnRCYXRjaCwgbW9kIH0gZnJvbSBcIi4vbW9kdWxhci5qc1wiO1xuLy8gT2N0ZXQgU3RyZWFtIHRvIEludGVnZXIuIFwic3BlY1wiIGltcGxlbWVudGF0aW9uIG9mIG9zMmlwIGlzIDIuNXggc2xvd2VyIHZzIGJ5dGVzVG9OdW1iZXJCRS5cbmNvbnN0IG9zMmlwID0gYnl0ZXNUb051bWJlckJFO1xuLy8gSW50ZWdlciB0byBPY3RldCBTdHJlYW0gKG51bWJlclRvQnl0ZXNCRSlcbmZ1bmN0aW9uIGkyb3NwKHZhbHVlLCBsZW5ndGgpIHtcbiAgICBhbnVtKHZhbHVlKTtcbiAgICBhbnVtKGxlbmd0aCk7XG4gICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+PSAxIDw8ICg4ICogbGVuZ3RoKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIEkyT1NQIGlucHV0OiAnICsgdmFsdWUpO1xuICAgIGNvbnN0IHJlcyA9IEFycmF5LmZyb20oeyBsZW5ndGggfSkuZmlsbCgwKTtcbiAgICBmb3IgKGxldCBpID0gbGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgcmVzW2ldID0gdmFsdWUgJiAweGZmO1xuICAgICAgICB2YWx1ZSA+Pj49IDg7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShyZXMpO1xufVxuZnVuY3Rpb24gc3RyeG9yKGEsIGIpIHtcbiAgICBjb25zdCBhcnIgPSBuZXcgVWludDhBcnJheShhLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycltpXSA9IGFbaV0gXiBiW2ldO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xufVxuZnVuY3Rpb24gYW51bShpdGVtKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihpdGVtKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdudW1iZXIgZXhwZWN0ZWQnKTtcbn1cbmZ1bmN0aW9uIG5vcm1EU1QoRFNUKSB7XG4gICAgaWYgKCFpc0J5dGVzKERTVCkgJiYgdHlwZW9mIERTVCAhPT0gJ3N0cmluZycpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRFNUIG11c3QgYmUgVWludDhBcnJheSBvciBzdHJpbmcnKTtcbiAgICByZXR1cm4gdHlwZW9mIERTVCA9PT0gJ3N0cmluZycgPyB1dGY4VG9CeXRlcyhEU1QpIDogRFNUO1xufVxuLyoqXG4gKiBQcm9kdWNlcyBhIHVuaWZvcm1seSByYW5kb20gYnl0ZSBzdHJpbmcgdXNpbmcgYSBjcnlwdG9ncmFwaGljIGhhc2ggZnVuY3Rpb24gSCB0aGF0IG91dHB1dHMgYiBiaXRzLlxuICogW1JGQyA5MzgwIDUuMy4xXShodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTM4MCNzZWN0aW9uLTUuMy4xKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZF9tZXNzYWdlX3htZChtc2csIERTVCwgbGVuSW5CeXRlcywgSCkge1xuICAgIGFieXRlcyhtc2cpO1xuICAgIGFudW0obGVuSW5CeXRlcyk7XG4gICAgRFNUID0gbm9ybURTVChEU1QpO1xuICAgIC8vIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MzgwI3NlY3Rpb24tNS4zLjNcbiAgICBpZiAoRFNULmxlbmd0aCA+IDI1NSlcbiAgICAgICAgRFNUID0gSChjb25jYXRCeXRlcyh1dGY4VG9CeXRlcygnSDJDLU9WRVJTSVpFLURTVC0nKSwgRFNUKSk7XG4gICAgY29uc3QgeyBvdXRwdXRMZW46IGJfaW5fYnl0ZXMsIGJsb2NrTGVuOiByX2luX2J5dGVzIH0gPSBIO1xuICAgIGNvbnN0IGVsbCA9IE1hdGguY2VpbChsZW5JbkJ5dGVzIC8gYl9pbl9ieXRlcyk7XG4gICAgaWYgKGxlbkluQnl0ZXMgPiA2NTUzNSB8fCBlbGwgPiAyNTUpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwYW5kX21lc3NhZ2VfeG1kOiBpbnZhbGlkIGxlbkluQnl0ZXMnKTtcbiAgICBjb25zdCBEU1RfcHJpbWUgPSBjb25jYXRCeXRlcyhEU1QsIGkyb3NwKERTVC5sZW5ndGgsIDEpKTtcbiAgICBjb25zdCBaX3BhZCA9IGkyb3NwKDAsIHJfaW5fYnl0ZXMpO1xuICAgIGNvbnN0IGxfaV9iX3N0ciA9IGkyb3NwKGxlbkluQnl0ZXMsIDIpOyAvLyBsZW5faW5fYnl0ZXNfc3RyXG4gICAgY29uc3QgYiA9IG5ldyBBcnJheShlbGwpO1xuICAgIGNvbnN0IGJfMCA9IEgoY29uY2F0Qnl0ZXMoWl9wYWQsIG1zZywgbF9pX2Jfc3RyLCBpMm9zcCgwLCAxKSwgRFNUX3ByaW1lKSk7XG4gICAgYlswXSA9IEgoY29uY2F0Qnl0ZXMoYl8wLCBpMm9zcCgxLCAxKSwgRFNUX3ByaW1lKSk7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gZWxsOyBpKyspIHtcbiAgICAgICAgY29uc3QgYXJncyA9IFtzdHJ4b3IoYl8wLCBiW2kgLSAxXSksIGkyb3NwKGkgKyAxLCAxKSwgRFNUX3ByaW1lXTtcbiAgICAgICAgYltpXSA9IEgoY29uY2F0Qnl0ZXMoLi4uYXJncykpO1xuICAgIH1cbiAgICBjb25zdCBwc2V1ZG9fcmFuZG9tX2J5dGVzID0gY29uY2F0Qnl0ZXMoLi4uYik7XG4gICAgcmV0dXJuIHBzZXVkb19yYW5kb21fYnl0ZXMuc2xpY2UoMCwgbGVuSW5CeXRlcyk7XG59XG4vKipcbiAqIFByb2R1Y2VzIGEgdW5pZm9ybWx5IHJhbmRvbSBieXRlIHN0cmluZyB1c2luZyBhbiBleHRlbmRhYmxlLW91dHB1dCBmdW5jdGlvbiAoWE9GKSBILlxuICogMS4gVGhlIGNvbGxpc2lvbiByZXNpc3RhbmNlIG9mIEggTVVTVCBiZSBhdCBsZWFzdCBrIGJpdHMuXG4gKiAyLiBIIE1VU1QgYmUgYW4gWE9GIHRoYXQgaGFzIGJlZW4gcHJvdmVkIGluZGlmZmVyZW50aWFibGUgZnJvbVxuICogICAgYSByYW5kb20gb3JhY2xlIHVuZGVyIGEgcmVhc29uYWJsZSBjcnlwdG9ncmFwaGljIGFzc3VtcHRpb24uXG4gKiBbUkZDIDkzODAgNS4zLjJdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MzgwI3NlY3Rpb24tNS4zLjIpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kX21lc3NhZ2VfeG9mKG1zZywgRFNULCBsZW5JbkJ5dGVzLCBrLCBIKSB7XG4gICAgYWJ5dGVzKG1zZyk7XG4gICAgYW51bShsZW5JbkJ5dGVzKTtcbiAgICBEU1QgPSBub3JtRFNUKERTVCk7XG4gICAgLy8gaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzkzODAjc2VjdGlvbi01LjMuM1xuICAgIC8vIERTVCA9IEgoJ0gyQy1PVkVSU0laRS1EU1QtJyB8fCBhX3ZlcnlfbG9uZ19EU1QsIE1hdGguY2VpbCgobGVuSW5CeXRlcyAqIGspIC8gOCkpO1xuICAgIGlmIChEU1QubGVuZ3RoID4gMjU1KSB7XG4gICAgICAgIGNvbnN0IGRrTGVuID0gTWF0aC5jZWlsKCgyICogaykgLyA4KTtcbiAgICAgICAgRFNUID0gSC5jcmVhdGUoeyBka0xlbiB9KS51cGRhdGUodXRmOFRvQnl0ZXMoJ0gyQy1PVkVSU0laRS1EU1QtJykpLnVwZGF0ZShEU1QpLmRpZ2VzdCgpO1xuICAgIH1cbiAgICBpZiAobGVuSW5CeXRlcyA+IDY1NTM1IHx8IERTVC5sZW5ndGggPiAyNTUpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwYW5kX21lc3NhZ2VfeG9mOiBpbnZhbGlkIGxlbkluQnl0ZXMnKTtcbiAgICByZXR1cm4gKEguY3JlYXRlKHsgZGtMZW46IGxlbkluQnl0ZXMgfSlcbiAgICAgICAgLnVwZGF0ZShtc2cpXG4gICAgICAgIC51cGRhdGUoaTJvc3AobGVuSW5CeXRlcywgMikpXG4gICAgICAgIC8vIDIuIERTVF9wcmltZSA9IERTVCB8fCBJMk9TUChsZW4oRFNUKSwgMSlcbiAgICAgICAgLnVwZGF0ZShEU1QpXG4gICAgICAgIC51cGRhdGUoaTJvc3AoRFNULmxlbmd0aCwgMSkpXG4gICAgICAgIC5kaWdlc3QoKSk7XG59XG4vKipcbiAqIEhhc2hlcyBhcmJpdHJhcnktbGVuZ3RoIGJ5dGUgc3RyaW5ncyB0byBhIGxpc3Qgb2Ygb25lIG9yIG1vcmUgZWxlbWVudHMgb2YgYSBmaW5pdGUgZmllbGQgRi5cbiAqIFtSRkMgOTM4MCA1LjJdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MzgwI3NlY3Rpb24tNS4yKS5cbiAqIEBwYXJhbSBtc2cgYSBieXRlIHN0cmluZyBjb250YWluaW5nIHRoZSBtZXNzYWdlIHRvIGhhc2hcbiAqIEBwYXJhbSBjb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIEYgdG8gb3V0cHV0XG4gKiBAcGFyYW0gb3B0aW9ucyBge0RTVDogc3RyaW5nLCBwOiBiaWdpbnQsIG06IG51bWJlciwgazogbnVtYmVyLCBleHBhbmQ6ICd4bWQnIHwgJ3hvZicsIGhhc2g6IEh9YCwgc2VlIGFib3ZlXG4gKiBAcmV0dXJucyBbdV8wLCAuLi4sIHVfKGNvdW50IC0gMSldLCBhIGxpc3Qgb2YgZmllbGQgZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNoX3RvX2ZpZWxkKG1zZywgY291bnQsIG9wdGlvbnMpIHtcbiAgICBfdmFsaWRhdGVPYmplY3Qob3B0aW9ucywge1xuICAgICAgICBwOiAnYmlnaW50JyxcbiAgICAgICAgbTogJ251bWJlcicsXG4gICAgICAgIGs6ICdudW1iZXInLFxuICAgICAgICBoYXNoOiAnZnVuY3Rpb24nLFxuICAgIH0pO1xuICAgIGNvbnN0IHsgcCwgaywgbSwgaGFzaCwgZXhwYW5kLCBEU1QgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFpc0hhc2gob3B0aW9ucy5oYXNoKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCB2YWxpZCBoYXNoJyk7XG4gICAgYWJ5dGVzKG1zZyk7XG4gICAgYW51bShjb3VudCk7XG4gICAgY29uc3QgbG9nMnAgPSBwLnRvU3RyaW5nKDIpLmxlbmd0aDtcbiAgICBjb25zdCBMID0gTWF0aC5jZWlsKChsb2cycCArIGspIC8gOCk7IC8vIHNlY3Rpb24gNS4xIG9mIGlldGYgZHJhZnQgbGluayBhYm92ZVxuICAgIGNvbnN0IGxlbl9pbl9ieXRlcyA9IGNvdW50ICogbSAqIEw7XG4gICAgbGV0IHByYjsgLy8gcHNldWRvX3JhbmRvbV9ieXRlc1xuICAgIGlmIChleHBhbmQgPT09ICd4bWQnKSB7XG4gICAgICAgIHByYiA9IGV4cGFuZF9tZXNzYWdlX3htZChtc2csIERTVCwgbGVuX2luX2J5dGVzLCBoYXNoKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoZXhwYW5kID09PSAneG9mJykge1xuICAgICAgICBwcmIgPSBleHBhbmRfbWVzc2FnZV94b2YobXNnLCBEU1QsIGxlbl9pbl9ieXRlcywgaywgaGFzaCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGV4cGFuZCA9PT0gJ19pbnRlcm5hbF9wYXNzJykge1xuICAgICAgICAvLyBmb3IgaW50ZXJuYWwgdGVzdHMgb25seVxuICAgICAgICBwcmIgPSBtc2c7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGFuZCBtdXN0IGJlIFwieG1kXCIgb3IgXCJ4b2ZcIicpO1xuICAgIH1cbiAgICBjb25zdCB1ID0gbmV3IEFycmF5KGNvdW50KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICAgICAgY29uc3QgZSA9IG5ldyBBcnJheShtKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtOyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsbV9vZmZzZXQgPSBMICogKGogKyBpICogbSk7XG4gICAgICAgICAgICBjb25zdCB0diA9IHByYi5zdWJhcnJheShlbG1fb2Zmc2V0LCBlbG1fb2Zmc2V0ICsgTCk7XG4gICAgICAgICAgICBlW2pdID0gbW9kKG9zMmlwKHR2KSwgcCk7XG4gICAgICAgIH1cbiAgICAgICAgdVtpXSA9IGU7XG4gICAgfVxuICAgIHJldHVybiB1O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzb2dlbnlNYXAoZmllbGQsIG1hcCkge1xuICAgIC8vIE1ha2Ugc2FtZSBvcmRlciBhcyBpbiBzcGVjXG4gICAgY29uc3QgY29lZmYgPSBtYXAubWFwKChpKSA9PiBBcnJheS5mcm9tKGkpLnJldmVyc2UoKSk7XG4gICAgcmV0dXJuICh4LCB5KSA9PiB7XG4gICAgICAgIGNvbnN0IFt4biwgeGQsIHluLCB5ZF0gPSBjb2VmZi5tYXAoKHZhbCkgPT4gdmFsLnJlZHVjZSgoYWNjLCBpKSA9PiBmaWVsZC5hZGQoZmllbGQubXVsKGFjYywgeCksIGkpKSk7XG4gICAgICAgIC8vIDYuNi4zXG4gICAgICAgIC8vIEV4Y2VwdGlvbmFsIGNhc2VzIG9mIGlzb19tYXAgYXJlIGlucHV0cyB0aGF0IGNhdXNlIHRoZSBkZW5vbWluYXRvciBvZlxuICAgICAgICAvLyBlaXRoZXIgcmF0aW9uYWwgZnVuY3Rpb24gdG8gZXZhbHVhdGUgdG8gemVybzsgc3VjaCBjYXNlcyBNVVNUIHJldHVyblxuICAgICAgICAvLyB0aGUgaWRlbnRpdHkgcG9pbnQgb24gRS5cbiAgICAgICAgY29uc3QgW3hkX2ludiwgeWRfaW52XSA9IEZwSW52ZXJ0QmF0Y2goZmllbGQsIFt4ZCwgeWRdLCB0cnVlKTtcbiAgICAgICAgeCA9IGZpZWxkLm11bCh4biwgeGRfaW52KTsgLy8geE51bSAvIHhEZW5cbiAgICAgICAgeSA9IGZpZWxkLm11bCh5LCBmaWVsZC5tdWwoeW4sIHlkX2ludikpOyAvLyB5ICogKHlOdW0gLyB5RGV2KVxuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgfTtcbn1cbmV4cG9ydCBjb25zdCBfRFNUX3NjYWxhciA9IHV0ZjhUb0J5dGVzKCdIYXNoVG9TY2FsYXItJyk7XG4vKiogQ3JlYXRlcyBoYXNoLXRvLWN1cnZlIG1ldGhvZHMgZnJvbSBFQyBQb2ludCBhbmQgbWFwVG9DdXJ2ZSBmdW5jdGlvbi4gU2VlIHtAbGluayBIMkNIYXNoZXJ9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhhc2hlcihQb2ludCwgbWFwVG9DdXJ2ZSwgZGVmYXVsdHMpIHtcbiAgICBpZiAodHlwZW9mIG1hcFRvQ3VydmUgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbWFwVG9DdXJ2ZSgpIG11c3QgYmUgZGVmaW5lZCcpO1xuICAgIGZ1bmN0aW9uIG1hcChudW0pIHtcbiAgICAgICAgcmV0dXJuIFBvaW50LmZyb21BZmZpbmUobWFwVG9DdXJ2ZShudW0pKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xlYXIoaW5pdGlhbCkge1xuICAgICAgICBjb25zdCBQID0gaW5pdGlhbC5jbGVhckNvZmFjdG9yKCk7XG4gICAgICAgIGlmIChQLmVxdWFscyhQb2ludC5aRVJPKSlcbiAgICAgICAgICAgIHJldHVybiBQb2ludC5aRVJPOyAvLyB6ZXJvIHdpbGwgdGhyb3cgaW4gYXNzZXJ0XG4gICAgICAgIFAuYXNzZXJ0VmFsaWRpdHkoKTtcbiAgICAgICAgcmV0dXJuIFA7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIGRlZmF1bHRzLFxuICAgICAgICBoYXNoVG9DdXJ2ZShtc2csIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cywgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCB1ID0gaGFzaF90b19maWVsZChtc2csIDIsIG9wdHMpO1xuICAgICAgICAgICAgY29uc3QgdTAgPSBtYXAodVswXSk7XG4gICAgICAgICAgICBjb25zdCB1MSA9IG1hcCh1WzFdKTtcbiAgICAgICAgICAgIHJldHVybiBjbGVhcih1MC5hZGQodTEpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5jb2RlVG9DdXJ2ZShtc2csIG9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wdHNEc3QgPSBkZWZhdWx0cy5lbmNvZGVEU1QgPyB7IERTVDogZGVmYXVsdHMuZW5jb2RlRFNUIH0gOiB7fTtcbiAgICAgICAgICAgIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0cywgb3B0c0RzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCB1ID0gaGFzaF90b19maWVsZChtc2csIDEsIG9wdHMpO1xuICAgICAgICAgICAgY29uc3QgdTAgPSBtYXAodVswXSk7XG4gICAgICAgICAgICByZXR1cm4gY2xlYXIodTApO1xuICAgICAgICB9LFxuICAgICAgICAvKiogU2VlIHtAbGluayBIMkNIYXNoZXJ9ICovXG4gICAgICAgIG1hcFRvQ3VydmUoc2NhbGFycykge1xuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHNjYWxhcnMpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgYXJyYXkgb2YgYmlnaW50cycpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpIG9mIHNjYWxhcnMpXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpICE9PSAnYmlnaW50JylcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCBhcnJheSBvZiBiaWdpbnRzJyk7XG4gICAgICAgICAgICByZXR1cm4gY2xlYXIobWFwKHNjYWxhcnMpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLy8gaGFzaF90b19zY2FsYXIgY2FuIHByb2R1Y2UgMDogaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvZXJyYXRhL2VpZDgzOTNcbiAgICAgICAgLy8gUkZDIDkzODAsIGRyYWZ0LWlydGYtY2ZyZy1iYnMtc2lnbmF0dXJlcy0wOFxuICAgICAgICBoYXNoVG9TY2FsYXIobXNnLCBvcHRpb25zKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBOID0gUG9pbnQuRm4uT1JERVI7XG4gICAgICAgICAgICBjb25zdCBvcHRzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdHMsIHsgcDogTiwgbTogMSwgRFNUOiBfRFNUX3NjYWxhciB9LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBoYXNoX3RvX2ZpZWxkKG1zZywgMSwgb3B0cylbMF1bMF07XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhhc2gtdG8tY3VydmUuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/hash-to-curve.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/modular.js":
/*!************************************************************!*\
  !*** ./node_modules/@noble/curves/esm/abstract/modular.js ***!
  \************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Field: () => (/* binding */ Field),\n/* harmony export */   FpDiv: () => (/* binding */ FpDiv),\n/* harmony export */   FpInvertBatch: () => (/* binding */ FpInvertBatch),\n/* harmony export */   FpIsSquare: () => (/* binding */ FpIsSquare),\n/* harmony export */   FpLegendre: () => (/* binding */ FpLegendre),\n/* harmony export */   FpPow: () => (/* binding */ FpPow),\n/* harmony export */   FpSqrt: () => (/* binding */ FpSqrt),\n/* harmony export */   FpSqrtEven: () => (/* binding */ FpSqrtEven),\n/* harmony export */   FpSqrtOdd: () => (/* binding */ FpSqrtOdd),\n/* harmony export */   getFieldBytesLength: () => (/* binding */ getFieldBytesLength),\n/* harmony export */   getMinHashLength: () => (/* binding */ getMinHashLength),\n/* harmony export */   hashToPrivateScalar: () => (/* binding */ hashToPrivateScalar),\n/* harmony export */   invert: () => (/* binding */ invert),\n/* harmony export */   isNegativeLE: () => (/* binding */ isNegativeLE),\n/* harmony export */   mapHashToField: () => (/* binding */ mapHashToField),\n/* harmony export */   mod: () => (/* binding */ mod),\n/* harmony export */   nLength: () => (/* binding */ nLength),\n/* harmony export */   pow: () => (/* binding */ pow),\n/* harmony export */   pow2: () => (/* binding */ pow2),\n/* harmony export */   tonelliShanks: () => (/* binding */ tonelliShanks),\n/* harmony export */   validateField: () => (/* binding */ validateField)\n/* harmony export */ });\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _7n = /* @__PURE__ */ BigInt(7);\n// prettier-ignore\nconst _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9), _16n = /* @__PURE__ */ BigInt(16);\n// Calculates a modulo b\nfunction mod(a, b) {\n    const result = a % b;\n    return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nfunction pow(num, power, modulo) {\n    return FpPow(Field(modulo), num, power);\n}\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nfunction pow2(x, power, modulo) {\n    let res = x;\n    while (power-- > _0n) {\n        res *= res;\n        res %= modulo;\n    }\n    return res;\n}\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nfunction invert(number, modulo) {\n    if (number === _0n)\n        throw new Error('invert: expected non-zero number');\n    if (modulo <= _0n)\n        throw new Error('invert: expected positive modulus, got ' + modulo);\n    // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n    let a = mod(number, modulo);\n    let b = modulo;\n    // prettier-ignore\n    let x = _0n, y = _1n, u = _1n, v = _0n;\n    while (a !== _0n) {\n        // JIT applies optimization if those two lines follow each other\n        const q = b / a;\n        const r = b % a;\n        const m = x - u * q;\n        const n = y - v * q;\n        // prettier-ignore\n        b = a, a = r, x = u, y = v, u = m, v = n;\n    }\n    const gcd = b;\n    if (gcd !== _1n)\n        throw new Error('invert: does not exist');\n    return mod(x, modulo);\n}\nfunction assertIsSquare(Fp, root, n) {\n    if (!Fp.eql(Fp.sqr(root), n))\n        throw new Error('Cannot find square root');\n}\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4(Fp, n) {\n    const p1div4 = (Fp.ORDER + _1n) / _4n;\n    const root = Fp.pow(n, p1div4);\n    assertIsSquare(Fp, root, n);\n    return root;\n}\nfunction sqrt5mod8(Fp, n) {\n    const p5div8 = (Fp.ORDER - _5n) / _8n;\n    const n2 = Fp.mul(n, _2n);\n    const v = Fp.pow(n2, p5div8);\n    const nv = Fp.mul(n, v);\n    const i = Fp.mul(Fp.mul(nv, _2n), v);\n    const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n    assertIsSquare(Fp, root, n);\n    return root;\n}\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P) {\n    const Fp_ = Field(P);\n    const tn = tonelliShanks(P);\n    const c1 = tn(Fp_, Fp_.neg(Fp_.ONE)); //  1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n    const c2 = tn(Fp_, c1); //  2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n    const c3 = tn(Fp_, Fp_.neg(c1)); //  3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n    const c4 = (P + _7n) / _16n; //  4. c4 = (q + 7) / 16        # Integer arithmetic\n    return (Fp, n) => {\n        let tv1 = Fp.pow(n, c4); //  1. tv1 = x^c4\n        let tv2 = Fp.mul(tv1, c1); //  2. tv2 = c1 * tv1\n        const tv3 = Fp.mul(tv1, c2); //  3. tv3 = c2 * tv1\n        const tv4 = Fp.mul(tv1, c3); //  4. tv4 = c3 * tv1\n        const e1 = Fp.eql(Fp.sqr(tv2), n); //  5.  e1 = (tv2^2) == x\n        const e2 = Fp.eql(Fp.sqr(tv3), n); //  6.  e2 = (tv3^2) == x\n        tv1 = Fp.cmov(tv1, tv2, e1); //  7. tv1 = CMOV(tv1, tv2, e1)  # Select tv2 if (tv2^2) == x\n        tv2 = Fp.cmov(tv4, tv3, e2); //  8. tv2 = CMOV(tv4, tv3, e2)  # Select tv3 if (tv3^2) == x\n        const e3 = Fp.eql(Fp.sqr(tv2), n); //  9.  e3 = (tv2^2) == x\n        const root = Fp.cmov(tv1, tv2, e3); // 10.  z = CMOV(tv1, tv2, e3)   # Select sqrt from tv1 & tv2\n        assertIsSquare(Fp, root, n);\n        return root;\n    };\n}\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nfunction tonelliShanks(P) {\n    // Initialization (precomputation).\n    // Caching initialization could boost perf by 7%.\n    if (P < _3n)\n        throw new Error('sqrt is not defined for small field');\n    // Factor P - 1 = Q * 2^S, where Q is odd\n    let Q = P - _1n;\n    let S = 0;\n    while (Q % _2n === _0n) {\n        Q /= _2n;\n        S++;\n    }\n    // Find the first quadratic non-residue Z >= 2\n    let Z = _2n;\n    const _Fp = Field(P);\n    while (FpLegendre(_Fp, Z) === 1) {\n        // Basic primality test for P. After x iterations, chance of\n        // not finding quadratic non-residue is 2^x, so 2^1000.\n        if (Z++ > 1000)\n            throw new Error('Cannot find square root: probably non-prime P');\n    }\n    // Fast-path; usually done before Z, but we do \"primality test\".\n    if (S === 1)\n        return sqrt3mod4;\n    // Slow-path\n    // TODO: test on Fp2 and others\n    let cc = _Fp.pow(Z, Q); // c = z^Q\n    const Q1div2 = (Q + _1n) / _2n;\n    return function tonelliSlow(Fp, n) {\n        if (Fp.is0(n))\n            return n;\n        // Check if n is a quadratic residue using Legendre symbol\n        if (FpLegendre(Fp, n) !== 1)\n            throw new Error('Cannot find square root');\n        // Initialize variables for the main loop\n        let M = S;\n        let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n        let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n        let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n        // Main loop\n        // while t != 1\n        while (!Fp.eql(t, Fp.ONE)) {\n            if (Fp.is0(t))\n                return Fp.ZERO; // if t=0 return R=0\n            let i = 1;\n            // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n            let t_tmp = Fp.sqr(t); // t^(2^1)\n            while (!Fp.eql(t_tmp, Fp.ONE)) {\n                i++;\n                t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n                if (i === M)\n                    throw new Error('Cannot find square root');\n            }\n            // Calculate the exponent for b: 2^(M - i - 1)\n            const exponent = _1n << BigInt(M - i - 1); // bigint is important\n            const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n            // Update variables\n            M = i;\n            c = Fp.sqr(b); // c = b^2\n            t = Fp.mul(t, c); // t = (t * b^2)\n            R = Fp.mul(R, b); // R = R*b\n        }\n        return R;\n    };\n}\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nfunction FpSqrt(P) {\n    // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n    if (P % _4n === _3n)\n        return sqrt3mod4;\n    // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n    if (P % _8n === _5n)\n        return sqrt5mod8;\n    // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n    if (P % _16n === _9n)\n        return sqrt9mod16(P);\n    // Tonelli-Shanks algorithm\n    return tonelliShanks(P);\n}\n// Little-endian check for first LE bit (last BE bit);\nconst isNegativeLE = (num, modulo) => (mod(num, modulo) & _1n) === _1n;\n// prettier-ignore\nconst FIELD_FIELDS = [\n    'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n    'eql', 'add', 'sub', 'mul', 'pow', 'div',\n    'addN', 'subN', 'mulN', 'sqrN'\n];\nfunction validateField(field) {\n    const initial = {\n        ORDER: 'bigint',\n        MASK: 'bigint',\n        BYTES: 'number',\n        BITS: 'number',\n    };\n    const opts = FIELD_FIELDS.reduce((map, val) => {\n        map[val] = 'function';\n        return map;\n    }, initial);\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._validateObject)(field, opts);\n    // const max = 16384;\n    // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n    // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n    return field;\n}\n// Generic field functions\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nfunction FpPow(Fp, num, power) {\n    if (power < _0n)\n        throw new Error('invalid exponent, negatives unsupported');\n    if (power === _0n)\n        return Fp.ONE;\n    if (power === _1n)\n        return num;\n    let p = Fp.ONE;\n    let d = num;\n    while (power > _0n) {\n        if (power & _1n)\n            p = Fp.mul(p, d);\n        d = Fp.sqr(d);\n        power >>= _1n;\n    }\n    return p;\n}\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nfunction FpInvertBatch(Fp, nums, passZero = false) {\n    const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n    // Walk from first to last, multiply them by each other MOD p\n    const multipliedAcc = nums.reduce((acc, num, i) => {\n        if (Fp.is0(num))\n            return acc;\n        inverted[i] = acc;\n        return Fp.mul(acc, num);\n    }, Fp.ONE);\n    // Invert last element\n    const invertedAcc = Fp.inv(multipliedAcc);\n    // Walk from last to first, multiply them by inverted each other MOD p\n    nums.reduceRight((acc, num, i) => {\n        if (Fp.is0(num))\n            return acc;\n        inverted[i] = Fp.mul(acc, inverted[i]);\n        return Fp.mul(acc, num);\n    }, invertedAcc);\n    return inverted;\n}\n// TODO: remove\nfunction FpDiv(Fp, lhs, rhs) {\n    return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1    if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1   if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0    if a ≡ 0 (mod p)\n */\nfunction FpLegendre(Fp, n) {\n    // We can use 3rd argument as optional cache of this value\n    // but seems unneeded for now. The operation is very fast.\n    const p1mod2 = (Fp.ORDER - _1n) / _2n;\n    const powered = Fp.pow(n, p1mod2);\n    const yes = Fp.eql(powered, Fp.ONE);\n    const zero = Fp.eql(powered, Fp.ZERO);\n    const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n    if (!yes && !zero && !no)\n        throw new Error('invalid Legendre symbol result');\n    return yes ? 1 : zero ? 0 : -1;\n}\n// This function returns True whenever the value x is a square in the field F.\nfunction FpIsSquare(Fp, n) {\n    const l = FpLegendre(Fp, n);\n    return l === 1;\n}\n// CURVE.n lengths\nfunction nLength(n, nBitLength) {\n    // Bit size, byte size of CURVE.n\n    if (nBitLength !== undefined)\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.anumber)(nBitLength);\n    const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n    const nByteLength = Math.ceil(_nBitLength / 8);\n    return { nBitLength: _nBitLength, nByteLength };\n}\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nfunction Field(ORDER, bitLenOrOpts, // TODO: use opts only in v2?\nisLE = false, opts = {}) {\n    if (ORDER <= _0n)\n        throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n    let _nbitLength = undefined;\n    let _sqrt = undefined;\n    let modFromBytes = false;\n    let allowedLengths = undefined;\n    if (typeof bitLenOrOpts === 'object' && bitLenOrOpts != null) {\n        if (opts.sqrt || isLE)\n            throw new Error('cannot specify opts in two arguments');\n        const _opts = bitLenOrOpts;\n        if (_opts.BITS)\n            _nbitLength = _opts.BITS;\n        if (_opts.sqrt)\n            _sqrt = _opts.sqrt;\n        if (typeof _opts.isLE === 'boolean')\n            isLE = _opts.isLE;\n        if (typeof _opts.modFromBytes === 'boolean')\n            modFromBytes = _opts.modFromBytes;\n        allowedLengths = _opts.allowedLengths;\n    }\n    else {\n        if (typeof bitLenOrOpts === 'number')\n            _nbitLength = bitLenOrOpts;\n        if (opts.sqrt)\n            _sqrt = opts.sqrt;\n    }\n    const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, _nbitLength);\n    if (BYTES > 2048)\n        throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n    let sqrtP; // cached sqrtP\n    const f = Object.freeze({\n        ORDER,\n        isLE,\n        BITS,\n        BYTES,\n        MASK: (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bitMask)(BITS),\n        ZERO: _0n,\n        ONE: _1n,\n        allowedLengths: allowedLengths,\n        create: (num) => mod(num, ORDER),\n        isValid: (num) => {\n            if (typeof num !== 'bigint')\n                throw new Error('invalid field element: expected bigint, got ' + typeof num);\n            return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n        },\n        is0: (num) => num === _0n,\n        // is valid and invertible\n        isValidNot0: (num) => !f.is0(num) && f.isValid(num),\n        isOdd: (num) => (num & _1n) === _1n,\n        neg: (num) => mod(-num, ORDER),\n        eql: (lhs, rhs) => lhs === rhs,\n        sqr: (num) => mod(num * num, ORDER),\n        add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n        sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n        mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n        pow: (num, power) => FpPow(f, num, power),\n        div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n        // Same as above, but doesn't normalize\n        sqrN: (num) => num * num,\n        addN: (lhs, rhs) => lhs + rhs,\n        subN: (lhs, rhs) => lhs - rhs,\n        mulN: (lhs, rhs) => lhs * rhs,\n        inv: (num) => invert(num, ORDER),\n        sqrt: _sqrt ||\n            ((n) => {\n                if (!sqrtP)\n                    sqrtP = FpSqrt(ORDER);\n                return sqrtP(f, n);\n            }),\n        toBytes: (num) => (isLE ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.numberToBytesLE)(num, BYTES) : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.numberToBytesBE)(num, BYTES)),\n        fromBytes: (bytes, skipValidation = true) => {\n            if (allowedLengths) {\n                if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n                    throw new Error('Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length);\n                }\n                const padded = new Uint8Array(BYTES);\n                // isLE add 0 to right, !isLE to the left.\n                padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n                bytes = padded;\n            }\n            if (bytes.length !== BYTES)\n                throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n            let scalar = isLE ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberLE)(bytes) : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberBE)(bytes);\n            if (modFromBytes)\n                scalar = mod(scalar, ORDER);\n            if (!skipValidation)\n                if (!f.isValid(scalar))\n                    throw new Error('invalid field element: outside of range 0..ORDER');\n            // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n            // protocol may allow non-reduced scalar that reduced later or changed some other way.\n            return scalar;\n        },\n        // TODO: we don't need it here, move out to separate fn\n        invertBatch: (lst) => FpInvertBatch(f, lst),\n        // We can't move this out because Fp6, Fp12 implement it\n        // and it's unclear what to return in there.\n        cmov: (a, b, c) => (c ? b : a),\n    });\n    return Object.freeze(f);\n}\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n//   const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n//   if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n//   const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n//   // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n//   const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n//   return reduced;\n// },\nfunction FpSqrtOdd(Fp, elm) {\n    if (!Fp.isOdd)\n        throw new Error(\"Field doesn't have isOdd\");\n    const root = Fp.sqrt(elm);\n    return Fp.isOdd(root) ? root : Fp.neg(root);\n}\nfunction FpSqrtEven(Fp, elm) {\n    if (!Fp.isOdd)\n        throw new Error(\"Field doesn't have isOdd\");\n    const root = Fp.sqrt(elm);\n    return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nfunction hashToPrivateScalar(hash, groupOrder, isLE = false) {\n    hash = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('privateHash', hash);\n    const hashLen = hash.length;\n    const minLen = nLength(groupOrder).nByteLength + 8;\n    if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n        throw new Error('hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen);\n    const num = isLE ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberLE)(hash) : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberBE)(hash);\n    return mod(num, groupOrder - _1n) + _1n;\n}\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nfunction getFieldBytesLength(fieldOrder) {\n    if (typeof fieldOrder !== 'bigint')\n        throw new Error('field order must be bigint');\n    const bitLength = fieldOrder.toString(2).length;\n    return Math.ceil(bitLength / 8);\n}\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nfunction getMinHashLength(fieldOrder) {\n    const length = getFieldBytesLength(fieldOrder);\n    return length + Math.ceil(length / 2);\n}\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nfunction mapHashToField(key, fieldOrder, isLE = false) {\n    const len = key.length;\n    const fieldLen = getFieldBytesLength(fieldOrder);\n    const minLen = getMinHashLength(fieldOrder);\n    // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n    if (len < 16 || len < minLen || len > 1024)\n        throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n    const num = isLE ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberLE)(key) : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberBE)(key);\n    // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n    const reduced = mod(num, fieldOrder - _1n) + _1n;\n    return isLE ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.numberToBytesLE)(reduced, fieldLen) : (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.numberToBytesBE)(reduced, fieldLen);\n}\n//# sourceMappingURL=modular.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC9tb2R1bGFyLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDa0o7QUFDbEo7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQztBQUMxQyw0QkFBNEI7QUFDNUIscUNBQXFDO0FBQ3JDLGlDQUFpQztBQUNqQztBQUNBLGlDQUFpQztBQUNqQyxtQ0FBbUM7QUFDbkMscUNBQXFDO0FBQ3JDLHFDQUFxQztBQUNyQywyQ0FBMkM7QUFDM0MsMkNBQTJDO0FBQzNDLHFDQUFxQztBQUNyQyxxQ0FBcUM7QUFDckMsMkNBQTJDO0FBQzNDLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNHO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsV0FBVyxzREFBVztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwwREFBZSxTQUFTLDBEQUFlO0FBQzlEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwwREFBZSxRQUFRLDBEQUFlO0FBQzdEO0FBQ0E7QUFDQSxrQkFBa0IsMERBQWUsc0JBQXNCLDBEQUFlO0FBQ3RFO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5vYmxlL2N1cnZlcy9lc20vYWJzdHJhY3QvbW9kdWxhci5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFV0aWxzIGZvciBtb2R1bGFyIGRpdmlzaW9uIGFuZCBmaWVsZHMuXG4gKiBGaWVsZCBvdmVyIDExIGlzIGEgZmluaXRlIChHYWxvaXMpIGZpZWxkIGlzIGludGVnZXIgbnVtYmVyIG9wZXJhdGlvbnMgYG1vZCAxMWAuXG4gKiBUaGVyZSBpcyBubyBkaXZpc2lvbjogaXQgaXMgcmVwbGFjZWQgYnkgbW9kdWxhciBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlLlxuICogQG1vZHVsZVxuICovXG4vKiEgbm9ibGUtY3VydmVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG5pbXBvcnQgeyBfdmFsaWRhdGVPYmplY3QsIGFudW1iZXIsIGJpdE1hc2ssIGJ5dGVzVG9OdW1iZXJCRSwgYnl0ZXNUb051bWJlckxFLCBlbnN1cmVCeXRlcywgbnVtYmVyVG9CeXRlc0JFLCBudW1iZXJUb0J5dGVzTEUsIH0gZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IF8wbiA9IEJpZ0ludCgwKSwgXzFuID0gQmlnSW50KDEpLCBfMm4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDIpLCBfM24gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDMpO1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBfNG4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDQpLCBfNW4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDUpLCBfN24gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDcpO1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBfOG4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDgpLCBfOW4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDkpLCBfMTZuID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgxNik7XG4vLyBDYWxjdWxhdGVzIGEgbW9kdWxvIGJcbmV4cG9ydCBmdW5jdGlvbiBtb2QoYSwgYikge1xuICAgIGNvbnN0IHJlc3VsdCA9IGEgJSBiO1xuICAgIHJldHVybiByZXN1bHQgPj0gXzBuID8gcmVzdWx0IDogYiArIHJlc3VsdDtcbn1cbi8qKlxuICogRWZmaWNpZW50bHkgcmFpc2UgbnVtIHRvIHBvd2VyIGFuZCBkbyBtb2R1bGFyIGRpdmlzaW9uLlxuICogVW5zYWZlIGluIHNvbWUgY29udGV4dHM6IHVzZXMgbGFkZGVyLCBzbyBjYW4gZXhwb3NlIGJpZ2ludCBiaXRzLlxuICogQGV4YW1wbGVcbiAqIHBvdygybiwgNm4sIDExbikgLy8gNjRuICUgMTFuID09IDluXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb3cobnVtLCBwb3dlciwgbW9kdWxvKSB7XG4gICAgcmV0dXJuIEZwUG93KEZpZWxkKG1vZHVsbyksIG51bSwgcG93ZXIpO1xufVxuLyoqIERvZXMgYHheKDJecG93ZXIpYCBtb2QgcC4gYHBvdzIoMzAsIDQpYCA9PSBgMzBeKDJeNClgICovXG5leHBvcnQgZnVuY3Rpb24gcG93Mih4LCBwb3dlciwgbW9kdWxvKSB7XG4gICAgbGV0IHJlcyA9IHg7XG4gICAgd2hpbGUgKHBvd2VyLS0gPiBfMG4pIHtcbiAgICAgICAgcmVzICo9IHJlcztcbiAgICAgICAgcmVzICU9IG1vZHVsbztcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbn1cbi8qKlxuICogSW52ZXJzZXMgbnVtYmVyIG92ZXIgbW9kdWxvLlxuICogSW1wbGVtZW50ZWQgdXNpbmcgW0V1Y2xpZGVhbiBHQ0RdKGh0dHBzOi8vYnJpbGxpYW50Lm9yZy93aWtpL2V4dGVuZGVkLWV1Y2xpZGVhbi1hbGdvcml0aG0vKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVydChudW1iZXIsIG1vZHVsbykge1xuICAgIGlmIChudW1iZXIgPT09IF8wbilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZlcnQ6IGV4cGVjdGVkIG5vbi16ZXJvIG51bWJlcicpO1xuICAgIGlmIChtb2R1bG8gPD0gXzBuKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmVydDogZXhwZWN0ZWQgcG9zaXRpdmUgbW9kdWx1cywgZ290ICcgKyBtb2R1bG8pO1xuICAgIC8vIEZlcm1hdCdzIGxpdHRsZSB0aGVvcmVtIFwiQ1QtbGlrZVwiIHZlcnNpb24gaW52KG4pID0gbl4obS0yKSBtb2QgbSBpcyAzMHggc2xvd2VyLlxuICAgIGxldCBhID0gbW9kKG51bWJlciwgbW9kdWxvKTtcbiAgICBsZXQgYiA9IG1vZHVsbztcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBsZXQgeCA9IF8wbiwgeSA9IF8xbiwgdSA9IF8xbiwgdiA9IF8wbjtcbiAgICB3aGlsZSAoYSAhPT0gXzBuKSB7XG4gICAgICAgIC8vIEpJVCBhcHBsaWVzIG9wdGltaXphdGlvbiBpZiB0aG9zZSB0d28gbGluZXMgZm9sbG93IGVhY2ggb3RoZXJcbiAgICAgICAgY29uc3QgcSA9IGIgLyBhO1xuICAgICAgICBjb25zdCByID0gYiAlIGE7XG4gICAgICAgIGNvbnN0IG0gPSB4IC0gdSAqIHE7XG4gICAgICAgIGNvbnN0IG4gPSB5IC0gdiAqIHE7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBiID0gYSwgYSA9IHIsIHggPSB1LCB5ID0gdiwgdSA9IG0sIHYgPSBuO1xuICAgIH1cbiAgICBjb25zdCBnY2QgPSBiO1xuICAgIGlmIChnY2QgIT09IF8xbilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZlcnQ6IGRvZXMgbm90IGV4aXN0Jyk7XG4gICAgcmV0dXJuIG1vZCh4LCBtb2R1bG8pO1xufVxuZnVuY3Rpb24gYXNzZXJ0SXNTcXVhcmUoRnAsIHJvb3QsIG4pIHtcbiAgICBpZiAoIUZwLmVxbChGcC5zcXIocm9vdCksIG4pKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHNxdWFyZSByb290Jyk7XG59XG4vLyBOb3QgYWxsIHJvb3RzIGFyZSBwb3NzaWJsZSEgRXhhbXBsZSB3aGljaCB3aWxsIHRocm93OlxuLy8gY29uc3QgTlVNID1cbi8vIG4gPSA3MjA1NzU5NDAzNzkyNzgxNm47XG4vLyBGcCA9IEZpZWxkKEJpZ0ludCgnMHgxYTAxMTFlYTM5N2ZlNjlhNGIxYmE3YjY0MzRiYWNkNzY0Nzc0Yjg0ZjM4NTEyYmY2NzMwZDJhMGY2YjBmNjI0MWVhYmZmZmViMTUzZmZmZmI5ZmVmZmZmZmZmZmFhYWInKSk7XG5mdW5jdGlvbiBzcXJ0M21vZDQoRnAsIG4pIHtcbiAgICBjb25zdCBwMWRpdjQgPSAoRnAuT1JERVIgKyBfMW4pIC8gXzRuO1xuICAgIGNvbnN0IHJvb3QgPSBGcC5wb3cobiwgcDFkaXY0KTtcbiAgICBhc3NlcnRJc1NxdWFyZShGcCwgcm9vdCwgbik7XG4gICAgcmV0dXJuIHJvb3Q7XG59XG5mdW5jdGlvbiBzcXJ0NW1vZDgoRnAsIG4pIHtcbiAgICBjb25zdCBwNWRpdjggPSAoRnAuT1JERVIgLSBfNW4pIC8gXzhuO1xuICAgIGNvbnN0IG4yID0gRnAubXVsKG4sIF8ybik7XG4gICAgY29uc3QgdiA9IEZwLnBvdyhuMiwgcDVkaXY4KTtcbiAgICBjb25zdCBudiA9IEZwLm11bChuLCB2KTtcbiAgICBjb25zdCBpID0gRnAubXVsKEZwLm11bChudiwgXzJuKSwgdik7XG4gICAgY29uc3Qgcm9vdCA9IEZwLm11bChudiwgRnAuc3ViKGksIEZwLk9ORSkpO1xuICAgIGFzc2VydElzU3F1YXJlKEZwLCByb290LCBuKTtcbiAgICByZXR1cm4gcm9vdDtcbn1cbi8vIEJhc2VkIG9uIFJGQzkzODAsIEtvbmcgYWxnb3JpdGhtXG4vLyBwcmV0dGllci1pZ25vcmVcbmZ1bmN0aW9uIHNxcnQ5bW9kMTYoUCkge1xuICAgIGNvbnN0IEZwXyA9IEZpZWxkKFApO1xuICAgIGNvbnN0IHRuID0gdG9uZWxsaVNoYW5rcyhQKTtcbiAgICBjb25zdCBjMSA9IHRuKEZwXywgRnBfLm5lZyhGcF8uT05FKSk7IC8vICAxLiBjMSA9IHNxcnQoLTEpIGluIEYsIGkuZS4sIChjMV4yKSA9PSAtMSBpbiBGXG4gICAgY29uc3QgYzIgPSB0bihGcF8sIGMxKTsgLy8gIDIuIGMyID0gc3FydChjMSkgaW4gRiwgaS5lLiwgKGMyXjIpID09IGMxIGluIEZcbiAgICBjb25zdCBjMyA9IHRuKEZwXywgRnBfLm5lZyhjMSkpOyAvLyAgMy4gYzMgPSBzcXJ0KC1jMSkgaW4gRiwgaS5lLiwgKGMzXjIpID09IC1jMSBpbiBGXG4gICAgY29uc3QgYzQgPSAoUCArIF83bikgLyBfMTZuOyAvLyAgNC4gYzQgPSAocSArIDcpIC8gMTYgICAgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgcmV0dXJuIChGcCwgbikgPT4ge1xuICAgICAgICBsZXQgdHYxID0gRnAucG93KG4sIGM0KTsgLy8gIDEuIHR2MSA9IHheYzRcbiAgICAgICAgbGV0IHR2MiA9IEZwLm11bCh0djEsIGMxKTsgLy8gIDIuIHR2MiA9IGMxICogdHYxXG4gICAgICAgIGNvbnN0IHR2MyA9IEZwLm11bCh0djEsIGMyKTsgLy8gIDMuIHR2MyA9IGMyICogdHYxXG4gICAgICAgIGNvbnN0IHR2NCA9IEZwLm11bCh0djEsIGMzKTsgLy8gIDQuIHR2NCA9IGMzICogdHYxXG4gICAgICAgIGNvbnN0IGUxID0gRnAuZXFsKEZwLnNxcih0djIpLCBuKTsgLy8gIDUuICBlMSA9ICh0djJeMikgPT0geFxuICAgICAgICBjb25zdCBlMiA9IEZwLmVxbChGcC5zcXIodHYzKSwgbik7IC8vICA2LiAgZTIgPSAodHYzXjIpID09IHhcbiAgICAgICAgdHYxID0gRnAuY21vdih0djEsIHR2MiwgZTEpOyAvLyAgNy4gdHYxID0gQ01PVih0djEsIHR2MiwgZTEpICAjIFNlbGVjdCB0djIgaWYgKHR2Ml4yKSA9PSB4XG4gICAgICAgIHR2MiA9IEZwLmNtb3YodHY0LCB0djMsIGUyKTsgLy8gIDguIHR2MiA9IENNT1YodHY0LCB0djMsIGUyKSAgIyBTZWxlY3QgdHYzIGlmICh0djNeMikgPT0geFxuICAgICAgICBjb25zdCBlMyA9IEZwLmVxbChGcC5zcXIodHYyKSwgbik7IC8vICA5LiAgZTMgPSAodHYyXjIpID09IHhcbiAgICAgICAgY29uc3Qgcm9vdCA9IEZwLmNtb3YodHYxLCB0djIsIGUzKTsgLy8gMTAuICB6ID0gQ01PVih0djEsIHR2MiwgZTMpICAgIyBTZWxlY3Qgc3FydCBmcm9tIHR2MSAmIHR2MlxuICAgICAgICBhc3NlcnRJc1NxdWFyZShGcCwgcm9vdCwgbik7XG4gICAgICAgIHJldHVybiByb290O1xuICAgIH07XG59XG4vKipcbiAqIFRvbmVsbGktU2hhbmtzIHNxdWFyZSByb290IHNlYXJjaCBhbGdvcml0aG0uXG4gKiAxLiBodHRwczovL2VwcmludC5pYWNyLm9yZy8yMDEyLzY4NS5wZGYgKHBhZ2UgMTIpXG4gKiAyLiBTcXVhcmUgUm9vdHMgZnJvbSAxOyAyNCwgNTEsIDEwIHRvIERhbiBTaGFua3NcbiAqIEBwYXJhbSBQIGZpZWxkIG9yZGVyXG4gKiBAcmV0dXJucyBmdW5jdGlvbiB0aGF0IHRha2VzIGZpZWxkIEZwIChjcmVhdGVkIGZyb20gUCkgYW5kIG51bWJlciBuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b25lbGxpU2hhbmtzKFApIHtcbiAgICAvLyBJbml0aWFsaXphdGlvbiAocHJlY29tcHV0YXRpb24pLlxuICAgIC8vIENhY2hpbmcgaW5pdGlhbGl6YXRpb24gY291bGQgYm9vc3QgcGVyZiBieSA3JS5cbiAgICBpZiAoUCA8IF8zbilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcXJ0IGlzIG5vdCBkZWZpbmVkIGZvciBzbWFsbCBmaWVsZCcpO1xuICAgIC8vIEZhY3RvciBQIC0gMSA9IFEgKiAyXlMsIHdoZXJlIFEgaXMgb2RkXG4gICAgbGV0IFEgPSBQIC0gXzFuO1xuICAgIGxldCBTID0gMDtcbiAgICB3aGlsZSAoUSAlIF8ybiA9PT0gXzBuKSB7XG4gICAgICAgIFEgLz0gXzJuO1xuICAgICAgICBTKys7XG4gICAgfVxuICAgIC8vIEZpbmQgdGhlIGZpcnN0IHF1YWRyYXRpYyBub24tcmVzaWR1ZSBaID49IDJcbiAgICBsZXQgWiA9IF8ybjtcbiAgICBjb25zdCBfRnAgPSBGaWVsZChQKTtcbiAgICB3aGlsZSAoRnBMZWdlbmRyZShfRnAsIFopID09PSAxKSB7XG4gICAgICAgIC8vIEJhc2ljIHByaW1hbGl0eSB0ZXN0IGZvciBQLiBBZnRlciB4IGl0ZXJhdGlvbnMsIGNoYW5jZSBvZlxuICAgICAgICAvLyBub3QgZmluZGluZyBxdWFkcmF0aWMgbm9uLXJlc2lkdWUgaXMgMl54LCBzbyAyXjEwMDAuXG4gICAgICAgIGlmIChaKysgPiAxMDAwKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBzcXVhcmUgcm9vdDogcHJvYmFibHkgbm9uLXByaW1lIFAnKTtcbiAgICB9XG4gICAgLy8gRmFzdC1wYXRoOyB1c3VhbGx5IGRvbmUgYmVmb3JlIFosIGJ1dCB3ZSBkbyBcInByaW1hbGl0eSB0ZXN0XCIuXG4gICAgaWYgKFMgPT09IDEpXG4gICAgICAgIHJldHVybiBzcXJ0M21vZDQ7XG4gICAgLy8gU2xvdy1wYXRoXG4gICAgLy8gVE9ETzogdGVzdCBvbiBGcDIgYW5kIG90aGVyc1xuICAgIGxldCBjYyA9IF9GcC5wb3coWiwgUSk7IC8vIGMgPSB6XlFcbiAgICBjb25zdCBRMWRpdjIgPSAoUSArIF8xbikgLyBfMm47XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHRvbmVsbGlTbG93KEZwLCBuKSB7XG4gICAgICAgIGlmIChGcC5pczAobikpXG4gICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgLy8gQ2hlY2sgaWYgbiBpcyBhIHF1YWRyYXRpYyByZXNpZHVlIHVzaW5nIExlZ2VuZHJlIHN5bWJvbFxuICAgICAgICBpZiAoRnBMZWdlbmRyZShGcCwgbikgIT09IDEpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHNxdWFyZSByb290Jyk7XG4gICAgICAgIC8vIEluaXRpYWxpemUgdmFyaWFibGVzIGZvciB0aGUgbWFpbiBsb29wXG4gICAgICAgIGxldCBNID0gUztcbiAgICAgICAgbGV0IGMgPSBGcC5tdWwoRnAuT05FLCBjYyk7IC8vIGMgPSB6XlEsIG1vdmUgY2MgZnJvbSBmaWVsZCBfRnAgaW50byBmaWVsZCBGcFxuICAgICAgICBsZXQgdCA9IEZwLnBvdyhuLCBRKTsgLy8gdCA9IG5eUSwgZmlyc3QgZ3Vlc3MgYXQgdGhlIGZ1ZGdlIGZhY3RvclxuICAgICAgICBsZXQgUiA9IEZwLnBvdyhuLCBRMWRpdjIpOyAvLyBSID0gbl4oKFErMSkvMiksIGZpcnN0IGd1ZXNzIGF0IHRoZSBzcXVhcmUgcm9vdFxuICAgICAgICAvLyBNYWluIGxvb3BcbiAgICAgICAgLy8gd2hpbGUgdCAhPSAxXG4gICAgICAgIHdoaWxlICghRnAuZXFsKHQsIEZwLk9ORSkpIHtcbiAgICAgICAgICAgIGlmIChGcC5pczAodCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEZwLlpFUk87IC8vIGlmIHQ9MCByZXR1cm4gUj0wXG4gICAgICAgICAgICBsZXQgaSA9IDE7XG4gICAgICAgICAgICAvLyBGaW5kIHRoZSBzbWFsbGVzdCBpID49IDEgc3VjaCB0aGF0IHReKDJeaSkg4omhIDEgKG1vZCBQKVxuICAgICAgICAgICAgbGV0IHRfdG1wID0gRnAuc3FyKHQpOyAvLyB0XigyXjEpXG4gICAgICAgICAgICB3aGlsZSAoIUZwLmVxbCh0X3RtcCwgRnAuT05FKSkge1xuICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB0X3RtcCA9IEZwLnNxcih0X3RtcCk7IC8vIHReKDJeMikuLi5cbiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gTSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCBzcXVhcmUgcm9vdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBleHBvbmVudCBmb3IgYjogMl4oTSAtIGkgLSAxKVxuICAgICAgICAgICAgY29uc3QgZXhwb25lbnQgPSBfMW4gPDwgQmlnSW50KE0gLSBpIC0gMSk7IC8vIGJpZ2ludCBpcyBpbXBvcnRhbnRcbiAgICAgICAgICAgIGNvbnN0IGIgPSBGcC5wb3coYywgZXhwb25lbnQpOyAvLyBiID0gMl4oTSAtIGkgLSAxKVxuICAgICAgICAgICAgLy8gVXBkYXRlIHZhcmlhYmxlc1xuICAgICAgICAgICAgTSA9IGk7XG4gICAgICAgICAgICBjID0gRnAuc3FyKGIpOyAvLyBjID0gYl4yXG4gICAgICAgICAgICB0ID0gRnAubXVsKHQsIGMpOyAvLyB0ID0gKHQgKiBiXjIpXG4gICAgICAgICAgICBSID0gRnAubXVsKFIsIGIpOyAvLyBSID0gUipiXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFI7XG4gICAgfTtcbn1cbi8qKlxuICogU3F1YXJlIHJvb3QgZm9yIGEgZmluaXRlIGZpZWxkLiBXaWxsIHRyeSBvcHRpbWl6ZWQgdmVyc2lvbnMgZmlyc3Q6XG4gKlxuICogMS4gUCDiiaEgMyAobW9kIDQpXG4gKiAyLiBQIOKJoSA1IChtb2QgOClcbiAqIDMuIFAg4omhIDkgKG1vZCAxNilcbiAqIDQuIFRvbmVsbGktU2hhbmtzIGFsZ29yaXRobVxuICpcbiAqIERpZmZlcmVudCBhbGdvcml0aG1zIGNhbiBnaXZlIGRpZmZlcmVudCByb290cywgaXQgaXMgdXAgdG8gdXNlciB0byBkZWNpZGUgd2hpY2ggb25lIHRoZXkgd2FudC5cbiAqIEZvciBleGFtcGxlIHRoZXJlIGlzIEZwU3FydE9kZC9GcFNxcnRFdmVuIHRvIGNob2ljZSByb290IGJhc2VkIG9uIG9kZG5lc3MgKHVzZWQgZm9yIGhhc2gtdG8tY3VydmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gRnBTcXJ0KFApIHtcbiAgICAvLyBQIOKJoSAzIChtb2QgNCkgPT4g4oiabiA9IG5eKChQKzEpLzQpXG4gICAgaWYgKFAgJSBfNG4gPT09IF8zbilcbiAgICAgICAgcmV0dXJuIHNxcnQzbW9kNDtcbiAgICAvLyBQIOKJoSA1IChtb2QgOCkgPT4gQXRraW4gYWxnb3JpdGhtLCBwYWdlIDEwIG9mIGh0dHBzOi8vZXByaW50LmlhY3Iub3JnLzIwMTIvNjg1LnBkZlxuICAgIGlmIChQICUgXzhuID09PSBfNW4pXG4gICAgICAgIHJldHVybiBzcXJ0NW1vZDg7XG4gICAgLy8gUCDiiaEgOSAobW9kIDE2KSA9PiBLb25nIGFsZ29yaXRobSwgcGFnZSAxMSBvZiBodHRwczovL2VwcmludC5pYWNyLm9yZy8yMDEyLzY4NS5wZGYgKGFsZ29yaXRobSA0KVxuICAgIGlmIChQICUgXzE2biA9PT0gXzluKVxuICAgICAgICByZXR1cm4gc3FydDltb2QxNihQKTtcbiAgICAvLyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG1cbiAgICByZXR1cm4gdG9uZWxsaVNoYW5rcyhQKTtcbn1cbi8vIExpdHRsZS1lbmRpYW4gY2hlY2sgZm9yIGZpcnN0IExFIGJpdCAobGFzdCBCRSBiaXQpO1xuZXhwb3J0IGNvbnN0IGlzTmVnYXRpdmVMRSA9IChudW0sIG1vZHVsbykgPT4gKG1vZChudW0sIG1vZHVsbykgJiBfMW4pID09PSBfMW47XG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IEZJRUxEX0ZJRUxEUyA9IFtcbiAgICAnY3JlYXRlJywgJ2lzVmFsaWQnLCAnaXMwJywgJ25lZycsICdpbnYnLCAnc3FydCcsICdzcXInLFxuICAgICdlcWwnLCAnYWRkJywgJ3N1YicsICdtdWwnLCAncG93JywgJ2RpdicsXG4gICAgJ2FkZE4nLCAnc3ViTicsICdtdWxOJywgJ3Nxck4nXG5dO1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRmllbGQoZmllbGQpIHtcbiAgICBjb25zdCBpbml0aWFsID0ge1xuICAgICAgICBPUkRFUjogJ2JpZ2ludCcsXG4gICAgICAgIE1BU0s6ICdiaWdpbnQnLFxuICAgICAgICBCWVRFUzogJ251bWJlcicsXG4gICAgICAgIEJJVFM6ICdudW1iZXInLFxuICAgIH07XG4gICAgY29uc3Qgb3B0cyA9IEZJRUxEX0ZJRUxEUy5yZWR1Y2UoKG1hcCwgdmFsKSA9PiB7XG4gICAgICAgIG1hcFt2YWxdID0gJ2Z1bmN0aW9uJztcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCBpbml0aWFsKTtcbiAgICBfdmFsaWRhdGVPYmplY3QoZmllbGQsIG9wdHMpO1xuICAgIC8vIGNvbnN0IG1heCA9IDE2Mzg0O1xuICAgIC8vIGlmIChmaWVsZC5CWVRFUyA8IDEgfHwgZmllbGQuQllURVMgPiBtYXgpIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmaWVsZCcpO1xuICAgIC8vIGlmIChmaWVsZC5CSVRTIDwgMSB8fCBmaWVsZC5CSVRTID4gOCAqIG1heCkgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZpZWxkJyk7XG4gICAgcmV0dXJuIGZpZWxkO1xufVxuLy8gR2VuZXJpYyBmaWVsZCBmdW5jdGlvbnNcbi8qKlxuICogU2FtZSBhcyBgcG93YCBidXQgZm9yIEZwOiBub24tY29uc3RhbnQtdGltZS5cbiAqIFVuc2FmZSBpbiBzb21lIGNvbnRleHRzOiB1c2VzIGxhZGRlciwgc28gY2FuIGV4cG9zZSBiaWdpbnQgYml0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZwUG93KEZwLCBudW0sIHBvd2VyKSB7XG4gICAgaWYgKHBvd2VyIDwgXzBuKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZXhwb25lbnQsIG5lZ2F0aXZlcyB1bnN1cHBvcnRlZCcpO1xuICAgIGlmIChwb3dlciA9PT0gXzBuKVxuICAgICAgICByZXR1cm4gRnAuT05FO1xuICAgIGlmIChwb3dlciA9PT0gXzFuKVxuICAgICAgICByZXR1cm4gbnVtO1xuICAgIGxldCBwID0gRnAuT05FO1xuICAgIGxldCBkID0gbnVtO1xuICAgIHdoaWxlIChwb3dlciA+IF8wbikge1xuICAgICAgICBpZiAocG93ZXIgJiBfMW4pXG4gICAgICAgICAgICBwID0gRnAubXVsKHAsIGQpO1xuICAgICAgICBkID0gRnAuc3FyKGQpO1xuICAgICAgICBwb3dlciA+Pj0gXzFuO1xuICAgIH1cbiAgICByZXR1cm4gcDtcbn1cbi8qKlxuICogRWZmaWNpZW50bHkgaW52ZXJ0IGFuIGFycmF5IG9mIEZpZWxkIGVsZW1lbnRzLlxuICogRXhjZXB0aW9uLWZyZWUuIFdpbGwgcmV0dXJuIGB1bmRlZmluZWRgIGZvciAwIGVsZW1lbnRzLlxuICogQHBhcmFtIHBhc3NaZXJvIG1hcCAwIHRvIDAgKGluc3RlYWQgb2YgdW5kZWZpbmVkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gRnBJbnZlcnRCYXRjaChGcCwgbnVtcywgcGFzc1plcm8gPSBmYWxzZSkge1xuICAgIGNvbnN0IGludmVydGVkID0gbmV3IEFycmF5KG51bXMubGVuZ3RoKS5maWxsKHBhc3NaZXJvID8gRnAuWkVSTyA6IHVuZGVmaW5lZCk7XG4gICAgLy8gV2FsayBmcm9tIGZpcnN0IHRvIGxhc3QsIG11bHRpcGx5IHRoZW0gYnkgZWFjaCBvdGhlciBNT0QgcFxuICAgIGNvbnN0IG11bHRpcGxpZWRBY2MgPSBudW1zLnJlZHVjZSgoYWNjLCBudW0sIGkpID0+IHtcbiAgICAgICAgaWYgKEZwLmlzMChudW0pKVxuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgaW52ZXJ0ZWRbaV0gPSBhY2M7XG4gICAgICAgIHJldHVybiBGcC5tdWwoYWNjLCBudW0pO1xuICAgIH0sIEZwLk9ORSk7XG4gICAgLy8gSW52ZXJ0IGxhc3QgZWxlbWVudFxuICAgIGNvbnN0IGludmVydGVkQWNjID0gRnAuaW52KG11bHRpcGxpZWRBY2MpO1xuICAgIC8vIFdhbGsgZnJvbSBsYXN0IHRvIGZpcnN0LCBtdWx0aXBseSB0aGVtIGJ5IGludmVydGVkIGVhY2ggb3RoZXIgTU9EIHBcbiAgICBudW1zLnJlZHVjZVJpZ2h0KChhY2MsIG51bSwgaSkgPT4ge1xuICAgICAgICBpZiAoRnAuaXMwKG51bSkpXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICBpbnZlcnRlZFtpXSA9IEZwLm11bChhY2MsIGludmVydGVkW2ldKTtcbiAgICAgICAgcmV0dXJuIEZwLm11bChhY2MsIG51bSk7XG4gICAgfSwgaW52ZXJ0ZWRBY2MpO1xuICAgIHJldHVybiBpbnZlcnRlZDtcbn1cbi8vIFRPRE86IHJlbW92ZVxuZXhwb3J0IGZ1bmN0aW9uIEZwRGl2KEZwLCBsaHMsIHJocykge1xuICAgIHJldHVybiBGcC5tdWwobGhzLCB0eXBlb2YgcmhzID09PSAnYmlnaW50JyA/IGludmVydChyaHMsIEZwLk9SREVSKSA6IEZwLmludihyaHMpKTtcbn1cbi8qKlxuICogTGVnZW5kcmUgc3ltYm9sLlxuICogTGVnZW5kcmUgY29uc3RhbnQgaXMgdXNlZCB0byBjYWxjdWxhdGUgTGVnZW5kcmUgc3ltYm9sIChhIHwgcClcbiAqIHdoaWNoIGRlbm90ZXMgdGhlIHZhbHVlIG9mIGFeKChwLTEpLzIpIChtb2QgcCkuXG4gKlxuICogKiAoYSB8IHApIOKJoSAxICAgIGlmIGEgaXMgYSBzcXVhcmUgKG1vZCBwKSwgcXVhZHJhdGljIHJlc2lkdWVcbiAqICogKGEgfCBwKSDiiaEgLTEgICBpZiBhIGlzIG5vdCBhIHNxdWFyZSAobW9kIHApLCBxdWFkcmF0aWMgbm9uIHJlc2lkdWVcbiAqICogKGEgfCBwKSDiiaEgMCAgICBpZiBhIOKJoSAwIChtb2QgcClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZwTGVnZW5kcmUoRnAsIG4pIHtcbiAgICAvLyBXZSBjYW4gdXNlIDNyZCBhcmd1bWVudCBhcyBvcHRpb25hbCBjYWNoZSBvZiB0aGlzIHZhbHVlXG4gICAgLy8gYnV0IHNlZW1zIHVubmVlZGVkIGZvciBub3cuIFRoZSBvcGVyYXRpb24gaXMgdmVyeSBmYXN0LlxuICAgIGNvbnN0IHAxbW9kMiA9IChGcC5PUkRFUiAtIF8xbikgLyBfMm47XG4gICAgY29uc3QgcG93ZXJlZCA9IEZwLnBvdyhuLCBwMW1vZDIpO1xuICAgIGNvbnN0IHllcyA9IEZwLmVxbChwb3dlcmVkLCBGcC5PTkUpO1xuICAgIGNvbnN0IHplcm8gPSBGcC5lcWwocG93ZXJlZCwgRnAuWkVSTyk7XG4gICAgY29uc3Qgbm8gPSBGcC5lcWwocG93ZXJlZCwgRnAubmVnKEZwLk9ORSkpO1xuICAgIGlmICgheWVzICYmICF6ZXJvICYmICFubylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIExlZ2VuZHJlIHN5bWJvbCByZXN1bHQnKTtcbiAgICByZXR1cm4geWVzID8gMSA6IHplcm8gPyAwIDogLTE7XG59XG4vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVHJ1ZSB3aGVuZXZlciB0aGUgdmFsdWUgeCBpcyBhIHNxdWFyZSBpbiB0aGUgZmllbGQgRi5cbmV4cG9ydCBmdW5jdGlvbiBGcElzU3F1YXJlKEZwLCBuKSB7XG4gICAgY29uc3QgbCA9IEZwTGVnZW5kcmUoRnAsIG4pO1xuICAgIHJldHVybiBsID09PSAxO1xufVxuLy8gQ1VSVkUubiBsZW5ndGhzXG5leHBvcnQgZnVuY3Rpb24gbkxlbmd0aChuLCBuQml0TGVuZ3RoKSB7XG4gICAgLy8gQml0IHNpemUsIGJ5dGUgc2l6ZSBvZiBDVVJWRS5uXG4gICAgaWYgKG5CaXRMZW5ndGggIT09IHVuZGVmaW5lZClcbiAgICAgICAgYW51bWJlcihuQml0TGVuZ3RoKTtcbiAgICBjb25zdCBfbkJpdExlbmd0aCA9IG5CaXRMZW5ndGggIT09IHVuZGVmaW5lZCA/IG5CaXRMZW5ndGggOiBuLnRvU3RyaW5nKDIpLmxlbmd0aDtcbiAgICBjb25zdCBuQnl0ZUxlbmd0aCA9IE1hdGguY2VpbChfbkJpdExlbmd0aCAvIDgpO1xuICAgIHJldHVybiB7IG5CaXRMZW5ndGg6IF9uQml0TGVuZ3RoLCBuQnl0ZUxlbmd0aCB9O1xufVxuLyoqXG4gKiBDcmVhdGVzIGEgZmluaXRlIGZpZWxkLiBNYWpvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zOlxuICogKiAxLiBEZW5vcm1hbGl6ZWQgb3BlcmF0aW9ucyBsaWtlIG11bE4gaW5zdGVhZCBvZiBtdWwuXG4gKiAqIDIuIElkZW50aWNhbCBvYmplY3Qgc2hhcGU6IG5ldmVyIGFkZCBvciByZW1vdmUga2V5cy5cbiAqICogMy4gYE9iamVjdC5mcmVlemVgLlxuICogRnJhZ2lsZTogYWx3YXlzIHJ1biBhIGJlbmNobWFyayBvbiBhIGNoYW5nZS5cbiAqIFNlY3VyaXR5IG5vdGU6IG9wZXJhdGlvbnMgZG9uJ3QgY2hlY2sgJ2lzVmFsaWQnIGZvciBhbGwgZWxlbWVudHMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsXG4gKiBpdCBpcyBjYWxsZXIgcmVzcG9uc2liaWxpdHkgdG8gY2hlY2sgdGhpcy5cbiAqIFRoaXMgaXMgbG93LWxldmVsIGNvZGUsIHBsZWFzZSBtYWtlIHN1cmUgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcuXG4gKlxuICogTm90ZSBhYm91dCBmaWVsZCBwcm9wZXJ0aWVzOlxuICogKiBDSEFSQUNURVJJU1RJQyBwID0gcHJpbWUgbnVtYmVyLCBudW1iZXIgb2YgZWxlbWVudHMgaW4gbWFpbiBzdWJncm91cC5cbiAqICogT1JERVIgcSA9IHNpbWlsYXIgdG8gY29mYWN0b3IgaW4gY3VydmVzLCBtYXkgYmUgY29tcG9zaXRlIGBxID0gcF5tYC5cbiAqXG4gKiBAcGFyYW0gT1JERVIgZmllbGQgb3JkZXIsIHByb2JhYmx5IHByaW1lLCBvciBjb3VsZCBiZSBjb21wb3NpdGVcbiAqIEBwYXJhbSBiaXRMZW4gaG93IG1hbnkgYml0cyB0aGUgZmllbGQgY29uc3VtZXNcbiAqIEBwYXJhbSBpc0xFIChkZWZhdWx0OiBmYWxzZSkgaWYgZW5jb2RpbmcgLyBkZWNvZGluZyBzaG91bGQgYmUgaW4gbGl0dGxlLWVuZGlhblxuICogQHBhcmFtIHJlZGVmIG9wdGlvbmFsIGZhc3RlciByZWRlZmluaXRpb25zIG9mIHNxcnQgYW5kIG90aGVyIG1ldGhvZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEZpZWxkKE9SREVSLCBiaXRMZW5Pck9wdHMsIC8vIFRPRE86IHVzZSBvcHRzIG9ubHkgaW4gdjI/XG5pc0xFID0gZmFsc2UsIG9wdHMgPSB7fSkge1xuICAgIGlmIChPUkRFUiA8PSBfMG4pXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmaWVsZDogZXhwZWN0ZWQgT1JERVIgPiAwLCBnb3QgJyArIE9SREVSKTtcbiAgICBsZXQgX25iaXRMZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgbGV0IF9zcXJ0ID0gdW5kZWZpbmVkO1xuICAgIGxldCBtb2RGcm9tQnl0ZXMgPSBmYWxzZTtcbiAgICBsZXQgYWxsb3dlZExlbmd0aHMgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHR5cGVvZiBiaXRMZW5Pck9wdHMgPT09ICdvYmplY3QnICYmIGJpdExlbk9yT3B0cyAhPSBudWxsKSB7XG4gICAgICAgIGlmIChvcHRzLnNxcnQgfHwgaXNMRSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY2Fubm90IHNwZWNpZnkgb3B0cyBpbiB0d28gYXJndW1lbnRzJyk7XG4gICAgICAgIGNvbnN0IF9vcHRzID0gYml0TGVuT3JPcHRzO1xuICAgICAgICBpZiAoX29wdHMuQklUUylcbiAgICAgICAgICAgIF9uYml0TGVuZ3RoID0gX29wdHMuQklUUztcbiAgICAgICAgaWYgKF9vcHRzLnNxcnQpXG4gICAgICAgICAgICBfc3FydCA9IF9vcHRzLnNxcnQ7XG4gICAgICAgIGlmICh0eXBlb2YgX29wdHMuaXNMRSA9PT0gJ2Jvb2xlYW4nKVxuICAgICAgICAgICAgaXNMRSA9IF9vcHRzLmlzTEU7XG4gICAgICAgIGlmICh0eXBlb2YgX29wdHMubW9kRnJvbUJ5dGVzID09PSAnYm9vbGVhbicpXG4gICAgICAgICAgICBtb2RGcm9tQnl0ZXMgPSBfb3B0cy5tb2RGcm9tQnl0ZXM7XG4gICAgICAgIGFsbG93ZWRMZW5ndGhzID0gX29wdHMuYWxsb3dlZExlbmd0aHM7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAodHlwZW9mIGJpdExlbk9yT3B0cyA9PT0gJ251bWJlcicpXG4gICAgICAgICAgICBfbmJpdExlbmd0aCA9IGJpdExlbk9yT3B0cztcbiAgICAgICAgaWYgKG9wdHMuc3FydClcbiAgICAgICAgICAgIF9zcXJ0ID0gb3B0cy5zcXJ0O1xuICAgIH1cbiAgICBjb25zdCB7IG5CaXRMZW5ndGg6IEJJVFMsIG5CeXRlTGVuZ3RoOiBCWVRFUyB9ID0gbkxlbmd0aChPUkRFUiwgX25iaXRMZW5ndGgpO1xuICAgIGlmIChCWVRFUyA+IDIwNDgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBmaWVsZDogZXhwZWN0ZWQgT1JERVIgb2YgPD0gMjA0OCBieXRlcycpO1xuICAgIGxldCBzcXJ0UDsgLy8gY2FjaGVkIHNxcnRQXG4gICAgY29uc3QgZiA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBPUkRFUixcbiAgICAgICAgaXNMRSxcbiAgICAgICAgQklUUyxcbiAgICAgICAgQllURVMsXG4gICAgICAgIE1BU0s6IGJpdE1hc2soQklUUyksXG4gICAgICAgIFpFUk86IF8wbixcbiAgICAgICAgT05FOiBfMW4sXG4gICAgICAgIGFsbG93ZWRMZW5ndGhzOiBhbGxvd2VkTGVuZ3RocyxcbiAgICAgICAgY3JlYXRlOiAobnVtKSA9PiBtb2QobnVtLCBPUkRFUiksXG4gICAgICAgIGlzVmFsaWQ6IChudW0pID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbnVtICE9PSAnYmlnaW50JylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZmllbGQgZWxlbWVudDogZXhwZWN0ZWQgYmlnaW50LCBnb3QgJyArIHR5cGVvZiBudW0pO1xuICAgICAgICAgICAgcmV0dXJuIF8wbiA8PSBudW0gJiYgbnVtIDwgT1JERVI7IC8vIDAgaXMgdmFsaWQgZWxlbWVudCwgYnV0IGl0J3Mgbm90IGludmVydGlibGVcbiAgICAgICAgfSxcbiAgICAgICAgaXMwOiAobnVtKSA9PiBudW0gPT09IF8wbixcbiAgICAgICAgLy8gaXMgdmFsaWQgYW5kIGludmVydGlibGVcbiAgICAgICAgaXNWYWxpZE5vdDA6IChudW0pID0+ICFmLmlzMChudW0pICYmIGYuaXNWYWxpZChudW0pLFxuICAgICAgICBpc09kZDogKG51bSkgPT4gKG51bSAmIF8xbikgPT09IF8xbixcbiAgICAgICAgbmVnOiAobnVtKSA9PiBtb2QoLW51bSwgT1JERVIpLFxuICAgICAgICBlcWw6IChsaHMsIHJocykgPT4gbGhzID09PSByaHMsXG4gICAgICAgIHNxcjogKG51bSkgPT4gbW9kKG51bSAqIG51bSwgT1JERVIpLFxuICAgICAgICBhZGQ6IChsaHMsIHJocykgPT4gbW9kKGxocyArIHJocywgT1JERVIpLFxuICAgICAgICBzdWI6IChsaHMsIHJocykgPT4gbW9kKGxocyAtIHJocywgT1JERVIpLFxuICAgICAgICBtdWw6IChsaHMsIHJocykgPT4gbW9kKGxocyAqIHJocywgT1JERVIpLFxuICAgICAgICBwb3c6IChudW0sIHBvd2VyKSA9PiBGcFBvdyhmLCBudW0sIHBvd2VyKSxcbiAgICAgICAgZGl2OiAobGhzLCByaHMpID0+IG1vZChsaHMgKiBpbnZlcnQocmhzLCBPUkRFUiksIE9SREVSKSxcbiAgICAgICAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IGRvZXNuJ3Qgbm9ybWFsaXplXG4gICAgICAgIHNxck46IChudW0pID0+IG51bSAqIG51bSxcbiAgICAgICAgYWRkTjogKGxocywgcmhzKSA9PiBsaHMgKyByaHMsXG4gICAgICAgIHN1Yk46IChsaHMsIHJocykgPT4gbGhzIC0gcmhzLFxuICAgICAgICBtdWxOOiAobGhzLCByaHMpID0+IGxocyAqIHJocyxcbiAgICAgICAgaW52OiAobnVtKSA9PiBpbnZlcnQobnVtLCBPUkRFUiksXG4gICAgICAgIHNxcnQ6IF9zcXJ0IHx8XG4gICAgICAgICAgICAoKG4pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXNxcnRQKVxuICAgICAgICAgICAgICAgICAgICBzcXJ0UCA9IEZwU3FydChPUkRFUik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNxcnRQKGYsIG4pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgIHRvQnl0ZXM6IChudW0pID0+IChpc0xFID8gbnVtYmVyVG9CeXRlc0xFKG51bSwgQllURVMpIDogbnVtYmVyVG9CeXRlc0JFKG51bSwgQllURVMpKSxcbiAgICAgICAgZnJvbUJ5dGVzOiAoYnl0ZXMsIHNraXBWYWxpZGF0aW9uID0gdHJ1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGFsbG93ZWRMZW5ndGhzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhbGxvd2VkTGVuZ3Rocy5pbmNsdWRlcyhieXRlcy5sZW5ndGgpIHx8IGJ5dGVzLmxlbmd0aCA+IEJZVEVTKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRmllbGQuZnJvbUJ5dGVzOiBleHBlY3RlZCAnICsgYWxsb3dlZExlbmd0aHMgKyAnIGJ5dGVzLCBnb3QgJyArIGJ5dGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhZGRlZCA9IG5ldyBVaW50OEFycmF5KEJZVEVTKTtcbiAgICAgICAgICAgICAgICAvLyBpc0xFIGFkZCAwIHRvIHJpZ2h0LCAhaXNMRSB0byB0aGUgbGVmdC5cbiAgICAgICAgICAgICAgICBwYWRkZWQuc2V0KGJ5dGVzLCBpc0xFID8gMCA6IHBhZGRlZC5sZW5ndGggLSBieXRlcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgIGJ5dGVzID0gcGFkZGVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGJ5dGVzLmxlbmd0aCAhPT0gQllURVMpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaWVsZC5mcm9tQnl0ZXM6IGV4cGVjdGVkICcgKyBCWVRFUyArICcgYnl0ZXMsIGdvdCAnICsgYnl0ZXMubGVuZ3RoKTtcbiAgICAgICAgICAgIGxldCBzY2FsYXIgPSBpc0xFID8gYnl0ZXNUb051bWJlckxFKGJ5dGVzKSA6IGJ5dGVzVG9OdW1iZXJCRShieXRlcyk7XG4gICAgICAgICAgICBpZiAobW9kRnJvbUJ5dGVzKVxuICAgICAgICAgICAgICAgIHNjYWxhciA9IG1vZChzY2FsYXIsIE9SREVSKTtcbiAgICAgICAgICAgIGlmICghc2tpcFZhbGlkYXRpb24pXG4gICAgICAgICAgICAgICAgaWYgKCFmLmlzVmFsaWQoc2NhbGFyKSlcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGZpZWxkIGVsZW1lbnQ6IG91dHNpZGUgb2YgcmFuZ2UgMC4uT1JERVInKTtcbiAgICAgICAgICAgIC8vIE5PVEU6IHdlIGRvbid0IHZhbGlkYXRlIHNjYWxhciBoZXJlLCBwbGVhc2UgdXNlIGlzVmFsaWQuIFRoaXMgZG9uZSBzdWNoIHdheSBiZWNhdXNlIHNvbWVcbiAgICAgICAgICAgIC8vIHByb3RvY29sIG1heSBhbGxvdyBub24tcmVkdWNlZCBzY2FsYXIgdGhhdCByZWR1Y2VkIGxhdGVyIG9yIGNoYW5nZWQgc29tZSBvdGhlciB3YXkuXG4gICAgICAgICAgICByZXR1cm4gc2NhbGFyO1xuICAgICAgICB9LFxuICAgICAgICAvLyBUT0RPOiB3ZSBkb24ndCBuZWVkIGl0IGhlcmUsIG1vdmUgb3V0IHRvIHNlcGFyYXRlIGZuXG4gICAgICAgIGludmVydEJhdGNoOiAobHN0KSA9PiBGcEludmVydEJhdGNoKGYsIGxzdCksXG4gICAgICAgIC8vIFdlIGNhbid0IG1vdmUgdGhpcyBvdXQgYmVjYXVzZSBGcDYsIEZwMTIgaW1wbGVtZW50IGl0XG4gICAgICAgIC8vIGFuZCBpdCdzIHVuY2xlYXIgd2hhdCB0byByZXR1cm4gaW4gdGhlcmUuXG4gICAgICAgIGNtb3Y6IChhLCBiLCBjKSA9PiAoYyA/IGIgOiBhKSxcbiAgICB9KTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZShmKTtcbn1cbi8vIEdlbmVyaWMgcmFuZG9tIHNjYWxhciwgd2UgY2FuIGRvIHNhbWUgZm9yIG90aGVyIGZpZWxkcyBpZiB2aWEgRnAyLm11bChGcDIuT05FLCBGcDIucmFuZG9tKT9cbi8vIFRoaXMgYWxsb3dzIHVuc2FmZSBtZXRob2RzIGxpa2UgaWdub3JlIGJpYXMgb3IgemVyby4gVGhlc2UgdW5zYWZlLCBidXQgb2Z0ZW4gdXNlZCBpbiBkaWZmZXJlbnQgcHJvdG9jb2xzIChpZiBkZXRlcm1pbmlzdGljIFJORykuXG4vLyB3aGljaCBtZWFuIHdlIGNhbm5vdCBmb3JjZSB0aGlzIHZpYSBvcHRzLlxuLy8gTm90IHN1cmUgd2hhdCB0byBkbyB3aXRoIHJhbmRvbUJ5dGVzLCB3ZSBjYW4gYWNjZXB0IGl0IGluc2lkZSBvcHRzIGlmIHdhbnRlZC5cbi8vIFByb2JhYmx5IG5lZWQgdG8gZXhwb3J0IGdldE1pbkhhc2hMZW5ndGggc29tZXdoZXJlP1xuLy8gcmFuZG9tKGJ5dGVzPzogVWludDhBcnJheSwgdW5zYWZlQWxsb3daZXJvID0gZmFsc2UsIHVuc2FmZUFsbG93QmlhcyA9IGZhbHNlKSB7XG4vLyAgIGNvbnN0IExFTiA9ICF1bnNhZmVBbGxvd0JpYXMgPyBnZXRNaW5IYXNoTGVuZ3RoKE9SREVSKSA6IEJZVEVTO1xuLy8gICBpZiAoYnl0ZXMgPT09IHVuZGVmaW5lZCkgYnl0ZXMgPSByYW5kb21CeXRlcyhMRU4pOyAvLyBfb3B0cy5yYW5kb21CeXRlcz9cbi8vICAgY29uc3QgbnVtID0gaXNMRSA/IGJ5dGVzVG9OdW1iZXJMRShieXRlcykgOiBieXRlc1RvTnVtYmVyQkUoYnl0ZXMpO1xuLy8gICAvLyBgbW9kKHgsIDExKWAgY2FuIHNvbWV0aW1lcyBwcm9kdWNlIDAuIGBtb2QoeCwgMTApICsgMWAgaXMgdGhlIHNhbWUsIGJ1dCBubyAwXG4vLyAgIGNvbnN0IHJlZHVjZWQgPSB1bnNhZmVBbGxvd1plcm8gPyBtb2QobnVtLCBPUkRFUikgOiBtb2QobnVtLCBPUkRFUiAtIF8xbikgKyBfMW47XG4vLyAgIHJldHVybiByZWR1Y2VkO1xuLy8gfSxcbmV4cG9ydCBmdW5jdGlvbiBGcFNxcnRPZGQoRnAsIGVsbSkge1xuICAgIGlmICghRnAuaXNPZGQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZpZWxkIGRvZXNuJ3QgaGF2ZSBpc09kZFwiKTtcbiAgICBjb25zdCByb290ID0gRnAuc3FydChlbG0pO1xuICAgIHJldHVybiBGcC5pc09kZChyb290KSA/IHJvb3QgOiBGcC5uZWcocm9vdCk7XG59XG5leHBvcnQgZnVuY3Rpb24gRnBTcXJ0RXZlbihGcCwgZWxtKSB7XG4gICAgaWYgKCFGcC5pc09kZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgZG9lc24ndCBoYXZlIGlzT2RkXCIpO1xuICAgIGNvbnN0IHJvb3QgPSBGcC5zcXJ0KGVsbSk7XG4gICAgcmV0dXJuIEZwLmlzT2RkKHJvb3QpID8gRnAubmVnKHJvb3QpIDogcm9vdDtcbn1cbi8qKlxuICogXCJDb25zdGFudC10aW1lXCIgcHJpdmF0ZSBrZXkgZ2VuZXJhdGlvbiB1dGlsaXR5LlxuICogU2FtZSBhcyBtYXBLZXlUb0ZpZWxkLCBidXQgYWNjZXB0cyBsZXNzIGJ5dGVzICg0MCBpbnN0ZWFkIG9mIDQ4IGZvciAzMi1ieXRlIGZpZWxkKS5cbiAqIFdoaWNoIG1ha2VzIGl0IHNsaWdodGx5IG1vcmUgYmlhc2VkLCBsZXNzIHNlY3VyZS5cbiAqIEBkZXByZWNhdGVkIHVzZSBgbWFwS2V5VG9GaWVsZGAgaW5zdGVhZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFRvUHJpdmF0ZVNjYWxhcihoYXNoLCBncm91cE9yZGVyLCBpc0xFID0gZmFsc2UpIHtcbiAgICBoYXNoID0gZW5zdXJlQnl0ZXMoJ3ByaXZhdGVIYXNoJywgaGFzaCk7XG4gICAgY29uc3QgaGFzaExlbiA9IGhhc2gubGVuZ3RoO1xuICAgIGNvbnN0IG1pbkxlbiA9IG5MZW5ndGgoZ3JvdXBPcmRlcikubkJ5dGVMZW5ndGggKyA4O1xuICAgIGlmIChtaW5MZW4gPCAyNCB8fCBoYXNoTGVuIDwgbWluTGVuIHx8IGhhc2hMZW4gPiAxMDI0KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hhc2hUb1ByaXZhdGVTY2FsYXI6IGV4cGVjdGVkICcgKyBtaW5MZW4gKyAnLTEwMjQgYnl0ZXMgb2YgaW5wdXQsIGdvdCAnICsgaGFzaExlbik7XG4gICAgY29uc3QgbnVtID0gaXNMRSA/IGJ5dGVzVG9OdW1iZXJMRShoYXNoKSA6IGJ5dGVzVG9OdW1iZXJCRShoYXNoKTtcbiAgICByZXR1cm4gbW9kKG51bSwgZ3JvdXBPcmRlciAtIF8xbikgKyBfMW47XG59XG4vKipcbiAqIFJldHVybnMgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSBmaWVsZCBlbGVtZW50LlxuICogRm9yIGV4YW1wbGUsIDMyIGJ5dGVzIGZvciB1c3VhbCAyNTYtYml0IHdlaWVyc3RyYXNzIGN1cnZlLlxuICogQHBhcmFtIGZpZWxkT3JkZXIgbnVtYmVyIG9mIGZpZWxkIGVsZW1lbnRzLCB1c3VhbGx5IENVUlZFLm5cbiAqIEByZXR1cm5zIGJ5dGUgbGVuZ3RoIG9mIGZpZWxkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaWVsZEJ5dGVzTGVuZ3RoKGZpZWxkT3JkZXIpIHtcbiAgICBpZiAodHlwZW9mIGZpZWxkT3JkZXIgIT09ICdiaWdpbnQnKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpZWxkIG9yZGVyIG11c3QgYmUgYmlnaW50Jyk7XG4gICAgY29uc3QgYml0TGVuZ3RoID0gZmllbGRPcmRlci50b1N0cmluZygyKS5sZW5ndGg7XG4gICAgcmV0dXJuIE1hdGguY2VpbChiaXRMZW5ndGggLyA4KTtcbn1cbi8qKlxuICogUmV0dXJucyBtaW5pbWFsIGFtb3VudCBvZiBieXRlcyB0aGF0IGNhbiBiZSBzYWZlbHkgcmVkdWNlZFxuICogYnkgZmllbGQgb3JkZXIuXG4gKiBTaG91bGQgYmUgMl4tMTI4IGZvciAxMjgtYml0IGN1cnZlIHN1Y2ggYXMgUDI1Ni5cbiAqIEBwYXJhbSBmaWVsZE9yZGVyIG51bWJlciBvZiBmaWVsZCBlbGVtZW50cywgdXN1YWxseSBDVVJWRS5uXG4gKiBAcmV0dXJucyBieXRlIGxlbmd0aCBvZiB0YXJnZXQgaGFzaFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWluSGFzaExlbmd0aChmaWVsZE9yZGVyKSB7XG4gICAgY29uc3QgbGVuZ3RoID0gZ2V0RmllbGRCeXRlc0xlbmd0aChmaWVsZE9yZGVyKTtcbiAgICByZXR1cm4gbGVuZ3RoICsgTWF0aC5jZWlsKGxlbmd0aCAvIDIpO1xufVxuLyoqXG4gKiBcIkNvbnN0YW50LXRpbWVcIiBwcml2YXRlIGtleSBnZW5lcmF0aW9uIHV0aWxpdHkuXG4gKiBDYW4gdGFrZSAobiArIG4vMikgb3IgbW9yZSBieXRlcyBvZiB1bmlmb3JtIGlucHV0IGUuZy4gZnJvbSBDU1BSTkcgb3IgS0RGXG4gKiBhbmQgY29udmVydCB0aGVtIGludG8gcHJpdmF0ZSBzY2FsYXIsIHdpdGggdGhlIG1vZHVsbyBiaWFzIGJlaW5nIG5lZ2xpZ2libGUuXG4gKiBOZWVkcyBhdCBsZWFzdCA0OCBieXRlcyBvZiBpbnB1dCBmb3IgMzItYnl0ZSBwcml2YXRlIGtleS5cbiAqIGh0dHBzOi8vcmVzZWFyY2gua3VkZWxza2lzZWN1cml0eS5jb20vMjAyMC8wNy8yOC90aGUtZGVmaW5pdGl2ZS1ndWlkZS10by1tb2R1bG8tYmlhcy1hbmQtaG93LXRvLWF2b2lkLWl0L1xuICogRklQUyAxODYtNSwgQS4yIGh0dHBzOi8vY3NyYy5uaXN0Lmdvdi9wdWJsaWNhdGlvbnMvZGV0YWlsL2ZpcHMvMTg2LzUvZmluYWxcbiAqIFJGQyA5MzgwLCBodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTM4MCNzZWN0aW9uLTVcbiAqIEBwYXJhbSBoYXNoIGhhc2ggb3V0cHV0IGZyb20gU0hBMyBvciBhIHNpbWlsYXIgZnVuY3Rpb25cbiAqIEBwYXJhbSBncm91cE9yZGVyIHNpemUgb2Ygc3ViZ3JvdXAgLSAoZS5nLiBzZWNwMjU2azEuQ1VSVkUubilcbiAqIEBwYXJhbSBpc0xFIGludGVycHJldCBoYXNoIGJ5dGVzIGFzIExFIG51bVxuICogQHJldHVybnMgdmFsaWQgcHJpdmF0ZSBzY2FsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEhhc2hUb0ZpZWxkKGtleSwgZmllbGRPcmRlciwgaXNMRSA9IGZhbHNlKSB7XG4gICAgY29uc3QgbGVuID0ga2V5Lmxlbmd0aDtcbiAgICBjb25zdCBmaWVsZExlbiA9IGdldEZpZWxkQnl0ZXNMZW5ndGgoZmllbGRPcmRlcik7XG4gICAgY29uc3QgbWluTGVuID0gZ2V0TWluSGFzaExlbmd0aChmaWVsZE9yZGVyKTtcbiAgICAvLyBObyBzbWFsbCBudW1iZXJzOiBuZWVkIHRvIHVuZGVyc3RhbmQgYmlhcyBzdG9yeS4gTm8gaHVnZSBudW1iZXJzOiBlYXNpZXIgdG8gZGV0ZWN0IEpTIHRpbWluZ3MuXG4gICAgaWYgKGxlbiA8IDE2IHx8IGxlbiA8IG1pbkxlbiB8fCBsZW4gPiAxMDI0KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2V4cGVjdGVkICcgKyBtaW5MZW4gKyAnLTEwMjQgYnl0ZXMgb2YgaW5wdXQsIGdvdCAnICsgbGVuKTtcbiAgICBjb25zdCBudW0gPSBpc0xFID8gYnl0ZXNUb051bWJlckxFKGtleSkgOiBieXRlc1RvTnVtYmVyQkUoa2V5KTtcbiAgICAvLyBgbW9kKHgsIDExKWAgY2FuIHNvbWV0aW1lcyBwcm9kdWNlIDAuIGBtb2QoeCwgMTApICsgMWAgaXMgdGhlIHNhbWUsIGJ1dCBubyAwXG4gICAgY29uc3QgcmVkdWNlZCA9IG1vZChudW0sIGZpZWxkT3JkZXIgLSBfMW4pICsgXzFuO1xuICAgIHJldHVybiBpc0xFID8gbnVtYmVyVG9CeXRlc0xFKHJlZHVjZWQsIGZpZWxkTGVuKSA6IG51bWJlclRvQnl0ZXNCRShyZWR1Y2VkLCBmaWVsZExlbik7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2R1bGFyLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/modular.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/montgomery.js":
/*!***************************************************************!*\
  !*** ./node_modules/@noble/curves/esm/abstract/montgomery.js ***!
  \***************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   montgomery: () => (/* binding */ montgomery)\n/* harmony export */ });\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/* harmony import */ var _modular_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modular.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/modular.js\");\n/**\n * Montgomery curve methods. It's not really whole montgomery curve,\n * just bunch of very specific methods for X25519 / X448 from\n * [RFC 7748](https://www.rfc-editor.org/rfc/rfc7748)\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nfunction validateOpts(curve) {\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._validateObject)(curve, {\n        adjustScalarBytes: 'function',\n        powPminus2: 'function',\n    });\n    return Object.freeze({ ...curve });\n}\nfunction montgomery(curveDef) {\n    const CURVE = validateOpts(curveDef);\n    const { P, type, adjustScalarBytes, powPminus2, randomBytes: rand } = CURVE;\n    const is25519 = type === 'x25519';\n    if (!is25519 && type !== 'x448')\n        throw new Error('invalid type');\n    const randomBytes_ = rand || _utils_js__WEBPACK_IMPORTED_MODULE_1__.randomBytes;\n    const montgomeryBits = is25519 ? 255 : 448;\n    const fieldLen = is25519 ? 32 : 56;\n    const Gu = is25519 ? BigInt(9) : BigInt(5);\n    // RFC 7748 #5:\n    // The constant a24 is (486662 - 2) / 4 = 121665 for curve25519/X25519 and\n    // (156326 - 2) / 4 = 39081 for curve448/X448\n    // const a = is25519 ? 156326n : 486662n;\n    const a24 = is25519 ? BigInt(121665) : BigInt(39081);\n    // RFC: x25519 \"the resulting integer is of the form 2^254 plus\n    // eight times a value between 0 and 2^251 - 1 (inclusive)\"\n    // x448: \"2^447 plus four times a value between 0 and 2^445 - 1 (inclusive)\"\n    const minScalar = is25519 ? _2n ** BigInt(254) : _2n ** BigInt(447);\n    const maxAdded = is25519\n        ? BigInt(8) * _2n ** BigInt(251) - _1n\n        : BigInt(4) * _2n ** BigInt(445) - _1n;\n    const maxScalar = minScalar + maxAdded + _1n; // (inclusive)\n    const modP = (n) => (0,_modular_js__WEBPACK_IMPORTED_MODULE_2__.mod)(n, P);\n    const GuBytes = encodeU(Gu);\n    function encodeU(u) {\n        return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.numberToBytesLE)(modP(u), fieldLen);\n    }\n    function decodeU(u) {\n        const _u = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('u coordinate', u, fieldLen);\n        // RFC: When receiving such an array, implementations of X25519\n        // (but not X448) MUST mask the most significant bit in the final byte.\n        if (is25519)\n            _u[31] &= 127; // 0b0111_1111\n        // RFC: Implementations MUST accept non-canonical values and process them as\n        // if they had been reduced modulo the field prime.  The non-canonical\n        // values are 2^255 - 19 through 2^255 - 1 for X25519 and 2^448 - 2^224\n        // - 1 through 2^448 - 1 for X448.\n        return modP((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberLE)(_u));\n    }\n    function decodeScalar(scalar) {\n        return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberLE)(adjustScalarBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('scalar', scalar, fieldLen)));\n    }\n    function scalarMult(scalar, u) {\n        const pu = montgomeryLadder(decodeU(u), decodeScalar(scalar));\n        // Some public keys are useless, of low-order. Curve author doesn't think\n        // it needs to be validated, but we do it nonetheless.\n        // https://cr.yp.to/ecdh.html#validate\n        if (pu === _0n)\n            throw new Error('invalid private or public key received');\n        return encodeU(pu);\n    }\n    // Computes public key from private. By doing scalar multiplication of base point.\n    function scalarMultBase(scalar) {\n        return scalarMult(scalar, GuBytes);\n    }\n    // cswap from RFC7748 \"example code\"\n    function cswap(swap, x_2, x_3) {\n        // dummy = mask(swap) AND (x_2 XOR x_3)\n        // Where mask(swap) is the all-1 or all-0 word of the same length as x_2\n        // and x_3, computed, e.g., as mask(swap) = 0 - swap.\n        const dummy = modP(swap * (x_2 - x_3));\n        x_2 = modP(x_2 - dummy); // x_2 = x_2 XOR dummy\n        x_3 = modP(x_3 + dummy); // x_3 = x_3 XOR dummy\n        return { x_2, x_3 };\n    }\n    /**\n     * Montgomery x-only multiplication ladder.\n     * @param pointU u coordinate (x) on Montgomery Curve 25519\n     * @param scalar by which the point would be multiplied\n     * @returns new Point on Montgomery curve\n     */\n    function montgomeryLadder(u, scalar) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.aInRange)('u', u, _0n, P);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.aInRange)('scalar', scalar, minScalar, maxScalar);\n        const k = scalar;\n        const x_1 = u;\n        let x_2 = _1n;\n        let z_2 = _0n;\n        let x_3 = u;\n        let z_3 = _1n;\n        let swap = _0n;\n        for (let t = BigInt(montgomeryBits - 1); t >= _0n; t--) {\n            const k_t = (k >> t) & _1n;\n            swap ^= k_t;\n            ({ x_2, x_3 } = cswap(swap, x_2, x_3));\n            ({ x_2: z_2, x_3: z_3 } = cswap(swap, z_2, z_3));\n            swap = k_t;\n            const A = x_2 + z_2;\n            const AA = modP(A * A);\n            const B = x_2 - z_2;\n            const BB = modP(B * B);\n            const E = AA - BB;\n            const C = x_3 + z_3;\n            const D = x_3 - z_3;\n            const DA = modP(D * A);\n            const CB = modP(C * B);\n            const dacb = DA + CB;\n            const da_cb = DA - CB;\n            x_3 = modP(dacb * dacb);\n            z_3 = modP(x_1 * modP(da_cb * da_cb));\n            x_2 = modP(AA * BB);\n            z_2 = modP(E * (AA + modP(a24 * E)));\n        }\n        ({ x_2, x_3 } = cswap(swap, x_2, x_3));\n        ({ x_2: z_2, x_3: z_3 } = cswap(swap, z_2, z_3));\n        const z2 = powPminus2(z_2); // `Fp.pow(x, P - _2n)` is much slower equivalent\n        return modP(x_2 * z2); // Return x_2 * (z_2^(p - 2))\n    }\n    const lengths = {\n        secretKey: fieldLen,\n        publicKey: fieldLen,\n        seed: fieldLen,\n    };\n    const randomSecretKey = (seed = randomBytes_(fieldLen)) => {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.abytes)(seed, lengths.seed);\n        return seed;\n    };\n    function keygen(seed) {\n        const secretKey = randomSecretKey(seed);\n        return { secretKey, publicKey: scalarMultBase(secretKey) };\n    }\n    const utils = {\n        randomSecretKey,\n        randomPrivateKey: randomSecretKey,\n    };\n    return {\n        keygen,\n        getSharedSecret: (secretKey, publicKey) => scalarMult(secretKey, publicKey),\n        getPublicKey: (secretKey) => scalarMultBase(secretKey),\n        scalarMult,\n        scalarMultBase,\n        utils,\n        GuBytes: GuBytes.slice(),\n        lengths,\n    };\n}\n//# sourceMappingURL=montgomery.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC9tb250Z29tZXJ5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUM2SDtBQUMxRjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksMERBQWU7QUFDbkI7QUFDQTtBQUNBLEtBQUs7QUFDTCwyQkFBMkIsVUFBVTtBQUNyQztBQUNPO0FBQ1A7QUFDQSxZQUFZLDREQUE0RDtBQUN4RTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMsa0RBQVc7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xELHdCQUF3QixnREFBRztBQUMzQjtBQUNBO0FBQ0EsZUFBZSwwREFBZTtBQUM5QjtBQUNBO0FBQ0EsbUJBQW1CLHNEQUFXO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwwREFBZTtBQUNuQztBQUNBO0FBQ0EsZUFBZSwwREFBZSxtQkFBbUIsc0RBQVc7QUFDNUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLG1EQUFRO0FBQ2hCLFFBQVEsbURBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpREFBaUQsVUFBVTtBQUMzRDtBQUNBO0FBQ0EsZUFBZSxXQUFXO0FBQzFCLGVBQWUscUJBQXFCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFdBQVc7QUFDdEIsV0FBVyxxQkFBcUI7QUFDaEMsb0NBQW9DO0FBQ3BDLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsaURBQU07QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0Bub2JsZS9jdXJ2ZXMvZXNtL2Fic3RyYWN0L21vbnRnb21lcnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNb250Z29tZXJ5IGN1cnZlIG1ldGhvZHMuIEl0J3Mgbm90IHJlYWxseSB3aG9sZSBtb250Z29tZXJ5IGN1cnZlLFxuICoganVzdCBidW5jaCBvZiB2ZXJ5IHNwZWNpZmljIG1ldGhvZHMgZm9yIFgyNTUxOSAvIFg0NDggZnJvbVxuICogW1JGQyA3NzQ4XShodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjNzc0OClcbiAqIEBtb2R1bGVcbiAqL1xuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuaW1wb3J0IHsgX3ZhbGlkYXRlT2JqZWN0LCBhYnl0ZXMsIGFJblJhbmdlLCBieXRlc1RvTnVtYmVyTEUsIGVuc3VyZUJ5dGVzLCBudW1iZXJUb0J5dGVzTEUsIHJhbmRvbUJ5dGVzLCB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgbW9kIH0gZnJvbSBcIi4vbW9kdWxhci5qc1wiO1xuY29uc3QgXzBuID0gQmlnSW50KDApO1xuY29uc3QgXzFuID0gQmlnSW50KDEpO1xuY29uc3QgXzJuID0gQmlnSW50KDIpO1xuZnVuY3Rpb24gdmFsaWRhdGVPcHRzKGN1cnZlKSB7XG4gICAgX3ZhbGlkYXRlT2JqZWN0KGN1cnZlLCB7XG4gICAgICAgIGFkanVzdFNjYWxhckJ5dGVzOiAnZnVuY3Rpb24nLFxuICAgICAgICBwb3dQbWludXMyOiAnZnVuY3Rpb24nLFxuICAgIH0pO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHsgLi4uY3VydmUgfSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbW9udGdvbWVyeShjdXJ2ZURlZikge1xuICAgIGNvbnN0IENVUlZFID0gdmFsaWRhdGVPcHRzKGN1cnZlRGVmKTtcbiAgICBjb25zdCB7IFAsIHR5cGUsIGFkanVzdFNjYWxhckJ5dGVzLCBwb3dQbWludXMyLCByYW5kb21CeXRlczogcmFuZCB9ID0gQ1VSVkU7XG4gICAgY29uc3QgaXMyNTUxOSA9IHR5cGUgPT09ICd4MjU1MTknO1xuICAgIGlmICghaXMyNTUxOSAmJiB0eXBlICE9PSAneDQ0OCcpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB0eXBlJyk7XG4gICAgY29uc3QgcmFuZG9tQnl0ZXNfID0gcmFuZCB8fCByYW5kb21CeXRlcztcbiAgICBjb25zdCBtb250Z29tZXJ5Qml0cyA9IGlzMjU1MTkgPyAyNTUgOiA0NDg7XG4gICAgY29uc3QgZmllbGRMZW4gPSBpczI1NTE5ID8gMzIgOiA1NjtcbiAgICBjb25zdCBHdSA9IGlzMjU1MTkgPyBCaWdJbnQoOSkgOiBCaWdJbnQoNSk7XG4gICAgLy8gUkZDIDc3NDggIzU6XG4gICAgLy8gVGhlIGNvbnN0YW50IGEyNCBpcyAoNDg2NjYyIC0gMikgLyA0ID0gMTIxNjY1IGZvciBjdXJ2ZTI1NTE5L1gyNTUxOSBhbmRcbiAgICAvLyAoMTU2MzI2IC0gMikgLyA0ID0gMzkwODEgZm9yIGN1cnZlNDQ4L1g0NDhcbiAgICAvLyBjb25zdCBhID0gaXMyNTUxOSA/IDE1NjMyNm4gOiA0ODY2NjJuO1xuICAgIGNvbnN0IGEyNCA9IGlzMjU1MTkgPyBCaWdJbnQoMTIxNjY1KSA6IEJpZ0ludCgzOTA4MSk7XG4gICAgLy8gUkZDOiB4MjU1MTkgXCJ0aGUgcmVzdWx0aW5nIGludGVnZXIgaXMgb2YgdGhlIGZvcm0gMl4yNTQgcGx1c1xuICAgIC8vIGVpZ2h0IHRpbWVzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyXjI1MSAtIDEgKGluY2x1c2l2ZSlcIlxuICAgIC8vIHg0NDg6IFwiMl40NDcgcGx1cyBmb3VyIHRpbWVzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCAyXjQ0NSAtIDEgKGluY2x1c2l2ZSlcIlxuICAgIGNvbnN0IG1pblNjYWxhciA9IGlzMjU1MTkgPyBfMm4gKiogQmlnSW50KDI1NCkgOiBfMm4gKiogQmlnSW50KDQ0Nyk7XG4gICAgY29uc3QgbWF4QWRkZWQgPSBpczI1NTE5XG4gICAgICAgID8gQmlnSW50KDgpICogXzJuICoqIEJpZ0ludCgyNTEpIC0gXzFuXG4gICAgICAgIDogQmlnSW50KDQpICogXzJuICoqIEJpZ0ludCg0NDUpIC0gXzFuO1xuICAgIGNvbnN0IG1heFNjYWxhciA9IG1pblNjYWxhciArIG1heEFkZGVkICsgXzFuOyAvLyAoaW5jbHVzaXZlKVxuICAgIGNvbnN0IG1vZFAgPSAobikgPT4gbW9kKG4sIFApO1xuICAgIGNvbnN0IEd1Qnl0ZXMgPSBlbmNvZGVVKEd1KTtcbiAgICBmdW5jdGlvbiBlbmNvZGVVKHUpIHtcbiAgICAgICAgcmV0dXJuIG51bWJlclRvQnl0ZXNMRShtb2RQKHUpLCBmaWVsZExlbik7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGRlY29kZVUodSkge1xuICAgICAgICBjb25zdCBfdSA9IGVuc3VyZUJ5dGVzKCd1IGNvb3JkaW5hdGUnLCB1LCBmaWVsZExlbik7XG4gICAgICAgIC8vIFJGQzogV2hlbiByZWNlaXZpbmcgc3VjaCBhbiBhcnJheSwgaW1wbGVtZW50YXRpb25zIG9mIFgyNTUxOVxuICAgICAgICAvLyAoYnV0IG5vdCBYNDQ4KSBNVVNUIG1hc2sgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGluIHRoZSBmaW5hbCBieXRlLlxuICAgICAgICBpZiAoaXMyNTUxOSlcbiAgICAgICAgICAgIF91WzMxXSAmPSAxMjc7IC8vIDBiMDExMV8xMTExXG4gICAgICAgIC8vIFJGQzogSW1wbGVtZW50YXRpb25zIE1VU1QgYWNjZXB0IG5vbi1jYW5vbmljYWwgdmFsdWVzIGFuZCBwcm9jZXNzIHRoZW0gYXNcbiAgICAgICAgLy8gaWYgdGhleSBoYWQgYmVlbiByZWR1Y2VkIG1vZHVsbyB0aGUgZmllbGQgcHJpbWUuICBUaGUgbm9uLWNhbm9uaWNhbFxuICAgICAgICAvLyB2YWx1ZXMgYXJlIDJeMjU1IC0gMTkgdGhyb3VnaCAyXjI1NSAtIDEgZm9yIFgyNTUxOSBhbmQgMl40NDggLSAyXjIyNFxuICAgICAgICAvLyAtIDEgdGhyb3VnaCAyXjQ0OCAtIDEgZm9yIFg0NDguXG4gICAgICAgIHJldHVybiBtb2RQKGJ5dGVzVG9OdW1iZXJMRShfdSkpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBkZWNvZGVTY2FsYXIoc2NhbGFyKSB7XG4gICAgICAgIHJldHVybiBieXRlc1RvTnVtYmVyTEUoYWRqdXN0U2NhbGFyQnl0ZXMoZW5zdXJlQnl0ZXMoJ3NjYWxhcicsIHNjYWxhciwgZmllbGRMZW4pKSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHNjYWxhck11bHQoc2NhbGFyLCB1KSB7XG4gICAgICAgIGNvbnN0IHB1ID0gbW9udGdvbWVyeUxhZGRlcihkZWNvZGVVKHUpLCBkZWNvZGVTY2FsYXIoc2NhbGFyKSk7XG4gICAgICAgIC8vIFNvbWUgcHVibGljIGtleXMgYXJlIHVzZWxlc3MsIG9mIGxvdy1vcmRlci4gQ3VydmUgYXV0aG9yIGRvZXNuJ3QgdGhpbmtcbiAgICAgICAgLy8gaXQgbmVlZHMgdG8gYmUgdmFsaWRhdGVkLCBidXQgd2UgZG8gaXQgbm9uZXRoZWxlc3MuXG4gICAgICAgIC8vIGh0dHBzOi8vY3IueXAudG8vZWNkaC5odG1sI3ZhbGlkYXRlXG4gICAgICAgIGlmIChwdSA9PT0gXzBuKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHByaXZhdGUgb3IgcHVibGljIGtleSByZWNlaXZlZCcpO1xuICAgICAgICByZXR1cm4gZW5jb2RlVShwdSk7XG4gICAgfVxuICAgIC8vIENvbXB1dGVzIHB1YmxpYyBrZXkgZnJvbSBwcml2YXRlLiBCeSBkb2luZyBzY2FsYXIgbXVsdGlwbGljYXRpb24gb2YgYmFzZSBwb2ludC5cbiAgICBmdW5jdGlvbiBzY2FsYXJNdWx0QmFzZShzY2FsYXIpIHtcbiAgICAgICAgcmV0dXJuIHNjYWxhck11bHQoc2NhbGFyLCBHdUJ5dGVzKTtcbiAgICB9XG4gICAgLy8gY3N3YXAgZnJvbSBSRkM3NzQ4IFwiZXhhbXBsZSBjb2RlXCJcbiAgICBmdW5jdGlvbiBjc3dhcChzd2FwLCB4XzIsIHhfMykge1xuICAgICAgICAvLyBkdW1teSA9IG1hc2soc3dhcCkgQU5EICh4XzIgWE9SIHhfMylcbiAgICAgICAgLy8gV2hlcmUgbWFzayhzd2FwKSBpcyB0aGUgYWxsLTEgb3IgYWxsLTAgd29yZCBvZiB0aGUgc2FtZSBsZW5ndGggYXMgeF8yXG4gICAgICAgIC8vIGFuZCB4XzMsIGNvbXB1dGVkLCBlLmcuLCBhcyBtYXNrKHN3YXApID0gMCAtIHN3YXAuXG4gICAgICAgIGNvbnN0IGR1bW15ID0gbW9kUChzd2FwICogKHhfMiAtIHhfMykpO1xuICAgICAgICB4XzIgPSBtb2RQKHhfMiAtIGR1bW15KTsgLy8geF8yID0geF8yIFhPUiBkdW1teVxuICAgICAgICB4XzMgPSBtb2RQKHhfMyArIGR1bW15KTsgLy8geF8zID0geF8zIFhPUiBkdW1teVxuICAgICAgICByZXR1cm4geyB4XzIsIHhfMyB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNb250Z29tZXJ5IHgtb25seSBtdWx0aXBsaWNhdGlvbiBsYWRkZXIuXG4gICAgICogQHBhcmFtIHBvaW50VSB1IGNvb3JkaW5hdGUgKHgpIG9uIE1vbnRnb21lcnkgQ3VydmUgMjU1MTlcbiAgICAgKiBAcGFyYW0gc2NhbGFyIGJ5IHdoaWNoIHRoZSBwb2ludCB3b3VsZCBiZSBtdWx0aXBsaWVkXG4gICAgICogQHJldHVybnMgbmV3IFBvaW50IG9uIE1vbnRnb21lcnkgY3VydmVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBtb250Z29tZXJ5TGFkZGVyKHUsIHNjYWxhcikge1xuICAgICAgICBhSW5SYW5nZSgndScsIHUsIF8wbiwgUCk7XG4gICAgICAgIGFJblJhbmdlKCdzY2FsYXInLCBzY2FsYXIsIG1pblNjYWxhciwgbWF4U2NhbGFyKTtcbiAgICAgICAgY29uc3QgayA9IHNjYWxhcjtcbiAgICAgICAgY29uc3QgeF8xID0gdTtcbiAgICAgICAgbGV0IHhfMiA9IF8xbjtcbiAgICAgICAgbGV0IHpfMiA9IF8wbjtcbiAgICAgICAgbGV0IHhfMyA9IHU7XG4gICAgICAgIGxldCB6XzMgPSBfMW47XG4gICAgICAgIGxldCBzd2FwID0gXzBuO1xuICAgICAgICBmb3IgKGxldCB0ID0gQmlnSW50KG1vbnRnb21lcnlCaXRzIC0gMSk7IHQgPj0gXzBuOyB0LS0pIHtcbiAgICAgICAgICAgIGNvbnN0IGtfdCA9IChrID4+IHQpICYgXzFuO1xuICAgICAgICAgICAgc3dhcCBePSBrX3Q7XG4gICAgICAgICAgICAoeyB4XzIsIHhfMyB9ID0gY3N3YXAoc3dhcCwgeF8yLCB4XzMpKTtcbiAgICAgICAgICAgICh7IHhfMjogel8yLCB4XzM6IHpfMyB9ID0gY3N3YXAoc3dhcCwgel8yLCB6XzMpKTtcbiAgICAgICAgICAgIHN3YXAgPSBrX3Q7XG4gICAgICAgICAgICBjb25zdCBBID0geF8yICsgel8yO1xuICAgICAgICAgICAgY29uc3QgQUEgPSBtb2RQKEEgKiBBKTtcbiAgICAgICAgICAgIGNvbnN0IEIgPSB4XzIgLSB6XzI7XG4gICAgICAgICAgICBjb25zdCBCQiA9IG1vZFAoQiAqIEIpO1xuICAgICAgICAgICAgY29uc3QgRSA9IEFBIC0gQkI7XG4gICAgICAgICAgICBjb25zdCBDID0geF8zICsgel8zO1xuICAgICAgICAgICAgY29uc3QgRCA9IHhfMyAtIHpfMztcbiAgICAgICAgICAgIGNvbnN0IERBID0gbW9kUChEICogQSk7XG4gICAgICAgICAgICBjb25zdCBDQiA9IG1vZFAoQyAqIEIpO1xuICAgICAgICAgICAgY29uc3QgZGFjYiA9IERBICsgQ0I7XG4gICAgICAgICAgICBjb25zdCBkYV9jYiA9IERBIC0gQ0I7XG4gICAgICAgICAgICB4XzMgPSBtb2RQKGRhY2IgKiBkYWNiKTtcbiAgICAgICAgICAgIHpfMyA9IG1vZFAoeF8xICogbW9kUChkYV9jYiAqIGRhX2NiKSk7XG4gICAgICAgICAgICB4XzIgPSBtb2RQKEFBICogQkIpO1xuICAgICAgICAgICAgel8yID0gbW9kUChFICogKEFBICsgbW9kUChhMjQgKiBFKSkpO1xuICAgICAgICB9XG4gICAgICAgICh7IHhfMiwgeF8zIH0gPSBjc3dhcChzd2FwLCB4XzIsIHhfMykpO1xuICAgICAgICAoeyB4XzI6IHpfMiwgeF8zOiB6XzMgfSA9IGNzd2FwKHN3YXAsIHpfMiwgel8zKSk7XG4gICAgICAgIGNvbnN0IHoyID0gcG93UG1pbnVzMih6XzIpOyAvLyBgRnAucG93KHgsIFAgLSBfMm4pYCBpcyBtdWNoIHNsb3dlciBlcXVpdmFsZW50XG4gICAgICAgIHJldHVybiBtb2RQKHhfMiAqIHoyKTsgLy8gUmV0dXJuIHhfMiAqICh6XzJeKHAgLSAyKSlcbiAgICB9XG4gICAgY29uc3QgbGVuZ3RocyA9IHtcbiAgICAgICAgc2VjcmV0S2V5OiBmaWVsZExlbixcbiAgICAgICAgcHVibGljS2V5OiBmaWVsZExlbixcbiAgICAgICAgc2VlZDogZmllbGRMZW4sXG4gICAgfTtcbiAgICBjb25zdCByYW5kb21TZWNyZXRLZXkgPSAoc2VlZCA9IHJhbmRvbUJ5dGVzXyhmaWVsZExlbikpID0+IHtcbiAgICAgICAgYWJ5dGVzKHNlZWQsIGxlbmd0aHMuc2VlZCk7XG4gICAgICAgIHJldHVybiBzZWVkO1xuICAgIH07XG4gICAgZnVuY3Rpb24ga2V5Z2VuKHNlZWQpIHtcbiAgICAgICAgY29uc3Qgc2VjcmV0S2V5ID0gcmFuZG9tU2VjcmV0S2V5KHNlZWQpO1xuICAgICAgICByZXR1cm4geyBzZWNyZXRLZXksIHB1YmxpY0tleTogc2NhbGFyTXVsdEJhc2Uoc2VjcmV0S2V5KSB9O1xuICAgIH1cbiAgICBjb25zdCB1dGlscyA9IHtcbiAgICAgICAgcmFuZG9tU2VjcmV0S2V5LFxuICAgICAgICByYW5kb21Qcml2YXRlS2V5OiByYW5kb21TZWNyZXRLZXksXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBrZXlnZW4sXG4gICAgICAgIGdldFNoYXJlZFNlY3JldDogKHNlY3JldEtleSwgcHVibGljS2V5KSA9PiBzY2FsYXJNdWx0KHNlY3JldEtleSwgcHVibGljS2V5KSxcbiAgICAgICAgZ2V0UHVibGljS2V5OiAoc2VjcmV0S2V5KSA9PiBzY2FsYXJNdWx0QmFzZShzZWNyZXRLZXkpLFxuICAgICAgICBzY2FsYXJNdWx0LFxuICAgICAgICBzY2FsYXJNdWx0QmFzZSxcbiAgICAgICAgdXRpbHMsXG4gICAgICAgIEd1Qnl0ZXM6IEd1Qnl0ZXMuc2xpY2UoKSxcbiAgICAgICAgbGVuZ3RocyxcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9bW9udGdvbWVyeS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/montgomery.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/utils.js":
/*!**********************************************************!*\
  !*** ./node_modules/@noble/curves/esm/abstract/utils.js ***!
  \**********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   aInRange: () => (/* binding */ aInRange),\n/* harmony export */   abool: () => (/* binding */ abool),\n/* harmony export */   abytes: () => (/* binding */ abytes),\n/* harmony export */   anumber: () => (/* binding */ anumber),\n/* harmony export */   asciiToBytes: () => (/* binding */ asciiToBytes),\n/* harmony export */   bitGet: () => (/* binding */ bitGet),\n/* harmony export */   bitLen: () => (/* binding */ bitLen),\n/* harmony export */   bitMask: () => (/* binding */ bitMask),\n/* harmony export */   bitSet: () => (/* binding */ bitSet),\n/* harmony export */   bytesToHex: () => (/* binding */ bytesToHex),\n/* harmony export */   bytesToNumberBE: () => (/* binding */ bytesToNumberBE),\n/* harmony export */   bytesToNumberLE: () => (/* binding */ bytesToNumberLE),\n/* harmony export */   bytesToUtf8: () => (/* binding */ bytesToUtf8),\n/* harmony export */   concatBytes: () => (/* binding */ concatBytes),\n/* harmony export */   copyBytes: () => (/* binding */ copyBytes),\n/* harmony export */   createHmacDrbg: () => (/* binding */ createHmacDrbg),\n/* harmony export */   ensureBytes: () => (/* binding */ ensureBytes),\n/* harmony export */   equalBytes: () => (/* binding */ equalBytes),\n/* harmony export */   hexToBytes: () => (/* binding */ hexToBytes),\n/* harmony export */   hexToNumber: () => (/* binding */ hexToNumber),\n/* harmony export */   inRange: () => (/* binding */ inRange),\n/* harmony export */   isBytes: () => (/* binding */ isBytes),\n/* harmony export */   isHash: () => (/* binding */ isHash),\n/* harmony export */   memoized: () => (/* binding */ memoized),\n/* harmony export */   notImplemented: () => (/* binding */ notImplemented),\n/* harmony export */   numberToBytesBE: () => (/* binding */ numberToBytesBE),\n/* harmony export */   numberToBytesLE: () => (/* binding */ numberToBytesLE),\n/* harmony export */   numberToHexUnpadded: () => (/* binding */ numberToHexUnpadded),\n/* harmony export */   numberToVarBytesBE: () => (/* binding */ numberToVarBytesBE),\n/* harmony export */   randomBytes: () => (/* binding */ randomBytes),\n/* harmony export */   utf8ToBytes: () => (/* binding */ utf8ToBytes),\n/* harmony export */   validateObject: () => (/* binding */ validateObject)\n/* harmony export */ });\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js\");\n/**\n * Deprecated module: moved from curves/abstract/utils.js to curves/utils.js\n * @module\n */\n\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst abytes = _utils_js__WEBPACK_IMPORTED_MODULE_0__.abytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst anumber = _utils_js__WEBPACK_IMPORTED_MODULE_0__.anumber;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst bytesToHex = _utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToHex;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst bytesToUtf8 = _utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToUtf8;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst concatBytes = _utils_js__WEBPACK_IMPORTED_MODULE_0__.concatBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst hexToBytes = _utils_js__WEBPACK_IMPORTED_MODULE_0__.hexToBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst isBytes = _utils_js__WEBPACK_IMPORTED_MODULE_0__.isBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst randomBytes = _utils_js__WEBPACK_IMPORTED_MODULE_0__.randomBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst utf8ToBytes = _utils_js__WEBPACK_IMPORTED_MODULE_0__.utf8ToBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst abool = _utils_js__WEBPACK_IMPORTED_MODULE_1__.abool;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst numberToHexUnpadded = _utils_js__WEBPACK_IMPORTED_MODULE_1__.numberToHexUnpadded;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst hexToNumber = _utils_js__WEBPACK_IMPORTED_MODULE_1__.hexToNumber;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst bytesToNumberBE = _utils_js__WEBPACK_IMPORTED_MODULE_1__.bytesToNumberBE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst bytesToNumberLE = _utils_js__WEBPACK_IMPORTED_MODULE_1__.bytesToNumberLE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst numberToBytesBE = _utils_js__WEBPACK_IMPORTED_MODULE_1__.numberToBytesBE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst numberToBytesLE = _utils_js__WEBPACK_IMPORTED_MODULE_1__.numberToBytesLE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst numberToVarBytesBE = _utils_js__WEBPACK_IMPORTED_MODULE_1__.numberToVarBytesBE;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst ensureBytes = _utils_js__WEBPACK_IMPORTED_MODULE_1__.ensureBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst equalBytes = _utils_js__WEBPACK_IMPORTED_MODULE_1__.equalBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst copyBytes = _utils_js__WEBPACK_IMPORTED_MODULE_1__.copyBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst asciiToBytes = _utils_js__WEBPACK_IMPORTED_MODULE_1__.asciiToBytes;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst inRange = _utils_js__WEBPACK_IMPORTED_MODULE_1__.inRange;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst aInRange = _utils_js__WEBPACK_IMPORTED_MODULE_1__.aInRange;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst bitLen = _utils_js__WEBPACK_IMPORTED_MODULE_1__.bitLen;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst bitGet = _utils_js__WEBPACK_IMPORTED_MODULE_1__.bitGet;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst bitSet = _utils_js__WEBPACK_IMPORTED_MODULE_1__.bitSet;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst bitMask = _utils_js__WEBPACK_IMPORTED_MODULE_1__.bitMask;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst createHmacDrbg = _utils_js__WEBPACK_IMPORTED_MODULE_1__.createHmacDrbg;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst notImplemented = _utils_js__WEBPACK_IMPORTED_MODULE_1__.notImplemented;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst memoized = _utils_js__WEBPACK_IMPORTED_MODULE_1__.memoized;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst validateObject = _utils_js__WEBPACK_IMPORTED_MODULE_1__.validateObject;\n/** @deprecated moved to `@noble/curves/utils.js` */\nconst isHash = _utils_js__WEBPACK_IMPORTED_MODULE_1__.isHash;\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC91dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDaUM7QUFDakM7QUFDTyxlQUFlLDZDQUFRO0FBQzlCO0FBQ08sZ0JBQWdCLDhDQUFTO0FBQ2hDO0FBQ08sbUJBQW1CLGlEQUFZO0FBQ3RDO0FBQ08sb0JBQW9CLGtEQUFhO0FBQ3hDO0FBQ08sb0JBQW9CLGtEQUFhO0FBQ3hDO0FBQ08sbUJBQW1CLGlEQUFZO0FBQ3RDO0FBQ08sZ0JBQWdCLDhDQUFTO0FBQ2hDO0FBQ08sb0JBQW9CLGtEQUFhO0FBQ3hDO0FBQ08sb0JBQW9CLGtEQUFhO0FBQ3hDO0FBQ08sY0FBYyw0Q0FBTztBQUM1QjtBQUNPLDRCQUE0QiwwREFBcUI7QUFDeEQ7QUFDTyxvQkFBb0Isa0RBQWE7QUFDeEM7QUFDTyx3QkFBd0Isc0RBQWlCO0FBQ2hEO0FBQ08sd0JBQXdCLHNEQUFpQjtBQUNoRDtBQUNPLHdCQUF3QixzREFBaUI7QUFDaEQ7QUFDTyx3QkFBd0Isc0RBQWlCO0FBQ2hEO0FBQ08sMkJBQTJCLHlEQUFvQjtBQUN0RDtBQUNPLG9CQUFvQixrREFBYTtBQUN4QztBQUNPLG1CQUFtQixpREFBWTtBQUN0QztBQUNPLGtCQUFrQixnREFBVztBQUNwQztBQUNPLHFCQUFxQixtREFBYztBQUMxQztBQUNPLGdCQUFnQiw4Q0FBUztBQUNoQztBQUNPLGlCQUFpQiwrQ0FBVTtBQUNsQztBQUNPLGVBQWUsNkNBQVE7QUFDOUI7QUFDTyxlQUFlLDZDQUFRO0FBQzlCO0FBQ08sZUFBZSw2Q0FBUTtBQUM5QjtBQUNPLGdCQUFnQiw4Q0FBUztBQUNoQztBQUNPLHVCQUF1QixxREFBZ0I7QUFDOUM7QUFDTyx1QkFBdUIscURBQWdCO0FBQzlDO0FBQ08saUJBQWlCLCtDQUFVO0FBQ2xDO0FBQ08sdUJBQXVCLHFEQUFnQjtBQUM5QztBQUNPLGVBQWUsNkNBQVE7QUFDOUIiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5vYmxlL2N1cnZlcy9lc20vYWJzdHJhY3QvdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXByZWNhdGVkIG1vZHVsZTogbW92ZWQgZnJvbSBjdXJ2ZXMvYWJzdHJhY3QvdXRpbHMuanMgdG8gY3VydmVzL3V0aWxzLmpzXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCAqIGFzIHUgZnJvbSBcIi4uL3V0aWxzLmpzXCI7XG4vKiogQGRlcHJlY2F0ZWQgbW92ZWQgdG8gYEBub2JsZS9jdXJ2ZXMvdXRpbHMuanNgICovXG5leHBvcnQgY29uc3QgYWJ5dGVzID0gdS5hYnl0ZXM7XG4vKiogQGRlcHJlY2F0ZWQgbW92ZWQgdG8gYEBub2JsZS9jdXJ2ZXMvdXRpbHMuanNgICovXG5leHBvcnQgY29uc3QgYW51bWJlciA9IHUuYW51bWJlcjtcbi8qKiBAZGVwcmVjYXRlZCBtb3ZlZCB0byBgQG5vYmxlL2N1cnZlcy91dGlscy5qc2AgKi9cbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4ID0gdS5ieXRlc1RvSGV4O1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGJ5dGVzVG9VdGY4ID0gdS5ieXRlc1RvVXRmODtcbi8qKiBAZGVwcmVjYXRlZCBtb3ZlZCB0byBgQG5vYmxlL2N1cnZlcy91dGlscy5qc2AgKi9cbmV4cG9ydCBjb25zdCBjb25jYXRCeXRlcyA9IHUuY29uY2F0Qnl0ZXM7XG4vKiogQGRlcHJlY2F0ZWQgbW92ZWQgdG8gYEBub2JsZS9jdXJ2ZXMvdXRpbHMuanNgICovXG5leHBvcnQgY29uc3QgaGV4VG9CeXRlcyA9IHUuaGV4VG9CeXRlcztcbi8qKiBAZGVwcmVjYXRlZCBtb3ZlZCB0byBgQG5vYmxlL2N1cnZlcy91dGlscy5qc2AgKi9cbmV4cG9ydCBjb25zdCBpc0J5dGVzID0gdS5pc0J5dGVzO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IHJhbmRvbUJ5dGVzID0gdS5yYW5kb21CeXRlcztcbi8qKiBAZGVwcmVjYXRlZCBtb3ZlZCB0byBgQG5vYmxlL2N1cnZlcy91dGlscy5qc2AgKi9cbmV4cG9ydCBjb25zdCB1dGY4VG9CeXRlcyA9IHUudXRmOFRvQnl0ZXM7XG4vKiogQGRlcHJlY2F0ZWQgbW92ZWQgdG8gYEBub2JsZS9jdXJ2ZXMvdXRpbHMuanNgICovXG5leHBvcnQgY29uc3QgYWJvb2wgPSB1LmFib29sO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IG51bWJlclRvSGV4VW5wYWRkZWQgPSB1Lm51bWJlclRvSGV4VW5wYWRkZWQ7XG4vKiogQGRlcHJlY2F0ZWQgbW92ZWQgdG8gYEBub2JsZS9jdXJ2ZXMvdXRpbHMuanNgICovXG5leHBvcnQgY29uc3QgaGV4VG9OdW1iZXIgPSB1LmhleFRvTnVtYmVyO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGJ5dGVzVG9OdW1iZXJCRSA9IHUuYnl0ZXNUb051bWJlckJFO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGJ5dGVzVG9OdW1iZXJMRSA9IHUuYnl0ZXNUb051bWJlckxFO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IG51bWJlclRvQnl0ZXNCRSA9IHUubnVtYmVyVG9CeXRlc0JFO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IG51bWJlclRvQnl0ZXNMRSA9IHUubnVtYmVyVG9CeXRlc0xFO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IG51bWJlclRvVmFyQnl0ZXNCRSA9IHUubnVtYmVyVG9WYXJCeXRlc0JFO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGVuc3VyZUJ5dGVzID0gdS5lbnN1cmVCeXRlcztcbi8qKiBAZGVwcmVjYXRlZCBtb3ZlZCB0byBgQG5vYmxlL2N1cnZlcy91dGlscy5qc2AgKi9cbmV4cG9ydCBjb25zdCBlcXVhbEJ5dGVzID0gdS5lcXVhbEJ5dGVzO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGNvcHlCeXRlcyA9IHUuY29weUJ5dGVzO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGFzY2lpVG9CeXRlcyA9IHUuYXNjaWlUb0J5dGVzO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGluUmFuZ2UgPSB1LmluUmFuZ2U7XG4vKiogQGRlcHJlY2F0ZWQgbW92ZWQgdG8gYEBub2JsZS9jdXJ2ZXMvdXRpbHMuanNgICovXG5leHBvcnQgY29uc3QgYUluUmFuZ2UgPSB1LmFJblJhbmdlO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGJpdExlbiA9IHUuYml0TGVuO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGJpdEdldCA9IHUuYml0R2V0O1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGJpdFNldCA9IHUuYml0U2V0O1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGJpdE1hc2sgPSB1LmJpdE1hc2s7XG4vKiogQGRlcHJlY2F0ZWQgbW92ZWQgdG8gYEBub2JsZS9jdXJ2ZXMvdXRpbHMuanNgICovXG5leHBvcnQgY29uc3QgY3JlYXRlSG1hY0RyYmcgPSB1LmNyZWF0ZUhtYWNEcmJnO1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IG5vdEltcGxlbWVudGVkID0gdS5ub3RJbXBsZW1lbnRlZDtcbi8qKiBAZGVwcmVjYXRlZCBtb3ZlZCB0byBgQG5vYmxlL2N1cnZlcy91dGlscy5qc2AgKi9cbmV4cG9ydCBjb25zdCBtZW1vaXplZCA9IHUubWVtb2l6ZWQ7XG4vKiogQGRlcHJlY2F0ZWQgbW92ZWQgdG8gYEBub2JsZS9jdXJ2ZXMvdXRpbHMuanNgICovXG5leHBvcnQgY29uc3QgdmFsaWRhdGVPYmplY3QgPSB1LnZhbGlkYXRlT2JqZWN0O1xuLyoqIEBkZXByZWNhdGVkIG1vdmVkIHRvIGBAbm9ibGUvY3VydmVzL3V0aWxzLmpzYCAqL1xuZXhwb3J0IGNvbnN0IGlzSGFzaCA9IHUuaXNIYXNoO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/utils.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/weierstrass.js":
/*!****************************************************************!*\
  !*** ./node_modules/@noble/curves/esm/abstract/weierstrass.js ***!
  \****************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   DER: () => (/* binding */ DER),\n/* harmony export */   DERErr: () => (/* binding */ DERErr),\n/* harmony export */   SWUFpSqrtRatio: () => (/* binding */ SWUFpSqrtRatio),\n/* harmony export */   _legacyHelperEquat: () => (/* binding */ _legacyHelperEquat),\n/* harmony export */   _normFnElement: () => (/* binding */ _normFnElement),\n/* harmony export */   _splitEndoScalar: () => (/* binding */ _splitEndoScalar),\n/* harmony export */   ecdh: () => (/* binding */ ecdh),\n/* harmony export */   ecdsa: () => (/* binding */ ecdsa),\n/* harmony export */   mapToCurveSimpleSWU: () => (/* binding */ mapToCurveSimpleSWU),\n/* harmony export */   weierstrass: () => (/* binding */ weierstrass),\n/* harmony export */   weierstrassN: () => (/* binding */ weierstrassN),\n/* harmony export */   weierstrassPoints: () => (/* binding */ weierstrassPoints)\n/* harmony export */ });\n/* harmony import */ var _noble_hashes_hmac_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @noble/hashes/hmac.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/hmac.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js\");\n/* harmony import */ var _curve_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./curve.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/curve.js\");\n/* harmony import */ var _modular_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./modular.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/modular.js\");\n/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n *   `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n *   `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n *   it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n *     1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n *     which is hard to debug.\n *     2. Params can be generic and we can't enforce them to be constant value:\n *     if somebody creates curve from non-constant params,\n *     it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n\n\n\n\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num, den) => (num + (num >= 0 ? den : -den) / _2n) / den;\n/**\n * Splits scalar for GLV endomorphism.\n */\nfunction _splitEndoScalar(k, basis, n) {\n    // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n    // Since part can be negative, we need to do this on point.\n    // TODO: verifyScalar function which consumes lambda\n    const [[a1, b1], [a2, b2]] = basis;\n    const c1 = divNearest(b2 * k, n);\n    const c2 = divNearest(-b1 * k, n);\n    // |k1|/|k2| is < sqrt(N), but can be negative.\n    // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n    let k1 = k - c1 * a1 - c2 * a2;\n    let k2 = -c1 * b1 - c2 * b2;\n    const k1neg = k1 < _0n;\n    const k2neg = k2 < _0n;\n    if (k1neg)\n        k1 = -k1;\n    if (k2neg)\n        k2 = -k2;\n    // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n    // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n    const MAX_NUM = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bitMask)(Math.ceil((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bitLen)(n) / 2)) + _1n; // Half bits of N\n    if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n        throw new Error('splitScalar (endomorphism): failed, k=' + k);\n    }\n    return { k1neg, k1, k2neg, k2 };\n}\nfunction validateSigFormat(format) {\n    if (!['compact', 'recovered', 'der'].includes(format))\n        throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n    return format;\n}\nfunction validateSigOpts(opts, def) {\n    const optsn = {};\n    for (let optName of Object.keys(def)) {\n        // @ts-ignore\n        optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n    }\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abool2)(optsn.lowS, 'lowS');\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abool2)(optsn.prehash, 'prehash');\n    if (optsn.format !== undefined)\n        validateSigFormat(optsn.format);\n    return optsn;\n}\nclass DERErr extends Error {\n    constructor(m = '') {\n        super(m);\n    }\n}\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n *     [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nconst DER = {\n    // asn.1 DER encoding utils\n    Err: DERErr,\n    // Basic building block is TLV (Tag-Length-Value)\n    _tlv: {\n        encode: (tag, data) => {\n            const { Err: E } = DER;\n            if (tag < 0 || tag > 256)\n                throw new E('tlv.encode: wrong tag');\n            if (data.length & 1)\n                throw new E('tlv.encode: unpadded data');\n            const dataLen = data.length / 2;\n            const len = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.numberToHexUnpadded)(dataLen);\n            if ((len.length / 2) & 128)\n                throw new E('tlv.encode: long form length too big');\n            // length of length with long form flag\n            const lenLen = dataLen > 127 ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.numberToHexUnpadded)((len.length / 2) | 128) : '';\n            const t = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.numberToHexUnpadded)(tag);\n            return t + lenLen + len + data;\n        },\n        // v - value, l - left bytes (unparsed)\n        decode(tag, data) {\n            const { Err: E } = DER;\n            let pos = 0;\n            if (tag < 0 || tag > 256)\n                throw new E('tlv.encode: wrong tag');\n            if (data.length < 2 || data[pos++] !== tag)\n                throw new E('tlv.decode: wrong tlv');\n            const first = data[pos++];\n            const isLong = !!(first & 128); // First bit of first length byte is flag for short/long form\n            let length = 0;\n            if (!isLong)\n                length = first;\n            else {\n                // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n                const lenLen = first & 127;\n                if (!lenLen)\n                    throw new E('tlv.decode(long): indefinite length not supported');\n                if (lenLen > 4)\n                    throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n                const lengthBytes = data.subarray(pos, pos + lenLen);\n                if (lengthBytes.length !== lenLen)\n                    throw new E('tlv.decode: length bytes not complete');\n                if (lengthBytes[0] === 0)\n                    throw new E('tlv.decode(long): zero leftmost byte');\n                for (const b of lengthBytes)\n                    length = (length << 8) | b;\n                pos += lenLen;\n                if (length < 128)\n                    throw new E('tlv.decode(long): not minimal encoding');\n            }\n            const v = data.subarray(pos, pos + length);\n            if (v.length !== length)\n                throw new E('tlv.decode: wrong value length');\n            return { v, l: data.subarray(pos + length) };\n        },\n    },\n    // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n    // since we always use positive integers here. It must always be empty:\n    // - add zero byte if exists\n    // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n    _int: {\n        encode(num) {\n            const { Err: E } = DER;\n            if (num < _0n)\n                throw new E('integer: negative integers are not allowed');\n            let hex = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.numberToHexUnpadded)(num);\n            // Pad with zero byte if negative flag is present\n            if (Number.parseInt(hex[0], 16) & 0b1000)\n                hex = '00' + hex;\n            if (hex.length & 1)\n                throw new E('unexpected DER parsing assertion: unpadded hex');\n            return hex;\n        },\n        decode(data) {\n            const { Err: E } = DER;\n            if (data[0] & 128)\n                throw new E('invalid signature integer: negative');\n            if (data[0] === 0x00 && !(data[1] & 128))\n                throw new E('invalid signature integer: unnecessary leading zero');\n            return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberBE)(data);\n        },\n    },\n    toSig(hex) {\n        // parse DER signature\n        const { Err: E, _int: int, _tlv: tlv } = DER;\n        const data = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('signature', hex);\n        const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n        if (seqLeftBytes.length)\n            throw new E('invalid signature: left bytes after parsing');\n        const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n        const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n        if (sLeftBytes.length)\n            throw new E('invalid signature: left bytes after parsing');\n        return { r: int.decode(rBytes), s: int.decode(sBytes) };\n    },\n    hexFromSig(sig) {\n        const { _tlv: tlv, _int: int } = DER;\n        const rs = tlv.encode(0x02, int.encode(sig.r));\n        const ss = tlv.encode(0x02, int.encode(sig.s));\n        const seq = rs + ss;\n        return tlv.encode(0x30, seq);\n    },\n};\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\nfunction _normFnElement(Fn, key) {\n    const { BYTES: expected } = Fn;\n    let num;\n    if (typeof key === 'bigint') {\n        num = key;\n    }\n    else {\n        let bytes = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('private key', key);\n        try {\n            num = Fn.fromBytes(bytes);\n        }\n        catch (error) {\n            throw new Error(`invalid private key: expected ui8a of size ${expected}, got ${typeof key}`);\n        }\n    }\n    if (!Fn.isValidNot0(num))\n        throw new Error('invalid private key: out of range [1..N-1]');\n    return num;\n}\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * @example\n```js\nconst opts = {\n  p: BigInt('0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff'),\n  n: BigInt('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551'),\n  h: BigInt(1),\n  a: BigInt('0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc'),\n  b: BigInt('0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b'),\n  Gx: BigInt('0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296'),\n  Gy: BigInt('0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5'),\n};\nconst p256_Point = weierstrass(opts);\n```\n */\nfunction weierstrassN(params, extraOpts = {}) {\n    const validated = (0,_curve_js__WEBPACK_IMPORTED_MODULE_1__._createCurveFields)('weierstrass', params, extraOpts);\n    const { Fp, Fn } = validated;\n    let CURVE = validated.CURVE;\n    const { h: cofactor, n: CURVE_ORDER } = CURVE;\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._validateObject)(extraOpts, {}, {\n        allowInfinityPoint: 'boolean',\n        clearCofactor: 'function',\n        isTorsionFree: 'function',\n        fromBytes: 'function',\n        toBytes: 'function',\n        endo: 'object',\n        wrapPrivateKey: 'boolean',\n    });\n    const { endo } = extraOpts;\n    if (endo) {\n        // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n        if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n            throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n        }\n    }\n    const lengths = getWLengths(Fp, Fn);\n    function assertCompressionIsSupported() {\n        if (!Fp.isOdd)\n            throw new Error('compression is not supported: Field does not have .isOdd()');\n    }\n    // Implements IEEE P1363 point encoding\n    function pointToBytes(_c, point, isCompressed) {\n        const { x, y } = point.toAffine();\n        const bx = Fp.toBytes(x);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abool2)(isCompressed, 'isCompressed');\n        if (isCompressed) {\n            assertCompressionIsSupported();\n            const hasEvenY = !Fp.isOdd(y);\n            return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.concatBytes)(pprefix(hasEvenY), bx);\n        }\n        else {\n            return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.concatBytes)(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n        }\n    }\n    function pointFromBytes(bytes) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abytes2)(bytes, undefined, 'Point');\n        const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n        const length = bytes.length;\n        const head = bytes[0];\n        const tail = bytes.subarray(1);\n        // No actual validation is done here: use .assertValidity()\n        if (length === comp && (head === 0x02 || head === 0x03)) {\n            const x = Fp.fromBytes(tail);\n            if (!Fp.isValid(x))\n                throw new Error('bad point: is not on curve, wrong x');\n            const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n            let y;\n            try {\n                y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n            }\n            catch (sqrtError) {\n                const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n                throw new Error('bad point: is not on curve, sqrt error' + err);\n            }\n            assertCompressionIsSupported();\n            const isYOdd = Fp.isOdd(y); // (y & _1n) === _1n;\n            const isHeadOdd = (head & 1) === 1; // ECDSA-specific\n            if (isHeadOdd !== isYOdd)\n                y = Fp.neg(y);\n            return { x, y };\n        }\n        else if (length === uncomp && head === 0x04) {\n            // TODO: more checks\n            const L = Fp.BYTES;\n            const x = Fp.fromBytes(tail.subarray(0, L));\n            const y = Fp.fromBytes(tail.subarray(L, L * 2));\n            if (!isValidXY(x, y))\n                throw new Error('bad point: is not on curve');\n            return { x, y };\n        }\n        else {\n            throw new Error(`bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`);\n        }\n    }\n    const encodePoint = extraOpts.toBytes || pointToBytes;\n    const decodePoint = extraOpts.fromBytes || pointFromBytes;\n    function weierstrassEquation(x) {\n        const x2 = Fp.sqr(x); // x * x\n        const x3 = Fp.mul(x2, x); // x² * x\n        return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x³ + a * x + b\n    }\n    // TODO: move top-level\n    /** Checks whether equation holds for given x, y: y² == x³ + ax + b */\n    function isValidXY(x, y) {\n        const left = Fp.sqr(y); // y²\n        const right = weierstrassEquation(x); // x³ + ax + b\n        return Fp.eql(left, right);\n    }\n    // Validate whether the passed curve params are valid.\n    // Test 1: equation y² = x³ + ax + b should work for generator point.\n    if (!isValidXY(CURVE.Gx, CURVE.Gy))\n        throw new Error('bad curve params: generator point');\n    // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n    // Guarantees curve is genus-1, smooth (non-singular).\n    const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n    const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n    if (Fp.is0(Fp.add(_4a3, _27b2)))\n        throw new Error('bad curve params: a or b');\n    /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n    function acoord(title, n, banZero = false) {\n        if (!Fp.isValid(n) || (banZero && Fp.is0(n)))\n            throw new Error(`bad point coordinate ${title}`);\n        return n;\n    }\n    function aprjpoint(other) {\n        if (!(other instanceof Point))\n            throw new Error('ProjectivePoint expected');\n    }\n    function splitEndoScalarN(k) {\n        if (!endo || !endo.basises)\n            throw new Error('no endo');\n        return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n    }\n    // Memoized toAffine / validity check. They are heavy. Points are immutable.\n    // Converts Projective point to affine (x, y) coordinates.\n    // Can accept precomputed Z^-1 - for example, from invertBatch.\n    // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n    const toAffineMemo = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.memoized)((p, iz) => {\n        const { X, Y, Z } = p;\n        // Fast-path for normalized points\n        if (Fp.eql(Z, Fp.ONE))\n            return { x: X, y: Y };\n        const is0 = p.is0();\n        // If invZ was 0, we return zero point. However we still want to execute\n        // all operations, so we replace invZ with a random number, 1.\n        if (iz == null)\n            iz = is0 ? Fp.ONE : Fp.inv(Z);\n        const x = Fp.mul(X, iz);\n        const y = Fp.mul(Y, iz);\n        const zz = Fp.mul(Z, iz);\n        if (is0)\n            return { x: Fp.ZERO, y: Fp.ZERO };\n        if (!Fp.eql(zz, Fp.ONE))\n            throw new Error('invZ was invalid');\n        return { x, y };\n    });\n    // NOTE: on exception this will crash 'cached' and no value will be set.\n    // Otherwise true will be return\n    const assertValidMemo = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.memoized)((p) => {\n        if (p.is0()) {\n            // (0, 1, 0) aka ZERO is invalid in most contexts.\n            // In BLS, ZERO can be serialized, so we allow it.\n            // (0, 0, 0) is invalid representation of ZERO.\n            if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y))\n                return;\n            throw new Error('bad point: ZERO');\n        }\n        // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n        const { x, y } = p.toAffine();\n        if (!Fp.isValid(x) || !Fp.isValid(y))\n            throw new Error('bad point: x or y not field elements');\n        if (!isValidXY(x, y))\n            throw new Error('bad point: equation left != right');\n        if (!p.isTorsionFree())\n            throw new Error('bad point: not in prime-order subgroup');\n        return true;\n    });\n    function finishEndo(endoBeta, k1p, k2p, k1neg, k2neg) {\n        k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n        k1p = (0,_curve_js__WEBPACK_IMPORTED_MODULE_1__.negateCt)(k1neg, k1p);\n        k2p = (0,_curve_js__WEBPACK_IMPORTED_MODULE_1__.negateCt)(k2neg, k2p);\n        return k1p.add(k2p);\n    }\n    /**\n     * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) ∋ (x=X/Z, y=Y/Z).\n     * Default Point works in 2d / affine coordinates: (x, y).\n     * We're doing calculations in projective, because its operations don't require costly inversion.\n     */\n    class Point {\n        /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n        constructor(X, Y, Z) {\n            this.X = acoord('x', X);\n            this.Y = acoord('y', Y, true);\n            this.Z = acoord('z', Z);\n            Object.freeze(this);\n        }\n        static CURVE() {\n            return CURVE;\n        }\n        /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n        static fromAffine(p) {\n            const { x, y } = p || {};\n            if (!p || !Fp.isValid(x) || !Fp.isValid(y))\n                throw new Error('invalid affine point');\n            if (p instanceof Point)\n                throw new Error('projective point not allowed');\n            // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n            if (Fp.is0(x) && Fp.is0(y))\n                return Point.ZERO;\n            return new Point(x, y, Fp.ONE);\n        }\n        static fromBytes(bytes) {\n            const P = Point.fromAffine(decodePoint((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abytes2)(bytes, undefined, 'point')));\n            P.assertValidity();\n            return P;\n        }\n        static fromHex(hex) {\n            return Point.fromBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('pointHex', hex));\n        }\n        get x() {\n            return this.toAffine().x;\n        }\n        get y() {\n            return this.toAffine().y;\n        }\n        /**\n         *\n         * @param windowSize\n         * @param isLazy true will defer table computation until the first multiplication\n         * @returns\n         */\n        precompute(windowSize = 8, isLazy = true) {\n            wnaf.createCache(this, windowSize);\n            if (!isLazy)\n                this.multiply(_3n); // random number\n            return this;\n        }\n        // TODO: return `this`\n        /** A point on curve is valid if it conforms to equation. */\n        assertValidity() {\n            assertValidMemo(this);\n        }\n        hasEvenY() {\n            const { y } = this.toAffine();\n            if (!Fp.isOdd)\n                throw new Error(\"Field doesn't support isOdd\");\n            return !Fp.isOdd(y);\n        }\n        /** Compare one point to another. */\n        equals(other) {\n            aprjpoint(other);\n            const { X: X1, Y: Y1, Z: Z1 } = this;\n            const { X: X2, Y: Y2, Z: Z2 } = other;\n            const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n            const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n            return U1 && U2;\n        }\n        /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n        negate() {\n            return new Point(this.X, Fp.neg(this.Y), this.Z);\n        }\n        // Renes-Costello-Batina exception-free doubling formula.\n        // There is 30% faster Jacobian formula, but it is not complete.\n        // https://eprint.iacr.org/2015/1060, algorithm 3\n        // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n        double() {\n            const { a, b } = CURVE;\n            const b3 = Fp.mul(b, _3n);\n            const { X: X1, Y: Y1, Z: Z1 } = this;\n            let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n            let t0 = Fp.mul(X1, X1); // step 1\n            let t1 = Fp.mul(Y1, Y1);\n            let t2 = Fp.mul(Z1, Z1);\n            let t3 = Fp.mul(X1, Y1);\n            t3 = Fp.add(t3, t3); // step 5\n            Z3 = Fp.mul(X1, Z1);\n            Z3 = Fp.add(Z3, Z3);\n            X3 = Fp.mul(a, Z3);\n            Y3 = Fp.mul(b3, t2);\n            Y3 = Fp.add(X3, Y3); // step 10\n            X3 = Fp.sub(t1, Y3);\n            Y3 = Fp.add(t1, Y3);\n            Y3 = Fp.mul(X3, Y3);\n            X3 = Fp.mul(t3, X3);\n            Z3 = Fp.mul(b3, Z3); // step 15\n            t2 = Fp.mul(a, t2);\n            t3 = Fp.sub(t0, t2);\n            t3 = Fp.mul(a, t3);\n            t3 = Fp.add(t3, Z3);\n            Z3 = Fp.add(t0, t0); // step 20\n            t0 = Fp.add(Z3, t0);\n            t0 = Fp.add(t0, t2);\n            t0 = Fp.mul(t0, t3);\n            Y3 = Fp.add(Y3, t0);\n            t2 = Fp.mul(Y1, Z1); // step 25\n            t2 = Fp.add(t2, t2);\n            t0 = Fp.mul(t2, t3);\n            X3 = Fp.sub(X3, t0);\n            Z3 = Fp.mul(t2, t1);\n            Z3 = Fp.add(Z3, Z3); // step 30\n            Z3 = Fp.add(Z3, Z3);\n            return new Point(X3, Y3, Z3);\n        }\n        // Renes-Costello-Batina exception-free addition formula.\n        // There is 30% faster Jacobian formula, but it is not complete.\n        // https://eprint.iacr.org/2015/1060, algorithm 1\n        // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n        add(other) {\n            aprjpoint(other);\n            const { X: X1, Y: Y1, Z: Z1 } = this;\n            const { X: X2, Y: Y2, Z: Z2 } = other;\n            let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n            const a = CURVE.a;\n            const b3 = Fp.mul(CURVE.b, _3n);\n            let t0 = Fp.mul(X1, X2); // step 1\n            let t1 = Fp.mul(Y1, Y2);\n            let t2 = Fp.mul(Z1, Z2);\n            let t3 = Fp.add(X1, Y1);\n            let t4 = Fp.add(X2, Y2); // step 5\n            t3 = Fp.mul(t3, t4);\n            t4 = Fp.add(t0, t1);\n            t3 = Fp.sub(t3, t4);\n            t4 = Fp.add(X1, Z1);\n            let t5 = Fp.add(X2, Z2); // step 10\n            t4 = Fp.mul(t4, t5);\n            t5 = Fp.add(t0, t2);\n            t4 = Fp.sub(t4, t5);\n            t5 = Fp.add(Y1, Z1);\n            X3 = Fp.add(Y2, Z2); // step 15\n            t5 = Fp.mul(t5, X3);\n            X3 = Fp.add(t1, t2);\n            t5 = Fp.sub(t5, X3);\n            Z3 = Fp.mul(a, t4);\n            X3 = Fp.mul(b3, t2); // step 20\n            Z3 = Fp.add(X3, Z3);\n            X3 = Fp.sub(t1, Z3);\n            Z3 = Fp.add(t1, Z3);\n            Y3 = Fp.mul(X3, Z3);\n            t1 = Fp.add(t0, t0); // step 25\n            t1 = Fp.add(t1, t0);\n            t2 = Fp.mul(a, t2);\n            t4 = Fp.mul(b3, t4);\n            t1 = Fp.add(t1, t2);\n            t2 = Fp.sub(t0, t2); // step 30\n            t2 = Fp.mul(a, t2);\n            t4 = Fp.add(t4, t2);\n            t0 = Fp.mul(t1, t4);\n            Y3 = Fp.add(Y3, t0);\n            t0 = Fp.mul(t5, t4); // step 35\n            X3 = Fp.mul(t3, X3);\n            X3 = Fp.sub(X3, t0);\n            t0 = Fp.mul(t3, t1);\n            Z3 = Fp.mul(t5, Z3);\n            Z3 = Fp.add(Z3, t0); // step 40\n            return new Point(X3, Y3, Z3);\n        }\n        subtract(other) {\n            return this.add(other.negate());\n        }\n        is0() {\n            return this.equals(Point.ZERO);\n        }\n        /**\n         * Constant time multiplication.\n         * Uses wNAF method. Windowed method may be 10% faster,\n         * but takes 2x longer to generate and consumes 2x memory.\n         * Uses precomputes when available.\n         * Uses endomorphism for Koblitz curves.\n         * @param scalar by which the point would be multiplied\n         * @returns New point\n         */\n        multiply(scalar) {\n            const { endo } = extraOpts;\n            if (!Fn.isValidNot0(scalar))\n                throw new Error('invalid scalar: out of range'); // 0 is invalid\n            let point, fake; // Fake point is used to const-time mult\n            const mul = (n) => wnaf.cached(this, n, (p) => (0,_curve_js__WEBPACK_IMPORTED_MODULE_1__.normalizeZ)(Point, p));\n            /** See docs for {@link EndomorphismOpts} */\n            if (endo) {\n                const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n                const { p: k1p, f: k1f } = mul(k1);\n                const { p: k2p, f: k2f } = mul(k2);\n                fake = k1f.add(k2f);\n                point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n            }\n            else {\n                const { p, f } = mul(scalar);\n                point = p;\n                fake = f;\n            }\n            // Normalize `z` for both points, but return only real one\n            return (0,_curve_js__WEBPACK_IMPORTED_MODULE_1__.normalizeZ)(Point, [point, fake])[0];\n        }\n        /**\n         * Non-constant-time multiplication. Uses double-and-add algorithm.\n         * It's faster, but should only be used when you don't care about\n         * an exposed secret key e.g. sig verification, which works over *public* keys.\n         */\n        multiplyUnsafe(sc) {\n            const { endo } = extraOpts;\n            const p = this;\n            if (!Fn.isValid(sc))\n                throw new Error('invalid scalar: out of range'); // 0 is valid\n            if (sc === _0n || p.is0())\n                return Point.ZERO;\n            if (sc === _1n)\n                return p; // fast-path\n            if (wnaf.hasCache(this))\n                return this.multiply(sc);\n            if (endo) {\n                const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n                const { p1, p2 } = (0,_curve_js__WEBPACK_IMPORTED_MODULE_1__.mulEndoUnsafe)(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n                return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n            }\n            else {\n                return wnaf.unsafe(p, sc);\n            }\n        }\n        multiplyAndAddUnsafe(Q, a, b) {\n            const sum = this.multiplyUnsafe(a).add(Q.multiplyUnsafe(b));\n            return sum.is0() ? undefined : sum;\n        }\n        /**\n         * Converts Projective point to affine (x, y) coordinates.\n         * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n         */\n        toAffine(invertedZ) {\n            return toAffineMemo(this, invertedZ);\n        }\n        /**\n         * Checks whether Point is free of torsion elements (is in prime subgroup).\n         * Always torsion-free for cofactor=1 curves.\n         */\n        isTorsionFree() {\n            const { isTorsionFree } = extraOpts;\n            if (cofactor === _1n)\n                return true;\n            if (isTorsionFree)\n                return isTorsionFree(Point, this);\n            return wnaf.unsafe(this, CURVE_ORDER).is0();\n        }\n        clearCofactor() {\n            const { clearCofactor } = extraOpts;\n            if (cofactor === _1n)\n                return this; // Fast-path\n            if (clearCofactor)\n                return clearCofactor(Point, this);\n            return this.multiplyUnsafe(cofactor);\n        }\n        isSmallOrder() {\n            // can we use this.clearCofactor()?\n            return this.multiplyUnsafe(cofactor).is0();\n        }\n        toBytes(isCompressed = true) {\n            (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abool2)(isCompressed, 'isCompressed');\n            this.assertValidity();\n            return encodePoint(Point, this, isCompressed);\n        }\n        toHex(isCompressed = true) {\n            return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.bytesToHex)(this.toBytes(isCompressed));\n        }\n        toString() {\n            return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n        }\n        // TODO: remove\n        get px() {\n            return this.X;\n        }\n        get py() {\n            return this.X;\n        }\n        get pz() {\n            return this.Z;\n        }\n        toRawBytes(isCompressed = true) {\n            return this.toBytes(isCompressed);\n        }\n        _setWindowSize(windowSize) {\n            this.precompute(windowSize);\n        }\n        static normalizeZ(points) {\n            return (0,_curve_js__WEBPACK_IMPORTED_MODULE_1__.normalizeZ)(Point, points);\n        }\n        static msm(points, scalars) {\n            return (0,_curve_js__WEBPACK_IMPORTED_MODULE_1__.pippenger)(Point, Fn, points, scalars);\n        }\n        static fromPrivateKey(privateKey) {\n            return Point.BASE.multiply(_normFnElement(Fn, privateKey));\n        }\n    }\n    // base / generator point\n    Point.BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n    // zero / infinity / identity point\n    Point.ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n    // math field\n    Point.Fp = Fp;\n    // scalar field\n    Point.Fn = Fn;\n    const bits = Fn.BITS;\n    const wnaf = new _curve_js__WEBPACK_IMPORTED_MODULE_1__.wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n    Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n    return Point;\n}\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY) {\n    return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nfunction SWUFpSqrtRatio(Fp, Z) {\n    // Generic implementation\n    const q = Fp.ORDER;\n    let l = _0n;\n    for (let o = q - _1n; o % _2n === _0n; o /= _2n)\n        l += _1n;\n    const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n    // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n    // 2n ** c1 == 2n << (c1-1)\n    const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n    const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n    const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1)  # Integer arithmetic\n    const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2            # Integer arithmetic\n    const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1                # Integer arithmetic\n    const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1)                  # Integer arithmetic\n    const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n    const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n    let sqrtRatio = (u, v) => {\n        let tv1 = c6; // 1. tv1 = c6\n        let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n        let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n        tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n        let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n        tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n        tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n        tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n        tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n        let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n        tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n        let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n        tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n        tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n        tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n        tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n        // 17. for i in (c1, c1 - 1, ..., 2):\n        for (let i = c1; i > _1n; i--) {\n            let tv5 = i - _2n; // 18.    tv5 = i - 2\n            tv5 = _2n << (tv5 - _1n); // 19.    tv5 = 2^tv5\n            let tvv5 = Fp.pow(tv4, tv5); // 20.    tv5 = tv4^tv5\n            const e1 = Fp.eql(tvv5, Fp.ONE); // 21.    e1 = tv5 == 1\n            tv2 = Fp.mul(tv3, tv1); // 22.    tv2 = tv3 * tv1\n            tv1 = Fp.mul(tv1, tv1); // 23.    tv1 = tv1 * tv1\n            tvv5 = Fp.mul(tv4, tv1); // 24.    tv5 = tv4 * tv1\n            tv3 = Fp.cmov(tv2, tv3, e1); // 25.    tv3 = CMOV(tv2, tv3, e1)\n            tv4 = Fp.cmov(tvv5, tv4, e1); // 26.    tv4 = CMOV(tv5, tv4, e1)\n        }\n        return { isValid: isQR, value: tv3 };\n    };\n    if (Fp.ORDER % _4n === _3n) {\n        // sqrt_ratio_3mod4(u, v)\n        const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4     # Integer arithmetic\n        const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n        sqrtRatio = (u, v) => {\n            let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n            const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n            tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n            let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n            y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n            const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n            const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n            const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n            let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n            return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n        };\n    }\n    // No curves uses that\n    // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n    return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nfunction mapToCurveSimpleSWU(Fp, opts) {\n    (0,_modular_js__WEBPACK_IMPORTED_MODULE_3__.validateField)(Fp);\n    const { A, B, Z } = opts;\n    if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n        throw new Error('mapToCurveSimpleSWU: invalid opts');\n    const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n    if (!Fp.isOdd)\n        throw new Error('Field does not have .isOdd()');\n    // Input: u, an element of F.\n    // Output: (x, y), a point on E.\n    return (u) => {\n        // prettier-ignore\n        let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n        tv1 = Fp.sqr(u); // 1.  tv1 = u^2\n        tv1 = Fp.mul(tv1, Z); // 2.  tv1 = Z * tv1\n        tv2 = Fp.sqr(tv1); // 3.  tv2 = tv1^2\n        tv2 = Fp.add(tv2, tv1); // 4.  tv2 = tv2 + tv1\n        tv3 = Fp.add(tv2, Fp.ONE); // 5.  tv3 = tv2 + 1\n        tv3 = Fp.mul(tv3, B); // 6.  tv3 = B * tv3\n        tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7.  tv4 = CMOV(Z, -tv2, tv2 != 0)\n        tv4 = Fp.mul(tv4, A); // 8.  tv4 = A * tv4\n        tv2 = Fp.sqr(tv3); // 9.  tv2 = tv3^2\n        tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n        tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n        tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n        tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n        tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n        tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n        tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n        x = Fp.mul(tv1, tv3); // 17.   x = tv1 * tv3\n        const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n        y = Fp.mul(tv1, u); // 19.   y = tv1 * u  -> Z * u^3 * y1\n        y = Fp.mul(y, value); // 20.   y = y * y1\n        x = Fp.cmov(x, tv3, isValid); // 21.   x = CMOV(x, tv3, is_gx1_square)\n        y = Fp.cmov(y, value, isValid); // 22.   y = CMOV(y, y1, is_gx1_square)\n        const e1 = Fp.isOdd(u) === Fp.isOdd(y); // 23.  e1 = sgn0(u) == sgn0(y)\n        y = Fp.cmov(Fp.neg(y), y, e1); // 24.   y = CMOV(-y, y, e1)\n        const tv4_inv = (0,_modular_js__WEBPACK_IMPORTED_MODULE_3__.FpInvertBatch)(Fp, [tv4], true)[0];\n        x = Fp.mul(x, tv4_inv); // 25.   x = x / tv4\n        return { x, y };\n    };\n}\nfunction getWLengths(Fp, Fn) {\n    return {\n        secretKey: Fn.BYTES,\n        publicKey: 1 + Fp.BYTES,\n        publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n        publicKeyHasPrefix: true,\n        signature: 2 * Fn.BYTES,\n    };\n}\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nfunction ecdh(Point, ecdhOpts = {}) {\n    const { Fn } = Point;\n    const randomBytes_ = ecdhOpts.randomBytes || _utils_js__WEBPACK_IMPORTED_MODULE_2__.randomBytes;\n    const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: (0,_modular_js__WEBPACK_IMPORTED_MODULE_3__.getMinHashLength)(Fn.ORDER) });\n    function isValidSecretKey(secretKey) {\n        try {\n            return !!_normFnElement(Fn, secretKey);\n        }\n        catch (error) {\n            return false;\n        }\n    }\n    function isValidPublicKey(publicKey, isCompressed) {\n        const { publicKey: comp, publicKeyUncompressed } = lengths;\n        try {\n            const l = publicKey.length;\n            if (isCompressed === true && l !== comp)\n                return false;\n            if (isCompressed === false && l !== publicKeyUncompressed)\n                return false;\n            return !!Point.fromBytes(publicKey);\n        }\n        catch (error) {\n            return false;\n        }\n    }\n    /**\n     * Produces cryptographically secure secret key from random of size\n     * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n     */\n    function randomSecretKey(seed = randomBytes_(lengths.seed)) {\n        return (0,_modular_js__WEBPACK_IMPORTED_MODULE_3__.mapHashToField)((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abytes2)(seed, lengths.seed, 'seed'), Fn.ORDER);\n    }\n    /**\n     * Computes public key for a secret key. Checks for validity of the secret key.\n     * @param isCompressed whether to return compact (default), or full key\n     * @returns Public key, full when isCompressed=false; short when isCompressed=true\n     */\n    function getPublicKey(secretKey, isCompressed = true) {\n        return Point.BASE.multiply(_normFnElement(Fn, secretKey)).toBytes(isCompressed);\n    }\n    function keygen(seed) {\n        const secretKey = randomSecretKey(seed);\n        return { secretKey, publicKey: getPublicKey(secretKey) };\n    }\n    /**\n     * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n     */\n    function isProbPub(item) {\n        if (typeof item === 'bigint')\n            return false;\n        if (item instanceof Point)\n            return true;\n        const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n        if (Fn.allowedLengths || secretKey === publicKey)\n            return undefined;\n        const l = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('key', item).length;\n        return l === publicKey || l === publicKeyUncompressed;\n    }\n    /**\n     * ECDH (Elliptic Curve Diffie Hellman).\n     * Computes shared public key from secret key A and public key B.\n     * Checks: 1) secret key validity 2) shared key is on-curve.\n     * Does NOT hash the result.\n     * @param isCompressed whether to return compact (default), or full key\n     * @returns shared public key\n     */\n    function getSharedSecret(secretKeyA, publicKeyB, isCompressed = true) {\n        if (isProbPub(secretKeyA) === true)\n            throw new Error('first arg must be private key');\n        if (isProbPub(publicKeyB) === false)\n            throw new Error('second arg must be public key');\n        const s = _normFnElement(Fn, secretKeyA);\n        const b = Point.fromHex(publicKeyB); // checks for being on-curve\n        return b.multiply(s).toBytes(isCompressed);\n    }\n    const utils = {\n        isValidSecretKey,\n        isValidPublicKey,\n        randomSecretKey,\n        // TODO: remove\n        isValidPrivateKey: isValidSecretKey,\n        randomPrivateKey: randomSecretKey,\n        normPrivateKeyToScalar: (key) => _normFnElement(Fn, key),\n        precompute(windowSize = 8, point = Point.BASE) {\n            return point.precompute(windowSize, false);\n        },\n    };\n    return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n * We need `hash` for 2 features:\n * 1. Message prehash-ing. NOT used if `sign` / `verify` are called with `prehash: false`\n * 2. k generation in `sign`, using HMAC-drbg(hash)\n *\n * ECDSAOpts are only rarely needed.\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nfunction ecdsa(Point, hash, ecdsaOpts = {}) {\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.ahash)(hash);\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._validateObject)(ecdsaOpts, {}, {\n        hmac: 'function',\n        lowS: 'boolean',\n        randomBytes: 'function',\n        bits2int: 'function',\n        bits2int_modN: 'function',\n    });\n    const randomBytes = ecdsaOpts.randomBytes || _utils_js__WEBPACK_IMPORTED_MODULE_2__.randomBytes;\n    const hmac = ecdsaOpts.hmac ||\n        ((key, ...msgs) => (0,_noble_hashes_hmac_js__WEBPACK_IMPORTED_MODULE_4__.hmac)(hash, key, (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.concatBytes)(...msgs)));\n    const { Fp, Fn } = Point;\n    const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n    const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n    const defaultSigOpts = {\n        prehash: false,\n        lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : false,\n        format: undefined, //'compact' as ECDSASigFormat,\n        extraEntropy: false,\n    };\n    const defaultSigOpts_format = 'compact';\n    function isBiggerThanHalfOrder(number) {\n        const HALF = CURVE_ORDER >> _1n;\n        return number > HALF;\n    }\n    function validateRS(title, num) {\n        if (!Fn.isValidNot0(num))\n            throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n        return num;\n    }\n    function validateSigLength(bytes, format) {\n        validateSigFormat(format);\n        const size = lengths.signature;\n        const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n        return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abytes2)(bytes, sizer, `${format} signature`);\n    }\n    /**\n     * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n     */\n    class Signature {\n        constructor(r, s, recovery) {\n            this.r = validateRS('r', r); // r in [1..N-1];\n            this.s = validateRS('s', s); // s in [1..N-1];\n            if (recovery != null)\n                this.recovery = recovery;\n            Object.freeze(this);\n        }\n        static fromBytes(bytes, format = defaultSigOpts_format) {\n            validateSigLength(bytes, format);\n            let recid;\n            if (format === 'der') {\n                const { r, s } = DER.toSig((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abytes2)(bytes));\n                return new Signature(r, s);\n            }\n            if (format === 'recovered') {\n                recid = bytes[0];\n                format = 'compact';\n                bytes = bytes.subarray(1);\n            }\n            const L = Fn.BYTES;\n            const r = bytes.subarray(0, L);\n            const s = bytes.subarray(L, L * 2);\n            return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n        }\n        static fromHex(hex, format) {\n            return this.fromBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.hexToBytes)(hex), format);\n        }\n        addRecoveryBit(recovery) {\n            return new Signature(this.r, this.s, recovery);\n        }\n        recoverPublicKey(messageHash) {\n            const FIELD_ORDER = Fp.ORDER;\n            const { r, s, recovery: rec } = this;\n            if (rec == null || ![0, 1, 2, 3].includes(rec))\n                throw new Error('recovery id invalid');\n            // ECDSA recovery is hard for cofactor > 1 curves.\n            // In sign, `r = q.x mod n`, and here we recover q.x from r.\n            // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n            // However, for cofactor>1, r+n may not get q.x:\n            // r+n*i would need to be done instead where i is unknown.\n            // To easily get i, we either need to:\n            // a. increase amount of valid recid values (4, 5...); OR\n            // b. prohibit non-prime-order signatures (recid > 1).\n            const hasCofactor = CURVE_ORDER * _2n < FIELD_ORDER;\n            if (hasCofactor && rec > 1)\n                throw new Error('recovery id is ambiguous for h>1 curve');\n            const radj = rec === 2 || rec === 3 ? r + CURVE_ORDER : r;\n            if (!Fp.isValid(radj))\n                throw new Error('recovery id 2 or 3 invalid');\n            const x = Fp.toBytes(radj);\n            const R = Point.fromBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.concatBytes)(pprefix((rec & 1) === 0), x));\n            const ir = Fn.inv(radj); // r^-1\n            const h = bits2int_modN((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('msgHash', messageHash)); // Truncate hash\n            const u1 = Fn.create(-h * ir); // -hr^-1\n            const u2 = Fn.create(s * ir); // sr^-1\n            // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n            const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n            if (Q.is0())\n                throw new Error('point at infinify');\n            Q.assertValidity();\n            return Q;\n        }\n        // Signatures should be low-s, to prevent malleability.\n        hasHighS() {\n            return isBiggerThanHalfOrder(this.s);\n        }\n        toBytes(format = defaultSigOpts_format) {\n            validateSigFormat(format);\n            if (format === 'der')\n                return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.hexToBytes)(DER.hexFromSig(this));\n            const r = Fn.toBytes(this.r);\n            const s = Fn.toBytes(this.s);\n            if (format === 'recovered') {\n                if (this.recovery == null)\n                    throw new Error('recovery bit must be present');\n                return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.concatBytes)(Uint8Array.of(this.recovery), r, s);\n            }\n            return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.concatBytes)(r, s);\n        }\n        toHex(format) {\n            return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.bytesToHex)(this.toBytes(format));\n        }\n        // TODO: remove\n        assertValidity() { }\n        static fromCompact(hex) {\n            return Signature.fromBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('sig', hex), 'compact');\n        }\n        static fromDER(hex) {\n            return Signature.fromBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('sig', hex), 'der');\n        }\n        normalizeS() {\n            return this.hasHighS() ? new Signature(this.r, Fn.neg(this.s), this.recovery) : this;\n        }\n        toDERRawBytes() {\n            return this.toBytes('der');\n        }\n        toDERHex() {\n            return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.bytesToHex)(this.toBytes('der'));\n        }\n        toCompactRawBytes() {\n            return this.toBytes('compact');\n        }\n        toCompactHex() {\n            return (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.bytesToHex)(this.toBytes('compact'));\n        }\n    }\n    // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n    // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n    // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n    // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n    const bits2int = ecdsaOpts.bits2int ||\n        function bits2int_def(bytes) {\n            // Our custom check \"just in case\", for protection against DoS\n            if (bytes.length > 8192)\n                throw new Error('input is too large');\n            // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n            // for some cases, since bytes.length * 8 is not actual bitLength.\n            const num = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToNumberBE)(bytes); // check for == u8 done here\n            const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n            return delta > 0 ? num >> BigInt(delta) : num;\n        };\n    const bits2int_modN = ecdsaOpts.bits2int_modN ||\n        function bits2int_modN_def(bytes) {\n            return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n        };\n    // Pads output with zero as per spec\n    const ORDER_MASK = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.bitMask)(fnBits);\n    /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n    function int2octets(num) {\n        // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.aInRange)('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n        return Fn.toBytes(num);\n    }\n    function validateMsgAndHash(message, prehash) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abytes2)(message, undefined, 'message');\n        return prehash ? (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__._abytes2)(hash(message), undefined, 'prehashed message') : message;\n    }\n    /**\n     * Steps A, D of RFC6979 3.2.\n     * Creates RFC6979 seed; converts msg/privKey to numbers.\n     * Used only in sign, not in verify.\n     *\n     * Warning: we cannot assume here that message has same amount of bytes as curve order,\n     * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n     */\n    function prepSig(message, privateKey, opts) {\n        if (['recovered', 'canonical'].some((k) => k in opts))\n            throw new Error('sign() legacy options not supported');\n        const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n        message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n        // We can't later call bits2octets, since nested bits2int is broken for curves\n        // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n        // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n        const h1int = bits2int_modN(message);\n        const d = _normFnElement(Fn, privateKey); // validate secret key, convert to bigint\n        const seedArgs = [int2octets(d), int2octets(h1int)];\n        // extraEntropy. RFC6979 3.6: additional k' (optional).\n        if (extraEntropy != null && extraEntropy !== false) {\n            // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n            // gen random bytes OR pass as-is\n            const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n            seedArgs.push((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('extraEntropy', e)); // check for being bytes\n        }\n        const seed = (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.concatBytes)(...seedArgs); // Step D of RFC6979 3.2\n        const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n        // Converts signature params into point w r/s, checks result for validity.\n        // To transform k => Signature:\n        // q = k⋅G\n        // r = q.x mod n\n        // s = k^-1(m + rd) mod n\n        // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n        // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n        // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n        function k2sig(kBytes) {\n            // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n            // Important: all mod() calls here must be done over N\n            const k = bits2int(kBytes); // mod n, not mod p\n            if (!Fn.isValidNot0(k))\n                return; // Valid scalars (including k) must be in 1..N-1\n            const ik = Fn.inv(k); // k^-1 mod n\n            const q = Point.BASE.multiply(k).toAffine(); // q = k⋅G\n            const r = Fn.create(q.x); // r = q.x mod n\n            if (r === _0n)\n                return;\n            const s = Fn.create(ik * Fn.create(m + r * d)); // Not using blinding here, see comment above\n            if (s === _0n)\n                return;\n            let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n            let normS = s;\n            if (lowS && isBiggerThanHalfOrder(s)) {\n                normS = Fn.neg(s); // if lowS was passed, ensure s is always\n                recovery ^= 1; // // in the bottom half of N\n            }\n            return new Signature(r, normS, recovery); // use normS, not s\n        }\n        return { seed, k2sig };\n    }\n    /**\n     * Signs message hash with a secret key.\n     *\n     * ```\n     * sign(m, d) where\n     *   k = rfc6979_hmac_drbg(m, d)\n     *   (x, y) = G × k\n     *   r = x mod n\n     *   s = (m + dr) / k mod n\n     * ```\n     */\n    function sign(message, secretKey, opts = {}) {\n        message = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('message', message);\n        const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n        const drbg = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createHmacDrbg)(hash.outputLen, Fn.BYTES, hmac);\n        const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n        return sig;\n    }\n    function tryParsingSig(sg) {\n        // Try to deduce format\n        let sig = undefined;\n        const isHex = typeof sg === 'string' || (0,_utils_js__WEBPACK_IMPORTED_MODULE_2__.isBytes)(sg);\n        const isObj = !isHex &&\n            sg !== null &&\n            typeof sg === 'object' &&\n            typeof sg.r === 'bigint' &&\n            typeof sg.s === 'bigint';\n        if (!isHex && !isObj)\n            throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n        if (isObj) {\n            sig = new Signature(sg.r, sg.s);\n        }\n        else if (isHex) {\n            try {\n                sig = Signature.fromBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('sig', sg), 'der');\n            }\n            catch (derError) {\n                if (!(derError instanceof DER.Err))\n                    throw derError;\n            }\n            if (!sig) {\n                try {\n                    sig = Signature.fromBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('sig', sg), 'compact');\n                }\n                catch (error) {\n                    return false;\n                }\n            }\n        }\n        if (!sig)\n            return false;\n        return sig;\n    }\n    /**\n     * Verifies a signature against message and public key.\n     * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n     * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n     *\n     * ```\n     * verify(r, s, h, P) where\n     *   u1 = hs^-1 mod n\n     *   u2 = rs^-1 mod n\n     *   R = u1⋅G + u2⋅P\n     *   mod(R.x, n) == r\n     * ```\n     */\n    function verify(signature, message, publicKey, opts = {}) {\n        const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n        publicKey = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('publicKey', publicKey);\n        message = validateMsgAndHash((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('message', message), prehash);\n        if ('strict' in opts)\n            throw new Error('options.strict was renamed to lowS');\n        const sig = format === undefined\n            ? tryParsingSig(signature)\n            : Signature.fromBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ensureBytes)('sig', signature), format);\n        if (sig === false)\n            return false;\n        try {\n            const P = Point.fromBytes(publicKey);\n            if (lowS && sig.hasHighS())\n                return false;\n            const { r, s } = sig;\n            const h = bits2int_modN(message); // mod n, not mod p\n            const is = Fn.inv(s); // s^-1 mod n\n            const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n            const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n            const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1⋅G + u2⋅P\n            if (R.is0())\n                return false;\n            const v = Fn.create(R.x); // v = r.x mod n\n            return v === r;\n        }\n        catch (e) {\n            return false;\n        }\n    }\n    function recoverPublicKey(signature, message, opts = {}) {\n        const { prehash } = validateSigOpts(opts, defaultSigOpts);\n        message = validateMsgAndHash(message, prehash);\n        return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n    }\n    return Object.freeze({\n        keygen,\n        getPublicKey,\n        getSharedSecret,\n        utils,\n        lengths,\n        Point,\n        sign,\n        verify,\n        recoverPublicKey,\n        Signature,\n        hash,\n    });\n}\n/** @deprecated use `weierstrass` in newer releases */\nfunction weierstrassPoints(c) {\n    const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n    const Point = weierstrassN(CURVE, curveOpts);\n    return _weierstrass_new_output_to_legacy(c, Point);\n}\nfunction _weierstrass_legacy_opts_to_new(c) {\n    const CURVE = {\n        a: c.a,\n        b: c.b,\n        p: c.Fp.ORDER,\n        n: c.n,\n        h: c.h,\n        Gx: c.Gx,\n        Gy: c.Gy,\n    };\n    const Fp = c.Fp;\n    let allowedLengths = c.allowedPrivateKeyLengths\n        ? Array.from(new Set(c.allowedPrivateKeyLengths.map((l) => Math.ceil(l / 2))))\n        : undefined;\n    const Fn = (0,_modular_js__WEBPACK_IMPORTED_MODULE_3__.Field)(CURVE.n, {\n        BITS: c.nBitLength,\n        allowedLengths: allowedLengths,\n        modFromBytes: c.wrapPrivateKey,\n    });\n    const curveOpts = {\n        Fp,\n        Fn,\n        allowInfinityPoint: c.allowInfinityPoint,\n        endo: c.endo,\n        isTorsionFree: c.isTorsionFree,\n        clearCofactor: c.clearCofactor,\n        fromBytes: c.fromBytes,\n        toBytes: c.toBytes,\n    };\n    return { CURVE, curveOpts };\n}\nfunction _ecdsa_legacy_opts_to_new(c) {\n    const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n    const ecdsaOpts = {\n        hmac: c.hmac,\n        randomBytes: c.randomBytes,\n        lowS: c.lowS,\n        bits2int: c.bits2int,\n        bits2int_modN: c.bits2int_modN,\n    };\n    return { CURVE, curveOpts, hash: c.hash, ecdsaOpts };\n}\nfunction _legacyHelperEquat(Fp, a, b) {\n    /**\n     * y² = x³ + ax + b: Short weierstrass curve formula. Takes x, returns y².\n     * @returns y²\n     */\n    function weierstrassEquation(x) {\n        const x2 = Fp.sqr(x); // x * x\n        const x3 = Fp.mul(x2, x); // x² * x\n        return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x³ + a * x + b\n    }\n    return weierstrassEquation;\n}\nfunction _weierstrass_new_output_to_legacy(c, Point) {\n    const { Fp, Fn } = Point;\n    function isWithinCurveOrder(num) {\n        return (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.inRange)(num, _1n, Fn.ORDER);\n    }\n    const weierstrassEquation = _legacyHelperEquat(Fp, c.a, c.b);\n    return Object.assign({}, {\n        CURVE: c,\n        Point: Point,\n        ProjectivePoint: Point,\n        normPrivateKeyToScalar: (key) => _normFnElement(Fn, key),\n        weierstrassEquation,\n        isWithinCurveOrder,\n    });\n}\nfunction _ecdsa_new_output_to_legacy(c, _ecdsa) {\n    const Point = _ecdsa.Point;\n    return Object.assign({}, _ecdsa, {\n        ProjectivePoint: Point,\n        CURVE: Object.assign({}, c, (0,_modular_js__WEBPACK_IMPORTED_MODULE_3__.nLength)(Point.Fn.ORDER, Point.Fn.BITS)),\n    });\n}\n// _ecdsa_legacy\nfunction weierstrass(c) {\n    const { CURVE, curveOpts, hash, ecdsaOpts } = _ecdsa_legacy_opts_to_new(c);\n    const Point = weierstrassN(CURVE, curveOpts);\n    const signs = ecdsa(Point, hash, ecdsaOpts);\n    return _ecdsa_new_output_to_legacy(c, signs);\n}\n//# sourceMappingURL=weierstrass.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9hYnN0cmFjdC93ZWllcnN0cmFzcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUMwRDtBQUNkO0FBQ3VPO0FBQzVLO0FBQ1E7QUFDL0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGtEQUFPLFdBQVcsaURBQU0saUJBQWlCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLGtEQUFLO0FBQ1QsSUFBSSxrREFBSztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qiw4REFBbUI7QUFDM0M7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLDhEQUFtQjtBQUM5RCxzQkFBc0IsOERBQW1CO0FBQ3pDO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0Esc0JBQXNCLDhEQUFtQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSxvQkFBb0IsU0FBUztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwwREFBZTtBQUNsQyxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQSxnQkFBZ0IsK0JBQStCO0FBQy9DLHFCQUFxQixzREFBVztBQUNoQyxnQkFBZ0IsK0JBQStCO0FBQy9DO0FBQ0E7QUFDQSxnQkFBZ0IsMkJBQTJCO0FBQzNDLGdCQUFnQiwyQkFBMkI7QUFDM0M7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQixLQUFLO0FBQ0w7QUFDQSxnQkFBZ0IsdUJBQXVCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxZQUFZLGtCQUFrQjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNEQUFXO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEVBQTBFLFNBQVMsUUFBUSxXQUFXO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyw0Q0FBNEM7QUFDbkQsc0JBQXNCLDZEQUFrQjtBQUN4QyxZQUFZLFNBQVM7QUFDckI7QUFDQSxZQUFZLDhCQUE4QjtBQUMxQyxJQUFJLDBEQUFlLGNBQWM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsWUFBWSxPQUFPO0FBQ25CO0FBQ0Esa0NBQWtDLHlDQUF5QztBQUMzRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQSxRQUFRLGtEQUFLO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHNEQUFXO0FBQzlCO0FBQ0E7QUFDQSxtQkFBbUIsc0RBQVc7QUFDOUI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxtREFBTTtBQUNkLGdCQUFnQixpREFBaUQsV0FBVztBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDO0FBQ3hDLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFEQUFxRCxPQUFPLHdCQUF3QixNQUFNLGtCQUFrQixPQUFPO0FBQ25IO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEI7QUFDOUIsa0NBQWtDO0FBQ2xDLGdFQUFnRTtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQztBQUNoQyw4Q0FBOEM7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0RBQW9ELE1BQU07QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLG1EQUFRO0FBQ2pDLGdCQUFnQixVQUFVO0FBQzFCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakIsS0FBSztBQUNMO0FBQ0E7QUFDQSw0QkFBNEIsbURBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGNBQWMsbURBQVE7QUFDdEIsY0FBYyxtREFBUTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQsbURBQU07QUFDekQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsc0RBQVc7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0M7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixJQUFJO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQyxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDLDBEQUEwRDtBQUMxRCxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUMsb0JBQW9CLHNCQUFzQjtBQUMxQywwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQSxpRUFBaUU7QUFDakUsNkJBQTZCO0FBQzdCLDJEQUEyRCxxREFBVTtBQUNyRSw4QkFBOEIsd0JBQXdCO0FBQ3REO0FBQ0Esd0JBQXdCLHVCQUF1QjtBQUMvQyx3QkFBd0IsaUJBQWlCO0FBQ3pDLHdCQUF3QixpQkFBaUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixxREFBVTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQSxpRUFBaUU7QUFDakU7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix1QkFBdUI7QUFDL0Msd0JBQXdCLFNBQVMsRUFBRSx3REFBYSxvQkFBb0I7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBLDZCQUE2QjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGtEQUFLO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFEQUFVO0FBQzdCO0FBQ0E7QUFDQSw2QkFBNkIsbUNBQW1DO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixxREFBVTtBQUM3QjtBQUNBO0FBQ0EsbUJBQW1CLG9EQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiwyQ0FBSTtBQUN6Qiw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0VBQXdFO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGlCQUFpQjtBQUMzQztBQUNBLGtCQUFrQjtBQUNsQiwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDO0FBQ3ZDLGlDQUFpQztBQUNqQyxpQ0FBaUM7QUFDakMsNkJBQTZCO0FBQzdCLDhCQUE4QjtBQUM5Qiw0Q0FBNEM7QUFDNUM7QUFDQSxzQkFBc0I7QUFDdEIsaUNBQWlDO0FBQ2pDLCtCQUErQjtBQUMvQiw4QkFBOEI7QUFDOUIsa0NBQWtDO0FBQ2xDLCtCQUErQjtBQUMvQixnQ0FBZ0M7QUFDaEMsOEJBQThCO0FBQzlCLDhCQUE4QjtBQUM5QixvQ0FBb0M7QUFDcEMsK0JBQStCO0FBQy9CLHdDQUF3QztBQUN4QywrQkFBK0I7QUFDL0IsZ0NBQWdDO0FBQ2hDLHVDQUF1QztBQUN2Qyx1Q0FBdUM7QUFDdkM7QUFDQSx5QkFBeUIsU0FBUztBQUNsQywrQkFBK0I7QUFDL0Isc0NBQXNDO0FBQ3RDLHlDQUF5QztBQUN6Qyw2Q0FBNkM7QUFDN0Msb0NBQW9DO0FBQ3BDLG9DQUFvQztBQUNwQyxxQ0FBcUM7QUFDckMseUNBQXlDO0FBQ3pDLDBDQUEwQztBQUMxQztBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0MsdUNBQXVDO0FBQ3ZDO0FBQ0EsaUNBQWlDO0FBQ2pDLHNDQUFzQztBQUN0QyxvQ0FBb0M7QUFDcEMsc0NBQXNDO0FBQ3RDLGtDQUFrQztBQUNsQyx1Q0FBdUM7QUFDdkMsK0NBQStDLGtCQUFrQjtBQUNqRSx5Q0FBeUM7QUFDekMsMkNBQTJDO0FBQzNDLHFCQUFxQiwyQkFBMkI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLElBQUksMERBQWE7QUFDakIsWUFBWSxVQUFVO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCLDhCQUE4QjtBQUM5QiwyQkFBMkI7QUFDM0IsZ0NBQWdDO0FBQ2hDLG1DQUFtQztBQUNuQyw4QkFBOEI7QUFDOUIsOERBQThEO0FBQzlELDhCQUE4QjtBQUM5QiwyQkFBMkI7QUFDM0IsMkJBQTJCO0FBQzNCLDhCQUE4QjtBQUM5QixnQ0FBZ0M7QUFDaEMsZ0NBQWdDO0FBQ2hDLGdDQUFnQztBQUNoQyw4QkFBOEI7QUFDOUIsZ0NBQWdDO0FBQ2hDLDhCQUE4QjtBQUM5QixnQkFBZ0IsaUJBQWlCLHVCQUF1QjtBQUN4RCw0QkFBNEI7QUFDNUIsOEJBQThCO0FBQzlCLHNDQUFzQztBQUN0Qyx3Q0FBd0M7QUFDeEMsZ0RBQWdEO0FBQ2hELHVDQUF1QztBQUN2Qyx3QkFBd0IsMERBQWE7QUFDckMsZ0NBQWdDO0FBQ2hDLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxrQ0FBa0M7QUFDekMsWUFBWSxLQUFLO0FBQ2pCLGlEQUFpRCxrREFBYztBQUMvRCwrREFBK0QsTUFBTSw2REFBZ0IsWUFBWTtBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IseUNBQXlDO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLDJEQUFjLENBQUMsbURBQU07QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQ7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw4Q0FBOEM7QUFDOUQ7QUFDQTtBQUNBLGtCQUFrQixzREFBVztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSwyQkFBMkIsOERBQThEO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsMkJBQTJCLE9BQU87QUFDdkY7QUFDQTtBQUNPLDBDQUEwQztBQUNqRCxJQUFJLGdEQUFLO0FBQ1QsSUFBSSwwREFBZSxjQUFjO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsaURBQWlELGtEQUFjO0FBQy9EO0FBQ0EsMkJBQTJCLDJEQUFTLFlBQVksc0RBQVc7QUFDM0QsWUFBWSxTQUFTO0FBQ3JCLFlBQVksbUNBQW1DO0FBQy9DLFlBQVksd0RBQXdEO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaURBQWlELE1BQU07QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxtREFBTSxrQkFBa0IsUUFBUTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsT0FBTyxZQUFZLG1EQUFNO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHFEQUFVO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLHNEQUFXO0FBQ2pELHFDQUFxQztBQUNyQyxvQ0FBb0Msc0RBQVcsMkJBQTJCO0FBQzFFLDJDQUEyQztBQUMzQywwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixxREFBVTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNEQUFXO0FBQ2xDO0FBQ0EsbUJBQW1CLHNEQUFXO0FBQzlCO0FBQ0E7QUFDQSxtQkFBbUIscURBQVU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsc0RBQVc7QUFDbEQ7QUFDQTtBQUNBLHVDQUF1QyxzREFBVztBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHFEQUFVO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUIscURBQVU7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQztBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QiwwREFBZSxTQUFTO0FBQ2hELHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQztBQUMvQztBQUNBO0FBQ0EsdUJBQXVCLGtEQUFPO0FBQzlCO0FBQ0E7QUFDQTtBQUNBLFFBQVEsbURBQVE7QUFDaEI7QUFDQTtBQUNBO0FBQ0EsUUFBUSxtREFBTTtBQUNkLHlCQUF5QixtREFBTTtBQUMvQjtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiw4QkFBOEI7QUFDOUMsd0RBQXdEO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0RBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixzREFBVyxzQkFBc0I7QUFDM0Q7QUFDQSxxQkFBcUIsc0RBQVcsZUFBZTtBQUMvQyx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdDQUF3QztBQUN4QztBQUNBLHdCQUF3QjtBQUN4QixrQ0FBa0M7QUFDbEMseURBQXlEO0FBQ3pELHNDQUFzQztBQUN0QztBQUNBO0FBQ0EsNERBQTREO0FBQzVEO0FBQ0E7QUFDQSxvRUFBb0U7QUFDcEU7QUFDQTtBQUNBLG1DQUFtQztBQUNuQywrQkFBK0I7QUFDL0I7QUFDQSxzREFBc0Q7QUFDdEQ7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLGtCQUFrQixzREFBVztBQUM3QixnQkFBZ0IsY0FBYyxxQ0FBcUM7QUFDbkUscUJBQXFCLHlEQUFjO0FBQ25DLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELGtEQUFPO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxzREFBVztBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhDQUE4QyxzREFBVztBQUN6RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnREFBZ0Qsc0JBQXNCO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNERBQTREO0FBQzVELGdCQUFnQix3QkFBd0I7QUFDeEMsb0JBQW9CLHNEQUFXO0FBQy9CLHFDQUFxQyxzREFBVztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxzREFBVztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQiw4Q0FBOEM7QUFDOUMsa0NBQWtDO0FBQ2xDLDBDQUEwQztBQUMxQywwQ0FBMEM7QUFDMUMsK0VBQStFO0FBQy9FO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkRBQTJEO0FBQzNELGdCQUFnQixVQUFVO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ087QUFDUCxZQUFZLG1CQUFtQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxrREFBSztBQUNwQjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLFlBQVksbUJBQW1CO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCO0FBQzlCLGtDQUFrQztBQUNsQyxvREFBb0Q7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckI7QUFDQSxlQUFlLGtEQUFPO0FBQ3RCO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLCtCQUErQixLQUFLLG9EQUFPO0FBQzNDLEtBQUs7QUFDTDtBQUNBO0FBQ087QUFDUCxZQUFZLG9DQUFvQztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0Bub2JsZS9jdXJ2ZXMvZXNtL2Fic3RyYWN0L3dlaWVyc3RyYXNzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU2hvcnQgV2VpZXJzdHJhc3MgY3VydmUgbWV0aG9kcy4gVGhlIGZvcm11bGEgaXM6IHnCsiA9IHjCsyArIGF4ICsgYi5cbiAqXG4gKiAjIyMgRGVzaWduIHJhdGlvbmFsZSBmb3IgdHlwZXNcbiAqXG4gKiAqIEludGVyYWN0aW9uIGJldHdlZW4gY2xhc3NlcyBmcm9tIGRpZmZlcmVudCBjdXJ2ZXMgc2hvdWxkIGZhaWw6XG4gKiAgIGBrMjU2LlBvaW50LkJBU0UuYWRkKHAyNTYuUG9pbnQuQkFTRSlgXG4gKiAqIEZvciB0aGlzIHB1cnBvc2Ugd2Ugd2FudCB0byB1c2UgYGluc3RhbmNlb2ZgIG9wZXJhdG9yLCB3aGljaCBpcyBmYXN0IGFuZCB3b3JrcyBkdXJpbmcgcnVudGltZVxuICogKiBEaWZmZXJlbnQgY2FsbHMgb2YgYGN1cnZlKClgIHdvdWxkIHJldHVybiBkaWZmZXJlbnQgY2xhc3NlcyAtXG4gKiAgIGBjdXJ2ZShwYXJhbXMpICE9PSBjdXJ2ZShwYXJhbXMpYDogaWYgc29tZWJvZHkgZGVjaWRlZCB0byBtb25rZXktcGF0Y2ggdGhlaXIgY3VydmUsXG4gKiAgIGl0IHdvbid0IGFmZmVjdCBvdGhlcnNcbiAqXG4gKiBUeXBlU2NyaXB0IGNhbid0IGluZmVyIHR5cGVzIGZvciBjbGFzc2VzIGNyZWF0ZWQgaW5zaWRlIGEgZnVuY3Rpb24uIENsYXNzZXMgaXMgb25lIGluc3RhbmNlXG4gKiBvZiBub21pbmF0aXZlIHR5cGVzIGluIFR5cGVTY3JpcHQgYW5kIGludGVyZmFjZXMgb25seSBjaGVjayBmb3Igc2hhcGUsIHNvIGl0J3MgaGFyZCB0byBjcmVhdGVcbiAqIHVuaXF1ZSB0eXBlIGZvciBldmVyeSBmdW5jdGlvbiBjYWxsLlxuICpcbiAqIFdlIGNhbiB1c2UgZ2VuZXJpYyB0eXBlcyB2aWEgc29tZSBwYXJhbSwgbGlrZSBjdXJ2ZSBvcHRzLCBidXQgdGhhdCB3b3VsZDpcbiAqICAgICAxLiBFbmFibGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBgY3VydmUocGFyYW1zKWAgYW5kIGBjdXJ2ZShwYXJhbXMpYCAoY3VydmVzIG9mIHNhbWUgcGFyYW1zKVxuICogICAgIHdoaWNoIGlzIGhhcmQgdG8gZGVidWcuXG4gKiAgICAgMi4gUGFyYW1zIGNhbiBiZSBnZW5lcmljIGFuZCB3ZSBjYW4ndCBlbmZvcmNlIHRoZW0gdG8gYmUgY29uc3RhbnQgdmFsdWU6XG4gKiAgICAgaWYgc29tZWJvZHkgY3JlYXRlcyBjdXJ2ZSBmcm9tIG5vbi1jb25zdGFudCBwYXJhbXMsXG4gKiAgICAgaXQgd291bGQgYmUgYWxsb3dlZCB0byBpbnRlcmFjdCB3aXRoIG90aGVyIGN1cnZlcyB3aXRoIG5vbi1jb25zdGFudCBwYXJhbXNcbiAqXG4gKiBAdG9kbyBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtMi03Lmh0bWwjdW5pcXVlLXN5bWJvbFxuICogQG1vZHVsZVxuICovXG4vKiEgbm9ibGUtY3VydmVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG5pbXBvcnQgeyBobWFjIGFzIG5vYmxlSG1hYyB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvaG1hYy5qcyc7XG5pbXBvcnQgeyBhaGFzaCB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvdXRpbHMnO1xuaW1wb3J0IHsgX3ZhbGlkYXRlT2JqZWN0LCBfYWJvb2wyIGFzIGFib29sLCBfYWJ5dGVzMiBhcyBhYnl0ZXMsIGFJblJhbmdlLCBiaXRMZW4sIGJpdE1hc2ssIGJ5dGVzVG9IZXgsIGJ5dGVzVG9OdW1iZXJCRSwgY29uY2F0Qnl0ZXMsIGNyZWF0ZUhtYWNEcmJnLCBlbnN1cmVCeXRlcywgaGV4VG9CeXRlcywgaW5SYW5nZSwgaXNCeXRlcywgbWVtb2l6ZWQsIG51bWJlclRvSGV4VW5wYWRkZWQsIHJhbmRvbUJ5dGVzIGFzIHJhbmRvbUJ5dGVzV2ViLCB9IGZyb20gXCIuLi91dGlscy5qc1wiO1xuaW1wb3J0IHsgX2NyZWF0ZUN1cnZlRmllbGRzLCBtdWxFbmRvVW5zYWZlLCBuZWdhdGVDdCwgbm9ybWFsaXplWiwgcGlwcGVuZ2VyLCB3TkFGLCB9IGZyb20gXCIuL2N1cnZlLmpzXCI7XG5pbXBvcnQgeyBGaWVsZCwgRnBJbnZlcnRCYXRjaCwgZ2V0TWluSGFzaExlbmd0aCwgbWFwSGFzaFRvRmllbGQsIG5MZW5ndGgsIHZhbGlkYXRlRmllbGQsIH0gZnJvbSBcIi4vbW9kdWxhci5qc1wiO1xuLy8gV2UgY29uc3RydWN0IGJhc2lzIGluIHN1Y2ggd2F5IHRoYXQgZGVuIGlzIGFsd2F5cyBwb3NpdGl2ZSBhbmQgZXF1YWxzIG4sIGJ1dCBudW0gc2lnbiBkZXBlbmRzIG9uIGJhc2lzIChub3Qgb24gc2VjcmV0IHZhbHVlKVxuY29uc3QgZGl2TmVhcmVzdCA9IChudW0sIGRlbikgPT4gKG51bSArIChudW0gPj0gMCA/IGRlbiA6IC1kZW4pIC8gXzJuKSAvIGRlbjtcbi8qKlxuICogU3BsaXRzIHNjYWxhciBmb3IgR0xWIGVuZG9tb3JwaGlzbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9zcGxpdEVuZG9TY2FsYXIoaywgYmFzaXMsIG4pIHtcbiAgICAvLyBTcGxpdCBzY2FsYXIgaW50byB0d28gc3VjaCB0aGF0IHBhcnQgaXMgfmhhbGYgYml0czogYGFicyhwYXJ0KSA8IHNxcnQoTilgXG4gICAgLy8gU2luY2UgcGFydCBjYW4gYmUgbmVnYXRpdmUsIHdlIG5lZWQgdG8gZG8gdGhpcyBvbiBwb2ludC5cbiAgICAvLyBUT0RPOiB2ZXJpZnlTY2FsYXIgZnVuY3Rpb24gd2hpY2ggY29uc3VtZXMgbGFtYmRhXG4gICAgY29uc3QgW1thMSwgYjFdLCBbYTIsIGIyXV0gPSBiYXNpcztcbiAgICBjb25zdCBjMSA9IGRpdk5lYXJlc3QoYjIgKiBrLCBuKTtcbiAgICBjb25zdCBjMiA9IGRpdk5lYXJlc3QoLWIxICogaywgbik7XG4gICAgLy8gfGsxfC98azJ8IGlzIDwgc3FydChOKSwgYnV0IGNhbiBiZSBuZWdhdGl2ZS5cbiAgICAvLyBJZiB3ZSBkbyBgazEgbW9kIE5gLCB3ZSdsbCBnZXQgYmlnIHNjYWxhciAoYD4gc3FydChOKWApOiBzbywgd2UgZG8gY2hlYXBlciBuZWdhdGlvbiBpbnN0ZWFkLlxuICAgIGxldCBrMSA9IGsgLSBjMSAqIGExIC0gYzIgKiBhMjtcbiAgICBsZXQgazIgPSAtYzEgKiBiMSAtIGMyICogYjI7XG4gICAgY29uc3QgazFuZWcgPSBrMSA8IF8wbjtcbiAgICBjb25zdCBrMm5lZyA9IGsyIDwgXzBuO1xuICAgIGlmIChrMW5lZylcbiAgICAgICAgazEgPSAtazE7XG4gICAgaWYgKGsybmVnKVxuICAgICAgICBrMiA9IC1rMjtcbiAgICAvLyBEb3VibGUgY2hlY2sgdGhhdCByZXN1bHRpbmcgc2NhbGFyIGxlc3MgdGhhbiBoYWxmIGJpdHMgb2YgTjogb3RoZXJ3aXNlIHdOQUYgd2lsbCBmYWlsLlxuICAgIC8vIFRoaXMgc2hvdWxkIG9ubHkgaGFwcGVuIG9uIHdyb25nIGJhc2lzZXMuIEFsc28sIG1hdGggaW5zaWRlIGlzIHRvbyBjb21wbGV4IGFuZCBJIGRvbid0IHRydXN0IGl0LlxuICAgIGNvbnN0IE1BWF9OVU0gPSBiaXRNYXNrKE1hdGguY2VpbChiaXRMZW4obikgLyAyKSkgKyBfMW47IC8vIEhhbGYgYml0cyBvZiBOXG4gICAgaWYgKGsxIDwgXzBuIHx8IGsxID49IE1BWF9OVU0gfHwgazIgPCBfMG4gfHwgazIgPj0gTUFYX05VTSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NwbGl0U2NhbGFyIChlbmRvbW9ycGhpc20pOiBmYWlsZWQsIGs9JyArIGspO1xuICAgIH1cbiAgICByZXR1cm4geyBrMW5lZywgazEsIGsybmVnLCBrMiB9O1xufVxuZnVuY3Rpb24gdmFsaWRhdGVTaWdGb3JtYXQoZm9ybWF0KSB7XG4gICAgaWYgKCFbJ2NvbXBhY3QnLCAncmVjb3ZlcmVkJywgJ2RlciddLmluY2x1ZGVzKGZvcm1hdCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2lnbmF0dXJlIGZvcm1hdCBtdXN0IGJlIFwiY29tcGFjdFwiLCBcInJlY292ZXJlZFwiLCBvciBcImRlclwiJyk7XG4gICAgcmV0dXJuIGZvcm1hdDtcbn1cbmZ1bmN0aW9uIHZhbGlkYXRlU2lnT3B0cyhvcHRzLCBkZWYpIHtcbiAgICBjb25zdCBvcHRzbiA9IHt9O1xuICAgIGZvciAobGV0IG9wdE5hbWUgb2YgT2JqZWN0LmtleXMoZGVmKSkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG9wdHNuW29wdE5hbWVdID0gb3B0c1tvcHROYW1lXSA9PT0gdW5kZWZpbmVkID8gZGVmW29wdE5hbWVdIDogb3B0c1tvcHROYW1lXTtcbiAgICB9XG4gICAgYWJvb2wob3B0c24ubG93UywgJ2xvd1MnKTtcbiAgICBhYm9vbChvcHRzbi5wcmVoYXNoLCAncHJlaGFzaCcpO1xuICAgIGlmIChvcHRzbi5mb3JtYXQgIT09IHVuZGVmaW5lZClcbiAgICAgICAgdmFsaWRhdGVTaWdGb3JtYXQob3B0c24uZm9ybWF0KTtcbiAgICByZXR1cm4gb3B0c247XG59XG5leHBvcnQgY2xhc3MgREVSRXJyIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG0gPSAnJykge1xuICAgICAgICBzdXBlcihtKTtcbiAgICB9XG59XG4vKipcbiAqIEFTTi4xIERFUiBlbmNvZGluZyB1dGlsaXRpZXMuIEFTTiBpcyB2ZXJ5IGNvbXBsZXggJiBmcmFnaWxlLiBGb3JtYXQ6XG4gKlxuICogICAgIFsweDMwIChTRVFVRU5DRSksIGJ5dGVsZW5ndGgsIDB4MDIgKElOVEVHRVIpLCBpbnRMZW5ndGgsIFIsIDB4MDIgKElOVEVHRVIpLCBpbnRMZW5ndGgsIFNdXG4gKlxuICogRG9jczogaHR0cHM6Ly9sZXRzZW5jcnlwdC5vcmcvZG9jcy9hLXdhcm0td2VsY29tZS10by1hc24xLWFuZC1kZXIvLCBodHRwczovL2x1Y2EubnRvcC5vcmcvVGVhY2hpbmcvQXBwdW50aS9hc24xLmh0bWxcbiAqL1xuZXhwb3J0IGNvbnN0IERFUiA9IHtcbiAgICAvLyBhc24uMSBERVIgZW5jb2RpbmcgdXRpbHNcbiAgICBFcnI6IERFUkVycixcbiAgICAvLyBCYXNpYyBidWlsZGluZyBibG9jayBpcyBUTFYgKFRhZy1MZW5ndGgtVmFsdWUpXG4gICAgX3Rsdjoge1xuICAgICAgICBlbmNvZGU6ICh0YWcsIGRhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHsgRXJyOiBFIH0gPSBERVI7XG4gICAgICAgICAgICBpZiAodGFnIDwgMCB8fCB0YWcgPiAyNTYpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ3Rsdi5lbmNvZGU6IHdyb25nIHRhZycpO1xuICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoICYgMSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRSgndGx2LmVuY29kZTogdW5wYWRkZWQgZGF0YScpO1xuICAgICAgICAgICAgY29uc3QgZGF0YUxlbiA9IGRhdGEubGVuZ3RoIC8gMjtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IG51bWJlclRvSGV4VW5wYWRkZWQoZGF0YUxlbik7XG4gICAgICAgICAgICBpZiAoKGxlbi5sZW5ndGggLyAyKSAmIDEyOClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRSgndGx2LmVuY29kZTogbG9uZyBmb3JtIGxlbmd0aCB0b28gYmlnJyk7XG4gICAgICAgICAgICAvLyBsZW5ndGggb2YgbGVuZ3RoIHdpdGggbG9uZyBmb3JtIGZsYWdcbiAgICAgICAgICAgIGNvbnN0IGxlbkxlbiA9IGRhdGFMZW4gPiAxMjcgPyBudW1iZXJUb0hleFVucGFkZGVkKChsZW4ubGVuZ3RoIC8gMikgfCAxMjgpIDogJyc7XG4gICAgICAgICAgICBjb25zdCB0ID0gbnVtYmVyVG9IZXhVbnBhZGRlZCh0YWcpO1xuICAgICAgICAgICAgcmV0dXJuIHQgKyBsZW5MZW4gKyBsZW4gKyBkYXRhO1xuICAgICAgICB9LFxuICAgICAgICAvLyB2IC0gdmFsdWUsIGwgLSBsZWZ0IGJ5dGVzICh1bnBhcnNlZClcbiAgICAgICAgZGVjb2RlKHRhZywgZGF0YSkge1xuICAgICAgICAgICAgY29uc3QgeyBFcnI6IEUgfSA9IERFUjtcbiAgICAgICAgICAgIGxldCBwb3MgPSAwO1xuICAgICAgICAgICAgaWYgKHRhZyA8IDAgfHwgdGFnID4gMjU2KVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFKCd0bHYuZW5jb2RlOiB3cm9uZyB0YWcnKTtcbiAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA8IDIgfHwgZGF0YVtwb3MrK10gIT09IHRhZylcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRSgndGx2LmRlY29kZTogd3JvbmcgdGx2Jyk7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGRhdGFbcG9zKytdO1xuICAgICAgICAgICAgY29uc3QgaXNMb25nID0gISEoZmlyc3QgJiAxMjgpOyAvLyBGaXJzdCBiaXQgb2YgZmlyc3QgbGVuZ3RoIGJ5dGUgaXMgZmxhZyBmb3Igc2hvcnQvbG9uZyBmb3JtXG4gICAgICAgICAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGlmICghaXNMb25nKVxuICAgICAgICAgICAgICAgIGxlbmd0aCA9IGZpcnN0O1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTG9uZyBmb3JtOiBbbG9uZ0ZsYWcoMWJpdCksIGxlbmd0aExlbmd0aCg3Yml0KSwgbGVuZ3RoIChCRSldXG4gICAgICAgICAgICAgICAgY29uc3QgbGVuTGVuID0gZmlyc3QgJiAxMjc7XG4gICAgICAgICAgICAgICAgaWYgKCFsZW5MZW4pXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFKCd0bHYuZGVjb2RlKGxvbmcpOiBpbmRlZmluaXRlIGxlbmd0aCBub3Qgc3VwcG9ydGVkJyk7XG4gICAgICAgICAgICAgICAgaWYgKGxlbkxlbiA+IDQpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFKCd0bHYuZGVjb2RlKGxvbmcpOiBieXRlIGxlbmd0aCBpcyB0b28gYmlnJyk7IC8vIHRoaXMgd2lsbCBvdmVyZmxvdyB1MzIgaW4ganNcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGhCeXRlcyA9IGRhdGEuc3ViYXJyYXkocG9zLCBwb3MgKyBsZW5MZW4pO1xuICAgICAgICAgICAgICAgIGlmIChsZW5ndGhCeXRlcy5sZW5ndGggIT09IGxlbkxlbilcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ3Rsdi5kZWNvZGU6IGxlbmd0aCBieXRlcyBub3QgY29tcGxldGUnKTtcbiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoQnl0ZXNbMF0gPT09IDApXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFKCd0bHYuZGVjb2RlKGxvbmcpOiB6ZXJvIGxlZnRtb3N0IGJ5dGUnKTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGIgb2YgbGVuZ3RoQnl0ZXMpXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IChsZW5ndGggPDwgOCkgfCBiO1xuICAgICAgICAgICAgICAgIHBvcyArPSBsZW5MZW47XG4gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDEyOClcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ3Rsdi5kZWNvZGUobG9uZyk6IG5vdCBtaW5pbWFsIGVuY29kaW5nJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2ID0gZGF0YS5zdWJhcnJheShwb3MsIHBvcyArIGxlbmd0aCk7XG4gICAgICAgICAgICBpZiAodi5sZW5ndGggIT09IGxlbmd0aClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRSgndGx2LmRlY29kZTogd3JvbmcgdmFsdWUgbGVuZ3RoJyk7XG4gICAgICAgICAgICByZXR1cm4geyB2LCBsOiBkYXRhLnN1YmFycmF5KHBvcyArIGxlbmd0aCkgfTtcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGh0dHBzOi8vY3J5cHRvLnN0YWNrZXhjaGFuZ2UuY29tL2EvNTc3MzQgTGVmdG1vc3QgYml0IG9mIGZpcnN0IGJ5dGUgaXMgJ25lZ2F0aXZlJyBmbGFnLFxuICAgIC8vIHNpbmNlIHdlIGFsd2F5cyB1c2UgcG9zaXRpdmUgaW50ZWdlcnMgaGVyZS4gSXQgbXVzdCBhbHdheXMgYmUgZW1wdHk6XG4gICAgLy8gLSBhZGQgemVybyBieXRlIGlmIGV4aXN0c1xuICAgIC8vIC0gaWYgbmV4dCBieXRlIGRvZXNuJ3QgaGF2ZSBhIGZsYWcsIGxlYWRpbmcgemVybyBpcyBub3QgYWxsb3dlZCAobWluaW1hbCBlbmNvZGluZylcbiAgICBfaW50OiB7XG4gICAgICAgIGVuY29kZShudW0pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgRXJyOiBFIH0gPSBERVI7XG4gICAgICAgICAgICBpZiAobnVtIDwgXzBuKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFKCdpbnRlZ2VyOiBuZWdhdGl2ZSBpbnRlZ2VycyBhcmUgbm90IGFsbG93ZWQnKTtcbiAgICAgICAgICAgIGxldCBoZXggPSBudW1iZXJUb0hleFVucGFkZGVkKG51bSk7XG4gICAgICAgICAgICAvLyBQYWQgd2l0aCB6ZXJvIGJ5dGUgaWYgbmVnYXRpdmUgZmxhZyBpcyBwcmVzZW50XG4gICAgICAgICAgICBpZiAoTnVtYmVyLnBhcnNlSW50KGhleFswXSwgMTYpICYgMGIxMDAwKVxuICAgICAgICAgICAgICAgIGhleCA9ICcwMCcgKyBoZXg7XG4gICAgICAgICAgICBpZiAoaGV4Lmxlbmd0aCAmIDEpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ3VuZXhwZWN0ZWQgREVSIHBhcnNpbmcgYXNzZXJ0aW9uOiB1bnBhZGRlZCBoZXgnKTtcbiAgICAgICAgICAgIHJldHVybiBoZXg7XG4gICAgICAgIH0sXG4gICAgICAgIGRlY29kZShkYXRhKSB7XG4gICAgICAgICAgICBjb25zdCB7IEVycjogRSB9ID0gREVSO1xuICAgICAgICAgICAgaWYgKGRhdGFbMF0gJiAxMjgpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ2ludmFsaWQgc2lnbmF0dXJlIGludGVnZXI6IG5lZ2F0aXZlJyk7XG4gICAgICAgICAgICBpZiAoZGF0YVswXSA9PT0gMHgwMCAmJiAhKGRhdGFbMV0gJiAxMjgpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFKCdpbnZhbGlkIHNpZ25hdHVyZSBpbnRlZ2VyOiB1bm5lY2Vzc2FyeSBsZWFkaW5nIHplcm8nKTtcbiAgICAgICAgICAgIHJldHVybiBieXRlc1RvTnVtYmVyQkUoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgfSxcbiAgICB0b1NpZyhoZXgpIHtcbiAgICAgICAgLy8gcGFyc2UgREVSIHNpZ25hdHVyZVxuICAgICAgICBjb25zdCB7IEVycjogRSwgX2ludDogaW50LCBfdGx2OiB0bHYgfSA9IERFUjtcbiAgICAgICAgY29uc3QgZGF0YSA9IGVuc3VyZUJ5dGVzKCdzaWduYXR1cmUnLCBoZXgpO1xuICAgICAgICBjb25zdCB7IHY6IHNlcUJ5dGVzLCBsOiBzZXFMZWZ0Qnl0ZXMgfSA9IHRsdi5kZWNvZGUoMHgzMCwgZGF0YSk7XG4gICAgICAgIGlmIChzZXFMZWZ0Qnl0ZXMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ2ludmFsaWQgc2lnbmF0dXJlOiBsZWZ0IGJ5dGVzIGFmdGVyIHBhcnNpbmcnKTtcbiAgICAgICAgY29uc3QgeyB2OiByQnl0ZXMsIGw6IHJMZWZ0Qnl0ZXMgfSA9IHRsdi5kZWNvZGUoMHgwMiwgc2VxQnl0ZXMpO1xuICAgICAgICBjb25zdCB7IHY6IHNCeXRlcywgbDogc0xlZnRCeXRlcyB9ID0gdGx2LmRlY29kZSgweDAyLCByTGVmdEJ5dGVzKTtcbiAgICAgICAgaWYgKHNMZWZ0Qnl0ZXMubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEUoJ2ludmFsaWQgc2lnbmF0dXJlOiBsZWZ0IGJ5dGVzIGFmdGVyIHBhcnNpbmcnKTtcbiAgICAgICAgcmV0dXJuIHsgcjogaW50LmRlY29kZShyQnl0ZXMpLCBzOiBpbnQuZGVjb2RlKHNCeXRlcykgfTtcbiAgICB9LFxuICAgIGhleEZyb21TaWcoc2lnKSB7XG4gICAgICAgIGNvbnN0IHsgX3RsdjogdGx2LCBfaW50OiBpbnQgfSA9IERFUjtcbiAgICAgICAgY29uc3QgcnMgPSB0bHYuZW5jb2RlKDB4MDIsIGludC5lbmNvZGUoc2lnLnIpKTtcbiAgICAgICAgY29uc3Qgc3MgPSB0bHYuZW5jb2RlKDB4MDIsIGludC5lbmNvZGUoc2lnLnMpKTtcbiAgICAgICAgY29uc3Qgc2VxID0gcnMgKyBzcztcbiAgICAgICAgcmV0dXJuIHRsdi5lbmNvZGUoMHgzMCwgc2VxKTtcbiAgICB9LFxufTtcbi8vIEJlIGZyaWVuZGx5IHRvIGJhZCBFQ01BU2NyaXB0IHBhcnNlcnMgYnkgbm90IHVzaW5nIGJpZ2ludCBsaXRlcmFsc1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBfMG4gPSBCaWdJbnQoMCksIF8xbiA9IEJpZ0ludCgxKSwgXzJuID0gQmlnSW50KDIpLCBfM24gPSBCaWdJbnQoMyksIF80biA9IEJpZ0ludCg0KTtcbmV4cG9ydCBmdW5jdGlvbiBfbm9ybUZuRWxlbWVudChGbiwga2V5KSB7XG4gICAgY29uc3QgeyBCWVRFUzogZXhwZWN0ZWQgfSA9IEZuO1xuICAgIGxldCBudW07XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdiaWdpbnQnKSB7XG4gICAgICAgIG51bSA9IGtleTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGxldCBieXRlcyA9IGVuc3VyZUJ5dGVzKCdwcml2YXRlIGtleScsIGtleSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBudW0gPSBGbi5mcm9tQnl0ZXMoYnl0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIHByaXZhdGUga2V5OiBleHBlY3RlZCB1aThhIG9mIHNpemUgJHtleHBlY3RlZH0sIGdvdCAke3R5cGVvZiBrZXl9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFGbi5pc1ZhbGlkTm90MChudW0pKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcHJpdmF0ZSBrZXk6IG91dCBvZiByYW5nZSBbMS4uTi0xXScpO1xuICAgIHJldHVybiBudW07XG59XG4vKipcbiAqIENyZWF0ZXMgd2VpZXJzdHJhc3MgUG9pbnQgY29uc3RydWN0b3IsIGJhc2VkIG9uIHNwZWNpZmllZCBjdXJ2ZSBvcHRpb25zLlxuICpcbiAqIEBleGFtcGxlXG5gYGBqc1xuY29uc3Qgb3B0cyA9IHtcbiAgcDogQmlnSW50KCcweGZmZmZmZmZmMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnKSxcbiAgbjogQmlnSW50KCcweGZmZmZmZmZmMDAwMDAwMDBmZmZmZmZmZmZmZmZmZmZmYmNlNmZhYWRhNzE3OWU4NGYzYjljYWMyZmM2MzI1NTEnKSxcbiAgaDogQmlnSW50KDEpLFxuICBhOiBCaWdJbnQoJzB4ZmZmZmZmZmYwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYycpLFxuICBiOiBCaWdJbnQoJzB4NWFjNjM1ZDhhYTNhOTNlN2IzZWJiZDU1NzY5ODg2YmM2NTFkMDZiMGNjNTNiMGY2M2JjZTNjM2UyN2QyNjA0YicpLFxuICBHeDogQmlnSW50KCcweDZiMTdkMWYyZTEyYzQyNDdmOGJjZTZlNTYzYTQ0MGYyNzcwMzdkODEyZGViMzNhMGY0YTEzOTQ1ZDg5OGMyOTYnKSxcbiAgR3k6IEJpZ0ludCgnMHg0ZmUzNDJlMmZlMWE3ZjliOGVlN2ViNGE3YzBmOWUxNjJiY2UzMzU3NmIzMTVlY2VjYmI2NDA2ODM3YmY1MWY1JyksXG59O1xuY29uc3QgcDI1Nl9Qb2ludCA9IHdlaWVyc3RyYXNzKG9wdHMpO1xuYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWllcnN0cmFzc04ocGFyYW1zLCBleHRyYU9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHZhbGlkYXRlZCA9IF9jcmVhdGVDdXJ2ZUZpZWxkcygnd2VpZXJzdHJhc3MnLCBwYXJhbXMsIGV4dHJhT3B0cyk7XG4gICAgY29uc3QgeyBGcCwgRm4gfSA9IHZhbGlkYXRlZDtcbiAgICBsZXQgQ1VSVkUgPSB2YWxpZGF0ZWQuQ1VSVkU7XG4gICAgY29uc3QgeyBoOiBjb2ZhY3RvciwgbjogQ1VSVkVfT1JERVIgfSA9IENVUlZFO1xuICAgIF92YWxpZGF0ZU9iamVjdChleHRyYU9wdHMsIHt9LCB7XG4gICAgICAgIGFsbG93SW5maW5pdHlQb2ludDogJ2Jvb2xlYW4nLFxuICAgICAgICBjbGVhckNvZmFjdG9yOiAnZnVuY3Rpb24nLFxuICAgICAgICBpc1RvcnNpb25GcmVlOiAnZnVuY3Rpb24nLFxuICAgICAgICBmcm9tQnl0ZXM6ICdmdW5jdGlvbicsXG4gICAgICAgIHRvQnl0ZXM6ICdmdW5jdGlvbicsXG4gICAgICAgIGVuZG86ICdvYmplY3QnLFxuICAgICAgICB3cmFwUHJpdmF0ZUtleTogJ2Jvb2xlYW4nLFxuICAgIH0pO1xuICAgIGNvbnN0IHsgZW5kbyB9ID0gZXh0cmFPcHRzO1xuICAgIGlmIChlbmRvKSB7XG4gICAgICAgIC8vIHZhbGlkYXRlT2JqZWN0KGVuZG8sIHsgYmV0YTogJ2JpZ2ludCcsIHNwbGl0U2NhbGFyOiAnZnVuY3Rpb24nIH0pO1xuICAgICAgICBpZiAoIUZwLmlzMChDVVJWRS5hKSB8fCB0eXBlb2YgZW5kby5iZXRhICE9PSAnYmlnaW50JyB8fCAhQXJyYXkuaXNBcnJheShlbmRvLmJhc2lzZXMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgZW5kbzogZXhwZWN0ZWQgXCJiZXRhXCI6IGJpZ2ludCBhbmQgXCJiYXNpc2VzXCI6IGFycmF5Jyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGVuZ3RocyA9IGdldFdMZW5ndGhzKEZwLCBGbik7XG4gICAgZnVuY3Rpb24gYXNzZXJ0Q29tcHJlc3Npb25Jc1N1cHBvcnRlZCgpIHtcbiAgICAgICAgaWYgKCFGcC5pc09kZClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcHJlc3Npb24gaXMgbm90IHN1cHBvcnRlZDogRmllbGQgZG9lcyBub3QgaGF2ZSAuaXNPZGQoKScpO1xuICAgIH1cbiAgICAvLyBJbXBsZW1lbnRzIElFRUUgUDEzNjMgcG9pbnQgZW5jb2RpbmdcbiAgICBmdW5jdGlvbiBwb2ludFRvQnl0ZXMoX2MsIHBvaW50LCBpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgY29uc3QgeyB4LCB5IH0gPSBwb2ludC50b0FmZmluZSgpO1xuICAgICAgICBjb25zdCBieCA9IEZwLnRvQnl0ZXMoeCk7XG4gICAgICAgIGFib29sKGlzQ29tcHJlc3NlZCwgJ2lzQ29tcHJlc3NlZCcpO1xuICAgICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgICAgICBhc3NlcnRDb21wcmVzc2lvbklzU3VwcG9ydGVkKCk7XG4gICAgICAgICAgICBjb25zdCBoYXNFdmVuWSA9ICFGcC5pc09kZCh5KTtcbiAgICAgICAgICAgIHJldHVybiBjb25jYXRCeXRlcyhwcHJlZml4KGhhc0V2ZW5ZKSwgYngpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmNhdEJ5dGVzKFVpbnQ4QXJyYXkub2YoMHgwNCksIGJ4LCBGcC50b0J5dGVzKHkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwb2ludEZyb21CeXRlcyhieXRlcykge1xuICAgICAgICBhYnl0ZXMoYnl0ZXMsIHVuZGVmaW5lZCwgJ1BvaW50Jyk7XG4gICAgICAgIGNvbnN0IHsgcHVibGljS2V5OiBjb21wLCBwdWJsaWNLZXlVbmNvbXByZXNzZWQ6IHVuY29tcCB9ID0gbGVuZ3RoczsgLy8gZS5nLiBmb3IgMzItYnl0ZTogMzMsIDY1XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaGVhZCA9IGJ5dGVzWzBdO1xuICAgICAgICBjb25zdCB0YWlsID0gYnl0ZXMuc3ViYXJyYXkoMSk7XG4gICAgICAgIC8vIE5vIGFjdHVhbCB2YWxpZGF0aW9uIGlzIGRvbmUgaGVyZTogdXNlIC5hc3NlcnRWYWxpZGl0eSgpXG4gICAgICAgIGlmIChsZW5ndGggPT09IGNvbXAgJiYgKGhlYWQgPT09IDB4MDIgfHwgaGVhZCA9PT0gMHgwMykpIHtcbiAgICAgICAgICAgIGNvbnN0IHggPSBGcC5mcm9tQnl0ZXModGFpbCk7XG4gICAgICAgICAgICBpZiAoIUZwLmlzVmFsaWQoeCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcG9pbnQ6IGlzIG5vdCBvbiBjdXJ2ZSwgd3JvbmcgeCcpO1xuICAgICAgICAgICAgY29uc3QgeTIgPSB3ZWllcnN0cmFzc0VxdWF0aW9uKHgpOyAvLyB5wrIgPSB4wrMgKyBheCArIGJcbiAgICAgICAgICAgIGxldCB5O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB5ID0gRnAuc3FydCh5Mik7IC8vIHkgPSB5wrIgXiAocCsxKS80XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoc3FydEVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gc3FydEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyAnOiAnICsgc3FydEVycm9yLm1lc3NhZ2UgOiAnJztcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwb2ludDogaXMgbm90IG9uIGN1cnZlLCBzcXJ0IGVycm9yJyArIGVycik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnRDb21wcmVzc2lvbklzU3VwcG9ydGVkKCk7XG4gICAgICAgICAgICBjb25zdCBpc1lPZGQgPSBGcC5pc09kZCh5KTsgLy8gKHkgJiBfMW4pID09PSBfMW47XG4gICAgICAgICAgICBjb25zdCBpc0hlYWRPZGQgPSAoaGVhZCAmIDEpID09PSAxOyAvLyBFQ0RTQS1zcGVjaWZpY1xuICAgICAgICAgICAgaWYgKGlzSGVhZE9kZCAhPT0gaXNZT2RkKVxuICAgICAgICAgICAgICAgIHkgPSBGcC5uZWcoeSk7XG4gICAgICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobGVuZ3RoID09PSB1bmNvbXAgJiYgaGVhZCA9PT0gMHgwNCkge1xuICAgICAgICAgICAgLy8gVE9ETzogbW9yZSBjaGVja3NcbiAgICAgICAgICAgIGNvbnN0IEwgPSBGcC5CWVRFUztcbiAgICAgICAgICAgIGNvbnN0IHggPSBGcC5mcm9tQnl0ZXModGFpbC5zdWJhcnJheSgwLCBMKSk7XG4gICAgICAgICAgICBjb25zdCB5ID0gRnAuZnJvbUJ5dGVzKHRhaWwuc3ViYXJyYXkoTCwgTCAqIDIpKTtcbiAgICAgICAgICAgIGlmICghaXNWYWxpZFhZKHgsIHkpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIHBvaW50OiBpcyBub3Qgb24gY3VydmUnKTtcbiAgICAgICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgYmFkIHBvaW50OiBnb3QgbGVuZ3RoICR7bGVuZ3RofSwgZXhwZWN0ZWQgY29tcHJlc3NlZD0ke2NvbXB9IG9yIHVuY29tcHJlc3NlZD0ke3VuY29tcH1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBlbmNvZGVQb2ludCA9IGV4dHJhT3B0cy50b0J5dGVzIHx8IHBvaW50VG9CeXRlcztcbiAgICBjb25zdCBkZWNvZGVQb2ludCA9IGV4dHJhT3B0cy5mcm9tQnl0ZXMgfHwgcG9pbnRGcm9tQnl0ZXM7XG4gICAgZnVuY3Rpb24gd2VpZXJzdHJhc3NFcXVhdGlvbih4KSB7XG4gICAgICAgIGNvbnN0IHgyID0gRnAuc3FyKHgpOyAvLyB4ICogeFxuICAgICAgICBjb25zdCB4MyA9IEZwLm11bCh4MiwgeCk7IC8vIHjCsiAqIHhcbiAgICAgICAgcmV0dXJuIEZwLmFkZChGcC5hZGQoeDMsIEZwLm11bCh4LCBDVVJWRS5hKSksIENVUlZFLmIpOyAvLyB4wrMgKyBhICogeCArIGJcbiAgICB9XG4gICAgLy8gVE9ETzogbW92ZSB0b3AtbGV2ZWxcbiAgICAvKiogQ2hlY2tzIHdoZXRoZXIgZXF1YXRpb24gaG9sZHMgZm9yIGdpdmVuIHgsIHk6IHnCsiA9PSB4wrMgKyBheCArIGIgKi9cbiAgICBmdW5jdGlvbiBpc1ZhbGlkWFkoeCwgeSkge1xuICAgICAgICBjb25zdCBsZWZ0ID0gRnAuc3FyKHkpOyAvLyB5wrJcbiAgICAgICAgY29uc3QgcmlnaHQgPSB3ZWllcnN0cmFzc0VxdWF0aW9uKHgpOyAvLyB4wrMgKyBheCArIGJcbiAgICAgICAgcmV0dXJuIEZwLmVxbChsZWZ0LCByaWdodCk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIHdoZXRoZXIgdGhlIHBhc3NlZCBjdXJ2ZSBwYXJhbXMgYXJlIHZhbGlkLlxuICAgIC8vIFRlc3QgMTogZXF1YXRpb24gecKyID0geMKzICsgYXggKyBiIHNob3VsZCB3b3JrIGZvciBnZW5lcmF0b3IgcG9pbnQuXG4gICAgaWYgKCFpc1ZhbGlkWFkoQ1VSVkUuR3gsIENVUlZFLkd5KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgY3VydmUgcGFyYW1zOiBnZW5lcmF0b3IgcG9pbnQnKTtcbiAgICAvLyBUZXN0IDI6IGRpc2NyaW1pbmFudCDOlCBwYXJ0IHNob3VsZCBiZSBub24temVybzogNGHCsyArIDI3YsKyICE9IDAuXG4gICAgLy8gR3VhcmFudGVlcyBjdXJ2ZSBpcyBnZW51cy0xLCBzbW9vdGggKG5vbi1zaW5ndWxhcikuXG4gICAgY29uc3QgXzRhMyA9IEZwLm11bChGcC5wb3coQ1VSVkUuYSwgXzNuKSwgXzRuKTtcbiAgICBjb25zdCBfMjdiMiA9IEZwLm11bChGcC5zcXIoQ1VSVkUuYiksIEJpZ0ludCgyNykpO1xuICAgIGlmIChGcC5pczAoRnAuYWRkKF80YTMsIF8yN2IyKSkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIGN1cnZlIHBhcmFtczogYSBvciBiJyk7XG4gICAgLyoqIEFzc2VydHMgY29vcmRpbmF0ZSBpcyB2YWxpZDogMCA8PSBuIDwgRnAuT1JERVIuICovXG4gICAgZnVuY3Rpb24gYWNvb3JkKHRpdGxlLCBuLCBiYW5aZXJvID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCFGcC5pc1ZhbGlkKG4pIHx8IChiYW5aZXJvICYmIEZwLmlzMChuKSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhZCBwb2ludCBjb29yZGluYXRlICR7dGl0bGV9YCk7XG4gICAgICAgIHJldHVybiBuO1xuICAgIH1cbiAgICBmdW5jdGlvbiBhcHJqcG9pbnQob3RoZXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBQb2ludCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb2plY3RpdmVQb2ludCBleHBlY3RlZCcpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBzcGxpdEVuZG9TY2FsYXJOKGspIHtcbiAgICAgICAgaWYgKCFlbmRvIHx8ICFlbmRvLmJhc2lzZXMpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGVuZG8nKTtcbiAgICAgICAgcmV0dXJuIF9zcGxpdEVuZG9TY2FsYXIoaywgZW5kby5iYXNpc2VzLCBGbi5PUkRFUik7XG4gICAgfVxuICAgIC8vIE1lbW9pemVkIHRvQWZmaW5lIC8gdmFsaWRpdHkgY2hlY2suIFRoZXkgYXJlIGhlYXZ5LiBQb2ludHMgYXJlIGltbXV0YWJsZS5cbiAgICAvLyBDb252ZXJ0cyBQcm9qZWN0aXZlIHBvaW50IHRvIGFmZmluZSAoeCwgeSkgY29vcmRpbmF0ZXMuXG4gICAgLy8gQ2FuIGFjY2VwdCBwcmVjb21wdXRlZCBaXi0xIC0gZm9yIGV4YW1wbGUsIGZyb20gaW52ZXJ0QmF0Y2guXG4gICAgLy8gKFgsIFksIFopIOKIiyAoeD1YL1osIHk9WS9aKVxuICAgIGNvbnN0IHRvQWZmaW5lTWVtbyA9IG1lbW9pemVkKChwLCBpeikgPT4ge1xuICAgICAgICBjb25zdCB7IFgsIFksIFogfSA9IHA7XG4gICAgICAgIC8vIEZhc3QtcGF0aCBmb3Igbm9ybWFsaXplZCBwb2ludHNcbiAgICAgICAgaWYgKEZwLmVxbChaLCBGcC5PTkUpKVxuICAgICAgICAgICAgcmV0dXJuIHsgeDogWCwgeTogWSB9O1xuICAgICAgICBjb25zdCBpczAgPSBwLmlzMCgpO1xuICAgICAgICAvLyBJZiBpbnZaIHdhcyAwLCB3ZSByZXR1cm4gemVybyBwb2ludC4gSG93ZXZlciB3ZSBzdGlsbCB3YW50IHRvIGV4ZWN1dGVcbiAgICAgICAgLy8gYWxsIG9wZXJhdGlvbnMsIHNvIHdlIHJlcGxhY2UgaW52WiB3aXRoIGEgcmFuZG9tIG51bWJlciwgMS5cbiAgICAgICAgaWYgKGl6ID09IG51bGwpXG4gICAgICAgICAgICBpeiA9IGlzMCA/IEZwLk9ORSA6IEZwLmludihaKTtcbiAgICAgICAgY29uc3QgeCA9IEZwLm11bChYLCBpeik7XG4gICAgICAgIGNvbnN0IHkgPSBGcC5tdWwoWSwgaXopO1xuICAgICAgICBjb25zdCB6eiA9IEZwLm11bChaLCBpeik7XG4gICAgICAgIGlmIChpczApXG4gICAgICAgICAgICByZXR1cm4geyB4OiBGcC5aRVJPLCB5OiBGcC5aRVJPIH07XG4gICAgICAgIGlmICghRnAuZXFsKHp6LCBGcC5PTkUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZaIHdhcyBpbnZhbGlkJyk7XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICB9KTtcbiAgICAvLyBOT1RFOiBvbiBleGNlcHRpb24gdGhpcyB3aWxsIGNyYXNoICdjYWNoZWQnIGFuZCBubyB2YWx1ZSB3aWxsIGJlIHNldC5cbiAgICAvLyBPdGhlcndpc2UgdHJ1ZSB3aWxsIGJlIHJldHVyblxuICAgIGNvbnN0IGFzc2VydFZhbGlkTWVtbyA9IG1lbW9pemVkKChwKSA9PiB7XG4gICAgICAgIGlmIChwLmlzMCgpKSB7XG4gICAgICAgICAgICAvLyAoMCwgMSwgMCkgYWthIFpFUk8gaXMgaW52YWxpZCBpbiBtb3N0IGNvbnRleHRzLlxuICAgICAgICAgICAgLy8gSW4gQkxTLCBaRVJPIGNhbiBiZSBzZXJpYWxpemVkLCBzbyB3ZSBhbGxvdyBpdC5cbiAgICAgICAgICAgIC8vICgwLCAwLCAwKSBpcyBpbnZhbGlkIHJlcHJlc2VudGF0aW9uIG9mIFpFUk8uXG4gICAgICAgICAgICBpZiAoZXh0cmFPcHRzLmFsbG93SW5maW5pdHlQb2ludCAmJiAhRnAuaXMwKHAuWSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcG9pbnQ6IFpFUk8nKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb21lIDNyZC1wYXJ0eSB0ZXN0IHZlY3RvcnMgcmVxdWlyZSBkaWZmZXJlbnQgd29yZGluZyBiZXR3ZWVuIGhlcmUgJiBgZnJvbUNvbXByZXNzZWRIZXhgXG4gICAgICAgIGNvbnN0IHsgeCwgeSB9ID0gcC50b0FmZmluZSgpO1xuICAgICAgICBpZiAoIUZwLmlzVmFsaWQoeCkgfHwgIUZwLmlzVmFsaWQoeSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwb2ludDogeCBvciB5IG5vdCBmaWVsZCBlbGVtZW50cycpO1xuICAgICAgICBpZiAoIWlzVmFsaWRYWSh4LCB5KSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignYmFkIHBvaW50OiBlcXVhdGlvbiBsZWZ0ICE9IHJpZ2h0Jyk7XG4gICAgICAgIGlmICghcC5pc1RvcnNpb25GcmVlKCkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBwb2ludDogbm90IGluIHByaW1lLW9yZGVyIHN1Ymdyb3VwJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGZpbmlzaEVuZG8oZW5kb0JldGEsIGsxcCwgazJwLCBrMW5lZywgazJuZWcpIHtcbiAgICAgICAgazJwID0gbmV3IFBvaW50KEZwLm11bChrMnAuWCwgZW5kb0JldGEpLCBrMnAuWSwgazJwLlopO1xuICAgICAgICBrMXAgPSBuZWdhdGVDdChrMW5lZywgazFwKTtcbiAgICAgICAgazJwID0gbmVnYXRlQ3QoazJuZWcsIGsycCk7XG4gICAgICAgIHJldHVybiBrMXAuYWRkKGsycCk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFByb2plY3RpdmUgUG9pbnQgd29ya3MgaW4gM2QgLyBwcm9qZWN0aXZlIChob21vZ2VuZW91cykgY29vcmRpbmF0ZXM6KFgsIFksIFopIOKIiyAoeD1YL1osIHk9WS9aKS5cbiAgICAgKiBEZWZhdWx0IFBvaW50IHdvcmtzIGluIDJkIC8gYWZmaW5lIGNvb3JkaW5hdGVzOiAoeCwgeSkuXG4gICAgICogV2UncmUgZG9pbmcgY2FsY3VsYXRpb25zIGluIHByb2plY3RpdmUsIGJlY2F1c2UgaXRzIG9wZXJhdGlvbnMgZG9uJ3QgcmVxdWlyZSBjb3N0bHkgaW52ZXJzaW9uLlxuICAgICAqL1xuICAgIGNsYXNzIFBvaW50IHtcbiAgICAgICAgLyoqIERvZXMgTk9UIHZhbGlkYXRlIGlmIHRoZSBwb2ludCBpcyB2YWxpZC4gVXNlIGAuYXNzZXJ0VmFsaWRpdHkoKWAuICovXG4gICAgICAgIGNvbnN0cnVjdG9yKFgsIFksIFopIHtcbiAgICAgICAgICAgIHRoaXMuWCA9IGFjb29yZCgneCcsIFgpO1xuICAgICAgICAgICAgdGhpcy5ZID0gYWNvb3JkKCd5JywgWSwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLlogPSBhY29vcmQoJ3onLCBaKTtcbiAgICAgICAgICAgIE9iamVjdC5mcmVlemUodGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIENVUlZFKCkge1xuICAgICAgICAgICAgcmV0dXJuIENVUlZFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBEb2VzIE5PVCB2YWxpZGF0ZSBpZiB0aGUgcG9pbnQgaXMgdmFsaWQuIFVzZSBgLmFzc2VydFZhbGlkaXR5KClgLiAqL1xuICAgICAgICBzdGF0aWMgZnJvbUFmZmluZShwKSB7XG4gICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IHAgfHwge307XG4gICAgICAgICAgICBpZiAoIXAgfHwgIUZwLmlzVmFsaWQoeCkgfHwgIUZwLmlzVmFsaWQoeSkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFmZmluZSBwb2ludCcpO1xuICAgICAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBQb2ludClcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb2plY3RpdmUgcG9pbnQgbm90IGFsbG93ZWQnKTtcbiAgICAgICAgICAgIC8vICgwLCAwKSB3b3VsZCd2ZSBwcm9kdWNlZCAoMCwgMCwgMSkgLSBpbnN0ZWFkLCB3ZSBuZWVkICgwLCAxLCAwKVxuICAgICAgICAgICAgaWYgKEZwLmlzMCh4KSAmJiBGcC5pczAoeSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBvaW50LlpFUk87XG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KHgsIHksIEZwLk9ORSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGZyb21CeXRlcyhieXRlcykge1xuICAgICAgICAgICAgY29uc3QgUCA9IFBvaW50LmZyb21BZmZpbmUoZGVjb2RlUG9pbnQoYWJ5dGVzKGJ5dGVzLCB1bmRlZmluZWQsICdwb2ludCcpKSk7XG4gICAgICAgICAgICBQLmFzc2VydFZhbGlkaXR5KCk7XG4gICAgICAgICAgICByZXR1cm4gUDtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZnJvbUhleChoZXgpIHtcbiAgICAgICAgICAgIHJldHVybiBQb2ludC5mcm9tQnl0ZXMoZW5zdXJlQnl0ZXMoJ3BvaW50SGV4JywgaGV4KSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHgoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0FmZmluZSgpLng7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHkoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0FmZmluZSgpLnk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIEBwYXJhbSB3aW5kb3dTaXplXG4gICAgICAgICAqIEBwYXJhbSBpc0xhenkgdHJ1ZSB3aWxsIGRlZmVyIHRhYmxlIGNvbXB1dGF0aW9uIHVudGlsIHRoZSBmaXJzdCBtdWx0aXBsaWNhdGlvblxuICAgICAgICAgKiBAcmV0dXJuc1xuICAgICAgICAgKi9cbiAgICAgICAgcHJlY29tcHV0ZSh3aW5kb3dTaXplID0gOCwgaXNMYXp5ID0gdHJ1ZSkge1xuICAgICAgICAgICAgd25hZi5jcmVhdGVDYWNoZSh0aGlzLCB3aW5kb3dTaXplKTtcbiAgICAgICAgICAgIGlmICghaXNMYXp5KVxuICAgICAgICAgICAgICAgIHRoaXMubXVsdGlwbHkoXzNuKTsgLy8gcmFuZG9tIG51bWJlclxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogcmV0dXJuIGB0aGlzYFxuICAgICAgICAvKiogQSBwb2ludCBvbiBjdXJ2ZSBpcyB2YWxpZCBpZiBpdCBjb25mb3JtcyB0byBlcXVhdGlvbi4gKi9cbiAgICAgICAgYXNzZXJ0VmFsaWRpdHkoKSB7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZE1lbW8odGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaGFzRXZlblkoKSB7XG4gICAgICAgICAgICBjb25zdCB7IHkgfSA9IHRoaXMudG9BZmZpbmUoKTtcbiAgICAgICAgICAgIGlmICghRnAuaXNPZGQpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmllbGQgZG9lc24ndCBzdXBwb3J0IGlzT2RkXCIpO1xuICAgICAgICAgICAgcmV0dXJuICFGcC5pc09kZCh5KTtcbiAgICAgICAgfVxuICAgICAgICAvKiogQ29tcGFyZSBvbmUgcG9pbnQgdG8gYW5vdGhlci4gKi9cbiAgICAgICAgZXF1YWxzKG90aGVyKSB7XG4gICAgICAgICAgICBhcHJqcG9pbnQob3RoZXIpO1xuICAgICAgICAgICAgY29uc3QgeyBYOiBYMSwgWTogWTEsIFo6IFoxIH0gPSB0aGlzO1xuICAgICAgICAgICAgY29uc3QgeyBYOiBYMiwgWTogWTIsIFo6IFoyIH0gPSBvdGhlcjtcbiAgICAgICAgICAgIGNvbnN0IFUxID0gRnAuZXFsKEZwLm11bChYMSwgWjIpLCBGcC5tdWwoWDIsIFoxKSk7XG4gICAgICAgICAgICBjb25zdCBVMiA9IEZwLmVxbChGcC5tdWwoWTEsIFoyKSwgRnAubXVsKFkyLCBaMSkpO1xuICAgICAgICAgICAgcmV0dXJuIFUxICYmIFUyO1xuICAgICAgICB9XG4gICAgICAgIC8qKiBGbGlwcyBwb2ludCB0byBvbmUgY29ycmVzcG9uZGluZyB0byAoeCwgLXkpIGluIEFmZmluZSBjb29yZGluYXRlcy4gKi9cbiAgICAgICAgbmVnYXRlKCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLlgsIEZwLm5lZyh0aGlzLlkpLCB0aGlzLlopO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlbmVzLUNvc3RlbGxvLUJhdGluYSBleGNlcHRpb24tZnJlZSBkb3VibGluZyBmb3JtdWxhLlxuICAgICAgICAvLyBUaGVyZSBpcyAzMCUgZmFzdGVyIEphY29iaWFuIGZvcm11bGEsIGJ1dCBpdCBpcyBub3QgY29tcGxldGUuXG4gICAgICAgIC8vIGh0dHBzOi8vZXByaW50LmlhY3Iub3JnLzIwMTUvMTA2MCwgYWxnb3JpdGhtIDNcbiAgICAgICAgLy8gQ29zdDogOE0gKyAzUyArIDMqYSArIDIqYjMgKyAxNWFkZC5cbiAgICAgICAgZG91YmxlKCkge1xuICAgICAgICAgICAgY29uc3QgeyBhLCBiIH0gPSBDVVJWRTtcbiAgICAgICAgICAgIGNvbnN0IGIzID0gRnAubXVsKGIsIF8zbik7XG4gICAgICAgICAgICBjb25zdCB7IFg6IFgxLCBZOiBZMSwgWjogWjEgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgWDMgPSBGcC5aRVJPLCBZMyA9IEZwLlpFUk8sIFozID0gRnAuWkVSTzsgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICBsZXQgdDAgPSBGcC5tdWwoWDEsIFgxKTsgLy8gc3RlcCAxXG4gICAgICAgICAgICBsZXQgdDEgPSBGcC5tdWwoWTEsIFkxKTtcbiAgICAgICAgICAgIGxldCB0MiA9IEZwLm11bChaMSwgWjEpO1xuICAgICAgICAgICAgbGV0IHQzID0gRnAubXVsKFgxLCBZMSk7XG4gICAgICAgICAgICB0MyA9IEZwLmFkZCh0MywgdDMpOyAvLyBzdGVwIDVcbiAgICAgICAgICAgIFozID0gRnAubXVsKFgxLCBaMSk7XG4gICAgICAgICAgICBaMyA9IEZwLmFkZChaMywgWjMpO1xuICAgICAgICAgICAgWDMgPSBGcC5tdWwoYSwgWjMpO1xuICAgICAgICAgICAgWTMgPSBGcC5tdWwoYjMsIHQyKTtcbiAgICAgICAgICAgIFkzID0gRnAuYWRkKFgzLCBZMyk7IC8vIHN0ZXAgMTBcbiAgICAgICAgICAgIFgzID0gRnAuc3ViKHQxLCBZMyk7XG4gICAgICAgICAgICBZMyA9IEZwLmFkZCh0MSwgWTMpO1xuICAgICAgICAgICAgWTMgPSBGcC5tdWwoWDMsIFkzKTtcbiAgICAgICAgICAgIFgzID0gRnAubXVsKHQzLCBYMyk7XG4gICAgICAgICAgICBaMyA9IEZwLm11bChiMywgWjMpOyAvLyBzdGVwIDE1XG4gICAgICAgICAgICB0MiA9IEZwLm11bChhLCB0Mik7XG4gICAgICAgICAgICB0MyA9IEZwLnN1Yih0MCwgdDIpO1xuICAgICAgICAgICAgdDMgPSBGcC5tdWwoYSwgdDMpO1xuICAgICAgICAgICAgdDMgPSBGcC5hZGQodDMsIFozKTtcbiAgICAgICAgICAgIFozID0gRnAuYWRkKHQwLCB0MCk7IC8vIHN0ZXAgMjBcbiAgICAgICAgICAgIHQwID0gRnAuYWRkKFozLCB0MCk7XG4gICAgICAgICAgICB0MCA9IEZwLmFkZCh0MCwgdDIpO1xuICAgICAgICAgICAgdDAgPSBGcC5tdWwodDAsIHQzKTtcbiAgICAgICAgICAgIFkzID0gRnAuYWRkKFkzLCB0MCk7XG4gICAgICAgICAgICB0MiA9IEZwLm11bChZMSwgWjEpOyAvLyBzdGVwIDI1XG4gICAgICAgICAgICB0MiA9IEZwLmFkZCh0MiwgdDIpO1xuICAgICAgICAgICAgdDAgPSBGcC5tdWwodDIsIHQzKTtcbiAgICAgICAgICAgIFgzID0gRnAuc3ViKFgzLCB0MCk7XG4gICAgICAgICAgICBaMyA9IEZwLm11bCh0MiwgdDEpO1xuICAgICAgICAgICAgWjMgPSBGcC5hZGQoWjMsIFozKTsgLy8gc3RlcCAzMFxuICAgICAgICAgICAgWjMgPSBGcC5hZGQoWjMsIFozKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUG9pbnQoWDMsIFkzLCBaMyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVuZXMtQ29zdGVsbG8tQmF0aW5hIGV4Y2VwdGlvbi1mcmVlIGFkZGl0aW9uIGZvcm11bGEuXG4gICAgICAgIC8vIFRoZXJlIGlzIDMwJSBmYXN0ZXIgSmFjb2JpYW4gZm9ybXVsYSwgYnV0IGl0IGlzIG5vdCBjb21wbGV0ZS5cbiAgICAgICAgLy8gaHR0cHM6Ly9lcHJpbnQuaWFjci5vcmcvMjAxNS8xMDYwLCBhbGdvcml0aG0gMVxuICAgICAgICAvLyBDb3N0OiAxMk0gKyAwUyArIDMqYSArIDMqYjMgKyAyM2FkZC5cbiAgICAgICAgYWRkKG90aGVyKSB7XG4gICAgICAgICAgICBhcHJqcG9pbnQob3RoZXIpO1xuICAgICAgICAgICAgY29uc3QgeyBYOiBYMSwgWTogWTEsIFo6IFoxIH0gPSB0aGlzO1xuICAgICAgICAgICAgY29uc3QgeyBYOiBYMiwgWTogWTIsIFo6IFoyIH0gPSBvdGhlcjtcbiAgICAgICAgICAgIGxldCBYMyA9IEZwLlpFUk8sIFkzID0gRnAuWkVSTywgWjMgPSBGcC5aRVJPOyAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGEgPSBDVVJWRS5hO1xuICAgICAgICAgICAgY29uc3QgYjMgPSBGcC5tdWwoQ1VSVkUuYiwgXzNuKTtcbiAgICAgICAgICAgIGxldCB0MCA9IEZwLm11bChYMSwgWDIpOyAvLyBzdGVwIDFcbiAgICAgICAgICAgIGxldCB0MSA9IEZwLm11bChZMSwgWTIpO1xuICAgICAgICAgICAgbGV0IHQyID0gRnAubXVsKFoxLCBaMik7XG4gICAgICAgICAgICBsZXQgdDMgPSBGcC5hZGQoWDEsIFkxKTtcbiAgICAgICAgICAgIGxldCB0NCA9IEZwLmFkZChYMiwgWTIpOyAvLyBzdGVwIDVcbiAgICAgICAgICAgIHQzID0gRnAubXVsKHQzLCB0NCk7XG4gICAgICAgICAgICB0NCA9IEZwLmFkZCh0MCwgdDEpO1xuICAgICAgICAgICAgdDMgPSBGcC5zdWIodDMsIHQ0KTtcbiAgICAgICAgICAgIHQ0ID0gRnAuYWRkKFgxLCBaMSk7XG4gICAgICAgICAgICBsZXQgdDUgPSBGcC5hZGQoWDIsIFoyKTsgLy8gc3RlcCAxMFxuICAgICAgICAgICAgdDQgPSBGcC5tdWwodDQsIHQ1KTtcbiAgICAgICAgICAgIHQ1ID0gRnAuYWRkKHQwLCB0Mik7XG4gICAgICAgICAgICB0NCA9IEZwLnN1Yih0NCwgdDUpO1xuICAgICAgICAgICAgdDUgPSBGcC5hZGQoWTEsIFoxKTtcbiAgICAgICAgICAgIFgzID0gRnAuYWRkKFkyLCBaMik7IC8vIHN0ZXAgMTVcbiAgICAgICAgICAgIHQ1ID0gRnAubXVsKHQ1LCBYMyk7XG4gICAgICAgICAgICBYMyA9IEZwLmFkZCh0MSwgdDIpO1xuICAgICAgICAgICAgdDUgPSBGcC5zdWIodDUsIFgzKTtcbiAgICAgICAgICAgIFozID0gRnAubXVsKGEsIHQ0KTtcbiAgICAgICAgICAgIFgzID0gRnAubXVsKGIzLCB0Mik7IC8vIHN0ZXAgMjBcbiAgICAgICAgICAgIFozID0gRnAuYWRkKFgzLCBaMyk7XG4gICAgICAgICAgICBYMyA9IEZwLnN1Yih0MSwgWjMpO1xuICAgICAgICAgICAgWjMgPSBGcC5hZGQodDEsIFozKTtcbiAgICAgICAgICAgIFkzID0gRnAubXVsKFgzLCBaMyk7XG4gICAgICAgICAgICB0MSA9IEZwLmFkZCh0MCwgdDApOyAvLyBzdGVwIDI1XG4gICAgICAgICAgICB0MSA9IEZwLmFkZCh0MSwgdDApO1xuICAgICAgICAgICAgdDIgPSBGcC5tdWwoYSwgdDIpO1xuICAgICAgICAgICAgdDQgPSBGcC5tdWwoYjMsIHQ0KTtcbiAgICAgICAgICAgIHQxID0gRnAuYWRkKHQxLCB0Mik7XG4gICAgICAgICAgICB0MiA9IEZwLnN1Yih0MCwgdDIpOyAvLyBzdGVwIDMwXG4gICAgICAgICAgICB0MiA9IEZwLm11bChhLCB0Mik7XG4gICAgICAgICAgICB0NCA9IEZwLmFkZCh0NCwgdDIpO1xuICAgICAgICAgICAgdDAgPSBGcC5tdWwodDEsIHQ0KTtcbiAgICAgICAgICAgIFkzID0gRnAuYWRkKFkzLCB0MCk7XG4gICAgICAgICAgICB0MCA9IEZwLm11bCh0NSwgdDQpOyAvLyBzdGVwIDM1XG4gICAgICAgICAgICBYMyA9IEZwLm11bCh0MywgWDMpO1xuICAgICAgICAgICAgWDMgPSBGcC5zdWIoWDMsIHQwKTtcbiAgICAgICAgICAgIHQwID0gRnAubXVsKHQzLCB0MSk7XG4gICAgICAgICAgICBaMyA9IEZwLm11bCh0NSwgWjMpO1xuICAgICAgICAgICAgWjMgPSBGcC5hZGQoWjMsIHQwKTsgLy8gc3RlcCA0MFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQb2ludChYMywgWTMsIFozKTtcbiAgICAgICAgfVxuICAgICAgICBzdWJ0cmFjdChvdGhlcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkKG90aGVyLm5lZ2F0ZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpczAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoUG9pbnQuWkVSTyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvbnN0YW50IHRpbWUgbXVsdGlwbGljYXRpb24uXG4gICAgICAgICAqIFVzZXMgd05BRiBtZXRob2QuIFdpbmRvd2VkIG1ldGhvZCBtYXkgYmUgMTAlIGZhc3RlcixcbiAgICAgICAgICogYnV0IHRha2VzIDJ4IGxvbmdlciB0byBnZW5lcmF0ZSBhbmQgY29uc3VtZXMgMnggbWVtb3J5LlxuICAgICAgICAgKiBVc2VzIHByZWNvbXB1dGVzIHdoZW4gYXZhaWxhYmxlLlxuICAgICAgICAgKiBVc2VzIGVuZG9tb3JwaGlzbSBmb3IgS29ibGl0eiBjdXJ2ZXMuXG4gICAgICAgICAqIEBwYXJhbSBzY2FsYXIgYnkgd2hpY2ggdGhlIHBvaW50IHdvdWxkIGJlIG11bHRpcGxpZWRcbiAgICAgICAgICogQHJldHVybnMgTmV3IHBvaW50XG4gICAgICAgICAqL1xuICAgICAgICBtdWx0aXBseShzY2FsYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZW5kbyB9ID0gZXh0cmFPcHRzO1xuICAgICAgICAgICAgaWYgKCFGbi5pc1ZhbGlkTm90MChzY2FsYXIpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzY2FsYXI6IG91dCBvZiByYW5nZScpOyAvLyAwIGlzIGludmFsaWRcbiAgICAgICAgICAgIGxldCBwb2ludCwgZmFrZTsgLy8gRmFrZSBwb2ludCBpcyB1c2VkIHRvIGNvbnN0LXRpbWUgbXVsdFxuICAgICAgICAgICAgY29uc3QgbXVsID0gKG4pID0+IHduYWYuY2FjaGVkKHRoaXMsIG4sIChwKSA9PiBub3JtYWxpemVaKFBvaW50LCBwKSk7XG4gICAgICAgICAgICAvKiogU2VlIGRvY3MgZm9yIHtAbGluayBFbmRvbW9ycGhpc21PcHRzfSAqL1xuICAgICAgICAgICAgaWYgKGVuZG8pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGsxbmVnLCBrMSwgazJuZWcsIGsyIH0gPSBzcGxpdEVuZG9TY2FsYXJOKHNjYWxhcik7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwOiBrMXAsIGY6IGsxZiB9ID0gbXVsKGsxKTtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHA6IGsycCwgZjogazJmIH0gPSBtdWwoazIpO1xuICAgICAgICAgICAgICAgIGZha2UgPSBrMWYuYWRkKGsyZik7XG4gICAgICAgICAgICAgICAgcG9pbnQgPSBmaW5pc2hFbmRvKGVuZG8uYmV0YSwgazFwLCBrMnAsIGsxbmVnLCBrMm5lZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHAsIGYgfSA9IG11bChzY2FsYXIpO1xuICAgICAgICAgICAgICAgIHBvaW50ID0gcDtcbiAgICAgICAgICAgICAgICBmYWtlID0gZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBgemAgZm9yIGJvdGggcG9pbnRzLCBidXQgcmV0dXJuIG9ubHkgcmVhbCBvbmVcbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVaKFBvaW50LCBbcG9pbnQsIGZha2VdKVswXTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogTm9uLWNvbnN0YW50LXRpbWUgbXVsdGlwbGljYXRpb24uIFVzZXMgZG91YmxlLWFuZC1hZGQgYWxnb3JpdGhtLlxuICAgICAgICAgKiBJdCdzIGZhc3RlciwgYnV0IHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB5b3UgZG9uJ3QgY2FyZSBhYm91dFxuICAgICAgICAgKiBhbiBleHBvc2VkIHNlY3JldCBrZXkgZS5nLiBzaWcgdmVyaWZpY2F0aW9uLCB3aGljaCB3b3JrcyBvdmVyICpwdWJsaWMqIGtleXMuXG4gICAgICAgICAqL1xuICAgICAgICBtdWx0aXBseVVuc2FmZShzYykge1xuICAgICAgICAgICAgY29uc3QgeyBlbmRvIH0gPSBleHRyYU9wdHM7XG4gICAgICAgICAgICBjb25zdCBwID0gdGhpcztcbiAgICAgICAgICAgIGlmICghRm4uaXNWYWxpZChzYykpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHNjYWxhcjogb3V0IG9mIHJhbmdlJyk7IC8vIDAgaXMgdmFsaWRcbiAgICAgICAgICAgIGlmIChzYyA9PT0gXzBuIHx8IHAuaXMwKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFBvaW50LlpFUk87XG4gICAgICAgICAgICBpZiAoc2MgPT09IF8xbilcbiAgICAgICAgICAgICAgICByZXR1cm4gcDsgLy8gZmFzdC1wYXRoXG4gICAgICAgICAgICBpZiAod25hZi5oYXNDYWNoZSh0aGlzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBseShzYyk7XG4gICAgICAgICAgICBpZiAoZW5kbykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgazFuZWcsIGsxLCBrMm5lZywgazIgfSA9IHNwbGl0RW5kb1NjYWxhck4oc2MpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgcDEsIHAyIH0gPSBtdWxFbmRvVW5zYWZlKFBvaW50LCBwLCBrMSwgazIpOyAvLyAzMCUgZmFzdGVyIHZzIHduYWYudW5zYWZlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZpbmlzaEVuZG8oZW5kby5iZXRhLCBwMSwgcDIsIGsxbmVnLCBrMm5lZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gd25hZi51bnNhZmUocCwgc2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG11bHRpcGx5QW5kQWRkVW5zYWZlKFEsIGEsIGIpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1bSA9IHRoaXMubXVsdGlwbHlVbnNhZmUoYSkuYWRkKFEubXVsdGlwbHlVbnNhZmUoYikpO1xuICAgICAgICAgICAgcmV0dXJuIHN1bS5pczAoKSA/IHVuZGVmaW5lZCA6IHN1bTtcbiAgICAgICAgfVxuICAgICAgICAvKipcbiAgICAgICAgICogQ29udmVydHMgUHJvamVjdGl2ZSBwb2ludCB0byBhZmZpbmUgKHgsIHkpIGNvb3JkaW5hdGVzLlxuICAgICAgICAgKiBAcGFyYW0gaW52ZXJ0ZWRaIFpeLTEgKGludmVydGVkIHplcm8pIC0gb3B0aW9uYWwsIHByZWNvbXB1dGF0aW9uIGlzIHVzZWZ1bCBmb3IgaW52ZXJ0QmF0Y2hcbiAgICAgICAgICovXG4gICAgICAgIHRvQWZmaW5lKGludmVydGVkWikge1xuICAgICAgICAgICAgcmV0dXJuIHRvQWZmaW5lTWVtbyh0aGlzLCBpbnZlcnRlZFopO1xuICAgICAgICB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3Mgd2hldGhlciBQb2ludCBpcyBmcmVlIG9mIHRvcnNpb24gZWxlbWVudHMgKGlzIGluIHByaW1lIHN1Ymdyb3VwKS5cbiAgICAgICAgICogQWx3YXlzIHRvcnNpb24tZnJlZSBmb3IgY29mYWN0b3I9MSBjdXJ2ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBpc1RvcnNpb25GcmVlKCkge1xuICAgICAgICAgICAgY29uc3QgeyBpc1RvcnNpb25GcmVlIH0gPSBleHRyYU9wdHM7XG4gICAgICAgICAgICBpZiAoY29mYWN0b3IgPT09IF8xbilcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChpc1RvcnNpb25GcmVlKVxuICAgICAgICAgICAgICAgIHJldHVybiBpc1RvcnNpb25GcmVlKFBvaW50LCB0aGlzKTtcbiAgICAgICAgICAgIHJldHVybiB3bmFmLnVuc2FmZSh0aGlzLCBDVVJWRV9PUkRFUikuaXMwKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2xlYXJDb2ZhY3RvcigpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgY2xlYXJDb2ZhY3RvciB9ID0gZXh0cmFPcHRzO1xuICAgICAgICAgICAgaWYgKGNvZmFjdG9yID09PSBfMW4pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7IC8vIEZhc3QtcGF0aFxuICAgICAgICAgICAgaWYgKGNsZWFyQ29mYWN0b3IpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsZWFyQ29mYWN0b3IoUG9pbnQsIHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbHlVbnNhZmUoY29mYWN0b3IpO1xuICAgICAgICB9XG4gICAgICAgIGlzU21hbGxPcmRlcigpIHtcbiAgICAgICAgICAgIC8vIGNhbiB3ZSB1c2UgdGhpcy5jbGVhckNvZmFjdG9yKCk/XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBseVVuc2FmZShjb2ZhY3RvcikuaXMwKCk7XG4gICAgICAgIH1cbiAgICAgICAgdG9CeXRlcyhpc0NvbXByZXNzZWQgPSB0cnVlKSB7XG4gICAgICAgICAgICBhYm9vbChpc0NvbXByZXNzZWQsICdpc0NvbXByZXNzZWQnKTtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0VmFsaWRpdHkoKTtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVQb2ludChQb2ludCwgdGhpcywgaXNDb21wcmVzc2VkKTtcbiAgICAgICAgfVxuICAgICAgICB0b0hleChpc0NvbXByZXNzZWQgPSB0cnVlKSB7XG4gICAgICAgICAgICByZXR1cm4gYnl0ZXNUb0hleCh0aGlzLnRvQnl0ZXMoaXNDb21wcmVzc2VkKSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICByZXR1cm4gYDxQb2ludCAke3RoaXMuaXMwKCkgPyAnWkVSTycgOiB0aGlzLnRvSGV4KCl9PmA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogcmVtb3ZlXG4gICAgICAgIGdldCBweCgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLlg7XG4gICAgICAgIH1cbiAgICAgICAgZ2V0IHB5KCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuWDtcbiAgICAgICAgfVxuICAgICAgICBnZXQgcHooKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5aO1xuICAgICAgICB9XG4gICAgICAgIHRvUmF3Qnl0ZXMoaXNDb21wcmVzc2VkID0gdHJ1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudG9CeXRlcyhpc0NvbXByZXNzZWQpO1xuICAgICAgICB9XG4gICAgICAgIF9zZXRXaW5kb3dTaXplKHdpbmRvd1NpemUpIHtcbiAgICAgICAgICAgIHRoaXMucHJlY29tcHV0ZSh3aW5kb3dTaXplKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgbm9ybWFsaXplWihwb2ludHMpIHtcbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVaKFBvaW50LCBwb2ludHMpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBtc20ocG9pbnRzLCBzY2FsYXJzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGlwcGVuZ2VyKFBvaW50LCBGbiwgcG9pbnRzLCBzY2FsYXJzKTtcbiAgICAgICAgfVxuICAgICAgICBzdGF0aWMgZnJvbVByaXZhdGVLZXkocHJpdmF0ZUtleSkge1xuICAgICAgICAgICAgcmV0dXJuIFBvaW50LkJBU0UubXVsdGlwbHkoX25vcm1GbkVsZW1lbnQoRm4sIHByaXZhdGVLZXkpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBiYXNlIC8gZ2VuZXJhdG9yIHBvaW50XG4gICAgUG9pbnQuQkFTRSA9IG5ldyBQb2ludChDVVJWRS5HeCwgQ1VSVkUuR3ksIEZwLk9ORSk7XG4gICAgLy8gemVybyAvIGluZmluaXR5IC8gaWRlbnRpdHkgcG9pbnRcbiAgICBQb2ludC5aRVJPID0gbmV3IFBvaW50KEZwLlpFUk8sIEZwLk9ORSwgRnAuWkVSTyk7IC8vIDAsIDEsIDBcbiAgICAvLyBtYXRoIGZpZWxkXG4gICAgUG9pbnQuRnAgPSBGcDtcbiAgICAvLyBzY2FsYXIgZmllbGRcbiAgICBQb2ludC5GbiA9IEZuO1xuICAgIGNvbnN0IGJpdHMgPSBGbi5CSVRTO1xuICAgIGNvbnN0IHduYWYgPSBuZXcgd05BRihQb2ludCwgZXh0cmFPcHRzLmVuZG8gPyBNYXRoLmNlaWwoYml0cyAvIDIpIDogYml0cyk7XG4gICAgUG9pbnQuQkFTRS5wcmVjb21wdXRlKDgpOyAvLyBFbmFibGUgcHJlY29tcHV0ZXMuIFNsb3dzIGRvd24gZmlyc3QgcHVibGljS2V5IGNvbXB1dGF0aW9uIGJ5IDIwbXMuXG4gICAgcmV0dXJuIFBvaW50O1xufVxuLy8gUG9pbnRzIHN0YXJ0IHdpdGggYnl0ZSAweDAyIHdoZW4geSBpcyBldmVuOyBvdGhlcndpc2UgMHgwM1xuZnVuY3Rpb24gcHByZWZpeChoYXNFdmVuWSkge1xuICAgIHJldHVybiBVaW50OEFycmF5Lm9mKGhhc0V2ZW5ZID8gMHgwMiA6IDB4MDMpO1xufVxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgU2hhbGx1ZSBhbmQgdmFuIGRlIFdvZXN0aWpuZSBtZXRob2QgZm9yIGFueSB3ZWllcnN0cmFzcyBjdXJ2ZS5cbiAqIFRPRE86IGNoZWNrIGlmIHRoZXJlIGlzIGEgd2F5IHRvIG1lcmdlIHRoaXMgd2l0aCB1dlJhdGlvIGluIEVkd2FyZHM7IG1vdmUgdG8gbW9kdWxhci5cbiAqIGIgPSBUcnVlIGFuZCB5ID0gc3FydCh1IC8gdikgaWYgKHUgLyB2KSBpcyBzcXVhcmUgaW4gRiwgYW5kXG4gKiBiID0gRmFsc2UgYW5kIHkgPSBzcXJ0KFogKiAodSAvIHYpKSBvdGhlcndpc2UuXG4gKiBAcGFyYW0gRnBcbiAqIEBwYXJhbSBaXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gU1dVRnBTcXJ0UmF0aW8oRnAsIFopIHtcbiAgICAvLyBHZW5lcmljIGltcGxlbWVudGF0aW9uXG4gICAgY29uc3QgcSA9IEZwLk9SREVSO1xuICAgIGxldCBsID0gXzBuO1xuICAgIGZvciAobGV0IG8gPSBxIC0gXzFuOyBvICUgXzJuID09PSBfMG47IG8gLz0gXzJuKVxuICAgICAgICBsICs9IF8xbjtcbiAgICBjb25zdCBjMSA9IGw7IC8vIDEuIGMxLCB0aGUgbGFyZ2VzdCBpbnRlZ2VyIHN1Y2ggdGhhdCAyXmMxIGRpdmlkZXMgcSAtIDEuXG4gICAgLy8gV2UgbmVlZCAybiAqKiBjMSBhbmQgMm4gKiogKGMxLTEpLiBXZSBjYW4ndCB1c2UgKio7IGJ1dCB3ZSBjYW4gdXNlIDw8LlxuICAgIC8vIDJuICoqIGMxID09IDJuIDw8IChjMS0xKVxuICAgIGNvbnN0IF8ybl9wb3dfYzFfMSA9IF8ybiA8PCAoYzEgLSBfMW4gLSBfMW4pO1xuICAgIGNvbnN0IF8ybl9wb3dfYzEgPSBfMm5fcG93X2MxXzEgKiBfMm47XG4gICAgY29uc3QgYzIgPSAocSAtIF8xbikgLyBfMm5fcG93X2MxOyAvLyAyLiBjMiA9IChxIC0gMSkgLyAoMl5jMSkgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgY29uc3QgYzMgPSAoYzIgLSBfMW4pIC8gXzJuOyAvLyAzLiBjMyA9IChjMiAtIDEpIC8gMiAgICAgICAgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgY29uc3QgYzQgPSBfMm5fcG93X2MxIC0gXzFuOyAvLyA0LiBjNCA9IDJeYzEgLSAxICAgICAgICAgICAgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgY29uc3QgYzUgPSBfMm5fcG93X2MxXzE7IC8vIDUuIGM1ID0gMl4oYzEgLSAxKSAgICAgICAgICAgICAgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgY29uc3QgYzYgPSBGcC5wb3coWiwgYzIpOyAvLyA2LiBjNiA9IFpeYzJcbiAgICBjb25zdCBjNyA9IEZwLnBvdyhaLCAoYzIgKyBfMW4pIC8gXzJuKTsgLy8gNy4gYzcgPSBaXigoYzIgKyAxKSAvIDIpXG4gICAgbGV0IHNxcnRSYXRpbyA9ICh1LCB2KSA9PiB7XG4gICAgICAgIGxldCB0djEgPSBjNjsgLy8gMS4gdHYxID0gYzZcbiAgICAgICAgbGV0IHR2MiA9IEZwLnBvdyh2LCBjNCk7IC8vIDIuIHR2MiA9IHZeYzRcbiAgICAgICAgbGV0IHR2MyA9IEZwLnNxcih0djIpOyAvLyAzLiB0djMgPSB0djJeMlxuICAgICAgICB0djMgPSBGcC5tdWwodHYzLCB2KTsgLy8gNC4gdHYzID0gdHYzICogdlxuICAgICAgICBsZXQgdHY1ID0gRnAubXVsKHUsIHR2Myk7IC8vIDUuIHR2NSA9IHUgKiB0djNcbiAgICAgICAgdHY1ID0gRnAucG93KHR2NSwgYzMpOyAvLyA2LiB0djUgPSB0djVeYzNcbiAgICAgICAgdHY1ID0gRnAubXVsKHR2NSwgdHYyKTsgLy8gNy4gdHY1ID0gdHY1ICogdHYyXG4gICAgICAgIHR2MiA9IEZwLm11bCh0djUsIHYpOyAvLyA4LiB0djIgPSB0djUgKiB2XG4gICAgICAgIHR2MyA9IEZwLm11bCh0djUsIHUpOyAvLyA5LiB0djMgPSB0djUgKiB1XG4gICAgICAgIGxldCB0djQgPSBGcC5tdWwodHYzLCB0djIpOyAvLyAxMC4gdHY0ID0gdHYzICogdHYyXG4gICAgICAgIHR2NSA9IEZwLnBvdyh0djQsIGM1KTsgLy8gMTEuIHR2NSA9IHR2NF5jNVxuICAgICAgICBsZXQgaXNRUiA9IEZwLmVxbCh0djUsIEZwLk9ORSk7IC8vIDEyLiBpc1FSID0gdHY1ID09IDFcbiAgICAgICAgdHYyID0gRnAubXVsKHR2MywgYzcpOyAvLyAxMy4gdHYyID0gdHYzICogYzdcbiAgICAgICAgdHY1ID0gRnAubXVsKHR2NCwgdHYxKTsgLy8gMTQuIHR2NSA9IHR2NCAqIHR2MVxuICAgICAgICB0djMgPSBGcC5jbW92KHR2MiwgdHYzLCBpc1FSKTsgLy8gMTUuIHR2MyA9IENNT1YodHYyLCB0djMsIGlzUVIpXG4gICAgICAgIHR2NCA9IEZwLmNtb3YodHY1LCB0djQsIGlzUVIpOyAvLyAxNi4gdHY0ID0gQ01PVih0djUsIHR2NCwgaXNRUilcbiAgICAgICAgLy8gMTcuIGZvciBpIGluIChjMSwgYzEgLSAxLCAuLi4sIDIpOlxuICAgICAgICBmb3IgKGxldCBpID0gYzE7IGkgPiBfMW47IGktLSkge1xuICAgICAgICAgICAgbGV0IHR2NSA9IGkgLSBfMm47IC8vIDE4LiAgICB0djUgPSBpIC0gMlxuICAgICAgICAgICAgdHY1ID0gXzJuIDw8ICh0djUgLSBfMW4pOyAvLyAxOS4gICAgdHY1ID0gMl50djVcbiAgICAgICAgICAgIGxldCB0dnY1ID0gRnAucG93KHR2NCwgdHY1KTsgLy8gMjAuICAgIHR2NSA9IHR2NF50djVcbiAgICAgICAgICAgIGNvbnN0IGUxID0gRnAuZXFsKHR2djUsIEZwLk9ORSk7IC8vIDIxLiAgICBlMSA9IHR2NSA9PSAxXG4gICAgICAgICAgICB0djIgPSBGcC5tdWwodHYzLCB0djEpOyAvLyAyMi4gICAgdHYyID0gdHYzICogdHYxXG4gICAgICAgICAgICB0djEgPSBGcC5tdWwodHYxLCB0djEpOyAvLyAyMy4gICAgdHYxID0gdHYxICogdHYxXG4gICAgICAgICAgICB0dnY1ID0gRnAubXVsKHR2NCwgdHYxKTsgLy8gMjQuICAgIHR2NSA9IHR2NCAqIHR2MVxuICAgICAgICAgICAgdHYzID0gRnAuY21vdih0djIsIHR2MywgZTEpOyAvLyAyNS4gICAgdHYzID0gQ01PVih0djIsIHR2MywgZTEpXG4gICAgICAgICAgICB0djQgPSBGcC5jbW92KHR2djUsIHR2NCwgZTEpOyAvLyAyNi4gICAgdHY0ID0gQ01PVih0djUsIHR2NCwgZTEpXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgaXNWYWxpZDogaXNRUiwgdmFsdWU6IHR2MyB9O1xuICAgIH07XG4gICAgaWYgKEZwLk9SREVSICUgXzRuID09PSBfM24pIHtcbiAgICAgICAgLy8gc3FydF9yYXRpb18zbW9kNCh1LCB2KVxuICAgICAgICBjb25zdCBjMSA9IChGcC5PUkRFUiAtIF8zbikgLyBfNG47IC8vIDEuIGMxID0gKHEgLSAzKSAvIDQgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgICAgIGNvbnN0IGMyID0gRnAuc3FydChGcC5uZWcoWikpOyAvLyAyLiBjMiA9IHNxcnQoLVopXG4gICAgICAgIHNxcnRSYXRpbyA9ICh1LCB2KSA9PiB7XG4gICAgICAgICAgICBsZXQgdHYxID0gRnAuc3FyKHYpOyAvLyAxLiB0djEgPSB2XjJcbiAgICAgICAgICAgIGNvbnN0IHR2MiA9IEZwLm11bCh1LCB2KTsgLy8gMi4gdHYyID0gdSAqIHZcbiAgICAgICAgICAgIHR2MSA9IEZwLm11bCh0djEsIHR2Mik7IC8vIDMuIHR2MSA9IHR2MSAqIHR2MlxuICAgICAgICAgICAgbGV0IHkxID0gRnAucG93KHR2MSwgYzEpOyAvLyA0LiB5MSA9IHR2MV5jMVxuICAgICAgICAgICAgeTEgPSBGcC5tdWwoeTEsIHR2Mik7IC8vIDUuIHkxID0geTEgKiB0djJcbiAgICAgICAgICAgIGNvbnN0IHkyID0gRnAubXVsKHkxLCBjMik7IC8vIDYuIHkyID0geTEgKiBjMlxuICAgICAgICAgICAgY29uc3QgdHYzID0gRnAubXVsKEZwLnNxcih5MSksIHYpOyAvLyA3LiB0djMgPSB5MV4yOyA4LiB0djMgPSB0djMgKiB2XG4gICAgICAgICAgICBjb25zdCBpc1FSID0gRnAuZXFsKHR2MywgdSk7IC8vIDkuIGlzUVIgPSB0djMgPT0gdVxuICAgICAgICAgICAgbGV0IHkgPSBGcC5jbW92KHkyLCB5MSwgaXNRUik7IC8vIDEwLiB5ID0gQ01PVih5MiwgeTEsIGlzUVIpXG4gICAgICAgICAgICByZXR1cm4geyBpc1ZhbGlkOiBpc1FSLCB2YWx1ZTogeSB9OyAvLyAxMS4gcmV0dXJuIChpc1FSLCB5KSBpc1FSID8geSA6IHkqYzJcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLy8gTm8gY3VydmVzIHVzZXMgdGhhdFxuICAgIC8vIGlmIChGcC5PUkRFUiAlIF84biA9PT0gXzVuKSAvLyBzcXJ0X3JhdGlvXzVtb2Q4XG4gICAgcmV0dXJuIHNxcnRSYXRpbztcbn1cbi8qKlxuICogU2ltcGxpZmllZCBTaGFsbHVlLXZhbiBkZSBXb2VzdGlqbmUtVWxhcyBNZXRob2RcbiAqIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5MzgwI3NlY3Rpb24tNi42LjJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcFRvQ3VydmVTaW1wbGVTV1UoRnAsIG9wdHMpIHtcbiAgICB2YWxpZGF0ZUZpZWxkKEZwKTtcbiAgICBjb25zdCB7IEEsIEIsIFogfSA9IG9wdHM7XG4gICAgaWYgKCFGcC5pc1ZhbGlkKEEpIHx8ICFGcC5pc1ZhbGlkKEIpIHx8ICFGcC5pc1ZhbGlkKFopKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ21hcFRvQ3VydmVTaW1wbGVTV1U6IGludmFsaWQgb3B0cycpO1xuICAgIGNvbnN0IHNxcnRSYXRpbyA9IFNXVUZwU3FydFJhdGlvKEZwLCBaKTtcbiAgICBpZiAoIUZwLmlzT2RkKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZpZWxkIGRvZXMgbm90IGhhdmUgLmlzT2RkKCknKTtcbiAgICAvLyBJbnB1dDogdSwgYW4gZWxlbWVudCBvZiBGLlxuICAgIC8vIE91dHB1dDogKHgsIHkpLCBhIHBvaW50IG9uIEUuXG4gICAgcmV0dXJuICh1KSA9PiB7XG4gICAgICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICBsZXQgdHYxLCB0djIsIHR2MywgdHY0LCB0djUsIHR2NiwgeCwgeTtcbiAgICAgICAgdHYxID0gRnAuc3FyKHUpOyAvLyAxLiAgdHYxID0gdV4yXG4gICAgICAgIHR2MSA9IEZwLm11bCh0djEsIFopOyAvLyAyLiAgdHYxID0gWiAqIHR2MVxuICAgICAgICB0djIgPSBGcC5zcXIodHYxKTsgLy8gMy4gIHR2MiA9IHR2MV4yXG4gICAgICAgIHR2MiA9IEZwLmFkZCh0djIsIHR2MSk7IC8vIDQuICB0djIgPSB0djIgKyB0djFcbiAgICAgICAgdHYzID0gRnAuYWRkKHR2MiwgRnAuT05FKTsgLy8gNS4gIHR2MyA9IHR2MiArIDFcbiAgICAgICAgdHYzID0gRnAubXVsKHR2MywgQik7IC8vIDYuICB0djMgPSBCICogdHYzXG4gICAgICAgIHR2NCA9IEZwLmNtb3YoWiwgRnAubmVnKHR2MiksICFGcC5lcWwodHYyLCBGcC5aRVJPKSk7IC8vIDcuICB0djQgPSBDTU9WKFosIC10djIsIHR2MiAhPSAwKVxuICAgICAgICB0djQgPSBGcC5tdWwodHY0LCBBKTsgLy8gOC4gIHR2NCA9IEEgKiB0djRcbiAgICAgICAgdHYyID0gRnAuc3FyKHR2Myk7IC8vIDkuICB0djIgPSB0djNeMlxuICAgICAgICB0djYgPSBGcC5zcXIodHY0KTsgLy8gMTAuIHR2NiA9IHR2NF4yXG4gICAgICAgIHR2NSA9IEZwLm11bCh0djYsIEEpOyAvLyAxMS4gdHY1ID0gQSAqIHR2NlxuICAgICAgICB0djIgPSBGcC5hZGQodHYyLCB0djUpOyAvLyAxMi4gdHYyID0gdHYyICsgdHY1XG4gICAgICAgIHR2MiA9IEZwLm11bCh0djIsIHR2Myk7IC8vIDEzLiB0djIgPSB0djIgKiB0djNcbiAgICAgICAgdHY2ID0gRnAubXVsKHR2NiwgdHY0KTsgLy8gMTQuIHR2NiA9IHR2NiAqIHR2NFxuICAgICAgICB0djUgPSBGcC5tdWwodHY2LCBCKTsgLy8gMTUuIHR2NSA9IEIgKiB0djZcbiAgICAgICAgdHYyID0gRnAuYWRkKHR2MiwgdHY1KTsgLy8gMTYuIHR2MiA9IHR2MiArIHR2NVxuICAgICAgICB4ID0gRnAubXVsKHR2MSwgdHYzKTsgLy8gMTcuICAgeCA9IHR2MSAqIHR2M1xuICAgICAgICBjb25zdCB7IGlzVmFsaWQsIHZhbHVlIH0gPSBzcXJ0UmF0aW8odHYyLCB0djYpOyAvLyAxOC4gKGlzX2d4MV9zcXVhcmUsIHkxKSA9IHNxcnRfcmF0aW8odHYyLCB0djYpXG4gICAgICAgIHkgPSBGcC5tdWwodHYxLCB1KTsgLy8gMTkuICAgeSA9IHR2MSAqIHUgIC0+IFogKiB1XjMgKiB5MVxuICAgICAgICB5ID0gRnAubXVsKHksIHZhbHVlKTsgLy8gMjAuICAgeSA9IHkgKiB5MVxuICAgICAgICB4ID0gRnAuY21vdih4LCB0djMsIGlzVmFsaWQpOyAvLyAyMS4gICB4ID0gQ01PVih4LCB0djMsIGlzX2d4MV9zcXVhcmUpXG4gICAgICAgIHkgPSBGcC5jbW92KHksIHZhbHVlLCBpc1ZhbGlkKTsgLy8gMjIuICAgeSA9IENNT1YoeSwgeTEsIGlzX2d4MV9zcXVhcmUpXG4gICAgICAgIGNvbnN0IGUxID0gRnAuaXNPZGQodSkgPT09IEZwLmlzT2RkKHkpOyAvLyAyMy4gIGUxID0gc2duMCh1KSA9PSBzZ24wKHkpXG4gICAgICAgIHkgPSBGcC5jbW92KEZwLm5lZyh5KSwgeSwgZTEpOyAvLyAyNC4gICB5ID0gQ01PVigteSwgeSwgZTEpXG4gICAgICAgIGNvbnN0IHR2NF9pbnYgPSBGcEludmVydEJhdGNoKEZwLCBbdHY0XSwgdHJ1ZSlbMF07XG4gICAgICAgIHggPSBGcC5tdWwoeCwgdHY0X2ludik7IC8vIDI1LiAgIHggPSB4IC8gdHY0XG4gICAgICAgIHJldHVybiB7IHgsIHkgfTtcbiAgICB9O1xufVxuZnVuY3Rpb24gZ2V0V0xlbmd0aHMoRnAsIEZuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VjcmV0S2V5OiBGbi5CWVRFUyxcbiAgICAgICAgcHVibGljS2V5OiAxICsgRnAuQllURVMsXG4gICAgICAgIHB1YmxpY0tleVVuY29tcHJlc3NlZDogMSArIDIgKiBGcC5CWVRFUyxcbiAgICAgICAgcHVibGljS2V5SGFzUHJlZml4OiB0cnVlLFxuICAgICAgICBzaWduYXR1cmU6IDIgKiBGbi5CWVRFUyxcbiAgICB9O1xufVxuLyoqXG4gKiBTb21ldGltZXMgdXNlcnMgb25seSBuZWVkIGdldFB1YmxpY0tleSwgZ2V0U2hhcmVkU2VjcmV0LCBhbmQgc2VjcmV0IGtleSBoYW5kbGluZy5cbiAqIFRoaXMgaGVscGVyIGVuc3VyZXMgbm8gc2lnbmF0dXJlIGZ1bmN0aW9uYWxpdHkgaXMgcHJlc2VudC4gTGVzcyBjb2RlLCBzbWFsbGVyIGJ1bmRsZSBzaXplLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZWNkaChQb2ludCwgZWNkaE9wdHMgPSB7fSkge1xuICAgIGNvbnN0IHsgRm4gfSA9IFBvaW50O1xuICAgIGNvbnN0IHJhbmRvbUJ5dGVzXyA9IGVjZGhPcHRzLnJhbmRvbUJ5dGVzIHx8IHJhbmRvbUJ5dGVzV2ViO1xuICAgIGNvbnN0IGxlbmd0aHMgPSBPYmplY3QuYXNzaWduKGdldFdMZW5ndGhzKFBvaW50LkZwLCBGbiksIHsgc2VlZDogZ2V0TWluSGFzaExlbmd0aChGbi5PUkRFUikgfSk7XG4gICAgZnVuY3Rpb24gaXNWYWxpZFNlY3JldEtleShzZWNyZXRLZXkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiAhIV9ub3JtRm5FbGVtZW50KEZuLCBzZWNyZXRLZXkpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGlzVmFsaWRQdWJsaWNLZXkocHVibGljS2V5LCBpc0NvbXByZXNzZWQpIHtcbiAgICAgICAgY29uc3QgeyBwdWJsaWNLZXk6IGNvbXAsIHB1YmxpY0tleVVuY29tcHJlc3NlZCB9ID0gbGVuZ3RocztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGwgPSBwdWJsaWNLZXkubGVuZ3RoO1xuICAgICAgICAgICAgaWYgKGlzQ29tcHJlc3NlZCA9PT0gdHJ1ZSAmJiBsICE9PSBjb21wKVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGlmIChpc0NvbXByZXNzZWQgPT09IGZhbHNlICYmIGwgIT09IHB1YmxpY0tleVVuY29tcHJlc3NlZClcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gISFQb2ludC5mcm9tQnl0ZXMocHVibGljS2V5KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBQcm9kdWNlcyBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgc2VjcmV0IGtleSBmcm9tIHJhbmRvbSBvZiBzaXplXG4gICAgICogKGdyb3VwTGVuICsgY2VpbChncm91cExlbiAvIDIpKSB3aXRoIG1vZHVsbyBiaWFzIGJlaW5nIG5lZ2xpZ2libGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmFuZG9tU2VjcmV0S2V5KHNlZWQgPSByYW5kb21CeXRlc18obGVuZ3Rocy5zZWVkKSkge1xuICAgICAgICByZXR1cm4gbWFwSGFzaFRvRmllbGQoYWJ5dGVzKHNlZWQsIGxlbmd0aHMuc2VlZCwgJ3NlZWQnKSwgRm4uT1JERVIpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyBwdWJsaWMga2V5IGZvciBhIHNlY3JldCBrZXkuIENoZWNrcyBmb3IgdmFsaWRpdHkgb2YgdGhlIHNlY3JldCBrZXkuXG4gICAgICogQHBhcmFtIGlzQ29tcHJlc3NlZCB3aGV0aGVyIHRvIHJldHVybiBjb21wYWN0IChkZWZhdWx0KSwgb3IgZnVsbCBrZXlcbiAgICAgKiBAcmV0dXJucyBQdWJsaWMga2V5LCBmdWxsIHdoZW4gaXNDb21wcmVzc2VkPWZhbHNlOyBzaG9ydCB3aGVuIGlzQ29tcHJlc3NlZD10cnVlXG4gICAgICovXG4gICAgZnVuY3Rpb24gZ2V0UHVibGljS2V5KHNlY3JldEtleSwgaXNDb21wcmVzc2VkID0gdHJ1ZSkge1xuICAgICAgICByZXR1cm4gUG9pbnQuQkFTRS5tdWx0aXBseShfbm9ybUZuRWxlbWVudChGbiwgc2VjcmV0S2V5KSkudG9CeXRlcyhpc0NvbXByZXNzZWQpO1xuICAgIH1cbiAgICBmdW5jdGlvbiBrZXlnZW4oc2VlZCkge1xuICAgICAgICBjb25zdCBzZWNyZXRLZXkgPSByYW5kb21TZWNyZXRLZXkoc2VlZCk7XG4gICAgICAgIHJldHVybiB7IHNlY3JldEtleSwgcHVibGljS2V5OiBnZXRQdWJsaWNLZXkoc2VjcmV0S2V5KSB9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBRdWljayBhbmQgZGlydHkgY2hlY2sgZm9yIGl0ZW0gYmVpbmcgcHVibGljIGtleS4gRG9lcyBub3QgdmFsaWRhdGUgaGV4LCBvciBiZWluZyBvbi1jdXJ2ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc1Byb2JQdWIoaXRlbSkge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW0gPT09ICdiaWdpbnQnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoaXRlbSBpbnN0YW5jZW9mIFBvaW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGNvbnN0IHsgc2VjcmV0S2V5LCBwdWJsaWNLZXksIHB1YmxpY0tleVVuY29tcHJlc3NlZCB9ID0gbGVuZ3RocztcbiAgICAgICAgaWYgKEZuLmFsbG93ZWRMZW5ndGhzIHx8IHNlY3JldEtleSA9PT0gcHVibGljS2V5KVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgbCA9IGVuc3VyZUJ5dGVzKCdrZXknLCBpdGVtKS5sZW5ndGg7XG4gICAgICAgIHJldHVybiBsID09PSBwdWJsaWNLZXkgfHwgbCA9PT0gcHVibGljS2V5VW5jb21wcmVzc2VkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBFQ0RIIChFbGxpcHRpYyBDdXJ2ZSBEaWZmaWUgSGVsbG1hbikuXG4gICAgICogQ29tcHV0ZXMgc2hhcmVkIHB1YmxpYyBrZXkgZnJvbSBzZWNyZXQga2V5IEEgYW5kIHB1YmxpYyBrZXkgQi5cbiAgICAgKiBDaGVja3M6IDEpIHNlY3JldCBrZXkgdmFsaWRpdHkgMikgc2hhcmVkIGtleSBpcyBvbi1jdXJ2ZS5cbiAgICAgKiBEb2VzIE5PVCBoYXNoIHRoZSByZXN1bHQuXG4gICAgICogQHBhcmFtIGlzQ29tcHJlc3NlZCB3aGV0aGVyIHRvIHJldHVybiBjb21wYWN0IChkZWZhdWx0KSwgb3IgZnVsbCBrZXlcbiAgICAgKiBAcmV0dXJucyBzaGFyZWQgcHVibGljIGtleVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGdldFNoYXJlZFNlY3JldChzZWNyZXRLZXlBLCBwdWJsaWNLZXlCLCBpc0NvbXByZXNzZWQgPSB0cnVlKSB7XG4gICAgICAgIGlmIChpc1Byb2JQdWIoc2VjcmV0S2V5QSkgPT09IHRydWUpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpcnN0IGFyZyBtdXN0IGJlIHByaXZhdGUga2V5Jyk7XG4gICAgICAgIGlmIChpc1Byb2JQdWIocHVibGljS2V5QikgPT09IGZhbHNlKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzZWNvbmQgYXJnIG11c3QgYmUgcHVibGljIGtleScpO1xuICAgICAgICBjb25zdCBzID0gX25vcm1GbkVsZW1lbnQoRm4sIHNlY3JldEtleUEpO1xuICAgICAgICBjb25zdCBiID0gUG9pbnQuZnJvbUhleChwdWJsaWNLZXlCKTsgLy8gY2hlY2tzIGZvciBiZWluZyBvbi1jdXJ2ZVxuICAgICAgICByZXR1cm4gYi5tdWx0aXBseShzKS50b0J5dGVzKGlzQ29tcHJlc3NlZCk7XG4gICAgfVxuICAgIGNvbnN0IHV0aWxzID0ge1xuICAgICAgICBpc1ZhbGlkU2VjcmV0S2V5LFxuICAgICAgICBpc1ZhbGlkUHVibGljS2V5LFxuICAgICAgICByYW5kb21TZWNyZXRLZXksXG4gICAgICAgIC8vIFRPRE86IHJlbW92ZVxuICAgICAgICBpc1ZhbGlkUHJpdmF0ZUtleTogaXNWYWxpZFNlY3JldEtleSxcbiAgICAgICAgcmFuZG9tUHJpdmF0ZUtleTogcmFuZG9tU2VjcmV0S2V5LFxuICAgICAgICBub3JtUHJpdmF0ZUtleVRvU2NhbGFyOiAoa2V5KSA9PiBfbm9ybUZuRWxlbWVudChGbiwga2V5KSxcbiAgICAgICAgcHJlY29tcHV0ZSh3aW5kb3dTaXplID0gOCwgcG9pbnQgPSBQb2ludC5CQVNFKSB7XG4gICAgICAgICAgICByZXR1cm4gcG9pbnQucHJlY29tcHV0ZSh3aW5kb3dTaXplLCBmYWxzZSk7XG4gICAgICAgIH0sXG4gICAgfTtcbiAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IGdldFB1YmxpY0tleSwgZ2V0U2hhcmVkU2VjcmV0LCBrZXlnZW4sIFBvaW50LCB1dGlscywgbGVuZ3RocyB9KTtcbn1cbi8qKlxuICogQ3JlYXRlcyBFQ0RTQSBzaWduaW5nIGludGVyZmFjZSBmb3IgZ2l2ZW4gZWxsaXB0aWMgY3VydmUgYFBvaW50YCBhbmQgYGhhc2hgIGZ1bmN0aW9uLlxuICogV2UgbmVlZCBgaGFzaGAgZm9yIDIgZmVhdHVyZXM6XG4gKiAxLiBNZXNzYWdlIHByZWhhc2gtaW5nLiBOT1QgdXNlZCBpZiBgc2lnbmAgLyBgdmVyaWZ5YCBhcmUgY2FsbGVkIHdpdGggYHByZWhhc2g6IGZhbHNlYFxuICogMi4gayBnZW5lcmF0aW9uIGluIGBzaWduYCwgdXNpbmcgSE1BQy1kcmJnKGhhc2gpXG4gKlxuICogRUNEU0FPcHRzIGFyZSBvbmx5IHJhcmVseSBuZWVkZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBjb25zdCBwMjU2X1BvaW50ID0gd2VpZXJzdHJhc3MoLi4uKTtcbiAqIGNvbnN0IHAyNTZfc2hhMjU2ID0gZWNkc2EocDI1Nl9Qb2ludCwgc2hhMjU2KTtcbiAqIGNvbnN0IHAyNTZfc2hhMjI0ID0gZWNkc2EocDI1Nl9Qb2ludCwgc2hhMjI0KTtcbiAqIGNvbnN0IHAyNTZfc2hhMjI0X3IgPSBlY2RzYShwMjU2X1BvaW50LCBzaGEyMjQsIHsgcmFuZG9tQnl0ZXM6IChsZW5ndGgpID0+IHsgLi4uIH0gfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVjZHNhKFBvaW50LCBoYXNoLCBlY2RzYU9wdHMgPSB7fSkge1xuICAgIGFoYXNoKGhhc2gpO1xuICAgIF92YWxpZGF0ZU9iamVjdChlY2RzYU9wdHMsIHt9LCB7XG4gICAgICAgIGhtYWM6ICdmdW5jdGlvbicsXG4gICAgICAgIGxvd1M6ICdib29sZWFuJyxcbiAgICAgICAgcmFuZG9tQnl0ZXM6ICdmdW5jdGlvbicsXG4gICAgICAgIGJpdHMyaW50OiAnZnVuY3Rpb24nLFxuICAgICAgICBiaXRzMmludF9tb2ROOiAnZnVuY3Rpb24nLFxuICAgIH0pO1xuICAgIGNvbnN0IHJhbmRvbUJ5dGVzID0gZWNkc2FPcHRzLnJhbmRvbUJ5dGVzIHx8IHJhbmRvbUJ5dGVzV2ViO1xuICAgIGNvbnN0IGhtYWMgPSBlY2RzYU9wdHMuaG1hYyB8fFxuICAgICAgICAoKGtleSwgLi4ubXNncykgPT4gbm9ibGVIbWFjKGhhc2gsIGtleSwgY29uY2F0Qnl0ZXMoLi4ubXNncykpKTtcbiAgICBjb25zdCB7IEZwLCBGbiB9ID0gUG9pbnQ7XG4gICAgY29uc3QgeyBPUkRFUjogQ1VSVkVfT1JERVIsIEJJVFM6IGZuQml0cyB9ID0gRm47XG4gICAgY29uc3QgeyBrZXlnZW4sIGdldFB1YmxpY0tleSwgZ2V0U2hhcmVkU2VjcmV0LCB1dGlscywgbGVuZ3RocyB9ID0gZWNkaChQb2ludCwgZWNkc2FPcHRzKTtcbiAgICBjb25zdCBkZWZhdWx0U2lnT3B0cyA9IHtcbiAgICAgICAgcHJlaGFzaDogZmFsc2UsXG4gICAgICAgIGxvd1M6IHR5cGVvZiBlY2RzYU9wdHMubG93UyA9PT0gJ2Jvb2xlYW4nID8gZWNkc2FPcHRzLmxvd1MgOiBmYWxzZSxcbiAgICAgICAgZm9ybWF0OiB1bmRlZmluZWQsIC8vJ2NvbXBhY3QnIGFzIEVDRFNBU2lnRm9ybWF0LFxuICAgICAgICBleHRyYUVudHJvcHk6IGZhbHNlLFxuICAgIH07XG4gICAgY29uc3QgZGVmYXVsdFNpZ09wdHNfZm9ybWF0ID0gJ2NvbXBhY3QnO1xuICAgIGZ1bmN0aW9uIGlzQmlnZ2VyVGhhbkhhbGZPcmRlcihudW1iZXIpIHtcbiAgICAgICAgY29uc3QgSEFMRiA9IENVUlZFX09SREVSID4+IF8xbjtcbiAgICAgICAgcmV0dXJuIG51bWJlciA+IEhBTEY7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHZhbGlkYXRlUlModGl0bGUsIG51bSkge1xuICAgICAgICBpZiAoIUZuLmlzVmFsaWROb3QwKG51bSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgc2lnbmF0dXJlICR7dGl0bGV9OiBvdXQgb2YgcmFuZ2UgMS4uUG9pbnQuRm4uT1JERVJgKTtcbiAgICAgICAgcmV0dXJuIG51bTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVTaWdMZW5ndGgoYnl0ZXMsIGZvcm1hdCkge1xuICAgICAgICB2YWxpZGF0ZVNpZ0Zvcm1hdChmb3JtYXQpO1xuICAgICAgICBjb25zdCBzaXplID0gbGVuZ3Rocy5zaWduYXR1cmU7XG4gICAgICAgIGNvbnN0IHNpemVyID0gZm9ybWF0ID09PSAnY29tcGFjdCcgPyBzaXplIDogZm9ybWF0ID09PSAncmVjb3ZlcmVkJyA/IHNpemUgKyAxIDogdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gYWJ5dGVzKGJ5dGVzLCBzaXplciwgYCR7Zm9ybWF0fSBzaWduYXR1cmVgKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRUNEU0Egc2lnbmF0dXJlIHdpdGggaXRzIChyLCBzKSBwcm9wZXJ0aWVzLiBTdXBwb3J0cyBjb21wYWN0LCByZWNvdmVyZWQgJiBERVIgcmVwcmVzZW50YXRpb25zLlxuICAgICAqL1xuICAgIGNsYXNzIFNpZ25hdHVyZSB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHIsIHMsIHJlY292ZXJ5KSB7XG4gICAgICAgICAgICB0aGlzLnIgPSB2YWxpZGF0ZVJTKCdyJywgcik7IC8vIHIgaW4gWzEuLk4tMV07XG4gICAgICAgICAgICB0aGlzLnMgPSB2YWxpZGF0ZVJTKCdzJywgcyk7IC8vIHMgaW4gWzEuLk4tMV07XG4gICAgICAgICAgICBpZiAocmVjb3ZlcnkgIT0gbnVsbClcbiAgICAgICAgICAgICAgICB0aGlzLnJlY292ZXJ5ID0gcmVjb3Zlcnk7XG4gICAgICAgICAgICBPYmplY3QuZnJlZXplKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXMsIGZvcm1hdCA9IGRlZmF1bHRTaWdPcHRzX2Zvcm1hdCkge1xuICAgICAgICAgICAgdmFsaWRhdGVTaWdMZW5ndGgoYnl0ZXMsIGZvcm1hdCk7XG4gICAgICAgICAgICBsZXQgcmVjaWQ7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAnZGVyJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgciwgcyB9ID0gREVSLnRvU2lnKGFieXRlcyhieXRlcykpO1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKHIsIHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ3JlY292ZXJlZCcpIHtcbiAgICAgICAgICAgICAgICByZWNpZCA9IGJ5dGVzWzBdO1xuICAgICAgICAgICAgICAgIGZvcm1hdCA9ICdjb21wYWN0JztcbiAgICAgICAgICAgICAgICBieXRlcyA9IGJ5dGVzLnN1YmFycmF5KDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgTCA9IEZuLkJZVEVTO1xuICAgICAgICAgICAgY29uc3QgciA9IGJ5dGVzLnN1YmFycmF5KDAsIEwpO1xuICAgICAgICAgICAgY29uc3QgcyA9IGJ5dGVzLnN1YmFycmF5KEwsIEwgKiAyKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKEZuLmZyb21CeXRlcyhyKSwgRm4uZnJvbUJ5dGVzKHMpLCByZWNpZCk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGZyb21IZXgoaGV4LCBmb3JtYXQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZyb21CeXRlcyhoZXhUb0J5dGVzKGhleCksIGZvcm1hdCk7XG4gICAgICAgIH1cbiAgICAgICAgYWRkUmVjb3ZlcnlCaXQocmVjb3ZlcnkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2lnbmF0dXJlKHRoaXMuciwgdGhpcy5zLCByZWNvdmVyeSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3ZlclB1YmxpY0tleShtZXNzYWdlSGFzaCkge1xuICAgICAgICAgICAgY29uc3QgRklFTERfT1JERVIgPSBGcC5PUkRFUjtcbiAgICAgICAgICAgIGNvbnN0IHsgciwgcywgcmVjb3Zlcnk6IHJlYyB9ID0gdGhpcztcbiAgICAgICAgICAgIGlmIChyZWMgPT0gbnVsbCB8fCAhWzAsIDEsIDIsIDNdLmluY2x1ZGVzKHJlYykpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZWNvdmVyeSBpZCBpbnZhbGlkJyk7XG4gICAgICAgICAgICAvLyBFQ0RTQSByZWNvdmVyeSBpcyBoYXJkIGZvciBjb2ZhY3RvciA+IDEgY3VydmVzLlxuICAgICAgICAgICAgLy8gSW4gc2lnbiwgYHIgPSBxLnggbW9kIG5gLCBhbmQgaGVyZSB3ZSByZWNvdmVyIHEueCBmcm9tIHIuXG4gICAgICAgICAgICAvLyBXaGlsZSByZWNvdmVyaW5nIHEueCA+PSBuLCB3ZSBuZWVkIHRvIGFkZCByK24gZm9yIGNvZmFjdG9yPTEgY3VydmVzLlxuICAgICAgICAgICAgLy8gSG93ZXZlciwgZm9yIGNvZmFjdG9yPjEsIHIrbiBtYXkgbm90IGdldCBxLng6XG4gICAgICAgICAgICAvLyByK24qaSB3b3VsZCBuZWVkIHRvIGJlIGRvbmUgaW5zdGVhZCB3aGVyZSBpIGlzIHVua25vd24uXG4gICAgICAgICAgICAvLyBUbyBlYXNpbHkgZ2V0IGksIHdlIGVpdGhlciBuZWVkIHRvOlxuICAgICAgICAgICAgLy8gYS4gaW5jcmVhc2UgYW1vdW50IG9mIHZhbGlkIHJlY2lkIHZhbHVlcyAoNCwgNS4uLik7IE9SXG4gICAgICAgICAgICAvLyBiLiBwcm9oaWJpdCBub24tcHJpbWUtb3JkZXIgc2lnbmF0dXJlcyAocmVjaWQgPiAxKS5cbiAgICAgICAgICAgIGNvbnN0IGhhc0NvZmFjdG9yID0gQ1VSVkVfT1JERVIgKiBfMm4gPCBGSUVMRF9PUkRFUjtcbiAgICAgICAgICAgIGlmIChoYXNDb2ZhY3RvciAmJiByZWMgPiAxKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjb3ZlcnkgaWQgaXMgYW1iaWd1b3VzIGZvciBoPjEgY3VydmUnKTtcbiAgICAgICAgICAgIGNvbnN0IHJhZGogPSByZWMgPT09IDIgfHwgcmVjID09PSAzID8gciArIENVUlZFX09SREVSIDogcjtcbiAgICAgICAgICAgIGlmICghRnAuaXNWYWxpZChyYWRqKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY292ZXJ5IGlkIDIgb3IgMyBpbnZhbGlkJyk7XG4gICAgICAgICAgICBjb25zdCB4ID0gRnAudG9CeXRlcyhyYWRqKTtcbiAgICAgICAgICAgIGNvbnN0IFIgPSBQb2ludC5mcm9tQnl0ZXMoY29uY2F0Qnl0ZXMocHByZWZpeCgocmVjICYgMSkgPT09IDApLCB4KSk7XG4gICAgICAgICAgICBjb25zdCBpciA9IEZuLmludihyYWRqKTsgLy8gcl4tMVxuICAgICAgICAgICAgY29uc3QgaCA9IGJpdHMyaW50X21vZE4oZW5zdXJlQnl0ZXMoJ21zZ0hhc2gnLCBtZXNzYWdlSGFzaCkpOyAvLyBUcnVuY2F0ZSBoYXNoXG4gICAgICAgICAgICBjb25zdCB1MSA9IEZuLmNyZWF0ZSgtaCAqIGlyKTsgLy8gLWhyXi0xXG4gICAgICAgICAgICBjb25zdCB1MiA9IEZuLmNyZWF0ZShzICogaXIpOyAvLyBzcl4tMVxuICAgICAgICAgICAgLy8gKHNyXi0xKVItKGhyXi0xKUcgPSAtKGhyXi0xKUcgKyAoc3JeLTEpLiB1bnNhZmUgaXMgZmluZTogdGhlcmUgaXMgbm8gcHJpdmF0ZSBkYXRhLlxuICAgICAgICAgICAgY29uc3QgUSA9IFBvaW50LkJBU0UubXVsdGlwbHlVbnNhZmUodTEpLmFkZChSLm11bHRpcGx5VW5zYWZlKHUyKSk7XG4gICAgICAgICAgICBpZiAoUS5pczAoKSlcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BvaW50IGF0IGluZmluaWZ5Jyk7XG4gICAgICAgICAgICBRLmFzc2VydFZhbGlkaXR5KCk7XG4gICAgICAgICAgICByZXR1cm4gUTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaWduYXR1cmVzIHNob3VsZCBiZSBsb3ctcywgdG8gcHJldmVudCBtYWxsZWFiaWxpdHkuXG4gICAgICAgIGhhc0hpZ2hTKCkge1xuICAgICAgICAgICAgcmV0dXJuIGlzQmlnZ2VyVGhhbkhhbGZPcmRlcih0aGlzLnMpO1xuICAgICAgICB9XG4gICAgICAgIHRvQnl0ZXMoZm9ybWF0ID0gZGVmYXVsdFNpZ09wdHNfZm9ybWF0KSB7XG4gICAgICAgICAgICB2YWxpZGF0ZVNpZ0Zvcm1hdChmb3JtYXQpO1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RlcicpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhleFRvQnl0ZXMoREVSLmhleEZyb21TaWcodGhpcykpO1xuICAgICAgICAgICAgY29uc3QgciA9IEZuLnRvQnl0ZXModGhpcy5yKTtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBGbi50b0J5dGVzKHRoaXMucyk7XG4gICAgICAgICAgICBpZiAoZm9ybWF0ID09PSAncmVjb3ZlcmVkJykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlY292ZXJ5ID09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjb3ZlcnkgYml0IG11c3QgYmUgcHJlc2VudCcpO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb25jYXRCeXRlcyhVaW50OEFycmF5Lm9mKHRoaXMucmVjb3ZlcnkpLCByLCBzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb25jYXRCeXRlcyhyLCBzKTtcbiAgICAgICAgfVxuICAgICAgICB0b0hleChmb3JtYXQpIHtcbiAgICAgICAgICAgIHJldHVybiBieXRlc1RvSGV4KHRoaXMudG9CeXRlcyhmb3JtYXQpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiByZW1vdmVcbiAgICAgICAgYXNzZXJ0VmFsaWRpdHkoKSB7IH1cbiAgICAgICAgc3RhdGljIGZyb21Db21wYWN0KGhleCkge1xuICAgICAgICAgICAgcmV0dXJuIFNpZ25hdHVyZS5mcm9tQnl0ZXMoZW5zdXJlQnl0ZXMoJ3NpZycsIGhleCksICdjb21wYWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhdGljIGZyb21ERVIoaGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gU2lnbmF0dXJlLmZyb21CeXRlcyhlbnN1cmVCeXRlcygnc2lnJywgaGV4KSwgJ2RlcicpO1xuICAgICAgICB9XG4gICAgICAgIG5vcm1hbGl6ZVMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5oYXNIaWdoUygpID8gbmV3IFNpZ25hdHVyZSh0aGlzLnIsIEZuLm5lZyh0aGlzLnMpLCB0aGlzLnJlY292ZXJ5KSA6IHRoaXM7XG4gICAgICAgIH1cbiAgICAgICAgdG9ERVJSYXdCeXRlcygpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvQnl0ZXMoJ2RlcicpO1xuICAgICAgICB9XG4gICAgICAgIHRvREVSSGV4KCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ5dGVzVG9IZXgodGhpcy50b0J5dGVzKCdkZXInKSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9Db21wYWN0UmF3Qnl0ZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50b0J5dGVzKCdjb21wYWN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgdG9Db21wYWN0SGV4KCkge1xuICAgICAgICAgICAgcmV0dXJuIGJ5dGVzVG9IZXgodGhpcy50b0J5dGVzKCdjb21wYWN0JykpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFJGQzY5Nzk6IGVuc3VyZSBFQ0RTQSBtc2cgaXMgWCBieXRlcyBhbmQgPCBOLiBSRkMgc3VnZ2VzdHMgb3B0aW9uYWwgdHJ1bmNhdGluZyB2aWEgYml0czJvY3RldHMuXG4gICAgLy8gRklQUyAxODYtNCA0LjYgc3VnZ2VzdHMgdGhlIGxlZnRtb3N0IG1pbihuQml0TGVuLCBvdXRMZW4pIGJpdHMsIHdoaWNoIG1hdGNoZXMgYml0czJpbnQuXG4gICAgLy8gYml0czJpbnQgY2FuIHByb2R1Y2UgcmVzPk4sIHdlIGNhbiBkbyBtb2QocmVzLCBOKSBzaW5jZSB0aGUgYml0TGVuIGlzIHRoZSBzYW1lLlxuICAgIC8vIGludDJvY3RldHMgY2FuJ3QgYmUgdXNlZDsgcGFkcyBzbWFsbCBtc2dzIHdpdGggMDogdW5hY2NlcHRhdGJsZSBmb3IgdHJ1bmMgYXMgcGVyIFJGQyB2ZWN0b3JzXG4gICAgY29uc3QgYml0czJpbnQgPSBlY2RzYU9wdHMuYml0czJpbnQgfHxcbiAgICAgICAgZnVuY3Rpb24gYml0czJpbnRfZGVmKGJ5dGVzKSB7XG4gICAgICAgICAgICAvLyBPdXIgY3VzdG9tIGNoZWNrIFwianVzdCBpbiBjYXNlXCIsIGZvciBwcm90ZWN0aW9uIGFnYWluc3QgRG9TXG4gICAgICAgICAgICBpZiAoYnl0ZXMubGVuZ3RoID4gODE5MilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2lucHV0IGlzIHRvbyBsYXJnZScpO1xuICAgICAgICAgICAgLy8gRm9yIGN1cnZlcyB3aXRoIG5CaXRMZW5ndGggJSA4ICE9PSAwOiBiaXRzMm9jdGV0cyhiaXRzMm9jdGV0cyhtKSkgIT09IGJpdHMyb2N0ZXRzKG0pXG4gICAgICAgICAgICAvLyBmb3Igc29tZSBjYXNlcywgc2luY2UgYnl0ZXMubGVuZ3RoICogOCBpcyBub3QgYWN0dWFsIGJpdExlbmd0aC5cbiAgICAgICAgICAgIGNvbnN0IG51bSA9IGJ5dGVzVG9OdW1iZXJCRShieXRlcyk7IC8vIGNoZWNrIGZvciA9PSB1OCBkb25lIGhlcmVcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gYnl0ZXMubGVuZ3RoICogOCAtIGZuQml0czsgLy8gdHJ1bmNhdGUgdG8gbkJpdExlbmd0aCBsZWZ0bW9zdCBiaXRzXG4gICAgICAgICAgICByZXR1cm4gZGVsdGEgPiAwID8gbnVtID4+IEJpZ0ludChkZWx0YSkgOiBudW07XG4gICAgICAgIH07XG4gICAgY29uc3QgYml0czJpbnRfbW9kTiA9IGVjZHNhT3B0cy5iaXRzMmludF9tb2ROIHx8XG4gICAgICAgIGZ1bmN0aW9uIGJpdHMyaW50X21vZE5fZGVmKGJ5dGVzKSB7XG4gICAgICAgICAgICByZXR1cm4gRm4uY3JlYXRlKGJpdHMyaW50KGJ5dGVzKSk7IC8vIGNhbid0IHVzZSBieXRlc1RvTnVtYmVyQkUgaGVyZVxuICAgICAgICB9O1xuICAgIC8vIFBhZHMgb3V0cHV0IHdpdGggemVybyBhcyBwZXIgc3BlY1xuICAgIGNvbnN0IE9SREVSX01BU0sgPSBiaXRNYXNrKGZuQml0cyk7XG4gICAgLyoqIENvbnZlcnRzIHRvIGJ5dGVzLiBDaGVja3MgaWYgbnVtIGluIGBbMC4uT1JERVJfTUFTSy0xXWAgZS5nLjogYFswLi4yXjI1Ni0xXWAuICovXG4gICAgZnVuY3Rpb24gaW50Mm9jdGV0cyhudW0pIHtcbiAgICAgICAgLy8gSU1QT1JUQU5UOiB0aGUgY2hlY2sgZW5zdXJlcyB3b3JraW5nIGZvciBjYXNlIGBGbi5CWVRFUyAhPSBGbi5CSVRTICogOGBcbiAgICAgICAgYUluUmFuZ2UoJ251bSA8IDJeJyArIGZuQml0cywgbnVtLCBfMG4sIE9SREVSX01BU0spO1xuICAgICAgICByZXR1cm4gRm4udG9CeXRlcyhudW0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB2YWxpZGF0ZU1zZ0FuZEhhc2gobWVzc2FnZSwgcHJlaGFzaCkge1xuICAgICAgICBhYnl0ZXMobWVzc2FnZSwgdW5kZWZpbmVkLCAnbWVzc2FnZScpO1xuICAgICAgICByZXR1cm4gcHJlaGFzaCA/IGFieXRlcyhoYXNoKG1lc3NhZ2UpLCB1bmRlZmluZWQsICdwcmVoYXNoZWQgbWVzc2FnZScpIDogbWVzc2FnZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogU3RlcHMgQSwgRCBvZiBSRkM2OTc5IDMuMi5cbiAgICAgKiBDcmVhdGVzIFJGQzY5Nzkgc2VlZDsgY29udmVydHMgbXNnL3ByaXZLZXkgdG8gbnVtYmVycy5cbiAgICAgKiBVc2VkIG9ubHkgaW4gc2lnbiwgbm90IGluIHZlcmlmeS5cbiAgICAgKlxuICAgICAqIFdhcm5pbmc6IHdlIGNhbm5vdCBhc3N1bWUgaGVyZSB0aGF0IG1lc3NhZ2UgaGFzIHNhbWUgYW1vdW50IG9mIGJ5dGVzIGFzIGN1cnZlIG9yZGVyLFxuICAgICAqIHRoaXMgd2lsbCBiZSBpbnZhbGlkIGF0IGxlYXN0IGZvciBQNTIxLiBBbHNvIGl0IGNhbiBiZSBiaWdnZXIgZm9yIFAyMjQgKyBTSEEyNTYuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJlcFNpZyhtZXNzYWdlLCBwcml2YXRlS2V5LCBvcHRzKSB7XG4gICAgICAgIGlmIChbJ3JlY292ZXJlZCcsICdjYW5vbmljYWwnXS5zb21lKChrKSA9PiBrIGluIG9wdHMpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduKCkgbGVnYWN5IG9wdGlvbnMgbm90IHN1cHBvcnRlZCcpO1xuICAgICAgICBjb25zdCB7IGxvd1MsIHByZWhhc2gsIGV4dHJhRW50cm9weSB9ID0gdmFsaWRhdGVTaWdPcHRzKG9wdHMsIGRlZmF1bHRTaWdPcHRzKTtcbiAgICAgICAgbWVzc2FnZSA9IHZhbGlkYXRlTXNnQW5kSGFzaChtZXNzYWdlLCBwcmVoYXNoKTsgLy8gUkZDNjk3OSAzLjIgQTogaDEgPSBIKG0pXG4gICAgICAgIC8vIFdlIGNhbid0IGxhdGVyIGNhbGwgYml0czJvY3RldHMsIHNpbmNlIG5lc3RlZCBiaXRzMmludCBpcyBicm9rZW4gZm9yIGN1cnZlc1xuICAgICAgICAvLyB3aXRoIGZuQml0cyAlIDggIT09IDAuIEJlY2F1c2Ugb2YgdGhhdCwgd2UgdW53cmFwIGl0IGhlcmUgYXMgaW50Mm9jdGV0cyBjYWxsLlxuICAgICAgICAvLyBjb25zdCBiaXRzMm9jdGV0cyA9IChiaXRzKSA9PiBpbnQyb2N0ZXRzKGJpdHMyaW50X21vZE4oYml0cykpXG4gICAgICAgIGNvbnN0IGgxaW50ID0gYml0czJpbnRfbW9kTihtZXNzYWdlKTtcbiAgICAgICAgY29uc3QgZCA9IF9ub3JtRm5FbGVtZW50KEZuLCBwcml2YXRlS2V5KTsgLy8gdmFsaWRhdGUgc2VjcmV0IGtleSwgY29udmVydCB0byBiaWdpbnRcbiAgICAgICAgY29uc3Qgc2VlZEFyZ3MgPSBbaW50Mm9jdGV0cyhkKSwgaW50Mm9jdGV0cyhoMWludCldO1xuICAgICAgICAvLyBleHRyYUVudHJvcHkuIFJGQzY5NzkgMy42OiBhZGRpdGlvbmFsIGsnIChvcHRpb25hbCkuXG4gICAgICAgIGlmIChleHRyYUVudHJvcHkgIT0gbnVsbCAmJiBleHRyYUVudHJvcHkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvLyBLID0gSE1BQ19LKFYgfHwgMHgwMCB8fCBpbnQyb2N0ZXRzKHgpIHx8IGJpdHMyb2N0ZXRzKGgxKSB8fCBrJylcbiAgICAgICAgICAgIC8vIGdlbiByYW5kb20gYnl0ZXMgT1IgcGFzcyBhcy1pc1xuICAgICAgICAgICAgY29uc3QgZSA9IGV4dHJhRW50cm9weSA9PT0gdHJ1ZSA/IHJhbmRvbUJ5dGVzKGxlbmd0aHMuc2VjcmV0S2V5KSA6IGV4dHJhRW50cm9weTtcbiAgICAgICAgICAgIHNlZWRBcmdzLnB1c2goZW5zdXJlQnl0ZXMoJ2V4dHJhRW50cm9weScsIGUpKTsgLy8gY2hlY2sgZm9yIGJlaW5nIGJ5dGVzXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VlZCA9IGNvbmNhdEJ5dGVzKC4uLnNlZWRBcmdzKTsgLy8gU3RlcCBEIG9mIFJGQzY5NzkgMy4yXG4gICAgICAgIGNvbnN0IG0gPSBoMWludDsgLy8gTk9URTogbm8gbmVlZCB0byBjYWxsIGJpdHMyaW50IHNlY29uZCB0aW1lIGhlcmUsIGl0IGlzIGluc2lkZSB0cnVuY2F0ZUhhc2ghXG4gICAgICAgIC8vIENvbnZlcnRzIHNpZ25hdHVyZSBwYXJhbXMgaW50byBwb2ludCB3IHIvcywgY2hlY2tzIHJlc3VsdCBmb3IgdmFsaWRpdHkuXG4gICAgICAgIC8vIFRvIHRyYW5zZm9ybSBrID0+IFNpZ25hdHVyZTpcbiAgICAgICAgLy8gcSA9IGvii4VHXG4gICAgICAgIC8vIHIgPSBxLnggbW9kIG5cbiAgICAgICAgLy8gcyA9IGteLTEobSArIHJkKSBtb2QgblxuICAgICAgICAvLyBDYW4gdXNlIHNjYWxhciBibGluZGluZyBiXi0xKGJtICsgYmRyKSB3aGVyZSBiIOKIiCBbMSxx4oiSMV0gYWNjb3JkaW5nIHRvXG4gICAgICAgIC8vIGh0dHBzOi8vdGNoZXMuaWFjci5vcmcvaW5kZXgucGhwL1RDSEVTL2FydGljbGUvdmlldy83MzM3LzY1MDkuIFdlJ3ZlIGRlY2lkZWQgYWdhaW5zdCBpdDpcbiAgICAgICAgLy8gYSkgZGVwZW5kZW5jeSBvbiBDU1BSTkcgYikgMTUlIHNsb3dkb3duIGMpIGRvZXNuJ3QgcmVhbGx5IGhlbHAgc2luY2UgYmlnaW50cyBhcmUgbm90IENUXG4gICAgICAgIGZ1bmN0aW9uIGsyc2lnKGtCeXRlcykge1xuICAgICAgICAgICAgLy8gUkZDIDY5NzkgU2VjdGlvbiAzLjIsIHN0ZXAgMzogayA9IGJpdHMyaW50KFQpXG4gICAgICAgICAgICAvLyBJbXBvcnRhbnQ6IGFsbCBtb2QoKSBjYWxscyBoZXJlIG11c3QgYmUgZG9uZSBvdmVyIE5cbiAgICAgICAgICAgIGNvbnN0IGsgPSBiaXRzMmludChrQnl0ZXMpOyAvLyBtb2Qgbiwgbm90IG1vZCBwXG4gICAgICAgICAgICBpZiAoIUZuLmlzVmFsaWROb3QwKGspKVxuICAgICAgICAgICAgICAgIHJldHVybjsgLy8gVmFsaWQgc2NhbGFycyAoaW5jbHVkaW5nIGspIG11c3QgYmUgaW4gMS4uTi0xXG4gICAgICAgICAgICBjb25zdCBpayA9IEZuLmludihrKTsgLy8ga14tMSBtb2QgblxuICAgICAgICAgICAgY29uc3QgcSA9IFBvaW50LkJBU0UubXVsdGlwbHkoaykudG9BZmZpbmUoKTsgLy8gcSA9IGvii4VHXG4gICAgICAgICAgICBjb25zdCByID0gRm4uY3JlYXRlKHEueCk7IC8vIHIgPSBxLnggbW9kIG5cbiAgICAgICAgICAgIGlmIChyID09PSBfMG4pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgY29uc3QgcyA9IEZuLmNyZWF0ZShpayAqIEZuLmNyZWF0ZShtICsgciAqIGQpKTsgLy8gTm90IHVzaW5nIGJsaW5kaW5nIGhlcmUsIHNlZSBjb21tZW50IGFib3ZlXG4gICAgICAgICAgICBpZiAocyA9PT0gXzBuKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGxldCByZWNvdmVyeSA9IChxLnggPT09IHIgPyAwIDogMikgfCBOdW1iZXIocS55ICYgXzFuKTsgLy8gcmVjb3ZlcnkgYml0ICgyIG9yIDMsIHdoZW4gcS54ID4gbilcbiAgICAgICAgICAgIGxldCBub3JtUyA9IHM7XG4gICAgICAgICAgICBpZiAobG93UyAmJiBpc0JpZ2dlclRoYW5IYWxmT3JkZXIocykpIHtcbiAgICAgICAgICAgICAgICBub3JtUyA9IEZuLm5lZyhzKTsgLy8gaWYgbG93UyB3YXMgcGFzc2VkLCBlbnN1cmUgcyBpcyBhbHdheXNcbiAgICAgICAgICAgICAgICByZWNvdmVyeSBePSAxOyAvLyAvLyBpbiB0aGUgYm90dG9tIGhhbGYgb2YgTlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBTaWduYXR1cmUociwgbm9ybVMsIHJlY292ZXJ5KTsgLy8gdXNlIG5vcm1TLCBub3Qgc1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHNlZWQsIGsyc2lnIH07XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFNpZ25zIG1lc3NhZ2UgaGFzaCB3aXRoIGEgc2VjcmV0IGtleS5cbiAgICAgKlxuICAgICAqIGBgYFxuICAgICAqIHNpZ24obSwgZCkgd2hlcmVcbiAgICAgKiAgIGsgPSByZmM2OTc5X2htYWNfZHJiZyhtLCBkKVxuICAgICAqICAgKHgsIHkpID0gRyDDlyBrXG4gICAgICogICByID0geCBtb2QgblxuICAgICAqICAgcyA9IChtICsgZHIpIC8gayBtb2QgblxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNpZ24obWVzc2FnZSwgc2VjcmV0S2V5LCBvcHRzID0ge30pIHtcbiAgICAgICAgbWVzc2FnZSA9IGVuc3VyZUJ5dGVzKCdtZXNzYWdlJywgbWVzc2FnZSk7XG4gICAgICAgIGNvbnN0IHsgc2VlZCwgazJzaWcgfSA9IHByZXBTaWcobWVzc2FnZSwgc2VjcmV0S2V5LCBvcHRzKTsgLy8gU3RlcHMgQSwgRCBvZiBSRkM2OTc5IDMuMi5cbiAgICAgICAgY29uc3QgZHJiZyA9IGNyZWF0ZUhtYWNEcmJnKGhhc2gub3V0cHV0TGVuLCBGbi5CWVRFUywgaG1hYyk7XG4gICAgICAgIGNvbnN0IHNpZyA9IGRyYmcoc2VlZCwgazJzaWcpOyAvLyBTdGVwcyBCLCBDLCBELCBFLCBGLCBHXG4gICAgICAgIHJldHVybiBzaWc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyeVBhcnNpbmdTaWcoc2cpIHtcbiAgICAgICAgLy8gVHJ5IHRvIGRlZHVjZSBmb3JtYXRcbiAgICAgICAgbGV0IHNpZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgaXNIZXggPSB0eXBlb2Ygc2cgPT09ICdzdHJpbmcnIHx8IGlzQnl0ZXMoc2cpO1xuICAgICAgICBjb25zdCBpc09iaiA9ICFpc0hleCAmJlxuICAgICAgICAgICAgc2cgIT09IG51bGwgJiZcbiAgICAgICAgICAgIHR5cGVvZiBzZyA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiBzZy5yID09PSAnYmlnaW50JyAmJlxuICAgICAgICAgICAgdHlwZW9mIHNnLnMgPT09ICdiaWdpbnQnO1xuICAgICAgICBpZiAoIWlzSGV4ICYmICFpc09iailcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBzaWduYXR1cmUsIGV4cGVjdGVkIFVpbnQ4QXJyYXksIGhleCBzdHJpbmcgb3IgU2lnbmF0dXJlIGluc3RhbmNlJyk7XG4gICAgICAgIGlmIChpc09iaikge1xuICAgICAgICAgICAgc2lnID0gbmV3IFNpZ25hdHVyZShzZy5yLCBzZy5zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0hleCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzaWcgPSBTaWduYXR1cmUuZnJvbUJ5dGVzKGVuc3VyZUJ5dGVzKCdzaWcnLCBzZyksICdkZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChkZXJFcnJvcikge1xuICAgICAgICAgICAgICAgIGlmICghKGRlckVycm9yIGluc3RhbmNlb2YgREVSLkVycikpXG4gICAgICAgICAgICAgICAgICAgIHRocm93IGRlckVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFzaWcpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBzaWcgPSBTaWduYXR1cmUuZnJvbUJ5dGVzKGVuc3VyZUJ5dGVzKCdzaWcnLCBzZyksICdjb21wYWN0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghc2lnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gc2lnO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBWZXJpZmllcyBhIHNpZ25hdHVyZSBhZ2FpbnN0IG1lc3NhZ2UgYW5kIHB1YmxpYyBrZXkuXG4gICAgICogUmVqZWN0cyBsb3dTIHNpZ25hdHVyZXMgYnkgZGVmYXVsdDogc2VlIHtAbGluayBFQ0RTQVZlcmlmeU9wdHN9LlxuICAgICAqIEltcGxlbWVudHMgc2VjdGlvbiA0LjEuNCBmcm9tIGh0dHBzOi8vd3d3LnNlY2cub3JnL3NlYzEtdjIucGRmOlxuICAgICAqXG4gICAgICogYGBgXG4gICAgICogdmVyaWZ5KHIsIHMsIGgsIFApIHdoZXJlXG4gICAgICogICB1MSA9IGhzXi0xIG1vZCBuXG4gICAgICogICB1MiA9IHJzXi0xIG1vZCBuXG4gICAgICogICBSID0gdTHii4VHICsgdTLii4VQXG4gICAgICogICBtb2QoUi54LCBuKSA9PSByXG4gICAgICogYGBgXG4gICAgICovXG4gICAgZnVuY3Rpb24gdmVyaWZ5KHNpZ25hdHVyZSwgbWVzc2FnZSwgcHVibGljS2V5LCBvcHRzID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBsb3dTLCBwcmVoYXNoLCBmb3JtYXQgfSA9IHZhbGlkYXRlU2lnT3B0cyhvcHRzLCBkZWZhdWx0U2lnT3B0cyk7XG4gICAgICAgIHB1YmxpY0tleSA9IGVuc3VyZUJ5dGVzKCdwdWJsaWNLZXknLCBwdWJsaWNLZXkpO1xuICAgICAgICBtZXNzYWdlID0gdmFsaWRhdGVNc2dBbmRIYXNoKGVuc3VyZUJ5dGVzKCdtZXNzYWdlJywgbWVzc2FnZSksIHByZWhhc2gpO1xuICAgICAgICBpZiAoJ3N0cmljdCcgaW4gb3B0cylcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucy5zdHJpY3Qgd2FzIHJlbmFtZWQgdG8gbG93UycpO1xuICAgICAgICBjb25zdCBzaWcgPSBmb3JtYXQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB0cnlQYXJzaW5nU2lnKHNpZ25hdHVyZSlcbiAgICAgICAgICAgIDogU2lnbmF0dXJlLmZyb21CeXRlcyhlbnN1cmVCeXRlcygnc2lnJywgc2lnbmF0dXJlKSwgZm9ybWF0KTtcbiAgICAgICAgaWYgKHNpZyA9PT0gZmFsc2UpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBQID0gUG9pbnQuZnJvbUJ5dGVzKHB1YmxpY0tleSk7XG4gICAgICAgICAgICBpZiAobG93UyAmJiBzaWcuaGFzSGlnaFMoKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCB7IHIsIHMgfSA9IHNpZztcbiAgICAgICAgICAgIGNvbnN0IGggPSBiaXRzMmludF9tb2ROKG1lc3NhZ2UpOyAvLyBtb2Qgbiwgbm90IG1vZCBwXG4gICAgICAgICAgICBjb25zdCBpcyA9IEZuLmludihzKTsgLy8gc14tMSBtb2QgblxuICAgICAgICAgICAgY29uc3QgdTEgPSBGbi5jcmVhdGUoaCAqIGlzKTsgLy8gdTEgPSBoc14tMSBtb2QgblxuICAgICAgICAgICAgY29uc3QgdTIgPSBGbi5jcmVhdGUociAqIGlzKTsgLy8gdTIgPSByc14tMSBtb2QgblxuICAgICAgICAgICAgY29uc3QgUiA9IFBvaW50LkJBU0UubXVsdGlwbHlVbnNhZmUodTEpLmFkZChQLm11bHRpcGx5VW5zYWZlKHUyKSk7IC8vIHUx4ouFRyArIHUy4ouFUFxuICAgICAgICAgICAgaWYgKFIuaXMwKCkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgdiA9IEZuLmNyZWF0ZShSLngpOyAvLyB2ID0gci54IG1vZCBuXG4gICAgICAgICAgICByZXR1cm4gdiA9PT0gcjtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlY292ZXJQdWJsaWNLZXkoc2lnbmF0dXJlLCBtZXNzYWdlLCBvcHRzID0ge30pIHtcbiAgICAgICAgY29uc3QgeyBwcmVoYXNoIH0gPSB2YWxpZGF0ZVNpZ09wdHMob3B0cywgZGVmYXVsdFNpZ09wdHMpO1xuICAgICAgICBtZXNzYWdlID0gdmFsaWRhdGVNc2dBbmRIYXNoKG1lc3NhZ2UsIHByZWhhc2gpO1xuICAgICAgICByZXR1cm4gU2lnbmF0dXJlLmZyb21CeXRlcyhzaWduYXR1cmUsICdyZWNvdmVyZWQnKS5yZWNvdmVyUHVibGljS2V5KG1lc3NhZ2UpLnRvQnl0ZXMoKTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgICAgICBrZXlnZW4sXG4gICAgICAgIGdldFB1YmxpY0tleSxcbiAgICAgICAgZ2V0U2hhcmVkU2VjcmV0LFxuICAgICAgICB1dGlscyxcbiAgICAgICAgbGVuZ3RocyxcbiAgICAgICAgUG9pbnQsXG4gICAgICAgIHNpZ24sXG4gICAgICAgIHZlcmlmeSxcbiAgICAgICAgcmVjb3ZlclB1YmxpY0tleSxcbiAgICAgICAgU2lnbmF0dXJlLFxuICAgICAgICBoYXNoLFxuICAgIH0pO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgd2VpZXJzdHJhc3NgIGluIG5ld2VyIHJlbGVhc2VzICovXG5leHBvcnQgZnVuY3Rpb24gd2VpZXJzdHJhc3NQb2ludHMoYykge1xuICAgIGNvbnN0IHsgQ1VSVkUsIGN1cnZlT3B0cyB9ID0gX3dlaWVyc3RyYXNzX2xlZ2FjeV9vcHRzX3RvX25ldyhjKTtcbiAgICBjb25zdCBQb2ludCA9IHdlaWVyc3RyYXNzTihDVVJWRSwgY3VydmVPcHRzKTtcbiAgICByZXR1cm4gX3dlaWVyc3RyYXNzX25ld19vdXRwdXRfdG9fbGVnYWN5KGMsIFBvaW50KTtcbn1cbmZ1bmN0aW9uIF93ZWllcnN0cmFzc19sZWdhY3lfb3B0c190b19uZXcoYykge1xuICAgIGNvbnN0IENVUlZFID0ge1xuICAgICAgICBhOiBjLmEsXG4gICAgICAgIGI6IGMuYixcbiAgICAgICAgcDogYy5GcC5PUkRFUixcbiAgICAgICAgbjogYy5uLFxuICAgICAgICBoOiBjLmgsXG4gICAgICAgIEd4OiBjLkd4LFxuICAgICAgICBHeTogYy5HeSxcbiAgICB9O1xuICAgIGNvbnN0IEZwID0gYy5GcDtcbiAgICBsZXQgYWxsb3dlZExlbmd0aHMgPSBjLmFsbG93ZWRQcml2YXRlS2V5TGVuZ3Roc1xuICAgICAgICA/IEFycmF5LmZyb20obmV3IFNldChjLmFsbG93ZWRQcml2YXRlS2V5TGVuZ3Rocy5tYXAoKGwpID0+IE1hdGguY2VpbChsIC8gMikpKSlcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgRm4gPSBGaWVsZChDVVJWRS5uLCB7XG4gICAgICAgIEJJVFM6IGMubkJpdExlbmd0aCxcbiAgICAgICAgYWxsb3dlZExlbmd0aHM6IGFsbG93ZWRMZW5ndGhzLFxuICAgICAgICBtb2RGcm9tQnl0ZXM6IGMud3JhcFByaXZhdGVLZXksXG4gICAgfSk7XG4gICAgY29uc3QgY3VydmVPcHRzID0ge1xuICAgICAgICBGcCxcbiAgICAgICAgRm4sXG4gICAgICAgIGFsbG93SW5maW5pdHlQb2ludDogYy5hbGxvd0luZmluaXR5UG9pbnQsXG4gICAgICAgIGVuZG86IGMuZW5kbyxcbiAgICAgICAgaXNUb3JzaW9uRnJlZTogYy5pc1RvcnNpb25GcmVlLFxuICAgICAgICBjbGVhckNvZmFjdG9yOiBjLmNsZWFyQ29mYWN0b3IsXG4gICAgICAgIGZyb21CeXRlczogYy5mcm9tQnl0ZXMsXG4gICAgICAgIHRvQnl0ZXM6IGMudG9CeXRlcyxcbiAgICB9O1xuICAgIHJldHVybiB7IENVUlZFLCBjdXJ2ZU9wdHMgfTtcbn1cbmZ1bmN0aW9uIF9lY2RzYV9sZWdhY3lfb3B0c190b19uZXcoYykge1xuICAgIGNvbnN0IHsgQ1VSVkUsIGN1cnZlT3B0cyB9ID0gX3dlaWVyc3RyYXNzX2xlZ2FjeV9vcHRzX3RvX25ldyhjKTtcbiAgICBjb25zdCBlY2RzYU9wdHMgPSB7XG4gICAgICAgIGhtYWM6IGMuaG1hYyxcbiAgICAgICAgcmFuZG9tQnl0ZXM6IGMucmFuZG9tQnl0ZXMsXG4gICAgICAgIGxvd1M6IGMubG93UyxcbiAgICAgICAgYml0czJpbnQ6IGMuYml0czJpbnQsXG4gICAgICAgIGJpdHMyaW50X21vZE46IGMuYml0czJpbnRfbW9kTixcbiAgICB9O1xuICAgIHJldHVybiB7IENVUlZFLCBjdXJ2ZU9wdHMsIGhhc2g6IGMuaGFzaCwgZWNkc2FPcHRzIH07XG59XG5leHBvcnQgZnVuY3Rpb24gX2xlZ2FjeUhlbHBlckVxdWF0KEZwLCBhLCBiKSB7XG4gICAgLyoqXG4gICAgICogecKyID0geMKzICsgYXggKyBiOiBTaG9ydCB3ZWllcnN0cmFzcyBjdXJ2ZSBmb3JtdWxhLiBUYWtlcyB4LCByZXR1cm5zIHnCsi5cbiAgICAgKiBAcmV0dXJucyB5wrJcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB3ZWllcnN0cmFzc0VxdWF0aW9uKHgpIHtcbiAgICAgICAgY29uc3QgeDIgPSBGcC5zcXIoeCk7IC8vIHggKiB4XG4gICAgICAgIGNvbnN0IHgzID0gRnAubXVsKHgyLCB4KTsgLy8geMKyICogeFxuICAgICAgICByZXR1cm4gRnAuYWRkKEZwLmFkZCh4MywgRnAubXVsKHgsIGEpKSwgYik7IC8vIHjCsyArIGEgKiB4ICsgYlxuICAgIH1cbiAgICByZXR1cm4gd2VpZXJzdHJhc3NFcXVhdGlvbjtcbn1cbmZ1bmN0aW9uIF93ZWllcnN0cmFzc19uZXdfb3V0cHV0X3RvX2xlZ2FjeShjLCBQb2ludCkge1xuICAgIGNvbnN0IHsgRnAsIEZuIH0gPSBQb2ludDtcbiAgICBmdW5jdGlvbiBpc1dpdGhpbkN1cnZlT3JkZXIobnVtKSB7XG4gICAgICAgIHJldHVybiBpblJhbmdlKG51bSwgXzFuLCBGbi5PUkRFUik7XG4gICAgfVxuICAgIGNvbnN0IHdlaWVyc3RyYXNzRXF1YXRpb24gPSBfbGVnYWN5SGVscGVyRXF1YXQoRnAsIGMuYSwgYy5iKTtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwge1xuICAgICAgICBDVVJWRTogYyxcbiAgICAgICAgUG9pbnQ6IFBvaW50LFxuICAgICAgICBQcm9qZWN0aXZlUG9pbnQ6IFBvaW50LFxuICAgICAgICBub3JtUHJpdmF0ZUtleVRvU2NhbGFyOiAoa2V5KSA9PiBfbm9ybUZuRWxlbWVudChGbiwga2V5KSxcbiAgICAgICAgd2VpZXJzdHJhc3NFcXVhdGlvbixcbiAgICAgICAgaXNXaXRoaW5DdXJ2ZU9yZGVyLFxuICAgIH0pO1xufVxuZnVuY3Rpb24gX2VjZHNhX25ld19vdXRwdXRfdG9fbGVnYWN5KGMsIF9lY2RzYSkge1xuICAgIGNvbnN0IFBvaW50ID0gX2VjZHNhLlBvaW50O1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBfZWNkc2EsIHtcbiAgICAgICAgUHJvamVjdGl2ZVBvaW50OiBQb2ludCxcbiAgICAgICAgQ1VSVkU6IE9iamVjdC5hc3NpZ24oe30sIGMsIG5MZW5ndGgoUG9pbnQuRm4uT1JERVIsIFBvaW50LkZuLkJJVFMpKSxcbiAgICB9KTtcbn1cbi8vIF9lY2RzYV9sZWdhY3lcbmV4cG9ydCBmdW5jdGlvbiB3ZWllcnN0cmFzcyhjKSB7XG4gICAgY29uc3QgeyBDVVJWRSwgY3VydmVPcHRzLCBoYXNoLCBlY2RzYU9wdHMgfSA9IF9lY2RzYV9sZWdhY3lfb3B0c190b19uZXcoYyk7XG4gICAgY29uc3QgUG9pbnQgPSB3ZWllcnN0cmFzc04oQ1VSVkUsIGN1cnZlT3B0cyk7XG4gICAgY29uc3Qgc2lnbnMgPSBlY2RzYShQb2ludCwgaGFzaCwgZWNkc2FPcHRzKTtcbiAgICByZXR1cm4gX2VjZHNhX25ld19vdXRwdXRfdG9fbGVnYWN5KGMsIHNpZ25zKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXdlaWVyc3RyYXNzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/weierstrass.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/ed25519.js":
/*!***************************************************!*\
  !*** ./node_modules/@noble/curves/esm/ed25519.js ***!
  \***************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   ED25519_TORSION_SUBGROUP: () => (/* binding */ ED25519_TORSION_SUBGROUP),\n/* harmony export */   RistrettoPoint: () => (/* binding */ RistrettoPoint),\n/* harmony export */   ed25519: () => (/* binding */ ed25519),\n/* harmony export */   ed25519_hasher: () => (/* binding */ ed25519_hasher),\n/* harmony export */   ed25519ctx: () => (/* binding */ ed25519ctx),\n/* harmony export */   ed25519ph: () => (/* binding */ ed25519ph),\n/* harmony export */   edwardsToMontgomery: () => (/* binding */ edwardsToMontgomery),\n/* harmony export */   edwardsToMontgomeryPriv: () => (/* binding */ edwardsToMontgomeryPriv),\n/* harmony export */   edwardsToMontgomeryPub: () => (/* binding */ edwardsToMontgomeryPub),\n/* harmony export */   encodeToCurve: () => (/* binding */ encodeToCurve),\n/* harmony export */   hashToCurve: () => (/* binding */ hashToCurve),\n/* harmony export */   hashToRistretto255: () => (/* binding */ hashToRistretto255),\n/* harmony export */   hash_to_ristretto255: () => (/* binding */ hash_to_ristretto255),\n/* harmony export */   ristretto255: () => (/* binding */ ristretto255),\n/* harmony export */   ristretto255_hasher: () => (/* binding */ ristretto255_hasher),\n/* harmony export */   x25519: () => (/* binding */ x25519)\n/* harmony export */ });\n/* harmony import */ var _noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @noble/hashes/sha2.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/sha2.js\");\n/* harmony import */ var _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @noble/hashes/utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/* harmony import */ var _abstract_curve_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./abstract/curve.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/curve.js\");\n/* harmony import */ var _abstract_edwards_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./abstract/edwards.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/edwards.js\");\n/* harmony import */ var _abstract_hash_to_curve_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./abstract/hash-to-curve.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/hash-to-curve.js\");\n/* harmony import */ var _abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./abstract/modular.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/modular.js\");\n/* harmony import */ var _abstract_montgomery_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./abstract/montgomery.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/montgomery.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./utils.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js\");\n/**\n * ed25519 Twisted Edwards curve with following addons:\n * - X25519 ECDH\n * - Ristretto cofactor elimination\n * - Elligator hash-to-group / point indistinguishability\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n\n\n\n\n\n\n\n// prettier-ignore\nconst _0n = /* @__PURE__ */ BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3);\n// prettier-ignore\nconst _5n = BigInt(5), _8n = BigInt(8);\n// P = 2n**255n-19n\nconst ed25519_CURVE_p = BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffed');\n// N = 2n**252n + 27742317777372353535851937790883648493n\n// a = Fp.create(BigInt(-1))\n// d = -121665/121666 a.k.a. Fp.neg(121665 * Fp.inv(121666))\nconst ed25519_CURVE = /* @__PURE__ */ (() => ({\n    p: ed25519_CURVE_p,\n    n: BigInt('0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed'),\n    h: _8n,\n    a: BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec'),\n    d: BigInt('0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3'),\n    Gx: BigInt('0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51a'),\n    Gy: BigInt('0x6666666666666666666666666666666666666666666666666666666666666658'),\n}))();\nfunction ed25519_pow_2_252_3(x) {\n    // prettier-ignore\n    const _10n = BigInt(10), _20n = BigInt(20), _40n = BigInt(40), _80n = BigInt(80);\n    const P = ed25519_CURVE_p;\n    const x2 = (x * x) % P;\n    const b2 = (x2 * x) % P; // x^3, 11\n    const b4 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b2, _2n, P) * b2) % P; // x^15, 1111\n    const b5 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b4, _1n, P) * x) % P; // x^31\n    const b10 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b5, _5n, P) * b5) % P;\n    const b20 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b10, _10n, P) * b10) % P;\n    const b40 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b20, _20n, P) * b20) % P;\n    const b80 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b40, _40n, P) * b40) % P;\n    const b160 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b80, _80n, P) * b80) % P;\n    const b240 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b160, _80n, P) * b80) % P;\n    const b250 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b240, _10n, P) * b10) % P;\n    const pow_p_5_8 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b250, _2n, P) * x) % P;\n    // ^ To pow to (p+3)/8, multiply it by x.\n    return { pow_p_5_8, b2 };\n}\nfunction adjustScalarBytes(bytes) {\n    // Section 5: For X25519, in order to decode 32 random bytes as an integer scalar,\n    // set the three least significant bits of the first byte\n    bytes[0] &= 248; // 0b1111_1000\n    // and the most significant bit of the last to zero,\n    bytes[31] &= 127; // 0b0111_1111\n    // set the second most significant bit of the last byte to 1\n    bytes[31] |= 64; // 0b0100_0000\n    return bytes;\n}\n// √(-1) aka √(a) aka 2^((p-1)/4)\n// Fp.sqrt(Fp.neg(1))\nconst ED25519_SQRT_M1 = /* @__PURE__ */ BigInt('19681161376707505956807079304988542015446066515923890162744021073123829784752');\n// sqrt(u/v)\nfunction uvRatio(u, v) {\n    const P = ed25519_CURVE_p;\n    const v3 = (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mod)(v * v * v, P); // v³\n    const v7 = (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mod)(v3 * v3 * v, P); // v⁷\n    // (p+3)/8 and (p-5)/8\n    const pow = ed25519_pow_2_252_3(u * v7).pow_p_5_8;\n    let x = (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mod)(u * v3 * pow, P); // (uv³)(uv⁷)^(p-5)/8\n    const vx2 = (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mod)(v * x * x, P); // vx²\n    const root1 = x; // First root candidate\n    const root2 = (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mod)(x * ED25519_SQRT_M1, P); // Second root candidate\n    const useRoot1 = vx2 === u; // If vx² = u (mod p), x is a square root\n    const useRoot2 = vx2 === (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mod)(-u, P); // If vx² = -u, set x <-- x * 2^((p-1)/4)\n    const noRoot = vx2 === (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mod)(-u * ED25519_SQRT_M1, P); // There is no valid root, vx² = -u√(-1)\n    if (useRoot1)\n        x = root1;\n    if (useRoot2 || noRoot)\n        x = root2; // We return root2 anyway, for const-time\n    if ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.isNegativeLE)(x, P))\n        x = (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mod)(-x, P);\n    return { isValid: useRoot1 || useRoot2, value: x };\n}\nconst Fp = /* @__PURE__ */ (() => (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.Field)(ed25519_CURVE.p, { isLE: true }))();\nconst Fn = /* @__PURE__ */ (() => (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.Field)(ed25519_CURVE.n, { isLE: true }))();\nconst ed25519Defaults = /* @__PURE__ */ (() => ({\n    ...ed25519_CURVE,\n    Fp,\n    hash: _noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_1__.sha512,\n    adjustScalarBytes,\n    // dom2\n    // Ratio of u to v. Allows us to combine inversion and square root. Uses algo from RFC8032 5.1.3.\n    // Constant-time, u/√v\n    uvRatio,\n}))();\n/**\n * ed25519 curve with EdDSA signatures.\n * @example\n * import { ed25519 } from '@noble/curves/ed25519';\n * const { secretKey, publicKey } = ed25519.keygen();\n * const msg = new TextEncoder().encode('hello');\n * const sig = ed25519.sign(msg, priv);\n * ed25519.verify(sig, msg, pub); // Default mode: follows ZIP215\n * ed25519.verify(sig, msg, pub, { zip215: false }); // RFC8032 / FIPS 186-5\n */\nconst ed25519 = /* @__PURE__ */ (() => (0,_abstract_edwards_js__WEBPACK_IMPORTED_MODULE_2__.twistedEdwards)(ed25519Defaults))();\nfunction ed25519_domain(data, ctx, phflag) {\n    if (ctx.length > 255)\n        throw new Error('Context is too big');\n    return (0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_3__.concatBytes)((0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_3__.utf8ToBytes)('SigEd25519 no Ed25519 collisions'), new Uint8Array([phflag ? 1 : 0, ctx.length]), ctx, data);\n}\n/** Context of ed25519. Uses context for domain separation. */\nconst ed25519ctx = /* @__PURE__ */ (() => (0,_abstract_edwards_js__WEBPACK_IMPORTED_MODULE_2__.twistedEdwards)({\n    ...ed25519Defaults,\n    domain: ed25519_domain,\n}))();\n/** Prehashed version of ed25519. Accepts already-hashed messages in sign() and verify(). */\nconst ed25519ph = /* @__PURE__ */ (() => (0,_abstract_edwards_js__WEBPACK_IMPORTED_MODULE_2__.twistedEdwards)(Object.assign({}, ed25519Defaults, {\n    domain: ed25519_domain,\n    prehash: _noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_1__.sha512,\n})))();\n/**\n * ECDH using curve25519 aka x25519.\n * @example\n * import { x25519 } from '@noble/curves/ed25519';\n * const priv = 'a546e36bf0527c9d3b16154b82465edd62144c0ac1fc5a18506a2244ba449ac4';\n * const pub = 'e6db6867583030db3594c1a424b15f7c726624ec26b3353b10a903a6d0ab1c4c';\n * x25519.getSharedSecret(priv, pub) === x25519.scalarMult(priv, pub); // aliases\n * x25519.getPublicKey(priv) === x25519.scalarMultBase(priv);\n * x25519.getPublicKey(x25519.utils.randomSecretKey());\n */\nconst x25519 = /* @__PURE__ */ (() => {\n    const P = Fp.ORDER;\n    return (0,_abstract_montgomery_js__WEBPACK_IMPORTED_MODULE_4__.montgomery)({\n        P,\n        type: 'x25519',\n        powPminus2: (x) => {\n            // x^(p-2) aka x^(2^255-21)\n            const { pow_p_5_8, b2 } = ed25519_pow_2_252_3(x);\n            return (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mod)((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(pow_p_5_8, _3n, P) * b2, P);\n        },\n        adjustScalarBytes,\n    });\n})();\n// Hash To Curve Elligator2 Map (NOTE: different from ristretto255 elligator)\n// NOTE: very important part is usage of FpSqrtEven for ELL2_C1_EDWARDS, since\n// SageMath returns different root first and everything falls apart\nconst ELL2_C1 = /* @__PURE__ */ (() => (ed25519_CURVE_p + _3n) / _8n)(); // 1. c1 = (q + 3) / 8       # Integer arithmetic\nconst ELL2_C2 = /* @__PURE__ */ (() => Fp.pow(_2n, ELL2_C1))(); // 2. c2 = 2^c1\nconst ELL2_C3 = /* @__PURE__ */ (() => Fp.sqrt(Fp.neg(Fp.ONE)))(); // 3. c3 = sqrt(-1)\n// prettier-ignore\nfunction map_to_curve_elligator2_curve25519(u) {\n    const ELL2_C4 = (ed25519_CURVE_p - _5n) / _8n; // 4. c4 = (q - 5) / 8       # Integer arithmetic\n    const ELL2_J = BigInt(486662);\n    let tv1 = Fp.sqr(u); //  1.  tv1 = u^2\n    tv1 = Fp.mul(tv1, _2n); //  2.  tv1 = 2 * tv1\n    let xd = Fp.add(tv1, Fp.ONE); //  3.   xd = tv1 + 1         # Nonzero: -1 is square (mod p), tv1 is not\n    let x1n = Fp.neg(ELL2_J); //  4.  x1n = -J              # x1 = x1n / xd = -J / (1 + 2 * u^2)\n    let tv2 = Fp.sqr(xd); //  5.  tv2 = xd^2\n    let gxd = Fp.mul(tv2, xd); //  6.  gxd = tv2 * xd        # gxd = xd^3\n    let gx1 = Fp.mul(tv1, ELL2_J); //  7.  gx1 = J * tv1         # x1n + J * xd\n    gx1 = Fp.mul(gx1, x1n); //  8.  gx1 = gx1 * x1n       # x1n^2 + J * x1n * xd\n    gx1 = Fp.add(gx1, tv2); //  9.  gx1 = gx1 + tv2       # x1n^2 + J * x1n * xd + xd^2\n    gx1 = Fp.mul(gx1, x1n); //  10. gx1 = gx1 * x1n       # x1n^3 + J * x1n^2 * xd + x1n * xd^2\n    let tv3 = Fp.sqr(gxd); //  11. tv3 = gxd^2\n    tv2 = Fp.sqr(tv3); //  12. tv2 = tv3^2           # gxd^4\n    tv3 = Fp.mul(tv3, gxd); //  13. tv3 = tv3 * gxd       # gxd^3\n    tv3 = Fp.mul(tv3, gx1); //  14. tv3 = tv3 * gx1       # gx1 * gxd^3\n    tv2 = Fp.mul(tv2, tv3); //  15. tv2 = tv2 * tv3       # gx1 * gxd^7\n    let y11 = Fp.pow(tv2, ELL2_C4); //  16. y11 = tv2^c4        # (gx1 * gxd^7)^((p - 5) / 8)\n    y11 = Fp.mul(y11, tv3); //  17. y11 = y11 * tv3       # gx1*gxd^3*(gx1*gxd^7)^((p-5)/8)\n    let y12 = Fp.mul(y11, ELL2_C3); //  18. y12 = y11 * c3\n    tv2 = Fp.sqr(y11); //  19. tv2 = y11^2\n    tv2 = Fp.mul(tv2, gxd); //  20. tv2 = tv2 * gxd\n    let e1 = Fp.eql(tv2, gx1); //  21.  e1 = tv2 == gx1\n    let y1 = Fp.cmov(y12, y11, e1); //  22.  y1 = CMOV(y12, y11, e1)  # If g(x1) is square, this is its sqrt\n    let x2n = Fp.mul(x1n, tv1); //  23. x2n = x1n * tv1       # x2 = x2n / xd = 2 * u^2 * x1n / xd\n    let y21 = Fp.mul(y11, u); //  24. y21 = y11 * u\n    y21 = Fp.mul(y21, ELL2_C2); //  25. y21 = y21 * c2\n    let y22 = Fp.mul(y21, ELL2_C3); //  26. y22 = y21 * c3\n    let gx2 = Fp.mul(gx1, tv1); //  27. gx2 = gx1 * tv1       # g(x2) = gx2 / gxd = 2 * u^2 * g(x1)\n    tv2 = Fp.sqr(y21); //  28. tv2 = y21^2\n    tv2 = Fp.mul(tv2, gxd); //  29. tv2 = tv2 * gxd\n    let e2 = Fp.eql(tv2, gx2); //  30.  e2 = tv2 == gx2\n    let y2 = Fp.cmov(y22, y21, e2); //  31.  y2 = CMOV(y22, y21, e2)  # If g(x2) is square, this is its sqrt\n    tv2 = Fp.sqr(y1); //  32. tv2 = y1^2\n    tv2 = Fp.mul(tv2, gxd); //  33. tv2 = tv2 * gxd\n    let e3 = Fp.eql(tv2, gx1); //  34.  e3 = tv2 == gx1\n    let xn = Fp.cmov(x2n, x1n, e3); //  35.  xn = CMOV(x2n, x1n, e3)  # If e3, x = x1, else x = x2\n    let y = Fp.cmov(y2, y1, e3); //  36.   y = CMOV(y2, y1, e3)    # If e3, y = y1, else y = y2\n    let e4 = Fp.isOdd(y); //  37.  e4 = sgn0(y) == 1        # Fix sign of y\n    y = Fp.cmov(y, Fp.neg(y), e3 !== e4); //  38.   y = CMOV(y, -y, e3 XOR e4)\n    return { xMn: xn, xMd: xd, yMn: y, yMd: _1n }; //  39. return (xn, xd, y, 1)\n}\nconst ELL2_C1_EDWARDS = /* @__PURE__ */ (() => (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.FpSqrtEven)(Fp, Fp.neg(BigInt(486664))))(); // sgn0(c1) MUST equal 0\nfunction map_to_curve_elligator2_edwards25519(u) {\n    const { xMn, xMd, yMn, yMd } = map_to_curve_elligator2_curve25519(u); //  1.  (xMn, xMd, yMn, yMd) =\n    // map_to_curve_elligator2_curve25519(u)\n    let xn = Fp.mul(xMn, yMd); //  2.  xn = xMn * yMd\n    xn = Fp.mul(xn, ELL2_C1_EDWARDS); //  3.  xn = xn * c1\n    let xd = Fp.mul(xMd, yMn); //  4.  xd = xMd * yMn    # xn / xd = c1 * xM / yM\n    let yn = Fp.sub(xMn, xMd); //  5.  yn = xMn - xMd\n    let yd = Fp.add(xMn, xMd); //  6.  yd = xMn + xMd    # (n / d - 1) / (n / d + 1) = (n - d) / (n + d)\n    let tv1 = Fp.mul(xd, yd); //  7. tv1 = xd * yd\n    let e = Fp.eql(tv1, Fp.ZERO); //  8.   e = tv1 == 0\n    xn = Fp.cmov(xn, Fp.ZERO, e); //  9.  xn = CMOV(xn, 0, e)\n    xd = Fp.cmov(xd, Fp.ONE, e); //  10. xd = CMOV(xd, 1, e)\n    yn = Fp.cmov(yn, Fp.ONE, e); //  11. yn = CMOV(yn, 1, e)\n    yd = Fp.cmov(yd, Fp.ONE, e); //  12. yd = CMOV(yd, 1, e)\n    const [xd_inv, yd_inv] = (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.FpInvertBatch)(Fp, [xd, yd], true); // batch division\n    return { x: Fp.mul(xn, xd_inv), y: Fp.mul(yn, yd_inv) }; //  13. return (xn, xd, yn, yd)\n}\n/** Hashing to ed25519 points / field. RFC 9380 methods. */\nconst ed25519_hasher = /* @__PURE__ */ (() => (0,_abstract_hash_to_curve_js__WEBPACK_IMPORTED_MODULE_5__.createHasher)(ed25519.Point, (scalars) => map_to_curve_elligator2_edwards25519(scalars[0]), {\n    DST: 'edwards25519_XMD:SHA-512_ELL2_RO_',\n    encodeDST: 'edwards25519_XMD:SHA-512_ELL2_NU_',\n    p: ed25519_CURVE_p,\n    m: 1,\n    k: 128,\n    expand: 'xmd',\n    hash: _noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_1__.sha512,\n}))();\n// √(-1) aka √(a) aka 2^((p-1)/4)\nconst SQRT_M1 = ED25519_SQRT_M1;\n// √(ad - 1)\nconst SQRT_AD_MINUS_ONE = /* @__PURE__ */ BigInt('25063068953384623474111414158702152701244531502492656460079210482610430750235');\n// 1 / √(a-d)\nconst INVSQRT_A_MINUS_D = /* @__PURE__ */ BigInt('54469307008909316920995813868745141605393597292927456921205312896311721017578');\n// 1-d²\nconst ONE_MINUS_D_SQ = /* @__PURE__ */ BigInt('1159843021668779879193775521855586647937357759715417654439879720876111806838');\n// (d-1)²\nconst D_MINUS_ONE_SQ = /* @__PURE__ */ BigInt('40440834346308536858101042469323190826248399146238708352240133220865137265952');\n// Calculates 1/√(number)\nconst invertSqrt = (number) => uvRatio(_1n, number);\nconst MAX_255B = /* @__PURE__ */ BigInt('0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff');\nconst bytes255ToNumberLE = (bytes) => ed25519.Point.Fp.create((0,_utils_js__WEBPACK_IMPORTED_MODULE_6__.bytesToNumberLE)(bytes) & MAX_255B);\n/**\n * Computes Elligator map for Ristretto255.\n * Described in [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#appendix-B) and on\n * the [website](https://ristretto.group/formulas/elligator.html).\n */\nfunction calcElligatorRistrettoMap(r0) {\n    const { d } = ed25519_CURVE;\n    const P = ed25519_CURVE_p;\n    const mod = (n) => Fp.create(n);\n    const r = mod(SQRT_M1 * r0 * r0); // 1\n    const Ns = mod((r + _1n) * ONE_MINUS_D_SQ); // 2\n    let c = BigInt(-1); // 3\n    const D = mod((c - d * r) * mod(r + d)); // 4\n    let { isValid: Ns_D_is_sq, value: s } = uvRatio(Ns, D); // 5\n    let s_ = mod(s * r0); // 6\n    if (!(0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.isNegativeLE)(s_, P))\n        s_ = mod(-s_);\n    if (!Ns_D_is_sq)\n        s = s_; // 7\n    if (!Ns_D_is_sq)\n        c = r; // 8\n    const Nt = mod(c * (r - _1n) * D_MINUS_ONE_SQ - D); // 9\n    const s2 = s * s;\n    const W0 = mod((s + s) * D); // 10\n    const W1 = mod(Nt * SQRT_AD_MINUS_ONE); // 11\n    const W2 = mod(_1n - s2); // 12\n    const W3 = mod(_1n + s2); // 13\n    return new ed25519.Point(mod(W0 * W3), mod(W2 * W1), mod(W1 * W3), mod(W0 * W2));\n}\nfunction ristretto255_map(bytes) {\n    (0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_3__.abytes)(bytes, 64);\n    const r1 = bytes255ToNumberLE(bytes.subarray(0, 32));\n    const R1 = calcElligatorRistrettoMap(r1);\n    const r2 = bytes255ToNumberLE(bytes.subarray(32, 64));\n    const R2 = calcElligatorRistrettoMap(r2);\n    return new _RistrettoPoint(R1.add(R2));\n}\n/**\n * Wrapper over Edwards Point for ristretto255.\n *\n * Each ed25519/ExtendedPoint has 8 different equivalent points. This can be\n * a source of bugs for protocols like ring signatures. Ristretto was created to solve this.\n * Ristretto point operates in X:Y:Z:T extended coordinates like ExtendedPoint,\n * but it should work in its own namespace: do not combine those two.\n * See [RFC9496](https://www.rfc-editor.org/rfc/rfc9496).\n */\nclass _RistrettoPoint extends _abstract_edwards_js__WEBPACK_IMPORTED_MODULE_2__.PrimeEdwardsPoint {\n    constructor(ep) {\n        super(ep);\n    }\n    static fromAffine(ap) {\n        return new _RistrettoPoint(ed25519.Point.fromAffine(ap));\n    }\n    assertSame(other) {\n        if (!(other instanceof _RistrettoPoint))\n            throw new Error('RistrettoPoint expected');\n    }\n    init(ep) {\n        return new _RistrettoPoint(ep);\n    }\n    /** @deprecated use `import { ristretto255_hasher } from '@noble/curves/ed25519.js';` */\n    static hashToCurve(hex) {\n        return ristretto255_map((0,_utils_js__WEBPACK_IMPORTED_MODULE_6__.ensureBytes)('ristrettoHash', hex, 64));\n    }\n    static fromBytes(bytes) {\n        (0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_3__.abytes)(bytes, 32);\n        const { a, d } = ed25519_CURVE;\n        const P = ed25519_CURVE_p;\n        const mod = (n) => Fp.create(n);\n        const s = bytes255ToNumberLE(bytes);\n        // 1. Check that s_bytes is the canonical encoding of a field element, or else abort.\n        // 3. Check that s is non-negative, or else abort\n        if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_6__.equalBytes)(Fp.toBytes(s), bytes) || (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.isNegativeLE)(s, P))\n            throw new Error('invalid ristretto255 encoding 1');\n        const s2 = mod(s * s);\n        const u1 = mod(_1n + a * s2); // 4 (a is -1)\n        const u2 = mod(_1n - a * s2); // 5\n        const u1_2 = mod(u1 * u1);\n        const u2_2 = mod(u2 * u2);\n        const v = mod(a * d * u1_2 - u2_2); // 6\n        const { isValid, value: I } = invertSqrt(mod(v * u2_2)); // 7\n        const Dx = mod(I * u2); // 8\n        const Dy = mod(I * Dx * v); // 9\n        let x = mod((s + s) * Dx); // 10\n        if ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.isNegativeLE)(x, P))\n            x = mod(-x); // 10\n        const y = mod(u1 * Dy); // 11\n        const t = mod(x * y); // 12\n        if (!isValid || (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.isNegativeLE)(t, P) || y === _0n)\n            throw new Error('invalid ristretto255 encoding 2');\n        return new _RistrettoPoint(new ed25519.Point(x, y, _1n, t));\n    }\n    /**\n     * Converts ristretto-encoded string to ristretto point.\n     * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-decode).\n     * @param hex Ristretto-encoded 32 bytes. Not every 32-byte string is valid ristretto encoding\n     */\n    static fromHex(hex) {\n        return _RistrettoPoint.fromBytes((0,_utils_js__WEBPACK_IMPORTED_MODULE_6__.ensureBytes)('ristrettoHex', hex, 32));\n    }\n    static msm(points, scalars) {\n        return (0,_abstract_curve_js__WEBPACK_IMPORTED_MODULE_7__.pippenger)(_RistrettoPoint, ed25519.Point.Fn, points, scalars);\n    }\n    /**\n     * Encodes ristretto point to Uint8Array.\n     * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-encode).\n     */\n    toBytes() {\n        let { X, Y, Z, T } = this.ep;\n        const P = ed25519_CURVE_p;\n        const mod = (n) => Fp.create(n);\n        const u1 = mod(mod(Z + Y) * mod(Z - Y)); // 1\n        const u2 = mod(X * Y); // 2\n        // Square root always exists\n        const u2sq = mod(u2 * u2);\n        const { value: invsqrt } = invertSqrt(mod(u1 * u2sq)); // 3\n        const D1 = mod(invsqrt * u1); // 4\n        const D2 = mod(invsqrt * u2); // 5\n        const zInv = mod(D1 * D2 * T); // 6\n        let D; // 7\n        if ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.isNegativeLE)(T * zInv, P)) {\n            let _x = mod(Y * SQRT_M1);\n            let _y = mod(X * SQRT_M1);\n            X = _x;\n            Y = _y;\n            D = mod(D1 * INVSQRT_A_MINUS_D);\n        }\n        else {\n            D = D2; // 8\n        }\n        if ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.isNegativeLE)(X * zInv, P))\n            Y = mod(-Y); // 9\n        let s = mod((Z - Y) * D); // 10 (check footer's note, no sqrt(-a))\n        if ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.isNegativeLE)(s, P))\n            s = mod(-s);\n        return Fp.toBytes(s); // 11\n    }\n    /**\n     * Compares two Ristretto points.\n     * Described in [RFC9496](https://www.rfc-editor.org/rfc/rfc9496#name-equals).\n     */\n    equals(other) {\n        this.assertSame(other);\n        const { X: X1, Y: Y1 } = this.ep;\n        const { X: X2, Y: Y2 } = other.ep;\n        const mod = (n) => Fp.create(n);\n        // (x1 * y2 == y1 * x2) | (y1 * y2 == x1 * x2)\n        const one = mod(X1 * Y2) === mod(Y1 * X2);\n        const two = mod(Y1 * Y2) === mod(X1 * X2);\n        return one || two;\n    }\n    is0() {\n        return this.equals(_RistrettoPoint.ZERO);\n    }\n}\n// Do NOT change syntax: the following gymnastics is done,\n// because typescript strips comments, which makes bundlers disable tree-shaking.\n// prettier-ignore\n_RistrettoPoint.BASE = \n/* @__PURE__ */ (() => new _RistrettoPoint(ed25519.Point.BASE))();\n// prettier-ignore\n_RistrettoPoint.ZERO = \n/* @__PURE__ */ (() => new _RistrettoPoint(ed25519.Point.ZERO))();\n// prettier-ignore\n_RistrettoPoint.Fp = \n/* @__PURE__ */ (() => Fp)();\n// prettier-ignore\n_RistrettoPoint.Fn = \n/* @__PURE__ */ (() => Fn)();\nconst ristretto255 = { Point: _RistrettoPoint };\n/** Hashing to ristretto255 points / field. RFC 9380 methods. */\nconst ristretto255_hasher = {\n    hashToCurve(msg, options) {\n        const DST = options?.DST || 'ristretto255_XMD:SHA-512_R255MAP_RO_';\n        const xmd = (0,_abstract_hash_to_curve_js__WEBPACK_IMPORTED_MODULE_5__.expand_message_xmd)(msg, DST, 64, _noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_1__.sha512);\n        return ristretto255_map(xmd);\n    },\n    hashToScalar(msg, options = { DST: _abstract_hash_to_curve_js__WEBPACK_IMPORTED_MODULE_5__._DST_scalar }) {\n        const xmd = (0,_abstract_hash_to_curve_js__WEBPACK_IMPORTED_MODULE_5__.expand_message_xmd)(msg, options.DST, 64, _noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_1__.sha512);\n        return Fn.create((0,_utils_js__WEBPACK_IMPORTED_MODULE_6__.bytesToNumberLE)(xmd));\n    },\n};\n// export const ristretto255_oprf: OPRF = createORPF({\n//   name: 'ristretto255-SHA512',\n//   Point: RistrettoPoint,\n//   hash: sha512,\n//   hashToGroup: ristretto255_hasher.hashToCurve,\n//   hashToScalar: ristretto255_hasher.hashToScalar,\n// });\n/**\n * Weird / bogus points, useful for debugging.\n * All 8 ed25519 points of 8-torsion subgroup can be generated from the point\n * T = `26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05`.\n * ⟨T⟩ = { O, T, 2T, 3T, 4T, 5T, 6T, 7T }\n */\nconst ED25519_TORSION_SUBGROUP = [\n    '0100000000000000000000000000000000000000000000000000000000000000',\n    'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a',\n    '0000000000000000000000000000000000000000000000000000000000000080',\n    '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05',\n    'ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f',\n    '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc85',\n    '0000000000000000000000000000000000000000000000000000000000000000',\n    'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac03fa',\n];\n/** @deprecated use `ed25519.utils.toMontgomery` */\nfunction edwardsToMontgomeryPub(edwardsPub) {\n    return ed25519.utils.toMontgomery((0,_utils_js__WEBPACK_IMPORTED_MODULE_6__.ensureBytes)('pub', edwardsPub));\n}\n/** @deprecated use `ed25519.utils.toMontgomery` */\nconst edwardsToMontgomery = edwardsToMontgomeryPub;\n/** @deprecated use `ed25519.utils.toMontgomerySecret` */\nfunction edwardsToMontgomeryPriv(edwardsPriv) {\n    return ed25519.utils.toMontgomerySecret((0,_utils_js__WEBPACK_IMPORTED_MODULE_6__.ensureBytes)('pub', edwardsPriv));\n}\n/** @deprecated use `ristretto255.Point` */\nconst RistrettoPoint = _RistrettoPoint;\n/** @deprecated use `import { ed25519_hasher } from '@noble/curves/ed25519.js';` */\nconst hashToCurve = /* @__PURE__ */ (() => ed25519_hasher.hashToCurve)();\n/** @deprecated use `import { ed25519_hasher } from '@noble/curves/ed25519.js';` */\nconst encodeToCurve = /* @__PURE__ */ (() => ed25519_hasher.encodeToCurve)();\n/** @deprecated use `import { ristretto255_hasher } from '@noble/curves/ed25519.js';` */\nconst hashToRistretto255 = /* @__PURE__ */ (() => ristretto255_hasher.hashToCurve)();\n/** @deprecated use `import { ristretto255_hasher } from '@noble/curves/ed25519.js';` */\nconst hash_to_ristretto255 = /* @__PURE__ */ (() => ristretto255_hasher.hashToCurve)();\n//# sourceMappingURL=ed25519.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9lZDI1NTE5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0M7QUFDMkI7QUFDMUI7QUFDMkI7QUFDa0I7QUFDTTtBQUM3QztBQUNnQjtBQUN0RTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0IsZ0JBQWdCLDBEQUFJLHdCQUF3QjtBQUM1QyxnQkFBZ0IsMERBQUksdUJBQXVCO0FBQzNDLGlCQUFpQiwwREFBSTtBQUNyQixpQkFBaUIsMERBQUk7QUFDckIsaUJBQWlCLDBEQUFJO0FBQ3JCLGlCQUFpQiwwREFBSTtBQUNyQixrQkFBa0IsMERBQUk7QUFDdEIsa0JBQWtCLDBEQUFJO0FBQ3RCLGtCQUFrQiwwREFBSTtBQUN0Qix1QkFBdUIsMERBQUk7QUFDM0I7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQSxzQkFBc0I7QUFDdEI7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUseURBQUcsZ0JBQWdCO0FBQ2xDLGVBQWUseURBQUcsa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQSxZQUFZLHlEQUFHLG1CQUFtQjtBQUNsQyxnQkFBZ0IseURBQUcsZ0JBQWdCO0FBQ25DLHFCQUFxQjtBQUNyQixrQkFBa0IseURBQUcsMEJBQTBCO0FBQy9DLGdDQUFnQztBQUNoQyw2QkFBNkIseURBQUcsU0FBUztBQUN6QywyQkFBMkIseURBQUcsMkJBQTJCO0FBQ3pEO0FBQ0E7QUFDQTtB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O0FBQzdFO0FBQ1AiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5vYmxlL2N1cnZlcy9lc20vZWQyNTUxOS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGVkMjU1MTkgVHdpc3RlZCBFZHdhcmRzIGN1cnZlIHdpdGggZm9sbG93aW5nIGFkZG9uczpcbiAqIC0gWDI1NTE5IEVDREhcbiAqIC0gUmlzdHJldHRvIGNvZmFjdG9yIGVsaW1pbmF0aW9uXG4gKiAtIEVsbGlnYXRvciBoYXNoLXRvLWdyb3VwIC8gcG9pbnQgaW5kaXN0aW5ndWlzaGFiaWxpdHlcbiAqIEBtb2R1bGVcbiAqL1xuLyohIG5vYmxlLWN1cnZlcyAtIE1JVCBMaWNlbnNlIChjKSAyMDIyIFBhdWwgTWlsbGVyIChwYXVsbWlsbHIuY29tKSAqL1xuaW1wb3J0IHsgc2hhNTEyIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy9zaGEyLmpzJztcbmltcG9ydCB7IGFieXRlcywgY29uY2F0Qnl0ZXMsIHV0ZjhUb0J5dGVzIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy91dGlscy5qcyc7XG5pbXBvcnQgeyBwaXBwZW5nZXIgfSBmcm9tIFwiLi9hYnN0cmFjdC9jdXJ2ZS5qc1wiO1xuaW1wb3J0IHsgUHJpbWVFZHdhcmRzUG9pbnQsIHR3aXN0ZWRFZHdhcmRzLCB9IGZyb20gXCIuL2Fic3RyYWN0L2Vkd2FyZHMuanNcIjtcbmltcG9ydCB7IF9EU1Rfc2NhbGFyLCBjcmVhdGVIYXNoZXIsIGV4cGFuZF9tZXNzYWdlX3htZCwgfSBmcm9tIFwiLi9hYnN0cmFjdC9oYXNoLXRvLWN1cnZlLmpzXCI7XG5pbXBvcnQgeyBGaWVsZCwgRnBJbnZlcnRCYXRjaCwgRnBTcXJ0RXZlbiwgaXNOZWdhdGl2ZUxFLCBtb2QsIHBvdzIsIH0gZnJvbSBcIi4vYWJzdHJhY3QvbW9kdWxhci5qc1wiO1xuaW1wb3J0IHsgbW9udGdvbWVyeSB9IGZyb20gXCIuL2Fic3RyYWN0L21vbnRnb21lcnkuanNcIjtcbmltcG9ydCB7IGJ5dGVzVG9OdW1iZXJMRSwgZW5zdXJlQnl0ZXMsIGVxdWFsQnl0ZXMgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBfMG4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDApLCBfMW4gPSBCaWdJbnQoMSksIF8ybiA9IEJpZ0ludCgyKSwgXzNuID0gQmlnSW50KDMpO1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBfNW4gPSBCaWdJbnQoNSksIF84biA9IEJpZ0ludCg4KTtcbi8vIFAgPSAybioqMjU1bi0xOW5cbmNvbnN0IGVkMjU1MTlfQ1VSVkVfcCA9IEJpZ0ludCgnMHg3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmVkJyk7XG4vLyBOID0gMm4qKjI1Mm4gKyAyNzc0MjMxNzc3NzM3MjM1MzUzNTg1MTkzNzc5MDg4MzY0ODQ5M25cbi8vIGEgPSBGcC5jcmVhdGUoQmlnSW50KC0xKSlcbi8vIGQgPSAtMTIxNjY1LzEyMTY2NiBhLmsuYS4gRnAubmVnKDEyMTY2NSAqIEZwLmludigxMjE2NjYpKVxuY29uc3QgZWQyNTUxOV9DVVJWRSA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gKHtcbiAgICBwOiBlZDI1NTE5X0NVUlZFX3AsXG4gICAgbjogQmlnSW50KCcweDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTRkZWY5ZGVhMmY3OWNkNjU4MTI2MzFhNWNmNWQzZWQnKSxcbiAgICBoOiBfOG4sXG4gICAgYTogQmlnSW50KCcweDdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWMnKSxcbiAgICBkOiBCaWdJbnQoJzB4NTIwMzZjZWUyYjZmZmU3MzhjYzc0MDc5Nzc3OWU4OTgwMDcwMGE0ZDQxNDFkOGFiNzVlYjRkY2ExMzU5NzhhMycpLFxuICAgIEd4OiBCaWdJbnQoJzB4MjE2OTM2ZDNjZDZlNTNmZWMwYTRlMjMxZmRkNmRjNWM2OTJjYzc2MDk1MjVhN2IyYzk1NjJkNjA4ZjI1ZDUxYScpLFxuICAgIEd5OiBCaWdJbnQoJzB4NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY1OCcpLFxufSkpKCk7XG5mdW5jdGlvbiBlZDI1NTE5X3Bvd18yXzI1Ml8zKHgpIHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBfMTBuID0gQmlnSW50KDEwKSwgXzIwbiA9IEJpZ0ludCgyMCksIF80MG4gPSBCaWdJbnQoNDApLCBfODBuID0gQmlnSW50KDgwKTtcbiAgICBjb25zdCBQID0gZWQyNTUxOV9DVVJWRV9wO1xuICAgIGNvbnN0IHgyID0gKHggKiB4KSAlIFA7XG4gICAgY29uc3QgYjIgPSAoeDIgKiB4KSAlIFA7IC8vIHheMywgMTFcbiAgICBjb25zdCBiNCA9IChwb3cyKGIyLCBfMm4sIFApICogYjIpICUgUDsgLy8geF4xNSwgMTExMVxuICAgIGNvbnN0IGI1ID0gKHBvdzIoYjQsIF8xbiwgUCkgKiB4KSAlIFA7IC8vIHheMzFcbiAgICBjb25zdCBiMTAgPSAocG93MihiNSwgXzVuLCBQKSAqIGI1KSAlIFA7XG4gICAgY29uc3QgYjIwID0gKHBvdzIoYjEwLCBfMTBuLCBQKSAqIGIxMCkgJSBQO1xuICAgIGNvbnN0IGI0MCA9IChwb3cyKGIyMCwgXzIwbiwgUCkgKiBiMjApICUgUDtcbiAgICBjb25zdCBiODAgPSAocG93MihiNDAsIF80MG4sIFApICogYjQwKSAlIFA7XG4gICAgY29uc3QgYjE2MCA9IChwb3cyKGI4MCwgXzgwbiwgUCkgKiBiODApICUgUDtcbiAgICBjb25zdCBiMjQwID0gKHBvdzIoYjE2MCwgXzgwbiwgUCkgKiBiODApICUgUDtcbiAgICBjb25zdCBiMjUwID0gKHBvdzIoYjI0MCwgXzEwbiwgUCkgKiBiMTApICUgUDtcbiAgICBjb25zdCBwb3dfcF81XzggPSAocG93MihiMjUwLCBfMm4sIFApICogeCkgJSBQO1xuICAgIC8vIF4gVG8gcG93IHRvIChwKzMpLzgsIG11bHRpcGx5IGl0IGJ5IHguXG4gICAgcmV0dXJuIHsgcG93X3BfNV84LCBiMiB9O1xufVxuZnVuY3Rpb24gYWRqdXN0U2NhbGFyQnl0ZXMoYnl0ZXMpIHtcbiAgICAvLyBTZWN0aW9uIDU6IEZvciBYMjU1MTksIGluIG9yZGVyIHRvIGRlY29kZSAzMiByYW5kb20gYnl0ZXMgYXMgYW4gaW50ZWdlciBzY2FsYXIsXG4gICAgLy8gc2V0IHRoZSB0aHJlZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBmaXJzdCBieXRlXG4gICAgYnl0ZXNbMF0gJj0gMjQ4OyAvLyAwYjExMTFfMTAwMFxuICAgIC8vIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlIGxhc3QgdG8gemVybyxcbiAgICBieXRlc1szMV0gJj0gMTI3OyAvLyAwYjAxMTFfMTExMVxuICAgIC8vIHNldCB0aGUgc2Vjb25kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBsYXN0IGJ5dGUgdG8gMVxuICAgIGJ5dGVzWzMxXSB8PSA2NDsgLy8gMGIwMTAwXzAwMDBcbiAgICByZXR1cm4gYnl0ZXM7XG59XG4vLyDiiJooLTEpIGFrYSDiiJooYSkgYWthIDJeKChwLTEpLzQpXG4vLyBGcC5zcXJ0KEZwLm5lZygxKSlcbmNvbnN0IEVEMjU1MTlfU1FSVF9NMSA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoJzE5NjgxMTYxMzc2NzA3NTA1OTU2ODA3MDc5MzA0OTg4NTQyMDE1NDQ2MDY2NTE1OTIzODkwMTYyNzQ0MDIxMDczMTIzODI5Nzg0NzUyJyk7XG4vLyBzcXJ0KHUvdilcbmZ1bmN0aW9uIHV2UmF0aW8odSwgdikge1xuICAgIGNvbnN0IFAgPSBlZDI1NTE5X0NVUlZFX3A7XG4gICAgY29uc3QgdjMgPSBtb2QodiAqIHYgKiB2LCBQKTsgLy8gdsKzXG4gICAgY29uc3QgdjcgPSBtb2QodjMgKiB2MyAqIHYsIFApOyAvLyB24oG3XG4gICAgLy8gKHArMykvOCBhbmQgKHAtNSkvOFxuICAgIGNvbnN0IHBvdyA9IGVkMjU1MTlfcG93XzJfMjUyXzModSAqIHY3KS5wb3dfcF81Xzg7XG4gICAgbGV0IHggPSBtb2QodSAqIHYzICogcG93LCBQKTsgLy8gKHV2wrMpKHV24oG3KV4ocC01KS84XG4gICAgY29uc3QgdngyID0gbW9kKHYgKiB4ICogeCwgUCk7IC8vIHZ4wrJcbiAgICBjb25zdCByb290MSA9IHg7IC8vIEZpcnN0IHJvb3QgY2FuZGlkYXRlXG4gICAgY29uc3Qgcm9vdDIgPSBtb2QoeCAqIEVEMjU1MTlfU1FSVF9NMSwgUCk7IC8vIFNlY29uZCByb290IGNhbmRpZGF0ZVxuICAgIGNvbnN0IHVzZVJvb3QxID0gdngyID09PSB1OyAvLyBJZiB2eMKyID0gdSAobW9kIHApLCB4IGlzIGEgc3F1YXJlIHJvb3RcbiAgICBjb25zdCB1c2VSb290MiA9IHZ4MiA9PT0gbW9kKC11LCBQKTsgLy8gSWYgdnjCsiA9IC11LCBzZXQgeCA8LS0geCAqIDJeKChwLTEpLzQpXG4gICAgY29uc3Qgbm9Sb290ID0gdngyID09PSBtb2QoLXUgKiBFRDI1NTE5X1NRUlRfTTEsIFApOyAvLyBUaGVyZSBpcyBubyB2YWxpZCByb290LCB2eMKyID0gLXXiiJooLTEpXG4gICAgaWYgKHVzZVJvb3QxKVxuICAgICAgICB4ID0gcm9vdDE7XG4gICAgaWYgKHVzZVJvb3QyIHx8IG5vUm9vdClcbiAgICAgICAgeCA9IHJvb3QyOyAvLyBXZSByZXR1cm4gcm9vdDIgYW55d2F5LCBmb3IgY29uc3QtdGltZVxuICAgIGlmIChpc05lZ2F0aXZlTEUoeCwgUCkpXG4gICAgICAgIHggPSBtb2QoLXgsIFApO1xuICAgIHJldHVybiB7IGlzVmFsaWQ6IHVzZVJvb3QxIHx8IHVzZVJvb3QyLCB2YWx1ZTogeCB9O1xufVxuY29uc3QgRnAgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IEZpZWxkKGVkMjU1MTlfQ1VSVkUucCwgeyBpc0xFOiB0cnVlIH0pKSgpO1xuY29uc3QgRm4gPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IEZpZWxkKGVkMjU1MTlfQ1VSVkUubiwgeyBpc0xFOiB0cnVlIH0pKSgpO1xuY29uc3QgZWQyNTUxOURlZmF1bHRzID0gLyogQF9fUFVSRV9fICovICgoKSA9PiAoe1xuICAgIC4uLmVkMjU1MTlfQ1VSVkUsXG4gICAgRnAsXG4gICAgaGFzaDogc2hhNTEyLFxuICAgIGFkanVzdFNjYWxhckJ5dGVzLFxuICAgIC8vIGRvbTJcbiAgICAvLyBSYXRpbyBvZiB1IHRvIHYuIEFsbG93cyB1cyB0byBjb21iaW5lIGludmVyc2lvbiBhbmQgc3F1YXJlIHJvb3QuIFVzZXMgYWxnbyBmcm9tIFJGQzgwMzIgNS4xLjMuXG4gICAgLy8gQ29uc3RhbnQtdGltZSwgdS/iiJp2XG4gICAgdXZSYXRpbyxcbn0pKSgpO1xuLyoqXG4gKiBlZDI1NTE5IGN1cnZlIHdpdGggRWREU0Egc2lnbmF0dXJlcy5cbiAqIEBleGFtcGxlXG4gKiBpbXBvcnQgeyBlZDI1NTE5IH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9lZDI1NTE5JztcbiAqIGNvbnN0IHsgc2VjcmV0S2V5LCBwdWJsaWNLZXkgfSA9IGVkMjU1MTkua2V5Z2VuKCk7XG4gKiBjb25zdCBtc2cgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoJ2hlbGxvJyk7XG4gKiBjb25zdCBzaWcgPSBlZDI1NTE5LnNpZ24obXNnLCBwcml2KTtcbiAqIGVkMjU1MTkudmVyaWZ5KHNpZywgbXNnLCBwdWIpOyAvLyBEZWZhdWx0IG1vZGU6IGZvbGxvd3MgWklQMjE1XG4gKiBlZDI1NTE5LnZlcmlmeShzaWcsIG1zZywgcHViLCB7IHppcDIxNTogZmFsc2UgfSk7IC8vIFJGQzgwMzIgLyBGSVBTIDE4Ni01XG4gKi9cbmV4cG9ydCBjb25zdCBlZDI1NTE5ID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB0d2lzdGVkRWR3YXJkcyhlZDI1NTE5RGVmYXVsdHMpKSgpO1xuZnVuY3Rpb24gZWQyNTUxOV9kb21haW4oZGF0YSwgY3R4LCBwaGZsYWcpIHtcbiAgICBpZiAoY3R4Lmxlbmd0aCA+IDI1NSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb250ZXh0IGlzIHRvbyBiaWcnKTtcbiAgICByZXR1cm4gY29uY2F0Qnl0ZXModXRmOFRvQnl0ZXMoJ1NpZ0VkMjU1MTkgbm8gRWQyNTUxOSBjb2xsaXNpb25zJyksIG5ldyBVaW50OEFycmF5KFtwaGZsYWcgPyAxIDogMCwgY3R4Lmxlbmd0aF0pLCBjdHgsIGRhdGEpO1xufVxuLyoqIENvbnRleHQgb2YgZWQyNTUxOS4gVXNlcyBjb250ZXh0IGZvciBkb21haW4gc2VwYXJhdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBlZDI1NTE5Y3R4ID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB0d2lzdGVkRWR3YXJkcyh7XG4gICAgLi4uZWQyNTUxOURlZmF1bHRzLFxuICAgIGRvbWFpbjogZWQyNTUxOV9kb21haW4sXG59KSkoKTtcbi8qKiBQcmVoYXNoZWQgdmVyc2lvbiBvZiBlZDI1NTE5LiBBY2NlcHRzIGFscmVhZHktaGFzaGVkIG1lc3NhZ2VzIGluIHNpZ24oKSBhbmQgdmVyaWZ5KCkuICovXG5leHBvcnQgY29uc3QgZWQyNTUxOXBoID0gLyogQF9fUFVSRV9fICovICgoKSA9PiB0d2lzdGVkRWR3YXJkcyhPYmplY3QuYXNzaWduKHt9LCBlZDI1NTE5RGVmYXVsdHMsIHtcbiAgICBkb21haW46IGVkMjU1MTlfZG9tYWluLFxuICAgIHByZWhhc2g6IHNoYTUxMixcbn0pKSkoKTtcbi8qKlxuICogRUNESCB1c2luZyBjdXJ2ZTI1NTE5IGFrYSB4MjU1MTkuXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgeDI1NTE5IH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9lZDI1NTE5JztcbiAqIGNvbnN0IHByaXYgPSAnYTU0NmUzNmJmMDUyN2M5ZDNiMTYxNTRiODI0NjVlZGQ2MjE0NGMwYWMxZmM1YTE4NTA2YTIyNDRiYTQ0OWFjNCc7XG4gKiBjb25zdCBwdWIgPSAnZTZkYjY4Njc1ODMwMzBkYjM1OTRjMWE0MjRiMTVmN2M3MjY2MjRlYzI2YjMzNTNiMTBhOTAzYTZkMGFiMWM0Yyc7XG4gKiB4MjU1MTkuZ2V0U2hhcmVkU2VjcmV0KHByaXYsIHB1YikgPT09IHgyNTUxOS5zY2FsYXJNdWx0KHByaXYsIHB1Yik7IC8vIGFsaWFzZXNcbiAqIHgyNTUxOS5nZXRQdWJsaWNLZXkocHJpdikgPT09IHgyNTUxOS5zY2FsYXJNdWx0QmFzZShwcml2KTtcbiAqIHgyNTUxOS5nZXRQdWJsaWNLZXkoeDI1NTE5LnV0aWxzLnJhbmRvbVNlY3JldEtleSgpKTtcbiAqL1xuZXhwb3J0IGNvbnN0IHgyNTUxOSA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4ge1xuICAgIGNvbnN0IFAgPSBGcC5PUkRFUjtcbiAgICByZXR1cm4gbW9udGdvbWVyeSh7XG4gICAgICAgIFAsXG4gICAgICAgIHR5cGU6ICd4MjU1MTknLFxuICAgICAgICBwb3dQbWludXMyOiAoeCkgPT4ge1xuICAgICAgICAgICAgLy8geF4ocC0yKSBha2EgeF4oMl4yNTUtMjEpXG4gICAgICAgICAgICBjb25zdCB7IHBvd19wXzVfOCwgYjIgfSA9IGVkMjU1MTlfcG93XzJfMjUyXzMoeCk7XG4gICAgICAgICAgICByZXR1cm4gbW9kKHBvdzIocG93X3BfNV84LCBfM24sIFApICogYjIsIFApO1xuICAgICAgICB9LFxuICAgICAgICBhZGp1c3RTY2FsYXJCeXRlcyxcbiAgICB9KTtcbn0pKCk7XG4vLyBIYXNoIFRvIEN1cnZlIEVsbGlnYXRvcjIgTWFwIChOT1RFOiBkaWZmZXJlbnQgZnJvbSByaXN0cmV0dG8yNTUgZWxsaWdhdG9yKVxuLy8gTk9URTogdmVyeSBpbXBvcnRhbnQgcGFydCBpcyB1c2FnZSBvZiBGcFNxcnRFdmVuIGZvciBFTEwyX0MxX0VEV0FSRFMsIHNpbmNlXG4vLyBTYWdlTWF0aCByZXR1cm5zIGRpZmZlcmVudCByb290IGZpcnN0IGFuZCBldmVyeXRoaW5nIGZhbGxzIGFwYXJ0XG5jb25zdCBFTEwyX0MxID0gLyogQF9fUFVSRV9fICovICgoKSA9PiAoZWQyNTUxOV9DVVJWRV9wICsgXzNuKSAvIF84bikoKTsgLy8gMS4gYzEgPSAocSArIDMpIC8gOCAgICAgICAjIEludGVnZXIgYXJpdGhtZXRpY1xuY29uc3QgRUxMMl9DMiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gRnAucG93KF8ybiwgRUxMMl9DMSkpKCk7IC8vIDIuIGMyID0gMl5jMVxuY29uc3QgRUxMMl9DMyA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gRnAuc3FydChGcC5uZWcoRnAuT05FKSkpKCk7IC8vIDMuIGMzID0gc3FydCgtMSlcbi8vIHByZXR0aWVyLWlnbm9yZVxuZnVuY3Rpb24gbWFwX3RvX2N1cnZlX2VsbGlnYXRvcjJfY3VydmUyNTUxOSh1KSB7XG4gICAgY29uc3QgRUxMMl9DNCA9IChlZDI1NTE5X0NVUlZFX3AgLSBfNW4pIC8gXzhuOyAvLyA0LiBjNCA9IChxIC0gNSkgLyA4ICAgICAgICMgSW50ZWdlciBhcml0aG1ldGljXG4gICAgY29uc3QgRUxMMl9KID0gQmlnSW50KDQ4NjY2Mik7XG4gICAgbGV0IHR2MSA9IEZwLnNxcih1KTsgLy8gIDEuICB0djEgPSB1XjJcbiAgICB0djEgPSBGcC5tdWwodHYxLCBfMm4pOyAvLyAgMi4gIHR2MSA9IDIgKiB0djFcbiAgICBsZXQgeGQgPSBGcC5hZGQodHYxLCBGcC5PTkUpOyAvLyAgMy4gICB4ZCA9IHR2MSArIDEgICAgICAgICAjIE5vbnplcm86IC0xIGlzIHNxdWFyZSAobW9kIHApLCB0djEgaXMgbm90XG4gICAgbGV0IHgxbiA9IEZwLm5lZyhFTEwyX0opOyAvLyAgNC4gIHgxbiA9IC1KICAgICAgICAgICAgICAjIHgxID0geDFuIC8geGQgPSAtSiAvICgxICsgMiAqIHVeMilcbiAgICBsZXQgdHYyID0gRnAuc3FyKHhkKTsgLy8gIDUuICB0djIgPSB4ZF4yXG4gICAgbGV0IGd4ZCA9IEZwLm11bCh0djIsIHhkKTsgLy8gIDYuICBneGQgPSB0djIgKiB4ZCAgICAgICAgIyBneGQgPSB4ZF4zXG4gICAgbGV0IGd4MSA9IEZwLm11bCh0djEsIEVMTDJfSik7IC8vICA3LiAgZ3gxID0gSiAqIHR2MSAgICAgICAgICMgeDFuICsgSiAqIHhkXG4gICAgZ3gxID0gRnAubXVsKGd4MSwgeDFuKTsgLy8gIDguICBneDEgPSBneDEgKiB4MW4gICAgICAgIyB4MW5eMiArIEogKiB4MW4gKiB4ZFxuICAgIGd4MSA9IEZwLmFkZChneDEsIHR2Mik7IC8vICA5LiAgZ3gxID0gZ3gxICsgdHYyICAgICAgICMgeDFuXjIgKyBKICogeDFuICogeGQgKyB4ZF4yXG4gICAgZ3gxID0gRnAubXVsKGd4MSwgeDFuKTsgLy8gIDEwLiBneDEgPSBneDEgKiB4MW4gICAgICAgIyB4MW5eMyArIEogKiB4MW5eMiAqIHhkICsgeDFuICogeGReMlxuICAgIGxldCB0djMgPSBGcC5zcXIoZ3hkKTsgLy8gIDExLiB0djMgPSBneGReMlxuICAgIHR2MiA9IEZwLnNxcih0djMpOyAvLyAgMTIuIHR2MiA9IHR2M14yICAgICAgICAgICAjIGd4ZF40XG4gICAgdHYzID0gRnAubXVsKHR2MywgZ3hkKTsgLy8gIDEzLiB0djMgPSB0djMgKiBneGQgICAgICAgIyBneGReM1xuICAgIHR2MyA9IEZwLm11bCh0djMsIGd4MSk7IC8vICAxNC4gdHYzID0gdHYzICogZ3gxICAgICAgICMgZ3gxICogZ3hkXjNcbiAgICB0djIgPSBGcC5tdWwodHYyLCB0djMpOyAvLyAgMTUuIHR2MiA9IHR2MiAqIHR2MyAgICAgICAjIGd4MSAqIGd4ZF43XG4gICAgbGV0IHkxMSA9IEZwLnBvdyh0djIsIEVMTDJfQzQpOyAvLyAgMTYuIHkxMSA9IHR2Ml5jNCAgICAgICAgIyAoZ3gxICogZ3hkXjcpXigocCAtIDUpIC8gOClcbiAgICB5MTEgPSBGcC5tdWwoeTExLCB0djMpOyAvLyAgMTcuIHkxMSA9IHkxMSAqIHR2MyAgICAgICAjIGd4MSpneGReMyooZ3gxKmd4ZF43KV4oKHAtNSkvOClcbiAgICBsZXQgeTEyID0gRnAubXVsKHkxMSwgRUxMMl9DMyk7IC8vICAxOC4geTEyID0geTExICogYzNcbiAgICB0djIgPSBGcC5zcXIoeTExKTsgLy8gIDE5LiB0djIgPSB5MTFeMlxuICAgIHR2MiA9IEZwLm11bCh0djIsIGd4ZCk7IC8vICAyMC4gdHYyID0gdHYyICogZ3hkXG4gICAgbGV0IGUxID0gRnAuZXFsKHR2MiwgZ3gxKTsgLy8gIDIxLiAgZTEgPSB0djIgPT0gZ3gxXG4gICAgbGV0IHkxID0gRnAuY21vdih5MTIsIHkxMSwgZTEpOyAvLyAgMjIuICB5MSA9IENNT1YoeTEyLCB5MTEsIGUxKSAgIyBJZiBnKHgxKSBpcyBzcXVhcmUsIHRoaXMgaXMgaXRzIHNxcnRcbiAgICBsZXQgeDJuID0gRnAubXVsKHgxbiwgdHYxKTsgLy8gIDIzLiB4Mm4gPSB4MW4gKiB0djEgICAgICAgIyB4MiA9IHgybiAvIHhkID0gMiAqIHVeMiAqIHgxbiAvIHhkXG4gICAgbGV0IHkyMSA9IEZwLm11bCh5MTEsIHUpOyAvLyAgMjQuIHkyMSA9IHkxMSAqIHVcbiAgICB5MjEgPSBGcC5tdWwoeTIxLCBFTEwyX0MyKTsgLy8gIDI1LiB5MjEgPSB5MjEgKiBjMlxuICAgIGxldCB5MjIgPSBGcC5tdWwoeTIxLCBFTEwyX0MzKTsgLy8gIDI2LiB5MjIgPSB5MjEgKiBjM1xuICAgIGxldCBneDIgPSBGcC5tdWwoZ3gxLCB0djEpOyAvLyAgMjcuIGd4MiA9IGd4MSAqIHR2MSAgICAgICAjIGcoeDIpID0gZ3gyIC8gZ3hkID0gMiAqIHVeMiAqIGcoeDEpXG4gICAgdHYyID0gRnAuc3FyKHkyMSk7IC8vICAyOC4gdHYyID0geTIxXjJcbiAgICB0djIgPSBGcC5tdWwodHYyLCBneGQpOyAvLyAgMjkuIHR2MiA9IHR2MiAqIGd4ZFxuICAgIGxldCBlMiA9IEZwLmVxbCh0djIsIGd4Mik7IC8vICAzMC4gIGUyID0gdHYyID09IGd4MlxuICAgIGxldCB5MiA9IEZwLmNtb3YoeTIyLCB5MjEsIGUyKTsgLy8gIDMxLiAgeTIgPSBDTU9WKHkyMiwgeTIxLCBlMikgICMgSWYgZyh4MikgaXMgc3F1YXJlLCB0aGlzIGlzIGl0cyBzcXJ0XG4gICAgdHYyID0gRnAuc3FyKHkxKTsgLy8gIDMyLiB0djIgPSB5MV4yXG4gICAgdHYyID0gRnAubXVsKHR2MiwgZ3hkKTsgLy8gIDMzLiB0djIgPSB0djIgKiBneGRcbiAgICBsZXQgZTMgPSBGcC5lcWwodHYyLCBneDEpOyAvLyAgMzQuICBlMyA9IHR2MiA9PSBneDFcbiAgICBsZXQgeG4gPSBGcC5jbW92KHgybiwgeDFuLCBlMyk7IC8vICAzNS4gIHhuID0gQ01PVih4Mm4sIHgxbiwgZTMpICAjIElmIGUzLCB4ID0geDEsIGVsc2UgeCA9IHgyXG4gICAgbGV0IHkgPSBGcC5jbW92KHkyLCB5MSwgZTMpOyAvLyAgMzYuICAgeSA9IENNT1YoeTIsIHkxLCBlMykgICAgIyBJZiBlMywgeSA9IHkxLCBlbHNlIHkgPSB5MlxuICAgIGxldCBlNCA9IEZwLmlzT2RkKHkpOyAvLyAgMzcuICBlNCA9IHNnbjAoeSkgPT0gMSAgICAgICAgIyBGaXggc2lnbiBvZiB5XG4gICAgeSA9IEZwLmNtb3YoeSwgRnAubmVnKHkpLCBlMyAhPT0gZTQpOyAvLyAgMzguICAgeSA9IENNT1YoeSwgLXksIGUzIFhPUiBlNClcbiAgICByZXR1cm4geyB4TW46IHhuLCB4TWQ6IHhkLCB5TW46IHksIHlNZDogXzFuIH07IC8vICAzOS4gcmV0dXJuICh4biwgeGQsIHksIDEpXG59XG5jb25zdCBFTEwyX0MxX0VEV0FSRFMgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IEZwU3FydEV2ZW4oRnAsIEZwLm5lZyhCaWdJbnQoNDg2NjY0KSkpKSgpOyAvLyBzZ24wKGMxKSBNVVNUIGVxdWFsIDBcbmZ1bmN0aW9uIG1hcF90b19jdXJ2ZV9lbGxpZ2F0b3IyX2Vkd2FyZHMyNTUxOSh1KSB7XG4gICAgY29uc3QgeyB4TW4sIHhNZCwgeU1uLCB5TWQgfSA9IG1hcF90b19jdXJ2ZV9lbGxpZ2F0b3IyX2N1cnZlMjU1MTkodSk7IC8vICAxLiAgKHhNbiwgeE1kLCB5TW4sIHlNZCkgPVxuICAgIC8vIG1hcF90b19jdXJ2ZV9lbGxpZ2F0b3IyX2N1cnZlMjU1MTkodSlcbiAgICBsZXQgeG4gPSBGcC5tdWwoeE1uLCB5TWQpOyAvLyAgMi4gIHhuID0geE1uICogeU1kXG4gICAgeG4gPSBGcC5tdWwoeG4sIEVMTDJfQzFfRURXQVJEUyk7IC8vICAzLiAgeG4gPSB4biAqIGMxXG4gICAgbGV0IHhkID0gRnAubXVsKHhNZCwgeU1uKTsgLy8gIDQuICB4ZCA9IHhNZCAqIHlNbiAgICAjIHhuIC8geGQgPSBjMSAqIHhNIC8geU1cbiAgICBsZXQgeW4gPSBGcC5zdWIoeE1uLCB4TWQpOyAvLyAgNS4gIHluID0geE1uIC0geE1kXG4gICAgbGV0IHlkID0gRnAuYWRkKHhNbiwgeE1kKTsgLy8gIDYuICB5ZCA9IHhNbiArIHhNZCAgICAjIChuIC8gZCAtIDEpIC8gKG4gLyBkICsgMSkgPSAobiAtIGQpIC8gKG4gKyBkKVxuICAgIGxldCB0djEgPSBGcC5tdWwoeGQsIHlkKTsgLy8gIDcuIHR2MSA9IHhkICogeWRcbiAgICBsZXQgZSA9IEZwLmVxbCh0djEsIEZwLlpFUk8pOyAvLyAgOC4gICBlID0gdHYxID09IDBcbiAgICB4biA9IEZwLmNtb3YoeG4sIEZwLlpFUk8sIGUpOyAvLyAgOS4gIHhuID0gQ01PVih4biwgMCwgZSlcbiAgICB4ZCA9IEZwLmNtb3YoeGQsIEZwLk9ORSwgZSk7IC8vICAxMC4geGQgPSBDTU9WKHhkLCAxLCBlKVxuICAgIHluID0gRnAuY21vdih5biwgRnAuT05FLCBlKTsgLy8gIDExLiB5biA9IENNT1YoeW4sIDEsIGUpXG4gICAgeWQgPSBGcC5jbW92KHlkLCBGcC5PTkUsIGUpOyAvLyAgMTIuIHlkID0gQ01PVih5ZCwgMSwgZSlcbiAgICBjb25zdCBbeGRfaW52LCB5ZF9pbnZdID0gRnBJbnZlcnRCYXRjaChGcCwgW3hkLCB5ZF0sIHRydWUpOyAvLyBiYXRjaCBkaXZpc2lvblxuICAgIHJldHVybiB7IHg6IEZwLm11bCh4biwgeGRfaW52KSwgeTogRnAubXVsKHluLCB5ZF9pbnYpIH07IC8vICAxMy4gcmV0dXJuICh4biwgeGQsIHluLCB5ZClcbn1cbi8qKiBIYXNoaW5nIHRvIGVkMjU1MTkgcG9pbnRzIC8gZmllbGQuIFJGQyA5MzgwIG1ldGhvZHMuICovXG5leHBvcnQgY29uc3QgZWQyNTUxOV9oYXNoZXIgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IGNyZWF0ZUhhc2hlcihlZDI1NTE5LlBvaW50LCAoc2NhbGFycykgPT4gbWFwX3RvX2N1cnZlX2VsbGlnYXRvcjJfZWR3YXJkczI1NTE5KHNjYWxhcnNbMF0pLCB7XG4gICAgRFNUOiAnZWR3YXJkczI1NTE5X1hNRDpTSEEtNTEyX0VMTDJfUk9fJyxcbiAgICBlbmNvZGVEU1Q6ICdlZHdhcmRzMjU1MTlfWE1EOlNIQS01MTJfRUxMMl9OVV8nLFxuICAgIHA6IGVkMjU1MTlfQ1VSVkVfcCxcbiAgICBtOiAxLFxuICAgIGs6IDEyOCxcbiAgICBleHBhbmQ6ICd4bWQnLFxuICAgIGhhc2g6IHNoYTUxMixcbn0pKSgpO1xuLy8g4oiaKC0xKSBha2Eg4oiaKGEpIGFrYSAyXigocC0xKS80KVxuY29uc3QgU1FSVF9NMSA9IEVEMjU1MTlfU1FSVF9NMTtcbi8vIOKImihhZCAtIDEpXG5jb25zdCBTUVJUX0FEX01JTlVTX09ORSA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoJzI1MDYzMDY4OTUzMzg0NjIzNDc0MTExNDE0MTU4NzAyMTUyNzAxMjQ0NTMxNTAyNDkyNjU2NDYwMDc5MjEwNDgyNjEwNDMwNzUwMjM1Jyk7XG4vLyAxIC8g4oiaKGEtZClcbmNvbnN0IElOVlNRUlRfQV9NSU5VU19EID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgnNTQ0NjkzMDcwMDg5MDkzMTY5MjA5OTU4MTM4Njg3NDUxNDE2MDUzOTM1OTcyOTI5Mjc0NTY5MjEyMDUzMTI4OTYzMTE3MjEwMTc1NzgnKTtcbi8vIDEtZMKyXG5jb25zdCBPTkVfTUlOVVNfRF9TUSA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoJzExNTk4NDMwMjE2Njg3Nzk4NzkxOTM3NzU1MjE4NTU1ODY2NDc5MzczNTc3NTk3MTU0MTc2NTQ0Mzk4Nzk3MjA4NzYxMTE4MDY4MzgnKTtcbi8vIChkLTEpwrJcbmNvbnN0IERfTUlOVVNfT05FX1NRID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgnNDA0NDA4MzQzNDYzMDg1MzY4NTgxMDEwNDI0NjkzMjMxOTA4MjYyNDgzOTkxNDYyMzg3MDgzNTIyNDAxMzMyMjA4NjUxMzcyNjU5NTInKTtcbi8vIENhbGN1bGF0ZXMgMS/iiJoobnVtYmVyKVxuY29uc3QgaW52ZXJ0U3FydCA9IChudW1iZXIpID0+IHV2UmF0aW8oXzFuLCBudW1iZXIpO1xuY29uc3QgTUFYXzI1NUIgPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KCcweDdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYnKTtcbmNvbnN0IGJ5dGVzMjU1VG9OdW1iZXJMRSA9IChieXRlcykgPT4gZWQyNTUxOS5Qb2ludC5GcC5jcmVhdGUoYnl0ZXNUb051bWJlckxFKGJ5dGVzKSAmIE1BWF8yNTVCKTtcbi8qKlxuICogQ29tcHV0ZXMgRWxsaWdhdG9yIG1hcCBmb3IgUmlzdHJldHRvMjU1LlxuICogRGVzY3JpYmVkIGluIFtSRkM5MzgwXShodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTM4MCNhcHBlbmRpeC1CKSBhbmQgb25cbiAqIHRoZSBbd2Vic2l0ZV0oaHR0cHM6Ly9yaXN0cmV0dG8uZ3JvdXAvZm9ybXVsYXMvZWxsaWdhdG9yLmh0bWwpLlxuICovXG5mdW5jdGlvbiBjYWxjRWxsaWdhdG9yUmlzdHJldHRvTWFwKHIwKSB7XG4gICAgY29uc3QgeyBkIH0gPSBlZDI1NTE5X0NVUlZFO1xuICAgIGNvbnN0IFAgPSBlZDI1NTE5X0NVUlZFX3A7XG4gICAgY29uc3QgbW9kID0gKG4pID0+IEZwLmNyZWF0ZShuKTtcbiAgICBjb25zdCByID0gbW9kKFNRUlRfTTEgKiByMCAqIHIwKTsgLy8gMVxuICAgIGNvbnN0IE5zID0gbW9kKChyICsgXzFuKSAqIE9ORV9NSU5VU19EX1NRKTsgLy8gMlxuICAgIGxldCBjID0gQmlnSW50KC0xKTsgLy8gM1xuICAgIGNvbnN0IEQgPSBtb2QoKGMgLSBkICogcikgKiBtb2QociArIGQpKTsgLy8gNFxuICAgIGxldCB7IGlzVmFsaWQ6IE5zX0RfaXNfc3EsIHZhbHVlOiBzIH0gPSB1dlJhdGlvKE5zLCBEKTsgLy8gNVxuICAgIGxldCBzXyA9IG1vZChzICogcjApOyAvLyA2XG4gICAgaWYgKCFpc05lZ2F0aXZlTEUoc18sIFApKVxuICAgICAgICBzXyA9IG1vZCgtc18pO1xuICAgIGlmICghTnNfRF9pc19zcSlcbiAgICAgICAgcyA9IHNfOyAvLyA3XG4gICAgaWYgKCFOc19EX2lzX3NxKVxuICAgICAgICBjID0gcjsgLy8gOFxuICAgIGNvbnN0IE50ID0gbW9kKGMgKiAociAtIF8xbikgKiBEX01JTlVTX09ORV9TUSAtIEQpOyAvLyA5XG4gICAgY29uc3QgczIgPSBzICogcztcbiAgICBjb25zdCBXMCA9IG1vZCgocyArIHMpICogRCk7IC8vIDEwXG4gICAgY29uc3QgVzEgPSBtb2QoTnQgKiBTUVJUX0FEX01JTlVTX09ORSk7IC8vIDExXG4gICAgY29uc3QgVzIgPSBtb2QoXzFuIC0gczIpOyAvLyAxMlxuICAgIGNvbnN0IFczID0gbW9kKF8xbiArIHMyKTsgLy8gMTNcbiAgICByZXR1cm4gbmV3IGVkMjU1MTkuUG9pbnQobW9kKFcwICogVzMpLCBtb2QoVzIgKiBXMSksIG1vZChXMSAqIFczKSwgbW9kKFcwICogVzIpKTtcbn1cbmZ1bmN0aW9uIHJpc3RyZXR0bzI1NV9tYXAoYnl0ZXMpIHtcbiAgICBhYnl0ZXMoYnl0ZXMsIDY0KTtcbiAgICBjb25zdCByMSA9IGJ5dGVzMjU1VG9OdW1iZXJMRShieXRlcy5zdWJhcnJheSgwLCAzMikpO1xuICAgIGNvbnN0IFIxID0gY2FsY0VsbGlnYXRvclJpc3RyZXR0b01hcChyMSk7XG4gICAgY29uc3QgcjIgPSBieXRlczI1NVRvTnVtYmVyTEUoYnl0ZXMuc3ViYXJyYXkoMzIsIDY0KSk7XG4gICAgY29uc3QgUjIgPSBjYWxjRWxsaWdhdG9yUmlzdHJldHRvTWFwKHIyKTtcbiAgICByZXR1cm4gbmV3IF9SaXN0cmV0dG9Qb2ludChSMS5hZGQoUjIpKTtcbn1cbi8qKlxuICogV3JhcHBlciBvdmVyIEVkd2FyZHMgUG9pbnQgZm9yIHJpc3RyZXR0bzI1NS5cbiAqXG4gKiBFYWNoIGVkMjU1MTkvRXh0ZW5kZWRQb2ludCBoYXMgOCBkaWZmZXJlbnQgZXF1aXZhbGVudCBwb2ludHMuIFRoaXMgY2FuIGJlXG4gKiBhIHNvdXJjZSBvZiBidWdzIGZvciBwcm90b2NvbHMgbGlrZSByaW5nIHNpZ25hdHVyZXMuIFJpc3RyZXR0byB3YXMgY3JlYXRlZCB0byBzb2x2ZSB0aGlzLlxuICogUmlzdHJldHRvIHBvaW50IG9wZXJhdGVzIGluIFg6WTpaOlQgZXh0ZW5kZWQgY29vcmRpbmF0ZXMgbGlrZSBFeHRlbmRlZFBvaW50LFxuICogYnV0IGl0IHNob3VsZCB3b3JrIGluIGl0cyBvd24gbmFtZXNwYWNlOiBkbyBub3QgY29tYmluZSB0aG9zZSB0d28uXG4gKiBTZWUgW1JGQzk0OTZdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5NDk2KS5cbiAqL1xuY2xhc3MgX1Jpc3RyZXR0b1BvaW50IGV4dGVuZHMgUHJpbWVFZHdhcmRzUG9pbnQge1xuICAgIGNvbnN0cnVjdG9yKGVwKSB7XG4gICAgICAgIHN1cGVyKGVwKTtcbiAgICB9XG4gICAgc3RhdGljIGZyb21BZmZpbmUoYXApIHtcbiAgICAgICAgcmV0dXJuIG5ldyBfUmlzdHJldHRvUG9pbnQoZWQyNTUxOS5Qb2ludC5mcm9tQWZmaW5lKGFwKSk7XG4gICAgfVxuICAgIGFzc2VydFNhbWUob3RoZXIpIHtcbiAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBfUmlzdHJldHRvUG9pbnQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSaXN0cmV0dG9Qb2ludCBleHBlY3RlZCcpO1xuICAgIH1cbiAgICBpbml0KGVwKSB7XG4gICAgICAgIHJldHVybiBuZXcgX1Jpc3RyZXR0b1BvaW50KGVwKTtcbiAgICB9XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBgaW1wb3J0IHsgcmlzdHJldHRvMjU1X2hhc2hlciB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvZWQyNTUxOS5qcyc7YCAqL1xuICAgIHN0YXRpYyBoYXNoVG9DdXJ2ZShoZXgpIHtcbiAgICAgICAgcmV0dXJuIHJpc3RyZXR0bzI1NV9tYXAoZW5zdXJlQnl0ZXMoJ3Jpc3RyZXR0b0hhc2gnLCBoZXgsIDY0KSk7XG4gICAgfVxuICAgIHN0YXRpYyBmcm9tQnl0ZXMoYnl0ZXMpIHtcbiAgICAgICAgYWJ5dGVzKGJ5dGVzLCAzMik7XG4gICAgICAgIGNvbnN0IHsgYSwgZCB9ID0gZWQyNTUxOV9DVVJWRTtcbiAgICAgICAgY29uc3QgUCA9IGVkMjU1MTlfQ1VSVkVfcDtcbiAgICAgICAgY29uc3QgbW9kID0gKG4pID0+IEZwLmNyZWF0ZShuKTtcbiAgICAgICAgY29uc3QgcyA9IGJ5dGVzMjU1VG9OdW1iZXJMRShieXRlcyk7XG4gICAgICAgIC8vIDEuIENoZWNrIHRoYXQgc19ieXRlcyBpcyB0aGUgY2Fub25pY2FsIGVuY29kaW5nIG9mIGEgZmllbGQgZWxlbWVudCwgb3IgZWxzZSBhYm9ydC5cbiAgICAgICAgLy8gMy4gQ2hlY2sgdGhhdCBzIGlzIG5vbi1uZWdhdGl2ZSwgb3IgZWxzZSBhYm9ydFxuICAgICAgICBpZiAoIWVxdWFsQnl0ZXMoRnAudG9CeXRlcyhzKSwgYnl0ZXMpIHx8IGlzTmVnYXRpdmVMRShzLCBQKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCByaXN0cmV0dG8yNTUgZW5jb2RpbmcgMScpO1xuICAgICAgICBjb25zdCBzMiA9IG1vZChzICogcyk7XG4gICAgICAgIGNvbnN0IHUxID0gbW9kKF8xbiArIGEgKiBzMik7IC8vIDQgKGEgaXMgLTEpXG4gICAgICAgIGNvbnN0IHUyID0gbW9kKF8xbiAtIGEgKiBzMik7IC8vIDVcbiAgICAgICAgY29uc3QgdTFfMiA9IG1vZCh1MSAqIHUxKTtcbiAgICAgICAgY29uc3QgdTJfMiA9IG1vZCh1MiAqIHUyKTtcbiAgICAgICAgY29uc3QgdiA9IG1vZChhICogZCAqIHUxXzIgLSB1Ml8yKTsgLy8gNlxuICAgICAgICBjb25zdCB7IGlzVmFsaWQsIHZhbHVlOiBJIH0gPSBpbnZlcnRTcXJ0KG1vZCh2ICogdTJfMikpOyAvLyA3XG4gICAgICAgIGNvbnN0IER4ID0gbW9kKEkgKiB1Mik7IC8vIDhcbiAgICAgICAgY29uc3QgRHkgPSBtb2QoSSAqIER4ICogdik7IC8vIDlcbiAgICAgICAgbGV0IHggPSBtb2QoKHMgKyBzKSAqIER4KTsgLy8gMTBcbiAgICAgICAgaWYgKGlzTmVnYXRpdmVMRSh4LCBQKSlcbiAgICAgICAgICAgIHggPSBtb2QoLXgpOyAvLyAxMFxuICAgICAgICBjb25zdCB5ID0gbW9kKHUxICogRHkpOyAvLyAxMVxuICAgICAgICBjb25zdCB0ID0gbW9kKHggKiB5KTsgLy8gMTJcbiAgICAgICAgaWYgKCFpc1ZhbGlkIHx8IGlzTmVnYXRpdmVMRSh0LCBQKSB8fCB5ID09PSBfMG4pXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmlzdHJldHRvMjU1IGVuY29kaW5nIDInKTtcbiAgICAgICAgcmV0dXJuIG5ldyBfUmlzdHJldHRvUG9pbnQobmV3IGVkMjU1MTkuUG9pbnQoeCwgeSwgXzFuLCB0KSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENvbnZlcnRzIHJpc3RyZXR0by1lbmNvZGVkIHN0cmluZyB0byByaXN0cmV0dG8gcG9pbnQuXG4gICAgICogRGVzY3JpYmVkIGluIFtSRkM5NDk2XShodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjOTQ5NiNuYW1lLWRlY29kZSkuXG4gICAgICogQHBhcmFtIGhleCBSaXN0cmV0dG8tZW5jb2RlZCAzMiBieXRlcy4gTm90IGV2ZXJ5IDMyLWJ5dGUgc3RyaW5nIGlzIHZhbGlkIHJpc3RyZXR0byBlbmNvZGluZ1xuICAgICAqL1xuICAgIHN0YXRpYyBmcm9tSGV4KGhleCkge1xuICAgICAgICByZXR1cm4gX1Jpc3RyZXR0b1BvaW50LmZyb21CeXRlcyhlbnN1cmVCeXRlcygncmlzdHJldHRvSGV4JywgaGV4LCAzMikpO1xuICAgIH1cbiAgICBzdGF0aWMgbXNtKHBvaW50cywgc2NhbGFycykge1xuICAgICAgICByZXR1cm4gcGlwcGVuZ2VyKF9SaXN0cmV0dG9Qb2ludCwgZWQyNTUxOS5Qb2ludC5GbiwgcG9pbnRzLCBzY2FsYXJzKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRW5jb2RlcyByaXN0cmV0dG8gcG9pbnQgdG8gVWludDhBcnJheS5cbiAgICAgKiBEZXNjcmliZWQgaW4gW1JGQzk0OTZdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5NDk2I25hbWUtZW5jb2RlKS5cbiAgICAgKi9cbiAgICB0b0J5dGVzKCkge1xuICAgICAgICBsZXQgeyBYLCBZLCBaLCBUIH0gPSB0aGlzLmVwO1xuICAgICAgICBjb25zdCBQID0gZWQyNTUxOV9DVVJWRV9wO1xuICAgICAgICBjb25zdCBtb2QgPSAobikgPT4gRnAuY3JlYXRlKG4pO1xuICAgICAgICBjb25zdCB1MSA9IG1vZChtb2QoWiArIFkpICogbW9kKFogLSBZKSk7IC8vIDFcbiAgICAgICAgY29uc3QgdTIgPSBtb2QoWCAqIFkpOyAvLyAyXG4gICAgICAgIC8vIFNxdWFyZSByb290IGFsd2F5cyBleGlzdHNcbiAgICAgICAgY29uc3QgdTJzcSA9IG1vZCh1MiAqIHUyKTtcbiAgICAgICAgY29uc3QgeyB2YWx1ZTogaW52c3FydCB9ID0gaW52ZXJ0U3FydChtb2QodTEgKiB1MnNxKSk7IC8vIDNcbiAgICAgICAgY29uc3QgRDEgPSBtb2QoaW52c3FydCAqIHUxKTsgLy8gNFxuICAgICAgICBjb25zdCBEMiA9IG1vZChpbnZzcXJ0ICogdTIpOyAvLyA1XG4gICAgICAgIGNvbnN0IHpJbnYgPSBtb2QoRDEgKiBEMiAqIFQpOyAvLyA2XG4gICAgICAgIGxldCBEOyAvLyA3XG4gICAgICAgIGlmIChpc05lZ2F0aXZlTEUoVCAqIHpJbnYsIFApKSB7XG4gICAgICAgICAgICBsZXQgX3ggPSBtb2QoWSAqIFNRUlRfTTEpO1xuICAgICAgICAgICAgbGV0IF95ID0gbW9kKFggKiBTUVJUX00xKTtcbiAgICAgICAgICAgIFggPSBfeDtcbiAgICAgICAgICAgIFkgPSBfeTtcbiAgICAgICAgICAgIEQgPSBtb2QoRDEgKiBJTlZTUVJUX0FfTUlOVVNfRCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBEID0gRDI7IC8vIDhcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNOZWdhdGl2ZUxFKFggKiB6SW52LCBQKSlcbiAgICAgICAgICAgIFkgPSBtb2QoLVkpOyAvLyA5XG4gICAgICAgIGxldCBzID0gbW9kKChaIC0gWSkgKiBEKTsgLy8gMTAgKGNoZWNrIGZvb3RlcidzIG5vdGUsIG5vIHNxcnQoLWEpKVxuICAgICAgICBpZiAoaXNOZWdhdGl2ZUxFKHMsIFApKVxuICAgICAgICAgICAgcyA9IG1vZCgtcyk7XG4gICAgICAgIHJldHVybiBGcC50b0J5dGVzKHMpOyAvLyAxMVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDb21wYXJlcyB0d28gUmlzdHJldHRvIHBvaW50cy5cbiAgICAgKiBEZXNjcmliZWQgaW4gW1JGQzk0OTZdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmM5NDk2I25hbWUtZXF1YWxzKS5cbiAgICAgKi9cbiAgICBlcXVhbHMob3RoZXIpIHtcbiAgICAgICAgdGhpcy5hc3NlcnRTYW1lKG90aGVyKTtcbiAgICAgICAgY29uc3QgeyBYOiBYMSwgWTogWTEgfSA9IHRoaXMuZXA7XG4gICAgICAgIGNvbnN0IHsgWDogWDIsIFk6IFkyIH0gPSBvdGhlci5lcDtcbiAgICAgICAgY29uc3QgbW9kID0gKG4pID0+IEZwLmNyZWF0ZShuKTtcbiAgICAgICAgLy8gKHgxICogeTIgPT0geTEgKiB4MikgfCAoeTEgKiB5MiA9PSB4MSAqIHgyKVxuICAgICAgICBjb25zdCBvbmUgPSBtb2QoWDEgKiBZMikgPT09IG1vZChZMSAqIFgyKTtcbiAgICAgICAgY29uc3QgdHdvID0gbW9kKFkxICogWTIpID09PSBtb2QoWDEgKiBYMik7XG4gICAgICAgIHJldHVybiBvbmUgfHwgdHdvO1xuICAgIH1cbiAgICBpczAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVxdWFscyhfUmlzdHJldHRvUG9pbnQuWkVSTyk7XG4gICAgfVxufVxuLy8gRG8gTk9UIGNoYW5nZSBzeW50YXg6IHRoZSBmb2xsb3dpbmcgZ3ltbmFzdGljcyBpcyBkb25lLFxuLy8gYmVjYXVzZSB0eXBlc2NyaXB0IHN0cmlwcyBjb21tZW50cywgd2hpY2ggbWFrZXMgYnVuZGxlcnMgZGlzYWJsZSB0cmVlLXNoYWtpbmcuXG4vLyBwcmV0dGllci1pZ25vcmVcbl9SaXN0cmV0dG9Qb2ludC5CQVNFID0gXG4vKiBAX19QVVJFX18gKi8gKCgpID0+IG5ldyBfUmlzdHJldHRvUG9pbnQoZWQyNTUxOS5Qb2ludC5CQVNFKSkoKTtcbi8vIHByZXR0aWVyLWlnbm9yZVxuX1Jpc3RyZXR0b1BvaW50LlpFUk8gPSBcbi8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gbmV3IF9SaXN0cmV0dG9Qb2ludChlZDI1NTE5LlBvaW50LlpFUk8pKSgpO1xuLy8gcHJldHRpZXItaWdub3JlXG5fUmlzdHJldHRvUG9pbnQuRnAgPSBcbi8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gRnApKCk7XG4vLyBwcmV0dGllci1pZ25vcmVcbl9SaXN0cmV0dG9Qb2ludC5GbiA9IFxuLyogQF9fUFVSRV9fICovICgoKSA9PiBGbikoKTtcbmV4cG9ydCBjb25zdCByaXN0cmV0dG8yNTUgPSB7IFBvaW50OiBfUmlzdHJldHRvUG9pbnQgfTtcbi8qKiBIYXNoaW5nIHRvIHJpc3RyZXR0bzI1NSBwb2ludHMgLyBmaWVsZC4gUkZDIDkzODAgbWV0aG9kcy4gKi9cbmV4cG9ydCBjb25zdCByaXN0cmV0dG8yNTVfaGFzaGVyID0ge1xuICAgIGhhc2hUb0N1cnZlKG1zZywgb3B0aW9ucykge1xuICAgICAgICBjb25zdCBEU1QgPSBvcHRpb25zPy5EU1QgfHwgJ3Jpc3RyZXR0bzI1NV9YTUQ6U0hBLTUxMl9SMjU1TUFQX1JPXyc7XG4gICAgICAgIGNvbnN0IHhtZCA9IGV4cGFuZF9tZXNzYWdlX3htZChtc2csIERTVCwgNjQsIHNoYTUxMik7XG4gICAgICAgIHJldHVybiByaXN0cmV0dG8yNTVfbWFwKHhtZCk7XG4gICAgfSxcbiAgICBoYXNoVG9TY2FsYXIobXNnLCBvcHRpb25zID0geyBEU1Q6IF9EU1Rfc2NhbGFyIH0pIHtcbiAgICAgICAgY29uc3QgeG1kID0gZXhwYW5kX21lc3NhZ2VfeG1kKG1zZywgb3B0aW9ucy5EU1QsIDY0LCBzaGE1MTIpO1xuICAgICAgICByZXR1cm4gRm4uY3JlYXRlKGJ5dGVzVG9OdW1iZXJMRSh4bWQpKTtcbiAgICB9LFxufTtcbi8vIGV4cG9ydCBjb25zdCByaXN0cmV0dG8yNTVfb3ByZjogT1BSRiA9IGNyZWF0ZU9SUEYoe1xuLy8gICBuYW1lOiAncmlzdHJldHRvMjU1LVNIQTUxMicsXG4vLyAgIFBvaW50OiBSaXN0cmV0dG9Qb2ludCxcbi8vICAgaGFzaDogc2hhNTEyLFxuLy8gICBoYXNoVG9Hcm91cDogcmlzdHJldHRvMjU1X2hhc2hlci5oYXNoVG9DdXJ2ZSxcbi8vICAgaGFzaFRvU2NhbGFyOiByaXN0cmV0dG8yNTVfaGFzaGVyLmhhc2hUb1NjYWxhcixcbi8vIH0pO1xuLyoqXG4gKiBXZWlyZCAvIGJvZ3VzIHBvaW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gKiBBbGwgOCBlZDI1NTE5IHBvaW50cyBvZiA4LXRvcnNpb24gc3ViZ3JvdXAgY2FuIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBwb2ludFxuICogVCA9IGAyNmU4OTU4ZmMyYjIyN2IwNDVjM2Y0ODlmMmVmOThmMGQ1ZGZhYzA1ZDNjNjMzMzliMTM4MDI4ODZkNTNmYzA1YC5cbiAqIOKfqFTin6kgPSB7IE8sIFQsIDJULCAzVCwgNFQsIDVULCA2VCwgN1QgfVxuICovXG5leHBvcnQgY29uc3QgRUQyNTUxOV9UT1JTSU9OX1NVQkdST1VQID0gW1xuICAgICcwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnYzcxNzZhNzAzZDRkZDg0ZmJhM2MwYjc2MGQxMDY3MGYyYTIwNTNmYTJjMzljY2M2NGVjN2ZkNzc5MmFjMDM3YScsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODAnLFxuICAgICcyNmU4OTU4ZmMyYjIyN2IwNDVjM2Y0ODlmMmVmOThmMGQ1ZGZhYzA1ZDNjNjMzMzliMTM4MDI4ODZkNTNmYzA1JyxcbiAgICAnZWNmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmY3ZicsXG4gICAgJzI2ZTg5NThmYzJiMjI3YjA0NWMzZjQ4OWYyZWY5OGYwZDVkZmFjMDVkM2M2MzMzOWIxMzgwMjg4NmQ1M2ZjODUnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAnYzcxNzZhNzAzZDRkZDg0ZmJhM2MwYjc2MGQxMDY3MGYyYTIwNTNmYTJjMzljY2M2NGVjN2ZkNzc5MmFjMDNmYScsXG5dO1xuLyoqIEBkZXByZWNhdGVkIHVzZSBgZWQyNTUxOS51dGlscy50b01vbnRnb21lcnlgICovXG5leHBvcnQgZnVuY3Rpb24gZWR3YXJkc1RvTW9udGdvbWVyeVB1YihlZHdhcmRzUHViKSB7XG4gICAgcmV0dXJuIGVkMjU1MTkudXRpbHMudG9Nb250Z29tZXJ5KGVuc3VyZUJ5dGVzKCdwdWInLCBlZHdhcmRzUHViKSk7XG59XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGBlZDI1NTE5LnV0aWxzLnRvTW9udGdvbWVyeWAgKi9cbmV4cG9ydCBjb25zdCBlZHdhcmRzVG9Nb250Z29tZXJ5ID0gZWR3YXJkc1RvTW9udGdvbWVyeVB1Yjtcbi8qKiBAZGVwcmVjYXRlZCB1c2UgYGVkMjU1MTkudXRpbHMudG9Nb250Z29tZXJ5U2VjcmV0YCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVkd2FyZHNUb01vbnRnb21lcnlQcml2KGVkd2FyZHNQcml2KSB7XG4gICAgcmV0dXJuIGVkMjU1MTkudXRpbHMudG9Nb250Z29tZXJ5U2VjcmV0KGVuc3VyZUJ5dGVzKCdwdWInLCBlZHdhcmRzUHJpdikpO1xufVxuLyoqIEBkZXByZWNhdGVkIHVzZSBgcmlzdHJldHRvMjU1LlBvaW50YCAqL1xuZXhwb3J0IGNvbnN0IFJpc3RyZXR0b1BvaW50ID0gX1Jpc3RyZXR0b1BvaW50O1xuLyoqIEBkZXByZWNhdGVkIHVzZSBgaW1wb3J0IHsgZWQyNTUxOV9oYXNoZXIgfSBmcm9tICdAbm9ibGUvY3VydmVzL2VkMjU1MTkuanMnO2AgKi9cbmV4cG9ydCBjb25zdCBoYXNoVG9DdXJ2ZSA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gZWQyNTUxOV9oYXNoZXIuaGFzaFRvQ3VydmUpKCk7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGBpbXBvcnQgeyBlZDI1NTE5X2hhc2hlciB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvZWQyNTUxOS5qcyc7YCAqL1xuZXhwb3J0IGNvbnN0IGVuY29kZVRvQ3VydmUgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IGVkMjU1MTlfaGFzaGVyLmVuY29kZVRvQ3VydmUpKCk7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGBpbXBvcnQgeyByaXN0cmV0dG8yNTVfaGFzaGVyIH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9lZDI1NTE5LmpzJztgICovXG5leHBvcnQgY29uc3QgaGFzaFRvUmlzdHJldHRvMjU1ID0gLyogQF9fUFVSRV9fICovICgoKSA9PiByaXN0cmV0dG8yNTVfaGFzaGVyLmhhc2hUb0N1cnZlKSgpO1xuLyoqIEBkZXByZWNhdGVkIHVzZSBgaW1wb3J0IHsgcmlzdHJldHRvMjU1X2hhc2hlciB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvZWQyNTUxOS5qcyc7YCAqL1xuZXhwb3J0IGNvbnN0IGhhc2hfdG9fcmlzdHJldHRvMjU1ID0gLyogQF9fUFVSRV9fICovICgoKSA9PiByaXN0cmV0dG8yNTVfaGFzaGVyLmhhc2hUb0N1cnZlKSgpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZWQyNTUxOS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/ed25519.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/secp256k1.js":
/*!*****************************************************!*\
  !*** ./node_modules/@noble/curves/esm/secp256k1.js ***!
  \*****************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   encodeToCurve: () => (/* binding */ encodeToCurve),\n/* harmony export */   hashToCurve: () => (/* binding */ hashToCurve),\n/* harmony export */   schnorr: () => (/* binding */ schnorr),\n/* harmony export */   secp256k1: () => (/* binding */ secp256k1),\n/* harmony export */   secp256k1_hasher: () => (/* binding */ secp256k1_hasher)\n/* harmony export */ });\n/* harmony import */ var _noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @noble/hashes/sha2.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/sha2.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/* harmony import */ var _shortw_utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./_shortw_utils.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/_shortw_utils.js\");\n/* harmony import */ var _abstract_hash_to_curve_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./abstract/hash-to-curve.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/hash-to-curve.js\");\n/* harmony import */ var _abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./abstract/modular.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/modular.js\");\n/* harmony import */ var _abstract_weierstrass_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./abstract/weierstrass.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/weierstrass.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./utils.js */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js\");\n/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism ψ,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n\n\n\n\n\n\n// Seems like generator was produced from some seed:\n// `Point.BASE.multiply(Point.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE = {\n    p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n    n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n    h: BigInt(1),\n    a: BigInt(0),\n    b: BigInt(7),\n    Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n    Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\nconst secp256k1_ENDO = {\n    beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n    basises: [\n        [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n        [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n    ],\n};\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y) {\n    const P = secp256k1_CURVE.p;\n    // prettier-ignore\n    const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n    // prettier-ignore\n    const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n    const b2 = (y * y * y) % P; // x^3, 11\n    const b3 = (b2 * b2 * y) % P; // x^7\n    const b6 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b3, _3n, P) * b3) % P;\n    const b9 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b6, _3n, P) * b3) % P;\n    const b11 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b9, _2n, P) * b2) % P;\n    const b22 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b11, _11n, P) * b11) % P;\n    const b44 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b22, _22n, P) * b22) % P;\n    const b88 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b44, _44n, P) * b44) % P;\n    const b176 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b88, _88n, P) * b88) % P;\n    const b220 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b176, _44n, P) * b44) % P;\n    const b223 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b220, _3n, P) * b3) % P;\n    const t1 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(b223, _23n, P) * b22) % P;\n    const t2 = ((0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(t1, _6n, P) * b2) % P;\n    const root = (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.pow2)(t2, _2n, P);\n    if (!Fpk1.eql(Fpk1.sqr(root), y))\n        throw new Error('Cannot find square root');\n    return root;\n}\nconst Fpk1 = (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.Field)(secp256k1_CURVE.p, { sqrt: sqrtMod });\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * const msg = new TextEncoder().encode('hello');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey) === true;\n * ```\n */\nconst secp256k1 = (0,_shortw_utils_js__WEBPACK_IMPORTED_MODULE_1__.createCurve)({ ...secp256k1_CURVE, Fp: Fpk1, lowS: true, endo: secp256k1_ENDO }, _noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_2__.sha256);\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES = {};\nfunction taggedHash(tag, ...messages) {\n    let tagP = TAGGED_HASH_PREFIXES[tag];\n    if (tagP === undefined) {\n        const tagH = (0,_noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_2__.sha256)((0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.utf8ToBytes)(tag));\n        tagP = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.concatBytes)(tagH, tagH);\n        TAGGED_HASH_PREFIXES[tag] = tagP;\n    }\n    return (0,_noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_2__.sha256)((0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.concatBytes)(tagP, ...messages));\n}\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point) => point.toBytes(true).slice(1);\nconst Pointk1 = /* @__PURE__ */ (() => secp256k1.Point)();\nconst hasEven = (y) => y % _2n === _0n;\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv) {\n    const { Fn, BASE } = Pointk1;\n    const d_ = (0,_abstract_weierstrass_js__WEBPACK_IMPORTED_MODULE_4__._normFnElement)(Fn, priv);\n    const p = BASE.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside\n    const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n    return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x) {\n    const Fp = Fpk1;\n    if (!Fp.isValidNot0(x))\n        throw new Error('invalid x: Fail if x ≥ p');\n    const xx = Fp.create(x * x);\n    const c = Fp.create(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n    let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n    // Return the unique point P such that x(P) = x and\n    // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n    if (!hasEven(y))\n        y = Fp.neg(y);\n    const p = Pointk1.fromAffine({ x, y });\n    p.assertValidity();\n    return p;\n}\nconst num = _utils_js__WEBPACK_IMPORTED_MODULE_5__.bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args) {\n    return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey) {\n    return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(message, secretKey, auxRand = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.randomBytes)(32)) {\n    const { Fn } = Pointk1;\n    const m = (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.ensureBytes)('message', message);\n    const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n    const a = (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.ensureBytes)('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n    const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n    const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n    // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'⋅G\n    const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n    const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n    const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n    sig.set(rx, 0);\n    sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n    // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n    if (!schnorrVerify(sig, m, px))\n        throw new Error('sign: Invalid signature produced');\n    return sig;\n}\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature, message, publicKey) {\n    const { Fn, BASE } = Pointk1;\n    const sig = (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.ensureBytes)('signature', signature, 64);\n    const m = (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.ensureBytes)('message', message);\n    const pub = (0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.ensureBytes)('publicKey', publicKey, 32);\n    try {\n        const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n        const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n        if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.inRange)(r, _1n, secp256k1_CURVE.p))\n            return false;\n        const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n        if (!(0,_utils_js__WEBPACK_IMPORTED_MODULE_5__.inRange)(s, _1n, secp256k1_CURVE.n))\n            return false;\n        // int(challenge(bytes(r)||bytes(P)||m))%n\n        const e = challenge(Fn.toBytes(r), pointToBytes(P), m);\n        // R = s⋅G - e⋅P, where -eP == (n-e)P\n        const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n        const { x, y } = R.toAffine();\n        // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n        if (R.is0() || !hasEven(y) || x !== r)\n            return false;\n        return true;\n    }\n    catch (error) {\n        return false;\n    }\n}\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nconst schnorr = /* @__PURE__ */ (() => {\n    const size = 32;\n    const seedLength = 48;\n    const randomSecretKey = (seed = (0,_utils_js__WEBPACK_IMPORTED_MODULE_3__.randomBytes)(seedLength)) => {\n        return (0,_abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mapHashToField)(seed, secp256k1_CURVE.n);\n    };\n    // TODO: remove\n    secp256k1.utils.randomSecretKey;\n    function keygen(seed) {\n        const secretKey = randomSecretKey(seed);\n        return { secretKey, publicKey: schnorrGetPublicKey(secretKey) };\n    }\n    return {\n        keygen,\n        getPublicKey: schnorrGetPublicKey,\n        sign: schnorrSign,\n        verify: schnorrVerify,\n        Point: Pointk1,\n        utils: {\n            randomSecretKey: randomSecretKey,\n            randomPrivateKey: randomSecretKey,\n            taggedHash,\n            // TODO: remove\n            lift_x,\n            pointToBytes,\n            numberToBytesBE: _utils_js__WEBPACK_IMPORTED_MODULE_5__.numberToBytesBE,\n            bytesToNumberBE: _utils_js__WEBPACK_IMPORTED_MODULE_5__.bytesToNumberBE,\n            mod: _abstract_modular_js__WEBPACK_IMPORTED_MODULE_0__.mod,\n        },\n        lengths: {\n            secretKey: size,\n            publicKey: size,\n            publicKeyHasPrefix: false,\n            signature: size * 2,\n            seed: seedLength,\n        },\n    };\n})();\nconst isoMap = /* @__PURE__ */ (() => (0,_abstract_hash_to_curve_js__WEBPACK_IMPORTED_MODULE_6__.isogenyMap)(Fpk1, [\n    // xNum\n    [\n        '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n        '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n        '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n        '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n    ],\n    // xDen\n    [\n        '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n        '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n        '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n    ],\n    // yNum\n    [\n        '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n        '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n        '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n        '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n    ],\n    // yDen\n    [\n        '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n        '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n        '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n        '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n    ],\n].map((i) => i.map((j) => BigInt(j)))))();\nconst mapSWU = /* @__PURE__ */ (() => (0,_abstract_weierstrass_js__WEBPACK_IMPORTED_MODULE_4__.mapToCurveSimpleSWU)(Fpk1, {\n    A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n    B: BigInt('1771'),\n    Z: Fpk1.create(BigInt('-11')),\n}))();\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nconst secp256k1_hasher = /* @__PURE__ */ (() => (0,_abstract_hash_to_curve_js__WEBPACK_IMPORTED_MODULE_6__.createHasher)(secp256k1.Point, (scalars) => {\n    const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n    return isoMap(x, y);\n}, {\n    DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n    encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n    p: Fpk1.ORDER,\n    m: 1,\n    k: 128,\n    expand: 'xmd',\n    hash: _noble_hashes_sha2_js__WEBPACK_IMPORTED_MODULE_2__.sha256,\n}))();\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nconst hashToCurve = /* @__PURE__ */ (() => secp256k1_hasher.hashToCurve)();\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nconst encodeToCurve = /* @__PURE__ */ (() => secp256k1_hasher.encodeToCurve)();\n//# sourceMappingURL=secp256k1.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS9zZWNwMjU2azEuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHVCQUF1QjtBQUNyQztBQUNBO0FBQ0E7QUFDK0M7QUFDTTtBQUNKO0FBQ3VCO0FBQ0M7QUFDUTtBQUM4QjtBQUMvRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDLGtDQUFrQztBQUNsQyxnQkFBZ0IsMERBQUk7QUFDcEIsZ0JBQWdCLDBEQUFJO0FBQ3BCLGlCQUFpQiwwREFBSTtBQUNyQixpQkFBaUIsMERBQUk7QUFDckIsaUJBQWlCLDBEQUFJO0FBQ3JCLGlCQUFpQiwwREFBSTtBQUNyQixrQkFBa0IsMERBQUk7QUFDdEIsa0JBQWtCLDBEQUFJO0FBQ3RCLGtCQUFrQiwwREFBSTtBQUN0QixnQkFBZ0IsMERBQUk7QUFDcEIsZ0JBQWdCLDBEQUFJO0FBQ3BCLGlCQUFpQiwwREFBSTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsMkRBQUssc0JBQXNCLGVBQWU7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEIsV0FBVyx1QkFBdUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGtCQUFrQiw2REFBVyxHQUFHLGdFQUFnRSxFQUFFLHlEQUFNO0FBQy9HO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLDZEQUFNLENBQUMsc0RBQVc7QUFDdkMsZUFBZSxzREFBVztBQUMxQjtBQUNBO0FBQ0EsV0FBVyw2REFBTSxDQUFDLHNEQUFXO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxXQUFXO0FBQ3ZCLGVBQWUsd0VBQWM7QUFDN0IsaUNBQWlDLGFBQWE7QUFDOUM7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0Msd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLE1BQU07QUFDekM7QUFDQTtBQUNBO0FBQ0EsWUFBWSxzREFBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRDtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1ELHNEQUFXO0FBQzlELFlBQVksS0FBSztBQUNqQixjQUFjLHNEQUFXO0FBQ3pCLFlBQVksdUJBQXVCLGtDQUFrQztBQUNyRSxjQUFjLHNEQUFXLDBCQUEwQjtBQUNuRCxpRUFBaUU7QUFDakUsd0RBQXdEO0FBQ3hEO0FBQ0EsWUFBWSx1QkFBdUI7QUFDbkMsb0NBQW9DO0FBQ3BDLG9DQUFvQztBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFdBQVc7QUFDdkIsZ0JBQWdCLHNEQUFXO0FBQzNCLGNBQWMsc0RBQVc7QUFDekIsZ0JBQWdCLHNEQUFXO0FBQzNCO0FBQ0Esb0NBQW9DLHdCQUF3QjtBQUM1RCw0Q0FBNEMsMkJBQTJCO0FBQ3ZFLGFBQWEsa0RBQU87QUFDcEI7QUFDQSw2Q0FBNkMsNEJBQTRCO0FBQ3pFLGFBQWEsa0RBQU87QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixPQUFPO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEIsV0FBVyx1QkFBdUI7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0Esb0NBQW9DLHNEQUFXO0FBQy9DLGVBQWUsb0VBQWM7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCO0FBQzNCLDJCQUEyQjtBQUMzQixlQUFlO0FBQ2YsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLENBQUM7QUFDRCxzQ0FBc0Msc0VBQVU7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsNkVBQW1CO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNPLGdEQUFnRCx3RUFBWTtBQUNuRSxZQUFZLE9BQU87QUFDbkI7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVSx5REFBTTtBQUNoQixDQUFDO0FBQ0QsOEJBQThCLG1CQUFtQixrQ0FBa0M7QUFDNUU7QUFDUCw4QkFBOEIsbUJBQW1CLGtDQUFrQztBQUM1RTtBQUNQIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0Bub2JsZS9jdXJ2ZXMvZXNtL3NlY3AyNTZrMS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFNFQ0cgc2VjcDI1NmsxLiBTZWUgW3BkZl0oaHR0cHM6Ly93d3cuc2VjZy5vcmcvc2VjMi12Mi5wZGYpLlxuICpcbiAqIEJlbG9uZ3MgdG8gS29ibGl0eiBjdXJ2ZXM6IGl0IGhhcyBlZmZpY2llbnRseS1jb21wdXRhYmxlIEdMViBlbmRvbW9ycGhpc20gz4gsXG4gKiBjaGVjayBvdXQge0BsaW5rIEVuZG9tb3JwaGlzbU9wdHN9LiBTZWVtcyB0byBiZSByaWdpZCAobm90IGJhY2tkb29yZWQpLlxuICogQG1vZHVsZVxuICovXG4vKiEgbm9ibGUtY3VydmVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG5pbXBvcnQgeyBzaGEyNTYgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3NoYTIuanMnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3V0aWxzLmpzJztcbmltcG9ydCB7IGNyZWF0ZUN1cnZlIH0gZnJvbSBcIi4vX3Nob3J0d191dGlscy5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaGVyLCBpc29nZW55TWFwLCB9IGZyb20gXCIuL2Fic3RyYWN0L2hhc2gtdG8tY3VydmUuanNcIjtcbmltcG9ydCB7IEZpZWxkLCBtYXBIYXNoVG9GaWVsZCwgbW9kLCBwb3cyIH0gZnJvbSBcIi4vYWJzdHJhY3QvbW9kdWxhci5qc1wiO1xuaW1wb3J0IHsgX25vcm1GbkVsZW1lbnQsIG1hcFRvQ3VydmVTaW1wbGVTV1UsIH0gZnJvbSBcIi4vYWJzdHJhY3Qvd2VpZXJzdHJhc3MuanNcIjtcbmltcG9ydCB7IGJ5dGVzVG9OdW1iZXJCRSwgY29uY2F0Qnl0ZXMsIGVuc3VyZUJ5dGVzLCBpblJhbmdlLCBudW1iZXJUb0J5dGVzQkUsIHV0ZjhUb0J5dGVzLCB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG4vLyBTZWVtcyBsaWtlIGdlbmVyYXRvciB3YXMgcHJvZHVjZWQgZnJvbSBzb21lIHNlZWQ6XG4vLyBgUG9pbnQuQkFTRS5tdWx0aXBseShQb2ludC5Gbi5pbnYoMm4sIE4pKS50b0FmZmluZSgpLnhgXG4vLyAvLyBnaXZlcyBzaG9ydCB4IDB4M2I3OGNlNTYzZjg5YTBlZDk0MTRmNWFhMjhhZDBkOTZkNjc5NWY5YzYzblxuY29uc3Qgc2VjcDI1NmsxX0NVUlZFID0ge1xuICAgIHA6IEJpZ0ludCgnMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWZmZmZmYzJmJyksXG4gICAgbjogQmlnSW50KCcweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZlYmFhZWRjZTZhZjQ4YTAzYmJmZDI1ZThjZDAzNjQxNDEnKSxcbiAgICBoOiBCaWdJbnQoMSksXG4gICAgYTogQmlnSW50KDApLFxuICAgIGI6IEJpZ0ludCg3KSxcbiAgICBHeDogQmlnSW50KCcweDc5YmU2NjdlZjlkY2JiYWM1NWEwNjI5NWNlODcwYjA3MDI5YmZjZGIyZGNlMjhkOTU5ZjI4MTViMTZmODE3OTgnKSxcbiAgICBHeTogQmlnSW50KCcweDQ4M2FkYTc3MjZhM2M0NjU1ZGE0ZmJmYzBlMTEwOGE4ZmQxN2I0NDhhNjg1NTQxOTljNDdkMDhmZmIxMGQ0YjgnKSxcbn07XG5jb25zdCBzZWNwMjU2azFfRU5ETyA9IHtcbiAgICBiZXRhOiBCaWdJbnQoJzB4N2FlOTZhMmI2NTdjMDcxMDZlNjQ0NzllYWMzNDM0ZTk5Y2YwNDk3NTEyZjU4OTk1YzEzOTZjMjg3MTk1MDFlZScpLFxuICAgIGJhc2lzZXM6IFtcbiAgICAgICAgW0JpZ0ludCgnMHgzMDg2ZDIyMWE3ZDQ2YmNkZTg2YzkwZTQ5Mjg0ZWIxNScpLCAtQmlnSW50KCcweGU0NDM3ZWQ2MDEwZTg4Mjg2ZjU0N2ZhOTBhYmZlNGMzJyldLFxuICAgICAgICBbQmlnSW50KCcweDExNGNhNTBmN2E4ZTJmM2Y2NTdjMTEwOGQ5ZDQ0Y2ZkOCcpLCBCaWdJbnQoJzB4MzA4NmQyMjFhN2Q0NmJjZGU4NmM5MGU0OTI4NGViMTUnKV0sXG4gICAgXSxcbn07XG5jb25zdCBfMG4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDApO1xuY29uc3QgXzFuID0gLyogQF9fUFVSRV9fICovIEJpZ0ludCgxKTtcbmNvbnN0IF8ybiA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMik7XG4vKipcbiAqIOKImm4gPSBuXigocCsxKS80KSBmb3IgZmllbGRzIHAgPSAzIG1vZCA0LiBXZSB1bndyYXAgdGhlIGxvb3AgYW5kIG11bHRpcGx5IGJpdC1ieS1iaXQuXG4gKiAoUCsxbi80bikudG9TdHJpbmcoMikgd291bGQgcHJvZHVjZSBiaXRzIFsyMjN4IDEsIDAsIDIyeCAxLCA0eCAwLCAxMSwgMDBdXG4gKi9cbmZ1bmN0aW9uIHNxcnRNb2QoeSkge1xuICAgIGNvbnN0IFAgPSBzZWNwMjU2azFfQ1VSVkUucDtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBjb25zdCBfM24gPSBCaWdJbnQoMyksIF82biA9IEJpZ0ludCg2KSwgXzExbiA9IEJpZ0ludCgxMSksIF8yMm4gPSBCaWdJbnQoMjIpO1xuICAgIC8vIHByZXR0aWVyLWlnbm9yZVxuICAgIGNvbnN0IF8yM24gPSBCaWdJbnQoMjMpLCBfNDRuID0gQmlnSW50KDQ0KSwgXzg4biA9IEJpZ0ludCg4OCk7XG4gICAgY29uc3QgYjIgPSAoeSAqIHkgKiB5KSAlIFA7IC8vIHheMywgMTFcbiAgICBjb25zdCBiMyA9IChiMiAqIGIyICogeSkgJSBQOyAvLyB4XjdcbiAgICBjb25zdCBiNiA9IChwb3cyKGIzLCBfM24sIFApICogYjMpICUgUDtcbiAgICBjb25zdCBiOSA9IChwb3cyKGI2LCBfM24sIFApICogYjMpICUgUDtcbiAgICBjb25zdCBiMTEgPSAocG93MihiOSwgXzJuLCBQKSAqIGIyKSAlIFA7XG4gICAgY29uc3QgYjIyID0gKHBvdzIoYjExLCBfMTFuLCBQKSAqIGIxMSkgJSBQO1xuICAgIGNvbnN0IGI0NCA9IChwb3cyKGIyMiwgXzIybiwgUCkgKiBiMjIpICUgUDtcbiAgICBjb25zdCBiODggPSAocG93MihiNDQsIF80NG4sIFApICogYjQ0KSAlIFA7XG4gICAgY29uc3QgYjE3NiA9IChwb3cyKGI4OCwgXzg4biwgUCkgKiBiODgpICUgUDtcbiAgICBjb25zdCBiMjIwID0gKHBvdzIoYjE3NiwgXzQ0biwgUCkgKiBiNDQpICUgUDtcbiAgICBjb25zdCBiMjIzID0gKHBvdzIoYjIyMCwgXzNuLCBQKSAqIGIzKSAlIFA7XG4gICAgY29uc3QgdDEgPSAocG93MihiMjIzLCBfMjNuLCBQKSAqIGIyMikgJSBQO1xuICAgIGNvbnN0IHQyID0gKHBvdzIodDEsIF82biwgUCkgKiBiMikgJSBQO1xuICAgIGNvbnN0IHJvb3QgPSBwb3cyKHQyLCBfMm4sIFApO1xuICAgIGlmICghRnBrMS5lcWwoRnBrMS5zcXIocm9vdCksIHkpKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBmaW5kIHNxdWFyZSByb290Jyk7XG4gICAgcmV0dXJuIHJvb3Q7XG59XG5jb25zdCBGcGsxID0gRmllbGQoc2VjcDI1NmsxX0NVUlZFLnAsIHsgc3FydDogc3FydE1vZCB9KTtcbi8qKlxuICogc2VjcDI1NmsxIGN1cnZlLCBFQ0RTQSBhbmQgRUNESCBtZXRob2RzLlxuICpcbiAqIEZpZWxkOiBgMm4qKjI1Nm4gLSAybioqMzJuIC0gMm4qKjluIC0gMm4qKjhuIC0gMm4qKjduIC0gMm4qKjZuIC0gMm4qKjRuIC0gMW5gXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGpzXG4gKiBpbXBvcnQgeyBzZWNwMjU2azEgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMSc7XG4gKiBjb25zdCB7IHNlY3JldEtleSwgcHVibGljS2V5IH0gPSBzZWNwMjU2azEua2V5Z2VuKCk7XG4gKiBjb25zdCBtc2cgPSBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoJ2hlbGxvJyk7XG4gKiBjb25zdCBzaWcgPSBzZWNwMjU2azEuc2lnbihtc2csIHNlY3JldEtleSk7XG4gKiBjb25zdCBpc1ZhbGlkID0gc2VjcDI1NmsxLnZlcmlmeShzaWcsIG1zZywgcHVibGljS2V5KSA9PT0gdHJ1ZTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc2VjcDI1NmsxID0gY3JlYXRlQ3VydmUoeyAuLi5zZWNwMjU2azFfQ1VSVkUsIEZwOiBGcGsxLCBsb3dTOiB0cnVlLCBlbmRvOiBzZWNwMjU2azFfRU5ETyB9LCBzaGEyNTYpO1xuLy8gU2Nobm9yciBzaWduYXR1cmVzIGFyZSBzdXBlcmlvciB0byBFQ0RTQSBmcm9tIGFib3ZlLiBCZWxvdyBpcyBTY2hub3JyLXNwZWNpZmljIEJJUDAzNDAgY29kZS5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iaXRjb2luL2JpcHMvYmxvYi9tYXN0ZXIvYmlwLTAzNDAubWVkaWF3aWtpXG4vKiogQW4gb2JqZWN0IG1hcHBpbmcgdGFncyB0byB0aGVpciB0YWdnZWQgaGFzaCBwcmVmaXggb2YgW1NIQTI1Nih0YWcpIHwgU0hBMjU2KHRhZyldICovXG5jb25zdCBUQUdHRURfSEFTSF9QUkVGSVhFUyA9IHt9O1xuZnVuY3Rpb24gdGFnZ2VkSGFzaCh0YWcsIC4uLm1lc3NhZ2VzKSB7XG4gICAgbGV0IHRhZ1AgPSBUQUdHRURfSEFTSF9QUkVGSVhFU1t0YWddO1xuICAgIGlmICh0YWdQID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdGFnSCA9IHNoYTI1Nih1dGY4VG9CeXRlcyh0YWcpKTtcbiAgICAgICAgdGFnUCA9IGNvbmNhdEJ5dGVzKHRhZ0gsIHRhZ0gpO1xuICAgICAgICBUQUdHRURfSEFTSF9QUkVGSVhFU1t0YWddID0gdGFnUDtcbiAgICB9XG4gICAgcmV0dXJuIHNoYTI1Nihjb25jYXRCeXRlcyh0YWdQLCAuLi5tZXNzYWdlcykpO1xufVxuLy8gRUNEU0EgY29tcGFjdCBwb2ludHMgYXJlIDMzLWJ5dGUuIFNjaG5vcnIgaXMgMzI6IHdlIHN0cmlwIGZpcnN0IGJ5dGUgMHgwMiBvciAweDAzXG5jb25zdCBwb2ludFRvQnl0ZXMgPSAocG9pbnQpID0+IHBvaW50LnRvQnl0ZXModHJ1ZSkuc2xpY2UoMSk7XG5jb25zdCBQb2ludGsxID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBzZWNwMjU2azEuUG9pbnQpKCk7XG5jb25zdCBoYXNFdmVuID0gKHkpID0+IHkgJSBfMm4gPT09IF8wbjtcbi8vIENhbGN1bGF0ZSBwb2ludCwgc2NhbGFyIGFuZCBieXRlc1xuZnVuY3Rpb24gc2Nobm9yckdldEV4dFB1YktleShwcml2KSB7XG4gICAgY29uc3QgeyBGbiwgQkFTRSB9ID0gUG9pbnRrMTtcbiAgICBjb25zdCBkXyA9IF9ub3JtRm5FbGVtZW50KEZuLCBwcml2KTtcbiAgICBjb25zdCBwID0gQkFTRS5tdWx0aXBseShkXyk7IC8vIFAgPSBkJ+KLhUc7IDAgPCBkJyA8IG4gY2hlY2sgaXMgZG9uZSBpbnNpZGVcbiAgICBjb25zdCBzY2FsYXIgPSBoYXNFdmVuKHAueSkgPyBkXyA6IEZuLm5lZyhkXyk7XG4gICAgcmV0dXJuIHsgc2NhbGFyLCBieXRlczogcG9pbnRUb0J5dGVzKHApIH07XG59XG4vKipcbiAqIGxpZnRfeCBmcm9tIEJJUDM0MC4gQ29udmVydCAzMi1ieXRlIHggY29vcmRpbmF0ZSB0byBlbGxpcHRpYyBjdXJ2ZSBwb2ludC5cbiAqIEByZXR1cm5zIHZhbGlkIHBvaW50IGNoZWNrZWQgZm9yIGJlaW5nIG9uLWN1cnZlXG4gKi9cbmZ1bmN0aW9uIGxpZnRfeCh4KSB7XG4gICAgY29uc3QgRnAgPSBGcGsxO1xuICAgIGlmICghRnAuaXNWYWxpZE5vdDAoeCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCB4OiBGYWlsIGlmIHgg4omlIHAnKTtcbiAgICBjb25zdCB4eCA9IEZwLmNyZWF0ZSh4ICogeCk7XG4gICAgY29uc3QgYyA9IEZwLmNyZWF0ZSh4eCAqIHggKyBCaWdJbnQoNykpOyAvLyBMZXQgYyA9IHjCsyArIDcgbW9kIHAuXG4gICAgbGV0IHkgPSBGcC5zcXJ0KGMpOyAvLyBMZXQgeSA9IGNeKHArMSkvNCBtb2QgcC4gU2FtZSBhcyBzcXJ0KCkuXG4gICAgLy8gUmV0dXJuIHRoZSB1bmlxdWUgcG9pbnQgUCBzdWNoIHRoYXQgeChQKSA9IHggYW5kXG4gICAgLy8geShQKSA9IHkgaWYgeSBtb2QgMiA9IDAgb3IgeShQKSA9IHAteSBvdGhlcndpc2UuXG4gICAgaWYgKCFoYXNFdmVuKHkpKVxuICAgICAgICB5ID0gRnAubmVnKHkpO1xuICAgIGNvbnN0IHAgPSBQb2ludGsxLmZyb21BZmZpbmUoeyB4LCB5IH0pO1xuICAgIHAuYXNzZXJ0VmFsaWRpdHkoKTtcbiAgICByZXR1cm4gcDtcbn1cbmNvbnN0IG51bSA9IGJ5dGVzVG9OdW1iZXJCRTtcbi8qKlxuICogQ3JlYXRlIHRhZ2dlZCBoYXNoLCBjb252ZXJ0IGl0IHRvIGJpZ2ludCwgcmVkdWNlIG1vZHVsby1uLlxuICovXG5mdW5jdGlvbiBjaGFsbGVuZ2UoLi4uYXJncykge1xuICAgIHJldHVybiBQb2ludGsxLkZuLmNyZWF0ZShudW0odGFnZ2VkSGFzaCgnQklQMDM0MC9jaGFsbGVuZ2UnLCAuLi5hcmdzKSkpO1xufVxuLyoqXG4gKiBTY2hub3JyIHB1YmxpYyBrZXkgaXMganVzdCBgeGAgY29vcmRpbmF0ZSBvZiBQb2ludCBhcyBwZXIgQklQMzQwLlxuICovXG5mdW5jdGlvbiBzY2hub3JyR2V0UHVibGljS2V5KHNlY3JldEtleSkge1xuICAgIHJldHVybiBzY2hub3JyR2V0RXh0UHViS2V5KHNlY3JldEtleSkuYnl0ZXM7IC8vIGQnPWludChzaykuIEZhaWwgaWYgZCc9MCBvciBkJ+KJpW4uIFJldCBieXRlcyhkJ+KLhUcpXG59XG4vKipcbiAqIENyZWF0ZXMgU2Nobm9yciBzaWduYXR1cmUgYXMgcGVyIEJJUDM0MC4gVmVyaWZpZXMgaXRzZWxmIGJlZm9yZSByZXR1cm5pbmcgYW55dGhpbmcuXG4gKiBhdXhSYW5kIGlzIG9wdGlvbmFsIGFuZCBpcyBub3QgdGhlIHNvbGUgc291cmNlIG9mIGsgZ2VuZXJhdGlvbjogYmFkIENTUFJORyB3b24ndCBiZSBkYW5nZXJvdXMuXG4gKi9cbmZ1bmN0aW9uIHNjaG5vcnJTaWduKG1lc3NhZ2UsIHNlY3JldEtleSwgYXV4UmFuZCA9IHJhbmRvbUJ5dGVzKDMyKSkge1xuICAgIGNvbnN0IHsgRm4gfSA9IFBvaW50azE7XG4gICAgY29uc3QgbSA9IGVuc3VyZUJ5dGVzKCdtZXNzYWdlJywgbWVzc2FnZSk7XG4gICAgY29uc3QgeyBieXRlczogcHgsIHNjYWxhcjogZCB9ID0gc2Nobm9yckdldEV4dFB1YktleShzZWNyZXRLZXkpOyAvLyBjaGVja3MgZm9yIGlzV2l0aGluQ3VydmVPcmRlclxuICAgIGNvbnN0IGEgPSBlbnN1cmVCeXRlcygnYXV4UmFuZCcsIGF1eFJhbmQsIDMyKTsgLy8gQXV4aWxpYXJ5IHJhbmRvbSBkYXRhIGE6IGEgMzItYnl0ZSBhcnJheVxuICAgIGNvbnN0IHQgPSBGbi50b0J5dGVzKGQgXiBudW0odGFnZ2VkSGFzaCgnQklQMDM0MC9hdXgnLCBhKSkpOyAvLyBMZXQgdCBiZSB0aGUgYnl0ZS13aXNlIHhvciBvZiBieXRlcyhkKSBhbmQgaGFzaC9hdXgoYSlcbiAgICBjb25zdCByYW5kID0gdGFnZ2VkSGFzaCgnQklQMDM0MC9ub25jZScsIHQsIHB4LCBtKTsgLy8gTGV0IHJhbmQgPSBoYXNoL25vbmNlKHQgfHwgYnl0ZXMoUCkgfHwgbSlcbiAgICAvLyBMZXQgaycgPSBpbnQocmFuZCkgbW9kIG4uIEZhaWwgaWYgaycgPSAwLiBMZXQgUiA9IGsn4ouFR1xuICAgIGNvbnN0IHsgYnl0ZXM6IHJ4LCBzY2FsYXI6IGsgfSA9IHNjaG5vcnJHZXRFeHRQdWJLZXkocmFuZCk7XG4gICAgY29uc3QgZSA9IGNoYWxsZW5nZShyeCwgcHgsIG0pOyAvLyBMZXQgZSA9IGludChoYXNoL2NoYWxsZW5nZShieXRlcyhSKSB8fCBieXRlcyhQKSB8fCBtKSkgbW9kIG4uXG4gICAgY29uc3Qgc2lnID0gbmV3IFVpbnQ4QXJyYXkoNjQpOyAvLyBMZXQgc2lnID0gYnl0ZXMoUikgfHwgYnl0ZXMoKGsgKyBlZCkgbW9kIG4pLlxuICAgIHNpZy5zZXQocngsIDApO1xuICAgIHNpZy5zZXQoRm4udG9CeXRlcyhGbi5jcmVhdGUoayArIGUgKiBkKSksIDMyKTtcbiAgICAvLyBJZiBWZXJpZnkoYnl0ZXMoUCksIG0sIHNpZykgKHNlZSBiZWxvdykgcmV0dXJucyBmYWlsdXJlLCBhYm9ydFxuICAgIGlmICghc2Nobm9yclZlcmlmeShzaWcsIG0sIHB4KSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzaWduOiBJbnZhbGlkIHNpZ25hdHVyZSBwcm9kdWNlZCcpO1xuICAgIHJldHVybiBzaWc7XG59XG4vKipcbiAqIFZlcmlmaWVzIFNjaG5vcnIgc2lnbmF0dXJlLlxuICogV2lsbCBzd2FsbG93IGVycm9ycyAmIHJldHVybiBmYWxzZSBleGNlcHQgZm9yIGluaXRpYWwgdHlwZSB2YWxpZGF0aW9uIG9mIGFyZ3VtZW50cy5cbiAqL1xuZnVuY3Rpb24gc2Nobm9yclZlcmlmeShzaWduYXR1cmUsIG1lc3NhZ2UsIHB1YmxpY0tleSkge1xuICAgIGNvbnN0IHsgRm4sIEJBU0UgfSA9IFBvaW50azE7XG4gICAgY29uc3Qgc2lnID0gZW5zdXJlQnl0ZXMoJ3NpZ25hdHVyZScsIHNpZ25hdHVyZSwgNjQpO1xuICAgIGNvbnN0IG0gPSBlbnN1cmVCeXRlcygnbWVzc2FnZScsIG1lc3NhZ2UpO1xuICAgIGNvbnN0IHB1YiA9IGVuc3VyZUJ5dGVzKCdwdWJsaWNLZXknLCBwdWJsaWNLZXksIDMyKTtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBQID0gbGlmdF94KG51bShwdWIpKTsgLy8gUCA9IGxpZnRfeChpbnQocGspKTsgZmFpbCBpZiB0aGF0IGZhaWxzXG4gICAgICAgIGNvbnN0IHIgPSBudW0oc2lnLnN1YmFycmF5KDAsIDMyKSk7IC8vIExldCByID0gaW50KHNpZ1swOjMyXSk7IGZhaWwgaWYgciDiiaUgcC5cbiAgICAgICAgaWYgKCFpblJhbmdlKHIsIF8xbiwgc2VjcDI1NmsxX0NVUlZFLnApKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBzID0gbnVtKHNpZy5zdWJhcnJheSgzMiwgNjQpKTsgLy8gTGV0IHMgPSBpbnQoc2lnWzMyOjY0XSk7IGZhaWwgaWYgcyDiiaUgbi5cbiAgICAgICAgaWYgKCFpblJhbmdlKHMsIF8xbiwgc2VjcDI1NmsxX0NVUlZFLm4pKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBpbnQoY2hhbGxlbmdlKGJ5dGVzKHIpfHxieXRlcyhQKXx8bSkpJW5cbiAgICAgICAgY29uc3QgZSA9IGNoYWxsZW5nZShGbi50b0J5dGVzKHIpLCBwb2ludFRvQnl0ZXMoUCksIG0pO1xuICAgICAgICAvLyBSID0gc+KLhUcgLSBl4ouFUCwgd2hlcmUgLWVQID09IChuLWUpUFxuICAgICAgICBjb25zdCBSID0gQkFTRS5tdWx0aXBseVVuc2FmZShzKS5hZGQoUC5tdWx0aXBseVVuc2FmZShGbi5uZWcoZSkpKTtcbiAgICAgICAgY29uc3QgeyB4LCB5IH0gPSBSLnRvQWZmaW5lKCk7XG4gICAgICAgIC8vIEZhaWwgaWYgaXNfaW5maW5pdGUoUikgLyBub3QgaGFzX2V2ZW5feShSKSAvIHgoUikg4omgIHIuXG4gICAgICAgIGlmIChSLmlzMCgpIHx8ICFoYXNFdmVuKHkpIHx8IHggIT09IHIpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbi8qKlxuICogU2Nobm9yciBzaWduYXR1cmVzIG92ZXIgc2VjcDI1NmsxLlxuICogaHR0cHM6Ly9naXRodWIuY29tL2JpdGNvaW4vYmlwcy9ibG9iL21hc3Rlci9iaXAtMDM0MC5tZWRpYXdpa2lcbiAqIEBleGFtcGxlXG4gKiBgYGBqc1xuICogaW1wb3J0IHsgc2Nobm9yciB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvc2VjcDI1NmsxJztcbiAqIGNvbnN0IHsgc2VjcmV0S2V5LCBwdWJsaWNLZXkgfSA9IHNjaG5vcnIua2V5Z2VuKCk7XG4gKiAvLyBjb25zdCBwdWJsaWNLZXkgPSBzY2hub3JyLmdldFB1YmxpY0tleShzZWNyZXRLZXkpO1xuICogY29uc3QgbXNnID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKCdoZWxsbycpO1xuICogY29uc3Qgc2lnID0gc2Nobm9yci5zaWduKG1zZywgc2VjcmV0S2V5KTtcbiAqIGNvbnN0IGlzVmFsaWQgPSBzY2hub3JyLnZlcmlmeShzaWcsIG1zZywgcHVibGljS2V5KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc2Nobm9yciA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4ge1xuICAgIGNvbnN0IHNpemUgPSAzMjtcbiAgICBjb25zdCBzZWVkTGVuZ3RoID0gNDg7XG4gICAgY29uc3QgcmFuZG9tU2VjcmV0S2V5ID0gKHNlZWQgPSByYW5kb21CeXRlcyhzZWVkTGVuZ3RoKSkgPT4ge1xuICAgICAgICByZXR1cm4gbWFwSGFzaFRvRmllbGQoc2VlZCwgc2VjcDI1NmsxX0NVUlZFLm4pO1xuICAgIH07XG4gICAgLy8gVE9ETzogcmVtb3ZlXG4gICAgc2VjcDI1NmsxLnV0aWxzLnJhbmRvbVNlY3JldEtleTtcbiAgICBmdW5jdGlvbiBrZXlnZW4oc2VlZCkge1xuICAgICAgICBjb25zdCBzZWNyZXRLZXkgPSByYW5kb21TZWNyZXRLZXkoc2VlZCk7XG4gICAgICAgIHJldHVybiB7IHNlY3JldEtleSwgcHVibGljS2V5OiBzY2hub3JyR2V0UHVibGljS2V5KHNlY3JldEtleSkgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAga2V5Z2VuLFxuICAgICAgICBnZXRQdWJsaWNLZXk6IHNjaG5vcnJHZXRQdWJsaWNLZXksXG4gICAgICAgIHNpZ246IHNjaG5vcnJTaWduLFxuICAgICAgICB2ZXJpZnk6IHNjaG5vcnJWZXJpZnksXG4gICAgICAgIFBvaW50OiBQb2ludGsxLFxuICAgICAgICB1dGlsczoge1xuICAgICAgICAgICAgcmFuZG9tU2VjcmV0S2V5OiByYW5kb21TZWNyZXRLZXksXG4gICAgICAgICAgICByYW5kb21Qcml2YXRlS2V5OiByYW5kb21TZWNyZXRLZXksXG4gICAgICAgICAgICB0YWdnZWRIYXNoLFxuICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlXG4gICAgICAgICAgICBsaWZ0X3gsXG4gICAgICAgICAgICBwb2ludFRvQnl0ZXMsXG4gICAgICAgICAgICBudW1iZXJUb0J5dGVzQkUsXG4gICAgICAgICAgICBieXRlc1RvTnVtYmVyQkUsXG4gICAgICAgICAgICBtb2QsXG4gICAgICAgIH0sXG4gICAgICAgIGxlbmd0aHM6IHtcbiAgICAgICAgICAgIHNlY3JldEtleTogc2l6ZSxcbiAgICAgICAgICAgIHB1YmxpY0tleTogc2l6ZSxcbiAgICAgICAgICAgIHB1YmxpY0tleUhhc1ByZWZpeDogZmFsc2UsXG4gICAgICAgICAgICBzaWduYXR1cmU6IHNpemUgKiAyLFxuICAgICAgICAgICAgc2VlZDogc2VlZExlbmd0aCxcbiAgICAgICAgfSxcbiAgICB9O1xufSkoKTtcbmNvbnN0IGlzb01hcCA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gaXNvZ2VueU1hcChGcGsxLCBbXG4gICAgLy8geE51bVxuICAgIFtcbiAgICAgICAgJzB4OGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGUzOGRhYWFhYThjNycsXG4gICAgICAgICcweDdkM2Q0YzgwYmMzMjFkNWI5ZjMxNWNlYTdmZDQ0YzVkNTk1ZDJmYzBiZjYzYjkyZGZmZjEwNDRmMTdjNjU4MScsXG4gICAgICAgICcweDUzNGMzMjhkMjNmMjM0ZTZlMmE0MTNkZWNhMjVjYWVjZTQ1MDYxNDQwMzdjNDAzMTRlY2JkMGI1M2Q5ZGQyNjInLFxuICAgICAgICAnMHg4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZTM4ZGFhYWFhODhjJyxcbiAgICBdLFxuICAgIC8vIHhEZW5cbiAgICBbXG4gICAgICAgICcweGQzNTc3MTE5M2Q5NDkxOGE5Y2EzNGNjYmI3YjY0MGRkODZjZDQwOTU0MmY4NDg3ZDlmZTZiNzQ1NzgxZWI0OWInLFxuICAgICAgICAnMHhlZGFkYzZmNjQzODNkYzFkZjdjNGIyZDUxYjU0MjI1NDA2ZDM2YjY0MWY1ZTQxYmJjNTJhNTY2MTJhOGM2ZDE0JyxcbiAgICAgICAgJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScsIC8vIExBU1QgMVxuICAgIF0sXG4gICAgLy8geU51bVxuICAgIFtcbiAgICAgICAgJzB4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGJkYTEyZjY4NGI4ZTM4ZTIzYycsXG4gICAgICAgICcweGM3NWUwYzMyZDVjYjdjMGZhOWQwYTU0YjEyYTBhNmQ1NjQ3YWIwNDZkNjg2ZGE2ZmRmZmM5MGZjMjAxZDcxYTMnLFxuICAgICAgICAnMHgyOWE2MTk0NjkxZjkxYTczNzE1MjA5ZWY2NTEyZTU3NjcyMjgzMGEyMDFiZTIwMThhNzY1ZTg1YTllY2VlOTMxJyxcbiAgICAgICAgJzB4MmY2ODRiZGExMmY2ODRiZGExMmY2ODRiZGExMmY2ODRiZGExMmY2ODRiZGExMmY2ODRiZGExMmYzOGUzOGQ4NCcsXG4gICAgXSxcbiAgICAvLyB5RGVuXG4gICAgW1xuICAgICAgICAnMHhmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZWZmZmZmOTNiJyxcbiAgICAgICAgJzB4N2EwNjUzNGJiOGJkYjQ5ZmQ1ZTllNjYzMjcyMmMyOTg5NDY3YzFiZmM4ZThkOTc4ZGZiNDI1ZDI2ODVjMjU3MycsXG4gICAgICAgICcweDY0ODRhYTcxNjU0NWNhMmNmM2E3MGMzZmE4ZmUzMzdlMGEzZDIxMTYyZjBkNjI5OWE3YmY4MTkyYmZkMmE3NmYnLFxuICAgICAgICAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJywgLy8gTEFTVCAxXG4gICAgXSxcbl0ubWFwKChpKSA9PiBpLm1hcCgoaikgPT4gQmlnSW50KGopKSkpKSgpO1xuY29uc3QgbWFwU1dVID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBtYXBUb0N1cnZlU2ltcGxlU1dVKEZwazEsIHtcbiAgICBBOiBCaWdJbnQoJzB4M2Y4NzMxYWJkZDY2MWFkY2EwOGE1NTU4ZjBmNWQyNzJlOTUzZDM2M2NiNmYwZTVkNDA1NDQ3YzAxYTQ0NDUzMycpLFxuICAgIEI6IEJpZ0ludCgnMTc3MScpLFxuICAgIFo6IEZwazEuY3JlYXRlKEJpZ0ludCgnLTExJykpLFxufSkpKCk7XG4vKiogSGFzaGluZyAvIGVuY29kaW5nIHRvIHNlY3AyNTZrMSBwb2ludHMgLyBmaWVsZC4gUkZDIDkzODAgbWV0aG9kcy4gKi9cbmV4cG9ydCBjb25zdCBzZWNwMjU2azFfaGFzaGVyID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBjcmVhdGVIYXNoZXIoc2VjcDI1NmsxLlBvaW50LCAoc2NhbGFycykgPT4ge1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gbWFwU1dVKEZwazEuY3JlYXRlKHNjYWxhcnNbMF0pKTtcbiAgICByZXR1cm4gaXNvTWFwKHgsIHkpO1xufSwge1xuICAgIERTVDogJ3NlY3AyNTZrMV9YTUQ6U0hBLTI1Nl9TU1dVX1JPXycsXG4gICAgZW5jb2RlRFNUOiAnc2VjcDI1NmsxX1hNRDpTSEEtMjU2X1NTV1VfTlVfJyxcbiAgICBwOiBGcGsxLk9SREVSLFxuICAgIG06IDEsXG4gICAgazogMTI4LFxuICAgIGV4cGFuZDogJ3htZCcsXG4gICAgaGFzaDogc2hhMjU2LFxufSkpKCk7XG4vKiogQGRlcHJlY2F0ZWQgdXNlIGBpbXBvcnQgeyBzZWNwMjU2azFfaGFzaGVyIH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9zZWNwMjU2azEuanMnO2AgKi9cbmV4cG9ydCBjb25zdCBoYXNoVG9DdXJ2ZSA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gc2VjcDI1NmsxX2hhc2hlci5oYXNoVG9DdXJ2ZSkoKTtcbi8qKiBAZGVwcmVjYXRlZCB1c2UgYGltcG9ydCB7IHNlY3AyNTZrMV9oYXNoZXIgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMS5qcyc7YCAqL1xuZXhwb3J0IGNvbnN0IGVuY29kZVRvQ3VydmUgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHNlY3AyNTZrMV9oYXNoZXIuZW5jb2RlVG9DdXJ2ZSkoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNlY3AyNTZrMS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/secp256k1.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js":
/*!*************************************************!*\
  !*** ./node_modules/@noble/curves/esm/utils.js ***!
  \*************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   _abool2: () => (/* binding */ _abool2),\n/* harmony export */   _abytes2: () => (/* binding */ _abytes2),\n/* harmony export */   _validateObject: () => (/* binding */ _validateObject),\n/* harmony export */   aInRange: () => (/* binding */ aInRange),\n/* harmony export */   abool: () => (/* binding */ abool),\n/* harmony export */   abytes: () => (/* reexport safe */ _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.abytes),\n/* harmony export */   anumber: () => (/* reexport safe */ _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.anumber),\n/* harmony export */   asciiToBytes: () => (/* binding */ asciiToBytes),\n/* harmony export */   bitGet: () => (/* binding */ bitGet),\n/* harmony export */   bitLen: () => (/* binding */ bitLen),\n/* harmony export */   bitMask: () => (/* binding */ bitMask),\n/* harmony export */   bitSet: () => (/* binding */ bitSet),\n/* harmony export */   bytesToHex: () => (/* reexport safe */ _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToHex),\n/* harmony export */   bytesToNumberBE: () => (/* binding */ bytesToNumberBE),\n/* harmony export */   bytesToNumberLE: () => (/* binding */ bytesToNumberLE),\n/* harmony export */   bytesToUtf8: () => (/* reexport safe */ _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToUtf8),\n/* harmony export */   concatBytes: () => (/* reexport safe */ _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.concatBytes),\n/* harmony export */   copyBytes: () => (/* binding */ copyBytes),\n/* harmony export */   createHmacDrbg: () => (/* binding */ createHmacDrbg),\n/* harmony export */   ensureBytes: () => (/* binding */ ensureBytes),\n/* harmony export */   equalBytes: () => (/* binding */ equalBytes),\n/* harmony export */   hexToBytes: () => (/* reexport safe */ _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.hexToBytes),\n/* harmony export */   hexToNumber: () => (/* binding */ hexToNumber),\n/* harmony export */   inRange: () => (/* binding */ inRange),\n/* harmony export */   isBytes: () => (/* reexport safe */ _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBytes),\n/* harmony export */   isHash: () => (/* binding */ isHash),\n/* harmony export */   memoized: () => (/* binding */ memoized),\n/* harmony export */   notImplemented: () => (/* binding */ notImplemented),\n/* harmony export */   numberToBytesBE: () => (/* binding */ numberToBytesBE),\n/* harmony export */   numberToBytesLE: () => (/* binding */ numberToBytesLE),\n/* harmony export */   numberToHexUnpadded: () => (/* binding */ numberToHexUnpadded),\n/* harmony export */   numberToVarBytesBE: () => (/* binding */ numberToVarBytesBE),\n/* harmony export */   randomBytes: () => (/* reexport safe */ _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.randomBytes),\n/* harmony export */   utf8ToBytes: () => (/* reexport safe */ _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.utf8ToBytes),\n/* harmony export */   validateObject: () => (/* binding */ validateObject)\n/* harmony export */ });\n/* harmony import */ var _noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @noble/hashes/utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nfunction abool(title, value) {\n    if (typeof value !== 'boolean')\n        throw new Error(title + ' boolean expected, got ' + value);\n}\n// tmp name until v2\nfunction _abool2(value, title = '') {\n    if (typeof value !== 'boolean') {\n        const prefix = title && `\"${title}\"`;\n        throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n    }\n    return value;\n}\n// tmp name until v2\n/** Asserts something is Uint8Array. */\nfunction _abytes2(value, length, title = '') {\n    const bytes = (0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBytes)(value);\n    const len = value?.length;\n    const needsLen = length !== undefined;\n    if (!bytes || (needsLen && len !== length)) {\n        const prefix = title && `\"${title}\" `;\n        const ofLen = needsLen ? ` of length ${length}` : '';\n        const got = bytes ? `length=${len}` : `type=${typeof value}`;\n        throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n    }\n    return value;\n}\n// Used in weierstrass, der\nfunction numberToHexUnpadded(num) {\n    const hex = num.toString(16);\n    return hex.length & 1 ? '0' + hex : hex;\n}\nfunction hexToNumber(hex) {\n    if (typeof hex !== 'string')\n        throw new Error('hex string expected, got ' + typeof hex);\n    return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n// BE: Big Endian, LE: Little Endian\nfunction bytesToNumberBE(bytes) {\n    return hexToNumber((0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToHex)(bytes));\n}\nfunction bytesToNumberLE(bytes) {\n    (0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.abytes)(bytes);\n    return hexToNumber((0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.bytesToHex)(Uint8Array.from(bytes).reverse()));\n}\nfunction numberToBytesBE(n, len) {\n    return (0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.hexToBytes)(n.toString(16).padStart(len * 2, '0'));\n}\nfunction numberToBytesLE(n, len) {\n    return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nfunction numberToVarBytesBE(n) {\n    return (0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.hexToBytes)(numberToHexUnpadded(n));\n}\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'secret key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nfunction ensureBytes(title, hex, expectedLength) {\n    let res;\n    if (typeof hex === 'string') {\n        try {\n            res = (0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.hexToBytes)(hex);\n        }\n        catch (e) {\n            throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n        }\n    }\n    else if ((0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBytes)(hex)) {\n        // Uint8Array.from() instead of hash.slice() because node.js Buffer\n        // is instance of Uint8Array, and its slice() creates **mutable** copy\n        res = Uint8Array.from(hex);\n    }\n    else {\n        throw new Error(title + ' must be hex string or Uint8Array');\n    }\n    const len = res.length;\n    if (typeof expectedLength === 'number' && len !== expectedLength)\n        throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n    return res;\n}\n// Compares 2 u8a-s in kinda constant time\nfunction equalBytes(a, b) {\n    if (a.length !== b.length)\n        return false;\n    let diff = 0;\n    for (let i = 0; i < a.length; i++)\n        diff |= a[i] ^ b[i];\n    return diff === 0;\n}\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nfunction copyBytes(bytes) {\n    return Uint8Array.from(bytes);\n}\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as utf8ToBytes for ASCII or throws.\n */\nfunction asciiToBytes(ascii) {\n    return Uint8Array.from(ascii, (c, i) => {\n        const charCode = c.charCodeAt(0);\n        if (c.length !== 1 || charCode > 127) {\n            throw new Error(`string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`);\n        }\n        return charCode;\n    });\n}\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\n// export const utf8ToBytes: typeof utf8ToBytes_ = utf8ToBytes_;\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\n// export const bytesToUtf8: typeof bytesToUtf8_ = bytesToUtf8_;\n// Is positive bigint\nconst isPosBig = (n) => typeof n === 'bigint' && _0n <= n;\nfunction inRange(n, min, max) {\n    return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nfunction aInRange(title, n, min, max) {\n    // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n    // consider P=256n, min=0n, max=P\n    // - a for min=0 would require -1:          `inRange('x', x, -1n, P)`\n    // - b would commonly require subtraction:  `inRange('x', x, 0n, P - 1n)`\n    // - our way is the cleanest:               `inRange('x', x, 0n, P)\n    if (!inRange(n, min, max))\n        throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n// Bit operations\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nfunction bitLen(n) {\n    let len;\n    for (len = 0; n > _0n; n >>= _1n, len += 1)\n        ;\n    return len;\n}\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nfunction bitGet(n, pos) {\n    return (n >> BigInt(pos)) & _1n;\n}\n/**\n * Sets single bit at position.\n */\nfunction bitSet(n, pos, value) {\n    return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nconst bitMask = (n) => (_1n << BigInt(n)) - _1n;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n *   const drbg = createHmacDRBG<Key>(32, 32, hmac);\n *   drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nfunction createHmacDrbg(hashLen, qByteLen, hmacFn) {\n    if (typeof hashLen !== 'number' || hashLen < 2)\n        throw new Error('hashLen must be a number');\n    if (typeof qByteLen !== 'number' || qByteLen < 2)\n        throw new Error('qByteLen must be a number');\n    if (typeof hmacFn !== 'function')\n        throw new Error('hmacFn must be a function');\n    // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n    const u8n = (len) => new Uint8Array(len); // creates Uint8Array\n    const u8of = (byte) => Uint8Array.of(byte); // another shortcut\n    let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n    let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n    let i = 0; // Iterations counter, will throw when over 1000\n    const reset = () => {\n        v.fill(1);\n        k.fill(0);\n        i = 0;\n    };\n    const h = (...b) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n    const reseed = (seed = u8n(0)) => {\n        // HMAC-DRBG reseed() function. Steps D-G\n        k = h(u8of(0x00), seed); // k = hmac(k || v || 0x00 || seed)\n        v = h(); // v = hmac(k || v)\n        if (seed.length === 0)\n            return;\n        k = h(u8of(0x01), seed); // k = hmac(k || v || 0x01 || seed)\n        v = h(); // v = hmac(k || v)\n    };\n    const gen = () => {\n        // HMAC-DRBG generate() function\n        if (i++ >= 1000)\n            throw new Error('drbg: tried 1000 values');\n        let len = 0;\n        const out = [];\n        while (len < qByteLen) {\n            v = h();\n            const sl = v.slice();\n            out.push(sl);\n            len += v.length;\n        }\n        return (0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.concatBytes)(...out);\n    };\n    const genUntil = (seed, pred) => {\n        reset();\n        reseed(seed); // Steps D-G\n        let res = undefined; // Step H: grind until k is in [1..n-1]\n        while (!(res = pred(gen())))\n            reseed();\n        reset();\n        return res;\n    };\n    return genUntil;\n}\n// Validating curves and fields\nconst validatorFns = {\n    bigint: (val) => typeof val === 'bigint',\n    function: (val) => typeof val === 'function',\n    boolean: (val) => typeof val === 'boolean',\n    string: (val) => typeof val === 'string',\n    stringOrUint8Array: (val) => typeof val === 'string' || (0,_noble_hashes_utils_js__WEBPACK_IMPORTED_MODULE_0__.isBytes)(val),\n    isSafeInteger: (val) => Number.isSafeInteger(val),\n    array: (val) => Array.isArray(val),\n    field: (val, object) => object.Fp.isValid(val),\n    hash: (val) => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n};\n// type Record<K extends string | number | symbol, T> = { [P in K]: T; }\nfunction validateObject(object, validators, optValidators = {}) {\n    const checkField = (fieldName, type, isOptional) => {\n        const checkVal = validatorFns[type];\n        if (typeof checkVal !== 'function')\n            throw new Error('invalid validator function');\n        const val = object[fieldName];\n        if (isOptional && val === undefined)\n            return;\n        if (!checkVal(val, object)) {\n            throw new Error('param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val);\n        }\n    };\n    for (const [fieldName, type] of Object.entries(validators))\n        checkField(fieldName, type, false);\n    for (const [fieldName, type] of Object.entries(optValidators))\n        checkField(fieldName, type, true);\n    return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\nfunction isHash(val) {\n    return typeof val === 'function' && Number.isSafeInteger(val.outputLen);\n}\nfunction _validateObject(object, fields, optFields = {}) {\n    if (!object || typeof object !== 'object')\n        throw new Error('expected valid options object');\n    function checkField(fieldName, expectedType, isOpt) {\n        const val = object[fieldName];\n        if (isOpt && val === undefined)\n            return;\n        const current = typeof val;\n        if (current !== expectedType || val === null)\n            throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n    }\n    Object.entries(fields).forEach(([k, v]) => checkField(k, v, false));\n    Object.entries(optFields).forEach(([k, v]) => checkField(k, v, true));\n}\n/**\n * throws not implemented error\n */\nconst notImplemented = () => {\n    throw new Error('not implemented');\n};\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nfunction memoized(fn) {\n    const map = new WeakMap();\n    return (arg, ...args) => {\n        const val = map.get(arg);\n        if (val !== undefined)\n            return val;\n        const computed = fn(arg, ...args);\n        map.set(arg, computed);\n        return computed;\n    };\n}\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvY3VydmVzL2VzbS91dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ29LO0FBQ3JCO0FBQy9JO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLG9DQUFvQyxNQUFNO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1Asa0JBQWtCLCtEQUFRO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLG9DQUFvQyxNQUFNO0FBQzFDLCtDQUErQyxPQUFPO0FBQ3RELHNDQUFzQyxJQUFJLFlBQVksYUFBYTtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxrREFBa0Q7QUFDbEQ7QUFDQTtBQUNPO0FBQ1AsdUJBQXVCLGtFQUFXO0FBQ2xDO0FBQ087QUFDUCxJQUFJLDhEQUFPO0FBQ1gsdUJBQXVCLGtFQUFXO0FBQ2xDO0FBQ087QUFDUCxXQUFXLGtFQUFXO0FBQ3RCO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQLFdBQVcsa0VBQVc7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixrRUFBVztBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSwrREFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGNBQWM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxvRUFBb0UsU0FBUyxjQUFjLFVBQVUsY0FBYyxFQUFFO0FBQ3JIO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDRCQUE0QjtBQUNuRDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QjtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEM7QUFDOUMsZ0RBQWdEO0FBQ2hELDBCQUEwQjtBQUMxQiwwQkFBMEI7QUFDMUIsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGlDQUFpQztBQUNqQyxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG1FQUFZO0FBQzNCO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjtBQUN0Qiw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0REFBNEQsK0RBQVE7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRDtBQUNuRCw4REFBOEQ7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxXQUFXLFdBQVcsWUFBWSxJQUFJO0FBQ3BELGtDQUFrQyxvQkFBb0IsSUFBSSxhQUFhLEdBQUc7QUFDMUU7QUFDQSxrQ0FBa0MsVUFBVSxJQUFJLFNBQVM7QUFDekQsa0NBQWtDLG9CQUFvQixJQUFJLFNBQVM7QUFDbkUsa0NBQWtDLDJCQUEyQjtBQUM3RCxrQ0FBa0Msd0JBQXdCO0FBQ25EO0FBQ1A7QUFDQTtBQUNPLHVEQUF1RDtBQUM5RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFVBQVUseUJBQXlCLGFBQWEsUUFBUSxRQUFRO0FBQ3RHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5vYmxlL2N1cnZlcy9lc20vdXRpbHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIZXgsIGJ5dGVzIGFuZCBudW1iZXIgdXRpbGl0aWVzLlxuICogQG1vZHVsZVxuICovXG4vKiEgbm9ibGUtY3VydmVzIC0gTUlUIExpY2Vuc2UgKGMpIDIwMjIgUGF1bCBNaWxsZXIgKHBhdWxtaWxsci5jb20pICovXG5pbXBvcnQgeyBhYnl0ZXMgYXMgYWJ5dGVzXywgYnl0ZXNUb0hleCBhcyBieXRlc1RvSGV4XywgY29uY2F0Qnl0ZXMgYXMgY29uY2F0Qnl0ZXNfLCBoZXhUb0J5dGVzIGFzIGhleFRvQnl0ZXNfLCBpc0J5dGVzIGFzIGlzQnl0ZXNfLCB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvdXRpbHMuanMnO1xuZXhwb3J0IHsgYWJ5dGVzLCBhbnVtYmVyLCBieXRlc1RvSGV4LCBieXRlc1RvVXRmOCwgY29uY2F0Qnl0ZXMsIGhleFRvQnl0ZXMsIGlzQnl0ZXMsIHJhbmRvbUJ5dGVzLCB1dGY4VG9CeXRlcywgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3V0aWxzLmpzJztcbmNvbnN0IF8wbiA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMCk7XG5jb25zdCBfMW4gPSAvKiBAX19QVVJFX18gKi8gQmlnSW50KDEpO1xuZXhwb3J0IGZ1bmN0aW9uIGFib29sKHRpdGxlLCB2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRpdGxlICsgJyBib29sZWFuIGV4cGVjdGVkLCBnb3QgJyArIHZhbHVlKTtcbn1cbi8vIHRtcCBuYW1lIHVudGlsIHYyXG5leHBvcnQgZnVuY3Rpb24gX2Fib29sMih2YWx1ZSwgdGl0bGUgPSAnJykge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykge1xuICAgICAgICBjb25zdCBwcmVmaXggPSB0aXRsZSAmJiBgXCIke3RpdGxlfVwiYDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHByZWZpeCArICdleHBlY3RlZCBib29sZWFuLCBnb3QgdHlwZT0nICsgdHlwZW9mIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuLy8gdG1wIG5hbWUgdW50aWwgdjJcbi8qKiBBc3NlcnRzIHNvbWV0aGluZyBpcyBVaW50OEFycmF5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9hYnl0ZXMyKHZhbHVlLCBsZW5ndGgsIHRpdGxlID0gJycpIHtcbiAgICBjb25zdCBieXRlcyA9IGlzQnl0ZXNfKHZhbHVlKTtcbiAgICBjb25zdCBsZW4gPSB2YWx1ZT8ubGVuZ3RoO1xuICAgIGNvbnN0IG5lZWRzTGVuID0gbGVuZ3RoICE9PSB1bmRlZmluZWQ7XG4gICAgaWYgKCFieXRlcyB8fCAobmVlZHNMZW4gJiYgbGVuICE9PSBsZW5ndGgpKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHRpdGxlICYmIGBcIiR7dGl0bGV9XCIgYDtcbiAgICAgICAgY29uc3Qgb2ZMZW4gPSBuZWVkc0xlbiA/IGAgb2YgbGVuZ3RoICR7bGVuZ3RofWAgOiAnJztcbiAgICAgICAgY29uc3QgZ290ID0gYnl0ZXMgPyBgbGVuZ3RoPSR7bGVufWAgOiBgdHlwZT0ke3R5cGVvZiB2YWx1ZX1gO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IocHJlZml4ICsgJ2V4cGVjdGVkIFVpbnQ4QXJyYXknICsgb2ZMZW4gKyAnLCBnb3QgJyArIGdvdCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cbi8vIFVzZWQgaW4gd2VpZXJzdHJhc3MsIGRlclxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclRvSGV4VW5wYWRkZWQobnVtKSB7XG4gICAgY29uc3QgaGV4ID0gbnVtLnRvU3RyaW5nKDE2KTtcbiAgICByZXR1cm4gaGV4Lmxlbmd0aCAmIDEgPyAnMCcgKyBoZXggOiBoZXg7XG59XG5leHBvcnQgZnVuY3Rpb24gaGV4VG9OdW1iZXIoaGV4KSB7XG4gICAgaWYgKHR5cGVvZiBoZXggIT09ICdzdHJpbmcnKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hleCBzdHJpbmcgZXhwZWN0ZWQsIGdvdCAnICsgdHlwZW9mIGhleCk7XG4gICAgcmV0dXJuIGhleCA9PT0gJycgPyBfMG4gOiBCaWdJbnQoJzB4JyArIGhleCk7IC8vIEJpZyBFbmRpYW5cbn1cbi8vIEJFOiBCaWcgRW5kaWFuLCBMRTogTGl0dGxlIEVuZGlhblxuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9OdW1iZXJCRShieXRlcykge1xuICAgIHJldHVybiBoZXhUb051bWJlcihieXRlc1RvSGV4XyhieXRlcykpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9OdW1iZXJMRShieXRlcykge1xuICAgIGFieXRlc18oYnl0ZXMpO1xuICAgIHJldHVybiBoZXhUb051bWJlcihieXRlc1RvSGV4XyhVaW50OEFycmF5LmZyb20oYnl0ZXMpLnJldmVyc2UoKSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG51bWJlclRvQnl0ZXNCRShuLCBsZW4pIHtcbiAgICByZXR1cm4gaGV4VG9CeXRlc18obi50b1N0cmluZygxNikucGFkU3RhcnQobGVuICogMiwgJzAnKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbnVtYmVyVG9CeXRlc0xFKG4sIGxlbikge1xuICAgIHJldHVybiBudW1iZXJUb0J5dGVzQkUobiwgbGVuKS5yZXZlcnNlKCk7XG59XG4vLyBVbnBhZGRlZCwgcmFyZWx5IHVzZWRcbmV4cG9ydCBmdW5jdGlvbiBudW1iZXJUb1ZhckJ5dGVzQkUobikge1xuICAgIHJldHVybiBoZXhUb0J5dGVzXyhudW1iZXJUb0hleFVucGFkZGVkKG4pKTtcbn1cbi8qKlxuICogVGFrZXMgaGV4IHN0cmluZyBvciBVaW50OEFycmF5LCBjb252ZXJ0cyB0byBVaW50OEFycmF5LlxuICogVmFsaWRhdGVzIG91dHB1dCBsZW5ndGguXG4gKiBXaWxsIHRocm93IGVycm9yIGZvciBvdGhlciB0eXBlcy5cbiAqIEBwYXJhbSB0aXRsZSBkZXNjcmlwdGl2ZSB0aXRsZSBmb3IgYW4gZXJyb3IgZS5nLiAnc2VjcmV0IGtleSdcbiAqIEBwYXJhbSBoZXggaGV4IHN0cmluZyBvciBVaW50OEFycmF5XG4gKiBAcGFyYW0gZXhwZWN0ZWRMZW5ndGggb3B0aW9uYWwsIHdpbGwgY29tcGFyZSB0byByZXN1bHQgYXJyYXkncyBsZW5ndGhcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVCeXRlcyh0aXRsZSwgaGV4LCBleHBlY3RlZExlbmd0aCkge1xuICAgIGxldCByZXM7XG4gICAgaWYgKHR5cGVvZiBoZXggPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXMgPSBoZXhUb0J5dGVzXyhoZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGl0bGUgKyAnIG11c3QgYmUgaGV4IHN0cmluZyBvciBVaW50OEFycmF5LCBjYXVzZTogJyArIGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzQnl0ZXNfKGhleCkpIHtcbiAgICAgICAgLy8gVWludDhBcnJheS5mcm9tKCkgaW5zdGVhZCBvZiBoYXNoLnNsaWNlKCkgYmVjYXVzZSBub2RlLmpzIEJ1ZmZlclxuICAgICAgICAvLyBpcyBpbnN0YW5jZSBvZiBVaW50OEFycmF5LCBhbmQgaXRzIHNsaWNlKCkgY3JlYXRlcyAqKm11dGFibGUqKiBjb3B5XG4gICAgICAgIHJlcyA9IFVpbnQ4QXJyYXkuZnJvbShoZXgpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRpdGxlICsgJyBtdXN0IGJlIGhleCBzdHJpbmcgb3IgVWludDhBcnJheScpO1xuICAgIH1cbiAgICBjb25zdCBsZW4gPSByZXMubGVuZ3RoO1xuICAgIGlmICh0eXBlb2YgZXhwZWN0ZWRMZW5ndGggPT09ICdudW1iZXInICYmIGxlbiAhPT0gZXhwZWN0ZWRMZW5ndGgpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0aXRsZSArICcgb2YgbGVuZ3RoICcgKyBleHBlY3RlZExlbmd0aCArICcgZXhwZWN0ZWQsIGdvdCAnICsgbGVuKTtcbiAgICByZXR1cm4gcmVzO1xufVxuLy8gQ29tcGFyZXMgMiB1OGEtcyBpbiBraW5kYSBjb25zdGFudCB0aW1lXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxCeXRlcyhhLCBiKSB7XG4gICAgaWYgKGEubGVuZ3RoICE9PSBiLmxlbmd0aClcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBkaWZmID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspXG4gICAgICAgIGRpZmYgfD0gYVtpXSBeIGJbaV07XG4gICAgcmV0dXJuIGRpZmYgPT09IDA7XG59XG4vKipcbiAqIENvcGllcyBVaW50OEFycmF5LiBXZSBjYW4ndCB1c2UgdThhLnNsaWNlKCksIGJlY2F1c2UgdThhIGNhbiBiZSBCdWZmZXIsXG4gKiBhbmQgQnVmZmVyI3NsaWNlIGNyZWF0ZXMgbXV0YWJsZSBjb3B5LiBOZXZlciB1c2UgQnVmZmVycyFcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlCeXRlcyhieXRlcykge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYnl0ZXMpO1xufVxuLyoqXG4gKiBEZWNvZGVzIDctYml0IEFTQ0lJIHN0cmluZyB0byBVaW50OEFycmF5LCB0aHJvd3Mgb24gbm9uLWFzY2lpIHN5bWJvbHNcbiAqIFNob3VsZCBiZSBzYWZlIHRvIHVzZSBmb3IgdGhpbmdzIGV4cGVjdGVkIHRvIGJlIEFTQ0lJLlxuICogUmV0dXJucyBleGFjdCBzYW1lIHJlc3VsdCBhcyB1dGY4VG9CeXRlcyBmb3IgQVNDSUkgb3IgdGhyb3dzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNjaWlUb0J5dGVzKGFzY2lpKSB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShhc2NpaSwgKGMsIGkpID0+IHtcbiAgICAgICAgY29uc3QgY2hhckNvZGUgPSBjLmNoYXJDb2RlQXQoMCk7XG4gICAgICAgIGlmIChjLmxlbmd0aCAhPT0gMSB8fCBjaGFyQ29kZSA+IDEyNykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpbmcgY29udGFpbnMgbm9uLUFTQ0lJIGNoYXJhY3RlciBcIiR7YXNjaWlbaV19XCIgd2l0aCBjb2RlICR7Y2hhckNvZGV9IGF0IHBvc2l0aW9uICR7aX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhckNvZGU7XG4gICAgfSk7XG59XG4vKipcbiAqIEBleGFtcGxlIHV0ZjhUb0J5dGVzKCdhYmMnKSAvLyBuZXcgVWludDhBcnJheShbOTcsIDk4LCA5OV0pXG4gKi9cbi8vIGV4cG9ydCBjb25zdCB1dGY4VG9CeXRlczogdHlwZW9mIHV0ZjhUb0J5dGVzXyA9IHV0ZjhUb0J5dGVzXztcbi8qKlxuICogQ29udmVydHMgYnl0ZXMgdG8gc3RyaW5nIHVzaW5nIFVURjggZW5jb2RpbmcuXG4gKiBAZXhhbXBsZSBieXRlc1RvVXRmOChVaW50OEFycmF5LmZyb20oWzk3LCA5OCwgOTldKSkgLy8gJ2FiYydcbiAqL1xuLy8gZXhwb3J0IGNvbnN0IGJ5dGVzVG9VdGY4OiB0eXBlb2YgYnl0ZXNUb1V0ZjhfID0gYnl0ZXNUb1V0ZjhfO1xuLy8gSXMgcG9zaXRpdmUgYmlnaW50XG5jb25zdCBpc1Bvc0JpZyA9IChuKSA9PiB0eXBlb2YgbiA9PT0gJ2JpZ2ludCcgJiYgXzBuIDw9IG47XG5leHBvcnQgZnVuY3Rpb24gaW5SYW5nZShuLCBtaW4sIG1heCkge1xuICAgIHJldHVybiBpc1Bvc0JpZyhuKSAmJiBpc1Bvc0JpZyhtaW4pICYmIGlzUG9zQmlnKG1heCkgJiYgbWluIDw9IG4gJiYgbiA8IG1heDtcbn1cbi8qKlxuICogQXNzZXJ0cyBtaW4gPD0gbiA8IG1heC4gTk9URTogSXQncyA8IG1heCBhbmQgbm90IDw9IG1heC5cbiAqIEBleGFtcGxlXG4gKiBhSW5SYW5nZSgneCcsIHgsIDFuLCAyNTZuKTsgLy8gd291bGQgYXNzdW1lIHggaXMgaW4gKDFuLi4yNTVuKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYUluUmFuZ2UodGl0bGUsIG4sIG1pbiwgbWF4KSB7XG4gICAgLy8gV2h5IG1pbiA8PSBuIDwgbWF4IGFuZCBub3QgYSAobWluIDwgbiA8IG1heCkgT1IgYiAobWluIDw9IG4gPD0gbWF4KT9cbiAgICAvLyBjb25zaWRlciBQPTI1Nm4sIG1pbj0wbiwgbWF4PVBcbiAgICAvLyAtIGEgZm9yIG1pbj0wIHdvdWxkIHJlcXVpcmUgLTE6ICAgICAgICAgIGBpblJhbmdlKCd4JywgeCwgLTFuLCBQKWBcbiAgICAvLyAtIGIgd291bGQgY29tbW9ubHkgcmVxdWlyZSBzdWJ0cmFjdGlvbjogIGBpblJhbmdlKCd4JywgeCwgMG4sIFAgLSAxbilgXG4gICAgLy8gLSBvdXIgd2F5IGlzIHRoZSBjbGVhbmVzdDogICAgICAgICAgICAgICBgaW5SYW5nZSgneCcsIHgsIDBuLCBQKVxuICAgIGlmICghaW5SYW5nZShuLCBtaW4sIG1heCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignZXhwZWN0ZWQgdmFsaWQgJyArIHRpdGxlICsgJzogJyArIG1pbiArICcgPD0gbiA8ICcgKyBtYXggKyAnLCBnb3QgJyArIG4pO1xufVxuLy8gQml0IG9wZXJhdGlvbnNcbi8qKlxuICogQ2FsY3VsYXRlcyBhbW91bnQgb2YgYml0cyBpbiBhIGJpZ2ludC5cbiAqIFNhbWUgYXMgYG4udG9TdHJpbmcoMikubGVuZ3RoYFxuICogVE9ETzogbWVyZ2Ugd2l0aCBuTGVuZ3RoIGluIG1vZHVsYXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpdExlbihuKSB7XG4gICAgbGV0IGxlbjtcbiAgICBmb3IgKGxlbiA9IDA7IG4gPiBfMG47IG4gPj49IF8xbiwgbGVuICs9IDEpXG4gICAgICAgIDtcbiAgICByZXR1cm4gbGVuO1xufVxuLyoqXG4gKiBHZXRzIHNpbmdsZSBiaXQgYXQgcG9zaXRpb24uXG4gKiBOT1RFOiBmaXJzdCBiaXQgcG9zaXRpb24gaXMgMCAoc2FtZSBhcyBhcnJheXMpXG4gKiBTYW1lIGFzIGAhIStBcnJheS5mcm9tKG4udG9TdHJpbmcoMikpLnJldmVyc2UoKVtwb3NdYFxuICovXG5leHBvcnQgZnVuY3Rpb24gYml0R2V0KG4sIHBvcykge1xuICAgIHJldHVybiAobiA+PiBCaWdJbnQocG9zKSkgJiBfMW47XG59XG4vKipcbiAqIFNldHMgc2luZ2xlIGJpdCBhdCBwb3NpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpdFNldChuLCBwb3MsIHZhbHVlKSB7XG4gICAgcmV0dXJuIG4gfCAoKHZhbHVlID8gXzFuIDogXzBuKSA8PCBCaWdJbnQocG9zKSk7XG59XG4vKipcbiAqIENhbGN1bGF0ZSBtYXNrIGZvciBOIGJpdHMuIE5vdCB1c2luZyAqKiBvcGVyYXRvciB3aXRoIGJpZ2ludHMgYmVjYXVzZSBvZiBvbGQgZW5naW5lcy5cbiAqIFNhbWUgYXMgQmlnSW50KGAwYiR7QXJyYXkoaSkuZmlsbCgnMScpLmpvaW4oJycpfWApXG4gKi9cbmV4cG9ydCBjb25zdCBiaXRNYXNrID0gKG4pID0+IChfMW4gPDwgQmlnSW50KG4pKSAtIF8xbjtcbi8qKlxuICogTWluaW1hbCBITUFDLURSQkcgZnJvbSBOSVNUIDgwMC05MCBmb3IgUkZDNjk3OSBzaWdzLlxuICogQHJldHVybnMgZnVuY3Rpb24gdGhhdCB3aWxsIGNhbGwgRFJCRyB1bnRpbCAybmQgYXJnIHJldHVybnMgc29tZXRoaW5nIG1lYW5pbmdmdWxcbiAqIEBleGFtcGxlXG4gKiAgIGNvbnN0IGRyYmcgPSBjcmVhdGVIbWFjRFJCRzxLZXk+KDMyLCAzMiwgaG1hYyk7XG4gKiAgIGRyYmcoc2VlZCwgYnl0ZXNUb0tleSk7IC8vIGJ5dGVzVG9LZXkgbXVzdCByZXR1cm4gS2V5IG9yIHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSG1hY0RyYmcoaGFzaExlbiwgcUJ5dGVMZW4sIGhtYWNGbikge1xuICAgIGlmICh0eXBlb2YgaGFzaExlbiAhPT0gJ251bWJlcicgfHwgaGFzaExlbiA8IDIpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaGFzaExlbiBtdXN0IGJlIGEgbnVtYmVyJyk7XG4gICAgaWYgKHR5cGVvZiBxQnl0ZUxlbiAhPT0gJ251bWJlcicgfHwgcUJ5dGVMZW4gPCAyKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3FCeXRlTGVuIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICBpZiAodHlwZW9mIGhtYWNGbiAhPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdobWFjRm4gbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgLy8gU3RlcCBCLCBTdGVwIEM6IHNldCBoYXNoTGVuIHRvIDgqY2VpbChobGVuLzgpXG4gICAgY29uc3QgdThuID0gKGxlbikgPT4gbmV3IFVpbnQ4QXJyYXkobGVuKTsgLy8gY3JlYXRlcyBVaW50OEFycmF5XG4gICAgY29uc3QgdThvZiA9IChieXRlKSA9PiBVaW50OEFycmF5Lm9mKGJ5dGUpOyAvLyBhbm90aGVyIHNob3J0Y3V0XG4gICAgbGV0IHYgPSB1OG4oaGFzaExlbik7IC8vIE1pbmltYWwgbm9uLWZ1bGwtc3BlYyBITUFDLURSQkcgZnJvbSBOSVNUIDgwMC05MCBmb3IgUkZDNjk3OSBzaWdzLlxuICAgIGxldCBrID0gdThuKGhhc2hMZW4pOyAvLyBTdGVwcyBCIGFuZCBDIG9mIFJGQzY5NzkgMy4yOiBzZXQgaGFzaExlbiwgaW4gb3VyIGNhc2UgYWx3YXlzIHNhbWVcbiAgICBsZXQgaSA9IDA7IC8vIEl0ZXJhdGlvbnMgY291bnRlciwgd2lsbCB0aHJvdyB3aGVuIG92ZXIgMTAwMFxuICAgIGNvbnN0IHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICB2LmZpbGwoMSk7XG4gICAgICAgIGsuZmlsbCgwKTtcbiAgICAgICAgaSA9IDA7XG4gICAgfTtcbiAgICBjb25zdCBoID0gKC4uLmIpID0+IGhtYWNGbihrLCB2LCAuLi5iKTsgLy8gaG1hYyhrKSh2LCAuLi52YWx1ZXMpXG4gICAgY29uc3QgcmVzZWVkID0gKHNlZWQgPSB1OG4oMCkpID0+IHtcbiAgICAgICAgLy8gSE1BQy1EUkJHIHJlc2VlZCgpIGZ1bmN0aW9uLiBTdGVwcyBELUdcbiAgICAgICAgayA9IGgodThvZigweDAwKSwgc2VlZCk7IC8vIGsgPSBobWFjKGsgfHwgdiB8fCAweDAwIHx8IHNlZWQpXG4gICAgICAgIHYgPSBoKCk7IC8vIHYgPSBobWFjKGsgfHwgdilcbiAgICAgICAgaWYgKHNlZWQubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBrID0gaCh1OG9mKDB4MDEpLCBzZWVkKTsgLy8gayA9IGhtYWMoayB8fCB2IHx8IDB4MDEgfHwgc2VlZClcbiAgICAgICAgdiA9IGgoKTsgLy8gdiA9IGhtYWMoayB8fCB2KVxuICAgIH07XG4gICAgY29uc3QgZ2VuID0gKCkgPT4ge1xuICAgICAgICAvLyBITUFDLURSQkcgZ2VuZXJhdGUoKSBmdW5jdGlvblxuICAgICAgICBpZiAoaSsrID49IDEwMDApXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RyYmc6IHRyaWVkIDEwMDAgdmFsdWVzJyk7XG4gICAgICAgIGxldCBsZW4gPSAwO1xuICAgICAgICBjb25zdCBvdXQgPSBbXTtcbiAgICAgICAgd2hpbGUgKGxlbiA8IHFCeXRlTGVuKSB7XG4gICAgICAgICAgICB2ID0gaCgpO1xuICAgICAgICAgICAgY29uc3Qgc2wgPSB2LnNsaWNlKCk7XG4gICAgICAgICAgICBvdXQucHVzaChzbCk7XG4gICAgICAgICAgICBsZW4gKz0gdi5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmNhdEJ5dGVzXyguLi5vdXQpO1xuICAgIH07XG4gICAgY29uc3QgZ2VuVW50aWwgPSAoc2VlZCwgcHJlZCkgPT4ge1xuICAgICAgICByZXNldCgpO1xuICAgICAgICByZXNlZWQoc2VlZCk7IC8vIFN0ZXBzIEQtR1xuICAgICAgICBsZXQgcmVzID0gdW5kZWZpbmVkOyAvLyBTdGVwIEg6IGdyaW5kIHVudGlsIGsgaXMgaW4gWzEuLm4tMV1cbiAgICAgICAgd2hpbGUgKCEocmVzID0gcHJlZChnZW4oKSkpKVxuICAgICAgICAgICAgcmVzZWVkKCk7XG4gICAgICAgIHJlc2V0KCk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICByZXR1cm4gZ2VuVW50aWw7XG59XG4vLyBWYWxpZGF0aW5nIGN1cnZlcyBhbmQgZmllbGRzXG5jb25zdCB2YWxpZGF0b3JGbnMgPSB7XG4gICAgYmlnaW50OiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAnYmlnaW50JyxcbiAgICBmdW5jdGlvbjogKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyxcbiAgICBib29sZWFuOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAnYm9vbGVhbicsXG4gICAgc3RyaW5nOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSAnc3RyaW5nJyxcbiAgICBzdHJpbmdPclVpbnQ4QXJyYXk6ICh2YWwpID0+IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnIHx8IGlzQnl0ZXNfKHZhbCksXG4gICAgaXNTYWZlSW50ZWdlcjogKHZhbCkgPT4gTnVtYmVyLmlzU2FmZUludGVnZXIodmFsKSxcbiAgICBhcnJheTogKHZhbCkgPT4gQXJyYXkuaXNBcnJheSh2YWwpLFxuICAgIGZpZWxkOiAodmFsLCBvYmplY3QpID0+IG9iamVjdC5GcC5pc1ZhbGlkKHZhbCksXG4gICAgaGFzaDogKHZhbCkgPT4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJyAmJiBOdW1iZXIuaXNTYWZlSW50ZWdlcih2YWwub3V0cHV0TGVuKSxcbn07XG4vLyB0eXBlIFJlY29yZDxLIGV4dGVuZHMgc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCBUPiA9IHsgW1AgaW4gS106IFQ7IH1cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZU9iamVjdChvYmplY3QsIHZhbGlkYXRvcnMsIG9wdFZhbGlkYXRvcnMgPSB7fSkge1xuICAgIGNvbnN0IGNoZWNrRmllbGQgPSAoZmllbGROYW1lLCB0eXBlLCBpc09wdGlvbmFsKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoZWNrVmFsID0gdmFsaWRhdG9yRm5zW3R5cGVdO1xuICAgICAgICBpZiAodHlwZW9mIGNoZWNrVmFsICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHZhbGlkYXRvciBmdW5jdGlvbicpO1xuICAgICAgICBjb25zdCB2YWwgPSBvYmplY3RbZmllbGROYW1lXTtcbiAgICAgICAgaWYgKGlzT3B0aW9uYWwgJiYgdmFsID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGlmICghY2hlY2tWYWwodmFsLCBvYmplY3QpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhcmFtICcgKyBTdHJpbmcoZmllbGROYW1lKSArICcgaXMgaW52YWxpZC4gRXhwZWN0ZWQgJyArIHR5cGUgKyAnLCBnb3QgJyArIHZhbCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgdHlwZV0gb2YgT2JqZWN0LmVudHJpZXModmFsaWRhdG9ycykpXG4gICAgICAgIGNoZWNrRmllbGQoZmllbGROYW1lLCB0eXBlLCBmYWxzZSk7XG4gICAgZm9yIChjb25zdCBbZmllbGROYW1lLCB0eXBlXSBvZiBPYmplY3QuZW50cmllcyhvcHRWYWxpZGF0b3JzKSlcbiAgICAgICAgY2hlY2tGaWVsZChmaWVsZE5hbWUsIHR5cGUsIHRydWUpO1xuICAgIHJldHVybiBvYmplY3Q7XG59XG4vLyB2YWxpZGF0ZSB0eXBlIHRlc3RzXG4vLyBjb25zdCBvOiB7IGE6IG51bWJlcjsgYjogbnVtYmVyOyBjOiBudW1iZXIgfSA9IHsgYTogMSwgYjogNSwgYzogNiB9O1xuLy8gY29uc3QgejAgPSB2YWxpZGF0ZU9iamVjdChvLCB7IGE6ICdpc1NhZmVJbnRlZ2VyJyB9LCB7IGM6ICdiaWdpbnQnIH0pOyAvLyBPayFcbi8vIC8vIFNob3VsZCBmYWlsIHR5cGUtY2hlY2tcbi8vIGNvbnN0IHoxID0gdmFsaWRhdGVPYmplY3QobywgeyBhOiAndG1wJyB9LCB7IGM6ICd6eicgfSk7XG4vLyBjb25zdCB6MiA9IHZhbGlkYXRlT2JqZWN0KG8sIHsgYTogJ2lzU2FmZUludGVnZXInIH0sIHsgYzogJ3p6JyB9KTtcbi8vIGNvbnN0IHozID0gdmFsaWRhdGVPYmplY3QobywgeyB0ZXN0OiAnYm9vbGVhbicsIHo6ICdidWcnIH0pO1xuLy8gY29uc3QgejQgPSB2YWxpZGF0ZU9iamVjdChvLCB7IGE6ICdib29sZWFuJywgejogJ2J1ZycgfSk7XG5leHBvcnQgZnVuY3Rpb24gaXNIYXNoKHZhbCkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nICYmIE51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbC5vdXRwdXRMZW4pO1xufVxuZXhwb3J0IGZ1bmN0aW9uIF92YWxpZGF0ZU9iamVjdChvYmplY3QsIGZpZWxkcywgb3B0RmllbGRzID0ge30pIHtcbiAgICBpZiAoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdleHBlY3RlZCB2YWxpZCBvcHRpb25zIG9iamVjdCcpO1xuICAgIGZ1bmN0aW9uIGNoZWNrRmllbGQoZmllbGROYW1lLCBleHBlY3RlZFR5cGUsIGlzT3B0KSB7XG4gICAgICAgIGNvbnN0IHZhbCA9IG9iamVjdFtmaWVsZE5hbWVdO1xuICAgICAgICBpZiAoaXNPcHQgJiYgdmFsID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSB0eXBlb2YgdmFsO1xuICAgICAgICBpZiAoY3VycmVudCAhPT0gZXhwZWN0ZWRUeXBlIHx8IHZhbCA9PT0gbnVsbClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcGFyYW0gXCIke2ZpZWxkTmFtZX1cIiBpcyBpbnZhbGlkOiBleHBlY3RlZCAke2V4cGVjdGVkVHlwZX0sIGdvdCAke2N1cnJlbnR9YCk7XG4gICAgfVxuICAgIE9iamVjdC5lbnRyaWVzKGZpZWxkcykuZm9yRWFjaCgoW2ssIHZdKSA9PiBjaGVja0ZpZWxkKGssIHYsIGZhbHNlKSk7XG4gICAgT2JqZWN0LmVudHJpZXMob3B0RmllbGRzKS5mb3JFYWNoKChbaywgdl0pID0+IGNoZWNrRmllbGQoaywgdiwgdHJ1ZSkpO1xufVxuLyoqXG4gKiB0aHJvd3Mgbm90IGltcGxlbWVudGVkIGVycm9yXG4gKi9cbmV4cG9ydCBjb25zdCBub3RJbXBsZW1lbnRlZCA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ25vdCBpbXBsZW1lbnRlZCcpO1xufTtcbi8qKlxuICogTWVtb2l6ZXMgKGNhY2hlcykgY29tcHV0YXRpb24gcmVzdWx0LlxuICogVXNlcyBXZWFrTWFwOiB0aGUgdmFsdWUgaXMgZ29pbmcgYXV0by1jbGVhbmVkIGJ5IEdDIGFmdGVyIGxhc3QgcmVmZXJlbmNlIGlzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXplZChmbikge1xuICAgIGNvbnN0IG1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gICAgcmV0dXJuIChhcmcsIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgY29uc3QgdmFsID0gbWFwLmdldChhcmcpO1xuICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICBjb25zdCBjb21wdXRlZCA9IGZuKGFyZywgLi4uYXJncyk7XG4gICAgICAgIG1hcC5zZXQoYXJnLCBjb21wdXRlZCk7XG4gICAgICAgIHJldHVybiBjb21wdXRlZDtcbiAgICB9O1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/curves/esm/utils.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/hashes/esm/_md.js":
/*!***********************************************!*\
  !*** ./node_modules/@noble/hashes/esm/_md.js ***!
  \***********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Chi: () => (/* binding */ Chi),\n/* harmony export */   HashMD: () => (/* binding */ HashMD),\n/* harmony export */   Maj: () => (/* binding */ Maj),\n/* harmony export */   SHA224_IV: () => (/* binding */ SHA224_IV),\n/* harmony export */   SHA256_IV: () => (/* binding */ SHA256_IV),\n/* harmony export */   SHA384_IV: () => (/* binding */ SHA384_IV),\n/* harmony export */   SHA512_IV: () => (/* binding */ SHA512_IV),\n/* harmony export */   setBigUint64: () => (/* binding */ setBigUint64)\n/* harmony export */ });\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\n\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nfunction setBigUint64(view, byteOffset, value, isLE) {\n    if (typeof view.setBigUint64 === 'function')\n        return view.setBigUint64(byteOffset, value, isLE);\n    const _32n = BigInt(32);\n    const _u32_max = BigInt(0xffffffff);\n    const wh = Number((value >> _32n) & _u32_max);\n    const wl = Number(value & _u32_max);\n    const h = isLE ? 4 : 0;\n    const l = isLE ? 0 : 4;\n    view.setUint32(byteOffset + h, wh, isLE);\n    view.setUint32(byteOffset + l, wl, isLE);\n}\n/** Choice: a ? b : c */\nfunction Chi(a, b, c) {\n    return (a & b) ^ (~a & c);\n}\n/** Majority function, true if any two inputs is true. */\nfunction Maj(a, b, c) {\n    return (a & b) ^ (a & c) ^ (b & c);\n}\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nclass HashMD extends _utils_js__WEBPACK_IMPORTED_MODULE_0__.Hash {\n    constructor(blockLen, outputLen, padOffset, isLE) {\n        super();\n        this.finished = false;\n        this.length = 0;\n        this.pos = 0;\n        this.destroyed = false;\n        this.blockLen = blockLen;\n        this.outputLen = outputLen;\n        this.padOffset = padOffset;\n        this.isLE = isLE;\n        this.buffer = new Uint8Array(blockLen);\n        this.view = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createView)(this.buffer);\n    }\n    update(data) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.aexists)(this);\n        data = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toBytes)(data);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.abytes)(data);\n        const { view, buffer, blockLen } = this;\n        const len = data.length;\n        for (let pos = 0; pos < len;) {\n            const take = Math.min(blockLen - this.pos, len - pos);\n            // Fast path: we have at least one block in input, cast it to view and process\n            if (take === blockLen) {\n                const dataView = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createView)(data);\n                for (; blockLen <= len - pos; pos += blockLen)\n                    this.process(dataView, pos);\n                continue;\n            }\n            buffer.set(data.subarray(pos, pos + take), this.pos);\n            this.pos += take;\n            pos += take;\n            if (this.pos === blockLen) {\n                this.process(view, 0);\n                this.pos = 0;\n            }\n        }\n        this.length += data.length;\n        this.roundClean();\n        return this;\n    }\n    digestInto(out) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.aexists)(this);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.aoutput)(out, this);\n        this.finished = true;\n        // Padding\n        // We can avoid allocation of buffer for padding completely if it\n        // was previously not allocated here. But it won't change performance.\n        const { buffer, view, blockLen, isLE } = this;\n        let { pos } = this;\n        // append the bit '1' to the message\n        buffer[pos++] = 0b10000000;\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.clean)(this.buffer.subarray(pos));\n        // we have less than padOffset left in buffer, so we cannot put length in\n        // current block, need process it and pad again\n        if (this.padOffset > blockLen - pos) {\n            this.process(view, 0);\n            pos = 0;\n        }\n        // Pad until full block byte with zeros\n        for (let i = pos; i < blockLen; i++)\n            buffer[i] = 0;\n        // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n        // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n        // So we just write lowest 64 bits of that value.\n        setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n        this.process(view, 0);\n        const oview = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.createView)(out);\n        const len = this.outputLen;\n        // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n        if (len % 4)\n            throw new Error('_sha2: outputLen should be aligned to 32bit');\n        const outLen = len / 4;\n        const state = this.get();\n        if (outLen > state.length)\n            throw new Error('_sha2: outputLen bigger than state');\n        for (let i = 0; i < outLen; i++)\n            oview.setUint32(4 * i, state[i], isLE);\n    }\n    digest() {\n        const { buffer, outputLen } = this;\n        this.digestInto(buffer);\n        const res = buffer.slice(0, outputLen);\n        this.destroy();\n        return res;\n    }\n    _cloneInto(to) {\n        to || (to = new this.constructor());\n        to.set(...this.get());\n        const { blockLen, buffer, length, finished, destroyed, pos } = this;\n        to.destroyed = destroyed;\n        to.finished = finished;\n        to.length = length;\n        to.pos = pos;\n        if (length % blockLen)\n            to.buffer.set(buffer);\n        return to;\n    }\n    clone() {\n        return this._cloneInto();\n    }\n}\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nconst SHA256_IV = /* @__PURE__ */ Uint32Array.from([\n    0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nconst SHA224_IV = /* @__PURE__ */ Uint32Array.from([\n    0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nconst SHA384_IV = /* @__PURE__ */ Uint32Array.from([\n    0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n    0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nconst SHA512_IV = /* @__PURE__ */ Uint32Array.from([\n    0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n    0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n//# sourceMappingURL=_md.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9fbWQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDd0Y7QUFDeEY7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxxQkFBcUIsMkNBQUk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixxREFBVTtBQUM5QjtBQUNBO0FBQ0EsUUFBUSxrREFBTztBQUNmLGVBQWUsa0RBQU87QUFDdEIsUUFBUSxpREFBTTtBQUNkLGdCQUFnQix5QkFBeUI7QUFDekM7QUFDQSwwQkFBMEIsVUFBVTtBQUNwQztBQUNBO0FBQ0E7QUFDQSxpQ0FBaUMscURBQVU7QUFDM0MsdUJBQXVCLHVCQUF1QjtBQUM5QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0RBQU87QUFDZixRQUFRLGtEQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsK0JBQStCO0FBQy9DLGNBQWMsTUFBTTtBQUNwQjtBQUNBO0FBQ0EsUUFBUSxnREFBSztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMEJBQTBCLGNBQWM7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLHFEQUFVO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsWUFBWTtBQUNwQztBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0JBQW9CO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscURBQXFEO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5vYmxlL2hhc2hlcy9lc20vX21kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZXJuYWwgTWVya2xlLURhbWdhcmQgaGFzaCB1dGlscy5cbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgSGFzaCwgYWJ5dGVzLCBhZXhpc3RzLCBhb3V0cHV0LCBjbGVhbiwgY3JlYXRlVmlldywgdG9CeXRlcyB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG4vKiogUG9seWZpbGwgZm9yIFNhZmFyaSAxNC4gaHR0cHM6Ly9jYW5pdXNlLmNvbS9tZG4tamF2YXNjcmlwdF9idWlsdGluc19kYXRhdmlld19zZXRiaWd1aW50NjQgKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRCaWdVaW50NjQodmlldywgYnl0ZU9mZnNldCwgdmFsdWUsIGlzTEUpIHtcbiAgICBpZiAodHlwZW9mIHZpZXcuc2V0QmlnVWludDY0ID09PSAnZnVuY3Rpb24nKVxuICAgICAgICByZXR1cm4gdmlldy5zZXRCaWdVaW50NjQoYnl0ZU9mZnNldCwgdmFsdWUsIGlzTEUpO1xuICAgIGNvbnN0IF8zMm4gPSBCaWdJbnQoMzIpO1xuICAgIGNvbnN0IF91MzJfbWF4ID0gQmlnSW50KDB4ZmZmZmZmZmYpO1xuICAgIGNvbnN0IHdoID0gTnVtYmVyKCh2YWx1ZSA+PiBfMzJuKSAmIF91MzJfbWF4KTtcbiAgICBjb25zdCB3bCA9IE51bWJlcih2YWx1ZSAmIF91MzJfbWF4KTtcbiAgICBjb25zdCBoID0gaXNMRSA/IDQgOiAwO1xuICAgIGNvbnN0IGwgPSBpc0xFID8gMCA6IDQ7XG4gICAgdmlldy5zZXRVaW50MzIoYnl0ZU9mZnNldCArIGgsIHdoLCBpc0xFKTtcbiAgICB2aWV3LnNldFVpbnQzMihieXRlT2Zmc2V0ICsgbCwgd2wsIGlzTEUpO1xufVxuLyoqIENob2ljZTogYSA/IGIgOiBjICovXG5leHBvcnQgZnVuY3Rpb24gQ2hpKGEsIGIsIGMpIHtcbiAgICByZXR1cm4gKGEgJiBiKSBeICh+YSAmIGMpO1xufVxuLyoqIE1ham9yaXR5IGZ1bmN0aW9uLCB0cnVlIGlmIGFueSB0d28gaW5wdXRzIGlzIHRydWUuICovXG5leHBvcnQgZnVuY3Rpb24gTWFqKGEsIGIsIGMpIHtcbiAgICByZXR1cm4gKGEgJiBiKSBeIChhICYgYykgXiAoYiAmIGMpO1xufVxuLyoqXG4gKiBNZXJrbGUtRGFtZ2FyZCBoYXNoIGNvbnN0cnVjdGlvbiBiYXNlIGNsYXNzLlxuICogQ291bGQgYmUgdXNlZCB0byBjcmVhdGUgTUQ1LCBSSVBFTUQsIFNIQTEsIFNIQTIuXG4gKi9cbmV4cG9ydCBjbGFzcyBIYXNoTUQgZXh0ZW5kcyBIYXNoIHtcbiAgICBjb25zdHJ1Y3RvcihibG9ja0xlbiwgb3V0cHV0TGVuLCBwYWRPZmZzZXQsIGlzTEUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5maW5pc2hlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5ibG9ja0xlbiA9IGJsb2NrTGVuO1xuICAgICAgICB0aGlzLm91dHB1dExlbiA9IG91dHB1dExlbjtcbiAgICAgICAgdGhpcy5wYWRPZmZzZXQgPSBwYWRPZmZzZXQ7XG4gICAgICAgIHRoaXMuaXNMRSA9IGlzTEU7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tMZW4pO1xuICAgICAgICB0aGlzLnZpZXcgPSBjcmVhdGVWaWV3KHRoaXMuYnVmZmVyKTtcbiAgICB9XG4gICAgdXBkYXRlKGRhdGEpIHtcbiAgICAgICAgYWV4aXN0cyh0aGlzKTtcbiAgICAgICAgZGF0YSA9IHRvQnl0ZXMoZGF0YSk7XG4gICAgICAgIGFieXRlcyhkYXRhKTtcbiAgICAgICAgY29uc3QgeyB2aWV3LCBidWZmZXIsIGJsb2NrTGVuIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgbGVuOykge1xuICAgICAgICAgICAgY29uc3QgdGFrZSA9IE1hdGgubWluKGJsb2NrTGVuIC0gdGhpcy5wb3MsIGxlbiAtIHBvcyk7XG4gICAgICAgICAgICAvLyBGYXN0IHBhdGg6IHdlIGhhdmUgYXQgbGVhc3Qgb25lIGJsb2NrIGluIGlucHV0LCBjYXN0IGl0IHRvIHZpZXcgYW5kIHByb2Nlc3NcbiAgICAgICAgICAgIGlmICh0YWtlID09PSBibG9ja0xlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFWaWV3ID0gY3JlYXRlVmlldyhkYXRhKTtcbiAgICAgICAgICAgICAgICBmb3IgKDsgYmxvY2tMZW4gPD0gbGVuIC0gcG9zOyBwb3MgKz0gYmxvY2tMZW4pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzcyhkYXRhVmlldywgcG9zKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJ1ZmZlci5zZXQoZGF0YS5zdWJhcnJheShwb3MsIHBvcyArIHRha2UpLCB0aGlzLnBvcyk7XG4gICAgICAgICAgICB0aGlzLnBvcyArPSB0YWtlO1xuICAgICAgICAgICAgcG9zICs9IHRha2U7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPT09IGJsb2NrTGVuKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzKHZpZXcsIDApO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxlbmd0aCArPSBkYXRhLmxlbmd0aDtcbiAgICAgICAgdGhpcy5yb3VuZENsZWFuKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICBkaWdlc3RJbnRvKG91dCkge1xuICAgICAgICBhZXhpc3RzKHRoaXMpO1xuICAgICAgICBhb3V0cHV0KG91dCwgdGhpcyk7XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICAvLyBQYWRkaW5nXG4gICAgICAgIC8vIFdlIGNhbiBhdm9pZCBhbGxvY2F0aW9uIG9mIGJ1ZmZlciBmb3IgcGFkZGluZyBjb21wbGV0ZWx5IGlmIGl0XG4gICAgICAgIC8vIHdhcyBwcmV2aW91c2x5IG5vdCBhbGxvY2F0ZWQgaGVyZS4gQnV0IGl0IHdvbid0IGNoYW5nZSBwZXJmb3JtYW5jZS5cbiAgICAgICAgY29uc3QgeyBidWZmZXIsIHZpZXcsIGJsb2NrTGVuLCBpc0xFIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBwb3MgfSA9IHRoaXM7XG4gICAgICAgIC8vIGFwcGVuZCB0aGUgYml0ICcxJyB0byB0aGUgbWVzc2FnZVxuICAgICAgICBidWZmZXJbcG9zKytdID0gMGIxMDAwMDAwMDtcbiAgICAgICAgY2xlYW4odGhpcy5idWZmZXIuc3ViYXJyYXkocG9zKSk7XG4gICAgICAgIC8vIHdlIGhhdmUgbGVzcyB0aGFuIHBhZE9mZnNldCBsZWZ0IGluIGJ1ZmZlciwgc28gd2UgY2Fubm90IHB1dCBsZW5ndGggaW5cbiAgICAgICAgLy8gY3VycmVudCBibG9jaywgbmVlZCBwcm9jZXNzIGl0IGFuZCBwYWQgYWdhaW5cbiAgICAgICAgaWYgKHRoaXMucGFkT2Zmc2V0ID4gYmxvY2tMZW4gLSBwb3MpIHtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzcyh2aWV3LCAwKTtcbiAgICAgICAgICAgIHBvcyA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUGFkIHVudGlsIGZ1bGwgYmxvY2sgYnl0ZSB3aXRoIHplcm9zXG4gICAgICAgIGZvciAobGV0IGkgPSBwb3M7IGkgPCBibG9ja0xlbjsgaSsrKVxuICAgICAgICAgICAgYnVmZmVyW2ldID0gMDtcbiAgICAgICAgLy8gTm90ZTogc2hhNTEyIHJlcXVpcmVzIGxlbmd0aCB0byBiZSAxMjhiaXQgaW50ZWdlciwgYnV0IGxlbmd0aCBpbiBKUyB3aWxsIG92ZXJmbG93IGJlZm9yZSB0aGF0XG4gICAgICAgIC8vIFlvdSBuZWVkIHRvIHdyaXRlIGFyb3VuZCAyIGV4YWJ5dGVzICh1NjRfbWF4IC8gOCAvICgxMDI0Kio2KSkgZm9yIHRoaXMgdG8gaGFwcGVuLlxuICAgICAgICAvLyBTbyB3ZSBqdXN0IHdyaXRlIGxvd2VzdCA2NCBiaXRzIG9mIHRoYXQgdmFsdWUuXG4gICAgICAgIHNldEJpZ1VpbnQ2NCh2aWV3LCBibG9ja0xlbiAtIDgsIEJpZ0ludCh0aGlzLmxlbmd0aCAqIDgpLCBpc0xFKTtcbiAgICAgICAgdGhpcy5wcm9jZXNzKHZpZXcsIDApO1xuICAgICAgICBjb25zdCBvdmlldyA9IGNyZWF0ZVZpZXcob3V0KTtcbiAgICAgICAgY29uc3QgbGVuID0gdGhpcy5vdXRwdXRMZW47XG4gICAgICAgIC8vIE5PVEU6IHdlIGRvIGRpdmlzaW9uIGJ5IDQgbGF0ZXIsIHdoaWNoIHNob3VsZCBiZSBmdXNlZCBpbiBzaW5nbGUgb3Agd2l0aCBtb2R1bG8gYnkgSklUXG4gICAgICAgIGlmIChsZW4gJSA0KVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdfc2hhMjogb3V0cHV0TGVuIHNob3VsZCBiZSBhbGlnbmVkIHRvIDMyYml0Jyk7XG4gICAgICAgIGNvbnN0IG91dExlbiA9IGxlbiAvIDQ7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5nZXQoKTtcbiAgICAgICAgaWYgKG91dExlbiA+IHN0YXRlLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignX3NoYTI6IG91dHB1dExlbiBiaWdnZXIgdGhhbiBzdGF0ZScpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dExlbjsgaSsrKVxuICAgICAgICAgICAgb3ZpZXcuc2V0VWludDMyKDQgKiBpLCBzdGF0ZVtpXSwgaXNMRSk7XG4gICAgfVxuICAgIGRpZ2VzdCgpIHtcbiAgICAgICAgY29uc3QgeyBidWZmZXIsIG91dHB1dExlbiB9ID0gdGhpcztcbiAgICAgICAgdGhpcy5kaWdlc3RJbnRvKGJ1ZmZlcik7XG4gICAgICAgIGNvbnN0IHJlcyA9IGJ1ZmZlci5zbGljZSgwLCBvdXRwdXRMZW4pO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG4gICAgX2Nsb25lSW50byh0bykge1xuICAgICAgICB0byB8fCAodG8gPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpKTtcbiAgICAgICAgdG8uc2V0KC4uLnRoaXMuZ2V0KCkpO1xuICAgICAgICBjb25zdCB7IGJsb2NrTGVuLCBidWZmZXIsIGxlbmd0aCwgZmluaXNoZWQsIGRlc3Ryb3llZCwgcG9zIH0gPSB0aGlzO1xuICAgICAgICB0by5kZXN0cm95ZWQgPSBkZXN0cm95ZWQ7XG4gICAgICAgIHRvLmZpbmlzaGVkID0gZmluaXNoZWQ7XG4gICAgICAgIHRvLmxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgdG8ucG9zID0gcG9zO1xuICAgICAgICBpZiAobGVuZ3RoICUgYmxvY2tMZW4pXG4gICAgICAgICAgICB0by5idWZmZXIuc2V0KGJ1ZmZlcik7XG4gICAgICAgIHJldHVybiB0bztcbiAgICB9XG4gICAgY2xvbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jbG9uZUludG8oKTtcbiAgICB9XG59XG4vKipcbiAqIEluaXRpYWwgU0hBLTIgc3RhdGU6IGZyYWN0aW9uYWwgcGFydHMgb2Ygc3F1YXJlIHJvb3RzIG9mIGZpcnN0IDE2IHByaW1lcyAyLi41My5cbiAqIENoZWNrIG91dCBgdGVzdC9taXNjL3NoYTItZ2VuLWl2LmpzYCBmb3IgcmVjb21wdXRhdGlvbiBndWlkZS5cbiAqL1xuLyoqIEluaXRpYWwgU0hBMjU2IHN0YXRlLiBCaXRzIDAuLjMyIG9mIGZyYWMgcGFydCBvZiBzcXJ0IG9mIHByaW1lcyAyLi4xOSAqL1xuZXhwb3J0IGNvbnN0IFNIQTI1Nl9JViA9IC8qIEBfX1BVUkVfXyAqLyBVaW50MzJBcnJheS5mcm9tKFtcbiAgICAweDZhMDllNjY3LCAweGJiNjdhZTg1LCAweDNjNmVmMzcyLCAweGE1NGZmNTNhLCAweDUxMGU1MjdmLCAweDliMDU2ODhjLCAweDFmODNkOWFiLCAweDViZTBjZDE5LFxuXSk7XG4vKiogSW5pdGlhbCBTSEEyMjQgc3RhdGUuIEJpdHMgMzIuLjY0IG9mIGZyYWMgcGFydCBvZiBzcXJ0IG9mIHByaW1lcyAyMy4uNTMgKi9cbmV4cG9ydCBjb25zdCBTSEEyMjRfSVYgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gICAgMHhjMTA1OWVkOCwgMHgzNjdjZDUwNywgMHgzMDcwZGQxNywgMHhmNzBlNTkzOSwgMHhmZmMwMGIzMSwgMHg2ODU4MTUxMSwgMHg2NGY5OGZhNywgMHhiZWZhNGZhNCxcbl0pO1xuLyoqIEluaXRpYWwgU0hBMzg0IHN0YXRlLiBCaXRzIDAuLjY0IG9mIGZyYWMgcGFydCBvZiBzcXJ0IG9mIHByaW1lcyAyMy4uNTMgKi9cbmV4cG9ydCBjb25zdCBTSEEzODRfSVYgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gICAgMHhjYmJiOWQ1ZCwgMHhjMTA1OWVkOCwgMHg2MjlhMjkyYSwgMHgzNjdjZDUwNywgMHg5MTU5MDE1YSwgMHgzMDcwZGQxNywgMHgxNTJmZWNkOCwgMHhmNzBlNTkzOSxcbiAgICAweDY3MzMyNjY3LCAweGZmYzAwYjMxLCAweDhlYjQ0YTg3LCAweDY4NTgxNTExLCAweGRiMGMyZTBkLCAweDY0Zjk4ZmE3LCAweDQ3YjU0ODFkLCAweGJlZmE0ZmE0LFxuXSk7XG4vKiogSW5pdGlhbCBTSEE1MTIgc3RhdGUuIEJpdHMgMC4uNjQgb2YgZnJhYyBwYXJ0IG9mIHNxcnQgb2YgcHJpbWVzIDIuLjE5ICovXG5leHBvcnQgY29uc3QgU0hBNTEyX0lWID0gLyogQF9fUFVSRV9fICovIFVpbnQzMkFycmF5LmZyb20oW1xuICAgIDB4NmEwOWU2NjcsIDB4ZjNiY2M5MDgsIDB4YmI2N2FlODUsIDB4ODRjYWE3M2IsIDB4M2M2ZWYzNzIsIDB4ZmU5NGY4MmIsIDB4YTU0ZmY1M2EsIDB4NWYxZDM2ZjEsXG4gICAgMHg1MTBlNTI3ZiwgMHhhZGU2ODJkMSwgMHg5YjA1Njg4YywgMHgyYjNlNmMxZiwgMHgxZjgzZDlhYiwgMHhmYjQxYmQ2YiwgMHg1YmUwY2QxOSwgMHgxMzdlMjE3OSxcbl0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X21kLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/hashes/esm/_md.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/hashes/esm/_u64.js":
/*!************************************************!*\
  !*** ./node_modules/@noble/hashes/esm/_u64.js ***!
  \************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   add: () => (/* binding */ add),\n/* harmony export */   add3H: () => (/* binding */ add3H),\n/* harmony export */   add3L: () => (/* binding */ add3L),\n/* harmony export */   add4H: () => (/* binding */ add4H),\n/* harmony export */   add4L: () => (/* binding */ add4L),\n/* harmony export */   add5H: () => (/* binding */ add5H),\n/* harmony export */   add5L: () => (/* binding */ add5L),\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */   fromBig: () => (/* binding */ fromBig),\n/* harmony export */   rotlBH: () => (/* binding */ rotlBH),\n/* harmony export */   rotlBL: () => (/* binding */ rotlBL),\n/* harmony export */   rotlSH: () => (/* binding */ rotlSH),\n/* harmony export */   rotlSL: () => (/* binding */ rotlSL),\n/* harmony export */   rotr32H: () => (/* binding */ rotr32H),\n/* harmony export */   rotr32L: () => (/* binding */ rotr32L),\n/* harmony export */   rotrBH: () => (/* binding */ rotrBH),\n/* harmony export */   rotrBL: () => (/* binding */ rotrBL),\n/* harmony export */   rotrSH: () => (/* binding */ rotrSH),\n/* harmony export */   rotrSL: () => (/* binding */ rotrSL),\n/* harmony export */   shrSH: () => (/* binding */ shrSH),\n/* harmony export */   shrSL: () => (/* binding */ shrSL),\n/* harmony export */   split: () => (/* binding */ split),\n/* harmony export */   toBig: () => (/* binding */ toBig)\n/* harmony export */ });\n/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\nfunction fromBig(n, le = false) {\n    if (le)\n        return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n    return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\nfunction split(lst, le = false) {\n    const len = lst.length;\n    let Ah = new Uint32Array(len);\n    let Al = new Uint32Array(len);\n    for (let i = 0; i < len; i++) {\n        const { h, l } = fromBig(lst[i], le);\n        [Ah[i], Al[i]] = [h, l];\n    }\n    return [Ah, Al];\n}\nconst toBig = (h, l) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h, _l, s) => h >>> s;\nconst shrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h, l, s) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h, l, s) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h, l, s) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h, l, s) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h, l) => l;\nconst rotr32L = (h, _l) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h, l, s) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h, l, s) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h, l, s) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h, l, s) => (h << (s - 32)) | (l >>> (64 - s));\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah, Al, Bh, Bl) {\n    const l = (Al >>> 0) + (Bl >>> 0);\n    return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al, Bl, Cl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low, Ah, Bh, Ch) => (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al, Bl, Cl, Dl) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low, Ah, Bh, Ch, Dh) => (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al, Bl, Cl, Dl, El) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low, Ah, Bh, Ch, Dh, Eh) => (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n// prettier-ignore\n\n// prettier-ignore\nconst u64 = {\n    fromBig, split, toBig,\n    shrSH, shrSL,\n    rotrSH, rotrSL, rotrBH, rotrBL,\n    rotr32H, rotr32L,\n    rotlSH, rotlSL, rotlBH, rotlBL,\n    add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (u64);\n//# sourceMappingURL=_u64.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9fdTY0LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLFNBQVM7QUFDN0IsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNnTDtBQUNoTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpRUFBZSxHQUFHLEVBQUM7QUFDbkIiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5vYmxlL2hhc2hlcy9lc20vX3U2NC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVybmFsIGhlbHBlcnMgZm9yIHU2NC4gQmlnVWludDY0QXJyYXkgaXMgdG9vIHNsb3cgYXMgcGVyIDIwMjUsIHNvIHdlIGltcGxlbWVudCBpdCB1c2luZyBVaW50MzJBcnJheS5cbiAqIEB0b2RvIHJlLWNoZWNrIGh0dHBzOi8vaXNzdWVzLmNocm9taXVtLm9yZy9pc3N1ZXMvNDIyMTI1ODhcbiAqIEBtb2R1bGVcbiAqL1xuY29uc3QgVTMyX01BU0s2NCA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMiAqKiAzMiAtIDEpO1xuY29uc3QgXzMybiA9IC8qIEBfX1BVUkVfXyAqLyBCaWdJbnQoMzIpO1xuZnVuY3Rpb24gZnJvbUJpZyhuLCBsZSA9IGZhbHNlKSB7XG4gICAgaWYgKGxlKVxuICAgICAgICByZXR1cm4geyBoOiBOdW1iZXIobiAmIFUzMl9NQVNLNjQpLCBsOiBOdW1iZXIoKG4gPj4gXzMybikgJiBVMzJfTUFTSzY0KSB9O1xuICAgIHJldHVybiB7IGg6IE51bWJlcigobiA+PiBfMzJuKSAmIFUzMl9NQVNLNjQpIHwgMCwgbDogTnVtYmVyKG4gJiBVMzJfTUFTSzY0KSB8IDAgfTtcbn1cbmZ1bmN0aW9uIHNwbGl0KGxzdCwgbGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGxlbiA9IGxzdC5sZW5ndGg7XG4gICAgbGV0IEFoID0gbmV3IFVpbnQzMkFycmF5KGxlbik7XG4gICAgbGV0IEFsID0gbmV3IFVpbnQzMkFycmF5KGxlbik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBjb25zdCB7IGgsIGwgfSA9IGZyb21CaWcobHN0W2ldLCBsZSk7XG4gICAgICAgIFtBaFtpXSwgQWxbaV1dID0gW2gsIGxdO1xuICAgIH1cbiAgICByZXR1cm4gW0FoLCBBbF07XG59XG5jb25zdCB0b0JpZyA9IChoLCBsKSA9PiAoQmlnSW50KGggPj4+IDApIDw8IF8zMm4pIHwgQmlnSW50KGwgPj4+IDApO1xuLy8gZm9yIFNoaWZ0IGluIFswLCAzMilcbmNvbnN0IHNoclNIID0gKGgsIF9sLCBzKSA9PiBoID4+PiBzO1xuY29uc3Qgc2hyU0wgPSAoaCwgbCwgcykgPT4gKGggPDwgKDMyIC0gcykpIHwgKGwgPj4+IHMpO1xuLy8gUmlnaHQgcm90YXRlIGZvciBTaGlmdCBpbiBbMSwgMzIpXG5jb25zdCByb3RyU0ggPSAoaCwgbCwgcykgPT4gKGggPj4+IHMpIHwgKGwgPDwgKDMyIC0gcykpO1xuY29uc3Qgcm90clNMID0gKGgsIGwsIHMpID0+IChoIDw8ICgzMiAtIHMpKSB8IChsID4+PiBzKTtcbi8vIFJpZ2h0IHJvdGF0ZSBmb3IgU2hpZnQgaW4gKDMyLCA2NCksIE5PVEU6IDMyIGlzIHNwZWNpYWwgY2FzZS5cbmNvbnN0IHJvdHJCSCA9IChoLCBsLCBzKSA9PiAoaCA8PCAoNjQgLSBzKSkgfCAobCA+Pj4gKHMgLSAzMikpO1xuY29uc3Qgcm90ckJMID0gKGgsIGwsIHMpID0+IChoID4+PiAocyAtIDMyKSkgfCAobCA8PCAoNjQgLSBzKSk7XG4vLyBSaWdodCByb3RhdGUgZm9yIHNoaWZ0PT09MzIgKGp1c3Qgc3dhcHMgbCZoKVxuY29uc3Qgcm90cjMySCA9IChfaCwgbCkgPT4gbDtcbmNvbnN0IHJvdHIzMkwgPSAoaCwgX2wpID0+IGg7XG4vLyBMZWZ0IHJvdGF0ZSBmb3IgU2hpZnQgaW4gWzEsIDMyKVxuY29uc3Qgcm90bFNIID0gKGgsIGwsIHMpID0+IChoIDw8IHMpIHwgKGwgPj4+ICgzMiAtIHMpKTtcbmNvbnN0IHJvdGxTTCA9IChoLCBsLCBzKSA9PiAobCA8PCBzKSB8IChoID4+PiAoMzIgLSBzKSk7XG4vLyBMZWZ0IHJvdGF0ZSBmb3IgU2hpZnQgaW4gKDMyLCA2NCksIE5PVEU6IDMyIGlzIHNwZWNpYWwgY2FzZS5cbmNvbnN0IHJvdGxCSCA9IChoLCBsLCBzKSA9PiAobCA8PCAocyAtIDMyKSkgfCAoaCA+Pj4gKDY0IC0gcykpO1xuY29uc3Qgcm90bEJMID0gKGgsIGwsIHMpID0+IChoIDw8IChzIC0gMzIpKSB8IChsID4+PiAoNjQgLSBzKSk7XG4vLyBKUyB1c2VzIDMyLWJpdCBzaWduZWQgaW50ZWdlcnMgZm9yIGJpdHdpc2Ugb3BlcmF0aW9ucyB3aGljaCBtZWFucyB3ZSBjYW5ub3Rcbi8vIHNpbXBsZSB0YWtlIGNhcnJ5IG91dCBvZiBsb3cgYml0IHN1bSBieSBzaGlmdCwgd2UgbmVlZCB0byB1c2UgZGl2aXNpb24uXG5mdW5jdGlvbiBhZGQoQWgsIEFsLCBCaCwgQmwpIHtcbiAgICBjb25zdCBsID0gKEFsID4+PiAwKSArIChCbCA+Pj4gMCk7XG4gICAgcmV0dXJuIHsgaDogKEFoICsgQmggKyAoKGwgLyAyICoqIDMyKSB8IDApKSB8IDAsIGw6IGwgfCAwIH07XG59XG4vLyBBZGRpdGlvbiB3aXRoIG1vcmUgdGhhbiAyIGVsZW1lbnRzXG5jb25zdCBhZGQzTCA9IChBbCwgQmwsIENsKSA9PiAoQWwgPj4+IDApICsgKEJsID4+PiAwKSArIChDbCA+Pj4gMCk7XG5jb25zdCBhZGQzSCA9IChsb3csIEFoLCBCaCwgQ2gpID0+IChBaCArIEJoICsgQ2ggKyAoKGxvdyAvIDIgKiogMzIpIHwgMCkpIHwgMDtcbmNvbnN0IGFkZDRMID0gKEFsLCBCbCwgQ2wsIERsKSA9PiAoQWwgPj4+IDApICsgKEJsID4+PiAwKSArIChDbCA+Pj4gMCkgKyAoRGwgPj4+IDApO1xuY29uc3QgYWRkNEggPSAobG93LCBBaCwgQmgsIENoLCBEaCkgPT4gKEFoICsgQmggKyBDaCArIERoICsgKChsb3cgLyAyICoqIDMyKSB8IDApKSB8IDA7XG5jb25zdCBhZGQ1TCA9IChBbCwgQmwsIENsLCBEbCwgRWwpID0+IChBbCA+Pj4gMCkgKyAoQmwgPj4+IDApICsgKENsID4+PiAwKSArIChEbCA+Pj4gMCkgKyAoRWwgPj4+IDApO1xuY29uc3QgYWRkNUggPSAobG93LCBBaCwgQmgsIENoLCBEaCwgRWgpID0+IChBaCArIEJoICsgQ2ggKyBEaCArIEVoICsgKChsb3cgLyAyICoqIDMyKSB8IDApKSB8IDA7XG4vLyBwcmV0dGllci1pZ25vcmVcbmV4cG9ydCB7IGFkZCwgYWRkM0gsIGFkZDNMLCBhZGQ0SCwgYWRkNEwsIGFkZDVILCBhZGQ1TCwgZnJvbUJpZywgcm90bEJILCByb3RsQkwsIHJvdGxTSCwgcm90bFNMLCByb3RyMzJILCByb3RyMzJMLCByb3RyQkgsIHJvdHJCTCwgcm90clNILCByb3RyU0wsIHNoclNILCBzaHJTTCwgc3BsaXQsIHRvQmlnIH07XG4vLyBwcmV0dGllci1pZ25vcmVcbmNvbnN0IHU2NCA9IHtcbiAgICBmcm9tQmlnLCBzcGxpdCwgdG9CaWcsXG4gICAgc2hyU0gsIHNoclNMLFxuICAgIHJvdHJTSCwgcm90clNMLCByb3RyQkgsIHJvdHJCTCxcbiAgICByb3RyMzJILCByb3RyMzJMLFxuICAgIHJvdGxTSCwgcm90bFNMLCByb3RsQkgsIHJvdGxCTCxcbiAgICBhZGQsIGFkZDNMLCBhZGQzSCwgYWRkNEwsIGFkZDRILCBhZGQ1SCwgYWRkNUwsXG59O1xuZXhwb3J0IGRlZmF1bHQgdTY0O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9X3U2NC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/hashes/esm/_u64.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/hashes/esm/crypto.js":
/*!**************************************************!*\
  !*** ./node_modules/@noble/hashes/esm/crypto.js ***!
  \**************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   crypto: () => (/* binding */ crypto)\n/* harmony export */ });\nconst crypto = typeof globalThis === 'object' && 'crypto' in globalThis ? globalThis.crypto : undefined;\n//# sourceMappingURL=crypto.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9jcnlwdG8uanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFPO0FBQ1AiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5vYmxlL2hhc2hlcy9lc20vY3J5cHRvLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBjcnlwdG8gPSB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ29iamVjdCcgJiYgJ2NyeXB0bycgaW4gZ2xvYmFsVGhpcyA/IGdsb2JhbFRoaXMuY3J5cHRvIDogdW5kZWZpbmVkO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3J5cHRvLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/hashes/esm/crypto.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/hashes/esm/hmac.js":
/*!************************************************!*\
  !*** ./node_modules/@noble/hashes/esm/hmac.js ***!
  \************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   HMAC: () => (/* binding */ HMAC),\n/* harmony export */   hmac: () => (/* binding */ hmac)\n/* harmony export */ });\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\n\nclass HMAC extends _utils_js__WEBPACK_IMPORTED_MODULE_0__.Hash {\n    constructor(hash, _key) {\n        super();\n        this.finished = false;\n        this.destroyed = false;\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.ahash)(hash);\n        const key = (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.toBytes)(_key);\n        this.iHash = hash.create();\n        if (typeof this.iHash.update !== 'function')\n            throw new Error('Expected instance of class which extends utils.Hash');\n        this.blockLen = this.iHash.blockLen;\n        this.outputLen = this.iHash.outputLen;\n        const blockLen = this.blockLen;\n        const pad = new Uint8Array(blockLen);\n        // blockLen can be bigger than outputLen\n        pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n        for (let i = 0; i < pad.length; i++)\n            pad[i] ^= 0x36;\n        this.iHash.update(pad);\n        // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n        this.oHash = hash.create();\n        // Undo internal XOR && apply outer XOR\n        for (let i = 0; i < pad.length; i++)\n            pad[i] ^= 0x36 ^ 0x5c;\n        this.oHash.update(pad);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.clean)(pad);\n    }\n    update(buf) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.aexists)(this);\n        this.iHash.update(buf);\n        return this;\n    }\n    digestInto(out) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.aexists)(this);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_0__.abytes)(out, this.outputLen);\n        this.finished = true;\n        this.iHash.digestInto(out);\n        this.oHash.update(out);\n        this.oHash.digestInto(out);\n        this.destroy();\n    }\n    digest() {\n        const out = new Uint8Array(this.oHash.outputLen);\n        this.digestInto(out);\n        return out;\n    }\n    _cloneInto(to) {\n        // Create new instance without calling constructor since key already in state and we don't know it.\n        to || (to = Object.create(Object.getPrototypeOf(this), {}));\n        const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n        to = to;\n        to.finished = finished;\n        to.destroyed = destroyed;\n        to.blockLen = blockLen;\n        to.outputLen = outputLen;\n        to.oHash = oHash._cloneInto(to.oHash);\n        to.iHash = iHash._cloneInto(to.iHash);\n        return to;\n    }\n    clone() {\n        return this._cloneInto();\n    }\n    destroy() {\n        this.destroyed = true;\n        this.oHash.destroy();\n        this.iHash.destroy();\n    }\n}\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nconst hmac = (hash, key, message) => new HMAC(hash, key).update(message).digest();\nhmac.create = (hash, key) => new HMAC(hash, key);\n//# sourceMappingURL=hmac.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9obWFjLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQzBFO0FBQ25FLG1CQUFtQiwyQ0FBSTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0RBQUs7QUFDYixvQkFBb0Isa0RBQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGdCQUFnQjtBQUN4QztBQUNBO0FBQ0EsUUFBUSxnREFBSztBQUNiO0FBQ0E7QUFDQSxRQUFRLGtEQUFPO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGtEQUFPO0FBQ2YsUUFBUSxpREFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFLGdCQUFnQix5REFBeUQ7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ087QUFDUDtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0Bub2JsZS9oYXNoZXMvZXNtL2htYWMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBITUFDOiBSRkMyMTA0IG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZS5cbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgYWJ5dGVzLCBhZXhpc3RzLCBhaGFzaCwgY2xlYW4sIEhhc2gsIHRvQnl0ZXMgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuZXhwb3J0IGNsYXNzIEhNQUMgZXh0ZW5kcyBIYXNoIHtcbiAgICBjb25zdHJ1Y3RvcihoYXNoLCBfa2V5KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5kZXN0cm95ZWQgPSBmYWxzZTtcbiAgICAgICAgYWhhc2goaGFzaCk7XG4gICAgICAgIGNvbnN0IGtleSA9IHRvQnl0ZXMoX2tleSk7XG4gICAgICAgIHRoaXMuaUhhc2ggPSBoYXNoLmNyZWF0ZSgpO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaUhhc2gudXBkYXRlICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBpbnN0YW5jZSBvZiBjbGFzcyB3aGljaCBleHRlbmRzIHV0aWxzLkhhc2gnKTtcbiAgICAgICAgdGhpcy5ibG9ja0xlbiA9IHRoaXMuaUhhc2guYmxvY2tMZW47XG4gICAgICAgIHRoaXMub3V0cHV0TGVuID0gdGhpcy5pSGFzaC5vdXRwdXRMZW47XG4gICAgICAgIGNvbnN0IGJsb2NrTGVuID0gdGhpcy5ibG9ja0xlbjtcbiAgICAgICAgY29uc3QgcGFkID0gbmV3IFVpbnQ4QXJyYXkoYmxvY2tMZW4pO1xuICAgICAgICAvLyBibG9ja0xlbiBjYW4gYmUgYmlnZ2VyIHRoYW4gb3V0cHV0TGVuXG4gICAgICAgIHBhZC5zZXQoa2V5Lmxlbmd0aCA+IGJsb2NrTGVuID8gaGFzaC5jcmVhdGUoKS51cGRhdGUoa2V5KS5kaWdlc3QoKSA6IGtleSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFkLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgcGFkW2ldIF49IDB4MzY7XG4gICAgICAgIHRoaXMuaUhhc2gudXBkYXRlKHBhZCk7XG4gICAgICAgIC8vIEJ5IGRvaW5nIHVwZGF0ZSAocHJvY2Vzc2luZyBvZiBmaXJzdCBibG9jaykgb2Ygb3V0ZXIgaGFzaCBoZXJlIHdlIGNhbiByZS11c2UgaXQgYmV0d2VlbiBtdWx0aXBsZSBjYWxscyB2aWEgY2xvbmVcbiAgICAgICAgdGhpcy5vSGFzaCA9IGhhc2guY3JlYXRlKCk7XG4gICAgICAgIC8vIFVuZG8gaW50ZXJuYWwgWE9SICYmIGFwcGx5IG91dGVyIFhPUlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhZC5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIHBhZFtpXSBePSAweDM2IF4gMHg1YztcbiAgICAgICAgdGhpcy5vSGFzaC51cGRhdGUocGFkKTtcbiAgICAgICAgY2xlYW4ocGFkKTtcbiAgICB9XG4gICAgdXBkYXRlKGJ1Zikge1xuICAgICAgICBhZXhpc3RzKHRoaXMpO1xuICAgICAgICB0aGlzLmlIYXNoLnVwZGF0ZShidWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGlnZXN0SW50byhvdXQpIHtcbiAgICAgICAgYWV4aXN0cyh0aGlzKTtcbiAgICAgICAgYWJ5dGVzKG91dCwgdGhpcy5vdXRwdXRMZW4pO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pSGFzaC5kaWdlc3RJbnRvKG91dCk7XG4gICAgICAgIHRoaXMub0hhc2gudXBkYXRlKG91dCk7XG4gICAgICAgIHRoaXMub0hhc2guZGlnZXN0SW50byhvdXQpO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgZGlnZXN0KCkge1xuICAgICAgICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheSh0aGlzLm9IYXNoLm91dHB1dExlbik7XG4gICAgICAgIHRoaXMuZGlnZXN0SW50byhvdXQpO1xuICAgICAgICByZXR1cm4gb3V0O1xuICAgIH1cbiAgICBfY2xvbmVJbnRvKHRvKSB7XG4gICAgICAgIC8vIENyZWF0ZSBuZXcgaW5zdGFuY2Ugd2l0aG91dCBjYWxsaW5nIGNvbnN0cnVjdG9yIHNpbmNlIGtleSBhbHJlYWR5IGluIHN0YXRlIGFuZCB3ZSBkb24ndCBrbm93IGl0LlxuICAgICAgICB0byB8fCAodG8gPSBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSwge30pKTtcbiAgICAgICAgY29uc3QgeyBvSGFzaCwgaUhhc2gsIGZpbmlzaGVkLCBkZXN0cm95ZWQsIGJsb2NrTGVuLCBvdXRwdXRMZW4gfSA9IHRoaXM7XG4gICAgICAgIHRvID0gdG87XG4gICAgICAgIHRvLmZpbmlzaGVkID0gZmluaXNoZWQ7XG4gICAgICAgIHRvLmRlc3Ryb3llZCA9IGRlc3Ryb3llZDtcbiAgICAgICAgdG8uYmxvY2tMZW4gPSBibG9ja0xlbjtcbiAgICAgICAgdG8ub3V0cHV0TGVuID0gb3V0cHV0TGVuO1xuICAgICAgICB0by5vSGFzaCA9IG9IYXNoLl9jbG9uZUludG8odG8ub0hhc2gpO1xuICAgICAgICB0by5pSGFzaCA9IGlIYXNoLl9jbG9uZUludG8odG8uaUhhc2gpO1xuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvbmVJbnRvKCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5vSGFzaC5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMuaUhhc2guZGVzdHJveSgpO1xuICAgIH1cbn1cbi8qKlxuICogSE1BQzogUkZDMjEwNCBtZXNzYWdlIGF1dGhlbnRpY2F0aW9uIGNvZGUuXG4gKiBAcGFyYW0gaGFzaCAtIGZ1bmN0aW9uIHRoYXQgd291bGQgYmUgdXNlZCBlLmcuIHNoYTI1NlxuICogQHBhcmFtIGtleSAtIG1lc3NhZ2Uga2V5XG4gKiBAcGFyYW0gbWVzc2FnZSAtIG1lc3NhZ2UgZGF0YVxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGhtYWMgfSBmcm9tICdAbm9ibGUvaGFzaGVzL2htYWMnO1xuICogaW1wb3J0IHsgc2hhMjU2IH0gZnJvbSAnQG5vYmxlL2hhc2hlcy9zaGEyJztcbiAqIGNvbnN0IG1hYzEgPSBobWFjKHNoYTI1NiwgJ2tleScsICdtZXNzYWdlJyk7XG4gKi9cbmV4cG9ydCBjb25zdCBobWFjID0gKGhhc2gsIGtleSwgbWVzc2FnZSkgPT4gbmV3IEhNQUMoaGFzaCwga2V5KS51cGRhdGUobWVzc2FnZSkuZGlnZXN0KCk7XG5obWFjLmNyZWF0ZSA9IChoYXNoLCBrZXkpID0+IG5ldyBITUFDKGhhc2gsIGtleSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1obWFjLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/hashes/esm/hmac.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/hashes/esm/legacy.js":
/*!**************************************************!*\
  !*** ./node_modules/@noble/hashes/esm/legacy.js ***!
  \**************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   MD5: () => (/* binding */ MD5),\n/* harmony export */   RIPEMD160: () => (/* binding */ RIPEMD160),\n/* harmony export */   SHA1: () => (/* binding */ SHA1),\n/* harmony export */   md5: () => (/* binding */ md5),\n/* harmony export */   ripemd160: () => (/* binding */ ripemd160),\n/* harmony export */   sha1: () => (/* binding */ sha1)\n/* harmony export */ });\n/* harmony import */ var _md_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_md.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/_md.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/**\n\nSHA1 (RFC 3174), MD5 (RFC 1321) and RIPEMD160 (RFC 2286) legacy, weak hash functions.\nDon't use them in a new protocol. What \"weak\" means:\n\n- Collisions can be made with 2^18 effort in MD5, 2^60 in SHA1, 2^80 in RIPEMD160.\n- No practical pre-image attacks (only theoretical, 2^123.4)\n- HMAC seems kinda ok: https://datatracker.ietf.org/doc/html/rfc6151\n * @module\n */\n\n\n/** Initial SHA1 state */\nconst SHA1_IV = /* @__PURE__ */ Uint32Array.from([\n    0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0,\n]);\n// Reusable temporary buffer\nconst SHA1_W = /* @__PURE__ */ new Uint32Array(80);\n/** SHA1 legacy hash class. */\nclass SHA1 extends _md_js__WEBPACK_IMPORTED_MODULE_0__.HashMD {\n    constructor() {\n        super(64, 20, 8, false);\n        this.A = SHA1_IV[0] | 0;\n        this.B = SHA1_IV[1] | 0;\n        this.C = SHA1_IV[2] | 0;\n        this.D = SHA1_IV[3] | 0;\n        this.E = SHA1_IV[4] | 0;\n    }\n    get() {\n        const { A, B, C, D, E } = this;\n        return [A, B, C, D, E];\n    }\n    set(A, B, C, D, E) {\n        this.A = A | 0;\n        this.B = B | 0;\n        this.C = C | 0;\n        this.D = D | 0;\n        this.E = E | 0;\n    }\n    process(view, offset) {\n        for (let i = 0; i < 16; i++, offset += 4)\n            SHA1_W[i] = view.getUint32(offset, false);\n        for (let i = 16; i < 80; i++)\n            SHA1_W[i] = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotl)(SHA1_W[i - 3] ^ SHA1_W[i - 8] ^ SHA1_W[i - 14] ^ SHA1_W[i - 16], 1);\n        // Compression function main loop, 80 rounds\n        let { A, B, C, D, E } = this;\n        for (let i = 0; i < 80; i++) {\n            let F, K;\n            if (i < 20) {\n                F = (0,_md_js__WEBPACK_IMPORTED_MODULE_0__.Chi)(B, C, D);\n                K = 0x5a827999;\n            }\n            else if (i < 40) {\n                F = B ^ C ^ D;\n                K = 0x6ed9eba1;\n            }\n            else if (i < 60) {\n                F = (0,_md_js__WEBPACK_IMPORTED_MODULE_0__.Maj)(B, C, D);\n                K = 0x8f1bbcdc;\n            }\n            else {\n                F = B ^ C ^ D;\n                K = 0xca62c1d6;\n            }\n            const T = ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotl)(A, 5) + F + E + K + SHA1_W[i]) | 0;\n            E = D;\n            D = C;\n            C = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotl)(B, 30);\n            B = A;\n            A = T;\n        }\n        // Add the compressed chunk to the current hash value\n        A = (A + this.A) | 0;\n        B = (B + this.B) | 0;\n        C = (C + this.C) | 0;\n        D = (D + this.D) | 0;\n        E = (E + this.E) | 0;\n        this.set(A, B, C, D, E);\n    }\n    roundClean() {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(SHA1_W);\n    }\n    destroy() {\n        this.set(0, 0, 0, 0, 0);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(this.buffer);\n    }\n}\n/** SHA1 (RFC 3174) legacy hash function. It was cryptographically broken. */\nconst sha1 = /* @__PURE__ */ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createHasher)(() => new SHA1());\n/** Per-round constants */\nconst p32 = /* @__PURE__ */ Math.pow(2, 32);\nconst K = /* @__PURE__ */ Array.from({ length: 64 }, (_, i) => Math.floor(p32 * Math.abs(Math.sin(i + 1))));\n/** md5 initial state: same as sha1, but 4 u32 instead of 5. */\nconst MD5_IV = /* @__PURE__ */ SHA1_IV.slice(0, 4);\n// Reusable temporary buffer\nconst MD5_W = /* @__PURE__ */ new Uint32Array(16);\n/** MD5 legacy hash class. */\nclass MD5 extends _md_js__WEBPACK_IMPORTED_MODULE_0__.HashMD {\n    constructor() {\n        super(64, 16, 8, true);\n        this.A = MD5_IV[0] | 0;\n        this.B = MD5_IV[1] | 0;\n        this.C = MD5_IV[2] | 0;\n        this.D = MD5_IV[3] | 0;\n    }\n    get() {\n        const { A, B, C, D } = this;\n        return [A, B, C, D];\n    }\n    set(A, B, C, D) {\n        this.A = A | 0;\n        this.B = B | 0;\n        this.C = C | 0;\n        this.D = D | 0;\n    }\n    process(view, offset) {\n        for (let i = 0; i < 16; i++, offset += 4)\n            MD5_W[i] = view.getUint32(offset, true);\n        // Compression function main loop, 64 rounds\n        let { A, B, C, D } = this;\n        for (let i = 0; i < 64; i++) {\n            let F, g, s;\n            if (i < 16) {\n                F = (0,_md_js__WEBPACK_IMPORTED_MODULE_0__.Chi)(B, C, D);\n                g = i;\n                s = [7, 12, 17, 22];\n            }\n            else if (i < 32) {\n                F = (0,_md_js__WEBPACK_IMPORTED_MODULE_0__.Chi)(D, B, C);\n                g = (5 * i + 1) % 16;\n                s = [5, 9, 14, 20];\n            }\n            else if (i < 48) {\n                F = B ^ C ^ D;\n                g = (3 * i + 5) % 16;\n                s = [4, 11, 16, 23];\n            }\n            else {\n                F = C ^ (B | ~D);\n                g = (7 * i) % 16;\n                s = [6, 10, 15, 21];\n            }\n            F = F + A + K[i] + MD5_W[g];\n            A = D;\n            D = C;\n            C = B;\n            B = B + (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotl)(F, s[i % 4]);\n        }\n        // Add the compressed chunk to the current hash value\n        A = (A + this.A) | 0;\n        B = (B + this.B) | 0;\n        C = (C + this.C) | 0;\n        D = (D + this.D) | 0;\n        this.set(A, B, C, D);\n    }\n    roundClean() {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(MD5_W);\n    }\n    destroy() {\n        this.set(0, 0, 0, 0);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(this.buffer);\n    }\n}\n/**\n * MD5 (RFC 1321) legacy hash function. It was cryptographically broken.\n * MD5 architecture is similar to SHA1, with some differences:\n * - Reduced output length: 16 bytes (128 bit) instead of 20\n * - 64 rounds, instead of 80\n * - Little-endian: could be faster, but will require more code\n * - Non-linear index selection: huge speed-up for unroll\n * - Per round constants: more memory accesses, additional speed-up for unroll\n */\nconst md5 = /* @__PURE__ */ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createHasher)(() => new MD5());\n// RIPEMD-160\nconst Rho160 = /* @__PURE__ */ Uint8Array.from([\n    7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,\n]);\nconst Id160 = /* @__PURE__ */ (() => Uint8Array.from(new Array(16).fill(0).map((_, i) => i)))();\nconst Pi160 = /* @__PURE__ */ (() => Id160.map((i) => (9 * i + 5) % 16))();\nconst idxLR = /* @__PURE__ */ (() => {\n    const L = [Id160];\n    const R = [Pi160];\n    const res = [L, R];\n    for (let i = 0; i < 4; i++)\n        for (let j of res)\n            j.push(j[i].map((k) => Rho160[k]));\n    return res;\n})();\nconst idxL = /* @__PURE__ */ (() => idxLR[0])();\nconst idxR = /* @__PURE__ */ (() => idxLR[1])();\n// const [idxL, idxR] = idxLR;\nconst shifts160 = /* @__PURE__ */ [\n    [11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8],\n    [12, 13, 11, 15, 6, 9, 9, 7, 12, 15, 11, 13, 7, 8, 7, 7],\n    [13, 15, 14, 11, 7, 7, 6, 8, 13, 14, 13, 12, 5, 5, 6, 9],\n    [14, 11, 12, 14, 8, 6, 5, 5, 15, 12, 15, 14, 9, 9, 8, 6],\n    [15, 12, 13, 13, 9, 5, 8, 6, 14, 11, 12, 11, 8, 6, 5, 5],\n].map((i) => Uint8Array.from(i));\nconst shiftsL160 = /* @__PURE__ */ idxL.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst shiftsR160 = /* @__PURE__ */ idxR.map((idx, i) => idx.map((j) => shifts160[i][j]));\nconst Kl160 = /* @__PURE__ */ Uint32Array.from([\n    0x00000000, 0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xa953fd4e,\n]);\nconst Kr160 = /* @__PURE__ */ Uint32Array.from([\n    0x50a28be6, 0x5c4dd124, 0x6d703ef3, 0x7a6d76e9, 0x00000000,\n]);\n// It's called f() in spec.\nfunction ripemd_f(group, x, y, z) {\n    if (group === 0)\n        return x ^ y ^ z;\n    if (group === 1)\n        return (x & y) | (~x & z);\n    if (group === 2)\n        return (x | ~y) ^ z;\n    if (group === 3)\n        return (x & z) | (y & ~z);\n    return x ^ (y | ~z);\n}\n// Reusable temporary buffer\nconst BUF_160 = /* @__PURE__ */ new Uint32Array(16);\nclass RIPEMD160 extends _md_js__WEBPACK_IMPORTED_MODULE_0__.HashMD {\n    constructor() {\n        super(64, 20, 8, true);\n        this.h0 = 0x67452301 | 0;\n        this.h1 = 0xefcdab89 | 0;\n        this.h2 = 0x98badcfe | 0;\n        this.h3 = 0x10325476 | 0;\n        this.h4 = 0xc3d2e1f0 | 0;\n    }\n    get() {\n        const { h0, h1, h2, h3, h4 } = this;\n        return [h0, h1, h2, h3, h4];\n    }\n    set(h0, h1, h2, h3, h4) {\n        this.h0 = h0 | 0;\n        this.h1 = h1 | 0;\n        this.h2 = h2 | 0;\n        this.h3 = h3 | 0;\n        this.h4 = h4 | 0;\n    }\n    process(view, offset) {\n        for (let i = 0; i < 16; i++, offset += 4)\n            BUF_160[i] = view.getUint32(offset, true);\n        // prettier-ignore\n        let al = this.h0 | 0, ar = al, bl = this.h1 | 0, br = bl, cl = this.h2 | 0, cr = cl, dl = this.h3 | 0, dr = dl, el = this.h4 | 0, er = el;\n        // Instead of iterating 0 to 80, we split it into 5 groups\n        // And use the groups in constants, functions, etc. Much simpler\n        for (let group = 0; group < 5; group++) {\n            const rGroup = 4 - group;\n            const hbl = Kl160[group], hbr = Kr160[group]; // prettier-ignore\n            const rl = idxL[group], rr = idxR[group]; // prettier-ignore\n            const sl = shiftsL160[group], sr = shiftsR160[group]; // prettier-ignore\n            for (let i = 0; i < 16; i++) {\n                const tl = ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotl)(al + ripemd_f(group, bl, cl, dl) + BUF_160[rl[i]] + hbl, sl[i]) + el) | 0;\n                al = el, el = dl, dl = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotl)(cl, 10) | 0, cl = bl, bl = tl; // prettier-ignore\n            }\n            // 2 loops are 10% faster\n            for (let i = 0; i < 16; i++) {\n                const tr = ((0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotl)(ar + ripemd_f(rGroup, br, cr, dr) + BUF_160[rr[i]] + hbr, sr[i]) + er) | 0;\n                ar = er, er = dr, dr = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotl)(cr, 10) | 0, cr = br, br = tr; // prettier-ignore\n            }\n        }\n        // Add the compressed chunk to the current hash value\n        this.set((this.h1 + cl + dr) | 0, (this.h2 + dl + er) | 0, (this.h3 + el + ar) | 0, (this.h4 + al + br) | 0, (this.h0 + bl + cr) | 0);\n    }\n    roundClean() {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(BUF_160);\n    }\n    destroy() {\n        this.destroyed = true;\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(this.buffer);\n        this.set(0, 0, 0, 0, 0);\n    }\n}\n/**\n * RIPEMD-160 - a legacy hash function from 1990s.\n * * https://homes.esat.kuleuven.be/~bosselae/ripemd160.html\n * * https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf\n */\nconst ripemd160 = /* @__PURE__ */ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createHasher)(() => new RIPEMD160());\n//# sourceMappingURL=legacy.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9sZWdhY3kuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDNEM7QUFDVztBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLG1CQUFtQiwwQ0FBTTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsZ0JBQWdCO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQSx5QkFBeUIsUUFBUTtBQUNqQyx3QkFBd0IsK0NBQUk7QUFDNUI7QUFDQSxjQUFjLGdCQUFnQjtBQUM5Qix3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0Esb0JBQW9CLDJDQUFHO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLDJDQUFHO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QiwrQ0FBSTtBQUMzQjtBQUNBO0FBQ0EsZ0JBQWdCLCtDQUFJO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0RBQUs7QUFDYjtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdEQUFLO0FBQ2I7QUFDQTtBQUNBO0FBQ08sNkJBQTZCLHVEQUFZO0FBQ2hEO0FBQ0E7QUFDQSx1Q0FBdUMsWUFBWTtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sa0JBQWtCLDBDQUFNO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsYUFBYTtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0EsY0FBYyxhQUFhO0FBQzNCLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0E7QUFDQSxvQkFBb0IsMkNBQUc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsMkNBQUc7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiwrQ0FBSTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdEQUFLO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsUUFBUSxnREFBSztBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyw0QkFBNEIsdURBQVk7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsT0FBTztBQUMzQjtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHdCQUF3QiwwQ0FBTTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IscUJBQXFCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixXQUFXO0FBQ3ZDO0FBQ0EsMERBQTBEO0FBQzFELHNEQUFzRDtBQUN0RCxrRUFBa0U7QUFDbEUsNEJBQTRCLFFBQVE7QUFDcEMsNEJBQTRCLCtDQUFJO0FBQ2hDLHVDQUF1QywrQ0FBSSxnQ0FBZ0M7QUFDM0U7QUFDQTtBQUNBLDRCQUE0QixRQUFRO0FBQ3BDLDRCQUE0QiwrQ0FBSTtBQUNoQyx1Q0FBdUMsK0NBQUksZ0NBQWdDO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0RBQUs7QUFDYjtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdEQUFLO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGtDQUFrQyx1REFBWTtBQUNyRCIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9sZWdhY3kuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG5cblNIQTEgKFJGQyAzMTc0KSwgTUQ1IChSRkMgMTMyMSkgYW5kIFJJUEVNRDE2MCAoUkZDIDIyODYpIGxlZ2FjeSwgd2VhayBoYXNoIGZ1bmN0aW9ucy5cbkRvbid0IHVzZSB0aGVtIGluIGEgbmV3IHByb3RvY29sLiBXaGF0IFwid2Vha1wiIG1lYW5zOlxuXG4tIENvbGxpc2lvbnMgY2FuIGJlIG1hZGUgd2l0aCAyXjE4IGVmZm9ydCBpbiBNRDUsIDJeNjAgaW4gU0hBMSwgMl44MCBpbiBSSVBFTUQxNjAuXG4tIE5vIHByYWN0aWNhbCBwcmUtaW1hZ2UgYXR0YWNrcyAob25seSB0aGVvcmV0aWNhbCwgMl4xMjMuNClcbi0gSE1BQyBzZWVtcyBraW5kYSBvazogaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2MTUxXG4gKiBAbW9kdWxlXG4gKi9cbmltcG9ydCB7IENoaSwgSGFzaE1ELCBNYWogfSBmcm9tIFwiLi9fbWQuanNcIjtcbmltcG9ydCB7IGNsZWFuLCBjcmVhdGVIYXNoZXIsIHJvdGwgfSBmcm9tIFwiLi91dGlscy5qc1wiO1xuLyoqIEluaXRpYWwgU0hBMSBzdGF0ZSAqL1xuY29uc3QgU0hBMV9JViA9IC8qIEBfX1BVUkVfXyAqLyBVaW50MzJBcnJheS5mcm9tKFtcbiAgICAweDY3NDUyMzAxLCAweGVmY2RhYjg5LCAweDk4YmFkY2ZlLCAweDEwMzI1NDc2LCAweGMzZDJlMWYwLFxuXSk7XG4vLyBSZXVzYWJsZSB0ZW1wb3JhcnkgYnVmZmVyXG5jb25zdCBTSEExX1cgPSAvKiBAX19QVVJFX18gKi8gbmV3IFVpbnQzMkFycmF5KDgwKTtcbi8qKiBTSEExIGxlZ2FjeSBoYXNoIGNsYXNzLiAqL1xuZXhwb3J0IGNsYXNzIFNIQTEgZXh0ZW5kcyBIYXNoTUQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcig2NCwgMjAsIDgsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5BID0gU0hBMV9JVlswXSB8IDA7XG4gICAgICAgIHRoaXMuQiA9IFNIQTFfSVZbMV0gfCAwO1xuICAgICAgICB0aGlzLkMgPSBTSEExX0lWWzJdIHwgMDtcbiAgICAgICAgdGhpcy5EID0gU0hBMV9JVlszXSB8IDA7XG4gICAgICAgIHRoaXMuRSA9IFNIQTFfSVZbNF0gfCAwO1xuICAgIH1cbiAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IHsgQSwgQiwgQywgRCwgRSB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFtBLCBCLCBDLCBELCBFXTtcbiAgICB9XG4gICAgc2V0KEEsIEIsIEMsIEQsIEUpIHtcbiAgICAgICAgdGhpcy5BID0gQSB8IDA7XG4gICAgICAgIHRoaXMuQiA9IEIgfCAwO1xuICAgICAgICB0aGlzLkMgPSBDIHwgMDtcbiAgICAgICAgdGhpcy5EID0gRCB8IDA7XG4gICAgICAgIHRoaXMuRSA9IEUgfCAwO1xuICAgIH1cbiAgICBwcm9jZXNzKHZpZXcsIG9mZnNldCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDE2OyBpKyssIG9mZnNldCArPSA0KVxuICAgICAgICAgICAgU0hBMV9XW2ldID0gdmlldy5nZXRVaW50MzIob2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDgwOyBpKyspXG4gICAgICAgICAgICBTSEExX1dbaV0gPSByb3RsKFNIQTFfV1tpIC0gM10gXiBTSEExX1dbaSAtIDhdIF4gU0hBMV9XW2kgLSAxNF0gXiBTSEExX1dbaSAtIDE2XSwgMSk7XG4gICAgICAgIC8vIENvbXByZXNzaW9uIGZ1bmN0aW9uIG1haW4gbG9vcCwgODAgcm91bmRzXG4gICAgICAgIGxldCB7IEEsIEIsIEMsIEQsIEUgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODA7IGkrKykge1xuICAgICAgICAgICAgbGV0IEYsIEs7XG4gICAgICAgICAgICBpZiAoaSA8IDIwKSB7XG4gICAgICAgICAgICAgICAgRiA9IENoaShCLCBDLCBEKTtcbiAgICAgICAgICAgICAgICBLID0gMHg1YTgyNzk5OTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGkgPCA0MCkge1xuICAgICAgICAgICAgICAgIEYgPSBCIF4gQyBeIEQ7XG4gICAgICAgICAgICAgICAgSyA9IDB4NmVkOWViYTE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpIDwgNjApIHtcbiAgICAgICAgICAgICAgICBGID0gTWFqKEIsIEMsIEQpO1xuICAgICAgICAgICAgICAgIEsgPSAweDhmMWJiY2RjO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgRiA9IEIgXiBDIF4gRDtcbiAgICAgICAgICAgICAgICBLID0gMHhjYTYyYzFkNjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IFQgPSAocm90bChBLCA1KSArIEYgKyBFICsgSyArIFNIQTFfV1tpXSkgfCAwO1xuICAgICAgICAgICAgRSA9IEQ7XG4gICAgICAgICAgICBEID0gQztcbiAgICAgICAgICAgIEMgPSByb3RsKEIsIDMwKTtcbiAgICAgICAgICAgIEIgPSBBO1xuICAgICAgICAgICAgQSA9IFQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIHRoZSBjb21wcmVzc2VkIGNodW5rIHRvIHRoZSBjdXJyZW50IGhhc2ggdmFsdWVcbiAgICAgICAgQSA9IChBICsgdGhpcy5BKSB8IDA7XG4gICAgICAgIEIgPSAoQiArIHRoaXMuQikgfCAwO1xuICAgICAgICBDID0gKEMgKyB0aGlzLkMpIHwgMDtcbiAgICAgICAgRCA9IChEICsgdGhpcy5EKSB8IDA7XG4gICAgICAgIEUgPSAoRSArIHRoaXMuRSkgfCAwO1xuICAgICAgICB0aGlzLnNldChBLCBCLCBDLCBELCBFKTtcbiAgICB9XG4gICAgcm91bmRDbGVhbigpIHtcbiAgICAgICAgY2xlYW4oU0hBMV9XKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCk7XG4gICAgICAgIGNsZWFuKHRoaXMuYnVmZmVyKTtcbiAgICB9XG59XG4vKiogU0hBMSAoUkZDIDMxNzQpIGxlZ2FjeSBoYXNoIGZ1bmN0aW9uLiBJdCB3YXMgY3J5cHRvZ3JhcGhpY2FsbHkgYnJva2VuLiAqL1xuZXhwb3J0IGNvbnN0IHNoYTEgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlSGFzaGVyKCgpID0+IG5ldyBTSEExKCkpO1xuLyoqIFBlci1yb3VuZCBjb25zdGFudHMgKi9cbmNvbnN0IHAzMiA9IC8qIEBfX1BVUkVfXyAqLyBNYXRoLnBvdygyLCAzMik7XG5jb25zdCBLID0gLyogQF9fUFVSRV9fICovIEFycmF5LmZyb20oeyBsZW5ndGg6IDY0IH0sIChfLCBpKSA9PiBNYXRoLmZsb29yKHAzMiAqIE1hdGguYWJzKE1hdGguc2luKGkgKyAxKSkpKTtcbi8qKiBtZDUgaW5pdGlhbCBzdGF0ZTogc2FtZSBhcyBzaGExLCBidXQgNCB1MzIgaW5zdGVhZCBvZiA1LiAqL1xuY29uc3QgTUQ1X0lWID0gLyogQF9fUFVSRV9fICovIFNIQTFfSVYuc2xpY2UoMCwgNCk7XG4vLyBSZXVzYWJsZSB0ZW1wb3JhcnkgYnVmZmVyXG5jb25zdCBNRDVfVyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVWludDMyQXJyYXkoMTYpO1xuLyoqIE1ENSBsZWdhY3kgaGFzaCBjbGFzcy4gKi9cbmV4cG9ydCBjbGFzcyBNRDUgZXh0ZW5kcyBIYXNoTUQge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcig2NCwgMTYsIDgsIHRydWUpO1xuICAgICAgICB0aGlzLkEgPSBNRDVfSVZbMF0gfCAwO1xuICAgICAgICB0aGlzLkIgPSBNRDVfSVZbMV0gfCAwO1xuICAgICAgICB0aGlzLkMgPSBNRDVfSVZbMl0gfCAwO1xuICAgICAgICB0aGlzLkQgPSBNRDVfSVZbM10gfCAwO1xuICAgIH1cbiAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IHsgQSwgQiwgQywgRCB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFtBLCBCLCBDLCBEXTtcbiAgICB9XG4gICAgc2V0KEEsIEIsIEMsIEQpIHtcbiAgICAgICAgdGhpcy5BID0gQSB8IDA7XG4gICAgICAgIHRoaXMuQiA9IEIgfCAwO1xuICAgICAgICB0aGlzLkMgPSBDIHwgMDtcbiAgICAgICAgdGhpcy5EID0gRCB8IDA7XG4gICAgfVxuICAgIHByb2Nlc3Modmlldywgb2Zmc2V0KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKywgb2Zmc2V0ICs9IDQpXG4gICAgICAgICAgICBNRDVfV1tpXSA9IHZpZXcuZ2V0VWludDMyKG9mZnNldCwgdHJ1ZSk7XG4gICAgICAgIC8vIENvbXByZXNzaW9uIGZ1bmN0aW9uIG1haW4gbG9vcCwgNjQgcm91bmRzXG4gICAgICAgIGxldCB7IEEsIEIsIEMsIEQgfSA9IHRoaXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjQ7IGkrKykge1xuICAgICAgICAgICAgbGV0IEYsIGcsIHM7XG4gICAgICAgICAgICBpZiAoaSA8IDE2KSB7XG4gICAgICAgICAgICAgICAgRiA9IENoaShCLCBDLCBEKTtcbiAgICAgICAgICAgICAgICBnID0gaTtcbiAgICAgICAgICAgICAgICBzID0gWzcsIDEyLCAxNywgMjJdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaSA8IDMyKSB7XG4gICAgICAgICAgICAgICAgRiA9IENoaShELCBCLCBDKTtcbiAgICAgICAgICAgICAgICBnID0gKDUgKiBpICsgMSkgJSAxNjtcbiAgICAgICAgICAgICAgICBzID0gWzUsIDksIDE0LCAyMF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpIDwgNDgpIHtcbiAgICAgICAgICAgICAgICBGID0gQiBeIEMgXiBEO1xuICAgICAgICAgICAgICAgIGcgPSAoMyAqIGkgKyA1KSAlIDE2O1xuICAgICAgICAgICAgICAgIHMgPSBbNCwgMTEsIDE2LCAyM107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBGID0gQyBeIChCIHwgfkQpO1xuICAgICAgICAgICAgICAgIGcgPSAoNyAqIGkpICUgMTY7XG4gICAgICAgICAgICAgICAgcyA9IFs2LCAxMCwgMTUsIDIxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEYgPSBGICsgQSArIEtbaV0gKyBNRDVfV1tnXTtcbiAgICAgICAgICAgIEEgPSBEO1xuICAgICAgICAgICAgRCA9IEM7XG4gICAgICAgICAgICBDID0gQjtcbiAgICAgICAgICAgIEIgPSBCICsgcm90bChGLCBzW2kgJSA0XSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQWRkIHRoZSBjb21wcmVzc2VkIGNodW5rIHRvIHRoZSBjdXJyZW50IGhhc2ggdmFsdWVcbiAgICAgICAgQSA9IChBICsgdGhpcy5BKSB8IDA7XG4gICAgICAgIEIgPSAoQiArIHRoaXMuQikgfCAwO1xuICAgICAgICBDID0gKEMgKyB0aGlzLkMpIHwgMDtcbiAgICAgICAgRCA9IChEICsgdGhpcy5EKSB8IDA7XG4gICAgICAgIHRoaXMuc2V0KEEsIEIsIEMsIEQpO1xuICAgIH1cbiAgICByb3VuZENsZWFuKCkge1xuICAgICAgICBjbGVhbihNRDVfVyk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuc2V0KDAsIDAsIDAsIDApO1xuICAgICAgICBjbGVhbih0aGlzLmJ1ZmZlcik7XG4gICAgfVxufVxuLyoqXG4gKiBNRDUgKFJGQyAxMzIxKSBsZWdhY3kgaGFzaCBmdW5jdGlvbi4gSXQgd2FzIGNyeXB0b2dyYXBoaWNhbGx5IGJyb2tlbi5cbiAqIE1ENSBhcmNoaXRlY3R1cmUgaXMgc2ltaWxhciB0byBTSEExLCB3aXRoIHNvbWUgZGlmZmVyZW5jZXM6XG4gKiAtIFJlZHVjZWQgb3V0cHV0IGxlbmd0aDogMTYgYnl0ZXMgKDEyOCBiaXQpIGluc3RlYWQgb2YgMjBcbiAqIC0gNjQgcm91bmRzLCBpbnN0ZWFkIG9mIDgwXG4gKiAtIExpdHRsZS1lbmRpYW46IGNvdWxkIGJlIGZhc3RlciwgYnV0IHdpbGwgcmVxdWlyZSBtb3JlIGNvZGVcbiAqIC0gTm9uLWxpbmVhciBpbmRleCBzZWxlY3Rpb246IGh1Z2Ugc3BlZWQtdXAgZm9yIHVucm9sbFxuICogLSBQZXIgcm91bmQgY29uc3RhbnRzOiBtb3JlIG1lbW9yeSBhY2Nlc3NlcywgYWRkaXRpb25hbCBzcGVlZC11cCBmb3IgdW5yb2xsXG4gKi9cbmV4cG9ydCBjb25zdCBtZDUgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlSGFzaGVyKCgpID0+IG5ldyBNRDUoKSk7XG4vLyBSSVBFTUQtMTYwXG5jb25zdCBSaG8xNjAgPSAvKiBAX19QVVJFX18gKi8gVWludDhBcnJheS5mcm9tKFtcbiAgICA3LCA0LCAxMywgMSwgMTAsIDYsIDE1LCAzLCAxMiwgMCwgOSwgNSwgMiwgMTQsIDExLCA4LFxuXSk7XG5jb25zdCBJZDE2MCA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gVWludDhBcnJheS5mcm9tKG5ldyBBcnJheSgxNikuZmlsbCgwKS5tYXAoKF8sIGkpID0+IGkpKSkoKTtcbmNvbnN0IFBpMTYwID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBJZDE2MC5tYXAoKGkpID0+ICg5ICogaSArIDUpICUgMTYpKSgpO1xuY29uc3QgaWR4TFIgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IHtcbiAgICBjb25zdCBMID0gW0lkMTYwXTtcbiAgICBjb25zdCBSID0gW1BpMTYwXTtcbiAgICBjb25zdCByZXMgPSBbTCwgUl07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspXG4gICAgICAgIGZvciAobGV0IGogb2YgcmVzKVxuICAgICAgICAgICAgai5wdXNoKGpbaV0ubWFwKChrKSA9PiBSaG8xNjBba10pKTtcbiAgICByZXR1cm4gcmVzO1xufSkoKTtcbmNvbnN0IGlkeEwgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IGlkeExSWzBdKSgpO1xuY29uc3QgaWR4UiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gaWR4TFJbMV0pKCk7XG4vLyBjb25zdCBbaWR4TCwgaWR4Ul0gPSBpZHhMUjtcbmNvbnN0IHNoaWZ0czE2MCA9IC8qIEBfX1BVUkVfXyAqLyBbXG4gICAgWzExLCAxNCwgMTUsIDEyLCA1LCA4LCA3LCA5LCAxMSwgMTMsIDE0LCAxNSwgNiwgNywgOSwgOF0sXG4gICAgWzEyLCAxMywgMTEsIDE1LCA2LCA5LCA5LCA3LCAxMiwgMTUsIDExLCAxMywgNywgOCwgNywgN10sXG4gICAgWzEzLCAxNSwgMTQsIDExLCA3LCA3LCA2LCA4LCAxMywgMTQsIDEzLCAxMiwgNSwgNSwgNiwgOV0sXG4gICAgWzE0LCAxMSwgMTIsIDE0LCA4LCA2LCA1LCA1LCAxNSwgMTIsIDE1LCAxNCwgOSwgOSwgOCwgNl0sXG4gICAgWzE1LCAxMiwgMTMsIDEzLCA5LCA1LCA4LCA2LCAxNCwgMTEsIDEyLCAxMSwgOCwgNiwgNSwgNV0sXG5dLm1hcCgoaSkgPT4gVWludDhBcnJheS5mcm9tKGkpKTtcbmNvbnN0IHNoaWZ0c0wxNjAgPSAvKiBAX19QVVJFX18gKi8gaWR4TC5tYXAoKGlkeCwgaSkgPT4gaWR4Lm1hcCgoaikgPT4gc2hpZnRzMTYwW2ldW2pdKSk7XG5jb25zdCBzaGlmdHNSMTYwID0gLyogQF9fUFVSRV9fICovIGlkeFIubWFwKChpZHgsIGkpID0+IGlkeC5tYXAoKGopID0+IHNoaWZ0czE2MFtpXVtqXSkpO1xuY29uc3QgS2wxNjAgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gICAgMHgwMDAwMDAwMCwgMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhhOTUzZmQ0ZSxcbl0pO1xuY29uc3QgS3IxNjAgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gICAgMHg1MGEyOGJlNiwgMHg1YzRkZDEyNCwgMHg2ZDcwM2VmMywgMHg3YTZkNzZlOSwgMHgwMDAwMDAwMCxcbl0pO1xuLy8gSXQncyBjYWxsZWQgZigpIGluIHNwZWMuXG5mdW5jdGlvbiByaXBlbWRfZihncm91cCwgeCwgeSwgeikge1xuICAgIGlmIChncm91cCA9PT0gMClcbiAgICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgICBpZiAoZ3JvdXAgPT09IDEpXG4gICAgICAgIHJldHVybiAoeCAmIHkpIHwgKH54ICYgeik7XG4gICAgaWYgKGdyb3VwID09PSAyKVxuICAgICAgICByZXR1cm4gKHggfCB+eSkgXiB6O1xuICAgIGlmIChncm91cCA9PT0gMylcbiAgICAgICAgcmV0dXJuICh4ICYgeikgfCAoeSAmIH56KTtcbiAgICByZXR1cm4geCBeICh5IHwgfnopO1xufVxuLy8gUmV1c2FibGUgdGVtcG9yYXJ5IGJ1ZmZlclxuY29uc3QgQlVGXzE2MCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgVWludDMyQXJyYXkoMTYpO1xuZXhwb3J0IGNsYXNzIFJJUEVNRDE2MCBleHRlbmRzIEhhc2hNRCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDY0LCAyMCwgOCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuaDAgPSAweDY3NDUyMzAxIHwgMDtcbiAgICAgICAgdGhpcy5oMSA9IDB4ZWZjZGFiODkgfCAwO1xuICAgICAgICB0aGlzLmgyID0gMHg5OGJhZGNmZSB8IDA7XG4gICAgICAgIHRoaXMuaDMgPSAweDEwMzI1NDc2IHwgMDtcbiAgICAgICAgdGhpcy5oNCA9IDB4YzNkMmUxZjAgfCAwO1xuICAgIH1cbiAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IHsgaDAsIGgxLCBoMiwgaDMsIGg0IH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4gW2gwLCBoMSwgaDIsIGgzLCBoNF07XG4gICAgfVxuICAgIHNldChoMCwgaDEsIGgyLCBoMywgaDQpIHtcbiAgICAgICAgdGhpcy5oMCA9IGgwIHwgMDtcbiAgICAgICAgdGhpcy5oMSA9IGgxIHwgMDtcbiAgICAgICAgdGhpcy5oMiA9IGgyIHwgMDtcbiAgICAgICAgdGhpcy5oMyA9IGgzIHwgMDtcbiAgICAgICAgdGhpcy5oNCA9IGg0IHwgMDtcbiAgICB9XG4gICAgcHJvY2Vzcyh2aWV3LCBvZmZzZXQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrLCBvZmZzZXQgKz0gNClcbiAgICAgICAgICAgIEJVRl8xNjBbaV0gPSB2aWV3LmdldFVpbnQzMihvZmZzZXQsIHRydWUpO1xuICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgbGV0IGFsID0gdGhpcy5oMCB8IDAsIGFyID0gYWwsIGJsID0gdGhpcy5oMSB8IDAsIGJyID0gYmwsIGNsID0gdGhpcy5oMiB8IDAsIGNyID0gY2wsIGRsID0gdGhpcy5oMyB8IDAsIGRyID0gZGwsIGVsID0gdGhpcy5oNCB8IDAsIGVyID0gZWw7XG4gICAgICAgIC8vIEluc3RlYWQgb2YgaXRlcmF0aW5nIDAgdG8gODAsIHdlIHNwbGl0IGl0IGludG8gNSBncm91cHNcbiAgICAgICAgLy8gQW5kIHVzZSB0aGUgZ3JvdXBzIGluIGNvbnN0YW50cywgZnVuY3Rpb25zLCBldGMuIE11Y2ggc2ltcGxlclxuICAgICAgICBmb3IgKGxldCBncm91cCA9IDA7IGdyb3VwIDwgNTsgZ3JvdXArKykge1xuICAgICAgICAgICAgY29uc3Qgckdyb3VwID0gNCAtIGdyb3VwO1xuICAgICAgICAgICAgY29uc3QgaGJsID0gS2wxNjBbZ3JvdXBdLCBoYnIgPSBLcjE2MFtncm91cF07IC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcmwgPSBpZHhMW2dyb3VwXSwgcnIgPSBpZHhSW2dyb3VwXTsgLy8gcHJldHRpZXItaWdub3JlXG4gICAgICAgICAgICBjb25zdCBzbCA9IHNoaWZ0c0wxNjBbZ3JvdXBdLCBzciA9IHNoaWZ0c1IxNjBbZ3JvdXBdOyAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRsID0gKHJvdGwoYWwgKyByaXBlbWRfZihncm91cCwgYmwsIGNsLCBkbCkgKyBCVUZfMTYwW3JsW2ldXSArIGhibCwgc2xbaV0pICsgZWwpIHwgMDtcbiAgICAgICAgICAgICAgICBhbCA9IGVsLCBlbCA9IGRsLCBkbCA9IHJvdGwoY2wsIDEwKSB8IDAsIGNsID0gYmwsIGJsID0gdGw7IC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMiBsb29wcyBhcmUgMTAlIGZhc3RlclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHIgPSAocm90bChhciArIHJpcGVtZF9mKHJHcm91cCwgYnIsIGNyLCBkcikgKyBCVUZfMTYwW3JyW2ldXSArIGhiciwgc3JbaV0pICsgZXIpIHwgMDtcbiAgICAgICAgICAgICAgICBhciA9IGVyLCBlciA9IGRyLCBkciA9IHJvdGwoY3IsIDEwKSB8IDAsIGNyID0gYnIsIGJyID0gdHI7IC8vIHByZXR0aWVyLWlnbm9yZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCB0aGUgY29tcHJlc3NlZCBjaHVuayB0byB0aGUgY3VycmVudCBoYXNoIHZhbHVlXG4gICAgICAgIHRoaXMuc2V0KCh0aGlzLmgxICsgY2wgKyBkcikgfCAwLCAodGhpcy5oMiArIGRsICsgZXIpIHwgMCwgKHRoaXMuaDMgKyBlbCArIGFyKSB8IDAsICh0aGlzLmg0ICsgYWwgKyBicikgfCAwLCAodGhpcy5oMCArIGJsICsgY3IpIHwgMCk7XG4gICAgfVxuICAgIHJvdW5kQ2xlYW4oKSB7XG4gICAgICAgIGNsZWFuKEJVRl8xNjApO1xuICAgIH1cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgICAgIGNsZWFuKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCk7XG4gICAgfVxufVxuLyoqXG4gKiBSSVBFTUQtMTYwIC0gYSBsZWdhY3kgaGFzaCBmdW5jdGlvbiBmcm9tIDE5OTBzLlxuICogKiBodHRwczovL2hvbWVzLmVzYXQua3VsZXV2ZW4uYmUvfmJvc3NlbGFlL3JpcGVtZDE2MC5odG1sXG4gKiAqIGh0dHBzOi8vaG9tZXMuZXNhdC5rdWxldXZlbi5iZS9+Ym9zc2VsYWUvcmlwZW1kMTYwL3BkZi9BQi05NjAxL0FCLTk2MDEucGRmXG4gKi9cbmV4cG9ydCBjb25zdCByaXBlbWQxNjAgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlSGFzaGVyKCgpID0+IG5ldyBSSVBFTUQxNjAoKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1sZWdhY3kuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/hashes/esm/legacy.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/hashes/esm/ripemd160.js":
/*!*****************************************************!*\
  !*** ./node_modules/@noble/hashes/esm/ripemd160.js ***!
  \*****************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   RIPEMD160: () => (/* binding */ RIPEMD160),\n/* harmony export */   ripemd160: () => (/* binding */ ripemd160)\n/* harmony export */ });\n/* harmony import */ var _legacy_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./legacy.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/legacy.js\");\n/**\n * RIPEMD-160 legacy hash function.\n * https://homes.esat.kuleuven.be/~bosselae/ripemd160.html\n * https://homes.esat.kuleuven.be/~bosselae/ripemd160/pdf/AB-9601/AB-9601.pdf\n * @module\n * @deprecated\n */\n\n/** @deprecated Use import from `noble/hashes/legacy` module */\nconst RIPEMD160 = _legacy_js__WEBPACK_IMPORTED_MODULE_0__.RIPEMD160;\n/** @deprecated Use import from `noble/hashes/legacy` module */\nconst ripemd160 = _legacy_js__WEBPACK_IMPORTED_MODULE_0__.ripemd160;\n//# sourceMappingURL=ripemd160.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9yaXBlbWQxNjAuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDK0U7QUFDL0U7QUFDTyxrQkFBa0IsaURBQVU7QUFDbkM7QUFDTyxrQkFBa0IsaURBQVU7QUFDbkMiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5vYmxlL2hhc2hlcy9lc20vcmlwZW1kMTYwLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUklQRU1ELTE2MCBsZWdhY3kgaGFzaCBmdW5jdGlvbi5cbiAqIGh0dHBzOi8vaG9tZXMuZXNhdC5rdWxldXZlbi5iZS9+Ym9zc2VsYWUvcmlwZW1kMTYwLmh0bWxcbiAqIGh0dHBzOi8vaG9tZXMuZXNhdC5rdWxldXZlbi5iZS9+Ym9zc2VsYWUvcmlwZW1kMTYwL3BkZi9BQi05NjAxL0FCLTk2MDEucGRmXG4gKiBAbW9kdWxlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5pbXBvcnQgeyBSSVBFTUQxNjAgYXMgUklQRU1EMTYwbiwgcmlwZW1kMTYwIGFzIHJpcGVtZDE2MG4gfSBmcm9tIFwiLi9sZWdhY3kuanNcIjtcbi8qKiBAZGVwcmVjYXRlZCBVc2UgaW1wb3J0IGZyb20gYG5vYmxlL2hhc2hlcy9sZWdhY3lgIG1vZHVsZSAqL1xuZXhwb3J0IGNvbnN0IFJJUEVNRDE2MCA9IFJJUEVNRDE2MG47XG4vKiogQGRlcHJlY2F0ZWQgVXNlIGltcG9ydCBmcm9tIGBub2JsZS9oYXNoZXMvbGVnYWN5YCBtb2R1bGUgKi9cbmV4cG9ydCBjb25zdCByaXBlbWQxNjAgPSByaXBlbWQxNjBuO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cmlwZW1kMTYwLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/hashes/esm/ripemd160.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/hashes/esm/sha2.js":
/*!************************************************!*\
  !*** ./node_modules/@noble/hashes/esm/sha2.js ***!
  \************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   SHA224: () => (/* binding */ SHA224),\n/* harmony export */   SHA256: () => (/* binding */ SHA256),\n/* harmony export */   SHA384: () => (/* binding */ SHA384),\n/* harmony export */   SHA512: () => (/* binding */ SHA512),\n/* harmony export */   SHA512_224: () => (/* binding */ SHA512_224),\n/* harmony export */   SHA512_256: () => (/* binding */ SHA512_256),\n/* harmony export */   sha224: () => (/* binding */ sha224),\n/* harmony export */   sha256: () => (/* binding */ sha256),\n/* harmony export */   sha384: () => (/* binding */ sha384),\n/* harmony export */   sha512: () => (/* binding */ sha512),\n/* harmony export */   sha512_224: () => (/* binding */ sha512_224),\n/* harmony export */   sha512_256: () => (/* binding */ sha512_256)\n/* harmony export */ });\n/* harmony import */ var _md_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_md.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/_md.js\");\n/* harmony import */ var _u64_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./_u64.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/_u64.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\n\n\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nclass SHA256 extends _md_js__WEBPACK_IMPORTED_MODULE_0__.HashMD {\n    constructor(outputLen = 32) {\n        super(64, outputLen, 8, false);\n        // We cannot use array here since array allows indexing by variable\n        // which means optimizer/compiler cannot use registers.\n        this.A = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA256_IV[0] | 0;\n        this.B = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA256_IV[1] | 0;\n        this.C = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA256_IV[2] | 0;\n        this.D = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA256_IV[3] | 0;\n        this.E = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA256_IV[4] | 0;\n        this.F = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA256_IV[5] | 0;\n        this.G = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA256_IV[6] | 0;\n        this.H = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA256_IV[7] | 0;\n    }\n    get() {\n        const { A, B, C, D, E, F, G, H } = this;\n        return [A, B, C, D, E, F, G, H];\n    }\n    // prettier-ignore\n    set(A, B, C, D, E, F, G, H) {\n        this.A = A | 0;\n        this.B = B | 0;\n        this.C = C | 0;\n        this.D = D | 0;\n        this.E = E | 0;\n        this.F = F | 0;\n        this.G = G | 0;\n        this.H = H | 0;\n    }\n    process(view, offset) {\n        // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n        for (let i = 0; i < 16; i++, offset += 4)\n            SHA256_W[i] = view.getUint32(offset, false);\n        for (let i = 16; i < 64; i++) {\n            const W15 = SHA256_W[i - 15];\n            const W2 = SHA256_W[i - 2];\n            const s0 = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotr)(W15, 7) ^ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotr)(W15, 18) ^ (W15 >>> 3);\n            const s1 = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotr)(W2, 17) ^ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotr)(W2, 19) ^ (W2 >>> 10);\n            SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n        }\n        // Compression function main loop, 64 rounds\n        let { A, B, C, D, E, F, G, H } = this;\n        for (let i = 0; i < 64; i++) {\n            const sigma1 = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotr)(E, 6) ^ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotr)(E, 11) ^ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotr)(E, 25);\n            const T1 = (H + sigma1 + (0,_md_js__WEBPACK_IMPORTED_MODULE_0__.Chi)(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n            const sigma0 = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotr)(A, 2) ^ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotr)(A, 13) ^ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.rotr)(A, 22);\n            const T2 = (sigma0 + (0,_md_js__WEBPACK_IMPORTED_MODULE_0__.Maj)(A, B, C)) | 0;\n            H = G;\n            G = F;\n            F = E;\n            E = (D + T1) | 0;\n            D = C;\n            C = B;\n            B = A;\n            A = (T1 + T2) | 0;\n        }\n        // Add the compressed chunk to the current hash value\n        A = (A + this.A) | 0;\n        B = (B + this.B) | 0;\n        C = (C + this.C) | 0;\n        D = (D + this.D) | 0;\n        E = (E + this.E) | 0;\n        F = (F + this.F) | 0;\n        G = (G + this.G) | 0;\n        H = (H + this.H) | 0;\n        this.set(A, B, C, D, E, F, G, H);\n    }\n    roundClean() {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(SHA256_W);\n    }\n    destroy() {\n        this.set(0, 0, 0, 0, 0, 0, 0, 0);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(this.buffer);\n    }\n}\nclass SHA224 extends SHA256 {\n    constructor() {\n        super(28);\n        this.A = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA224_IV[0] | 0;\n        this.B = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA224_IV[1] | 0;\n        this.C = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA224_IV[2] | 0;\n        this.D = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA224_IV[3] | 0;\n        this.E = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA224_IV[4] | 0;\n        this.F = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA224_IV[5] | 0;\n        this.G = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA224_IV[6] | 0;\n        this.H = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA224_IV[7] | 0;\n    }\n}\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => _u64_js__WEBPACK_IMPORTED_MODULE_2__.split([\n    '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n    '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n    '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n    '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n    '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n    '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n    '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n    '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n    '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n    '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n    '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n    '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n    '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n    '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n    '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n    '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n    '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n    '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n    '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n    '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\nclass SHA512 extends _md_js__WEBPACK_IMPORTED_MODULE_0__.HashMD {\n    constructor(outputLen = 64) {\n        super(128, outputLen, 16, false);\n        // We cannot use array here since array allows indexing by variable\n        // which means optimizer/compiler cannot use registers.\n        // h -- high 32 bits, l -- low 32 bits\n        this.Ah = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[0] | 0;\n        this.Al = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[1] | 0;\n        this.Bh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[2] | 0;\n        this.Bl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[3] | 0;\n        this.Ch = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[4] | 0;\n        this.Cl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[5] | 0;\n        this.Dh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[6] | 0;\n        this.Dl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[7] | 0;\n        this.Eh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[8] | 0;\n        this.El = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[9] | 0;\n        this.Fh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[10] | 0;\n        this.Fl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[11] | 0;\n        this.Gh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[12] | 0;\n        this.Gl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[13] | 0;\n        this.Hh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[14] | 0;\n        this.Hl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA512_IV[15] | 0;\n    }\n    // prettier-ignore\n    get() {\n        const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n        return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n    }\n    // prettier-ignore\n    set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl) {\n        this.Ah = Ah | 0;\n        this.Al = Al | 0;\n        this.Bh = Bh | 0;\n        this.Bl = Bl | 0;\n        this.Ch = Ch | 0;\n        this.Cl = Cl | 0;\n        this.Dh = Dh | 0;\n        this.Dl = Dl | 0;\n        this.Eh = Eh | 0;\n        this.El = El | 0;\n        this.Fh = Fh | 0;\n        this.Fl = Fl | 0;\n        this.Gh = Gh | 0;\n        this.Gl = Gl | 0;\n        this.Hh = Hh | 0;\n        this.Hl = Hl | 0;\n    }\n    process(view, offset) {\n        // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n        for (let i = 0; i < 16; i++, offset += 4) {\n            SHA512_W_H[i] = view.getUint32(offset);\n            SHA512_W_L[i] = view.getUint32((offset += 4));\n        }\n        for (let i = 16; i < 80; i++) {\n            // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n            const W15h = SHA512_W_H[i - 15] | 0;\n            const W15l = SHA512_W_L[i - 15] | 0;\n            const s0h = _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSH(W15h, W15l, 1) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSH(W15h, W15l, 8) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.shrSH(W15h, W15l, 7);\n            const s0l = _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSL(W15h, W15l, 1) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSL(W15h, W15l, 8) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.shrSL(W15h, W15l, 7);\n            // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n            const W2h = SHA512_W_H[i - 2] | 0;\n            const W2l = SHA512_W_L[i - 2] | 0;\n            const s1h = _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSH(W2h, W2l, 19) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrBH(W2h, W2l, 61) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.shrSH(W2h, W2l, 6);\n            const s1l = _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSL(W2h, W2l, 19) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrBL(W2h, W2l, 61) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.shrSL(W2h, W2l, 6);\n            // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n            const SUMl = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n            const SUMh = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n            SHA512_W_H[i] = SUMh | 0;\n            SHA512_W_L[i] = SUMl | 0;\n        }\n        let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n        // Compression function main loop, 80 rounds\n        for (let i = 0; i < 80; i++) {\n            // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n            const sigma1h = _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSH(Eh, El, 14) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSH(Eh, El, 18) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrBH(Eh, El, 41);\n            const sigma1l = _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSL(Eh, El, 14) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSL(Eh, El, 18) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrBL(Eh, El, 41);\n            //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n            const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n            const CHIl = (El & Fl) ^ (~El & Gl);\n            // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n            // prettier-ignore\n            const T1ll = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n            const T1h = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n            const T1l = T1ll | 0;\n            // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n            const sigma0h = _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSH(Ah, Al, 28) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrBH(Ah, Al, 34) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrBH(Ah, Al, 39);\n            const sigma0l = _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrSL(Ah, Al, 28) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrBL(Ah, Al, 34) ^ _u64_js__WEBPACK_IMPORTED_MODULE_2__.rotrBL(Ah, Al, 39);\n            const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n            const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n            Hh = Gh | 0;\n            Hl = Gl | 0;\n            Gh = Fh | 0;\n            Gl = Fl | 0;\n            Fh = Eh | 0;\n            Fl = El | 0;\n            ({ h: Eh, l: El } = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n            Dh = Ch | 0;\n            Dl = Cl | 0;\n            Ch = Bh | 0;\n            Cl = Bl | 0;\n            Bh = Ah | 0;\n            Bl = Al | 0;\n            const All = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add3L(T1l, sigma0l, MAJl);\n            Ah = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add3H(All, T1h, sigma0h, MAJh);\n            Al = All | 0;\n        }\n        // Add the compressed chunk to the current hash value\n        ({ h: Ah, l: Al } = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n        ({ h: Bh, l: Bl } = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n        ({ h: Ch, l: Cl } = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n        ({ h: Dh, l: Dl } = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n        ({ h: Eh, l: El } = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n        ({ h: Fh, l: Fl } = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n        ({ h: Gh, l: Gl } = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n        ({ h: Hh, l: Hl } = _u64_js__WEBPACK_IMPORTED_MODULE_2__.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n        this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n    }\n    roundClean() {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(SHA512_W_H, SHA512_W_L);\n    }\n    destroy() {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(this.buffer);\n        this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n    }\n}\nclass SHA384 extends SHA512 {\n    constructor() {\n        super(48);\n        this.Ah = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[0] | 0;\n        this.Al = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[1] | 0;\n        this.Bh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[2] | 0;\n        this.Bl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[3] | 0;\n        this.Ch = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[4] | 0;\n        this.Cl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[5] | 0;\n        this.Dh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[6] | 0;\n        this.Dl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[7] | 0;\n        this.Eh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[8] | 0;\n        this.El = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[9] | 0;\n        this.Fh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[10] | 0;\n        this.Fl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[11] | 0;\n        this.Gh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[12] | 0;\n        this.Gl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[13] | 0;\n        this.Hh = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[14] | 0;\n        this.Hl = _md_js__WEBPACK_IMPORTED_MODULE_0__.SHA384_IV[15] | 0;\n    }\n}\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n    0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n    0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n    0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n    0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\nclass SHA512_224 extends SHA512 {\n    constructor() {\n        super(28);\n        this.Ah = T224_IV[0] | 0;\n        this.Al = T224_IV[1] | 0;\n        this.Bh = T224_IV[2] | 0;\n        this.Bl = T224_IV[3] | 0;\n        this.Ch = T224_IV[4] | 0;\n        this.Cl = T224_IV[5] | 0;\n        this.Dh = T224_IV[6] | 0;\n        this.Dl = T224_IV[7] | 0;\n        this.Eh = T224_IV[8] | 0;\n        this.El = T224_IV[9] | 0;\n        this.Fh = T224_IV[10] | 0;\n        this.Fl = T224_IV[11] | 0;\n        this.Gh = T224_IV[12] | 0;\n        this.Gl = T224_IV[13] | 0;\n        this.Hh = T224_IV[14] | 0;\n        this.Hl = T224_IV[15] | 0;\n    }\n}\nclass SHA512_256 extends SHA512 {\n    constructor() {\n        super(32);\n        this.Ah = T256_IV[0] | 0;\n        this.Al = T256_IV[1] | 0;\n        this.Bh = T256_IV[2] | 0;\n        this.Bl = T256_IV[3] | 0;\n        this.Ch = T256_IV[4] | 0;\n        this.Cl = T256_IV[5] | 0;\n        this.Dh = T256_IV[6] | 0;\n        this.Dl = T256_IV[7] | 0;\n        this.Eh = T256_IV[8] | 0;\n        this.El = T256_IV[9] | 0;\n        this.Fh = T256_IV[10] | 0;\n        this.Fl = T256_IV[11] | 0;\n        this.Gh = T256_IV[12] | 0;\n        this.Gl = T256_IV[13] | 0;\n        this.Hh = T256_IV[14] | 0;\n        this.Hl = T256_IV[15] | 0;\n    }\n}\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nconst sha256 = /* @__PURE__ */ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createHasher)(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nconst sha224 = /* @__PURE__ */ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createHasher)(() => new SHA224());\n/** SHA2-512 hash function from RFC 4634. */\nconst sha512 = /* @__PURE__ */ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createHasher)(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nconst sha384 = /* @__PURE__ */ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createHasher)(() => new SHA384());\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nconst sha512_256 = /* @__PURE__ */ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createHasher)(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nconst sha512_224 = /* @__PURE__ */ (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createHasher)(() => new SHA512_224());\n//# sourceMappingURL=sha2.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9zaGEyLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ3dGO0FBQ3ZEO0FBQ3NCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxxQkFBcUIsMENBQU07QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUIsNkNBQVM7QUFDMUIsaUJBQWlCLDZDQUFTO0FBQzFCLGlCQUFpQiw2Q0FBUztBQUMxQixpQkFBaUIsNkNBQVM7QUFDMUIsaUJBQWlCLDZDQUFTO0FBQzFCLGlCQUFpQiw2Q0FBUztBQUMxQixpQkFBaUIsNkNBQVM7QUFDMUIsaUJBQWlCLDZDQUFTO0FBQzFCO0FBQ0E7QUFDQSxnQkFBZ0IseUJBQXlCO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0EseUJBQXlCLFFBQVE7QUFDakM7QUFDQTtBQUNBLHVCQUF1QiwrQ0FBSSxXQUFXLCtDQUFJO0FBQzFDLHVCQUF1QiwrQ0FBSSxXQUFXLCtDQUFJO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLGNBQWMseUJBQXlCO0FBQ3ZDLHdCQUF3QixRQUFRO0FBQ2hDLDJCQUEyQiwrQ0FBSSxTQUFTLCtDQUFJLFVBQVUsK0NBQUk7QUFDMUQscUNBQXFDLDJDQUFHO0FBQ3hDLDJCQUEyQiwrQ0FBSSxTQUFTLCtDQUFJLFVBQVUsK0NBQUk7QUFDMUQsaUNBQWlDLDJDQUFHO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0RBQUs7QUFDYjtBQUNBO0FBQ0E7QUFDQSxRQUFRLGdEQUFLO0FBQ2I7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLGlCQUFpQiw2Q0FBUztBQUMxQixpQkFBaUIsNkNBQVM7QUFDMUIsaUJBQWlCLDZDQUFTO0FBQzFCLGlCQUFpQiw2Q0FBUztBQUMxQixpQkFBaUIsNkNBQVM7QUFDMUIsaUJBQWlCLDZDQUFTO0FBQzFCLGlCQUFpQiw2Q0FBUztBQUMxQixpQkFBaUIsNkNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0NBQW9DLDBDQUFTO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxxQkFBcUIsMENBQU07QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQiw2Q0FBUztBQUMzQixrQkFBa0IsNkNBQVM7QUFDM0Isa0JBQWtCLDZDQUFTO0FBQzNCLGtCQUFrQiw2Q0FBUztBQUMzQixrQkFBa0IsNkNBQVM7QUFDM0Isa0JBQWtCLDZDQUFTO0FBQzNCLGtCQUFrQiw2Q0FBUztBQUMzQixrQkFBa0IsNkNBQVM7QUFDM0Isa0JBQWtCLDZDQUFTO0FBQzNCLGtCQUFrQiw2Q0FBUztBQUMzQixrQkFBa0IsNkNBQVM7QUFDM0Isa0JBQWtCLDZDQUFTO0FBQzNCLGtCQUFrQiw2Q0FBUztBQUMzQixrQkFBa0IsNkNBQVM7QUFDM0Isa0JBQWtCLDZDQUFTO0FBQzNCLGtCQUFrQiw2Q0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsaUVBQWlFO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsUUFBUTtBQUNqQztBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMkNBQVUsa0JBQWtCLDJDQUFVLGtCQUFrQiwwQ0FBUztBQUN6Rix3QkFBd0IsMkNBQVUsa0JBQWtCLDJDQUFVLGtCQUFrQiwwQ0FBUztBQUN6RjtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMkNBQVUsaUJBQWlCLDJDQUFVLGlCQUFpQiwwQ0FBUztBQUN2Rix3QkFBd0IsMkNBQVUsaUJBQWlCLDJDQUFVLGlCQUFpQiwwQ0FBUztBQUN2RjtBQUNBLHlCQUF5QiwwQ0FBUztBQUNsQyx5QkFBeUIsMENBQVM7QUFDbEM7QUFDQTtBQUNBO0FBQ0EsY0FBYyxpRUFBaUU7QUFDL0U7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBLDRCQUE0QiwyQ0FBVSxlQUFlLDJDQUFVLGVBQWUsMkNBQVU7QUFDeEYsNEJBQTRCLDJDQUFVLGVBQWUsMkNBQVUsZUFBZSwyQ0FBVTtBQUN4RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDBDQUFTO0FBQ2xDLHdCQUF3QiwwQ0FBUztBQUNqQztBQUNBO0FBQ0EsNEJBQTRCLDJDQUFVLGVBQWUsMkNBQVUsZUFBZSwyQ0FBVTtBQUN4Riw0QkFBNEIsMkNBQVUsZUFBZSwyQ0FBVSxlQUFlLDJDQUFVO0FBQ3hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGVBQWUsRUFBRSx3Q0FBTztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsMENBQVM7QUFDakMsaUJBQWlCLDBDQUFTO0FBQzFCO0FBQ0E7QUFDQTtBQUNBLFdBQVcsZUFBZSxFQUFFLHdDQUFPO0FBQ25DLFdBQVcsZUFBZSxFQUFFLHdDQUFPO0FBQ25DLFdBQVcsZUFBZSxFQUFFLHdDQUFPO0FBQ25DLFdBQVcsZUFBZSxFQUFFLHdDQUFPO0FBQ25DLFdBQVcsZUFBZSxFQUFFLHdDQUFPO0FBQ25DLFdBQVcsZUFBZSxFQUFFLHdDQUFPO0FBQ25DLFdBQVcsZUFBZSxFQUFFLHdDQUFPO0FBQ25DLFdBQVcsZUFBZSxFQUFFLHdDQUFPO0FBQ25DO0FBQ0E7QUFDQTtBQUNBLFFBQVEsZ0RBQUs7QUFDYjtBQUNBO0FBQ0EsUUFBUSxnREFBSztBQUNiO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLGtCQUFrQiw2Q0FBUztBQUMzQixrQkFBa0IsNkNBQVM7QUFDM0Isa0JBQWtCLDZDQUFTO0FBQzNCLGtCQUFrQiw2Q0FBUztBQUMzQixrQkFBa0IsNkNBQVM7QUFDM0Isa0JBQWtCLDZDQUFTO0FBQzNCLGtCQUFrQiw2Q0FBUztBQUMzQixrQkFBa0IsNkNBQVM7QUFDM0Isa0JBQWtCLDZDQUFTO0FBQzNCLGtCQUFrQiw2Q0FBUztBQUMzQixrQkFBa0IsNkNBQVM7QUFDM0Isa0JBQWtCLDZDQUFTO0FBQzNCLGtCQUFrQiw2Q0FBUztBQUMzQixrQkFBa0IsNkNBQVM7QUFDM0Isa0JBQWtCLDZDQUFTO0FBQzNCLGtCQUFrQiw2Q0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLCtCQUErQix1REFBWTtBQUNsRDtBQUNPLCtCQUErQix1REFBWTtBQUNsRDtBQUNPLCtCQUErQix1REFBWTtBQUNsRDtBQUNPLCtCQUErQix1REFBWTtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNPLG1DQUFtQyx1REFBWTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNPLG1DQUFtQyx1REFBWTtBQUN0RCIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9zaGEyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU0hBMiBoYXNoIGZ1bmN0aW9uLiBBLmsuYS4gc2hhMjU2LCBzaGEzODQsIHNoYTUxMiwgc2hhNTEyXzIyNCwgc2hhNTEyXzI1Ni5cbiAqIFNIQTI1NiBpcyB0aGUgZmFzdGVzdCBoYXNoIGltcGxlbWVudGFibGUgaW4gSlMsIGV2ZW4gZmFzdGVyIHRoYW4gQmxha2UzLlxuICogQ2hlY2sgb3V0IFtSRkMgNDYzNF0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM0NjM0KSBhbmRcbiAqIFtGSVBTIDE4MC00XShodHRwczovL252bHB1YnMubmlzdC5nb3YvbmlzdHB1YnMvRklQUy9OSVNULkZJUFMuMTgwLTQucGRmKS5cbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgQ2hpLCBIYXNoTUQsIE1haiwgU0hBMjI0X0lWLCBTSEEyNTZfSVYsIFNIQTM4NF9JViwgU0hBNTEyX0lWIH0gZnJvbSBcIi4vX21kLmpzXCI7XG5pbXBvcnQgKiBhcyB1NjQgZnJvbSBcIi4vX3U2NC5qc1wiO1xuaW1wb3J0IHsgY2xlYW4sIGNyZWF0ZUhhc2hlciwgcm90ciB9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG4vKipcbiAqIFJvdW5kIGNvbnN0YW50czpcbiAqIEZpcnN0IDMyIGJpdHMgb2YgZnJhY3Rpb25hbCBwYXJ0cyBvZiB0aGUgY3ViZSByb290cyBvZiB0aGUgZmlyc3QgNjQgcHJpbWVzIDIuLjMxMSlcbiAqL1xuLy8gcHJldHRpZXItaWdub3JlXG5jb25zdCBTSEEyNTZfSyA9IC8qIEBfX1BVUkVfXyAqLyBVaW50MzJBcnJheS5mcm9tKFtcbiAgICAweDQyOGEyZjk4LCAweDcxMzc0NDkxLCAweGI1YzBmYmNmLCAweGU5YjVkYmE1LCAweDM5NTZjMjViLCAweDU5ZjExMWYxLCAweDkyM2Y4MmE0LCAweGFiMWM1ZWQ1LFxuICAgIDB4ZDgwN2FhOTgsIDB4MTI4MzViMDEsIDB4MjQzMTg1YmUsIDB4NTUwYzdkYzMsIDB4NzJiZTVkNzQsIDB4ODBkZWIxZmUsIDB4OWJkYzA2YTcsIDB4YzE5YmYxNzQsXG4gICAgMHhlNDliNjljMSwgMHhlZmJlNDc4NiwgMHgwZmMxOWRjNiwgMHgyNDBjYTFjYywgMHgyZGU5MmM2ZiwgMHg0YTc0ODRhYSwgMHg1Y2IwYTlkYywgMHg3NmY5ODhkYSxcbiAgICAweDk4M2U1MTUyLCAweGE4MzFjNjZkLCAweGIwMDMyN2M4LCAweGJmNTk3ZmM3LCAweGM2ZTAwYmYzLCAweGQ1YTc5MTQ3LCAweDA2Y2E2MzUxLCAweDE0MjkyOTY3LFxuICAgIDB4MjdiNzBhODUsIDB4MmUxYjIxMzgsIDB4NGQyYzZkZmMsIDB4NTMzODBkMTMsIDB4NjUwYTczNTQsIDB4NzY2YTBhYmIsIDB4ODFjMmM5MmUsIDB4OTI3MjJjODUsXG4gICAgMHhhMmJmZThhMSwgMHhhODFhNjY0YiwgMHhjMjRiOGI3MCwgMHhjNzZjNTFhMywgMHhkMTkyZTgxOSwgMHhkNjk5MDYyNCwgMHhmNDBlMzU4NSwgMHgxMDZhYTA3MCxcbiAgICAweDE5YTRjMTE2LCAweDFlMzc2YzA4LCAweDI3NDg3NzRjLCAweDM0YjBiY2I1LCAweDM5MWMwY2IzLCAweDRlZDhhYTRhLCAweDViOWNjYTRmLCAweDY4MmU2ZmYzLFxuICAgIDB4NzQ4ZjgyZWUsIDB4NzhhNTYzNmYsIDB4ODRjODc4MTQsIDB4OGNjNzAyMDgsIDB4OTBiZWZmZmEsIDB4YTQ1MDZjZWIsIDB4YmVmOWEzZjcsIDB4YzY3MTc4ZjJcbl0pO1xuLyoqIFJldXNhYmxlIHRlbXBvcmFyeSBidWZmZXIuIFwiV1wiIGNvbWVzIHN0cmFpZ2h0IGZyb20gc3BlYy4gKi9cbmNvbnN0IFNIQTI1Nl9XID0gLyogQF9fUFVSRV9fICovIG5ldyBVaW50MzJBcnJheSg2NCk7XG5leHBvcnQgY2xhc3MgU0hBMjU2IGV4dGVuZHMgSGFzaE1EIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRMZW4gPSAzMikge1xuICAgICAgICBzdXBlcig2NCwgb3V0cHV0TGVuLCA4LCBmYWxzZSk7XG4gICAgICAgIC8vIFdlIGNhbm5vdCB1c2UgYXJyYXkgaGVyZSBzaW5jZSBhcnJheSBhbGxvd3MgaW5kZXhpbmcgYnkgdmFyaWFibGVcbiAgICAgICAgLy8gd2hpY2ggbWVhbnMgb3B0aW1pemVyL2NvbXBpbGVyIGNhbm5vdCB1c2UgcmVnaXN0ZXJzLlxuICAgICAgICB0aGlzLkEgPSBTSEEyNTZfSVZbMF0gfCAwO1xuICAgICAgICB0aGlzLkIgPSBTSEEyNTZfSVZbMV0gfCAwO1xuICAgICAgICB0aGlzLkMgPSBTSEEyNTZfSVZbMl0gfCAwO1xuICAgICAgICB0aGlzLkQgPSBTSEEyNTZfSVZbM10gfCAwO1xuICAgICAgICB0aGlzLkUgPSBTSEEyNTZfSVZbNF0gfCAwO1xuICAgICAgICB0aGlzLkYgPSBTSEEyNTZfSVZbNV0gfCAwO1xuICAgICAgICB0aGlzLkcgPSBTSEEyNTZfSVZbNl0gfCAwO1xuICAgICAgICB0aGlzLkggPSBTSEEyNTZfSVZbN10gfCAwO1xuICAgIH1cbiAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IHsgQSwgQiwgQywgRCwgRSwgRiwgRywgSCB9ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFtBLCBCLCBDLCBELCBFLCBGLCBHLCBIXTtcbiAgICB9XG4gICAgLy8gcHJldHRpZXItaWdub3JlXG4gICAgc2V0KEEsIEIsIEMsIEQsIEUsIEYsIEcsIEgpIHtcbiAgICAgICAgdGhpcy5BID0gQSB8IDA7XG4gICAgICAgIHRoaXMuQiA9IEIgfCAwO1xuICAgICAgICB0aGlzLkMgPSBDIHwgMDtcbiAgICAgICAgdGhpcy5EID0gRCB8IDA7XG4gICAgICAgIHRoaXMuRSA9IEUgfCAwO1xuICAgICAgICB0aGlzLkYgPSBGIHwgMDtcbiAgICAgICAgdGhpcy5HID0gRyB8IDA7XG4gICAgICAgIHRoaXMuSCA9IEggfCAwO1xuICAgIH1cbiAgICBwcm9jZXNzKHZpZXcsIG9mZnNldCkge1xuICAgICAgICAvLyBFeHRlbmQgdGhlIGZpcnN0IDE2IHdvcmRzIGludG8gdGhlIHJlbWFpbmluZyA0OCB3b3JkcyB3WzE2Li42M10gb2YgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUgYXJyYXlcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgaSsrLCBvZmZzZXQgKz0gNClcbiAgICAgICAgICAgIFNIQTI1Nl9XW2ldID0gdmlldy5nZXRVaW50MzIob2Zmc2V0LCBmYWxzZSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDY0OyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IFcxNSA9IFNIQTI1Nl9XW2kgLSAxNV07XG4gICAgICAgICAgICBjb25zdCBXMiA9IFNIQTI1Nl9XW2kgLSAyXTtcbiAgICAgICAgICAgIGNvbnN0IHMwID0gcm90cihXMTUsIDcpIF4gcm90cihXMTUsIDE4KSBeIChXMTUgPj4+IDMpO1xuICAgICAgICAgICAgY29uc3QgczEgPSByb3RyKFcyLCAxNykgXiByb3RyKFcyLCAxOSkgXiAoVzIgPj4+IDEwKTtcbiAgICAgICAgICAgIFNIQTI1Nl9XW2ldID0gKHMxICsgU0hBMjU2X1dbaSAtIDddICsgczAgKyBTSEEyNTZfV1tpIC0gMTZdKSB8IDA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29tcHJlc3Npb24gZnVuY3Rpb24gbWFpbiBsb29wLCA2NCByb3VuZHNcbiAgICAgICAgbGV0IHsgQSwgQiwgQywgRCwgRSwgRiwgRywgSCB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBzaWdtYTEgPSByb3RyKEUsIDYpIF4gcm90cihFLCAxMSkgXiByb3RyKEUsIDI1KTtcbiAgICAgICAgICAgIGNvbnN0IFQxID0gKEggKyBzaWdtYTEgKyBDaGkoRSwgRiwgRykgKyBTSEEyNTZfS1tpXSArIFNIQTI1Nl9XW2ldKSB8IDA7XG4gICAgICAgICAgICBjb25zdCBzaWdtYTAgPSByb3RyKEEsIDIpIF4gcm90cihBLCAxMykgXiByb3RyKEEsIDIyKTtcbiAgICAgICAgICAgIGNvbnN0IFQyID0gKHNpZ21hMCArIE1haihBLCBCLCBDKSkgfCAwO1xuICAgICAgICAgICAgSCA9IEc7XG4gICAgICAgICAgICBHID0gRjtcbiAgICAgICAgICAgIEYgPSBFO1xuICAgICAgICAgICAgRSA9IChEICsgVDEpIHwgMDtcbiAgICAgICAgICAgIEQgPSBDO1xuICAgICAgICAgICAgQyA9IEI7XG4gICAgICAgICAgICBCID0gQTtcbiAgICAgICAgICAgIEEgPSAoVDEgKyBUMikgfCAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCB0aGUgY29tcHJlc3NlZCBjaHVuayB0byB0aGUgY3VycmVudCBoYXNoIHZhbHVlXG4gICAgICAgIEEgPSAoQSArIHRoaXMuQSkgfCAwO1xuICAgICAgICBCID0gKEIgKyB0aGlzLkIpIHwgMDtcbiAgICAgICAgQyA9IChDICsgdGhpcy5DKSB8IDA7XG4gICAgICAgIEQgPSAoRCArIHRoaXMuRCkgfCAwO1xuICAgICAgICBFID0gKEUgKyB0aGlzLkUpIHwgMDtcbiAgICAgICAgRiA9IChGICsgdGhpcy5GKSB8IDA7XG4gICAgICAgIEcgPSAoRyArIHRoaXMuRykgfCAwO1xuICAgICAgICBIID0gKEggKyB0aGlzLkgpIHwgMDtcbiAgICAgICAgdGhpcy5zZXQoQSwgQiwgQywgRCwgRSwgRiwgRywgSCk7XG4gICAgfVxuICAgIHJvdW5kQ2xlYW4oKSB7XG4gICAgICAgIGNsZWFuKFNIQTI1Nl9XKTtcbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgICAgIGNsZWFuKHRoaXMuYnVmZmVyKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgU0hBMjI0IGV4dGVuZHMgU0hBMjU2IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoMjgpO1xuICAgICAgICB0aGlzLkEgPSBTSEEyMjRfSVZbMF0gfCAwO1xuICAgICAgICB0aGlzLkIgPSBTSEEyMjRfSVZbMV0gfCAwO1xuICAgICAgICB0aGlzLkMgPSBTSEEyMjRfSVZbMl0gfCAwO1xuICAgICAgICB0aGlzLkQgPSBTSEEyMjRfSVZbM10gfCAwO1xuICAgICAgICB0aGlzLkUgPSBTSEEyMjRfSVZbNF0gfCAwO1xuICAgICAgICB0aGlzLkYgPSBTSEEyMjRfSVZbNV0gfCAwO1xuICAgICAgICB0aGlzLkcgPSBTSEEyMjRfSVZbNl0gfCAwO1xuICAgICAgICB0aGlzLkggPSBTSEEyMjRfSVZbN10gfCAwO1xuICAgIH1cbn1cbi8vIFNIQTItNTEyIGlzIHNsb3dlciB0aGFuIHNoYTI1NiBpbiBqcyBiZWNhdXNlIHU2NCBvcGVyYXRpb25zIGFyZSBzbG93LlxuLy8gUm91bmQgY29udGFudHNcbi8vIEZpcnN0IDMyIGJpdHMgb2YgdGhlIGZyYWN0aW9uYWwgcGFydHMgb2YgdGhlIGN1YmUgcm9vdHMgb2YgdGhlIGZpcnN0IDgwIHByaW1lcyAyLi40MDlcbi8vIHByZXR0aWVyLWlnbm9yZVxuY29uc3QgSzUxMiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gdTY0LnNwbGl0KFtcbiAgICAnMHg0MjhhMmY5OGQ3MjhhZTIyJywgJzB4NzEzNzQ0OTEyM2VmNjVjZCcsICcweGI1YzBmYmNmZWM0ZDNiMmYnLCAnMHhlOWI1ZGJhNTgxODlkYmJjJyxcbiAgICAnMHgzOTU2YzI1YmYzNDhiNTM4JywgJzB4NTlmMTExZjFiNjA1ZDAxOScsICcweDkyM2Y4MmE0YWYxOTRmOWInLCAnMHhhYjFjNWVkNWRhNmQ4MTE4JyxcbiAgICAnMHhkODA3YWE5OGEzMDMwMjQyJywgJzB4MTI4MzViMDE0NTcwNmZiZScsICcweDI0MzE4NWJlNGVlNGIyOGMnLCAnMHg1NTBjN2RjM2Q1ZmZiNGUyJyxcbiAgICAnMHg3MmJlNWQ3NGYyN2I4OTZmJywgJzB4ODBkZWIxZmUzYjE2OTZiMScsICcweDliZGMwNmE3MjVjNzEyMzUnLCAnMHhjMTliZjE3NGNmNjkyNjk0JyxcbiAgICAnMHhlNDliNjljMTllZjE0YWQyJywgJzB4ZWZiZTQ3ODYzODRmMjVlMycsICcweDBmYzE5ZGM2OGI4Y2Q1YjUnLCAnMHgyNDBjYTFjYzc3YWM5YzY1JyxcbiAgICAnMHgyZGU5MmM2ZjU5MmIwMjc1JywgJzB4NGE3NDg0YWE2ZWE2ZTQ4MycsICcweDVjYjBhOWRjYmQ0MWZiZDQnLCAnMHg3NmY5ODhkYTgzMTE1M2I1JyxcbiAgICAnMHg5ODNlNTE1MmVlNjZkZmFiJywgJzB4YTgzMWM2NmQyZGI0MzIxMCcsICcweGIwMDMyN2M4OThmYjIxM2YnLCAnMHhiZjU5N2ZjN2JlZWYwZWU0JyxcbiAgICAnMHhjNmUwMGJmMzNkYTg4ZmMyJywgJzB4ZDVhNzkxNDc5MzBhYTcyNScsICcweDA2Y2E2MzUxZTAwMzgyNmYnLCAnMHgxNDI5Mjk2NzBhMGU2ZTcwJyxcbiAgICAnMHgyN2I3MGE4NTQ2ZDIyZmZjJywgJzB4MmUxYjIxMzg1YzI2YzkyNicsICcweDRkMmM2ZGZjNWFjNDJhZWQnLCAnMHg1MzM4MGQxMzlkOTViM2RmJyxcbiAgICAnMHg2NTBhNzM1NDhiYWY2M2RlJywgJzB4NzY2YTBhYmIzYzc3YjJhOCcsICcweDgxYzJjOTJlNDdlZGFlZTYnLCAnMHg5MjcyMmM4NTE0ODIzNTNiJyxcbiAgICAnMHhhMmJmZThhMTRjZjEwMzY0JywgJzB4YTgxYTY2NGJiYzQyMzAwMScsICcweGMyNGI4YjcwZDBmODk3OTEnLCAnMHhjNzZjNTFhMzA2NTRiZTMwJyxcbiAgICAnMHhkMTkyZTgxOWQ2ZWY1MjE4JywgJzB4ZDY5OTA2MjQ1NTY1YTkxMCcsICcweGY0MGUzNTg1NTc3MTIwMmEnLCAnMHgxMDZhYTA3MDMyYmJkMWI4JyxcbiAgICAnMHgxOWE0YzExNmI4ZDJkMGM4JywgJzB4MWUzNzZjMDg1MTQxYWI1MycsICcweDI3NDg3NzRjZGY4ZWViOTknLCAnMHgzNGIwYmNiNWUxOWI0OGE4JyxcbiAgICAnMHgzOTFjMGNiM2M1Yzk1YTYzJywgJzB4NGVkOGFhNGFlMzQxOGFjYicsICcweDViOWNjYTRmNzc2M2UzNzMnLCAnMHg2ODJlNmZmM2Q2YjJiOGEzJyxcbiAgICAnMHg3NDhmODJlZTVkZWZiMmZjJywgJzB4NzhhNTYzNmY0MzE3MmY2MCcsICcweDg0Yzg3ODE0YTFmMGFiNzInLCAnMHg4Y2M3MDIwODFhNjQzOWVjJyxcbiAgICAnMHg5MGJlZmZmYTIzNjMxZTI4JywgJzB4YTQ1MDZjZWJkZTgyYmRlOScsICcweGJlZjlhM2Y3YjJjNjc5MTUnLCAnMHhjNjcxNzhmMmUzNzI1MzJiJyxcbiAgICAnMHhjYTI3M2VjZWVhMjY2MTljJywgJzB4ZDE4NmI4YzcyMWMwYzIwNycsICcweGVhZGE3ZGQ2Y2RlMGViMWUnLCAnMHhmNTdkNGY3ZmVlNmVkMTc4JyxcbiAgICAnMHgwNmYwNjdhYTcyMTc2ZmJhJywgJzB4MGE2MzdkYzVhMmM4OThhNicsICcweDExM2Y5ODA0YmVmOTBkYWUnLCAnMHgxYjcxMGIzNTEzMWM0NzFiJyxcbiAgICAnMHgyOGRiNzdmNTIzMDQ3ZDg0JywgJzB4MzJjYWFiN2I0MGM3MjQ5MycsICcweDNjOWViZTBhMTVjOWJlYmMnLCAnMHg0MzFkNjdjNDljMTAwZDRjJyxcbiAgICAnMHg0Y2M1ZDRiZWNiM2U0MmI2JywgJzB4NTk3ZjI5OWNmYzY1N2UyYScsICcweDVmY2I2ZmFiM2FkNmZhZWMnLCAnMHg2YzQ0MTk4YzRhNDc1ODE3J1xuXS5tYXAobiA9PiBCaWdJbnQobikpKSkoKTtcbmNvbnN0IFNIQTUxMl9LaCA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gSzUxMlswXSkoKTtcbmNvbnN0IFNIQTUxMl9LbCA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gSzUxMlsxXSkoKTtcbi8vIFJldXNhYmxlIHRlbXBvcmFyeSBidWZmZXJzXG5jb25zdCBTSEE1MTJfV19IID0gLyogQF9fUFVSRV9fICovIG5ldyBVaW50MzJBcnJheSg4MCk7XG5jb25zdCBTSEE1MTJfV19MID0gLyogQF9fUFVSRV9fICovIG5ldyBVaW50MzJBcnJheSg4MCk7XG5leHBvcnQgY2xhc3MgU0hBNTEyIGV4dGVuZHMgSGFzaE1EIHtcbiAgICBjb25zdHJ1Y3RvcihvdXRwdXRMZW4gPSA2NCkge1xuICAgICAgICBzdXBlcigxMjgsIG91dHB1dExlbiwgMTYsIGZhbHNlKTtcbiAgICAgICAgLy8gV2UgY2Fubm90IHVzZSBhcnJheSBoZXJlIHNpbmNlIGFycmF5IGFsbG93cyBpbmRleGluZyBieSB2YXJpYWJsZVxuICAgICAgICAvLyB3aGljaCBtZWFucyBvcHRpbWl6ZXIvY29tcGlsZXIgY2Fubm90IHVzZSByZWdpc3RlcnMuXG4gICAgICAgIC8vIGggLS0gaGlnaCAzMiBiaXRzLCBsIC0tIGxvdyAzMiBiaXRzXG4gICAgICAgIHRoaXMuQWggPSBTSEE1MTJfSVZbMF0gfCAwO1xuICAgICAgICB0aGlzLkFsID0gU0hBNTEyX0lWWzFdIHwgMDtcbiAgICAgICAgdGhpcy5CaCA9IFNIQTUxMl9JVlsyXSB8IDA7XG4gICAgICAgIHRoaXMuQmwgPSBTSEE1MTJfSVZbM10gfCAwO1xuICAgICAgICB0aGlzLkNoID0gU0hBNTEyX0lWWzRdIHwgMDtcbiAgICAgICAgdGhpcy5DbCA9IFNIQTUxMl9JVls1XSB8IDA7XG4gICAgICAgIHRoaXMuRGggPSBTSEE1MTJfSVZbNl0gfCAwO1xuICAgICAgICB0aGlzLkRsID0gU0hBNTEyX0lWWzddIHwgMDtcbiAgICAgICAgdGhpcy5FaCA9IFNIQTUxMl9JVls4XSB8IDA7XG4gICAgICAgIHRoaXMuRWwgPSBTSEE1MTJfSVZbOV0gfCAwO1xuICAgICAgICB0aGlzLkZoID0gU0hBNTEyX0lWWzEwXSB8IDA7XG4gICAgICAgIHRoaXMuRmwgPSBTSEE1MTJfSVZbMTFdIHwgMDtcbiAgICAgICAgdGhpcy5HaCA9IFNIQTUxMl9JVlsxMl0gfCAwO1xuICAgICAgICB0aGlzLkdsID0gU0hBNTEyX0lWWzEzXSB8IDA7XG4gICAgICAgIHRoaXMuSGggPSBTSEE1MTJfSVZbMTRdIHwgMDtcbiAgICAgICAgdGhpcy5IbCA9IFNIQTUxMl9JVlsxNV0gfCAwO1xuICAgIH1cbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBnZXQoKSB7XG4gICAgICAgIGNvbnN0IHsgQWgsIEFsLCBCaCwgQmwsIENoLCBDbCwgRGgsIERsLCBFaCwgRWwsIEZoLCBGbCwgR2gsIEdsLCBIaCwgSGwgfSA9IHRoaXM7XG4gICAgICAgIHJldHVybiBbQWgsIEFsLCBCaCwgQmwsIENoLCBDbCwgRGgsIERsLCBFaCwgRWwsIEZoLCBGbCwgR2gsIEdsLCBIaCwgSGxdO1xuICAgIH1cbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBzZXQoQWgsIEFsLCBCaCwgQmwsIENoLCBDbCwgRGgsIERsLCBFaCwgRWwsIEZoLCBGbCwgR2gsIEdsLCBIaCwgSGwpIHtcbiAgICAgICAgdGhpcy5BaCA9IEFoIHwgMDtcbiAgICAgICAgdGhpcy5BbCA9IEFsIHwgMDtcbiAgICAgICAgdGhpcy5CaCA9IEJoIHwgMDtcbiAgICAgICAgdGhpcy5CbCA9IEJsIHwgMDtcbiAgICAgICAgdGhpcy5DaCA9IENoIHwgMDtcbiAgICAgICAgdGhpcy5DbCA9IENsIHwgMDtcbiAgICAgICAgdGhpcy5EaCA9IERoIHwgMDtcbiAgICAgICAgdGhpcy5EbCA9IERsIHwgMDtcbiAgICAgICAgdGhpcy5FaCA9IEVoIHwgMDtcbiAgICAgICAgdGhpcy5FbCA9IEVsIHwgMDtcbiAgICAgICAgdGhpcy5GaCA9IEZoIHwgMDtcbiAgICAgICAgdGhpcy5GbCA9IEZsIHwgMDtcbiAgICAgICAgdGhpcy5HaCA9IEdoIHwgMDtcbiAgICAgICAgdGhpcy5HbCA9IEdsIHwgMDtcbiAgICAgICAgdGhpcy5IaCA9IEhoIHwgMDtcbiAgICAgICAgdGhpcy5IbCA9IEhsIHwgMDtcbiAgICB9XG4gICAgcHJvY2Vzcyh2aWV3LCBvZmZzZXQpIHtcbiAgICAgICAgLy8gRXh0ZW5kIHRoZSBmaXJzdCAxNiB3b3JkcyBpbnRvIHRoZSByZW1haW5pbmcgNjQgd29yZHMgd1sxNi4uNzldIG9mIHRoZSBtZXNzYWdlIHNjaGVkdWxlIGFycmF5XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTY7IGkrKywgb2Zmc2V0ICs9IDQpIHtcbiAgICAgICAgICAgIFNIQTUxMl9XX0hbaV0gPSB2aWV3LmdldFVpbnQzMihvZmZzZXQpO1xuICAgICAgICAgICAgU0hBNTEyX1dfTFtpXSA9IHZpZXcuZ2V0VWludDMyKChvZmZzZXQgKz0gNCkpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAxNjsgaSA8IDgwOyBpKyspIHtcbiAgICAgICAgICAgIC8vIHMwIDo9ICh3W2ktMTVdIHJpZ2h0cm90YXRlIDEpIHhvciAod1tpLTE1XSByaWdodHJvdGF0ZSA4KSB4b3IgKHdbaS0xNV0gcmlnaHRzaGlmdCA3KVxuICAgICAgICAgICAgY29uc3QgVzE1aCA9IFNIQTUxMl9XX0hbaSAtIDE1XSB8IDA7XG4gICAgICAgICAgICBjb25zdCBXMTVsID0gU0hBNTEyX1dfTFtpIC0gMTVdIHwgMDtcbiAgICAgICAgICAgIGNvbnN0IHMwaCA9IHU2NC5yb3RyU0goVzE1aCwgVzE1bCwgMSkgXiB1NjQucm90clNIKFcxNWgsIFcxNWwsIDgpIF4gdTY0LnNoclNIKFcxNWgsIFcxNWwsIDcpO1xuICAgICAgICAgICAgY29uc3QgczBsID0gdTY0LnJvdHJTTChXMTVoLCBXMTVsLCAxKSBeIHU2NC5yb3RyU0woVzE1aCwgVzE1bCwgOCkgXiB1NjQuc2hyU0woVzE1aCwgVzE1bCwgNyk7XG4gICAgICAgICAgICAvLyBzMSA6PSAod1tpLTJdIHJpZ2h0cm90YXRlIDE5KSB4b3IgKHdbaS0yXSByaWdodHJvdGF0ZSA2MSkgeG9yICh3W2ktMl0gcmlnaHRzaGlmdCA2KVxuICAgICAgICAgICAgY29uc3QgVzJoID0gU0hBNTEyX1dfSFtpIC0gMl0gfCAwO1xuICAgICAgICAgICAgY29uc3QgVzJsID0gU0hBNTEyX1dfTFtpIC0gMl0gfCAwO1xuICAgICAgICAgICAgY29uc3QgczFoID0gdTY0LnJvdHJTSChXMmgsIFcybCwgMTkpIF4gdTY0LnJvdHJCSChXMmgsIFcybCwgNjEpIF4gdTY0LnNoclNIKFcyaCwgVzJsLCA2KTtcbiAgICAgICAgICAgIGNvbnN0IHMxbCA9IHU2NC5yb3RyU0woVzJoLCBXMmwsIDE5KSBeIHU2NC5yb3RyQkwoVzJoLCBXMmwsIDYxKSBeIHU2NC5zaHJTTChXMmgsIFcybCwgNik7XG4gICAgICAgICAgICAvLyBTSEEyNTZfV1tpXSA9IHMwICsgczEgKyBTSEEyNTZfV1tpIC0gN10gKyBTSEEyNTZfV1tpIC0gMTZdO1xuICAgICAgICAgICAgY29uc3QgU1VNbCA9IHU2NC5hZGQ0TChzMGwsIHMxbCwgU0hBNTEyX1dfTFtpIC0gN10sIFNIQTUxMl9XX0xbaSAtIDE2XSk7XG4gICAgICAgICAgICBjb25zdCBTVU1oID0gdTY0LmFkZDRIKFNVTWwsIHMwaCwgczFoLCBTSEE1MTJfV19IW2kgLSA3XSwgU0hBNTEyX1dfSFtpIC0gMTZdKTtcbiAgICAgICAgICAgIFNIQTUxMl9XX0hbaV0gPSBTVU1oIHwgMDtcbiAgICAgICAgICAgIFNIQTUxMl9XX0xbaV0gPSBTVU1sIHwgMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgeyBBaCwgQWwsIEJoLCBCbCwgQ2gsIENsLCBEaCwgRGwsIEVoLCBFbCwgRmgsIEZsLCBHaCwgR2wsIEhoLCBIbCB9ID0gdGhpcztcbiAgICAgICAgLy8gQ29tcHJlc3Npb24gZnVuY3Rpb24gbWFpbiBsb29wLCA4MCByb3VuZHNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA4MDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBTMSA6PSAoZSByaWdodHJvdGF0ZSAxNCkgeG9yIChlIHJpZ2h0cm90YXRlIDE4KSB4b3IgKGUgcmlnaHRyb3RhdGUgNDEpXG4gICAgICAgICAgICBjb25zdCBzaWdtYTFoID0gdTY0LnJvdHJTSChFaCwgRWwsIDE0KSBeIHU2NC5yb3RyU0goRWgsIEVsLCAxOCkgXiB1NjQucm90ckJIKEVoLCBFbCwgNDEpO1xuICAgICAgICAgICAgY29uc3Qgc2lnbWExbCA9IHU2NC5yb3RyU0woRWgsIEVsLCAxNCkgXiB1NjQucm90clNMKEVoLCBFbCwgMTgpIF4gdTY0LnJvdHJCTChFaCwgRWwsIDQxKTtcbiAgICAgICAgICAgIC8vY29uc3QgVDEgPSAoSCArIHNpZ21hMSArIENoaShFLCBGLCBHKSArIFNIQTI1Nl9LW2ldICsgU0hBMjU2X1dbaV0pIHwgMDtcbiAgICAgICAgICAgIGNvbnN0IENISWggPSAoRWggJiBGaCkgXiAofkVoICYgR2gpO1xuICAgICAgICAgICAgY29uc3QgQ0hJbCA9IChFbCAmIEZsKSBeICh+RWwgJiBHbCk7XG4gICAgICAgICAgICAvLyBUMSA9IEggKyBzaWdtYTEgKyBDaGkoRSwgRiwgRykgKyBTSEE1MTJfS1tpXSArIFNIQTUxMl9XW2ldXG4gICAgICAgICAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IFQxbGwgPSB1NjQuYWRkNUwoSGwsIHNpZ21hMWwsIENISWwsIFNIQTUxMl9LbFtpXSwgU0hBNTEyX1dfTFtpXSk7XG4gICAgICAgICAgICBjb25zdCBUMWggPSB1NjQuYWRkNUgoVDFsbCwgSGgsIHNpZ21hMWgsIENISWgsIFNIQTUxMl9LaFtpXSwgU0hBNTEyX1dfSFtpXSk7XG4gICAgICAgICAgICBjb25zdCBUMWwgPSBUMWxsIHwgMDtcbiAgICAgICAgICAgIC8vIFMwIDo9IChhIHJpZ2h0cm90YXRlIDI4KSB4b3IgKGEgcmlnaHRyb3RhdGUgMzQpIHhvciAoYSByaWdodHJvdGF0ZSAzOSlcbiAgICAgICAgICAgIGNvbnN0IHNpZ21hMGggPSB1NjQucm90clNIKEFoLCBBbCwgMjgpIF4gdTY0LnJvdHJCSChBaCwgQWwsIDM0KSBeIHU2NC5yb3RyQkgoQWgsIEFsLCAzOSk7XG4gICAgICAgICAgICBjb25zdCBzaWdtYTBsID0gdTY0LnJvdHJTTChBaCwgQWwsIDI4KSBeIHU2NC5yb3RyQkwoQWgsIEFsLCAzNCkgXiB1NjQucm90ckJMKEFoLCBBbCwgMzkpO1xuICAgICAgICAgICAgY29uc3QgTUFKaCA9IChBaCAmIEJoKSBeIChBaCAmIENoKSBeIChCaCAmIENoKTtcbiAgICAgICAgICAgIGNvbnN0IE1BSmwgPSAoQWwgJiBCbCkgXiAoQWwgJiBDbCkgXiAoQmwgJiBDbCk7XG4gICAgICAgICAgICBIaCA9IEdoIHwgMDtcbiAgICAgICAgICAgIEhsID0gR2wgfCAwO1xuICAgICAgICAgICAgR2ggPSBGaCB8IDA7XG4gICAgICAgICAgICBHbCA9IEZsIHwgMDtcbiAgICAgICAgICAgIEZoID0gRWggfCAwO1xuICAgICAgICAgICAgRmwgPSBFbCB8IDA7XG4gICAgICAgICAgICAoeyBoOiBFaCwgbDogRWwgfSA9IHU2NC5hZGQoRGggfCAwLCBEbCB8IDAsIFQxaCB8IDAsIFQxbCB8IDApKTtcbiAgICAgICAgICAgIERoID0gQ2ggfCAwO1xuICAgICAgICAgICAgRGwgPSBDbCB8IDA7XG4gICAgICAgICAgICBDaCA9IEJoIHwgMDtcbiAgICAgICAgICAgIENsID0gQmwgfCAwO1xuICAgICAgICAgICAgQmggPSBBaCB8IDA7XG4gICAgICAgICAgICBCbCA9IEFsIHwgMDtcbiAgICAgICAgICAgIGNvbnN0IEFsbCA9IHU2NC5hZGQzTChUMWwsIHNpZ21hMGwsIE1BSmwpO1xuICAgICAgICAgICAgQWggPSB1NjQuYWRkM0goQWxsLCBUMWgsIHNpZ21hMGgsIE1BSmgpO1xuICAgICAgICAgICAgQWwgPSBBbGwgfCAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFkZCB0aGUgY29tcHJlc3NlZCBjaHVuayB0byB0aGUgY3VycmVudCBoYXNoIHZhbHVlXG4gICAgICAgICh7IGg6IEFoLCBsOiBBbCB9ID0gdTY0LmFkZCh0aGlzLkFoIHwgMCwgdGhpcy5BbCB8IDAsIEFoIHwgMCwgQWwgfCAwKSk7XG4gICAgICAgICh7IGg6IEJoLCBsOiBCbCB9ID0gdTY0LmFkZCh0aGlzLkJoIHwgMCwgdGhpcy5CbCB8IDAsIEJoIHwgMCwgQmwgfCAwKSk7XG4gICAgICAgICh7IGg6IENoLCBsOiBDbCB9ID0gdTY0LmFkZCh0aGlzLkNoIHwgMCwgdGhpcy5DbCB8IDAsIENoIHwgMCwgQ2wgfCAwKSk7XG4gICAgICAgICh7IGg6IERoLCBsOiBEbCB9ID0gdTY0LmFkZCh0aGlzLkRoIHwgMCwgdGhpcy5EbCB8IDAsIERoIHwgMCwgRGwgfCAwKSk7XG4gICAgICAgICh7IGg6IEVoLCBsOiBFbCB9ID0gdTY0LmFkZCh0aGlzLkVoIHwgMCwgdGhpcy5FbCB8IDAsIEVoIHwgMCwgRWwgfCAwKSk7XG4gICAgICAgICh7IGg6IEZoLCBsOiBGbCB9ID0gdTY0LmFkZCh0aGlzLkZoIHwgMCwgdGhpcy5GbCB8IDAsIEZoIHwgMCwgRmwgfCAwKSk7XG4gICAgICAgICh7IGg6IEdoLCBsOiBHbCB9ID0gdTY0LmFkZCh0aGlzLkdoIHwgMCwgdGhpcy5HbCB8IDAsIEdoIHwgMCwgR2wgfCAwKSk7XG4gICAgICAgICh7IGg6IEhoLCBsOiBIbCB9ID0gdTY0LmFkZCh0aGlzLkhoIHwgMCwgdGhpcy5IbCB8IDAsIEhoIHwgMCwgSGwgfCAwKSk7XG4gICAgICAgIHRoaXMuc2V0KEFoLCBBbCwgQmgsIEJsLCBDaCwgQ2wsIERoLCBEbCwgRWgsIEVsLCBGaCwgRmwsIEdoLCBHbCwgSGgsIEhsKTtcbiAgICB9XG4gICAgcm91bmRDbGVhbigpIHtcbiAgICAgICAgY2xlYW4oU0hBNTEyX1dfSCwgU0hBNTEyX1dfTCk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGNsZWFuKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgdGhpcy5zZXQoMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFNIQTM4NCBleHRlbmRzIFNIQTUxMiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKDQ4KTtcbiAgICAgICAgdGhpcy5BaCA9IFNIQTM4NF9JVlswXSB8IDA7XG4gICAgICAgIHRoaXMuQWwgPSBTSEEzODRfSVZbMV0gfCAwO1xuICAgICAgICB0aGlzLkJoID0gU0hBMzg0X0lWWzJdIHwgMDtcbiAgICAgICAgdGhpcy5CbCA9IFNIQTM4NF9JVlszXSB8IDA7XG4gICAgICAgIHRoaXMuQ2ggPSBTSEEzODRfSVZbNF0gfCAwO1xuICAgICAgICB0aGlzLkNsID0gU0hBMzg0X0lWWzVdIHwgMDtcbiAgICAgICAgdGhpcy5EaCA9IFNIQTM4NF9JVls2XSB8IDA7XG4gICAgICAgIHRoaXMuRGwgPSBTSEEzODRfSVZbN10gfCAwO1xuICAgICAgICB0aGlzLkVoID0gU0hBMzg0X0lWWzhdIHwgMDtcbiAgICAgICAgdGhpcy5FbCA9IFNIQTM4NF9JVls5XSB8IDA7XG4gICAgICAgIHRoaXMuRmggPSBTSEEzODRfSVZbMTBdIHwgMDtcbiAgICAgICAgdGhpcy5GbCA9IFNIQTM4NF9JVlsxMV0gfCAwO1xuICAgICAgICB0aGlzLkdoID0gU0hBMzg0X0lWWzEyXSB8IDA7XG4gICAgICAgIHRoaXMuR2wgPSBTSEEzODRfSVZbMTNdIHwgMDtcbiAgICAgICAgdGhpcy5IaCA9IFNIQTM4NF9JVlsxNF0gfCAwO1xuICAgICAgICB0aGlzLkhsID0gU0hBMzg0X0lWWzE1XSB8IDA7XG4gICAgfVxufVxuLyoqXG4gKiBUcnVuY2F0ZWQgU0hBNTEyLzI1NiBhbmQgU0hBNTEyLzIyNC5cbiAqIFNIQTUxMl9JViBpcyBYT1JlZCB3aXRoIDB4YTVhNWE1YTVhNWE1YTVhNSwgdGhlbiB1c2VkIGFzIFwiaW50ZXJtZWRpYXJ5XCIgSVYgb2YgU0hBNTEyL3QuXG4gKiBUaGVuIHQgaGFzaGVzIHN0cmluZyB0byBwcm9kdWNlIHJlc3VsdCBJVi5cbiAqIFNlZSBgdGVzdC9taXNjL3NoYTItZ2VuLWl2LmpzYC5cbiAqL1xuLyoqIFNIQTUxMi8yMjQgSVYgKi9cbmNvbnN0IFQyMjRfSVYgPSAvKiBAX19QVVJFX18gKi8gVWludDMyQXJyYXkuZnJvbShbXG4gICAgMHg4YzNkMzdjOCwgMHgxOTU0NGRhMiwgMHg3M2UxOTk2NiwgMHg4OWRjZDRkNiwgMHgxZGZhYjdhZSwgMHgzMmZmOWM4MiwgMHg2NzlkZDUxNCwgMHg1ODJmOWZjZixcbiAgICAweDBmNmQyYjY5LCAweDdiZDQ0ZGE4LCAweDc3ZTM2ZjczLCAweDA0YzQ4OTQyLCAweDNmOWQ4NWE4LCAweDZhMWQzNmM4LCAweDExMTJlNmFkLCAweDkxZDY5MmExLFxuXSk7XG4vKiogU0hBNTEyLzI1NiBJViAqL1xuY29uc3QgVDI1Nl9JViA9IC8qIEBfX1BVUkVfXyAqLyBVaW50MzJBcnJheS5mcm9tKFtcbiAgICAweDIyMzEyMTk0LCAweGZjMmJmNzJjLCAweDlmNTU1ZmEzLCAweGM4NGM2NGMyLCAweDIzOTNiODZiLCAweDZmNTNiMTUxLCAweDk2Mzg3NzE5LCAweDU5NDBlYWJkLFxuICAgIDB4OTYyODNlZTIsIDB4YTg4ZWZmZTMsIDB4YmU1ZTFlMjUsIDB4NTM4NjM5OTIsIDB4MmIwMTk5ZmMsIDB4MmM4NWI4YWEsIDB4MGViNzJkZGMsIDB4ODFjNTJjYTIsXG5dKTtcbmV4cG9ydCBjbGFzcyBTSEE1MTJfMjI0IGV4dGVuZHMgU0hBNTEyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoMjgpO1xuICAgICAgICB0aGlzLkFoID0gVDIyNF9JVlswXSB8IDA7XG4gICAgICAgIHRoaXMuQWwgPSBUMjI0X0lWWzFdIHwgMDtcbiAgICAgICAgdGhpcy5CaCA9IFQyMjRfSVZbMl0gfCAwO1xuICAgICAgICB0aGlzLkJsID0gVDIyNF9JVlszXSB8IDA7XG4gICAgICAgIHRoaXMuQ2ggPSBUMjI0X0lWWzRdIHwgMDtcbiAgICAgICAgdGhpcy5DbCA9IFQyMjRfSVZbNV0gfCAwO1xuICAgICAgICB0aGlzLkRoID0gVDIyNF9JVls2XSB8IDA7XG4gICAgICAgIHRoaXMuRGwgPSBUMjI0X0lWWzddIHwgMDtcbiAgICAgICAgdGhpcy5FaCA9IFQyMjRfSVZbOF0gfCAwO1xuICAgICAgICB0aGlzLkVsID0gVDIyNF9JVls5XSB8IDA7XG4gICAgICAgIHRoaXMuRmggPSBUMjI0X0lWWzEwXSB8IDA7XG4gICAgICAgIHRoaXMuRmwgPSBUMjI0X0lWWzExXSB8IDA7XG4gICAgICAgIHRoaXMuR2ggPSBUMjI0X0lWWzEyXSB8IDA7XG4gICAgICAgIHRoaXMuR2wgPSBUMjI0X0lWWzEzXSB8IDA7XG4gICAgICAgIHRoaXMuSGggPSBUMjI0X0lWWzE0XSB8IDA7XG4gICAgICAgIHRoaXMuSGwgPSBUMjI0X0lWWzE1XSB8IDA7XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFNIQTUxMl8yNTYgZXh0ZW5kcyBTSEE1MTIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigzMik7XG4gICAgICAgIHRoaXMuQWggPSBUMjU2X0lWWzBdIHwgMDtcbiAgICAgICAgdGhpcy5BbCA9IFQyNTZfSVZbMV0gfCAwO1xuICAgICAgICB0aGlzLkJoID0gVDI1Nl9JVlsyXSB8IDA7XG4gICAgICAgIHRoaXMuQmwgPSBUMjU2X0lWWzNdIHwgMDtcbiAgICAgICAgdGhpcy5DaCA9IFQyNTZfSVZbNF0gfCAwO1xuICAgICAgICB0aGlzLkNsID0gVDI1Nl9JVls1XSB8IDA7XG4gICAgICAgIHRoaXMuRGggPSBUMjU2X0lWWzZdIHwgMDtcbiAgICAgICAgdGhpcy5EbCA9IFQyNTZfSVZbN10gfCAwO1xuICAgICAgICB0aGlzLkVoID0gVDI1Nl9JVls4XSB8IDA7XG4gICAgICAgIHRoaXMuRWwgPSBUMjU2X0lWWzldIHwgMDtcbiAgICAgICAgdGhpcy5GaCA9IFQyNTZfSVZbMTBdIHwgMDtcbiAgICAgICAgdGhpcy5GbCA9IFQyNTZfSVZbMTFdIHwgMDtcbiAgICAgICAgdGhpcy5HaCA9IFQyNTZfSVZbMTJdIHwgMDtcbiAgICAgICAgdGhpcy5HbCA9IFQyNTZfSVZbMTNdIHwgMDtcbiAgICAgICAgdGhpcy5IaCA9IFQyNTZfSVZbMTRdIHwgMDtcbiAgICAgICAgdGhpcy5IbCA9IFQyNTZfSVZbMTVdIHwgMDtcbiAgICB9XG59XG4vKipcbiAqIFNIQTItMjU2IGhhc2ggZnVuY3Rpb24gZnJvbSBSRkMgNDYzNC5cbiAqXG4gKiBJdCBpcyB0aGUgZmFzdGVzdCBKUyBoYXNoLCBldmVuIGZhc3RlciB0aGFuIEJsYWtlMy5cbiAqIFRvIGJyZWFrIHNoYTI1NiB1c2luZyBiaXJ0aGRheSBhdHRhY2ssIGF0dGFja2VycyBuZWVkIHRvIHRyeSAyXjEyOCBoYXNoZXMuXG4gKiBCVEMgbmV0d29yayBpcyBkb2luZyAyXjcwIGhhc2hlcy9zZWMgKDJeOTUgaGFzaGVzL3llYXIpIGFzIHBlciAyMDI1LlxuICovXG5leHBvcnQgY29uc3Qgc2hhMjU2ID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUhhc2hlcigoKSA9PiBuZXcgU0hBMjU2KCkpO1xuLyoqIFNIQTItMjI0IGhhc2ggZnVuY3Rpb24gZnJvbSBSRkMgNDYzNCAqL1xuZXhwb3J0IGNvbnN0IHNoYTIyNCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVIYXNoZXIoKCkgPT4gbmV3IFNIQTIyNCgpKTtcbi8qKiBTSEEyLTUxMiBoYXNoIGZ1bmN0aW9uIGZyb20gUkZDIDQ2MzQuICovXG5leHBvcnQgY29uc3Qgc2hhNTEyID0gLyogQF9fUFVSRV9fICovIGNyZWF0ZUhhc2hlcigoKSA9PiBuZXcgU0hBNTEyKCkpO1xuLyoqIFNIQTItMzg0IGhhc2ggZnVuY3Rpb24gZnJvbSBSRkMgNDYzNC4gKi9cbmV4cG9ydCBjb25zdCBzaGEzODQgPSAvKiBAX19QVVJFX18gKi8gY3JlYXRlSGFzaGVyKCgpID0+IG5ldyBTSEEzODQoKSk7XG4vKipcbiAqIFNIQTItNTEyLzI1NiBcInRydW5jYXRlZFwiIGhhc2ggZnVuY3Rpb24sIHdpdGggaW1wcm92ZWQgcmVzaXN0YW5jZSB0byBsZW5ndGggZXh0ZW5zaW9uIGF0dGFja3MuXG4gKiBTZWUgdGhlIHBhcGVyIG9uIFt0cnVuY2F0ZWQgU0hBNTEyXShodHRwczovL2VwcmludC5pYWNyLm9yZy8yMDEwLzU0OC5wZGYpLlxuICovXG5leHBvcnQgY29uc3Qgc2hhNTEyXzI1NiA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVIYXNoZXIoKCkgPT4gbmV3IFNIQTUxMl8yNTYoKSk7XG4vKipcbiAqIFNIQTItNTEyLzIyNCBcInRydW5jYXRlZFwiIGhhc2ggZnVuY3Rpb24sIHdpdGggaW1wcm92ZWQgcmVzaXN0YW5jZSB0byBsZW5ndGggZXh0ZW5zaW9uIGF0dGFja3MuXG4gKiBTZWUgdGhlIHBhcGVyIG9uIFt0cnVuY2F0ZWQgU0hBNTEyXShodHRwczovL2VwcmludC5pYWNyLm9yZy8yMDEwLzU0OC5wZGYpLlxuICovXG5leHBvcnQgY29uc3Qgc2hhNTEyXzIyNCA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGVIYXNoZXIoKCkgPT4gbmV3IFNIQTUxMl8yMjQoKSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zaGEyLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/hashes/esm/sha2.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/hashes/esm/sha256.js":
/*!**************************************************!*\
  !*** ./node_modules/@noble/hashes/esm/sha256.js ***!
  \**************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   SHA224: () => (/* binding */ SHA224),\n/* harmony export */   SHA256: () => (/* binding */ SHA256),\n/* harmony export */   sha224: () => (/* binding */ sha224),\n/* harmony export */   sha256: () => (/* binding */ sha256)\n/* harmony export */ });\n/* harmony import */ var _sha2_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./sha2.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/sha2.js\");\n/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\n\n/** @deprecated Use import from `noble/hashes/sha2` module */\nconst SHA256 = _sha2_js__WEBPACK_IMPORTED_MODULE_0__.SHA256;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nconst sha256 = _sha2_js__WEBPACK_IMPORTED_MODULE_0__.sha256;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nconst SHA224 = _sha2_js__WEBPACK_IMPORTED_MODULE_0__.SHA224;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nconst sha224 = _sha2_js__WEBPACK_IMPORTED_MODULE_0__.sha224;\n//# sourceMappingURL=sha256.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9zaGEyNTYuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUN3RztBQUN4RztBQUNPLGVBQWUsNENBQU87QUFDN0I7QUFDTyxlQUFlLDRDQUFPO0FBQzdCO0FBQ08sZUFBZSw0Q0FBTztBQUM3QjtBQUNPLGVBQWUsNENBQU87QUFDN0IiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQG5vYmxlL2hhc2hlcy9lc20vc2hhMjU2LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU0hBMi0yNTYgYS5rLmEuIHNoYTI1Ni4gSW4gSlMsIGl0IGlzIHRoZSBmYXN0ZXN0IGhhc2gsIGV2ZW4gZmFzdGVyIHRoYW4gQmxha2UzLlxuICpcbiAqIFRvIGJyZWFrIHNoYTI1NiB1c2luZyBiaXJ0aGRheSBhdHRhY2ssIGF0dGFja2VycyBuZWVkIHRvIHRyeSAyXjEyOCBoYXNoZXMuXG4gKiBCVEMgbmV0d29yayBpcyBkb2luZyAyXjcwIGhhc2hlcy9zZWMgKDJeOTUgaGFzaGVzL3llYXIpIGFzIHBlciAyMDI1LlxuICpcbiAqIENoZWNrIG91dCBbRklQUyAxODAtNF0oaHR0cHM6Ly9udmxwdWJzLm5pc3QuZ292L25pc3RwdWJzL0ZJUFMvTklTVC5GSVBTLjE4MC00LnBkZikuXG4gKiBAbW9kdWxlXG4gKiBAZGVwcmVjYXRlZFxuICovXG5pbXBvcnQgeyBTSEEyMjQgYXMgU0hBMjI0biwgc2hhMjI0IGFzIHNoYTIyNG4sIFNIQTI1NiBhcyBTSEEyNTZuLCBzaGEyNTYgYXMgc2hhMjU2biwgfSBmcm9tIFwiLi9zaGEyLmpzXCI7XG4vKiogQGRlcHJlY2F0ZWQgVXNlIGltcG9ydCBmcm9tIGBub2JsZS9oYXNoZXMvc2hhMmAgbW9kdWxlICovXG5leHBvcnQgY29uc3QgU0hBMjU2ID0gU0hBMjU2bjtcbi8qKiBAZGVwcmVjYXRlZCBVc2UgaW1wb3J0IGZyb20gYG5vYmxlL2hhc2hlcy9zaGEyYCBtb2R1bGUgKi9cbmV4cG9ydCBjb25zdCBzaGEyNTYgPSBzaGEyNTZuO1xuLyoqIEBkZXByZWNhdGVkIFVzZSBpbXBvcnQgZnJvbSBgbm9ibGUvaGFzaGVzL3NoYTJgIG1vZHVsZSAqL1xuZXhwb3J0IGNvbnN0IFNIQTIyNCA9IFNIQTIyNG47XG4vKiogQGRlcHJlY2F0ZWQgVXNlIGltcG9ydCBmcm9tIGBub2JsZS9oYXNoZXMvc2hhMmAgbW9kdWxlICovXG5leHBvcnQgY29uc3Qgc2hhMjI0ID0gc2hhMjI0bjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoYTI1Ni5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/hashes/esm/sha256.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/hashes/esm/sha3.js":
/*!************************************************!*\
  !*** ./node_modules/@noble/hashes/esm/sha3.js ***!
  \************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Keccak: () => (/* binding */ Keccak),\n/* harmony export */   keccakP: () => (/* binding */ keccakP),\n/* harmony export */   keccak_224: () => (/* binding */ keccak_224),\n/* harmony export */   keccak_256: () => (/* binding */ keccak_256),\n/* harmony export */   keccak_384: () => (/* binding */ keccak_384),\n/* harmony export */   keccak_512: () => (/* binding */ keccak_512),\n/* harmony export */   sha3_224: () => (/* binding */ sha3_224),\n/* harmony export */   sha3_256: () => (/* binding */ sha3_256),\n/* harmony export */   sha3_384: () => (/* binding */ sha3_384),\n/* harmony export */   sha3_512: () => (/* binding */ sha3_512),\n/* harmony export */   shake128: () => (/* binding */ shake128),\n/* harmony export */   shake256: () => (/* binding */ shake256)\n/* harmony export */ });\n/* harmony import */ var _u64_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./_u64.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/_u64.js\");\n/* harmony import */ var _utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils.js */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\");\n/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\n\n// prettier-ignore\n\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI = [];\nconst SHA3_ROTL = [];\nconst _SHA3_IOTA = [];\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n    // Pi\n    [x, y] = [y, (2 * x + 3 * y) % 5];\n    SHA3_PI.push(2 * (5 * y + x));\n    // Rotational\n    SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n    // Iota\n    let t = _0n;\n    for (let j = 0; j < 7; j++) {\n        R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n        if (R & _2n)\n            t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n    }\n    _SHA3_IOTA.push(t);\n}\nconst IOTAS = (0,_u64_js__WEBPACK_IMPORTED_MODULE_0__.split)(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h, l, s) => (s > 32 ? (0,_u64_js__WEBPACK_IMPORTED_MODULE_0__.rotlBH)(h, l, s) : (0,_u64_js__WEBPACK_IMPORTED_MODULE_0__.rotlSH)(h, l, s));\nconst rotlL = (h, l, s) => (s > 32 ? (0,_u64_js__WEBPACK_IMPORTED_MODULE_0__.rotlBL)(h, l, s) : (0,_u64_js__WEBPACK_IMPORTED_MODULE_0__.rotlSL)(h, l, s));\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nfunction keccakP(s, rounds = 24) {\n    const B = new Uint32Array(5 * 2);\n    // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n    for (let round = 24 - rounds; round < 24; round++) {\n        // Theta θ\n        for (let x = 0; x < 10; x++)\n            B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n        for (let x = 0; x < 10; x += 2) {\n            const idx1 = (x + 8) % 10;\n            const idx0 = (x + 2) % 10;\n            const B0 = B[idx0];\n            const B1 = B[idx0 + 1];\n            const Th = rotlH(B0, B1, 1) ^ B[idx1];\n            const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n            for (let y = 0; y < 50; y += 10) {\n                s[x + y] ^= Th;\n                s[x + y + 1] ^= Tl;\n            }\n        }\n        // Rho (ρ) and Pi (π)\n        let curH = s[2];\n        let curL = s[3];\n        for (let t = 0; t < 24; t++) {\n            const shift = SHA3_ROTL[t];\n            const Th = rotlH(curH, curL, shift);\n            const Tl = rotlL(curH, curL, shift);\n            const PI = SHA3_PI[t];\n            curH = s[PI];\n            curL = s[PI + 1];\n            s[PI] = Th;\n            s[PI + 1] = Tl;\n        }\n        // Chi (χ)\n        for (let y = 0; y < 50; y += 10) {\n            for (let x = 0; x < 10; x++)\n                B[x] = s[y + x];\n            for (let x = 0; x < 10; x++)\n                s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n        }\n        // Iota (ι)\n        s[0] ^= SHA3_IOTA_H[round];\n        s[1] ^= SHA3_IOTA_L[round];\n    }\n    (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(B);\n}\n/** Keccak sponge function. */\nclass Keccak extends _utils_js__WEBPACK_IMPORTED_MODULE_1__.Hash {\n    // NOTE: we accept arguments in bytes instead of bits here.\n    constructor(blockLen, suffix, outputLen, enableXOF = false, rounds = 24) {\n        super();\n        this.pos = 0;\n        this.posOut = 0;\n        this.finished = false;\n        this.destroyed = false;\n        this.enableXOF = false;\n        this.blockLen = blockLen;\n        this.suffix = suffix;\n        this.outputLen = outputLen;\n        this.enableXOF = enableXOF;\n        this.rounds = rounds;\n        // Can be passed from user as dkLen\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.anumber)(outputLen);\n        // 1600 = 5x5 matrix of 64bit.  1600 bits === 200 bytes\n        // 0 < blockLen < 200\n        if (!(0 < blockLen && blockLen < 200))\n            throw new Error('only keccak-f1600 function is supported');\n        this.state = new Uint8Array(200);\n        this.state32 = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.u32)(this.state);\n    }\n    clone() {\n        return this._cloneInto();\n    }\n    keccak() {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.swap32IfBE)(this.state32);\n        keccakP(this.state32, this.rounds);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.swap32IfBE)(this.state32);\n        this.posOut = 0;\n        this.pos = 0;\n    }\n    update(data) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.aexists)(this);\n        data = (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.toBytes)(data);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.abytes)(data);\n        const { blockLen, state } = this;\n        const len = data.length;\n        for (let pos = 0; pos < len;) {\n            const take = Math.min(blockLen - this.pos, len - pos);\n            for (let i = 0; i < take; i++)\n                state[this.pos++] ^= data[pos++];\n            if (this.pos === blockLen)\n                this.keccak();\n        }\n        return this;\n    }\n    finish() {\n        if (this.finished)\n            return;\n        this.finished = true;\n        const { state, suffix, pos, blockLen } = this;\n        // Do the padding\n        state[pos] ^= suffix;\n        if ((suffix & 0x80) !== 0 && pos === blockLen - 1)\n            this.keccak();\n        state[blockLen - 1] ^= 0x80;\n        this.keccak();\n    }\n    writeInto(out) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.aexists)(this, false);\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.abytes)(out);\n        this.finish();\n        const bufferOut = this.state;\n        const { blockLen } = this;\n        for (let pos = 0, len = out.length; pos < len;) {\n            if (this.posOut >= blockLen)\n                this.keccak();\n            const take = Math.min(blockLen - this.posOut, len - pos);\n            out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n            this.posOut += take;\n            pos += take;\n        }\n        return out;\n    }\n    xofInto(out) {\n        // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n        if (!this.enableXOF)\n            throw new Error('XOF is not possible for this instance');\n        return this.writeInto(out);\n    }\n    xof(bytes) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.anumber)(bytes);\n        return this.xofInto(new Uint8Array(bytes));\n    }\n    digestInto(out) {\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.aoutput)(out, this);\n        if (this.finished)\n            throw new Error('digest() was already called');\n        this.writeInto(out);\n        this.destroy();\n        return out;\n    }\n    digest() {\n        return this.digestInto(new Uint8Array(this.outputLen));\n    }\n    destroy() {\n        this.destroyed = true;\n        (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.clean)(this.state);\n    }\n    _cloneInto(to) {\n        const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n        to || (to = new Keccak(blockLen, suffix, outputLen, enableXOF, rounds));\n        to.state32.set(this.state32);\n        to.pos = this.pos;\n        to.posOut = this.posOut;\n        to.finished = this.finished;\n        to.rounds = rounds;\n        // Suffix can change in cSHAKE\n        to.suffix = suffix;\n        to.outputLen = outputLen;\n        to.enableXOF = enableXOF;\n        to.destroyed = this.destroyed;\n        return to;\n    }\n}\nconst gen = (suffix, blockLen, outputLen) => (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createHasher)(() => new Keccak(blockLen, suffix, outputLen));\n/** SHA3-224 hash function. */\nconst sha3_224 = /* @__PURE__ */ (() => gen(0x06, 144, 224 / 8))();\n/** SHA3-256 hash function. Different from keccak-256. */\nconst sha3_256 = /* @__PURE__ */ (() => gen(0x06, 136, 256 / 8))();\n/** SHA3-384 hash function. */\nconst sha3_384 = /* @__PURE__ */ (() => gen(0x06, 104, 384 / 8))();\n/** SHA3-512 hash function. */\nconst sha3_512 = /* @__PURE__ */ (() => gen(0x06, 72, 512 / 8))();\n/** keccak-224 hash function. */\nconst keccak_224 = /* @__PURE__ */ (() => gen(0x01, 144, 224 / 8))();\n/** keccak-256 hash function. Different from SHA3-256. */\nconst keccak_256 = /* @__PURE__ */ (() => gen(0x01, 136, 256 / 8))();\n/** keccak-384 hash function. */\nconst keccak_384 = /* @__PURE__ */ (() => gen(0x01, 104, 384 / 8))();\n/** keccak-512 hash function. */\nconst keccak_512 = /* @__PURE__ */ (() => gen(0x01, 72, 512 / 8))();\nconst genShake = (suffix, blockLen, outputLen) => (0,_utils_js__WEBPACK_IMPORTED_MODULE_1__.createXOFer)((opts = {}) => new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true));\n/** SHAKE128 XOF with 128-bit security. */\nconst shake128 = /* @__PURE__ */ (() => genShake(0x1f, 168, 128 / 8))();\n/** SHAKE256 XOF with 256-bit security. */\nconst shake256 = /* @__PURE__ */ (() => genShake(0x1f, 136, 256 / 8))();\n//# sourceMappingURL=sha3.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS9zaGEzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNrRTtBQUNsRTtBQUNpSTtBQUNqSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMsWUFBWTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsOENBQUs7QUFDbkI7QUFDQTtBQUNBO0FBQ0EscUNBQXFDLCtDQUFNLFlBQVksK0NBQU07QUFDN0QscUNBQXFDLCtDQUFNLFlBQVksK0NBQU07QUFDN0Q7QUFDTztBQUNQO0FBQ0E7QUFDQSxrQ0FBa0MsWUFBWTtBQUM5QztBQUNBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0Esd0JBQXdCLFFBQVE7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsUUFBUTtBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixRQUFRO0FBQ2hDLDRCQUE0QixRQUFRO0FBQ3BDO0FBQ0EsNEJBQTRCLFFBQVE7QUFDcEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxnREFBSztBQUNUO0FBQ0E7QUFDTyxxQkFBcUIsMkNBQUk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0RBQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDhDQUFHO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLHFEQUFVO0FBQ2xCO0FBQ0EsUUFBUSxxREFBVTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0RBQU87QUFDZixlQUFlLGtEQUFPO0FBQ3RCLFFBQVEsaURBQU07QUFDZCxnQkFBZ0Isa0JBQWtCO0FBQ2xDO0FBQ0EsMEJBQTBCLFVBQVU7QUFDcEM7QUFDQSw0QkFBNEIsVUFBVTtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQiwrQkFBK0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0RBQU87QUFDZixRQUFRLGlEQUFNO0FBQ2Q7QUFDQTtBQUNBLGdCQUFnQixXQUFXO0FBQzNCLDRDQUE0QyxVQUFVO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxrREFBTztBQUNmO0FBQ0E7QUFDQTtBQUNBLFFBQVEsa0RBQU87QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxnREFBSztBQUNiO0FBQ0E7QUFDQSxnQkFBZ0IsaURBQWlEO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkMsdURBQVk7QUFDekQ7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDTztBQUNQO0FBQ087QUFDUCxrREFBa0Qsc0RBQVcsV0FBVztBQUN4RTtBQUNPO0FBQ1A7QUFDTztBQUNQIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0Bub2JsZS9oYXNoZXMvZXNtL3NoYTMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTSEEzIChrZWNjYWspIGhhc2ggZnVuY3Rpb24sIGJhc2VkIG9uIGEgbmV3IFwiU3BvbmdlIGZ1bmN0aW9uXCIgZGVzaWduLlxuICogRGlmZmVyZW50IGZyb20gb2xkZXIgaGFzaGVzLCB0aGUgaW50ZXJuYWwgc3RhdGUgaXMgYmlnZ2VyIHRoYW4gb3V0cHV0IHNpemUuXG4gKlxuICogQ2hlY2sgb3V0IFtGSVBTLTIwMl0oaHR0cHM6Ly9udmxwdWJzLm5pc3QuZ292L25pc3RwdWJzL0ZJUFMvTklTVC5GSVBTLjIwMi5wZGYpLFxuICogW1dlYnNpdGVdKGh0dHBzOi8va2VjY2FrLnRlYW0va2VjY2FrLmh0bWwpLFxuICogW3RoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIFNIQS0zIGFuZCBLZWNjYWtdKGh0dHBzOi8vY3J5cHRvLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xNTcyNy93aGF0LWFyZS10aGUta2V5LWRpZmZlcmVuY2VzLWJldHdlZW4tdGhlLWRyYWZ0LXNoYS0zLXN0YW5kYXJkLWFuZC10aGUta2VjY2FrLXN1YikuXG4gKlxuICogQ2hlY2sgb3V0IGBzaGEzLWFkZG9uc2AgbW9kdWxlIGZvciBjU0hBS0UsIGsxMiwgYW5kIG90aGVycy5cbiAqIEBtb2R1bGVcbiAqL1xuaW1wb3J0IHsgcm90bEJILCByb3RsQkwsIHJvdGxTSCwgcm90bFNMLCBzcGxpdCB9IGZyb20gXCIuL191NjQuanNcIjtcbi8vIHByZXR0aWVyLWlnbm9yZVxuaW1wb3J0IHsgYWJ5dGVzLCBhZXhpc3RzLCBhbnVtYmVyLCBhb3V0cHV0LCBjbGVhbiwgY3JlYXRlSGFzaGVyLCBjcmVhdGVYT0ZlciwgSGFzaCwgc3dhcDMySWZCRSwgdG9CeXRlcywgdTMyIH0gZnJvbSBcIi4vdXRpbHMuanNcIjtcbi8vIE5vIF9fUFVSRV9fIGFubm90YXRpb25zIGluIHNoYTMgaGVhZGVyOlxuLy8gRVZFUllUSElORyBpcyBpbiBmYWN0IHVzZWQgb24gZXZlcnkgZXhwb3J0LlxuLy8gVmFyaW91cyBwZXIgcm91bmQgY29uc3RhbnRzIGNhbGN1bGF0aW9uc1xuY29uc3QgXzBuID0gQmlnSW50KDApO1xuY29uc3QgXzFuID0gQmlnSW50KDEpO1xuY29uc3QgXzJuID0gQmlnSW50KDIpO1xuY29uc3QgXzduID0gQmlnSW50KDcpO1xuY29uc3QgXzI1Nm4gPSBCaWdJbnQoMjU2KTtcbmNvbnN0IF8weDcxbiA9IEJpZ0ludCgweDcxKTtcbmNvbnN0IFNIQTNfUEkgPSBbXTtcbmNvbnN0IFNIQTNfUk9UTCA9IFtdO1xuY29uc3QgX1NIQTNfSU9UQSA9IFtdO1xuZm9yIChsZXQgcm91bmQgPSAwLCBSID0gXzFuLCB4ID0gMSwgeSA9IDA7IHJvdW5kIDwgMjQ7IHJvdW5kKyspIHtcbiAgICAvLyBQaVxuICAgIFt4LCB5XSA9IFt5LCAoMiAqIHggKyAzICogeSkgJSA1XTtcbiAgICBTSEEzX1BJLnB1c2goMiAqICg1ICogeSArIHgpKTtcbiAgICAvLyBSb3RhdGlvbmFsXG4gICAgU0hBM19ST1RMLnB1c2goKCgocm91bmQgKyAxKSAqIChyb3VuZCArIDIpKSAvIDIpICUgNjQpO1xuICAgIC8vIElvdGFcbiAgICBsZXQgdCA9IF8wbjtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IDc7IGorKykge1xuICAgICAgICBSID0gKChSIDw8IF8xbikgXiAoKFIgPj4gXzduKSAqIF8weDcxbikpICUgXzI1Nm47XG4gICAgICAgIGlmIChSICYgXzJuKVxuICAgICAgICAgICAgdCBePSBfMW4gPDwgKChfMW4gPDwgLyogQF9fUFVSRV9fICovIEJpZ0ludChqKSkgLSBfMW4pO1xuICAgIH1cbiAgICBfU0hBM19JT1RBLnB1c2godCk7XG59XG5jb25zdCBJT1RBUyA9IHNwbGl0KF9TSEEzX0lPVEEsIHRydWUpO1xuY29uc3QgU0hBM19JT1RBX0ggPSBJT1RBU1swXTtcbmNvbnN0IFNIQTNfSU9UQV9MID0gSU9UQVNbMV07XG4vLyBMZWZ0IHJvdGF0aW9uICh3aXRob3V0IDAsIDMyLCA2NClcbmNvbnN0IHJvdGxIID0gKGgsIGwsIHMpID0+IChzID4gMzIgPyByb3RsQkgoaCwgbCwgcykgOiByb3RsU0goaCwgbCwgcykpO1xuY29uc3Qgcm90bEwgPSAoaCwgbCwgcykgPT4gKHMgPiAzMiA/IHJvdGxCTChoLCBsLCBzKSA6IHJvdGxTTChoLCBsLCBzKSk7XG4vKiogYGtlY2Nha2YxNjAwYCBpbnRlcm5hbCBmdW5jdGlvbiwgYWRkaXRpb25hbGx5IGFsbG93cyB0byBhZGp1c3Qgcm91bmQgY291bnQuICovXG5leHBvcnQgZnVuY3Rpb24ga2VjY2FrUChzLCByb3VuZHMgPSAyNCkge1xuICAgIGNvbnN0IEIgPSBuZXcgVWludDMyQXJyYXkoNSAqIDIpO1xuICAgIC8vIE5PVEU6IGFsbCBpbmRpY2VzIGFyZSB4MiBzaW5jZSB3ZSBzdG9yZSBzdGF0ZSBhcyB1MzIgaW5zdGVhZCBvZiB1NjQgKGJpZ2ludHMgdG8gc2xvdyBpbiBqcylcbiAgICBmb3IgKGxldCByb3VuZCA9IDI0IC0gcm91bmRzOyByb3VuZCA8IDI0OyByb3VuZCsrKSB7XG4gICAgICAgIC8vIFRoZXRhIM64XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgMTA7IHgrKylcbiAgICAgICAgICAgIEJbeF0gPSBzW3hdIF4gc1t4ICsgMTBdIF4gc1t4ICsgMjBdIF4gc1t4ICsgMzBdIF4gc1t4ICsgNDBdO1xuICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IDEwOyB4ICs9IDIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeDEgPSAoeCArIDgpICUgMTA7XG4gICAgICAgICAgICBjb25zdCBpZHgwID0gKHggKyAyKSAlIDEwO1xuICAgICAgICAgICAgY29uc3QgQjAgPSBCW2lkeDBdO1xuICAgICAgICAgICAgY29uc3QgQjEgPSBCW2lkeDAgKyAxXTtcbiAgICAgICAgICAgIGNvbnN0IFRoID0gcm90bEgoQjAsIEIxLCAxKSBeIEJbaWR4MV07XG4gICAgICAgICAgICBjb25zdCBUbCA9IHJvdGxMKEIwLCBCMSwgMSkgXiBCW2lkeDEgKyAxXTtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSAwOyB5IDwgNTA7IHkgKz0gMTApIHtcbiAgICAgICAgICAgICAgICBzW3ggKyB5XSBePSBUaDtcbiAgICAgICAgICAgICAgICBzW3ggKyB5ICsgMV0gXj0gVGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmhvICjPgSkgYW5kIFBpICjPgClcbiAgICAgICAgbGV0IGN1ckggPSBzWzJdO1xuICAgICAgICBsZXQgY3VyTCA9IHNbM107XG4gICAgICAgIGZvciAobGV0IHQgPSAwOyB0IDwgMjQ7IHQrKykge1xuICAgICAgICAgICAgY29uc3Qgc2hpZnQgPSBTSEEzX1JPVExbdF07XG4gICAgICAgICAgICBjb25zdCBUaCA9IHJvdGxIKGN1ckgsIGN1ckwsIHNoaWZ0KTtcbiAgICAgICAgICAgIGNvbnN0IFRsID0gcm90bEwoY3VySCwgY3VyTCwgc2hpZnQpO1xuICAgICAgICAgICAgY29uc3QgUEkgPSBTSEEzX1BJW3RdO1xuICAgICAgICAgICAgY3VySCA9IHNbUEldO1xuICAgICAgICAgICAgY3VyTCA9IHNbUEkgKyAxXTtcbiAgICAgICAgICAgIHNbUEldID0gVGg7XG4gICAgICAgICAgICBzW1BJICsgMV0gPSBUbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBDaGkgKM+HKVxuICAgICAgICBmb3IgKGxldCB5ID0gMDsgeSA8IDUwOyB5ICs9IDEwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IDEwOyB4KyspXG4gICAgICAgICAgICAgICAgQlt4XSA9IHNbeSArIHhdO1xuICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCAxMDsgeCsrKVxuICAgICAgICAgICAgICAgIHNbeSArIHhdIF49IH5CWyh4ICsgMikgJSAxMF0gJiBCWyh4ICsgNCkgJSAxMF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW90YSAozrkpXG4gICAgICAgIHNbMF0gXj0gU0hBM19JT1RBX0hbcm91bmRdO1xuICAgICAgICBzWzFdIF49IFNIQTNfSU9UQV9MW3JvdW5kXTtcbiAgICB9XG4gICAgY2xlYW4oQik7XG59XG4vKiogS2VjY2FrIHNwb25nZSBmdW5jdGlvbi4gKi9cbmV4cG9ydCBjbGFzcyBLZWNjYWsgZXh0ZW5kcyBIYXNoIHtcbiAgICAvLyBOT1RFOiB3ZSBhY2NlcHQgYXJndW1lbnRzIGluIGJ5dGVzIGluc3RlYWQgb2YgYml0cyBoZXJlLlxuICAgIGNvbnN0cnVjdG9yKGJsb2NrTGVuLCBzdWZmaXgsIG91dHB1dExlbiwgZW5hYmxlWE9GID0gZmFsc2UsIHJvdW5kcyA9IDI0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMucG9zID0gMDtcbiAgICAgICAgdGhpcy5wb3NPdXQgPSAwO1xuICAgICAgICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZW5hYmxlWE9GID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYmxvY2tMZW4gPSBibG9ja0xlbjtcbiAgICAgICAgdGhpcy5zdWZmaXggPSBzdWZmaXg7XG4gICAgICAgIHRoaXMub3V0cHV0TGVuID0gb3V0cHV0TGVuO1xuICAgICAgICB0aGlzLmVuYWJsZVhPRiA9IGVuYWJsZVhPRjtcbiAgICAgICAgdGhpcy5yb3VuZHMgPSByb3VuZHM7XG4gICAgICAgIC8vIENhbiBiZSBwYXNzZWQgZnJvbSB1c2VyIGFzIGRrTGVuXG4gICAgICAgIGFudW1iZXIob3V0cHV0TGVuKTtcbiAgICAgICAgLy8gMTYwMCA9IDV4NSBtYXRyaXggb2YgNjRiaXQuICAxNjAwIGJpdHMgPT09IDIwMCBieXRlc1xuICAgICAgICAvLyAwIDwgYmxvY2tMZW4gPCAyMDBcbiAgICAgICAgaWYgKCEoMCA8IGJsb2NrTGVuICYmIGJsb2NrTGVuIDwgMjAwKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignb25seSBrZWNjYWstZjE2MDAgZnVuY3Rpb24gaXMgc3VwcG9ydGVkJyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgVWludDhBcnJheSgyMDApO1xuICAgICAgICB0aGlzLnN0YXRlMzIgPSB1MzIodGhpcy5zdGF0ZSk7XG4gICAgfVxuICAgIGNsb25lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2xvbmVJbnRvKCk7XG4gICAgfVxuICAgIGtlY2NhaygpIHtcbiAgICAgICAgc3dhcDMySWZCRSh0aGlzLnN0YXRlMzIpO1xuICAgICAgICBrZWNjYWtQKHRoaXMuc3RhdGUzMiwgdGhpcy5yb3VuZHMpO1xuICAgICAgICBzd2FwMzJJZkJFKHRoaXMuc3RhdGUzMik7XG4gICAgICAgIHRoaXMucG9zT3V0ID0gMDtcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgIH1cbiAgICB1cGRhdGUoZGF0YSkge1xuICAgICAgICBhZXhpc3RzKHRoaXMpO1xuICAgICAgICBkYXRhID0gdG9CeXRlcyhkYXRhKTtcbiAgICAgICAgYWJ5dGVzKGRhdGEpO1xuICAgICAgICBjb25zdCB7IGJsb2NrTGVuLCBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgY29uc3QgbGVuID0gZGF0YS5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IHBvcyA9IDA7IHBvcyA8IGxlbjspIHtcbiAgICAgICAgICAgIGNvbnN0IHRha2UgPSBNYXRoLm1pbihibG9ja0xlbiAtIHRoaXMucG9zLCBsZW4gLSBwb3MpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWtlOyBpKyspXG4gICAgICAgICAgICAgICAgc3RhdGVbdGhpcy5wb3MrK10gXj0gZGF0YVtwb3MrK107XG4gICAgICAgICAgICBpZiAodGhpcy5wb3MgPT09IGJsb2NrTGVuKVxuICAgICAgICAgICAgICAgIHRoaXMua2VjY2FrKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGZpbmlzaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuZmluaXNoZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCB7IHN0YXRlLCBzdWZmaXgsIHBvcywgYmxvY2tMZW4gfSA9IHRoaXM7XG4gICAgICAgIC8vIERvIHRoZSBwYWRkaW5nXG4gICAgICAgIHN0YXRlW3Bvc10gXj0gc3VmZml4O1xuICAgICAgICBpZiAoKHN1ZmZpeCAmIDB4ODApICE9PSAwICYmIHBvcyA9PT0gYmxvY2tMZW4gLSAxKVxuICAgICAgICAgICAgdGhpcy5rZWNjYWsoKTtcbiAgICAgICAgc3RhdGVbYmxvY2tMZW4gLSAxXSBePSAweDgwO1xuICAgICAgICB0aGlzLmtlY2NhaygpO1xuICAgIH1cbiAgICB3cml0ZUludG8ob3V0KSB7XG4gICAgICAgIGFleGlzdHModGhpcywgZmFsc2UpO1xuICAgICAgICBhYnl0ZXMob3V0KTtcbiAgICAgICAgdGhpcy5maW5pc2goKTtcbiAgICAgICAgY29uc3QgYnVmZmVyT3V0ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgY29uc3QgeyBibG9ja0xlbiB9ID0gdGhpcztcbiAgICAgICAgZm9yIChsZXQgcG9zID0gMCwgbGVuID0gb3V0Lmxlbmd0aDsgcG9zIDwgbGVuOykge1xuICAgICAgICAgICAgaWYgKHRoaXMucG9zT3V0ID49IGJsb2NrTGVuKVxuICAgICAgICAgICAgICAgIHRoaXMua2VjY2FrKCk7XG4gICAgICAgICAgICBjb25zdCB0YWtlID0gTWF0aC5taW4oYmxvY2tMZW4gLSB0aGlzLnBvc091dCwgbGVuIC0gcG9zKTtcbiAgICAgICAgICAgIG91dC5zZXQoYnVmZmVyT3V0LnN1YmFycmF5KHRoaXMucG9zT3V0LCB0aGlzLnBvc091dCArIHRha2UpLCBwb3MpO1xuICAgICAgICAgICAgdGhpcy5wb3NPdXQgKz0gdGFrZTtcbiAgICAgICAgICAgIHBvcyArPSB0YWtlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuICAgIHhvZkludG8ob3V0KSB7XG4gICAgICAgIC8vIFNoYTMvS2VjY2FrIHVzYWdlIHdpdGggWE9GIGlzIHByb2JhYmx5IG1pc3Rha2UsIG9ubHkgU0hBS0UgaW5zdGFuY2VzIGNhbiBkbyBYT0ZcbiAgICAgICAgaWYgKCF0aGlzLmVuYWJsZVhPRilcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWE9GIGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhpcyBpbnN0YW5jZScpO1xuICAgICAgICByZXR1cm4gdGhpcy53cml0ZUludG8ob3V0KTtcbiAgICB9XG4gICAgeG9mKGJ5dGVzKSB7XG4gICAgICAgIGFudW1iZXIoYnl0ZXMpO1xuICAgICAgICByZXR1cm4gdGhpcy54b2ZJbnRvKG5ldyBVaW50OEFycmF5KGJ5dGVzKSk7XG4gICAgfVxuICAgIGRpZ2VzdEludG8ob3V0KSB7XG4gICAgICAgIGFvdXRwdXQob3V0LCB0aGlzKTtcbiAgICAgICAgaWYgKHRoaXMuZmluaXNoZWQpXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RpZ2VzdCgpIHdhcyBhbHJlYWR5IGNhbGxlZCcpO1xuICAgICAgICB0aGlzLndyaXRlSW50byhvdXQpO1xuICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG4gICAgZGlnZXN0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaWdlc3RJbnRvKG5ldyBVaW50OEFycmF5KHRoaXMub3V0cHV0TGVuKSk7XG4gICAgfVxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZGVzdHJveWVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYW4odGhpcy5zdGF0ZSk7XG4gICAgfVxuICAgIF9jbG9uZUludG8odG8pIHtcbiAgICAgICAgY29uc3QgeyBibG9ja0xlbiwgc3VmZml4LCBvdXRwdXRMZW4sIHJvdW5kcywgZW5hYmxlWE9GIH0gPSB0aGlzO1xuICAgICAgICB0byB8fCAodG8gPSBuZXcgS2VjY2FrKGJsb2NrTGVuLCBzdWZmaXgsIG91dHB1dExlbiwgZW5hYmxlWE9GLCByb3VuZHMpKTtcbiAgICAgICAgdG8uc3RhdGUzMi5zZXQodGhpcy5zdGF0ZTMyKTtcbiAgICAgICAgdG8ucG9zID0gdGhpcy5wb3M7XG4gICAgICAgIHRvLnBvc091dCA9IHRoaXMucG9zT3V0O1xuICAgICAgICB0by5maW5pc2hlZCA9IHRoaXMuZmluaXNoZWQ7XG4gICAgICAgIHRvLnJvdW5kcyA9IHJvdW5kcztcbiAgICAgICAgLy8gU3VmZml4IGNhbiBjaGFuZ2UgaW4gY1NIQUtFXG4gICAgICAgIHRvLnN1ZmZpeCA9IHN1ZmZpeDtcbiAgICAgICAgdG8ub3V0cHV0TGVuID0gb3V0cHV0TGVuO1xuICAgICAgICB0by5lbmFibGVYT0YgPSBlbmFibGVYT0Y7XG4gICAgICAgIHRvLmRlc3Ryb3llZCA9IHRoaXMuZGVzdHJveWVkO1xuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxufVxuY29uc3QgZ2VuID0gKHN1ZmZpeCwgYmxvY2tMZW4sIG91dHB1dExlbikgPT4gY3JlYXRlSGFzaGVyKCgpID0+IG5ldyBLZWNjYWsoYmxvY2tMZW4sIHN1ZmZpeCwgb3V0cHV0TGVuKSk7XG4vKiogU0hBMy0yMjQgaGFzaCBmdW5jdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBzaGEzXzIyNCA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gZ2VuKDB4MDYsIDE0NCwgMjI0IC8gOCkpKCk7XG4vKiogU0hBMy0yNTYgaGFzaCBmdW5jdGlvbi4gRGlmZmVyZW50IGZyb20ga2VjY2FrLTI1Ni4gKi9cbmV4cG9ydCBjb25zdCBzaGEzXzI1NiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gZ2VuKDB4MDYsIDEzNiwgMjU2IC8gOCkpKCk7XG4vKiogU0hBMy0zODQgaGFzaCBmdW5jdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBzaGEzXzM4NCA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gZ2VuKDB4MDYsIDEwNCwgMzg0IC8gOCkpKCk7XG4vKiogU0hBMy01MTIgaGFzaCBmdW5jdGlvbi4gKi9cbmV4cG9ydCBjb25zdCBzaGEzXzUxMiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gZ2VuKDB4MDYsIDcyLCA1MTIgLyA4KSkoKTtcbi8qKiBrZWNjYWstMjI0IGhhc2ggZnVuY3Rpb24uICovXG5leHBvcnQgY29uc3Qga2VjY2FrXzIyNCA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gZ2VuKDB4MDEsIDE0NCwgMjI0IC8gOCkpKCk7XG4vKioga2VjY2FrLTI1NiBoYXNoIGZ1bmN0aW9uLiBEaWZmZXJlbnQgZnJvbSBTSEEzLTI1Ni4gKi9cbmV4cG9ydCBjb25zdCBrZWNjYWtfMjU2ID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBnZW4oMHgwMSwgMTM2LCAyNTYgLyA4KSkoKTtcbi8qKiBrZWNjYWstMzg0IGhhc2ggZnVuY3Rpb24uICovXG5leHBvcnQgY29uc3Qga2VjY2FrXzM4NCA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gZ2VuKDB4MDEsIDEwNCwgMzg0IC8gOCkpKCk7XG4vKioga2VjY2FrLTUxMiBoYXNoIGZ1bmN0aW9uLiAqL1xuZXhwb3J0IGNvbnN0IGtlY2Nha181MTIgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IGdlbigweDAxLCA3MiwgNTEyIC8gOCkpKCk7XG5jb25zdCBnZW5TaGFrZSA9IChzdWZmaXgsIGJsb2NrTGVuLCBvdXRwdXRMZW4pID0+IGNyZWF0ZVhPRmVyKChvcHRzID0ge30pID0+IG5ldyBLZWNjYWsoYmxvY2tMZW4sIHN1ZmZpeCwgb3B0cy5ka0xlbiA9PT0gdW5kZWZpbmVkID8gb3V0cHV0TGVuIDogb3B0cy5ka0xlbiwgdHJ1ZSkpO1xuLyoqIFNIQUtFMTI4IFhPRiB3aXRoIDEyOC1iaXQgc2VjdXJpdHkuICovXG5leHBvcnQgY29uc3Qgc2hha2UxMjggPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IGdlblNoYWtlKDB4MWYsIDE2OCwgMTI4IC8gOCkpKCk7XG4vKiogU0hBS0UyNTYgWE9GIHdpdGggMjU2LWJpdCBzZWN1cml0eS4gKi9cbmV4cG9ydCBjb25zdCBzaGFrZTI1NiA9IC8qIEBfX1BVUkVfXyAqLyAoKCkgPT4gZ2VuU2hha2UoMHgxZiwgMTM2LCAyNTYgLyA4KSkoKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNoYTMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/hashes/esm/sha3.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js":
/*!*************************************************!*\
  !*** ./node_modules/@noble/hashes/esm/utils.js ***!
  \*************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Hash: () => (/* binding */ Hash),\n/* harmony export */   abytes: () => (/* binding */ abytes),\n/* harmony export */   aexists: () => (/* binding */ aexists),\n/* harmony export */   ahash: () => (/* binding */ ahash),\n/* harmony export */   anumber: () => (/* binding */ anumber),\n/* harmony export */   aoutput: () => (/* binding */ aoutput),\n/* harmony export */   asyncLoop: () => (/* binding */ asyncLoop),\n/* harmony export */   byteSwap: () => (/* binding */ byteSwap),\n/* harmony export */   byteSwap32: () => (/* binding */ byteSwap32),\n/* harmony export */   byteSwapIfBE: () => (/* binding */ byteSwapIfBE),\n/* harmony export */   bytesToHex: () => (/* binding */ bytesToHex),\n/* harmony export */   bytesToUtf8: () => (/* binding */ bytesToUtf8),\n/* harmony export */   checkOpts: () => (/* binding */ checkOpts),\n/* harmony export */   clean: () => (/* binding */ clean),\n/* harmony export */   concatBytes: () => (/* binding */ concatBytes),\n/* harmony export */   createHasher: () => (/* binding */ createHasher),\n/* harmony export */   createOptHasher: () => (/* binding */ createOptHasher),\n/* harmony export */   createView: () => (/* binding */ createView),\n/* harmony export */   createXOFer: () => (/* binding */ createXOFer),\n/* harmony export */   hexToBytes: () => (/* binding */ hexToBytes),\n/* harmony export */   isBytes: () => (/* binding */ isBytes),\n/* harmony export */   isLE: () => (/* binding */ isLE),\n/* harmony export */   kdfInputToBytes: () => (/* binding */ kdfInputToBytes),\n/* harmony export */   nextTick: () => (/* binding */ nextTick),\n/* harmony export */   randomBytes: () => (/* binding */ randomBytes),\n/* harmony export */   rotl: () => (/* binding */ rotl),\n/* harmony export */   rotr: () => (/* binding */ rotr),\n/* harmony export */   swap32IfBE: () => (/* binding */ swap32IfBE),\n/* harmony export */   swap8IfBE: () => (/* binding */ swap8IfBE),\n/* harmony export */   toBytes: () => (/* binding */ toBytes),\n/* harmony export */   u32: () => (/* binding */ u32),\n/* harmony export */   u8: () => (/* binding */ u8),\n/* harmony export */   utf8ToBytes: () => (/* binding */ utf8ToBytes),\n/* harmony export */   wrapConstructor: () => (/* binding */ wrapConstructor),\n/* harmony export */   wrapConstructorWithOpts: () => (/* binding */ wrapConstructorWithOpts),\n/* harmony export */   wrapXOFConstructorWithOpts: () => (/* binding */ wrapXOFConstructorWithOpts)\n/* harmony export */ });\n/* harmony import */ var _noble_hashes_crypto__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @noble/hashes/crypto */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/crypto.js\");\n/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nfunction isBytes(a) {\n    return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is positive integer. */\nfunction anumber(n) {\n    if (!Number.isSafeInteger(n) || n < 0)\n        throw new Error('positive integer expected, got ' + n);\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b, ...lengths) {\n    if (!isBytes(b))\n        throw new Error('Uint8Array expected');\n    if (lengths.length > 0 && !lengths.includes(b.length))\n        throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n/** Asserts something is hash */\nfunction ahash(h) {\n    if (typeof h !== 'function' || typeof h.create !== 'function')\n        throw new Error('Hash should be wrapped by utils.createHasher');\n    anumber(h.outputLen);\n    anumber(h.blockLen);\n}\n/** Asserts a hash instance has not been destroyed / finished */\nfunction aexists(instance, checkFinished = true) {\n    if (instance.destroyed)\n        throw new Error('Hash instance has been destroyed');\n    if (checkFinished && instance.finished)\n        throw new Error('Hash#digest() has already been called');\n}\n/** Asserts output is properly-sized byte array */\nfunction aoutput(out, instance) {\n    abytes(out);\n    const min = instance.outputLen;\n    if (out.length < min) {\n        throw new Error('digestInto() expects output buffer of length at least ' + min);\n    }\n}\n/** Cast u8 / u16 / u32 to u8. */\nfunction u8(arr) {\n    return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** Cast u8 / u16 / u32 to u32. */\nfunction u32(arr) {\n    return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nfunction clean(...arrays) {\n    for (let i = 0; i < arrays.length; i++) {\n        arrays[i].fill(0);\n    }\n}\n/** Create DataView of an array for easy byte-level manipulation. */\nfunction createView(arr) {\n    return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n/** The rotate right (circular right shift) operation for uint32 */\nfunction rotr(word, shift) {\n    return (word << (32 - shift)) | (word >>> shift);\n}\n/** The rotate left (circular left shift) operation for uint32 */\nfunction rotl(word, shift) {\n    return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nconst isLE = /* @__PURE__ */ (() => new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n/** The byte swap operation for uint32 */\nfunction byteSwap(word) {\n    return (((word << 24) & 0xff000000) |\n        ((word << 8) & 0xff0000) |\n        ((word >>> 8) & 0xff00) |\n        ((word >>> 24) & 0xff));\n}\n/** Conditionally byte swap if on a big-endian platform */\nconst swap8IfBE = isLE\n    ? (n) => n\n    : (n) => byteSwap(n);\n/** @deprecated */\nconst byteSwapIfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nfunction byteSwap32(arr) {\n    for (let i = 0; i < arr.length; i++) {\n        arr[i] = byteSwap(arr[i]);\n    }\n    return arr;\n}\nconst swap32IfBE = isLE\n    ? (u) => u\n    : byteSwap32;\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin = /* @__PURE__ */ (() => \n// @ts-ignore\ntypeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) => i.toString(16).padStart(2, '0'));\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nfunction bytesToHex(bytes) {\n    abytes(bytes);\n    // @ts-ignore\n    if (hasHexBuiltin)\n        return bytes.toHex();\n    // pre-caching improves the speed 6x\n    let hex = '';\n    for (let i = 0; i < bytes.length; i++) {\n        hex += hexes[bytes[i]];\n    }\n    return hex;\n}\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 };\nfunction asciiToBase16(ch) {\n    if (ch >= asciis._0 && ch <= asciis._9)\n        return ch - asciis._0; // '2' => 50-48\n    if (ch >= asciis.A && ch <= asciis.F)\n        return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n    if (ch >= asciis.a && ch <= asciis.f)\n        return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n    return;\n}\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nfunction hexToBytes(hex) {\n    if (typeof hex !== 'string')\n        throw new Error('hex string expected, got ' + typeof hex);\n    // @ts-ignore\n    if (hasHexBuiltin)\n        return Uint8Array.fromHex(hex);\n    const hl = hex.length;\n    const al = hl / 2;\n    if (hl % 2)\n        throw new Error('hex string expected, got unpadded hex of length ' + hl);\n    const array = new Uint8Array(al);\n    for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n        const n1 = asciiToBase16(hex.charCodeAt(hi));\n        const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n        if (n1 === undefined || n2 === undefined) {\n            const char = hex[hi] + hex[hi + 1];\n            throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n        }\n        array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n    }\n    return array;\n}\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nconst nextTick = async () => { };\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nasync function asyncLoop(iters, tick, cb) {\n    let ts = Date.now();\n    for (let i = 0; i < iters; i++) {\n        cb(i);\n        // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n        const diff = Date.now() - ts;\n        if (diff >= 0 && diff < tick)\n            continue;\n        await nextTick();\n        ts += diff;\n    }\n}\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nfunction utf8ToBytes(str) {\n    if (typeof str !== 'string')\n        throw new Error('string expected');\n    return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nfunction bytesToUtf8(bytes) {\n    return new TextDecoder().decode(bytes);\n}\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nfunction toBytes(data) {\n    if (typeof data === 'string')\n        data = utf8ToBytes(data);\n    abytes(data);\n    return data;\n}\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nfunction kdfInputToBytes(data) {\n    if (typeof data === 'string')\n        data = utf8ToBytes(data);\n    abytes(data);\n    return data;\n}\n/** Copies several Uint8Arrays into one. */\nfunction concatBytes(...arrays) {\n    let sum = 0;\n    for (let i = 0; i < arrays.length; i++) {\n        const a = arrays[i];\n        abytes(a);\n        sum += a.length;\n    }\n    const res = new Uint8Array(sum);\n    for (let i = 0, pad = 0; i < arrays.length; i++) {\n        const a = arrays[i];\n        res.set(a, pad);\n        pad += a.length;\n    }\n    return res;\n}\nfunction checkOpts(defaults, opts) {\n    if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n        throw new Error('options should be object or undefined');\n    const merged = Object.assign(defaults, opts);\n    return merged;\n}\n/** For runtime check if class implements interface */\nclass Hash {\n}\n/** Wraps hash function, creating an interface on top of it */\nfunction createHasher(hashCons) {\n    const hashC = (msg) => hashCons().update(toBytes(msg)).digest();\n    const tmp = hashCons();\n    hashC.outputLen = tmp.outputLen;\n    hashC.blockLen = tmp.blockLen;\n    hashC.create = () => hashCons();\n    return hashC;\n}\nfunction createOptHasher(hashCons) {\n    const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n    const tmp = hashCons({});\n    hashC.outputLen = tmp.outputLen;\n    hashC.blockLen = tmp.blockLen;\n    hashC.create = (opts) => hashCons(opts);\n    return hashC;\n}\nfunction createXOFer(hashCons) {\n    const hashC = (msg, opts) => hashCons(opts).update(toBytes(msg)).digest();\n    const tmp = hashCons({});\n    hashC.outputLen = tmp.outputLen;\n    hashC.blockLen = tmp.blockLen;\n    hashC.create = (opts) => hashCons(opts);\n    return hashC;\n}\nconst wrapConstructor = createHasher;\nconst wrapConstructorWithOpts = createOptHasher;\nconst wrapXOFConstructorWithOpts = createXOFer;\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nfunction randomBytes(bytesLength = 32) {\n    if (_noble_hashes_crypto__WEBPACK_IMPORTED_MODULE_0__.crypto && typeof _noble_hashes_crypto__WEBPACK_IMPORTED_MODULE_0__.crypto.getRandomValues === 'function') {\n        return _noble_hashes_crypto__WEBPACK_IMPORTED_MODULE_0__.crypto.getRandomValues(new Uint8Array(bytesLength));\n    }\n    // Legacy Node.js compatibility\n    if (_noble_hashes_crypto__WEBPACK_IMPORTED_MODULE_0__.crypto && typeof _noble_hashes_crypto__WEBPACK_IMPORTED_MODULE_0__.crypto.randomBytes === 'function') {\n        return Uint8Array.from(_noble_hashes_crypto__WEBPACK_IMPORTED_MODULE_0__.crypto.randomBytes(bytesLength));\n    }\n    throw new Error('crypto.getRandomValues must be defined');\n}\n//# sourceMappingURL=utils.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Abm9ibGUvaGFzaGVzL2VzbS91dGlscy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUM4QztBQUM5QztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUCxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUCxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxhQUFhO0FBQ3hEO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isa0JBQWtCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLCtCQUErQjtBQUMvQjtBQUNBLHFDQUFxQztBQUNyQztBQUNBLHFDQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFNBQVM7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ087QUFDUDtBQUNBLG9CQUFvQixXQUFXO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EsMERBQTBEO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQSxvQkFBb0IsbUJBQW1CO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsbUJBQW1CO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDQTtBQUNBO0FBQ1A7QUFDTztBQUNQLFFBQVEsd0RBQU0sV0FBVyx3REFBTTtBQUMvQixlQUFlLHdEQUFNO0FBQ3JCO0FBQ0E7QUFDQSxRQUFRLHdEQUFNLFdBQVcsd0RBQU07QUFDL0IsK0JBQStCLHdEQUFNO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0Bub2JsZS9oYXNoZXMvZXNtL3V0aWxzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVXRpbGl0aWVzIGZvciBoZXgsIGJ5dGVzLCBDU1BSTkcuXG4gKiBAbW9kdWxlXG4gKi9cbi8qISBub2JsZS1oYXNoZXMgLSBNSVQgTGljZW5zZSAoYykgMjAyMiBQYXVsIE1pbGxlciAocGF1bG1pbGxyLmNvbSkgKi9cbi8vIFdlIHVzZSBXZWJDcnlwdG8gYWthIGdsb2JhbFRoaXMuY3J5cHRvLCB3aGljaCBleGlzdHMgaW4gYnJvd3NlcnMgYW5kIG5vZGUuanMgMTYrLlxuLy8gbm9kZS5qcyB2ZXJzaW9ucyBlYXJsaWVyIHRoYW4gdjE5IGRvbid0IGRlY2xhcmUgaXQgaW4gZ2xvYmFsIHNjb3BlLlxuLy8gRm9yIG5vZGUuanMsIHBhY2thZ2UuanNvbiNleHBvcnRzIGZpZWxkIG1hcHBpbmcgcmV3cml0ZXMgaW1wb3J0XG4vLyBmcm9tIGBjcnlwdG9gIHRvIGBjcnlwdG9Ob2RlYCwgd2hpY2ggaW1wb3J0cyBuYXRpdmUgbW9kdWxlLlxuLy8gTWFrZXMgdGhlIHV0aWxzIHVuLWltcG9ydGFibGUgaW4gYnJvd3NlcnMgd2l0aG91dCBhIGJ1bmRsZXIuXG4vLyBPbmNlIG5vZGUuanMgMTggaXMgZGVwcmVjYXRlZCAoMjAyNS0wNC0zMCksIHdlIGNhbiBqdXN0IGRyb3AgdGhlIGltcG9ydC5cbmltcG9ydCB7IGNyeXB0byB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvY3J5cHRvJztcbi8qKiBDaGVja3MgaWYgc29tZXRoaW5nIGlzIFVpbnQ4QXJyYXkuIEJlIGNhcmVmdWw6IG5vZGVqcyBCdWZmZXIgd2lsbCByZXR1cm4gdHJ1ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0J5dGVzKGEpIHtcbiAgICByZXR1cm4gYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgKEFycmF5QnVmZmVyLmlzVmlldyhhKSAmJiBhLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdVaW50OEFycmF5Jyk7XG59XG4vKiogQXNzZXJ0cyBzb21ldGhpbmcgaXMgcG9zaXRpdmUgaW50ZWdlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbnVtYmVyKG4pIHtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKG4pIHx8IG4gPCAwKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Bvc2l0aXZlIGludGVnZXIgZXhwZWN0ZWQsIGdvdCAnICsgbik7XG59XG4vKiogQXNzZXJ0cyBzb21ldGhpbmcgaXMgVWludDhBcnJheS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhYnl0ZXMoYiwgLi4ubGVuZ3Rocykge1xuICAgIGlmICghaXNCeXRlcyhiKSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVaW50OEFycmF5IGV4cGVjdGVkJyk7XG4gICAgaWYgKGxlbmd0aHMubGVuZ3RoID4gMCAmJiAhbGVuZ3Rocy5pbmNsdWRlcyhiLmxlbmd0aCkpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVWludDhBcnJheSBleHBlY3RlZCBvZiBsZW5ndGggJyArIGxlbmd0aHMgKyAnLCBnb3QgbGVuZ3RoPScgKyBiLmxlbmd0aCk7XG59XG4vKiogQXNzZXJ0cyBzb21ldGhpbmcgaXMgaGFzaCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFoYXNoKGgpIHtcbiAgICBpZiAodHlwZW9mIGggIT09ICdmdW5jdGlvbicgfHwgdHlwZW9mIGguY3JlYXRlICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0hhc2ggc2hvdWxkIGJlIHdyYXBwZWQgYnkgdXRpbHMuY3JlYXRlSGFzaGVyJyk7XG4gICAgYW51bWJlcihoLm91dHB1dExlbik7XG4gICAgYW51bWJlcihoLmJsb2NrTGVuKTtcbn1cbi8qKiBBc3NlcnRzIGEgaGFzaCBpbnN0YW5jZSBoYXMgbm90IGJlZW4gZGVzdHJveWVkIC8gZmluaXNoZWQgKi9cbmV4cG9ydCBmdW5jdGlvbiBhZXhpc3RzKGluc3RhbmNlLCBjaGVja0ZpbmlzaGVkID0gdHJ1ZSkge1xuICAgIGlmIChpbnN0YW5jZS5kZXN0cm95ZWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSGFzaCBpbnN0YW5jZSBoYXMgYmVlbiBkZXN0cm95ZWQnKTtcbiAgICBpZiAoY2hlY2tGaW5pc2hlZCAmJiBpbnN0YW5jZS5maW5pc2hlZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdIYXNoI2RpZ2VzdCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkJyk7XG59XG4vKiogQXNzZXJ0cyBvdXRwdXQgaXMgcHJvcGVybHktc2l6ZWQgYnl0ZSBhcnJheSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFvdXRwdXQob3V0LCBpbnN0YW5jZSkge1xuICAgIGFieXRlcyhvdXQpO1xuICAgIGNvbnN0IG1pbiA9IGluc3RhbmNlLm91dHB1dExlbjtcbiAgICBpZiAob3V0Lmxlbmd0aCA8IG1pbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RpZ2VzdEludG8oKSBleHBlY3RzIG91dHB1dCBidWZmZXIgb2YgbGVuZ3RoIGF0IGxlYXN0ICcgKyBtaW4pO1xuICAgIH1cbn1cbi8qKiBDYXN0IHU4IC8gdTE2IC8gdTMyIHRvIHU4LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHU4KGFycikge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShhcnIuYnVmZmVyLCBhcnIuYnl0ZU9mZnNldCwgYXJyLmJ5dGVMZW5ndGgpO1xufVxuLyoqIENhc3QgdTggLyB1MTYgLyB1MzIgdG8gdTMyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHUzMihhcnIpIHtcbiAgICByZXR1cm4gbmV3IFVpbnQzMkFycmF5KGFyci5idWZmZXIsIGFyci5ieXRlT2Zmc2V0LCBNYXRoLmZsb29yKGFyci5ieXRlTGVuZ3RoIC8gNCkpO1xufVxuLyoqIFplcm9pemUgYSBieXRlIGFycmF5LiBXYXJuaW5nOiBKUyBwcm92aWRlcyBubyBndWFyYW50ZWVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuKC4uLmFycmF5cykge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFycmF5c1tpXS5maWxsKDApO1xuICAgIH1cbn1cbi8qKiBDcmVhdGUgRGF0YVZpZXcgb2YgYW4gYXJyYXkgZm9yIGVhc3kgYnl0ZS1sZXZlbCBtYW5pcHVsYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVmlldyhhcnIpIHtcbiAgICByZXR1cm4gbmV3IERhdGFWaWV3KGFyci5idWZmZXIsIGFyci5ieXRlT2Zmc2V0LCBhcnIuYnl0ZUxlbmd0aCk7XG59XG4vKiogVGhlIHJvdGF0ZSByaWdodCAoY2lyY3VsYXIgcmlnaHQgc2hpZnQpIG9wZXJhdGlvbiBmb3IgdWludDMyICovXG5leHBvcnQgZnVuY3Rpb24gcm90cih3b3JkLCBzaGlmdCkge1xuICAgIHJldHVybiAod29yZCA8PCAoMzIgLSBzaGlmdCkpIHwgKHdvcmQgPj4+IHNoaWZ0KTtcbn1cbi8qKiBUaGUgcm90YXRlIGxlZnQgKGNpcmN1bGFyIGxlZnQgc2hpZnQpIG9wZXJhdGlvbiBmb3IgdWludDMyICovXG5leHBvcnQgZnVuY3Rpb24gcm90bCh3b3JkLCBzaGlmdCkge1xuICAgIHJldHVybiAod29yZCA8PCBzaGlmdCkgfCAoKHdvcmQgPj4+ICgzMiAtIHNoaWZ0KSkgPj4+IDApO1xufVxuLyoqIElzIGN1cnJlbnQgcGxhdGZvcm0gbGl0dGxlLWVuZGlhbj8gTW9zdCBhcmUuIEJpZy1FbmRpYW4gcGxhdGZvcm06IElCTSAqL1xuZXhwb3J0IGNvbnN0IGlzTEUgPSAvKiBAX19QVVJFX18gKi8gKCgpID0+IG5ldyBVaW50OEFycmF5KG5ldyBVaW50MzJBcnJheShbMHgxMTIyMzM0NF0pLmJ1ZmZlcilbMF0gPT09IDB4NDQpKCk7XG4vKiogVGhlIGJ5dGUgc3dhcCBvcGVyYXRpb24gZm9yIHVpbnQzMiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVTd2FwKHdvcmQpIHtcbiAgICByZXR1cm4gKCgod29yZCA8PCAyNCkgJiAweGZmMDAwMDAwKSB8XG4gICAgICAgICgod29yZCA8PCA4KSAmIDB4ZmYwMDAwKSB8XG4gICAgICAgICgod29yZCA+Pj4gOCkgJiAweGZmMDApIHxcbiAgICAgICAgKCh3b3JkID4+PiAyNCkgJiAweGZmKSk7XG59XG4vKiogQ29uZGl0aW9uYWxseSBieXRlIHN3YXAgaWYgb24gYSBiaWctZW5kaWFuIHBsYXRmb3JtICovXG5leHBvcnQgY29uc3Qgc3dhcDhJZkJFID0gaXNMRVxuICAgID8gKG4pID0+IG5cbiAgICA6IChuKSA9PiBieXRlU3dhcChuKTtcbi8qKiBAZGVwcmVjYXRlZCAqL1xuZXhwb3J0IGNvbnN0IGJ5dGVTd2FwSWZCRSA9IHN3YXA4SWZCRTtcbi8qKiBJbiBwbGFjZSBieXRlIHN3YXAgZm9yIFVpbnQzMkFycmF5ICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZVN3YXAzMihhcnIpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICBhcnJbaV0gPSBieXRlU3dhcChhcnJbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xufVxuZXhwb3J0IGNvbnN0IHN3YXAzMklmQkUgPSBpc0xFXG4gICAgPyAodSkgPT4gdVxuICAgIDogYnl0ZVN3YXAzMjtcbi8vIEJ1aWx0LWluIGhleCBjb252ZXJzaW9uIGh0dHBzOi8vY2FuaXVzZS5jb20vbWRuLWphdmFzY3JpcHRfYnVpbHRpbnNfdWludDhhcnJheV9mcm9taGV4XG5jb25zdCBoYXNIZXhCdWlsdGluID0gLyogQF9fUFVSRV9fICovICgoKSA9PiBcbi8vIEB0cy1pZ25vcmVcbnR5cGVvZiBVaW50OEFycmF5LmZyb20oW10pLnRvSGV4ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBVaW50OEFycmF5LmZyb21IZXggPT09ICdmdW5jdGlvbicpKCk7XG4vLyBBcnJheSB3aGVyZSBpbmRleCAweGYwICgyNDApIGlzIG1hcHBlZCB0byBzdHJpbmcgJ2YwJ1xuY29uc3QgaGV4ZXMgPSAvKiBAX19QVVJFX18gKi8gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjU2IH0sIChfLCBpKSA9PiBpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKTtcbi8qKlxuICogQ29udmVydCBieXRlIGFycmF5IHRvIGhleCBzdHJpbmcuIFVzZXMgYnVpbHQtaW4gZnVuY3Rpb24sIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4YW1wbGUgYnl0ZXNUb0hleChVaW50OEFycmF5LmZyb20oWzB4Y2EsIDB4ZmUsIDB4MDEsIDB4MjNdKSkgLy8gJ2NhZmUwMTIzJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNUb0hleChieXRlcykge1xuICAgIGFieXRlcyhieXRlcyk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmIChoYXNIZXhCdWlsdGluKVxuICAgICAgICByZXR1cm4gYnl0ZXMudG9IZXgoKTtcbiAgICAvLyBwcmUtY2FjaGluZyBpbXByb3ZlcyB0aGUgc3BlZWQgNnhcbiAgICBsZXQgaGV4ID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBoZXggKz0gaGV4ZXNbYnl0ZXNbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gaGV4O1xufVxuLy8gV2UgdXNlIG9wdGltaXplZCB0ZWNobmlxdWUgdG8gY29udmVydCBoZXggc3RyaW5nIHRvIGJ5dGUgYXJyYXlcbmNvbnN0IGFzY2lpcyA9IHsgXzA6IDQ4LCBfOTogNTcsIEE6IDY1LCBGOiA3MCwgYTogOTcsIGY6IDEwMiB9O1xuZnVuY3Rpb24gYXNjaWlUb0Jhc2UxNihjaCkge1xuICAgIGlmIChjaCA+PSBhc2NpaXMuXzAgJiYgY2ggPD0gYXNjaWlzLl85KVxuICAgICAgICByZXR1cm4gY2ggLSBhc2NpaXMuXzA7IC8vICcyJyA9PiA1MC00OFxuICAgIGlmIChjaCA+PSBhc2NpaXMuQSAmJiBjaCA8PSBhc2NpaXMuRilcbiAgICAgICAgcmV0dXJuIGNoIC0gKGFzY2lpcy5BIC0gMTApOyAvLyAnQicgPT4gNjYtKDY1LTEwKVxuICAgIGlmIChjaCA+PSBhc2NpaXMuYSAmJiBjaCA8PSBhc2NpaXMuZilcbiAgICAgICAgcmV0dXJuIGNoIC0gKGFzY2lpcy5hIC0gMTApOyAvLyAnYicgPT4gOTgtKDk3LTEwKVxuICAgIHJldHVybjtcbn1cbi8qKlxuICogQ29udmVydCBoZXggc3RyaW5nIHRvIGJ5dGUgYXJyYXkuIFVzZXMgYnVpbHQtaW4gZnVuY3Rpb24sIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4YW1wbGUgaGV4VG9CeXRlcygnY2FmZTAxMjMnKSAvLyBVaW50OEFycmF5LmZyb20oWzB4Y2EsIDB4ZmUsIDB4MDEsIDB4MjNdKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9CeXRlcyhoZXgpIHtcbiAgICBpZiAodHlwZW9mIGhleCAhPT0gJ3N0cmluZycpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignaGV4IHN0cmluZyBleHBlY3RlZCwgZ290ICcgKyB0eXBlb2YgaGV4KTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgaWYgKGhhc0hleEJ1aWx0aW4pXG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LmZyb21IZXgoaGV4KTtcbiAgICBjb25zdCBobCA9IGhleC5sZW5ndGg7XG4gICAgY29uc3QgYWwgPSBobCAvIDI7XG4gICAgaWYgKGhsICUgMilcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdoZXggc3RyaW5nIGV4cGVjdGVkLCBnb3QgdW5wYWRkZWQgaGV4IG9mIGxlbmd0aCAnICsgaGwpO1xuICAgIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYWwpO1xuICAgIGZvciAobGV0IGFpID0gMCwgaGkgPSAwOyBhaSA8IGFsOyBhaSsrLCBoaSArPSAyKSB7XG4gICAgICAgIGNvbnN0IG4xID0gYXNjaWlUb0Jhc2UxNihoZXguY2hhckNvZGVBdChoaSkpO1xuICAgICAgICBjb25zdCBuMiA9IGFzY2lpVG9CYXNlMTYoaGV4LmNoYXJDb2RlQXQoaGkgKyAxKSk7XG4gICAgICAgIGlmIChuMSA9PT0gdW5kZWZpbmVkIHx8IG4yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNoYXIgPSBoZXhbaGldICsgaGV4W2hpICsgMV07XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hleCBzdHJpbmcgZXhwZWN0ZWQsIGdvdCBub24taGV4IGNoYXJhY3RlciBcIicgKyBjaGFyICsgJ1wiIGF0IGluZGV4ICcgKyBoaSk7XG4gICAgICAgIH1cbiAgICAgICAgYXJyYXlbYWldID0gbjEgKiAxNiArIG4yOyAvLyBtdWx0aXBseSBmaXJzdCBvY3RldCwgZS5nLiAnYTMnID0+IDEwKjE2KzMgPT4gMTYwICsgMyA9PiAxNjNcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5O1xufVxuLyoqXG4gKiBUaGVyZSBpcyBubyBzZXRJbW1lZGlhdGUgaW4gYnJvd3NlciBhbmQgc2V0VGltZW91dCBpcyBzbG93LlxuICogQ2FsbCBvZiBhc3luYyBmbiB3aWxsIHJldHVybiBQcm9taXNlLCB3aGljaCB3aWxsIGJlIGZ1bGxmaWxlZCBvbmx5IG9uXG4gKiBuZXh0IHNjaGVkdWxlciBxdWV1ZSBwcm9jZXNzaW5nIHN0ZXAgYW5kIHRoaXMgaXMgZXhhY3RseSB3aGF0IHdlIG5lZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBuZXh0VGljayA9IGFzeW5jICgpID0+IHsgfTtcbi8qKiBSZXR1cm5zIGNvbnRyb2wgdG8gdGhyZWFkIGVhY2ggJ3RpY2snIG1zIHRvIGF2b2lkIGJsb2NraW5nLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jTG9vcChpdGVycywgdGljaywgY2IpIHtcbiAgICBsZXQgdHMgPSBEYXRlLm5vdygpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlcnM7IGkrKykge1xuICAgICAgICBjYihpKTtcbiAgICAgICAgLy8gRGF0ZS5ub3coKSBpcyBub3QgbW9ub3RvbmljLCBzbyBpbiBjYXNlIGlmIGNsb2NrIGdvZXMgYmFja3dhcmRzIHdlIHJldHVybiByZXR1cm4gY29udHJvbCB0b29cbiAgICAgICAgY29uc3QgZGlmZiA9IERhdGUubm93KCkgLSB0cztcbiAgICAgICAgaWYgKGRpZmYgPj0gMCAmJiBkaWZmIDwgdGljaylcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBhd2FpdCBuZXh0VGljaygpO1xuICAgICAgICB0cyArPSBkaWZmO1xuICAgIH1cbn1cbi8qKlxuICogQ29udmVydHMgc3RyaW5nIHRvIGJ5dGVzIHVzaW5nIFVURjggZW5jb2RpbmcuXG4gKiBAZXhhbXBsZSB1dGY4VG9CeXRlcygnYWJjJykgLy8gVWludDhBcnJheS5mcm9tKFs5NywgOTgsIDk5XSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHV0ZjhUb0J5dGVzKHN0cikge1xuICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJylcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpbmcgZXhwZWN0ZWQnKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHN0cikpOyAvLyBodHRwczovL2J1Z3ppbC5sYS8xNjgxODA5XG59XG4vKipcbiAqIENvbnZlcnRzIGJ5dGVzIHRvIHN0cmluZyB1c2luZyBVVEY4IGVuY29kaW5nLlxuICogQGV4YW1wbGUgYnl0ZXNUb1V0ZjgoVWludDhBcnJheS5mcm9tKFs5NywgOTgsIDk5XSkpIC8vICdhYmMnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc1RvVXRmOChieXRlcykge1xuICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYnl0ZXMpO1xufVxuLyoqXG4gKiBOb3JtYWxpemVzIChub24taGV4KSBzdHJpbmcgb3IgVWludDhBcnJheSB0byBVaW50OEFycmF5LlxuICogV2FybmluZzogd2hlbiBVaW50OEFycmF5IGlzIHBhc3NlZCwgaXQgd291bGQgTk9UIGdldCBjb3BpZWQuXG4gKiBLZWVwIGluIG1pbmQgZm9yIGZ1dHVyZSBtdXRhYmxlIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0J5dGVzKGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKVxuICAgICAgICBkYXRhID0gdXRmOFRvQnl0ZXMoZGF0YSk7XG4gICAgYWJ5dGVzKGRhdGEpO1xuICAgIHJldHVybiBkYXRhO1xufVxuLyoqXG4gKiBIZWxwZXIgZm9yIEtERnM6IGNvbnN1bWVzIHVpbnQ4YXJyYXkgb3Igc3RyaW5nLlxuICogV2hlbiBzdHJpbmcgaXMgcGFzc2VkLCBkb2VzIHV0ZjggZGVjb2RpbmcsIHVzaW5nIFRleHREZWNvZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24ga2RmSW5wdXRUb0J5dGVzKGRhdGEpIHtcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKVxuICAgICAgICBkYXRhID0gdXRmOFRvQnl0ZXMoZGF0YSk7XG4gICAgYWJ5dGVzKGRhdGEpO1xuICAgIHJldHVybiBkYXRhO1xufVxuLyoqIENvcGllcyBzZXZlcmFsIFVpbnQ4QXJyYXlzIGludG8gb25lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdEJ5dGVzKC4uLmFycmF5cykge1xuICAgIGxldCBzdW0gPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBhcnJheXNbaV07XG4gICAgICAgIGFieXRlcyhhKTtcbiAgICAgICAgc3VtICs9IGEubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShzdW0pO1xuICAgIGZvciAobGV0IGkgPSAwLCBwYWQgPSAwOyBpIDwgYXJyYXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGEgPSBhcnJheXNbaV07XG4gICAgICAgIHJlcy5zZXQoYSwgcGFkKTtcbiAgICAgICAgcGFkICs9IGEubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gcmVzO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrT3B0cyhkZWZhdWx0cywgb3B0cykge1xuICAgIGlmIChvcHRzICE9PSB1bmRlZmluZWQgJiYge30udG9TdHJpbmcuY2FsbChvcHRzKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignb3B0aW9ucyBzaG91bGQgYmUgb2JqZWN0IG9yIHVuZGVmaW5lZCcpO1xuICAgIGNvbnN0IG1lcmdlZCA9IE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIG9wdHMpO1xuICAgIHJldHVybiBtZXJnZWQ7XG59XG4vKiogRm9yIHJ1bnRpbWUgY2hlY2sgaWYgY2xhc3MgaW1wbGVtZW50cyBpbnRlcmZhY2UgKi9cbmV4cG9ydCBjbGFzcyBIYXNoIHtcbn1cbi8qKiBXcmFwcyBoYXNoIGZ1bmN0aW9uLCBjcmVhdGluZyBhbiBpbnRlcmZhY2Ugb24gdG9wIG9mIGl0ICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGFzaGVyKGhhc2hDb25zKSB7XG4gICAgY29uc3QgaGFzaEMgPSAobXNnKSA9PiBoYXNoQ29ucygpLnVwZGF0ZSh0b0J5dGVzKG1zZykpLmRpZ2VzdCgpO1xuICAgIGNvbnN0IHRtcCA9IGhhc2hDb25zKCk7XG4gICAgaGFzaEMub3V0cHV0TGVuID0gdG1wLm91dHB1dExlbjtcbiAgICBoYXNoQy5ibG9ja0xlbiA9IHRtcC5ibG9ja0xlbjtcbiAgICBoYXNoQy5jcmVhdGUgPSAoKSA9PiBoYXNoQ29ucygpO1xuICAgIHJldHVybiBoYXNoQztcbn1cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVPcHRIYXNoZXIoaGFzaENvbnMpIHtcbiAgICBjb25zdCBoYXNoQyA9IChtc2csIG9wdHMpID0+IGhhc2hDb25zKG9wdHMpLnVwZGF0ZSh0b0J5dGVzKG1zZykpLmRpZ2VzdCgpO1xuICAgIGNvbnN0IHRtcCA9IGhhc2hDb25zKHt9KTtcbiAgICBoYXNoQy5vdXRwdXRMZW4gPSB0bXAub3V0cHV0TGVuO1xuICAgIGhhc2hDLmJsb2NrTGVuID0gdG1wLmJsb2NrTGVuO1xuICAgIGhhc2hDLmNyZWF0ZSA9IChvcHRzKSA9PiBoYXNoQ29ucyhvcHRzKTtcbiAgICByZXR1cm4gaGFzaEM7XG59XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlWE9GZXIoaGFzaENvbnMpIHtcbiAgICBjb25zdCBoYXNoQyA9IChtc2csIG9wdHMpID0+IGhhc2hDb25zKG9wdHMpLnVwZGF0ZSh0b0J5dGVzKG1zZykpLmRpZ2VzdCgpO1xuICAgIGNvbnN0IHRtcCA9IGhhc2hDb25zKHt9KTtcbiAgICBoYXNoQy5vdXRwdXRMZW4gPSB0bXAub3V0cHV0TGVuO1xuICAgIGhhc2hDLmJsb2NrTGVuID0gdG1wLmJsb2NrTGVuO1xuICAgIGhhc2hDLmNyZWF0ZSA9IChvcHRzKSA9PiBoYXNoQ29ucyhvcHRzKTtcbiAgICByZXR1cm4gaGFzaEM7XG59XG5leHBvcnQgY29uc3Qgd3JhcENvbnN0cnVjdG9yID0gY3JlYXRlSGFzaGVyO1xuZXhwb3J0IGNvbnN0IHdyYXBDb25zdHJ1Y3RvcldpdGhPcHRzID0gY3JlYXRlT3B0SGFzaGVyO1xuZXhwb3J0IGNvbnN0IHdyYXBYT0ZDb25zdHJ1Y3RvcldpdGhPcHRzID0gY3JlYXRlWE9GZXI7XG4vKiogQ3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIFBSTkcuIFVzZXMgaW50ZXJuYWwgT1MtbGV2ZWwgYGNyeXB0by5nZXRSYW5kb21WYWx1ZXNgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbUJ5dGVzKGJ5dGVzTGVuZ3RoID0gMzIpIHtcbiAgICBpZiAoY3J5cHRvICYmIHR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KGJ5dGVzTGVuZ3RoKSk7XG4gICAgfVxuICAgIC8vIExlZ2FjeSBOb2RlLmpzIGNvbXBhdGliaWxpdHlcbiAgICBpZiAoY3J5cHRvICYmIHR5cGVvZiBjcnlwdG8ucmFuZG9tQnl0ZXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShjcnlwdG8ucmFuZG9tQnl0ZXMoYnl0ZXNMZW5ndGgpKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzIG11c3QgYmUgZGVmaW5lZCcpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dXRpbHMuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@noble/hashes/esm/utils.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-AFZBAV6Q.mjs":
/*!******************************************************************!*\
  !*** ./node_modules/@pigment-css/react/build/chunk-AFZBAV6Q.mjs ***!
  \******************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   styled: () => (/* binding */ styled)\n/* harmony export */ });\n/* harmony import */ var _chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./chunk-L25ZX2YK.mjs */ \"(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-L25ZX2YK.mjs\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \"(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs\");\n/* harmony import */ var _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @emotion/is-prop-valid */ \"(app-pages-browser)/./node_modules/@emotion/is-prop-valid/dist/emotion-is-prop-valid.esm.js\");\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-runtime.js\");\n\n\n\n\n\n\n/**\n  * @pigment-css/react v0.0.30\n  *\n  * @license MIT\n  * This source code is licensed under the MIT license found in the\n  * LICENSE file in the root directory of this source tree.\n  */\n \nfunction getVariantClasses(_a, variants) {\n  var _b = _a, { ownerState = {} } = _b, componentProps = (0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__objRest)(_b, [\"ownerState\"]);\n  const variantClasses = variants.filter(\n    ({ props: variantProps }) => typeof variantProps === \"function\" ? variantProps((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadProps)((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)({}, componentProps), ownerState), { ownerState })) : Object.entries(variantProps).every(([propKey, propValue]) => {\n      return ownerState[propKey] === propValue || componentProps[propKey] === propValue;\n    })\n  ).map(({ className }) => className);\n  return variantClasses;\n}\nfunction isHtmlTag(tag) {\n  return typeof tag === \"string\" && // 96 is one less than the char code\n  // for \"a\" so this is checking that\n  // it's a lowercase character\n  tag.charCodeAt(0) > 96;\n}\nvar slotShouldForwardProp = (key) => key !== \"as\" && key !== \"ownerState\";\nvar rootShouldForwardProp = (key) => slotShouldForwardProp(key) && key !== \"classes\";\nfunction styled(tag, componentMeta = {}) {\n  const { name, slot, shouldForwardProp } = componentMeta;\n  let finalShouldForwardProp = shouldForwardProp;\n  if (!shouldForwardProp) {\n    if (isHtmlTag(tag)) {\n      finalShouldForwardProp = _emotion_is_prop_valid__WEBPACK_IMPORTED_MODULE_2__[\"default\"];\n    } else if (slot === \"Root\" || slot === \"root\") {\n      finalShouldForwardProp = rootShouldForwardProp;\n    } else {\n      finalShouldForwardProp = slotShouldForwardProp;\n    }\n  }\n  let shouldUseAs = !finalShouldForwardProp(\"as\");\n  if (typeof tag !== \"string\" && tag.__styled_by_pigment_css) {\n    shouldUseAs = false;\n  }\n  function scopedStyledWithOptions(options = {}) {\n    const { displayName, classes = [], vars: cssVars = {}, variants = [] } = options;\n    const StyledComponent = react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(function StyledComponent2(inProps, ref) {\n      const _a = inProps, { className, sx, style, ownerState } = _a, props = (0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__objRest)(_a, [\"className\", \"sx\", \"style\", \"ownerState\"]);\n      const Component = shouldUseAs && inProps.as || tag;\n      const varStyles = Object.entries(cssVars).reduce(\n        (acc, [cssVariable, [variableFunction, isUnitLess]]) => {\n          const value = variableFunction(inProps);\n          if (typeof value === \"undefined\") {\n            return acc;\n          }\n          if (typeof value === \"string\" || isUnitLess) {\n            acc[`--${cssVariable}`] = value;\n          } else {\n            acc[`--${cssVariable}`] = `${value}px`;\n          }\n          return acc;\n        },\n        {}\n      );\n      const finalClassName = (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(classes, className, getVariantClasses(inProps, variants));\n      if (inProps.as && !shouldForwardProp) {\n        if (!isHtmlTag(Component)) {\n          if (slot === \"Root\" || slot === \"root\") {\n            finalShouldForwardProp = rootShouldForwardProp;\n          } else {\n            finalShouldForwardProp = slotShouldForwardProp;\n          }\n        }\n      }\n      const newProps = {};\n      for (const key in props) {\n        if (shouldUseAs && key === \"as\") {\n          continue;\n        }\n        if (finalShouldForwardProp(key) || !shouldUseAs && key === \"as\") {\n          newProps[key] = props[key];\n        }\n      }\n      return /* @__PURE__ */ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\n        Component,\n        (0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadProps)((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)({}, newProps), Component.__styled_by_pigment_css && { ownerState }), {\n          ref,\n          className: finalClassName,\n          style: (0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)((0,_chunk_L25ZX2YK_mjs__WEBPACK_IMPORTED_MODULE_4__.__spreadValues)({}, varStyles), style)\n        })\n      );\n    });\n    let componentName = displayName;\n    if (!componentName && name) {\n      componentName = `${name}${slot ? `-${slot}` : \"\"}`;\n    }\n    StyledComponent.displayName = `Styled(${componentName})`;\n    StyledComponent.__styled_by_pigment_css = true;\n    return StyledComponent;\n  }\n  return scopedStyledWithOptions;\n}\n\n\n//# sourceMappingURL=chunk-AFZBAV6Q.mjs.map\n//# sourceMappingURL=chunk-AFZBAV6Q.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcGlnbWVudC1jc3MvcmVhY3QvYnVpbGQvY2h1bmstQUZaQkFWNlEubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFnRjtBQUNqRDtBQUNQO0FBQ3lCO0FBQ1Q7O0FBRXhDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQixrQkFBa0IsdUJBQXVCLDhEQUFTO0FBQ25FO0FBQ0EsT0FBTyxxQkFBcUIsdURBQXVELGtFQUFhLENBQUMsbUVBQWMsQ0FBQyxtRUFBYyxHQUFHLGtDQUFrQyxZQUFZO0FBQy9LO0FBQ0EsS0FBSztBQUNMLFdBQVcsV0FBVztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QyxVQUFVLGdDQUFnQztBQUMxQztBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsOERBQVc7QUFDMUMsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DLFlBQVksNkNBQTZDLGtCQUFrQjtBQUMzRSw0QkFBNEIsNkNBQWdCO0FBQzVDLDRCQUE0QixtQ0FBbUMsY0FBYyw4REFBUztBQUN0RjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLFlBQVk7QUFDakMsWUFBWTtBQUNaLHFCQUFxQixZQUFZLFFBQVEsTUFBTTtBQUMvQztBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSw2QkFBNkIsZ0RBQUk7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIsc0RBQUc7QUFDaEM7QUFDQSxRQUFRLGtFQUFhLENBQUMsbUVBQWMsQ0FBQyxtRUFBYyxHQUFHLG9EQUFvRCxZQUFZO0FBQ3RIO0FBQ0E7QUFDQSxpQkFBaUIsbUVBQWMsQ0FBQyxtRUFBYyxHQUFHO0FBQ2pELFNBQVM7QUFDVDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EseUJBQXlCLEtBQUssRUFBRSxXQUFXLEtBQUssT0FBTztBQUN2RDtBQUNBLDRDQUE0QyxjQUFjO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWtCO0FBQ2xCO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQHBpZ21lbnQtY3NzL3JlYWN0L2J1aWxkL2NodW5rLUFGWkJBVjZRLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBfX29ialJlc3QsIF9fc3ByZWFkUHJvcHMsIF9fc3ByZWFkVmFsdWVzIH0gZnJvbSAnLi9jaHVuay1MMjVaWDJZSy5tanMnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IGNsc3ggZnJvbSAnY2xzeCc7XG5pbXBvcnQgaXNQcm9wVmFsaWQgZnJvbSAnQGVtb3Rpb24vaXMtcHJvcC12YWxpZCc7XG5pbXBvcnQgeyBqc3ggfSBmcm9tICdyZWFjdC9qc3gtcnVudGltZSc7XG5cbi8qKlxuICAqIEBwaWdtZW50LWNzcy9yZWFjdCB2MC4wLjMwXG4gICpcbiAgKiBAbGljZW5zZSBNSVRcbiAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAgKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4gICovXG4gXG5mdW5jdGlvbiBnZXRWYXJpYW50Q2xhc3NlcyhfYSwgdmFyaWFudHMpIHtcbiAgdmFyIF9iID0gX2EsIHsgb3duZXJTdGF0ZSA9IHt9IH0gPSBfYiwgY29tcG9uZW50UHJvcHMgPSBfX29ialJlc3QoX2IsIFtcIm93bmVyU3RhdGVcIl0pO1xuICBjb25zdCB2YXJpYW50Q2xhc3NlcyA9IHZhcmlhbnRzLmZpbHRlcihcbiAgICAoeyBwcm9wczogdmFyaWFudFByb3BzIH0pID0+IHR5cGVvZiB2YXJpYW50UHJvcHMgPT09IFwiZnVuY3Rpb25cIiA/IHZhcmlhbnRQcm9wcyhfX3NwcmVhZFByb3BzKF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHt9LCBjb21wb25lbnRQcm9wcyksIG93bmVyU3RhdGUpLCB7IG93bmVyU3RhdGUgfSkpIDogT2JqZWN0LmVudHJpZXModmFyaWFudFByb3BzKS5ldmVyeSgoW3Byb3BLZXksIHByb3BWYWx1ZV0pID0+IHtcbiAgICAgIHJldHVybiBvd25lclN0YXRlW3Byb3BLZXldID09PSBwcm9wVmFsdWUgfHwgY29tcG9uZW50UHJvcHNbcHJvcEtleV0gPT09IHByb3BWYWx1ZTtcbiAgICB9KVxuICApLm1hcCgoeyBjbGFzc05hbWUgfSkgPT4gY2xhc3NOYW1lKTtcbiAgcmV0dXJuIHZhcmlhbnRDbGFzc2VzO1xufVxuZnVuY3Rpb24gaXNIdG1sVGFnKHRhZykge1xuICByZXR1cm4gdHlwZW9mIHRhZyA9PT0gXCJzdHJpbmdcIiAmJiAvLyA5NiBpcyBvbmUgbGVzcyB0aGFuIHRoZSBjaGFyIGNvZGVcbiAgLy8gZm9yIFwiYVwiIHNvIHRoaXMgaXMgY2hlY2tpbmcgdGhhdFxuICAvLyBpdCdzIGEgbG93ZXJjYXNlIGNoYXJhY3RlclxuICB0YWcuY2hhckNvZGVBdCgwKSA+IDk2O1xufVxudmFyIHNsb3RTaG91bGRGb3J3YXJkUHJvcCA9IChrZXkpID0+IGtleSAhPT0gXCJhc1wiICYmIGtleSAhPT0gXCJvd25lclN0YXRlXCI7XG52YXIgcm9vdFNob3VsZEZvcndhcmRQcm9wID0gKGtleSkgPT4gc2xvdFNob3VsZEZvcndhcmRQcm9wKGtleSkgJiYga2V5ICE9PSBcImNsYXNzZXNcIjtcbmZ1bmN0aW9uIHN0eWxlZCh0YWcsIGNvbXBvbmVudE1ldGEgPSB7fSkge1xuICBjb25zdCB7IG5hbWUsIHNsb3QsIHNob3VsZEZvcndhcmRQcm9wIH0gPSBjb21wb25lbnRNZXRhO1xuICBsZXQgZmluYWxTaG91bGRGb3J3YXJkUHJvcCA9IHNob3VsZEZvcndhcmRQcm9wO1xuICBpZiAoIXNob3VsZEZvcndhcmRQcm9wKSB7XG4gICAgaWYgKGlzSHRtbFRhZyh0YWcpKSB7XG4gICAgICBmaW5hbFNob3VsZEZvcndhcmRQcm9wID0gaXNQcm9wVmFsaWQ7XG4gICAgfSBlbHNlIGlmIChzbG90ID09PSBcIlJvb3RcIiB8fCBzbG90ID09PSBcInJvb3RcIikge1xuICAgICAgZmluYWxTaG91bGRGb3J3YXJkUHJvcCA9IHJvb3RTaG91bGRGb3J3YXJkUHJvcDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmluYWxTaG91bGRGb3J3YXJkUHJvcCA9IHNsb3RTaG91bGRGb3J3YXJkUHJvcDtcbiAgICB9XG4gIH1cbiAgbGV0IHNob3VsZFVzZUFzID0gIWZpbmFsU2hvdWxkRm9yd2FyZFByb3AoXCJhc1wiKTtcbiAgaWYgKHR5cGVvZiB0YWcgIT09IFwic3RyaW5nXCIgJiYgdGFnLl9fc3R5bGVkX2J5X3BpZ21lbnRfY3NzKSB7XG4gICAgc2hvdWxkVXNlQXMgPSBmYWxzZTtcbiAgfVxuICBmdW5jdGlvbiBzY29wZWRTdHlsZWRXaXRoT3B0aW9ucyhvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGRpc3BsYXlOYW1lLCBjbGFzc2VzID0gW10sIHZhcnM6IGNzc1ZhcnMgPSB7fSwgdmFyaWFudHMgPSBbXSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBTdHlsZWRDb21wb25lbnQgPSBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIFN0eWxlZENvbXBvbmVudDIoaW5Qcm9wcywgcmVmKSB7XG4gICAgICBjb25zdCBfYSA9IGluUHJvcHMsIHsgY2xhc3NOYW1lLCBzeCwgc3R5bGUsIG93bmVyU3RhdGUgfSA9IF9hLCBwcm9wcyA9IF9fb2JqUmVzdChfYSwgW1wiY2xhc3NOYW1lXCIsIFwic3hcIiwgXCJzdHlsZVwiLCBcIm93bmVyU3RhdGVcIl0pO1xuICAgICAgY29uc3QgQ29tcG9uZW50ID0gc2hvdWxkVXNlQXMgJiYgaW5Qcm9wcy5hcyB8fCB0YWc7XG4gICAgICBjb25zdCB2YXJTdHlsZXMgPSBPYmplY3QuZW50cmllcyhjc3NWYXJzKS5yZWR1Y2UoXG4gICAgICAgIChhY2MsIFtjc3NWYXJpYWJsZSwgW3ZhcmlhYmxlRnVuY3Rpb24sIGlzVW5pdExlc3NdXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gdmFyaWFibGVGdW5jdGlvbihpblByb3BzKTtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8IGlzVW5pdExlc3MpIHtcbiAgICAgICAgICAgIGFjY1tgLS0ke2Nzc1ZhcmlhYmxlfWBdID0gdmFsdWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1tgLS0ke2Nzc1ZhcmlhYmxlfWBdID0gYCR7dmFsdWV9cHhgO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LFxuICAgICAgICB7fVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGZpbmFsQ2xhc3NOYW1lID0gY2xzeChjbGFzc2VzLCBjbGFzc05hbWUsIGdldFZhcmlhbnRDbGFzc2VzKGluUHJvcHMsIHZhcmlhbnRzKSk7XG4gICAgICBpZiAoaW5Qcm9wcy5hcyAmJiAhc2hvdWxkRm9yd2FyZFByb3ApIHtcbiAgICAgICAgaWYgKCFpc0h0bWxUYWcoQ29tcG9uZW50KSkge1xuICAgICAgICAgIGlmIChzbG90ID09PSBcIlJvb3RcIiB8fCBzbG90ID09PSBcInJvb3RcIikge1xuICAgICAgICAgICAgZmluYWxTaG91bGRGb3J3YXJkUHJvcCA9IHJvb3RTaG91bGRGb3J3YXJkUHJvcDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmluYWxTaG91bGRGb3J3YXJkUHJvcCA9IHNsb3RTaG91bGRGb3J3YXJkUHJvcDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld1Byb3BzID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBwcm9wcykge1xuICAgICAgICBpZiAoc2hvdWxkVXNlQXMgJiYga2V5ID09PSBcImFzXCIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmluYWxTaG91bGRGb3J3YXJkUHJvcChrZXkpIHx8ICFzaG91bGRVc2VBcyAmJiBrZXkgPT09IFwiYXNcIikge1xuICAgICAgICAgIG5ld1Byb3BzW2tleV0gPSBwcm9wc1trZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gLyogQF9fUFVSRV9fICovIGpzeChcbiAgICAgICAgQ29tcG9uZW50LFxuICAgICAgICBfX3NwcmVhZFByb3BzKF9fc3ByZWFkVmFsdWVzKF9fc3ByZWFkVmFsdWVzKHt9LCBuZXdQcm9wcyksIENvbXBvbmVudC5fX3N0eWxlZF9ieV9waWdtZW50X2NzcyAmJiB7IG93bmVyU3RhdGUgfSksIHtcbiAgICAgICAgICByZWYsXG4gICAgICAgICAgY2xhc3NOYW1lOiBmaW5hbENsYXNzTmFtZSxcbiAgICAgICAgICBzdHlsZTogX19zcHJlYWRWYWx1ZXMoX19zcHJlYWRWYWx1ZXMoe30sIHZhclN0eWxlcyksIHN0eWxlKVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgICBsZXQgY29tcG9uZW50TmFtZSA9IGRpc3BsYXlOYW1lO1xuICAgIGlmICghY29tcG9uZW50TmFtZSAmJiBuYW1lKSB7XG4gICAgICBjb21wb25lbnROYW1lID0gYCR7bmFtZX0ke3Nsb3QgPyBgLSR7c2xvdH1gIDogXCJcIn1gO1xuICAgIH1cbiAgICBTdHlsZWRDb21wb25lbnQuZGlzcGxheU5hbWUgPSBgU3R5bGVkKCR7Y29tcG9uZW50TmFtZX0pYDtcbiAgICBTdHlsZWRDb21wb25lbnQuX19zdHlsZWRfYnlfcGlnbWVudF9jc3MgPSB0cnVlO1xuICAgIHJldHVybiBTdHlsZWRDb21wb25lbnQ7XG4gIH1cbiAgcmV0dXJuIHNjb3BlZFN0eWxlZFdpdGhPcHRpb25zO1xufVxuXG5leHBvcnQgeyBzdHlsZWQgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNodW5rLUFGWkJBVjZRLm1qcy5tYXBcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNodW5rLUFGWkJBVjZRLm1qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-AFZBAV6Q.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-L25ZX2YK.mjs":
/*!******************************************************************!*\
  !*** ./node_modules/@pigment-css/react/build/chunk-L25ZX2YK.mjs ***!
  \******************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   __objRest: () => (/* binding */ __objRest),\n/* harmony export */   __spreadProps: () => (/* binding */ __spreadProps),\n/* harmony export */   __spreadValues: () => (/* binding */ __spreadValues)\n/* harmony export */ });\n/**\n  * @pigment-css/react v0.0.30\n  *\n  * @license MIT\n  * This source code is licensed under the MIT license found in the\n  * LICENSE file in the root directory of this source tree.\n  */\n \nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n  for (var prop in b || (b = {}))\n    if (__hasOwnProp.call(b, prop))\n      __defNormalProp(a, prop, b[prop]);\n  if (__getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(b)) {\n      if (__propIsEnum.call(b, prop))\n        __defNormalProp(a, prop, b[prop]);\n    }\n  return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nvar __objRest = (source, exclude) => {\n  var target = {};\n  for (var prop in source)\n    if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)\n      target[prop] = source[prop];\n  if (source != null && __getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(source)) {\n      if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))\n        target[prop] = source[prop];\n    }\n  return target;\n};\n\n\n//# sourceMappingURL=chunk-L25ZX2YK.mjs.map\n//# sourceMappingURL=chunk-L25ZX2YK.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9AcGlnbWVudC1jc3MvcmVhY3QvYnVpbGQvY2h1bmstTDI1WlgyWUsubWpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4RUFBOEUsNkRBQTZEO0FBQzNJO0FBQ0EsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVvRDtBQUNwRDtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0BwaWdtZW50LWNzcy9yZWFjdC9idWlsZC9jaHVuay1MMjVaWDJZSy5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gICogQHBpZ21lbnQtY3NzL3JlYWN0IHYwLjAuMzBcbiAgKlxuICAqIEBsaWNlbnNlIE1JVFxuICAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuICAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAgKi9cbiBcbnZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgX19kZWZQcm9wcyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzO1xudmFyIF9fZ2V0T3duUHJvcERlc2NzID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM7XG52YXIgX19nZXRPd25Qcm9wU3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7XG52YXIgX19oYXNPd25Qcm9wID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfX3Byb3BJc0VudW0gPSBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlO1xudmFyIF9fc3ByZWFkVmFsdWVzID0gKGEsIGIpID0+IHtcbiAgZm9yICh2YXIgcHJvcCBpbiBiIHx8IChiID0ge30pKVxuICAgIGlmIChfX2hhc093blByb3AuY2FsbChiLCBwcm9wKSlcbiAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgaWYgKF9fZ2V0T3duUHJvcFN5bWJvbHMpXG4gICAgZm9yICh2YXIgcHJvcCBvZiBfX2dldE93blByb3BTeW1ib2xzKGIpKSB7XG4gICAgICBpZiAoX19wcm9wSXNFbnVtLmNhbGwoYiwgcHJvcCkpXG4gICAgICAgIF9fZGVmTm9ybWFsUHJvcChhLCBwcm9wLCBiW3Byb3BdKTtcbiAgICB9XG4gIHJldHVybiBhO1xufTtcbnZhciBfX3NwcmVhZFByb3BzID0gKGEsIGIpID0+IF9fZGVmUHJvcHMoYSwgX19nZXRPd25Qcm9wRGVzY3MoYikpO1xudmFyIF9fb2JqUmVzdCA9IChzb3VyY2UsIGV4Y2x1ZGUpID0+IHtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICBmb3IgKHZhciBwcm9wIGluIHNvdXJjZSlcbiAgICBpZiAoX19oYXNPd25Qcm9wLmNhbGwoc291cmNlLCBwcm9wKSAmJiBleGNsdWRlLmluZGV4T2YocHJvcCkgPCAwKVxuICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICBpZiAoc291cmNlICE9IG51bGwgJiYgX19nZXRPd25Qcm9wU3ltYm9scylcbiAgICBmb3IgKHZhciBwcm9wIG9mIF9fZ2V0T3duUHJvcFN5bWJvbHMoc291cmNlKSkge1xuICAgICAgaWYgKGV4Y2x1ZGUuaW5kZXhPZihwcm9wKSA8IDAgJiYgX19wcm9wSXNFbnVtLmNhbGwoc291cmNlLCBwcm9wKSlcbiAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdO1xuICAgIH1cbiAgcmV0dXJuIHRhcmdldDtcbn07XG5cbmV4cG9ydCB7IF9fb2JqUmVzdCwgX19zcHJlYWRQcm9wcywgX19zcHJlYWRWYWx1ZXMgfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNodW5rLUwyNVpYMllLLm1qcy5tYXBcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNodW5rLUwyNVpYMllLLm1qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@pigment-css/react/build/chunk-L25ZX2YK.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@solana/buffer-layout/lib/Layout.js":
/*!**********************************************************!*\
  !*** ./node_modules/@solana/buffer-layout/lib/Layout.js ***!
  \**********************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("/* The MIT License (MIT)\n *\n * Copyright 2015-2018 Peter A. Bigot\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n/**\n * Support for translating between Uint8Array instances and JavaScript\n * native types.\n *\n * {@link module:Layout~Layout|Layout} is the basis of a class\n * hierarchy that associates property names with sequences of encoded\n * bytes.\n *\n * Layouts are supported for these scalar (numeric) types:\n * * {@link module:Layout~UInt|Unsigned integers in little-endian\n *   format} with {@link module:Layout.u8|8-bit}, {@link\n *   module:Layout.u16|16-bit}, {@link module:Layout.u24|24-bit},\n *   {@link module:Layout.u32|32-bit}, {@link\n *   module:Layout.u40|40-bit}, and {@link module:Layout.u48|48-bit}\n *   representation ranges;\n * * {@link module:Layout~UIntBE|Unsigned integers in big-endian\n *   format} with {@link module:Layout.u16be|16-bit}, {@link\n *   module:Layout.u24be|24-bit}, {@link module:Layout.u32be|32-bit},\n *   {@link module:Layout.u40be|40-bit}, and {@link\n *   module:Layout.u48be|48-bit} representation ranges;\n * * {@link module:Layout~Int|Signed integers in little-endian\n *   format} with {@link module:Layout.s8|8-bit}, {@link\n *   module:Layout.s16|16-bit}, {@link module:Layout.s24|24-bit},\n *   {@link module:Layout.s32|32-bit}, {@link\n *   module:Layout.s40|40-bit}, and {@link module:Layout.s48|48-bit}\n *   representation ranges;\n * * {@link module:Layout~IntBE|Signed integers in big-endian format}\n *   with {@link module:Layout.s16be|16-bit}, {@link\n *   module:Layout.s24be|24-bit}, {@link module:Layout.s32be|32-bit},\n *   {@link module:Layout.s40be|40-bit}, and {@link\n *   module:Layout.s48be|48-bit} representation ranges;\n * * 64-bit integral values that decode to an exact (if magnitude is\n *   less than 2^53) or nearby integral Number in {@link\n *   module:Layout.nu64|unsigned little-endian}, {@link\n *   module:Layout.nu64be|unsigned big-endian}, {@link\n *   module:Layout.ns64|signed little-endian}, and {@link\n *   module:Layout.ns64be|unsigned big-endian} encodings;\n * * 32-bit floating point values with {@link\n *   module:Layout.f32|little-endian} and {@link\n *   module:Layout.f32be|big-endian} representations;\n * * 64-bit floating point values with {@link\n *   module:Layout.f64|little-endian} and {@link\n *   module:Layout.f64be|big-endian} representations;\n * * {@link module:Layout.const|Constants} that take no space in the\n *   encoded expression.\n *\n * and for these aggregate types:\n * * {@link module:Layout.seq|Sequence}s of instances of a {@link\n *   module:Layout~Layout|Layout}, with JavaScript representation as\n *   an Array and constant or data-dependent {@link\n *   module:Layout~Sequence#count|length};\n * * {@link module:Layout.struct|Structure}s that aggregate a\n *   heterogeneous sequence of {@link module:Layout~Layout|Layout}\n *   instances, with JavaScript representation as an Object;\n * * {@link module:Layout.union|Union}s that support multiple {@link\n *   module:Layout~VariantLayout|variant layouts} over a fixed\n *   (padded) or variable (not padded) span of bytes, using an\n *   unsigned integer at the start of the data or a separate {@link\n *   module:Layout.unionLayoutDiscriminator|layout element} to\n *   determine which layout to use when interpreting the buffer\n *   contents;\n * * {@link module:Layout.bits|BitStructure}s that contain a sequence\n *   of individual {@link\n *   module:Layout~BitStructure#addField|BitField}s packed into an 8,\n *   16, 24, or 32-bit unsigned integer starting at the least- or\n *   most-significant bit;\n * * {@link module:Layout.cstr|C strings} of varying length;\n * * {@link module:Layout.blob|Blobs} of fixed- or variable-{@link\n *   module:Layout~Blob#length|length} raw data.\n *\n * All {@link module:Layout~Layout|Layout} instances are immutable\n * after construction, to prevent internal state from becoming\n * inconsistent.\n *\n * @local Layout\n * @local ExternalLayout\n * @local GreedyCount\n * @local OffsetLayout\n * @local UInt\n * @local UIntBE\n * @local Int\n * @local IntBE\n * @local NearUInt64\n * @local NearUInt64BE\n * @local NearInt64\n * @local NearInt64BE\n * @local Float\n * @local FloatBE\n * @local Double\n * @local DoubleBE\n * @local Sequence\n * @local Structure\n * @local UnionDiscriminator\n * @local UnionLayoutDiscriminator\n * @local Union\n * @local VariantLayout\n * @local BitStructure\n * @local BitField\n * @local Boolean\n * @local Blob\n * @local CString\n * @local Constant\n * @local bindConstructorLayout\n * @module Layout\n * @license MIT\n * @author Peter A. Bigot\n * @see {@link https://github.com/pabigot/buffer-layout|buffer-layout on GitHub}\n */\n\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.s16 = exports.s8 = exports.nu64be = exports.u48be = exports.u40be = exports.u32be = exports.u24be = exports.u16be = exports.nu64 = exports.u48 = exports.u40 = exports.u32 = exports.u24 = exports.u16 = exports.u8 = exports.offset = exports.greedy = exports.Constant = exports.UTF8 = exports.CString = exports.Blob = exports.Boolean = exports.BitField = exports.BitStructure = exports.VariantLayout = exports.Union = exports.UnionLayoutDiscriminator = exports.UnionDiscriminator = exports.Structure = exports.Sequence = exports.DoubleBE = exports.Double = exports.FloatBE = exports.Float = exports.NearInt64BE = exports.NearInt64 = exports.NearUInt64BE = exports.NearUInt64 = exports.IntBE = exports.Int = exports.UIntBE = exports.UInt = exports.OffsetLayout = exports.GreedyCount = exports.ExternalLayout = exports.bindConstructorLayout = exports.nameWithProperty = exports.Layout = exports.uint8ArrayToBuffer = exports.checkUint8Array = void 0;\nexports.constant = exports.utf8 = exports.cstr = exports.blob = exports.unionLayoutDiscriminator = exports.union = exports.seq = exports.bits = exports.struct = exports.f64be = exports.f64 = exports.f32be = exports.f32 = exports.ns64be = exports.s48be = exports.s40be = exports.s32be = exports.s24be = exports.s16be = exports.ns64 = exports.s48 = exports.s40 = exports.s32 = exports.s24 = void 0;\nconst buffer_1 = __webpack_require__(/*! buffer */ \"(app-pages-browser)/./node_modules/buffer/index.js\");\n/* Check if a value is a Uint8Array.\n *\n * @ignore */\nfunction checkUint8Array(b) {\n    if (!(b instanceof Uint8Array)) {\n        throw new TypeError('b must be a Uint8Array');\n    }\n}\nexports.checkUint8Array = checkUint8Array;\n/* Create a Buffer instance from a Uint8Array.\n *\n * @ignore */\nfunction uint8ArrayToBuffer(b) {\n    checkUint8Array(b);\n    return buffer_1.Buffer.from(b.buffer, b.byteOffset, b.length);\n}\nexports.uint8ArrayToBuffer = uint8ArrayToBuffer;\n/**\n * Base class for layout objects.\n *\n * **NOTE** This is an abstract base class; you can create instances\n * if it amuses you, but they won't support the {@link\n * Layout#encode|encode} or {@link Layout#decode|decode} functions.\n *\n * @param {Number} span - Initializer for {@link Layout#span|span}.  The\n * parameter must be an integer; a negative value signifies that the\n * span is {@link Layout#getSpan|value-specific}.\n *\n * @param {string} [property] - Initializer for {@link\n * Layout#property|property}.\n *\n * @abstract\n */\nclass Layout {\n    constructor(span, property) {\n        if (!Number.isInteger(span)) {\n            throw new TypeError('span must be an integer');\n        }\n        /** The span of the layout in bytes.\n         *\n         * Positive values are generally expected.\n         *\n         * Zero will only appear in {@link Constant}s and in {@link\n         * Sequence}s where the {@link Sequence#count|count} is zero.\n         *\n         * A negative value indicates that the span is value-specific, and\n         * must be obtained using {@link Layout#getSpan|getSpan}. */\n        this.span = span;\n        /** The property name used when this layout is represented in an\n         * Object.\n         *\n         * Used only for layouts that {@link Layout#decode|decode} to Object\n         * instances.  If left undefined the span of the unnamed layout will\n         * be treated as padding: it will not be mutated by {@link\n         * Layout#encode|encode} nor represented as a property in the\n         * decoded Object. */\n        this.property = property;\n    }\n    /** Function to create an Object into which decoded properties will\n     * be written.\n     *\n     * Used only for layouts that {@link Layout#decode|decode} to Object\n     * instances, which means:\n     * * {@link Structure}\n     * * {@link Union}\n     * * {@link VariantLayout}\n     * * {@link BitStructure}\n     *\n     * If left undefined the JavaScript representation of these layouts\n     * will be Object instances.\n     *\n     * See {@link bindConstructorLayout}.\n     */\n    makeDestinationObject() {\n        return {};\n    }\n    /**\n     * Calculate the span of a specific instance of a layout.\n     *\n     * @param {Uint8Array} b - the buffer that contains an encoded instance.\n     *\n     * @param {Number} [offset] - the offset at which the encoded instance\n     * starts.  If absent a zero offset is inferred.\n     *\n     * @return {Number} - the number of bytes covered by the layout\n     * instance.  If this method is not overridden in a subclass the\n     * definition-time constant {@link Layout#span|span} will be\n     * returned.\n     *\n     * @throws {RangeError} - if the length of the value cannot be\n     * determined.\n     */\n    getSpan(b, offset) {\n        if (0 > this.span) {\n            throw new RangeError('indeterminate span');\n        }\n        return this.span;\n    }\n    /**\n     * Replicate the layout using a new property.\n     *\n     * This function must be used to get a structurally-equivalent layout\n     * with a different name since all {@link Layout} instances are\n     * immutable.\n     *\n     * **NOTE** This is a shallow copy.  All fields except {@link\n     * Layout#property|property} are strictly equal to the origin layout.\n     *\n     * @param {String} property - the value for {@link\n     * Layout#property|property} in the replica.\n     *\n     * @returns {Layout} - the copy with {@link Layout#property|property}\n     * set to `property`.\n     */\n    replicate(property) {\n        const rv = Object.create(this.constructor.prototype);\n        Object.assign(rv, this);\n        rv.property = property;\n        return rv;\n    }\n    /**\n     * Create an object from layout properties and an array of values.\n     *\n     * **NOTE** This function returns `undefined` if invoked on a layout\n     * that does not return its value as an Object.  Objects are\n     * returned for things that are a {@link Structure}, which includes\n     * {@link VariantLayout|variant layouts} if they are structures, and\n     * excludes {@link Union}s.  If you want this feature for a union\n     * you must use {@link Union.getVariant|getVariant} to select the\n     * desired layout.\n     *\n     * @param {Array} values - an array of values that correspond to the\n     * default order for properties.  As with {@link Layout#decode|decode}\n     * layout elements that have no property name are skipped when\n     * iterating over the array values.  Only the top-level properties are\n     * assigned; arguments are not assigned to properties of contained\n     * layouts.  Any unused values are ignored.\n     *\n     * @return {(Object|undefined)}\n     */\n    fromArray(values) {\n        return undefined;\n    }\n}\nexports.Layout = Layout;\n/* Provide text that carries a name (such as for a function that will\n * be throwing an error) annotated with the property of a given layout\n * (such as one for which the value was unacceptable).\n *\n * @ignore */\nfunction nameWithProperty(name, lo) {\n    if (lo.property) {\n        return name + '[' + lo.property + ']';\n    }\n    return name;\n}\nexports.nameWithProperty = nameWithProperty;\n/**\n * Augment a class so that instances can be encoded/decoded using a\n * given layout.\n *\n * Calling this function couples `Class` with `layout` in several ways:\n *\n * * `Class.layout_` becomes a static member property equal to `layout`;\n * * `layout.boundConstructor_` becomes a static member property equal\n *    to `Class`;\n * * The {@link Layout#makeDestinationObject|makeDestinationObject()}\n *   property of `layout` is set to a function that returns a `new\n *   Class()`;\n * * `Class.decode(b, offset)` becomes a static member function that\n *   delegates to {@link Layout#decode|layout.decode}.  The\n *   synthesized function may be captured and extended.\n * * `Class.prototype.encode(b, offset)` provides an instance member\n *   function that delegates to {@link Layout#encode|layout.encode}\n *   with `src` set to `this`.  The synthesized function may be\n *   captured and extended, but when the extension is invoked `this`\n *   must be explicitly bound to the instance.\n *\n * @param {class} Class - a JavaScript class with a nullary\n * constructor.\n *\n * @param {Layout} layout - the {@link Layout} instance used to encode\n * instances of `Class`.\n */\n// `Class` must be a constructor Function, but the assignment of a `layout_` property to it makes it difficult to type\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nfunction bindConstructorLayout(Class, layout) {\n    if ('function' !== typeof Class) {\n        throw new TypeError('Class must be constructor');\n    }\n    if (Object.prototype.hasOwnProperty.call(Class, 'layout_')) {\n        throw new Error('Class is already bound to a layout');\n    }\n    if (!(layout && (layout instanceof Layout))) {\n        throw new TypeError('layout must be a Layout');\n    }\n    if (Object.prototype.hasOwnProperty.call(layout, 'boundConstructor_')) {\n        throw new Error('layout is already bound to a constructor');\n    }\n    Class.layout_ = layout;\n    layout.boundConstructor_ = Class;\n    layout.makeDestinationObject = (() => new Class());\n    Object.defineProperty(Class.prototype, 'encode', {\n        value(b, offset) {\n            return layout.encode(this, b, offset);\n        },\n        writable: true,\n    });\n    Object.defineProperty(Class, 'decode', {\n        value(b, offset) {\n            return layout.decode(b, offset);\n        },\n        writable: true,\n    });\n}\nexports.bindConstructorLayout = bindConstructorLayout;\n/**\n * An object that behaves like a layout but does not consume space\n * within its containing layout.\n *\n * This is primarily used to obtain metadata about a member, such as a\n * {@link OffsetLayout} that can provide data about a {@link\n * Layout#getSpan|value-specific span}.\n *\n * **NOTE** This is an abstract base class; you can create instances\n * if it amuses you, but they won't support {@link\n * ExternalLayout#isCount|isCount} or other {@link Layout} functions.\n *\n * @param {Number} span - initializer for {@link Layout#span|span}.\n * The parameter can range from 1 through 6.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @abstract\n * @augments {Layout}\n */\nclass ExternalLayout extends Layout {\n    /**\n     * Return `true` iff the external layout decodes to an unsigned\n     * integer layout.\n     *\n     * In that case it can be used as the source of {@link\n     * Sequence#count|Sequence counts}, {@link Blob#length|Blob lengths},\n     * or as {@link UnionLayoutDiscriminator#layout|external union\n     * discriminators}.\n     *\n     * @abstract\n     */\n    isCount() {\n        throw new Error('ExternalLayout is abstract');\n    }\n}\nexports.ExternalLayout = ExternalLayout;\n/**\n * An {@link ExternalLayout} that determines its {@link\n * Layout#decode|value} based on offset into and length of the buffer\n * on which it is invoked.\n *\n * *Factory*: {@link module:Layout.greedy|greedy}\n *\n * @param {Number} [elementSpan] - initializer for {@link\n * GreedyCount#elementSpan|elementSpan}.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {ExternalLayout}\n */\nclass GreedyCount extends ExternalLayout {\n    constructor(elementSpan = 1, property) {\n        if ((!Number.isInteger(elementSpan)) || (0 >= elementSpan)) {\n            throw new TypeError('elementSpan must be a (positive) integer');\n        }\n        super(-1, property);\n        /** The layout for individual elements of the sequence.  The value\n         * must be a positive integer.  If not provided, the value will be\n         * 1. */\n        this.elementSpan = elementSpan;\n    }\n    /** @override */\n    isCount() {\n        return true;\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        checkUint8Array(b);\n        const rem = b.length - offset;\n        return Math.floor(rem / this.elementSpan);\n    }\n    /** @override */\n    encode(src, b, offset) {\n        return 0;\n    }\n}\nexports.GreedyCount = GreedyCount;\n/**\n * An {@link ExternalLayout} that supports accessing a {@link Layout}\n * at a fixed offset from the start of another Layout.  The offset may\n * be before, within, or after the base layout.\n *\n * *Factory*: {@link module:Layout.offset|offset}\n *\n * @param {Layout} layout - initializer for {@link\n * OffsetLayout#layout|layout}, modulo `property`.\n *\n * @param {Number} [offset] - Initializes {@link\n * OffsetLayout#offset|offset}.  Defaults to zero.\n *\n * @param {string} [property] - Optional new property name for a\n * {@link Layout#replicate| replica} of `layout` to be used as {@link\n * OffsetLayout#layout|layout}.  If not provided the `layout` is used\n * unchanged.\n *\n * @augments {Layout}\n */\nclass OffsetLayout extends ExternalLayout {\n    constructor(layout, offset = 0, property) {\n        if (!(layout instanceof Layout)) {\n            throw new TypeError('layout must be a Layout');\n        }\n        if (!Number.isInteger(offset)) {\n            throw new TypeError('offset must be integer or undefined');\n        }\n        super(layout.span, property || layout.property);\n        /** The subordinated layout. */\n        this.layout = layout;\n        /** The location of {@link OffsetLayout#layout} relative to the\n         * start of another layout.\n         *\n         * The value may be positive or negative, but an error will thrown\n         * if at the point of use it goes outside the span of the Uint8Array\n         * being accessed.  */\n        this.offset = offset;\n    }\n    /** @override */\n    isCount() {\n        return ((this.layout instanceof UInt)\n            || (this.layout instanceof UIntBE));\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        return this.layout.decode(b, offset + this.offset);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        return this.layout.encode(src, b, offset + this.offset);\n    }\n}\nexports.OffsetLayout = OffsetLayout;\n/**\n * Represent an unsigned integer in little-endian format.\n *\n * *Factory*: {@link module:Layout.u8|u8}, {@link\n *  module:Layout.u16|u16}, {@link module:Layout.u24|u24}, {@link\n *  module:Layout.u32|u32}, {@link module:Layout.u40|u40}, {@link\n *  module:Layout.u48|u48}\n *\n * @param {Number} span - initializer for {@link Layout#span|span}.\n * The parameter can range from 1 through 6.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass UInt extends Layout {\n    constructor(span, property) {\n        super(span, property);\n        if (6 < this.span) {\n            throw new RangeError('span must not exceed 6 bytes');\n        }\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        return uint8ArrayToBuffer(b).readUIntLE(offset, this.span);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        uint8ArrayToBuffer(b).writeUIntLE(src, offset, this.span);\n        return this.span;\n    }\n}\nexports.UInt = UInt;\n/**\n * Represent an unsigned integer in big-endian format.\n *\n * *Factory*: {@link module:Layout.u8be|u8be}, {@link\n * module:Layout.u16be|u16be}, {@link module:Layout.u24be|u24be},\n * {@link module:Layout.u32be|u32be}, {@link\n * module:Layout.u40be|u40be}, {@link module:Layout.u48be|u48be}\n *\n * @param {Number} span - initializer for {@link Layout#span|span}.\n * The parameter can range from 1 through 6.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass UIntBE extends Layout {\n    constructor(span, property) {\n        super(span, property);\n        if (6 < this.span) {\n            throw new RangeError('span must not exceed 6 bytes');\n        }\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        return uint8ArrayToBuffer(b).readUIntBE(offset, this.span);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        uint8ArrayToBuffer(b).writeUIntBE(src, offset, this.span);\n        return this.span;\n    }\n}\nexports.UIntBE = UIntBE;\n/**\n * Represent a signed integer in little-endian format.\n *\n * *Factory*: {@link module:Layout.s8|s8}, {@link\n *  module:Layout.s16|s16}, {@link module:Layout.s24|s24}, {@link\n *  module:Layout.s32|s32}, {@link module:Layout.s40|s40}, {@link\n *  module:Layout.s48|s48}\n *\n * @param {Number} span - initializer for {@link Layout#span|span}.\n * The parameter can range from 1 through 6.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass Int extends Layout {\n    constructor(span, property) {\n        super(span, property);\n        if (6 < this.span) {\n            throw new RangeError('span must not exceed 6 bytes');\n        }\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        return uint8ArrayToBuffer(b).readIntLE(offset, this.span);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        uint8ArrayToBuffer(b).writeIntLE(src, offset, this.span);\n        return this.span;\n    }\n}\nexports.Int = Int;\n/**\n * Represent a signed integer in big-endian format.\n *\n * *Factory*: {@link module:Layout.s8be|s8be}, {@link\n * module:Layout.s16be|s16be}, {@link module:Layout.s24be|s24be},\n * {@link module:Layout.s32be|s32be}, {@link\n * module:Layout.s40be|s40be}, {@link module:Layout.s48be|s48be}\n *\n * @param {Number} span - initializer for {@link Layout#span|span}.\n * The parameter can range from 1 through 6.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass IntBE extends Layout {\n    constructor(span, property) {\n        super(span, property);\n        if (6 < this.span) {\n            throw new RangeError('span must not exceed 6 bytes');\n        }\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        return uint8ArrayToBuffer(b).readIntBE(offset, this.span);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        uint8ArrayToBuffer(b).writeIntBE(src, offset, this.span);\n        return this.span;\n    }\n}\nexports.IntBE = IntBE;\nconst V2E32 = Math.pow(2, 32);\n/* True modulus high and low 32-bit words, where low word is always\n * non-negative. */\nfunction divmodInt64(src) {\n    const hi32 = Math.floor(src / V2E32);\n    const lo32 = src - (hi32 * V2E32);\n    return { hi32, lo32 };\n}\n/* Reconstruct Number from quotient and non-negative remainder */\nfunction roundedInt64(hi32, lo32) {\n    return hi32 * V2E32 + lo32;\n}\n/**\n * Represent an unsigned 64-bit integer in little-endian format when\n * encoded and as a near integral JavaScript Number when decoded.\n *\n * *Factory*: {@link module:Layout.nu64|nu64}\n *\n * **NOTE** Values with magnitude greater than 2^52 may not decode to\n * the exact value of the encoded representation.\n *\n * @augments {Layout}\n */\nclass NearUInt64 extends Layout {\n    constructor(property) {\n        super(8, property);\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        const buffer = uint8ArrayToBuffer(b);\n        const lo32 = buffer.readUInt32LE(offset);\n        const hi32 = buffer.readUInt32LE(offset + 4);\n        return roundedInt64(hi32, lo32);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        const split = divmodInt64(src);\n        const buffer = uint8ArrayToBuffer(b);\n        buffer.writeUInt32LE(split.lo32, offset);\n        buffer.writeUInt32LE(split.hi32, offset + 4);\n        return 8;\n    }\n}\nexports.NearUInt64 = NearUInt64;\n/**\n * Represent an unsigned 64-bit integer in big-endian format when\n * encoded and as a near integral JavaScript Number when decoded.\n *\n * *Factory*: {@link module:Layout.nu64be|nu64be}\n *\n * **NOTE** Values with magnitude greater than 2^52 may not decode to\n * the exact value of the encoded representation.\n *\n * @augments {Layout}\n */\nclass NearUInt64BE extends Layout {\n    constructor(property) {\n        super(8, property);\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        const buffer = uint8ArrayToBuffer(b);\n        const hi32 = buffer.readUInt32BE(offset);\n        const lo32 = buffer.readUInt32BE(offset + 4);\n        return roundedInt64(hi32, lo32);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        const split = divmodInt64(src);\n        const buffer = uint8ArrayToBuffer(b);\n        buffer.writeUInt32BE(split.hi32, offset);\n        buffer.writeUInt32BE(split.lo32, offset + 4);\n        return 8;\n    }\n}\nexports.NearUInt64BE = NearUInt64BE;\n/**\n * Represent a signed 64-bit integer in little-endian format when\n * encoded and as a near integral JavaScript Number when decoded.\n *\n * *Factory*: {@link module:Layout.ns64|ns64}\n *\n * **NOTE** Values with magnitude greater than 2^52 may not decode to\n * the exact value of the encoded representation.\n *\n * @augments {Layout}\n */\nclass NearInt64 extends Layout {\n    constructor(property) {\n        super(8, property);\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        const buffer = uint8ArrayToBuffer(b);\n        const lo32 = buffer.readUInt32LE(offset);\n        const hi32 = buffer.readInt32LE(offset + 4);\n        return roundedInt64(hi32, lo32);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        const split = divmodInt64(src);\n        const buffer = uint8ArrayToBuffer(b);\n        buffer.writeUInt32LE(split.lo32, offset);\n        buffer.writeInt32LE(split.hi32, offset + 4);\n        return 8;\n    }\n}\nexports.NearInt64 = NearInt64;\n/**\n * Represent a signed 64-bit integer in big-endian format when\n * encoded and as a near integral JavaScript Number when decoded.\n *\n * *Factory*: {@link module:Layout.ns64be|ns64be}\n *\n * **NOTE** Values with magnitude greater than 2^52 may not decode to\n * the exact value of the encoded representation.\n *\n * @augments {Layout}\n */\nclass NearInt64BE extends Layout {\n    constructor(property) {\n        super(8, property);\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        const buffer = uint8ArrayToBuffer(b);\n        const hi32 = buffer.readInt32BE(offset);\n        const lo32 = buffer.readUInt32BE(offset + 4);\n        return roundedInt64(hi32, lo32);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        const split = divmodInt64(src);\n        const buffer = uint8ArrayToBuffer(b);\n        buffer.writeInt32BE(split.hi32, offset);\n        buffer.writeUInt32BE(split.lo32, offset + 4);\n        return 8;\n    }\n}\nexports.NearInt64BE = NearInt64BE;\n/**\n * Represent a 32-bit floating point number in little-endian format.\n *\n * *Factory*: {@link module:Layout.f32|f32}\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass Float extends Layout {\n    constructor(property) {\n        super(4, property);\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        return uint8ArrayToBuffer(b).readFloatLE(offset);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        uint8ArrayToBuffer(b).writeFloatLE(src, offset);\n        return 4;\n    }\n}\nexports.Float = Float;\n/**\n * Represent a 32-bit floating point number in big-endian format.\n *\n * *Factory*: {@link module:Layout.f32be|f32be}\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass FloatBE extends Layout {\n    constructor(property) {\n        super(4, property);\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        return uint8ArrayToBuffer(b).readFloatBE(offset);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        uint8ArrayToBuffer(b).writeFloatBE(src, offset);\n        return 4;\n    }\n}\nexports.FloatBE = FloatBE;\n/**\n * Represent a 64-bit floating point number in little-endian format.\n *\n * *Factory*: {@link module:Layout.f64|f64}\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass Double extends Layout {\n    constructor(property) {\n        super(8, property);\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        return uint8ArrayToBuffer(b).readDoubleLE(offset);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        uint8ArrayToBuffer(b).writeDoubleLE(src, offset);\n        return 8;\n    }\n}\nexports.Double = Double;\n/**\n * Represent a 64-bit floating point number in big-endian format.\n *\n * *Factory*: {@link module:Layout.f64be|f64be}\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass DoubleBE extends Layout {\n    constructor(property) {\n        super(8, property);\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        return uint8ArrayToBuffer(b).readDoubleBE(offset);\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        uint8ArrayToBuffer(b).writeDoubleBE(src, offset);\n        return 8;\n    }\n}\nexports.DoubleBE = DoubleBE;\n/**\n * Represent a contiguous sequence of a specific layout as an Array.\n *\n * *Factory*: {@link module:Layout.seq|seq}\n *\n * @param {Layout} elementLayout - initializer for {@link\n * Sequence#elementLayout|elementLayout}.\n *\n * @param {(Number|ExternalLayout)} count - initializer for {@link\n * Sequence#count|count}.  The parameter must be either a positive\n * integer or an instance of {@link ExternalLayout}.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass Sequence extends Layout {\n    constructor(elementLayout, count, property) {\n        if (!(elementLayout instanceof Layout)) {\n            throw new TypeError('elementLayout must be a Layout');\n        }\n        if (!(((count instanceof ExternalLayout) && count.isCount())\n            || (Number.isInteger(count) && (0 <= count)))) {\n            throw new TypeError('count must be non-negative integer '\n                + 'or an unsigned integer ExternalLayout');\n        }\n        let span = -1;\n        if ((!(count instanceof ExternalLayout))\n            && (0 < elementLayout.span)) {\n            span = count * elementLayout.span;\n        }\n        super(span, property);\n        /** The layout for individual elements of the sequence. */\n        this.elementLayout = elementLayout;\n        /** The number of elements in the sequence.\n         *\n         * This will be either a non-negative integer or an instance of\n         * {@link ExternalLayout} for which {@link\n         * ExternalLayout#isCount|isCount()} is `true`. */\n        this.count = count;\n    }\n    /** @override */\n    getSpan(b, offset = 0) {\n        if (0 <= this.span) {\n            return this.span;\n        }\n        let span = 0;\n        let count = this.count;\n        if (count instanceof ExternalLayout) {\n            count = count.decode(b, offset);\n        }\n        if (0 < this.elementLayout.span) {\n            span = count * this.elementLayout.span;\n        }\n        else {\n            let idx = 0;\n            while (idx < count) {\n                span += this.elementLayout.getSpan(b, offset + span);\n                ++idx;\n            }\n        }\n        return span;\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        const rv = [];\n        let i = 0;\n        let count = this.count;\n        if (count instanceof ExternalLayout) {\n            count = count.decode(b, offset);\n        }\n        while (i < count) {\n            rv.push(this.elementLayout.decode(b, offset));\n            offset += this.elementLayout.getSpan(b, offset);\n            i += 1;\n        }\n        return rv;\n    }\n    /** Implement {@link Layout#encode|encode} for {@link Sequence}.\n     *\n     * **NOTE** If `src` is shorter than {@link Sequence#count|count} then\n     * the unused space in the buffer is left unchanged.  If `src` is\n     * longer than {@link Sequence#count|count} the unneeded elements are\n     * ignored.\n     *\n     * **NOTE** If {@link Layout#count|count} is an instance of {@link\n     * ExternalLayout} then the length of `src` will be encoded as the\n     * count after `src` is encoded. */\n    encode(src, b, offset = 0) {\n        const elo = this.elementLayout;\n        const span = src.reduce((span, v) => {\n            return span + elo.encode(v, b, offset + span);\n        }, 0);\n        if (this.count instanceof ExternalLayout) {\n            this.count.encode(src.length, b, offset);\n        }\n        return span;\n    }\n}\nexports.Sequence = Sequence;\n/**\n * Represent a contiguous sequence of arbitrary layout elements as an\n * Object.\n *\n * *Factory*: {@link module:Layout.struct|struct}\n *\n * **NOTE** The {@link Layout#span|span} of the structure is variable\n * if any layout in {@link Structure#fields|fields} has a variable\n * span.  When {@link Layout#encode|encoding} we must have a value for\n * all variable-length fields, or we wouldn't be able to figure out\n * how much space to use for storage.  We can only identify the value\n * for a field when it has a {@link Layout#property|property}.  As\n * such, although a structure may contain both unnamed fields and\n * variable-length fields, it cannot contain an unnamed\n * variable-length field.\n *\n * @param {Layout[]} fields - initializer for {@link\n * Structure#fields|fields}.  An error is raised if this contains a\n * variable-length field for which a {@link Layout#property|property}\n * is not defined.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @param {Boolean} [decodePrefixes] - initializer for {@link\n * Structure#decodePrefixes|property}.\n *\n * @throws {Error} - if `fields` contains an unnamed variable-length\n * layout.\n *\n * @augments {Layout}\n */\nclass Structure extends Layout {\n    constructor(fields, property, decodePrefixes) {\n        if (!(Array.isArray(fields)\n            && fields.reduce((acc, v) => acc && (v instanceof Layout), true))) {\n            throw new TypeError('fields must be array of Layout instances');\n        }\n        if (('boolean' === typeof property)\n            && (undefined === decodePrefixes)) {\n            decodePrefixes = property;\n            property = undefined;\n        }\n        /* Verify absence of unnamed variable-length fields. */\n        for (const fd of fields) {\n            if ((0 > fd.span)\n                && (undefined === fd.property)) {\n                throw new Error('fields cannot contain unnamed variable-length layout');\n            }\n        }\n        let span = -1;\n        try {\n            span = fields.reduce((span, fd) => span + fd.getSpan(), 0);\n        }\n        catch (e) {\n            // ignore error\n        }\n        super(span, property);\n        /** The sequence of {@link Layout} values that comprise the\n         * structure.\n         *\n         * The individual elements need not be the same type, and may be\n         * either scalar or aggregate layouts.  If a member layout leaves\n         * its {@link Layout#property|property} undefined the\n         * corresponding region of the buffer associated with the element\n         * will not be mutated.\n         *\n         * @type {Layout[]} */\n        this.fields = fields;\n        /** Control behavior of {@link Layout#decode|decode()} given short\n         * buffers.\n         *\n         * In some situations a structure many be extended with additional\n         * fields over time, with older installations providing only a\n         * prefix of the full structure.  If this property is `true`\n         * decoding will accept those buffers and leave subsequent fields\n         * undefined, as long as the buffer ends at a field boundary.\n         * Defaults to `false`. */\n        this.decodePrefixes = !!decodePrefixes;\n    }\n    /** @override */\n    getSpan(b, offset = 0) {\n        if (0 <= this.span) {\n            return this.span;\n        }\n        let span = 0;\n        try {\n            span = this.fields.reduce((span, fd) => {\n                const fsp = fd.getSpan(b, offset);\n                offset += fsp;\n                return span + fsp;\n            }, 0);\n        }\n        catch (e) {\n            throw new RangeError('indeterminate span');\n        }\n        return span;\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        checkUint8Array(b);\n        const dest = this.makeDestinationObject();\n        for (const fd of this.fields) {\n            if (undefined !== fd.property) {\n                dest[fd.property] = fd.decode(b, offset);\n            }\n            offset += fd.getSpan(b, offset);\n            if (this.decodePrefixes\n                && (b.length === offset)) {\n                break;\n            }\n        }\n        return dest;\n    }\n    /** Implement {@link Layout#encode|encode} for {@link Structure}.\n     *\n     * If `src` is missing a property for a member with a defined {@link\n     * Layout#property|property} the corresponding region of the buffer is\n     * left unmodified. */\n    encode(src, b, offset = 0) {\n        const firstOffset = offset;\n        let lastOffset = 0;\n        let lastWrote = 0;\n        for (const fd of this.fields) {\n            let span = fd.span;\n            lastWrote = (0 < span) ? span : 0;\n            if (undefined !== fd.property) {\n                const fv = src[fd.property];\n                if (undefined !== fv) {\n                    lastWrote = fd.encode(fv, b, offset);\n                    if (0 > span) {\n                        /* Read the as-encoded span, which is not necessarily the\n                         * same as what we wrote. */\n                        span = fd.getSpan(b, offset);\n                    }\n                }\n            }\n            lastOffset = offset;\n            offset += span;\n        }\n        /* Use (lastOffset + lastWrote) instead of offset because the last\n         * item may have had a dynamic length and we don't want to include\n         * the padding between it and the end of the space reserved for\n         * it. */\n        return (lastOffset + lastWrote) - firstOffset;\n    }\n    /** @override */\n    fromArray(values) {\n        const dest = this.makeDestinationObject();\n        for (const fd of this.fields) {\n            if ((undefined !== fd.property)\n                && (0 < values.length)) {\n                dest[fd.property] = values.shift();\n            }\n        }\n        return dest;\n    }\n    /**\n     * Get access to the layout of a given property.\n     *\n     * @param {String} property - the structure member of interest.\n     *\n     * @return {Layout} - the layout associated with `property`, or\n     * undefined if there is no such property.\n     */\n    layoutFor(property) {\n        if ('string' !== typeof property) {\n            throw new TypeError('property must be string');\n        }\n        for (const fd of this.fields) {\n            if (fd.property === property) {\n                return fd;\n            }\n        }\n        return undefined;\n    }\n    /**\n     * Get the offset of a structure member.\n     *\n     * @param {String} property - the structure member of interest.\n     *\n     * @return {Number} - the offset in bytes to the start of `property`\n     * within the structure, or undefined if `property` is not a field\n     * within the structure.  If the property is a member but follows a\n     * variable-length structure member a negative number will be\n     * returned.\n     */\n    offsetOf(property) {\n        if ('string' !== typeof property) {\n            throw new TypeError('property must be string');\n        }\n        let offset = 0;\n        for (const fd of this.fields) {\n            if (fd.property === property) {\n                return offset;\n            }\n            if (0 > fd.span) {\n                offset = -1;\n            }\n            else if (0 <= offset) {\n                offset += fd.span;\n            }\n        }\n        return undefined;\n    }\n}\nexports.Structure = Structure;\n/**\n * An object that can provide a {@link\n * Union#discriminator|discriminator} API for {@link Union}.\n *\n * **NOTE** This is an abstract base class; you can create instances\n * if it amuses you, but they won't support the {@link\n * UnionDiscriminator#encode|encode} or {@link\n * UnionDiscriminator#decode|decode} functions.\n *\n * @param {string} [property] - Default for {@link\n * UnionDiscriminator#property|property}.\n *\n * @abstract\n */\nclass UnionDiscriminator {\n    constructor(property) {\n        /** The {@link Layout#property|property} to be used when the\n         * discriminator is referenced in isolation (generally when {@link\n         * Union#decode|Union decode} cannot delegate to a specific\n         * variant). */\n        this.property = property;\n    }\n    /** Analog to {@link Layout#decode|Layout decode} for union discriminators.\n     *\n     * The implementation of this method need not reference the buffer if\n     * variant information is available through other means. */\n    decode(b, offset) {\n        throw new Error('UnionDiscriminator is abstract');\n    }\n    /** Analog to {@link Layout#decode|Layout encode} for union discriminators.\n     *\n     * The implementation of this method need not store the value if\n     * variant information is maintained through other means. */\n    encode(src, b, offset) {\n        throw new Error('UnionDiscriminator is abstract');\n    }\n}\nexports.UnionDiscriminator = UnionDiscriminator;\n/**\n * An object that can provide a {@link\n * UnionDiscriminator|discriminator API} for {@link Union} using an\n * unsigned integral {@link Layout} instance located either inside or\n * outside the union.\n *\n * @param {ExternalLayout} layout - initializes {@link\n * UnionLayoutDiscriminator#layout|layout}.  Must satisfy {@link\n * ExternalLayout#isCount|isCount()}.\n *\n * @param {string} [property] - Default for {@link\n * UnionDiscriminator#property|property}, superseding the property\n * from `layout`, but defaulting to `variant` if neither `property`\n * nor layout provide a property name.\n *\n * @augments {UnionDiscriminator}\n */\nclass UnionLayoutDiscriminator extends UnionDiscriminator {\n    constructor(layout, property) {\n        if (!((layout instanceof ExternalLayout)\n            && layout.isCount())) {\n            throw new TypeError('layout must be an unsigned integer ExternalLayout');\n        }\n        super(property || layout.property || 'variant');\n        /** The {@link ExternalLayout} used to access the discriminator\n         * value. */\n        this.layout = layout;\n    }\n    /** Delegate decoding to {@link UnionLayoutDiscriminator#layout|layout}. */\n    decode(b, offset) {\n        return this.layout.decode(b, offset);\n    }\n    /** Delegate encoding to {@link UnionLayoutDiscriminator#layout|layout}. */\n    encode(src, b, offset) {\n        return this.layout.encode(src, b, offset);\n    }\n}\nexports.UnionLayoutDiscriminator = UnionLayoutDiscriminator;\n/**\n * Represent any number of span-compatible layouts.\n *\n * *Factory*: {@link module:Layout.union|union}\n *\n * If the union has a {@link Union#defaultLayout|default layout} that\n * layout must have a non-negative {@link Layout#span|span}.  The span\n * of a fixed-span union includes its {@link\n * Union#discriminator|discriminator} if the variant is a {@link\n * Union#usesPrefixDiscriminator|prefix of the union}, plus the span\n * of its {@link Union#defaultLayout|default layout}.\n *\n * If the union does not have a default layout then the encoded span\n * of the union depends on the encoded span of its variant (which may\n * be fixed or variable).\n *\n * {@link VariantLayout#layout|Variant layout}s are added through\n * {@link Union#addVariant|addVariant}.  If the union has a default\n * layout, the span of the {@link VariantLayout#layout|layout\n * contained by the variant} must not exceed the span of the {@link\n * Union#defaultLayout|default layout} (minus the span of a {@link\n * Union#usesPrefixDiscriminator|prefix disriminator}, if used).  The\n * span of the variant will equal the span of the union itself.\n *\n * The variant for a buffer can only be identified from the {@link\n * Union#discriminator|discriminator} {@link\n * UnionDiscriminator#property|property} (in the case of the {@link\n * Union#defaultLayout|default layout}), or by using {@link\n * Union#getVariant|getVariant} and examining the resulting {@link\n * VariantLayout} instance.\n *\n * A variant compatible with a JavaScript object can be identified\n * using {@link Union#getSourceVariant|getSourceVariant}.\n *\n * @param {(UnionDiscriminator|ExternalLayout|Layout)} discr - How to\n * identify the layout used to interpret the union contents.  The\n * parameter must be an instance of {@link UnionDiscriminator}, an\n * {@link ExternalLayout} that satisfies {@link\n * ExternalLayout#isCount|isCount()}, or {@link UInt} (or {@link\n * UIntBE}).  When a non-external layout element is passed the layout\n * appears at the start of the union.  In all cases the (synthesized)\n * {@link UnionDiscriminator} instance is recorded as {@link\n * Union#discriminator|discriminator}.\n *\n * @param {(Layout|null)} defaultLayout - initializer for {@link\n * Union#defaultLayout|defaultLayout}.  If absent defaults to `null`.\n * If `null` there is no default layout: the union has data-dependent\n * length and attempts to decode or encode unrecognized variants will\n * throw an exception.  A {@link Layout} instance must have a\n * non-negative {@link Layout#span|span}, and if it lacks a {@link\n * Layout#property|property} the {@link\n * Union#defaultLayout|defaultLayout} will be a {@link\n * Layout#replicate|replica} with property `content`.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass Union extends Layout {\n    constructor(discr, defaultLayout, property) {\n        let discriminator;\n        if ((discr instanceof UInt)\n            || (discr instanceof UIntBE)) {\n            discriminator = new UnionLayoutDiscriminator(new OffsetLayout(discr));\n        }\n        else if ((discr instanceof ExternalLayout)\n            && discr.isCount()) {\n            discriminator = new UnionLayoutDiscriminator(discr);\n        }\n        else if (!(discr instanceof UnionDiscriminator)) {\n            throw new TypeError('discr must be a UnionDiscriminator '\n                + 'or an unsigned integer layout');\n        }\n        else {\n            discriminator = discr;\n        }\n        if (undefined === defaultLayout) {\n            defaultLayout = null;\n        }\n        if (!((null === defaultLayout)\n            || (defaultLayout instanceof Layout))) {\n            throw new TypeError('defaultLayout must be null or a Layout');\n        }\n        if (null !== defaultLayout) {\n            if (0 > defaultLayout.span) {\n                throw new Error('defaultLayout must have constant span');\n            }\n            if (undefined === defaultLayout.property) {\n                defaultLayout = defaultLayout.replicate('content');\n            }\n        }\n        /* The union span can be estimated only if there's a default\n         * layout.  The union spans its default layout, plus any prefix\n         * variant layout.  By construction both layouts, if present, have\n         * non-negative span. */\n        let span = -1;\n        if (defaultLayout) {\n            span = defaultLayout.span;\n            if ((0 <= span) && ((discr instanceof UInt)\n                || (discr instanceof UIntBE))) {\n                span += discriminator.layout.span;\n            }\n        }\n        super(span, property);\n        /** The interface for the discriminator value in isolation.\n         *\n         * This a {@link UnionDiscriminator} either passed to the\n         * constructor or synthesized from the `discr` constructor\n         * argument.  {@link\n         * Union#usesPrefixDiscriminator|usesPrefixDiscriminator} will be\n         * `true` iff the `discr` parameter was a non-offset {@link\n         * Layout} instance. */\n        this.discriminator = discriminator;\n        /** `true` if the {@link Union#discriminator|discriminator} is the\n         * first field in the union.\n         *\n         * If `false` the discriminator is obtained from somewhere\n         * else. */\n        this.usesPrefixDiscriminator = (discr instanceof UInt)\n            || (discr instanceof UIntBE);\n        /** The layout for non-discriminator content when the value of the\n         * discriminator is not recognized.\n         *\n         * This is the value passed to the constructor.  It is\n         * structurally equivalent to the second component of {@link\n         * Union#layout|layout} but may have a different property\n         * name. */\n        this.defaultLayout = defaultLayout;\n        /** A registry of allowed variants.\n         *\n         * The keys are unsigned integers which should be compatible with\n         * {@link Union.discriminator|discriminator}.  The property value\n         * is the corresponding {@link VariantLayout} instances assigned\n         * to this union by {@link Union#addVariant|addVariant}.\n         *\n         * **NOTE** The registry remains mutable so that variants can be\n         * {@link Union#addVariant|added} at any time.  Users should not\n         * manipulate the content of this property. */\n        this.registry = {};\n        /* Private variable used when invoking getSourceVariant */\n        let boundGetSourceVariant = this.defaultGetSourceVariant.bind(this);\n        /** Function to infer the variant selected by a source object.\n         *\n         * Defaults to {@link\n         * Union#defaultGetSourceVariant|defaultGetSourceVariant} but may\n         * be overridden using {@link\n         * Union#configGetSourceVariant|configGetSourceVariant}.\n         *\n         * @param {Object} src - as with {@link\n         * Union#defaultGetSourceVariant|defaultGetSourceVariant}.\n         *\n         * @returns {(undefined|VariantLayout)} The default variant\n         * (`undefined`) or first registered variant that uses a property\n         * available in `src`. */\n        this.getSourceVariant = function (src) {\n            return boundGetSourceVariant(src);\n        };\n        /** Function to override the implementation of {@link\n         * Union#getSourceVariant|getSourceVariant}.\n         *\n         * Use this if the desired variant cannot be identified using the\n         * algorithm of {@link\n         * Union#defaultGetSourceVariant|defaultGetSourceVariant}.\n         *\n         * **NOTE** The provided function will be invoked bound to this\n         * Union instance, providing local access to {@link\n         * Union#registry|registry}.\n         *\n         * @param {Function} gsv - a function that follows the API of\n         * {@link Union#defaultGetSourceVariant|defaultGetSourceVariant}. */\n        this.configGetSourceVariant = function (gsv) {\n            boundGetSourceVariant = gsv.bind(this);\n        };\n    }\n    /** @override */\n    getSpan(b, offset = 0) {\n        if (0 <= this.span) {\n            return this.span;\n        }\n        /* Default layouts always have non-negative span, so we don't have\n         * one and we have to recognize the variant which will in turn\n         * determine the span. */\n        const vlo = this.getVariant(b, offset);\n        if (!vlo) {\n            throw new Error('unable to determine span for unrecognized variant');\n        }\n        return vlo.getSpan(b, offset);\n    }\n    /**\n     * Method to infer a registered Union variant compatible with `src`.\n     *\n     * The first satisfied rule in the following sequence defines the\n     * return value:\n     * * If `src` has properties matching the Union discriminator and\n     *   the default layout, `undefined` is returned regardless of the\n     *   value of the discriminator property (this ensures the default\n     *   layout will be used);\n     * * If `src` has a property matching the Union discriminator, the\n     *   value of the discriminator identifies a registered variant, and\n     *   either (a) the variant has no layout, or (b) `src` has the\n     *   variant's property, then the variant is returned (because the\n     *   source satisfies the constraints of the variant it identifies);\n     * * If `src` does not have a property matching the Union\n     *   discriminator, but does have a property matching a registered\n     *   variant, then the variant is returned (because the source\n     *   matches a variant without an explicit conflict);\n     * * An error is thrown (because we either can't identify a variant,\n     *   or we were explicitly told the variant but can't satisfy it).\n     *\n     * @param {Object} src - an object presumed to be compatible with\n     * the content of the Union.\n     *\n     * @return {(undefined|VariantLayout)} - as described above.\n     *\n     * @throws {Error} - if `src` cannot be associated with a default or\n     * registered variant.\n     */\n    defaultGetSourceVariant(src) {\n        if (Object.prototype.hasOwnProperty.call(src, this.discriminator.property)) {\n            if (this.defaultLayout && this.defaultLayout.property\n                && Object.prototype.hasOwnProperty.call(src, this.defaultLayout.property)) {\n                return undefined;\n            }\n            const vlo = this.registry[src[this.discriminator.property]];\n            if (vlo\n                && ((!vlo.layout)\n                    || (vlo.property && Object.prototype.hasOwnProperty.call(src, vlo.property)))) {\n                return vlo;\n            }\n        }\n        else {\n            for (const tag in this.registry) {\n                const vlo = this.registry[tag];\n                if (vlo.property && Object.prototype.hasOwnProperty.call(src, vlo.property)) {\n                    return vlo;\n                }\n            }\n        }\n        throw new Error('unable to infer src variant');\n    }\n    /** Implement {@link Layout#decode|decode} for {@link Union}.\n     *\n     * If the variant is {@link Union#addVariant|registered} the return\n     * value is an instance of that variant, with no explicit\n     * discriminator.  Otherwise the {@link Union#defaultLayout|default\n     * layout} is used to decode the content. */\n    decode(b, offset = 0) {\n        let dest;\n        const dlo = this.discriminator;\n        const discr = dlo.decode(b, offset);\n        const clo = this.registry[discr];\n        if (undefined === clo) {\n            const defaultLayout = this.defaultLayout;\n            let contentOffset = 0;\n            if (this.usesPrefixDiscriminator) {\n                contentOffset = dlo.layout.span;\n            }\n            dest = this.makeDestinationObject();\n            dest[dlo.property] = discr;\n            // defaultLayout.property can be undefined, but this is allowed by buffer-layout\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            dest[defaultLayout.property] = defaultLayout.decode(b, offset + contentOffset);\n        }\n        else {\n            dest = clo.decode(b, offset);\n        }\n        return dest;\n    }\n    /** Implement {@link Layout#encode|encode} for {@link Union}.\n     *\n     * This API assumes the `src` object is consistent with the union's\n     * {@link Union#defaultLayout|default layout}.  To encode variants\n     * use the appropriate variant-specific {@link VariantLayout#encode}\n     * method. */\n    encode(src, b, offset = 0) {\n        const vlo = this.getSourceVariant(src);\n        if (undefined === vlo) {\n            const dlo = this.discriminator;\n            // this.defaultLayout is not undefined when vlo is undefined\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            const clo = this.defaultLayout;\n            let contentOffset = 0;\n            if (this.usesPrefixDiscriminator) {\n                contentOffset = dlo.layout.span;\n            }\n            dlo.encode(src[dlo.property], b, offset);\n            // clo.property is not undefined when vlo is undefined\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            return contentOffset + clo.encode(src[clo.property], b, offset + contentOffset);\n        }\n        return vlo.encode(src, b, offset);\n    }\n    /** Register a new variant structure within a union.  The newly\n     * created variant is returned.\n     *\n     * @param {Number} variant - initializer for {@link\n     * VariantLayout#variant|variant}.\n     *\n     * @param {Layout} layout - initializer for {@link\n     * VariantLayout#layout|layout}.\n     *\n     * @param {String} property - initializer for {@link\n     * Layout#property|property}.\n     *\n     * @return {VariantLayout} */\n    addVariant(variant, layout, property) {\n        const rv = new VariantLayout(this, variant, layout, property);\n        this.registry[variant] = rv;\n        return rv;\n    }\n    /**\n     * Get the layout associated with a registered variant.\n     *\n     * If `vb` does not produce a registered variant the function returns\n     * `undefined`.\n     *\n     * @param {(Number|Uint8Array)} vb - either the variant number, or a\n     * buffer from which the discriminator is to be read.\n     *\n     * @param {Number} offset - offset into `vb` for the start of the\n     * union.  Used only when `vb` is an instance of {Uint8Array}.\n     *\n     * @return {({VariantLayout}|undefined)}\n     */\n    getVariant(vb, offset = 0) {\n        let variant;\n        if (vb instanceof Uint8Array) {\n            variant = this.discriminator.decode(vb, offset);\n        }\n        else {\n            variant = vb;\n        }\n        return this.registry[variant];\n    }\n}\nexports.Union = Union;\n/**\n * Represent a specific variant within a containing union.\n *\n * **NOTE** The {@link Layout#span|span} of the variant may include\n * the span of the {@link Union#discriminator|discriminator} used to\n * identify it, but values read and written using the variant strictly\n * conform to the content of {@link VariantLayout#layout|layout}.\n *\n * **NOTE** User code should not invoke this constructor directly.  Use\n * the union {@link Union#addVariant|addVariant} helper method.\n *\n * @param {Union} union - initializer for {@link\n * VariantLayout#union|union}.\n *\n * @param {Number} variant - initializer for {@link\n * VariantLayout#variant|variant}.\n *\n * @param {Layout} [layout] - initializer for {@link\n * VariantLayout#layout|layout}.  If absent the variant carries no\n * data.\n *\n * @param {String} [property] - initializer for {@link\n * Layout#property|property}.  Unlike many other layouts, variant\n * layouts normally include a property name so they can be identified\n * within their containing {@link Union}.  The property identifier may\n * be absent only if `layout` is is absent.\n *\n * @augments {Layout}\n */\nclass VariantLayout extends Layout {\n    constructor(union, variant, layout, property) {\n        if (!(union instanceof Union)) {\n            throw new TypeError('union must be a Union');\n        }\n        if ((!Number.isInteger(variant)) || (0 > variant)) {\n            throw new TypeError('variant must be a (non-negative) integer');\n        }\n        if (('string' === typeof layout)\n            && (undefined === property)) {\n            property = layout;\n            layout = null;\n        }\n        if (layout) {\n            if (!(layout instanceof Layout)) {\n                throw new TypeError('layout must be a Layout');\n            }\n            if ((null !== union.defaultLayout)\n                && (0 <= layout.span)\n                && (layout.span > union.defaultLayout.span)) {\n                throw new Error('variant span exceeds span of containing union');\n            }\n            if ('string' !== typeof property) {\n                throw new TypeError('variant must have a String property');\n            }\n        }\n        let span = union.span;\n        if (0 > union.span) {\n            span = layout ? layout.span : 0;\n            if ((0 <= span) && union.usesPrefixDiscriminator) {\n                span += union.discriminator.layout.span;\n            }\n        }\n        super(span, property);\n        /** The {@link Union} to which this variant belongs. */\n        this.union = union;\n        /** The unsigned integral value identifying this variant within\n         * the {@link Union#discriminator|discriminator} of the containing\n         * union. */\n        this.variant = variant;\n        /** The {@link Layout} to be used when reading/writing the\n         * non-discriminator part of the {@link\n         * VariantLayout#union|union}.  If `null` the variant carries no\n         * data. */\n        this.layout = layout || null;\n    }\n    /** @override */\n    getSpan(b, offset = 0) {\n        if (0 <= this.span) {\n            /* Will be equal to the containing union span if that is not\n             * variable. */\n            return this.span;\n        }\n        let contentOffset = 0;\n        if (this.union.usesPrefixDiscriminator) {\n            contentOffset = this.union.discriminator.layout.span;\n        }\n        /* Span is defined solely by the variant (and prefix discriminator) */\n        let span = 0;\n        if (this.layout) {\n            span = this.layout.getSpan(b, offset + contentOffset);\n        }\n        return contentOffset + span;\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        const dest = this.makeDestinationObject();\n        if (this !== this.union.getVariant(b, offset)) {\n            throw new Error('variant mismatch');\n        }\n        let contentOffset = 0;\n        if (this.union.usesPrefixDiscriminator) {\n            contentOffset = this.union.discriminator.layout.span;\n        }\n        if (this.layout) {\n            dest[this.property] = this.layout.decode(b, offset + contentOffset);\n        }\n        else if (this.property) {\n            dest[this.property] = true;\n        }\n        else if (this.union.usesPrefixDiscriminator) {\n            dest[this.union.discriminator.property] = this.variant;\n        }\n        return dest;\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        let contentOffset = 0;\n        if (this.union.usesPrefixDiscriminator) {\n            contentOffset = this.union.discriminator.layout.span;\n        }\n        if (this.layout\n            && (!Object.prototype.hasOwnProperty.call(src, this.property))) {\n            throw new TypeError('variant lacks property ' + this.property);\n        }\n        this.union.discriminator.encode(this.variant, b, offset);\n        let span = contentOffset;\n        if (this.layout) {\n            this.layout.encode(src[this.property], b, offset + contentOffset);\n            span += this.layout.getSpan(b, offset + contentOffset);\n            if ((0 <= this.union.span)\n                && (span > this.union.span)) {\n                throw new Error('encoded variant overruns containing union');\n            }\n        }\n        return span;\n    }\n    /** Delegate {@link Layout#fromArray|fromArray} to {@link\n     * VariantLayout#layout|layout}. */\n    fromArray(values) {\n        if (this.layout) {\n            return this.layout.fromArray(values);\n        }\n        return undefined;\n    }\n}\nexports.VariantLayout = VariantLayout;\n/** JavaScript chose to define bitwise operations as operating on\n * signed 32-bit values in 2's complement form, meaning any integer\n * with bit 31 set is going to look negative.  For right shifts that's\n * not a problem, because `>>>` is a logical shift, but for every\n * other bitwise operator we have to compensate for possible negative\n * results. */\nfunction fixBitwiseResult(v) {\n    if (0 > v) {\n        v += 0x100000000;\n    }\n    return v;\n}\n/**\n * Contain a sequence of bit fields as an unsigned integer.\n *\n * *Factory*: {@link module:Layout.bits|bits}\n *\n * This is a container element; within it there are {@link BitField}\n * instances that provide the extracted properties.  The container\n * simply defines the aggregate representation and its bit ordering.\n * The representation is an object containing properties with numeric\n * or {@link Boolean} values.\n *\n * {@link BitField}s are added with the {@link\n * BitStructure#addField|addField} and {@link\n * BitStructure#addBoolean|addBoolean} methods.\n\n * @param {Layout} word - initializer for {@link\n * BitStructure#word|word}.  The parameter must be an instance of\n * {@link UInt} (or {@link UIntBE}) that is no more than 4 bytes wide.\n *\n * @param {bool} [msb] - `true` if the bit numbering starts at the\n * most significant bit of the containing word; `false` (default) if\n * it starts at the least significant bit of the containing word.  If\n * the parameter at this position is a string and `property` is\n * `undefined` the value of this argument will instead be used as the\n * value of `property`.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass BitStructure extends Layout {\n    constructor(word, msb, property) {\n        if (!((word instanceof UInt)\n            || (word instanceof UIntBE))) {\n            throw new TypeError('word must be a UInt or UIntBE layout');\n        }\n        if (('string' === typeof msb)\n            && (undefined === property)) {\n            property = msb;\n            msb = false;\n        }\n        if (4 < word.span) {\n            throw new RangeError('word cannot exceed 32 bits');\n        }\n        super(word.span, property);\n        /** The layout used for the packed value.  {@link BitField}\n         * instances are packed sequentially depending on {@link\n         * BitStructure#msb|msb}. */\n        this.word = word;\n        /** Whether the bit sequences are packed starting at the most\n         * significant bit growing down (`true`), or the least significant\n         * bit growing up (`false`).\n         *\n         * **NOTE** Regardless of this value, the least significant bit of\n         * any {@link BitField} value is the least significant bit of the\n         * corresponding section of the packed value. */\n        this.msb = !!msb;\n        /** The sequence of {@link BitField} layouts that comprise the\n         * packed structure.\n         *\n         * **NOTE** The array remains mutable to allow fields to be {@link\n         * BitStructure#addField|added} after construction.  Users should\n         * not manipulate the content of this property.*/\n        this.fields = [];\n        /* Storage for the value.  Capture a variable instead of using an\n         * instance property because we don't want anything to change the\n         * value without going through the mutator. */\n        let value = 0;\n        this._packedSetValue = function (v) {\n            value = fixBitwiseResult(v);\n            return this;\n        };\n        this._packedGetValue = function () {\n            return value;\n        };\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        const dest = this.makeDestinationObject();\n        const value = this.word.decode(b, offset);\n        this._packedSetValue(value);\n        for (const fd of this.fields) {\n            if (undefined !== fd.property) {\n                dest[fd.property] = fd.decode(b);\n            }\n        }\n        return dest;\n    }\n    /** Implement {@link Layout#encode|encode} for {@link BitStructure}.\n     *\n     * If `src` is missing a property for a member with a defined {@link\n     * Layout#property|property} the corresponding region of the packed\n     * value is left unmodified.  Unused bits are also left unmodified. */\n    encode(src, b, offset = 0) {\n        const value = this.word.decode(b, offset);\n        this._packedSetValue(value);\n        for (const fd of this.fields) {\n            if (undefined !== fd.property) {\n                const fv = src[fd.property];\n                if (undefined !== fv) {\n                    fd.encode(fv);\n                }\n            }\n        }\n        return this.word.encode(this._packedGetValue(), b, offset);\n    }\n    /** Register a new bitfield with a containing bit structure.  The\n     * resulting bitfield is returned.\n     *\n     * @param {Number} bits - initializer for {@link BitField#bits|bits}.\n     *\n     * @param {string} property - initializer for {@link\n     * Layout#property|property}.\n     *\n     * @return {BitField} */\n    addField(bits, property) {\n        const bf = new BitField(this, bits, property);\n        this.fields.push(bf);\n        return bf;\n    }\n    /** As with {@link BitStructure#addField|addField} for single-bit\n     * fields with `boolean` value representation.\n     *\n     * @param {string} property - initializer for {@link\n     * Layout#property|property}.\n     *\n     * @return {Boolean} */\n    // `Boolean` conflicts with the native primitive type\n    // eslint-disable-next-line @typescript-eslint/ban-types\n    addBoolean(property) {\n        // This is my Boolean, not the Javascript one.\n        const bf = new Boolean(this, property);\n        this.fields.push(bf);\n        return bf;\n    }\n    /**\n     * Get access to the bit field for a given property.\n     *\n     * @param {String} property - the bit field of interest.\n     *\n     * @return {BitField} - the field associated with `property`, or\n     * undefined if there is no such property.\n     */\n    fieldFor(property) {\n        if ('string' !== typeof property) {\n            throw new TypeError('property must be string');\n        }\n        for (const fd of this.fields) {\n            if (fd.property === property) {\n                return fd;\n            }\n        }\n        return undefined;\n    }\n}\nexports.BitStructure = BitStructure;\n/**\n * Represent a sequence of bits within a {@link BitStructure}.\n *\n * All bit field values are represented as unsigned integers.\n *\n * **NOTE** User code should not invoke this constructor directly.\n * Use the container {@link BitStructure#addField|addField} helper\n * method.\n *\n * **NOTE** BitField instances are not instances of {@link Layout}\n * since {@link Layout#span|span} measures 8-bit units.\n *\n * @param {BitStructure} container - initializer for {@link\n * BitField#container|container}.\n *\n * @param {Number} bits - initializer for {@link BitField#bits|bits}.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n */\nclass BitField {\n    constructor(container, bits, property) {\n        if (!(container instanceof BitStructure)) {\n            throw new TypeError('container must be a BitStructure');\n        }\n        if ((!Number.isInteger(bits)) || (0 >= bits)) {\n            throw new TypeError('bits must be positive integer');\n        }\n        const totalBits = 8 * container.span;\n        const usedBits = container.fields.reduce((sum, fd) => sum + fd.bits, 0);\n        if ((bits + usedBits) > totalBits) {\n            throw new Error('bits too long for span remainder ('\n                + (totalBits - usedBits) + ' of '\n                + totalBits + ' remain)');\n        }\n        /** The {@link BitStructure} instance to which this bit field\n         * belongs. */\n        this.container = container;\n        /** The span of this value in bits. */\n        this.bits = bits;\n        /** A mask of {@link BitField#bits|bits} bits isolating value bits\n         * that fit within the field.\n         *\n         * That is, it masks a value that has not yet been shifted into\n         * position within its containing packed integer. */\n        this.valueMask = (1 << bits) - 1;\n        if (32 === bits) { // shifted value out of range\n            this.valueMask = 0xFFFFFFFF;\n        }\n        /** The offset of the value within the containing packed unsigned\n         * integer.  The least significant bit of the packed value is at\n         * offset zero, regardless of bit ordering used. */\n        this.start = usedBits;\n        if (this.container.msb) {\n            this.start = totalBits - usedBits - bits;\n        }\n        /** A mask of {@link BitField#bits|bits} isolating the field value\n         * within the containing packed unsigned integer. */\n        this.wordMask = fixBitwiseResult(this.valueMask << this.start);\n        /** The property name used when this bitfield is represented in an\n         * Object.\n         *\n         * Intended to be functionally equivalent to {@link\n         * Layout#property}.\n         *\n         * If left undefined the corresponding span of bits will be\n         * treated as padding: it will not be mutated by {@link\n         * Layout#encode|encode} nor represented as a property in the\n         * decoded Object. */\n        this.property = property;\n    }\n    /** Store a value into the corresponding subsequence of the containing\n     * bit field. */\n    decode(b, offset) {\n        const word = this.container._packedGetValue();\n        const wordValue = fixBitwiseResult(word & this.wordMask);\n        const value = wordValue >>> this.start;\n        return value;\n    }\n    /** Store a value into the corresponding subsequence of the containing\n     * bit field.\n     *\n     * **NOTE** This is not a specialization of {@link\n     * Layout#encode|Layout.encode} and there is no return value. */\n    encode(value) {\n        if ('number' !== typeof value\n            || !Number.isInteger(value)\n            || (value !== fixBitwiseResult(value & this.valueMask))) {\n            throw new TypeError(nameWithProperty('BitField.encode', this)\n                + ' value must be integer not exceeding ' + this.valueMask);\n        }\n        const word = this.container._packedGetValue();\n        const wordValue = fixBitwiseResult(value << this.start);\n        this.container._packedSetValue(fixBitwiseResult(word & ~this.wordMask)\n            | wordValue);\n    }\n}\nexports.BitField = BitField;\n/**\n * Represent a single bit within a {@link BitStructure} as a\n * JavaScript boolean.\n *\n * **NOTE** User code should not invoke this constructor directly.\n * Use the container {@link BitStructure#addBoolean|addBoolean} helper\n * method.\n *\n * @param {BitStructure} container - initializer for {@link\n * BitField#container|container}.\n *\n * @param {string} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {BitField}\n */\n/* eslint-disable no-extend-native */\nclass Boolean extends BitField {\n    constructor(container, property) {\n        super(container, 1, property);\n    }\n    /** Override {@link BitField#decode|decode} for {@link Boolean|Boolean}.\n     *\n     * @returns {boolean} */\n    decode(b, offset) {\n        return !!super.decode(b, offset);\n    }\n    /** @override */\n    encode(value) {\n        if ('boolean' === typeof value) {\n            // BitField requires integer values\n            value = +value;\n        }\n        super.encode(value);\n    }\n}\nexports.Boolean = Boolean;\n/* eslint-enable no-extend-native */\n/**\n * Contain a fixed-length block of arbitrary data, represented as a\n * Uint8Array.\n *\n * *Factory*: {@link module:Layout.blob|blob}\n *\n * @param {(Number|ExternalLayout)} length - initializes {@link\n * Blob#length|length}.\n *\n * @param {String} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass Blob extends Layout {\n    constructor(length, property) {\n        if (!(((length instanceof ExternalLayout) && length.isCount())\n            || (Number.isInteger(length) && (0 <= length)))) {\n            throw new TypeError('length must be positive integer '\n                + 'or an unsigned integer ExternalLayout');\n        }\n        let span = -1;\n        if (!(length instanceof ExternalLayout)) {\n            span = length;\n        }\n        super(span, property);\n        /** The number of bytes in the blob.\n         *\n         * This may be a non-negative integer, or an instance of {@link\n         * ExternalLayout} that satisfies {@link\n         * ExternalLayout#isCount|isCount()}. */\n        this.length = length;\n    }\n    /** @override */\n    getSpan(b, offset) {\n        let span = this.span;\n        if (0 > span) {\n            span = this.length.decode(b, offset);\n        }\n        return span;\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        let span = this.span;\n        if (0 > span) {\n            span = this.length.decode(b, offset);\n        }\n        return uint8ArrayToBuffer(b).slice(offset, offset + span);\n    }\n    /** Implement {@link Layout#encode|encode} for {@link Blob}.\n     *\n     * **NOTE** If {@link Layout#count|count} is an instance of {@link\n     * ExternalLayout} then the length of `src` will be encoded as the\n     * count after `src` is encoded. */\n    encode(src, b, offset) {\n        let span = this.length;\n        if (this.length instanceof ExternalLayout) {\n            span = src.length;\n        }\n        if (!(src instanceof Uint8Array && span === src.length)) {\n            throw new TypeError(nameWithProperty('Blob.encode', this)\n                + ' requires (length ' + span + ') Uint8Array as src');\n        }\n        if ((offset + span) > b.length) {\n            throw new RangeError('encoding overruns Uint8Array');\n        }\n        const srcBuffer = uint8ArrayToBuffer(src);\n        uint8ArrayToBuffer(b).write(srcBuffer.toString('hex'), offset, span, 'hex');\n        if (this.length instanceof ExternalLayout) {\n            this.length.encode(span, b, offset);\n        }\n        return span;\n    }\n}\nexports.Blob = Blob;\n/**\n * Contain a `NUL`-terminated UTF8 string.\n *\n * *Factory*: {@link module:Layout.cstr|cstr}\n *\n * **NOTE** Any UTF8 string that incorporates a zero-valued byte will\n * not be correctly decoded by this layout.\n *\n * @param {String} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass CString extends Layout {\n    constructor(property) {\n        super(-1, property);\n    }\n    /** @override */\n    getSpan(b, offset = 0) {\n        checkUint8Array(b);\n        let idx = offset;\n        while ((idx < b.length) && (0 !== b[idx])) {\n            idx += 1;\n        }\n        return 1 + idx - offset;\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        const span = this.getSpan(b, offset);\n        return uint8ArrayToBuffer(b).slice(offset, offset + span - 1).toString('utf-8');\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        /* Must force this to a string, lest it be a number and the\n         * \"utf8-encoding\" below actually allocate a buffer of length\n         * src */\n        if ('string' !== typeof src) {\n            src = String(src);\n        }\n        const srcb = buffer_1.Buffer.from(src, 'utf8');\n        const span = srcb.length;\n        if ((offset + span) > b.length) {\n            throw new RangeError('encoding overruns Buffer');\n        }\n        const buffer = uint8ArrayToBuffer(b);\n        srcb.copy(buffer, offset);\n        buffer[offset + span] = 0;\n        return span + 1;\n    }\n}\nexports.CString = CString;\n/**\n * Contain a UTF8 string with implicit length.\n *\n * *Factory*: {@link module:Layout.utf8|utf8}\n *\n * **NOTE** Because the length is implicit in the size of the buffer\n * this layout should be used only in isolation, or in a situation\n * where the length can be expressed by operating on a slice of the\n * containing buffer.\n *\n * @param {Number} [maxSpan] - the maximum length allowed for encoded\n * string content.  If not provided there is no bound on the allowed\n * content.\n *\n * @param {String} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass UTF8 extends Layout {\n    constructor(maxSpan, property) {\n        if (('string' === typeof maxSpan) && (undefined === property)) {\n            property = maxSpan;\n            maxSpan = undefined;\n        }\n        if (undefined === maxSpan) {\n            maxSpan = -1;\n        }\n        else if (!Number.isInteger(maxSpan)) {\n            throw new TypeError('maxSpan must be an integer');\n        }\n        super(-1, property);\n        /** The maximum span of the layout in bytes.\n         *\n         * Positive values are generally expected.  Zero is abnormal.\n         * Attempts to encode or decode a value that exceeds this length\n         * will throw a `RangeError`.\n         *\n         * A negative value indicates that there is no bound on the length\n         * of the content. */\n        this.maxSpan = maxSpan;\n    }\n    /** @override */\n    getSpan(b, offset = 0) {\n        checkUint8Array(b);\n        return b.length - offset;\n    }\n    /** @override */\n    decode(b, offset = 0) {\n        const span = this.getSpan(b, offset);\n        if ((0 <= this.maxSpan)\n            && (this.maxSpan < span)) {\n            throw new RangeError('text length exceeds maxSpan');\n        }\n        return uint8ArrayToBuffer(b).slice(offset, offset + span).toString('utf-8');\n    }\n    /** @override */\n    encode(src, b, offset = 0) {\n        /* Must force this to a string, lest it be a number and the\n         * \"utf8-encoding\" below actually allocate a buffer of length\n         * src */\n        if ('string' !== typeof src) {\n            src = String(src);\n        }\n        const srcb = buffer_1.Buffer.from(src, 'utf8');\n        const span = srcb.length;\n        if ((0 <= this.maxSpan)\n            && (this.maxSpan < span)) {\n            throw new RangeError('text length exceeds maxSpan');\n        }\n        if ((offset + span) > b.length) {\n            throw new RangeError('encoding overruns Buffer');\n        }\n        srcb.copy(uint8ArrayToBuffer(b), offset);\n        return span;\n    }\n}\nexports.UTF8 = UTF8;\n/**\n * Contain a constant value.\n *\n * This layout may be used in cases where a JavaScript value can be\n * inferred without an expression in the binary encoding.  An example\n * would be a {@link VariantLayout|variant layout} where the content\n * is implied by the union {@link Union#discriminator|discriminator}.\n *\n * @param {Object|Number|String} value - initializer for {@link\n * Constant#value|value}.  If the value is an object (or array) and\n * the application intends the object to remain unchanged regardless\n * of what is done to values decoded by this layout, the value should\n * be frozen prior passing it to this constructor.\n *\n * @param {String} [property] - initializer for {@link\n * Layout#property|property}.\n *\n * @augments {Layout}\n */\nclass Constant extends Layout {\n    constructor(value, property) {\n        super(0, property);\n        /** The value produced by this constant when the layout is {@link\n         * Constant#decode|decoded}.\n         *\n         * Any JavaScript value including `null` and `undefined` is\n         * permitted.\n         *\n         * **WARNING** If `value` passed in the constructor was not\n         * frozen, it is possible for users of decoded values to change\n         * the content of the value. */\n        this.value = value;\n    }\n    /** @override */\n    decode(b, offset) {\n        return this.value;\n    }\n    /** @override */\n    encode(src, b, offset) {\n        /* Constants take no space */\n        return 0;\n    }\n}\nexports.Constant = Constant;\n/** Factory for {@link GreedyCount}. */\nexports.greedy = ((elementSpan, property) => new GreedyCount(elementSpan, property));\n/** Factory for {@link OffsetLayout}. */\nexports.offset = ((layout, offset, property) => new OffsetLayout(layout, offset, property));\n/** Factory for {@link UInt|unsigned int layouts} spanning one\n * byte. */\nexports.u8 = ((property) => new UInt(1, property));\n/** Factory for {@link UInt|little-endian unsigned int layouts}\n * spanning two bytes. */\nexports.u16 = ((property) => new UInt(2, property));\n/** Factory for {@link UInt|little-endian unsigned int layouts}\n * spanning three bytes. */\nexports.u24 = ((property) => new UInt(3, property));\n/** Factory for {@link UInt|little-endian unsigned int layouts}\n * spanning four bytes. */\nexports.u32 = ((property) => new UInt(4, property));\n/** Factory for {@link UInt|little-endian unsigned int layouts}\n * spanning five bytes. */\nexports.u40 = ((property) => new UInt(5, property));\n/** Factory for {@link UInt|little-endian unsigned int layouts}\n * spanning six bytes. */\nexports.u48 = ((property) => new UInt(6, property));\n/** Factory for {@link NearUInt64|little-endian unsigned int\n * layouts} interpreted as Numbers. */\nexports.nu64 = ((property) => new NearUInt64(property));\n/** Factory for {@link UInt|big-endian unsigned int layouts}\n * spanning two bytes. */\nexports.u16be = ((property) => new UIntBE(2, property));\n/** Factory for {@link UInt|big-endian unsigned int layouts}\n * spanning three bytes. */\nexports.u24be = ((property) => new UIntBE(3, property));\n/** Factory for {@link UInt|big-endian unsigned int layouts}\n * spanning four bytes. */\nexports.u32be = ((property) => new UIntBE(4, property));\n/** Factory for {@link UInt|big-endian unsigned int layouts}\n * spanning five bytes. */\nexports.u40be = ((property) => new UIntBE(5, property));\n/** Factory for {@link UInt|big-endian unsigned int layouts}\n * spanning six bytes. */\nexports.u48be = ((property) => new UIntBE(6, property));\n/** Factory for {@link NearUInt64BE|big-endian unsigned int\n * layouts} interpreted as Numbers. */\nexports.nu64be = ((property) => new NearUInt64BE(property));\n/** Factory for {@link Int|signed int layouts} spanning one\n * byte. */\nexports.s8 = ((property) => new Int(1, property));\n/** Factory for {@link Int|little-endian signed int layouts}\n * spanning two bytes. */\nexports.s16 = ((property) => new Int(2, property));\n/** Factory for {@link Int|little-endian signed int layouts}\n * spanning three bytes. */\nexports.s24 = ((property) => new Int(3, property));\n/** Factory for {@link Int|little-endian signed int layouts}\n * spanning four bytes. */\nexports.s32 = ((property) => new Int(4, property));\n/** Factory for {@link Int|little-endian signed int layouts}\n * spanning five bytes. */\nexports.s40 = ((property) => new Int(5, property));\n/** Factory for {@link Int|little-endian signed int layouts}\n * spanning six bytes. */\nexports.s48 = ((property) => new Int(6, property));\n/** Factory for {@link NearInt64|little-endian signed int layouts}\n * interpreted as Numbers. */\nexports.ns64 = ((property) => new NearInt64(property));\n/** Factory for {@link Int|big-endian signed int layouts}\n * spanning two bytes. */\nexports.s16be = ((property) => new IntBE(2, property));\n/** Factory for {@link Int|big-endian signed int layouts}\n * spanning three bytes. */\nexports.s24be = ((property) => new IntBE(3, property));\n/** Factory for {@link Int|big-endian signed int layouts}\n * spanning four bytes. */\nexports.s32be = ((property) => new IntBE(4, property));\n/** Factory for {@link Int|big-endian signed int layouts}\n * spanning five bytes. */\nexports.s40be = ((property) => new IntBE(5, property));\n/** Factory for {@link Int|big-endian signed int layouts}\n * spanning six bytes. */\nexports.s48be = ((property) => new IntBE(6, property));\n/** Factory for {@link NearInt64BE|big-endian signed int layouts}\n * interpreted as Numbers. */\nexports.ns64be = ((property) => new NearInt64BE(property));\n/** Factory for {@link Float|little-endian 32-bit floating point} values. */\nexports.f32 = ((property) => new Float(property));\n/** Factory for {@link FloatBE|big-endian 32-bit floating point} values. */\nexports.f32be = ((property) => new FloatBE(property));\n/** Factory for {@link Double|little-endian 64-bit floating point} values. */\nexports.f64 = ((property) => new Double(property));\n/** Factory for {@link DoubleBE|big-endian 64-bit floating point} values. */\nexports.f64be = ((property) => new DoubleBE(property));\n/** Factory for {@link Structure} values. */\nexports.struct = ((fields, property, decodePrefixes) => new Structure(fields, property, decodePrefixes));\n/** Factory for {@link BitStructure} values. */\nexports.bits = ((word, msb, property) => new BitStructure(word, msb, property));\n/** Factory for {@link Sequence} values. */\nexports.seq = ((elementLayout, count, property) => new Sequence(elementLayout, count, property));\n/** Factory for {@link Union} values. */\nexports.union = ((discr, defaultLayout, property) => new Union(discr, defaultLayout, property));\n/** Factory for {@link UnionLayoutDiscriminator} values. */\nexports.unionLayoutDiscriminator = ((layout, property) => new UnionLayoutDiscriminator(layout, property));\n/** Factory for {@link Blob} values. */\nexports.blob = ((length, property) => new Blob(length, property));\n/** Factory for {@link CString} values. */\nexports.cstr = ((property) => new CString(property));\n/** Factory for {@link UTF8} values. */\nexports.utf8 = ((maxSpan, property) => new UTF8(maxSpan, property));\n/** Factory for {@link Constant} values. */\nexports.constant = ((value, property) => new Constant(value, property));\n//# sourceMappingURL=Layout.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac29sYW5hL2J1ZmZlci1sYXlvdXQvbGliL0xheW91dC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxtQ0FBbUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sYUFBYSxNQUFNLDZCQUE2QixHQUFHO0FBQ25ELDhCQUE4QixHQUFHLCtCQUErQjtBQUNoRSxNQUFNLCtCQUErQixHQUFHO0FBQ3hDLDhCQUE4QixPQUFPO0FBQ3JDO0FBQ0EsTUFBTTtBQUNOLGFBQWEsTUFBTSxpQ0FBaUMsR0FBRztBQUN2RCxnQ0FBZ0MsR0FBRyxpQ0FBaUM7QUFDcEUsTUFBTSxpQ0FBaUMsT0FBTztBQUM5QyxpQ0FBaUM7QUFDakMsTUFBTTtBQUNOLGFBQWEsTUFBTSw2QkFBNkIsR0FBRztBQUNuRCw4QkFBOEIsR0FBRywrQkFBK0I7QUFDaEUsTUFBTSwrQkFBK0IsR0FBRztBQUN4Qyw4QkFBOEIsT0FBTztBQUNyQztBQUNBLE1BQU07QUFDTixXQUFXLGlDQUFpQyxHQUFHO0FBQy9DLGdDQUFnQyxHQUFHLGlDQUFpQztBQUNwRSxNQUFNLGlDQUFpQyxPQUFPO0FBQzlDLGlDQUFpQztBQUNqQztBQUNBLG1EQUFtRDtBQUNuRCwrQ0FBK0MsR0FBRztBQUNsRCw4Q0FBOEMsR0FBRztBQUNqRCw2Q0FBNkMsT0FBTztBQUNwRCwrQ0FBK0M7QUFDL0Msd0NBQXdDO0FBQ3hDLHNDQUFzQyxLQUFLO0FBQzNDLHFDQUFxQztBQUNyQyx3Q0FBd0M7QUFDeEMsc0NBQXNDLEtBQUs7QUFDM0MscUNBQXFDO0FBQ3JDLE1BQU0scUNBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLE1BQU0s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QVc7QUFDWCxpQkFBaUIsZ0RBQWdEO0FBQ2pFLGFBQWE7QUFDYixpQkFBaUIsa0RBQWtEO0FBQ25FLFdBQVc7QUFDWCxpQkFBaUIsaURBQWlEO0FBQ2xFLGFBQWE7QUFDYixpQkFBaUIsaUJBQWlCO0FBQ2xDLGNBQWM7QUFDZCxpQkFBaUIsb0JBQW9CO0FBQ3JDLFlBQVk7QUFDWixpQkFBaUIsZ0JBQWdCO0FBQ2pDLFdBQVc7QUFDWCxpQkFBaUIsYUFBYTtBQUM5QixhQUFhO0FBQ2IsaUJBQWlCLGdDQUFnQztBQUNqRCxnQ0FBZ0M7QUFDaEMsaUJBQWlCLFlBQVk7QUFDN0IsWUFBWTtBQUNaLGlCQUFpQixlQUFlO0FBQ2hDLFlBQVk7QUFDWixpQkFBaUIsWUFBWTtBQUM3QixZQUFZO0FBQ1osaUJBQWlCLGdCQUFnQjtBQUNqQyxnQkFBZ0I7QUFDaEIiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQHNvbGFuYS9idWZmZXItbGF5b3V0L2xpYi9MYXlvdXQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyogVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKlxuICogQ29weXJpZ2h0IDIwMTUtMjAxOCBQZXRlciBBLiBCaWdvdFxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4gKiBUSEUgU09GVFdBUkUuXG4gKi9cbi8qKlxuICogU3VwcG9ydCBmb3IgdHJhbnNsYXRpbmcgYmV0d2VlbiBVaW50OEFycmF5IGluc3RhbmNlcyBhbmQgSmF2YVNjcmlwdFxuICogbmF0aXZlIHR5cGVzLlxuICpcbiAqIHtAbGluayBtb2R1bGU6TGF5b3V0fkxheW91dHxMYXlvdXR9IGlzIHRoZSBiYXNpcyBvZiBhIGNsYXNzXG4gKiBoaWVyYXJjaHkgdGhhdCBhc3NvY2lhdGVzIHByb3BlcnR5IG5hbWVzIHdpdGggc2VxdWVuY2VzIG9mIGVuY29kZWRcbiAqIGJ5dGVzLlxuICpcbiAqIExheW91dHMgYXJlIHN1cHBvcnRlZCBmb3IgdGhlc2Ugc2NhbGFyIChudW1lcmljKSB0eXBlczpcbiAqICoge0BsaW5rIG1vZHVsZTpMYXlvdXR+VUludHxVbnNpZ25lZCBpbnRlZ2VycyBpbiBsaXR0bGUtZW5kaWFuXG4gKiAgIGZvcm1hdH0gd2l0aCB7QGxpbmsgbW9kdWxlOkxheW91dC51OHw4LWJpdH0sIHtAbGlua1xuICogICBtb2R1bGU6TGF5b3V0LnUxNnwxNi1iaXR9LCB7QGxpbmsgbW9kdWxlOkxheW91dC51MjR8MjQtYml0fSxcbiAqICAge0BsaW5rIG1vZHVsZTpMYXlvdXQudTMyfDMyLWJpdH0sIHtAbGlua1xuICogICBtb2R1bGU6TGF5b3V0LnU0MHw0MC1iaXR9LCBhbmQge0BsaW5rIG1vZHVsZTpMYXlvdXQudTQ4fDQ4LWJpdH1cbiAqICAgcmVwcmVzZW50YXRpb24gcmFuZ2VzO1xuICogKiB7QGxpbmsgbW9kdWxlOkxheW91dH5VSW50QkV8VW5zaWduZWQgaW50ZWdlcnMgaW4gYmlnLWVuZGlhblxuICogICBmb3JtYXR9IHdpdGgge0BsaW5rIG1vZHVsZTpMYXlvdXQudTE2YmV8MTYtYml0fSwge0BsaW5rXG4gKiAgIG1vZHVsZTpMYXlvdXQudTI0YmV8MjQtYml0fSwge0BsaW5rIG1vZHVsZTpMYXlvdXQudTMyYmV8MzItYml0fSxcbiAqICAge0BsaW5rIG1vZHVsZTpMYXlvdXQudTQwYmV8NDAtYml0fSwgYW5kIHtAbGlua1xuICogICBtb2R1bGU6TGF5b3V0LnU0OGJlfDQ4LWJpdH0gcmVwcmVzZW50YXRpb24gcmFuZ2VzO1xuICogKiB7QGxpbmsgbW9kdWxlOkxheW91dH5JbnR8U2lnbmVkIGludGVnZXJzIGluIGxpdHRsZS1lbmRpYW5cbiAqICAgZm9ybWF0fSB3aXRoIHtAbGluayBtb2R1bGU6TGF5b3V0LnM4fDgtYml0fSwge0BsaW5rXG4gKiAgIG1vZHVsZTpMYXlvdXQuczE2fDE2LWJpdH0sIHtAbGluayBtb2R1bGU6TGF5b3V0LnMyNHwyNC1iaXR9LFxuICogICB7QGxpbmsgbW9kdWxlOkxheW91dC5zMzJ8MzItYml0fSwge0BsaW5rXG4gKiAgIG1vZHVsZTpMYXlvdXQuczQwfDQwLWJpdH0sIGFuZCB7QGxpbmsgbW9kdWxlOkxheW91dC5zNDh8NDgtYml0fVxuICogICByZXByZXNlbnRhdGlvbiByYW5nZXM7XG4gKiAqIHtAbGluayBtb2R1bGU6TGF5b3V0fkludEJFfFNpZ25lZCBpbnRlZ2VycyBpbiBiaWctZW5kaWFuIGZvcm1hdH1cbiAqICAgd2l0aCB7QGxpbmsgbW9kdWxlOkxheW91dC5zMTZiZXwxNi1iaXR9LCB7QGxpbmtcbiAqICAgbW9kdWxlOkxheW91dC5zMjRiZXwyNC1iaXR9LCB7QGxpbmsgbW9kdWxlOkxheW91dC5zMzJiZXwzMi1iaXR9LFxuICogICB7QGxpbmsgbW9kdWxlOkxheW91dC5zNDBiZXw0MC1iaXR9LCBhbmQge0BsaW5rXG4gKiAgIG1vZHVsZTpMYXlvdXQuczQ4YmV8NDgtYml0fSByZXByZXNlbnRhdGlvbiByYW5nZXM7XG4gKiAqIDY0LWJpdCBpbnRlZ3JhbCB2YWx1ZXMgdGhhdCBkZWNvZGUgdG8gYW4gZXhhY3QgKGlmIG1hZ25pdHVkZSBpc1xuICogICBsZXNzIHRoYW4gMl41Mykgb3IgbmVhcmJ5IGludGVncmFsIE51bWJlciBpbiB7QGxpbmtcbiAqICAgbW9kdWxlOkxheW91dC5udTY0fHVuc2lnbmVkIGxpdHRsZS1lbmRpYW59LCB7QGxpbmtcbiAqICAgbW9kdWxlOkxheW91dC5udTY0YmV8dW5zaWduZWQgYmlnLWVuZGlhbn0sIHtAbGlua1xuICogICBtb2R1bGU6TGF5b3V0Lm5zNjR8c2lnbmVkIGxpdHRsZS1lbmRpYW59LCBhbmQge0BsaW5rXG4gKiAgIG1vZHVsZTpMYXlvdXQubnM2NGJlfHVuc2lnbmVkIGJpZy1lbmRpYW59IGVuY29kaW5ncztcbiAqICogMzItYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlcyB3aXRoIHtAbGlua1xuICogICBtb2R1bGU6TGF5b3V0LmYzMnxsaXR0bGUtZW5kaWFufSBhbmQge0BsaW5rXG4gKiAgIG1vZHVsZTpMYXlvdXQuZjMyYmV8YmlnLWVuZGlhbn0gcmVwcmVzZW50YXRpb25zO1xuICogKiA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIHdpdGgge0BsaW5rXG4gKiAgIG1vZHVsZTpMYXlvdXQuZjY0fGxpdHRsZS1lbmRpYW59IGFuZCB7QGxpbmtcbiAqICAgbW9kdWxlOkxheW91dC5mNjRiZXxiaWctZW5kaWFufSByZXByZXNlbnRhdGlvbnM7XG4gKiAqIHtAbGluayBtb2R1bGU6TGF5b3V0LmNvbnN0fENvbnN0YW50c30gdGhhdCB0YWtlIG5vIHNwYWNlIGluIHRoZVxuICogICBlbmNvZGVkIGV4cHJlc3Npb24uXG4gKlxuICogYW5kIGZvciB0aGVzZSBhZ2dyZWdhdGUgdHlwZXM6XG4gKiAqIHtAbGluayBtb2R1bGU6TGF5b3V0LnNlcXxTZXF1ZW5jZX1zIG9mIGluc3RhbmNlcyBvZiBhIHtAbGlua1xuICogICBtb2R1bGU6TGF5b3V0fkxheW91dHxMYXlvdXR9LCB3aXRoIEphdmFTY3JpcHQgcmVwcmVzZW50YXRpb24gYXNcbiAqICAgYW4gQXJyYXkgYW5kIGNvbnN0YW50IG9yIGRhdGEtZGVwZW5kZW50IHtAbGlua1xuICogICBtb2R1bGU6TGF5b3V0flNlcXVlbmNlI2NvdW50fGxlbmd0aH07XG4gKiAqIHtAbGluayBtb2R1bGU6TGF5b3V0LnN0cnVjdHxTdHJ1Y3R1cmV9cyB0aGF0IGFnZ3JlZ2F0ZSBhXG4gKiAgIGhldGVyb2dlbmVvdXMgc2VxdWVuY2Ugb2Yge0BsaW5rIG1vZHVsZTpMYXlvdXR+TGF5b3V0fExheW91dH1cbiAqICAgaW5zdGFuY2VzLCB3aXRoIEphdmFTY3JpcHQgcmVwcmVzZW50YXRpb24gYXMgYW4gT2JqZWN0O1xuICogKiB7QGxpbmsgbW9kdWxlOkxheW91dC51bmlvbnxVbmlvbn1zIHRoYXQgc3VwcG9ydCBtdWx0aXBsZSB7QGxpbmtcbiAqICAgbW9kdWxlOkxheW91dH5WYXJpYW50TGF5b3V0fHZhcmlhbnQgbGF5b3V0c30gb3ZlciBhIGZpeGVkXG4gKiAgIChwYWRkZWQpIG9yIHZhcmlhYmxlIChub3QgcGFkZGVkKSBzcGFuIG9mIGJ5dGVzLCB1c2luZyBhblxuICogICB1bnNpZ25lZCBpbnRlZ2VyIGF0IHRoZSBzdGFydCBvZiB0aGUgZGF0YSBvciBhIHNlcGFyYXRlIHtAbGlua1xuICogICBtb2R1bGU6TGF5b3V0LnVuaW9uTGF5b3V0RGlzY3JpbWluYXRvcnxsYXlvdXQgZWxlbWVudH0gdG9cbiAqICAgZGV0ZXJtaW5lIHdoaWNoIGxheW91dCB0byB1c2Ugd2hlbiBpbnRlcnByZXRpbmcgdGhlIGJ1ZmZlclxuICogICBjb250ZW50cztcbiAqICoge0BsaW5rIG1vZHVsZTpMYXlvdXQuYml0c3xCaXRTdHJ1Y3R1cmV9cyB0aGF0IGNvbnRhaW4gYSBzZXF1ZW5jZVxuICogICBvZiBpbmRpdmlkdWFsIHtAbGlua1xuICogICBtb2R1bGU6TGF5b3V0fkJpdFN0cnVjdHVyZSNhZGRGaWVsZHxCaXRGaWVsZH1zIHBhY2tlZCBpbnRvIGFuIDgsXG4gKiAgIDE2LCAyNCwgb3IgMzItYml0IHVuc2lnbmVkIGludGVnZXIgc3RhcnRpbmcgYXQgdGhlIGxlYXN0LSBvclxuICogICBtb3N0LXNpZ25pZmljYW50IGJpdDtcbiAqICoge0BsaW5rIG1vZHVsZTpMYXlvdXQuY3N0cnxDIHN0cmluZ3N9IG9mIHZhcnlpbmcgbGVuZ3RoO1xuICogKiB7QGxpbmsgbW9kdWxlOkxheW91dC5ibG9ifEJsb2JzfSBvZiBmaXhlZC0gb3IgdmFyaWFibGUte0BsaW5rXG4gKiAgIG1vZHVsZTpMYXlvdXR+QmxvYiNsZW5ndGh8bGVuZ3RofSByYXcgZGF0YS5cbiAqXG4gKiBBbGwge0BsaW5rIG1vZHVsZTpMYXlvdXR+TGF5b3V0fExheW91dH0gaW5zdGFuY2VzIGFyZSBpbW11dGFibGVcbiAqIGFmdGVyIGNvbnN0cnVjdGlvbiwgdG8gcHJldmVudCBpbnRlcm5hbCBzdGF0ZSBmcm9tIGJlY29taW5nXG4gKiBpbmNvbnNpc3RlbnQuXG4gKlxuICogQGxvY2FsIExheW91dFxuICogQGxvY2FsIEV4dGVybmFsTGF5b3V0XG4gKiBAbG9jYWwgR3JlZWR5Q291bnRcbiAqIEBsb2NhbCBPZmZzZXRMYXlvdXRcbiAqIEBsb2NhbCBVSW50XG4gKiBAbG9jYWwgVUludEJFXG4gKiBAbG9jYWwgSW50XG4gKiBAbG9jYWwgSW50QkVcbiAqIEBsb2NhbCBOZWFyVUludDY0XG4gKiBAbG9jYWwgTmVhclVJbnQ2NEJFXG4gKiBAbG9jYWwgTmVhckludDY0XG4gKiBAbG9jYWwgTmVhckludDY0QkVcbiAqIEBsb2NhbCBGbG9hdFxuICogQGxvY2FsIEZsb2F0QkVcbiAqIEBsb2NhbCBEb3VibGVcbiAqIEBsb2NhbCBEb3VibGVCRVxuICogQGxvY2FsIFNlcXVlbmNlXG4gKiBAbG9jYWwgU3RydWN0dXJlXG4gKiBAbG9jYWwgVW5pb25EaXNjcmltaW5hdG9yXG4gKiBAbG9jYWwgVW5pb25MYXlvdXREaXNjcmltaW5hdG9yXG4gKiBAbG9jYWwgVW5pb25cbiAqIEBsb2NhbCBWYXJpYW50TGF5b3V0XG4gKiBAbG9jYWwgQml0U3RydWN0dXJlXG4gKiBAbG9jYWwgQml0RmllbGRcbiAqIEBsb2NhbCBCb29sZWFuXG4gKiBAbG9jYWwgQmxvYlxuICogQGxvY2FsIENTdHJpbmdcbiAqIEBsb2NhbCBDb25zdGFudFxuICogQGxvY2FsIGJpbmRDb25zdHJ1Y3RvckxheW91dFxuICogQG1vZHVsZSBMYXlvdXRcbiAqIEBsaWNlbnNlIE1JVFxuICogQGF1dGhvciBQZXRlciBBLiBCaWdvdFxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3BhYmlnb3QvYnVmZmVyLWxheW91dHxidWZmZXItbGF5b3V0IG9uIEdpdEh1Yn1cbiAqL1xuJ3VzZSBzdHJpY3QnO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5zMTYgPSBleHBvcnRzLnM4ID0gZXhwb3J0cy5udTY0YmUgPSBleHBvcnRzLnU0OGJlID0gZXhwb3J0cy51NDBiZSA9IGV4cG9ydHMudTMyYmUgPSBleHBvcnRzLnUyNGJlID0gZXhwb3J0cy51MTZiZSA9IGV4cG9ydHMubnU2NCA9IGV4cG9ydHMudTQ4ID0gZXhwb3J0cy51NDAgPSBleHBvcnRzLnUzMiA9IGV4cG9ydHMudTI0ID0gZXhwb3J0cy51MTYgPSBleHBvcnRzLnU4ID0gZXhwb3J0cy5vZmZzZXQgPSBleHBvcnRzLmdyZWVkeSA9IGV4cG9ydHMuQ29uc3RhbnQgPSBleHBvcnRzLlVURjggPSBleHBvcnRzLkNTdHJpbmcgPSBleHBvcnRzLkJsb2IgPSBleHBvcnRzLkJvb2xlYW4gPSBleHBvcnRzLkJpdEZpZWxkID0gZXhwb3J0cy5CaXRTdHJ1Y3R1cmUgPSBleHBvcnRzLlZhcmlhbnRMYXlvdXQgPSBleHBvcnRzLlVuaW9uID0gZXhwb3J0cy5VbmlvbkxheW91dERpc2NyaW1pbmF0b3IgPSBleHBvcnRzLlVuaW9uRGlzY3JpbWluYXRvciA9IGV4cG9ydHMuU3RydWN0dXJlID0gZXhwb3J0cy5TZXF1ZW5jZSA9IGV4cG9ydHMuRG91YmxlQkUgPSBleHBvcnRzLkRvdWJsZSA9IGV4cG9ydHMuRmxvYXRCRSA9IGV4cG9ydHMuRmxvYXQgPSBleHBvcnRzLk5lYXJJbnQ2NEJFID0gZXhwb3J0cy5OZWFySW50NjQgPSBleHBvcnRzLk5lYXJVSW50NjRCRSA9IGV4cG9ydHMuTmVhclVJbnQ2NCA9IGV4cG9ydHMuSW50QkUgPSBleHBvcnRzLkludCA9IGV4cG9ydHMuVUludEJFID0gZXhwb3J0cy5VSW50ID0gZXhwb3J0cy5PZmZzZXRMYXlvdXQgPSBleHBvcnRzLkdyZWVkeUNvdW50ID0gZXhwb3J0cy5FeHRlcm5hbExheW91dCA9IGV4cG9ydHMuYmluZENvbnN0cnVjdG9yTGF5b3V0ID0gZXhwb3J0cy5uYW1lV2l0aFByb3BlcnR5ID0gZXhwb3J0cy5MYXlvdXQgPSBleHBvcnRzLnVpbnQ4QXJyYXlUb0J1ZmZlciA9IGV4cG9ydHMuY2hlY2tVaW50OEFycmF5ID0gdm9pZCAwO1xuZXhwb3J0cy5jb25zdGFudCA9IGV4cG9ydHMudXRmOCA9IGV4cG9ydHMuY3N0ciA9IGV4cG9ydHMuYmxvYiA9IGV4cG9ydHMudW5pb25MYXlvdXREaXNjcmltaW5hdG9yID0gZXhwb3J0cy51bmlvbiA9IGV4cG9ydHMuc2VxID0gZXhwb3J0cy5iaXRzID0gZXhwb3J0cy5zdHJ1Y3QgPSBleHBvcnRzLmY2NGJlID0gZXhwb3J0cy5mNjQgPSBleHBvcnRzLmYzMmJlID0gZXhwb3J0cy5mMzIgPSBleHBvcnRzLm5zNjRiZSA9IGV4cG9ydHMuczQ4YmUgPSBleHBvcnRzLnM0MGJlID0gZXhwb3J0cy5zMzJiZSA9IGV4cG9ydHMuczI0YmUgPSBleHBvcnRzLnMxNmJlID0gZXhwb3J0cy5uczY0ID0gZXhwb3J0cy5zNDggPSBleHBvcnRzLnM0MCA9IGV4cG9ydHMuczMyID0gZXhwb3J0cy5zMjQgPSB2b2lkIDA7XG5jb25zdCBidWZmZXJfMSA9IHJlcXVpcmUoXCJidWZmZXJcIik7XG4vKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgVWludDhBcnJheS5cbiAqXG4gKiBAaWdub3JlICovXG5mdW5jdGlvbiBjaGVja1VpbnQ4QXJyYXkoYikge1xuICAgIGlmICghKGIgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdiIG11c3QgYmUgYSBVaW50OEFycmF5Jyk7XG4gICAgfVxufVxuZXhwb3J0cy5jaGVja1VpbnQ4QXJyYXkgPSBjaGVja1VpbnQ4QXJyYXk7XG4vKiBDcmVhdGUgYSBCdWZmZXIgaW5zdGFuY2UgZnJvbSBhIFVpbnQ4QXJyYXkuXG4gKlxuICogQGlnbm9yZSAqL1xuZnVuY3Rpb24gdWludDhBcnJheVRvQnVmZmVyKGIpIHtcbiAgICBjaGVja1VpbnQ4QXJyYXkoYik7XG4gICAgcmV0dXJuIGJ1ZmZlcl8xLkJ1ZmZlci5mcm9tKGIuYnVmZmVyLCBiLmJ5dGVPZmZzZXQsIGIubGVuZ3RoKTtcbn1cbmV4cG9ydHMudWludDhBcnJheVRvQnVmZmVyID0gdWludDhBcnJheVRvQnVmZmVyO1xuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBsYXlvdXQgb2JqZWN0cy5cbiAqXG4gKiAqKk5PVEUqKiBUaGlzIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3M7IHlvdSBjYW4gY3JlYXRlIGluc3RhbmNlc1xuICogaWYgaXQgYW11c2VzIHlvdSwgYnV0IHRoZXkgd29uJ3Qgc3VwcG9ydCB0aGUge0BsaW5rXG4gKiBMYXlvdXQjZW5jb2RlfGVuY29kZX0gb3Ige0BsaW5rIExheW91dCNkZWNvZGV8ZGVjb2RlfSBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHNwYW4gLSBJbml0aWFsaXplciBmb3Ige0BsaW5rIExheW91dCNzcGFufHNwYW59LiAgVGhlXG4gKiBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBpbnRlZ2VyOyBhIG5lZ2F0aXZlIHZhbHVlIHNpZ25pZmllcyB0aGF0IHRoZVxuICogc3BhbiBpcyB7QGxpbmsgTGF5b3V0I2dldFNwYW58dmFsdWUtc3BlY2lmaWN9LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gSW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAqXG4gKiBAYWJzdHJhY3RcbiAqL1xuY2xhc3MgTGF5b3V0IHtcbiAgICBjb25zdHJ1Y3RvcihzcGFuLCBwcm9wZXJ0eSkge1xuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoc3BhbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3NwYW4gbXVzdCBiZSBhbiBpbnRlZ2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIFRoZSBzcGFuIG9mIHRoZSBsYXlvdXQgaW4gYnl0ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFBvc2l0aXZlIHZhbHVlcyBhcmUgZ2VuZXJhbGx5IGV4cGVjdGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiBaZXJvIHdpbGwgb25seSBhcHBlYXIgaW4ge0BsaW5rIENvbnN0YW50fXMgYW5kIGluIHtAbGlua1xuICAgICAgICAgKiBTZXF1ZW5jZX1zIHdoZXJlIHRoZSB7QGxpbmsgU2VxdWVuY2UjY291bnR8Y291bnR9IGlzIHplcm8uXG4gICAgICAgICAqXG4gICAgICAgICAqIEEgbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgdGhlIHNwYW4gaXMgdmFsdWUtc3BlY2lmaWMsIGFuZFxuICAgICAgICAgKiBtdXN0IGJlIG9idGFpbmVkIHVzaW5nIHtAbGluayBMYXlvdXQjZ2V0U3BhbnxnZXRTcGFufS4gKi9cbiAgICAgICAgdGhpcy5zcGFuID0gc3BhbjtcbiAgICAgICAgLyoqIFRoZSBwcm9wZXJ0eSBuYW1lIHVzZWQgd2hlbiB0aGlzIGxheW91dCBpcyByZXByZXNlbnRlZCBpbiBhblxuICAgICAgICAgKiBPYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIFVzZWQgb25seSBmb3IgbGF5b3V0cyB0aGF0IHtAbGluayBMYXlvdXQjZGVjb2RlfGRlY29kZX0gdG8gT2JqZWN0XG4gICAgICAgICAqIGluc3RhbmNlcy4gIElmIGxlZnQgdW5kZWZpbmVkIHRoZSBzcGFuIG9mIHRoZSB1bm5hbWVkIGxheW91dCB3aWxsXG4gICAgICAgICAqIGJlIHRyZWF0ZWQgYXMgcGFkZGluZzogaXQgd2lsbCBub3QgYmUgbXV0YXRlZCBieSB7QGxpbmtcbiAgICAgICAgICogTGF5b3V0I2VuY29kZXxlbmNvZGV9IG5vciByZXByZXNlbnRlZCBhcyBhIHByb3BlcnR5IGluIHRoZVxuICAgICAgICAgKiBkZWNvZGVkIE9iamVjdC4gKi9cbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIH1cbiAgICAvKiogRnVuY3Rpb24gdG8gY3JlYXRlIGFuIE9iamVjdCBpbnRvIHdoaWNoIGRlY29kZWQgcHJvcGVydGllcyB3aWxsXG4gICAgICogYmUgd3JpdHRlbi5cbiAgICAgKlxuICAgICAqIFVzZWQgb25seSBmb3IgbGF5b3V0cyB0aGF0IHtAbGluayBMYXlvdXQjZGVjb2RlfGRlY29kZX0gdG8gT2JqZWN0XG4gICAgICogaW5zdGFuY2VzLCB3aGljaCBtZWFuczpcbiAgICAgKiAqIHtAbGluayBTdHJ1Y3R1cmV9XG4gICAgICogKiB7QGxpbmsgVW5pb259XG4gICAgICogKiB7QGxpbmsgVmFyaWFudExheW91dH1cbiAgICAgKiAqIHtAbGluayBCaXRTdHJ1Y3R1cmV9XG4gICAgICpcbiAgICAgKiBJZiBsZWZ0IHVuZGVmaW5lZCB0aGUgSmF2YVNjcmlwdCByZXByZXNlbnRhdGlvbiBvZiB0aGVzZSBsYXlvdXRzXG4gICAgICogd2lsbCBiZSBPYmplY3QgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogU2VlIHtAbGluayBiaW5kQ29uc3RydWN0b3JMYXlvdXR9LlxuICAgICAqL1xuICAgIG1ha2VEZXN0aW5hdGlvbk9iamVjdCgpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgdGhlIHNwYW4gb2YgYSBzcGVjaWZpYyBpbnN0YW5jZSBvZiBhIGxheW91dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7VWludDhBcnJheX0gYiAtIHRoZSBidWZmZXIgdGhhdCBjb250YWlucyBhbiBlbmNvZGVkIGluc3RhbmNlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IFtvZmZzZXRdIC0gdGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZW5jb2RlZCBpbnN0YW5jZVxuICAgICAqIHN0YXJ0cy4gIElmIGFic2VudCBhIHplcm8gb2Zmc2V0IGlzIGluZmVycmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TnVtYmVyfSAtIHRoZSBudW1iZXIgb2YgYnl0ZXMgY292ZXJlZCBieSB0aGUgbGF5b3V0XG4gICAgICogaW5zdGFuY2UuICBJZiB0aGlzIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzIHRoZVxuICAgICAqIGRlZmluaXRpb24tdGltZSBjb25zdGFudCB7QGxpbmsgTGF5b3V0I3NwYW58c3Bhbn0gd2lsbCBiZVxuICAgICAqIHJldHVybmVkLlxuICAgICAqXG4gICAgICogQHRocm93cyB7UmFuZ2VFcnJvcn0gLSBpZiB0aGUgbGVuZ3RoIG9mIHRoZSB2YWx1ZSBjYW5ub3QgYmVcbiAgICAgKiBkZXRlcm1pbmVkLlxuICAgICAqL1xuICAgIGdldFNwYW4oYiwgb2Zmc2V0KSB7XG4gICAgICAgIGlmICgwID4gdGhpcy5zcGFuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXRlcm1pbmF0ZSBzcGFuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuc3BhbjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUmVwbGljYXRlIHRoZSBsYXlvdXQgdXNpbmcgYSBuZXcgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgdXNlZCB0byBnZXQgYSBzdHJ1Y3R1cmFsbHktZXF1aXZhbGVudCBsYXlvdXRcbiAgICAgKiB3aXRoIGEgZGlmZmVyZW50IG5hbWUgc2luY2UgYWxsIHtAbGluayBMYXlvdXR9IGluc3RhbmNlcyBhcmVcbiAgICAgKiBpbW11dGFibGUuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGlzIGlzIGEgc2hhbGxvdyBjb3B5LiAgQWxsIGZpZWxkcyBleGNlcHQge0BsaW5rXG4gICAgICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fSBhcmUgc3RyaWN0bHkgZXF1YWwgdG8gdGhlIG9yaWdpbiBsYXlvdXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgLSB0aGUgdmFsdWUgZm9yIHtAbGlua1xuICAgICAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0gaW4gdGhlIHJlcGxpY2EuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7TGF5b3V0fSAtIHRoZSBjb3B5IHdpdGgge0BsaW5rIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX1cbiAgICAgKiBzZXQgdG8gYHByb3BlcnR5YC5cbiAgICAgKi9cbiAgICByZXBsaWNhdGUocHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgcnYgPSBPYmplY3QuY3JlYXRlKHRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihydiwgdGhpcyk7XG4gICAgICAgIHJ2LnByb3BlcnR5ID0gcHJvcGVydHk7XG4gICAgICAgIHJldHVybiBydjtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIG9iamVjdCBmcm9tIGxheW91dCBwcm9wZXJ0aWVzIGFuZCBhbiBhcnJheSBvZiB2YWx1ZXMuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYHVuZGVmaW5lZGAgaWYgaW52b2tlZCBvbiBhIGxheW91dFxuICAgICAqIHRoYXQgZG9lcyBub3QgcmV0dXJuIGl0cyB2YWx1ZSBhcyBhbiBPYmplY3QuICBPYmplY3RzIGFyZVxuICAgICAqIHJldHVybmVkIGZvciB0aGluZ3MgdGhhdCBhcmUgYSB7QGxpbmsgU3RydWN0dXJlfSwgd2hpY2ggaW5jbHVkZXNcbiAgICAgKiB7QGxpbmsgVmFyaWFudExheW91dHx2YXJpYW50IGxheW91dHN9IGlmIHRoZXkgYXJlIHN0cnVjdHVyZXMsIGFuZFxuICAgICAqIGV4Y2x1ZGVzIHtAbGluayBVbmlvbn1zLiAgSWYgeW91IHdhbnQgdGhpcyBmZWF0dXJlIGZvciBhIHVuaW9uXG4gICAgICogeW91IG11c3QgdXNlIHtAbGluayBVbmlvbi5nZXRWYXJpYW50fGdldFZhcmlhbnR9IHRvIHNlbGVjdCB0aGVcbiAgICAgKiBkZXNpcmVkIGxheW91dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyAtIGFuIGFycmF5IG9mIHZhbHVlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlXG4gICAgICogZGVmYXVsdCBvcmRlciBmb3IgcHJvcGVydGllcy4gIEFzIHdpdGgge0BsaW5rIExheW91dCNkZWNvZGV8ZGVjb2RlfVxuICAgICAqIGxheW91dCBlbGVtZW50cyB0aGF0IGhhdmUgbm8gcHJvcGVydHkgbmFtZSBhcmUgc2tpcHBlZCB3aGVuXG4gICAgICogaXRlcmF0aW5nIG92ZXIgdGhlIGFycmF5IHZhbHVlcy4gIE9ubHkgdGhlIHRvcC1sZXZlbCBwcm9wZXJ0aWVzIGFyZVxuICAgICAqIGFzc2lnbmVkOyBhcmd1bWVudHMgYXJlIG5vdCBhc3NpZ25lZCB0byBwcm9wZXJ0aWVzIG9mIGNvbnRhaW5lZFxuICAgICAqIGxheW91dHMuICBBbnkgdW51c2VkIHZhbHVlcyBhcmUgaWdub3JlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4geyhPYmplY3R8dW5kZWZpbmVkKX1cbiAgICAgKi9cbiAgICBmcm9tQXJyYXkodmFsdWVzKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuZXhwb3J0cy5MYXlvdXQgPSBMYXlvdXQ7XG4vKiBQcm92aWRlIHRleHQgdGhhdCBjYXJyaWVzIGEgbmFtZSAoc3VjaCBhcyBmb3IgYSBmdW5jdGlvbiB0aGF0IHdpbGxcbiAqIGJlIHRocm93aW5nIGFuIGVycm9yKSBhbm5vdGF0ZWQgd2l0aCB0aGUgcHJvcGVydHkgb2YgYSBnaXZlbiBsYXlvdXRcbiAqIChzdWNoIGFzIG9uZSBmb3Igd2hpY2ggdGhlIHZhbHVlIHdhcyB1bmFjY2VwdGFibGUpLlxuICpcbiAqIEBpZ25vcmUgKi9cbmZ1bmN0aW9uIG5hbWVXaXRoUHJvcGVydHkobmFtZSwgbG8pIHtcbiAgICBpZiAobG8ucHJvcGVydHkpIHtcbiAgICAgICAgcmV0dXJuIG5hbWUgKyAnWycgKyBsby5wcm9wZXJ0eSArICddJztcbiAgICB9XG4gICAgcmV0dXJuIG5hbWU7XG59XG5leHBvcnRzLm5hbWVXaXRoUHJvcGVydHkgPSBuYW1lV2l0aFByb3BlcnR5O1xuLyoqXG4gKiBBdWdtZW50IGEgY2xhc3Mgc28gdGhhdCBpbnN0YW5jZXMgY2FuIGJlIGVuY29kZWQvZGVjb2RlZCB1c2luZyBhXG4gKiBnaXZlbiBsYXlvdXQuXG4gKlxuICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIGNvdXBsZXMgYENsYXNzYCB3aXRoIGBsYXlvdXRgIGluIHNldmVyYWwgd2F5czpcbiAqXG4gKiAqIGBDbGFzcy5sYXlvdXRfYCBiZWNvbWVzIGEgc3RhdGljIG1lbWJlciBwcm9wZXJ0eSBlcXVhbCB0byBgbGF5b3V0YDtcbiAqICogYGxheW91dC5ib3VuZENvbnN0cnVjdG9yX2AgYmVjb21lcyBhIHN0YXRpYyBtZW1iZXIgcHJvcGVydHkgZXF1YWxcbiAqICAgIHRvIGBDbGFzc2A7XG4gKiAqIFRoZSB7QGxpbmsgTGF5b3V0I21ha2VEZXN0aW5hdGlvbk9iamVjdHxtYWtlRGVzdGluYXRpb25PYmplY3QoKX1cbiAqICAgcHJvcGVydHkgb2YgYGxheW91dGAgaXMgc2V0IHRvIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgYG5ld1xuICogICBDbGFzcygpYDtcbiAqICogYENsYXNzLmRlY29kZShiLCBvZmZzZXQpYCBiZWNvbWVzIGEgc3RhdGljIG1lbWJlciBmdW5jdGlvbiB0aGF0XG4gKiAgIGRlbGVnYXRlcyB0byB7QGxpbmsgTGF5b3V0I2RlY29kZXxsYXlvdXQuZGVjb2RlfS4gIFRoZVxuICogICBzeW50aGVzaXplZCBmdW5jdGlvbiBtYXkgYmUgY2FwdHVyZWQgYW5kIGV4dGVuZGVkLlxuICogKiBgQ2xhc3MucHJvdG90eXBlLmVuY29kZShiLCBvZmZzZXQpYCBwcm92aWRlcyBhbiBpbnN0YW5jZSBtZW1iZXJcbiAqICAgZnVuY3Rpb24gdGhhdCBkZWxlZ2F0ZXMgdG8ge0BsaW5rIExheW91dCNlbmNvZGV8bGF5b3V0LmVuY29kZX1cbiAqICAgd2l0aCBgc3JjYCBzZXQgdG8gYHRoaXNgLiAgVGhlIHN5bnRoZXNpemVkIGZ1bmN0aW9uIG1heSBiZVxuICogICBjYXB0dXJlZCBhbmQgZXh0ZW5kZWQsIGJ1dCB3aGVuIHRoZSBleHRlbnNpb24gaXMgaW52b2tlZCBgdGhpc2BcbiAqICAgbXVzdCBiZSBleHBsaWNpdGx5IGJvdW5kIHRvIHRoZSBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge2NsYXNzfSBDbGFzcyAtIGEgSmF2YVNjcmlwdCBjbGFzcyB3aXRoIGEgbnVsbGFyeVxuICogY29uc3RydWN0b3IuXG4gKlxuICogQHBhcmFtIHtMYXlvdXR9IGxheW91dCAtIHRoZSB7QGxpbmsgTGF5b3V0fSBpbnN0YW5jZSB1c2VkIHRvIGVuY29kZVxuICogaW5zdGFuY2VzIG9mIGBDbGFzc2AuXG4gKi9cbi8vIGBDbGFzc2AgbXVzdCBiZSBhIGNvbnN0cnVjdG9yIEZ1bmN0aW9uLCBidXQgdGhlIGFzc2lnbm1lbnQgb2YgYSBgbGF5b3V0X2AgcHJvcGVydHkgdG8gaXQgbWFrZXMgaXQgZGlmZmljdWx0IHRvIHR5cGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvZXhwbGljaXQtbW9kdWxlLWJvdW5kYXJ5LXR5cGVzXG5mdW5jdGlvbiBiaW5kQ29uc3RydWN0b3JMYXlvdXQoQ2xhc3MsIGxheW91dCkge1xuICAgIGlmICgnZnVuY3Rpb24nICE9PSB0eXBlb2YgQ2xhc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2xhc3MgbXVzdCBiZSBjb25zdHJ1Y3RvcicpO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKENsYXNzLCAnbGF5b3V0XycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignQ2xhc3MgaXMgYWxyZWFkeSBib3VuZCB0byBhIGxheW91dCcpO1xuICAgIH1cbiAgICBpZiAoIShsYXlvdXQgJiYgKGxheW91dCBpbnN0YW5jZW9mIExheW91dCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xheW91dCBtdXN0IGJlIGEgTGF5b3V0Jyk7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobGF5b3V0LCAnYm91bmRDb25zdHJ1Y3Rvcl8nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xheW91dCBpcyBhbHJlYWR5IGJvdW5kIHRvIGEgY29uc3RydWN0b3InKTtcbiAgICB9XG4gICAgQ2xhc3MubGF5b3V0XyA9IGxheW91dDtcbiAgICBsYXlvdXQuYm91bmRDb25zdHJ1Y3Rvcl8gPSBDbGFzcztcbiAgICBsYXlvdXQubWFrZURlc3RpbmF0aW9uT2JqZWN0ID0gKCgpID0+IG5ldyBDbGFzcygpKTtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2xhc3MucHJvdG90eXBlLCAnZW5jb2RlJywge1xuICAgICAgICB2YWx1ZShiLCBvZmZzZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBsYXlvdXQuZW5jb2RlKHRoaXMsIGIsIG9mZnNldCk7XG4gICAgICAgIH0sXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIH0pO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDbGFzcywgJ2RlY29kZScsIHtcbiAgICAgICAgdmFsdWUoYiwgb2Zmc2V0KSB7XG4gICAgICAgICAgICByZXR1cm4gbGF5b3V0LmRlY29kZShiLCBvZmZzZXQpO1xuICAgICAgICB9LFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB9KTtcbn1cbmV4cG9ydHMuYmluZENvbnN0cnVjdG9yTGF5b3V0ID0gYmluZENvbnN0cnVjdG9yTGF5b3V0O1xuLyoqXG4gKiBBbiBvYmplY3QgdGhhdCBiZWhhdmVzIGxpa2UgYSBsYXlvdXQgYnV0IGRvZXMgbm90IGNvbnN1bWUgc3BhY2VcbiAqIHdpdGhpbiBpdHMgY29udGFpbmluZyBsYXlvdXQuXG4gKlxuICogVGhpcyBpcyBwcmltYXJpbHkgdXNlZCB0byBvYnRhaW4gbWV0YWRhdGEgYWJvdXQgYSBtZW1iZXIsIHN1Y2ggYXMgYVxuICoge0BsaW5rIE9mZnNldExheW91dH0gdGhhdCBjYW4gcHJvdmlkZSBkYXRhIGFib3V0IGEge0BsaW5rXG4gKiBMYXlvdXQjZ2V0U3Bhbnx2YWx1ZS1zcGVjaWZpYyBzcGFufS5cbiAqXG4gKiAqKk5PVEUqKiBUaGlzIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3M7IHlvdSBjYW4gY3JlYXRlIGluc3RhbmNlc1xuICogaWYgaXQgYW11c2VzIHlvdSwgYnV0IHRoZXkgd29uJ3Qgc3VwcG9ydCB7QGxpbmtcbiAqIEV4dGVybmFsTGF5b3V0I2lzQ291bnR8aXNDb3VudH0gb3Igb3RoZXIge0BsaW5rIExheW91dH0gZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBzcGFuIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGluayBMYXlvdXQjc3BhbnxzcGFufS5cbiAqIFRoZSBwYXJhbWV0ZXIgY2FuIHJhbmdlIGZyb20gMSB0aHJvdWdoIDYuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICpcbiAqIEBhYnN0cmFjdFxuICogQGF1Z21lbnRzIHtMYXlvdXR9XG4gKi9cbmNsYXNzIEV4dGVybmFsTGF5b3V0IGV4dGVuZHMgTGF5b3V0IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYHRydWVgIGlmZiB0aGUgZXh0ZXJuYWwgbGF5b3V0IGRlY29kZXMgdG8gYW4gdW5zaWduZWRcbiAgICAgKiBpbnRlZ2VyIGxheW91dC5cbiAgICAgKlxuICAgICAqIEluIHRoYXQgY2FzZSBpdCBjYW4gYmUgdXNlZCBhcyB0aGUgc291cmNlIG9mIHtAbGlua1xuICAgICAqIFNlcXVlbmNlI2NvdW50fFNlcXVlbmNlIGNvdW50c30sIHtAbGluayBCbG9iI2xlbmd0aHxCbG9iIGxlbmd0aHN9LFxuICAgICAqIG9yIGFzIHtAbGluayBVbmlvbkxheW91dERpc2NyaW1pbmF0b3IjbGF5b3V0fGV4dGVybmFsIHVuaW9uXG4gICAgICogZGlzY3JpbWluYXRvcnN9LlxuICAgICAqXG4gICAgICogQGFic3RyYWN0XG4gICAgICovXG4gICAgaXNDb3VudCgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHRlcm5hbExheW91dCBpcyBhYnN0cmFjdCcpO1xuICAgIH1cbn1cbmV4cG9ydHMuRXh0ZXJuYWxMYXlvdXQgPSBFeHRlcm5hbExheW91dDtcbi8qKlxuICogQW4ge0BsaW5rIEV4dGVybmFsTGF5b3V0fSB0aGF0IGRldGVybWluZXMgaXRzIHtAbGlua1xuICogTGF5b3V0I2RlY29kZXx2YWx1ZX0gYmFzZWQgb24gb2Zmc2V0IGludG8gYW5kIGxlbmd0aCBvZiB0aGUgYnVmZmVyXG4gKiBvbiB3aGljaCBpdCBpcyBpbnZva2VkLlxuICpcbiAqICpGYWN0b3J5Kjoge0BsaW5rIG1vZHVsZTpMYXlvdXQuZ3JlZWR5fGdyZWVkeX1cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gW2VsZW1lbnRTcGFuXSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIEdyZWVkeUNvdW50I2VsZW1lbnRTcGFufGVsZW1lbnRTcGFufS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BlcnR5XSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0uXG4gKlxuICogQGF1Z21lbnRzIHtFeHRlcm5hbExheW91dH1cbiAqL1xuY2xhc3MgR3JlZWR5Q291bnQgZXh0ZW5kcyBFeHRlcm5hbExheW91dCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudFNwYW4gPSAxLCBwcm9wZXJ0eSkge1xuICAgICAgICBpZiAoKCFOdW1iZXIuaXNJbnRlZ2VyKGVsZW1lbnRTcGFuKSkgfHwgKDAgPj0gZWxlbWVudFNwYW4pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbGVtZW50U3BhbiBtdXN0IGJlIGEgKHBvc2l0aXZlKSBpbnRlZ2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoLTEsIHByb3BlcnR5KTtcbiAgICAgICAgLyoqIFRoZSBsYXlvdXQgZm9yIGluZGl2aWR1YWwgZWxlbWVudHMgb2YgdGhlIHNlcXVlbmNlLiAgVGhlIHZhbHVlXG4gICAgICAgICAqIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiAgSWYgbm90IHByb3ZpZGVkLCB0aGUgdmFsdWUgd2lsbCBiZVxuICAgICAgICAgKiAxLiAqL1xuICAgICAgICB0aGlzLmVsZW1lbnRTcGFuID0gZWxlbWVudFNwYW47XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBpc0NvdW50KCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZShiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNoZWNrVWludDhBcnJheShiKTtcbiAgICAgICAgY29uc3QgcmVtID0gYi5sZW5ndGggLSBvZmZzZXQ7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHJlbSAvIHRoaXMuZWxlbWVudFNwYW4pO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHNyYywgYiwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbmV4cG9ydHMuR3JlZWR5Q291bnQgPSBHcmVlZHlDb3VudDtcbi8qKlxuICogQW4ge0BsaW5rIEV4dGVybmFsTGF5b3V0fSB0aGF0IHN1cHBvcnRzIGFjY2Vzc2luZyBhIHtAbGluayBMYXlvdXR9XG4gKiBhdCBhIGZpeGVkIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiBhbm90aGVyIExheW91dC4gIFRoZSBvZmZzZXQgbWF5XG4gKiBiZSBiZWZvcmUsIHdpdGhpbiwgb3IgYWZ0ZXIgdGhlIGJhc2UgbGF5b3V0LlxuICpcbiAqICpGYWN0b3J5Kjoge0BsaW5rIG1vZHVsZTpMYXlvdXQub2Zmc2V0fG9mZnNldH1cbiAqXG4gKiBAcGFyYW0ge0xheW91dH0gbGF5b3V0IC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogT2Zmc2V0TGF5b3V0I2xheW91dHxsYXlvdXR9LCBtb2R1bG8gYHByb3BlcnR5YC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gW29mZnNldF0gLSBJbml0aWFsaXplcyB7QGxpbmtcbiAqIE9mZnNldExheW91dCNvZmZzZXR8b2Zmc2V0fS4gIERlZmF1bHRzIHRvIHplcm8uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBPcHRpb25hbCBuZXcgcHJvcGVydHkgbmFtZSBmb3IgYVxuICoge0BsaW5rIExheW91dCNyZXBsaWNhdGV8IHJlcGxpY2F9IG9mIGBsYXlvdXRgIHRvIGJlIHVzZWQgYXMge0BsaW5rXG4gKiBPZmZzZXRMYXlvdXQjbGF5b3V0fGxheW91dH0uICBJZiBub3QgcHJvdmlkZWQgdGhlIGBsYXlvdXRgIGlzIHVzZWRcbiAqIHVuY2hhbmdlZC5cbiAqXG4gKiBAYXVnbWVudHMge0xheW91dH1cbiAqL1xuY2xhc3MgT2Zmc2V0TGF5b3V0IGV4dGVuZHMgRXh0ZXJuYWxMYXlvdXQge1xuICAgIGNvbnN0cnVjdG9yKGxheW91dCwgb2Zmc2V0ID0gMCwgcHJvcGVydHkpIHtcbiAgICAgICAgaWYgKCEobGF5b3V0IGluc3RhbmNlb2YgTGF5b3V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbGF5b3V0IG11c3QgYmUgYSBMYXlvdXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIob2Zmc2V0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignb2Zmc2V0IG11c3QgYmUgaW50ZWdlciBvciB1bmRlZmluZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcihsYXlvdXQuc3BhbiwgcHJvcGVydHkgfHwgbGF5b3V0LnByb3BlcnR5KTtcbiAgICAgICAgLyoqIFRoZSBzdWJvcmRpbmF0ZWQgbGF5b3V0LiAqL1xuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICAgICAgLyoqIFRoZSBsb2NhdGlvbiBvZiB7QGxpbmsgT2Zmc2V0TGF5b3V0I2xheW91dH0gcmVsYXRpdmUgdG8gdGhlXG4gICAgICAgICAqIHN0YXJ0IG9mIGFub3RoZXIgbGF5b3V0LlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGUgdmFsdWUgbWF5IGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlLCBidXQgYW4gZXJyb3Igd2lsbCB0aHJvd25cbiAgICAgICAgICogaWYgYXQgdGhlIHBvaW50IG9mIHVzZSBpdCBnb2VzIG91dHNpZGUgdGhlIHNwYW4gb2YgdGhlIFVpbnQ4QXJyYXlcbiAgICAgICAgICogYmVpbmcgYWNjZXNzZWQuICAqL1xuICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGlzQ291bnQoKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXMubGF5b3V0IGluc3RhbmNlb2YgVUludClcbiAgICAgICAgICAgIHx8ICh0aGlzLmxheW91dCBpbnN0YW5jZW9mIFVJbnRCRSkpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0LmRlY29kZShiLCBvZmZzZXQgKyB0aGlzLm9mZnNldCk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheW91dC5lbmNvZGUoc3JjLCBiLCBvZmZzZXQgKyB0aGlzLm9mZnNldCk7XG4gICAgfVxufVxuZXhwb3J0cy5PZmZzZXRMYXlvdXQgPSBPZmZzZXRMYXlvdXQ7XG4vKipcbiAqIFJlcHJlc2VudCBhbiB1bnNpZ25lZCBpbnRlZ2VyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LlxuICpcbiAqICpGYWN0b3J5Kjoge0BsaW5rIG1vZHVsZTpMYXlvdXQudTh8dTh9LCB7QGxpbmtcbiAqICBtb2R1bGU6TGF5b3V0LnUxNnx1MTZ9LCB7QGxpbmsgbW9kdWxlOkxheW91dC51MjR8dTI0fSwge0BsaW5rXG4gKiAgbW9kdWxlOkxheW91dC51MzJ8dTMyfSwge0BsaW5rIG1vZHVsZTpMYXlvdXQudTQwfHU0MH0sIHtAbGlua1xuICogIG1vZHVsZTpMYXlvdXQudTQ4fHU0OH1cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc3BhbiAtIGluaXRpYWxpemVyIGZvciB7QGxpbmsgTGF5b3V0I3NwYW58c3Bhbn0uXG4gKiBUaGUgcGFyYW1ldGVyIGNhbiByYW5nZSBmcm9tIDEgdGhyb3VnaCA2LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAqXG4gKiBAYXVnbWVudHMge0xheW91dH1cbiAqL1xuY2xhc3MgVUludCBleHRlbmRzIExheW91dCB7XG4gICAgY29uc3RydWN0b3Ioc3BhbiwgcHJvcGVydHkpIHtcbiAgICAgICAgc3VwZXIoc3BhbiwgcHJvcGVydHkpO1xuICAgICAgICBpZiAoNiA8IHRoaXMuc3Bhbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NwYW4gbXVzdCBub3QgZXhjZWVkIDYgYnl0ZXMnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgcmV0dXJuIHVpbnQ4QXJyYXlUb0J1ZmZlcihiKS5yZWFkVUludExFKG9mZnNldCwgdGhpcy5zcGFuKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZShzcmMsIGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgdWludDhBcnJheVRvQnVmZmVyKGIpLndyaXRlVUludExFKHNyYywgb2Zmc2V0LCB0aGlzLnNwYW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5zcGFuO1xuICAgIH1cbn1cbmV4cG9ydHMuVUludCA9IFVJbnQ7XG4vKipcbiAqIFJlcHJlc2VudCBhbiB1bnNpZ25lZCBpbnRlZ2VyIGluIGJpZy1lbmRpYW4gZm9ybWF0LlxuICpcbiAqICpGYWN0b3J5Kjoge0BsaW5rIG1vZHVsZTpMYXlvdXQudThiZXx1OGJlfSwge0BsaW5rXG4gKiBtb2R1bGU6TGF5b3V0LnUxNmJlfHUxNmJlfSwge0BsaW5rIG1vZHVsZTpMYXlvdXQudTI0YmV8dTI0YmV9LFxuICoge0BsaW5rIG1vZHVsZTpMYXlvdXQudTMyYmV8dTMyYmV9LCB7QGxpbmtcbiAqIG1vZHVsZTpMYXlvdXQudTQwYmV8dTQwYmV9LCB7QGxpbmsgbW9kdWxlOkxheW91dC51NDhiZXx1NDhiZX1cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc3BhbiAtIGluaXRpYWxpemVyIGZvciB7QGxpbmsgTGF5b3V0I3NwYW58c3Bhbn0uXG4gKiBUaGUgcGFyYW1ldGVyIGNhbiByYW5nZSBmcm9tIDEgdGhyb3VnaCA2LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAqXG4gKiBAYXVnbWVudHMge0xheW91dH1cbiAqL1xuY2xhc3MgVUludEJFIGV4dGVuZHMgTGF5b3V0IHtcbiAgICBjb25zdHJ1Y3RvcihzcGFuLCBwcm9wZXJ0eSkge1xuICAgICAgICBzdXBlcihzcGFuLCBwcm9wZXJ0eSk7XG4gICAgICAgIGlmICg2IDwgdGhpcy5zcGFuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3BhbiBtdXN0IG5vdCBleGNlZWQgNiBieXRlcycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUoYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdWludDhBcnJheVRvQnVmZmVyKGIpLnJlYWRVSW50QkUob2Zmc2V0LCB0aGlzLnNwYW4pO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHNyYywgYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICB1aW50OEFycmF5VG9CdWZmZXIoYikud3JpdGVVSW50QkUoc3JjLCBvZmZzZXQsIHRoaXMuc3Bhbik7XG4gICAgICAgIHJldHVybiB0aGlzLnNwYW47XG4gICAgfVxufVxuZXhwb3J0cy5VSW50QkUgPSBVSW50QkU7XG4vKipcbiAqIFJlcHJlc2VudCBhIHNpZ25lZCBpbnRlZ2VyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0LlxuICpcbiAqICpGYWN0b3J5Kjoge0BsaW5rIG1vZHVsZTpMYXlvdXQuczh8czh9LCB7QGxpbmtcbiAqICBtb2R1bGU6TGF5b3V0LnMxNnxzMTZ9LCB7QGxpbmsgbW9kdWxlOkxheW91dC5zMjR8czI0fSwge0BsaW5rXG4gKiAgbW9kdWxlOkxheW91dC5zMzJ8czMyfSwge0BsaW5rIG1vZHVsZTpMYXlvdXQuczQwfHM0MH0sIHtAbGlua1xuICogIG1vZHVsZTpMYXlvdXQuczQ4fHM0OH1cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gc3BhbiAtIGluaXRpYWxpemVyIGZvciB7QGxpbmsgTGF5b3V0I3NwYW58c3Bhbn0uXG4gKiBUaGUgcGFyYW1ldGVyIGNhbiByYW5nZSBmcm9tIDEgdGhyb3VnaCA2LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAqXG4gKiBAYXVnbWVudHMge0xheW91dH1cbiAqL1xuY2xhc3MgSW50IGV4dGVuZHMgTGF5b3V0IHtcbiAgICBjb25zdHJ1Y3RvcihzcGFuLCBwcm9wZXJ0eSkge1xuICAgICAgICBzdXBlcihzcGFuLCBwcm9wZXJ0eSk7XG4gICAgICAgIGlmICg2IDwgdGhpcy5zcGFuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3BhbiBtdXN0IG5vdCBleGNlZWQgNiBieXRlcycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUoYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdWludDhBcnJheVRvQnVmZmVyKGIpLnJlYWRJbnRMRShvZmZzZXQsIHRoaXMuc3Bhbik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIHVpbnQ4QXJyYXlUb0J1ZmZlcihiKS53cml0ZUludExFKHNyYywgb2Zmc2V0LCB0aGlzLnNwYW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5zcGFuO1xuICAgIH1cbn1cbmV4cG9ydHMuSW50ID0gSW50O1xuLyoqXG4gKiBSZXByZXNlbnQgYSBzaWduZWQgaW50ZWdlciBpbiBiaWctZW5kaWFuIGZvcm1hdC5cbiAqXG4gKiAqRmFjdG9yeSo6IHtAbGluayBtb2R1bGU6TGF5b3V0LnM4YmV8czhiZX0sIHtAbGlua1xuICogbW9kdWxlOkxheW91dC5zMTZiZXxzMTZiZX0sIHtAbGluayBtb2R1bGU6TGF5b3V0LnMyNGJlfHMyNGJlfSxcbiAqIHtAbGluayBtb2R1bGU6TGF5b3V0LnMzMmJlfHMzMmJlfSwge0BsaW5rXG4gKiBtb2R1bGU6TGF5b3V0LnM0MGJlfHM0MGJlfSwge0BsaW5rIG1vZHVsZTpMYXlvdXQuczQ4YmV8czQ4YmV9XG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHNwYW4gLSBpbml0aWFsaXplciBmb3Ige0BsaW5rIExheW91dCNzcGFufHNwYW59LlxuICogVGhlIHBhcmFtZXRlciBjYW4gcmFuZ2UgZnJvbSAxIHRocm91Z2ggNi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BlcnR5XSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0uXG4gKlxuICogQGF1Z21lbnRzIHtMYXlvdXR9XG4gKi9cbmNsYXNzIEludEJFIGV4dGVuZHMgTGF5b3V0IHtcbiAgICBjb25zdHJ1Y3RvcihzcGFuLCBwcm9wZXJ0eSkge1xuICAgICAgICBzdXBlcihzcGFuLCBwcm9wZXJ0eSk7XG4gICAgICAgIGlmICg2IDwgdGhpcy5zcGFuKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc3BhbiBtdXN0IG5vdCBleGNlZWQgNiBieXRlcycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUoYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdWludDhBcnJheVRvQnVmZmVyKGIpLnJlYWRJbnRCRShvZmZzZXQsIHRoaXMuc3Bhbik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIHVpbnQ4QXJyYXlUb0J1ZmZlcihiKS53cml0ZUludEJFKHNyYywgb2Zmc2V0LCB0aGlzLnNwYW4pO1xuICAgICAgICByZXR1cm4gdGhpcy5zcGFuO1xuICAgIH1cbn1cbmV4cG9ydHMuSW50QkUgPSBJbnRCRTtcbmNvbnN0IFYyRTMyID0gTWF0aC5wb3coMiwgMzIpO1xuLyogVHJ1ZSBtb2R1bHVzIGhpZ2ggYW5kIGxvdyAzMi1iaXQgd29yZHMsIHdoZXJlIGxvdyB3b3JkIGlzIGFsd2F5c1xuICogbm9uLW5lZ2F0aXZlLiAqL1xuZnVuY3Rpb24gZGl2bW9kSW50NjQoc3JjKSB7XG4gICAgY29uc3QgaGkzMiA9IE1hdGguZmxvb3Ioc3JjIC8gVjJFMzIpO1xuICAgIGNvbnN0IGxvMzIgPSBzcmMgLSAoaGkzMiAqIFYyRTMyKTtcbiAgICByZXR1cm4geyBoaTMyLCBsbzMyIH07XG59XG4vKiBSZWNvbnN0cnVjdCBOdW1iZXIgZnJvbSBxdW90aWVudCBhbmQgbm9uLW5lZ2F0aXZlIHJlbWFpbmRlciAqL1xuZnVuY3Rpb24gcm91bmRlZEludDY0KGhpMzIsIGxvMzIpIHtcbiAgICByZXR1cm4gaGkzMiAqIFYyRTMyICsgbG8zMjtcbn1cbi8qKlxuICogUmVwcmVzZW50IGFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0IHdoZW5cbiAqIGVuY29kZWQgYW5kIGFzIGEgbmVhciBpbnRlZ3JhbCBKYXZhU2NyaXB0IE51bWJlciB3aGVuIGRlY29kZWQuXG4gKlxuICogKkZhY3RvcnkqOiB7QGxpbmsgbW9kdWxlOkxheW91dC5udTY0fG51NjR9XG4gKlxuICogKipOT1RFKiogVmFsdWVzIHdpdGggbWFnbml0dWRlIGdyZWF0ZXIgdGhhbiAyXjUyIG1heSBub3QgZGVjb2RlIHRvXG4gKiB0aGUgZXhhY3QgdmFsdWUgb2YgdGhlIGVuY29kZWQgcmVwcmVzZW50YXRpb24uXG4gKlxuICogQGF1Z21lbnRzIHtMYXlvdXR9XG4gKi9cbmNsYXNzIE5lYXJVSW50NjQgZXh0ZW5kcyBMYXlvdXQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5KSB7XG4gICAgICAgIHN1cGVyKDgsIHByb3BlcnR5KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZShiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHVpbnQ4QXJyYXlUb0J1ZmZlcihiKTtcbiAgICAgICAgY29uc3QgbG8zMiA9IGJ1ZmZlci5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgaGkzMiA9IGJ1ZmZlci5yZWFkVUludDMyTEUob2Zmc2V0ICsgNCk7XG4gICAgICAgIHJldHVybiByb3VuZGVkSW50NjQoaGkzMiwgbG8zMik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gZGl2bW9kSW50NjQoc3JjKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gdWludDhBcnJheVRvQnVmZmVyKGIpO1xuICAgICAgICBidWZmZXIud3JpdGVVSW50MzJMRShzcGxpdC5sbzMyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXIud3JpdGVVSW50MzJMRShzcGxpdC5oaTMyLCBvZmZzZXQgKyA0KTtcbiAgICAgICAgcmV0dXJuIDg7XG4gICAgfVxufVxuZXhwb3J0cy5OZWFyVUludDY0ID0gTmVhclVJbnQ2NDtcbi8qKlxuICogUmVwcmVzZW50IGFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGluIGJpZy1lbmRpYW4gZm9ybWF0IHdoZW5cbiAqIGVuY29kZWQgYW5kIGFzIGEgbmVhciBpbnRlZ3JhbCBKYXZhU2NyaXB0IE51bWJlciB3aGVuIGRlY29kZWQuXG4gKlxuICogKkZhY3RvcnkqOiB7QGxpbmsgbW9kdWxlOkxheW91dC5udTY0YmV8bnU2NGJlfVxuICpcbiAqICoqTk9URSoqIFZhbHVlcyB3aXRoIG1hZ25pdHVkZSBncmVhdGVyIHRoYW4gMl41MiBtYXkgbm90IGRlY29kZSB0b1xuICogdGhlIGV4YWN0IHZhbHVlIG9mIHRoZSBlbmNvZGVkIHJlcHJlc2VudGF0aW9uLlxuICpcbiAqIEBhdWdtZW50cyB7TGF5b3V0fVxuICovXG5jbGFzcyBOZWFyVUludDY0QkUgZXh0ZW5kcyBMYXlvdXQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5KSB7XG4gICAgICAgIHN1cGVyKDgsIHByb3BlcnR5KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZShiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHVpbnQ4QXJyYXlUb0J1ZmZlcihiKTtcbiAgICAgICAgY29uc3QgaGkzMiA9IGJ1ZmZlci5yZWFkVUludDMyQkUob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgbG8zMiA9IGJ1ZmZlci5yZWFkVUludDMyQkUob2Zmc2V0ICsgNCk7XG4gICAgICAgIHJldHVybiByb3VuZGVkSW50NjQoaGkzMiwgbG8zMik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gZGl2bW9kSW50NjQoc3JjKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gdWludDhBcnJheVRvQnVmZmVyKGIpO1xuICAgICAgICBidWZmZXIud3JpdGVVSW50MzJCRShzcGxpdC5oaTMyLCBvZmZzZXQpO1xuICAgICAgICBidWZmZXIud3JpdGVVSW50MzJCRShzcGxpdC5sbzMyLCBvZmZzZXQgKyA0KTtcbiAgICAgICAgcmV0dXJuIDg7XG4gICAgfVxufVxuZXhwb3J0cy5OZWFyVUludDY0QkUgPSBOZWFyVUludDY0QkU7XG4vKipcbiAqIFJlcHJlc2VudCBhIHNpZ25lZCA2NC1iaXQgaW50ZWdlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdCB3aGVuXG4gKiBlbmNvZGVkIGFuZCBhcyBhIG5lYXIgaW50ZWdyYWwgSmF2YVNjcmlwdCBOdW1iZXIgd2hlbiBkZWNvZGVkLlxuICpcbiAqICpGYWN0b3J5Kjoge0BsaW5rIG1vZHVsZTpMYXlvdXQubnM2NHxuczY0fVxuICpcbiAqICoqTk9URSoqIFZhbHVlcyB3aXRoIG1hZ25pdHVkZSBncmVhdGVyIHRoYW4gMl41MiBtYXkgbm90IGRlY29kZSB0b1xuICogdGhlIGV4YWN0IHZhbHVlIG9mIHRoZSBlbmNvZGVkIHJlcHJlc2VudGF0aW9uLlxuICpcbiAqIEBhdWdtZW50cyB7TGF5b3V0fVxuICovXG5jbGFzcyBOZWFySW50NjQgZXh0ZW5kcyBMYXlvdXQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5KSB7XG4gICAgICAgIHN1cGVyKDgsIHByb3BlcnR5KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZShiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHVpbnQ4QXJyYXlUb0J1ZmZlcihiKTtcbiAgICAgICAgY29uc3QgbG8zMiA9IGJ1ZmZlci5yZWFkVUludDMyTEUob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgaGkzMiA9IGJ1ZmZlci5yZWFkSW50MzJMRShvZmZzZXQgKyA0KTtcbiAgICAgICAgcmV0dXJuIHJvdW5kZWRJbnQ2NChoaTMyLCBsbzMyKTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZShzcmMsIGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgY29uc3Qgc3BsaXQgPSBkaXZtb2RJbnQ2NChzcmMpO1xuICAgICAgICBjb25zdCBidWZmZXIgPSB1aW50OEFycmF5VG9CdWZmZXIoYik7XG4gICAgICAgIGJ1ZmZlci53cml0ZVVJbnQzMkxFKHNwbGl0LmxvMzIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlci53cml0ZUludDMyTEUoc3BsaXQuaGkzMiwgb2Zmc2V0ICsgNCk7XG4gICAgICAgIHJldHVybiA4O1xuICAgIH1cbn1cbmV4cG9ydHMuTmVhckludDY0ID0gTmVhckludDY0O1xuLyoqXG4gKiBSZXByZXNlbnQgYSBzaWduZWQgNjQtYml0IGludGVnZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXQgd2hlblxuICogZW5jb2RlZCBhbmQgYXMgYSBuZWFyIGludGVncmFsIEphdmFTY3JpcHQgTnVtYmVyIHdoZW4gZGVjb2RlZC5cbiAqXG4gKiAqRmFjdG9yeSo6IHtAbGluayBtb2R1bGU6TGF5b3V0Lm5zNjRiZXxuczY0YmV9XG4gKlxuICogKipOT1RFKiogVmFsdWVzIHdpdGggbWFnbml0dWRlIGdyZWF0ZXIgdGhhbiAyXjUyIG1heSBub3QgZGVjb2RlIHRvXG4gKiB0aGUgZXhhY3QgdmFsdWUgb2YgdGhlIGVuY29kZWQgcmVwcmVzZW50YXRpb24uXG4gKlxuICogQGF1Z21lbnRzIHtMYXlvdXR9XG4gKi9cbmNsYXNzIE5lYXJJbnQ2NEJFIGV4dGVuZHMgTGF5b3V0IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eSkge1xuICAgICAgICBzdXBlcig4LCBwcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUoYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB1aW50OEFycmF5VG9CdWZmZXIoYik7XG4gICAgICAgIGNvbnN0IGhpMzIgPSBidWZmZXIucmVhZEludDMyQkUob2Zmc2V0KTtcbiAgICAgICAgY29uc3QgbG8zMiA9IGJ1ZmZlci5yZWFkVUludDMyQkUob2Zmc2V0ICsgNCk7XG4gICAgICAgIHJldHVybiByb3VuZGVkSW50NjQoaGkzMiwgbG8zMik7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNvbnN0IHNwbGl0ID0gZGl2bW9kSW50NjQoc3JjKTtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gdWludDhBcnJheVRvQnVmZmVyKGIpO1xuICAgICAgICBidWZmZXIud3JpdGVJbnQzMkJFKHNwbGl0LmhpMzIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlci53cml0ZVVJbnQzMkJFKHNwbGl0LmxvMzIsIG9mZnNldCArIDQpO1xuICAgICAgICByZXR1cm4gODtcbiAgICB9XG59XG5leHBvcnRzLk5lYXJJbnQ2NEJFID0gTmVhckludDY0QkU7XG4vKipcbiAqIFJlcHJlc2VudCBhIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIgaW4gbGl0dGxlLWVuZGlhbiBmb3JtYXQuXG4gKlxuICogKkZhY3RvcnkqOiB7QGxpbmsgbW9kdWxlOkxheW91dC5mMzJ8ZjMyfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAqXG4gKiBAYXVnbWVudHMge0xheW91dH1cbiAqL1xuY2xhc3MgRmxvYXQgZXh0ZW5kcyBMYXlvdXQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5KSB7XG4gICAgICAgIHN1cGVyKDQsIHByb3BlcnR5KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZShiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIHJldHVybiB1aW50OEFycmF5VG9CdWZmZXIoYikucmVhZEZsb2F0TEUob2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZShzcmMsIGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgdWludDhBcnJheVRvQnVmZmVyKGIpLndyaXRlRmxvYXRMRShzcmMsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiA0O1xuICAgIH1cbn1cbmV4cG9ydHMuRmxvYXQgPSBGbG9hdDtcbi8qKlxuICogUmVwcmVzZW50IGEgMzItYml0IGZsb2F0aW5nIHBvaW50IG51bWJlciBpbiBiaWctZW5kaWFuIGZvcm1hdC5cbiAqXG4gKiAqRmFjdG9yeSo6IHtAbGluayBtb2R1bGU6TGF5b3V0LmYzMmJlfGYzMmJlfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAqXG4gKiBAYXVnbWVudHMge0xheW91dH1cbiAqL1xuY2xhc3MgRmxvYXRCRSBleHRlbmRzIExheW91dCB7XG4gICAgY29uc3RydWN0b3IocHJvcGVydHkpIHtcbiAgICAgICAgc3VwZXIoNCwgcHJvcGVydHkpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgcmV0dXJuIHVpbnQ4QXJyYXlUb0J1ZmZlcihiKS5yZWFkRmxvYXRCRShvZmZzZXQpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHNyYywgYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICB1aW50OEFycmF5VG9CdWZmZXIoYikud3JpdGVGbG9hdEJFKHNyYywgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIDQ7XG4gICAgfVxufVxuZXhwb3J0cy5GbG9hdEJFID0gRmxvYXRCRTtcbi8qKlxuICogUmVwcmVzZW50IGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlciBpbiBsaXR0bGUtZW5kaWFuIGZvcm1hdC5cbiAqXG4gKiAqRmFjdG9yeSo6IHtAbGluayBtb2R1bGU6TGF5b3V0LmY2NHxmNjR9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICpcbiAqIEBhdWdtZW50cyB7TGF5b3V0fVxuICovXG5jbGFzcyBEb3VibGUgZXh0ZW5kcyBMYXlvdXQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BlcnR5KSB7XG4gICAgICAgIHN1cGVyKDgsIHByb3BlcnR5KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZShiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIHJldHVybiB1aW50OEFycmF5VG9CdWZmZXIoYikucmVhZERvdWJsZUxFKG9mZnNldCk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIHVpbnQ4QXJyYXlUb0J1ZmZlcihiKS53cml0ZURvdWJsZUxFKHNyYywgb2Zmc2V0KTtcbiAgICAgICAgcmV0dXJuIDg7XG4gICAgfVxufVxuZXhwb3J0cy5Eb3VibGUgPSBEb3VibGU7XG4vKipcbiAqIFJlcHJlc2VudCBhIDY0LWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXIgaW4gYmlnLWVuZGlhbiBmb3JtYXQuXG4gKlxuICogKkZhY3RvcnkqOiB7QGxpbmsgbW9kdWxlOkxheW91dC5mNjRiZXxmNjRiZX1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BlcnR5XSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0uXG4gKlxuICogQGF1Z21lbnRzIHtMYXlvdXR9XG4gKi9cbmNsYXNzIERvdWJsZUJFIGV4dGVuZHMgTGF5b3V0IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eSkge1xuICAgICAgICBzdXBlcig4LCBwcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUoYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICByZXR1cm4gdWludDhBcnJheVRvQnVmZmVyKGIpLnJlYWREb3VibGVCRShvZmZzZXQpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHNyYywgYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICB1aW50OEFycmF5VG9CdWZmZXIoYikud3JpdGVEb3VibGVCRShzcmMsIG9mZnNldCk7XG4gICAgICAgIHJldHVybiA4O1xuICAgIH1cbn1cbmV4cG9ydHMuRG91YmxlQkUgPSBEb3VibGVCRTtcbi8qKlxuICogUmVwcmVzZW50IGEgY29udGlndW91cyBzZXF1ZW5jZSBvZiBhIHNwZWNpZmljIGxheW91dCBhcyBhbiBBcnJheS5cbiAqXG4gKiAqRmFjdG9yeSo6IHtAbGluayBtb2R1bGU6TGF5b3V0LnNlcXxzZXF9XG4gKlxuICogQHBhcmFtIHtMYXlvdXR9IGVsZW1lbnRMYXlvdXQgLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gKiBTZXF1ZW5jZSNlbGVtZW50TGF5b3V0fGVsZW1lbnRMYXlvdXR9LlxuICpcbiAqIEBwYXJhbSB7KE51bWJlcnxFeHRlcm5hbExheW91dCl9IGNvdW50IC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogU2VxdWVuY2UjY291bnR8Y291bnR9LiAgVGhlIHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciBhIHBvc2l0aXZlXG4gKiBpbnRlZ2VyIG9yIGFuIGluc3RhbmNlIG9mIHtAbGluayBFeHRlcm5hbExheW91dH0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICpcbiAqIEBhdWdtZW50cyB7TGF5b3V0fVxuICovXG5jbGFzcyBTZXF1ZW5jZSBleHRlbmRzIExheW91dCB7XG4gICAgY29uc3RydWN0b3IoZWxlbWVudExheW91dCwgY291bnQsIHByb3BlcnR5KSB7XG4gICAgICAgIGlmICghKGVsZW1lbnRMYXlvdXQgaW5zdGFuY2VvZiBMYXlvdXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbGVtZW50TGF5b3V0IG11c3QgYmUgYSBMYXlvdXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoISgoKGNvdW50IGluc3RhbmNlb2YgRXh0ZXJuYWxMYXlvdXQpICYmIGNvdW50LmlzQ291bnQoKSlcbiAgICAgICAgICAgIHx8IChOdW1iZXIuaXNJbnRlZ2VyKGNvdW50KSAmJiAoMCA8PSBjb3VudCkpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignY291bnQgbXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlciAnXG4gICAgICAgICAgICAgICAgKyAnb3IgYW4gdW5zaWduZWQgaW50ZWdlciBFeHRlcm5hbExheW91dCcpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzcGFuID0gLTE7XG4gICAgICAgIGlmICgoIShjb3VudCBpbnN0YW5jZW9mIEV4dGVybmFsTGF5b3V0KSlcbiAgICAgICAgICAgICYmICgwIDwgZWxlbWVudExheW91dC5zcGFuKSkge1xuICAgICAgICAgICAgc3BhbiA9IGNvdW50ICogZWxlbWVudExheW91dC5zcGFuO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHNwYW4sIHByb3BlcnR5KTtcbiAgICAgICAgLyoqIFRoZSBsYXlvdXQgZm9yIGluZGl2aWR1YWwgZWxlbWVudHMgb2YgdGhlIHNlcXVlbmNlLiAqL1xuICAgICAgICB0aGlzLmVsZW1lbnRMYXlvdXQgPSBlbGVtZW50TGF5b3V0O1xuICAgICAgICAvKiogVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgc2VxdWVuY2UuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgd2lsbCBiZSBlaXRoZXIgYSBub24tbmVnYXRpdmUgaW50ZWdlciBvciBhbiBpbnN0YW5jZSBvZlxuICAgICAgICAgKiB7QGxpbmsgRXh0ZXJuYWxMYXlvdXR9IGZvciB3aGljaCB7QGxpbmtcbiAgICAgICAgICogRXh0ZXJuYWxMYXlvdXQjaXNDb3VudHxpc0NvdW50KCl9IGlzIGB0cnVlYC4gKi9cbiAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50O1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZ2V0U3BhbihiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGlmICgwIDw9IHRoaXMuc3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BhbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3BhbiA9IDA7XG4gICAgICAgIGxldCBjb3VudCA9IHRoaXMuY291bnQ7XG4gICAgICAgIGlmIChjb3VudCBpbnN0YW5jZW9mIEV4dGVybmFsTGF5b3V0KSB7XG4gICAgICAgICAgICBjb3VudCA9IGNvdW50LmRlY29kZShiLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgwIDwgdGhpcy5lbGVtZW50TGF5b3V0LnNwYW4pIHtcbiAgICAgICAgICAgIHNwYW4gPSBjb3VudCAqIHRoaXMuZWxlbWVudExheW91dC5zcGFuO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGlkeCA9IDA7XG4gICAgICAgICAgICB3aGlsZSAoaWR4IDwgY291bnQpIHtcbiAgICAgICAgICAgICAgICBzcGFuICs9IHRoaXMuZWxlbWVudExheW91dC5nZXRTcGFuKGIsIG9mZnNldCArIHNwYW4pO1xuICAgICAgICAgICAgICAgICsraWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgY29uc3QgcnYgPSBbXTtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICBsZXQgY291bnQgPSB0aGlzLmNvdW50O1xuICAgICAgICBpZiAoY291bnQgaW5zdGFuY2VvZiBFeHRlcm5hbExheW91dCkge1xuICAgICAgICAgICAgY291bnQgPSBjb3VudC5kZWNvZGUoYiwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAoaSA8IGNvdW50KSB7XG4gICAgICAgICAgICBydi5wdXNoKHRoaXMuZWxlbWVudExheW91dC5kZWNvZGUoYiwgb2Zmc2V0KSk7XG4gICAgICAgICAgICBvZmZzZXQgKz0gdGhpcy5lbGVtZW50TGF5b3V0LmdldFNwYW4oYiwgb2Zmc2V0KTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcnY7XG4gICAgfVxuICAgIC8qKiBJbXBsZW1lbnQge0BsaW5rIExheW91dCNlbmNvZGV8ZW5jb2RlfSBmb3Ige0BsaW5rIFNlcXVlbmNlfS5cbiAgICAgKlxuICAgICAqICoqTk9URSoqIElmIGBzcmNgIGlzIHNob3J0ZXIgdGhhbiB7QGxpbmsgU2VxdWVuY2UjY291bnR8Y291bnR9IHRoZW5cbiAgICAgKiB0aGUgdW51c2VkIHNwYWNlIGluIHRoZSBidWZmZXIgaXMgbGVmdCB1bmNoYW5nZWQuICBJZiBgc3JjYCBpc1xuICAgICAqIGxvbmdlciB0aGFuIHtAbGluayBTZXF1ZW5jZSNjb3VudHxjb3VudH0gdGhlIHVubmVlZGVkIGVsZW1lbnRzIGFyZVxuICAgICAqIGlnbm9yZWQuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBJZiB7QGxpbmsgTGF5b3V0I2NvdW50fGNvdW50fSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmtcbiAgICAgKiBFeHRlcm5hbExheW91dH0gdGhlbiB0aGUgbGVuZ3RoIG9mIGBzcmNgIHdpbGwgYmUgZW5jb2RlZCBhcyB0aGVcbiAgICAgKiBjb3VudCBhZnRlciBgc3JjYCBpcyBlbmNvZGVkLiAqL1xuICAgIGVuY29kZShzcmMsIGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgY29uc3QgZWxvID0gdGhpcy5lbGVtZW50TGF5b3V0O1xuICAgICAgICBjb25zdCBzcGFuID0gc3JjLnJlZHVjZSgoc3BhbiwgdikgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHNwYW4gKyBlbG8uZW5jb2RlKHYsIGIsIG9mZnNldCArIHNwYW4pO1xuICAgICAgICB9LCAwKTtcbiAgICAgICAgaWYgKHRoaXMuY291bnQgaW5zdGFuY2VvZiBFeHRlcm5hbExheW91dCkge1xuICAgICAgICAgICAgdGhpcy5jb3VudC5lbmNvZGUoc3JjLmxlbmd0aCwgYiwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICB9XG59XG5leHBvcnRzLlNlcXVlbmNlID0gU2VxdWVuY2U7XG4vKipcbiAqIFJlcHJlc2VudCBhIGNvbnRpZ3VvdXMgc2VxdWVuY2Ugb2YgYXJiaXRyYXJ5IGxheW91dCBlbGVtZW50cyBhcyBhblxuICogT2JqZWN0LlxuICpcbiAqICpGYWN0b3J5Kjoge0BsaW5rIG1vZHVsZTpMYXlvdXQuc3RydWN0fHN0cnVjdH1cbiAqXG4gKiAqKk5PVEUqKiBUaGUge0BsaW5rIExheW91dCNzcGFufHNwYW59IG9mIHRoZSBzdHJ1Y3R1cmUgaXMgdmFyaWFibGVcbiAqIGlmIGFueSBsYXlvdXQgaW4ge0BsaW5rIFN0cnVjdHVyZSNmaWVsZHN8ZmllbGRzfSBoYXMgYSB2YXJpYWJsZVxuICogc3Bhbi4gIFdoZW4ge0BsaW5rIExheW91dCNlbmNvZGV8ZW5jb2Rpbmd9IHdlIG11c3QgaGF2ZSBhIHZhbHVlIGZvclxuICogYWxsIHZhcmlhYmxlLWxlbmd0aCBmaWVsZHMsIG9yIHdlIHdvdWxkbid0IGJlIGFibGUgdG8gZmlndXJlIG91dFxuICogaG93IG11Y2ggc3BhY2UgdG8gdXNlIGZvciBzdG9yYWdlLiAgV2UgY2FuIG9ubHkgaWRlbnRpZnkgdGhlIHZhbHVlXG4gKiBmb3IgYSBmaWVsZCB3aGVuIGl0IGhhcyBhIHtAbGluayBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LiAgQXNcbiAqIHN1Y2gsIGFsdGhvdWdoIGEgc3RydWN0dXJlIG1heSBjb250YWluIGJvdGggdW5uYW1lZCBmaWVsZHMgYW5kXG4gKiB2YXJpYWJsZS1sZW5ndGggZmllbGRzLCBpdCBjYW5ub3QgY29udGFpbiBhbiB1bm5hbWVkXG4gKiB2YXJpYWJsZS1sZW5ndGggZmllbGQuXG4gKlxuICogQHBhcmFtIHtMYXlvdXRbXX0gZmllbGRzIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogU3RydWN0dXJlI2ZpZWxkc3xmaWVsZHN9LiAgQW4gZXJyb3IgaXMgcmFpc2VkIGlmIHRoaXMgY29udGFpbnMgYVxuICogdmFyaWFibGUtbGVuZ3RoIGZpZWxkIGZvciB3aGljaCBhIHtAbGluayBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9XG4gKiBpcyBub3QgZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BlcnR5XSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0uXG4gKlxuICogQHBhcmFtIHtCb29sZWFufSBbZGVjb2RlUHJlZml4ZXNdIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogU3RydWN0dXJlI2RlY29kZVByZWZpeGVzfHByb3BlcnR5fS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBpZiBgZmllbGRzYCBjb250YWlucyBhbiB1bm5hbWVkIHZhcmlhYmxlLWxlbmd0aFxuICogbGF5b3V0LlxuICpcbiAqIEBhdWdtZW50cyB7TGF5b3V0fVxuICovXG5jbGFzcyBTdHJ1Y3R1cmUgZXh0ZW5kcyBMYXlvdXQge1xuICAgIGNvbnN0cnVjdG9yKGZpZWxkcywgcHJvcGVydHksIGRlY29kZVByZWZpeGVzKSB7XG4gICAgICAgIGlmICghKEFycmF5LmlzQXJyYXkoZmllbGRzKVxuICAgICAgICAgICAgJiYgZmllbGRzLnJlZHVjZSgoYWNjLCB2KSA9PiBhY2MgJiYgKHYgaW5zdGFuY2VvZiBMYXlvdXQpLCB0cnVlKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2ZpZWxkcyBtdXN0IGJlIGFycmF5IG9mIExheW91dCBpbnN0YW5jZXMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCdib29sZWFuJyA9PT0gdHlwZW9mIHByb3BlcnR5KVxuICAgICAgICAgICAgJiYgKHVuZGVmaW5lZCA9PT0gZGVjb2RlUHJlZml4ZXMpKSB7XG4gICAgICAgICAgICBkZWNvZGVQcmVmaXhlcyA9IHByb3BlcnR5O1xuICAgICAgICAgICAgcHJvcGVydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogVmVyaWZ5IGFic2VuY2Ugb2YgdW5uYW1lZCB2YXJpYWJsZS1sZW5ndGggZmllbGRzLiAqL1xuICAgICAgICBmb3IgKGNvbnN0IGZkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgaWYgKCgwID4gZmQuc3BhbilcbiAgICAgICAgICAgICAgICAmJiAodW5kZWZpbmVkID09PSBmZC5wcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZpZWxkcyBjYW5ub3QgY29udGFpbiB1bm5hbWVkIHZhcmlhYmxlLWxlbmd0aCBsYXlvdXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgc3BhbiA9IC0xO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3BhbiA9IGZpZWxkcy5yZWR1Y2UoKHNwYW4sIGZkKSA9PiBzcGFuICsgZmQuZ2V0U3BhbigpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gaWdub3JlIGVycm9yXG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoc3BhbiwgcHJvcGVydHkpO1xuICAgICAgICAvKiogVGhlIHNlcXVlbmNlIG9mIHtAbGluayBMYXlvdXR9IHZhbHVlcyB0aGF0IGNvbXByaXNlIHRoZVxuICAgICAgICAgKiBzdHJ1Y3R1cmUuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBpbmRpdmlkdWFsIGVsZW1lbnRzIG5lZWQgbm90IGJlIHRoZSBzYW1lIHR5cGUsIGFuZCBtYXkgYmVcbiAgICAgICAgICogZWl0aGVyIHNjYWxhciBvciBhZ2dyZWdhdGUgbGF5b3V0cy4gIElmIGEgbWVtYmVyIGxheW91dCBsZWF2ZXNcbiAgICAgICAgICogaXRzIHtAbGluayBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9IHVuZGVmaW5lZCB0aGVcbiAgICAgICAgICogY29ycmVzcG9uZGluZyByZWdpb24gb2YgdGhlIGJ1ZmZlciBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRcbiAgICAgICAgICogd2lsbCBub3QgYmUgbXV0YXRlZC5cbiAgICAgICAgICpcbiAgICAgICAgICogQHR5cGUge0xheW91dFtdfSAqL1xuICAgICAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgICAgICAgLyoqIENvbnRyb2wgYmVoYXZpb3Igb2Yge0BsaW5rIExheW91dCNkZWNvZGV8ZGVjb2RlKCl9IGdpdmVuIHNob3J0XG4gICAgICAgICAqIGJ1ZmZlcnMuXG4gICAgICAgICAqXG4gICAgICAgICAqIEluIHNvbWUgc2l0dWF0aW9ucyBhIHN0cnVjdHVyZSBtYW55IGJlIGV4dGVuZGVkIHdpdGggYWRkaXRpb25hbFxuICAgICAgICAgKiBmaWVsZHMgb3ZlciB0aW1lLCB3aXRoIG9sZGVyIGluc3RhbGxhdGlvbnMgcHJvdmlkaW5nIG9ubHkgYVxuICAgICAgICAgKiBwcmVmaXggb2YgdGhlIGZ1bGwgc3RydWN0dXJlLiAgSWYgdGhpcyBwcm9wZXJ0eSBpcyBgdHJ1ZWBcbiAgICAgICAgICogZGVjb2Rpbmcgd2lsbCBhY2NlcHQgdGhvc2UgYnVmZmVycyBhbmQgbGVhdmUgc3Vic2VxdWVudCBmaWVsZHNcbiAgICAgICAgICogdW5kZWZpbmVkLCBhcyBsb25nIGFzIHRoZSBidWZmZXIgZW5kcyBhdCBhIGZpZWxkIGJvdW5kYXJ5LlxuICAgICAgICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgLiAqL1xuICAgICAgICB0aGlzLmRlY29kZVByZWZpeGVzID0gISFkZWNvZGVQcmVmaXhlcztcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGdldFNwYW4oYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICBpZiAoMCA8PSB0aGlzLnNwYW4pIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNwYW47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNwYW4gPSAwO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3BhbiA9IHRoaXMuZmllbGRzLnJlZHVjZSgoc3BhbiwgZmQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmc3AgPSBmZC5nZXRTcGFuKGIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGZzcDtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3BhbiArIGZzcDtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignaW5kZXRlcm1pbmF0ZSBzcGFuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUoYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICBjaGVja1VpbnQ4QXJyYXkoYik7XG4gICAgICAgIGNvbnN0IGRlc3QgPSB0aGlzLm1ha2VEZXN0aW5hdGlvbk9iamVjdCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAodW5kZWZpbmVkICE9PSBmZC5wcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIGRlc3RbZmQucHJvcGVydHldID0gZmQuZGVjb2RlKGIsIG9mZnNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvZmZzZXQgKz0gZmQuZ2V0U3BhbihiLCBvZmZzZXQpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGVjb2RlUHJlZml4ZXNcbiAgICAgICAgICAgICAgICAmJiAoYi5sZW5ndGggPT09IG9mZnNldCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzdDtcbiAgICB9XG4gICAgLyoqIEltcGxlbWVudCB7QGxpbmsgTGF5b3V0I2VuY29kZXxlbmNvZGV9IGZvciB7QGxpbmsgU3RydWN0dXJlfS5cbiAgICAgKlxuICAgICAqIElmIGBzcmNgIGlzIG1pc3NpbmcgYSBwcm9wZXJ0eSBmb3IgYSBtZW1iZXIgd2l0aCBhIGRlZmluZWQge0BsaW5rXG4gICAgICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fSB0aGUgY29ycmVzcG9uZGluZyByZWdpb24gb2YgdGhlIGJ1ZmZlciBpc1xuICAgICAqIGxlZnQgdW5tb2RpZmllZC4gKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0T2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICBsZXQgbGFzdE9mZnNldCA9IDA7XG4gICAgICAgIGxldCBsYXN0V3JvdGUgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGZkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBsZXQgc3BhbiA9IGZkLnNwYW47XG4gICAgICAgICAgICBsYXN0V3JvdGUgPSAoMCA8IHNwYW4pID8gc3BhbiA6IDA7XG4gICAgICAgICAgICBpZiAodW5kZWZpbmVkICE9PSBmZC5wcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZ2ID0gc3JjW2ZkLnByb3BlcnR5XTtcbiAgICAgICAgICAgICAgICBpZiAodW5kZWZpbmVkICE9PSBmdikge1xuICAgICAgICAgICAgICAgICAgICBsYXN0V3JvdGUgPSBmZC5lbmNvZGUoZnYsIGIsIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICgwID4gc3Bhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVhZCB0aGUgYXMtZW5jb2RlZCBzcGFuLCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgdGhlXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBzYW1lIGFzIHdoYXQgd2Ugd3JvdGUuICovXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGFuID0gZmQuZ2V0U3BhbihiLCBvZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdE9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICAgIG9mZnNldCArPSBzcGFuO1xuICAgICAgICB9XG4gICAgICAgIC8qIFVzZSAobGFzdE9mZnNldCArIGxhc3RXcm90ZSkgaW5zdGVhZCBvZiBvZmZzZXQgYmVjYXVzZSB0aGUgbGFzdFxuICAgICAgICAgKiBpdGVtIG1heSBoYXZlIGhhZCBhIGR5bmFtaWMgbGVuZ3RoIGFuZCB3ZSBkb24ndCB3YW50IHRvIGluY2x1ZGVcbiAgICAgICAgICogdGhlIHBhZGRpbmcgYmV0d2VlbiBpdCBhbmQgdGhlIGVuZCBvZiB0aGUgc3BhY2UgcmVzZXJ2ZWQgZm9yXG4gICAgICAgICAqIGl0LiAqL1xuICAgICAgICByZXR1cm4gKGxhc3RPZmZzZXQgKyBsYXN0V3JvdGUpIC0gZmlyc3RPZmZzZXQ7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBmcm9tQXJyYXkodmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IGRlc3QgPSB0aGlzLm1ha2VEZXN0aW5hdGlvbk9iamVjdCgpO1xuICAgICAgICBmb3IgKGNvbnN0IGZkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAoKHVuZGVmaW5lZCAhPT0gZmQucHJvcGVydHkpXG4gICAgICAgICAgICAgICAgJiYgKDAgPCB2YWx1ZXMubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgIGRlc3RbZmQucHJvcGVydHldID0gdmFsdWVzLnNoaWZ0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCBhY2Nlc3MgdG8gdGhlIGxheW91dCBvZiBhIGdpdmVuIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHByb3BlcnR5IC0gdGhlIHN0cnVjdHVyZSBtZW1iZXIgb2YgaW50ZXJlc3QuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMYXlvdXR9IC0gdGhlIGxheW91dCBhc3NvY2lhdGVkIHdpdGggYHByb3BlcnR5YCwgb3JcbiAgICAgKiB1bmRlZmluZWQgaWYgdGhlcmUgaXMgbm8gc3VjaCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBsYXlvdXRGb3IocHJvcGVydHkpIHtcbiAgICAgICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2YgcHJvcGVydHkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3Byb3BlcnR5IG11c3QgYmUgc3RyaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBmZCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZkLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG9mZnNldCBvZiBhIHN0cnVjdHVyZSBtZW1iZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgLSB0aGUgc3RydWN0dXJlIG1lbWJlciBvZiBpbnRlcmVzdC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge051bWJlcn0gLSB0aGUgb2Zmc2V0IGluIGJ5dGVzIHRvIHRoZSBzdGFydCBvZiBgcHJvcGVydHlgXG4gICAgICogd2l0aGluIHRoZSBzdHJ1Y3R1cmUsIG9yIHVuZGVmaW5lZCBpZiBgcHJvcGVydHlgIGlzIG5vdCBhIGZpZWxkXG4gICAgICogd2l0aGluIHRoZSBzdHJ1Y3R1cmUuICBJZiB0aGUgcHJvcGVydHkgaXMgYSBtZW1iZXIgYnV0IGZvbGxvd3MgYVxuICAgICAqIHZhcmlhYmxlLWxlbmd0aCBzdHJ1Y3R1cmUgbWVtYmVyIGEgbmVnYXRpdmUgbnVtYmVyIHdpbGwgYmVcbiAgICAgKiByZXR1cm5lZC5cbiAgICAgKi9cbiAgICBvZmZzZXRPZihwcm9wZXJ0eSkge1xuICAgICAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBwcm9wZXJ0eSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncHJvcGVydHkgbXVzdCBiZSBzdHJpbmcnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgICAgZm9yIChjb25zdCBmZCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgaWYgKGZkLnByb3BlcnR5ID09PSBwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoMCA+IGZkLnNwYW4pIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKDAgPD0gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGZkLnNwYW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnRzLlN0cnVjdHVyZSA9IFN0cnVjdHVyZTtcbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY2FuIHByb3ZpZGUgYSB7QGxpbmtcbiAqIFVuaW9uI2Rpc2NyaW1pbmF0b3J8ZGlzY3JpbWluYXRvcn0gQVBJIGZvciB7QGxpbmsgVW5pb259LlxuICpcbiAqICoqTk9URSoqIFRoaXMgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzczsgeW91IGNhbiBjcmVhdGUgaW5zdGFuY2VzXG4gKiBpZiBpdCBhbXVzZXMgeW91LCBidXQgdGhleSB3b24ndCBzdXBwb3J0IHRoZSB7QGxpbmtcbiAqIFVuaW9uRGlzY3JpbWluYXRvciNlbmNvZGV8ZW5jb2RlfSBvciB7QGxpbmtcbiAqIFVuaW9uRGlzY3JpbWluYXRvciNkZWNvZGV8ZGVjb2RlfSBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBEZWZhdWx0IGZvciB7QGxpbmtcbiAqIFVuaW9uRGlzY3JpbWluYXRvciNwcm9wZXJ0eXxwcm9wZXJ0eX0uXG4gKlxuICogQGFic3RyYWN0XG4gKi9cbmNsYXNzIFVuaW9uRGlzY3JpbWluYXRvciB7XG4gICAgY29uc3RydWN0b3IocHJvcGVydHkpIHtcbiAgICAgICAgLyoqIFRoZSB7QGxpbmsgTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fSB0byBiZSB1c2VkIHdoZW4gdGhlXG4gICAgICAgICAqIGRpc2NyaW1pbmF0b3IgaXMgcmVmZXJlbmNlZCBpbiBpc29sYXRpb24gKGdlbmVyYWxseSB3aGVuIHtAbGlua1xuICAgICAgICAgKiBVbmlvbiNkZWNvZGV8VW5pb24gZGVjb2RlfSBjYW5ub3QgZGVsZWdhdGUgdG8gYSBzcGVjaWZpY1xuICAgICAgICAgKiB2YXJpYW50KS4gKi9cbiAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5O1xuICAgIH1cbiAgICAvKiogQW5hbG9nIHRvIHtAbGluayBMYXlvdXQjZGVjb2RlfExheW91dCBkZWNvZGV9IGZvciB1bmlvbiBkaXNjcmltaW5hdG9ycy5cbiAgICAgKlxuICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBuZWVkIG5vdCByZWZlcmVuY2UgdGhlIGJ1ZmZlciBpZlxuICAgICAqIHZhcmlhbnQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIHRocm91Z2ggb3RoZXIgbWVhbnMuICovXG4gICAgZGVjb2RlKGIsIG9mZnNldCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuaW9uRGlzY3JpbWluYXRvciBpcyBhYnN0cmFjdCcpO1xuICAgIH1cbiAgICAvKiogQW5hbG9nIHRvIHtAbGluayBMYXlvdXQjZGVjb2RlfExheW91dCBlbmNvZGV9IGZvciB1bmlvbiBkaXNjcmltaW5hdG9ycy5cbiAgICAgKlxuICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBuZWVkIG5vdCBzdG9yZSB0aGUgdmFsdWUgaWZcbiAgICAgKiB2YXJpYW50IGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgdGhyb3VnaCBvdGhlciBtZWFucy4gKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmlvbkRpc2NyaW1pbmF0b3IgaXMgYWJzdHJhY3QnKTtcbiAgICB9XG59XG5leHBvcnRzLlVuaW9uRGlzY3JpbWluYXRvciA9IFVuaW9uRGlzY3JpbWluYXRvcjtcbi8qKlxuICogQW4gb2JqZWN0IHRoYXQgY2FuIHByb3ZpZGUgYSB7QGxpbmtcbiAqIFVuaW9uRGlzY3JpbWluYXRvcnxkaXNjcmltaW5hdG9yIEFQSX0gZm9yIHtAbGluayBVbmlvbn0gdXNpbmcgYW5cbiAqIHVuc2lnbmVkIGludGVncmFsIHtAbGluayBMYXlvdXR9IGluc3RhbmNlIGxvY2F0ZWQgZWl0aGVyIGluc2lkZSBvclxuICogb3V0c2lkZSB0aGUgdW5pb24uXG4gKlxuICogQHBhcmFtIHtFeHRlcm5hbExheW91dH0gbGF5b3V0IC0gaW5pdGlhbGl6ZXMge0BsaW5rXG4gKiBVbmlvbkxheW91dERpc2NyaW1pbmF0b3IjbGF5b3V0fGxheW91dH0uICBNdXN0IHNhdGlzZnkge0BsaW5rXG4gKiBFeHRlcm5hbExheW91dCNpc0NvdW50fGlzQ291bnQoKX0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBEZWZhdWx0IGZvciB7QGxpbmtcbiAqIFVuaW9uRGlzY3JpbWluYXRvciNwcm9wZXJ0eXxwcm9wZXJ0eX0sIHN1cGVyc2VkaW5nIHRoZSBwcm9wZXJ0eVxuICogZnJvbSBgbGF5b3V0YCwgYnV0IGRlZmF1bHRpbmcgdG8gYHZhcmlhbnRgIGlmIG5laXRoZXIgYHByb3BlcnR5YFxuICogbm9yIGxheW91dCBwcm92aWRlIGEgcHJvcGVydHkgbmFtZS5cbiAqXG4gKiBAYXVnbWVudHMge1VuaW9uRGlzY3JpbWluYXRvcn1cbiAqL1xuY2xhc3MgVW5pb25MYXlvdXREaXNjcmltaW5hdG9yIGV4dGVuZHMgVW5pb25EaXNjcmltaW5hdG9yIHtcbiAgICBjb25zdHJ1Y3RvcihsYXlvdXQsIHByb3BlcnR5KSB7XG4gICAgICAgIGlmICghKChsYXlvdXQgaW5zdGFuY2VvZiBFeHRlcm5hbExheW91dClcbiAgICAgICAgICAgICYmIGxheW91dC5pc0NvdW50KCkpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdsYXlvdXQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyIEV4dGVybmFsTGF5b3V0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIocHJvcGVydHkgfHwgbGF5b3V0LnByb3BlcnR5IHx8ICd2YXJpYW50Jyk7XG4gICAgICAgIC8qKiBUaGUge0BsaW5rIEV4dGVybmFsTGF5b3V0fSB1c2VkIHRvIGFjY2VzcyB0aGUgZGlzY3JpbWluYXRvclxuICAgICAgICAgKiB2YWx1ZS4gKi9cbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgfVxuICAgIC8qKiBEZWxlZ2F0ZSBkZWNvZGluZyB0byB7QGxpbmsgVW5pb25MYXlvdXREaXNjcmltaW5hdG9yI2xheW91dHxsYXlvdXR9LiAqL1xuICAgIGRlY29kZShiLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0LmRlY29kZShiLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKiogRGVsZWdhdGUgZW5jb2RpbmcgdG8ge0BsaW5rIFVuaW9uTGF5b3V0RGlzY3JpbWluYXRvciNsYXlvdXR8bGF5b3V0fS4gKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0LmVuY29kZShzcmMsIGIsIG9mZnNldCk7XG4gICAgfVxufVxuZXhwb3J0cy5VbmlvbkxheW91dERpc2NyaW1pbmF0b3IgPSBVbmlvbkxheW91dERpc2NyaW1pbmF0b3I7XG4vKipcbiAqIFJlcHJlc2VudCBhbnkgbnVtYmVyIG9mIHNwYW4tY29tcGF0aWJsZSBsYXlvdXRzLlxuICpcbiAqICpGYWN0b3J5Kjoge0BsaW5rIG1vZHVsZTpMYXlvdXQudW5pb258dW5pb259XG4gKlxuICogSWYgdGhlIHVuaW9uIGhhcyBhIHtAbGluayBVbmlvbiNkZWZhdWx0TGF5b3V0fGRlZmF1bHQgbGF5b3V0fSB0aGF0XG4gKiBsYXlvdXQgbXVzdCBoYXZlIGEgbm9uLW5lZ2F0aXZlIHtAbGluayBMYXlvdXQjc3BhbnxzcGFufS4gIFRoZSBzcGFuXG4gKiBvZiBhIGZpeGVkLXNwYW4gdW5pb24gaW5jbHVkZXMgaXRzIHtAbGlua1xuICogVW5pb24jZGlzY3JpbWluYXRvcnxkaXNjcmltaW5hdG9yfSBpZiB0aGUgdmFyaWFudCBpcyBhIHtAbGlua1xuICogVW5pb24jdXNlc1ByZWZpeERpc2NyaW1pbmF0b3J8cHJlZml4IG9mIHRoZSB1bmlvbn0sIHBsdXMgdGhlIHNwYW5cbiAqIG9mIGl0cyB7QGxpbmsgVW5pb24jZGVmYXVsdExheW91dHxkZWZhdWx0IGxheW91dH0uXG4gKlxuICogSWYgdGhlIHVuaW9uIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IGxheW91dCB0aGVuIHRoZSBlbmNvZGVkIHNwYW5cbiAqIG9mIHRoZSB1bmlvbiBkZXBlbmRzIG9uIHRoZSBlbmNvZGVkIHNwYW4gb2YgaXRzIHZhcmlhbnQgKHdoaWNoIG1heVxuICogYmUgZml4ZWQgb3IgdmFyaWFibGUpLlxuICpcbiAqIHtAbGluayBWYXJpYW50TGF5b3V0I2xheW91dHxWYXJpYW50IGxheW91dH1zIGFyZSBhZGRlZCB0aHJvdWdoXG4gKiB7QGxpbmsgVW5pb24jYWRkVmFyaWFudHxhZGRWYXJpYW50fS4gIElmIHRoZSB1bmlvbiBoYXMgYSBkZWZhdWx0XG4gKiBsYXlvdXQsIHRoZSBzcGFuIG9mIHRoZSB7QGxpbmsgVmFyaWFudExheW91dCNsYXlvdXR8bGF5b3V0XG4gKiBjb250YWluZWQgYnkgdGhlIHZhcmlhbnR9IG11c3Qgbm90IGV4Y2VlZCB0aGUgc3BhbiBvZiB0aGUge0BsaW5rXG4gKiBVbmlvbiNkZWZhdWx0TGF5b3V0fGRlZmF1bHQgbGF5b3V0fSAobWludXMgdGhlIHNwYW4gb2YgYSB7QGxpbmtcbiAqIFVuaW9uI3VzZXNQcmVmaXhEaXNjcmltaW5hdG9yfHByZWZpeCBkaXNyaW1pbmF0b3J9LCBpZiB1c2VkKS4gIFRoZVxuICogc3BhbiBvZiB0aGUgdmFyaWFudCB3aWxsIGVxdWFsIHRoZSBzcGFuIG9mIHRoZSB1bmlvbiBpdHNlbGYuXG4gKlxuICogVGhlIHZhcmlhbnQgZm9yIGEgYnVmZmVyIGNhbiBvbmx5IGJlIGlkZW50aWZpZWQgZnJvbSB0aGUge0BsaW5rXG4gKiBVbmlvbiNkaXNjcmltaW5hdG9yfGRpc2NyaW1pbmF0b3J9IHtAbGlua1xuICogVW5pb25EaXNjcmltaW5hdG9yI3Byb3BlcnR5fHByb3BlcnR5fSAoaW4gdGhlIGNhc2Ugb2YgdGhlIHtAbGlua1xuICogVW5pb24jZGVmYXVsdExheW91dHxkZWZhdWx0IGxheW91dH0pLCBvciBieSB1c2luZyB7QGxpbmtcbiAqIFVuaW9uI2dldFZhcmlhbnR8Z2V0VmFyaWFudH0gYW5kIGV4YW1pbmluZyB0aGUgcmVzdWx0aW5nIHtAbGlua1xuICogVmFyaWFudExheW91dH0gaW5zdGFuY2UuXG4gKlxuICogQSB2YXJpYW50IGNvbXBhdGlibGUgd2l0aCBhIEphdmFTY3JpcHQgb2JqZWN0IGNhbiBiZSBpZGVudGlmaWVkXG4gKiB1c2luZyB7QGxpbmsgVW5pb24jZ2V0U291cmNlVmFyaWFudHxnZXRTb3VyY2VWYXJpYW50fS5cbiAqXG4gKiBAcGFyYW0geyhVbmlvbkRpc2NyaW1pbmF0b3J8RXh0ZXJuYWxMYXlvdXR8TGF5b3V0KX0gZGlzY3IgLSBIb3cgdG9cbiAqIGlkZW50aWZ5IHRoZSBsYXlvdXQgdXNlZCB0byBpbnRlcnByZXQgdGhlIHVuaW9uIGNvbnRlbnRzLiAgVGhlXG4gKiBwYXJhbWV0ZXIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgVW5pb25EaXNjcmltaW5hdG9yfSwgYW5cbiAqIHtAbGluayBFeHRlcm5hbExheW91dH0gdGhhdCBzYXRpc2ZpZXMge0BsaW5rXG4gKiBFeHRlcm5hbExheW91dCNpc0NvdW50fGlzQ291bnQoKX0sIG9yIHtAbGluayBVSW50fSAob3Ige0BsaW5rXG4gKiBVSW50QkV9KS4gIFdoZW4gYSBub24tZXh0ZXJuYWwgbGF5b3V0IGVsZW1lbnQgaXMgcGFzc2VkIHRoZSBsYXlvdXRcbiAqIGFwcGVhcnMgYXQgdGhlIHN0YXJ0IG9mIHRoZSB1bmlvbi4gIEluIGFsbCBjYXNlcyB0aGUgKHN5bnRoZXNpemVkKVxuICoge0BsaW5rIFVuaW9uRGlzY3JpbWluYXRvcn0gaW5zdGFuY2UgaXMgcmVjb3JkZWQgYXMge0BsaW5rXG4gKiBVbmlvbiNkaXNjcmltaW5hdG9yfGRpc2NyaW1pbmF0b3J9LlxuICpcbiAqIEBwYXJhbSB7KExheW91dHxudWxsKX0gZGVmYXVsdExheW91dCAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIFVuaW9uI2RlZmF1bHRMYXlvdXR8ZGVmYXVsdExheW91dH0uICBJZiBhYnNlbnQgZGVmYXVsdHMgdG8gYG51bGxgLlxuICogSWYgYG51bGxgIHRoZXJlIGlzIG5vIGRlZmF1bHQgbGF5b3V0OiB0aGUgdW5pb24gaGFzIGRhdGEtZGVwZW5kZW50XG4gKiBsZW5ndGggYW5kIGF0dGVtcHRzIHRvIGRlY29kZSBvciBlbmNvZGUgdW5yZWNvZ25pemVkIHZhcmlhbnRzIHdpbGxcbiAqIHRocm93IGFuIGV4Y2VwdGlvbi4gIEEge0BsaW5rIExheW91dH0gaW5zdGFuY2UgbXVzdCBoYXZlIGFcbiAqIG5vbi1uZWdhdGl2ZSB7QGxpbmsgTGF5b3V0I3NwYW58c3Bhbn0sIGFuZCBpZiBpdCBsYWNrcyBhIHtAbGlua1xuICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fSB0aGUge0BsaW5rXG4gKiBVbmlvbiNkZWZhdWx0TGF5b3V0fGRlZmF1bHRMYXlvdXR9IHdpbGwgYmUgYSB7QGxpbmtcbiAqIExheW91dCNyZXBsaWNhdGV8cmVwbGljYX0gd2l0aCBwcm9wZXJ0eSBgY29udGVudGAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICpcbiAqIEBhdWdtZW50cyB7TGF5b3V0fVxuICovXG5jbGFzcyBVbmlvbiBleHRlbmRzIExheW91dCB7XG4gICAgY29uc3RydWN0b3IoZGlzY3IsIGRlZmF1bHRMYXlvdXQsIHByb3BlcnR5KSB7XG4gICAgICAgIGxldCBkaXNjcmltaW5hdG9yO1xuICAgICAgICBpZiAoKGRpc2NyIGluc3RhbmNlb2YgVUludClcbiAgICAgICAgICAgIHx8IChkaXNjciBpbnN0YW5jZW9mIFVJbnRCRSkpIHtcbiAgICAgICAgICAgIGRpc2NyaW1pbmF0b3IgPSBuZXcgVW5pb25MYXlvdXREaXNjcmltaW5hdG9yKG5ldyBPZmZzZXRMYXlvdXQoZGlzY3IpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICgoZGlzY3IgaW5zdGFuY2VvZiBFeHRlcm5hbExheW91dClcbiAgICAgICAgICAgICYmIGRpc2NyLmlzQ291bnQoKSkge1xuICAgICAgICAgICAgZGlzY3JpbWluYXRvciA9IG5ldyBVbmlvbkxheW91dERpc2NyaW1pbmF0b3IoZGlzY3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEoZGlzY3IgaW5zdGFuY2VvZiBVbmlvbkRpc2NyaW1pbmF0b3IpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdkaXNjciBtdXN0IGJlIGEgVW5pb25EaXNjcmltaW5hdG9yICdcbiAgICAgICAgICAgICAgICArICdvciBhbiB1bnNpZ25lZCBpbnRlZ2VyIGxheW91dCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZGlzY3JpbWluYXRvciA9IGRpc2NyO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmRlZmluZWQgPT09IGRlZmF1bHRMYXlvdXQpIHtcbiAgICAgICAgICAgIGRlZmF1bHRMYXlvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmICghKChudWxsID09PSBkZWZhdWx0TGF5b3V0KVxuICAgICAgICAgICAgfHwgKGRlZmF1bHRMYXlvdXQgaW5zdGFuY2VvZiBMYXlvdXQpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZGVmYXVsdExheW91dCBtdXN0IGJlIG51bGwgb3IgYSBMYXlvdXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobnVsbCAhPT0gZGVmYXVsdExheW91dCkge1xuICAgICAgICAgICAgaWYgKDAgPiBkZWZhdWx0TGF5b3V0LnNwYW4pIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RlZmF1bHRMYXlvdXQgbXVzdCBoYXZlIGNvbnN0YW50IHNwYW4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh1bmRlZmluZWQgPT09IGRlZmF1bHRMYXlvdXQucHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0TGF5b3V0ID0gZGVmYXVsdExheW91dC5yZXBsaWNhdGUoJ2NvbnRlbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvKiBUaGUgdW5pb24gc3BhbiBjYW4gYmUgZXN0aW1hdGVkIG9ubHkgaWYgdGhlcmUncyBhIGRlZmF1bHRcbiAgICAgICAgICogbGF5b3V0LiAgVGhlIHVuaW9uIHNwYW5zIGl0cyBkZWZhdWx0IGxheW91dCwgcGx1cyBhbnkgcHJlZml4XG4gICAgICAgICAqIHZhcmlhbnQgbGF5b3V0LiAgQnkgY29uc3RydWN0aW9uIGJvdGggbGF5b3V0cywgaWYgcHJlc2VudCwgaGF2ZVxuICAgICAgICAgKiBub24tbmVnYXRpdmUgc3Bhbi4gKi9cbiAgICAgICAgbGV0IHNwYW4gPSAtMTtcbiAgICAgICAgaWYgKGRlZmF1bHRMYXlvdXQpIHtcbiAgICAgICAgICAgIHNwYW4gPSBkZWZhdWx0TGF5b3V0LnNwYW47XG4gICAgICAgICAgICBpZiAoKDAgPD0gc3BhbikgJiYgKChkaXNjciBpbnN0YW5jZW9mIFVJbnQpXG4gICAgICAgICAgICAgICAgfHwgKGRpc2NyIGluc3RhbmNlb2YgVUludEJFKSkpIHtcbiAgICAgICAgICAgICAgICBzcGFuICs9IGRpc2NyaW1pbmF0b3IubGF5b3V0LnNwYW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoc3BhbiwgcHJvcGVydHkpO1xuICAgICAgICAvKiogVGhlIGludGVyZmFjZSBmb3IgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgaW4gaXNvbGF0aW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIGEge0BsaW5rIFVuaW9uRGlzY3JpbWluYXRvcn0gZWl0aGVyIHBhc3NlZCB0byB0aGVcbiAgICAgICAgICogY29uc3RydWN0b3Igb3Igc3ludGhlc2l6ZWQgZnJvbSB0aGUgYGRpc2NyYCBjb25zdHJ1Y3RvclxuICAgICAgICAgKiBhcmd1bWVudC4gIHtAbGlua1xuICAgICAgICAgKiBVbmlvbiN1c2VzUHJlZml4RGlzY3JpbWluYXRvcnx1c2VzUHJlZml4RGlzY3JpbWluYXRvcn0gd2lsbCBiZVxuICAgICAgICAgKiBgdHJ1ZWAgaWZmIHRoZSBgZGlzY3JgIHBhcmFtZXRlciB3YXMgYSBub24tb2Zmc2V0IHtAbGlua1xuICAgICAgICAgKiBMYXlvdXR9IGluc3RhbmNlLiAqL1xuICAgICAgICB0aGlzLmRpc2NyaW1pbmF0b3IgPSBkaXNjcmltaW5hdG9yO1xuICAgICAgICAvKiogYHRydWVgIGlmIHRoZSB7QGxpbmsgVW5pb24jZGlzY3JpbWluYXRvcnxkaXNjcmltaW5hdG9yfSBpcyB0aGVcbiAgICAgICAgICogZmlyc3QgZmllbGQgaW4gdGhlIHVuaW9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiBgZmFsc2VgIHRoZSBkaXNjcmltaW5hdG9yIGlzIG9idGFpbmVkIGZyb20gc29tZXdoZXJlXG4gICAgICAgICAqIGVsc2UuICovXG4gICAgICAgIHRoaXMudXNlc1ByZWZpeERpc2NyaW1pbmF0b3IgPSAoZGlzY3IgaW5zdGFuY2VvZiBVSW50KVxuICAgICAgICAgICAgfHwgKGRpc2NyIGluc3RhbmNlb2YgVUludEJFKTtcbiAgICAgICAgLyoqIFRoZSBsYXlvdXQgZm9yIG5vbi1kaXNjcmltaW5hdG9yIGNvbnRlbnQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlXG4gICAgICAgICAqIGRpc2NyaW1pbmF0b3IgaXMgbm90IHJlY29nbml6ZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoaXMgaXMgdGhlIHZhbHVlIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuICBJdCBpc1xuICAgICAgICAgKiBzdHJ1Y3R1cmFsbHkgZXF1aXZhbGVudCB0byB0aGUgc2Vjb25kIGNvbXBvbmVudCBvZiB7QGxpbmtcbiAgICAgICAgICogVW5pb24jbGF5b3V0fGxheW91dH0gYnV0IG1heSBoYXZlIGEgZGlmZmVyZW50IHByb3BlcnR5XG4gICAgICAgICAqIG5hbWUuICovXG4gICAgICAgIHRoaXMuZGVmYXVsdExheW91dCA9IGRlZmF1bHRMYXlvdXQ7XG4gICAgICAgIC8qKiBBIHJlZ2lzdHJ5IG9mIGFsbG93ZWQgdmFyaWFudHMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoZSBrZXlzIGFyZSB1bnNpZ25lZCBpbnRlZ2VycyB3aGljaCBzaG91bGQgYmUgY29tcGF0aWJsZSB3aXRoXG4gICAgICAgICAqIHtAbGluayBVbmlvbi5kaXNjcmltaW5hdG9yfGRpc2NyaW1pbmF0b3J9LiAgVGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgICAqIGlzIHRoZSBjb3JyZXNwb25kaW5nIHtAbGluayBWYXJpYW50TGF5b3V0fSBpbnN0YW5jZXMgYXNzaWduZWRcbiAgICAgICAgICogdG8gdGhpcyB1bmlvbiBieSB7QGxpbmsgVW5pb24jYWRkVmFyaWFudHxhZGRWYXJpYW50fS5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOT1RFKiogVGhlIHJlZ2lzdHJ5IHJlbWFpbnMgbXV0YWJsZSBzbyB0aGF0IHZhcmlhbnRzIGNhbiBiZVxuICAgICAgICAgKiB7QGxpbmsgVW5pb24jYWRkVmFyaWFudHxhZGRlZH0gYXQgYW55IHRpbWUuICBVc2VycyBzaG91bGQgbm90XG4gICAgICAgICAqIG1hbmlwdWxhdGUgdGhlIGNvbnRlbnQgb2YgdGhpcyBwcm9wZXJ0eS4gKi9cbiAgICAgICAgdGhpcy5yZWdpc3RyeSA9IHt9O1xuICAgICAgICAvKiBQcml2YXRlIHZhcmlhYmxlIHVzZWQgd2hlbiBpbnZva2luZyBnZXRTb3VyY2VWYXJpYW50ICovXG4gICAgICAgIGxldCBib3VuZEdldFNvdXJjZVZhcmlhbnQgPSB0aGlzLmRlZmF1bHRHZXRTb3VyY2VWYXJpYW50LmJpbmQodGhpcyk7XG4gICAgICAgIC8qKiBGdW5jdGlvbiB0byBpbmZlciB0aGUgdmFyaWFudCBzZWxlY3RlZCBieSBhIHNvdXJjZSBvYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIERlZmF1bHRzIHRvIHtAbGlua1xuICAgICAgICAgKiBVbmlvbiNkZWZhdWx0R2V0U291cmNlVmFyaWFudHxkZWZhdWx0R2V0U291cmNlVmFyaWFudH0gYnV0IG1heVxuICAgICAgICAgKiBiZSBvdmVycmlkZGVuIHVzaW5nIHtAbGlua1xuICAgICAgICAgKiBVbmlvbiNjb25maWdHZXRTb3VyY2VWYXJpYW50fGNvbmZpZ0dldFNvdXJjZVZhcmlhbnR9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc3JjIC0gYXMgd2l0aCB7QGxpbmtcbiAgICAgICAgICogVW5pb24jZGVmYXVsdEdldFNvdXJjZVZhcmlhbnR8ZGVmYXVsdEdldFNvdXJjZVZhcmlhbnR9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJucyB7KHVuZGVmaW5lZHxWYXJpYW50TGF5b3V0KX0gVGhlIGRlZmF1bHQgdmFyaWFudFxuICAgICAgICAgKiAoYHVuZGVmaW5lZGApIG9yIGZpcnN0IHJlZ2lzdGVyZWQgdmFyaWFudCB0aGF0IHVzZXMgYSBwcm9wZXJ0eVxuICAgICAgICAgKiBhdmFpbGFibGUgaW4gYHNyY2AuICovXG4gICAgICAgIHRoaXMuZ2V0U291cmNlVmFyaWFudCA9IGZ1bmN0aW9uIChzcmMpIHtcbiAgICAgICAgICAgIHJldHVybiBib3VuZEdldFNvdXJjZVZhcmlhbnQoc3JjKTtcbiAgICAgICAgfTtcbiAgICAgICAgLyoqIEZ1bmN0aW9uIHRvIG92ZXJyaWRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmtcbiAgICAgICAgICogVW5pb24jZ2V0U291cmNlVmFyaWFudHxnZXRTb3VyY2VWYXJpYW50fS5cbiAgICAgICAgICpcbiAgICAgICAgICogVXNlIHRoaXMgaWYgdGhlIGRlc2lyZWQgdmFyaWFudCBjYW5ub3QgYmUgaWRlbnRpZmllZCB1c2luZyB0aGVcbiAgICAgICAgICogYWxnb3JpdGhtIG9mIHtAbGlua1xuICAgICAgICAgKiBVbmlvbiNkZWZhdWx0R2V0U291cmNlVmFyaWFudHxkZWZhdWx0R2V0U291cmNlVmFyaWFudH0uXG4gICAgICAgICAqXG4gICAgICAgICAqICoqTk9URSoqIFRoZSBwcm92aWRlZCBmdW5jdGlvbiB3aWxsIGJlIGludm9rZWQgYm91bmQgdG8gdGhpc1xuICAgICAgICAgKiBVbmlvbiBpbnN0YW5jZSwgcHJvdmlkaW5nIGxvY2FsIGFjY2VzcyB0byB7QGxpbmtcbiAgICAgICAgICogVW5pb24jcmVnaXN0cnl8cmVnaXN0cnl9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBnc3YgLSBhIGZ1bmN0aW9uIHRoYXQgZm9sbG93cyB0aGUgQVBJIG9mXG4gICAgICAgICAqIHtAbGluayBVbmlvbiNkZWZhdWx0R2V0U291cmNlVmFyaWFudHxkZWZhdWx0R2V0U291cmNlVmFyaWFudH0uICovXG4gICAgICAgIHRoaXMuY29uZmlnR2V0U291cmNlVmFyaWFudCA9IGZ1bmN0aW9uIChnc3YpIHtcbiAgICAgICAgICAgIGJvdW5kR2V0U291cmNlVmFyaWFudCA9IGdzdi5iaW5kKHRoaXMpO1xuICAgICAgICB9O1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZ2V0U3BhbihiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGlmICgwIDw9IHRoaXMuc3Bhbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3BhbjtcbiAgICAgICAgfVxuICAgICAgICAvKiBEZWZhdWx0IGxheW91dHMgYWx3YXlzIGhhdmUgbm9uLW5lZ2F0aXZlIHNwYW4sIHNvIHdlIGRvbid0IGhhdmVcbiAgICAgICAgICogb25lIGFuZCB3ZSBoYXZlIHRvIHJlY29nbml6ZSB0aGUgdmFyaWFudCB3aGljaCB3aWxsIGluIHR1cm5cbiAgICAgICAgICogZGV0ZXJtaW5lIHRoZSBzcGFuLiAqL1xuICAgICAgICBjb25zdCB2bG8gPSB0aGlzLmdldFZhcmlhbnQoYiwgb2Zmc2V0KTtcbiAgICAgICAgaWYgKCF2bG8pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5hYmxlIHRvIGRldGVybWluZSBzcGFuIGZvciB1bnJlY29nbml6ZWQgdmFyaWFudCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2bG8uZ2V0U3BhbihiLCBvZmZzZXQpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBNZXRob2QgdG8gaW5mZXIgYSByZWdpc3RlcmVkIFVuaW9uIHZhcmlhbnQgY29tcGF0aWJsZSB3aXRoIGBzcmNgLlxuICAgICAqXG4gICAgICogVGhlIGZpcnN0IHNhdGlzZmllZCBydWxlIGluIHRoZSBmb2xsb3dpbmcgc2VxdWVuY2UgZGVmaW5lcyB0aGVcbiAgICAgKiByZXR1cm4gdmFsdWU6XG4gICAgICogKiBJZiBgc3JjYCBoYXMgcHJvcGVydGllcyBtYXRjaGluZyB0aGUgVW5pb24gZGlzY3JpbWluYXRvciBhbmRcbiAgICAgKiAgIHRoZSBkZWZhdWx0IGxheW91dCwgYHVuZGVmaW5lZGAgaXMgcmV0dXJuZWQgcmVnYXJkbGVzcyBvZiB0aGVcbiAgICAgKiAgIHZhbHVlIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5ICh0aGlzIGVuc3VyZXMgdGhlIGRlZmF1bHRcbiAgICAgKiAgIGxheW91dCB3aWxsIGJlIHVzZWQpO1xuICAgICAqICogSWYgYHNyY2AgaGFzIGEgcHJvcGVydHkgbWF0Y2hpbmcgdGhlIFVuaW9uIGRpc2NyaW1pbmF0b3IsIHRoZVxuICAgICAqICAgdmFsdWUgb2YgdGhlIGRpc2NyaW1pbmF0b3IgaWRlbnRpZmllcyBhIHJlZ2lzdGVyZWQgdmFyaWFudCwgYW5kXG4gICAgICogICBlaXRoZXIgKGEpIHRoZSB2YXJpYW50IGhhcyBubyBsYXlvdXQsIG9yIChiKSBgc3JjYCBoYXMgdGhlXG4gICAgICogICB2YXJpYW50J3MgcHJvcGVydHksIHRoZW4gdGhlIHZhcmlhbnQgaXMgcmV0dXJuZWQgKGJlY2F1c2UgdGhlXG4gICAgICogICBzb3VyY2Ugc2F0aXNmaWVzIHRoZSBjb25zdHJhaW50cyBvZiB0aGUgdmFyaWFudCBpdCBpZGVudGlmaWVzKTtcbiAgICAgKiAqIElmIGBzcmNgIGRvZXMgbm90IGhhdmUgYSBwcm9wZXJ0eSBtYXRjaGluZyB0aGUgVW5pb25cbiAgICAgKiAgIGRpc2NyaW1pbmF0b3IsIGJ1dCBkb2VzIGhhdmUgYSBwcm9wZXJ0eSBtYXRjaGluZyBhIHJlZ2lzdGVyZWRcbiAgICAgKiAgIHZhcmlhbnQsIHRoZW4gdGhlIHZhcmlhbnQgaXMgcmV0dXJuZWQgKGJlY2F1c2UgdGhlIHNvdXJjZVxuICAgICAqICAgbWF0Y2hlcyBhIHZhcmlhbnQgd2l0aG91dCBhbiBleHBsaWNpdCBjb25mbGljdCk7XG4gICAgICogKiBBbiBlcnJvciBpcyB0aHJvd24gKGJlY2F1c2Ugd2UgZWl0aGVyIGNhbid0IGlkZW50aWZ5IGEgdmFyaWFudCxcbiAgICAgKiAgIG9yIHdlIHdlcmUgZXhwbGljaXRseSB0b2xkIHRoZSB2YXJpYW50IGJ1dCBjYW4ndCBzYXRpc2Z5IGl0KS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzcmMgLSBhbiBvYmplY3QgcHJlc3VtZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoXG4gICAgICogdGhlIGNvbnRlbnQgb2YgdGhlIFVuaW9uLlxuICAgICAqXG4gICAgICogQHJldHVybiB7KHVuZGVmaW5lZHxWYXJpYW50TGF5b3V0KX0gLSBhcyBkZXNjcmliZWQgYWJvdmUuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gLSBpZiBgc3JjYCBjYW5ub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGEgZGVmYXVsdCBvclxuICAgICAqIHJlZ2lzdGVyZWQgdmFyaWFudC5cbiAgICAgKi9cbiAgICBkZWZhdWx0R2V0U291cmNlVmFyaWFudChzcmMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzcmMsIHRoaXMuZGlzY3JpbWluYXRvci5wcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRMYXlvdXQgJiYgdGhpcy5kZWZhdWx0TGF5b3V0LnByb3BlcnR5XG4gICAgICAgICAgICAgICAgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNyYywgdGhpcy5kZWZhdWx0TGF5b3V0LnByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB2bG8gPSB0aGlzLnJlZ2lzdHJ5W3NyY1t0aGlzLmRpc2NyaW1pbmF0b3IucHJvcGVydHldXTtcbiAgICAgICAgICAgIGlmICh2bG9cbiAgICAgICAgICAgICAgICAmJiAoKCF2bG8ubGF5b3V0KVxuICAgICAgICAgICAgICAgICAgICB8fCAodmxvLnByb3BlcnR5ICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzcmMsIHZsby5wcm9wZXJ0eSkpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2bG87XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBpbiB0aGlzLnJlZ2lzdHJ5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmxvID0gdGhpcy5yZWdpc3RyeVt0YWddO1xuICAgICAgICAgICAgICAgIGlmICh2bG8ucHJvcGVydHkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNyYywgdmxvLnByb3BlcnR5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmxvO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYWJsZSB0byBpbmZlciBzcmMgdmFyaWFudCcpO1xuICAgIH1cbiAgICAvKiogSW1wbGVtZW50IHtAbGluayBMYXlvdXQjZGVjb2RlfGRlY29kZX0gZm9yIHtAbGluayBVbmlvbn0uXG4gICAgICpcbiAgICAgKiBJZiB0aGUgdmFyaWFudCBpcyB7QGxpbmsgVW5pb24jYWRkVmFyaWFudHxyZWdpc3RlcmVkfSB0aGUgcmV0dXJuXG4gICAgICogdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YgdGhhdCB2YXJpYW50LCB3aXRoIG5vIGV4cGxpY2l0XG4gICAgICogZGlzY3JpbWluYXRvci4gIE90aGVyd2lzZSB0aGUge0BsaW5rIFVuaW9uI2RlZmF1bHRMYXlvdXR8ZGVmYXVsdFxuICAgICAqIGxheW91dH0gaXMgdXNlZCB0byBkZWNvZGUgdGhlIGNvbnRlbnQuICovXG4gICAgZGVjb2RlKGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgbGV0IGRlc3Q7XG4gICAgICAgIGNvbnN0IGRsbyA9IHRoaXMuZGlzY3JpbWluYXRvcjtcbiAgICAgICAgY29uc3QgZGlzY3IgPSBkbG8uZGVjb2RlKGIsIG9mZnNldCk7XG4gICAgICAgIGNvbnN0IGNsbyA9IHRoaXMucmVnaXN0cnlbZGlzY3JdO1xuICAgICAgICBpZiAodW5kZWZpbmVkID09PSBjbG8pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRMYXlvdXQgPSB0aGlzLmRlZmF1bHRMYXlvdXQ7XG4gICAgICAgICAgICBsZXQgY29udGVudE9mZnNldCA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VzUHJlZml4RGlzY3JpbWluYXRvcikge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRPZmZzZXQgPSBkbG8ubGF5b3V0LnNwYW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZXN0ID0gdGhpcy5tYWtlRGVzdGluYXRpb25PYmplY3QoKTtcbiAgICAgICAgICAgIGRlc3RbZGxvLnByb3BlcnR5XSA9IGRpc2NyO1xuICAgICAgICAgICAgLy8gZGVmYXVsdExheW91dC5wcm9wZXJ0eSBjYW4gYmUgdW5kZWZpbmVkLCBidXQgdGhpcyBpcyBhbGxvd2VkIGJ5IGJ1ZmZlci1sYXlvdXRcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICBkZXN0W2RlZmF1bHRMYXlvdXQucHJvcGVydHldID0gZGVmYXVsdExheW91dC5kZWNvZGUoYiwgb2Zmc2V0ICsgY29udGVudE9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkZXN0ID0gY2xvLmRlY29kZShiLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXN0O1xuICAgIH1cbiAgICAvKiogSW1wbGVtZW50IHtAbGluayBMYXlvdXQjZW5jb2RlfGVuY29kZX0gZm9yIHtAbGluayBVbmlvbn0uXG4gICAgICpcbiAgICAgKiBUaGlzIEFQSSBhc3N1bWVzIHRoZSBgc3JjYCBvYmplY3QgaXMgY29uc2lzdGVudCB3aXRoIHRoZSB1bmlvbidzXG4gICAgICoge0BsaW5rIFVuaW9uI2RlZmF1bHRMYXlvdXR8ZGVmYXVsdCBsYXlvdXR9LiAgVG8gZW5jb2RlIHZhcmlhbnRzXG4gICAgICogdXNlIHRoZSBhcHByb3ByaWF0ZSB2YXJpYW50LXNwZWNpZmljIHtAbGluayBWYXJpYW50TGF5b3V0I2VuY29kZX1cbiAgICAgKiBtZXRob2QuICovXG4gICAgZW5jb2RlKHNyYywgYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICBjb25zdCB2bG8gPSB0aGlzLmdldFNvdXJjZVZhcmlhbnQoc3JjKTtcbiAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gdmxvKSB7XG4gICAgICAgICAgICBjb25zdCBkbG8gPSB0aGlzLmRpc2NyaW1pbmF0b3I7XG4gICAgICAgICAgICAvLyB0aGlzLmRlZmF1bHRMYXlvdXQgaXMgbm90IHVuZGVmaW5lZCB3aGVuIHZsbyBpcyB1bmRlZmluZWRcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXG4gICAgICAgICAgICBjb25zdCBjbG8gPSB0aGlzLmRlZmF1bHRMYXlvdXQ7XG4gICAgICAgICAgICBsZXQgY29udGVudE9mZnNldCA9IDA7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VzUHJlZml4RGlzY3JpbWluYXRvcikge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRPZmZzZXQgPSBkbG8ubGF5b3V0LnNwYW47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkbG8uZW5jb2RlKHNyY1tkbG8ucHJvcGVydHldLCBiLCBvZmZzZXQpO1xuICAgICAgICAgICAgLy8gY2xvLnByb3BlcnR5IGlzIG5vdCB1bmRlZmluZWQgd2hlbiB2bG8gaXMgdW5kZWZpbmVkXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnRPZmZzZXQgKyBjbG8uZW5jb2RlKHNyY1tjbG8ucHJvcGVydHldLCBiLCBvZmZzZXQgKyBjb250ZW50T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmxvLmVuY29kZShzcmMsIGIsIG9mZnNldCk7XG4gICAgfVxuICAgIC8qKiBSZWdpc3RlciBhIG5ldyB2YXJpYW50IHN0cnVjdHVyZSB3aXRoaW4gYSB1bmlvbi4gIFRoZSBuZXdseVxuICAgICAqIGNyZWF0ZWQgdmFyaWFudCBpcyByZXR1cm5lZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSB2YXJpYW50IC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICAgICAqIFZhcmlhbnRMYXlvdXQjdmFyaWFudHx2YXJpYW50fS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7TGF5b3V0fSBsYXlvdXQgLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gICAgICogVmFyaWFudExheW91dCNsYXlvdXR8bGF5b3V0fS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBwcm9wZXJ0eSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAgICAgKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICAgICAqXG4gICAgICogQHJldHVybiB7VmFyaWFudExheW91dH0gKi9cbiAgICBhZGRWYXJpYW50KHZhcmlhbnQsIGxheW91dCwgcHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgcnYgPSBuZXcgVmFyaWFudExheW91dCh0aGlzLCB2YXJpYW50LCBsYXlvdXQsIHByb3BlcnR5KTtcbiAgICAgICAgdGhpcy5yZWdpc3RyeVt2YXJpYW50XSA9IHJ2O1xuICAgICAgICByZXR1cm4gcnY7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGF5b3V0IGFzc29jaWF0ZWQgd2l0aCBhIHJlZ2lzdGVyZWQgdmFyaWFudC5cbiAgICAgKlxuICAgICAqIElmIGB2YmAgZG9lcyBub3QgcHJvZHVjZSBhIHJlZ2lzdGVyZWQgdmFyaWFudCB0aGUgZnVuY3Rpb24gcmV0dXJuc1xuICAgICAqIGB1bmRlZmluZWRgLlxuICAgICAqXG4gICAgICogQHBhcmFtIHsoTnVtYmVyfFVpbnQ4QXJyYXkpfSB2YiAtIGVpdGhlciB0aGUgdmFyaWFudCBudW1iZXIsIG9yIGFcbiAgICAgKiBidWZmZXIgZnJvbSB3aGljaCB0aGUgZGlzY3JpbWluYXRvciBpcyB0byBiZSByZWFkLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCAtIG9mZnNldCBpbnRvIGB2YmAgZm9yIHRoZSBzdGFydCBvZiB0aGVcbiAgICAgKiB1bmlvbi4gIFVzZWQgb25seSB3aGVuIGB2YmAgaXMgYW4gaW5zdGFuY2Ugb2Yge1VpbnQ4QXJyYXl9LlxuICAgICAqXG4gICAgICogQHJldHVybiB7KHtWYXJpYW50TGF5b3V0fXx1bmRlZmluZWQpfVxuICAgICAqL1xuICAgIGdldFZhcmlhbnQodmIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgbGV0IHZhcmlhbnQ7XG4gICAgICAgIGlmICh2YiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgICAgIHZhcmlhbnQgPSB0aGlzLmRpc2NyaW1pbmF0b3IuZGVjb2RlKHZiLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFyaWFudCA9IHZiO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5W3ZhcmlhbnRdO1xuICAgIH1cbn1cbmV4cG9ydHMuVW5pb24gPSBVbmlvbjtcbi8qKlxuICogUmVwcmVzZW50IGEgc3BlY2lmaWMgdmFyaWFudCB3aXRoaW4gYSBjb250YWluaW5nIHVuaW9uLlxuICpcbiAqICoqTk9URSoqIFRoZSB7QGxpbmsgTGF5b3V0I3NwYW58c3Bhbn0gb2YgdGhlIHZhcmlhbnQgbWF5IGluY2x1ZGVcbiAqIHRoZSBzcGFuIG9mIHRoZSB7QGxpbmsgVW5pb24jZGlzY3JpbWluYXRvcnxkaXNjcmltaW5hdG9yfSB1c2VkIHRvXG4gKiBpZGVudGlmeSBpdCwgYnV0IHZhbHVlcyByZWFkIGFuZCB3cml0dGVuIHVzaW5nIHRoZSB2YXJpYW50IHN0cmljdGx5XG4gKiBjb25mb3JtIHRvIHRoZSBjb250ZW50IG9mIHtAbGluayBWYXJpYW50TGF5b3V0I2xheW91dHxsYXlvdXR9LlxuICpcbiAqICoqTk9URSoqIFVzZXIgY29kZSBzaG91bGQgbm90IGludm9rZSB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LiAgVXNlXG4gKiB0aGUgdW5pb24ge0BsaW5rIFVuaW9uI2FkZFZhcmlhbnR8YWRkVmFyaWFudH0gaGVscGVyIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge1VuaW9ufSB1bmlvbiAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIFZhcmlhbnRMYXlvdXQjdW5pb258dW5pb259LlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB2YXJpYW50IC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogVmFyaWFudExheW91dCN2YXJpYW50fHZhcmlhbnR9LlxuICpcbiAqIEBwYXJhbSB7TGF5b3V0fSBbbGF5b3V0XSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIFZhcmlhbnRMYXlvdXQjbGF5b3V0fGxheW91dH0uICBJZiBhYnNlbnQgdGhlIHZhcmlhbnQgY2FycmllcyBub1xuICogZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW3Byb3BlcnR5XSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0uICBVbmxpa2UgbWFueSBvdGhlciBsYXlvdXRzLCB2YXJpYW50XG4gKiBsYXlvdXRzIG5vcm1hbGx5IGluY2x1ZGUgYSBwcm9wZXJ0eSBuYW1lIHNvIHRoZXkgY2FuIGJlIGlkZW50aWZpZWRcbiAqIHdpdGhpbiB0aGVpciBjb250YWluaW5nIHtAbGluayBVbmlvbn0uICBUaGUgcHJvcGVydHkgaWRlbnRpZmllciBtYXlcbiAqIGJlIGFic2VudCBvbmx5IGlmIGBsYXlvdXRgIGlzIGlzIGFic2VudC5cbiAqXG4gKiBAYXVnbWVudHMge0xheW91dH1cbiAqL1xuY2xhc3MgVmFyaWFudExheW91dCBleHRlbmRzIExheW91dCB7XG4gICAgY29uc3RydWN0b3IodW5pb24sIHZhcmlhbnQsIGxheW91dCwgcHJvcGVydHkpIHtcbiAgICAgICAgaWYgKCEodW5pb24gaW5zdGFuY2VvZiBVbmlvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3VuaW9uIG11c3QgYmUgYSBVbmlvbicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIU51bWJlci5pc0ludGVnZXIodmFyaWFudCkpIHx8ICgwID4gdmFyaWFudCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhcmlhbnQgbXVzdCBiZSBhIChub24tbmVnYXRpdmUpIGludGVnZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKCdzdHJpbmcnID09PSB0eXBlb2YgbGF5b3V0KVxuICAgICAgICAgICAgJiYgKHVuZGVmaW5lZCA9PT0gcHJvcGVydHkpKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IGxheW91dDtcbiAgICAgICAgICAgIGxheW91dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxheW91dCkge1xuICAgICAgICAgICAgaWYgKCEobGF5b3V0IGluc3RhbmNlb2YgTGF5b3V0KSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2xheW91dCBtdXN0IGJlIGEgTGF5b3V0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKG51bGwgIT09IHVuaW9uLmRlZmF1bHRMYXlvdXQpXG4gICAgICAgICAgICAgICAgJiYgKDAgPD0gbGF5b3V0LnNwYW4pXG4gICAgICAgICAgICAgICAgJiYgKGxheW91dC5zcGFuID4gdW5pb24uZGVmYXVsdExheW91dC5zcGFuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndmFyaWFudCBzcGFuIGV4Y2VlZHMgc3BhbiBvZiBjb250YWluaW5nIHVuaW9uJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoJ3N0cmluZycgIT09IHR5cGVvZiBwcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3ZhcmlhbnQgbXVzdCBoYXZlIGEgU3RyaW5nIHByb3BlcnR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHNwYW4gPSB1bmlvbi5zcGFuO1xuICAgICAgICBpZiAoMCA+IHVuaW9uLnNwYW4pIHtcbiAgICAgICAgICAgIHNwYW4gPSBsYXlvdXQgPyBsYXlvdXQuc3BhbiA6IDA7XG4gICAgICAgICAgICBpZiAoKDAgPD0gc3BhbikgJiYgdW5pb24udXNlc1ByZWZpeERpc2NyaW1pbmF0b3IpIHtcbiAgICAgICAgICAgICAgICBzcGFuICs9IHVuaW9uLmRpc2NyaW1pbmF0b3IubGF5b3V0LnNwYW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIoc3BhbiwgcHJvcGVydHkpO1xuICAgICAgICAvKiogVGhlIHtAbGluayBVbmlvbn0gdG8gd2hpY2ggdGhpcyB2YXJpYW50IGJlbG9uZ3MuICovXG4gICAgICAgIHRoaXMudW5pb24gPSB1bmlvbjtcbiAgICAgICAgLyoqIFRoZSB1bnNpZ25lZCBpbnRlZ3JhbCB2YWx1ZSBpZGVudGlmeWluZyB0aGlzIHZhcmlhbnQgd2l0aGluXG4gICAgICAgICAqIHRoZSB7QGxpbmsgVW5pb24jZGlzY3JpbWluYXRvcnxkaXNjcmltaW5hdG9yfSBvZiB0aGUgY29udGFpbmluZ1xuICAgICAgICAgKiB1bmlvbi4gKi9cbiAgICAgICAgdGhpcy52YXJpYW50ID0gdmFyaWFudDtcbiAgICAgICAgLyoqIFRoZSB7QGxpbmsgTGF5b3V0fSB0byBiZSB1c2VkIHdoZW4gcmVhZGluZy93cml0aW5nIHRoZVxuICAgICAgICAgKiBub24tZGlzY3JpbWluYXRvciBwYXJ0IG9mIHRoZSB7QGxpbmtcbiAgICAgICAgICogVmFyaWFudExheW91dCN1bmlvbnx1bmlvbn0uICBJZiBgbnVsbGAgdGhlIHZhcmlhbnQgY2FycmllcyBub1xuICAgICAgICAgKiBkYXRhLiAqL1xuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dCB8fCBudWxsO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZ2V0U3BhbihiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGlmICgwIDw9IHRoaXMuc3Bhbikge1xuICAgICAgICAgICAgLyogV2lsbCBiZSBlcXVhbCB0byB0aGUgY29udGFpbmluZyB1bmlvbiBzcGFuIGlmIHRoYXQgaXMgbm90XG4gICAgICAgICAgICAgKiB2YXJpYWJsZS4gKi9cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNwYW47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbnRlbnRPZmZzZXQgPSAwO1xuICAgICAgICBpZiAodGhpcy51bmlvbi51c2VzUHJlZml4RGlzY3JpbWluYXRvcikge1xuICAgICAgICAgICAgY29udGVudE9mZnNldCA9IHRoaXMudW5pb24uZGlzY3JpbWluYXRvci5sYXlvdXQuc3BhbjtcbiAgICAgICAgfVxuICAgICAgICAvKiBTcGFuIGlzIGRlZmluZWQgc29sZWx5IGJ5IHRoZSB2YXJpYW50IChhbmQgcHJlZml4IGRpc2NyaW1pbmF0b3IpICovXG4gICAgICAgIGxldCBzcGFuID0gMDtcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0KSB7XG4gICAgICAgICAgICBzcGFuID0gdGhpcy5sYXlvdXQuZ2V0U3BhbihiLCBvZmZzZXQgKyBjb250ZW50T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGVudE9mZnNldCArIHNwYW47XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUoYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICBjb25zdCBkZXN0ID0gdGhpcy5tYWtlRGVzdGluYXRpb25PYmplY3QoKTtcbiAgICAgICAgaWYgKHRoaXMgIT09IHRoaXMudW5pb24uZ2V0VmFyaWFudChiLCBvZmZzZXQpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3ZhcmlhbnQgbWlzbWF0Y2gnKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY29udGVudE9mZnNldCA9IDA7XG4gICAgICAgIGlmICh0aGlzLnVuaW9uLnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yKSB7XG4gICAgICAgICAgICBjb250ZW50T2Zmc2V0ID0gdGhpcy51bmlvbi5kaXNjcmltaW5hdG9yLmxheW91dC5zcGFuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxheW91dCkge1xuICAgICAgICAgICAgZGVzdFt0aGlzLnByb3BlcnR5XSA9IHRoaXMubGF5b3V0LmRlY29kZShiLCBvZmZzZXQgKyBjb250ZW50T2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnByb3BlcnR5KSB7XG4gICAgICAgICAgICBkZXN0W3RoaXMucHJvcGVydHldID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnVuaW9uLnVzZXNQcmVmaXhEaXNjcmltaW5hdG9yKSB7XG4gICAgICAgICAgICBkZXN0W3RoaXMudW5pb24uZGlzY3JpbWluYXRvci5wcm9wZXJ0eV0gPSB0aGlzLnZhcmlhbnQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc3Q7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGxldCBjb250ZW50T2Zmc2V0ID0gMDtcbiAgICAgICAgaWYgKHRoaXMudW5pb24udXNlc1ByZWZpeERpc2NyaW1pbmF0b3IpIHtcbiAgICAgICAgICAgIGNvbnRlbnRPZmZzZXQgPSB0aGlzLnVuaW9uLmRpc2NyaW1pbmF0b3IubGF5b3V0LnNwYW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubGF5b3V0XG4gICAgICAgICAgICAmJiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzcmMsIHRoaXMucHJvcGVydHkpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFyaWFudCBsYWNrcyBwcm9wZXJ0eSAnICsgdGhpcy5wcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy51bmlvbi5kaXNjcmltaW5hdG9yLmVuY29kZSh0aGlzLnZhcmlhbnQsIGIsIG9mZnNldCk7XG4gICAgICAgIGxldCBzcGFuID0gY29udGVudE9mZnNldDtcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0KSB7XG4gICAgICAgICAgICB0aGlzLmxheW91dC5lbmNvZGUoc3JjW3RoaXMucHJvcGVydHldLCBiLCBvZmZzZXQgKyBjb250ZW50T2Zmc2V0KTtcbiAgICAgICAgICAgIHNwYW4gKz0gdGhpcy5sYXlvdXQuZ2V0U3BhbihiLCBvZmZzZXQgKyBjb250ZW50T2Zmc2V0KTtcbiAgICAgICAgICAgIGlmICgoMCA8PSB0aGlzLnVuaW9uLnNwYW4pXG4gICAgICAgICAgICAgICAgJiYgKHNwYW4gPiB0aGlzLnVuaW9uLnNwYW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNvZGVkIHZhcmlhbnQgb3ZlcnJ1bnMgY29udGFpbmluZyB1bmlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICAvKiogRGVsZWdhdGUge0BsaW5rIExheW91dCNmcm9tQXJyYXl8ZnJvbUFycmF5fSB0byB7QGxpbmtcbiAgICAgKiBWYXJpYW50TGF5b3V0I2xheW91dHxsYXlvdXR9LiAqL1xuICAgIGZyb21BcnJheSh2YWx1ZXMpIHtcbiAgICAgICAgaWYgKHRoaXMubGF5b3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sYXlvdXQuZnJvbUFycmF5KHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnRzLlZhcmlhbnRMYXlvdXQgPSBWYXJpYW50TGF5b3V0O1xuLyoqIEphdmFTY3JpcHQgY2hvc2UgdG8gZGVmaW5lIGJpdHdpc2Ugb3BlcmF0aW9ucyBhcyBvcGVyYXRpbmcgb25cbiAqIHNpZ25lZCAzMi1iaXQgdmFsdWVzIGluIDIncyBjb21wbGVtZW50IGZvcm0sIG1lYW5pbmcgYW55IGludGVnZXJcbiAqIHdpdGggYml0IDMxIHNldCBpcyBnb2luZyB0byBsb29rIG5lZ2F0aXZlLiAgRm9yIHJpZ2h0IHNoaWZ0cyB0aGF0J3NcbiAqIG5vdCBhIHByb2JsZW0sIGJlY2F1c2UgYD4+PmAgaXMgYSBsb2dpY2FsIHNoaWZ0LCBidXQgZm9yIGV2ZXJ5XG4gKiBvdGhlciBiaXR3aXNlIG9wZXJhdG9yIHdlIGhhdmUgdG8gY29tcGVuc2F0ZSBmb3IgcG9zc2libGUgbmVnYXRpdmVcbiAqIHJlc3VsdHMuICovXG5mdW5jdGlvbiBmaXhCaXR3aXNlUmVzdWx0KHYpIHtcbiAgICBpZiAoMCA+IHYpIHtcbiAgICAgICAgdiArPSAweDEwMDAwMDAwMDtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG59XG4vKipcbiAqIENvbnRhaW4gYSBzZXF1ZW5jZSBvZiBiaXQgZmllbGRzIGFzIGFuIHVuc2lnbmVkIGludGVnZXIuXG4gKlxuICogKkZhY3RvcnkqOiB7QGxpbmsgbW9kdWxlOkxheW91dC5iaXRzfGJpdHN9XG4gKlxuICogVGhpcyBpcyBhIGNvbnRhaW5lciBlbGVtZW50OyB3aXRoaW4gaXQgdGhlcmUgYXJlIHtAbGluayBCaXRGaWVsZH1cbiAqIGluc3RhbmNlcyB0aGF0IHByb3ZpZGUgdGhlIGV4dHJhY3RlZCBwcm9wZXJ0aWVzLiAgVGhlIGNvbnRhaW5lclxuICogc2ltcGx5IGRlZmluZXMgdGhlIGFnZ3JlZ2F0ZSByZXByZXNlbnRhdGlvbiBhbmQgaXRzIGJpdCBvcmRlcmluZy5cbiAqIFRoZSByZXByZXNlbnRhdGlvbiBpcyBhbiBvYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIHdpdGggbnVtZXJpY1xuICogb3Ige0BsaW5rIEJvb2xlYW59IHZhbHVlcy5cbiAqXG4gKiB7QGxpbmsgQml0RmllbGR9cyBhcmUgYWRkZWQgd2l0aCB0aGUge0BsaW5rXG4gKiBCaXRTdHJ1Y3R1cmUjYWRkRmllbGR8YWRkRmllbGR9IGFuZCB7QGxpbmtcbiAqIEJpdFN0cnVjdHVyZSNhZGRCb29sZWFufGFkZEJvb2xlYW59IG1ldGhvZHMuXG5cbiAqIEBwYXJhbSB7TGF5b3V0fSB3b3JkIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogQml0U3RydWN0dXJlI3dvcmR8d29yZH0uICBUaGUgcGFyYW1ldGVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2ZcbiAqIHtAbGluayBVSW50fSAob3Ige0BsaW5rIFVJbnRCRX0pIHRoYXQgaXMgbm8gbW9yZSB0aGFuIDQgYnl0ZXMgd2lkZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2x9IFttc2JdIC0gYHRydWVgIGlmIHRoZSBiaXQgbnVtYmVyaW5nIHN0YXJ0cyBhdCB0aGVcbiAqIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBjb250YWluaW5nIHdvcmQ7IGBmYWxzZWAgKGRlZmF1bHQpIGlmXG4gKiBpdCBzdGFydHMgYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgY29udGFpbmluZyB3b3JkLiAgSWZcbiAqIHRoZSBwYXJhbWV0ZXIgYXQgdGhpcyBwb3NpdGlvbiBpcyBhIHN0cmluZyBhbmQgYHByb3BlcnR5YCBpc1xuICogYHVuZGVmaW5lZGAgdGhlIHZhbHVlIG9mIHRoaXMgYXJndW1lbnQgd2lsbCBpbnN0ZWFkIGJlIHVzZWQgYXMgdGhlXG4gKiB2YWx1ZSBvZiBgcHJvcGVydHlgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAqXG4gKiBAYXVnbWVudHMge0xheW91dH1cbiAqL1xuY2xhc3MgQml0U3RydWN0dXJlIGV4dGVuZHMgTGF5b3V0IHtcbiAgICBjb25zdHJ1Y3Rvcih3b3JkLCBtc2IsIHByb3BlcnR5KSB7XG4gICAgICAgIGlmICghKCh3b3JkIGluc3RhbmNlb2YgVUludClcbiAgICAgICAgICAgIHx8ICh3b3JkIGluc3RhbmNlb2YgVUludEJFKSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3dvcmQgbXVzdCBiZSBhIFVJbnQgb3IgVUludEJFIGxheW91dCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoJ3N0cmluZycgPT09IHR5cGVvZiBtc2IpXG4gICAgICAgICAgICAmJiAodW5kZWZpbmVkID09PSBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHByb3BlcnR5ID0gbXNiO1xuICAgICAgICAgICAgbXNiID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKDQgPCB3b3JkLnNwYW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd3b3JkIGNhbm5vdCBleGNlZWQgMzIgYml0cycpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKHdvcmQuc3BhbiwgcHJvcGVydHkpO1xuICAgICAgICAvKiogVGhlIGxheW91dCB1c2VkIGZvciB0aGUgcGFja2VkIHZhbHVlLiAge0BsaW5rIEJpdEZpZWxkfVxuICAgICAgICAgKiBpbnN0YW5jZXMgYXJlIHBhY2tlZCBzZXF1ZW50aWFsbHkgZGVwZW5kaW5nIG9uIHtAbGlua1xuICAgICAgICAgKiBCaXRTdHJ1Y3R1cmUjbXNifG1zYn0uICovXG4gICAgICAgIHRoaXMud29yZCA9IHdvcmQ7XG4gICAgICAgIC8qKiBXaGV0aGVyIHRoZSBiaXQgc2VxdWVuY2VzIGFyZSBwYWNrZWQgc3RhcnRpbmcgYXQgdGhlIG1vc3RcbiAgICAgICAgICogc2lnbmlmaWNhbnQgYml0IGdyb3dpbmcgZG93biAoYHRydWVgKSwgb3IgdGhlIGxlYXN0IHNpZ25pZmljYW50XG4gICAgICAgICAqIGJpdCBncm93aW5nIHVwIChgZmFsc2VgKS5cbiAgICAgICAgICpcbiAgICAgICAgICogKipOT1RFKiogUmVnYXJkbGVzcyBvZiB0aGlzIHZhbHVlLCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mXG4gICAgICAgICAqIGFueSB7QGxpbmsgQml0RmllbGR9IHZhbHVlIGlzIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgdGhlXG4gICAgICAgICAqIGNvcnJlc3BvbmRpbmcgc2VjdGlvbiBvZiB0aGUgcGFja2VkIHZhbHVlLiAqL1xuICAgICAgICB0aGlzLm1zYiA9ICEhbXNiO1xuICAgICAgICAvKiogVGhlIHNlcXVlbmNlIG9mIHtAbGluayBCaXRGaWVsZH0gbGF5b3V0cyB0aGF0IGNvbXByaXNlIHRoZVxuICAgICAgICAgKiBwYWNrZWQgc3RydWN0dXJlLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKk5PVEUqKiBUaGUgYXJyYXkgcmVtYWlucyBtdXRhYmxlIHRvIGFsbG93IGZpZWxkcyB0byBiZSB7QGxpbmtcbiAgICAgICAgICogQml0U3RydWN0dXJlI2FkZEZpZWxkfGFkZGVkfSBhZnRlciBjb25zdHJ1Y3Rpb24uICBVc2VycyBzaG91bGRcbiAgICAgICAgICogbm90IG1hbmlwdWxhdGUgdGhlIGNvbnRlbnQgb2YgdGhpcyBwcm9wZXJ0eS4qL1xuICAgICAgICB0aGlzLmZpZWxkcyA9IFtdO1xuICAgICAgICAvKiBTdG9yYWdlIGZvciB0aGUgdmFsdWUuICBDYXB0dXJlIGEgdmFyaWFibGUgaW5zdGVhZCBvZiB1c2luZyBhblxuICAgICAgICAgKiBpbnN0YW5jZSBwcm9wZXJ0eSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgYW55dGhpbmcgdG8gY2hhbmdlIHRoZVxuICAgICAgICAgKiB2YWx1ZSB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIG11dGF0b3IuICovXG4gICAgICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgICAgIHRoaXMuX3BhY2tlZFNldFZhbHVlID0gZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgIHZhbHVlID0gZml4Qml0d2lzZVJlc3VsdCh2KTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9wYWNrZWRHZXRWYWx1ZSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGRlY29kZShiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNvbnN0IGRlc3QgPSB0aGlzLm1ha2VEZXN0aW5hdGlvbk9iamVjdCgpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMud29yZC5kZWNvZGUoYiwgb2Zmc2V0KTtcbiAgICAgICAgdGhpcy5fcGFja2VkU2V0VmFsdWUodmFsdWUpO1xuICAgICAgICBmb3IgKGNvbnN0IGZkIG9mIHRoaXMuZmllbGRzKSB7XG4gICAgICAgICAgICBpZiAodW5kZWZpbmVkICE9PSBmZC5wcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIGRlc3RbZmQucHJvcGVydHldID0gZmQuZGVjb2RlKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXN0O1xuICAgIH1cbiAgICAvKiogSW1wbGVtZW50IHtAbGluayBMYXlvdXQjZW5jb2RlfGVuY29kZX0gZm9yIHtAbGluayBCaXRTdHJ1Y3R1cmV9LlxuICAgICAqXG4gICAgICogSWYgYHNyY2AgaXMgbWlzc2luZyBhIHByb3BlcnR5IGZvciBhIG1lbWJlciB3aXRoIGEgZGVmaW5lZCB7QGxpbmtcbiAgICAgKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9IHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lvbiBvZiB0aGUgcGFja2VkXG4gICAgICogdmFsdWUgaXMgbGVmdCB1bm1vZGlmaWVkLiAgVW51c2VkIGJpdHMgYXJlIGFsc28gbGVmdCB1bm1vZGlmaWVkLiAqL1xuICAgIGVuY29kZShzcmMsIGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLndvcmQuZGVjb2RlKGIsIG9mZnNldCk7XG4gICAgICAgIHRoaXMuX3BhY2tlZFNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgZm9yIChjb25zdCBmZCBvZiB0aGlzLmZpZWxkcykge1xuICAgICAgICAgICAgaWYgKHVuZGVmaW5lZCAhPT0gZmQucHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmdiA9IHNyY1tmZC5wcm9wZXJ0eV07XG4gICAgICAgICAgICAgICAgaWYgKHVuZGVmaW5lZCAhPT0gZnYpIHtcbiAgICAgICAgICAgICAgICAgICAgZmQuZW5jb2RlKGZ2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud29yZC5lbmNvZGUodGhpcy5fcGFja2VkR2V0VmFsdWUoKSwgYiwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqIFJlZ2lzdGVyIGEgbmV3IGJpdGZpZWxkIHdpdGggYSBjb250YWluaW5nIGJpdCBzdHJ1Y3R1cmUuICBUaGVcbiAgICAgKiByZXN1bHRpbmcgYml0ZmllbGQgaXMgcmV0dXJuZWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gYml0cyAtIGluaXRpYWxpemVyIGZvciB7QGxpbmsgQml0RmllbGQjYml0c3xiaXRzfS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAgICAgKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qml0RmllbGR9ICovXG4gICAgYWRkRmllbGQoYml0cywgcHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgYmYgPSBuZXcgQml0RmllbGQodGhpcywgYml0cywgcHJvcGVydHkpO1xuICAgICAgICB0aGlzLmZpZWxkcy5wdXNoKGJmKTtcbiAgICAgICAgcmV0dXJuIGJmO1xuICAgIH1cbiAgICAvKiogQXMgd2l0aCB7QGxpbmsgQml0U3RydWN0dXJlI2FkZEZpZWxkfGFkZEZpZWxkfSBmb3Igc2luZ2xlLWJpdFxuICAgICAqIGZpZWxkcyB3aXRoIGBib29sZWFuYCB2YWx1ZSByZXByZXNlbnRhdGlvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAgICAgKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gKi9cbiAgICAvLyBgQm9vbGVhbmAgY29uZmxpY3RzIHdpdGggdGhlIG5hdGl2ZSBwcmltaXRpdmUgdHlwZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXG4gICAgYWRkQm9vbGVhbihwcm9wZXJ0eSkge1xuICAgICAgICAvLyBUaGlzIGlzIG15IEJvb2xlYW4sIG5vdCB0aGUgSmF2YXNjcmlwdCBvbmUuXG4gICAgICAgIGNvbnN0IGJmID0gbmV3IEJvb2xlYW4odGhpcywgcHJvcGVydHkpO1xuICAgICAgICB0aGlzLmZpZWxkcy5wdXNoKGJmKTtcbiAgICAgICAgcmV0dXJuIGJmO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBHZXQgYWNjZXNzIHRvIHRoZSBiaXQgZmllbGQgZm9yIGEgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gcHJvcGVydHkgLSB0aGUgYml0IGZpZWxkIG9mIGludGVyZXN0LlxuICAgICAqXG4gICAgICogQHJldHVybiB7Qml0RmllbGR9IC0gdGhlIGZpZWxkIGFzc29jaWF0ZWQgd2l0aCBgcHJvcGVydHlgLCBvclxuICAgICAqIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyBzdWNoIHByb3BlcnR5LlxuICAgICAqL1xuICAgIGZpZWxkRm9yKHByb3BlcnR5KSB7XG4gICAgICAgIGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIHByb3BlcnR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdwcm9wZXJ0eSBtdXN0IGJlIHN0cmluZycpO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgZmQgb2YgdGhpcy5maWVsZHMpIHtcbiAgICAgICAgICAgIGlmIChmZC5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5leHBvcnRzLkJpdFN0cnVjdHVyZSA9IEJpdFN0cnVjdHVyZTtcbi8qKlxuICogUmVwcmVzZW50IGEgc2VxdWVuY2Ugb2YgYml0cyB3aXRoaW4gYSB7QGxpbmsgQml0U3RydWN0dXJlfS5cbiAqXG4gKiBBbGwgYml0IGZpZWxkIHZhbHVlcyBhcmUgcmVwcmVzZW50ZWQgYXMgdW5zaWduZWQgaW50ZWdlcnMuXG4gKlxuICogKipOT1RFKiogVXNlciBjb2RlIHNob3VsZCBub3QgaW52b2tlIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gKiBVc2UgdGhlIGNvbnRhaW5lciB7QGxpbmsgQml0U3RydWN0dXJlI2FkZEZpZWxkfGFkZEZpZWxkfSBoZWxwZXJcbiAqIG1ldGhvZC5cbiAqXG4gKiAqKk5PVEUqKiBCaXRGaWVsZCBpbnN0YW5jZXMgYXJlIG5vdCBpbnN0YW5jZXMgb2Yge0BsaW5rIExheW91dH1cbiAqIHNpbmNlIHtAbGluayBMYXlvdXQjc3BhbnxzcGFufSBtZWFzdXJlcyA4LWJpdCB1bml0cy5cbiAqXG4gKiBAcGFyYW0ge0JpdFN0cnVjdHVyZX0gY29udGFpbmVyIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogQml0RmllbGQjY29udGFpbmVyfGNvbnRhaW5lcn0uXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGJpdHMgLSBpbml0aWFsaXplciBmb3Ige0BsaW5rIEJpdEZpZWxkI2JpdHN8Yml0c30uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICovXG5jbGFzcyBCaXRGaWVsZCB7XG4gICAgY29uc3RydWN0b3IoY29udGFpbmVyLCBiaXRzLCBwcm9wZXJ0eSkge1xuICAgICAgICBpZiAoIShjb250YWluZXIgaW5zdGFuY2VvZiBCaXRTdHJ1Y3R1cmUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdjb250YWluZXIgbXVzdCBiZSBhIEJpdFN0cnVjdHVyZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoIU51bWJlci5pc0ludGVnZXIoYml0cykpIHx8ICgwID49IGJpdHMpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdiaXRzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsQml0cyA9IDggKiBjb250YWluZXIuc3BhbjtcbiAgICAgICAgY29uc3QgdXNlZEJpdHMgPSBjb250YWluZXIuZmllbGRzLnJlZHVjZSgoc3VtLCBmZCkgPT4gc3VtICsgZmQuYml0cywgMCk7XG4gICAgICAgIGlmICgoYml0cyArIHVzZWRCaXRzKSA+IHRvdGFsQml0cykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiaXRzIHRvbyBsb25nIGZvciBzcGFuIHJlbWFpbmRlciAoJ1xuICAgICAgICAgICAgICAgICsgKHRvdGFsQml0cyAtIHVzZWRCaXRzKSArICcgb2YgJ1xuICAgICAgICAgICAgICAgICsgdG90YWxCaXRzICsgJyByZW1haW4pJyk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIFRoZSB7QGxpbmsgQml0U3RydWN0dXJlfSBpbnN0YW5jZSB0byB3aGljaCB0aGlzIGJpdCBmaWVsZFxuICAgICAgICAgKiBiZWxvbmdzLiAqL1xuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjtcbiAgICAgICAgLyoqIFRoZSBzcGFuIG9mIHRoaXMgdmFsdWUgaW4gYml0cy4gKi9cbiAgICAgICAgdGhpcy5iaXRzID0gYml0cztcbiAgICAgICAgLyoqIEEgbWFzayBvZiB7QGxpbmsgQml0RmllbGQjYml0c3xiaXRzfSBiaXRzIGlzb2xhdGluZyB2YWx1ZSBiaXRzXG4gICAgICAgICAqIHRoYXQgZml0IHdpdGhpbiB0aGUgZmllbGQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFRoYXQgaXMsIGl0IG1hc2tzIGEgdmFsdWUgdGhhdCBoYXMgbm90IHlldCBiZWVuIHNoaWZ0ZWQgaW50b1xuICAgICAgICAgKiBwb3NpdGlvbiB3aXRoaW4gaXRzIGNvbnRhaW5pbmcgcGFja2VkIGludGVnZXIuICovXG4gICAgICAgIHRoaXMudmFsdWVNYXNrID0gKDEgPDwgYml0cykgLSAxO1xuICAgICAgICBpZiAoMzIgPT09IGJpdHMpIHsgLy8gc2hpZnRlZCB2YWx1ZSBvdXQgb2YgcmFuZ2VcbiAgICAgICAgICAgIHRoaXMudmFsdWVNYXNrID0gMHhGRkZGRkZGRjtcbiAgICAgICAgfVxuICAgICAgICAvKiogVGhlIG9mZnNldCBvZiB0aGUgdmFsdWUgd2l0aGluIHRoZSBjb250YWluaW5nIHBhY2tlZCB1bnNpZ25lZFxuICAgICAgICAgKiBpbnRlZ2VyLiAgVGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgcGFja2VkIHZhbHVlIGlzIGF0XG4gICAgICAgICAqIG9mZnNldCB6ZXJvLCByZWdhcmRsZXNzIG9mIGJpdCBvcmRlcmluZyB1c2VkLiAqL1xuICAgICAgICB0aGlzLnN0YXJ0ID0gdXNlZEJpdHM7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lci5tc2IpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnQgPSB0b3RhbEJpdHMgLSB1c2VkQml0cyAtIGJpdHM7XG4gICAgICAgIH1cbiAgICAgICAgLyoqIEEgbWFzayBvZiB7QGxpbmsgQml0RmllbGQjYml0c3xiaXRzfSBpc29sYXRpbmcgdGhlIGZpZWxkIHZhbHVlXG4gICAgICAgICAqIHdpdGhpbiB0aGUgY29udGFpbmluZyBwYWNrZWQgdW5zaWduZWQgaW50ZWdlci4gKi9cbiAgICAgICAgdGhpcy53b3JkTWFzayA9IGZpeEJpdHdpc2VSZXN1bHQodGhpcy52YWx1ZU1hc2sgPDwgdGhpcy5zdGFydCk7XG4gICAgICAgIC8qKiBUaGUgcHJvcGVydHkgbmFtZSB1c2VkIHdoZW4gdGhpcyBiaXRmaWVsZCBpcyByZXByZXNlbnRlZCBpbiBhblxuICAgICAgICAgKiBPYmplY3QuXG4gICAgICAgICAqXG4gICAgICAgICAqIEludGVuZGVkIHRvIGJlIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIHtAbGlua1xuICAgICAgICAgKiBMYXlvdXQjcHJvcGVydHl9LlxuICAgICAgICAgKlxuICAgICAgICAgKiBJZiBsZWZ0IHVuZGVmaW5lZCB0aGUgY29ycmVzcG9uZGluZyBzcGFuIG9mIGJpdHMgd2lsbCBiZVxuICAgICAgICAgKiB0cmVhdGVkIGFzIHBhZGRpbmc6IGl0IHdpbGwgbm90IGJlIG11dGF0ZWQgYnkge0BsaW5rXG4gICAgICAgICAqIExheW91dCNlbmNvZGV8ZW5jb2RlfSBub3IgcmVwcmVzZW50ZWQgYXMgYSBwcm9wZXJ0eSBpbiB0aGVcbiAgICAgICAgICogZGVjb2RlZCBPYmplY3QuICovXG4gICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTtcbiAgICB9XG4gICAgLyoqIFN0b3JlIGEgdmFsdWUgaW50byB0aGUgY29ycmVzcG9uZGluZyBzdWJzZXF1ZW5jZSBvZiB0aGUgY29udGFpbmluZ1xuICAgICAqIGJpdCBmaWVsZC4gKi9cbiAgICBkZWNvZGUoYiwgb2Zmc2V0KSB7XG4gICAgICAgIGNvbnN0IHdvcmQgPSB0aGlzLmNvbnRhaW5lci5fcGFja2VkR2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgd29yZFZhbHVlID0gZml4Qml0d2lzZVJlc3VsdCh3b3JkICYgdGhpcy53b3JkTWFzayk7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gd29yZFZhbHVlID4+PiB0aGlzLnN0YXJ0O1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIC8qKiBTdG9yZSBhIHZhbHVlIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgc3Vic2VxdWVuY2Ugb2YgdGhlIGNvbnRhaW5pbmdcbiAgICAgKiBiaXQgZmllbGQuXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBUaGlzIGlzIG5vdCBhIHNwZWNpYWxpemF0aW9uIG9mIHtAbGlua1xuICAgICAqIExheW91dCNlbmNvZGV8TGF5b3V0LmVuY29kZX0gYW5kIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4gKi9cbiAgICBlbmNvZGUodmFsdWUpIHtcbiAgICAgICAgaWYgKCdudW1iZXInICE9PSB0eXBlb2YgdmFsdWVcbiAgICAgICAgICAgIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKVxuICAgICAgICAgICAgfHwgKHZhbHVlICE9PSBmaXhCaXR3aXNlUmVzdWx0KHZhbHVlICYgdGhpcy52YWx1ZU1hc2spKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihuYW1lV2l0aFByb3BlcnR5KCdCaXRGaWVsZC5lbmNvZGUnLCB0aGlzKVxuICAgICAgICAgICAgICAgICsgJyB2YWx1ZSBtdXN0IGJlIGludGVnZXIgbm90IGV4Y2VlZGluZyAnICsgdGhpcy52YWx1ZU1hc2spO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdvcmQgPSB0aGlzLmNvbnRhaW5lci5fcGFja2VkR2V0VmFsdWUoKTtcbiAgICAgICAgY29uc3Qgd29yZFZhbHVlID0gZml4Qml0d2lzZVJlc3VsdCh2YWx1ZSA8PCB0aGlzLnN0YXJ0KTtcbiAgICAgICAgdGhpcy5jb250YWluZXIuX3BhY2tlZFNldFZhbHVlKGZpeEJpdHdpc2VSZXN1bHQod29yZCAmIH50aGlzLndvcmRNYXNrKVxuICAgICAgICAgICAgfCB3b3JkVmFsdWUpO1xuICAgIH1cbn1cbmV4cG9ydHMuQml0RmllbGQgPSBCaXRGaWVsZDtcbi8qKlxuICogUmVwcmVzZW50IGEgc2luZ2xlIGJpdCB3aXRoaW4gYSB7QGxpbmsgQml0U3RydWN0dXJlfSBhcyBhXG4gKiBKYXZhU2NyaXB0IGJvb2xlYW4uXG4gKlxuICogKipOT1RFKiogVXNlciBjb2RlIHNob3VsZCBub3QgaW52b2tlIHRoaXMgY29uc3RydWN0b3IgZGlyZWN0bHkuXG4gKiBVc2UgdGhlIGNvbnRhaW5lciB7QGxpbmsgQml0U3RydWN0dXJlI2FkZEJvb2xlYW58YWRkQm9vbGVhbn0gaGVscGVyXG4gKiBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtCaXRTdHJ1Y3R1cmV9IGNvbnRhaW5lciAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIEJpdEZpZWxkI2NvbnRhaW5lcnxjb250YWluZXJ9LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAqXG4gKiBAYXVnbWVudHMge0JpdEZpZWxkfVxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1leHRlbmQtbmF0aXZlICovXG5jbGFzcyBCb29sZWFuIGV4dGVuZHMgQml0RmllbGQge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lciwgcHJvcGVydHkpIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyLCAxLCBwcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8qKiBPdmVycmlkZSB7QGxpbmsgQml0RmllbGQjZGVjb2RlfGRlY29kZX0gZm9yIHtAbGluayBCb29sZWFufEJvb2xlYW59LlxuICAgICAqXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICovXG4gICAgZGVjb2RlKGIsIG9mZnNldCkge1xuICAgICAgICByZXR1cm4gISFzdXBlci5kZWNvZGUoYiwgb2Zmc2V0KTtcbiAgICB9XG4gICAgLyoqIEBvdmVycmlkZSAqL1xuICAgIGVuY29kZSh2YWx1ZSkge1xuICAgICAgICBpZiAoJ2Jvb2xlYW4nID09PSB0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgICAgIC8vIEJpdEZpZWxkIHJlcXVpcmVzIGludGVnZXIgdmFsdWVzXG4gICAgICAgICAgICB2YWx1ZSA9ICt2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBzdXBlci5lbmNvZGUodmFsdWUpO1xuICAgIH1cbn1cbmV4cG9ydHMuQm9vbGVhbiA9IEJvb2xlYW47XG4vKiBlc2xpbnQtZW5hYmxlIG5vLWV4dGVuZC1uYXRpdmUgKi9cbi8qKlxuICogQ29udGFpbiBhIGZpeGVkLWxlbmd0aCBibG9jayBvZiBhcmJpdHJhcnkgZGF0YSwgcmVwcmVzZW50ZWQgYXMgYVxuICogVWludDhBcnJheS5cbiAqXG4gKiAqRmFjdG9yeSo6IHtAbGluayBtb2R1bGU6TGF5b3V0LmJsb2J8YmxvYn1cbiAqXG4gKiBAcGFyYW0geyhOdW1iZXJ8RXh0ZXJuYWxMYXlvdXQpfSBsZW5ndGggLSBpbml0aWFsaXplcyB7QGxpbmtcbiAqIEJsb2IjbGVuZ3RofGxlbmd0aH0uXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtwcm9wZXJ0eV0gLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICpcbiAqIEBhdWdtZW50cyB7TGF5b3V0fVxuICovXG5jbGFzcyBCbG9iIGV4dGVuZHMgTGF5b3V0IHtcbiAgICBjb25zdHJ1Y3RvcihsZW5ndGgsIHByb3BlcnR5KSB7XG4gICAgICAgIGlmICghKCgobGVuZ3RoIGluc3RhbmNlb2YgRXh0ZXJuYWxMYXlvdXQpICYmIGxlbmd0aC5pc0NvdW50KCkpXG4gICAgICAgICAgICB8fCAoTnVtYmVyLmlzSW50ZWdlcihsZW5ndGgpICYmICgwIDw9IGxlbmd0aCkpKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignbGVuZ3RoIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlciAnXG4gICAgICAgICAgICAgICAgKyAnb3IgYW4gdW5zaWduZWQgaW50ZWdlciBFeHRlcm5hbExheW91dCcpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBzcGFuID0gLTE7XG4gICAgICAgIGlmICghKGxlbmd0aCBpbnN0YW5jZW9mIEV4dGVybmFsTGF5b3V0KSkge1xuICAgICAgICAgICAgc3BhbiA9IGxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBzdXBlcihzcGFuLCBwcm9wZXJ0eSk7XG4gICAgICAgIC8qKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBibG9iLlxuICAgICAgICAgKlxuICAgICAgICAgKiBUaGlzIG1heSBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBvciBhbiBpbnN0YW5jZSBvZiB7QGxpbmtcbiAgICAgICAgICogRXh0ZXJuYWxMYXlvdXR9IHRoYXQgc2F0aXNmaWVzIHtAbGlua1xuICAgICAgICAgKiBFeHRlcm5hbExheW91dCNpc0NvdW50fGlzQ291bnQoKX0uICovXG4gICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZ2V0U3BhbihiLCBvZmZzZXQpIHtcbiAgICAgICAgbGV0IHNwYW4gPSB0aGlzLnNwYW47XG4gICAgICAgIGlmICgwID4gc3Bhbikge1xuICAgICAgICAgICAgc3BhbiA9IHRoaXMubGVuZ3RoLmRlY29kZShiLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGFuO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgbGV0IHNwYW4gPSB0aGlzLnNwYW47XG4gICAgICAgIGlmICgwID4gc3Bhbikge1xuICAgICAgICAgICAgc3BhbiA9IHRoaXMubGVuZ3RoLmRlY29kZShiLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1aW50OEFycmF5VG9CdWZmZXIoYikuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzcGFuKTtcbiAgICB9XG4gICAgLyoqIEltcGxlbWVudCB7QGxpbmsgTGF5b3V0I2VuY29kZXxlbmNvZGV9IGZvciB7QGxpbmsgQmxvYn0uXG4gICAgICpcbiAgICAgKiAqKk5PVEUqKiBJZiB7QGxpbmsgTGF5b3V0I2NvdW50fGNvdW50fSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmtcbiAgICAgKiBFeHRlcm5hbExheW91dH0gdGhlbiB0aGUgbGVuZ3RoIG9mIGBzcmNgIHdpbGwgYmUgZW5jb2RlZCBhcyB0aGVcbiAgICAgKiBjb3VudCBhZnRlciBgc3JjYCBpcyBlbmNvZGVkLiAqL1xuICAgIGVuY29kZShzcmMsIGIsIG9mZnNldCkge1xuICAgICAgICBsZXQgc3BhbiA9IHRoaXMubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggaW5zdGFuY2VvZiBFeHRlcm5hbExheW91dCkge1xuICAgICAgICAgICAgc3BhbiA9IHNyYy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCEoc3JjIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBzcGFuID09PSBzcmMubGVuZ3RoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihuYW1lV2l0aFByb3BlcnR5KCdCbG9iLmVuY29kZScsIHRoaXMpXG4gICAgICAgICAgICAgICAgKyAnIHJlcXVpcmVzIChsZW5ndGggJyArIHNwYW4gKyAnKSBVaW50OEFycmF5IGFzIHNyYycpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgob2Zmc2V0ICsgc3BhbikgPiBiLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ2VuY29kaW5nIG92ZXJydW5zIFVpbnQ4QXJyYXknKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzcmNCdWZmZXIgPSB1aW50OEFycmF5VG9CdWZmZXIoc3JjKTtcbiAgICAgICAgdWludDhBcnJheVRvQnVmZmVyKGIpLndyaXRlKHNyY0J1ZmZlci50b1N0cmluZygnaGV4JyksIG9mZnNldCwgc3BhbiwgJ2hleCcpO1xuICAgICAgICBpZiAodGhpcy5sZW5ndGggaW5zdGFuY2VvZiBFeHRlcm5hbExheW91dCkge1xuICAgICAgICAgICAgdGhpcy5sZW5ndGguZW5jb2RlKHNwYW4sIGIsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNwYW47XG4gICAgfVxufVxuZXhwb3J0cy5CbG9iID0gQmxvYjtcbi8qKlxuICogQ29udGFpbiBhIGBOVUxgLXRlcm1pbmF0ZWQgVVRGOCBzdHJpbmcuXG4gKlxuICogKkZhY3RvcnkqOiB7QGxpbmsgbW9kdWxlOkxheW91dC5jc3RyfGNzdHJ9XG4gKlxuICogKipOT1RFKiogQW55IFVURjggc3RyaW5nIHRoYXQgaW5jb3Jwb3JhdGVzIGEgemVyby12YWx1ZWQgYnl0ZSB3aWxsXG4gKiBub3QgYmUgY29ycmVjdGx5IGRlY29kZWQgYnkgdGhpcyBsYXlvdXQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IFtwcm9wZXJ0eV0gLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gKiBMYXlvdXQjcHJvcGVydHl8cHJvcGVydHl9LlxuICpcbiAqIEBhdWdtZW50cyB7TGF5b3V0fVxuICovXG5jbGFzcyBDU3RyaW5nIGV4dGVuZHMgTGF5b3V0IHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eSkge1xuICAgICAgICBzdXBlcigtMSwgcHJvcGVydHkpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZ2V0U3BhbihiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIGNoZWNrVWludDhBcnJheShiKTtcbiAgICAgICAgbGV0IGlkeCA9IG9mZnNldDtcbiAgICAgICAgd2hpbGUgKChpZHggPCBiLmxlbmd0aCkgJiYgKDAgIT09IGJbaWR4XSkpIHtcbiAgICAgICAgICAgIGlkeCArPSAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAxICsgaWR4IC0gb2Zmc2V0O1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZGVjb2RlKGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHRoaXMuZ2V0U3BhbihiLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gdWludDhBcnJheVRvQnVmZmVyKGIpLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc3BhbiAtIDEpLnRvU3RyaW5nKCd1dGYtOCcpO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHNyYywgYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICAvKiBNdXN0IGZvcmNlIHRoaXMgdG8gYSBzdHJpbmcsIGxlc3QgaXQgYmUgYSBudW1iZXIgYW5kIHRoZVxuICAgICAgICAgKiBcInV0ZjgtZW5jb2RpbmdcIiBiZWxvdyBhY3R1YWxseSBhbGxvY2F0ZSBhIGJ1ZmZlciBvZiBsZW5ndGhcbiAgICAgICAgICogc3JjICovXG4gICAgICAgIGlmICgnc3RyaW5nJyAhPT0gdHlwZW9mIHNyYykge1xuICAgICAgICAgICAgc3JjID0gU3RyaW5nKHNyYyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3JjYiA9IGJ1ZmZlcl8xLkJ1ZmZlci5mcm9tKHNyYywgJ3V0ZjgnKTtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHNyY2IubGVuZ3RoO1xuICAgICAgICBpZiAoKG9mZnNldCArIHNwYW4pID4gYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmNvZGluZyBvdmVycnVucyBCdWZmZXInKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBidWZmZXIgPSB1aW50OEFycmF5VG9CdWZmZXIoYik7XG4gICAgICAgIHNyY2IuY29weShidWZmZXIsIG9mZnNldCk7XG4gICAgICAgIGJ1ZmZlcltvZmZzZXQgKyBzcGFuXSA9IDA7XG4gICAgICAgIHJldHVybiBzcGFuICsgMTtcbiAgICB9XG59XG5leHBvcnRzLkNTdHJpbmcgPSBDU3RyaW5nO1xuLyoqXG4gKiBDb250YWluIGEgVVRGOCBzdHJpbmcgd2l0aCBpbXBsaWNpdCBsZW5ndGguXG4gKlxuICogKkZhY3RvcnkqOiB7QGxpbmsgbW9kdWxlOkxheW91dC51dGY4fHV0Zjh9XG4gKlxuICogKipOT1RFKiogQmVjYXVzZSB0aGUgbGVuZ3RoIGlzIGltcGxpY2l0IGluIHRoZSBzaXplIG9mIHRoZSBidWZmZXJcbiAqIHRoaXMgbGF5b3V0IHNob3VsZCBiZSB1c2VkIG9ubHkgaW4gaXNvbGF0aW9uLCBvciBpbiBhIHNpdHVhdGlvblxuICogd2hlcmUgdGhlIGxlbmd0aCBjYW4gYmUgZXhwcmVzc2VkIGJ5IG9wZXJhdGluZyBvbiBhIHNsaWNlIG9mIHRoZVxuICogY29udGFpbmluZyBidWZmZXIuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IFttYXhTcGFuXSAtIHRoZSBtYXhpbXVtIGxlbmd0aCBhbGxvd2VkIGZvciBlbmNvZGVkXG4gKiBzdHJpbmcgY29udGVudC4gIElmIG5vdCBwcm92aWRlZCB0aGVyZSBpcyBubyBib3VuZCBvbiB0aGUgYWxsb3dlZFxuICogY29udGVudC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gW3Byb3BlcnR5XSAtIGluaXRpYWxpemVyIGZvciB7QGxpbmtcbiAqIExheW91dCNwcm9wZXJ0eXxwcm9wZXJ0eX0uXG4gKlxuICogQGF1Z21lbnRzIHtMYXlvdXR9XG4gKi9cbmNsYXNzIFVURjggZXh0ZW5kcyBMYXlvdXQge1xuICAgIGNvbnN0cnVjdG9yKG1heFNwYW4sIHByb3BlcnR5KSB7XG4gICAgICAgIGlmICgoJ3N0cmluZycgPT09IHR5cGVvZiBtYXhTcGFuKSAmJiAodW5kZWZpbmVkID09PSBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIHByb3BlcnR5ID0gbWF4U3BhbjtcbiAgICAgICAgICAgIG1heFNwYW4gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVuZGVmaW5lZCA9PT0gbWF4U3Bhbikge1xuICAgICAgICAgICAgbWF4U3BhbiA9IC0xO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKG1heFNwYW4pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtYXhTcGFuIG11c3QgYmUgYW4gaW50ZWdlcicpO1xuICAgICAgICB9XG4gICAgICAgIHN1cGVyKC0xLCBwcm9wZXJ0eSk7XG4gICAgICAgIC8qKiBUaGUgbWF4aW11bSBzcGFuIG9mIHRoZSBsYXlvdXQgaW4gYnl0ZXMuXG4gICAgICAgICAqXG4gICAgICAgICAqIFBvc2l0aXZlIHZhbHVlcyBhcmUgZ2VuZXJhbGx5IGV4cGVjdGVkLiAgWmVybyBpcyBhYm5vcm1hbC5cbiAgICAgICAgICogQXR0ZW1wdHMgdG8gZW5jb2RlIG9yIGRlY29kZSBhIHZhbHVlIHRoYXQgZXhjZWVkcyB0aGlzIGxlbmd0aFxuICAgICAgICAgKiB3aWxsIHRocm93IGEgYFJhbmdlRXJyb3JgLlxuICAgICAgICAgKlxuICAgICAgICAgKiBBIG5lZ2F0aXZlIHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIGJvdW5kIG9uIHRoZSBsZW5ndGhcbiAgICAgICAgICogb2YgdGhlIGNvbnRlbnQuICovXG4gICAgICAgIHRoaXMubWF4U3BhbiA9IG1heFNwYW47XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBnZXRTcGFuKGIsIG9mZnNldCA9IDApIHtcbiAgICAgICAgY2hlY2tVaW50OEFycmF5KGIpO1xuICAgICAgICByZXR1cm4gYi5sZW5ndGggLSBvZmZzZXQ7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUoYiwgb2Zmc2V0ID0gMCkge1xuICAgICAgICBjb25zdCBzcGFuID0gdGhpcy5nZXRTcGFuKGIsIG9mZnNldCk7XG4gICAgICAgIGlmICgoMCA8PSB0aGlzLm1heFNwYW4pXG4gICAgICAgICAgICAmJiAodGhpcy5tYXhTcGFuIDwgc3BhbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0ZXh0IGxlbmd0aCBleGNlZWRzIG1heFNwYW4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdWludDhBcnJheVRvQnVmZmVyKGIpLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgc3BhbikudG9TdHJpbmcoJ3V0Zi04Jyk7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBlbmNvZGUoc3JjLCBiLCBvZmZzZXQgPSAwKSB7XG4gICAgICAgIC8qIE11c3QgZm9yY2UgdGhpcyB0byBhIHN0cmluZywgbGVzdCBpdCBiZSBhIG51bWJlciBhbmQgdGhlXG4gICAgICAgICAqIFwidXRmOC1lbmNvZGluZ1wiIGJlbG93IGFjdHVhbGx5IGFsbG9jYXRlIGEgYnVmZmVyIG9mIGxlbmd0aFxuICAgICAgICAgKiBzcmMgKi9cbiAgICAgICAgaWYgKCdzdHJpbmcnICE9PSB0eXBlb2Ygc3JjKSB7XG4gICAgICAgICAgICBzcmMgPSBTdHJpbmcoc3JjKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzcmNiID0gYnVmZmVyXzEuQnVmZmVyLmZyb20oc3JjLCAndXRmOCcpO1xuICAgICAgICBjb25zdCBzcGFuID0gc3JjYi5sZW5ndGg7XG4gICAgICAgIGlmICgoMCA8PSB0aGlzLm1heFNwYW4pXG4gICAgICAgICAgICAmJiAodGhpcy5tYXhTcGFuIDwgc3BhbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0ZXh0IGxlbmd0aCBleGNlZWRzIG1heFNwYW4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKG9mZnNldCArIHNwYW4pID4gYi5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdlbmNvZGluZyBvdmVycnVucyBCdWZmZXInKTtcbiAgICAgICAgfVxuICAgICAgICBzcmNiLmNvcHkodWludDhBcnJheVRvQnVmZmVyKGIpLCBvZmZzZXQpO1xuICAgICAgICByZXR1cm4gc3BhbjtcbiAgICB9XG59XG5leHBvcnRzLlVURjggPSBVVEY4O1xuLyoqXG4gKiBDb250YWluIGEgY29uc3RhbnQgdmFsdWUuXG4gKlxuICogVGhpcyBsYXlvdXQgbWF5IGJlIHVzZWQgaW4gY2FzZXMgd2hlcmUgYSBKYXZhU2NyaXB0IHZhbHVlIGNhbiBiZVxuICogaW5mZXJyZWQgd2l0aG91dCBhbiBleHByZXNzaW9uIGluIHRoZSBiaW5hcnkgZW5jb2RpbmcuICBBbiBleGFtcGxlXG4gKiB3b3VsZCBiZSBhIHtAbGluayBWYXJpYW50TGF5b3V0fHZhcmlhbnQgbGF5b3V0fSB3aGVyZSB0aGUgY29udGVudFxuICogaXMgaW1wbGllZCBieSB0aGUgdW5pb24ge0BsaW5rIFVuaW9uI2Rpc2NyaW1pbmF0b3J8ZGlzY3JpbWluYXRvcn0uXG4gKlxuICogQHBhcmFtIHtPYmplY3R8TnVtYmVyfFN0cmluZ30gdmFsdWUgLSBpbml0aWFsaXplciBmb3Ige0BsaW5rXG4gKiBDb25zdGFudCN2YWx1ZXx2YWx1ZX0uICBJZiB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0IChvciBhcnJheSkgYW5kXG4gKiB0aGUgYXBwbGljYXRpb24gaW50ZW5kcyB0aGUgb2JqZWN0IHRvIHJlbWFpbiB1bmNoYW5nZWQgcmVnYXJkbGVzc1xuICogb2Ygd2hhdCBpcyBkb25lIHRvIHZhbHVlcyBkZWNvZGVkIGJ5IHRoaXMgbGF5b3V0LCB0aGUgdmFsdWUgc2hvdWxkXG4gKiBiZSBmcm96ZW4gcHJpb3IgcGFzc2luZyBpdCB0byB0aGlzIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBbcHJvcGVydHldIC0gaW5pdGlhbGl6ZXIgZm9yIHtAbGlua1xuICogTGF5b3V0I3Byb3BlcnR5fHByb3BlcnR5fS5cbiAqXG4gKiBAYXVnbWVudHMge0xheW91dH1cbiAqL1xuY2xhc3MgQ29uc3RhbnQgZXh0ZW5kcyBMYXlvdXQge1xuICAgIGNvbnN0cnVjdG9yKHZhbHVlLCBwcm9wZXJ0eSkge1xuICAgICAgICBzdXBlcigwLCBwcm9wZXJ0eSk7XG4gICAgICAgIC8qKiBUaGUgdmFsdWUgcHJvZHVjZWQgYnkgdGhpcyBjb25zdGFudCB3aGVuIHRoZSBsYXlvdXQgaXMge0BsaW5rXG4gICAgICAgICAqIENvbnN0YW50I2RlY29kZXxkZWNvZGVkfS5cbiAgICAgICAgICpcbiAgICAgICAgICogQW55IEphdmFTY3JpcHQgdmFsdWUgaW5jbHVkaW5nIGBudWxsYCBhbmQgYHVuZGVmaW5lZGAgaXNcbiAgICAgICAgICogcGVybWl0dGVkLlxuICAgICAgICAgKlxuICAgICAgICAgKiAqKldBUk5JTkcqKiBJZiBgdmFsdWVgIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3Igd2FzIG5vdFxuICAgICAgICAgKiBmcm96ZW4sIGl0IGlzIHBvc3NpYmxlIGZvciB1c2VycyBvZiBkZWNvZGVkIHZhbHVlcyB0byBjaGFuZ2VcbiAgICAgICAgICogdGhlIGNvbnRlbnQgb2YgdGhlIHZhbHVlLiAqL1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIC8qKiBAb3ZlcnJpZGUgKi9cbiAgICBkZWNvZGUoYiwgb2Zmc2V0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH1cbiAgICAvKiogQG92ZXJyaWRlICovXG4gICAgZW5jb2RlKHNyYywgYiwgb2Zmc2V0KSB7XG4gICAgICAgIC8qIENvbnN0YW50cyB0YWtlIG5vIHNwYWNlICovXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cbn1cbmV4cG9ydHMuQ29uc3RhbnQgPSBDb25zdGFudDtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgR3JlZWR5Q291bnR9LiAqL1xuZXhwb3J0cy5ncmVlZHkgPSAoKGVsZW1lbnRTcGFuLCBwcm9wZXJ0eSkgPT4gbmV3IEdyZWVkeUNvdW50KGVsZW1lbnRTcGFuLCBwcm9wZXJ0eSkpO1xuLyoqIEZhY3RvcnkgZm9yIHtAbGluayBPZmZzZXRMYXlvdXR9LiAqL1xuZXhwb3J0cy5vZmZzZXQgPSAoKGxheW91dCwgb2Zmc2V0LCBwcm9wZXJ0eSkgPT4gbmV3IE9mZnNldExheW91dChsYXlvdXQsIG9mZnNldCwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgVUludHx1bnNpZ25lZCBpbnQgbGF5b3V0c30gc3Bhbm5pbmcgb25lXG4gKiBieXRlLiAqL1xuZXhwb3J0cy51OCA9ICgocHJvcGVydHkpID0+IG5ldyBVSW50KDEsIHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIFVJbnR8bGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnQgbGF5b3V0c31cbiAqIHNwYW5uaW5nIHR3byBieXRlcy4gKi9cbmV4cG9ydHMudTE2ID0gKChwcm9wZXJ0eSkgPT4gbmV3IFVJbnQoMiwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgVUludHxsaXR0bGUtZW5kaWFuIHVuc2lnbmVkIGludCBsYXlvdXRzfVxuICogc3Bhbm5pbmcgdGhyZWUgYnl0ZXMuICovXG5leHBvcnRzLnUyNCA9ICgocHJvcGVydHkpID0+IG5ldyBVSW50KDMsIHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIFVJbnR8bGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnQgbGF5b3V0c31cbiAqIHNwYW5uaW5nIGZvdXIgYnl0ZXMuICovXG5leHBvcnRzLnUzMiA9ICgocHJvcGVydHkpID0+IG5ldyBVSW50KDQsIHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIFVJbnR8bGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnQgbGF5b3V0c31cbiAqIHNwYW5uaW5nIGZpdmUgYnl0ZXMuICovXG5leHBvcnRzLnU0MCA9ICgocHJvcGVydHkpID0+IG5ldyBVSW50KDUsIHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIFVJbnR8bGl0dGxlLWVuZGlhbiB1bnNpZ25lZCBpbnQgbGF5b3V0c31cbiAqIHNwYW5uaW5nIHNpeCBieXRlcy4gKi9cbmV4cG9ydHMudTQ4ID0gKChwcm9wZXJ0eSkgPT4gbmV3IFVJbnQoNiwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgTmVhclVJbnQ2NHxsaXR0bGUtZW5kaWFuIHVuc2lnbmVkIGludFxuICogbGF5b3V0c30gaW50ZXJwcmV0ZWQgYXMgTnVtYmVycy4gKi9cbmV4cG9ydHMubnU2NCA9ICgocHJvcGVydHkpID0+IG5ldyBOZWFyVUludDY0KHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIFVJbnR8YmlnLWVuZGlhbiB1bnNpZ25lZCBpbnQgbGF5b3V0c31cbiAqIHNwYW5uaW5nIHR3byBieXRlcy4gKi9cbmV4cG9ydHMudTE2YmUgPSAoKHByb3BlcnR5KSA9PiBuZXcgVUludEJFKDIsIHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIFVJbnR8YmlnLWVuZGlhbiB1bnNpZ25lZCBpbnQgbGF5b3V0c31cbiAqIHNwYW5uaW5nIHRocmVlIGJ5dGVzLiAqL1xuZXhwb3J0cy51MjRiZSA9ICgocHJvcGVydHkpID0+IG5ldyBVSW50QkUoMywgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgVUludHxiaWctZW5kaWFuIHVuc2lnbmVkIGludCBsYXlvdXRzfVxuICogc3Bhbm5pbmcgZm91ciBieXRlcy4gKi9cbmV4cG9ydHMudTMyYmUgPSAoKHByb3BlcnR5KSA9PiBuZXcgVUludEJFKDQsIHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIFVJbnR8YmlnLWVuZGlhbiB1bnNpZ25lZCBpbnQgbGF5b3V0c31cbiAqIHNwYW5uaW5nIGZpdmUgYnl0ZXMuICovXG5leHBvcnRzLnU0MGJlID0gKChwcm9wZXJ0eSkgPT4gbmV3IFVJbnRCRSg1LCBwcm9wZXJ0eSkpO1xuLyoqIEZhY3RvcnkgZm9yIHtAbGluayBVSW50fGJpZy1lbmRpYW4gdW5zaWduZWQgaW50IGxheW91dHN9XG4gKiBzcGFubmluZyBzaXggYnl0ZXMuICovXG5leHBvcnRzLnU0OGJlID0gKChwcm9wZXJ0eSkgPT4gbmV3IFVJbnRCRSg2LCBwcm9wZXJ0eSkpO1xuLyoqIEZhY3RvcnkgZm9yIHtAbGluayBOZWFyVUludDY0QkV8YmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRcbiAqIGxheW91dHN9IGludGVycHJldGVkIGFzIE51bWJlcnMuICovXG5leHBvcnRzLm51NjRiZSA9ICgocHJvcGVydHkpID0+IG5ldyBOZWFyVUludDY0QkUocHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgSW50fHNpZ25lZCBpbnQgbGF5b3V0c30gc3Bhbm5pbmcgb25lXG4gKiBieXRlLiAqL1xuZXhwb3J0cy5zOCA9ICgocHJvcGVydHkpID0+IG5ldyBJbnQoMSwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgSW50fGxpdHRsZS1lbmRpYW4gc2lnbmVkIGludCBsYXlvdXRzfVxuICogc3Bhbm5pbmcgdHdvIGJ5dGVzLiAqL1xuZXhwb3J0cy5zMTYgPSAoKHByb3BlcnR5KSA9PiBuZXcgSW50KDIsIHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIEludHxsaXR0bGUtZW5kaWFuIHNpZ25lZCBpbnQgbGF5b3V0c31cbiAqIHNwYW5uaW5nIHRocmVlIGJ5dGVzLiAqL1xuZXhwb3J0cy5zMjQgPSAoKHByb3BlcnR5KSA9PiBuZXcgSW50KDMsIHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIEludHxsaXR0bGUtZW5kaWFuIHNpZ25lZCBpbnQgbGF5b3V0c31cbiAqIHNwYW5uaW5nIGZvdXIgYnl0ZXMuICovXG5leHBvcnRzLnMzMiA9ICgocHJvcGVydHkpID0+IG5ldyBJbnQoNCwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgSW50fGxpdHRsZS1lbmRpYW4gc2lnbmVkIGludCBsYXlvdXRzfVxuICogc3Bhbm5pbmcgZml2ZSBieXRlcy4gKi9cbmV4cG9ydHMuczQwID0gKChwcm9wZXJ0eSkgPT4gbmV3IEludCg1LCBwcm9wZXJ0eSkpO1xuLyoqIEZhY3RvcnkgZm9yIHtAbGluayBJbnR8bGl0dGxlLWVuZGlhbiBzaWduZWQgaW50IGxheW91dHN9XG4gKiBzcGFubmluZyBzaXggYnl0ZXMuICovXG5leHBvcnRzLnM0OCA9ICgocHJvcGVydHkpID0+IG5ldyBJbnQoNiwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgTmVhckludDY0fGxpdHRsZS1lbmRpYW4gc2lnbmVkIGludCBsYXlvdXRzfVxuICogaW50ZXJwcmV0ZWQgYXMgTnVtYmVycy4gKi9cbmV4cG9ydHMubnM2NCA9ICgocHJvcGVydHkpID0+IG5ldyBOZWFySW50NjQocHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgSW50fGJpZy1lbmRpYW4gc2lnbmVkIGludCBsYXlvdXRzfVxuICogc3Bhbm5pbmcgdHdvIGJ5dGVzLiAqL1xuZXhwb3J0cy5zMTZiZSA9ICgocHJvcGVydHkpID0+IG5ldyBJbnRCRSgyLCBwcm9wZXJ0eSkpO1xuLyoqIEZhY3RvcnkgZm9yIHtAbGluayBJbnR8YmlnLWVuZGlhbiBzaWduZWQgaW50IGxheW91dHN9XG4gKiBzcGFubmluZyB0aHJlZSBieXRlcy4gKi9cbmV4cG9ydHMuczI0YmUgPSAoKHByb3BlcnR5KSA9PiBuZXcgSW50QkUoMywgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgSW50fGJpZy1lbmRpYW4gc2lnbmVkIGludCBsYXlvdXRzfVxuICogc3Bhbm5pbmcgZm91ciBieXRlcy4gKi9cbmV4cG9ydHMuczMyYmUgPSAoKHByb3BlcnR5KSA9PiBuZXcgSW50QkUoNCwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgSW50fGJpZy1lbmRpYW4gc2lnbmVkIGludCBsYXlvdXRzfVxuICogc3Bhbm5pbmcgZml2ZSBieXRlcy4gKi9cbmV4cG9ydHMuczQwYmUgPSAoKHByb3BlcnR5KSA9PiBuZXcgSW50QkUoNSwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgSW50fGJpZy1lbmRpYW4gc2lnbmVkIGludCBsYXlvdXRzfVxuICogc3Bhbm5pbmcgc2l4IGJ5dGVzLiAqL1xuZXhwb3J0cy5zNDhiZSA9ICgocHJvcGVydHkpID0+IG5ldyBJbnRCRSg2LCBwcm9wZXJ0eSkpO1xuLyoqIEZhY3RvcnkgZm9yIHtAbGluayBOZWFySW50NjRCRXxiaWctZW5kaWFuIHNpZ25lZCBpbnQgbGF5b3V0c31cbiAqIGludGVycHJldGVkIGFzIE51bWJlcnMuICovXG5leHBvcnRzLm5zNjRiZSA9ICgocHJvcGVydHkpID0+IG5ldyBOZWFySW50NjRCRShwcm9wZXJ0eSkpO1xuLyoqIEZhY3RvcnkgZm9yIHtAbGluayBGbG9hdHxsaXR0bGUtZW5kaWFuIDMyLWJpdCBmbG9hdGluZyBwb2ludH0gdmFsdWVzLiAqL1xuZXhwb3J0cy5mMzIgPSAoKHByb3BlcnR5KSA9PiBuZXcgRmxvYXQocHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgRmxvYXRCRXxiaWctZW5kaWFuIDMyLWJpdCBmbG9hdGluZyBwb2ludH0gdmFsdWVzLiAqL1xuZXhwb3J0cy5mMzJiZSA9ICgocHJvcGVydHkpID0+IG5ldyBGbG9hdEJFKHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIERvdWJsZXxsaXR0bGUtZW5kaWFuIDY0LWJpdCBmbG9hdGluZyBwb2ludH0gdmFsdWVzLiAqL1xuZXhwb3J0cy5mNjQgPSAoKHByb3BlcnR5KSA9PiBuZXcgRG91YmxlKHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIERvdWJsZUJFfGJpZy1lbmRpYW4gNjQtYml0IGZsb2F0aW5nIHBvaW50fSB2YWx1ZXMuICovXG5leHBvcnRzLmY2NGJlID0gKChwcm9wZXJ0eSkgPT4gbmV3IERvdWJsZUJFKHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIFN0cnVjdHVyZX0gdmFsdWVzLiAqL1xuZXhwb3J0cy5zdHJ1Y3QgPSAoKGZpZWxkcywgcHJvcGVydHksIGRlY29kZVByZWZpeGVzKSA9PiBuZXcgU3RydWN0dXJlKGZpZWxkcywgcHJvcGVydHksIGRlY29kZVByZWZpeGVzKSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIEJpdFN0cnVjdHVyZX0gdmFsdWVzLiAqL1xuZXhwb3J0cy5iaXRzID0gKCh3b3JkLCBtc2IsIHByb3BlcnR5KSA9PiBuZXcgQml0U3RydWN0dXJlKHdvcmQsIG1zYiwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgU2VxdWVuY2V9IHZhbHVlcy4gKi9cbmV4cG9ydHMuc2VxID0gKChlbGVtZW50TGF5b3V0LCBjb3VudCwgcHJvcGVydHkpID0+IG5ldyBTZXF1ZW5jZShlbGVtZW50TGF5b3V0LCBjb3VudCwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgVW5pb259IHZhbHVlcy4gKi9cbmV4cG9ydHMudW5pb24gPSAoKGRpc2NyLCBkZWZhdWx0TGF5b3V0LCBwcm9wZXJ0eSkgPT4gbmV3IFVuaW9uKGRpc2NyLCBkZWZhdWx0TGF5b3V0LCBwcm9wZXJ0eSkpO1xuLyoqIEZhY3RvcnkgZm9yIHtAbGluayBVbmlvbkxheW91dERpc2NyaW1pbmF0b3J9IHZhbHVlcy4gKi9cbmV4cG9ydHMudW5pb25MYXlvdXREaXNjcmltaW5hdG9yID0gKChsYXlvdXQsIHByb3BlcnR5KSA9PiBuZXcgVW5pb25MYXlvdXREaXNjcmltaW5hdG9yKGxheW91dCwgcHJvcGVydHkpKTtcbi8qKiBGYWN0b3J5IGZvciB7QGxpbmsgQmxvYn0gdmFsdWVzLiAqL1xuZXhwb3J0cy5ibG9iID0gKChsZW5ndGgsIHByb3BlcnR5KSA9PiBuZXcgQmxvYihsZW5ndGgsIHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIENTdHJpbmd9IHZhbHVlcy4gKi9cbmV4cG9ydHMuY3N0ciA9ICgocHJvcGVydHkpID0+IG5ldyBDU3RyaW5nKHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIFVURjh9IHZhbHVlcy4gKi9cbmV4cG9ydHMudXRmOCA9ICgobWF4U3BhbiwgcHJvcGVydHkpID0+IG5ldyBVVEY4KG1heFNwYW4sIHByb3BlcnR5KSk7XG4vKiogRmFjdG9yeSBmb3Ige0BsaW5rIENvbnN0YW50fSB2YWx1ZXMuICovXG5leHBvcnRzLmNvbnN0YW50ID0gKCh2YWx1ZSwgcHJvcGVydHkpID0+IG5ldyBDb25zdGFudCh2YWx1ZSwgcHJvcGVydHkpKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUxheW91dC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@solana/buffer-layout/lib/Layout.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@solana/codecs-core/dist/index.browser.mjs":
/*!*****************************************************************!*\
  !*** ./node_modules/@solana/codecs-core/dist/index.browser.mjs ***!
  \*****************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   addCodecSentinel: () => (/* binding */ addCodecSentinel),\n/* harmony export */   addCodecSizePrefix: () => (/* binding */ addCodecSizePrefix),\n/* harmony export */   addDecoderSentinel: () => (/* binding */ addDecoderSentinel),\n/* harmony export */   addDecoderSizePrefix: () => (/* binding */ addDecoderSizePrefix),\n/* harmony export */   addEncoderSentinel: () => (/* binding */ addEncoderSentinel),\n/* harmony export */   addEncoderSizePrefix: () => (/* binding */ addEncoderSizePrefix),\n/* harmony export */   assertByteArrayHasEnoughBytesForCodec: () => (/* binding */ assertByteArrayHasEnoughBytesForCodec),\n/* harmony export */   assertByteArrayIsNotEmptyForCodec: () => (/* binding */ assertByteArrayIsNotEmptyForCodec),\n/* harmony export */   assertByteArrayOffsetIsNotOutOfRange: () => (/* binding */ assertByteArrayOffsetIsNotOutOfRange),\n/* harmony export */   assertIsFixedSize: () => (/* binding */ assertIsFixedSize),\n/* harmony export */   assertIsVariableSize: () => (/* binding */ assertIsVariableSize),\n/* harmony export */   combineCodec: () => (/* binding */ combineCodec),\n/* harmony export */   containsBytes: () => (/* binding */ containsBytes),\n/* harmony export */   createCodec: () => (/* binding */ createCodec),\n/* harmony export */   createDecoder: () => (/* binding */ createDecoder),\n/* harmony export */   createEncoder: () => (/* binding */ createEncoder),\n/* harmony export */   fixBytes: () => (/* binding */ fixBytes),\n/* harmony export */   fixCodecSize: () => (/* binding */ fixCodecSize),\n/* harmony export */   fixDecoderSize: () => (/* binding */ fixDecoderSize),\n/* harmony export */   fixEncoderSize: () => (/* binding */ fixEncoderSize),\n/* harmony export */   getEncodedSize: () => (/* binding */ getEncodedSize),\n/* harmony export */   isFixedSize: () => (/* binding */ isFixedSize),\n/* harmony export */   isVariableSize: () => (/* binding */ isVariableSize),\n/* harmony export */   mergeBytes: () => (/* binding */ mergeBytes),\n/* harmony export */   offsetCodec: () => (/* binding */ offsetCodec),\n/* harmony export */   offsetDecoder: () => (/* binding */ offsetDecoder),\n/* harmony export */   offsetEncoder: () => (/* binding */ offsetEncoder),\n/* harmony export */   padBytes: () => (/* binding */ padBytes),\n/* harmony export */   padLeftCodec: () => (/* binding */ padLeftCodec),\n/* harmony export */   padLeftDecoder: () => (/* binding */ padLeftDecoder),\n/* harmony export */   padLeftEncoder: () => (/* binding */ padLeftEncoder),\n/* harmony export */   padRightCodec: () => (/* binding */ padRightCodec),\n/* harmony export */   padRightDecoder: () => (/* binding */ padRightDecoder),\n/* harmony export */   padRightEncoder: () => (/* binding */ padRightEncoder),\n/* harmony export */   resizeCodec: () => (/* binding */ resizeCodec),\n/* harmony export */   resizeDecoder: () => (/* binding */ resizeDecoder),\n/* harmony export */   resizeEncoder: () => (/* binding */ resizeEncoder),\n/* harmony export */   reverseCodec: () => (/* binding */ reverseCodec),\n/* harmony export */   reverseDecoder: () => (/* binding */ reverseDecoder),\n/* harmony export */   reverseEncoder: () => (/* binding */ reverseEncoder),\n/* harmony export */   transformCodec: () => (/* binding */ transformCodec),\n/* harmony export */   transformDecoder: () => (/* binding */ transformDecoder),\n/* harmony export */   transformEncoder: () => (/* binding */ transformEncoder)\n/* harmony export */ });\n/* harmony import */ var _solana_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @solana/errors */ \"(app-pages-browser)/./node_modules/@solana/errors/dist/index.browser.mjs\");\n\n\n// src/add-codec-sentinel.ts\n\n// src/bytes.ts\nvar mergeBytes = (byteArrays) => {\n  const nonEmptyByteArrays = byteArrays.filter((arr) => arr.length);\n  if (nonEmptyByteArrays.length === 0) {\n    return byteArrays.length ? byteArrays[0] : new Uint8Array();\n  }\n  if (nonEmptyByteArrays.length === 1) {\n    return nonEmptyByteArrays[0];\n  }\n  const totalLength = nonEmptyByteArrays.reduce((total, arr) => total + arr.length, 0);\n  const result = new Uint8Array(totalLength);\n  let offset = 0;\n  nonEmptyByteArrays.forEach((arr) => {\n    result.set(arr, offset);\n    offset += arr.length;\n  });\n  return result;\n};\nvar padBytes = (bytes, length) => {\n  if (bytes.length >= length) return bytes;\n  const paddedBytes = new Uint8Array(length).fill(0);\n  paddedBytes.set(bytes);\n  return paddedBytes;\n};\nvar fixBytes = (bytes, length) => padBytes(bytes.length <= length ? bytes : bytes.slice(0, length), length);\nfunction containsBytes(data, bytes, offset) {\n  const slice = offset === 0 && data.length === bytes.length ? data : data.slice(offset, offset + bytes.length);\n  if (slice.length !== bytes.length) return false;\n  return bytes.every((b, i) => b === slice[i]);\n}\nfunction getEncodedSize(value, encoder) {\n  return \"fixedSize\" in encoder ? encoder.fixedSize : encoder.getSizeFromValue(value);\n}\nfunction createEncoder(encoder) {\n  return Object.freeze({\n    ...encoder,\n    encode: (value) => {\n      const bytes = new Uint8Array(getEncodedSize(value, encoder));\n      encoder.write(value, bytes, 0);\n      return bytes;\n    }\n  });\n}\nfunction createDecoder(decoder) {\n  return Object.freeze({\n    ...decoder,\n    decode: (bytes, offset = 0) => decoder.read(bytes, offset)[0]\n  });\n}\nfunction createCodec(codec) {\n  return Object.freeze({\n    ...codec,\n    decode: (bytes, offset = 0) => codec.read(bytes, offset)[0],\n    encode: (value) => {\n      const bytes = new Uint8Array(getEncodedSize(value, codec));\n      codec.write(value, bytes, 0);\n      return bytes;\n    }\n  });\n}\nfunction isFixedSize(codec) {\n  return \"fixedSize\" in codec && typeof codec.fixedSize === \"number\";\n}\nfunction assertIsFixedSize(codec) {\n  if (!isFixedSize(codec)) {\n    throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH);\n  }\n}\nfunction isVariableSize(codec) {\n  return !isFixedSize(codec);\n}\nfunction assertIsVariableSize(codec) {\n  if (!isVariableSize(codec)) {\n    throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH);\n  }\n}\nfunction combineCodec(encoder, decoder) {\n  if (isFixedSize(encoder) !== isFixedSize(decoder)) {\n    throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH);\n  }\n  if (isFixedSize(encoder) && isFixedSize(decoder) && encoder.fixedSize !== decoder.fixedSize) {\n    throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH, {\n      decoderFixedSize: decoder.fixedSize,\n      encoderFixedSize: encoder.fixedSize\n    });\n  }\n  if (!isFixedSize(encoder) && !isFixedSize(decoder) && encoder.maxSize !== decoder.maxSize) {\n    throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH, {\n      decoderMaxSize: decoder.maxSize,\n      encoderMaxSize: encoder.maxSize\n    });\n  }\n  return {\n    ...decoder,\n    ...encoder,\n    decode: decoder.decode,\n    encode: encoder.encode,\n    read: decoder.read,\n    write: encoder.write\n  };\n}\n\n// src/add-codec-sentinel.ts\nfunction addEncoderSentinel(encoder, sentinel) {\n  const write = (value, bytes, offset) => {\n    const encoderBytes = encoder.encode(value);\n    if (findSentinelIndex(encoderBytes, sentinel) >= 0) {\n      throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL, {\n        encodedBytes: encoderBytes,\n        hexEncodedBytes: hexBytes(encoderBytes),\n        hexSentinel: hexBytes(sentinel),\n        sentinel\n      });\n    }\n    bytes.set(encoderBytes, offset);\n    offset += encoderBytes.length;\n    bytes.set(sentinel, offset);\n    offset += sentinel.length;\n    return offset;\n  };\n  if (isFixedSize(encoder)) {\n    return createEncoder({ ...encoder, fixedSize: encoder.fixedSize + sentinel.length, write });\n  }\n  return createEncoder({\n    ...encoder,\n    ...encoder.maxSize != null ? { maxSize: encoder.maxSize + sentinel.length } : {},\n    getSizeFromValue: (value) => encoder.getSizeFromValue(value) + sentinel.length,\n    write\n  });\n}\nfunction addDecoderSentinel(decoder, sentinel) {\n  const read = (bytes, offset) => {\n    const candidateBytes = offset === 0 ? bytes : bytes.slice(offset);\n    const sentinelIndex = findSentinelIndex(candidateBytes, sentinel);\n    if (sentinelIndex === -1) {\n      throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES, {\n        decodedBytes: candidateBytes,\n        hexDecodedBytes: hexBytes(candidateBytes),\n        hexSentinel: hexBytes(sentinel),\n        sentinel\n      });\n    }\n    const preSentinelBytes = candidateBytes.slice(0, sentinelIndex);\n    return [decoder.decode(preSentinelBytes), offset + preSentinelBytes.length + sentinel.length];\n  };\n  if (isFixedSize(decoder)) {\n    return createDecoder({ ...decoder, fixedSize: decoder.fixedSize + sentinel.length, read });\n  }\n  return createDecoder({\n    ...decoder,\n    ...decoder.maxSize != null ? { maxSize: decoder.maxSize + sentinel.length } : {},\n    read\n  });\n}\nfunction addCodecSentinel(codec, sentinel) {\n  return combineCodec(addEncoderSentinel(codec, sentinel), addDecoderSentinel(codec, sentinel));\n}\nfunction findSentinelIndex(bytes, sentinel) {\n  return bytes.findIndex((byte, index, arr) => {\n    if (sentinel.length === 1) return byte === sentinel[0];\n    return containsBytes(arr, sentinel, index);\n  });\n}\nfunction hexBytes(bytes) {\n  return bytes.reduce((str, byte) => str + byte.toString(16).padStart(2, \"0\"), \"\");\n}\nfunction assertByteArrayIsNotEmptyForCodec(codecDescription, bytes, offset = 0) {\n  if (bytes.length - offset <= 0) {\n    throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY, {\n      codecDescription\n    });\n  }\n}\nfunction assertByteArrayHasEnoughBytesForCodec(codecDescription, expected, bytes, offset = 0) {\n  const bytesLength = bytes.length - offset;\n  if (bytesLength < expected) {\n    throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH, {\n      bytesLength,\n      codecDescription,\n      expected\n    });\n  }\n}\nfunction assertByteArrayOffsetIsNotOutOfRange(codecDescription, offset, bytesLength) {\n  if (offset < 0 || offset > bytesLength) {\n    throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE, {\n      bytesLength,\n      codecDescription,\n      offset\n    });\n  }\n}\n\n// src/add-codec-size-prefix.ts\nfunction addEncoderSizePrefix(encoder, prefix) {\n  const write = (value, bytes, offset) => {\n    const encoderBytes = encoder.encode(value);\n    offset = prefix.write(encoderBytes.length, bytes, offset);\n    bytes.set(encoderBytes, offset);\n    return offset + encoderBytes.length;\n  };\n  if (isFixedSize(prefix) && isFixedSize(encoder)) {\n    return createEncoder({ ...encoder, fixedSize: prefix.fixedSize + encoder.fixedSize, write });\n  }\n  const prefixMaxSize = isFixedSize(prefix) ? prefix.fixedSize : prefix.maxSize ?? null;\n  const encoderMaxSize = isFixedSize(encoder) ? encoder.fixedSize : encoder.maxSize ?? null;\n  const maxSize = prefixMaxSize !== null && encoderMaxSize !== null ? prefixMaxSize + encoderMaxSize : null;\n  return createEncoder({\n    ...encoder,\n    ...maxSize !== null ? { maxSize } : {},\n    getSizeFromValue: (value) => {\n      const encoderSize = getEncodedSize(value, encoder);\n      return getEncodedSize(encoderSize, prefix) + encoderSize;\n    },\n    write\n  });\n}\nfunction addDecoderSizePrefix(decoder, prefix) {\n  const read = (bytes, offset) => {\n    const [bigintSize, decoderOffset] = prefix.read(bytes, offset);\n    const size = Number(bigintSize);\n    offset = decoderOffset;\n    if (offset > 0 || bytes.length > size) {\n      bytes = bytes.slice(offset, offset + size);\n    }\n    assertByteArrayHasEnoughBytesForCodec(\"addDecoderSizePrefix\", size, bytes);\n    return [decoder.decode(bytes), offset + size];\n  };\n  if (isFixedSize(prefix) && isFixedSize(decoder)) {\n    return createDecoder({ ...decoder, fixedSize: prefix.fixedSize + decoder.fixedSize, read });\n  }\n  const prefixMaxSize = isFixedSize(prefix) ? prefix.fixedSize : prefix.maxSize ?? null;\n  const decoderMaxSize = isFixedSize(decoder) ? decoder.fixedSize : decoder.maxSize ?? null;\n  const maxSize = prefixMaxSize !== null && decoderMaxSize !== null ? prefixMaxSize + decoderMaxSize : null;\n  return createDecoder({ ...decoder, ...maxSize !== null ? { maxSize } : {}, read });\n}\nfunction addCodecSizePrefix(codec, prefix) {\n  return combineCodec(addEncoderSizePrefix(codec, prefix), addDecoderSizePrefix(codec, prefix));\n}\n\n// src/fix-codec-size.ts\nfunction fixEncoderSize(encoder, fixedBytes) {\n  return createEncoder({\n    fixedSize: fixedBytes,\n    write: (value, bytes, offset) => {\n      const variableByteArray = encoder.encode(value);\n      const fixedByteArray = variableByteArray.length > fixedBytes ? variableByteArray.slice(0, fixedBytes) : variableByteArray;\n      bytes.set(fixedByteArray, offset);\n      return offset + fixedBytes;\n    }\n  });\n}\nfunction fixDecoderSize(decoder, fixedBytes) {\n  return createDecoder({\n    fixedSize: fixedBytes,\n    read: (bytes, offset) => {\n      assertByteArrayHasEnoughBytesForCodec(\"fixCodecSize\", fixedBytes, bytes, offset);\n      if (offset > 0 || bytes.length > fixedBytes) {\n        bytes = bytes.slice(offset, offset + fixedBytes);\n      }\n      if (isFixedSize(decoder)) {\n        bytes = fixBytes(bytes, decoder.fixedSize);\n      }\n      const [value] = decoder.read(bytes, 0);\n      return [value, offset + fixedBytes];\n    }\n  });\n}\nfunction fixCodecSize(codec, fixedBytes) {\n  return combineCodec(fixEncoderSize(codec, fixedBytes), fixDecoderSize(codec, fixedBytes));\n}\n\n// src/offset-codec.ts\nfunction offsetEncoder(encoder, config) {\n  return createEncoder({\n    ...encoder,\n    write: (value, bytes, preOffset) => {\n      const wrapBytes = (offset) => modulo(offset, bytes.length);\n      const newPreOffset = config.preOffset ? config.preOffset({ bytes, preOffset, wrapBytes }) : preOffset;\n      assertByteArrayOffsetIsNotOutOfRange(\"offsetEncoder\", newPreOffset, bytes.length);\n      const postOffset = encoder.write(value, bytes, newPreOffset);\n      const newPostOffset = config.postOffset ? config.postOffset({ bytes, newPreOffset, postOffset, preOffset, wrapBytes }) : postOffset;\n      assertByteArrayOffsetIsNotOutOfRange(\"offsetEncoder\", newPostOffset, bytes.length);\n      return newPostOffset;\n    }\n  });\n}\nfunction offsetDecoder(decoder, config) {\n  return createDecoder({\n    ...decoder,\n    read: (bytes, preOffset) => {\n      const wrapBytes = (offset) => modulo(offset, bytes.length);\n      const newPreOffset = config.preOffset ? config.preOffset({ bytes, preOffset, wrapBytes }) : preOffset;\n      assertByteArrayOffsetIsNotOutOfRange(\"offsetDecoder\", newPreOffset, bytes.length);\n      const [value, postOffset] = decoder.read(bytes, newPreOffset);\n      const newPostOffset = config.postOffset ? config.postOffset({ bytes, newPreOffset, postOffset, preOffset, wrapBytes }) : postOffset;\n      assertByteArrayOffsetIsNotOutOfRange(\"offsetDecoder\", newPostOffset, bytes.length);\n      return [value, newPostOffset];\n    }\n  });\n}\nfunction offsetCodec(codec, config) {\n  return combineCodec(offsetEncoder(codec, config), offsetDecoder(codec, config));\n}\nfunction modulo(dividend, divisor) {\n  if (divisor === 0) return 0;\n  return (dividend % divisor + divisor) % divisor;\n}\nfunction resizeEncoder(encoder, resize) {\n  if (isFixedSize(encoder)) {\n    const fixedSize = resize(encoder.fixedSize);\n    if (fixedSize < 0) {\n      throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, {\n        bytesLength: fixedSize,\n        codecDescription: \"resizeEncoder\"\n      });\n    }\n    return createEncoder({ ...encoder, fixedSize });\n  }\n  return createEncoder({\n    ...encoder,\n    getSizeFromValue: (value) => {\n      const newSize = resize(encoder.getSizeFromValue(value));\n      if (newSize < 0) {\n        throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, {\n          bytesLength: newSize,\n          codecDescription: \"resizeEncoder\"\n        });\n      }\n      return newSize;\n    }\n  });\n}\nfunction resizeDecoder(decoder, resize) {\n  if (isFixedSize(decoder)) {\n    const fixedSize = resize(decoder.fixedSize);\n    if (fixedSize < 0) {\n      throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH, {\n        bytesLength: fixedSize,\n        codecDescription: \"resizeDecoder\"\n      });\n    }\n    return createDecoder({ ...decoder, fixedSize });\n  }\n  return decoder;\n}\nfunction resizeCodec(codec, resize) {\n  return combineCodec(resizeEncoder(codec, resize), resizeDecoder(codec, resize));\n}\n\n// src/pad-codec.ts\nfunction padLeftEncoder(encoder, offset) {\n  return offsetEncoder(\n    resizeEncoder(encoder, (size) => size + offset),\n    { preOffset: ({ preOffset }) => preOffset + offset }\n  );\n}\nfunction padRightEncoder(encoder, offset) {\n  return offsetEncoder(\n    resizeEncoder(encoder, (size) => size + offset),\n    { postOffset: ({ postOffset }) => postOffset + offset }\n  );\n}\nfunction padLeftDecoder(decoder, offset) {\n  return offsetDecoder(\n    resizeDecoder(decoder, (size) => size + offset),\n    { preOffset: ({ preOffset }) => preOffset + offset }\n  );\n}\nfunction padRightDecoder(decoder, offset) {\n  return offsetDecoder(\n    resizeDecoder(decoder, (size) => size + offset),\n    { postOffset: ({ postOffset }) => postOffset + offset }\n  );\n}\nfunction padLeftCodec(codec, offset) {\n  return combineCodec(padLeftEncoder(codec, offset), padLeftDecoder(codec, offset));\n}\nfunction padRightCodec(codec, offset) {\n  return combineCodec(padRightEncoder(codec, offset), padRightDecoder(codec, offset));\n}\n\n// src/reverse-codec.ts\nfunction copySourceToTargetInReverse(source, target_WILL_MUTATE, sourceOffset, sourceLength, targetOffset = 0) {\n  while (sourceOffset < --sourceLength) {\n    const leftValue = source[sourceOffset];\n    target_WILL_MUTATE[sourceOffset + targetOffset] = source[sourceLength];\n    target_WILL_MUTATE[sourceLength + targetOffset] = leftValue;\n    sourceOffset++;\n  }\n  if (sourceOffset === sourceLength) {\n    target_WILL_MUTATE[sourceOffset + targetOffset] = source[sourceOffset];\n  }\n}\nfunction reverseEncoder(encoder) {\n  assertIsFixedSize(encoder);\n  return createEncoder({\n    ...encoder,\n    write: (value, bytes, offset) => {\n      const newOffset = encoder.write(value, bytes, offset);\n      copySourceToTargetInReverse(\n        bytes,\n        bytes,\n        offset,\n        offset + encoder.fixedSize\n      );\n      return newOffset;\n    }\n  });\n}\nfunction reverseDecoder(decoder) {\n  assertIsFixedSize(decoder);\n  return createDecoder({\n    ...decoder,\n    read: (bytes, offset) => {\n      const reversedBytes = bytes.slice();\n      copySourceToTargetInReverse(\n        bytes,\n        reversedBytes,\n        offset,\n        offset + decoder.fixedSize\n      );\n      return decoder.read(reversedBytes, offset);\n    }\n  });\n}\nfunction reverseCodec(codec) {\n  return combineCodec(reverseEncoder(codec), reverseDecoder(codec));\n}\n\n// src/transform-codec.ts\nfunction transformEncoder(encoder, unmap) {\n  return createEncoder({\n    ...isVariableSize(encoder) ? { ...encoder, getSizeFromValue: (value) => encoder.getSizeFromValue(unmap(value)) } : encoder,\n    write: (value, bytes, offset) => encoder.write(unmap(value), bytes, offset)\n  });\n}\nfunction transformDecoder(decoder, map) {\n  return createDecoder({\n    ...decoder,\n    read: (bytes, offset) => {\n      const [value, newOffset] = decoder.read(bytes, offset);\n      return [map(value, bytes, offset), newOffset];\n    }\n  });\n}\nfunction transformCodec(codec, unmap, map) {\n  return createCodec({\n    ...transformEncoder(codec, unmap),\n    read: map ? transformDecoder(codec, map).read : codec.read\n  });\n}\n\n\n//# sourceMappingURL=index.browser.mjs.map\n//# sourceMappingURL=index.browser.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac29sYW5hL2NvZGVjcy1jb3JlL2Rpc3QvaW5kZXguYnJvd3Nlci5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBMG5COztBQUUxbkI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyx1REFBVyxDQUFDLHVGQUEyQztBQUNyRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsdURBQVcsQ0FBQywwRkFBOEM7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHVEQUFXLENBQUMsNkdBQWlFO0FBQzNGO0FBQ0E7QUFDQSxjQUFjLHVEQUFXLENBQUMscUdBQXlEO0FBQ25GO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGNBQWMsdURBQVcsQ0FBQyxtR0FBdUQ7QUFDakY7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHVEQUFXLENBQUMseUdBQTZEO0FBQ3pGO0FBQ0E7QUFD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QSxNQUFNLGNBQWMsV0FBVztBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxlQUFlLFlBQVk7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUMsa0ZBQWtGO0FBQ3JIO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDs7QUFFdXZCO0FBQ3Z2QjtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0Bzb2xhbmEvY29kZWNzLWNvcmUvZGlzdC9pbmRleC5icm93c2VyLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb2xhbmFFcnJvciwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VYUEVDVEVEX0ZJWEVEX0xFTkdUSCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VYUEVDVEVEX1ZBUklBQkxFX0xFTkdUSCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VOQ09ERVJfREVDT0RFUl9TSVpFX0NPTVBBVElCSUxJVFlfTUlTTUFUQ0gsIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FTkNPREVSX0RFQ09ERVJfRklYRURfU0laRV9NSVNNQVRDSCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VOQ09ERVJfREVDT0RFUl9NQVhfU0laRV9NSVNNQVRDSCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0NBTk5PVF9ERUNPREVfRU1QVFlfQllURV9BUlJBWSwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0lOVkFMSURfQllURV9MRU5HVEgsIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19PRkZTRVRfT1VUX09GX1JBTkdFLCBTT0xBTkFfRVJST1JfX0NPREVDU19fRVhQRUNURURfUE9TSVRJVkVfQllURV9MRU5HVEgsIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19TRU5USU5FTF9NSVNTSU5HX0lOX0RFQ09ERURfQllURVMsIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FTkNPREVEX0JZVEVTX01VU1RfTk9UX0lOQ0xVREVfU0VOVElORUwgfSBmcm9tICdAc29sYW5hL2Vycm9ycyc7XG5cbi8vIHNyYy9hZGQtY29kZWMtc2VudGluZWwudHNcblxuLy8gc3JjL2J5dGVzLnRzXG52YXIgbWVyZ2VCeXRlcyA9IChieXRlQXJyYXlzKSA9PiB7XG4gIGNvbnN0IG5vbkVtcHR5Qnl0ZUFycmF5cyA9IGJ5dGVBcnJheXMuZmlsdGVyKChhcnIpID0+IGFyci5sZW5ndGgpO1xuICBpZiAobm9uRW1wdHlCeXRlQXJyYXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBieXRlQXJyYXlzLmxlbmd0aCA/IGJ5dGVBcnJheXNbMF0gOiBuZXcgVWludDhBcnJheSgpO1xuICB9XG4gIGlmIChub25FbXB0eUJ5dGVBcnJheXMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIG5vbkVtcHR5Qnl0ZUFycmF5c1swXTtcbiAgfVxuICBjb25zdCB0b3RhbExlbmd0aCA9IG5vbkVtcHR5Qnl0ZUFycmF5cy5yZWR1Y2UoKHRvdGFsLCBhcnIpID0+IHRvdGFsICsgYXJyLmxlbmd0aCwgMCk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgbGV0IG9mZnNldCA9IDA7XG4gIG5vbkVtcHR5Qnl0ZUFycmF5cy5mb3JFYWNoKChhcnIpID0+IHtcbiAgICByZXN1bHQuc2V0KGFyciwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gYXJyLmxlbmd0aDtcbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xudmFyIHBhZEJ5dGVzID0gKGJ5dGVzLCBsZW5ndGgpID0+IHtcbiAgaWYgKGJ5dGVzLmxlbmd0aCA+PSBsZW5ndGgpIHJldHVybiBieXRlcztcbiAgY29uc3QgcGFkZGVkQnl0ZXMgPSBuZXcgVWludDhBcnJheShsZW5ndGgpLmZpbGwoMCk7XG4gIHBhZGRlZEJ5dGVzLnNldChieXRlcyk7XG4gIHJldHVybiBwYWRkZWRCeXRlcztcbn07XG52YXIgZml4Qnl0ZXMgPSAoYnl0ZXMsIGxlbmd0aCkgPT4gcGFkQnl0ZXMoYnl0ZXMubGVuZ3RoIDw9IGxlbmd0aCA/IGJ5dGVzIDogYnl0ZXMuc2xpY2UoMCwgbGVuZ3RoKSwgbGVuZ3RoKTtcbmZ1bmN0aW9uIGNvbnRhaW5zQnl0ZXMoZGF0YSwgYnl0ZXMsIG9mZnNldCkge1xuICBjb25zdCBzbGljZSA9IG9mZnNldCA9PT0gMCAmJiBkYXRhLmxlbmd0aCA9PT0gYnl0ZXMubGVuZ3RoID8gZGF0YSA6IGRhdGEuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBieXRlcy5sZW5ndGgpO1xuICBpZiAoc2xpY2UubGVuZ3RoICE9PSBieXRlcy5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIGJ5dGVzLmV2ZXJ5KChiLCBpKSA9PiBiID09PSBzbGljZVtpXSk7XG59XG5mdW5jdGlvbiBnZXRFbmNvZGVkU2l6ZSh2YWx1ZSwgZW5jb2Rlcikge1xuICByZXR1cm4gXCJmaXhlZFNpemVcIiBpbiBlbmNvZGVyID8gZW5jb2Rlci5maXhlZFNpemUgOiBlbmNvZGVyLmdldFNpemVGcm9tVmFsdWUodmFsdWUpO1xufVxuZnVuY3Rpb24gY3JlYXRlRW5jb2RlcihlbmNvZGVyKSB7XG4gIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAuLi5lbmNvZGVyLFxuICAgIGVuY29kZTogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGdldEVuY29kZWRTaXplKHZhbHVlLCBlbmNvZGVyKSk7XG4gICAgICBlbmNvZGVyLndyaXRlKHZhbHVlLCBieXRlcywgMCk7XG4gICAgICByZXR1cm4gYnl0ZXM7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZURlY29kZXIoZGVjb2Rlcikge1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgLi4uZGVjb2RlcixcbiAgICBkZWNvZGU6IChieXRlcywgb2Zmc2V0ID0gMCkgPT4gZGVjb2Rlci5yZWFkKGJ5dGVzLCBvZmZzZXQpWzBdXG4gIH0pO1xufVxuZnVuY3Rpb24gY3JlYXRlQ29kZWMoY29kZWMpIHtcbiAgcmV0dXJuIE9iamVjdC5mcmVlemUoe1xuICAgIC4uLmNvZGVjLFxuICAgIGRlY29kZTogKGJ5dGVzLCBvZmZzZXQgPSAwKSA9PiBjb2RlYy5yZWFkKGJ5dGVzLCBvZmZzZXQpWzBdLFxuICAgIGVuY29kZTogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGdldEVuY29kZWRTaXplKHZhbHVlLCBjb2RlYykpO1xuICAgICAgY29kZWMud3JpdGUodmFsdWUsIGJ5dGVzLCAwKTtcbiAgICAgIHJldHVybiBieXRlcztcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gaXNGaXhlZFNpemUoY29kZWMpIHtcbiAgcmV0dXJuIFwiZml4ZWRTaXplXCIgaW4gY29kZWMgJiYgdHlwZW9mIGNvZGVjLmZpeGVkU2l6ZSA9PT0gXCJudW1iZXJcIjtcbn1cbmZ1bmN0aW9uIGFzc2VydElzRml4ZWRTaXplKGNvZGVjKSB7XG4gIGlmICghaXNGaXhlZFNpemUoY29kZWMpKSB7XG4gICAgdGhyb3cgbmV3IFNvbGFuYUVycm9yKFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FWFBFQ1RFRF9GSVhFRF9MRU5HVEgpO1xuICB9XG59XG5mdW5jdGlvbiBpc1ZhcmlhYmxlU2l6ZShjb2RlYykge1xuICByZXR1cm4gIWlzRml4ZWRTaXplKGNvZGVjKTtcbn1cbmZ1bmN0aW9uIGFzc2VydElzVmFyaWFibGVTaXplKGNvZGVjKSB7XG4gIGlmICghaXNWYXJpYWJsZVNpemUoY29kZWMpKSB7XG4gICAgdGhyb3cgbmV3IFNvbGFuYUVycm9yKFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FWFBFQ1RFRF9WQVJJQUJMRV9MRU5HVEgpO1xuICB9XG59XG5mdW5jdGlvbiBjb21iaW5lQ29kZWMoZW5jb2RlciwgZGVjb2Rlcikge1xuICBpZiAoaXNGaXhlZFNpemUoZW5jb2RlcikgIT09IGlzRml4ZWRTaXplKGRlY29kZXIpKSB7XG4gICAgdGhyb3cgbmV3IFNvbGFuYUVycm9yKFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FTkNPREVSX0RFQ09ERVJfU0laRV9DT01QQVRJQklMSVRZX01JU01BVENIKTtcbiAgfVxuICBpZiAoaXNGaXhlZFNpemUoZW5jb2RlcikgJiYgaXNGaXhlZFNpemUoZGVjb2RlcikgJiYgZW5jb2Rlci5maXhlZFNpemUgIT09IGRlY29kZXIuZml4ZWRTaXplKSB7XG4gICAgdGhyb3cgbmV3IFNvbGFuYUVycm9yKFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FTkNPREVSX0RFQ09ERVJfRklYRURfU0laRV9NSVNNQVRDSCwge1xuICAgICAgZGVjb2RlckZpeGVkU2l6ZTogZGVjb2Rlci5maXhlZFNpemUsXG4gICAgICBlbmNvZGVyRml4ZWRTaXplOiBlbmNvZGVyLmZpeGVkU2l6ZVxuICAgIH0pO1xuICB9XG4gIGlmICghaXNGaXhlZFNpemUoZW5jb2RlcikgJiYgIWlzRml4ZWRTaXplKGRlY29kZXIpICYmIGVuY29kZXIubWF4U2l6ZSAhPT0gZGVjb2Rlci5tYXhTaXplKSB7XG4gICAgdGhyb3cgbmV3IFNvbGFuYUVycm9yKFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FTkNPREVSX0RFQ09ERVJfTUFYX1NJWkVfTUlTTUFUQ0gsIHtcbiAgICAgIGRlY29kZXJNYXhTaXplOiBkZWNvZGVyLm1heFNpemUsXG4gICAgICBlbmNvZGVyTWF4U2l6ZTogZW5jb2Rlci5tYXhTaXplXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5kZWNvZGVyLFxuICAgIC4uLmVuY29kZXIsXG4gICAgZGVjb2RlOiBkZWNvZGVyLmRlY29kZSxcbiAgICBlbmNvZGU6IGVuY29kZXIuZW5jb2RlLFxuICAgIHJlYWQ6IGRlY29kZXIucmVhZCxcbiAgICB3cml0ZTogZW5jb2Rlci53cml0ZVxuICB9O1xufVxuXG4vLyBzcmMvYWRkLWNvZGVjLXNlbnRpbmVsLnRzXG5mdW5jdGlvbiBhZGRFbmNvZGVyU2VudGluZWwoZW5jb2Rlciwgc2VudGluZWwpIHtcbiAgY29uc3Qgd3JpdGUgPSAodmFsdWUsIGJ5dGVzLCBvZmZzZXQpID0+IHtcbiAgICBjb25zdCBlbmNvZGVyQnl0ZXMgPSBlbmNvZGVyLmVuY29kZSh2YWx1ZSk7XG4gICAgaWYgKGZpbmRTZW50aW5lbEluZGV4KGVuY29kZXJCeXRlcywgc2VudGluZWwpID49IDApIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFFcnJvcihTT0xBTkFfRVJST1JfX0NPREVDU19fRU5DT0RFRF9CWVRFU19NVVNUX05PVF9JTkNMVURFX1NFTlRJTkVMLCB7XG4gICAgICAgIGVuY29kZWRCeXRlczogZW5jb2RlckJ5dGVzLFxuICAgICAgICBoZXhFbmNvZGVkQnl0ZXM6IGhleEJ5dGVzKGVuY29kZXJCeXRlcyksXG4gICAgICAgIGhleFNlbnRpbmVsOiBoZXhCeXRlcyhzZW50aW5lbCksXG4gICAgICAgIHNlbnRpbmVsXG4gICAgICB9KTtcbiAgICB9XG4gICAgYnl0ZXMuc2V0KGVuY29kZXJCeXRlcywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gZW5jb2RlckJ5dGVzLmxlbmd0aDtcbiAgICBieXRlcy5zZXQoc2VudGluZWwsIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IHNlbnRpbmVsLmxlbmd0aDtcbiAgICByZXR1cm4gb2Zmc2V0O1xuICB9O1xuICBpZiAoaXNGaXhlZFNpemUoZW5jb2RlcikpIHtcbiAgICByZXR1cm4gY3JlYXRlRW5jb2Rlcih7IC4uLmVuY29kZXIsIGZpeGVkU2l6ZTogZW5jb2Rlci5maXhlZFNpemUgKyBzZW50aW5lbC5sZW5ndGgsIHdyaXRlIH0pO1xuICB9XG4gIHJldHVybiBjcmVhdGVFbmNvZGVyKHtcbiAgICAuLi5lbmNvZGVyLFxuICAgIC4uLmVuY29kZXIubWF4U2l6ZSAhPSBudWxsID8geyBtYXhTaXplOiBlbmNvZGVyLm1heFNpemUgKyBzZW50aW5lbC5sZW5ndGggfSA6IHt9LFxuICAgIGdldFNpemVGcm9tVmFsdWU6ICh2YWx1ZSkgPT4gZW5jb2Rlci5nZXRTaXplRnJvbVZhbHVlKHZhbHVlKSArIHNlbnRpbmVsLmxlbmd0aCxcbiAgICB3cml0ZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGFkZERlY29kZXJTZW50aW5lbChkZWNvZGVyLCBzZW50aW5lbCkge1xuICBjb25zdCByZWFkID0gKGJ5dGVzLCBvZmZzZXQpID0+IHtcbiAgICBjb25zdCBjYW5kaWRhdGVCeXRlcyA9IG9mZnNldCA9PT0gMCA/IGJ5dGVzIDogYnl0ZXMuc2xpY2Uob2Zmc2V0KTtcbiAgICBjb25zdCBzZW50aW5lbEluZGV4ID0gZmluZFNlbnRpbmVsSW5kZXgoY2FuZGlkYXRlQnl0ZXMsIHNlbnRpbmVsKTtcbiAgICBpZiAoc2VudGluZWxJbmRleCA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFFcnJvcihTT0xBTkFfRVJST1JfX0NPREVDU19fU0VOVElORUxfTUlTU0lOR19JTl9ERUNPREVEX0JZVEVTLCB7XG4gICAgICAgIGRlY29kZWRCeXRlczogY2FuZGlkYXRlQnl0ZXMsXG4gICAgICAgIGhleERlY29kZWRCeXRlczogaGV4Qnl0ZXMoY2FuZGlkYXRlQnl0ZXMpLFxuICAgICAgICBoZXhTZW50aW5lbDogaGV4Qnl0ZXMoc2VudGluZWwpLFxuICAgICAgICBzZW50aW5lbFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IHByZVNlbnRpbmVsQnl0ZXMgPSBjYW5kaWRhdGVCeXRlcy5zbGljZSgwLCBzZW50aW5lbEluZGV4KTtcbiAgICByZXR1cm4gW2RlY29kZXIuZGVjb2RlKHByZVNlbnRpbmVsQnl0ZXMpLCBvZmZzZXQgKyBwcmVTZW50aW5lbEJ5dGVzLmxlbmd0aCArIHNlbnRpbmVsLmxlbmd0aF07XG4gIH07XG4gIGlmIChpc0ZpeGVkU2l6ZShkZWNvZGVyKSkge1xuICAgIHJldHVybiBjcmVhdGVEZWNvZGVyKHsgLi4uZGVjb2RlciwgZml4ZWRTaXplOiBkZWNvZGVyLmZpeGVkU2l6ZSArIHNlbnRpbmVsLmxlbmd0aCwgcmVhZCB9KTtcbiAgfVxuICByZXR1cm4gY3JlYXRlRGVjb2Rlcih7XG4gICAgLi4uZGVjb2RlcixcbiAgICAuLi5kZWNvZGVyLm1heFNpemUgIT0gbnVsbCA/IHsgbWF4U2l6ZTogZGVjb2Rlci5tYXhTaXplICsgc2VudGluZWwubGVuZ3RoIH0gOiB7fSxcbiAgICByZWFkXG4gIH0pO1xufVxuZnVuY3Rpb24gYWRkQ29kZWNTZW50aW5lbChjb2RlYywgc2VudGluZWwpIHtcbiAgcmV0dXJuIGNvbWJpbmVDb2RlYyhhZGRFbmNvZGVyU2VudGluZWwoY29kZWMsIHNlbnRpbmVsKSwgYWRkRGVjb2RlclNlbnRpbmVsKGNvZGVjLCBzZW50aW5lbCkpO1xufVxuZnVuY3Rpb24gZmluZFNlbnRpbmVsSW5kZXgoYnl0ZXMsIHNlbnRpbmVsKSB7XG4gIHJldHVybiBieXRlcy5maW5kSW5kZXgoKGJ5dGUsIGluZGV4LCBhcnIpID0+IHtcbiAgICBpZiAoc2VudGluZWwubGVuZ3RoID09PSAxKSByZXR1cm4gYnl0ZSA9PT0gc2VudGluZWxbMF07XG4gICAgcmV0dXJuIGNvbnRhaW5zQnl0ZXMoYXJyLCBzZW50aW5lbCwgaW5kZXgpO1xuICB9KTtcbn1cbmZ1bmN0aW9uIGhleEJ5dGVzKGJ5dGVzKSB7XG4gIHJldHVybiBieXRlcy5yZWR1Y2UoKHN0ciwgYnl0ZSkgPT4gc3RyICsgYnl0ZS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgXCIwXCIpLCBcIlwiKTtcbn1cbmZ1bmN0aW9uIGFzc2VydEJ5dGVBcnJheUlzTm90RW1wdHlGb3JDb2RlYyhjb2RlY0Rlc2NyaXB0aW9uLCBieXRlcywgb2Zmc2V0ID0gMCkge1xuICBpZiAoYnl0ZXMubGVuZ3RoIC0gb2Zmc2V0IDw9IDApIHtcbiAgICB0aHJvdyBuZXcgU29sYW5hRXJyb3IoU09MQU5BX0VSUk9SX19DT0RFQ1NfX0NBTk5PVF9ERUNPREVfRU1QVFlfQllURV9BUlJBWSwge1xuICAgICAgY29kZWNEZXNjcmlwdGlvblxuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBhc3NlcnRCeXRlQXJyYXlIYXNFbm91Z2hCeXRlc0ZvckNvZGVjKGNvZGVjRGVzY3JpcHRpb24sIGV4cGVjdGVkLCBieXRlcywgb2Zmc2V0ID0gMCkge1xuICBjb25zdCBieXRlc0xlbmd0aCA9IGJ5dGVzLmxlbmd0aCAtIG9mZnNldDtcbiAgaWYgKGJ5dGVzTGVuZ3RoIDwgZXhwZWN0ZWQpIHtcbiAgICB0aHJvdyBuZXcgU29sYW5hRXJyb3IoU09MQU5BX0VSUk9SX19DT0RFQ1NfX0lOVkFMSURfQllURV9MRU5HVEgsIHtcbiAgICAgIGJ5dGVzTGVuZ3RoLFxuICAgICAgY29kZWNEZXNjcmlwdGlvbixcbiAgICAgIGV4cGVjdGVkXG4gICAgfSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGFzc2VydEJ5dGVBcnJheU9mZnNldElzTm90T3V0T2ZSYW5nZShjb2RlY0Rlc2NyaXB0aW9uLCBvZmZzZXQsIGJ5dGVzTGVuZ3RoKSB7XG4gIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ5dGVzTGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFNvbGFuYUVycm9yKFNPTEFOQV9FUlJPUl9fQ09ERUNTX19PRkZTRVRfT1VUX09GX1JBTkdFLCB7XG4gICAgICBieXRlc0xlbmd0aCxcbiAgICAgIGNvZGVjRGVzY3JpcHRpb24sXG4gICAgICBvZmZzZXRcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBzcmMvYWRkLWNvZGVjLXNpemUtcHJlZml4LnRzXG5mdW5jdGlvbiBhZGRFbmNvZGVyU2l6ZVByZWZpeChlbmNvZGVyLCBwcmVmaXgpIHtcbiAgY29uc3Qgd3JpdGUgPSAodmFsdWUsIGJ5dGVzLCBvZmZzZXQpID0+IHtcbiAgICBjb25zdCBlbmNvZGVyQnl0ZXMgPSBlbmNvZGVyLmVuY29kZSh2YWx1ZSk7XG4gICAgb2Zmc2V0ID0gcHJlZml4LndyaXRlKGVuY29kZXJCeXRlcy5sZW5ndGgsIGJ5dGVzLCBvZmZzZXQpO1xuICAgIGJ5dGVzLnNldChlbmNvZGVyQnl0ZXMsIG9mZnNldCk7XG4gICAgcmV0dXJuIG9mZnNldCArIGVuY29kZXJCeXRlcy5sZW5ndGg7XG4gIH07XG4gIGlmIChpc0ZpeGVkU2l6ZShwcmVmaXgpICYmIGlzRml4ZWRTaXplKGVuY29kZXIpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVuY29kZXIoeyAuLi5lbmNvZGVyLCBmaXhlZFNpemU6IHByZWZpeC5maXhlZFNpemUgKyBlbmNvZGVyLmZpeGVkU2l6ZSwgd3JpdGUgfSk7XG4gIH1cbiAgY29uc3QgcHJlZml4TWF4U2l6ZSA9IGlzRml4ZWRTaXplKHByZWZpeCkgPyBwcmVmaXguZml4ZWRTaXplIDogcHJlZml4Lm1heFNpemUgPz8gbnVsbDtcbiAgY29uc3QgZW5jb2Rlck1heFNpemUgPSBpc0ZpeGVkU2l6ZShlbmNvZGVyKSA/IGVuY29kZXIuZml4ZWRTaXplIDogZW5jb2Rlci5tYXhTaXplID8/IG51bGw7XG4gIGNvbnN0IG1heFNpemUgPSBwcmVmaXhNYXhTaXplICE9PSBudWxsICYmIGVuY29kZXJNYXhTaXplICE9PSBudWxsID8gcHJlZml4TWF4U2l6ZSArIGVuY29kZXJNYXhTaXplIDogbnVsbDtcbiAgcmV0dXJuIGNyZWF0ZUVuY29kZXIoe1xuICAgIC4uLmVuY29kZXIsXG4gICAgLi4ubWF4U2l6ZSAhPT0gbnVsbCA/IHsgbWF4U2l6ZSB9IDoge30sXG4gICAgZ2V0U2l6ZUZyb21WYWx1ZTogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBlbmNvZGVyU2l6ZSA9IGdldEVuY29kZWRTaXplKHZhbHVlLCBlbmNvZGVyKTtcbiAgICAgIHJldHVybiBnZXRFbmNvZGVkU2l6ZShlbmNvZGVyU2l6ZSwgcHJlZml4KSArIGVuY29kZXJTaXplO1xuICAgIH0sXG4gICAgd3JpdGVcbiAgfSk7XG59XG5mdW5jdGlvbiBhZGREZWNvZGVyU2l6ZVByZWZpeChkZWNvZGVyLCBwcmVmaXgpIHtcbiAgY29uc3QgcmVhZCA9IChieXRlcywgb2Zmc2V0KSA9PiB7XG4gICAgY29uc3QgW2JpZ2ludFNpemUsIGRlY29kZXJPZmZzZXRdID0gcHJlZml4LnJlYWQoYnl0ZXMsIG9mZnNldCk7XG4gICAgY29uc3Qgc2l6ZSA9IE51bWJlcihiaWdpbnRTaXplKTtcbiAgICBvZmZzZXQgPSBkZWNvZGVyT2Zmc2V0O1xuICAgIGlmIChvZmZzZXQgPiAwIHx8IGJ5dGVzLmxlbmd0aCA+IHNpemUpIHtcbiAgICAgIGJ5dGVzID0gYnl0ZXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplKTtcbiAgICB9XG4gICAgYXNzZXJ0Qnl0ZUFycmF5SGFzRW5vdWdoQnl0ZXNGb3JDb2RlYyhcImFkZERlY29kZXJTaXplUHJlZml4XCIsIHNpemUsIGJ5dGVzKTtcbiAgICByZXR1cm4gW2RlY29kZXIuZGVjb2RlKGJ5dGVzKSwgb2Zmc2V0ICsgc2l6ZV07XG4gIH07XG4gIGlmIChpc0ZpeGVkU2l6ZShwcmVmaXgpICYmIGlzRml4ZWRTaXplKGRlY29kZXIpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZURlY29kZXIoeyAuLi5kZWNvZGVyLCBmaXhlZFNpemU6IHByZWZpeC5maXhlZFNpemUgKyBkZWNvZGVyLmZpeGVkU2l6ZSwgcmVhZCB9KTtcbiAgfVxuICBjb25zdCBwcmVmaXhNYXhTaXplID0gaXNGaXhlZFNpemUocHJlZml4KSA/IHByZWZpeC5maXhlZFNpemUgOiBwcmVmaXgubWF4U2l6ZSA/PyBudWxsO1xuICBjb25zdCBkZWNvZGVyTWF4U2l6ZSA9IGlzRml4ZWRTaXplKGRlY29kZXIpID8gZGVjb2Rlci5maXhlZFNpemUgOiBkZWNvZGVyLm1heFNpemUgPz8gbnVsbDtcbiAgY29uc3QgbWF4U2l6ZSA9IHByZWZpeE1heFNpemUgIT09IG51bGwgJiYgZGVjb2Rlck1heFNpemUgIT09IG51bGwgPyBwcmVmaXhNYXhTaXplICsgZGVjb2Rlck1heFNpemUgOiBudWxsO1xuICByZXR1cm4gY3JlYXRlRGVjb2Rlcih7IC4uLmRlY29kZXIsIC4uLm1heFNpemUgIT09IG51bGwgPyB7IG1heFNpemUgfSA6IHt9LCByZWFkIH0pO1xufVxuZnVuY3Rpb24gYWRkQ29kZWNTaXplUHJlZml4KGNvZGVjLCBwcmVmaXgpIHtcbiAgcmV0dXJuIGNvbWJpbmVDb2RlYyhhZGRFbmNvZGVyU2l6ZVByZWZpeChjb2RlYywgcHJlZml4KSwgYWRkRGVjb2RlclNpemVQcmVmaXgoY29kZWMsIHByZWZpeCkpO1xufVxuXG4vLyBzcmMvZml4LWNvZGVjLXNpemUudHNcbmZ1bmN0aW9uIGZpeEVuY29kZXJTaXplKGVuY29kZXIsIGZpeGVkQnl0ZXMpIHtcbiAgcmV0dXJuIGNyZWF0ZUVuY29kZXIoe1xuICAgIGZpeGVkU2l6ZTogZml4ZWRCeXRlcyxcbiAgICB3cml0ZTogKHZhbHVlLCBieXRlcywgb2Zmc2V0KSA9PiB7XG4gICAgICBjb25zdCB2YXJpYWJsZUJ5dGVBcnJheSA9IGVuY29kZXIuZW5jb2RlKHZhbHVlKTtcbiAgICAgIGNvbnN0IGZpeGVkQnl0ZUFycmF5ID0gdmFyaWFibGVCeXRlQXJyYXkubGVuZ3RoID4gZml4ZWRCeXRlcyA/IHZhcmlhYmxlQnl0ZUFycmF5LnNsaWNlKDAsIGZpeGVkQnl0ZXMpIDogdmFyaWFibGVCeXRlQXJyYXk7XG4gICAgICBieXRlcy5zZXQoZml4ZWRCeXRlQXJyYXksIG9mZnNldCk7XG4gICAgICByZXR1cm4gb2Zmc2V0ICsgZml4ZWRCeXRlcztcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gZml4RGVjb2RlclNpemUoZGVjb2RlciwgZml4ZWRCeXRlcykge1xuICByZXR1cm4gY3JlYXRlRGVjb2Rlcih7XG4gICAgZml4ZWRTaXplOiBmaXhlZEJ5dGVzLFxuICAgIHJlYWQ6IChieXRlcywgb2Zmc2V0KSA9PiB7XG4gICAgICBhc3NlcnRCeXRlQXJyYXlIYXNFbm91Z2hCeXRlc0ZvckNvZGVjKFwiZml4Q29kZWNTaXplXCIsIGZpeGVkQnl0ZXMsIGJ5dGVzLCBvZmZzZXQpO1xuICAgICAgaWYgKG9mZnNldCA+IDAgfHwgYnl0ZXMubGVuZ3RoID4gZml4ZWRCeXRlcykge1xuICAgICAgICBieXRlcyA9IGJ5dGVzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgZml4ZWRCeXRlcyk7XG4gICAgICB9XG4gICAgICBpZiAoaXNGaXhlZFNpemUoZGVjb2RlcikpIHtcbiAgICAgICAgYnl0ZXMgPSBmaXhCeXRlcyhieXRlcywgZGVjb2Rlci5maXhlZFNpemUpO1xuICAgICAgfVxuICAgICAgY29uc3QgW3ZhbHVlXSA9IGRlY29kZXIucmVhZChieXRlcywgMCk7XG4gICAgICByZXR1cm4gW3ZhbHVlLCBvZmZzZXQgKyBmaXhlZEJ5dGVzXTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gZml4Q29kZWNTaXplKGNvZGVjLCBmaXhlZEJ5dGVzKSB7XG4gIHJldHVybiBjb21iaW5lQ29kZWMoZml4RW5jb2RlclNpemUoY29kZWMsIGZpeGVkQnl0ZXMpLCBmaXhEZWNvZGVyU2l6ZShjb2RlYywgZml4ZWRCeXRlcykpO1xufVxuXG4vLyBzcmMvb2Zmc2V0LWNvZGVjLnRzXG5mdW5jdGlvbiBvZmZzZXRFbmNvZGVyKGVuY29kZXIsIGNvbmZpZykge1xuICByZXR1cm4gY3JlYXRlRW5jb2Rlcih7XG4gICAgLi4uZW5jb2RlcixcbiAgICB3cml0ZTogKHZhbHVlLCBieXRlcywgcHJlT2Zmc2V0KSA9PiB7XG4gICAgICBjb25zdCB3cmFwQnl0ZXMgPSAob2Zmc2V0KSA9PiBtb2R1bG8ob2Zmc2V0LCBieXRlcy5sZW5ndGgpO1xuICAgICAgY29uc3QgbmV3UHJlT2Zmc2V0ID0gY29uZmlnLnByZU9mZnNldCA/IGNvbmZpZy5wcmVPZmZzZXQoeyBieXRlcywgcHJlT2Zmc2V0LCB3cmFwQnl0ZXMgfSkgOiBwcmVPZmZzZXQ7XG4gICAgICBhc3NlcnRCeXRlQXJyYXlPZmZzZXRJc05vdE91dE9mUmFuZ2UoXCJvZmZzZXRFbmNvZGVyXCIsIG5ld1ByZU9mZnNldCwgYnl0ZXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHBvc3RPZmZzZXQgPSBlbmNvZGVyLndyaXRlKHZhbHVlLCBieXRlcywgbmV3UHJlT2Zmc2V0KTtcbiAgICAgIGNvbnN0IG5ld1Bvc3RPZmZzZXQgPSBjb25maWcucG9zdE9mZnNldCA/IGNvbmZpZy5wb3N0T2Zmc2V0KHsgYnl0ZXMsIG5ld1ByZU9mZnNldCwgcG9zdE9mZnNldCwgcHJlT2Zmc2V0LCB3cmFwQnl0ZXMgfSkgOiBwb3N0T2Zmc2V0O1xuICAgICAgYXNzZXJ0Qnl0ZUFycmF5T2Zmc2V0SXNOb3RPdXRPZlJhbmdlKFwib2Zmc2V0RW5jb2RlclwiLCBuZXdQb3N0T2Zmc2V0LCBieXRlcy5sZW5ndGgpO1xuICAgICAgcmV0dXJuIG5ld1Bvc3RPZmZzZXQ7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIG9mZnNldERlY29kZXIoZGVjb2RlciwgY29uZmlnKSB7XG4gIHJldHVybiBjcmVhdGVEZWNvZGVyKHtcbiAgICAuLi5kZWNvZGVyLFxuICAgIHJlYWQ6IChieXRlcywgcHJlT2Zmc2V0KSA9PiB7XG4gICAgICBjb25zdCB3cmFwQnl0ZXMgPSAob2Zmc2V0KSA9PiBtb2R1bG8ob2Zmc2V0LCBieXRlcy5sZW5ndGgpO1xuICAgICAgY29uc3QgbmV3UHJlT2Zmc2V0ID0gY29uZmlnLnByZU9mZnNldCA/IGNvbmZpZy5wcmVPZmZzZXQoeyBieXRlcywgcHJlT2Zmc2V0LCB3cmFwQnl0ZXMgfSkgOiBwcmVPZmZzZXQ7XG4gICAgICBhc3NlcnRCeXRlQXJyYXlPZmZzZXRJc05vdE91dE9mUmFuZ2UoXCJvZmZzZXREZWNvZGVyXCIsIG5ld1ByZU9mZnNldCwgYnl0ZXMubGVuZ3RoKTtcbiAgICAgIGNvbnN0IFt2YWx1ZSwgcG9zdE9mZnNldF0gPSBkZWNvZGVyLnJlYWQoYnl0ZXMsIG5ld1ByZU9mZnNldCk7XG4gICAgICBjb25zdCBuZXdQb3N0T2Zmc2V0ID0gY29uZmlnLnBvc3RPZmZzZXQgPyBjb25maWcucG9zdE9mZnNldCh7IGJ5dGVzLCBuZXdQcmVPZmZzZXQsIHBvc3RPZmZzZXQsIHByZU9mZnNldCwgd3JhcEJ5dGVzIH0pIDogcG9zdE9mZnNldDtcbiAgICAgIGFzc2VydEJ5dGVBcnJheU9mZnNldElzTm90T3V0T2ZSYW5nZShcIm9mZnNldERlY29kZXJcIiwgbmV3UG9zdE9mZnNldCwgYnl0ZXMubGVuZ3RoKTtcbiAgICAgIHJldHVybiBbdmFsdWUsIG5ld1Bvc3RPZmZzZXRdO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBvZmZzZXRDb2RlYyhjb2RlYywgY29uZmlnKSB7XG4gIHJldHVybiBjb21iaW5lQ29kZWMob2Zmc2V0RW5jb2Rlcihjb2RlYywgY29uZmlnKSwgb2Zmc2V0RGVjb2Rlcihjb2RlYywgY29uZmlnKSk7XG59XG5mdW5jdGlvbiBtb2R1bG8oZGl2aWRlbmQsIGRpdmlzb3IpIHtcbiAgaWYgKGRpdmlzb3IgPT09IDApIHJldHVybiAwO1xuICByZXR1cm4gKGRpdmlkZW5kICUgZGl2aXNvciArIGRpdmlzb3IpICUgZGl2aXNvcjtcbn1cbmZ1bmN0aW9uIHJlc2l6ZUVuY29kZXIoZW5jb2RlciwgcmVzaXplKSB7XG4gIGlmIChpc0ZpeGVkU2l6ZShlbmNvZGVyKSkge1xuICAgIGNvbnN0IGZpeGVkU2l6ZSA9IHJlc2l6ZShlbmNvZGVyLmZpeGVkU2l6ZSk7XG4gICAgaWYgKGZpeGVkU2l6ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFFcnJvcihTT0xBTkFfRVJST1JfX0NPREVDU19fRVhQRUNURURfUE9TSVRJVkVfQllURV9MRU5HVEgsIHtcbiAgICAgICAgYnl0ZXNMZW5ndGg6IGZpeGVkU2l6ZSxcbiAgICAgICAgY29kZWNEZXNjcmlwdGlvbjogXCJyZXNpemVFbmNvZGVyXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlRW5jb2Rlcih7IC4uLmVuY29kZXIsIGZpeGVkU2l6ZSB9KTtcbiAgfVxuICByZXR1cm4gY3JlYXRlRW5jb2Rlcih7XG4gICAgLi4uZW5jb2RlcixcbiAgICBnZXRTaXplRnJvbVZhbHVlOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG5ld1NpemUgPSByZXNpemUoZW5jb2Rlci5nZXRTaXplRnJvbVZhbHVlKHZhbHVlKSk7XG4gICAgICBpZiAobmV3U2l6ZSA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNvbGFuYUVycm9yKFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FWFBFQ1RFRF9QT1NJVElWRV9CWVRFX0xFTkdUSCwge1xuICAgICAgICAgIGJ5dGVzTGVuZ3RoOiBuZXdTaXplLFxuICAgICAgICAgIGNvZGVjRGVzY3JpcHRpb246IFwicmVzaXplRW5jb2RlclwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ld1NpemU7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIHJlc2l6ZURlY29kZXIoZGVjb2RlciwgcmVzaXplKSB7XG4gIGlmIChpc0ZpeGVkU2l6ZShkZWNvZGVyKSkge1xuICAgIGNvbnN0IGZpeGVkU2l6ZSA9IHJlc2l6ZShkZWNvZGVyLmZpeGVkU2l6ZSk7XG4gICAgaWYgKGZpeGVkU2l6ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFFcnJvcihTT0xBTkFfRVJST1JfX0NPREVDU19fRVhQRUNURURfUE9TSVRJVkVfQllURV9MRU5HVEgsIHtcbiAgICAgICAgYnl0ZXNMZW5ndGg6IGZpeGVkU2l6ZSxcbiAgICAgICAgY29kZWNEZXNjcmlwdGlvbjogXCJyZXNpemVEZWNvZGVyXCJcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlRGVjb2Rlcih7IC4uLmRlY29kZXIsIGZpeGVkU2l6ZSB9KTtcbiAgfVxuICByZXR1cm4gZGVjb2Rlcjtcbn1cbmZ1bmN0aW9uIHJlc2l6ZUNvZGVjKGNvZGVjLCByZXNpemUpIHtcbiAgcmV0dXJuIGNvbWJpbmVDb2RlYyhyZXNpemVFbmNvZGVyKGNvZGVjLCByZXNpemUpLCByZXNpemVEZWNvZGVyKGNvZGVjLCByZXNpemUpKTtcbn1cblxuLy8gc3JjL3BhZC1jb2RlYy50c1xuZnVuY3Rpb24gcGFkTGVmdEVuY29kZXIoZW5jb2Rlciwgb2Zmc2V0KSB7XG4gIHJldHVybiBvZmZzZXRFbmNvZGVyKFxuICAgIHJlc2l6ZUVuY29kZXIoZW5jb2RlciwgKHNpemUpID0+IHNpemUgKyBvZmZzZXQpLFxuICAgIHsgcHJlT2Zmc2V0OiAoeyBwcmVPZmZzZXQgfSkgPT4gcHJlT2Zmc2V0ICsgb2Zmc2V0IH1cbiAgKTtcbn1cbmZ1bmN0aW9uIHBhZFJpZ2h0RW5jb2RlcihlbmNvZGVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIG9mZnNldEVuY29kZXIoXG4gICAgcmVzaXplRW5jb2RlcihlbmNvZGVyLCAoc2l6ZSkgPT4gc2l6ZSArIG9mZnNldCksXG4gICAgeyBwb3N0T2Zmc2V0OiAoeyBwb3N0T2Zmc2V0IH0pID0+IHBvc3RPZmZzZXQgKyBvZmZzZXQgfVxuICApO1xufVxuZnVuY3Rpb24gcGFkTGVmdERlY29kZXIoZGVjb2Rlciwgb2Zmc2V0KSB7XG4gIHJldHVybiBvZmZzZXREZWNvZGVyKFxuICAgIHJlc2l6ZURlY29kZXIoZGVjb2RlciwgKHNpemUpID0+IHNpemUgKyBvZmZzZXQpLFxuICAgIHsgcHJlT2Zmc2V0OiAoeyBwcmVPZmZzZXQgfSkgPT4gcHJlT2Zmc2V0ICsgb2Zmc2V0IH1cbiAgKTtcbn1cbmZ1bmN0aW9uIHBhZFJpZ2h0RGVjb2RlcihkZWNvZGVyLCBvZmZzZXQpIHtcbiAgcmV0dXJuIG9mZnNldERlY29kZXIoXG4gICAgcmVzaXplRGVjb2RlcihkZWNvZGVyLCAoc2l6ZSkgPT4gc2l6ZSArIG9mZnNldCksXG4gICAgeyBwb3N0T2Zmc2V0OiAoeyBwb3N0T2Zmc2V0IH0pID0+IHBvc3RPZmZzZXQgKyBvZmZzZXQgfVxuICApO1xufVxuZnVuY3Rpb24gcGFkTGVmdENvZGVjKGNvZGVjLCBvZmZzZXQpIHtcbiAgcmV0dXJuIGNvbWJpbmVDb2RlYyhwYWRMZWZ0RW5jb2Rlcihjb2RlYywgb2Zmc2V0KSwgcGFkTGVmdERlY29kZXIoY29kZWMsIG9mZnNldCkpO1xufVxuZnVuY3Rpb24gcGFkUmlnaHRDb2RlYyhjb2RlYywgb2Zmc2V0KSB7XG4gIHJldHVybiBjb21iaW5lQ29kZWMocGFkUmlnaHRFbmNvZGVyKGNvZGVjLCBvZmZzZXQpLCBwYWRSaWdodERlY29kZXIoY29kZWMsIG9mZnNldCkpO1xufVxuXG4vLyBzcmMvcmV2ZXJzZS1jb2RlYy50c1xuZnVuY3Rpb24gY29weVNvdXJjZVRvVGFyZ2V0SW5SZXZlcnNlKHNvdXJjZSwgdGFyZ2V0X1dJTExfTVVUQVRFLCBzb3VyY2VPZmZzZXQsIHNvdXJjZUxlbmd0aCwgdGFyZ2V0T2Zmc2V0ID0gMCkge1xuICB3aGlsZSAoc291cmNlT2Zmc2V0IDwgLS1zb3VyY2VMZW5ndGgpIHtcbiAgICBjb25zdCBsZWZ0VmFsdWUgPSBzb3VyY2Vbc291cmNlT2Zmc2V0XTtcbiAgICB0YXJnZXRfV0lMTF9NVVRBVEVbc291cmNlT2Zmc2V0ICsgdGFyZ2V0T2Zmc2V0XSA9IHNvdXJjZVtzb3VyY2VMZW5ndGhdO1xuICAgIHRhcmdldF9XSUxMX01VVEFURVtzb3VyY2VMZW5ndGggKyB0YXJnZXRPZmZzZXRdID0gbGVmdFZhbHVlO1xuICAgIHNvdXJjZU9mZnNldCsrO1xuICB9XG4gIGlmIChzb3VyY2VPZmZzZXQgPT09IHNvdXJjZUxlbmd0aCkge1xuICAgIHRhcmdldF9XSUxMX01VVEFURVtzb3VyY2VPZmZzZXQgKyB0YXJnZXRPZmZzZXRdID0gc291cmNlW3NvdXJjZU9mZnNldF07XG4gIH1cbn1cbmZ1bmN0aW9uIHJldmVyc2VFbmNvZGVyKGVuY29kZXIpIHtcbiAgYXNzZXJ0SXNGaXhlZFNpemUoZW5jb2Rlcik7XG4gIHJldHVybiBjcmVhdGVFbmNvZGVyKHtcbiAgICAuLi5lbmNvZGVyLFxuICAgIHdyaXRlOiAodmFsdWUsIGJ5dGVzLCBvZmZzZXQpID0+IHtcbiAgICAgIGNvbnN0IG5ld09mZnNldCA9IGVuY29kZXIud3JpdGUodmFsdWUsIGJ5dGVzLCBvZmZzZXQpO1xuICAgICAgY29weVNvdXJjZVRvVGFyZ2V0SW5SZXZlcnNlKFxuICAgICAgICBieXRlcyxcbiAgICAgICAgYnl0ZXMsXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgb2Zmc2V0ICsgZW5jb2Rlci5maXhlZFNpemVcbiAgICAgICk7XG4gICAgICByZXR1cm4gbmV3T2Zmc2V0O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiByZXZlcnNlRGVjb2RlcihkZWNvZGVyKSB7XG4gIGFzc2VydElzRml4ZWRTaXplKGRlY29kZXIpO1xuICByZXR1cm4gY3JlYXRlRGVjb2Rlcih7XG4gICAgLi4uZGVjb2RlcixcbiAgICByZWFkOiAoYnl0ZXMsIG9mZnNldCkgPT4ge1xuICAgICAgY29uc3QgcmV2ZXJzZWRCeXRlcyA9IGJ5dGVzLnNsaWNlKCk7XG4gICAgICBjb3B5U291cmNlVG9UYXJnZXRJblJldmVyc2UoXG4gICAgICAgIGJ5dGVzLFxuICAgICAgICByZXZlcnNlZEJ5dGVzLFxuICAgICAgICBvZmZzZXQsXG4gICAgICAgIG9mZnNldCArIGRlY29kZXIuZml4ZWRTaXplXG4gICAgICApO1xuICAgICAgcmV0dXJuIGRlY29kZXIucmVhZChyZXZlcnNlZEJ5dGVzLCBvZmZzZXQpO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiByZXZlcnNlQ29kZWMoY29kZWMpIHtcbiAgcmV0dXJuIGNvbWJpbmVDb2RlYyhyZXZlcnNlRW5jb2Rlcihjb2RlYyksIHJldmVyc2VEZWNvZGVyKGNvZGVjKSk7XG59XG5cbi8vIHNyYy90cmFuc2Zvcm0tY29kZWMudHNcbmZ1bmN0aW9uIHRyYW5zZm9ybUVuY29kZXIoZW5jb2RlciwgdW5tYXApIHtcbiAgcmV0dXJuIGNyZWF0ZUVuY29kZXIoe1xuICAgIC4uLmlzVmFyaWFibGVTaXplKGVuY29kZXIpID8geyAuLi5lbmNvZGVyLCBnZXRTaXplRnJvbVZhbHVlOiAodmFsdWUpID0+IGVuY29kZXIuZ2V0U2l6ZUZyb21WYWx1ZSh1bm1hcCh2YWx1ZSkpIH0gOiBlbmNvZGVyLFxuICAgIHdyaXRlOiAodmFsdWUsIGJ5dGVzLCBvZmZzZXQpID0+IGVuY29kZXIud3JpdGUodW5tYXAodmFsdWUpLCBieXRlcywgb2Zmc2V0KVxuICB9KTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybURlY29kZXIoZGVjb2RlciwgbWFwKSB7XG4gIHJldHVybiBjcmVhdGVEZWNvZGVyKHtcbiAgICAuLi5kZWNvZGVyLFxuICAgIHJlYWQ6IChieXRlcywgb2Zmc2V0KSA9PiB7XG4gICAgICBjb25zdCBbdmFsdWUsIG5ld09mZnNldF0gPSBkZWNvZGVyLnJlYWQoYnl0ZXMsIG9mZnNldCk7XG4gICAgICByZXR1cm4gW21hcCh2YWx1ZSwgYnl0ZXMsIG9mZnNldCksIG5ld09mZnNldF07XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybUNvZGVjKGNvZGVjLCB1bm1hcCwgbWFwKSB7XG4gIHJldHVybiBjcmVhdGVDb2RlYyh7XG4gICAgLi4udHJhbnNmb3JtRW5jb2Rlcihjb2RlYywgdW5tYXApLFxuICAgIHJlYWQ6IG1hcCA/IHRyYW5zZm9ybURlY29kZXIoY29kZWMsIG1hcCkucmVhZCA6IGNvZGVjLnJlYWRcbiAgfSk7XG59XG5cbmV4cG9ydCB7IGFkZENvZGVjU2VudGluZWwsIGFkZENvZGVjU2l6ZVByZWZpeCwgYWRkRGVjb2RlclNlbnRpbmVsLCBhZGREZWNvZGVyU2l6ZVByZWZpeCwgYWRkRW5jb2RlclNlbnRpbmVsLCBhZGRFbmNvZGVyU2l6ZVByZWZpeCwgYXNzZXJ0Qnl0ZUFycmF5SGFzRW5vdWdoQnl0ZXNGb3JDb2RlYywgYXNzZXJ0Qnl0ZUFycmF5SXNOb3RFbXB0eUZvckNvZGVjLCBhc3NlcnRCeXRlQXJyYXlPZmZzZXRJc05vdE91dE9mUmFuZ2UsIGFzc2VydElzRml4ZWRTaXplLCBhc3NlcnRJc1ZhcmlhYmxlU2l6ZSwgY29tYmluZUNvZGVjLCBjb250YWluc0J5dGVzLCBjcmVhdGVDb2RlYywgY3JlYXRlRGVjb2RlciwgY3JlYXRlRW5jb2RlciwgZml4Qnl0ZXMsIGZpeENvZGVjU2l6ZSwgZml4RGVjb2RlclNpemUsIGZpeEVuY29kZXJTaXplLCBnZXRFbmNvZGVkU2l6ZSwgaXNGaXhlZFNpemUsIGlzVmFyaWFibGVTaXplLCBtZXJnZUJ5dGVzLCBvZmZzZXRDb2RlYywgb2Zmc2V0RGVjb2Rlciwgb2Zmc2V0RW5jb2RlciwgcGFkQnl0ZXMsIHBhZExlZnRDb2RlYywgcGFkTGVmdERlY29kZXIsIHBhZExlZnRFbmNvZGVyLCBwYWRSaWdodENvZGVjLCBwYWRSaWdodERlY29kZXIsIHBhZFJpZ2h0RW5jb2RlciwgcmVzaXplQ29kZWMsIHJlc2l6ZURlY29kZXIsIHJlc2l6ZUVuY29kZXIsIHJldmVyc2VDb2RlYywgcmV2ZXJzZURlY29kZXIsIHJldmVyc2VFbmNvZGVyLCB0cmFuc2Zvcm1Db2RlYywgdHJhbnNmb3JtRGVjb2RlciwgdHJhbnNmb3JtRW5jb2RlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguYnJvd3Nlci5tanMubWFwXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5icm93c2VyLm1qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@solana/codecs-core/dist/index.browser.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@solana/codecs-numbers/dist/index.browser.mjs":
/*!********************************************************************!*\
  !*** ./node_modules/@solana/codecs-numbers/dist/index.browser.mjs ***!
  \********************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Endian: () => (/* binding */ Endian),\n/* harmony export */   assertNumberIsBetweenForCodec: () => (/* binding */ assertNumberIsBetweenForCodec),\n/* harmony export */   getF32Codec: () => (/* binding */ getF32Codec),\n/* harmony export */   getF32Decoder: () => (/* binding */ getF32Decoder),\n/* harmony export */   getF32Encoder: () => (/* binding */ getF32Encoder),\n/* harmony export */   getF64Codec: () => (/* binding */ getF64Codec),\n/* harmony export */   getF64Decoder: () => (/* binding */ getF64Decoder),\n/* harmony export */   getF64Encoder: () => (/* binding */ getF64Encoder),\n/* harmony export */   getI128Codec: () => (/* binding */ getI128Codec),\n/* harmony export */   getI128Decoder: () => (/* binding */ getI128Decoder),\n/* harmony export */   getI128Encoder: () => (/* binding */ getI128Encoder),\n/* harmony export */   getI16Codec: () => (/* binding */ getI16Codec),\n/* harmony export */   getI16Decoder: () => (/* binding */ getI16Decoder),\n/* harmony export */   getI16Encoder: () => (/* binding */ getI16Encoder),\n/* harmony export */   getI32Codec: () => (/* binding */ getI32Codec),\n/* harmony export */   getI32Decoder: () => (/* binding */ getI32Decoder),\n/* harmony export */   getI32Encoder: () => (/* binding */ getI32Encoder),\n/* harmony export */   getI64Codec: () => (/* binding */ getI64Codec),\n/* harmony export */   getI64Decoder: () => (/* binding */ getI64Decoder),\n/* harmony export */   getI64Encoder: () => (/* binding */ getI64Encoder),\n/* harmony export */   getI8Codec: () => (/* binding */ getI8Codec),\n/* harmony export */   getI8Decoder: () => (/* binding */ getI8Decoder),\n/* harmony export */   getI8Encoder: () => (/* binding */ getI8Encoder),\n/* harmony export */   getShortU16Codec: () => (/* binding */ getShortU16Codec),\n/* harmony export */   getShortU16Decoder: () => (/* binding */ getShortU16Decoder),\n/* harmony export */   getShortU16Encoder: () => (/* binding */ getShortU16Encoder),\n/* harmony export */   getU128Codec: () => (/* binding */ getU128Codec),\n/* harmony export */   getU128Decoder: () => (/* binding */ getU128Decoder),\n/* harmony export */   getU128Encoder: () => (/* binding */ getU128Encoder),\n/* harmony export */   getU16Codec: () => (/* binding */ getU16Codec),\n/* harmony export */   getU16Decoder: () => (/* binding */ getU16Decoder),\n/* harmony export */   getU16Encoder: () => (/* binding */ getU16Encoder),\n/* harmony export */   getU32Codec: () => (/* binding */ getU32Codec),\n/* harmony export */   getU32Decoder: () => (/* binding */ getU32Decoder),\n/* harmony export */   getU32Encoder: () => (/* binding */ getU32Encoder),\n/* harmony export */   getU64Codec: () => (/* binding */ getU64Codec),\n/* harmony export */   getU64Decoder: () => (/* binding */ getU64Decoder),\n/* harmony export */   getU64Encoder: () => (/* binding */ getU64Encoder),\n/* harmony export */   getU8Codec: () => (/* binding */ getU8Codec),\n/* harmony export */   getU8Decoder: () => (/* binding */ getU8Decoder),\n/* harmony export */   getU8Encoder: () => (/* binding */ getU8Encoder)\n/* harmony export */ });\n/* harmony import */ var _solana_errors__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @solana/errors */ \"(app-pages-browser)/./node_modules/@solana/errors/dist/index.browser.mjs\");\n/* harmony import */ var _solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @solana/codecs-core */ \"(app-pages-browser)/./node_modules/@solana/codecs-core/dist/index.browser.mjs\");\n\n\n\n// src/assertions.ts\nfunction assertNumberIsBetweenForCodec(codecDescription, min, max, value) {\n  if (value < min || value > max) {\n    throw new _solana_errors__WEBPACK_IMPORTED_MODULE_0__.SolanaError(_solana_errors__WEBPACK_IMPORTED_MODULE_0__.SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE, {\n      codecDescription,\n      max,\n      min,\n      value\n    });\n  }\n}\n\n// src/common.ts\nvar Endian = /* @__PURE__ */ ((Endian2) => {\n  Endian2[Endian2[\"Little\"] = 0] = \"Little\";\n  Endian2[Endian2[\"Big\"] = 1] = \"Big\";\n  return Endian2;\n})(Endian || {});\nfunction isLittleEndian(config) {\n  return config?.endian === 1 /* Big */ ? false : true;\n}\nfunction numberEncoderFactory(input) {\n  return (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.createEncoder)({\n    fixedSize: input.size,\n    write(value, bytes, offset) {\n      if (input.range) {\n        assertNumberIsBetweenForCodec(input.name, input.range[0], input.range[1], value);\n      }\n      const arrayBuffer = new ArrayBuffer(input.size);\n      input.set(new DataView(arrayBuffer), value, isLittleEndian(input.config));\n      bytes.set(new Uint8Array(arrayBuffer), offset);\n      return offset + input.size;\n    }\n  });\n}\nfunction numberDecoderFactory(input) {\n  return (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.createDecoder)({\n    fixedSize: input.size,\n    read(bytes, offset = 0) {\n      (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.assertByteArrayIsNotEmptyForCodec)(input.name, bytes, offset);\n      (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.assertByteArrayHasEnoughBytesForCodec)(input.name, input.size, bytes, offset);\n      const view = new DataView(toArrayBuffer(bytes, offset, input.size));\n      return [input.get(view, isLittleEndian(input.config)), offset + input.size];\n    }\n  });\n}\nfunction toArrayBuffer(bytes, offset, length) {\n  const bytesOffset = bytes.byteOffset + (offset ?? 0);\n  const bytesLength = length ?? bytes.byteLength;\n  return bytes.buffer.slice(bytesOffset, bytesOffset + bytesLength);\n}\n\n// src/f32.ts\nvar getF32Encoder = (config = {}) => numberEncoderFactory({\n  config,\n  name: \"f32\",\n  set: (view, value, le) => view.setFloat32(0, Number(value), le),\n  size: 4\n});\nvar getF32Decoder = (config = {}) => numberDecoderFactory({\n  config,\n  get: (view, le) => view.getFloat32(0, le),\n  name: \"f32\",\n  size: 4\n});\nvar getF32Codec = (config = {}) => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getF32Encoder(config), getF32Decoder(config));\nvar getF64Encoder = (config = {}) => numberEncoderFactory({\n  config,\n  name: \"f64\",\n  set: (view, value, le) => view.setFloat64(0, Number(value), le),\n  size: 8\n});\nvar getF64Decoder = (config = {}) => numberDecoderFactory({\n  config,\n  get: (view, le) => view.getFloat64(0, le),\n  name: \"f64\",\n  size: 8\n});\nvar getF64Codec = (config = {}) => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getF64Encoder(config), getF64Decoder(config));\nvar getI128Encoder = (config = {}) => numberEncoderFactory({\n  config,\n  name: \"i128\",\n  range: [-BigInt(\"0x7fffffffffffffffffffffffffffffff\") - 1n, BigInt(\"0x7fffffffffffffffffffffffffffffff\")],\n  set: (view, value, le) => {\n    const leftOffset = le ? 8 : 0;\n    const rightOffset = le ? 0 : 8;\n    const rightMask = 0xffffffffffffffffn;\n    view.setBigInt64(leftOffset, BigInt(value) >> 64n, le);\n    view.setBigUint64(rightOffset, BigInt(value) & rightMask, le);\n  },\n  size: 16\n});\nvar getI128Decoder = (config = {}) => numberDecoderFactory({\n  config,\n  get: (view, le) => {\n    const leftOffset = le ? 8 : 0;\n    const rightOffset = le ? 0 : 8;\n    const left = view.getBigInt64(leftOffset, le);\n    const right = view.getBigUint64(rightOffset, le);\n    return (left << 64n) + right;\n  },\n  name: \"i128\",\n  size: 16\n});\nvar getI128Codec = (config = {}) => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getI128Encoder(config), getI128Decoder(config));\nvar getI16Encoder = (config = {}) => numberEncoderFactory({\n  config,\n  name: \"i16\",\n  range: [-Number(\"0x7fff\") - 1, Number(\"0x7fff\")],\n  set: (view, value, le) => view.setInt16(0, Number(value), le),\n  size: 2\n});\nvar getI16Decoder = (config = {}) => numberDecoderFactory({\n  config,\n  get: (view, le) => view.getInt16(0, le),\n  name: \"i16\",\n  size: 2\n});\nvar getI16Codec = (config = {}) => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getI16Encoder(config), getI16Decoder(config));\nvar getI32Encoder = (config = {}) => numberEncoderFactory({\n  config,\n  name: \"i32\",\n  range: [-Number(\"0x7fffffff\") - 1, Number(\"0x7fffffff\")],\n  set: (view, value, le) => view.setInt32(0, Number(value), le),\n  size: 4\n});\nvar getI32Decoder = (config = {}) => numberDecoderFactory({\n  config,\n  get: (view, le) => view.getInt32(0, le),\n  name: \"i32\",\n  size: 4\n});\nvar getI32Codec = (config = {}) => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getI32Encoder(config), getI32Decoder(config));\nvar getI64Encoder = (config = {}) => numberEncoderFactory({\n  config,\n  name: \"i64\",\n  range: [-BigInt(\"0x7fffffffffffffff\") - 1n, BigInt(\"0x7fffffffffffffff\")],\n  set: (view, value, le) => view.setBigInt64(0, BigInt(value), le),\n  size: 8\n});\nvar getI64Decoder = (config = {}) => numberDecoderFactory({\n  config,\n  get: (view, le) => view.getBigInt64(0, le),\n  name: \"i64\",\n  size: 8\n});\nvar getI64Codec = (config = {}) => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getI64Encoder(config), getI64Decoder(config));\nvar getI8Encoder = () => numberEncoderFactory({\n  name: \"i8\",\n  range: [-Number(\"0x7f\") - 1, Number(\"0x7f\")],\n  set: (view, value) => view.setInt8(0, Number(value)),\n  size: 1\n});\nvar getI8Decoder = () => numberDecoderFactory({\n  get: (view) => view.getInt8(0),\n  name: \"i8\",\n  size: 1\n});\nvar getI8Codec = () => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getI8Encoder(), getI8Decoder());\nvar getShortU16Encoder = () => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.createEncoder)({\n  getSizeFromValue: (value) => {\n    if (value <= 127) return 1;\n    if (value <= 16383) return 2;\n    return 3;\n  },\n  maxSize: 3,\n  write: (value, bytes, offset) => {\n    assertNumberIsBetweenForCodec(\"shortU16\", 0, 65535, value);\n    const shortU16Bytes = [0];\n    for (let ii = 0; ; ii += 1) {\n      const alignedValue = Number(value) >> ii * 7;\n      if (alignedValue === 0) {\n        break;\n      }\n      const nextSevenBits = 127 & alignedValue;\n      shortU16Bytes[ii] = nextSevenBits;\n      if (ii > 0) {\n        shortU16Bytes[ii - 1] |= 128;\n      }\n    }\n    bytes.set(shortU16Bytes, offset);\n    return offset + shortU16Bytes.length;\n  }\n});\nvar getShortU16Decoder = () => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.createDecoder)({\n  maxSize: 3,\n  read: (bytes, offset) => {\n    let value = 0;\n    let byteCount = 0;\n    while (++byteCount) {\n      const byteIndex = byteCount - 1;\n      const currentByte = bytes[offset + byteIndex];\n      const nextSevenBits = 127 & currentByte;\n      value |= nextSevenBits << byteIndex * 7;\n      if ((currentByte & 128) === 0) {\n        break;\n      }\n    }\n    return [value, offset + byteCount];\n  }\n});\nvar getShortU16Codec = () => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getShortU16Encoder(), getShortU16Decoder());\nvar getU128Encoder = (config = {}) => numberEncoderFactory({\n  config,\n  name: \"u128\",\n  range: [0n, BigInt(\"0xffffffffffffffffffffffffffffffff\")],\n  set: (view, value, le) => {\n    const leftOffset = le ? 8 : 0;\n    const rightOffset = le ? 0 : 8;\n    const rightMask = 0xffffffffffffffffn;\n    view.setBigUint64(leftOffset, BigInt(value) >> 64n, le);\n    view.setBigUint64(rightOffset, BigInt(value) & rightMask, le);\n  },\n  size: 16\n});\nvar getU128Decoder = (config = {}) => numberDecoderFactory({\n  config,\n  get: (view, le) => {\n    const leftOffset = le ? 8 : 0;\n    const rightOffset = le ? 0 : 8;\n    const left = view.getBigUint64(leftOffset, le);\n    const right = view.getBigUint64(rightOffset, le);\n    return (left << 64n) + right;\n  },\n  name: \"u128\",\n  size: 16\n});\nvar getU128Codec = (config = {}) => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getU128Encoder(config), getU128Decoder(config));\nvar getU16Encoder = (config = {}) => numberEncoderFactory({\n  config,\n  name: \"u16\",\n  range: [0, Number(\"0xffff\")],\n  set: (view, value, le) => view.setUint16(0, Number(value), le),\n  size: 2\n});\nvar getU16Decoder = (config = {}) => numberDecoderFactory({\n  config,\n  get: (view, le) => view.getUint16(0, le),\n  name: \"u16\",\n  size: 2\n});\nvar getU16Codec = (config = {}) => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getU16Encoder(config), getU16Decoder(config));\nvar getU32Encoder = (config = {}) => numberEncoderFactory({\n  config,\n  name: \"u32\",\n  range: [0, Number(\"0xffffffff\")],\n  set: (view, value, le) => view.setUint32(0, Number(value), le),\n  size: 4\n});\nvar getU32Decoder = (config = {}) => numberDecoderFactory({\n  config,\n  get: (view, le) => view.getUint32(0, le),\n  name: \"u32\",\n  size: 4\n});\nvar getU32Codec = (config = {}) => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getU32Encoder(config), getU32Decoder(config));\nvar getU64Encoder = (config = {}) => numberEncoderFactory({\n  config,\n  name: \"u64\",\n  range: [0n, BigInt(\"0xffffffffffffffff\")],\n  set: (view, value, le) => view.setBigUint64(0, BigInt(value), le),\n  size: 8\n});\nvar getU64Decoder = (config = {}) => numberDecoderFactory({\n  config,\n  get: (view, le) => view.getBigUint64(0, le),\n  name: \"u64\",\n  size: 8\n});\nvar getU64Codec = (config = {}) => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getU64Encoder(config), getU64Decoder(config));\nvar getU8Encoder = () => numberEncoderFactory({\n  name: \"u8\",\n  range: [0, Number(\"0xff\")],\n  set: (view, value) => view.setUint8(0, Number(value)),\n  size: 1\n});\nvar getU8Decoder = () => numberDecoderFactory({\n  get: (view) => view.getUint8(0),\n  name: \"u8\",\n  size: 1\n});\nvar getU8Codec = () => (0,_solana_codecs_core__WEBPACK_IMPORTED_MODULE_1__.combineCodec)(getU8Encoder(), getU8Decoder());\n\n\n//# sourceMappingURL=index.browser.mjs.map\n//# sourceMappingURL=index.browser.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac29sYW5hL2NvZGVjcy1udW1iZXJzL2Rpc3QvaW5kZXguYnJvd3Nlci5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUF3RjtBQUNtRTs7QUFFM0o7QUFDQTtBQUNBO0FBQ0EsY0FBYyx1REFBVyxDQUFDLHFGQUF5QztBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGNBQWM7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsa0VBQWE7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLFNBQVMsa0VBQWE7QUFDdEI7QUFDQTtBQUNBLE1BQU0sc0ZBQWlDO0FBQ3ZDLE1BQU0sMEZBQXFDO0FBQzNDO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDhCQUE4QixLQUFLLGlFQUFZO0FBQy9DLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsOEJBQThCLEtBQUssaUVBQVk7QUFDL0MsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRCxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7QUFDRCwrQkFBK0IsS0FBSyxpRUFBWTtBQUNoRCxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsOEJBQThCLEtBQUssaUVBQVk7QUFDL0MsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDhCQUE4QixLQUFLLGlFQUFZO0FBQy9DLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCw4QkFBOEIsS0FBSyxpRUFBWTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHVCQUF1QixpRUFBWTtBQUNuQywrQkFBK0Isa0VBQWE7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsK0JBQStCLGtFQUFhO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCw2QkFBNkIsaUVBQVk7QUFDekMsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBLENBQUM7QUFDRCxpQ0FBaUM7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUM7QUFDRCwrQkFBK0IsS0FBSyxpRUFBWTtBQUNoRCxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxnQ0FBZ0M7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsOEJBQThCLEtBQUssaUVBQVk7QUFDL0MsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELDhCQUE4QixLQUFLLGlFQUFZO0FBQy9DLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCw4QkFBOEIsS0FBSyxpRUFBWTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELHVCQUF1QixpRUFBWTs7QUFFNGtCO0FBQy9tQjtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0Bzb2xhbmEvY29kZWNzLW51bWJlcnMvZGlzdC9pbmRleC5icm93c2VyLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb2xhbmFFcnJvciwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX05VTUJFUl9PVVRfT0ZfUkFOR0UgfSBmcm9tICdAc29sYW5hL2Vycm9ycyc7XG5pbXBvcnQgeyBjb21iaW5lQ29kZWMsIGNyZWF0ZURlY29kZXIsIGNyZWF0ZUVuY29kZXIsIGFzc2VydEJ5dGVBcnJheUlzTm90RW1wdHlGb3JDb2RlYywgYXNzZXJ0Qnl0ZUFycmF5SGFzRW5vdWdoQnl0ZXNGb3JDb2RlYyB9IGZyb20gJ0Bzb2xhbmEvY29kZWNzLWNvcmUnO1xuXG4vLyBzcmMvYXNzZXJ0aW9ucy50c1xuZnVuY3Rpb24gYXNzZXJ0TnVtYmVySXNCZXR3ZWVuRm9yQ29kZWMoY29kZWNEZXNjcmlwdGlvbiwgbWluLCBtYXgsIHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA8IG1pbiB8fCB2YWx1ZSA+IG1heCkge1xuICAgIHRocm93IG5ldyBTb2xhbmFFcnJvcihTT0xBTkFfRVJST1JfX0NPREVDU19fTlVNQkVSX09VVF9PRl9SQU5HRSwge1xuICAgICAgY29kZWNEZXNjcmlwdGlvbixcbiAgICAgIG1heCxcbiAgICAgIG1pbixcbiAgICAgIHZhbHVlXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gc3JjL2NvbW1vbi50c1xudmFyIEVuZGlhbiA9IC8qIEBfX1BVUkVfXyAqLyAoKEVuZGlhbjIpID0+IHtcbiAgRW5kaWFuMltFbmRpYW4yW1wiTGl0dGxlXCJdID0gMF0gPSBcIkxpdHRsZVwiO1xuICBFbmRpYW4yW0VuZGlhbjJbXCJCaWdcIl0gPSAxXSA9IFwiQmlnXCI7XG4gIHJldHVybiBFbmRpYW4yO1xufSkoRW5kaWFuIHx8IHt9KTtcbmZ1bmN0aW9uIGlzTGl0dGxlRW5kaWFuKGNvbmZpZykge1xuICByZXR1cm4gY29uZmlnPy5lbmRpYW4gPT09IDEgLyogQmlnICovID8gZmFsc2UgOiB0cnVlO1xufVxuZnVuY3Rpb24gbnVtYmVyRW5jb2RlckZhY3RvcnkoaW5wdXQpIHtcbiAgcmV0dXJuIGNyZWF0ZUVuY29kZXIoe1xuICAgIGZpeGVkU2l6ZTogaW5wdXQuc2l6ZSxcbiAgICB3cml0ZSh2YWx1ZSwgYnl0ZXMsIG9mZnNldCkge1xuICAgICAgaWYgKGlucHV0LnJhbmdlKSB7XG4gICAgICAgIGFzc2VydE51bWJlcklzQmV0d2VlbkZvckNvZGVjKGlucHV0Lm5hbWUsIGlucHV0LnJhbmdlWzBdLCBpbnB1dC5yYW5nZVsxXSwgdmFsdWUpO1xuICAgICAgfVxuICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoaW5wdXQuc2l6ZSk7XG4gICAgICBpbnB1dC5zZXQobmV3IERhdGFWaWV3KGFycmF5QnVmZmVyKSwgdmFsdWUsIGlzTGl0dGxlRW5kaWFuKGlucHV0LmNvbmZpZykpO1xuICAgICAgYnl0ZXMuc2V0KG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKSwgb2Zmc2V0KTtcbiAgICAgIHJldHVybiBvZmZzZXQgKyBpbnB1dC5zaXplO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBudW1iZXJEZWNvZGVyRmFjdG9yeShpbnB1dCkge1xuICByZXR1cm4gY3JlYXRlRGVjb2Rlcih7XG4gICAgZml4ZWRTaXplOiBpbnB1dC5zaXplLFxuICAgIHJlYWQoYnl0ZXMsIG9mZnNldCA9IDApIHtcbiAgICAgIGFzc2VydEJ5dGVBcnJheUlzTm90RW1wdHlGb3JDb2RlYyhpbnB1dC5uYW1lLCBieXRlcywgb2Zmc2V0KTtcbiAgICAgIGFzc2VydEJ5dGVBcnJheUhhc0Vub3VnaEJ5dGVzRm9yQ29kZWMoaW5wdXQubmFtZSwgaW5wdXQuc2l6ZSwgYnl0ZXMsIG9mZnNldCk7XG4gICAgICBjb25zdCB2aWV3ID0gbmV3IERhdGFWaWV3KHRvQXJyYXlCdWZmZXIoYnl0ZXMsIG9mZnNldCwgaW5wdXQuc2l6ZSkpO1xuICAgICAgcmV0dXJuIFtpbnB1dC5nZXQodmlldywgaXNMaXR0bGVFbmRpYW4oaW5wdXQuY29uZmlnKSksIG9mZnNldCArIGlucHV0LnNpemVdO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiB0b0FycmF5QnVmZmVyKGJ5dGVzLCBvZmZzZXQsIGxlbmd0aCkge1xuICBjb25zdCBieXRlc09mZnNldCA9IGJ5dGVzLmJ5dGVPZmZzZXQgKyAob2Zmc2V0ID8/IDApO1xuICBjb25zdCBieXRlc0xlbmd0aCA9IGxlbmd0aCA/PyBieXRlcy5ieXRlTGVuZ3RoO1xuICByZXR1cm4gYnl0ZXMuYnVmZmVyLnNsaWNlKGJ5dGVzT2Zmc2V0LCBieXRlc09mZnNldCArIGJ5dGVzTGVuZ3RoKTtcbn1cblxuLy8gc3JjL2YzMi50c1xudmFyIGdldEYzMkVuY29kZXIgPSAoY29uZmlnID0ge30pID0+IG51bWJlckVuY29kZXJGYWN0b3J5KHtcbiAgY29uZmlnLFxuICBuYW1lOiBcImYzMlwiLFxuICBzZXQ6ICh2aWV3LCB2YWx1ZSwgbGUpID0+IHZpZXcuc2V0RmxvYXQzMigwLCBOdW1iZXIodmFsdWUpLCBsZSksXG4gIHNpemU6IDRcbn0pO1xudmFyIGdldEYzMkRlY29kZXIgPSAoY29uZmlnID0ge30pID0+IG51bWJlckRlY29kZXJGYWN0b3J5KHtcbiAgY29uZmlnLFxuICBnZXQ6ICh2aWV3LCBsZSkgPT4gdmlldy5nZXRGbG9hdDMyKDAsIGxlKSxcbiAgbmFtZTogXCJmMzJcIixcbiAgc2l6ZTogNFxufSk7XG52YXIgZ2V0RjMyQ29kZWMgPSAoY29uZmlnID0ge30pID0+IGNvbWJpbmVDb2RlYyhnZXRGMzJFbmNvZGVyKGNvbmZpZyksIGdldEYzMkRlY29kZXIoY29uZmlnKSk7XG52YXIgZ2V0RjY0RW5jb2RlciA9IChjb25maWcgPSB7fSkgPT4gbnVtYmVyRW5jb2RlckZhY3Rvcnkoe1xuICBjb25maWcsXG4gIG5hbWU6IFwiZjY0XCIsXG4gIHNldDogKHZpZXcsIHZhbHVlLCBsZSkgPT4gdmlldy5zZXRGbG9hdDY0KDAsIE51bWJlcih2YWx1ZSksIGxlKSxcbiAgc2l6ZTogOFxufSk7XG52YXIgZ2V0RjY0RGVjb2RlciA9IChjb25maWcgPSB7fSkgPT4gbnVtYmVyRGVjb2RlckZhY3Rvcnkoe1xuICBjb25maWcsXG4gIGdldDogKHZpZXcsIGxlKSA9PiB2aWV3LmdldEZsb2F0NjQoMCwgbGUpLFxuICBuYW1lOiBcImY2NFwiLFxuICBzaXplOiA4XG59KTtcbnZhciBnZXRGNjRDb2RlYyA9IChjb25maWcgPSB7fSkgPT4gY29tYmluZUNvZGVjKGdldEY2NEVuY29kZXIoY29uZmlnKSwgZ2V0RjY0RGVjb2Rlcihjb25maWcpKTtcbnZhciBnZXRJMTI4RW5jb2RlciA9IChjb25maWcgPSB7fSkgPT4gbnVtYmVyRW5jb2RlckZhY3Rvcnkoe1xuICBjb25maWcsXG4gIG5hbWU6IFwiaTEyOFwiLFxuICByYW5nZTogWy1CaWdJbnQoXCIweDdmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmXCIpIC0gMW4sIEJpZ0ludChcIjB4N2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZcIildLFxuICBzZXQ6ICh2aWV3LCB2YWx1ZSwgbGUpID0+IHtcbiAgICBjb25zdCBsZWZ0T2Zmc2V0ID0gbGUgPyA4IDogMDtcbiAgICBjb25zdCByaWdodE9mZnNldCA9IGxlID8gMCA6IDg7XG4gICAgY29uc3QgcmlnaHRNYXNrID0gMHhmZmZmZmZmZmZmZmZmZmZmbjtcbiAgICB2aWV3LnNldEJpZ0ludDY0KGxlZnRPZmZzZXQsIEJpZ0ludCh2YWx1ZSkgPj4gNjRuLCBsZSk7XG4gICAgdmlldy5zZXRCaWdVaW50NjQocmlnaHRPZmZzZXQsIEJpZ0ludCh2YWx1ZSkgJiByaWdodE1hc2ssIGxlKTtcbiAgfSxcbiAgc2l6ZTogMTZcbn0pO1xudmFyIGdldEkxMjhEZWNvZGVyID0gKGNvbmZpZyA9IHt9KSA9PiBudW1iZXJEZWNvZGVyRmFjdG9yeSh7XG4gIGNvbmZpZyxcbiAgZ2V0OiAodmlldywgbGUpID0+IHtcbiAgICBjb25zdCBsZWZ0T2Zmc2V0ID0gbGUgPyA4IDogMDtcbiAgICBjb25zdCByaWdodE9mZnNldCA9IGxlID8gMCA6IDg7XG4gICAgY29uc3QgbGVmdCA9IHZpZXcuZ2V0QmlnSW50NjQobGVmdE9mZnNldCwgbGUpO1xuICAgIGNvbnN0IHJpZ2h0ID0gdmlldy5nZXRCaWdVaW50NjQocmlnaHRPZmZzZXQsIGxlKTtcbiAgICByZXR1cm4gKGxlZnQgPDwgNjRuKSArIHJpZ2h0O1xuICB9LFxuICBuYW1lOiBcImkxMjhcIixcbiAgc2l6ZTogMTZcbn0pO1xudmFyIGdldEkxMjhDb2RlYyA9IChjb25maWcgPSB7fSkgPT4gY29tYmluZUNvZGVjKGdldEkxMjhFbmNvZGVyKGNvbmZpZyksIGdldEkxMjhEZWNvZGVyKGNvbmZpZykpO1xudmFyIGdldEkxNkVuY29kZXIgPSAoY29uZmlnID0ge30pID0+IG51bWJlckVuY29kZXJGYWN0b3J5KHtcbiAgY29uZmlnLFxuICBuYW1lOiBcImkxNlwiLFxuICByYW5nZTogWy1OdW1iZXIoXCIweDdmZmZcIikgLSAxLCBOdW1iZXIoXCIweDdmZmZcIildLFxuICBzZXQ6ICh2aWV3LCB2YWx1ZSwgbGUpID0+IHZpZXcuc2V0SW50MTYoMCwgTnVtYmVyKHZhbHVlKSwgbGUpLFxuICBzaXplOiAyXG59KTtcbnZhciBnZXRJMTZEZWNvZGVyID0gKGNvbmZpZyA9IHt9KSA9PiBudW1iZXJEZWNvZGVyRmFjdG9yeSh7XG4gIGNvbmZpZyxcbiAgZ2V0OiAodmlldywgbGUpID0+IHZpZXcuZ2V0SW50MTYoMCwgbGUpLFxuICBuYW1lOiBcImkxNlwiLFxuICBzaXplOiAyXG59KTtcbnZhciBnZXRJMTZDb2RlYyA9IChjb25maWcgPSB7fSkgPT4gY29tYmluZUNvZGVjKGdldEkxNkVuY29kZXIoY29uZmlnKSwgZ2V0STE2RGVjb2Rlcihjb25maWcpKTtcbnZhciBnZXRJMzJFbmNvZGVyID0gKGNvbmZpZyA9IHt9KSA9PiBudW1iZXJFbmNvZGVyRmFjdG9yeSh7XG4gIGNvbmZpZyxcbiAgbmFtZTogXCJpMzJcIixcbiAgcmFuZ2U6IFstTnVtYmVyKFwiMHg3ZmZmZmZmZlwiKSAtIDEsIE51bWJlcihcIjB4N2ZmZmZmZmZcIildLFxuICBzZXQ6ICh2aWV3LCB2YWx1ZSwgbGUpID0+IHZpZXcuc2V0SW50MzIoMCwgTnVtYmVyKHZhbHVlKSwgbGUpLFxuICBzaXplOiA0XG59KTtcbnZhciBnZXRJMzJEZWNvZGVyID0gKGNvbmZpZyA9IHt9KSA9PiBudW1iZXJEZWNvZGVyRmFjdG9yeSh7XG4gIGNvbmZpZyxcbiAgZ2V0OiAodmlldywgbGUpID0+IHZpZXcuZ2V0SW50MzIoMCwgbGUpLFxuICBuYW1lOiBcImkzMlwiLFxuICBzaXplOiA0XG59KTtcbnZhciBnZXRJMzJDb2RlYyA9IChjb25maWcgPSB7fSkgPT4gY29tYmluZUNvZGVjKGdldEkzMkVuY29kZXIoY29uZmlnKSwgZ2V0STMyRGVjb2Rlcihjb25maWcpKTtcbnZhciBnZXRJNjRFbmNvZGVyID0gKGNvbmZpZyA9IHt9KSA9PiBudW1iZXJFbmNvZGVyRmFjdG9yeSh7XG4gIGNvbmZpZyxcbiAgbmFtZTogXCJpNjRcIixcbiAgcmFuZ2U6IFstQmlnSW50KFwiMHg3ZmZmZmZmZmZmZmZmZmZmXCIpIC0gMW4sIEJpZ0ludChcIjB4N2ZmZmZmZmZmZmZmZmZmZlwiKV0sXG4gIHNldDogKHZpZXcsIHZhbHVlLCBsZSkgPT4gdmlldy5zZXRCaWdJbnQ2NCgwLCBCaWdJbnQodmFsdWUpLCBsZSksXG4gIHNpemU6IDhcbn0pO1xudmFyIGdldEk2NERlY29kZXIgPSAoY29uZmlnID0ge30pID0+IG51bWJlckRlY29kZXJGYWN0b3J5KHtcbiAgY29uZmlnLFxuICBnZXQ6ICh2aWV3LCBsZSkgPT4gdmlldy5nZXRCaWdJbnQ2NCgwLCBsZSksXG4gIG5hbWU6IFwiaTY0XCIsXG4gIHNpemU6IDhcbn0pO1xudmFyIGdldEk2NENvZGVjID0gKGNvbmZpZyA9IHt9KSA9PiBjb21iaW5lQ29kZWMoZ2V0STY0RW5jb2Rlcihjb25maWcpLCBnZXRJNjREZWNvZGVyKGNvbmZpZykpO1xudmFyIGdldEk4RW5jb2RlciA9ICgpID0+IG51bWJlckVuY29kZXJGYWN0b3J5KHtcbiAgbmFtZTogXCJpOFwiLFxuICByYW5nZTogWy1OdW1iZXIoXCIweDdmXCIpIC0gMSwgTnVtYmVyKFwiMHg3ZlwiKV0sXG4gIHNldDogKHZpZXcsIHZhbHVlKSA9PiB2aWV3LnNldEludDgoMCwgTnVtYmVyKHZhbHVlKSksXG4gIHNpemU6IDFcbn0pO1xudmFyIGdldEk4RGVjb2RlciA9ICgpID0+IG51bWJlckRlY29kZXJGYWN0b3J5KHtcbiAgZ2V0OiAodmlldykgPT4gdmlldy5nZXRJbnQ4KDApLFxuICBuYW1lOiBcImk4XCIsXG4gIHNpemU6IDFcbn0pO1xudmFyIGdldEk4Q29kZWMgPSAoKSA9PiBjb21iaW5lQ29kZWMoZ2V0SThFbmNvZGVyKCksIGdldEk4RGVjb2RlcigpKTtcbnZhciBnZXRTaG9ydFUxNkVuY29kZXIgPSAoKSA9PiBjcmVhdGVFbmNvZGVyKHtcbiAgZ2V0U2l6ZUZyb21WYWx1ZTogKHZhbHVlKSA9PiB7XG4gICAgaWYgKHZhbHVlIDw9IDEyNykgcmV0dXJuIDE7XG4gICAgaWYgKHZhbHVlIDw9IDE2MzgzKSByZXR1cm4gMjtcbiAgICByZXR1cm4gMztcbiAgfSxcbiAgbWF4U2l6ZTogMyxcbiAgd3JpdGU6ICh2YWx1ZSwgYnl0ZXMsIG9mZnNldCkgPT4ge1xuICAgIGFzc2VydE51bWJlcklzQmV0d2VlbkZvckNvZGVjKFwic2hvcnRVMTZcIiwgMCwgNjU1MzUsIHZhbHVlKTtcbiAgICBjb25zdCBzaG9ydFUxNkJ5dGVzID0gWzBdO1xuICAgIGZvciAobGV0IGlpID0gMDsgOyBpaSArPSAxKSB7XG4gICAgICBjb25zdCBhbGlnbmVkVmFsdWUgPSBOdW1iZXIodmFsdWUpID4+IGlpICogNztcbiAgICAgIGlmIChhbGlnbmVkVmFsdWUgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXh0U2V2ZW5CaXRzID0gMTI3ICYgYWxpZ25lZFZhbHVlO1xuICAgICAgc2hvcnRVMTZCeXRlc1tpaV0gPSBuZXh0U2V2ZW5CaXRzO1xuICAgICAgaWYgKGlpID4gMCkge1xuICAgICAgICBzaG9ydFUxNkJ5dGVzW2lpIC0gMV0gfD0gMTI4O1xuICAgICAgfVxuICAgIH1cbiAgICBieXRlcy5zZXQoc2hvcnRVMTZCeXRlcywgb2Zmc2V0KTtcbiAgICByZXR1cm4gb2Zmc2V0ICsgc2hvcnRVMTZCeXRlcy5sZW5ndGg7XG4gIH1cbn0pO1xudmFyIGdldFNob3J0VTE2RGVjb2RlciA9ICgpID0+IGNyZWF0ZURlY29kZXIoe1xuICBtYXhTaXplOiAzLFxuICByZWFkOiAoYnl0ZXMsIG9mZnNldCkgPT4ge1xuICAgIGxldCB2YWx1ZSA9IDA7XG4gICAgbGV0IGJ5dGVDb3VudCA9IDA7XG4gICAgd2hpbGUgKCsrYnl0ZUNvdW50KSB7XG4gICAgICBjb25zdCBieXRlSW5kZXggPSBieXRlQ291bnQgLSAxO1xuICAgICAgY29uc3QgY3VycmVudEJ5dGUgPSBieXRlc1tvZmZzZXQgKyBieXRlSW5kZXhdO1xuICAgICAgY29uc3QgbmV4dFNldmVuQml0cyA9IDEyNyAmIGN1cnJlbnRCeXRlO1xuICAgICAgdmFsdWUgfD0gbmV4dFNldmVuQml0cyA8PCBieXRlSW5kZXggKiA3O1xuICAgICAgaWYgKChjdXJyZW50Qnl0ZSAmIDEyOCkgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbdmFsdWUsIG9mZnNldCArIGJ5dGVDb3VudF07XG4gIH1cbn0pO1xudmFyIGdldFNob3J0VTE2Q29kZWMgPSAoKSA9PiBjb21iaW5lQ29kZWMoZ2V0U2hvcnRVMTZFbmNvZGVyKCksIGdldFNob3J0VTE2RGVjb2RlcigpKTtcbnZhciBnZXRVMTI4RW5jb2RlciA9IChjb25maWcgPSB7fSkgPT4gbnVtYmVyRW5jb2RlckZhY3Rvcnkoe1xuICBjb25maWcsXG4gIG5hbWU6IFwidTEyOFwiLFxuICByYW5nZTogWzBuLCBCaWdJbnQoXCIweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmXCIpXSxcbiAgc2V0OiAodmlldywgdmFsdWUsIGxlKSA9PiB7XG4gICAgY29uc3QgbGVmdE9mZnNldCA9IGxlID8gOCA6IDA7XG4gICAgY29uc3QgcmlnaHRPZmZzZXQgPSBsZSA/IDAgOiA4O1xuICAgIGNvbnN0IHJpZ2h0TWFzayA9IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gICAgdmlldy5zZXRCaWdVaW50NjQobGVmdE9mZnNldCwgQmlnSW50KHZhbHVlKSA+PiA2NG4sIGxlKTtcbiAgICB2aWV3LnNldEJpZ1VpbnQ2NChyaWdodE9mZnNldCwgQmlnSW50KHZhbHVlKSAmIHJpZ2h0TWFzaywgbGUpO1xuICB9LFxuICBzaXplOiAxNlxufSk7XG52YXIgZ2V0VTEyOERlY29kZXIgPSAoY29uZmlnID0ge30pID0+IG51bWJlckRlY29kZXJGYWN0b3J5KHtcbiAgY29uZmlnLFxuICBnZXQ6ICh2aWV3LCBsZSkgPT4ge1xuICAgIGNvbnN0IGxlZnRPZmZzZXQgPSBsZSA/IDggOiAwO1xuICAgIGNvbnN0IHJpZ2h0T2Zmc2V0ID0gbGUgPyAwIDogODtcbiAgICBjb25zdCBsZWZ0ID0gdmlldy5nZXRCaWdVaW50NjQobGVmdE9mZnNldCwgbGUpO1xuICAgIGNvbnN0IHJpZ2h0ID0gdmlldy5nZXRCaWdVaW50NjQocmlnaHRPZmZzZXQsIGxlKTtcbiAgICByZXR1cm4gKGxlZnQgPDwgNjRuKSArIHJpZ2h0O1xuICB9LFxuICBuYW1lOiBcInUxMjhcIixcbiAgc2l6ZTogMTZcbn0pO1xudmFyIGdldFUxMjhDb2RlYyA9IChjb25maWcgPSB7fSkgPT4gY29tYmluZUNvZGVjKGdldFUxMjhFbmNvZGVyKGNvbmZpZyksIGdldFUxMjhEZWNvZGVyKGNvbmZpZykpO1xudmFyIGdldFUxNkVuY29kZXIgPSAoY29uZmlnID0ge30pID0+IG51bWJlckVuY29kZXJGYWN0b3J5KHtcbiAgY29uZmlnLFxuICBuYW1lOiBcInUxNlwiLFxuICByYW5nZTogWzAsIE51bWJlcihcIjB4ZmZmZlwiKV0sXG4gIHNldDogKHZpZXcsIHZhbHVlLCBsZSkgPT4gdmlldy5zZXRVaW50MTYoMCwgTnVtYmVyKHZhbHVlKSwgbGUpLFxuICBzaXplOiAyXG59KTtcbnZhciBnZXRVMTZEZWNvZGVyID0gKGNvbmZpZyA9IHt9KSA9PiBudW1iZXJEZWNvZGVyRmFjdG9yeSh7XG4gIGNvbmZpZyxcbiAgZ2V0OiAodmlldywgbGUpID0+IHZpZXcuZ2V0VWludDE2KDAsIGxlKSxcbiAgbmFtZTogXCJ1MTZcIixcbiAgc2l6ZTogMlxufSk7XG52YXIgZ2V0VTE2Q29kZWMgPSAoY29uZmlnID0ge30pID0+IGNvbWJpbmVDb2RlYyhnZXRVMTZFbmNvZGVyKGNvbmZpZyksIGdldFUxNkRlY29kZXIoY29uZmlnKSk7XG52YXIgZ2V0VTMyRW5jb2RlciA9IChjb25maWcgPSB7fSkgPT4gbnVtYmVyRW5jb2RlckZhY3Rvcnkoe1xuICBjb25maWcsXG4gIG5hbWU6IFwidTMyXCIsXG4gIHJhbmdlOiBbMCwgTnVtYmVyKFwiMHhmZmZmZmZmZlwiKV0sXG4gIHNldDogKHZpZXcsIHZhbHVlLCBsZSkgPT4gdmlldy5zZXRVaW50MzIoMCwgTnVtYmVyKHZhbHVlKSwgbGUpLFxuICBzaXplOiA0XG59KTtcbnZhciBnZXRVMzJEZWNvZGVyID0gKGNvbmZpZyA9IHt9KSA9PiBudW1iZXJEZWNvZGVyRmFjdG9yeSh7XG4gIGNvbmZpZyxcbiAgZ2V0OiAodmlldywgbGUpID0+IHZpZXcuZ2V0VWludDMyKDAsIGxlKSxcbiAgbmFtZTogXCJ1MzJcIixcbiAgc2l6ZTogNFxufSk7XG52YXIgZ2V0VTMyQ29kZWMgPSAoY29uZmlnID0ge30pID0+IGNvbWJpbmVDb2RlYyhnZXRVMzJFbmNvZGVyKGNvbmZpZyksIGdldFUzMkRlY29kZXIoY29uZmlnKSk7XG52YXIgZ2V0VTY0RW5jb2RlciA9IChjb25maWcgPSB7fSkgPT4gbnVtYmVyRW5jb2RlckZhY3Rvcnkoe1xuICBjb25maWcsXG4gIG5hbWU6IFwidTY0XCIsXG4gIHJhbmdlOiBbMG4sIEJpZ0ludChcIjB4ZmZmZmZmZmZmZmZmZmZmZlwiKV0sXG4gIHNldDogKHZpZXcsIHZhbHVlLCBsZSkgPT4gdmlldy5zZXRCaWdVaW50NjQoMCwgQmlnSW50KHZhbHVlKSwgbGUpLFxuICBzaXplOiA4XG59KTtcbnZhciBnZXRVNjREZWNvZGVyID0gKGNvbmZpZyA9IHt9KSA9PiBudW1iZXJEZWNvZGVyRmFjdG9yeSh7XG4gIGNvbmZpZyxcbiAgZ2V0OiAodmlldywgbGUpID0+IHZpZXcuZ2V0QmlnVWludDY0KDAsIGxlKSxcbiAgbmFtZTogXCJ1NjRcIixcbiAgc2l6ZTogOFxufSk7XG52YXIgZ2V0VTY0Q29kZWMgPSAoY29uZmlnID0ge30pID0+IGNvbWJpbmVDb2RlYyhnZXRVNjRFbmNvZGVyKGNvbmZpZyksIGdldFU2NERlY29kZXIoY29uZmlnKSk7XG52YXIgZ2V0VThFbmNvZGVyID0gKCkgPT4gbnVtYmVyRW5jb2RlckZhY3Rvcnkoe1xuICBuYW1lOiBcInU4XCIsXG4gIHJhbmdlOiBbMCwgTnVtYmVyKFwiMHhmZlwiKV0sXG4gIHNldDogKHZpZXcsIHZhbHVlKSA9PiB2aWV3LnNldFVpbnQ4KDAsIE51bWJlcih2YWx1ZSkpLFxuICBzaXplOiAxXG59KTtcbnZhciBnZXRVOERlY29kZXIgPSAoKSA9PiBudW1iZXJEZWNvZGVyRmFjdG9yeSh7XG4gIGdldDogKHZpZXcpID0+IHZpZXcuZ2V0VWludDgoMCksXG4gIG5hbWU6IFwidThcIixcbiAgc2l6ZTogMVxufSk7XG52YXIgZ2V0VThDb2RlYyA9ICgpID0+IGNvbWJpbmVDb2RlYyhnZXRVOEVuY29kZXIoKSwgZ2V0VThEZWNvZGVyKCkpO1xuXG5leHBvcnQgeyBFbmRpYW4sIGFzc2VydE51bWJlcklzQmV0d2VlbkZvckNvZGVjLCBnZXRGMzJDb2RlYywgZ2V0RjMyRGVjb2RlciwgZ2V0RjMyRW5jb2RlciwgZ2V0RjY0Q29kZWMsIGdldEY2NERlY29kZXIsIGdldEY2NEVuY29kZXIsIGdldEkxMjhDb2RlYywgZ2V0STEyOERlY29kZXIsIGdldEkxMjhFbmNvZGVyLCBnZXRJMTZDb2RlYywgZ2V0STE2RGVjb2RlciwgZ2V0STE2RW5jb2RlciwgZ2V0STMyQ29kZWMsIGdldEkzMkRlY29kZXIsIGdldEkzMkVuY29kZXIsIGdldEk2NENvZGVjLCBnZXRJNjREZWNvZGVyLCBnZXRJNjRFbmNvZGVyLCBnZXRJOENvZGVjLCBnZXRJOERlY29kZXIsIGdldEk4RW5jb2RlciwgZ2V0U2hvcnRVMTZDb2RlYywgZ2V0U2hvcnRVMTZEZWNvZGVyLCBnZXRTaG9ydFUxNkVuY29kZXIsIGdldFUxMjhDb2RlYywgZ2V0VTEyOERlY29kZXIsIGdldFUxMjhFbmNvZGVyLCBnZXRVMTZDb2RlYywgZ2V0VTE2RGVjb2RlciwgZ2V0VTE2RW5jb2RlciwgZ2V0VTMyQ29kZWMsIGdldFUzMkRlY29kZXIsIGdldFUzMkVuY29kZXIsIGdldFU2NENvZGVjLCBnZXRVNjREZWNvZGVyLCBnZXRVNjRFbmNvZGVyLCBnZXRVOENvZGVjLCBnZXRVOERlY29kZXIsIGdldFU4RW5jb2RlciB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguYnJvd3Nlci5tanMubWFwXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5icm93c2VyLm1qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@solana/codecs-numbers/dist/index.browser.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@solana/errors/dist/index.browser.mjs":
/*!************************************************************!*\
  !*** ./node_modules/@solana/errors/dist/index.browser.mjs ***!
  \************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND: () => (/* binding */ SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND),\n/* harmony export */   SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED: () => (/* binding */ SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED),\n/* harmony export */   SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT: () => (/* binding */ SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT),\n/* harmony export */   SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT: () => (/* binding */ SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT),\n/* harmony export */   SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND: () => (/* binding */ SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED: () => (/* binding */ SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS: () => (/* binding */ SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH: () => (/* binding */ SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY: () => (/* binding */ SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS: () => (/* binding */ SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE: () => (/* binding */ SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__MALFORMED_PDA: () => (/* binding */ SOLANA_ERROR__ADDRESSES__MALFORMED_PDA),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED: () => (/* binding */ SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED: () => (/* binding */ SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER: () => (/* binding */ SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER),\n/* harmony export */   SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED: () => (/* binding */ SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED),\n/* harmony export */   SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY: () => (/* binding */ SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY),\n/* harmony export */   SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS: () => (/* binding */ SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS),\n/* harmony export */   SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL: () => (/* binding */ SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL),\n/* harmony export */   SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH: () => (/* binding */ SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH),\n/* harmony export */   SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH: () => (/* binding */ SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH),\n/* harmony export */   SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH: () => (/* binding */ SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH),\n/* harmony export */   SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH: () => (/* binding */ SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH),\n/* harmony export */   SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH: () => (/* binding */ SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH),\n/* harmony export */   SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH: () => (/* binding */ SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH),\n/* harmony export */   SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE: () => (/* binding */ SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE),\n/* harmony export */   SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH: () => (/* binding */ SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH),\n/* harmony export */   SOLANA_ERROR__CODECS__INVALID_CONSTANT: () => (/* binding */ SOLANA_ERROR__CODECS__INVALID_CONSTANT),\n/* harmony export */   SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT: () => (/* binding */ SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT),\n/* harmony export */   SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT: () => (/* binding */ SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT),\n/* harmony export */   SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT: () => (/* binding */ SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT),\n/* harmony export */   SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS: () => (/* binding */ SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS),\n/* harmony export */   SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE: () => (/* binding */ SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE),\n/* harmony export */   SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES: () => (/* binding */ SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES),\n/* harmony export */   SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED: () => (/* binding */ SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR: () => (/* binding */ SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS: () => (/* binding */ SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA: () => (/* binding */ SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA),\n/* harmony export */   SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH: () => (/* binding */ SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH),\n/* harmony export */   SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH: () => (/* binding */ SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH),\n/* harmony export */   SOLANA_ERROR__INVALID_NONCE: () => (/* binding */ SOLANA_ERROR__INVALID_NONCE),\n/* harmony export */   SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING: () => (/* binding */ SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING),\n/* harmony export */   SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED: () => (/* binding */ SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED),\n/* harmony export */   SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE: () => (/* binding */ SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE),\n/* harmony export */   SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING: () => (/* binding */ SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING),\n/* harmony export */   SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE: () => (/* binding */ SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR: () => (/* binding */ SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__INVALID_PARAMS: () => (/* binding */ SOLANA_ERROR__JSON_RPC__INVALID_PARAMS),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__INVALID_REQUEST: () => (/* binding */ SOLANA_ERROR__JSON_RPC__INVALID_REQUEST),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND: () => (/* binding */ SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__PARSE_ERROR: () => (/* binding */ SOLANA_ERROR__JSON_RPC__PARSE_ERROR),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SCAN_ERROR: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SCAN_ERROR),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE),\n/* harmony export */   SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION: () => (/* binding */ SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION),\n/* harmony export */   SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH: () => (/* binding */ SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH),\n/* harmony export */   SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH: () => (/* binding */ SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH),\n/* harmony export */   SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH: () => (/* binding */ SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH),\n/* harmony export */   SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY: () => (/* binding */ SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY),\n/* harmony export */   SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__MALFORMED_BIGINT_STRING: () => (/* binding */ SOLANA_ERROR__MALFORMED_BIGINT_STRING),\n/* harmony export */   SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR: () => (/* binding */ SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR),\n/* harmony export */   SOLANA_ERROR__MALFORMED_NUMBER_STRING: () => (/* binding */ SOLANA_ERROR__MALFORMED_NUMBER_STRING),\n/* harmony export */   SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND: () => (/* binding */ SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND),\n/* harmony export */   SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN: () => (/* binding */ SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN),\n/* harmony export */   SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED: () => (/* binding */ SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED),\n/* harmony export */   SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED: () => (/* binding */ SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED),\n/* harmony export */   SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT: () => (/* binding */ SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT),\n/* harmony export */   SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID: () => (/* binding */ SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID),\n/* harmony export */   SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD: () => (/* binding */ SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD),\n/* harmony export */   SOLANA_ERROR__RPC__INTEGER_OVERFLOW: () => (/* binding */ SOLANA_ERROR__RPC__INTEGER_OVERFLOW),\n/* harmony export */   SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR: () => (/* binding */ SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR),\n/* harmony export */   SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN: () => (/* binding */ SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN),\n/* harmony export */   SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS: () => (/* binding */ SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS),\n/* harmony export */   SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER: () => (/* binding */ SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER),\n/* harmony export */   SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER: () => (/* binding */ SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER),\n/* harmony export */   SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER: () => (/* binding */ SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER),\n/* harmony export */   SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER: () => (/* binding */ SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER),\n/* harmony export */   SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER: () => (/* binding */ SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER),\n/* harmony export */   SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER: () => (/* binding */ SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER),\n/* harmony export */   SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER: () => (/* binding */ SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER),\n/* harmony export */   SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER: () => (/* binding */ SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER),\n/* harmony export */   SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS: () => (/* binding */ SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS),\n/* harmony export */   SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING: () => (/* binding */ SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING),\n/* harmony export */   SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED: () => (/* binding */ SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED),\n/* harmony export */   SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY: () => (/* binding */ SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY),\n/* harmony export */   SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED: () => (/* binding */ SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED),\n/* harmony export */   SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT: () => (/* binding */ SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT),\n/* harmony export */   SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED: () => (/* binding */ SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED),\n/* harmony export */   SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED: () => (/* binding */ SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED),\n/* harmony export */   SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED: () => (/* binding */ SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED),\n/* harmony export */   SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED: () => (/* binding */ SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED),\n/* harmony export */   SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED: () => (/* binding */ SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED),\n/* harmony export */   SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT: () => (/* binding */ SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION: () => (/* binding */ SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING: () => (/* binding */ SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES: () => (/* binding */ SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT: () => (/* binding */ SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME: () => (/* binding */ SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME: () => (/* binding */ SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING: () => (/* binding */ SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING: () => (/* binding */ SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND: () => (/* binding */ SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT: () => (/* binding */ SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT: () => (/* binding */ SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING: () => (/* binding */ SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING: () => (/* binding */ SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE: () => (/* binding */ SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING: () => (/* binding */ SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES: () => (/* binding */ SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE: () => (/* binding */ SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH: () => (/* binding */ SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING: () => (/* binding */ SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING),\n/* harmony export */   SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE: () => (/* binding */ SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE),\n/* harmony export */   SolanaError: () => (/* binding */ SolanaError),\n/* harmony export */   getSolanaErrorFromInstructionError: () => (/* binding */ getSolanaErrorFromInstructionError),\n/* harmony export */   getSolanaErrorFromJsonRpcError: () => (/* binding */ getSolanaErrorFromJsonRpcError),\n/* harmony export */   getSolanaErrorFromTransactionError: () => (/* binding */ getSolanaErrorFromTransactionError),\n/* harmony export */   isSolanaError: () => (/* binding */ isSolanaError),\n/* harmony export */   safeCaptureStackTrace: () => (/* binding */ safeCaptureStackTrace)\n/* harmony export */ });\n// src/codes.ts\nvar SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED = 1;\nvar SOLANA_ERROR__INVALID_NONCE = 2;\nvar SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND = 3;\nvar SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE = 4;\nvar SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH = 5;\nvar SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE = 6;\nvar SOLANA_ERROR__MALFORMED_BIGINT_STRING = 7;\nvar SOLANA_ERROR__MALFORMED_NUMBER_STRING = 8;\nvar SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE = 9;\nvar SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR = 10;\nvar SOLANA_ERROR__JSON_RPC__PARSE_ERROR = -32700;\nvar SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR = -32603;\nvar SOLANA_ERROR__JSON_RPC__INVALID_PARAMS = -32602;\nvar SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND = -32601;\nvar SOLANA_ERROR__JSON_RPC__INVALID_REQUEST = -32600;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED = -32016;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION = -32015;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET = -32014;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH = -32013;\nvar SOLANA_ERROR__JSON_RPC__SCAN_ERROR = -32012;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE = -32011;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX = -32010;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED = -32009;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT = -32008;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED = -32007;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE = -32006;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY = -32005;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE = -32004;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE = -32003;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE = -32002;\nvar SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP = -32001;\nvar SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH = 28e5;\nvar SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE = 2800001;\nvar SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS = 2800002;\nvar SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY = 2800003;\nvar SOLANA_ERROR__ADDRESSES__MALFORMED_PDA = 2800004;\nvar SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE = 2800005;\nvar SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED = 2800006;\nvar SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED = 2800007;\nvar SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE = 2800008;\nvar SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED = 2800009;\nvar SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER = 2800010;\nvar SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS = 2800011;\nvar SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND = 323e4;\nvar SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND = 32300001;\nvar SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT = 3230002;\nvar SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT = 3230003;\nvar SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED = 3230004;\nvar SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT = 361e4;\nvar SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED = 3610001;\nvar SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED = 3610002;\nvar SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED = 3610003;\nvar SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED = 3610004;\nvar SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED = 3610005;\nvar SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED = 3610006;\nvar SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY = 3610007;\nvar SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED = 3611e3;\nvar SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH = 3704e3;\nvar SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH = 3704001;\nvar SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH = 3704002;\nvar SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE = 3704003;\nvar SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY = 3704004;\nvar SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS = 4128e3;\nvar SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA = 4128001;\nvar SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH = 4128002;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN = 4615e3;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR = 4615001;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT = 4615002;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA = 4615003;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA = 4615004;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL = 4615005;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS = 4615006;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID = 4615007;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE = 4615008;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED = 4615009;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT = 4615010;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION = 4615011;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID = 4615012;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND = 4615013;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED = 4615014;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE = 4615015;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED = 4615016;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX = 4615017;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED = 4615018;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED = 4615019;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS = 4615020;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED = 4615021;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE = 4615022;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED = 4615023;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING = 4615024;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC = 4615025;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM = 4615026;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR = 4615027;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED = 4615028;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE = 4615029;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT = 4615030;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID = 4615031;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH = 4615032;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT = 4615033;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED = 4615034;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED = 4615035;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS = 4615036;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC = 4615037;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED = 4615038;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION = 4615039;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE = 4615040;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE = 4615041;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE = 4615042;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE = 4615043;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY = 4615044;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR = 4615045;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT = 4615046;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER = 4615047;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW = 4615048;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR = 4615049;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER = 4615050;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED = 4615051;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED = 4615052;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED = 4615053;\nvar SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS = 4615054;\nvar SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS = 5508e3;\nvar SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER = 5508001;\nvar SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER = 5508002;\nvar SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER = 5508003;\nvar SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER = 5508004;\nvar SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER = 5508005;\nvar SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER = 5508006;\nvar SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER = 5508007;\nvar SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER = 5508008;\nvar SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS = 5508009;\nvar SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING = 5508010;\nvar SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED = 5508011;\nvar SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES = 5663e3;\nvar SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE = 5663001;\nvar SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME = 5663002;\nvar SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME = 5663003;\nvar SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE = 5663004;\nvar SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING = 5663005;\nvar SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE = 5663006;\nvar SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND = 5663007;\nvar SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING = 5663008;\nvar SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING = 5663009;\nvar SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING = 5663010;\nvar SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING = 5663011;\nvar SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING = 5663012;\nvar SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING = 5663013;\nvar SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE = 5663014;\nvar SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION = 5663015;\nvar SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES = 5663016;\nvar SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH = 5663017;\nvar SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT = 5663018;\nvar SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT = 5663019;\nvar SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT = 5663020;\nvar SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN = 705e4;\nvar SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE = 7050001;\nvar SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE = 7050002;\nvar SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND = 7050003;\nvar SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND = 7050004;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE = 7050005;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE = 7050006;\nvar SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED = 7050007;\nvar SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND = 7050008;\nvar SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP = 7050009;\nvar SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE = 7050010;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX = 7050011;\nvar SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE = 7050012;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION = 7050013;\nvar SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE = 7050014;\nvar SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE = 7050015;\nvar SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING = 7050016;\nvar SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT = 7050017;\nvar SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION = 7050018;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT = 7050019;\nvar SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT = 7050020;\nvar SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT = 7050021;\nvar SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS = 7050022;\nvar SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND = 7050023;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER = 7050024;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA = 7050025;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX = 7050026;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT = 7050027;\nvar SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT = 7050028;\nvar SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT = 7050029;\nvar SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION = 7050030;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT = 7050031;\nvar SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED = 7050032;\nvar SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT = 7050033;\nvar SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED = 7050034;\nvar SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED = 7050035;\nvar SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION = 7050036;\nvar SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY = 8078e3;\nvar SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH = 8078001;\nvar SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH = 8078002;\nvar SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH = 8078003;\nvar SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH = 8078004;\nvar SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH = 8078005;\nvar SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH = 8078006;\nvar SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS = 8078007;\nvar SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE = 8078008;\nvar SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT = 8078009;\nvar SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT = 8078010;\nvar SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE = 8078011;\nvar SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE = 8078012;\nvar SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH = 8078013;\nvar SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE = 8078014;\nvar SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT = 8078015;\nvar SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE = 8078016;\nvar SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE = 8078017;\nvar SOLANA_ERROR__CODECS__INVALID_CONSTANT = 8078018;\nvar SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE = 8078019;\nvar SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL = 8078020;\nvar SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES = 8078021;\nvar SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS = 8078022;\nvar SOLANA_ERROR__RPC__INTEGER_OVERFLOW = 81e5;\nvar SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN = 8100001;\nvar SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR = 8100002;\nvar SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD = 8100003;\nvar SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN = 819e4;\nvar SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID = 8190001;\nvar SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED = 8190002;\nvar SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED = 8190003;\nvar SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT = 8190004;\nvar SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING = 99e5;\nvar SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE = 9900001;\nvar SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING = 9900002;\nvar SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE = 9900003;\nvar SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED = 9900004;\n\n// src/context.ts\nfunction encodeValue(value) {\n  if (Array.isArray(value)) {\n    const commaSeparatedValues = value.map(encodeValue).join(\n      \"%2C%20\"\n      /* \", \" */\n    );\n    return \"%5B\" + commaSeparatedValues + /* \"]\" */\n    \"%5D\";\n  } else if (typeof value === \"bigint\") {\n    return `${value}n`;\n  } else {\n    return encodeURIComponent(\n      String(\n        value != null && Object.getPrototypeOf(value) === null ? (\n          // Plain objects with no prototype don't have a `toString` method.\n          // Convert them before stringifying them.\n          { ...value }\n        ) : value\n      )\n    );\n  }\n}\nfunction encodeObjectContextEntry([key, value]) {\n  return `${key}=${encodeValue(value)}`;\n}\nfunction encodeContextObject(context) {\n  const searchParamsString = Object.entries(context).map(encodeObjectContextEntry).join(\"&\");\n  return btoa(searchParamsString);\n}\n\n// src/messages.ts\nvar SolanaErrorMessages = {\n  [SOLANA_ERROR__ACCOUNTS__ACCOUNT_NOT_FOUND]: \"Account not found at address: $address\",\n  [SOLANA_ERROR__ACCOUNTS__EXPECTED_ALL_ACCOUNTS_TO_BE_DECODED]: \"Not all accounts were decoded. Encoded accounts found at addresses: $addresses.\",\n  [SOLANA_ERROR__ACCOUNTS__EXPECTED_DECODED_ACCOUNT]: \"Expected decoded account at address: $address\",\n  [SOLANA_ERROR__ACCOUNTS__FAILED_TO_DECODE_ACCOUNT]: \"Failed to decode account data at address: $address\",\n  [SOLANA_ERROR__ACCOUNTS__ONE_OR_MORE_ACCOUNTS_NOT_FOUND]: \"Accounts not found at addresses: $addresses\",\n  [SOLANA_ERROR__ADDRESSES__FAILED_TO_FIND_VIABLE_PDA_BUMP_SEED]: \"Unable to find a viable program address bump seed.\",\n  [SOLANA_ERROR__ADDRESSES__INVALID_BASE58_ENCODED_ADDRESS]: \"$putativeAddress is not a base58-encoded address.\",\n  [SOLANA_ERROR__ADDRESSES__INVALID_BYTE_LENGTH]: \"Expected base58 encoded address to decode to a byte array of length 32. Actual length: $actualLength.\",\n  [SOLANA_ERROR__ADDRESSES__INVALID_ED25519_PUBLIC_KEY]: \"The `CryptoKey` must be an `Ed25519` public key.\",\n  [SOLANA_ERROR__ADDRESSES__INVALID_OFF_CURVE_ADDRESS]: \"$putativeOffCurveAddress is not a base58-encoded off-curve address.\",\n  [SOLANA_ERROR__ADDRESSES__INVALID_SEEDS_POINT_ON_CURVE]: \"Invalid seeds; point must fall off the Ed25519 curve.\",\n  [SOLANA_ERROR__ADDRESSES__MALFORMED_PDA]: \"Expected given program derived address to have the following format: [Address, ProgramDerivedAddressBump].\",\n  [SOLANA_ERROR__ADDRESSES__MAX_NUMBER_OF_PDA_SEEDS_EXCEEDED]: \"A maximum of $maxSeeds seeds, including the bump seed, may be supplied when creating an address. Received: $actual.\",\n  [SOLANA_ERROR__ADDRESSES__MAX_PDA_SEED_LENGTH_EXCEEDED]: \"The seed at index $index with length $actual exceeds the maximum length of $maxSeedLength bytes.\",\n  [SOLANA_ERROR__ADDRESSES__PDA_BUMP_SEED_OUT_OF_RANGE]: \"Expected program derived address bump to be in the range [0, 255], got: $bump.\",\n  [SOLANA_ERROR__ADDRESSES__PDA_ENDS_WITH_PDA_MARKER]: \"Program address cannot end with PDA marker.\",\n  [SOLANA_ERROR__ADDRESSES__STRING_LENGTH_OUT_OF_RANGE]: \"Expected base58-encoded address string of length in the range [32, 44]. Actual length: $actualLength.\",\n  [SOLANA_ERROR__BLOCKHASH_STRING_LENGTH_OUT_OF_RANGE]: \"Expected base58-encoded blockash string of length in the range [32, 44]. Actual length: $actualLength.\",\n  [SOLANA_ERROR__BLOCK_HEIGHT_EXCEEDED]: \"The network has progressed past the last block for which this transaction could have been committed.\",\n  [SOLANA_ERROR__CODECS__CANNOT_DECODE_EMPTY_BYTE_ARRAY]: \"Codec [$codecDescription] cannot decode empty byte arrays.\",\n  [SOLANA_ERROR__CODECS__CANNOT_USE_LEXICAL_VALUES_AS_ENUM_DISCRIMINATORS]: \"Enum codec cannot use lexical values [$stringValues] as discriminators. Either remove all lexical values or set `useValuesAsDiscriminators` to `false`.\",\n  [SOLANA_ERROR__CODECS__ENCODED_BYTES_MUST_NOT_INCLUDE_SENTINEL]: \"Sentinel [$hexSentinel] must not be present in encoded bytes [$hexEncodedBytes].\",\n  [SOLANA_ERROR__CODECS__ENCODER_DECODER_FIXED_SIZE_MISMATCH]: \"Encoder and decoder must have the same fixed size, got [$encoderFixedSize] and [$decoderFixedSize].\",\n  [SOLANA_ERROR__CODECS__ENCODER_DECODER_MAX_SIZE_MISMATCH]: \"Encoder and decoder must have the same max size, got [$encoderMaxSize] and [$decoderMaxSize].\",\n  [SOLANA_ERROR__CODECS__ENCODER_DECODER_SIZE_COMPATIBILITY_MISMATCH]: \"Encoder and decoder must either both be fixed-size or variable-size.\",\n  [SOLANA_ERROR__CODECS__ENUM_DISCRIMINATOR_OUT_OF_RANGE]: \"Enum discriminator out of range. Expected a number in [$formattedValidDiscriminators], got $discriminator.\",\n  [SOLANA_ERROR__CODECS__EXPECTED_FIXED_LENGTH]: \"Expected a fixed-size codec, got a variable-size one.\",\n  [SOLANA_ERROR__CODECS__EXPECTED_POSITIVE_BYTE_LENGTH]: \"Codec [$codecDescription] expected a positive byte length, got $bytesLength.\",\n  [SOLANA_ERROR__CODECS__EXPECTED_VARIABLE_LENGTH]: \"Expected a variable-size codec, got a fixed-size one.\",\n  [SOLANA_ERROR__CODECS__EXPECTED_ZERO_VALUE_TO_MATCH_ITEM_FIXED_SIZE]: \"Codec [$codecDescription] expected zero-value [$hexZeroValue] to have the same size as the provided fixed-size item [$expectedSize bytes].\",\n  [SOLANA_ERROR__CODECS__INVALID_BYTE_LENGTH]: \"Codec [$codecDescription] expected $expected bytes, got $bytesLength.\",\n  [SOLANA_ERROR__CODECS__INVALID_CONSTANT]: \"Expected byte array constant [$hexConstant] to be present in data [$hexData] at offset [$offset].\",\n  [SOLANA_ERROR__CODECS__INVALID_DISCRIMINATED_UNION_VARIANT]: \"Invalid discriminated union variant. Expected one of [$variants], got $value.\",\n  [SOLANA_ERROR__CODECS__INVALID_ENUM_VARIANT]: \"Invalid enum variant. Expected one of [$stringValues] or a number in [$formattedNumericalValues], got $variant.\",\n  [SOLANA_ERROR__CODECS__INVALID_LITERAL_UNION_VARIANT]: \"Invalid literal union variant. Expected one of [$variants], got $value.\",\n  [SOLANA_ERROR__CODECS__INVALID_NUMBER_OF_ITEMS]: \"Expected [$codecDescription] to have $expected items, got $actual.\",\n  [SOLANA_ERROR__CODECS__INVALID_STRING_FOR_BASE]: \"Invalid value $value for base $base with alphabet $alphabet.\",\n  [SOLANA_ERROR__CODECS__LITERAL_UNION_DISCRIMINATOR_OUT_OF_RANGE]: \"Literal union discriminator out of range. Expected a number between $minRange and $maxRange, got $discriminator.\",\n  [SOLANA_ERROR__CODECS__NUMBER_OUT_OF_RANGE]: \"Codec [$codecDescription] expected number to be in the range [$min, $max], got $value.\",\n  [SOLANA_ERROR__CODECS__OFFSET_OUT_OF_RANGE]: \"Codec [$codecDescription] expected offset to be in the range [0, $bytesLength], got $offset.\",\n  [SOLANA_ERROR__CODECS__SENTINEL_MISSING_IN_DECODED_BYTES]: \"Expected sentinel [$hexSentinel] to be present in decoded bytes [$hexDecodedBytes].\",\n  [SOLANA_ERROR__CODECS__UNION_VARIANT_OUT_OF_RANGE]: \"Union variant out of range. Expected an index between $minRange and $maxRange, got $variant.\",\n  [SOLANA_ERROR__CRYPTO__RANDOM_VALUES_FUNCTION_UNIMPLEMENTED]: \"No random values implementation could be found.\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_ALREADY_INITIALIZED]: \"instruction requires an uninitialized account\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_FAILED]: \"instruction tries to borrow reference for an account which is already borrowed\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_BORROW_OUTSTANDING]: \"instruction left account with an outstanding borrowed reference\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_SIZE_CHANGED]: \"program other than the account's owner changed the size of the account data\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_DATA_TOO_SMALL]: \"account data too small for instruction\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_EXECUTABLE]: \"instruction expected an executable account\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__ACCOUNT_NOT_RENT_EXEMPT]: \"An account does not have enough lamports to be rent-exempt\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__ARITHMETIC_OVERFLOW]: \"Program arithmetic overflowed\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR]: \"Failed to serialize or deserialize account data: $encodedData\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__BUILTIN_PROGRAMS_MUST_CONSUME_COMPUTE_UNITS]: \"Builtin programs must consume compute units\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__CALL_DEPTH]: \"Cross-program invocation call depth too deep\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__COMPUTATIONAL_BUDGET_EXCEEDED]: \"Computational budget exceeded\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM]: \"custom program error: #$code\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_INDEX]: \"instruction contains duplicate accounts\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__DUPLICATE_ACCOUNT_OUT_OF_SYNC]: \"instruction modifications of multiply-passed account differ\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_ACCOUNT_NOT_RENT_EXEMPT]: \"executable accounts must be rent exempt\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_DATA_MODIFIED]: \"instruction changed executable accounts data\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_LAMPORT_CHANGE]: \"instruction changed the balance of an executable account\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__EXECUTABLE_MODIFIED]: \"instruction changed executable bit of an account\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_DATA_MODIFIED]: \"instruction modified data of an account it does not own\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__EXTERNAL_ACCOUNT_LAMPORT_SPEND]: \"instruction spent from the balance of an account it does not own\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__GENERIC_ERROR]: \"generic instruction error\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__ILLEGAL_OWNER]: \"Provided owner is not allowed\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__IMMUTABLE]: \"Account is immutable\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_AUTHORITY]: \"Incorrect authority provided\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__INCORRECT_PROGRAM_ID]: \"incorrect program id for instruction\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__INSUFFICIENT_FUNDS]: \"insufficient funds for instruction\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_DATA]: \"invalid account data for instruction\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ACCOUNT_OWNER]: \"Invalid account owner\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ARGUMENT]: \"invalid program argument\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_ERROR]: \"program returned invalid error code\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_INSTRUCTION_DATA]: \"invalid instruction data\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_REALLOC]: \"Failed to reallocate account data\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__INVALID_SEEDS]: \"Provided seeds do not result in a valid address\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_DATA_ALLOCATIONS_EXCEEDED]: \"Accounts data allocations exceeded the maximum allowed per transaction\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_ACCOUNTS_EXCEEDED]: \"Max accounts exceeded\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_INSTRUCTION_TRACE_LENGTH_EXCEEDED]: \"Max instruction trace length exceeded\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__MAX_SEED_LENGTH_EXCEEDED]: \"Length of the seed is too long for address generation\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_ACCOUNT]: \"An account required by the instruction is missing\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__MISSING_REQUIRED_SIGNATURE]: \"missing required signature for instruction\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__MODIFIED_PROGRAM_ID]: \"instruction illegally modified the program id of an account\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__NOT_ENOUGH_ACCOUNT_KEYS]: \"insufficient account keys for instruction\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__PRIVILEGE_ESCALATION]: \"Cross-program invocation with unauthorized signer or writable account\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_ENVIRONMENT_SETUP_FAILURE]: \"Failed to create program execution environment\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPILE]: \"Program failed to compile\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__PROGRAM_FAILED_TO_COMPLETE]: \"Program failed to complete\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_DATA_MODIFIED]: \"instruction modified data of a read-only account\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__READONLY_LAMPORT_CHANGE]: \"instruction changed the balance of a read-only account\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__REENTRANCY_NOT_ALLOWED]: \"Cross-program invocation reentrancy not allowed for this instruction\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__RENT_EPOCH_MODIFIED]: \"instruction modified rent epoch of an account\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__UNBALANCED_INSTRUCTION]: \"sum of account balances before and after instruction do not match\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__UNINITIALIZED_ACCOUNT]: \"instruction requires an initialized account\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN]: \"\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_PROGRAM_ID]: \"Unsupported program id\",\n  [SOLANA_ERROR__INSTRUCTION_ERROR__UNSUPPORTED_SYSVAR]: \"Unsupported sysvar\",\n  [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_ACCOUNTS]: \"The instruction does not have any accounts.\",\n  [SOLANA_ERROR__INSTRUCTION__EXPECTED_TO_HAVE_DATA]: \"The instruction does not have any data.\",\n  [SOLANA_ERROR__INSTRUCTION__PROGRAM_ID_MISMATCH]: \"Expected instruction to have progress address $expectedProgramAddress, got $actualProgramAddress.\",\n  [SOLANA_ERROR__INVALID_BLOCKHASH_BYTE_LENGTH]: \"Expected base58 encoded blockhash to decode to a byte array of length 32. Actual length: $actualLength.\",\n  [SOLANA_ERROR__INVALID_NONCE]: \"The nonce `$expectedNonceValue` is no longer valid. It has advanced to `$actualNonceValue`\",\n  [SOLANA_ERROR__INVARIANT_VIOLATION__CACHED_ABORTABLE_ITERABLE_CACHE_ENTRY_MISSING]: \"Invariant violation: Found no abortable iterable cache entry for key `$cacheKey`. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant\",\n  [SOLANA_ERROR__INVARIANT_VIOLATION__DATA_PUBLISHER_CHANNEL_UNIMPLEMENTED]: \"Invariant violation: This data publisher does not publish to the channel named `$channelName`. Supported channels include $supportedChannelNames.\",\n  [SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_MUST_NOT_POLL_BEFORE_RESOLVING_EXISTING_MESSAGE_PROMISE]: \"Invariant violation: WebSocket message iterator state is corrupt; iterated without first resolving existing message promise. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant\",\n  [SOLANA_ERROR__INVARIANT_VIOLATION__SUBSCRIPTION_ITERATOR_STATE_MISSING]: \"Invariant violation: WebSocket message iterator is missing state storage. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant\",\n  [SOLANA_ERROR__INVARIANT_VIOLATION__SWITCH_MUST_BE_EXHAUSTIVE]: \"Invariant violation: Switch statement non-exhaustive. Received unexpected value `$unexpectedValue`. It should be impossible to hit this error; please file an issue at https://sola.na/web3invariant\",\n  [SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR]: \"JSON-RPC error: Internal JSON-RPC error ($__serverMessage)\",\n  [SOLANA_ERROR__JSON_RPC__INVALID_PARAMS]: \"JSON-RPC error: Invalid method parameter(s) ($__serverMessage)\",\n  [SOLANA_ERROR__JSON_RPC__INVALID_REQUEST]: \"JSON-RPC error: The JSON sent is not a valid `Request` object ($__serverMessage)\",\n  [SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND]: \"JSON-RPC error: The method does not exist / is not available ($__serverMessage)\",\n  [SOLANA_ERROR__JSON_RPC__PARSE_ERROR]: \"JSON-RPC error: An error occurred on the server while parsing the JSON text ($__serverMessage)\",\n  [SOLANA_ERROR__JSON_RPC__SCAN_ERROR]: \"$__serverMessage\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP]: \"$__serverMessage\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE]: \"$__serverMessage\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET]: \"$__serverMessage\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX]: \"$__serverMessage\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED]: \"$__serverMessage\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED]: \"Minimum context slot has not been reached\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NODE_UNHEALTHY]: \"Node is unhealthy; behind by $numSlotsBehind slots\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_NO_SNAPSHOT]: \"No snapshot\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE]: \"Transaction simulation failed\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED]: \"$__serverMessage\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE]: \"Transaction history is not available from this node\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE]: \"$__serverMessage\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH]: \"Transaction signature length mismatch\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE]: \"Transaction signature verification failure\",\n  [SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION]: \"$__serverMessage\",\n  [SOLANA_ERROR__KEYS__INVALID_KEY_PAIR_BYTE_LENGTH]: \"Key pair bytes must be of length 64, got $byteLength.\",\n  [SOLANA_ERROR__KEYS__INVALID_PRIVATE_KEY_BYTE_LENGTH]: \"Expected private key bytes with length 32. Actual length: $actualLength.\",\n  [SOLANA_ERROR__KEYS__INVALID_SIGNATURE_BYTE_LENGTH]: \"Expected base58-encoded signature to decode to a byte array of length 64. Actual length: $actualLength.\",\n  [SOLANA_ERROR__KEYS__PUBLIC_KEY_MUST_MATCH_PRIVATE_KEY]: \"The provided private key does not match the provided public key.\",\n  [SOLANA_ERROR__KEYS__SIGNATURE_STRING_LENGTH_OUT_OF_RANGE]: \"Expected base58-encoded signature string of length in the range [64, 88]. Actual length: $actualLength.\",\n  [SOLANA_ERROR__LAMPORTS_OUT_OF_RANGE]: \"Lamports value must be in the range [0, 2e64-1]\",\n  [SOLANA_ERROR__MALFORMED_BIGINT_STRING]: \"`$value` cannot be parsed as a `BigInt`\",\n  [SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR]: \"$message\",\n  [SOLANA_ERROR__MALFORMED_NUMBER_STRING]: \"`$value` cannot be parsed as a `Number`\",\n  [SOLANA_ERROR__NONCE_ACCOUNT_NOT_FOUND]: \"No nonce account could be found at address `$nonceAccountAddress`\",\n  [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CANNOT_CREATE_SUBSCRIPTION_PLAN]: \"The notification name must end in 'Notifications' and the API must supply a subscription plan creator function for the notification '$notificationName'.\",\n  [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CLOSED_BEFORE_MESSAGE_BUFFERED]: \"WebSocket was closed before payload could be added to the send buffer\",\n  [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_CONNECTION_CLOSED]: \"WebSocket connection closed\",\n  [SOLANA_ERROR__RPC_SUBSCRIPTIONS__CHANNEL_FAILED_TO_CONNECT]: \"WebSocket failed to connect\",\n  [SOLANA_ERROR__RPC_SUBSCRIPTIONS__EXPECTED_SERVER_SUBSCRIPTION_ID]: \"Failed to obtain a subscription id from the server\",\n  [SOLANA_ERROR__RPC__API_PLAN_MISSING_FOR_RPC_METHOD]: \"Could not find an API plan for RPC method: `$method`\",\n  [SOLANA_ERROR__RPC__INTEGER_OVERFLOW]: \"The $argumentLabel argument to the `$methodName` RPC method$optionalPathLabel was `$value`. This number is unsafe for use with the Solana JSON-RPC because it exceeds `Number.MAX_SAFE_INTEGER`.\",\n  [SOLANA_ERROR__RPC__TRANSPORT_HTTP_ERROR]: \"HTTP error ($statusCode): $message\",\n  [SOLANA_ERROR__RPC__TRANSPORT_HTTP_HEADER_FORBIDDEN]: \"HTTP header(s) forbidden: $headers. Learn more at https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name.\",\n  [SOLANA_ERROR__SIGNER__ADDRESS_CANNOT_HAVE_MULTIPLE_SIGNERS]: \"Multiple distinct signers were identified for address `$address`. Please ensure that you are using the same signer instance for each address.\",\n  [SOLANA_ERROR__SIGNER__EXPECTED_KEY_PAIR_SIGNER]: \"The provided value does not implement the `KeyPairSigner` interface\",\n  [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_MODIFYING_SIGNER]: \"The provided value does not implement the `MessageModifyingSigner` interface\",\n  [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_PARTIAL_SIGNER]: \"The provided value does not implement the `MessagePartialSigner` interface\",\n  [SOLANA_ERROR__SIGNER__EXPECTED_MESSAGE_SIGNER]: \"The provided value does not implement any of the `MessageSigner` interfaces\",\n  [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_MODIFYING_SIGNER]: \"The provided value does not implement the `TransactionModifyingSigner` interface\",\n  [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_PARTIAL_SIGNER]: \"The provided value does not implement the `TransactionPartialSigner` interface\",\n  [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SENDING_SIGNER]: \"The provided value does not implement the `TransactionSendingSigner` interface\",\n  [SOLANA_ERROR__SIGNER__EXPECTED_TRANSACTION_SIGNER]: \"The provided value does not implement any of the `TransactionSigner` interfaces\",\n  [SOLANA_ERROR__SIGNER__TRANSACTION_CANNOT_HAVE_MULTIPLE_SENDING_SIGNERS]: \"More than one `TransactionSendingSigner` was identified.\",\n  [SOLANA_ERROR__SIGNER__TRANSACTION_SENDING_SIGNER_MISSING]: \"No `TransactionSendingSigner` was identified. Please provide a valid `TransactionWithSingleSendingSigner` transaction.\",\n  [SOLANA_ERROR__SIGNER__WALLET_MULTISIGN_UNIMPLEMENTED]: \"Wallet account signers do not support signing multiple messages/transactions in a single operation\",\n  [SOLANA_ERROR__SUBTLE_CRYPTO__CANNOT_EXPORT_NON_EXTRACTABLE_KEY]: \"Cannot export a non-extractable key.\",\n  [SOLANA_ERROR__SUBTLE_CRYPTO__DIGEST_UNIMPLEMENTED]: \"No digest implementation could be found.\",\n  [SOLANA_ERROR__SUBTLE_CRYPTO__DISALLOWED_IN_INSECURE_CONTEXT]: \"Cryptographic operations are only allowed in secure browser contexts. Read more here: https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts.\",\n  [SOLANA_ERROR__SUBTLE_CRYPTO__ED25519_ALGORITHM_UNIMPLEMENTED]: \"This runtime does not support the generation of Ed25519 key pairs.\\n\\nInstall @solana/webcrypto-ed25519-polyfill and call its `install` function before generating keys in environments that do not support Ed25519.\\n\\nFor a list of runtimes that currently support Ed25519 operations, visit https://github.com/WICG/webcrypto-secure-curves/issues/20.\",\n  [SOLANA_ERROR__SUBTLE_CRYPTO__EXPORT_FUNCTION_UNIMPLEMENTED]: \"No signature verification implementation could be found.\",\n  [SOLANA_ERROR__SUBTLE_CRYPTO__GENERATE_FUNCTION_UNIMPLEMENTED]: \"No key generation implementation could be found.\",\n  [SOLANA_ERROR__SUBTLE_CRYPTO__SIGN_FUNCTION_UNIMPLEMENTED]: \"No signing implementation could be found.\",\n  [SOLANA_ERROR__SUBTLE_CRYPTO__VERIFY_FUNCTION_UNIMPLEMENTED]: \"No key export implementation could be found.\",\n  [SOLANA_ERROR__TIMESTAMP_OUT_OF_RANGE]: \"Timestamp value must be in the range [-(2n ** 63n), (2n ** 63n) - 1]. `$value` given\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_BORROW_OUTSTANDING]: \"Transaction processing left an account with an outstanding borrowed reference\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_IN_USE]: \"Account in use\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_LOADED_TWICE]: \"Account loaded twice\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__ACCOUNT_NOT_FOUND]: \"Attempt to debit an account but found no record of a prior credit.\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__ADDRESS_LOOKUP_TABLE_NOT_FOUND]: \"Transaction loads an address table account that doesn't exist\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__ALREADY_PROCESSED]: \"This transaction has already been processed\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__BLOCKHASH_NOT_FOUND]: \"Blockhash not found\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__CALL_CHAIN_TOO_DEEP]: \"Loader call chain is too deep\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__CLUSTER_MAINTENANCE]: \"Transactions are currently disabled due to cluster maintenance\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION]: \"Transaction contains a duplicate instruction ($index) that is not allowed\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_FEE]: \"Insufficient funds for fee\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT]: \"Transaction results in an account ($accountIndex) with insufficient funds for rent\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_FOR_FEE]: \"This account may not be used to pay transaction fees\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ACCOUNT_INDEX]: \"Transaction contains an invalid account reference\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_DATA]: \"Transaction loads an address table account with invalid data\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_INDEX]: \"Transaction address table lookup uses an invalid index\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_ADDRESS_LOOKUP_TABLE_OWNER]: \"Transaction loads an address table account with an invalid owner\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_LOADED_ACCOUNTS_DATA_SIZE_LIMIT]: \"LoadedAccountsDataSizeLimit set for transaction must be greater than 0.\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_PROGRAM_FOR_EXECUTION]: \"This program may not be used for executing instructions\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_RENT_PAYING_ACCOUNT]: \"Transaction leaves an account with a lower balance than rent-exempt minimum\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__INVALID_WRITABLE_ACCOUNT]: \"Transaction loads a writable account that cannot be written\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__MAX_LOADED_ACCOUNTS_DATA_SIZE_EXCEEDED]: \"Transaction exceeded max loaded accounts data size cap\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__MISSING_SIGNATURE_FOR_FEE]: \"Transaction requires a fee but has no signature present\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_ACCOUNT_NOT_FOUND]: \"Attempt to load a program that does not exist\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED]: \"Execution of the program referenced by account at index $accountIndex is temporarily restricted.\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__RESANITIZATION_NEEDED]: \"ResanitizationNeeded\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__SANITIZE_FAILURE]: \"Transaction failed to sanitize accounts offsets correctly\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__SIGNATURE_FAILURE]: \"Transaction did not pass signature verification\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__TOO_MANY_ACCOUNT_LOCKS]: \"Transaction locked too many accounts\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__UNBALANCED_TRANSACTION]: \"Sum of account balances before and after transaction do not match\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN]: \"The transaction failed with the error `$errorName`\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__UNSUPPORTED_VERSION]: \"Transaction version is unsupported\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_BLOCK_LIMIT]: \"Transaction would exceed account data limit within the block\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_ACCOUNT_DATA_TOTAL_LIMIT]: \"Transaction would exceed total account data limit\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_ACCOUNT_COST_LIMIT]: \"Transaction would exceed max account limit within the block\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_BLOCK_COST_LIMIT]: \"Transaction would exceed max Block Cost Limit\",\n  [SOLANA_ERROR__TRANSACTION_ERROR__WOULD_EXCEED_MAX_VOTE_COST_LIMIT]: \"Transaction would exceed max Vote Cost Limit\",\n  [SOLANA_ERROR__TRANSACTION__ADDRESSES_CANNOT_SIGN_TRANSACTION]: \"Attempted to sign a transaction with an address that is not a signer for it\",\n  [SOLANA_ERROR__TRANSACTION__ADDRESS_MISSING]: \"Transaction is missing an address at index: $index.\",\n  [SOLANA_ERROR__TRANSACTION__CANNOT_ENCODE_WITH_EMPTY_SIGNATURES]: \"Transaction has no expected signers therefore it cannot be encoded\",\n  [SOLANA_ERROR__TRANSACTION__EXCEEDS_SIZE_LIMIT]: \"Transaction size $transactionSize exceeds limit of $transactionSizeLimit bytes\",\n  [SOLANA_ERROR__TRANSACTION__EXPECTED_BLOCKHASH_LIFETIME]: \"Transaction does not have a blockhash lifetime\",\n  [SOLANA_ERROR__TRANSACTION__EXPECTED_NONCE_LIFETIME]: \"Transaction is not a durable nonce transaction\",\n  [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_CONTENTS_MISSING]: \"Contents of these address lookup tables unknown: $lookupTableAddresses\",\n  [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_ADDRESS_LOOKUP_TABLE_INDEX_OUT_OF_RANGE]: \"Lookup of address at index $highestRequestedIndex failed for lookup table `$lookupTableAddress`. Highest known index is $highestKnownIndex. The lookup table may have been extended since its contents were retrieved\",\n  [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_FEE_PAYER_MISSING]: \"No fee payer set in CompiledTransaction\",\n  [SOLANA_ERROR__TRANSACTION__FAILED_TO_DECOMPILE_INSTRUCTION_PROGRAM_ADDRESS_NOT_FOUND]: \"Could not find program address at index $index\",\n  [SOLANA_ERROR__TRANSACTION__FAILED_TO_ESTIMATE_COMPUTE_LIMIT]: \"Failed to estimate the compute unit consumption for this transaction message. This is likely because simulating the transaction failed. Inspect the `cause` property of this error to learn more\",\n  [SOLANA_ERROR__TRANSACTION__FAILED_WHEN_SIMULATING_TO_ESTIMATE_COMPUTE_LIMIT]: \"Transaction failed when it was simulated in order to estimate the compute unit consumption. The compute unit estimate provided is for a transaction that failed when simulated and may not be representative of the compute units this transaction would consume if successful. Inspect the `cause` property of this error to learn more\",\n  [SOLANA_ERROR__TRANSACTION__FEE_PAYER_MISSING]: \"Transaction is missing a fee payer.\",\n  [SOLANA_ERROR__TRANSACTION__FEE_PAYER_SIGNATURE_MISSING]: \"Could not determine this transaction's signature. Make sure that the transaction has been signed by its fee payer.\",\n  [SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_FIRST_INSTRUCTION_MUST_BE_ADVANCE_NONCE]: \"Transaction first instruction is not advance nonce account instruction.\",\n  [SOLANA_ERROR__TRANSACTION__INVALID_NONCE_TRANSACTION_INSTRUCTIONS_MISSING]: \"Transaction with no instructions cannot be durable nonce transaction.\",\n  [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_CANNOT_PAY_FEES]: \"This transaction includes an address (`$programAddress`) which is both invoked and set as the fee payer. Program addresses may not pay fees\",\n  [SOLANA_ERROR__TRANSACTION__INVOKED_PROGRAMS_MUST_NOT_BE_WRITABLE]: \"This transaction includes an address (`$programAddress`) which is both invoked and marked writable. Program addresses may not be writable\",\n  [SOLANA_ERROR__TRANSACTION__MESSAGE_SIGNATURES_MISMATCH]: \"The transaction message expected the transaction to have $signerAddressesLength signatures, got $signaturesLength.\",\n  [SOLANA_ERROR__TRANSACTION__SIGNATURES_MISSING]: \"Transaction is missing signatures for addresses: $addresses.\",\n  [SOLANA_ERROR__TRANSACTION__VERSION_NUMBER_OUT_OF_RANGE]: \"Transaction version must be in the range [0, 127]. `$actualVersion` given\"\n};\n\n// src/message-formatter.ts\nvar START_INDEX = \"i\";\nvar TYPE = \"t\";\nfunction getHumanReadableErrorMessage(code, context = {}) {\n  const messageFormatString = SolanaErrorMessages[code];\n  if (messageFormatString.length === 0) {\n    return \"\";\n  }\n  let state;\n  function commitStateUpTo(endIndex) {\n    if (state[TYPE] === 2 /* Variable */) {\n      const variableName = messageFormatString.slice(state[START_INDEX] + 1, endIndex);\n      fragments.push(\n        variableName in context ? (\n          // eslint-disable-next-line @typescript-eslint/restrict-template-expressions\n          `${context[variableName]}`\n        ) : `$${variableName}`\n      );\n    } else if (state[TYPE] === 1 /* Text */) {\n      fragments.push(messageFormatString.slice(state[START_INDEX], endIndex));\n    }\n  }\n  const fragments = [];\n  messageFormatString.split(\"\").forEach((char, ii) => {\n    if (ii === 0) {\n      state = {\n        [START_INDEX]: 0,\n        [TYPE]: messageFormatString[0] === \"\\\\\" ? 0 /* EscapeSequence */ : messageFormatString[0] === \"$\" ? 2 /* Variable */ : 1 /* Text */\n      };\n      return;\n    }\n    let nextState;\n    switch (state[TYPE]) {\n      case 0 /* EscapeSequence */:\n        nextState = { [START_INDEX]: ii, [TYPE]: 1 /* Text */ };\n        break;\n      case 1 /* Text */:\n        if (char === \"\\\\\") {\n          nextState = { [START_INDEX]: ii, [TYPE]: 0 /* EscapeSequence */ };\n        } else if (char === \"$\") {\n          nextState = { [START_INDEX]: ii, [TYPE]: 2 /* Variable */ };\n        }\n        break;\n      case 2 /* Variable */:\n        if (char === \"\\\\\") {\n          nextState = { [START_INDEX]: ii, [TYPE]: 0 /* EscapeSequence */ };\n        } else if (char === \"$\") {\n          nextState = { [START_INDEX]: ii, [TYPE]: 2 /* Variable */ };\n        } else if (!char.match(/\\w/)) {\n          nextState = { [START_INDEX]: ii, [TYPE]: 1 /* Text */ };\n        }\n        break;\n    }\n    if (nextState) {\n      if (state !== nextState) {\n        commitStateUpTo(ii);\n      }\n      state = nextState;\n    }\n  });\n  commitStateUpTo();\n  return fragments.join(\"\");\n}\nfunction getErrorMessage(code, context = {}) {\n  if (true) {\n    return getHumanReadableErrorMessage(code, context);\n  } else {}\n}\n\n// src/error.ts\nfunction isSolanaError(e, code) {\n  const isSolanaError2 = e instanceof Error && e.name === \"SolanaError\";\n  if (isSolanaError2) {\n    if (code !== void 0) {\n      return e.context.__code === code;\n    }\n    return true;\n  }\n  return false;\n}\nvar SolanaError = class extends Error {\n  /**\n   * Indicates the root cause of this {@link SolanaError}, if any.\n   *\n   * For example, a transaction error might have an instruction error as its root cause. In this\n   * case, you will be able to access the instruction error on the transaction error as `cause`.\n   */\n  cause = this.cause;\n  /**\n   * Contains context that can assist in understanding or recovering from a {@link SolanaError}.\n   */\n  context;\n  constructor(...[code, contextAndErrorOptions]) {\n    let context;\n    let errorOptions;\n    if (contextAndErrorOptions) {\n      const { cause, ...contextRest } = contextAndErrorOptions;\n      if (cause) {\n        errorOptions = { cause };\n      }\n      if (Object.keys(contextRest).length > 0) {\n        context = contextRest;\n      }\n    }\n    const message = getErrorMessage(code, context);\n    super(message, errorOptions);\n    this.context = {\n      __code: code,\n      ...context\n    };\n    this.name = \"SolanaError\";\n  }\n};\n\n// src/stack-trace.ts\nfunction safeCaptureStackTrace(...args) {\n  if (\"captureStackTrace\" in Error && typeof Error.captureStackTrace === \"function\") {\n    Error.captureStackTrace(...args);\n  }\n}\n\n// src/rpc-enum-errors.ts\nfunction getSolanaErrorFromRpcError({ errorCodeBaseOffset, getErrorContext, orderedErrorNames, rpcEnumError }, constructorOpt) {\n  let rpcErrorName;\n  let rpcErrorContext;\n  if (typeof rpcEnumError === \"string\") {\n    rpcErrorName = rpcEnumError;\n  } else {\n    rpcErrorName = Object.keys(rpcEnumError)[0];\n    rpcErrorContext = rpcEnumError[rpcErrorName];\n  }\n  const codeOffset = orderedErrorNames.indexOf(rpcErrorName);\n  const errorCode = errorCodeBaseOffset + codeOffset;\n  const errorContext = getErrorContext(errorCode, rpcErrorName, rpcErrorContext);\n  const err = new SolanaError(errorCode, errorContext);\n  safeCaptureStackTrace(err, constructorOpt);\n  return err;\n}\n\n// src/instruction-error.ts\nvar ORDERED_ERROR_NAMES = [\n  // Keep synced with RPC source: https://github.com/anza-xyz/agave/blob/master/sdk/program/src/instruction.rs\n  // If this list ever gets too large, consider implementing a compression strategy like this:\n  // https://gist.github.com/steveluscher/aaa7cbbb5433b1197983908a40860c47\n  \"GenericError\",\n  \"InvalidArgument\",\n  \"InvalidInstructionData\",\n  \"InvalidAccountData\",\n  \"AccountDataTooSmall\",\n  \"InsufficientFunds\",\n  \"IncorrectProgramId\",\n  \"MissingRequiredSignature\",\n  \"AccountAlreadyInitialized\",\n  \"UninitializedAccount\",\n  \"UnbalancedInstruction\",\n  \"ModifiedProgramId\",\n  \"ExternalAccountLamportSpend\",\n  \"ExternalAccountDataModified\",\n  \"ReadonlyLamportChange\",\n  \"ReadonlyDataModified\",\n  \"DuplicateAccountIndex\",\n  \"ExecutableModified\",\n  \"RentEpochModified\",\n  \"NotEnoughAccountKeys\",\n  \"AccountDataSizeChanged\",\n  \"AccountNotExecutable\",\n  \"AccountBorrowFailed\",\n  \"AccountBorrowOutstanding\",\n  \"DuplicateAccountOutOfSync\",\n  \"Custom\",\n  \"InvalidError\",\n  \"ExecutableDataModified\",\n  \"ExecutableLamportChange\",\n  \"ExecutableAccountNotRentExempt\",\n  \"UnsupportedProgramId\",\n  \"CallDepth\",\n  \"MissingAccount\",\n  \"ReentrancyNotAllowed\",\n  \"MaxSeedLengthExceeded\",\n  \"InvalidSeeds\",\n  \"InvalidRealloc\",\n  \"ComputationalBudgetExceeded\",\n  \"PrivilegeEscalation\",\n  \"ProgramEnvironmentSetupFailure\",\n  \"ProgramFailedToComplete\",\n  \"ProgramFailedToCompile\",\n  \"Immutable\",\n  \"IncorrectAuthority\",\n  \"BorshIoError\",\n  \"AccountNotRentExempt\",\n  \"InvalidAccountOwner\",\n  \"ArithmeticOverflow\",\n  \"UnsupportedSysvar\",\n  \"IllegalOwner\",\n  \"MaxAccountsDataAllocationsExceeded\",\n  \"MaxAccountsExceeded\",\n  \"MaxInstructionTraceLengthExceeded\",\n  \"BuiltinProgramsMustConsumeComputeUnits\"\n];\nfunction getSolanaErrorFromInstructionError(index, instructionError) {\n  const numberIndex = Number(index);\n  return getSolanaErrorFromRpcError(\n    {\n      errorCodeBaseOffset: 4615001,\n      getErrorContext(errorCode, rpcErrorName, rpcErrorContext) {\n        if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__UNKNOWN) {\n          return {\n            errorName: rpcErrorName,\n            index: numberIndex,\n            ...rpcErrorContext !== void 0 ? { instructionErrorContext: rpcErrorContext } : null\n          };\n        } else if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM) {\n          return {\n            code: Number(rpcErrorContext),\n            index: numberIndex\n          };\n        } else if (errorCode === SOLANA_ERROR__INSTRUCTION_ERROR__BORSH_IO_ERROR) {\n          return {\n            encodedData: rpcErrorContext,\n            index: numberIndex\n          };\n        }\n        return { index: numberIndex };\n      },\n      orderedErrorNames: ORDERED_ERROR_NAMES,\n      rpcEnumError: instructionError\n    },\n    getSolanaErrorFromInstructionError\n  );\n}\n\n// src/transaction-error.ts\nvar ORDERED_ERROR_NAMES2 = [\n  // Keep synced with RPC source: https://github.com/anza-xyz/agave/blob/master/sdk/src/transaction/error.rs\n  // If this list ever gets too large, consider implementing a compression strategy like this:\n  // https://gist.github.com/steveluscher/aaa7cbbb5433b1197983908a40860c47\n  \"AccountInUse\",\n  \"AccountLoadedTwice\",\n  \"AccountNotFound\",\n  \"ProgramAccountNotFound\",\n  \"InsufficientFundsForFee\",\n  \"InvalidAccountForFee\",\n  \"AlreadyProcessed\",\n  \"BlockhashNotFound\",\n  // `InstructionError` intentionally omitted; delegated to `getSolanaErrorFromInstructionError`\n  \"CallChainTooDeep\",\n  \"MissingSignatureForFee\",\n  \"InvalidAccountIndex\",\n  \"SignatureFailure\",\n  \"InvalidProgramForExecution\",\n  \"SanitizeFailure\",\n  \"ClusterMaintenance\",\n  \"AccountBorrowOutstanding\",\n  \"WouldExceedMaxBlockCostLimit\",\n  \"UnsupportedVersion\",\n  \"InvalidWritableAccount\",\n  \"WouldExceedMaxAccountCostLimit\",\n  \"WouldExceedAccountDataBlockLimit\",\n  \"TooManyAccountLocks\",\n  \"AddressLookupTableNotFound\",\n  \"InvalidAddressLookupTableOwner\",\n  \"InvalidAddressLookupTableData\",\n  \"InvalidAddressLookupTableIndex\",\n  \"InvalidRentPayingAccount\",\n  \"WouldExceedMaxVoteCostLimit\",\n  \"WouldExceedAccountDataTotalLimit\",\n  \"DuplicateInstruction\",\n  \"InsufficientFundsForRent\",\n  \"MaxLoadedAccountsDataSizeExceeded\",\n  \"InvalidLoadedAccountsDataSizeLimit\",\n  \"ResanitizationNeeded\",\n  \"ProgramExecutionTemporarilyRestricted\",\n  \"UnbalancedTransaction\"\n];\nfunction getSolanaErrorFromTransactionError(transactionError) {\n  if (typeof transactionError === \"object\" && \"InstructionError\" in transactionError) {\n    return getSolanaErrorFromInstructionError(\n      ...transactionError.InstructionError\n    );\n  }\n  return getSolanaErrorFromRpcError(\n    {\n      errorCodeBaseOffset: 7050001,\n      getErrorContext(errorCode, rpcErrorName, rpcErrorContext) {\n        if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__UNKNOWN) {\n          return {\n            errorName: rpcErrorName,\n            ...rpcErrorContext !== void 0 ? { transactionErrorContext: rpcErrorContext } : null\n          };\n        } else if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__DUPLICATE_INSTRUCTION) {\n          return {\n            index: Number(rpcErrorContext)\n          };\n        } else if (errorCode === SOLANA_ERROR__TRANSACTION_ERROR__INSUFFICIENT_FUNDS_FOR_RENT || errorCode === SOLANA_ERROR__TRANSACTION_ERROR__PROGRAM_EXECUTION_TEMPORARILY_RESTRICTED) {\n          return {\n            accountIndex: Number(rpcErrorContext.account_index)\n          };\n        }\n      },\n      orderedErrorNames: ORDERED_ERROR_NAMES2,\n      rpcEnumError: transactionError\n    },\n    getSolanaErrorFromTransactionError\n  );\n}\n\n// src/json-rpc-error.ts\nfunction getSolanaErrorFromJsonRpcError(putativeErrorResponse) {\n  let out;\n  if (isRpcErrorResponse(putativeErrorResponse)) {\n    const { code: rawCode, data, message } = putativeErrorResponse;\n    const code = Number(rawCode);\n    if (code === SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE) {\n      const { err, ...preflightErrorContext } = data;\n      const causeObject = err ? { cause: getSolanaErrorFromTransactionError(err) } : null;\n      out = new SolanaError(SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE, {\n        ...preflightErrorContext,\n        ...causeObject\n      });\n    } else {\n      let errorContext;\n      switch (code) {\n        case SOLANA_ERROR__JSON_RPC__INTERNAL_ERROR:\n        case SOLANA_ERROR__JSON_RPC__INVALID_PARAMS:\n        case SOLANA_ERROR__JSON_RPC__INVALID_REQUEST:\n        case SOLANA_ERROR__JSON_RPC__METHOD_NOT_FOUND:\n        case SOLANA_ERROR__JSON_RPC__PARSE_ERROR:\n        case SOLANA_ERROR__JSON_RPC__SCAN_ERROR:\n        case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_CLEANED_UP:\n        case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_NOT_AVAILABLE:\n        case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET:\n        case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX:\n        case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED:\n        case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_SLOT_SKIPPED:\n        case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE:\n        case SOLANA_ERROR__JSON_RPC__SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION:\n          errorContext = { __serverMessage: message };\n          break;\n        default:\n          if (typeof data === \"object\" && !Array.isArray(data)) {\n            errorContext = data;\n          }\n      }\n      out = new SolanaError(code, errorContext);\n    }\n  } else {\n    const message = typeof putativeErrorResponse === \"object\" && putativeErrorResponse !== null && \"message\" in putativeErrorResponse && typeof putativeErrorResponse.message === \"string\" ? putativeErrorResponse.message : \"Malformed JSON-RPC error with no message attribute\";\n    out = new SolanaError(SOLANA_ERROR__MALFORMED_JSON_RPC_ERROR, { error: putativeErrorResponse, message });\n  }\n  safeCaptureStackTrace(out, getSolanaErrorFromJsonRpcError);\n  return out;\n}\nfunction isRpcErrorResponse(value) {\n  return typeof value === \"object\" && value !== null && \"code\" in value && \"message\" in value && (typeof value.code === \"number\" || typeof value.code === \"bigint\") && typeof value.message === \"string\";\n}\n\n\n//# sourceMappingURL=index.browser.mjs.map\n//# sourceMappingURL=index.browser.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac29sYW5hL2Vycm9ycy9kaXN0L2luZGV4LmJyb3dzZXIubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSixjQUFjLE1BQU07QUFDcEIsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxJQUFJLEdBQUcsbUJBQW1CO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkVBQTJFO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvTkFBb047QUFDcE47QUFDQSx5TEFBeUwsc0dBQXNHO0FBQy9SLGtNQUFrTTtBQUNsTSxrTkFBa047QUFDbE47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkVBQTZFO0FBQzdFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsMkNBQTJDO0FBQ3pGO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksK0JBQStCO0FBQzNDO0FBQ0E7QUFDQSxjQUFjLGdDQUFnQztBQUM5QyxrQ0FBa0MsaURBQWlEO0FBQ25GO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLG9FQUFvRSx1Q0FBdUM7QUFDM0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRXUzWjtBQUN2M1o7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9Ac29sYW5hL2Vycm9ycy9kaXN0L2luZGV4LmJyb3dzZXIubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHNyYy9jb2Rlcy50c1xudmFyIFNPTEFOQV9FUlJPUl9fQkxPQ0tfSEVJR0hUX0VYQ0VFREVEID0gMTtcbnZhciBTT0xBTkFfRVJST1JfX0lOVkFMSURfTk9OQ0UgPSAyO1xudmFyIFNPTEFOQV9FUlJPUl9fTk9OQ0VfQUNDT1VOVF9OT1RfRk9VTkQgPSAzO1xudmFyIFNPTEFOQV9FUlJPUl9fQkxPQ0tIQVNIX1NUUklOR19MRU5HVEhfT1VUX09GX1JBTkdFID0gNDtcbnZhciBTT0xBTkFfRVJST1JfX0lOVkFMSURfQkxPQ0tIQVNIX0JZVEVfTEVOR1RIID0gNTtcbnZhciBTT0xBTkFfRVJST1JfX0xBTVBPUlRTX09VVF9PRl9SQU5HRSA9IDY7XG52YXIgU09MQU5BX0VSUk9SX19NQUxGT1JNRURfQklHSU5UX1NUUklORyA9IDc7XG52YXIgU09MQU5BX0VSUk9SX19NQUxGT1JNRURfTlVNQkVSX1NUUklORyA9IDg7XG52YXIgU09MQU5BX0VSUk9SX19USU1FU1RBTVBfT1VUX09GX1JBTkdFID0gOTtcbnZhciBTT0xBTkFfRVJST1JfX01BTEZPUk1FRF9KU09OX1JQQ19FUlJPUiA9IDEwO1xudmFyIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1BBUlNFX0VSUk9SID0gLTMyNzAwO1xudmFyIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX0lOVEVSTkFMX0VSUk9SID0gLTMyNjAzO1xudmFyIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX0lOVkFMSURfUEFSQU1TID0gLTMyNjAyO1xudmFyIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX01FVEhPRF9OT1RfRk9VTkQgPSAtMzI2MDE7XG52YXIgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fSU5WQUxJRF9SRVFVRVNUID0gLTMyNjAwO1xudmFyIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9NSU5fQ09OVEVYVF9TTE9UX05PVF9SRUFDSEVEID0gLTMyMDE2O1xudmFyIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9VTlNVUFBPUlRFRF9UUkFOU0FDVElPTl9WRVJTSU9OID0gLTMyMDE1O1xudmFyIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9CTE9DS19TVEFUVVNfTk9UX0FWQUlMQUJMRV9ZRVQgPSAtMzIwMTQ7XG52YXIgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX1RSQU5TQUNUSU9OX1NJR05BVFVSRV9MRU5fTUlTTUFUQ0ggPSAtMzIwMTM7XG52YXIgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0NBTl9FUlJPUiA9IC0zMjAxMjtcbnZhciBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfVFJBTlNBQ1RJT05fSElTVE9SWV9OT1RfQVZBSUxBQkxFID0gLTMyMDExO1xudmFyIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9LRVlfRVhDTFVERURfRlJPTV9TRUNPTkRBUllfSU5ERVggPSAtMzIwMTA7XG52YXIgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX0xPTkdfVEVSTV9TVE9SQUdFX1NMT1RfU0tJUFBFRCA9IC0zMjAwOTtcbnZhciBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfTk9fU05BUFNIT1QgPSAtMzIwMDg7XG52YXIgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX1NMT1RfU0tJUFBFRCA9IC0zMjAwNztcbnZhciBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfVFJBTlNBQ1RJT05fUFJFQ09NUElMRV9WRVJJRklDQVRJT05fRkFJTFVSRSA9IC0zMjAwNjtcbnZhciBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfTk9ERV9VTkhFQUxUSFkgPSAtMzIwMDU7XG52YXIgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX0JMT0NLX05PVF9BVkFJTEFCTEUgPSAtMzIwMDQ7XG52YXIgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX1RSQU5TQUNUSU9OX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTFVSRSA9IC0zMjAwMztcbnZhciBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfU0VORF9UUkFOU0FDVElPTl9QUkVGTElHSFRfRkFJTFVSRSA9IC0zMjAwMjtcbnZhciBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfQkxPQ0tfQ0xFQU5FRF9VUCA9IC0zMjAwMTtcbnZhciBTT0xBTkFfRVJST1JfX0FERFJFU1NFU19fSU5WQUxJRF9CWVRFX0xFTkdUSCA9IDI4ZTU7XG52YXIgU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX1NUUklOR19MRU5HVEhfT1VUX09GX1JBTkdFID0gMjgwMDAwMTtcbnZhciBTT0xBTkFfRVJST1JfX0FERFJFU1NFU19fSU5WQUxJRF9CQVNFNThfRU5DT0RFRF9BRERSRVNTID0gMjgwMDAwMjtcbnZhciBTT0xBTkFfRVJST1JfX0FERFJFU1NFU19fSU5WQUxJRF9FRDI1NTE5X1BVQkxJQ19LRVkgPSAyODAwMDAzO1xudmFyIFNPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19NQUxGT1JNRURfUERBID0gMjgwMDAwNDtcbnZhciBTT0xBTkFfRVJST1JfX0FERFJFU1NFU19fUERBX0JVTVBfU0VFRF9PVVRfT0ZfUkFOR0UgPSAyODAwMDA1O1xudmFyIFNPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19NQVhfTlVNQkVSX09GX1BEQV9TRUVEU19FWENFRURFRCA9IDI4MDAwMDY7XG52YXIgU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX01BWF9QREFfU0VFRF9MRU5HVEhfRVhDRUVERUQgPSAyODAwMDA3O1xudmFyIFNPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19JTlZBTElEX1NFRURTX1BPSU5UX09OX0NVUlZFID0gMjgwMDAwODtcbnZhciBTT0xBTkFfRVJST1JfX0FERFJFU1NFU19fRkFJTEVEX1RPX0ZJTkRfVklBQkxFX1BEQV9CVU1QX1NFRUQgPSAyODAwMDA5O1xudmFyIFNPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19QREFfRU5EU19XSVRIX1BEQV9NQVJLRVIgPSAyODAwMDEwO1xudmFyIFNPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19JTlZBTElEX09GRl9DVVJWRV9BRERSRVNTID0gMjgwMDAxMTtcbnZhciBTT0xBTkFfRVJST1JfX0FDQ09VTlRTX19BQ0NPVU5UX05PVF9GT1VORCA9IDMyM2U0O1xudmFyIFNPTEFOQV9FUlJPUl9fQUNDT1VOVFNfX09ORV9PUl9NT1JFX0FDQ09VTlRTX05PVF9GT1VORCA9IDMyMzAwMDAxO1xudmFyIFNPTEFOQV9FUlJPUl9fQUNDT1VOVFNfX0ZBSUxFRF9UT19ERUNPREVfQUNDT1VOVCA9IDMyMzAwMDI7XG52YXIgU09MQU5BX0VSUk9SX19BQ0NPVU5UU19fRVhQRUNURURfREVDT0RFRF9BQ0NPVU5UID0gMzIzMDAwMztcbnZhciBTT0xBTkFfRVJST1JfX0FDQ09VTlRTX19FWFBFQ1RFRF9BTExfQUNDT1VOVFNfVE9fQkVfREVDT0RFRCA9IDMyMzAwMDQ7XG52YXIgU09MQU5BX0VSUk9SX19TVUJUTEVfQ1JZUFRPX19ESVNBTExPV0VEX0lOX0lOU0VDVVJFX0NPTlRFWFQgPSAzNjFlNDtcbnZhciBTT0xBTkFfRVJST1JfX1NVQlRMRV9DUllQVE9fX0RJR0VTVF9VTklNUExFTUVOVEVEID0gMzYxMDAwMTtcbnZhciBTT0xBTkFfRVJST1JfX1NVQlRMRV9DUllQVE9fX0VEMjU1MTlfQUxHT1JJVEhNX1VOSU1QTEVNRU5URUQgPSAzNjEwMDAyO1xudmFyIFNPTEFOQV9FUlJPUl9fU1VCVExFX0NSWVBUT19fRVhQT1JUX0ZVTkNUSU9OX1VOSU1QTEVNRU5URUQgPSAzNjEwMDAzO1xudmFyIFNPTEFOQV9FUlJPUl9fU1VCVExFX0NSWVBUT19fR0VORVJBVEVfRlVOQ1RJT05fVU5JTVBMRU1FTlRFRCA9IDM2MTAwMDQ7XG52YXIgU09MQU5BX0VSUk9SX19TVUJUTEVfQ1JZUFRPX19TSUdOX0ZVTkNUSU9OX1VOSU1QTEVNRU5URUQgPSAzNjEwMDA1O1xudmFyIFNPTEFOQV9FUlJPUl9fU1VCVExFX0NSWVBUT19fVkVSSUZZX0ZVTkNUSU9OX1VOSU1QTEVNRU5URUQgPSAzNjEwMDA2O1xudmFyIFNPTEFOQV9FUlJPUl9fU1VCVExFX0NSWVBUT19fQ0FOTk9UX0VYUE9SVF9OT05fRVhUUkFDVEFCTEVfS0VZID0gMzYxMDAwNztcbnZhciBTT0xBTkFfRVJST1JfX0NSWVBUT19fUkFORE9NX1ZBTFVFU19GVU5DVElPTl9VTklNUExFTUVOVEVEID0gMzYxMWUzO1xudmFyIFNPTEFOQV9FUlJPUl9fS0VZU19fSU5WQUxJRF9LRVlfUEFJUl9CWVRFX0xFTkdUSCA9IDM3MDRlMztcbnZhciBTT0xBTkFfRVJST1JfX0tFWVNfX0lOVkFMSURfUFJJVkFURV9LRVlfQllURV9MRU5HVEggPSAzNzA0MDAxO1xudmFyIFNPTEFOQV9FUlJPUl9fS0VZU19fSU5WQUxJRF9TSUdOQVRVUkVfQllURV9MRU5HVEggPSAzNzA0MDAyO1xudmFyIFNPTEFOQV9FUlJPUl9fS0VZU19fU0lHTkFUVVJFX1NUUklOR19MRU5HVEhfT1VUX09GX1JBTkdFID0gMzcwNDAwMztcbnZhciBTT0xBTkFfRVJST1JfX0tFWVNfX1BVQkxJQ19LRVlfTVVTVF9NQVRDSF9QUklWQVRFX0tFWSA9IDM3MDQwMDQ7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9fRVhQRUNURURfVE9fSEFWRV9BQ0NPVU5UUyA9IDQxMjhlMztcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX19FWFBFQ1RFRF9UT19IQVZFX0RBVEEgPSA0MTI4MDAxO1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fX1BST0dSQU1fSURfTUlTTUFUQ0ggPSA0MTI4MDAyO1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1VOS05PV04gPSA0NjE1ZTM7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fR0VORVJJQ19FUlJPUiA9IDQ2MTUwMDE7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9BUkdVTUVOVCA9IDQ2MTUwMDI7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9JTlNUUlVDVElPTl9EQVRBID0gNDYxNTAwMztcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19JTlZBTElEX0FDQ09VTlRfREFUQSA9IDQ2MTUwMDQ7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9EQVRBX1RPT19TTUFMTCA9IDQ2MTUwMDU7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5TVUZGSUNJRU5UX0ZVTkRTID0gNDYxNTAwNjtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19JTkNPUlJFQ1RfUFJPR1JBTV9JRCA9IDQ2MTUwMDc7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fTUlTU0lOR19SRVFVSVJFRF9TSUdOQVRVUkUgPSA0NjE1MDA4O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0FDQ09VTlRfQUxSRUFEWV9JTklUSUFMSVpFRCA9IDQ2MTUwMDk7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fVU5JTklUSUFMSVpFRF9BQ0NPVU5UID0gNDYxNTAxMDtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19VTkJBTEFOQ0VEX0lOU1RSVUNUSU9OID0gNDYxNTAxMTtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19NT0RJRklFRF9QUk9HUkFNX0lEID0gNDYxNTAxMjtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19FWFRFUk5BTF9BQ0NPVU5UX0xBTVBPUlRfU1BFTkQgPSA0NjE1MDEzO1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0VYVEVSTkFMX0FDQ09VTlRfREFUQV9NT0RJRklFRCA9IDQ2MTUwMTQ7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fUkVBRE9OTFlfTEFNUE9SVF9DSEFOR0UgPSA0NjE1MDE1O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1JFQURPTkxZX0RBVEFfTU9ESUZJRUQgPSA0NjE1MDE2O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0RVUExJQ0FURV9BQ0NPVU5UX0lOREVYID0gNDYxNTAxNztcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19FWEVDVVRBQkxFX01PRElGSUVEID0gNDYxNTAxODtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19SRU5UX0VQT0NIX01PRElGSUVEID0gNDYxNTAxOTtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19OT1RfRU5PVUdIX0FDQ09VTlRfS0VZUyA9IDQ2MTUwMjA7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9EQVRBX1NJWkVfQ0hBTkdFRCA9IDQ2MTUwMjE7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9OT1RfRVhFQ1VUQUJMRSA9IDQ2MTUwMjI7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9CT1JST1dfRkFJTEVEID0gNDYxNTAyMztcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19BQ0NPVU5UX0JPUlJPV19PVVRTVEFORElORyA9IDQ2MTUwMjQ7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fRFVQTElDQVRFX0FDQ09VTlRfT1VUX09GX1NZTkMgPSA0NjE1MDI1O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0NVU1RPTSA9IDQ2MTUwMjY7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9FUlJPUiA9IDQ2MTUwMjc7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fRVhFQ1VUQUJMRV9EQVRBX01PRElGSUVEID0gNDYxNTAyODtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19FWEVDVVRBQkxFX0xBTVBPUlRfQ0hBTkdFID0gNDYxNTAyOTtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19FWEVDVVRBQkxFX0FDQ09VTlRfTk9UX1JFTlRfRVhFTVBUID0gNDYxNTAzMDtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19VTlNVUFBPUlRFRF9QUk9HUkFNX0lEID0gNDYxNTAzMTtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19DQUxMX0RFUFRIID0gNDYxNTAzMjtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19NSVNTSU5HX0FDQ09VTlQgPSA0NjE1MDMzO1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1JFRU5UUkFOQ1lfTk9UX0FMTE9XRUQgPSA0NjE1MDM0O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX01BWF9TRUVEX0xFTkdUSF9FWENFRURFRCA9IDQ2MTUwMzU7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9TRUVEUyA9IDQ2MTUwMzY7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9SRUFMTE9DID0gNDYxNTAzNztcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19DT01QVVRBVElPTkFMX0JVREdFVF9FWENFRURFRCA9IDQ2MTUwMzg7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fUFJJVklMRUdFX0VTQ0FMQVRJT04gPSA0NjE1MDM5O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1BST0dSQU1fRU5WSVJPTk1FTlRfU0VUVVBfRkFJTFVSRSA9IDQ2MTUwNDA7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fUFJPR1JBTV9GQUlMRURfVE9fQ09NUExFVEUgPSA0NjE1MDQxO1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1BST0dSQU1fRkFJTEVEX1RPX0NPTVBJTEUgPSA0NjE1MDQyO1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lNTVVUQUJMRSA9IDQ2MTUwNDM7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5DT1JSRUNUX0FVVEhPUklUWSA9IDQ2MTUwNDQ7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQk9SU0hfSU9fRVJST1IgPSA0NjE1MDQ1O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0FDQ09VTlRfTk9UX1JFTlRfRVhFTVBUID0gNDYxNTA0NjtcbnZhciBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19JTlZBTElEX0FDQ09VTlRfT1dORVIgPSA0NjE1MDQ3O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0FSSVRITUVUSUNfT1ZFUkZMT1cgPSA0NjE1MDQ4O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1VOU1VQUE9SVEVEX1NZU1ZBUiA9IDQ2MTUwNDk7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSUxMRUdBTF9PV05FUiA9IDQ2MTUwNTA7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fTUFYX0FDQ09VTlRTX0RBVEFfQUxMT0NBVElPTlNfRVhDRUVERUQgPSA0NjE1MDUxO1xudmFyIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX01BWF9BQ0NPVU5UU19FWENFRURFRCA9IDQ2MTUwNTI7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fTUFYX0lOU1RSVUNUSU9OX1RSQUNFX0xFTkdUSF9FWENFRURFRCA9IDQ2MTUwNTM7XG52YXIgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQlVJTFRJTl9QUk9HUkFNU19NVVNUX0NPTlNVTUVfQ09NUFVURV9VTklUUyA9IDQ2MTUwNTQ7XG52YXIgU09MQU5BX0VSUk9SX19TSUdORVJfX0FERFJFU1NfQ0FOTk9UX0hBVkVfTVVMVElQTEVfU0lHTkVSUyA9IDU1MDhlMztcbnZhciBTT0xBTkFfRVJST1JfX1NJR05FUl9fRVhQRUNURURfS0VZX1BBSVJfU0lHTkVSID0gNTUwODAwMTtcbnZhciBTT0xBTkFfRVJST1JfX1NJR05FUl9fRVhQRUNURURfTUVTU0FHRV9TSUdORVIgPSA1NTA4MDAyO1xudmFyIFNPTEFOQV9FUlJPUl9fU0lHTkVSX19FWFBFQ1RFRF9NRVNTQUdFX01PRElGWUlOR19TSUdORVIgPSA1NTA4MDAzO1xudmFyIFNPTEFOQV9FUlJPUl9fU0lHTkVSX19FWFBFQ1RFRF9NRVNTQUdFX1BBUlRJQUxfU0lHTkVSID0gNTUwODAwNDtcbnZhciBTT0xBTkFfRVJST1JfX1NJR05FUl9fRVhQRUNURURfVFJBTlNBQ1RJT05fU0lHTkVSID0gNTUwODAwNTtcbnZhciBTT0xBTkFfRVJST1JfX1NJR05FUl9fRVhQRUNURURfVFJBTlNBQ1RJT05fTU9ESUZZSU5HX1NJR05FUiA9IDU1MDgwMDY7XG52YXIgU09MQU5BX0VSUk9SX19TSUdORVJfX0VYUEVDVEVEX1RSQU5TQUNUSU9OX1BBUlRJQUxfU0lHTkVSID0gNTUwODAwNztcbnZhciBTT0xBTkFfRVJST1JfX1NJR05FUl9fRVhQRUNURURfVFJBTlNBQ1RJT05fU0VORElOR19TSUdORVIgPSA1NTA4MDA4O1xudmFyIFNPTEFOQV9FUlJPUl9fU0lHTkVSX19UUkFOU0FDVElPTl9DQU5OT1RfSEFWRV9NVUxUSVBMRV9TRU5ESU5HX1NJR05FUlMgPSA1NTA4MDA5O1xudmFyIFNPTEFOQV9FUlJPUl9fU0lHTkVSX19UUkFOU0FDVElPTl9TRU5ESU5HX1NJR05FUl9NSVNTSU5HID0gNTUwODAxMDtcbnZhciBTT0xBTkFfRVJST1JfX1NJR05FUl9fV0FMTEVUX01VTFRJU0lHTl9VTklNUExFTUVOVEVEID0gNTUwODAxMTtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19JTlZPS0VEX1BST0dSQU1TX0NBTk5PVF9QQVlfRkVFUyA9IDU2NjNlMztcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19JTlZPS0VEX1BST0dSQU1TX01VU1RfTk9UX0JFX1dSSVRBQkxFID0gNTY2MzAwMTtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19FWFBFQ1RFRF9CTE9DS0hBU0hfTElGRVRJTUUgPSA1NjYzMDAyO1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0VYUEVDVEVEX05PTkNFX0xJRkVUSU1FID0gNTY2MzAwMztcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19WRVJTSU9OX05VTUJFUl9PVVRfT0ZfUkFOR0UgPSA1NjYzMDA0O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0ZBSUxFRF9UT19ERUNPTVBJTEVfQUREUkVTU19MT09LVVBfVEFCTEVfQ09OVEVOVFNfTUlTU0lORyA9IDU2NjMwMDU7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRkFJTEVEX1RPX0RFQ09NUElMRV9BRERSRVNTX0xPT0tVUF9UQUJMRV9JTkRFWF9PVVRfT0ZfUkFOR0UgPSA1NjYzMDA2O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0ZBSUxFRF9UT19ERUNPTVBJTEVfSU5TVFJVQ1RJT05fUFJPR1JBTV9BRERSRVNTX05PVF9GT1VORCA9IDU2NjMwMDc7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRkFJTEVEX1RPX0RFQ09NUElMRV9GRUVfUEFZRVJfTUlTU0lORyA9IDU2NjMwMDg7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fU0lHTkFUVVJFU19NSVNTSU5HID0gNTY2MzAwOTtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19BRERSRVNTX01JU1NJTkcgPSA1NjYzMDEwO1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0ZFRV9QQVlFUl9NSVNTSU5HID0gNTY2MzAxMTtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19GRUVfUEFZRVJfU0lHTkFUVVJFX01JU1NJTkcgPSA1NjYzMDEyO1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0lOVkFMSURfTk9OQ0VfVFJBTlNBQ1RJT05fSU5TVFJVQ1RJT05TX01JU1NJTkcgPSA1NjYzMDEzO1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0lOVkFMSURfTk9OQ0VfVFJBTlNBQ1RJT05fRklSU1RfSU5TVFJVQ1RJT05fTVVTVF9CRV9BRFZBTkNFX05PTkNFID0gNTY2MzAxNDtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19BRERSRVNTRVNfQ0FOTk9UX1NJR05fVFJBTlNBQ1RJT04gPSA1NjYzMDE1O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0NBTk5PVF9FTkNPREVfV0lUSF9FTVBUWV9TSUdOQVRVUkVTID0gNTY2MzAxNjtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19NRVNTQUdFX1NJR05BVFVSRVNfTUlTTUFUQ0ggPSA1NjYzMDE3O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0ZBSUxFRF9UT19FU1RJTUFURV9DT01QVVRFX0xJTUlUID0gNTY2MzAxODtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19GQUlMRURfV0hFTl9TSU1VTEFUSU5HX1RPX0VTVElNQVRFX0NPTVBVVEVfTElNSVQgPSA1NjYzMDE5O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0VYQ0VFRFNfU0laRV9MSU1JVCA9IDU2NjMwMjA7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fVU5LTk9XTiA9IDcwNWU0O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0FDQ09VTlRfSU5fVVNFID0gNzA1MDAwMTtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19BQ0NPVU5UX0xPQURFRF9UV0lDRSA9IDcwNTAwMDI7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fQUNDT1VOVF9OT1RfRk9VTkQgPSA3MDUwMDAzO1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1BST0dSQU1fQUNDT1VOVF9OT1RfRk9VTkQgPSA3MDUwMDA0O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOU1VGRklDSUVOVF9GVU5EU19GT1JfRkVFID0gNzA1MDAwNTtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlZBTElEX0FDQ09VTlRfRk9SX0ZFRSA9IDcwNTAwMDY7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fQUxSRUFEWV9QUk9DRVNTRUQgPSA3MDUwMDA3O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0JMT0NLSEFTSF9OT1RfRk9VTkQgPSA3MDUwMDA4O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0NBTExfQ0hBSU5fVE9PX0RFRVAgPSA3MDUwMDA5O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX01JU1NJTkdfU0lHTkFUVVJFX0ZPUl9GRUUgPSA3MDUwMDEwO1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfQUNDT1VOVF9JTkRFWCA9IDcwNTAwMTE7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fU0lHTkFUVVJFX0ZBSUxVUkUgPSA3MDUwMDEyO1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfUFJPR1JBTV9GT1JfRVhFQ1VUSU9OID0gNzA1MDAxMztcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19TQU5JVElaRV9GQUlMVVJFID0gNzA1MDAxNDtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19DTFVTVEVSX01BSU5URU5BTkNFID0gNzA1MDAxNTtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19BQ0NPVU5UX0JPUlJPV19PVVRTVEFORElORyA9IDcwNTAwMTY7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fV09VTERfRVhDRUVEX01BWF9CTE9DS19DT1NUX0xJTUlUID0gNzA1MDAxNztcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19VTlNVUFBPUlRFRF9WRVJTSU9OID0gNzA1MDAxODtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlZBTElEX1dSSVRBQkxFX0FDQ09VTlQgPSA3MDUwMDE5O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1dPVUxEX0VYQ0VFRF9NQVhfQUNDT1VOVF9DT1NUX0xJTUlUID0gNzA1MDAyMDtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19XT1VMRF9FWENFRURfQUNDT1VOVF9EQVRBX0JMT0NLX0xJTUlUID0gNzA1MDAyMTtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19UT09fTUFOWV9BQ0NPVU5UX0xPQ0tTID0gNzA1MDAyMjtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19BRERSRVNTX0xPT0tVUF9UQUJMRV9OT1RfRk9VTkQgPSA3MDUwMDIzO1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfQUREUkVTU19MT09LVVBfVEFCTEVfT1dORVIgPSA3MDUwMDI0O1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfQUREUkVTU19MT09LVVBfVEFCTEVfREFUQSA9IDcwNTAwMjU7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fSU5WQUxJRF9BRERSRVNTX0xPT0tVUF9UQUJMRV9JTkRFWCA9IDcwNTAwMjY7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fSU5WQUxJRF9SRU5UX1BBWUlOR19BQ0NPVU5UID0gNzA1MDAyNztcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19XT1VMRF9FWENFRURfTUFYX1ZPVEVfQ09TVF9MSU1JVCA9IDcwNTAwMjg7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fV09VTERfRVhDRUVEX0FDQ09VTlRfREFUQV9UT1RBTF9MSU1JVCA9IDcwNTAwMjk7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fRFVQTElDQVRFX0lOU1RSVUNUSU9OID0gNzA1MDAzMDtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlNVRkZJQ0lFTlRfRlVORFNfRk9SX1JFTlQgPSA3MDUwMDMxO1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX01BWF9MT0FERURfQUNDT1VOVFNfREFUQV9TSVpFX0VYQ0VFREVEID0gNzA1MDAzMjtcbnZhciBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlZBTElEX0xPQURFRF9BQ0NPVU5UU19EQVRBX1NJWkVfTElNSVQgPSA3MDUwMDMzO1xudmFyIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1JFU0FOSVRJWkFUSU9OX05FRURFRCA9IDcwNTAwMzQ7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fUFJPR1JBTV9FWEVDVVRJT05fVEVNUE9SQVJJTFlfUkVTVFJJQ1RFRCA9IDcwNTAwMzU7XG52YXIgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fVU5CQUxBTkNFRF9UUkFOU0FDVElPTiA9IDcwNTAwMzY7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0NBTk5PVF9ERUNPREVfRU1QVFlfQllURV9BUlJBWSA9IDgwNzhlMztcbnZhciBTT0xBTkFfRVJST1JfX0NPREVDU19fSU5WQUxJRF9CWVRFX0xFTkdUSCA9IDgwNzgwMDE7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VYUEVDVEVEX0ZJWEVEX0xFTkdUSCA9IDgwNzgwMDI7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VYUEVDVEVEX1ZBUklBQkxFX0xFTkdUSCA9IDgwNzgwMDM7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VOQ09ERVJfREVDT0RFUl9TSVpFX0NPTVBBVElCSUxJVFlfTUlTTUFUQ0ggPSA4MDc4MDA0O1xudmFyIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FTkNPREVSX0RFQ09ERVJfRklYRURfU0laRV9NSVNNQVRDSCA9IDgwNzgwMDU7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VOQ09ERVJfREVDT0RFUl9NQVhfU0laRV9NSVNNQVRDSCA9IDgwNzgwMDY7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0lOVkFMSURfTlVNQkVSX09GX0lURU1TID0gODA3ODAwNztcbnZhciBTT0xBTkFfRVJST1JfX0NPREVDU19fRU5VTV9ESVNDUklNSU5BVE9SX09VVF9PRl9SQU5HRSA9IDgwNzgwMDg7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0lOVkFMSURfRElTQ1JJTUlOQVRFRF9VTklPTl9WQVJJQU5UID0gODA3ODAwOTtcbnZhciBTT0xBTkFfRVJST1JfX0NPREVDU19fSU5WQUxJRF9FTlVNX1ZBUklBTlQgPSA4MDc4MDEwO1xudmFyIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19OVU1CRVJfT1VUX09GX1JBTkdFID0gODA3ODAxMTtcbnZhciBTT0xBTkFfRVJST1JfX0NPREVDU19fSU5WQUxJRF9TVFJJTkdfRk9SX0JBU0UgPSA4MDc4MDEyO1xudmFyIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FWFBFQ1RFRF9QT1NJVElWRV9CWVRFX0xFTkdUSCA9IDgwNzgwMTM7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX09GRlNFVF9PVVRfT0ZfUkFOR0UgPSA4MDc4MDE0O1xudmFyIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19JTlZBTElEX0xJVEVSQUxfVU5JT05fVkFSSUFOVCA9IDgwNzgwMTU7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0xJVEVSQUxfVU5JT05fRElTQ1JJTUlOQVRPUl9PVVRfT0ZfUkFOR0UgPSA4MDc4MDE2O1xudmFyIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19VTklPTl9WQVJJQU5UX09VVF9PRl9SQU5HRSA9IDgwNzgwMTc7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0lOVkFMSURfQ09OU1RBTlQgPSA4MDc4MDE4O1xudmFyIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FWFBFQ1RFRF9aRVJPX1ZBTFVFX1RPX01BVENIX0lURU1fRklYRURfU0laRSA9IDgwNzgwMTk7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VOQ09ERURfQllURVNfTVVTVF9OT1RfSU5DTFVERV9TRU5USU5FTCA9IDgwNzgwMjA7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX1NFTlRJTkVMX01JU1NJTkdfSU5fREVDT0RFRF9CWVRFUyA9IDgwNzgwMjE7XG52YXIgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0NBTk5PVF9VU0VfTEVYSUNBTF9WQUxVRVNfQVNfRU5VTV9ESVNDUklNSU5BVE9SUyA9IDgwNzgwMjI7XG52YXIgU09MQU5BX0VSUk9SX19SUENfX0lOVEVHRVJfT1ZFUkZMT1cgPSA4MWU1O1xudmFyIFNPTEFOQV9FUlJPUl9fUlBDX19UUkFOU1BPUlRfSFRUUF9IRUFERVJfRk9SQklEREVOID0gODEwMDAwMTtcbnZhciBTT0xBTkFfRVJST1JfX1JQQ19fVFJBTlNQT1JUX0hUVFBfRVJST1IgPSA4MTAwMDAyO1xudmFyIFNPTEFOQV9FUlJPUl9fUlBDX19BUElfUExBTl9NSVNTSU5HX0ZPUl9SUENfTUVUSE9EID0gODEwMDAwMztcbnZhciBTT0xBTkFfRVJST1JfX1JQQ19TVUJTQ1JJUFRJT05TX19DQU5OT1RfQ1JFQVRFX1NVQlNDUklQVElPTl9QTEFOID0gODE5ZTQ7XG52YXIgU09MQU5BX0VSUk9SX19SUENfU1VCU0NSSVBUSU9OU19fRVhQRUNURURfU0VSVkVSX1NVQlNDUklQVElPTl9JRCA9IDgxOTAwMDE7XG52YXIgU09MQU5BX0VSUk9SX19SUENfU1VCU0NSSVBUSU9OU19fQ0hBTk5FTF9DTE9TRURfQkVGT1JFX01FU1NBR0VfQlVGRkVSRUQgPSA4MTkwMDAyO1xudmFyIFNPTEFOQV9FUlJPUl9fUlBDX1NVQlNDUklQVElPTlNfX0NIQU5ORUxfQ09OTkVDVElPTl9DTE9TRUQgPSA4MTkwMDAzO1xudmFyIFNPTEFOQV9FUlJPUl9fUlBDX1NVQlNDUklQVElPTlNfX0NIQU5ORUxfRkFJTEVEX1RPX0NPTk5FQ1QgPSA4MTkwMDA0O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5WQVJJQU5UX1ZJT0xBVElPTl9fU1VCU0NSSVBUSU9OX0lURVJBVE9SX1NUQVRFX01JU1NJTkcgPSA5OWU1O1xudmFyIFNPTEFOQV9FUlJPUl9fSU5WQVJJQU5UX1ZJT0xBVElPTl9fU1VCU0NSSVBUSU9OX0lURVJBVE9SX01VU1RfTk9UX1BPTExfQkVGT1JFX1JFU09MVklOR19FWElTVElOR19NRVNTQUdFX1BST01JU0UgPSA5OTAwMDAxO1xudmFyIFNPTEFOQV9FUlJPUl9fSU5WQVJJQU5UX1ZJT0xBVElPTl9fQ0FDSEVEX0FCT1JUQUJMRV9JVEVSQUJMRV9DQUNIRV9FTlRSWV9NSVNTSU5HID0gOTkwMDAwMjtcbnZhciBTT0xBTkFfRVJST1JfX0lOVkFSSUFOVF9WSU9MQVRJT05fX1NXSVRDSF9NVVNUX0JFX0VYSEFVU1RJVkUgPSA5OTAwMDAzO1xudmFyIFNPTEFOQV9FUlJPUl9fSU5WQVJJQU5UX1ZJT0xBVElPTl9fREFUQV9QVUJMSVNIRVJfQ0hBTk5FTF9VTklNUExFTUVOVEVEID0gOTkwMDAwNDtcblxuLy8gc3JjL2NvbnRleHQudHNcbmZ1bmN0aW9uIGVuY29kZVZhbHVlKHZhbHVlKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIGNvbnN0IGNvbW1hU2VwYXJhdGVkVmFsdWVzID0gdmFsdWUubWFwKGVuY29kZVZhbHVlKS5qb2luKFxuICAgICAgXCIlMkMlMjBcIlxuICAgICAgLyogXCIsIFwiICovXG4gICAgKTtcbiAgICByZXR1cm4gXCIlNUJcIiArIGNvbW1hU2VwYXJhdGVkVmFsdWVzICsgLyogXCJdXCIgKi9cbiAgICBcIiU1RFwiO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgIHJldHVybiBgJHt2YWx1ZX1uYDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgU3RyaW5nKFxuICAgICAgICB2YWx1ZSAhPSBudWxsICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT09IG51bGwgPyAoXG4gICAgICAgICAgLy8gUGxhaW4gb2JqZWN0cyB3aXRoIG5vIHByb3RvdHlwZSBkb24ndCBoYXZlIGEgYHRvU3RyaW5nYCBtZXRob2QuXG4gICAgICAgICAgLy8gQ29udmVydCB0aGVtIGJlZm9yZSBzdHJpbmdpZnlpbmcgdGhlbS5cbiAgICAgICAgICB7IC4uLnZhbHVlIH1cbiAgICAgICAgKSA6IHZhbHVlXG4gICAgICApXG4gICAgKTtcbiAgfVxufVxuZnVuY3Rpb24gZW5jb2RlT2JqZWN0Q29udGV4dEVudHJ5KFtrZXksIHZhbHVlXSkge1xuICByZXR1cm4gYCR7a2V5fT0ke2VuY29kZVZhbHVlKHZhbHVlKX1gO1xufVxuZnVuY3Rpb24gZW5jb2RlQ29udGV4dE9iamVjdChjb250ZXh0KSB7XG4gIGNvbnN0IHNlYXJjaFBhcmFtc1N0cmluZyA9IE9iamVjdC5lbnRyaWVzKGNvbnRleHQpLm1hcChlbmNvZGVPYmplY3RDb250ZXh0RW50cnkpLmpvaW4oXCImXCIpO1xuICByZXR1cm4gYnRvYShzZWFyY2hQYXJhbXNTdHJpbmcpO1xufVxuXG4vLyBzcmMvbWVzc2FnZXMudHNcbnZhciBTb2xhbmFFcnJvck1lc3NhZ2VzID0ge1xuICBbU09MQU5BX0VSUk9SX19BQ0NPVU5UU19fQUNDT1VOVF9OT1RfRk9VTkRdOiBcIkFjY291bnQgbm90IGZvdW5kIGF0IGFkZHJlc3M6ICRhZGRyZXNzXCIsXG4gIFtTT0xBTkFfRVJST1JfX0FDQ09VTlRTX19FWFBFQ1RFRF9BTExfQUNDT1VOVFNfVE9fQkVfREVDT0RFRF06IFwiTm90IGFsbCBhY2NvdW50cyB3ZXJlIGRlY29kZWQuIEVuY29kZWQgYWNjb3VudHMgZm91bmQgYXQgYWRkcmVzc2VzOiAkYWRkcmVzc2VzLlwiLFxuICBbU09MQU5BX0VSUk9SX19BQ0NPVU5UU19fRVhQRUNURURfREVDT0RFRF9BQ0NPVU5UXTogXCJFeHBlY3RlZCBkZWNvZGVkIGFjY291bnQgYXQgYWRkcmVzczogJGFkZHJlc3NcIixcbiAgW1NPTEFOQV9FUlJPUl9fQUNDT1VOVFNfX0ZBSUxFRF9UT19ERUNPREVfQUNDT1VOVF06IFwiRmFpbGVkIHRvIGRlY29kZSBhY2NvdW50IGRhdGEgYXQgYWRkcmVzczogJGFkZHJlc3NcIixcbiAgW1NPTEFOQV9FUlJPUl9fQUNDT1VOVFNfX09ORV9PUl9NT1JFX0FDQ09VTlRTX05PVF9GT1VORF06IFwiQWNjb3VudHMgbm90IGZvdW5kIGF0IGFkZHJlc3NlczogJGFkZHJlc3Nlc1wiLFxuICBbU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX0ZBSUxFRF9UT19GSU5EX1ZJQUJMRV9QREFfQlVNUF9TRUVEXTogXCJVbmFibGUgdG8gZmluZCBhIHZpYWJsZSBwcm9ncmFtIGFkZHJlc3MgYnVtcCBzZWVkLlwiLFxuICBbU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX0lOVkFMSURfQkFTRTU4X0VOQ09ERURfQUREUkVTU106IFwiJHB1dGF0aXZlQWRkcmVzcyBpcyBub3QgYSBiYXNlNTgtZW5jb2RlZCBhZGRyZXNzLlwiLFxuICBbU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX0lOVkFMSURfQllURV9MRU5HVEhdOiBcIkV4cGVjdGVkIGJhc2U1OCBlbmNvZGVkIGFkZHJlc3MgdG8gZGVjb2RlIHRvIGEgYnl0ZSBhcnJheSBvZiBsZW5ndGggMzIuIEFjdHVhbCBsZW5ndGg6ICRhY3R1YWxMZW5ndGguXCIsXG4gIFtTT0xBTkFfRVJST1JfX0FERFJFU1NFU19fSU5WQUxJRF9FRDI1NTE5X1BVQkxJQ19LRVldOiBcIlRoZSBgQ3J5cHRvS2V5YCBtdXN0IGJlIGFuIGBFZDI1NTE5YCBwdWJsaWMga2V5LlwiLFxuICBbU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX0lOVkFMSURfT0ZGX0NVUlZFX0FERFJFU1NdOiBcIiRwdXRhdGl2ZU9mZkN1cnZlQWRkcmVzcyBpcyBub3QgYSBiYXNlNTgtZW5jb2RlZCBvZmYtY3VydmUgYWRkcmVzcy5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19JTlZBTElEX1NFRURTX1BPSU5UX09OX0NVUlZFXTogXCJJbnZhbGlkIHNlZWRzOyBwb2ludCBtdXN0IGZhbGwgb2ZmIHRoZSBFZDI1NTE5IGN1cnZlLlwiLFxuICBbU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX01BTEZPUk1FRF9QREFdOiBcIkV4cGVjdGVkIGdpdmVuIHByb2dyYW0gZGVyaXZlZCBhZGRyZXNzIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBmb3JtYXQ6IFtBZGRyZXNzLCBQcm9ncmFtRGVyaXZlZEFkZHJlc3NCdW1wXS5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19NQVhfTlVNQkVSX09GX1BEQV9TRUVEU19FWENFRURFRF06IFwiQSBtYXhpbXVtIG9mICRtYXhTZWVkcyBzZWVkcywgaW5jbHVkaW5nIHRoZSBidW1wIHNlZWQsIG1heSBiZSBzdXBwbGllZCB3aGVuIGNyZWF0aW5nIGFuIGFkZHJlc3MuIFJlY2VpdmVkOiAkYWN0dWFsLlwiLFxuICBbU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX01BWF9QREFfU0VFRF9MRU5HVEhfRVhDRUVERURdOiBcIlRoZSBzZWVkIGF0IGluZGV4ICRpbmRleCB3aXRoIGxlbmd0aCAkYWN0dWFsIGV4Y2VlZHMgdGhlIG1heGltdW0gbGVuZ3RoIG9mICRtYXhTZWVkTGVuZ3RoIGJ5dGVzLlwiLFxuICBbU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX1BEQV9CVU1QX1NFRURfT1VUX09GX1JBTkdFXTogXCJFeHBlY3RlZCBwcm9ncmFtIGRlcml2ZWQgYWRkcmVzcyBidW1wIHRvIGJlIGluIHRoZSByYW5nZSBbMCwgMjU1XSwgZ290OiAkYnVtcC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19QREFfRU5EU19XSVRIX1BEQV9NQVJLRVJdOiBcIlByb2dyYW0gYWRkcmVzcyBjYW5ub3QgZW5kIHdpdGggUERBIG1hcmtlci5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19TVFJJTkdfTEVOR1RIX09VVF9PRl9SQU5HRV06IFwiRXhwZWN0ZWQgYmFzZTU4LWVuY29kZWQgYWRkcmVzcyBzdHJpbmcgb2YgbGVuZ3RoIGluIHRoZSByYW5nZSBbMzIsIDQ0XS4gQWN0dWFsIGxlbmd0aDogJGFjdHVhbExlbmd0aC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQkxPQ0tIQVNIX1NUUklOR19MRU5HVEhfT1VUX09GX1JBTkdFXTogXCJFeHBlY3RlZCBiYXNlNTgtZW5jb2RlZCBibG9ja2FzaCBzdHJpbmcgb2YgbGVuZ3RoIGluIHRoZSByYW5nZSBbMzIsIDQ0XS4gQWN0dWFsIGxlbmd0aDogJGFjdHVhbExlbmd0aC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQkxPQ0tfSEVJR0hUX0VYQ0VFREVEXTogXCJUaGUgbmV0d29yayBoYXMgcHJvZ3Jlc3NlZCBwYXN0IHRoZSBsYXN0IGJsb2NrIGZvciB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGNvdWxkIGhhdmUgYmVlbiBjb21taXR0ZWQuXCIsXG4gIFtTT0xBTkFfRVJST1JfX0NPREVDU19fQ0FOTk9UX0RFQ09ERV9FTVBUWV9CWVRFX0FSUkFZXTogXCJDb2RlYyBbJGNvZGVjRGVzY3JpcHRpb25dIGNhbm5vdCBkZWNvZGUgZW1wdHkgYnl0ZSBhcnJheXMuXCIsXG4gIFtTT0xBTkFfRVJST1JfX0NPREVDU19fQ0FOTk9UX1VTRV9MRVhJQ0FMX1ZBTFVFU19BU19FTlVNX0RJU0NSSU1JTkFUT1JTXTogXCJFbnVtIGNvZGVjIGNhbm5vdCB1c2UgbGV4aWNhbCB2YWx1ZXMgWyRzdHJpbmdWYWx1ZXNdIGFzIGRpc2NyaW1pbmF0b3JzLiBFaXRoZXIgcmVtb3ZlIGFsbCBsZXhpY2FsIHZhbHVlcyBvciBzZXQgYHVzZVZhbHVlc0FzRGlzY3JpbWluYXRvcnNgIHRvIGBmYWxzZWAuXCIsXG4gIFtTT0xBTkFfRVJST1JfX0NPREVDU19fRU5DT0RFRF9CWVRFU19NVVNUX05PVF9JTkNMVURFX1NFTlRJTkVMXTogXCJTZW50aW5lbCBbJGhleFNlbnRpbmVsXSBtdXN0IG5vdCBiZSBwcmVzZW50IGluIGVuY29kZWQgYnl0ZXMgWyRoZXhFbmNvZGVkQnl0ZXNdLlwiLFxuICBbU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VOQ09ERVJfREVDT0RFUl9GSVhFRF9TSVpFX01JU01BVENIXTogXCJFbmNvZGVyIGFuZCBkZWNvZGVyIG11c3QgaGF2ZSB0aGUgc2FtZSBmaXhlZCBzaXplLCBnb3QgWyRlbmNvZGVyRml4ZWRTaXplXSBhbmQgWyRkZWNvZGVyRml4ZWRTaXplXS5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQ09ERUNTX19FTkNPREVSX0RFQ09ERVJfTUFYX1NJWkVfTUlTTUFUQ0hdOiBcIkVuY29kZXIgYW5kIGRlY29kZXIgbXVzdCBoYXZlIHRoZSBzYW1lIG1heCBzaXplLCBnb3QgWyRlbmNvZGVyTWF4U2l6ZV0gYW5kIFskZGVjb2Rlck1heFNpemVdLlwiLFxuICBbU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VOQ09ERVJfREVDT0RFUl9TSVpFX0NPTVBBVElCSUxJVFlfTUlTTUFUQ0hdOiBcIkVuY29kZXIgYW5kIGRlY29kZXIgbXVzdCBlaXRoZXIgYm90aCBiZSBmaXhlZC1zaXplIG9yIHZhcmlhYmxlLXNpemUuXCIsXG4gIFtTT0xBTkFfRVJST1JfX0NPREVDU19fRU5VTV9ESVNDUklNSU5BVE9SX09VVF9PRl9SQU5HRV06IFwiRW51bSBkaXNjcmltaW5hdG9yIG91dCBvZiByYW5nZS4gRXhwZWN0ZWQgYSBudW1iZXIgaW4gWyRmb3JtYXR0ZWRWYWxpZERpc2NyaW1pbmF0b3JzXSwgZ290ICRkaXNjcmltaW5hdG9yLlwiLFxuICBbU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VYUEVDVEVEX0ZJWEVEX0xFTkdUSF06IFwiRXhwZWN0ZWQgYSBmaXhlZC1zaXplIGNvZGVjLCBnb3QgYSB2YXJpYWJsZS1zaXplIG9uZS5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQ09ERUNTX19FWFBFQ1RFRF9QT1NJVElWRV9CWVRFX0xFTkdUSF06IFwiQ29kZWMgWyRjb2RlY0Rlc2NyaXB0aW9uXSBleHBlY3RlZCBhIHBvc2l0aXZlIGJ5dGUgbGVuZ3RoLCBnb3QgJGJ5dGVzTGVuZ3RoLlwiLFxuICBbU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VYUEVDVEVEX1ZBUklBQkxFX0xFTkdUSF06IFwiRXhwZWN0ZWQgYSB2YXJpYWJsZS1zaXplIGNvZGVjLCBnb3QgYSBmaXhlZC1zaXplIG9uZS5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQ09ERUNTX19FWFBFQ1RFRF9aRVJPX1ZBTFVFX1RPX01BVENIX0lURU1fRklYRURfU0laRV06IFwiQ29kZWMgWyRjb2RlY0Rlc2NyaXB0aW9uXSBleHBlY3RlZCB6ZXJvLXZhbHVlIFskaGV4WmVyb1ZhbHVlXSB0byBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIHByb3ZpZGVkIGZpeGVkLXNpemUgaXRlbSBbJGV4cGVjdGVkU2l6ZSBieXRlc10uXCIsXG4gIFtTT0xBTkFfRVJST1JfX0NPREVDU19fSU5WQUxJRF9CWVRFX0xFTkdUSF06IFwiQ29kZWMgWyRjb2RlY0Rlc2NyaXB0aW9uXSBleHBlY3RlZCAkZXhwZWN0ZWQgYnl0ZXMsIGdvdCAkYnl0ZXNMZW5ndGguXCIsXG4gIFtTT0xBTkFfRVJST1JfX0NPREVDU19fSU5WQUxJRF9DT05TVEFOVF06IFwiRXhwZWN0ZWQgYnl0ZSBhcnJheSBjb25zdGFudCBbJGhleENvbnN0YW50XSB0byBiZSBwcmVzZW50IGluIGRhdGEgWyRoZXhEYXRhXSBhdCBvZmZzZXQgWyRvZmZzZXRdLlwiLFxuICBbU09MQU5BX0VSUk9SX19DT0RFQ1NfX0lOVkFMSURfRElTQ1JJTUlOQVRFRF9VTklPTl9WQVJJQU5UXTogXCJJbnZhbGlkIGRpc2NyaW1pbmF0ZWQgdW5pb24gdmFyaWFudC4gRXhwZWN0ZWQgb25lIG9mIFskdmFyaWFudHNdLCBnb3QgJHZhbHVlLlwiLFxuICBbU09MQU5BX0VSUk9SX19DT0RFQ1NfX0lOVkFMSURfRU5VTV9WQVJJQU5UXTogXCJJbnZhbGlkIGVudW0gdmFyaWFudC4gRXhwZWN0ZWQgb25lIG9mIFskc3RyaW5nVmFsdWVzXSBvciBhIG51bWJlciBpbiBbJGZvcm1hdHRlZE51bWVyaWNhbFZhbHVlc10sIGdvdCAkdmFyaWFudC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQ09ERUNTX19JTlZBTElEX0xJVEVSQUxfVU5JT05fVkFSSUFOVF06IFwiSW52YWxpZCBsaXRlcmFsIHVuaW9uIHZhcmlhbnQuIEV4cGVjdGVkIG9uZSBvZiBbJHZhcmlhbnRzXSwgZ290ICR2YWx1ZS5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQ09ERUNTX19JTlZBTElEX05VTUJFUl9PRl9JVEVNU106IFwiRXhwZWN0ZWQgWyRjb2RlY0Rlc2NyaXB0aW9uXSB0byBoYXZlICRleHBlY3RlZCBpdGVtcywgZ290ICRhY3R1YWwuXCIsXG4gIFtTT0xBTkFfRVJST1JfX0NPREVDU19fSU5WQUxJRF9TVFJJTkdfRk9SX0JBU0VdOiBcIkludmFsaWQgdmFsdWUgJHZhbHVlIGZvciBiYXNlICRiYXNlIHdpdGggYWxwaGFiZXQgJGFscGhhYmV0LlwiLFxuICBbU09MQU5BX0VSUk9SX19DT0RFQ1NfX0xJVEVSQUxfVU5JT05fRElTQ1JJTUlOQVRPUl9PVVRfT0ZfUkFOR0VdOiBcIkxpdGVyYWwgdW5pb24gZGlzY3JpbWluYXRvciBvdXQgb2YgcmFuZ2UuIEV4cGVjdGVkIGEgbnVtYmVyIGJldHdlZW4gJG1pblJhbmdlIGFuZCAkbWF4UmFuZ2UsIGdvdCAkZGlzY3JpbWluYXRvci5cIixcbiAgW1NPTEFOQV9FUlJPUl9fQ09ERUNTX19OVU1CRVJfT1VUX09GX1JBTkdFXTogXCJDb2RlYyBbJGNvZGVjRGVzY3JpcHRpb25dIGV4cGVjdGVkIG51bWJlciB0byBiZSBpbiB0aGUgcmFuZ2UgWyRtaW4sICRtYXhdLCBnb3QgJHZhbHVlLlwiLFxuICBbU09MQU5BX0VSUk9SX19DT0RFQ1NfX09GRlNFVF9PVVRfT0ZfUkFOR0VdOiBcIkNvZGVjIFskY29kZWNEZXNjcmlwdGlvbl0gZXhwZWN0ZWQgb2Zmc2V0IHRvIGJlIGluIHRoZSByYW5nZSBbMCwgJGJ5dGVzTGVuZ3RoXSwgZ290ICRvZmZzZXQuXCIsXG4gIFtTT0xBTkFfRVJST1JfX0NPREVDU19fU0VOVElORUxfTUlTU0lOR19JTl9ERUNPREVEX0JZVEVTXTogXCJFeHBlY3RlZCBzZW50aW5lbCBbJGhleFNlbnRpbmVsXSB0byBiZSBwcmVzZW50IGluIGRlY29kZWQgYnl0ZXMgWyRoZXhEZWNvZGVkQnl0ZXNdLlwiLFxuICBbU09MQU5BX0VSUk9SX19DT0RFQ1NfX1VOSU9OX1ZBUklBTlRfT1VUX09GX1JBTkdFXTogXCJVbmlvbiB2YXJpYW50IG91dCBvZiByYW5nZS4gRXhwZWN0ZWQgYW4gaW5kZXggYmV0d2VlbiAkbWluUmFuZ2UgYW5kICRtYXhSYW5nZSwgZ290ICR2YXJpYW50LlwiLFxuICBbU09MQU5BX0VSUk9SX19DUllQVE9fX1JBTkRPTV9WQUxVRVNfRlVOQ1RJT05fVU5JTVBMRU1FTlRFRF06IFwiTm8gcmFuZG9tIHZhbHVlcyBpbXBsZW1lbnRhdGlvbiBjb3VsZCBiZSBmb3VuZC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0FDQ09VTlRfQUxSRUFEWV9JTklUSUFMSVpFRF06IFwiaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgYW4gdW5pbml0aWFsaXplZCBhY2NvdW50XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19BQ0NPVU5UX0JPUlJPV19GQUlMRURdOiBcImluc3RydWN0aW9uIHRyaWVzIHRvIGJvcnJvdyByZWZlcmVuY2UgZm9yIGFuIGFjY291bnQgd2hpY2ggaXMgYWxyZWFkeSBib3Jyb3dlZFwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9CT1JST1dfT1VUU1RBTkRJTkddOiBcImluc3RydWN0aW9uIGxlZnQgYWNjb3VudCB3aXRoIGFuIG91dHN0YW5kaW5nIGJvcnJvd2VkIHJlZmVyZW5jZVwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9EQVRBX1NJWkVfQ0hBTkdFRF06IFwicHJvZ3JhbSBvdGhlciB0aGFuIHRoZSBhY2NvdW50J3Mgb3duZXIgY2hhbmdlZCB0aGUgc2l6ZSBvZiB0aGUgYWNjb3VudCBkYXRhXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19BQ0NPVU5UX0RBVEFfVE9PX1NNQUxMXTogXCJhY2NvdW50IGRhdGEgdG9vIHNtYWxsIGZvciBpbnN0cnVjdGlvblwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9OT1RfRVhFQ1VUQUJMRV06IFwiaW5zdHJ1Y3Rpb24gZXhwZWN0ZWQgYW4gZXhlY3V0YWJsZSBhY2NvdW50XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19BQ0NPVU5UX05PVF9SRU5UX0VYRU1QVF06IFwiQW4gYWNjb3VudCBkb2VzIG5vdCBoYXZlIGVub3VnaCBsYW1wb3J0cyB0byBiZSByZW50LWV4ZW1wdFwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQVJJVEhNRVRJQ19PVkVSRkxPV106IFwiUHJvZ3JhbSBhcml0aG1ldGljIG92ZXJmbG93ZWRcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0JPUlNIX0lPX0VSUk9SXTogXCJGYWlsZWQgdG8gc2VyaWFsaXplIG9yIGRlc2VyaWFsaXplIGFjY291bnQgZGF0YTogJGVuY29kZWREYXRhXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19CVUlMVElOX1BST0dSQU1TX01VU1RfQ09OU1VNRV9DT01QVVRFX1VOSVRTXTogXCJCdWlsdGluIHByb2dyYW1zIG11c3QgY29uc3VtZSBjb21wdXRlIHVuaXRzXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19DQUxMX0RFUFRIXTogXCJDcm9zcy1wcm9ncmFtIGludm9jYXRpb24gY2FsbCBkZXB0aCB0b28gZGVlcFwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQ09NUFVUQVRJT05BTF9CVURHRVRfRVhDRUVERURdOiBcIkNvbXB1dGF0aW9uYWwgYnVkZ2V0IGV4Y2VlZGVkXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19DVVNUT01dOiBcImN1c3RvbSBwcm9ncmFtIGVycm9yOiAjJGNvZGVcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0RVUExJQ0FURV9BQ0NPVU5UX0lOREVYXTogXCJpbnN0cnVjdGlvbiBjb250YWlucyBkdXBsaWNhdGUgYWNjb3VudHNcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0RVUExJQ0FURV9BQ0NPVU5UX09VVF9PRl9TWU5DXTogXCJpbnN0cnVjdGlvbiBtb2RpZmljYXRpb25zIG9mIG11bHRpcGx5LXBhc3NlZCBhY2NvdW50IGRpZmZlclwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fRVhFQ1VUQUJMRV9BQ0NPVU5UX05PVF9SRU5UX0VYRU1QVF06IFwiZXhlY3V0YWJsZSBhY2NvdW50cyBtdXN0IGJlIHJlbnQgZXhlbXB0XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19FWEVDVVRBQkxFX0RBVEFfTU9ESUZJRURdOiBcImluc3RydWN0aW9uIGNoYW5nZWQgZXhlY3V0YWJsZSBhY2NvdW50cyBkYXRhXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19FWEVDVVRBQkxFX0xBTVBPUlRfQ0hBTkdFXTogXCJpbnN0cnVjdGlvbiBjaGFuZ2VkIHRoZSBiYWxhbmNlIG9mIGFuIGV4ZWN1dGFibGUgYWNjb3VudFwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fRVhFQ1VUQUJMRV9NT0RJRklFRF06IFwiaW5zdHJ1Y3Rpb24gY2hhbmdlZCBleGVjdXRhYmxlIGJpdCBvZiBhbiBhY2NvdW50XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19FWFRFUk5BTF9BQ0NPVU5UX0RBVEFfTU9ESUZJRURdOiBcImluc3RydWN0aW9uIG1vZGlmaWVkIGRhdGEgb2YgYW4gYWNjb3VudCBpdCBkb2VzIG5vdCBvd25cIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0VYVEVSTkFMX0FDQ09VTlRfTEFNUE9SVF9TUEVORF06IFwiaW5zdHJ1Y3Rpb24gc3BlbnQgZnJvbSB0aGUgYmFsYW5jZSBvZiBhbiBhY2NvdW50IGl0IGRvZXMgbm90IG93blwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fR0VORVJJQ19FUlJPUl06IFwiZ2VuZXJpYyBpbnN0cnVjdGlvbiBlcnJvclwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSUxMRUdBTF9PV05FUl06IFwiUHJvdmlkZWQgb3duZXIgaXMgbm90IGFsbG93ZWRcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lNTVVUQUJMRV06IFwiQWNjb3VudCBpcyBpbW11dGFibGVcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lOQ09SUkVDVF9BVVRIT1JJVFldOiBcIkluY29ycmVjdCBhdXRob3JpdHkgcHJvdmlkZWRcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lOQ09SUkVDVF9QUk9HUkFNX0lEXTogXCJpbmNvcnJlY3QgcHJvZ3JhbSBpZCBmb3IgaW5zdHJ1Y3Rpb25cIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lOU1VGRklDSUVOVF9GVU5EU106IFwiaW5zdWZmaWNpZW50IGZ1bmRzIGZvciBpbnN0cnVjdGlvblwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9BQ0NPVU5UX0RBVEFdOiBcImludmFsaWQgYWNjb3VudCBkYXRhIGZvciBpbnN0cnVjdGlvblwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9BQ0NPVU5UX09XTkVSXTogXCJJbnZhbGlkIGFjY291bnQgb3duZXJcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lOVkFMSURfQVJHVU1FTlRdOiBcImludmFsaWQgcHJvZ3JhbSBhcmd1bWVudFwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9FUlJPUl06IFwicHJvZ3JhbSByZXR1cm5lZCBpbnZhbGlkIGVycm9yIGNvZGVcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lOVkFMSURfSU5TVFJVQ1RJT05fREFUQV06IFwiaW52YWxpZCBpbnN0cnVjdGlvbiBkYXRhXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19JTlZBTElEX1JFQUxMT0NdOiBcIkZhaWxlZCB0byByZWFsbG9jYXRlIGFjY291bnQgZGF0YVwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9TRUVEU106IFwiUHJvdmlkZWQgc2VlZHMgZG8gbm90IHJlc3VsdCBpbiBhIHZhbGlkIGFkZHJlc3NcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX01BWF9BQ0NPVU5UU19EQVRBX0FMTE9DQVRJT05TX0VYQ0VFREVEXTogXCJBY2NvdW50cyBkYXRhIGFsbG9jYXRpb25zIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIGFsbG93ZWQgcGVyIHRyYW5zYWN0aW9uXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19NQVhfQUNDT1VOVFNfRVhDRUVERURdOiBcIk1heCBhY2NvdW50cyBleGNlZWRlZFwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fTUFYX0lOU1RSVUNUSU9OX1RSQUNFX0xFTkdUSF9FWENFRURFRF06IFwiTWF4IGluc3RydWN0aW9uIHRyYWNlIGxlbmd0aCBleGNlZWRlZFwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fTUFYX1NFRURfTEVOR1RIX0VYQ0VFREVEXTogXCJMZW5ndGggb2YgdGhlIHNlZWQgaXMgdG9vIGxvbmcgZm9yIGFkZHJlc3MgZ2VuZXJhdGlvblwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fTUlTU0lOR19BQ0NPVU5UXTogXCJBbiBhY2NvdW50IHJlcXVpcmVkIGJ5IHRoZSBpbnN0cnVjdGlvbiBpcyBtaXNzaW5nXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19NSVNTSU5HX1JFUVVJUkVEX1NJR05BVFVSRV06IFwibWlzc2luZyByZXF1aXJlZCBzaWduYXR1cmUgZm9yIGluc3RydWN0aW9uXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19NT0RJRklFRF9QUk9HUkFNX0lEXTogXCJpbnN0cnVjdGlvbiBpbGxlZ2FsbHkgbW9kaWZpZWQgdGhlIHByb2dyYW0gaWQgb2YgYW4gYWNjb3VudFwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fTk9UX0VOT1VHSF9BQ0NPVU5UX0tFWVNdOiBcImluc3VmZmljaWVudCBhY2NvdW50IGtleXMgZm9yIGluc3RydWN0aW9uXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19QUklWSUxFR0VfRVNDQUxBVElPTl06IFwiQ3Jvc3MtcHJvZ3JhbSBpbnZvY2F0aW9uIHdpdGggdW5hdXRob3JpemVkIHNpZ25lciBvciB3cml0YWJsZSBhY2NvdW50XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19QUk9HUkFNX0VOVklST05NRU5UX1NFVFVQX0ZBSUxVUkVdOiBcIkZhaWxlZCB0byBjcmVhdGUgcHJvZ3JhbSBleGVjdXRpb24gZW52aXJvbm1lbnRcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1BST0dSQU1fRkFJTEVEX1RPX0NPTVBJTEVdOiBcIlByb2dyYW0gZmFpbGVkIHRvIGNvbXBpbGVcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1BST0dSQU1fRkFJTEVEX1RPX0NPTVBMRVRFXTogXCJQcm9ncmFtIGZhaWxlZCB0byBjb21wbGV0ZVwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fUkVBRE9OTFlfREFUQV9NT0RJRklFRF06IFwiaW5zdHJ1Y3Rpb24gbW9kaWZpZWQgZGF0YSBvZiBhIHJlYWQtb25seSBhY2NvdW50XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19SRUFET05MWV9MQU1QT1JUX0NIQU5HRV06IFwiaW5zdHJ1Y3Rpb24gY2hhbmdlZCB0aGUgYmFsYW5jZSBvZiBhIHJlYWQtb25seSBhY2NvdW50XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19SRUVOVFJBTkNZX05PVF9BTExPV0VEXTogXCJDcm9zcy1wcm9ncmFtIGludm9jYXRpb24gcmVlbnRyYW5jeSBub3QgYWxsb3dlZCBmb3IgdGhpcyBpbnN0cnVjdGlvblwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fUkVOVF9FUE9DSF9NT0RJRklFRF06IFwiaW5zdHJ1Y3Rpb24gbW9kaWZpZWQgcmVudCBlcG9jaCBvZiBhbiBhY2NvdW50XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19VTkJBTEFOQ0VEX0lOU1RSVUNUSU9OXTogXCJzdW0gb2YgYWNjb3VudCBiYWxhbmNlcyBiZWZvcmUgYW5kIGFmdGVyIGluc3RydWN0aW9uIGRvIG5vdCBtYXRjaFwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fVU5JTklUSUFMSVpFRF9BQ0NPVU5UXTogXCJpbnN0cnVjdGlvbiByZXF1aXJlcyBhbiBpbml0aWFsaXplZCBhY2NvdW50XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19VTktOT1dOXTogXCJcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1VOU1VQUE9SVEVEX1BST0dSQU1fSURdOiBcIlVuc3VwcG9ydGVkIHByb2dyYW0gaWRcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1VOU1VQUE9SVEVEX1NZU1ZBUl06IFwiVW5zdXBwb3J0ZWQgc3lzdmFyXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX19FWFBFQ1RFRF9UT19IQVZFX0FDQ09VTlRTXTogXCJUaGUgaW5zdHJ1Y3Rpb24gZG9lcyBub3QgaGF2ZSBhbnkgYWNjb3VudHMuXCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX19FWFBFQ1RFRF9UT19IQVZFX0RBVEFdOiBcIlRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGFueSBkYXRhLlwiLFxuICBbU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9fUFJPR1JBTV9JRF9NSVNNQVRDSF06IFwiRXhwZWN0ZWQgaW5zdHJ1Y3Rpb24gdG8gaGF2ZSBwcm9ncmVzcyBhZGRyZXNzICRleHBlY3RlZFByb2dyYW1BZGRyZXNzLCBnb3QgJGFjdHVhbFByb2dyYW1BZGRyZXNzLlwiLFxuICBbU09MQU5BX0VSUk9SX19JTlZBTElEX0JMT0NLSEFTSF9CWVRFX0xFTkdUSF06IFwiRXhwZWN0ZWQgYmFzZTU4IGVuY29kZWQgYmxvY2toYXNoIHRvIGRlY29kZSB0byBhIGJ5dGUgYXJyYXkgb2YgbGVuZ3RoIDMyLiBBY3R1YWwgbGVuZ3RoOiAkYWN0dWFsTGVuZ3RoLlwiLFxuICBbU09MQU5BX0VSUk9SX19JTlZBTElEX05PTkNFXTogXCJUaGUgbm9uY2UgYCRleHBlY3RlZE5vbmNlVmFsdWVgIGlzIG5vIGxvbmdlciB2YWxpZC4gSXQgaGFzIGFkdmFuY2VkIHRvIGAkYWN0dWFsTm9uY2VWYWx1ZWBcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5WQVJJQU5UX1ZJT0xBVElPTl9fQ0FDSEVEX0FCT1JUQUJMRV9JVEVSQUJMRV9DQUNIRV9FTlRSWV9NSVNTSU5HXTogXCJJbnZhcmlhbnQgdmlvbGF0aW9uOiBGb3VuZCBubyBhYm9ydGFibGUgaXRlcmFibGUgY2FjaGUgZW50cnkgZm9yIGtleSBgJGNhY2hlS2V5YC4gSXQgc2hvdWxkIGJlIGltcG9zc2libGUgdG8gaGl0IHRoaXMgZXJyb3I7IHBsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vc29sYS5uYS93ZWIzaW52YXJpYW50XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOVkFSSUFOVF9WSU9MQVRJT05fX0RBVEFfUFVCTElTSEVSX0NIQU5ORUxfVU5JTVBMRU1FTlRFRF06IFwiSW52YXJpYW50IHZpb2xhdGlvbjogVGhpcyBkYXRhIHB1Ymxpc2hlciBkb2VzIG5vdCBwdWJsaXNoIHRvIHRoZSBjaGFubmVsIG5hbWVkIGAkY2hhbm5lbE5hbWVgLiBTdXBwb3J0ZWQgY2hhbm5lbHMgaW5jbHVkZSAkc3VwcG9ydGVkQ2hhbm5lbE5hbWVzLlwiLFxuICBbU09MQU5BX0VSUk9SX19JTlZBUklBTlRfVklPTEFUSU9OX19TVUJTQ1JJUFRJT05fSVRFUkFUT1JfTVVTVF9OT1RfUE9MTF9CRUZPUkVfUkVTT0xWSU5HX0VYSVNUSU5HX01FU1NBR0VfUFJPTUlTRV06IFwiSW52YXJpYW50IHZpb2xhdGlvbjogV2ViU29ja2V0IG1lc3NhZ2UgaXRlcmF0b3Igc3RhdGUgaXMgY29ycnVwdDsgaXRlcmF0ZWQgd2l0aG91dCBmaXJzdCByZXNvbHZpbmcgZXhpc3RpbmcgbWVzc2FnZSBwcm9taXNlLiBJdCBzaG91bGQgYmUgaW1wb3NzaWJsZSB0byBoaXQgdGhpcyBlcnJvcjsgcGxlYXNlIGZpbGUgYW4gaXNzdWUgYXQgaHR0cHM6Ly9zb2xhLm5hL3dlYjNpbnZhcmlhbnRcIixcbiAgW1NPTEFOQV9FUlJPUl9fSU5WQVJJQU5UX1ZJT0xBVElPTl9fU1VCU0NSSVBUSU9OX0lURVJBVE9SX1NUQVRFX01JU1NJTkddOiBcIkludmFyaWFudCB2aW9sYXRpb246IFdlYlNvY2tldCBtZXNzYWdlIGl0ZXJhdG9yIGlzIG1pc3Npbmcgc3RhdGUgc3RvcmFnZS4gSXQgc2hvdWxkIGJlIGltcG9zc2libGUgdG8gaGl0IHRoaXMgZXJyb3I7IHBsZWFzZSBmaWxlIGFuIGlzc3VlIGF0IGh0dHBzOi8vc29sYS5uYS93ZWIzaW52YXJpYW50XCIsXG4gIFtTT0xBTkFfRVJST1JfX0lOVkFSSUFOVF9WSU9MQVRJT05fX1NXSVRDSF9NVVNUX0JFX0VYSEFVU1RJVkVdOiBcIkludmFyaWFudCB2aW9sYXRpb246IFN3aXRjaCBzdGF0ZW1lbnQgbm9uLWV4aGF1c3RpdmUuIFJlY2VpdmVkIHVuZXhwZWN0ZWQgdmFsdWUgYCR1bmV4cGVjdGVkVmFsdWVgLiBJdCBzaG91bGQgYmUgaW1wb3NzaWJsZSB0byBoaXQgdGhpcyBlcnJvcjsgcGxlYXNlIGZpbGUgYW4gaXNzdWUgYXQgaHR0cHM6Ly9zb2xhLm5hL3dlYjNpbnZhcmlhbnRcIixcbiAgW1NPTEFOQV9FUlJPUl9fSlNPTl9SUENfX0lOVEVSTkFMX0VSUk9SXTogXCJKU09OLVJQQyBlcnJvcjogSW50ZXJuYWwgSlNPTi1SUEMgZXJyb3IgKCRfX3NlcnZlck1lc3NhZ2UpXCIsXG4gIFtTT0xBTkFfRVJST1JfX0pTT05fUlBDX19JTlZBTElEX1BBUkFNU106IFwiSlNPTi1SUEMgZXJyb3I6IEludmFsaWQgbWV0aG9kIHBhcmFtZXRlcihzKSAoJF9fc2VydmVyTWVzc2FnZSlcIixcbiAgW1NPTEFOQV9FUlJPUl9fSlNPTl9SUENfX0lOVkFMSURfUkVRVUVTVF06IFwiSlNPTi1SUEMgZXJyb3I6IFRoZSBKU09OIHNlbnQgaXMgbm90IGEgdmFsaWQgYFJlcXVlc3RgIG9iamVjdCAoJF9fc2VydmVyTWVzc2FnZSlcIixcbiAgW1NPTEFOQV9FUlJPUl9fSlNPTl9SUENfX01FVEhPRF9OT1RfRk9VTkRdOiBcIkpTT04tUlBDIGVycm9yOiBUaGUgbWV0aG9kIGRvZXMgbm90IGV4aXN0IC8gaXMgbm90IGF2YWlsYWJsZSAoJF9fc2VydmVyTWVzc2FnZSlcIixcbiAgW1NPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1BBUlNFX0VSUk9SXTogXCJKU09OLVJQQyBlcnJvcjogQW4gZXJyb3Igb2NjdXJyZWQgb24gdGhlIHNlcnZlciB3aGlsZSBwYXJzaW5nIHRoZSBKU09OIHRleHQgKCRfX3NlcnZlck1lc3NhZ2UpXCIsXG4gIFtTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TQ0FOX0VSUk9SXTogXCIkX19zZXJ2ZXJNZXNzYWdlXCIsXG4gIFtTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfQkxPQ0tfQ0xFQU5FRF9VUF06IFwiJF9fc2VydmVyTWVzc2FnZVwiLFxuICBbU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX0JMT0NLX05PVF9BVkFJTEFCTEVdOiBcIiRfX3NlcnZlck1lc3NhZ2VcIixcbiAgW1NPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9CTE9DS19TVEFUVVNfTk9UX0FWQUlMQUJMRV9ZRVRdOiBcIiRfX3NlcnZlck1lc3NhZ2VcIixcbiAgW1NPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9LRVlfRVhDTFVERURfRlJPTV9TRUNPTkRBUllfSU5ERVhdOiBcIiRfX3NlcnZlck1lc3NhZ2VcIixcbiAgW1NPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9MT05HX1RFUk1fU1RPUkFHRV9TTE9UX1NLSVBQRURdOiBcIiRfX3NlcnZlck1lc3NhZ2VcIixcbiAgW1NPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9NSU5fQ09OVEVYVF9TTE9UX05PVF9SRUFDSEVEXTogXCJNaW5pbXVtIGNvbnRleHQgc2xvdCBoYXMgbm90IGJlZW4gcmVhY2hlZFwiLFxuICBbU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX05PREVfVU5IRUFMVEhZXTogXCJOb2RlIGlzIHVuaGVhbHRoeTsgYmVoaW5kIGJ5ICRudW1TbG90c0JlaGluZCBzbG90c1wiLFxuICBbU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX05PX1NOQVBTSE9UXTogXCJObyBzbmFwc2hvdFwiLFxuICBbU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX1NFTkRfVFJBTlNBQ1RJT05fUFJFRkxJR0hUX0ZBSUxVUkVdOiBcIlRyYW5zYWN0aW9uIHNpbXVsYXRpb24gZmFpbGVkXCIsXG4gIFtTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfU0xPVF9TS0lQUEVEXTogXCIkX19zZXJ2ZXJNZXNzYWdlXCIsXG4gIFtTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfVFJBTlNBQ1RJT05fSElTVE9SWV9OT1RfQVZBSUxBQkxFXTogXCJUcmFuc2FjdGlvbiBoaXN0b3J5IGlzIG5vdCBhdmFpbGFibGUgZnJvbSB0aGlzIG5vZGVcIixcbiAgW1NPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9UUkFOU0FDVElPTl9QUkVDT01QSUxFX1ZFUklGSUNBVElPTl9GQUlMVVJFXTogXCIkX19zZXJ2ZXJNZXNzYWdlXCIsXG4gIFtTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfVFJBTlNBQ1RJT05fU0lHTkFUVVJFX0xFTl9NSVNNQVRDSF06IFwiVHJhbnNhY3Rpb24gc2lnbmF0dXJlIGxlbmd0aCBtaXNtYXRjaFwiLFxuICBbU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX1RSQU5TQUNUSU9OX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTFVSRV06IFwiVHJhbnNhY3Rpb24gc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBmYWlsdXJlXCIsXG4gIFtTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfVU5TVVBQT1JURURfVFJBTlNBQ1RJT05fVkVSU0lPTl06IFwiJF9fc2VydmVyTWVzc2FnZVwiLFxuICBbU09MQU5BX0VSUk9SX19LRVlTX19JTlZBTElEX0tFWV9QQUlSX0JZVEVfTEVOR1RIXTogXCJLZXkgcGFpciBieXRlcyBtdXN0IGJlIG9mIGxlbmd0aCA2NCwgZ290ICRieXRlTGVuZ3RoLlwiLFxuICBbU09MQU5BX0VSUk9SX19LRVlTX19JTlZBTElEX1BSSVZBVEVfS0VZX0JZVEVfTEVOR1RIXTogXCJFeHBlY3RlZCBwcml2YXRlIGtleSBieXRlcyB3aXRoIGxlbmd0aCAzMi4gQWN0dWFsIGxlbmd0aDogJGFjdHVhbExlbmd0aC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fS0VZU19fSU5WQUxJRF9TSUdOQVRVUkVfQllURV9MRU5HVEhdOiBcIkV4cGVjdGVkIGJhc2U1OC1lbmNvZGVkIHNpZ25hdHVyZSB0byBkZWNvZGUgdG8gYSBieXRlIGFycmF5IG9mIGxlbmd0aCA2NC4gQWN0dWFsIGxlbmd0aDogJGFjdHVhbExlbmd0aC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fS0VZU19fUFVCTElDX0tFWV9NVVNUX01BVENIX1BSSVZBVEVfS0VZXTogXCJUaGUgcHJvdmlkZWQgcHJpdmF0ZSBrZXkgZG9lcyBub3QgbWF0Y2ggdGhlIHByb3ZpZGVkIHB1YmxpYyBrZXkuXCIsXG4gIFtTT0xBTkFfRVJST1JfX0tFWVNfX1NJR05BVFVSRV9TVFJJTkdfTEVOR1RIX09VVF9PRl9SQU5HRV06IFwiRXhwZWN0ZWQgYmFzZTU4LWVuY29kZWQgc2lnbmF0dXJlIHN0cmluZyBvZiBsZW5ndGggaW4gdGhlIHJhbmdlIFs2NCwgODhdLiBBY3R1YWwgbGVuZ3RoOiAkYWN0dWFsTGVuZ3RoLlwiLFxuICBbU09MQU5BX0VSUk9SX19MQU1QT1JUU19PVVRfT0ZfUkFOR0VdOiBcIkxhbXBvcnRzIHZhbHVlIG11c3QgYmUgaW4gdGhlIHJhbmdlIFswLCAyZTY0LTFdXCIsXG4gIFtTT0xBTkFfRVJST1JfX01BTEZPUk1FRF9CSUdJTlRfU1RSSU5HXTogXCJgJHZhbHVlYCBjYW5ub3QgYmUgcGFyc2VkIGFzIGEgYEJpZ0ludGBcIixcbiAgW1NPTEFOQV9FUlJPUl9fTUFMRk9STUVEX0pTT05fUlBDX0VSUk9SXTogXCIkbWVzc2FnZVwiLFxuICBbU09MQU5BX0VSUk9SX19NQUxGT1JNRURfTlVNQkVSX1NUUklOR106IFwiYCR2YWx1ZWAgY2Fubm90IGJlIHBhcnNlZCBhcyBhIGBOdW1iZXJgXCIsXG4gIFtTT0xBTkFfRVJST1JfX05PTkNFX0FDQ09VTlRfTk9UX0ZPVU5EXTogXCJObyBub25jZSBhY2NvdW50IGNvdWxkIGJlIGZvdW5kIGF0IGFkZHJlc3MgYCRub25jZUFjY291bnRBZGRyZXNzYFwiLFxuICBbU09MQU5BX0VSUk9SX19SUENfU1VCU0NSSVBUSU9OU19fQ0FOTk9UX0NSRUFURV9TVUJTQ1JJUFRJT05fUExBTl06IFwiVGhlIG5vdGlmaWNhdGlvbiBuYW1lIG11c3QgZW5kIGluICdOb3RpZmljYXRpb25zJyBhbmQgdGhlIEFQSSBtdXN0IHN1cHBseSBhIHN1YnNjcmlwdGlvbiBwbGFuIGNyZWF0b3IgZnVuY3Rpb24gZm9yIHRoZSBub3RpZmljYXRpb24gJyRub3RpZmljYXRpb25OYW1lJy5cIixcbiAgW1NPTEFOQV9FUlJPUl9fUlBDX1NVQlNDUklQVElPTlNfX0NIQU5ORUxfQ0xPU0VEX0JFRk9SRV9NRVNTQUdFX0JVRkZFUkVEXTogXCJXZWJTb2NrZXQgd2FzIGNsb3NlZCBiZWZvcmUgcGF5bG9hZCBjb3VsZCBiZSBhZGRlZCB0byB0aGUgc2VuZCBidWZmZXJcIixcbiAgW1NPTEFOQV9FUlJPUl9fUlBDX1NVQlNDUklQVElPTlNfX0NIQU5ORUxfQ09OTkVDVElPTl9DTE9TRURdOiBcIldlYlNvY2tldCBjb25uZWN0aW9uIGNsb3NlZFwiLFxuICBbU09MQU5BX0VSUk9SX19SUENfU1VCU0NSSVBUSU9OU19fQ0hBTk5FTF9GQUlMRURfVE9fQ09OTkVDVF06IFwiV2ViU29ja2V0IGZhaWxlZCB0byBjb25uZWN0XCIsXG4gIFtTT0xBTkFfRVJST1JfX1JQQ19TVUJTQ1JJUFRJT05TX19FWFBFQ1RFRF9TRVJWRVJfU1VCU0NSSVBUSU9OX0lEXTogXCJGYWlsZWQgdG8gb2J0YWluIGEgc3Vic2NyaXB0aW9uIGlkIGZyb20gdGhlIHNlcnZlclwiLFxuICBbU09MQU5BX0VSUk9SX19SUENfX0FQSV9QTEFOX01JU1NJTkdfRk9SX1JQQ19NRVRIT0RdOiBcIkNvdWxkIG5vdCBmaW5kIGFuIEFQSSBwbGFuIGZvciBSUEMgbWV0aG9kOiBgJG1ldGhvZGBcIixcbiAgW1NPTEFOQV9FUlJPUl9fUlBDX19JTlRFR0VSX09WRVJGTE9XXTogXCJUaGUgJGFyZ3VtZW50TGFiZWwgYXJndW1lbnQgdG8gdGhlIGAkbWV0aG9kTmFtZWAgUlBDIG1ldGhvZCRvcHRpb25hbFBhdGhMYWJlbCB3YXMgYCR2YWx1ZWAuIFRoaXMgbnVtYmVyIGlzIHVuc2FmZSBmb3IgdXNlIHdpdGggdGhlIFNvbGFuYSBKU09OLVJQQyBiZWNhdXNlIGl0IGV4Y2VlZHMgYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fUlBDX19UUkFOU1BPUlRfSFRUUF9FUlJPUl06IFwiSFRUUCBlcnJvciAoJHN0YXR1c0NvZGUpOiAkbWVzc2FnZVwiLFxuICBbU09MQU5BX0VSUk9SX19SUENfX1RSQU5TUE9SVF9IVFRQX0hFQURFUl9GT1JCSURERU5dOiBcIkhUVFAgaGVhZGVyKHMpIGZvcmJpZGRlbjogJGhlYWRlcnMuIExlYXJuIG1vcmUgYXQgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9Gb3JiaWRkZW5faGVhZGVyX25hbWUuXCIsXG4gIFtTT0xBTkFfRVJST1JfX1NJR05FUl9fQUREUkVTU19DQU5OT1RfSEFWRV9NVUxUSVBMRV9TSUdORVJTXTogXCJNdWx0aXBsZSBkaXN0aW5jdCBzaWduZXJzIHdlcmUgaWRlbnRpZmllZCBmb3IgYWRkcmVzcyBgJGFkZHJlc3NgLiBQbGVhc2UgZW5zdXJlIHRoYXQgeW91IGFyZSB1c2luZyB0aGUgc2FtZSBzaWduZXIgaW5zdGFuY2UgZm9yIGVhY2ggYWRkcmVzcy5cIixcbiAgW1NPTEFOQV9FUlJPUl9fU0lHTkVSX19FWFBFQ1RFRF9LRVlfUEFJUl9TSUdORVJdOiBcIlRoZSBwcm92aWRlZCB2YWx1ZSBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGBLZXlQYWlyU2lnbmVyYCBpbnRlcmZhY2VcIixcbiAgW1NPTEFOQV9FUlJPUl9fU0lHTkVSX19FWFBFQ1RFRF9NRVNTQUdFX01PRElGWUlOR19TSUdORVJdOiBcIlRoZSBwcm92aWRlZCB2YWx1ZSBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIGBNZXNzYWdlTW9kaWZ5aW5nU2lnbmVyYCBpbnRlcmZhY2VcIixcbiAgW1NPTEFOQV9FUlJPUl9fU0lHTkVSX19FWFBFQ1RFRF9NRVNTQUdFX1BBUlRJQUxfU0lHTkVSXTogXCJUaGUgcHJvdmlkZWQgdmFsdWUgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBgTWVzc2FnZVBhcnRpYWxTaWduZXJgIGludGVyZmFjZVwiLFxuICBbU09MQU5BX0VSUk9SX19TSUdORVJfX0VYUEVDVEVEX01FU1NBR0VfU0lHTkVSXTogXCJUaGUgcHJvdmlkZWQgdmFsdWUgZG9lcyBub3QgaW1wbGVtZW50IGFueSBvZiB0aGUgYE1lc3NhZ2VTaWduZXJgIGludGVyZmFjZXNcIixcbiAgW1NPTEFOQV9FUlJPUl9fU0lHTkVSX19FWFBFQ1RFRF9UUkFOU0FDVElPTl9NT0RJRllJTkdfU0lHTkVSXTogXCJUaGUgcHJvdmlkZWQgdmFsdWUgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBgVHJhbnNhY3Rpb25Nb2RpZnlpbmdTaWduZXJgIGludGVyZmFjZVwiLFxuICBbU09MQU5BX0VSUk9SX19TSUdORVJfX0VYUEVDVEVEX1RSQU5TQUNUSU9OX1BBUlRJQUxfU0lHTkVSXTogXCJUaGUgcHJvdmlkZWQgdmFsdWUgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBgVHJhbnNhY3Rpb25QYXJ0aWFsU2lnbmVyYCBpbnRlcmZhY2VcIixcbiAgW1NPTEFOQV9FUlJPUl9fU0lHTkVSX19FWFBFQ1RFRF9UUkFOU0FDVElPTl9TRU5ESU5HX1NJR05FUl06IFwiVGhlIHByb3ZpZGVkIHZhbHVlIGRvZXMgbm90IGltcGxlbWVudCB0aGUgYFRyYW5zYWN0aW9uU2VuZGluZ1NpZ25lcmAgaW50ZXJmYWNlXCIsXG4gIFtTT0xBTkFfRVJST1JfX1NJR05FUl9fRVhQRUNURURfVFJBTlNBQ1RJT05fU0lHTkVSXTogXCJUaGUgcHJvdmlkZWQgdmFsdWUgZG9lcyBub3QgaW1wbGVtZW50IGFueSBvZiB0aGUgYFRyYW5zYWN0aW9uU2lnbmVyYCBpbnRlcmZhY2VzXCIsXG4gIFtTT0xBTkFfRVJST1JfX1NJR05FUl9fVFJBTlNBQ1RJT05fQ0FOTk9UX0hBVkVfTVVMVElQTEVfU0VORElOR19TSUdORVJTXTogXCJNb3JlIHRoYW4gb25lIGBUcmFuc2FjdGlvblNlbmRpbmdTaWduZXJgIHdhcyBpZGVudGlmaWVkLlwiLFxuICBbU09MQU5BX0VSUk9SX19TSUdORVJfX1RSQU5TQUNUSU9OX1NFTkRJTkdfU0lHTkVSX01JU1NJTkddOiBcIk5vIGBUcmFuc2FjdGlvblNlbmRpbmdTaWduZXJgIHdhcyBpZGVudGlmaWVkLiBQbGVhc2UgcHJvdmlkZSBhIHZhbGlkIGBUcmFuc2FjdGlvbldpdGhTaW5nbGVTZW5kaW5nU2lnbmVyYCB0cmFuc2FjdGlvbi5cIixcbiAgW1NPTEFOQV9FUlJPUl9fU0lHTkVSX19XQUxMRVRfTVVMVElTSUdOX1VOSU1QTEVNRU5URURdOiBcIldhbGxldCBhY2NvdW50IHNpZ25lcnMgZG8gbm90IHN1cHBvcnQgc2lnbmluZyBtdWx0aXBsZSBtZXNzYWdlcy90cmFuc2FjdGlvbnMgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXCIsXG4gIFtTT0xBTkFfRVJST1JfX1NVQlRMRV9DUllQVE9fX0NBTk5PVF9FWFBPUlRfTk9OX0VYVFJBQ1RBQkxFX0tFWV06IFwiQ2Fubm90IGV4cG9ydCBhIG5vbi1leHRyYWN0YWJsZSBrZXkuXCIsXG4gIFtTT0xBTkFfRVJST1JfX1NVQlRMRV9DUllQVE9fX0RJR0VTVF9VTklNUExFTUVOVEVEXTogXCJObyBkaWdlc3QgaW1wbGVtZW50YXRpb24gY291bGQgYmUgZm91bmQuXCIsXG4gIFtTT0xBTkFfRVJST1JfX1NVQlRMRV9DUllQVE9fX0RJU0FMTE9XRURfSU5fSU5TRUNVUkVfQ09OVEVYVF06IFwiQ3J5cHRvZ3JhcGhpYyBvcGVyYXRpb25zIGFyZSBvbmx5IGFsbG93ZWQgaW4gc2VjdXJlIGJyb3dzZXIgY29udGV4dHMuIFJlYWQgbW9yZSBoZXJlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TZWN1cml0eS9TZWN1cmVfQ29udGV4dHMuXCIsXG4gIFtTT0xBTkFfRVJST1JfX1NVQlRMRV9DUllQVE9fX0VEMjU1MTlfQUxHT1JJVEhNX1VOSU1QTEVNRU5URURdOiBcIlRoaXMgcnVudGltZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBnZW5lcmF0aW9uIG9mIEVkMjU1MTkga2V5IHBhaXJzLlxcblxcbkluc3RhbGwgQHNvbGFuYS93ZWJjcnlwdG8tZWQyNTUxOS1wb2x5ZmlsbCBhbmQgY2FsbCBpdHMgYGluc3RhbGxgIGZ1bmN0aW9uIGJlZm9yZSBnZW5lcmF0aW5nIGtleXMgaW4gZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IHN1cHBvcnQgRWQyNTUxOS5cXG5cXG5Gb3IgYSBsaXN0IG9mIHJ1bnRpbWVzIHRoYXQgY3VycmVudGx5IHN1cHBvcnQgRWQyNTUxOSBvcGVyYXRpb25zLCB2aXNpdCBodHRwczovL2dpdGh1Yi5jb20vV0lDRy93ZWJjcnlwdG8tc2VjdXJlLWN1cnZlcy9pc3N1ZXMvMjAuXCIsXG4gIFtTT0xBTkFfRVJST1JfX1NVQlRMRV9DUllQVE9fX0VYUE9SVF9GVU5DVElPTl9VTklNUExFTUVOVEVEXTogXCJObyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGltcGxlbWVudGF0aW9uIGNvdWxkIGJlIGZvdW5kLlwiLFxuICBbU09MQU5BX0VSUk9SX19TVUJUTEVfQ1JZUFRPX19HRU5FUkFURV9GVU5DVElPTl9VTklNUExFTUVOVEVEXTogXCJObyBrZXkgZ2VuZXJhdGlvbiBpbXBsZW1lbnRhdGlvbiBjb3VsZCBiZSBmb3VuZC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fU1VCVExFX0NSWVBUT19fU0lHTl9GVU5DVElPTl9VTklNUExFTUVOVEVEXTogXCJObyBzaWduaW5nIGltcGxlbWVudGF0aW9uIGNvdWxkIGJlIGZvdW5kLlwiLFxuICBbU09MQU5BX0VSUk9SX19TVUJUTEVfQ1JZUFRPX19WRVJJRllfRlVOQ1RJT05fVU5JTVBMRU1FTlRFRF06IFwiTm8ga2V5IGV4cG9ydCBpbXBsZW1lbnRhdGlvbiBjb3VsZCBiZSBmb3VuZC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fVElNRVNUQU1QX09VVF9PRl9SQU5HRV06IFwiVGltZXN0YW1wIHZhbHVlIG11c3QgYmUgaW4gdGhlIHJhbmdlIFstKDJuICoqIDYzbiksICgybiAqKiA2M24pIC0gMV0uIGAkdmFsdWVgIGdpdmVuXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19BQ0NPVU5UX0JPUlJPV19PVVRTVEFORElOR106IFwiVHJhbnNhY3Rpb24gcHJvY2Vzc2luZyBsZWZ0IGFuIGFjY291bnQgd2l0aCBhbiBvdXRzdGFuZGluZyBib3Jyb3dlZCByZWZlcmVuY2VcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0FDQ09VTlRfSU5fVVNFXTogXCJBY2NvdW50IGluIHVzZVwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fQUNDT1VOVF9MT0FERURfVFdJQ0VdOiBcIkFjY291bnQgbG9hZGVkIHR3aWNlXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19BQ0NPVU5UX05PVF9GT1VORF06IFwiQXR0ZW1wdCB0byBkZWJpdCBhbiBhY2NvdW50IGJ1dCBmb3VuZCBubyByZWNvcmQgb2YgYSBwcmlvciBjcmVkaXQuXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19BRERSRVNTX0xPT0tVUF9UQUJMRV9OT1RfRk9VTkRdOiBcIlRyYW5zYWN0aW9uIGxvYWRzIGFuIGFkZHJlc3MgdGFibGUgYWNjb3VudCB0aGF0IGRvZXNuJ3QgZXhpc3RcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0FMUkVBRFlfUFJPQ0VTU0VEXTogXCJUaGlzIHRyYW5zYWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19CTE9DS0hBU0hfTk9UX0ZPVU5EXTogXCJCbG9ja2hhc2ggbm90IGZvdW5kXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19DQUxMX0NIQUlOX1RPT19ERUVQXTogXCJMb2FkZXIgY2FsbCBjaGFpbiBpcyB0b28gZGVlcFwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fQ0xVU1RFUl9NQUlOVEVOQU5DRV06IFwiVHJhbnNhY3Rpb25zIGFyZSBjdXJyZW50bHkgZGlzYWJsZWQgZHVlIHRvIGNsdXN0ZXIgbWFpbnRlbmFuY2VcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0RVUExJQ0FURV9JTlNUUlVDVElPTl06IFwiVHJhbnNhY3Rpb24gY29udGFpbnMgYSBkdXBsaWNhdGUgaW5zdHJ1Y3Rpb24gKCRpbmRleCkgdGhhdCBpcyBub3QgYWxsb3dlZFwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fSU5TVUZGSUNJRU5UX0ZVTkRTX0ZPUl9GRUVdOiBcIkluc3VmZmljaWVudCBmdW5kcyBmb3IgZmVlXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlNVRkZJQ0lFTlRfRlVORFNfRk9SX1JFTlRdOiBcIlRyYW5zYWN0aW9uIHJlc3VsdHMgaW4gYW4gYWNjb3VudCAoJGFjY291bnRJbmRleCkgd2l0aCBpbnN1ZmZpY2llbnQgZnVuZHMgZm9yIHJlbnRcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfQUNDT1VOVF9GT1JfRkVFXTogXCJUaGlzIGFjY291bnQgbWF5IG5vdCBiZSB1c2VkIHRvIHBheSB0cmFuc2FjdGlvbiBmZWVzXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlZBTElEX0FDQ09VTlRfSU5ERVhdOiBcIlRyYW5zYWN0aW9uIGNvbnRhaW5zIGFuIGludmFsaWQgYWNjb3VudCByZWZlcmVuY2VcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfQUREUkVTU19MT09LVVBfVEFCTEVfREFUQV06IFwiVHJhbnNhY3Rpb24gbG9hZHMgYW4gYWRkcmVzcyB0YWJsZSBhY2NvdW50IHdpdGggaW52YWxpZCBkYXRhXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlZBTElEX0FERFJFU1NfTE9PS1VQX1RBQkxFX0lOREVYXTogXCJUcmFuc2FjdGlvbiBhZGRyZXNzIHRhYmxlIGxvb2t1cCB1c2VzIGFuIGludmFsaWQgaW5kZXhcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfQUREUkVTU19MT09LVVBfVEFCTEVfT1dORVJdOiBcIlRyYW5zYWN0aW9uIGxvYWRzIGFuIGFkZHJlc3MgdGFibGUgYWNjb3VudCB3aXRoIGFuIGludmFsaWQgb3duZXJcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfTE9BREVEX0FDQ09VTlRTX0RBVEFfU0laRV9MSU1JVF06IFwiTG9hZGVkQWNjb3VudHNEYXRhU2l6ZUxpbWl0IHNldCBmb3IgdHJhbnNhY3Rpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gMC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfUFJPR1JBTV9GT1JfRVhFQ1VUSU9OXTogXCJUaGlzIHByb2dyYW0gbWF5IG5vdCBiZSB1c2VkIGZvciBleGVjdXRpbmcgaW5zdHJ1Y3Rpb25zXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlZBTElEX1JFTlRfUEFZSU5HX0FDQ09VTlRdOiBcIlRyYW5zYWN0aW9uIGxlYXZlcyBhbiBhY2NvdW50IHdpdGggYSBsb3dlciBiYWxhbmNlIHRoYW4gcmVudC1leGVtcHQgbWluaW11bVwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fSU5WQUxJRF9XUklUQUJMRV9BQ0NPVU5UXTogXCJUcmFuc2FjdGlvbiBsb2FkcyBhIHdyaXRhYmxlIGFjY291bnQgdGhhdCBjYW5ub3QgYmUgd3JpdHRlblwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fTUFYX0xPQURFRF9BQ0NPVU5UU19EQVRBX1NJWkVfRVhDRUVERURdOiBcIlRyYW5zYWN0aW9uIGV4Y2VlZGVkIG1heCBsb2FkZWQgYWNjb3VudHMgZGF0YSBzaXplIGNhcFwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fTUlTU0lOR19TSUdOQVRVUkVfRk9SX0ZFRV06IFwiVHJhbnNhY3Rpb24gcmVxdWlyZXMgYSBmZWUgYnV0IGhhcyBubyBzaWduYXR1cmUgcHJlc2VudFwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fUFJPR1JBTV9BQ0NPVU5UX05PVF9GT1VORF06IFwiQXR0ZW1wdCB0byBsb2FkIGEgcHJvZ3JhbSB0aGF0IGRvZXMgbm90IGV4aXN0XCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19QUk9HUkFNX0VYRUNVVElPTl9URU1QT1JBUklMWV9SRVNUUklDVEVEXTogXCJFeGVjdXRpb24gb2YgdGhlIHByb2dyYW0gcmVmZXJlbmNlZCBieSBhY2NvdW50IGF0IGluZGV4ICRhY2NvdW50SW5kZXggaXMgdGVtcG9yYXJpbHkgcmVzdHJpY3RlZC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1JFU0FOSVRJWkFUSU9OX05FRURFRF06IFwiUmVzYW5pdGl6YXRpb25OZWVkZWRcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1NBTklUSVpFX0ZBSUxVUkVdOiBcIlRyYW5zYWN0aW9uIGZhaWxlZCB0byBzYW5pdGl6ZSBhY2NvdW50cyBvZmZzZXRzIGNvcnJlY3RseVwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fU0lHTkFUVVJFX0ZBSUxVUkVdOiBcIlRyYW5zYWN0aW9uIGRpZCBub3QgcGFzcyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19UT09fTUFOWV9BQ0NPVU5UX0xPQ0tTXTogXCJUcmFuc2FjdGlvbiBsb2NrZWQgdG9vIG1hbnkgYWNjb3VudHNcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1VOQkFMQU5DRURfVFJBTlNBQ1RJT05dOiBcIlN1bSBvZiBhY2NvdW50IGJhbGFuY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgdHJhbnNhY3Rpb24gZG8gbm90IG1hdGNoXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19VTktOT1dOXTogXCJUaGUgdHJhbnNhY3Rpb24gZmFpbGVkIHdpdGggdGhlIGVycm9yIGAkZXJyb3JOYW1lYFwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fVU5TVVBQT1JURURfVkVSU0lPTl06IFwiVHJhbnNhY3Rpb24gdmVyc2lvbiBpcyB1bnN1cHBvcnRlZFwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fV09VTERfRVhDRUVEX0FDQ09VTlRfREFUQV9CTE9DS19MSU1JVF06IFwiVHJhbnNhY3Rpb24gd291bGQgZXhjZWVkIGFjY291bnQgZGF0YSBsaW1pdCB3aXRoaW4gdGhlIGJsb2NrXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19XT1VMRF9FWENFRURfQUNDT1VOVF9EQVRBX1RPVEFMX0xJTUlUXTogXCJUcmFuc2FjdGlvbiB3b3VsZCBleGNlZWQgdG90YWwgYWNjb3VudCBkYXRhIGxpbWl0XCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19XT1VMRF9FWENFRURfTUFYX0FDQ09VTlRfQ09TVF9MSU1JVF06IFwiVHJhbnNhY3Rpb24gd291bGQgZXhjZWVkIG1heCBhY2NvdW50IGxpbWl0IHdpdGhpbiB0aGUgYmxvY2tcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1dPVUxEX0VYQ0VFRF9NQVhfQkxPQ0tfQ09TVF9MSU1JVF06IFwiVHJhbnNhY3Rpb24gd291bGQgZXhjZWVkIG1heCBCbG9jayBDb3N0IExpbWl0XCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19XT1VMRF9FWENFRURfTUFYX1ZPVEVfQ09TVF9MSU1JVF06IFwiVHJhbnNhY3Rpb24gd291bGQgZXhjZWVkIG1heCBWb3RlIENvc3QgTGltaXRcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0FERFJFU1NFU19DQU5OT1RfU0lHTl9UUkFOU0FDVElPTl06IFwiQXR0ZW1wdGVkIHRvIHNpZ24gYSB0cmFuc2FjdGlvbiB3aXRoIGFuIGFkZHJlc3MgdGhhdCBpcyBub3QgYSBzaWduZXIgZm9yIGl0XCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19BRERSRVNTX01JU1NJTkddOiBcIlRyYW5zYWN0aW9uIGlzIG1pc3NpbmcgYW4gYWRkcmVzcyBhdCBpbmRleDogJGluZGV4LlwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fQ0FOTk9UX0VOQ09ERV9XSVRIX0VNUFRZX1NJR05BVFVSRVNdOiBcIlRyYW5zYWN0aW9uIGhhcyBubyBleHBlY3RlZCBzaWduZXJzIHRoZXJlZm9yZSBpdCBjYW5ub3QgYmUgZW5jb2RlZFwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRVhDRUVEU19TSVpFX0xJTUlUXTogXCJUcmFuc2FjdGlvbiBzaXplICR0cmFuc2FjdGlvblNpemUgZXhjZWVkcyBsaW1pdCBvZiAkdHJhbnNhY3Rpb25TaXplTGltaXQgYnl0ZXNcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0VYUEVDVEVEX0JMT0NLSEFTSF9MSUZFVElNRV06IFwiVHJhbnNhY3Rpb24gZG9lcyBub3QgaGF2ZSBhIGJsb2NraGFzaCBsaWZldGltZVwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRVhQRUNURURfTk9OQ0VfTElGRVRJTUVdOiBcIlRyYW5zYWN0aW9uIGlzIG5vdCBhIGR1cmFibGUgbm9uY2UgdHJhbnNhY3Rpb25cIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0ZBSUxFRF9UT19ERUNPTVBJTEVfQUREUkVTU19MT09LVVBfVEFCTEVfQ09OVEVOVFNfTUlTU0lOR106IFwiQ29udGVudHMgb2YgdGhlc2UgYWRkcmVzcyBsb29rdXAgdGFibGVzIHVua25vd246ICRsb29rdXBUYWJsZUFkZHJlc3Nlc1wiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRkFJTEVEX1RPX0RFQ09NUElMRV9BRERSRVNTX0xPT0tVUF9UQUJMRV9JTkRFWF9PVVRfT0ZfUkFOR0VdOiBcIkxvb2t1cCBvZiBhZGRyZXNzIGF0IGluZGV4ICRoaWdoZXN0UmVxdWVzdGVkSW5kZXggZmFpbGVkIGZvciBsb29rdXAgdGFibGUgYCRsb29rdXBUYWJsZUFkZHJlc3NgLiBIaWdoZXN0IGtub3duIGluZGV4IGlzICRoaWdoZXN0S25vd25JbmRleC4gVGhlIGxvb2t1cCB0YWJsZSBtYXkgaGF2ZSBiZWVuIGV4dGVuZGVkIHNpbmNlIGl0cyBjb250ZW50cyB3ZXJlIHJldHJpZXZlZFwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRkFJTEVEX1RPX0RFQ09NUElMRV9GRUVfUEFZRVJfTUlTU0lOR106IFwiTm8gZmVlIHBheWVyIHNldCBpbiBDb21waWxlZFRyYW5zYWN0aW9uXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19GQUlMRURfVE9fREVDT01QSUxFX0lOU1RSVUNUSU9OX1BST0dSQU1fQUREUkVTU19OT1RfRk9VTkRdOiBcIkNvdWxkIG5vdCBmaW5kIHByb2dyYW0gYWRkcmVzcyBhdCBpbmRleCAkaW5kZXhcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0ZBSUxFRF9UT19FU1RJTUFURV9DT01QVVRFX0xJTUlUXTogXCJGYWlsZWQgdG8gZXN0aW1hdGUgdGhlIGNvbXB1dGUgdW5pdCBjb25zdW1wdGlvbiBmb3IgdGhpcyB0cmFuc2FjdGlvbiBtZXNzYWdlLiBUaGlzIGlzIGxpa2VseSBiZWNhdXNlIHNpbXVsYXRpbmcgdGhlIHRyYW5zYWN0aW9uIGZhaWxlZC4gSW5zcGVjdCB0aGUgYGNhdXNlYCBwcm9wZXJ0eSBvZiB0aGlzIGVycm9yIHRvIGxlYXJuIG1vcmVcIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0ZBSUxFRF9XSEVOX1NJTVVMQVRJTkdfVE9fRVNUSU1BVEVfQ09NUFVURV9MSU1JVF06IFwiVHJhbnNhY3Rpb24gZmFpbGVkIHdoZW4gaXQgd2FzIHNpbXVsYXRlZCBpbiBvcmRlciB0byBlc3RpbWF0ZSB0aGUgY29tcHV0ZSB1bml0IGNvbnN1bXB0aW9uLiBUaGUgY29tcHV0ZSB1bml0IGVzdGltYXRlIHByb3ZpZGVkIGlzIGZvciBhIHRyYW5zYWN0aW9uIHRoYXQgZmFpbGVkIHdoZW4gc2ltdWxhdGVkIGFuZCBtYXkgbm90IGJlIHJlcHJlc2VudGF0aXZlIG9mIHRoZSBjb21wdXRlIHVuaXRzIHRoaXMgdHJhbnNhY3Rpb24gd291bGQgY29uc3VtZSBpZiBzdWNjZXNzZnVsLiBJbnNwZWN0IHRoZSBgY2F1c2VgIHByb3BlcnR5IG9mIHRoaXMgZXJyb3IgdG8gbGVhcm4gbW9yZVwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRkVFX1BBWUVSX01JU1NJTkddOiBcIlRyYW5zYWN0aW9uIGlzIG1pc3NpbmcgYSBmZWUgcGF5ZXIuXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19GRUVfUEFZRVJfU0lHTkFUVVJFX01JU1NJTkddOiBcIkNvdWxkIG5vdCBkZXRlcm1pbmUgdGhpcyB0cmFuc2FjdGlvbidzIHNpZ25hdHVyZS4gTWFrZSBzdXJlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHNpZ25lZCBieSBpdHMgZmVlIHBheWVyLlwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fSU5WQUxJRF9OT05DRV9UUkFOU0FDVElPTl9GSVJTVF9JTlNUUlVDVElPTl9NVVNUX0JFX0FEVkFOQ0VfTk9OQ0VdOiBcIlRyYW5zYWN0aW9uIGZpcnN0IGluc3RydWN0aW9uIGlzIG5vdCBhZHZhbmNlIG5vbmNlIGFjY291bnQgaW5zdHJ1Y3Rpb24uXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19JTlZBTElEX05PTkNFX1RSQU5TQUNUSU9OX0lOU1RSVUNUSU9OU19NSVNTSU5HXTogXCJUcmFuc2FjdGlvbiB3aXRoIG5vIGluc3RydWN0aW9ucyBjYW5ub3QgYmUgZHVyYWJsZSBub25jZSB0cmFuc2FjdGlvbi5cIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0lOVk9LRURfUFJPR1JBTVNfQ0FOTk9UX1BBWV9GRUVTXTogXCJUaGlzIHRyYW5zYWN0aW9uIGluY2x1ZGVzIGFuIGFkZHJlc3MgKGAkcHJvZ3JhbUFkZHJlc3NgKSB3aGljaCBpcyBib3RoIGludm9rZWQgYW5kIHNldCBhcyB0aGUgZmVlIHBheWVyLiBQcm9ncmFtIGFkZHJlc3NlcyBtYXkgbm90IHBheSBmZWVzXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19JTlZPS0VEX1BST0dSQU1TX01VU1RfTk9UX0JFX1dSSVRBQkxFXTogXCJUaGlzIHRyYW5zYWN0aW9uIGluY2x1ZGVzIGFuIGFkZHJlc3MgKGAkcHJvZ3JhbUFkZHJlc3NgKSB3aGljaCBpcyBib3RoIGludm9rZWQgYW5kIG1hcmtlZCB3cml0YWJsZS4gUHJvZ3JhbSBhZGRyZXNzZXMgbWF5IG5vdCBiZSB3cml0YWJsZVwiLFxuICBbU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fTUVTU0FHRV9TSUdOQVRVUkVTX01JU01BVENIXTogXCJUaGUgdHJhbnNhY3Rpb24gbWVzc2FnZSBleHBlY3RlZCB0aGUgdHJhbnNhY3Rpb24gdG8gaGF2ZSAkc2lnbmVyQWRkcmVzc2VzTGVuZ3RoIHNpZ25hdHVyZXMsIGdvdCAkc2lnbmF0dXJlc0xlbmd0aC5cIixcbiAgW1NPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX1NJR05BVFVSRVNfTUlTU0lOR106IFwiVHJhbnNhY3Rpb24gaXMgbWlzc2luZyBzaWduYXR1cmVzIGZvciBhZGRyZXNzZXM6ICRhZGRyZXNzZXMuXCIsXG4gIFtTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19WRVJTSU9OX05VTUJFUl9PVVRfT0ZfUkFOR0VdOiBcIlRyYW5zYWN0aW9uIHZlcnNpb24gbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWzAsIDEyN10uIGAkYWN0dWFsVmVyc2lvbmAgZ2l2ZW5cIlxufTtcblxuLy8gc3JjL21lc3NhZ2UtZm9ybWF0dGVyLnRzXG52YXIgU1RBUlRfSU5ERVggPSBcImlcIjtcbnZhciBUWVBFID0gXCJ0XCI7XG5mdW5jdGlvbiBnZXRIdW1hblJlYWRhYmxlRXJyb3JNZXNzYWdlKGNvZGUsIGNvbnRleHQgPSB7fSkge1xuICBjb25zdCBtZXNzYWdlRm9ybWF0U3RyaW5nID0gU29sYW5hRXJyb3JNZXNzYWdlc1tjb2RlXTtcbiAgaWYgKG1lc3NhZ2VGb3JtYXRTdHJpbmcubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFwiXCI7XG4gIH1cbiAgbGV0IHN0YXRlO1xuICBmdW5jdGlvbiBjb21taXRTdGF0ZVVwVG8oZW5kSW5kZXgpIHtcbiAgICBpZiAoc3RhdGVbVFlQRV0gPT09IDIgLyogVmFyaWFibGUgKi8pIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlTmFtZSA9IG1lc3NhZ2VGb3JtYXRTdHJpbmcuc2xpY2Uoc3RhdGVbU1RBUlRfSU5ERVhdICsgMSwgZW5kSW5kZXgpO1xuICAgICAgZnJhZ21lbnRzLnB1c2goXG4gICAgICAgIHZhcmlhYmxlTmFtZSBpbiBjb250ZXh0ID8gKFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVzdHJpY3QtdGVtcGxhdGUtZXhwcmVzc2lvbnNcbiAgICAgICAgICBgJHtjb250ZXh0W3ZhcmlhYmxlTmFtZV19YFxuICAgICAgICApIDogYCQke3ZhcmlhYmxlTmFtZX1gXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoc3RhdGVbVFlQRV0gPT09IDEgLyogVGV4dCAqLykge1xuICAgICAgZnJhZ21lbnRzLnB1c2gobWVzc2FnZUZvcm1hdFN0cmluZy5zbGljZShzdGF0ZVtTVEFSVF9JTkRFWF0sIGVuZEluZGV4KSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGZyYWdtZW50cyA9IFtdO1xuICBtZXNzYWdlRm9ybWF0U3RyaW5nLnNwbGl0KFwiXCIpLmZvckVhY2goKGNoYXIsIGlpKSA9PiB7XG4gICAgaWYgKGlpID09PSAwKSB7XG4gICAgICBzdGF0ZSA9IHtcbiAgICAgICAgW1NUQVJUX0lOREVYXTogMCxcbiAgICAgICAgW1RZUEVdOiBtZXNzYWdlRm9ybWF0U3RyaW5nWzBdID09PSBcIlxcXFxcIiA/IDAgLyogRXNjYXBlU2VxdWVuY2UgKi8gOiBtZXNzYWdlRm9ybWF0U3RyaW5nWzBdID09PSBcIiRcIiA/IDIgLyogVmFyaWFibGUgKi8gOiAxIC8qIFRleHQgKi9cbiAgICAgIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBuZXh0U3RhdGU7XG4gICAgc3dpdGNoIChzdGF0ZVtUWVBFXSkge1xuICAgICAgY2FzZSAwIC8qIEVzY2FwZVNlcXVlbmNlICovOlxuICAgICAgICBuZXh0U3RhdGUgPSB7IFtTVEFSVF9JTkRFWF06IGlpLCBbVFlQRV06IDEgLyogVGV4dCAqLyB9O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMSAvKiBUZXh0ICovOlxuICAgICAgICBpZiAoY2hhciA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgICBuZXh0U3RhdGUgPSB7IFtTVEFSVF9JTkRFWF06IGlpLCBbVFlQRV06IDAgLyogRXNjYXBlU2VxdWVuY2UgKi8gfTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBcIiRcIikge1xuICAgICAgICAgIG5leHRTdGF0ZSA9IHsgW1NUQVJUX0lOREVYXTogaWksIFtUWVBFXTogMiAvKiBWYXJpYWJsZSAqLyB9O1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAyIC8qIFZhcmlhYmxlICovOlxuICAgICAgICBpZiAoY2hhciA9PT0gXCJcXFxcXCIpIHtcbiAgICAgICAgICBuZXh0U3RhdGUgPSB7IFtTVEFSVF9JTkRFWF06IGlpLCBbVFlQRV06IDAgLyogRXNjYXBlU2VxdWVuY2UgKi8gfTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGFyID09PSBcIiRcIikge1xuICAgICAgICAgIG5leHRTdGF0ZSA9IHsgW1NUQVJUX0lOREVYXTogaWksIFtUWVBFXTogMiAvKiBWYXJpYWJsZSAqLyB9O1xuICAgICAgICB9IGVsc2UgaWYgKCFjaGFyLm1hdGNoKC9cXHcvKSkge1xuICAgICAgICAgIG5leHRTdGF0ZSA9IHsgW1NUQVJUX0lOREVYXTogaWksIFtUWVBFXTogMSAvKiBUZXh0ICovIH07XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChuZXh0U3RhdGUpIHtcbiAgICAgIGlmIChzdGF0ZSAhPT0gbmV4dFN0YXRlKSB7XG4gICAgICAgIGNvbW1pdFN0YXRlVXBUbyhpaSk7XG4gICAgICB9XG4gICAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICB9XG4gIH0pO1xuICBjb21taXRTdGF0ZVVwVG8oKTtcbiAgcmV0dXJuIGZyYWdtZW50cy5qb2luKFwiXCIpO1xufVxuZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGNvZGUsIGNvbnRleHQgPSB7fSkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgcmV0dXJuIGdldEh1bWFuUmVhZGFibGVFcnJvck1lc3NhZ2UoY29kZSwgY29udGV4dCk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IGRlY29kaW5nQWR2aWNlTWVzc2FnZSA9IGBTb2xhbmEgZXJyb3IgIyR7Y29kZX07IERlY29kZSB0aGlzIGVycm9yIGJ5IHJ1bm5pbmcgXFxgbnB4IEBzb2xhbmEvZXJyb3JzIGRlY29kZSAtLSAke2NvZGV9YDtcbiAgICBpZiAoT2JqZWN0LmtleXMoY29udGV4dCkubGVuZ3RoKSB7XG4gICAgICBkZWNvZGluZ0FkdmljZU1lc3NhZ2UgKz0gYCAnJHtlbmNvZGVDb250ZXh0T2JqZWN0KGNvbnRleHQpfSdgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7ZGVjb2RpbmdBZHZpY2VNZXNzYWdlfVxcYGA7XG4gIH1cbn1cblxuLy8gc3JjL2Vycm9yLnRzXG5mdW5jdGlvbiBpc1NvbGFuYUVycm9yKGUsIGNvZGUpIHtcbiAgY29uc3QgaXNTb2xhbmFFcnJvcjIgPSBlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5uYW1lID09PSBcIlNvbGFuYUVycm9yXCI7XG4gIGlmIChpc1NvbGFuYUVycm9yMikge1xuICAgIGlmIChjb2RlICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiBlLmNvbnRleHQuX19jb2RlID09PSBjb2RlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG52YXIgU29sYW5hRXJyb3IgPSBjbGFzcyBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB0aGUgcm9vdCBjYXVzZSBvZiB0aGlzIHtAbGluayBTb2xhbmFFcnJvcn0sIGlmIGFueS5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUsIGEgdHJhbnNhY3Rpb24gZXJyb3IgbWlnaHQgaGF2ZSBhbiBpbnN0cnVjdGlvbiBlcnJvciBhcyBpdHMgcm9vdCBjYXVzZS4gSW4gdGhpc1xuICAgKiBjYXNlLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGFjY2VzcyB0aGUgaW5zdHJ1Y3Rpb24gZXJyb3Igb24gdGhlIHRyYW5zYWN0aW9uIGVycm9yIGFzIGBjYXVzZWAuXG4gICAqL1xuICBjYXVzZSA9IHRoaXMuY2F1c2U7XG4gIC8qKlxuICAgKiBDb250YWlucyBjb250ZXh0IHRoYXQgY2FuIGFzc2lzdCBpbiB1bmRlcnN0YW5kaW5nIG9yIHJlY292ZXJpbmcgZnJvbSBhIHtAbGluayBTb2xhbmFFcnJvcn0uXG4gICAqL1xuICBjb250ZXh0O1xuICBjb25zdHJ1Y3RvciguLi5bY29kZSwgY29udGV4dEFuZEVycm9yT3B0aW9uc10pIHtcbiAgICBsZXQgY29udGV4dDtcbiAgICBsZXQgZXJyb3JPcHRpb25zO1xuICAgIGlmIChjb250ZXh0QW5kRXJyb3JPcHRpb25zKSB7XG4gICAgICBjb25zdCB7IGNhdXNlLCAuLi5jb250ZXh0UmVzdCB9ID0gY29udGV4dEFuZEVycm9yT3B0aW9ucztcbiAgICAgIGlmIChjYXVzZSkge1xuICAgICAgICBlcnJvck9wdGlvbnMgPSB7IGNhdXNlIH07XG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LmtleXMoY29udGV4dFJlc3QpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHRSZXN0O1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlID0gZ2V0RXJyb3JNZXNzYWdlKGNvZGUsIGNvbnRleHQpO1xuICAgIHN1cGVyKG1lc3NhZ2UsIGVycm9yT3B0aW9ucyk7XG4gICAgdGhpcy5jb250ZXh0ID0ge1xuICAgICAgX19jb2RlOiBjb2RlLFxuICAgICAgLi4uY29udGV4dFxuICAgIH07XG4gICAgdGhpcy5uYW1lID0gXCJTb2xhbmFFcnJvclwiO1xuICB9XG59O1xuXG4vLyBzcmMvc3RhY2stdHJhY2UudHNcbmZ1bmN0aW9uIHNhZmVDYXB0dXJlU3RhY2tUcmFjZSguLi5hcmdzKSB7XG4gIGlmIChcImNhcHR1cmVTdGFja1RyYWNlXCIgaW4gRXJyb3IgJiYgdHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSguLi5hcmdzKTtcbiAgfVxufVxuXG4vLyBzcmMvcnBjLWVudW0tZXJyb3JzLnRzXG5mdW5jdGlvbiBnZXRTb2xhbmFFcnJvckZyb21ScGNFcnJvcih7IGVycm9yQ29kZUJhc2VPZmZzZXQsIGdldEVycm9yQ29udGV4dCwgb3JkZXJlZEVycm9yTmFtZXMsIHJwY0VudW1FcnJvciB9LCBjb25zdHJ1Y3Rvck9wdCkge1xuICBsZXQgcnBjRXJyb3JOYW1lO1xuICBsZXQgcnBjRXJyb3JDb250ZXh0O1xuICBpZiAodHlwZW9mIHJwY0VudW1FcnJvciA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJwY0Vycm9yTmFtZSA9IHJwY0VudW1FcnJvcjtcbiAgfSBlbHNlIHtcbiAgICBycGNFcnJvck5hbWUgPSBPYmplY3Qua2V5cyhycGNFbnVtRXJyb3IpWzBdO1xuICAgIHJwY0Vycm9yQ29udGV4dCA9IHJwY0VudW1FcnJvcltycGNFcnJvck5hbWVdO1xuICB9XG4gIGNvbnN0IGNvZGVPZmZzZXQgPSBvcmRlcmVkRXJyb3JOYW1lcy5pbmRleE9mKHJwY0Vycm9yTmFtZSk7XG4gIGNvbnN0IGVycm9yQ29kZSA9IGVycm9yQ29kZUJhc2VPZmZzZXQgKyBjb2RlT2Zmc2V0O1xuICBjb25zdCBlcnJvckNvbnRleHQgPSBnZXRFcnJvckNvbnRleHQoZXJyb3JDb2RlLCBycGNFcnJvck5hbWUsIHJwY0Vycm9yQ29udGV4dCk7XG4gIGNvbnN0IGVyciA9IG5ldyBTb2xhbmFFcnJvcihlcnJvckNvZGUsIGVycm9yQ29udGV4dCk7XG4gIHNhZmVDYXB0dXJlU3RhY2tUcmFjZShlcnIsIGNvbnN0cnVjdG9yT3B0KTtcbiAgcmV0dXJuIGVycjtcbn1cblxuLy8gc3JjL2luc3RydWN0aW9uLWVycm9yLnRzXG52YXIgT1JERVJFRF9FUlJPUl9OQU1FUyA9IFtcbiAgLy8gS2VlcCBzeW5jZWQgd2l0aCBSUEMgc291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vYW56YS14eXovYWdhdmUvYmxvYi9tYXN0ZXIvc2RrL3Byb2dyYW0vc3JjL2luc3RydWN0aW9uLnJzXG4gIC8vIElmIHRoaXMgbGlzdCBldmVyIGdldHMgdG9vIGxhcmdlLCBjb25zaWRlciBpbXBsZW1lbnRpbmcgYSBjb21wcmVzc2lvbiBzdHJhdGVneSBsaWtlIHRoaXM6XG4gIC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3N0ZXZlbHVzY2hlci9hYWE3Y2JiYjU0MzNiMTE5Nzk4MzkwOGE0MDg2MGM0N1xuICBcIkdlbmVyaWNFcnJvclwiLFxuICBcIkludmFsaWRBcmd1bWVudFwiLFxuICBcIkludmFsaWRJbnN0cnVjdGlvbkRhdGFcIixcbiAgXCJJbnZhbGlkQWNjb3VudERhdGFcIixcbiAgXCJBY2NvdW50RGF0YVRvb1NtYWxsXCIsXG4gIFwiSW5zdWZmaWNpZW50RnVuZHNcIixcbiAgXCJJbmNvcnJlY3RQcm9ncmFtSWRcIixcbiAgXCJNaXNzaW5nUmVxdWlyZWRTaWduYXR1cmVcIixcbiAgXCJBY2NvdW50QWxyZWFkeUluaXRpYWxpemVkXCIsXG4gIFwiVW5pbml0aWFsaXplZEFjY291bnRcIixcbiAgXCJVbmJhbGFuY2VkSW5zdHJ1Y3Rpb25cIixcbiAgXCJNb2RpZmllZFByb2dyYW1JZFwiLFxuICBcIkV4dGVybmFsQWNjb3VudExhbXBvcnRTcGVuZFwiLFxuICBcIkV4dGVybmFsQWNjb3VudERhdGFNb2RpZmllZFwiLFxuICBcIlJlYWRvbmx5TGFtcG9ydENoYW5nZVwiLFxuICBcIlJlYWRvbmx5RGF0YU1vZGlmaWVkXCIsXG4gIFwiRHVwbGljYXRlQWNjb3VudEluZGV4XCIsXG4gIFwiRXhlY3V0YWJsZU1vZGlmaWVkXCIsXG4gIFwiUmVudEVwb2NoTW9kaWZpZWRcIixcbiAgXCJOb3RFbm91Z2hBY2NvdW50S2V5c1wiLFxuICBcIkFjY291bnREYXRhU2l6ZUNoYW5nZWRcIixcbiAgXCJBY2NvdW50Tm90RXhlY3V0YWJsZVwiLFxuICBcIkFjY291bnRCb3Jyb3dGYWlsZWRcIixcbiAgXCJBY2NvdW50Qm9ycm93T3V0c3RhbmRpbmdcIixcbiAgXCJEdXBsaWNhdGVBY2NvdW50T3V0T2ZTeW5jXCIsXG4gIFwiQ3VzdG9tXCIsXG4gIFwiSW52YWxpZEVycm9yXCIsXG4gIFwiRXhlY3V0YWJsZURhdGFNb2RpZmllZFwiLFxuICBcIkV4ZWN1dGFibGVMYW1wb3J0Q2hhbmdlXCIsXG4gIFwiRXhlY3V0YWJsZUFjY291bnROb3RSZW50RXhlbXB0XCIsXG4gIFwiVW5zdXBwb3J0ZWRQcm9ncmFtSWRcIixcbiAgXCJDYWxsRGVwdGhcIixcbiAgXCJNaXNzaW5nQWNjb3VudFwiLFxuICBcIlJlZW50cmFuY3lOb3RBbGxvd2VkXCIsXG4gIFwiTWF4U2VlZExlbmd0aEV4Y2VlZGVkXCIsXG4gIFwiSW52YWxpZFNlZWRzXCIsXG4gIFwiSW52YWxpZFJlYWxsb2NcIixcbiAgXCJDb21wdXRhdGlvbmFsQnVkZ2V0RXhjZWVkZWRcIixcbiAgXCJQcml2aWxlZ2VFc2NhbGF0aW9uXCIsXG4gIFwiUHJvZ3JhbUVudmlyb25tZW50U2V0dXBGYWlsdXJlXCIsXG4gIFwiUHJvZ3JhbUZhaWxlZFRvQ29tcGxldGVcIixcbiAgXCJQcm9ncmFtRmFpbGVkVG9Db21waWxlXCIsXG4gIFwiSW1tdXRhYmxlXCIsXG4gIFwiSW5jb3JyZWN0QXV0aG9yaXR5XCIsXG4gIFwiQm9yc2hJb0Vycm9yXCIsXG4gIFwiQWNjb3VudE5vdFJlbnRFeGVtcHRcIixcbiAgXCJJbnZhbGlkQWNjb3VudE93bmVyXCIsXG4gIFwiQXJpdGhtZXRpY092ZXJmbG93XCIsXG4gIFwiVW5zdXBwb3J0ZWRTeXN2YXJcIixcbiAgXCJJbGxlZ2FsT3duZXJcIixcbiAgXCJNYXhBY2NvdW50c0RhdGFBbGxvY2F0aW9uc0V4Y2VlZGVkXCIsXG4gIFwiTWF4QWNjb3VudHNFeGNlZWRlZFwiLFxuICBcIk1heEluc3RydWN0aW9uVHJhY2VMZW5ndGhFeGNlZWRlZFwiLFxuICBcIkJ1aWx0aW5Qcm9ncmFtc011c3RDb25zdW1lQ29tcHV0ZVVuaXRzXCJcbl07XG5mdW5jdGlvbiBnZXRTb2xhbmFFcnJvckZyb21JbnN0cnVjdGlvbkVycm9yKGluZGV4LCBpbnN0cnVjdGlvbkVycm9yKSB7XG4gIGNvbnN0IG51bWJlckluZGV4ID0gTnVtYmVyKGluZGV4KTtcbiAgcmV0dXJuIGdldFNvbGFuYUVycm9yRnJvbVJwY0Vycm9yKFxuICAgIHtcbiAgICAgIGVycm9yQ29kZUJhc2VPZmZzZXQ6IDQ2MTUwMDEsXG4gICAgICBnZXRFcnJvckNvbnRleHQoZXJyb3JDb2RlLCBycGNFcnJvck5hbWUsIHJwY0Vycm9yQ29udGV4dCkge1xuICAgICAgICBpZiAoZXJyb3JDb2RlID09PSBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19VTktOT1dOKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yTmFtZTogcnBjRXJyb3JOYW1lLFxuICAgICAgICAgICAgaW5kZXg6IG51bWJlckluZGV4LFxuICAgICAgICAgICAgLi4ucnBjRXJyb3JDb250ZXh0ICE9PSB2b2lkIDAgPyB7IGluc3RydWN0aW9uRXJyb3JDb250ZXh0OiBycGNFcnJvckNvbnRleHQgfSA6IG51bGxcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yQ29kZSA9PT0gU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQ1VTVE9NKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvZGU6IE51bWJlcihycGNFcnJvckNvbnRleHQpLFxuICAgICAgICAgICAgaW5kZXg6IG51bWJlckluZGV4XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvckNvZGUgPT09IFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0JPUlNIX0lPX0VSUk9SKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVuY29kZWREYXRhOiBycGNFcnJvckNvbnRleHQsXG4gICAgICAgICAgICBpbmRleDogbnVtYmVySW5kZXhcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGluZGV4OiBudW1iZXJJbmRleCB9O1xuICAgICAgfSxcbiAgICAgIG9yZGVyZWRFcnJvck5hbWVzOiBPUkRFUkVEX0VSUk9SX05BTUVTLFxuICAgICAgcnBjRW51bUVycm9yOiBpbnN0cnVjdGlvbkVycm9yXG4gICAgfSxcbiAgICBnZXRTb2xhbmFFcnJvckZyb21JbnN0cnVjdGlvbkVycm9yXG4gICk7XG59XG5cbi8vIHNyYy90cmFuc2FjdGlvbi1lcnJvci50c1xudmFyIE9SREVSRURfRVJST1JfTkFNRVMyID0gW1xuICAvLyBLZWVwIHN5bmNlZCB3aXRoIFJQQyBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbnphLXh5ei9hZ2F2ZS9ibG9iL21hc3Rlci9zZGsvc3JjL3RyYW5zYWN0aW9uL2Vycm9yLnJzXG4gIC8vIElmIHRoaXMgbGlzdCBldmVyIGdldHMgdG9vIGxhcmdlLCBjb25zaWRlciBpbXBsZW1lbnRpbmcgYSBjb21wcmVzc2lvbiBzdHJhdGVneSBsaWtlIHRoaXM6XG4gIC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3N0ZXZlbHVzY2hlci9hYWE3Y2JiYjU0MzNiMTE5Nzk4MzkwOGE0MDg2MGM0N1xuICBcIkFjY291bnRJblVzZVwiLFxuICBcIkFjY291bnRMb2FkZWRUd2ljZVwiLFxuICBcIkFjY291bnROb3RGb3VuZFwiLFxuICBcIlByb2dyYW1BY2NvdW50Tm90Rm91bmRcIixcbiAgXCJJbnN1ZmZpY2llbnRGdW5kc0ZvckZlZVwiLFxuICBcIkludmFsaWRBY2NvdW50Rm9yRmVlXCIsXG4gIFwiQWxyZWFkeVByb2Nlc3NlZFwiLFxuICBcIkJsb2NraGFzaE5vdEZvdW5kXCIsXG4gIC8vIGBJbnN0cnVjdGlvbkVycm9yYCBpbnRlbnRpb25hbGx5IG9taXR0ZWQ7IGRlbGVnYXRlZCB0byBgZ2V0U29sYW5hRXJyb3JGcm9tSW5zdHJ1Y3Rpb25FcnJvcmBcbiAgXCJDYWxsQ2hhaW5Ub29EZWVwXCIsXG4gIFwiTWlzc2luZ1NpZ25hdHVyZUZvckZlZVwiLFxuICBcIkludmFsaWRBY2NvdW50SW5kZXhcIixcbiAgXCJTaWduYXR1cmVGYWlsdXJlXCIsXG4gIFwiSW52YWxpZFByb2dyYW1Gb3JFeGVjdXRpb25cIixcbiAgXCJTYW5pdGl6ZUZhaWx1cmVcIixcbiAgXCJDbHVzdGVyTWFpbnRlbmFuY2VcIixcbiAgXCJBY2NvdW50Qm9ycm93T3V0c3RhbmRpbmdcIixcbiAgXCJXb3VsZEV4Y2VlZE1heEJsb2NrQ29zdExpbWl0XCIsXG4gIFwiVW5zdXBwb3J0ZWRWZXJzaW9uXCIsXG4gIFwiSW52YWxpZFdyaXRhYmxlQWNjb3VudFwiLFxuICBcIldvdWxkRXhjZWVkTWF4QWNjb3VudENvc3RMaW1pdFwiLFxuICBcIldvdWxkRXhjZWVkQWNjb3VudERhdGFCbG9ja0xpbWl0XCIsXG4gIFwiVG9vTWFueUFjY291bnRMb2Nrc1wiLFxuICBcIkFkZHJlc3NMb29rdXBUYWJsZU5vdEZvdW5kXCIsXG4gIFwiSW52YWxpZEFkZHJlc3NMb29rdXBUYWJsZU93bmVyXCIsXG4gIFwiSW52YWxpZEFkZHJlc3NMb29rdXBUYWJsZURhdGFcIixcbiAgXCJJbnZhbGlkQWRkcmVzc0xvb2t1cFRhYmxlSW5kZXhcIixcbiAgXCJJbnZhbGlkUmVudFBheWluZ0FjY291bnRcIixcbiAgXCJXb3VsZEV4Y2VlZE1heFZvdGVDb3N0TGltaXRcIixcbiAgXCJXb3VsZEV4Y2VlZEFjY291bnREYXRhVG90YWxMaW1pdFwiLFxuICBcIkR1cGxpY2F0ZUluc3RydWN0aW9uXCIsXG4gIFwiSW5zdWZmaWNpZW50RnVuZHNGb3JSZW50XCIsXG4gIFwiTWF4TG9hZGVkQWNjb3VudHNEYXRhU2l6ZUV4Y2VlZGVkXCIsXG4gIFwiSW52YWxpZExvYWRlZEFjY291bnRzRGF0YVNpemVMaW1pdFwiLFxuICBcIlJlc2FuaXRpemF0aW9uTmVlZGVkXCIsXG4gIFwiUHJvZ3JhbUV4ZWN1dGlvblRlbXBvcmFyaWx5UmVzdHJpY3RlZFwiLFxuICBcIlVuYmFsYW5jZWRUcmFuc2FjdGlvblwiXG5dO1xuZnVuY3Rpb24gZ2V0U29sYW5hRXJyb3JGcm9tVHJhbnNhY3Rpb25FcnJvcih0cmFuc2FjdGlvbkVycm9yKSB7XG4gIGlmICh0eXBlb2YgdHJhbnNhY3Rpb25FcnJvciA9PT0gXCJvYmplY3RcIiAmJiBcIkluc3RydWN0aW9uRXJyb3JcIiBpbiB0cmFuc2FjdGlvbkVycm9yKSB7XG4gICAgcmV0dXJuIGdldFNvbGFuYUVycm9yRnJvbUluc3RydWN0aW9uRXJyb3IoXG4gICAgICAuLi50cmFuc2FjdGlvbkVycm9yLkluc3RydWN0aW9uRXJyb3JcbiAgICApO1xuICB9XG4gIHJldHVybiBnZXRTb2xhbmFFcnJvckZyb21ScGNFcnJvcihcbiAgICB7XG4gICAgICBlcnJvckNvZGVCYXNlT2Zmc2V0OiA3MDUwMDAxLFxuICAgICAgZ2V0RXJyb3JDb250ZXh0KGVycm9yQ29kZSwgcnBjRXJyb3JOYW1lLCBycGNFcnJvckNvbnRleHQpIHtcbiAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fVU5LTk9XTikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvck5hbWU6IHJwY0Vycm9yTmFtZSxcbiAgICAgICAgICAgIC4uLnJwY0Vycm9yQ29udGV4dCAhPT0gdm9pZCAwID8geyB0cmFuc2FjdGlvbkVycm9yQ29udGV4dDogcnBjRXJyb3JDb250ZXh0IH0gOiBudWxsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChlcnJvckNvZGUgPT09IFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0RVUExJQ0FURV9JTlNUUlVDVElPTikge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbmRleDogTnVtYmVyKHJwY0Vycm9yQ29udGV4dClcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGVycm9yQ29kZSA9PT0gU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fSU5TVUZGSUNJRU5UX0ZVTkRTX0ZPUl9SRU5UIHx8IGVycm9yQ29kZSA9PT0gU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fUFJPR1JBTV9FWEVDVVRJT05fVEVNUE9SQVJJTFlfUkVTVFJJQ1RFRCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY2NvdW50SW5kZXg6IE51bWJlcihycGNFcnJvckNvbnRleHQuYWNjb3VudF9pbmRleClcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb3JkZXJlZEVycm9yTmFtZXM6IE9SREVSRURfRVJST1JfTkFNRVMyLFxuICAgICAgcnBjRW51bUVycm9yOiB0cmFuc2FjdGlvbkVycm9yXG4gICAgfSxcbiAgICBnZXRTb2xhbmFFcnJvckZyb21UcmFuc2FjdGlvbkVycm9yXG4gICk7XG59XG5cbi8vIHNyYy9qc29uLXJwYy1lcnJvci50c1xuZnVuY3Rpb24gZ2V0U29sYW5hRXJyb3JGcm9tSnNvblJwY0Vycm9yKHB1dGF0aXZlRXJyb3JSZXNwb25zZSkge1xuICBsZXQgb3V0O1xuICBpZiAoaXNScGNFcnJvclJlc3BvbnNlKHB1dGF0aXZlRXJyb3JSZXNwb25zZSkpIHtcbiAgICBjb25zdCB7IGNvZGU6IHJhd0NvZGUsIGRhdGEsIG1lc3NhZ2UgfSA9IHB1dGF0aXZlRXJyb3JSZXNwb25zZTtcbiAgICBjb25zdCBjb2RlID0gTnVtYmVyKHJhd0NvZGUpO1xuICAgIGlmIChjb2RlID09PSBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfU0VORF9UUkFOU0FDVElPTl9QUkVGTElHSFRfRkFJTFVSRSkge1xuICAgICAgY29uc3QgeyBlcnIsIC4uLnByZWZsaWdodEVycm9yQ29udGV4dCB9ID0gZGF0YTtcbiAgICAgIGNvbnN0IGNhdXNlT2JqZWN0ID0gZXJyID8geyBjYXVzZTogZ2V0U29sYW5hRXJyb3JGcm9tVHJhbnNhY3Rpb25FcnJvcihlcnIpIH0gOiBudWxsO1xuICAgICAgb3V0ID0gbmV3IFNvbGFuYUVycm9yKFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9TRU5EX1RSQU5TQUNUSU9OX1BSRUZMSUdIVF9GQUlMVVJFLCB7XG4gICAgICAgIC4uLnByZWZsaWdodEVycm9yQ29udGV4dCxcbiAgICAgICAgLi4uY2F1c2VPYmplY3RcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZXJyb3JDb250ZXh0O1xuICAgICAgc3dpdGNoIChjb2RlKSB7XG4gICAgICAgIGNhc2UgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fSU5URVJOQUxfRVJST1I6XG4gICAgICAgIGNhc2UgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fSU5WQUxJRF9QQVJBTVM6XG4gICAgICAgIGNhc2UgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fSU5WQUxJRF9SRVFVRVNUOlxuICAgICAgICBjYXNlIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX01FVEhPRF9OT1RfRk9VTkQ6XG4gICAgICAgIGNhc2UgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fUEFSU0VfRVJST1I6XG4gICAgICAgIGNhc2UgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0NBTl9FUlJPUjpcbiAgICAgICAgY2FzZSBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfQkxPQ0tfQ0xFQU5FRF9VUDpcbiAgICAgICAgY2FzZSBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfQkxPQ0tfTk9UX0FWQUlMQUJMRTpcbiAgICAgICAgY2FzZSBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfQkxPQ0tfU1RBVFVTX05PVF9BVkFJTEFCTEVfWUVUOlxuICAgICAgICBjYXNlIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9LRVlfRVhDTFVERURfRlJPTV9TRUNPTkRBUllfSU5ERVg6XG4gICAgICAgIGNhc2UgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX0xPTkdfVEVSTV9TVE9SQUdFX1NMT1RfU0tJUFBFRDpcbiAgICAgICAgY2FzZSBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfU0xPVF9TS0lQUEVEOlxuICAgICAgICBjYXNlIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9UUkFOU0FDVElPTl9QUkVDT01QSUxFX1ZFUklGSUNBVElPTl9GQUlMVVJFOlxuICAgICAgICBjYXNlIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9VTlNVUFBPUlRFRF9UUkFOU0FDVElPTl9WRVJTSU9OOlxuICAgICAgICAgIGVycm9yQ29udGV4dCA9IHsgX19zZXJ2ZXJNZXNzYWdlOiBtZXNzYWdlIH07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgICAgICBlcnJvckNvbnRleHQgPSBkYXRhO1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG91dCA9IG5ldyBTb2xhbmFFcnJvcihjb2RlLCBlcnJvckNvbnRleHQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtZXNzYWdlID0gdHlwZW9mIHB1dGF0aXZlRXJyb3JSZXNwb25zZSA9PT0gXCJvYmplY3RcIiAmJiBwdXRhdGl2ZUVycm9yUmVzcG9uc2UgIT09IG51bGwgJiYgXCJtZXNzYWdlXCIgaW4gcHV0YXRpdmVFcnJvclJlc3BvbnNlICYmIHR5cGVvZiBwdXRhdGl2ZUVycm9yUmVzcG9uc2UubWVzc2FnZSA9PT0gXCJzdHJpbmdcIiA/IHB1dGF0aXZlRXJyb3JSZXNwb25zZS5tZXNzYWdlIDogXCJNYWxmb3JtZWQgSlNPTi1SUEMgZXJyb3Igd2l0aCBubyBtZXNzYWdlIGF0dHJpYnV0ZVwiO1xuICAgIG91dCA9IG5ldyBTb2xhbmFFcnJvcihTT0xBTkFfRVJST1JfX01BTEZPUk1FRF9KU09OX1JQQ19FUlJPUiwgeyBlcnJvcjogcHV0YXRpdmVFcnJvclJlc3BvbnNlLCBtZXNzYWdlIH0pO1xuICB9XG4gIHNhZmVDYXB0dXJlU3RhY2tUcmFjZShvdXQsIGdldFNvbGFuYUVycm9yRnJvbUpzb25ScGNFcnJvcik7XG4gIHJldHVybiBvdXQ7XG59XG5mdW5jdGlvbiBpc1JwY0Vycm9yUmVzcG9uc2UodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSAhPT0gbnVsbCAmJiBcImNvZGVcIiBpbiB2YWx1ZSAmJiBcIm1lc3NhZ2VcIiBpbiB2YWx1ZSAmJiAodHlwZW9mIHZhbHVlLmNvZGUgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHZhbHVlLmNvZGUgPT09IFwiYmlnaW50XCIpICYmIHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09PSBcInN0cmluZ1wiO1xufVxuXG5leHBvcnQgeyBTT0xBTkFfRVJST1JfX0FDQ09VTlRTX19BQ0NPVU5UX05PVF9GT1VORCwgU09MQU5BX0VSUk9SX19BQ0NPVU5UU19fRVhQRUNURURfQUxMX0FDQ09VTlRTX1RPX0JFX0RFQ09ERUQsIFNPTEFOQV9FUlJPUl9fQUNDT1VOVFNfX0VYUEVDVEVEX0RFQ09ERURfQUNDT1VOVCwgU09MQU5BX0VSUk9SX19BQ0NPVU5UU19fRkFJTEVEX1RPX0RFQ09ERV9BQ0NPVU5ULCBTT0xBTkFfRVJST1JfX0FDQ09VTlRTX19PTkVfT1JfTU9SRV9BQ0NPVU5UU19OT1RfRk9VTkQsIFNPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19GQUlMRURfVE9fRklORF9WSUFCTEVfUERBX0JVTVBfU0VFRCwgU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX0lOVkFMSURfQkFTRTU4X0VOQ09ERURfQUREUkVTUywgU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX0lOVkFMSURfQllURV9MRU5HVEgsIFNPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19JTlZBTElEX0VEMjU1MTlfUFVCTElDX0tFWSwgU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX0lOVkFMSURfT0ZGX0NVUlZFX0FERFJFU1MsIFNPTEFOQV9FUlJPUl9fQUREUkVTU0VTX19JTlZBTElEX1NFRURTX1BPSU5UX09OX0NVUlZFLCBTT0xBTkFfRVJST1JfX0FERFJFU1NFU19fTUFMRk9STUVEX1BEQSwgU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX01BWF9OVU1CRVJfT0ZfUERBX1NFRURTX0VYQ0VFREVELCBTT0xBTkFfRVJST1JfX0FERFJFU1NFU19fTUFYX1BEQV9TRUVEX0xFTkdUSF9FWENFRURFRCwgU09MQU5BX0VSUk9SX19BRERSRVNTRVNfX1BEQV9CVU1QX1NFRURfT1VUX09GX1JBTkdFLCBTT0xBTkFfRVJST1JfX0FERFJFU1NFU19fUERBX0VORFNfV0lUSF9QREFfTUFSS0VSLCBTT0xBTkFfRVJST1JfX0FERFJFU1NFU19fU1RSSU5HX0xFTkdUSF9PVVRfT0ZfUkFOR0UsIFNPTEFOQV9FUlJPUl9fQkxPQ0tIQVNIX1NUUklOR19MRU5HVEhfT1VUX09GX1JBTkdFLCBTT0xBTkFfRVJST1JfX0JMT0NLX0hFSUdIVF9FWENFRURFRCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0NBTk5PVF9ERUNPREVfRU1QVFlfQllURV9BUlJBWSwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0NBTk5PVF9VU0VfTEVYSUNBTF9WQUxVRVNfQVNfRU5VTV9ESVNDUklNSU5BVE9SUywgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VOQ09ERURfQllURVNfTVVTVF9OT1RfSU5DTFVERV9TRU5USU5FTCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VOQ09ERVJfREVDT0RFUl9GSVhFRF9TSVpFX01JU01BVENILCBTT0xBTkFfRVJST1JfX0NPREVDU19fRU5DT0RFUl9ERUNPREVSX01BWF9TSVpFX01JU01BVENILCBTT0xBTkFfRVJST1JfX0NPREVDU19fRU5DT0RFUl9ERUNPREVSX1NJWkVfQ09NUEFUSUJJTElUWV9NSVNNQVRDSCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VOVU1fRElTQ1JJTUlOQVRPUl9PVVRfT0ZfUkFOR0UsIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FWFBFQ1RFRF9GSVhFRF9MRU5HVEgsIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19FWFBFQ1RFRF9QT1NJVElWRV9CWVRFX0xFTkdUSCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VYUEVDVEVEX1ZBUklBQkxFX0xFTkdUSCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0VYUEVDVEVEX1pFUk9fVkFMVUVfVE9fTUFUQ0hfSVRFTV9GSVhFRF9TSVpFLCBTT0xBTkFfRVJST1JfX0NPREVDU19fSU5WQUxJRF9CWVRFX0xFTkdUSCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0lOVkFMSURfQ09OU1RBTlQsIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19JTlZBTElEX0RJU0NSSU1JTkFURURfVU5JT05fVkFSSUFOVCwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0lOVkFMSURfRU5VTV9WQVJJQU5ULCBTT0xBTkFfRVJST1JfX0NPREVDU19fSU5WQUxJRF9MSVRFUkFMX1VOSU9OX1ZBUklBTlQsIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19JTlZBTElEX05VTUJFUl9PRl9JVEVNUywgU09MQU5BX0VSUk9SX19DT0RFQ1NfX0lOVkFMSURfU1RSSU5HX0ZPUl9CQVNFLCBTT0xBTkFfRVJST1JfX0NPREVDU19fTElURVJBTF9VTklPTl9ESVNDUklNSU5BVE9SX09VVF9PRl9SQU5HRSwgU09MQU5BX0VSUk9SX19DT0RFQ1NfX05VTUJFUl9PVVRfT0ZfUkFOR0UsIFNPTEFOQV9FUlJPUl9fQ09ERUNTX19PRkZTRVRfT1VUX09GX1JBTkdFLCBTT0xBTkFfRVJST1JfX0NPREVDU19fU0VOVElORUxfTUlTU0lOR19JTl9ERUNPREVEX0JZVEVTLCBTT0xBTkFfRVJST1JfX0NPREVDU19fVU5JT05fVkFSSUFOVF9PVVRfT0ZfUkFOR0UsIFNPTEFOQV9FUlJPUl9fQ1JZUFRPX19SQU5ET01fVkFMVUVTX0ZVTkNUSU9OX1VOSU1QTEVNRU5URUQsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0FDQ09VTlRfQUxSRUFEWV9JTklUSUFMSVpFRCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9CT1JST1dfRkFJTEVELCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19BQ0NPVU5UX0JPUlJPV19PVVRTVEFORElORywgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9EQVRBX1NJWkVfQ0hBTkdFRCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9EQVRBX1RPT19TTUFMTCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9OT1RfRVhFQ1VUQUJMRSwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQUNDT1VOVF9OT1RfUkVOVF9FWEVNUFQsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0FSSVRITUVUSUNfT1ZFUkZMT1csIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0JPUlNIX0lPX0VSUk9SLCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19CVUlMVElOX1BST0dSQU1TX01VU1RfQ09OU1VNRV9DT01QVVRFX1VOSVRTLCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19DQUxMX0RFUFRILCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19DT01QVVRBVElPTkFMX0JVREdFVF9FWENFRURFRCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fQ1VTVE9NLCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19EVVBMSUNBVEVfQUNDT1VOVF9JTkRFWCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fRFVQTElDQVRFX0FDQ09VTlRfT1VUX09GX1NZTkMsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0VYRUNVVEFCTEVfQUNDT1VOVF9OT1RfUkVOVF9FWEVNUFQsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0VYRUNVVEFCTEVfREFUQV9NT0RJRklFRCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fRVhFQ1VUQUJMRV9MQU1QT1JUX0NIQU5HRSwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fRVhFQ1VUQUJMRV9NT0RJRklFRCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fRVhURVJOQUxfQUNDT1VOVF9EQVRBX01PRElGSUVELCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19FWFRFUk5BTF9BQ0NPVU5UX0xBTVBPUlRfU1BFTkQsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0dFTkVSSUNfRVJST1IsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lMTEVHQUxfT1dORVIsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lNTVVUQUJMRSwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5DT1JSRUNUX0FVVEhPUklUWSwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5DT1JSRUNUX1BST0dSQU1fSUQsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lOU1VGRklDSUVOVF9GVU5EUywgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9BQ0NPVU5UX0RBVEEsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lOVkFMSURfQUNDT1VOVF9PV05FUiwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9BUkdVTUVOVCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9FUlJPUiwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fSU5WQUxJRF9JTlNUUlVDVElPTl9EQVRBLCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19JTlZBTElEX1JFQUxMT0MsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX0lOVkFMSURfU0VFRFMsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX01BWF9BQ0NPVU5UU19EQVRBX0FMTE9DQVRJT05TX0VYQ0VFREVELCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19NQVhfQUNDT1VOVFNfRVhDRUVERUQsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX01BWF9JTlNUUlVDVElPTl9UUkFDRV9MRU5HVEhfRVhDRUVERUQsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX01BWF9TRUVEX0xFTkdUSF9FWENFRURFRCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fTUlTU0lOR19BQ0NPVU5ULCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19NSVNTSU5HX1JFUVVJUkVEX1NJR05BVFVSRSwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fTU9ESUZJRURfUFJPR1JBTV9JRCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fTk9UX0VOT1VHSF9BQ0NPVU5UX0tFWVMsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1BSSVZJTEVHRV9FU0NBTEFUSU9OLCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19QUk9HUkFNX0VOVklST05NRU5UX1NFVFVQX0ZBSUxVUkUsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1BST0dSQU1fRkFJTEVEX1RPX0NPTVBJTEUsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fRVJST1JfX1BST0dSQU1fRkFJTEVEX1RPX0NPTVBMRVRFLCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19SRUFET05MWV9EQVRBX01PRElGSUVELCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19SRUFET05MWV9MQU1QT1JUX0NIQU5HRSwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fUkVFTlRSQU5DWV9OT1RfQUxMT1dFRCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fUkVOVF9FUE9DSF9NT0RJRklFRCwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fVU5CQUxBTkNFRF9JTlNUUlVDVElPTiwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9FUlJPUl9fVU5JTklUSUFMSVpFRF9BQ0NPVU5ULCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19VTktOT1dOLCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19VTlNVUFBPUlRFRF9QUk9HUkFNX0lELCBTT0xBTkFfRVJST1JfX0lOU1RSVUNUSU9OX0VSUk9SX19VTlNVUFBPUlRFRF9TWVNWQVIsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fX0VYUEVDVEVEX1RPX0hBVkVfQUNDT1VOVFMsIFNPTEFOQV9FUlJPUl9fSU5TVFJVQ1RJT05fX0VYUEVDVEVEX1RPX0hBVkVfREFUQSwgU09MQU5BX0VSUk9SX19JTlNUUlVDVElPTl9fUFJPR1JBTV9JRF9NSVNNQVRDSCwgU09MQU5BX0VSUk9SX19JTlZBTElEX0JMT0NLSEFTSF9CWVRFX0xFTkdUSCwgU09MQU5BX0VSUk9SX19JTlZBTElEX05PTkNFLCBTT0xBTkFfRVJST1JfX0lOVkFSSUFOVF9WSU9MQVRJT05fX0NBQ0hFRF9BQk9SVEFCTEVfSVRFUkFCTEVfQ0FDSEVfRU5UUllfTUlTU0lORywgU09MQU5BX0VSUk9SX19JTlZBUklBTlRfVklPTEFUSU9OX19EQVRBX1BVQkxJU0hFUl9DSEFOTkVMX1VOSU1QTEVNRU5URUQsIFNPTEFOQV9FUlJPUl9fSU5WQVJJQU5UX1ZJT0xBVElPTl9fU1VCU0NSSVBUSU9OX0lURVJBVE9SX01VU1RfTk9UX1BPTExfQkVGT1JFX1JFU09MVklOR19FWElTVElOR19NRVNTQUdFX1BST01JU0UsIFNPTEFOQV9FUlJPUl9fSU5WQVJJQU5UX1ZJT0xBVElPTl9fU1VCU0NSSVBUSU9OX0lURVJBVE9SX1NUQVRFX01JU1NJTkcsIFNPTEFOQV9FUlJPUl9fSU5WQVJJQU5UX1ZJT0xBVElPTl9fU1dJVENIX01VU1RfQkVfRVhIQVVTVElWRSwgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fSU5URVJOQUxfRVJST1IsIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX0lOVkFMSURfUEFSQU1TLCBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19JTlZBTElEX1JFUVVFU1QsIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX01FVEhPRF9OT1RfRk9VTkQsIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1BBUlNFX0VSUk9SLCBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TQ0FOX0VSUk9SLCBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfQkxPQ0tfQ0xFQU5FRF9VUCwgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX0JMT0NLX05PVF9BVkFJTEFCTEUsIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9CTE9DS19TVEFUVVNfTk9UX0FWQUlMQUJMRV9ZRVQsIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9LRVlfRVhDTFVERURfRlJPTV9TRUNPTkRBUllfSU5ERVgsIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9MT05HX1RFUk1fU1RPUkFHRV9TTE9UX1NLSVBQRUQsIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9NSU5fQ09OVEVYVF9TTE9UX05PVF9SRUFDSEVELCBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfTk9ERV9VTkhFQUxUSFksIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9OT19TTkFQU0hPVCwgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX1NFTkRfVFJBTlNBQ1RJT05fUFJFRkxJR0hUX0ZBSUxVUkUsIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9TTE9UX1NLSVBQRUQsIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9UUkFOU0FDVElPTl9ISVNUT1JZX05PVF9BVkFJTEFCTEUsIFNPTEFOQV9FUlJPUl9fSlNPTl9SUENfX1NFUlZFUl9FUlJPUl9UUkFOU0FDVElPTl9QUkVDT01QSUxFX1ZFUklGSUNBVElPTl9GQUlMVVJFLCBTT0xBTkFfRVJST1JfX0pTT05fUlBDX19TRVJWRVJfRVJST1JfVFJBTlNBQ1RJT05fU0lHTkFUVVJFX0xFTl9NSVNNQVRDSCwgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX1RSQU5TQUNUSU9OX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTFVSRSwgU09MQU5BX0VSUk9SX19KU09OX1JQQ19fU0VSVkVSX0VSUk9SX1VOU1VQUE9SVEVEX1RSQU5TQUNUSU9OX1ZFUlNJT04sIFNPTEFOQV9FUlJPUl9fS0VZU19fSU5WQUxJRF9LRVlfUEFJUl9CWVRFX0xFTkdUSCwgU09MQU5BX0VSUk9SX19LRVlTX19JTlZBTElEX1BSSVZBVEVfS0VZX0JZVEVfTEVOR1RILCBTT0xBTkFfRVJST1JfX0tFWVNfX0lOVkFMSURfU0lHTkFUVVJFX0JZVEVfTEVOR1RILCBTT0xBTkFfRVJST1JfX0tFWVNfX1BVQkxJQ19LRVlfTVVTVF9NQVRDSF9QUklWQVRFX0tFWSwgU09MQU5BX0VSUk9SX19LRVlTX19TSUdOQVRVUkVfU1RSSU5HX0xFTkdUSF9PVVRfT0ZfUkFOR0UsIFNPTEFOQV9FUlJPUl9fTEFNUE9SVFNfT1VUX09GX1JBTkdFLCBTT0xBTkFfRVJST1JfX01BTEZPUk1FRF9CSUdJTlRfU1RSSU5HLCBTT0xBTkFfRVJST1JfX01BTEZPUk1FRF9KU09OX1JQQ19FUlJPUiwgU09MQU5BX0VSUk9SX19NQUxGT1JNRURfTlVNQkVSX1NUUklORywgU09MQU5BX0VSUk9SX19OT05DRV9BQ0NPVU5UX05PVF9GT1VORCwgU09MQU5BX0VSUk9SX19SUENfU1VCU0NSSVBUSU9OU19fQ0FOTk9UX0NSRUFURV9TVUJTQ1JJUFRJT05fUExBTiwgU09MQU5BX0VSUk9SX19SUENfU1VCU0NSSVBUSU9OU19fQ0hBTk5FTF9DTE9TRURfQkVGT1JFX01FU1NBR0VfQlVGRkVSRUQsIFNPTEFOQV9FUlJPUl9fUlBDX1NVQlNDUklQVElPTlNfX0NIQU5ORUxfQ09OTkVDVElPTl9DTE9TRUQsIFNPTEFOQV9FUlJPUl9fUlBDX1NVQlNDUklQVElPTlNfX0NIQU5ORUxfRkFJTEVEX1RPX0NPTk5FQ1QsIFNPTEFOQV9FUlJPUl9fUlBDX1NVQlNDUklQVElPTlNfX0VYUEVDVEVEX1NFUlZFUl9TVUJTQ1JJUFRJT05fSUQsIFNPTEFOQV9FUlJPUl9fUlBDX19BUElfUExBTl9NSVNTSU5HX0ZPUl9SUENfTUVUSE9ELCBTT0xBTkFfRVJST1JfX1JQQ19fSU5URUdFUl9PVkVSRkxPVywgU09MQU5BX0VSUk9SX19SUENfX1RSQU5TUE9SVF9IVFRQX0VSUk9SLCBTT0xBTkFfRVJST1JfX1JQQ19fVFJBTlNQT1JUX0hUVFBfSEVBREVSX0ZPUkJJRERFTiwgU09MQU5BX0VSUk9SX19TSUdORVJfX0FERFJFU1NfQ0FOTk9UX0hBVkVfTVVMVElQTEVfU0lHTkVSUywgU09MQU5BX0VSUk9SX19TSUdORVJfX0VYUEVDVEVEX0tFWV9QQUlSX1NJR05FUiwgU09MQU5BX0VSUk9SX19TSUdORVJfX0VYUEVDVEVEX01FU1NBR0VfTU9ESUZZSU5HX1NJR05FUiwgU09MQU5BX0VSUk9SX19TSUdORVJfX0VYUEVDVEVEX01FU1NBR0VfUEFSVElBTF9TSUdORVIsIFNPTEFOQV9FUlJPUl9fU0lHTkVSX19FWFBFQ1RFRF9NRVNTQUdFX1NJR05FUiwgU09MQU5BX0VSUk9SX19TSUdORVJfX0VYUEVDVEVEX1RSQU5TQUNUSU9OX01PRElGWUlOR19TSUdORVIsIFNPTEFOQV9FUlJPUl9fU0lHTkVSX19FWFBFQ1RFRF9UUkFOU0FDVElPTl9QQVJUSUFMX1NJR05FUiwgU09MQU5BX0VSUk9SX19TSUdORVJfX0VYUEVDVEVEX1RSQU5TQUNUSU9OX1NFTkRJTkdfU0lHTkVSLCBTT0xBTkFfRVJST1JfX1NJR05FUl9fRVhQRUNURURfVFJBTlNBQ1RJT05fU0lHTkVSLCBTT0xBTkFfRVJST1JfX1NJR05FUl9fVFJBTlNBQ1RJT05fQ0FOTk9UX0hBVkVfTVVMVElQTEVfU0VORElOR19TSUdORVJTLCBTT0xBTkFfRVJST1JfX1NJR05FUl9fVFJBTlNBQ1RJT05fU0VORElOR19TSUdORVJfTUlTU0lORywgU09MQU5BX0VSUk9SX19TSUdORVJfX1dBTExFVF9NVUxUSVNJR05fVU5JTVBMRU1FTlRFRCwgU09MQU5BX0VSUk9SX19TVUJUTEVfQ1JZUFRPX19DQU5OT1RfRVhQT1JUX05PTl9FWFRSQUNUQUJMRV9LRVksIFNPTEFOQV9FUlJPUl9fU1VCVExFX0NSWVBUT19fRElHRVNUX1VOSU1QTEVNRU5URUQsIFNPTEFOQV9FUlJPUl9fU1VCVExFX0NSWVBUT19fRElTQUxMT1dFRF9JTl9JTlNFQ1VSRV9DT05URVhULCBTT0xBTkFfRVJST1JfX1NVQlRMRV9DUllQVE9fX0VEMjU1MTlfQUxHT1JJVEhNX1VOSU1QTEVNRU5URUQsIFNPTEFOQV9FUlJPUl9fU1VCVExFX0NSWVBUT19fRVhQT1JUX0ZVTkNUSU9OX1VOSU1QTEVNRU5URUQsIFNPTEFOQV9FUlJPUl9fU1VCVExFX0NSWVBUT19fR0VORVJBVEVfRlVOQ1RJT05fVU5JTVBMRU1FTlRFRCwgU09MQU5BX0VSUk9SX19TVUJUTEVfQ1JZUFRPX19TSUdOX0ZVTkNUSU9OX1VOSU1QTEVNRU5URUQsIFNPTEFOQV9FUlJPUl9fU1VCVExFX0NSWVBUT19fVkVSSUZZX0ZVTkNUSU9OX1VOSU1QTEVNRU5URUQsIFNPTEFOQV9FUlJPUl9fVElNRVNUQU1QX09VVF9PRl9SQU5HRSwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fQUNDT1VOVF9CT1JST1dfT1VUU1RBTkRJTkcsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0FDQ09VTlRfSU5fVVNFLCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19BQ0NPVU5UX0xPQURFRF9UV0lDRSwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fQUNDT1VOVF9OT1RfRk9VTkQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0FERFJFU1NfTE9PS1VQX1RBQkxFX05PVF9GT1VORCwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fQUxSRUFEWV9QUk9DRVNTRUQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0JMT0NLSEFTSF9OT1RfRk9VTkQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0NBTExfQ0hBSU5fVE9PX0RFRVAsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0NMVVNURVJfTUFJTlRFTkFOQ0UsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0RVUExJQ0FURV9JTlNUUlVDVElPTiwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fSU5TVUZGSUNJRU5UX0ZVTkRTX0ZPUl9GRUUsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOU1VGRklDSUVOVF9GVU5EU19GT1JfUkVOVCwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fSU5WQUxJRF9BQ0NPVU5UX0ZPUl9GRUUsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfQUNDT1VOVF9JTkRFWCwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fSU5WQUxJRF9BRERSRVNTX0xPT0tVUF9UQUJMRV9EQVRBLCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlZBTElEX0FERFJFU1NfTE9PS1VQX1RBQkxFX0lOREVYLCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlZBTElEX0FERFJFU1NfTE9PS1VQX1RBQkxFX09XTkVSLCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlZBTElEX0xPQURFRF9BQ0NPVU5UU19EQVRBX1NJWkVfTElNSVQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfUFJPR1JBTV9GT1JfRVhFQ1VUSU9OLCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19JTlZBTElEX1JFTlRfUEFZSU5HX0FDQ09VTlQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX0lOVkFMSURfV1JJVEFCTEVfQUNDT1VOVCwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fTUFYX0xPQURFRF9BQ0NPVU5UU19EQVRBX1NJWkVfRVhDRUVERUQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX01JU1NJTkdfU0lHTkFUVVJFX0ZPUl9GRUUsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1BST0dSQU1fQUNDT1VOVF9OT1RfRk9VTkQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1BST0dSQU1fRVhFQ1VUSU9OX1RFTVBPUkFSSUxZX1JFU1RSSUNURUQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1JFU0FOSVRJWkFUSU9OX05FRURFRCwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fU0FOSVRJWkVfRkFJTFVSRSwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9FUlJPUl9fU0lHTkFUVVJFX0ZBSUxVUkUsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1RPT19NQU5ZX0FDQ09VTlRfTE9DS1MsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1VOQkFMQU5DRURfVFJBTlNBQ1RJT04sIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1VOS05PV04sIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1VOU1VQUE9SVEVEX1ZFUlNJT04sIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1dPVUxEX0VYQ0VFRF9BQ0NPVU5UX0RBVEFfQkxPQ0tfTElNSVQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1dPVUxEX0VYQ0VFRF9BQ0NPVU5UX0RBVEFfVE9UQUxfTElNSVQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1dPVUxEX0VYQ0VFRF9NQVhfQUNDT1VOVF9DT1NUX0xJTUlULCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX0VSUk9SX19XT1VMRF9FWENFRURfTUFYX0JMT0NLX0NPU1RfTElNSVQsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fRVJST1JfX1dPVUxEX0VYQ0VFRF9NQVhfVk9URV9DT1NUX0xJTUlULCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19BRERSRVNTRVNfQ0FOTk9UX1NJR05fVFJBTlNBQ1RJT04sIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0FERFJFU1NfTUlTU0lORywgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fQ0FOTk9UX0VOQ09ERV9XSVRIX0VNUFRZX1NJR05BVFVSRVMsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0VYQ0VFRFNfU0laRV9MSU1JVCwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRVhQRUNURURfQkxPQ0tIQVNIX0xJRkVUSU1FLCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19FWFBFQ1RFRF9OT05DRV9MSUZFVElNRSwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRkFJTEVEX1RPX0RFQ09NUElMRV9BRERSRVNTX0xPT0tVUF9UQUJMRV9DT05URU5UU19NSVNTSU5HLCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19GQUlMRURfVE9fREVDT01QSUxFX0FERFJFU1NfTE9PS1VQX1RBQkxFX0lOREVYX09VVF9PRl9SQU5HRSwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRkFJTEVEX1RPX0RFQ09NUElMRV9GRUVfUEFZRVJfTUlTU0lORywgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRkFJTEVEX1RPX0RFQ09NUElMRV9JTlNUUlVDVElPTl9QUk9HUkFNX0FERFJFU1NfTk9UX0ZPVU5ELCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19GQUlMRURfVE9fRVNUSU1BVEVfQ09NUFVURV9MSU1JVCwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRkFJTEVEX1dIRU5fU0lNVUxBVElOR19UT19FU1RJTUFURV9DT01QVVRFX0xJTUlULCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19GRUVfUEFZRVJfTUlTU0lORywgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fRkVFX1BBWUVSX1NJR05BVFVSRV9NSVNTSU5HLCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19JTlZBTElEX05PTkNFX1RSQU5TQUNUSU9OX0ZJUlNUX0lOU1RSVUNUSU9OX01VU1RfQkVfQURWQU5DRV9OT05DRSwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fSU5WQUxJRF9OT05DRV9UUkFOU0FDVElPTl9JTlNUUlVDVElPTlNfTUlTU0lORywgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fSU5WT0tFRF9QUk9HUkFNU19DQU5OT1RfUEFZX0ZFRVMsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX0lOVk9LRURfUFJPR1JBTVNfTVVTVF9OT1RfQkVfV1JJVEFCTEUsIFNPTEFOQV9FUlJPUl9fVFJBTlNBQ1RJT05fX01FU1NBR0VfU0lHTkFUVVJFU19NSVNNQVRDSCwgU09MQU5BX0VSUk9SX19UUkFOU0FDVElPTl9fU0lHTkFUVVJFU19NSVNTSU5HLCBTT0xBTkFfRVJST1JfX1RSQU5TQUNUSU9OX19WRVJTSU9OX05VTUJFUl9PVVRfT0ZfUkFOR0UsIFNvbGFuYUVycm9yLCBnZXRTb2xhbmFFcnJvckZyb21JbnN0cnVjdGlvbkVycm9yLCBnZXRTb2xhbmFFcnJvckZyb21Kc29uUnBjRXJyb3IsIGdldFNvbGFuYUVycm9yRnJvbVRyYW5zYWN0aW9uRXJyb3IsIGlzU29sYW5hRXJyb3IsIHNhZmVDYXB0dXJlU3RhY2tUcmFjZSB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguYnJvd3Nlci5tanMubWFwXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5icm93c2VyLm1qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@solana/errors/dist/index.browser.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@solana/web3.js/lib/index.browser.esm.js":
/*!***************************************************************!*\
  !*** ./node_modules/@solana/web3.js/lib/index.browser.esm.js ***!
  \***************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Account: () => (/* binding */ Account),\n/* harmony export */   AddressLookupTableAccount: () => (/* binding */ AddressLookupTableAccount),\n/* harmony export */   AddressLookupTableInstruction: () => (/* binding */ AddressLookupTableInstruction),\n/* harmony export */   AddressLookupTableProgram: () => (/* binding */ AddressLookupTableProgram),\n/* harmony export */   Authorized: () => (/* binding */ Authorized),\n/* harmony export */   BLOCKHASH_CACHE_TIMEOUT_MS: () => (/* binding */ BLOCKHASH_CACHE_TIMEOUT_MS),\n/* harmony export */   BPF_LOADER_DEPRECATED_PROGRAM_ID: () => (/* binding */ BPF_LOADER_DEPRECATED_PROGRAM_ID),\n/* harmony export */   BPF_LOADER_PROGRAM_ID: () => (/* binding */ BPF_LOADER_PROGRAM_ID),\n/* harmony export */   BpfLoader: () => (/* binding */ BpfLoader),\n/* harmony export */   COMPUTE_BUDGET_INSTRUCTION_LAYOUTS: () => (/* binding */ COMPUTE_BUDGET_INSTRUCTION_LAYOUTS),\n/* harmony export */   ComputeBudgetInstruction: () => (/* binding */ ComputeBudgetInstruction),\n/* harmony export */   ComputeBudgetProgram: () => (/* binding */ ComputeBudgetProgram),\n/* harmony export */   Connection: () => (/* binding */ Connection),\n/* harmony export */   Ed25519Program: () => (/* binding */ Ed25519Program),\n/* harmony export */   Enum: () => (/* binding */ Enum),\n/* harmony export */   EpochSchedule: () => (/* binding */ EpochSchedule),\n/* harmony export */   FeeCalculatorLayout: () => (/* binding */ FeeCalculatorLayout),\n/* harmony export */   Keypair: () => (/* binding */ Keypair),\n/* harmony export */   LAMPORTS_PER_SOL: () => (/* binding */ LAMPORTS_PER_SOL),\n/* harmony export */   LOOKUP_TABLE_INSTRUCTION_LAYOUTS: () => (/* binding */ LOOKUP_TABLE_INSTRUCTION_LAYOUTS),\n/* harmony export */   Loader: () => (/* binding */ Loader),\n/* harmony export */   Lockup: () => (/* binding */ Lockup),\n/* harmony export */   MAX_SEED_LENGTH: () => (/* binding */ MAX_SEED_LENGTH),\n/* harmony export */   Message: () => (/* binding */ Message),\n/* harmony export */   MessageAccountKeys: () => (/* binding */ MessageAccountKeys),\n/* harmony export */   MessageV0: () => (/* binding */ MessageV0),\n/* harmony export */   NONCE_ACCOUNT_LENGTH: () => (/* binding */ NONCE_ACCOUNT_LENGTH),\n/* harmony export */   NonceAccount: () => (/* binding */ NonceAccount),\n/* harmony export */   PACKET_DATA_SIZE: () => (/* binding */ PACKET_DATA_SIZE),\n/* harmony export */   PUBLIC_KEY_LENGTH: () => (/* binding */ PUBLIC_KEY_LENGTH),\n/* harmony export */   PublicKey: () => (/* binding */ PublicKey),\n/* harmony export */   SIGNATURE_LENGTH_IN_BYTES: () => (/* binding */ SIGNATURE_LENGTH_IN_BYTES),\n/* harmony export */   SOLANA_SCHEMA: () => (/* binding */ SOLANA_SCHEMA),\n/* harmony export */   STAKE_CONFIG_ID: () => (/* binding */ STAKE_CONFIG_ID),\n/* harmony export */   STAKE_INSTRUCTION_LAYOUTS: () => (/* binding */ STAKE_INSTRUCTION_LAYOUTS),\n/* harmony export */   SYSTEM_INSTRUCTION_LAYOUTS: () => (/* binding */ SYSTEM_INSTRUCTION_LAYOUTS),\n/* harmony export */   SYSVAR_CLOCK_PUBKEY: () => (/* binding */ SYSVAR_CLOCK_PUBKEY),\n/* harmony export */   SYSVAR_EPOCH_SCHEDULE_PUBKEY: () => (/* binding */ SYSVAR_EPOCH_SCHEDULE_PUBKEY),\n/* harmony export */   SYSVAR_INSTRUCTIONS_PUBKEY: () => (/* binding */ SYSVAR_INSTRUCTIONS_PUBKEY),\n/* harmony export */   SYSVAR_RECENT_BLOCKHASHES_PUBKEY: () => (/* binding */ SYSVAR_RECENT_BLOCKHASHES_PUBKEY),\n/* harmony export */   SYSVAR_RENT_PUBKEY: () => (/* binding */ SYSVAR_RENT_PUBKEY),\n/* harmony export */   SYSVAR_REWARDS_PUBKEY: () => (/* binding */ SYSVAR_REWARDS_PUBKEY),\n/* harmony export */   SYSVAR_SLOT_HASHES_PUBKEY: () => (/* binding */ SYSVAR_SLOT_HASHES_PUBKEY),\n/* harmony export */   SYSVAR_SLOT_HISTORY_PUBKEY: () => (/* binding */ SYSVAR_SLOT_HISTORY_PUBKEY),\n/* harmony export */   SYSVAR_STAKE_HISTORY_PUBKEY: () => (/* binding */ SYSVAR_STAKE_HISTORY_PUBKEY),\n/* harmony export */   Secp256k1Program: () => (/* binding */ Secp256k1Program),\n/* harmony export */   SendTransactionError: () => (/* binding */ SendTransactionError),\n/* harmony export */   SolanaJSONRPCError: () => (/* binding */ SolanaJSONRPCError),\n/* harmony export */   SolanaJSONRPCErrorCode: () => (/* binding */ SolanaJSONRPCErrorCode),\n/* harmony export */   StakeAuthorizationLayout: () => (/* binding */ StakeAuthorizationLayout),\n/* harmony export */   StakeInstruction: () => (/* binding */ StakeInstruction),\n/* harmony export */   StakeProgram: () => (/* binding */ StakeProgram),\n/* harmony export */   Struct: () => (/* binding */ Struct),\n/* harmony export */   SystemInstruction: () => (/* binding */ SystemInstruction),\n/* harmony export */   SystemProgram: () => (/* binding */ SystemProgram),\n/* harmony export */   Transaction: () => (/* binding */ Transaction),\n/* harmony export */   TransactionExpiredBlockheightExceededError: () => (/* binding */ TransactionExpiredBlockheightExceededError),\n/* harmony export */   TransactionExpiredNonceInvalidError: () => (/* binding */ TransactionExpiredNonceInvalidError),\n/* harmony export */   TransactionExpiredTimeoutError: () => (/* binding */ TransactionExpiredTimeoutError),\n/* harmony export */   TransactionInstruction: () => (/* binding */ TransactionInstruction),\n/* harmony export */   TransactionMessage: () => (/* binding */ TransactionMessage),\n/* harmony export */   TransactionStatus: () => (/* binding */ TransactionStatus),\n/* harmony export */   VALIDATOR_INFO_KEY: () => (/* binding */ VALIDATOR_INFO_KEY),\n/* harmony export */   VERSION_PREFIX_MASK: () => (/* binding */ VERSION_PREFIX_MASK),\n/* harmony export */   VOTE_PROGRAM_ID: () => (/* binding */ VOTE_PROGRAM_ID),\n/* harmony export */   ValidatorInfo: () => (/* binding */ ValidatorInfo),\n/* harmony export */   VersionedMessage: () => (/* binding */ VersionedMessage),\n/* harmony export */   VersionedTransaction: () => (/* binding */ VersionedTransaction),\n/* harmony export */   VoteAccount: () => (/* binding */ VoteAccount),\n/* harmony export */   VoteAuthorizationLayout: () => (/* binding */ VoteAuthorizationLayout),\n/* harmony export */   VoteInit: () => (/* binding */ VoteInit),\n/* harmony export */   VoteInstruction: () => (/* binding */ VoteInstruction),\n/* harmony export */   VoteProgram: () => (/* binding */ VoteProgram),\n/* harmony export */   clusterApiUrl: () => (/* binding */ clusterApiUrl),\n/* harmony export */   sendAndConfirmRawTransaction: () => (/* binding */ sendAndConfirmRawTransaction),\n/* harmony export */   sendAndConfirmTransaction: () => (/* binding */ sendAndConfirmTransaction)\n/* harmony export */ });\n/* harmony import */ var buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! buffer */ \"(app-pages-browser)/./node_modules/buffer/index.js\");\n/* harmony import */ var _noble_curves_ed25519__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @noble/curves/ed25519 */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/ed25519.js\");\n/* harmony import */ var bn_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! bn.js */ \"(app-pages-browser)/./node_modules/bn.js/lib/bn.js\");\n/* harmony import */ var bn_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(bn_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var bs58__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! bs58 */ \"(app-pages-browser)/./node_modules/@solana/web3.js/node_modules/bs58/index.js\");\n/* harmony import */ var bs58__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(bs58__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _noble_hashes_sha256__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! @noble/hashes/sha256 */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/sha256.js\");\n/* harmony import */ var borsh__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! borsh */ \"(app-pages-browser)/./node_modules/borsh/lib/index.js\");\n/* harmony import */ var borsh__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(borsh__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @solana/buffer-layout */ \"(app-pages-browser)/./node_modules/@solana/buffer-layout/lib/Layout.js\");\n/* harmony import */ var _solana_codecs_numbers__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! @solana/codecs-numbers */ \"(app-pages-browser)/./node_modules/@solana/codecs-numbers/dist/index.browser.mjs\");\n/* harmony import */ var superstruct__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! superstruct */ \"(app-pages-browser)/./node_modules/superstruct/dist/index.mjs\");\n/* harmony import */ var jayson_lib_client_browser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! jayson/lib/client/browser */ \"(app-pages-browser)/./node_modules/jayson/lib/client/browser/index.js\");\n/* harmony import */ var jayson_lib_client_browser__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(jayson_lib_client_browser__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var rpc_websockets__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! rpc-websockets */ \"(app-pages-browser)/./node_modules/rpc-websockets/dist/index.browser.mjs\");\n/* harmony import */ var _noble_hashes_sha3__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! @noble/hashes/sha3 */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/sha3.js\");\n/* harmony import */ var _noble_curves_secp256k1__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! @noble/curves/secp256k1 */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/secp256k1.js\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/**\n * A 64 byte secret key, the first 32 bytes of which is the\n * private scalar and the last 32 bytes is the public key.\n * Read more: https://blog.mozilla.org/warner/2011/11/29/ed25519-keys/\n */\n\n/**\n * Ed25519 Keypair\n */\n\nconst generatePrivateKey = _noble_curves_ed25519__WEBPACK_IMPORTED_MODULE_7__.ed25519.utils.randomPrivateKey;\nconst generateKeypair = () => {\n  const privateScalar = _noble_curves_ed25519__WEBPACK_IMPORTED_MODULE_7__.ed25519.utils.randomPrivateKey();\n  const publicKey = getPublicKey(privateScalar);\n  const secretKey = new Uint8Array(64);\n  secretKey.set(privateScalar);\n  secretKey.set(publicKey, 32);\n  return {\n    publicKey,\n    secretKey\n  };\n};\nconst getPublicKey = _noble_curves_ed25519__WEBPACK_IMPORTED_MODULE_7__.ed25519.getPublicKey;\nfunction isOnCurve(publicKey) {\n  try {\n    _noble_curves_ed25519__WEBPACK_IMPORTED_MODULE_7__.ed25519.ExtendedPoint.fromHex(publicKey);\n    return true;\n  } catch {\n    return false;\n  }\n}\nconst sign = (message, secretKey) => _noble_curves_ed25519__WEBPACK_IMPORTED_MODULE_7__.ed25519.sign(message, secretKey.slice(0, 32));\nconst verify = _noble_curves_ed25519__WEBPACK_IMPORTED_MODULE_7__.ed25519.verify;\n\nconst toBuffer = arr => {\n  if (buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.isBuffer(arr)) {\n    return arr;\n  } else if (arr instanceof Uint8Array) {\n    return buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(arr.buffer, arr.byteOffset, arr.byteLength);\n  } else {\n    return buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(arr);\n  }\n};\n\n// Class wrapping a plain object\nclass Struct {\n  constructor(properties) {\n    Object.assign(this, properties);\n  }\n  encode() {\n    return buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from((0,borsh__WEBPACK_IMPORTED_MODULE_3__.serialize)(SOLANA_SCHEMA, this));\n  }\n  static decode(data) {\n    return (0,borsh__WEBPACK_IMPORTED_MODULE_3__.deserialize)(SOLANA_SCHEMA, this, data);\n  }\n  static decodeUnchecked(data) {\n    return (0,borsh__WEBPACK_IMPORTED_MODULE_3__.deserializeUnchecked)(SOLANA_SCHEMA, this, data);\n  }\n}\n\n// Class representing a Rust-compatible enum, since enums are only strings or\n// numbers in pure JS\nclass Enum extends Struct {\n  constructor(properties) {\n    super(properties);\n    this.enum = '';\n    if (Object.keys(properties).length !== 1) {\n      throw new Error('Enum can only take single value');\n    }\n    Object.keys(properties).map(key => {\n      this.enum = key;\n    });\n  }\n}\nconst SOLANA_SCHEMA = new Map();\n\nvar _PublicKey;\n\n/**\n * Maximum length of derived pubkey seed\n */\nconst MAX_SEED_LENGTH = 32;\n\n/**\n * Size of public key in bytes\n */\nconst PUBLIC_KEY_LENGTH = 32;\n\n/**\n * Value to be converted into public key\n */\n\n/**\n * JSON object representation of PublicKey class\n */\n\nfunction isPublicKeyData(value) {\n  return value._bn !== undefined;\n}\n\n// local counter used by PublicKey.unique()\nlet uniquePublicKeyCounter = 1;\n\n/**\n * A public key\n */\nclass PublicKey extends Struct {\n  /**\n   * Create a new PublicKey object\n   * @param value ed25519 public key as buffer or base-58 encoded string\n   */\n  constructor(value) {\n    super({});\n    /** @internal */\n    this._bn = void 0;\n    if (isPublicKeyData(value)) {\n      this._bn = value._bn;\n    } else {\n      if (typeof value === 'string') {\n        // assume base 58 encoding by default\n        const decoded = bs58__WEBPACK_IMPORTED_MODULE_2___default().decode(value);\n        if (decoded.length != PUBLIC_KEY_LENGTH) {\n          throw new Error(`Invalid public key input`);\n        }\n        this._bn = new (bn_js__WEBPACK_IMPORTED_MODULE_1___default())(decoded);\n      } else {\n        this._bn = new (bn_js__WEBPACK_IMPORTED_MODULE_1___default())(value);\n      }\n      if (this._bn.byteLength() > PUBLIC_KEY_LENGTH) {\n        throw new Error(`Invalid public key input`);\n      }\n    }\n  }\n\n  /**\n   * Returns a unique PublicKey for tests and benchmarks using a counter\n   */\n  static unique() {\n    const key = new PublicKey(uniquePublicKeyCounter);\n    uniquePublicKeyCounter += 1;\n    return new PublicKey(key.toBuffer());\n  }\n\n  /**\n   * Default public key value. The base58-encoded string representation is all ones (as seen below)\n   * The underlying BN number is 32 bytes that are all zeros\n   */\n\n  /**\n   * Checks if two publicKeys are equal\n   */\n  equals(publicKey) {\n    return this._bn.eq(publicKey._bn);\n  }\n\n  /**\n   * Return the base-58 representation of the public key\n   */\n  toBase58() {\n    return bs58__WEBPACK_IMPORTED_MODULE_2___default().encode(this.toBytes());\n  }\n  toJSON() {\n    return this.toBase58();\n  }\n\n  /**\n   * Return the byte array representation of the public key in big endian\n   */\n  toBytes() {\n    const buf = this.toBuffer();\n    return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n  }\n\n  /**\n   * Return the Buffer representation of the public key in big endian\n   */\n  toBuffer() {\n    const b = this._bn.toArrayLike(buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer);\n    if (b.length === PUBLIC_KEY_LENGTH) {\n      return b;\n    }\n    const zeroPad = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(32);\n    b.copy(zeroPad, 32 - b.length);\n    return zeroPad;\n  }\n  get [Symbol.toStringTag]() {\n    return `PublicKey(${this.toString()})`;\n  }\n\n  /**\n   * Return the base-58 representation of the public key\n   */\n  toString() {\n    return this.toBase58();\n  }\n\n  /**\n   * Derive a public key from another key, a seed, and a program ID.\n   * The program ID will also serve as the owner of the public key, giving\n   * it permission to write data to the account.\n   */\n  /* eslint-disable require-await */\n  static async createWithSeed(fromPublicKey, seed, programId) {\n    const buffer = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.concat([fromPublicKey.toBuffer(), buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(seed), programId.toBuffer()]);\n    const publicKeyBytes = (0,_noble_hashes_sha256__WEBPACK_IMPORTED_MODULE_8__.sha256)(buffer);\n    return new PublicKey(publicKeyBytes);\n  }\n\n  /**\n   * Derive a program address from seeds and a program ID.\n   */\n  /* eslint-disable require-await */\n  static createProgramAddressSync(seeds, programId) {\n    let buffer = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(0);\n    seeds.forEach(function (seed) {\n      if (seed.length > MAX_SEED_LENGTH) {\n        throw new TypeError(`Max seed length exceeded`);\n      }\n      buffer = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.concat([buffer, toBuffer(seed)]);\n    });\n    buffer = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.concat([buffer, programId.toBuffer(), buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from('ProgramDerivedAddress')]);\n    const publicKeyBytes = (0,_noble_hashes_sha256__WEBPACK_IMPORTED_MODULE_8__.sha256)(buffer);\n    if (isOnCurve(publicKeyBytes)) {\n      throw new Error(`Invalid seeds, address must fall off the curve`);\n    }\n    return new PublicKey(publicKeyBytes);\n  }\n\n  /**\n   * Async version of createProgramAddressSync\n   * For backwards compatibility\n   *\n   * @deprecated Use {@link createProgramAddressSync} instead\n   */\n  /* eslint-disable require-await */\n  static async createProgramAddress(seeds, programId) {\n    return this.createProgramAddressSync(seeds, programId);\n  }\n\n  /**\n   * Find a valid program address\n   *\n   * Valid program addresses must fall off the ed25519 curve.  This function\n   * iterates a nonce until it finds one that when combined with the seeds\n   * results in a valid program address.\n   */\n  static findProgramAddressSync(seeds, programId) {\n    let nonce = 255;\n    let address;\n    while (nonce != 0) {\n      try {\n        const seedsWithNonce = seeds.concat(buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from([nonce]));\n        address = this.createProgramAddressSync(seedsWithNonce, programId);\n      } catch (err) {\n        if (err instanceof TypeError) {\n          throw err;\n        }\n        nonce--;\n        continue;\n      }\n      return [address, nonce];\n    }\n    throw new Error(`Unable to find a viable program address nonce`);\n  }\n\n  /**\n   * Async version of findProgramAddressSync\n   * For backwards compatibility\n   *\n   * @deprecated Use {@link findProgramAddressSync} instead\n   */\n  static async findProgramAddress(seeds, programId) {\n    return this.findProgramAddressSync(seeds, programId);\n  }\n\n  /**\n   * Check that a pubkey is on the ed25519 curve.\n   */\n  static isOnCurve(pubkeyData) {\n    const pubkey = new PublicKey(pubkeyData);\n    return isOnCurve(pubkey.toBytes());\n  }\n}\n_PublicKey = PublicKey;\nPublicKey.default = new _PublicKey('11111111111111111111111111111111');\nSOLANA_SCHEMA.set(PublicKey, {\n  kind: 'struct',\n  fields: [['_bn', 'u256']]\n});\n\n/**\n * An account key pair (public and secret keys).\n *\n * @deprecated since v1.10.0, please use {@link Keypair} instead.\n */\nclass Account {\n  /**\n   * Create a new Account object\n   *\n   * If the secretKey parameter is not provided a new key pair is randomly\n   * created for the account\n   *\n   * @param secretKey Secret key for the account\n   */\n  constructor(secretKey) {\n    /** @internal */\n    this._publicKey = void 0;\n    /** @internal */\n    this._secretKey = void 0;\n    if (secretKey) {\n      const secretKeyBuffer = toBuffer(secretKey);\n      if (secretKey.length !== 64) {\n        throw new Error('bad secret key size');\n      }\n      this._publicKey = secretKeyBuffer.slice(32, 64);\n      this._secretKey = secretKeyBuffer.slice(0, 32);\n    } else {\n      this._secretKey = toBuffer(generatePrivateKey());\n      this._publicKey = toBuffer(getPublicKey(this._secretKey));\n    }\n  }\n\n  /**\n   * The public key for this account\n   */\n  get publicKey() {\n    return new PublicKey(this._publicKey);\n  }\n\n  /**\n   * The **unencrypted** secret key for this account. The first 32 bytes\n   * is the private scalar and the last 32 bytes is the public key.\n   * Read more: https://blog.mozilla.org/warner/2011/11/29/ed25519-keys/\n   */\n  get secretKey() {\n    return buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.concat([this._secretKey, this._publicKey], 64);\n  }\n}\n\nconst BPF_LOADER_DEPRECATED_PROGRAM_ID = new PublicKey('BPFLoader1111111111111111111111111111111111');\n\n/**\n * Maximum over-the-wire size of a Transaction\n *\n * 1280 is IPv6 minimum MTU\n * 40 bytes is the size of the IPv6 header\n * 8 bytes is the size of the fragment header\n */\nconst PACKET_DATA_SIZE = 1280 - 40 - 8;\nconst VERSION_PREFIX_MASK = 0x7f;\nconst SIGNATURE_LENGTH_IN_BYTES = 64;\n\nclass TransactionExpiredBlockheightExceededError extends Error {\n  constructor(signature) {\n    super(`Signature ${signature} has expired: block height exceeded.`);\n    this.signature = void 0;\n    this.signature = signature;\n  }\n}\nObject.defineProperty(TransactionExpiredBlockheightExceededError.prototype, 'name', {\n  value: 'TransactionExpiredBlockheightExceededError'\n});\nclass TransactionExpiredTimeoutError extends Error {\n  constructor(signature, timeoutSeconds) {\n    super(`Transaction was not confirmed in ${timeoutSeconds.toFixed(2)} seconds. It is ` + 'unknown if it succeeded or failed. Check signature ' + `${signature} using the Solana Explorer or CLI tools.`);\n    this.signature = void 0;\n    this.signature = signature;\n  }\n}\nObject.defineProperty(TransactionExpiredTimeoutError.prototype, 'name', {\n  value: 'TransactionExpiredTimeoutError'\n});\nclass TransactionExpiredNonceInvalidError extends Error {\n  constructor(signature) {\n    super(`Signature ${signature} has expired: the nonce is no longer valid.`);\n    this.signature = void 0;\n    this.signature = signature;\n  }\n}\nObject.defineProperty(TransactionExpiredNonceInvalidError.prototype, 'name', {\n  value: 'TransactionExpiredNonceInvalidError'\n});\n\nclass MessageAccountKeys {\n  constructor(staticAccountKeys, accountKeysFromLookups) {\n    this.staticAccountKeys = void 0;\n    this.accountKeysFromLookups = void 0;\n    this.staticAccountKeys = staticAccountKeys;\n    this.accountKeysFromLookups = accountKeysFromLookups;\n  }\n  keySegments() {\n    const keySegments = [this.staticAccountKeys];\n    if (this.accountKeysFromLookups) {\n      keySegments.push(this.accountKeysFromLookups.writable);\n      keySegments.push(this.accountKeysFromLookups.readonly);\n    }\n    return keySegments;\n  }\n  get(index) {\n    for (const keySegment of this.keySegments()) {\n      if (index < keySegment.length) {\n        return keySegment[index];\n      } else {\n        index -= keySegment.length;\n      }\n    }\n    return;\n  }\n  get length() {\n    return this.keySegments().flat().length;\n  }\n  compileInstructions(instructions) {\n    // Bail early if any account indexes would overflow a u8\n    const U8_MAX = 255;\n    if (this.length > U8_MAX + 1) {\n      throw new Error('Account index overflow encountered during compilation');\n    }\n    const keyIndexMap = new Map();\n    this.keySegments().flat().forEach((key, index) => {\n      keyIndexMap.set(key.toBase58(), index);\n    });\n    const findKeyIndex = key => {\n      const keyIndex = keyIndexMap.get(key.toBase58());\n      if (keyIndex === undefined) throw new Error('Encountered an unknown instruction account key during compilation');\n      return keyIndex;\n    };\n    return instructions.map(instruction => {\n      return {\n        programIdIndex: findKeyIndex(instruction.programId),\n        accountKeyIndexes: instruction.keys.map(meta => findKeyIndex(meta.pubkey)),\n        data: instruction.data\n      };\n    });\n  }\n}\n\n/**\n * Layout for a public key\n */\nconst publicKey = (property = 'publicKey') => {\n  return _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(32, property);\n};\n\n/**\n * Layout for a signature\n */\nconst signature = (property = 'signature') => {\n  return _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(64, property);\n};\n/**\n * Layout for a Rust String type\n */\nconst rustString = (property = 'string') => {\n  const rsl = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('length'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('lengthPadding'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.offset(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32(), -8), 'chars')], property);\n  const _decode = rsl.decode.bind(rsl);\n  const _encode = rsl.encode.bind(rsl);\n  const rslShim = rsl;\n  rslShim.decode = (b, offset) => {\n    const data = _decode(b, offset);\n    return data['chars'].toString();\n  };\n  rslShim.encode = (str, b, offset) => {\n    const data = {\n      chars: buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(str, 'utf8')\n    };\n    return _encode(data, b, offset);\n  };\n  rslShim.alloc = str => {\n    return _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32().span + _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32().span + buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(str, 'utf8').length;\n  };\n  return rslShim;\n};\n\n/**\n * Layout for an Authorized object\n */\nconst authorized = (property = 'authorized') => {\n  return _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([publicKey('staker'), publicKey('withdrawer')], property);\n};\n\n/**\n * Layout for a Lockup object\n */\nconst lockup = (property = 'lockup') => {\n  return _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('unixTimestamp'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('epoch'), publicKey('custodian')], property);\n};\n\n/**\n *  Layout for a VoteInit object\n */\nconst voteInit = (property = 'voteInit') => {\n  return _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([publicKey('nodePubkey'), publicKey('authorizedVoter'), publicKey('authorizedWithdrawer'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('commission')], property);\n};\n\n/**\n *  Layout for a VoteAuthorizeWithSeedArgs object\n */\nconst voteAuthorizeWithSeedArgs = (property = 'voteAuthorizeWithSeedArgs') => {\n  return _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('voteAuthorizationType'), publicKey('currentAuthorityDerivedKeyOwnerPubkey'), rustString('currentAuthorityDerivedKeySeed'), publicKey('newAuthorized')], property);\n};\nfunction getAlloc(type, fields) {\n  const getItemAlloc = item => {\n    if (item.span >= 0) {\n      return item.span;\n    } else if (typeof item.alloc === 'function') {\n      return item.alloc(fields[item.property]);\n    } else if ('count' in item && 'elementLayout' in item) {\n      const field = fields[item.property];\n      if (Array.isArray(field)) {\n        return field.length * getItemAlloc(item.elementLayout);\n      }\n    } else if ('fields' in item) {\n      // This is a `Structure` whose size needs to be recursively measured.\n      return getAlloc({\n        layout: item\n      }, fields[item.property]);\n    }\n    // Couldn't determine allocated size of layout\n    return 0;\n  };\n  let alloc = 0;\n  type.layout.fields.forEach(item => {\n    alloc += getItemAlloc(item);\n  });\n  return alloc;\n}\n\nfunction decodeLength(bytes) {\n  let len = 0;\n  let size = 0;\n  for (;;) {\n    let elem = bytes.shift();\n    len |= (elem & 0x7f) << size * 7;\n    size += 1;\n    if ((elem & 0x80) === 0) {\n      break;\n    }\n  }\n  return len;\n}\nfunction encodeLength(bytes, len) {\n  let rem_len = len;\n  for (;;) {\n    let elem = rem_len & 0x7f;\n    rem_len >>= 7;\n    if (rem_len == 0) {\n      bytes.push(elem);\n      break;\n    } else {\n      elem |= 0x80;\n      bytes.push(elem);\n    }\n  }\n}\n\nfunction assert (condition, message) {\n  if (!condition) {\n    throw new Error(message || 'Assertion failed');\n  }\n}\n\nclass CompiledKeys {\n  constructor(payer, keyMetaMap) {\n    this.payer = void 0;\n    this.keyMetaMap = void 0;\n    this.payer = payer;\n    this.keyMetaMap = keyMetaMap;\n  }\n  static compile(instructions, payer) {\n    const keyMetaMap = new Map();\n    const getOrInsertDefault = pubkey => {\n      const address = pubkey.toBase58();\n      let keyMeta = keyMetaMap.get(address);\n      if (keyMeta === undefined) {\n        keyMeta = {\n          isSigner: false,\n          isWritable: false,\n          isInvoked: false\n        };\n        keyMetaMap.set(address, keyMeta);\n      }\n      return keyMeta;\n    };\n    const payerKeyMeta = getOrInsertDefault(payer);\n    payerKeyMeta.isSigner = true;\n    payerKeyMeta.isWritable = true;\n    for (const ix of instructions) {\n      getOrInsertDefault(ix.programId).isInvoked = true;\n      for (const accountMeta of ix.keys) {\n        const keyMeta = getOrInsertDefault(accountMeta.pubkey);\n        keyMeta.isSigner ||= accountMeta.isSigner;\n        keyMeta.isWritable ||= accountMeta.isWritable;\n      }\n    }\n    return new CompiledKeys(payer, keyMetaMap);\n  }\n  getMessageComponents() {\n    const mapEntries = [...this.keyMetaMap.entries()];\n    assert(mapEntries.length <= 256, 'Max static account keys length exceeded');\n    const writableSigners = mapEntries.filter(([, meta]) => meta.isSigner && meta.isWritable);\n    const readonlySigners = mapEntries.filter(([, meta]) => meta.isSigner && !meta.isWritable);\n    const writableNonSigners = mapEntries.filter(([, meta]) => !meta.isSigner && meta.isWritable);\n    const readonlyNonSigners = mapEntries.filter(([, meta]) => !meta.isSigner && !meta.isWritable);\n    const header = {\n      numRequiredSignatures: writableSigners.length + readonlySigners.length,\n      numReadonlySignedAccounts: readonlySigners.length,\n      numReadonlyUnsignedAccounts: readonlyNonSigners.length\n    };\n\n    // sanity checks\n    {\n      assert(writableSigners.length > 0, 'Expected at least one writable signer key');\n      const [payerAddress] = writableSigners[0];\n      assert(payerAddress === this.payer.toBase58(), 'Expected first writable signer key to be the fee payer');\n    }\n    const staticAccountKeys = [...writableSigners.map(([address]) => new PublicKey(address)), ...readonlySigners.map(([address]) => new PublicKey(address)), ...writableNonSigners.map(([address]) => new PublicKey(address)), ...readonlyNonSigners.map(([address]) => new PublicKey(address))];\n    return [header, staticAccountKeys];\n  }\n  extractTableLookup(lookupTable) {\n    const [writableIndexes, drainedWritableKeys] = this.drainKeysFoundInLookupTable(lookupTable.state.addresses, keyMeta => !keyMeta.isSigner && !keyMeta.isInvoked && keyMeta.isWritable);\n    const [readonlyIndexes, drainedReadonlyKeys] = this.drainKeysFoundInLookupTable(lookupTable.state.addresses, keyMeta => !keyMeta.isSigner && !keyMeta.isInvoked && !keyMeta.isWritable);\n\n    // Don't extract lookup if no keys were found\n    if (writableIndexes.length === 0 && readonlyIndexes.length === 0) {\n      return;\n    }\n    return [{\n      accountKey: lookupTable.key,\n      writableIndexes,\n      readonlyIndexes\n    }, {\n      writable: drainedWritableKeys,\n      readonly: drainedReadonlyKeys\n    }];\n  }\n\n  /** @internal */\n  drainKeysFoundInLookupTable(lookupTableEntries, keyMetaFilter) {\n    const lookupTableIndexes = new Array();\n    const drainedKeys = new Array();\n    for (const [address, keyMeta] of this.keyMetaMap.entries()) {\n      if (keyMetaFilter(keyMeta)) {\n        const key = new PublicKey(address);\n        const lookupTableIndex = lookupTableEntries.findIndex(entry => entry.equals(key));\n        if (lookupTableIndex >= 0) {\n          assert(lookupTableIndex < 256, 'Max lookup table index exceeded');\n          lookupTableIndexes.push(lookupTableIndex);\n          drainedKeys.push(key);\n          this.keyMetaMap.delete(address);\n        }\n      }\n    }\n    return [lookupTableIndexes, drainedKeys];\n  }\n}\n\nconst END_OF_BUFFER_ERROR_MESSAGE = 'Reached end of buffer unexpectedly';\n\n/**\n * Delegates to `Array#shift`, but throws if the array is zero-length.\n */\nfunction guardedShift(byteArray) {\n  if (byteArray.length === 0) {\n    throw new Error(END_OF_BUFFER_ERROR_MESSAGE);\n  }\n  return byteArray.shift();\n}\n\n/**\n * Delegates to `Array#splice`, but throws if the section being spliced out extends past the end of\n * the array.\n */\nfunction guardedSplice(byteArray, ...args) {\n  const [start] = args;\n  if (args.length === 2 // Implies that `deleteCount` was supplied\n  ? start + (args[1] ?? 0) > byteArray.length : start >= byteArray.length) {\n    throw new Error(END_OF_BUFFER_ERROR_MESSAGE);\n  }\n  return byteArray.splice(...args);\n}\n\n/**\n * An instruction to execute by a program\n *\n * @property {number} programIdIndex\n * @property {number[]} accounts\n * @property {string} data\n */\n\n/**\n * Message constructor arguments\n */\n\n/**\n * List of instructions to be processed atomically\n */\nclass Message {\n  constructor(args) {\n    this.header = void 0;\n    this.accountKeys = void 0;\n    this.recentBlockhash = void 0;\n    this.instructions = void 0;\n    this.indexToProgramIds = new Map();\n    this.header = args.header;\n    this.accountKeys = args.accountKeys.map(account => new PublicKey(account));\n    this.recentBlockhash = args.recentBlockhash;\n    this.instructions = args.instructions;\n    this.instructions.forEach(ix => this.indexToProgramIds.set(ix.programIdIndex, this.accountKeys[ix.programIdIndex]));\n  }\n  get version() {\n    return 'legacy';\n  }\n  get staticAccountKeys() {\n    return this.accountKeys;\n  }\n  get compiledInstructions() {\n    return this.instructions.map(ix => ({\n      programIdIndex: ix.programIdIndex,\n      accountKeyIndexes: ix.accounts,\n      data: bs58__WEBPACK_IMPORTED_MODULE_2___default().decode(ix.data)\n    }));\n  }\n  get addressTableLookups() {\n    return [];\n  }\n  getAccountKeys() {\n    return new MessageAccountKeys(this.staticAccountKeys);\n  }\n  static compile(args) {\n    const compiledKeys = CompiledKeys.compile(args.instructions, args.payerKey);\n    const [header, staticAccountKeys] = compiledKeys.getMessageComponents();\n    const accountKeys = new MessageAccountKeys(staticAccountKeys);\n    const instructions = accountKeys.compileInstructions(args.instructions).map(ix => ({\n      programIdIndex: ix.programIdIndex,\n      accounts: ix.accountKeyIndexes,\n      data: bs58__WEBPACK_IMPORTED_MODULE_2___default().encode(ix.data)\n    }));\n    return new Message({\n      header,\n      accountKeys: staticAccountKeys,\n      recentBlockhash: args.recentBlockhash,\n      instructions\n    });\n  }\n  isAccountSigner(index) {\n    return index < this.header.numRequiredSignatures;\n  }\n  isAccountWritable(index) {\n    const numSignedAccounts = this.header.numRequiredSignatures;\n    if (index >= this.header.numRequiredSignatures) {\n      const unsignedAccountIndex = index - numSignedAccounts;\n      const numUnsignedAccounts = this.accountKeys.length - numSignedAccounts;\n      const numWritableUnsignedAccounts = numUnsignedAccounts - this.header.numReadonlyUnsignedAccounts;\n      return unsignedAccountIndex < numWritableUnsignedAccounts;\n    } else {\n      const numWritableSignedAccounts = numSignedAccounts - this.header.numReadonlySignedAccounts;\n      return index < numWritableSignedAccounts;\n    }\n  }\n  isProgramId(index) {\n    return this.indexToProgramIds.has(index);\n  }\n  programIds() {\n    return [...this.indexToProgramIds.values()];\n  }\n  nonProgramIds() {\n    return this.accountKeys.filter((_, index) => !this.isProgramId(index));\n  }\n  serialize() {\n    const numKeys = this.accountKeys.length;\n    let keyCount = [];\n    encodeLength(keyCount, numKeys);\n    const instructions = this.instructions.map(instruction => {\n      const {\n        accounts,\n        programIdIndex\n      } = instruction;\n      const data = Array.from(bs58__WEBPACK_IMPORTED_MODULE_2___default().decode(instruction.data));\n      let keyIndicesCount = [];\n      encodeLength(keyIndicesCount, accounts.length);\n      let dataCount = [];\n      encodeLength(dataCount, data.length);\n      return {\n        programIdIndex,\n        keyIndicesCount: buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(keyIndicesCount),\n        keyIndices: accounts,\n        dataLength: buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(dataCount),\n        data\n      };\n    });\n    let instructionCount = [];\n    encodeLength(instructionCount, instructions.length);\n    let instructionBuffer = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(PACKET_DATA_SIZE);\n    buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(instructionCount).copy(instructionBuffer);\n    let instructionBufferLength = instructionCount.length;\n    instructions.forEach(instruction => {\n      const instructionLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('programIdIndex'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(instruction.keyIndicesCount.length, 'keyIndicesCount'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('keyIndex'), instruction.keyIndices.length, 'keyIndices'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(instruction.dataLength.length, 'dataLength'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('userdatum'), instruction.data.length, 'data')]);\n      const length = instructionLayout.encode(instruction, instructionBuffer, instructionBufferLength);\n      instructionBufferLength += length;\n    });\n    instructionBuffer = instructionBuffer.slice(0, instructionBufferLength);\n    const signDataLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(1, 'numRequiredSignatures'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(1, 'numReadonlySignedAccounts'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(1, 'numReadonlyUnsignedAccounts'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(keyCount.length, 'keyCount'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(publicKey('key'), numKeys, 'keys'), publicKey('recentBlockhash')]);\n    const transaction = {\n      numRequiredSignatures: buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from([this.header.numRequiredSignatures]),\n      numReadonlySignedAccounts: buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from([this.header.numReadonlySignedAccounts]),\n      numReadonlyUnsignedAccounts: buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from([this.header.numReadonlyUnsignedAccounts]),\n      keyCount: buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(keyCount),\n      keys: this.accountKeys.map(key => toBuffer(key.toBytes())),\n      recentBlockhash: bs58__WEBPACK_IMPORTED_MODULE_2___default().decode(this.recentBlockhash)\n    };\n    let signData = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(2048);\n    const length = signDataLayout.encode(transaction, signData);\n    instructionBuffer.copy(signData, length);\n    return signData.slice(0, length + instructionBuffer.length);\n  }\n\n  /**\n   * Decode a compiled message into a Message object.\n   */\n  static from(buffer) {\n    // Slice up wire data\n    let byteArray = [...buffer];\n    const numRequiredSignatures = guardedShift(byteArray);\n    if (numRequiredSignatures !== (numRequiredSignatures & VERSION_PREFIX_MASK)) {\n      throw new Error('Versioned messages must be deserialized with VersionedMessage.deserialize()');\n    }\n    const numReadonlySignedAccounts = guardedShift(byteArray);\n    const numReadonlyUnsignedAccounts = guardedShift(byteArray);\n    const accountCount = decodeLength(byteArray);\n    let accountKeys = [];\n    for (let i = 0; i < accountCount; i++) {\n      const account = guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH);\n      accountKeys.push(new PublicKey(buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(account)));\n    }\n    const recentBlockhash = guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH);\n    const instructionCount = decodeLength(byteArray);\n    let instructions = [];\n    for (let i = 0; i < instructionCount; i++) {\n      const programIdIndex = guardedShift(byteArray);\n      const accountCount = decodeLength(byteArray);\n      const accounts = guardedSplice(byteArray, 0, accountCount);\n      const dataLength = decodeLength(byteArray);\n      const dataSlice = guardedSplice(byteArray, 0, dataLength);\n      const data = bs58__WEBPACK_IMPORTED_MODULE_2___default().encode(buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(dataSlice));\n      instructions.push({\n        programIdIndex,\n        accounts,\n        data\n      });\n    }\n    const messageArgs = {\n      header: {\n        numRequiredSignatures,\n        numReadonlySignedAccounts,\n        numReadonlyUnsignedAccounts\n      },\n      recentBlockhash: bs58__WEBPACK_IMPORTED_MODULE_2___default().encode(buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(recentBlockhash)),\n      accountKeys,\n      instructions\n    };\n    return new Message(messageArgs);\n  }\n}\n\n/**\n * Message constructor arguments\n */\n\nclass MessageV0 {\n  constructor(args) {\n    this.header = void 0;\n    this.staticAccountKeys = void 0;\n    this.recentBlockhash = void 0;\n    this.compiledInstructions = void 0;\n    this.addressTableLookups = void 0;\n    this.header = args.header;\n    this.staticAccountKeys = args.staticAccountKeys;\n    this.recentBlockhash = args.recentBlockhash;\n    this.compiledInstructions = args.compiledInstructions;\n    this.addressTableLookups = args.addressTableLookups;\n  }\n  get version() {\n    return 0;\n  }\n  get numAccountKeysFromLookups() {\n    let count = 0;\n    for (const lookup of this.addressTableLookups) {\n      count += lookup.readonlyIndexes.length + lookup.writableIndexes.length;\n    }\n    return count;\n  }\n  getAccountKeys(args) {\n    let accountKeysFromLookups;\n    if (args && 'accountKeysFromLookups' in args && args.accountKeysFromLookups) {\n      if (this.numAccountKeysFromLookups != args.accountKeysFromLookups.writable.length + args.accountKeysFromLookups.readonly.length) {\n        throw new Error('Failed to get account keys because of a mismatch in the number of account keys from lookups');\n      }\n      accountKeysFromLookups = args.accountKeysFromLookups;\n    } else if (args && 'addressLookupTableAccounts' in args && args.addressLookupTableAccounts) {\n      accountKeysFromLookups = this.resolveAddressTableLookups(args.addressLookupTableAccounts);\n    } else if (this.addressTableLookups.length > 0) {\n      throw new Error('Failed to get account keys because address table lookups were not resolved');\n    }\n    return new MessageAccountKeys(this.staticAccountKeys, accountKeysFromLookups);\n  }\n  isAccountSigner(index) {\n    return index < this.header.numRequiredSignatures;\n  }\n  isAccountWritable(index) {\n    const numSignedAccounts = this.header.numRequiredSignatures;\n    const numStaticAccountKeys = this.staticAccountKeys.length;\n    if (index >= numStaticAccountKeys) {\n      const lookupAccountKeysIndex = index - numStaticAccountKeys;\n      const numWritableLookupAccountKeys = this.addressTableLookups.reduce((count, lookup) => count + lookup.writableIndexes.length, 0);\n      return lookupAccountKeysIndex < numWritableLookupAccountKeys;\n    } else if (index >= this.header.numRequiredSignatures) {\n      const unsignedAccountIndex = index - numSignedAccounts;\n      const numUnsignedAccounts = numStaticAccountKeys - numSignedAccounts;\n      const numWritableUnsignedAccounts = numUnsignedAccounts - this.header.numReadonlyUnsignedAccounts;\n      return unsignedAccountIndex < numWritableUnsignedAccounts;\n    } else {\n      const numWritableSignedAccounts = numSignedAccounts - this.header.numReadonlySignedAccounts;\n      return index < numWritableSignedAccounts;\n    }\n  }\n  resolveAddressTableLookups(addressLookupTableAccounts) {\n    const accountKeysFromLookups = {\n      writable: [],\n      readonly: []\n    };\n    for (const tableLookup of this.addressTableLookups) {\n      const tableAccount = addressLookupTableAccounts.find(account => account.key.equals(tableLookup.accountKey));\n      if (!tableAccount) {\n        throw new Error(`Failed to find address lookup table account for table key ${tableLookup.accountKey.toBase58()}`);\n      }\n      for (const index of tableLookup.writableIndexes) {\n        if (index < tableAccount.state.addresses.length) {\n          accountKeysFromLookups.writable.push(tableAccount.state.addresses[index]);\n        } else {\n          throw new Error(`Failed to find address for index ${index} in address lookup table ${tableLookup.accountKey.toBase58()}`);\n        }\n      }\n      for (const index of tableLookup.readonlyIndexes) {\n        if (index < tableAccount.state.addresses.length) {\n          accountKeysFromLookups.readonly.push(tableAccount.state.addresses[index]);\n        } else {\n          throw new Error(`Failed to find address for index ${index} in address lookup table ${tableLookup.accountKey.toBase58()}`);\n        }\n      }\n    }\n    return accountKeysFromLookups;\n  }\n  static compile(args) {\n    const compiledKeys = CompiledKeys.compile(args.instructions, args.payerKey);\n    const addressTableLookups = new Array();\n    const accountKeysFromLookups = {\n      writable: new Array(),\n      readonly: new Array()\n    };\n    const lookupTableAccounts = args.addressLookupTableAccounts || [];\n    for (const lookupTable of lookupTableAccounts) {\n      const extractResult = compiledKeys.extractTableLookup(lookupTable);\n      if (extractResult !== undefined) {\n        const [addressTableLookup, {\n          writable,\n          readonly\n        }] = extractResult;\n        addressTableLookups.push(addressTableLookup);\n        accountKeysFromLookups.writable.push(...writable);\n        accountKeysFromLookups.readonly.push(...readonly);\n      }\n    }\n    const [header, staticAccountKeys] = compiledKeys.getMessageComponents();\n    const accountKeys = new MessageAccountKeys(staticAccountKeys, accountKeysFromLookups);\n    const compiledInstructions = accountKeys.compileInstructions(args.instructions);\n    return new MessageV0({\n      header,\n      staticAccountKeys,\n      recentBlockhash: args.recentBlockhash,\n      compiledInstructions,\n      addressTableLookups\n    });\n  }\n  serialize() {\n    const encodedStaticAccountKeysLength = Array();\n    encodeLength(encodedStaticAccountKeysLength, this.staticAccountKeys.length);\n    const serializedInstructions = this.serializeInstructions();\n    const encodedInstructionsLength = Array();\n    encodeLength(encodedInstructionsLength, this.compiledInstructions.length);\n    const serializedAddressTableLookups = this.serializeAddressTableLookups();\n    const encodedAddressTableLookupsLength = Array();\n    encodeLength(encodedAddressTableLookupsLength, this.addressTableLookups.length);\n    const messageLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('prefix'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('numRequiredSignatures'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('numReadonlySignedAccounts'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('numReadonlyUnsignedAccounts')], 'header'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(encodedStaticAccountKeysLength.length, 'staticAccountKeysLength'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(publicKey(), this.staticAccountKeys.length, 'staticAccountKeys'), publicKey('recentBlockhash'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(encodedInstructionsLength.length, 'instructionsLength'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(serializedInstructions.length, 'serializedInstructions'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(encodedAddressTableLookupsLength.length, 'addressTableLookupsLength'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(serializedAddressTableLookups.length, 'serializedAddressTableLookups')]);\n    const serializedMessage = new Uint8Array(PACKET_DATA_SIZE);\n    const MESSAGE_VERSION_0_PREFIX = 1 << 7;\n    const serializedMessageLength = messageLayout.encode({\n      prefix: MESSAGE_VERSION_0_PREFIX,\n      header: this.header,\n      staticAccountKeysLength: new Uint8Array(encodedStaticAccountKeysLength),\n      staticAccountKeys: this.staticAccountKeys.map(key => key.toBytes()),\n      recentBlockhash: bs58__WEBPACK_IMPORTED_MODULE_2___default().decode(this.recentBlockhash),\n      instructionsLength: new Uint8Array(encodedInstructionsLength),\n      serializedInstructions,\n      addressTableLookupsLength: new Uint8Array(encodedAddressTableLookupsLength),\n      serializedAddressTableLookups\n    }, serializedMessage);\n    return serializedMessage.slice(0, serializedMessageLength);\n  }\n  serializeInstructions() {\n    let serializedLength = 0;\n    const serializedInstructions = new Uint8Array(PACKET_DATA_SIZE);\n    for (const instruction of this.compiledInstructions) {\n      const encodedAccountKeyIndexesLength = Array();\n      encodeLength(encodedAccountKeyIndexesLength, instruction.accountKeyIndexes.length);\n      const encodedDataLength = Array();\n      encodeLength(encodedDataLength, instruction.data.length);\n      const instructionLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('programIdIndex'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(encodedAccountKeyIndexesLength.length, 'encodedAccountKeyIndexesLength'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8(), instruction.accountKeyIndexes.length, 'accountKeyIndexes'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(encodedDataLength.length, 'encodedDataLength'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(instruction.data.length, 'data')]);\n      serializedLength += instructionLayout.encode({\n        programIdIndex: instruction.programIdIndex,\n        encodedAccountKeyIndexesLength: new Uint8Array(encodedAccountKeyIndexesLength),\n        accountKeyIndexes: instruction.accountKeyIndexes,\n        encodedDataLength: new Uint8Array(encodedDataLength),\n        data: instruction.data\n      }, serializedInstructions, serializedLength);\n    }\n    return serializedInstructions.slice(0, serializedLength);\n  }\n  serializeAddressTableLookups() {\n    let serializedLength = 0;\n    const serializedAddressTableLookups = new Uint8Array(PACKET_DATA_SIZE);\n    for (const lookup of this.addressTableLookups) {\n      const encodedWritableIndexesLength = Array();\n      encodeLength(encodedWritableIndexesLength, lookup.writableIndexes.length);\n      const encodedReadonlyIndexesLength = Array();\n      encodeLength(encodedReadonlyIndexesLength, lookup.readonlyIndexes.length);\n      const addressTableLookupLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([publicKey('accountKey'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(encodedWritableIndexesLength.length, 'encodedWritableIndexesLength'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8(), lookup.writableIndexes.length, 'writableIndexes'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(encodedReadonlyIndexesLength.length, 'encodedReadonlyIndexesLength'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8(), lookup.readonlyIndexes.length, 'readonlyIndexes')]);\n      serializedLength += addressTableLookupLayout.encode({\n        accountKey: lookup.accountKey.toBytes(),\n        encodedWritableIndexesLength: new Uint8Array(encodedWritableIndexesLength),\n        writableIndexes: lookup.writableIndexes,\n        encodedReadonlyIndexesLength: new Uint8Array(encodedReadonlyIndexesLength),\n        readonlyIndexes: lookup.readonlyIndexes\n      }, serializedAddressTableLookups, serializedLength);\n    }\n    return serializedAddressTableLookups.slice(0, serializedLength);\n  }\n  static deserialize(serializedMessage) {\n    let byteArray = [...serializedMessage];\n    const prefix = guardedShift(byteArray);\n    const maskedPrefix = prefix & VERSION_PREFIX_MASK;\n    assert(prefix !== maskedPrefix, `Expected versioned message but received legacy message`);\n    const version = maskedPrefix;\n    assert(version === 0, `Expected versioned message with version 0 but found version ${version}`);\n    const header = {\n      numRequiredSignatures: guardedShift(byteArray),\n      numReadonlySignedAccounts: guardedShift(byteArray),\n      numReadonlyUnsignedAccounts: guardedShift(byteArray)\n    };\n    const staticAccountKeys = [];\n    const staticAccountKeysLength = decodeLength(byteArray);\n    for (let i = 0; i < staticAccountKeysLength; i++) {\n      staticAccountKeys.push(new PublicKey(guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH)));\n    }\n    const recentBlockhash = bs58__WEBPACK_IMPORTED_MODULE_2___default().encode(guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH));\n    const instructionCount = decodeLength(byteArray);\n    const compiledInstructions = [];\n    for (let i = 0; i < instructionCount; i++) {\n      const programIdIndex = guardedShift(byteArray);\n      const accountKeyIndexesLength = decodeLength(byteArray);\n      const accountKeyIndexes = guardedSplice(byteArray, 0, accountKeyIndexesLength);\n      const dataLength = decodeLength(byteArray);\n      const data = new Uint8Array(guardedSplice(byteArray, 0, dataLength));\n      compiledInstructions.push({\n        programIdIndex,\n        accountKeyIndexes,\n        data\n      });\n    }\n    const addressTableLookupsCount = decodeLength(byteArray);\n    const addressTableLookups = [];\n    for (let i = 0; i < addressTableLookupsCount; i++) {\n      const accountKey = new PublicKey(guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH));\n      const writableIndexesLength = decodeLength(byteArray);\n      const writableIndexes = guardedSplice(byteArray, 0, writableIndexesLength);\n      const readonlyIndexesLength = decodeLength(byteArray);\n      const readonlyIndexes = guardedSplice(byteArray, 0, readonlyIndexesLength);\n      addressTableLookups.push({\n        accountKey,\n        writableIndexes,\n        readonlyIndexes\n      });\n    }\n    return new MessageV0({\n      header,\n      staticAccountKeys,\n      recentBlockhash,\n      compiledInstructions,\n      addressTableLookups\n    });\n  }\n}\n\n// eslint-disable-next-line no-redeclare\nconst VersionedMessage = {\n  deserializeMessageVersion(serializedMessage) {\n    const prefix = serializedMessage[0];\n    const maskedPrefix = prefix & VERSION_PREFIX_MASK;\n\n    // if the highest bit of the prefix is not set, the message is not versioned\n    if (maskedPrefix === prefix) {\n      return 'legacy';\n    }\n\n    // the lower 7 bits of the prefix indicate the message version\n    return maskedPrefix;\n  },\n  deserialize: serializedMessage => {\n    const version = VersionedMessage.deserializeMessageVersion(serializedMessage);\n    if (version === 'legacy') {\n      return Message.from(serializedMessage);\n    }\n    if (version === 0) {\n      return MessageV0.deserialize(serializedMessage);\n    } else {\n      throw new Error(`Transaction message version ${version} deserialization is not supported`);\n    }\n  }\n};\n\n/** @internal */\n\n/**\n * Transaction signature as base-58 encoded string\n */\n\nlet TransactionStatus = /*#__PURE__*/function (TransactionStatus) {\n  TransactionStatus[TransactionStatus[\"BLOCKHEIGHT_EXCEEDED\"] = 0] = \"BLOCKHEIGHT_EXCEEDED\";\n  TransactionStatus[TransactionStatus[\"PROCESSED\"] = 1] = \"PROCESSED\";\n  TransactionStatus[TransactionStatus[\"TIMED_OUT\"] = 2] = \"TIMED_OUT\";\n  TransactionStatus[TransactionStatus[\"NONCE_INVALID\"] = 3] = \"NONCE_INVALID\";\n  return TransactionStatus;\n}({});\n\n/**\n * Default (empty) signature\n */\nconst DEFAULT_SIGNATURE = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(SIGNATURE_LENGTH_IN_BYTES).fill(0);\n\n/**\n * Account metadata used to define instructions\n */\n\n/**\n * List of TransactionInstruction object fields that may be initialized at construction\n */\n\n/**\n * Configuration object for Transaction.serialize()\n */\n\n/**\n * @internal\n */\n\n/**\n * Transaction Instruction class\n */\nclass TransactionInstruction {\n  constructor(opts) {\n    /**\n     * Public keys to include in this transaction\n     * Boolean represents whether this pubkey needs to sign the transaction\n     */\n    this.keys = void 0;\n    /**\n     * Program Id to execute\n     */\n    this.programId = void 0;\n    /**\n     * Program input\n     */\n    this.data = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(0);\n    this.programId = opts.programId;\n    this.keys = opts.keys;\n    if (opts.data) {\n      this.data = opts.data;\n    }\n  }\n\n  /**\n   * @internal\n   */\n  toJSON() {\n    return {\n      keys: this.keys.map(({\n        pubkey,\n        isSigner,\n        isWritable\n      }) => ({\n        pubkey: pubkey.toJSON(),\n        isSigner,\n        isWritable\n      })),\n      programId: this.programId.toJSON(),\n      data: [...this.data]\n    };\n  }\n}\n\n/**\n * Pair of signature and corresponding public key\n */\n\n/**\n * List of Transaction object fields that may be initialized at construction\n */\n\n// For backward compatibility; an unfortunate consequence of being\n// forced to over-export types by the documentation generator.\n// See https://github.com/solana-labs/solana/pull/25820\n\n/**\n * Blockhash-based transactions have a lifetime that are defined by\n * the blockhash they include. Any transaction whose blockhash is\n * too old will be rejected.\n */\n\n/**\n * Use these options to construct a durable nonce transaction.\n */\n\n/**\n * Nonce information to be used to build an offline Transaction.\n */\n\n/**\n * @internal\n */\n\n/**\n * Transaction class\n */\nclass Transaction {\n  /**\n   * The first (payer) Transaction signature\n   *\n   * @returns {Buffer | null} Buffer of payer's signature\n   */\n  get signature() {\n    if (this.signatures.length > 0) {\n      return this.signatures[0].signature;\n    }\n    return null;\n  }\n\n  /**\n   * The transaction fee payer\n   */\n\n  // Construct a transaction with a blockhash and lastValidBlockHeight\n\n  // Construct a transaction using a durable nonce\n\n  /**\n   * @deprecated `TransactionCtorFields` has been deprecated and will be removed in a future version.\n   * Please supply a `TransactionBlockhashCtor` instead.\n   */\n\n  /**\n   * Construct an empty Transaction\n   */\n  constructor(opts) {\n    /**\n     * Signatures for the transaction.  Typically created by invoking the\n     * `sign()` method\n     */\n    this.signatures = [];\n    this.feePayer = void 0;\n    /**\n     * The instructions to atomically execute\n     */\n    this.instructions = [];\n    /**\n     * A recent transaction id. Must be populated by the caller\n     */\n    this.recentBlockhash = void 0;\n    /**\n     * the last block chain can advance to before tx is declared expired\n     * */\n    this.lastValidBlockHeight = void 0;\n    /**\n     * Optional Nonce information. If populated, transaction will use a durable\n     * Nonce hash instead of a recentBlockhash. Must be populated by the caller\n     */\n    this.nonceInfo = void 0;\n    /**\n     * If this is a nonce transaction this represents the minimum slot from which\n     * to evaluate if the nonce has advanced when attempting to confirm the\n     * transaction. This protects against a case where the transaction confirmation\n     * logic loads the nonce account from an old slot and assumes the mismatch in\n     * nonce value implies that the nonce has been advanced.\n     */\n    this.minNonceContextSlot = void 0;\n    /**\n     * @internal\n     */\n    this._message = void 0;\n    /**\n     * @internal\n     */\n    this._json = void 0;\n    if (!opts) {\n      return;\n    }\n    if (opts.feePayer) {\n      this.feePayer = opts.feePayer;\n    }\n    if (opts.signatures) {\n      this.signatures = opts.signatures;\n    }\n    if (Object.prototype.hasOwnProperty.call(opts, 'nonceInfo')) {\n      const {\n        minContextSlot,\n        nonceInfo\n      } = opts;\n      this.minNonceContextSlot = minContextSlot;\n      this.nonceInfo = nonceInfo;\n    } else if (Object.prototype.hasOwnProperty.call(opts, 'lastValidBlockHeight')) {\n      const {\n        blockhash,\n        lastValidBlockHeight\n      } = opts;\n      this.recentBlockhash = blockhash;\n      this.lastValidBlockHeight = lastValidBlockHeight;\n    } else {\n      const {\n        recentBlockhash,\n        nonceInfo\n      } = opts;\n      if (nonceInfo) {\n        this.nonceInfo = nonceInfo;\n      }\n      this.recentBlockhash = recentBlockhash;\n    }\n  }\n\n  /**\n   * @internal\n   */\n  toJSON() {\n    return {\n      recentBlockhash: this.recentBlockhash || null,\n      feePayer: this.feePayer ? this.feePayer.toJSON() : null,\n      nonceInfo: this.nonceInfo ? {\n        nonce: this.nonceInfo.nonce,\n        nonceInstruction: this.nonceInfo.nonceInstruction.toJSON()\n      } : null,\n      instructions: this.instructions.map(instruction => instruction.toJSON()),\n      signers: this.signatures.map(({\n        publicKey\n      }) => {\n        return publicKey.toJSON();\n      })\n    };\n  }\n\n  /**\n   * Add one or more instructions to this Transaction\n   *\n   * @param {Array< Transaction | TransactionInstruction | TransactionInstructionCtorFields >} items - Instructions to add to the Transaction\n   */\n  add(...items) {\n    if (items.length === 0) {\n      throw new Error('No instructions');\n    }\n    items.forEach(item => {\n      if ('instructions' in item) {\n        this.instructions = this.instructions.concat(item.instructions);\n      } else if ('data' in item && 'programId' in item && 'keys' in item) {\n        this.instructions.push(item);\n      } else {\n        this.instructions.push(new TransactionInstruction(item));\n      }\n    });\n    return this;\n  }\n\n  /**\n   * Compile transaction data\n   */\n  compileMessage() {\n    if (this._message && JSON.stringify(this.toJSON()) === JSON.stringify(this._json)) {\n      return this._message;\n    }\n    let recentBlockhash;\n    let instructions;\n    if (this.nonceInfo) {\n      recentBlockhash = this.nonceInfo.nonce;\n      if (this.instructions[0] != this.nonceInfo.nonceInstruction) {\n        instructions = [this.nonceInfo.nonceInstruction, ...this.instructions];\n      } else {\n        instructions = this.instructions;\n      }\n    } else {\n      recentBlockhash = this.recentBlockhash;\n      instructions = this.instructions;\n    }\n    if (!recentBlockhash) {\n      throw new Error('Transaction recentBlockhash required');\n    }\n    if (instructions.length < 1) {\n      console.warn('No instructions provided');\n    }\n    let feePayer;\n    if (this.feePayer) {\n      feePayer = this.feePayer;\n    } else if (this.signatures.length > 0 && this.signatures[0].publicKey) {\n      // Use implicit fee payer\n      feePayer = this.signatures[0].publicKey;\n    } else {\n      throw new Error('Transaction fee payer required');\n    }\n    for (let i = 0; i < instructions.length; i++) {\n      if (instructions[i].programId === undefined) {\n        throw new Error(`Transaction instruction index ${i} has undefined program id`);\n      }\n    }\n    const programIds = [];\n    const accountMetas = [];\n    instructions.forEach(instruction => {\n      instruction.keys.forEach(accountMeta => {\n        accountMetas.push({\n          ...accountMeta\n        });\n      });\n      const programId = instruction.programId.toString();\n      if (!programIds.includes(programId)) {\n        programIds.push(programId);\n      }\n    });\n\n    // Append programID account metas\n    programIds.forEach(programId => {\n      accountMetas.push({\n        pubkey: new PublicKey(programId),\n        isSigner: false,\n        isWritable: false\n      });\n    });\n\n    // Cull duplicate account metas\n    const uniqueMetas = [];\n    accountMetas.forEach(accountMeta => {\n      const pubkeyString = accountMeta.pubkey.toString();\n      const uniqueIndex = uniqueMetas.findIndex(x => {\n        return x.pubkey.toString() === pubkeyString;\n      });\n      if (uniqueIndex > -1) {\n        uniqueMetas[uniqueIndex].isWritable = uniqueMetas[uniqueIndex].isWritable || accountMeta.isWritable;\n        uniqueMetas[uniqueIndex].isSigner = uniqueMetas[uniqueIndex].isSigner || accountMeta.isSigner;\n      } else {\n        uniqueMetas.push(accountMeta);\n      }\n    });\n\n    // Sort. Prioritizing first by signer, then by writable\n    uniqueMetas.sort(function (x, y) {\n      if (x.isSigner !== y.isSigner) {\n        // Signers always come before non-signers\n        return x.isSigner ? -1 : 1;\n      }\n      if (x.isWritable !== y.isWritable) {\n        // Writable accounts always come before read-only accounts\n        return x.isWritable ? -1 : 1;\n      }\n      // Otherwise, sort by pubkey, stringwise.\n      const options = {\n        localeMatcher: 'best fit',\n        usage: 'sort',\n        sensitivity: 'variant',\n        ignorePunctuation: false,\n        numeric: false,\n        caseFirst: 'lower'\n      };\n      return x.pubkey.toBase58().localeCompare(y.pubkey.toBase58(), 'en', options);\n    });\n\n    // Move fee payer to the front\n    const feePayerIndex = uniqueMetas.findIndex(x => {\n      return x.pubkey.equals(feePayer);\n    });\n    if (feePayerIndex > -1) {\n      const [payerMeta] = uniqueMetas.splice(feePayerIndex, 1);\n      payerMeta.isSigner = true;\n      payerMeta.isWritable = true;\n      uniqueMetas.unshift(payerMeta);\n    } else {\n      uniqueMetas.unshift({\n        pubkey: feePayer,\n        isSigner: true,\n        isWritable: true\n      });\n    }\n\n    // Disallow unknown signers\n    for (const signature of this.signatures) {\n      const uniqueIndex = uniqueMetas.findIndex(x => {\n        return x.pubkey.equals(signature.publicKey);\n      });\n      if (uniqueIndex > -1) {\n        if (!uniqueMetas[uniqueIndex].isSigner) {\n          uniqueMetas[uniqueIndex].isSigner = true;\n          console.warn('Transaction references a signature that is unnecessary, ' + 'only the fee payer and instruction signer accounts should sign a transaction. ' + 'This behavior is deprecated and will throw an error in the next major version release.');\n        }\n      } else {\n        throw new Error(`unknown signer: ${signature.publicKey.toString()}`);\n      }\n    }\n    let numRequiredSignatures = 0;\n    let numReadonlySignedAccounts = 0;\n    let numReadonlyUnsignedAccounts = 0;\n\n    // Split out signing from non-signing keys and count header values\n    const signedKeys = [];\n    const unsignedKeys = [];\n    uniqueMetas.forEach(({\n      pubkey,\n      isSigner,\n      isWritable\n    }) => {\n      if (isSigner) {\n        signedKeys.push(pubkey.toString());\n        numRequiredSignatures += 1;\n        if (!isWritable) {\n          numReadonlySignedAccounts += 1;\n        }\n      } else {\n        unsignedKeys.push(pubkey.toString());\n        if (!isWritable) {\n          numReadonlyUnsignedAccounts += 1;\n        }\n      }\n    });\n    const accountKeys = signedKeys.concat(unsignedKeys);\n    const compiledInstructions = instructions.map(instruction => {\n      const {\n        data,\n        programId\n      } = instruction;\n      return {\n        programIdIndex: accountKeys.indexOf(programId.toString()),\n        accounts: instruction.keys.map(meta => accountKeys.indexOf(meta.pubkey.toString())),\n        data: bs58__WEBPACK_IMPORTED_MODULE_2___default().encode(data)\n      };\n    });\n    compiledInstructions.forEach(instruction => {\n      assert(instruction.programIdIndex >= 0);\n      instruction.accounts.forEach(keyIndex => assert(keyIndex >= 0));\n    });\n    return new Message({\n      header: {\n        numRequiredSignatures,\n        numReadonlySignedAccounts,\n        numReadonlyUnsignedAccounts\n      },\n      accountKeys,\n      recentBlockhash,\n      instructions: compiledInstructions\n    });\n  }\n\n  /**\n   * @internal\n   */\n  _compile() {\n    const message = this.compileMessage();\n    const signedKeys = message.accountKeys.slice(0, message.header.numRequiredSignatures);\n    if (this.signatures.length === signedKeys.length) {\n      const valid = this.signatures.every((pair, index) => {\n        return signedKeys[index].equals(pair.publicKey);\n      });\n      if (valid) return message;\n    }\n    this.signatures = signedKeys.map(publicKey => ({\n      signature: null,\n      publicKey\n    }));\n    return message;\n  }\n\n  /**\n   * Get a buffer of the Transaction data that need to be covered by signatures\n   */\n  serializeMessage() {\n    return this._compile().serialize();\n  }\n\n  /**\n   * Get the estimated fee associated with a transaction\n   *\n   * @param {Connection} connection Connection to RPC Endpoint.\n   *\n   * @returns {Promise<number | null>} The estimated fee for the transaction\n   */\n  async getEstimatedFee(connection) {\n    return (await connection.getFeeForMessage(this.compileMessage())).value;\n  }\n\n  /**\n   * Specify the public keys which will be used to sign the Transaction.\n   * The first signer will be used as the transaction fee payer account.\n   *\n   * Signatures can be added with either `partialSign` or `addSignature`\n   *\n   * @deprecated Deprecated since v0.84.0. Only the fee payer needs to be\n   * specified and it can be set in the Transaction constructor or with the\n   * `feePayer` property.\n   */\n  setSigners(...signers) {\n    if (signers.length === 0) {\n      throw new Error('No signers');\n    }\n    const seen = new Set();\n    this.signatures = signers.filter(publicKey => {\n      const key = publicKey.toString();\n      if (seen.has(key)) {\n        return false;\n      } else {\n        seen.add(key);\n        return true;\n      }\n    }).map(publicKey => ({\n      signature: null,\n      publicKey\n    }));\n  }\n\n  /**\n   * Sign the Transaction with the specified signers. Multiple signatures may\n   * be applied to a Transaction. The first signature is considered \"primary\"\n   * and is used identify and confirm transactions.\n   *\n   * If the Transaction `feePayer` is not set, the first signer will be used\n   * as the transaction fee payer account.\n   *\n   * Transaction fields should not be modified after the first call to `sign`,\n   * as doing so may invalidate the signature and cause the Transaction to be\n   * rejected.\n   *\n   * The Transaction must be assigned a valid `recentBlockhash` before invoking this method\n   *\n   * @param {Array<Signer>} signers Array of signers that will sign the transaction\n   */\n  sign(...signers) {\n    if (signers.length === 0) {\n      throw new Error('No signers');\n    }\n\n    // Dedupe signers\n    const seen = new Set();\n    const uniqueSigners = [];\n    for (const signer of signers) {\n      const key = signer.publicKey.toString();\n      if (seen.has(key)) {\n        continue;\n      } else {\n        seen.add(key);\n        uniqueSigners.push(signer);\n      }\n    }\n    this.signatures = uniqueSigners.map(signer => ({\n      signature: null,\n      publicKey: signer.publicKey\n    }));\n    const message = this._compile();\n    this._partialSign(message, ...uniqueSigners);\n  }\n\n  /**\n   * Partially sign a transaction with the specified accounts. All accounts must\n   * correspond to either the fee payer or a signer account in the transaction\n   * instructions.\n   *\n   * All the caveats from the `sign` method apply to `partialSign`\n   *\n   * @param {Array<Signer>} signers Array of signers that will sign the transaction\n   */\n  partialSign(...signers) {\n    if (signers.length === 0) {\n      throw new Error('No signers');\n    }\n\n    // Dedupe signers\n    const seen = new Set();\n    const uniqueSigners = [];\n    for (const signer of signers) {\n      const key = signer.publicKey.toString();\n      if (seen.has(key)) {\n        continue;\n      } else {\n        seen.add(key);\n        uniqueSigners.push(signer);\n      }\n    }\n    const message = this._compile();\n    this._partialSign(message, ...uniqueSigners);\n  }\n\n  /**\n   * @internal\n   */\n  _partialSign(message, ...signers) {\n    const signData = message.serialize();\n    signers.forEach(signer => {\n      const signature = sign(signData, signer.secretKey);\n      this._addSignature(signer.publicKey, toBuffer(signature));\n    });\n  }\n\n  /**\n   * Add an externally created signature to a transaction. The public key\n   * must correspond to either the fee payer or a signer account in the transaction\n   * instructions.\n   *\n   * @param {PublicKey} pubkey Public key that will be added to the transaction.\n   * @param {Buffer} signature An externally created signature to add to the transaction.\n   */\n  addSignature(pubkey, signature) {\n    this._compile(); // Ensure signatures array is populated\n    this._addSignature(pubkey, signature);\n  }\n\n  /**\n   * @internal\n   */\n  _addSignature(pubkey, signature) {\n    assert(signature.length === 64);\n    const index = this.signatures.findIndex(sigpair => pubkey.equals(sigpair.publicKey));\n    if (index < 0) {\n      throw new Error(`unknown signer: ${pubkey.toString()}`);\n    }\n    this.signatures[index].signature = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(signature);\n  }\n\n  /**\n   * Verify signatures of a Transaction\n   * Optional parameter specifies if we're expecting a fully signed Transaction or a partially signed one.\n   * If no boolean is provided, we expect a fully signed Transaction by default.\n   *\n   * @param {boolean} [requireAllSignatures=true] Require a fully signed Transaction\n   */\n  verifySignatures(requireAllSignatures = true) {\n    const signatureErrors = this._getMessageSignednessErrors(this.serializeMessage(), requireAllSignatures);\n    return !signatureErrors;\n  }\n\n  /**\n   * @internal\n   */\n  _getMessageSignednessErrors(message, requireAllSignatures) {\n    const errors = {};\n    for (const {\n      signature,\n      publicKey\n    } of this.signatures) {\n      if (signature === null) {\n        if (requireAllSignatures) {\n          (errors.missing ||= []).push(publicKey);\n        }\n      } else {\n        if (!verify(signature, message, publicKey.toBytes())) {\n          (errors.invalid ||= []).push(publicKey);\n        }\n      }\n    }\n    return errors.invalid || errors.missing ? errors : undefined;\n  }\n\n  /**\n   * Serialize the Transaction in the wire format.\n   *\n   * @param {Buffer} [config] Config of transaction.\n   *\n   * @returns {Buffer} Signature of transaction in wire format.\n   */\n  serialize(config) {\n    const {\n      requireAllSignatures,\n      verifySignatures\n    } = Object.assign({\n      requireAllSignatures: true,\n      verifySignatures: true\n    }, config);\n    const signData = this.serializeMessage();\n    if (verifySignatures) {\n      const sigErrors = this._getMessageSignednessErrors(signData, requireAllSignatures);\n      if (sigErrors) {\n        let errorMessage = 'Signature verification failed.';\n        if (sigErrors.invalid) {\n          errorMessage += `\\nInvalid signature for public key${sigErrors.invalid.length === 1 ? '' : '(s)'} [\\`${sigErrors.invalid.map(p => p.toBase58()).join('`, `')}\\`].`;\n        }\n        if (sigErrors.missing) {\n          errorMessage += `\\nMissing signature for public key${sigErrors.missing.length === 1 ? '' : '(s)'} [\\`${sigErrors.missing.map(p => p.toBase58()).join('`, `')}\\`].`;\n        }\n        throw new Error(errorMessage);\n      }\n    }\n    return this._serialize(signData);\n  }\n\n  /**\n   * @internal\n   */\n  _serialize(signData) {\n    const {\n      signatures\n    } = this;\n    const signatureCount = [];\n    encodeLength(signatureCount, signatures.length);\n    const transactionLength = signatureCount.length + signatures.length * 64 + signData.length;\n    const wireTransaction = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(transactionLength);\n    assert(signatures.length < 256);\n    buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(signatureCount).copy(wireTransaction, 0);\n    signatures.forEach(({\n      signature\n    }, index) => {\n      if (signature !== null) {\n        assert(signature.length === 64, `signature has invalid length`);\n        buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(signature).copy(wireTransaction, signatureCount.length + index * 64);\n      }\n    });\n    signData.copy(wireTransaction, signatureCount.length + signatures.length * 64);\n    assert(wireTransaction.length <= PACKET_DATA_SIZE, `Transaction too large: ${wireTransaction.length} > ${PACKET_DATA_SIZE}`);\n    return wireTransaction;\n  }\n\n  /**\n   * Deprecated method\n   * @internal\n   */\n  get keys() {\n    assert(this.instructions.length === 1);\n    return this.instructions[0].keys.map(keyObj => keyObj.pubkey);\n  }\n\n  /**\n   * Deprecated method\n   * @internal\n   */\n  get programId() {\n    assert(this.instructions.length === 1);\n    return this.instructions[0].programId;\n  }\n\n  /**\n   * Deprecated method\n   * @internal\n   */\n  get data() {\n    assert(this.instructions.length === 1);\n    return this.instructions[0].data;\n  }\n\n  /**\n   * Parse a wire transaction into a Transaction object.\n   *\n   * @param {Buffer | Uint8Array | Array<number>} buffer Signature of wire Transaction\n   *\n   * @returns {Transaction} Transaction associated with the signature\n   */\n  static from(buffer) {\n    // Slice up wire data\n    let byteArray = [...buffer];\n    const signatureCount = decodeLength(byteArray);\n    let signatures = [];\n    for (let i = 0; i < signatureCount; i++) {\n      const signature = guardedSplice(byteArray, 0, SIGNATURE_LENGTH_IN_BYTES);\n      signatures.push(bs58__WEBPACK_IMPORTED_MODULE_2___default().encode(buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(signature)));\n    }\n    return Transaction.populate(Message.from(byteArray), signatures);\n  }\n\n  /**\n   * Populate Transaction object from message and signatures\n   *\n   * @param {Message} message Message of transaction\n   * @param {Array<string>} signatures List of signatures to assign to the transaction\n   *\n   * @returns {Transaction} The populated Transaction\n   */\n  static populate(message, signatures = []) {\n    const transaction = new Transaction();\n    transaction.recentBlockhash = message.recentBlockhash;\n    if (message.header.numRequiredSignatures > 0) {\n      transaction.feePayer = message.accountKeys[0];\n    }\n    signatures.forEach((signature, index) => {\n      const sigPubkeyPair = {\n        signature: signature == bs58__WEBPACK_IMPORTED_MODULE_2___default().encode(DEFAULT_SIGNATURE) ? null : bs58__WEBPACK_IMPORTED_MODULE_2___default().decode(signature),\n        publicKey: message.accountKeys[index]\n      };\n      transaction.signatures.push(sigPubkeyPair);\n    });\n    message.instructions.forEach(instruction => {\n      const keys = instruction.accounts.map(account => {\n        const pubkey = message.accountKeys[account];\n        return {\n          pubkey,\n          isSigner: transaction.signatures.some(keyObj => keyObj.publicKey.toString() === pubkey.toString()) || message.isAccountSigner(account),\n          isWritable: message.isAccountWritable(account)\n        };\n      });\n      transaction.instructions.push(new TransactionInstruction({\n        keys,\n        programId: message.accountKeys[instruction.programIdIndex],\n        data: bs58__WEBPACK_IMPORTED_MODULE_2___default().decode(instruction.data)\n      }));\n    });\n    transaction._message = message;\n    transaction._json = transaction.toJSON();\n    return transaction;\n  }\n}\n\nclass TransactionMessage {\n  constructor(args) {\n    this.payerKey = void 0;\n    this.instructions = void 0;\n    this.recentBlockhash = void 0;\n    this.payerKey = args.payerKey;\n    this.instructions = args.instructions;\n    this.recentBlockhash = args.recentBlockhash;\n  }\n  static decompile(message, args) {\n    const {\n      header,\n      compiledInstructions,\n      recentBlockhash\n    } = message;\n    const {\n      numRequiredSignatures,\n      numReadonlySignedAccounts,\n      numReadonlyUnsignedAccounts\n    } = header;\n    const numWritableSignedAccounts = numRequiredSignatures - numReadonlySignedAccounts;\n    assert(numWritableSignedAccounts > 0, 'Message header is invalid');\n    const numWritableUnsignedAccounts = message.staticAccountKeys.length - numRequiredSignatures - numReadonlyUnsignedAccounts;\n    assert(numWritableUnsignedAccounts >= 0, 'Message header is invalid');\n    const accountKeys = message.getAccountKeys(args);\n    const payerKey = accountKeys.get(0);\n    if (payerKey === undefined) {\n      throw new Error('Failed to decompile message because no account keys were found');\n    }\n    const instructions = [];\n    for (const compiledIx of compiledInstructions) {\n      const keys = [];\n      for (const keyIndex of compiledIx.accountKeyIndexes) {\n        const pubkey = accountKeys.get(keyIndex);\n        if (pubkey === undefined) {\n          throw new Error(`Failed to find key for account key index ${keyIndex}`);\n        }\n        const isSigner = keyIndex < numRequiredSignatures;\n        let isWritable;\n        if (isSigner) {\n          isWritable = keyIndex < numWritableSignedAccounts;\n        } else if (keyIndex < accountKeys.staticAccountKeys.length) {\n          isWritable = keyIndex - numRequiredSignatures < numWritableUnsignedAccounts;\n        } else {\n          isWritable = keyIndex - accountKeys.staticAccountKeys.length <\n          // accountKeysFromLookups cannot be undefined because we already found a pubkey for this index above\n          accountKeys.accountKeysFromLookups.writable.length;\n        }\n        keys.push({\n          pubkey,\n          isSigner: keyIndex < header.numRequiredSignatures,\n          isWritable\n        });\n      }\n      const programId = accountKeys.get(compiledIx.programIdIndex);\n      if (programId === undefined) {\n        throw new Error(`Failed to find program id for program id index ${compiledIx.programIdIndex}`);\n      }\n      instructions.push(new TransactionInstruction({\n        programId,\n        data: toBuffer(compiledIx.data),\n        keys\n      }));\n    }\n    return new TransactionMessage({\n      payerKey,\n      instructions,\n      recentBlockhash\n    });\n  }\n  compileToLegacyMessage() {\n    return Message.compile({\n      payerKey: this.payerKey,\n      recentBlockhash: this.recentBlockhash,\n      instructions: this.instructions\n    });\n  }\n  compileToV0Message(addressLookupTableAccounts) {\n    return MessageV0.compile({\n      payerKey: this.payerKey,\n      recentBlockhash: this.recentBlockhash,\n      instructions: this.instructions,\n      addressLookupTableAccounts\n    });\n  }\n}\n\n/**\n * Versioned transaction class\n */\nclass VersionedTransaction {\n  get version() {\n    return this.message.version;\n  }\n  constructor(message, signatures) {\n    this.signatures = void 0;\n    this.message = void 0;\n    if (signatures !== undefined) {\n      assert(signatures.length === message.header.numRequiredSignatures, 'Expected signatures length to be equal to the number of required signatures');\n      this.signatures = signatures;\n    } else {\n      const defaultSignatures = [];\n      for (let i = 0; i < message.header.numRequiredSignatures; i++) {\n        defaultSignatures.push(new Uint8Array(SIGNATURE_LENGTH_IN_BYTES));\n      }\n      this.signatures = defaultSignatures;\n    }\n    this.message = message;\n  }\n  serialize() {\n    const serializedMessage = this.message.serialize();\n    const encodedSignaturesLength = Array();\n    encodeLength(encodedSignaturesLength, this.signatures.length);\n    const transactionLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(encodedSignaturesLength.length, 'encodedSignaturesLength'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(signature(), this.signatures.length, 'signatures'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(serializedMessage.length, 'serializedMessage')]);\n    const serializedTransaction = new Uint8Array(2048);\n    const serializedTransactionLength = transactionLayout.encode({\n      encodedSignaturesLength: new Uint8Array(encodedSignaturesLength),\n      signatures: this.signatures,\n      serializedMessage\n    }, serializedTransaction);\n    return serializedTransaction.slice(0, serializedTransactionLength);\n  }\n  static deserialize(serializedTransaction) {\n    let byteArray = [...serializedTransaction];\n    const signatures = [];\n    const signaturesLength = decodeLength(byteArray);\n    for (let i = 0; i < signaturesLength; i++) {\n      signatures.push(new Uint8Array(guardedSplice(byteArray, 0, SIGNATURE_LENGTH_IN_BYTES)));\n    }\n    const message = VersionedMessage.deserialize(new Uint8Array(byteArray));\n    return new VersionedTransaction(message, signatures);\n  }\n  sign(signers) {\n    const messageData = this.message.serialize();\n    const signerPubkeys = this.message.staticAccountKeys.slice(0, this.message.header.numRequiredSignatures);\n    for (const signer of signers) {\n      const signerIndex = signerPubkeys.findIndex(pubkey => pubkey.equals(signer.publicKey));\n      assert(signerIndex >= 0, `Cannot sign with non signer key ${signer.publicKey.toBase58()}`);\n      this.signatures[signerIndex] = sign(messageData, signer.secretKey);\n    }\n  }\n  addSignature(publicKey, signature) {\n    assert(signature.byteLength === 64, 'Signature must be 64 bytes long');\n    const signerPubkeys = this.message.staticAccountKeys.slice(0, this.message.header.numRequiredSignatures);\n    const signerIndex = signerPubkeys.findIndex(pubkey => pubkey.equals(publicKey));\n    assert(signerIndex >= 0, `Can not add signature; \\`${publicKey.toBase58()}\\` is not required to sign this transaction`);\n    this.signatures[signerIndex] = signature;\n  }\n}\n\n// TODO: These constants should be removed in favor of reading them out of a\n// Syscall account\n\n/**\n * @internal\n */\nconst NUM_TICKS_PER_SECOND = 160;\n\n/**\n * @internal\n */\nconst DEFAULT_TICKS_PER_SLOT = 64;\n\n/**\n * @internal\n */\nconst NUM_SLOTS_PER_SECOND = NUM_TICKS_PER_SECOND / DEFAULT_TICKS_PER_SLOT;\n\n/**\n * @internal\n */\nconst MS_PER_SLOT = 1000 / NUM_SLOTS_PER_SECOND;\n\nconst SYSVAR_CLOCK_PUBKEY = new PublicKey('SysvarC1ock11111111111111111111111111111111');\nconst SYSVAR_EPOCH_SCHEDULE_PUBKEY = new PublicKey('SysvarEpochSchedu1e111111111111111111111111');\nconst SYSVAR_INSTRUCTIONS_PUBKEY = new PublicKey('Sysvar1nstructions1111111111111111111111111');\nconst SYSVAR_RECENT_BLOCKHASHES_PUBKEY = new PublicKey('SysvarRecentB1ockHashes11111111111111111111');\nconst SYSVAR_RENT_PUBKEY = new PublicKey('SysvarRent111111111111111111111111111111111');\nconst SYSVAR_REWARDS_PUBKEY = new PublicKey('SysvarRewards111111111111111111111111111111');\nconst SYSVAR_SLOT_HASHES_PUBKEY = new PublicKey('SysvarS1otHashes111111111111111111111111111');\nconst SYSVAR_SLOT_HISTORY_PUBKEY = new PublicKey('SysvarS1otHistory11111111111111111111111111');\nconst SYSVAR_STAKE_HISTORY_PUBKEY = new PublicKey('SysvarStakeHistory1111111111111111111111111');\n\nclass SendTransactionError extends Error {\n  constructor({\n    action,\n    signature,\n    transactionMessage,\n    logs\n  }) {\n    const maybeLogsOutput = logs ? `Logs: \\n${JSON.stringify(logs.slice(-10), null, 2)}. ` : '';\n    const guideText = '\\nCatch the `SendTransactionError` and call `getLogs()` on it for full details.';\n    let message;\n    switch (action) {\n      case 'send':\n        message = `Transaction ${signature} resulted in an error. \\n` + `${transactionMessage}. ` + maybeLogsOutput + guideText;\n        break;\n      case 'simulate':\n        message = `Simulation failed. \\nMessage: ${transactionMessage}. \\n` + maybeLogsOutput + guideText;\n        break;\n      default:\n        {\n          message = `Unknown action '${(a => a)(action)}'`;\n        }\n    }\n    super(message);\n    this.signature = void 0;\n    this.transactionMessage = void 0;\n    this.transactionLogs = void 0;\n    this.signature = signature;\n    this.transactionMessage = transactionMessage;\n    this.transactionLogs = logs ? logs : undefined;\n  }\n  get transactionError() {\n    return {\n      message: this.transactionMessage,\n      logs: Array.isArray(this.transactionLogs) ? this.transactionLogs : undefined\n    };\n  }\n\n  /* @deprecated Use `await getLogs()` instead */\n  get logs() {\n    const cachedLogs = this.transactionLogs;\n    if (cachedLogs != null && typeof cachedLogs === 'object' && 'then' in cachedLogs) {\n      return undefined;\n    }\n    return cachedLogs;\n  }\n  async getLogs(connection) {\n    if (!Array.isArray(this.transactionLogs)) {\n      this.transactionLogs = new Promise((resolve, reject) => {\n        connection.getTransaction(this.signature).then(tx => {\n          if (tx && tx.meta && tx.meta.logMessages) {\n            const logs = tx.meta.logMessages;\n            this.transactionLogs = logs;\n            resolve(logs);\n          } else {\n            reject(new Error('Log messages not found'));\n          }\n        }).catch(reject);\n      });\n    }\n    return await this.transactionLogs;\n  }\n}\n\n// Keep in sync with client/src/rpc_custom_errors.rs\n// Typescript `enums` thwart tree-shaking. See https://bargsten.org/jsts/enums/\nconst SolanaJSONRPCErrorCode = {\n  JSON_RPC_SERVER_ERROR_BLOCK_CLEANED_UP: -32001,\n  JSON_RPC_SERVER_ERROR_SEND_TRANSACTION_PREFLIGHT_FAILURE: -32002,\n  JSON_RPC_SERVER_ERROR_TRANSACTION_SIGNATURE_VERIFICATION_FAILURE: -32003,\n  JSON_RPC_SERVER_ERROR_BLOCK_NOT_AVAILABLE: -32004,\n  JSON_RPC_SERVER_ERROR_NODE_UNHEALTHY: -32005,\n  JSON_RPC_SERVER_ERROR_TRANSACTION_PRECOMPILE_VERIFICATION_FAILURE: -32006,\n  JSON_RPC_SERVER_ERROR_SLOT_SKIPPED: -32007,\n  JSON_RPC_SERVER_ERROR_NO_SNAPSHOT: -32008,\n  JSON_RPC_SERVER_ERROR_LONG_TERM_STORAGE_SLOT_SKIPPED: -32009,\n  JSON_RPC_SERVER_ERROR_KEY_EXCLUDED_FROM_SECONDARY_INDEX: -32010,\n  JSON_RPC_SERVER_ERROR_TRANSACTION_HISTORY_NOT_AVAILABLE: -32011,\n  JSON_RPC_SCAN_ERROR: -32012,\n  JSON_RPC_SERVER_ERROR_TRANSACTION_SIGNATURE_LEN_MISMATCH: -32013,\n  JSON_RPC_SERVER_ERROR_BLOCK_STATUS_NOT_AVAILABLE_YET: -32014,\n  JSON_RPC_SERVER_ERROR_UNSUPPORTED_TRANSACTION_VERSION: -32015,\n  JSON_RPC_SERVER_ERROR_MIN_CONTEXT_SLOT_NOT_REACHED: -32016\n};\nclass SolanaJSONRPCError extends Error {\n  constructor({\n    code,\n    message,\n    data\n  }, customMessage) {\n    super(customMessage != null ? `${customMessage}: ${message}` : message);\n    this.code = void 0;\n    this.data = void 0;\n    this.code = code;\n    this.data = data;\n    this.name = 'SolanaJSONRPCError';\n  }\n}\n\n/**\n * Sign, send and confirm a transaction.\n *\n * If `commitment` option is not specified, defaults to 'max' commitment.\n *\n * @param {Connection} connection\n * @param {Transaction} transaction\n * @param {Array<Signer>} signers\n * @param {ConfirmOptions} [options]\n * @returns {Promise<TransactionSignature>}\n */\nasync function sendAndConfirmTransaction(connection, transaction, signers, options) {\n  const sendOptions = options && {\n    skipPreflight: options.skipPreflight,\n    preflightCommitment: options.preflightCommitment || options.commitment,\n    maxRetries: options.maxRetries,\n    minContextSlot: options.minContextSlot\n  };\n  const signature = await connection.sendTransaction(transaction, signers, sendOptions);\n  let status;\n  if (transaction.recentBlockhash != null && transaction.lastValidBlockHeight != null) {\n    status = (await connection.confirmTransaction({\n      abortSignal: options?.abortSignal,\n      signature: signature,\n      blockhash: transaction.recentBlockhash,\n      lastValidBlockHeight: transaction.lastValidBlockHeight\n    }, options && options.commitment)).value;\n  } else if (transaction.minNonceContextSlot != null && transaction.nonceInfo != null) {\n    const {\n      nonceInstruction\n    } = transaction.nonceInfo;\n    const nonceAccountPubkey = nonceInstruction.keys[0].pubkey;\n    status = (await connection.confirmTransaction({\n      abortSignal: options?.abortSignal,\n      minContextSlot: transaction.minNonceContextSlot,\n      nonceAccountPubkey,\n      nonceValue: transaction.nonceInfo.nonce,\n      signature\n    }, options && options.commitment)).value;\n  } else {\n    if (options?.abortSignal != null) {\n      console.warn('sendAndConfirmTransaction(): A transaction with a deprecated confirmation strategy was ' + 'supplied along with an `abortSignal`. Only transactions having `lastValidBlockHeight` ' + 'or a combination of `nonceInfo` and `minNonceContextSlot` are abortable.');\n    }\n    status = (await connection.confirmTransaction(signature, options && options.commitment)).value;\n  }\n  if (status.err) {\n    if (signature != null) {\n      throw new SendTransactionError({\n        action: 'send',\n        signature: signature,\n        transactionMessage: `Status: (${JSON.stringify(status)})`\n      });\n    }\n    throw new Error(`Transaction ${signature} failed (${JSON.stringify(status)})`);\n  }\n  return signature;\n}\n\n// zzz\nfunction sleep(ms) {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * @internal\n */\n\n/**\n * Populate a buffer of instruction data using an InstructionType\n * @internal\n */\nfunction encodeData(type, fields) {\n  const allocLength = type.layout.span >= 0 ? type.layout.span : getAlloc(type, fields);\n  const data = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(allocLength);\n  const layoutFields = Object.assign({\n    instruction: type.index\n  }, fields);\n  type.layout.encode(layoutFields, data);\n  return data;\n}\n\n/**\n * Decode instruction data buffer using an InstructionType\n * @internal\n */\nfunction decodeData$1(type, buffer) {\n  let data;\n  try {\n    data = type.layout.decode(buffer);\n  } catch (err) {\n    throw new Error('invalid instruction; ' + err);\n  }\n  if (data.instruction !== type.index) {\n    throw new Error(`invalid instruction; instruction index mismatch ${data.instruction} != ${type.index}`);\n  }\n  return data;\n}\n\n/**\n * https://github.com/solana-labs/solana/blob/90bedd7e067b5b8f3ddbb45da00a4e9cabb22c62/sdk/src/fee_calculator.rs#L7-L11\n *\n * @internal\n */\nconst FeeCalculatorLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('lamportsPerSignature');\n\n/**\n * Calculator for transaction fees.\n *\n * @deprecated Deprecated since Solana v1.8.0.\n */\n\n/**\n * See https://github.com/solana-labs/solana/blob/0ea2843ec9cdc517572b8e62c959f41b55cf4453/sdk/src/nonce_state.rs#L29-L32\n *\n * @internal\n */\nconst NonceAccountLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('version'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('state'), publicKey('authorizedPubkey'), publicKey('nonce'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([FeeCalculatorLayout], 'feeCalculator')]);\nconst NONCE_ACCOUNT_LENGTH = NonceAccountLayout.span;\n\n/**\n * A durable nonce is a 32 byte value encoded as a base58 string.\n */\n\n/**\n * NonceAccount class\n */\nclass NonceAccount {\n  /**\n   * @internal\n   */\n  constructor(args) {\n    this.authorizedPubkey = void 0;\n    this.nonce = void 0;\n    this.feeCalculator = void 0;\n    this.authorizedPubkey = args.authorizedPubkey;\n    this.nonce = args.nonce;\n    this.feeCalculator = args.feeCalculator;\n  }\n\n  /**\n   * Deserialize NonceAccount from the account data.\n   *\n   * @param buffer account data\n   * @return NonceAccount\n   */\n  static fromAccountData(buffer) {\n    const nonceAccount = NonceAccountLayout.decode(toBuffer(buffer), 0);\n    return new NonceAccount({\n      authorizedPubkey: new PublicKey(nonceAccount.authorizedPubkey),\n      nonce: new PublicKey(nonceAccount.nonce).toString(),\n      feeCalculator: nonceAccount.feeCalculator\n    });\n  }\n}\n\nfunction u64(property) {\n  const layout = (0,_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob)(8 /* bytes */, property);\n  const decode = layout.decode.bind(layout);\n  const encode = layout.encode.bind(layout);\n  const bigIntLayout = layout;\n  const codec = (0,_solana_codecs_numbers__WEBPACK_IMPORTED_MODULE_9__.getU64Codec)();\n  bigIntLayout.decode = (buffer, offset) => {\n    const src = decode(buffer, offset);\n    return codec.decode(src);\n  };\n  bigIntLayout.encode = (bigInt, buffer, offset) => {\n    const src = codec.encode(bigInt);\n    return encode(src, buffer, offset);\n  };\n  return bigIntLayout;\n}\n\n/**\n * Create account system transaction params\n */\n\n/**\n * Transfer system transaction params\n */\n\n/**\n * Assign system transaction params\n */\n\n/**\n * Create account with seed system transaction params\n */\n\n/**\n * Create nonce account system transaction params\n */\n\n/**\n * Create nonce account with seed system transaction params\n */\n\n/**\n * Initialize nonce account system instruction params\n */\n\n/**\n * Advance nonce account system instruction params\n */\n\n/**\n * Withdraw nonce account system transaction params\n */\n\n/**\n * Authorize nonce account system transaction params\n */\n\n/**\n * Allocate account system transaction params\n */\n\n/**\n * Allocate account with seed system transaction params\n */\n\n/**\n * Assign account with seed system transaction params\n */\n\n/**\n * Transfer with seed system transaction params\n */\n\n/** Decoded transfer system transaction instruction */\n\n/** Decoded transferWithSeed system transaction instruction */\n\n/**\n * System Instruction class\n */\nclass SystemInstruction {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Decode a system instruction and retrieve the instruction type.\n   */\n  static decodeInstructionType(instruction) {\n    this.checkProgramId(instruction.programId);\n    const instructionTypeLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction');\n    const typeIndex = instructionTypeLayout.decode(instruction.data);\n    let type;\n    for (const [ixType, layout] of Object.entries(SYSTEM_INSTRUCTION_LAYOUTS)) {\n      if (layout.index == typeIndex) {\n        type = ixType;\n        break;\n      }\n    }\n    if (!type) {\n      throw new Error('Instruction type incorrect; not a SystemInstruction');\n    }\n    return type;\n  }\n\n  /**\n   * Decode a create account system instruction and retrieve the instruction params.\n   */\n  static decodeCreateAccount(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 2);\n    const {\n      lamports,\n      space,\n      programId\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.Create, instruction.data);\n    return {\n      fromPubkey: instruction.keys[0].pubkey,\n      newAccountPubkey: instruction.keys[1].pubkey,\n      lamports,\n      space,\n      programId: new PublicKey(programId)\n    };\n  }\n\n  /**\n   * Decode a transfer system instruction and retrieve the instruction params.\n   */\n  static decodeTransfer(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 2);\n    const {\n      lamports\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.Transfer, instruction.data);\n    return {\n      fromPubkey: instruction.keys[0].pubkey,\n      toPubkey: instruction.keys[1].pubkey,\n      lamports\n    };\n  }\n\n  /**\n   * Decode a transfer with seed system instruction and retrieve the instruction params.\n   */\n  static decodeTransferWithSeed(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 3);\n    const {\n      lamports,\n      seed,\n      programId\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.TransferWithSeed, instruction.data);\n    return {\n      fromPubkey: instruction.keys[0].pubkey,\n      basePubkey: instruction.keys[1].pubkey,\n      toPubkey: instruction.keys[2].pubkey,\n      lamports,\n      seed,\n      programId: new PublicKey(programId)\n    };\n  }\n\n  /**\n   * Decode an allocate system instruction and retrieve the instruction params.\n   */\n  static decodeAllocate(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 1);\n    const {\n      space\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.Allocate, instruction.data);\n    return {\n      accountPubkey: instruction.keys[0].pubkey,\n      space\n    };\n  }\n\n  /**\n   * Decode an allocate with seed system instruction and retrieve the instruction params.\n   */\n  static decodeAllocateWithSeed(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 1);\n    const {\n      base,\n      seed,\n      space,\n      programId\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.AllocateWithSeed, instruction.data);\n    return {\n      accountPubkey: instruction.keys[0].pubkey,\n      basePubkey: new PublicKey(base),\n      seed,\n      space,\n      programId: new PublicKey(programId)\n    };\n  }\n\n  /**\n   * Decode an assign system instruction and retrieve the instruction params.\n   */\n  static decodeAssign(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 1);\n    const {\n      programId\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.Assign, instruction.data);\n    return {\n      accountPubkey: instruction.keys[0].pubkey,\n      programId: new PublicKey(programId)\n    };\n  }\n\n  /**\n   * Decode an assign with seed system instruction and retrieve the instruction params.\n   */\n  static decodeAssignWithSeed(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 1);\n    const {\n      base,\n      seed,\n      programId\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.AssignWithSeed, instruction.data);\n    return {\n      accountPubkey: instruction.keys[0].pubkey,\n      basePubkey: new PublicKey(base),\n      seed,\n      programId: new PublicKey(programId)\n    };\n  }\n\n  /**\n   * Decode a create account with seed system instruction and retrieve the instruction params.\n   */\n  static decodeCreateWithSeed(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 2);\n    const {\n      base,\n      seed,\n      lamports,\n      space,\n      programId\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.CreateWithSeed, instruction.data);\n    return {\n      fromPubkey: instruction.keys[0].pubkey,\n      newAccountPubkey: instruction.keys[1].pubkey,\n      basePubkey: new PublicKey(base),\n      seed,\n      lamports,\n      space,\n      programId: new PublicKey(programId)\n    };\n  }\n\n  /**\n   * Decode a nonce initialize system instruction and retrieve the instruction params.\n   */\n  static decodeNonceInitialize(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 3);\n    const {\n      authorized\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.InitializeNonceAccount, instruction.data);\n    return {\n      noncePubkey: instruction.keys[0].pubkey,\n      authorizedPubkey: new PublicKey(authorized)\n    };\n  }\n\n  /**\n   * Decode a nonce advance system instruction and retrieve the instruction params.\n   */\n  static decodeNonceAdvance(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 3);\n    decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.AdvanceNonceAccount, instruction.data);\n    return {\n      noncePubkey: instruction.keys[0].pubkey,\n      authorizedPubkey: instruction.keys[2].pubkey\n    };\n  }\n\n  /**\n   * Decode a nonce withdraw system instruction and retrieve the instruction params.\n   */\n  static decodeNonceWithdraw(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 5);\n    const {\n      lamports\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.WithdrawNonceAccount, instruction.data);\n    return {\n      noncePubkey: instruction.keys[0].pubkey,\n      toPubkey: instruction.keys[1].pubkey,\n      authorizedPubkey: instruction.keys[4].pubkey,\n      lamports\n    };\n  }\n\n  /**\n   * Decode a nonce authorize system instruction and retrieve the instruction params.\n   */\n  static decodeNonceAuthorize(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 2);\n    const {\n      authorized\n    } = decodeData$1(SYSTEM_INSTRUCTION_LAYOUTS.AuthorizeNonceAccount, instruction.data);\n    return {\n      noncePubkey: instruction.keys[0].pubkey,\n      authorizedPubkey: instruction.keys[1].pubkey,\n      newAuthorizedPubkey: new PublicKey(authorized)\n    };\n  }\n\n  /**\n   * @internal\n   */\n  static checkProgramId(programId) {\n    if (!programId.equals(SystemProgram.programId)) {\n      throw new Error('invalid instruction; programId is not SystemProgram');\n    }\n  }\n\n  /**\n   * @internal\n   */\n  static checkKeyLength(keys, expectedLength) {\n    if (keys.length < expectedLength) {\n      throw new Error(`invalid instruction; found ${keys.length} keys, expected at least ${expectedLength}`);\n    }\n  }\n}\n\n/**\n * An enumeration of valid SystemInstructionType's\n */\n\n/**\n * An enumeration of valid system InstructionType's\n * @internal\n */\nconst SYSTEM_INSTRUCTION_LAYOUTS = Object.freeze({\n  Create: {\n    index: 0,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('lamports'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('space'), publicKey('programId')])\n  },\n  Assign: {\n    index: 1,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), publicKey('programId')])\n  },\n  Transfer: {\n    index: 2,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), u64('lamports')])\n  },\n  CreateWithSeed: {\n    index: 3,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), publicKey('base'), rustString('seed'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('lamports'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('space'), publicKey('programId')])\n  },\n  AdvanceNonceAccount: {\n    index: 4,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction')])\n  },\n  WithdrawNonceAccount: {\n    index: 5,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('lamports')])\n  },\n  InitializeNonceAccount: {\n    index: 6,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), publicKey('authorized')])\n  },\n  AuthorizeNonceAccount: {\n    index: 7,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), publicKey('authorized')])\n  },\n  Allocate: {\n    index: 8,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('space')])\n  },\n  AllocateWithSeed: {\n    index: 9,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), publicKey('base'), rustString('seed'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('space'), publicKey('programId')])\n  },\n  AssignWithSeed: {\n    index: 10,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), publicKey('base'), rustString('seed'), publicKey('programId')])\n  },\n  TransferWithSeed: {\n    index: 11,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), u64('lamports'), rustString('seed'), publicKey('programId')])\n  },\n  UpgradeNonceAccount: {\n    index: 12,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction')])\n  }\n});\n\n/**\n * Factory class for transactions to interact with the System program\n */\nclass SystemProgram {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Public key that identifies the System program\n   */\n\n  /**\n   * Generate a transaction instruction that creates a new account\n   */\n  static createAccount(params) {\n    const type = SYSTEM_INSTRUCTION_LAYOUTS.Create;\n    const data = encodeData(type, {\n      lamports: params.lamports,\n      space: params.space,\n      programId: toBuffer(params.programId.toBuffer())\n    });\n    return new TransactionInstruction({\n      keys: [{\n        pubkey: params.fromPubkey,\n        isSigner: true,\n        isWritable: true\n      }, {\n        pubkey: params.newAccountPubkey,\n        isSigner: true,\n        isWritable: true\n      }],\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a transaction instruction that transfers lamports from one account to another\n   */\n  static transfer(params) {\n    let data;\n    let keys;\n    if ('basePubkey' in params) {\n      const type = SYSTEM_INSTRUCTION_LAYOUTS.TransferWithSeed;\n      data = encodeData(type, {\n        lamports: BigInt(params.lamports),\n        seed: params.seed,\n        programId: toBuffer(params.programId.toBuffer())\n      });\n      keys = [{\n        pubkey: params.fromPubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: params.basePubkey,\n        isSigner: true,\n        isWritable: false\n      }, {\n        pubkey: params.toPubkey,\n        isSigner: false,\n        isWritable: true\n      }];\n    } else {\n      const type = SYSTEM_INSTRUCTION_LAYOUTS.Transfer;\n      data = encodeData(type, {\n        lamports: BigInt(params.lamports)\n      });\n      keys = [{\n        pubkey: params.fromPubkey,\n        isSigner: true,\n        isWritable: true\n      }, {\n        pubkey: params.toPubkey,\n        isSigner: false,\n        isWritable: true\n      }];\n    }\n    return new TransactionInstruction({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a transaction instruction that assigns an account to a program\n   */\n  static assign(params) {\n    let data;\n    let keys;\n    if ('basePubkey' in params) {\n      const type = SYSTEM_INSTRUCTION_LAYOUTS.AssignWithSeed;\n      data = encodeData(type, {\n        base: toBuffer(params.basePubkey.toBuffer()),\n        seed: params.seed,\n        programId: toBuffer(params.programId.toBuffer())\n      });\n      keys = [{\n        pubkey: params.accountPubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: params.basePubkey,\n        isSigner: true,\n        isWritable: false\n      }];\n    } else {\n      const type = SYSTEM_INSTRUCTION_LAYOUTS.Assign;\n      data = encodeData(type, {\n        programId: toBuffer(params.programId.toBuffer())\n      });\n      keys = [{\n        pubkey: params.accountPubkey,\n        isSigner: true,\n        isWritable: true\n      }];\n    }\n    return new TransactionInstruction({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a transaction instruction that creates a new account at\n   *   an address generated with `from`, a seed, and programId\n   */\n  static createAccountWithSeed(params) {\n    const type = SYSTEM_INSTRUCTION_LAYOUTS.CreateWithSeed;\n    const data = encodeData(type, {\n      base: toBuffer(params.basePubkey.toBuffer()),\n      seed: params.seed,\n      lamports: params.lamports,\n      space: params.space,\n      programId: toBuffer(params.programId.toBuffer())\n    });\n    let keys = [{\n      pubkey: params.fromPubkey,\n      isSigner: true,\n      isWritable: true\n    }, {\n      pubkey: params.newAccountPubkey,\n      isSigner: false,\n      isWritable: true\n    }];\n    if (!params.basePubkey.equals(params.fromPubkey)) {\n      keys.push({\n        pubkey: params.basePubkey,\n        isSigner: true,\n        isWritable: false\n      });\n    }\n    return new TransactionInstruction({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a transaction that creates a new Nonce account\n   */\n  static createNonceAccount(params) {\n    const transaction = new Transaction();\n    if ('basePubkey' in params && 'seed' in params) {\n      transaction.add(SystemProgram.createAccountWithSeed({\n        fromPubkey: params.fromPubkey,\n        newAccountPubkey: params.noncePubkey,\n        basePubkey: params.basePubkey,\n        seed: params.seed,\n        lamports: params.lamports,\n        space: NONCE_ACCOUNT_LENGTH,\n        programId: this.programId\n      }));\n    } else {\n      transaction.add(SystemProgram.createAccount({\n        fromPubkey: params.fromPubkey,\n        newAccountPubkey: params.noncePubkey,\n        lamports: params.lamports,\n        space: NONCE_ACCOUNT_LENGTH,\n        programId: this.programId\n      }));\n    }\n    const initParams = {\n      noncePubkey: params.noncePubkey,\n      authorizedPubkey: params.authorizedPubkey\n    };\n    transaction.add(this.nonceInitialize(initParams));\n    return transaction;\n  }\n\n  /**\n   * Generate an instruction to initialize a Nonce account\n   */\n  static nonceInitialize(params) {\n    const type = SYSTEM_INSTRUCTION_LAYOUTS.InitializeNonceAccount;\n    const data = encodeData(type, {\n      authorized: toBuffer(params.authorizedPubkey.toBuffer())\n    });\n    const instructionData = {\n      keys: [{\n        pubkey: params.noncePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: SYSVAR_RECENT_BLOCKHASHES_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: SYSVAR_RENT_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }],\n      programId: this.programId,\n      data\n    };\n    return new TransactionInstruction(instructionData);\n  }\n\n  /**\n   * Generate an instruction to advance the nonce in a Nonce account\n   */\n  static nonceAdvance(params) {\n    const type = SYSTEM_INSTRUCTION_LAYOUTS.AdvanceNonceAccount;\n    const data = encodeData(type);\n    const instructionData = {\n      keys: [{\n        pubkey: params.noncePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: SYSVAR_RECENT_BLOCKHASHES_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: params.authorizedPubkey,\n        isSigner: true,\n        isWritable: false\n      }],\n      programId: this.programId,\n      data\n    };\n    return new TransactionInstruction(instructionData);\n  }\n\n  /**\n   * Generate a transaction instruction that withdraws lamports from a Nonce account\n   */\n  static nonceWithdraw(params) {\n    const type = SYSTEM_INSTRUCTION_LAYOUTS.WithdrawNonceAccount;\n    const data = encodeData(type, {\n      lamports: params.lamports\n    });\n    return new TransactionInstruction({\n      keys: [{\n        pubkey: params.noncePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: params.toPubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: SYSVAR_RECENT_BLOCKHASHES_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: SYSVAR_RENT_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: params.authorizedPubkey,\n        isSigner: true,\n        isWritable: false\n      }],\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a transaction instruction that authorizes a new PublicKey as the authority\n   * on a Nonce account.\n   */\n  static nonceAuthorize(params) {\n    const type = SYSTEM_INSTRUCTION_LAYOUTS.AuthorizeNonceAccount;\n    const data = encodeData(type, {\n      authorized: toBuffer(params.newAuthorizedPubkey.toBuffer())\n    });\n    return new TransactionInstruction({\n      keys: [{\n        pubkey: params.noncePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: params.authorizedPubkey,\n        isSigner: true,\n        isWritable: false\n      }],\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a transaction instruction that allocates space in an account without funding\n   */\n  static allocate(params) {\n    let data;\n    let keys;\n    if ('basePubkey' in params) {\n      const type = SYSTEM_INSTRUCTION_LAYOUTS.AllocateWithSeed;\n      data = encodeData(type, {\n        base: toBuffer(params.basePubkey.toBuffer()),\n        seed: params.seed,\n        space: params.space,\n        programId: toBuffer(params.programId.toBuffer())\n      });\n      keys = [{\n        pubkey: params.accountPubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: params.basePubkey,\n        isSigner: true,\n        isWritable: false\n      }];\n    } else {\n      const type = SYSTEM_INSTRUCTION_LAYOUTS.Allocate;\n      data = encodeData(type, {\n        space: params.space\n      });\n      keys = [{\n        pubkey: params.accountPubkey,\n        isSigner: true,\n        isWritable: true\n      }];\n    }\n    return new TransactionInstruction({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n}\nSystemProgram.programId = new PublicKey('11111111111111111111111111111111');\n\n// Keep program chunks under PACKET_DATA_SIZE, leaving enough room for the\n// rest of the Transaction fields\n//\n// TODO: replace 300 with a proper constant for the size of the other\n// Transaction fields\nconst CHUNK_SIZE = PACKET_DATA_SIZE - 300;\n\n/**\n * Program loader interface\n */\nclass Loader {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Amount of program data placed in each load Transaction\n   */\n\n  /**\n   * Minimum number of signatures required to load a program not including\n   * retries\n   *\n   * Can be used to calculate transaction fees\n   */\n  static getMinNumSignatures(dataLength) {\n    return 2 * (\n    // Every transaction requires two signatures (payer + program)\n    Math.ceil(dataLength / Loader.chunkSize) + 1 +\n    // Add one for Create transaction\n    1) // Add one for Finalize transaction\n    ;\n  }\n\n  /**\n   * Loads a generic program\n   *\n   * @param connection The connection to use\n   * @param payer System account that pays to load the program\n   * @param program Account to load the program into\n   * @param programId Public key that identifies the loader\n   * @param data Program octets\n   * @return true if program was loaded successfully, false if program was already loaded\n   */\n  static async load(connection, payer, program, programId, data) {\n    {\n      const balanceNeeded = await connection.getMinimumBalanceForRentExemption(data.length);\n\n      // Fetch program account info to check if it has already been created\n      const programInfo = await connection.getAccountInfo(program.publicKey, 'confirmed');\n      let transaction = null;\n      if (programInfo !== null) {\n        if (programInfo.executable) {\n          console.error('Program load failed, account is already executable');\n          return false;\n        }\n        if (programInfo.data.length !== data.length) {\n          transaction = transaction || new Transaction();\n          transaction.add(SystemProgram.allocate({\n            accountPubkey: program.publicKey,\n            space: data.length\n          }));\n        }\n        if (!programInfo.owner.equals(programId)) {\n          transaction = transaction || new Transaction();\n          transaction.add(SystemProgram.assign({\n            accountPubkey: program.publicKey,\n            programId\n          }));\n        }\n        if (programInfo.lamports < balanceNeeded) {\n          transaction = transaction || new Transaction();\n          transaction.add(SystemProgram.transfer({\n            fromPubkey: payer.publicKey,\n            toPubkey: program.publicKey,\n            lamports: balanceNeeded - programInfo.lamports\n          }));\n        }\n      } else {\n        transaction = new Transaction().add(SystemProgram.createAccount({\n          fromPubkey: payer.publicKey,\n          newAccountPubkey: program.publicKey,\n          lamports: balanceNeeded > 0 ? balanceNeeded : 1,\n          space: data.length,\n          programId\n        }));\n      }\n\n      // If the account is already created correctly, skip this step\n      // and proceed directly to loading instructions\n      if (transaction !== null) {\n        await sendAndConfirmTransaction(connection, transaction, [payer, program], {\n          commitment: 'confirmed'\n        });\n      }\n    }\n    const dataLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('offset'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('bytesLength'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('bytesLengthPadding'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('byte'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.offset(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32(), -8), 'bytes')]);\n    const chunkSize = Loader.chunkSize;\n    let offset = 0;\n    let array = data;\n    let transactions = [];\n    while (array.length > 0) {\n      const bytes = array.slice(0, chunkSize);\n      const data = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(chunkSize + 16);\n      dataLayout.encode({\n        instruction: 0,\n        // Load instruction\n        offset,\n        bytes: bytes,\n        bytesLength: 0,\n        bytesLengthPadding: 0\n      }, data);\n      const transaction = new Transaction().add({\n        keys: [{\n          pubkey: program.publicKey,\n          isSigner: true,\n          isWritable: true\n        }],\n        programId,\n        data\n      });\n      transactions.push(sendAndConfirmTransaction(connection, transaction, [payer, program], {\n        commitment: 'confirmed'\n      }));\n\n      // Delay between sends in an attempt to reduce rate limit errors\n      if (connection._rpcEndpoint.includes('solana.com')) {\n        const REQUESTS_PER_SECOND = 4;\n        await sleep(1000 / REQUESTS_PER_SECOND);\n      }\n      offset += chunkSize;\n      array = array.slice(chunkSize);\n    }\n    await Promise.all(transactions);\n\n    // Finalize the account loaded with program data for execution\n    {\n      const dataLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction')]);\n      const data = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(dataLayout.span);\n      dataLayout.encode({\n        instruction: 1 // Finalize instruction\n      }, data);\n      const transaction = new Transaction().add({\n        keys: [{\n          pubkey: program.publicKey,\n          isSigner: true,\n          isWritable: true\n        }, {\n          pubkey: SYSVAR_RENT_PUBKEY,\n          isSigner: false,\n          isWritable: false\n        }],\n        programId,\n        data\n      });\n      const deployCommitment = 'processed';\n      const finalizeSignature = await connection.sendTransaction(transaction, [payer, program], {\n        preflightCommitment: deployCommitment\n      });\n      const {\n        context,\n        value\n      } = await connection.confirmTransaction({\n        signature: finalizeSignature,\n        lastValidBlockHeight: transaction.lastValidBlockHeight,\n        blockhash: transaction.recentBlockhash\n      }, deployCommitment);\n      if (value.err) {\n        throw new Error(`Transaction ${finalizeSignature} failed (${JSON.stringify(value)})`);\n      }\n      // We prevent programs from being usable until the slot after their deployment.\n      // See https://github.com/solana-labs/solana/pull/29654\n      while (true // eslint-disable-line no-constant-condition\n      ) {\n        try {\n          const currentSlot = await connection.getSlot({\n            commitment: deployCommitment\n          });\n          if (currentSlot > context.slot) {\n            break;\n          }\n        } catch {\n          /* empty */\n        }\n        await new Promise(resolve => setTimeout(resolve, Math.round(MS_PER_SLOT / 2)));\n      }\n    }\n\n    // success\n    return true;\n  }\n}\nLoader.chunkSize = CHUNK_SIZE;\n\n/**\n * @deprecated Deprecated since Solana v1.17.20.\n */\nconst BPF_LOADER_PROGRAM_ID = new PublicKey('BPFLoader2111111111111111111111111111111111');\n\n/**\n * Factory class for transactions to interact with a program loader\n *\n * @deprecated Deprecated since Solana v1.17.20.\n */\nclass BpfLoader {\n  /**\n   * Minimum number of signatures required to load a program not including\n   * retries\n   *\n   * Can be used to calculate transaction fees\n   */\n  static getMinNumSignatures(dataLength) {\n    return Loader.getMinNumSignatures(dataLength);\n  }\n\n  /**\n   * Load a SBF program\n   *\n   * @param connection The connection to use\n   * @param payer Account that will pay program loading fees\n   * @param program Account to load the program into\n   * @param elf The entire ELF containing the SBF program\n   * @param loaderProgramId The program id of the BPF loader to use\n   * @return true if program was loaded successfully, false if program was already loaded\n   */\n  static load(connection, payer, program, elf, loaderProgramId) {\n    return Loader.load(connection, payer, program, loaderProgramId, elf);\n  }\n}\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nvar fastStableStringify$1;\nvar hasRequiredFastStableStringify;\n\nfunction requireFastStableStringify () {\n\tif (hasRequiredFastStableStringify) return fastStableStringify$1;\n\thasRequiredFastStableStringify = 1;\n\tvar objToString = Object.prototype.toString;\n\tvar objKeys = Object.keys || function(obj) {\n\t\t\tvar keys = [];\n\t\t\tfor (var name in obj) {\n\t\t\t\tkeys.push(name);\n\t\t\t}\n\t\t\treturn keys;\n\t\t};\n\n\tfunction stringify(val, isArrayProp) {\n\t\tvar i, max, str, keys, key, propVal, toStr;\n\t\tif (val === true) {\n\t\t\treturn \"true\";\n\t\t}\n\t\tif (val === false) {\n\t\t\treturn \"false\";\n\t\t}\n\t\tswitch (typeof val) {\n\t\t\tcase \"object\":\n\t\t\t\tif (val === null) {\n\t\t\t\t\treturn null;\n\t\t\t\t} else if (val.toJSON && typeof val.toJSON === \"function\") {\n\t\t\t\t\treturn stringify(val.toJSON(), isArrayProp);\n\t\t\t\t} else {\n\t\t\t\t\ttoStr = objToString.call(val);\n\t\t\t\t\tif (toStr === \"[object Array]\") {\n\t\t\t\t\t\tstr = '[';\n\t\t\t\t\t\tmax = val.length - 1;\n\t\t\t\t\t\tfor(i = 0; i < max; i++) {\n\t\t\t\t\t\t\tstr += stringify(val[i], true) + ',';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (max > -1) {\n\t\t\t\t\t\t\tstr += stringify(val[i], true);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn str + ']';\n\t\t\t\t\t} else if (toStr === \"[object Object]\") {\n\t\t\t\t\t\t// only object is left\n\t\t\t\t\t\tkeys = objKeys(val).sort();\n\t\t\t\t\t\tmax = keys.length;\n\t\t\t\t\t\tstr = \"\";\n\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\twhile (i < max) {\n\t\t\t\t\t\t\tkey = keys[i];\n\t\t\t\t\t\t\tpropVal = stringify(val[key], false);\n\t\t\t\t\t\t\tif (propVal !== undefined) {\n\t\t\t\t\t\t\t\tif (str) {\n\t\t\t\t\t\t\t\t\tstr += ',';\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tstr += JSON.stringify(key) + ':' + propVal;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn '{' + str + '}';\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn JSON.stringify(val);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tcase \"function\":\n\t\t\tcase \"undefined\":\n\t\t\t\treturn isArrayProp ? null : undefined;\n\t\t\tcase \"string\":\n\t\t\t\treturn JSON.stringify(val);\n\t\t\tdefault:\n\t\t\t\treturn isFinite(val) ? val : null;\n\t\t}\n\t}\n\n\tfastStableStringify$1 = function(val) {\n\t\tvar returnVal = stringify(val, false);\n\t\tif (returnVal !== undefined) {\n\t\t\treturn ''+ returnVal;\n\t\t}\n\t};\n\treturn fastStableStringify$1;\n}\n\nvar fastStableStringifyExports = /*@__PURE__*/ requireFastStableStringify();\nvar fastStableStringify = /*@__PURE__*/getDefaultExportFromCjs(fastStableStringifyExports);\n\nconst MINIMUM_SLOT_PER_EPOCH = 32;\n\n// Returns the number of trailing zeros in the binary representation of self.\nfunction trailingZeros(n) {\n  let trailingZeros = 0;\n  while (n > 1) {\n    n /= 2;\n    trailingZeros++;\n  }\n  return trailingZeros;\n}\n\n// Returns the smallest power of two greater than or equal to n\nfunction nextPowerOfTwo(n) {\n  if (n === 0) return 1;\n  n--;\n  n |= n >> 1;\n  n |= n >> 2;\n  n |= n >> 4;\n  n |= n >> 8;\n  n |= n >> 16;\n  n |= n >> 32;\n  return n + 1;\n}\n\n/**\n * Epoch schedule\n * (see https://docs.solana.com/terminology#epoch)\n * Can be retrieved with the {@link Connection.getEpochSchedule} method\n */\nclass EpochSchedule {\n  constructor(slotsPerEpoch, leaderScheduleSlotOffset, warmup, firstNormalEpoch, firstNormalSlot) {\n    /** The maximum number of slots in each epoch */\n    this.slotsPerEpoch = void 0;\n    /** The number of slots before beginning of an epoch to calculate a leader schedule for that epoch */\n    this.leaderScheduleSlotOffset = void 0;\n    /** Indicates whether epochs start short and grow */\n    this.warmup = void 0;\n    /** The first epoch with `slotsPerEpoch` slots */\n    this.firstNormalEpoch = void 0;\n    /** The first slot of `firstNormalEpoch` */\n    this.firstNormalSlot = void 0;\n    this.slotsPerEpoch = slotsPerEpoch;\n    this.leaderScheduleSlotOffset = leaderScheduleSlotOffset;\n    this.warmup = warmup;\n    this.firstNormalEpoch = firstNormalEpoch;\n    this.firstNormalSlot = firstNormalSlot;\n  }\n  getEpoch(slot) {\n    return this.getEpochAndSlotIndex(slot)[0];\n  }\n  getEpochAndSlotIndex(slot) {\n    if (slot < this.firstNormalSlot) {\n      const epoch = trailingZeros(nextPowerOfTwo(slot + MINIMUM_SLOT_PER_EPOCH + 1)) - trailingZeros(MINIMUM_SLOT_PER_EPOCH) - 1;\n      const epochLen = this.getSlotsInEpoch(epoch);\n      const slotIndex = slot - (epochLen - MINIMUM_SLOT_PER_EPOCH);\n      return [epoch, slotIndex];\n    } else {\n      const normalSlotIndex = slot - this.firstNormalSlot;\n      const normalEpochIndex = Math.floor(normalSlotIndex / this.slotsPerEpoch);\n      const epoch = this.firstNormalEpoch + normalEpochIndex;\n      const slotIndex = normalSlotIndex % this.slotsPerEpoch;\n      return [epoch, slotIndex];\n    }\n  }\n  getFirstSlotInEpoch(epoch) {\n    if (epoch <= this.firstNormalEpoch) {\n      return (Math.pow(2, epoch) - 1) * MINIMUM_SLOT_PER_EPOCH;\n    } else {\n      return (epoch - this.firstNormalEpoch) * this.slotsPerEpoch + this.firstNormalSlot;\n    }\n  }\n  getLastSlotInEpoch(epoch) {\n    return this.getFirstSlotInEpoch(epoch) + this.getSlotsInEpoch(epoch) - 1;\n  }\n  getSlotsInEpoch(epoch) {\n    if (epoch < this.firstNormalEpoch) {\n      return Math.pow(2, epoch + trailingZeros(MINIMUM_SLOT_PER_EPOCH));\n    } else {\n      return this.slotsPerEpoch;\n    }\n  }\n}\n\nvar fetchImpl = globalThis.fetch;\n\nclass RpcWebSocketClient extends rpc_websockets__WEBPACK_IMPORTED_MODULE_6__.CommonClient {\n  constructor(address, options, generate_request_id) {\n    const webSocketFactory = url => {\n      const rpc = (0,rpc_websockets__WEBPACK_IMPORTED_MODULE_6__.WebSocket)(url, {\n        autoconnect: true,\n        max_reconnects: 5,\n        reconnect: true,\n        reconnect_interval: 1000,\n        ...options\n      });\n      if ('socket' in rpc) {\n        this.underlyingSocket = rpc.socket;\n      } else {\n        this.underlyingSocket = rpc;\n      }\n      return rpc;\n    };\n    super(webSocketFactory, address, options, generate_request_id);\n    this.underlyingSocket = void 0;\n  }\n  call(...args) {\n    const readyState = this.underlyingSocket?.readyState;\n    if (readyState === 1 /* WebSocket.OPEN */) {\n      return super.call(...args);\n    }\n    return Promise.reject(new Error('Tried to call a JSON-RPC method `' + args[0] + '` but the socket was not `CONNECTING` or `OPEN` (`readyState` was ' + readyState + ')'));\n  }\n  notify(...args) {\n    const readyState = this.underlyingSocket?.readyState;\n    if (readyState === 1 /* WebSocket.OPEN */) {\n      return super.notify(...args);\n    }\n    return Promise.reject(new Error('Tried to send a JSON-RPC notification `' + args[0] + '` but the socket was not `CONNECTING` or `OPEN` (`readyState` was ' + readyState + ')'));\n  }\n}\n\n/**\n * @internal\n */\n\n/**\n * Decode account data buffer using an AccountType\n * @internal\n */\nfunction decodeData(type, data) {\n  let decoded;\n  try {\n    decoded = type.layout.decode(data);\n  } catch (err) {\n    throw new Error('invalid instruction; ' + err);\n  }\n  if (decoded.typeIndex !== type.index) {\n    throw new Error(`invalid account data; account type mismatch ${decoded.typeIndex} != ${type.index}`);\n  }\n  return decoded;\n}\n\n/// The serialized size of lookup table metadata\nconst LOOKUP_TABLE_META_SIZE = 56;\nclass AddressLookupTableAccount {\n  constructor(args) {\n    this.key = void 0;\n    this.state = void 0;\n    this.key = args.key;\n    this.state = args.state;\n  }\n  isActive() {\n    const U64_MAX = BigInt('0xffffffffffffffff');\n    return this.state.deactivationSlot === U64_MAX;\n  }\n  static deserialize(accountData) {\n    const meta = decodeData(LookupTableMetaLayout, accountData);\n    const serializedAddressesLen = accountData.length - LOOKUP_TABLE_META_SIZE;\n    assert(serializedAddressesLen >= 0, 'lookup table is invalid');\n    assert(serializedAddressesLen % 32 === 0, 'lookup table is invalid');\n    const numSerializedAddresses = serializedAddressesLen / 32;\n    const {\n      addresses\n    } = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(publicKey(), numSerializedAddresses, 'addresses')]).decode(accountData.slice(LOOKUP_TABLE_META_SIZE));\n    return {\n      deactivationSlot: meta.deactivationSlot,\n      lastExtendedSlot: meta.lastExtendedSlot,\n      lastExtendedSlotStartIndex: meta.lastExtendedStartIndex,\n      authority: meta.authority.length !== 0 ? new PublicKey(meta.authority[0]) : undefined,\n      addresses: addresses.map(address => new PublicKey(address))\n    };\n  }\n}\nconst LookupTableMetaLayout = {\n  index: 1,\n  layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('typeIndex'), u64('deactivationSlot'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('lastExtendedSlot'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('lastExtendedStartIndex'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8(),\n  // option\n  _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(publicKey(), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.offset(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8(), -1), 'authority')])\n};\n\nconst URL_RE = /^[^:]+:\\/\\/([^:[]+|\\[[^\\]]+\\])(:\\d+)?(.*)/i;\nfunction makeWebsocketUrl(endpoint) {\n  const matches = endpoint.match(URL_RE);\n  if (matches == null) {\n    throw TypeError(`Failed to validate endpoint URL \\`${endpoint}\\``);\n  }\n  const [_,\n  // eslint-disable-line @typescript-eslint/no-unused-vars\n  hostish, portWithColon, rest] = matches;\n  const protocol = endpoint.startsWith('https:') ? 'wss:' : 'ws:';\n  const startPort = portWithColon == null ? null : parseInt(portWithColon.slice(1), 10);\n  const websocketPort =\n  // Only shift the port by +1 as a convention for ws(s) only if given endpoint\n  // is explicitly specifying the endpoint port (HTTP-based RPC), assuming\n  // we're directly trying to connect to agave-validator's ws listening port.\n  // When the endpoint omits the port, we're connecting to the protocol\n  // default ports: http(80) or https(443) and it's assumed we're behind a reverse\n  // proxy which manages WebSocket upgrade and backend port redirection.\n  startPort == null ? '' : `:${startPort + 1}`;\n  return `${protocol}//${hostish}${websocketPort}${rest}`;\n}\n\nconst PublicKeyFromString = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.coerce)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.instance)(PublicKey), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(), value => new PublicKey(value));\nconst RawAccountDataResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.tuple)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('base64')]);\nconst BufferFromRawAccountData = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.coerce)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.instance)(buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer), RawAccountDataResult, value => buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(value[0], 'base64'));\n\n/**\n * Attempt to use a recent blockhash for up to 30 seconds\n * @internal\n */\nconst BLOCKHASH_CACHE_TIMEOUT_MS = 30 * 1000;\n\n/**\n * HACK.\n * Copied from rpc-websockets/dist/lib/client.\n * Otherwise, `yarn build` fails with:\n * https://gist.github.com/steveluscher/c057eca81d479ef705cdb53162f9971d\n */\n\n/** @internal */\n/** @internal */\n/** @internal */\n/** @internal */\n\n/** @internal */\n/**\n * @internal\n * Every subscription contains the args used to open the subscription with\n * the server, and a list of callers interested in notifications.\n */\n\n/**\n * @internal\n * A subscription may be in various states of connectedness. Only when it is\n * fully connected will it have a server subscription id associated with it.\n * This id can be returned to the server to unsubscribe the client entirely.\n */\n\n/**\n * A type that encapsulates a subscription's RPC method\n * names and notification (callback) signature.\n */\n\n/**\n * @internal\n * Utility type that keeps tagged unions intact while omitting properties.\n */\n\n/**\n * @internal\n * This type represents a single subscribable 'topic.' It's made up of:\n *\n * - The args used to open the subscription with the server,\n * - The state of the subscription, in terms of its connectedness, and\n * - The set of callbacks to call when the server publishes notifications\n *\n * This record gets indexed by `SubscriptionConfigHash` and is used to\n * set up subscriptions, fan out notifications, and track subscription state.\n */\n\n/**\n * @internal\n */\n\n/**\n * Extra contextual information for RPC responses\n */\n\n/**\n * Options for sending transactions\n */\n\n/**\n * Options for confirming transactions\n */\n\n/**\n * Options for getConfirmedSignaturesForAddress2\n */\n\n/**\n * Options for getSignaturesForAddress\n */\n\n/**\n * RPC Response with extra contextual information\n */\n\n/**\n * A strategy for confirming transactions that uses the last valid\n * block height for a given blockhash to check for transaction expiration.\n */\n\n/**\n * A strategy for confirming durable nonce transactions.\n */\n\n/**\n * Properties shared by all transaction confirmation strategies\n */\n\n/**\n * This type represents all transaction confirmation strategies\n */\n\n/* @internal */\nfunction assertEndpointUrl(putativeUrl) {\n  if (/^https?:/.test(putativeUrl) === false) {\n    throw new TypeError('Endpoint URL must start with `http:` or `https:`.');\n  }\n  return putativeUrl;\n}\n\n/** @internal */\nfunction extractCommitmentFromConfig(commitmentOrConfig) {\n  let commitment;\n  let config;\n  if (typeof commitmentOrConfig === 'string') {\n    commitment = commitmentOrConfig;\n  } else if (commitmentOrConfig) {\n    const {\n      commitment: specifiedCommitment,\n      ...specifiedConfig\n    } = commitmentOrConfig;\n    commitment = specifiedCommitment;\n    config = specifiedConfig;\n  }\n  return {\n    commitment,\n    config\n  };\n}\n\n/**\n * @internal\n */\nfunction applyDefaultMemcmpEncodingToFilters(filters) {\n  return filters.map(filter => 'memcmp' in filter ? {\n    ...filter,\n    memcmp: {\n      ...filter.memcmp,\n      encoding: filter.memcmp.encoding ?? 'base58'\n    }\n  } : filter);\n}\n\n/**\n * @internal\n */\nfunction createRpcResult(result) {\n  return (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    jsonrpc: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('2.0'),\n    id: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n    result\n  }), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    jsonrpc: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('2.0'),\n    id: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n    error: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n      code: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.unknown)(),\n      message: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n      data: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.any)())\n    })\n  })]);\n}\nconst UnknownRpcResult = createRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.unknown)());\n\n/**\n * @internal\n */\nfunction jsonRpcResult(schema) {\n  return (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.coerce)(createRpcResult(schema), UnknownRpcResult, value => {\n    if ('error' in value) {\n      return value;\n    } else {\n      return {\n        ...value,\n        result: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(value.result, schema)\n      };\n    }\n  });\n}\n\n/**\n * @internal\n */\nfunction jsonRpcResultAndContext(value) {\n  return jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    context: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n      slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n    }),\n    value\n  }));\n}\n\n/**\n * @internal\n */\nfunction notificationResultAndContext(value) {\n  return (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    context: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n      slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n    }),\n    value\n  });\n}\n\n/**\n * @internal\n */\nfunction versionedMessageFromResponse(version, response) {\n  if (version === 0) {\n    return new MessageV0({\n      header: response.header,\n      staticAccountKeys: response.accountKeys.map(accountKey => new PublicKey(accountKey)),\n      recentBlockhash: response.recentBlockhash,\n      compiledInstructions: response.instructions.map(ix => ({\n        programIdIndex: ix.programIdIndex,\n        accountKeyIndexes: ix.accounts,\n        data: bs58__WEBPACK_IMPORTED_MODULE_2___default().decode(ix.data)\n      })),\n      addressTableLookups: response.addressTableLookups\n    });\n  } else {\n    return new Message(response);\n  }\n}\n\n/**\n * The level of commitment desired when querying state\n * <pre>\n *   'processed': Query the most recent block which has reached 1 confirmation by the connected node\n *   'confirmed': Query the most recent block which has reached 1 confirmation by the cluster\n *   'finalized': Query the most recent block which has been finalized by the cluster\n * </pre>\n */\n\n// Deprecated as of v1.5.5\n\n/**\n * A subset of Commitment levels, which are at least optimistically confirmed\n * <pre>\n *   'confirmed': Query the most recent block which has reached 1 confirmation by the cluster\n *   'finalized': Query the most recent block which has been finalized by the cluster\n * </pre>\n */\n\n/**\n * Filter for largest accounts query\n * <pre>\n *   'circulating':    Return the largest accounts that are part of the circulating supply\n *   'nonCirculating': Return the largest accounts that are not part of the circulating supply\n * </pre>\n */\n\n/**\n * Configuration object for changing `getAccountInfo` query behavior\n */\n\n/**\n * Configuration object for changing `getBalance` query behavior\n */\n\n/**\n * Configuration object for changing `getBlock` query behavior\n */\n\n/**\n * Configuration object for changing `getBlock` query behavior\n */\n\n/**\n * Configuration object for changing `getStakeMinimumDelegation` query behavior\n */\n\n/**\n * Configuration object for changing `getBlockHeight` query behavior\n */\n\n/**\n * Configuration object for changing `getEpochInfo` query behavior\n */\n\n/**\n * Configuration object for changing `getInflationReward` query behavior\n */\n\n/**\n * Configuration object for changing `getLatestBlockhash` query behavior\n */\n\n/**\n * Configuration object for changing `isBlockhashValid` query behavior\n */\n\n/**\n * Configuration object for changing `getSlot` query behavior\n */\n\n/**\n * Configuration object for changing `getSlotLeader` query behavior\n */\n\n/**\n * Configuration object for changing `getTransaction` query behavior\n */\n\n/**\n * Configuration object for changing `getTransaction` query behavior\n */\n\n/**\n * Configuration object for changing `getLargestAccounts` query behavior\n */\n\n/**\n * Configuration object for changing `getSupply` request behavior\n */\n\n/**\n * Configuration object for changing query behavior\n */\n\n/**\n * Information describing a cluster node\n */\n\n/**\n * Information describing a vote account\n */\n\n/**\n * A collection of cluster vote accounts\n */\n\n/**\n * Network Inflation\n * (see https://docs.solana.com/implemented-proposals/ed_overview)\n */\n\nconst GetInflationGovernorResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  foundation: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  foundationTerm: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  initial: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  taper: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  terminal: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\n\n/**\n * The inflation reward for an epoch\n */\n\n/**\n * Expected JSON RPC response for the \"getInflationReward\" message\n */\nconst GetInflationRewardResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  epoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  effectiveSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  amount: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  postBalance: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  commission: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()))\n}))));\n\n/**\n * Configuration object for changing `getRecentPrioritizationFees` query behavior\n */\n\n/**\n * Expected JSON RPC response for the \"getRecentPrioritizationFees\" message\n */\nconst GetRecentPrioritizationFeesResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  prioritizationFee: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n}));\n/**\n * Expected JSON RPC response for the \"getInflationRate\" message\n */\nconst GetInflationRateResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  total: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  validator: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  foundation: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  epoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\n\n/**\n * Information about the current epoch\n */\n\nconst GetEpochInfoResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  epoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  slotIndex: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  slotsInEpoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  absoluteSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  blockHeight: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  transactionCount: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n});\nconst GetEpochScheduleResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  slotsPerEpoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  leaderScheduleSlotOffset: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  warmup: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.boolean)(),\n  firstNormalEpoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  firstNormalSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\n\n/**\n * Leader schedule\n * (see https://docs.solana.com/terminology#leader-schedule)\n */\n\nconst GetLeaderScheduleResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.record)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()));\n\n/**\n * Transaction error or null\n */\nconst TransactionErrorResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({}), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()]));\n\n/**\n * Signature status for a transaction\n */\nconst SignatureStatusResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  err: TransactionErrorResult\n});\n\n/**\n * Transaction signature received notification\n */\nconst SignatureReceivedResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('receivedSignature');\n\n/**\n * Version info for a node\n */\n\nconst VersionResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  'solana-core': (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  'feature-set': (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n});\nconst ParsedInstructionStruct = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  program: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  programId: PublicKeyFromString,\n  parsed: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.unknown)()\n});\nconst PartiallyDecodedInstructionStruct = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  programId: PublicKeyFromString,\n  accounts: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(PublicKeyFromString),\n  data: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()\n});\nconst SimulatedTransactionResponseStruct = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  err: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({}), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()])),\n  logs: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)())),\n  accounts: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    executable: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.boolean)(),\n    owner: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n    lamports: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n    data: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n    rentEpoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n  }))))),\n  unitsConsumed: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  returnData: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    programId: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n    data: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.tuple)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('base64')])\n  }))),\n  innerInstructions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    index: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n    instructions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([ParsedInstructionStruct, PartiallyDecodedInstructionStruct]))\n  }))))\n}));\n\n/**\n * Metadata for a parsed confirmed transaction on the ledger\n *\n * @deprecated Deprecated since RPC v1.8.0. Please use {@link ParsedTransactionMeta} instead.\n */\n\n/**\n * Collection of addresses loaded by a transaction using address table lookups\n */\n\n/**\n * Metadata for a parsed transaction on the ledger\n */\n\n/**\n * Metadata for a confirmed transaction on the ledger\n */\n\n/**\n * A processed transaction from the RPC API\n */\n\n/**\n * A processed transaction from the RPC API\n */\n\n/**\n * A processed transaction message from the RPC API\n */\n\n/**\n * A confirmed transaction on the ledger\n *\n * @deprecated Deprecated since RPC v1.8.0.\n */\n\n/**\n * A partially decoded transaction instruction\n */\n\n/**\n * A parsed transaction message account\n */\n\n/**\n * A parsed transaction instruction\n */\n\n/**\n * A parsed address table lookup\n */\n\n/**\n * A parsed transaction message\n */\n\n/**\n * A parsed transaction\n */\n\n/**\n * A parsed and confirmed transaction on the ledger\n *\n * @deprecated Deprecated since RPC v1.8.0. Please use {@link ParsedTransactionWithMeta} instead.\n */\n\n/**\n * A parsed transaction on the ledger with meta\n */\n\n/**\n * A processed block fetched from the RPC API\n */\n\n/**\n * A processed block fetched from the RPC API where the `transactionDetails` mode is `accounts`\n */\n\n/**\n * A processed block fetched from the RPC API where the `transactionDetails` mode is `none`\n */\n\n/**\n * A block with parsed transactions\n */\n\n/**\n * A block with parsed transactions where the `transactionDetails` mode is `accounts`\n */\n\n/**\n * A block with parsed transactions where the `transactionDetails` mode is `none`\n */\n\n/**\n * A processed block fetched from the RPC API\n */\n\n/**\n * A processed block fetched from the RPC API where the `transactionDetails` mode is `accounts`\n */\n\n/**\n * A processed block fetched from the RPC API where the `transactionDetails` mode is `none`\n */\n\n/**\n * A confirmed block on the ledger\n *\n * @deprecated Deprecated since RPC v1.8.0.\n */\n\n/**\n * A Block on the ledger with signatures only\n */\n\n/**\n * recent block production information\n */\n\n/**\n * Expected JSON RPC response for the \"getBlockProduction\" message\n */\nconst BlockProductionResponseStruct = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  byIdentity: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.record)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())),\n  range: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    firstSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n    lastSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n  })\n}));\n\n/**\n * A performance sample\n */\n\nfunction createRpcClient(url, httpHeaders, customFetch, fetchMiddleware, disableRetryOnRateLimit, httpAgent) {\n  const fetch = customFetch ? customFetch : fetchImpl;\n  let agent;\n  {\n    if (httpAgent != null) {\n      console.warn('You have supplied an `httpAgent` when creating a `Connection` in a browser environment.' + 'It has been ignored; `httpAgent` is only used in Node environments.');\n    }\n  }\n  let fetchWithMiddleware;\n  if (fetchMiddleware) {\n    fetchWithMiddleware = async (info, init) => {\n      const modifiedFetchArgs = await new Promise((resolve, reject) => {\n        try {\n          fetchMiddleware(info, init, (modifiedInfo, modifiedInit) => resolve([modifiedInfo, modifiedInit]));\n        } catch (error) {\n          reject(error);\n        }\n      });\n      return await fetch(...modifiedFetchArgs);\n    };\n  }\n  const clientBrowser = new (jayson_lib_client_browser__WEBPACK_IMPORTED_MODULE_5___default())(async (request, callback) => {\n    const options = {\n      method: 'POST',\n      body: request,\n      agent,\n      headers: Object.assign({\n        'Content-Type': 'application/json'\n      }, httpHeaders || {}, COMMON_HTTP_HEADERS)\n    };\n    try {\n      let too_many_requests_retries = 5;\n      let res;\n      let waitTime = 500;\n      for (;;) {\n        if (fetchWithMiddleware) {\n          res = await fetchWithMiddleware(url, options);\n        } else {\n          res = await fetch(url, options);\n        }\n        if (res.status !== 429 /* Too many requests */) {\n          break;\n        }\n        if (disableRetryOnRateLimit === true) {\n          break;\n        }\n        too_many_requests_retries -= 1;\n        if (too_many_requests_retries === 0) {\n          break;\n        }\n        console.error(`Server responded with ${res.status} ${res.statusText}.  Retrying after ${waitTime}ms delay...`);\n        await sleep(waitTime);\n        waitTime *= 2;\n      }\n      const text = await res.text();\n      if (res.ok) {\n        callback(null, text);\n      } else {\n        callback(new Error(`${res.status} ${res.statusText}: ${text}`));\n      }\n    } catch (err) {\n      if (err instanceof Error) callback(err);\n    }\n  }, {});\n  return clientBrowser;\n}\nfunction createRpcRequest(client) {\n  return (method, args) => {\n    return new Promise((resolve, reject) => {\n      client.request(method, args, (err, response) => {\n        if (err) {\n          reject(err);\n          return;\n        }\n        resolve(response);\n      });\n    });\n  };\n}\nfunction createRpcBatchRequest(client) {\n  return requests => {\n    return new Promise((resolve, reject) => {\n      // Do nothing if requests is empty\n      if (requests.length === 0) resolve([]);\n      const batch = requests.map(params => {\n        return client.request(params.methodName, params.args);\n      });\n      client.request(batch, (err, response) => {\n        if (err) {\n          reject(err);\n          return;\n        }\n        resolve(response);\n      });\n    });\n  };\n}\n\n/**\n * Expected JSON RPC response for the \"getInflationGovernor\" message\n */\nconst GetInflationGovernorRpcResult = jsonRpcResult(GetInflationGovernorResult);\n\n/**\n * Expected JSON RPC response for the \"getInflationRate\" message\n */\nconst GetInflationRateRpcResult = jsonRpcResult(GetInflationRateResult);\n\n/**\n * Expected JSON RPC response for the \"getRecentPrioritizationFees\" message\n */\nconst GetRecentPrioritizationFeesRpcResult = jsonRpcResult(GetRecentPrioritizationFeesResult);\n\n/**\n * Expected JSON RPC response for the \"getEpochInfo\" message\n */\nconst GetEpochInfoRpcResult = jsonRpcResult(GetEpochInfoResult);\n\n/**\n * Expected JSON RPC response for the \"getEpochSchedule\" message\n */\nconst GetEpochScheduleRpcResult = jsonRpcResult(GetEpochScheduleResult);\n\n/**\n * Expected JSON RPC response for the \"getLeaderSchedule\" message\n */\nconst GetLeaderScheduleRpcResult = jsonRpcResult(GetLeaderScheduleResult);\n\n/**\n * Expected JSON RPC response for the \"minimumLedgerSlot\" and \"getFirstAvailableBlock\" messages\n */\nconst SlotRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)());\n\n/**\n * Supply\n */\n\n/**\n * Expected JSON RPC response for the \"getSupply\" message\n */\nconst GetSupplyRpcResult = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  total: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  circulating: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  nonCirculating: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  nonCirculatingAccounts: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(PublicKeyFromString)\n}));\n\n/**\n * Token amount object which returns a token amount in different formats\n * for various client use cases.\n */\n\n/**\n * Expected JSON RPC structure for token amounts\n */\nconst TokenAmountResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  amount: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  uiAmount: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  decimals: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  uiAmountString: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)())\n});\n\n/**\n * Token address and balance.\n */\n\n/**\n * Expected JSON RPC response for the \"getTokenLargestAccounts\" message\n */\nconst GetTokenLargestAccountsResult = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  address: PublicKeyFromString,\n  amount: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  uiAmount: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  decimals: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  uiAmountString: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)())\n})));\n\n/**\n * Expected JSON RPC response for the \"getTokenAccountsByOwner\" message\n */\nconst GetTokenAccountsByOwner = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  pubkey: PublicKeyFromString,\n  account: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    executable: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.boolean)(),\n    owner: PublicKeyFromString,\n    lamports: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n    data: BufferFromRawAccountData,\n    rentEpoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n  })\n})));\nconst ParsedAccountDataResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  program: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  parsed: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.unknown)(),\n  space: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\n\n/**\n * Expected JSON RPC response for the \"getTokenAccountsByOwner\" message with parsed data\n */\nconst GetParsedTokenAccountsByOwner = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  pubkey: PublicKeyFromString,\n  account: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    executable: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.boolean)(),\n    owner: PublicKeyFromString,\n    lamports: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n    data: ParsedAccountDataResult,\n    rentEpoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n  })\n})));\n\n/**\n * Pair of an account address and its balance\n */\n\n/**\n * Expected JSON RPC response for the \"getLargestAccounts\" message\n */\nconst GetLargestAccountsRpcResult = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  lamports: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  address: PublicKeyFromString\n})));\n\n/**\n * @internal\n */\nconst AccountInfoResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  executable: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.boolean)(),\n  owner: PublicKeyFromString,\n  lamports: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  data: BufferFromRawAccountData,\n  rentEpoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\n\n/**\n * @internal\n */\nconst KeyedAccountInfoResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  pubkey: PublicKeyFromString,\n  account: AccountInfoResult\n});\nconst ParsedOrRawAccountData = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.coerce)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.instance)(buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer), ParsedAccountDataResult]), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([RawAccountDataResult, ParsedAccountDataResult]), value => {\n  if (Array.isArray(value)) {\n    return (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(value, BufferFromRawAccountData);\n  } else {\n    return value;\n  }\n});\n\n/**\n * @internal\n */\nconst ParsedAccountInfoResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  executable: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.boolean)(),\n  owner: PublicKeyFromString,\n  lamports: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  data: ParsedOrRawAccountData,\n  rentEpoch: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\nconst KeyedParsedAccountInfoResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  pubkey: PublicKeyFromString,\n  account: ParsedAccountInfoResult\n});\n\n/**\n * @internal\n */\nconst StakeActivationResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  state: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('active'), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('inactive'), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('activating'), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('deactivating')]),\n  active: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  inactive: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\n\n/**\n * Expected JSON RPC response for the \"getConfirmedSignaturesForAddress2\" message\n */\n\nconst GetConfirmedSignaturesForAddress2RpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  signature: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  err: TransactionErrorResult,\n  memo: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()))\n})));\n\n/**\n * Expected JSON RPC response for the \"getSignaturesForAddress\" message\n */\nconst GetSignaturesForAddressRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  signature: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  err: TransactionErrorResult,\n  memo: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()))\n})));\n\n/***\n * Expected JSON RPC response for the \"accountNotification\" message\n */\nconst AccountNotificationResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  subscription: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  result: notificationResultAndContext(AccountInfoResult)\n});\n\n/**\n * @internal\n */\nconst ProgramAccountInfoResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  pubkey: PublicKeyFromString,\n  account: AccountInfoResult\n});\n\n/***\n * Expected JSON RPC response for the \"programNotification\" message\n */\nconst ProgramAccountNotificationResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  subscription: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  result: notificationResultAndContext(ProgramAccountInfoResult)\n});\n\n/**\n * @internal\n */\nconst SlotInfoResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  parent: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  root: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\n\n/**\n * Expected JSON RPC response for the \"slotNotification\" message\n */\nconst SlotNotificationResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  subscription: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  result: SlotInfoResult\n});\n\n/**\n * Slot updates which can be used for tracking the live progress of a cluster.\n * - `\"firstShredReceived\"`: connected node received the first shred of a block.\n * Indicates that a new block that is being produced.\n * - `\"completed\"`: connected node has received all shreds of a block. Indicates\n * a block was recently produced.\n * - `\"optimisticConfirmation\"`: block was optimistically confirmed by the\n * cluster. It is not guaranteed that an optimistic confirmation notification\n * will be sent for every finalized blocks.\n * - `\"root\"`: the connected node rooted this block.\n * - `\"createdBank\"`: the connected node has started validating this block.\n * - `\"frozen\"`: the connected node has validated this block.\n * - `\"dead\"`: the connected node failed to validate this block.\n */\n\n/**\n * @internal\n */\nconst SlotUpdateResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  type: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('firstShredReceived'), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('completed'), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('optimisticConfirmation'), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('root')]),\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  timestamp: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n}), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  type: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('createdBank'),\n  parent: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  timestamp: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n}), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  type: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('frozen'),\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  timestamp: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  stats: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    numTransactionEntries: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n    numSuccessfulTransactions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n    numFailedTransactions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n    maxTransactionsPerEntry: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n  })\n}), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  type: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('dead'),\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  timestamp: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  err: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()\n})]);\n\n/**\n * Expected JSON RPC response for the \"slotsUpdatesNotification\" message\n */\nconst SlotUpdateNotificationResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  subscription: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  result: SlotUpdateResult\n});\n\n/**\n * Expected JSON RPC response for the \"signatureNotification\" message\n */\nconst SignatureNotificationResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  subscription: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  result: notificationResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([SignatureStatusResult, SignatureReceivedResult]))\n});\n\n/**\n * Expected JSON RPC response for the \"rootNotification\" message\n */\nconst RootNotificationResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  subscription: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  result: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\nconst ContactInfoResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  pubkey: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  gossip: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  tpu: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  rpc: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  version: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)())\n});\nconst VoteAccountInfoResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  votePubkey: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  nodePubkey: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  activatedStake: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  epochVoteAccount: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.boolean)(),\n  epochCredits: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.tuple)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()])),\n  commission: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  lastVote: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  rootSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n});\n\n/**\n * Expected JSON RPC response for the \"getVoteAccounts\" message\n */\nconst GetVoteAccounts = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  current: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(VoteAccountInfoResult),\n  delinquent: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(VoteAccountInfoResult)\n}));\nconst ConfirmationStatus = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('processed'), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('confirmed'), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('finalized')]);\nconst SignatureStatusResponse = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  confirmations: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  err: TransactionErrorResult,\n  confirmationStatus: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)(ConfirmationStatus)\n});\n\n/**\n * Expected JSON RPC response for the \"getSignatureStatuses\" message\n */\nconst GetSignatureStatusesRpcResult = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(SignatureStatusResponse)));\n\n/**\n * Expected JSON RPC response for the \"getMinimumBalanceForRentExemption\" message\n */\nconst GetMinimumBalanceForRentExemptionRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)());\nconst AddressTableLookupStruct = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  accountKey: PublicKeyFromString,\n  writableIndexes: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  readonlyIndexes: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n});\nconst ConfirmedTransactionResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  signatures: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  message: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    accountKeys: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n    header: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n      numRequiredSignatures: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n      numReadonlySignedAccounts: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n      numReadonlyUnsignedAccounts: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n    }),\n    instructions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n      accounts: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n      data: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n      programIdIndex: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n    })),\n    recentBlockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n    addressTableLookups: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(AddressTableLookupStruct))\n  })\n});\nconst AnnotatedAccountKey = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  pubkey: PublicKeyFromString,\n  signer: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.boolean)(),\n  writable: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.boolean)(),\n  source: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('transaction'), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('lookupTable')]))\n});\nconst ConfirmedTransactionAccountsModeResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  accountKeys: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(AnnotatedAccountKey),\n  signatures: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)())\n});\nconst ParsedInstructionResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  parsed: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.unknown)(),\n  program: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  programId: PublicKeyFromString\n});\nconst RawInstructionResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  accounts: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(PublicKeyFromString),\n  data: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  programId: PublicKeyFromString\n});\nconst InstructionResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([RawInstructionResult, ParsedInstructionResult]);\nconst UnknownInstructionResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  parsed: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.unknown)(),\n  program: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  programId: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()\n}), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  accounts: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  data: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  programId: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()\n})]);\nconst ParsedOrRawInstruction = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.coerce)(InstructionResult, UnknownInstructionResult, value => {\n  if ('accounts' in value) {\n    return (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(value, RawInstructionResult);\n  } else {\n    return (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(value, ParsedInstructionResult);\n  }\n});\n\n/**\n * @internal\n */\nconst ParsedConfirmedTransactionResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  signatures: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  message: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    accountKeys: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(AnnotatedAccountKey),\n    instructions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(ParsedOrRawInstruction),\n    recentBlockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n    addressTableLookups: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(AddressTableLookupStruct)))\n  })\n});\nconst TokenBalanceResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  accountIndex: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  mint: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  owner: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  programId: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  uiTokenAmount: TokenAmountResult\n});\nconst LoadedAddressesResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  writable: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(PublicKeyFromString),\n  readonly: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(PublicKeyFromString)\n});\n\n/**\n * @internal\n */\nconst ConfirmedTransactionMetaResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  err: TransactionErrorResult,\n  fee: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  innerInstructions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    index: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n    instructions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n      accounts: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n      data: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n      programIdIndex: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n    }))\n  })))),\n  preBalances: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  postBalances: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  logMessages: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()))),\n  preTokenBalances: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(TokenBalanceResult))),\n  postTokenBalances: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(TokenBalanceResult))),\n  loadedAddresses: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)(LoadedAddressesResult),\n  computeUnitsConsumed: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  costUnits: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n});\n\n/**\n * @internal\n */\nconst ParsedConfirmedTransactionMetaResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  err: TransactionErrorResult,\n  fee: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  innerInstructions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    index: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n    instructions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(ParsedOrRawInstruction)\n  })))),\n  preBalances: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  postBalances: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  logMessages: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()))),\n  preTokenBalances: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(TokenBalanceResult))),\n  postTokenBalances: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(TokenBalanceResult))),\n  loadedAddresses: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)(LoadedAddressesResult),\n  computeUnitsConsumed: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  costUnits: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n});\nconst TransactionVersionStruct = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.union)([(0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)(0), (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.literal)('legacy')]);\n\n/** @internal */\nconst RewardsResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  pubkey: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  lamports: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  postBalance: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  rewardType: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  commission: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()))\n});\n\n/**\n * Expected JSON RPC response for the \"getBlock\" message\n */\nconst GetBlockRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  blockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  previousBlockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  parentSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  transactions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    transaction: ConfirmedTransactionResult,\n    meta: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(ConfirmedTransactionMetaResult),\n    version: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)(TransactionVersionStruct)\n  })),\n  rewards: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(RewardsResult)),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  blockHeight: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n})));\n\n/**\n * Expected JSON RPC response for the \"getBlock\" message when `transactionDetails` is `none`\n */\nconst GetNoneModeBlockRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  blockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  previousBlockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  parentSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  rewards: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(RewardsResult)),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  blockHeight: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n})));\n\n/**\n * Expected JSON RPC response for the \"getBlock\" message when `transactionDetails` is `accounts`\n */\nconst GetAccountsModeBlockRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  blockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  previousBlockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  parentSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  transactions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    transaction: ConfirmedTransactionAccountsModeResult,\n    meta: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(ConfirmedTransactionMetaResult),\n    version: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)(TransactionVersionStruct)\n  })),\n  rewards: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(RewardsResult)),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  blockHeight: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n})));\n\n/**\n * Expected parsed JSON RPC response for the \"getBlock\" message\n */\nconst GetParsedBlockRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  blockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  previousBlockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  parentSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  transactions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    transaction: ParsedConfirmedTransactionResult,\n    meta: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(ParsedConfirmedTransactionMetaResult),\n    version: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)(TransactionVersionStruct)\n  })),\n  rewards: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(RewardsResult)),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  blockHeight: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n})));\n\n/**\n * Expected parsed JSON RPC response for the \"getBlock\" message  when `transactionDetails` is `accounts`\n */\nconst GetParsedAccountsModeBlockRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  blockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  previousBlockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  parentSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  transactions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    transaction: ConfirmedTransactionAccountsModeResult,\n    meta: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(ParsedConfirmedTransactionMetaResult),\n    version: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)(TransactionVersionStruct)\n  })),\n  rewards: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(RewardsResult)),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  blockHeight: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n})));\n\n/**\n * Expected parsed JSON RPC response for the \"getBlock\" message  when `transactionDetails` is `none`\n */\nconst GetParsedNoneModeBlockRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  blockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  previousBlockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  parentSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  rewards: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(RewardsResult)),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()),\n  blockHeight: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n})));\n\n/**\n * Expected JSON RPC response for the \"getConfirmedBlock\" message\n *\n * @deprecated Deprecated since RPC v1.8.0. Please use {@link GetBlockRpcResult} instead.\n */\nconst GetConfirmedBlockRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  blockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  previousBlockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  parentSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  transactions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    transaction: ConfirmedTransactionResult,\n    meta: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(ConfirmedTransactionMetaResult)\n  })),\n  rewards: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(RewardsResult)),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n})));\n\n/**\n * Expected JSON RPC response for the \"getBlock\" message\n */\nconst GetBlockSignaturesRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  blockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  previousBlockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  parentSlot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  signatures: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())\n})));\n\n/**\n * Expected JSON RPC response for the \"getTransaction\" message\n */\nconst GetTransactionRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  meta: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(ConfirmedTransactionMetaResult),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())),\n  transaction: ConfirmedTransactionResult,\n  version: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)(TransactionVersionStruct)\n})));\n\n/**\n * Expected parsed JSON RPC response for the \"getTransaction\" message\n */\nconst GetParsedTransactionRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  transaction: ParsedConfirmedTransactionResult,\n  meta: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(ParsedConfirmedTransactionMetaResult),\n  blockTime: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())),\n  version: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)(TransactionVersionStruct)\n})));\n\n/**\n * Expected JSON RPC response for the \"getLatestBlockhash\" message\n */\nconst GetLatestBlockhashRpcResult = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  blockhash: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  lastValidBlockHeight: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n}));\n\n/**\n * Expected JSON RPC response for the \"isBlockhashValid\" message\n */\nconst IsBlockhashValidRpcResult = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.boolean)());\nconst PerfSampleResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  slot: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  numTransactions: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  numSlots: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)(),\n  samplePeriodSecs: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\n\n/*\n * Expected JSON RPC response for \"getRecentPerformanceSamples\" message\n */\nconst GetRecentPerformanceSamplesRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(PerfSampleResult));\n\n/**\n * Expected JSON RPC response for the \"getFeeCalculatorForBlockhash\" message\n */\nconst GetFeeCalculatorRpcResult = jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  feeCalculator: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n    lamportsPerSignature: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n  })\n})));\n\n/**\n * Expected JSON RPC response for the \"requestAirdrop\" message\n */\nconst RequestAirdropRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)());\n\n/**\n * Expected JSON RPC response for the \"sendTransaction\" message\n */\nconst SendTransactionRpcResult = jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)());\n\n/**\n * Information about the latest slot being processed by a node\n */\n\n/**\n * Parsed account data\n */\n\n/**\n * Stake Activation data\n */\n\n/**\n * Data slice argument for getProgramAccounts\n */\n\n/**\n * Memory comparison filter for getProgramAccounts\n */\n\n/**\n * Data size comparison filter for getProgramAccounts\n */\n\n/**\n * A filter object for getProgramAccounts\n */\n\n/**\n * Configuration object for getProgramAccounts requests\n */\n\n/**\n * Configuration object for getParsedProgramAccounts\n */\n\n/**\n * Configuration object for getMultipleAccounts\n */\n\n/**\n * Configuration object for `getStakeActivation`\n */\n\n/**\n * Configuration object for `getStakeActivation`\n */\n\n/**\n * Configuration object for `getStakeActivation`\n */\n\n/**\n * Configuration object for `getNonce`\n */\n\n/**\n * Configuration object for `getNonceAndContext`\n */\n\n/**\n * Information describing an account\n */\n\n/**\n * Account information identified by pubkey\n */\n\n/**\n * Callback function for account change notifications\n */\n\n/**\n * Callback function for program account change notifications\n */\n\n/**\n * Callback function for slot change notifications\n */\n\n/**\n * Callback function for slot update notifications\n */\n\n/**\n * Callback function for signature status notifications\n */\n\n/**\n * Signature status notification with transaction result\n */\n\n/**\n * Signature received notification\n */\n\n/**\n * Callback function for signature notifications\n */\n\n/**\n * Signature subscription options\n */\n\n/**\n * Callback function for root change notifications\n */\n\n/**\n * @internal\n */\nconst LogsResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  err: TransactionErrorResult,\n  logs: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  signature: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()\n});\n\n/**\n * Logs result.\n */\n\n/**\n * Expected JSON RPC response for the \"logsNotification\" message.\n */\nconst LogsNotificationResult = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  result: notificationResultAndContext(LogsResult),\n  subscription: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()\n});\n\n/**\n * Filter for log subscriptions.\n */\n\n/**\n * Callback function for log notifications.\n */\n\n/**\n * Signature result\n */\n\n/**\n * Transaction error\n */\n\n/**\n * Transaction confirmation status\n * <pre>\n *   'processed': Transaction landed in a block which has reached 1 confirmation by the connected node\n *   'confirmed': Transaction landed in a block which has reached 1 confirmation by the cluster\n *   'finalized': Transaction landed in a block which has been finalized by the cluster\n * </pre>\n */\n\n/**\n * Signature status\n */\n\n/**\n * A confirmed signature with its status\n */\n\n/**\n * An object defining headers to be passed to the RPC server\n */\n\n/**\n * The type of the JavaScript `fetch()` API\n */\n\n/**\n * A callback used to augment the outgoing HTTP request\n */\n\n/**\n * Configuration for instantiating a Connection\n */\n\n/** @internal */\nconst COMMON_HTTP_HEADERS = {\n  'solana-client': `js/${\"1.0.0-maintenance\"}`\n};\n\n/**\n * A connection to a fullnode JSON RPC endpoint\n */\nclass Connection {\n  /**\n   * Establish a JSON RPC connection\n   *\n   * @param endpoint URL to the fullnode JSON RPC endpoint\n   * @param commitmentOrConfig optional default commitment level or optional ConnectionConfig configuration object\n   */\n  constructor(endpoint, _commitmentOrConfig) {\n    /** @internal */\n    this._commitment = void 0;\n    /** @internal */\n    this._confirmTransactionInitialTimeout = void 0;\n    /** @internal */\n    this._rpcEndpoint = void 0;\n    /** @internal */\n    this._rpcWsEndpoint = void 0;\n    /** @internal */\n    this._rpcClient = void 0;\n    /** @internal */\n    this._rpcRequest = void 0;\n    /** @internal */\n    this._rpcBatchRequest = void 0;\n    /** @internal */\n    this._rpcWebSocket = void 0;\n    /** @internal */\n    this._rpcWebSocketConnected = false;\n    /** @internal */\n    this._rpcWebSocketHeartbeat = null;\n    /** @internal */\n    this._rpcWebSocketIdleTimeout = null;\n    /** @internal\n     * A number that we increment every time an active connection closes.\n     * Used to determine whether the same socket connection that was open\n     * when an async operation started is the same one that's active when\n     * its continuation fires.\n     *\n     */\n    this._rpcWebSocketGeneration = 0;\n    /** @internal */\n    this._disableBlockhashCaching = false;\n    /** @internal */\n    this._pollingBlockhash = false;\n    /** @internal */\n    this._blockhashInfo = {\n      latestBlockhash: null,\n      lastFetch: 0,\n      transactionSignatures: [],\n      simulatedSignatures: []\n    };\n    /** @internal */\n    this._nextClientSubscriptionId = 0;\n    /** @internal */\n    this._subscriptionDisposeFunctionsByClientSubscriptionId = {};\n    /** @internal */\n    this._subscriptionHashByClientSubscriptionId = {};\n    /** @internal */\n    this._subscriptionStateChangeCallbacksByHash = {};\n    /** @internal */\n    this._subscriptionCallbacksByServerSubscriptionId = {};\n    /** @internal */\n    this._subscriptionsByHash = {};\n    /**\n     * Special case.\n     * After a signature is processed, RPCs automatically dispose of the\n     * subscription on the server side. We need to track which of these\n     * subscriptions have been disposed in such a way, so that we know\n     * whether the client is dealing with a not-yet-processed signature\n     * (in which case we must tear down the server subscription) or an\n     * already-processed signature (in which case the client can simply\n     * clear out the subscription locally without telling the server).\n     *\n     * NOTE: There is a proposal to eliminate this special case, here:\n     * https://github.com/solana-labs/solana/issues/18892\n     */\n    /** @internal */\n    this._subscriptionsAutoDisposedByRpc = new Set();\n    /*\n     * Returns the current block height of the node\n     */\n    this.getBlockHeight = (() => {\n      const requestPromises = {};\n      return async commitmentOrConfig => {\n        const {\n          commitment,\n          config\n        } = extractCommitmentFromConfig(commitmentOrConfig);\n        const args = this._buildArgs([], commitment, undefined /* encoding */, config);\n        const requestHash = fastStableStringify(args);\n        requestPromises[requestHash] = requestPromises[requestHash] ?? (async () => {\n          try {\n            const unsafeRes = await this._rpcRequest('getBlockHeight', args);\n            const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()));\n            if ('error' in res) {\n              throw new SolanaJSONRPCError(res.error, 'failed to get block height information');\n            }\n            return res.result;\n          } finally {\n            delete requestPromises[requestHash];\n          }\n        })();\n        return await requestPromises[requestHash];\n      };\n    })();\n    let wsEndpoint;\n    let httpHeaders;\n    let fetch;\n    let fetchMiddleware;\n    let disableRetryOnRateLimit;\n    let httpAgent;\n    if (_commitmentOrConfig && typeof _commitmentOrConfig === 'string') {\n      this._commitment = _commitmentOrConfig;\n    } else if (_commitmentOrConfig) {\n      this._commitment = _commitmentOrConfig.commitment;\n      this._confirmTransactionInitialTimeout = _commitmentOrConfig.confirmTransactionInitialTimeout;\n      wsEndpoint = _commitmentOrConfig.wsEndpoint;\n      httpHeaders = _commitmentOrConfig.httpHeaders;\n      fetch = _commitmentOrConfig.fetch;\n      fetchMiddleware = _commitmentOrConfig.fetchMiddleware;\n      disableRetryOnRateLimit = _commitmentOrConfig.disableRetryOnRateLimit;\n      httpAgent = _commitmentOrConfig.httpAgent;\n    }\n    this._rpcEndpoint = assertEndpointUrl(endpoint);\n    this._rpcWsEndpoint = wsEndpoint || makeWebsocketUrl(endpoint);\n    this._rpcClient = createRpcClient(endpoint, httpHeaders, fetch, fetchMiddleware, disableRetryOnRateLimit, httpAgent);\n    this._rpcRequest = createRpcRequest(this._rpcClient);\n    this._rpcBatchRequest = createRpcBatchRequest(this._rpcClient);\n    this._rpcWebSocket = new RpcWebSocketClient(this._rpcWsEndpoint, {\n      autoconnect: false,\n      max_reconnects: Infinity\n    });\n    this._rpcWebSocket.on('open', this._wsOnOpen.bind(this));\n    this._rpcWebSocket.on('error', this._wsOnError.bind(this));\n    this._rpcWebSocket.on('close', this._wsOnClose.bind(this));\n    this._rpcWebSocket.on('accountNotification', this._wsOnAccountNotification.bind(this));\n    this._rpcWebSocket.on('programNotification', this._wsOnProgramAccountNotification.bind(this));\n    this._rpcWebSocket.on('slotNotification', this._wsOnSlotNotification.bind(this));\n    this._rpcWebSocket.on('slotsUpdatesNotification', this._wsOnSlotUpdatesNotification.bind(this));\n    this._rpcWebSocket.on('signatureNotification', this._wsOnSignatureNotification.bind(this));\n    this._rpcWebSocket.on('rootNotification', this._wsOnRootNotification.bind(this));\n    this._rpcWebSocket.on('logsNotification', this._wsOnLogsNotification.bind(this));\n  }\n\n  /**\n   * The default commitment used for requests\n   */\n  get commitment() {\n    return this._commitment;\n  }\n\n  /**\n   * The RPC endpoint\n   */\n  get rpcEndpoint() {\n    return this._rpcEndpoint;\n  }\n\n  /**\n   * Fetch the balance for the specified public key, return with context\n   */\n  async getBalanceAndContext(publicKey, commitmentOrConfig) {\n    /** @internal */\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([publicKey.toBase58()], commitment, undefined /* encoding */, config);\n    const unsafeRes = await this._rpcRequest('getBalance', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get balance for ${publicKey.toBase58()}`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the balance for the specified public key\n   */\n  async getBalance(publicKey, commitmentOrConfig) {\n    return await this.getBalanceAndContext(publicKey, commitmentOrConfig).then(x => x.value).catch(e => {\n      throw new Error('failed to get balance of account ' + publicKey.toBase58() + ': ' + e);\n    });\n  }\n\n  /**\n   * Fetch the estimated production time of a block\n   */\n  async getBlockTime(slot) {\n    const unsafeRes = await this._rpcRequest('getBlockTime', [slot]);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get block time for slot ${slot}`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the lowest slot that the node has information about in its ledger.\n   * This value may increase over time if the node is configured to purge older ledger data\n   */\n  async getMinimumLedgerSlot() {\n    const unsafeRes = await this._rpcRequest('minimumLedgerSlot', []);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get minimum ledger slot');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the slot of the lowest confirmed block that has not been purged from the ledger\n   */\n  async getFirstAvailableBlock() {\n    const unsafeRes = await this._rpcRequest('getFirstAvailableBlock', []);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, SlotRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get first available block');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch information about the current supply\n   */\n  async getSupply(config) {\n    let configArg = {};\n    if (typeof config === 'string') {\n      configArg = {\n        commitment: config\n      };\n    } else if (config) {\n      configArg = {\n        ...config,\n        commitment: config && config.commitment || this.commitment\n      };\n    } else {\n      configArg = {\n        commitment: this.commitment\n      };\n    }\n    const unsafeRes = await this._rpcRequest('getSupply', [configArg]);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetSupplyRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get supply');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the current supply of a token mint\n   */\n  async getTokenSupply(tokenMintAddress, commitment) {\n    const args = this._buildArgs([tokenMintAddress.toBase58()], commitment);\n    const unsafeRes = await this._rpcRequest('getTokenSupply', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResultAndContext(TokenAmountResult));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get token supply');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the current balance of a token account\n   */\n  async getTokenAccountBalance(tokenAddress, commitment) {\n    const args = this._buildArgs([tokenAddress.toBase58()], commitment);\n    const unsafeRes = await this._rpcRequest('getTokenAccountBalance', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResultAndContext(TokenAmountResult));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get token account balance');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch all the token accounts owned by the specified account\n   *\n   * @return {Promise<RpcResponseAndContext<GetProgramAccountsResponse>}\n   */\n  async getTokenAccountsByOwner(ownerAddress, filter, commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    let _args = [ownerAddress.toBase58()];\n    if ('mint' in filter) {\n      _args.push({\n        mint: filter.mint.toBase58()\n      });\n    } else {\n      _args.push({\n        programId: filter.programId.toBase58()\n      });\n    }\n    const args = this._buildArgs(_args, commitment, 'base64', config);\n    const unsafeRes = await this._rpcRequest('getTokenAccountsByOwner', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetTokenAccountsByOwner);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get token accounts owned by account ${ownerAddress.toBase58()}`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch parsed token accounts owned by the specified account\n   *\n   * @return {Promise<RpcResponseAndContext<Array<{pubkey: PublicKey, account: AccountInfo<ParsedAccountData>}>>>}\n   */\n  async getParsedTokenAccountsByOwner(ownerAddress, filter, commitment) {\n    let _args = [ownerAddress.toBase58()];\n    if ('mint' in filter) {\n      _args.push({\n        mint: filter.mint.toBase58()\n      });\n    } else {\n      _args.push({\n        programId: filter.programId.toBase58()\n      });\n    }\n    const args = this._buildArgs(_args, commitment, 'jsonParsed');\n    const unsafeRes = await this._rpcRequest('getTokenAccountsByOwner', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetParsedTokenAccountsByOwner);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get token accounts owned by account ${ownerAddress.toBase58()}`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the 20 largest accounts with their current balances\n   */\n  async getLargestAccounts(config) {\n    const arg = {\n      ...config,\n      commitment: config && config.commitment || this.commitment\n    };\n    const args = arg.filter || arg.commitment ? [arg] : [];\n    const unsafeRes = await this._rpcRequest('getLargestAccounts', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetLargestAccountsRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get largest accounts');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the 20 largest token accounts with their current balances\n   * for a given mint.\n   */\n  async getTokenLargestAccounts(mintAddress, commitment) {\n    const args = this._buildArgs([mintAddress.toBase58()], commitment);\n    const unsafeRes = await this._rpcRequest('getTokenLargestAccounts', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetTokenLargestAccountsResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get token largest accounts');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch all the account info for the specified public key, return with context\n   */\n  async getAccountInfoAndContext(publicKey, commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([publicKey.toBase58()], commitment, 'base64', config);\n    const unsafeRes = await this._rpcRequest('getAccountInfo', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(AccountInfoResult)));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get info about account ${publicKey.toBase58()}`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch parsed account info for the specified public key\n   */\n  async getParsedAccountInfo(publicKey, commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([publicKey.toBase58()], commitment, 'jsonParsed', config);\n    const unsafeRes = await this._rpcRequest('getAccountInfo', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(ParsedAccountInfoResult)));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get info about account ${publicKey.toBase58()}`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch all the account info for the specified public key\n   */\n  async getAccountInfo(publicKey, commitmentOrConfig) {\n    try {\n      const res = await this.getAccountInfoAndContext(publicKey, commitmentOrConfig);\n      return res.value;\n    } catch (e) {\n      throw new Error('failed to get info about account ' + publicKey.toBase58() + ': ' + e);\n    }\n  }\n\n  /**\n   * Fetch all the account info for multiple accounts specified by an array of public keys, return with context\n   */\n  async getMultipleParsedAccounts(publicKeys, rawConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(rawConfig);\n    const keys = publicKeys.map(key => key.toBase58());\n    const args = this._buildArgs([keys], commitment, 'jsonParsed', config);\n    const unsafeRes = await this._rpcRequest('getMultipleAccounts', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(ParsedAccountInfoResult))));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get info for accounts ${keys}`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch all the account info for multiple accounts specified by an array of public keys, return with context\n   */\n  async getMultipleAccountsInfoAndContext(publicKeys, commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const keys = publicKeys.map(key => key.toBase58());\n    const args = this._buildArgs([keys], commitment, 'base64', config);\n    const unsafeRes = await this._rpcRequest('getMultipleAccounts', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)(AccountInfoResult))));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get info for accounts ${keys}`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch all the account info for multiple accounts specified by an array of public keys\n   */\n  async getMultipleAccountsInfo(publicKeys, commitmentOrConfig) {\n    const res = await this.getMultipleAccountsInfoAndContext(publicKeys, commitmentOrConfig);\n    return res.value;\n  }\n\n  /**\n   * Returns epoch activation information for a stake account that has been delegated\n   *\n   * @deprecated Deprecated since RPC v1.18; will be removed in a future version.\n   */\n  async getStakeActivation(publicKey, commitmentOrConfig, epoch) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([publicKey.toBase58()], commitment, undefined /* encoding */, {\n      ...config,\n      epoch: epoch != null ? epoch : config?.epoch\n    });\n    const unsafeRes = await this._rpcRequest('getStakeActivation', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult(StakeActivationResult));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get Stake Activation ${publicKey.toBase58()}`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch all the accounts owned by the specified program id\n   *\n   * @return {Promise<Array<{pubkey: PublicKey, account: AccountInfo<Buffer>}>>}\n   */\n\n  // eslint-disable-next-line no-dupe-class-members\n\n  // eslint-disable-next-line no-dupe-class-members\n  async getProgramAccounts(programId, configOrCommitment) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(configOrCommitment);\n    const {\n      encoding,\n      ...configWithoutEncoding\n    } = config || {};\n    const args = this._buildArgs([programId.toBase58()], commitment, encoding || 'base64', {\n      ...configWithoutEncoding,\n      ...(configWithoutEncoding.filters ? {\n        filters: applyDefaultMemcmpEncodingToFilters(configWithoutEncoding.filters)\n      } : null)\n    });\n    const unsafeRes = await this._rpcRequest('getProgramAccounts', args);\n    const baseSchema = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(KeyedAccountInfoResult);\n    const res = configWithoutEncoding.withContext === true ? (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResultAndContext(baseSchema)) : (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult(baseSchema));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get accounts owned by program ${programId.toBase58()}`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch and parse all the accounts owned by the specified program id\n   *\n   * @return {Promise<Array<{pubkey: PublicKey, account: AccountInfo<Buffer | ParsedAccountData>}>>}\n   */\n  async getParsedProgramAccounts(programId, configOrCommitment) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(configOrCommitment);\n    const args = this._buildArgs([programId.toBase58()], commitment, 'jsonParsed', config);\n    const unsafeRes = await this._rpcRequest('getProgramAccounts', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(KeyedParsedAccountInfoResult)));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get accounts owned by program ${programId.toBase58()}`);\n    }\n    return res.result;\n  }\n\n  /** @deprecated Instead, call `confirmTransaction` and pass in {@link TransactionConfirmationStrategy} */\n  // eslint-disable-next-line no-dupe-class-members\n\n  // eslint-disable-next-line no-dupe-class-members\n  async confirmTransaction(strategy, commitment) {\n    let rawSignature;\n    if (typeof strategy == 'string') {\n      rawSignature = strategy;\n    } else {\n      const config = strategy;\n      if (config.abortSignal?.aborted) {\n        return Promise.reject(config.abortSignal.reason);\n      }\n      rawSignature = config.signature;\n    }\n    let decodedSignature;\n    try {\n      decodedSignature = bs58__WEBPACK_IMPORTED_MODULE_2___default().decode(rawSignature);\n    } catch (err) {\n      throw new Error('signature must be base58 encoded: ' + rawSignature);\n    }\n    assert(decodedSignature.length === 64, 'signature has invalid length');\n    if (typeof strategy === 'string') {\n      return await this.confirmTransactionUsingLegacyTimeoutStrategy({\n        commitment: commitment || this.commitment,\n        signature: rawSignature\n      });\n    } else if ('lastValidBlockHeight' in strategy) {\n      return await this.confirmTransactionUsingBlockHeightExceedanceStrategy({\n        commitment: commitment || this.commitment,\n        strategy\n      });\n    } else {\n      return await this.confirmTransactionUsingDurableNonceStrategy({\n        commitment: commitment || this.commitment,\n        strategy\n      });\n    }\n  }\n  getCancellationPromise(signal) {\n    return new Promise((_, reject) => {\n      if (signal == null) {\n        return;\n      }\n      if (signal.aborted) {\n        reject(signal.reason);\n      } else {\n        signal.addEventListener('abort', () => {\n          reject(signal.reason);\n        });\n      }\n    });\n  }\n  getTransactionConfirmationPromise({\n    commitment,\n    signature\n  }) {\n    let signatureSubscriptionId;\n    let disposeSignatureSubscriptionStateChangeObserver;\n    let done = false;\n    const confirmationPromise = new Promise((resolve, reject) => {\n      try {\n        signatureSubscriptionId = this.onSignature(signature, (result, context) => {\n          signatureSubscriptionId = undefined;\n          const response = {\n            context,\n            value: result\n          };\n          resolve({\n            __type: TransactionStatus.PROCESSED,\n            response\n          });\n        }, commitment);\n        const subscriptionSetupPromise = new Promise(resolveSubscriptionSetup => {\n          if (signatureSubscriptionId == null) {\n            resolveSubscriptionSetup();\n          } else {\n            disposeSignatureSubscriptionStateChangeObserver = this._onSubscriptionStateChange(signatureSubscriptionId, nextState => {\n              if (nextState === 'subscribed') {\n                resolveSubscriptionSetup();\n              }\n            });\n          }\n        });\n        (async () => {\n          await subscriptionSetupPromise;\n          if (done) return;\n          const response = await this.getSignatureStatus(signature);\n          if (done) return;\n          if (response == null) {\n            return;\n          }\n          const {\n            context,\n            value\n          } = response;\n          if (value == null) {\n            return;\n          }\n          if (value?.err) {\n            reject(value.err);\n          } else {\n            switch (commitment) {\n              case 'confirmed':\n              case 'single':\n              case 'singleGossip':\n                {\n                  if (value.confirmationStatus === 'processed') {\n                    return;\n                  }\n                  break;\n                }\n              case 'finalized':\n              case 'max':\n              case 'root':\n                {\n                  if (value.confirmationStatus === 'processed' || value.confirmationStatus === 'confirmed') {\n                    return;\n                  }\n                  break;\n                }\n              // exhaust enums to ensure full coverage\n              case 'processed':\n              case 'recent':\n            }\n            done = true;\n            resolve({\n              __type: TransactionStatus.PROCESSED,\n              response: {\n                context,\n                value\n              }\n            });\n          }\n        })();\n      } catch (err) {\n        reject(err);\n      }\n    });\n    const abortConfirmation = () => {\n      if (disposeSignatureSubscriptionStateChangeObserver) {\n        disposeSignatureSubscriptionStateChangeObserver();\n        disposeSignatureSubscriptionStateChangeObserver = undefined;\n      }\n      if (signatureSubscriptionId != null) {\n        this.removeSignatureListener(signatureSubscriptionId);\n        signatureSubscriptionId = undefined;\n      }\n    };\n    return {\n      abortConfirmation,\n      confirmationPromise\n    };\n  }\n  async confirmTransactionUsingBlockHeightExceedanceStrategy({\n    commitment,\n    strategy: {\n      abortSignal,\n      lastValidBlockHeight,\n      signature\n    }\n  }) {\n    let done = false;\n    const expiryPromise = new Promise(resolve => {\n      const checkBlockHeight = async () => {\n        try {\n          const blockHeight = await this.getBlockHeight(commitment);\n          return blockHeight;\n        } catch (_e) {\n          return -1;\n        }\n      };\n      (async () => {\n        let currentBlockHeight = await checkBlockHeight();\n        if (done) return;\n        while (currentBlockHeight <= lastValidBlockHeight) {\n          await sleep(1000);\n          if (done) return;\n          currentBlockHeight = await checkBlockHeight();\n          if (done) return;\n        }\n        resolve({\n          __type: TransactionStatus.BLOCKHEIGHT_EXCEEDED\n        });\n      })();\n    });\n    const {\n      abortConfirmation,\n      confirmationPromise\n    } = this.getTransactionConfirmationPromise({\n      commitment,\n      signature\n    });\n    const cancellationPromise = this.getCancellationPromise(abortSignal);\n    let result;\n    try {\n      const outcome = await Promise.race([cancellationPromise, confirmationPromise, expiryPromise]);\n      if (outcome.__type === TransactionStatus.PROCESSED) {\n        result = outcome.response;\n      } else {\n        throw new TransactionExpiredBlockheightExceededError(signature);\n      }\n    } finally {\n      done = true;\n      abortConfirmation();\n    }\n    return result;\n  }\n  async confirmTransactionUsingDurableNonceStrategy({\n    commitment,\n    strategy: {\n      abortSignal,\n      minContextSlot,\n      nonceAccountPubkey,\n      nonceValue,\n      signature\n    }\n  }) {\n    let done = false;\n    const expiryPromise = new Promise(resolve => {\n      let currentNonceValue = nonceValue;\n      let lastCheckedSlot = null;\n      const getCurrentNonceValue = async () => {\n        try {\n          const {\n            context,\n            value: nonceAccount\n          } = await this.getNonceAndContext(nonceAccountPubkey, {\n            commitment,\n            minContextSlot\n          });\n          lastCheckedSlot = context.slot;\n          return nonceAccount?.nonce;\n        } catch (e) {\n          // If for whatever reason we can't reach/read the nonce\n          // account, just keep using the last-known value.\n          return currentNonceValue;\n        }\n      };\n      (async () => {\n        currentNonceValue = await getCurrentNonceValue();\n        if (done) return;\n        while (true // eslint-disable-line no-constant-condition\n        ) {\n          if (nonceValue !== currentNonceValue) {\n            resolve({\n              __type: TransactionStatus.NONCE_INVALID,\n              slotInWhichNonceDidAdvance: lastCheckedSlot\n            });\n            return;\n          }\n          await sleep(2000);\n          if (done) return;\n          currentNonceValue = await getCurrentNonceValue();\n          if (done) return;\n        }\n      })();\n    });\n    const {\n      abortConfirmation,\n      confirmationPromise\n    } = this.getTransactionConfirmationPromise({\n      commitment,\n      signature\n    });\n    const cancellationPromise = this.getCancellationPromise(abortSignal);\n    let result;\n    try {\n      const outcome = await Promise.race([cancellationPromise, confirmationPromise, expiryPromise]);\n      if (outcome.__type === TransactionStatus.PROCESSED) {\n        result = outcome.response;\n      } else {\n        // Double check that the transaction is indeed unconfirmed.\n        let signatureStatus;\n        while (true // eslint-disable-line no-constant-condition\n        ) {\n          const status = await this.getSignatureStatus(signature);\n          if (status == null) {\n            break;\n          }\n          if (status.context.slot < (outcome.slotInWhichNonceDidAdvance ?? minContextSlot)) {\n            await sleep(400);\n            continue;\n          }\n          signatureStatus = status;\n          break;\n        }\n        if (signatureStatus?.value) {\n          const commitmentForStatus = commitment || 'finalized';\n          const {\n            confirmationStatus\n          } = signatureStatus.value;\n          switch (commitmentForStatus) {\n            case 'processed':\n            case 'recent':\n              if (confirmationStatus !== 'processed' && confirmationStatus !== 'confirmed' && confirmationStatus !== 'finalized') {\n                throw new TransactionExpiredNonceInvalidError(signature);\n              }\n              break;\n            case 'confirmed':\n            case 'single':\n            case 'singleGossip':\n              if (confirmationStatus !== 'confirmed' && confirmationStatus !== 'finalized') {\n                throw new TransactionExpiredNonceInvalidError(signature);\n              }\n              break;\n            case 'finalized':\n            case 'max':\n            case 'root':\n              if (confirmationStatus !== 'finalized') {\n                throw new TransactionExpiredNonceInvalidError(signature);\n              }\n              break;\n            default:\n              // Exhaustive switch.\n              // eslint-disable-next-line @typescript-eslint/no-unused-vars\n              (_ => {})(commitmentForStatus);\n          }\n          result = {\n            context: signatureStatus.context,\n            value: {\n              err: signatureStatus.value.err\n            }\n          };\n        } else {\n          throw new TransactionExpiredNonceInvalidError(signature);\n        }\n      }\n    } finally {\n      done = true;\n      abortConfirmation();\n    }\n    return result;\n  }\n  async confirmTransactionUsingLegacyTimeoutStrategy({\n    commitment,\n    signature\n  }) {\n    let timeoutId;\n    const expiryPromise = new Promise(resolve => {\n      let timeoutMs = this._confirmTransactionInitialTimeout || 60 * 1000;\n      switch (commitment) {\n        case 'processed':\n        case 'recent':\n        case 'single':\n        case 'confirmed':\n        case 'singleGossip':\n          {\n            timeoutMs = this._confirmTransactionInitialTimeout || 30 * 1000;\n            break;\n          }\n      }\n      timeoutId = setTimeout(() => resolve({\n        __type: TransactionStatus.TIMED_OUT,\n        timeoutMs\n      }), timeoutMs);\n    });\n    const {\n      abortConfirmation,\n      confirmationPromise\n    } = this.getTransactionConfirmationPromise({\n      commitment,\n      signature\n    });\n    let result;\n    try {\n      const outcome = await Promise.race([confirmationPromise, expiryPromise]);\n      if (outcome.__type === TransactionStatus.PROCESSED) {\n        result = outcome.response;\n      } else {\n        throw new TransactionExpiredTimeoutError(signature, outcome.timeoutMs / 1000);\n      }\n    } finally {\n      clearTimeout(timeoutId);\n      abortConfirmation();\n    }\n    return result;\n  }\n\n  /**\n   * Return the list of nodes that are currently participating in the cluster\n   */\n  async getClusterNodes() {\n    const unsafeRes = await this._rpcRequest('getClusterNodes', []);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(ContactInfoResult)));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get cluster nodes');\n    }\n    return res.result;\n  }\n\n  /**\n   * Return the list of nodes that are currently participating in the cluster\n   */\n  async getVoteAccounts(commitment) {\n    const args = this._buildArgs([], commitment);\n    const unsafeRes = await this._rpcRequest('getVoteAccounts', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetVoteAccounts);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get vote accounts');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the current slot that the node is processing\n   */\n  async getSlot(commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([], commitment, undefined /* encoding */, config);\n    const unsafeRes = await this._rpcRequest('getSlot', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get slot');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the current slot leader of the cluster\n   */\n  async getSlotLeader(commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([], commitment, undefined /* encoding */, config);\n    const unsafeRes = await this._rpcRequest('getSlotLeader', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get slot leader');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch `limit` number of slot leaders starting from `startSlot`\n   *\n   * @param startSlot fetch slot leaders starting from this slot\n   * @param limit number of slot leaders to return\n   */\n  async getSlotLeaders(startSlot, limit) {\n    const args = [startSlot, limit];\n    const unsafeRes = await this._rpcRequest('getSlotLeaders', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)(PublicKeyFromString)));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get slot leaders');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the current status of a signature\n   */\n  async getSignatureStatus(signature, config) {\n    const {\n      context,\n      value: values\n    } = await this.getSignatureStatuses([signature], config);\n    assert(values.length === 1);\n    const value = values[0];\n    return {\n      context,\n      value\n    };\n  }\n\n  /**\n   * Fetch the current statuses of a batch of signatures\n   */\n  async getSignatureStatuses(signatures, config) {\n    const params = [signatures];\n    if (config) {\n      params.push(config);\n    }\n    const unsafeRes = await this._rpcRequest('getSignatureStatuses', params);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetSignatureStatusesRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get signature status');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the current transaction count of the cluster\n   */\n  async getTransactionCount(commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([], commitment, undefined /* encoding */, config);\n    const unsafeRes = await this._rpcRequest('getTransactionCount', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get transaction count');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the current total currency supply of the cluster in lamports\n   *\n   * @deprecated Deprecated since RPC v1.2.8. Please use {@link getSupply} instead.\n   */\n  async getTotalSupply(commitment) {\n    const result = await this.getSupply({\n      commitment,\n      excludeNonCirculatingAccountsList: true\n    });\n    return result.value.total;\n  }\n\n  /**\n   * Fetch the cluster InflationGovernor parameters\n   */\n  async getInflationGovernor(commitment) {\n    const args = this._buildArgs([], commitment);\n    const unsafeRes = await this._rpcRequest('getInflationGovernor', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetInflationGovernorRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get inflation');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the inflation reward for a list of addresses for an epoch\n   */\n  async getInflationReward(addresses, epoch, commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([addresses.map(pubkey => pubkey.toBase58())], commitment, undefined /* encoding */, {\n      ...config,\n      epoch: epoch != null ? epoch : config?.epoch\n    });\n    const unsafeRes = await this._rpcRequest('getInflationReward', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetInflationRewardResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get inflation reward');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the specific inflation values for the current epoch\n   */\n  async getInflationRate() {\n    const unsafeRes = await this._rpcRequest('getInflationRate', []);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetInflationRateRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get inflation rate');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the Epoch Info parameters\n   */\n  async getEpochInfo(commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([], commitment, undefined /* encoding */, config);\n    const unsafeRes = await this._rpcRequest('getEpochInfo', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetEpochInfoRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get epoch info');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the Epoch Schedule parameters\n   */\n  async getEpochSchedule() {\n    const unsafeRes = await this._rpcRequest('getEpochSchedule', []);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetEpochScheduleRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get epoch schedule');\n    }\n    const epochSchedule = res.result;\n    return new EpochSchedule(epochSchedule.slotsPerEpoch, epochSchedule.leaderScheduleSlotOffset, epochSchedule.warmup, epochSchedule.firstNormalEpoch, epochSchedule.firstNormalSlot);\n  }\n\n  /**\n   * Fetch the leader schedule for the current epoch\n   * @return {Promise<RpcResponseAndContext<LeaderSchedule>>}\n   */\n  async getLeaderSchedule() {\n    const unsafeRes = await this._rpcRequest('getLeaderSchedule', []);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetLeaderScheduleRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get leader schedule');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the minimum balance needed to exempt an account of `dataLength`\n   * size from rent\n   */\n  async getMinimumBalanceForRentExemption(dataLength, commitment) {\n    const args = this._buildArgs([dataLength], commitment);\n    const unsafeRes = await this._rpcRequest('getMinimumBalanceForRentExemption', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetMinimumBalanceForRentExemptionRpcResult);\n    if ('error' in res) {\n      console.warn('Unable to fetch minimum balance for rent exemption');\n      return 0;\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch a recent blockhash from the cluster, return with context\n   * @return {Promise<RpcResponseAndContext<{blockhash: Blockhash, feeCalculator: FeeCalculator}>>}\n   *\n   * @deprecated Deprecated since RPC v1.9.0. Please use {@link getLatestBlockhash} instead.\n   */\n  async getRecentBlockhashAndContext(commitment) {\n    const {\n      context,\n      value: {\n        blockhash\n      }\n    } = await this.getLatestBlockhashAndContext(commitment);\n    const feeCalculator = {\n      get lamportsPerSignature() {\n        throw new Error('The capability to fetch `lamportsPerSignature` using the `getRecentBlockhash` API is ' + 'no longer offered by the network. Use the `getFeeForMessage` API to obtain the fee ' + 'for a given message.');\n      },\n      toJSON() {\n        return {};\n      }\n    };\n    return {\n      context,\n      value: {\n        blockhash,\n        feeCalculator\n      }\n    };\n  }\n\n  /**\n   * Fetch recent performance samples\n   * @return {Promise<Array<PerfSample>>}\n   */\n  async getRecentPerformanceSamples(limit) {\n    const unsafeRes = await this._rpcRequest('getRecentPerformanceSamples', limit ? [limit] : []);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetRecentPerformanceSamplesRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get recent performance samples');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the fee calculator for a recent blockhash from the cluster, return with context\n   *\n   * @deprecated Deprecated since RPC v1.9.0. Please use {@link getFeeForMessage} instead.\n   */\n  async getFeeCalculatorForBlockhash(blockhash, commitment) {\n    const args = this._buildArgs([blockhash], commitment);\n    const unsafeRes = await this._rpcRequest('getFeeCalculatorForBlockhash', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetFeeCalculatorRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get fee calculator');\n    }\n    const {\n      context,\n      value\n    } = res.result;\n    return {\n      context,\n      value: value !== null ? value.feeCalculator : null\n    };\n  }\n\n  /**\n   * Fetch the fee for a message from the cluster, return with context\n   */\n  async getFeeForMessage(message, commitment) {\n    const wireMessage = toBuffer(message.serialize()).toString('base64');\n    const args = this._buildArgs([wireMessage], commitment);\n    const unsafeRes = await this._rpcRequest('getFeeForMessage', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.nullable)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get fee for message');\n    }\n    if (res.result === null) {\n      throw new Error('invalid blockhash');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch a list of prioritization fees from recent blocks.\n   */\n  async getRecentPrioritizationFees(config) {\n    const accounts = config?.lockedWritableAccounts?.map(key => key.toBase58());\n    const args = accounts?.length ? [accounts] : [];\n    const unsafeRes = await this._rpcRequest('getRecentPrioritizationFees', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetRecentPrioritizationFeesRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get recent prioritization fees');\n    }\n    return res.result;\n  }\n  /**\n   * Fetch a recent blockhash from the cluster\n   * @return {Promise<{blockhash: Blockhash, feeCalculator: FeeCalculator}>}\n   *\n   * @deprecated Deprecated since RPC v1.8.0. Please use {@link getLatestBlockhash} instead.\n   */\n  async getRecentBlockhash(commitment) {\n    try {\n      const res = await this.getRecentBlockhashAndContext(commitment);\n      return res.value;\n    } catch (e) {\n      throw new Error('failed to get recent blockhash: ' + e);\n    }\n  }\n\n  /**\n   * Fetch the latest blockhash from the cluster\n   * @return {Promise<BlockhashWithExpiryBlockHeight>}\n   */\n  async getLatestBlockhash(commitmentOrConfig) {\n    try {\n      const res = await this.getLatestBlockhashAndContext(commitmentOrConfig);\n      return res.value;\n    } catch (e) {\n      throw new Error('failed to get recent blockhash: ' + e);\n    }\n  }\n\n  /**\n   * Fetch the latest blockhash from the cluster\n   * @return {Promise<BlockhashWithExpiryBlockHeight>}\n   */\n  async getLatestBlockhashAndContext(commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([], commitment, undefined /* encoding */, config);\n    const unsafeRes = await this._rpcRequest('getLatestBlockhash', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetLatestBlockhashRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get latest blockhash');\n    }\n    return res.result;\n  }\n\n  /**\n   * Returns whether a blockhash is still valid or not\n   */\n  async isBlockhashValid(blockhash, rawConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(rawConfig);\n    const args = this._buildArgs([blockhash], commitment, undefined /* encoding */, config);\n    const unsafeRes = await this._rpcRequest('isBlockhashValid', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, IsBlockhashValidRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to determine if the blockhash `' + blockhash + '`is valid');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the node version\n   */\n  async getVersion() {\n    const unsafeRes = await this._rpcRequest('getVersion', []);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult(VersionResult));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get version');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch the genesis hash\n   */\n  async getGenesisHash() {\n    const unsafeRes = await this._rpcRequest('getGenesisHash', []);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get genesis hash');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch a processed block from the cluster.\n   *\n   * @deprecated Instead, call `getBlock` using a `GetVersionedBlockConfig` by\n   * setting the `maxSupportedTransactionVersion` property.\n   */\n\n  /**\n   * @deprecated Instead, call `getBlock` using a `GetVersionedBlockConfig` by\n   * setting the `maxSupportedTransactionVersion` property.\n   */\n  // eslint-disable-next-line no-dupe-class-members\n\n  /**\n   * @deprecated Instead, call `getBlock` using a `GetVersionedBlockConfig` by\n   * setting the `maxSupportedTransactionVersion` property.\n   */\n  // eslint-disable-next-line no-dupe-class-members\n\n  /**\n   * Fetch a processed block from the cluster.\n   */\n  // eslint-disable-next-line no-dupe-class-members\n\n  // eslint-disable-next-line no-dupe-class-members\n\n  // eslint-disable-next-line no-dupe-class-members\n\n  /**\n   * Fetch a processed block from the cluster.\n   */\n  // eslint-disable-next-line no-dupe-class-members\n  async getBlock(slot, rawConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(rawConfig);\n    const args = this._buildArgsAtLeastConfirmed([slot], commitment, undefined /* encoding */, config);\n    const unsafeRes = await this._rpcRequest('getBlock', args);\n    try {\n      switch (config?.transactionDetails) {\n        case 'accounts':\n          {\n            const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetAccountsModeBlockRpcResult);\n            if ('error' in res) {\n              throw res.error;\n            }\n            return res.result;\n          }\n        case 'none':\n          {\n            const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetNoneModeBlockRpcResult);\n            if ('error' in res) {\n              throw res.error;\n            }\n            return res.result;\n          }\n        default:\n          {\n            const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetBlockRpcResult);\n            if ('error' in res) {\n              throw res.error;\n            }\n            const {\n              result\n            } = res;\n            return result ? {\n              ...result,\n              transactions: result.transactions.map(({\n                transaction,\n                meta,\n                version\n              }) => ({\n                meta,\n                transaction: {\n                  ...transaction,\n                  message: versionedMessageFromResponse(version, transaction.message)\n                },\n                version\n              }))\n            } : null;\n          }\n      }\n    } catch (e) {\n      throw new SolanaJSONRPCError(e, 'failed to get confirmed block');\n    }\n  }\n\n  /**\n   * Fetch parsed transaction details for a confirmed or finalized block\n   */\n\n  // eslint-disable-next-line no-dupe-class-members\n\n  // eslint-disable-next-line no-dupe-class-members\n\n  // eslint-disable-next-line no-dupe-class-members\n  async getParsedBlock(slot, rawConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(rawConfig);\n    const args = this._buildArgsAtLeastConfirmed([slot], commitment, 'jsonParsed', config);\n    const unsafeRes = await this._rpcRequest('getBlock', args);\n    try {\n      switch (config?.transactionDetails) {\n        case 'accounts':\n          {\n            const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetParsedAccountsModeBlockRpcResult);\n            if ('error' in res) {\n              throw res.error;\n            }\n            return res.result;\n          }\n        case 'none':\n          {\n            const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetParsedNoneModeBlockRpcResult);\n            if ('error' in res) {\n              throw res.error;\n            }\n            return res.result;\n          }\n        default:\n          {\n            const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetParsedBlockRpcResult);\n            if ('error' in res) {\n              throw res.error;\n            }\n            return res.result;\n          }\n      }\n    } catch (e) {\n      throw new SolanaJSONRPCError(e, 'failed to get block');\n    }\n  }\n  /*\n   * Returns recent block production information from the current or previous epoch\n   */\n  async getBlockProduction(configOrCommitment) {\n    let extra;\n    let commitment;\n    if (typeof configOrCommitment === 'string') {\n      commitment = configOrCommitment;\n    } else if (configOrCommitment) {\n      const {\n        commitment: c,\n        ...rest\n      } = configOrCommitment;\n      commitment = c;\n      extra = rest;\n    }\n    const args = this._buildArgs([], commitment, 'base64', extra);\n    const unsafeRes = await this._rpcRequest('getBlockProduction', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, BlockProductionResponseStruct);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get block production information');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch a confirmed or finalized transaction from the cluster.\n   *\n   * @deprecated Instead, call `getTransaction` using a\n   * `GetVersionedTransactionConfig` by setting the\n   * `maxSupportedTransactionVersion` property.\n   */\n\n  /**\n   * Fetch a confirmed or finalized transaction from the cluster.\n   */\n  // eslint-disable-next-line no-dupe-class-members\n\n  /**\n   * Fetch a confirmed or finalized transaction from the cluster.\n   */\n  // eslint-disable-next-line no-dupe-class-members\n  async getTransaction(signature, rawConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(rawConfig);\n    const args = this._buildArgsAtLeastConfirmed([signature], commitment, undefined /* encoding */, config);\n    const unsafeRes = await this._rpcRequest('getTransaction', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetTransactionRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get transaction');\n    }\n    const result = res.result;\n    if (!result) return result;\n    return {\n      ...result,\n      transaction: {\n        ...result.transaction,\n        message: versionedMessageFromResponse(result.version, result.transaction.message)\n      }\n    };\n  }\n\n  /**\n   * Fetch parsed transaction details for a confirmed or finalized transaction\n   */\n  async getParsedTransaction(signature, commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgsAtLeastConfirmed([signature], commitment, 'jsonParsed', config);\n    const unsafeRes = await this._rpcRequest('getTransaction', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetParsedTransactionRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get transaction');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch parsed transaction details for a batch of confirmed transactions\n   */\n  async getParsedTransactions(signatures, commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const batch = signatures.map(signature => {\n      const args = this._buildArgsAtLeastConfirmed([signature], commitment, 'jsonParsed', config);\n      return {\n        methodName: 'getTransaction',\n        args\n      };\n    });\n    const unsafeRes = await this._rpcBatchRequest(batch);\n    const res = unsafeRes.map(unsafeRes => {\n      const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetParsedTransactionRpcResult);\n      if ('error' in res) {\n        throw new SolanaJSONRPCError(res.error, 'failed to get transactions');\n      }\n      return res.result;\n    });\n    return res;\n  }\n\n  /**\n   * Fetch transaction details for a batch of confirmed transactions.\n   * Similar to {@link getParsedTransactions} but returns a {@link TransactionResponse}.\n   *\n   * @deprecated Instead, call `getTransactions` using a\n   * `GetVersionedTransactionConfig` by setting the\n   * `maxSupportedTransactionVersion` property.\n   */\n\n  /**\n   * Fetch transaction details for a batch of confirmed transactions.\n   * Similar to {@link getParsedTransactions} but returns a {@link\n   * VersionedTransactionResponse}.\n   */\n  // eslint-disable-next-line no-dupe-class-members\n\n  /**\n   * Fetch transaction details for a batch of confirmed transactions.\n   * Similar to {@link getParsedTransactions} but returns a {@link\n   * VersionedTransactionResponse}.\n   */\n  // eslint-disable-next-line no-dupe-class-members\n  async getTransactions(signatures, commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const batch = signatures.map(signature => {\n      const args = this._buildArgsAtLeastConfirmed([signature], commitment, undefined /* encoding */, config);\n      return {\n        methodName: 'getTransaction',\n        args\n      };\n    });\n    const unsafeRes = await this._rpcBatchRequest(batch);\n    const res = unsafeRes.map(unsafeRes => {\n      const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetTransactionRpcResult);\n      if ('error' in res) {\n        throw new SolanaJSONRPCError(res.error, 'failed to get transactions');\n      }\n      const result = res.result;\n      if (!result) return result;\n      return {\n        ...result,\n        transaction: {\n          ...result.transaction,\n          message: versionedMessageFromResponse(result.version, result.transaction.message)\n        }\n      };\n    });\n    return res;\n  }\n\n  /**\n   * Fetch a list of Transactions and transaction statuses from the cluster\n   * for a confirmed block.\n   *\n   * @deprecated Deprecated since RPC v1.7.0. Please use {@link getBlock} instead.\n   */\n  async getConfirmedBlock(slot, commitment) {\n    const args = this._buildArgsAtLeastConfirmed([slot], commitment);\n    const unsafeRes = await this._rpcRequest('getBlock', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetConfirmedBlockRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get confirmed block');\n    }\n    const result = res.result;\n    if (!result) {\n      throw new Error('Confirmed block ' + slot + ' not found');\n    }\n    const block = {\n      ...result,\n      transactions: result.transactions.map(({\n        transaction,\n        meta\n      }) => {\n        const message = new Message(transaction.message);\n        return {\n          meta,\n          transaction: {\n            ...transaction,\n            message\n          }\n        };\n      })\n    };\n    return {\n      ...block,\n      transactions: block.transactions.map(({\n        transaction,\n        meta\n      }) => {\n        return {\n          meta,\n          transaction: Transaction.populate(transaction.message, transaction.signatures)\n        };\n      })\n    };\n  }\n\n  /**\n   * Fetch confirmed blocks between two slots\n   */\n  async getBlocks(startSlot, endSlot, commitment) {\n    const args = this._buildArgsAtLeastConfirmed(endSlot !== undefined ? [startSlot, endSlot] : [startSlot], commitment);\n    const unsafeRes = await this._rpcRequest('getBlocks', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResult((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.array)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)())));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get blocks');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch a list of Signatures from the cluster for a block, excluding rewards\n   */\n  async getBlockSignatures(slot, commitment) {\n    const args = this._buildArgsAtLeastConfirmed([slot], commitment, undefined, {\n      transactionDetails: 'signatures',\n      rewards: false\n    });\n    const unsafeRes = await this._rpcRequest('getBlock', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetBlockSignaturesRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get block');\n    }\n    const result = res.result;\n    if (!result) {\n      throw new Error('Block ' + slot + ' not found');\n    }\n    return result;\n  }\n\n  /**\n   * Fetch a list of Signatures from the cluster for a confirmed block, excluding rewards\n   *\n   * @deprecated Deprecated since RPC v1.7.0. Please use {@link getBlockSignatures} instead.\n   */\n  async getConfirmedBlockSignatures(slot, commitment) {\n    const args = this._buildArgsAtLeastConfirmed([slot], commitment, undefined, {\n      transactionDetails: 'signatures',\n      rewards: false\n    });\n    const unsafeRes = await this._rpcRequest('getBlock', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetBlockSignaturesRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get confirmed block');\n    }\n    const result = res.result;\n    if (!result) {\n      throw new Error('Confirmed block ' + slot + ' not found');\n    }\n    return result;\n  }\n\n  /**\n   * Fetch a transaction details for a confirmed transaction\n   *\n   * @deprecated Deprecated since RPC v1.7.0. Please use {@link getTransaction} instead.\n   */\n  async getConfirmedTransaction(signature, commitment) {\n    const args = this._buildArgsAtLeastConfirmed([signature], commitment);\n    const unsafeRes = await this._rpcRequest('getTransaction', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetTransactionRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get transaction');\n    }\n    const result = res.result;\n    if (!result) return result;\n    const message = new Message(result.transaction.message);\n    const signatures = result.transaction.signatures;\n    return {\n      ...result,\n      transaction: Transaction.populate(message, signatures)\n    };\n  }\n\n  /**\n   * Fetch parsed transaction details for a confirmed transaction\n   *\n   * @deprecated Deprecated since RPC v1.7.0. Please use {@link getParsedTransaction} instead.\n   */\n  async getParsedConfirmedTransaction(signature, commitment) {\n    const args = this._buildArgsAtLeastConfirmed([signature], commitment, 'jsonParsed');\n    const unsafeRes = await this._rpcRequest('getTransaction', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetParsedTransactionRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get confirmed transaction');\n    }\n    return res.result;\n  }\n\n  /**\n   * Fetch parsed transaction details for a batch of confirmed transactions\n   *\n   * @deprecated Deprecated since RPC v1.7.0. Please use {@link getParsedTransactions} instead.\n   */\n  async getParsedConfirmedTransactions(signatures, commitment) {\n    const batch = signatures.map(signature => {\n      const args = this._buildArgsAtLeastConfirmed([signature], commitment, 'jsonParsed');\n      return {\n        methodName: 'getTransaction',\n        args\n      };\n    });\n    const unsafeRes = await this._rpcBatchRequest(batch);\n    const res = unsafeRes.map(unsafeRes => {\n      const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetParsedTransactionRpcResult);\n      if ('error' in res) {\n        throw new SolanaJSONRPCError(res.error, 'failed to get confirmed transactions');\n      }\n      return res.result;\n    });\n    return res;\n  }\n\n  /**\n   * Fetch a list of all the confirmed signatures for transactions involving an address\n   * within a specified slot range. Max range allowed is 10,000 slots.\n   *\n   * @deprecated Deprecated since RPC v1.3. Please use {@link getConfirmedSignaturesForAddress2} instead.\n   *\n   * @param address queried address\n   * @param startSlot start slot, inclusive\n   * @param endSlot end slot, inclusive\n   */\n  async getConfirmedSignaturesForAddress(address, startSlot, endSlot) {\n    let options = {};\n    let firstAvailableBlock = await this.getFirstAvailableBlock();\n    while (!('until' in options)) {\n      startSlot--;\n      if (startSlot <= 0 || startSlot < firstAvailableBlock) {\n        break;\n      }\n      try {\n        const block = await this.getConfirmedBlockSignatures(startSlot, 'finalized');\n        if (block.signatures.length > 0) {\n          options.until = block.signatures[block.signatures.length - 1].toString();\n        }\n      } catch (err) {\n        if (err instanceof Error && err.message.includes('skipped')) {\n          continue;\n        } else {\n          throw err;\n        }\n      }\n    }\n    let highestConfirmedRoot = await this.getSlot('finalized');\n    while (!('before' in options)) {\n      endSlot++;\n      if (endSlot > highestConfirmedRoot) {\n        break;\n      }\n      try {\n        const block = await this.getConfirmedBlockSignatures(endSlot);\n        if (block.signatures.length > 0) {\n          options.before = block.signatures[block.signatures.length - 1].toString();\n        }\n      } catch (err) {\n        if (err instanceof Error && err.message.includes('skipped')) {\n          continue;\n        } else {\n          throw err;\n        }\n      }\n    }\n    const confirmedSignatureInfo = await this.getConfirmedSignaturesForAddress2(address, options);\n    return confirmedSignatureInfo.map(info => info.signature);\n  }\n\n  /**\n   * Returns confirmed signatures for transactions involving an\n   * address backwards in time from the provided signature or most recent confirmed block\n   *\n   * @deprecated Deprecated since RPC v1.7.0. Please use {@link getSignaturesForAddress} instead.\n   */\n  async getConfirmedSignaturesForAddress2(address, options, commitment) {\n    const args = this._buildArgsAtLeastConfirmed([address.toBase58()], commitment, undefined, options);\n    const unsafeRes = await this._rpcRequest('getConfirmedSignaturesForAddress2', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetConfirmedSignaturesForAddress2RpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get confirmed signatures for address');\n    }\n    return res.result;\n  }\n\n  /**\n   * Returns confirmed signatures for transactions involving an\n   * address backwards in time from the provided signature or most recent confirmed block\n   *\n   *\n   * @param address queried address\n   * @param options\n   */\n  async getSignaturesForAddress(address, options, commitment) {\n    const args = this._buildArgsAtLeastConfirmed([address.toBase58()], commitment, undefined, options);\n    const unsafeRes = await this._rpcRequest('getSignaturesForAddress', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, GetSignaturesForAddressRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, 'failed to get signatures for address');\n    }\n    return res.result;\n  }\n  async getAddressLookupTable(accountKey, config) {\n    const {\n      context,\n      value: accountInfo\n    } = await this.getAccountInfoAndContext(accountKey, config);\n    let value = null;\n    if (accountInfo !== null) {\n      value = new AddressLookupTableAccount({\n        key: accountKey,\n        state: AddressLookupTableAccount.deserialize(accountInfo.data)\n      });\n    }\n    return {\n      context,\n      value\n    };\n  }\n\n  /**\n   * Fetch the contents of a Nonce account from the cluster, return with context\n   */\n  async getNonceAndContext(nonceAccount, commitmentOrConfig) {\n    const {\n      context,\n      value: accountInfo\n    } = await this.getAccountInfoAndContext(nonceAccount, commitmentOrConfig);\n    let value = null;\n    if (accountInfo !== null) {\n      value = NonceAccount.fromAccountData(accountInfo.data);\n    }\n    return {\n      context,\n      value\n    };\n  }\n\n  /**\n   * Fetch the contents of a Nonce account from the cluster\n   */\n  async getNonce(nonceAccount, commitmentOrConfig) {\n    return await this.getNonceAndContext(nonceAccount, commitmentOrConfig).then(x => x.value).catch(e => {\n      throw new Error('failed to get nonce for account ' + nonceAccount.toBase58() + ': ' + e);\n    });\n  }\n\n  /**\n   * Request an allocation of lamports to the specified address\n   *\n   * ```typescript\n   * import { Connection, PublicKey, LAMPORTS_PER_SOL } from \"@solana/web3.js\";\n   *\n   * (async () => {\n   *   const connection = new Connection(\"https://api.testnet.solana.com\", \"confirmed\");\n   *   const myAddress = new PublicKey(\"2nr1bHFT86W9tGnyvmYW4vcHKsQB3sVQfnddasz4kExM\");\n   *   const signature = await connection.requestAirdrop(myAddress, LAMPORTS_PER_SOL);\n   *   await connection.confirmTransaction(signature);\n   * })();\n   * ```\n   */\n  async requestAirdrop(to, lamports) {\n    const unsafeRes = await this._rpcRequest('requestAirdrop', [to.toBase58(), lamports]);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, RequestAirdropRpcResult);\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `airdrop to ${to.toBase58()} failed`);\n    }\n    return res.result;\n  }\n\n  /**\n   * @internal\n   */\n  async _blockhashWithExpiryBlockHeight(disableCache) {\n    if (!disableCache) {\n      // Wait for polling to finish\n      while (this._pollingBlockhash) {\n        await sleep(100);\n      }\n      const timeSinceFetch = Date.now() - this._blockhashInfo.lastFetch;\n      const expired = timeSinceFetch >= BLOCKHASH_CACHE_TIMEOUT_MS;\n      if (this._blockhashInfo.latestBlockhash !== null && !expired) {\n        return this._blockhashInfo.latestBlockhash;\n      }\n    }\n    return await this._pollNewBlockhash();\n  }\n\n  /**\n   * @internal\n   */\n  async _pollNewBlockhash() {\n    this._pollingBlockhash = true;\n    try {\n      const startTime = Date.now();\n      const cachedLatestBlockhash = this._blockhashInfo.latestBlockhash;\n      const cachedBlockhash = cachedLatestBlockhash ? cachedLatestBlockhash.blockhash : null;\n      for (let i = 0; i < 50; i++) {\n        const latestBlockhash = await this.getLatestBlockhash('finalized');\n        if (cachedBlockhash !== latestBlockhash.blockhash) {\n          this._blockhashInfo = {\n            latestBlockhash,\n            lastFetch: Date.now(),\n            transactionSignatures: [],\n            simulatedSignatures: []\n          };\n          return latestBlockhash;\n        }\n\n        // Sleep for approximately half a slot\n        await sleep(MS_PER_SLOT / 2);\n      }\n      throw new Error(`Unable to obtain a new blockhash after ${Date.now() - startTime}ms`);\n    } finally {\n      this._pollingBlockhash = false;\n    }\n  }\n\n  /**\n   * get the stake minimum delegation\n   */\n  async getStakeMinimumDelegation(config) {\n    const {\n      commitment,\n      config: configArg\n    } = extractCommitmentFromConfig(config);\n    const args = this._buildArgs([], commitment, 'base64', configArg);\n    const unsafeRes = await this._rpcRequest('getStakeMinimumDelegation', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, jsonRpcResultAndContext((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.number)()));\n    if ('error' in res) {\n      throw new SolanaJSONRPCError(res.error, `failed to get stake minimum delegation`);\n    }\n    return res.result;\n  }\n\n  /**\n   * Simulate a transaction\n   *\n   * @deprecated Instead, call {@link simulateTransaction} with {@link\n   * VersionedTransaction} and {@link SimulateTransactionConfig} parameters\n   */\n\n  /**\n   * Simulate a transaction\n   */\n  // eslint-disable-next-line no-dupe-class-members\n\n  /**\n   * Simulate a transaction\n   */\n  // eslint-disable-next-line no-dupe-class-members\n  async simulateTransaction(transactionOrMessage, configOrSigners, includeAccounts) {\n    if ('message' in transactionOrMessage) {\n      const versionedTx = transactionOrMessage;\n      const wireTransaction = versionedTx.serialize();\n      const encodedTransaction = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(wireTransaction).toString('base64');\n      if (Array.isArray(configOrSigners) || includeAccounts !== undefined) {\n        throw new Error('Invalid arguments');\n      }\n      const config = configOrSigners || {};\n      config.encoding = 'base64';\n      if (!('commitment' in config)) {\n        config.commitment = this.commitment;\n      }\n      if (configOrSigners && typeof configOrSigners === 'object' && 'innerInstructions' in configOrSigners) {\n        config.innerInstructions = configOrSigners.innerInstructions;\n      }\n      const args = [encodedTransaction, config];\n      const unsafeRes = await this._rpcRequest('simulateTransaction', args);\n      const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, SimulatedTransactionResponseStruct);\n      if ('error' in res) {\n        throw new Error('failed to simulate transaction: ' + res.error.message);\n      }\n      return res.result;\n    }\n    let transaction;\n    if (transactionOrMessage instanceof Transaction) {\n      let originalTx = transactionOrMessage;\n      transaction = new Transaction();\n      transaction.feePayer = originalTx.feePayer;\n      transaction.instructions = transactionOrMessage.instructions;\n      transaction.nonceInfo = originalTx.nonceInfo;\n      transaction.signatures = originalTx.signatures;\n    } else {\n      transaction = Transaction.populate(transactionOrMessage);\n      // HACK: this function relies on mutating the populated transaction\n      transaction._message = transaction._json = undefined;\n    }\n    if (configOrSigners !== undefined && !Array.isArray(configOrSigners)) {\n      throw new Error('Invalid arguments');\n    }\n    const signers = configOrSigners;\n    if (transaction.nonceInfo && signers) {\n      transaction.sign(...signers);\n    } else {\n      let disableCache = this._disableBlockhashCaching;\n      for (;;) {\n        const latestBlockhash = await this._blockhashWithExpiryBlockHeight(disableCache);\n        transaction.lastValidBlockHeight = latestBlockhash.lastValidBlockHeight;\n        transaction.recentBlockhash = latestBlockhash.blockhash;\n        if (!signers) break;\n        transaction.sign(...signers);\n        if (!transaction.signature) {\n          throw new Error('!signature'); // should never happen\n        }\n        const signature = transaction.signature.toString('base64');\n        if (!this._blockhashInfo.simulatedSignatures.includes(signature) && !this._blockhashInfo.transactionSignatures.includes(signature)) {\n          // The signature of this transaction has not been seen before with the\n          // current recentBlockhash, all done. Let's break\n          this._blockhashInfo.simulatedSignatures.push(signature);\n          break;\n        } else {\n          // This transaction would be treated as duplicate (its derived signature\n          // matched to one of already recorded signatures).\n          // So, we must fetch a new blockhash for a different signature by disabling\n          // our cache not to wait for the cache expiration (BLOCKHASH_CACHE_TIMEOUT_MS).\n          disableCache = true;\n        }\n      }\n    }\n    const message = transaction._compile();\n    const signData = message.serialize();\n    const wireTransaction = transaction._serialize(signData);\n    const encodedTransaction = wireTransaction.toString('base64');\n    const config = {\n      encoding: 'base64',\n      commitment: this.commitment\n    };\n    if (includeAccounts) {\n      const addresses = (Array.isArray(includeAccounts) ? includeAccounts : message.nonProgramIds()).map(key => key.toBase58());\n      config['accounts'] = {\n        encoding: 'base64',\n        addresses\n      };\n    }\n    if (signers) {\n      config.sigVerify = true;\n    }\n    if (configOrSigners && typeof configOrSigners === 'object' && 'innerInstructions' in configOrSigners) {\n      config.innerInstructions = configOrSigners.innerInstructions;\n    }\n    const args = [encodedTransaction, config];\n    const unsafeRes = await this._rpcRequest('simulateTransaction', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, SimulatedTransactionResponseStruct);\n    if ('error' in res) {\n      let logs;\n      if ('data' in res.error) {\n        logs = res.error.data.logs;\n        if (logs && Array.isArray(logs)) {\n          const traceIndent = '\\n    ';\n          const logTrace = traceIndent + logs.join(traceIndent);\n          console.error(res.error.message, logTrace);\n        }\n      }\n      throw new SendTransactionError({\n        action: 'simulate',\n        signature: '',\n        transactionMessage: res.error.message,\n        logs: logs\n      });\n    }\n    return res.result;\n  }\n\n  /**\n   * Sign and send a transaction\n   *\n   * @deprecated Instead, call {@link sendTransaction} with a {@link\n   * VersionedTransaction}\n   */\n\n  /**\n   * Send a signed transaction\n   */\n  // eslint-disable-next-line no-dupe-class-members\n\n  /**\n   * Sign and send a transaction\n   */\n  // eslint-disable-next-line no-dupe-class-members\n  async sendTransaction(transaction, signersOrOptions, options) {\n    if ('version' in transaction) {\n      if (signersOrOptions && Array.isArray(signersOrOptions)) {\n        throw new Error('Invalid arguments');\n      }\n      const wireTransaction = transaction.serialize();\n      return await this.sendRawTransaction(wireTransaction, signersOrOptions);\n    }\n    if (signersOrOptions === undefined || !Array.isArray(signersOrOptions)) {\n      throw new Error('Invalid arguments');\n    }\n    const signers = signersOrOptions;\n    if (transaction.nonceInfo) {\n      transaction.sign(...signers);\n    } else {\n      let disableCache = this._disableBlockhashCaching;\n      for (;;) {\n        const latestBlockhash = await this._blockhashWithExpiryBlockHeight(disableCache);\n        transaction.lastValidBlockHeight = latestBlockhash.lastValidBlockHeight;\n        transaction.recentBlockhash = latestBlockhash.blockhash;\n        transaction.sign(...signers);\n        if (!transaction.signature) {\n          throw new Error('!signature'); // should never happen\n        }\n        const signature = transaction.signature.toString('base64');\n        if (!this._blockhashInfo.transactionSignatures.includes(signature)) {\n          // The signature of this transaction has not been seen before with the\n          // current recentBlockhash, all done. Let's break\n          this._blockhashInfo.transactionSignatures.push(signature);\n          break;\n        } else {\n          // This transaction would be treated as duplicate (its derived signature\n          // matched to one of already recorded signatures).\n          // So, we must fetch a new blockhash for a different signature by disabling\n          // our cache not to wait for the cache expiration (BLOCKHASH_CACHE_TIMEOUT_MS).\n          disableCache = true;\n        }\n      }\n    }\n    const wireTransaction = transaction.serialize();\n    return await this.sendRawTransaction(wireTransaction, options);\n  }\n\n  /**\n   * Send a transaction that has already been signed and serialized into the\n   * wire format\n   */\n  async sendRawTransaction(rawTransaction, options) {\n    const encodedTransaction = toBuffer(rawTransaction).toString('base64');\n    const result = await this.sendEncodedTransaction(encodedTransaction, options);\n    return result;\n  }\n\n  /**\n   * Send a transaction that has already been signed, serialized into the\n   * wire format, and encoded as a base64 string\n   */\n  async sendEncodedTransaction(encodedTransaction, options) {\n    const config = {\n      encoding: 'base64'\n    };\n    const skipPreflight = options && options.skipPreflight;\n    const preflightCommitment = skipPreflight === true ? 'processed' // FIXME Remove when https://github.com/anza-xyz/agave/pull/483 is deployed.\n    : options && options.preflightCommitment || this.commitment;\n    if (options && options.maxRetries != null) {\n      config.maxRetries = options.maxRetries;\n    }\n    if (options && options.minContextSlot != null) {\n      config.minContextSlot = options.minContextSlot;\n    }\n    if (skipPreflight) {\n      config.skipPreflight = skipPreflight;\n    }\n    if (preflightCommitment) {\n      config.preflightCommitment = preflightCommitment;\n    }\n    const args = [encodedTransaction, config];\n    const unsafeRes = await this._rpcRequest('sendTransaction', args);\n    const res = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(unsafeRes, SendTransactionRpcResult);\n    if ('error' in res) {\n      let logs = undefined;\n      if ('data' in res.error) {\n        logs = res.error.data.logs;\n      }\n      throw new SendTransactionError({\n        action: skipPreflight ? 'send' : 'simulate',\n        signature: '',\n        transactionMessage: res.error.message,\n        logs: logs\n      });\n    }\n    return res.result;\n  }\n\n  /**\n   * @internal\n   */\n  _wsOnOpen() {\n    this._rpcWebSocketConnected = true;\n    this._rpcWebSocketHeartbeat = setInterval(() => {\n      // Ping server every 5s to prevent idle timeouts\n      (async () => {\n        try {\n          await this._rpcWebSocket.notify('ping');\n          // eslint-disable-next-line no-empty\n        } catch {}\n      })();\n    }, 5000);\n    this._updateSubscriptions();\n  }\n\n  /**\n   * @internal\n   */\n  _wsOnError(err) {\n    this._rpcWebSocketConnected = false;\n    console.error('ws error:', err.message);\n  }\n\n  /**\n   * @internal\n   */\n  _wsOnClose(code) {\n    this._rpcWebSocketConnected = false;\n    this._rpcWebSocketGeneration = (this._rpcWebSocketGeneration + 1) % Number.MAX_SAFE_INTEGER;\n    if (this._rpcWebSocketIdleTimeout) {\n      clearTimeout(this._rpcWebSocketIdleTimeout);\n      this._rpcWebSocketIdleTimeout = null;\n    }\n    if (this._rpcWebSocketHeartbeat) {\n      clearInterval(this._rpcWebSocketHeartbeat);\n      this._rpcWebSocketHeartbeat = null;\n    }\n    if (code === 1000) {\n      // explicit close, check if any subscriptions have been made since close\n      this._updateSubscriptions();\n      return;\n    }\n\n    // implicit close, prepare subscriptions for auto-reconnect\n    this._subscriptionCallbacksByServerSubscriptionId = {};\n    Object.entries(this._subscriptionsByHash).forEach(([hash, subscription]) => {\n      this._setSubscription(hash, {\n        ...subscription,\n        state: 'pending'\n      });\n    });\n  }\n\n  /**\n   * @internal\n   */\n  _setSubscription(hash, nextSubscription) {\n    const prevState = this._subscriptionsByHash[hash]?.state;\n    this._subscriptionsByHash[hash] = nextSubscription;\n    if (prevState !== nextSubscription.state) {\n      const stateChangeCallbacks = this._subscriptionStateChangeCallbacksByHash[hash];\n      if (stateChangeCallbacks) {\n        stateChangeCallbacks.forEach(cb => {\n          try {\n            cb(nextSubscription.state);\n            // eslint-disable-next-line no-empty\n          } catch {}\n        });\n      }\n    }\n  }\n\n  /**\n   * @internal\n   */\n  _onSubscriptionStateChange(clientSubscriptionId, callback) {\n    const hash = this._subscriptionHashByClientSubscriptionId[clientSubscriptionId];\n    if (hash == null) {\n      return () => {};\n    }\n    const stateChangeCallbacks = this._subscriptionStateChangeCallbacksByHash[hash] ||= new Set();\n    stateChangeCallbacks.add(callback);\n    return () => {\n      stateChangeCallbacks.delete(callback);\n      if (stateChangeCallbacks.size === 0) {\n        delete this._subscriptionStateChangeCallbacksByHash[hash];\n      }\n    };\n  }\n\n  /**\n   * @internal\n   */\n  async _updateSubscriptions() {\n    if (Object.keys(this._subscriptionsByHash).length === 0) {\n      if (this._rpcWebSocketConnected) {\n        this._rpcWebSocketConnected = false;\n        this._rpcWebSocketIdleTimeout = setTimeout(() => {\n          this._rpcWebSocketIdleTimeout = null;\n          try {\n            this._rpcWebSocket.close();\n          } catch (err) {\n            // swallow error if socket has already been closed.\n            if (err instanceof Error) {\n              console.log(`Error when closing socket connection: ${err.message}`);\n            }\n          }\n        }, 500);\n      }\n      return;\n    }\n    if (this._rpcWebSocketIdleTimeout !== null) {\n      clearTimeout(this._rpcWebSocketIdleTimeout);\n      this._rpcWebSocketIdleTimeout = null;\n      this._rpcWebSocketConnected = true;\n    }\n    if (!this._rpcWebSocketConnected) {\n      this._rpcWebSocket.connect();\n      return;\n    }\n    const activeWebSocketGeneration = this._rpcWebSocketGeneration;\n    const isCurrentConnectionStillActive = () => {\n      return activeWebSocketGeneration === this._rpcWebSocketGeneration;\n    };\n    await Promise.all(\n    // Don't be tempted to change this to `Object.entries`. We call\n    // `_updateSubscriptions` recursively when processing the state,\n    // so it's important that we look up the *current* version of\n    // each subscription, every time we process a hash.\n    Object.keys(this._subscriptionsByHash).map(async hash => {\n      const subscription = this._subscriptionsByHash[hash];\n      if (subscription === undefined) {\n        // This entry has since been deleted. Skip.\n        return;\n      }\n      switch (subscription.state) {\n        case 'pending':\n        case 'unsubscribed':\n          if (subscription.callbacks.size === 0) {\n            /**\n             * You can end up here when:\n             *\n             * - a subscription has recently unsubscribed\n             *   without having new callbacks added to it\n             *   while the unsubscribe was in flight, or\n             * - when a pending subscription has its\n             *   listeners removed before a request was\n             *   sent to the server.\n             *\n             * Being that nobody is interested in this\n             * subscription any longer, delete it.\n             */\n            delete this._subscriptionsByHash[hash];\n            if (subscription.state === 'unsubscribed') {\n              delete this._subscriptionCallbacksByServerSubscriptionId[subscription.serverSubscriptionId];\n            }\n            await this._updateSubscriptions();\n            return;\n          }\n          await (async () => {\n            const {\n              args,\n              method\n            } = subscription;\n            try {\n              this._setSubscription(hash, {\n                ...subscription,\n                state: 'subscribing'\n              });\n              const serverSubscriptionId = await this._rpcWebSocket.call(method, args);\n              this._setSubscription(hash, {\n                ...subscription,\n                serverSubscriptionId,\n                state: 'subscribed'\n              });\n              this._subscriptionCallbacksByServerSubscriptionId[serverSubscriptionId] = subscription.callbacks;\n              await this._updateSubscriptions();\n            } catch (e) {\n              console.error(`Received ${e instanceof Error ? '' : 'JSON-RPC '}error calling \\`${method}\\``, {\n                args,\n                error: e\n              });\n              if (!isCurrentConnectionStillActive()) {\n                return;\n              }\n              // TODO: Maybe add an 'errored' state or a retry limit?\n              this._setSubscription(hash, {\n                ...subscription,\n                state: 'pending'\n              });\n              await this._updateSubscriptions();\n            }\n          })();\n          break;\n        case 'subscribed':\n          if (subscription.callbacks.size === 0) {\n            // By the time we successfully set up a subscription\n            // with the server, the client stopped caring about it.\n            // Tear it down now.\n            await (async () => {\n              const {\n                serverSubscriptionId,\n                unsubscribeMethod\n              } = subscription;\n              if (this._subscriptionsAutoDisposedByRpc.has(serverSubscriptionId)) {\n                /**\n                 * Special case.\n                 * If we're dealing with a subscription that has been auto-\n                 * disposed by the RPC, then we can skip the RPC call to\n                 * tear down the subscription here.\n                 *\n                 * NOTE: There is a proposal to eliminate this special case, here:\n                 * https://github.com/solana-labs/solana/issues/18892\n                 */\n                this._subscriptionsAutoDisposedByRpc.delete(serverSubscriptionId);\n              } else {\n                this._setSubscription(hash, {\n                  ...subscription,\n                  state: 'unsubscribing'\n                });\n                this._setSubscription(hash, {\n                  ...subscription,\n                  state: 'unsubscribing'\n                });\n                try {\n                  await this._rpcWebSocket.call(unsubscribeMethod, [serverSubscriptionId]);\n                } catch (e) {\n                  if (e instanceof Error) {\n                    console.error(`${unsubscribeMethod} error:`, e.message);\n                  }\n                  if (!isCurrentConnectionStillActive()) {\n                    return;\n                  }\n                  // TODO: Maybe add an 'errored' state or a retry limit?\n                  this._setSubscription(hash, {\n                    ...subscription,\n                    state: 'subscribed'\n                  });\n                  await this._updateSubscriptions();\n                  return;\n                }\n              }\n              this._setSubscription(hash, {\n                ...subscription,\n                state: 'unsubscribed'\n              });\n              await this._updateSubscriptions();\n            })();\n          }\n          break;\n      }\n    }));\n  }\n\n  /**\n   * @internal\n   */\n  _handleServerNotification(serverSubscriptionId, callbackArgs) {\n    const callbacks = this._subscriptionCallbacksByServerSubscriptionId[serverSubscriptionId];\n    if (callbacks === undefined) {\n      return;\n    }\n    callbacks.forEach(cb => {\n      try {\n        cb(\n        // I failed to find a way to convince TypeScript that `cb` is of type\n        // `TCallback` which is certainly compatible with `Parameters<TCallback>`.\n        // See https://github.com/microsoft/TypeScript/issues/47615\n        // @ts-ignore\n        ...callbackArgs);\n      } catch (e) {\n        console.error(e);\n      }\n    });\n  }\n\n  /**\n   * @internal\n   */\n  _wsOnAccountNotification(notification) {\n    const {\n      result,\n      subscription\n    } = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(notification, AccountNotificationResult);\n    this._handleServerNotification(subscription, [result.value, result.context]);\n  }\n\n  /**\n   * @internal\n   */\n  _makeSubscription(subscriptionConfig,\n  /**\n   * When preparing `args` for a call to `_makeSubscription`, be sure\n   * to carefully apply a default `commitment` property, if necessary.\n   *\n   * - If the user supplied a `commitment` use that.\n   * - Otherwise, if the `Connection::commitment` is set, use that.\n   * - Otherwise, set it to the RPC server default: `finalized`.\n   *\n   * This is extremely important to ensure that these two fundamentally\n   * identical subscriptions produce the same identifying hash:\n   *\n   * - A subscription made without specifying a commitment.\n   * - A subscription made where the commitment specified is the same\n   *   as the default applied to the subscription above.\n   *\n   * Example; these two subscriptions must produce the same hash:\n   *\n   * - An `accountSubscribe` subscription for `'PUBKEY'`\n   * - An `accountSubscribe` subscription for `'PUBKEY'` with commitment\n   *   `'finalized'`.\n   *\n   * See the 'making a subscription with defaulted params omitted' test\n   * in `connection-subscriptions.ts` for more.\n   */\n  args) {\n    const clientSubscriptionId = this._nextClientSubscriptionId++;\n    const hash = fastStableStringify([subscriptionConfig.method, args]);\n    const existingSubscription = this._subscriptionsByHash[hash];\n    if (existingSubscription === undefined) {\n      this._subscriptionsByHash[hash] = {\n        ...subscriptionConfig,\n        args,\n        callbacks: new Set([subscriptionConfig.callback]),\n        state: 'pending'\n      };\n    } else {\n      existingSubscription.callbacks.add(subscriptionConfig.callback);\n    }\n    this._subscriptionHashByClientSubscriptionId[clientSubscriptionId] = hash;\n    this._subscriptionDisposeFunctionsByClientSubscriptionId[clientSubscriptionId] = async () => {\n      delete this._subscriptionDisposeFunctionsByClientSubscriptionId[clientSubscriptionId];\n      delete this._subscriptionHashByClientSubscriptionId[clientSubscriptionId];\n      const subscription = this._subscriptionsByHash[hash];\n      assert(subscription !== undefined, `Could not find a \\`Subscription\\` when tearing down client subscription #${clientSubscriptionId}`);\n      subscription.callbacks.delete(subscriptionConfig.callback);\n      await this._updateSubscriptions();\n    };\n    this._updateSubscriptions();\n    return clientSubscriptionId;\n  }\n\n  /**\n   * Register a callback to be invoked whenever the specified account changes\n   *\n   * @param publicKey Public key of the account to monitor\n   * @param callback Function to invoke whenever the account is changed\n   * @param config\n   * @return subscription id\n   */\n\n  /** @deprecated Instead, pass in an {@link AccountSubscriptionConfig} */\n  // eslint-disable-next-line no-dupe-class-members\n\n  // eslint-disable-next-line no-dupe-class-members\n  onAccountChange(publicKey, callback, commitmentOrConfig) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([publicKey.toBase58()], commitment || this._commitment || 'finalized',\n    // Apply connection/server default.\n    'base64', config);\n    return this._makeSubscription({\n      callback,\n      method: 'accountSubscribe',\n      unsubscribeMethod: 'accountUnsubscribe'\n    }, args);\n  }\n\n  /**\n   * Deregister an account notification callback\n   *\n   * @param clientSubscriptionId client subscription id to deregister\n   */\n  async removeAccountChangeListener(clientSubscriptionId) {\n    await this._unsubscribeClientSubscription(clientSubscriptionId, 'account change');\n  }\n\n  /**\n   * @internal\n   */\n  _wsOnProgramAccountNotification(notification) {\n    const {\n      result,\n      subscription\n    } = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(notification, ProgramAccountNotificationResult);\n    this._handleServerNotification(subscription, [{\n      accountId: result.value.pubkey,\n      accountInfo: result.value.account\n    }, result.context]);\n  }\n\n  /**\n   * Register a callback to be invoked whenever accounts owned by the\n   * specified program change\n   *\n   * @param programId Public key of the program to monitor\n   * @param callback Function to invoke whenever the account is changed\n   * @param config\n   * @return subscription id\n   */\n\n  /** @deprecated Instead, pass in a {@link ProgramAccountSubscriptionConfig} */\n  // eslint-disable-next-line no-dupe-class-members\n\n  // eslint-disable-next-line no-dupe-class-members\n  onProgramAccountChange(programId, callback, commitmentOrConfig, maybeFilters) {\n    const {\n      commitment,\n      config\n    } = extractCommitmentFromConfig(commitmentOrConfig);\n    const args = this._buildArgs([programId.toBase58()], commitment || this._commitment || 'finalized',\n    // Apply connection/server default.\n    'base64' /* encoding */, config ? config : maybeFilters ? {\n      filters: applyDefaultMemcmpEncodingToFilters(maybeFilters)\n    } : undefined /* extra */);\n    return this._makeSubscription({\n      callback,\n      method: 'programSubscribe',\n      unsubscribeMethod: 'programUnsubscribe'\n    }, args);\n  }\n\n  /**\n   * Deregister an account notification callback\n   *\n   * @param clientSubscriptionId client subscription id to deregister\n   */\n  async removeProgramAccountChangeListener(clientSubscriptionId) {\n    await this._unsubscribeClientSubscription(clientSubscriptionId, 'program account change');\n  }\n\n  /**\n   * Registers a callback to be invoked whenever logs are emitted.\n   */\n  onLogs(filter, callback, commitment) {\n    const args = this._buildArgs([typeof filter === 'object' ? {\n      mentions: [filter.toString()]\n    } : filter], commitment || this._commitment || 'finalized' // Apply connection/server default.\n    );\n    return this._makeSubscription({\n      callback,\n      method: 'logsSubscribe',\n      unsubscribeMethod: 'logsUnsubscribe'\n    }, args);\n  }\n\n  /**\n   * Deregister a logs callback.\n   *\n   * @param clientSubscriptionId client subscription id to deregister.\n   */\n  async removeOnLogsListener(clientSubscriptionId) {\n    await this._unsubscribeClientSubscription(clientSubscriptionId, 'logs');\n  }\n\n  /**\n   * @internal\n   */\n  _wsOnLogsNotification(notification) {\n    const {\n      result,\n      subscription\n    } = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(notification, LogsNotificationResult);\n    this._handleServerNotification(subscription, [result.value, result.context]);\n  }\n\n  /**\n   * @internal\n   */\n  _wsOnSlotNotification(notification) {\n    const {\n      result,\n      subscription\n    } = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(notification, SlotNotificationResult);\n    this._handleServerNotification(subscription, [result]);\n  }\n\n  /**\n   * Register a callback to be invoked upon slot changes\n   *\n   * @param callback Function to invoke whenever the slot changes\n   * @return subscription id\n   */\n  onSlotChange(callback) {\n    return this._makeSubscription({\n      callback,\n      method: 'slotSubscribe',\n      unsubscribeMethod: 'slotUnsubscribe'\n    }, [] /* args */);\n  }\n\n  /**\n   * Deregister a slot notification callback\n   *\n   * @param clientSubscriptionId client subscription id to deregister\n   */\n  async removeSlotChangeListener(clientSubscriptionId) {\n    await this._unsubscribeClientSubscription(clientSubscriptionId, 'slot change');\n  }\n\n  /**\n   * @internal\n   */\n  _wsOnSlotUpdatesNotification(notification) {\n    const {\n      result,\n      subscription\n    } = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(notification, SlotUpdateNotificationResult);\n    this._handleServerNotification(subscription, [result]);\n  }\n\n  /**\n   * Register a callback to be invoked upon slot updates. {@link SlotUpdate}'s\n   * may be useful to track live progress of a cluster.\n   *\n   * @param callback Function to invoke whenever the slot updates\n   * @return subscription id\n   */\n  onSlotUpdate(callback) {\n    return this._makeSubscription({\n      callback,\n      method: 'slotsUpdatesSubscribe',\n      unsubscribeMethod: 'slotsUpdatesUnsubscribe'\n    }, [] /* args */);\n  }\n\n  /**\n   * Deregister a slot update notification callback\n   *\n   * @param clientSubscriptionId client subscription id to deregister\n   */\n  async removeSlotUpdateListener(clientSubscriptionId) {\n    await this._unsubscribeClientSubscription(clientSubscriptionId, 'slot update');\n  }\n\n  /**\n   * @internal\n   */\n\n  async _unsubscribeClientSubscription(clientSubscriptionId, subscriptionName) {\n    const dispose = this._subscriptionDisposeFunctionsByClientSubscriptionId[clientSubscriptionId];\n    if (dispose) {\n      await dispose();\n    } else {\n      console.warn('Ignored unsubscribe request because an active subscription with id ' + `\\`${clientSubscriptionId}\\` for '${subscriptionName}' events ` + 'could not be found.');\n    }\n  }\n  _buildArgs(args, override, encoding, extra) {\n    const commitment = override || this._commitment;\n    if (commitment || encoding || extra) {\n      let options = {};\n      if (encoding) {\n        options.encoding = encoding;\n      }\n      if (commitment) {\n        options.commitment = commitment;\n      }\n      if (extra) {\n        options = Object.assign(options, extra);\n      }\n      args.push(options);\n    }\n    return args;\n  }\n\n  /**\n   * @internal\n   */\n  _buildArgsAtLeastConfirmed(args, override, encoding, extra) {\n    const commitment = override || this._commitment;\n    if (commitment && !['confirmed', 'finalized'].includes(commitment)) {\n      throw new Error('Using Connection with default commitment: `' + this._commitment + '`, but method requires at least `confirmed`');\n    }\n    return this._buildArgs(args, override, encoding, extra);\n  }\n\n  /**\n   * @internal\n   */\n  _wsOnSignatureNotification(notification) {\n    const {\n      result,\n      subscription\n    } = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(notification, SignatureNotificationResult);\n    if (result.value !== 'receivedSignature') {\n      /**\n       * Special case.\n       * After a signature is processed, RPCs automatically dispose of the\n       * subscription on the server side. We need to track which of these\n       * subscriptions have been disposed in such a way, so that we know\n       * whether the client is dealing with a not-yet-processed signature\n       * (in which case we must tear down the server subscription) or an\n       * already-processed signature (in which case the client can simply\n       * clear out the subscription locally without telling the server).\n       *\n       * NOTE: There is a proposal to eliminate this special case, here:\n       * https://github.com/solana-labs/solana/issues/18892\n       */\n      this._subscriptionsAutoDisposedByRpc.add(subscription);\n    }\n    this._handleServerNotification(subscription, result.value === 'receivedSignature' ? [{\n      type: 'received'\n    }, result.context] : [{\n      type: 'status',\n      result: result.value\n    }, result.context]);\n  }\n\n  /**\n   * Register a callback to be invoked upon signature updates\n   *\n   * @param signature Transaction signature string in base 58\n   * @param callback Function to invoke on signature notifications\n   * @param commitment Specify the commitment level signature must reach before notification\n   * @return subscription id\n   */\n  onSignature(signature, callback, commitment) {\n    const args = this._buildArgs([signature], commitment || this._commitment || 'finalized' // Apply connection/server default.\n    );\n    const clientSubscriptionId = this._makeSubscription({\n      callback: (notification, context) => {\n        if (notification.type === 'status') {\n          callback(notification.result, context);\n          // Signatures subscriptions are auto-removed by the RPC service\n          // so no need to explicitly send an unsubscribe message.\n          try {\n            this.removeSignatureListener(clientSubscriptionId);\n            // eslint-disable-next-line no-empty\n          } catch (_err) {\n            // Already removed.\n          }\n        }\n      },\n      method: 'signatureSubscribe',\n      unsubscribeMethod: 'signatureUnsubscribe'\n    }, args);\n    return clientSubscriptionId;\n  }\n\n  /**\n   * Register a callback to be invoked when a transaction is\n   * received and/or processed.\n   *\n   * @param signature Transaction signature string in base 58\n   * @param callback Function to invoke on signature notifications\n   * @param options Enable received notifications and set the commitment\n   *   level that signature must reach before notification\n   * @return subscription id\n   */\n  onSignatureWithOptions(signature, callback, options) {\n    const {\n      commitment,\n      ...extra\n    } = {\n      ...options,\n      commitment: options && options.commitment || this._commitment || 'finalized' // Apply connection/server default.\n    };\n    const args = this._buildArgs([signature], commitment, undefined /* encoding */, extra);\n    const clientSubscriptionId = this._makeSubscription({\n      callback: (notification, context) => {\n        callback(notification, context);\n        // Signatures subscriptions are auto-removed by the RPC service\n        // so no need to explicitly send an unsubscribe message.\n        try {\n          this.removeSignatureListener(clientSubscriptionId);\n          // eslint-disable-next-line no-empty\n        } catch (_err) {\n          // Already removed.\n        }\n      },\n      method: 'signatureSubscribe',\n      unsubscribeMethod: 'signatureUnsubscribe'\n    }, args);\n    return clientSubscriptionId;\n  }\n\n  /**\n   * Deregister a signature notification callback\n   *\n   * @param clientSubscriptionId client subscription id to deregister\n   */\n  async removeSignatureListener(clientSubscriptionId) {\n    await this._unsubscribeClientSubscription(clientSubscriptionId, 'signature result');\n  }\n\n  /**\n   * @internal\n   */\n  _wsOnRootNotification(notification) {\n    const {\n      result,\n      subscription\n    } = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.create)(notification, RootNotificationResult);\n    this._handleServerNotification(subscription, [result]);\n  }\n\n  /**\n   * Register a callback to be invoked upon root changes\n   *\n   * @param callback Function to invoke whenever the root changes\n   * @return subscription id\n   */\n  onRootChange(callback) {\n    return this._makeSubscription({\n      callback,\n      method: 'rootSubscribe',\n      unsubscribeMethod: 'rootUnsubscribe'\n    }, [] /* args */);\n  }\n\n  /**\n   * Deregister a root notification callback\n   *\n   * @param clientSubscriptionId client subscription id to deregister\n   */\n  async removeRootChangeListener(clientSubscriptionId) {\n    await this._unsubscribeClientSubscription(clientSubscriptionId, 'root change');\n  }\n}\n\n/**\n * Keypair signer interface\n */\n\n/**\n * An account keypair used for signing transactions.\n */\nclass Keypair {\n  /**\n   * Create a new keypair instance.\n   * Generate random keypair if no {@link Ed25519Keypair} is provided.\n   *\n   * @param {Ed25519Keypair} keypair ed25519 keypair\n   */\n  constructor(keypair) {\n    this._keypair = void 0;\n    this._keypair = keypair ?? generateKeypair();\n  }\n\n  /**\n   * Generate a new random keypair\n   *\n   * @returns {Keypair} Keypair\n   */\n  static generate() {\n    return new Keypair(generateKeypair());\n  }\n\n  /**\n   * Create a keypair from a raw secret key byte array.\n   *\n   * This method should only be used to recreate a keypair from a previously\n   * generated secret key. Generating keypairs from a random seed should be done\n   * with the {@link Keypair.fromSeed} method.\n   *\n   * @throws error if the provided secret key is invalid and validation is not skipped.\n   *\n   * @param secretKey secret key byte array\n   * @param options skip secret key validation\n   *\n   * @returns {Keypair} Keypair\n   */\n  static fromSecretKey(secretKey, options) {\n    if (secretKey.byteLength !== 64) {\n      throw new Error('bad secret key size');\n    }\n    const publicKey = secretKey.slice(32, 64);\n    if (!options || !options.skipValidation) {\n      const privateScalar = secretKey.slice(0, 32);\n      const computedPublicKey = getPublicKey(privateScalar);\n      for (let ii = 0; ii < 32; ii++) {\n        if (publicKey[ii] !== computedPublicKey[ii]) {\n          throw new Error('provided secretKey is invalid');\n        }\n      }\n    }\n    return new Keypair({\n      publicKey,\n      secretKey\n    });\n  }\n\n  /**\n   * Generate a keypair from a 32 byte seed.\n   *\n   * @param seed seed byte array\n   *\n   * @returns {Keypair} Keypair\n   */\n  static fromSeed(seed) {\n    const publicKey = getPublicKey(seed);\n    const secretKey = new Uint8Array(64);\n    secretKey.set(seed);\n    secretKey.set(publicKey, 32);\n    return new Keypair({\n      publicKey,\n      secretKey\n    });\n  }\n\n  /**\n   * The public key for this keypair\n   *\n   * @returns {PublicKey} PublicKey\n   */\n  get publicKey() {\n    return new PublicKey(this._keypair.publicKey);\n  }\n\n  /**\n   * The raw secret key for this keypair\n   * @returns {Uint8Array} Secret key in an array of Uint8 bytes\n   */\n  get secretKey() {\n    return new Uint8Array(this._keypair.secretKey);\n  }\n}\n\n/**\n * An enumeration of valid LookupTableInstructionType's\n */\n\n/**\n * An enumeration of valid address lookup table InstructionType's\n * @internal\n */\nconst LOOKUP_TABLE_INSTRUCTION_LAYOUTS = Object.freeze({\n  CreateLookupTable: {\n    index: 0,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), u64('recentSlot'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('bumpSeed')])\n  },\n  FreezeLookupTable: {\n    index: 1,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction')])\n  },\n  ExtendLookupTable: {\n    index: 2,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), u64(), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(publicKey(), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.offset(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32(), -8), 'addresses')])\n  },\n  DeactivateLookupTable: {\n    index: 3,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction')])\n  },\n  CloseLookupTable: {\n    index: 4,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction')])\n  }\n});\nclass AddressLookupTableInstruction {\n  /**\n   * @internal\n   */\n  constructor() {}\n  static decodeInstructionType(instruction) {\n    this.checkProgramId(instruction.programId);\n    const instructionTypeLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction');\n    const index = instructionTypeLayout.decode(instruction.data);\n    let type;\n    for (const [layoutType, layout] of Object.entries(LOOKUP_TABLE_INSTRUCTION_LAYOUTS)) {\n      if (layout.index == index) {\n        type = layoutType;\n        break;\n      }\n    }\n    if (!type) {\n      throw new Error('Invalid Instruction. Should be a LookupTable Instruction');\n    }\n    return type;\n  }\n  static decodeCreateLookupTable(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeysLength(instruction.keys, 4);\n    const {\n      recentSlot\n    } = decodeData$1(LOOKUP_TABLE_INSTRUCTION_LAYOUTS.CreateLookupTable, instruction.data);\n    return {\n      authority: instruction.keys[1].pubkey,\n      payer: instruction.keys[2].pubkey,\n      recentSlot: Number(recentSlot)\n    };\n  }\n  static decodeExtendLookupTable(instruction) {\n    this.checkProgramId(instruction.programId);\n    if (instruction.keys.length < 2) {\n      throw new Error(`invalid instruction; found ${instruction.keys.length} keys, expected at least 2`);\n    }\n    const {\n      addresses\n    } = decodeData$1(LOOKUP_TABLE_INSTRUCTION_LAYOUTS.ExtendLookupTable, instruction.data);\n    return {\n      lookupTable: instruction.keys[0].pubkey,\n      authority: instruction.keys[1].pubkey,\n      payer: instruction.keys.length > 2 ? instruction.keys[2].pubkey : undefined,\n      addresses: addresses.map(buffer => new PublicKey(buffer))\n    };\n  }\n  static decodeCloseLookupTable(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeysLength(instruction.keys, 3);\n    return {\n      lookupTable: instruction.keys[0].pubkey,\n      authority: instruction.keys[1].pubkey,\n      recipient: instruction.keys[2].pubkey\n    };\n  }\n  static decodeFreezeLookupTable(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeysLength(instruction.keys, 2);\n    return {\n      lookupTable: instruction.keys[0].pubkey,\n      authority: instruction.keys[1].pubkey\n    };\n  }\n  static decodeDeactivateLookupTable(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeysLength(instruction.keys, 2);\n    return {\n      lookupTable: instruction.keys[0].pubkey,\n      authority: instruction.keys[1].pubkey\n    };\n  }\n\n  /**\n   * @internal\n   */\n  static checkProgramId(programId) {\n    if (!programId.equals(AddressLookupTableProgram.programId)) {\n      throw new Error('invalid instruction; programId is not AddressLookupTable Program');\n    }\n  }\n  /**\n   * @internal\n   */\n  static checkKeysLength(keys, expectedLength) {\n    if (keys.length < expectedLength) {\n      throw new Error(`invalid instruction; found ${keys.length} keys, expected at least ${expectedLength}`);\n    }\n  }\n}\nclass AddressLookupTableProgram {\n  /**\n   * @internal\n   */\n  constructor() {}\n  static createLookupTable(params) {\n    const [lookupTableAddress, bumpSeed] = PublicKey.findProgramAddressSync([params.authority.toBuffer(), (0,_solana_codecs_numbers__WEBPACK_IMPORTED_MODULE_9__.getU64Encoder)().encode(params.recentSlot)], this.programId);\n    const type = LOOKUP_TABLE_INSTRUCTION_LAYOUTS.CreateLookupTable;\n    const data = encodeData(type, {\n      recentSlot: BigInt(params.recentSlot),\n      bumpSeed: bumpSeed\n    });\n    const keys = [{\n      pubkey: lookupTableAddress,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: params.authority,\n      isSigner: true,\n      isWritable: false\n    }, {\n      pubkey: params.payer,\n      isSigner: true,\n      isWritable: true\n    }, {\n      pubkey: SystemProgram.programId,\n      isSigner: false,\n      isWritable: false\n    }];\n    return [new TransactionInstruction({\n      programId: this.programId,\n      keys: keys,\n      data: data\n    }), lookupTableAddress];\n  }\n  static freezeLookupTable(params) {\n    const type = LOOKUP_TABLE_INSTRUCTION_LAYOUTS.FreezeLookupTable;\n    const data = encodeData(type);\n    const keys = [{\n      pubkey: params.lookupTable,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: params.authority,\n      isSigner: true,\n      isWritable: false\n    }];\n    return new TransactionInstruction({\n      programId: this.programId,\n      keys: keys,\n      data: data\n    });\n  }\n  static extendLookupTable(params) {\n    const type = LOOKUP_TABLE_INSTRUCTION_LAYOUTS.ExtendLookupTable;\n    const data = encodeData(type, {\n      addresses: params.addresses.map(addr => addr.toBytes())\n    });\n    const keys = [{\n      pubkey: params.lookupTable,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: params.authority,\n      isSigner: true,\n      isWritable: false\n    }];\n    if (params.payer) {\n      keys.push({\n        pubkey: params.payer,\n        isSigner: true,\n        isWritable: true\n      }, {\n        pubkey: SystemProgram.programId,\n        isSigner: false,\n        isWritable: false\n      });\n    }\n    return new TransactionInstruction({\n      programId: this.programId,\n      keys: keys,\n      data: data\n    });\n  }\n  static deactivateLookupTable(params) {\n    const type = LOOKUP_TABLE_INSTRUCTION_LAYOUTS.DeactivateLookupTable;\n    const data = encodeData(type);\n    const keys = [{\n      pubkey: params.lookupTable,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: params.authority,\n      isSigner: true,\n      isWritable: false\n    }];\n    return new TransactionInstruction({\n      programId: this.programId,\n      keys: keys,\n      data: data\n    });\n  }\n  static closeLookupTable(params) {\n    const type = LOOKUP_TABLE_INSTRUCTION_LAYOUTS.CloseLookupTable;\n    const data = encodeData(type);\n    const keys = [{\n      pubkey: params.lookupTable,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: params.authority,\n      isSigner: true,\n      isWritable: false\n    }, {\n      pubkey: params.recipient,\n      isSigner: false,\n      isWritable: true\n    }];\n    return new TransactionInstruction({\n      programId: this.programId,\n      keys: keys,\n      data: data\n    });\n  }\n}\nAddressLookupTableProgram.programId = new PublicKey('AddressLookupTab1e1111111111111111111111111');\n\n/**\n * Compute Budget Instruction class\n */\nclass ComputeBudgetInstruction {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Decode a compute budget instruction and retrieve the instruction type.\n   */\n  static decodeInstructionType(instruction) {\n    this.checkProgramId(instruction.programId);\n    const instructionTypeLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('instruction');\n    const typeIndex = instructionTypeLayout.decode(instruction.data);\n    let type;\n    for (const [ixType, layout] of Object.entries(COMPUTE_BUDGET_INSTRUCTION_LAYOUTS)) {\n      if (layout.index == typeIndex) {\n        type = ixType;\n        break;\n      }\n    }\n    if (!type) {\n      throw new Error('Instruction type incorrect; not a ComputeBudgetInstruction');\n    }\n    return type;\n  }\n\n  /**\n   * Decode request units compute budget instruction and retrieve the instruction params.\n   */\n  static decodeRequestUnits(instruction) {\n    this.checkProgramId(instruction.programId);\n    const {\n      units,\n      additionalFee\n    } = decodeData$1(COMPUTE_BUDGET_INSTRUCTION_LAYOUTS.RequestUnits, instruction.data);\n    return {\n      units,\n      additionalFee\n    };\n  }\n\n  /**\n   * Decode request heap frame compute budget instruction and retrieve the instruction params.\n   */\n  static decodeRequestHeapFrame(instruction) {\n    this.checkProgramId(instruction.programId);\n    const {\n      bytes\n    } = decodeData$1(COMPUTE_BUDGET_INSTRUCTION_LAYOUTS.RequestHeapFrame, instruction.data);\n    return {\n      bytes\n    };\n  }\n\n  /**\n   * Decode set compute unit limit compute budget instruction and retrieve the instruction params.\n   */\n  static decodeSetComputeUnitLimit(instruction) {\n    this.checkProgramId(instruction.programId);\n    const {\n      units\n    } = decodeData$1(COMPUTE_BUDGET_INSTRUCTION_LAYOUTS.SetComputeUnitLimit, instruction.data);\n    return {\n      units\n    };\n  }\n\n  /**\n   * Decode set compute unit price compute budget instruction and retrieve the instruction params.\n   */\n  static decodeSetComputeUnitPrice(instruction) {\n    this.checkProgramId(instruction.programId);\n    const {\n      microLamports\n    } = decodeData$1(COMPUTE_BUDGET_INSTRUCTION_LAYOUTS.SetComputeUnitPrice, instruction.data);\n    return {\n      microLamports\n    };\n  }\n\n  /**\n   * @internal\n   */\n  static checkProgramId(programId) {\n    if (!programId.equals(ComputeBudgetProgram.programId)) {\n      throw new Error('invalid instruction; programId is not ComputeBudgetProgram');\n    }\n  }\n}\n\n/**\n * An enumeration of valid ComputeBudgetInstructionType's\n */\n\n/**\n * Request units instruction params\n */\n\n/**\n * Request heap frame instruction params\n */\n\n/**\n * Set compute unit limit instruction params\n */\n\n/**\n * Set compute unit price instruction params\n */\n\n/**\n * An enumeration of valid ComputeBudget InstructionType's\n * @internal\n */\nconst COMPUTE_BUDGET_INSTRUCTION_LAYOUTS = Object.freeze({\n  RequestUnits: {\n    index: 0,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('instruction'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('units'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('additionalFee')])\n  },\n  RequestHeapFrame: {\n    index: 1,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('instruction'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('bytes')])\n  },\n  SetComputeUnitLimit: {\n    index: 2,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('instruction'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('units')])\n  },\n  SetComputeUnitPrice: {\n    index: 3,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('instruction'), u64('microLamports')])\n  }\n});\n\n/**\n * Factory class for transaction instructions to interact with the Compute Budget program\n */\nclass ComputeBudgetProgram {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Public key that identifies the Compute Budget program\n   */\n\n  /**\n   * @deprecated Instead, call {@link setComputeUnitLimit} and/or {@link setComputeUnitPrice}\n   */\n  static requestUnits(params) {\n    const type = COMPUTE_BUDGET_INSTRUCTION_LAYOUTS.RequestUnits;\n    const data = encodeData(type, params);\n    return new TransactionInstruction({\n      keys: [],\n      programId: this.programId,\n      data\n    });\n  }\n  static requestHeapFrame(params) {\n    const type = COMPUTE_BUDGET_INSTRUCTION_LAYOUTS.RequestHeapFrame;\n    const data = encodeData(type, params);\n    return new TransactionInstruction({\n      keys: [],\n      programId: this.programId,\n      data\n    });\n  }\n  static setComputeUnitLimit(params) {\n    const type = COMPUTE_BUDGET_INSTRUCTION_LAYOUTS.SetComputeUnitLimit;\n    const data = encodeData(type, params);\n    return new TransactionInstruction({\n      keys: [],\n      programId: this.programId,\n      data\n    });\n  }\n  static setComputeUnitPrice(params) {\n    const type = COMPUTE_BUDGET_INSTRUCTION_LAYOUTS.SetComputeUnitPrice;\n    const data = encodeData(type, {\n      microLamports: BigInt(params.microLamports)\n    });\n    return new TransactionInstruction({\n      keys: [],\n      programId: this.programId,\n      data\n    });\n  }\n}\nComputeBudgetProgram.programId = new PublicKey('ComputeBudget111111111111111111111111111111');\n\nconst PRIVATE_KEY_BYTES$1 = 64;\nconst PUBLIC_KEY_BYTES$1 = 32;\nconst SIGNATURE_BYTES = 64;\n\n/**\n * Params for creating an ed25519 instruction using a public key\n */\n\n/**\n * Params for creating an ed25519 instruction using a private key\n */\n\nconst ED25519_INSTRUCTION_LAYOUT = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('numSignatures'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('padding'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('signatureOffset'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('signatureInstructionIndex'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('publicKeyOffset'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('publicKeyInstructionIndex'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('messageDataOffset'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('messageDataSize'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('messageInstructionIndex')]);\nclass Ed25519Program {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Public key that identifies the ed25519 program\n   */\n\n  /**\n   * Create an ed25519 instruction with a public key and signature. The\n   * public key must be a buffer that is 32 bytes long, and the signature\n   * must be a buffer of 64 bytes.\n   */\n  static createInstructionWithPublicKey(params) {\n    const {\n      publicKey,\n      message,\n      signature,\n      instructionIndex\n    } = params;\n    assert(publicKey.length === PUBLIC_KEY_BYTES$1, `Public Key must be ${PUBLIC_KEY_BYTES$1} bytes but received ${publicKey.length} bytes`);\n    assert(signature.length === SIGNATURE_BYTES, `Signature must be ${SIGNATURE_BYTES} bytes but received ${signature.length} bytes`);\n    const publicKeyOffset = ED25519_INSTRUCTION_LAYOUT.span;\n    const signatureOffset = publicKeyOffset + publicKey.length;\n    const messageDataOffset = signatureOffset + signature.length;\n    const numSignatures = 1;\n    const instructionData = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(messageDataOffset + message.length);\n    const index = instructionIndex == null ? 0xffff // An index of `u16::MAX` makes it default to the current instruction.\n    : instructionIndex;\n    ED25519_INSTRUCTION_LAYOUT.encode({\n      numSignatures,\n      padding: 0,\n      signatureOffset,\n      signatureInstructionIndex: index,\n      publicKeyOffset,\n      publicKeyInstructionIndex: index,\n      messageDataOffset,\n      messageDataSize: message.length,\n      messageInstructionIndex: index\n    }, instructionData);\n    instructionData.fill(publicKey, publicKeyOffset);\n    instructionData.fill(signature, signatureOffset);\n    instructionData.fill(message, messageDataOffset);\n    return new TransactionInstruction({\n      keys: [],\n      programId: Ed25519Program.programId,\n      data: instructionData\n    });\n  }\n\n  /**\n   * Create an ed25519 instruction with a private key. The private key\n   * must be a buffer that is 64 bytes long.\n   */\n  static createInstructionWithPrivateKey(params) {\n    const {\n      privateKey,\n      message,\n      instructionIndex\n    } = params;\n    assert(privateKey.length === PRIVATE_KEY_BYTES$1, `Private key must be ${PRIVATE_KEY_BYTES$1} bytes but received ${privateKey.length} bytes`);\n    try {\n      const keypair = Keypair.fromSecretKey(privateKey);\n      const publicKey = keypair.publicKey.toBytes();\n      const signature = sign(message, keypair.secretKey);\n      return this.createInstructionWithPublicKey({\n        publicKey,\n        message,\n        signature,\n        instructionIndex\n      });\n    } catch (error) {\n      throw new Error(`Error creating instruction; ${error}`);\n    }\n  }\n}\nEd25519Program.programId = new PublicKey('Ed25519SigVerify111111111111111111111111111');\n\nconst ecdsaSign = (msgHash, privKey) => {\n  const signature = _noble_curves_secp256k1__WEBPACK_IMPORTED_MODULE_11__.secp256k1.sign(msgHash, privKey);\n  return [signature.toCompactRawBytes(), signature.recovery];\n};\n_noble_curves_secp256k1__WEBPACK_IMPORTED_MODULE_11__.secp256k1.utils.isValidPrivateKey;\nconst publicKeyCreate = _noble_curves_secp256k1__WEBPACK_IMPORTED_MODULE_11__.secp256k1.getPublicKey;\n\nconst PRIVATE_KEY_BYTES = 32;\nconst ETHEREUM_ADDRESS_BYTES = 20;\nconst PUBLIC_KEY_BYTES = 64;\nconst SIGNATURE_OFFSETS_SERIALIZED_SIZE = 11;\n\n/**\n * Params for creating an secp256k1 instruction using a public key\n */\n\n/**\n * Params for creating an secp256k1 instruction using an Ethereum address\n */\n\n/**\n * Params for creating an secp256k1 instruction using a private key\n */\n\nconst SECP256K1_INSTRUCTION_LAYOUT = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('numSignatures'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('signatureOffset'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('signatureInstructionIndex'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('ethAddressOffset'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('ethAddressInstructionIndex'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('messageDataOffset'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u16('messageDataSize'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('messageInstructionIndex'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(20, 'ethAddress'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.blob(64, 'signature'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('recoveryId')]);\nclass Secp256k1Program {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Public key that identifies the secp256k1 program\n   */\n\n  /**\n   * Construct an Ethereum address from a secp256k1 public key buffer.\n   * @param {Buffer} publicKey a 64 byte secp256k1 public key buffer\n   */\n  static publicKeyToEthAddress(publicKey) {\n    assert(publicKey.length === PUBLIC_KEY_BYTES, `Public key must be ${PUBLIC_KEY_BYTES} bytes but received ${publicKey.length} bytes`);\n    try {\n      return buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from((0,_noble_hashes_sha3__WEBPACK_IMPORTED_MODULE_12__.keccak_256)(toBuffer(publicKey))).slice(-ETHEREUM_ADDRESS_BYTES);\n    } catch (error) {\n      throw new Error(`Error constructing Ethereum address: ${error}`);\n    }\n  }\n\n  /**\n   * Create an secp256k1 instruction with a public key. The public key\n   * must be a buffer that is 64 bytes long.\n   */\n  static createInstructionWithPublicKey(params) {\n    const {\n      publicKey,\n      message,\n      signature,\n      recoveryId,\n      instructionIndex\n    } = params;\n    return Secp256k1Program.createInstructionWithEthAddress({\n      ethAddress: Secp256k1Program.publicKeyToEthAddress(publicKey),\n      message,\n      signature,\n      recoveryId,\n      instructionIndex\n    });\n  }\n\n  /**\n   * Create an secp256k1 instruction with an Ethereum address. The address\n   * must be a hex string or a buffer that is 20 bytes long.\n   */\n  static createInstructionWithEthAddress(params) {\n    const {\n      ethAddress: rawAddress,\n      message,\n      signature,\n      recoveryId,\n      instructionIndex = 0\n    } = params;\n    let ethAddress;\n    if (typeof rawAddress === 'string') {\n      if (rawAddress.startsWith('0x')) {\n        ethAddress = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(rawAddress.substr(2), 'hex');\n      } else {\n        ethAddress = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(rawAddress, 'hex');\n      }\n    } else {\n      ethAddress = rawAddress;\n    }\n    assert(ethAddress.length === ETHEREUM_ADDRESS_BYTES, `Address must be ${ETHEREUM_ADDRESS_BYTES} bytes but received ${ethAddress.length} bytes`);\n    const dataStart = 1 + SIGNATURE_OFFSETS_SERIALIZED_SIZE;\n    const ethAddressOffset = dataStart;\n    const signatureOffset = dataStart + ethAddress.length;\n    const messageDataOffset = signatureOffset + signature.length + 1;\n    const numSignatures = 1;\n    const instructionData = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.alloc(SECP256K1_INSTRUCTION_LAYOUT.span + message.length);\n    SECP256K1_INSTRUCTION_LAYOUT.encode({\n      numSignatures,\n      signatureOffset,\n      signatureInstructionIndex: instructionIndex,\n      ethAddressOffset,\n      ethAddressInstructionIndex: instructionIndex,\n      messageDataOffset,\n      messageDataSize: message.length,\n      messageInstructionIndex: instructionIndex,\n      signature: toBuffer(signature),\n      ethAddress: toBuffer(ethAddress),\n      recoveryId\n    }, instructionData);\n    instructionData.fill(toBuffer(message), SECP256K1_INSTRUCTION_LAYOUT.span);\n    return new TransactionInstruction({\n      keys: [],\n      programId: Secp256k1Program.programId,\n      data: instructionData\n    });\n  }\n\n  /**\n   * Create an secp256k1 instruction with a private key. The private key\n   * must be a buffer that is 32 bytes long.\n   */\n  static createInstructionWithPrivateKey(params) {\n    const {\n      privateKey: pkey,\n      message,\n      instructionIndex\n    } = params;\n    assert(pkey.length === PRIVATE_KEY_BYTES, `Private key must be ${PRIVATE_KEY_BYTES} bytes but received ${pkey.length} bytes`);\n    try {\n      const privateKey = toBuffer(pkey);\n      const publicKey = publicKeyCreate(privateKey, false /* isCompressed */).slice(1); // throw away leading byte\n      const messageHash = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from((0,_noble_hashes_sha3__WEBPACK_IMPORTED_MODULE_12__.keccak_256)(toBuffer(message)));\n      const [signature, recoveryId] = ecdsaSign(messageHash, privateKey);\n      return this.createInstructionWithPublicKey({\n        publicKey,\n        message,\n        signature,\n        recoveryId,\n        instructionIndex\n      });\n    } catch (error) {\n      throw new Error(`Error creating instruction; ${error}`);\n    }\n  }\n}\nSecp256k1Program.programId = new PublicKey('KeccakSecp256k11111111111111111111111111111');\n\nvar _Lockup;\n\n/**\n * Address of the stake config account which configures the rate\n * of stake warmup and cooldown as well as the slashing penalty.\n */\nconst STAKE_CONFIG_ID = new PublicKey('StakeConfig11111111111111111111111111111111');\n\n/**\n * Stake account authority info\n */\nclass Authorized {\n  /**\n   * Create a new Authorized object\n   * @param staker the stake authority\n   * @param withdrawer the withdraw authority\n   */\n  constructor(staker, withdrawer) {\n    /** stake authority */\n    this.staker = void 0;\n    /** withdraw authority */\n    this.withdrawer = void 0;\n    this.staker = staker;\n    this.withdrawer = withdrawer;\n  }\n}\n/**\n * Stake account lockup info\n */\nclass Lockup {\n  /**\n   * Create a new Lockup object\n   */\n  constructor(unixTimestamp, epoch, custodian) {\n    /** Unix timestamp of lockup expiration */\n    this.unixTimestamp = void 0;\n    /** Epoch of lockup expiration */\n    this.epoch = void 0;\n    /** Lockup custodian authority */\n    this.custodian = void 0;\n    this.unixTimestamp = unixTimestamp;\n    this.epoch = epoch;\n    this.custodian = custodian;\n  }\n\n  /**\n   * Default, inactive Lockup value\n   */\n}\n_Lockup = Lockup;\nLockup.default = new _Lockup(0, 0, PublicKey.default);\n/**\n * Create stake account transaction params\n */\n/**\n * Create stake account with seed transaction params\n */\n/**\n * Initialize stake instruction params\n */\n/**\n * Delegate stake instruction params\n */\n/**\n * Authorize stake instruction params\n */\n/**\n * Authorize stake instruction params using a derived key\n */\n/**\n * Split stake instruction params\n */\n/**\n * Split with seed transaction params\n */\n/**\n * Withdraw stake instruction params\n */\n/**\n * Deactivate stake instruction params\n */\n/**\n * Merge stake instruction params\n */\n/**\n * Stake Instruction class\n */\nclass StakeInstruction {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Decode a stake instruction and retrieve the instruction type.\n   */\n  static decodeInstructionType(instruction) {\n    this.checkProgramId(instruction.programId);\n    const instructionTypeLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction');\n    const typeIndex = instructionTypeLayout.decode(instruction.data);\n    let type;\n    for (const [ixType, layout] of Object.entries(STAKE_INSTRUCTION_LAYOUTS)) {\n      if (layout.index == typeIndex) {\n        type = ixType;\n        break;\n      }\n    }\n    if (!type) {\n      throw new Error('Instruction type incorrect; not a StakeInstruction');\n    }\n    return type;\n  }\n\n  /**\n   * Decode a initialize stake instruction and retrieve the instruction params.\n   */\n  static decodeInitialize(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 2);\n    const {\n      authorized,\n      lockup\n    } = decodeData$1(STAKE_INSTRUCTION_LAYOUTS.Initialize, instruction.data);\n    return {\n      stakePubkey: instruction.keys[0].pubkey,\n      authorized: new Authorized(new PublicKey(authorized.staker), new PublicKey(authorized.withdrawer)),\n      lockup: new Lockup(lockup.unixTimestamp, lockup.epoch, new PublicKey(lockup.custodian))\n    };\n  }\n\n  /**\n   * Decode a delegate stake instruction and retrieve the instruction params.\n   */\n  static decodeDelegate(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 6);\n    decodeData$1(STAKE_INSTRUCTION_LAYOUTS.Delegate, instruction.data);\n    return {\n      stakePubkey: instruction.keys[0].pubkey,\n      votePubkey: instruction.keys[1].pubkey,\n      authorizedPubkey: instruction.keys[5].pubkey\n    };\n  }\n\n  /**\n   * Decode an authorize stake instruction and retrieve the instruction params.\n   */\n  static decodeAuthorize(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 3);\n    const {\n      newAuthorized,\n      stakeAuthorizationType\n    } = decodeData$1(STAKE_INSTRUCTION_LAYOUTS.Authorize, instruction.data);\n    const o = {\n      stakePubkey: instruction.keys[0].pubkey,\n      authorizedPubkey: instruction.keys[2].pubkey,\n      newAuthorizedPubkey: new PublicKey(newAuthorized),\n      stakeAuthorizationType: {\n        index: stakeAuthorizationType\n      }\n    };\n    if (instruction.keys.length > 3) {\n      o.custodianPubkey = instruction.keys[3].pubkey;\n    }\n    return o;\n  }\n\n  /**\n   * Decode an authorize-with-seed stake instruction and retrieve the instruction params.\n   */\n  static decodeAuthorizeWithSeed(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 2);\n    const {\n      newAuthorized,\n      stakeAuthorizationType,\n      authoritySeed,\n      authorityOwner\n    } = decodeData$1(STAKE_INSTRUCTION_LAYOUTS.AuthorizeWithSeed, instruction.data);\n    const o = {\n      stakePubkey: instruction.keys[0].pubkey,\n      authorityBase: instruction.keys[1].pubkey,\n      authoritySeed: authoritySeed,\n      authorityOwner: new PublicKey(authorityOwner),\n      newAuthorizedPubkey: new PublicKey(newAuthorized),\n      stakeAuthorizationType: {\n        index: stakeAuthorizationType\n      }\n    };\n    if (instruction.keys.length > 3) {\n      o.custodianPubkey = instruction.keys[3].pubkey;\n    }\n    return o;\n  }\n\n  /**\n   * Decode a split stake instruction and retrieve the instruction params.\n   */\n  static decodeSplit(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 3);\n    const {\n      lamports\n    } = decodeData$1(STAKE_INSTRUCTION_LAYOUTS.Split, instruction.data);\n    return {\n      stakePubkey: instruction.keys[0].pubkey,\n      splitStakePubkey: instruction.keys[1].pubkey,\n      authorizedPubkey: instruction.keys[2].pubkey,\n      lamports\n    };\n  }\n\n  /**\n   * Decode a merge stake instruction and retrieve the instruction params.\n   */\n  static decodeMerge(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 3);\n    decodeData$1(STAKE_INSTRUCTION_LAYOUTS.Merge, instruction.data);\n    return {\n      stakePubkey: instruction.keys[0].pubkey,\n      sourceStakePubKey: instruction.keys[1].pubkey,\n      authorizedPubkey: instruction.keys[4].pubkey\n    };\n  }\n\n  /**\n   * Decode a withdraw stake instruction and retrieve the instruction params.\n   */\n  static decodeWithdraw(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 5);\n    const {\n      lamports\n    } = decodeData$1(STAKE_INSTRUCTION_LAYOUTS.Withdraw, instruction.data);\n    const o = {\n      stakePubkey: instruction.keys[0].pubkey,\n      toPubkey: instruction.keys[1].pubkey,\n      authorizedPubkey: instruction.keys[4].pubkey,\n      lamports\n    };\n    if (instruction.keys.length > 5) {\n      o.custodianPubkey = instruction.keys[5].pubkey;\n    }\n    return o;\n  }\n\n  /**\n   * Decode a deactivate stake instruction and retrieve the instruction params.\n   */\n  static decodeDeactivate(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 3);\n    decodeData$1(STAKE_INSTRUCTION_LAYOUTS.Deactivate, instruction.data);\n    return {\n      stakePubkey: instruction.keys[0].pubkey,\n      authorizedPubkey: instruction.keys[2].pubkey\n    };\n  }\n\n  /**\n   * @internal\n   */\n  static checkProgramId(programId) {\n    if (!programId.equals(StakeProgram.programId)) {\n      throw new Error('invalid instruction; programId is not StakeProgram');\n    }\n  }\n\n  /**\n   * @internal\n   */\n  static checkKeyLength(keys, expectedLength) {\n    if (keys.length < expectedLength) {\n      throw new Error(`invalid instruction; found ${keys.length} keys, expected at least ${expectedLength}`);\n    }\n  }\n}\n\n/**\n * An enumeration of valid StakeInstructionType's\n */\n\n/**\n * An enumeration of valid stake InstructionType's\n * @internal\n */\nconst STAKE_INSTRUCTION_LAYOUTS = Object.freeze({\n  Initialize: {\n    index: 0,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), authorized(), lockup()])\n  },\n  Authorize: {\n    index: 1,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), publicKey('newAuthorized'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('stakeAuthorizationType')])\n  },\n  Delegate: {\n    index: 2,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction')])\n  },\n  Split: {\n    index: 3,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('lamports')])\n  },\n  Withdraw: {\n    index: 4,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('lamports')])\n  },\n  Deactivate: {\n    index: 5,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction')])\n  },\n  Merge: {\n    index: 7,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction')])\n  },\n  AuthorizeWithSeed: {\n    index: 8,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), publicKey('newAuthorized'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('stakeAuthorizationType'), rustString('authoritySeed'), publicKey('authorityOwner')])\n  }\n});\n\n/**\n * Stake authorization type\n */\n\n/**\n * An enumeration of valid StakeAuthorizationLayout's\n */\nconst StakeAuthorizationLayout = Object.freeze({\n  Staker: {\n    index: 0\n  },\n  Withdrawer: {\n    index: 1\n  }\n});\n\n/**\n * Factory class for transactions to interact with the Stake program\n */\nclass StakeProgram {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Public key that identifies the Stake program\n   */\n\n  /**\n   * Generate an Initialize instruction to add to a Stake Create transaction\n   */\n  static initialize(params) {\n    const {\n      stakePubkey,\n      authorized,\n      lockup: maybeLockup\n    } = params;\n    const lockup = maybeLockup || Lockup.default;\n    const type = STAKE_INSTRUCTION_LAYOUTS.Initialize;\n    const data = encodeData(type, {\n      authorized: {\n        staker: toBuffer(authorized.staker.toBuffer()),\n        withdrawer: toBuffer(authorized.withdrawer.toBuffer())\n      },\n      lockup: {\n        unixTimestamp: lockup.unixTimestamp,\n        epoch: lockup.epoch,\n        custodian: toBuffer(lockup.custodian.toBuffer())\n      }\n    });\n    const instructionData = {\n      keys: [{\n        pubkey: stakePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: SYSVAR_RENT_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }],\n      programId: this.programId,\n      data\n    };\n    return new TransactionInstruction(instructionData);\n  }\n\n  /**\n   * Generate a Transaction that creates a new Stake account at\n   *   an address generated with `from`, a seed, and the Stake programId\n   */\n  static createAccountWithSeed(params) {\n    const transaction = new Transaction();\n    transaction.add(SystemProgram.createAccountWithSeed({\n      fromPubkey: params.fromPubkey,\n      newAccountPubkey: params.stakePubkey,\n      basePubkey: params.basePubkey,\n      seed: params.seed,\n      lamports: params.lamports,\n      space: this.space,\n      programId: this.programId\n    }));\n    const {\n      stakePubkey,\n      authorized,\n      lockup\n    } = params;\n    return transaction.add(this.initialize({\n      stakePubkey,\n      authorized,\n      lockup\n    }));\n  }\n\n  /**\n   * Generate a Transaction that creates a new Stake account\n   */\n  static createAccount(params) {\n    const transaction = new Transaction();\n    transaction.add(SystemProgram.createAccount({\n      fromPubkey: params.fromPubkey,\n      newAccountPubkey: params.stakePubkey,\n      lamports: params.lamports,\n      space: this.space,\n      programId: this.programId\n    }));\n    const {\n      stakePubkey,\n      authorized,\n      lockup\n    } = params;\n    return transaction.add(this.initialize({\n      stakePubkey,\n      authorized,\n      lockup\n    }));\n  }\n\n  /**\n   * Generate a Transaction that delegates Stake tokens to a validator\n   * Vote PublicKey. This transaction can also be used to redelegate Stake\n   * to a new validator Vote PublicKey.\n   */\n  static delegate(params) {\n    const {\n      stakePubkey,\n      authorizedPubkey,\n      votePubkey\n    } = params;\n    const type = STAKE_INSTRUCTION_LAYOUTS.Delegate;\n    const data = encodeData(type);\n    return new Transaction().add({\n      keys: [{\n        pubkey: stakePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: votePubkey,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: SYSVAR_CLOCK_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: SYSVAR_STAKE_HISTORY_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: STAKE_CONFIG_ID,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: authorizedPubkey,\n        isSigner: true,\n        isWritable: false\n      }],\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a Transaction that authorizes a new PublicKey as Staker\n   * or Withdrawer on the Stake account.\n   */\n  static authorize(params) {\n    const {\n      stakePubkey,\n      authorizedPubkey,\n      newAuthorizedPubkey,\n      stakeAuthorizationType,\n      custodianPubkey\n    } = params;\n    const type = STAKE_INSTRUCTION_LAYOUTS.Authorize;\n    const data = encodeData(type, {\n      newAuthorized: toBuffer(newAuthorizedPubkey.toBuffer()),\n      stakeAuthorizationType: stakeAuthorizationType.index\n    });\n    const keys = [{\n      pubkey: stakePubkey,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: SYSVAR_CLOCK_PUBKEY,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: authorizedPubkey,\n      isSigner: true,\n      isWritable: false\n    }];\n    if (custodianPubkey) {\n      keys.push({\n        pubkey: custodianPubkey,\n        isSigner: true,\n        isWritable: false\n      });\n    }\n    return new Transaction().add({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a Transaction that authorizes a new PublicKey as Staker\n   * or Withdrawer on the Stake account.\n   */\n  static authorizeWithSeed(params) {\n    const {\n      stakePubkey,\n      authorityBase,\n      authoritySeed,\n      authorityOwner,\n      newAuthorizedPubkey,\n      stakeAuthorizationType,\n      custodianPubkey\n    } = params;\n    const type = STAKE_INSTRUCTION_LAYOUTS.AuthorizeWithSeed;\n    const data = encodeData(type, {\n      newAuthorized: toBuffer(newAuthorizedPubkey.toBuffer()),\n      stakeAuthorizationType: stakeAuthorizationType.index,\n      authoritySeed: authoritySeed,\n      authorityOwner: toBuffer(authorityOwner.toBuffer())\n    });\n    const keys = [{\n      pubkey: stakePubkey,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: authorityBase,\n      isSigner: true,\n      isWritable: false\n    }, {\n      pubkey: SYSVAR_CLOCK_PUBKEY,\n      isSigner: false,\n      isWritable: false\n    }];\n    if (custodianPubkey) {\n      keys.push({\n        pubkey: custodianPubkey,\n        isSigner: true,\n        isWritable: false\n      });\n    }\n    return new Transaction().add({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * @internal\n   */\n  static splitInstruction(params) {\n    const {\n      stakePubkey,\n      authorizedPubkey,\n      splitStakePubkey,\n      lamports\n    } = params;\n    const type = STAKE_INSTRUCTION_LAYOUTS.Split;\n    const data = encodeData(type, {\n      lamports\n    });\n    return new TransactionInstruction({\n      keys: [{\n        pubkey: stakePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: splitStakePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: authorizedPubkey,\n        isSigner: true,\n        isWritable: false\n      }],\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a Transaction that splits Stake tokens into another stake account\n   */\n  static split(params,\n  // Compute the cost of allocating the new stake account in lamports\n  rentExemptReserve) {\n    const transaction = new Transaction();\n    transaction.add(SystemProgram.createAccount({\n      fromPubkey: params.authorizedPubkey,\n      newAccountPubkey: params.splitStakePubkey,\n      lamports: rentExemptReserve,\n      space: this.space,\n      programId: this.programId\n    }));\n    return transaction.add(this.splitInstruction(params));\n  }\n\n  /**\n   * Generate a Transaction that splits Stake tokens into another account\n   * derived from a base public key and seed\n   */\n  static splitWithSeed(params,\n  // If this stake account is new, compute the cost of allocating it in lamports\n  rentExemptReserve) {\n    const {\n      stakePubkey,\n      authorizedPubkey,\n      splitStakePubkey,\n      basePubkey,\n      seed,\n      lamports\n    } = params;\n    const transaction = new Transaction();\n    transaction.add(SystemProgram.allocate({\n      accountPubkey: splitStakePubkey,\n      basePubkey,\n      seed,\n      space: this.space,\n      programId: this.programId\n    }));\n    if (rentExemptReserve && rentExemptReserve > 0) {\n      transaction.add(SystemProgram.transfer({\n        fromPubkey: params.authorizedPubkey,\n        toPubkey: splitStakePubkey,\n        lamports: rentExemptReserve\n      }));\n    }\n    return transaction.add(this.splitInstruction({\n      stakePubkey,\n      authorizedPubkey,\n      splitStakePubkey,\n      lamports\n    }));\n  }\n\n  /**\n   * Generate a Transaction that merges Stake accounts.\n   */\n  static merge(params) {\n    const {\n      stakePubkey,\n      sourceStakePubKey,\n      authorizedPubkey\n    } = params;\n    const type = STAKE_INSTRUCTION_LAYOUTS.Merge;\n    const data = encodeData(type);\n    return new Transaction().add({\n      keys: [{\n        pubkey: stakePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: sourceStakePubKey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: SYSVAR_CLOCK_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: SYSVAR_STAKE_HISTORY_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: authorizedPubkey,\n        isSigner: true,\n        isWritable: false\n      }],\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a Transaction that withdraws deactivated Stake tokens.\n   */\n  static withdraw(params) {\n    const {\n      stakePubkey,\n      authorizedPubkey,\n      toPubkey,\n      lamports,\n      custodianPubkey\n    } = params;\n    const type = STAKE_INSTRUCTION_LAYOUTS.Withdraw;\n    const data = encodeData(type, {\n      lamports\n    });\n    const keys = [{\n      pubkey: stakePubkey,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: toPubkey,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: SYSVAR_CLOCK_PUBKEY,\n      isSigner: false,\n      isWritable: false\n    }, {\n      pubkey: SYSVAR_STAKE_HISTORY_PUBKEY,\n      isSigner: false,\n      isWritable: false\n    }, {\n      pubkey: authorizedPubkey,\n      isSigner: true,\n      isWritable: false\n    }];\n    if (custodianPubkey) {\n      keys.push({\n        pubkey: custodianPubkey,\n        isSigner: true,\n        isWritable: false\n      });\n    }\n    return new Transaction().add({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a Transaction that deactivates Stake tokens.\n   */\n  static deactivate(params) {\n    const {\n      stakePubkey,\n      authorizedPubkey\n    } = params;\n    const type = STAKE_INSTRUCTION_LAYOUTS.Deactivate;\n    const data = encodeData(type);\n    return new Transaction().add({\n      keys: [{\n        pubkey: stakePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: SYSVAR_CLOCK_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: authorizedPubkey,\n        isSigner: true,\n        isWritable: false\n      }],\n      programId: this.programId,\n      data\n    });\n  }\n}\nStakeProgram.programId = new PublicKey('Stake11111111111111111111111111111111111111');\n/**\n * Max space of a Stake account\n *\n * This is generated from the solana-stake-program StakeState struct as\n * `StakeStateV2::size_of()`:\n * https://docs.rs/solana-stake-program/latest/solana_stake_program/stake_state/enum.StakeStateV2.html\n */\nStakeProgram.space = 200;\n\n/**\n * Vote account info\n */\nclass VoteInit {\n  /** [0, 100] */\n\n  constructor(nodePubkey, authorizedVoter, authorizedWithdrawer, commission) {\n    this.nodePubkey = void 0;\n    this.authorizedVoter = void 0;\n    this.authorizedWithdrawer = void 0;\n    this.commission = void 0;\n    this.nodePubkey = nodePubkey;\n    this.authorizedVoter = authorizedVoter;\n    this.authorizedWithdrawer = authorizedWithdrawer;\n    this.commission = commission;\n  }\n}\n\n/**\n * Create vote account transaction params\n */\n\n/**\n * InitializeAccount instruction params\n */\n\n/**\n * Authorize instruction params\n */\n\n/**\n * AuthorizeWithSeed instruction params\n */\n\n/**\n * Withdraw from vote account transaction params\n */\n\n/**\n * Update validator identity (node pubkey) vote account instruction params.\n */\n\n/**\n * Vote Instruction class\n */\nclass VoteInstruction {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Decode a vote instruction and retrieve the instruction type.\n   */\n  static decodeInstructionType(instruction) {\n    this.checkProgramId(instruction.programId);\n    const instructionTypeLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction');\n    const typeIndex = instructionTypeLayout.decode(instruction.data);\n    let type;\n    for (const [ixType, layout] of Object.entries(VOTE_INSTRUCTION_LAYOUTS)) {\n      if (layout.index == typeIndex) {\n        type = ixType;\n        break;\n      }\n    }\n    if (!type) {\n      throw new Error('Instruction type incorrect; not a VoteInstruction');\n    }\n    return type;\n  }\n\n  /**\n   * Decode an initialize vote instruction and retrieve the instruction params.\n   */\n  static decodeInitializeAccount(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 4);\n    const {\n      voteInit\n    } = decodeData$1(VOTE_INSTRUCTION_LAYOUTS.InitializeAccount, instruction.data);\n    return {\n      votePubkey: instruction.keys[0].pubkey,\n      nodePubkey: instruction.keys[3].pubkey,\n      voteInit: new VoteInit(new PublicKey(voteInit.nodePubkey), new PublicKey(voteInit.authorizedVoter), new PublicKey(voteInit.authorizedWithdrawer), voteInit.commission)\n    };\n  }\n\n  /**\n   * Decode an authorize instruction and retrieve the instruction params.\n   */\n  static decodeAuthorize(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 3);\n    const {\n      newAuthorized,\n      voteAuthorizationType\n    } = decodeData$1(VOTE_INSTRUCTION_LAYOUTS.Authorize, instruction.data);\n    return {\n      votePubkey: instruction.keys[0].pubkey,\n      authorizedPubkey: instruction.keys[2].pubkey,\n      newAuthorizedPubkey: new PublicKey(newAuthorized),\n      voteAuthorizationType: {\n        index: voteAuthorizationType\n      }\n    };\n  }\n\n  /**\n   * Decode an authorize instruction and retrieve the instruction params.\n   */\n  static decodeAuthorizeWithSeed(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 3);\n    const {\n      voteAuthorizeWithSeedArgs: {\n        currentAuthorityDerivedKeyOwnerPubkey,\n        currentAuthorityDerivedKeySeed,\n        newAuthorized,\n        voteAuthorizationType\n      }\n    } = decodeData$1(VOTE_INSTRUCTION_LAYOUTS.AuthorizeWithSeed, instruction.data);\n    return {\n      currentAuthorityDerivedKeyBasePubkey: instruction.keys[2].pubkey,\n      currentAuthorityDerivedKeyOwnerPubkey: new PublicKey(currentAuthorityDerivedKeyOwnerPubkey),\n      currentAuthorityDerivedKeySeed: currentAuthorityDerivedKeySeed,\n      newAuthorizedPubkey: new PublicKey(newAuthorized),\n      voteAuthorizationType: {\n        index: voteAuthorizationType\n      },\n      votePubkey: instruction.keys[0].pubkey\n    };\n  }\n\n  /**\n   * Decode a withdraw instruction and retrieve the instruction params.\n   */\n  static decodeWithdraw(instruction) {\n    this.checkProgramId(instruction.programId);\n    this.checkKeyLength(instruction.keys, 3);\n    const {\n      lamports\n    } = decodeData$1(VOTE_INSTRUCTION_LAYOUTS.Withdraw, instruction.data);\n    return {\n      votePubkey: instruction.keys[0].pubkey,\n      authorizedWithdrawerPubkey: instruction.keys[2].pubkey,\n      lamports,\n      toPubkey: instruction.keys[1].pubkey\n    };\n  }\n\n  /**\n   * @internal\n   */\n  static checkProgramId(programId) {\n    if (!programId.equals(VoteProgram.programId)) {\n      throw new Error('invalid instruction; programId is not VoteProgram');\n    }\n  }\n\n  /**\n   * @internal\n   */\n  static checkKeyLength(keys, expectedLength) {\n    if (keys.length < expectedLength) {\n      throw new Error(`invalid instruction; found ${keys.length} keys, expected at least ${expectedLength}`);\n    }\n  }\n}\n\n/**\n * An enumeration of valid VoteInstructionType's\n */\n\n/** @internal */\n\nconst VOTE_INSTRUCTION_LAYOUTS = Object.freeze({\n  InitializeAccount: {\n    index: 0,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), voteInit()])\n  },\n  Authorize: {\n    index: 1,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), publicKey('newAuthorized'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('voteAuthorizationType')])\n  },\n  Withdraw: {\n    index: 3,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.ns64('lamports')])\n  },\n  UpdateValidatorIdentity: {\n    index: 4,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction')])\n  },\n  AuthorizeWithSeed: {\n    index: 10,\n    layout: _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('instruction'), voteAuthorizeWithSeedArgs()])\n  }\n});\n\n/**\n * VoteAuthorize type\n */\n\n/**\n * An enumeration of valid VoteAuthorization layouts.\n */\nconst VoteAuthorizationLayout = Object.freeze({\n  Voter: {\n    index: 0\n  },\n  Withdrawer: {\n    index: 1\n  }\n});\n\n/**\n * Factory class for transactions to interact with the Vote program\n */\nclass VoteProgram {\n  /**\n   * @internal\n   */\n  constructor() {}\n\n  /**\n   * Public key that identifies the Vote program\n   */\n\n  /**\n   * Generate an Initialize instruction.\n   */\n  static initializeAccount(params) {\n    const {\n      votePubkey,\n      nodePubkey,\n      voteInit\n    } = params;\n    const type = VOTE_INSTRUCTION_LAYOUTS.InitializeAccount;\n    const data = encodeData(type, {\n      voteInit: {\n        nodePubkey: toBuffer(voteInit.nodePubkey.toBuffer()),\n        authorizedVoter: toBuffer(voteInit.authorizedVoter.toBuffer()),\n        authorizedWithdrawer: toBuffer(voteInit.authorizedWithdrawer.toBuffer()),\n        commission: voteInit.commission\n      }\n    });\n    const instructionData = {\n      keys: [{\n        pubkey: votePubkey,\n        isSigner: false,\n        isWritable: true\n      }, {\n        pubkey: SYSVAR_RENT_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: SYSVAR_CLOCK_PUBKEY,\n        isSigner: false,\n        isWritable: false\n      }, {\n        pubkey: nodePubkey,\n        isSigner: true,\n        isWritable: false\n      }],\n      programId: this.programId,\n      data\n    };\n    return new TransactionInstruction(instructionData);\n  }\n\n  /**\n   * Generate a transaction that creates a new Vote account.\n   */\n  static createAccount(params) {\n    const transaction = new Transaction();\n    transaction.add(SystemProgram.createAccount({\n      fromPubkey: params.fromPubkey,\n      newAccountPubkey: params.votePubkey,\n      lamports: params.lamports,\n      space: this.space,\n      programId: this.programId\n    }));\n    return transaction.add(this.initializeAccount({\n      votePubkey: params.votePubkey,\n      nodePubkey: params.voteInit.nodePubkey,\n      voteInit: params.voteInit\n    }));\n  }\n\n  /**\n   * Generate a transaction that authorizes a new Voter or Withdrawer on the Vote account.\n   */\n  static authorize(params) {\n    const {\n      votePubkey,\n      authorizedPubkey,\n      newAuthorizedPubkey,\n      voteAuthorizationType\n    } = params;\n    const type = VOTE_INSTRUCTION_LAYOUTS.Authorize;\n    const data = encodeData(type, {\n      newAuthorized: toBuffer(newAuthorizedPubkey.toBuffer()),\n      voteAuthorizationType: voteAuthorizationType.index\n    });\n    const keys = [{\n      pubkey: votePubkey,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: SYSVAR_CLOCK_PUBKEY,\n      isSigner: false,\n      isWritable: false\n    }, {\n      pubkey: authorizedPubkey,\n      isSigner: true,\n      isWritable: false\n    }];\n    return new Transaction().add({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a transaction that authorizes a new Voter or Withdrawer on the Vote account\n   * where the current Voter or Withdrawer authority is a derived key.\n   */\n  static authorizeWithSeed(params) {\n    const {\n      currentAuthorityDerivedKeyBasePubkey,\n      currentAuthorityDerivedKeyOwnerPubkey,\n      currentAuthorityDerivedKeySeed,\n      newAuthorizedPubkey,\n      voteAuthorizationType,\n      votePubkey\n    } = params;\n    const type = VOTE_INSTRUCTION_LAYOUTS.AuthorizeWithSeed;\n    const data = encodeData(type, {\n      voteAuthorizeWithSeedArgs: {\n        currentAuthorityDerivedKeyOwnerPubkey: toBuffer(currentAuthorityDerivedKeyOwnerPubkey.toBuffer()),\n        currentAuthorityDerivedKeySeed: currentAuthorityDerivedKeySeed,\n        newAuthorized: toBuffer(newAuthorizedPubkey.toBuffer()),\n        voteAuthorizationType: voteAuthorizationType.index\n      }\n    });\n    const keys = [{\n      pubkey: votePubkey,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: SYSVAR_CLOCK_PUBKEY,\n      isSigner: false,\n      isWritable: false\n    }, {\n      pubkey: currentAuthorityDerivedKeyBasePubkey,\n      isSigner: true,\n      isWritable: false\n    }];\n    return new Transaction().add({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a transaction to withdraw from a Vote account.\n   */\n  static withdraw(params) {\n    const {\n      votePubkey,\n      authorizedWithdrawerPubkey,\n      lamports,\n      toPubkey\n    } = params;\n    const type = VOTE_INSTRUCTION_LAYOUTS.Withdraw;\n    const data = encodeData(type, {\n      lamports\n    });\n    const keys = [{\n      pubkey: votePubkey,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: toPubkey,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: authorizedWithdrawerPubkey,\n      isSigner: true,\n      isWritable: false\n    }];\n    return new Transaction().add({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n\n  /**\n   * Generate a transaction to withdraw safely from a Vote account.\n   *\n   * This function was created as a safeguard for vote accounts running validators, `safeWithdraw`\n   * checks that the withdraw amount will not exceed the specified balance while leaving enough left\n   * to cover rent. If you wish to close the vote account by withdrawing the full amount, call the\n   * `withdraw` method directly.\n   */\n  static safeWithdraw(params, currentVoteAccountBalance, rentExemptMinimum) {\n    if (params.lamports > currentVoteAccountBalance - rentExemptMinimum) {\n      throw new Error('Withdraw will leave vote account with insufficient funds.');\n    }\n    return VoteProgram.withdraw(params);\n  }\n\n  /**\n   * Generate a transaction to update the validator identity (node pubkey) of a Vote account.\n   */\n  static updateValidatorIdentity(params) {\n    const {\n      votePubkey,\n      authorizedWithdrawerPubkey,\n      nodePubkey\n    } = params;\n    const type = VOTE_INSTRUCTION_LAYOUTS.UpdateValidatorIdentity;\n    const data = encodeData(type);\n    const keys = [{\n      pubkey: votePubkey,\n      isSigner: false,\n      isWritable: true\n    }, {\n      pubkey: nodePubkey,\n      isSigner: true,\n      isWritable: false\n    }, {\n      pubkey: authorizedWithdrawerPubkey,\n      isSigner: true,\n      isWritable: false\n    }];\n    return new Transaction().add({\n      keys,\n      programId: this.programId,\n      data\n    });\n  }\n}\nVoteProgram.programId = new PublicKey('Vote111111111111111111111111111111111111111');\n/**\n * Max space of a Vote account\n *\n * This is generated from the solana-vote-program VoteState struct as\n * `VoteState::size_of()`:\n * https://docs.rs/solana-vote-program/1.9.5/solana_vote_program/vote_state/struct.VoteState.html#method.size_of\n *\n * KEEP IN SYNC WITH `VoteState::size_of()` in https://github.com/solana-labs/solana/blob/a474cb24b9238f5edcc982f65c0b37d4a1046f7e/sdk/program/src/vote/state/mod.rs#L340-L342\n */\nVoteProgram.space = 3762;\n\nconst VALIDATOR_INFO_KEY = new PublicKey('Va1idator1nfo111111111111111111111111111111');\n\n/**\n * @internal\n */\n\n/**\n * Info used to identity validators.\n */\n\nconst InfoString = (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.type)({\n  name: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)(),\n  website: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  details: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  iconUrl: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)()),\n  keybaseUsername: (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.optional)((0,superstruct__WEBPACK_IMPORTED_MODULE_10__.string)())\n});\n\n/**\n * ValidatorInfo class\n */\nclass ValidatorInfo {\n  /**\n   * Construct a valid ValidatorInfo\n   *\n   * @param key validator public key\n   * @param info validator information\n   */\n  constructor(key, info) {\n    /**\n     * validator public key\n     */\n    this.key = void 0;\n    /**\n     * validator information\n     */\n    this.info = void 0;\n    this.key = key;\n    this.info = info;\n  }\n\n  /**\n   * Deserialize ValidatorInfo from the config account data. Exactly two config\n   * keys are required in the data.\n   *\n   * @param buffer config account data\n   * @return null if info was not found\n   */\n  static fromConfigData(buffer) {\n    let byteArray = [...buffer];\n    const configKeyCount = decodeLength(byteArray);\n    if (configKeyCount !== 2) return null;\n    const configKeys = [];\n    for (let i = 0; i < 2; i++) {\n      const publicKey = new PublicKey(guardedSplice(byteArray, 0, PUBLIC_KEY_LENGTH));\n      const isSigner = guardedShift(byteArray) === 1;\n      configKeys.push({\n        publicKey,\n        isSigner\n      });\n    }\n    if (configKeys[0].publicKey.equals(VALIDATOR_INFO_KEY)) {\n      if (configKeys[1].isSigner) {\n        const rawInfo = rustString().decode(buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(byteArray));\n        const info = JSON.parse(rawInfo);\n        (0,superstruct__WEBPACK_IMPORTED_MODULE_10__.assert)(info, InfoString);\n        return new ValidatorInfo(configKeys[1].publicKey, info);\n      }\n    }\n    return null;\n  }\n}\n\nconst VOTE_PROGRAM_ID = new PublicKey('Vote111111111111111111111111111111111111111');\n\n/**\n * History of how many credits earned by the end of each epoch\n */\n\n/**\n * See https://github.com/solana-labs/solana/blob/8a12ed029cfa38d4a45400916c2463fb82bbec8c/programs/vote_api/src/vote_state.rs#L68-L88\n *\n * @internal\n */\nconst VoteAccountLayout = _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([publicKey('nodePubkey'), publicKey('authorizedWithdrawer'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('commission'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64(),\n// votes.length\n_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('slot'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32('confirmationCount')]), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.offset(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32(), -8), 'votes'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('rootSlotValid'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('rootSlot'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64(),\n// authorizedVoters.length\n_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('epoch'), publicKey('authorizedVoter')]), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.offset(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32(), -8), 'authorizedVoters'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([publicKey('authorizedPubkey'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('epochOfLastAuthorizedSwitch'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('targetEpoch')]), 32, 'buf'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('idx'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u8('isEmpty')], 'priorVoters'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64(),\n// epochCredits.length\n_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.seq(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('epoch'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('credits'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('prevCredits')]), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.offset(_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.u32(), -8), 'epochCredits'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.struct([_solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('slot'), _solana_buffer_layout__WEBPACK_IMPORTED_MODULE_4__.nu64('timestamp')], 'lastTimestamp')]);\n/**\n * VoteAccount class\n */\nclass VoteAccount {\n  /**\n   * @internal\n   */\n  constructor(args) {\n    this.nodePubkey = void 0;\n    this.authorizedWithdrawer = void 0;\n    this.commission = void 0;\n    this.rootSlot = void 0;\n    this.votes = void 0;\n    this.authorizedVoters = void 0;\n    this.priorVoters = void 0;\n    this.epochCredits = void 0;\n    this.lastTimestamp = void 0;\n    this.nodePubkey = args.nodePubkey;\n    this.authorizedWithdrawer = args.authorizedWithdrawer;\n    this.commission = args.commission;\n    this.rootSlot = args.rootSlot;\n    this.votes = args.votes;\n    this.authorizedVoters = args.authorizedVoters;\n    this.priorVoters = args.priorVoters;\n    this.epochCredits = args.epochCredits;\n    this.lastTimestamp = args.lastTimestamp;\n  }\n\n  /**\n   * Deserialize VoteAccount from the account data.\n   *\n   * @param buffer account data\n   * @return VoteAccount\n   */\n  static fromAccountData(buffer) {\n    const versionOffset = 4;\n    const va = VoteAccountLayout.decode(toBuffer(buffer), versionOffset);\n    let rootSlot = va.rootSlot;\n    if (!va.rootSlotValid) {\n      rootSlot = null;\n    }\n    return new VoteAccount({\n      nodePubkey: new PublicKey(va.nodePubkey),\n      authorizedWithdrawer: new PublicKey(va.authorizedWithdrawer),\n      commission: va.commission,\n      votes: va.votes,\n      rootSlot,\n      authorizedVoters: va.authorizedVoters.map(parseAuthorizedVoter),\n      priorVoters: getPriorVoters(va.priorVoters),\n      epochCredits: va.epochCredits,\n      lastTimestamp: va.lastTimestamp\n    });\n  }\n}\nfunction parseAuthorizedVoter({\n  authorizedVoter,\n  epoch\n}) {\n  return {\n    epoch,\n    authorizedVoter: new PublicKey(authorizedVoter)\n  };\n}\nfunction parsePriorVoters({\n  authorizedPubkey,\n  epochOfLastAuthorizedSwitch,\n  targetEpoch\n}) {\n  return {\n    authorizedPubkey: new PublicKey(authorizedPubkey),\n    epochOfLastAuthorizedSwitch,\n    targetEpoch\n  };\n}\nfunction getPriorVoters({\n  buf,\n  idx,\n  isEmpty\n}) {\n  if (isEmpty) {\n    return [];\n  }\n  return [...buf.slice(idx + 1).map(parsePriorVoters), ...buf.slice(0, idx).map(parsePriorVoters)];\n}\n\nconst endpoint = {\n  http: {\n    devnet: 'http://api.devnet.solana.com',\n    testnet: 'http://api.testnet.solana.com',\n    'mainnet-beta': 'http://api.mainnet-beta.solana.com/'\n  },\n  https: {\n    devnet: 'https://api.devnet.solana.com',\n    testnet: 'https://api.testnet.solana.com',\n    'mainnet-beta': 'https://api.mainnet-beta.solana.com/'\n  }\n};\n/**\n * Retrieves the RPC API URL for the specified cluster\n * @param {Cluster} [cluster=\"devnet\"] - The cluster name of the RPC API URL to use. Possible options: 'devnet' | 'testnet' | 'mainnet-beta'\n * @param {boolean} [tls=\"http\"] - Use TLS when connecting to cluster.\n *\n * @returns {string} URL string of the RPC endpoint\n */\nfunction clusterApiUrl(cluster, tls) {\n  const key = tls === false ? 'http' : 'https';\n  if (!cluster) {\n    return endpoint[key]['devnet'];\n  }\n  const url = endpoint[key][cluster];\n  if (!url) {\n    throw new Error(`Unknown ${key} cluster: ${cluster}`);\n  }\n  return url;\n}\n\n/**\n * Send and confirm a raw transaction\n *\n * If `commitment` option is not specified, defaults to 'max' commitment.\n *\n * @param {Connection} connection\n * @param {Buffer} rawTransaction\n * @param {TransactionConfirmationStrategy} confirmationStrategy\n * @param {ConfirmOptions} [options]\n * @returns {Promise<TransactionSignature>}\n */\n\n/**\n * @deprecated Calling `sendAndConfirmRawTransaction()` without a `confirmationStrategy`\n * is no longer supported and will be removed in a future version.\n */\n// eslint-disable-next-line no-redeclare\n\n// eslint-disable-next-line no-redeclare\nasync function sendAndConfirmRawTransaction(connection, rawTransaction, confirmationStrategyOrConfirmOptions, maybeConfirmOptions) {\n  let confirmationStrategy;\n  let options;\n  if (confirmationStrategyOrConfirmOptions && Object.prototype.hasOwnProperty.call(confirmationStrategyOrConfirmOptions, 'lastValidBlockHeight')) {\n    confirmationStrategy = confirmationStrategyOrConfirmOptions;\n    options = maybeConfirmOptions;\n  } else if (confirmationStrategyOrConfirmOptions && Object.prototype.hasOwnProperty.call(confirmationStrategyOrConfirmOptions, 'nonceValue')) {\n    confirmationStrategy = confirmationStrategyOrConfirmOptions;\n    options = maybeConfirmOptions;\n  } else {\n    options = confirmationStrategyOrConfirmOptions;\n  }\n  const sendOptions = options && {\n    skipPreflight: options.skipPreflight,\n    preflightCommitment: options.preflightCommitment || options.commitment,\n    minContextSlot: options.minContextSlot\n  };\n  const signature = await connection.sendRawTransaction(rawTransaction, sendOptions);\n  const commitment = options && options.commitment;\n  const confirmationPromise = confirmationStrategy ? connection.confirmTransaction(confirmationStrategy, commitment) : connection.confirmTransaction(signature, commitment);\n  const status = (await confirmationPromise).value;\n  if (status.err) {\n    if (signature != null) {\n      throw new SendTransactionError({\n        action: sendOptions?.skipPreflight ? 'send' : 'simulate',\n        signature: signature,\n        transactionMessage: `Status: (${JSON.stringify(status)})`\n      });\n    }\n    throw new Error(`Raw transaction ${signature} failed (${JSON.stringify(status)})`);\n  }\n  return signature;\n}\n\n/**\n * There are 1-billion lamports in one SOL\n */\nconst LAMPORTS_PER_SOL = 1000000000;\n\n\n//# sourceMappingURL=index.browser.esm.js.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac29sYW5hL3dlYjMuanMvbGliL2luZGV4LmJyb3dzZXIuZXNtLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFnQztBQUNnQjtBQUN6QjtBQUNDO0FBQ3NCO0FBQ3VCO0FBQ2Y7QUFDVDtBQUN1QjtBQUM4RztBQUNoSTtBQUNPO0FBQ1Q7QUFDSTs7QUFFcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMkJBQTJCLDBEQUFPO0FBQ2xDO0FBQ0Esd0JBQXdCLDBEQUFPO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiwwREFBTztBQUM1QjtBQUNBO0FBQ0EsSUFBSSwwREFBTztBQUNYO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQywwREFBTztBQUM1QyxlQUFlLDBEQUFPOztBQUV0QjtBQUNBLE1BQU0sMENBQU07QUFDWjtBQUNBLElBQUk7QUFDSixXQUFXLDBDQUFNO0FBQ2pCLElBQUk7QUFDSixXQUFXLDBDQUFNO0FBQ2pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVywwQ0FBTSxNQUFNLGdEQUFTO0FBQ2hDO0FBQ0E7QUFDQSxXQUFXLGtEQUFXO0FBQ3RCO0FBQ0E7QUFDQSxXQUFXLDJEQUFvQjtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSx3QkFBd0Isa0RBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLDhDQUFFO0FBQ3pCLFFBQVE7QUFDUix1QkFBdUIsOENBQUU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxrREFBVztBQUN0QjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1DQUFtQywwQ0FBTTtBQUN6QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsMENBQU07QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsZ0JBQWdCO0FBQ3hDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQiwwQ0FBTSxtQ0FBbUMsMENBQU07QUFDbEUsMkJBQTJCLDREQUFNO0FBQ2pDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiwwQ0FBTTtBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsMENBQU07QUFDckIsS0FBSztBQUNMLGFBQWEsMENBQU0sdUNBQXVDLDBDQUFNO0FBQ2hFLDJCQUEyQiw0REFBTTtBQUNqQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGdDQUFnQztBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QywwQ0FBTTtBQUNsRDtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw4QkFBOEI7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLDBDQUEwQyxlQUFlO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDBDQUFNO0FBQ2pCO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsOENBQThDLDJCQUEyQiw4RUFBOEUsV0FBVztBQUNsSztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBLHVCQUF1QixXQUFXO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTLHVEQUFpQjtBQUMxQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMsdURBQWlCO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLHlEQUFtQixFQUFFLHNEQUFnQixZQUFZLHNEQUFnQixtQkFBbUIsdURBQWlCLENBQUMseURBQW1CLENBQUMsc0RBQWdCO0FBQ3hKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsMENBQU07QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLHNEQUFnQixVQUFVLHNEQUFnQixVQUFVLDBDQUFNO0FBQ3JFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMseURBQW1CO0FBQzVCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyx5REFBbUIsRUFBRSx1REFBaUIsbUJBQW1CLHVEQUFpQjtBQUNuRjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMseURBQW1CLDRGQUE0RixxREFBZTtBQUN2STs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVMseURBQW1CLEVBQUUsc0RBQWdCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsY0FBYyxRQUFRO0FBQ3RCLGNBQWMsVUFBVTtBQUN4QixjQUFjLFFBQVE7QUFDdEI7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLCtCQUErQjtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLGVBQWU7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsa0ZBQWtGO0FBQy9GO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLG9CQUFvQix5QkFBeUI7QUFDN0M7QUFDQSx5REFBeUQsR0FBRztBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSLDJDQUEyQywrQkFBK0I7QUFDMUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLGNBQWMsa0RBQVc7QUFDekI7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsWUFBWTtBQUN6QjtBQUNBLGVBQWUsd0JBQXdCO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGVBQWU7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLGVBQWU7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLFdBQVc7QUFDeEIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QyxrQkFBa0I7QUFDM0Q7QUFDQSx1Q0FBdUMsMENBQU07QUFDN0M7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsYUFBYSxRQUFRO0FBQ3JCO0FBQ0EsZUFBZSxRQUFRO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrREFBK0QsNkNBQTZDLEtBQUssc0RBQXNEO0FBQ3ZLO0FBQ0E7QUFDQSwrREFBK0QsNkNBQTZDLEtBQUssc0RBQXNEO0FBQ3ZLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLDBDQUFNO0FBQ2xDO0FBQ0EsSUFBSSwwQ0FBTTtBQUNWO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLFFBQVEsMENBQU07QUFDZDtBQUNBLEtBQUs7QUFDTDtBQUNBLGlGQUFpRix3QkFBd0IsSUFBSSxpQkFBaUI7QUFDOUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxhQUFhLHFDQUFxQztBQUNsRDtBQUNBLGVBQWUsYUFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0Isb0JBQW9CO0FBQ3hDO0FBQ0Esc0JBQXNCLGtEQUFXLENBQUMsMENBQU07QUFDeEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsU0FBUztBQUN0QixhQUFhLGVBQWU7QUFDNUI7QUFDQSxlQUFlLGFBQWE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGtEQUFXLDZCQUE2QixrREFBVztBQUNuRjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxjQUFjLGtEQUFXO0FBQ3pCLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNFQUFzRSxTQUFTO0FBQy9FO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSwwRUFBMEUsMEJBQTBCO0FBQ3BHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLHNCQUFzQiwwQ0FBMEM7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4QkFBOEIseURBQW1CLEVBQUUsdURBQWlCLDZEQUE2RCxzREFBZ0IscURBQXFELHVEQUFpQjtBQUN2TjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixzQkFBc0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrRUFBa0UsNEJBQTRCO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELElBQUkscUJBQXFCO0FBQzlFO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsOENBQThDLHlDQUF5QztBQUN2RjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlDQUFpQyxXQUFXLCtCQUErQixtQkFBbUI7QUFDOUY7QUFDQTtBQUNBLG1EQUFtRCxtQkFBbUI7QUFDdEU7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLGlCQUFpQjtBQUN4RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsU0FBUztBQUNULE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCxxQ0FBcUMsY0FBYyxJQUFJLFFBQVE7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsWUFBWTtBQUN2QixXQUFXLGFBQWE7QUFDeEIsV0FBVyxlQUFlO0FBQzFCLFdBQVcsZ0JBQWdCO0FBQzNCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTCxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3Q0FBd0MsdUJBQXVCO0FBQy9ELE9BQU87QUFDUDtBQUNBLG1DQUFtQyxXQUFXLFVBQVUsdUJBQXVCO0FBQy9FO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwwQ0FBTTtBQUNyQjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLDBDQUEwQztBQUMxQztBQUNBO0FBQ0EsMENBQTBDLDZCQUE2QixrQkFBa0IsS0FBSyxXQUFXO0FBQ3pHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHVEQUFpQjs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLHlEQUFtQixFQUFFLHNEQUFnQixhQUFhLHNEQUFnQiw4REFBOEQseURBQW1CO0FBQzlLOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQSxpQkFBaUIsMkRBQUk7QUFDckI7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG1FQUFXO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHNEQUFnQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSx1QkFBdUIseURBQW1CLEVBQUUsc0RBQWdCLGlCQUFpQixzREFBZ0IsWUFBWSxzREFBZ0IsaUJBQWlCLHNEQUFnQix3QkFBd0Isc0RBQWdCLENBQUMscURBQWUsVUFBVSx5REFBbUIsQ0FBQyxzREFBZ0I7QUFDaFE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLDBDQUFNO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsT0FBTzs7QUFFUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHlCQUF5Qix5REFBbUIsRUFBRSxzREFBZ0I7QUFDOUQsbUJBQW1CLDBDQUFNO0FBQ3pCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLHVDQUF1QyxtQkFBbUIsVUFBVSxzQkFBc0I7QUFDMUY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLFNBQVM7QUFDMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSxZQUFZO0FBQzNCLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLG1DQUFtQztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBLFNBQVM7QUFDVCxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVCxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU0sMEJBQTBCLG1EQUFLO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLGdCQUFnQixvREFBTSwwQkFBMEIsb0RBQU07QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNLDBCQUEwQixvREFBTTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvREFBTSwwQkFBMEIsbURBQUs7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNLDBCQUEwQixvREFBTTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxpQkFBaUI7QUFDM0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvREFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLGdCQUFnQixvREFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvREFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvREFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsK0JBQStCLG1EQUFtRDtBQUNoRztBQUNBLDBEQUEwRCwwQkFBMEI7QUFDcEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvREFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCx3QkFBd0I7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU0sb0NBQW9DLHNEQUFRLENBQUMsb0RBQU07QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvREFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsU0FBUyxtREFBbUQ7QUFDMUU7QUFDQSwwREFBMEQsMEJBQTBCO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvREFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU0sMEJBQTBCLG9EQUFNO0FBQ3REO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixvREFBTTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixvREFBTTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixvREFBTTtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGVBQWU7QUFDZixjQUFjO0FBQ2Q7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9EQUFNO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9EQUFNO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLG9EQUFNO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGtCQUFrQixvREFBTTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxpQkFBaUIsNkJBQTZCLGVBQWUsMEJBQTBCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGlCQUFpQiw2QkFBNkIsZUFBZTtBQUM3RCxrQ0FBa0M7QUFDbEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUJBQWlCLDZCQUE2QixlQUFlO0FBQzdELGtDQUFrQztBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxrQkFBa0Isb0RBQU07QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsZ0JBQWdCO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvREFBTSwwQkFBMEIsbURBQUssQ0FBQyxvREFBTTtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsMEJBQTBCO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCxzQkFBc0I7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCw0QkFBNEI7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwwREFBMEQsNkJBQTZCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLGtCQUFrQixvREFBTTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0RBQXdELHlDQUF5QztBQUNqRztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBEQUEwRCwrQkFBK0I7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU07QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYywwQ0FBMEM7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0EsNERBQTRELGVBQWU7QUFDM0U7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFFBQVE7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFLHVCQUF1QjtBQUN2RixNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxnQkFBZ0Isb0RBQU0sb0NBQW9DLG9EQUFNO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLDJCQUEyQixNQUFNO0FBQ2pFLDJCQUEyQixLQUFLLGlDQUFpQztBQUNqRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUNBQWlDLDBDQUFNO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLG9EQUFNO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5QztBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixvREFBTTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx1QkFBdUIsUUFBUTtBQUMvRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG9EQUFNO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWLE9BQU87QUFDUCxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaLFNBQVM7QUFDVDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQSxtRUFBbUUsWUFBWTtBQUMvRTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLGNBQWM7QUFDZCx3Q0FBd0Msc0NBQXNDLGtCQUFrQixPQUFPO0FBQ3ZHO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQjtBQUNoQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLHFDQUFxQyxtQkFBbUI7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQjtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWU7QUFDZjtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sRUFBRSxvREFBTTtBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxSEFBcUgscUJBQXFCO0FBQzFJO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHVDQUF1QyxpQ0FBaUM7QUFDeEU7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxFQUFFLG9EQUFNO0FBQ2Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxzQ0FBc0Msd0NBQXdDO0FBQzlFOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxFQUFFLG9EQUFNO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sRUFBRSxvREFBTTtBQUNkO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxFQUFFLG9EQUFNO0FBQ2Q7QUFDQTs7QUFFQTtBQUNBLDJEQUEyRCxpQkFBaUI7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sZ0dBQWdHLHFCQUFxQixVQUFVLGlCQUFpQjtBQUNoSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sRUFBRSxvREFBTTtBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxFQUFFLG9EQUFNO0FB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SztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0MscURBQWU7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtB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O0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHNEQUFnQjtBQUNsRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtREFBbUQ7QUFDbkQ7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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Q0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtDQUFrQyxzREFBZ0I7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbURBQW1EO0FBQ25EO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0Q0FBNEM7QUFDNUM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFFBQVEsYUFBYSwwQkFBMEIsZUFBZTtBQUMxRztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVkseURBQW1CLEVBQUUsc0RBQWdCO0FBQ2pELEdBQUc7QUFDSDtBQUNBO0FBQ0EsWUFBWSx5REFBbUIsRUFBRSxzREFBZ0IsNkNBQTZDLHNEQUFnQjtBQUM5RyxHQUFHO0FBQ0g7QUFDQTtBQUNBLFlBQVkseURBQW1CLEVBQUUsc0RBQWdCLGlCQUFpQix1REFBaUI7QUFDbkYsR0FBRztBQUNIO0FBQ0E7QUFDQSxZQUFZLHlEQUFtQixFQUFFLHNEQUFnQjtBQUNqRCxHQUFHO0FBQ0g7QUFDQTtBQUNBLFlBQVkseURBQW1CLEVBQUUsc0RBQWdCO0FBQ2pEO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixrREFB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QUFDSjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLHVCQUF1QjtBQUMvRCxPQUFPO0FBQ1A7QUFDQSx1Q0FBdUMsV0FBVyxVQUFVLHVCQUF1QjtBQUNuRjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRXNpRDtBQUN0aUQiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQHNvbGFuYS93ZWIzLmpzL2xpYi9pbmRleC5icm93c2VyLmVzbS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgZWQyNTUxOSB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvZWQyNTUxOSc7XG5pbXBvcnQgQk4gZnJvbSAnYm4uanMnO1xuaW1wb3J0IGJzNTggZnJvbSAnYnM1OCc7XG5pbXBvcnQgeyBzaGEyNTYgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3NoYTI1Nic7XG5pbXBvcnQgeyBzZXJpYWxpemUsIGRlc2VyaWFsaXplLCBkZXNlcmlhbGl6ZVVuY2hlY2tlZCB9IGZyb20gJ2JvcnNoJztcbmltcG9ydCAqIGFzIEJ1ZmZlckxheW91dCBmcm9tICdAc29sYW5hL2J1ZmZlci1sYXlvdXQnO1xuaW1wb3J0IHsgYmxvYiB9IGZyb20gJ0Bzb2xhbmEvYnVmZmVyLWxheW91dCc7XG5pbXBvcnQgeyBnZXRVNjRDb2RlYywgZ2V0VTY0RW5jb2RlciB9IGZyb20gJ0Bzb2xhbmEvY29kZWNzLW51bWJlcnMnO1xuaW1wb3J0IHsgY29lcmNlLCBpbnN0YW5jZSwgc3RyaW5nLCB0dXBsZSwgbGl0ZXJhbCwgdW5rbm93biwgdHlwZSwgbnVtYmVyLCBhcnJheSwgbnVsbGFibGUsIG9wdGlvbmFsLCBib29sZWFuLCByZWNvcmQsIHVuaW9uLCBjcmVhdGUsIGFueSwgYXNzZXJ0IGFzIGFzc2VydCQxIH0gZnJvbSAnc3VwZXJzdHJ1Y3QnO1xuaW1wb3J0IFJwY0NsaWVudCBmcm9tICdqYXlzb24vbGliL2NsaWVudC9icm93c2VyJztcbmltcG9ydCB7IENvbW1vbkNsaWVudCwgV2ViU29ja2V0IH0gZnJvbSAncnBjLXdlYnNvY2tldHMnO1xuaW1wb3J0IHsga2VjY2FrXzI1NiB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvc2hhMyc7XG5pbXBvcnQgeyBzZWNwMjU2azEgfSBmcm9tICdAbm9ibGUvY3VydmVzL3NlY3AyNTZrMSc7XG5cbi8qKlxuICogQSA2NCBieXRlIHNlY3JldCBrZXksIHRoZSBmaXJzdCAzMiBieXRlcyBvZiB3aGljaCBpcyB0aGVcbiAqIHByaXZhdGUgc2NhbGFyIGFuZCB0aGUgbGFzdCAzMiBieXRlcyBpcyB0aGUgcHVibGljIGtleS5cbiAqIFJlYWQgbW9yZTogaHR0cHM6Ly9ibG9nLm1vemlsbGEub3JnL3dhcm5lci8yMDExLzExLzI5L2VkMjU1MTkta2V5cy9cbiAqL1xuXG4vKipcbiAqIEVkMjU1MTkgS2V5cGFpclxuICovXG5cbmNvbnN0IGdlbmVyYXRlUHJpdmF0ZUtleSA9IGVkMjU1MTkudXRpbHMucmFuZG9tUHJpdmF0ZUtleTtcbmNvbnN0IGdlbmVyYXRlS2V5cGFpciA9ICgpID0+IHtcbiAgY29uc3QgcHJpdmF0ZVNjYWxhciA9IGVkMjU1MTkudXRpbHMucmFuZG9tUHJpdmF0ZUtleSgpO1xuICBjb25zdCBwdWJsaWNLZXkgPSBnZXRQdWJsaWNLZXkocHJpdmF0ZVNjYWxhcik7XG4gIGNvbnN0IHNlY3JldEtleSA9IG5ldyBVaW50OEFycmF5KDY0KTtcbiAgc2VjcmV0S2V5LnNldChwcml2YXRlU2NhbGFyKTtcbiAgc2VjcmV0S2V5LnNldChwdWJsaWNLZXksIDMyKTtcbiAgcmV0dXJuIHtcbiAgICBwdWJsaWNLZXksXG4gICAgc2VjcmV0S2V5XG4gIH07XG59O1xuY29uc3QgZ2V0UHVibGljS2V5ID0gZWQyNTUxOS5nZXRQdWJsaWNLZXk7XG5mdW5jdGlvbiBpc09uQ3VydmUocHVibGljS2V5KSB7XG4gIHRyeSB7XG4gICAgZWQyNTUxOS5FeHRlbmRlZFBvaW50LmZyb21IZXgocHVibGljS2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5jb25zdCBzaWduID0gKG1lc3NhZ2UsIHNlY3JldEtleSkgPT4gZWQyNTUxOS5zaWduKG1lc3NhZ2UsIHNlY3JldEtleS5zbGljZSgwLCAzMikpO1xuY29uc3QgdmVyaWZ5ID0gZWQyNTUxOS52ZXJpZnk7XG5cbmNvbnN0IHRvQnVmZmVyID0gYXJyID0+IHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihhcnIpKSB7XG4gICAgcmV0dXJuIGFycjtcbiAgfSBlbHNlIGlmIChhcnIgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFyci5idWZmZXIsIGFyci5ieXRlT2Zmc2V0LCBhcnIuYnl0ZUxlbmd0aCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGFycik7XG4gIH1cbn07XG5cbi8vIENsYXNzIHdyYXBwaW5nIGEgcGxhaW4gb2JqZWN0XG5jbGFzcyBTdHJ1Y3Qge1xuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0aWVzKSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLCBwcm9wZXJ0aWVzKTtcbiAgfVxuICBlbmNvZGUoKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHNlcmlhbGl6ZShTT0xBTkFfU0NIRU1BLCB0aGlzKSk7XG4gIH1cbiAgc3RhdGljIGRlY29kZShkYXRhKSB7XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplKFNPTEFOQV9TQ0hFTUEsIHRoaXMsIGRhdGEpO1xuICB9XG4gIHN0YXRpYyBkZWNvZGVVbmNoZWNrZWQoZGF0YSkge1xuICAgIHJldHVybiBkZXNlcmlhbGl6ZVVuY2hlY2tlZChTT0xBTkFfU0NIRU1BLCB0aGlzLCBkYXRhKTtcbiAgfVxufVxuXG4vLyBDbGFzcyByZXByZXNlbnRpbmcgYSBSdXN0LWNvbXBhdGlibGUgZW51bSwgc2luY2UgZW51bXMgYXJlIG9ubHkgc3RyaW5ncyBvclxuLy8gbnVtYmVycyBpbiBwdXJlIEpTXG5jbGFzcyBFbnVtIGV4dGVuZHMgU3RydWN0IHtcbiAgY29uc3RydWN0b3IocHJvcGVydGllcykge1xuICAgIHN1cGVyKHByb3BlcnRpZXMpO1xuICAgIHRoaXMuZW51bSA9ICcnO1xuICAgIGlmIChPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5sZW5ndGggIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRW51bSBjYW4gb25seSB0YWtlIHNpbmdsZSB2YWx1ZScpO1xuICAgIH1cbiAgICBPYmplY3Qua2V5cyhwcm9wZXJ0aWVzKS5tYXAoa2V5ID0+IHtcbiAgICAgIHRoaXMuZW51bSA9IGtleTtcbiAgICB9KTtcbiAgfVxufVxuY29uc3QgU09MQU5BX1NDSEVNQSA9IG5ldyBNYXAoKTtcblxudmFyIF9QdWJsaWNLZXk7XG5cbi8qKlxuICogTWF4aW11bSBsZW5ndGggb2YgZGVyaXZlZCBwdWJrZXkgc2VlZFxuICovXG5jb25zdCBNQVhfU0VFRF9MRU5HVEggPSAzMjtcblxuLyoqXG4gKiBTaXplIG9mIHB1YmxpYyBrZXkgaW4gYnl0ZXNcbiAqL1xuY29uc3QgUFVCTElDX0tFWV9MRU5HVEggPSAzMjtcblxuLyoqXG4gKiBWYWx1ZSB0byBiZSBjb252ZXJ0ZWQgaW50byBwdWJsaWMga2V5XG4gKi9cblxuLyoqXG4gKiBKU09OIG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiBQdWJsaWNLZXkgY2xhc3NcbiAqL1xuXG5mdW5jdGlvbiBpc1B1YmxpY0tleURhdGEodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlLl9ibiAhPT0gdW5kZWZpbmVkO1xufVxuXG4vLyBsb2NhbCBjb3VudGVyIHVzZWQgYnkgUHVibGljS2V5LnVuaXF1ZSgpXG5sZXQgdW5pcXVlUHVibGljS2V5Q291bnRlciA9IDE7XG5cbi8qKlxuICogQSBwdWJsaWMga2V5XG4gKi9cbmNsYXNzIFB1YmxpY0tleSBleHRlbmRzIFN0cnVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgUHVibGljS2V5IG9iamVjdFxuICAgKiBAcGFyYW0gdmFsdWUgZWQyNTUxOSBwdWJsaWMga2V5IGFzIGJ1ZmZlciBvciBiYXNlLTU4IGVuY29kZWQgc3RyaW5nXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgIHN1cGVyKHt9KTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fYm4gPSB2b2lkIDA7XG4gICAgaWYgKGlzUHVibGljS2V5RGF0YSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2JuID0gdmFsdWUuX2JuO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBhc3N1bWUgYmFzZSA1OCBlbmNvZGluZyBieSBkZWZhdWx0XG4gICAgICAgIGNvbnN0IGRlY29kZWQgPSBiczU4LmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWNvZGVkLmxlbmd0aCAhPSBQVUJMSUNfS0VZX0xFTkdUSCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwdWJsaWMga2V5IGlucHV0YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYm4gPSBuZXcgQk4oZGVjb2RlZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9ibiA9IG5ldyBCTih2YWx1ZSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fYm4uYnl0ZUxlbmd0aCgpID4gUFVCTElDX0tFWV9MRU5HVEgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHB1YmxpYyBrZXkgaW5wdXRgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHVuaXF1ZSBQdWJsaWNLZXkgZm9yIHRlc3RzIGFuZCBiZW5jaG1hcmtzIHVzaW5nIGEgY291bnRlclxuICAgKi9cbiAgc3RhdGljIHVuaXF1ZSgpIHtcbiAgICBjb25zdCBrZXkgPSBuZXcgUHVibGljS2V5KHVuaXF1ZVB1YmxpY0tleUNvdW50ZXIpO1xuICAgIHVuaXF1ZVB1YmxpY0tleUNvdW50ZXIgKz0gMTtcbiAgICByZXR1cm4gbmV3IFB1YmxpY0tleShrZXkudG9CdWZmZXIoKSk7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBwdWJsaWMga2V5IHZhbHVlLiBUaGUgYmFzZTU4LWVuY29kZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlzIGFsbCBvbmVzIChhcyBzZWVuIGJlbG93KVxuICAgKiBUaGUgdW5kZXJseWluZyBCTiBudW1iZXIgaXMgMzIgYnl0ZXMgdGhhdCBhcmUgYWxsIHplcm9zXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdHdvIHB1YmxpY0tleXMgYXJlIGVxdWFsXG4gICAqL1xuICBlcXVhbHMocHVibGljS2V5KSB7XG4gICAgcmV0dXJuIHRoaXMuX2JuLmVxKHB1YmxpY0tleS5fYm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgYmFzZS01OCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHVibGljIGtleVxuICAgKi9cbiAgdG9CYXNlNTgoKSB7XG4gICAgcmV0dXJuIGJzNTguZW5jb2RlKHRoaXMudG9CeXRlcygpKTtcbiAgfVxuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9CYXNlNTgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGJ5dGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXkgaW4gYmlnIGVuZGlhblxuICAgKi9cbiAgdG9CeXRlcygpIHtcbiAgICBjb25zdCBidWYgPSB0aGlzLnRvQnVmZmVyKCk7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGJ1Zi5idWZmZXIsIGJ1Zi5ieXRlT2Zmc2V0LCBidWYuYnl0ZUxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBCdWZmZXIgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBrZXkgaW4gYmlnIGVuZGlhblxuICAgKi9cbiAgdG9CdWZmZXIoKSB7XG4gICAgY29uc3QgYiA9IHRoaXMuX2JuLnRvQXJyYXlMaWtlKEJ1ZmZlcik7XG4gICAgaWYgKGIubGVuZ3RoID09PSBQVUJMSUNfS0VZX0xFTkdUSCkge1xuICAgICAgcmV0dXJuIGI7XG4gICAgfVxuICAgIGNvbnN0IHplcm9QYWQgPSBCdWZmZXIuYWxsb2MoMzIpO1xuICAgIGIuY29weSh6ZXJvUGFkLCAzMiAtIGIubGVuZ3RoKTtcbiAgICByZXR1cm4gemVyb1BhZDtcbiAgfVxuICBnZXQgW1N5bWJvbC50b1N0cmluZ1RhZ10oKSB7XG4gICAgcmV0dXJuIGBQdWJsaWNLZXkoJHt0aGlzLnRvU3RyaW5nKCl9KWA7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIHRoZSBiYXNlLTU4IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwdWJsaWMga2V5XG4gICAqL1xuICB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy50b0Jhc2U1OCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZSBhIHB1YmxpYyBrZXkgZnJvbSBhbm90aGVyIGtleSwgYSBzZWVkLCBhbmQgYSBwcm9ncmFtIElELlxuICAgKiBUaGUgcHJvZ3JhbSBJRCB3aWxsIGFsc28gc2VydmUgYXMgdGhlIG93bmVyIG9mIHRoZSBwdWJsaWMga2V5LCBnaXZpbmdcbiAgICogaXQgcGVybWlzc2lvbiB0byB3cml0ZSBkYXRhIHRvIHRoZSBhY2NvdW50LlxuICAgKi9cbiAgLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1hd2FpdCAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlV2l0aFNlZWQoZnJvbVB1YmxpY0tleSwgc2VlZCwgcHJvZ3JhbUlkKSB7XG4gICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmNvbmNhdChbZnJvbVB1YmxpY0tleS50b0J1ZmZlcigpLCBCdWZmZXIuZnJvbShzZWVkKSwgcHJvZ3JhbUlkLnRvQnVmZmVyKCldKTtcbiAgICBjb25zdCBwdWJsaWNLZXlCeXRlcyA9IHNoYTI1NihidWZmZXIpO1xuICAgIHJldHVybiBuZXcgUHVibGljS2V5KHB1YmxpY0tleUJ5dGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmUgYSBwcm9ncmFtIGFkZHJlc3MgZnJvbSBzZWVkcyBhbmQgYSBwcm9ncmFtIElELlxuICAgKi9cbiAgLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1hd2FpdCAqL1xuICBzdGF0aWMgY3JlYXRlUHJvZ3JhbUFkZHJlc3NTeW5jKHNlZWRzLCBwcm9ncmFtSWQpIHtcbiAgICBsZXQgYnVmZmVyID0gQnVmZmVyLmFsbG9jKDApO1xuICAgIHNlZWRzLmZvckVhY2goZnVuY3Rpb24gKHNlZWQpIHtcbiAgICAgIGlmIChzZWVkLmxlbmd0aCA+IE1BWF9TRUVEX0xFTkdUSCkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBNYXggc2VlZCBsZW5ndGggZXhjZWVkZWRgKTtcbiAgICAgIH1cbiAgICAgIGJ1ZmZlciA9IEJ1ZmZlci5jb25jYXQoW2J1ZmZlciwgdG9CdWZmZXIoc2VlZCldKTtcbiAgICB9KTtcbiAgICBidWZmZXIgPSBCdWZmZXIuY29uY2F0KFtidWZmZXIsIHByb2dyYW1JZC50b0J1ZmZlcigpLCBCdWZmZXIuZnJvbSgnUHJvZ3JhbURlcml2ZWRBZGRyZXNzJyldKTtcbiAgICBjb25zdCBwdWJsaWNLZXlCeXRlcyA9IHNoYTI1NihidWZmZXIpO1xuICAgIGlmIChpc09uQ3VydmUocHVibGljS2V5Qnl0ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2VlZHMsIGFkZHJlc3MgbXVzdCBmYWxsIG9mZiB0aGUgY3VydmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBQdWJsaWNLZXkocHVibGljS2V5Qnl0ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIHZlcnNpb24gb2YgY3JlYXRlUHJvZ3JhbUFkZHJlc3NTeW5jXG4gICAqIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGNyZWF0ZVByb2dyYW1BZGRyZXNzU3luY30gaW5zdGVhZFxuICAgKi9cbiAgLyogZXNsaW50LWRpc2FibGUgcmVxdWlyZS1hd2FpdCAqL1xuICBzdGF0aWMgYXN5bmMgY3JlYXRlUHJvZ3JhbUFkZHJlc3Moc2VlZHMsIHByb2dyYW1JZCkge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZVByb2dyYW1BZGRyZXNzU3luYyhzZWVkcywgcHJvZ3JhbUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgdmFsaWQgcHJvZ3JhbSBhZGRyZXNzXG4gICAqXG4gICAqIFZhbGlkIHByb2dyYW0gYWRkcmVzc2VzIG11c3QgZmFsbCBvZmYgdGhlIGVkMjU1MTkgY3VydmUuICBUaGlzIGZ1bmN0aW9uXG4gICAqIGl0ZXJhdGVzIGEgbm9uY2UgdW50aWwgaXQgZmluZHMgb25lIHRoYXQgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBzZWVkc1xuICAgKiByZXN1bHRzIGluIGEgdmFsaWQgcHJvZ3JhbSBhZGRyZXNzLlxuICAgKi9cbiAgc3RhdGljIGZpbmRQcm9ncmFtQWRkcmVzc1N5bmMoc2VlZHMsIHByb2dyYW1JZCkge1xuICAgIGxldCBub25jZSA9IDI1NTtcbiAgICBsZXQgYWRkcmVzcztcbiAgICB3aGlsZSAobm9uY2UgIT0gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc2VlZHNXaXRoTm9uY2UgPSBzZWVkcy5jb25jYXQoQnVmZmVyLmZyb20oW25vbmNlXSkpO1xuICAgICAgICBhZGRyZXNzID0gdGhpcy5jcmVhdGVQcm9ncmFtQWRkcmVzc1N5bmMoc2VlZHNXaXRoTm9uY2UsIHByb2dyYW1JZCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFR5cGVFcnJvcikge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICBub25jZS0tO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbYWRkcmVzcywgbm9uY2VdO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIGEgdmlhYmxlIHByb2dyYW0gYWRkcmVzcyBub25jZWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jIHZlcnNpb24gb2YgZmluZFByb2dyYW1BZGRyZXNzU3luY1xuICAgKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBmaW5kUHJvZ3JhbUFkZHJlc3NTeW5jfSBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZmluZFByb2dyYW1BZGRyZXNzKHNlZWRzLCBwcm9ncmFtSWQpIHtcbiAgICByZXR1cm4gdGhpcy5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKHNlZWRzLCBwcm9ncmFtSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIHRoYXQgYSBwdWJrZXkgaXMgb24gdGhlIGVkMjU1MTkgY3VydmUuXG4gICAqL1xuICBzdGF0aWMgaXNPbkN1cnZlKHB1YmtleURhdGEpIHtcbiAgICBjb25zdCBwdWJrZXkgPSBuZXcgUHVibGljS2V5KHB1YmtleURhdGEpO1xuICAgIHJldHVybiBpc09uQ3VydmUocHVia2V5LnRvQnl0ZXMoKSk7XG4gIH1cbn1cbl9QdWJsaWNLZXkgPSBQdWJsaWNLZXk7XG5QdWJsaWNLZXkuZGVmYXVsdCA9IG5ldyBfUHVibGljS2V5KCcxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMScpO1xuU09MQU5BX1NDSEVNQS5zZXQoUHVibGljS2V5LCB7XG4gIGtpbmQ6ICdzdHJ1Y3QnLFxuICBmaWVsZHM6IFtbJ19ibicsICd1MjU2J11dXG59KTtcblxuLyoqXG4gKiBBbiBhY2NvdW50IGtleSBwYWlyIChwdWJsaWMgYW5kIHNlY3JldCBrZXlzKS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzaW5jZSB2MS4xMC4wLCBwbGVhc2UgdXNlIHtAbGluayBLZXlwYWlyfSBpbnN0ZWFkLlxuICovXG5jbGFzcyBBY2NvdW50IHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBBY2NvdW50IG9iamVjdFxuICAgKlxuICAgKiBJZiB0aGUgc2VjcmV0S2V5IHBhcmFtZXRlciBpcyBub3QgcHJvdmlkZWQgYSBuZXcga2V5IHBhaXIgaXMgcmFuZG9tbHlcbiAgICogY3JlYXRlZCBmb3IgdGhlIGFjY291bnRcbiAgICpcbiAgICogQHBhcmFtIHNlY3JldEtleSBTZWNyZXQga2V5IGZvciB0aGUgYWNjb3VudFxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2VjcmV0S2V5KSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuX3B1YmxpY0tleSA9IHZvaWQgMDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fc2VjcmV0S2V5ID0gdm9pZCAwO1xuICAgIGlmIChzZWNyZXRLZXkpIHtcbiAgICAgIGNvbnN0IHNlY3JldEtleUJ1ZmZlciA9IHRvQnVmZmVyKHNlY3JldEtleSk7XG4gICAgICBpZiAoc2VjcmV0S2V5Lmxlbmd0aCAhPT0gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgc2VjcmV0IGtleSBzaXplJyk7XG4gICAgICB9XG4gICAgICB0aGlzLl9wdWJsaWNLZXkgPSBzZWNyZXRLZXlCdWZmZXIuc2xpY2UoMzIsIDY0KTtcbiAgICAgIHRoaXMuX3NlY3JldEtleSA9IHNlY3JldEtleUJ1ZmZlci5zbGljZSgwLCAzMik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3NlY3JldEtleSA9IHRvQnVmZmVyKGdlbmVyYXRlUHJpdmF0ZUtleSgpKTtcbiAgICAgIHRoaXMuX3B1YmxpY0tleSA9IHRvQnVmZmVyKGdldFB1YmxpY0tleSh0aGlzLl9zZWNyZXRLZXkpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHB1YmxpYyBrZXkgZm9yIHRoaXMgYWNjb3VudFxuICAgKi9cbiAgZ2V0IHB1YmxpY0tleSgpIHtcbiAgICByZXR1cm4gbmV3IFB1YmxpY0tleSh0aGlzLl9wdWJsaWNLZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSAqKnVuZW5jcnlwdGVkKiogc2VjcmV0IGtleSBmb3IgdGhpcyBhY2NvdW50LiBUaGUgZmlyc3QgMzIgYnl0ZXNcbiAgICogaXMgdGhlIHByaXZhdGUgc2NhbGFyIGFuZCB0aGUgbGFzdCAzMiBieXRlcyBpcyB0aGUgcHVibGljIGtleS5cbiAgICogUmVhZCBtb3JlOiBodHRwczovL2Jsb2cubW96aWxsYS5vcmcvd2FybmVyLzIwMTEvMTEvMjkvZWQyNTUxOS1rZXlzL1xuICAgKi9cbiAgZ2V0IHNlY3JldEtleSgpIHtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbdGhpcy5fc2VjcmV0S2V5LCB0aGlzLl9wdWJsaWNLZXldLCA2NCk7XG4gIH1cbn1cblxuY29uc3QgQlBGX0xPQURFUl9ERVBSRUNBVEVEX1BST0dSQU1fSUQgPSBuZXcgUHVibGljS2V5KCdCUEZMb2FkZXIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG5cbi8qKlxuICogTWF4aW11bSBvdmVyLXRoZS13aXJlIHNpemUgb2YgYSBUcmFuc2FjdGlvblxuICpcbiAqIDEyODAgaXMgSVB2NiBtaW5pbXVtIE1UVVxuICogNDAgYnl0ZXMgaXMgdGhlIHNpemUgb2YgdGhlIElQdjYgaGVhZGVyXG4gKiA4IGJ5dGVzIGlzIHRoZSBzaXplIG9mIHRoZSBmcmFnbWVudCBoZWFkZXJcbiAqL1xuY29uc3QgUEFDS0VUX0RBVEFfU0laRSA9IDEyODAgLSA0MCAtIDg7XG5jb25zdCBWRVJTSU9OX1BSRUZJWF9NQVNLID0gMHg3ZjtcbmNvbnN0IFNJR05BVFVSRV9MRU5HVEhfSU5fQllURVMgPSA2NDtcblxuY2xhc3MgVHJhbnNhY3Rpb25FeHBpcmVkQmxvY2toZWlnaHRFeGNlZWRlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihzaWduYXR1cmUpIHtcbiAgICBzdXBlcihgU2lnbmF0dXJlICR7c2lnbmF0dXJlfSBoYXMgZXhwaXJlZDogYmxvY2sgaGVpZ2h0IGV4Y2VlZGVkLmApO1xuICAgIHRoaXMuc2lnbmF0dXJlID0gdm9pZCAwO1xuICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVHJhbnNhY3Rpb25FeHBpcmVkQmxvY2toZWlnaHRFeGNlZWRlZEVycm9yLnByb3RvdHlwZSwgJ25hbWUnLCB7XG4gIHZhbHVlOiAnVHJhbnNhY3Rpb25FeHBpcmVkQmxvY2toZWlnaHRFeGNlZWRlZEVycm9yJ1xufSk7XG5jbGFzcyBUcmFuc2FjdGlvbkV4cGlyZWRUaW1lb3V0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHNpZ25hdHVyZSwgdGltZW91dFNlY29uZHMpIHtcbiAgICBzdXBlcihgVHJhbnNhY3Rpb24gd2FzIG5vdCBjb25maXJtZWQgaW4gJHt0aW1lb3V0U2Vjb25kcy50b0ZpeGVkKDIpfSBzZWNvbmRzLiBJdCBpcyBgICsgJ3Vua25vd24gaWYgaXQgc3VjY2VlZGVkIG9yIGZhaWxlZC4gQ2hlY2sgc2lnbmF0dXJlICcgKyBgJHtzaWduYXR1cmV9IHVzaW5nIHRoZSBTb2xhbmEgRXhwbG9yZXIgb3IgQ0xJIHRvb2xzLmApO1xuICAgIHRoaXMuc2lnbmF0dXJlID0gdm9pZCAwO1xuICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVHJhbnNhY3Rpb25FeHBpcmVkVGltZW91dEVycm9yLnByb3RvdHlwZSwgJ25hbWUnLCB7XG4gIHZhbHVlOiAnVHJhbnNhY3Rpb25FeHBpcmVkVGltZW91dEVycm9yJ1xufSk7XG5jbGFzcyBUcmFuc2FjdGlvbkV4cGlyZWROb25jZUludmFsaWRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3Ioc2lnbmF0dXJlKSB7XG4gICAgc3VwZXIoYFNpZ25hdHVyZSAke3NpZ25hdHVyZX0gaGFzIGV4cGlyZWQ6IHRoZSBub25jZSBpcyBubyBsb25nZXIgdmFsaWQuYCk7XG4gICAgdGhpcy5zaWduYXR1cmUgPSB2b2lkIDA7XG4gICAgdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7XG4gIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmFuc2FjdGlvbkV4cGlyZWROb25jZUludmFsaWRFcnJvci5wcm90b3R5cGUsICduYW1lJywge1xuICB2YWx1ZTogJ1RyYW5zYWN0aW9uRXhwaXJlZE5vbmNlSW52YWxpZEVycm9yJ1xufSk7XG5cbmNsYXNzIE1lc3NhZ2VBY2NvdW50S2V5cyB7XG4gIGNvbnN0cnVjdG9yKHN0YXRpY0FjY291bnRLZXlzLCBhY2NvdW50S2V5c0Zyb21Mb29rdXBzKSB7XG4gICAgdGhpcy5zdGF0aWNBY2NvdW50S2V5cyA9IHZvaWQgMDtcbiAgICB0aGlzLmFjY291bnRLZXlzRnJvbUxvb2t1cHMgPSB2b2lkIDA7XG4gICAgdGhpcy5zdGF0aWNBY2NvdW50S2V5cyA9IHN0YXRpY0FjY291bnRLZXlzO1xuICAgIHRoaXMuYWNjb3VudEtleXNGcm9tTG9va3VwcyA9IGFjY291bnRLZXlzRnJvbUxvb2t1cHM7XG4gIH1cbiAga2V5U2VnbWVudHMoKSB7XG4gICAgY29uc3Qga2V5U2VnbWVudHMgPSBbdGhpcy5zdGF0aWNBY2NvdW50S2V5c107XG4gICAgaWYgKHRoaXMuYWNjb3VudEtleXNGcm9tTG9va3Vwcykge1xuICAgICAga2V5U2VnbWVudHMucHVzaCh0aGlzLmFjY291bnRLZXlzRnJvbUxvb2t1cHMud3JpdGFibGUpO1xuICAgICAga2V5U2VnbWVudHMucHVzaCh0aGlzLmFjY291bnRLZXlzRnJvbUxvb2t1cHMucmVhZG9ubHkpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5U2VnbWVudHM7XG4gIH1cbiAgZ2V0KGluZGV4KSB7XG4gICAgZm9yIChjb25zdCBrZXlTZWdtZW50IG9mIHRoaXMua2V5U2VnbWVudHMoKSkge1xuICAgICAgaWYgKGluZGV4IDwga2V5U2VnbWVudC5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIGtleVNlZ21lbnRbaW5kZXhdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZXggLT0ga2V5U2VnbWVudC5sZW5ndGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiB0aGlzLmtleVNlZ21lbnRzKCkuZmxhdCgpLmxlbmd0aDtcbiAgfVxuICBjb21waWxlSW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucykge1xuICAgIC8vIEJhaWwgZWFybHkgaWYgYW55IGFjY291bnQgaW5kZXhlcyB3b3VsZCBvdmVyZmxvdyBhIHU4XG4gICAgY29uc3QgVThfTUFYID0gMjU1O1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IFU4X01BWCArIDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQWNjb3VudCBpbmRleCBvdmVyZmxvdyBlbmNvdW50ZXJlZCBkdXJpbmcgY29tcGlsYXRpb24nKTtcbiAgICB9XG4gICAgY29uc3Qga2V5SW5kZXhNYXAgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5rZXlTZWdtZW50cygpLmZsYXQoKS5mb3JFYWNoKChrZXksIGluZGV4KSA9PiB7XG4gICAgICBrZXlJbmRleE1hcC5zZXQoa2V5LnRvQmFzZTU4KCksIGluZGV4KTtcbiAgICB9KTtcbiAgICBjb25zdCBmaW5kS2V5SW5kZXggPSBrZXkgPT4ge1xuICAgICAgY29uc3Qga2V5SW5kZXggPSBrZXlJbmRleE1hcC5nZXQoa2V5LnRvQmFzZTU4KCkpO1xuICAgICAgaWYgKGtleUluZGV4ID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcignRW5jb3VudGVyZWQgYW4gdW5rbm93biBpbnN0cnVjdGlvbiBhY2NvdW50IGtleSBkdXJpbmcgY29tcGlsYXRpb24nKTtcbiAgICAgIHJldHVybiBrZXlJbmRleDtcbiAgICB9O1xuICAgIHJldHVybiBpbnN0cnVjdGlvbnMubWFwKGluc3RydWN0aW9uID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBmaW5kS2V5SW5kZXgoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKSxcbiAgICAgICAgYWNjb3VudEtleUluZGV4ZXM6IGluc3RydWN0aW9uLmtleXMubWFwKG1ldGEgPT4gZmluZEtleUluZGV4KG1ldGEucHVia2V5KSksXG4gICAgICAgIGRhdGE6IGluc3RydWN0aW9uLmRhdGFcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMYXlvdXQgZm9yIGEgcHVibGljIGtleVxuICovXG5jb25zdCBwdWJsaWNLZXkgPSAocHJvcGVydHkgPSAncHVibGljS2V5JykgPT4ge1xuICByZXR1cm4gQnVmZmVyTGF5b3V0LmJsb2IoMzIsIHByb3BlcnR5KTtcbn07XG5cbi8qKlxuICogTGF5b3V0IGZvciBhIHNpZ25hdHVyZVxuICovXG5jb25zdCBzaWduYXR1cmUgPSAocHJvcGVydHkgPSAnc2lnbmF0dXJlJykgPT4ge1xuICByZXR1cm4gQnVmZmVyTGF5b3V0LmJsb2IoNjQsIHByb3BlcnR5KTtcbn07XG4vKipcbiAqIExheW91dCBmb3IgYSBSdXN0IFN0cmluZyB0eXBlXG4gKi9cbmNvbnN0IHJ1c3RTdHJpbmcgPSAocHJvcGVydHkgPSAnc3RyaW5nJykgPT4ge1xuICBjb25zdCByc2wgPSBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdsZW5ndGgnKSwgQnVmZmVyTGF5b3V0LnUzMignbGVuZ3RoUGFkZGluZycpLCBCdWZmZXJMYXlvdXQuYmxvYihCdWZmZXJMYXlvdXQub2Zmc2V0KEJ1ZmZlckxheW91dC51MzIoKSwgLTgpLCAnY2hhcnMnKV0sIHByb3BlcnR5KTtcbiAgY29uc3QgX2RlY29kZSA9IHJzbC5kZWNvZGUuYmluZChyc2wpO1xuICBjb25zdCBfZW5jb2RlID0gcnNsLmVuY29kZS5iaW5kKHJzbCk7XG4gIGNvbnN0IHJzbFNoaW0gPSByc2w7XG4gIHJzbFNoaW0uZGVjb2RlID0gKGIsIG9mZnNldCkgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBfZGVjb2RlKGIsIG9mZnNldCk7XG4gICAgcmV0dXJuIGRhdGFbJ2NoYXJzJ10udG9TdHJpbmcoKTtcbiAgfTtcbiAgcnNsU2hpbS5lbmNvZGUgPSAoc3RyLCBiLCBvZmZzZXQpID0+IHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgY2hhcnM6IEJ1ZmZlci5mcm9tKHN0ciwgJ3V0ZjgnKVxuICAgIH07XG4gICAgcmV0dXJuIF9lbmNvZGUoZGF0YSwgYiwgb2Zmc2V0KTtcbiAgfTtcbiAgcnNsU2hpbS5hbGxvYyA9IHN0ciA9PiB7XG4gICAgcmV0dXJuIEJ1ZmZlckxheW91dC51MzIoKS5zcGFuICsgQnVmZmVyTGF5b3V0LnUzMigpLnNwYW4gKyBCdWZmZXIuZnJvbShzdHIsICd1dGY4JykubGVuZ3RoO1xuICB9O1xuICByZXR1cm4gcnNsU2hpbTtcbn07XG5cbi8qKlxuICogTGF5b3V0IGZvciBhbiBBdXRob3JpemVkIG9iamVjdFxuICovXG5jb25zdCBhdXRob3JpemVkID0gKHByb3BlcnR5ID0gJ2F1dGhvcml6ZWQnKSA9PiB7XG4gIHJldHVybiBCdWZmZXJMYXlvdXQuc3RydWN0KFtwdWJsaWNLZXkoJ3N0YWtlcicpLCBwdWJsaWNLZXkoJ3dpdGhkcmF3ZXInKV0sIHByb3BlcnR5KTtcbn07XG5cbi8qKlxuICogTGF5b3V0IGZvciBhIExvY2t1cCBvYmplY3RcbiAqL1xuY29uc3QgbG9ja3VwID0gKHByb3BlcnR5ID0gJ2xvY2t1cCcpID0+IHtcbiAgcmV0dXJuIEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC5uczY0KCd1bml4VGltZXN0YW1wJyksIEJ1ZmZlckxheW91dC5uczY0KCdlcG9jaCcpLCBwdWJsaWNLZXkoJ2N1c3RvZGlhbicpXSwgcHJvcGVydHkpO1xufTtcblxuLyoqXG4gKiAgTGF5b3V0IGZvciBhIFZvdGVJbml0IG9iamVjdFxuICovXG5jb25zdCB2b3RlSW5pdCA9IChwcm9wZXJ0eSA9ICd2b3RlSW5pdCcpID0+IHtcbiAgcmV0dXJuIEJ1ZmZlckxheW91dC5zdHJ1Y3QoW3B1YmxpY0tleSgnbm9kZVB1YmtleScpLCBwdWJsaWNLZXkoJ2F1dGhvcml6ZWRWb3RlcicpLCBwdWJsaWNLZXkoJ2F1dGhvcml6ZWRXaXRoZHJhd2VyJyksIEJ1ZmZlckxheW91dC51OCgnY29tbWlzc2lvbicpXSwgcHJvcGVydHkpO1xufTtcblxuLyoqXG4gKiAgTGF5b3V0IGZvciBhIFZvdGVBdXRob3JpemVXaXRoU2VlZEFyZ3Mgb2JqZWN0XG4gKi9cbmNvbnN0IHZvdGVBdXRob3JpemVXaXRoU2VlZEFyZ3MgPSAocHJvcGVydHkgPSAndm90ZUF1dGhvcml6ZVdpdGhTZWVkQXJncycpID0+IHtcbiAgcmV0dXJuIEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ3ZvdGVBdXRob3JpemF0aW9uVHlwZScpLCBwdWJsaWNLZXkoJ2N1cnJlbnRBdXRob3JpdHlEZXJpdmVkS2V5T3duZXJQdWJrZXknKSwgcnVzdFN0cmluZygnY3VycmVudEF1dGhvcml0eURlcml2ZWRLZXlTZWVkJyksIHB1YmxpY0tleSgnbmV3QXV0aG9yaXplZCcpXSwgcHJvcGVydHkpO1xufTtcbmZ1bmN0aW9uIGdldEFsbG9jKHR5cGUsIGZpZWxkcykge1xuICBjb25zdCBnZXRJdGVtQWxsb2MgPSBpdGVtID0+IHtcbiAgICBpZiAoaXRlbS5zcGFuID49IDApIHtcbiAgICAgIHJldHVybiBpdGVtLnNwYW47XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaXRlbS5hbGxvYyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIGl0ZW0uYWxsb2MoZmllbGRzW2l0ZW0ucHJvcGVydHldKTtcbiAgICB9IGVsc2UgaWYgKCdjb3VudCcgaW4gaXRlbSAmJiAnZWxlbWVudExheW91dCcgaW4gaXRlbSkge1xuICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbaXRlbS5wcm9wZXJ0eV07XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZCkpIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkLmxlbmd0aCAqIGdldEl0ZW1BbGxvYyhpdGVtLmVsZW1lbnRMYXlvdXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoJ2ZpZWxkcycgaW4gaXRlbSkge1xuICAgICAgLy8gVGhpcyBpcyBhIGBTdHJ1Y3R1cmVgIHdob3NlIHNpemUgbmVlZHMgdG8gYmUgcmVjdXJzaXZlbHkgbWVhc3VyZWQuXG4gICAgICByZXR1cm4gZ2V0QWxsb2Moe1xuICAgICAgICBsYXlvdXQ6IGl0ZW1cbiAgICAgIH0sIGZpZWxkc1tpdGVtLnByb3BlcnR5XSk7XG4gICAgfVxuICAgIC8vIENvdWxkbid0IGRldGVybWluZSBhbGxvY2F0ZWQgc2l6ZSBvZiBsYXlvdXRcbiAgICByZXR1cm4gMDtcbiAgfTtcbiAgbGV0IGFsbG9jID0gMDtcbiAgdHlwZS5sYXlvdXQuZmllbGRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgYWxsb2MgKz0gZ2V0SXRlbUFsbG9jKGl0ZW0pO1xuICB9KTtcbiAgcmV0dXJuIGFsbG9jO1xufVxuXG5mdW5jdGlvbiBkZWNvZGVMZW5ndGgoYnl0ZXMpIHtcbiAgbGV0IGxlbiA9IDA7XG4gIGxldCBzaXplID0gMDtcbiAgZm9yICg7Oykge1xuICAgIGxldCBlbGVtID0gYnl0ZXMuc2hpZnQoKTtcbiAgICBsZW4gfD0gKGVsZW0gJiAweDdmKSA8PCBzaXplICogNztcbiAgICBzaXplICs9IDE7XG4gICAgaWYgKChlbGVtICYgMHg4MCkgPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGVuO1xufVxuZnVuY3Rpb24gZW5jb2RlTGVuZ3RoKGJ5dGVzLCBsZW4pIHtcbiAgbGV0IHJlbV9sZW4gPSBsZW47XG4gIGZvciAoOzspIHtcbiAgICBsZXQgZWxlbSA9IHJlbV9sZW4gJiAweDdmO1xuICAgIHJlbV9sZW4gPj49IDc7XG4gICAgaWYgKHJlbV9sZW4gPT0gMCkge1xuICAgICAgYnl0ZXMucHVzaChlbGVtKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtIHw9IDB4ODA7XG4gICAgICBieXRlcy5wdXNoKGVsZW0pO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnQgKGNvbmRpdGlvbiwgbWVzc2FnZSkge1xuICBpZiAoIWNvbmRpdGlvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlIHx8ICdBc3NlcnRpb24gZmFpbGVkJyk7XG4gIH1cbn1cblxuY2xhc3MgQ29tcGlsZWRLZXlzIHtcbiAgY29uc3RydWN0b3IocGF5ZXIsIGtleU1ldGFNYXApIHtcbiAgICB0aGlzLnBheWVyID0gdm9pZCAwO1xuICAgIHRoaXMua2V5TWV0YU1hcCA9IHZvaWQgMDtcbiAgICB0aGlzLnBheWVyID0gcGF5ZXI7XG4gICAgdGhpcy5rZXlNZXRhTWFwID0ga2V5TWV0YU1hcDtcbiAgfVxuICBzdGF0aWMgY29tcGlsZShpbnN0cnVjdGlvbnMsIHBheWVyKSB7XG4gICAgY29uc3Qga2V5TWV0YU1hcCA9IG5ldyBNYXAoKTtcbiAgICBjb25zdCBnZXRPckluc2VydERlZmF1bHQgPSBwdWJrZXkgPT4ge1xuICAgICAgY29uc3QgYWRkcmVzcyA9IHB1YmtleS50b0Jhc2U1OCgpO1xuICAgICAgbGV0IGtleU1ldGEgPSBrZXlNZXRhTWFwLmdldChhZGRyZXNzKTtcbiAgICAgIGlmIChrZXlNZXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAga2V5TWV0YSA9IHtcbiAgICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgICAgaXNXcml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgaXNJbnZva2VkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICBrZXlNZXRhTWFwLnNldChhZGRyZXNzLCBrZXlNZXRhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBrZXlNZXRhO1xuICAgIH07XG4gICAgY29uc3QgcGF5ZXJLZXlNZXRhID0gZ2V0T3JJbnNlcnREZWZhdWx0KHBheWVyKTtcbiAgICBwYXllcktleU1ldGEuaXNTaWduZXIgPSB0cnVlO1xuICAgIHBheWVyS2V5TWV0YS5pc1dyaXRhYmxlID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGl4IG9mIGluc3RydWN0aW9ucykge1xuICAgICAgZ2V0T3JJbnNlcnREZWZhdWx0KGl4LnByb2dyYW1JZCkuaXNJbnZva2VkID0gdHJ1ZTtcbiAgICAgIGZvciAoY29uc3QgYWNjb3VudE1ldGEgb2YgaXgua2V5cykge1xuICAgICAgICBjb25zdCBrZXlNZXRhID0gZ2V0T3JJbnNlcnREZWZhdWx0KGFjY291bnRNZXRhLnB1YmtleSk7XG4gICAgICAgIGtleU1ldGEuaXNTaWduZXIgfHw9IGFjY291bnRNZXRhLmlzU2lnbmVyO1xuICAgICAgICBrZXlNZXRhLmlzV3JpdGFibGUgfHw9IGFjY291bnRNZXRhLmlzV3JpdGFibGU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ29tcGlsZWRLZXlzKHBheWVyLCBrZXlNZXRhTWFwKTtcbiAgfVxuICBnZXRNZXNzYWdlQ29tcG9uZW50cygpIHtcbiAgICBjb25zdCBtYXBFbnRyaWVzID0gWy4uLnRoaXMua2V5TWV0YU1hcC5lbnRyaWVzKCldO1xuICAgIGFzc2VydChtYXBFbnRyaWVzLmxlbmd0aCA8PSAyNTYsICdNYXggc3RhdGljIGFjY291bnQga2V5cyBsZW5ndGggZXhjZWVkZWQnKTtcbiAgICBjb25zdCB3cml0YWJsZVNpZ25lcnMgPSBtYXBFbnRyaWVzLmZpbHRlcigoWywgbWV0YV0pID0+IG1ldGEuaXNTaWduZXIgJiYgbWV0YS5pc1dyaXRhYmxlKTtcbiAgICBjb25zdCByZWFkb25seVNpZ25lcnMgPSBtYXBFbnRyaWVzLmZpbHRlcigoWywgbWV0YV0pID0+IG1ldGEuaXNTaWduZXIgJiYgIW1ldGEuaXNXcml0YWJsZSk7XG4gICAgY29uc3Qgd3JpdGFibGVOb25TaWduZXJzID0gbWFwRW50cmllcy5maWx0ZXIoKFssIG1ldGFdKSA9PiAhbWV0YS5pc1NpZ25lciAmJiBtZXRhLmlzV3JpdGFibGUpO1xuICAgIGNvbnN0IHJlYWRvbmx5Tm9uU2lnbmVycyA9IG1hcEVudHJpZXMuZmlsdGVyKChbLCBtZXRhXSkgPT4gIW1ldGEuaXNTaWduZXIgJiYgIW1ldGEuaXNXcml0YWJsZSk7XG4gICAgY29uc3QgaGVhZGVyID0ge1xuICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiB3cml0YWJsZVNpZ25lcnMubGVuZ3RoICsgcmVhZG9ubHlTaWduZXJzLmxlbmd0aCxcbiAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM6IHJlYWRvbmx5U2lnbmVycy5sZW5ndGgsXG4gICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IHJlYWRvbmx5Tm9uU2lnbmVycy5sZW5ndGhcbiAgICB9O1xuXG4gICAgLy8gc2FuaXR5IGNoZWNrc1xuICAgIHtcbiAgICAgIGFzc2VydCh3cml0YWJsZVNpZ25lcnMubGVuZ3RoID4gMCwgJ0V4cGVjdGVkIGF0IGxlYXN0IG9uZSB3cml0YWJsZSBzaWduZXIga2V5Jyk7XG4gICAgICBjb25zdCBbcGF5ZXJBZGRyZXNzXSA9IHdyaXRhYmxlU2lnbmVyc1swXTtcbiAgICAgIGFzc2VydChwYXllckFkZHJlc3MgPT09IHRoaXMucGF5ZXIudG9CYXNlNTgoKSwgJ0V4cGVjdGVkIGZpcnN0IHdyaXRhYmxlIHNpZ25lciBrZXkgdG8gYmUgdGhlIGZlZSBwYXllcicpO1xuICAgIH1cbiAgICBjb25zdCBzdGF0aWNBY2NvdW50S2V5cyA9IFsuLi53cml0YWJsZVNpZ25lcnMubWFwKChbYWRkcmVzc10pID0+IG5ldyBQdWJsaWNLZXkoYWRkcmVzcykpLCAuLi5yZWFkb25seVNpZ25lcnMubWFwKChbYWRkcmVzc10pID0+IG5ldyBQdWJsaWNLZXkoYWRkcmVzcykpLCAuLi53cml0YWJsZU5vblNpZ25lcnMubWFwKChbYWRkcmVzc10pID0+IG5ldyBQdWJsaWNLZXkoYWRkcmVzcykpLCAuLi5yZWFkb25seU5vblNpZ25lcnMubWFwKChbYWRkcmVzc10pID0+IG5ldyBQdWJsaWNLZXkoYWRkcmVzcykpXTtcbiAgICByZXR1cm4gW2hlYWRlciwgc3RhdGljQWNjb3VudEtleXNdO1xuICB9XG4gIGV4dHJhY3RUYWJsZUxvb2t1cChsb29rdXBUYWJsZSkge1xuICAgIGNvbnN0IFt3cml0YWJsZUluZGV4ZXMsIGRyYWluZWRXcml0YWJsZUtleXNdID0gdGhpcy5kcmFpbktleXNGb3VuZEluTG9va3VwVGFibGUobG9va3VwVGFibGUuc3RhdGUuYWRkcmVzc2VzLCBrZXlNZXRhID0+ICFrZXlNZXRhLmlzU2lnbmVyICYmICFrZXlNZXRhLmlzSW52b2tlZCAmJiBrZXlNZXRhLmlzV3JpdGFibGUpO1xuICAgIGNvbnN0IFtyZWFkb25seUluZGV4ZXMsIGRyYWluZWRSZWFkb25seUtleXNdID0gdGhpcy5kcmFpbktleXNGb3VuZEluTG9va3VwVGFibGUobG9va3VwVGFibGUuc3RhdGUuYWRkcmVzc2VzLCBrZXlNZXRhID0+ICFrZXlNZXRhLmlzU2lnbmVyICYmICFrZXlNZXRhLmlzSW52b2tlZCAmJiAha2V5TWV0YS5pc1dyaXRhYmxlKTtcblxuICAgIC8vIERvbid0IGV4dHJhY3QgbG9va3VwIGlmIG5vIGtleXMgd2VyZSBmb3VuZFxuICAgIGlmICh3cml0YWJsZUluZGV4ZXMubGVuZ3RoID09PSAwICYmIHJlYWRvbmx5SW5kZXhlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcmV0dXJuIFt7XG4gICAgICBhY2NvdW50S2V5OiBsb29rdXBUYWJsZS5rZXksXG4gICAgICB3cml0YWJsZUluZGV4ZXMsXG4gICAgICByZWFkb25seUluZGV4ZXNcbiAgICB9LCB7XG4gICAgICB3cml0YWJsZTogZHJhaW5lZFdyaXRhYmxlS2V5cyxcbiAgICAgIHJlYWRvbmx5OiBkcmFpbmVkUmVhZG9ubHlLZXlzXG4gICAgfV07XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGRyYWluS2V5c0ZvdW5kSW5Mb29rdXBUYWJsZShsb29rdXBUYWJsZUVudHJpZXMsIGtleU1ldGFGaWx0ZXIpIHtcbiAgICBjb25zdCBsb29rdXBUYWJsZUluZGV4ZXMgPSBuZXcgQXJyYXkoKTtcbiAgICBjb25zdCBkcmFpbmVkS2V5cyA9IG5ldyBBcnJheSgpO1xuICAgIGZvciAoY29uc3QgW2FkZHJlc3MsIGtleU1ldGFdIG9mIHRoaXMua2V5TWV0YU1hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGlmIChrZXlNZXRhRmlsdGVyKGtleU1ldGEpKSB7XG4gICAgICAgIGNvbnN0IGtleSA9IG5ldyBQdWJsaWNLZXkoYWRkcmVzcyk7XG4gICAgICAgIGNvbnN0IGxvb2t1cFRhYmxlSW5kZXggPSBsb29rdXBUYWJsZUVudHJpZXMuZmluZEluZGV4KGVudHJ5ID0+IGVudHJ5LmVxdWFscyhrZXkpKTtcbiAgICAgICAgaWYgKGxvb2t1cFRhYmxlSW5kZXggPj0gMCkge1xuICAgICAgICAgIGFzc2VydChsb29rdXBUYWJsZUluZGV4IDwgMjU2LCAnTWF4IGxvb2t1cCB0YWJsZSBpbmRleCBleGNlZWRlZCcpO1xuICAgICAgICAgIGxvb2t1cFRhYmxlSW5kZXhlcy5wdXNoKGxvb2t1cFRhYmxlSW5kZXgpO1xuICAgICAgICAgIGRyYWluZWRLZXlzLnB1c2goa2V5KTtcbiAgICAgICAgICB0aGlzLmtleU1ldGFNYXAuZGVsZXRlKGFkZHJlc3MpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbbG9va3VwVGFibGVJbmRleGVzLCBkcmFpbmVkS2V5c107XG4gIH1cbn1cblxuY29uc3QgRU5EX09GX0JVRkZFUl9FUlJPUl9NRVNTQUdFID0gJ1JlYWNoZWQgZW5kIG9mIGJ1ZmZlciB1bmV4cGVjdGVkbHknO1xuXG4vKipcbiAqIERlbGVnYXRlcyB0byBgQXJyYXkjc2hpZnRgLCBidXQgdGhyb3dzIGlmIHRoZSBhcnJheSBpcyB6ZXJvLWxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gZ3VhcmRlZFNoaWZ0KGJ5dGVBcnJheSkge1xuICBpZiAoYnl0ZUFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihFTkRfT0ZfQlVGRkVSX0VSUk9SX01FU1NBR0UpO1xuICB9XG4gIHJldHVybiBieXRlQXJyYXkuc2hpZnQoKTtcbn1cblxuLyoqXG4gKiBEZWxlZ2F0ZXMgdG8gYEFycmF5I3NwbGljZWAsIGJ1dCB0aHJvd3MgaWYgdGhlIHNlY3Rpb24gYmVpbmcgc3BsaWNlZCBvdXQgZXh0ZW5kcyBwYXN0IHRoZSBlbmQgb2ZcbiAqIHRoZSBhcnJheS5cbiAqL1xuZnVuY3Rpb24gZ3VhcmRlZFNwbGljZShieXRlQXJyYXksIC4uLmFyZ3MpIHtcbiAgY29uc3QgW3N0YXJ0XSA9IGFyZ3M7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMiAvLyBJbXBsaWVzIHRoYXQgYGRlbGV0ZUNvdW50YCB3YXMgc3VwcGxpZWRcbiAgPyBzdGFydCArIChhcmdzWzFdID8/IDApID4gYnl0ZUFycmF5Lmxlbmd0aCA6IHN0YXJ0ID49IGJ5dGVBcnJheS5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoRU5EX09GX0JVRkZFUl9FUlJPUl9NRVNTQUdFKTtcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5LnNwbGljZSguLi5hcmdzKTtcbn1cblxuLyoqXG4gKiBBbiBpbnN0cnVjdGlvbiB0byBleGVjdXRlIGJ5IGEgcHJvZ3JhbVxuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwcm9ncmFtSWRJbmRleFxuICogQHByb3BlcnR5IHtudW1iZXJbXX0gYWNjb3VudHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhXG4gKi9cblxuLyoqXG4gKiBNZXNzYWdlIGNvbnN0cnVjdG9yIGFyZ3VtZW50c1xuICovXG5cbi8qKlxuICogTGlzdCBvZiBpbnN0cnVjdGlvbnMgdG8gYmUgcHJvY2Vzc2VkIGF0b21pY2FsbHlcbiAqL1xuY2xhc3MgTWVzc2FnZSB7XG4gIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICB0aGlzLmhlYWRlciA9IHZvaWQgMDtcbiAgICB0aGlzLmFjY291bnRLZXlzID0gdm9pZCAwO1xuICAgIHRoaXMucmVjZW50QmxvY2toYXNoID0gdm9pZCAwO1xuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gdm9pZCAwO1xuICAgIHRoaXMuaW5kZXhUb1Byb2dyYW1JZHMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5oZWFkZXIgPSBhcmdzLmhlYWRlcjtcbiAgICB0aGlzLmFjY291bnRLZXlzID0gYXJncy5hY2NvdW50S2V5cy5tYXAoYWNjb3VudCA9PiBuZXcgUHVibGljS2V5KGFjY291bnQpKTtcbiAgICB0aGlzLnJlY2VudEJsb2NraGFzaCA9IGFyZ3MucmVjZW50QmxvY2toYXNoO1xuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gYXJncy5pbnN0cnVjdGlvbnM7XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMuZm9yRWFjaChpeCA9PiB0aGlzLmluZGV4VG9Qcm9ncmFtSWRzLnNldChpeC5wcm9ncmFtSWRJbmRleCwgdGhpcy5hY2NvdW50S2V5c1tpeC5wcm9ncmFtSWRJbmRleF0pKTtcbiAgfVxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gJ2xlZ2FjeSc7XG4gIH1cbiAgZ2V0IHN0YXRpY0FjY291bnRLZXlzKCkge1xuICAgIHJldHVybiB0aGlzLmFjY291bnRLZXlzO1xuICB9XG4gIGdldCBjb21waWxlZEluc3RydWN0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbnMubWFwKGl4ID0+ICh7XG4gICAgICBwcm9ncmFtSWRJbmRleDogaXgucHJvZ3JhbUlkSW5kZXgsXG4gICAgICBhY2NvdW50S2V5SW5kZXhlczogaXguYWNjb3VudHMsXG4gICAgICBkYXRhOiBiczU4LmRlY29kZShpeC5kYXRhKVxuICAgIH0pKTtcbiAgfVxuICBnZXQgYWRkcmVzc1RhYmxlTG9va3VwcygpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgZ2V0QWNjb3VudEtleXMoKSB7XG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlQWNjb3VudEtleXModGhpcy5zdGF0aWNBY2NvdW50S2V5cyk7XG4gIH1cbiAgc3RhdGljIGNvbXBpbGUoYXJncykge1xuICAgIGNvbnN0IGNvbXBpbGVkS2V5cyA9IENvbXBpbGVkS2V5cy5jb21waWxlKGFyZ3MuaW5zdHJ1Y3Rpb25zLCBhcmdzLnBheWVyS2V5KTtcbiAgICBjb25zdCBbaGVhZGVyLCBzdGF0aWNBY2NvdW50S2V5c10gPSBjb21waWxlZEtleXMuZ2V0TWVzc2FnZUNvbXBvbmVudHMoKTtcbiAgICBjb25zdCBhY2NvdW50S2V5cyA9IG5ldyBNZXNzYWdlQWNjb3VudEtleXMoc3RhdGljQWNjb3VudEtleXMpO1xuICAgIGNvbnN0IGluc3RydWN0aW9ucyA9IGFjY291bnRLZXlzLmNvbXBpbGVJbnN0cnVjdGlvbnMoYXJncy5pbnN0cnVjdGlvbnMpLm1hcChpeCA9PiAoe1xuICAgICAgcHJvZ3JhbUlkSW5kZXg6IGl4LnByb2dyYW1JZEluZGV4LFxuICAgICAgYWNjb3VudHM6IGl4LmFjY291bnRLZXlJbmRleGVzLFxuICAgICAgZGF0YTogYnM1OC5lbmNvZGUoaXguZGF0YSlcbiAgICB9KSk7XG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlKHtcbiAgICAgIGhlYWRlcixcbiAgICAgIGFjY291bnRLZXlzOiBzdGF0aWNBY2NvdW50S2V5cyxcbiAgICAgIHJlY2VudEJsb2NraGFzaDogYXJncy5yZWNlbnRCbG9ja2hhc2gsXG4gICAgICBpbnN0cnVjdGlvbnNcbiAgICB9KTtcbiAgfVxuICBpc0FjY291bnRTaWduZXIoaW5kZXgpIHtcbiAgICByZXR1cm4gaW5kZXggPCB0aGlzLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXM7XG4gIH1cbiAgaXNBY2NvdW50V3JpdGFibGUoaW5kZXgpIHtcbiAgICBjb25zdCBudW1TaWduZWRBY2NvdW50cyA9IHRoaXMuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzKSB7XG4gICAgICBjb25zdCB1bnNpZ25lZEFjY291bnRJbmRleCA9IGluZGV4IC0gbnVtU2lnbmVkQWNjb3VudHM7XG4gICAgICBjb25zdCBudW1VbnNpZ25lZEFjY291bnRzID0gdGhpcy5hY2NvdW50S2V5cy5sZW5ndGggLSBudW1TaWduZWRBY2NvdW50cztcbiAgICAgIGNvbnN0IG51bVdyaXRhYmxlVW5zaWduZWRBY2NvdW50cyA9IG51bVVuc2lnbmVkQWNjb3VudHMgLSB0aGlzLmhlYWRlci5udW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM7XG4gICAgICByZXR1cm4gdW5zaWduZWRBY2NvdW50SW5kZXggPCBudW1Xcml0YWJsZVVuc2lnbmVkQWNjb3VudHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG51bVdyaXRhYmxlU2lnbmVkQWNjb3VudHMgPSBudW1TaWduZWRBY2NvdW50cyAtIHRoaXMuaGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM7XG4gICAgICByZXR1cm4gaW5kZXggPCBudW1Xcml0YWJsZVNpZ25lZEFjY291bnRzO1xuICAgIH1cbiAgfVxuICBpc1Byb2dyYW1JZChpbmRleCkge1xuICAgIHJldHVybiB0aGlzLmluZGV4VG9Qcm9ncmFtSWRzLmhhcyhpbmRleCk7XG4gIH1cbiAgcHJvZ3JhbUlkcygpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuaW5kZXhUb1Byb2dyYW1JZHMudmFsdWVzKCldO1xuICB9XG4gIG5vblByb2dyYW1JZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWNjb3VudEtleXMuZmlsdGVyKChfLCBpbmRleCkgPT4gIXRoaXMuaXNQcm9ncmFtSWQoaW5kZXgpKTtcbiAgfVxuICBzZXJpYWxpemUoKSB7XG4gICAgY29uc3QgbnVtS2V5cyA9IHRoaXMuYWNjb3VudEtleXMubGVuZ3RoO1xuICAgIGxldCBrZXlDb3VudCA9IFtdO1xuICAgIGVuY29kZUxlbmd0aChrZXlDb3VudCwgbnVtS2V5cyk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gdGhpcy5pbnN0cnVjdGlvbnMubWFwKGluc3RydWN0aW9uID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWNjb3VudHMsXG4gICAgICAgIHByb2dyYW1JZEluZGV4XG4gICAgICB9ID0gaW5zdHJ1Y3Rpb247XG4gICAgICBjb25zdCBkYXRhID0gQXJyYXkuZnJvbShiczU4LmRlY29kZShpbnN0cnVjdGlvbi5kYXRhKSk7XG4gICAgICBsZXQga2V5SW5kaWNlc0NvdW50ID0gW107XG4gICAgICBlbmNvZGVMZW5ndGgoa2V5SW5kaWNlc0NvdW50LCBhY2NvdW50cy5sZW5ndGgpO1xuICAgICAgbGV0IGRhdGFDb3VudCA9IFtdO1xuICAgICAgZW5jb2RlTGVuZ3RoKGRhdGFDb3VudCwgZGF0YS5sZW5ndGgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXgsXG4gICAgICAgIGtleUluZGljZXNDb3VudDogQnVmZmVyLmZyb20oa2V5SW5kaWNlc0NvdW50KSxcbiAgICAgICAga2V5SW5kaWNlczogYWNjb3VudHMsXG4gICAgICAgIGRhdGFMZW5ndGg6IEJ1ZmZlci5mcm9tKGRhdGFDb3VudCksXG4gICAgICAgIGRhdGFcbiAgICAgIH07XG4gICAgfSk7XG4gICAgbGV0IGluc3RydWN0aW9uQ291bnQgPSBbXTtcbiAgICBlbmNvZGVMZW5ndGgoaW5zdHJ1Y3Rpb25Db3VudCwgaW5zdHJ1Y3Rpb25zLmxlbmd0aCk7XG4gICAgbGV0IGluc3RydWN0aW9uQnVmZmVyID0gQnVmZmVyLmFsbG9jKFBBQ0tFVF9EQVRBX1NJWkUpO1xuICAgIEJ1ZmZlci5mcm9tKGluc3RydWN0aW9uQ291bnQpLmNvcHkoaW5zdHJ1Y3Rpb25CdWZmZXIpO1xuICAgIGxldCBpbnN0cnVjdGlvbkJ1ZmZlckxlbmd0aCA9IGluc3RydWN0aW9uQ291bnQubGVuZ3RoO1xuICAgIGluc3RydWN0aW9ucy5mb3JFYWNoKGluc3RydWN0aW9uID0+IHtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uTGF5b3V0ID0gQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnU4KCdwcm9ncmFtSWRJbmRleCcpLCBCdWZmZXJMYXlvdXQuYmxvYihpbnN0cnVjdGlvbi5rZXlJbmRpY2VzQ291bnQubGVuZ3RoLCAna2V5SW5kaWNlc0NvdW50JyksIEJ1ZmZlckxheW91dC5zZXEoQnVmZmVyTGF5b3V0LnU4KCdrZXlJbmRleCcpLCBpbnN0cnVjdGlvbi5rZXlJbmRpY2VzLmxlbmd0aCwgJ2tleUluZGljZXMnKSwgQnVmZmVyTGF5b3V0LmJsb2IoaW5zdHJ1Y3Rpb24uZGF0YUxlbmd0aC5sZW5ndGgsICdkYXRhTGVuZ3RoJyksIEJ1ZmZlckxheW91dC5zZXEoQnVmZmVyTGF5b3V0LnU4KCd1c2VyZGF0dW0nKSwgaW5zdHJ1Y3Rpb24uZGF0YS5sZW5ndGgsICdkYXRhJyldKTtcbiAgICAgIGNvbnN0IGxlbmd0aCA9IGluc3RydWN0aW9uTGF5b3V0LmVuY29kZShpbnN0cnVjdGlvbiwgaW5zdHJ1Y3Rpb25CdWZmZXIsIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoKTtcbiAgICAgIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoICs9IGxlbmd0aDtcbiAgICB9KTtcbiAgICBpbnN0cnVjdGlvbkJ1ZmZlciA9IGluc3RydWN0aW9uQnVmZmVyLnNsaWNlKDAsIGluc3RydWN0aW9uQnVmZmVyTGVuZ3RoKTtcbiAgICBjb25zdCBzaWduRGF0YUxheW91dCA9IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC5ibG9iKDEsICdudW1SZXF1aXJlZFNpZ25hdHVyZXMnKSwgQnVmZmVyTGF5b3V0LmJsb2IoMSwgJ251bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMnKSwgQnVmZmVyTGF5b3V0LmJsb2IoMSwgJ251bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cycpLCBCdWZmZXJMYXlvdXQuYmxvYihrZXlDb3VudC5sZW5ndGgsICdrZXlDb3VudCcpLCBCdWZmZXJMYXlvdXQuc2VxKHB1YmxpY0tleSgna2V5JyksIG51bUtleXMsICdrZXlzJyksIHB1YmxpY0tleSgncmVjZW50QmxvY2toYXNoJyldKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHtcbiAgICAgIG51bVJlcXVpcmVkU2lnbmF0dXJlczogQnVmZmVyLmZyb20oW3RoaXMuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlc10pLFxuICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogQnVmZmVyLmZyb20oW3RoaXMuaGVhZGVyLm51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHNdKSxcbiAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50czogQnVmZmVyLmZyb20oW3RoaXMuaGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50c10pLFxuICAgICAga2V5Q291bnQ6IEJ1ZmZlci5mcm9tKGtleUNvdW50KSxcbiAgICAgIGtleXM6IHRoaXMuYWNjb3VudEtleXMubWFwKGtleSA9PiB0b0J1ZmZlcihrZXkudG9CeXRlcygpKSksXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IGJzNTguZGVjb2RlKHRoaXMucmVjZW50QmxvY2toYXNoKVxuICAgIH07XG4gICAgbGV0IHNpZ25EYXRhID0gQnVmZmVyLmFsbG9jKDIwNDgpO1xuICAgIGNvbnN0IGxlbmd0aCA9IHNpZ25EYXRhTGF5b3V0LmVuY29kZSh0cmFuc2FjdGlvbiwgc2lnbkRhdGEpO1xuICAgIGluc3RydWN0aW9uQnVmZmVyLmNvcHkoc2lnbkRhdGEsIGxlbmd0aCk7XG4gICAgcmV0dXJuIHNpZ25EYXRhLnNsaWNlKDAsIGxlbmd0aCArIGluc3RydWN0aW9uQnVmZmVyLmxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGEgY29tcGlsZWQgbWVzc2FnZSBpbnRvIGEgTWVzc2FnZSBvYmplY3QuXG4gICAqL1xuICBzdGF0aWMgZnJvbShidWZmZXIpIHtcbiAgICAvLyBTbGljZSB1cCB3aXJlIGRhdGFcbiAgICBsZXQgYnl0ZUFycmF5ID0gWy4uLmJ1ZmZlcl07XG4gICAgY29uc3QgbnVtUmVxdWlyZWRTaWduYXR1cmVzID0gZ3VhcmRlZFNoaWZ0KGJ5dGVBcnJheSk7XG4gICAgaWYgKG51bVJlcXVpcmVkU2lnbmF0dXJlcyAhPT0gKG51bVJlcXVpcmVkU2lnbmF0dXJlcyAmIFZFUlNJT05fUFJFRklYX01BU0spKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1ZlcnNpb25lZCBtZXNzYWdlcyBtdXN0IGJlIGRlc2VyaWFsaXplZCB3aXRoIFZlcnNpb25lZE1lc3NhZ2UuZGVzZXJpYWxpemUoKScpO1xuICAgIH1cbiAgICBjb25zdCBudW1SZWFkb25seVNpZ25lZEFjY291bnRzID0gZ3VhcmRlZFNoaWZ0KGJ5dGVBcnJheSk7XG4gICAgY29uc3QgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzID0gZ3VhcmRlZFNoaWZ0KGJ5dGVBcnJheSk7XG4gICAgY29uc3QgYWNjb3VudENvdW50ID0gZGVjb2RlTGVuZ3RoKGJ5dGVBcnJheSk7XG4gICAgbGV0IGFjY291bnRLZXlzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhY2NvdW50Q291bnQ7IGkrKykge1xuICAgICAgY29uc3QgYWNjb3VudCA9IGd1YXJkZWRTcGxpY2UoYnl0ZUFycmF5LCAwLCBQVUJMSUNfS0VZX0xFTkdUSCk7XG4gICAgICBhY2NvdW50S2V5cy5wdXNoKG5ldyBQdWJsaWNLZXkoQnVmZmVyLmZyb20oYWNjb3VudCkpKTtcbiAgICB9XG4gICAgY29uc3QgcmVjZW50QmxvY2toYXNoID0gZ3VhcmRlZFNwbGljZShieXRlQXJyYXksIDAsIFBVQkxJQ19LRVlfTEVOR1RIKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbkNvdW50ID0gZGVjb2RlTGVuZ3RoKGJ5dGVBcnJheSk7XG4gICAgbGV0IGluc3RydWN0aW9ucyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25Db3VudDsgaSsrKSB7XG4gICAgICBjb25zdCBwcm9ncmFtSWRJbmRleCA9IGd1YXJkZWRTaGlmdChieXRlQXJyYXkpO1xuICAgICAgY29uc3QgYWNjb3VudENvdW50ID0gZGVjb2RlTGVuZ3RoKGJ5dGVBcnJheSk7XG4gICAgICBjb25zdCBhY2NvdW50cyA9IGd1YXJkZWRTcGxpY2UoYnl0ZUFycmF5LCAwLCBhY2NvdW50Q291bnQpO1xuICAgICAgY29uc3QgZGF0YUxlbmd0aCA9IGRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgICAgY29uc3QgZGF0YVNsaWNlID0gZ3VhcmRlZFNwbGljZShieXRlQXJyYXksIDAsIGRhdGFMZW5ndGgpO1xuICAgICAgY29uc3QgZGF0YSA9IGJzNTguZW5jb2RlKEJ1ZmZlci5mcm9tKGRhdGFTbGljZSkpO1xuICAgICAgaW5zdHJ1Y3Rpb25zLnB1c2goe1xuICAgICAgICBwcm9ncmFtSWRJbmRleCxcbiAgICAgICAgYWNjb3VudHMsXG4gICAgICAgIGRhdGFcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlQXJncyA9IHtcbiAgICAgIGhlYWRlcjoge1xuICAgICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXMsXG4gICAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMsXG4gICAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50c1xuICAgICAgfSxcbiAgICAgIHJlY2VudEJsb2NraGFzaDogYnM1OC5lbmNvZGUoQnVmZmVyLmZyb20ocmVjZW50QmxvY2toYXNoKSksXG4gICAgICBhY2NvdW50S2V5cyxcbiAgICAgIGluc3RydWN0aW9uc1xuICAgIH07XG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlKG1lc3NhZ2VBcmdzKTtcbiAgfVxufVxuXG4vKipcbiAqIE1lc3NhZ2UgY29uc3RydWN0b3IgYXJndW1lbnRzXG4gKi9cblxuY2xhc3MgTWVzc2FnZVYwIHtcbiAgY29uc3RydWN0b3IoYXJncykge1xuICAgIHRoaXMuaGVhZGVyID0gdm9pZCAwO1xuICAgIHRoaXMuc3RhdGljQWNjb3VudEtleXMgPSB2b2lkIDA7XG4gICAgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSB2b2lkIDA7XG4gICAgdGhpcy5jb21waWxlZEluc3RydWN0aW9ucyA9IHZvaWQgMDtcbiAgICB0aGlzLmFkZHJlc3NUYWJsZUxvb2t1cHMgPSB2b2lkIDA7XG4gICAgdGhpcy5oZWFkZXIgPSBhcmdzLmhlYWRlcjtcbiAgICB0aGlzLnN0YXRpY0FjY291bnRLZXlzID0gYXJncy5zdGF0aWNBY2NvdW50S2V5cztcbiAgICB0aGlzLnJlY2VudEJsb2NraGFzaCA9IGFyZ3MucmVjZW50QmxvY2toYXNoO1xuICAgIHRoaXMuY29tcGlsZWRJbnN0cnVjdGlvbnMgPSBhcmdzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zO1xuICAgIHRoaXMuYWRkcmVzc1RhYmxlTG9va3VwcyA9IGFyZ3MuYWRkcmVzc1RhYmxlTG9va3VwcztcbiAgfVxuICBnZXQgdmVyc2lvbigpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBnZXQgbnVtQWNjb3VudEtleXNGcm9tTG9va3VwcygpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgbG9va3VwIG9mIHRoaXMuYWRkcmVzc1RhYmxlTG9va3Vwcykge1xuICAgICAgY291bnQgKz0gbG9va3VwLnJlYWRvbmx5SW5kZXhlcy5sZW5ndGggKyBsb29rdXAud3JpdGFibGVJbmRleGVzLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG4gIGdldEFjY291bnRLZXlzKGFyZ3MpIHtcbiAgICBsZXQgYWNjb3VudEtleXNGcm9tTG9va3VwcztcbiAgICBpZiAoYXJncyAmJiAnYWNjb3VudEtleXNGcm9tTG9va3VwcycgaW4gYXJncyAmJiBhcmdzLmFjY291bnRLZXlzRnJvbUxvb2t1cHMpIHtcbiAgICAgIGlmICh0aGlzLm51bUFjY291bnRLZXlzRnJvbUxvb2t1cHMgIT0gYXJncy5hY2NvdW50S2V5c0Zyb21Mb29rdXBzLndyaXRhYmxlLmxlbmd0aCArIGFyZ3MuYWNjb3VudEtleXNGcm9tTG9va3Vwcy5yZWFkb25seS5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IGFjY291bnQga2V5cyBiZWNhdXNlIG9mIGEgbWlzbWF0Y2ggaW4gdGhlIG51bWJlciBvZiBhY2NvdW50IGtleXMgZnJvbSBsb29rdXBzJyk7XG4gICAgICB9XG4gICAgICBhY2NvdW50S2V5c0Zyb21Mb29rdXBzID0gYXJncy5hY2NvdW50S2V5c0Zyb21Mb29rdXBzO1xuICAgIH0gZWxzZSBpZiAoYXJncyAmJiAnYWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudHMnIGluIGFyZ3MgJiYgYXJncy5hZGRyZXNzTG9va3VwVGFibGVBY2NvdW50cykge1xuICAgICAgYWNjb3VudEtleXNGcm9tTG9va3VwcyA9IHRoaXMucmVzb2x2ZUFkZHJlc3NUYWJsZUxvb2t1cHMoYXJncy5hZGRyZXNzTG9va3VwVGFibGVBY2NvdW50cyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFkZHJlc3NUYWJsZUxvb2t1cHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZ2V0IGFjY291bnQga2V5cyBiZWNhdXNlIGFkZHJlc3MgdGFibGUgbG9va3VwcyB3ZXJlIG5vdCByZXNvbHZlZCcpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE1lc3NhZ2VBY2NvdW50S2V5cyh0aGlzLnN0YXRpY0FjY291bnRLZXlzLCBhY2NvdW50S2V5c0Zyb21Mb29rdXBzKTtcbiAgfVxuICBpc0FjY291bnRTaWduZXIoaW5kZXgpIHtcbiAgICByZXR1cm4gaW5kZXggPCB0aGlzLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXM7XG4gIH1cbiAgaXNBY2NvdW50V3JpdGFibGUoaW5kZXgpIHtcbiAgICBjb25zdCBudW1TaWduZWRBY2NvdW50cyA9IHRoaXMuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgICBjb25zdCBudW1TdGF0aWNBY2NvdW50S2V5cyA9IHRoaXMuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoO1xuICAgIGlmIChpbmRleCA+PSBudW1TdGF0aWNBY2NvdW50S2V5cykge1xuICAgICAgY29uc3QgbG9va3VwQWNjb3VudEtleXNJbmRleCA9IGluZGV4IC0gbnVtU3RhdGljQWNjb3VudEtleXM7XG4gICAgICBjb25zdCBudW1Xcml0YWJsZUxvb2t1cEFjY291bnRLZXlzID0gdGhpcy5hZGRyZXNzVGFibGVMb29rdXBzLnJlZHVjZSgoY291bnQsIGxvb2t1cCkgPT4gY291bnQgKyBsb29rdXAud3JpdGFibGVJbmRleGVzLmxlbmd0aCwgMCk7XG4gICAgICByZXR1cm4gbG9va3VwQWNjb3VudEtleXNJbmRleCA8IG51bVdyaXRhYmxlTG9va3VwQWNjb3VudEtleXM7XG4gICAgfSBlbHNlIGlmIChpbmRleCA+PSB0aGlzLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMpIHtcbiAgICAgIGNvbnN0IHVuc2lnbmVkQWNjb3VudEluZGV4ID0gaW5kZXggLSBudW1TaWduZWRBY2NvdW50cztcbiAgICAgIGNvbnN0IG51bVVuc2lnbmVkQWNjb3VudHMgPSBudW1TdGF0aWNBY2NvdW50S2V5cyAtIG51bVNpZ25lZEFjY291bnRzO1xuICAgICAgY29uc3QgbnVtV3JpdGFibGVVbnNpZ25lZEFjY291bnRzID0gbnVtVW5zaWduZWRBY2NvdW50cyAtIHRoaXMuaGVhZGVyLm51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cztcbiAgICAgIHJldHVybiB1bnNpZ25lZEFjY291bnRJbmRleCA8IG51bVdyaXRhYmxlVW5zaWduZWRBY2NvdW50cztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbnVtV3JpdGFibGVTaWduZWRBY2NvdW50cyA9IG51bVNpZ25lZEFjY291bnRzIC0gdGhpcy5oZWFkZXIubnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cztcbiAgICAgIHJldHVybiBpbmRleCA8IG51bVdyaXRhYmxlU2lnbmVkQWNjb3VudHM7XG4gICAgfVxuICB9XG4gIHJlc29sdmVBZGRyZXNzVGFibGVMb29rdXBzKGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzKSB7XG4gICAgY29uc3QgYWNjb3VudEtleXNGcm9tTG9va3VwcyA9IHtcbiAgICAgIHdyaXRhYmxlOiBbXSxcbiAgICAgIHJlYWRvbmx5OiBbXVxuICAgIH07XG4gICAgZm9yIChjb25zdCB0YWJsZUxvb2t1cCBvZiB0aGlzLmFkZHJlc3NUYWJsZUxvb2t1cHMpIHtcbiAgICAgIGNvbnN0IHRhYmxlQWNjb3VudCA9IGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzLmZpbmQoYWNjb3VudCA9PiBhY2NvdW50LmtleS5lcXVhbHModGFibGVMb29rdXAuYWNjb3VudEtleSkpO1xuICAgICAgaWYgKCF0YWJsZUFjY291bnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCBhZGRyZXNzIGxvb2t1cCB0YWJsZSBhY2NvdW50IGZvciB0YWJsZSBrZXkgJHt0YWJsZUxvb2t1cC5hY2NvdW50S2V5LnRvQmFzZTU4KCl9YCk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIHRhYmxlTG9va3VwLndyaXRhYmxlSW5kZXhlcykge1xuICAgICAgICBpZiAoaW5kZXggPCB0YWJsZUFjY291bnQuc3RhdGUuYWRkcmVzc2VzLmxlbmd0aCkge1xuICAgICAgICAgIGFjY291bnRLZXlzRnJvbUxvb2t1cHMud3JpdGFibGUucHVzaCh0YWJsZUFjY291bnQuc3RhdGUuYWRkcmVzc2VzW2luZGV4XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCBhZGRyZXNzIGZvciBpbmRleCAke2luZGV4fSBpbiBhZGRyZXNzIGxvb2t1cCB0YWJsZSAke3RhYmxlTG9va3VwLmFjY291bnRLZXkudG9CYXNlNTgoKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBpbmRleCBvZiB0YWJsZUxvb2t1cC5yZWFkb25seUluZGV4ZXMpIHtcbiAgICAgICAgaWYgKGluZGV4IDwgdGFibGVBY2NvdW50LnN0YXRlLmFkZHJlc3Nlcy5sZW5ndGgpIHtcbiAgICAgICAgICBhY2NvdW50S2V5c0Zyb21Mb29rdXBzLnJlYWRvbmx5LnB1c2godGFibGVBY2NvdW50LnN0YXRlLmFkZHJlc3Nlc1tpbmRleF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgYWRkcmVzcyBmb3IgaW5kZXggJHtpbmRleH0gaW4gYWRkcmVzcyBsb29rdXAgdGFibGUgJHt0YWJsZUxvb2t1cC5hY2NvdW50S2V5LnRvQmFzZTU4KCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFjY291bnRLZXlzRnJvbUxvb2t1cHM7XG4gIH1cbiAgc3RhdGljIGNvbXBpbGUoYXJncykge1xuICAgIGNvbnN0IGNvbXBpbGVkS2V5cyA9IENvbXBpbGVkS2V5cy5jb21waWxlKGFyZ3MuaW5zdHJ1Y3Rpb25zLCBhcmdzLnBheWVyS2V5KTtcbiAgICBjb25zdCBhZGRyZXNzVGFibGVMb29rdXBzID0gbmV3IEFycmF5KCk7XG4gICAgY29uc3QgYWNjb3VudEtleXNGcm9tTG9va3VwcyA9IHtcbiAgICAgIHdyaXRhYmxlOiBuZXcgQXJyYXkoKSxcbiAgICAgIHJlYWRvbmx5OiBuZXcgQXJyYXkoKVxuICAgIH07XG4gICAgY29uc3QgbG9va3VwVGFibGVBY2NvdW50cyA9IGFyZ3MuYWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudHMgfHwgW107XG4gICAgZm9yIChjb25zdCBsb29rdXBUYWJsZSBvZiBsb29rdXBUYWJsZUFjY291bnRzKSB7XG4gICAgICBjb25zdCBleHRyYWN0UmVzdWx0ID0gY29tcGlsZWRLZXlzLmV4dHJhY3RUYWJsZUxvb2t1cChsb29rdXBUYWJsZSk7XG4gICAgICBpZiAoZXh0cmFjdFJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IFthZGRyZXNzVGFibGVMb29rdXAsIHtcbiAgICAgICAgICB3cml0YWJsZSxcbiAgICAgICAgICByZWFkb25seVxuICAgICAgICB9XSA9IGV4dHJhY3RSZXN1bHQ7XG4gICAgICAgIGFkZHJlc3NUYWJsZUxvb2t1cHMucHVzaChhZGRyZXNzVGFibGVMb29rdXApO1xuICAgICAgICBhY2NvdW50S2V5c0Zyb21Mb29rdXBzLndyaXRhYmxlLnB1c2goLi4ud3JpdGFibGUpO1xuICAgICAgICBhY2NvdW50S2V5c0Zyb21Mb29rdXBzLnJlYWRvbmx5LnB1c2goLi4ucmVhZG9ubHkpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBbaGVhZGVyLCBzdGF0aWNBY2NvdW50S2V5c10gPSBjb21waWxlZEtleXMuZ2V0TWVzc2FnZUNvbXBvbmVudHMoKTtcbiAgICBjb25zdCBhY2NvdW50S2V5cyA9IG5ldyBNZXNzYWdlQWNjb3VudEtleXMoc3RhdGljQWNjb3VudEtleXMsIGFjY291bnRLZXlzRnJvbUxvb2t1cHMpO1xuICAgIGNvbnN0IGNvbXBpbGVkSW5zdHJ1Y3Rpb25zID0gYWNjb3VudEtleXMuY29tcGlsZUluc3RydWN0aW9ucyhhcmdzLmluc3RydWN0aW9ucyk7XG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlVjAoe1xuICAgICAgaGVhZGVyLFxuICAgICAgc3RhdGljQWNjb3VudEtleXMsXG4gICAgICByZWNlbnRCbG9ja2hhc2g6IGFyZ3MucmVjZW50QmxvY2toYXNoLFxuICAgICAgY29tcGlsZWRJbnN0cnVjdGlvbnMsXG4gICAgICBhZGRyZXNzVGFibGVMb29rdXBzXG4gICAgfSk7XG4gIH1cbiAgc2VyaWFsaXplKCkge1xuICAgIGNvbnN0IGVuY29kZWRTdGF0aWNBY2NvdW50S2V5c0xlbmd0aCA9IEFycmF5KCk7XG4gICAgZW5jb2RlTGVuZ3RoKGVuY29kZWRTdGF0aWNBY2NvdW50S2V5c0xlbmd0aCwgdGhpcy5zdGF0aWNBY2NvdW50S2V5cy5sZW5ndGgpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnMgPSB0aGlzLnNlcmlhbGl6ZUluc3RydWN0aW9ucygpO1xuICAgIGNvbnN0IGVuY29kZWRJbnN0cnVjdGlvbnNMZW5ndGggPSBBcnJheSgpO1xuICAgIGVuY29kZUxlbmd0aChlbmNvZGVkSW5zdHJ1Y3Rpb25zTGVuZ3RoLCB0aGlzLmNvbXBpbGVkSW5zdHJ1Y3Rpb25zLmxlbmd0aCk7XG4gICAgY29uc3Qgc2VyaWFsaXplZEFkZHJlc3NUYWJsZUxvb2t1cHMgPSB0aGlzLnNlcmlhbGl6ZUFkZHJlc3NUYWJsZUxvb2t1cHMoKTtcbiAgICBjb25zdCBlbmNvZGVkQWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aCA9IEFycmF5KCk7XG4gICAgZW5jb2RlTGVuZ3RoKGVuY29kZWRBZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoLCB0aGlzLmFkZHJlc3NUYWJsZUxvb2t1cHMubGVuZ3RoKTtcbiAgICBjb25zdCBtZXNzYWdlTGF5b3V0ID0gQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnU4KCdwcmVmaXgnKSwgQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnU4KCdudW1SZXF1aXJlZFNpZ25hdHVyZXMnKSwgQnVmZmVyTGF5b3V0LnU4KCdudW1SZWFkb25seVNpZ25lZEFjY291bnRzJyksIEJ1ZmZlckxheW91dC51OCgnbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzJyldLCAnaGVhZGVyJyksIEJ1ZmZlckxheW91dC5ibG9iKGVuY29kZWRTdGF0aWNBY2NvdW50S2V5c0xlbmd0aC5sZW5ndGgsICdzdGF0aWNBY2NvdW50S2V5c0xlbmd0aCcpLCBCdWZmZXJMYXlvdXQuc2VxKHB1YmxpY0tleSgpLCB0aGlzLnN0YXRpY0FjY291bnRLZXlzLmxlbmd0aCwgJ3N0YXRpY0FjY291bnRLZXlzJyksIHB1YmxpY0tleSgncmVjZW50QmxvY2toYXNoJyksIEJ1ZmZlckxheW91dC5ibG9iKGVuY29kZWRJbnN0cnVjdGlvbnNMZW5ndGgubGVuZ3RoLCAnaW5zdHJ1Y3Rpb25zTGVuZ3RoJyksIEJ1ZmZlckxheW91dC5ibG9iKHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnMubGVuZ3RoLCAnc2VyaWFsaXplZEluc3RydWN0aW9ucycpLCBCdWZmZXJMYXlvdXQuYmxvYihlbmNvZGVkQWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aC5sZW5ndGgsICdhZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoJyksIEJ1ZmZlckxheW91dC5ibG9iKHNlcmlhbGl6ZWRBZGRyZXNzVGFibGVMb29rdXBzLmxlbmd0aCwgJ3NlcmlhbGl6ZWRBZGRyZXNzVGFibGVMb29rdXBzJyldKTtcbiAgICBjb25zdCBzZXJpYWxpemVkTWVzc2FnZSA9IG5ldyBVaW50OEFycmF5KFBBQ0tFVF9EQVRBX1NJWkUpO1xuICAgIGNvbnN0IE1FU1NBR0VfVkVSU0lPTl8wX1BSRUZJWCA9IDEgPDwgNztcbiAgICBjb25zdCBzZXJpYWxpemVkTWVzc2FnZUxlbmd0aCA9IG1lc3NhZ2VMYXlvdXQuZW5jb2RlKHtcbiAgICAgIHByZWZpeDogTUVTU0FHRV9WRVJTSU9OXzBfUFJFRklYLFxuICAgICAgaGVhZGVyOiB0aGlzLmhlYWRlcixcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzTGVuZ3RoOiBuZXcgVWludDhBcnJheShlbmNvZGVkU3RhdGljQWNjb3VudEtleXNMZW5ndGgpLFxuICAgICAgc3RhdGljQWNjb3VudEtleXM6IHRoaXMuc3RhdGljQWNjb3VudEtleXMubWFwKGtleSA9PiBrZXkudG9CeXRlcygpKSxcbiAgICAgIHJlY2VudEJsb2NraGFzaDogYnM1OC5kZWNvZGUodGhpcy5yZWNlbnRCbG9ja2hhc2gpLFxuICAgICAgaW5zdHJ1Y3Rpb25zTGVuZ3RoOiBuZXcgVWludDhBcnJheShlbmNvZGVkSW5zdHJ1Y3Rpb25zTGVuZ3RoKSxcbiAgICAgIHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnMsXG4gICAgICBhZGRyZXNzVGFibGVMb29rdXBzTGVuZ3RoOiBuZXcgVWludDhBcnJheShlbmNvZGVkQWRkcmVzc1RhYmxlTG9va3Vwc0xlbmd0aCksXG4gICAgICBzZXJpYWxpemVkQWRkcmVzc1RhYmxlTG9va3Vwc1xuICAgIH0sIHNlcmlhbGl6ZWRNZXNzYWdlKTtcbiAgICByZXR1cm4gc2VyaWFsaXplZE1lc3NhZ2Uuc2xpY2UoMCwgc2VyaWFsaXplZE1lc3NhZ2VMZW5ndGgpO1xuICB9XG4gIHNlcmlhbGl6ZUluc3RydWN0aW9ucygpIHtcbiAgICBsZXQgc2VyaWFsaXplZExlbmd0aCA9IDA7XG4gICAgY29uc3Qgc2VyaWFsaXplZEluc3RydWN0aW9ucyA9IG5ldyBVaW50OEFycmF5KFBBQ0tFVF9EQVRBX1NJWkUpO1xuICAgIGZvciAoY29uc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcy5jb21waWxlZEluc3RydWN0aW9ucykge1xuICAgICAgY29uc3QgZW5jb2RlZEFjY291bnRLZXlJbmRleGVzTGVuZ3RoID0gQXJyYXkoKTtcbiAgICAgIGVuY29kZUxlbmd0aChlbmNvZGVkQWNjb3VudEtleUluZGV4ZXNMZW5ndGgsIGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzLmxlbmd0aCk7XG4gICAgICBjb25zdCBlbmNvZGVkRGF0YUxlbmd0aCA9IEFycmF5KCk7XG4gICAgICBlbmNvZGVMZW5ndGgoZW5jb2RlZERhdGFMZW5ndGgsIGluc3RydWN0aW9uLmRhdGEubGVuZ3RoKTtcbiAgICAgIGNvbnN0IGluc3RydWN0aW9uTGF5b3V0ID0gQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnU4KCdwcm9ncmFtSWRJbmRleCcpLCBCdWZmZXJMYXlvdXQuYmxvYihlbmNvZGVkQWNjb3VudEtleUluZGV4ZXNMZW5ndGgubGVuZ3RoLCAnZW5jb2RlZEFjY291bnRLZXlJbmRleGVzTGVuZ3RoJyksIEJ1ZmZlckxheW91dC5zZXEoQnVmZmVyTGF5b3V0LnU4KCksIGluc3RydWN0aW9uLmFjY291bnRLZXlJbmRleGVzLmxlbmd0aCwgJ2FjY291bnRLZXlJbmRleGVzJyksIEJ1ZmZlckxheW91dC5ibG9iKGVuY29kZWREYXRhTGVuZ3RoLmxlbmd0aCwgJ2VuY29kZWREYXRhTGVuZ3RoJyksIEJ1ZmZlckxheW91dC5ibG9iKGluc3RydWN0aW9uLmRhdGEubGVuZ3RoLCAnZGF0YScpXSk7XG4gICAgICBzZXJpYWxpemVkTGVuZ3RoICs9IGluc3RydWN0aW9uTGF5b3V0LmVuY29kZSh7XG4gICAgICAgIHByb2dyYW1JZEluZGV4OiBpbnN0cnVjdGlvbi5wcm9ncmFtSWRJbmRleCxcbiAgICAgICAgZW5jb2RlZEFjY291bnRLZXlJbmRleGVzTGVuZ3RoOiBuZXcgVWludDhBcnJheShlbmNvZGVkQWNjb3VudEtleUluZGV4ZXNMZW5ndGgpLFxuICAgICAgICBhY2NvdW50S2V5SW5kZXhlczogaW5zdHJ1Y3Rpb24uYWNjb3VudEtleUluZGV4ZXMsXG4gICAgICAgIGVuY29kZWREYXRhTGVuZ3RoOiBuZXcgVWludDhBcnJheShlbmNvZGVkRGF0YUxlbmd0aCksXG4gICAgICAgIGRhdGE6IGluc3RydWN0aW9uLmRhdGFcbiAgICAgIH0sIHNlcmlhbGl6ZWRJbnN0cnVjdGlvbnMsIHNlcmlhbGl6ZWRMZW5ndGgpO1xuICAgIH1cbiAgICByZXR1cm4gc2VyaWFsaXplZEluc3RydWN0aW9ucy5zbGljZSgwLCBzZXJpYWxpemVkTGVuZ3RoKTtcbiAgfVxuICBzZXJpYWxpemVBZGRyZXNzVGFibGVMb29rdXBzKCkge1xuICAgIGxldCBzZXJpYWxpemVkTGVuZ3RoID0gMDtcbiAgICBjb25zdCBzZXJpYWxpemVkQWRkcmVzc1RhYmxlTG9va3VwcyA9IG5ldyBVaW50OEFycmF5KFBBQ0tFVF9EQVRBX1NJWkUpO1xuICAgIGZvciAoY29uc3QgbG9va3VwIG9mIHRoaXMuYWRkcmVzc1RhYmxlTG9va3Vwcykge1xuICAgICAgY29uc3QgZW5jb2RlZFdyaXRhYmxlSW5kZXhlc0xlbmd0aCA9IEFycmF5KCk7XG4gICAgICBlbmNvZGVMZW5ndGgoZW5jb2RlZFdyaXRhYmxlSW5kZXhlc0xlbmd0aCwgbG9va3VwLndyaXRhYmxlSW5kZXhlcy5sZW5ndGgpO1xuICAgICAgY29uc3QgZW5jb2RlZFJlYWRvbmx5SW5kZXhlc0xlbmd0aCA9IEFycmF5KCk7XG4gICAgICBlbmNvZGVMZW5ndGgoZW5jb2RlZFJlYWRvbmx5SW5kZXhlc0xlbmd0aCwgbG9va3VwLnJlYWRvbmx5SW5kZXhlcy5sZW5ndGgpO1xuICAgICAgY29uc3QgYWRkcmVzc1RhYmxlTG9va3VwTGF5b3V0ID0gQnVmZmVyTGF5b3V0LnN0cnVjdChbcHVibGljS2V5KCdhY2NvdW50S2V5JyksIEJ1ZmZlckxheW91dC5ibG9iKGVuY29kZWRXcml0YWJsZUluZGV4ZXNMZW5ndGgubGVuZ3RoLCAnZW5jb2RlZFdyaXRhYmxlSW5kZXhlc0xlbmd0aCcpLCBCdWZmZXJMYXlvdXQuc2VxKEJ1ZmZlckxheW91dC51OCgpLCBsb29rdXAud3JpdGFibGVJbmRleGVzLmxlbmd0aCwgJ3dyaXRhYmxlSW5kZXhlcycpLCBCdWZmZXJMYXlvdXQuYmxvYihlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoLmxlbmd0aCwgJ2VuY29kZWRSZWFkb25seUluZGV4ZXNMZW5ndGgnKSwgQnVmZmVyTGF5b3V0LnNlcShCdWZmZXJMYXlvdXQudTgoKSwgbG9va3VwLnJlYWRvbmx5SW5kZXhlcy5sZW5ndGgsICdyZWFkb25seUluZGV4ZXMnKV0pO1xuICAgICAgc2VyaWFsaXplZExlbmd0aCArPSBhZGRyZXNzVGFibGVMb29rdXBMYXlvdXQuZW5jb2RlKHtcbiAgICAgICAgYWNjb3VudEtleTogbG9va3VwLmFjY291bnRLZXkudG9CeXRlcygpLFxuICAgICAgICBlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoOiBuZXcgVWludDhBcnJheShlbmNvZGVkV3JpdGFibGVJbmRleGVzTGVuZ3RoKSxcbiAgICAgICAgd3JpdGFibGVJbmRleGVzOiBsb29rdXAud3JpdGFibGVJbmRleGVzLFxuICAgICAgICBlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoOiBuZXcgVWludDhBcnJheShlbmNvZGVkUmVhZG9ubHlJbmRleGVzTGVuZ3RoKSxcbiAgICAgICAgcmVhZG9ubHlJbmRleGVzOiBsb29rdXAucmVhZG9ubHlJbmRleGVzXG4gICAgICB9LCBzZXJpYWxpemVkQWRkcmVzc1RhYmxlTG9va3Vwcywgc2VyaWFsaXplZExlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBzZXJpYWxpemVkQWRkcmVzc1RhYmxlTG9va3Vwcy5zbGljZSgwLCBzZXJpYWxpemVkTGVuZ3RoKTtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoc2VyaWFsaXplZE1lc3NhZ2UpIHtcbiAgICBsZXQgYnl0ZUFycmF5ID0gWy4uLnNlcmlhbGl6ZWRNZXNzYWdlXTtcbiAgICBjb25zdCBwcmVmaXggPSBndWFyZGVkU2hpZnQoYnl0ZUFycmF5KTtcbiAgICBjb25zdCBtYXNrZWRQcmVmaXggPSBwcmVmaXggJiBWRVJTSU9OX1BSRUZJWF9NQVNLO1xuICAgIGFzc2VydChwcmVmaXggIT09IG1hc2tlZFByZWZpeCwgYEV4cGVjdGVkIHZlcnNpb25lZCBtZXNzYWdlIGJ1dCByZWNlaXZlZCBsZWdhY3kgbWVzc2FnZWApO1xuICAgIGNvbnN0IHZlcnNpb24gPSBtYXNrZWRQcmVmaXg7XG4gICAgYXNzZXJ0KHZlcnNpb24gPT09IDAsIGBFeHBlY3RlZCB2ZXJzaW9uZWQgbWVzc2FnZSB3aXRoIHZlcnNpb24gMCBidXQgZm91bmQgdmVyc2lvbiAke3ZlcnNpb259YCk7XG4gICAgY29uc3QgaGVhZGVyID0ge1xuICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzOiBndWFyZGVkU2hpZnQoYnl0ZUFycmF5KSxcbiAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM6IGd1YXJkZWRTaGlmdChieXRlQXJyYXkpLFxuICAgICAgbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzOiBndWFyZGVkU2hpZnQoYnl0ZUFycmF5KVxuICAgIH07XG4gICAgY29uc3Qgc3RhdGljQWNjb3VudEtleXMgPSBbXTtcbiAgICBjb25zdCBzdGF0aWNBY2NvdW50S2V5c0xlbmd0aCA9IGRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdGljQWNjb3VudEtleXNMZW5ndGg7IGkrKykge1xuICAgICAgc3RhdGljQWNjb3VudEtleXMucHVzaChuZXcgUHVibGljS2V5KGd1YXJkZWRTcGxpY2UoYnl0ZUFycmF5LCAwLCBQVUJMSUNfS0VZX0xFTkdUSCkpKTtcbiAgICB9XG4gICAgY29uc3QgcmVjZW50QmxvY2toYXNoID0gYnM1OC5lbmNvZGUoZ3VhcmRlZFNwbGljZShieXRlQXJyYXksIDAsIFBVQkxJQ19LRVlfTEVOR1RIKSk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25Db3VudCA9IGRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgIGNvbnN0IGNvbXBpbGVkSW5zdHJ1Y3Rpb25zID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbkNvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IHByb2dyYW1JZEluZGV4ID0gZ3VhcmRlZFNoaWZ0KGJ5dGVBcnJheSk7XG4gICAgICBjb25zdCBhY2NvdW50S2V5SW5kZXhlc0xlbmd0aCA9IGRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgICAgY29uc3QgYWNjb3VudEtleUluZGV4ZXMgPSBndWFyZGVkU3BsaWNlKGJ5dGVBcnJheSwgMCwgYWNjb3VudEtleUluZGV4ZXNMZW5ndGgpO1xuICAgICAgY29uc3QgZGF0YUxlbmd0aCA9IGRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGd1YXJkZWRTcGxpY2UoYnl0ZUFycmF5LCAwLCBkYXRhTGVuZ3RoKSk7XG4gICAgICBjb21waWxlZEluc3RydWN0aW9ucy5wdXNoKHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXgsXG4gICAgICAgIGFjY291bnRLZXlJbmRleGVzLFxuICAgICAgICBkYXRhXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgYWRkcmVzc1RhYmxlTG9va3Vwc0NvdW50ID0gZGVjb2RlTGVuZ3RoKGJ5dGVBcnJheSk7XG4gICAgY29uc3QgYWRkcmVzc1RhYmxlTG9va3VwcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWRkcmVzc1RhYmxlTG9va3Vwc0NvdW50OyBpKyspIHtcbiAgICAgIGNvbnN0IGFjY291bnRLZXkgPSBuZXcgUHVibGljS2V5KGd1YXJkZWRTcGxpY2UoYnl0ZUFycmF5LCAwLCBQVUJMSUNfS0VZX0xFTkdUSCkpO1xuICAgICAgY29uc3Qgd3JpdGFibGVJbmRleGVzTGVuZ3RoID0gZGVjb2RlTGVuZ3RoKGJ5dGVBcnJheSk7XG4gICAgICBjb25zdCB3cml0YWJsZUluZGV4ZXMgPSBndWFyZGVkU3BsaWNlKGJ5dGVBcnJheSwgMCwgd3JpdGFibGVJbmRleGVzTGVuZ3RoKTtcbiAgICAgIGNvbnN0IHJlYWRvbmx5SW5kZXhlc0xlbmd0aCA9IGRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgICAgY29uc3QgcmVhZG9ubHlJbmRleGVzID0gZ3VhcmRlZFNwbGljZShieXRlQXJyYXksIDAsIHJlYWRvbmx5SW5kZXhlc0xlbmd0aCk7XG4gICAgICBhZGRyZXNzVGFibGVMb29rdXBzLnB1c2goe1xuICAgICAgICBhY2NvdW50S2V5LFxuICAgICAgICB3cml0YWJsZUluZGV4ZXMsXG4gICAgICAgIHJlYWRvbmx5SW5kZXhlc1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgTWVzc2FnZVYwKHtcbiAgICAgIGhlYWRlcixcbiAgICAgIHN0YXRpY0FjY291bnRLZXlzLFxuICAgICAgcmVjZW50QmxvY2toYXNoLFxuICAgICAgY29tcGlsZWRJbnN0cnVjdGlvbnMsXG4gICAgICBhZGRyZXNzVGFibGVMb29rdXBzXG4gICAgfSk7XG4gIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuY29uc3QgVmVyc2lvbmVkTWVzc2FnZSA9IHtcbiAgZGVzZXJpYWxpemVNZXNzYWdlVmVyc2lvbihzZXJpYWxpemVkTWVzc2FnZSkge1xuICAgIGNvbnN0IHByZWZpeCA9IHNlcmlhbGl6ZWRNZXNzYWdlWzBdO1xuICAgIGNvbnN0IG1hc2tlZFByZWZpeCA9IHByZWZpeCAmIFZFUlNJT05fUFJFRklYX01BU0s7XG5cbiAgICAvLyBpZiB0aGUgaGlnaGVzdCBiaXQgb2YgdGhlIHByZWZpeCBpcyBub3Qgc2V0LCB0aGUgbWVzc2FnZSBpcyBub3QgdmVyc2lvbmVkXG4gICAgaWYgKG1hc2tlZFByZWZpeCA9PT0gcHJlZml4KSB7XG4gICAgICByZXR1cm4gJ2xlZ2FjeSc7XG4gICAgfVxuXG4gICAgLy8gdGhlIGxvd2VyIDcgYml0cyBvZiB0aGUgcHJlZml4IGluZGljYXRlIHRoZSBtZXNzYWdlIHZlcnNpb25cbiAgICByZXR1cm4gbWFza2VkUHJlZml4O1xuICB9LFxuICBkZXNlcmlhbGl6ZTogc2VyaWFsaXplZE1lc3NhZ2UgPT4ge1xuICAgIGNvbnN0IHZlcnNpb24gPSBWZXJzaW9uZWRNZXNzYWdlLmRlc2VyaWFsaXplTWVzc2FnZVZlcnNpb24oc2VyaWFsaXplZE1lc3NhZ2UpO1xuICAgIGlmICh2ZXJzaW9uID09PSAnbGVnYWN5Jykge1xuICAgICAgcmV0dXJuIE1lc3NhZ2UuZnJvbShzZXJpYWxpemVkTWVzc2FnZSk7XG4gICAgfVxuICAgIGlmICh2ZXJzaW9uID09PSAwKSB7XG4gICAgICByZXR1cm4gTWVzc2FnZVYwLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWRNZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUcmFuc2FjdGlvbiBtZXNzYWdlIHZlcnNpb24gJHt2ZXJzaW9ufSBkZXNlcmlhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgIH1cbiAgfVxufTtcblxuLyoqIEBpbnRlcm5hbCAqL1xuXG4vKipcbiAqIFRyYW5zYWN0aW9uIHNpZ25hdHVyZSBhcyBiYXNlLTU4IGVuY29kZWQgc3RyaW5nXG4gKi9cblxubGV0IFRyYW5zYWN0aW9uU3RhdHVzID0gLyojX19QVVJFX18qL2Z1bmN0aW9uIChUcmFuc2FjdGlvblN0YXR1cykge1xuICBUcmFuc2FjdGlvblN0YXR1c1tUcmFuc2FjdGlvblN0YXR1c1tcIkJMT0NLSEVJR0hUX0VYQ0VFREVEXCJdID0gMF0gPSBcIkJMT0NLSEVJR0hUX0VYQ0VFREVEXCI7XG4gIFRyYW5zYWN0aW9uU3RhdHVzW1RyYW5zYWN0aW9uU3RhdHVzW1wiUFJPQ0VTU0VEXCJdID0gMV0gPSBcIlBST0NFU1NFRFwiO1xuICBUcmFuc2FjdGlvblN0YXR1c1tUcmFuc2FjdGlvblN0YXR1c1tcIlRJTUVEX09VVFwiXSA9IDJdID0gXCJUSU1FRF9PVVRcIjtcbiAgVHJhbnNhY3Rpb25TdGF0dXNbVHJhbnNhY3Rpb25TdGF0dXNbXCJOT05DRV9JTlZBTElEXCJdID0gM10gPSBcIk5PTkNFX0lOVkFMSURcIjtcbiAgcmV0dXJuIFRyYW5zYWN0aW9uU3RhdHVzO1xufSh7fSk7XG5cbi8qKlxuICogRGVmYXVsdCAoZW1wdHkpIHNpZ25hdHVyZVxuICovXG5jb25zdCBERUZBVUxUX1NJR05BVFVSRSA9IEJ1ZmZlci5hbGxvYyhTSUdOQVRVUkVfTEVOR1RIX0lOX0JZVEVTKS5maWxsKDApO1xuXG4vKipcbiAqIEFjY291bnQgbWV0YWRhdGEgdXNlZCB0byBkZWZpbmUgaW5zdHJ1Y3Rpb25zXG4gKi9cblxuLyoqXG4gKiBMaXN0IG9mIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24gb2JqZWN0IGZpZWxkcyB0aGF0IG1heSBiZSBpbml0aWFsaXplZCBhdCBjb25zdHJ1Y3Rpb25cbiAqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBUcmFuc2FjdGlvbi5zZXJpYWxpemUoKVxuICovXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBJbnN0cnVjdGlvbiBjbGFzc1xuICovXG5jbGFzcyBUcmFuc2FjdGlvbkluc3RydWN0aW9uIHtcbiAgY29uc3RydWN0b3Iob3B0cykge1xuICAgIC8qKlxuICAgICAqIFB1YmxpYyBrZXlzIHRvIGluY2x1ZGUgaW4gdGhpcyB0cmFuc2FjdGlvblxuICAgICAqIEJvb2xlYW4gcmVwcmVzZW50cyB3aGV0aGVyIHRoaXMgcHVia2V5IG5lZWRzIHRvIHNpZ24gdGhlIHRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdGhpcy5rZXlzID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIFByb2dyYW0gSWQgdG8gZXhlY3V0ZVxuICAgICAqL1xuICAgIHRoaXMucHJvZ3JhbUlkID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIFByb2dyYW0gaW5wdXRcbiAgICAgKi9cbiAgICB0aGlzLmRhdGEgPSBCdWZmZXIuYWxsb2MoMCk7XG4gICAgdGhpcy5wcm9ncmFtSWQgPSBvcHRzLnByb2dyYW1JZDtcbiAgICB0aGlzLmtleXMgPSBvcHRzLmtleXM7XG4gICAgaWYgKG9wdHMuZGF0YSkge1xuICAgICAgdGhpcy5kYXRhID0gb3B0cy5kYXRhO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHRvSlNPTigpIHtcbiAgICByZXR1cm4ge1xuICAgICAga2V5czogdGhpcy5rZXlzLm1hcCgoe1xuICAgICAgICBwdWJrZXksXG4gICAgICAgIGlzU2lnbmVyLFxuICAgICAgICBpc1dyaXRhYmxlXG4gICAgICB9KSA9PiAoe1xuICAgICAgICBwdWJrZXk6IHB1YmtleS50b0pTT04oKSxcbiAgICAgICAgaXNTaWduZXIsXG4gICAgICAgIGlzV3JpdGFibGVcbiAgICAgIH0pKSxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQudG9KU09OKCksXG4gICAgICBkYXRhOiBbLi4udGhpcy5kYXRhXVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBQYWlyIG9mIHNpZ25hdHVyZSBhbmQgY29ycmVzcG9uZGluZyBwdWJsaWMga2V5XG4gKi9cblxuLyoqXG4gKiBMaXN0IG9mIFRyYW5zYWN0aW9uIG9iamVjdCBmaWVsZHMgdGhhdCBtYXkgYmUgaW5pdGlhbGl6ZWQgYXQgY29uc3RydWN0aW9uXG4gKi9cblxuLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk7IGFuIHVuZm9ydHVuYXRlIGNvbnNlcXVlbmNlIG9mIGJlaW5nXG4vLyBmb3JjZWQgdG8gb3Zlci1leHBvcnQgdHlwZXMgYnkgdGhlIGRvY3VtZW50YXRpb24gZ2VuZXJhdG9yLlxuLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zb2xhbmEtbGFicy9zb2xhbmEvcHVsbC8yNTgyMFxuXG4vKipcbiAqIEJsb2NraGFzaC1iYXNlZCB0cmFuc2FjdGlvbnMgaGF2ZSBhIGxpZmV0aW1lIHRoYXQgYXJlIGRlZmluZWQgYnlcbiAqIHRoZSBibG9ja2hhc2ggdGhleSBpbmNsdWRlLiBBbnkgdHJhbnNhY3Rpb24gd2hvc2UgYmxvY2toYXNoIGlzXG4gKiB0b28gb2xkIHdpbGwgYmUgcmVqZWN0ZWQuXG4gKi9cblxuLyoqXG4gKiBVc2UgdGhlc2Ugb3B0aW9ucyB0byBjb25zdHJ1Y3QgYSBkdXJhYmxlIG5vbmNlIHRyYW5zYWN0aW9uLlxuICovXG5cbi8qKlxuICogTm9uY2UgaW5mb3JtYXRpb24gdG8gYmUgdXNlZCB0byBidWlsZCBhbiBvZmZsaW5lIFRyYW5zYWN0aW9uLlxuICovXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBjbGFzc1xuICovXG5jbGFzcyBUcmFuc2FjdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgKHBheWVyKSBUcmFuc2FjdGlvbiBzaWduYXR1cmVcbiAgICpcbiAgICogQHJldHVybnMge0J1ZmZlciB8IG51bGx9IEJ1ZmZlciBvZiBwYXllcidzIHNpZ25hdHVyZVxuICAgKi9cbiAgZ2V0IHNpZ25hdHVyZSgpIHtcbiAgICBpZiAodGhpcy5zaWduYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25hdHVyZXNbMF0uc2lnbmF0dXJlO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHJhbnNhY3Rpb24gZmVlIHBheWVyXG4gICAqL1xuXG4gIC8vIENvbnN0cnVjdCBhIHRyYW5zYWN0aW9uIHdpdGggYSBibG9ja2hhc2ggYW5kIGxhc3RWYWxpZEJsb2NrSGVpZ2h0XG5cbiAgLy8gQ29uc3RydWN0IGEgdHJhbnNhY3Rpb24gdXNpbmcgYSBkdXJhYmxlIG5vbmNlXG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIGBUcmFuc2FjdGlvbkN0b3JGaWVsZHNgIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICAgKiBQbGVhc2Ugc3VwcGx5IGEgYFRyYW5zYWN0aW9uQmxvY2toYXNoQ3RvcmAgaW5zdGVhZC5cbiAgICovXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhbiBlbXB0eSBUcmFuc2FjdGlvblxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0cykge1xuICAgIC8qKlxuICAgICAqIFNpZ25hdHVyZXMgZm9yIHRoZSB0cmFuc2FjdGlvbi4gIFR5cGljYWxseSBjcmVhdGVkIGJ5IGludm9raW5nIHRoZVxuICAgICAqIGBzaWduKClgIG1ldGhvZFxuICAgICAqL1xuICAgIHRoaXMuc2lnbmF0dXJlcyA9IFtdO1xuICAgIHRoaXMuZmVlUGF5ZXIgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RydWN0aW9ucyB0byBhdG9taWNhbGx5IGV4ZWN1dGVcbiAgICAgKi9cbiAgICB0aGlzLmluc3RydWN0aW9ucyA9IFtdO1xuICAgIC8qKlxuICAgICAqIEEgcmVjZW50IHRyYW5zYWN0aW9uIGlkLiBNdXN0IGJlIHBvcHVsYXRlZCBieSB0aGUgY2FsbGVyXG4gICAgICovXG4gICAgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogdGhlIGxhc3QgYmxvY2sgY2hhaW4gY2FuIGFkdmFuY2UgdG8gYmVmb3JlIHR4IGlzIGRlY2xhcmVkIGV4cGlyZWRcbiAgICAgKiAqL1xuICAgIHRoaXMubGFzdFZhbGlkQmxvY2tIZWlnaHQgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogT3B0aW9uYWwgTm9uY2UgaW5mb3JtYXRpb24uIElmIHBvcHVsYXRlZCwgdHJhbnNhY3Rpb24gd2lsbCB1c2UgYSBkdXJhYmxlXG4gICAgICogTm9uY2UgaGFzaCBpbnN0ZWFkIG9mIGEgcmVjZW50QmxvY2toYXNoLiBNdXN0IGJlIHBvcHVsYXRlZCBieSB0aGUgY2FsbGVyXG4gICAgICovXG4gICAgdGhpcy5ub25jZUluZm8gPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBpcyBhIG5vbmNlIHRyYW5zYWN0aW9uIHRoaXMgcmVwcmVzZW50cyB0aGUgbWluaW11bSBzbG90IGZyb20gd2hpY2hcbiAgICAgKiB0byBldmFsdWF0ZSBpZiB0aGUgbm9uY2UgaGFzIGFkdmFuY2VkIHdoZW4gYXR0ZW1wdGluZyB0byBjb25maXJtIHRoZVxuICAgICAqIHRyYW5zYWN0aW9uLiBUaGlzIHByb3RlY3RzIGFnYWluc3QgYSBjYXNlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBjb25maXJtYXRpb25cbiAgICAgKiBsb2dpYyBsb2FkcyB0aGUgbm9uY2UgYWNjb3VudCBmcm9tIGFuIG9sZCBzbG90IGFuZCBhc3N1bWVzIHRoZSBtaXNtYXRjaCBpblxuICAgICAqIG5vbmNlIHZhbHVlIGltcGxpZXMgdGhhdCB0aGUgbm9uY2UgaGFzIGJlZW4gYWR2YW5jZWQuXG4gICAgICovXG4gICAgdGhpcy5taW5Ob25jZUNvbnRleHRTbG90ID0gdm9pZCAwO1xuICAgIC8qKlxuICAgICAqIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHRoaXMuX21lc3NhZ2UgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgdGhpcy5fanNvbiA9IHZvaWQgMDtcbiAgICBpZiAoIW9wdHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKG9wdHMuZmVlUGF5ZXIpIHtcbiAgICAgIHRoaXMuZmVlUGF5ZXIgPSBvcHRzLmZlZVBheWVyO1xuICAgIH1cbiAgICBpZiAob3B0cy5zaWduYXR1cmVzKSB7XG4gICAgICB0aGlzLnNpZ25hdHVyZXMgPSBvcHRzLnNpZ25hdHVyZXM7XG4gICAgfVxuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0cywgJ25vbmNlSW5mbycpKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1pbkNvbnRleHRTbG90LFxuICAgICAgICBub25jZUluZm9cbiAgICAgIH0gPSBvcHRzO1xuICAgICAgdGhpcy5taW5Ob25jZUNvbnRleHRTbG90ID0gbWluQ29udGV4dFNsb3Q7XG4gICAgICB0aGlzLm5vbmNlSW5mbyA9IG5vbmNlSW5mbztcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRzLCAnbGFzdFZhbGlkQmxvY2tIZWlnaHQnKSkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBibG9ja2hhc2gsXG4gICAgICAgIGxhc3RWYWxpZEJsb2NrSGVpZ2h0XG4gICAgICB9ID0gb3B0cztcbiAgICAgIHRoaXMucmVjZW50QmxvY2toYXNoID0gYmxvY2toYXNoO1xuICAgICAgdGhpcy5sYXN0VmFsaWRCbG9ja0hlaWdodCA9IGxhc3RWYWxpZEJsb2NrSGVpZ2h0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHJlY2VudEJsb2NraGFzaCxcbiAgICAgICAgbm9uY2VJbmZvXG4gICAgICB9ID0gb3B0cztcbiAgICAgIGlmIChub25jZUluZm8pIHtcbiAgICAgICAgdGhpcy5ub25jZUluZm8gPSBub25jZUluZm87XG4gICAgICB9XG4gICAgICB0aGlzLnJlY2VudEJsb2NraGFzaCA9IHJlY2VudEJsb2NraGFzaDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY2VudEJsb2NraGFzaDogdGhpcy5yZWNlbnRCbG9ja2hhc2ggfHwgbnVsbCxcbiAgICAgIGZlZVBheWVyOiB0aGlzLmZlZVBheWVyID8gdGhpcy5mZWVQYXllci50b0pTT04oKSA6IG51bGwsXG4gICAgICBub25jZUluZm86IHRoaXMubm9uY2VJbmZvID8ge1xuICAgICAgICBub25jZTogdGhpcy5ub25jZUluZm8ubm9uY2UsXG4gICAgICAgIG5vbmNlSW5zdHJ1Y3Rpb246IHRoaXMubm9uY2VJbmZvLm5vbmNlSW5zdHJ1Y3Rpb24udG9KU09OKClcbiAgICAgIH0gOiBudWxsLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiB0aGlzLmluc3RydWN0aW9ucy5tYXAoaW5zdHJ1Y3Rpb24gPT4gaW5zdHJ1Y3Rpb24udG9KU09OKCkpLFxuICAgICAgc2lnbmVyczogdGhpcy5zaWduYXR1cmVzLm1hcCgoe1xuICAgICAgICBwdWJsaWNLZXlcbiAgICAgIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHB1YmxpY0tleS50b0pTT04oKTtcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgb25lIG9yIG1vcmUgaW5zdHJ1Y3Rpb25zIHRvIHRoaXMgVHJhbnNhY3Rpb25cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheTwgVHJhbnNhY3Rpb24gfCBUcmFuc2FjdGlvbkluc3RydWN0aW9uIHwgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbkN0b3JGaWVsZHMgPn0gaXRlbXMgLSBJbnN0cnVjdGlvbnMgdG8gYWRkIHRvIHRoZSBUcmFuc2FjdGlvblxuICAgKi9cbiAgYWRkKC4uLml0ZW1zKSB7XG4gICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBpbnN0cnVjdGlvbnMnKTtcbiAgICB9XG4gICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgIGlmICgnaW5zdHJ1Y3Rpb25zJyBpbiBpdGVtKSB7XG4gICAgICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gdGhpcy5pbnN0cnVjdGlvbnMuY29uY2F0KGl0ZW0uaW5zdHJ1Y3Rpb25zKTtcbiAgICAgIH0gZWxzZSBpZiAoJ2RhdGEnIGluIGl0ZW0gJiYgJ3Byb2dyYW1JZCcgaW4gaXRlbSAmJiAna2V5cycgaW4gaXRlbSkge1xuICAgICAgICB0aGlzLmluc3RydWN0aW9ucy5wdXNoKGl0ZW0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5pbnN0cnVjdGlvbnMucHVzaChuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbihpdGVtKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGlsZSB0cmFuc2FjdGlvbiBkYXRhXG4gICAqL1xuICBjb21waWxlTWVzc2FnZSgpIHtcbiAgICBpZiAodGhpcy5fbWVzc2FnZSAmJiBKU09OLnN0cmluZ2lmeSh0aGlzLnRvSlNPTigpKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fanNvbikpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xuICAgIH1cbiAgICBsZXQgcmVjZW50QmxvY2toYXNoO1xuICAgIGxldCBpbnN0cnVjdGlvbnM7XG4gICAgaWYgKHRoaXMubm9uY2VJbmZvKSB7XG4gICAgICByZWNlbnRCbG9ja2hhc2ggPSB0aGlzLm5vbmNlSW5mby5ub25jZTtcbiAgICAgIGlmICh0aGlzLmluc3RydWN0aW9uc1swXSAhPSB0aGlzLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uKSB7XG4gICAgICAgIGluc3RydWN0aW9ucyA9IFt0aGlzLm5vbmNlSW5mby5ub25jZUluc3RydWN0aW9uLCAuLi50aGlzLmluc3RydWN0aW9uc107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0cnVjdGlvbnMgPSB0aGlzLmluc3RydWN0aW9ucztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVjZW50QmxvY2toYXNoID0gdGhpcy5yZWNlbnRCbG9ja2hhc2g7XG4gICAgICBpbnN0cnVjdGlvbnMgPSB0aGlzLmluc3RydWN0aW9ucztcbiAgICB9XG4gICAgaWYgKCFyZWNlbnRCbG9ja2hhc2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gcmVjZW50QmxvY2toYXNoIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmIChpbnN0cnVjdGlvbnMubGVuZ3RoIDwgMSkge1xuICAgICAgY29uc29sZS53YXJuKCdObyBpbnN0cnVjdGlvbnMgcHJvdmlkZWQnKTtcbiAgICB9XG4gICAgbGV0IGZlZVBheWVyO1xuICAgIGlmICh0aGlzLmZlZVBheWVyKSB7XG4gICAgICBmZWVQYXllciA9IHRoaXMuZmVlUGF5ZXI7XG4gICAgfSBlbHNlIGlmICh0aGlzLnNpZ25hdHVyZXMubGVuZ3RoID4gMCAmJiB0aGlzLnNpZ25hdHVyZXNbMF0ucHVibGljS2V5KSB7XG4gICAgICAvLyBVc2UgaW1wbGljaXQgZmVlIHBheWVyXG4gICAgICBmZWVQYXllciA9IHRoaXMuc2lnbmF0dXJlc1swXS5wdWJsaWNLZXk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gZmVlIHBheWVyIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zdHJ1Y3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaW5zdHJ1Y3Rpb25zW2ldLnByb2dyYW1JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gaW5zdHJ1Y3Rpb24gaW5kZXggJHtpfSBoYXMgdW5kZWZpbmVkIHByb2dyYW0gaWRgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbUlkcyA9IFtdO1xuICAgIGNvbnN0IGFjY291bnRNZXRhcyA9IFtdO1xuICAgIGluc3RydWN0aW9ucy5mb3JFYWNoKGluc3RydWN0aW9uID0+IHtcbiAgICAgIGluc3RydWN0aW9uLmtleXMuZm9yRWFjaChhY2NvdW50TWV0YSA9PiB7XG4gICAgICAgIGFjY291bnRNZXRhcy5wdXNoKHtcbiAgICAgICAgICAuLi5hY2NvdW50TWV0YVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcHJvZ3JhbUlkID0gaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkLnRvU3RyaW5nKCk7XG4gICAgICBpZiAoIXByb2dyYW1JZHMuaW5jbHVkZXMocHJvZ3JhbUlkKSkge1xuICAgICAgICBwcm9ncmFtSWRzLnB1c2gocHJvZ3JhbUlkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEFwcGVuZCBwcm9ncmFtSUQgYWNjb3VudCBtZXRhc1xuICAgIHByb2dyYW1JZHMuZm9yRWFjaChwcm9ncmFtSWQgPT4ge1xuICAgICAgYWNjb3VudE1ldGFzLnB1c2goe1xuICAgICAgICBwdWJrZXk6IG5ldyBQdWJsaWNLZXkocHJvZ3JhbUlkKSxcbiAgICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBDdWxsIGR1cGxpY2F0ZSBhY2NvdW50IG1ldGFzXG4gICAgY29uc3QgdW5pcXVlTWV0YXMgPSBbXTtcbiAgICBhY2NvdW50TWV0YXMuZm9yRWFjaChhY2NvdW50TWV0YSA9PiB7XG4gICAgICBjb25zdCBwdWJrZXlTdHJpbmcgPSBhY2NvdW50TWV0YS5wdWJrZXkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHVuaXF1ZUluZGV4ID0gdW5pcXVlTWV0YXMuZmluZEluZGV4KHggPT4ge1xuICAgICAgICByZXR1cm4geC5wdWJrZXkudG9TdHJpbmcoKSA9PT0gcHVia2V5U3RyaW5nO1xuICAgICAgfSk7XG4gICAgICBpZiAodW5pcXVlSW5kZXggPiAtMSkge1xuICAgICAgICB1bmlxdWVNZXRhc1t1bmlxdWVJbmRleF0uaXNXcml0YWJsZSA9IHVuaXF1ZU1ldGFzW3VuaXF1ZUluZGV4XS5pc1dyaXRhYmxlIHx8IGFjY291bnRNZXRhLmlzV3JpdGFibGU7XG4gICAgICAgIHVuaXF1ZU1ldGFzW3VuaXF1ZUluZGV4XS5pc1NpZ25lciA9IHVuaXF1ZU1ldGFzW3VuaXF1ZUluZGV4XS5pc1NpZ25lciB8fCBhY2NvdW50TWV0YS5pc1NpZ25lcjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVuaXF1ZU1ldGFzLnB1c2goYWNjb3VudE1ldGEpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gU29ydC4gUHJpb3JpdGl6aW5nIGZpcnN0IGJ5IHNpZ25lciwgdGhlbiBieSB3cml0YWJsZVxuICAgIHVuaXF1ZU1ldGFzLnNvcnQoZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgIGlmICh4LmlzU2lnbmVyICE9PSB5LmlzU2lnbmVyKSB7XG4gICAgICAgIC8vIFNpZ25lcnMgYWx3YXlzIGNvbWUgYmVmb3JlIG5vbi1zaWduZXJzXG4gICAgICAgIHJldHVybiB4LmlzU2lnbmVyID8gLTEgOiAxO1xuICAgICAgfVxuICAgICAgaWYgKHguaXNXcml0YWJsZSAhPT0geS5pc1dyaXRhYmxlKSB7XG4gICAgICAgIC8vIFdyaXRhYmxlIGFjY291bnRzIGFsd2F5cyBjb21lIGJlZm9yZSByZWFkLW9ubHkgYWNjb3VudHNcbiAgICAgICAgcmV0dXJuIHguaXNXcml0YWJsZSA/IC0xIDogMTtcbiAgICAgIH1cbiAgICAgIC8vIE90aGVyd2lzZSwgc29ydCBieSBwdWJrZXksIHN0cmluZ3dpc2UuXG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBsb2NhbGVNYXRjaGVyOiAnYmVzdCBmaXQnLFxuICAgICAgICB1c2FnZTogJ3NvcnQnLFxuICAgICAgICBzZW5zaXRpdml0eTogJ3ZhcmlhbnQnLFxuICAgICAgICBpZ25vcmVQdW5jdHVhdGlvbjogZmFsc2UsXG4gICAgICAgIG51bWVyaWM6IGZhbHNlLFxuICAgICAgICBjYXNlRmlyc3Q6ICdsb3dlcidcbiAgICAgIH07XG4gICAgICByZXR1cm4geC5wdWJrZXkudG9CYXNlNTgoKS5sb2NhbGVDb21wYXJlKHkucHVia2V5LnRvQmFzZTU4KCksICdlbicsIG9wdGlvbnMpO1xuICAgIH0pO1xuXG4gICAgLy8gTW92ZSBmZWUgcGF5ZXIgdG8gdGhlIGZyb250XG4gICAgY29uc3QgZmVlUGF5ZXJJbmRleCA9IHVuaXF1ZU1ldGFzLmZpbmRJbmRleCh4ID0+IHtcbiAgICAgIHJldHVybiB4LnB1YmtleS5lcXVhbHMoZmVlUGF5ZXIpO1xuICAgIH0pO1xuICAgIGlmIChmZWVQYXllckluZGV4ID4gLTEpIHtcbiAgICAgIGNvbnN0IFtwYXllck1ldGFdID0gdW5pcXVlTWV0YXMuc3BsaWNlKGZlZVBheWVySW5kZXgsIDEpO1xuICAgICAgcGF5ZXJNZXRhLmlzU2lnbmVyID0gdHJ1ZTtcbiAgICAgIHBheWVyTWV0YS5pc1dyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIHVuaXF1ZU1ldGFzLnVuc2hpZnQocGF5ZXJNZXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdW5pcXVlTWV0YXMudW5zaGlmdCh7XG4gICAgICAgIHB1YmtleTogZmVlUGF5ZXIsXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBEaXNhbGxvdyB1bmtub3duIHNpZ25lcnNcbiAgICBmb3IgKGNvbnN0IHNpZ25hdHVyZSBvZiB0aGlzLnNpZ25hdHVyZXMpIHtcbiAgICAgIGNvbnN0IHVuaXF1ZUluZGV4ID0gdW5pcXVlTWV0YXMuZmluZEluZGV4KHggPT4ge1xuICAgICAgICByZXR1cm4geC5wdWJrZXkuZXF1YWxzKHNpZ25hdHVyZS5wdWJsaWNLZXkpO1xuICAgICAgfSk7XG4gICAgICBpZiAodW5pcXVlSW5kZXggPiAtMSkge1xuICAgICAgICBpZiAoIXVuaXF1ZU1ldGFzW3VuaXF1ZUluZGV4XS5pc1NpZ25lcikge1xuICAgICAgICAgIHVuaXF1ZU1ldGFzW3VuaXF1ZUluZGV4XS5pc1NpZ25lciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdUcmFuc2FjdGlvbiByZWZlcmVuY2VzIGEgc2lnbmF0dXJlIHRoYXQgaXMgdW5uZWNlc3NhcnksICcgKyAnb25seSB0aGUgZmVlIHBheWVyIGFuZCBpbnN0cnVjdGlvbiBzaWduZXIgYWNjb3VudHMgc2hvdWxkIHNpZ24gYSB0cmFuc2FjdGlvbi4gJyArICdUaGlzIGJlaGF2aW9yIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgdGhyb3cgYW4gZXJyb3IgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiByZWxlYXNlLicpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVua25vd24gc2lnbmVyOiAke3NpZ25hdHVyZS5wdWJsaWNLZXkudG9TdHJpbmcoKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IG51bVJlcXVpcmVkU2lnbmF0dXJlcyA9IDA7XG4gICAgbGV0IG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMgPSAwO1xuICAgIGxldCBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHMgPSAwO1xuXG4gICAgLy8gU3BsaXQgb3V0IHNpZ25pbmcgZnJvbSBub24tc2lnbmluZyBrZXlzIGFuZCBjb3VudCBoZWFkZXIgdmFsdWVzXG4gICAgY29uc3Qgc2lnbmVkS2V5cyA9IFtdO1xuICAgIGNvbnN0IHVuc2lnbmVkS2V5cyA9IFtdO1xuICAgIHVuaXF1ZU1ldGFzLmZvckVhY2goKHtcbiAgICAgIHB1YmtleSxcbiAgICAgIGlzU2lnbmVyLFxuICAgICAgaXNXcml0YWJsZVxuICAgIH0pID0+IHtcbiAgICAgIGlmIChpc1NpZ25lcikge1xuICAgICAgICBzaWduZWRLZXlzLnB1c2gocHVia2V5LnRvU3RyaW5nKCkpO1xuICAgICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXMgKz0gMTtcbiAgICAgICAgaWYgKCFpc1dyaXRhYmxlKSB7XG4gICAgICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyArPSAxO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB1bnNpZ25lZEtleXMucHVzaChwdWJrZXkudG9TdHJpbmcoKSk7XG4gICAgICAgIGlmICghaXNXcml0YWJsZSkge1xuICAgICAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50cyArPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgYWNjb3VudEtleXMgPSBzaWduZWRLZXlzLmNvbmNhdCh1bnNpZ25lZEtleXMpO1xuICAgIGNvbnN0IGNvbXBpbGVkSW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zLm1hcChpbnN0cnVjdGlvbiA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRhdGEsXG4gICAgICAgIHByb2dyYW1JZFxuICAgICAgfSA9IGluc3RydWN0aW9uO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcHJvZ3JhbUlkSW5kZXg6IGFjY291bnRLZXlzLmluZGV4T2YocHJvZ3JhbUlkLnRvU3RyaW5nKCkpLFxuICAgICAgICBhY2NvdW50czogaW5zdHJ1Y3Rpb24ua2V5cy5tYXAobWV0YSA9PiBhY2NvdW50S2V5cy5pbmRleE9mKG1ldGEucHVia2V5LnRvU3RyaW5nKCkpKSxcbiAgICAgICAgZGF0YTogYnM1OC5lbmNvZGUoZGF0YSlcbiAgICAgIH07XG4gICAgfSk7XG4gICAgY29tcGlsZWRJbnN0cnVjdGlvbnMuZm9yRWFjaChpbnN0cnVjdGlvbiA9PiB7XG4gICAgICBhc3NlcnQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkSW5kZXggPj0gMCk7XG4gICAgICBpbnN0cnVjdGlvbi5hY2NvdW50cy5mb3JFYWNoKGtleUluZGV4ID0+IGFzc2VydChrZXlJbmRleCA+PSAwKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlKHtcbiAgICAgIGhlYWRlcjoge1xuICAgICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXMsXG4gICAgICAgIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHMsXG4gICAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50c1xuICAgICAgfSxcbiAgICAgIGFjY291bnRLZXlzLFxuICAgICAgcmVjZW50QmxvY2toYXNoLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBjb21waWxlZEluc3RydWN0aW9uc1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2NvbXBpbGUoKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHRoaXMuY29tcGlsZU1lc3NhZ2UoKTtcbiAgICBjb25zdCBzaWduZWRLZXlzID0gbWVzc2FnZS5hY2NvdW50S2V5cy5zbGljZSgwLCBtZXNzYWdlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMpO1xuICAgIGlmICh0aGlzLnNpZ25hdHVyZXMubGVuZ3RoID09PSBzaWduZWRLZXlzLmxlbmd0aCkge1xuICAgICAgY29uc3QgdmFsaWQgPSB0aGlzLnNpZ25hdHVyZXMuZXZlcnkoKHBhaXIsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBzaWduZWRLZXlzW2luZGV4XS5lcXVhbHMocGFpci5wdWJsaWNLZXkpO1xuICAgICAgfSk7XG4gICAgICBpZiAodmFsaWQpIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbiAgICB0aGlzLnNpZ25hdHVyZXMgPSBzaWduZWRLZXlzLm1hcChwdWJsaWNLZXkgPT4gKHtcbiAgICAgIHNpZ25hdHVyZTogbnVsbCxcbiAgICAgIHB1YmxpY0tleVxuICAgIH0pKTtcbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBidWZmZXIgb2YgdGhlIFRyYW5zYWN0aW9uIGRhdGEgdGhhdCBuZWVkIHRvIGJlIGNvdmVyZWQgYnkgc2lnbmF0dXJlc1xuICAgKi9cbiAgc2VyaWFsaXplTWVzc2FnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcGlsZSgpLnNlcmlhbGl6ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgZXN0aW1hdGVkIGZlZSBhc3NvY2lhdGVkIHdpdGggYSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcGFyYW0ge0Nvbm5lY3Rpb259IGNvbm5lY3Rpb24gQ29ubmVjdGlvbiB0byBSUEMgRW5kcG9pbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPG51bWJlciB8IG51bGw+fSBUaGUgZXN0aW1hdGVkIGZlZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBhc3luYyBnZXRFc3RpbWF0ZWRGZWUoY29ubmVjdGlvbikge1xuICAgIHJldHVybiAoYXdhaXQgY29ubmVjdGlvbi5nZXRGZWVGb3JNZXNzYWdlKHRoaXMuY29tcGlsZU1lc3NhZ2UoKSkpLnZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHB1YmxpYyBrZXlzIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzaWduIHRoZSBUcmFuc2FjdGlvbi5cbiAgICogVGhlIGZpcnN0IHNpZ25lciB3aWxsIGJlIHVzZWQgYXMgdGhlIHRyYW5zYWN0aW9uIGZlZSBwYXllciBhY2NvdW50LlxuICAgKlxuICAgKiBTaWduYXR1cmVzIGNhbiBiZSBhZGRlZCB3aXRoIGVpdGhlciBgcGFydGlhbFNpZ25gIG9yIGBhZGRTaWduYXR1cmVgXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgc2luY2UgdjAuODQuMC4gT25seSB0aGUgZmVlIHBheWVyIG5lZWRzIHRvIGJlXG4gICAqIHNwZWNpZmllZCBhbmQgaXQgY2FuIGJlIHNldCBpbiB0aGUgVHJhbnNhY3Rpb24gY29uc3RydWN0b3Igb3Igd2l0aCB0aGVcbiAgICogYGZlZVBheWVyYCBwcm9wZXJ0eS5cbiAgICovXG4gIHNldFNpZ25lcnMoLi4uc2lnbmVycykge1xuICAgIGlmIChzaWduZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaWduZXJzJyk7XG4gICAgfVxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgdGhpcy5zaWduYXR1cmVzID0gc2lnbmVycy5maWx0ZXIocHVibGljS2V5ID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHB1YmxpY0tleS50b1N0cmluZygpO1xuICAgICAgaWYgKHNlZW4uaGFzKGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSkubWFwKHB1YmxpY0tleSA9PiAoe1xuICAgICAgc2lnbmF0dXJlOiBudWxsLFxuICAgICAgcHVibGljS2V5XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpZ24gdGhlIFRyYW5zYWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBzaWduZXJzLiBNdWx0aXBsZSBzaWduYXR1cmVzIG1heVxuICAgKiBiZSBhcHBsaWVkIHRvIGEgVHJhbnNhY3Rpb24uIFRoZSBmaXJzdCBzaWduYXR1cmUgaXMgY29uc2lkZXJlZCBcInByaW1hcnlcIlxuICAgKiBhbmQgaXMgdXNlZCBpZGVudGlmeSBhbmQgY29uZmlybSB0cmFuc2FjdGlvbnMuXG4gICAqXG4gICAqIElmIHRoZSBUcmFuc2FjdGlvbiBgZmVlUGF5ZXJgIGlzIG5vdCBzZXQsIHRoZSBmaXJzdCBzaWduZXIgd2lsbCBiZSB1c2VkXG4gICAqIGFzIHRoZSB0cmFuc2FjdGlvbiBmZWUgcGF5ZXIgYWNjb3VudC5cbiAgICpcbiAgICogVHJhbnNhY3Rpb24gZmllbGRzIHNob3VsZCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgdGhlIGZpcnN0IGNhbGwgdG8gYHNpZ25gLFxuICAgKiBhcyBkb2luZyBzbyBtYXkgaW52YWxpZGF0ZSB0aGUgc2lnbmF0dXJlIGFuZCBjYXVzZSB0aGUgVHJhbnNhY3Rpb24gdG8gYmVcbiAgICogcmVqZWN0ZWQuXG4gICAqXG4gICAqIFRoZSBUcmFuc2FjdGlvbiBtdXN0IGJlIGFzc2lnbmVkIGEgdmFsaWQgYHJlY2VudEJsb2NraGFzaGAgYmVmb3JlIGludm9raW5nIHRoaXMgbWV0aG9kXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8U2lnbmVyPn0gc2lnbmVycyBBcnJheSBvZiBzaWduZXJzIHRoYXQgd2lsbCBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgc2lnbiguLi5zaWduZXJzKSB7XG4gICAgaWYgKHNpZ25lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHNpZ25lcnMnKTtcbiAgICB9XG5cbiAgICAvLyBEZWR1cGUgc2lnbmVyc1xuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG4gICAgY29uc3QgdW5pcXVlU2lnbmVycyA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2lnbmVyIG9mIHNpZ25lcnMpIHtcbiAgICAgIGNvbnN0IGtleSA9IHNpZ25lci5wdWJsaWNLZXkudG9TdHJpbmcoKTtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2Vlbi5hZGQoa2V5KTtcbiAgICAgICAgdW5pcXVlU2lnbmVycy5wdXNoKHNpZ25lcik7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuc2lnbmF0dXJlcyA9IHVuaXF1ZVNpZ25lcnMubWFwKHNpZ25lciA9PiAoe1xuICAgICAgc2lnbmF0dXJlOiBudWxsLFxuICAgICAgcHVibGljS2V5OiBzaWduZXIucHVibGljS2V5XG4gICAgfSkpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl9jb21waWxlKCk7XG4gICAgdGhpcy5fcGFydGlhbFNpZ24obWVzc2FnZSwgLi4udW5pcXVlU2lnbmVycyk7XG4gIH1cblxuICAvKipcbiAgICogUGFydGlhbGx5IHNpZ24gYSB0cmFuc2FjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgYWNjb3VudHMuIEFsbCBhY2NvdW50cyBtdXN0XG4gICAqIGNvcnJlc3BvbmQgdG8gZWl0aGVyIHRoZSBmZWUgcGF5ZXIgb3IgYSBzaWduZXIgYWNjb3VudCBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogaW5zdHJ1Y3Rpb25zLlxuICAgKlxuICAgKiBBbGwgdGhlIGNhdmVhdHMgZnJvbSB0aGUgYHNpZ25gIG1ldGhvZCBhcHBseSB0byBgcGFydGlhbFNpZ25gXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8U2lnbmVyPn0gc2lnbmVycyBBcnJheSBvZiBzaWduZXJzIHRoYXQgd2lsbCBzaWduIHRoZSB0cmFuc2FjdGlvblxuICAgKi9cbiAgcGFydGlhbFNpZ24oLi4uc2lnbmVycykge1xuICAgIGlmIChzaWduZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBzaWduZXJzJyk7XG4gICAgfVxuXG4gICAgLy8gRGVkdXBlIHNpZ25lcnNcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuICAgIGNvbnN0IHVuaXF1ZVNpZ25lcnMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHNpZ25lciBvZiBzaWduZXJzKSB7XG4gICAgICBjb25zdCBrZXkgPSBzaWduZXIucHVibGljS2V5LnRvU3RyaW5nKCk7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICAgIHVuaXF1ZVNpZ25lcnMucHVzaChzaWduZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5fY29tcGlsZSgpO1xuICAgIHRoaXMuX3BhcnRpYWxTaWduKG1lc3NhZ2UsIC4uLnVuaXF1ZVNpZ25lcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3BhcnRpYWxTaWduKG1lc3NhZ2UsIC4uLnNpZ25lcnMpIHtcbiAgICBjb25zdCBzaWduRGF0YSA9IG1lc3NhZ2Uuc2VyaWFsaXplKCk7XG4gICAgc2lnbmVycy5mb3JFYWNoKHNpZ25lciA9PiB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBzaWduKHNpZ25EYXRhLCBzaWduZXIuc2VjcmV0S2V5KTtcbiAgICAgIHRoaXMuX2FkZFNpZ25hdHVyZShzaWduZXIucHVibGljS2V5LCB0b0J1ZmZlcihzaWduYXR1cmUpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXh0ZXJuYWxseSBjcmVhdGVkIHNpZ25hdHVyZSB0byBhIHRyYW5zYWN0aW9uLiBUaGUgcHVibGljIGtleVxuICAgKiBtdXN0IGNvcnJlc3BvbmQgdG8gZWl0aGVyIHRoZSBmZWUgcGF5ZXIgb3IgYSBzaWduZXIgYWNjb3VudCBpbiB0aGUgdHJhbnNhY3Rpb25cbiAgICogaW5zdHJ1Y3Rpb25zLlxuICAgKlxuICAgKiBAcGFyYW0ge1B1YmxpY0tleX0gcHVia2V5IFB1YmxpYyBrZXkgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0cmFuc2FjdGlvbi5cbiAgICogQHBhcmFtIHtCdWZmZXJ9IHNpZ25hdHVyZSBBbiBleHRlcm5hbGx5IGNyZWF0ZWQgc2lnbmF0dXJlIHRvIGFkZCB0byB0aGUgdHJhbnNhY3Rpb24uXG4gICAqL1xuICBhZGRTaWduYXR1cmUocHVia2V5LCBzaWduYXR1cmUpIHtcbiAgICB0aGlzLl9jb21waWxlKCk7IC8vIEVuc3VyZSBzaWduYXR1cmVzIGFycmF5IGlzIHBvcHVsYXRlZFxuICAgIHRoaXMuX2FkZFNpZ25hdHVyZShwdWJrZXksIHNpZ25hdHVyZSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfYWRkU2lnbmF0dXJlKHB1YmtleSwgc2lnbmF0dXJlKSB7XG4gICAgYXNzZXJ0KHNpZ25hdHVyZS5sZW5ndGggPT09IDY0KTtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuc2lnbmF0dXJlcy5maW5kSW5kZXgoc2lncGFpciA9PiBwdWJrZXkuZXF1YWxzKHNpZ3BhaXIucHVibGljS2V5KSk7XG4gICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGB1bmtub3duIHNpZ25lcjogJHtwdWJrZXkudG9TdHJpbmcoKX1gKTtcbiAgICB9XG4gICAgdGhpcy5zaWduYXR1cmVzW2luZGV4XS5zaWduYXR1cmUgPSBCdWZmZXIuZnJvbShzaWduYXR1cmUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmeSBzaWduYXR1cmVzIG9mIGEgVHJhbnNhY3Rpb25cbiAgICogT3B0aW9uYWwgcGFyYW1ldGVyIHNwZWNpZmllcyBpZiB3ZSdyZSBleHBlY3RpbmcgYSBmdWxseSBzaWduZWQgVHJhbnNhY3Rpb24gb3IgYSBwYXJ0aWFsbHkgc2lnbmVkIG9uZS5cbiAgICogSWYgbm8gYm9vbGVhbiBpcyBwcm92aWRlZCwgd2UgZXhwZWN0IGEgZnVsbHkgc2lnbmVkIFRyYW5zYWN0aW9uIGJ5IGRlZmF1bHQuXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JlcXVpcmVBbGxTaWduYXR1cmVzPXRydWVdIFJlcXVpcmUgYSBmdWxseSBzaWduZWQgVHJhbnNhY3Rpb25cbiAgICovXG4gIHZlcmlmeVNpZ25hdHVyZXMocmVxdWlyZUFsbFNpZ25hdHVyZXMgPSB0cnVlKSB7XG4gICAgY29uc3Qgc2lnbmF0dXJlRXJyb3JzID0gdGhpcy5fZ2V0TWVzc2FnZVNpZ25lZG5lc3NFcnJvcnModGhpcy5zZXJpYWxpemVNZXNzYWdlKCksIHJlcXVpcmVBbGxTaWduYXR1cmVzKTtcbiAgICByZXR1cm4gIXNpZ25hdHVyZUVycm9ycztcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9nZXRNZXNzYWdlU2lnbmVkbmVzc0Vycm9ycyhtZXNzYWdlLCByZXF1aXJlQWxsU2lnbmF0dXJlcykge1xuICAgIGNvbnN0IGVycm9ycyA9IHt9O1xuICAgIGZvciAoY29uc3Qge1xuICAgICAgc2lnbmF0dXJlLFxuICAgICAgcHVibGljS2V5XG4gICAgfSBvZiB0aGlzLnNpZ25hdHVyZXMpIHtcbiAgICAgIGlmIChzaWduYXR1cmUgPT09IG51bGwpIHtcbiAgICAgICAgaWYgKHJlcXVpcmVBbGxTaWduYXR1cmVzKSB7XG4gICAgICAgICAgKGVycm9ycy5taXNzaW5nIHx8PSBbXSkucHVzaChwdWJsaWNLZXkpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIXZlcmlmeShzaWduYXR1cmUsIG1lc3NhZ2UsIHB1YmxpY0tleS50b0J5dGVzKCkpKSB7XG4gICAgICAgICAgKGVycm9ycy5pbnZhbGlkIHx8PSBbXSkucHVzaChwdWJsaWNLZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBlcnJvcnMuaW52YWxpZCB8fCBlcnJvcnMubWlzc2luZyA/IGVycm9ycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdGhlIFRyYW5zYWN0aW9uIGluIHRoZSB3aXJlIGZvcm1hdC5cbiAgICpcbiAgICogQHBhcmFtIHtCdWZmZXJ9IFtjb25maWddIENvbmZpZyBvZiB0cmFuc2FjdGlvbi5cbiAgICpcbiAgICogQHJldHVybnMge0J1ZmZlcn0gU2lnbmF0dXJlIG9mIHRyYW5zYWN0aW9uIGluIHdpcmUgZm9ybWF0LlxuICAgKi9cbiAgc2VyaWFsaXplKGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzLFxuICAgICAgdmVyaWZ5U2lnbmF0dXJlc1xuICAgIH0gPSBPYmplY3QuYXNzaWduKHtcbiAgICAgIHJlcXVpcmVBbGxTaWduYXR1cmVzOiB0cnVlLFxuICAgICAgdmVyaWZ5U2lnbmF0dXJlczogdHJ1ZVxuICAgIH0sIGNvbmZpZyk7XG4gICAgY29uc3Qgc2lnbkRhdGEgPSB0aGlzLnNlcmlhbGl6ZU1lc3NhZ2UoKTtcbiAgICBpZiAodmVyaWZ5U2lnbmF0dXJlcykge1xuICAgICAgY29uc3Qgc2lnRXJyb3JzID0gdGhpcy5fZ2V0TWVzc2FnZVNpZ25lZG5lc3NFcnJvcnMoc2lnbkRhdGEsIHJlcXVpcmVBbGxTaWduYXR1cmVzKTtcbiAgICAgIGlmIChzaWdFcnJvcnMpIHtcbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9ICdTaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZhaWxlZC4nO1xuICAgICAgICBpZiAoc2lnRXJyb3JzLmludmFsaWQpIHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFxcbkludmFsaWQgc2lnbmF0dXJlIGZvciBwdWJsaWMga2V5JHtzaWdFcnJvcnMuaW52YWxpZC5sZW5ndGggPT09IDEgPyAnJyA6ICcocyknfSBbXFxgJHtzaWdFcnJvcnMuaW52YWxpZC5tYXAocCA9PiBwLnRvQmFzZTU4KCkpLmpvaW4oJ2AsIGAnKX1cXGBdLmA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZ0Vycm9ycy5taXNzaW5nKSB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlICs9IGBcXG5NaXNzaW5nIHNpZ25hdHVyZSBmb3IgcHVibGljIGtleSR7c2lnRXJyb3JzLm1pc3NpbmcubGVuZ3RoID09PSAxID8gJycgOiAnKHMpJ30gW1xcYCR7c2lnRXJyb3JzLm1pc3NpbmcubWFwKHAgPT4gcC50b0Jhc2U1OCgpKS5qb2luKCdgLCBgJyl9XFxgXS5gO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplKHNpZ25EYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9zZXJpYWxpemUoc2lnbkRhdGEpIHtcbiAgICBjb25zdCB7XG4gICAgICBzaWduYXR1cmVzXG4gICAgfSA9IHRoaXM7XG4gICAgY29uc3Qgc2lnbmF0dXJlQ291bnQgPSBbXTtcbiAgICBlbmNvZGVMZW5ndGgoc2lnbmF0dXJlQ291bnQsIHNpZ25hdHVyZXMubGVuZ3RoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkxlbmd0aCA9IHNpZ25hdHVyZUNvdW50Lmxlbmd0aCArIHNpZ25hdHVyZXMubGVuZ3RoICogNjQgKyBzaWduRGF0YS5sZW5ndGg7XG4gICAgY29uc3Qgd2lyZVRyYW5zYWN0aW9uID0gQnVmZmVyLmFsbG9jKHRyYW5zYWN0aW9uTGVuZ3RoKTtcbiAgICBhc3NlcnQoc2lnbmF0dXJlcy5sZW5ndGggPCAyNTYpO1xuICAgIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZUNvdW50KS5jb3B5KHdpcmVUcmFuc2FjdGlvbiwgMCk7XG4gICAgc2lnbmF0dXJlcy5mb3JFYWNoKCh7XG4gICAgICBzaWduYXR1cmVcbiAgICB9LCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHNpZ25hdHVyZSAhPT0gbnVsbCkge1xuICAgICAgICBhc3NlcnQoc2lnbmF0dXJlLmxlbmd0aCA9PT0gNjQsIGBzaWduYXR1cmUgaGFzIGludmFsaWQgbGVuZ3RoYCk7XG4gICAgICAgIEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSkuY29weSh3aXJlVHJhbnNhY3Rpb24sIHNpZ25hdHVyZUNvdW50Lmxlbmd0aCArIGluZGV4ICogNjQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHNpZ25EYXRhLmNvcHkod2lyZVRyYW5zYWN0aW9uLCBzaWduYXR1cmVDb3VudC5sZW5ndGggKyBzaWduYXR1cmVzLmxlbmd0aCAqIDY0KTtcbiAgICBhc3NlcnQod2lyZVRyYW5zYWN0aW9uLmxlbmd0aCA8PSBQQUNLRVRfREFUQV9TSVpFLCBgVHJhbnNhY3Rpb24gdG9vIGxhcmdlOiAke3dpcmVUcmFuc2FjdGlvbi5sZW5ndGh9ID4gJHtQQUNLRVRfREFUQV9TSVpFfWApO1xuICAgIHJldHVybiB3aXJlVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogRGVwcmVjYXRlZCBtZXRob2RcbiAgICogQGludGVybmFsXG4gICAqL1xuICBnZXQga2V5cygpIHtcbiAgICBhc3NlcnQodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoID09PSAxKTtcbiAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbnNbMF0ua2V5cy5tYXAoa2V5T2JqID0+IGtleU9iai5wdWJrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgbWV0aG9kXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IHByb2dyYW1JZCgpIHtcbiAgICBhc3NlcnQodGhpcy5pbnN0cnVjdGlvbnMubGVuZ3RoID09PSAxKTtcbiAgICByZXR1cm4gdGhpcy5pbnN0cnVjdGlvbnNbMF0ucHJvZ3JhbUlkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcHJlY2F0ZWQgbWV0aG9kXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0IGRhdGEoKSB7XG4gICAgYXNzZXJ0KHRoaXMuaW5zdHJ1Y3Rpb25zLmxlbmd0aCA9PT0gMSk7XG4gICAgcmV0dXJuIHRoaXMuaW5zdHJ1Y3Rpb25zWzBdLmRhdGE7XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgYSB3aXJlIHRyYW5zYWN0aW9uIGludG8gYSBUcmFuc2FjdGlvbiBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7QnVmZmVyIHwgVWludDhBcnJheSB8IEFycmF5PG51bWJlcj59IGJ1ZmZlciBTaWduYXR1cmUgb2Ygd2lyZSBUcmFuc2FjdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb259IFRyYW5zYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2lnbmF0dXJlXG4gICAqL1xuICBzdGF0aWMgZnJvbShidWZmZXIpIHtcbiAgICAvLyBTbGljZSB1cCB3aXJlIGRhdGFcbiAgICBsZXQgYnl0ZUFycmF5ID0gWy4uLmJ1ZmZlcl07XG4gICAgY29uc3Qgc2lnbmF0dXJlQ291bnQgPSBkZWNvZGVMZW5ndGgoYnl0ZUFycmF5KTtcbiAgICBsZXQgc2lnbmF0dXJlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2lnbmF0dXJlQ291bnQ7IGkrKykge1xuICAgICAgY29uc3Qgc2lnbmF0dXJlID0gZ3VhcmRlZFNwbGljZShieXRlQXJyYXksIDAsIFNJR05BVFVSRV9MRU5HVEhfSU5fQllURVMpO1xuICAgICAgc2lnbmF0dXJlcy5wdXNoKGJzNTguZW5jb2RlKEJ1ZmZlci5mcm9tKHNpZ25hdHVyZSkpKTtcbiAgICB9XG4gICAgcmV0dXJuIFRyYW5zYWN0aW9uLnBvcHVsYXRlKE1lc3NhZ2UuZnJvbShieXRlQXJyYXkpLCBzaWduYXR1cmVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZSBUcmFuc2FjdGlvbiBvYmplY3QgZnJvbSBtZXNzYWdlIGFuZCBzaWduYXR1cmVzXG4gICAqXG4gICAqIEBwYXJhbSB7TWVzc2FnZX0gbWVzc2FnZSBNZXNzYWdlIG9mIHRyYW5zYWN0aW9uXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gc2lnbmF0dXJlcyBMaXN0IG9mIHNpZ25hdHVyZXMgdG8gYXNzaWduIHRvIHRoZSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAcmV0dXJucyB7VHJhbnNhY3Rpb259IFRoZSBwb3B1bGF0ZWQgVHJhbnNhY3Rpb25cbiAgICovXG4gIHN0YXRpYyBwb3B1bGF0ZShtZXNzYWdlLCBzaWduYXR1cmVzID0gW10pIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIHRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCA9IG1lc3NhZ2UucmVjZW50QmxvY2toYXNoO1xuICAgIGlmIChtZXNzYWdlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXMgPiAwKSB7XG4gICAgICB0cmFuc2FjdGlvbi5mZWVQYXllciA9IG1lc3NhZ2UuYWNjb3VudEtleXNbMF07XG4gICAgfVxuICAgIHNpZ25hdHVyZXMuZm9yRWFjaCgoc2lnbmF0dXJlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgc2lnUHVia2V5UGFpciA9IHtcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmUgPT0gYnM1OC5lbmNvZGUoREVGQVVMVF9TSUdOQVRVUkUpID8gbnVsbCA6IGJzNTguZGVjb2RlKHNpZ25hdHVyZSksXG4gICAgICAgIHB1YmxpY0tleTogbWVzc2FnZS5hY2NvdW50S2V5c1tpbmRleF1cbiAgICAgIH07XG4gICAgICB0cmFuc2FjdGlvbi5zaWduYXR1cmVzLnB1c2goc2lnUHVia2V5UGFpcik7XG4gICAgfSk7XG4gICAgbWVzc2FnZS5pbnN0cnVjdGlvbnMuZm9yRWFjaChpbnN0cnVjdGlvbiA9PiB7XG4gICAgICBjb25zdCBrZXlzID0gaW5zdHJ1Y3Rpb24uYWNjb3VudHMubWFwKGFjY291bnQgPT4ge1xuICAgICAgICBjb25zdCBwdWJrZXkgPSBtZXNzYWdlLmFjY291bnRLZXlzW2FjY291bnRdO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHB1YmtleSxcbiAgICAgICAgICBpc1NpZ25lcjogdHJhbnNhY3Rpb24uc2lnbmF0dXJlcy5zb21lKGtleU9iaiA9PiBrZXlPYmoucHVibGljS2V5LnRvU3RyaW5nKCkgPT09IHB1YmtleS50b1N0cmluZygpKSB8fCBtZXNzYWdlLmlzQWNjb3VudFNpZ25lcihhY2NvdW50KSxcbiAgICAgICAgICBpc1dyaXRhYmxlOiBtZXNzYWdlLmlzQWNjb3VudFdyaXRhYmxlKGFjY291bnQpXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRyYW5zYWN0aW9uLmluc3RydWN0aW9ucy5wdXNoKG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgICAga2V5cyxcbiAgICAgICAgcHJvZ3JhbUlkOiBtZXNzYWdlLmFjY291bnRLZXlzW2luc3RydWN0aW9uLnByb2dyYW1JZEluZGV4XSxcbiAgICAgICAgZGF0YTogYnM1OC5kZWNvZGUoaW5zdHJ1Y3Rpb24uZGF0YSlcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgICB0cmFuc2FjdGlvbi5fbWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdHJhbnNhY3Rpb24uX2pzb24gPSB0cmFuc2FjdGlvbi50b0pTT04oKTtcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XG4gIH1cbn1cblxuY2xhc3MgVHJhbnNhY3Rpb25NZXNzYWdlIHtcbiAgY29uc3RydWN0b3IoYXJncykge1xuICAgIHRoaXMucGF5ZXJLZXkgPSB2b2lkIDA7XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMgPSB2b2lkIDA7XG4gICAgdGhpcy5yZWNlbnRCbG9ja2hhc2ggPSB2b2lkIDA7XG4gICAgdGhpcy5wYXllcktleSA9IGFyZ3MucGF5ZXJLZXk7XG4gICAgdGhpcy5pbnN0cnVjdGlvbnMgPSBhcmdzLmluc3RydWN0aW9ucztcbiAgICB0aGlzLnJlY2VudEJsb2NraGFzaCA9IGFyZ3MucmVjZW50QmxvY2toYXNoO1xuICB9XG4gIHN0YXRpYyBkZWNvbXBpbGUobWVzc2FnZSwgYXJncykge1xuICAgIGNvbnN0IHtcbiAgICAgIGhlYWRlcixcbiAgICAgIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zLFxuICAgICAgcmVjZW50QmxvY2toYXNoXG4gICAgfSA9IG1lc3NhZ2U7XG4gICAgY29uc3Qge1xuICAgICAgbnVtUmVxdWlyZWRTaWduYXR1cmVzLFxuICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50cyxcbiAgICAgIG51bVJlYWRvbmx5VW5zaWduZWRBY2NvdW50c1xuICAgIH0gPSBoZWFkZXI7XG4gICAgY29uc3QgbnVtV3JpdGFibGVTaWduZWRBY2NvdW50cyA9IG51bVJlcXVpcmVkU2lnbmF0dXJlcyAtIG51bVJlYWRvbmx5U2lnbmVkQWNjb3VudHM7XG4gICAgYXNzZXJ0KG51bVdyaXRhYmxlU2lnbmVkQWNjb3VudHMgPiAwLCAnTWVzc2FnZSBoZWFkZXIgaXMgaW52YWxpZCcpO1xuICAgIGNvbnN0IG51bVdyaXRhYmxlVW5zaWduZWRBY2NvdW50cyA9IG1lc3NhZ2Uuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoIC0gbnVtUmVxdWlyZWRTaWduYXR1cmVzIC0gbnVtUmVhZG9ubHlVbnNpZ25lZEFjY291bnRzO1xuICAgIGFzc2VydChudW1Xcml0YWJsZVVuc2lnbmVkQWNjb3VudHMgPj0gMCwgJ01lc3NhZ2UgaGVhZGVyIGlzIGludmFsaWQnKTtcbiAgICBjb25zdCBhY2NvdW50S2V5cyA9IG1lc3NhZ2UuZ2V0QWNjb3VudEtleXMoYXJncyk7XG4gICAgY29uc3QgcGF5ZXJLZXkgPSBhY2NvdW50S2V5cy5nZXQoMCk7XG4gICAgaWYgKHBheWVyS2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGRlY29tcGlsZSBtZXNzYWdlIGJlY2F1c2Ugbm8gYWNjb3VudCBrZXlzIHdlcmUgZm91bmQnKTtcbiAgICB9XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gW107XG4gICAgZm9yIChjb25zdCBjb21waWxlZEl4IG9mIGNvbXBpbGVkSW5zdHJ1Y3Rpb25zKSB7XG4gICAgICBjb25zdCBrZXlzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGtleUluZGV4IG9mIGNvbXBpbGVkSXguYWNjb3VudEtleUluZGV4ZXMpIHtcbiAgICAgICAgY29uc3QgcHVia2V5ID0gYWNjb3VudEtleXMuZ2V0KGtleUluZGV4KTtcbiAgICAgICAgaWYgKHB1YmtleSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmluZCBrZXkgZm9yIGFjY291bnQga2V5IGluZGV4ICR7a2V5SW5kZXh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXNTaWduZXIgPSBrZXlJbmRleCA8IG51bVJlcXVpcmVkU2lnbmF0dXJlcztcbiAgICAgICAgbGV0IGlzV3JpdGFibGU7XG4gICAgICAgIGlmIChpc1NpZ25lcikge1xuICAgICAgICAgIGlzV3JpdGFibGUgPSBrZXlJbmRleCA8IG51bVdyaXRhYmxlU2lnbmVkQWNjb3VudHM7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5SW5kZXggPCBhY2NvdW50S2V5cy5zdGF0aWNBY2NvdW50S2V5cy5sZW5ndGgpIHtcbiAgICAgICAgICBpc1dyaXRhYmxlID0ga2V5SW5kZXggLSBudW1SZXF1aXJlZFNpZ25hdHVyZXMgPCBudW1Xcml0YWJsZVVuc2lnbmVkQWNjb3VudHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXNXcml0YWJsZSA9IGtleUluZGV4IC0gYWNjb3VudEtleXMuc3RhdGljQWNjb3VudEtleXMubGVuZ3RoIDxcbiAgICAgICAgICAvLyBhY2NvdW50S2V5c0Zyb21Mb29rdXBzIGNhbm5vdCBiZSB1bmRlZmluZWQgYmVjYXVzZSB3ZSBhbHJlYWR5IGZvdW5kIGEgcHVia2V5IGZvciB0aGlzIGluZGV4IGFib3ZlXG4gICAgICAgICAgYWNjb3VudEtleXMuYWNjb3VudEtleXNGcm9tTG9va3Vwcy53cml0YWJsZS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgICBwdWJrZXksXG4gICAgICAgICAgaXNTaWduZXI6IGtleUluZGV4IDwgaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyxcbiAgICAgICAgICBpc1dyaXRhYmxlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcHJvZ3JhbUlkID0gYWNjb3VudEtleXMuZ2V0KGNvbXBpbGVkSXgucHJvZ3JhbUlkSW5kZXgpO1xuICAgICAgaWYgKHByb2dyYW1JZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZpbmQgcHJvZ3JhbSBpZCBmb3IgcHJvZ3JhbSBpZCBpbmRleCAke2NvbXBpbGVkSXgucHJvZ3JhbUlkSW5kZXh9YCk7XG4gICAgICB9XG4gICAgICBpbnN0cnVjdGlvbnMucHVzaChuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICAgIHByb2dyYW1JZCxcbiAgICAgICAgZGF0YTogdG9CdWZmZXIoY29tcGlsZWRJeC5kYXRhKSxcbiAgICAgICAga2V5c1xuICAgICAgfSkpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uTWVzc2FnZSh7XG4gICAgICBwYXllcktleSxcbiAgICAgIGluc3RydWN0aW9ucyxcbiAgICAgIHJlY2VudEJsb2NraGFzaFxuICAgIH0pO1xuICB9XG4gIGNvbXBpbGVUb0xlZ2FjeU1lc3NhZ2UoKSB7XG4gICAgcmV0dXJuIE1lc3NhZ2UuY29tcGlsZSh7XG4gICAgICBwYXllcktleTogdGhpcy5wYXllcktleSxcbiAgICAgIHJlY2VudEJsb2NraGFzaDogdGhpcy5yZWNlbnRCbG9ja2hhc2gsXG4gICAgICBpbnN0cnVjdGlvbnM6IHRoaXMuaW5zdHJ1Y3Rpb25zXG4gICAgfSk7XG4gIH1cbiAgY29tcGlsZVRvVjBNZXNzYWdlKGFkZHJlc3NMb29rdXBUYWJsZUFjY291bnRzKSB7XG4gICAgcmV0dXJuIE1lc3NhZ2VWMC5jb21waWxlKHtcbiAgICAgIHBheWVyS2V5OiB0aGlzLnBheWVyS2V5LFxuICAgICAgcmVjZW50QmxvY2toYXNoOiB0aGlzLnJlY2VudEJsb2NraGFzaCxcbiAgICAgIGluc3RydWN0aW9uczogdGhpcy5pbnN0cnVjdGlvbnMsXG4gICAgICBhZGRyZXNzTG9va3VwVGFibGVBY2NvdW50c1xuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogVmVyc2lvbmVkIHRyYW5zYWN0aW9uIGNsYXNzXG4gKi9cbmNsYXNzIFZlcnNpb25lZFRyYW5zYWN0aW9uIHtcbiAgZ2V0IHZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMubWVzc2FnZS52ZXJzaW9uO1xuICB9XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHNpZ25hdHVyZXMpIHtcbiAgICB0aGlzLnNpZ25hdHVyZXMgPSB2b2lkIDA7XG4gICAgdGhpcy5tZXNzYWdlID0gdm9pZCAwO1xuICAgIGlmIChzaWduYXR1cmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc2VydChzaWduYXR1cmVzLmxlbmd0aCA9PT0gbWVzc2FnZS5oZWFkZXIubnVtUmVxdWlyZWRTaWduYXR1cmVzLCAnRXhwZWN0ZWQgc2lnbmF0dXJlcyBsZW5ndGggdG8gYmUgZXF1YWwgdG8gdGhlIG51bWJlciBvZiByZXF1aXJlZCBzaWduYXR1cmVzJyk7XG4gICAgICB0aGlzLnNpZ25hdHVyZXMgPSBzaWduYXR1cmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkZWZhdWx0U2lnbmF0dXJlcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtZXNzYWdlLmhlYWRlci5udW1SZXF1aXJlZFNpZ25hdHVyZXM7IGkrKykge1xuICAgICAgICBkZWZhdWx0U2lnbmF0dXJlcy5wdXNoKG5ldyBVaW50OEFycmF5KFNJR05BVFVSRV9MRU5HVEhfSU5fQllURVMpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2lnbmF0dXJlcyA9IGRlZmF1bHRTaWduYXR1cmVzO1xuICAgIH1cbiAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlO1xuICB9XG4gIHNlcmlhbGl6ZSgpIHtcbiAgICBjb25zdCBzZXJpYWxpemVkTWVzc2FnZSA9IHRoaXMubWVzc2FnZS5zZXJpYWxpemUoKTtcbiAgICBjb25zdCBlbmNvZGVkU2lnbmF0dXJlc0xlbmd0aCA9IEFycmF5KCk7XG4gICAgZW5jb2RlTGVuZ3RoKGVuY29kZWRTaWduYXR1cmVzTGVuZ3RoLCB0aGlzLnNpZ25hdHVyZXMubGVuZ3RoKTtcbiAgICBjb25zdCB0cmFuc2FjdGlvbkxheW91dCA9IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC5ibG9iKGVuY29kZWRTaWduYXR1cmVzTGVuZ3RoLmxlbmd0aCwgJ2VuY29kZWRTaWduYXR1cmVzTGVuZ3RoJyksIEJ1ZmZlckxheW91dC5zZXEoc2lnbmF0dXJlKCksIHRoaXMuc2lnbmF0dXJlcy5sZW5ndGgsICdzaWduYXR1cmVzJyksIEJ1ZmZlckxheW91dC5ibG9iKHNlcmlhbGl6ZWRNZXNzYWdlLmxlbmd0aCwgJ3NlcmlhbGl6ZWRNZXNzYWdlJyldKTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHJhbnNhY3Rpb24gPSBuZXcgVWludDhBcnJheSgyMDQ4KTtcbiAgICBjb25zdCBzZXJpYWxpemVkVHJhbnNhY3Rpb25MZW5ndGggPSB0cmFuc2FjdGlvbkxheW91dC5lbmNvZGUoe1xuICAgICAgZW5jb2RlZFNpZ25hdHVyZXNMZW5ndGg6IG5ldyBVaW50OEFycmF5KGVuY29kZWRTaWduYXR1cmVzTGVuZ3RoKSxcbiAgICAgIHNpZ25hdHVyZXM6IHRoaXMuc2lnbmF0dXJlcyxcbiAgICAgIHNlcmlhbGl6ZWRNZXNzYWdlXG4gICAgfSwgc2VyaWFsaXplZFRyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gc2VyaWFsaXplZFRyYW5zYWN0aW9uLnNsaWNlKDAsIHNlcmlhbGl6ZWRUcmFuc2FjdGlvbkxlbmd0aCk7XG4gIH1cbiAgc3RhdGljIGRlc2VyaWFsaXplKHNlcmlhbGl6ZWRUcmFuc2FjdGlvbikge1xuICAgIGxldCBieXRlQXJyYXkgPSBbLi4uc2VyaWFsaXplZFRyYW5zYWN0aW9uXTtcbiAgICBjb25zdCBzaWduYXR1cmVzID0gW107XG4gICAgY29uc3Qgc2lnbmF0dXJlc0xlbmd0aCA9IGRlY29kZUxlbmd0aChieXRlQXJyYXkpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2lnbmF0dXJlc0xlbmd0aDsgaSsrKSB7XG4gICAgICBzaWduYXR1cmVzLnB1c2gobmV3IFVpbnQ4QXJyYXkoZ3VhcmRlZFNwbGljZShieXRlQXJyYXksIDAsIFNJR05BVFVSRV9MRU5HVEhfSU5fQllURVMpKSk7XG4gICAgfVxuICAgIGNvbnN0IG1lc3NhZ2UgPSBWZXJzaW9uZWRNZXNzYWdlLmRlc2VyaWFsaXplKG5ldyBVaW50OEFycmF5KGJ5dGVBcnJheSkpO1xuICAgIHJldHVybiBuZXcgVmVyc2lvbmVkVHJhbnNhY3Rpb24obWVzc2FnZSwgc2lnbmF0dXJlcyk7XG4gIH1cbiAgc2lnbihzaWduZXJzKSB7XG4gICAgY29uc3QgbWVzc2FnZURhdGEgPSB0aGlzLm1lc3NhZ2Uuc2VyaWFsaXplKCk7XG4gICAgY29uc3Qgc2lnbmVyUHVia2V5cyA9IHRoaXMubWVzc2FnZS5zdGF0aWNBY2NvdW50S2V5cy5zbGljZSgwLCB0aGlzLm1lc3NhZ2UuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyk7XG4gICAgZm9yIChjb25zdCBzaWduZXIgb2Ygc2lnbmVycykge1xuICAgICAgY29uc3Qgc2lnbmVySW5kZXggPSBzaWduZXJQdWJrZXlzLmZpbmRJbmRleChwdWJrZXkgPT4gcHVia2V5LmVxdWFscyhzaWduZXIucHVibGljS2V5KSk7XG4gICAgICBhc3NlcnQoc2lnbmVySW5kZXggPj0gMCwgYENhbm5vdCBzaWduIHdpdGggbm9uIHNpZ25lciBrZXkgJHtzaWduZXIucHVibGljS2V5LnRvQmFzZTU4KCl9YCk7XG4gICAgICB0aGlzLnNpZ25hdHVyZXNbc2lnbmVySW5kZXhdID0gc2lnbihtZXNzYWdlRGF0YSwgc2lnbmVyLnNlY3JldEtleSk7XG4gICAgfVxuICB9XG4gIGFkZFNpZ25hdHVyZShwdWJsaWNLZXksIHNpZ25hdHVyZSkge1xuICAgIGFzc2VydChzaWduYXR1cmUuYnl0ZUxlbmd0aCA9PT0gNjQsICdTaWduYXR1cmUgbXVzdCBiZSA2NCBieXRlcyBsb25nJyk7XG4gICAgY29uc3Qgc2lnbmVyUHVia2V5cyA9IHRoaXMubWVzc2FnZS5zdGF0aWNBY2NvdW50S2V5cy5zbGljZSgwLCB0aGlzLm1lc3NhZ2UuaGVhZGVyLm51bVJlcXVpcmVkU2lnbmF0dXJlcyk7XG4gICAgY29uc3Qgc2lnbmVySW5kZXggPSBzaWduZXJQdWJrZXlzLmZpbmRJbmRleChwdWJrZXkgPT4gcHVia2V5LmVxdWFscyhwdWJsaWNLZXkpKTtcbiAgICBhc3NlcnQoc2lnbmVySW5kZXggPj0gMCwgYENhbiBub3QgYWRkIHNpZ25hdHVyZTsgXFxgJHtwdWJsaWNLZXkudG9CYXNlNTgoKX1cXGAgaXMgbm90IHJlcXVpcmVkIHRvIHNpZ24gdGhpcyB0cmFuc2FjdGlvbmApO1xuICAgIHRoaXMuc2lnbmF0dXJlc1tzaWduZXJJbmRleF0gPSBzaWduYXR1cmU7XG4gIH1cbn1cblxuLy8gVE9ETzogVGhlc2UgY29uc3RhbnRzIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIHJlYWRpbmcgdGhlbSBvdXQgb2YgYVxuLy8gU3lzY2FsbCBhY2NvdW50XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IE5VTV9USUNLU19QRVJfU0VDT05EID0gMTYwO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBERUZBVUxUX1RJQ0tTX1BFUl9TTE9UID0gNjQ7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IE5VTV9TTE9UU19QRVJfU0VDT05EID0gTlVNX1RJQ0tTX1BFUl9TRUNPTkQgLyBERUZBVUxUX1RJQ0tTX1BFUl9TTE9UO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBNU19QRVJfU0xPVCA9IDEwMDAgLyBOVU1fU0xPVFNfUEVSX1NFQ09ORDtcblxuY29uc3QgU1lTVkFSX0NMT0NLX1BVQktFWSA9IG5ldyBQdWJsaWNLZXkoJ1N5c3ZhckMxb2NrMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcbmNvbnN0IFNZU1ZBUl9FUE9DSF9TQ0hFRFVMRV9QVUJLRVkgPSBuZXcgUHVibGljS2V5KCdTeXN2YXJFcG9jaFNjaGVkdTFlMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG5jb25zdCBTWVNWQVJfSU5TVFJVQ1RJT05TX1BVQktFWSA9IG5ldyBQdWJsaWNLZXkoJ1N5c3ZhcjFuc3RydWN0aW9uczExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcbmNvbnN0IFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVNfUFVCS0VZID0gbmV3IFB1YmxpY0tleSgnU3lzdmFyUmVjZW50QjFvY2tIYXNoZXMxMTExMTExMTExMTExMTExMTExMScpO1xuY29uc3QgU1lTVkFSX1JFTlRfUFVCS0VZID0gbmV3IFB1YmxpY0tleSgnU3lzdmFyUmVudDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMScpO1xuY29uc3QgU1lTVkFSX1JFV0FSRFNfUFVCS0VZID0gbmV3IFB1YmxpY0tleSgnU3lzdmFyUmV3YXJkczExMTExMTExMTExMTExMTExMTExMTExMTExMTExMScpO1xuY29uc3QgU1lTVkFSX1NMT1RfSEFTSEVTX1BVQktFWSA9IG5ldyBQdWJsaWNLZXkoJ1N5c3ZhclMxb3RIYXNoZXMxMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcbmNvbnN0IFNZU1ZBUl9TTE9UX0hJU1RPUllfUFVCS0VZID0gbmV3IFB1YmxpY0tleSgnU3lzdmFyUzFvdEhpc3RvcnkxMTExMTExMTExMTExMTExMTExMTExMTExMScpO1xuY29uc3QgU1lTVkFSX1NUQUtFX0hJU1RPUllfUFVCS0VZID0gbmV3IFB1YmxpY0tleSgnU3lzdmFyU3Rha2VIaXN0b3J5MTExMTExMTExMTExMTExMTExMTExMTExMScpO1xuXG5jbGFzcyBTZW5kVHJhbnNhY3Rpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIGFjdGlvbixcbiAgICBzaWduYXR1cmUsXG4gICAgdHJhbnNhY3Rpb25NZXNzYWdlLFxuICAgIGxvZ3NcbiAgfSkge1xuICAgIGNvbnN0IG1heWJlTG9nc091dHB1dCA9IGxvZ3MgPyBgTG9nczogXFxuJHtKU09OLnN0cmluZ2lmeShsb2dzLnNsaWNlKC0xMCksIG51bGwsIDIpfS4gYCA6ICcnO1xuICAgIGNvbnN0IGd1aWRlVGV4dCA9ICdcXG5DYXRjaCB0aGUgYFNlbmRUcmFuc2FjdGlvbkVycm9yYCBhbmQgY2FsbCBgZ2V0TG9ncygpYCBvbiBpdCBmb3IgZnVsbCBkZXRhaWxzLic7XG4gICAgbGV0IG1lc3NhZ2U7XG4gICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgIGNhc2UgJ3NlbmQnOlxuICAgICAgICBtZXNzYWdlID0gYFRyYW5zYWN0aW9uICR7c2lnbmF0dXJlfSByZXN1bHRlZCBpbiBhbiBlcnJvci4gXFxuYCArIGAke3RyYW5zYWN0aW9uTWVzc2FnZX0uIGAgKyBtYXliZUxvZ3NPdXRwdXQgKyBndWlkZVRleHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2ltdWxhdGUnOlxuICAgICAgICBtZXNzYWdlID0gYFNpbXVsYXRpb24gZmFpbGVkLiBcXG5NZXNzYWdlOiAke3RyYW5zYWN0aW9uTWVzc2FnZX0uIFxcbmAgKyBtYXliZUxvZ3NPdXRwdXQgKyBndWlkZVRleHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2UgPSBgVW5rbm93biBhY3Rpb24gJyR7KGEgPT4gYSkoYWN0aW9uKX0nYDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLnNpZ25hdHVyZSA9IHZvaWQgMDtcbiAgICB0aGlzLnRyYW5zYWN0aW9uTWVzc2FnZSA9IHZvaWQgMDtcbiAgICB0aGlzLnRyYW5zYWN0aW9uTG9ncyA9IHZvaWQgMDtcbiAgICB0aGlzLnNpZ25hdHVyZSA9IHNpZ25hdHVyZTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uTWVzc2FnZSA9IHRyYW5zYWN0aW9uTWVzc2FnZTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uTG9ncyA9IGxvZ3MgPyBsb2dzIDogdW5kZWZpbmVkO1xuICB9XG4gIGdldCB0cmFuc2FjdGlvbkVycm9yKCkge1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zYWN0aW9uTWVzc2FnZSxcbiAgICAgIGxvZ3M6IEFycmF5LmlzQXJyYXkodGhpcy50cmFuc2FjdGlvbkxvZ3MpID8gdGhpcy50cmFuc2FjdGlvbkxvZ3MgOiB1bmRlZmluZWRcbiAgICB9O1xuICB9XG5cbiAgLyogQGRlcHJlY2F0ZWQgVXNlIGBhd2FpdCBnZXRMb2dzKClgIGluc3RlYWQgKi9cbiAgZ2V0IGxvZ3MoKSB7XG4gICAgY29uc3QgY2FjaGVkTG9ncyA9IHRoaXMudHJhbnNhY3Rpb25Mb2dzO1xuICAgIGlmIChjYWNoZWRMb2dzICE9IG51bGwgJiYgdHlwZW9mIGNhY2hlZExvZ3MgPT09ICdvYmplY3QnICYmICd0aGVuJyBpbiBjYWNoZWRMb2dzKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gY2FjaGVkTG9ncztcbiAgfVxuICBhc3luYyBnZXRMb2dzKGNvbm5lY3Rpb24pIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy50cmFuc2FjdGlvbkxvZ3MpKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uTG9ncyA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29ubmVjdGlvbi5nZXRUcmFuc2FjdGlvbih0aGlzLnNpZ25hdHVyZSkudGhlbih0eCA9PiB7XG4gICAgICAgICAgaWYgKHR4ICYmIHR4Lm1ldGEgJiYgdHgubWV0YS5sb2dNZXNzYWdlcykge1xuICAgICAgICAgICAgY29uc3QgbG9ncyA9IHR4Lm1ldGEubG9nTWVzc2FnZXM7XG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uTG9ncyA9IGxvZ3M7XG4gICAgICAgICAgICByZXNvbHZlKGxvZ3MpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdMb2cgbWVzc2FnZXMgbm90IGZvdW5kJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkuY2F0Y2gocmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gYXdhaXQgdGhpcy50cmFuc2FjdGlvbkxvZ3M7XG4gIH1cbn1cblxuLy8gS2VlcCBpbiBzeW5jIHdpdGggY2xpZW50L3NyYy9ycGNfY3VzdG9tX2Vycm9ycy5yc1xuLy8gVHlwZXNjcmlwdCBgZW51bXNgIHRod2FydCB0cmVlLXNoYWtpbmcuIFNlZSBodHRwczovL2JhcmdzdGVuLm9yZy9qc3RzL2VudW1zL1xuY29uc3QgU29sYW5hSlNPTlJQQ0Vycm9yQ29kZSA9IHtcbiAgSlNPTl9SUENfU0VSVkVSX0VSUk9SX0JMT0NLX0NMRUFORURfVVA6IC0zMjAwMSxcbiAgSlNPTl9SUENfU0VSVkVSX0VSUk9SX1NFTkRfVFJBTlNBQ1RJT05fUFJFRkxJR0hUX0ZBSUxVUkU6IC0zMjAwMixcbiAgSlNPTl9SUENfU0VSVkVSX0VSUk9SX1RSQU5TQUNUSU9OX1NJR05BVFVSRV9WRVJJRklDQVRJT05fRkFJTFVSRTogLTMyMDAzLFxuICBKU09OX1JQQ19TRVJWRVJfRVJST1JfQkxPQ0tfTk9UX0FWQUlMQUJMRTogLTMyMDA0LFxuICBKU09OX1JQQ19TRVJWRVJfRVJST1JfTk9ERV9VTkhFQUxUSFk6IC0zMjAwNSxcbiAgSlNPTl9SUENfU0VSVkVSX0VSUk9SX1RSQU5TQUNUSU9OX1BSRUNPTVBJTEVfVkVSSUZJQ0FUSU9OX0ZBSUxVUkU6IC0zMjAwNixcbiAgSlNPTl9SUENfU0VSVkVSX0VSUk9SX1NMT1RfU0tJUFBFRDogLTMyMDA3LFxuICBKU09OX1JQQ19TRVJWRVJfRVJST1JfTk9fU05BUFNIT1Q6IC0zMjAwOCxcbiAgSlNPTl9SUENfU0VSVkVSX0VSUk9SX0xPTkdfVEVSTV9TVE9SQUdFX1NMT1RfU0tJUFBFRDogLTMyMDA5LFxuICBKU09OX1JQQ19TRVJWRVJfRVJST1JfS0VZX0VYQ0xVREVEX0ZST01fU0VDT05EQVJZX0lOREVYOiAtMzIwMTAsXG4gIEpTT05fUlBDX1NFUlZFUl9FUlJPUl9UUkFOU0FDVElPTl9ISVNUT1JZX05PVF9BVkFJTEFCTEU6IC0zMjAxMSxcbiAgSlNPTl9SUENfU0NBTl9FUlJPUjogLTMyMDEyLFxuICBKU09OX1JQQ19TRVJWRVJfRVJST1JfVFJBTlNBQ1RJT05fU0lHTkFUVVJFX0xFTl9NSVNNQVRDSDogLTMyMDEzLFxuICBKU09OX1JQQ19TRVJWRVJfRVJST1JfQkxPQ0tfU1RBVFVTX05PVF9BVkFJTEFCTEVfWUVUOiAtMzIwMTQsXG4gIEpTT05fUlBDX1NFUlZFUl9FUlJPUl9VTlNVUFBPUlRFRF9UUkFOU0FDVElPTl9WRVJTSU9OOiAtMzIwMTUsXG4gIEpTT05fUlBDX1NFUlZFUl9FUlJPUl9NSU5fQ09OVEVYVF9TTE9UX05PVF9SRUFDSEVEOiAtMzIwMTZcbn07XG5jbGFzcyBTb2xhbmFKU09OUlBDRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBjb2RlLFxuICAgIG1lc3NhZ2UsXG4gICAgZGF0YVxuICB9LCBjdXN0b21NZXNzYWdlKSB7XG4gICAgc3VwZXIoY3VzdG9tTWVzc2FnZSAhPSBudWxsID8gYCR7Y3VzdG9tTWVzc2FnZX06ICR7bWVzc2FnZX1gIDogbWVzc2FnZSk7XG4gICAgdGhpcy5jb2RlID0gdm9pZCAwO1xuICAgIHRoaXMuZGF0YSA9IHZvaWQgMDtcbiAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgdGhpcy5uYW1lID0gJ1NvbGFuYUpTT05SUENFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBTaWduLCBzZW5kIGFuZCBjb25maXJtIGEgdHJhbnNhY3Rpb24uXG4gKlxuICogSWYgYGNvbW1pdG1lbnRgIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byAnbWF4JyBjb21taXRtZW50LlxuICpcbiAqIEBwYXJhbSB7Q29ubmVjdGlvbn0gY29ubmVjdGlvblxuICogQHBhcmFtIHtUcmFuc2FjdGlvbn0gdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSB7QXJyYXk8U2lnbmVyPn0gc2lnbmVyc1xuICogQHBhcmFtIHtDb25maXJtT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUcmFuc2FjdGlvblNpZ25hdHVyZT59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNlbmRBbmRDb25maXJtVHJhbnNhY3Rpb24oY29ubmVjdGlvbiwgdHJhbnNhY3Rpb24sIHNpZ25lcnMsIG9wdGlvbnMpIHtcbiAgY29uc3Qgc2VuZE9wdGlvbnMgPSBvcHRpb25zICYmIHtcbiAgICBza2lwUHJlZmxpZ2h0OiBvcHRpb25zLnNraXBQcmVmbGlnaHQsXG4gICAgcHJlZmxpZ2h0Q29tbWl0bWVudDogb3B0aW9ucy5wcmVmbGlnaHRDb21taXRtZW50IHx8IG9wdGlvbnMuY29tbWl0bWVudCxcbiAgICBtYXhSZXRyaWVzOiBvcHRpb25zLm1heFJldHJpZXMsXG4gICAgbWluQ29udGV4dFNsb3Q6IG9wdGlvbnMubWluQ29udGV4dFNsb3RcbiAgfTtcbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgY29ubmVjdGlvbi5zZW5kVHJhbnNhY3Rpb24odHJhbnNhY3Rpb24sIHNpZ25lcnMsIHNlbmRPcHRpb25zKTtcbiAgbGV0IHN0YXR1cztcbiAgaWYgKHRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCAhPSBudWxsICYmIHRyYW5zYWN0aW9uLmxhc3RWYWxpZEJsb2NrSGVpZ2h0ICE9IG51bGwpIHtcbiAgICBzdGF0dXMgPSAoYXdhaXQgY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oe1xuICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnM/LmFib3J0U2lnbmFsLFxuICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmUsXG4gICAgICBibG9ja2hhc2g6IHRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaCxcbiAgICAgIGxhc3RWYWxpZEJsb2NrSGVpZ2h0OiB0cmFuc2FjdGlvbi5sYXN0VmFsaWRCbG9ja0hlaWdodFxuICAgIH0sIG9wdGlvbnMgJiYgb3B0aW9ucy5jb21taXRtZW50KSkudmFsdWU7XG4gIH0gZWxzZSBpZiAodHJhbnNhY3Rpb24ubWluTm9uY2VDb250ZXh0U2xvdCAhPSBudWxsICYmIHRyYW5zYWN0aW9uLm5vbmNlSW5mbyAhPSBudWxsKSB7XG4gICAgY29uc3Qge1xuICAgICAgbm9uY2VJbnN0cnVjdGlvblxuICAgIH0gPSB0cmFuc2FjdGlvbi5ub25jZUluZm87XG4gICAgY29uc3Qgbm9uY2VBY2NvdW50UHVia2V5ID0gbm9uY2VJbnN0cnVjdGlvbi5rZXlzWzBdLnB1YmtleTtcbiAgICBzdGF0dXMgPSAoYXdhaXQgY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oe1xuICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnM/LmFib3J0U2lnbmFsLFxuICAgICAgbWluQ29udGV4dFNsb3Q6IHRyYW5zYWN0aW9uLm1pbk5vbmNlQ29udGV4dFNsb3QsXG4gICAgICBub25jZUFjY291bnRQdWJrZXksXG4gICAgICBub25jZVZhbHVlOiB0cmFuc2FjdGlvbi5ub25jZUluZm8ubm9uY2UsXG4gICAgICBzaWduYXR1cmVcbiAgICB9LCBvcHRpb25zICYmIG9wdGlvbnMuY29tbWl0bWVudCkpLnZhbHVlO1xuICB9IGVsc2Uge1xuICAgIGlmIChvcHRpb25zPy5hYm9ydFNpZ25hbCAhPSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ3NlbmRBbmRDb25maXJtVHJhbnNhY3Rpb24oKTogQSB0cmFuc2FjdGlvbiB3aXRoIGEgZGVwcmVjYXRlZCBjb25maXJtYXRpb24gc3RyYXRlZ3kgd2FzICcgKyAnc3VwcGxpZWQgYWxvbmcgd2l0aCBhbiBgYWJvcnRTaWduYWxgLiBPbmx5IHRyYW5zYWN0aW9ucyBoYXZpbmcgYGxhc3RWYWxpZEJsb2NrSGVpZ2h0YCAnICsgJ29yIGEgY29tYmluYXRpb24gb2YgYG5vbmNlSW5mb2AgYW5kIGBtaW5Ob25jZUNvbnRleHRTbG90YCBhcmUgYWJvcnRhYmxlLicpO1xuICAgIH1cbiAgICBzdGF0dXMgPSAoYXdhaXQgY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oc2lnbmF0dXJlLCBvcHRpb25zICYmIG9wdGlvbnMuY29tbWl0bWVudCkpLnZhbHVlO1xuICB9XG4gIGlmIChzdGF0dXMuZXJyKSB7XG4gICAgaWYgKHNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgU2VuZFRyYW5zYWN0aW9uRXJyb3Ioe1xuICAgICAgICBhY3Rpb246ICdzZW5kJyxcbiAgICAgICAgc2lnbmF0dXJlOiBzaWduYXR1cmUsXG4gICAgICAgIHRyYW5zYWN0aW9uTWVzc2FnZTogYFN0YXR1czogKCR7SlNPTi5zdHJpbmdpZnkoc3RhdHVzKX0pYFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gJHtzaWduYXR1cmV9IGZhaWxlZCAoJHtKU09OLnN0cmluZ2lmeShzdGF0dXMpfSlgKTtcbiAgfVxuICByZXR1cm4gc2lnbmF0dXJlO1xufVxuXG4vLyB6enpcbmZ1bmN0aW9uIHNsZWVwKG1zKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG4vKipcbiAqIFBvcHVsYXRlIGEgYnVmZmVyIG9mIGluc3RydWN0aW9uIGRhdGEgdXNpbmcgYW4gSW5zdHJ1Y3Rpb25UeXBlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZW5jb2RlRGF0YSh0eXBlLCBmaWVsZHMpIHtcbiAgY29uc3QgYWxsb2NMZW5ndGggPSB0eXBlLmxheW91dC5zcGFuID49IDAgPyB0eXBlLmxheW91dC5zcGFuIDogZ2V0QWxsb2ModHlwZSwgZmllbGRzKTtcbiAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyhhbGxvY0xlbmd0aCk7XG4gIGNvbnN0IGxheW91dEZpZWxkcyA9IE9iamVjdC5hc3NpZ24oe1xuICAgIGluc3RydWN0aW9uOiB0eXBlLmluZGV4XG4gIH0sIGZpZWxkcyk7XG4gIHR5cGUubGF5b3V0LmVuY29kZShsYXlvdXRGaWVsZHMsIGRhdGEpO1xuICByZXR1cm4gZGF0YTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgaW5zdHJ1Y3Rpb24gZGF0YSBidWZmZXIgdXNpbmcgYW4gSW5zdHJ1Y3Rpb25UeXBlXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gZGVjb2RlRGF0YSQxKHR5cGUsIGJ1ZmZlcikge1xuICBsZXQgZGF0YTtcbiAgdHJ5IHtcbiAgICBkYXRhID0gdHlwZS5sYXlvdXQuZGVjb2RlKGJ1ZmZlcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnN0cnVjdGlvbjsgJyArIGVycik7XG4gIH1cbiAgaWYgKGRhdGEuaW5zdHJ1Y3Rpb24gIT09IHR5cGUuaW5kZXgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5zdHJ1Y3Rpb247IGluc3RydWN0aW9uIGluZGV4IG1pc21hdGNoICR7ZGF0YS5pbnN0cnVjdGlvbn0gIT0gJHt0eXBlLmluZGV4fWApO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG4vKipcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zb2xhbmEtbGFicy9zb2xhbmEvYmxvYi85MGJlZGQ3ZTA2N2I1YjhmM2RkYmI0NWRhMDBhNGU5Y2FiYjIyYzYyL3Nkay9zcmMvZmVlX2NhbGN1bGF0b3IucnMjTDctTDExXG4gKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IEZlZUNhbGN1bGF0b3JMYXlvdXQgPSBCdWZmZXJMYXlvdXQubnU2NCgnbGFtcG9ydHNQZXJTaWduYXR1cmUnKTtcblxuLyoqXG4gKiBDYWxjdWxhdG9yIGZvciB0cmFuc2FjdGlvbiBmZWVzLlxuICpcbiAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgc2luY2UgU29sYW5hIHYxLjguMC5cbiAqL1xuXG4vKipcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vc29sYW5hLWxhYnMvc29sYW5hL2Jsb2IvMGVhMjg0M2VjOWNkYzUxNzU3MmI4ZTYyYzk1OWY0MWI1NWNmNDQ1My9zZGsvc3JjL25vbmNlX3N0YXRlLnJzI0wyOS1MMzJcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgTm9uY2VBY2NvdW50TGF5b3V0ID0gQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnUzMigndmVyc2lvbicpLCBCdWZmZXJMYXlvdXQudTMyKCdzdGF0ZScpLCBwdWJsaWNLZXkoJ2F1dGhvcml6ZWRQdWJrZXknKSwgcHVibGljS2V5KCdub25jZScpLCBCdWZmZXJMYXlvdXQuc3RydWN0KFtGZWVDYWxjdWxhdG9yTGF5b3V0XSwgJ2ZlZUNhbGN1bGF0b3InKV0pO1xuY29uc3QgTk9OQ0VfQUNDT1VOVF9MRU5HVEggPSBOb25jZUFjY291bnRMYXlvdXQuc3BhbjtcblxuLyoqXG4gKiBBIGR1cmFibGUgbm9uY2UgaXMgYSAzMiBieXRlIHZhbHVlIGVuY29kZWQgYXMgYSBiYXNlNTggc3RyaW5nLlxuICovXG5cbi8qKlxuICogTm9uY2VBY2NvdW50IGNsYXNzXG4gKi9cbmNsYXNzIE5vbmNlQWNjb3VudCB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICB0aGlzLmF1dGhvcml6ZWRQdWJrZXkgPSB2b2lkIDA7XG4gICAgdGhpcy5ub25jZSA9IHZvaWQgMDtcbiAgICB0aGlzLmZlZUNhbGN1bGF0b3IgPSB2b2lkIDA7XG4gICAgdGhpcy5hdXRob3JpemVkUHVia2V5ID0gYXJncy5hdXRob3JpemVkUHVia2V5O1xuICAgIHRoaXMubm9uY2UgPSBhcmdzLm5vbmNlO1xuICAgIHRoaXMuZmVlQ2FsY3VsYXRvciA9IGFyZ3MuZmVlQ2FsY3VsYXRvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNlcmlhbGl6ZSBOb25jZUFjY291bnQgZnJvbSB0aGUgYWNjb3VudCBkYXRhLlxuICAgKlxuICAgKiBAcGFyYW0gYnVmZmVyIGFjY291bnQgZGF0YVxuICAgKiBAcmV0dXJuIE5vbmNlQWNjb3VudFxuICAgKi9cbiAgc3RhdGljIGZyb21BY2NvdW50RGF0YShidWZmZXIpIHtcbiAgICBjb25zdCBub25jZUFjY291bnQgPSBOb25jZUFjY291bnRMYXlvdXQuZGVjb2RlKHRvQnVmZmVyKGJ1ZmZlciksIDApO1xuICAgIHJldHVybiBuZXcgTm9uY2VBY2NvdW50KHtcbiAgICAgIGF1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkobm9uY2VBY2NvdW50LmF1dGhvcml6ZWRQdWJrZXkpLFxuICAgICAgbm9uY2U6IG5ldyBQdWJsaWNLZXkobm9uY2VBY2NvdW50Lm5vbmNlKS50b1N0cmluZygpLFxuICAgICAgZmVlQ2FsY3VsYXRvcjogbm9uY2VBY2NvdW50LmZlZUNhbGN1bGF0b3JcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB1NjQocHJvcGVydHkpIHtcbiAgY29uc3QgbGF5b3V0ID0gYmxvYig4IC8qIGJ5dGVzICovLCBwcm9wZXJ0eSk7XG4gIGNvbnN0IGRlY29kZSA9IGxheW91dC5kZWNvZGUuYmluZChsYXlvdXQpO1xuICBjb25zdCBlbmNvZGUgPSBsYXlvdXQuZW5jb2RlLmJpbmQobGF5b3V0KTtcbiAgY29uc3QgYmlnSW50TGF5b3V0ID0gbGF5b3V0O1xuICBjb25zdCBjb2RlYyA9IGdldFU2NENvZGVjKCk7XG4gIGJpZ0ludExheW91dC5kZWNvZGUgPSAoYnVmZmVyLCBvZmZzZXQpID0+IHtcbiAgICBjb25zdCBzcmMgPSBkZWNvZGUoYnVmZmVyLCBvZmZzZXQpO1xuICAgIHJldHVybiBjb2RlYy5kZWNvZGUoc3JjKTtcbiAgfTtcbiAgYmlnSW50TGF5b3V0LmVuY29kZSA9IChiaWdJbnQsIGJ1ZmZlciwgb2Zmc2V0KSA9PiB7XG4gICAgY29uc3Qgc3JjID0gY29kZWMuZW5jb2RlKGJpZ0ludCk7XG4gICAgcmV0dXJuIGVuY29kZShzcmMsIGJ1ZmZlciwgb2Zmc2V0KTtcbiAgfTtcbiAgcmV0dXJuIGJpZ0ludExheW91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYWNjb3VudCBzeXN0ZW0gdHJhbnNhY3Rpb24gcGFyYW1zXG4gKi9cblxuLyoqXG4gKiBUcmFuc2ZlciBzeXN0ZW0gdHJhbnNhY3Rpb24gcGFyYW1zXG4gKi9cblxuLyoqXG4gKiBBc3NpZ24gc3lzdGVtIHRyYW5zYWN0aW9uIHBhcmFtc1xuICovXG5cbi8qKlxuICogQ3JlYXRlIGFjY291bnQgd2l0aCBzZWVkIHN5c3RlbSB0cmFuc2FjdGlvbiBwYXJhbXNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBub25jZSBhY2NvdW50IHN5c3RlbSB0cmFuc2FjdGlvbiBwYXJhbXNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBub25jZSBhY2NvdW50IHdpdGggc2VlZCBzeXN0ZW0gdHJhbnNhY3Rpb24gcGFyYW1zXG4gKi9cblxuLyoqXG4gKiBJbml0aWFsaXplIG5vbmNlIGFjY291bnQgc3lzdGVtIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG5cbi8qKlxuICogQWR2YW5jZSBub25jZSBhY2NvdW50IHN5c3RlbSBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqL1xuXG4vKipcbiAqIFdpdGhkcmF3IG5vbmNlIGFjY291bnQgc3lzdGVtIHRyYW5zYWN0aW9uIHBhcmFtc1xuICovXG5cbi8qKlxuICogQXV0aG9yaXplIG5vbmNlIGFjY291bnQgc3lzdGVtIHRyYW5zYWN0aW9uIHBhcmFtc1xuICovXG5cbi8qKlxuICogQWxsb2NhdGUgYWNjb3VudCBzeXN0ZW0gdHJhbnNhY3Rpb24gcGFyYW1zXG4gKi9cblxuLyoqXG4gKiBBbGxvY2F0ZSBhY2NvdW50IHdpdGggc2VlZCBzeXN0ZW0gdHJhbnNhY3Rpb24gcGFyYW1zXG4gKi9cblxuLyoqXG4gKiBBc3NpZ24gYWNjb3VudCB3aXRoIHNlZWQgc3lzdGVtIHRyYW5zYWN0aW9uIHBhcmFtc1xuICovXG5cbi8qKlxuICogVHJhbnNmZXIgd2l0aCBzZWVkIHN5c3RlbSB0cmFuc2FjdGlvbiBwYXJhbXNcbiAqL1xuXG4vKiogRGVjb2RlZCB0cmFuc2ZlciBzeXN0ZW0gdHJhbnNhY3Rpb24gaW5zdHJ1Y3Rpb24gKi9cblxuLyoqIERlY29kZWQgdHJhbnNmZXJXaXRoU2VlZCBzeXN0ZW0gdHJhbnNhY3Rpb24gaW5zdHJ1Y3Rpb24gKi9cblxuLyoqXG4gKiBTeXN0ZW0gSW5zdHJ1Y3Rpb24gY2xhc3NcbiAqL1xuY2xhc3MgU3lzdGVtSW5zdHJ1Y3Rpb24ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIHN5c3RlbSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHR5cGUuXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja1Byb2dyYW1JZChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZUxheW91dCA9IEJ1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyk7XG4gICAgY29uc3QgdHlwZUluZGV4ID0gaW5zdHJ1Y3Rpb25UeXBlTGF5b3V0LmRlY29kZShpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICBsZXQgdHlwZTtcbiAgICBmb3IgKGNvbnN0IFtpeFR5cGUsIGxheW91dF0gb2YgT2JqZWN0LmVudHJpZXMoU1lTVEVNX0lOU1RSVUNUSU9OX0xBWU9VVFMpKSB7XG4gICAgICBpZiAobGF5b3V0LmluZGV4ID09IHR5cGVJbmRleCkge1xuICAgICAgICB0eXBlID0gaXhUeXBlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luc3RydWN0aW9uIHR5cGUgaW5jb3JyZWN0OyBub3QgYSBTeXN0ZW1JbnN0cnVjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgYSBjcmVhdGUgYWNjb3VudCBzeXN0ZW0gaW5zdHJ1Y3Rpb24gYW5kIHJldHJpZXZlIHRoZSBpbnN0cnVjdGlvbiBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlQ3JlYXRlQWNjb3VudChpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDIpO1xuICAgIGNvbnN0IHtcbiAgICAgIGxhbXBvcnRzLFxuICAgICAgc3BhY2UsXG4gICAgICBwcm9ncmFtSWRcbiAgICB9ID0gZGVjb2RlRGF0YSQxKFNZU1RFTV9JTlNUUlVDVElPTl9MQVlPVVRTLkNyZWF0ZSwgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb21QdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgbmV3QWNjb3VudFB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1sxXS5wdWJrZXksXG4gICAgICBsYW1wb3J0cyxcbiAgICAgIHNwYWNlLFxuICAgICAgcHJvZ3JhbUlkOiBuZXcgUHVibGljS2V5KHByb2dyYW1JZClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIHRyYW5zZmVyIHN5c3RlbSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVUcmFuc2ZlcihpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDIpO1xuICAgIGNvbnN0IHtcbiAgICAgIGxhbXBvcnRzXG4gICAgfSA9IGRlY29kZURhdGEkMShTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUy5UcmFuc2ZlciwgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb21QdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgdG9QdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMV0ucHVia2V5LFxuICAgICAgbGFtcG9ydHNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIHRyYW5zZmVyIHdpdGggc2VlZCBzeXN0ZW0gaW5zdHJ1Y3Rpb24gYW5kIHJldHJpZXZlIHRoZSBpbnN0cnVjdGlvbiBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlVHJhbnNmZXJXaXRoU2VlZChpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDMpO1xuICAgIGNvbnN0IHtcbiAgICAgIGxhbXBvcnRzLFxuICAgICAgc2VlZCxcbiAgICAgIHByb2dyYW1JZFxuICAgIH0gPSBkZWNvZGVEYXRhJDEoU1lTVEVNX0lOU1RSVUNUSU9OX0xBWU9VVFMuVHJhbnNmZXJXaXRoU2VlZCwgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb21QdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgYmFzZVB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1sxXS5wdWJrZXksXG4gICAgICB0b1B1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1syXS5wdWJrZXksXG4gICAgICBsYW1wb3J0cyxcbiAgICAgIHNlZWQsXG4gICAgICBwcm9ncmFtSWQ6IG5ldyBQdWJsaWNLZXkocHJvZ3JhbUlkKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGFuIGFsbG9jYXRlIHN5c3RlbSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVBbGxvY2F0ZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDEpO1xuICAgIGNvbnN0IHtcbiAgICAgIHNwYWNlXG4gICAgfSA9IGRlY29kZURhdGEkMShTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUy5BbGxvY2F0ZSwgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY291bnRQdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgc3BhY2VcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhbiBhbGxvY2F0ZSB3aXRoIHNlZWQgc3lzdGVtIGluc3RydWN0aW9uIGFuZCByZXRyaWV2ZSB0aGUgaW5zdHJ1Y3Rpb24gcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZUFsbG9jYXRlV2l0aFNlZWQoaW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmNoZWNrUHJvZ3JhbUlkKGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgdGhpcy5jaGVja0tleUxlbmd0aChpbnN0cnVjdGlvbi5rZXlzLCAxKTtcbiAgICBjb25zdCB7XG4gICAgICBiYXNlLFxuICAgICAgc2VlZCxcbiAgICAgIHNwYWNlLFxuICAgICAgcHJvZ3JhbUlkXG4gICAgfSA9IGRlY29kZURhdGEkMShTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUy5BbGxvY2F0ZVdpdGhTZWVkLCBpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudFB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXksXG4gICAgICBiYXNlUHVia2V5OiBuZXcgUHVibGljS2V5KGJhc2UpLFxuICAgICAgc2VlZCxcbiAgICAgIHNwYWNlLFxuICAgICAgcHJvZ3JhbUlkOiBuZXcgUHVibGljS2V5KHByb2dyYW1JZClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhbiBhc3NpZ24gc3lzdGVtIGluc3RydWN0aW9uIGFuZCByZXRyaWV2ZSB0aGUgaW5zdHJ1Y3Rpb24gcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZUFzc2lnbihpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDEpO1xuICAgIGNvbnN0IHtcbiAgICAgIHByb2dyYW1JZFxuICAgIH0gPSBkZWNvZGVEYXRhJDEoU1lTVEVNX0lOU1RSVUNUSU9OX0xBWU9VVFMuQXNzaWduLCBpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudFB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXksXG4gICAgICBwcm9ncmFtSWQ6IG5ldyBQdWJsaWNLZXkocHJvZ3JhbUlkKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGFuIGFzc2lnbiB3aXRoIHNlZWQgc3lzdGVtIGluc3RydWN0aW9uIGFuZCByZXRyaWV2ZSB0aGUgaW5zdHJ1Y3Rpb24gcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZUFzc2lnbldpdGhTZWVkKGluc3RydWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja1Byb2dyYW1JZChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgIHRoaXMuY2hlY2tLZXlMZW5ndGgoaW5zdHJ1Y3Rpb24ua2V5cywgMSk7XG4gICAgY29uc3Qge1xuICAgICAgYmFzZSxcbiAgICAgIHNlZWQsXG4gICAgICBwcm9ncmFtSWRcbiAgICB9ID0gZGVjb2RlRGF0YSQxKFNZU1RFTV9JTlNUUlVDVElPTl9MQVlPVVRTLkFzc2lnbldpdGhTZWVkLCBpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudFB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXksXG4gICAgICBiYXNlUHVia2V5OiBuZXcgUHVibGljS2V5KGJhc2UpLFxuICAgICAgc2VlZCxcbiAgICAgIHByb2dyYW1JZDogbmV3IFB1YmxpY0tleShwcm9ncmFtSWQpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgYSBjcmVhdGUgYWNjb3VudCB3aXRoIHNlZWQgc3lzdGVtIGluc3RydWN0aW9uIGFuZCByZXRyaWV2ZSB0aGUgaW5zdHJ1Y3Rpb24gcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZUNyZWF0ZVdpdGhTZWVkKGluc3RydWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja1Byb2dyYW1JZChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgIHRoaXMuY2hlY2tLZXlMZW5ndGgoaW5zdHJ1Y3Rpb24ua2V5cywgMik7XG4gICAgY29uc3Qge1xuICAgICAgYmFzZSxcbiAgICAgIHNlZWQsXG4gICAgICBsYW1wb3J0cyxcbiAgICAgIHNwYWNlLFxuICAgICAgcHJvZ3JhbUlkXG4gICAgfSA9IGRlY29kZURhdGEkMShTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUy5DcmVhdGVXaXRoU2VlZCwgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZyb21QdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgbmV3QWNjb3VudFB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1sxXS5wdWJrZXksXG4gICAgICBiYXNlUHVia2V5OiBuZXcgUHVibGljS2V5KGJhc2UpLFxuICAgICAgc2VlZCxcbiAgICAgIGxhbXBvcnRzLFxuICAgICAgc3BhY2UsXG4gICAgICBwcm9ncmFtSWQ6IG5ldyBQdWJsaWNLZXkocHJvZ3JhbUlkKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGEgbm9uY2UgaW5pdGlhbGl6ZSBzeXN0ZW0gaW5zdHJ1Y3Rpb24gYW5kIHJldHJpZXZlIHRoZSBpbnN0cnVjdGlvbiBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlTm9uY2VJbml0aWFsaXplKGluc3RydWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja1Byb2dyYW1JZChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgIHRoaXMuY2hlY2tLZXlMZW5ndGgoaW5zdHJ1Y3Rpb24ua2V5cywgMyk7XG4gICAgY29uc3Qge1xuICAgICAgYXV0aG9yaXplZFxuICAgIH0gPSBkZWNvZGVEYXRhJDEoU1lTVEVNX0lOU1RSVUNUSU9OX0xBWU9VVFMuSW5pdGlhbGl6ZU5vbmNlQWNjb3VudCwgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vbmNlUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzBdLnB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkoYXV0aG9yaXplZClcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIG5vbmNlIGFkdmFuY2Ugc3lzdGVtIGluc3RydWN0aW9uIGFuZCByZXRyaWV2ZSB0aGUgaW5zdHJ1Y3Rpb24gcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZU5vbmNlQWR2YW5jZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDMpO1xuICAgIGRlY29kZURhdGEkMShTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUy5BZHZhbmNlTm9uY2VBY2NvdW50LCBpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9uY2VQdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgYXV0aG9yaXplZFB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1syXS5wdWJrZXlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIG5vbmNlIHdpdGhkcmF3IHN5c3RlbSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVOb25jZVdpdGhkcmF3KGluc3RydWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja1Byb2dyYW1JZChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgIHRoaXMuY2hlY2tLZXlMZW5ndGgoaW5zdHJ1Y3Rpb24ua2V5cywgNSk7XG4gICAgY29uc3Qge1xuICAgICAgbGFtcG9ydHNcbiAgICB9ID0gZGVjb2RlRGF0YSQxKFNZU1RFTV9JTlNUUlVDVElPTl9MQVlPVVRTLldpdGhkcmF3Tm9uY2VBY2NvdW50LCBpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgbm9uY2VQdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgdG9QdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMV0ucHVia2V5LFxuICAgICAgYXV0aG9yaXplZFB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1s0XS5wdWJrZXksXG4gICAgICBsYW1wb3J0c1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGEgbm9uY2UgYXV0aG9yaXplIHN5c3RlbSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVOb25jZUF1dGhvcml6ZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDIpO1xuICAgIGNvbnN0IHtcbiAgICAgIGF1dGhvcml6ZWRcbiAgICB9ID0gZGVjb2RlRGF0YSQxKFNZU1RFTV9JTlNUUlVDVElPTl9MQVlPVVRTLkF1dGhvcml6ZU5vbmNlQWNjb3VudCwgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5vbmNlUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzBdLnB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRQdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMV0ucHVia2V5LFxuICAgICAgbmV3QXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShhdXRob3JpemVkKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgY2hlY2tQcm9ncmFtSWQocHJvZ3JhbUlkKSB7XG4gICAgaWYgKCFwcm9ncmFtSWQuZXF1YWxzKFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluc3RydWN0aW9uOyBwcm9ncmFtSWQgaXMgbm90IFN5c3RlbVByb2dyYW0nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgY2hlY2tLZXlMZW5ndGgoa2V5cywgZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICBpZiAoa2V5cy5sZW5ndGggPCBleHBlY3RlZExlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGluc3RydWN0aW9uOyBmb3VuZCAke2tleXMubGVuZ3RofSBrZXlzLCBleHBlY3RlZCBhdCBsZWFzdCAke2V4cGVjdGVkTGVuZ3RofWApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFuIGVudW1lcmF0aW9uIG9mIHZhbGlkIFN5c3RlbUluc3RydWN0aW9uVHlwZSdzXG4gKi9cblxuLyoqXG4gKiBBbiBlbnVtZXJhdGlvbiBvZiB2YWxpZCBzeXN0ZW0gSW5zdHJ1Y3Rpb25UeXBlJ3NcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUyA9IE9iamVjdC5mcmVlemUoe1xuICBDcmVhdGU6IHtcbiAgICBpbmRleDogMCxcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyksIEJ1ZmZlckxheW91dC5uczY0KCdsYW1wb3J0cycpLCBCdWZmZXJMYXlvdXQubnM2NCgnc3BhY2UnKSwgcHVibGljS2V5KCdwcm9ncmFtSWQnKV0pXG4gIH0sXG4gIEFzc2lnbjoge1xuICAgIGluZGV4OiAxLFxuICAgIGxheW91dDogQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnUzMignaW5zdHJ1Y3Rpb24nKSwgcHVibGljS2V5KCdwcm9ncmFtSWQnKV0pXG4gIH0sXG4gIFRyYW5zZmVyOiB7XG4gICAgaW5kZXg6IDIsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpLCB1NjQoJ2xhbXBvcnRzJyldKVxuICB9LFxuICBDcmVhdGVXaXRoU2VlZDoge1xuICAgIGluZGV4OiAzLFxuICAgIGxheW91dDogQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnUzMignaW5zdHJ1Y3Rpb24nKSwgcHVibGljS2V5KCdiYXNlJyksIHJ1c3RTdHJpbmcoJ3NlZWQnKSwgQnVmZmVyTGF5b3V0Lm5zNjQoJ2xhbXBvcnRzJyksIEJ1ZmZlckxheW91dC5uczY0KCdzcGFjZScpLCBwdWJsaWNLZXkoJ3Byb2dyYW1JZCcpXSlcbiAgfSxcbiAgQWR2YW5jZU5vbmNlQWNjb3VudDoge1xuICAgIGluZGV4OiA0LFxuICAgIGxheW91dDogQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnUzMignaW5zdHJ1Y3Rpb24nKV0pXG4gIH0sXG4gIFdpdGhkcmF3Tm9uY2VBY2NvdW50OiB7XG4gICAgaW5kZXg6IDUsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpLCBCdWZmZXJMYXlvdXQubnM2NCgnbGFtcG9ydHMnKV0pXG4gIH0sXG4gIEluaXRpYWxpemVOb25jZUFjY291bnQ6IHtcbiAgICBpbmRleDogNixcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyksIHB1YmxpY0tleSgnYXV0aG9yaXplZCcpXSlcbiAgfSxcbiAgQXV0aG9yaXplTm9uY2VBY2NvdW50OiB7XG4gICAgaW5kZXg6IDcsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpLCBwdWJsaWNLZXkoJ2F1dGhvcml6ZWQnKV0pXG4gIH0sXG4gIEFsbG9jYXRlOiB7XG4gICAgaW5kZXg6IDgsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpLCBCdWZmZXJMYXlvdXQubnM2NCgnc3BhY2UnKV0pXG4gIH0sXG4gIEFsbG9jYXRlV2l0aFNlZWQ6IHtcbiAgICBpbmRleDogOSxcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyksIHB1YmxpY0tleSgnYmFzZScpLCBydXN0U3RyaW5nKCdzZWVkJyksIEJ1ZmZlckxheW91dC5uczY0KCdzcGFjZScpLCBwdWJsaWNLZXkoJ3Byb2dyYW1JZCcpXSlcbiAgfSxcbiAgQXNzaWduV2l0aFNlZWQ6IHtcbiAgICBpbmRleDogMTAsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpLCBwdWJsaWNLZXkoJ2Jhc2UnKSwgcnVzdFN0cmluZygnc2VlZCcpLCBwdWJsaWNLZXkoJ3Byb2dyYW1JZCcpXSlcbiAgfSxcbiAgVHJhbnNmZXJXaXRoU2VlZDoge1xuICAgIGluZGV4OiAxMSxcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyksIHU2NCgnbGFtcG9ydHMnKSwgcnVzdFN0cmluZygnc2VlZCcpLCBwdWJsaWNLZXkoJ3Byb2dyYW1JZCcpXSlcbiAgfSxcbiAgVXBncmFkZU5vbmNlQWNjb3VudDoge1xuICAgIGluZGV4OiAxMixcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyldKVxuICB9XG59KTtcblxuLyoqXG4gKiBGYWN0b3J5IGNsYXNzIGZvciB0cmFuc2FjdGlvbnMgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgU3lzdGVtIHByb2dyYW1cbiAqL1xuY2xhc3MgU3lzdGVtUHJvZ3JhbSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogUHVibGljIGtleSB0aGF0IGlkZW50aWZpZXMgdGhlIFN5c3RlbSBwcm9ncmFtXG4gICAqL1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHRyYW5zYWN0aW9uIGluc3RydWN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBhY2NvdW50XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQWNjb3VudChwYXJhbXMpIHtcbiAgICBjb25zdCB0eXBlID0gU1lTVEVNX0lOU1RSVUNUSU9OX0xBWU9VVFMuQ3JlYXRlO1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVEYXRhKHR5cGUsIHtcbiAgICAgIGxhbXBvcnRzOiBwYXJhbXMubGFtcG9ydHMsXG4gICAgICBzcGFjZTogcGFyYW1zLnNwYWNlLFxuICAgICAgcHJvZ3JhbUlkOiB0b0J1ZmZlcihwYXJhbXMucHJvZ3JhbUlkLnRvQnVmZmVyKCkpXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIGtleXM6IFt7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLmZyb21QdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLm5ld0FjY291bnRQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgICB9XSxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSB0cmFuc2FjdGlvbiBpbnN0cnVjdGlvbiB0aGF0IHRyYW5zZmVycyBsYW1wb3J0cyBmcm9tIG9uZSBhY2NvdW50IHRvIGFub3RoZXJcbiAgICovXG4gIHN0YXRpYyB0cmFuc2ZlcihwYXJhbXMpIHtcbiAgICBsZXQgZGF0YTtcbiAgICBsZXQga2V5cztcbiAgICBpZiAoJ2Jhc2VQdWJrZXknIGluIHBhcmFtcykge1xuICAgICAgY29uc3QgdHlwZSA9IFNZU1RFTV9JTlNUUlVDVElPTl9MQVlPVVRTLlRyYW5zZmVyV2l0aFNlZWQ7XG4gICAgICBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICAgIGxhbXBvcnRzOiBCaWdJbnQocGFyYW1zLmxhbXBvcnRzKSxcbiAgICAgICAgc2VlZDogcGFyYW1zLnNlZWQsXG4gICAgICAgIHByb2dyYW1JZDogdG9CdWZmZXIocGFyYW1zLnByb2dyYW1JZC50b0J1ZmZlcigpKVxuICAgICAgfSk7XG4gICAgICBrZXlzID0gW3tcbiAgICAgICAgcHVia2V5OiBwYXJhbXMuZnJvbVB1YmtleSxcbiAgICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLmJhc2VQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IHBhcmFtcy50b1B1YmtleSxcbiAgICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgICB9XTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHlwZSA9IFNZU1RFTV9JTlNUUlVDVElPTl9MQVlPVVRTLlRyYW5zZmVyO1xuICAgICAgZGF0YSA9IGVuY29kZURhdGEodHlwZSwge1xuICAgICAgICBsYW1wb3J0czogQmlnSW50KHBhcmFtcy5sYW1wb3J0cylcbiAgICAgIH0pO1xuICAgICAga2V5cyA9IFt7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLmZyb21QdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLnRvUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICAgIH1dO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgICAga2V5cyxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSB0cmFuc2FjdGlvbiBpbnN0cnVjdGlvbiB0aGF0IGFzc2lnbnMgYW4gYWNjb3VudCB0byBhIHByb2dyYW1cbiAgICovXG4gIHN0YXRpYyBhc3NpZ24ocGFyYW1zKSB7XG4gICAgbGV0IGRhdGE7XG4gICAgbGV0IGtleXM7XG4gICAgaWYgKCdiYXNlUHVia2V5JyBpbiBwYXJhbXMpIHtcbiAgICAgIGNvbnN0IHR5cGUgPSBTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUy5Bc3NpZ25XaXRoU2VlZDtcbiAgICAgIGRhdGEgPSBlbmNvZGVEYXRhKHR5cGUsIHtcbiAgICAgICAgYmFzZTogdG9CdWZmZXIocGFyYW1zLmJhc2VQdWJrZXkudG9CdWZmZXIoKSksXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICBwcm9ncmFtSWQ6IHRvQnVmZmVyKHBhcmFtcy5wcm9ncmFtSWQudG9CdWZmZXIoKSlcbiAgICAgIH0pO1xuICAgICAga2V5cyA9IFt7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLmFjY291bnRQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IHBhcmFtcy5iYXNlUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICAgIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0eXBlID0gU1lTVEVNX0lOU1RSVUNUSU9OX0xBWU9VVFMuQXNzaWduO1xuICAgICAgZGF0YSA9IGVuY29kZURhdGEodHlwZSwge1xuICAgICAgICBwcm9ncmFtSWQ6IHRvQnVmZmVyKHBhcmFtcy5wcm9ncmFtSWQudG9CdWZmZXIoKSlcbiAgICAgIH0pO1xuICAgICAga2V5cyA9IFt7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLmFjY291bnRQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgICB9XTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIGtleXMsXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgdHJhbnNhY3Rpb24gaW5zdHJ1Y3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IGFjY291bnQgYXRcbiAgICogICBhbiBhZGRyZXNzIGdlbmVyYXRlZCB3aXRoIGBmcm9tYCwgYSBzZWVkLCBhbmQgcHJvZ3JhbUlkXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQWNjb3VudFdpdGhTZWVkKHBhcmFtcykge1xuICAgIGNvbnN0IHR5cGUgPSBTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUy5DcmVhdGVXaXRoU2VlZDtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICBiYXNlOiB0b0J1ZmZlcihwYXJhbXMuYmFzZVB1YmtleS50b0J1ZmZlcigpKSxcbiAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgbGFtcG9ydHM6IHBhcmFtcy5sYW1wb3J0cyxcbiAgICAgIHNwYWNlOiBwYXJhbXMuc3BhY2UsXG4gICAgICBwcm9ncmFtSWQ6IHRvQnVmZmVyKHBhcmFtcy5wcm9ncmFtSWQudG9CdWZmZXIoKSlcbiAgICB9KTtcbiAgICBsZXQga2V5cyA9IFt7XG4gICAgICBwdWJrZXk6IHBhcmFtcy5mcm9tUHVia2V5LFxuICAgICAgaXNTaWduZXI6IHRydWUsXG4gICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgfSwge1xuICAgICAgcHVia2V5OiBwYXJhbXMubmV3QWNjb3VudFB1YmtleSxcbiAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICB9XTtcbiAgICBpZiAoIXBhcmFtcy5iYXNlUHVia2V5LmVxdWFscyhwYXJhbXMuZnJvbVB1YmtleSkpIHtcbiAgICAgIGtleXMucHVzaCh7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLmJhc2VQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICBrZXlzLFxuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZCxcbiAgICAgIGRhdGFcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHRyYW5zYWN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBOb25jZSBhY2NvdW50XG4gICAqL1xuICBzdGF0aWMgY3JlYXRlTm9uY2VBY2NvdW50KHBhcmFtcykge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgaWYgKCdiYXNlUHVia2V5JyBpbiBwYXJhbXMgJiYgJ3NlZWQnIGluIHBhcmFtcykge1xuICAgICAgdHJhbnNhY3Rpb24uYWRkKFN5c3RlbVByb2dyYW0uY3JlYXRlQWNjb3VudFdpdGhTZWVkKHtcbiAgICAgICAgZnJvbVB1YmtleTogcGFyYW1zLmZyb21QdWJrZXksXG4gICAgICAgIG5ld0FjY291bnRQdWJrZXk6IHBhcmFtcy5ub25jZVB1YmtleSxcbiAgICAgICAgYmFzZVB1YmtleTogcGFyYW1zLmJhc2VQdWJrZXksXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICBsYW1wb3J0czogcGFyYW1zLmxhbXBvcnRzLFxuICAgICAgICBzcGFjZTogTk9OQ0VfQUNDT1VOVF9MRU5HVEgsXG4gICAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWRcbiAgICAgIH0pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdHJhbnNhY3Rpb24uYWRkKFN5c3RlbVByb2dyYW0uY3JlYXRlQWNjb3VudCh7XG4gICAgICAgIGZyb21QdWJrZXk6IHBhcmFtcy5mcm9tUHVia2V5LFxuICAgICAgICBuZXdBY2NvdW50UHVia2V5OiBwYXJhbXMubm9uY2VQdWJrZXksXG4gICAgICAgIGxhbXBvcnRzOiBwYXJhbXMubGFtcG9ydHMsXG4gICAgICAgIHNwYWNlOiBOT05DRV9BQ0NPVU5UX0xFTkdUSCxcbiAgICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZFxuICAgICAgfSkpO1xuICAgIH1cbiAgICBjb25zdCBpbml0UGFyYW1zID0ge1xuICAgICAgbm9uY2VQdWJrZXk6IHBhcmFtcy5ub25jZVB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRQdWJrZXk6IHBhcmFtcy5hdXRob3JpemVkUHVia2V5XG4gICAgfTtcbiAgICB0cmFuc2FjdGlvbi5hZGQodGhpcy5ub25jZUluaXRpYWxpemUoaW5pdFBhcmFtcykpO1xuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhbiBpbnN0cnVjdGlvbiB0byBpbml0aWFsaXplIGEgTm9uY2UgYWNjb3VudFxuICAgKi9cbiAgc3RhdGljIG5vbmNlSW5pdGlhbGl6ZShwYXJhbXMpIHtcbiAgICBjb25zdCB0eXBlID0gU1lTVEVNX0lOU1RSVUNUSU9OX0xBWU9VVFMuSW5pdGlhbGl6ZU5vbmNlQWNjb3VudDtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICBhdXRob3JpemVkOiB0b0J1ZmZlcihwYXJhbXMuYXV0aG9yaXplZFB1YmtleS50b0J1ZmZlcigpKVxuICAgIH0pO1xuICAgIGNvbnN0IGluc3RydWN0aW9uRGF0YSA9IHtcbiAgICAgIGtleXM6IFt7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLm5vbmNlUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgcHVia2V5OiBTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX1BVQktFWSxcbiAgICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IFNZU1ZBUl9SRU5UX1BVQktFWSxcbiAgICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfV0sXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKGluc3RydWN0aW9uRGF0YSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gaW5zdHJ1Y3Rpb24gdG8gYWR2YW5jZSB0aGUgbm9uY2UgaW4gYSBOb25jZSBhY2NvdW50XG4gICAqL1xuICBzdGF0aWMgbm9uY2VBZHZhbmNlKHBhcmFtcykge1xuICAgIGNvbnN0IHR5cGUgPSBTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUy5BZHZhbmNlTm9uY2VBY2NvdW50O1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVEYXRhKHR5cGUpO1xuICAgIGNvbnN0IGluc3RydWN0aW9uRGF0YSA9IHtcbiAgICAgIGtleXM6IFt7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLm5vbmNlUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgcHVia2V5OiBTWVNWQVJfUkVDRU5UX0JMT0NLSEFTSEVTX1BVQktFWSxcbiAgICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IHBhcmFtcy5hdXRob3JpemVkUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICAgIH1dLFxuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZCxcbiAgICAgIGRhdGFcbiAgICB9O1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbihpbnN0cnVjdGlvbkRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgdHJhbnNhY3Rpb24gaW5zdHJ1Y3Rpb24gdGhhdCB3aXRoZHJhd3MgbGFtcG9ydHMgZnJvbSBhIE5vbmNlIGFjY291bnRcbiAgICovXG4gIHN0YXRpYyBub25jZVdpdGhkcmF3KHBhcmFtcykge1xuICAgIGNvbnN0IHR5cGUgPSBTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUy5XaXRoZHJhd05vbmNlQWNjb3VudDtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICBsYW1wb3J0czogcGFyYW1zLmxhbXBvcnRzXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIGtleXM6IFt7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLm5vbmNlUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgcHVia2V5OiBwYXJhbXMudG9QdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVNfUFVCS0VZLFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogU1lTVkFSX1JFTlRfUFVCS0VZLFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLmF1dGhvcml6ZWRQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfV0sXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgdHJhbnNhY3Rpb24gaW5zdHJ1Y3Rpb24gdGhhdCBhdXRob3JpemVzIGEgbmV3IFB1YmxpY0tleSBhcyB0aGUgYXV0aG9yaXR5XG4gICAqIG9uIGEgTm9uY2UgYWNjb3VudC5cbiAgICovXG4gIHN0YXRpYyBub25jZUF1dGhvcml6ZShwYXJhbXMpIHtcbiAgICBjb25zdCB0eXBlID0gU1lTVEVNX0lOU1RSVUNUSU9OX0xBWU9VVFMuQXV0aG9yaXplTm9uY2VBY2NvdW50O1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVEYXRhKHR5cGUsIHtcbiAgICAgIGF1dGhvcml6ZWQ6IHRvQnVmZmVyKHBhcmFtcy5uZXdBdXRob3JpemVkUHVia2V5LnRvQnVmZmVyKCkpXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIGtleXM6IFt7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLm5vbmNlUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgcHVia2V5OiBwYXJhbXMuYXV0aG9yaXplZFB1YmtleSxcbiAgICAgICAgaXNTaWduZXI6IHRydWUsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9XSxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSB0cmFuc2FjdGlvbiBpbnN0cnVjdGlvbiB0aGF0IGFsbG9jYXRlcyBzcGFjZSBpbiBhbiBhY2NvdW50IHdpdGhvdXQgZnVuZGluZ1xuICAgKi9cbiAgc3RhdGljIGFsbG9jYXRlKHBhcmFtcykge1xuICAgIGxldCBkYXRhO1xuICAgIGxldCBrZXlzO1xuICAgIGlmICgnYmFzZVB1YmtleScgaW4gcGFyYW1zKSB7XG4gICAgICBjb25zdCB0eXBlID0gU1lTVEVNX0lOU1RSVUNUSU9OX0xBWU9VVFMuQWxsb2NhdGVXaXRoU2VlZDtcbiAgICAgIGRhdGEgPSBlbmNvZGVEYXRhKHR5cGUsIHtcbiAgICAgICAgYmFzZTogdG9CdWZmZXIocGFyYW1zLmJhc2VQdWJrZXkudG9CdWZmZXIoKSksXG4gICAgICAgIHNlZWQ6IHBhcmFtcy5zZWVkLFxuICAgICAgICBzcGFjZTogcGFyYW1zLnNwYWNlLFxuICAgICAgICBwcm9ncmFtSWQ6IHRvQnVmZmVyKHBhcmFtcy5wcm9ncmFtSWQudG9CdWZmZXIoKSlcbiAgICAgIH0pO1xuICAgICAga2V5cyA9IFt7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLmFjY291bnRQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IHBhcmFtcy5iYXNlUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICAgIH1dO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB0eXBlID0gU1lTVEVNX0lOU1RSVUNUSU9OX0xBWU9VVFMuQWxsb2NhdGU7XG4gICAgICBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICAgIHNwYWNlOiBwYXJhbXMuc3BhY2VcbiAgICAgIH0pO1xuICAgICAga2V5cyA9IFt7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLmFjY291bnRQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgICB9XTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIGtleXMsXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG59XG5TeXN0ZW1Qcm9ncmFtLnByb2dyYW1JZCA9IG5ldyBQdWJsaWNLZXkoJzExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG5cbi8vIEtlZXAgcHJvZ3JhbSBjaHVua3MgdW5kZXIgUEFDS0VUX0RBVEFfU0laRSwgbGVhdmluZyBlbm91Z2ggcm9vbSBmb3IgdGhlXG4vLyByZXN0IG9mIHRoZSBUcmFuc2FjdGlvbiBmaWVsZHNcbi8vXG4vLyBUT0RPOiByZXBsYWNlIDMwMCB3aXRoIGEgcHJvcGVyIGNvbnN0YW50IGZvciB0aGUgc2l6ZSBvZiB0aGUgb3RoZXJcbi8vIFRyYW5zYWN0aW9uIGZpZWxkc1xuY29uc3QgQ0hVTktfU0laRSA9IFBBQ0tFVF9EQVRBX1NJWkUgLSAzMDA7XG5cbi8qKlxuICogUHJvZ3JhbSBsb2FkZXIgaW50ZXJmYWNlXG4gKi9cbmNsYXNzIExvYWRlciB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQW1vdW50IG9mIHByb2dyYW0gZGF0YSBwbGFjZWQgaW4gZWFjaCBsb2FkIFRyYW5zYWN0aW9uXG4gICAqL1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIG51bWJlciBvZiBzaWduYXR1cmVzIHJlcXVpcmVkIHRvIGxvYWQgYSBwcm9ncmFtIG5vdCBpbmNsdWRpbmdcbiAgICogcmV0cmllc1xuICAgKlxuICAgKiBDYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgdHJhbnNhY3Rpb24gZmVlc1xuICAgKi9cbiAgc3RhdGljIGdldE1pbk51bVNpZ25hdHVyZXMoZGF0YUxlbmd0aCkge1xuICAgIHJldHVybiAyICogKFxuICAgIC8vIEV2ZXJ5IHRyYW5zYWN0aW9uIHJlcXVpcmVzIHR3byBzaWduYXR1cmVzIChwYXllciArIHByb2dyYW0pXG4gICAgTWF0aC5jZWlsKGRhdGFMZW5ndGggLyBMb2FkZXIuY2h1bmtTaXplKSArIDEgK1xuICAgIC8vIEFkZCBvbmUgZm9yIENyZWF0ZSB0cmFuc2FjdGlvblxuICAgIDEpIC8vIEFkZCBvbmUgZm9yIEZpbmFsaXplIHRyYW5zYWN0aW9uXG4gICAgO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgZ2VuZXJpYyBwcm9ncmFtXG4gICAqXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIHVzZVxuICAgKiBAcGFyYW0gcGF5ZXIgU3lzdGVtIGFjY291bnQgdGhhdCBwYXlzIHRvIGxvYWQgdGhlIHByb2dyYW1cbiAgICogQHBhcmFtIHByb2dyYW0gQWNjb3VudCB0byBsb2FkIHRoZSBwcm9ncmFtIGludG9cbiAgICogQHBhcmFtIHByb2dyYW1JZCBQdWJsaWMga2V5IHRoYXQgaWRlbnRpZmllcyB0aGUgbG9hZGVyXG4gICAqIEBwYXJhbSBkYXRhIFByb2dyYW0gb2N0ZXRzXG4gICAqIEByZXR1cm4gdHJ1ZSBpZiBwcm9ncmFtIHdhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5LCBmYWxzZSBpZiBwcm9ncmFtIHdhcyBhbHJlYWR5IGxvYWRlZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGxvYWQoY29ubmVjdGlvbiwgcGF5ZXIsIHByb2dyYW0sIHByb2dyYW1JZCwgZGF0YSkge1xuICAgIHtcbiAgICAgIGNvbnN0IGJhbGFuY2VOZWVkZWQgPSBhd2FpdCBjb25uZWN0aW9uLmdldE1pbmltdW1CYWxhbmNlRm9yUmVudEV4ZW1wdGlvbihkYXRhLmxlbmd0aCk7XG5cbiAgICAgIC8vIEZldGNoIHByb2dyYW0gYWNjb3VudCBpbmZvIHRvIGNoZWNrIGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZFxuICAgICAgY29uc3QgcHJvZ3JhbUluZm8gPSBhd2FpdCBjb25uZWN0aW9uLmdldEFjY291bnRJbmZvKHByb2dyYW0ucHVibGljS2V5LCAnY29uZmlybWVkJyk7XG4gICAgICBsZXQgdHJhbnNhY3Rpb24gPSBudWxsO1xuICAgICAgaWYgKHByb2dyYW1JbmZvICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChwcm9ncmFtSW5mby5leGVjdXRhYmxlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUHJvZ3JhbSBsb2FkIGZhaWxlZCwgYWNjb3VudCBpcyBhbHJlYWR5IGV4ZWN1dGFibGUnKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1JbmZvLmRhdGEubGVuZ3RoICE9PSBkYXRhLmxlbmd0aCkge1xuICAgICAgICAgIHRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24gfHwgbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uYWRkKFN5c3RlbVByb2dyYW0uYWxsb2NhdGUoe1xuICAgICAgICAgICAgYWNjb3VudFB1YmtleTogcHJvZ3JhbS5wdWJsaWNLZXksXG4gICAgICAgICAgICBzcGFjZTogZGF0YS5sZW5ndGhcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcm9ncmFtSW5mby5vd25lci5lcXVhbHMocHJvZ3JhbUlkKSkge1xuICAgICAgICAgIHRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24gfHwgbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgICAgICAgdHJhbnNhY3Rpb24uYWRkKFN5c3RlbVByb2dyYW0uYXNzaWduKHtcbiAgICAgICAgICAgIGFjY291bnRQdWJrZXk6IHByb2dyYW0ucHVibGljS2V5LFxuICAgICAgICAgICAgcHJvZ3JhbUlkXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtSW5mby5sYW1wb3J0cyA8IGJhbGFuY2VOZWVkZWQpIHtcbiAgICAgICAgICB0cmFuc2FjdGlvbiA9IHRyYW5zYWN0aW9uIHx8IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgICAgICAgIHRyYW5zYWN0aW9uLmFkZChTeXN0ZW1Qcm9ncmFtLnRyYW5zZmVyKHtcbiAgICAgICAgICAgIGZyb21QdWJrZXk6IHBheWVyLnB1YmxpY0tleSxcbiAgICAgICAgICAgIHRvUHVia2V5OiBwcm9ncmFtLnB1YmxpY0tleSxcbiAgICAgICAgICAgIGxhbXBvcnRzOiBiYWxhbmNlTmVlZGVkIC0gcHJvZ3JhbUluZm8ubGFtcG9ydHNcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKFN5c3RlbVByb2dyYW0uY3JlYXRlQWNjb3VudCh7XG4gICAgICAgICAgZnJvbVB1YmtleTogcGF5ZXIucHVibGljS2V5LFxuICAgICAgICAgIG5ld0FjY291bnRQdWJrZXk6IHByb2dyYW0ucHVibGljS2V5LFxuICAgICAgICAgIGxhbXBvcnRzOiBiYWxhbmNlTmVlZGVkID4gMCA/IGJhbGFuY2VOZWVkZWQgOiAxLFxuICAgICAgICAgIHNwYWNlOiBkYXRhLmxlbmd0aCxcbiAgICAgICAgICBwcm9ncmFtSWRcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgYWNjb3VudCBpcyBhbHJlYWR5IGNyZWF0ZWQgY29ycmVjdGx5LCBza2lwIHRoaXMgc3RlcFxuICAgICAgLy8gYW5kIHByb2NlZWQgZGlyZWN0bHkgdG8gbG9hZGluZyBpbnN0cnVjdGlvbnNcbiAgICAgIGlmICh0cmFuc2FjdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBhd2FpdCBzZW5kQW5kQ29uZmlybVRyYW5zYWN0aW9uKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLCBbcGF5ZXIsIHByb2dyYW1dLCB7XG4gICAgICAgICAgY29tbWl0bWVudDogJ2NvbmZpcm1lZCdcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGRhdGFMYXlvdXQgPSBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpLCBCdWZmZXJMYXlvdXQudTMyKCdvZmZzZXQnKSwgQnVmZmVyTGF5b3V0LnUzMignYnl0ZXNMZW5ndGgnKSwgQnVmZmVyTGF5b3V0LnUzMignYnl0ZXNMZW5ndGhQYWRkaW5nJyksIEJ1ZmZlckxheW91dC5zZXEoQnVmZmVyTGF5b3V0LnU4KCdieXRlJyksIEJ1ZmZlckxheW91dC5vZmZzZXQoQnVmZmVyTGF5b3V0LnUzMigpLCAtOCksICdieXRlcycpXSk7XG4gICAgY29uc3QgY2h1bmtTaXplID0gTG9hZGVyLmNodW5rU2l6ZTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBsZXQgYXJyYXkgPSBkYXRhO1xuICAgIGxldCB0cmFuc2FjdGlvbnMgPSBbXTtcbiAgICB3aGlsZSAoYXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgYnl0ZXMgPSBhcnJheS5zbGljZSgwLCBjaHVua1NpemUpO1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyhjaHVua1NpemUgKyAxNik7XG4gICAgICBkYXRhTGF5b3V0LmVuY29kZSh7XG4gICAgICAgIGluc3RydWN0aW9uOiAwLFxuICAgICAgICAvLyBMb2FkIGluc3RydWN0aW9uXG4gICAgICAgIG9mZnNldCxcbiAgICAgICAgYnl0ZXM6IGJ5dGVzLFxuICAgICAgICBieXRlc0xlbmd0aDogMCxcbiAgICAgICAgYnl0ZXNMZW5ndGhQYWRkaW5nOiAwXG4gICAgICB9LCBkYXRhKTtcbiAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKHtcbiAgICAgICAga2V5czogW3tcbiAgICAgICAgICBwdWJrZXk6IHByb2dyYW0ucHVibGljS2V5LFxuICAgICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICAgICAgfV0sXG4gICAgICAgIHByb2dyYW1JZCxcbiAgICAgICAgZGF0YVxuICAgICAgfSk7XG4gICAgICB0cmFuc2FjdGlvbnMucHVzaChzZW5kQW5kQ29uZmlybVRyYW5zYWN0aW9uKGNvbm5lY3Rpb24sIHRyYW5zYWN0aW9uLCBbcGF5ZXIsIHByb2dyYW1dLCB7XG4gICAgICAgIGNvbW1pdG1lbnQ6ICdjb25maXJtZWQnXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIERlbGF5IGJldHdlZW4gc2VuZHMgaW4gYW4gYXR0ZW1wdCB0byByZWR1Y2UgcmF0ZSBsaW1pdCBlcnJvcnNcbiAgICAgIGlmIChjb25uZWN0aW9uLl9ycGNFbmRwb2ludC5pbmNsdWRlcygnc29sYW5hLmNvbScpKSB7XG4gICAgICAgIGNvbnN0IFJFUVVFU1RTX1BFUl9TRUNPTkQgPSA0O1xuICAgICAgICBhd2FpdCBzbGVlcCgxMDAwIC8gUkVRVUVTVFNfUEVSX1NFQ09ORCk7XG4gICAgICB9XG4gICAgICBvZmZzZXQgKz0gY2h1bmtTaXplO1xuICAgICAgYXJyYXkgPSBhcnJheS5zbGljZShjaHVua1NpemUpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbCh0cmFuc2FjdGlvbnMpO1xuXG4gICAgLy8gRmluYWxpemUgdGhlIGFjY291bnQgbG9hZGVkIHdpdGggcHJvZ3JhbSBkYXRhIGZvciBleGVjdXRpb25cbiAgICB7XG4gICAgICBjb25zdCBkYXRhTGF5b3V0ID0gQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnUzMignaW5zdHJ1Y3Rpb24nKV0pO1xuICAgICAgY29uc3QgZGF0YSA9IEJ1ZmZlci5hbGxvYyhkYXRhTGF5b3V0LnNwYW4pO1xuICAgICAgZGF0YUxheW91dC5lbmNvZGUoe1xuICAgICAgICBpbnN0cnVjdGlvbjogMSAvLyBGaW5hbGl6ZSBpbnN0cnVjdGlvblxuICAgICAgfSwgZGF0YSk7XG4gICAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpLmFkZCh7XG4gICAgICAgIGtleXM6IFt7XG4gICAgICAgICAgcHVia2V5OiBwcm9ncmFtLnB1YmxpY0tleSxcbiAgICAgICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgICAgIH0sIHtcbiAgICAgICAgICBwdWJrZXk6IFNZU1ZBUl9SRU5UX1BVQktFWSxcbiAgICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICAgICAgfV0sXG4gICAgICAgIHByb2dyYW1JZCxcbiAgICAgICAgZGF0YVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkZXBsb3lDb21taXRtZW50ID0gJ3Byb2Nlc3NlZCc7XG4gICAgICBjb25zdCBmaW5hbGl6ZVNpZ25hdHVyZSA9IGF3YWl0IGNvbm5lY3Rpb24uc2VuZFRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uLCBbcGF5ZXIsIHByb2dyYW1dLCB7XG4gICAgICAgIHByZWZsaWdodENvbW1pdG1lbnQ6IGRlcGxveUNvbW1pdG1lbnRcbiAgICAgIH0pO1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb250ZXh0LFxuICAgICAgICB2YWx1ZVxuICAgICAgfSA9IGF3YWl0IGNvbm5lY3Rpb24uY29uZmlybVRyYW5zYWN0aW9uKHtcbiAgICAgICAgc2lnbmF0dXJlOiBmaW5hbGl6ZVNpZ25hdHVyZSxcbiAgICAgICAgbGFzdFZhbGlkQmxvY2tIZWlnaHQ6IHRyYW5zYWN0aW9uLmxhc3RWYWxpZEJsb2NrSGVpZ2h0LFxuICAgICAgICBibG9ja2hhc2g6IHRyYW5zYWN0aW9uLnJlY2VudEJsb2NraGFzaFxuICAgICAgfSwgZGVwbG95Q29tbWl0bWVudCk7XG4gICAgICBpZiAodmFsdWUuZXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJhbnNhY3Rpb24gJHtmaW5hbGl6ZVNpZ25hdHVyZX0gZmFpbGVkICgke0pTT04uc3RyaW5naWZ5KHZhbHVlKX0pYCk7XG4gICAgICB9XG4gICAgICAvLyBXZSBwcmV2ZW50IHByb2dyYW1zIGZyb20gYmVpbmcgdXNhYmxlIHVudGlsIHRoZSBzbG90IGFmdGVyIHRoZWlyIGRlcGxveW1lbnQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NvbGFuYS1sYWJzL3NvbGFuYS9wdWxsLzI5NjU0XG4gICAgICB3aGlsZSAodHJ1ZSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnN0YW50LWNvbmRpdGlvblxuICAgICAgKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFNsb3QgPSBhd2FpdCBjb25uZWN0aW9uLmdldFNsb3Qoe1xuICAgICAgICAgICAgY29tbWl0bWVudDogZGVwbG95Q29tbWl0bWVudFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChjdXJyZW50U2xvdCA+IGNvbnRleHQuc2xvdCkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvKiBlbXB0eSAqL1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBNYXRoLnJvdW5kKE1TX1BFUl9TTE9UIC8gMikpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzdWNjZXNzXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbkxvYWRlci5jaHVua1NpemUgPSBDSFVOS19TSVpFO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgc2luY2UgU29sYW5hIHYxLjE3LjIwLlxuICovXG5jb25zdCBCUEZfTE9BREVSX1BST0dSQU1fSUQgPSBuZXcgUHVibGljS2V5KCdCUEZMb2FkZXIyMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG5cbi8qKlxuICogRmFjdG9yeSBjbGFzcyBmb3IgdHJhbnNhY3Rpb25zIHRvIGludGVyYWN0IHdpdGggYSBwcm9ncmFtIGxvYWRlclxuICpcbiAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgc2luY2UgU29sYW5hIHYxLjE3LjIwLlxuICovXG5jbGFzcyBCcGZMb2FkZXIge1xuICAvKipcbiAgICogTWluaW11bSBudW1iZXIgb2Ygc2lnbmF0dXJlcyByZXF1aXJlZCB0byBsb2FkIGEgcHJvZ3JhbSBub3QgaW5jbHVkaW5nXG4gICAqIHJldHJpZXNcbiAgICpcbiAgICogQ2FuIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRyYW5zYWN0aW9uIGZlZXNcbiAgICovXG4gIHN0YXRpYyBnZXRNaW5OdW1TaWduYXR1cmVzKGRhdGFMZW5ndGgpIHtcbiAgICByZXR1cm4gTG9hZGVyLmdldE1pbk51bVNpZ25hdHVyZXMoZGF0YUxlbmd0aCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIFNCRiBwcm9ncmFtXG4gICAqXG4gICAqIEBwYXJhbSBjb25uZWN0aW9uIFRoZSBjb25uZWN0aW9uIHRvIHVzZVxuICAgKiBAcGFyYW0gcGF5ZXIgQWNjb3VudCB0aGF0IHdpbGwgcGF5IHByb2dyYW0gbG9hZGluZyBmZWVzXG4gICAqIEBwYXJhbSBwcm9ncmFtIEFjY291bnQgdG8gbG9hZCB0aGUgcHJvZ3JhbSBpbnRvXG4gICAqIEBwYXJhbSBlbGYgVGhlIGVudGlyZSBFTEYgY29udGFpbmluZyB0aGUgU0JGIHByb2dyYW1cbiAgICogQHBhcmFtIGxvYWRlclByb2dyYW1JZCBUaGUgcHJvZ3JhbSBpZCBvZiB0aGUgQlBGIGxvYWRlciB0byB1c2VcbiAgICogQHJldHVybiB0cnVlIGlmIHByb2dyYW0gd2FzIGxvYWRlZCBzdWNjZXNzZnVsbHksIGZhbHNlIGlmIHByb2dyYW0gd2FzIGFscmVhZHkgbG9hZGVkXG4gICAqL1xuICBzdGF0aWMgbG9hZChjb25uZWN0aW9uLCBwYXllciwgcHJvZ3JhbSwgZWxmLCBsb2FkZXJQcm9ncmFtSWQpIHtcbiAgICByZXR1cm4gTG9hZGVyLmxvYWQoY29ubmVjdGlvbiwgcGF5ZXIsIHByb2dyYW0sIGxvYWRlclByb2dyYW1JZCwgZWxmKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyAoeCkge1xuXHRyZXR1cm4geCAmJiB4Ll9fZXNNb2R1bGUgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHgsICdkZWZhdWx0JykgPyB4WydkZWZhdWx0J10gOiB4O1xufVxuXG52YXIgZmFzdFN0YWJsZVN0cmluZ2lmeSQxO1xudmFyIGhhc1JlcXVpcmVkRmFzdFN0YWJsZVN0cmluZ2lmeTtcblxuZnVuY3Rpb24gcmVxdWlyZUZhc3RTdGFibGVTdHJpbmdpZnkgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRGYXN0U3RhYmxlU3RyaW5naWZ5KSByZXR1cm4gZmFzdFN0YWJsZVN0cmluZ2lmeSQxO1xuXHRoYXNSZXF1aXJlZEZhc3RTdGFibGVTdHJpbmdpZnkgPSAxO1xuXHR2YXIgb2JqVG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXHR2YXIgb2JqS2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uKG9iaikge1xuXHRcdFx0dmFyIGtleXMgPSBbXTtcblx0XHRcdGZvciAodmFyIG5hbWUgaW4gb2JqKSB7XG5cdFx0XHRcdGtleXMucHVzaChuYW1lKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBrZXlzO1xuXHRcdH07XG5cblx0ZnVuY3Rpb24gc3RyaW5naWZ5KHZhbCwgaXNBcnJheVByb3ApIHtcblx0XHR2YXIgaSwgbWF4LCBzdHIsIGtleXMsIGtleSwgcHJvcFZhbCwgdG9TdHI7XG5cdFx0aWYgKHZhbCA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIFwidHJ1ZVwiO1xuXHRcdH1cblx0XHRpZiAodmFsID09PSBmYWxzZSkge1xuXHRcdFx0cmV0dXJuIFwiZmFsc2VcIjtcblx0XHR9XG5cdFx0c3dpdGNoICh0eXBlb2YgdmFsKSB7XG5cdFx0XHRjYXNlIFwib2JqZWN0XCI6XG5cdFx0XHRcdGlmICh2YWwgPT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdFx0fSBlbHNlIGlmICh2YWwudG9KU09OICYmIHR5cGVvZiB2YWwudG9KU09OID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RyaW5naWZ5KHZhbC50b0pTT04oKSwgaXNBcnJheVByb3ApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRvU3RyID0gb2JqVG9TdHJpbmcuY2FsbCh2YWwpO1xuXHRcdFx0XHRcdGlmICh0b1N0ciA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG5cdFx0XHRcdFx0XHRzdHIgPSAnWyc7XG5cdFx0XHRcdFx0XHRtYXggPSB2YWwubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdGZvcihpID0gMDsgaSA8IG1heDsgaSsrKSB7XG5cdFx0XHRcdFx0XHRcdHN0ciArPSBzdHJpbmdpZnkodmFsW2ldLCB0cnVlKSArICcsJztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGlmIChtYXggPiAtMSkge1xuXHRcdFx0XHRcdFx0XHRzdHIgKz0gc3RyaW5naWZ5KHZhbFtpXSwgdHJ1ZSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRyZXR1cm4gc3RyICsgJ10nO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodG9TdHIgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcblx0XHRcdFx0XHRcdC8vIG9ubHkgb2JqZWN0IGlzIGxlZnRcblx0XHRcdFx0XHRcdGtleXMgPSBvYmpLZXlzKHZhbCkuc29ydCgpO1xuXHRcdFx0XHRcdFx0bWF4ID0ga2V5cy5sZW5ndGg7XG5cdFx0XHRcdFx0XHRzdHIgPSBcIlwiO1xuXHRcdFx0XHRcdFx0aSA9IDA7XG5cdFx0XHRcdFx0XHR3aGlsZSAoaSA8IG1heCkge1xuXHRcdFx0XHRcdFx0XHRrZXkgPSBrZXlzW2ldO1xuXHRcdFx0XHRcdFx0XHRwcm9wVmFsID0gc3RyaW5naWZ5KHZhbFtrZXldLCBmYWxzZSk7XG5cdFx0XHRcdFx0XHRcdGlmIChwcm9wVmFsICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc3RyKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRzdHIgKz0gJywnO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRzdHIgKz0gSlNPTi5zdHJpbmdpZnkoa2V5KSArICc6JyArIHByb3BWYWw7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0aSsrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0cmV0dXJuICd7JyArIHN0ciArICd9Jztcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRjYXNlIFwiZnVuY3Rpb25cIjpcblx0XHRcdGNhc2UgXCJ1bmRlZmluZWRcIjpcblx0XHRcdFx0cmV0dXJuIGlzQXJyYXlQcm9wID8gbnVsbCA6IHVuZGVmaW5lZDtcblx0XHRcdGNhc2UgXCJzdHJpbmdcIjpcblx0XHRcdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gaXNGaW5pdGUodmFsKSA/IHZhbCA6IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0ZmFzdFN0YWJsZVN0cmluZ2lmeSQxID0gZnVuY3Rpb24odmFsKSB7XG5cdFx0dmFyIHJldHVyblZhbCA9IHN0cmluZ2lmeSh2YWwsIGZhbHNlKTtcblx0XHRpZiAocmV0dXJuVmFsICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiAnJysgcmV0dXJuVmFsO1xuXHRcdH1cblx0fTtcblx0cmV0dXJuIGZhc3RTdGFibGVTdHJpbmdpZnkkMTtcbn1cblxudmFyIGZhc3RTdGFibGVTdHJpbmdpZnlFeHBvcnRzID0gLypAX19QVVJFX18qLyByZXF1aXJlRmFzdFN0YWJsZVN0cmluZ2lmeSgpO1xudmFyIGZhc3RTdGFibGVTdHJpbmdpZnkgPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMoZmFzdFN0YWJsZVN0cmluZ2lmeUV4cG9ydHMpO1xuXG5jb25zdCBNSU5JTVVNX1NMT1RfUEVSX0VQT0NIID0gMzI7XG5cbi8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvcyBpbiB0aGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHNlbGYuXG5mdW5jdGlvbiB0cmFpbGluZ1plcm9zKG4pIHtcbiAgbGV0IHRyYWlsaW5nWmVyb3MgPSAwO1xuICB3aGlsZSAobiA+IDEpIHtcbiAgICBuIC89IDI7XG4gICAgdHJhaWxpbmdaZXJvcysrO1xuICB9XG4gIHJldHVybiB0cmFpbGluZ1plcm9zO1xufVxuXG4vLyBSZXR1cm5zIHRoZSBzbWFsbGVzdCBwb3dlciBvZiB0d28gZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG5cbmZ1bmN0aW9uIG5leHRQb3dlck9mVHdvKG4pIHtcbiAgaWYgKG4gPT09IDApIHJldHVybiAxO1xuICBuLS07XG4gIG4gfD0gbiA+PiAxO1xuICBuIHw9IG4gPj4gMjtcbiAgbiB8PSBuID4+IDQ7XG4gIG4gfD0gbiA+PiA4O1xuICBuIHw9IG4gPj4gMTY7XG4gIG4gfD0gbiA+PiAzMjtcbiAgcmV0dXJuIG4gKyAxO1xufVxuXG4vKipcbiAqIEVwb2NoIHNjaGVkdWxlXG4gKiAoc2VlIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL3Rlcm1pbm9sb2d5I2Vwb2NoKVxuICogQ2FuIGJlIHJldHJpZXZlZCB3aXRoIHRoZSB7QGxpbmsgQ29ubmVjdGlvbi5nZXRFcG9jaFNjaGVkdWxlfSBtZXRob2RcbiAqL1xuY2xhc3MgRXBvY2hTY2hlZHVsZSB7XG4gIGNvbnN0cnVjdG9yKHNsb3RzUGVyRXBvY2gsIGxlYWRlclNjaGVkdWxlU2xvdE9mZnNldCwgd2FybXVwLCBmaXJzdE5vcm1hbEVwb2NoLCBmaXJzdE5vcm1hbFNsb3QpIHtcbiAgICAvKiogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNsb3RzIGluIGVhY2ggZXBvY2ggKi9cbiAgICB0aGlzLnNsb3RzUGVyRXBvY2ggPSB2b2lkIDA7XG4gICAgLyoqIFRoZSBudW1iZXIgb2Ygc2xvdHMgYmVmb3JlIGJlZ2lubmluZyBvZiBhbiBlcG9jaCB0byBjYWxjdWxhdGUgYSBsZWFkZXIgc2NoZWR1bGUgZm9yIHRoYXQgZXBvY2ggKi9cbiAgICB0aGlzLmxlYWRlclNjaGVkdWxlU2xvdE9mZnNldCA9IHZvaWQgMDtcbiAgICAvKiogSW5kaWNhdGVzIHdoZXRoZXIgZXBvY2hzIHN0YXJ0IHNob3J0IGFuZCBncm93ICovXG4gICAgdGhpcy53YXJtdXAgPSB2b2lkIDA7XG4gICAgLyoqIFRoZSBmaXJzdCBlcG9jaCB3aXRoIGBzbG90c1BlckVwb2NoYCBzbG90cyAqL1xuICAgIHRoaXMuZmlyc3ROb3JtYWxFcG9jaCA9IHZvaWQgMDtcbiAgICAvKiogVGhlIGZpcnN0IHNsb3Qgb2YgYGZpcnN0Tm9ybWFsRXBvY2hgICovXG4gICAgdGhpcy5maXJzdE5vcm1hbFNsb3QgPSB2b2lkIDA7XG4gICAgdGhpcy5zbG90c1BlckVwb2NoID0gc2xvdHNQZXJFcG9jaDtcbiAgICB0aGlzLmxlYWRlclNjaGVkdWxlU2xvdE9mZnNldCA9IGxlYWRlclNjaGVkdWxlU2xvdE9mZnNldDtcbiAgICB0aGlzLndhcm11cCA9IHdhcm11cDtcbiAgICB0aGlzLmZpcnN0Tm9ybWFsRXBvY2ggPSBmaXJzdE5vcm1hbEVwb2NoO1xuICAgIHRoaXMuZmlyc3ROb3JtYWxTbG90ID0gZmlyc3ROb3JtYWxTbG90O1xuICB9XG4gIGdldEVwb2NoKHNsb3QpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRFcG9jaEFuZFNsb3RJbmRleChzbG90KVswXTtcbiAgfVxuICBnZXRFcG9jaEFuZFNsb3RJbmRleChzbG90KSB7XG4gICAgaWYgKHNsb3QgPCB0aGlzLmZpcnN0Tm9ybWFsU2xvdCkge1xuICAgICAgY29uc3QgZXBvY2ggPSB0cmFpbGluZ1plcm9zKG5leHRQb3dlck9mVHdvKHNsb3QgKyBNSU5JTVVNX1NMT1RfUEVSX0VQT0NIICsgMSkpIC0gdHJhaWxpbmdaZXJvcyhNSU5JTVVNX1NMT1RfUEVSX0VQT0NIKSAtIDE7XG4gICAgICBjb25zdCBlcG9jaExlbiA9IHRoaXMuZ2V0U2xvdHNJbkVwb2NoKGVwb2NoKTtcbiAgICAgIGNvbnN0IHNsb3RJbmRleCA9IHNsb3QgLSAoZXBvY2hMZW4gLSBNSU5JTVVNX1NMT1RfUEVSX0VQT0NIKTtcbiAgICAgIHJldHVybiBbZXBvY2gsIHNsb3RJbmRleF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5vcm1hbFNsb3RJbmRleCA9IHNsb3QgLSB0aGlzLmZpcnN0Tm9ybWFsU2xvdDtcbiAgICAgIGNvbnN0IG5vcm1hbEVwb2NoSW5kZXggPSBNYXRoLmZsb29yKG5vcm1hbFNsb3RJbmRleCAvIHRoaXMuc2xvdHNQZXJFcG9jaCk7XG4gICAgICBjb25zdCBlcG9jaCA9IHRoaXMuZmlyc3ROb3JtYWxFcG9jaCArIG5vcm1hbEVwb2NoSW5kZXg7XG4gICAgICBjb25zdCBzbG90SW5kZXggPSBub3JtYWxTbG90SW5kZXggJSB0aGlzLnNsb3RzUGVyRXBvY2g7XG4gICAgICByZXR1cm4gW2Vwb2NoLCBzbG90SW5kZXhdO1xuICAgIH1cbiAgfVxuICBnZXRGaXJzdFNsb3RJbkVwb2NoKGVwb2NoKSB7XG4gICAgaWYgKGVwb2NoIDw9IHRoaXMuZmlyc3ROb3JtYWxFcG9jaCkge1xuICAgICAgcmV0dXJuIChNYXRoLnBvdygyLCBlcG9jaCkgLSAxKSAqIE1JTklNVU1fU0xPVF9QRVJfRVBPQ0g7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAoZXBvY2ggLSB0aGlzLmZpcnN0Tm9ybWFsRXBvY2gpICogdGhpcy5zbG90c1BlckVwb2NoICsgdGhpcy5maXJzdE5vcm1hbFNsb3Q7XG4gICAgfVxuICB9XG4gIGdldExhc3RTbG90SW5FcG9jaChlcG9jaCkge1xuICAgIHJldHVybiB0aGlzLmdldEZpcnN0U2xvdEluRXBvY2goZXBvY2gpICsgdGhpcy5nZXRTbG90c0luRXBvY2goZXBvY2gpIC0gMTtcbiAgfVxuICBnZXRTbG90c0luRXBvY2goZXBvY2gpIHtcbiAgICBpZiAoZXBvY2ggPCB0aGlzLmZpcnN0Tm9ybWFsRXBvY2gpIHtcbiAgICAgIHJldHVybiBNYXRoLnBvdygyLCBlcG9jaCArIHRyYWlsaW5nWmVyb3MoTUlOSU1VTV9TTE9UX1BFUl9FUE9DSCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5zbG90c1BlckVwb2NoO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZmV0Y2hJbXBsID0gZ2xvYmFsVGhpcy5mZXRjaDtcblxuY2xhc3MgUnBjV2ViU29ja2V0Q2xpZW50IGV4dGVuZHMgQ29tbW9uQ2xpZW50IHtcbiAgY29uc3RydWN0b3IoYWRkcmVzcywgb3B0aW9ucywgZ2VuZXJhdGVfcmVxdWVzdF9pZCkge1xuICAgIGNvbnN0IHdlYlNvY2tldEZhY3RvcnkgPSB1cmwgPT4ge1xuICAgICAgY29uc3QgcnBjID0gV2ViU29ja2V0KHVybCwge1xuICAgICAgICBhdXRvY29ubmVjdDogdHJ1ZSxcbiAgICAgICAgbWF4X3JlY29ubmVjdHM6IDUsXG4gICAgICAgIHJlY29ubmVjdDogdHJ1ZSxcbiAgICAgICAgcmVjb25uZWN0X2ludGVydmFsOiAxMDAwLFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgICB9KTtcbiAgICAgIGlmICgnc29ja2V0JyBpbiBycGMpIHtcbiAgICAgICAgdGhpcy51bmRlcmx5aW5nU29ja2V0ID0gcnBjLnNvY2tldDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudW5kZXJseWluZ1NvY2tldCA9IHJwYztcbiAgICAgIH1cbiAgICAgIHJldHVybiBycGM7XG4gICAgfTtcbiAgICBzdXBlcih3ZWJTb2NrZXRGYWN0b3J5LCBhZGRyZXNzLCBvcHRpb25zLCBnZW5lcmF0ZV9yZXF1ZXN0X2lkKTtcbiAgICB0aGlzLnVuZGVybHlpbmdTb2NrZXQgPSB2b2lkIDA7XG4gIH1cbiAgY2FsbCguLi5hcmdzKSB7XG4gICAgY29uc3QgcmVhZHlTdGF0ZSA9IHRoaXMudW5kZXJseWluZ1NvY2tldD8ucmVhZHlTdGF0ZTtcbiAgICBpZiAocmVhZHlTdGF0ZSA9PT0gMSAvKiBXZWJTb2NrZXQuT1BFTiAqLykge1xuICAgICAgcmV0dXJuIHN1cGVyLmNhbGwoLi4uYXJncyk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1RyaWVkIHRvIGNhbGwgYSBKU09OLVJQQyBtZXRob2QgYCcgKyBhcmdzWzBdICsgJ2AgYnV0IHRoZSBzb2NrZXQgd2FzIG5vdCBgQ09OTkVDVElOR2Agb3IgYE9QRU5gIChgcmVhZHlTdGF0ZWAgd2FzICcgKyByZWFkeVN0YXRlICsgJyknKSk7XG4gIH1cbiAgbm90aWZ5KC4uLmFyZ3MpIHtcbiAgICBjb25zdCByZWFkeVN0YXRlID0gdGhpcy51bmRlcmx5aW5nU29ja2V0Py5yZWFkeVN0YXRlO1xuICAgIGlmIChyZWFkeVN0YXRlID09PSAxIC8qIFdlYlNvY2tldC5PUEVOICovKSB7XG4gICAgICByZXR1cm4gc3VwZXIubm90aWZ5KC4uLmFyZ3MpO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdUcmllZCB0byBzZW5kIGEgSlNPTi1SUEMgbm90aWZpY2F0aW9uIGAnICsgYXJnc1swXSArICdgIGJ1dCB0aGUgc29ja2V0IHdhcyBub3QgYENPTk5FQ1RJTkdgIG9yIGBPUEVOYCAoYHJlYWR5U3RhdGVgIHdhcyAnICsgcmVhZHlTdGF0ZSArICcpJykpO1xuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cblxuLyoqXG4gKiBEZWNvZGUgYWNjb3VudCBkYXRhIGJ1ZmZlciB1c2luZyBhbiBBY2NvdW50VHlwZVxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGRlY29kZURhdGEodHlwZSwgZGF0YSkge1xuICBsZXQgZGVjb2RlZDtcbiAgdHJ5IHtcbiAgICBkZWNvZGVkID0gdHlwZS5sYXlvdXQuZGVjb2RlKGRhdGEpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5zdHJ1Y3Rpb247ICcgKyBlcnIpO1xuICB9XG4gIGlmIChkZWNvZGVkLnR5cGVJbmRleCAhPT0gdHlwZS5pbmRleCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBhY2NvdW50IGRhdGE7IGFjY291bnQgdHlwZSBtaXNtYXRjaCAke2RlY29kZWQudHlwZUluZGV4fSAhPSAke3R5cGUuaW5kZXh9YCk7XG4gIH1cbiAgcmV0dXJuIGRlY29kZWQ7XG59XG5cbi8vLyBUaGUgc2VyaWFsaXplZCBzaXplIG9mIGxvb2t1cCB0YWJsZSBtZXRhZGF0YVxuY29uc3QgTE9PS1VQX1RBQkxFX01FVEFfU0laRSA9IDU2O1xuY2xhc3MgQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCB7XG4gIGNvbnN0cnVjdG9yKGFyZ3MpIHtcbiAgICB0aGlzLmtleSA9IHZvaWQgMDtcbiAgICB0aGlzLnN0YXRlID0gdm9pZCAwO1xuICAgIHRoaXMua2V5ID0gYXJncy5rZXk7XG4gICAgdGhpcy5zdGF0ZSA9IGFyZ3Muc3RhdGU7XG4gIH1cbiAgaXNBY3RpdmUoKSB7XG4gICAgY29uc3QgVTY0X01BWCA9IEJpZ0ludCgnMHhmZmZmZmZmZmZmZmZmZmZmJyk7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUuZGVhY3RpdmF0aW9uU2xvdCA9PT0gVTY0X01BWDtcbiAgfVxuICBzdGF0aWMgZGVzZXJpYWxpemUoYWNjb3VudERhdGEpIHtcbiAgICBjb25zdCBtZXRhID0gZGVjb2RlRGF0YShMb29rdXBUYWJsZU1ldGFMYXlvdXQsIGFjY291bnREYXRhKTtcbiAgICBjb25zdCBzZXJpYWxpemVkQWRkcmVzc2VzTGVuID0gYWNjb3VudERhdGEubGVuZ3RoIC0gTE9PS1VQX1RBQkxFX01FVEFfU0laRTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEFkZHJlc3Nlc0xlbiA+PSAwLCAnbG9va3VwIHRhYmxlIGlzIGludmFsaWQnKTtcbiAgICBhc3NlcnQoc2VyaWFsaXplZEFkZHJlc3Nlc0xlbiAlIDMyID09PSAwLCAnbG9va3VwIHRhYmxlIGlzIGludmFsaWQnKTtcbiAgICBjb25zdCBudW1TZXJpYWxpemVkQWRkcmVzc2VzID0gc2VyaWFsaXplZEFkZHJlc3Nlc0xlbiAvIDMyO1xuICAgIGNvbnN0IHtcbiAgICAgIGFkZHJlc3Nlc1xuICAgIH0gPSBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQuc2VxKHB1YmxpY0tleSgpLCBudW1TZXJpYWxpemVkQWRkcmVzc2VzLCAnYWRkcmVzc2VzJyldKS5kZWNvZGUoYWNjb3VudERhdGEuc2xpY2UoTE9PS1VQX1RBQkxFX01FVEFfU0laRSkpO1xuICAgIHJldHVybiB7XG4gICAgICBkZWFjdGl2YXRpb25TbG90OiBtZXRhLmRlYWN0aXZhdGlvblNsb3QsXG4gICAgICBsYXN0RXh0ZW5kZWRTbG90OiBtZXRhLmxhc3RFeHRlbmRlZFNsb3QsXG4gICAgICBsYXN0RXh0ZW5kZWRTbG90U3RhcnRJbmRleDogbWV0YS5sYXN0RXh0ZW5kZWRTdGFydEluZGV4LFxuICAgICAgYXV0aG9yaXR5OiBtZXRhLmF1dGhvcml0eS5sZW5ndGggIT09IDAgPyBuZXcgUHVibGljS2V5KG1ldGEuYXV0aG9yaXR5WzBdKSA6IHVuZGVmaW5lZCxcbiAgICAgIGFkZHJlc3NlczogYWRkcmVzc2VzLm1hcChhZGRyZXNzID0+IG5ldyBQdWJsaWNLZXkoYWRkcmVzcykpXG4gICAgfTtcbiAgfVxufVxuY29uc3QgTG9va3VwVGFibGVNZXRhTGF5b3V0ID0ge1xuICBpbmRleDogMSxcbiAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCd0eXBlSW5kZXgnKSwgdTY0KCdkZWFjdGl2YXRpb25TbG90JyksIEJ1ZmZlckxheW91dC5udTY0KCdsYXN0RXh0ZW5kZWRTbG90JyksIEJ1ZmZlckxheW91dC51OCgnbGFzdEV4dGVuZGVkU3RhcnRJbmRleCcpLCBCdWZmZXJMYXlvdXQudTgoKSxcbiAgLy8gb3B0aW9uXG4gIEJ1ZmZlckxheW91dC5zZXEocHVibGljS2V5KCksIEJ1ZmZlckxheW91dC5vZmZzZXQoQnVmZmVyTGF5b3V0LnU4KCksIC0xKSwgJ2F1dGhvcml0eScpXSlcbn07XG5cbmNvbnN0IFVSTF9SRSA9IC9eW146XSs6XFwvXFwvKFteOltdK3xcXFtbXlxcXV0rXFxdKSg6XFxkKyk/KC4qKS9pO1xuZnVuY3Rpb24gbWFrZVdlYnNvY2tldFVybChlbmRwb2ludCkge1xuICBjb25zdCBtYXRjaGVzID0gZW5kcG9pbnQubWF0Y2goVVJMX1JFKTtcbiAgaWYgKG1hdGNoZXMgPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihgRmFpbGVkIHRvIHZhbGlkYXRlIGVuZHBvaW50IFVSTCBcXGAke2VuZHBvaW50fVxcYGApO1xuICB9XG4gIGNvbnN0IFtfLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBob3N0aXNoLCBwb3J0V2l0aENvbG9uLCByZXN0XSA9IG1hdGNoZXM7XG4gIGNvbnN0IHByb3RvY29sID0gZW5kcG9pbnQuc3RhcnRzV2l0aCgnaHR0cHM6JykgPyAnd3NzOicgOiAnd3M6JztcbiAgY29uc3Qgc3RhcnRQb3J0ID0gcG9ydFdpdGhDb2xvbiA9PSBudWxsID8gbnVsbCA6IHBhcnNlSW50KHBvcnRXaXRoQ29sb24uc2xpY2UoMSksIDEwKTtcbiAgY29uc3Qgd2Vic29ja2V0UG9ydCA9XG4gIC8vIE9ubHkgc2hpZnQgdGhlIHBvcnQgYnkgKzEgYXMgYSBjb252ZW50aW9uIGZvciB3cyhzKSBvbmx5IGlmIGdpdmVuIGVuZHBvaW50XG4gIC8vIGlzIGV4cGxpY2l0bHkgc3BlY2lmeWluZyB0aGUgZW5kcG9pbnQgcG9ydCAoSFRUUC1iYXNlZCBSUEMpLCBhc3N1bWluZ1xuICAvLyB3ZSdyZSBkaXJlY3RseSB0cnlpbmcgdG8gY29ubmVjdCB0byBhZ2F2ZS12YWxpZGF0b3IncyB3cyBsaXN0ZW5pbmcgcG9ydC5cbiAgLy8gV2hlbiB0aGUgZW5kcG9pbnQgb21pdHMgdGhlIHBvcnQsIHdlJ3JlIGNvbm5lY3RpbmcgdG8gdGhlIHByb3RvY29sXG4gIC8vIGRlZmF1bHQgcG9ydHM6IGh0dHAoODApIG9yIGh0dHBzKDQ0MykgYW5kIGl0J3MgYXNzdW1lZCB3ZSdyZSBiZWhpbmQgYSByZXZlcnNlXG4gIC8vIHByb3h5IHdoaWNoIG1hbmFnZXMgV2ViU29ja2V0IHVwZ3JhZGUgYW5kIGJhY2tlbmQgcG9ydCByZWRpcmVjdGlvbi5cbiAgc3RhcnRQb3J0ID09IG51bGwgPyAnJyA6IGA6JHtzdGFydFBvcnQgKyAxfWA7XG4gIHJldHVybiBgJHtwcm90b2NvbH0vLyR7aG9zdGlzaH0ke3dlYnNvY2tldFBvcnR9JHtyZXN0fWA7XG59XG5cbmNvbnN0IFB1YmxpY0tleUZyb21TdHJpbmcgPSBjb2VyY2UoaW5zdGFuY2UoUHVibGljS2V5KSwgc3RyaW5nKCksIHZhbHVlID0+IG5ldyBQdWJsaWNLZXkodmFsdWUpKTtcbmNvbnN0IFJhd0FjY291bnREYXRhUmVzdWx0ID0gdHVwbGUoW3N0cmluZygpLCBsaXRlcmFsKCdiYXNlNjQnKV0pO1xuY29uc3QgQnVmZmVyRnJvbVJhd0FjY291bnREYXRhID0gY29lcmNlKGluc3RhbmNlKEJ1ZmZlciksIFJhd0FjY291bnREYXRhUmVzdWx0LCB2YWx1ZSA9PiBCdWZmZXIuZnJvbSh2YWx1ZVswXSwgJ2Jhc2U2NCcpKTtcblxuLyoqXG4gKiBBdHRlbXB0IHRvIHVzZSBhIHJlY2VudCBibG9ja2hhc2ggZm9yIHVwIHRvIDMwIHNlY29uZHNcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBCTE9DS0hBU0hfQ0FDSEVfVElNRU9VVF9NUyA9IDMwICogMTAwMDtcblxuLyoqXG4gKiBIQUNLLlxuICogQ29waWVkIGZyb20gcnBjLXdlYnNvY2tldHMvZGlzdC9saWIvY2xpZW50LlxuICogT3RoZXJ3aXNlLCBgeWFybiBidWlsZGAgZmFpbHMgd2l0aDpcbiAqIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3N0ZXZlbHVzY2hlci9jMDU3ZWNhODFkNDc5ZWY3MDVjZGI1MzE2MmY5OTcxZFxuICovXG5cbi8qKiBAaW50ZXJuYWwgKi9cbi8qKiBAaW50ZXJuYWwgKi9cbi8qKiBAaW50ZXJuYWwgKi9cbi8qKiBAaW50ZXJuYWwgKi9cblxuLyoqIEBpbnRlcm5hbCAqL1xuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEV2ZXJ5IHN1YnNjcmlwdGlvbiBjb250YWlucyB0aGUgYXJncyB1c2VkIHRvIG9wZW4gdGhlIHN1YnNjcmlwdGlvbiB3aXRoXG4gKiB0aGUgc2VydmVyLCBhbmQgYSBsaXN0IG9mIGNhbGxlcnMgaW50ZXJlc3RlZCBpbiBub3RpZmljYXRpb25zLlxuICovXG5cbi8qKlxuICogQGludGVybmFsXG4gKiBBIHN1YnNjcmlwdGlvbiBtYXkgYmUgaW4gdmFyaW91cyBzdGF0ZXMgb2YgY29ubmVjdGVkbmVzcy4gT25seSB3aGVuIGl0IGlzXG4gKiBmdWxseSBjb25uZWN0ZWQgd2lsbCBpdCBoYXZlIGEgc2VydmVyIHN1YnNjcmlwdGlvbiBpZCBhc3NvY2lhdGVkIHdpdGggaXQuXG4gKiBUaGlzIGlkIGNhbiBiZSByZXR1cm5lZCB0byB0aGUgc2VydmVyIHRvIHVuc3Vic2NyaWJlIHRoZSBjbGllbnQgZW50aXJlbHkuXG4gKi9cblxuLyoqXG4gKiBBIHR5cGUgdGhhdCBlbmNhcHN1bGF0ZXMgYSBzdWJzY3JpcHRpb24ncyBSUEMgbWV0aG9kXG4gKiBuYW1lcyBhbmQgbm90aWZpY2F0aW9uIChjYWxsYmFjaykgc2lnbmF0dXJlLlxuICovXG5cbi8qKlxuICogQGludGVybmFsXG4gKiBVdGlsaXR5IHR5cGUgdGhhdCBrZWVwcyB0YWdnZWQgdW5pb25zIGludGFjdCB3aGlsZSBvbWl0dGluZyBwcm9wZXJ0aWVzLlxuICovXG5cbi8qKlxuICogQGludGVybmFsXG4gKiBUaGlzIHR5cGUgcmVwcmVzZW50cyBhIHNpbmdsZSBzdWJzY3JpYmFibGUgJ3RvcGljLicgSXQncyBtYWRlIHVwIG9mOlxuICpcbiAqIC0gVGhlIGFyZ3MgdXNlZCB0byBvcGVuIHRoZSBzdWJzY3JpcHRpb24gd2l0aCB0aGUgc2VydmVyLFxuICogLSBUaGUgc3RhdGUgb2YgdGhlIHN1YnNjcmlwdGlvbiwgaW4gdGVybXMgb2YgaXRzIGNvbm5lY3RlZG5lc3MsIGFuZFxuICogLSBUaGUgc2V0IG9mIGNhbGxiYWNrcyB0byBjYWxsIHdoZW4gdGhlIHNlcnZlciBwdWJsaXNoZXMgbm90aWZpY2F0aW9uc1xuICpcbiAqIFRoaXMgcmVjb3JkIGdldHMgaW5kZXhlZCBieSBgU3Vic2NyaXB0aW9uQ29uZmlnSGFzaGAgYW5kIGlzIHVzZWQgdG9cbiAqIHNldCB1cCBzdWJzY3JpcHRpb25zLCBmYW4gb3V0IG5vdGlmaWNhdGlvbnMsIGFuZCB0cmFjayBzdWJzY3JpcHRpb24gc3RhdGUuXG4gKi9cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuXG4vKipcbiAqIEV4dHJhIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZm9yIFJQQyByZXNwb25zZXNcbiAqL1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHNlbmRpbmcgdHJhbnNhY3Rpb25zXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maXJtaW5nIHRyYW5zYWN0aW9uc1xuICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3IgZ2V0Q29uZmlybWVkU2lnbmF0dXJlc0ZvckFkZHJlc3MyXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciBnZXRTaWduYXR1cmVzRm9yQWRkcmVzc1xuICovXG5cbi8qKlxuICogUlBDIFJlc3BvbnNlIHdpdGggZXh0cmEgY29udGV4dHVhbCBpbmZvcm1hdGlvblxuICovXG5cbi8qKlxuICogQSBzdHJhdGVneSBmb3IgY29uZmlybWluZyB0cmFuc2FjdGlvbnMgdGhhdCB1c2VzIHRoZSBsYXN0IHZhbGlkXG4gKiBibG9jayBoZWlnaHQgZm9yIGEgZ2l2ZW4gYmxvY2toYXNoIHRvIGNoZWNrIGZvciB0cmFuc2FjdGlvbiBleHBpcmF0aW9uLlxuICovXG5cbi8qKlxuICogQSBzdHJhdGVneSBmb3IgY29uZmlybWluZyBkdXJhYmxlIG5vbmNlIHRyYW5zYWN0aW9ucy5cbiAqL1xuXG4vKipcbiAqIFByb3BlcnRpZXMgc2hhcmVkIGJ5IGFsbCB0cmFuc2FjdGlvbiBjb25maXJtYXRpb24gc3RyYXRlZ2llc1xuICovXG5cbi8qKlxuICogVGhpcyB0eXBlIHJlcHJlc2VudHMgYWxsIHRyYW5zYWN0aW9uIGNvbmZpcm1hdGlvbiBzdHJhdGVnaWVzXG4gKi9cblxuLyogQGludGVybmFsICovXG5mdW5jdGlvbiBhc3NlcnRFbmRwb2ludFVybChwdXRhdGl2ZVVybCkge1xuICBpZiAoL15odHRwcz86Ly50ZXN0KHB1dGF0aXZlVXJsKSA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdFbmRwb2ludCBVUkwgbXVzdCBzdGFydCB3aXRoIGBodHRwOmAgb3IgYGh0dHBzOmAuJyk7XG4gIH1cbiAgcmV0dXJuIHB1dGF0aXZlVXJsO1xufVxuXG4vKiogQGludGVybmFsICovXG5mdW5jdGlvbiBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcoY29tbWl0bWVudE9yQ29uZmlnKSB7XG4gIGxldCBjb21taXRtZW50O1xuICBsZXQgY29uZmlnO1xuICBpZiAodHlwZW9mIGNvbW1pdG1lbnRPckNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICBjb21taXRtZW50ID0gY29tbWl0bWVudE9yQ29uZmlnO1xuICB9IGVsc2UgaWYgKGNvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQ6IHNwZWNpZmllZENvbW1pdG1lbnQsXG4gICAgICAuLi5zcGVjaWZpZWRDb25maWdcbiAgICB9ID0gY29tbWl0bWVudE9yQ29uZmlnO1xuICAgIGNvbW1pdG1lbnQgPSBzcGVjaWZpZWRDb21taXRtZW50O1xuICAgIGNvbmZpZyA9IHNwZWNpZmllZENvbmZpZztcbiAgfVxuICByZXR1cm4ge1xuICAgIGNvbW1pdG1lbnQsXG4gICAgY29uZmlnXG4gIH07XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGFwcGx5RGVmYXVsdE1lbWNtcEVuY29kaW5nVG9GaWx0ZXJzKGZpbHRlcnMpIHtcbiAgcmV0dXJuIGZpbHRlcnMubWFwKGZpbHRlciA9PiAnbWVtY21wJyBpbiBmaWx0ZXIgPyB7XG4gICAgLi4uZmlsdGVyLFxuICAgIG1lbWNtcDoge1xuICAgICAgLi4uZmlsdGVyLm1lbWNtcCxcbiAgICAgIGVuY29kaW5nOiBmaWx0ZXIubWVtY21wLmVuY29kaW5nID8/ICdiYXNlNTgnXG4gICAgfVxuICB9IDogZmlsdGVyKTtcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gY3JlYXRlUnBjUmVzdWx0KHJlc3VsdCkge1xuICByZXR1cm4gdW5pb24oW3R5cGUoe1xuICAgIGpzb25ycGM6IGxpdGVyYWwoJzIuMCcpLFxuICAgIGlkOiBzdHJpbmcoKSxcbiAgICByZXN1bHRcbiAgfSksIHR5cGUoe1xuICAgIGpzb25ycGM6IGxpdGVyYWwoJzIuMCcpLFxuICAgIGlkOiBzdHJpbmcoKSxcbiAgICBlcnJvcjogdHlwZSh7XG4gICAgICBjb2RlOiB1bmtub3duKCksXG4gICAgICBtZXNzYWdlOiBzdHJpbmcoKSxcbiAgICAgIGRhdGE6IG9wdGlvbmFsKGFueSgpKVxuICAgIH0pXG4gIH0pXSk7XG59XG5jb25zdCBVbmtub3duUnBjUmVzdWx0ID0gY3JlYXRlUnBjUmVzdWx0KHVua25vd24oKSk7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGpzb25ScGNSZXN1bHQoc2NoZW1hKSB7XG4gIHJldHVybiBjb2VyY2UoY3JlYXRlUnBjUmVzdWx0KHNjaGVtYSksIFVua25vd25ScGNSZXN1bHQsIHZhbHVlID0+IHtcbiAgICBpZiAoJ2Vycm9yJyBpbiB2YWx1ZSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgcmVzdWx0OiBjcmVhdGUodmFsdWUucmVzdWx0LCBzY2hlbWEpXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIGpzb25ScGNSZXN1bHRBbmRDb250ZXh0KHZhbHVlKSB7XG4gIHJldHVybiBqc29uUnBjUmVzdWx0KHR5cGUoe1xuICAgIGNvbnRleHQ6IHR5cGUoe1xuICAgICAgc2xvdDogbnVtYmVyKClcbiAgICB9KSxcbiAgICB2YWx1ZVxuICB9KSk7XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmZ1bmN0aW9uIG5vdGlmaWNhdGlvblJlc3VsdEFuZENvbnRleHQodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGUoe1xuICAgIGNvbnRleHQ6IHR5cGUoe1xuICAgICAgc2xvdDogbnVtYmVyKClcbiAgICB9KSxcbiAgICB2YWx1ZVxuICB9KTtcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZnVuY3Rpb24gdmVyc2lvbmVkTWVzc2FnZUZyb21SZXNwb25zZSh2ZXJzaW9uLCByZXNwb25zZSkge1xuICBpZiAodmVyc2lvbiA9PT0gMCkge1xuICAgIHJldHVybiBuZXcgTWVzc2FnZVYwKHtcbiAgICAgIGhlYWRlcjogcmVzcG9uc2UuaGVhZGVyLFxuICAgICAgc3RhdGljQWNjb3VudEtleXM6IHJlc3BvbnNlLmFjY291bnRLZXlzLm1hcChhY2NvdW50S2V5ID0+IG5ldyBQdWJsaWNLZXkoYWNjb3VudEtleSkpLFxuICAgICAgcmVjZW50QmxvY2toYXNoOiByZXNwb25zZS5yZWNlbnRCbG9ja2hhc2gsXG4gICAgICBjb21waWxlZEluc3RydWN0aW9uczogcmVzcG9uc2UuaW5zdHJ1Y3Rpb25zLm1hcChpeCA9PiAoe1xuICAgICAgICBwcm9ncmFtSWRJbmRleDogaXgucHJvZ3JhbUlkSW5kZXgsXG4gICAgICAgIGFjY291bnRLZXlJbmRleGVzOiBpeC5hY2NvdW50cyxcbiAgICAgICAgZGF0YTogYnM1OC5kZWNvZGUoaXguZGF0YSlcbiAgICAgIH0pKSxcbiAgICAgIGFkZHJlc3NUYWJsZUxvb2t1cHM6IHJlc3BvbnNlLmFkZHJlc3NUYWJsZUxvb2t1cHNcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IE1lc3NhZ2UocmVzcG9uc2UpO1xuICB9XG59XG5cbi8qKlxuICogVGhlIGxldmVsIG9mIGNvbW1pdG1lbnQgZGVzaXJlZCB3aGVuIHF1ZXJ5aW5nIHN0YXRlXG4gKiA8cHJlPlxuICogICAncHJvY2Vzc2VkJzogUXVlcnkgdGhlIG1vc3QgcmVjZW50IGJsb2NrIHdoaWNoIGhhcyByZWFjaGVkIDEgY29uZmlybWF0aW9uIGJ5IHRoZSBjb25uZWN0ZWQgbm9kZVxuICogICAnY29uZmlybWVkJzogUXVlcnkgdGhlIG1vc3QgcmVjZW50IGJsb2NrIHdoaWNoIGhhcyByZWFjaGVkIDEgY29uZmlybWF0aW9uIGJ5IHRoZSBjbHVzdGVyXG4gKiAgICdmaW5hbGl6ZWQnOiBRdWVyeSB0aGUgbW9zdCByZWNlbnQgYmxvY2sgd2hpY2ggaGFzIGJlZW4gZmluYWxpemVkIGJ5IHRoZSBjbHVzdGVyXG4gKiA8L3ByZT5cbiAqL1xuXG4vLyBEZXByZWNhdGVkIGFzIG9mIHYxLjUuNVxuXG4vKipcbiAqIEEgc3Vic2V0IG9mIENvbW1pdG1lbnQgbGV2ZWxzLCB3aGljaCBhcmUgYXQgbGVhc3Qgb3B0aW1pc3RpY2FsbHkgY29uZmlybWVkXG4gKiA8cHJlPlxuICogICAnY29uZmlybWVkJzogUXVlcnkgdGhlIG1vc3QgcmVjZW50IGJsb2NrIHdoaWNoIGhhcyByZWFjaGVkIDEgY29uZmlybWF0aW9uIGJ5IHRoZSBjbHVzdGVyXG4gKiAgICdmaW5hbGl6ZWQnOiBRdWVyeSB0aGUgbW9zdCByZWNlbnQgYmxvY2sgd2hpY2ggaGFzIGJlZW4gZmluYWxpemVkIGJ5IHRoZSBjbHVzdGVyXG4gKiA8L3ByZT5cbiAqL1xuXG4vKipcbiAqIEZpbHRlciBmb3IgbGFyZ2VzdCBhY2NvdW50cyBxdWVyeVxuICogPHByZT5cbiAqICAgJ2NpcmN1bGF0aW5nJzogICAgUmV0dXJuIHRoZSBsYXJnZXN0IGFjY291bnRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGNpcmN1bGF0aW5nIHN1cHBseVxuICogICAnbm9uQ2lyY3VsYXRpbmcnOiBSZXR1cm4gdGhlIGxhcmdlc3QgYWNjb3VudHMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGNpcmN1bGF0aW5nIHN1cHBseVxuICogPC9wcmU+XG4gKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgY2hhbmdpbmcgYGdldEFjY291bnRJbmZvYCBxdWVyeSBiZWhhdmlvclxuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGNoYW5naW5nIGBnZXRCYWxhbmNlYCBxdWVyeSBiZWhhdmlvclxuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGNoYW5naW5nIGBnZXRCbG9ja2AgcXVlcnkgYmVoYXZpb3JcbiAqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBjaGFuZ2luZyBgZ2V0QmxvY2tgIHF1ZXJ5IGJlaGF2aW9yXG4gKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgY2hhbmdpbmcgYGdldFN0YWtlTWluaW11bURlbGVnYXRpb25gIHF1ZXJ5IGJlaGF2aW9yXG4gKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgY2hhbmdpbmcgYGdldEJsb2NrSGVpZ2h0YCBxdWVyeSBiZWhhdmlvclxuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGNoYW5naW5nIGBnZXRFcG9jaEluZm9gIHF1ZXJ5IGJlaGF2aW9yXG4gKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgY2hhbmdpbmcgYGdldEluZmxhdGlvblJld2FyZGAgcXVlcnkgYmVoYXZpb3JcbiAqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBjaGFuZ2luZyBgZ2V0TGF0ZXN0QmxvY2toYXNoYCBxdWVyeSBiZWhhdmlvclxuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGNoYW5naW5nIGBpc0Jsb2NraGFzaFZhbGlkYCBxdWVyeSBiZWhhdmlvclxuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGNoYW5naW5nIGBnZXRTbG90YCBxdWVyeSBiZWhhdmlvclxuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGNoYW5naW5nIGBnZXRTbG90TGVhZGVyYCBxdWVyeSBiZWhhdmlvclxuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGNoYW5naW5nIGBnZXRUcmFuc2FjdGlvbmAgcXVlcnkgYmVoYXZpb3JcbiAqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBjaGFuZ2luZyBgZ2V0VHJhbnNhY3Rpb25gIHF1ZXJ5IGJlaGF2aW9yXG4gKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgY2hhbmdpbmcgYGdldExhcmdlc3RBY2NvdW50c2AgcXVlcnkgYmVoYXZpb3JcbiAqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBjaGFuZ2luZyBgZ2V0U3VwcGx5YCByZXF1ZXN0IGJlaGF2aW9yXG4gKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgY2hhbmdpbmcgcXVlcnkgYmVoYXZpb3JcbiAqL1xuXG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgYSBjbHVzdGVyIG5vZGVcbiAqL1xuXG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgYSB2b3RlIGFjY291bnRcbiAqL1xuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBjbHVzdGVyIHZvdGUgYWNjb3VudHNcbiAqL1xuXG4vKipcbiAqIE5ldHdvcmsgSW5mbGF0aW9uXG4gKiAoc2VlIGh0dHBzOi8vZG9jcy5zb2xhbmEuY29tL2ltcGxlbWVudGVkLXByb3Bvc2Fscy9lZF9vdmVydmlldylcbiAqL1xuXG5jb25zdCBHZXRJbmZsYXRpb25Hb3Zlcm5vclJlc3VsdCA9IHR5cGUoe1xuICBmb3VuZGF0aW9uOiBudW1iZXIoKSxcbiAgZm91bmRhdGlvblRlcm06IG51bWJlcigpLFxuICBpbml0aWFsOiBudW1iZXIoKSxcbiAgdGFwZXI6IG51bWJlcigpLFxuICB0ZXJtaW5hbDogbnVtYmVyKClcbn0pO1xuXG4vKipcbiAqIFRoZSBpbmZsYXRpb24gcmV3YXJkIGZvciBhbiBlcG9jaFxuICovXG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldEluZmxhdGlvblJld2FyZFwiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0SW5mbGF0aW9uUmV3YXJkUmVzdWx0ID0ganNvblJwY1Jlc3VsdChhcnJheShudWxsYWJsZSh0eXBlKHtcbiAgZXBvY2g6IG51bWJlcigpLFxuICBlZmZlY3RpdmVTbG90OiBudW1iZXIoKSxcbiAgYW1vdW50OiBudW1iZXIoKSxcbiAgcG9zdEJhbGFuY2U6IG51bWJlcigpLFxuICBjb21taXNzaW9uOiBvcHRpb25hbChudWxsYWJsZShudW1iZXIoKSkpXG59KSkpKTtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgY2hhbmdpbmcgYGdldFJlY2VudFByaW9yaXRpemF0aW9uRmVlc2AgcXVlcnkgYmVoYXZpb3JcbiAqL1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJnZXRSZWNlbnRQcmlvcml0aXphdGlvbkZlZXNcIiBtZXNzYWdlXG4gKi9cbmNvbnN0IEdldFJlY2VudFByaW9yaXRpemF0aW9uRmVlc1Jlc3VsdCA9IGFycmF5KHR5cGUoe1xuICBzbG90OiBudW1iZXIoKSxcbiAgcHJpb3JpdGl6YXRpb25GZWU6IG51bWJlcigpXG59KSk7XG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJnZXRJbmZsYXRpb25SYXRlXCIgbWVzc2FnZVxuICovXG5jb25zdCBHZXRJbmZsYXRpb25SYXRlUmVzdWx0ID0gdHlwZSh7XG4gIHRvdGFsOiBudW1iZXIoKSxcbiAgdmFsaWRhdG9yOiBudW1iZXIoKSxcbiAgZm91bmRhdGlvbjogbnVtYmVyKCksXG4gIGVwb2NoOiBudW1iZXIoKVxufSk7XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgZXBvY2hcbiAqL1xuXG5jb25zdCBHZXRFcG9jaEluZm9SZXN1bHQgPSB0eXBlKHtcbiAgZXBvY2g6IG51bWJlcigpLFxuICBzbG90SW5kZXg6IG51bWJlcigpLFxuICBzbG90c0luRXBvY2g6IG51bWJlcigpLFxuICBhYnNvbHV0ZVNsb3Q6IG51bWJlcigpLFxuICBibG9ja0hlaWdodDogb3B0aW9uYWwobnVtYmVyKCkpLFxuICB0cmFuc2FjdGlvbkNvdW50OiBvcHRpb25hbChudW1iZXIoKSlcbn0pO1xuY29uc3QgR2V0RXBvY2hTY2hlZHVsZVJlc3VsdCA9IHR5cGUoe1xuICBzbG90c1BlckVwb2NoOiBudW1iZXIoKSxcbiAgbGVhZGVyU2NoZWR1bGVTbG90T2Zmc2V0OiBudW1iZXIoKSxcbiAgd2FybXVwOiBib29sZWFuKCksXG4gIGZpcnN0Tm9ybWFsRXBvY2g6IG51bWJlcigpLFxuICBmaXJzdE5vcm1hbFNsb3Q6IG51bWJlcigpXG59KTtcblxuLyoqXG4gKiBMZWFkZXIgc2NoZWR1bGVcbiAqIChzZWUgaHR0cHM6Ly9kb2NzLnNvbGFuYS5jb20vdGVybWlub2xvZ3kjbGVhZGVyLXNjaGVkdWxlKVxuICovXG5cbmNvbnN0IEdldExlYWRlclNjaGVkdWxlUmVzdWx0ID0gcmVjb3JkKHN0cmluZygpLCBhcnJheShudW1iZXIoKSkpO1xuXG4vKipcbiAqIFRyYW5zYWN0aW9uIGVycm9yIG9yIG51bGxcbiAqL1xuY29uc3QgVHJhbnNhY3Rpb25FcnJvclJlc3VsdCA9IG51bGxhYmxlKHVuaW9uKFt0eXBlKHt9KSwgc3RyaW5nKCldKSk7XG5cbi8qKlxuICogU2lnbmF0dXJlIHN0YXR1cyBmb3IgYSB0cmFuc2FjdGlvblxuICovXG5jb25zdCBTaWduYXR1cmVTdGF0dXNSZXN1bHQgPSB0eXBlKHtcbiAgZXJyOiBUcmFuc2FjdGlvbkVycm9yUmVzdWx0XG59KTtcblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBzaWduYXR1cmUgcmVjZWl2ZWQgbm90aWZpY2F0aW9uXG4gKi9cbmNvbnN0IFNpZ25hdHVyZVJlY2VpdmVkUmVzdWx0ID0gbGl0ZXJhbCgncmVjZWl2ZWRTaWduYXR1cmUnKTtcblxuLyoqXG4gKiBWZXJzaW9uIGluZm8gZm9yIGEgbm9kZVxuICovXG5cbmNvbnN0IFZlcnNpb25SZXN1bHQgPSB0eXBlKHtcbiAgJ3NvbGFuYS1jb3JlJzogc3RyaW5nKCksXG4gICdmZWF0dXJlLXNldCc6IG9wdGlvbmFsKG51bWJlcigpKVxufSk7XG5jb25zdCBQYXJzZWRJbnN0cnVjdGlvblN0cnVjdCA9IHR5cGUoe1xuICBwcm9ncmFtOiBzdHJpbmcoKSxcbiAgcHJvZ3JhbUlkOiBQdWJsaWNLZXlGcm9tU3RyaW5nLFxuICBwYXJzZWQ6IHVua25vd24oKVxufSk7XG5jb25zdCBQYXJ0aWFsbHlEZWNvZGVkSW5zdHJ1Y3Rpb25TdHJ1Y3QgPSB0eXBlKHtcbiAgcHJvZ3JhbUlkOiBQdWJsaWNLZXlGcm9tU3RyaW5nLFxuICBhY2NvdW50czogYXJyYXkoUHVibGljS2V5RnJvbVN0cmluZyksXG4gIGRhdGE6IHN0cmluZygpXG59KTtcbmNvbnN0IFNpbXVsYXRlZFRyYW5zYWN0aW9uUmVzcG9uc2VTdHJ1Y3QgPSBqc29uUnBjUmVzdWx0QW5kQ29udGV4dCh0eXBlKHtcbiAgZXJyOiBudWxsYWJsZSh1bmlvbihbdHlwZSh7fSksIHN0cmluZygpXSkpLFxuICBsb2dzOiBudWxsYWJsZShhcnJheShzdHJpbmcoKSkpLFxuICBhY2NvdW50czogb3B0aW9uYWwobnVsbGFibGUoYXJyYXkobnVsbGFibGUodHlwZSh7XG4gICAgZXhlY3V0YWJsZTogYm9vbGVhbigpLFxuICAgIG93bmVyOiBzdHJpbmcoKSxcbiAgICBsYW1wb3J0czogbnVtYmVyKCksXG4gICAgZGF0YTogYXJyYXkoc3RyaW5nKCkpLFxuICAgIHJlbnRFcG9jaDogb3B0aW9uYWwobnVtYmVyKCkpXG4gIH0pKSkpKSxcbiAgdW5pdHNDb25zdW1lZDogb3B0aW9uYWwobnVtYmVyKCkpLFxuICByZXR1cm5EYXRhOiBvcHRpb25hbChudWxsYWJsZSh0eXBlKHtcbiAgICBwcm9ncmFtSWQ6IHN0cmluZygpLFxuICAgIGRhdGE6IHR1cGxlKFtzdHJpbmcoKSwgbGl0ZXJhbCgnYmFzZTY0JyldKVxuICB9KSkpLFxuICBpbm5lckluc3RydWN0aW9uczogb3B0aW9uYWwobnVsbGFibGUoYXJyYXkodHlwZSh7XG4gICAgaW5kZXg6IG51bWJlcigpLFxuICAgIGluc3RydWN0aW9uczogYXJyYXkodW5pb24oW1BhcnNlZEluc3RydWN0aW9uU3RydWN0LCBQYXJ0aWFsbHlEZWNvZGVkSW5zdHJ1Y3Rpb25TdHJ1Y3RdKSlcbiAgfSkpKSlcbn0pKTtcblxuLyoqXG4gKiBNZXRhZGF0YSBmb3IgYSBwYXJzZWQgY29uZmlybWVkIHRyYW5zYWN0aW9uIG9uIHRoZSBsZWRnZXJcbiAqXG4gKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIHNpbmNlIFJQQyB2MS44LjAuIFBsZWFzZSB1c2Uge0BsaW5rIFBhcnNlZFRyYW5zYWN0aW9uTWV0YX0gaW5zdGVhZC5cbiAqL1xuXG4vKipcbiAqIENvbGxlY3Rpb24gb2YgYWRkcmVzc2VzIGxvYWRlZCBieSBhIHRyYW5zYWN0aW9uIHVzaW5nIGFkZHJlc3MgdGFibGUgbG9va3Vwc1xuICovXG5cbi8qKlxuICogTWV0YWRhdGEgZm9yIGEgcGFyc2VkIHRyYW5zYWN0aW9uIG9uIHRoZSBsZWRnZXJcbiAqL1xuXG4vKipcbiAqIE1ldGFkYXRhIGZvciBhIGNvbmZpcm1lZCB0cmFuc2FjdGlvbiBvbiB0aGUgbGVkZ2VyXG4gKi9cblxuLyoqXG4gKiBBIHByb2Nlc3NlZCB0cmFuc2FjdGlvbiBmcm9tIHRoZSBSUEMgQVBJXG4gKi9cblxuLyoqXG4gKiBBIHByb2Nlc3NlZCB0cmFuc2FjdGlvbiBmcm9tIHRoZSBSUEMgQVBJXG4gKi9cblxuLyoqXG4gKiBBIHByb2Nlc3NlZCB0cmFuc2FjdGlvbiBtZXNzYWdlIGZyb20gdGhlIFJQQyBBUElcbiAqL1xuXG4vKipcbiAqIEEgY29uZmlybWVkIHRyYW5zYWN0aW9uIG9uIHRoZSBsZWRnZXJcbiAqXG4gKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIHNpbmNlIFJQQyB2MS44LjAuXG4gKi9cblxuLyoqXG4gKiBBIHBhcnRpYWxseSBkZWNvZGVkIHRyYW5zYWN0aW9uIGluc3RydWN0aW9uXG4gKi9cblxuLyoqXG4gKiBBIHBhcnNlZCB0cmFuc2FjdGlvbiBtZXNzYWdlIGFjY291bnRcbiAqL1xuXG4vKipcbiAqIEEgcGFyc2VkIHRyYW5zYWN0aW9uIGluc3RydWN0aW9uXG4gKi9cblxuLyoqXG4gKiBBIHBhcnNlZCBhZGRyZXNzIHRhYmxlIGxvb2t1cFxuICovXG5cbi8qKlxuICogQSBwYXJzZWQgdHJhbnNhY3Rpb24gbWVzc2FnZVxuICovXG5cbi8qKlxuICogQSBwYXJzZWQgdHJhbnNhY3Rpb25cbiAqL1xuXG4vKipcbiAqIEEgcGFyc2VkIGFuZCBjb25maXJtZWQgdHJhbnNhY3Rpb24gb24gdGhlIGxlZGdlclxuICpcbiAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgc2luY2UgUlBDIHYxLjguMC4gUGxlYXNlIHVzZSB7QGxpbmsgUGFyc2VkVHJhbnNhY3Rpb25XaXRoTWV0YX0gaW5zdGVhZC5cbiAqL1xuXG4vKipcbiAqIEEgcGFyc2VkIHRyYW5zYWN0aW9uIG9uIHRoZSBsZWRnZXIgd2l0aCBtZXRhXG4gKi9cblxuLyoqXG4gKiBBIHByb2Nlc3NlZCBibG9jayBmZXRjaGVkIGZyb20gdGhlIFJQQyBBUElcbiAqL1xuXG4vKipcbiAqIEEgcHJvY2Vzc2VkIGJsb2NrIGZldGNoZWQgZnJvbSB0aGUgUlBDIEFQSSB3aGVyZSB0aGUgYHRyYW5zYWN0aW9uRGV0YWlsc2AgbW9kZSBpcyBgYWNjb3VudHNgXG4gKi9cblxuLyoqXG4gKiBBIHByb2Nlc3NlZCBibG9jayBmZXRjaGVkIGZyb20gdGhlIFJQQyBBUEkgd2hlcmUgdGhlIGB0cmFuc2FjdGlvbkRldGFpbHNgIG1vZGUgaXMgYG5vbmVgXG4gKi9cblxuLyoqXG4gKiBBIGJsb2NrIHdpdGggcGFyc2VkIHRyYW5zYWN0aW9uc1xuICovXG5cbi8qKlxuICogQSBibG9jayB3aXRoIHBhcnNlZCB0cmFuc2FjdGlvbnMgd2hlcmUgdGhlIGB0cmFuc2FjdGlvbkRldGFpbHNgIG1vZGUgaXMgYGFjY291bnRzYFxuICovXG5cbi8qKlxuICogQSBibG9jayB3aXRoIHBhcnNlZCB0cmFuc2FjdGlvbnMgd2hlcmUgdGhlIGB0cmFuc2FjdGlvbkRldGFpbHNgIG1vZGUgaXMgYG5vbmVgXG4gKi9cblxuLyoqXG4gKiBBIHByb2Nlc3NlZCBibG9jayBmZXRjaGVkIGZyb20gdGhlIFJQQyBBUElcbiAqL1xuXG4vKipcbiAqIEEgcHJvY2Vzc2VkIGJsb2NrIGZldGNoZWQgZnJvbSB0aGUgUlBDIEFQSSB3aGVyZSB0aGUgYHRyYW5zYWN0aW9uRGV0YWlsc2AgbW9kZSBpcyBgYWNjb3VudHNgXG4gKi9cblxuLyoqXG4gKiBBIHByb2Nlc3NlZCBibG9jayBmZXRjaGVkIGZyb20gdGhlIFJQQyBBUEkgd2hlcmUgdGhlIGB0cmFuc2FjdGlvbkRldGFpbHNgIG1vZGUgaXMgYG5vbmVgXG4gKi9cblxuLyoqXG4gKiBBIGNvbmZpcm1lZCBibG9jayBvbiB0aGUgbGVkZ2VyXG4gKlxuICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBzaW5jZSBSUEMgdjEuOC4wLlxuICovXG5cbi8qKlxuICogQSBCbG9jayBvbiB0aGUgbGVkZ2VyIHdpdGggc2lnbmF0dXJlcyBvbmx5XG4gKi9cblxuLyoqXG4gKiByZWNlbnQgYmxvY2sgcHJvZHVjdGlvbiBpbmZvcm1hdGlvblxuICovXG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldEJsb2NrUHJvZHVjdGlvblwiIG1lc3NhZ2VcbiAqL1xuY29uc3QgQmxvY2tQcm9kdWN0aW9uUmVzcG9uc2VTdHJ1Y3QgPSBqc29uUnBjUmVzdWx0QW5kQ29udGV4dCh0eXBlKHtcbiAgYnlJZGVudGl0eTogcmVjb3JkKHN0cmluZygpLCBhcnJheShudW1iZXIoKSkpLFxuICByYW5nZTogdHlwZSh7XG4gICAgZmlyc3RTbG90OiBudW1iZXIoKSxcbiAgICBsYXN0U2xvdDogbnVtYmVyKClcbiAgfSlcbn0pKTtcblxuLyoqXG4gKiBBIHBlcmZvcm1hbmNlIHNhbXBsZVxuICovXG5cbmZ1bmN0aW9uIGNyZWF0ZVJwY0NsaWVudCh1cmwsIGh0dHBIZWFkZXJzLCBjdXN0b21GZXRjaCwgZmV0Y2hNaWRkbGV3YXJlLCBkaXNhYmxlUmV0cnlPblJhdGVMaW1pdCwgaHR0cEFnZW50KSB7XG4gIGNvbnN0IGZldGNoID0gY3VzdG9tRmV0Y2ggPyBjdXN0b21GZXRjaCA6IGZldGNoSW1wbDtcbiAgbGV0IGFnZW50O1xuICB7XG4gICAgaWYgKGh0dHBBZ2VudCAhPSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1lvdSBoYXZlIHN1cHBsaWVkIGFuIGBodHRwQWdlbnRgIHdoZW4gY3JlYXRpbmcgYSBgQ29ubmVjdGlvbmAgaW4gYSBicm93c2VyIGVudmlyb25tZW50LicgKyAnSXQgaGFzIGJlZW4gaWdub3JlZDsgYGh0dHBBZ2VudGAgaXMgb25seSB1c2VkIGluIE5vZGUgZW52aXJvbm1lbnRzLicpO1xuICAgIH1cbiAgfVxuICBsZXQgZmV0Y2hXaXRoTWlkZGxld2FyZTtcbiAgaWYgKGZldGNoTWlkZGxld2FyZSkge1xuICAgIGZldGNoV2l0aE1pZGRsZXdhcmUgPSBhc3luYyAoaW5mbywgaW5pdCkgPT4ge1xuICAgICAgY29uc3QgbW9kaWZpZWRGZXRjaEFyZ3MgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZmV0Y2hNaWRkbGV3YXJlKGluZm8sIGluaXQsIChtb2RpZmllZEluZm8sIG1vZGlmaWVkSW5pdCkgPT4gcmVzb2x2ZShbbW9kaWZpZWRJbmZvLCBtb2RpZmllZEluaXRdKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gYXdhaXQgZmV0Y2goLi4ubW9kaWZpZWRGZXRjaEFyZ3MpO1xuICAgIH07XG4gIH1cbiAgY29uc3QgY2xpZW50QnJvd3NlciA9IG5ldyBScGNDbGllbnQoYXN5bmMgKHJlcXVlc3QsIGNhbGxiYWNrKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgYm9keTogcmVxdWVzdCxcbiAgICAgIGFnZW50LFxuICAgICAgaGVhZGVyczogT2JqZWN0LmFzc2lnbih7XG4gICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgIH0sIGh0dHBIZWFkZXJzIHx8IHt9LCBDT01NT05fSFRUUF9IRUFERVJTKVxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGxldCB0b29fbWFueV9yZXF1ZXN0c19yZXRyaWVzID0gNTtcbiAgICAgIGxldCByZXM7XG4gICAgICBsZXQgd2FpdFRpbWUgPSA1MDA7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGlmIChmZXRjaFdpdGhNaWRkbGV3YXJlKSB7XG4gICAgICAgICAgcmVzID0gYXdhaXQgZmV0Y2hXaXRoTWlkZGxld2FyZSh1cmwsIG9wdGlvbnMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlcyA9IGF3YWl0IGZldGNoKHVybCwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDQyOSAvKiBUb28gbWFueSByZXF1ZXN0cyAqLykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaXNhYmxlUmV0cnlPblJhdGVMaW1pdCA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHRvb19tYW55X3JlcXVlc3RzX3JldHJpZXMgLT0gMTtcbiAgICAgICAgaWYgKHRvb19tYW55X3JlcXVlc3RzX3JldHJpZXMgPT09IDApIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLmVycm9yKGBTZXJ2ZXIgcmVzcG9uZGVkIHdpdGggJHtyZXMuc3RhdHVzfSAke3Jlcy5zdGF0dXNUZXh0fS4gIFJldHJ5aW5nIGFmdGVyICR7d2FpdFRpbWV9bXMgZGVsYXkuLi5gKTtcbiAgICAgICAgYXdhaXQgc2xlZXAod2FpdFRpbWUpO1xuICAgICAgICB3YWl0VGltZSAqPSAyO1xuICAgICAgfVxuICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgIGNhbGxiYWNrKG51bGwsIHRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKGAke3Jlcy5zdGF0dXN9ICR7cmVzLnN0YXR1c1RleHR9OiAke3RleHR9YCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSBjYWxsYmFjayhlcnIpO1xuICAgIH1cbiAgfSwge30pO1xuICByZXR1cm4gY2xpZW50QnJvd3Nlcjtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJwY1JlcXVlc3QoY2xpZW50KSB7XG4gIHJldHVybiAobWV0aG9kLCBhcmdzKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNsaWVudC5yZXF1ZXN0KG1ldGhvZCwgYXJncywgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufVxuZnVuY3Rpb24gY3JlYXRlUnBjQmF0Y2hSZXF1ZXN0KGNsaWVudCkge1xuICByZXR1cm4gcmVxdWVzdHMgPT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBEbyBub3RoaW5nIGlmIHJlcXVlc3RzIGlzIGVtcHR5XG4gICAgICBpZiAocmVxdWVzdHMubGVuZ3RoID09PSAwKSByZXNvbHZlKFtdKTtcbiAgICAgIGNvbnN0IGJhdGNoID0gcmVxdWVzdHMubWFwKHBhcmFtcyA9PiB7XG4gICAgICAgIHJldHVybiBjbGllbnQucmVxdWVzdChwYXJhbXMubWV0aG9kTmFtZSwgcGFyYW1zLmFyZ3MpO1xuICAgICAgfSk7XG4gICAgICBjbGllbnQucmVxdWVzdChiYXRjaCwgKGVyciwgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJnZXRJbmZsYXRpb25Hb3Zlcm5vclwiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0SW5mbGF0aW9uR292ZXJub3JScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0KEdldEluZmxhdGlvbkdvdmVybm9yUmVzdWx0KTtcblxuLyoqXG4gKiBFeHBlY3RlZCBKU09OIFJQQyByZXNwb25zZSBmb3IgdGhlIFwiZ2V0SW5mbGF0aW9uUmF0ZVwiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0SW5mbGF0aW9uUmF0ZVJwY1Jlc3VsdCA9IGpzb25ScGNSZXN1bHQoR2V0SW5mbGF0aW9uUmF0ZVJlc3VsdCk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldFJlY2VudFByaW9yaXRpemF0aW9uRmVlc1wiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0UmVjZW50UHJpb3JpdGl6YXRpb25GZWVzUnBjUmVzdWx0ID0ganNvblJwY1Jlc3VsdChHZXRSZWNlbnRQcmlvcml0aXphdGlvbkZlZXNSZXN1bHQpO1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJnZXRFcG9jaEluZm9cIiBtZXNzYWdlXG4gKi9cbmNvbnN0IEdldEVwb2NoSW5mb1JwY1Jlc3VsdCA9IGpzb25ScGNSZXN1bHQoR2V0RXBvY2hJbmZvUmVzdWx0KTtcblxuLyoqXG4gKiBFeHBlY3RlZCBKU09OIFJQQyByZXNwb25zZSBmb3IgdGhlIFwiZ2V0RXBvY2hTY2hlZHVsZVwiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0RXBvY2hTY2hlZHVsZVJwY1Jlc3VsdCA9IGpzb25ScGNSZXN1bHQoR2V0RXBvY2hTY2hlZHVsZVJlc3VsdCk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldExlYWRlclNjaGVkdWxlXCIgbWVzc2FnZVxuICovXG5jb25zdCBHZXRMZWFkZXJTY2hlZHVsZVJwY1Jlc3VsdCA9IGpzb25ScGNSZXN1bHQoR2V0TGVhZGVyU2NoZWR1bGVSZXN1bHQpO1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJtaW5pbXVtTGVkZ2VyU2xvdFwiIGFuZCBcImdldEZpcnN0QXZhaWxhYmxlQmxvY2tcIiBtZXNzYWdlc1xuICovXG5jb25zdCBTbG90UnBjUmVzdWx0ID0ganNvblJwY1Jlc3VsdChudW1iZXIoKSk7XG5cbi8qKlxuICogU3VwcGx5XG4gKi9cblxuLyoqXG4gKiBFeHBlY3RlZCBKU09OIFJQQyByZXNwb25zZSBmb3IgdGhlIFwiZ2V0U3VwcGx5XCIgbWVzc2FnZVxuICovXG5jb25zdCBHZXRTdXBwbHlScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0QW5kQ29udGV4dCh0eXBlKHtcbiAgdG90YWw6IG51bWJlcigpLFxuICBjaXJjdWxhdGluZzogbnVtYmVyKCksXG4gIG5vbkNpcmN1bGF0aW5nOiBudW1iZXIoKSxcbiAgbm9uQ2lyY3VsYXRpbmdBY2NvdW50czogYXJyYXkoUHVibGljS2V5RnJvbVN0cmluZylcbn0pKTtcblxuLyoqXG4gKiBUb2tlbiBhbW91bnQgb2JqZWN0IHdoaWNoIHJldHVybnMgYSB0b2tlbiBhbW91bnQgaW4gZGlmZmVyZW50IGZvcm1hdHNcbiAqIGZvciB2YXJpb3VzIGNsaWVudCB1c2UgY2FzZXMuXG4gKi9cblxuLyoqXG4gKiBFeHBlY3RlZCBKU09OIFJQQyBzdHJ1Y3R1cmUgZm9yIHRva2VuIGFtb3VudHNcbiAqL1xuY29uc3QgVG9rZW5BbW91bnRSZXN1bHQgPSB0eXBlKHtcbiAgYW1vdW50OiBzdHJpbmcoKSxcbiAgdWlBbW91bnQ6IG51bGxhYmxlKG51bWJlcigpKSxcbiAgZGVjaW1hbHM6IG51bWJlcigpLFxuICB1aUFtb3VudFN0cmluZzogb3B0aW9uYWwoc3RyaW5nKCkpXG59KTtcblxuLyoqXG4gKiBUb2tlbiBhZGRyZXNzIGFuZCBiYWxhbmNlLlxuICovXG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldFRva2VuTGFyZ2VzdEFjY291bnRzXCIgbWVzc2FnZVxuICovXG5jb25zdCBHZXRUb2tlbkxhcmdlc3RBY2NvdW50c1Jlc3VsdCA9IGpzb25ScGNSZXN1bHRBbmRDb250ZXh0KGFycmF5KHR5cGUoe1xuICBhZGRyZXNzOiBQdWJsaWNLZXlGcm9tU3RyaW5nLFxuICBhbW91bnQ6IHN0cmluZygpLFxuICB1aUFtb3VudDogbnVsbGFibGUobnVtYmVyKCkpLFxuICBkZWNpbWFsczogbnVtYmVyKCksXG4gIHVpQW1vdW50U3RyaW5nOiBvcHRpb25hbChzdHJpbmcoKSlcbn0pKSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldFRva2VuQWNjb3VudHNCeU93bmVyXCIgbWVzc2FnZVxuICovXG5jb25zdCBHZXRUb2tlbkFjY291bnRzQnlPd25lciA9IGpzb25ScGNSZXN1bHRBbmRDb250ZXh0KGFycmF5KHR5cGUoe1xuICBwdWJrZXk6IFB1YmxpY0tleUZyb21TdHJpbmcsXG4gIGFjY291bnQ6IHR5cGUoe1xuICAgIGV4ZWN1dGFibGU6IGJvb2xlYW4oKSxcbiAgICBvd25lcjogUHVibGljS2V5RnJvbVN0cmluZyxcbiAgICBsYW1wb3J0czogbnVtYmVyKCksXG4gICAgZGF0YTogQnVmZmVyRnJvbVJhd0FjY291bnREYXRhLFxuICAgIHJlbnRFcG9jaDogbnVtYmVyKClcbiAgfSlcbn0pKSk7XG5jb25zdCBQYXJzZWRBY2NvdW50RGF0YVJlc3VsdCA9IHR5cGUoe1xuICBwcm9ncmFtOiBzdHJpbmcoKSxcbiAgcGFyc2VkOiB1bmtub3duKCksXG4gIHNwYWNlOiBudW1iZXIoKVxufSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldFRva2VuQWNjb3VudHNCeU93bmVyXCIgbWVzc2FnZSB3aXRoIHBhcnNlZCBkYXRhXG4gKi9cbmNvbnN0IEdldFBhcnNlZFRva2VuQWNjb3VudHNCeU93bmVyID0ganNvblJwY1Jlc3VsdEFuZENvbnRleHQoYXJyYXkodHlwZSh7XG4gIHB1YmtleTogUHVibGljS2V5RnJvbVN0cmluZyxcbiAgYWNjb3VudDogdHlwZSh7XG4gICAgZXhlY3V0YWJsZTogYm9vbGVhbigpLFxuICAgIG93bmVyOiBQdWJsaWNLZXlGcm9tU3RyaW5nLFxuICAgIGxhbXBvcnRzOiBudW1iZXIoKSxcbiAgICBkYXRhOiBQYXJzZWRBY2NvdW50RGF0YVJlc3VsdCxcbiAgICByZW50RXBvY2g6IG51bWJlcigpXG4gIH0pXG59KSkpO1xuXG4vKipcbiAqIFBhaXIgb2YgYW4gYWNjb3VudCBhZGRyZXNzIGFuZCBpdHMgYmFsYW5jZVxuICovXG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldExhcmdlc3RBY2NvdW50c1wiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0TGFyZ2VzdEFjY291bnRzUnBjUmVzdWx0ID0ganNvblJwY1Jlc3VsdEFuZENvbnRleHQoYXJyYXkodHlwZSh7XG4gIGxhbXBvcnRzOiBudW1iZXIoKSxcbiAgYWRkcmVzczogUHVibGljS2V5RnJvbVN0cmluZ1xufSkpKTtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgQWNjb3VudEluZm9SZXN1bHQgPSB0eXBlKHtcbiAgZXhlY3V0YWJsZTogYm9vbGVhbigpLFxuICBvd25lcjogUHVibGljS2V5RnJvbVN0cmluZyxcbiAgbGFtcG9ydHM6IG51bWJlcigpLFxuICBkYXRhOiBCdWZmZXJGcm9tUmF3QWNjb3VudERhdGEsXG4gIHJlbnRFcG9jaDogbnVtYmVyKClcbn0pO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBLZXllZEFjY291bnRJbmZvUmVzdWx0ID0gdHlwZSh7XG4gIHB1YmtleTogUHVibGljS2V5RnJvbVN0cmluZyxcbiAgYWNjb3VudDogQWNjb3VudEluZm9SZXN1bHRcbn0pO1xuY29uc3QgUGFyc2VkT3JSYXdBY2NvdW50RGF0YSA9IGNvZXJjZSh1bmlvbihbaW5zdGFuY2UoQnVmZmVyKSwgUGFyc2VkQWNjb3VudERhdGFSZXN1bHRdKSwgdW5pb24oW1Jhd0FjY291bnREYXRhUmVzdWx0LCBQYXJzZWRBY2NvdW50RGF0YVJlc3VsdF0pLCB2YWx1ZSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiBjcmVhdGUodmFsdWUsIEJ1ZmZlckZyb21SYXdBY2NvdW50RGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59KTtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgUGFyc2VkQWNjb3VudEluZm9SZXN1bHQgPSB0eXBlKHtcbiAgZXhlY3V0YWJsZTogYm9vbGVhbigpLFxuICBvd25lcjogUHVibGljS2V5RnJvbVN0cmluZyxcbiAgbGFtcG9ydHM6IG51bWJlcigpLFxuICBkYXRhOiBQYXJzZWRPclJhd0FjY291bnREYXRhLFxuICByZW50RXBvY2g6IG51bWJlcigpXG59KTtcbmNvbnN0IEtleWVkUGFyc2VkQWNjb3VudEluZm9SZXN1bHQgPSB0eXBlKHtcbiAgcHVia2V5OiBQdWJsaWNLZXlGcm9tU3RyaW5nLFxuICBhY2NvdW50OiBQYXJzZWRBY2NvdW50SW5mb1Jlc3VsdFxufSk7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IFN0YWtlQWN0aXZhdGlvblJlc3VsdCA9IHR5cGUoe1xuICBzdGF0ZTogdW5pb24oW2xpdGVyYWwoJ2FjdGl2ZScpLCBsaXRlcmFsKCdpbmFjdGl2ZScpLCBsaXRlcmFsKCdhY3RpdmF0aW5nJyksIGxpdGVyYWwoJ2RlYWN0aXZhdGluZycpXSksXG4gIGFjdGl2ZTogbnVtYmVyKCksXG4gIGluYWN0aXZlOiBudW1iZXIoKVxufSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldENvbmZpcm1lZFNpZ25hdHVyZXNGb3JBZGRyZXNzMlwiIG1lc3NhZ2VcbiAqL1xuXG5jb25zdCBHZXRDb25maXJtZWRTaWduYXR1cmVzRm9yQWRkcmVzczJScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0KGFycmF5KHR5cGUoe1xuICBzaWduYXR1cmU6IHN0cmluZygpLFxuICBzbG90OiBudW1iZXIoKSxcbiAgZXJyOiBUcmFuc2FjdGlvbkVycm9yUmVzdWx0LFxuICBtZW1vOiBudWxsYWJsZShzdHJpbmcoKSksXG4gIGJsb2NrVGltZTogb3B0aW9uYWwobnVsbGFibGUobnVtYmVyKCkpKVxufSkpKTtcblxuLyoqXG4gKiBFeHBlY3RlZCBKU09OIFJQQyByZXNwb25zZSBmb3IgdGhlIFwiZ2V0U2lnbmF0dXJlc0ZvckFkZHJlc3NcIiBtZXNzYWdlXG4gKi9cbmNvbnN0IEdldFNpZ25hdHVyZXNGb3JBZGRyZXNzUnBjUmVzdWx0ID0ganNvblJwY1Jlc3VsdChhcnJheSh0eXBlKHtcbiAgc2lnbmF0dXJlOiBzdHJpbmcoKSxcbiAgc2xvdDogbnVtYmVyKCksXG4gIGVycjogVHJhbnNhY3Rpb25FcnJvclJlc3VsdCxcbiAgbWVtbzogbnVsbGFibGUoc3RyaW5nKCkpLFxuICBibG9ja1RpbWU6IG9wdGlvbmFsKG51bGxhYmxlKG51bWJlcigpKSlcbn0pKSk7XG5cbi8qKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJhY2NvdW50Tm90aWZpY2F0aW9uXCIgbWVzc2FnZVxuICovXG5jb25zdCBBY2NvdW50Tm90aWZpY2F0aW9uUmVzdWx0ID0gdHlwZSh7XG4gIHN1YnNjcmlwdGlvbjogbnVtYmVyKCksXG4gIHJlc3VsdDogbm90aWZpY2F0aW9uUmVzdWx0QW5kQ29udGV4dChBY2NvdW50SW5mb1Jlc3VsdClcbn0pO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBQcm9ncmFtQWNjb3VudEluZm9SZXN1bHQgPSB0eXBlKHtcbiAgcHVia2V5OiBQdWJsaWNLZXlGcm9tU3RyaW5nLFxuICBhY2NvdW50OiBBY2NvdW50SW5mb1Jlc3VsdFxufSk7XG5cbi8qKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJwcm9ncmFtTm90aWZpY2F0aW9uXCIgbWVzc2FnZVxuICovXG5jb25zdCBQcm9ncmFtQWNjb3VudE5vdGlmaWNhdGlvblJlc3VsdCA9IHR5cGUoe1xuICBzdWJzY3JpcHRpb246IG51bWJlcigpLFxuICByZXN1bHQ6IG5vdGlmaWNhdGlvblJlc3VsdEFuZENvbnRleHQoUHJvZ3JhbUFjY291bnRJbmZvUmVzdWx0KVxufSk7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IFNsb3RJbmZvUmVzdWx0ID0gdHlwZSh7XG4gIHBhcmVudDogbnVtYmVyKCksXG4gIHNsb3Q6IG51bWJlcigpLFxuICByb290OiBudW1iZXIoKVxufSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcInNsb3ROb3RpZmljYXRpb25cIiBtZXNzYWdlXG4gKi9cbmNvbnN0IFNsb3ROb3RpZmljYXRpb25SZXN1bHQgPSB0eXBlKHtcbiAgc3Vic2NyaXB0aW9uOiBudW1iZXIoKSxcbiAgcmVzdWx0OiBTbG90SW5mb1Jlc3VsdFxufSk7XG5cbi8qKlxuICogU2xvdCB1cGRhdGVzIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cmFja2luZyB0aGUgbGl2ZSBwcm9ncmVzcyBvZiBhIGNsdXN0ZXIuXG4gKiAtIGBcImZpcnN0U2hyZWRSZWNlaXZlZFwiYDogY29ubmVjdGVkIG5vZGUgcmVjZWl2ZWQgdGhlIGZpcnN0IHNocmVkIG9mIGEgYmxvY2suXG4gKiBJbmRpY2F0ZXMgdGhhdCBhIG5ldyBibG9jayB0aGF0IGlzIGJlaW5nIHByb2R1Y2VkLlxuICogLSBgXCJjb21wbGV0ZWRcImA6IGNvbm5lY3RlZCBub2RlIGhhcyByZWNlaXZlZCBhbGwgc2hyZWRzIG9mIGEgYmxvY2suIEluZGljYXRlc1xuICogYSBibG9jayB3YXMgcmVjZW50bHkgcHJvZHVjZWQuXG4gKiAtIGBcIm9wdGltaXN0aWNDb25maXJtYXRpb25cImA6IGJsb2NrIHdhcyBvcHRpbWlzdGljYWxseSBjb25maXJtZWQgYnkgdGhlXG4gKiBjbHVzdGVyLiBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0IGFuIG9wdGltaXN0aWMgY29uZmlybWF0aW9uIG5vdGlmaWNhdGlvblxuICogd2lsbCBiZSBzZW50IGZvciBldmVyeSBmaW5hbGl6ZWQgYmxvY2tzLlxuICogLSBgXCJyb290XCJgOiB0aGUgY29ubmVjdGVkIG5vZGUgcm9vdGVkIHRoaXMgYmxvY2suXG4gKiAtIGBcImNyZWF0ZWRCYW5rXCJgOiB0aGUgY29ubmVjdGVkIG5vZGUgaGFzIHN0YXJ0ZWQgdmFsaWRhdGluZyB0aGlzIGJsb2NrLlxuICogLSBgXCJmcm96ZW5cImA6IHRoZSBjb25uZWN0ZWQgbm9kZSBoYXMgdmFsaWRhdGVkIHRoaXMgYmxvY2suXG4gKiAtIGBcImRlYWRcImA6IHRoZSBjb25uZWN0ZWQgbm9kZSBmYWlsZWQgdG8gdmFsaWRhdGUgdGhpcyBibG9jay5cbiAqL1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBTbG90VXBkYXRlUmVzdWx0ID0gdW5pb24oW3R5cGUoe1xuICB0eXBlOiB1bmlvbihbbGl0ZXJhbCgnZmlyc3RTaHJlZFJlY2VpdmVkJyksIGxpdGVyYWwoJ2NvbXBsZXRlZCcpLCBsaXRlcmFsKCdvcHRpbWlzdGljQ29uZmlybWF0aW9uJyksIGxpdGVyYWwoJ3Jvb3QnKV0pLFxuICBzbG90OiBudW1iZXIoKSxcbiAgdGltZXN0YW1wOiBudW1iZXIoKVxufSksIHR5cGUoe1xuICB0eXBlOiBsaXRlcmFsKCdjcmVhdGVkQmFuaycpLFxuICBwYXJlbnQ6IG51bWJlcigpLFxuICBzbG90OiBudW1iZXIoKSxcbiAgdGltZXN0YW1wOiBudW1iZXIoKVxufSksIHR5cGUoe1xuICB0eXBlOiBsaXRlcmFsKCdmcm96ZW4nKSxcbiAgc2xvdDogbnVtYmVyKCksXG4gIHRpbWVzdGFtcDogbnVtYmVyKCksXG4gIHN0YXRzOiB0eXBlKHtcbiAgICBudW1UcmFuc2FjdGlvbkVudHJpZXM6IG51bWJlcigpLFxuICAgIG51bVN1Y2Nlc3NmdWxUcmFuc2FjdGlvbnM6IG51bWJlcigpLFxuICAgIG51bUZhaWxlZFRyYW5zYWN0aW9uczogbnVtYmVyKCksXG4gICAgbWF4VHJhbnNhY3Rpb25zUGVyRW50cnk6IG51bWJlcigpXG4gIH0pXG59KSwgdHlwZSh7XG4gIHR5cGU6IGxpdGVyYWwoJ2RlYWQnKSxcbiAgc2xvdDogbnVtYmVyKCksXG4gIHRpbWVzdGFtcDogbnVtYmVyKCksXG4gIGVycjogc3RyaW5nKClcbn0pXSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcInNsb3RzVXBkYXRlc05vdGlmaWNhdGlvblwiIG1lc3NhZ2VcbiAqL1xuY29uc3QgU2xvdFVwZGF0ZU5vdGlmaWNhdGlvblJlc3VsdCA9IHR5cGUoe1xuICBzdWJzY3JpcHRpb246IG51bWJlcigpLFxuICByZXN1bHQ6IFNsb3RVcGRhdGVSZXN1bHRcbn0pO1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJzaWduYXR1cmVOb3RpZmljYXRpb25cIiBtZXNzYWdlXG4gKi9cbmNvbnN0IFNpZ25hdHVyZU5vdGlmaWNhdGlvblJlc3VsdCA9IHR5cGUoe1xuICBzdWJzY3JpcHRpb246IG51bWJlcigpLFxuICByZXN1bHQ6IG5vdGlmaWNhdGlvblJlc3VsdEFuZENvbnRleHQodW5pb24oW1NpZ25hdHVyZVN0YXR1c1Jlc3VsdCwgU2lnbmF0dXJlUmVjZWl2ZWRSZXN1bHRdKSlcbn0pO1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJyb290Tm90aWZpY2F0aW9uXCIgbWVzc2FnZVxuICovXG5jb25zdCBSb290Tm90aWZpY2F0aW9uUmVzdWx0ID0gdHlwZSh7XG4gIHN1YnNjcmlwdGlvbjogbnVtYmVyKCksXG4gIHJlc3VsdDogbnVtYmVyKClcbn0pO1xuY29uc3QgQ29udGFjdEluZm9SZXN1bHQgPSB0eXBlKHtcbiAgcHVia2V5OiBzdHJpbmcoKSxcbiAgZ29zc2lwOiBudWxsYWJsZShzdHJpbmcoKSksXG4gIHRwdTogbnVsbGFibGUoc3RyaW5nKCkpLFxuICBycGM6IG51bGxhYmxlKHN0cmluZygpKSxcbiAgdmVyc2lvbjogbnVsbGFibGUoc3RyaW5nKCkpXG59KTtcbmNvbnN0IFZvdGVBY2NvdW50SW5mb1Jlc3VsdCA9IHR5cGUoe1xuICB2b3RlUHVia2V5OiBzdHJpbmcoKSxcbiAgbm9kZVB1YmtleTogc3RyaW5nKCksXG4gIGFjdGl2YXRlZFN0YWtlOiBudW1iZXIoKSxcbiAgZXBvY2hWb3RlQWNjb3VudDogYm9vbGVhbigpLFxuICBlcG9jaENyZWRpdHM6IGFycmF5KHR1cGxlKFtudW1iZXIoKSwgbnVtYmVyKCksIG51bWJlcigpXSkpLFxuICBjb21taXNzaW9uOiBudW1iZXIoKSxcbiAgbGFzdFZvdGU6IG51bWJlcigpLFxuICByb290U2xvdDogbnVsbGFibGUobnVtYmVyKCkpXG59KTtcblxuLyoqXG4gKiBFeHBlY3RlZCBKU09OIFJQQyByZXNwb25zZSBmb3IgdGhlIFwiZ2V0Vm90ZUFjY291bnRzXCIgbWVzc2FnZVxuICovXG5jb25zdCBHZXRWb3RlQWNjb3VudHMgPSBqc29uUnBjUmVzdWx0KHR5cGUoe1xuICBjdXJyZW50OiBhcnJheShWb3RlQWNjb3VudEluZm9SZXN1bHQpLFxuICBkZWxpbnF1ZW50OiBhcnJheShWb3RlQWNjb3VudEluZm9SZXN1bHQpXG59KSk7XG5jb25zdCBDb25maXJtYXRpb25TdGF0dXMgPSB1bmlvbihbbGl0ZXJhbCgncHJvY2Vzc2VkJyksIGxpdGVyYWwoJ2NvbmZpcm1lZCcpLCBsaXRlcmFsKCdmaW5hbGl6ZWQnKV0pO1xuY29uc3QgU2lnbmF0dXJlU3RhdHVzUmVzcG9uc2UgPSB0eXBlKHtcbiAgc2xvdDogbnVtYmVyKCksXG4gIGNvbmZpcm1hdGlvbnM6IG51bGxhYmxlKG51bWJlcigpKSxcbiAgZXJyOiBUcmFuc2FjdGlvbkVycm9yUmVzdWx0LFxuICBjb25maXJtYXRpb25TdGF0dXM6IG9wdGlvbmFsKENvbmZpcm1hdGlvblN0YXR1cylcbn0pO1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJnZXRTaWduYXR1cmVTdGF0dXNlc1wiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0U2lnbmF0dXJlU3RhdHVzZXNScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0QW5kQ29udGV4dChhcnJheShudWxsYWJsZShTaWduYXR1cmVTdGF0dXNSZXNwb25zZSkpKTtcblxuLyoqXG4gKiBFeHBlY3RlZCBKU09OIFJQQyByZXNwb25zZSBmb3IgdGhlIFwiZ2V0TWluaW11bUJhbGFuY2VGb3JSZW50RXhlbXB0aW9uXCIgbWVzc2FnZVxuICovXG5jb25zdCBHZXRNaW5pbXVtQmFsYW5jZUZvclJlbnRFeGVtcHRpb25ScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0KG51bWJlcigpKTtcbmNvbnN0IEFkZHJlc3NUYWJsZUxvb2t1cFN0cnVjdCA9IHR5cGUoe1xuICBhY2NvdW50S2V5OiBQdWJsaWNLZXlGcm9tU3RyaW5nLFxuICB3cml0YWJsZUluZGV4ZXM6IGFycmF5KG51bWJlcigpKSxcbiAgcmVhZG9ubHlJbmRleGVzOiBhcnJheShudW1iZXIoKSlcbn0pO1xuY29uc3QgQ29uZmlybWVkVHJhbnNhY3Rpb25SZXN1bHQgPSB0eXBlKHtcbiAgc2lnbmF0dXJlczogYXJyYXkoc3RyaW5nKCkpLFxuICBtZXNzYWdlOiB0eXBlKHtcbiAgICBhY2NvdW50S2V5czogYXJyYXkoc3RyaW5nKCkpLFxuICAgIGhlYWRlcjogdHlwZSh7XG4gICAgICBudW1SZXF1aXJlZFNpZ25hdHVyZXM6IG51bWJlcigpLFxuICAgICAgbnVtUmVhZG9ubHlTaWduZWRBY2NvdW50czogbnVtYmVyKCksXG4gICAgICBudW1SZWFkb25seVVuc2lnbmVkQWNjb3VudHM6IG51bWJlcigpXG4gICAgfSksXG4gICAgaW5zdHJ1Y3Rpb25zOiBhcnJheSh0eXBlKHtcbiAgICAgIGFjY291bnRzOiBhcnJheShudW1iZXIoKSksXG4gICAgICBkYXRhOiBzdHJpbmcoKSxcbiAgICAgIHByb2dyYW1JZEluZGV4OiBudW1iZXIoKVxuICAgIH0pKSxcbiAgICByZWNlbnRCbG9ja2hhc2g6IHN0cmluZygpLFxuICAgIGFkZHJlc3NUYWJsZUxvb2t1cHM6IG9wdGlvbmFsKGFycmF5KEFkZHJlc3NUYWJsZUxvb2t1cFN0cnVjdCkpXG4gIH0pXG59KTtcbmNvbnN0IEFubm90YXRlZEFjY291bnRLZXkgPSB0eXBlKHtcbiAgcHVia2V5OiBQdWJsaWNLZXlGcm9tU3RyaW5nLFxuICBzaWduZXI6IGJvb2xlYW4oKSxcbiAgd3JpdGFibGU6IGJvb2xlYW4oKSxcbiAgc291cmNlOiBvcHRpb25hbCh1bmlvbihbbGl0ZXJhbCgndHJhbnNhY3Rpb24nKSwgbGl0ZXJhbCgnbG9va3VwVGFibGUnKV0pKVxufSk7XG5jb25zdCBDb25maXJtZWRUcmFuc2FjdGlvbkFjY291bnRzTW9kZVJlc3VsdCA9IHR5cGUoe1xuICBhY2NvdW50S2V5czogYXJyYXkoQW5ub3RhdGVkQWNjb3VudEtleSksXG4gIHNpZ25hdHVyZXM6IGFycmF5KHN0cmluZygpKVxufSk7XG5jb25zdCBQYXJzZWRJbnN0cnVjdGlvblJlc3VsdCA9IHR5cGUoe1xuICBwYXJzZWQ6IHVua25vd24oKSxcbiAgcHJvZ3JhbTogc3RyaW5nKCksXG4gIHByb2dyYW1JZDogUHVibGljS2V5RnJvbVN0cmluZ1xufSk7XG5jb25zdCBSYXdJbnN0cnVjdGlvblJlc3VsdCA9IHR5cGUoe1xuICBhY2NvdW50czogYXJyYXkoUHVibGljS2V5RnJvbVN0cmluZyksXG4gIGRhdGE6IHN0cmluZygpLFxuICBwcm9ncmFtSWQ6IFB1YmxpY0tleUZyb21TdHJpbmdcbn0pO1xuY29uc3QgSW5zdHJ1Y3Rpb25SZXN1bHQgPSB1bmlvbihbUmF3SW5zdHJ1Y3Rpb25SZXN1bHQsIFBhcnNlZEluc3RydWN0aW9uUmVzdWx0XSk7XG5jb25zdCBVbmtub3duSW5zdHJ1Y3Rpb25SZXN1bHQgPSB1bmlvbihbdHlwZSh7XG4gIHBhcnNlZDogdW5rbm93bigpLFxuICBwcm9ncmFtOiBzdHJpbmcoKSxcbiAgcHJvZ3JhbUlkOiBzdHJpbmcoKVxufSksIHR5cGUoe1xuICBhY2NvdW50czogYXJyYXkoc3RyaW5nKCkpLFxuICBkYXRhOiBzdHJpbmcoKSxcbiAgcHJvZ3JhbUlkOiBzdHJpbmcoKVxufSldKTtcbmNvbnN0IFBhcnNlZE9yUmF3SW5zdHJ1Y3Rpb24gPSBjb2VyY2UoSW5zdHJ1Y3Rpb25SZXN1bHQsIFVua25vd25JbnN0cnVjdGlvblJlc3VsdCwgdmFsdWUgPT4ge1xuICBpZiAoJ2FjY291bnRzJyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiBjcmVhdGUodmFsdWUsIFJhd0luc3RydWN0aW9uUmVzdWx0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gY3JlYXRlKHZhbHVlLCBQYXJzZWRJbnN0cnVjdGlvblJlc3VsdCk7XG4gIH1cbn0pO1xuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBQYXJzZWRDb25maXJtZWRUcmFuc2FjdGlvblJlc3VsdCA9IHR5cGUoe1xuICBzaWduYXR1cmVzOiBhcnJheShzdHJpbmcoKSksXG4gIG1lc3NhZ2U6IHR5cGUoe1xuICAgIGFjY291bnRLZXlzOiBhcnJheShBbm5vdGF0ZWRBY2NvdW50S2V5KSxcbiAgICBpbnN0cnVjdGlvbnM6IGFycmF5KFBhcnNlZE9yUmF3SW5zdHJ1Y3Rpb24pLFxuICAgIHJlY2VudEJsb2NraGFzaDogc3RyaW5nKCksXG4gICAgYWRkcmVzc1RhYmxlTG9va3Vwczogb3B0aW9uYWwobnVsbGFibGUoYXJyYXkoQWRkcmVzc1RhYmxlTG9va3VwU3RydWN0KSkpXG4gIH0pXG59KTtcbmNvbnN0IFRva2VuQmFsYW5jZVJlc3VsdCA9IHR5cGUoe1xuICBhY2NvdW50SW5kZXg6IG51bWJlcigpLFxuICBtaW50OiBzdHJpbmcoKSxcbiAgb3duZXI6IG9wdGlvbmFsKHN0cmluZygpKSxcbiAgcHJvZ3JhbUlkOiBvcHRpb25hbChzdHJpbmcoKSksXG4gIHVpVG9rZW5BbW91bnQ6IFRva2VuQW1vdW50UmVzdWx0XG59KTtcbmNvbnN0IExvYWRlZEFkZHJlc3Nlc1Jlc3VsdCA9IHR5cGUoe1xuICB3cml0YWJsZTogYXJyYXkoUHVibGljS2V5RnJvbVN0cmluZyksXG4gIHJlYWRvbmx5OiBhcnJheShQdWJsaWNLZXlGcm9tU3RyaW5nKVxufSk7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IENvbmZpcm1lZFRyYW5zYWN0aW9uTWV0YVJlc3VsdCA9IHR5cGUoe1xuICBlcnI6IFRyYW5zYWN0aW9uRXJyb3JSZXN1bHQsXG4gIGZlZTogbnVtYmVyKCksXG4gIGlubmVySW5zdHJ1Y3Rpb25zOiBvcHRpb25hbChudWxsYWJsZShhcnJheSh0eXBlKHtcbiAgICBpbmRleDogbnVtYmVyKCksXG4gICAgaW5zdHJ1Y3Rpb25zOiBhcnJheSh0eXBlKHtcbiAgICAgIGFjY291bnRzOiBhcnJheShudW1iZXIoKSksXG4gICAgICBkYXRhOiBzdHJpbmcoKSxcbiAgICAgIHByb2dyYW1JZEluZGV4OiBudW1iZXIoKVxuICAgIH0pKVxuICB9KSkpKSxcbiAgcHJlQmFsYW5jZXM6IGFycmF5KG51bWJlcigpKSxcbiAgcG9zdEJhbGFuY2VzOiBhcnJheShudW1iZXIoKSksXG4gIGxvZ01lc3NhZ2VzOiBvcHRpb25hbChudWxsYWJsZShhcnJheShzdHJpbmcoKSkpKSxcbiAgcHJlVG9rZW5CYWxhbmNlczogb3B0aW9uYWwobnVsbGFibGUoYXJyYXkoVG9rZW5CYWxhbmNlUmVzdWx0KSkpLFxuICBwb3N0VG9rZW5CYWxhbmNlczogb3B0aW9uYWwobnVsbGFibGUoYXJyYXkoVG9rZW5CYWxhbmNlUmVzdWx0KSkpLFxuICBsb2FkZWRBZGRyZXNzZXM6IG9wdGlvbmFsKExvYWRlZEFkZHJlc3Nlc1Jlc3VsdCksXG4gIGNvbXB1dGVVbml0c0NvbnN1bWVkOiBvcHRpb25hbChudW1iZXIoKSksXG4gIGNvc3RVbml0czogb3B0aW9uYWwobnVtYmVyKCkpXG59KTtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgUGFyc2VkQ29uZmlybWVkVHJhbnNhY3Rpb25NZXRhUmVzdWx0ID0gdHlwZSh7XG4gIGVycjogVHJhbnNhY3Rpb25FcnJvclJlc3VsdCxcbiAgZmVlOiBudW1iZXIoKSxcbiAgaW5uZXJJbnN0cnVjdGlvbnM6IG9wdGlvbmFsKG51bGxhYmxlKGFycmF5KHR5cGUoe1xuICAgIGluZGV4OiBudW1iZXIoKSxcbiAgICBpbnN0cnVjdGlvbnM6IGFycmF5KFBhcnNlZE9yUmF3SW5zdHJ1Y3Rpb24pXG4gIH0pKSkpLFxuICBwcmVCYWxhbmNlczogYXJyYXkobnVtYmVyKCkpLFxuICBwb3N0QmFsYW5jZXM6IGFycmF5KG51bWJlcigpKSxcbiAgbG9nTWVzc2FnZXM6IG9wdGlvbmFsKG51bGxhYmxlKGFycmF5KHN0cmluZygpKSkpLFxuICBwcmVUb2tlbkJhbGFuY2VzOiBvcHRpb25hbChudWxsYWJsZShhcnJheShUb2tlbkJhbGFuY2VSZXN1bHQpKSksXG4gIHBvc3RUb2tlbkJhbGFuY2VzOiBvcHRpb25hbChudWxsYWJsZShhcnJheShUb2tlbkJhbGFuY2VSZXN1bHQpKSksXG4gIGxvYWRlZEFkZHJlc3Nlczogb3B0aW9uYWwoTG9hZGVkQWRkcmVzc2VzUmVzdWx0KSxcbiAgY29tcHV0ZVVuaXRzQ29uc3VtZWQ6IG9wdGlvbmFsKG51bWJlcigpKSxcbiAgY29zdFVuaXRzOiBvcHRpb25hbChudW1iZXIoKSlcbn0pO1xuY29uc3QgVHJhbnNhY3Rpb25WZXJzaW9uU3RydWN0ID0gdW5pb24oW2xpdGVyYWwoMCksIGxpdGVyYWwoJ2xlZ2FjeScpXSk7XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmNvbnN0IFJld2FyZHNSZXN1bHQgPSB0eXBlKHtcbiAgcHVia2V5OiBzdHJpbmcoKSxcbiAgbGFtcG9ydHM6IG51bWJlcigpLFxuICBwb3N0QmFsYW5jZTogbnVsbGFibGUobnVtYmVyKCkpLFxuICByZXdhcmRUeXBlOiBudWxsYWJsZShzdHJpbmcoKSksXG4gIGNvbW1pc3Npb246IG9wdGlvbmFsKG51bGxhYmxlKG51bWJlcigpKSlcbn0pO1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJnZXRCbG9ja1wiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0QmxvY2tScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0KG51bGxhYmxlKHR5cGUoe1xuICBibG9ja2hhc2g6IHN0cmluZygpLFxuICBwcmV2aW91c0Jsb2NraGFzaDogc3RyaW5nKCksXG4gIHBhcmVudFNsb3Q6IG51bWJlcigpLFxuICB0cmFuc2FjdGlvbnM6IGFycmF5KHR5cGUoe1xuICAgIHRyYW5zYWN0aW9uOiBDb25maXJtZWRUcmFuc2FjdGlvblJlc3VsdCxcbiAgICBtZXRhOiBudWxsYWJsZShDb25maXJtZWRUcmFuc2FjdGlvbk1ldGFSZXN1bHQpLFxuICAgIHZlcnNpb246IG9wdGlvbmFsKFRyYW5zYWN0aW9uVmVyc2lvblN0cnVjdClcbiAgfSkpLFxuICByZXdhcmRzOiBvcHRpb25hbChhcnJheShSZXdhcmRzUmVzdWx0KSksXG4gIGJsb2NrVGltZTogbnVsbGFibGUobnVtYmVyKCkpLFxuICBibG9ja0hlaWdodDogbnVsbGFibGUobnVtYmVyKCkpXG59KSkpO1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJnZXRCbG9ja1wiIG1lc3NhZ2Ugd2hlbiBgdHJhbnNhY3Rpb25EZXRhaWxzYCBpcyBgbm9uZWBcbiAqL1xuY29uc3QgR2V0Tm9uZU1vZGVCbG9ja1JwY1Jlc3VsdCA9IGpzb25ScGNSZXN1bHQobnVsbGFibGUodHlwZSh7XG4gIGJsb2NraGFzaDogc3RyaW5nKCksXG4gIHByZXZpb3VzQmxvY2toYXNoOiBzdHJpbmcoKSxcbiAgcGFyZW50U2xvdDogbnVtYmVyKCksXG4gIHJld2FyZHM6IG9wdGlvbmFsKGFycmF5KFJld2FyZHNSZXN1bHQpKSxcbiAgYmxvY2tUaW1lOiBudWxsYWJsZShudW1iZXIoKSksXG4gIGJsb2NrSGVpZ2h0OiBudWxsYWJsZShudW1iZXIoKSlcbn0pKSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldEJsb2NrXCIgbWVzc2FnZSB3aGVuIGB0cmFuc2FjdGlvbkRldGFpbHNgIGlzIGBhY2NvdW50c2BcbiAqL1xuY29uc3QgR2V0QWNjb3VudHNNb2RlQmxvY2tScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0KG51bGxhYmxlKHR5cGUoe1xuICBibG9ja2hhc2g6IHN0cmluZygpLFxuICBwcmV2aW91c0Jsb2NraGFzaDogc3RyaW5nKCksXG4gIHBhcmVudFNsb3Q6IG51bWJlcigpLFxuICB0cmFuc2FjdGlvbnM6IGFycmF5KHR5cGUoe1xuICAgIHRyYW5zYWN0aW9uOiBDb25maXJtZWRUcmFuc2FjdGlvbkFjY291bnRzTW9kZVJlc3VsdCxcbiAgICBtZXRhOiBudWxsYWJsZShDb25maXJtZWRUcmFuc2FjdGlvbk1ldGFSZXN1bHQpLFxuICAgIHZlcnNpb246IG9wdGlvbmFsKFRyYW5zYWN0aW9uVmVyc2lvblN0cnVjdClcbiAgfSkpLFxuICByZXdhcmRzOiBvcHRpb25hbChhcnJheShSZXdhcmRzUmVzdWx0KSksXG4gIGJsb2NrVGltZTogbnVsbGFibGUobnVtYmVyKCkpLFxuICBibG9ja0hlaWdodDogbnVsbGFibGUobnVtYmVyKCkpXG59KSkpO1xuXG4vKipcbiAqIEV4cGVjdGVkIHBhcnNlZCBKU09OIFJQQyByZXNwb25zZSBmb3IgdGhlIFwiZ2V0QmxvY2tcIiBtZXNzYWdlXG4gKi9cbmNvbnN0IEdldFBhcnNlZEJsb2NrUnBjUmVzdWx0ID0ganNvblJwY1Jlc3VsdChudWxsYWJsZSh0eXBlKHtcbiAgYmxvY2toYXNoOiBzdHJpbmcoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IHN0cmluZygpLFxuICBwYXJlbnRTbG90OiBudW1iZXIoKSxcbiAgdHJhbnNhY3Rpb25zOiBhcnJheSh0eXBlKHtcbiAgICB0cmFuc2FjdGlvbjogUGFyc2VkQ29uZmlybWVkVHJhbnNhY3Rpb25SZXN1bHQsXG4gICAgbWV0YTogbnVsbGFibGUoUGFyc2VkQ29uZmlybWVkVHJhbnNhY3Rpb25NZXRhUmVzdWx0KSxcbiAgICB2ZXJzaW9uOiBvcHRpb25hbChUcmFuc2FjdGlvblZlcnNpb25TdHJ1Y3QpXG4gIH0pKSxcbiAgcmV3YXJkczogb3B0aW9uYWwoYXJyYXkoUmV3YXJkc1Jlc3VsdCkpLFxuICBibG9ja1RpbWU6IG51bGxhYmxlKG51bWJlcigpKSxcbiAgYmxvY2tIZWlnaHQ6IG51bGxhYmxlKG51bWJlcigpKVxufSkpKTtcblxuLyoqXG4gKiBFeHBlY3RlZCBwYXJzZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldEJsb2NrXCIgbWVzc2FnZSAgd2hlbiBgdHJhbnNhY3Rpb25EZXRhaWxzYCBpcyBgYWNjb3VudHNgXG4gKi9cbmNvbnN0IEdldFBhcnNlZEFjY291bnRzTW9kZUJsb2NrUnBjUmVzdWx0ID0ganNvblJwY1Jlc3VsdChudWxsYWJsZSh0eXBlKHtcbiAgYmxvY2toYXNoOiBzdHJpbmcoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IHN0cmluZygpLFxuICBwYXJlbnRTbG90OiBudW1iZXIoKSxcbiAgdHJhbnNhY3Rpb25zOiBhcnJheSh0eXBlKHtcbiAgICB0cmFuc2FjdGlvbjogQ29uZmlybWVkVHJhbnNhY3Rpb25BY2NvdW50c01vZGVSZXN1bHQsXG4gICAgbWV0YTogbnVsbGFibGUoUGFyc2VkQ29uZmlybWVkVHJhbnNhY3Rpb25NZXRhUmVzdWx0KSxcbiAgICB2ZXJzaW9uOiBvcHRpb25hbChUcmFuc2FjdGlvblZlcnNpb25TdHJ1Y3QpXG4gIH0pKSxcbiAgcmV3YXJkczogb3B0aW9uYWwoYXJyYXkoUmV3YXJkc1Jlc3VsdCkpLFxuICBibG9ja1RpbWU6IG51bGxhYmxlKG51bWJlcigpKSxcbiAgYmxvY2tIZWlnaHQ6IG51bGxhYmxlKG51bWJlcigpKVxufSkpKTtcblxuLyoqXG4gKiBFeHBlY3RlZCBwYXJzZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldEJsb2NrXCIgbWVzc2FnZSAgd2hlbiBgdHJhbnNhY3Rpb25EZXRhaWxzYCBpcyBgbm9uZWBcbiAqL1xuY29uc3QgR2V0UGFyc2VkTm9uZU1vZGVCbG9ja1JwY1Jlc3VsdCA9IGpzb25ScGNSZXN1bHQobnVsbGFibGUodHlwZSh7XG4gIGJsb2NraGFzaDogc3RyaW5nKCksXG4gIHByZXZpb3VzQmxvY2toYXNoOiBzdHJpbmcoKSxcbiAgcGFyZW50U2xvdDogbnVtYmVyKCksXG4gIHJld2FyZHM6IG9wdGlvbmFsKGFycmF5KFJld2FyZHNSZXN1bHQpKSxcbiAgYmxvY2tUaW1lOiBudWxsYWJsZShudW1iZXIoKSksXG4gIGJsb2NrSGVpZ2h0OiBudWxsYWJsZShudW1iZXIoKSlcbn0pKSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldENvbmZpcm1lZEJsb2NrXCIgbWVzc2FnZVxuICpcbiAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgc2luY2UgUlBDIHYxLjguMC4gUGxlYXNlIHVzZSB7QGxpbmsgR2V0QmxvY2tScGNSZXN1bHR9IGluc3RlYWQuXG4gKi9cbmNvbnN0IEdldENvbmZpcm1lZEJsb2NrUnBjUmVzdWx0ID0ganNvblJwY1Jlc3VsdChudWxsYWJsZSh0eXBlKHtcbiAgYmxvY2toYXNoOiBzdHJpbmcoKSxcbiAgcHJldmlvdXNCbG9ja2hhc2g6IHN0cmluZygpLFxuICBwYXJlbnRTbG90OiBudW1iZXIoKSxcbiAgdHJhbnNhY3Rpb25zOiBhcnJheSh0eXBlKHtcbiAgICB0cmFuc2FjdGlvbjogQ29uZmlybWVkVHJhbnNhY3Rpb25SZXN1bHQsXG4gICAgbWV0YTogbnVsbGFibGUoQ29uZmlybWVkVHJhbnNhY3Rpb25NZXRhUmVzdWx0KVxuICB9KSksXG4gIHJld2FyZHM6IG9wdGlvbmFsKGFycmF5KFJld2FyZHNSZXN1bHQpKSxcbiAgYmxvY2tUaW1lOiBudWxsYWJsZShudW1iZXIoKSlcbn0pKSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldEJsb2NrXCIgbWVzc2FnZVxuICovXG5jb25zdCBHZXRCbG9ja1NpZ25hdHVyZXNScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0KG51bGxhYmxlKHR5cGUoe1xuICBibG9ja2hhc2g6IHN0cmluZygpLFxuICBwcmV2aW91c0Jsb2NraGFzaDogc3RyaW5nKCksXG4gIHBhcmVudFNsb3Q6IG51bWJlcigpLFxuICBzaWduYXR1cmVzOiBhcnJheShzdHJpbmcoKSksXG4gIGJsb2NrVGltZTogbnVsbGFibGUobnVtYmVyKCkpXG59KSkpO1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJnZXRUcmFuc2FjdGlvblwiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0VHJhbnNhY3Rpb25ScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0KG51bGxhYmxlKHR5cGUoe1xuICBzbG90OiBudW1iZXIoKSxcbiAgbWV0YTogbnVsbGFibGUoQ29uZmlybWVkVHJhbnNhY3Rpb25NZXRhUmVzdWx0KSxcbiAgYmxvY2tUaW1lOiBvcHRpb25hbChudWxsYWJsZShudW1iZXIoKSkpLFxuICB0cmFuc2FjdGlvbjogQ29uZmlybWVkVHJhbnNhY3Rpb25SZXN1bHQsXG4gIHZlcnNpb246IG9wdGlvbmFsKFRyYW5zYWN0aW9uVmVyc2lvblN0cnVjdClcbn0pKSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgcGFyc2VkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJnZXRUcmFuc2FjdGlvblwiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0UGFyc2VkVHJhbnNhY3Rpb25ScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0KG51bGxhYmxlKHR5cGUoe1xuICBzbG90OiBudW1iZXIoKSxcbiAgdHJhbnNhY3Rpb246IFBhcnNlZENvbmZpcm1lZFRyYW5zYWN0aW9uUmVzdWx0LFxuICBtZXRhOiBudWxsYWJsZShQYXJzZWRDb25maXJtZWRUcmFuc2FjdGlvbk1ldGFSZXN1bHQpLFxuICBibG9ja1RpbWU6IG9wdGlvbmFsKG51bGxhYmxlKG51bWJlcigpKSksXG4gIHZlcnNpb246IG9wdGlvbmFsKFRyYW5zYWN0aW9uVmVyc2lvblN0cnVjdClcbn0pKSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImdldExhdGVzdEJsb2NraGFzaFwiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0TGF0ZXN0QmxvY2toYXNoUnBjUmVzdWx0ID0ganNvblJwY1Jlc3VsdEFuZENvbnRleHQodHlwZSh7XG4gIGJsb2NraGFzaDogc3RyaW5nKCksXG4gIGxhc3RWYWxpZEJsb2NrSGVpZ2h0OiBudW1iZXIoKVxufSkpO1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJpc0Jsb2NraGFzaFZhbGlkXCIgbWVzc2FnZVxuICovXG5jb25zdCBJc0Jsb2NraGFzaFZhbGlkUnBjUmVzdWx0ID0ganNvblJwY1Jlc3VsdEFuZENvbnRleHQoYm9vbGVhbigpKTtcbmNvbnN0IFBlcmZTYW1wbGVSZXN1bHQgPSB0eXBlKHtcbiAgc2xvdDogbnVtYmVyKCksXG4gIG51bVRyYW5zYWN0aW9uczogbnVtYmVyKCksXG4gIG51bVNsb3RzOiBudW1iZXIoKSxcbiAgc2FtcGxlUGVyaW9kU2VjczogbnVtYmVyKClcbn0pO1xuXG4vKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIFwiZ2V0UmVjZW50UGVyZm9ybWFuY2VTYW1wbGVzXCIgbWVzc2FnZVxuICovXG5jb25zdCBHZXRSZWNlbnRQZXJmb3JtYW5jZVNhbXBsZXNScGNSZXN1bHQgPSBqc29uUnBjUmVzdWx0KGFycmF5KFBlcmZTYW1wbGVSZXN1bHQpKTtcblxuLyoqXG4gKiBFeHBlY3RlZCBKU09OIFJQQyByZXNwb25zZSBmb3IgdGhlIFwiZ2V0RmVlQ2FsY3VsYXRvckZvckJsb2NraGFzaFwiIG1lc3NhZ2VcbiAqL1xuY29uc3QgR2V0RmVlQ2FsY3VsYXRvclJwY1Jlc3VsdCA9IGpzb25ScGNSZXN1bHRBbmRDb250ZXh0KG51bGxhYmxlKHR5cGUoe1xuICBmZWVDYWxjdWxhdG9yOiB0eXBlKHtcbiAgICBsYW1wb3J0c1BlclNpZ25hdHVyZTogbnVtYmVyKClcbiAgfSlcbn0pKSk7XG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcInJlcXVlc3RBaXJkcm9wXCIgbWVzc2FnZVxuICovXG5jb25zdCBSZXF1ZXN0QWlyZHJvcFJwY1Jlc3VsdCA9IGpzb25ScGNSZXN1bHQoc3RyaW5nKCkpO1xuXG4vKipcbiAqIEV4cGVjdGVkIEpTT04gUlBDIHJlc3BvbnNlIGZvciB0aGUgXCJzZW5kVHJhbnNhY3Rpb25cIiBtZXNzYWdlXG4gKi9cbmNvbnN0IFNlbmRUcmFuc2FjdGlvblJwY1Jlc3VsdCA9IGpzb25ScGNSZXN1bHQoc3RyaW5nKCkpO1xuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXRlc3Qgc2xvdCBiZWluZyBwcm9jZXNzZWQgYnkgYSBub2RlXG4gKi9cblxuLyoqXG4gKiBQYXJzZWQgYWNjb3VudCBkYXRhXG4gKi9cblxuLyoqXG4gKiBTdGFrZSBBY3RpdmF0aW9uIGRhdGFcbiAqL1xuXG4vKipcbiAqIERhdGEgc2xpY2UgYXJndW1lbnQgZm9yIGdldFByb2dyYW1BY2NvdW50c1xuICovXG5cbi8qKlxuICogTWVtb3J5IGNvbXBhcmlzb24gZmlsdGVyIGZvciBnZXRQcm9ncmFtQWNjb3VudHNcbiAqL1xuXG4vKipcbiAqIERhdGEgc2l6ZSBjb21wYXJpc29uIGZpbHRlciBmb3IgZ2V0UHJvZ3JhbUFjY291bnRzXG4gKi9cblxuLyoqXG4gKiBBIGZpbHRlciBvYmplY3QgZm9yIGdldFByb2dyYW1BY2NvdW50c1xuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGdldFByb2dyYW1BY2NvdW50cyByZXF1ZXN0c1xuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGdldFBhcnNlZFByb2dyYW1BY2NvdW50c1xuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGdldE11bHRpcGxlQWNjb3VudHNcbiAqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBgZ2V0U3Rha2VBY3RpdmF0aW9uYFxuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGBnZXRTdGFrZUFjdGl2YXRpb25gXG4gKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYGdldFN0YWtlQWN0aXZhdGlvbmBcbiAqL1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBgZ2V0Tm9uY2VgXG4gKi9cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYGdldE5vbmNlQW5kQ29udGV4dGBcbiAqL1xuXG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgYW4gYWNjb3VudFxuICovXG5cbi8qKlxuICogQWNjb3VudCBpbmZvcm1hdGlvbiBpZGVudGlmaWVkIGJ5IHB1YmtleVxuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIGFjY291bnQgY2hhbmdlIG5vdGlmaWNhdGlvbnNcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBwcm9ncmFtIGFjY291bnQgY2hhbmdlIG5vdGlmaWNhdGlvbnNcbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBzbG90IGNoYW5nZSBub3RpZmljYXRpb25zXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayBmdW5jdGlvbiBmb3Igc2xvdCB1cGRhdGUgbm90aWZpY2F0aW9uc1xuICovXG5cbi8qKlxuICogQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHNpZ25hdHVyZSBzdGF0dXMgbm90aWZpY2F0aW9uc1xuICovXG5cbi8qKlxuICogU2lnbmF0dXJlIHN0YXR1cyBub3RpZmljYXRpb24gd2l0aCB0cmFuc2FjdGlvbiByZXN1bHRcbiAqL1xuXG4vKipcbiAqIFNpZ25hdHVyZSByZWNlaXZlZCBub3RpZmljYXRpb25cbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBzaWduYXR1cmUgbm90aWZpY2F0aW9uc1xuICovXG5cbi8qKlxuICogU2lnbmF0dXJlIHN1YnNjcmlwdGlvbiBvcHRpb25zXG4gKi9cblxuLyoqXG4gKiBDYWxsYmFjayBmdW5jdGlvbiBmb3Igcm9vdCBjaGFuZ2Ugbm90aWZpY2F0aW9uc1xuICovXG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cbmNvbnN0IExvZ3NSZXN1bHQgPSB0eXBlKHtcbiAgZXJyOiBUcmFuc2FjdGlvbkVycm9yUmVzdWx0LFxuICBsb2dzOiBhcnJheShzdHJpbmcoKSksXG4gIHNpZ25hdHVyZTogc3RyaW5nKClcbn0pO1xuXG4vKipcbiAqIExvZ3MgcmVzdWx0LlxuICovXG5cbi8qKlxuICogRXhwZWN0ZWQgSlNPTiBSUEMgcmVzcG9uc2UgZm9yIHRoZSBcImxvZ3NOb3RpZmljYXRpb25cIiBtZXNzYWdlLlxuICovXG5jb25zdCBMb2dzTm90aWZpY2F0aW9uUmVzdWx0ID0gdHlwZSh7XG4gIHJlc3VsdDogbm90aWZpY2F0aW9uUmVzdWx0QW5kQ29udGV4dChMb2dzUmVzdWx0KSxcbiAgc3Vic2NyaXB0aW9uOiBudW1iZXIoKVxufSk7XG5cbi8qKlxuICogRmlsdGVyIGZvciBsb2cgc3Vic2NyaXB0aW9ucy5cbiAqL1xuXG4vKipcbiAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBsb2cgbm90aWZpY2F0aW9ucy5cbiAqL1xuXG4vKipcbiAqIFNpZ25hdHVyZSByZXN1bHRcbiAqL1xuXG4vKipcbiAqIFRyYW5zYWN0aW9uIGVycm9yXG4gKi9cblxuLyoqXG4gKiBUcmFuc2FjdGlvbiBjb25maXJtYXRpb24gc3RhdHVzXG4gKiA8cHJlPlxuICogICAncHJvY2Vzc2VkJzogVHJhbnNhY3Rpb24gbGFuZGVkIGluIGEgYmxvY2sgd2hpY2ggaGFzIHJlYWNoZWQgMSBjb25maXJtYXRpb24gYnkgdGhlIGNvbm5lY3RlZCBub2RlXG4gKiAgICdjb25maXJtZWQnOiBUcmFuc2FjdGlvbiBsYW5kZWQgaW4gYSBibG9jayB3aGljaCBoYXMgcmVhY2hlZCAxIGNvbmZpcm1hdGlvbiBieSB0aGUgY2x1c3RlclxuICogICAnZmluYWxpemVkJzogVHJhbnNhY3Rpb24gbGFuZGVkIGluIGEgYmxvY2sgd2hpY2ggaGFzIGJlZW4gZmluYWxpemVkIGJ5IHRoZSBjbHVzdGVyXG4gKiA8L3ByZT5cbiAqL1xuXG4vKipcbiAqIFNpZ25hdHVyZSBzdGF0dXNcbiAqL1xuXG4vKipcbiAqIEEgY29uZmlybWVkIHNpZ25hdHVyZSB3aXRoIGl0cyBzdGF0dXNcbiAqL1xuXG4vKipcbiAqIEFuIG9iamVjdCBkZWZpbmluZyBoZWFkZXJzIHRvIGJlIHBhc3NlZCB0byB0aGUgUlBDIHNlcnZlclxuICovXG5cbi8qKlxuICogVGhlIHR5cGUgb2YgdGhlIEphdmFTY3JpcHQgYGZldGNoKClgIEFQSVxuICovXG5cbi8qKlxuICogQSBjYWxsYmFjayB1c2VkIHRvIGF1Z21lbnQgdGhlIG91dGdvaW5nIEhUVFAgcmVxdWVzdFxuICovXG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgaW5zdGFudGlhdGluZyBhIENvbm5lY3Rpb25cbiAqL1xuXG4vKiogQGludGVybmFsICovXG5jb25zdCBDT01NT05fSFRUUF9IRUFERVJTID0ge1xuICAnc29sYW5hLWNsaWVudCc6IGBqcy8ke1wiMS4wLjAtbWFpbnRlbmFuY2VcIn1gXG59O1xuXG4vKipcbiAqIEEgY29ubmVjdGlvbiB0byBhIGZ1bGxub2RlIEpTT04gUlBDIGVuZHBvaW50XG4gKi9cbmNsYXNzIENvbm5lY3Rpb24ge1xuICAvKipcbiAgICogRXN0YWJsaXNoIGEgSlNPTiBSUEMgY29ubmVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gZW5kcG9pbnQgVVJMIHRvIHRoZSBmdWxsbm9kZSBKU09OIFJQQyBlbmRwb2ludFxuICAgKiBAcGFyYW0gY29tbWl0bWVudE9yQ29uZmlnIG9wdGlvbmFsIGRlZmF1bHQgY29tbWl0bWVudCBsZXZlbCBvciBvcHRpb25hbCBDb25uZWN0aW9uQ29uZmlnIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3RvcihlbmRwb2ludCwgX2NvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLl9jb21taXRtZW50ID0gdm9pZCAwO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLl9jb25maXJtVHJhbnNhY3Rpb25Jbml0aWFsVGltZW91dCA9IHZvaWQgMDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fcnBjRW5kcG9pbnQgPSB2b2lkIDA7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuX3JwY1dzRW5kcG9pbnQgPSB2b2lkIDA7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuX3JwY0NsaWVudCA9IHZvaWQgMDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fcnBjUmVxdWVzdCA9IHZvaWQgMDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fcnBjQmF0Y2hSZXF1ZXN0ID0gdm9pZCAwO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLl9ycGNXZWJTb2NrZXQgPSB2b2lkIDA7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIHRoaXMuX3JwY1dlYlNvY2tldENvbm5lY3RlZCA9IGZhbHNlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLl9ycGNXZWJTb2NrZXRIZWFydGJlYXQgPSBudWxsO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLl9ycGNXZWJTb2NrZXRJZGxlVGltZW91dCA9IG51bGw7XG4gICAgLyoqIEBpbnRlcm5hbFxuICAgICAqIEEgbnVtYmVyIHRoYXQgd2UgaW5jcmVtZW50IGV2ZXJ5IHRpbWUgYW4gYWN0aXZlIGNvbm5lY3Rpb24gY2xvc2VzLlxuICAgICAqIFVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNhbWUgc29ja2V0IGNvbm5lY3Rpb24gdGhhdCB3YXMgb3BlblxuICAgICAqIHdoZW4gYW4gYXN5bmMgb3BlcmF0aW9uIHN0YXJ0ZWQgaXMgdGhlIHNhbWUgb25lIHRoYXQncyBhY3RpdmUgd2hlblxuICAgICAqIGl0cyBjb250aW51YXRpb24gZmlyZXMuXG4gICAgICpcbiAgICAgKi9cbiAgICB0aGlzLl9ycGNXZWJTb2NrZXRHZW5lcmF0aW9uID0gMDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fZGlzYWJsZUJsb2NraGFzaENhY2hpbmcgPSBmYWxzZTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fcG9sbGluZ0Jsb2NraGFzaCA9IGZhbHNlO1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLl9ibG9ja2hhc2hJbmZvID0ge1xuICAgICAgbGF0ZXN0QmxvY2toYXNoOiBudWxsLFxuICAgICAgbGFzdEZldGNoOiAwLFxuICAgICAgdHJhbnNhY3Rpb25TaWduYXR1cmVzOiBbXSxcbiAgICAgIHNpbXVsYXRlZFNpZ25hdHVyZXM6IFtdXG4gICAgfTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fbmV4dENsaWVudFN1YnNjcmlwdGlvbklkID0gMDtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uRGlzcG9zZUZ1bmN0aW9uc0J5Q2xpZW50U3Vic2NyaXB0aW9uSWQgPSB7fTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uSGFzaEJ5Q2xpZW50U3Vic2NyaXB0aW9uSWQgPSB7fTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uU3RhdGVDaGFuZ2VDYWxsYmFja3NCeUhhc2ggPSB7fTtcbiAgICAvKiogQGludGVybmFsICovXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uQ2FsbGJhY2tzQnlTZXJ2ZXJTdWJzY3JpcHRpb25JZCA9IHt9O1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zQnlIYXNoID0ge307XG4gICAgLyoqXG4gICAgICogU3BlY2lhbCBjYXNlLlxuICAgICAqIEFmdGVyIGEgc2lnbmF0dXJlIGlzIHByb2Nlc3NlZCwgUlBDcyBhdXRvbWF0aWNhbGx5IGRpc3Bvc2Ugb2YgdGhlXG4gICAgICogc3Vic2NyaXB0aW9uIG9uIHRoZSBzZXJ2ZXIgc2lkZS4gV2UgbmVlZCB0byB0cmFjayB3aGljaCBvZiB0aGVzZVxuICAgICAqIHN1YnNjcmlwdGlvbnMgaGF2ZSBiZWVuIGRpc3Bvc2VkIGluIHN1Y2ggYSB3YXksIHNvIHRoYXQgd2Uga25vd1xuICAgICAqIHdoZXRoZXIgdGhlIGNsaWVudCBpcyBkZWFsaW5nIHdpdGggYSBub3QteWV0LXByb2Nlc3NlZCBzaWduYXR1cmVcbiAgICAgKiAoaW4gd2hpY2ggY2FzZSB3ZSBtdXN0IHRlYXIgZG93biB0aGUgc2VydmVyIHN1YnNjcmlwdGlvbikgb3IgYW5cbiAgICAgKiBhbHJlYWR5LXByb2Nlc3NlZCBzaWduYXR1cmUgKGluIHdoaWNoIGNhc2UgdGhlIGNsaWVudCBjYW4gc2ltcGx5XG4gICAgICogY2xlYXIgb3V0IHRoZSBzdWJzY3JpcHRpb24gbG9jYWxseSB3aXRob3V0IHRlbGxpbmcgdGhlIHNlcnZlcikuXG4gICAgICpcbiAgICAgKiBOT1RFOiBUaGVyZSBpcyBhIHByb3Bvc2FsIHRvIGVsaW1pbmF0ZSB0aGlzIHNwZWNpYWwgY2FzZSwgaGVyZTpcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vc29sYW5hLWxhYnMvc29sYW5hL2lzc3Vlcy8xODg5MlxuICAgICAqL1xuICAgIC8qKiBAaW50ZXJuYWwgKi9cbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zQXV0b0Rpc3Bvc2VkQnlScGMgPSBuZXcgU2V0KCk7XG4gICAgLypcbiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGJsb2NrIGhlaWdodCBvZiB0aGUgbm9kZVxuICAgICAqL1xuICAgIHRoaXMuZ2V0QmxvY2tIZWlnaHQgPSAoKCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdFByb21pc2VzID0ge307XG4gICAgICByZXR1cm4gYXN5bmMgY29tbWl0bWVudE9yQ29uZmlnID0+IHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIGNvbW1pdG1lbnQsXG4gICAgICAgICAgY29uZmlnXG4gICAgICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcoY29tbWl0bWVudE9yQ29uZmlnKTtcbiAgICAgICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbXSwgY29tbWl0bWVudCwgdW5kZWZpbmVkIC8qIGVuY29kaW5nICovLCBjb25maWcpO1xuICAgICAgICBjb25zdCByZXF1ZXN0SGFzaCA9IGZhc3RTdGFibGVTdHJpbmdpZnkoYXJncyk7XG4gICAgICAgIHJlcXVlc3RQcm9taXNlc1tyZXF1ZXN0SGFzaF0gPSByZXF1ZXN0UHJvbWlzZXNbcmVxdWVzdEhhc2hdID8/IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldEJsb2NrSGVpZ2h0JywgYXJncyk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBqc29uUnBjUmVzdWx0KG51bWJlcigpKSk7XG4gICAgICAgICAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IGJsb2NrIGhlaWdodCBpbmZvcm1hdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGRlbGV0ZSByZXF1ZXN0UHJvbWlzZXNbcmVxdWVzdEhhc2hdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkoKTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHJlcXVlc3RQcm9taXNlc1tyZXF1ZXN0SGFzaF07XG4gICAgICB9O1xuICAgIH0pKCk7XG4gICAgbGV0IHdzRW5kcG9pbnQ7XG4gICAgbGV0IGh0dHBIZWFkZXJzO1xuICAgIGxldCBmZXRjaDtcbiAgICBsZXQgZmV0Y2hNaWRkbGV3YXJlO1xuICAgIGxldCBkaXNhYmxlUmV0cnlPblJhdGVMaW1pdDtcbiAgICBsZXQgaHR0cEFnZW50O1xuICAgIGlmIChfY29tbWl0bWVudE9yQ29uZmlnICYmIHR5cGVvZiBfY29tbWl0bWVudE9yQ29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5fY29tbWl0bWVudCA9IF9jb21taXRtZW50T3JDb25maWc7XG4gICAgfSBlbHNlIGlmIChfY29tbWl0bWVudE9yQ29uZmlnKSB7XG4gICAgICB0aGlzLl9jb21taXRtZW50ID0gX2NvbW1pdG1lbnRPckNvbmZpZy5jb21taXRtZW50O1xuICAgICAgdGhpcy5fY29uZmlybVRyYW5zYWN0aW9uSW5pdGlhbFRpbWVvdXQgPSBfY29tbWl0bWVudE9yQ29uZmlnLmNvbmZpcm1UcmFuc2FjdGlvbkluaXRpYWxUaW1lb3V0O1xuICAgICAgd3NFbmRwb2ludCA9IF9jb21taXRtZW50T3JDb25maWcud3NFbmRwb2ludDtcbiAgICAgIGh0dHBIZWFkZXJzID0gX2NvbW1pdG1lbnRPckNvbmZpZy5odHRwSGVhZGVycztcbiAgICAgIGZldGNoID0gX2NvbW1pdG1lbnRPckNvbmZpZy5mZXRjaDtcbiAgICAgIGZldGNoTWlkZGxld2FyZSA9IF9jb21taXRtZW50T3JDb25maWcuZmV0Y2hNaWRkbGV3YXJlO1xuICAgICAgZGlzYWJsZVJldHJ5T25SYXRlTGltaXQgPSBfY29tbWl0bWVudE9yQ29uZmlnLmRpc2FibGVSZXRyeU9uUmF0ZUxpbWl0O1xuICAgICAgaHR0cEFnZW50ID0gX2NvbW1pdG1lbnRPckNvbmZpZy5odHRwQWdlbnQ7XG4gICAgfVxuICAgIHRoaXMuX3JwY0VuZHBvaW50ID0gYXNzZXJ0RW5kcG9pbnRVcmwoZW5kcG9pbnQpO1xuICAgIHRoaXMuX3JwY1dzRW5kcG9pbnQgPSB3c0VuZHBvaW50IHx8IG1ha2VXZWJzb2NrZXRVcmwoZW5kcG9pbnQpO1xuICAgIHRoaXMuX3JwY0NsaWVudCA9IGNyZWF0ZVJwY0NsaWVudChlbmRwb2ludCwgaHR0cEhlYWRlcnMsIGZldGNoLCBmZXRjaE1pZGRsZXdhcmUsIGRpc2FibGVSZXRyeU9uUmF0ZUxpbWl0LCBodHRwQWdlbnQpO1xuICAgIHRoaXMuX3JwY1JlcXVlc3QgPSBjcmVhdGVScGNSZXF1ZXN0KHRoaXMuX3JwY0NsaWVudCk7XG4gICAgdGhpcy5fcnBjQmF0Y2hSZXF1ZXN0ID0gY3JlYXRlUnBjQmF0Y2hSZXF1ZXN0KHRoaXMuX3JwY0NsaWVudCk7XG4gICAgdGhpcy5fcnBjV2ViU29ja2V0ID0gbmV3IFJwY1dlYlNvY2tldENsaWVudCh0aGlzLl9ycGNXc0VuZHBvaW50LCB7XG4gICAgICBhdXRvY29ubmVjdDogZmFsc2UsXG4gICAgICBtYXhfcmVjb25uZWN0czogSW5maW5pdHlcbiAgICB9KTtcbiAgICB0aGlzLl9ycGNXZWJTb2NrZXQub24oJ29wZW4nLCB0aGlzLl93c09uT3Blbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ycGNXZWJTb2NrZXQub24oJ2Vycm9yJywgdGhpcy5fd3NPbkVycm9yLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3JwY1dlYlNvY2tldC5vbignY2xvc2UnLCB0aGlzLl93c09uQ2xvc2UuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnBjV2ViU29ja2V0Lm9uKCdhY2NvdW50Tm90aWZpY2F0aW9uJywgdGhpcy5fd3NPbkFjY291bnROb3RpZmljYXRpb24uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fcnBjV2ViU29ja2V0Lm9uKCdwcm9ncmFtTm90aWZpY2F0aW9uJywgdGhpcy5fd3NPblByb2dyYW1BY2NvdW50Tm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3JwY1dlYlNvY2tldC5vbignc2xvdE5vdGlmaWNhdGlvbicsIHRoaXMuX3dzT25TbG90Tm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3JwY1dlYlNvY2tldC5vbignc2xvdHNVcGRhdGVzTm90aWZpY2F0aW9uJywgdGhpcy5fd3NPblNsb3RVcGRhdGVzTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX3JwY1dlYlNvY2tldC5vbignc2lnbmF0dXJlTm90aWZpY2F0aW9uJywgdGhpcy5fd3NPblNpZ25hdHVyZU5vdGlmaWNhdGlvbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ycGNXZWJTb2NrZXQub24oJ3Jvb3ROb3RpZmljYXRpb24nLCB0aGlzLl93c09uUm9vdE5vdGlmaWNhdGlvbi5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLl9ycGNXZWJTb2NrZXQub24oJ2xvZ3NOb3RpZmljYXRpb24nLCB0aGlzLl93c09uTG9nc05vdGlmaWNhdGlvbi5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGVmYXVsdCBjb21taXRtZW50IHVzZWQgZm9yIHJlcXVlc3RzXG4gICAqL1xuICBnZXQgY29tbWl0bWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fY29tbWl0bWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgUlBDIGVuZHBvaW50XG4gICAqL1xuICBnZXQgcnBjRW5kcG9pbnQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3JwY0VuZHBvaW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBiYWxhbmNlIGZvciB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXksIHJldHVybiB3aXRoIGNvbnRleHRcbiAgICovXG4gIGFzeW5jIGdldEJhbGFuY2VBbmRDb250ZXh0KHB1YmxpY0tleSwgY29tbWl0bWVudE9yQ29uZmlnKSB7XG4gICAgLyoqIEBpbnRlcm5hbCAqL1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWdcbiAgICB9ID0gZXh0cmFjdENvbW1pdG1lbnRGcm9tQ29uZmlnKGNvbW1pdG1lbnRPckNvbmZpZyk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbcHVibGljS2V5LnRvQmFzZTU4KCldLCBjb21taXRtZW50LCB1bmRlZmluZWQgLyogZW5jb2RpbmcgKi8sIGNvbmZpZyk7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0QmFsYW5jZScsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIGpzb25ScGNSZXN1bHRBbmRDb250ZXh0KG51bWJlcigpKSk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgYGZhaWxlZCB0byBnZXQgYmFsYW5jZSBmb3IgJHtwdWJsaWNLZXkudG9CYXNlNTgoKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGJhbGFuY2UgZm9yIHRoZSBzcGVjaWZpZWQgcHVibGljIGtleVxuICAgKi9cbiAgYXN5bmMgZ2V0QmFsYW5jZShwdWJsaWNLZXksIGNvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldEJhbGFuY2VBbmRDb250ZXh0KHB1YmxpY0tleSwgY29tbWl0bWVudE9yQ29uZmlnKS50aGVuKHggPT4geC52YWx1ZSkuY2F0Y2goZSA9PiB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBnZXQgYmFsYW5jZSBvZiBhY2NvdW50ICcgKyBwdWJsaWNLZXkudG9CYXNlNTgoKSArICc6ICcgKyBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgZXN0aW1hdGVkIHByb2R1Y3Rpb24gdGltZSBvZiBhIGJsb2NrXG4gICAqL1xuICBhc3luYyBnZXRCbG9ja1RpbWUoc2xvdCkge1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldEJsb2NrVGltZScsIFtzbG90XSk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywganNvblJwY1Jlc3VsdChudWxsYWJsZShudW1iZXIoKSkpKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCBgZmFpbGVkIHRvIGdldCBibG9jayB0aW1lIGZvciBzbG90ICR7c2xvdH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGxvd2VzdCBzbG90IHRoYXQgdGhlIG5vZGUgaGFzIGluZm9ybWF0aW9uIGFib3V0IGluIGl0cyBsZWRnZXIuXG4gICAqIFRoaXMgdmFsdWUgbWF5IGluY3JlYXNlIG92ZXIgdGltZSBpZiB0aGUgbm9kZSBpcyBjb25maWd1cmVkIHRvIHB1cmdlIG9sZGVyIGxlZGdlciBkYXRhXG4gICAqL1xuICBhc3luYyBnZXRNaW5pbXVtTGVkZ2VyU2xvdCgpIHtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdtaW5pbXVtTGVkZ2VyU2xvdCcsIFtdKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBqc29uUnBjUmVzdWx0KG51bWJlcigpKSk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgbWluaW11bSBsZWRnZXIgc2xvdCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgc2xvdCBvZiB0aGUgbG93ZXN0IGNvbmZpcm1lZCBibG9jayB0aGF0IGhhcyBub3QgYmVlbiBwdXJnZWQgZnJvbSB0aGUgbGVkZ2VyXG4gICAqL1xuICBhc3luYyBnZXRGaXJzdEF2YWlsYWJsZUJsb2NrKCkge1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldEZpcnN0QXZhaWxhYmxlQmxvY2snLCBbXSk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgU2xvdFJwY1Jlc3VsdCk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgZmlyc3QgYXZhaWxhYmxlIGJsb2NrJyk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN1cHBseVxuICAgKi9cbiAgYXN5bmMgZ2V0U3VwcGx5KGNvbmZpZykge1xuICAgIGxldCBjb25maWdBcmcgPSB7fTtcbiAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbmZpZ0FyZyA9IHtcbiAgICAgICAgY29tbWl0bWVudDogY29uZmlnXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoY29uZmlnKSB7XG4gICAgICBjb25maWdBcmcgPSB7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgY29tbWl0bWVudDogY29uZmlnICYmIGNvbmZpZy5jb21taXRtZW50IHx8IHRoaXMuY29tbWl0bWVudFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZmlnQXJnID0ge1xuICAgICAgICBjb21taXRtZW50OiB0aGlzLmNvbW1pdG1lbnRcbiAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldFN1cHBseScsIFtjb25maWdBcmddKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXRTdXBwbHlScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IHN1cHBseScpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgY3VycmVudCBzdXBwbHkgb2YgYSB0b2tlbiBtaW50XG4gICAqL1xuICBhc3luYyBnZXRUb2tlblN1cHBseSh0b2tlbk1pbnRBZGRyZXNzLCBjb21taXRtZW50KSB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbdG9rZW5NaW50QWRkcmVzcy50b0Jhc2U1OCgpXSwgY29tbWl0bWVudCk7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0VG9rZW5TdXBwbHknLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBqc29uUnBjUmVzdWx0QW5kQ29udGV4dChUb2tlbkFtb3VudFJlc3VsdCkpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IHRva2VuIHN1cHBseScpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgY3VycmVudCBiYWxhbmNlIG9mIGEgdG9rZW4gYWNjb3VudFxuICAgKi9cbiAgYXN5bmMgZ2V0VG9rZW5BY2NvdW50QmFsYW5jZSh0b2tlbkFkZHJlc3MsIGNvbW1pdG1lbnQpIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzKFt0b2tlbkFkZHJlc3MudG9CYXNlNTgoKV0sIGNvbW1pdG1lbnQpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldFRva2VuQWNjb3VudEJhbGFuY2UnLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBqc29uUnBjUmVzdWx0QW5kQ29udGV4dChUb2tlbkFtb3VudFJlc3VsdCkpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IHRva2VuIGFjY291bnQgYmFsYW5jZScpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbGwgdGhlIHRva2VuIGFjY291bnRzIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWNjb3VudFxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJwY1Jlc3BvbnNlQW5kQ29udGV4dDxHZXRQcm9ncmFtQWNjb3VudHNSZXNwb25zZT59XG4gICAqL1xuICBhc3luYyBnZXRUb2tlbkFjY291bnRzQnlPd25lcihvd25lckFkZHJlc3MsIGZpbHRlciwgY29tbWl0bWVudE9yQ29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tbWl0bWVudCxcbiAgICAgIGNvbmZpZ1xuICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcoY29tbWl0bWVudE9yQ29uZmlnKTtcbiAgICBsZXQgX2FyZ3MgPSBbb3duZXJBZGRyZXNzLnRvQmFzZTU4KCldO1xuICAgIGlmICgnbWludCcgaW4gZmlsdGVyKSB7XG4gICAgICBfYXJncy5wdXNoKHtcbiAgICAgICAgbWludDogZmlsdGVyLm1pbnQudG9CYXNlNTgoKVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9hcmdzLnB1c2goe1xuICAgICAgICBwcm9ncmFtSWQ6IGZpbHRlci5wcm9ncmFtSWQudG9CYXNlNTgoKVxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3MoX2FyZ3MsIGNvbW1pdG1lbnQsICdiYXNlNjQnLCBjb25maWcpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldFRva2VuQWNjb3VudHNCeU93bmVyJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0VG9rZW5BY2NvdW50c0J5T3duZXIpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsIGBmYWlsZWQgdG8gZ2V0IHRva2VuIGFjY291bnRzIG93bmVkIGJ5IGFjY291bnQgJHtvd25lckFkZHJlc3MudG9CYXNlNTgoKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggcGFyc2VkIHRva2VuIGFjY291bnRzIG93bmVkIGJ5IHRoZSBzcGVjaWZpZWQgYWNjb3VudFxuICAgKlxuICAgKiBAcmV0dXJuIHtQcm9taXNlPFJwY1Jlc3BvbnNlQW5kQ29udGV4dDxBcnJheTx7cHVia2V5OiBQdWJsaWNLZXksIGFjY291bnQ6IEFjY291bnRJbmZvPFBhcnNlZEFjY291bnREYXRhPn0+Pj59XG4gICAqL1xuICBhc3luYyBnZXRQYXJzZWRUb2tlbkFjY291bnRzQnlPd25lcihvd25lckFkZHJlc3MsIGZpbHRlciwgY29tbWl0bWVudCkge1xuICAgIGxldCBfYXJncyA9IFtvd25lckFkZHJlc3MudG9CYXNlNTgoKV07XG4gICAgaWYgKCdtaW50JyBpbiBmaWx0ZXIpIHtcbiAgICAgIF9hcmdzLnB1c2goe1xuICAgICAgICBtaW50OiBmaWx0ZXIubWludC50b0Jhc2U1OCgpXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX2FyZ3MucHVzaCh7XG4gICAgICAgIHByb2dyYW1JZDogZmlsdGVyLnByb2dyYW1JZC50b0Jhc2U1OCgpXG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhfYXJncywgY29tbWl0bWVudCwgJ2pzb25QYXJzZWQnKTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRUb2tlbkFjY291bnRzQnlPd25lcicsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldFBhcnNlZFRva2VuQWNjb3VudHNCeU93bmVyKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCBgZmFpbGVkIHRvIGdldCB0b2tlbiBhY2NvdW50cyBvd25lZCBieSBhY2NvdW50ICR7b3duZXJBZGRyZXNzLnRvQmFzZTU4KCl9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSAyMCBsYXJnZXN0IGFjY291bnRzIHdpdGggdGhlaXIgY3VycmVudCBiYWxhbmNlc1xuICAgKi9cbiAgYXN5bmMgZ2V0TGFyZ2VzdEFjY291bnRzKGNvbmZpZykge1xuICAgIGNvbnN0IGFyZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNvbW1pdG1lbnQ6IGNvbmZpZyAmJiBjb25maWcuY29tbWl0bWVudCB8fCB0aGlzLmNvbW1pdG1lbnRcbiAgICB9O1xuICAgIGNvbnN0IGFyZ3MgPSBhcmcuZmlsdGVyIHx8IGFyZy5jb21taXRtZW50ID8gW2FyZ10gOiBbXTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRMYXJnZXN0QWNjb3VudHMnLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXRMYXJnZXN0QWNjb3VudHNScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IGxhcmdlc3QgYWNjb3VudHMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIDIwIGxhcmdlc3QgdG9rZW4gYWNjb3VudHMgd2l0aCB0aGVpciBjdXJyZW50IGJhbGFuY2VzXG4gICAqIGZvciBhIGdpdmVuIG1pbnQuXG4gICAqL1xuICBhc3luYyBnZXRUb2tlbkxhcmdlc3RBY2NvdW50cyhtaW50QWRkcmVzcywgY29tbWl0bWVudCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3MoW21pbnRBZGRyZXNzLnRvQmFzZTU4KCldLCBjb21taXRtZW50KTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRUb2tlbkxhcmdlc3RBY2NvdW50cycsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldFRva2VuTGFyZ2VzdEFjY291bnRzUmVzdWx0KTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCB0b2tlbiBsYXJnZXN0IGFjY291bnRzJyk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGFsbCB0aGUgYWNjb3VudCBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXksIHJldHVybiB3aXRoIGNvbnRleHRcbiAgICovXG4gIGFzeW5jIGdldEFjY291bnRJbmZvQW5kQ29udGV4dChwdWJsaWNLZXksIGNvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWdcbiAgICB9ID0gZXh0cmFjdENvbW1pdG1lbnRGcm9tQ29uZmlnKGNvbW1pdG1lbnRPckNvbmZpZyk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbcHVibGljS2V5LnRvQmFzZTU4KCldLCBjb21taXRtZW50LCAnYmFzZTY0JywgY29uZmlnKTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRBY2NvdW50SW5mbycsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIGpzb25ScGNSZXN1bHRBbmRDb250ZXh0KG51bGxhYmxlKEFjY291bnRJbmZvUmVzdWx0KSkpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsIGBmYWlsZWQgdG8gZ2V0IGluZm8gYWJvdXQgYWNjb3VudCAke3B1YmxpY0tleS50b0Jhc2U1OCgpfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBwYXJzZWQgYWNjb3VudCBpbmZvIGZvciB0aGUgc3BlY2lmaWVkIHB1YmxpYyBrZXlcbiAgICovXG4gIGFzeW5jIGdldFBhcnNlZEFjY291bnRJbmZvKHB1YmxpY0tleSwgY29tbWl0bWVudE9yQ29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tbWl0bWVudCxcbiAgICAgIGNvbmZpZ1xuICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcoY29tbWl0bWVudE9yQ29uZmlnKTtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzKFtwdWJsaWNLZXkudG9CYXNlNTgoKV0sIGNvbW1pdG1lbnQsICdqc29uUGFyc2VkJywgY29uZmlnKTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRBY2NvdW50SW5mbycsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIGpzb25ScGNSZXN1bHRBbmRDb250ZXh0KG51bGxhYmxlKFBhcnNlZEFjY291bnRJbmZvUmVzdWx0KSkpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsIGBmYWlsZWQgdG8gZ2V0IGluZm8gYWJvdXQgYWNjb3VudCAke3B1YmxpY0tleS50b0Jhc2U1OCgpfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbGwgdGhlIGFjY291bnQgaW5mbyBmb3IgdGhlIHNwZWNpZmllZCBwdWJsaWMga2V5XG4gICAqL1xuICBhc3luYyBnZXRBY2NvdW50SW5mbyhwdWJsaWNLZXksIGNvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdldEFjY291bnRJbmZvQW5kQ29udGV4dChwdWJsaWNLZXksIGNvbW1pdG1lbnRPckNvbmZpZyk7XG4gICAgICByZXR1cm4gcmVzLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGdldCBpbmZvIGFib3V0IGFjY291bnQgJyArIHB1YmxpY0tleS50b0Jhc2U1OCgpICsgJzogJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbGwgdGhlIGFjY291bnQgaW5mbyBmb3IgbXVsdGlwbGUgYWNjb3VudHMgc3BlY2lmaWVkIGJ5IGFuIGFycmF5IG9mIHB1YmxpYyBrZXlzLCByZXR1cm4gd2l0aCBjb250ZXh0XG4gICAqL1xuICBhc3luYyBnZXRNdWx0aXBsZVBhcnNlZEFjY291bnRzKHB1YmxpY0tleXMsIHJhd0NvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWdcbiAgICB9ID0gZXh0cmFjdENvbW1pdG1lbnRGcm9tQ29uZmlnKHJhd0NvbmZpZyk7XG4gICAgY29uc3Qga2V5cyA9IHB1YmxpY0tleXMubWFwKGtleSA9PiBrZXkudG9CYXNlNTgoKSk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhba2V5c10sIGNvbW1pdG1lbnQsICdqc29uUGFyc2VkJywgY29uZmlnKTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRNdWx0aXBsZUFjY291bnRzJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywganNvblJwY1Jlc3VsdEFuZENvbnRleHQoYXJyYXkobnVsbGFibGUoUGFyc2VkQWNjb3VudEluZm9SZXN1bHQpKSkpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsIGBmYWlsZWQgdG8gZ2V0IGluZm8gZm9yIGFjY291bnRzICR7a2V5c31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYWxsIHRoZSBhY2NvdW50IGluZm8gZm9yIG11bHRpcGxlIGFjY291bnRzIHNwZWNpZmllZCBieSBhbiBhcnJheSBvZiBwdWJsaWMga2V5cywgcmV0dXJuIHdpdGggY29udGV4dFxuICAgKi9cbiAgYXN5bmMgZ2V0TXVsdGlwbGVBY2NvdW50c0luZm9BbmRDb250ZXh0KHB1YmxpY0tleXMsIGNvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWdcbiAgICB9ID0gZXh0cmFjdENvbW1pdG1lbnRGcm9tQ29uZmlnKGNvbW1pdG1lbnRPckNvbmZpZyk7XG4gICAgY29uc3Qga2V5cyA9IHB1YmxpY0tleXMubWFwKGtleSA9PiBrZXkudG9CYXNlNTgoKSk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhba2V5c10sIGNvbW1pdG1lbnQsICdiYXNlNjQnLCBjb25maWcpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldE11bHRpcGxlQWNjb3VudHMnLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBqc29uUnBjUmVzdWx0QW5kQ29udGV4dChhcnJheShudWxsYWJsZShBY2NvdW50SW5mb1Jlc3VsdCkpKSk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgYGZhaWxlZCB0byBnZXQgaW5mbyBmb3IgYWNjb3VudHMgJHtrZXlzfWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhbGwgdGhlIGFjY291bnQgaW5mbyBmb3IgbXVsdGlwbGUgYWNjb3VudHMgc3BlY2lmaWVkIGJ5IGFuIGFycmF5IG9mIHB1YmxpYyBrZXlzXG4gICAqL1xuICBhc3luYyBnZXRNdWx0aXBsZUFjY291bnRzSW5mbyhwdWJsaWNLZXlzLCBjb21taXRtZW50T3JDb25maWcpIHtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdldE11bHRpcGxlQWNjb3VudHNJbmZvQW5kQ29udGV4dChwdWJsaWNLZXlzLCBjb21taXRtZW50T3JDb25maWcpO1xuICAgIHJldHVybiByZXMudmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBlcG9jaCBhY3RpdmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIHN0YWtlIGFjY291bnQgdGhhdCBoYXMgYmVlbiBkZWxlZ2F0ZWRcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBzaW5jZSBSUEMgdjEuMTg7IHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLlxuICAgKi9cbiAgYXN5bmMgZ2V0U3Rha2VBY3RpdmF0aW9uKHB1YmxpY0tleSwgY29tbWl0bWVudE9yQ29uZmlnLCBlcG9jaCkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWdcbiAgICB9ID0gZXh0cmFjdENvbW1pdG1lbnRGcm9tQ29uZmlnKGNvbW1pdG1lbnRPckNvbmZpZyk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbcHVibGljS2V5LnRvQmFzZTU4KCldLCBjb21taXRtZW50LCB1bmRlZmluZWQgLyogZW5jb2RpbmcgKi8sIHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGVwb2NoOiBlcG9jaCAhPSBudWxsID8gZXBvY2ggOiBjb25maWc/LmVwb2NoXG4gICAgfSk7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0U3Rha2VBY3RpdmF0aW9uJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywganNvblJwY1Jlc3VsdChTdGFrZUFjdGl2YXRpb25SZXN1bHQpKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCBgZmFpbGVkIHRvIGdldCBTdGFrZSBBY3RpdmF0aW9uICR7cHVibGljS2V5LnRvQmFzZTU4KCl9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGFsbCB0aGUgYWNjb3VudHMgb3duZWQgYnkgdGhlIHNwZWNpZmllZCBwcm9ncmFtIGlkXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8e3B1YmtleTogUHVibGljS2V5LCBhY2NvdW50OiBBY2NvdW50SW5mbzxCdWZmZXI+fT4+fVxuICAgKi9cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1jbGFzcy1tZW1iZXJzXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGUtY2xhc3MtbWVtYmVyc1xuICBhc3luYyBnZXRQcm9ncmFtQWNjb3VudHMocHJvZ3JhbUlkLCBjb25maWdPckNvbW1pdG1lbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb21taXRtZW50LFxuICAgICAgY29uZmlnXG4gICAgfSA9IGV4dHJhY3RDb21taXRtZW50RnJvbUNvbmZpZyhjb25maWdPckNvbW1pdG1lbnQpO1xuICAgIGNvbnN0IHtcbiAgICAgIGVuY29kaW5nLFxuICAgICAgLi4uY29uZmlnV2l0aG91dEVuY29kaW5nXG4gICAgfSA9IGNvbmZpZyB8fCB7fTtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzKFtwcm9ncmFtSWQudG9CYXNlNTgoKV0sIGNvbW1pdG1lbnQsIGVuY29kaW5nIHx8ICdiYXNlNjQnLCB7XG4gICAgICAuLi5jb25maWdXaXRob3V0RW5jb2RpbmcsXG4gICAgICAuLi4oY29uZmlnV2l0aG91dEVuY29kaW5nLmZpbHRlcnMgPyB7XG4gICAgICAgIGZpbHRlcnM6IGFwcGx5RGVmYXVsdE1lbWNtcEVuY29kaW5nVG9GaWx0ZXJzKGNvbmZpZ1dpdGhvdXRFbmNvZGluZy5maWx0ZXJzKVxuICAgICAgfSA6IG51bGwpXG4gICAgfSk7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0UHJvZ3JhbUFjY291bnRzJywgYXJncyk7XG4gICAgY29uc3QgYmFzZVNjaGVtYSA9IGFycmF5KEtleWVkQWNjb3VudEluZm9SZXN1bHQpO1xuICAgIGNvbnN0IHJlcyA9IGNvbmZpZ1dpdGhvdXRFbmNvZGluZy53aXRoQ29udGV4dCA9PT0gdHJ1ZSA/IGNyZWF0ZSh1bnNhZmVSZXMsIGpzb25ScGNSZXN1bHRBbmRDb250ZXh0KGJhc2VTY2hlbWEpKSA6IGNyZWF0ZSh1bnNhZmVSZXMsIGpzb25ScGNSZXN1bHQoYmFzZVNjaGVtYSkpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsIGBmYWlsZWQgdG8gZ2V0IGFjY291bnRzIG93bmVkIGJ5IHByb2dyYW0gJHtwcm9ncmFtSWQudG9CYXNlNTgoKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYW5kIHBhcnNlIGFsbCB0aGUgYWNjb3VudHMgb3duZWQgYnkgdGhlIHNwZWNpZmllZCBwcm9ncmFtIGlkXG4gICAqXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8e3B1YmtleTogUHVibGljS2V5LCBhY2NvdW50OiBBY2NvdW50SW5mbzxCdWZmZXIgfCBQYXJzZWRBY2NvdW50RGF0YT59Pj59XG4gICAqL1xuICBhc3luYyBnZXRQYXJzZWRQcm9ncmFtQWNjb3VudHMocHJvZ3JhbUlkLCBjb25maWdPckNvbW1pdG1lbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb21taXRtZW50LFxuICAgICAgY29uZmlnXG4gICAgfSA9IGV4dHJhY3RDb21taXRtZW50RnJvbUNvbmZpZyhjb25maWdPckNvbW1pdG1lbnQpO1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3MoW3Byb2dyYW1JZC50b0Jhc2U1OCgpXSwgY29tbWl0bWVudCwgJ2pzb25QYXJzZWQnLCBjb25maWcpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldFByb2dyYW1BY2NvdW50cycsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIGpzb25ScGNSZXN1bHQoYXJyYXkoS2V5ZWRQYXJzZWRBY2NvdW50SW5mb1Jlc3VsdCkpKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCBgZmFpbGVkIHRvIGdldCBhY2NvdW50cyBvd25lZCBieSBwcm9ncmFtICR7cHJvZ3JhbUlkLnRvQmFzZTU4KCl9YCk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIEluc3RlYWQsIGNhbGwgYGNvbmZpcm1UcmFuc2FjdGlvbmAgYW5kIHBhc3MgaW4ge0BsaW5rIFRyYW5zYWN0aW9uQ29uZmlybWF0aW9uU3RyYXRlZ3l9ICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWNsYXNzLW1lbWJlcnNcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1jbGFzcy1tZW1iZXJzXG4gIGFzeW5jIGNvbmZpcm1UcmFuc2FjdGlvbihzdHJhdGVneSwgY29tbWl0bWVudCkge1xuICAgIGxldCByYXdTaWduYXR1cmU7XG4gICAgaWYgKHR5cGVvZiBzdHJhdGVneSA9PSAnc3RyaW5nJykge1xuICAgICAgcmF3U2lnbmF0dXJlID0gc3RyYXRlZ3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IHN0cmF0ZWd5O1xuICAgICAgaWYgKGNvbmZpZy5hYm9ydFNpZ25hbD8uYWJvcnRlZCkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoY29uZmlnLmFib3J0U2lnbmFsLnJlYXNvbik7XG4gICAgICB9XG4gICAgICByYXdTaWduYXR1cmUgPSBjb25maWcuc2lnbmF0dXJlO1xuICAgIH1cbiAgICBsZXQgZGVjb2RlZFNpZ25hdHVyZTtcbiAgICB0cnkge1xuICAgICAgZGVjb2RlZFNpZ25hdHVyZSA9IGJzNTguZGVjb2RlKHJhd1NpZ25hdHVyZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3NpZ25hdHVyZSBtdXN0IGJlIGJhc2U1OCBlbmNvZGVkOiAnICsgcmF3U2lnbmF0dXJlKTtcbiAgICB9XG4gICAgYXNzZXJ0KGRlY29kZWRTaWduYXR1cmUubGVuZ3RoID09PSA2NCwgJ3NpZ25hdHVyZSBoYXMgaW52YWxpZCBsZW5ndGgnKTtcbiAgICBpZiAodHlwZW9mIHN0cmF0ZWd5ID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29uZmlybVRyYW5zYWN0aW9uVXNpbmdMZWdhY3lUaW1lb3V0U3RyYXRlZ3koe1xuICAgICAgICBjb21taXRtZW50OiBjb21taXRtZW50IHx8IHRoaXMuY29tbWl0bWVudCxcbiAgICAgICAgc2lnbmF0dXJlOiByYXdTaWduYXR1cmVcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoJ2xhc3RWYWxpZEJsb2NrSGVpZ2h0JyBpbiBzdHJhdGVneSkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY29uZmlybVRyYW5zYWN0aW9uVXNpbmdCbG9ja0hlaWdodEV4Y2VlZGFuY2VTdHJhdGVneSh7XG4gICAgICAgIGNvbW1pdG1lbnQ6IGNvbW1pdG1lbnQgfHwgdGhpcy5jb21taXRtZW50LFxuICAgICAgICBzdHJhdGVneVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNvbmZpcm1UcmFuc2FjdGlvblVzaW5nRHVyYWJsZU5vbmNlU3RyYXRlZ3koe1xuICAgICAgICBjb21taXRtZW50OiBjb21taXRtZW50IHx8IHRoaXMuY29tbWl0bWVudCxcbiAgICAgICAgc3RyYXRlZ3lcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBnZXRDYW5jZWxsYXRpb25Qcm9taXNlKHNpZ25hbCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICBpZiAoc2lnbmFsID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIHJlamVjdChzaWduYWwucmVhc29uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsICgpID0+IHtcbiAgICAgICAgICByZWplY3Qoc2lnbmFsLnJlYXNvbik7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGdldFRyYW5zYWN0aW9uQ29uZmlybWF0aW9uUHJvbWlzZSh7XG4gICAgY29tbWl0bWVudCxcbiAgICBzaWduYXR1cmVcbiAgfSkge1xuICAgIGxldCBzaWduYXR1cmVTdWJzY3JpcHRpb25JZDtcbiAgICBsZXQgZGlzcG9zZVNpZ25hdHVyZVN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlT2JzZXJ2ZXI7XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBjb25zdCBjb25maXJtYXRpb25Qcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2lnbmF0dXJlU3Vic2NyaXB0aW9uSWQgPSB0aGlzLm9uU2lnbmF0dXJlKHNpZ25hdHVyZSwgKHJlc3VsdCwgY29udGV4dCkgPT4ge1xuICAgICAgICAgIHNpZ25hdHVyZVN1YnNjcmlwdGlvbklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0ge1xuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHZhbHVlOiByZXN1bHRcbiAgICAgICAgICB9O1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgX190eXBlOiBUcmFuc2FjdGlvblN0YXR1cy5QUk9DRVNTRUQsXG4gICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9LCBjb21taXRtZW50KTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uU2V0dXBQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZVN1YnNjcmlwdGlvblNldHVwID0+IHtcbiAgICAgICAgICBpZiAoc2lnbmF0dXJlU3Vic2NyaXB0aW9uSWQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzb2x2ZVN1YnNjcmlwdGlvblNldHVwKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3Bvc2VTaWduYXR1cmVTdWJzY3JpcHRpb25TdGF0ZUNoYW5nZU9ic2VydmVyID0gdGhpcy5fb25TdWJzY3JpcHRpb25TdGF0ZUNoYW5nZShzaWduYXR1cmVTdWJzY3JpcHRpb25JZCwgbmV4dFN0YXRlID0+IHtcbiAgICAgICAgICAgICAgaWYgKG5leHRTdGF0ZSA9PT0gJ3N1YnNjcmliZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVN1YnNjcmlwdGlvblNldHVwKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgc3Vic2NyaXB0aW9uU2V0dXBQcm9taXNlO1xuICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldFNpZ25hdHVyZVN0YXR1cyhzaWduYXR1cmUpO1xuICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgaWYgKHJlc3BvbnNlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgfSA9IHJlc3BvbnNlO1xuICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2YWx1ZT8uZXJyKSB7XG4gICAgICAgICAgICByZWplY3QodmFsdWUuZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3dpdGNoIChjb21taXRtZW50KSB7XG4gICAgICAgICAgICAgIGNhc2UgJ2NvbmZpcm1lZCc6XG4gICAgICAgICAgICAgIGNhc2UgJ3NpbmdsZSc6XG4gICAgICAgICAgICAgIGNhc2UgJ3NpbmdsZUdvc3NpcCc6XG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNvbmZpcm1hdGlvblN0YXR1cyA9PT0gJ3Byb2Nlc3NlZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICdmaW5hbGl6ZWQnOlxuICAgICAgICAgICAgICBjYXNlICdtYXgnOlxuICAgICAgICAgICAgICBjYXNlICdyb290JzpcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBpZiAodmFsdWUuY29uZmlybWF0aW9uU3RhdHVzID09PSAncHJvY2Vzc2VkJyB8fCB2YWx1ZS5jb25maXJtYXRpb25TdGF0dXMgPT09ICdjb25maXJtZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gZXhoYXVzdCBlbnVtcyB0byBlbnN1cmUgZnVsbCBjb3ZlcmFnZVxuICAgICAgICAgICAgICBjYXNlICdwcm9jZXNzZWQnOlxuICAgICAgICAgICAgICBjYXNlICdyZWNlbnQnOlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgX190eXBlOiBUcmFuc2FjdGlvblN0YXR1cy5QUk9DRVNTRUQsXG4gICAgICAgICAgICAgIHJlc3BvbnNlOiB7XG4gICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgYWJvcnRDb25maXJtYXRpb24gPSAoKSA9PiB7XG4gICAgICBpZiAoZGlzcG9zZVNpZ25hdHVyZVN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlT2JzZXJ2ZXIpIHtcbiAgICAgICAgZGlzcG9zZVNpZ25hdHVyZVN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlT2JzZXJ2ZXIoKTtcbiAgICAgICAgZGlzcG9zZVNpZ25hdHVyZVN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlT2JzZXJ2ZXIgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbmF0dXJlU3Vic2NyaXB0aW9uSWQgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZVNpZ25hdHVyZUxpc3RlbmVyKHNpZ25hdHVyZVN1YnNjcmlwdGlvbklkKTtcbiAgICAgICAgc2lnbmF0dXJlU3Vic2NyaXB0aW9uSWQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgYWJvcnRDb25maXJtYXRpb24sXG4gICAgICBjb25maXJtYXRpb25Qcm9taXNlXG4gICAgfTtcbiAgfVxuICBhc3luYyBjb25maXJtVHJhbnNhY3Rpb25Vc2luZ0Jsb2NrSGVpZ2h0RXhjZWVkYW5jZVN0cmF0ZWd5KHtcbiAgICBjb21taXRtZW50LFxuICAgIHN0cmF0ZWd5OiB7XG4gICAgICBhYm9ydFNpZ25hbCxcbiAgICAgIGxhc3RWYWxpZEJsb2NrSGVpZ2h0LFxuICAgICAgc2lnbmF0dXJlXG4gICAgfVxuICB9KSB7XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBjb25zdCBleHBpcnlQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBjb25zdCBjaGVja0Jsb2NrSGVpZ2h0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJsb2NrSGVpZ2h0ID0gYXdhaXQgdGhpcy5nZXRCbG9ja0hlaWdodChjb21taXRtZW50KTtcbiAgICAgICAgICByZXR1cm4gYmxvY2tIZWlnaHQ7XG4gICAgICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnRCbG9ja0hlaWdodCA9IGF3YWl0IGNoZWNrQmxvY2tIZWlnaHQoKTtcbiAgICAgICAgaWYgKGRvbmUpIHJldHVybjtcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRCbG9ja0hlaWdodCA8PSBsYXN0VmFsaWRCbG9ja0hlaWdodCkge1xuICAgICAgICAgIGF3YWl0IHNsZWVwKDEwMDApO1xuICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgY3VycmVudEJsb2NrSGVpZ2h0ID0gYXdhaXQgY2hlY2tCbG9ja0hlaWdodCgpO1xuICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgX190eXBlOiBUcmFuc2FjdGlvblN0YXR1cy5CTE9DS0hFSUdIVF9FWENFRURFRFxuICAgICAgICB9KTtcbiAgICAgIH0pKCk7XG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgYWJvcnRDb25maXJtYXRpb24sXG4gICAgICBjb25maXJtYXRpb25Qcm9taXNlXG4gICAgfSA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25Db25maXJtYXRpb25Qcm9taXNlKHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBzaWduYXR1cmVcbiAgICB9KTtcbiAgICBjb25zdCBjYW5jZWxsYXRpb25Qcm9taXNlID0gdGhpcy5nZXRDYW5jZWxsYXRpb25Qcm9taXNlKGFib3J0U2lnbmFsKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYW5jZWxsYXRpb25Qcm9taXNlLCBjb25maXJtYXRpb25Qcm9taXNlLCBleHBpcnlQcm9taXNlXSk7XG4gICAgICBpZiAob3V0Y29tZS5fX3R5cGUgPT09IFRyYW5zYWN0aW9uU3RhdHVzLlBST0NFU1NFRCkge1xuICAgICAgICByZXN1bHQgPSBvdXRjb21lLnJlc3BvbnNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uRXhwaXJlZEJsb2NraGVpZ2h0RXhjZWVkZWRFcnJvcihzaWduYXR1cmUpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICAgIGFib3J0Q29uZmlybWF0aW9uKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgYXN5bmMgY29uZmlybVRyYW5zYWN0aW9uVXNpbmdEdXJhYmxlTm9uY2VTdHJhdGVneSh7XG4gICAgY29tbWl0bWVudCxcbiAgICBzdHJhdGVneToge1xuICAgICAgYWJvcnRTaWduYWwsXG4gICAgICBtaW5Db250ZXh0U2xvdCxcbiAgICAgIG5vbmNlQWNjb3VudFB1YmtleSxcbiAgICAgIG5vbmNlVmFsdWUsXG4gICAgICBzaWduYXR1cmVcbiAgICB9XG4gIH0pIHtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGNvbnN0IGV4cGlyeVByb21pc2UgPSBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGxldCBjdXJyZW50Tm9uY2VWYWx1ZSA9IG5vbmNlVmFsdWU7XG4gICAgICBsZXQgbGFzdENoZWNrZWRTbG90ID0gbnVsbDtcbiAgICAgIGNvbnN0IGdldEN1cnJlbnROb25jZVZhbHVlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICB2YWx1ZTogbm9uY2VBY2NvdW50XG4gICAgICAgICAgfSA9IGF3YWl0IHRoaXMuZ2V0Tm9uY2VBbmRDb250ZXh0KG5vbmNlQWNjb3VudFB1YmtleSwge1xuICAgICAgICAgICAgY29tbWl0bWVudCxcbiAgICAgICAgICAgIG1pbkNvbnRleHRTbG90XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgbGFzdENoZWNrZWRTbG90ID0gY29udGV4dC5zbG90O1xuICAgICAgICAgIHJldHVybiBub25jZUFjY291bnQ/Lm5vbmNlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWYgZm9yIHdoYXRldmVyIHJlYXNvbiB3ZSBjYW4ndCByZWFjaC9yZWFkIHRoZSBub25jZVxuICAgICAgICAgIC8vIGFjY291bnQsIGp1c3Qga2VlcCB1c2luZyB0aGUgbGFzdC1rbm93biB2YWx1ZS5cbiAgICAgICAgICByZXR1cm4gY3VycmVudE5vbmNlVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICBjdXJyZW50Tm9uY2VWYWx1ZSA9IGF3YWl0IGdldEN1cnJlbnROb25jZVZhbHVlKCk7XG4gICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgIHdoaWxlICh0cnVlIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc3RhbnQtY29uZGl0aW9uXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChub25jZVZhbHVlICE9PSBjdXJyZW50Tm9uY2VWYWx1ZSkge1xuICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgIF9fdHlwZTogVHJhbnNhY3Rpb25TdGF0dXMuTk9OQ0VfSU5WQUxJRCxcbiAgICAgICAgICAgICAgc2xvdEluV2hpY2hOb25jZURpZEFkdmFuY2U6IGxhc3RDaGVja2VkU2xvdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHNsZWVwKDIwMDApO1xuICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgICAgY3VycmVudE5vbmNlVmFsdWUgPSBhd2FpdCBnZXRDdXJyZW50Tm9uY2VWYWx1ZSgpO1xuICAgICAgICAgIGlmIChkb25lKSByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0pKCk7XG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgYWJvcnRDb25maXJtYXRpb24sXG4gICAgICBjb25maXJtYXRpb25Qcm9taXNlXG4gICAgfSA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25Db25maXJtYXRpb25Qcm9taXNlKHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBzaWduYXR1cmVcbiAgICB9KTtcbiAgICBjb25zdCBjYW5jZWxsYXRpb25Qcm9taXNlID0gdGhpcy5nZXRDYW5jZWxsYXRpb25Qcm9taXNlKGFib3J0U2lnbmFsKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjYW5jZWxsYXRpb25Qcm9taXNlLCBjb25maXJtYXRpb25Qcm9taXNlLCBleHBpcnlQcm9taXNlXSk7XG4gICAgICBpZiAob3V0Y29tZS5fX3R5cGUgPT09IFRyYW5zYWN0aW9uU3RhdHVzLlBST0NFU1NFRCkge1xuICAgICAgICByZXN1bHQgPSBvdXRjb21lLnJlc3BvbnNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRG91YmxlIGNoZWNrIHRoYXQgdGhlIHRyYW5zYWN0aW9uIGlzIGluZGVlZCB1bmNvbmZpcm1lZC5cbiAgICAgICAgbGV0IHNpZ25hdHVyZVN0YXR1cztcbiAgICAgICAgd2hpbGUgKHRydWUgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zdGFudC1jb25kaXRpb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgdGhpcy5nZXRTaWduYXR1cmVTdGF0dXMoc2lnbmF0dXJlKTtcbiAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdHVzLmNvbnRleHQuc2xvdCA8IChvdXRjb21lLnNsb3RJbldoaWNoTm9uY2VEaWRBZHZhbmNlID8/IG1pbkNvbnRleHRTbG90KSkge1xuICAgICAgICAgICAgYXdhaXQgc2xlZXAoNDAwKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzaWduYXR1cmVTdGF0dXMgPSBzdGF0dXM7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNpZ25hdHVyZVN0YXR1cz8udmFsdWUpIHtcbiAgICAgICAgICBjb25zdCBjb21taXRtZW50Rm9yU3RhdHVzID0gY29tbWl0bWVudCB8fCAnZmluYWxpemVkJztcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb25maXJtYXRpb25TdGF0dXNcbiAgICAgICAgICB9ID0gc2lnbmF0dXJlU3RhdHVzLnZhbHVlO1xuICAgICAgICAgIHN3aXRjaCAoY29tbWl0bWVudEZvclN0YXR1cykge1xuICAgICAgICAgICAgY2FzZSAncHJvY2Vzc2VkJzpcbiAgICAgICAgICAgIGNhc2UgJ3JlY2VudCc6XG4gICAgICAgICAgICAgIGlmIChjb25maXJtYXRpb25TdGF0dXMgIT09ICdwcm9jZXNzZWQnICYmIGNvbmZpcm1hdGlvblN0YXR1cyAhPT0gJ2NvbmZpcm1lZCcgJiYgY29uZmlybWF0aW9uU3RhdHVzICE9PSAnZmluYWxpemVkJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbkV4cGlyZWROb25jZUludmFsaWRFcnJvcihzaWduYXR1cmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnY29uZmlybWVkJzpcbiAgICAgICAgICAgIGNhc2UgJ3NpbmdsZSc6XG4gICAgICAgICAgICBjYXNlICdzaW5nbGVHb3NzaXAnOlxuICAgICAgICAgICAgICBpZiAoY29uZmlybWF0aW9uU3RhdHVzICE9PSAnY29uZmlybWVkJyAmJiBjb25maXJtYXRpb25TdGF0dXMgIT09ICdmaW5hbGl6ZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uRXhwaXJlZE5vbmNlSW52YWxpZEVycm9yKHNpZ25hdHVyZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdmaW5hbGl6ZWQnOlxuICAgICAgICAgICAgY2FzZSAnbWF4JzpcbiAgICAgICAgICAgIGNhc2UgJ3Jvb3QnOlxuICAgICAgICAgICAgICBpZiAoY29uZmlybWF0aW9uU3RhdHVzICE9PSAnZmluYWxpemVkJykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2FjdGlvbkV4cGlyZWROb25jZUludmFsaWRFcnJvcihzaWduYXR1cmUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgLy8gRXhoYXVzdGl2ZSBzd2l0Y2guXG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgICAgKF8gPT4ge30pKGNvbW1pdG1lbnRGb3JTdGF0dXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXN1bHQgPSB7XG4gICAgICAgICAgICBjb250ZXh0OiBzaWduYXR1cmVTdGF0dXMuY29udGV4dCxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgIGVycjogc2lnbmF0dXJlU3RhdHVzLnZhbHVlLmVyclxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uRXhwaXJlZE5vbmNlSW52YWxpZEVycm9yKHNpZ25hdHVyZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICBhYm9ydENvbmZpcm1hdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGFzeW5jIGNvbmZpcm1UcmFuc2FjdGlvblVzaW5nTGVnYWN5VGltZW91dFN0cmF0ZWd5KHtcbiAgICBjb21taXRtZW50LFxuICAgIHNpZ25hdHVyZVxuICB9KSB7XG4gICAgbGV0IHRpbWVvdXRJZDtcbiAgICBjb25zdCBleHBpcnlQcm9taXNlID0gbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBsZXQgdGltZW91dE1zID0gdGhpcy5fY29uZmlybVRyYW5zYWN0aW9uSW5pdGlhbFRpbWVvdXQgfHwgNjAgKiAxMDAwO1xuICAgICAgc3dpdGNoIChjb21taXRtZW50KSB7XG4gICAgICAgIGNhc2UgJ3Byb2Nlc3NlZCc6XG4gICAgICAgIGNhc2UgJ3JlY2VudCc6XG4gICAgICAgIGNhc2UgJ3NpbmdsZSc6XG4gICAgICAgIGNhc2UgJ2NvbmZpcm1lZCc6XG4gICAgICAgIGNhc2UgJ3NpbmdsZUdvc3NpcCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdGltZW91dE1zID0gdGhpcy5fY29uZmlybVRyYW5zYWN0aW9uSW5pdGlhbFRpbWVvdXQgfHwgMzAgKiAxMDAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKHtcbiAgICAgICAgX190eXBlOiBUcmFuc2FjdGlvblN0YXR1cy5USU1FRF9PVVQsXG4gICAgICAgIHRpbWVvdXRNc1xuICAgICAgfSksIHRpbWVvdXRNcyk7XG4gICAgfSk7XG4gICAgY29uc3Qge1xuICAgICAgYWJvcnRDb25maXJtYXRpb24sXG4gICAgICBjb25maXJtYXRpb25Qcm9taXNlXG4gICAgfSA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25Db25maXJtYXRpb25Qcm9taXNlKHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBzaWduYXR1cmVcbiAgICB9KTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgUHJvbWlzZS5yYWNlKFtjb25maXJtYXRpb25Qcm9taXNlLCBleHBpcnlQcm9taXNlXSk7XG4gICAgICBpZiAob3V0Y29tZS5fX3R5cGUgPT09IFRyYW5zYWN0aW9uU3RhdHVzLlBST0NFU1NFRCkge1xuICAgICAgICByZXN1bHQgPSBvdXRjb21lLnJlc3BvbnNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRyYW5zYWN0aW9uRXhwaXJlZFRpbWVvdXRFcnJvcihzaWduYXR1cmUsIG91dGNvbWUudGltZW91dE1zIC8gMTAwMCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgYWJvcnRDb25maXJtYXRpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIGxpc3Qgb2Ygbm9kZXMgdGhhdCBhcmUgY3VycmVudGx5IHBhcnRpY2lwYXRpbmcgaW4gdGhlIGNsdXN0ZXJcbiAgICovXG4gIGFzeW5jIGdldENsdXN0ZXJOb2RlcygpIHtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRDbHVzdGVyTm9kZXMnLCBbXSk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywganNvblJwY1Jlc3VsdChhcnJheShDb250YWN0SW5mb1Jlc3VsdCkpKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCBjbHVzdGVyIG5vZGVzJyk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgbGlzdCBvZiBub2RlcyB0aGF0IGFyZSBjdXJyZW50bHkgcGFydGljaXBhdGluZyBpbiB0aGUgY2x1c3RlclxuICAgKi9cbiAgYXN5bmMgZ2V0Vm90ZUFjY291bnRzKGNvbW1pdG1lbnQpIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzKFtdLCBjb21taXRtZW50KTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRWb3RlQWNjb3VudHMnLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXRWb3RlQWNjb3VudHMpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IHZvdGUgYWNjb3VudHMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGN1cnJlbnQgc2xvdCB0aGF0IHRoZSBub2RlIGlzIHByb2Nlc3NpbmdcbiAgICovXG4gIGFzeW5jIGdldFNsb3QoY29tbWl0bWVudE9yQ29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tbWl0bWVudCxcbiAgICAgIGNvbmZpZ1xuICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcoY29tbWl0bWVudE9yQ29uZmlnKTtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzKFtdLCBjb21taXRtZW50LCB1bmRlZmluZWQgLyogZW5jb2RpbmcgKi8sIGNvbmZpZyk7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0U2xvdCcsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIGpzb25ScGNSZXN1bHQobnVtYmVyKCkpKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCBzbG90Jyk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBjdXJyZW50IHNsb3QgbGVhZGVyIG9mIHRoZSBjbHVzdGVyXG4gICAqL1xuICBhc3luYyBnZXRTbG90TGVhZGVyKGNvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWdcbiAgICB9ID0gZXh0cmFjdENvbW1pdG1lbnRGcm9tQ29uZmlnKGNvbW1pdG1lbnRPckNvbmZpZyk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbXSwgY29tbWl0bWVudCwgdW5kZWZpbmVkIC8qIGVuY29kaW5nICovLCBjb25maWcpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldFNsb3RMZWFkZXInLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBqc29uUnBjUmVzdWx0KHN0cmluZygpKSk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgc2xvdCBsZWFkZXInKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYGxpbWl0YCBudW1iZXIgb2Ygc2xvdCBsZWFkZXJzIHN0YXJ0aW5nIGZyb20gYHN0YXJ0U2xvdGBcbiAgICpcbiAgICogQHBhcmFtIHN0YXJ0U2xvdCBmZXRjaCBzbG90IGxlYWRlcnMgc3RhcnRpbmcgZnJvbSB0aGlzIHNsb3RcbiAgICogQHBhcmFtIGxpbWl0IG51bWJlciBvZiBzbG90IGxlYWRlcnMgdG8gcmV0dXJuXG4gICAqL1xuICBhc3luYyBnZXRTbG90TGVhZGVycyhzdGFydFNsb3QsIGxpbWl0KSB7XG4gICAgY29uc3QgYXJncyA9IFtzdGFydFNsb3QsIGxpbWl0XTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRTbG90TGVhZGVycycsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIGpzb25ScGNSZXN1bHQoYXJyYXkoUHVibGljS2V5RnJvbVN0cmluZykpKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCBzbG90IGxlYWRlcnMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGEgc2lnbmF0dXJlXG4gICAqL1xuICBhc3luYyBnZXRTaWduYXR1cmVTdGF0dXMoc2lnbmF0dXJlLCBjb25maWcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb250ZXh0LFxuICAgICAgdmFsdWU6IHZhbHVlc1xuICAgIH0gPSBhd2FpdCB0aGlzLmdldFNpZ25hdHVyZVN0YXR1c2VzKFtzaWduYXR1cmVdLCBjb25maWcpO1xuICAgIGFzc2VydCh2YWx1ZXMubGVuZ3RoID09PSAxKTtcbiAgICBjb25zdCB2YWx1ZSA9IHZhbHVlc1swXTtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGV4dCxcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgY3VycmVudCBzdGF0dXNlcyBvZiBhIGJhdGNoIG9mIHNpZ25hdHVyZXNcbiAgICovXG4gIGFzeW5jIGdldFNpZ25hdHVyZVN0YXR1c2VzKHNpZ25hdHVyZXMsIGNvbmZpZykge1xuICAgIGNvbnN0IHBhcmFtcyA9IFtzaWduYXR1cmVzXTtcbiAgICBpZiAoY29uZmlnKSB7XG4gICAgICBwYXJhbXMucHVzaChjb25maWcpO1xuICAgIH1cbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRTaWduYXR1cmVTdGF0dXNlcycsIHBhcmFtcyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0U2lnbmF0dXJlU3RhdHVzZXNScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IHNpZ25hdHVyZSBzdGF0dXMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGN1cnJlbnQgdHJhbnNhY3Rpb24gY291bnQgb2YgdGhlIGNsdXN0ZXJcbiAgICovXG4gIGFzeW5jIGdldFRyYW5zYWN0aW9uQ291bnQoY29tbWl0bWVudE9yQ29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tbWl0bWVudCxcbiAgICAgIGNvbmZpZ1xuICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcoY29tbWl0bWVudE9yQ29uZmlnKTtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzKFtdLCBjb21taXRtZW50LCB1bmRlZmluZWQgLyogZW5jb2RpbmcgKi8sIGNvbmZpZyk7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0VHJhbnNhY3Rpb25Db3VudCcsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIGpzb25ScGNSZXN1bHQobnVtYmVyKCkpKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCB0cmFuc2FjdGlvbiBjb3VudCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgY3VycmVudCB0b3RhbCBjdXJyZW5jeSBzdXBwbHkgb2YgdGhlIGNsdXN0ZXIgaW4gbGFtcG9ydHNcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBzaW5jZSBSUEMgdjEuMi44LiBQbGVhc2UgdXNlIHtAbGluayBnZXRTdXBwbHl9IGluc3RlYWQuXG4gICAqL1xuICBhc3luYyBnZXRUb3RhbFN1cHBseShjb21taXRtZW50KSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRTdXBwbHkoe1xuICAgICAgY29tbWl0bWVudCxcbiAgICAgIGV4Y2x1ZGVOb25DaXJjdWxhdGluZ0FjY291bnRzTGlzdDogdHJ1ZVxuICAgIH0pO1xuICAgIHJldHVybiByZXN1bHQudmFsdWUudG90YWw7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGNsdXN0ZXIgSW5mbGF0aW9uR292ZXJub3IgcGFyYW1ldGVyc1xuICAgKi9cbiAgYXN5bmMgZ2V0SW5mbGF0aW9uR292ZXJub3IoY29tbWl0bWVudCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3MoW10sIGNvbW1pdG1lbnQpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldEluZmxhdGlvbkdvdmVybm9yJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0SW5mbGF0aW9uR292ZXJub3JScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IGluZmxhdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgaW5mbGF0aW9uIHJld2FyZCBmb3IgYSBsaXN0IG9mIGFkZHJlc3NlcyBmb3IgYW4gZXBvY2hcbiAgICovXG4gIGFzeW5jIGdldEluZmxhdGlvblJld2FyZChhZGRyZXNzZXMsIGVwb2NoLCBjb21taXRtZW50T3JDb25maWcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb21taXRtZW50LFxuICAgICAgY29uZmlnXG4gICAgfSA9IGV4dHJhY3RDb21taXRtZW50RnJvbUNvbmZpZyhjb21taXRtZW50T3JDb25maWcpO1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3MoW2FkZHJlc3Nlcy5tYXAocHVia2V5ID0+IHB1YmtleS50b0Jhc2U1OCgpKV0sIGNvbW1pdG1lbnQsIHVuZGVmaW5lZCAvKiBlbmNvZGluZyAqLywge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgZXBvY2g6IGVwb2NoICE9IG51bGwgPyBlcG9jaCA6IGNvbmZpZz8uZXBvY2hcbiAgICB9KTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRJbmZsYXRpb25SZXdhcmQnLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXRJbmZsYXRpb25SZXdhcmRSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IGluZmxhdGlvbiByZXdhcmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIHNwZWNpZmljIGluZmxhdGlvbiB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IGVwb2NoXG4gICAqL1xuICBhc3luYyBnZXRJbmZsYXRpb25SYXRlKCkge1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldEluZmxhdGlvblJhdGUnLCBbXSk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0SW5mbGF0aW9uUmF0ZVJwY1Jlc3VsdCk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgaW5mbGF0aW9uIHJhdGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIEVwb2NoIEluZm8gcGFyYW1ldGVyc1xuICAgKi9cbiAgYXN5bmMgZ2V0RXBvY2hJbmZvKGNvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWdcbiAgICB9ID0gZXh0cmFjdENvbW1pdG1lbnRGcm9tQ29uZmlnKGNvbW1pdG1lbnRPckNvbmZpZyk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbXSwgY29tbWl0bWVudCwgdW5kZWZpbmVkIC8qIGVuY29kaW5nICovLCBjb25maWcpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldEVwb2NoSW5mbycsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldEVwb2NoSW5mb1JwY1Jlc3VsdCk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgZXBvY2ggaW5mbycpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgRXBvY2ggU2NoZWR1bGUgcGFyYW1ldGVyc1xuICAgKi9cbiAgYXN5bmMgZ2V0RXBvY2hTY2hlZHVsZSgpIHtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRFcG9jaFNjaGVkdWxlJywgW10pO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldEVwb2NoU2NoZWR1bGVScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IGVwb2NoIHNjaGVkdWxlJyk7XG4gICAgfVxuICAgIGNvbnN0IGVwb2NoU2NoZWR1bGUgPSByZXMucmVzdWx0O1xuICAgIHJldHVybiBuZXcgRXBvY2hTY2hlZHVsZShlcG9jaFNjaGVkdWxlLnNsb3RzUGVyRXBvY2gsIGVwb2NoU2NoZWR1bGUubGVhZGVyU2NoZWR1bGVTbG90T2Zmc2V0LCBlcG9jaFNjaGVkdWxlLndhcm11cCwgZXBvY2hTY2hlZHVsZS5maXJzdE5vcm1hbEVwb2NoLCBlcG9jaFNjaGVkdWxlLmZpcnN0Tm9ybWFsU2xvdCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGxlYWRlciBzY2hlZHVsZSBmb3IgdGhlIGN1cnJlbnQgZXBvY2hcbiAgICogQHJldHVybiB7UHJvbWlzZTxScGNSZXNwb25zZUFuZENvbnRleHQ8TGVhZGVyU2NoZWR1bGU+Pn1cbiAgICovXG4gIGFzeW5jIGdldExlYWRlclNjaGVkdWxlKCkge1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldExlYWRlclNjaGVkdWxlJywgW10pO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldExlYWRlclNjaGVkdWxlUnBjUmVzdWx0KTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCBsZWFkZXIgc2NoZWR1bGUnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIG1pbmltdW0gYmFsYW5jZSBuZWVkZWQgdG8gZXhlbXB0IGFuIGFjY291bnQgb2YgYGRhdGFMZW5ndGhgXG4gICAqIHNpemUgZnJvbSByZW50XG4gICAqL1xuICBhc3luYyBnZXRNaW5pbXVtQmFsYW5jZUZvclJlbnRFeGVtcHRpb24oZGF0YUxlbmd0aCwgY29tbWl0bWVudCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3MoW2RhdGFMZW5ndGhdLCBjb21taXRtZW50KTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRNaW5pbXVtQmFsYW5jZUZvclJlbnRFeGVtcHRpb24nLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXRNaW5pbXVtQmFsYW5jZUZvclJlbnRFeGVtcHRpb25ScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgY29uc29sZS53YXJuKCdVbmFibGUgdG8gZmV0Y2ggbWluaW11bSBiYWxhbmNlIGZvciByZW50IGV4ZW1wdGlvbicpO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgcmVjZW50IGJsb2NraGFzaCBmcm9tIHRoZSBjbHVzdGVyLCByZXR1cm4gd2l0aCBjb250ZXh0XG4gICAqIEByZXR1cm4ge1Byb21pc2U8UnBjUmVzcG9uc2VBbmRDb250ZXh0PHtibG9ja2hhc2g6IEJsb2NraGFzaCwgZmVlQ2FsY3VsYXRvcjogRmVlQ2FsY3VsYXRvcn0+Pn1cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBzaW5jZSBSUEMgdjEuOS4wLiBQbGVhc2UgdXNlIHtAbGluayBnZXRMYXRlc3RCbG9ja2hhc2h9IGluc3RlYWQuXG4gICAqL1xuICBhc3luYyBnZXRSZWNlbnRCbG9ja2hhc2hBbmRDb250ZXh0KGNvbW1pdG1lbnQpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb250ZXh0LFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgYmxvY2toYXNoXG4gICAgICB9XG4gICAgfSA9IGF3YWl0IHRoaXMuZ2V0TGF0ZXN0QmxvY2toYXNoQW5kQ29udGV4dChjb21taXRtZW50KTtcbiAgICBjb25zdCBmZWVDYWxjdWxhdG9yID0ge1xuICAgICAgZ2V0IGxhbXBvcnRzUGVyU2lnbmF0dXJlKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBjYXBhYmlsaXR5IHRvIGZldGNoIGBsYW1wb3J0c1BlclNpZ25hdHVyZWAgdXNpbmcgdGhlIGBnZXRSZWNlbnRCbG9ja2hhc2hgIEFQSSBpcyAnICsgJ25vIGxvbmdlciBvZmZlcmVkIGJ5IHRoZSBuZXR3b3JrLiBVc2UgdGhlIGBnZXRGZWVGb3JNZXNzYWdlYCBBUEkgdG8gb2J0YWluIHRoZSBmZWUgJyArICdmb3IgYSBnaXZlbiBtZXNzYWdlLicpO1xuICAgICAgfSxcbiAgICAgIHRvSlNPTigpIHtcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRleHQsXG4gICAgICB2YWx1ZToge1xuICAgICAgICBibG9ja2hhc2gsXG4gICAgICAgIGZlZUNhbGN1bGF0b3JcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHJlY2VudCBwZXJmb3JtYW5jZSBzYW1wbGVzXG4gICAqIEByZXR1cm4ge1Byb21pc2U8QXJyYXk8UGVyZlNhbXBsZT4+fVxuICAgKi9cbiAgYXN5bmMgZ2V0UmVjZW50UGVyZm9ybWFuY2VTYW1wbGVzKGxpbWl0KSB7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0UmVjZW50UGVyZm9ybWFuY2VTYW1wbGVzJywgbGltaXQgPyBbbGltaXRdIDogW10pO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldFJlY2VudFBlcmZvcm1hbmNlU2FtcGxlc1JwY1Jlc3VsdCk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgcmVjZW50IHBlcmZvcm1hbmNlIHNhbXBsZXMnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGZlZSBjYWxjdWxhdG9yIGZvciBhIHJlY2VudCBibG9ja2hhc2ggZnJvbSB0aGUgY2x1c3RlciwgcmV0dXJuIHdpdGggY29udGV4dFxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIHNpbmNlIFJQQyB2MS45LjAuIFBsZWFzZSB1c2Uge0BsaW5rIGdldEZlZUZvck1lc3NhZ2V9IGluc3RlYWQuXG4gICAqL1xuICBhc3luYyBnZXRGZWVDYWxjdWxhdG9yRm9yQmxvY2toYXNoKGJsb2NraGFzaCwgY29tbWl0bWVudCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3MoW2Jsb2NraGFzaF0sIGNvbW1pdG1lbnQpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldEZlZUNhbGN1bGF0b3JGb3JCbG9ja2hhc2gnLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXRGZWVDYWxjdWxhdG9yUnBjUmVzdWx0KTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCBmZWUgY2FsY3VsYXRvcicpO1xuICAgIH1cbiAgICBjb25zdCB7XG4gICAgICBjb250ZXh0LFxuICAgICAgdmFsdWVcbiAgICB9ID0gcmVzLnJlc3VsdDtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGV4dCxcbiAgICAgIHZhbHVlOiB2YWx1ZSAhPT0gbnVsbCA/IHZhbHVlLmZlZUNhbGN1bGF0b3IgOiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgZmVlIGZvciBhIG1lc3NhZ2UgZnJvbSB0aGUgY2x1c3RlciwgcmV0dXJuIHdpdGggY29udGV4dFxuICAgKi9cbiAgYXN5bmMgZ2V0RmVlRm9yTWVzc2FnZShtZXNzYWdlLCBjb21taXRtZW50KSB7XG4gICAgY29uc3Qgd2lyZU1lc3NhZ2UgPSB0b0J1ZmZlcihtZXNzYWdlLnNlcmlhbGl6ZSgpKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbd2lyZU1lc3NhZ2VdLCBjb21taXRtZW50KTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRGZWVGb3JNZXNzYWdlJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywganNvblJwY1Jlc3VsdEFuZENvbnRleHQobnVsbGFibGUobnVtYmVyKCkpKSk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgZmVlIGZvciBtZXNzYWdlJyk7XG4gICAgfVxuICAgIGlmIChyZXMucmVzdWx0ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgYmxvY2toYXNoJyk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgbGlzdCBvZiBwcmlvcml0aXphdGlvbiBmZWVzIGZyb20gcmVjZW50IGJsb2Nrcy5cbiAgICovXG4gIGFzeW5jIGdldFJlY2VudFByaW9yaXRpemF0aW9uRmVlcyhjb25maWcpIHtcbiAgICBjb25zdCBhY2NvdW50cyA9IGNvbmZpZz8ubG9ja2VkV3JpdGFibGVBY2NvdW50cz8ubWFwKGtleSA9PiBrZXkudG9CYXNlNTgoKSk7XG4gICAgY29uc3QgYXJncyA9IGFjY291bnRzPy5sZW5ndGggPyBbYWNjb3VudHNdIDogW107XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0UmVjZW50UHJpb3JpdGl6YXRpb25GZWVzJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0UmVjZW50UHJpb3JpdGl6YXRpb25GZWVzUnBjUmVzdWx0KTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCByZWNlbnQgcHJpb3JpdGl6YXRpb24gZmVlcycpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuICAvKipcbiAgICogRmV0Y2ggYSByZWNlbnQgYmxvY2toYXNoIGZyb20gdGhlIGNsdXN0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTx7YmxvY2toYXNoOiBCbG9ja2hhc2gsIGZlZUNhbGN1bGF0b3I6IEZlZUNhbGN1bGF0b3J9Pn1cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBzaW5jZSBSUEMgdjEuOC4wLiBQbGVhc2UgdXNlIHtAbGluayBnZXRMYXRlc3RCbG9ja2hhc2h9IGluc3RlYWQuXG4gICAqL1xuICBhc3luYyBnZXRSZWNlbnRCbG9ja2hhc2goY29tbWl0bWVudCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdldFJlY2VudEJsb2NraGFzaEFuZENvbnRleHQoY29tbWl0bWVudCk7XG4gICAgICByZXR1cm4gcmVzLnZhbHVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGdldCByZWNlbnQgYmxvY2toYXNoOiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBsYXRlc3QgYmxvY2toYXNoIGZyb20gdGhlIGNsdXN0ZXJcbiAgICogQHJldHVybiB7UHJvbWlzZTxCbG9ja2hhc2hXaXRoRXhwaXJ5QmxvY2tIZWlnaHQ+fVxuICAgKi9cbiAgYXN5bmMgZ2V0TGF0ZXN0QmxvY2toYXNoKGNvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdldExhdGVzdEJsb2NraGFzaEFuZENvbnRleHQoY29tbWl0bWVudE9yQ29uZmlnKTtcbiAgICAgIHJldHVybiByZXMudmFsdWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdmYWlsZWQgdG8gZ2V0IHJlY2VudCBibG9ja2hhc2g6ICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdGhlIGxhdGVzdCBibG9ja2hhc2ggZnJvbSB0aGUgY2x1c3RlclxuICAgKiBAcmV0dXJuIHtQcm9taXNlPEJsb2NraGFzaFdpdGhFeHBpcnlCbG9ja0hlaWdodD59XG4gICAqL1xuICBhc3luYyBnZXRMYXRlc3RCbG9ja2hhc2hBbmRDb250ZXh0KGNvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWdcbiAgICB9ID0gZXh0cmFjdENvbW1pdG1lbnRGcm9tQ29uZmlnKGNvbW1pdG1lbnRPckNvbmZpZyk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbXSwgY29tbWl0bWVudCwgdW5kZWZpbmVkIC8qIGVuY29kaW5nICovLCBjb25maWcpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldExhdGVzdEJsb2NraGFzaCcsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldExhdGVzdEJsb2NraGFzaFJwY1Jlc3VsdCk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgbGF0ZXN0IGJsb2NraGFzaCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBibG9ja2hhc2ggaXMgc3RpbGwgdmFsaWQgb3Igbm90XG4gICAqL1xuICBhc3luYyBpc0Jsb2NraGFzaFZhbGlkKGJsb2NraGFzaCwgcmF3Q29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tbWl0bWVudCxcbiAgICAgIGNvbmZpZ1xuICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcocmF3Q29uZmlnKTtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzKFtibG9ja2hhc2hdLCBjb21taXRtZW50LCB1bmRlZmluZWQgLyogZW5jb2RpbmcgKi8sIGNvbmZpZyk7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnaXNCbG9ja2hhc2hWYWxpZCcsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIElzQmxvY2toYXNoVmFsaWRScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBibG9ja2hhc2ggYCcgKyBibG9ja2hhc2ggKyAnYGlzIHZhbGlkJyk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBub2RlIHZlcnNpb25cbiAgICovXG4gIGFzeW5jIGdldFZlcnNpb24oKSB7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0VmVyc2lvbicsIFtdKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBqc29uUnBjUmVzdWx0KFZlcnNpb25SZXN1bHQpKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCB2ZXJzaW9uJyk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBnZW5lc2lzIGhhc2hcbiAgICovXG4gIGFzeW5jIGdldEdlbmVzaXNIYXNoKCkge1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldEdlbmVzaXNIYXNoJywgW10pO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIGpzb25ScGNSZXN1bHQoc3RyaW5nKCkpKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCBnZW5lc2lzIGhhc2gnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBwcm9jZXNzZWQgYmxvY2sgZnJvbSB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgSW5zdGVhZCwgY2FsbCBgZ2V0QmxvY2tgIHVzaW5nIGEgYEdldFZlcnNpb25lZEJsb2NrQ29uZmlnYCBieVxuICAgKiBzZXR0aW5nIHRoZSBgbWF4U3VwcG9ydGVkVHJhbnNhY3Rpb25WZXJzaW9uYCBwcm9wZXJ0eS5cbiAgICovXG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIEluc3RlYWQsIGNhbGwgYGdldEJsb2NrYCB1c2luZyBhIGBHZXRWZXJzaW9uZWRCbG9ja0NvbmZpZ2AgYnlcbiAgICogc2V0dGluZyB0aGUgYG1heFN1cHBvcnRlZFRyYW5zYWN0aW9uVmVyc2lvbmAgcHJvcGVydHkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1jbGFzcy1tZW1iZXJzXG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIEluc3RlYWQsIGNhbGwgYGdldEJsb2NrYCB1c2luZyBhIGBHZXRWZXJzaW9uZWRCbG9ja0NvbmZpZ2AgYnlcbiAgICogc2V0dGluZyB0aGUgYG1heFN1cHBvcnRlZFRyYW5zYWN0aW9uVmVyc2lvbmAgcHJvcGVydHkuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1jbGFzcy1tZW1iZXJzXG5cbiAgLyoqXG4gICAqIEZldGNoIGEgcHJvY2Vzc2VkIGJsb2NrIGZyb20gdGhlIGNsdXN0ZXIuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1jbGFzcy1tZW1iZXJzXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGUtY2xhc3MtbWVtYmVyc1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWNsYXNzLW1lbWJlcnNcblxuICAvKipcbiAgICogRmV0Y2ggYSBwcm9jZXNzZWQgYmxvY2sgZnJvbSB0aGUgY2x1c3Rlci5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWNsYXNzLW1lbWJlcnNcbiAgYXN5bmMgZ2V0QmxvY2soc2xvdCwgcmF3Q29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tbWl0bWVudCxcbiAgICAgIGNvbmZpZ1xuICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcocmF3Q29uZmlnKTtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzQXRMZWFzdENvbmZpcm1lZChbc2xvdF0sIGNvbW1pdG1lbnQsIHVuZGVmaW5lZCAvKiBlbmNvZGluZyAqLywgY29uZmlnKTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRCbG9jaycsIGFyZ3MpO1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKGNvbmZpZz8udHJhbnNhY3Rpb25EZXRhaWxzKSB7XG4gICAgICAgIGNhc2UgJ2FjY291bnRzJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXRBY2NvdW50c01vZGVCbG9ja1JwY1Jlc3VsdCk7XG4gICAgICAgICAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzLmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdub25lJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXROb25lTW9kZUJsb2NrUnBjUmVzdWx0KTtcbiAgICAgICAgICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgICAgICAgICB0aHJvdyByZXMuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0QmxvY2tScGNSZXN1bHQpO1xuICAgICAgICAgICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICAgICAgICAgIHRocm93IHJlcy5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICB9ID0gcmVzO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA/IHtcbiAgICAgICAgICAgICAgLi4ucmVzdWx0LFxuICAgICAgICAgICAgICB0cmFuc2FjdGlvbnM6IHJlc3VsdC50cmFuc2FjdGlvbnMubWFwKCh7XG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uXG4gICAgICAgICAgICAgIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgbWV0YSxcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgLi4udHJhbnNhY3Rpb24sXG4gICAgICAgICAgICAgICAgICBtZXNzYWdlOiB2ZXJzaW9uZWRNZXNzYWdlRnJvbVJlc3BvbnNlKHZlcnNpb24sIHRyYW5zYWN0aW9uLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uXG4gICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IoZSwgJ2ZhaWxlZCB0byBnZXQgY29uZmlybWVkIGJsb2NrJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHBhcnNlZCB0cmFuc2FjdGlvbiBkZXRhaWxzIGZvciBhIGNvbmZpcm1lZCBvciBmaW5hbGl6ZWQgYmxvY2tcbiAgICovXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGUtY2xhc3MtbWVtYmVyc1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWNsYXNzLW1lbWJlcnNcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1jbGFzcy1tZW1iZXJzXG4gIGFzeW5jIGdldFBhcnNlZEJsb2NrKHNsb3QsIHJhd0NvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWdcbiAgICB9ID0gZXh0cmFjdENvbW1pdG1lbnRGcm9tQ29uZmlnKHJhd0NvbmZpZyk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJnc0F0TGVhc3RDb25maXJtZWQoW3Nsb3RdLCBjb21taXRtZW50LCAnanNvblBhcnNlZCcsIGNvbmZpZyk7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0QmxvY2snLCBhcmdzKTtcbiAgICB0cnkge1xuICAgICAgc3dpdGNoIChjb25maWc/LnRyYW5zYWN0aW9uRGV0YWlscykge1xuICAgICAgICBjYXNlICdhY2NvdW50cyc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0UGFyc2VkQWNjb3VudHNNb2RlQmxvY2tScGNSZXN1bHQpO1xuICAgICAgICAgICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICAgICAgICAgIHRocm93IHJlcy5lcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXMucmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgY2FzZSAnbm9uZSc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0UGFyc2VkTm9uZU1vZGVCbG9ja1JwY1Jlc3VsdCk7XG4gICAgICAgICAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgICAgICAgICAgdGhyb3cgcmVzLmVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldFBhcnNlZEJsb2NrUnBjUmVzdWx0KTtcbiAgICAgICAgICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgICAgICAgICB0aHJvdyByZXMuZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihlLCAnZmFpbGVkIHRvIGdldCBibG9jaycpO1xuICAgIH1cbiAgfVxuICAvKlxuICAgKiBSZXR1cm5zIHJlY2VudCBibG9jayBwcm9kdWN0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1cnJlbnQgb3IgcHJldmlvdXMgZXBvY2hcbiAgICovXG4gIGFzeW5jIGdldEJsb2NrUHJvZHVjdGlvbihjb25maWdPckNvbW1pdG1lbnQpIHtcbiAgICBsZXQgZXh0cmE7XG4gICAgbGV0IGNvbW1pdG1lbnQ7XG4gICAgaWYgKHR5cGVvZiBjb25maWdPckNvbW1pdG1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb21taXRtZW50ID0gY29uZmlnT3JDb21taXRtZW50O1xuICAgIH0gZWxzZSBpZiAoY29uZmlnT3JDb21taXRtZW50KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGNvbW1pdG1lbnQ6IGMsXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0gPSBjb25maWdPckNvbW1pdG1lbnQ7XG4gICAgICBjb21taXRtZW50ID0gYztcbiAgICAgIGV4dHJhID0gcmVzdDtcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbXSwgY29tbWl0bWVudCwgJ2Jhc2U2NCcsIGV4dHJhKTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRCbG9ja1Byb2R1Y3Rpb24nLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBCbG9ja1Byb2R1Y3Rpb25SZXNwb25zZVN0cnVjdCk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgYmxvY2sgcHJvZHVjdGlvbiBpbmZvcm1hdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIGNvbmZpcm1lZCBvciBmaW5hbGl6ZWQgdHJhbnNhY3Rpb24gZnJvbSB0aGUgY2x1c3Rlci5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgSW5zdGVhZCwgY2FsbCBgZ2V0VHJhbnNhY3Rpb25gIHVzaW5nIGFcbiAgICogYEdldFZlcnNpb25lZFRyYW5zYWN0aW9uQ29uZmlnYCBieSBzZXR0aW5nIHRoZVxuICAgKiBgbWF4U3VwcG9ydGVkVHJhbnNhY3Rpb25WZXJzaW9uYCBwcm9wZXJ0eS5cbiAgICovXG5cbiAgLyoqXG4gICAqIEZldGNoIGEgY29uZmlybWVkIG9yIGZpbmFsaXplZCB0cmFuc2FjdGlvbiBmcm9tIHRoZSBjbHVzdGVyLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGUtY2xhc3MtbWVtYmVyc1xuXG4gIC8qKlxuICAgKiBGZXRjaCBhIGNvbmZpcm1lZCBvciBmaW5hbGl6ZWQgdHJhbnNhY3Rpb24gZnJvbSB0aGUgY2x1c3Rlci5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWNsYXNzLW1lbWJlcnNcbiAgYXN5bmMgZ2V0VHJhbnNhY3Rpb24oc2lnbmF0dXJlLCByYXdDb25maWcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb21taXRtZW50LFxuICAgICAgY29uZmlnXG4gICAgfSA9IGV4dHJhY3RDb21taXRtZW50RnJvbUNvbmZpZyhyYXdDb25maWcpO1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3NBdExlYXN0Q29uZmlybWVkKFtzaWduYXR1cmVdLCBjb21taXRtZW50LCB1bmRlZmluZWQgLyogZW5jb2RpbmcgKi8sIGNvbmZpZyk7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0VHJhbnNhY3Rpb24nLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXRUcmFuc2FjdGlvblJwY1Jlc3VsdCk7XG4gICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gcmVzLnJlc3VsdDtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ucmVzdWx0LFxuICAgICAgdHJhbnNhY3Rpb246IHtcbiAgICAgICAgLi4ucmVzdWx0LnRyYW5zYWN0aW9uLFxuICAgICAgICBtZXNzYWdlOiB2ZXJzaW9uZWRNZXNzYWdlRnJvbVJlc3BvbnNlKHJlc3VsdC52ZXJzaW9uLCByZXN1bHQudHJhbnNhY3Rpb24ubWVzc2FnZSlcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHBhcnNlZCB0cmFuc2FjdGlvbiBkZXRhaWxzIGZvciBhIGNvbmZpcm1lZCBvciBmaW5hbGl6ZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIGFzeW5jIGdldFBhcnNlZFRyYW5zYWN0aW9uKHNpZ25hdHVyZSwgY29tbWl0bWVudE9yQ29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tbWl0bWVudCxcbiAgICAgIGNvbmZpZ1xuICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcoY29tbWl0bWVudE9yQ29uZmlnKTtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzQXRMZWFzdENvbmZpcm1lZChbc2lnbmF0dXJlXSwgY29tbWl0bWVudCwgJ2pzb25QYXJzZWQnLCBjb25maWcpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldFRyYW5zYWN0aW9uJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0UGFyc2VkVHJhbnNhY3Rpb25ScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHBhcnNlZCB0cmFuc2FjdGlvbiBkZXRhaWxzIGZvciBhIGJhdGNoIG9mIGNvbmZpcm1lZCB0cmFuc2FjdGlvbnNcbiAgICovXG4gIGFzeW5jIGdldFBhcnNlZFRyYW5zYWN0aW9ucyhzaWduYXR1cmVzLCBjb21taXRtZW50T3JDb25maWcpIHtcbiAgICBjb25zdCB7XG4gICAgICBjb21taXRtZW50LFxuICAgICAgY29uZmlnXG4gICAgfSA9IGV4dHJhY3RDb21taXRtZW50RnJvbUNvbmZpZyhjb21taXRtZW50T3JDb25maWcpO1xuICAgIGNvbnN0IGJhdGNoID0gc2lnbmF0dXJlcy5tYXAoc2lnbmF0dXJlID0+IHtcbiAgICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3NBdExlYXN0Q29uZmlybWVkKFtzaWduYXR1cmVdLCBjb21taXRtZW50LCAnanNvblBhcnNlZCcsIGNvbmZpZyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXRob2ROYW1lOiAnZ2V0VHJhbnNhY3Rpb24nLFxuICAgICAgICBhcmdzXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY0JhdGNoUmVxdWVzdChiYXRjaCk7XG4gICAgY29uc3QgcmVzID0gdW5zYWZlUmVzLm1hcCh1bnNhZmVSZXMgPT4ge1xuICAgICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0UGFyc2VkVHJhbnNhY3Rpb25ScGNSZXN1bHQpO1xuICAgICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCB0cmFuc2FjdGlvbnMnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMucmVzdWx0O1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggdHJhbnNhY3Rpb24gZGV0YWlscyBmb3IgYSBiYXRjaCBvZiBjb25maXJtZWQgdHJhbnNhY3Rpb25zLlxuICAgKiBTaW1pbGFyIHRvIHtAbGluayBnZXRQYXJzZWRUcmFuc2FjdGlvbnN9IGJ1dCByZXR1cm5zIGEge0BsaW5rIFRyYW5zYWN0aW9uUmVzcG9uc2V9LlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBJbnN0ZWFkLCBjYWxsIGBnZXRUcmFuc2FjdGlvbnNgIHVzaW5nIGFcbiAgICogYEdldFZlcnNpb25lZFRyYW5zYWN0aW9uQ29uZmlnYCBieSBzZXR0aW5nIHRoZVxuICAgKiBgbWF4U3VwcG9ydGVkVHJhbnNhY3Rpb25WZXJzaW9uYCBwcm9wZXJ0eS5cbiAgICovXG5cbiAgLyoqXG4gICAqIEZldGNoIHRyYW5zYWN0aW9uIGRldGFpbHMgZm9yIGEgYmF0Y2ggb2YgY29uZmlybWVkIHRyYW5zYWN0aW9ucy5cbiAgICogU2ltaWxhciB0byB7QGxpbmsgZ2V0UGFyc2VkVHJhbnNhY3Rpb25zfSBidXQgcmV0dXJucyBhIHtAbGlua1xuICAgKiBWZXJzaW9uZWRUcmFuc2FjdGlvblJlc3BvbnNlfS5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWNsYXNzLW1lbWJlcnNcblxuICAvKipcbiAgICogRmV0Y2ggdHJhbnNhY3Rpb24gZGV0YWlscyBmb3IgYSBiYXRjaCBvZiBjb25maXJtZWQgdHJhbnNhY3Rpb25zLlxuICAgKiBTaW1pbGFyIHRvIHtAbGluayBnZXRQYXJzZWRUcmFuc2FjdGlvbnN9IGJ1dCByZXR1cm5zIGEge0BsaW5rXG4gICAqIFZlcnNpb25lZFRyYW5zYWN0aW9uUmVzcG9uc2V9LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGUtY2xhc3MtbWVtYmVyc1xuICBhc3luYyBnZXRUcmFuc2FjdGlvbnMoc2lnbmF0dXJlcywgY29tbWl0bWVudE9yQ29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tbWl0bWVudCxcbiAgICAgIGNvbmZpZ1xuICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcoY29tbWl0bWVudE9yQ29uZmlnKTtcbiAgICBjb25zdCBiYXRjaCA9IHNpZ25hdHVyZXMubWFwKHNpZ25hdHVyZSA9PiB7XG4gICAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzQXRMZWFzdENvbmZpcm1lZChbc2lnbmF0dXJlXSwgY29tbWl0bWVudCwgdW5kZWZpbmVkIC8qIGVuY29kaW5nICovLCBjb25maWcpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbWV0aG9kTmFtZTogJ2dldFRyYW5zYWN0aW9uJyxcbiAgICAgICAgYXJnc1xuICAgICAgfTtcbiAgICB9KTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNCYXRjaFJlcXVlc3QoYmF0Y2gpO1xuICAgIGNvbnN0IHJlcyA9IHVuc2FmZVJlcy5tYXAodW5zYWZlUmVzID0+IHtcbiAgICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldFRyYW5zYWN0aW9uUnBjUmVzdWx0KTtcbiAgICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgICB0aHJvdyBuZXcgU29sYW5hSlNPTlJQQ0Vycm9yKHJlcy5lcnJvciwgJ2ZhaWxlZCB0byBnZXQgdHJhbnNhY3Rpb25zJyk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSByZXMucmVzdWx0O1xuICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgIHRyYW5zYWN0aW9uOiB7XG4gICAgICAgICAgLi4ucmVzdWx0LnRyYW5zYWN0aW9uLFxuICAgICAgICAgIG1lc3NhZ2U6IHZlcnNpb25lZE1lc3NhZ2VGcm9tUmVzcG9uc2UocmVzdWx0LnZlcnNpb24sIHJlc3VsdC50cmFuc2FjdGlvbi5tZXNzYWdlKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSBsaXN0IG9mIFRyYW5zYWN0aW9ucyBhbmQgdHJhbnNhY3Rpb24gc3RhdHVzZXMgZnJvbSB0aGUgY2x1c3RlclxuICAgKiBmb3IgYSBjb25maXJtZWQgYmxvY2suXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgc2luY2UgUlBDIHYxLjcuMC4gUGxlYXNlIHVzZSB7QGxpbmsgZ2V0QmxvY2t9IGluc3RlYWQuXG4gICAqL1xuICBhc3luYyBnZXRDb25maXJtZWRCbG9jayhzbG90LCBjb21taXRtZW50KSB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJnc0F0TGVhc3RDb25maXJtZWQoW3Nsb3RdLCBjb21taXRtZW50KTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRCbG9jaycsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldENvbmZpcm1lZEJsb2NrUnBjUmVzdWx0KTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCBjb25maXJtZWQgYmxvY2snKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gcmVzLnJlc3VsdDtcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb25maXJtZWQgYmxvY2sgJyArIHNsb3QgKyAnIG5vdCBmb3VuZCcpO1xuICAgIH1cbiAgICBjb25zdCBibG9jayA9IHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIHRyYW5zYWN0aW9uczogcmVzdWx0LnRyYW5zYWN0aW9ucy5tYXAoKHtcbiAgICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICAgIG1ldGFcbiAgICAgIH0pID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHRyYW5zYWN0aW9uLm1lc3NhZ2UpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldGEsXG4gICAgICAgICAgdHJhbnNhY3Rpb246IHtcbiAgICAgICAgICAgIC4uLnRyYW5zYWN0aW9uLFxuICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYmxvY2ssXG4gICAgICB0cmFuc2FjdGlvbnM6IGJsb2NrLnRyYW5zYWN0aW9ucy5tYXAoKHtcbiAgICAgICAgdHJhbnNhY3Rpb24sXG4gICAgICAgIG1ldGFcbiAgICAgIH0pID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBtZXRhLFxuICAgICAgICAgIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbi5wb3B1bGF0ZSh0cmFuc2FjdGlvbi5tZXNzYWdlLCB0cmFuc2FjdGlvbi5zaWduYXR1cmVzKVxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGNvbmZpcm1lZCBibG9ja3MgYmV0d2VlbiB0d28gc2xvdHNcbiAgICovXG4gIGFzeW5jIGdldEJsb2NrcyhzdGFydFNsb3QsIGVuZFNsb3QsIGNvbW1pdG1lbnQpIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzQXRMZWFzdENvbmZpcm1lZChlbmRTbG90ICE9PSB1bmRlZmluZWQgPyBbc3RhcnRTbG90LCBlbmRTbG90XSA6IFtzdGFydFNsb3RdLCBjb21taXRtZW50KTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRCbG9ja3MnLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBqc29uUnBjUmVzdWx0KGFycmF5KG51bWJlcigpKSkpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IGJsb2NrcycpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIGxpc3Qgb2YgU2lnbmF0dXJlcyBmcm9tIHRoZSBjbHVzdGVyIGZvciBhIGJsb2NrLCBleGNsdWRpbmcgcmV3YXJkc1xuICAgKi9cbiAgYXN5bmMgZ2V0QmxvY2tTaWduYXR1cmVzKHNsb3QsIGNvbW1pdG1lbnQpIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzQXRMZWFzdENvbmZpcm1lZChbc2xvdF0sIGNvbW1pdG1lbnQsIHVuZGVmaW5lZCwge1xuICAgICAgdHJhbnNhY3Rpb25EZXRhaWxzOiAnc2lnbmF0dXJlcycsXG4gICAgICByZXdhcmRzOiBmYWxzZVxuICAgIH0pO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldEJsb2NrJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0QmxvY2tTaWduYXR1cmVzUnBjUmVzdWx0KTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCBibG9jaycpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSByZXMucmVzdWx0O1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Jsb2NrICcgKyBzbG90ICsgJyBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCBhIGxpc3Qgb2YgU2lnbmF0dXJlcyBmcm9tIHRoZSBjbHVzdGVyIGZvciBhIGNvbmZpcm1lZCBibG9jaywgZXhjbHVkaW5nIHJld2FyZHNcbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBzaW5jZSBSUEMgdjEuNy4wLiBQbGVhc2UgdXNlIHtAbGluayBnZXRCbG9ja1NpZ25hdHVyZXN9IGluc3RlYWQuXG4gICAqL1xuICBhc3luYyBnZXRDb25maXJtZWRCbG9ja1NpZ25hdHVyZXMoc2xvdCwgY29tbWl0bWVudCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3NBdExlYXN0Q29uZmlybWVkKFtzbG90XSwgY29tbWl0bWVudCwgdW5kZWZpbmVkLCB7XG4gICAgICB0cmFuc2FjdGlvbkRldGFpbHM6ICdzaWduYXR1cmVzJyxcbiAgICAgIHJld2FyZHM6IGZhbHNlXG4gICAgfSk7XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnZ2V0QmxvY2snLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXRCbG9ja1NpZ25hdHVyZXNScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IGNvbmZpcm1lZCBibG9jaycpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSByZXMucmVzdWx0O1xuICAgIGlmICghcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpcm1lZCBibG9jayAnICsgc2xvdCArICcgbm90IGZvdW5kJyk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggYSB0cmFuc2FjdGlvbiBkZXRhaWxzIGZvciBhIGNvbmZpcm1lZCB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIHNpbmNlIFJQQyB2MS43LjAuIFBsZWFzZSB1c2Uge0BsaW5rIGdldFRyYW5zYWN0aW9ufSBpbnN0ZWFkLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlybWVkVHJhbnNhY3Rpb24oc2lnbmF0dXJlLCBjb21taXRtZW50KSB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJnc0F0TGVhc3RDb25maXJtZWQoW3NpZ25hdHVyZV0sIGNvbW1pdG1lbnQpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldFRyYW5zYWN0aW9uJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0VHJhbnNhY3Rpb25ScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IHRyYW5zYWN0aW9uJyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IHJlcy5yZXN1bHQ7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgY29uc3QgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKHJlc3VsdC50cmFuc2FjdGlvbi5tZXNzYWdlKTtcbiAgICBjb25zdCBzaWduYXR1cmVzID0gcmVzdWx0LnRyYW5zYWN0aW9uLnNpZ25hdHVyZXM7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbi5wb3B1bGF0ZShtZXNzYWdlLCBzaWduYXR1cmVzKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggcGFyc2VkIHRyYW5zYWN0aW9uIGRldGFpbHMgZm9yIGEgY29uZmlybWVkIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIERlcHJlY2F0ZWQgc2luY2UgUlBDIHYxLjcuMC4gUGxlYXNlIHVzZSB7QGxpbmsgZ2V0UGFyc2VkVHJhbnNhY3Rpb259IGluc3RlYWQuXG4gICAqL1xuICBhc3luYyBnZXRQYXJzZWRDb25maXJtZWRUcmFuc2FjdGlvbihzaWduYXR1cmUsIGNvbW1pdG1lbnQpIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzQXRMZWFzdENvbmZpcm1lZChbc2lnbmF0dXJlXSwgY29tbWl0bWVudCwgJ2pzb25QYXJzZWQnKTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRUcmFuc2FjdGlvbicsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIEdldFBhcnNlZFRyYW5zYWN0aW9uUnBjUmVzdWx0KTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCBjb25maXJtZWQgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2ggcGFyc2VkIHRyYW5zYWN0aW9uIGRldGFpbHMgZm9yIGEgYmF0Y2ggb2YgY29uZmlybWVkIHRyYW5zYWN0aW9uc1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIHNpbmNlIFJQQyB2MS43LjAuIFBsZWFzZSB1c2Uge0BsaW5rIGdldFBhcnNlZFRyYW5zYWN0aW9uc30gaW5zdGVhZC5cbiAgICovXG4gIGFzeW5jIGdldFBhcnNlZENvbmZpcm1lZFRyYW5zYWN0aW9ucyhzaWduYXR1cmVzLCBjb21taXRtZW50KSB7XG4gICAgY29uc3QgYmF0Y2ggPSBzaWduYXR1cmVzLm1hcChzaWduYXR1cmUgPT4ge1xuICAgICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJnc0F0TGVhc3RDb25maXJtZWQoW3NpZ25hdHVyZV0sIGNvbW1pdG1lbnQsICdqc29uUGFyc2VkJyk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtZXRob2ROYW1lOiAnZ2V0VHJhbnNhY3Rpb24nLFxuICAgICAgICBhcmdzXG4gICAgICB9O1xuICAgIH0pO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY0JhdGNoUmVxdWVzdChiYXRjaCk7XG4gICAgY29uc3QgcmVzID0gdW5zYWZlUmVzLm1hcCh1bnNhZmVSZXMgPT4ge1xuICAgICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0UGFyc2VkVHJhbnNhY3Rpb25ScGNSZXN1bHQpO1xuICAgICAgaWYgKCdlcnJvcicgaW4gcmVzKSB7XG4gICAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCAnZmFpbGVkIHRvIGdldCBjb25maXJtZWQgdHJhbnNhY3Rpb25zJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGEgbGlzdCBvZiBhbGwgdGhlIGNvbmZpcm1lZCBzaWduYXR1cmVzIGZvciB0cmFuc2FjdGlvbnMgaW52b2x2aW5nIGFuIGFkZHJlc3NcbiAgICogd2l0aGluIGEgc3BlY2lmaWVkIHNsb3QgcmFuZ2UuIE1heCByYW5nZSBhbGxvd2VkIGlzIDEwLDAwMCBzbG90cy5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgRGVwcmVjYXRlZCBzaW5jZSBSUEMgdjEuMy4gUGxlYXNlIHVzZSB7QGxpbmsgZ2V0Q29uZmlybWVkU2lnbmF0dXJlc0ZvckFkZHJlc3MyfSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gYWRkcmVzcyBxdWVyaWVkIGFkZHJlc3NcbiAgICogQHBhcmFtIHN0YXJ0U2xvdCBzdGFydCBzbG90LCBpbmNsdXNpdmVcbiAgICogQHBhcmFtIGVuZFNsb3QgZW5kIHNsb3QsIGluY2x1c2l2ZVxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlybWVkU2lnbmF0dXJlc0ZvckFkZHJlc3MoYWRkcmVzcywgc3RhcnRTbG90LCBlbmRTbG90KSB7XG4gICAgbGV0IG9wdGlvbnMgPSB7fTtcbiAgICBsZXQgZmlyc3RBdmFpbGFibGVCbG9jayA9IGF3YWl0IHRoaXMuZ2V0Rmlyc3RBdmFpbGFibGVCbG9jaygpO1xuICAgIHdoaWxlICghKCd1bnRpbCcgaW4gb3B0aW9ucykpIHtcbiAgICAgIHN0YXJ0U2xvdC0tO1xuICAgICAgaWYgKHN0YXJ0U2xvdCA8PSAwIHx8IHN0YXJ0U2xvdCA8IGZpcnN0QXZhaWxhYmxlQmxvY2spIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBibG9jayA9IGF3YWl0IHRoaXMuZ2V0Q29uZmlybWVkQmxvY2tTaWduYXR1cmVzKHN0YXJ0U2xvdCwgJ2ZpbmFsaXplZCcpO1xuICAgICAgICBpZiAoYmxvY2suc2lnbmF0dXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgb3B0aW9ucy51bnRpbCA9IGJsb2NrLnNpZ25hdHVyZXNbYmxvY2suc2lnbmF0dXJlcy5sZW5ndGggLSAxXS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIGVyci5tZXNzYWdlLmluY2x1ZGVzKCdza2lwcGVkJykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGhpZ2hlc3RDb25maXJtZWRSb290ID0gYXdhaXQgdGhpcy5nZXRTbG90KCdmaW5hbGl6ZWQnKTtcbiAgICB3aGlsZSAoISgnYmVmb3JlJyBpbiBvcHRpb25zKSkge1xuICAgICAgZW5kU2xvdCsrO1xuICAgICAgaWYgKGVuZFNsb3QgPiBoaWdoZXN0Q29uZmlybWVkUm9vdCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGJsb2NrID0gYXdhaXQgdGhpcy5nZXRDb25maXJtZWRCbG9ja1NpZ25hdHVyZXMoZW5kU2xvdCk7XG4gICAgICAgIGlmIChibG9jay5zaWduYXR1cmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBvcHRpb25zLmJlZm9yZSA9IGJsb2NrLnNpZ25hdHVyZXNbYmxvY2suc2lnbmF0dXJlcy5sZW5ndGggLSAxXS50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yICYmIGVyci5tZXNzYWdlLmluY2x1ZGVzKCdza2lwcGVkJykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29uZmlybWVkU2lnbmF0dXJlSW5mbyA9IGF3YWl0IHRoaXMuZ2V0Q29uZmlybWVkU2lnbmF0dXJlc0ZvckFkZHJlc3MyKGFkZHJlc3MsIG9wdGlvbnMpO1xuICAgIHJldHVybiBjb25maXJtZWRTaWduYXR1cmVJbmZvLm1hcChpbmZvID0+IGluZm8uc2lnbmF0dXJlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGNvbmZpcm1lZCBzaWduYXR1cmVzIGZvciB0cmFuc2FjdGlvbnMgaW52b2x2aW5nIGFuXG4gICAqIGFkZHJlc3MgYmFja3dhcmRzIGluIHRpbWUgZnJvbSB0aGUgcHJvdmlkZWQgc2lnbmF0dXJlIG9yIG1vc3QgcmVjZW50IGNvbmZpcm1lZCBibG9ja1xuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIHNpbmNlIFJQQyB2MS43LjAuIFBsZWFzZSB1c2Uge0BsaW5rIGdldFNpZ25hdHVyZXNGb3JBZGRyZXNzfSBpbnN0ZWFkLlxuICAgKi9cbiAgYXN5bmMgZ2V0Q29uZmlybWVkU2lnbmF0dXJlc0ZvckFkZHJlc3MyKGFkZHJlc3MsIG9wdGlvbnMsIGNvbW1pdG1lbnQpIHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzQXRMZWFzdENvbmZpcm1lZChbYWRkcmVzcy50b0Jhc2U1OCgpXSwgY29tbWl0bWVudCwgdW5kZWZpbmVkLCBvcHRpb25zKTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRDb25maXJtZWRTaWduYXR1cmVzRm9yQWRkcmVzczInLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBHZXRDb25maXJtZWRTaWduYXR1cmVzRm9yQWRkcmVzczJScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IGNvbmZpcm1lZCBzaWduYXR1cmVzIGZvciBhZGRyZXNzJyk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgY29uZmlybWVkIHNpZ25hdHVyZXMgZm9yIHRyYW5zYWN0aW9ucyBpbnZvbHZpbmcgYW5cbiAgICogYWRkcmVzcyBiYWNrd2FyZHMgaW4gdGltZSBmcm9tIHRoZSBwcm92aWRlZCBzaWduYXR1cmUgb3IgbW9zdCByZWNlbnQgY29uZmlybWVkIGJsb2NrXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSBhZGRyZXNzIHF1ZXJpZWQgYWRkcmVzc1xuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgYXN5bmMgZ2V0U2lnbmF0dXJlc0ZvckFkZHJlc3MoYWRkcmVzcywgb3B0aW9ucywgY29tbWl0bWVudCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3NBdExlYXN0Q29uZmlybWVkKFthZGRyZXNzLnRvQmFzZTU4KCldLCBjb21taXRtZW50LCB1bmRlZmluZWQsIG9wdGlvbnMpO1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ2dldFNpZ25hdHVyZXNGb3JBZGRyZXNzJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgR2V0U2lnbmF0dXJlc0ZvckFkZHJlc3NScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsICdmYWlsZWQgdG8gZ2V0IHNpZ25hdHVyZXMgZm9yIGFkZHJlc3MnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cbiAgYXN5bmMgZ2V0QWRkcmVzc0xvb2t1cFRhYmxlKGFjY291bnRLZXksIGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICB2YWx1ZTogYWNjb3VudEluZm9cbiAgICB9ID0gYXdhaXQgdGhpcy5nZXRBY2NvdW50SW5mb0FuZENvbnRleHQoYWNjb3VudEtleSwgY29uZmlnKTtcbiAgICBsZXQgdmFsdWUgPSBudWxsO1xuICAgIGlmIChhY2NvdW50SW5mbyAhPT0gbnVsbCkge1xuICAgICAgdmFsdWUgPSBuZXcgQWRkcmVzc0xvb2t1cFRhYmxlQWNjb3VudCh7XG4gICAgICAgIGtleTogYWNjb3VudEtleSxcbiAgICAgICAgc3RhdGU6IEFkZHJlc3NMb29rdXBUYWJsZUFjY291bnQuZGVzZXJpYWxpemUoYWNjb3VudEluZm8uZGF0YSlcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29udGV4dCxcbiAgICAgIHZhbHVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaCB0aGUgY29udGVudHMgb2YgYSBOb25jZSBhY2NvdW50IGZyb20gdGhlIGNsdXN0ZXIsIHJldHVybiB3aXRoIGNvbnRleHRcbiAgICovXG4gIGFzeW5jIGdldE5vbmNlQW5kQ29udGV4dChub25jZUFjY291bnQsIGNvbW1pdG1lbnRPckNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbnRleHQsXG4gICAgICB2YWx1ZTogYWNjb3VudEluZm9cbiAgICB9ID0gYXdhaXQgdGhpcy5nZXRBY2NvdW50SW5mb0FuZENvbnRleHQobm9uY2VBY2NvdW50LCBjb21taXRtZW50T3JDb25maWcpO1xuICAgIGxldCB2YWx1ZSA9IG51bGw7XG4gICAgaWYgKGFjY291bnRJbmZvICE9PSBudWxsKSB7XG4gICAgICB2YWx1ZSA9IE5vbmNlQWNjb3VudC5mcm9tQWNjb3VudERhdGEoYWNjb3VudEluZm8uZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb250ZXh0LFxuICAgICAgdmFsdWVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIHRoZSBjb250ZW50cyBvZiBhIE5vbmNlIGFjY291bnQgZnJvbSB0aGUgY2x1c3RlclxuICAgKi9cbiAgYXN5bmMgZ2V0Tm9uY2Uobm9uY2VBY2NvdW50LCBjb21taXRtZW50T3JDb25maWcpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXROb25jZUFuZENvbnRleHQobm9uY2VBY2NvdW50LCBjb21taXRtZW50T3JDb25maWcpLnRoZW4oeCA9PiB4LnZhbHVlKS5jYXRjaChlID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGdldCBub25jZSBmb3IgYWNjb3VudCAnICsgbm9uY2VBY2NvdW50LnRvQmFzZTU4KCkgKyAnOiAnICsgZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVxdWVzdCBhbiBhbGxvY2F0aW9uIG9mIGxhbXBvcnRzIHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzc1xuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IENvbm5lY3Rpb24sIFB1YmxpY0tleSwgTEFNUE9SVFNfUEVSX1NPTCB9IGZyb20gXCJAc29sYW5hL3dlYjMuanNcIjtcbiAgICpcbiAgICogKGFzeW5jICgpID0+IHtcbiAgICogICBjb25zdCBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oXCJodHRwczovL2FwaS50ZXN0bmV0LnNvbGFuYS5jb21cIiwgXCJjb25maXJtZWRcIik7XG4gICAqICAgY29uc3QgbXlBZGRyZXNzID0gbmV3IFB1YmxpY0tleShcIjJucjFiSEZUODZXOXRHbnl2bVlXNHZjSEtzUUIzc1ZRZm5kZGFzejRrRXhNXCIpO1xuICAgKiAgIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IGNvbm5lY3Rpb24ucmVxdWVzdEFpcmRyb3AobXlBZGRyZXNzLCBMQU1QT1JUU19QRVJfU09MKTtcbiAgICogICBhd2FpdCBjb25uZWN0aW9uLmNvbmZpcm1UcmFuc2FjdGlvbihzaWduYXR1cmUpO1xuICAgKiB9KSgpO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlcXVlc3RBaXJkcm9wKHRvLCBsYW1wb3J0cykge1xuICAgIGNvbnN0IHVuc2FmZVJlcyA9IGF3YWl0IHRoaXMuX3JwY1JlcXVlc3QoJ3JlcXVlc3RBaXJkcm9wJywgW3RvLnRvQmFzZTU4KCksIGxhbXBvcnRzXSk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywgUmVxdWVzdEFpcmRyb3BScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgdGhyb3cgbmV3IFNvbGFuYUpTT05SUENFcnJvcihyZXMuZXJyb3IsIGBhaXJkcm9wIHRvICR7dG8udG9CYXNlNTgoKX0gZmFpbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiByZXMucmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgX2Jsb2NraGFzaFdpdGhFeHBpcnlCbG9ja0hlaWdodChkaXNhYmxlQ2FjaGUpIHtcbiAgICBpZiAoIWRpc2FibGVDYWNoZSkge1xuICAgICAgLy8gV2FpdCBmb3IgcG9sbGluZyB0byBmaW5pc2hcbiAgICAgIHdoaWxlICh0aGlzLl9wb2xsaW5nQmxvY2toYXNoKSB7XG4gICAgICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAgICB9XG4gICAgICBjb25zdCB0aW1lU2luY2VGZXRjaCA9IERhdGUubm93KCkgLSB0aGlzLl9ibG9ja2hhc2hJbmZvLmxhc3RGZXRjaDtcbiAgICAgIGNvbnN0IGV4cGlyZWQgPSB0aW1lU2luY2VGZXRjaCA+PSBCTE9DS0hBU0hfQ0FDSEVfVElNRU9VVF9NUztcbiAgICAgIGlmICh0aGlzLl9ibG9ja2hhc2hJbmZvLmxhdGVzdEJsb2NraGFzaCAhPT0gbnVsbCAmJiAhZXhwaXJlZCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmxvY2toYXNoSW5mby5sYXRlc3RCbG9ja2hhc2g7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhd2FpdCB0aGlzLl9wb2xsTmV3QmxvY2toYXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBhc3luYyBfcG9sbE5ld0Jsb2NraGFzaCgpIHtcbiAgICB0aGlzLl9wb2xsaW5nQmxvY2toYXNoID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGNhY2hlZExhdGVzdEJsb2NraGFzaCA9IHRoaXMuX2Jsb2NraGFzaEluZm8ubGF0ZXN0QmxvY2toYXNoO1xuICAgICAgY29uc3QgY2FjaGVkQmxvY2toYXNoID0gY2FjaGVkTGF0ZXN0QmxvY2toYXNoID8gY2FjaGVkTGF0ZXN0QmxvY2toYXNoLmJsb2NraGFzaCA6IG51bGw7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDUwOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGF0ZXN0QmxvY2toYXNoID0gYXdhaXQgdGhpcy5nZXRMYXRlc3RCbG9ja2hhc2goJ2ZpbmFsaXplZCcpO1xuICAgICAgICBpZiAoY2FjaGVkQmxvY2toYXNoICE9PSBsYXRlc3RCbG9ja2hhc2guYmxvY2toYXNoKSB7XG4gICAgICAgICAgdGhpcy5fYmxvY2toYXNoSW5mbyA9IHtcbiAgICAgICAgICAgIGxhdGVzdEJsb2NraGFzaCxcbiAgICAgICAgICAgIGxhc3RGZXRjaDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uU2lnbmF0dXJlczogW10sXG4gICAgICAgICAgICBzaW11bGF0ZWRTaWduYXR1cmVzOiBbXVxuICAgICAgICAgIH07XG4gICAgICAgICAgcmV0dXJuIGxhdGVzdEJsb2NraGFzaDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNsZWVwIGZvciBhcHByb3hpbWF0ZWx5IGhhbGYgYSBzbG90XG4gICAgICAgIGF3YWl0IHNsZWVwKE1TX1BFUl9TTE9UIC8gMik7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBvYnRhaW4gYSBuZXcgYmxvY2toYXNoIGFmdGVyICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2ApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9wb2xsaW5nQmxvY2toYXNoID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGdldCB0aGUgc3Rha2UgbWluaW11bSBkZWxlZ2F0aW9uXG4gICAqL1xuICBhc3luYyBnZXRTdGFrZU1pbmltdW1EZWxlZ2F0aW9uKGNvbmZpZykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWc6IGNvbmZpZ0FyZ1xuICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcoY29uZmlnKTtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzKFtdLCBjb21taXRtZW50LCAnYmFzZTY0JywgY29uZmlnQXJnKTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdnZXRTdGFrZU1pbmltdW1EZWxlZ2F0aW9uJywgYXJncyk7XG4gICAgY29uc3QgcmVzID0gY3JlYXRlKHVuc2FmZVJlcywganNvblJwY1Jlc3VsdEFuZENvbnRleHQobnVtYmVyKCkpKTtcbiAgICBpZiAoJ2Vycm9yJyBpbiByZXMpIHtcbiAgICAgIHRocm93IG5ldyBTb2xhbmFKU09OUlBDRXJyb3IocmVzLmVycm9yLCBgZmFpbGVkIHRvIGdldCBzdGFrZSBtaW5pbXVtIGRlbGVnYXRpb25gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogU2ltdWxhdGUgYSB0cmFuc2FjdGlvblxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCBJbnN0ZWFkLCBjYWxsIHtAbGluayBzaW11bGF0ZVRyYW5zYWN0aW9ufSB3aXRoIHtAbGlua1xuICAgKiBWZXJzaW9uZWRUcmFuc2FjdGlvbn0gYW5kIHtAbGluayBTaW11bGF0ZVRyYW5zYWN0aW9uQ29uZmlnfSBwYXJhbWV0ZXJzXG4gICAqL1xuXG4gIC8qKlxuICAgKiBTaW11bGF0ZSBhIHRyYW5zYWN0aW9uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1jbGFzcy1tZW1iZXJzXG5cbiAgLyoqXG4gICAqIFNpbXVsYXRlIGEgdHJhbnNhY3Rpb25cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWNsYXNzLW1lbWJlcnNcbiAgYXN5bmMgc2ltdWxhdGVUcmFuc2FjdGlvbih0cmFuc2FjdGlvbk9yTWVzc2FnZSwgY29uZmlnT3JTaWduZXJzLCBpbmNsdWRlQWNjb3VudHMpIHtcbiAgICBpZiAoJ21lc3NhZ2UnIGluIHRyYW5zYWN0aW9uT3JNZXNzYWdlKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uZWRUeCA9IHRyYW5zYWN0aW9uT3JNZXNzYWdlO1xuICAgICAgY29uc3Qgd2lyZVRyYW5zYWN0aW9uID0gdmVyc2lvbmVkVHguc2VyaWFsaXplKCk7XG4gICAgICBjb25zdCBlbmNvZGVkVHJhbnNhY3Rpb24gPSBCdWZmZXIuZnJvbSh3aXJlVHJhbnNhY3Rpb24pLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZ09yU2lnbmVycykgfHwgaW5jbHVkZUFjY291bnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cycpO1xuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlnID0gY29uZmlnT3JTaWduZXJzIHx8IHt9O1xuICAgICAgY29uZmlnLmVuY29kaW5nID0gJ2Jhc2U2NCc7XG4gICAgICBpZiAoISgnY29tbWl0bWVudCcgaW4gY29uZmlnKSkge1xuICAgICAgICBjb25maWcuY29tbWl0bWVudCA9IHRoaXMuY29tbWl0bWVudDtcbiAgICAgIH1cbiAgICAgIGlmIChjb25maWdPclNpZ25lcnMgJiYgdHlwZW9mIGNvbmZpZ09yU2lnbmVycyA9PT0gJ29iamVjdCcgJiYgJ2lubmVySW5zdHJ1Y3Rpb25zJyBpbiBjb25maWdPclNpZ25lcnMpIHtcbiAgICAgICAgY29uZmlnLmlubmVySW5zdHJ1Y3Rpb25zID0gY29uZmlnT3JTaWduZXJzLmlubmVySW5zdHJ1Y3Rpb25zO1xuICAgICAgfVxuICAgICAgY29uc3QgYXJncyA9IFtlbmNvZGVkVHJhbnNhY3Rpb24sIGNvbmZpZ107XG4gICAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdzaW11bGF0ZVRyYW5zYWN0aW9uJywgYXJncyk7XG4gICAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBTaW11bGF0ZWRUcmFuc2FjdGlvblJlc3BvbnNlU3RydWN0KTtcbiAgICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ZhaWxlZCB0byBzaW11bGF0ZSB0cmFuc2FjdGlvbjogJyArIHJlcy5lcnJvci5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXMucmVzdWx0O1xuICAgIH1cbiAgICBsZXQgdHJhbnNhY3Rpb247XG4gICAgaWYgKHRyYW5zYWN0aW9uT3JNZXNzYWdlIGluc3RhbmNlb2YgVHJhbnNhY3Rpb24pIHtcbiAgICAgIGxldCBvcmlnaW5hbFR4ID0gdHJhbnNhY3Rpb25Pck1lc3NhZ2U7XG4gICAgICB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgICAgdHJhbnNhY3Rpb24uZmVlUGF5ZXIgPSBvcmlnaW5hbFR4LmZlZVBheWVyO1xuICAgICAgdHJhbnNhY3Rpb24uaW5zdHJ1Y3Rpb25zID0gdHJhbnNhY3Rpb25Pck1lc3NhZ2UuaW5zdHJ1Y3Rpb25zO1xuICAgICAgdHJhbnNhY3Rpb24ubm9uY2VJbmZvID0gb3JpZ2luYWxUeC5ub25jZUluZm87XG4gICAgICB0cmFuc2FjdGlvbi5zaWduYXR1cmVzID0gb3JpZ2luYWxUeC5zaWduYXR1cmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmFuc2FjdGlvbiA9IFRyYW5zYWN0aW9uLnBvcHVsYXRlKHRyYW5zYWN0aW9uT3JNZXNzYWdlKTtcbiAgICAgIC8vIEhBQ0s6IHRoaXMgZnVuY3Rpb24gcmVsaWVzIG9uIG11dGF0aW5nIHRoZSBwb3B1bGF0ZWQgdHJhbnNhY3Rpb25cbiAgICAgIHRyYW5zYWN0aW9uLl9tZXNzYWdlID0gdHJhbnNhY3Rpb24uX2pzb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChjb25maWdPclNpZ25lcnMgIT09IHVuZGVmaW5lZCAmJiAhQXJyYXkuaXNBcnJheShjb25maWdPclNpZ25lcnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnRzJyk7XG4gICAgfVxuICAgIGNvbnN0IHNpZ25lcnMgPSBjb25maWdPclNpZ25lcnM7XG4gICAgaWYgKHRyYW5zYWN0aW9uLm5vbmNlSW5mbyAmJiBzaWduZXJzKSB7XG4gICAgICB0cmFuc2FjdGlvbi5zaWduKC4uLnNpZ25lcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZGlzYWJsZUNhY2hlID0gdGhpcy5fZGlzYWJsZUJsb2NraGFzaENhY2hpbmc7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IGxhdGVzdEJsb2NraGFzaCA9IGF3YWl0IHRoaXMuX2Jsb2NraGFzaFdpdGhFeHBpcnlCbG9ja0hlaWdodChkaXNhYmxlQ2FjaGUpO1xuICAgICAgICB0cmFuc2FjdGlvbi5sYXN0VmFsaWRCbG9ja0hlaWdodCA9IGxhdGVzdEJsb2NraGFzaC5sYXN0VmFsaWRCbG9ja0hlaWdodDtcbiAgICAgICAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gbGF0ZXN0QmxvY2toYXNoLmJsb2NraGFzaDtcbiAgICAgICAgaWYgKCFzaWduZXJzKSBicmVhaztcbiAgICAgICAgdHJhbnNhY3Rpb24uc2lnbiguLi5zaWduZXJzKTtcbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5zaWduYXR1cmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyFzaWduYXR1cmUnKTsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRyYW5zYWN0aW9uLnNpZ25hdHVyZS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIGlmICghdGhpcy5fYmxvY2toYXNoSW5mby5zaW11bGF0ZWRTaWduYXR1cmVzLmluY2x1ZGVzKHNpZ25hdHVyZSkgJiYgIXRoaXMuX2Jsb2NraGFzaEluZm8udHJhbnNhY3Rpb25TaWduYXR1cmVzLmluY2x1ZGVzKHNpZ25hdHVyZSkpIHtcbiAgICAgICAgICAvLyBUaGUgc2lnbmF0dXJlIG9mIHRoaXMgdHJhbnNhY3Rpb24gaGFzIG5vdCBiZWVuIHNlZW4gYmVmb3JlIHdpdGggdGhlXG4gICAgICAgICAgLy8gY3VycmVudCByZWNlbnRCbG9ja2hhc2gsIGFsbCBkb25lLiBMZXQncyBicmVha1xuICAgICAgICAgIHRoaXMuX2Jsb2NraGFzaEluZm8uc2ltdWxhdGVkU2lnbmF0dXJlcy5wdXNoKHNpZ25hdHVyZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVGhpcyB0cmFuc2FjdGlvbiB3b3VsZCBiZSB0cmVhdGVkIGFzIGR1cGxpY2F0ZSAoaXRzIGRlcml2ZWQgc2lnbmF0dXJlXG4gICAgICAgICAgLy8gbWF0Y2hlZCB0byBvbmUgb2YgYWxyZWFkeSByZWNvcmRlZCBzaWduYXR1cmVzKS5cbiAgICAgICAgICAvLyBTbywgd2UgbXVzdCBmZXRjaCBhIG5ldyBibG9ja2hhc2ggZm9yIGEgZGlmZmVyZW50IHNpZ25hdHVyZSBieSBkaXNhYmxpbmdcbiAgICAgICAgICAvLyBvdXIgY2FjaGUgbm90IHRvIHdhaXQgZm9yIHRoZSBjYWNoZSBleHBpcmF0aW9uIChCTE9DS0hBU0hfQ0FDSEVfVElNRU9VVF9NUykuXG4gICAgICAgICAgZGlzYWJsZUNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlID0gdHJhbnNhY3Rpb24uX2NvbXBpbGUoKTtcbiAgICBjb25zdCBzaWduRGF0YSA9IG1lc3NhZ2Uuc2VyaWFsaXplKCk7XG4gICAgY29uc3Qgd2lyZVRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24uX3NlcmlhbGl6ZShzaWduRGF0YSk7XG4gICAgY29uc3QgZW5jb2RlZFRyYW5zYWN0aW9uID0gd2lyZVRyYW5zYWN0aW9uLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBlbmNvZGluZzogJ2Jhc2U2NCcsXG4gICAgICBjb21taXRtZW50OiB0aGlzLmNvbW1pdG1lbnRcbiAgICB9O1xuICAgIGlmIChpbmNsdWRlQWNjb3VudHMpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IChBcnJheS5pc0FycmF5KGluY2x1ZGVBY2NvdW50cykgPyBpbmNsdWRlQWNjb3VudHMgOiBtZXNzYWdlLm5vblByb2dyYW1JZHMoKSkubWFwKGtleSA9PiBrZXkudG9CYXNlNTgoKSk7XG4gICAgICBjb25maWdbJ2FjY291bnRzJ10gPSB7XG4gICAgICAgIGVuY29kaW5nOiAnYmFzZTY0JyxcbiAgICAgICAgYWRkcmVzc2VzXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoc2lnbmVycykge1xuICAgICAgY29uZmlnLnNpZ1ZlcmlmeSA9IHRydWU7XG4gICAgfVxuICAgIGlmIChjb25maWdPclNpZ25lcnMgJiYgdHlwZW9mIGNvbmZpZ09yU2lnbmVycyA9PT0gJ29iamVjdCcgJiYgJ2lubmVySW5zdHJ1Y3Rpb25zJyBpbiBjb25maWdPclNpZ25lcnMpIHtcbiAgICAgIGNvbmZpZy5pbm5lckluc3RydWN0aW9ucyA9IGNvbmZpZ09yU2lnbmVycy5pbm5lckluc3RydWN0aW9ucztcbiAgICB9XG4gICAgY29uc3QgYXJncyA9IFtlbmNvZGVkVHJhbnNhY3Rpb24sIGNvbmZpZ107XG4gICAgY29uc3QgdW5zYWZlUmVzID0gYXdhaXQgdGhpcy5fcnBjUmVxdWVzdCgnc2ltdWxhdGVUcmFuc2FjdGlvbicsIGFyZ3MpO1xuICAgIGNvbnN0IHJlcyA9IGNyZWF0ZSh1bnNhZmVSZXMsIFNpbXVsYXRlZFRyYW5zYWN0aW9uUmVzcG9uc2VTdHJ1Y3QpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgbGV0IGxvZ3M7XG4gICAgICBpZiAoJ2RhdGEnIGluIHJlcy5lcnJvcikge1xuICAgICAgICBsb2dzID0gcmVzLmVycm9yLmRhdGEubG9ncztcbiAgICAgICAgaWYgKGxvZ3MgJiYgQXJyYXkuaXNBcnJheShsb2dzKSkge1xuICAgICAgICAgIGNvbnN0IHRyYWNlSW5kZW50ID0gJ1xcbiAgICAnO1xuICAgICAgICAgIGNvbnN0IGxvZ1RyYWNlID0gdHJhY2VJbmRlbnQgKyBsb2dzLmpvaW4odHJhY2VJbmRlbnQpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzLmVycm9yLm1lc3NhZ2UsIGxvZ1RyYWNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IFNlbmRUcmFuc2FjdGlvbkVycm9yKHtcbiAgICAgICAgYWN0aW9uOiAnc2ltdWxhdGUnLFxuICAgICAgICBzaWduYXR1cmU6ICcnLFxuICAgICAgICB0cmFuc2FjdGlvbk1lc3NhZ2U6IHJlcy5lcnJvci5tZXNzYWdlLFxuICAgICAgICBsb2dzOiBsb2dzXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5yZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogU2lnbiBhbmQgc2VuZCBhIHRyYW5zYWN0aW9uXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIEluc3RlYWQsIGNhbGwge0BsaW5rIHNlbmRUcmFuc2FjdGlvbn0gd2l0aCBhIHtAbGlua1xuICAgKiBWZXJzaW9uZWRUcmFuc2FjdGlvbn1cbiAgICovXG5cbiAgLyoqXG4gICAqIFNlbmQgYSBzaWduZWQgdHJhbnNhY3Rpb25cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWNsYXNzLW1lbWJlcnNcblxuICAvKipcbiAgICogU2lnbiBhbmQgc2VuZCBhIHRyYW5zYWN0aW9uXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1jbGFzcy1tZW1iZXJzXG4gIGFzeW5jIHNlbmRUcmFuc2FjdGlvbih0cmFuc2FjdGlvbiwgc2lnbmVyc09yT3B0aW9ucywgb3B0aW9ucykge1xuICAgIGlmICgndmVyc2lvbicgaW4gdHJhbnNhY3Rpb24pIHtcbiAgICAgIGlmIChzaWduZXJzT3JPcHRpb25zICYmIEFycmF5LmlzQXJyYXkoc2lnbmVyc09yT3B0aW9ucykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cycpO1xuICAgICAgfVxuICAgICAgY29uc3Qgd2lyZVRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kUmF3VHJhbnNhY3Rpb24od2lyZVRyYW5zYWN0aW9uLCBzaWduZXJzT3JPcHRpb25zKTtcbiAgICB9XG4gICAgaWYgKHNpZ25lcnNPck9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCAhQXJyYXkuaXNBcnJheShzaWduZXJzT3JPcHRpb25zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50cycpO1xuICAgIH1cbiAgICBjb25zdCBzaWduZXJzID0gc2lnbmVyc09yT3B0aW9ucztcbiAgICBpZiAodHJhbnNhY3Rpb24ubm9uY2VJbmZvKSB7XG4gICAgICB0cmFuc2FjdGlvbi5zaWduKC4uLnNpZ25lcnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgZGlzYWJsZUNhY2hlID0gdGhpcy5fZGlzYWJsZUJsb2NraGFzaENhY2hpbmc7XG4gICAgICBmb3IgKDs7KSB7XG4gICAgICAgIGNvbnN0IGxhdGVzdEJsb2NraGFzaCA9IGF3YWl0IHRoaXMuX2Jsb2NraGFzaFdpdGhFeHBpcnlCbG9ja0hlaWdodChkaXNhYmxlQ2FjaGUpO1xuICAgICAgICB0cmFuc2FjdGlvbi5sYXN0VmFsaWRCbG9ja0hlaWdodCA9IGxhdGVzdEJsb2NraGFzaC5sYXN0VmFsaWRCbG9ja0hlaWdodDtcbiAgICAgICAgdHJhbnNhY3Rpb24ucmVjZW50QmxvY2toYXNoID0gbGF0ZXN0QmxvY2toYXNoLmJsb2NraGFzaDtcbiAgICAgICAgdHJhbnNhY3Rpb24uc2lnbiguLi5zaWduZXJzKTtcbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5zaWduYXR1cmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyFzaWduYXR1cmUnKTsgLy8gc2hvdWxkIG5ldmVyIGhhcHBlblxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNpZ25hdHVyZSA9IHRyYW5zYWN0aW9uLnNpZ25hdHVyZS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAgIGlmICghdGhpcy5fYmxvY2toYXNoSW5mby50cmFuc2FjdGlvblNpZ25hdHVyZXMuaW5jbHVkZXMoc2lnbmF0dXJlKSkge1xuICAgICAgICAgIC8vIFRoZSBzaWduYXR1cmUgb2YgdGhpcyB0cmFuc2FjdGlvbiBoYXMgbm90IGJlZW4gc2VlbiBiZWZvcmUgd2l0aCB0aGVcbiAgICAgICAgICAvLyBjdXJyZW50IHJlY2VudEJsb2NraGFzaCwgYWxsIGRvbmUuIExldCdzIGJyZWFrXG4gICAgICAgICAgdGhpcy5fYmxvY2toYXNoSW5mby50cmFuc2FjdGlvblNpZ25hdHVyZXMucHVzaChzaWduYXR1cmUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFRoaXMgdHJhbnNhY3Rpb24gd291bGQgYmUgdHJlYXRlZCBhcyBkdXBsaWNhdGUgKGl0cyBkZXJpdmVkIHNpZ25hdHVyZVxuICAgICAgICAgIC8vIG1hdGNoZWQgdG8gb25lIG9mIGFscmVhZHkgcmVjb3JkZWQgc2lnbmF0dXJlcykuXG4gICAgICAgICAgLy8gU28sIHdlIG11c3QgZmV0Y2ggYSBuZXcgYmxvY2toYXNoIGZvciBhIGRpZmZlcmVudCBzaWduYXR1cmUgYnkgZGlzYWJsaW5nXG4gICAgICAgICAgLy8gb3VyIGNhY2hlIG5vdCB0byB3YWl0IGZvciB0aGUgY2FjaGUgZXhwaXJhdGlvbiAoQkxPQ0tIQVNIX0NBQ0hFX1RJTUVPVVRfTVMpLlxuICAgICAgICAgIGRpc2FibGVDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgd2lyZVRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24uc2VyaWFsaXplKCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2VuZFJhd1RyYW5zYWN0aW9uKHdpcmVUcmFuc2FjdGlvbiwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIHRyYW5zYWN0aW9uIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBzaWduZWQgYW5kIHNlcmlhbGl6ZWQgaW50byB0aGVcbiAgICogd2lyZSBmb3JtYXRcbiAgICovXG4gIGFzeW5jIHNlbmRSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbiwgb3B0aW9ucykge1xuICAgIGNvbnN0IGVuY29kZWRUcmFuc2FjdGlvbiA9IHRvQnVmZmVyKHJhd1RyYW5zYWN0aW9uKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zZW5kRW5jb2RlZFRyYW5zYWN0aW9uKGVuY29kZWRUcmFuc2FjdGlvbiwgb3B0aW9ucyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgdHJhbnNhY3Rpb24gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHNpZ25lZCwgc2VyaWFsaXplZCBpbnRvIHRoZVxuICAgKiB3aXJlIGZvcm1hdCwgYW5kIGVuY29kZWQgYXMgYSBiYXNlNjQgc3RyaW5nXG4gICAqL1xuICBhc3luYyBzZW5kRW5jb2RlZFRyYW5zYWN0aW9uKGVuY29kZWRUcmFuc2FjdGlvbiwgb3B0aW9ucykge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGVuY29kaW5nOiAnYmFzZTY0J1xuICAgIH07XG4gICAgY29uc3Qgc2tpcFByZWZsaWdodCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5za2lwUHJlZmxpZ2h0O1xuICAgIGNvbnN0IHByZWZsaWdodENvbW1pdG1lbnQgPSBza2lwUHJlZmxpZ2h0ID09PSB0cnVlID8gJ3Byb2Nlc3NlZCcgLy8gRklYTUUgUmVtb3ZlIHdoZW4gaHR0cHM6Ly9naXRodWIuY29tL2FuemEteHl6L2FnYXZlL3B1bGwvNDgzIGlzIGRlcGxveWVkLlxuICAgIDogb3B0aW9ucyAmJiBvcHRpb25zLnByZWZsaWdodENvbW1pdG1lbnQgfHwgdGhpcy5jb21taXRtZW50O1xuICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMubWF4UmV0cmllcyAhPSBudWxsKSB7XG4gICAgICBjb25maWcubWF4UmV0cmllcyA9IG9wdGlvbnMubWF4UmV0cmllcztcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5taW5Db250ZXh0U2xvdCAhPSBudWxsKSB7XG4gICAgICBjb25maWcubWluQ29udGV4dFNsb3QgPSBvcHRpb25zLm1pbkNvbnRleHRTbG90O1xuICAgIH1cbiAgICBpZiAoc2tpcFByZWZsaWdodCkge1xuICAgICAgY29uZmlnLnNraXBQcmVmbGlnaHQgPSBza2lwUHJlZmxpZ2h0O1xuICAgIH1cbiAgICBpZiAocHJlZmxpZ2h0Q29tbWl0bWVudCkge1xuICAgICAgY29uZmlnLnByZWZsaWdodENvbW1pdG1lbnQgPSBwcmVmbGlnaHRDb21taXRtZW50O1xuICAgIH1cbiAgICBjb25zdCBhcmdzID0gW2VuY29kZWRUcmFuc2FjdGlvbiwgY29uZmlnXTtcbiAgICBjb25zdCB1bnNhZmVSZXMgPSBhd2FpdCB0aGlzLl9ycGNSZXF1ZXN0KCdzZW5kVHJhbnNhY3Rpb24nLCBhcmdzKTtcbiAgICBjb25zdCByZXMgPSBjcmVhdGUodW5zYWZlUmVzLCBTZW5kVHJhbnNhY3Rpb25ScGNSZXN1bHQpO1xuICAgIGlmICgnZXJyb3InIGluIHJlcykge1xuICAgICAgbGV0IGxvZ3MgPSB1bmRlZmluZWQ7XG4gICAgICBpZiAoJ2RhdGEnIGluIHJlcy5lcnJvcikge1xuICAgICAgICBsb2dzID0gcmVzLmVycm9yLmRhdGEubG9ncztcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBTZW5kVHJhbnNhY3Rpb25FcnJvcih7XG4gICAgICAgIGFjdGlvbjogc2tpcFByZWZsaWdodCA/ICdzZW5kJyA6ICdzaW11bGF0ZScsXG4gICAgICAgIHNpZ25hdHVyZTogJycsXG4gICAgICAgIHRyYW5zYWN0aW9uTWVzc2FnZTogcmVzLmVycm9yLm1lc3NhZ2UsXG4gICAgICAgIGxvZ3M6IGxvZ3NcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLnJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF93c09uT3BlbigpIHtcbiAgICB0aGlzLl9ycGNXZWJTb2NrZXRDb25uZWN0ZWQgPSB0cnVlO1xuICAgIHRoaXMuX3JwY1dlYlNvY2tldEhlYXJ0YmVhdCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgIC8vIFBpbmcgc2VydmVyIGV2ZXJ5IDVzIHRvIHByZXZlbnQgaWRsZSB0aW1lb3V0c1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLl9ycGNXZWJTb2NrZXQubm90aWZ5KCdwaW5nJyk7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH0pKCk7XG4gICAgfSwgNTAwMCk7XG4gICAgdGhpcy5fdXBkYXRlU3Vic2NyaXB0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3dzT25FcnJvcihlcnIpIHtcbiAgICB0aGlzLl9ycGNXZWJTb2NrZXRDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICBjb25zb2xlLmVycm9yKCd3cyBlcnJvcjonLCBlcnIubWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfd3NPbkNsb3NlKGNvZGUpIHtcbiAgICB0aGlzLl9ycGNXZWJTb2NrZXRDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9ycGNXZWJTb2NrZXRHZW5lcmF0aW9uID0gKHRoaXMuX3JwY1dlYlNvY2tldEdlbmVyYXRpb24gKyAxKSAlIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIGlmICh0aGlzLl9ycGNXZWJTb2NrZXRJZGxlVGltZW91dCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3JwY1dlYlNvY2tldElkbGVUaW1lb3V0KTtcbiAgICAgIHRoaXMuX3JwY1dlYlNvY2tldElkbGVUaW1lb3V0ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX3JwY1dlYlNvY2tldEhlYXJ0YmVhdCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9ycGNXZWJTb2NrZXRIZWFydGJlYXQpO1xuICAgICAgdGhpcy5fcnBjV2ViU29ja2V0SGVhcnRiZWF0ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGNvZGUgPT09IDEwMDApIHtcbiAgICAgIC8vIGV4cGxpY2l0IGNsb3NlLCBjaGVjayBpZiBhbnkgc3Vic2NyaXB0aW9ucyBoYXZlIGJlZW4gbWFkZSBzaW5jZSBjbG9zZVxuICAgICAgdGhpcy5fdXBkYXRlU3Vic2NyaXB0aW9ucygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGltcGxpY2l0IGNsb3NlLCBwcmVwYXJlIHN1YnNjcmlwdGlvbnMgZm9yIGF1dG8tcmVjb25uZWN0XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uQ2FsbGJhY2tzQnlTZXJ2ZXJTdWJzY3JpcHRpb25JZCA9IHt9O1xuICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuX3N1YnNjcmlwdGlvbnNCeUhhc2gpLmZvckVhY2goKFtoYXNoLCBzdWJzY3JpcHRpb25dKSA9PiB7XG4gICAgICB0aGlzLl9zZXRTdWJzY3JpcHRpb24oaGFzaCwge1xuICAgICAgICAuLi5zdWJzY3JpcHRpb24sXG4gICAgICAgIHN0YXRlOiAncGVuZGluZydcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3NldFN1YnNjcmlwdGlvbihoYXNoLCBuZXh0U3Vic2NyaXB0aW9uKSB7XG4gICAgY29uc3QgcHJldlN0YXRlID0gdGhpcy5fc3Vic2NyaXB0aW9uc0J5SGFzaFtoYXNoXT8uc3RhdGU7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uc0J5SGFzaFtoYXNoXSA9IG5leHRTdWJzY3JpcHRpb247XG4gICAgaWYgKHByZXZTdGF0ZSAhPT0gbmV4dFN1YnNjcmlwdGlvbi5zdGF0ZSkge1xuICAgICAgY29uc3Qgc3RhdGVDaGFuZ2VDYWxsYmFja3MgPSB0aGlzLl9zdWJzY3JpcHRpb25TdGF0ZUNoYW5nZUNhbGxiYWNrc0J5SGFzaFtoYXNoXTtcbiAgICAgIGlmIChzdGF0ZUNoYW5nZUNhbGxiYWNrcykge1xuICAgICAgICBzdGF0ZUNoYW5nZUNhbGxiYWNrcy5mb3JFYWNoKGNiID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY2IobmV4dFN1YnNjcmlwdGlvbi5zdGF0ZSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgICAgICAgICB9IGNhdGNoIHt9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9vblN1YnNjcmlwdGlvblN0YXRlQ2hhbmdlKGNsaWVudFN1YnNjcmlwdGlvbklkLCBjYWxsYmFjaykge1xuICAgIGNvbnN0IGhhc2ggPSB0aGlzLl9zdWJzY3JpcHRpb25IYXNoQnlDbGllbnRTdWJzY3JpcHRpb25JZFtjbGllbnRTdWJzY3JpcHRpb25JZF07XG4gICAgaWYgKGhhc2ggPT0gbnVsbCkge1xuICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZUNoYW5nZUNhbGxiYWNrcyA9IHRoaXMuX3N1YnNjcmlwdGlvblN0YXRlQ2hhbmdlQ2FsbGJhY2tzQnlIYXNoW2hhc2hdIHx8PSBuZXcgU2V0KCk7XG4gICAgc3RhdGVDaGFuZ2VDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgc3RhdGVDaGFuZ2VDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTtcbiAgICAgIGlmIChzdGF0ZUNoYW5nZUNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpcHRpb25TdGF0ZUNoYW5nZUNhbGxiYWNrc0J5SGFzaFtoYXNoXTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgX3VwZGF0ZVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3N1YnNjcmlwdGlvbnNCeUhhc2gpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaWYgKHRoaXMuX3JwY1dlYlNvY2tldENvbm5lY3RlZCkge1xuICAgICAgICB0aGlzLl9ycGNXZWJTb2NrZXRDb25uZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fcnBjV2ViU29ja2V0SWRsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9ycGNXZWJTb2NrZXRJZGxlVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3JwY1dlYlNvY2tldC5jbG9zZSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gc3dhbGxvdyBlcnJvciBpZiBzb2NrZXQgaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuXG4gICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yIHdoZW4gY2xvc2luZyBzb2NrZXQgY29ubmVjdGlvbjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9ycGNXZWJTb2NrZXRJZGxlVGltZW91dCAhPT0gbnVsbCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3JwY1dlYlNvY2tldElkbGVUaW1lb3V0KTtcbiAgICAgIHRoaXMuX3JwY1dlYlNvY2tldElkbGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIHRoaXMuX3JwY1dlYlNvY2tldENvbm5lY3RlZCA9IHRydWU7XG4gICAgfVxuICAgIGlmICghdGhpcy5fcnBjV2ViU29ja2V0Q29ubmVjdGVkKSB7XG4gICAgICB0aGlzLl9ycGNXZWJTb2NrZXQuY29ubmVjdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhY3RpdmVXZWJTb2NrZXRHZW5lcmF0aW9uID0gdGhpcy5fcnBjV2ViU29ja2V0R2VuZXJhdGlvbjtcbiAgICBjb25zdCBpc0N1cnJlbnRDb25uZWN0aW9uU3RpbGxBY3RpdmUgPSAoKSA9PiB7XG4gICAgICByZXR1cm4gYWN0aXZlV2ViU29ja2V0R2VuZXJhdGlvbiA9PT0gdGhpcy5fcnBjV2ViU29ja2V0R2VuZXJhdGlvbjtcbiAgICB9O1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIC8vIERvbid0IGJlIHRlbXB0ZWQgdG8gY2hhbmdlIHRoaXMgdG8gYE9iamVjdC5lbnRyaWVzYC4gV2UgY2FsbFxuICAgIC8vIGBfdXBkYXRlU3Vic2NyaXB0aW9uc2AgcmVjdXJzaXZlbHkgd2hlbiBwcm9jZXNzaW5nIHRoZSBzdGF0ZSxcbiAgICAvLyBzbyBpdCdzIGltcG9ydGFudCB0aGF0IHdlIGxvb2sgdXAgdGhlICpjdXJyZW50KiB2ZXJzaW9uIG9mXG4gICAgLy8gZWFjaCBzdWJzY3JpcHRpb24sIGV2ZXJ5IHRpbWUgd2UgcHJvY2VzcyBhIGhhc2guXG4gICAgT2JqZWN0LmtleXModGhpcy5fc3Vic2NyaXB0aW9uc0J5SGFzaCkubWFwKGFzeW5jIGhhc2ggPT4ge1xuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3Vic2NyaXB0aW9uc0J5SGFzaFtoYXNoXTtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBUaGlzIGVudHJ5IGhhcyBzaW5jZSBiZWVuIGRlbGV0ZWQuIFNraXAuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoc3Vic2NyaXB0aW9uLnN0YXRlKSB7XG4gICAgICAgIGNhc2UgJ3BlbmRpbmcnOlxuICAgICAgICBjYXNlICd1bnN1YnNjcmliZWQnOlxuICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24uY2FsbGJhY2tzLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogWW91IGNhbiBlbmQgdXAgaGVyZSB3aGVuOlxuICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAqIC0gYSBzdWJzY3JpcHRpb24gaGFzIHJlY2VudGx5IHVuc3Vic2NyaWJlZFxuICAgICAgICAgICAgICogICB3aXRob3V0IGhhdmluZyBuZXcgY2FsbGJhY2tzIGFkZGVkIHRvIGl0XG4gICAgICAgICAgICAgKiAgIHdoaWxlIHRoZSB1bnN1YnNjcmliZSB3YXMgaW4gZmxpZ2h0LCBvclxuICAgICAgICAgICAgICogLSB3aGVuIGEgcGVuZGluZyBzdWJzY3JpcHRpb24gaGFzIGl0c1xuICAgICAgICAgICAgICogICBsaXN0ZW5lcnMgcmVtb3ZlZCBiZWZvcmUgYSByZXF1ZXN0IHdhc1xuICAgICAgICAgICAgICogICBzZW50IHRvIHRoZSBzZXJ2ZXIuXG4gICAgICAgICAgICAgKlxuICAgICAgICAgICAgICogQmVpbmcgdGhhdCBub2JvZHkgaXMgaW50ZXJlc3RlZCBpbiB0aGlzXG4gICAgICAgICAgICAgKiBzdWJzY3JpcHRpb24gYW55IGxvbmdlciwgZGVsZXRlIGl0LlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fc3Vic2NyaXB0aW9uc0J5SGFzaFtoYXNoXTtcbiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24uc3RhdGUgPT09ICd1bnN1YnNjcmliZWQnKSB7XG4gICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpcHRpb25DYWxsYmFja3NCeVNlcnZlclN1YnNjcmlwdGlvbklkW3N1YnNjcmlwdGlvbi5zZXJ2ZXJTdWJzY3JpcHRpb25JZF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl91cGRhdGVTdWJzY3JpcHRpb25zKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICAgIG1ldGhvZFxuICAgICAgICAgICAgfSA9IHN1YnNjcmlwdGlvbjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHRoaXMuX3NldFN1YnNjcmlwdGlvbihoYXNoLCB7XG4gICAgICAgICAgICAgICAgLi4uc3Vic2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIHN0YXRlOiAnc3Vic2NyaWJpbmcnXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBjb25zdCBzZXJ2ZXJTdWJzY3JpcHRpb25JZCA9IGF3YWl0IHRoaXMuX3JwY1dlYlNvY2tldC5jYWxsKG1ldGhvZCwgYXJncyk7XG4gICAgICAgICAgICAgIHRoaXMuX3NldFN1YnNjcmlwdGlvbihoYXNoLCB7XG4gICAgICAgICAgICAgICAgLi4uc3Vic2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIHNlcnZlclN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgICAgIHN0YXRlOiAnc3Vic2NyaWJlZCdcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbkNhbGxiYWNrc0J5U2VydmVyU3Vic2NyaXB0aW9uSWRbc2VydmVyU3Vic2NyaXB0aW9uSWRdID0gc3Vic2NyaXB0aW9uLmNhbGxiYWNrcztcbiAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fdXBkYXRlU3Vic2NyaXB0aW9ucygpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZWNlaXZlZCAke2UgaW5zdGFuY2VvZiBFcnJvciA/ICcnIDogJ0pTT04tUlBDICd9ZXJyb3IgY2FsbGluZyBcXGAke21ldGhvZH1cXGBgLCB7XG4gICAgICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgICAgICBlcnJvcjogZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnRDb25uZWN0aW9uU3RpbGxBY3RpdmUoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUT0RPOiBNYXliZSBhZGQgYW4gJ2Vycm9yZWQnIHN0YXRlIG9yIGEgcmV0cnkgbGltaXQ/XG4gICAgICAgICAgICAgIHRoaXMuX3NldFN1YnNjcmlwdGlvbihoYXNoLCB7XG4gICAgICAgICAgICAgICAgLi4uc3Vic2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIHN0YXRlOiAncGVuZGluZydcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3VwZGF0ZVN1YnNjcmlwdGlvbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzdWJzY3JpYmVkJzpcbiAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uLmNhbGxiYWNrcy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAvLyBCeSB0aGUgdGltZSB3ZSBzdWNjZXNzZnVsbHkgc2V0IHVwIGEgc3Vic2NyaXB0aW9uXG4gICAgICAgICAgICAvLyB3aXRoIHRoZSBzZXJ2ZXIsIHRoZSBjbGllbnQgc3RvcHBlZCBjYXJpbmcgYWJvdXQgaXQuXG4gICAgICAgICAgICAvLyBUZWFyIGl0IGRvd24gbm93LlxuICAgICAgICAgICAgYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICAgIHNlcnZlclN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgICAgIHVuc3Vic2NyaWJlTWV0aG9kXG4gICAgICAgICAgICAgIH0gPSBzdWJzY3JpcHRpb247XG4gICAgICAgICAgICAgIGlmICh0aGlzLl9zdWJzY3JpcHRpb25zQXV0b0Rpc3Bvc2VkQnlScGMuaGFzKHNlcnZlclN1YnNjcmlwdGlvbklkKSkge1xuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIFNwZWNpYWwgY2FzZS5cbiAgICAgICAgICAgICAgICAgKiBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBzdWJzY3JpcHRpb24gdGhhdCBoYXMgYmVlbiBhdXRvLVxuICAgICAgICAgICAgICAgICAqIGRpc3Bvc2VkIGJ5IHRoZSBSUEMsIHRoZW4gd2UgY2FuIHNraXAgdGhlIFJQQyBjYWxsIHRvXG4gICAgICAgICAgICAgICAgICogdGVhciBkb3duIHRoZSBzdWJzY3JpcHRpb24gaGVyZS5cbiAgICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgICAqIE5PVEU6IFRoZXJlIGlzIGEgcHJvcG9zYWwgdG8gZWxpbWluYXRlIHRoaXMgc3BlY2lhbCBjYXNlLCBoZXJlOlxuICAgICAgICAgICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zb2xhbmEtbGFicy9zb2xhbmEvaXNzdWVzLzE4ODkyXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uc0F1dG9EaXNwb3NlZEJ5UnBjLmRlbGV0ZShzZXJ2ZXJTdWJzY3JpcHRpb25JZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2V0U3Vic2NyaXB0aW9uKGhhc2gsIHtcbiAgICAgICAgICAgICAgICAgIC4uLnN1YnNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgIHN0YXRlOiAndW5zdWJzY3JpYmluZydcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZXRTdWJzY3JpcHRpb24oaGFzaCwge1xuICAgICAgICAgICAgICAgICAgLi4uc3Vic2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgc3RhdGU6ICd1bnN1YnNjcmliaW5nJ1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ycGNXZWJTb2NrZXQuY2FsbCh1bnN1YnNjcmliZU1ldGhvZCwgW3NlcnZlclN1YnNjcmlwdGlvbklkXSk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGAke3Vuc3Vic2NyaWJlTWV0aG9kfSBlcnJvcjpgLCBlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnRDb25uZWN0aW9uU3RpbGxBY3RpdmUoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBUT0RPOiBNYXliZSBhZGQgYW4gJ2Vycm9yZWQnIHN0YXRlIG9yIGEgcmV0cnkgbGltaXQ/XG4gICAgICAgICAgICAgICAgICB0aGlzLl9zZXRTdWJzY3JpcHRpb24oaGFzaCwge1xuICAgICAgICAgICAgICAgICAgICAuLi5zdWJzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIHN0YXRlOiAnc3Vic2NyaWJlZCdcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fdXBkYXRlU3Vic2NyaXB0aW9ucygpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLl9zZXRTdWJzY3JpcHRpb24oaGFzaCwge1xuICAgICAgICAgICAgICAgIC4uLnN1YnNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICBzdGF0ZTogJ3Vuc3Vic2NyaWJlZCdcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3VwZGF0ZVN1YnNjcmlwdGlvbnMoKTtcbiAgICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9oYW5kbGVTZXJ2ZXJOb3RpZmljYXRpb24oc2VydmVyU3Vic2NyaXB0aW9uSWQsIGNhbGxiYWNrQXJncykge1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHRoaXMuX3N1YnNjcmlwdGlvbkNhbGxiYWNrc0J5U2VydmVyU3Vic2NyaXB0aW9uSWRbc2VydmVyU3Vic2NyaXB0aW9uSWRdO1xuICAgIGlmIChjYWxsYmFja3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjYWxsYmFja3MuZm9yRWFjaChjYiA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjYihcbiAgICAgICAgLy8gSSBmYWlsZWQgdG8gZmluZCBhIHdheSB0byBjb252aW5jZSBUeXBlU2NyaXB0IHRoYXQgYGNiYCBpcyBvZiB0eXBlXG4gICAgICAgIC8vIGBUQ2FsbGJhY2tgIHdoaWNoIGlzIGNlcnRhaW5seSBjb21wYXRpYmxlIHdpdGggYFBhcmFtZXRlcnM8VENhbGxiYWNrPmAuXG4gICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzQ3NjE1XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLi4uY2FsbGJhY2tBcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF93c09uQWNjb3VudE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pIHtcbiAgICBjb25zdCB7XG4gICAgICByZXN1bHQsXG4gICAgICBzdWJzY3JpcHRpb25cbiAgICB9ID0gY3JlYXRlKG5vdGlmaWNhdGlvbiwgQWNjb3VudE5vdGlmaWNhdGlvblJlc3VsdCk7XG4gICAgdGhpcy5faGFuZGxlU2VydmVyTm90aWZpY2F0aW9uKHN1YnNjcmlwdGlvbiwgW3Jlc3VsdC52YWx1ZSwgcmVzdWx0LmNvbnRleHRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9tYWtlU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbkNvbmZpZyxcbiAgLyoqXG4gICAqIFdoZW4gcHJlcGFyaW5nIGBhcmdzYCBmb3IgYSBjYWxsIHRvIGBfbWFrZVN1YnNjcmlwdGlvbmAsIGJlIHN1cmVcbiAgICogdG8gY2FyZWZ1bGx5IGFwcGx5IGEgZGVmYXVsdCBgY29tbWl0bWVudGAgcHJvcGVydHksIGlmIG5lY2Vzc2FyeS5cbiAgICpcbiAgICogLSBJZiB0aGUgdXNlciBzdXBwbGllZCBhIGBjb21taXRtZW50YCB1c2UgdGhhdC5cbiAgICogLSBPdGhlcndpc2UsIGlmIHRoZSBgQ29ubmVjdGlvbjo6Y29tbWl0bWVudGAgaXMgc2V0LCB1c2UgdGhhdC5cbiAgICogLSBPdGhlcndpc2UsIHNldCBpdCB0byB0aGUgUlBDIHNlcnZlciBkZWZhdWx0OiBgZmluYWxpemVkYC5cbiAgICpcbiAgICogVGhpcyBpcyBleHRyZW1lbHkgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGF0IHRoZXNlIHR3byBmdW5kYW1lbnRhbGx5XG4gICAqIGlkZW50aWNhbCBzdWJzY3JpcHRpb25zIHByb2R1Y2UgdGhlIHNhbWUgaWRlbnRpZnlpbmcgaGFzaDpcbiAgICpcbiAgICogLSBBIHN1YnNjcmlwdGlvbiBtYWRlIHdpdGhvdXQgc3BlY2lmeWluZyBhIGNvbW1pdG1lbnQuXG4gICAqIC0gQSBzdWJzY3JpcHRpb24gbWFkZSB3aGVyZSB0aGUgY29tbWl0bWVudCBzcGVjaWZpZWQgaXMgdGhlIHNhbWVcbiAgICogICBhcyB0aGUgZGVmYXVsdCBhcHBsaWVkIHRvIHRoZSBzdWJzY3JpcHRpb24gYWJvdmUuXG4gICAqXG4gICAqIEV4YW1wbGU7IHRoZXNlIHR3byBzdWJzY3JpcHRpb25zIG11c3QgcHJvZHVjZSB0aGUgc2FtZSBoYXNoOlxuICAgKlxuICAgKiAtIEFuIGBhY2NvdW50U3Vic2NyaWJlYCBzdWJzY3JpcHRpb24gZm9yIGAnUFVCS0VZJ2BcbiAgICogLSBBbiBgYWNjb3VudFN1YnNjcmliZWAgc3Vic2NyaXB0aW9uIGZvciBgJ1BVQktFWSdgIHdpdGggY29tbWl0bWVudFxuICAgKiAgIGAnZmluYWxpemVkJ2AuXG4gICAqXG4gICAqIFNlZSB0aGUgJ21ha2luZyBhIHN1YnNjcmlwdGlvbiB3aXRoIGRlZmF1bHRlZCBwYXJhbXMgb21pdHRlZCcgdGVzdFxuICAgKiBpbiBgY29ubmVjdGlvbi1zdWJzY3JpcHRpb25zLnRzYCBmb3IgbW9yZS5cbiAgICovXG4gIGFyZ3MpIHtcbiAgICBjb25zdCBjbGllbnRTdWJzY3JpcHRpb25JZCA9IHRoaXMuX25leHRDbGllbnRTdWJzY3JpcHRpb25JZCsrO1xuICAgIGNvbnN0IGhhc2ggPSBmYXN0U3RhYmxlU3RyaW5naWZ5KFtzdWJzY3JpcHRpb25Db25maWcubWV0aG9kLCBhcmdzXSk7XG4gICAgY29uc3QgZXhpc3RpbmdTdWJzY3JpcHRpb24gPSB0aGlzLl9zdWJzY3JpcHRpb25zQnlIYXNoW2hhc2hdO1xuICAgIGlmIChleGlzdGluZ1N1YnNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25zQnlIYXNoW2hhc2hdID0ge1xuICAgICAgICAuLi5zdWJzY3JpcHRpb25Db25maWcsXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIGNhbGxiYWNrczogbmV3IFNldChbc3Vic2NyaXB0aW9uQ29uZmlnLmNhbGxiYWNrXSksXG4gICAgICAgIHN0YXRlOiAncGVuZGluZydcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGV4aXN0aW5nU3Vic2NyaXB0aW9uLmNhbGxiYWNrcy5hZGQoc3Vic2NyaXB0aW9uQ29uZmlnLmNhbGxiYWNrKTtcbiAgICB9XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uSGFzaEJ5Q2xpZW50U3Vic2NyaXB0aW9uSWRbY2xpZW50U3Vic2NyaXB0aW9uSWRdID0gaGFzaDtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25EaXNwb3NlRnVuY3Rpb25zQnlDbGllbnRTdWJzY3JpcHRpb25JZFtjbGllbnRTdWJzY3JpcHRpb25JZF0gPSBhc3luYyAoKSA9PiB7XG4gICAgICBkZWxldGUgdGhpcy5fc3Vic2NyaXB0aW9uRGlzcG9zZUZ1bmN0aW9uc0J5Q2xpZW50U3Vic2NyaXB0aW9uSWRbY2xpZW50U3Vic2NyaXB0aW9uSWRdO1xuICAgICAgZGVsZXRlIHRoaXMuX3N1YnNjcmlwdGlvbkhhc2hCeUNsaWVudFN1YnNjcmlwdGlvbklkW2NsaWVudFN1YnNjcmlwdGlvbklkXTtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuX3N1YnNjcmlwdGlvbnNCeUhhc2hbaGFzaF07XG4gICAgICBhc3NlcnQoc3Vic2NyaXB0aW9uICE9PSB1bmRlZmluZWQsIGBDb3VsZCBub3QgZmluZCBhIFxcYFN1YnNjcmlwdGlvblxcYCB3aGVuIHRlYXJpbmcgZG93biBjbGllbnQgc3Vic2NyaXB0aW9uICMke2NsaWVudFN1YnNjcmlwdGlvbklkfWApO1xuICAgICAgc3Vic2NyaXB0aW9uLmNhbGxiYWNrcy5kZWxldGUoc3Vic2NyaXB0aW9uQ29uZmlnLmNhbGxiYWNrKTtcbiAgICAgIGF3YWl0IHRoaXMuX3VwZGF0ZVN1YnNjcmlwdGlvbnMoKTtcbiAgICB9O1xuICAgIHRoaXMuX3VwZGF0ZVN1YnNjcmlwdGlvbnMoKTtcbiAgICByZXR1cm4gY2xpZW50U3Vic2NyaXB0aW9uSWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW5ldmVyIHRoZSBzcGVjaWZpZWQgYWNjb3VudCBjaGFuZ2VzXG4gICAqXG4gICAqIEBwYXJhbSBwdWJsaWNLZXkgUHVibGljIGtleSBvZiB0aGUgYWNjb3VudCB0byBtb25pdG9yXG4gICAqIEBwYXJhbSBjYWxsYmFjayBGdW5jdGlvbiB0byBpbnZva2Ugd2hlbmV2ZXIgdGhlIGFjY291bnQgaXMgY2hhbmdlZFxuICAgKiBAcGFyYW0gY29uZmlnXG4gICAqIEByZXR1cm4gc3Vic2NyaXB0aW9uIGlkXG4gICAqL1xuXG4gIC8qKiBAZGVwcmVjYXRlZCBJbnN0ZWFkLCBwYXNzIGluIGFuIHtAbGluayBBY2NvdW50U3Vic2NyaXB0aW9uQ29uZmlnfSAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZHVwZS1jbGFzcy1tZW1iZXJzXG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGUtY2xhc3MtbWVtYmVyc1xuICBvbkFjY291bnRDaGFuZ2UocHVibGljS2V5LCBjYWxsYmFjaywgY29tbWl0bWVudE9yQ29uZmlnKSB7XG4gICAgY29uc3Qge1xuICAgICAgY29tbWl0bWVudCxcbiAgICAgIGNvbmZpZ1xuICAgIH0gPSBleHRyYWN0Q29tbWl0bWVudEZyb21Db25maWcoY29tbWl0bWVudE9yQ29uZmlnKTtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5fYnVpbGRBcmdzKFtwdWJsaWNLZXkudG9CYXNlNTgoKV0sIGNvbW1pdG1lbnQgfHwgdGhpcy5fY29tbWl0bWVudCB8fCAnZmluYWxpemVkJyxcbiAgICAvLyBBcHBseSBjb25uZWN0aW9uL3NlcnZlciBkZWZhdWx0LlxuICAgICdiYXNlNjQnLCBjb25maWcpO1xuICAgIHJldHVybiB0aGlzLl9tYWtlU3Vic2NyaXB0aW9uKHtcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgbWV0aG9kOiAnYWNjb3VudFN1YnNjcmliZScsXG4gICAgICB1bnN1YnNjcmliZU1ldGhvZDogJ2FjY291bnRVbnN1YnNjcmliZSdcbiAgICB9LCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJlZ2lzdGVyIGFuIGFjY291bnQgbm90aWZpY2F0aW9uIGNhbGxiYWNrXG4gICAqXG4gICAqIEBwYXJhbSBjbGllbnRTdWJzY3JpcHRpb25JZCBjbGllbnQgc3Vic2NyaXB0aW9uIGlkIHRvIGRlcmVnaXN0ZXJcbiAgICovXG4gIGFzeW5jIHJlbW92ZUFjY291bnRDaGFuZ2VMaXN0ZW5lcihjbGllbnRTdWJzY3JpcHRpb25JZCkge1xuICAgIGF3YWl0IHRoaXMuX3Vuc3Vic2NyaWJlQ2xpZW50U3Vic2NyaXB0aW9uKGNsaWVudFN1YnNjcmlwdGlvbklkLCAnYWNjb3VudCBjaGFuZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF93c09uUHJvZ3JhbUFjY291bnROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVzdWx0LFxuICAgICAgc3Vic2NyaXB0aW9uXG4gICAgfSA9IGNyZWF0ZShub3RpZmljYXRpb24sIFByb2dyYW1BY2NvdW50Tm90aWZpY2F0aW9uUmVzdWx0KTtcbiAgICB0aGlzLl9oYW5kbGVTZXJ2ZXJOb3RpZmljYXRpb24oc3Vic2NyaXB0aW9uLCBbe1xuICAgICAgYWNjb3VudElkOiByZXN1bHQudmFsdWUucHVia2V5LFxuICAgICAgYWNjb3VudEluZm86IHJlc3VsdC52YWx1ZS5hY2NvdW50XG4gICAgfSwgcmVzdWx0LmNvbnRleHRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbmV2ZXIgYWNjb3VudHMgb3duZWQgYnkgdGhlXG4gICAqIHNwZWNpZmllZCBwcm9ncmFtIGNoYW5nZVxuICAgKlxuICAgKiBAcGFyYW0gcHJvZ3JhbUlkIFB1YmxpYyBrZXkgb2YgdGhlIHByb2dyYW0gdG8gbW9uaXRvclxuICAgKiBAcGFyYW0gY2FsbGJhY2sgRnVuY3Rpb24gdG8gaW52b2tlIHdoZW5ldmVyIHRoZSBhY2NvdW50IGlzIGNoYW5nZWRcbiAgICogQHBhcmFtIGNvbmZpZ1xuICAgKiBAcmV0dXJuIHN1YnNjcmlwdGlvbiBpZFxuICAgKi9cblxuICAvKiogQGRlcHJlY2F0ZWQgSW5zdGVhZCwgcGFzcyBpbiBhIHtAbGluayBQcm9ncmFtQWNjb3VudFN1YnNjcmlwdGlvbkNvbmZpZ30gKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWR1cGUtY2xhc3MtbWVtYmVyc1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWNsYXNzLW1lbWJlcnNcbiAgb25Qcm9ncmFtQWNjb3VudENoYW5nZShwcm9ncmFtSWQsIGNhbGxiYWNrLCBjb21taXRtZW50T3JDb25maWcsIG1heWJlRmlsdGVycykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICBjb25maWdcbiAgICB9ID0gZXh0cmFjdENvbW1pdG1lbnRGcm9tQ29uZmlnKGNvbW1pdG1lbnRPckNvbmZpZyk7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbcHJvZ3JhbUlkLnRvQmFzZTU4KCldLCBjb21taXRtZW50IHx8IHRoaXMuX2NvbW1pdG1lbnQgfHwgJ2ZpbmFsaXplZCcsXG4gICAgLy8gQXBwbHkgY29ubmVjdGlvbi9zZXJ2ZXIgZGVmYXVsdC5cbiAgICAnYmFzZTY0JyAvKiBlbmNvZGluZyAqLywgY29uZmlnID8gY29uZmlnIDogbWF5YmVGaWx0ZXJzID8ge1xuICAgICAgZmlsdGVyczogYXBwbHlEZWZhdWx0TWVtY21wRW5jb2RpbmdUb0ZpbHRlcnMobWF5YmVGaWx0ZXJzKVxuICAgIH0gOiB1bmRlZmluZWQgLyogZXh0cmEgKi8pO1xuICAgIHJldHVybiB0aGlzLl9tYWtlU3Vic2NyaXB0aW9uKHtcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgbWV0aG9kOiAncHJvZ3JhbVN1YnNjcmliZScsXG4gICAgICB1bnN1YnNjcmliZU1ldGhvZDogJ3Byb2dyYW1VbnN1YnNjcmliZSdcbiAgICB9LCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJlZ2lzdGVyIGFuIGFjY291bnQgbm90aWZpY2F0aW9uIGNhbGxiYWNrXG4gICAqXG4gICAqIEBwYXJhbSBjbGllbnRTdWJzY3JpcHRpb25JZCBjbGllbnQgc3Vic2NyaXB0aW9uIGlkIHRvIGRlcmVnaXN0ZXJcbiAgICovXG4gIGFzeW5jIHJlbW92ZVByb2dyYW1BY2NvdW50Q2hhbmdlTGlzdGVuZXIoY2xpZW50U3Vic2NyaXB0aW9uSWQpIHtcbiAgICBhd2FpdCB0aGlzLl91bnN1YnNjcmliZUNsaWVudFN1YnNjcmlwdGlvbihjbGllbnRTdWJzY3JpcHRpb25JZCwgJ3Byb2dyYW0gYWNjb3VudCBjaGFuZ2UnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW5ldmVyIGxvZ3MgYXJlIGVtaXR0ZWQuXG4gICAqL1xuICBvbkxvZ3MoZmlsdGVyLCBjYWxsYmFjaywgY29tbWl0bWVudCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3MoW3R5cGVvZiBmaWx0ZXIgPT09ICdvYmplY3QnID8ge1xuICAgICAgbWVudGlvbnM6IFtmaWx0ZXIudG9TdHJpbmcoKV1cbiAgICB9IDogZmlsdGVyXSwgY29tbWl0bWVudCB8fCB0aGlzLl9jb21taXRtZW50IHx8ICdmaW5hbGl6ZWQnIC8vIEFwcGx5IGNvbm5lY3Rpb24vc2VydmVyIGRlZmF1bHQuXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fbWFrZVN1YnNjcmlwdGlvbih7XG4gICAgICBjYWxsYmFjayxcbiAgICAgIG1ldGhvZDogJ2xvZ3NTdWJzY3JpYmUnLFxuICAgICAgdW5zdWJzY3JpYmVNZXRob2Q6ICdsb2dzVW5zdWJzY3JpYmUnXG4gICAgfSwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogRGVyZWdpc3RlciBhIGxvZ3MgY2FsbGJhY2suXG4gICAqXG4gICAqIEBwYXJhbSBjbGllbnRTdWJzY3JpcHRpb25JZCBjbGllbnQgc3Vic2NyaXB0aW9uIGlkIHRvIGRlcmVnaXN0ZXIuXG4gICAqL1xuICBhc3luYyByZW1vdmVPbkxvZ3NMaXN0ZW5lcihjbGllbnRTdWJzY3JpcHRpb25JZCkge1xuICAgIGF3YWl0IHRoaXMuX3Vuc3Vic2NyaWJlQ2xpZW50U3Vic2NyaXB0aW9uKGNsaWVudFN1YnNjcmlwdGlvbklkLCAnbG9ncycpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3dzT25Mb2dzTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbikge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlc3VsdCxcbiAgICAgIHN1YnNjcmlwdGlvblxuICAgIH0gPSBjcmVhdGUobm90aWZpY2F0aW9uLCBMb2dzTm90aWZpY2F0aW9uUmVzdWx0KTtcbiAgICB0aGlzLl9oYW5kbGVTZXJ2ZXJOb3RpZmljYXRpb24oc3Vic2NyaXB0aW9uLCBbcmVzdWx0LnZhbHVlLCByZXN1bHQuY29udGV4dF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3dzT25TbG90Tm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbikge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlc3VsdCxcbiAgICAgIHN1YnNjcmlwdGlvblxuICAgIH0gPSBjcmVhdGUobm90aWZpY2F0aW9uLCBTbG90Tm90aWZpY2F0aW9uUmVzdWx0KTtcbiAgICB0aGlzLl9oYW5kbGVTZXJ2ZXJOb3RpZmljYXRpb24oc3Vic2NyaXB0aW9uLCBbcmVzdWx0XSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHVwb24gc2xvdCBjaGFuZ2VzXG4gICAqXG4gICAqIEBwYXJhbSBjYWxsYmFjayBGdW5jdGlvbiB0byBpbnZva2Ugd2hlbmV2ZXIgdGhlIHNsb3QgY2hhbmdlc1xuICAgKiBAcmV0dXJuIHN1YnNjcmlwdGlvbiBpZFxuICAgKi9cbiAgb25TbG90Q2hhbmdlKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHRoaXMuX21ha2VTdWJzY3JpcHRpb24oe1xuICAgICAgY2FsbGJhY2ssXG4gICAgICBtZXRob2Q6ICdzbG90U3Vic2NyaWJlJyxcbiAgICAgIHVuc3Vic2NyaWJlTWV0aG9kOiAnc2xvdFVuc3Vic2NyaWJlJ1xuICAgIH0sIFtdIC8qIGFyZ3MgKi8pO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcmVnaXN0ZXIgYSBzbG90IG5vdGlmaWNhdGlvbiBjYWxsYmFja1xuICAgKlxuICAgKiBAcGFyYW0gY2xpZW50U3Vic2NyaXB0aW9uSWQgY2xpZW50IHN1YnNjcmlwdGlvbiBpZCB0byBkZXJlZ2lzdGVyXG4gICAqL1xuICBhc3luYyByZW1vdmVTbG90Q2hhbmdlTGlzdGVuZXIoY2xpZW50U3Vic2NyaXB0aW9uSWQpIHtcbiAgICBhd2FpdCB0aGlzLl91bnN1YnNjcmliZUNsaWVudFN1YnNjcmlwdGlvbihjbGllbnRTdWJzY3JpcHRpb25JZCwgJ3Nsb3QgY2hhbmdlJyk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfd3NPblNsb3RVcGRhdGVzTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbikge1xuICAgIGNvbnN0IHtcbiAgICAgIHJlc3VsdCxcbiAgICAgIHN1YnNjcmlwdGlvblxuICAgIH0gPSBjcmVhdGUobm90aWZpY2F0aW9uLCBTbG90VXBkYXRlTm90aWZpY2F0aW9uUmVzdWx0KTtcbiAgICB0aGlzLl9oYW5kbGVTZXJ2ZXJOb3RpZmljYXRpb24oc3Vic2NyaXB0aW9uLCBbcmVzdWx0XSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHVwb24gc2xvdCB1cGRhdGVzLiB7QGxpbmsgU2xvdFVwZGF0ZX0nc1xuICAgKiBtYXkgYmUgdXNlZnVsIHRvIHRyYWNrIGxpdmUgcHJvZ3Jlc3Mgb2YgYSBjbHVzdGVyLlxuICAgKlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgRnVuY3Rpb24gdG8gaW52b2tlIHdoZW5ldmVyIHRoZSBzbG90IHVwZGF0ZXNcbiAgICogQHJldHVybiBzdWJzY3JpcHRpb24gaWRcbiAgICovXG4gIG9uU2xvdFVwZGF0ZShjYWxsYmFjaykge1xuICAgIHJldHVybiB0aGlzLl9tYWtlU3Vic2NyaXB0aW9uKHtcbiAgICAgIGNhbGxiYWNrLFxuICAgICAgbWV0aG9kOiAnc2xvdHNVcGRhdGVzU3Vic2NyaWJlJyxcbiAgICAgIHVuc3Vic2NyaWJlTWV0aG9kOiAnc2xvdHNVcGRhdGVzVW5zdWJzY3JpYmUnXG4gICAgfSwgW10gLyogYXJncyAqLyk7XG4gIH1cblxuICAvKipcbiAgICogRGVyZWdpc3RlciBhIHNsb3QgdXBkYXRlIG5vdGlmaWNhdGlvbiBjYWxsYmFja1xuICAgKlxuICAgKiBAcGFyYW0gY2xpZW50U3Vic2NyaXB0aW9uSWQgY2xpZW50IHN1YnNjcmlwdGlvbiBpZCB0byBkZXJlZ2lzdGVyXG4gICAqL1xuICBhc3luYyByZW1vdmVTbG90VXBkYXRlTGlzdGVuZXIoY2xpZW50U3Vic2NyaXB0aW9uSWQpIHtcbiAgICBhd2FpdCB0aGlzLl91bnN1YnNjcmliZUNsaWVudFN1YnNjcmlwdGlvbihjbGllbnRTdWJzY3JpcHRpb25JZCwgJ3Nsb3QgdXBkYXRlJyk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuXG4gIGFzeW5jIF91bnN1YnNjcmliZUNsaWVudFN1YnNjcmlwdGlvbihjbGllbnRTdWJzY3JpcHRpb25JZCwgc3Vic2NyaXB0aW9uTmFtZSkge1xuICAgIGNvbnN0IGRpc3Bvc2UgPSB0aGlzLl9zdWJzY3JpcHRpb25EaXNwb3NlRnVuY3Rpb25zQnlDbGllbnRTdWJzY3JpcHRpb25JZFtjbGllbnRTdWJzY3JpcHRpb25JZF07XG4gICAgaWYgKGRpc3Bvc2UpIHtcbiAgICAgIGF3YWl0IGRpc3Bvc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdJZ25vcmVkIHVuc3Vic2NyaWJlIHJlcXVlc3QgYmVjYXVzZSBhbiBhY3RpdmUgc3Vic2NyaXB0aW9uIHdpdGggaWQgJyArIGBcXGAke2NsaWVudFN1YnNjcmlwdGlvbklkfVxcYCBmb3IgJyR7c3Vic2NyaXB0aW9uTmFtZX0nIGV2ZW50cyBgICsgJ2NvdWxkIG5vdCBiZSBmb3VuZC4nKTtcbiAgICB9XG4gIH1cbiAgX2J1aWxkQXJncyhhcmdzLCBvdmVycmlkZSwgZW5jb2RpbmcsIGV4dHJhKSB7XG4gICAgY29uc3QgY29tbWl0bWVudCA9IG92ZXJyaWRlIHx8IHRoaXMuX2NvbW1pdG1lbnQ7XG4gICAgaWYgKGNvbW1pdG1lbnQgfHwgZW5jb2RpbmcgfHwgZXh0cmEpIHtcbiAgICAgIGxldCBvcHRpb25zID0ge307XG4gICAgICBpZiAoZW5jb2RpbmcpIHtcbiAgICAgICAgb3B0aW9ucy5lbmNvZGluZyA9IGVuY29kaW5nO1xuICAgICAgfVxuICAgICAgaWYgKGNvbW1pdG1lbnQpIHtcbiAgICAgICAgb3B0aW9ucy5jb21taXRtZW50ID0gY29tbWl0bWVudDtcbiAgICAgIH1cbiAgICAgIGlmIChleHRyYSkge1xuICAgICAgICBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihvcHRpb25zLCBleHRyYSk7XG4gICAgICB9XG4gICAgICBhcmdzLnB1c2gob3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBhcmdzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2J1aWxkQXJnc0F0TGVhc3RDb25maXJtZWQoYXJncywgb3ZlcnJpZGUsIGVuY29kaW5nLCBleHRyYSkge1xuICAgIGNvbnN0IGNvbW1pdG1lbnQgPSBvdmVycmlkZSB8fCB0aGlzLl9jb21taXRtZW50O1xuICAgIGlmIChjb21taXRtZW50ICYmICFbJ2NvbmZpcm1lZCcsICdmaW5hbGl6ZWQnXS5pbmNsdWRlcyhjb21taXRtZW50KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVc2luZyBDb25uZWN0aW9uIHdpdGggZGVmYXVsdCBjb21taXRtZW50OiBgJyArIHRoaXMuX2NvbW1pdG1lbnQgKyAnYCwgYnV0IG1ldGhvZCByZXF1aXJlcyBhdCBsZWFzdCBgY29uZmlybWVkYCcpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYnVpbGRBcmdzKGFyZ3MsIG92ZXJyaWRlLCBlbmNvZGluZywgZXh0cmEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3dzT25TaWduYXR1cmVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVzdWx0LFxuICAgICAgc3Vic2NyaXB0aW9uXG4gICAgfSA9IGNyZWF0ZShub3RpZmljYXRpb24sIFNpZ25hdHVyZU5vdGlmaWNhdGlvblJlc3VsdCk7XG4gICAgaWYgKHJlc3VsdC52YWx1ZSAhPT0gJ3JlY2VpdmVkU2lnbmF0dXJlJykge1xuICAgICAgLyoqXG4gICAgICAgKiBTcGVjaWFsIGNhc2UuXG4gICAgICAgKiBBZnRlciBhIHNpZ25hdHVyZSBpcyBwcm9jZXNzZWQsIFJQQ3MgYXV0b21hdGljYWxseSBkaXNwb3NlIG9mIHRoZVxuICAgICAgICogc3Vic2NyaXB0aW9uIG9uIHRoZSBzZXJ2ZXIgc2lkZS4gV2UgbmVlZCB0byB0cmFjayB3aGljaCBvZiB0aGVzZVxuICAgICAgICogc3Vic2NyaXB0aW9ucyBoYXZlIGJlZW4gZGlzcG9zZWQgaW4gc3VjaCBhIHdheSwgc28gdGhhdCB3ZSBrbm93XG4gICAgICAgKiB3aGV0aGVyIHRoZSBjbGllbnQgaXMgZGVhbGluZyB3aXRoIGEgbm90LXlldC1wcm9jZXNzZWQgc2lnbmF0dXJlXG4gICAgICAgKiAoaW4gd2hpY2ggY2FzZSB3ZSBtdXN0IHRlYXIgZG93biB0aGUgc2VydmVyIHN1YnNjcmlwdGlvbikgb3IgYW5cbiAgICAgICAqIGFscmVhZHktcHJvY2Vzc2VkIHNpZ25hdHVyZSAoaW4gd2hpY2ggY2FzZSB0aGUgY2xpZW50IGNhbiBzaW1wbHlcbiAgICAgICAqIGNsZWFyIG91dCB0aGUgc3Vic2NyaXB0aW9uIGxvY2FsbHkgd2l0aG91dCB0ZWxsaW5nIHRoZSBzZXJ2ZXIpLlxuICAgICAgICpcbiAgICAgICAqIE5PVEU6IFRoZXJlIGlzIGEgcHJvcG9zYWwgdG8gZWxpbWluYXRlIHRoaXMgc3BlY2lhbCBjYXNlLCBoZXJlOlxuICAgICAgICogaHR0cHM6Ly9naXRodWIuY29tL3NvbGFuYS1sYWJzL3NvbGFuYS9pc3N1ZXMvMTg4OTJcbiAgICAgICAqL1xuICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uc0F1dG9EaXNwb3NlZEJ5UnBjLmFkZChzdWJzY3JpcHRpb24pO1xuICAgIH1cbiAgICB0aGlzLl9oYW5kbGVTZXJ2ZXJOb3RpZmljYXRpb24oc3Vic2NyaXB0aW9uLCByZXN1bHQudmFsdWUgPT09ICdyZWNlaXZlZFNpZ25hdHVyZScgPyBbe1xuICAgICAgdHlwZTogJ3JlY2VpdmVkJ1xuICAgIH0sIHJlc3VsdC5jb250ZXh0XSA6IFt7XG4gICAgICB0eXBlOiAnc3RhdHVzJyxcbiAgICAgIHJlc3VsdDogcmVzdWx0LnZhbHVlXG4gICAgfSwgcmVzdWx0LmNvbnRleHRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgdXBvbiBzaWduYXR1cmUgdXBkYXRlc1xuICAgKlxuICAgKiBAcGFyYW0gc2lnbmF0dXJlIFRyYW5zYWN0aW9uIHNpZ25hdHVyZSBzdHJpbmcgaW4gYmFzZSA1OFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgRnVuY3Rpb24gdG8gaW52b2tlIG9uIHNpZ25hdHVyZSBub3RpZmljYXRpb25zXG4gICAqIEBwYXJhbSBjb21taXRtZW50IFNwZWNpZnkgdGhlIGNvbW1pdG1lbnQgbGV2ZWwgc2lnbmF0dXJlIG11c3QgcmVhY2ggYmVmb3JlIG5vdGlmaWNhdGlvblxuICAgKiBAcmV0dXJuIHN1YnNjcmlwdGlvbiBpZFxuICAgKi9cbiAgb25TaWduYXR1cmUoc2lnbmF0dXJlLCBjYWxsYmFjaywgY29tbWl0bWVudCkge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLl9idWlsZEFyZ3MoW3NpZ25hdHVyZV0sIGNvbW1pdG1lbnQgfHwgdGhpcy5fY29tbWl0bWVudCB8fCAnZmluYWxpemVkJyAvLyBBcHBseSBjb25uZWN0aW9uL3NlcnZlciBkZWZhdWx0LlxuICAgICk7XG4gICAgY29uc3QgY2xpZW50U3Vic2NyaXB0aW9uSWQgPSB0aGlzLl9tYWtlU3Vic2NyaXB0aW9uKHtcbiAgICAgIGNhbGxiYWNrOiAobm90aWZpY2F0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIGlmIChub3RpZmljYXRpb24udHlwZSA9PT0gJ3N0YXR1cycpIHtcbiAgICAgICAgICBjYWxsYmFjayhub3RpZmljYXRpb24ucmVzdWx0LCBjb250ZXh0KTtcbiAgICAgICAgICAvLyBTaWduYXR1cmVzIHN1YnNjcmlwdGlvbnMgYXJlIGF1dG8tcmVtb3ZlZCBieSB0aGUgUlBDIHNlcnZpY2VcbiAgICAgICAgICAvLyBzbyBubyBuZWVkIHRvIGV4cGxpY2l0bHkgc2VuZCBhbiB1bnN1YnNjcmliZSBtZXNzYWdlLlxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVNpZ25hdHVyZUxpc3RlbmVyKGNsaWVudFN1YnNjcmlwdGlvbklkKTtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAgIC8vIEFscmVhZHkgcmVtb3ZlZC5cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBtZXRob2Q6ICdzaWduYXR1cmVTdWJzY3JpYmUnLFxuICAgICAgdW5zdWJzY3JpYmVNZXRob2Q6ICdzaWduYXR1cmVVbnN1YnNjcmliZSdcbiAgICB9LCBhcmdzKTtcbiAgICByZXR1cm4gY2xpZW50U3Vic2NyaXB0aW9uSWQ7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYSB0cmFuc2FjdGlvbiBpc1xuICAgKiByZWNlaXZlZCBhbmQvb3IgcHJvY2Vzc2VkLlxuICAgKlxuICAgKiBAcGFyYW0gc2lnbmF0dXJlIFRyYW5zYWN0aW9uIHNpZ25hdHVyZSBzdHJpbmcgaW4gYmFzZSA1OFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgRnVuY3Rpb24gdG8gaW52b2tlIG9uIHNpZ25hdHVyZSBub3RpZmljYXRpb25zXG4gICAqIEBwYXJhbSBvcHRpb25zIEVuYWJsZSByZWNlaXZlZCBub3RpZmljYXRpb25zIGFuZCBzZXQgdGhlIGNvbW1pdG1lbnRcbiAgICogICBsZXZlbCB0aGF0IHNpZ25hdHVyZSBtdXN0IHJlYWNoIGJlZm9yZSBub3RpZmljYXRpb25cbiAgICogQHJldHVybiBzdWJzY3JpcHRpb24gaWRcbiAgICovXG4gIG9uU2lnbmF0dXJlV2l0aE9wdGlvbnMoc2lnbmF0dXJlLCBjYWxsYmFjaywgb3B0aW9ucykge1xuICAgIGNvbnN0IHtcbiAgICAgIGNvbW1pdG1lbnQsXG4gICAgICAuLi5leHRyYVxuICAgIH0gPSB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgY29tbWl0bWVudDogb3B0aW9ucyAmJiBvcHRpb25zLmNvbW1pdG1lbnQgfHwgdGhpcy5fY29tbWl0bWVudCB8fCAnZmluYWxpemVkJyAvLyBBcHBseSBjb25uZWN0aW9uL3NlcnZlciBkZWZhdWx0LlxuICAgIH07XG4gICAgY29uc3QgYXJncyA9IHRoaXMuX2J1aWxkQXJncyhbc2lnbmF0dXJlXSwgY29tbWl0bWVudCwgdW5kZWZpbmVkIC8qIGVuY29kaW5nICovLCBleHRyYSk7XG4gICAgY29uc3QgY2xpZW50U3Vic2NyaXB0aW9uSWQgPSB0aGlzLl9tYWtlU3Vic2NyaXB0aW9uKHtcbiAgICAgIGNhbGxiYWNrOiAobm90aWZpY2F0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgIGNhbGxiYWNrKG5vdGlmaWNhdGlvbiwgY29udGV4dCk7XG4gICAgICAgIC8vIFNpZ25hdHVyZXMgc3Vic2NyaXB0aW9ucyBhcmUgYXV0by1yZW1vdmVkIGJ5IHRoZSBSUEMgc2VydmljZVxuICAgICAgICAvLyBzbyBubyBuZWVkIHRvIGV4cGxpY2l0bHkgc2VuZCBhbiB1bnN1YnNjcmliZSBtZXNzYWdlLlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlU2lnbmF0dXJlTGlzdGVuZXIoY2xpZW50U3Vic2NyaXB0aW9uSWQpO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgLy8gQWxyZWFkeSByZW1vdmVkLlxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgbWV0aG9kOiAnc2lnbmF0dXJlU3Vic2NyaWJlJyxcbiAgICAgIHVuc3Vic2NyaWJlTWV0aG9kOiAnc2lnbmF0dXJlVW5zdWJzY3JpYmUnXG4gICAgfSwgYXJncyk7XG4gICAgcmV0dXJuIGNsaWVudFN1YnNjcmlwdGlvbklkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcmVnaXN0ZXIgYSBzaWduYXR1cmUgbm90aWZpY2F0aW9uIGNhbGxiYWNrXG4gICAqXG4gICAqIEBwYXJhbSBjbGllbnRTdWJzY3JpcHRpb25JZCBjbGllbnQgc3Vic2NyaXB0aW9uIGlkIHRvIGRlcmVnaXN0ZXJcbiAgICovXG4gIGFzeW5jIHJlbW92ZVNpZ25hdHVyZUxpc3RlbmVyKGNsaWVudFN1YnNjcmlwdGlvbklkKSB7XG4gICAgYXdhaXQgdGhpcy5fdW5zdWJzY3JpYmVDbGllbnRTdWJzY3JpcHRpb24oY2xpZW50U3Vic2NyaXB0aW9uSWQsICdzaWduYXR1cmUgcmVzdWx0Jyk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfd3NPblJvb3ROb3RpZmljYXRpb24obm90aWZpY2F0aW9uKSB7XG4gICAgY29uc3Qge1xuICAgICAgcmVzdWx0LFxuICAgICAgc3Vic2NyaXB0aW9uXG4gICAgfSA9IGNyZWF0ZShub3RpZmljYXRpb24sIFJvb3ROb3RpZmljYXRpb25SZXN1bHQpO1xuICAgIHRoaXMuX2hhbmRsZVNlcnZlck5vdGlmaWNhdGlvbihzdWJzY3JpcHRpb24sIFtyZXN1bHRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgdXBvbiByb290IGNoYW5nZXNcbiAgICpcbiAgICogQHBhcmFtIGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGludm9rZSB3aGVuZXZlciB0aGUgcm9vdCBjaGFuZ2VzXG4gICAqIEByZXR1cm4gc3Vic2NyaXB0aW9uIGlkXG4gICAqL1xuICBvblJvb3RDaGFuZ2UoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gdGhpcy5fbWFrZVN1YnNjcmlwdGlvbih7XG4gICAgICBjYWxsYmFjayxcbiAgICAgIG1ldGhvZDogJ3Jvb3RTdWJzY3JpYmUnLFxuICAgICAgdW5zdWJzY3JpYmVNZXRob2Q6ICdyb290VW5zdWJzY3JpYmUnXG4gICAgfSwgW10gLyogYXJncyAqLyk7XG4gIH1cblxuICAvKipcbiAgICogRGVyZWdpc3RlciBhIHJvb3Qgbm90aWZpY2F0aW9uIGNhbGxiYWNrXG4gICAqXG4gICAqIEBwYXJhbSBjbGllbnRTdWJzY3JpcHRpb25JZCBjbGllbnQgc3Vic2NyaXB0aW9uIGlkIHRvIGRlcmVnaXN0ZXJcbiAgICovXG4gIGFzeW5jIHJlbW92ZVJvb3RDaGFuZ2VMaXN0ZW5lcihjbGllbnRTdWJzY3JpcHRpb25JZCkge1xuICAgIGF3YWl0IHRoaXMuX3Vuc3Vic2NyaWJlQ2xpZW50U3Vic2NyaXB0aW9uKGNsaWVudFN1YnNjcmlwdGlvbklkLCAncm9vdCBjaGFuZ2UnKTtcbiAgfVxufVxuXG4vKipcbiAqIEtleXBhaXIgc2lnbmVyIGludGVyZmFjZVxuICovXG5cbi8qKlxuICogQW4gYWNjb3VudCBrZXlwYWlyIHVzZWQgZm9yIHNpZ25pbmcgdHJhbnNhY3Rpb25zLlxuICovXG5jbGFzcyBLZXlwYWlyIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBrZXlwYWlyIGluc3RhbmNlLlxuICAgKiBHZW5lcmF0ZSByYW5kb20ga2V5cGFpciBpZiBubyB7QGxpbmsgRWQyNTUxOUtleXBhaXJ9IGlzIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge0VkMjU1MTlLZXlwYWlyfSBrZXlwYWlyIGVkMjU1MTkga2V5cGFpclxuICAgKi9cbiAgY29uc3RydWN0b3Ioa2V5cGFpcikge1xuICAgIHRoaXMuX2tleXBhaXIgPSB2b2lkIDA7XG4gICAgdGhpcy5fa2V5cGFpciA9IGtleXBhaXIgPz8gZ2VuZXJhdGVLZXlwYWlyKCk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBuZXcgcmFuZG9tIGtleXBhaXJcbiAgICpcbiAgICogQHJldHVybnMge0tleXBhaXJ9IEtleXBhaXJcbiAgICovXG4gIHN0YXRpYyBnZW5lcmF0ZSgpIHtcbiAgICByZXR1cm4gbmV3IEtleXBhaXIoZ2VuZXJhdGVLZXlwYWlyKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGtleXBhaXIgZnJvbSBhIHJhdyBzZWNyZXQga2V5IGJ5dGUgYXJyYXkuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgdG8gcmVjcmVhdGUgYSBrZXlwYWlyIGZyb20gYSBwcmV2aW91c2x5XG4gICAqIGdlbmVyYXRlZCBzZWNyZXQga2V5LiBHZW5lcmF0aW5nIGtleXBhaXJzIGZyb20gYSByYW5kb20gc2VlZCBzaG91bGQgYmUgZG9uZVxuICAgKiB3aXRoIHRoZSB7QGxpbmsgS2V5cGFpci5mcm9tU2VlZH0gbWV0aG9kLlxuICAgKlxuICAgKiBAdGhyb3dzIGVycm9yIGlmIHRoZSBwcm92aWRlZCBzZWNyZXQga2V5IGlzIGludmFsaWQgYW5kIHZhbGlkYXRpb24gaXMgbm90IHNraXBwZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzZWNyZXRLZXkgc2VjcmV0IGtleSBieXRlIGFycmF5XG4gICAqIEBwYXJhbSBvcHRpb25zIHNraXAgc2VjcmV0IGtleSB2YWxpZGF0aW9uXG4gICAqXG4gICAqIEByZXR1cm5zIHtLZXlwYWlyfSBLZXlwYWlyXG4gICAqL1xuICBzdGF0aWMgZnJvbVNlY3JldEtleShzZWNyZXRLZXksIG9wdGlvbnMpIHtcbiAgICBpZiAoc2VjcmV0S2V5LmJ5dGVMZW5ndGggIT09IDY0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2JhZCBzZWNyZXQga2V5IHNpemUnKTtcbiAgICB9XG4gICAgY29uc3QgcHVibGljS2V5ID0gc2VjcmV0S2V5LnNsaWNlKDMyLCA2NCk7XG4gICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLnNraXBWYWxpZGF0aW9uKSB7XG4gICAgICBjb25zdCBwcml2YXRlU2NhbGFyID0gc2VjcmV0S2V5LnNsaWNlKDAsIDMyKTtcbiAgICAgIGNvbnN0IGNvbXB1dGVkUHVibGljS2V5ID0gZ2V0UHVibGljS2V5KHByaXZhdGVTY2FsYXIpO1xuICAgICAgZm9yIChsZXQgaWkgPSAwOyBpaSA8IDMyOyBpaSsrKSB7XG4gICAgICAgIGlmIChwdWJsaWNLZXlbaWldICE9PSBjb21wdXRlZFB1YmxpY0tleVtpaV0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Byb3ZpZGVkIHNlY3JldEtleSBpcyBpbnZhbGlkJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBLZXlwYWlyKHtcbiAgICAgIHB1YmxpY0tleSxcbiAgICAgIHNlY3JldEtleVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEga2V5cGFpciBmcm9tIGEgMzIgYnl0ZSBzZWVkLlxuICAgKlxuICAgKiBAcGFyYW0gc2VlZCBzZWVkIGJ5dGUgYXJyYXlcbiAgICpcbiAgICogQHJldHVybnMge0tleXBhaXJ9IEtleXBhaXJcbiAgICovXG4gIHN0YXRpYyBmcm9tU2VlZChzZWVkKSB7XG4gICAgY29uc3QgcHVibGljS2V5ID0gZ2V0UHVibGljS2V5KHNlZWQpO1xuICAgIGNvbnN0IHNlY3JldEtleSA9IG5ldyBVaW50OEFycmF5KDY0KTtcbiAgICBzZWNyZXRLZXkuc2V0KHNlZWQpO1xuICAgIHNlY3JldEtleS5zZXQocHVibGljS2V5LCAzMik7XG4gICAgcmV0dXJuIG5ldyBLZXlwYWlyKHtcbiAgICAgIHB1YmxpY0tleSxcbiAgICAgIHNlY3JldEtleVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwdWJsaWMga2V5IGZvciB0aGlzIGtleXBhaXJcbiAgICpcbiAgICogQHJldHVybnMge1B1YmxpY0tleX0gUHVibGljS2V5XG4gICAqL1xuICBnZXQgcHVibGljS2V5KCkge1xuICAgIHJldHVybiBuZXcgUHVibGljS2V5KHRoaXMuX2tleXBhaXIucHVibGljS2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmF3IHNlY3JldCBrZXkgZm9yIHRoaXMga2V5cGFpclxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gU2VjcmV0IGtleSBpbiBhbiBhcnJheSBvZiBVaW50OCBieXRlc1xuICAgKi9cbiAgZ2V0IHNlY3JldEtleSgpIHtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkodGhpcy5fa2V5cGFpci5zZWNyZXRLZXkpO1xuICB9XG59XG5cbi8qKlxuICogQW4gZW51bWVyYXRpb24gb2YgdmFsaWQgTG9va3VwVGFibGVJbnN0cnVjdGlvblR5cGUnc1xuICovXG5cbi8qKlxuICogQW4gZW51bWVyYXRpb24gb2YgdmFsaWQgYWRkcmVzcyBsb29rdXAgdGFibGUgSW5zdHJ1Y3Rpb25UeXBlJ3NcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBMT09LVVBfVEFCTEVfSU5TVFJVQ1RJT05fTEFZT1VUUyA9IE9iamVjdC5mcmVlemUoe1xuICBDcmVhdGVMb29rdXBUYWJsZToge1xuICAgIGluZGV4OiAwLFxuICAgIGxheW91dDogQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnUzMignaW5zdHJ1Y3Rpb24nKSwgdTY0KCdyZWNlbnRTbG90JyksIEJ1ZmZlckxheW91dC51OCgnYnVtcFNlZWQnKV0pXG4gIH0sXG4gIEZyZWV6ZUxvb2t1cFRhYmxlOiB7XG4gICAgaW5kZXg6IDEsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpXSlcbiAgfSxcbiAgRXh0ZW5kTG9va3VwVGFibGU6IHtcbiAgICBpbmRleDogMixcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyksIHU2NCgpLCBCdWZmZXJMYXlvdXQuc2VxKHB1YmxpY0tleSgpLCBCdWZmZXJMYXlvdXQub2Zmc2V0KEJ1ZmZlckxheW91dC51MzIoKSwgLTgpLCAnYWRkcmVzc2VzJyldKVxuICB9LFxuICBEZWFjdGl2YXRlTG9va3VwVGFibGU6IHtcbiAgICBpbmRleDogMyxcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyldKVxuICB9LFxuICBDbG9zZUxvb2t1cFRhYmxlOiB7XG4gICAgaW5kZXg6IDQsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpXSlcbiAgfVxufSk7XG5jbGFzcyBBZGRyZXNzTG9va3VwVGFibGVJbnN0cnVjdGlvbiB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge31cbiAgc3RhdGljIGRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvblR5cGVMYXlvdXQgPSBCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpO1xuICAgIGNvbnN0IGluZGV4ID0gaW5zdHJ1Y3Rpb25UeXBlTGF5b3V0LmRlY29kZShpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICBsZXQgdHlwZTtcbiAgICBmb3IgKGNvbnN0IFtsYXlvdXRUeXBlLCBsYXlvdXRdIG9mIE9iamVjdC5lbnRyaWVzKExPT0tVUF9UQUJMRV9JTlNUUlVDVElPTl9MQVlPVVRTKSkge1xuICAgICAgaWYgKGxheW91dC5pbmRleCA9PSBpbmRleCkge1xuICAgICAgICB0eXBlID0gbGF5b3V0VHlwZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIEluc3RydWN0aW9uLiBTaG91bGQgYmUgYSBMb29rdXBUYWJsZSBJbnN0cnVjdGlvbicpO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlQ3JlYXRlTG9va3VwVGFibGUoaW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmNoZWNrUHJvZ3JhbUlkKGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgdGhpcy5jaGVja0tleXNMZW5ndGgoaW5zdHJ1Y3Rpb24ua2V5cywgNCk7XG4gICAgY29uc3Qge1xuICAgICAgcmVjZW50U2xvdFxuICAgIH0gPSBkZWNvZGVEYXRhJDEoTE9PS1VQX1RBQkxFX0lOU1RSVUNUSU9OX0xBWU9VVFMuQ3JlYXRlTG9va3VwVGFibGUsIGluc3RydWN0aW9uLmRhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICBhdXRob3JpdHk6IGluc3RydWN0aW9uLmtleXNbMV0ucHVia2V5LFxuICAgICAgcGF5ZXI6IGluc3RydWN0aW9uLmtleXNbMl0ucHVia2V5LFxuICAgICAgcmVjZW50U2xvdDogTnVtYmVyKHJlY2VudFNsb3QpXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlRXh0ZW5kTG9va3VwVGFibGUoaW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmNoZWNrUHJvZ3JhbUlkKGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgaWYgKGluc3RydWN0aW9uLmtleXMubGVuZ3RoIDwgMikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGluc3RydWN0aW9uOyBmb3VuZCAke2luc3RydWN0aW9uLmtleXMubGVuZ3RofSBrZXlzLCBleHBlY3RlZCBhdCBsZWFzdCAyYCk7XG4gICAgfVxuICAgIGNvbnN0IHtcbiAgICAgIGFkZHJlc3Nlc1xuICAgIH0gPSBkZWNvZGVEYXRhJDEoTE9PS1VQX1RBQkxFX0lOU1RSVUNUSU9OX0xBWU9VVFMuRXh0ZW5kTG9va3VwVGFibGUsIGluc3RydWN0aW9uLmRhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICBsb29rdXBUYWJsZTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXksXG4gICAgICBhdXRob3JpdHk6IGluc3RydWN0aW9uLmtleXNbMV0ucHVia2V5LFxuICAgICAgcGF5ZXI6IGluc3RydWN0aW9uLmtleXMubGVuZ3RoID4gMiA/IGluc3RydWN0aW9uLmtleXNbMl0ucHVia2V5IDogdW5kZWZpbmVkLFxuICAgICAgYWRkcmVzc2VzOiBhZGRyZXNzZXMubWFwKGJ1ZmZlciA9PiBuZXcgUHVibGljS2V5KGJ1ZmZlcikpXG4gICAgfTtcbiAgfVxuICBzdGF0aWMgZGVjb2RlQ2xvc2VMb29rdXBUYWJsZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5c0xlbmd0aChpbnN0cnVjdGlvbi5rZXlzLCAzKTtcbiAgICByZXR1cm4ge1xuICAgICAgbG9va3VwVGFibGU6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgYXV0aG9yaXR5OiBpbnN0cnVjdGlvbi5rZXlzWzFdLnB1YmtleSxcbiAgICAgIHJlY2lwaWVudDogaW5zdHJ1Y3Rpb24ua2V5c1syXS5wdWJrZXlcbiAgICB9O1xuICB9XG4gIHN0YXRpYyBkZWNvZGVGcmVlemVMb29rdXBUYWJsZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5c0xlbmd0aChpbnN0cnVjdGlvbi5rZXlzLCAyKTtcbiAgICByZXR1cm4ge1xuICAgICAgbG9va3VwVGFibGU6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgYXV0aG9yaXR5OiBpbnN0cnVjdGlvbi5rZXlzWzFdLnB1YmtleVxuICAgIH07XG4gIH1cbiAgc3RhdGljIGRlY29kZURlYWN0aXZhdGVMb29rdXBUYWJsZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5c0xlbmd0aChpbnN0cnVjdGlvbi5rZXlzLCAyKTtcbiAgICByZXR1cm4ge1xuICAgICAgbG9va3VwVGFibGU6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgYXV0aG9yaXR5OiBpbnN0cnVjdGlvbi5rZXlzWzFdLnB1YmtleVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgY2hlY2tQcm9ncmFtSWQocHJvZ3JhbUlkKSB7XG4gICAgaWYgKCFwcm9ncmFtSWQuZXF1YWxzKEFkZHJlc3NMb29rdXBUYWJsZVByb2dyYW0ucHJvZ3JhbUlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluc3RydWN0aW9uOyBwcm9ncmFtSWQgaXMgbm90IEFkZHJlc3NMb29rdXBUYWJsZSBQcm9ncmFtJyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBjaGVja0tleXNMZW5ndGgoa2V5cywgZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICBpZiAoa2V5cy5sZW5ndGggPCBleHBlY3RlZExlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBpbnZhbGlkIGluc3RydWN0aW9uOyBmb3VuZCAke2tleXMubGVuZ3RofSBrZXlzLCBleHBlY3RlZCBhdCBsZWFzdCAke2V4cGVjdGVkTGVuZ3RofWApO1xuICAgIH1cbiAgfVxufVxuY2xhc3MgQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge31cbiAgc3RhdGljIGNyZWF0ZUxvb2t1cFRhYmxlKHBhcmFtcykge1xuICAgIGNvbnN0IFtsb29rdXBUYWJsZUFkZHJlc3MsIGJ1bXBTZWVkXSA9IFB1YmxpY0tleS5maW5kUHJvZ3JhbUFkZHJlc3NTeW5jKFtwYXJhbXMuYXV0aG9yaXR5LnRvQnVmZmVyKCksIGdldFU2NEVuY29kZXIoKS5lbmNvZGUocGFyYW1zLnJlY2VudFNsb3QpXSwgdGhpcy5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IHR5cGUgPSBMT09LVVBfVEFCTEVfSU5TVFJVQ1RJT05fTEFZT1VUUy5DcmVhdGVMb29rdXBUYWJsZTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICByZWNlbnRTbG90OiBCaWdJbnQocGFyYW1zLnJlY2VudFNsb3QpLFxuICAgICAgYnVtcFNlZWQ6IGJ1bXBTZWVkXG4gICAgfSk7XG4gICAgY29uc3Qga2V5cyA9IFt7XG4gICAgICBwdWJrZXk6IGxvb2t1cFRhYmxlQWRkcmVzcyxcbiAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICB9LCB7XG4gICAgICBwdWJrZXk6IHBhcmFtcy5hdXRob3JpdHksXG4gICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgfSwge1xuICAgICAgcHVia2V5OiBwYXJhbXMucGF5ZXIsXG4gICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICB9LCB7XG4gICAgICBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICB9XTtcbiAgICByZXR1cm4gW25ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBrZXlzOiBrZXlzLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pLCBsb29rdXBUYWJsZUFkZHJlc3NdO1xuICB9XG4gIHN0YXRpYyBmcmVlemVMb29rdXBUYWJsZShwYXJhbXMpIHtcbiAgICBjb25zdCB0eXBlID0gTE9PS1VQX1RBQkxFX0lOU1RSVUNUSU9OX0xBWU9VVFMuRnJlZXplTG9va3VwVGFibGU7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZURhdGEodHlwZSk7XG4gICAgY29uc3Qga2V5cyA9IFt7XG4gICAgICBwdWJrZXk6IHBhcmFtcy5sb29rdXBUYWJsZSxcbiAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICB9LCB7XG4gICAgICBwdWJrZXk6IHBhcmFtcy5hdXRob3JpdHksXG4gICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgfV07XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBrZXlzOiBrZXlzLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pO1xuICB9XG4gIHN0YXRpYyBleHRlbmRMb29rdXBUYWJsZShwYXJhbXMpIHtcbiAgICBjb25zdCB0eXBlID0gTE9PS1VQX1RBQkxFX0lOU1RSVUNUSU9OX0xBWU9VVFMuRXh0ZW5kTG9va3VwVGFibGU7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZURhdGEodHlwZSwge1xuICAgICAgYWRkcmVzc2VzOiBwYXJhbXMuYWRkcmVzc2VzLm1hcChhZGRyID0+IGFkZHIudG9CeXRlcygpKVxuICAgIH0pO1xuICAgIGNvbnN0IGtleXMgPSBbe1xuICAgICAgcHVia2V5OiBwYXJhbXMubG9va3VwVGFibGUsXG4gICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgfSwge1xuICAgICAgcHVia2V5OiBwYXJhbXMuYXV0aG9yaXR5LFxuICAgICAgaXNTaWduZXI6IHRydWUsXG4gICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgIH1dO1xuICAgIGlmIChwYXJhbXMucGF5ZXIpIHtcbiAgICAgIGtleXMucHVzaCh7XG4gICAgICAgIHB1YmtleTogcGFyYW1zLnBheWVyLFxuICAgICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IFN5c3RlbVByb2dyYW0ucHJvZ3JhbUlkLFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBrZXlzOiBrZXlzLFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0pO1xuICB9XG4gIHN0YXRpYyBkZWFjdGl2YXRlTG9va3VwVGFibGUocGFyYW1zKSB7XG4gICAgY29uc3QgdHlwZSA9IExPT0tVUF9UQUJMRV9JTlNUUlVDVElPTl9MQVlPVVRTLkRlYWN0aXZhdGVMb29rdXBUYWJsZTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlKTtcbiAgICBjb25zdCBrZXlzID0gW3tcbiAgICAgIHB1YmtleTogcGFyYW1zLmxvb2t1cFRhYmxlLFxuICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgIH0sIHtcbiAgICAgIHB1YmtleTogcGFyYW1zLmF1dGhvcml0eSxcbiAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICB9XTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZCxcbiAgICAgIGtleXM6IGtleXMsXG4gICAgICBkYXRhOiBkYXRhXG4gICAgfSk7XG4gIH1cbiAgc3RhdGljIGNsb3NlTG9va3VwVGFibGUocGFyYW1zKSB7XG4gICAgY29uc3QgdHlwZSA9IExPT0tVUF9UQUJMRV9JTlNUUlVDVElPTl9MQVlPVVRTLkNsb3NlTG9va3VwVGFibGU7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZURhdGEodHlwZSk7XG4gICAgY29uc3Qga2V5cyA9IFt7XG4gICAgICBwdWJrZXk6IHBhcmFtcy5sb29rdXBUYWJsZSxcbiAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICB9LCB7XG4gICAgICBwdWJrZXk6IHBhcmFtcy5hdXRob3JpdHksXG4gICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgfSwge1xuICAgICAgcHVia2V5OiBwYXJhbXMucmVjaXBpZW50LFxuICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgIH1dO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAga2V5czoga2V5cyxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KTtcbiAgfVxufVxuQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbS5wcm9ncmFtSWQgPSBuZXcgUHVibGljS2V5KCdBZGRyZXNzTG9va3VwVGFiMWUxMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG5cbi8qKlxuICogQ29tcHV0ZSBCdWRnZXQgSW5zdHJ1Y3Rpb24gY2xhc3NcbiAqL1xuY2xhc3MgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgYSBjb21wdXRlIGJ1ZGdldCBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHR5cGUuXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlSW5zdHJ1Y3Rpb25UeXBlKGluc3RydWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja1Byb2dyYW1JZChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IGluc3RydWN0aW9uVHlwZUxheW91dCA9IEJ1ZmZlckxheW91dC51OCgnaW5zdHJ1Y3Rpb24nKTtcbiAgICBjb25zdCB0eXBlSW5kZXggPSBpbnN0cnVjdGlvblR5cGVMYXlvdXQuZGVjb2RlKGluc3RydWN0aW9uLmRhdGEpO1xuICAgIGxldCB0eXBlO1xuICAgIGZvciAoY29uc3QgW2l4VHlwZSwgbGF5b3V0XSBvZiBPYmplY3QuZW50cmllcyhDT01QVVRFX0JVREdFVF9JTlNUUlVDVElPTl9MQVlPVVRTKSkge1xuICAgICAgaWYgKGxheW91dC5pbmRleCA9PSB0eXBlSW5kZXgpIHtcbiAgICAgICAgdHlwZSA9IGl4VHlwZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnN0cnVjdGlvbiB0eXBlIGluY29ycmVjdDsgbm90IGEgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSByZXF1ZXN0IHVuaXRzIGNvbXB1dGUgYnVkZ2V0IGluc3RydWN0aW9uIGFuZCByZXRyaWV2ZSB0aGUgaW5zdHJ1Y3Rpb24gcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZVJlcXVlc3RVbml0cyhpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCB7XG4gICAgICB1bml0cyxcbiAgICAgIGFkZGl0aW9uYWxGZWVcbiAgICB9ID0gZGVjb2RlRGF0YSQxKENPTVBVVEVfQlVER0VUX0lOU1RSVUNUSU9OX0xBWU9VVFMuUmVxdWVzdFVuaXRzLCBpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgdW5pdHMsXG4gICAgICBhZGRpdGlvbmFsRmVlXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgcmVxdWVzdCBoZWFwIGZyYW1lIGNvbXB1dGUgYnVkZ2V0IGluc3RydWN0aW9uIGFuZCByZXRyaWV2ZSB0aGUgaW5zdHJ1Y3Rpb24gcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZVJlcXVlc3RIZWFwRnJhbWUoaW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmNoZWNrUHJvZ3JhbUlkKGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgY29uc3Qge1xuICAgICAgYnl0ZXNcbiAgICB9ID0gZGVjb2RlRGF0YSQxKENPTVBVVEVfQlVER0VUX0lOU1RSVUNUSU9OX0xBWU9VVFMuUmVxdWVzdEhlYXBGcmFtZSwgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ5dGVzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgc2V0IGNvbXB1dGUgdW5pdCBsaW1pdCBjb21wdXRlIGJ1ZGdldCBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVTZXRDb21wdXRlVW5pdExpbWl0KGluc3RydWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja1Byb2dyYW1JZChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgIGNvbnN0IHtcbiAgICAgIHVuaXRzXG4gICAgfSA9IGRlY29kZURhdGEkMShDT01QVVRFX0JVREdFVF9JTlNUUlVDVElPTl9MQVlPVVRTLlNldENvbXB1dGVVbml0TGltaXQsIGluc3RydWN0aW9uLmRhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICB1bml0c1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIHNldCBjb21wdXRlIHVuaXQgcHJpY2UgY29tcHV0ZSBidWRnZXQgaW5zdHJ1Y3Rpb24gYW5kIHJldHJpZXZlIHRoZSBpbnN0cnVjdGlvbiBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlU2V0Q29tcHV0ZVVuaXRQcmljZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCB7XG4gICAgICBtaWNyb0xhbXBvcnRzXG4gICAgfSA9IGRlY29kZURhdGEkMShDT01QVVRFX0JVREdFVF9JTlNUUlVDVElPTl9MQVlPVVRTLlNldENvbXB1dGVVbml0UHJpY2UsIGluc3RydWN0aW9uLmRhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICBtaWNyb0xhbXBvcnRzXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBjaGVja1Byb2dyYW1JZChwcm9ncmFtSWQpIHtcbiAgICBpZiAoIXByb2dyYW1JZC5lcXVhbHMoQ29tcHV0ZUJ1ZGdldFByb2dyYW0ucHJvZ3JhbUlkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGluc3RydWN0aW9uOyBwcm9ncmFtSWQgaXMgbm90IENvbXB1dGVCdWRnZXRQcm9ncmFtJyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQW4gZW51bWVyYXRpb24gb2YgdmFsaWQgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uVHlwZSdzXG4gKi9cblxuLyoqXG4gKiBSZXF1ZXN0IHVuaXRzIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG5cbi8qKlxuICogUmVxdWVzdCBoZWFwIGZyYW1lIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG5cbi8qKlxuICogU2V0IGNvbXB1dGUgdW5pdCBsaW1pdCBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqL1xuXG4vKipcbiAqIFNldCBjb21wdXRlIHVuaXQgcHJpY2UgaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gKi9cblxuLyoqXG4gKiBBbiBlbnVtZXJhdGlvbiBvZiB2YWxpZCBDb21wdXRlQnVkZ2V0IEluc3RydWN0aW9uVHlwZSdzXG4gKiBAaW50ZXJuYWxcbiAqL1xuY29uc3QgQ09NUFVURV9CVURHRVRfSU5TVFJVQ1RJT05fTEFZT1VUUyA9IE9iamVjdC5mcmVlemUoe1xuICBSZXF1ZXN0VW5pdHM6IHtcbiAgICBpbmRleDogMCxcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51OCgnaW5zdHJ1Y3Rpb24nKSwgQnVmZmVyTGF5b3V0LnUzMigndW5pdHMnKSwgQnVmZmVyTGF5b3V0LnUzMignYWRkaXRpb25hbEZlZScpXSlcbiAgfSxcbiAgUmVxdWVzdEhlYXBGcmFtZToge1xuICAgIGluZGV4OiAxLFxuICAgIGxheW91dDogQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnU4KCdpbnN0cnVjdGlvbicpLCBCdWZmZXJMYXlvdXQudTMyKCdieXRlcycpXSlcbiAgfSxcbiAgU2V0Q29tcHV0ZVVuaXRMaW1pdDoge1xuICAgIGluZGV4OiAyLFxuICAgIGxheW91dDogQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnU4KCdpbnN0cnVjdGlvbicpLCBCdWZmZXJMYXlvdXQudTMyKCd1bml0cycpXSlcbiAgfSxcbiAgU2V0Q29tcHV0ZVVuaXRQcmljZToge1xuICAgIGluZGV4OiAzLFxuICAgIGxheW91dDogQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnU4KCdpbnN0cnVjdGlvbicpLCB1NjQoJ21pY3JvTGFtcG9ydHMnKV0pXG4gIH1cbn0pO1xuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIHRyYW5zYWN0aW9uIGluc3RydWN0aW9ucyB0byBpbnRlcmFjdCB3aXRoIHRoZSBDb21wdXRlIEJ1ZGdldCBwcm9ncmFtXG4gKi9cbmNsYXNzIENvbXB1dGVCdWRnZXRQcm9ncmFtIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBQdWJsaWMga2V5IHRoYXQgaWRlbnRpZmllcyB0aGUgQ29tcHV0ZSBCdWRnZXQgcHJvZ3JhbVxuICAgKi9cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgSW5zdGVhZCwgY2FsbCB7QGxpbmsgc2V0Q29tcHV0ZVVuaXRMaW1pdH0gYW5kL29yIHtAbGluayBzZXRDb21wdXRlVW5pdFByaWNlfVxuICAgKi9cbiAgc3RhdGljIHJlcXVlc3RVbml0cyhwYXJhbXMpIHtcbiAgICBjb25zdCB0eXBlID0gQ09NUFVURV9CVURHRVRfSU5TVFJVQ1RJT05fTEFZT1VUUy5SZXF1ZXN0VW5pdHM7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZURhdGEodHlwZSwgcGFyYW1zKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgICAga2V5czogW10sXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG4gIHN0YXRpYyByZXF1ZXN0SGVhcEZyYW1lKHBhcmFtcykge1xuICAgIGNvbnN0IHR5cGUgPSBDT01QVVRFX0JVREdFVF9JTlNUUlVDVElPTl9MQVlPVVRTLlJlcXVlc3RIZWFwRnJhbWU7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZURhdGEodHlwZSwgcGFyYW1zKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgICAga2V5czogW10sXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG4gIHN0YXRpYyBzZXRDb21wdXRlVW5pdExpbWl0KHBhcmFtcykge1xuICAgIGNvbnN0IHR5cGUgPSBDT01QVVRFX0JVREdFVF9JTlNUUlVDVElPTl9MQVlPVVRTLlNldENvbXB1dGVVbml0TGltaXQ7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZURhdGEodHlwZSwgcGFyYW1zKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgICAga2V5czogW10sXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG4gIHN0YXRpYyBzZXRDb21wdXRlVW5pdFByaWNlKHBhcmFtcykge1xuICAgIGNvbnN0IHR5cGUgPSBDT01QVVRFX0JVREdFVF9JTlNUUlVDVElPTl9MQVlPVVRTLlNldENvbXB1dGVVbml0UHJpY2U7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZURhdGEodHlwZSwge1xuICAgICAgbWljcm9MYW1wb3J0czogQmlnSW50KHBhcmFtcy5taWNyb0xhbXBvcnRzKVxuICAgIH0pO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICBrZXlzOiBbXSxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cbn1cbkNvbXB1dGVCdWRnZXRQcm9ncmFtLnByb2dyYW1JZCA9IG5ldyBQdWJsaWNLZXkoJ0NvbXB1dGVCdWRnZXQxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcblxuY29uc3QgUFJJVkFURV9LRVlfQllURVMkMSA9IDY0O1xuY29uc3QgUFVCTElDX0tFWV9CWVRFUyQxID0gMzI7XG5jb25zdCBTSUdOQVRVUkVfQllURVMgPSA2NDtcblxuLyoqXG4gKiBQYXJhbXMgZm9yIGNyZWF0aW5nIGFuIGVkMjU1MTkgaW5zdHJ1Y3Rpb24gdXNpbmcgYSBwdWJsaWMga2V5XG4gKi9cblxuLyoqXG4gKiBQYXJhbXMgZm9yIGNyZWF0aW5nIGFuIGVkMjU1MTkgaW5zdHJ1Y3Rpb24gdXNpbmcgYSBwcml2YXRlIGtleVxuICovXG5cbmNvbnN0IEVEMjU1MTlfSU5TVFJVQ1RJT05fTEFZT1VUID0gQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnU4KCdudW1TaWduYXR1cmVzJyksIEJ1ZmZlckxheW91dC51OCgncGFkZGluZycpLCBCdWZmZXJMYXlvdXQudTE2KCdzaWduYXR1cmVPZmZzZXQnKSwgQnVmZmVyTGF5b3V0LnUxNignc2lnbmF0dXJlSW5zdHJ1Y3Rpb25JbmRleCcpLCBCdWZmZXJMYXlvdXQudTE2KCdwdWJsaWNLZXlPZmZzZXQnKSwgQnVmZmVyTGF5b3V0LnUxNigncHVibGljS2V5SW5zdHJ1Y3Rpb25JbmRleCcpLCBCdWZmZXJMYXlvdXQudTE2KCdtZXNzYWdlRGF0YU9mZnNldCcpLCBCdWZmZXJMYXlvdXQudTE2KCdtZXNzYWdlRGF0YVNpemUnKSwgQnVmZmVyTGF5b3V0LnUxNignbWVzc2FnZUluc3RydWN0aW9uSW5kZXgnKV0pO1xuY2xhc3MgRWQyNTUxOVByb2dyYW0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBrZXkgdGhhdCBpZGVudGlmaWVzIHRoZSBlZDI1NTE5IHByb2dyYW1cbiAgICovXG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBlZDI1NTE5IGluc3RydWN0aW9uIHdpdGggYSBwdWJsaWMga2V5IGFuZCBzaWduYXR1cmUuIFRoZVxuICAgKiBwdWJsaWMga2V5IG11c3QgYmUgYSBidWZmZXIgdGhhdCBpcyAzMiBieXRlcyBsb25nLCBhbmQgdGhlIHNpZ25hdHVyZVxuICAgKiBtdXN0IGJlIGEgYnVmZmVyIG9mIDY0IGJ5dGVzLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RydWN0aW9uV2l0aFB1YmxpY0tleShwYXJhbXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBwdWJsaWNLZXksXG4gICAgICBtZXNzYWdlLFxuICAgICAgc2lnbmF0dXJlLFxuICAgICAgaW5zdHJ1Y3Rpb25JbmRleFxuICAgIH0gPSBwYXJhbXM7XG4gICAgYXNzZXJ0KHB1YmxpY0tleS5sZW5ndGggPT09IFBVQkxJQ19LRVlfQllURVMkMSwgYFB1YmxpYyBLZXkgbXVzdCBiZSAke1BVQkxJQ19LRVlfQllURVMkMX0gYnl0ZXMgYnV0IHJlY2VpdmVkICR7cHVibGljS2V5Lmxlbmd0aH0gYnl0ZXNgKTtcbiAgICBhc3NlcnQoc2lnbmF0dXJlLmxlbmd0aCA9PT0gU0lHTkFUVVJFX0JZVEVTLCBgU2lnbmF0dXJlIG11c3QgYmUgJHtTSUdOQVRVUkVfQllURVN9IGJ5dGVzIGJ1dCByZWNlaXZlZCAke3NpZ25hdHVyZS5sZW5ndGh9IGJ5dGVzYCk7XG4gICAgY29uc3QgcHVibGljS2V5T2Zmc2V0ID0gRUQyNTUxOV9JTlNUUlVDVElPTl9MQVlPVVQuc3BhbjtcbiAgICBjb25zdCBzaWduYXR1cmVPZmZzZXQgPSBwdWJsaWNLZXlPZmZzZXQgKyBwdWJsaWNLZXkubGVuZ3RoO1xuICAgIGNvbnN0IG1lc3NhZ2VEYXRhT2Zmc2V0ID0gc2lnbmF0dXJlT2Zmc2V0ICsgc2lnbmF0dXJlLmxlbmd0aDtcbiAgICBjb25zdCBudW1TaWduYXR1cmVzID0gMTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbkRhdGEgPSBCdWZmZXIuYWxsb2MobWVzc2FnZURhdGFPZmZzZXQgKyBtZXNzYWdlLmxlbmd0aCk7XG4gICAgY29uc3QgaW5kZXggPSBpbnN0cnVjdGlvbkluZGV4ID09IG51bGwgPyAweGZmZmYgLy8gQW4gaW5kZXggb2YgYHUxNjo6TUFYYCBtYWtlcyBpdCBkZWZhdWx0IHRvIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLlxuICAgIDogaW5zdHJ1Y3Rpb25JbmRleDtcbiAgICBFRDI1NTE5X0lOU1RSVUNUSU9OX0xBWU9VVC5lbmNvZGUoe1xuICAgICAgbnVtU2lnbmF0dXJlcyxcbiAgICAgIHBhZGRpbmc6IDAsXG4gICAgICBzaWduYXR1cmVPZmZzZXQsXG4gICAgICBzaWduYXR1cmVJbnN0cnVjdGlvbkluZGV4OiBpbmRleCxcbiAgICAgIHB1YmxpY0tleU9mZnNldCxcbiAgICAgIHB1YmxpY0tleUluc3RydWN0aW9uSW5kZXg6IGluZGV4LFxuICAgICAgbWVzc2FnZURhdGFPZmZzZXQsXG4gICAgICBtZXNzYWdlRGF0YVNpemU6IG1lc3NhZ2UubGVuZ3RoLFxuICAgICAgbWVzc2FnZUluc3RydWN0aW9uSW5kZXg6IGluZGV4XG4gICAgfSwgaW5zdHJ1Y3Rpb25EYXRhKTtcbiAgICBpbnN0cnVjdGlvbkRhdGEuZmlsbChwdWJsaWNLZXksIHB1YmxpY0tleU9mZnNldCk7XG4gICAgaW5zdHJ1Y3Rpb25EYXRhLmZpbGwoc2lnbmF0dXJlLCBzaWduYXR1cmVPZmZzZXQpO1xuICAgIGluc3RydWN0aW9uRGF0YS5maWxsKG1lc3NhZ2UsIG1lc3NhZ2VEYXRhT2Zmc2V0KTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oe1xuICAgICAga2V5czogW10sXG4gICAgICBwcm9ncmFtSWQ6IEVkMjU1MTlQcm9ncmFtLnByb2dyYW1JZCxcbiAgICAgIGRhdGE6IGluc3RydWN0aW9uRGF0YVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBlZDI1NTE5IGluc3RydWN0aW9uIHdpdGggYSBwcml2YXRlIGtleS4gVGhlIHByaXZhdGUga2V5XG4gICAqIG11c3QgYmUgYSBidWZmZXIgdGhhdCBpcyA2NCBieXRlcyBsb25nLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RydWN0aW9uV2l0aFByaXZhdGVLZXkocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJpdmF0ZUtleSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBpbnN0cnVjdGlvbkluZGV4XG4gICAgfSA9IHBhcmFtcztcbiAgICBhc3NlcnQocHJpdmF0ZUtleS5sZW5ndGggPT09IFBSSVZBVEVfS0VZX0JZVEVTJDEsIGBQcml2YXRlIGtleSBtdXN0IGJlICR7UFJJVkFURV9LRVlfQllURVMkMX0gYnl0ZXMgYnV0IHJlY2VpdmVkICR7cHJpdmF0ZUtleS5sZW5ndGh9IGJ5dGVzYCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGtleXBhaXIgPSBLZXlwYWlyLmZyb21TZWNyZXRLZXkocHJpdmF0ZUtleSk7XG4gICAgICBjb25zdCBwdWJsaWNLZXkgPSBrZXlwYWlyLnB1YmxpY0tleS50b0J5dGVzKCk7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBzaWduKG1lc3NhZ2UsIGtleXBhaXIuc2VjcmV0S2V5KTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUluc3RydWN0aW9uV2l0aFB1YmxpY0tleSh7XG4gICAgICAgIHB1YmxpY0tleSxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgc2lnbmF0dXJlLFxuICAgICAgICBpbnN0cnVjdGlvbkluZGV4XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBjcmVhdGluZyBpbnN0cnVjdGlvbjsgJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbn1cbkVkMjU1MTlQcm9ncmFtLnByb2dyYW1JZCA9IG5ldyBQdWJsaWNLZXkoJ0VkMjU1MTlTaWdWZXJpZnkxMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcblxuY29uc3QgZWNkc2FTaWduID0gKG1zZ0hhc2gsIHByaXZLZXkpID0+IHtcbiAgY29uc3Qgc2lnbmF0dXJlID0gc2VjcDI1NmsxLnNpZ24obXNnSGFzaCwgcHJpdktleSk7XG4gIHJldHVybiBbc2lnbmF0dXJlLnRvQ29tcGFjdFJhd0J5dGVzKCksIHNpZ25hdHVyZS5yZWNvdmVyeV07XG59O1xuc2VjcDI1NmsxLnV0aWxzLmlzVmFsaWRQcml2YXRlS2V5O1xuY29uc3QgcHVibGljS2V5Q3JlYXRlID0gc2VjcDI1NmsxLmdldFB1YmxpY0tleTtcblxuY29uc3QgUFJJVkFURV9LRVlfQllURVMgPSAzMjtcbmNvbnN0IEVUSEVSRVVNX0FERFJFU1NfQllURVMgPSAyMDtcbmNvbnN0IFBVQkxJQ19LRVlfQllURVMgPSA2NDtcbmNvbnN0IFNJR05BVFVSRV9PRkZTRVRTX1NFUklBTElaRURfU0laRSA9IDExO1xuXG4vKipcbiAqIFBhcmFtcyBmb3IgY3JlYXRpbmcgYW4gc2VjcDI1NmsxIGluc3RydWN0aW9uIHVzaW5nIGEgcHVibGljIGtleVxuICovXG5cbi8qKlxuICogUGFyYW1zIGZvciBjcmVhdGluZyBhbiBzZWNwMjU2azEgaW5zdHJ1Y3Rpb24gdXNpbmcgYW4gRXRoZXJldW0gYWRkcmVzc1xuICovXG5cbi8qKlxuICogUGFyYW1zIGZvciBjcmVhdGluZyBhbiBzZWNwMjU2azEgaW5zdHJ1Y3Rpb24gdXNpbmcgYSBwcml2YXRlIGtleVxuICovXG5cbmNvbnN0IFNFQ1AyNTZLMV9JTlNUUlVDVElPTl9MQVlPVVQgPSBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTgoJ251bVNpZ25hdHVyZXMnKSwgQnVmZmVyTGF5b3V0LnUxNignc2lnbmF0dXJlT2Zmc2V0JyksIEJ1ZmZlckxheW91dC51OCgnc2lnbmF0dXJlSW5zdHJ1Y3Rpb25JbmRleCcpLCBCdWZmZXJMYXlvdXQudTE2KCdldGhBZGRyZXNzT2Zmc2V0JyksIEJ1ZmZlckxheW91dC51OCgnZXRoQWRkcmVzc0luc3RydWN0aW9uSW5kZXgnKSwgQnVmZmVyTGF5b3V0LnUxNignbWVzc2FnZURhdGFPZmZzZXQnKSwgQnVmZmVyTGF5b3V0LnUxNignbWVzc2FnZURhdGFTaXplJyksIEJ1ZmZlckxheW91dC51OCgnbWVzc2FnZUluc3RydWN0aW9uSW5kZXgnKSwgQnVmZmVyTGF5b3V0LmJsb2IoMjAsICdldGhBZGRyZXNzJyksIEJ1ZmZlckxheW91dC5ibG9iKDY0LCAnc2lnbmF0dXJlJyksIEJ1ZmZlckxheW91dC51OCgncmVjb3ZlcnlJZCcpXSk7XG5jbGFzcyBTZWNwMjU2azFQcm9ncmFtIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBQdWJsaWMga2V5IHRoYXQgaWRlbnRpZmllcyB0aGUgc2VjcDI1NmsxIHByb2dyYW1cbiAgICovXG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhbiBFdGhlcmV1bSBhZGRyZXNzIGZyb20gYSBzZWNwMjU2azEgcHVibGljIGtleSBidWZmZXIuXG4gICAqIEBwYXJhbSB7QnVmZmVyfSBwdWJsaWNLZXkgYSA2NCBieXRlIHNlY3AyNTZrMSBwdWJsaWMga2V5IGJ1ZmZlclxuICAgKi9cbiAgc3RhdGljIHB1YmxpY0tleVRvRXRoQWRkcmVzcyhwdWJsaWNLZXkpIHtcbiAgICBhc3NlcnQocHVibGljS2V5Lmxlbmd0aCA9PT0gUFVCTElDX0tFWV9CWVRFUywgYFB1YmxpYyBrZXkgbXVzdCBiZSAke1BVQkxJQ19LRVlfQllURVN9IGJ5dGVzIGJ1dCByZWNlaXZlZCAke3B1YmxpY0tleS5sZW5ndGh9IGJ5dGVzYCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBCdWZmZXIuZnJvbShrZWNjYWtfMjU2KHRvQnVmZmVyKHB1YmxpY0tleSkpKS5zbGljZSgtRVRIRVJFVU1fQUREUkVTU19CWVRFUyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgY29uc3RydWN0aW5nIEV0aGVyZXVtIGFkZHJlc3M6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBzZWNwMjU2azEgaW5zdHJ1Y3Rpb24gd2l0aCBhIHB1YmxpYyBrZXkuIFRoZSBwdWJsaWMga2V5XG4gICAqIG11c3QgYmUgYSBidWZmZXIgdGhhdCBpcyA2NCBieXRlcyBsb25nLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RydWN0aW9uV2l0aFB1YmxpY0tleShwYXJhbXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBwdWJsaWNLZXksXG4gICAgICBtZXNzYWdlLFxuICAgICAgc2lnbmF0dXJlLFxuICAgICAgcmVjb3ZlcnlJZCxcbiAgICAgIGluc3RydWN0aW9uSW5kZXhcbiAgICB9ID0gcGFyYW1zO1xuICAgIHJldHVybiBTZWNwMjU2azFQcm9ncmFtLmNyZWF0ZUluc3RydWN0aW9uV2l0aEV0aEFkZHJlc3Moe1xuICAgICAgZXRoQWRkcmVzczogU2VjcDI1NmsxUHJvZ3JhbS5wdWJsaWNLZXlUb0V0aEFkZHJlc3MocHVibGljS2V5KSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBzaWduYXR1cmUsXG4gICAgICByZWNvdmVyeUlkLFxuICAgICAgaW5zdHJ1Y3Rpb25JbmRleFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhbiBzZWNwMjU2azEgaW5zdHJ1Y3Rpb24gd2l0aCBhbiBFdGhlcmV1bSBhZGRyZXNzLiBUaGUgYWRkcmVzc1xuICAgKiBtdXN0IGJlIGEgaGV4IHN0cmluZyBvciBhIGJ1ZmZlciB0aGF0IGlzIDIwIGJ5dGVzIGxvbmcuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlSW5zdHJ1Y3Rpb25XaXRoRXRoQWRkcmVzcyhwYXJhbXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBldGhBZGRyZXNzOiByYXdBZGRyZXNzLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHNpZ25hdHVyZSxcbiAgICAgIHJlY292ZXJ5SWQsXG4gICAgICBpbnN0cnVjdGlvbkluZGV4ID0gMFxuICAgIH0gPSBwYXJhbXM7XG4gICAgbGV0IGV0aEFkZHJlc3M7XG4gICAgaWYgKHR5cGVvZiByYXdBZGRyZXNzID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHJhd0FkZHJlc3Muc3RhcnRzV2l0aCgnMHgnKSkge1xuICAgICAgICBldGhBZGRyZXNzID0gQnVmZmVyLmZyb20ocmF3QWRkcmVzcy5zdWJzdHIoMiksICdoZXgnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGV0aEFkZHJlc3MgPSBCdWZmZXIuZnJvbShyYXdBZGRyZXNzLCAnaGV4Jyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGV0aEFkZHJlc3MgPSByYXdBZGRyZXNzO1xuICAgIH1cbiAgICBhc3NlcnQoZXRoQWRkcmVzcy5sZW5ndGggPT09IEVUSEVSRVVNX0FERFJFU1NfQllURVMsIGBBZGRyZXNzIG11c3QgYmUgJHtFVEhFUkVVTV9BRERSRVNTX0JZVEVTfSBieXRlcyBidXQgcmVjZWl2ZWQgJHtldGhBZGRyZXNzLmxlbmd0aH0gYnl0ZXNgKTtcbiAgICBjb25zdCBkYXRhU3RhcnQgPSAxICsgU0lHTkFUVVJFX09GRlNFVFNfU0VSSUFMSVpFRF9TSVpFO1xuICAgIGNvbnN0IGV0aEFkZHJlc3NPZmZzZXQgPSBkYXRhU3RhcnQ7XG4gICAgY29uc3Qgc2lnbmF0dXJlT2Zmc2V0ID0gZGF0YVN0YXJ0ICsgZXRoQWRkcmVzcy5sZW5ndGg7XG4gICAgY29uc3QgbWVzc2FnZURhdGFPZmZzZXQgPSBzaWduYXR1cmVPZmZzZXQgKyBzaWduYXR1cmUubGVuZ3RoICsgMTtcbiAgICBjb25zdCBudW1TaWduYXR1cmVzID0gMTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbkRhdGEgPSBCdWZmZXIuYWxsb2MoU0VDUDI1NksxX0lOU1RSVUNUSU9OX0xBWU9VVC5zcGFuICsgbWVzc2FnZS5sZW5ndGgpO1xuICAgIFNFQ1AyNTZLMV9JTlNUUlVDVElPTl9MQVlPVVQuZW5jb2RlKHtcbiAgICAgIG51bVNpZ25hdHVyZXMsXG4gICAgICBzaWduYXR1cmVPZmZzZXQsXG4gICAgICBzaWduYXR1cmVJbnN0cnVjdGlvbkluZGV4OiBpbnN0cnVjdGlvbkluZGV4LFxuICAgICAgZXRoQWRkcmVzc09mZnNldCxcbiAgICAgIGV0aEFkZHJlc3NJbnN0cnVjdGlvbkluZGV4OiBpbnN0cnVjdGlvbkluZGV4LFxuICAgICAgbWVzc2FnZURhdGFPZmZzZXQsXG4gICAgICBtZXNzYWdlRGF0YVNpemU6IG1lc3NhZ2UubGVuZ3RoLFxuICAgICAgbWVzc2FnZUluc3RydWN0aW9uSW5kZXg6IGluc3RydWN0aW9uSW5kZXgsXG4gICAgICBzaWduYXR1cmU6IHRvQnVmZmVyKHNpZ25hdHVyZSksXG4gICAgICBldGhBZGRyZXNzOiB0b0J1ZmZlcihldGhBZGRyZXNzKSxcbiAgICAgIHJlY292ZXJ5SWRcbiAgICB9LCBpbnN0cnVjdGlvbkRhdGEpO1xuICAgIGluc3RydWN0aW9uRGF0YS5maWxsKHRvQnVmZmVyKG1lc3NhZ2UpLCBTRUNQMjU2SzFfSU5TVFJVQ1RJT05fTEFZT1VULnNwYW4pO1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbih7XG4gICAgICBrZXlzOiBbXSxcbiAgICAgIHByb2dyYW1JZDogU2VjcDI1NmsxUHJvZ3JhbS5wcm9ncmFtSWQsXG4gICAgICBkYXRhOiBpbnN0cnVjdGlvbkRhdGFcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gc2VjcDI1NmsxIGluc3RydWN0aW9uIHdpdGggYSBwcml2YXRlIGtleS4gVGhlIHByaXZhdGUga2V5XG4gICAqIG11c3QgYmUgYSBidWZmZXIgdGhhdCBpcyAzMiBieXRlcyBsb25nLlxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUluc3RydWN0aW9uV2l0aFByaXZhdGVLZXkocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgcHJpdmF0ZUtleTogcGtleSxcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBpbnN0cnVjdGlvbkluZGV4XG4gICAgfSA9IHBhcmFtcztcbiAgICBhc3NlcnQocGtleS5sZW5ndGggPT09IFBSSVZBVEVfS0VZX0JZVEVTLCBgUHJpdmF0ZSBrZXkgbXVzdCBiZSAke1BSSVZBVEVfS0VZX0JZVEVTfSBieXRlcyBidXQgcmVjZWl2ZWQgJHtwa2V5Lmxlbmd0aH0gYnl0ZXNgKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJpdmF0ZUtleSA9IHRvQnVmZmVyKHBrZXkpO1xuICAgICAgY29uc3QgcHVibGljS2V5ID0gcHVibGljS2V5Q3JlYXRlKHByaXZhdGVLZXksIGZhbHNlIC8qIGlzQ29tcHJlc3NlZCAqLykuc2xpY2UoMSk7IC8vIHRocm93IGF3YXkgbGVhZGluZyBieXRlXG4gICAgICBjb25zdCBtZXNzYWdlSGFzaCA9IEJ1ZmZlci5mcm9tKGtlY2Nha18yNTYodG9CdWZmZXIobWVzc2FnZSkpKTtcbiAgICAgIGNvbnN0IFtzaWduYXR1cmUsIHJlY292ZXJ5SWRdID0gZWNkc2FTaWduKG1lc3NhZ2VIYXNoLCBwcml2YXRlS2V5KTtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZUluc3RydWN0aW9uV2l0aFB1YmxpY0tleSh7XG4gICAgICAgIHB1YmxpY0tleSxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgc2lnbmF0dXJlLFxuICAgICAgICByZWNvdmVyeUlkLFxuICAgICAgICBpbnN0cnVjdGlvbkluZGV4XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBjcmVhdGluZyBpbnN0cnVjdGlvbjsgJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbn1cblNlY3AyNTZrMVByb2dyYW0ucHJvZ3JhbUlkID0gbmV3IFB1YmxpY0tleSgnS2VjY2FrU2VjcDI1NmsxMTExMTExMTExMTExMTExMTExMTExMTExMTExMScpO1xuXG52YXIgX0xvY2t1cDtcblxuLyoqXG4gKiBBZGRyZXNzIG9mIHRoZSBzdGFrZSBjb25maWcgYWNjb3VudCB3aGljaCBjb25maWd1cmVzIHRoZSByYXRlXG4gKiBvZiBzdGFrZSB3YXJtdXAgYW5kIGNvb2xkb3duIGFzIHdlbGwgYXMgdGhlIHNsYXNoaW5nIHBlbmFsdHkuXG4gKi9cbmNvbnN0IFNUQUtFX0NPTkZJR19JRCA9IG5ldyBQdWJsaWNLZXkoJ1N0YWtlQ29uZmlnMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcblxuLyoqXG4gKiBTdGFrZSBhY2NvdW50IGF1dGhvcml0eSBpbmZvXG4gKi9cbmNsYXNzIEF1dGhvcml6ZWQge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IEF1dGhvcml6ZWQgb2JqZWN0XG4gICAqIEBwYXJhbSBzdGFrZXIgdGhlIHN0YWtlIGF1dGhvcml0eVxuICAgKiBAcGFyYW0gd2l0aGRyYXdlciB0aGUgd2l0aGRyYXcgYXV0aG9yaXR5XG4gICAqL1xuICBjb25zdHJ1Y3RvcihzdGFrZXIsIHdpdGhkcmF3ZXIpIHtcbiAgICAvKiogc3Rha2UgYXV0aG9yaXR5ICovXG4gICAgdGhpcy5zdGFrZXIgPSB2b2lkIDA7XG4gICAgLyoqIHdpdGhkcmF3IGF1dGhvcml0eSAqL1xuICAgIHRoaXMud2l0aGRyYXdlciA9IHZvaWQgMDtcbiAgICB0aGlzLnN0YWtlciA9IHN0YWtlcjtcbiAgICB0aGlzLndpdGhkcmF3ZXIgPSB3aXRoZHJhd2VyO1xuICB9XG59XG4vKipcbiAqIFN0YWtlIGFjY291bnQgbG9ja3VwIGluZm9cbiAqL1xuY2xhc3MgTG9ja3VwIHtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyBMb2NrdXAgb2JqZWN0XG4gICAqL1xuICBjb25zdHJ1Y3Rvcih1bml4VGltZXN0YW1wLCBlcG9jaCwgY3VzdG9kaWFuKSB7XG4gICAgLyoqIFVuaXggdGltZXN0YW1wIG9mIGxvY2t1cCBleHBpcmF0aW9uICovXG4gICAgdGhpcy51bml4VGltZXN0YW1wID0gdm9pZCAwO1xuICAgIC8qKiBFcG9jaCBvZiBsb2NrdXAgZXhwaXJhdGlvbiAqL1xuICAgIHRoaXMuZXBvY2ggPSB2b2lkIDA7XG4gICAgLyoqIExvY2t1cCBjdXN0b2RpYW4gYXV0aG9yaXR5ICovXG4gICAgdGhpcy5jdXN0b2RpYW4gPSB2b2lkIDA7XG4gICAgdGhpcy51bml4VGltZXN0YW1wID0gdW5peFRpbWVzdGFtcDtcbiAgICB0aGlzLmVwb2NoID0gZXBvY2g7XG4gICAgdGhpcy5jdXN0b2RpYW4gPSBjdXN0b2RpYW47XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCwgaW5hY3RpdmUgTG9ja3VwIHZhbHVlXG4gICAqL1xufVxuX0xvY2t1cCA9IExvY2t1cDtcbkxvY2t1cC5kZWZhdWx0ID0gbmV3IF9Mb2NrdXAoMCwgMCwgUHVibGljS2V5LmRlZmF1bHQpO1xuLyoqXG4gKiBDcmVhdGUgc3Rha2UgYWNjb3VudCB0cmFuc2FjdGlvbiBwYXJhbXNcbiAqL1xuLyoqXG4gKiBDcmVhdGUgc3Rha2UgYWNjb3VudCB3aXRoIHNlZWQgdHJhbnNhY3Rpb24gcGFyYW1zXG4gKi9cbi8qKlxuICogSW5pdGlhbGl6ZSBzdGFrZSBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqL1xuLyoqXG4gKiBEZWxlZ2F0ZSBzdGFrZSBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqL1xuLyoqXG4gKiBBdXRob3JpemUgc3Rha2UgaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gKi9cbi8qKlxuICogQXV0aG9yaXplIHN0YWtlIGluc3RydWN0aW9uIHBhcmFtcyB1c2luZyBhIGRlcml2ZWQga2V5XG4gKi9cbi8qKlxuICogU3BsaXQgc3Rha2UgaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gKi9cbi8qKlxuICogU3BsaXQgd2l0aCBzZWVkIHRyYW5zYWN0aW9uIHBhcmFtc1xuICovXG4vKipcbiAqIFdpdGhkcmF3IHN0YWtlIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG4vKipcbiAqIERlYWN0aXZhdGUgc3Rha2UgaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gKi9cbi8qKlxuICogTWVyZ2Ugc3Rha2UgaW5zdHJ1Y3Rpb24gcGFyYW1zXG4gKi9cbi8qKlxuICogU3Rha2UgSW5zdHJ1Y3Rpb24gY2xhc3NcbiAqL1xuY2xhc3MgU3Rha2VJbnN0cnVjdGlvbiB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogRGVjb2RlIGEgc3Rha2UgaW5zdHJ1Y3Rpb24gYW5kIHJldHJpZXZlIHRoZSBpbnN0cnVjdGlvbiB0eXBlLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZUluc3RydWN0aW9uVHlwZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICBjb25zdCBpbnN0cnVjdGlvblR5cGVMYXlvdXQgPSBCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpO1xuICAgIGNvbnN0IHR5cGVJbmRleCA9IGluc3RydWN0aW9uVHlwZUxheW91dC5kZWNvZGUoaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgbGV0IHR5cGU7XG4gICAgZm9yIChjb25zdCBbaXhUeXBlLCBsYXlvdXRdIG9mIE9iamVjdC5lbnRyaWVzKFNUQUtFX0lOU1RSVUNUSU9OX0xBWU9VVFMpKSB7XG4gICAgICBpZiAobGF5b3V0LmluZGV4ID09IHR5cGVJbmRleCkge1xuICAgICAgICB0eXBlID0gaXhUeXBlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luc3RydWN0aW9uIHR5cGUgaW5jb3JyZWN0OyBub3QgYSBTdGFrZUluc3RydWN0aW9uJyk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIGluaXRpYWxpemUgc3Rha2UgaW5zdHJ1Y3Rpb24gYW5kIHJldHJpZXZlIHRoZSBpbnN0cnVjdGlvbiBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlSW5pdGlhbGl6ZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDIpO1xuICAgIGNvbnN0IHtcbiAgICAgIGF1dGhvcml6ZWQsXG4gICAgICBsb2NrdXBcbiAgICB9ID0gZGVjb2RlRGF0YSQxKFNUQUtFX0lOU1RSVUNUSU9OX0xBWU9VVFMuSW5pdGlhbGl6ZSwgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YWtlUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzBdLnB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWQ6IG5ldyBBdXRob3JpemVkKG5ldyBQdWJsaWNLZXkoYXV0aG9yaXplZC5zdGFrZXIpLCBuZXcgUHVibGljS2V5KGF1dGhvcml6ZWQud2l0aGRyYXdlcikpLFxuICAgICAgbG9ja3VwOiBuZXcgTG9ja3VwKGxvY2t1cC51bml4VGltZXN0YW1wLCBsb2NrdXAuZXBvY2gsIG5ldyBQdWJsaWNLZXkobG9ja3VwLmN1c3RvZGlhbikpXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgYSBkZWxlZ2F0ZSBzdGFrZSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVEZWxlZ2F0ZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDYpO1xuICAgIGRlY29kZURhdGEkMShTVEFLRV9JTlNUUlVDVElPTl9MQVlPVVRTLkRlbGVnYXRlLCBpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3Rha2VQdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgdm90ZVB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1sxXS5wdWJrZXksXG4gICAgICBhdXRob3JpemVkUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzVdLnB1YmtleVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGFuIGF1dGhvcml6ZSBzdGFrZSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVBdXRob3JpemUoaW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmNoZWNrUHJvZ3JhbUlkKGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgdGhpcy5jaGVja0tleUxlbmd0aChpbnN0cnVjdGlvbi5rZXlzLCAzKTtcbiAgICBjb25zdCB7XG4gICAgICBuZXdBdXRob3JpemVkLFxuICAgICAgc3Rha2VBdXRob3JpemF0aW9uVHlwZVxuICAgIH0gPSBkZWNvZGVEYXRhJDEoU1RBS0VfSU5TVFJVQ1RJT05fTEFZT1VUUy5BdXRob3JpemUsIGluc3RydWN0aW9uLmRhdGEpO1xuICAgIGNvbnN0IG8gPSB7XG4gICAgICBzdGFrZVB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXksXG4gICAgICBhdXRob3JpemVkUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzJdLnB1YmtleSxcbiAgICAgIG5ld0F1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkobmV3QXV0aG9yaXplZCksXG4gICAgICBzdGFrZUF1dGhvcml6YXRpb25UeXBlOiB7XG4gICAgICAgIGluZGV4OiBzdGFrZUF1dGhvcml6YXRpb25UeXBlXG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoaW5zdHJ1Y3Rpb24ua2V5cy5sZW5ndGggPiAzKSB7XG4gICAgICBvLmN1c3RvZGlhblB1YmtleSA9IGluc3RydWN0aW9uLmtleXNbM10ucHVia2V5O1xuICAgIH1cbiAgICByZXR1cm4gbztcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgYW4gYXV0aG9yaXplLXdpdGgtc2VlZCBzdGFrZSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVBdXRob3JpemVXaXRoU2VlZChpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDIpO1xuICAgIGNvbnN0IHtcbiAgICAgIG5ld0F1dGhvcml6ZWQsXG4gICAgICBzdGFrZUF1dGhvcml6YXRpb25UeXBlLFxuICAgICAgYXV0aG9yaXR5U2VlZCxcbiAgICAgIGF1dGhvcml0eU93bmVyXG4gICAgfSA9IGRlY29kZURhdGEkMShTVEFLRV9JTlNUUlVDVElPTl9MQVlPVVRTLkF1dGhvcml6ZVdpdGhTZWVkLCBpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICBjb25zdCBvID0ge1xuICAgICAgc3Rha2VQdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMF0ucHVia2V5LFxuICAgICAgYXV0aG9yaXR5QmFzZTogaW5zdHJ1Y3Rpb24ua2V5c1sxXS5wdWJrZXksXG4gICAgICBhdXRob3JpdHlTZWVkOiBhdXRob3JpdHlTZWVkLFxuICAgICAgYXV0aG9yaXR5T3duZXI6IG5ldyBQdWJsaWNLZXkoYXV0aG9yaXR5T3duZXIpLFxuICAgICAgbmV3QXV0aG9yaXplZFB1YmtleTogbmV3IFB1YmxpY0tleShuZXdBdXRob3JpemVkKSxcbiAgICAgIHN0YWtlQXV0aG9yaXphdGlvblR5cGU6IHtcbiAgICAgICAgaW5kZXg6IHN0YWtlQXV0aG9yaXphdGlvblR5cGVcbiAgICAgIH1cbiAgICB9O1xuICAgIGlmIChpbnN0cnVjdGlvbi5rZXlzLmxlbmd0aCA+IDMpIHtcbiAgICAgIG8uY3VzdG9kaWFuUHVia2V5ID0gaW5zdHJ1Y3Rpb24ua2V5c1szXS5wdWJrZXk7XG4gICAgfVxuICAgIHJldHVybiBvO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIHNwbGl0IHN0YWtlIGluc3RydWN0aW9uIGFuZCByZXRyaWV2ZSB0aGUgaW5zdHJ1Y3Rpb24gcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZVNwbGl0KGluc3RydWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja1Byb2dyYW1JZChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgIHRoaXMuY2hlY2tLZXlMZW5ndGgoaW5zdHJ1Y3Rpb24ua2V5cywgMyk7XG4gICAgY29uc3Qge1xuICAgICAgbGFtcG9ydHNcbiAgICB9ID0gZGVjb2RlRGF0YSQxKFNUQUtFX0lOU1RSVUNUSU9OX0xBWU9VVFMuU3BsaXQsIGluc3RydWN0aW9uLmRhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGFrZVB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXksXG4gICAgICBzcGxpdFN0YWtlUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzFdLnB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRQdWJrZXk6IGluc3RydWN0aW9uLmtleXNbMl0ucHVia2V5LFxuICAgICAgbGFtcG9ydHNcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIG1lcmdlIHN0YWtlIGluc3RydWN0aW9uIGFuZCByZXRyaWV2ZSB0aGUgaW5zdHJ1Y3Rpb24gcGFyYW1zLlxuICAgKi9cbiAgc3RhdGljIGRlY29kZU1lcmdlKGluc3RydWN0aW9uKSB7XG4gICAgdGhpcy5jaGVja1Byb2dyYW1JZChpbnN0cnVjdGlvbi5wcm9ncmFtSWQpO1xuICAgIHRoaXMuY2hlY2tLZXlMZW5ndGgoaW5zdHJ1Y3Rpb24ua2V5cywgMyk7XG4gICAgZGVjb2RlRGF0YSQxKFNUQUtFX0lOU1RSVUNUSU9OX0xBWU9VVFMuTWVyZ2UsIGluc3RydWN0aW9uLmRhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGFrZVB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXksXG4gICAgICBzb3VyY2VTdGFrZVB1YktleTogaW5zdHJ1Y3Rpb24ua2V5c1sxXS5wdWJrZXksXG4gICAgICBhdXRob3JpemVkUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzRdLnB1YmtleVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGEgd2l0aGRyYXcgc3Rha2UgaW5zdHJ1Y3Rpb24gYW5kIHJldHJpZXZlIHRoZSBpbnN0cnVjdGlvbiBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlV2l0aGRyYXcoaW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmNoZWNrUHJvZ3JhbUlkKGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgdGhpcy5jaGVja0tleUxlbmd0aChpbnN0cnVjdGlvbi5rZXlzLCA1KTtcbiAgICBjb25zdCB7XG4gICAgICBsYW1wb3J0c1xuICAgIH0gPSBkZWNvZGVEYXRhJDEoU1RBS0VfSU5TVFJVQ1RJT05fTEFZT1VUUy5XaXRoZHJhdywgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgY29uc3QgbyA9IHtcbiAgICAgIHN0YWtlUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzBdLnB1YmtleSxcbiAgICAgIHRvUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzFdLnB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRQdWJrZXk6IGluc3RydWN0aW9uLmtleXNbNF0ucHVia2V5LFxuICAgICAgbGFtcG9ydHNcbiAgICB9O1xuICAgIGlmIChpbnN0cnVjdGlvbi5rZXlzLmxlbmd0aCA+IDUpIHtcbiAgICAgIG8uY3VzdG9kaWFuUHVia2V5ID0gaW5zdHJ1Y3Rpb24ua2V5c1s1XS5wdWJrZXk7XG4gICAgfVxuICAgIHJldHVybiBvO1xuICB9XG5cbiAgLyoqXG4gICAqIERlY29kZSBhIGRlYWN0aXZhdGUgc3Rha2UgaW5zdHJ1Y3Rpb24gYW5kIHJldHJpZXZlIHRoZSBpbnN0cnVjdGlvbiBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlRGVhY3RpdmF0ZShpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDMpO1xuICAgIGRlY29kZURhdGEkMShTVEFLRV9JTlNUUlVDVElPTl9MQVlPVVRTLkRlYWN0aXZhdGUsIGluc3RydWN0aW9uLmRhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICBzdGFrZVB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXksXG4gICAgICBhdXRob3JpemVkUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzJdLnB1YmtleVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgY2hlY2tQcm9ncmFtSWQocHJvZ3JhbUlkKSB7XG4gICAgaWYgKCFwcm9ncmFtSWQuZXF1YWxzKFN0YWtlUHJvZ3JhbS5wcm9ncmFtSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5zdHJ1Y3Rpb247IHByb2dyYW1JZCBpcyBub3QgU3Rha2VQcm9ncmFtJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3RhdGljIGNoZWNrS2V5TGVuZ3RoKGtleXMsIGV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgaWYgKGtleXMubGVuZ3RoIDwgZXhwZWN0ZWRMZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgaW52YWxpZCBpbnN0cnVjdGlvbjsgZm91bmQgJHtrZXlzLmxlbmd0aH0ga2V5cywgZXhwZWN0ZWQgYXQgbGVhc3QgJHtleHBlY3RlZExlbmd0aH1gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBlbnVtZXJhdGlvbiBvZiB2YWxpZCBTdGFrZUluc3RydWN0aW9uVHlwZSdzXG4gKi9cblxuLyoqXG4gKiBBbiBlbnVtZXJhdGlvbiBvZiB2YWxpZCBzdGFrZSBJbnN0cnVjdGlvblR5cGUnc1xuICogQGludGVybmFsXG4gKi9cbmNvbnN0IFNUQUtFX0lOU1RSVUNUSU9OX0xBWU9VVFMgPSBPYmplY3QuZnJlZXplKHtcbiAgSW5pdGlhbGl6ZToge1xuICAgIGluZGV4OiAwLFxuICAgIGxheW91dDogQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnUzMignaW5zdHJ1Y3Rpb24nKSwgYXV0aG9yaXplZCgpLCBsb2NrdXAoKV0pXG4gIH0sXG4gIEF1dGhvcml6ZToge1xuICAgIGluZGV4OiAxLFxuICAgIGxheW91dDogQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnUzMignaW5zdHJ1Y3Rpb24nKSwgcHVibGljS2V5KCduZXdBdXRob3JpemVkJyksIEJ1ZmZlckxheW91dC51MzIoJ3N0YWtlQXV0aG9yaXphdGlvblR5cGUnKV0pXG4gIH0sXG4gIERlbGVnYXRlOiB7XG4gICAgaW5kZXg6IDIsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpXSlcbiAgfSxcbiAgU3BsaXQ6IHtcbiAgICBpbmRleDogMyxcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyksIEJ1ZmZlckxheW91dC5uczY0KCdsYW1wb3J0cycpXSlcbiAgfSxcbiAgV2l0aGRyYXc6IHtcbiAgICBpbmRleDogNCxcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyksIEJ1ZmZlckxheW91dC5uczY0KCdsYW1wb3J0cycpXSlcbiAgfSxcbiAgRGVhY3RpdmF0ZToge1xuICAgIGluZGV4OiA1LFxuICAgIGxheW91dDogQnVmZmVyTGF5b3V0LnN0cnVjdChbQnVmZmVyTGF5b3V0LnUzMignaW5zdHJ1Y3Rpb24nKV0pXG4gIH0sXG4gIE1lcmdlOiB7XG4gICAgaW5kZXg6IDcsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpXSlcbiAgfSxcbiAgQXV0aG9yaXplV2l0aFNlZWQ6IHtcbiAgICBpbmRleDogOCxcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyksIHB1YmxpY0tleSgnbmV3QXV0aG9yaXplZCcpLCBCdWZmZXJMYXlvdXQudTMyKCdzdGFrZUF1dGhvcml6YXRpb25UeXBlJyksIHJ1c3RTdHJpbmcoJ2F1dGhvcml0eVNlZWQnKSwgcHVibGljS2V5KCdhdXRob3JpdHlPd25lcicpXSlcbiAgfVxufSk7XG5cbi8qKlxuICogU3Rha2UgYXV0aG9yaXphdGlvbiB0eXBlXG4gKi9cblxuLyoqXG4gKiBBbiBlbnVtZXJhdGlvbiBvZiB2YWxpZCBTdGFrZUF1dGhvcml6YXRpb25MYXlvdXQnc1xuICovXG5jb25zdCBTdGFrZUF1dGhvcml6YXRpb25MYXlvdXQgPSBPYmplY3QuZnJlZXplKHtcbiAgU3Rha2VyOiB7XG4gICAgaW5kZXg6IDBcbiAgfSxcbiAgV2l0aGRyYXdlcjoge1xuICAgIGluZGV4OiAxXG4gIH1cbn0pO1xuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIHRyYW5zYWN0aW9ucyB0byBpbnRlcmFjdCB3aXRoIHRoZSBTdGFrZSBwcm9ncmFtXG4gKi9cbmNsYXNzIFN0YWtlUHJvZ3JhbSB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogUHVibGljIGtleSB0aGF0IGlkZW50aWZpZXMgdGhlIFN0YWtlIHByb2dyYW1cbiAgICovXG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFuIEluaXRpYWxpemUgaW5zdHJ1Y3Rpb24gdG8gYWRkIHRvIGEgU3Rha2UgQ3JlYXRlIHRyYW5zYWN0aW9uXG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZShwYXJhbXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdGFrZVB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWQsXG4gICAgICBsb2NrdXA6IG1heWJlTG9ja3VwXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCBsb2NrdXAgPSBtYXliZUxvY2t1cCB8fCBMb2NrdXAuZGVmYXVsdDtcbiAgICBjb25zdCB0eXBlID0gU1RBS0VfSU5TVFJVQ1RJT05fTEFZT1VUUy5Jbml0aWFsaXplO1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVEYXRhKHR5cGUsIHtcbiAgICAgIGF1dGhvcml6ZWQ6IHtcbiAgICAgICAgc3Rha2VyOiB0b0J1ZmZlcihhdXRob3JpemVkLnN0YWtlci50b0J1ZmZlcigpKSxcbiAgICAgICAgd2l0aGRyYXdlcjogdG9CdWZmZXIoYXV0aG9yaXplZC53aXRoZHJhd2VyLnRvQnVmZmVyKCkpXG4gICAgICB9LFxuICAgICAgbG9ja3VwOiB7XG4gICAgICAgIHVuaXhUaW1lc3RhbXA6IGxvY2t1cC51bml4VGltZXN0YW1wLFxuICAgICAgICBlcG9jaDogbG9ja3VwLmVwb2NoLFxuICAgICAgICBjdXN0b2RpYW46IHRvQnVmZmVyKGxvY2t1cC5jdXN0b2RpYW4udG9CdWZmZXIoKSlcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBpbnN0cnVjdGlvbkRhdGEgPSB7XG4gICAgICBrZXlzOiBbe1xuICAgICAgICBwdWJrZXk6IHN0YWtlUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgcHVia2V5OiBTWVNWQVJfUkVOVF9QVUJLRVksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICAgIH1dLFxuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZCxcbiAgICAgIGRhdGFcbiAgICB9O1xuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb25JbnN0cnVjdGlvbihpbnN0cnVjdGlvbkRhdGEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgVHJhbnNhY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IFN0YWtlIGFjY291bnQgYXRcbiAgICogICBhbiBhZGRyZXNzIGdlbmVyYXRlZCB3aXRoIGBmcm9tYCwgYSBzZWVkLCBhbmQgdGhlIFN0YWtlIHByb2dyYW1JZFxuICAgKi9cbiAgc3RhdGljIGNyZWF0ZUFjY291bnRXaXRoU2VlZChwYXJhbXMpIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIHRyYW5zYWN0aW9uLmFkZChTeXN0ZW1Qcm9ncmFtLmNyZWF0ZUFjY291bnRXaXRoU2VlZCh7XG4gICAgICBmcm9tUHVia2V5OiBwYXJhbXMuZnJvbVB1YmtleSxcbiAgICAgIG5ld0FjY291bnRQdWJrZXk6IHBhcmFtcy5zdGFrZVB1YmtleSxcbiAgICAgIGJhc2VQdWJrZXk6IHBhcmFtcy5iYXNlUHVia2V5LFxuICAgICAgc2VlZDogcGFyYW1zLnNlZWQsXG4gICAgICBsYW1wb3J0czogcGFyYW1zLmxhbXBvcnRzLFxuICAgICAgc3BhY2U6IHRoaXMuc3BhY2UsXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkXG4gICAgfSkpO1xuICAgIGNvbnN0IHtcbiAgICAgIHN0YWtlUHVia2V5LFxuICAgICAgYXV0aG9yaXplZCxcbiAgICAgIGxvY2t1cFxuICAgIH0gPSBwYXJhbXM7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLmFkZCh0aGlzLmluaXRpYWxpemUoe1xuICAgICAgc3Rha2VQdWJrZXksXG4gICAgICBhdXRob3JpemVkLFxuICAgICAgbG9ja3VwXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgVHJhbnNhY3Rpb24gdGhhdCBjcmVhdGVzIGEgbmV3IFN0YWtlIGFjY291bnRcbiAgICovXG4gIHN0YXRpYyBjcmVhdGVBY2NvdW50KHBhcmFtcykge1xuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uKCk7XG4gICAgdHJhbnNhY3Rpb24uYWRkKFN5c3RlbVByb2dyYW0uY3JlYXRlQWNjb3VudCh7XG4gICAgICBmcm9tUHVia2V5OiBwYXJhbXMuZnJvbVB1YmtleSxcbiAgICAgIG5ld0FjY291bnRQdWJrZXk6IHBhcmFtcy5zdGFrZVB1YmtleSxcbiAgICAgIGxhbXBvcnRzOiBwYXJhbXMubGFtcG9ydHMsXG4gICAgICBzcGFjZTogdGhpcy5zcGFjZSxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWRcbiAgICB9KSk7XG4gICAgY29uc3Qge1xuICAgICAgc3Rha2VQdWJrZXksXG4gICAgICBhdXRob3JpemVkLFxuICAgICAgbG9ja3VwXG4gICAgfSA9IHBhcmFtcztcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24uYWRkKHRoaXMuaW5pdGlhbGl6ZSh7XG4gICAgICBzdGFrZVB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWQsXG4gICAgICBsb2NrdXBcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBUcmFuc2FjdGlvbiB0aGF0IGRlbGVnYXRlcyBTdGFrZSB0b2tlbnMgdG8gYSB2YWxpZGF0b3JcbiAgICogVm90ZSBQdWJsaWNLZXkuIFRoaXMgdHJhbnNhY3Rpb24gY2FuIGFsc28gYmUgdXNlZCB0byByZWRlbGVnYXRlIFN0YWtlXG4gICAqIHRvIGEgbmV3IHZhbGlkYXRvciBWb3RlIFB1YmxpY0tleS5cbiAgICovXG4gIHN0YXRpYyBkZWxlZ2F0ZShwYXJhbXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdGFrZVB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRQdWJrZXksXG4gICAgICB2b3RlUHVia2V5XG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0eXBlID0gU1RBS0VfSU5TVFJVQ1RJT05fTEFZT1VUUy5EZWxlZ2F0ZTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKHtcbiAgICAgIGtleXM6IFt7XG4gICAgICAgIHB1YmtleTogc3Rha2VQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IHZvdGVQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgcHVia2V5OiBTWVNWQVJfQ0xPQ0tfUFVCS0VZLFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogU1lTVkFSX1NUQUtFX0hJU1RPUllfUFVCS0VZLFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogU1RBS0VfQ09ORklHX0lELFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogYXV0aG9yaXplZFB1YmtleSxcbiAgICAgICAgaXNTaWduZXI6IHRydWUsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9XSxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBUcmFuc2FjdGlvbiB0aGF0IGF1dGhvcml6ZXMgYSBuZXcgUHVibGljS2V5IGFzIFN0YWtlclxuICAgKiBvciBXaXRoZHJhd2VyIG9uIHRoZSBTdGFrZSBhY2NvdW50LlxuICAgKi9cbiAgc3RhdGljIGF1dGhvcml6ZShwYXJhbXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdGFrZVB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRQdWJrZXksXG4gICAgICBuZXdBdXRob3JpemVkUHVia2V5LFxuICAgICAgc3Rha2VBdXRob3JpemF0aW9uVHlwZSxcbiAgICAgIGN1c3RvZGlhblB1YmtleVxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHlwZSA9IFNUQUtFX0lOU1RSVUNUSU9OX0xBWU9VVFMuQXV0aG9yaXplO1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVEYXRhKHR5cGUsIHtcbiAgICAgIG5ld0F1dGhvcml6ZWQ6IHRvQnVmZmVyKG5ld0F1dGhvcml6ZWRQdWJrZXkudG9CdWZmZXIoKSksXG4gICAgICBzdGFrZUF1dGhvcml6YXRpb25UeXBlOiBzdGFrZUF1dGhvcml6YXRpb25UeXBlLmluZGV4XG4gICAgfSk7XG4gICAgY29uc3Qga2V5cyA9IFt7XG4gICAgICBwdWJrZXk6IHN0YWtlUHVia2V5LFxuICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgIH0sIHtcbiAgICAgIHB1YmtleTogU1lTVkFSX0NMT0NLX1BVQktFWSxcbiAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICB9LCB7XG4gICAgICBwdWJrZXk6IGF1dGhvcml6ZWRQdWJrZXksXG4gICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgfV07XG4gICAgaWYgKGN1c3RvZGlhblB1YmtleSkge1xuICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgcHVia2V5OiBjdXN0b2RpYW5QdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoe1xuICAgICAga2V5cyxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBUcmFuc2FjdGlvbiB0aGF0IGF1dGhvcml6ZXMgYSBuZXcgUHVibGljS2V5IGFzIFN0YWtlclxuICAgKiBvciBXaXRoZHJhd2VyIG9uIHRoZSBTdGFrZSBhY2NvdW50LlxuICAgKi9cbiAgc3RhdGljIGF1dGhvcml6ZVdpdGhTZWVkKHBhcmFtcykge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0YWtlUHVia2V5LFxuICAgICAgYXV0aG9yaXR5QmFzZSxcbiAgICAgIGF1dGhvcml0eVNlZWQsXG4gICAgICBhdXRob3JpdHlPd25lcixcbiAgICAgIG5ld0F1dGhvcml6ZWRQdWJrZXksXG4gICAgICBzdGFrZUF1dGhvcml6YXRpb25UeXBlLFxuICAgICAgY3VzdG9kaWFuUHVia2V5XG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0eXBlID0gU1RBS0VfSU5TVFJVQ1RJT05fTEFZT1VUUy5BdXRob3JpemVXaXRoU2VlZDtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICBuZXdBdXRob3JpemVkOiB0b0J1ZmZlcihuZXdBdXRob3JpemVkUHVia2V5LnRvQnVmZmVyKCkpLFxuICAgICAgc3Rha2VBdXRob3JpemF0aW9uVHlwZTogc3Rha2VBdXRob3JpemF0aW9uVHlwZS5pbmRleCxcbiAgICAgIGF1dGhvcml0eVNlZWQ6IGF1dGhvcml0eVNlZWQsXG4gICAgICBhdXRob3JpdHlPd25lcjogdG9CdWZmZXIoYXV0aG9yaXR5T3duZXIudG9CdWZmZXIoKSlcbiAgICB9KTtcbiAgICBjb25zdCBrZXlzID0gW3tcbiAgICAgIHB1YmtleTogc3Rha2VQdWJrZXksXG4gICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgfSwge1xuICAgICAgcHVia2V5OiBhdXRob3JpdHlCYXNlLFxuICAgICAgaXNTaWduZXI6IHRydWUsXG4gICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgIH0sIHtcbiAgICAgIHB1YmtleTogU1lTVkFSX0NMT0NLX1BVQktFWSxcbiAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgfV07XG4gICAgaWYgKGN1c3RvZGlhblB1YmtleSkge1xuICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgcHVia2V5OiBjdXN0b2RpYW5QdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoe1xuICAgICAga2V5cyxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgc3BsaXRJbnN0cnVjdGlvbihwYXJhbXMpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdGFrZVB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRQdWJrZXksXG4gICAgICBzcGxpdFN0YWtlUHVia2V5LFxuICAgICAgbGFtcG9ydHNcbiAgICB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHR5cGUgPSBTVEFLRV9JTlNUUlVDVElPTl9MQVlPVVRTLlNwbGl0O1xuICAgIGNvbnN0IGRhdGEgPSBlbmNvZGVEYXRhKHR5cGUsIHtcbiAgICAgIGxhbXBvcnRzXG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkluc3RydWN0aW9uKHtcbiAgICAgIGtleXM6IFt7XG4gICAgICAgIHB1YmtleTogc3Rha2VQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IHNwbGl0U3Rha2VQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IGF1dGhvcml6ZWRQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfV0sXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgVHJhbnNhY3Rpb24gdGhhdCBzcGxpdHMgU3Rha2UgdG9rZW5zIGludG8gYW5vdGhlciBzdGFrZSBhY2NvdW50XG4gICAqL1xuICBzdGF0aWMgc3BsaXQocGFyYW1zLFxuICAvLyBDb21wdXRlIHRoZSBjb3N0IG9mIGFsbG9jYXRpbmcgdGhlIG5ldyBzdGFrZSBhY2NvdW50IGluIGxhbXBvcnRzXG4gIHJlbnRFeGVtcHRSZXNlcnZlKSB7XG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oKTtcbiAgICB0cmFuc2FjdGlvbi5hZGQoU3lzdGVtUHJvZ3JhbS5jcmVhdGVBY2NvdW50KHtcbiAgICAgIGZyb21QdWJrZXk6IHBhcmFtcy5hdXRob3JpemVkUHVia2V5LFxuICAgICAgbmV3QWNjb3VudFB1YmtleTogcGFyYW1zLnNwbGl0U3Rha2VQdWJrZXksXG4gICAgICBsYW1wb3J0czogcmVudEV4ZW1wdFJlc2VydmUsXG4gICAgICBzcGFjZTogdGhpcy5zcGFjZSxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWRcbiAgICB9KSk7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLmFkZCh0aGlzLnNwbGl0SW5zdHJ1Y3Rpb24ocGFyYW1zKSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBUcmFuc2FjdGlvbiB0aGF0IHNwbGl0cyBTdGFrZSB0b2tlbnMgaW50byBhbm90aGVyIGFjY291bnRcbiAgICogZGVyaXZlZCBmcm9tIGEgYmFzZSBwdWJsaWMga2V5IGFuZCBzZWVkXG4gICAqL1xuICBzdGF0aWMgc3BsaXRXaXRoU2VlZChwYXJhbXMsXG4gIC8vIElmIHRoaXMgc3Rha2UgYWNjb3VudCBpcyBuZXcsIGNvbXB1dGUgdGhlIGNvc3Qgb2YgYWxsb2NhdGluZyBpdCBpbiBsYW1wb3J0c1xuICByZW50RXhlbXB0UmVzZXJ2ZSkge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0YWtlUHVia2V5LFxuICAgICAgYXV0aG9yaXplZFB1YmtleSxcbiAgICAgIHNwbGl0U3Rha2VQdWJrZXksXG4gICAgICBiYXNlUHVia2V5LFxuICAgICAgc2VlZCxcbiAgICAgIGxhbXBvcnRzXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIHRyYW5zYWN0aW9uLmFkZChTeXN0ZW1Qcm9ncmFtLmFsbG9jYXRlKHtcbiAgICAgIGFjY291bnRQdWJrZXk6IHNwbGl0U3Rha2VQdWJrZXksXG4gICAgICBiYXNlUHVia2V5LFxuICAgICAgc2VlZCxcbiAgICAgIHNwYWNlOiB0aGlzLnNwYWNlLFxuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZFxuICAgIH0pKTtcbiAgICBpZiAocmVudEV4ZW1wdFJlc2VydmUgJiYgcmVudEV4ZW1wdFJlc2VydmUgPiAwKSB7XG4gICAgICB0cmFuc2FjdGlvbi5hZGQoU3lzdGVtUHJvZ3JhbS50cmFuc2Zlcih7XG4gICAgICAgIGZyb21QdWJrZXk6IHBhcmFtcy5hdXRob3JpemVkUHVia2V5LFxuICAgICAgICB0b1B1YmtleTogc3BsaXRTdGFrZVB1YmtleSxcbiAgICAgICAgbGFtcG9ydHM6IHJlbnRFeGVtcHRSZXNlcnZlXG4gICAgICB9KSk7XG4gICAgfVxuICAgIHJldHVybiB0cmFuc2FjdGlvbi5hZGQodGhpcy5zcGxpdEluc3RydWN0aW9uKHtcbiAgICAgIHN0YWtlUHVia2V5LFxuICAgICAgYXV0aG9yaXplZFB1YmtleSxcbiAgICAgIHNwbGl0U3Rha2VQdWJrZXksXG4gICAgICBsYW1wb3J0c1xuICAgIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIFRyYW5zYWN0aW9uIHRoYXQgbWVyZ2VzIFN0YWtlIGFjY291bnRzLlxuICAgKi9cbiAgc3RhdGljIG1lcmdlKHBhcmFtcykge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0YWtlUHVia2V5LFxuICAgICAgc291cmNlU3Rha2VQdWJLZXksXG4gICAgICBhdXRob3JpemVkUHVia2V5XG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0eXBlID0gU1RBS0VfSU5TVFJVQ1RJT05fTEFZT1VUUy5NZXJnZTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKHtcbiAgICAgIGtleXM6IFt7XG4gICAgICAgIHB1YmtleTogc3Rha2VQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IHNvdXJjZVN0YWtlUHViS2V5LFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgcHVia2V5OiBTWVNWQVJfQ0xPQ0tfUFVCS0VZLFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogU1lTVkFSX1NUQUtFX0hJU1RPUllfUFVCS0VZLFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogYXV0aG9yaXplZFB1YmtleSxcbiAgICAgICAgaXNTaWduZXI6IHRydWUsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9XSxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBUcmFuc2FjdGlvbiB0aGF0IHdpdGhkcmF3cyBkZWFjdGl2YXRlZCBTdGFrZSB0b2tlbnMuXG4gICAqL1xuICBzdGF0aWMgd2l0aGRyYXcocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgc3Rha2VQdWJrZXksXG4gICAgICBhdXRob3JpemVkUHVia2V5LFxuICAgICAgdG9QdWJrZXksXG4gICAgICBsYW1wb3J0cyxcbiAgICAgIGN1c3RvZGlhblB1YmtleVxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHlwZSA9IFNUQUtFX0lOU1RSVUNUSU9OX0xBWU9VVFMuV2l0aGRyYXc7XG4gICAgY29uc3QgZGF0YSA9IGVuY29kZURhdGEodHlwZSwge1xuICAgICAgbGFtcG9ydHNcbiAgICB9KTtcbiAgICBjb25zdCBrZXlzID0gW3tcbiAgICAgIHB1YmtleTogc3Rha2VQdWJrZXksXG4gICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgfSwge1xuICAgICAgcHVia2V5OiB0b1B1YmtleSxcbiAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICB9LCB7XG4gICAgICBwdWJrZXk6IFNZU1ZBUl9DTE9DS19QVUJLRVksXG4gICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgIH0sIHtcbiAgICAgIHB1YmtleTogU1lTVkFSX1NUQUtFX0hJU1RPUllfUFVCS0VZLFxuICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICB9LCB7XG4gICAgICBwdWJrZXk6IGF1dGhvcml6ZWRQdWJrZXksXG4gICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgfV07XG4gICAgaWYgKGN1c3RvZGlhblB1YmtleSkge1xuICAgICAga2V5cy5wdXNoKHtcbiAgICAgICAgcHVia2V5OiBjdXN0b2RpYW5QdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVHJhbnNhY3Rpb24oKS5hZGQoe1xuICAgICAga2V5cyxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBkYXRhXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgYSBUcmFuc2FjdGlvbiB0aGF0IGRlYWN0aXZhdGVzIFN0YWtlIHRva2Vucy5cbiAgICovXG4gIHN0YXRpYyBkZWFjdGl2YXRlKHBhcmFtcykge1xuICAgIGNvbnN0IHtcbiAgICAgIHN0YWtlUHVia2V5LFxuICAgICAgYXV0aG9yaXplZFB1YmtleVxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHlwZSA9IFNUQUtFX0lOU1RSVUNUSU9OX0xBWU9VVFMuRGVhY3RpdmF0ZTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlKTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKHtcbiAgICAgIGtleXM6IFt7XG4gICAgICAgIHB1YmtleTogc3Rha2VQdWJrZXksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgICAgfSwge1xuICAgICAgICBwdWJrZXk6IFNZU1ZBUl9DTE9DS19QVUJLRVksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgcHVia2V5OiBhdXRob3JpemVkUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICAgIH1dLFxuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZCxcbiAgICAgIGRhdGFcbiAgICB9KTtcbiAgfVxufVxuU3Rha2VQcm9ncmFtLnByb2dyYW1JZCA9IG5ldyBQdWJsaWNLZXkoJ1N0YWtlMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEnKTtcbi8qKlxuICogTWF4IHNwYWNlIG9mIGEgU3Rha2UgYWNjb3VudFxuICpcbiAqIFRoaXMgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHNvbGFuYS1zdGFrZS1wcm9ncmFtIFN0YWtlU3RhdGUgc3RydWN0IGFzXG4gKiBgU3Rha2VTdGF0ZVYyOjpzaXplX29mKClgOlxuICogaHR0cHM6Ly9kb2NzLnJzL3NvbGFuYS1zdGFrZS1wcm9ncmFtL2xhdGVzdC9zb2xhbmFfc3Rha2VfcHJvZ3JhbS9zdGFrZV9zdGF0ZS9lbnVtLlN0YWtlU3RhdGVWMi5odG1sXG4gKi9cblN0YWtlUHJvZ3JhbS5zcGFjZSA9IDIwMDtcblxuLyoqXG4gKiBWb3RlIGFjY291bnQgaW5mb1xuICovXG5jbGFzcyBWb3RlSW5pdCB7XG4gIC8qKiBbMCwgMTAwXSAqL1xuXG4gIGNvbnN0cnVjdG9yKG5vZGVQdWJrZXksIGF1dGhvcml6ZWRWb3RlciwgYXV0aG9yaXplZFdpdGhkcmF3ZXIsIGNvbW1pc3Npb24pIHtcbiAgICB0aGlzLm5vZGVQdWJrZXkgPSB2b2lkIDA7XG4gICAgdGhpcy5hdXRob3JpemVkVm90ZXIgPSB2b2lkIDA7XG4gICAgdGhpcy5hdXRob3JpemVkV2l0aGRyYXdlciA9IHZvaWQgMDtcbiAgICB0aGlzLmNvbW1pc3Npb24gPSB2b2lkIDA7XG4gICAgdGhpcy5ub2RlUHVia2V5ID0gbm9kZVB1YmtleTtcbiAgICB0aGlzLmF1dGhvcml6ZWRWb3RlciA9IGF1dGhvcml6ZWRWb3RlcjtcbiAgICB0aGlzLmF1dGhvcml6ZWRXaXRoZHJhd2VyID0gYXV0aG9yaXplZFdpdGhkcmF3ZXI7XG4gICAgdGhpcy5jb21taXNzaW9uID0gY29tbWlzc2lvbjtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSB2b3RlIGFjY291bnQgdHJhbnNhY3Rpb24gcGFyYW1zXG4gKi9cblxuLyoqXG4gKiBJbml0aWFsaXplQWNjb3VudCBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqL1xuXG4vKipcbiAqIEF1dGhvcml6ZSBpbnN0cnVjdGlvbiBwYXJhbXNcbiAqL1xuXG4vKipcbiAqIEF1dGhvcml6ZVdpdGhTZWVkIGluc3RydWN0aW9uIHBhcmFtc1xuICovXG5cbi8qKlxuICogV2l0aGRyYXcgZnJvbSB2b3RlIGFjY291bnQgdHJhbnNhY3Rpb24gcGFyYW1zXG4gKi9cblxuLyoqXG4gKiBVcGRhdGUgdmFsaWRhdG9yIGlkZW50aXR5IChub2RlIHB1YmtleSkgdm90ZSBhY2NvdW50IGluc3RydWN0aW9uIHBhcmFtcy5cbiAqL1xuXG4vKipcbiAqIFZvdGUgSW5zdHJ1Y3Rpb24gY2xhc3NcbiAqL1xuY2xhc3MgVm90ZUluc3RydWN0aW9uIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBEZWNvZGUgYSB2b3RlIGluc3RydWN0aW9uIGFuZCByZXRyaWV2ZSB0aGUgaW5zdHJ1Y3Rpb24gdHlwZS5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVJbnN0cnVjdGlvblR5cGUoaW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmNoZWNrUHJvZ3JhbUlkKGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25UeXBlTGF5b3V0ID0gQnVmZmVyTGF5b3V0LnUzMignaW5zdHJ1Y3Rpb24nKTtcbiAgICBjb25zdCB0eXBlSW5kZXggPSBpbnN0cnVjdGlvblR5cGVMYXlvdXQuZGVjb2RlKGluc3RydWN0aW9uLmRhdGEpO1xuICAgIGxldCB0eXBlO1xuICAgIGZvciAoY29uc3QgW2l4VHlwZSwgbGF5b3V0XSBvZiBPYmplY3QuZW50cmllcyhWT1RFX0lOU1RSVUNUSU9OX0xBWU9VVFMpKSB7XG4gICAgICBpZiAobGF5b3V0LmluZGV4ID09IHR5cGVJbmRleCkge1xuICAgICAgICB0eXBlID0gaXhUeXBlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luc3RydWN0aW9uIHR5cGUgaW5jb3JyZWN0OyBub3QgYSBWb3RlSW5zdHJ1Y3Rpb24nKTtcbiAgICB9XG4gICAgcmV0dXJuIHR5cGU7XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGFuIGluaXRpYWxpemUgdm90ZSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVJbml0aWFsaXplQWNjb3VudChpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDQpO1xuICAgIGNvbnN0IHtcbiAgICAgIHZvdGVJbml0XG4gICAgfSA9IGRlY29kZURhdGEkMShWT1RFX0lOU1RSVUNUSU9OX0xBWU9VVFMuSW5pdGlhbGl6ZUFjY291bnQsIGluc3RydWN0aW9uLmRhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICB2b3RlUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzBdLnB1YmtleSxcbiAgICAgIG5vZGVQdWJrZXk6IGluc3RydWN0aW9uLmtleXNbM10ucHVia2V5LFxuICAgICAgdm90ZUluaXQ6IG5ldyBWb3RlSW5pdChuZXcgUHVibGljS2V5KHZvdGVJbml0Lm5vZGVQdWJrZXkpLCBuZXcgUHVibGljS2V5KHZvdGVJbml0LmF1dGhvcml6ZWRWb3RlciksIG5ldyBQdWJsaWNLZXkodm90ZUluaXQuYXV0aG9yaXplZFdpdGhkcmF3ZXIpLCB2b3RlSW5pdC5jb21taXNzaW9uKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGFuIGF1dGhvcml6ZSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVBdXRob3JpemUoaW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmNoZWNrUHJvZ3JhbUlkKGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgdGhpcy5jaGVja0tleUxlbmd0aChpbnN0cnVjdGlvbi5rZXlzLCAzKTtcbiAgICBjb25zdCB7XG4gICAgICBuZXdBdXRob3JpemVkLFxuICAgICAgdm90ZUF1dGhvcml6YXRpb25UeXBlXG4gICAgfSA9IGRlY29kZURhdGEkMShWT1RFX0lOU1RSVUNUSU9OX0xBWU9VVFMuQXV0aG9yaXplLCBpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgdm90ZVB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXksXG4gICAgICBhdXRob3JpemVkUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzJdLnB1YmtleSxcbiAgICAgIG5ld0F1dGhvcml6ZWRQdWJrZXk6IG5ldyBQdWJsaWNLZXkobmV3QXV0aG9yaXplZCksXG4gICAgICB2b3RlQXV0aG9yaXphdGlvblR5cGU6IHtcbiAgICAgICAgaW5kZXg6IHZvdGVBdXRob3JpemF0aW9uVHlwZVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGFuIGF1dGhvcml6ZSBpbnN0cnVjdGlvbiBhbmQgcmV0cmlldmUgdGhlIGluc3RydWN0aW9uIHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBkZWNvZGVBdXRob3JpemVXaXRoU2VlZChpbnN0cnVjdGlvbikge1xuICAgIHRoaXMuY2hlY2tQcm9ncmFtSWQoaW5zdHJ1Y3Rpb24ucHJvZ3JhbUlkKTtcbiAgICB0aGlzLmNoZWNrS2V5TGVuZ3RoKGluc3RydWN0aW9uLmtleXMsIDMpO1xuICAgIGNvbnN0IHtcbiAgICAgIHZvdGVBdXRob3JpemVXaXRoU2VlZEFyZ3M6IHtcbiAgICAgICAgY3VycmVudEF1dGhvcml0eURlcml2ZWRLZXlPd25lclB1YmtleSxcbiAgICAgICAgY3VycmVudEF1dGhvcml0eURlcml2ZWRLZXlTZWVkLFxuICAgICAgICBuZXdBdXRob3JpemVkLFxuICAgICAgICB2b3RlQXV0aG9yaXphdGlvblR5cGVcbiAgICAgIH1cbiAgICB9ID0gZGVjb2RlRGF0YSQxKFZPVEVfSU5TVFJVQ1RJT05fTEFZT1VUUy5BdXRob3JpemVXaXRoU2VlZCwgaW5zdHJ1Y3Rpb24uZGF0YSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGN1cnJlbnRBdXRob3JpdHlEZXJpdmVkS2V5QmFzZVB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1syXS5wdWJrZXksXG4gICAgICBjdXJyZW50QXV0aG9yaXR5RGVyaXZlZEtleU93bmVyUHVia2V5OiBuZXcgUHVibGljS2V5KGN1cnJlbnRBdXRob3JpdHlEZXJpdmVkS2V5T3duZXJQdWJrZXkpLFxuICAgICAgY3VycmVudEF1dGhvcml0eURlcml2ZWRLZXlTZWVkOiBjdXJyZW50QXV0aG9yaXR5RGVyaXZlZEtleVNlZWQsXG4gICAgICBuZXdBdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KG5ld0F1dGhvcml6ZWQpLFxuICAgICAgdm90ZUF1dGhvcml6YXRpb25UeXBlOiB7XG4gICAgICAgIGluZGV4OiB2b3RlQXV0aG9yaXphdGlvblR5cGVcbiAgICAgIH0sXG4gICAgICB2b3RlUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzBdLnB1YmtleVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlIGEgd2l0aGRyYXcgaW5zdHJ1Y3Rpb24gYW5kIHJldHJpZXZlIHRoZSBpbnN0cnVjdGlvbiBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgZGVjb2RlV2l0aGRyYXcoaW5zdHJ1Y3Rpb24pIHtcbiAgICB0aGlzLmNoZWNrUHJvZ3JhbUlkKGluc3RydWN0aW9uLnByb2dyYW1JZCk7XG4gICAgdGhpcy5jaGVja0tleUxlbmd0aChpbnN0cnVjdGlvbi5rZXlzLCAzKTtcbiAgICBjb25zdCB7XG4gICAgICBsYW1wb3J0c1xuICAgIH0gPSBkZWNvZGVEYXRhJDEoVk9URV9JTlNUUlVDVElPTl9MQVlPVVRTLldpdGhkcmF3LCBpbnN0cnVjdGlvbi5kYXRhKTtcbiAgICByZXR1cm4ge1xuICAgICAgdm90ZVB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1swXS5wdWJrZXksXG4gICAgICBhdXRob3JpemVkV2l0aGRyYXdlclB1YmtleTogaW5zdHJ1Y3Rpb24ua2V5c1syXS5wdWJrZXksXG4gICAgICBsYW1wb3J0cyxcbiAgICAgIHRvUHVia2V5OiBpbnN0cnVjdGlvbi5rZXlzWzFdLnB1YmtleVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0aWMgY2hlY2tQcm9ncmFtSWQocHJvZ3JhbUlkKSB7XG4gICAgaWYgKCFwcm9ncmFtSWQuZXF1YWxzKFZvdGVQcm9ncmFtLnByb2dyYW1JZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignaW52YWxpZCBpbnN0cnVjdGlvbjsgcHJvZ3JhbUlkIGlzIG5vdCBWb3RlUHJvZ3JhbScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHN0YXRpYyBjaGVja0tleUxlbmd0aChrZXlzLCBleHBlY3RlZExlbmd0aCkge1xuICAgIGlmIChrZXlzLmxlbmd0aCA8IGV4cGVjdGVkTGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgaW5zdHJ1Y3Rpb247IGZvdW5kICR7a2V5cy5sZW5ndGh9IGtleXMsIGV4cGVjdGVkIGF0IGxlYXN0ICR7ZXhwZWN0ZWRMZW5ndGh9YCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQW4gZW51bWVyYXRpb24gb2YgdmFsaWQgVm90ZUluc3RydWN0aW9uVHlwZSdzXG4gKi9cblxuLyoqIEBpbnRlcm5hbCAqL1xuXG5jb25zdCBWT1RFX0lOU1RSVUNUSU9OX0xBWU9VVFMgPSBPYmplY3QuZnJlZXplKHtcbiAgSW5pdGlhbGl6ZUFjY291bnQ6IHtcbiAgICBpbmRleDogMCxcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyksIHZvdGVJbml0KCldKVxuICB9LFxuICBBdXRob3JpemU6IHtcbiAgICBpbmRleDogMSxcbiAgICBsYXlvdXQ6IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC51MzIoJ2luc3RydWN0aW9uJyksIHB1YmxpY0tleSgnbmV3QXV0aG9yaXplZCcpLCBCdWZmZXJMYXlvdXQudTMyKCd2b3RlQXV0aG9yaXphdGlvblR5cGUnKV0pXG4gIH0sXG4gIFdpdGhkcmF3OiB7XG4gICAgaW5kZXg6IDMsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpLCBCdWZmZXJMYXlvdXQubnM2NCgnbGFtcG9ydHMnKV0pXG4gIH0sXG4gIFVwZGF0ZVZhbGlkYXRvcklkZW50aXR5OiB7XG4gICAgaW5kZXg6IDQsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpXSlcbiAgfSxcbiAgQXV0aG9yaXplV2l0aFNlZWQ6IHtcbiAgICBpbmRleDogMTAsXG4gICAgbGF5b3V0OiBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQudTMyKCdpbnN0cnVjdGlvbicpLCB2b3RlQXV0aG9yaXplV2l0aFNlZWRBcmdzKCldKVxuICB9XG59KTtcblxuLyoqXG4gKiBWb3RlQXV0aG9yaXplIHR5cGVcbiAqL1xuXG4vKipcbiAqIEFuIGVudW1lcmF0aW9uIG9mIHZhbGlkIFZvdGVBdXRob3JpemF0aW9uIGxheW91dHMuXG4gKi9cbmNvbnN0IFZvdGVBdXRob3JpemF0aW9uTGF5b3V0ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIFZvdGVyOiB7XG4gICAgaW5kZXg6IDBcbiAgfSxcbiAgV2l0aGRyYXdlcjoge1xuICAgIGluZGV4OiAxXG4gIH1cbn0pO1xuXG4vKipcbiAqIEZhY3RvcnkgY2xhc3MgZm9yIHRyYW5zYWN0aW9ucyB0byBpbnRlcmFjdCB3aXRoIHRoZSBWb3RlIHByb2dyYW1cbiAqL1xuY2xhc3MgVm90ZVByb2dyYW0ge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBrZXkgdGhhdCBpZGVudGlmaWVzIHRoZSBWb3RlIHByb2dyYW1cbiAgICovXG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFuIEluaXRpYWxpemUgaW5zdHJ1Y3Rpb24uXG4gICAqL1xuICBzdGF0aWMgaW5pdGlhbGl6ZUFjY291bnQocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgdm90ZVB1YmtleSxcbiAgICAgIG5vZGVQdWJrZXksXG4gICAgICB2b3RlSW5pdFxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHlwZSA9IFZPVEVfSU5TVFJVQ1RJT05fTEFZT1VUUy5Jbml0aWFsaXplQWNjb3VudDtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICB2b3RlSW5pdDoge1xuICAgICAgICBub2RlUHVia2V5OiB0b0J1ZmZlcih2b3RlSW5pdC5ub2RlUHVia2V5LnRvQnVmZmVyKCkpLFxuICAgICAgICBhdXRob3JpemVkVm90ZXI6IHRvQnVmZmVyKHZvdGVJbml0LmF1dGhvcml6ZWRWb3Rlci50b0J1ZmZlcigpKSxcbiAgICAgICAgYXV0aG9yaXplZFdpdGhkcmF3ZXI6IHRvQnVmZmVyKHZvdGVJbml0LmF1dGhvcml6ZWRXaXRoZHJhd2VyLnRvQnVmZmVyKCkpLFxuICAgICAgICBjb21taXNzaW9uOiB2b3RlSW5pdC5jb21taXNzaW9uXG4gICAgICB9XG4gICAgfSk7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb25EYXRhID0ge1xuICAgICAga2V5czogW3tcbiAgICAgICAgcHVia2V5OiB2b3RlUHVia2V5LFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICAgIH0sIHtcbiAgICAgICAgcHVia2V5OiBTWVNWQVJfUkVOVF9QVUJLRVksXG4gICAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICAgIH0sIHtcbiAgICAgICAgcHVia2V5OiBTWVNWQVJfQ0xPQ0tfUFVCS0VZLFxuICAgICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9LCB7XG4gICAgICAgIHB1YmtleTogbm9kZVB1YmtleSxcbiAgICAgICAgaXNTaWduZXI6IHRydWUsXG4gICAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgICB9XSxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWQsXG4gICAgICBkYXRhXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb25EYXRhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHRyYW5zYWN0aW9uIHRoYXQgY3JlYXRlcyBhIG5ldyBWb3RlIGFjY291bnQuXG4gICAqL1xuICBzdGF0aWMgY3JlYXRlQWNjb3VudChwYXJhbXMpIHtcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigpO1xuICAgIHRyYW5zYWN0aW9uLmFkZChTeXN0ZW1Qcm9ncmFtLmNyZWF0ZUFjY291bnQoe1xuICAgICAgZnJvbVB1YmtleTogcGFyYW1zLmZyb21QdWJrZXksXG4gICAgICBuZXdBY2NvdW50UHVia2V5OiBwYXJhbXMudm90ZVB1YmtleSxcbiAgICAgIGxhbXBvcnRzOiBwYXJhbXMubGFtcG9ydHMsXG4gICAgICBzcGFjZTogdGhpcy5zcGFjZSxcbiAgICAgIHByb2dyYW1JZDogdGhpcy5wcm9ncmFtSWRcbiAgICB9KSk7XG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLmFkZCh0aGlzLmluaXRpYWxpemVBY2NvdW50KHtcbiAgICAgIHZvdGVQdWJrZXk6IHBhcmFtcy52b3RlUHVia2V5LFxuICAgICAgbm9kZVB1YmtleTogcGFyYW1zLnZvdGVJbml0Lm5vZGVQdWJrZXksXG4gICAgICB2b3RlSW5pdDogcGFyYW1zLnZvdGVJbml0XG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgdHJhbnNhY3Rpb24gdGhhdCBhdXRob3JpemVzIGEgbmV3IFZvdGVyIG9yIFdpdGhkcmF3ZXIgb24gdGhlIFZvdGUgYWNjb3VudC5cbiAgICovXG4gIHN0YXRpYyBhdXRob3JpemUocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgdm90ZVB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRQdWJrZXksXG4gICAgICBuZXdBdXRob3JpemVkUHVia2V5LFxuICAgICAgdm90ZUF1dGhvcml6YXRpb25UeXBlXG4gICAgfSA9IHBhcmFtcztcbiAgICBjb25zdCB0eXBlID0gVk9URV9JTlNUUlVDVElPTl9MQVlPVVRTLkF1dGhvcml6ZTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICBuZXdBdXRob3JpemVkOiB0b0J1ZmZlcihuZXdBdXRob3JpemVkUHVia2V5LnRvQnVmZmVyKCkpLFxuICAgICAgdm90ZUF1dGhvcml6YXRpb25UeXBlOiB2b3RlQXV0aG9yaXphdGlvblR5cGUuaW5kZXhcbiAgICB9KTtcbiAgICBjb25zdCBrZXlzID0gW3tcbiAgICAgIHB1YmtleTogdm90ZVB1YmtleSxcbiAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICB9LCB7XG4gICAgICBwdWJrZXk6IFNZU1ZBUl9DTE9DS19QVUJLRVksXG4gICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICBpc1dyaXRhYmxlOiBmYWxzZVxuICAgIH0sIHtcbiAgICAgIHB1YmtleTogYXV0aG9yaXplZFB1YmtleSxcbiAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICB9XTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKHtcbiAgICAgIGtleXMsXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgdHJhbnNhY3Rpb24gdGhhdCBhdXRob3JpemVzIGEgbmV3IFZvdGVyIG9yIFdpdGhkcmF3ZXIgb24gdGhlIFZvdGUgYWNjb3VudFxuICAgKiB3aGVyZSB0aGUgY3VycmVudCBWb3RlciBvciBXaXRoZHJhd2VyIGF1dGhvcml0eSBpcyBhIGRlcml2ZWQga2V5LlxuICAgKi9cbiAgc3RhdGljIGF1dGhvcml6ZVdpdGhTZWVkKHBhcmFtcykge1xuICAgIGNvbnN0IHtcbiAgICAgIGN1cnJlbnRBdXRob3JpdHlEZXJpdmVkS2V5QmFzZVB1YmtleSxcbiAgICAgIGN1cnJlbnRBdXRob3JpdHlEZXJpdmVkS2V5T3duZXJQdWJrZXksXG4gICAgICBjdXJyZW50QXV0aG9yaXR5RGVyaXZlZEtleVNlZWQsXG4gICAgICBuZXdBdXRob3JpemVkUHVia2V5LFxuICAgICAgdm90ZUF1dGhvcml6YXRpb25UeXBlLFxuICAgICAgdm90ZVB1YmtleVxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHlwZSA9IFZPVEVfSU5TVFJVQ1RJT05fTEFZT1VUUy5BdXRob3JpemVXaXRoU2VlZDtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICB2b3RlQXV0aG9yaXplV2l0aFNlZWRBcmdzOiB7XG4gICAgICAgIGN1cnJlbnRBdXRob3JpdHlEZXJpdmVkS2V5T3duZXJQdWJrZXk6IHRvQnVmZmVyKGN1cnJlbnRBdXRob3JpdHlEZXJpdmVkS2V5T3duZXJQdWJrZXkudG9CdWZmZXIoKSksXG4gICAgICAgIGN1cnJlbnRBdXRob3JpdHlEZXJpdmVkS2V5U2VlZDogY3VycmVudEF1dGhvcml0eURlcml2ZWRLZXlTZWVkLFxuICAgICAgICBuZXdBdXRob3JpemVkOiB0b0J1ZmZlcihuZXdBdXRob3JpemVkUHVia2V5LnRvQnVmZmVyKCkpLFxuICAgICAgICB2b3RlQXV0aG9yaXphdGlvblR5cGU6IHZvdGVBdXRob3JpemF0aW9uVHlwZS5pbmRleFxuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IGtleXMgPSBbe1xuICAgICAgcHVia2V5OiB2b3RlUHVia2V5LFxuICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgIH0sIHtcbiAgICAgIHB1YmtleTogU1lTVkFSX0NMT0NLX1BVQktFWSxcbiAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgfSwge1xuICAgICAgcHVia2V5OiBjdXJyZW50QXV0aG9yaXR5RGVyaXZlZEtleUJhc2VQdWJrZXksXG4gICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgfV07XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbigpLmFkZCh7XG4gICAgICBrZXlzLFxuICAgICAgcHJvZ3JhbUlkOiB0aGlzLnByb2dyYW1JZCxcbiAgICAgIGRhdGFcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHRyYW5zYWN0aW9uIHRvIHdpdGhkcmF3IGZyb20gYSBWb3RlIGFjY291bnQuXG4gICAqL1xuICBzdGF0aWMgd2l0aGRyYXcocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgdm90ZVB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRXaXRoZHJhd2VyUHVia2V5LFxuICAgICAgbGFtcG9ydHMsXG4gICAgICB0b1B1YmtleVxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHlwZSA9IFZPVEVfSU5TVFJVQ1RJT05fTEFZT1VUUy5XaXRoZHJhdztcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlLCB7XG4gICAgICBsYW1wb3J0c1xuICAgIH0pO1xuICAgIGNvbnN0IGtleXMgPSBbe1xuICAgICAgcHVia2V5OiB2b3RlUHVia2V5LFxuICAgICAgaXNTaWduZXI6IGZhbHNlLFxuICAgICAgaXNXcml0YWJsZTogdHJ1ZVxuICAgIH0sIHtcbiAgICAgIHB1YmtleTogdG9QdWJrZXksXG4gICAgICBpc1NpZ25lcjogZmFsc2UsXG4gICAgICBpc1dyaXRhYmxlOiB0cnVlXG4gICAgfSwge1xuICAgICAgcHVia2V5OiBhdXRob3JpemVkV2l0aGRyYXdlclB1YmtleSxcbiAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICB9XTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKHtcbiAgICAgIGtleXMsXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgdHJhbnNhY3Rpb24gdG8gd2l0aGRyYXcgc2FmZWx5IGZyb20gYSBWb3RlIGFjY291bnQuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gd2FzIGNyZWF0ZWQgYXMgYSBzYWZlZ3VhcmQgZm9yIHZvdGUgYWNjb3VudHMgcnVubmluZyB2YWxpZGF0b3JzLCBgc2FmZVdpdGhkcmF3YFxuICAgKiBjaGVja3MgdGhhdCB0aGUgd2l0aGRyYXcgYW1vdW50IHdpbGwgbm90IGV4Y2VlZCB0aGUgc3BlY2lmaWVkIGJhbGFuY2Ugd2hpbGUgbGVhdmluZyBlbm91Z2ggbGVmdFxuICAgKiB0byBjb3ZlciByZW50LiBJZiB5b3Ugd2lzaCB0byBjbG9zZSB0aGUgdm90ZSBhY2NvdW50IGJ5IHdpdGhkcmF3aW5nIHRoZSBmdWxsIGFtb3VudCwgY2FsbCB0aGVcbiAgICogYHdpdGhkcmF3YCBtZXRob2QgZGlyZWN0bHkuXG4gICAqL1xuICBzdGF0aWMgc2FmZVdpdGhkcmF3KHBhcmFtcywgY3VycmVudFZvdGVBY2NvdW50QmFsYW5jZSwgcmVudEV4ZW1wdE1pbmltdW0pIHtcbiAgICBpZiAocGFyYW1zLmxhbXBvcnRzID4gY3VycmVudFZvdGVBY2NvdW50QmFsYW5jZSAtIHJlbnRFeGVtcHRNaW5pbXVtKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dpdGhkcmF3IHdpbGwgbGVhdmUgdm90ZSBhY2NvdW50IHdpdGggaW5zdWZmaWNpZW50IGZ1bmRzLicpO1xuICAgIH1cbiAgICByZXR1cm4gVm90ZVByb2dyYW0ud2l0aGRyYXcocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHRyYW5zYWN0aW9uIHRvIHVwZGF0ZSB0aGUgdmFsaWRhdG9yIGlkZW50aXR5IChub2RlIHB1YmtleSkgb2YgYSBWb3RlIGFjY291bnQuXG4gICAqL1xuICBzdGF0aWMgdXBkYXRlVmFsaWRhdG9ySWRlbnRpdHkocGFyYW1zKSB7XG4gICAgY29uc3Qge1xuICAgICAgdm90ZVB1YmtleSxcbiAgICAgIGF1dGhvcml6ZWRXaXRoZHJhd2VyUHVia2V5LFxuICAgICAgbm9kZVB1YmtleVxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgdHlwZSA9IFZPVEVfSU5TVFJVQ1RJT05fTEFZT1VUUy5VcGRhdGVWYWxpZGF0b3JJZGVudGl0eTtcbiAgICBjb25zdCBkYXRhID0gZW5jb2RlRGF0YSh0eXBlKTtcbiAgICBjb25zdCBrZXlzID0gW3tcbiAgICAgIHB1YmtleTogdm90ZVB1YmtleSxcbiAgICAgIGlzU2lnbmVyOiBmYWxzZSxcbiAgICAgIGlzV3JpdGFibGU6IHRydWVcbiAgICB9LCB7XG4gICAgICBwdWJrZXk6IG5vZGVQdWJrZXksXG4gICAgICBpc1NpZ25lcjogdHJ1ZSxcbiAgICAgIGlzV3JpdGFibGU6IGZhbHNlXG4gICAgfSwge1xuICAgICAgcHVia2V5OiBhdXRob3JpemVkV2l0aGRyYXdlclB1YmtleSxcbiAgICAgIGlzU2lnbmVyOiB0cnVlLFxuICAgICAgaXNXcml0YWJsZTogZmFsc2VcbiAgICB9XTtcbiAgICByZXR1cm4gbmV3IFRyYW5zYWN0aW9uKCkuYWRkKHtcbiAgICAgIGtleXMsXG4gICAgICBwcm9ncmFtSWQ6IHRoaXMucHJvZ3JhbUlkLFxuICAgICAgZGF0YVxuICAgIH0pO1xuICB9XG59XG5Wb3RlUHJvZ3JhbS5wcm9ncmFtSWQgPSBuZXcgUHVibGljS2V5KCdWb3RlMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG4vKipcbiAqIE1heCBzcGFjZSBvZiBhIFZvdGUgYWNjb3VudFxuICpcbiAqIFRoaXMgaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHNvbGFuYS12b3RlLXByb2dyYW0gVm90ZVN0YXRlIHN0cnVjdCBhc1xuICogYFZvdGVTdGF0ZTo6c2l6ZV9vZigpYDpcbiAqIGh0dHBzOi8vZG9jcy5ycy9zb2xhbmEtdm90ZS1wcm9ncmFtLzEuOS41L3NvbGFuYV92b3RlX3Byb2dyYW0vdm90ZV9zdGF0ZS9zdHJ1Y3QuVm90ZVN0YXRlLmh0bWwjbWV0aG9kLnNpemVfb2ZcbiAqXG4gKiBLRUVQIElOIFNZTkMgV0lUSCBgVm90ZVN0YXRlOjpzaXplX29mKClgIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9zb2xhbmEtbGFicy9zb2xhbmEvYmxvYi9hNDc0Y2IyNGI5MjM4ZjVlZGNjOTgyZjY1YzBiMzdkNGExMDQ2ZjdlL3Nkay9wcm9ncmFtL3NyYy92b3RlL3N0YXRlL21vZC5ycyNMMzQwLUwzNDJcbiAqL1xuVm90ZVByb2dyYW0uc3BhY2UgPSAzNzYyO1xuXG5jb25zdCBWQUxJREFUT1JfSU5GT19LRVkgPSBuZXcgUHVibGljS2V5KCdWYTFpZGF0b3IxbmZvMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJyk7XG5cbi8qKlxuICogQGludGVybmFsXG4gKi9cblxuLyoqXG4gKiBJbmZvIHVzZWQgdG8gaWRlbnRpdHkgdmFsaWRhdG9ycy5cbiAqL1xuXG5jb25zdCBJbmZvU3RyaW5nID0gdHlwZSh7XG4gIG5hbWU6IHN0cmluZygpLFxuICB3ZWJzaXRlOiBvcHRpb25hbChzdHJpbmcoKSksXG4gIGRldGFpbHM6IG9wdGlvbmFsKHN0cmluZygpKSxcbiAgaWNvblVybDogb3B0aW9uYWwoc3RyaW5nKCkpLFxuICBrZXliYXNlVXNlcm5hbWU6IG9wdGlvbmFsKHN0cmluZygpKVxufSk7XG5cbi8qKlxuICogVmFsaWRhdG9ySW5mbyBjbGFzc1xuICovXG5jbGFzcyBWYWxpZGF0b3JJbmZvIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIHZhbGlkIFZhbGlkYXRvckluZm9cbiAgICpcbiAgICogQHBhcmFtIGtleSB2YWxpZGF0b3IgcHVibGljIGtleVxuICAgKiBAcGFyYW0gaW5mbyB2YWxpZGF0b3IgaW5mb3JtYXRpb25cbiAgICovXG4gIGNvbnN0cnVjdG9yKGtleSwgaW5mbykge1xuICAgIC8qKlxuICAgICAqIHZhbGlkYXRvciBwdWJsaWMga2V5XG4gICAgICovXG4gICAgdGhpcy5rZXkgPSB2b2lkIDA7XG4gICAgLyoqXG4gICAgICogdmFsaWRhdG9yIGluZm9ybWF0aW9uXG4gICAgICovXG4gICAgdGhpcy5pbmZvID0gdm9pZCAwO1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHRoaXMuaW5mbyA9IGluZm87XG4gIH1cblxuICAvKipcbiAgICogRGVzZXJpYWxpemUgVmFsaWRhdG9ySW5mbyBmcm9tIHRoZSBjb25maWcgYWNjb3VudCBkYXRhLiBFeGFjdGx5IHR3byBjb25maWdcbiAgICoga2V5cyBhcmUgcmVxdWlyZWQgaW4gdGhlIGRhdGEuXG4gICAqXG4gICAqIEBwYXJhbSBidWZmZXIgY29uZmlnIGFjY291bnQgZGF0YVxuICAgKiBAcmV0dXJuIG51bGwgaWYgaW5mbyB3YXMgbm90IGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZ0RhdGEoYnVmZmVyKSB7XG4gICAgbGV0IGJ5dGVBcnJheSA9IFsuLi5idWZmZXJdO1xuICAgIGNvbnN0IGNvbmZpZ0tleUNvdW50ID0gZGVjb2RlTGVuZ3RoKGJ5dGVBcnJheSk7XG4gICAgaWYgKGNvbmZpZ0tleUNvdW50ICE9PSAyKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBjb25maWdLZXlzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyOyBpKyspIHtcbiAgICAgIGNvbnN0IHB1YmxpY0tleSA9IG5ldyBQdWJsaWNLZXkoZ3VhcmRlZFNwbGljZShieXRlQXJyYXksIDAsIFBVQkxJQ19LRVlfTEVOR1RIKSk7XG4gICAgICBjb25zdCBpc1NpZ25lciA9IGd1YXJkZWRTaGlmdChieXRlQXJyYXkpID09PSAxO1xuICAgICAgY29uZmlnS2V5cy5wdXNoKHtcbiAgICAgICAgcHVibGljS2V5LFxuICAgICAgICBpc1NpZ25lclxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChjb25maWdLZXlzWzBdLnB1YmxpY0tleS5lcXVhbHMoVkFMSURBVE9SX0lORk9fS0VZKSkge1xuICAgICAgaWYgKGNvbmZpZ0tleXNbMV0uaXNTaWduZXIpIHtcbiAgICAgICAgY29uc3QgcmF3SW5mbyA9IHJ1c3RTdHJpbmcoKS5kZWNvZGUoQnVmZmVyLmZyb20oYnl0ZUFycmF5KSk7XG4gICAgICAgIGNvbnN0IGluZm8gPSBKU09OLnBhcnNlKHJhd0luZm8pO1xuICAgICAgICBhc3NlcnQkMShpbmZvLCBJbmZvU3RyaW5nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBWYWxpZGF0b3JJbmZvKGNvbmZpZ0tleXNbMV0ucHVibGljS2V5LCBpbmZvKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuY29uc3QgVk9URV9QUk9HUkFNX0lEID0gbmV3IFB1YmxpY0tleSgnVm90ZTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMScpO1xuXG4vKipcbiAqIEhpc3Rvcnkgb2YgaG93IG1hbnkgY3JlZGl0cyBlYXJuZWQgYnkgdGhlIGVuZCBvZiBlYWNoIGVwb2NoXG4gKi9cblxuLyoqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3NvbGFuYS1sYWJzL3NvbGFuYS9ibG9iLzhhMTJlZDAyOWNmYTM4ZDRhNDU0MDA5MTZjMjQ2M2ZiODJiYmVjOGMvcHJvZ3JhbXMvdm90ZV9hcGkvc3JjL3ZvdGVfc3RhdGUucnMjTDY4LUw4OFxuICpcbiAqIEBpbnRlcm5hbFxuICovXG5jb25zdCBWb3RlQWNjb3VudExheW91dCA9IEJ1ZmZlckxheW91dC5zdHJ1Y3QoW3B1YmxpY0tleSgnbm9kZVB1YmtleScpLCBwdWJsaWNLZXkoJ2F1dGhvcml6ZWRXaXRoZHJhd2VyJyksIEJ1ZmZlckxheW91dC51OCgnY29tbWlzc2lvbicpLCBCdWZmZXJMYXlvdXQubnU2NCgpLFxuLy8gdm90ZXMubGVuZ3RoXG5CdWZmZXJMYXlvdXQuc2VxKEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC5udTY0KCdzbG90JyksIEJ1ZmZlckxheW91dC51MzIoJ2NvbmZpcm1hdGlvbkNvdW50JyldKSwgQnVmZmVyTGF5b3V0Lm9mZnNldChCdWZmZXJMYXlvdXQudTMyKCksIC04KSwgJ3ZvdGVzJyksIEJ1ZmZlckxheW91dC51OCgncm9vdFNsb3RWYWxpZCcpLCBCdWZmZXJMYXlvdXQubnU2NCgncm9vdFNsb3QnKSwgQnVmZmVyTGF5b3V0Lm51NjQoKSxcbi8vIGF1dGhvcml6ZWRWb3RlcnMubGVuZ3RoXG5CdWZmZXJMYXlvdXQuc2VxKEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC5udTY0KCdlcG9jaCcpLCBwdWJsaWNLZXkoJ2F1dGhvcml6ZWRWb3RlcicpXSksIEJ1ZmZlckxheW91dC5vZmZzZXQoQnVmZmVyTGF5b3V0LnUzMigpLCAtOCksICdhdXRob3JpemVkVm90ZXJzJyksIEJ1ZmZlckxheW91dC5zdHJ1Y3QoW0J1ZmZlckxheW91dC5zZXEoQnVmZmVyTGF5b3V0LnN0cnVjdChbcHVibGljS2V5KCdhdXRob3JpemVkUHVia2V5JyksIEJ1ZmZlckxheW91dC5udTY0KCdlcG9jaE9mTGFzdEF1dGhvcml6ZWRTd2l0Y2gnKSwgQnVmZmVyTGF5b3V0Lm51NjQoJ3RhcmdldEVwb2NoJyldKSwgMzIsICdidWYnKSwgQnVmZmVyTGF5b3V0Lm51NjQoJ2lkeCcpLCBCdWZmZXJMYXlvdXQudTgoJ2lzRW1wdHknKV0sICdwcmlvclZvdGVycycpLCBCdWZmZXJMYXlvdXQubnU2NCgpLFxuLy8gZXBvY2hDcmVkaXRzLmxlbmd0aFxuQnVmZmVyTGF5b3V0LnNlcShCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQubnU2NCgnZXBvY2gnKSwgQnVmZmVyTGF5b3V0Lm51NjQoJ2NyZWRpdHMnKSwgQnVmZmVyTGF5b3V0Lm51NjQoJ3ByZXZDcmVkaXRzJyldKSwgQnVmZmVyTGF5b3V0Lm9mZnNldChCdWZmZXJMYXlvdXQudTMyKCksIC04KSwgJ2Vwb2NoQ3JlZGl0cycpLCBCdWZmZXJMYXlvdXQuc3RydWN0KFtCdWZmZXJMYXlvdXQubnU2NCgnc2xvdCcpLCBCdWZmZXJMYXlvdXQubnU2NCgndGltZXN0YW1wJyldLCAnbGFzdFRpbWVzdGFtcCcpXSk7XG4vKipcbiAqIFZvdGVBY2NvdW50IGNsYXNzXG4gKi9cbmNsYXNzIFZvdGVBY2NvdW50IHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgY29uc3RydWN0b3IoYXJncykge1xuICAgIHRoaXMubm9kZVB1YmtleSA9IHZvaWQgMDtcbiAgICB0aGlzLmF1dGhvcml6ZWRXaXRoZHJhd2VyID0gdm9pZCAwO1xuICAgIHRoaXMuY29tbWlzc2lvbiA9IHZvaWQgMDtcbiAgICB0aGlzLnJvb3RTbG90ID0gdm9pZCAwO1xuICAgIHRoaXMudm90ZXMgPSB2b2lkIDA7XG4gICAgdGhpcy5hdXRob3JpemVkVm90ZXJzID0gdm9pZCAwO1xuICAgIHRoaXMucHJpb3JWb3RlcnMgPSB2b2lkIDA7XG4gICAgdGhpcy5lcG9jaENyZWRpdHMgPSB2b2lkIDA7XG4gICAgdGhpcy5sYXN0VGltZXN0YW1wID0gdm9pZCAwO1xuICAgIHRoaXMubm9kZVB1YmtleSA9IGFyZ3Mubm9kZVB1YmtleTtcbiAgICB0aGlzLmF1dGhvcml6ZWRXaXRoZHJhd2VyID0gYXJncy5hdXRob3JpemVkV2l0aGRyYXdlcjtcbiAgICB0aGlzLmNvbW1pc3Npb24gPSBhcmdzLmNvbW1pc3Npb247XG4gICAgdGhpcy5yb290U2xvdCA9IGFyZ3Mucm9vdFNsb3Q7XG4gICAgdGhpcy52b3RlcyA9IGFyZ3Mudm90ZXM7XG4gICAgdGhpcy5hdXRob3JpemVkVm90ZXJzID0gYXJncy5hdXRob3JpemVkVm90ZXJzO1xuICAgIHRoaXMucHJpb3JWb3RlcnMgPSBhcmdzLnByaW9yVm90ZXJzO1xuICAgIHRoaXMuZXBvY2hDcmVkaXRzID0gYXJncy5lcG9jaENyZWRpdHM7XG4gICAgdGhpcy5sYXN0VGltZXN0YW1wID0gYXJncy5sYXN0VGltZXN0YW1wO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VyaWFsaXplIFZvdGVBY2NvdW50IGZyb20gdGhlIGFjY291bnQgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIGJ1ZmZlciBhY2NvdW50IGRhdGFcbiAgICogQHJldHVybiBWb3RlQWNjb3VudFxuICAgKi9cbiAgc3RhdGljIGZyb21BY2NvdW50RGF0YShidWZmZXIpIHtcbiAgICBjb25zdCB2ZXJzaW9uT2Zmc2V0ID0gNDtcbiAgICBjb25zdCB2YSA9IFZvdGVBY2NvdW50TGF5b3V0LmRlY29kZSh0b0J1ZmZlcihidWZmZXIpLCB2ZXJzaW9uT2Zmc2V0KTtcbiAgICBsZXQgcm9vdFNsb3QgPSB2YS5yb290U2xvdDtcbiAgICBpZiAoIXZhLnJvb3RTbG90VmFsaWQpIHtcbiAgICAgIHJvb3RTbG90ID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBWb3RlQWNjb3VudCh7XG4gICAgICBub2RlUHVia2V5OiBuZXcgUHVibGljS2V5KHZhLm5vZGVQdWJrZXkpLFxuICAgICAgYXV0aG9yaXplZFdpdGhkcmF3ZXI6IG5ldyBQdWJsaWNLZXkodmEuYXV0aG9yaXplZFdpdGhkcmF3ZXIpLFxuICAgICAgY29tbWlzc2lvbjogdmEuY29tbWlzc2lvbixcbiAgICAgIHZvdGVzOiB2YS52b3RlcyxcbiAgICAgIHJvb3RTbG90LFxuICAgICAgYXV0aG9yaXplZFZvdGVyczogdmEuYXV0aG9yaXplZFZvdGVycy5tYXAocGFyc2VBdXRob3JpemVkVm90ZXIpLFxuICAgICAgcHJpb3JWb3RlcnM6IGdldFByaW9yVm90ZXJzKHZhLnByaW9yVm90ZXJzKSxcbiAgICAgIGVwb2NoQ3JlZGl0czogdmEuZXBvY2hDcmVkaXRzLFxuICAgICAgbGFzdFRpbWVzdGFtcDogdmEubGFzdFRpbWVzdGFtcFxuICAgIH0pO1xuICB9XG59XG5mdW5jdGlvbiBwYXJzZUF1dGhvcml6ZWRWb3Rlcih7XG4gIGF1dGhvcml6ZWRWb3RlcixcbiAgZXBvY2hcbn0pIHtcbiAgcmV0dXJuIHtcbiAgICBlcG9jaCxcbiAgICBhdXRob3JpemVkVm90ZXI6IG5ldyBQdWJsaWNLZXkoYXV0aG9yaXplZFZvdGVyKVxuICB9O1xufVxuZnVuY3Rpb24gcGFyc2VQcmlvclZvdGVycyh7XG4gIGF1dGhvcml6ZWRQdWJrZXksXG4gIGVwb2NoT2ZMYXN0QXV0aG9yaXplZFN3aXRjaCxcbiAgdGFyZ2V0RXBvY2hcbn0pIHtcbiAgcmV0dXJuIHtcbiAgICBhdXRob3JpemVkUHVia2V5OiBuZXcgUHVibGljS2V5KGF1dGhvcml6ZWRQdWJrZXkpLFxuICAgIGVwb2NoT2ZMYXN0QXV0aG9yaXplZFN3aXRjaCxcbiAgICB0YXJnZXRFcG9jaFxuICB9O1xufVxuZnVuY3Rpb24gZ2V0UHJpb3JWb3RlcnMoe1xuICBidWYsXG4gIGlkeCxcbiAgaXNFbXB0eVxufSkge1xuICBpZiAoaXNFbXB0eSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICByZXR1cm4gWy4uLmJ1Zi5zbGljZShpZHggKyAxKS5tYXAocGFyc2VQcmlvclZvdGVycyksIC4uLmJ1Zi5zbGljZSgwLCBpZHgpLm1hcChwYXJzZVByaW9yVm90ZXJzKV07XG59XG5cbmNvbnN0IGVuZHBvaW50ID0ge1xuICBodHRwOiB7XG4gICAgZGV2bmV0OiAnaHR0cDovL2FwaS5kZXZuZXQuc29sYW5hLmNvbScsXG4gICAgdGVzdG5ldDogJ2h0dHA6Ly9hcGkudGVzdG5ldC5zb2xhbmEuY29tJyxcbiAgICAnbWFpbm5ldC1iZXRhJzogJ2h0dHA6Ly9hcGkubWFpbm5ldC1iZXRhLnNvbGFuYS5jb20vJ1xuICB9LFxuICBodHRwczoge1xuICAgIGRldm5ldDogJ2h0dHBzOi8vYXBpLmRldm5ldC5zb2xhbmEuY29tJyxcbiAgICB0ZXN0bmV0OiAnaHR0cHM6Ly9hcGkudGVzdG5ldC5zb2xhbmEuY29tJyxcbiAgICAnbWFpbm5ldC1iZXRhJzogJ2h0dHBzOi8vYXBpLm1haW5uZXQtYmV0YS5zb2xhbmEuY29tLydcbiAgfVxufTtcbi8qKlxuICogUmV0cmlldmVzIHRoZSBSUEMgQVBJIFVSTCBmb3IgdGhlIHNwZWNpZmllZCBjbHVzdGVyXG4gKiBAcGFyYW0ge0NsdXN0ZXJ9IFtjbHVzdGVyPVwiZGV2bmV0XCJdIC0gVGhlIGNsdXN0ZXIgbmFtZSBvZiB0aGUgUlBDIEFQSSBVUkwgdG8gdXNlLiBQb3NzaWJsZSBvcHRpb25zOiAnZGV2bmV0JyB8ICd0ZXN0bmV0JyB8ICdtYWlubmV0LWJldGEnXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0bHM9XCJodHRwXCJdIC0gVXNlIFRMUyB3aGVuIGNvbm5lY3RpbmcgdG8gY2x1c3Rlci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgc3RyaW5nIG9mIHRoZSBSUEMgZW5kcG9pbnRcbiAqL1xuZnVuY3Rpb24gY2x1c3RlckFwaVVybChjbHVzdGVyLCB0bHMpIHtcbiAgY29uc3Qga2V5ID0gdGxzID09PSBmYWxzZSA/ICdodHRwJyA6ICdodHRwcyc7XG4gIGlmICghY2x1c3Rlcikge1xuICAgIHJldHVybiBlbmRwb2ludFtrZXldWydkZXZuZXQnXTtcbiAgfVxuICBjb25zdCB1cmwgPSBlbmRwb2ludFtrZXldW2NsdXN0ZXJdO1xuICBpZiAoIXVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biAke2tleX0gY2x1c3RlcjogJHtjbHVzdGVyfWApO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5cbi8qKlxuICogU2VuZCBhbmQgY29uZmlybSBhIHJhdyB0cmFuc2FjdGlvblxuICpcbiAqIElmIGBjb21taXRtZW50YCBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gJ21heCcgY29tbWl0bWVudC5cbiAqXG4gKiBAcGFyYW0ge0Nvbm5lY3Rpb259IGNvbm5lY3Rpb25cbiAqIEBwYXJhbSB7QnVmZmVyfSByYXdUcmFuc2FjdGlvblxuICogQHBhcmFtIHtUcmFuc2FjdGlvbkNvbmZpcm1hdGlvblN0cmF0ZWd5fSBjb25maXJtYXRpb25TdHJhdGVneVxuICogQHBhcmFtIHtDb25maXJtT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUcmFuc2FjdGlvblNpZ25hdHVyZT59XG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBDYWxsaW5nIGBzZW5kQW5kQ29uZmlybVJhd1RyYW5zYWN0aW9uKClgIHdpdGhvdXQgYSBgY29uZmlybWF0aW9uU3RyYXRlZ3lgXG4gKiBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlZGVjbGFyZVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVkZWNsYXJlXG5hc3luYyBmdW5jdGlvbiBzZW5kQW5kQ29uZmlybVJhd1RyYW5zYWN0aW9uKGNvbm5lY3Rpb24sIHJhd1RyYW5zYWN0aW9uLCBjb25maXJtYXRpb25TdHJhdGVneU9yQ29uZmlybU9wdGlvbnMsIG1heWJlQ29uZmlybU9wdGlvbnMpIHtcbiAgbGV0IGNvbmZpcm1hdGlvblN0cmF0ZWd5O1xuICBsZXQgb3B0aW9ucztcbiAgaWYgKGNvbmZpcm1hdGlvblN0cmF0ZWd5T3JDb25maXJtT3B0aW9ucyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlybWF0aW9uU3RyYXRlZ3lPckNvbmZpcm1PcHRpb25zLCAnbGFzdFZhbGlkQmxvY2tIZWlnaHQnKSkge1xuICAgIGNvbmZpcm1hdGlvblN0cmF0ZWd5ID0gY29uZmlybWF0aW9uU3RyYXRlZ3lPckNvbmZpcm1PcHRpb25zO1xuICAgIG9wdGlvbnMgPSBtYXliZUNvbmZpcm1PcHRpb25zO1xuICB9IGVsc2UgaWYgKGNvbmZpcm1hdGlvblN0cmF0ZWd5T3JDb25maXJtT3B0aW9ucyAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY29uZmlybWF0aW9uU3RyYXRlZ3lPckNvbmZpcm1PcHRpb25zLCAnbm9uY2VWYWx1ZScpKSB7XG4gICAgY29uZmlybWF0aW9uU3RyYXRlZ3kgPSBjb25maXJtYXRpb25TdHJhdGVneU9yQ29uZmlybU9wdGlvbnM7XG4gICAgb3B0aW9ucyA9IG1heWJlQ29uZmlybU9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgb3B0aW9ucyA9IGNvbmZpcm1hdGlvblN0cmF0ZWd5T3JDb25maXJtT3B0aW9ucztcbiAgfVxuICBjb25zdCBzZW5kT3B0aW9ucyA9IG9wdGlvbnMgJiYge1xuICAgIHNraXBQcmVmbGlnaHQ6IG9wdGlvbnMuc2tpcFByZWZsaWdodCxcbiAgICBwcmVmbGlnaHRDb21taXRtZW50OiBvcHRpb25zLnByZWZsaWdodENvbW1pdG1lbnQgfHwgb3B0aW9ucy5jb21taXRtZW50LFxuICAgIG1pbkNvbnRleHRTbG90OiBvcHRpb25zLm1pbkNvbnRleHRTbG90XG4gIH07XG4gIGNvbnN0IHNpZ25hdHVyZSA9IGF3YWl0IGNvbm5lY3Rpb24uc2VuZFJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uLCBzZW5kT3B0aW9ucyk7XG4gIGNvbnN0IGNvbW1pdG1lbnQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29tbWl0bWVudDtcbiAgY29uc3QgY29uZmlybWF0aW9uUHJvbWlzZSA9IGNvbmZpcm1hdGlvblN0cmF0ZWd5ID8gY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oY29uZmlybWF0aW9uU3RyYXRlZ3ksIGNvbW1pdG1lbnQpIDogY29ubmVjdGlvbi5jb25maXJtVHJhbnNhY3Rpb24oc2lnbmF0dXJlLCBjb21taXRtZW50KTtcbiAgY29uc3Qgc3RhdHVzID0gKGF3YWl0IGNvbmZpcm1hdGlvblByb21pc2UpLnZhbHVlO1xuICBpZiAoc3RhdHVzLmVycikge1xuICAgIGlmIChzaWduYXR1cmUgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFNlbmRUcmFuc2FjdGlvbkVycm9yKHtcbiAgICAgICAgYWN0aW9uOiBzZW5kT3B0aW9ucz8uc2tpcFByZWZsaWdodCA/ICdzZW5kJyA6ICdzaW11bGF0ZScsXG4gICAgICAgIHNpZ25hdHVyZTogc2lnbmF0dXJlLFxuICAgICAgICB0cmFuc2FjdGlvbk1lc3NhZ2U6IGBTdGF0dXM6ICgke0pTT04uc3RyaW5naWZ5KHN0YXR1cyl9KWBcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJhdyB0cmFuc2FjdGlvbiAke3NpZ25hdHVyZX0gZmFpbGVkICgke0pTT04uc3RyaW5naWZ5KHN0YXR1cyl9KWApO1xuICB9XG4gIHJldHVybiBzaWduYXR1cmU7XG59XG5cbi8qKlxuICogVGhlcmUgYXJlIDEtYmlsbGlvbiBsYW1wb3J0cyBpbiBvbmUgU09MXG4gKi9cbmNvbnN0IExBTVBPUlRTX1BFUl9TT0wgPSAxMDAwMDAwMDAwO1xuXG5leHBvcnQgeyBBY2NvdW50LCBBZGRyZXNzTG9va3VwVGFibGVBY2NvdW50LCBBZGRyZXNzTG9va3VwVGFibGVJbnN0cnVjdGlvbiwgQWRkcmVzc0xvb2t1cFRhYmxlUHJvZ3JhbSwgQXV0aG9yaXplZCwgQkxPQ0tIQVNIX0NBQ0hFX1RJTUVPVVRfTVMsIEJQRl9MT0FERVJfREVQUkVDQVRFRF9QUk9HUkFNX0lELCBCUEZfTE9BREVSX1BST0dSQU1fSUQsIEJwZkxvYWRlciwgQ09NUFVURV9CVURHRVRfSU5TVFJVQ1RJT05fTEFZT1VUUywgQ29tcHV0ZUJ1ZGdldEluc3RydWN0aW9uLCBDb21wdXRlQnVkZ2V0UHJvZ3JhbSwgQ29ubmVjdGlvbiwgRWQyNTUxOVByb2dyYW0sIEVudW0sIEVwb2NoU2NoZWR1bGUsIEZlZUNhbGN1bGF0b3JMYXlvdXQsIEtleXBhaXIsIExBTVBPUlRTX1BFUl9TT0wsIExPT0tVUF9UQUJMRV9JTlNUUlVDVElPTl9MQVlPVVRTLCBMb2FkZXIsIExvY2t1cCwgTUFYX1NFRURfTEVOR1RILCBNZXNzYWdlLCBNZXNzYWdlQWNjb3VudEtleXMsIE1lc3NhZ2VWMCwgTk9OQ0VfQUNDT1VOVF9MRU5HVEgsIE5vbmNlQWNjb3VudCwgUEFDS0VUX0RBVEFfU0laRSwgUFVCTElDX0tFWV9MRU5HVEgsIFB1YmxpY0tleSwgU0lHTkFUVVJFX0xFTkdUSF9JTl9CWVRFUywgU09MQU5BX1NDSEVNQSwgU1RBS0VfQ09ORklHX0lELCBTVEFLRV9JTlNUUlVDVElPTl9MQVlPVVRTLCBTWVNURU1fSU5TVFJVQ1RJT05fTEFZT1VUUywgU1lTVkFSX0NMT0NLX1BVQktFWSwgU1lTVkFSX0VQT0NIX1NDSEVEVUxFX1BVQktFWSwgU1lTVkFSX0lOU1RSVUNUSU9OU19QVUJLRVksIFNZU1ZBUl9SRUNFTlRfQkxPQ0tIQVNIRVNfUFVCS0VZLCBTWVNWQVJfUkVOVF9QVUJLRVksIFNZU1ZBUl9SRVdBUkRTX1BVQktFWSwgU1lTVkFSX1NMT1RfSEFTSEVTX1BVQktFWSwgU1lTVkFSX1NMT1RfSElTVE9SWV9QVUJLRVksIFNZU1ZBUl9TVEFLRV9ISVNUT1JZX1BVQktFWSwgU2VjcDI1NmsxUHJvZ3JhbSwgU2VuZFRyYW5zYWN0aW9uRXJyb3IsIFNvbGFuYUpTT05SUENFcnJvciwgU29sYW5hSlNPTlJQQ0Vycm9yQ29kZSwgU3Rha2VBdXRob3JpemF0aW9uTGF5b3V0LCBTdGFrZUluc3RydWN0aW9uLCBTdGFrZVByb2dyYW0sIFN0cnVjdCwgU3lzdGVtSW5zdHJ1Y3Rpb24sIFN5c3RlbVByb2dyYW0sIFRyYW5zYWN0aW9uLCBUcmFuc2FjdGlvbkV4cGlyZWRCbG9ja2hlaWdodEV4Y2VlZGVkRXJyb3IsIFRyYW5zYWN0aW9uRXhwaXJlZE5vbmNlSW52YWxpZEVycm9yLCBUcmFuc2FjdGlvbkV4cGlyZWRUaW1lb3V0RXJyb3IsIFRyYW5zYWN0aW9uSW5zdHJ1Y3Rpb24sIFRyYW5zYWN0aW9uTWVzc2FnZSwgVHJhbnNhY3Rpb25TdGF0dXMsIFZBTElEQVRPUl9JTkZPX0tFWSwgVkVSU0lPTl9QUkVGSVhfTUFTSywgVk9URV9QUk9HUkFNX0lELCBWYWxpZGF0b3JJbmZvLCBWZXJzaW9uZWRNZXNzYWdlLCBWZXJzaW9uZWRUcmFuc2FjdGlvbiwgVm90ZUFjY291bnQsIFZvdGVBdXRob3JpemF0aW9uTGF5b3V0LCBWb3RlSW5pdCwgVm90ZUluc3RydWN0aW9uLCBWb3RlUHJvZ3JhbSwgY2x1c3RlckFwaVVybCwgc2VuZEFuZENvbmZpcm1SYXdUcmFuc2FjdGlvbiwgc2VuZEFuZENvbmZpcm1UcmFuc2FjdGlvbiB9O1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguYnJvd3Nlci5lc20uanMubWFwXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@solana/web3.js/lib/index.browser.esm.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@solana/web3.js/node_modules/base-x/src/index.js":
/*!***********************************************************************!*\
  !*** ./node_modules/@solana/web3.js/node_modules/base-x/src/index.js ***!
  \***********************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\n// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\n// @ts-ignore\nvar _Buffer = (__webpack_require__(/*! safe-buffer */ \"(app-pages-browser)/./node_modules/safe-buffer/index.js\").Buffer)\nfunction base (ALPHABET) {\n  if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n  var BASE_MAP = new Uint8Array(256)\n  for (var j = 0; j < BASE_MAP.length; j++) {\n    BASE_MAP[j] = 255\n  }\n  for (var i = 0; i < ALPHABET.length; i++) {\n    var x = ALPHABET.charAt(i)\n    var xc = x.charCodeAt(0)\n    if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n    BASE_MAP[xc] = i\n  }\n  var BASE = ALPHABET.length\n  var LEADER = ALPHABET.charAt(0)\n  var FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up\n  var iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up\n  function encode (source) {\n    if (Array.isArray(source) || source instanceof Uint8Array) { source = _Buffer.from(source) }\n    if (!_Buffer.isBuffer(source)) { throw new TypeError('Expected Buffer') }\n    if (source.length === 0) { return '' }\n        // Skip & count leading zeroes.\n    var zeroes = 0\n    var length = 0\n    var pbegin = 0\n    var pend = source.length\n    while (pbegin !== pend && source[pbegin] === 0) {\n      pbegin++\n      zeroes++\n    }\n        // Allocate enough space in big-endian base58 representation.\n    var size = ((pend - pbegin) * iFACTOR + 1) >>> 0\n    var b58 = new Uint8Array(size)\n        // Process the bytes.\n    while (pbegin !== pend) {\n      var carry = source[pbegin]\n            // Apply \"b58 = b58 * 256 + ch\".\n      var i = 0\n      for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n        carry += (256 * b58[it1]) >>> 0\n        b58[it1] = (carry % BASE) >>> 0\n        carry = (carry / BASE) >>> 0\n      }\n      if (carry !== 0) { throw new Error('Non-zero carry') }\n      length = i\n      pbegin++\n    }\n        // Skip leading zeroes in base58 result.\n    var it2 = size - length\n    while (it2 !== size && b58[it2] === 0) {\n      it2++\n    }\n        // Translate the result into a string.\n    var str = LEADER.repeat(zeroes)\n    for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]) }\n    return str\n  }\n  function decodeUnsafe (source) {\n    if (typeof source !== 'string') { throw new TypeError('Expected String') }\n    if (source.length === 0) { return _Buffer.alloc(0) }\n    var psz = 0\n        // Skip and count leading '1's.\n    var zeroes = 0\n    var length = 0\n    while (source[psz] === LEADER) {\n      zeroes++\n      psz++\n    }\n        // Allocate enough space in big-endian base256 representation.\n    var size = (((source.length - psz) * FACTOR) + 1) >>> 0 // log(58) / log(256), rounded up.\n    var b256 = new Uint8Array(size)\n        // Process the characters.\n    while (psz < source.length) {\n            // Find code of next character\n      var charCode = source.charCodeAt(psz)\n            // Base map can not be indexed using char code\n      if (charCode > 255) { return }\n            // Decode character\n      var carry = BASE_MAP[charCode]\n            // Invalid character\n      if (carry === 255) { return }\n      var i = 0\n      for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n        carry += (BASE * b256[it3]) >>> 0\n        b256[it3] = (carry % 256) >>> 0\n        carry = (carry / 256) >>> 0\n      }\n      if (carry !== 0) { throw new Error('Non-zero carry') }\n      length = i\n      psz++\n    }\n        // Skip leading zeroes in b256.\n    var it4 = size - length\n    while (it4 !== size && b256[it4] === 0) {\n      it4++\n    }\n    var vch = _Buffer.allocUnsafe(zeroes + (size - it4))\n    vch.fill(0x00, 0, zeroes)\n    var j = zeroes\n    while (it4 !== size) {\n      vch[j++] = b256[it4++]\n    }\n    return vch\n  }\n  function decode (string) {\n    var buffer = decodeUnsafe(string)\n    if (buffer) { return buffer }\n    throw new Error('Non-base' + BASE + ' character')\n  }\n  return {\n    encode: encode,\n    decodeUnsafe: decodeUnsafe,\n    decode: decode\n  }\n}\nmodule.exports = base\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac29sYW5hL3dlYjMuanMvbm9kZV9tb2R1bGVzL2Jhc2UteC9zcmMvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjLDBHQUE2QjtBQUMzQztBQUNBLGdDQUFnQztBQUNoQztBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBLGtCQUFrQixxQkFBcUI7QUFDdkM7QUFDQTtBQUNBLGdDQUFnQztBQUNoQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRTtBQUNqRSxxQ0FBcUM7QUFDckMsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsNkNBQTZDO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVyxZQUFZLFNBQVM7QUFDaEM7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDO0FBQ3RDLCtCQUErQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQSwrQkFBK0IsNkNBQTZDO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EseUJBQXlCO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvQHNvbGFuYS93ZWIzLmpzL25vZGVfbW9kdWxlcy9iYXNlLXgvc3JjL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0J1xuLy8gYmFzZS14IGVuY29kaW5nIC8gZGVjb2Rpbmdcbi8vIENvcHlyaWdodCAoYykgMjAxOCBiYXNlLXggY29udHJpYnV0b3JzXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTQtMjAxOCBUaGUgQml0Y29pbiBDb3JlIGRldmVsb3BlcnMgKGJhc2U1OC5jcHApXG4vLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIHNvZnR3YXJlIGxpY2Vuc2UsIHNlZSB0aGUgYWNjb21wYW55aW5nXG4vLyBmaWxlIExJQ0VOU0Ugb3IgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHAuXG4vLyBAdHMtaWdub3JlXG52YXIgX0J1ZmZlciA9IHJlcXVpcmUoJ3NhZmUtYnVmZmVyJykuQnVmZmVyXG5mdW5jdGlvbiBiYXNlIChBTFBIQUJFVCkge1xuICBpZiAoQUxQSEFCRVQubGVuZ3RoID49IDI1NSkgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdBbHBoYWJldCB0b28gbG9uZycpIH1cbiAgdmFyIEJBU0VfTUFQID0gbmV3IFVpbnQ4QXJyYXkoMjU2KVxuICBmb3IgKHZhciBqID0gMDsgaiA8IEJBU0VfTUFQLmxlbmd0aDsgaisrKSB7XG4gICAgQkFTRV9NQVBbal0gPSAyNTVcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IEFMUEhBQkVULmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHggPSBBTFBIQUJFVC5jaGFyQXQoaSlcbiAgICB2YXIgeGMgPSB4LmNoYXJDb2RlQXQoMClcbiAgICBpZiAoQkFTRV9NQVBbeGNdICE9PSAyNTUpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcih4ICsgJyBpcyBhbWJpZ3VvdXMnKSB9XG4gICAgQkFTRV9NQVBbeGNdID0gaVxuICB9XG4gIHZhciBCQVNFID0gQUxQSEFCRVQubGVuZ3RoXG4gIHZhciBMRUFERVIgPSBBTFBIQUJFVC5jaGFyQXQoMClcbiAgdmFyIEZBQ1RPUiA9IE1hdGgubG9nKEJBU0UpIC8gTWF0aC5sb2coMjU2KSAvLyBsb2coQkFTRSkgLyBsb2coMjU2KSwgcm91bmRlZCB1cFxuICB2YXIgaUZBQ1RPUiA9IE1hdGgubG9nKDI1NikgLyBNYXRoLmxvZyhCQVNFKSAvLyBsb2coMjU2KSAvIGxvZyhCQVNFKSwgcm91bmRlZCB1cFxuICBmdW5jdGlvbiBlbmNvZGUgKHNvdXJjZSkge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkgfHwgc291cmNlIGluc3RhbmNlb2YgVWludDhBcnJheSkgeyBzb3VyY2UgPSBfQnVmZmVyLmZyb20oc291cmNlKSB9XG4gICAgaWYgKCFfQnVmZmVyLmlzQnVmZmVyKHNvdXJjZSkpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgQnVmZmVyJykgfVxuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSB7IHJldHVybiAnJyB9XG4gICAgICAgIC8vIFNraXAgJiBjb3VudCBsZWFkaW5nIHplcm9lcy5cbiAgICB2YXIgemVyb2VzID0gMFxuICAgIHZhciBsZW5ndGggPSAwXG4gICAgdmFyIHBiZWdpbiA9IDBcbiAgICB2YXIgcGVuZCA9IHNvdXJjZS5sZW5ndGhcbiAgICB3aGlsZSAocGJlZ2luICE9PSBwZW5kICYmIHNvdXJjZVtwYmVnaW5dID09PSAwKSB7XG4gICAgICBwYmVnaW4rK1xuICAgICAgemVyb2VzKytcbiAgICB9XG4gICAgICAgIC8vIEFsbG9jYXRlIGVub3VnaCBzcGFjZSBpbiBiaWctZW5kaWFuIGJhc2U1OCByZXByZXNlbnRhdGlvbi5cbiAgICB2YXIgc2l6ZSA9ICgocGVuZCAtIHBiZWdpbikgKiBpRkFDVE9SICsgMSkgPj4+IDBcbiAgICB2YXIgYjU4ID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSlcbiAgICAgICAgLy8gUHJvY2VzcyB0aGUgYnl0ZXMuXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCkge1xuICAgICAgdmFyIGNhcnJ5ID0gc291cmNlW3BiZWdpbl1cbiAgICAgICAgICAgIC8vIEFwcGx5IFwiYjU4ID0gYjU4ICogMjU2ICsgY2hcIi5cbiAgICAgIHZhciBpID0gMFxuICAgICAgZm9yICh2YXIgaXQxID0gc2l6ZSAtIDE7IChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiAoaXQxICE9PSAtMSk7IGl0MS0tLCBpKyspIHtcbiAgICAgICAgY2FycnkgKz0gKDI1NiAqIGI1OFtpdDFdKSA+Pj4gMFxuICAgICAgICBiNThbaXQxXSA9IChjYXJyeSAlIEJBU0UpID4+PiAwXG4gICAgICAgIGNhcnJ5ID0gKGNhcnJ5IC8gQkFTRSkgPj4+IDBcbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoJ05vbi16ZXJvIGNhcnJ5JykgfVxuICAgICAgbGVuZ3RoID0gaVxuICAgICAgcGJlZ2luKytcbiAgICB9XG4gICAgICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYmFzZTU4IHJlc3VsdC5cbiAgICB2YXIgaXQyID0gc2l6ZSAtIGxlbmd0aFxuICAgIHdoaWxlIChpdDIgIT09IHNpemUgJiYgYjU4W2l0Ml0gPT09IDApIHtcbiAgICAgIGl0MisrXG4gICAgfVxuICAgICAgICAvLyBUcmFuc2xhdGUgdGhlIHJlc3VsdCBpbnRvIGEgc3RyaW5nLlxuICAgIHZhciBzdHIgPSBMRUFERVIucmVwZWF0KHplcm9lcylcbiAgICBmb3IgKDsgaXQyIDwgc2l6ZTsgKytpdDIpIHsgc3RyICs9IEFMUEhBQkVULmNoYXJBdChiNThbaXQyXSkgfVxuICAgIHJldHVybiBzdHJcbiAgfVxuICBmdW5jdGlvbiBkZWNvZGVVbnNhZmUgKHNvdXJjZSkge1xuICAgIGlmICh0eXBlb2Ygc291cmNlICE9PSAnc3RyaW5nJykgeyB0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCBTdHJpbmcnKSB9XG4gICAgaWYgKHNvdXJjZS5sZW5ndGggPT09IDApIHsgcmV0dXJuIF9CdWZmZXIuYWxsb2MoMCkgfVxuICAgIHZhciBwc3ogPSAwXG4gICAgICAgIC8vIFNraXAgYW5kIGNvdW50IGxlYWRpbmcgJzEncy5cbiAgICB2YXIgemVyb2VzID0gMFxuICAgIHZhciBsZW5ndGggPSAwXG4gICAgd2hpbGUgKHNvdXJjZVtwc3pdID09PSBMRUFERVIpIHtcbiAgICAgIHplcm9lcysrXG4gICAgICBwc3orK1xuICAgIH1cbiAgICAgICAgLy8gQWxsb2NhdGUgZW5vdWdoIHNwYWNlIGluIGJpZy1lbmRpYW4gYmFzZTI1NiByZXByZXNlbnRhdGlvbi5cbiAgICB2YXIgc2l6ZSA9ICgoKHNvdXJjZS5sZW5ndGggLSBwc3opICogRkFDVE9SKSArIDEpID4+PiAwIC8vIGxvZyg1OCkgLyBsb2coMjU2KSwgcm91bmRlZCB1cC5cbiAgICB2YXIgYjI1NiA9IG5ldyBVaW50OEFycmF5KHNpemUpXG4gICAgICAgIC8vIFByb2Nlc3MgdGhlIGNoYXJhY3RlcnMuXG4gICAgd2hpbGUgKHBzeiA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIEZpbmQgY29kZSBvZiBuZXh0IGNoYXJhY3RlclxuICAgICAgdmFyIGNoYXJDb2RlID0gc291cmNlLmNoYXJDb2RlQXQocHN6KVxuICAgICAgICAgICAgLy8gQmFzZSBtYXAgY2FuIG5vdCBiZSBpbmRleGVkIHVzaW5nIGNoYXIgY29kZVxuICAgICAgaWYgKGNoYXJDb2RlID4gMjU1KSB7IHJldHVybiB9XG4gICAgICAgICAgICAvLyBEZWNvZGUgY2hhcmFjdGVyXG4gICAgICB2YXIgY2FycnkgPSBCQVNFX01BUFtjaGFyQ29kZV1cbiAgICAgICAgICAgIC8vIEludmFsaWQgY2hhcmFjdGVyXG4gICAgICBpZiAoY2FycnkgPT09IDI1NSkgeyByZXR1cm4gfVxuICAgICAgdmFyIGkgPSAwXG4gICAgICBmb3IgKHZhciBpdDMgPSBzaXplIC0gMTsgKGNhcnJ5ICE9PSAwIHx8IGkgPCBsZW5ndGgpICYmIChpdDMgIT09IC0xKTsgaXQzLS0sIGkrKykge1xuICAgICAgICBjYXJyeSArPSAoQkFTRSAqIGIyNTZbaXQzXSkgPj4+IDBcbiAgICAgICAgYjI1NltpdDNdID0gKGNhcnJ5ICUgMjU2KSA+Pj4gMFxuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIDI1NikgPj4+IDBcbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoJ05vbi16ZXJvIGNhcnJ5JykgfVxuICAgICAgbGVuZ3RoID0gaVxuICAgICAgcHN6KytcbiAgICB9XG4gICAgICAgIC8vIFNraXAgbGVhZGluZyB6ZXJvZXMgaW4gYjI1Ni5cbiAgICB2YXIgaXQ0ID0gc2l6ZSAtIGxlbmd0aFxuICAgIHdoaWxlIChpdDQgIT09IHNpemUgJiYgYjI1NltpdDRdID09PSAwKSB7XG4gICAgICBpdDQrK1xuICAgIH1cbiAgICB2YXIgdmNoID0gX0J1ZmZlci5hbGxvY1Vuc2FmZSh6ZXJvZXMgKyAoc2l6ZSAtIGl0NCkpXG4gICAgdmNoLmZpbGwoMHgwMCwgMCwgemVyb2VzKVxuICAgIHZhciBqID0gemVyb2VzXG4gICAgd2hpbGUgKGl0NCAhPT0gc2l6ZSkge1xuICAgICAgdmNoW2orK10gPSBiMjU2W2l0NCsrXVxuICAgIH1cbiAgICByZXR1cm4gdmNoXG4gIH1cbiAgZnVuY3Rpb24gZGVjb2RlIChzdHJpbmcpIHtcbiAgICB2YXIgYnVmZmVyID0gZGVjb2RlVW5zYWZlKHN0cmluZylcbiAgICBpZiAoYnVmZmVyKSB7IHJldHVybiBidWZmZXIgfVxuICAgIHRocm93IG5ldyBFcnJvcignTm9uLWJhc2UnICsgQkFTRSArICcgY2hhcmFjdGVyJylcbiAgfVxuICByZXR1cm4ge1xuICAgIGVuY29kZTogZW5jb2RlLFxuICAgIGRlY29kZVVuc2FmZTogZGVjb2RlVW5zYWZlLFxuICAgIGRlY29kZTogZGVjb2RlXG4gIH1cbn1cbm1vZHVsZS5leHBvcnRzID0gYmFzZVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@solana/web3.js/node_modules/base-x/src/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/@solana/web3.js/node_modules/bs58/index.js":
/*!*****************************************************************!*\
  !*** ./node_modules/@solana/web3.js/node_modules/bs58/index.js ***!
  \*****************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
eval(__webpack_require__.ts("var basex = __webpack_require__(/*! base-x */ \"(app-pages-browser)/./node_modules/@solana/web3.js/node_modules/base-x/src/index.js\")\nvar ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\nmodule.exports = basex(ALPHABET)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9Ac29sYW5hL3dlYjMuanMvbm9kZV9tb2R1bGVzL2JzNTgvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxtQkFBTyxDQUFDLG1HQUFRO0FBQzVCOztBQUVBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL0Bzb2xhbmEvd2ViMy5qcy9ub2RlX21vZHVsZXMvYnM1OC9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgYmFzZXggPSByZXF1aXJlKCdiYXNlLXgnKVxudmFyIEFMUEhBQkVUID0gJzEyMzQ1Njc4OUFCQ0RFRkdISktMTU5QUVJTVFVWV1hZWmFiY2RlZmdoaWprbW5vcHFyc3R1dnd4eXonXG5cbm1vZHVsZS5leHBvcnRzID0gYmFzZXgoQUxQSEFCRVQpXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/@solana/web3.js/node_modules/bs58/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/base64-js/index.js":
/*!*****************************************!*\
  !*** ./node_modules/base64-js/index.js ***!
  \*****************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQVk7O0FBRVosa0JBQWtCO0FBQ2xCLG1CQUFtQjtBQUNuQixxQkFBcUI7O0FBRXJCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG1DQUFtQyxTQUFTO0FBQzVDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsU0FBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQ0FBMkMsVUFBVTtBQUNyRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG4vLyBTdXBwb3J0IGRlY29kaW5nIFVSTC1zYWZlIGJhc2U2NCBzdHJpbmdzLCBhcyBOb2RlLmpzIGRvZXMuXG4vLyBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Jhc2U2NCNVUkxfYXBwbGljYXRpb25zXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBnZXRMZW5zIChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcblxuICBpZiAobGVuICUgNCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RyaW5nLiBMZW5ndGggbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQnKVxuICB9XG5cbiAgLy8gVHJpbSBvZmYgZXh0cmEgYnl0ZXMgYWZ0ZXIgcGxhY2Vob2xkZXIgYnl0ZXMgYXJlIGZvdW5kXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2JlYXRnYW1taXQvYmFzZTY0LWpzL2lzc3Vlcy80MlxuICB2YXIgdmFsaWRMZW4gPSBiNjQuaW5kZXhPZignPScpXG4gIGlmICh2YWxpZExlbiA9PT0gLTEpIHZhbGlkTGVuID0gbGVuXG5cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IHZhbGlkTGVuID09PSBsZW5cbiAgICA/IDBcbiAgICA6IDQgLSAodmFsaWRMZW4gJSA0KVxuXG4gIHJldHVybiBbdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbl1cbn1cblxuLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgdmFyIGxlbnMgPSBnZXRMZW5zKGI2NClcbiAgdmFyIHZhbGlkTGVuID0gbGVuc1swXVxuICB2YXIgcGxhY2VIb2xkZXJzTGVuID0gbGVuc1sxXVxuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gX2J5dGVMZW5ndGggKGI2NCwgdmFsaWRMZW4sIHBsYWNlSG9sZGVyc0xlbikge1xuICByZXR1cm4gKCh2YWxpZExlbiArIHBsYWNlSG9sZGVyc0xlbikgKiAzIC8gNCkgLSBwbGFjZUhvbGRlcnNMZW5cbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW5zID0gZ2V0TGVucyhiNjQpXG4gIHZhciB2YWxpZExlbiA9IGxlbnNbMF1cbiAgdmFyIHBsYWNlSG9sZGVyc0xlbiA9IGxlbnNbMV1cblxuICB2YXIgYXJyID0gbmV3IEFycihfYnl0ZUxlbmd0aChiNjQsIHZhbGlkTGVuLCBwbGFjZUhvbGRlcnNMZW4pKVxuXG4gIHZhciBjdXJCeXRlID0gMFxuXG4gIC8vIGlmIHRoZXJlIGFyZSBwbGFjZWhvbGRlcnMsIG9ubHkgZ2V0IHVwIHRvIHRoZSBsYXN0IGNvbXBsZXRlIDQgY2hhcnNcbiAgdmFyIGxlbiA9IHBsYWNlSG9sZGVyc0xlbiA+IDBcbiAgICA/IHZhbGlkTGVuIC0gNFxuICAgIDogdmFsaWRMZW5cblxuICB2YXIgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICB0bXAgPVxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCAxMikgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHxcbiAgICAgIHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW2N1ckJ5dGUrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW2N1ckJ5dGUrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzTGVuID09PSAyKSB7XG4gICAgdG1wID1cbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDIpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltjdXJCeXRlKytdID0gdG1wICYgMHhGRlxuICB9XG5cbiAgaWYgKHBsYWNlSG9sZGVyc0xlbiA9PT0gMSkge1xuICAgIHRtcCA9XG4gICAgICAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfFxuICAgICAgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDQpIHxcbiAgICAgIChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltjdXJCeXRlKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbY3VyQnl0ZSsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArXG4gICAgbG9va3VwW251bSA+PiAxMiAmIDB4M0ZdICtcbiAgICBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArXG4gICAgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9XG4gICAgICAoKHVpbnQ4W2ldIDw8IDE2KSAmIDB4RkYwMDAwKSArXG4gICAgICAoKHVpbnQ4W2kgKyAxXSA8PCA4KSAmIDB4RkYwMCkgK1xuICAgICAgKHVpbnQ4W2kgKyAyXSAmIDB4RkYpXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgbG9va3VwW3RtcCA+PiAyXSArXG4gICAgICBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdICtcbiAgICAgICc9PSdcbiAgICApXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArIHVpbnQ4W2xlbiAtIDFdXG4gICAgcGFydHMucHVzaChcbiAgICAgIGxvb2t1cFt0bXAgPj4gMTBdICtcbiAgICAgIGxvb2t1cFsodG1wID4+IDQpICYgMHgzRl0gK1xuICAgICAgbG9va3VwWyh0bXAgPDwgMikgJiAweDNGXSArXG4gICAgICAnPSdcbiAgICApXG4gIH1cblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/base64-js/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/bn.js/lib/bn.js":
/*!**************************************!*\
  !*** ./node_modules/bn.js/lib/bn.js ***!
  \**************************************/
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
 
eval(__webpack_require__.ts("/* module decorator */ module = __webpack_require__.nmd(module);\n(function (module, exports) {\n  'use strict';\n\n  // Utils\n  function assert (val, msg) {\n    if (!val) throw new Error(msg || 'Assertion failed');\n  }\n\n  // Could use `inherits` module, but don't want to move from single file\n  // architecture yet.\n  function inherits (ctor, superCtor) {\n    ctor.super_ = superCtor;\n    var TempCtor = function () {};\n    TempCtor.prototype = superCtor.prototype;\n    ctor.prototype = new TempCtor();\n    ctor.prototype.constructor = ctor;\n  }\n\n  // BN\n\n  function BN (number, base, endian) {\n    if (BN.isBN(number)) {\n      return number;\n    }\n\n    this.negative = 0;\n    this.words = null;\n    this.length = 0;\n\n    // Reduction context\n    this.red = null;\n\n    if (number !== null) {\n      if (base === 'le' || base === 'be') {\n        endian = base;\n        base = 10;\n      }\n\n      this._init(number || 0, base || 10, endian || 'be');\n    }\n  }\n  if (typeof module === 'object') {\n    module.exports = BN;\n  } else {\n    exports.BN = BN;\n  }\n\n  BN.BN = BN;\n  BN.wordSize = 26;\n\n  var Buffer;\n  try {\n    if (typeof window !== 'undefined' && typeof window.Buffer !== 'undefined') {\n      Buffer = window.Buffer;\n    } else {\n      Buffer = (__webpack_require__(/*! buffer */ \"?f4e8\").Buffer);\n    }\n  } catch (e) {\n  }\n\n  BN.isBN = function isBN (num) {\n    if (num instanceof BN) {\n      return true;\n    }\n\n    return num !== null && typeof num === 'object' &&\n      num.constructor.wordSize === BN.wordSize && Array.isArray(num.words);\n  };\n\n  BN.max = function max (left, right) {\n    if (left.cmp(right) > 0) return left;\n    return right;\n  };\n\n  BN.min = function min (left, right) {\n    if (left.cmp(right) < 0) return left;\n    return right;\n  };\n\n  BN.prototype._init = function init (number, base, endian) {\n    if (typeof number === 'number') {\n      return this._initNumber(number, base, endian);\n    }\n\n    if (typeof number === 'object') {\n      return this._initArray(number, base, endian);\n    }\n\n    if (base === 'hex') {\n      base = 16;\n    }\n    assert(base === (base | 0) && base >= 2 && base <= 36);\n\n    number = number.toString().replace(/\\s+/g, '');\n    var start = 0;\n    if (number[0] === '-') {\n      start++;\n      this.negative = 1;\n    }\n\n    if (start < number.length) {\n      if (base === 16) {\n        this._parseHex(number, start, endian);\n      } else {\n        this._parseBase(number, base, start);\n        if (endian === 'le') {\n          this._initArray(this.toArray(), base, endian);\n        }\n      }\n    }\n  };\n\n  BN.prototype._initNumber = function _initNumber (number, base, endian) {\n    if (number < 0) {\n      this.negative = 1;\n      number = -number;\n    }\n    if (number < 0x4000000) {\n      this.words = [number & 0x3ffffff];\n      this.length = 1;\n    } else if (number < 0x10000000000000) {\n      this.words = [\n        number & 0x3ffffff,\n        (number / 0x4000000) & 0x3ffffff\n      ];\n      this.length = 2;\n    } else {\n      assert(number < 0x20000000000000); // 2 ^ 53 (unsafe)\n      this.words = [\n        number & 0x3ffffff,\n        (number / 0x4000000) & 0x3ffffff,\n        1\n      ];\n      this.length = 3;\n    }\n\n    if (endian !== 'le') return;\n\n    // Reverse the bytes\n    this._initArray(this.toArray(), base, endian);\n  };\n\n  BN.prototype._initArray = function _initArray (number, base, endian) {\n    // Perhaps a Uint8Array\n    assert(typeof number.length === 'number');\n    if (number.length <= 0) {\n      this.words = [0];\n      this.length = 1;\n      return this;\n    }\n\n    this.length = Math.ceil(number.length / 3);\n    this.words = new Array(this.length);\n    for (var i = 0; i < this.length; i++) {\n      this.words[i] = 0;\n    }\n\n    var j, w;\n    var off = 0;\n    if (endian === 'be') {\n      for (i = number.length - 1, j = 0; i >= 0; i -= 3) {\n        w = number[i] | (number[i - 1] << 8) | (number[i - 2] << 16);\n        this.words[j] |= (w << off) & 0x3ffffff;\n        this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n        off += 24;\n        if (off >= 26) {\n          off -= 26;\n          j++;\n        }\n      }\n    } else if (endian === 'le') {\n      for (i = 0, j = 0; i < number.length; i += 3) {\n        w = number[i] | (number[i + 1] << 8) | (number[i + 2] << 16);\n        this.words[j] |= (w << off) & 0x3ffffff;\n        this.words[j + 1] = (w >>> (26 - off)) & 0x3ffffff;\n        off += 24;\n        if (off >= 26) {\n          off -= 26;\n          j++;\n        }\n      }\n    }\n    return this._strip();\n  };\n\n  function parseHex4Bits (string, index) {\n    var c = string.charCodeAt(index);\n    // '0' - '9'\n    if (c >= 48 && c <= 57) {\n      return c - 48;\n    // 'A' - 'F'\n    } else if (c >= 65 && c <= 70) {\n      return c - 55;\n    // 'a' - 'f'\n    } else if (c >= 97 && c <= 102) {\n      return c - 87;\n    } else {\n      assert(false, 'Invalid character in ' + string);\n    }\n  }\n\n  function parseHexByte (string, lowerBound, index) {\n    var r = parseHex4Bits(string, index);\n    if (index - 1 >= lowerBound) {\n      r |= parseHex4Bits(string, index - 1) << 4;\n    }\n    return r;\n  }\n\n  BN.prototype._parseHex = function _parseHex (number, start, endian) {\n    // Create possibly bigger array to ensure that it fits the number\n    this.length = Math.ceil((number.length - start) / 6);\n    this.words = new Array(this.length);\n    for (var i = 0; i < this.length; i++) {\n      this.words[i] = 0;\n    }\n\n    // 24-bits chunks\n    var off = 0;\n    var j = 0;\n\n    var w;\n    if (endian === 'be') {\n      for (i = number.length - 1; i >= start; i -= 2) {\n        w = parseHexByte(number, start, i) << off;\n        this.words[j] |= w & 0x3ffffff;\n        if (off >= 18) {\n          off -= 18;\n          j += 1;\n          this.words[j] |= w >>> 26;\n        } else {\n          off += 8;\n        }\n      }\n    } else {\n      var parseLength = number.length - start;\n      for (i = parseLength % 2 === 0 ? start + 1 : start; i < number.length; i += 2) {\n        w = parseHexByte(number, start, i) << off;\n        this.words[j] |= w & 0x3ffffff;\n        if (off >= 18) {\n          off -= 18;\n          j += 1;\n          this.words[j] |= w >>> 26;\n        } else {\n          off += 8;\n        }\n      }\n    }\n\n    this._strip();\n  };\n\n  function parseBase (str, start, end, mul) {\n    var r = 0;\n    var b = 0;\n    var len = Math.min(str.length, end);\n    for (var i = start; i < len; i++) {\n      var c = str.charCodeAt(i) - 48;\n\n      r *= mul;\n\n      // 'a'\n      if (c >= 49) {\n        b = c - 49 + 0xa;\n\n      // 'A'\n      } else if (c >= 17) {\n        b = c - 17 + 0xa;\n\n      // '0' - '9'\n      } else {\n        b = c;\n      }\n      assert(c >= 0 && b < mul, 'Invalid character');\n      r += b;\n    }\n    return r;\n  }\n\n  BN.prototype._parseBase = function _parseBase (number, base, start) {\n    // Initialize as zero\n    this.words = [0];\n    this.length = 1;\n\n    // Find length of limb in base\n    for (var limbLen = 0, limbPow = 1; limbPow <= 0x3ffffff; limbPow *= base) {\n      limbLen++;\n    }\n    limbLen--;\n    limbPow = (limbPow / base) | 0;\n\n    var total = number.length - start;\n    var mod = total % limbLen;\n    var end = Math.min(total, total - mod) + start;\n\n    var word = 0;\n    for (var i = start; i < end; i += limbLen) {\n      word = parseBase(number, i, i + limbLen, base);\n\n      this.imuln(limbPow);\n      if (this.words[0] + word < 0x4000000) {\n        this.words[0] += word;\n      } else {\n        this._iaddn(word);\n      }\n    }\n\n    if (mod !== 0) {\n      var pow = 1;\n      word = parseBase(number, i, number.length, base);\n\n      for (i = 0; i < mod; i++) {\n        pow *= base;\n      }\n\n      this.imuln(pow);\n      if (this.words[0] + word < 0x4000000) {\n        this.words[0] += word;\n      } else {\n        this._iaddn(word);\n      }\n    }\n\n    this._strip();\n  };\n\n  BN.prototype.copy = function copy (dest) {\n    dest.words = new Array(this.length);\n    for (var i = 0; i < this.length; i++) {\n      dest.words[i] = this.words[i];\n    }\n    dest.length = this.length;\n    dest.negative = this.negative;\n    dest.red = this.red;\n  };\n\n  function move (dest, src) {\n    dest.words = src.words;\n    dest.length = src.length;\n    dest.negative = src.negative;\n    dest.red = src.red;\n  }\n\n  BN.prototype._move = function _move (dest) {\n    move(dest, this);\n  };\n\n  BN.prototype.clone = function clone () {\n    var r = new BN(null);\n    this.copy(r);\n    return r;\n  };\n\n  BN.prototype._expand = function _expand (size) {\n    while (this.length < size) {\n      this.words[this.length++] = 0;\n    }\n    return this;\n  };\n\n  // Remove leading `0` from `this`\n  BN.prototype._strip = function strip () {\n    while (this.length > 1 && this.words[this.length - 1] === 0) {\n      this.length--;\n    }\n    return this._normSign();\n  };\n\n  BN.prototype._normSign = function _normSign () {\n    // -0 = 0\n    if (this.length === 1 && this.words[0] === 0) {\n      this.negative = 0;\n    }\n    return this;\n  };\n\n  // Check Symbol.for because not everywhere where Symbol defined\n  // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol#Browser_compatibility\n  if (typeof Symbol !== 'undefined' && typeof Symbol.for === 'function') {\n    try {\n      BN.prototype[Symbol.for('nodejs.util.inspect.custom')] = inspect;\n    } catch (e) {\n      BN.prototype.inspect = inspect;\n    }\n  } else {\n    BN.prototype.inspect = inspect;\n  }\n\n  function inspect () {\n    return (this.red ? '<BN-R: ' : '<BN: ') + this.toString(16) + '>';\n  }\n\n  /*\n\n  var zeros = [];\n  var groupSizes = [];\n  var groupBases = [];\n\n  var s = '';\n  var i = -1;\n  while (++i < BN.wordSize) {\n    zeros[i] = s;\n    s += '0';\n  }\n  groupSizes[0] = 0;\n  groupSizes[1] = 0;\n  groupBases[0] = 0;\n  groupBases[1] = 0;\n  var base = 2 - 1;\n  while (++base < 36 + 1) {\n    var groupSize = 0;\n    var groupBase = 1;\n    while (groupBase < (1 << BN.wordSize) / base) {\n      groupBase *= base;\n      groupSize += 1;\n    }\n    groupSizes[base] = groupSize;\n    groupBases[base] = groupBase;\n  }\n\n  */\n\n  var zeros = [\n    '',\n    '0',\n    '00',\n    '000',\n    '0000',\n    '00000',\n    '000000',\n    '0000000',\n    '00000000',\n    '000000000',\n    '0000000000',\n    '00000000000',\n    '000000000000',\n    '0000000000000',\n    '00000000000000',\n    '000000000000000',\n    '0000000000000000',\n    '00000000000000000',\n    '000000000000000000',\n    '0000000000000000000',\n    '00000000000000000000',\n    '000000000000000000000',\n    '0000000000000000000000',\n    '00000000000000000000000',\n    '000000000000000000000000',\n    '0000000000000000000000000'\n  ];\n\n  var groupSizes = [\n    0, 0,\n    25, 16, 12, 11, 10, 9, 8,\n    8, 7, 7, 7, 7, 6, 6,\n    6, 6, 6, 6, 6, 5, 5,\n    5, 5, 5, 5, 5, 5, 5,\n    5, 5, 5, 5, 5, 5, 5\n  ];\n\n  var groupBases = [\n    0, 0,\n    33554432, 43046721, 16777216, 48828125, 60466176, 40353607, 16777216,\n    43046721, 10000000, 19487171, 35831808, 62748517, 7529536, 11390625,\n    16777216, 24137569, 34012224, 47045881, 64000000, 4084101, 5153632,\n    6436343, 7962624, 9765625, 11881376, 14348907, 17210368, 20511149,\n    24300000, 28629151, 33554432, 39135393, 45435424, 52521875, 60466176\n  ];\n\n  BN.prototype.toString = function toString (base, padding) {\n    base = base || 10;\n    padding = padding | 0 || 1;\n\n    var out;\n    if (base === 16 || base === 'hex') {\n      out = '';\n      var off = 0;\n      var carry = 0;\n      for (var i = 0; i < this.length; i++) {\n        var w = this.words[i];\n        var word = (((w << off) | carry) & 0xffffff).toString(16);\n        carry = (w >>> (24 - off)) & 0xffffff;\n        off += 2;\n        if (off >= 26) {\n          off -= 26;\n          i--;\n        }\n        if (carry !== 0 || i !== this.length - 1) {\n          out = zeros[6 - word.length] + word + out;\n        } else {\n          out = word + out;\n        }\n      }\n      if (carry !== 0) {\n        out = carry.toString(16) + out;\n      }\n      while (out.length % padding !== 0) {\n        out = '0' + out;\n      }\n      if (this.negative !== 0) {\n        out = '-' + out;\n      }\n      return out;\n    }\n\n    if (base === (base | 0) && base >= 2 && base <= 36) {\n      // var groupSize = Math.floor(BN.wordSize * Math.LN2 / Math.log(base));\n      var groupSize = groupSizes[base];\n      // var groupBase = Math.pow(base, groupSize);\n      var groupBase = groupBases[base];\n      out = '';\n      var c = this.clone();\n      c.negative = 0;\n      while (!c.isZero()) {\n        var r = c.modrn(groupBase).toString(base);\n        c = c.idivn(groupBase);\n\n        if (!c.isZero()) {\n          out = zeros[groupSize - r.length] + r + out;\n        } else {\n          out = r + out;\n        }\n      }\n      if (this.isZero()) {\n        out = '0' + out;\n      }\n      while (out.length % padding !== 0) {\n        out = '0' + out;\n      }\n      if (this.negative !== 0) {\n        out = '-' + out;\n      }\n      return out;\n    }\n\n    assert(false, 'Base should be between 2 and 36');\n  };\n\n  BN.prototype.toNumber = function toNumber () {\n    var ret = this.words[0];\n    if (this.length === 2) {\n      ret += this.words[1] * 0x4000000;\n    } else if (this.length === 3 && this.words[2] === 0x01) {\n      // NOTE: at this stage it is known that the top bit is set\n      ret += 0x10000000000000 + (this.words[1] * 0x4000000);\n    } else if (this.length > 2) {\n      assert(false, 'Number can only safely store up to 53 bits');\n    }\n    return (this.negative !== 0) ? -ret : ret;\n  };\n\n  BN.prototype.toJSON = function toJSON () {\n    return this.toString(16, 2);\n  };\n\n  if (Buffer) {\n    BN.prototype.toBuffer = function toBuffer (endian, length) {\n      return this.toArrayLike(Buffer, endian, length);\n    };\n  }\n\n  BN.prototype.toArray = function toArray (endian, length) {\n    return this.toArrayLike(Array, endian, length);\n  };\n\n  var allocate = function allocate (ArrayType, size) {\n    if (ArrayType.allocUnsafe) {\n      return ArrayType.allocUnsafe(size);\n    }\n    return new ArrayType(size);\n  };\n\n  BN.prototype.toArrayLike = function toArrayLike (ArrayType, endian, length) {\n    this._strip();\n\n    var byteLength = this.byteLength();\n    var reqLength = length || Math.max(1, byteLength);\n    assert(byteLength <= reqLength, 'byte array longer than desired length');\n    assert(reqLength > 0, 'Requested array length <= 0');\n\n    var res = allocate(ArrayType, reqLength);\n    var postfix = endian === 'le' ? 'LE' : 'BE';\n    this['_toArrayLike' + postfix](res, byteLength);\n    return res;\n  };\n\n  BN.prototype._toArrayLikeLE = function _toArrayLikeLE (res, byteLength) {\n    var position = 0;\n    var carry = 0;\n\n    for (var i = 0, shift = 0; i < this.length; i++) {\n      var word = (this.words[i] << shift) | carry;\n\n      res[position++] = word & 0xff;\n      if (position < res.length) {\n        res[position++] = (word >> 8) & 0xff;\n      }\n      if (position < res.length) {\n        res[position++] = (word >> 16) & 0xff;\n      }\n\n      if (shift === 6) {\n        if (position < res.length) {\n          res[position++] = (word >> 24) & 0xff;\n        }\n        carry = 0;\n        shift = 0;\n      } else {\n        carry = word >>> 24;\n        shift += 2;\n      }\n    }\n\n    if (position < res.length) {\n      res[position++] = carry;\n\n      while (position < res.length) {\n        res[position++] = 0;\n      }\n    }\n  };\n\n  BN.prototype._toArrayLikeBE = function _toArrayLikeBE (res, byteLength) {\n    var position = res.length - 1;\n    var carry = 0;\n\n    for (var i = 0, shift = 0; i < this.length; i++) {\n      var word = (this.words[i] << shift) | carry;\n\n      res[position--] = word & 0xff;\n      if (position >= 0) {\n        res[position--] = (word >> 8) & 0xff;\n      }\n      if (position >= 0) {\n        res[position--] = (word >> 16) & 0xff;\n      }\n\n      if (shift === 6) {\n        if (position >= 0) {\n          res[position--] = (word >> 24) & 0xff;\n        }\n        carry = 0;\n        shift = 0;\n      } else {\n        carry = word >>> 24;\n        shift += 2;\n      }\n    }\n\n    if (position >= 0) {\n      res[position--] = carry;\n\n      while (position >= 0) {\n        res[position--] = 0;\n      }\n    }\n  };\n\n  if (Math.clz32) {\n    BN.prototype._countBits = function _countBits (w) {\n      return 32 - Math.clz32(w);\n    };\n  } else {\n    BN.prototype._countBits = function _countBits (w) {\n      var t = w;\n      var r = 0;\n      if (t >= 0x1000) {\n        r += 13;\n        t >>>= 13;\n      }\n      if (t >= 0x40) {\n        r += 7;\n        t >>>= 7;\n      }\n      if (t >= 0x8) {\n        r += 4;\n        t >>>= 4;\n      }\n      if (t >= 0x02) {\n        r += 2;\n        t >>>= 2;\n      }\n      return r + t;\n    };\n  }\n\n  BN.prototype._zeroBits = function _zeroBits (w) {\n    // Short-cut\n    if (w === 0) return 26;\n\n    var t = w;\n    var r = 0;\n    if ((t & 0x1fff) === 0) {\n      r += 13;\n      t >>>= 13;\n    }\n    if ((t & 0x7f) === 0) {\n      r += 7;\n      t >>>= 7;\n    }\n    if ((t & 0xf) === 0) {\n      r += 4;\n      t >>>= 4;\n    }\n    if ((t & 0x3) === 0) {\n      r += 2;\n      t >>>= 2;\n    }\n    if ((t & 0x1) === 0) {\n      r++;\n    }\n    return r;\n  };\n\n  // Return number of used bits in a BN\n  BN.prototype.bitLength = function bitLength () {\n    var w = this.words[this.length - 1];\n    var hi = this._countBits(w);\n    return (this.length - 1) * 26 + hi;\n  };\n\n  function toBitArray (num) {\n    var w = new Array(num.bitLength());\n\n    for (var bit = 0; bit < w.length; bit++) {\n      var off = (bit / 26) | 0;\n      var wbit = bit % 26;\n\n      w[bit] = (num.words[off] >>> wbit) & 0x01;\n    }\n\n    return w;\n  }\n\n  // Number of trailing zero bits\n  BN.prototype.zeroBits = function zeroBits () {\n    if (this.isZero()) return 0;\n\n    var r = 0;\n    for (var i = 0; i < this.length; i++) {\n      var b = this._zeroBits(this.words[i]);\n      r += b;\n      if (b !== 26) break;\n    }\n    return r;\n  };\n\n  BN.prototype.byteLength = function byteLength () {\n    return Math.ceil(this.bitLength() / 8);\n  };\n\n  BN.prototype.toTwos = function toTwos (width) {\n    if (this.negative !== 0) {\n      return this.abs().inotn(width).iaddn(1);\n    }\n    return this.clone();\n  };\n\n  BN.prototype.fromTwos = function fromTwos (width) {\n    if (this.testn(width - 1)) {\n      return this.notn(width).iaddn(1).ineg();\n    }\n    return this.clone();\n  };\n\n  BN.prototype.isNeg = function isNeg () {\n    return this.negative !== 0;\n  };\n\n  // Return negative clone of `this`\n  BN.prototype.neg = function neg () {\n    return this.clone().ineg();\n  };\n\n  BN.prototype.ineg = function ineg () {\n    if (!this.isZero()) {\n      this.negative ^= 1;\n    }\n\n    return this;\n  };\n\n  // Or `num` with `this` in-place\n  BN.prototype.iuor = function iuor (num) {\n    while (this.length < num.length) {\n      this.words[this.length++] = 0;\n    }\n\n    for (var i = 0; i < num.length; i++) {\n      this.words[i] = this.words[i] | num.words[i];\n    }\n\n    return this._strip();\n  };\n\n  BN.prototype.ior = function ior (num) {\n    assert((this.negative | num.negative) === 0);\n    return this.iuor(num);\n  };\n\n  // Or `num` with `this`\n  BN.prototype.or = function or (num) {\n    if (this.length > num.length) return this.clone().ior(num);\n    return num.clone().ior(this);\n  };\n\n  BN.prototype.uor = function uor (num) {\n    if (this.length > num.length) return this.clone().iuor(num);\n    return num.clone().iuor(this);\n  };\n\n  // And `num` with `this` in-place\n  BN.prototype.iuand = function iuand (num) {\n    // b = min-length(num, this)\n    var b;\n    if (this.length > num.length) {\n      b = num;\n    } else {\n      b = this;\n    }\n\n    for (var i = 0; i < b.length; i++) {\n      this.words[i] = this.words[i] & num.words[i];\n    }\n\n    this.length = b.length;\n\n    return this._strip();\n  };\n\n  BN.prototype.iand = function iand (num) {\n    assert((this.negative | num.negative) === 0);\n    return this.iuand(num);\n  };\n\n  // And `num` with `this`\n  BN.prototype.and = function and (num) {\n    if (this.length > num.length) return this.clone().iand(num);\n    return num.clone().iand(this);\n  };\n\n  BN.prototype.uand = function uand (num) {\n    if (this.length > num.length) return this.clone().iuand(num);\n    return num.clone().iuand(this);\n  };\n\n  // Xor `num` with `this` in-place\n  BN.prototype.iuxor = function iuxor (num) {\n    // a.length > b.length\n    var a;\n    var b;\n    if (this.length > num.length) {\n      a = this;\n      b = num;\n    } else {\n      a = num;\n      b = this;\n    }\n\n    for (var i = 0; i < b.length; i++) {\n      this.words[i] = a.words[i] ^ b.words[i];\n    }\n\n    if (this !== a) {\n      for (; i < a.length; i++) {\n        this.words[i] = a.words[i];\n      }\n    }\n\n    this.length = a.length;\n\n    return this._strip();\n  };\n\n  BN.prototype.ixor = function ixor (num) {\n    assert((this.negative | num.negative) === 0);\n    return this.iuxor(num);\n  };\n\n  // Xor `num` with `this`\n  BN.prototype.xor = function xor (num) {\n    if (this.length > num.length) return this.clone().ixor(num);\n    return num.clone().ixor(this);\n  };\n\n  BN.prototype.uxor = function uxor (num) {\n    if (this.length > num.length) return this.clone().iuxor(num);\n    return num.clone().iuxor(this);\n  };\n\n  // Not ``this`` with ``width`` bitwidth\n  BN.prototype.inotn = function inotn (width) {\n    assert(typeof width === 'number' && width >= 0);\n\n    var bytesNeeded = Math.ceil(width / 26) | 0;\n    var bitsLeft = width % 26;\n\n    // Extend the buffer with leading zeroes\n    this._expand(bytesNeeded);\n\n    if (bitsLeft > 0) {\n      bytesNeeded--;\n    }\n\n    // Handle complete words\n    for (var i = 0; i < bytesNeeded; i++) {\n      this.words[i] = ~this.words[i] & 0x3ffffff;\n    }\n\n    // Handle the residue\n    if (bitsLeft > 0) {\n      this.words[i] = ~this.words[i] & (0x3ffffff >> (26 - bitsLeft));\n    }\n\n    // And remove leading zeroes\n    return this._strip();\n  };\n\n  BN.prototype.notn = function notn (width) {\n    return this.clone().inotn(width);\n  };\n\n  // Set `bit` of `this`\n  BN.prototype.setn = function setn (bit, val) {\n    assert(typeof bit === 'number' && bit >= 0);\n\n    var off = (bit / 26) | 0;\n    var wbit = bit % 26;\n\n    this._expand(off + 1);\n\n    if (val) {\n      this.words[off] = this.words[off] | (1 << wbit);\n    } else {\n      this.words[off] = this.words[off] & ~(1 << wbit);\n    }\n\n    return this._strip();\n  };\n\n  // Add `num` to `this` in-place\n  BN.prototype.iadd = function iadd (num) {\n    var r;\n\n    // negative + positive\n    if (this.negative !== 0 && num.negative === 0) {\n      this.negative = 0;\n      r = this.isub(num);\n      this.negative ^= 1;\n      return this._normSign();\n\n    // positive + negative\n    } else if (this.negative === 0 && num.negative !== 0) {\n      num.negative = 0;\n      r = this.isub(num);\n      num.negative = 1;\n      return r._normSign();\n    }\n\n    // a.length > b.length\n    var a, b;\n    if (this.length > num.length) {\n      a = this;\n      b = num;\n    } else {\n      a = num;\n      b = this;\n    }\n\n    var carry = 0;\n    for (var i = 0; i < b.length; i++) {\n      r = (a.words[i] | 0) + (b.words[i] | 0) + carry;\n      this.words[i] = r & 0x3ffffff;\n      carry = r >>> 26;\n    }\n    for (; carry !== 0 && i < a.length; i++) {\n      r = (a.words[i] | 0) + carry;\n      this.words[i] = r & 0x3ffffff;\n      carry = r >>> 26;\n    }\n\n    this.length = a.length;\n    if (carry !== 0) {\n      this.words[this.length] = carry;\n      this.length++;\n    // Copy the rest of the words\n    } else if (a !== this) {\n      for (; i < a.length; i++) {\n        this.words[i] = a.words[i];\n      }\n    }\n\n    return this;\n  };\n\n  // Add `num` to `this`\n  BN.prototype.add = function add (num) {\n    var res;\n    if (num.negative !== 0 && this.negative === 0) {\n      num.negative = 0;\n      res = this.sub(num);\n      num.negative ^= 1;\n      return res;\n    } else if (num.negative === 0 && this.negative !== 0) {\n      this.negative = 0;\n      res = num.sub(this);\n      this.negative = 1;\n      return res;\n    }\n\n    if (this.length > num.length) return this.clone().iadd(num);\n\n    return num.clone().iadd(this);\n  };\n\n  // Subtract `num` from `this` in-place\n  BN.prototype.isub = function isub (num) {\n    // this - (-num) = this + num\n    if (num.negative !== 0) {\n      num.negative = 0;\n      var r = this.iadd(num);\n      num.negative = 1;\n      return r._normSign();\n\n    // -this - num = -(this + num)\n    } else if (this.negative !== 0) {\n      this.negative = 0;\n      this.iadd(num);\n      this.negative = 1;\n      return this._normSign();\n    }\n\n    // At this point both numbers are positive\n    var cmp = this.cmp(num);\n\n    // Optimization - zeroify\n    if (cmp === 0) {\n      this.negative = 0;\n      this.length = 1;\n      this.words[0] = 0;\n      return this;\n    }\n\n    // a > b\n    var a, b;\n    if (cmp > 0) {\n      a = this;\n      b = num;\n    } else {\n      a = num;\n      b = this;\n    }\n\n    var carry = 0;\n    for (var i = 0; i < b.length; i++) {\n      r = (a.words[i] | 0) - (b.words[i] | 0) + carry;\n      carry = r >> 26;\n      this.words[i] = r & 0x3ffffff;\n    }\n    for (; carry !== 0 && i < a.length; i++) {\n      r = (a.words[i] | 0) + carry;\n      carry = r >> 26;\n      this.words[i] = r & 0x3ffffff;\n    }\n\n    // Copy rest of the words\n    if (carry === 0 && i < a.length && a !== this) {\n      for (; i < a.length; i++) {\n        this.words[i] = a.words[i];\n      }\n    }\n\n    this.length = Math.max(this.length, i);\n\n    if (a !== this) {\n      this.negative = 1;\n    }\n\n    return this._strip();\n  };\n\n  // Subtract `num` from `this`\n  BN.prototype.sub = function sub (num) {\n    return this.clone().isub(num);\n  };\n\n  function smallMulTo (self, num, out) {\n    out.negative = num.negative ^ self.negative;\n    var len = (self.length + num.length) | 0;\n    out.length = len;\n    len = (len - 1) | 0;\n\n    // Peel one iteration (compiler can't do it, because of code complexity)\n    var a = self.words[0] | 0;\n    var b = num.words[0] | 0;\n    var r = a * b;\n\n    var lo = r & 0x3ffffff;\n    var carry = (r / 0x4000000) | 0;\n    out.words[0] = lo;\n\n    for (var k = 1; k < len; k++) {\n      // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n      // note that ncarry could be >= 0x3ffffff\n      var ncarry = carry >>> 26;\n      var rword = carry & 0x3ffffff;\n      var maxJ = Math.min(k, num.length - 1);\n      for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n        var i = (k - j) | 0;\n        a = self.words[i] | 0;\n        b = num.words[j] | 0;\n        r = a * b + rword;\n        ncarry += (r / 0x4000000) | 0;\n        rword = r & 0x3ffffff;\n      }\n      out.words[k] = rword | 0;\n      carry = ncarry | 0;\n    }\n    if (carry !== 0) {\n      out.words[k] = carry | 0;\n    } else {\n      out.length--;\n    }\n\n    return out._strip();\n  }\n\n  // TODO(indutny): it may be reasonable to omit it for users who don't need\n  // to work with 256-bit numbers, otherwise it gives 20% improvement for 256-bit\n  // multiplication (like elliptic secp256k1).\n  var comb10MulTo = function comb10MulTo (self, num, out) {\n    var a = self.words;\n    var b = num.words;\n    var o = out.words;\n    var c = 0;\n    var lo;\n    var mid;\n    var hi;\n    var a0 = a[0] | 0;\n    var al0 = a0 & 0x1fff;\n    var ah0 = a0 >>> 13;\n    var a1 = a[1] | 0;\n    var al1 = a1 & 0x1fff;\n    var ah1 = a1 >>> 13;\n    var a2 = a[2] | 0;\n    var al2 = a2 & 0x1fff;\n    var ah2 = a2 >>> 13;\n    var a3 = a[3] | 0;\n    var al3 = a3 & 0x1fff;\n    var ah3 = a3 >>> 13;\n    var a4 = a[4] | 0;\n    var al4 = a4 & 0x1fff;\n    var ah4 = a4 >>> 13;\n    var a5 = a[5] | 0;\n    var al5 = a5 & 0x1fff;\n    var ah5 = a5 >>> 13;\n    var a6 = a[6] | 0;\n    var al6 = a6 & 0x1fff;\n    var ah6 = a6 >>> 13;\n    var a7 = a[7] | 0;\n    var al7 = a7 & 0x1fff;\n    var ah7 = a7 >>> 13;\n    var a8 = a[8] | 0;\n    var al8 = a8 & 0x1fff;\n    var ah8 = a8 >>> 13;\n    var a9 = a[9] | 0;\n    var al9 = a9 & 0x1fff;\n    var ah9 = a9 >>> 13;\n    var b0 = b[0] | 0;\n    var bl0 = b0 & 0x1fff;\n    var bh0 = b0 >>> 13;\n    var b1 = b[1] | 0;\n    var bl1 = b1 & 0x1fff;\n    var bh1 = b1 >>> 13;\n    var b2 = b[2] | 0;\n    var bl2 = b2 & 0x1fff;\n    var bh2 = b2 >>> 13;\n    var b3 = b[3] | 0;\n    var bl3 = b3 & 0x1fff;\n    var bh3 = b3 >>> 13;\n    var b4 = b[4] | 0;\n    var bl4 = b4 & 0x1fff;\n    var bh4 = b4 >>> 13;\n    var b5 = b[5] | 0;\n    var bl5 = b5 & 0x1fff;\n    var bh5 = b5 >>> 13;\n    var b6 = b[6] | 0;\n    var bl6 = b6 & 0x1fff;\n    var bh6 = b6 >>> 13;\n    var b7 = b[7] | 0;\n    var bl7 = b7 & 0x1fff;\n    var bh7 = b7 >>> 13;\n    var b8 = b[8] | 0;\n    var bl8 = b8 & 0x1fff;\n    var bh8 = b8 >>> 13;\n    var b9 = b[9] | 0;\n    var bl9 = b9 & 0x1fff;\n    var bh9 = b9 >>> 13;\n\n    out.negative = self.negative ^ num.negative;\n    out.length = 19;\n    /* k = 0 */\n    lo = Math.imul(al0, bl0);\n    mid = Math.imul(al0, bh0);\n    mid = (mid + Math.imul(ah0, bl0)) | 0;\n    hi = Math.imul(ah0, bh0);\n    var w0 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w0 >>> 26)) | 0;\n    w0 &= 0x3ffffff;\n    /* k = 1 */\n    lo = Math.imul(al1, bl0);\n    mid = Math.imul(al1, bh0);\n    mid = (mid + Math.imul(ah1, bl0)) | 0;\n    hi = Math.imul(ah1, bh0);\n    lo = (lo + Math.imul(al0, bl1)) | 0;\n    mid = (mid + Math.imul(al0, bh1)) | 0;\n    mid = (mid + Math.imul(ah0, bl1)) | 0;\n    hi = (hi + Math.imul(ah0, bh1)) | 0;\n    var w1 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w1 >>> 26)) | 0;\n    w1 &= 0x3ffffff;\n    /* k = 2 */\n    lo = Math.imul(al2, bl0);\n    mid = Math.imul(al2, bh0);\n    mid = (mid + Math.imul(ah2, bl0)) | 0;\n    hi = Math.imul(ah2, bh0);\n    lo = (lo + Math.imul(al1, bl1)) | 0;\n    mid = (mid + Math.imul(al1, bh1)) | 0;\n    mid = (mid + Math.imul(ah1, bl1)) | 0;\n    hi = (hi + Math.imul(ah1, bh1)) | 0;\n    lo = (lo + Math.imul(al0, bl2)) | 0;\n    mid = (mid + Math.imul(al0, bh2)) | 0;\n    mid = (mid + Math.imul(ah0, bl2)) | 0;\n    hi = (hi + Math.imul(ah0, bh2)) | 0;\n    var w2 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w2 >>> 26)) | 0;\n    w2 &= 0x3ffffff;\n    /* k = 3 */\n    lo = Math.imul(al3, bl0);\n    mid = Math.imul(al3, bh0);\n    mid = (mid + Math.imul(ah3, bl0)) | 0;\n    hi = Math.imul(ah3, bh0);\n    lo = (lo + Math.imul(al2, bl1)) | 0;\n    mid = (mid + Math.imul(al2, bh1)) | 0;\n    mid = (mid + Math.imul(ah2, bl1)) | 0;\n    hi = (hi + Math.imul(ah2, bh1)) | 0;\n    lo = (lo + Math.imul(al1, bl2)) | 0;\n    mid = (mid + Math.imul(al1, bh2)) | 0;\n    mid = (mid + Math.imul(ah1, bl2)) | 0;\n    hi = (hi + Math.imul(ah1, bh2)) | 0;\n    lo = (lo + Math.imul(al0, bl3)) | 0;\n    mid = (mid + Math.imul(al0, bh3)) | 0;\n    mid = (mid + Math.imul(ah0, bl3)) | 0;\n    hi = (hi + Math.imul(ah0, bh3)) | 0;\n    var w3 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w3 >>> 26)) | 0;\n    w3 &= 0x3ffffff;\n    /* k = 4 */\n    lo = Math.imul(al4, bl0);\n    mid = Math.imul(al4, bh0);\n    mid = (mid + Math.imul(ah4, bl0)) | 0;\n    hi = Math.imul(ah4, bh0);\n    lo = (lo + Math.imul(al3, bl1)) | 0;\n    mid = (mid + Math.imul(al3, bh1)) | 0;\n    mid = (mid + Math.imul(ah3, bl1)) | 0;\n    hi = (hi + Math.imul(ah3, bh1)) | 0;\n    lo = (lo + Math.imul(al2, bl2)) | 0;\n    mid = (mid + Math.imul(al2, bh2)) | 0;\n    mid = (mid + Math.imul(ah2, bl2)) | 0;\n    hi = (hi + Math.imul(ah2, bh2)) | 0;\n    lo = (lo + Math.imul(al1, bl3)) | 0;\n    mid = (mid + Math.imul(al1, bh3)) | 0;\n    mid = (mid + Math.imul(ah1, bl3)) | 0;\n    hi = (hi + Math.imul(ah1, bh3)) | 0;\n    lo = (lo + Math.imul(al0, bl4)) | 0;\n    mid = (mid + Math.imul(al0, bh4)) | 0;\n    mid = (mid + Math.imul(ah0, bl4)) | 0;\n    hi = (hi + Math.imul(ah0, bh4)) | 0;\n    var w4 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w4 >>> 26)) | 0;\n    w4 &= 0x3ffffff;\n    /* k = 5 */\n    lo = Math.imul(al5, bl0);\n    mid = Math.imul(al5, bh0);\n    mid = (mid + Math.imul(ah5, bl0)) | 0;\n    hi = Math.imul(ah5, bh0);\n    lo = (lo + Math.imul(al4, bl1)) | 0;\n    mid = (mid + Math.imul(al4, bh1)) | 0;\n    mid = (mid + Math.imul(ah4, bl1)) | 0;\n    hi = (hi + Math.imul(ah4, bh1)) | 0;\n    lo = (lo + Math.imul(al3, bl2)) | 0;\n    mid = (mid + Math.imul(al3, bh2)) | 0;\n    mid = (mid + Math.imul(ah3, bl2)) | 0;\n    hi = (hi + Math.imul(ah3, bh2)) | 0;\n    lo = (lo + Math.imul(al2, bl3)) | 0;\n    mid = (mid + Math.imul(al2, bh3)) | 0;\n    mid = (mid + Math.imul(ah2, bl3)) | 0;\n    hi = (hi + Math.imul(ah2, bh3)) | 0;\n    lo = (lo + Math.imul(al1, bl4)) | 0;\n    mid = (mid + Math.imul(al1, bh4)) | 0;\n    mid = (mid + Math.imul(ah1, bl4)) | 0;\n    hi = (hi + Math.imul(ah1, bh4)) | 0;\n    lo = (lo + Math.imul(al0, bl5)) | 0;\n    mid = (mid + Math.imul(al0, bh5)) | 0;\n    mid = (mid + Math.imul(ah0, bl5)) | 0;\n    hi = (hi + Math.imul(ah0, bh5)) | 0;\n    var w5 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w5 >>> 26)) | 0;\n    w5 &= 0x3ffffff;\n    /* k = 6 */\n    lo = Math.imul(al6, bl0);\n    mid = Math.imul(al6, bh0);\n    mid = (mid + Math.imul(ah6, bl0)) | 0;\n    hi = Math.imul(ah6, bh0);\n    lo = (lo + Math.imul(al5, bl1)) | 0;\n    mid = (mid + Math.imul(al5, bh1)) | 0;\n    mid = (mid + Math.imul(ah5, bl1)) | 0;\n    hi = (hi + Math.imul(ah5, bh1)) | 0;\n    lo = (lo + Math.imul(al4, bl2)) | 0;\n    mid = (mid + Math.imul(al4, bh2)) | 0;\n    mid = (mid + Math.imul(ah4, bl2)) | 0;\n    hi = (hi + Math.imul(ah4, bh2)) | 0;\n    lo = (lo + Math.imul(al3, bl3)) | 0;\n    mid = (mid + Math.imul(al3, bh3)) | 0;\n    mid = (mid + Math.imul(ah3, bl3)) | 0;\n    hi = (hi + Math.imul(ah3, bh3)) | 0;\n    lo = (lo + Math.imul(al2, bl4)) | 0;\n    mid = (mid + Math.imul(al2, bh4)) | 0;\n    mid = (mid + Math.imul(ah2, bl4)) | 0;\n    hi = (hi + Math.imul(ah2, bh4)) | 0;\n    lo = (lo + Math.imul(al1, bl5)) | 0;\n    mid = (mid + Math.imul(al1, bh5)) | 0;\n    mid = (mid + Math.imul(ah1, bl5)) | 0;\n    hi = (hi + Math.imul(ah1, bh5)) | 0;\n    lo = (lo + Math.imul(al0, bl6)) | 0;\n    mid = (mid + Math.imul(al0, bh6)) | 0;\n    mid = (mid + Math.imul(ah0, bl6)) | 0;\n    hi = (hi + Math.imul(ah0, bh6)) | 0;\n    var w6 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w6 >>> 26)) | 0;\n    w6 &= 0x3ffffff;\n    /* k = 7 */\n    lo = Math.imul(al7, bl0);\n    mid = Math.imul(al7, bh0);\n    mid = (mid + Math.imul(ah7, bl0)) | 0;\n    hi = Math.imul(ah7, bh0);\n    lo = (lo + Math.imul(al6, bl1)) | 0;\n    mid = (mid + Math.imul(al6, bh1)) | 0;\n    mid = (mid + Math.imul(ah6, bl1)) | 0;\n    hi = (hi + Math.imul(ah6, bh1)) | 0;\n    lo = (lo + Math.imul(al5, bl2)) | 0;\n    mid = (mid + Math.imul(al5, bh2)) | 0;\n    mid = (mid + Math.imul(ah5, bl2)) | 0;\n    hi = (hi + Math.imul(ah5, bh2)) | 0;\n    lo = (lo + Math.imul(al4, bl3)) | 0;\n    mid = (mid + Math.imul(al4, bh3)) | 0;\n    mid = (mid + Math.imul(ah4, bl3)) | 0;\n    hi = (hi + Math.imul(ah4, bh3)) | 0;\n    lo = (lo + Math.imul(al3, bl4)) | 0;\n    mid = (mid + Math.imul(al3, bh4)) | 0;\n    mid = (mid + Math.imul(ah3, bl4)) | 0;\n    hi = (hi + Math.imul(ah3, bh4)) | 0;\n    lo = (lo + Math.imul(al2, bl5)) | 0;\n    mid = (mid + Math.imul(al2, bh5)) | 0;\n    mid = (mid + Math.imul(ah2, bl5)) | 0;\n    hi = (hi + Math.imul(ah2, bh5)) | 0;\n    lo = (lo + Math.imul(al1, bl6)) | 0;\n    mid = (mid + Math.imul(al1, bh6)) | 0;\n    mid = (mid + Math.imul(ah1, bl6)) | 0;\n    hi = (hi + Math.imul(ah1, bh6)) | 0;\n    lo = (lo + Math.imul(al0, bl7)) | 0;\n    mid = (mid + Math.imul(al0, bh7)) | 0;\n    mid = (mid + Math.imul(ah0, bl7)) | 0;\n    hi = (hi + Math.imul(ah0, bh7)) | 0;\n    var w7 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w7 >>> 26)) | 0;\n    w7 &= 0x3ffffff;\n    /* k = 8 */\n    lo = Math.imul(al8, bl0);\n    mid = Math.imul(al8, bh0);\n    mid = (mid + Math.imul(ah8, bl0)) | 0;\n    hi = Math.imul(ah8, bh0);\n    lo = (lo + Math.imul(al7, bl1)) | 0;\n    mid = (mid + Math.imul(al7, bh1)) | 0;\n    mid = (mid + Math.imul(ah7, bl1)) | 0;\n    hi = (hi + Math.imul(ah7, bh1)) | 0;\n    lo = (lo + Math.imul(al6, bl2)) | 0;\n    mid = (mid + Math.imul(al6, bh2)) | 0;\n    mid = (mid + Math.imul(ah6, bl2)) | 0;\n    hi = (hi + Math.imul(ah6, bh2)) | 0;\n    lo = (lo + Math.imul(al5, bl3)) | 0;\n    mid = (mid + Math.imul(al5, bh3)) | 0;\n    mid = (mid + Math.imul(ah5, bl3)) | 0;\n    hi = (hi + Math.imul(ah5, bh3)) | 0;\n    lo = (lo + Math.imul(al4, bl4)) | 0;\n    mid = (mid + Math.imul(al4, bh4)) | 0;\n    mid = (mid + Math.imul(ah4, bl4)) | 0;\n    hi = (hi + Math.imul(ah4, bh4)) | 0;\n    lo = (lo + Math.imul(al3, bl5)) | 0;\n    mid = (mid + Math.imul(al3, bh5)) | 0;\n    mid = (mid + Math.imul(ah3, bl5)) | 0;\n    hi = (hi + Math.imul(ah3, bh5)) | 0;\n    lo = (lo + Math.imul(al2, bl6)) | 0;\n    mid = (mid + Math.imul(al2, bh6)) | 0;\n    mid = (mid + Math.imul(ah2, bl6)) | 0;\n    hi = (hi + Math.imul(ah2, bh6)) | 0;\n    lo = (lo + Math.imul(al1, bl7)) | 0;\n    mid = (mid + Math.imul(al1, bh7)) | 0;\n    mid = (mid + Math.imul(ah1, bl7)) | 0;\n    hi = (hi + Math.imul(ah1, bh7)) | 0;\n    lo = (lo + Math.imul(al0, bl8)) | 0;\n    mid = (mid + Math.imul(al0, bh8)) | 0;\n    mid = (mid + Math.imul(ah0, bl8)) | 0;\n    hi = (hi + Math.imul(ah0, bh8)) | 0;\n    var w8 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w8 >>> 26)) | 0;\n    w8 &= 0x3ffffff;\n    /* k = 9 */\n    lo = Math.imul(al9, bl0);\n    mid = Math.imul(al9, bh0);\n    mid = (mid + Math.imul(ah9, bl0)) | 0;\n    hi = Math.imul(ah9, bh0);\n    lo = (lo + Math.imul(al8, bl1)) | 0;\n    mid = (mid + Math.imul(al8, bh1)) | 0;\n    mid = (mid + Math.imul(ah8, bl1)) | 0;\n    hi = (hi + Math.imul(ah8, bh1)) | 0;\n    lo = (lo + Math.imul(al7, bl2)) | 0;\n    mid = (mid + Math.imul(al7, bh2)) | 0;\n    mid = (mid + Math.imul(ah7, bl2)) | 0;\n    hi = (hi + Math.imul(ah7, bh2)) | 0;\n    lo = (lo + Math.imul(al6, bl3)) | 0;\n    mid = (mid + Math.imul(al6, bh3)) | 0;\n    mid = (mid + Math.imul(ah6, bl3)) | 0;\n    hi = (hi + Math.imul(ah6, bh3)) | 0;\n    lo = (lo + Math.imul(al5, bl4)) | 0;\n    mid = (mid + Math.imul(al5, bh4)) | 0;\n    mid = (mid + Math.imul(ah5, bl4)) | 0;\n    hi = (hi + Math.imul(ah5, bh4)) | 0;\n    lo = (lo + Math.imul(al4, bl5)) | 0;\n    mid = (mid + Math.imul(al4, bh5)) | 0;\n    mid = (mid + Math.imul(ah4, bl5)) | 0;\n    hi = (hi + Math.imul(ah4, bh5)) | 0;\n    lo = (lo + Math.imul(al3, bl6)) | 0;\n    mid = (mid + Math.imul(al3, bh6)) | 0;\n    mid = (mid + Math.imul(ah3, bl6)) | 0;\n    hi = (hi + Math.imul(ah3, bh6)) | 0;\n    lo = (lo + Math.imul(al2, bl7)) | 0;\n    mid = (mid + Math.imul(al2, bh7)) | 0;\n    mid = (mid + Math.imul(ah2, bl7)) | 0;\n    hi = (hi + Math.imul(ah2, bh7)) | 0;\n    lo = (lo + Math.imul(al1, bl8)) | 0;\n    mid = (mid + Math.imul(al1, bh8)) | 0;\n    mid = (mid + Math.imul(ah1, bl8)) | 0;\n    hi = (hi + Math.imul(ah1, bh8)) | 0;\n    lo = (lo + Math.imul(al0, bl9)) | 0;\n    mid = (mid + Math.imul(al0, bh9)) | 0;\n    mid = (mid + Math.imul(ah0, bl9)) | 0;\n    hi = (hi + Math.imul(ah0, bh9)) | 0;\n    var w9 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w9 >>> 26)) | 0;\n    w9 &= 0x3ffffff;\n    /* k = 10 */\n    lo = Math.imul(al9, bl1);\n    mid = Math.imul(al9, bh1);\n    mid = (mid + Math.imul(ah9, bl1)) | 0;\n    hi = Math.imul(ah9, bh1);\n    lo = (lo + Math.imul(al8, bl2)) | 0;\n    mid = (mid + Math.imul(al8, bh2)) | 0;\n    mid = (mid + Math.imul(ah8, bl2)) | 0;\n    hi = (hi + Math.imul(ah8, bh2)) | 0;\n    lo = (lo + Math.imul(al7, bl3)) | 0;\n    mid = (mid + Math.imul(al7, bh3)) | 0;\n    mid = (mid + Math.imul(ah7, bl3)) | 0;\n    hi = (hi + Math.imul(ah7, bh3)) | 0;\n    lo = (lo + Math.imul(al6, bl4)) | 0;\n    mid = (mid + Math.imul(al6, bh4)) | 0;\n    mid = (mid + Math.imul(ah6, bl4)) | 0;\n    hi = (hi + Math.imul(ah6, bh4)) | 0;\n    lo = (lo + Math.imul(al5, bl5)) | 0;\n    mid = (mid + Math.imul(al5, bh5)) | 0;\n    mid = (mid + Math.imul(ah5, bl5)) | 0;\n    hi = (hi + Math.imul(ah5, bh5)) | 0;\n    lo = (lo + Math.imul(al4, bl6)) | 0;\n    mid = (mid + Math.imul(al4, bh6)) | 0;\n    mid = (mid + Math.imul(ah4, bl6)) | 0;\n    hi = (hi + Math.imul(ah4, bh6)) | 0;\n    lo = (lo + Math.imul(al3, bl7)) | 0;\n    mid = (mid + Math.imul(al3, bh7)) | 0;\n    mid = (mid + Math.imul(ah3, bl7)) | 0;\n    hi = (hi + Math.imul(ah3, bh7)) | 0;\n    lo = (lo + Math.imul(al2, bl8)) | 0;\n    mid = (mid + Math.imul(al2, bh8)) | 0;\n    mid = (mid + Math.imul(ah2, bl8)) | 0;\n    hi = (hi + Math.imul(ah2, bh8)) | 0;\n    lo = (lo + Math.imul(al1, bl9)) | 0;\n    mid = (mid + Math.imul(al1, bh9)) | 0;\n    mid = (mid + Math.imul(ah1, bl9)) | 0;\n    hi = (hi + Math.imul(ah1, bh9)) | 0;\n    var w10 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w10 >>> 26)) | 0;\n    w10 &= 0x3ffffff;\n    /* k = 11 */\n    lo = Math.imul(al9, bl2);\n    mid = Math.imul(al9, bh2);\n    mid = (mid + Math.imul(ah9, bl2)) | 0;\n    hi = Math.imul(ah9, bh2);\n    lo = (lo + Math.imul(al8, bl3)) | 0;\n    mid = (mid + Math.imul(al8, bh3)) | 0;\n    mid = (mid + Math.imul(ah8, bl3)) | 0;\n    hi = (hi + Math.imul(ah8, bh3)) | 0;\n    lo = (lo + Math.imul(al7, bl4)) | 0;\n    mid = (mid + Math.imul(al7, bh4)) | 0;\n    mid = (mid + Math.imul(ah7, bl4)) | 0;\n    hi = (hi + Math.imul(ah7, bh4)) | 0;\n    lo = (lo + Math.imul(al6, bl5)) | 0;\n    mid = (mid + Math.imul(al6, bh5)) | 0;\n    mid = (mid + Math.imul(ah6, bl5)) | 0;\n    hi = (hi + Math.imul(ah6, bh5)) | 0;\n    lo = (lo + Math.imul(al5, bl6)) | 0;\n    mid = (mid + Math.imul(al5, bh6)) | 0;\n    mid = (mid + Math.imul(ah5, bl6)) | 0;\n    hi = (hi + Math.imul(ah5, bh6)) | 0;\n    lo = (lo + Math.imul(al4, bl7)) | 0;\n    mid = (mid + Math.imul(al4, bh7)) | 0;\n    mid = (mid + Math.imul(ah4, bl7)) | 0;\n    hi = (hi + Math.imul(ah4, bh7)) | 0;\n    lo = (lo + Math.imul(al3, bl8)) | 0;\n    mid = (mid + Math.imul(al3, bh8)) | 0;\n    mid = (mid + Math.imul(ah3, bl8)) | 0;\n    hi = (hi + Math.imul(ah3, bh8)) | 0;\n    lo = (lo + Math.imul(al2, bl9)) | 0;\n    mid = (mid + Math.imul(al2, bh9)) | 0;\n    mid = (mid + Math.imul(ah2, bl9)) | 0;\n    hi = (hi + Math.imul(ah2, bh9)) | 0;\n    var w11 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w11 >>> 26)) | 0;\n    w11 &= 0x3ffffff;\n    /* k = 12 */\n    lo = Math.imul(al9, bl3);\n    mid = Math.imul(al9, bh3);\n    mid = (mid + Math.imul(ah9, bl3)) | 0;\n    hi = Math.imul(ah9, bh3);\n    lo = (lo + Math.imul(al8, bl4)) | 0;\n    mid = (mid + Math.imul(al8, bh4)) | 0;\n    mid = (mid + Math.imul(ah8, bl4)) | 0;\n    hi = (hi + Math.imul(ah8, bh4)) | 0;\n    lo = (lo + Math.imul(al7, bl5)) | 0;\n    mid = (mid + Math.imul(al7, bh5)) | 0;\n    mid = (mid + Math.imul(ah7, bl5)) | 0;\n    hi = (hi + Math.imul(ah7, bh5)) | 0;\n    lo = (lo + Math.imul(al6, bl6)) | 0;\n    mid = (mid + Math.imul(al6, bh6)) | 0;\n    mid = (mid + Math.imul(ah6, bl6)) | 0;\n    hi = (hi + Math.imul(ah6, bh6)) | 0;\n    lo = (lo + Math.imul(al5, bl7)) | 0;\n    mid = (mid + Math.imul(al5, bh7)) | 0;\n    mid = (mid + Math.imul(ah5, bl7)) | 0;\n    hi = (hi + Math.imul(ah5, bh7)) | 0;\n    lo = (lo + Math.imul(al4, bl8)) | 0;\n    mid = (mid + Math.imul(al4, bh8)) | 0;\n    mid = (mid + Math.imul(ah4, bl8)) | 0;\n    hi = (hi + Math.imul(ah4, bh8)) | 0;\n    lo = (lo + Math.imul(al3, bl9)) | 0;\n    mid = (mid + Math.imul(al3, bh9)) | 0;\n    mid = (mid + Math.imul(ah3, bl9)) | 0;\n    hi = (hi + Math.imul(ah3, bh9)) | 0;\n    var w12 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w12 >>> 26)) | 0;\n    w12 &= 0x3ffffff;\n    /* k = 13 */\n    lo = Math.imul(al9, bl4);\n    mid = Math.imul(al9, bh4);\n    mid = (mid + Math.imul(ah9, bl4)) | 0;\n    hi = Math.imul(ah9, bh4);\n    lo = (lo + Math.imul(al8, bl5)) | 0;\n    mid = (mid + Math.imul(al8, bh5)) | 0;\n    mid = (mid + Math.imul(ah8, bl5)) | 0;\n    hi = (hi + Math.imul(ah8, bh5)) | 0;\n    lo = (lo + Math.imul(al7, bl6)) | 0;\n    mid = (mid + Math.imul(al7, bh6)) | 0;\n    mid = (mid + Math.imul(ah7, bl6)) | 0;\n    hi = (hi + Math.imul(ah7, bh6)) | 0;\n    lo = (lo + Math.imul(al6, bl7)) | 0;\n    mid = (mid + Math.imul(al6, bh7)) | 0;\n    mid = (mid + Math.imul(ah6, bl7)) | 0;\n    hi = (hi + Math.imul(ah6, bh7)) | 0;\n    lo = (lo + Math.imul(al5, bl8)) | 0;\n    mid = (mid + Math.imul(al5, bh8)) | 0;\n    mid = (mid + Math.imul(ah5, bl8)) | 0;\n    hi = (hi + Math.imul(ah5, bh8)) | 0;\n    lo = (lo + Math.imul(al4, bl9)) | 0;\n    mid = (mid + Math.imul(al4, bh9)) | 0;\n    mid = (mid + Math.imul(ah4, bl9)) | 0;\n    hi = (hi + Math.imul(ah4, bh9)) | 0;\n    var w13 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w13 >>> 26)) | 0;\n    w13 &= 0x3ffffff;\n    /* k = 14 */\n    lo = Math.imul(al9, bl5);\n    mid = Math.imul(al9, bh5);\n    mid = (mid + Math.imul(ah9, bl5)) | 0;\n    hi = Math.imul(ah9, bh5);\n    lo = (lo + Math.imul(al8, bl6)) | 0;\n    mid = (mid + Math.imul(al8, bh6)) | 0;\n    mid = (mid + Math.imul(ah8, bl6)) | 0;\n    hi = (hi + Math.imul(ah8, bh6)) | 0;\n    lo = (lo + Math.imul(al7, bl7)) | 0;\n    mid = (mid + Math.imul(al7, bh7)) | 0;\n    mid = (mid + Math.imul(ah7, bl7)) | 0;\n    hi = (hi + Math.imul(ah7, bh7)) | 0;\n    lo = (lo + Math.imul(al6, bl8)) | 0;\n    mid = (mid + Math.imul(al6, bh8)) | 0;\n    mid = (mid + Math.imul(ah6, bl8)) | 0;\n    hi = (hi + Math.imul(ah6, bh8)) | 0;\n    lo = (lo + Math.imul(al5, bl9)) | 0;\n    mid = (mid + Math.imul(al5, bh9)) | 0;\n    mid = (mid + Math.imul(ah5, bl9)) | 0;\n    hi = (hi + Math.imul(ah5, bh9)) | 0;\n    var w14 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w14 >>> 26)) | 0;\n    w14 &= 0x3ffffff;\n    /* k = 15 */\n    lo = Math.imul(al9, bl6);\n    mid = Math.imul(al9, bh6);\n    mid = (mid + Math.imul(ah9, bl6)) | 0;\n    hi = Math.imul(ah9, bh6);\n    lo = (lo + Math.imul(al8, bl7)) | 0;\n    mid = (mid + Math.imul(al8, bh7)) | 0;\n    mid = (mid + Math.imul(ah8, bl7)) | 0;\n    hi = (hi + Math.imul(ah8, bh7)) | 0;\n    lo = (lo + Math.imul(al7, bl8)) | 0;\n    mid = (mid + Math.imul(al7, bh8)) | 0;\n    mid = (mid + Math.imul(ah7, bl8)) | 0;\n    hi = (hi + Math.imul(ah7, bh8)) | 0;\n    lo = (lo + Math.imul(al6, bl9)) | 0;\n    mid = (mid + Math.imul(al6, bh9)) | 0;\n    mid = (mid + Math.imul(ah6, bl9)) | 0;\n    hi = (hi + Math.imul(ah6, bh9)) | 0;\n    var w15 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w15 >>> 26)) | 0;\n    w15 &= 0x3ffffff;\n    /* k = 16 */\n    lo = Math.imul(al9, bl7);\n    mid = Math.imul(al9, bh7);\n    mid = (mid + Math.imul(ah9, bl7)) | 0;\n    hi = Math.imul(ah9, bh7);\n    lo = (lo + Math.imul(al8, bl8)) | 0;\n    mid = (mid + Math.imul(al8, bh8)) | 0;\n    mid = (mid + Math.imul(ah8, bl8)) | 0;\n    hi = (hi + Math.imul(ah8, bh8)) | 0;\n    lo = (lo + Math.imul(al7, bl9)) | 0;\n    mid = (mid + Math.imul(al7, bh9)) | 0;\n    mid = (mid + Math.imul(ah7, bl9)) | 0;\n    hi = (hi + Math.imul(ah7, bh9)) | 0;\n    var w16 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w16 >>> 26)) | 0;\n    w16 &= 0x3ffffff;\n    /* k = 17 */\n    lo = Math.imul(al9, bl8);\n    mid = Math.imul(al9, bh8);\n    mid = (mid + Math.imul(ah9, bl8)) | 0;\n    hi = Math.imul(ah9, bh8);\n    lo = (lo + Math.imul(al8, bl9)) | 0;\n    mid = (mid + Math.imul(al8, bh9)) | 0;\n    mid = (mid + Math.imul(ah8, bl9)) | 0;\n    hi = (hi + Math.imul(ah8, bh9)) | 0;\n    var w17 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w17 >>> 26)) | 0;\n    w17 &= 0x3ffffff;\n    /* k = 18 */\n    lo = Math.imul(al9, bl9);\n    mid = Math.imul(al9, bh9);\n    mid = (mid + Math.imul(ah9, bl9)) | 0;\n    hi = Math.imul(ah9, bh9);\n    var w18 = (((c + lo) | 0) + ((mid & 0x1fff) << 13)) | 0;\n    c = (((hi + (mid >>> 13)) | 0) + (w18 >>> 26)) | 0;\n    w18 &= 0x3ffffff;\n    o[0] = w0;\n    o[1] = w1;\n    o[2] = w2;\n    o[3] = w3;\n    o[4] = w4;\n    o[5] = w5;\n    o[6] = w6;\n    o[7] = w7;\n    o[8] = w8;\n    o[9] = w9;\n    o[10] = w10;\n    o[11] = w11;\n    o[12] = w12;\n    o[13] = w13;\n    o[14] = w14;\n    o[15] = w15;\n    o[16] = w16;\n    o[17] = w17;\n    o[18] = w18;\n    if (c !== 0) {\n      o[19] = c;\n      out.length++;\n    }\n    return out;\n  };\n\n  // Polyfill comb\n  if (!Math.imul) {\n    comb10MulTo = smallMulTo;\n  }\n\n  function bigMulTo (self, num, out) {\n    out.negative = num.negative ^ self.negative;\n    out.length = self.length + num.length;\n\n    var carry = 0;\n    var hncarry = 0;\n    for (var k = 0; k < out.length - 1; k++) {\n      // Sum all words with the same `i + j = k` and accumulate `ncarry`,\n      // note that ncarry could be >= 0x3ffffff\n      var ncarry = hncarry;\n      hncarry = 0;\n      var rword = carry & 0x3ffffff;\n      var maxJ = Math.min(k, num.length - 1);\n      for (var j = Math.max(0, k - self.length + 1); j <= maxJ; j++) {\n        var i = k - j;\n        var a = self.words[i] | 0;\n        var b = num.words[j] | 0;\n        var r = a * b;\n\n        var lo = r & 0x3ffffff;\n        ncarry = (ncarry + ((r / 0x4000000) | 0)) | 0;\n        lo = (lo + rword) | 0;\n        rword = lo & 0x3ffffff;\n        ncarry = (ncarry + (lo >>> 26)) | 0;\n\n        hncarry += ncarry >>> 26;\n        ncarry &= 0x3ffffff;\n      }\n      out.words[k] = rword;\n      carry = ncarry;\n      ncarry = hncarry;\n    }\n    if (carry !== 0) {\n      out.words[k] = carry;\n    } else {\n      out.length--;\n    }\n\n    return out._strip();\n  }\n\n  function jumboMulTo (self, num, out) {\n    // Temporary disable, see https://github.com/indutny/bn.js/issues/211\n    // var fftm = new FFTM();\n    // return fftm.mulp(self, num, out);\n    return bigMulTo(self, num, out);\n  }\n\n  BN.prototype.mulTo = function mulTo (num, out) {\n    var res;\n    var len = this.length + num.length;\n    if (this.length === 10 && num.length === 10) {\n      res = comb10MulTo(this, num, out);\n    } else if (len < 63) {\n      res = smallMulTo(this, num, out);\n    } else if (len < 1024) {\n      res = bigMulTo(this, num, out);\n    } else {\n      res = jumboMulTo(this, num, out);\n    }\n\n    return res;\n  };\n\n  // Cooley-Tukey algorithm for FFT\n  // slightly revisited to rely on looping instead of recursion\n\n  function FFTM (x, y) {\n    this.x = x;\n    this.y = y;\n  }\n\n  FFTM.prototype.makeRBT = function makeRBT (N) {\n    var t = new Array(N);\n    var l = BN.prototype._countBits(N) - 1;\n    for (var i = 0; i < N; i++) {\n      t[i] = this.revBin(i, l, N);\n    }\n\n    return t;\n  };\n\n  // Returns binary-reversed representation of `x`\n  FFTM.prototype.revBin = function revBin (x, l, N) {\n    if (x === 0 || x === N - 1) return x;\n\n    var rb = 0;\n    for (var i = 0; i < l; i++) {\n      rb |= (x & 1) << (l - i - 1);\n      x >>= 1;\n    }\n\n    return rb;\n  };\n\n  // Performs \"tweedling\" phase, therefore 'emulating'\n  // behaviour of the recursive algorithm\n  FFTM.prototype.permute = function permute (rbt, rws, iws, rtws, itws, N) {\n    for (var i = 0; i < N; i++) {\n      rtws[i] = rws[rbt[i]];\n      itws[i] = iws[rbt[i]];\n    }\n  };\n\n  FFTM.prototype.transform = function transform (rws, iws, rtws, itws, N, rbt) {\n    this.permute(rbt, rws, iws, rtws, itws, N);\n\n    for (var s = 1; s < N; s <<= 1) {\n      var l = s << 1;\n\n      var rtwdf = Math.cos(2 * Math.PI / l);\n      var itwdf = Math.sin(2 * Math.PI / l);\n\n      for (var p = 0; p < N; p += l) {\n        var rtwdf_ = rtwdf;\n        var itwdf_ = itwdf;\n\n        for (var j = 0; j < s; j++) {\n          var re = rtws[p + j];\n          var ie = itws[p + j];\n\n          var ro = rtws[p + j + s];\n          var io = itws[p + j + s];\n\n          var rx = rtwdf_ * ro - itwdf_ * io;\n\n          io = rtwdf_ * io + itwdf_ * ro;\n          ro = rx;\n\n          rtws[p + j] = re + ro;\n          itws[p + j] = ie + io;\n\n          rtws[p + j + s] = re - ro;\n          itws[p + j + s] = ie - io;\n\n          /* jshint maxdepth : false */\n          if (j !== l) {\n            rx = rtwdf * rtwdf_ - itwdf * itwdf_;\n\n            itwdf_ = rtwdf * itwdf_ + itwdf * rtwdf_;\n            rtwdf_ = rx;\n          }\n        }\n      }\n    }\n  };\n\n  FFTM.prototype.guessLen13b = function guessLen13b (n, m) {\n    var N = Math.max(m, n) | 1;\n    var odd = N & 1;\n    var i = 0;\n    for (N = N / 2 | 0; N; N = N >>> 1) {\n      i++;\n    }\n\n    return 1 << i + 1 + odd;\n  };\n\n  FFTM.prototype.conjugate = function conjugate (rws, iws, N) {\n    if (N <= 1) return;\n\n    for (var i = 0; i < N / 2; i++) {\n      var t = rws[i];\n\n      rws[i] = rws[N - i - 1];\n      rws[N - i - 1] = t;\n\n      t = iws[i];\n\n      iws[i] = -iws[N - i - 1];\n      iws[N - i - 1] = -t;\n    }\n  };\n\n  FFTM.prototype.normalize13b = function normalize13b (ws, N) {\n    var carry = 0;\n    for (var i = 0; i < N / 2; i++) {\n      var w = Math.round(ws[2 * i + 1] / N) * 0x2000 +\n        Math.round(ws[2 * i] / N) +\n        carry;\n\n      ws[i] = w & 0x3ffffff;\n\n      if (w < 0x4000000) {\n        carry = 0;\n      } else {\n        carry = w / 0x4000000 | 0;\n      }\n    }\n\n    return ws;\n  };\n\n  FFTM.prototype.convert13b = function convert13b (ws, len, rws, N) {\n    var carry = 0;\n    for (var i = 0; i < len; i++) {\n      carry = carry + (ws[i] | 0);\n\n      rws[2 * i] = carry & 0x1fff; carry = carry >>> 13;\n      rws[2 * i + 1] = carry & 0x1fff; carry = carry >>> 13;\n    }\n\n    // Pad with zeroes\n    for (i = 2 * len; i < N; ++i) {\n      rws[i] = 0;\n    }\n\n    assert(carry === 0);\n    assert((carry & ~0x1fff) === 0);\n  };\n\n  FFTM.prototype.stub = function stub (N) {\n    var ph = new Array(N);\n    for (var i = 0; i < N; i++) {\n      ph[i] = 0;\n    }\n\n    return ph;\n  };\n\n  FFTM.prototype.mulp = function mulp (x, y, out) {\n    var N = 2 * this.guessLen13b(x.length, y.length);\n\n    var rbt = this.makeRBT(N);\n\n    var _ = this.stub(N);\n\n    var rws = new Array(N);\n    var rwst = new Array(N);\n    var iwst = new Array(N);\n\n    var nrws = new Array(N);\n    var nrwst = new Array(N);\n    var niwst = new Array(N);\n\n    var rmws = out.words;\n    rmws.length = N;\n\n    this.convert13b(x.words, x.length, rws, N);\n    this.convert13b(y.words, y.length, nrws, N);\n\n    this.transform(rws, _, rwst, iwst, N, rbt);\n    this.transform(nrws, _, nrwst, niwst, N, rbt);\n\n    for (var i = 0; i < N; i++) {\n      var rx = rwst[i] * nrwst[i] - iwst[i] * niwst[i];\n      iwst[i] = rwst[i] * niwst[i] + iwst[i] * nrwst[i];\n      rwst[i] = rx;\n    }\n\n    this.conjugate(rwst, iwst, N);\n    this.transform(rwst, iwst, rmws, _, N, rbt);\n    this.conjugate(rmws, _, N);\n    this.normalize13b(rmws, N);\n\n    out.negative = x.negative ^ y.negative;\n    out.length = x.length + y.length;\n    return out._strip();\n  };\n\n  // Multiply `this` by `num`\n  BN.prototype.mul = function mul (num) {\n    var out = new BN(null);\n    out.words = new Array(this.length + num.length);\n    return this.mulTo(num, out);\n  };\n\n  // Multiply employing FFT\n  BN.prototype.mulf = function mulf (num) {\n    var out = new BN(null);\n    out.words = new Array(this.length + num.length);\n    return jumboMulTo(this, num, out);\n  };\n\n  // In-place Multiplication\n  BN.prototype.imul = function imul (num) {\n    return this.clone().mulTo(num, this);\n  };\n\n  BN.prototype.imuln = function imuln (num) {\n    var isNegNum = num < 0;\n    if (isNegNum) num = -num;\n\n    assert(typeof num === 'number');\n    assert(num < 0x4000000);\n\n    // Carry\n    var carry = 0;\n    for (var i = 0; i < this.length; i++) {\n      var w = (this.words[i] | 0) * num;\n      var lo = (w & 0x3ffffff) + (carry & 0x3ffffff);\n      carry >>= 26;\n      carry += (w / 0x4000000) | 0;\n      // NOTE: lo is 27bit maximum\n      carry += lo >>> 26;\n      this.words[i] = lo & 0x3ffffff;\n    }\n\n    if (carry !== 0) {\n      this.words[i] = carry;\n      this.length++;\n    }\n    this.length = num === 0 ? 1 : this.length;\n\n    return isNegNum ? this.ineg() : this;\n  };\n\n  BN.prototype.muln = function muln (num) {\n    return this.clone().imuln(num);\n  };\n\n  // `this` * `this`\n  BN.prototype.sqr = function sqr () {\n    return this.mul(this);\n  };\n\n  // `this` * `this` in-place\n  BN.prototype.isqr = function isqr () {\n    return this.imul(this.clone());\n  };\n\n  // Math.pow(`this`, `num`)\n  BN.prototype.pow = function pow (num) {\n    var w = toBitArray(num);\n    if (w.length === 0) return new BN(1);\n\n    // Skip leading zeroes\n    var res = this;\n    for (var i = 0; i < w.length; i++, res = res.sqr()) {\n      if (w[i] !== 0) break;\n    }\n\n    if (++i < w.length) {\n      for (var q = res.sqr(); i < w.length; i++, q = q.sqr()) {\n        if (w[i] === 0) continue;\n\n        res = res.mul(q);\n      }\n    }\n\n    return res;\n  };\n\n  // Shift-left in-place\n  BN.prototype.iushln = function iushln (bits) {\n    assert(typeof bits === 'number' && bits >= 0);\n    var r = bits % 26;\n    var s = (bits - r) / 26;\n    var carryMask = (0x3ffffff >>> (26 - r)) << (26 - r);\n    var i;\n\n    if (r !== 0) {\n      var carry = 0;\n\n      for (i = 0; i < this.length; i++) {\n        var newCarry = this.words[i] & carryMask;\n        var c = ((this.words[i] | 0) - newCarry) << r;\n        this.words[i] = c | carry;\n        carry = newCarry >>> (26 - r);\n      }\n\n      if (carry) {\n        this.words[i] = carry;\n        this.length++;\n      }\n    }\n\n    if (s !== 0) {\n      for (i = this.length - 1; i >= 0; i--) {\n        this.words[i + s] = this.words[i];\n      }\n\n      for (i = 0; i < s; i++) {\n        this.words[i] = 0;\n      }\n\n      this.length += s;\n    }\n\n    return this._strip();\n  };\n\n  BN.prototype.ishln = function ishln (bits) {\n    // TODO(indutny): implement me\n    assert(this.negative === 0);\n    return this.iushln(bits);\n  };\n\n  // Shift-right in-place\n  // NOTE: `hint` is a lowest bit before trailing zeroes\n  // NOTE: if `extended` is present - it will be filled with destroyed bits\n  BN.prototype.iushrn = function iushrn (bits, hint, extended) {\n    assert(typeof bits === 'number' && bits >= 0);\n    var h;\n    if (hint) {\n      h = (hint - (hint % 26)) / 26;\n    } else {\n      h = 0;\n    }\n\n    var r = bits % 26;\n    var s = Math.min((bits - r) / 26, this.length);\n    var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n    var maskedWords = extended;\n\n    h -= s;\n    h = Math.max(0, h);\n\n    // Extended mode, copy masked part\n    if (maskedWords) {\n      for (var i = 0; i < s; i++) {\n        maskedWords.words[i] = this.words[i];\n      }\n      maskedWords.length = s;\n    }\n\n    if (s === 0) {\n      // No-op, we should not move anything at all\n    } else if (this.length > s) {\n      this.length -= s;\n      for (i = 0; i < this.length; i++) {\n        this.words[i] = this.words[i + s];\n      }\n    } else {\n      this.words[0] = 0;\n      this.length = 1;\n    }\n\n    var carry = 0;\n    for (i = this.length - 1; i >= 0 && (carry !== 0 || i >= h); i--) {\n      var word = this.words[i] | 0;\n      this.words[i] = (carry << (26 - r)) | (word >>> r);\n      carry = word & mask;\n    }\n\n    // Push carried bits as a mask\n    if (maskedWords && carry !== 0) {\n      maskedWords.words[maskedWords.length++] = carry;\n    }\n\n    if (this.length === 0) {\n      this.words[0] = 0;\n      this.length = 1;\n    }\n\n    return this._strip();\n  };\n\n  BN.prototype.ishrn = function ishrn (bits, hint, extended) {\n    // TODO(indutny): implement me\n    assert(this.negative === 0);\n    return this.iushrn(bits, hint, extended);\n  };\n\n  // Shift-left\n  BN.prototype.shln = function shln (bits) {\n    return this.clone().ishln(bits);\n  };\n\n  BN.prototype.ushln = function ushln (bits) {\n    return this.clone().iushln(bits);\n  };\n\n  // Shift-right\n  BN.prototype.shrn = function shrn (bits) {\n    return this.clone().ishrn(bits);\n  };\n\n  BN.prototype.ushrn = function ushrn (bits) {\n    return this.clone().iushrn(bits);\n  };\n\n  // Test if n bit is set\n  BN.prototype.testn = function testn (bit) {\n    assert(typeof bit === 'number' && bit >= 0);\n    var r = bit % 26;\n    var s = (bit - r) / 26;\n    var q = 1 << r;\n\n    // Fast case: bit is much higher than all existing words\n    if (this.length <= s) return false;\n\n    // Check bit and return\n    var w = this.words[s];\n\n    return !!(w & q);\n  };\n\n  // Return only lowers bits of number (in-place)\n  BN.prototype.imaskn = function imaskn (bits) {\n    assert(typeof bits === 'number' && bits >= 0);\n    var r = bits % 26;\n    var s = (bits - r) / 26;\n\n    assert(this.negative === 0, 'imaskn works only with positive numbers');\n\n    if (this.length <= s) {\n      return this;\n    }\n\n    if (r !== 0) {\n      s++;\n    }\n    this.length = Math.min(s, this.length);\n\n    if (r !== 0) {\n      var mask = 0x3ffffff ^ ((0x3ffffff >>> r) << r);\n      this.words[this.length - 1] &= mask;\n    }\n\n    return this._strip();\n  };\n\n  // Return only lowers bits of number\n  BN.prototype.maskn = function maskn (bits) {\n    return this.clone().imaskn(bits);\n  };\n\n  // Add plain number `num` to `this`\n  BN.prototype.iaddn = function iaddn (num) {\n    assert(typeof num === 'number');\n    assert(num < 0x4000000);\n    if (num < 0) return this.isubn(-num);\n\n    // Possible sign change\n    if (this.negative !== 0) {\n      if (this.length === 1 && (this.words[0] | 0) <= num) {\n        this.words[0] = num - (this.words[0] | 0);\n        this.negative = 0;\n        return this;\n      }\n\n      this.negative = 0;\n      this.isubn(num);\n      this.negative = 1;\n      return this;\n    }\n\n    // Add without checks\n    return this._iaddn(num);\n  };\n\n  BN.prototype._iaddn = function _iaddn (num) {\n    this.words[0] += num;\n\n    // Carry\n    for (var i = 0; i < this.length && this.words[i] >= 0x4000000; i++) {\n      this.words[i] -= 0x4000000;\n      if (i === this.length - 1) {\n        this.words[i + 1] = 1;\n      } else {\n        this.words[i + 1]++;\n      }\n    }\n    this.length = Math.max(this.length, i + 1);\n\n    return this;\n  };\n\n  // Subtract plain number `num` from `this`\n  BN.prototype.isubn = function isubn (num) {\n    assert(typeof num === 'number');\n    assert(num < 0x4000000);\n    if (num < 0) return this.iaddn(-num);\n\n    if (this.negative !== 0) {\n      this.negative = 0;\n      this.iaddn(num);\n      this.negative = 1;\n      return this;\n    }\n\n    this.words[0] -= num;\n\n    if (this.length === 1 && this.words[0] < 0) {\n      this.words[0] = -this.words[0];\n      this.negative = 1;\n    } else {\n      // Carry\n      for (var i = 0; i < this.length && this.words[i] < 0; i++) {\n        this.words[i] += 0x4000000;\n        this.words[i + 1] -= 1;\n      }\n    }\n\n    return this._strip();\n  };\n\n  BN.prototype.addn = function addn (num) {\n    return this.clone().iaddn(num);\n  };\n\n  BN.prototype.subn = function subn (num) {\n    return this.clone().isubn(num);\n  };\n\n  BN.prototype.iabs = function iabs () {\n    this.negative = 0;\n\n    return this;\n  };\n\n  BN.prototype.abs = function abs () {\n    return this.clone().iabs();\n  };\n\n  BN.prototype._ishlnsubmul = function _ishlnsubmul (num, mul, shift) {\n    var len = num.length + shift;\n    var i;\n\n    this._expand(len);\n\n    var w;\n    var carry = 0;\n    for (i = 0; i < num.length; i++) {\n      w = (this.words[i + shift] | 0) + carry;\n      var right = (num.words[i] | 0) * mul;\n      w -= right & 0x3ffffff;\n      carry = (w >> 26) - ((right / 0x4000000) | 0);\n      this.words[i + shift] = w & 0x3ffffff;\n    }\n    for (; i < this.length - shift; i++) {\n      w = (this.words[i + shift] | 0) + carry;\n      carry = w >> 26;\n      this.words[i + shift] = w & 0x3ffffff;\n    }\n\n    if (carry === 0) return this._strip();\n\n    // Subtraction overflow\n    assert(carry === -1);\n    carry = 0;\n    for (i = 0; i < this.length; i++) {\n      w = -(this.words[i] | 0) + carry;\n      carry = w >> 26;\n      this.words[i] = w & 0x3ffffff;\n    }\n    this.negative = 1;\n\n    return this._strip();\n  };\n\n  BN.prototype._wordDiv = function _wordDiv (num, mode) {\n    var shift = this.length - num.length;\n\n    var a = this.clone();\n    var b = num;\n\n    // Normalize\n    var bhi = b.words[b.length - 1] | 0;\n    var bhiBits = this._countBits(bhi);\n    shift = 26 - bhiBits;\n    if (shift !== 0) {\n      b = b.ushln(shift);\n      a.iushln(shift);\n      bhi = b.words[b.length - 1] | 0;\n    }\n\n    // Initialize quotient\n    var m = a.length - b.length;\n    var q;\n\n    if (mode !== 'mod') {\n      q = new BN(null);\n      q.length = m + 1;\n      q.words = new Array(q.length);\n      for (var i = 0; i < q.length; i++) {\n        q.words[i] = 0;\n      }\n    }\n\n    var diff = a.clone()._ishlnsubmul(b, 1, m);\n    if (diff.negative === 0) {\n      a = diff;\n      if (q) {\n        q.words[m] = 1;\n      }\n    }\n\n    for (var j = m - 1; j >= 0; j--) {\n      var qj = (a.words[b.length + j] | 0) * 0x4000000 +\n        (a.words[b.length + j - 1] | 0);\n\n      // NOTE: (qj / bhi) is (0x3ffffff * 0x4000000 + 0x3ffffff) / 0x2000000 max\n      // (0x7ffffff)\n      qj = Math.min((qj / bhi) | 0, 0x3ffffff);\n\n      a._ishlnsubmul(b, qj, j);\n      while (a.negative !== 0) {\n        qj--;\n        a.negative = 0;\n        a._ishlnsubmul(b, 1, j);\n        if (!a.isZero()) {\n          a.negative ^= 1;\n        }\n      }\n      if (q) {\n        q.words[j] = qj;\n      }\n    }\n    if (q) {\n      q._strip();\n    }\n    a._strip();\n\n    // Denormalize\n    if (mode !== 'div' && shift !== 0) {\n      a.iushrn(shift);\n    }\n\n    return {\n      div: q || null,\n      mod: a\n    };\n  };\n\n  // NOTE: 1) `mode` can be set to `mod` to request mod only,\n  //       to `div` to request div only, or be absent to\n  //       request both div & mod\n  //       2) `positive` is true if unsigned mod is requested\n  BN.prototype.divmod = function divmod (num, mode, positive) {\n    assert(!num.isZero());\n\n    if (this.isZero()) {\n      return {\n        div: new BN(0),\n        mod: new BN(0)\n      };\n    }\n\n    var div, mod, res;\n    if (this.negative !== 0 && num.negative === 0) {\n      res = this.neg().divmod(num, mode);\n\n      if (mode !== 'mod') {\n        div = res.div.neg();\n      }\n\n      if (mode !== 'div') {\n        mod = res.mod.neg();\n        if (positive && mod.negative !== 0) {\n          mod.iadd(num);\n        }\n      }\n\n      return {\n        div: div,\n        mod: mod\n      };\n    }\n\n    if (this.negative === 0 && num.negative !== 0) {\n      res = this.divmod(num.neg(), mode);\n\n      if (mode !== 'mod') {\n        div = res.div.neg();\n      }\n\n      return {\n        div: div,\n        mod: res.mod\n      };\n    }\n\n    if ((this.negative & num.negative) !== 0) {\n      res = this.neg().divmod(num.neg(), mode);\n\n      if (mode !== 'div') {\n        mod = res.mod.neg();\n        if (positive && mod.negative !== 0) {\n          mod.isub(num);\n        }\n      }\n\n      return {\n        div: res.div,\n        mod: mod\n      };\n    }\n\n    // Both numbers are positive at this point\n\n    // Strip both numbers to approximate shift value\n    if (num.length > this.length || this.cmp(num) < 0) {\n      return {\n        div: new BN(0),\n        mod: this\n      };\n    }\n\n    // Very short reduction\n    if (num.length === 1) {\n      if (mode === 'div') {\n        return {\n          div: this.divn(num.words[0]),\n          mod: null\n        };\n      }\n\n      if (mode === 'mod') {\n        return {\n          div: null,\n          mod: new BN(this.modrn(num.words[0]))\n        };\n      }\n\n      return {\n        div: this.divn(num.words[0]),\n        mod: new BN(this.modrn(num.words[0]))\n      };\n    }\n\n    return this._wordDiv(num, mode);\n  };\n\n  // Find `this` / `num`\n  BN.prototype.div = function div (num) {\n    return this.divmod(num, 'div', false).div;\n  };\n\n  // Find `this` % `num`\n  BN.prototype.mod = function mod (num) {\n    return this.divmod(num, 'mod', false).mod;\n  };\n\n  BN.prototype.umod = function umod (num) {\n    return this.divmod(num, 'mod', true).mod;\n  };\n\n  // Find Round(`this` / `num`)\n  BN.prototype.divRound = function divRound (num) {\n    var dm = this.divmod(num);\n\n    // Fast case - exact division\n    if (dm.mod.isZero()) return dm.div;\n\n    var mod = dm.div.negative !== 0 ? dm.mod.isub(num) : dm.mod;\n\n    var half = num.ushrn(1);\n    var r2 = num.andln(1);\n    var cmp = mod.cmp(half);\n\n    // Round down\n    if (cmp < 0 || (r2 === 1 && cmp === 0)) return dm.div;\n\n    // Round up\n    return dm.div.negative !== 0 ? dm.div.isubn(1) : dm.div.iaddn(1);\n  };\n\n  BN.prototype.modrn = function modrn (num) {\n    var isNegNum = num < 0;\n    if (isNegNum) num = -num;\n\n    assert(num <= 0x3ffffff);\n    var p = (1 << 26) % num;\n\n    var acc = 0;\n    for (var i = this.length - 1; i >= 0; i--) {\n      acc = (p * acc + (this.words[i] | 0)) % num;\n    }\n\n    return isNegNum ? -acc : acc;\n  };\n\n  // WARNING: DEPRECATED\n  BN.prototype.modn = function modn (num) {\n    return this.modrn(num);\n  };\n\n  // In-place division by number\n  BN.prototype.idivn = function idivn (num) {\n    var isNegNum = num < 0;\n    if (isNegNum) num = -num;\n\n    assert(num <= 0x3ffffff);\n\n    var carry = 0;\n    for (var i = this.length - 1; i >= 0; i--) {\n      var w = (this.words[i] | 0) + carry * 0x4000000;\n      this.words[i] = (w / num) | 0;\n      carry = w % num;\n    }\n\n    this._strip();\n    return isNegNum ? this.ineg() : this;\n  };\n\n  BN.prototype.divn = function divn (num) {\n    return this.clone().idivn(num);\n  };\n\n  BN.prototype.egcd = function egcd (p) {\n    assert(p.negative === 0);\n    assert(!p.isZero());\n\n    var x = this;\n    var y = p.clone();\n\n    if (x.negative !== 0) {\n      x = x.umod(p);\n    } else {\n      x = x.clone();\n    }\n\n    // A * x + B * y = x\n    var A = new BN(1);\n    var B = new BN(0);\n\n    // C * x + D * y = y\n    var C = new BN(0);\n    var D = new BN(1);\n\n    var g = 0;\n\n    while (x.isEven() && y.isEven()) {\n      x.iushrn(1);\n      y.iushrn(1);\n      ++g;\n    }\n\n    var yp = y.clone();\n    var xp = x.clone();\n\n    while (!x.isZero()) {\n      for (var i = 0, im = 1; (x.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n      if (i > 0) {\n        x.iushrn(i);\n        while (i-- > 0) {\n          if (A.isOdd() || B.isOdd()) {\n            A.iadd(yp);\n            B.isub(xp);\n          }\n\n          A.iushrn(1);\n          B.iushrn(1);\n        }\n      }\n\n      for (var j = 0, jm = 1; (y.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n      if (j > 0) {\n        y.iushrn(j);\n        while (j-- > 0) {\n          if (C.isOdd() || D.isOdd()) {\n            C.iadd(yp);\n            D.isub(xp);\n          }\n\n          C.iushrn(1);\n          D.iushrn(1);\n        }\n      }\n\n      if (x.cmp(y) >= 0) {\n        x.isub(y);\n        A.isub(C);\n        B.isub(D);\n      } else {\n        y.isub(x);\n        C.isub(A);\n        D.isub(B);\n      }\n    }\n\n    return {\n      a: C,\n      b: D,\n      gcd: y.iushln(g)\n    };\n  };\n\n  // This is reduced incarnation of the binary EEA\n  // above, designated to invert members of the\n  // _prime_ fields F(p) at a maximal speed\n  BN.prototype._invmp = function _invmp (p) {\n    assert(p.negative === 0);\n    assert(!p.isZero());\n\n    var a = this;\n    var b = p.clone();\n\n    if (a.negative !== 0) {\n      a = a.umod(p);\n    } else {\n      a = a.clone();\n    }\n\n    var x1 = new BN(1);\n    var x2 = new BN(0);\n\n    var delta = b.clone();\n\n    while (a.cmpn(1) > 0 && b.cmpn(1) > 0) {\n      for (var i = 0, im = 1; (a.words[0] & im) === 0 && i < 26; ++i, im <<= 1);\n      if (i > 0) {\n        a.iushrn(i);\n        while (i-- > 0) {\n          if (x1.isOdd()) {\n            x1.iadd(delta);\n          }\n\n          x1.iushrn(1);\n        }\n      }\n\n      for (var j = 0, jm = 1; (b.words[0] & jm) === 0 && j < 26; ++j, jm <<= 1);\n      if (j > 0) {\n        b.iushrn(j);\n        while (j-- > 0) {\n          if (x2.isOdd()) {\n            x2.iadd(delta);\n          }\n\n          x2.iushrn(1);\n        }\n      }\n\n      if (a.cmp(b) >= 0) {\n        a.isub(b);\n        x1.isub(x2);\n      } else {\n        b.isub(a);\n        x2.isub(x1);\n      }\n    }\n\n    var res;\n    if (a.cmpn(1) === 0) {\n      res = x1;\n    } else {\n      res = x2;\n    }\n\n    if (res.cmpn(0) < 0) {\n      res.iadd(p);\n    }\n\n    return res;\n  };\n\n  BN.prototype.gcd = function gcd (num) {\n    if (this.isZero()) return num.abs();\n    if (num.isZero()) return this.abs();\n\n    var a = this.clone();\n    var b = num.clone();\n    a.negative = 0;\n    b.negative = 0;\n\n    // Remove common factor of two\n    for (var shift = 0; a.isEven() && b.isEven(); shift++) {\n      a.iushrn(1);\n      b.iushrn(1);\n    }\n\n    do {\n      while (a.isEven()) {\n        a.iushrn(1);\n      }\n      while (b.isEven()) {\n        b.iushrn(1);\n      }\n\n      var r = a.cmp(b);\n      if (r < 0) {\n        // Swap `a` and `b` to make `a` always bigger than `b`\n        var t = a;\n        a = b;\n        b = t;\n      } else if (r === 0 || b.cmpn(1) === 0) {\n        break;\n      }\n\n      a.isub(b);\n    } while (true);\n\n    return b.iushln(shift);\n  };\n\n  // Invert number in the field F(num)\n  BN.prototype.invm = function invm (num) {\n    return this.egcd(num).a.umod(num);\n  };\n\n  BN.prototype.isEven = function isEven () {\n    return (this.words[0] & 1) === 0;\n  };\n\n  BN.prototype.isOdd = function isOdd () {\n    return (this.words[0] & 1) === 1;\n  };\n\n  // And first word and num\n  BN.prototype.andln = function andln (num) {\n    return this.words[0] & num;\n  };\n\n  // Increment at the bit position in-line\n  BN.prototype.bincn = function bincn (bit) {\n    assert(typeof bit === 'number');\n    var r = bit % 26;\n    var s = (bit - r) / 26;\n    var q = 1 << r;\n\n    // Fast case: bit is much higher than all existing words\n    if (this.length <= s) {\n      this._expand(s + 1);\n      this.words[s] |= q;\n      return this;\n    }\n\n    // Add bit and propagate, if needed\n    var carry = q;\n    for (var i = s; carry !== 0 && i < this.length; i++) {\n      var w = this.words[i] | 0;\n      w += carry;\n      carry = w >>> 26;\n      w &= 0x3ffffff;\n      this.words[i] = w;\n    }\n    if (carry !== 0) {\n      this.words[i] = carry;\n      this.length++;\n    }\n    return this;\n  };\n\n  BN.prototype.isZero = function isZero () {\n    return this.length === 1 && this.words[0] === 0;\n  };\n\n  BN.prototype.cmpn = function cmpn (num) {\n    var negative = num < 0;\n\n    if (this.negative !== 0 && !negative) return -1;\n    if (this.negative === 0 && negative) return 1;\n\n    this._strip();\n\n    var res;\n    if (this.length > 1) {\n      res = 1;\n    } else {\n      if (negative) {\n        num = -num;\n      }\n\n      assert(num <= 0x3ffffff, 'Number is too big');\n\n      var w = this.words[0] | 0;\n      res = w === num ? 0 : w < num ? -1 : 1;\n    }\n    if (this.negative !== 0) return -res | 0;\n    return res;\n  };\n\n  // Compare two numbers and return:\n  // 1 - if `this` > `num`\n  // 0 - if `this` == `num`\n  // -1 - if `this` < `num`\n  BN.prototype.cmp = function cmp (num) {\n    if (this.negative !== 0 && num.negative === 0) return -1;\n    if (this.negative === 0 && num.negative !== 0) return 1;\n\n    var res = this.ucmp(num);\n    if (this.negative !== 0) return -res | 0;\n    return res;\n  };\n\n  // Unsigned comparison\n  BN.prototype.ucmp = function ucmp (num) {\n    // At this point both numbers have the same sign\n    if (this.length > num.length) return 1;\n    if (this.length < num.length) return -1;\n\n    var res = 0;\n    for (var i = this.length - 1; i >= 0; i--) {\n      var a = this.words[i] | 0;\n      var b = num.words[i] | 0;\n\n      if (a === b) continue;\n      if (a < b) {\n        res = -1;\n      } else if (a > b) {\n        res = 1;\n      }\n      break;\n    }\n    return res;\n  };\n\n  BN.prototype.gtn = function gtn (num) {\n    return this.cmpn(num) === 1;\n  };\n\n  BN.prototype.gt = function gt (num) {\n    return this.cmp(num) === 1;\n  };\n\n  BN.prototype.gten = function gten (num) {\n    return this.cmpn(num) >= 0;\n  };\n\n  BN.prototype.gte = function gte (num) {\n    return this.cmp(num) >= 0;\n  };\n\n  BN.prototype.ltn = function ltn (num) {\n    return this.cmpn(num) === -1;\n  };\n\n  BN.prototype.lt = function lt (num) {\n    return this.cmp(num) === -1;\n  };\n\n  BN.prototype.lten = function lten (num) {\n    return this.cmpn(num) <= 0;\n  };\n\n  BN.prototype.lte = function lte (num) {\n    return this.cmp(num) <= 0;\n  };\n\n  BN.prototype.eqn = function eqn (num) {\n    return this.cmpn(num) === 0;\n  };\n\n  BN.prototype.eq = function eq (num) {\n    return this.cmp(num) === 0;\n  };\n\n  //\n  // A reduce context, could be using montgomery or something better, depending\n  // on the `m` itself.\n  //\n  BN.red = function red (num) {\n    return new Red(num);\n  };\n\n  BN.prototype.toRed = function toRed (ctx) {\n    assert(!this.red, 'Already a number in reduction context');\n    assert(this.negative === 0, 'red works only with positives');\n    return ctx.convertTo(this)._forceRed(ctx);\n  };\n\n  BN.prototype.fromRed = function fromRed () {\n    assert(this.red, 'fromRed works only with numbers in reduction context');\n    return this.red.convertFrom(this);\n  };\n\n  BN.prototype._forceRed = function _forceRed (ctx) {\n    this.red = ctx;\n    return this;\n  };\n\n  BN.prototype.forceRed = function forceRed (ctx) {\n    assert(!this.red, 'Already a number in reduction context');\n    return this._forceRed(ctx);\n  };\n\n  BN.prototype.redAdd = function redAdd (num) {\n    assert(this.red, 'redAdd works only with red numbers');\n    return this.red.add(this, num);\n  };\n\n  BN.prototype.redIAdd = function redIAdd (num) {\n    assert(this.red, 'redIAdd works only with red numbers');\n    return this.red.iadd(this, num);\n  };\n\n  BN.prototype.redSub = function redSub (num) {\n    assert(this.red, 'redSub works only with red numbers');\n    return this.red.sub(this, num);\n  };\n\n  BN.prototype.redISub = function redISub (num) {\n    assert(this.red, 'redISub works only with red numbers');\n    return this.red.isub(this, num);\n  };\n\n  BN.prototype.redShl = function redShl (num) {\n    assert(this.red, 'redShl works only with red numbers');\n    return this.red.shl(this, num);\n  };\n\n  BN.prototype.redMul = function redMul (num) {\n    assert(this.red, 'redMul works only with red numbers');\n    this.red._verify2(this, num);\n    return this.red.mul(this, num);\n  };\n\n  BN.prototype.redIMul = function redIMul (num) {\n    assert(this.red, 'redMul works only with red numbers');\n    this.red._verify2(this, num);\n    return this.red.imul(this, num);\n  };\n\n  BN.prototype.redSqr = function redSqr () {\n    assert(this.red, 'redSqr works only with red numbers');\n    this.red._verify1(this);\n    return this.red.sqr(this);\n  };\n\n  BN.prototype.redISqr = function redISqr () {\n    assert(this.red, 'redISqr works only with red numbers');\n    this.red._verify1(this);\n    return this.red.isqr(this);\n  };\n\n  // Square root over p\n  BN.prototype.redSqrt = function redSqrt () {\n    assert(this.red, 'redSqrt works only with red numbers');\n    this.red._verify1(this);\n    return this.red.sqrt(this);\n  };\n\n  BN.prototype.redInvm = function redInvm () {\n    assert(this.red, 'redInvm works only with red numbers');\n    this.red._verify1(this);\n    return this.red.invm(this);\n  };\n\n  // Return negative clone of `this` % `red modulo`\n  BN.prototype.redNeg = function redNeg () {\n    assert(this.red, 'redNeg works only with red numbers');\n    this.red._verify1(this);\n    return this.red.neg(this);\n  };\n\n  BN.prototype.redPow = function redPow (num) {\n    assert(this.red && !num.red, 'redPow(normalNum)');\n    this.red._verify1(this);\n    return this.red.pow(this, num);\n  };\n\n  // Prime numbers with efficient reduction\n  var primes = {\n    k256: null,\n    p224: null,\n    p192: null,\n    p25519: null\n  };\n\n  // Pseudo-Mersenne prime\n  function MPrime (name, p) {\n    // P = 2 ^ N - K\n    this.name = name;\n    this.p = new BN(p, 16);\n    this.n = this.p.bitLength();\n    this.k = new BN(1).iushln(this.n).isub(this.p);\n\n    this.tmp = this._tmp();\n  }\n\n  MPrime.prototype._tmp = function _tmp () {\n    var tmp = new BN(null);\n    tmp.words = new Array(Math.ceil(this.n / 13));\n    return tmp;\n  };\n\n  MPrime.prototype.ireduce = function ireduce (num) {\n    // Assumes that `num` is less than `P^2`\n    // num = HI * (2 ^ N - K) + HI * K + LO = HI * K + LO (mod P)\n    var r = num;\n    var rlen;\n\n    do {\n      this.split(r, this.tmp);\n      r = this.imulK(r);\n      r = r.iadd(this.tmp);\n      rlen = r.bitLength();\n    } while (rlen > this.n);\n\n    var cmp = rlen < this.n ? -1 : r.ucmp(this.p);\n    if (cmp === 0) {\n      r.words[0] = 0;\n      r.length = 1;\n    } else if (cmp > 0) {\n      r.isub(this.p);\n    } else {\n      if (r.strip !== undefined) {\n        // r is a BN v4 instance\n        r.strip();\n      } else {\n        // r is a BN v5 instance\n        r._strip();\n      }\n    }\n\n    return r;\n  };\n\n  MPrime.prototype.split = function split (input, out) {\n    input.iushrn(this.n, 0, out);\n  };\n\n  MPrime.prototype.imulK = function imulK (num) {\n    return num.imul(this.k);\n  };\n\n  function K256 () {\n    MPrime.call(\n      this,\n      'k256',\n      'ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f');\n  }\n  inherits(K256, MPrime);\n\n  K256.prototype.split = function split (input, output) {\n    // 256 = 9 * 26 + 22\n    var mask = 0x3fffff;\n\n    var outLen = Math.min(input.length, 9);\n    for (var i = 0; i < outLen; i++) {\n      output.words[i] = input.words[i];\n    }\n    output.length = outLen;\n\n    if (input.length <= 9) {\n      input.words[0] = 0;\n      input.length = 1;\n      return;\n    }\n\n    // Shift by 9 limbs\n    var prev = input.words[9];\n    output.words[output.length++] = prev & mask;\n\n    for (i = 10; i < input.length; i++) {\n      var next = input.words[i] | 0;\n      input.words[i - 10] = ((next & mask) << 4) | (prev >>> 22);\n      prev = next;\n    }\n    prev >>>= 22;\n    input.words[i - 10] = prev;\n    if (prev === 0 && input.length > 10) {\n      input.length -= 10;\n    } else {\n      input.length -= 9;\n    }\n  };\n\n  K256.prototype.imulK = function imulK (num) {\n    // K = 0x1000003d1 = [ 0x40, 0x3d1 ]\n    num.words[num.length] = 0;\n    num.words[num.length + 1] = 0;\n    num.length += 2;\n\n    // bounded at: 0x40 * 0x3ffffff + 0x3d0 = 0x100000390\n    var lo = 0;\n    for (var i = 0; i < num.length; i++) {\n      var w = num.words[i] | 0;\n      lo += w * 0x3d1;\n      num.words[i] = lo & 0x3ffffff;\n      lo = w * 0x40 + ((lo / 0x4000000) | 0);\n    }\n\n    // Fast length reduction\n    if (num.words[num.length - 1] === 0) {\n      num.length--;\n      if (num.words[num.length - 1] === 0) {\n        num.length--;\n      }\n    }\n    return num;\n  };\n\n  function P224 () {\n    MPrime.call(\n      this,\n      'p224',\n      'ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001');\n  }\n  inherits(P224, MPrime);\n\n  function P192 () {\n    MPrime.call(\n      this,\n      'p192',\n      'ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff');\n  }\n  inherits(P192, MPrime);\n\n  function P25519 () {\n    // 2 ^ 255 - 19\n    MPrime.call(\n      this,\n      '25519',\n      '7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed');\n  }\n  inherits(P25519, MPrime);\n\n  P25519.prototype.imulK = function imulK (num) {\n    // K = 0x13\n    var carry = 0;\n    for (var i = 0; i < num.length; i++) {\n      var hi = (num.words[i] | 0) * 0x13 + carry;\n      var lo = hi & 0x3ffffff;\n      hi >>>= 26;\n\n      num.words[i] = lo;\n      carry = hi;\n    }\n    if (carry !== 0) {\n      num.words[num.length++] = carry;\n    }\n    return num;\n  };\n\n  // Exported mostly for testing purposes, use plain name instead\n  BN._prime = function prime (name) {\n    // Cached version of prime\n    if (primes[name]) return primes[name];\n\n    var prime;\n    if (name === 'k256') {\n      prime = new K256();\n    } else if (name === 'p224') {\n      prime = new P224();\n    } else if (name === 'p192') {\n      prime = new P192();\n    } else if (name === 'p25519') {\n      prime = new P25519();\n    } else {\n      throw new Error('Unknown prime ' + name);\n    }\n    primes[name] = prime;\n\n    return prime;\n  };\n\n  //\n  // Base reduction engine\n  //\n  function Red (m) {\n    if (typeof m === 'string') {\n      var prime = BN._prime(m);\n      this.m = prime.p;\n      this.prime = prime;\n    } else {\n      assert(m.gtn(1), 'modulus must be greater than 1');\n      this.m = m;\n      this.prime = null;\n    }\n  }\n\n  Red.prototype._verify1 = function _verify1 (a) {\n    assert(a.negative === 0, 'red works only with positives');\n    assert(a.red, 'red works only with red numbers');\n  };\n\n  Red.prototype._verify2 = function _verify2 (a, b) {\n    assert((a.negative | b.negative) === 0, 'red works only with positives');\n    assert(a.red && a.red === b.red,\n      'red works only with red numbers');\n  };\n\n  Red.prototype.imod = function imod (a) {\n    if (this.prime) return this.prime.ireduce(a)._forceRed(this);\n\n    move(a, a.umod(this.m)._forceRed(this));\n    return a;\n  };\n\n  Red.prototype.neg = function neg (a) {\n    if (a.isZero()) {\n      return a.clone();\n    }\n\n    return this.m.sub(a)._forceRed(this);\n  };\n\n  Red.prototype.add = function add (a, b) {\n    this._verify2(a, b);\n\n    var res = a.add(b);\n    if (res.cmp(this.m) >= 0) {\n      res.isub(this.m);\n    }\n    return res._forceRed(this);\n  };\n\n  Red.prototype.iadd = function iadd (a, b) {\n    this._verify2(a, b);\n\n    var res = a.iadd(b);\n    if (res.cmp(this.m) >= 0) {\n      res.isub(this.m);\n    }\n    return res;\n  };\n\n  Red.prototype.sub = function sub (a, b) {\n    this._verify2(a, b);\n\n    var res = a.sub(b);\n    if (res.cmpn(0) < 0) {\n      res.iadd(this.m);\n    }\n    return res._forceRed(this);\n  };\n\n  Red.prototype.isub = function isub (a, b) {\n    this._verify2(a, b);\n\n    var res = a.isub(b);\n    if (res.cmpn(0) < 0) {\n      res.iadd(this.m);\n    }\n    return res;\n  };\n\n  Red.prototype.shl = function shl (a, num) {\n    this._verify1(a);\n    return this.imod(a.ushln(num));\n  };\n\n  Red.prototype.imul = function imul (a, b) {\n    this._verify2(a, b);\n    return this.imod(a.imul(b));\n  };\n\n  Red.prototype.mul = function mul (a, b) {\n    this._verify2(a, b);\n    return this.imod(a.mul(b));\n  };\n\n  Red.prototype.isqr = function isqr (a) {\n    return this.imul(a, a.clone());\n  };\n\n  Red.prototype.sqr = function sqr (a) {\n    return this.mul(a, a);\n  };\n\n  Red.prototype.sqrt = function sqrt (a) {\n    if (a.isZero()) return a.clone();\n\n    var mod3 = this.m.andln(3);\n    assert(mod3 % 2 === 1);\n\n    // Fast case\n    if (mod3 === 3) {\n      var pow = this.m.add(new BN(1)).iushrn(2);\n      return this.pow(a, pow);\n    }\n\n    // Tonelli-Shanks algorithm (Totally unoptimized and slow)\n    //\n    // Find Q and S, that Q * 2 ^ S = (P - 1)\n    var q = this.m.subn(1);\n    var s = 0;\n    while (!q.isZero() && q.andln(1) === 0) {\n      s++;\n      q.iushrn(1);\n    }\n    assert(!q.isZero());\n\n    var one = new BN(1).toRed(this);\n    var nOne = one.redNeg();\n\n    // Find quadratic non-residue\n    // NOTE: Max is such because of generalized Riemann hypothesis.\n    var lpow = this.m.subn(1).iushrn(1);\n    var z = this.m.bitLength();\n    z = new BN(2 * z * z).toRed(this);\n\n    while (this.pow(z, lpow).cmp(nOne) !== 0) {\n      z.redIAdd(nOne);\n    }\n\n    var c = this.pow(z, q);\n    var r = this.pow(a, q.addn(1).iushrn(1));\n    var t = this.pow(a, q);\n    var m = s;\n    while (t.cmp(one) !== 0) {\n      var tmp = t;\n      for (var i = 0; tmp.cmp(one) !== 0; i++) {\n        tmp = tmp.redSqr();\n      }\n      assert(i < m);\n      var b = this.pow(c, new BN(1).iushln(m - i - 1));\n\n      r = r.redMul(b);\n      c = b.redSqr();\n      t = t.redMul(c);\n      m = i;\n    }\n\n    return r;\n  };\n\n  Red.prototype.invm = function invm (a) {\n    var inv = a._invmp(this.m);\n    if (inv.negative !== 0) {\n      inv.negative = 0;\n      return this.imod(inv).redNeg();\n    } else {\n      return this.imod(inv);\n    }\n  };\n\n  Red.prototype.pow = function pow (a, num) {\n    if (num.isZero()) return new BN(1).toRed(this);\n    if (num.cmpn(1) === 0) return a.clone();\n\n    var windowSize = 4;\n    var wnd = new Array(1 << windowSize);\n    wnd[0] = new BN(1).toRed(this);\n    wnd[1] = a;\n    for (var i = 2; i < wnd.length; i++) {\n      wnd[i] = this.mul(wnd[i - 1], a);\n    }\n\n    var res = wnd[0];\n    var current = 0;\n    var currentLen = 0;\n    var start = num.bitLength() % 26;\n    if (start === 0) {\n      start = 26;\n    }\n\n    for (i = num.length - 1; i >= 0; i--) {\n      var word = num.words[i];\n      for (var j = start - 1; j >= 0; j--) {\n        var bit = (word >> j) & 1;\n        if (res !== wnd[0]) {\n          res = this.sqr(res);\n        }\n\n        if (bit === 0 && current === 0) {\n          currentLen = 0;\n          continue;\n        }\n\n        current <<= 1;\n        current |= bit;\n        currentLen++;\n        if (currentLen !== windowSize && (i !== 0 || j !== 0)) continue;\n\n        res = this.mul(res, wnd[current]);\n        currentLen = 0;\n        current = 0;\n      }\n      start = 26;\n    }\n\n    return res;\n  };\n\n  Red.prototype.convertTo = function convertTo (num) {\n    var r = num.umod(this.m);\n\n    return r === num ? r.clone() : r;\n  };\n\n  Red.prototype.convertFrom = function convertFrom (num) {\n    var res = num.clone();\n    res.red = null;\n    return res;\n  };\n\n  //\n  // Montgomery method engine\n  //\n\n  BN.mont = function mont (num) {\n    return new Mont(num);\n  };\n\n  function Mont (m) {\n    Red.call(this, m);\n\n    this.shift = this.m.bitLength();\n    if (this.shift % 26 !== 0) {\n      this.shift += 26 - (this.shift % 26);\n    }\n\n    this.r = new BN(1).iushln(this.shift);\n    this.r2 = this.imod(this.r.sqr());\n    this.rinv = this.r._invmp(this.m);\n\n    this.minv = this.rinv.mul(this.r).isubn(1).div(this.m);\n    this.minv = this.minv.umod(this.r);\n    this.minv = this.r.sub(this.minv);\n  }\n  inherits(Mont, Red);\n\n  Mont.prototype.convertTo = function convertTo (num) {\n    return this.imod(num.ushln(this.shift));\n  };\n\n  Mont.prototype.convertFrom = function convertFrom (num) {\n    var r = this.imod(num.mul(this.rinv));\n    r.red = null;\n    return r;\n  };\n\n  Mont.prototype.imul = function imul (a, b) {\n    if (a.isZero() || b.isZero()) {\n      a.words[0] = 0;\n      a.length = 1;\n      return a;\n    }\n\n    var t = a.imul(b);\n    var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n    var u = t.isub(c).iushrn(this.shift);\n    var res = u;\n\n    if (u.cmp(this.m) >= 0) {\n      res = u.isub(this.m);\n    } else if (u.cmpn(0) < 0) {\n      res = u.iadd(this.m);\n    }\n\n    return res._forceRed(this);\n  };\n\n  Mont.prototype.mul = function mul (a, b) {\n    if (a.isZero() || b.isZero()) return new BN(0)._forceRed(this);\n\n    var t = a.mul(b);\n    var c = t.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m);\n    var u = t.isub(c).iushrn(this.shift);\n    var res = u;\n    if (u.cmp(this.m) >= 0) {\n      res = u.isub(this.m);\n    } else if (u.cmpn(0) < 0) {\n      res = u.iadd(this.m);\n    }\n\n    return res._forceRed(this);\n  };\n\n  Mont.prototype.invm = function invm (a) {\n    // (AR)^-1 * R^2 = (A^-1 * R^-1) * R^2 = A^-1 * R\n    var res = this.imod(a._invmp(this.m).mul(this.r2));\n    return res._forceRed(this);\n  };\n})( false || module, this);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9ibi5qcy9saWIvYm4uanMiLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04sZUFBZSxtREFBd0I7QUFDdkM7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTix5Q0FBeUM7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixpQkFBaUI7QUFDckM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUMsUUFBUTtBQUNqRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ04seUJBQXlCLG1CQUFtQjtBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLGlCQUFpQjtBQUNyQztBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esa0NBQWtDLFlBQVk7QUFDOUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLDBEQUEwRCxtQkFBbUI7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsU0FBUztBQUNqQzs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7O0FBRUE7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx1Q0FBdUMsc0JBQXNCO0FBQzdEO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLHdCQUF3QixTQUFTO0FBQ2pDOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxvQkFBb0IsaUJBQWlCO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLCtCQUErQixpQkFBaUI7QUFDaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsK0JBQStCLGlCQUFpQjtBQUNoRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQsV0FBVztBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixvQkFBb0I7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFELFdBQVc7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixPQUFPO0FBQzNCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7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QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCLGNBQWM7QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLHdCQUF3QixRQUFRO0FBQ2hDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esa0NBQWtDLFFBQVE7QUFDMUM7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0Esa0NBQWtDLFFBQVE7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSw4QkFBOEIsbUNBQW1DO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhCQUE4QixtQ0FBbUM7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQSw4QkFBOEIsbUNBQW1DO0FBQ2pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsOEJBQThCLG1DQUFtQztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSx3QkFBd0IsMEJBQTBCO0FBQ2xEO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTs7QUFFQTtBQUNBLE1BQU07O0FBRU47QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLG9CQUFvQixnQ0FBZ0M7QUFDcEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtDQUFrQyxRQUFRO0FBQzFDO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLFlBQVk7QUFDaEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlCQUFpQixrQkFBa0I7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0Esb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixvQkFBb0I7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixnQkFBZ0I7QUFDcEM7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSw2QkFBNkIsUUFBUTtBQUNyQztBQUNBLDhCQUE4QixRQUFRO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLEVBQUUsTUFBNkIiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvYm4uanMvbGliL2JuLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBVdGlsc1xuICBmdW5jdGlvbiBhc3NlcnQgKHZhbCwgbXNnKSB7XG4gICAgaWYgKCF2YWwpIHRocm93IG5ldyBFcnJvcihtc2cgfHwgJ0Fzc2VydGlvbiBmYWlsZWQnKTtcbiAgfVxuXG4gIC8vIENvdWxkIHVzZSBgaW5oZXJpdHNgIG1vZHVsZSwgYnV0IGRvbid0IHdhbnQgdG8gbW92ZSBmcm9tIHNpbmdsZSBmaWxlXG4gIC8vIGFyY2hpdGVjdHVyZSB5ZXQuXG4gIGZ1bmN0aW9uIGluaGVyaXRzIChjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjtcbiAgICB2YXIgVGVtcEN0b3IgPSBmdW5jdGlvbiAoKSB7fTtcbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlO1xuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKCk7XG4gICAgY3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjdG9yO1xuICB9XG5cbiAgLy8gQk5cblxuICBmdW5jdGlvbiBCTiAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAoQk4uaXNCTihudW1iZXIpKSB7XG4gICAgICByZXR1cm4gbnVtYmVyO1xuICAgIH1cblxuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgIHRoaXMud29yZHMgPSBudWxsO1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFJlZHVjdGlvbiBjb250ZXh0XG4gICAgdGhpcy5yZWQgPSBudWxsO1xuXG4gICAgaWYgKG51bWJlciAhPT0gbnVsbCkge1xuICAgICAgaWYgKGJhc2UgPT09ICdsZScgfHwgYmFzZSA9PT0gJ2JlJykge1xuICAgICAgICBlbmRpYW4gPSBiYXNlO1xuICAgICAgICBiYXNlID0gMTA7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2luaXQobnVtYmVyIHx8IDAsIGJhc2UgfHwgMTAsIGVuZGlhbiB8fCAnYmUnKTtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKSB7XG4gICAgbW9kdWxlLmV4cG9ydHMgPSBCTjtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJOID0gQk47XG4gIH1cblxuICBCTi5CTiA9IEJOO1xuICBCTi53b3JkU2l6ZSA9IDI2O1xuXG4gIHZhciBCdWZmZXI7XG4gIHRyeSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuQnVmZmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgQnVmZmVyID0gd2luZG93LkJ1ZmZlcjtcbiAgICB9IGVsc2Uge1xuICAgICAgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICB9XG5cbiAgQk4uaXNCTiA9IGZ1bmN0aW9uIGlzQk4gKG51bSkge1xuICAgIGlmIChudW0gaW5zdGFuY2VvZiBCTikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bSAhPT0gbnVsbCAmJiB0eXBlb2YgbnVtID09PSAnb2JqZWN0JyAmJlxuICAgICAgbnVtLmNvbnN0cnVjdG9yLndvcmRTaXplID09PSBCTi53b3JkU2l6ZSAmJiBBcnJheS5pc0FycmF5KG51bS53b3Jkcyk7XG4gIH07XG5cbiAgQk4ubWF4ID0gZnVuY3Rpb24gbWF4IChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPiAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ubWluID0gZnVuY3Rpb24gbWluIChsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0LmNtcChyaWdodCkgPCAwKSByZXR1cm4gbGVmdDtcbiAgICByZXR1cm4gcmlnaHQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pbml0ID0gZnVuY3Rpb24gaW5pdCAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0TnVtYmVyKG51bWJlciwgYmFzZSwgZW5kaWFuKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG51bWJlciA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbml0QXJyYXkobnVtYmVyLCBiYXNlLCBlbmRpYW4pO1xuICAgIH1cblxuICAgIGlmIChiYXNlID09PSAnaGV4Jykge1xuICAgICAgYmFzZSA9IDE2O1xuICAgIH1cbiAgICBhc3NlcnQoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNik7XG5cbiAgICBudW1iZXIgPSBudW1iZXIudG9TdHJpbmcoKS5yZXBsYWNlKC9cXHMrL2csICcnKTtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIGlmIChudW1iZXJbMF0gPT09ICctJykge1xuICAgICAgc3RhcnQrKztcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgIH1cblxuICAgIGlmIChzdGFydCA8IG51bWJlci5sZW5ndGgpIHtcbiAgICAgIGlmIChiYXNlID09PSAxNikge1xuICAgICAgICB0aGlzLl9wYXJzZUhleChudW1iZXIsIHN0YXJ0LCBlbmRpYW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcGFyc2VCYXNlKG51bWJlciwgYmFzZSwgc3RhcnQpO1xuICAgICAgICBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICAgICAgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBiYXNlLCBlbmRpYW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faW5pdE51bWJlciA9IGZ1bmN0aW9uIF9pbml0TnVtYmVyIChudW1iZXIsIGJhc2UsIGVuZGlhbikge1xuICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIG51bWJlciA9IC1udW1iZXI7XG4gICAgfVxuICAgIGlmIChudW1iZXIgPCAweDQwMDAwMDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbbnVtYmVyICYgMHgzZmZmZmZmXTtcbiAgICAgIHRoaXMubGVuZ3RoID0gMTtcbiAgICB9IGVsc2UgaWYgKG51bWJlciA8IDB4MTAwMDAwMDAwMDAwMDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbXG4gICAgICAgIG51bWJlciAmIDB4M2ZmZmZmZixcbiAgICAgICAgKG51bWJlciAvIDB4NDAwMDAwMCkgJiAweDNmZmZmZmZcbiAgICAgIF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChudW1iZXIgPCAweDIwMDAwMDAwMDAwMDAwKTsgLy8gMiBeIDUzICh1bnNhZmUpXG4gICAgICB0aGlzLndvcmRzID0gW1xuICAgICAgICBudW1iZXIgJiAweDNmZmZmZmYsXG4gICAgICAgIChudW1iZXIgLyAweDQwMDAwMDApICYgMHgzZmZmZmZmLFxuICAgICAgICAxXG4gICAgICBdO1xuICAgICAgdGhpcy5sZW5ndGggPSAzO1xuICAgIH1cblxuICAgIGlmIChlbmRpYW4gIT09ICdsZScpIHJldHVybjtcblxuICAgIC8vIFJldmVyc2UgdGhlIGJ5dGVzXG4gICAgdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLCBiYXNlLCBlbmRpYW4pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5faW5pdEFycmF5ID0gZnVuY3Rpb24gX2luaXRBcnJheSAobnVtYmVyLCBiYXNlLCBlbmRpYW4pIHtcbiAgICAvLyBQZXJoYXBzIGEgVWludDhBcnJheVxuICAgIGFzc2VydCh0eXBlb2YgbnVtYmVyLmxlbmd0aCA9PT0gJ251bWJlcicpO1xuICAgIGlmIChudW1iZXIubGVuZ3RoIDw9IDApIHtcbiAgICAgIHRoaXMud29yZHMgPSBbMF07XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbChudW1iZXIubGVuZ3RoIC8gMyk7XG4gICAgdGhpcy53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICB9XG5cbiAgICB2YXIgaiwgdztcbiAgICB2YXIgb2ZmID0gMDtcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMSwgaiA9IDA7IGkgPj0gMDsgaSAtPSAzKSB7XG4gICAgICAgIHcgPSBudW1iZXJbaV0gfCAobnVtYmVyW2kgLSAxXSA8PCA4KSB8IChudW1iZXJbaSAtIDJdIDw8IDE2KTtcbiAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSAodyA8PCBvZmYpICYgMHgzZmZmZmZmO1xuICAgICAgICB0aGlzLndvcmRzW2ogKyAxXSA9ICh3ID4+PiAoMjYgLSBvZmYpKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgb2ZmICs9IDI0O1xuICAgICAgICBpZiAob2ZmID49IDI2KSB7XG4gICAgICAgICAgb2ZmIC09IDI2O1xuICAgICAgICAgIGorKztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZW5kaWFuID09PSAnbGUnKSB7XG4gICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG51bWJlci5sZW5ndGg7IGkgKz0gMykge1xuICAgICAgICB3ID0gbnVtYmVyW2ldIHwgKG51bWJlcltpICsgMV0gPDwgOCkgfCAobnVtYmVyW2kgKyAyXSA8PCAxNik7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gKHcgPDwgb2ZmKSAmIDB4M2ZmZmZmZjtcbiAgICAgICAgdGhpcy53b3Jkc1tqICsgMV0gPSAodyA+Pj4gKDI2IC0gb2ZmKSkgJiAweDNmZmZmZmY7XG4gICAgICAgIG9mZiArPSAyNDtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBqKys7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VIZXg0Qml0cyAoc3RyaW5nLCBpbmRleCkge1xuICAgIHZhciBjID0gc3RyaW5nLmNoYXJDb2RlQXQoaW5kZXgpO1xuICAgIC8vICcwJyAtICc5J1xuICAgIGlmIChjID49IDQ4ICYmIGMgPD0gNTcpIHtcbiAgICAgIHJldHVybiBjIC0gNDg7XG4gICAgLy8gJ0EnIC0gJ0YnXG4gICAgfSBlbHNlIGlmIChjID49IDY1ICYmIGMgPD0gNzApIHtcbiAgICAgIHJldHVybiBjIC0gNTU7XG4gICAgLy8gJ2EnIC0gJ2YnXG4gICAgfSBlbHNlIGlmIChjID49IDk3ICYmIGMgPD0gMTAyKSB7XG4gICAgICByZXR1cm4gYyAtIDg3O1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoZmFsc2UsICdJbnZhbGlkIGNoYXJhY3RlciBpbiAnICsgc3RyaW5nKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUhleEJ5dGUgKHN0cmluZywgbG93ZXJCb3VuZCwgaW5kZXgpIHtcbiAgICB2YXIgciA9IHBhcnNlSGV4NEJpdHMoc3RyaW5nLCBpbmRleCk7XG4gICAgaWYgKGluZGV4IC0gMSA+PSBsb3dlckJvdW5kKSB7XG4gICAgICByIHw9IHBhcnNlSGV4NEJpdHMoc3RyaW5nLCBpbmRleCAtIDEpIDw8IDQ7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUhleCA9IGZ1bmN0aW9uIF9wYXJzZUhleCAobnVtYmVyLCBzdGFydCwgZW5kaWFuKSB7XG4gICAgLy8gQ3JlYXRlIHBvc3NpYmx5IGJpZ2dlciBhcnJheSB0byBlbnN1cmUgdGhhdCBpdCBmaXRzIHRoZSBudW1iZXJcbiAgICB0aGlzLmxlbmd0aCA9IE1hdGguY2VpbCgobnVtYmVyLmxlbmd0aCAtIHN0YXJ0KSAvIDYpO1xuICAgIHRoaXMud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IDA7XG4gICAgfVxuXG4gICAgLy8gMjQtYml0cyBjaHVua3NcbiAgICB2YXIgb2ZmID0gMDtcbiAgICB2YXIgaiA9IDA7XG5cbiAgICB2YXIgdztcbiAgICBpZiAoZW5kaWFuID09PSAnYmUnKSB7XG4gICAgICBmb3IgKGkgPSBudW1iZXIubGVuZ3RoIC0gMTsgaSA+PSBzdGFydDsgaSAtPSAyKSB7XG4gICAgICAgIHcgPSBwYXJzZUhleEJ5dGUobnVtYmVyLCBzdGFydCwgaSkgPDwgb2ZmO1xuICAgICAgICB0aGlzLndvcmRzW2pdIHw9IHcgJiAweDNmZmZmZmY7XG4gICAgICAgIGlmIChvZmYgPj0gMTgpIHtcbiAgICAgICAgICBvZmYgLT0gMTg7XG4gICAgICAgICAgaiArPSAxO1xuICAgICAgICAgIHRoaXMud29yZHNbal0gfD0gdyA+Pj4gMjY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb2ZmICs9IDg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHBhcnNlTGVuZ3RoID0gbnVtYmVyLmxlbmd0aCAtIHN0YXJ0O1xuICAgICAgZm9yIChpID0gcGFyc2VMZW5ndGggJSAyID09PSAwID8gc3RhcnQgKyAxIDogc3RhcnQ7IGkgPCBudW1iZXIubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgdyA9IHBhcnNlSGV4Qnl0ZShudW1iZXIsIHN0YXJ0LCBpKSA8PCBvZmY7XG4gICAgICAgIHRoaXMud29yZHNbal0gfD0gdyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgaWYgKG9mZiA+PSAxOCkge1xuICAgICAgICAgIG9mZiAtPSAxODtcbiAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgdGhpcy53b3Jkc1tqXSB8PSB3ID4+PiAyNjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvZmYgKz0gODtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3N0cmlwKCk7XG4gIH07XG5cbiAgZnVuY3Rpb24gcGFyc2VCYXNlIChzdHIsIHN0YXJ0LCBlbmQsIG11bCkge1xuICAgIHZhciByID0gMDtcbiAgICB2YXIgYiA9IDA7XG4gICAgdmFyIGxlbiA9IE1hdGgubWluKHN0ci5sZW5ndGgsIGVuZCk7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIHZhciBjID0gc3RyLmNoYXJDb2RlQXQoaSkgLSA0ODtcblxuICAgICAgciAqPSBtdWw7XG5cbiAgICAgIC8vICdhJ1xuICAgICAgaWYgKGMgPj0gNDkpIHtcbiAgICAgICAgYiA9IGMgLSA0OSArIDB4YTtcblxuICAgICAgLy8gJ0EnXG4gICAgICB9IGVsc2UgaWYgKGMgPj0gMTcpIHtcbiAgICAgICAgYiA9IGMgLSAxNyArIDB4YTtcblxuICAgICAgLy8gJzAnIC0gJzknXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiID0gYztcbiAgICAgIH1cbiAgICAgIGFzc2VydChjID49IDAgJiYgYiA8IG11bCwgJ0ludmFsaWQgY2hhcmFjdGVyJyk7XG4gICAgICByICs9IGI7XG4gICAgfVxuICAgIHJldHVybiByO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9wYXJzZUJhc2UgPSBmdW5jdGlvbiBfcGFyc2VCYXNlIChudW1iZXIsIGJhc2UsIHN0YXJ0KSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBhcyB6ZXJvXG4gICAgdGhpcy53b3JkcyA9IFswXTtcbiAgICB0aGlzLmxlbmd0aCA9IDE7XG5cbiAgICAvLyBGaW5kIGxlbmd0aCBvZiBsaW1iIGluIGJhc2VcbiAgICBmb3IgKHZhciBsaW1iTGVuID0gMCwgbGltYlBvdyA9IDE7IGxpbWJQb3cgPD0gMHgzZmZmZmZmOyBsaW1iUG93ICo9IGJhc2UpIHtcbiAgICAgIGxpbWJMZW4rKztcbiAgICB9XG4gICAgbGltYkxlbi0tO1xuICAgIGxpbWJQb3cgPSAobGltYlBvdyAvIGJhc2UpIHwgMDtcblxuICAgIHZhciB0b3RhbCA9IG51bWJlci5sZW5ndGggLSBzdGFydDtcbiAgICB2YXIgbW9kID0gdG90YWwgJSBsaW1iTGVuO1xuICAgIHZhciBlbmQgPSBNYXRoLm1pbih0b3RhbCwgdG90YWwgLSBtb2QpICsgc3RhcnQ7XG5cbiAgICB2YXIgd29yZCA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IGxpbWJMZW4pIHtcbiAgICAgIHdvcmQgPSBwYXJzZUJhc2UobnVtYmVyLCBpLCBpICsgbGltYkxlbiwgYmFzZSk7XG5cbiAgICAgIHRoaXMuaW11bG4obGltYlBvdyk7XG4gICAgICBpZiAodGhpcy53b3Jkc1swXSArIHdvcmQgPCAweDQwMDAwMDApIHtcbiAgICAgICAgdGhpcy53b3Jkc1swXSArPSB3b3JkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faWFkZG4od29yZCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1vZCAhPT0gMCkge1xuICAgICAgdmFyIHBvdyA9IDE7XG4gICAgICB3b3JkID0gcGFyc2VCYXNlKG51bWJlciwgaSwgbnVtYmVyLmxlbmd0aCwgYmFzZSk7XG5cbiAgICAgIGZvciAoaSA9IDA7IGkgPCBtb2Q7IGkrKykge1xuICAgICAgICBwb3cgKj0gYmFzZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pbXVsbihwb3cpO1xuICAgICAgaWYgKHRoaXMud29yZHNbMF0gKyB3b3JkIDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIHRoaXMud29yZHNbMF0gKz0gd29yZDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lhZGRuKHdvcmQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX3N0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiBjb3B5IChkZXN0KSB7XG4gICAgZGVzdC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBkZXN0LndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICB9XG4gICAgZGVzdC5sZW5ndGggPSB0aGlzLmxlbmd0aDtcbiAgICBkZXN0Lm5lZ2F0aXZlID0gdGhpcy5uZWdhdGl2ZTtcbiAgICBkZXN0LnJlZCA9IHRoaXMucmVkO1xuICB9O1xuXG4gIGZ1bmN0aW9uIG1vdmUgKGRlc3QsIHNyYykge1xuICAgIGRlc3Qud29yZHMgPSBzcmMud29yZHM7XG4gICAgZGVzdC5sZW5ndGggPSBzcmMubGVuZ3RoO1xuICAgIGRlc3QubmVnYXRpdmUgPSBzcmMubmVnYXRpdmU7XG4gICAgZGVzdC5yZWQgPSBzcmMucmVkO1xuICB9XG5cbiAgQk4ucHJvdG90eXBlLl9tb3ZlID0gZnVuY3Rpb24gX21vdmUgKGRlc3QpIHtcbiAgICBtb3ZlKGRlc3QsIHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uIGNsb25lICgpIHtcbiAgICB2YXIgciA9IG5ldyBCTihudWxsKTtcbiAgICB0aGlzLmNvcHkocik7XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9leHBhbmQgPSBmdW5jdGlvbiBfZXhwYW5kIChzaXplKSB7XG4gICAgd2hpbGUgKHRoaXMubGVuZ3RoIDwgc2l6ZSkge1xuICAgICAgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCsrXSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIFJlbW92ZSBsZWFkaW5nIGAwYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuX3N0cmlwID0gZnVuY3Rpb24gc3RyaXAgKCkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA+IDEgJiYgdGhpcy53b3Jkc1t0aGlzLmxlbmd0aCAtIDFdID09PSAwKSB7XG4gICAgICB0aGlzLmxlbmd0aC0tO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fbm9ybVNpZ24oKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX25vcm1TaWduID0gZnVuY3Rpb24gX25vcm1TaWduICgpIHtcbiAgICAvLyAtMCA9IDBcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEgJiYgdGhpcy53b3Jkc1swXSA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIENoZWNrIFN5bWJvbC5mb3IgYmVjYXVzZSBub3QgZXZlcnl3aGVyZSB3aGVyZSBTeW1ib2wgZGVmaW5lZFxuICAvLyBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvU3ltYm9sI0Jyb3dzZXJfY29tcGF0aWJpbGl0eVxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICB0cnkge1xuICAgICAgQk4ucHJvdG90eXBlW1N5bWJvbC5mb3IoJ25vZGVqcy51dGlsLmluc3BlY3QuY3VzdG9tJyldID0gaW5zcGVjdDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBCTi5wcm90b3R5cGUuaW5zcGVjdCA9IGluc3BlY3Q7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIEJOLnByb3RvdHlwZS5pbnNwZWN0ID0gaW5zcGVjdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICAgIHJldHVybiAodGhpcy5yZWQgPyAnPEJOLVI6ICcgOiAnPEJOOiAnKSArIHRoaXMudG9TdHJpbmcoMTYpICsgJz4nO1xuICB9XG5cbiAgLypcblxuICB2YXIgemVyb3MgPSBbXTtcbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXTtcbiAgdmFyIGdyb3VwQmFzZXMgPSBbXTtcblxuICB2YXIgcyA9ICcnO1xuICB2YXIgaSA9IC0xO1xuICB3aGlsZSAoKytpIDwgQk4ud29yZFNpemUpIHtcbiAgICB6ZXJvc1tpXSA9IHM7XG4gICAgcyArPSAnMCc7XG4gIH1cbiAgZ3JvdXBTaXplc1swXSA9IDA7XG4gIGdyb3VwU2l6ZXNbMV0gPSAwO1xuICBncm91cEJhc2VzWzBdID0gMDtcbiAgZ3JvdXBCYXNlc1sxXSA9IDA7XG4gIHZhciBiYXNlID0gMiAtIDE7XG4gIHdoaWxlICgrK2Jhc2UgPCAzNiArIDEpIHtcbiAgICB2YXIgZ3JvdXBTaXplID0gMDtcbiAgICB2YXIgZ3JvdXBCYXNlID0gMTtcbiAgICB3aGlsZSAoZ3JvdXBCYXNlIDwgKDEgPDwgQk4ud29yZFNpemUpIC8gYmFzZSkge1xuICAgICAgZ3JvdXBCYXNlICo9IGJhc2U7XG4gICAgICBncm91cFNpemUgKz0gMTtcbiAgICB9XG4gICAgZ3JvdXBTaXplc1tiYXNlXSA9IGdyb3VwU2l6ZTtcbiAgICBncm91cEJhc2VzW2Jhc2VdID0gZ3JvdXBCYXNlO1xuICB9XG5cbiAgKi9cblxuICB2YXIgemVyb3MgPSBbXG4gICAgJycsXG4gICAgJzAnLFxuICAgICcwMCcsXG4gICAgJzAwMCcsXG4gICAgJzAwMDAnLFxuICAgICcwMDAwMCcsXG4gICAgJzAwMDAwMCcsXG4gICAgJzAwMDAwMDAnLFxuICAgICcwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsXG4gICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gIF07XG5cbiAgdmFyIGdyb3VwU2l6ZXMgPSBbXG4gICAgMCwgMCxcbiAgICAyNSwgMTYsIDEyLCAxMSwgMTAsIDksIDgsXG4gICAgOCwgNywgNywgNywgNywgNiwgNixcbiAgICA2LCA2LCA2LCA2LCA2LCA1LCA1LFxuICAgIDUsIDUsIDUsIDUsIDUsIDUsIDUsXG4gICAgNSwgNSwgNSwgNSwgNSwgNSwgNVxuICBdO1xuXG4gIHZhciBncm91cEJhc2VzID0gW1xuICAgIDAsIDAsXG4gICAgMzM1NTQ0MzIsIDQzMDQ2NzIxLCAxNjc3NzIxNiwgNDg4MjgxMjUsIDYwNDY2MTc2LCA0MDM1MzYwNywgMTY3NzcyMTYsXG4gICAgNDMwNDY3MjEsIDEwMDAwMDAwLCAxOTQ4NzE3MSwgMzU4MzE4MDgsIDYyNzQ4NTE3LCA3NTI5NTM2LCAxMTM5MDYyNSxcbiAgICAxNjc3NzIxNiwgMjQxMzc1NjksIDM0MDEyMjI0LCA0NzA0NTg4MSwgNjQwMDAwMDAsIDQwODQxMDEsIDUxNTM2MzIsXG4gICAgNjQzNjM0MywgNzk2MjYyNCwgOTc2NTYyNSwgMTE4ODEzNzYsIDE0MzQ4OTA3LCAxNzIxMDM2OCwgMjA1MTExNDksXG4gICAgMjQzMDAwMDAsIDI4NjI5MTUxLCAzMzU1NDQzMiwgMzkxMzUzOTMsIDQ1NDM1NDI0LCA1MjUyMTg3NSwgNjA0NjYxNzZcbiAgXTtcblxuICBCTi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoYmFzZSwgcGFkZGluZykge1xuICAgIGJhc2UgPSBiYXNlIHx8IDEwO1xuICAgIHBhZGRpbmcgPSBwYWRkaW5nIHwgMCB8fCAxO1xuXG4gICAgdmFyIG91dDtcbiAgICBpZiAoYmFzZSA9PT0gMTYgfHwgYmFzZSA9PT0gJ2hleCcpIHtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIG9mZiA9IDA7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgICAgdmFyIHdvcmQgPSAoKCh3IDw8IG9mZikgfCBjYXJyeSkgJiAweGZmZmZmZikudG9TdHJpbmcoMTYpO1xuICAgICAgICBjYXJyeSA9ICh3ID4+PiAoMjQgLSBvZmYpKSAmIDB4ZmZmZmZmO1xuICAgICAgICBvZmYgKz0gMjtcbiAgICAgICAgaWYgKG9mZiA+PSAyNikge1xuICAgICAgICAgIG9mZiAtPSAyNjtcbiAgICAgICAgICBpLS07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhcnJ5ICE9PSAwIHx8IGkgIT09IHRoaXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIG91dCA9IHplcm9zWzYgLSB3b3JkLmxlbmd0aF0gKyB3b3JkICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHdvcmQgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgICBvdXQgPSBjYXJyeS50b1N0cmluZygxNikgKyBvdXQ7XG4gICAgICB9XG4gICAgICB3aGlsZSAob3V0Lmxlbmd0aCAlIHBhZGRpbmcgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJzAnICsgb3V0O1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgb3V0ID0gJy0nICsgb3V0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBpZiAoYmFzZSA9PT0gKGJhc2UgfCAwKSAmJiBiYXNlID49IDIgJiYgYmFzZSA8PSAzNikge1xuICAgICAgLy8gdmFyIGdyb3VwU2l6ZSA9IE1hdGguZmxvb3IoQk4ud29yZFNpemUgKiBNYXRoLkxOMiAvIE1hdGgubG9nKGJhc2UpKTtcbiAgICAgIHZhciBncm91cFNpemUgPSBncm91cFNpemVzW2Jhc2VdO1xuICAgICAgLy8gdmFyIGdyb3VwQmFzZSA9IE1hdGgucG93KGJhc2UsIGdyb3VwU2l6ZSk7XG4gICAgICB2YXIgZ3JvdXBCYXNlID0gZ3JvdXBCYXNlc1tiYXNlXTtcbiAgICAgIG91dCA9ICcnO1xuICAgICAgdmFyIGMgPSB0aGlzLmNsb25lKCk7XG4gICAgICBjLm5lZ2F0aXZlID0gMDtcbiAgICAgIHdoaWxlICghYy5pc1plcm8oKSkge1xuICAgICAgICB2YXIgciA9IGMubW9kcm4oZ3JvdXBCYXNlKS50b1N0cmluZyhiYXNlKTtcbiAgICAgICAgYyA9IGMuaWRpdm4oZ3JvdXBCYXNlKTtcblxuICAgICAgICBpZiAoIWMuaXNaZXJvKCkpIHtcbiAgICAgICAgICBvdXQgPSB6ZXJvc1tncm91cFNpemUgLSByLmxlbmd0aF0gKyByICsgb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dCA9IHIgKyBvdXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmlzWmVybygpKSB7XG4gICAgICAgIG91dCA9ICcwJyArIG91dDtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChvdXQubGVuZ3RoICUgcGFkZGluZyAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnMCcgKyBvdXQ7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgICBvdXQgPSAnLScgKyBvdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0O1xuICAgIH1cblxuICAgIGFzc2VydChmYWxzZSwgJ0Jhc2Ugc2hvdWxkIGJlIGJldHdlZW4gMiBhbmQgMzYnKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudG9OdW1iZXIgPSBmdW5jdGlvbiB0b051bWJlciAoKSB7XG4gICAgdmFyIHJldCA9IHRoaXMud29yZHNbMF07XG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAyKSB7XG4gICAgICByZXQgKz0gdGhpcy53b3Jkc1sxXSAqIDB4NDAwMDAwMDtcbiAgICB9IGVsc2UgaWYgKHRoaXMubGVuZ3RoID09PSAzICYmIHRoaXMud29yZHNbMl0gPT09IDB4MDEpIHtcbiAgICAgIC8vIE5PVEU6IGF0IHRoaXMgc3RhZ2UgaXQgaXMga25vd24gdGhhdCB0aGUgdG9wIGJpdCBpcyBzZXRcbiAgICAgIHJldCArPSAweDEwMDAwMDAwMDAwMDAwICsgKHRoaXMud29yZHNbMV0gKiAweDQwMDAwMDApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5sZW5ndGggPiAyKSB7XG4gICAgICBhc3NlcnQoZmFsc2UsICdOdW1iZXIgY2FuIG9ubHkgc2FmZWx5IHN0b3JlIHVwIHRvIDUzIGJpdHMnKTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLm5lZ2F0aXZlICE9PSAwKSA/IC1yZXQgOiByZXQ7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9TdHJpbmcoMTYsIDIpO1xuICB9O1xuXG4gIGlmIChCdWZmZXIpIHtcbiAgICBCTi5wcm90b3R5cGUudG9CdWZmZXIgPSBmdW5jdGlvbiB0b0J1ZmZlciAoZW5kaWFuLCBsZW5ndGgpIHtcbiAgICAgIHJldHVybiB0aGlzLnRvQXJyYXlMaWtlKEJ1ZmZlciwgZW5kaWFuLCBsZW5ndGgpO1xuICAgIH07XG4gIH1cblxuICBCTi5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uIHRvQXJyYXkgKGVuZGlhbiwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQXJyYXksIGVuZGlhbiwgbGVuZ3RoKTtcbiAgfTtcblxuICB2YXIgYWxsb2NhdGUgPSBmdW5jdGlvbiBhbGxvY2F0ZSAoQXJyYXlUeXBlLCBzaXplKSB7XG4gICAgaWYgKEFycmF5VHlwZS5hbGxvY1Vuc2FmZSkge1xuICAgICAgcmV0dXJuIEFycmF5VHlwZS5hbGxvY1Vuc2FmZShzaXplKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBBcnJheVR5cGUoc2l6ZSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvQXJyYXlMaWtlID0gZnVuY3Rpb24gdG9BcnJheUxpa2UgKEFycmF5VHlwZSwgZW5kaWFuLCBsZW5ndGgpIHtcbiAgICB0aGlzLl9zdHJpcCgpO1xuXG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0aGlzLmJ5dGVMZW5ndGgoKTtcbiAgICB2YXIgcmVxTGVuZ3RoID0gbGVuZ3RoIHx8IE1hdGgubWF4KDEsIGJ5dGVMZW5ndGgpO1xuICAgIGFzc2VydChieXRlTGVuZ3RoIDw9IHJlcUxlbmd0aCwgJ2J5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGgnKTtcbiAgICBhc3NlcnQocmVxTGVuZ3RoID4gMCwgJ1JlcXVlc3RlZCBhcnJheSBsZW5ndGggPD0gMCcpO1xuXG4gICAgdmFyIHJlcyA9IGFsbG9jYXRlKEFycmF5VHlwZSwgcmVxTGVuZ3RoKTtcbiAgICB2YXIgcG9zdGZpeCA9IGVuZGlhbiA9PT0gJ2xlJyA/ICdMRScgOiAnQkUnO1xuICAgIHRoaXNbJ190b0FycmF5TGlrZScgKyBwb3N0Zml4XShyZXMsIGJ5dGVMZW5ndGgpO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl90b0FycmF5TGlrZUxFID0gZnVuY3Rpb24gX3RvQXJyYXlMaWtlTEUgKHJlcywgYnl0ZUxlbmd0aCkge1xuICAgIHZhciBwb3NpdGlvbiA9IDA7XG4gICAgdmFyIGNhcnJ5ID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwLCBzaGlmdCA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgd29yZCA9ICh0aGlzLndvcmRzW2ldIDw8IHNoaWZ0KSB8IGNhcnJ5O1xuXG4gICAgICByZXNbcG9zaXRpb24rK10gPSB3b3JkICYgMHhmZjtcbiAgICAgIGlmIChwb3NpdGlvbiA8IHJlcy5sZW5ndGgpIHtcbiAgICAgICAgcmVzW3Bvc2l0aW9uKytdID0gKHdvcmQgPj4gOCkgJiAweGZmO1xuICAgICAgfVxuICAgICAgaWYgKHBvc2l0aW9uIDwgcmVzLmxlbmd0aCkge1xuICAgICAgICByZXNbcG9zaXRpb24rK10gPSAod29yZCA+PiAxNikgJiAweGZmO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hpZnQgPT09IDYpIHtcbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgcmVzLmxlbmd0aCkge1xuICAgICAgICAgIHJlc1twb3NpdGlvbisrXSA9ICh3b3JkID4+IDI0KSAmIDB4ZmY7XG4gICAgICAgIH1cbiAgICAgICAgY2FycnkgPSAwO1xuICAgICAgICBzaGlmdCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYXJyeSA9IHdvcmQgPj4+IDI0O1xuICAgICAgICBzaGlmdCArPSAyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IHJlcy5sZW5ndGgpIHtcbiAgICAgIHJlc1twb3NpdGlvbisrXSA9IGNhcnJ5O1xuXG4gICAgICB3aGlsZSAocG9zaXRpb24gPCByZXMubGVuZ3RoKSB7XG4gICAgICAgIHJlc1twb3NpdGlvbisrXSA9IDA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fdG9BcnJheUxpa2VCRSA9IGZ1bmN0aW9uIF90b0FycmF5TGlrZUJFIChyZXMsIGJ5dGVMZW5ndGgpIHtcbiAgICB2YXIgcG9zaXRpb24gPSByZXMubGVuZ3RoIC0gMTtcbiAgICB2YXIgY2FycnkgPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIHNoaWZ0ID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3b3JkID0gKHRoaXMud29yZHNbaV0gPDwgc2hpZnQpIHwgY2Fycnk7XG5cbiAgICAgIHJlc1twb3NpdGlvbi0tXSA9IHdvcmQgJiAweGZmO1xuICAgICAgaWYgKHBvc2l0aW9uID49IDApIHtcbiAgICAgICAgcmVzW3Bvc2l0aW9uLS1dID0gKHdvcmQgPj4gOCkgJiAweGZmO1xuICAgICAgfVxuICAgICAgaWYgKHBvc2l0aW9uID49IDApIHtcbiAgICAgICAgcmVzW3Bvc2l0aW9uLS1dID0gKHdvcmQgPj4gMTYpICYgMHhmZjtcbiAgICAgIH1cblxuICAgICAgaWYgKHNoaWZ0ID09PSA2KSB7XG4gICAgICAgIGlmIChwb3NpdGlvbiA+PSAwKSB7XG4gICAgICAgICAgcmVzW3Bvc2l0aW9uLS1dID0gKHdvcmQgPj4gMjQpICYgMHhmZjtcbiAgICAgICAgfVxuICAgICAgICBjYXJyeSA9IDA7XG4gICAgICAgIHNoaWZ0ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhcnJ5ID0gd29yZCA+Pj4gMjQ7XG4gICAgICAgIHNoaWZ0ICs9IDI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBvc2l0aW9uID49IDApIHtcbiAgICAgIHJlc1twb3NpdGlvbi0tXSA9IGNhcnJ5O1xuXG4gICAgICB3aGlsZSAocG9zaXRpb24gPj0gMCkge1xuICAgICAgICByZXNbcG9zaXRpb24tLV0gPSAwO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBpZiAoTWF0aC5jbHozMikge1xuICAgIEJOLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24gX2NvdW50Qml0cyAodykge1xuICAgICAgcmV0dXJuIDMyIC0gTWF0aC5jbHozMih3KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIEJOLnByb3RvdHlwZS5fY291bnRCaXRzID0gZnVuY3Rpb24gX2NvdW50Qml0cyAodykge1xuICAgICAgdmFyIHQgPSB3O1xuICAgICAgdmFyIHIgPSAwO1xuICAgICAgaWYgKHQgPj0gMHgxMDAwKSB7XG4gICAgICAgIHIgKz0gMTM7XG4gICAgICAgIHQgPj4+PSAxMztcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4NDApIHtcbiAgICAgICAgciArPSA3O1xuICAgICAgICB0ID4+Pj0gNztcbiAgICAgIH1cbiAgICAgIGlmICh0ID49IDB4OCkge1xuICAgICAgICByICs9IDQ7XG4gICAgICAgIHQgPj4+PSA0O1xuICAgICAgfVxuICAgICAgaWYgKHQgPj0gMHgwMikge1xuICAgICAgICByICs9IDI7XG4gICAgICAgIHQgPj4+PSAyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHIgKyB0O1xuICAgIH07XG4gIH1cblxuICBCTi5wcm90b3R5cGUuX3plcm9CaXRzID0gZnVuY3Rpb24gX3plcm9CaXRzICh3KSB7XG4gICAgLy8gU2hvcnQtY3V0XG4gICAgaWYgKHcgPT09IDApIHJldHVybiAyNjtcblxuICAgIHZhciB0ID0gdztcbiAgICB2YXIgciA9IDA7XG4gICAgaWYgKCh0ICYgMHgxZmZmKSA9PT0gMCkge1xuICAgICAgciArPSAxMztcbiAgICAgIHQgPj4+PSAxMztcbiAgICB9XG4gICAgaWYgKCh0ICYgMHg3ZikgPT09IDApIHtcbiAgICAgIHIgKz0gNztcbiAgICAgIHQgPj4+PSA3O1xuICAgIH1cbiAgICBpZiAoKHQgJiAweGYpID09PSAwKSB7XG4gICAgICByICs9IDQ7XG4gICAgICB0ID4+Pj0gNDtcbiAgICB9XG4gICAgaWYgKCh0ICYgMHgzKSA9PT0gMCkge1xuICAgICAgciArPSAyO1xuICAgICAgdCA+Pj49IDI7XG4gICAgfVxuICAgIGlmICgodCAmIDB4MSkgPT09IDApIHtcbiAgICAgIHIrKztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgLy8gUmV0dXJuIG51bWJlciBvZiB1c2VkIGJpdHMgaW4gYSBCTlxuICBCTi5wcm90b3R5cGUuYml0TGVuZ3RoID0gZnVuY3Rpb24gYml0TGVuZ3RoICgpIHtcbiAgICB2YXIgdyA9IHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXTtcbiAgICB2YXIgaGkgPSB0aGlzLl9jb3VudEJpdHModyk7XG4gICAgcmV0dXJuICh0aGlzLmxlbmd0aCAtIDEpICogMjYgKyBoaTtcbiAgfTtcblxuICBmdW5jdGlvbiB0b0JpdEFycmF5IChudW0pIHtcbiAgICB2YXIgdyA9IG5ldyBBcnJheShudW0uYml0TGVuZ3RoKCkpO1xuXG4gICAgZm9yICh2YXIgYml0ID0gMDsgYml0IDwgdy5sZW5ndGg7IGJpdCsrKSB7XG4gICAgICB2YXIgb2ZmID0gKGJpdCAvIDI2KSB8IDA7XG4gICAgICB2YXIgd2JpdCA9IGJpdCAlIDI2O1xuXG4gICAgICB3W2JpdF0gPSAobnVtLndvcmRzW29mZl0gPj4+IHdiaXQpICYgMHgwMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdztcbiAgfVxuXG4gIC8vIE51bWJlciBvZiB0cmFpbGluZyB6ZXJvIGJpdHNcbiAgQk4ucHJvdG90eXBlLnplcm9CaXRzID0gZnVuY3Rpb24gemVyb0JpdHMgKCkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gMDtcblxuICAgIHZhciByID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBiID0gdGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tpXSk7XG4gICAgICByICs9IGI7XG4gICAgICBpZiAoYiAhPT0gMjYpIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gcjtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYnl0ZUxlbmd0aCA9IGZ1bmN0aW9uIGJ5dGVMZW5ndGggKCkge1xuICAgIHJldHVybiBNYXRoLmNlaWwodGhpcy5iaXRMZW5ndGgoKSAvIDgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS50b1R3b3MgPSBmdW5jdGlvbiB0b1R3b3MgKHdpZHRoKSB7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmFicygpLmlub3RuKHdpZHRoKS5pYWRkbigxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZnJvbVR3b3MgPSBmdW5jdGlvbiBmcm9tVHdvcyAod2lkdGgpIHtcbiAgICBpZiAodGhpcy50ZXN0bih3aWR0aCAtIDEpKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub3RuKHdpZHRoKS5pYWRkbigxKS5pbmVnKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNsb25lKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzTmVnID0gZnVuY3Rpb24gaXNOZWcgKCkge1xuICAgIHJldHVybiB0aGlzLm5lZ2F0aXZlICE9PSAwO1xuICB9O1xuXG4gIC8vIFJldHVybiBuZWdhdGl2ZSBjbG9uZSBvZiBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uIG5lZyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbmVnKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmluZWcgPSBmdW5jdGlvbiBpbmVnICgpIHtcbiAgICBpZiAoIXRoaXMuaXNaZXJvKCkpIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICAvLyBPciBgbnVtYCB3aXRoIGB0aGlzYCBpbi1wbGFjZVxuICBCTi5wcm90b3R5cGUuaXVvciA9IGZ1bmN0aW9uIGl1b3IgKG51bSkge1xuICAgIHdoaWxlICh0aGlzLmxlbmd0aCA8IG51bS5sZW5ndGgpIHtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGgrK10gPSAwO1xuICAgIH1cblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXSB8IG51bS53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaW9yID0gZnVuY3Rpb24gaW9yIChudW0pIHtcbiAgICBhc3NlcnQoKHRoaXMubmVnYXRpdmUgfCBudW0ubmVnYXRpdmUpID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdW9yKG51bSk7XG4gIH07XG5cbiAgLy8gT3IgYG51bWAgd2l0aCBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLm9yID0gZnVuY3Rpb24gb3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaW9yKG51bSk7XG4gICAgcmV0dXJuIG51bS5jbG9uZSgpLmlvcih0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudW9yID0gZnVuY3Rpb24gdW9yIChudW0pIHtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLml1b3IobnVtKTtcbiAgICByZXR1cm4gbnVtLmNsb25lKCkuaXVvcih0aGlzKTtcbiAgfTtcblxuICAvLyBBbmQgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1YW5kID0gZnVuY3Rpb24gaXVhbmQgKG51bSkge1xuICAgIC8vIGIgPSBtaW4tbGVuZ3RoKG51bSwgdGhpcylcbiAgICB2YXIgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBiID0gbnVtO1xuICAgIH0gZWxzZSB7XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB0aGlzLndvcmRzW2ldICYgbnVtLndvcmRzW2ldO1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYi5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFuZCA9IGZ1bmN0aW9uIGlhbmQgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1YW5kKG51bSk7XG4gIH07XG5cbiAgLy8gQW5kIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5hbmQgPSBmdW5jdGlvbiBhbmQgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaWFuZChudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pYW5kKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51YW5kID0gZnVuY3Rpb24gdWFuZCAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdWFuZChudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdWFuZCh0aGlzKTtcbiAgfTtcblxuICAvLyBYb3IgYG51bWAgd2l0aCBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLml1eG9yID0gZnVuY3Rpb24gaXV4b3IgKG51bSkge1xuICAgIC8vIGEubGVuZ3RoID4gYi5sZW5ndGhcbiAgICB2YXIgYTtcbiAgICB2YXIgYjtcbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSB7XG4gICAgICBhID0gdGhpcztcbiAgICAgIGIgPSBudW07XG4gICAgfSBlbHNlIHtcbiAgICAgIGEgPSBudW07XG4gICAgICBiID0gdGhpcztcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldIF4gYi53b3Jkc1tpXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcyAhPT0gYSkge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYS5sZW5ndGg7XG5cbiAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXhvciA9IGZ1bmN0aW9uIGl4b3IgKG51bSkge1xuICAgIGFzc2VydCgodGhpcy5uZWdhdGl2ZSB8IG51bS5uZWdhdGl2ZSkgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1eG9yKG51bSk7XG4gIH07XG5cbiAgLy8gWG9yIGBudW1gIHdpdGggYHRoaXNgXG4gIEJOLnByb3RvdHlwZS54b3IgPSBmdW5jdGlvbiB4b3IgKG51bSkge1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHJldHVybiB0aGlzLmNsb25lKCkuaXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5peG9yKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51eG9yID0gZnVuY3Rpb24gdXhvciAobnVtKSB7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbnVtLmxlbmd0aCkgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXhvcihudW0pO1xuICAgIHJldHVybiBudW0uY2xvbmUoKS5pdXhvcih0aGlzKTtcbiAgfTtcblxuICAvLyBOb3QgYGB0aGlzYGAgd2l0aCBgYHdpZHRoYGAgYml0d2lkdGhcbiAgQk4ucHJvdG90eXBlLmlub3RuID0gZnVuY3Rpb24gaW5vdG4gKHdpZHRoKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiB3aWR0aCA9PT0gJ251bWJlcicgJiYgd2lkdGggPj0gMCk7XG5cbiAgICB2YXIgYnl0ZXNOZWVkZWQgPSBNYXRoLmNlaWwod2lkdGggLyAyNikgfCAwO1xuICAgIHZhciBiaXRzTGVmdCA9IHdpZHRoICUgMjY7XG5cbiAgICAvLyBFeHRlbmQgdGhlIGJ1ZmZlciB3aXRoIGxlYWRpbmcgemVyb2VzXG4gICAgdGhpcy5fZXhwYW5kKGJ5dGVzTmVlZGVkKTtcblxuICAgIGlmIChiaXRzTGVmdCA+IDApIHtcbiAgICAgIGJ5dGVzTmVlZGVkLS07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGNvbXBsZXRlIHdvcmRzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlc05lZWRlZDsgaSsrKSB7XG4gICAgICB0aGlzLndvcmRzW2ldID0gfnRoaXMud29yZHNbaV0gJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHRoZSByZXNpZHVlXG4gICAgaWYgKGJpdHNMZWZ0ID4gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IH50aGlzLndvcmRzW2ldICYgKDB4M2ZmZmZmZiA+PiAoMjYgLSBiaXRzTGVmdCkpO1xuICAgIH1cblxuICAgIC8vIEFuZCByZW1vdmUgbGVhZGluZyB6ZXJvZXNcbiAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubm90biA9IGZ1bmN0aW9uIG5vdG4gKHdpZHRoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pbm90bih3aWR0aCk7XG4gIH07XG5cbiAgLy8gU2V0IGBiaXRgIG9mIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuc2V0biA9IGZ1bmN0aW9uIHNldG4gKGJpdCwgdmFsKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXQgPT09ICdudW1iZXInICYmIGJpdCA+PSAwKTtcblxuICAgIHZhciBvZmYgPSAoYml0IC8gMjYpIHwgMDtcbiAgICB2YXIgd2JpdCA9IGJpdCAlIDI2O1xuXG4gICAgdGhpcy5fZXhwYW5kKG9mZiArIDEpO1xuXG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy53b3Jkc1tvZmZdID0gdGhpcy53b3Jkc1tvZmZdIHwgKDEgPDwgd2JpdCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbb2ZmXSA9IHRoaXMud29yZHNbb2ZmXSAmIH4oMSA8PCB3Yml0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTtcbiAgfTtcblxuICAvLyBBZGQgYG51bWAgdG8gYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAobnVtKSB7XG4gICAgdmFyIHI7XG5cbiAgICAvLyBuZWdhdGl2ZSArIHBvc2l0aXZlXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHIgPSB0aGlzLmlzdWIobnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgXj0gMTtcbiAgICAgIHJldHVybiB0aGlzLl9ub3JtU2lnbigpO1xuXG4gICAgLy8gcG9zaXRpdmUgKyBuZWdhdGl2ZVxuICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICByID0gdGhpcy5pc3ViKG51bSk7XG4gICAgICBudW0ubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHIuX25vcm1TaWduKCk7XG4gICAgfVxuXG4gICAgLy8gYS5sZW5ndGggPiBiLmxlbmd0aFxuICAgIHZhciBhLCBiO1xuICAgIGlmICh0aGlzLmxlbmd0aCA+IG51bS5sZW5ndGgpIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIChiLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSByID4+PiAyNjtcbiAgICB9XG4gICAgZm9yICg7IGNhcnJ5ICE9PSAwICYmIGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSArIGNhcnJ5O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHIgJiAweDNmZmZmZmY7XG4gICAgICBjYXJyeSA9IHIgPj4+IDI2O1xuICAgIH1cblxuICAgIHRoaXMubGVuZ3RoID0gYS5sZW5ndGg7XG4gICAgaWYgKGNhcnJ5ICE9PSAwKSB7XG4gICAgICB0aGlzLndvcmRzW3RoaXMubGVuZ3RoXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICAvLyBDb3B5IHRoZSByZXN0IG9mIHRoZSB3b3Jkc1xuICAgIH0gZWxzZSBpZiAoYSAhPT0gdGhpcykge1xuICAgICAgZm9yICg7IGkgPCBhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBhLndvcmRzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIEFkZCBgbnVtYCB0byBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIGFkZCAobnVtKSB7XG4gICAgdmFyIHJlcztcbiAgICBpZiAobnVtLm5lZ2F0aXZlICE9PSAwICYmIHRoaXMubmVnYXRpdmUgPT09IDApIHtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDA7XG4gICAgICByZXMgPSB0aGlzLnN1YihudW0pO1xuICAgICAgbnVtLm5lZ2F0aXZlIF49IDE7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSBpZiAobnVtLm5lZ2F0aXZlID09PSAwICYmIHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuICAgICAgcmVzID0gbnVtLnN1Yih0aGlzKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gdGhpcy5jbG9uZSgpLmlhZGQobnVtKTtcblxuICAgIHJldHVybiBudW0uY2xvbmUoKS5pYWRkKHRoaXMpO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IGBudW1gIGZyb20gYHRoaXNgIGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAobnVtKSB7XG4gICAgLy8gdGhpcyAtICgtbnVtKSA9IHRoaXMgKyBudW1cbiAgICBpZiAobnVtLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBudW0ubmVnYXRpdmUgPSAwO1xuICAgICAgdmFyIHIgPSB0aGlzLmlhZGQobnVtKTtcbiAgICAgIG51bS5uZWdhdGl2ZSA9IDE7XG4gICAgICByZXR1cm4gci5fbm9ybVNpZ24oKTtcblxuICAgIC8vIC10aGlzIC0gbnVtID0gLSh0aGlzICsgbnVtKVxuICAgIH0gZWxzZSBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlhZGQobnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXMuX25vcm1TaWduKCk7XG4gICAgfVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCBib3RoIG51bWJlcnMgYXJlIHBvc2l0aXZlXG4gICAgdmFyIGNtcCA9IHRoaXMuY21wKG51bSk7XG5cbiAgICAvLyBPcHRpbWl6YXRpb24gLSB6ZXJvaWZ5XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgICB0aGlzLndvcmRzWzBdID0gMDtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIGEgPiBiXG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGNtcCA+IDApIHtcbiAgICAgIGEgPSB0aGlzO1xuICAgICAgYiA9IG51bTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IG51bTtcbiAgICAgIGIgPSB0aGlzO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKSB7XG4gICAgICByID0gKGEud29yZHNbaV0gfCAwKSAtIChiLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gciA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSByICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICBmb3IgKDsgY2FycnkgIT09IDAgJiYgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIHIgPSAoYS53b3Jkc1tpXSB8IDApICsgY2Fycnk7XG4gICAgICBjYXJyeSA9IHIgPj4gMjY7XG4gICAgICB0aGlzLndvcmRzW2ldID0gciAmIDB4M2ZmZmZmZjtcbiAgICB9XG5cbiAgICAvLyBDb3B5IHJlc3Qgb2YgdGhlIHdvcmRzXG4gICAgaWYgKGNhcnJ5ID09PSAwICYmIGkgPCBhLmxlbmd0aCAmJiBhICE9PSB0aGlzKSB7XG4gICAgICBmb3IgKDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGEud29yZHNbaV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sZW5ndGggPSBNYXRoLm1heCh0aGlzLmxlbmd0aCwgaSk7XG5cbiAgICBpZiAoYSAhPT0gdGhpcykge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gIH07XG5cbiAgLy8gU3VidHJhY3QgYG51bWAgZnJvbSBgdGhpc2BcbiAgQk4ucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc3ViKG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gc21hbGxNdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICBvdXQubmVnYXRpdmUgPSBudW0ubmVnYXRpdmUgXiBzZWxmLm5lZ2F0aXZlO1xuICAgIHZhciBsZW4gPSAoc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoKSB8IDA7XG4gICAgb3V0Lmxlbmd0aCA9IGxlbjtcbiAgICBsZW4gPSAobGVuIC0gMSkgfCAwO1xuXG4gICAgLy8gUGVlbCBvbmUgaXRlcmF0aW9uIChjb21waWxlciBjYW4ndCBkbyBpdCwgYmVjYXVzZSBvZiBjb2RlIGNvbXBsZXhpdHkpXG4gICAgdmFyIGEgPSBzZWxmLndvcmRzWzBdIHwgMDtcbiAgICB2YXIgYiA9IG51bS53b3Jkc1swXSB8IDA7XG4gICAgdmFyIHIgPSBhICogYjtcblxuICAgIHZhciBsbyA9IHIgJiAweDNmZmZmZmY7XG4gICAgdmFyIGNhcnJ5ID0gKHIgLyAweDQwMDAwMDApIHwgMDtcbiAgICBvdXQud29yZHNbMF0gPSBsbztcblxuICAgIGZvciAodmFyIGsgPSAxOyBrIDwgbGVuOyBrKyspIHtcbiAgICAgIC8vIFN1bSBhbGwgd29yZHMgd2l0aCB0aGUgc2FtZSBgaSArIGogPSBrYCBhbmQgYWNjdW11bGF0ZSBgbmNhcnJ5YCxcbiAgICAgIC8vIG5vdGUgdGhhdCBuY2FycnkgY291bGQgYmUgPj0gMHgzZmZmZmZmXG4gICAgICB2YXIgbmNhcnJ5ID0gY2FycnkgPj4+IDI2O1xuICAgICAgdmFyIHJ3b3JkID0gY2FycnkgJiAweDNmZmZmZmY7XG4gICAgICB2YXIgbWF4SiA9IE1hdGgubWluKGssIG51bS5sZW5ndGggLSAxKTtcbiAgICAgIGZvciAodmFyIGogPSBNYXRoLm1heCgwLCBrIC0gc2VsZi5sZW5ndGggKyAxKTsgaiA8PSBtYXhKOyBqKyspIHtcbiAgICAgICAgdmFyIGkgPSAoayAtIGopIHwgMDtcbiAgICAgICAgYSA9IHNlbGYud29yZHNbaV0gfCAwO1xuICAgICAgICBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgciA9IGEgKiBiICsgcndvcmQ7XG4gICAgICAgIG5jYXJyeSArPSAociAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgICByd29yZCA9IHIgJiAweDNmZmZmZmY7XG4gICAgICB9XG4gICAgICBvdXQud29yZHNba10gPSByd29yZCB8IDA7XG4gICAgICBjYXJyeSA9IG5jYXJyeSB8IDA7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2FycnkgfCAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubGVuZ3RoLS07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dC5fc3RyaXAoKTtcbiAgfVxuXG4gIC8vIFRPRE8oaW5kdXRueSk6IGl0IG1heSBiZSByZWFzb25hYmxlIHRvIG9taXQgaXQgZm9yIHVzZXJzIHdobyBkb24ndCBuZWVkXG4gIC8vIHRvIHdvcmsgd2l0aCAyNTYtYml0IG51bWJlcnMsIG90aGVyd2lzZSBpdCBnaXZlcyAyMCUgaW1wcm92ZW1lbnQgZm9yIDI1Ni1iaXRcbiAgLy8gbXVsdGlwbGljYXRpb24gKGxpa2UgZWxsaXB0aWMgc2VjcDI1NmsxKS5cbiAgdmFyIGNvbWIxME11bFRvID0gZnVuY3Rpb24gY29tYjEwTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgdmFyIGEgPSBzZWxmLndvcmRzO1xuICAgIHZhciBiID0gbnVtLndvcmRzO1xuICAgIHZhciBvID0gb3V0LndvcmRzO1xuICAgIHZhciBjID0gMDtcbiAgICB2YXIgbG87XG4gICAgdmFyIG1pZDtcbiAgICB2YXIgaGk7XG4gICAgdmFyIGEwID0gYVswXSB8IDA7XG4gICAgdmFyIGFsMCA9IGEwICYgMHgxZmZmO1xuICAgIHZhciBhaDAgPSBhMCA+Pj4gMTM7XG4gICAgdmFyIGExID0gYVsxXSB8IDA7XG4gICAgdmFyIGFsMSA9IGExICYgMHgxZmZmO1xuICAgIHZhciBhaDEgPSBhMSA+Pj4gMTM7XG4gICAgdmFyIGEyID0gYVsyXSB8IDA7XG4gICAgdmFyIGFsMiA9IGEyICYgMHgxZmZmO1xuICAgIHZhciBhaDIgPSBhMiA+Pj4gMTM7XG4gICAgdmFyIGEzID0gYVszXSB8IDA7XG4gICAgdmFyIGFsMyA9IGEzICYgMHgxZmZmO1xuICAgIHZhciBhaDMgPSBhMyA+Pj4gMTM7XG4gICAgdmFyIGE0ID0gYVs0XSB8IDA7XG4gICAgdmFyIGFsNCA9IGE0ICYgMHgxZmZmO1xuICAgIHZhciBhaDQgPSBhNCA+Pj4gMTM7XG4gICAgdmFyIGE1ID0gYVs1XSB8IDA7XG4gICAgdmFyIGFsNSA9IGE1ICYgMHgxZmZmO1xuICAgIHZhciBhaDUgPSBhNSA+Pj4gMTM7XG4gICAgdmFyIGE2ID0gYVs2XSB8IDA7XG4gICAgdmFyIGFsNiA9IGE2ICYgMHgxZmZmO1xuICAgIHZhciBhaDYgPSBhNiA+Pj4gMTM7XG4gICAgdmFyIGE3ID0gYVs3XSB8IDA7XG4gICAgdmFyIGFsNyA9IGE3ICYgMHgxZmZmO1xuICAgIHZhciBhaDcgPSBhNyA+Pj4gMTM7XG4gICAgdmFyIGE4ID0gYVs4XSB8IDA7XG4gICAgdmFyIGFsOCA9IGE4ICYgMHgxZmZmO1xuICAgIHZhciBhaDggPSBhOCA+Pj4gMTM7XG4gICAgdmFyIGE5ID0gYVs5XSB8IDA7XG4gICAgdmFyIGFsOSA9IGE5ICYgMHgxZmZmO1xuICAgIHZhciBhaDkgPSBhOSA+Pj4gMTM7XG4gICAgdmFyIGIwID0gYlswXSB8IDA7XG4gICAgdmFyIGJsMCA9IGIwICYgMHgxZmZmO1xuICAgIHZhciBiaDAgPSBiMCA+Pj4gMTM7XG4gICAgdmFyIGIxID0gYlsxXSB8IDA7XG4gICAgdmFyIGJsMSA9IGIxICYgMHgxZmZmO1xuICAgIHZhciBiaDEgPSBiMSA+Pj4gMTM7XG4gICAgdmFyIGIyID0gYlsyXSB8IDA7XG4gICAgdmFyIGJsMiA9IGIyICYgMHgxZmZmO1xuICAgIHZhciBiaDIgPSBiMiA+Pj4gMTM7XG4gICAgdmFyIGIzID0gYlszXSB8IDA7XG4gICAgdmFyIGJsMyA9IGIzICYgMHgxZmZmO1xuICAgIHZhciBiaDMgPSBiMyA+Pj4gMTM7XG4gICAgdmFyIGI0ID0gYls0XSB8IDA7XG4gICAgdmFyIGJsNCA9IGI0ICYgMHgxZmZmO1xuICAgIHZhciBiaDQgPSBiNCA+Pj4gMTM7XG4gICAgdmFyIGI1ID0gYls1XSB8IDA7XG4gICAgdmFyIGJsNSA9IGI1ICYgMHgxZmZmO1xuICAgIHZhciBiaDUgPSBiNSA+Pj4gMTM7XG4gICAgdmFyIGI2ID0gYls2XSB8IDA7XG4gICAgdmFyIGJsNiA9IGI2ICYgMHgxZmZmO1xuICAgIHZhciBiaDYgPSBiNiA+Pj4gMTM7XG4gICAgdmFyIGI3ID0gYls3XSB8IDA7XG4gICAgdmFyIGJsNyA9IGI3ICYgMHgxZmZmO1xuICAgIHZhciBiaDcgPSBiNyA+Pj4gMTM7XG4gICAgdmFyIGI4ID0gYls4XSB8IDA7XG4gICAgdmFyIGJsOCA9IGI4ICYgMHgxZmZmO1xuICAgIHZhciBiaDggPSBiOCA+Pj4gMTM7XG4gICAgdmFyIGI5ID0gYls5XSB8IDA7XG4gICAgdmFyIGJsOSA9IGI5ICYgMHgxZmZmO1xuICAgIHZhciBiaDkgPSBiOSA+Pj4gMTM7XG5cbiAgICBvdXQubmVnYXRpdmUgPSBzZWxmLm5lZ2F0aXZlIF4gbnVtLm5lZ2F0aXZlO1xuICAgIG91dC5sZW5ndGggPSAxOTtcbiAgICAvKiBrID0gMCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwwLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgwLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgwLCBiaDApO1xuICAgIHZhciB3MCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzAgPj4+IDI2KSkgfCAwO1xuICAgIHcwICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwxLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgxLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoMSkpIHwgMDtcbiAgICB2YXIgdzEgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxID4+PiAyNikpIHwgMDtcbiAgICB3MSAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDIgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDIsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsMiwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMiwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoMiwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgyKSkgfCAwO1xuICAgIHZhciB3MiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzIgPj4+IDI2KSkgfCAwO1xuICAgIHcyICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsMywgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWwzLCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgzLCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWgzLCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmgzKSkgfCAwO1xuICAgIHZhciB3MyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzMgPj4+IDI2KSkgfCAwO1xuICAgIHczICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNCwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw0LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg0LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNCkpIHwgMDtcbiAgICB2YXIgdzQgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc0ID4+PiAyNikpIHwgMDtcbiAgICB3NCAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDUgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDUsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsNSwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNSwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoNSwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg1KSkgfCAwO1xuICAgIHZhciB3NSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzUgPj4+IDI2KSkgfCAwO1xuICAgIHc1ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNiwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw2LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg2LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg2LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg2KSkgfCAwO1xuICAgIHZhciB3NiA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzYgPj4+IDI2KSkgfCAwO1xuICAgIHc2ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gNyAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsNywgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw3LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg3LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwwLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDAsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDAsIGJoNykpIHwgMDtcbiAgICB2YXIgdzcgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHc3ID4+PiAyNikpIHwgMDtcbiAgICB3NyAmPSAweDNmZmZmZmY7XG4gICAgLyogayA9IDggKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDgsIGJsMCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOCwgYmgwKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOCwgYmwwKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOCwgYmgwKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDEpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDEpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDIpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwyKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgyKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmwzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsMykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoMykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDQpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDQpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw1KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg1KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNikpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNikpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDcpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDcpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw4KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg4KSkgfCAwO1xuICAgIHZhciB3OCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzggPj4+IDI2KSkgfCAwO1xuICAgIHc4ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gOSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwwKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDApO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDApKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDApO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmwxKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDEpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsMSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoMSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMiwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwyLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDIsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDIsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDEsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMSwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgxLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgxLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwwLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDAsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMCwgYmg5KSkgfCAwO1xuICAgIHZhciB3OSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzkgPj4+IDI2KSkgfCAwO1xuICAgIHc5ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTAgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgxKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwxKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgxKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgyKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDIpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDIpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDMpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmwzKSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmgzKSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwxLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDEsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMSwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMSwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTAgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMCA+Pj4gMjYpKSB8IDA7XG4gICAgdzEwICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTEgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsMik7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmgyKTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmwyKSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmgyKTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsMykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmgzKSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDMpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDMpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw0KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg0KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDUpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNSkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNSkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsMywgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWwzLCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDMsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDMsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDIsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsMiwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWgyLCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWgyLCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxMSA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzExID4+PiAyNikpIHwgMDtcbiAgICB3MTEgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxMiAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmwzKTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDMpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDMpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDMpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw0KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDQpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNSwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw1LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDUsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDUsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDQsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg0LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg0LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWwzLCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDMsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoMywgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoMywgYmg5KSkgfCAwO1xuICAgIHZhciB3MTIgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMiA+Pj4gMjYpKSB8IDA7XG4gICAgdzEyICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTMgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg0KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw0KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg0KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg1KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDUpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDUpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDYpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw2KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg2KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw0LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDQsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNCwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNCwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTMgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxMyA+Pj4gMjYpKSB8IDA7XG4gICAgdzEzICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTQgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNSk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg1KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw1KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg1KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsNikpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg2KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDYpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDYpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoNykpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw3KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg3KSkgfCAwO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsNiwgYmw4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw2LCBiaDgpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDYsIGJsOCkpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDYsIGJoOCkpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDUsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNSwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg1LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg1LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNCA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE0ID4+PiAyNikpIHwgMDtcbiAgICB3MTQgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxNSAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw2KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDYpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDYpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDYpO1xuICAgIGxvID0gKGxvICsgTWF0aC5pbXVsKGFsOCwgYmw3KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWw4LCBiaDcpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhaDgsIGJsNykpIHwgMDtcbiAgICBoaSA9IChoaSArIE1hdGguaW11bChhaDgsIGJoNykpIHwgMDtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDcsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsNywgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg3LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg3LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw2LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDYsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNiwgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNiwgYmg5KSkgfCAwO1xuICAgIHZhciB3MTUgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNSA+Pj4gMjYpKSB8IDA7XG4gICAgdzE1ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTYgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsNyk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg3KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw3KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg3KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsOCkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg4KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDgpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDgpKSB8IDA7XG4gICAgbG8gPSAobG8gKyBNYXRoLmltdWwoYWw3LCBibDkpKSB8IDA7XG4gICAgbWlkID0gKG1pZCArIE1hdGguaW11bChhbDcsIGJoOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoNywgYmw5KSkgfCAwO1xuICAgIGhpID0gKGhpICsgTWF0aC5pbXVsKGFoNywgYmg5KSkgfCAwO1xuICAgIHZhciB3MTYgPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxNiA+Pj4gMjYpKSB8IDA7XG4gICAgdzE2ICY9IDB4M2ZmZmZmZjtcbiAgICAvKiBrID0gMTcgKi9cbiAgICBsbyA9IE1hdGguaW11bChhbDksIGJsOCk7XG4gICAgbWlkID0gTWF0aC5pbXVsKGFsOSwgYmg4KTtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFoOSwgYmw4KSkgfCAwO1xuICAgIGhpID0gTWF0aC5pbXVsKGFoOSwgYmg4KTtcbiAgICBsbyA9IChsbyArIE1hdGguaW11bChhbDgsIGJsOSkpIHwgMDtcbiAgICBtaWQgPSAobWlkICsgTWF0aC5pbXVsKGFsOCwgYmg5KSkgfCAwO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg4LCBibDkpKSB8IDA7XG4gICAgaGkgPSAoaGkgKyBNYXRoLmltdWwoYWg4LCBiaDkpKSB8IDA7XG4gICAgdmFyIHcxNyA9ICgoKGMgKyBsbykgfCAwKSArICgobWlkICYgMHgxZmZmKSA8PCAxMykpIHwgMDtcbiAgICBjID0gKCgoaGkgKyAobWlkID4+PiAxMykpIHwgMCkgKyAodzE3ID4+PiAyNikpIHwgMDtcbiAgICB3MTcgJj0gMHgzZmZmZmZmO1xuICAgIC8qIGsgPSAxOCAqL1xuICAgIGxvID0gTWF0aC5pbXVsKGFsOSwgYmw5KTtcbiAgICBtaWQgPSBNYXRoLmltdWwoYWw5LCBiaDkpO1xuICAgIG1pZCA9IChtaWQgKyBNYXRoLmltdWwoYWg5LCBibDkpKSB8IDA7XG4gICAgaGkgPSBNYXRoLmltdWwoYWg5LCBiaDkpO1xuICAgIHZhciB3MTggPSAoKChjICsgbG8pIHwgMCkgKyAoKG1pZCAmIDB4MWZmZikgPDwgMTMpKSB8IDA7XG4gICAgYyA9ICgoKGhpICsgKG1pZCA+Pj4gMTMpKSB8IDApICsgKHcxOCA+Pj4gMjYpKSB8IDA7XG4gICAgdzE4ICY9IDB4M2ZmZmZmZjtcbiAgICBvWzBdID0gdzA7XG4gICAgb1sxXSA9IHcxO1xuICAgIG9bMl0gPSB3MjtcbiAgICBvWzNdID0gdzM7XG4gICAgb1s0XSA9IHc0O1xuICAgIG9bNV0gPSB3NTtcbiAgICBvWzZdID0gdzY7XG4gICAgb1s3XSA9IHc3O1xuICAgIG9bOF0gPSB3ODtcbiAgICBvWzldID0gdzk7XG4gICAgb1sxMF0gPSB3MTA7XG4gICAgb1sxMV0gPSB3MTE7XG4gICAgb1sxMl0gPSB3MTI7XG4gICAgb1sxM10gPSB3MTM7XG4gICAgb1sxNF0gPSB3MTQ7XG4gICAgb1sxNV0gPSB3MTU7XG4gICAgb1sxNl0gPSB3MTY7XG4gICAgb1sxN10gPSB3MTc7XG4gICAgb1sxOF0gPSB3MTg7XG4gICAgaWYgKGMgIT09IDApIHtcbiAgICAgIG9bMTldID0gYztcbiAgICAgIG91dC5sZW5ndGgrKztcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfTtcblxuICAvLyBQb2x5ZmlsbCBjb21iXG4gIGlmICghTWF0aC5pbXVsKSB7XG4gICAgY29tYjEwTXVsVG8gPSBzbWFsbE11bFRvO1xuICB9XG5cbiAgZnVuY3Rpb24gYmlnTXVsVG8gKHNlbGYsIG51bSwgb3V0KSB7XG4gICAgb3V0Lm5lZ2F0aXZlID0gbnVtLm5lZ2F0aXZlIF4gc2VsZi5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0gc2VsZi5sZW5ndGggKyBudW0ubGVuZ3RoO1xuXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICB2YXIgaG5jYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBvdXQubGVuZ3RoIC0gMTsgaysrKSB7XG4gICAgICAvLyBTdW0gYWxsIHdvcmRzIHdpdGggdGhlIHNhbWUgYGkgKyBqID0ga2AgYW5kIGFjY3VtdWxhdGUgYG5jYXJyeWAsXG4gICAgICAvLyBub3RlIHRoYXQgbmNhcnJ5IGNvdWxkIGJlID49IDB4M2ZmZmZmZlxuICAgICAgdmFyIG5jYXJyeSA9IGhuY2Fycnk7XG4gICAgICBobmNhcnJ5ID0gMDtcbiAgICAgIHZhciByd29yZCA9IGNhcnJ5ICYgMHgzZmZmZmZmO1xuICAgICAgdmFyIG1heEogPSBNYXRoLm1pbihrLCBudW0ubGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKHZhciBqID0gTWF0aC5tYXgoMCwgayAtIHNlbGYubGVuZ3RoICsgMSk7IGogPD0gbWF4SjsgaisrKSB7XG4gICAgICAgIHZhciBpID0gayAtIGo7XG4gICAgICAgIHZhciBhID0gc2VsZi53b3Jkc1tpXSB8IDA7XG4gICAgICAgIHZhciBiID0gbnVtLndvcmRzW2pdIHwgMDtcbiAgICAgICAgdmFyIHIgPSBhICogYjtcblxuICAgICAgICB2YXIgbG8gPSByICYgMHgzZmZmZmZmO1xuICAgICAgICBuY2FycnkgPSAobmNhcnJ5ICsgKChyIC8gMHg0MDAwMDAwKSB8IDApKSB8IDA7XG4gICAgICAgIGxvID0gKGxvICsgcndvcmQpIHwgMDtcbiAgICAgICAgcndvcmQgPSBsbyAmIDB4M2ZmZmZmZjtcbiAgICAgICAgbmNhcnJ5ID0gKG5jYXJyeSArIChsbyA+Pj4gMjYpKSB8IDA7XG5cbiAgICAgICAgaG5jYXJyeSArPSBuY2FycnkgPj4+IDI2O1xuICAgICAgICBuY2FycnkgJj0gMHgzZmZmZmZmO1xuICAgICAgfVxuICAgICAgb3V0LndvcmRzW2tdID0gcndvcmQ7XG4gICAgICBjYXJyeSA9IG5jYXJyeTtcbiAgICAgIG5jYXJyeSA9IGhuY2Fycnk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgb3V0LndvcmRzW2tdID0gY2Fycnk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5sZW5ndGgtLTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0Ll9zdHJpcCgpO1xuICB9XG5cbiAgZnVuY3Rpb24ganVtYm9NdWxUbyAoc2VsZiwgbnVtLCBvdXQpIHtcbiAgICAvLyBUZW1wb3JhcnkgZGlzYWJsZSwgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9pbmR1dG55L2JuLmpzL2lzc3Vlcy8yMTFcbiAgICAvLyB2YXIgZmZ0bSA9IG5ldyBGRlRNKCk7XG4gICAgLy8gcmV0dXJuIGZmdG0ubXVscChzZWxmLCBudW0sIG91dCk7XG4gICAgcmV0dXJuIGJpZ011bFRvKHNlbGYsIG51bSwgb3V0KTtcbiAgfVxuXG4gIEJOLnByb3RvdHlwZS5tdWxUbyA9IGZ1bmN0aW9uIG11bFRvIChudW0sIG91dCkge1xuICAgIHZhciByZXM7XG4gICAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoICsgbnVtLmxlbmd0aDtcbiAgICBpZiAodGhpcy5sZW5ndGggPT09IDEwICYmIG51bS5sZW5ndGggPT09IDEwKSB7XG4gICAgICByZXMgPSBjb21iMTBNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIGlmIChsZW4gPCA2Mykge1xuICAgICAgcmVzID0gc21hbGxNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIGlmIChsZW4gPCAxMDI0KSB7XG4gICAgICByZXMgPSBiaWdNdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcyA9IGp1bWJvTXVsVG8odGhpcywgbnVtLCBvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gQ29vbGV5LVR1a2V5IGFsZ29yaXRobSBmb3IgRkZUXG4gIC8vIHNsaWdodGx5IHJldmlzaXRlZCB0byByZWx5IG9uIGxvb3BpbmcgaW5zdGVhZCBvZiByZWN1cnNpb25cblxuICBmdW5jdGlvbiBGRlRNICh4LCB5KSB7XG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuICB9XG5cbiAgRkZUTS5wcm90b3R5cGUubWFrZVJCVCA9IGZ1bmN0aW9uIG1ha2VSQlQgKE4pIHtcbiAgICB2YXIgdCA9IG5ldyBBcnJheShOKTtcbiAgICB2YXIgbCA9IEJOLnByb3RvdHlwZS5fY291bnRCaXRzKE4pIC0gMTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE47IGkrKykge1xuICAgICAgdFtpXSA9IHRoaXMucmV2QmluKGksIGwsIE4pO1xuICAgIH1cblxuICAgIHJldHVybiB0O1xuICB9O1xuXG4gIC8vIFJldHVybnMgYmluYXJ5LXJldmVyc2VkIHJlcHJlc2VudGF0aW9uIG9mIGB4YFxuICBGRlRNLnByb3RvdHlwZS5yZXZCaW4gPSBmdW5jdGlvbiByZXZCaW4gKHgsIGwsIE4pIHtcbiAgICBpZiAoeCA9PT0gMCB8fCB4ID09PSBOIC0gMSkgcmV0dXJuIHg7XG5cbiAgICB2YXIgcmIgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICByYiB8PSAoeCAmIDEpIDw8IChsIC0gaSAtIDEpO1xuICAgICAgeCA+Pj0gMTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmI7XG4gIH07XG5cbiAgLy8gUGVyZm9ybXMgXCJ0d2VlZGxpbmdcIiBwaGFzZSwgdGhlcmVmb3JlICdlbXVsYXRpbmcnXG4gIC8vIGJlaGF2aW91ciBvZiB0aGUgcmVjdXJzaXZlIGFsZ29yaXRobVxuICBGRlRNLnByb3RvdHlwZS5wZXJtdXRlID0gZnVuY3Rpb24gcGVybXV0ZSAocmJ0LCByd3MsIGl3cywgcnR3cywgaXR3cywgTikge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICBydHdzW2ldID0gcndzW3JidFtpXV07XG4gICAgICBpdHdzW2ldID0gaXdzW3JidFtpXV07XG4gICAgfVxuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uIHRyYW5zZm9ybSAocndzLCBpd3MsIHJ0d3MsIGl0d3MsIE4sIHJidCkge1xuICAgIHRoaXMucGVybXV0ZShyYnQsIHJ3cywgaXdzLCBydHdzLCBpdHdzLCBOKTtcblxuICAgIGZvciAodmFyIHMgPSAxOyBzIDwgTjsgcyA8PD0gMSkge1xuICAgICAgdmFyIGwgPSBzIDw8IDE7XG5cbiAgICAgIHZhciBydHdkZiA9IE1hdGguY29zKDIgKiBNYXRoLlBJIC8gbCk7XG4gICAgICB2YXIgaXR3ZGYgPSBNYXRoLnNpbigyICogTWF0aC5QSSAvIGwpO1xuXG4gICAgICBmb3IgKHZhciBwID0gMDsgcCA8IE47IHAgKz0gbCkge1xuICAgICAgICB2YXIgcnR3ZGZfID0gcnR3ZGY7XG4gICAgICAgIHZhciBpdHdkZl8gPSBpdHdkZjtcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHM7IGorKykge1xuICAgICAgICAgIHZhciByZSA9IHJ0d3NbcCArIGpdO1xuICAgICAgICAgIHZhciBpZSA9IGl0d3NbcCArIGpdO1xuXG4gICAgICAgICAgdmFyIHJvID0gcnR3c1twICsgaiArIHNdO1xuICAgICAgICAgIHZhciBpbyA9IGl0d3NbcCArIGogKyBzXTtcblxuICAgICAgICAgIHZhciByeCA9IHJ0d2RmXyAqIHJvIC0gaXR3ZGZfICogaW87XG5cbiAgICAgICAgICBpbyA9IHJ0d2RmXyAqIGlvICsgaXR3ZGZfICogcm87XG4gICAgICAgICAgcm8gPSByeDtcblxuICAgICAgICAgIHJ0d3NbcCArIGpdID0gcmUgKyBybztcbiAgICAgICAgICBpdHdzW3AgKyBqXSA9IGllICsgaW87XG5cbiAgICAgICAgICBydHdzW3AgKyBqICsgc10gPSByZSAtIHJvO1xuICAgICAgICAgIGl0d3NbcCArIGogKyBzXSA9IGllIC0gaW87XG5cbiAgICAgICAgICAvKiBqc2hpbnQgbWF4ZGVwdGggOiBmYWxzZSAqL1xuICAgICAgICAgIGlmIChqICE9PSBsKSB7XG4gICAgICAgICAgICByeCA9IHJ0d2RmICogcnR3ZGZfIC0gaXR3ZGYgKiBpdHdkZl87XG5cbiAgICAgICAgICAgIGl0d2RmXyA9IHJ0d2RmICogaXR3ZGZfICsgaXR3ZGYgKiBydHdkZl87XG4gICAgICAgICAgICBydHdkZl8gPSByeDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUuZ3Vlc3NMZW4xM2IgPSBmdW5jdGlvbiBndWVzc0xlbjEzYiAobiwgbSkge1xuICAgIHZhciBOID0gTWF0aC5tYXgobSwgbikgfCAxO1xuICAgIHZhciBvZGQgPSBOICYgMTtcbiAgICB2YXIgaSA9IDA7XG4gICAgZm9yIChOID0gTiAvIDIgfCAwOyBOOyBOID0gTiA+Pj4gMSkge1xuICAgICAgaSsrO1xuICAgIH1cblxuICAgIHJldHVybiAxIDw8IGkgKyAxICsgb2RkO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmNvbmp1Z2F0ZSA9IGZ1bmN0aW9uIGNvbmp1Z2F0ZSAocndzLCBpd3MsIE4pIHtcbiAgICBpZiAoTiA8PSAxKSByZXR1cm47XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IE4gLyAyOyBpKyspIHtcbiAgICAgIHZhciB0ID0gcndzW2ldO1xuXG4gICAgICByd3NbaV0gPSByd3NbTiAtIGkgLSAxXTtcbiAgICAgIHJ3c1tOIC0gaSAtIDFdID0gdDtcblxuICAgICAgdCA9IGl3c1tpXTtcblxuICAgICAgaXdzW2ldID0gLWl3c1tOIC0gaSAtIDFdO1xuICAgICAgaXdzW04gLSBpIC0gMV0gPSAtdDtcbiAgICB9XG4gIH07XG5cbiAgRkZUTS5wcm90b3R5cGUubm9ybWFsaXplMTNiID0gZnVuY3Rpb24gbm9ybWFsaXplMTNiICh3cywgTikge1xuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBOIC8gMjsgaSsrKSB7XG4gICAgICB2YXIgdyA9IE1hdGgucm91bmQod3NbMiAqIGkgKyAxXSAvIE4pICogMHgyMDAwICtcbiAgICAgICAgTWF0aC5yb3VuZCh3c1syICogaV0gLyBOKSArXG4gICAgICAgIGNhcnJ5O1xuXG4gICAgICB3c1tpXSA9IHcgJiAweDNmZmZmZmY7XG5cbiAgICAgIGlmICh3IDwgMHg0MDAwMDAwKSB7XG4gICAgICAgIGNhcnJ5ID0gMDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhcnJ5ID0gdyAvIDB4NDAwMDAwMCB8IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHdzO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLmNvbnZlcnQxM2IgPSBmdW5jdGlvbiBjb252ZXJ0MTNiICh3cywgbGVuLCByd3MsIE4pIHtcbiAgICB2YXIgY2FycnkgPSAwO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGNhcnJ5ID0gY2FycnkgKyAod3NbaV0gfCAwKTtcblxuICAgICAgcndzWzIgKiBpXSA9IGNhcnJ5ICYgMHgxZmZmOyBjYXJyeSA9IGNhcnJ5ID4+PiAxMztcbiAgICAgIHJ3c1syICogaSArIDFdID0gY2FycnkgJiAweDFmZmY7IGNhcnJ5ID0gY2FycnkgPj4+IDEzO1xuICAgIH1cblxuICAgIC8vIFBhZCB3aXRoIHplcm9lc1xuICAgIGZvciAoaSA9IDIgKiBsZW47IGkgPCBOOyArK2kpIHtcbiAgICAgIHJ3c1tpXSA9IDA7XG4gICAgfVxuXG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAwKTtcbiAgICBhc3NlcnQoKGNhcnJ5ICYgfjB4MWZmZikgPT09IDApO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLnN0dWIgPSBmdW5jdGlvbiBzdHViIChOKSB7XG4gICAgdmFyIHBoID0gbmV3IEFycmF5KE4pO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICBwaFtpXSA9IDA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBoO1xuICB9O1xuXG4gIEZGVE0ucHJvdG90eXBlLm11bHAgPSBmdW5jdGlvbiBtdWxwICh4LCB5LCBvdXQpIHtcbiAgICB2YXIgTiA9IDIgKiB0aGlzLmd1ZXNzTGVuMTNiKHgubGVuZ3RoLCB5Lmxlbmd0aCk7XG5cbiAgICB2YXIgcmJ0ID0gdGhpcy5tYWtlUkJUKE4pO1xuXG4gICAgdmFyIF8gPSB0aGlzLnN0dWIoTik7XG5cbiAgICB2YXIgcndzID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciByd3N0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBpd3N0ID0gbmV3IEFycmF5KE4pO1xuXG4gICAgdmFyIG5yd3MgPSBuZXcgQXJyYXkoTik7XG4gICAgdmFyIG5yd3N0ID0gbmV3IEFycmF5KE4pO1xuICAgIHZhciBuaXdzdCA9IG5ldyBBcnJheShOKTtcblxuICAgIHZhciBybXdzID0gb3V0LndvcmRzO1xuICAgIHJtd3MubGVuZ3RoID0gTjtcblxuICAgIHRoaXMuY29udmVydDEzYih4LndvcmRzLCB4Lmxlbmd0aCwgcndzLCBOKTtcbiAgICB0aGlzLmNvbnZlcnQxM2IoeS53b3JkcywgeS5sZW5ndGgsIG5yd3MsIE4pO1xuXG4gICAgdGhpcy50cmFuc2Zvcm0ocndzLCBfLCByd3N0LCBpd3N0LCBOLCByYnQpO1xuICAgIHRoaXMudHJhbnNmb3JtKG5yd3MsIF8sIG5yd3N0LCBuaXdzdCwgTiwgcmJ0KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgTjsgaSsrKSB7XG4gICAgICB2YXIgcnggPSByd3N0W2ldICogbnJ3c3RbaV0gLSBpd3N0W2ldICogbml3c3RbaV07XG4gICAgICBpd3N0W2ldID0gcndzdFtpXSAqIG5pd3N0W2ldICsgaXdzdFtpXSAqIG5yd3N0W2ldO1xuICAgICAgcndzdFtpXSA9IHJ4O1xuICAgIH1cblxuICAgIHRoaXMuY29uanVnYXRlKHJ3c3QsIGl3c3QsIE4pO1xuICAgIHRoaXMudHJhbnNmb3JtKHJ3c3QsIGl3c3QsIHJtd3MsIF8sIE4sIHJidCk7XG4gICAgdGhpcy5jb25qdWdhdGUocm13cywgXywgTik7XG4gICAgdGhpcy5ub3JtYWxpemUxM2Iocm13cywgTik7XG5cbiAgICBvdXQubmVnYXRpdmUgPSB4Lm5lZ2F0aXZlIF4geS5uZWdhdGl2ZTtcbiAgICBvdXQubGVuZ3RoID0geC5sZW5ndGggKyB5Lmxlbmd0aDtcbiAgICByZXR1cm4gb3V0Ll9zdHJpcCgpO1xuICB9O1xuXG4gIC8vIE11bHRpcGx5IGB0aGlzYCBieSBgbnVtYFxuICBCTi5wcm90b3R5cGUubXVsID0gZnVuY3Rpb24gbXVsIChudW0pIHtcbiAgICB2YXIgb3V0ID0gbmV3IEJOKG51bGwpO1xuICAgIG91dC53b3JkcyA9IG5ldyBBcnJheSh0aGlzLmxlbmd0aCArIG51bS5sZW5ndGgpO1xuICAgIHJldHVybiB0aGlzLm11bFRvKG51bSwgb3V0KTtcbiAgfTtcblxuICAvLyBNdWx0aXBseSBlbXBsb3lpbmcgRkZUXG4gIEJOLnByb3RvdHlwZS5tdWxmID0gZnVuY3Rpb24gbXVsZiAobnVtKSB7XG4gICAgdmFyIG91dCA9IG5ldyBCTihudWxsKTtcbiAgICBvdXQud29yZHMgPSBuZXcgQXJyYXkodGhpcy5sZW5ndGggKyBudW0ubGVuZ3RoKTtcbiAgICByZXR1cm4ganVtYm9NdWxUbyh0aGlzLCBudW0sIG91dCk7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgTXVsdGlwbGljYXRpb25cbiAgQk4ucHJvdG90eXBlLmltdWwgPSBmdW5jdGlvbiBpbXVsIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLm11bFRvKG51bSwgdGhpcyk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmltdWxuID0gZnVuY3Rpb24gaW11bG4gKG51bSkge1xuICAgIHZhciBpc05lZ051bSA9IG51bSA8IDA7XG4gICAgaWYgKGlzTmVnTnVtKSBudW0gPSAtbnVtO1xuXG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcblxuICAgIC8vIENhcnJ5XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gKHRoaXMud29yZHNbaV0gfCAwKSAqIG51bTtcbiAgICAgIHZhciBsbyA9ICh3ICYgMHgzZmZmZmZmKSArIChjYXJyeSAmIDB4M2ZmZmZmZik7XG4gICAgICBjYXJyeSA+Pj0gMjY7XG4gICAgICBjYXJyeSArPSAodyAvIDB4NDAwMDAwMCkgfCAwO1xuICAgICAgLy8gTk9URTogbG8gaXMgMjdiaXQgbWF4aW11bVxuICAgICAgY2FycnkgKz0gbG8gPj4+IDI2O1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGxvICYgMHgzZmZmZmZmO1xuICAgIH1cblxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG4gICAgdGhpcy5sZW5ndGggPSBudW0gPT09IDAgPyAxIDogdGhpcy5sZW5ndGg7XG5cbiAgICByZXR1cm4gaXNOZWdOdW0gPyB0aGlzLmluZWcoKSA6IHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLm11bG4gPSBmdW5jdGlvbiBtdWxuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmltdWxuKG51bSk7XG4gIH07XG5cbiAgLy8gYHRoaXNgICogYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5zcXIgPSBmdW5jdGlvbiBzcXIgKCkge1xuICAgIHJldHVybiB0aGlzLm11bCh0aGlzKTtcbiAgfTtcblxuICAvLyBgdGhpc2AgKiBgdGhpc2AgaW4tcGxhY2VcbiAgQk4ucHJvdG90eXBlLmlzcXIgPSBmdW5jdGlvbiBpc3FyICgpIHtcbiAgICByZXR1cm4gdGhpcy5pbXVsKHRoaXMuY2xvbmUoKSk7XG4gIH07XG5cbiAgLy8gTWF0aC5wb3coYHRoaXNgLCBgbnVtYClcbiAgQk4ucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uIHBvdyAobnVtKSB7XG4gICAgdmFyIHcgPSB0b0JpdEFycmF5KG51bSk7XG4gICAgaWYgKHcubGVuZ3RoID09PSAwKSByZXR1cm4gbmV3IEJOKDEpO1xuXG4gICAgLy8gU2tpcCBsZWFkaW5nIHplcm9lc1xuICAgIHZhciByZXMgPSB0aGlzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdy5sZW5ndGg7IGkrKywgcmVzID0gcmVzLnNxcigpKSB7XG4gICAgICBpZiAod1tpXSAhPT0gMCkgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKCsraSA8IHcubGVuZ3RoKSB7XG4gICAgICBmb3IgKHZhciBxID0gcmVzLnNxcigpOyBpIDwgdy5sZW5ndGg7IGkrKywgcSA9IHEuc3FyKCkpIHtcbiAgICAgICAgaWYgKHdbaV0gPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgIHJlcyA9IHJlcy5tdWwocSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvLyBTaGlmdC1sZWZ0IGluLXBsYWNlXG4gIEJOLnByb3RvdHlwZS5pdXNobG4gPSBmdW5jdGlvbiBpdXNobG4gKGJpdHMpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIHIgPSBiaXRzICUgMjY7XG4gICAgdmFyIHMgPSAoYml0cyAtIHIpIC8gMjY7XG4gICAgdmFyIGNhcnJ5TWFzayA9ICgweDNmZmZmZmYgPj4+ICgyNiAtIHIpKSA8PCAoMjYgLSByKTtcbiAgICB2YXIgaTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgY2FycnkgPSAwO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbmV3Q2FycnkgPSB0aGlzLndvcmRzW2ldICYgY2FycnlNYXNrO1xuICAgICAgICB2YXIgYyA9ICgodGhpcy53b3Jkc1tpXSB8IDApIC0gbmV3Q2FycnkpIDw8IHI7XG4gICAgICAgIHRoaXMud29yZHNbaV0gPSBjIHwgY2Fycnk7XG4gICAgICAgIGNhcnJ5ID0gbmV3Q2FycnkgPj4+ICgyNiAtIHIpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2FycnkpIHtcbiAgICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgICB0aGlzLmxlbmd0aCsrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzICE9PSAwKSB7XG4gICAgICBmb3IgKGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIHNdID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgaSA8IHM7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gMDtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sZW5ndGggKz0gcztcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaXNobG4gPSBmdW5jdGlvbiBpc2hsbiAoYml0cykge1xuICAgIC8vIFRPRE8oaW5kdXRueSk6IGltcGxlbWVudCBtZVxuICAgIGFzc2VydCh0aGlzLm5lZ2F0aXZlID09PSAwKTtcbiAgICByZXR1cm4gdGhpcy5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHQgaW4tcGxhY2VcbiAgLy8gTk9URTogYGhpbnRgIGlzIGEgbG93ZXN0IGJpdCBiZWZvcmUgdHJhaWxpbmcgemVyb2VzXG4gIC8vIE5PVEU6IGlmIGBleHRlbmRlZGAgaXMgcHJlc2VudCAtIGl0IHdpbGwgYmUgZmlsbGVkIHdpdGggZGVzdHJveWVkIGJpdHNcbiAgQk4ucHJvdG90eXBlLml1c2hybiA9IGZ1bmN0aW9uIGl1c2hybiAoYml0cywgaGludCwgZXh0ZW5kZWQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdHMgPT09ICdudW1iZXInICYmIGJpdHMgPj0gMCk7XG4gICAgdmFyIGg7XG4gICAgaWYgKGhpbnQpIHtcbiAgICAgIGggPSAoaGludCAtIChoaW50ICUgMjYpKSAvIDI2O1xuICAgIH0gZWxzZSB7XG4gICAgICBoID0gMDtcbiAgICB9XG5cbiAgICB2YXIgciA9IGJpdHMgJSAyNjtcbiAgICB2YXIgcyA9IE1hdGgubWluKChiaXRzIC0gcikgLyAyNiwgdGhpcy5sZW5ndGgpO1xuICAgIHZhciBtYXNrID0gMHgzZmZmZmZmIF4gKCgweDNmZmZmZmYgPj4+IHIpIDw8IHIpO1xuICAgIHZhciBtYXNrZWRXb3JkcyA9IGV4dGVuZGVkO1xuXG4gICAgaCAtPSBzO1xuICAgIGggPSBNYXRoLm1heCgwLCBoKTtcblxuICAgIC8vIEV4dGVuZGVkIG1vZGUsIGNvcHkgbWFza2VkIHBhcnRcbiAgICBpZiAobWFza2VkV29yZHMpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgczsgaSsrKSB7XG4gICAgICAgIG1hc2tlZFdvcmRzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpXTtcbiAgICAgIH1cbiAgICAgIG1hc2tlZFdvcmRzLmxlbmd0aCA9IHM7XG4gICAgfVxuXG4gICAgaWYgKHMgPT09IDApIHtcbiAgICAgIC8vIE5vLW9wLCB3ZSBzaG91bGQgbm90IG1vdmUgYW55dGhpbmcgYXQgYWxsXG4gICAgfSBlbHNlIGlmICh0aGlzLmxlbmd0aCA+IHMpIHtcbiAgICAgIHRoaXMubGVuZ3RoIC09IHM7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldID0gdGhpcy53b3Jkc1tpICsgc107XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMud29yZHNbMF0gPSAwO1xuICAgICAgdGhpcy5sZW5ndGggPSAxO1xuICAgIH1cblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yIChpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDAgJiYgKGNhcnJ5ICE9PSAwIHx8IGkgPj0gaCk7IGktLSkge1xuICAgICAgdmFyIHdvcmQgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHRoaXMud29yZHNbaV0gPSAoY2FycnkgPDwgKDI2IC0gcikpIHwgKHdvcmQgPj4+IHIpO1xuICAgICAgY2FycnkgPSB3b3JkICYgbWFzaztcbiAgICB9XG5cbiAgICAvLyBQdXNoIGNhcnJpZWQgYml0cyBhcyBhIG1hc2tcbiAgICBpZiAobWFza2VkV29yZHMgJiYgY2FycnkgIT09IDApIHtcbiAgICAgIG1hc2tlZFdvcmRzLndvcmRzW21hc2tlZFdvcmRzLmxlbmd0aCsrXSA9IGNhcnJ5O1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1swXSA9IDA7XG4gICAgICB0aGlzLmxlbmd0aCA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3N0cmlwKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzaHJuID0gZnVuY3Rpb24gaXNocm4gKGJpdHMsIGhpbnQsIGV4dGVuZGVkKSB7XG4gICAgLy8gVE9ETyhpbmR1dG55KTogaW1wbGVtZW50IG1lXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDApO1xuICAgIHJldHVybiB0aGlzLml1c2hybihiaXRzLCBoaW50LCBleHRlbmRlZCk7XG4gIH07XG5cbiAgLy8gU2hpZnQtbGVmdFxuICBCTi5wcm90b3R5cGUuc2hsbiA9IGZ1bmN0aW9uIHNobG4gKGJpdHMpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlzaGxuKGJpdHMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51c2hsbiA9IGZ1bmN0aW9uIHVzaGxuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4oYml0cyk7XG4gIH07XG5cbiAgLy8gU2hpZnQtcmlnaHRcbiAgQk4ucHJvdG90eXBlLnNocm4gPSBmdW5jdGlvbiBzaHJuIChiaXRzKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybihiaXRzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUudXNocm4gPSBmdW5jdGlvbiB1c2hybiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXVzaHJuKGJpdHMpO1xuICB9O1xuXG4gIC8vIFRlc3QgaWYgbiBiaXQgaXMgc2V0XG4gIEJOLnByb3RvdHlwZS50ZXN0biA9IGZ1bmN0aW9uIHRlc3RuIChiaXQpIHtcbiAgICBhc3NlcnQodHlwZW9mIGJpdCA9PT0gJ251bWJlcicgJiYgYml0ID49IDApO1xuICAgIHZhciByID0gYml0ICUgMjY7XG4gICAgdmFyIHMgPSAoYml0IC0gcikgLyAyNjtcbiAgICB2YXIgcSA9IDEgPDwgcjtcblxuICAgIC8vIEZhc3QgY2FzZTogYml0IGlzIG11Y2ggaGlnaGVyIHRoYW4gYWxsIGV4aXN0aW5nIHdvcmRzXG4gICAgaWYgKHRoaXMubGVuZ3RoIDw9IHMpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIENoZWNrIGJpdCBhbmQgcmV0dXJuXG4gICAgdmFyIHcgPSB0aGlzLndvcmRzW3NdO1xuXG4gICAgcmV0dXJuICEhKHcgJiBxKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gb25seSBsb3dlcnMgYml0cyBvZiBudW1iZXIgKGluLXBsYWNlKVxuICBCTi5wcm90b3R5cGUuaW1hc2tuID0gZnVuY3Rpb24gaW1hc2tuIChiaXRzKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiaXRzID09PSAnbnVtYmVyJyAmJiBiaXRzID49IDApO1xuICAgIHZhciByID0gYml0cyAlIDI2O1xuICAgIHZhciBzID0gKGJpdHMgLSByKSAvIDI2O1xuXG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnMnKTtcblxuICAgIGlmICh0aGlzLmxlbmd0aCA8PSBzKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpZiAociAhPT0gMCkge1xuICAgICAgcysrO1xuICAgIH1cbiAgICB0aGlzLmxlbmd0aCA9IE1hdGgubWluKHMsIHRoaXMubGVuZ3RoKTtcblxuICAgIGlmIChyICE9PSAwKSB7XG4gICAgICB2YXIgbWFzayA9IDB4M2ZmZmZmZiBeICgoMHgzZmZmZmZmID4+PiByKSA8PCByKTtcbiAgICAgIHRoaXMud29yZHNbdGhpcy5sZW5ndGggLSAxXSAmPSBtYXNrO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zdHJpcCgpO1xuICB9O1xuXG4gIC8vIFJldHVybiBvbmx5IGxvd2VycyBiaXRzIG9mIG51bWJlclxuICBCTi5wcm90b3R5cGUubWFza24gPSBmdW5jdGlvbiBtYXNrbiAoYml0cykge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaW1hc2tuKGJpdHMpO1xuICB9O1xuXG4gIC8vIEFkZCBwbGFpbiBudW1iZXIgYG51bWAgdG8gYHRoaXNgXG4gIEJOLnByb3RvdHlwZS5pYWRkbiA9IGZ1bmN0aW9uIGlhZGRuIChudW0pIHtcbiAgICBhc3NlcnQodHlwZW9mIG51bSA9PT0gJ251bWJlcicpO1xuICAgIGFzc2VydChudW0gPCAweDQwMDAwMDApO1xuICAgIGlmIChudW0gPCAwKSByZXR1cm4gdGhpcy5pc3VibigtbnVtKTtcblxuICAgIC8vIFBvc3NpYmxlIHNpZ24gY2hhbmdlXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIGlmICh0aGlzLmxlbmd0aCA9PT0gMSAmJiAodGhpcy53b3Jkc1swXSB8IDApIDw9IG51bSkge1xuICAgICAgICB0aGlzLndvcmRzWzBdID0gbnVtIC0gKHRoaXMud29yZHNbMF0gfCAwKTtcbiAgICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfVxuXG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMDtcbiAgICAgIHRoaXMuaXN1Ym4obnVtKTtcbiAgICAgIHRoaXMubmVnYXRpdmUgPSAxO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gQWRkIHdpdGhvdXQgY2hlY2tzXG4gICAgcmV0dXJuIHRoaXMuX2lhZGRuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pYWRkbiA9IGZ1bmN0aW9uIF9pYWRkbiAobnVtKSB7XG4gICAgdGhpcy53b3Jkc1swXSArPSBudW07XG5cbiAgICAvLyBDYXJyeVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1tpXSA+PSAweDQwMDAwMDA7IGkrKykge1xuICAgICAgdGhpcy53b3Jkc1tpXSAtPSAweDQwMDAwMDA7XG4gICAgICBpZiAoaSA9PT0gdGhpcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdID0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMud29yZHNbaSArIDFdKys7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubGVuZ3RoID0gTWF0aC5tYXgodGhpcy5sZW5ndGgsIGkgKyAxKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8vIFN1YnRyYWN0IHBsYWluIG51bWJlciBgbnVtYCBmcm9tIGB0aGlzYFxuICBCTi5wcm90b3R5cGUuaXN1Ym4gPSBmdW5jdGlvbiBpc3VibiAobnVtKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBudW0gPT09ICdudW1iZXInKTtcbiAgICBhc3NlcnQobnVtIDwgMHg0MDAwMDAwKTtcbiAgICBpZiAobnVtIDwgMCkgcmV0dXJuIHRoaXMuaWFkZG4oLW51bSk7XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgdGhpcy5uZWdhdGl2ZSA9IDA7XG4gICAgICB0aGlzLmlhZGRuKG51bSk7XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMud29yZHNbMF0gLT0gbnVtO1xuXG4gICAgaWYgKHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPCAwKSB7XG4gICAgICB0aGlzLndvcmRzWzBdID0gLXRoaXMud29yZHNbMF07XG4gICAgICB0aGlzLm5lZ2F0aXZlID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FycnlcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5sZW5ndGggJiYgdGhpcy53b3Jkc1tpXSA8IDA7IGkrKykge1xuICAgICAgICB0aGlzLndvcmRzW2ldICs9IDB4NDAwMDAwMDtcbiAgICAgICAgdGhpcy53b3Jkc1tpICsgMV0gLT0gMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc3RyaXAoKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuYWRkbiA9IGZ1bmN0aW9uIGFkZG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaWFkZG4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuc3VibiA9IGZ1bmN0aW9uIHN1Ym4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNsb25lKCkuaXN1Ym4obnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuaWFicyA9IGZ1bmN0aW9uIGlhYnMgKCkge1xuICAgIHRoaXMubmVnYXRpdmUgPSAwO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uIGFicyAoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLl9pc2hsbnN1Ym11bCA9IGZ1bmN0aW9uIF9pc2hsbnN1Ym11bCAobnVtLCBtdWwsIHNoaWZ0KSB7XG4gICAgdmFyIGxlbiA9IG51bS5sZW5ndGggKyBzaGlmdDtcbiAgICB2YXIgaTtcblxuICAgIHRoaXMuX2V4cGFuZChsZW4pO1xuXG4gICAgdmFyIHc7XG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKGkgPSAwOyBpIDwgbnVtLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gKHRoaXMud29yZHNbaSArIHNoaWZ0XSB8IDApICsgY2Fycnk7XG4gICAgICB2YXIgcmlnaHQgPSAobnVtLndvcmRzW2ldIHwgMCkgKiBtdWw7XG4gICAgICB3IC09IHJpZ2h0ICYgMHgzZmZmZmZmO1xuICAgICAgY2FycnkgPSAodyA+PiAyNikgLSAoKHJpZ2h0IC8gMHg0MDAwMDAwKSB8IDApO1xuICAgICAgdGhpcy53b3Jkc1tpICsgc2hpZnRdID0gdyAmIDB4M2ZmZmZmZjtcbiAgICB9XG4gICAgZm9yICg7IGkgPCB0aGlzLmxlbmd0aCAtIHNoaWZ0OyBpKyspIHtcbiAgICAgIHcgPSAodGhpcy53b3Jkc1tpICsgc2hpZnRdIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaSArIHNoaWZ0XSA9IHcgJiAweDNmZmZmZmY7XG4gICAgfVxuXG4gICAgaWYgKGNhcnJ5ID09PSAwKSByZXR1cm4gdGhpcy5fc3RyaXAoKTtcblxuICAgIC8vIFN1YnRyYWN0aW9uIG92ZXJmbG93XG4gICAgYXNzZXJ0KGNhcnJ5ID09PSAtMSk7XG4gICAgY2FycnkgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB3ID0gLSh0aGlzLndvcmRzW2ldIHwgMCkgKyBjYXJyeTtcbiAgICAgIGNhcnJ5ID0gdyA+PiAyNjtcbiAgICAgIHRoaXMud29yZHNbaV0gPSB3ICYgMHgzZmZmZmZmO1xuICAgIH1cbiAgICB0aGlzLm5lZ2F0aXZlID0gMTtcblxuICAgIHJldHVybiB0aGlzLl9zdHJpcCgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5fd29yZERpdiA9IGZ1bmN0aW9uIF93b3JkRGl2IChudW0sIG1vZGUpIHtcbiAgICB2YXIgc2hpZnQgPSB0aGlzLmxlbmd0aCAtIG51bS5sZW5ndGg7XG5cbiAgICB2YXIgYSA9IHRoaXMuY2xvbmUoKTtcbiAgICB2YXIgYiA9IG51bTtcblxuICAgIC8vIE5vcm1hbGl6ZVxuICAgIHZhciBiaGkgPSBiLndvcmRzW2IubGVuZ3RoIC0gMV0gfCAwO1xuICAgIHZhciBiaGlCaXRzID0gdGhpcy5fY291bnRCaXRzKGJoaSk7XG4gICAgc2hpZnQgPSAyNiAtIGJoaUJpdHM7XG4gICAgaWYgKHNoaWZ0ICE9PSAwKSB7XG4gICAgICBiID0gYi51c2hsbihzaGlmdCk7XG4gICAgICBhLml1c2hsbihzaGlmdCk7XG4gICAgICBiaGkgPSBiLndvcmRzW2IubGVuZ3RoIC0gMV0gfCAwO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWxpemUgcXVvdGllbnRcbiAgICB2YXIgbSA9IGEubGVuZ3RoIC0gYi5sZW5ndGg7XG4gICAgdmFyIHE7XG5cbiAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgIHEgPSBuZXcgQk4obnVsbCk7XG4gICAgICBxLmxlbmd0aCA9IG0gKyAxO1xuICAgICAgcS53b3JkcyA9IG5ldyBBcnJheShxLmxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcS53b3Jkc1tpXSA9IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRpZmYgPSBhLmNsb25lKCkuX2lzaGxuc3VibXVsKGIsIDEsIG0pO1xuICAgIGlmIChkaWZmLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICBhID0gZGlmZjtcbiAgICAgIGlmIChxKSB7XG4gICAgICAgIHEud29yZHNbbV0gPSAxO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAodmFyIGogPSBtIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgIHZhciBxaiA9IChhLndvcmRzW2IubGVuZ3RoICsgal0gfCAwKSAqIDB4NDAwMDAwMCArXG4gICAgICAgIChhLndvcmRzW2IubGVuZ3RoICsgaiAtIDFdIHwgMCk7XG5cbiAgICAgIC8vIE5PVEU6IChxaiAvIGJoaSkgaXMgKDB4M2ZmZmZmZiAqIDB4NDAwMDAwMCArIDB4M2ZmZmZmZikgLyAweDIwMDAwMDAgbWF4XG4gICAgICAvLyAoMHg3ZmZmZmZmKVxuICAgICAgcWogPSBNYXRoLm1pbigocWogLyBiaGkpIHwgMCwgMHgzZmZmZmZmKTtcblxuICAgICAgYS5faXNobG5zdWJtdWwoYiwgcWosIGopO1xuICAgICAgd2hpbGUgKGEubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgcWotLTtcbiAgICAgICAgYS5uZWdhdGl2ZSA9IDA7XG4gICAgICAgIGEuX2lzaGxuc3VibXVsKGIsIDEsIGopO1xuICAgICAgICBpZiAoIWEuaXNaZXJvKCkpIHtcbiAgICAgICAgICBhLm5lZ2F0aXZlIF49IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChxKSB7XG4gICAgICAgIHEud29yZHNbal0gPSBxajtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHEpIHtcbiAgICAgIHEuX3N0cmlwKCk7XG4gICAgfVxuICAgIGEuX3N0cmlwKCk7XG5cbiAgICAvLyBEZW5vcm1hbGl6ZVxuICAgIGlmIChtb2RlICE9PSAnZGl2JyAmJiBzaGlmdCAhPT0gMCkge1xuICAgICAgYS5pdXNocm4oc2hpZnQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaXY6IHEgfHwgbnVsbCxcbiAgICAgIG1vZDogYVxuICAgIH07XG4gIH07XG5cbiAgLy8gTk9URTogMSkgYG1vZGVgIGNhbiBiZSBzZXQgdG8gYG1vZGAgdG8gcmVxdWVzdCBtb2Qgb25seSxcbiAgLy8gICAgICAgdG8gYGRpdmAgdG8gcmVxdWVzdCBkaXYgb25seSwgb3IgYmUgYWJzZW50IHRvXG4gIC8vICAgICAgIHJlcXVlc3QgYm90aCBkaXYgJiBtb2RcbiAgLy8gICAgICAgMikgYHBvc2l0aXZlYCBpcyB0cnVlIGlmIHVuc2lnbmVkIG1vZCBpcyByZXF1ZXN0ZWRcbiAgQk4ucHJvdG90eXBlLmRpdm1vZCA9IGZ1bmN0aW9uIGRpdm1vZCAobnVtLCBtb2RlLCBwb3NpdGl2ZSkge1xuICAgIGFzc2VydCghbnVtLmlzWmVybygpKTtcblxuICAgIGlmICh0aGlzLmlzWmVybygpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IG5ldyBCTigwKSxcbiAgICAgICAgbW9kOiBuZXcgQk4oMClcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRpdiwgbW9kLCByZXM7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgbnVtLm5lZ2F0aXZlID09PSAwKSB7XG4gICAgICByZXMgPSB0aGlzLm5lZygpLmRpdm1vZChudW0sIG1vZGUpO1xuXG4gICAgICBpZiAobW9kZSAhPT0gJ21vZCcpIHtcbiAgICAgICAgZGl2ID0gcmVzLmRpdi5uZWcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1vZGUgIT09ICdkaXYnKSB7XG4gICAgICAgIG1vZCA9IHJlcy5tb2QubmVnKCk7XG4gICAgICAgIGlmIChwb3NpdGl2ZSAmJiBtb2QubmVnYXRpdmUgIT09IDApIHtcbiAgICAgICAgICBtb2QuaWFkZChudW0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpdjogZGl2LFxuICAgICAgICBtb2Q6IG1vZFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSA9PT0gMCAmJiBudW0ubmVnYXRpdmUgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnbW9kJykge1xuICAgICAgICBkaXYgPSByZXMuZGl2Lm5lZygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IGRpdixcbiAgICAgICAgbW9kOiByZXMubW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICgodGhpcy5uZWdhdGl2ZSAmIG51bS5uZWdhdGl2ZSkgIT09IDApIHtcbiAgICAgIHJlcyA9IHRoaXMubmVnKCkuZGl2bW9kKG51bS5uZWcoKSwgbW9kZSk7XG5cbiAgICAgIGlmIChtb2RlICE9PSAnZGl2Jykge1xuICAgICAgICBtb2QgPSByZXMubW9kLm5lZygpO1xuICAgICAgICBpZiAocG9zaXRpdmUgJiYgbW9kLm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICAgICAgbW9kLmlzdWIobnVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IHJlcy5kaXYsXG4gICAgICAgIG1vZDogbW9kXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIEJvdGggbnVtYmVycyBhcmUgcG9zaXRpdmUgYXQgdGhpcyBwb2ludFxuXG4gICAgLy8gU3RyaXAgYm90aCBudW1iZXJzIHRvIGFwcHJveGltYXRlIHNoaWZ0IHZhbHVlXG4gICAgaWYgKG51bS5sZW5ndGggPiB0aGlzLmxlbmd0aCB8fCB0aGlzLmNtcChudW0pIDwgMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGl2OiBuZXcgQk4oMCksXG4gICAgICAgIG1vZDogdGhpc1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBWZXJ5IHNob3J0IHJlZHVjdGlvblxuICAgIGlmIChudW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICBpZiAobW9kZSA9PT0gJ2RpdicpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXY6IHRoaXMuZGl2bihudW0ud29yZHNbMF0pLFxuICAgICAgICAgIG1vZDogbnVsbFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZSA9PT0gJ21vZCcpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkaXY6IG51bGwsXG4gICAgICAgICAgbW9kOiBuZXcgQk4odGhpcy5tb2RybihudW0ud29yZHNbMF0pKVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBkaXY6IHRoaXMuZGl2bihudW0ud29yZHNbMF0pLFxuICAgICAgICBtb2Q6IG5ldyBCTih0aGlzLm1vZHJuKG51bS53b3Jkc1swXSkpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl93b3JkRGl2KG51bSwgbW9kZSk7XG4gIH07XG5cbiAgLy8gRmluZCBgdGhpc2AgLyBgbnVtYFxuICBCTi5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24gZGl2IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5kaXZtb2QobnVtLCAnZGl2JywgZmFsc2UpLmRpdjtcbiAgfTtcblxuICAvLyBGaW5kIGB0aGlzYCAlIGBudW1gXG4gIEJOLnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbiBtb2QgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmRpdm1vZChudW0sICdtb2QnLCBmYWxzZSkubW9kO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS51bW9kID0gZnVuY3Rpb24gdW1vZCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuZGl2bW9kKG51bSwgJ21vZCcsIHRydWUpLm1vZDtcbiAgfTtcblxuICAvLyBGaW5kIFJvdW5kKGB0aGlzYCAvIGBudW1gKVxuICBCTi5wcm90b3R5cGUuZGl2Um91bmQgPSBmdW5jdGlvbiBkaXZSb3VuZCAobnVtKSB7XG4gICAgdmFyIGRtID0gdGhpcy5kaXZtb2QobnVtKTtcblxuICAgIC8vIEZhc3QgY2FzZSAtIGV4YWN0IGRpdmlzaW9uXG4gICAgaWYgKGRtLm1vZC5pc1plcm8oKSkgcmV0dXJuIGRtLmRpdjtcblxuICAgIHZhciBtb2QgPSBkbS5kaXYubmVnYXRpdmUgIT09IDAgPyBkbS5tb2QuaXN1YihudW0pIDogZG0ubW9kO1xuXG4gICAgdmFyIGhhbGYgPSBudW0udXNocm4oMSk7XG4gICAgdmFyIHIyID0gbnVtLmFuZGxuKDEpO1xuICAgIHZhciBjbXAgPSBtb2QuY21wKGhhbGYpO1xuXG4gICAgLy8gUm91bmQgZG93blxuICAgIGlmIChjbXAgPCAwIHx8IChyMiA9PT0gMSAmJiBjbXAgPT09IDApKSByZXR1cm4gZG0uZGl2O1xuXG4gICAgLy8gUm91bmQgdXBcbiAgICByZXR1cm4gZG0uZGl2Lm5lZ2F0aXZlICE9PSAwID8gZG0uZGl2LmlzdWJuKDEpIDogZG0uZGl2LmlhZGRuKDEpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5tb2RybiA9IGZ1bmN0aW9uIG1vZHJuIChudW0pIHtcbiAgICB2YXIgaXNOZWdOdW0gPSBudW0gPCAwO1xuICAgIGlmIChpc05lZ051bSkgbnVtID0gLW51bTtcblxuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcbiAgICB2YXIgcCA9ICgxIDw8IDI2KSAlIG51bTtcblxuICAgIHZhciBhY2MgPSAwO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBhY2MgPSAocCAqIGFjYyArICh0aGlzLndvcmRzW2ldIHwgMCkpICUgbnVtO1xuICAgIH1cblxuICAgIHJldHVybiBpc05lZ051bSA/IC1hY2MgOiBhY2M7XG4gIH07XG5cbiAgLy8gV0FSTklORzogREVQUkVDQVRFRFxuICBCTi5wcm90b3R5cGUubW9kbiA9IGZ1bmN0aW9uIG1vZG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLm1vZHJuKG51bSk7XG4gIH07XG5cbiAgLy8gSW4tcGxhY2UgZGl2aXNpb24gYnkgbnVtYmVyXG4gIEJOLnByb3RvdHlwZS5pZGl2biA9IGZ1bmN0aW9uIGlkaXZuIChudW0pIHtcbiAgICB2YXIgaXNOZWdOdW0gPSBudW0gPCAwO1xuICAgIGlmIChpc05lZ051bSkgbnVtID0gLW51bTtcblxuICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmKTtcblxuICAgIHZhciBjYXJyeSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHRoaXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB3ID0gKHRoaXMud29yZHNbaV0gfCAwKSArIGNhcnJ5ICogMHg0MDAwMDAwO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9ICh3IC8gbnVtKSB8IDA7XG4gICAgICBjYXJyeSA9IHcgJSBudW07XG4gICAgfVxuXG4gICAgdGhpcy5fc3RyaXAoKTtcbiAgICByZXR1cm4gaXNOZWdOdW0gPyB0aGlzLmluZWcoKSA6IHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmRpdm4gPSBmdW5jdGlvbiBkaXZuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVnY2QgPSBmdW5jdGlvbiBlZ2NkIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgeCA9IHRoaXM7XG4gICAgdmFyIHkgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoeC5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgeCA9IHgudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IHguY2xvbmUoKTtcbiAgICB9XG5cbiAgICAvLyBBICogeCArIEIgKiB5ID0geFxuICAgIHZhciBBID0gbmV3IEJOKDEpO1xuICAgIHZhciBCID0gbmV3IEJOKDApO1xuXG4gICAgLy8gQyAqIHggKyBEICogeSA9IHlcbiAgICB2YXIgQyA9IG5ldyBCTigwKTtcbiAgICB2YXIgRCA9IG5ldyBCTigxKTtcblxuICAgIHZhciBnID0gMDtcblxuICAgIHdoaWxlICh4LmlzRXZlbigpICYmIHkuaXNFdmVuKCkpIHtcbiAgICAgIHguaXVzaHJuKDEpO1xuICAgICAgeS5pdXNocm4oMSk7XG4gICAgICArK2c7XG4gICAgfVxuXG4gICAgdmFyIHlwID0geS5jbG9uZSgpO1xuICAgIHZhciB4cCA9IHguY2xvbmUoKTtcblxuICAgIHdoaWxlICgheC5pc1plcm8oKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKHgud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICB4Lml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoQS5pc09kZCgpIHx8IEIuaXNPZGQoKSkge1xuICAgICAgICAgICAgQS5pYWRkKHlwKTtcbiAgICAgICAgICAgIEIuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQS5pdXNocm4oMSk7XG4gICAgICAgICAgQi5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaiA9IDAsIGptID0gMTsgKHkud29yZHNbMF0gJiBqbSkgPT09IDAgJiYgaiA8IDI2OyArK2osIGptIDw8PSAxKTtcbiAgICAgIGlmIChqID4gMCkge1xuICAgICAgICB5Lml1c2hybihqKTtcbiAgICAgICAgd2hpbGUgKGotLSA+IDApIHtcbiAgICAgICAgICBpZiAoQy5pc09kZCgpIHx8IEQuaXNPZGQoKSkge1xuICAgICAgICAgICAgQy5pYWRkKHlwKTtcbiAgICAgICAgICAgIEQuaXN1Yih4cCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgQy5pdXNocm4oMSk7XG4gICAgICAgICAgRC5pdXNocm4oMSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHguY21wKHkpID49IDApIHtcbiAgICAgICAgeC5pc3ViKHkpO1xuICAgICAgICBBLmlzdWIoQyk7XG4gICAgICAgIEIuaXN1YihEKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHkuaXN1Yih4KTtcbiAgICAgICAgQy5pc3ViKEEpO1xuICAgICAgICBELmlzdWIoQik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGE6IEMsXG4gICAgICBiOiBELFxuICAgICAgZ2NkOiB5Lml1c2hsbihnKVxuICAgIH07XG4gIH07XG5cbiAgLy8gVGhpcyBpcyByZWR1Y2VkIGluY2FybmF0aW9uIG9mIHRoZSBiaW5hcnkgRUVBXG4gIC8vIGFib3ZlLCBkZXNpZ25hdGVkIHRvIGludmVydCBtZW1iZXJzIG9mIHRoZVxuICAvLyBfcHJpbWVfIGZpZWxkcyBGKHApIGF0IGEgbWF4aW1hbCBzcGVlZFxuICBCTi5wcm90b3R5cGUuX2ludm1wID0gZnVuY3Rpb24gX2ludm1wIChwKSB7XG4gICAgYXNzZXJ0KHAubmVnYXRpdmUgPT09IDApO1xuICAgIGFzc2VydCghcC5pc1plcm8oKSk7XG5cbiAgICB2YXIgYSA9IHRoaXM7XG4gICAgdmFyIGIgPSBwLmNsb25lKCk7XG5cbiAgICBpZiAoYS5uZWdhdGl2ZSAhPT0gMCkge1xuICAgICAgYSA9IGEudW1vZChwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICB2YXIgeDEgPSBuZXcgQk4oMSk7XG4gICAgdmFyIHgyID0gbmV3IEJOKDApO1xuXG4gICAgdmFyIGRlbHRhID0gYi5jbG9uZSgpO1xuXG4gICAgd2hpbGUgKGEuY21wbigxKSA+IDAgJiYgYi5jbXBuKDEpID4gMCkge1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGltID0gMTsgKGEud29yZHNbMF0gJiBpbSkgPT09IDAgJiYgaSA8IDI2OyArK2ksIGltIDw8PSAxKTtcbiAgICAgIGlmIChpID4gMCkge1xuICAgICAgICBhLml1c2hybihpKTtcbiAgICAgICAgd2hpbGUgKGktLSA+IDApIHtcbiAgICAgICAgICBpZiAoeDEuaXNPZGQoKSkge1xuICAgICAgICAgICAgeDEuaWFkZChkZWx0YSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgeDEuaXVzaHJuKDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAodmFyIGogPSAwLCBqbSA9IDE7IChiLndvcmRzWzBdICYgam0pID09PSAwICYmIGogPCAyNjsgKytqLCBqbSA8PD0gMSk7XG4gICAgICBpZiAoaiA+IDApIHtcbiAgICAgICAgYi5pdXNocm4oaik7XG4gICAgICAgIHdoaWxlIChqLS0gPiAwKSB7XG4gICAgICAgICAgaWYgKHgyLmlzT2RkKCkpIHtcbiAgICAgICAgICAgIHgyLmlhZGQoZGVsdGEpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHgyLml1c2hybigxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoYS5jbXAoYikgPj0gMCkge1xuICAgICAgICBhLmlzdWIoYik7XG4gICAgICAgIHgxLmlzdWIoeDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYi5pc3ViKGEpO1xuICAgICAgICB4Mi5pc3ViKHgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgcmVzO1xuICAgIGlmIChhLmNtcG4oMSkgPT09IDApIHtcbiAgICAgIHJlcyA9IHgxO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXMgPSB4MjtcbiAgICB9XG5cbiAgICBpZiAocmVzLmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMuaWFkZChwKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5nY2QgPSBmdW5jdGlvbiBnY2QgKG51bSkge1xuICAgIGlmICh0aGlzLmlzWmVybygpKSByZXR1cm4gbnVtLmFicygpO1xuICAgIGlmIChudW0uaXNaZXJvKCkpIHJldHVybiB0aGlzLmFicygpO1xuXG4gICAgdmFyIGEgPSB0aGlzLmNsb25lKCk7XG4gICAgdmFyIGIgPSBudW0uY2xvbmUoKTtcbiAgICBhLm5lZ2F0aXZlID0gMDtcbiAgICBiLm5lZ2F0aXZlID0gMDtcblxuICAgIC8vIFJlbW92ZSBjb21tb24gZmFjdG9yIG9mIHR3b1xuICAgIGZvciAodmFyIHNoaWZ0ID0gMDsgYS5pc0V2ZW4oKSAmJiBiLmlzRXZlbigpOyBzaGlmdCsrKSB7XG4gICAgICBhLml1c2hybigxKTtcbiAgICAgIGIuaXVzaHJuKDEpO1xuICAgIH1cblxuICAgIGRvIHtcbiAgICAgIHdoaWxlIChhLmlzRXZlbigpKSB7XG4gICAgICAgIGEuaXVzaHJuKDEpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKGIuaXNFdmVuKCkpIHtcbiAgICAgICAgYi5pdXNocm4oMSk7XG4gICAgICB9XG5cbiAgICAgIHZhciByID0gYS5jbXAoYik7XG4gICAgICBpZiAociA8IDApIHtcbiAgICAgICAgLy8gU3dhcCBgYWAgYW5kIGBiYCB0byBtYWtlIGBhYCBhbHdheXMgYmlnZ2VyIHRoYW4gYGJgXG4gICAgICAgIHZhciB0ID0gYTtcbiAgICAgICAgYSA9IGI7XG4gICAgICAgIGIgPSB0O1xuICAgICAgfSBlbHNlIGlmIChyID09PSAwIHx8IGIuY21wbigxKSA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgYS5pc3ViKGIpO1xuICAgIH0gd2hpbGUgKHRydWUpO1xuXG4gICAgcmV0dXJuIGIuaXVzaGxuKHNoaWZ0KTtcbiAgfTtcblxuICAvLyBJbnZlcnQgbnVtYmVyIGluIHRoZSBmaWVsZCBGKG51bSlcbiAgQk4ucHJvdG90eXBlLmludm0gPSBmdW5jdGlvbiBpbnZtIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5lZ2NkKG51bSkuYS51bW9kKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzRXZlbiA9IGZ1bmN0aW9uIGlzRXZlbiAoKSB7XG4gICAgcmV0dXJuICh0aGlzLndvcmRzWzBdICYgMSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzT2RkID0gZnVuY3Rpb24gaXNPZGQgKCkge1xuICAgIHJldHVybiAodGhpcy53b3Jkc1swXSAmIDEpID09PSAxO1xuICB9O1xuXG4gIC8vIEFuZCBmaXJzdCB3b3JkIGFuZCBudW1cbiAgQk4ucHJvdG90eXBlLmFuZGxuID0gZnVuY3Rpb24gYW5kbG4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLndvcmRzWzBdICYgbnVtO1xuICB9O1xuXG4gIC8vIEluY3JlbWVudCBhdCB0aGUgYml0IHBvc2l0aW9uIGluLWxpbmVcbiAgQk4ucHJvdG90eXBlLmJpbmNuID0gZnVuY3Rpb24gYmluY24gKGJpdCkge1xuICAgIGFzc2VydCh0eXBlb2YgYml0ID09PSAnbnVtYmVyJyk7XG4gICAgdmFyIHIgPSBiaXQgJSAyNjtcbiAgICB2YXIgcyA9IChiaXQgLSByKSAvIDI2O1xuICAgIHZhciBxID0gMSA8PCByO1xuXG4gICAgLy8gRmFzdCBjYXNlOiBiaXQgaXMgbXVjaCBoaWdoZXIgdGhhbiBhbGwgZXhpc3Rpbmcgd29yZHNcbiAgICBpZiAodGhpcy5sZW5ndGggPD0gcykge1xuICAgICAgdGhpcy5fZXhwYW5kKHMgKyAxKTtcbiAgICAgIHRoaXMud29yZHNbc10gfD0gcTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIC8vIEFkZCBiaXQgYW5kIHByb3BhZ2F0ZSwgaWYgbmVlZGVkXG4gICAgdmFyIGNhcnJ5ID0gcTtcbiAgICBmb3IgKHZhciBpID0gczsgY2FycnkgIT09IDAgJiYgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciB3ID0gdGhpcy53b3Jkc1tpXSB8IDA7XG4gICAgICB3ICs9IGNhcnJ5O1xuICAgICAgY2FycnkgPSB3ID4+PiAyNjtcbiAgICAgIHcgJj0gMHgzZmZmZmZmO1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IHc7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgdGhpcy53b3Jkc1tpXSA9IGNhcnJ5O1xuICAgICAgdGhpcy5sZW5ndGgrKztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmlzWmVybyA9IGZ1bmN0aW9uIGlzWmVybyAoKSB7XG4gICAgcmV0dXJuIHRoaXMubGVuZ3RoID09PSAxICYmIHRoaXMud29yZHNbMF0gPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmNtcG4gPSBmdW5jdGlvbiBjbXBuIChudW0pIHtcbiAgICB2YXIgbmVnYXRpdmUgPSBudW0gPCAwO1xuXG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDAgJiYgIW5lZ2F0aXZlKSByZXR1cm4gLTE7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgPT09IDAgJiYgbmVnYXRpdmUpIHJldHVybiAxO1xuXG4gICAgdGhpcy5fc3RyaXAoKTtcblxuICAgIHZhciByZXM7XG4gICAgaWYgKHRoaXMubGVuZ3RoID4gMSkge1xuICAgICAgcmVzID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKG5lZ2F0aXZlKSB7XG4gICAgICAgIG51bSA9IC1udW07XG4gICAgICB9XG5cbiAgICAgIGFzc2VydChudW0gPD0gMHgzZmZmZmZmLCAnTnVtYmVyIGlzIHRvbyBiaWcnKTtcblxuICAgICAgdmFyIHcgPSB0aGlzLndvcmRzWzBdIHwgMDtcbiAgICAgIHJlcyA9IHcgPT09IG51bSA/IDAgOiB3IDwgbnVtID8gLTEgOiAxO1xuICAgIH1cbiAgICBpZiAodGhpcy5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIC1yZXMgfCAwO1xuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgLy8gQ29tcGFyZSB0d28gbnVtYmVycyBhbmQgcmV0dXJuOlxuICAvLyAxIC0gaWYgYHRoaXNgID4gYG51bWBcbiAgLy8gMCAtIGlmIGB0aGlzYCA9PSBgbnVtYFxuICAvLyAtMSAtIGlmIGB0aGlzYCA8IGBudW1gXG4gIEJOLnByb3RvdHlwZS5jbXAgPSBmdW5jdGlvbiBjbXAgKG51bSkge1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlICE9PSAwICYmIG51bS5uZWdhdGl2ZSA9PT0gMCkgcmV0dXJuIC0xO1xuICAgIGlmICh0aGlzLm5lZ2F0aXZlID09PSAwICYmIG51bS5uZWdhdGl2ZSAhPT0gMCkgcmV0dXJuIDE7XG5cbiAgICB2YXIgcmVzID0gdGhpcy51Y21wKG51bSk7XG4gICAgaWYgKHRoaXMubmVnYXRpdmUgIT09IDApIHJldHVybiAtcmVzIHwgMDtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xuXG4gIC8vIFVuc2lnbmVkIGNvbXBhcmlzb25cbiAgQk4ucHJvdG90eXBlLnVjbXAgPSBmdW5jdGlvbiB1Y21wIChudW0pIHtcbiAgICAvLyBBdCB0aGlzIHBvaW50IGJvdGggbnVtYmVycyBoYXZlIHRoZSBzYW1lIHNpZ25cbiAgICBpZiAodGhpcy5sZW5ndGggPiBudW0ubGVuZ3RoKSByZXR1cm4gMTtcbiAgICBpZiAodGhpcy5sZW5ndGggPCBudW0ubGVuZ3RoKSByZXR1cm4gLTE7XG5cbiAgICB2YXIgcmVzID0gMDtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGEgPSB0aGlzLndvcmRzW2ldIHwgMDtcbiAgICAgIHZhciBiID0gbnVtLndvcmRzW2ldIHwgMDtcblxuICAgICAgaWYgKGEgPT09IGIpIGNvbnRpbnVlO1xuICAgICAgaWYgKGEgPCBiKSB7XG4gICAgICAgIHJlcyA9IC0xO1xuICAgICAgfSBlbHNlIGlmIChhID4gYikge1xuICAgICAgICByZXMgPSAxO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmd0biA9IGZ1bmN0aW9uIGd0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAxO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndCA9IGZ1bmN0aW9uIGd0IChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXAobnVtKSA9PT0gMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZ3RlbiA9IGZ1bmN0aW9uIGd0ZW4gKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcG4obnVtKSA+PSAwO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5ndGUgPSBmdW5jdGlvbiBndGUgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID49IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0biA9IGZ1bmN0aW9uIGx0biAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pID09PSAtMTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUubHQgPSBmdW5jdGlvbiBsdCAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPT09IC0xO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5sdGVuID0gZnVuY3Rpb24gbHRlbiAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wbihudW0pIDw9IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmx0ZSA9IGZ1bmN0aW9uIGx0ZSAobnVtKSB7XG4gICAgcmV0dXJuIHRoaXMuY21wKG51bSkgPD0gMDtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZXFuID0gZnVuY3Rpb24gZXFuIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5jbXBuKG51bSkgPT09IDA7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLmVxID0gZnVuY3Rpb24gZXEgKG51bSkge1xuICAgIHJldHVybiB0aGlzLmNtcChudW0pID09PSAwO1xuICB9O1xuXG4gIC8vXG4gIC8vIEEgcmVkdWNlIGNvbnRleHQsIGNvdWxkIGJlIHVzaW5nIG1vbnRnb21lcnkgb3Igc29tZXRoaW5nIGJldHRlciwgZGVwZW5kaW5nXG4gIC8vIG9uIHRoZSBgbWAgaXRzZWxmLlxuICAvL1xuICBCTi5yZWQgPSBmdW5jdGlvbiByZWQgKG51bSkge1xuICAgIHJldHVybiBuZXcgUmVkKG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnRvUmVkID0gZnVuY3Rpb24gdG9SZWQgKGN0eCkge1xuICAgIGFzc2VydCghdGhpcy5yZWQsICdBbHJlYWR5IGEgbnVtYmVyIGluIHJlZHVjdGlvbiBjb250ZXh0Jyk7XG4gICAgYXNzZXJ0KHRoaXMubmVnYXRpdmUgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIHJldHVybiBjdHguY29udmVydFRvKHRoaXMpLl9mb3JjZVJlZChjdHgpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5mcm9tUmVkID0gZnVuY3Rpb24gZnJvbVJlZCAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAnZnJvbVJlZCB3b3JrcyBvbmx5IHdpdGggbnVtYmVycyBpbiByZWR1Y3Rpb24gY29udGV4dCcpO1xuICAgIHJldHVybiB0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuX2ZvcmNlUmVkID0gZnVuY3Rpb24gX2ZvcmNlUmVkIChjdHgpIHtcbiAgICB0aGlzLnJlZCA9IGN0eDtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcblxuICBCTi5wcm90b3R5cGUuZm9yY2VSZWQgPSBmdW5jdGlvbiBmb3JjZVJlZCAoY3R4KSB7XG4gICAgYXNzZXJ0KCF0aGlzLnJlZCwgJ0FscmVhZHkgYSBudW1iZXIgaW4gcmVkdWN0aW9uIGNvbnRleHQnKTtcbiAgICByZXR1cm4gdGhpcy5fZm9yY2VSZWQoY3R4KTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkQWRkID0gZnVuY3Rpb24gcmVkQWRkIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRBZGQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLmFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJQWRkID0gZnVuY3Rpb24gcmVkSUFkZCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaWFkZCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTdWIgPSBmdW5jdGlvbiByZWRTdWIgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFN1YiB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElTdWIgPSBmdW5jdGlvbiByZWRJU3ViIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5pc3ViKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZFNobCA9IGZ1bmN0aW9uIHJlZFNobCAobnVtKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkU2hsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zaGwodGhpcywgbnVtKTtcbiAgfTtcblxuICBCTi5wcm90b3R5cGUucmVkTXVsID0gZnVuY3Rpb24gcmVkTXVsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgbnVtKTtcbiAgICByZXR1cm4gdGhpcy5yZWQubXVsKHRoaXMsIG51bSk7XG4gIH07XG5cbiAgQk4ucHJvdG90eXBlLnJlZElNdWwgPSBmdW5jdGlvbiByZWRJTXVsIChudW0pIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRNdWwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTIodGhpcywgbnVtKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaW11bCh0aGlzLCBudW0pO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRTcXIgPSBmdW5jdGlvbiByZWRTcXIgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZFNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuc3FyKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJU3FyID0gZnVuY3Rpb24gcmVkSVNxciAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaXNxcih0aGlzKTtcbiAgfTtcblxuICAvLyBTcXVhcmUgcm9vdCBvdmVyIHBcbiAgQk4ucHJvdG90eXBlLnJlZFNxcnQgPSBmdW5jdGlvbiByZWRTcXJ0ICgpIHtcbiAgICBhc3NlcnQodGhpcy5yZWQsICdyZWRTcXJ0IHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICAgIHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnJlZC5zcXJ0KHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRJbnZtID0gZnVuY3Rpb24gcmVkSW52bSAoKSB7XG4gICAgYXNzZXJ0KHRoaXMucmVkLCAncmVkSW52bSB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQuaW52bSh0aGlzKTtcbiAgfTtcblxuICAvLyBSZXR1cm4gbmVnYXRpdmUgY2xvbmUgb2YgYHRoaXNgICUgYHJlZCBtb2R1bG9gXG4gIEJOLnByb3RvdHlwZS5yZWROZWcgPSBmdW5jdGlvbiByZWROZWcgKCkge1xuICAgIGFzc2VydCh0aGlzLnJlZCwgJ3JlZE5lZyB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMnKTtcbiAgICB0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5yZWQubmVnKHRoaXMpO1xuICB9O1xuXG4gIEJOLnByb3RvdHlwZS5yZWRQb3cgPSBmdW5jdGlvbiByZWRQb3cgKG51bSkge1xuICAgIGFzc2VydCh0aGlzLnJlZCAmJiAhbnVtLnJlZCwgJ3JlZFBvdyhub3JtYWxOdW0pJyk7XG4gICAgdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMucmVkLnBvdyh0aGlzLCBudW0pO1xuICB9O1xuXG4gIC8vIFByaW1lIG51bWJlcnMgd2l0aCBlZmZpY2llbnQgcmVkdWN0aW9uXG4gIHZhciBwcmltZXMgPSB7XG4gICAgazI1NjogbnVsbCxcbiAgICBwMjI0OiBudWxsLFxuICAgIHAxOTI6IG51bGwsXG4gICAgcDI1NTE5OiBudWxsXG4gIH07XG5cbiAgLy8gUHNldWRvLU1lcnNlbm5lIHByaW1lXG4gIGZ1bmN0aW9uIE1QcmltZSAobmFtZSwgcCkge1xuICAgIC8vIFAgPSAyIF4gTiAtIEtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMucCA9IG5ldyBCTihwLCAxNik7XG4gICAgdGhpcy5uID0gdGhpcy5wLmJpdExlbmd0aCgpO1xuICAgIHRoaXMuayA9IG5ldyBCTigxKS5pdXNobG4odGhpcy5uKS5pc3ViKHRoaXMucCk7XG5cbiAgICB0aGlzLnRtcCA9IHRoaXMuX3RtcCgpO1xuICB9XG5cbiAgTVByaW1lLnByb3RvdHlwZS5fdG1wID0gZnVuY3Rpb24gX3RtcCAoKSB7XG4gICAgdmFyIHRtcCA9IG5ldyBCTihudWxsKTtcbiAgICB0bXAud29yZHMgPSBuZXcgQXJyYXkoTWF0aC5jZWlsKHRoaXMubiAvIDEzKSk7XG4gICAgcmV0dXJuIHRtcDtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmlyZWR1Y2UgPSBmdW5jdGlvbiBpcmVkdWNlIChudW0pIHtcbiAgICAvLyBBc3N1bWVzIHRoYXQgYG51bWAgaXMgbGVzcyB0aGFuIGBQXjJgXG4gICAgLy8gbnVtID0gSEkgKiAoMiBeIE4gLSBLKSArIEhJICogSyArIExPID0gSEkgKiBLICsgTE8gKG1vZCBQKVxuICAgIHZhciByID0gbnVtO1xuICAgIHZhciBybGVuO1xuXG4gICAgZG8ge1xuICAgICAgdGhpcy5zcGxpdChyLCB0aGlzLnRtcCk7XG4gICAgICByID0gdGhpcy5pbXVsSyhyKTtcbiAgICAgIHIgPSByLmlhZGQodGhpcy50bXApO1xuICAgICAgcmxlbiA9IHIuYml0TGVuZ3RoKCk7XG4gICAgfSB3aGlsZSAocmxlbiA+IHRoaXMubik7XG5cbiAgICB2YXIgY21wID0gcmxlbiA8IHRoaXMubiA/IC0xIDogci51Y21wKHRoaXMucCk7XG4gICAgaWYgKGNtcCA9PT0gMCkge1xuICAgICAgci53b3Jkc1swXSA9IDA7XG4gICAgICByLmxlbmd0aCA9IDE7XG4gICAgfSBlbHNlIGlmIChjbXAgPiAwKSB7XG4gICAgICByLmlzdWIodGhpcy5wKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHIuc3RyaXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyByIGlzIGEgQk4gdjQgaW5zdGFuY2VcbiAgICAgICAgci5zdHJpcCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gciBpcyBhIEJOIHY1IGluc3RhbmNlXG4gICAgICAgIHIuX3N0cmlwKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTVByaW1lLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0IChpbnB1dCwgb3V0KSB7XG4gICAgaW5wdXQuaXVzaHJuKHRoaXMubiwgMCwgb3V0KTtcbiAgfTtcblxuICBNUHJpbWUucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIHJldHVybiBudW0uaW11bCh0aGlzLmspO1xuICB9O1xuXG4gIGZ1bmN0aW9uIEsyNTYgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdrMjU2JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZicpO1xuICB9XG4gIGluaGVyaXRzKEsyNTYsIE1QcmltZSk7XG5cbiAgSzI1Ni5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdCAoaW5wdXQsIG91dHB1dCkge1xuICAgIC8vIDI1NiA9IDkgKiAyNiArIDIyXG4gICAgdmFyIG1hc2sgPSAweDNmZmZmZjtcblxuICAgIHZhciBvdXRMZW4gPSBNYXRoLm1pbihpbnB1dC5sZW5ndGgsIDkpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0TGVuOyBpKyspIHtcbiAgICAgIG91dHB1dC53b3Jkc1tpXSA9IGlucHV0LndvcmRzW2ldO1xuICAgIH1cbiAgICBvdXRwdXQubGVuZ3RoID0gb3V0TGVuO1xuXG4gICAgaWYgKGlucHV0Lmxlbmd0aCA8PSA5KSB7XG4gICAgICBpbnB1dC53b3Jkc1swXSA9IDA7XG4gICAgICBpbnB1dC5sZW5ndGggPSAxO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNoaWZ0IGJ5IDkgbGltYnNcbiAgICB2YXIgcHJldiA9IGlucHV0LndvcmRzWzldO1xuICAgIG91dHB1dC53b3Jkc1tvdXRwdXQubGVuZ3RoKytdID0gcHJldiAmIG1hc2s7XG5cbiAgICBmb3IgKGkgPSAxMDsgaSA8IGlucHV0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgbmV4dCA9IGlucHV0LndvcmRzW2ldIHwgMDtcbiAgICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSAoKG5leHQgJiBtYXNrKSA8PCA0KSB8IChwcmV2ID4+PiAyMik7XG4gICAgICBwcmV2ID0gbmV4dDtcbiAgICB9XG4gICAgcHJldiA+Pj49IDIyO1xuICAgIGlucHV0LndvcmRzW2kgLSAxMF0gPSBwcmV2O1xuICAgIGlmIChwcmV2ID09PSAwICYmIGlucHV0Lmxlbmd0aCA+IDEwKSB7XG4gICAgICBpbnB1dC5sZW5ndGggLT0gMTA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0Lmxlbmd0aCAtPSA5O1xuICAgIH1cbiAgfTtcblxuICBLMjU2LnByb3RvdHlwZS5pbXVsSyA9IGZ1bmN0aW9uIGltdWxLIChudW0pIHtcbiAgICAvLyBLID0gMHgxMDAwMDAzZDEgPSBbIDB4NDAsIDB4M2QxIF1cbiAgICBudW0ud29yZHNbbnVtLmxlbmd0aF0gPSAwO1xuICAgIG51bS53b3Jkc1tudW0ubGVuZ3RoICsgMV0gPSAwO1xuICAgIG51bS5sZW5ndGggKz0gMjtcblxuICAgIC8vIGJvdW5kZWQgYXQ6IDB4NDAgKiAweDNmZmZmZmYgKyAweDNkMCA9IDB4MTAwMDAwMzkwXG4gICAgdmFyIGxvID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHcgPSBudW0ud29yZHNbaV0gfCAwO1xuICAgICAgbG8gKz0gdyAqIDB4M2QxO1xuICAgICAgbnVtLndvcmRzW2ldID0gbG8gJiAweDNmZmZmZmY7XG4gICAgICBsbyA9IHcgKiAweDQwICsgKChsbyAvIDB4NDAwMDAwMCkgfCAwKTtcbiAgICB9XG5cbiAgICAvLyBGYXN0IGxlbmd0aCByZWR1Y3Rpb25cbiAgICBpZiAobnVtLndvcmRzW251bS5sZW5ndGggLSAxXSA9PT0gMCkge1xuICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgaWYgKG51bS53b3Jkc1tudW0ubGVuZ3RoIC0gMV0gPT09IDApIHtcbiAgICAgICAgbnVtLmxlbmd0aC0tO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVtO1xuICB9O1xuXG4gIGZ1bmN0aW9uIFAyMjQgKCkge1xuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICdwMjI0JyxcbiAgICAgICdmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiAwMDAwMDAwMCAwMDAwMDAwMCAwMDAwMDAwMScpO1xuICB9XG4gIGluaGVyaXRzKFAyMjQsIE1QcmltZSk7XG5cbiAgZnVuY3Rpb24gUDE5MiAoKSB7XG4gICAgTVByaW1lLmNhbGwoXG4gICAgICB0aGlzLFxuICAgICAgJ3AxOTInLFxuICAgICAgJ2ZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZlIGZmZmZmZmZmIGZmZmZmZmZmJyk7XG4gIH1cbiAgaW5oZXJpdHMoUDE5MiwgTVByaW1lKTtcblxuICBmdW5jdGlvbiBQMjU1MTkgKCkge1xuICAgIC8vIDIgXiAyNTUgLSAxOVxuICAgIE1QcmltZS5jYWxsKFxuICAgICAgdGhpcyxcbiAgICAgICcyNTUxOScsXG4gICAgICAnN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCcpO1xuICB9XG4gIGluaGVyaXRzKFAyNTUxOSwgTVByaW1lKTtcblxuICBQMjU1MTkucHJvdG90eXBlLmltdWxLID0gZnVuY3Rpb24gaW11bEsgKG51bSkge1xuICAgIC8vIEsgPSAweDEzXG4gICAgdmFyIGNhcnJ5ID0gMDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bS5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGhpID0gKG51bS53b3Jkc1tpXSB8IDApICogMHgxMyArIGNhcnJ5O1xuICAgICAgdmFyIGxvID0gaGkgJiAweDNmZmZmZmY7XG4gICAgICBoaSA+Pj49IDI2O1xuXG4gICAgICBudW0ud29yZHNbaV0gPSBsbztcbiAgICAgIGNhcnJ5ID0gaGk7XG4gICAgfVxuICAgIGlmIChjYXJyeSAhPT0gMCkge1xuICAgICAgbnVtLndvcmRzW251bS5sZW5ndGgrK10gPSBjYXJyeTtcbiAgICB9XG4gICAgcmV0dXJuIG51bTtcbiAgfTtcblxuICAvLyBFeHBvcnRlZCBtb3N0bHkgZm9yIHRlc3RpbmcgcHVycG9zZXMsIHVzZSBwbGFpbiBuYW1lIGluc3RlYWRcbiAgQk4uX3ByaW1lID0gZnVuY3Rpb24gcHJpbWUgKG5hbWUpIHtcbiAgICAvLyBDYWNoZWQgdmVyc2lvbiBvZiBwcmltZVxuICAgIGlmIChwcmltZXNbbmFtZV0pIHJldHVybiBwcmltZXNbbmFtZV07XG5cbiAgICB2YXIgcHJpbWU7XG4gICAgaWYgKG5hbWUgPT09ICdrMjU2Jykge1xuICAgICAgcHJpbWUgPSBuZXcgSzI1NigpO1xuICAgIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3AyMjQnKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjI0KCk7XG4gICAgfSBlbHNlIGlmIChuYW1lID09PSAncDE5MicpIHtcbiAgICAgIHByaW1lID0gbmV3IFAxOTIoKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUgPT09ICdwMjU1MTknKSB7XG4gICAgICBwcmltZSA9IG5ldyBQMjU1MTkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHByaW1lICcgKyBuYW1lKTtcbiAgICB9XG4gICAgcHJpbWVzW25hbWVdID0gcHJpbWU7XG5cbiAgICByZXR1cm4gcHJpbWU7XG4gIH07XG5cbiAgLy9cbiAgLy8gQmFzZSByZWR1Y3Rpb24gZW5naW5lXG4gIC8vXG4gIGZ1bmN0aW9uIFJlZCAobSkge1xuICAgIGlmICh0eXBlb2YgbSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhciBwcmltZSA9IEJOLl9wcmltZShtKTtcbiAgICAgIHRoaXMubSA9IHByaW1lLnA7XG4gICAgICB0aGlzLnByaW1lID0gcHJpbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChtLmd0bigxKSwgJ21vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMScpO1xuICAgICAgdGhpcy5tID0gbTtcbiAgICAgIHRoaXMucHJpbWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIFJlZC5wcm90b3R5cGUuX3ZlcmlmeTEgPSBmdW5jdGlvbiBfdmVyaWZ5MSAoYSkge1xuICAgIGFzc2VydChhLm5lZ2F0aXZlID09PSAwLCAncmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMnKTtcbiAgICBhc3NlcnQoYS5yZWQsICdyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzJyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5fdmVyaWZ5MiA9IGZ1bmN0aW9uIF92ZXJpZnkyIChhLCBiKSB7XG4gICAgYXNzZXJ0KChhLm5lZ2F0aXZlIHwgYi5uZWdhdGl2ZSkgPT09IDAsICdyZWQgd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlcycpO1xuICAgIGFzc2VydChhLnJlZCAmJiBhLnJlZCA9PT0gYi5yZWQsXG4gICAgICAncmVkIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycycpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW1vZCA9IGZ1bmN0aW9uIGltb2QgKGEpIHtcbiAgICBpZiAodGhpcy5wcmltZSkgcmV0dXJuIHRoaXMucHJpbWUuaXJlZHVjZShhKS5fZm9yY2VSZWQodGhpcyk7XG5cbiAgICBtb3ZlKGEsIGEudW1vZCh0aGlzLm0pLl9mb3JjZVJlZCh0aGlzKSk7XG4gICAgcmV0dXJuIGE7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5uZWcgPSBmdW5jdGlvbiBuZWcgKGEpIHtcbiAgICBpZiAoYS5pc1plcm8oKSkge1xuICAgICAgcmV0dXJuIGEuY2xvbmUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5tLnN1YihhKS5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbiBhZGQgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuXG4gICAgdmFyIHJlcyA9IGEuYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pYWRkID0gZnVuY3Rpb24gaWFkZCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pYWRkKGIpO1xuICAgIGlmIChyZXMuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzLmlzdWIodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uIHN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5zdWIoYik7XG4gICAgaWYgKHJlcy5jbXBuKDApIDwgMCkge1xuICAgICAgcmVzLmlhZGQodGhpcy5tKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcy5fZm9yY2VSZWQodGhpcyk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3ViID0gZnVuY3Rpb24gaXN1YiAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG5cbiAgICB2YXIgcmVzID0gYS5pc3ViKGIpO1xuICAgIGlmIChyZXMuY21wbigwKSA8IDApIHtcbiAgICAgIHJlcy5pYWRkKHRoaXMubSk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5zaGwgPSBmdW5jdGlvbiBzaGwgKGEsIG51bSkge1xuICAgIHRoaXMuX3ZlcmlmeTEoYSk7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLnVzaGxuKG51bSkpO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICB0aGlzLl92ZXJpZnkyKGEsIGIpO1xuICAgIHJldHVybiB0aGlzLmltb2QoYS5pbXVsKGIpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uIG11bCAoYSwgYikge1xuICAgIHRoaXMuX3ZlcmlmeTIoYSwgYik7XG4gICAgcmV0dXJuIHRoaXMuaW1vZChhLm11bChiKSk7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5pc3FyID0gZnVuY3Rpb24gaXNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLmltdWwoYSwgYS5jbG9uZSgpKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxciA9IGZ1bmN0aW9uIHNxciAoYSkge1xuICAgIHJldHVybiB0aGlzLm11bChhLCBhKTtcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLnNxcnQgPSBmdW5jdGlvbiBzcXJ0IChhKSB7XG4gICAgaWYgKGEuaXNaZXJvKCkpIHJldHVybiBhLmNsb25lKCk7XG5cbiAgICB2YXIgbW9kMyA9IHRoaXMubS5hbmRsbigzKTtcbiAgICBhc3NlcnQobW9kMyAlIDIgPT09IDEpO1xuXG4gICAgLy8gRmFzdCBjYXNlXG4gICAgaWYgKG1vZDMgPT09IDMpIHtcbiAgICAgIHZhciBwb3cgPSB0aGlzLm0uYWRkKG5ldyBCTigxKSkuaXVzaHJuKDIpO1xuICAgICAgcmV0dXJuIHRoaXMucG93KGEsIHBvdyk7XG4gICAgfVxuXG4gICAgLy8gVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtIChUb3RhbGx5IHVub3B0aW1pemVkIGFuZCBzbG93KVxuICAgIC8vXG4gICAgLy8gRmluZCBRIGFuZCBTLCB0aGF0IFEgKiAyIF4gUyA9IChQIC0gMSlcbiAgICB2YXIgcSA9IHRoaXMubS5zdWJuKDEpO1xuICAgIHZhciBzID0gMDtcbiAgICB3aGlsZSAoIXEuaXNaZXJvKCkgJiYgcS5hbmRsbigxKSA9PT0gMCkge1xuICAgICAgcysrO1xuICAgICAgcS5pdXNocm4oMSk7XG4gICAgfVxuICAgIGFzc2VydCghcS5pc1plcm8oKSk7XG5cbiAgICB2YXIgb25lID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHZhciBuT25lID0gb25lLnJlZE5lZygpO1xuXG4gICAgLy8gRmluZCBxdWFkcmF0aWMgbm9uLXJlc2lkdWVcbiAgICAvLyBOT1RFOiBNYXggaXMgc3VjaCBiZWNhdXNlIG9mIGdlbmVyYWxpemVkIFJpZW1hbm4gaHlwb3RoZXNpcy5cbiAgICB2YXIgbHBvdyA9IHRoaXMubS5zdWJuKDEpLml1c2hybigxKTtcbiAgICB2YXIgeiA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICB6ID0gbmV3IEJOKDIgKiB6ICogeikudG9SZWQodGhpcyk7XG5cbiAgICB3aGlsZSAodGhpcy5wb3coeiwgbHBvdykuY21wKG5PbmUpICE9PSAwKSB7XG4gICAgICB6LnJlZElBZGQobk9uZSk7XG4gICAgfVxuXG4gICAgdmFyIGMgPSB0aGlzLnBvdyh6LCBxKTtcbiAgICB2YXIgciA9IHRoaXMucG93KGEsIHEuYWRkbigxKS5pdXNocm4oMSkpO1xuICAgIHZhciB0ID0gdGhpcy5wb3coYSwgcSk7XG4gICAgdmFyIG0gPSBzO1xuICAgIHdoaWxlICh0LmNtcChvbmUpICE9PSAwKSB7XG4gICAgICB2YXIgdG1wID0gdDtcbiAgICAgIGZvciAodmFyIGkgPSAwOyB0bXAuY21wKG9uZSkgIT09IDA7IGkrKykge1xuICAgICAgICB0bXAgPSB0bXAucmVkU3FyKCk7XG4gICAgICB9XG4gICAgICBhc3NlcnQoaSA8IG0pO1xuICAgICAgdmFyIGIgPSB0aGlzLnBvdyhjLCBuZXcgQk4oMSkuaXVzaGxuKG0gLSBpIC0gMSkpO1xuXG4gICAgICByID0gci5yZWRNdWwoYik7XG4gICAgICBjID0gYi5yZWRTcXIoKTtcbiAgICAgIHQgPSB0LnJlZE11bChjKTtcbiAgICAgIG0gPSBpO1xuICAgIH1cblxuICAgIHJldHVybiByO1xuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUuaW52bSA9IGZ1bmN0aW9uIGludm0gKGEpIHtcbiAgICB2YXIgaW52ID0gYS5faW52bXAodGhpcy5tKTtcbiAgICBpZiAoaW52Lm5lZ2F0aXZlICE9PSAwKSB7XG4gICAgICBpbnYubmVnYXRpdmUgPSAwO1xuICAgICAgcmV0dXJuIHRoaXMuaW1vZChpbnYpLnJlZE5lZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5pbW9kKGludik7XG4gICAgfVxuICB9O1xuXG4gIFJlZC5wcm90b3R5cGUucG93ID0gZnVuY3Rpb24gcG93IChhLCBudW0pIHtcbiAgICBpZiAobnVtLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIGlmIChudW0uY21wbigxKSA9PT0gMCkgcmV0dXJuIGEuY2xvbmUoKTtcblxuICAgIHZhciB3aW5kb3dTaXplID0gNDtcbiAgICB2YXIgd25kID0gbmV3IEFycmF5KDEgPDwgd2luZG93U2l6ZSk7XG4gICAgd25kWzBdID0gbmV3IEJOKDEpLnRvUmVkKHRoaXMpO1xuICAgIHduZFsxXSA9IGE7XG4gICAgZm9yICh2YXIgaSA9IDI7IGkgPCB3bmQubGVuZ3RoOyBpKyspIHtcbiAgICAgIHduZFtpXSA9IHRoaXMubXVsKHduZFtpIC0gMV0sIGEpO1xuICAgIH1cblxuICAgIHZhciByZXMgPSB3bmRbMF07XG4gICAgdmFyIGN1cnJlbnQgPSAwO1xuICAgIHZhciBjdXJyZW50TGVuID0gMDtcbiAgICB2YXIgc3RhcnQgPSBudW0uYml0TGVuZ3RoKCkgJSAyNjtcbiAgICBpZiAoc3RhcnQgPT09IDApIHtcbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgZm9yIChpID0gbnVtLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgd29yZCA9IG51bS53b3Jkc1tpXTtcbiAgICAgIGZvciAodmFyIGogPSBzdGFydCAtIDE7IGogPj0gMDsgai0tKSB7XG4gICAgICAgIHZhciBiaXQgPSAod29yZCA+PiBqKSAmIDE7XG4gICAgICAgIGlmIChyZXMgIT09IHduZFswXSkge1xuICAgICAgICAgIHJlcyA9IHRoaXMuc3FyKHJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYml0ID09PSAwICYmIGN1cnJlbnQgPT09IDApIHtcbiAgICAgICAgICBjdXJyZW50TGVuID0gMDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnQgPDw9IDE7XG4gICAgICAgIGN1cnJlbnQgfD0gYml0O1xuICAgICAgICBjdXJyZW50TGVuKys7XG4gICAgICAgIGlmIChjdXJyZW50TGVuICE9PSB3aW5kb3dTaXplICYmIChpICE9PSAwIHx8IGogIT09IDApKSBjb250aW51ZTtcblxuICAgICAgICByZXMgPSB0aGlzLm11bChyZXMsIHduZFtjdXJyZW50XSk7XG4gICAgICAgIGN1cnJlbnRMZW4gPSAwO1xuICAgICAgICBjdXJyZW50ID0gMDtcbiAgICAgIH1cbiAgICAgIHN0YXJ0ID0gMjY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICBSZWQucHJvdG90eXBlLmNvbnZlcnRUbyA9IGZ1bmN0aW9uIGNvbnZlcnRUbyAobnVtKSB7XG4gICAgdmFyIHIgPSBudW0udW1vZCh0aGlzLm0pO1xuXG4gICAgcmV0dXJuIHIgPT09IG51bSA/IHIuY2xvbmUoKSA6IHI7XG4gIH07XG5cbiAgUmVkLnByb3RvdHlwZS5jb252ZXJ0RnJvbSA9IGZ1bmN0aW9uIGNvbnZlcnRGcm9tIChudW0pIHtcbiAgICB2YXIgcmVzID0gbnVtLmNsb25lKCk7XG4gICAgcmVzLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHJlcztcbiAgfTtcblxuICAvL1xuICAvLyBNb250Z29tZXJ5IG1ldGhvZCBlbmdpbmVcbiAgLy9cblxuICBCTi5tb250ID0gZnVuY3Rpb24gbW9udCAobnVtKSB7XG4gICAgcmV0dXJuIG5ldyBNb250KG51bSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gTW9udCAobSkge1xuICAgIFJlZC5jYWxsKHRoaXMsIG0pO1xuXG4gICAgdGhpcy5zaGlmdCA9IHRoaXMubS5iaXRMZW5ndGgoKTtcbiAgICBpZiAodGhpcy5zaGlmdCAlIDI2ICE9PSAwKSB7XG4gICAgICB0aGlzLnNoaWZ0ICs9IDI2IC0gKHRoaXMuc2hpZnQgJSAyNik7XG4gICAgfVxuXG4gICAgdGhpcy5yID0gbmV3IEJOKDEpLml1c2hsbih0aGlzLnNoaWZ0KTtcbiAgICB0aGlzLnIyID0gdGhpcy5pbW9kKHRoaXMuci5zcXIoKSk7XG4gICAgdGhpcy5yaW52ID0gdGhpcy5yLl9pbnZtcCh0aGlzLm0pO1xuXG4gICAgdGhpcy5taW52ID0gdGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pO1xuICAgIHRoaXMubWludiA9IHRoaXMubWludi51bW9kKHRoaXMucik7XG4gICAgdGhpcy5taW52ID0gdGhpcy5yLnN1Yih0aGlzLm1pbnYpO1xuICB9XG4gIGluaGVyaXRzKE1vbnQsIFJlZCk7XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydFRvID0gZnVuY3Rpb24gY29udmVydFRvIChudW0pIHtcbiAgICByZXR1cm4gdGhpcy5pbW9kKG51bS51c2hsbih0aGlzLnNoaWZ0KSk7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuY29udmVydEZyb20gPSBmdW5jdGlvbiBjb252ZXJ0RnJvbSAobnVtKSB7XG4gICAgdmFyIHIgPSB0aGlzLmltb2QobnVtLm11bCh0aGlzLnJpbnYpKTtcbiAgICByLnJlZCA9IG51bGw7XG4gICAgcmV0dXJuIHI7XG4gIH07XG5cbiAgTW9udC5wcm90b3R5cGUuaW11bCA9IGZ1bmN0aW9uIGltdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSB7XG4gICAgICBhLndvcmRzWzBdID0gMDtcbiAgICAgIGEubGVuZ3RoID0gMTtcbiAgICAgIHJldHVybiBhO1xuICAgIH1cblxuICAgIHZhciB0ID0gYS5pbXVsKGIpO1xuICAgIHZhciBjID0gdC5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSk7XG4gICAgdmFyIHUgPSB0LmlzdWIoYykuaXVzaHJuKHRoaXMuc2hpZnQpO1xuICAgIHZhciByZXMgPSB1O1xuXG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbiBtdWwgKGEsIGIpIHtcbiAgICBpZiAoYS5pc1plcm8oKSB8fCBiLmlzWmVybygpKSByZXR1cm4gbmV3IEJOKDApLl9mb3JjZVJlZCh0aGlzKTtcblxuICAgIHZhciB0ID0gYS5tdWwoYik7XG4gICAgdmFyIGMgPSB0Lm1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm1pbnYpLmltYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5tKTtcbiAgICB2YXIgdSA9IHQuaXN1YihjKS5pdXNocm4odGhpcy5zaGlmdCk7XG4gICAgdmFyIHJlcyA9IHU7XG4gICAgaWYgKHUuY21wKHRoaXMubSkgPj0gMCkge1xuICAgICAgcmVzID0gdS5pc3ViKHRoaXMubSk7XG4gICAgfSBlbHNlIGlmICh1LmNtcG4oMCkgPCAwKSB7XG4gICAgICByZXMgPSB1LmlhZGQodGhpcy5tKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcblxuICBNb250LnByb3RvdHlwZS5pbnZtID0gZnVuY3Rpb24gaW52bSAoYSkge1xuICAgIC8vIChBUileLTEgKiBSXjIgPSAoQV4tMSAqIFJeLTEpICogUl4yID0gQV4tMSAqIFJcbiAgICB2YXIgcmVzID0gdGhpcy5pbW9kKGEuX2ludm1wKHRoaXMubSkubXVsKHRoaXMucjIpKTtcbiAgICByZXR1cm4gcmVzLl9mb3JjZVJlZCh0aGlzKTtcbiAgfTtcbn0pKHR5cGVvZiBtb2R1bGUgPT09ICd1bmRlZmluZWQnIHx8IG1vZHVsZSwgdGhpcyk7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/bn.js/lib/bn.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/borsh/lib/index.js":
/*!*****************************************!*\
  !*** ./node_modules/borsh/lib/index.js ***!
  \*****************************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
 
"use strict";
eval(__webpack_require__.ts("/* provided dependency */ var Buffer = __webpack_require__(/*! buffer */ \"(app-pages-browser)/./node_modules/buffer/index.js\")[\"Buffer\"];\n\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n    if (k2 === undefined) k2 = k;\n    o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n    Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n    o[\"default\"] = v;\n});\nvar __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar __importStar = (this && this.__importStar) || function (mod) {\n    if (mod && mod.__esModule) return mod;\n    var result = {};\n    if (mod != null) for (var k in mod) if (k !== \"default\" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n    __setModuleDefault(result, mod);\n    return result;\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", ({ value: true }));\nexports.deserializeUnchecked = exports.deserialize = exports.serialize = exports.BinaryReader = exports.BinaryWriter = exports.BorshError = exports.baseDecode = exports.baseEncode = void 0;\nconst bn_js_1 = __importDefault(__webpack_require__(/*! bn.js */ \"(app-pages-browser)/./node_modules/bn.js/lib/bn.js\"));\nconst bs58_1 = __importDefault(__webpack_require__(/*! bs58 */ \"(app-pages-browser)/./node_modules/borsh/node_modules/bs58/index.js\"));\n// TODO: Make sure this polyfill not included when not required\nconst encoding = __importStar(__webpack_require__(/*! text-encoding-utf-8 */ \"(app-pages-browser)/./node_modules/text-encoding-utf-8/lib/encoding.lib.js\"));\nconst ResolvedTextDecoder = typeof TextDecoder !== \"function\" ? encoding.TextDecoder : TextDecoder;\nconst textDecoder = new ResolvedTextDecoder(\"utf-8\", { fatal: true });\nfunction baseEncode(value) {\n    if (typeof value === \"string\") {\n        value = Buffer.from(value, \"utf8\");\n    }\n    return bs58_1.default.encode(Buffer.from(value));\n}\nexports.baseEncode = baseEncode;\nfunction baseDecode(value) {\n    return Buffer.from(bs58_1.default.decode(value));\n}\nexports.baseDecode = baseDecode;\nconst INITIAL_LENGTH = 1024;\nclass BorshError extends Error {\n    constructor(message) {\n        super(message);\n        this.fieldPath = [];\n        this.originalMessage = message;\n    }\n    addToFieldPath(fieldName) {\n        this.fieldPath.splice(0, 0, fieldName);\n        // NOTE: Modifying message directly as jest doesn't use .toString()\n        this.message = this.originalMessage + \": \" + this.fieldPath.join(\".\");\n    }\n}\nexports.BorshError = BorshError;\n/// Binary encoder.\nclass BinaryWriter {\n    constructor() {\n        this.buf = Buffer.alloc(INITIAL_LENGTH);\n        this.length = 0;\n    }\n    maybeResize() {\n        if (this.buf.length < 16 + this.length) {\n            this.buf = Buffer.concat([this.buf, Buffer.alloc(INITIAL_LENGTH)]);\n        }\n    }\n    writeU8(value) {\n        this.maybeResize();\n        this.buf.writeUInt8(value, this.length);\n        this.length += 1;\n    }\n    writeU16(value) {\n        this.maybeResize();\n        this.buf.writeUInt16LE(value, this.length);\n        this.length += 2;\n    }\n    writeU32(value) {\n        this.maybeResize();\n        this.buf.writeUInt32LE(value, this.length);\n        this.length += 4;\n    }\n    writeU64(value) {\n        this.maybeResize();\n        this.writeBuffer(Buffer.from(new bn_js_1.default(value).toArray(\"le\", 8)));\n    }\n    writeU128(value) {\n        this.maybeResize();\n        this.writeBuffer(Buffer.from(new bn_js_1.default(value).toArray(\"le\", 16)));\n    }\n    writeU256(value) {\n        this.maybeResize();\n        this.writeBuffer(Buffer.from(new bn_js_1.default(value).toArray(\"le\", 32)));\n    }\n    writeU512(value) {\n        this.maybeResize();\n        this.writeBuffer(Buffer.from(new bn_js_1.default(value).toArray(\"le\", 64)));\n    }\n    writeBuffer(buffer) {\n        // Buffer.from is needed as this.buf.subarray can return plain Uint8Array in browser\n        this.buf = Buffer.concat([\n            Buffer.from(this.buf.subarray(0, this.length)),\n            buffer,\n            Buffer.alloc(INITIAL_LENGTH),\n        ]);\n        this.length += buffer.length;\n    }\n    writeString(str) {\n        this.maybeResize();\n        const b = Buffer.from(str, \"utf8\");\n        this.writeU32(b.length);\n        this.writeBuffer(b);\n    }\n    writeFixedArray(array) {\n        this.writeBuffer(Buffer.from(array));\n    }\n    writeArray(array, fn) {\n        this.maybeResize();\n        this.writeU32(array.length);\n        for (const elem of array) {\n            this.maybeResize();\n            fn(elem);\n        }\n    }\n    toArray() {\n        return this.buf.subarray(0, this.length);\n    }\n}\nexports.BinaryWriter = BinaryWriter;\nfunction handlingRangeError(target, propertyKey, propertyDescriptor) {\n    const originalMethod = propertyDescriptor.value;\n    propertyDescriptor.value = function (...args) {\n        try {\n            return originalMethod.apply(this, args);\n        }\n        catch (e) {\n            if (e instanceof RangeError) {\n                const code = e.code;\n                if ([\"ERR_BUFFER_OUT_OF_BOUNDS\", \"ERR_OUT_OF_RANGE\"].indexOf(code) >= 0) {\n                    throw new BorshError(\"Reached the end of buffer when deserializing\");\n                }\n            }\n            throw e;\n        }\n    };\n}\nclass BinaryReader {\n    constructor(buf) {\n        this.buf = buf;\n        this.offset = 0;\n    }\n    readU8() {\n        const value = this.buf.readUInt8(this.offset);\n        this.offset += 1;\n        return value;\n    }\n    readU16() {\n        const value = this.buf.readUInt16LE(this.offset);\n        this.offset += 2;\n        return value;\n    }\n    readU32() {\n        const value = this.buf.readUInt32LE(this.offset);\n        this.offset += 4;\n        return value;\n    }\n    readU64() {\n        const buf = this.readBuffer(8);\n        return new bn_js_1.default(buf, \"le\");\n    }\n    readU128() {\n        const buf = this.readBuffer(16);\n        return new bn_js_1.default(buf, \"le\");\n    }\n    readU256() {\n        const buf = this.readBuffer(32);\n        return new bn_js_1.default(buf, \"le\");\n    }\n    readU512() {\n        const buf = this.readBuffer(64);\n        return new bn_js_1.default(buf, \"le\");\n    }\n    readBuffer(len) {\n        if (this.offset + len > this.buf.length) {\n            throw new BorshError(`Expected buffer length ${len} isn't within bounds`);\n        }\n        const result = this.buf.slice(this.offset, this.offset + len);\n        this.offset += len;\n        return result;\n    }\n    readString() {\n        const len = this.readU32();\n        const buf = this.readBuffer(len);\n        try {\n            // NOTE: Using TextDecoder to fail on invalid UTF-8\n            return textDecoder.decode(buf);\n        }\n        catch (e) {\n            throw new BorshError(`Error decoding UTF-8 string: ${e}`);\n        }\n    }\n    readFixedArray(len) {\n        return new Uint8Array(this.readBuffer(len));\n    }\n    readArray(fn) {\n        const len = this.readU32();\n        const result = Array();\n        for (let i = 0; i < len; ++i) {\n            result.push(fn());\n        }\n        return result;\n    }\n}\n__decorate([\n    handlingRangeError\n], BinaryReader.prototype, \"readU8\", null);\n__decorate([\n    handlingRangeError\n], BinaryReader.prototype, \"readU16\", null);\n__decorate([\n    handlingRangeError\n], BinaryReader.prototype, \"readU32\", null);\n__decorate([\n    handlingRangeError\n], BinaryReader.prototype, \"readU64\", null);\n__decorate([\n    handlingRangeError\n], BinaryReader.prototype, \"readU128\", null);\n__decorate([\n    handlingRangeError\n], BinaryReader.prototype, \"readU256\", null);\n__decorate([\n    handlingRangeError\n], BinaryReader.prototype, \"readU512\", null);\n__decorate([\n    handlingRangeError\n], BinaryReader.prototype, \"readString\", null);\n__decorate([\n    handlingRangeError\n], BinaryReader.prototype, \"readFixedArray\", null);\n__decorate([\n    handlingRangeError\n], BinaryReader.prototype, \"readArray\", null);\nexports.BinaryReader = BinaryReader;\nfunction capitalizeFirstLetter(string) {\n    return string.charAt(0).toUpperCase() + string.slice(1);\n}\nfunction serializeField(schema, fieldName, value, fieldType, writer) {\n    try {\n        // TODO: Handle missing values properly (make sure they never result in just skipped write)\n        if (typeof fieldType === \"string\") {\n            writer[`write${capitalizeFirstLetter(fieldType)}`](value);\n        }\n        else if (fieldType instanceof Array) {\n            if (typeof fieldType[0] === \"number\") {\n                if (value.length !== fieldType[0]) {\n                    throw new BorshError(`Expecting byte array of length ${fieldType[0]}, but got ${value.length} bytes`);\n                }\n                writer.writeFixedArray(value);\n            }\n            else if (fieldType.length === 2 && typeof fieldType[1] === \"number\") {\n                if (value.length !== fieldType[1]) {\n                    throw new BorshError(`Expecting byte array of length ${fieldType[1]}, but got ${value.length} bytes`);\n                }\n                for (let i = 0; i < fieldType[1]; i++) {\n                    serializeField(schema, null, value[i], fieldType[0], writer);\n                }\n            }\n            else {\n                writer.writeArray(value, (item) => {\n                    serializeField(schema, fieldName, item, fieldType[0], writer);\n                });\n            }\n        }\n        else if (fieldType.kind !== undefined) {\n            switch (fieldType.kind) {\n                case \"option\": {\n                    if (value === null || value === undefined) {\n                        writer.writeU8(0);\n                    }\n                    else {\n                        writer.writeU8(1);\n                        serializeField(schema, fieldName, value, fieldType.type, writer);\n                    }\n                    break;\n                }\n                case \"map\": {\n                    writer.writeU32(value.size);\n                    value.forEach((val, key) => {\n                        serializeField(schema, fieldName, key, fieldType.key, writer);\n                        serializeField(schema, fieldName, val, fieldType.value, writer);\n                    });\n                    break;\n                }\n                default:\n                    throw new BorshError(`FieldType ${fieldType} unrecognized`);\n            }\n        }\n        else {\n            serializeStruct(schema, value, writer);\n        }\n    }\n    catch (error) {\n        if (error instanceof BorshError) {\n            error.addToFieldPath(fieldName);\n        }\n        throw error;\n    }\n}\nfunction serializeStruct(schema, obj, writer) {\n    if (typeof obj.borshSerialize === \"function\") {\n        obj.borshSerialize(writer);\n        return;\n    }\n    const structSchema = schema.get(obj.constructor);\n    if (!structSchema) {\n        throw new BorshError(`Class ${obj.constructor.name} is missing in schema`);\n    }\n    if (structSchema.kind === \"struct\") {\n        structSchema.fields.map(([fieldName, fieldType]) => {\n            serializeField(schema, fieldName, obj[fieldName], fieldType, writer);\n        });\n    }\n    else if (structSchema.kind === \"enum\") {\n        const name = obj[structSchema.field];\n        for (let idx = 0; idx < structSchema.values.length; ++idx) {\n            const [fieldName, fieldType] = structSchema.values[idx];\n            if (fieldName === name) {\n                writer.writeU8(idx);\n                serializeField(schema, fieldName, obj[fieldName], fieldType, writer);\n                break;\n            }\n        }\n    }\n    else {\n        throw new BorshError(`Unexpected schema kind: ${structSchema.kind} for ${obj.constructor.name}`);\n    }\n}\n/// Serialize given object using schema of the form:\n/// { class_name -> [ [field_name, field_type], .. ], .. }\nfunction serialize(schema, obj, Writer = BinaryWriter) {\n    const writer = new Writer();\n    serializeStruct(schema, obj, writer);\n    return writer.toArray();\n}\nexports.serialize = serialize;\nfunction deserializeField(schema, fieldName, fieldType, reader) {\n    try {\n        if (typeof fieldType === \"string\") {\n            return reader[`read${capitalizeFirstLetter(fieldType)}`]();\n        }\n        if (fieldType instanceof Array) {\n            if (typeof fieldType[0] === \"number\") {\n                return reader.readFixedArray(fieldType[0]);\n            }\n            else if (typeof fieldType[1] === \"number\") {\n                const arr = [];\n                for (let i = 0; i < fieldType[1]; i++) {\n                    arr.push(deserializeField(schema, null, fieldType[0], reader));\n                }\n                return arr;\n            }\n            else {\n                return reader.readArray(() => deserializeField(schema, fieldName, fieldType[0], reader));\n            }\n        }\n        if (fieldType.kind === \"option\") {\n            const option = reader.readU8();\n            if (option) {\n                return deserializeField(schema, fieldName, fieldType.type, reader);\n            }\n            return undefined;\n        }\n        if (fieldType.kind === \"map\") {\n            let map = new Map();\n            const length = reader.readU32();\n            for (let i = 0; i < length; i++) {\n                const key = deserializeField(schema, fieldName, fieldType.key, reader);\n                const val = deserializeField(schema, fieldName, fieldType.value, reader);\n                map.set(key, val);\n            }\n            return map;\n        }\n        return deserializeStruct(schema, fieldType, reader);\n    }\n    catch (error) {\n        if (error instanceof BorshError) {\n            error.addToFieldPath(fieldName);\n        }\n        throw error;\n    }\n}\nfunction deserializeStruct(schema, classType, reader) {\n    if (typeof classType.borshDeserialize === \"function\") {\n        return classType.borshDeserialize(reader);\n    }\n    const structSchema = schema.get(classType);\n    if (!structSchema) {\n        throw new BorshError(`Class ${classType.name} is missing in schema`);\n    }\n    if (structSchema.kind === \"struct\") {\n        const result = {};\n        for (const [fieldName, fieldType] of schema.get(classType).fields) {\n            result[fieldName] = deserializeField(schema, fieldName, fieldType, reader);\n        }\n        return new classType(result);\n    }\n    if (structSchema.kind === \"enum\") {\n        const idx = reader.readU8();\n        if (idx >= structSchema.values.length) {\n            throw new BorshError(`Enum index: ${idx} is out of range`);\n        }\n        const [fieldName, fieldType] = structSchema.values[idx];\n        const fieldValue = deserializeField(schema, fieldName, fieldType, reader);\n        return new classType({ [fieldName]: fieldValue });\n    }\n    throw new BorshError(`Unexpected schema kind: ${structSchema.kind} for ${classType.constructor.name}`);\n}\n/// Deserializes object from bytes using schema.\nfunction deserialize(schema, classType, buffer, Reader = BinaryReader) {\n    const reader = new Reader(buffer);\n    const result = deserializeStruct(schema, classType, reader);\n    if (reader.offset < buffer.length) {\n        throw new BorshError(`Unexpected ${buffer.length - reader.offset} bytes after deserialized data`);\n    }\n    return result;\n}\nexports.deserialize = deserialize;\n/// Deserializes object from bytes using schema, without checking the length read\nfunction deserializeUnchecked(schema, classType, buffer, Reader = BinaryReader) {\n    const reader = new Reader(buffer);\n    return deserializeStruct(schema, classType, reader);\n}\nexports.deserializeUnchecked = deserializeUnchecked;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9ib3JzaC9saWIvaW5kZXguanMiLCJtYXBwaW5ncyI6IjtBQUFhO0FBQ2I7QUFDQTtBQUNBLG1DQUFtQyxvQ0FBb0MsZ0JBQWdCO0FBQ3ZGLENBQUM7QUFDRDtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0EsMENBQTBDLDRCQUE0QjtBQUN0RSxDQUFDO0FBQ0Q7QUFDQSxDQUFDO0FBQ0Q7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFFBQVE7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2Q0FBNkM7QUFDN0M7QUFDQSw4Q0FBNkMsRUFBRSxhQUFhLEVBQUM7QUFDN0QsNEJBQTRCLEdBQUcsbUJBQW1CLEdBQUcsaUJBQWlCLEdBQUcsb0JBQW9CLEdBQUcsb0JBQW9CLEdBQUcsa0JBQWtCLEdBQUcsa0JBQWtCLEdBQUcsa0JBQWtCO0FBQ25MLGdDQUFnQyxtQkFBTyxDQUFDLGlFQUFPO0FBQy9DLCtCQUErQixtQkFBTyxDQUFDLGlGQUFNO0FBQzdDO0FBQ0EsOEJBQThCLG1CQUFPLENBQUMsdUdBQXFCO0FBQzNEO0FBQ0EsdURBQXVELGFBQWE7QUFDcEU7QUFDQTtBQUNBLGdCQUFnQixNQUFNO0FBQ3RCO0FBQ0EsaUNBQWlDLE1BQU07QUFDdkM7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQSxXQUFXLE1BQU07QUFDakI7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0I7QUFDbEI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLE1BQU07QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1QkFBdUIsTUFBTSxtQkFBbUIsTUFBTTtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLFlBQVk7QUFDeEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLGdCQUFnQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELEtBQUs7QUFDckQ7QUFDQTtBQUNBO0FBQ0EsK0JBQStCLHlCQUF5QjtBQUN4RDtBQUNBLG9EQUFvRCxtQkFBbUIsTUFBTSwyQkFBMkI7QUFDeEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLCtCQUErQjtBQUMxRTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QiIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9ib3JzaC9saWIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgazIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfSk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19zZXRNb2R1bGVEZWZhdWx0KSB8fCAoT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCB2KSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xufSkgOiBmdW5jdGlvbihvLCB2KSB7XG4gICAgb1tcImRlZmF1bHRcIl0gPSB2O1xufSk7XG52YXIgX19kZWNvcmF0ZSA9ICh0aGlzICYmIHRoaXMuX19kZWNvcmF0ZSkgfHwgZnVuY3Rpb24gKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7XG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xuICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7XG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcbn07XG52YXIgX19pbXBvcnRTdGFyID0gKHRoaXMgJiYgdGhpcy5fX2ltcG9ydFN0YXIpIHx8IGZ1bmN0aW9uIChtb2QpIHtcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICBpZiAobW9kICE9IG51bGwpIGZvciAodmFyIGsgaW4gbW9kKSBpZiAoayAhPT0gXCJkZWZhdWx0XCIgJiYgT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5kZXNlcmlhbGl6ZVVuY2hlY2tlZCA9IGV4cG9ydHMuZGVzZXJpYWxpemUgPSBleHBvcnRzLnNlcmlhbGl6ZSA9IGV4cG9ydHMuQmluYXJ5UmVhZGVyID0gZXhwb3J0cy5CaW5hcnlXcml0ZXIgPSBleHBvcnRzLkJvcnNoRXJyb3IgPSBleHBvcnRzLmJhc2VEZWNvZGUgPSBleHBvcnRzLmJhc2VFbmNvZGUgPSB2b2lkIDA7XG5jb25zdCBibl9qc18xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJibi5qc1wiKSk7XG5jb25zdCBiczU4XzEgPSBfX2ltcG9ydERlZmF1bHQocmVxdWlyZShcImJzNThcIikpO1xuLy8gVE9ETzogTWFrZSBzdXJlIHRoaXMgcG9seWZpbGwgbm90IGluY2x1ZGVkIHdoZW4gbm90IHJlcXVpcmVkXG5jb25zdCBlbmNvZGluZyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidGV4dC1lbmNvZGluZy11dGYtOFwiKSk7XG5jb25zdCBSZXNvbHZlZFRleHREZWNvZGVyID0gdHlwZW9mIFRleHREZWNvZGVyICE9PSBcImZ1bmN0aW9uXCIgPyBlbmNvZGluZy5UZXh0RGVjb2RlciA6IFRleHREZWNvZGVyO1xuY29uc3QgdGV4dERlY29kZXIgPSBuZXcgUmVzb2x2ZWRUZXh0RGVjb2RlcihcInV0Zi04XCIsIHsgZmF0YWw6IHRydWUgfSk7XG5mdW5jdGlvbiBiYXNlRW5jb2RlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICB2YWx1ZSA9IEJ1ZmZlci5mcm9tKHZhbHVlLCBcInV0ZjhcIik7XG4gICAgfVxuICAgIHJldHVybiBiczU4XzEuZGVmYXVsdC5lbmNvZGUoQnVmZmVyLmZyb20odmFsdWUpKTtcbn1cbmV4cG9ydHMuYmFzZUVuY29kZSA9IGJhc2VFbmNvZGU7XG5mdW5jdGlvbiBiYXNlRGVjb2RlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKGJzNThfMS5kZWZhdWx0LmRlY29kZSh2YWx1ZSkpO1xufVxuZXhwb3J0cy5iYXNlRGVjb2RlID0gYmFzZURlY29kZTtcbmNvbnN0IElOSVRJQUxfTEVOR1RIID0gMTAyNDtcbmNsYXNzIEJvcnNoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgdGhpcy5maWVsZFBhdGggPSBbXTtcbiAgICAgICAgdGhpcy5vcmlnaW5hbE1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgIH1cbiAgICBhZGRUb0ZpZWxkUGF0aChmaWVsZE5hbWUpIHtcbiAgICAgICAgdGhpcy5maWVsZFBhdGguc3BsaWNlKDAsIDAsIGZpZWxkTmFtZSk7XG4gICAgICAgIC8vIE5PVEU6IE1vZGlmeWluZyBtZXNzYWdlIGRpcmVjdGx5IGFzIGplc3QgZG9lc24ndCB1c2UgLnRvU3RyaW5nKClcbiAgICAgICAgdGhpcy5tZXNzYWdlID0gdGhpcy5vcmlnaW5hbE1lc3NhZ2UgKyBcIjogXCIgKyB0aGlzLmZpZWxkUGF0aC5qb2luKFwiLlwiKTtcbiAgICB9XG59XG5leHBvcnRzLkJvcnNoRXJyb3IgPSBCb3JzaEVycm9yO1xuLy8vIEJpbmFyeSBlbmNvZGVyLlxuY2xhc3MgQmluYXJ5V3JpdGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWYgPSBCdWZmZXIuYWxsb2MoSU5JVElBTF9MRU5HVEgpO1xuICAgICAgICB0aGlzLmxlbmd0aCA9IDA7XG4gICAgfVxuICAgIG1heWJlUmVzaXplKCkge1xuICAgICAgICBpZiAodGhpcy5idWYubGVuZ3RoIDwgMTYgKyB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5idWYgPSBCdWZmZXIuY29uY2F0KFt0aGlzLmJ1ZiwgQnVmZmVyLmFsbG9jKElOSVRJQUxfTEVOR1RIKV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHdyaXRlVTgodmFsdWUpIHtcbiAgICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZVVJbnQ4KHZhbHVlLCB0aGlzLmxlbmd0aCk7XG4gICAgICAgIHRoaXMubGVuZ3RoICs9IDE7XG4gICAgfVxuICAgIHdyaXRlVTE2KHZhbHVlKSB7XG4gICAgICAgIHRoaXMubWF5YmVSZXNpemUoKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVVSW50MTZMRSh2YWx1ZSwgdGhpcy5sZW5ndGgpO1xuICAgICAgICB0aGlzLmxlbmd0aCArPSAyO1xuICAgIH1cbiAgICB3cml0ZVUzMih2YWx1ZSkge1xuICAgICAgICB0aGlzLm1heWJlUmVzaXplKCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUodmFsdWUsIHRoaXMubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5sZW5ndGggKz0gNDtcbiAgICB9XG4gICAgd3JpdGVVNjQodmFsdWUpIHtcbiAgICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpO1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyKEJ1ZmZlci5mcm9tKG5ldyBibl9qc18xLmRlZmF1bHQodmFsdWUpLnRvQXJyYXkoXCJsZVwiLCA4KSkpO1xuICAgIH1cbiAgICB3cml0ZVUxMjgodmFsdWUpIHtcbiAgICAgICAgdGhpcy5tYXliZVJlc2l6ZSgpO1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyKEJ1ZmZlci5mcm9tKG5ldyBibl9qc18xLmRlZmF1bHQodmFsdWUpLnRvQXJyYXkoXCJsZVwiLCAxNikpKTtcbiAgICB9XG4gICAgd3JpdGVVMjU2KHZhbHVlKSB7XG4gICAgICAgIHRoaXMubWF5YmVSZXNpemUoKTtcbiAgICAgICAgdGhpcy53cml0ZUJ1ZmZlcihCdWZmZXIuZnJvbShuZXcgYm5fanNfMS5kZWZhdWx0KHZhbHVlKS50b0FycmF5KFwibGVcIiwgMzIpKSk7XG4gICAgfVxuICAgIHdyaXRlVTUxMih2YWx1ZSkge1xuICAgICAgICB0aGlzLm1heWJlUmVzaXplKCk7XG4gICAgICAgIHRoaXMud3JpdGVCdWZmZXIoQnVmZmVyLmZyb20obmV3IGJuX2pzXzEuZGVmYXVsdCh2YWx1ZSkudG9BcnJheShcImxlXCIsIDY0KSkpO1xuICAgIH1cbiAgICB3cml0ZUJ1ZmZlcihidWZmZXIpIHtcbiAgICAgICAgLy8gQnVmZmVyLmZyb20gaXMgbmVlZGVkIGFzIHRoaXMuYnVmLnN1YmFycmF5IGNhbiByZXR1cm4gcGxhaW4gVWludDhBcnJheSBpbiBicm93c2VyXG4gICAgICAgIHRoaXMuYnVmID0gQnVmZmVyLmNvbmNhdChbXG4gICAgICAgICAgICBCdWZmZXIuZnJvbSh0aGlzLmJ1Zi5zdWJhcnJheSgwLCB0aGlzLmxlbmd0aCkpLFxuICAgICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgICAgQnVmZmVyLmFsbG9jKElOSVRJQUxfTEVOR1RIKSxcbiAgICAgICAgXSk7XG4gICAgICAgIHRoaXMubGVuZ3RoICs9IGJ1ZmZlci5sZW5ndGg7XG4gICAgfVxuICAgIHdyaXRlU3RyaW5nKHN0cikge1xuICAgICAgICB0aGlzLm1heWJlUmVzaXplKCk7XG4gICAgICAgIGNvbnN0IGIgPSBCdWZmZXIuZnJvbShzdHIsIFwidXRmOFwiKTtcbiAgICAgICAgdGhpcy53cml0ZVUzMihiLmxlbmd0aCk7XG4gICAgICAgIHRoaXMud3JpdGVCdWZmZXIoYik7XG4gICAgfVxuICAgIHdyaXRlRml4ZWRBcnJheShhcnJheSkge1xuICAgICAgICB0aGlzLndyaXRlQnVmZmVyKEJ1ZmZlci5mcm9tKGFycmF5KSk7XG4gICAgfVxuICAgIHdyaXRlQXJyYXkoYXJyYXksIGZuKSB7XG4gICAgICAgIHRoaXMubWF5YmVSZXNpemUoKTtcbiAgICAgICAgdGhpcy53cml0ZVUzMihhcnJheS5sZW5ndGgpO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW0gb2YgYXJyYXkpIHtcbiAgICAgICAgICAgIHRoaXMubWF5YmVSZXNpemUoKTtcbiAgICAgICAgICAgIGZuKGVsZW0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvQXJyYXkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJ1Zi5zdWJhcnJheSgwLCB0aGlzLmxlbmd0aCk7XG4gICAgfVxufVxuZXhwb3J0cy5CaW5hcnlXcml0ZXIgPSBCaW5hcnlXcml0ZXI7XG5mdW5jdGlvbiBoYW5kbGluZ1JhbmdlRXJyb3IodGFyZ2V0LCBwcm9wZXJ0eUtleSwgcHJvcGVydHlEZXNjcmlwdG9yKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBwcm9wZXJ0eURlc2NyaXB0b3IudmFsdWU7XG4gICAgcHJvcGVydHlEZXNjcmlwdG9yLnZhbHVlID0gZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IGUuY29kZTtcbiAgICAgICAgICAgICAgICBpZiAoW1wiRVJSX0JVRkZFUl9PVVRfT0ZfQk9VTkRTXCIsIFwiRVJSX09VVF9PRl9SQU5HRVwiXS5pbmRleE9mKGNvZGUpID49IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJvcnNoRXJyb3IoXCJSZWFjaGVkIHRoZSBlbmQgb2YgYnVmZmVyIHdoZW4gZGVzZXJpYWxpemluZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgfTtcbn1cbmNsYXNzIEJpbmFyeVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IoYnVmKSB7XG4gICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICB0aGlzLm9mZnNldCA9IDA7XG4gICAgfVxuICAgIHJlYWRVOCgpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmJ1Zi5yZWFkVUludDgodGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLm9mZnNldCArPSAxO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJlYWRVMTYoKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5idWYucmVhZFVJbnQxNkxFKHRoaXMub2Zmc2V0KTtcbiAgICAgICAgdGhpcy5vZmZzZXQgKz0gMjtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZWFkVTMyKCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLm9mZnNldCk7XG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmVhZFU2NCgpIHtcbiAgICAgICAgY29uc3QgYnVmID0gdGhpcy5yZWFkQnVmZmVyKDgpO1xuICAgICAgICByZXR1cm4gbmV3IGJuX2pzXzEuZGVmYXVsdChidWYsIFwibGVcIik7XG4gICAgfVxuICAgIHJlYWRVMTI4KCkge1xuICAgICAgICBjb25zdCBidWYgPSB0aGlzLnJlYWRCdWZmZXIoMTYpO1xuICAgICAgICByZXR1cm4gbmV3IGJuX2pzXzEuZGVmYXVsdChidWYsIFwibGVcIik7XG4gICAgfVxuICAgIHJlYWRVMjU2KCkge1xuICAgICAgICBjb25zdCBidWYgPSB0aGlzLnJlYWRCdWZmZXIoMzIpO1xuICAgICAgICByZXR1cm4gbmV3IGJuX2pzXzEuZGVmYXVsdChidWYsIFwibGVcIik7XG4gICAgfVxuICAgIHJlYWRVNTEyKCkge1xuICAgICAgICBjb25zdCBidWYgPSB0aGlzLnJlYWRCdWZmZXIoNjQpO1xuICAgICAgICByZXR1cm4gbmV3IGJuX2pzXzEuZGVmYXVsdChidWYsIFwibGVcIik7XG4gICAgfVxuICAgIHJlYWRCdWZmZXIobGVuKSB7XG4gICAgICAgIGlmICh0aGlzLm9mZnNldCArIGxlbiA+IHRoaXMuYnVmLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJvcnNoRXJyb3IoYEV4cGVjdGVkIGJ1ZmZlciBsZW5ndGggJHtsZW59IGlzbid0IHdpdGhpbiBib3VuZHNgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmJ1Zi5zbGljZSh0aGlzLm9mZnNldCwgdGhpcy5vZmZzZXQgKyBsZW4pO1xuICAgICAgICB0aGlzLm9mZnNldCArPSBsZW47XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJlYWRTdHJpbmcoKSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IHRoaXMucmVhZFUzMigpO1xuICAgICAgICBjb25zdCBidWYgPSB0aGlzLnJlYWRCdWZmZXIobGVuKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIE5PVEU6IFVzaW5nIFRleHREZWNvZGVyIHRvIGZhaWwgb24gaW52YWxpZCBVVEYtOFxuICAgICAgICAgICAgcmV0dXJuIHRleHREZWNvZGVyLmRlY29kZShidWYpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQm9yc2hFcnJvcihgRXJyb3IgZGVjb2RpbmcgVVRGLTggc3RyaW5nOiAke2V9YCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVhZEZpeGVkQXJyYXkobGVuKSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh0aGlzLnJlYWRCdWZmZXIobGVuKSk7XG4gICAgfVxuICAgIHJlYWRBcnJheShmbikge1xuICAgICAgICBjb25zdCBsZW4gPSB0aGlzLnJlYWRVMzIoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2goZm4oKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5fX2RlY29yYXRlKFtcbiAgICBoYW5kbGluZ1JhbmdlRXJyb3Jcbl0sIEJpbmFyeVJlYWRlci5wcm90b3R5cGUsIFwicmVhZFU4XCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgaGFuZGxpbmdSYW5nZUVycm9yXG5dLCBCaW5hcnlSZWFkZXIucHJvdG90eXBlLCBcInJlYWRVMTZcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBoYW5kbGluZ1JhbmdlRXJyb3Jcbl0sIEJpbmFyeVJlYWRlci5wcm90b3R5cGUsIFwicmVhZFUzMlwiLCBudWxsKTtcbl9fZGVjb3JhdGUoW1xuICAgIGhhbmRsaW5nUmFuZ2VFcnJvclxuXSwgQmluYXJ5UmVhZGVyLnByb3RvdHlwZSwgXCJyZWFkVTY0XCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgaGFuZGxpbmdSYW5nZUVycm9yXG5dLCBCaW5hcnlSZWFkZXIucHJvdG90eXBlLCBcInJlYWRVMTI4XCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgaGFuZGxpbmdSYW5nZUVycm9yXG5dLCBCaW5hcnlSZWFkZXIucHJvdG90eXBlLCBcInJlYWRVMjU2XCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgaGFuZGxpbmdSYW5nZUVycm9yXG5dLCBCaW5hcnlSZWFkZXIucHJvdG90eXBlLCBcInJlYWRVNTEyXCIsIG51bGwpO1xuX19kZWNvcmF0ZShbXG4gICAgaGFuZGxpbmdSYW5nZUVycm9yXG5dLCBCaW5hcnlSZWFkZXIucHJvdG90eXBlLCBcInJlYWRTdHJpbmdcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBoYW5kbGluZ1JhbmdlRXJyb3Jcbl0sIEJpbmFyeVJlYWRlci5wcm90b3R5cGUsIFwicmVhZEZpeGVkQXJyYXlcIiwgbnVsbCk7XG5fX2RlY29yYXRlKFtcbiAgICBoYW5kbGluZ1JhbmdlRXJyb3Jcbl0sIEJpbmFyeVJlYWRlci5wcm90b3R5cGUsIFwicmVhZEFycmF5XCIsIG51bGwpO1xuZXhwb3J0cy5CaW5hcnlSZWFkZXIgPSBCaW5hcnlSZWFkZXI7XG5mdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIoc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0cmluZy5zbGljZSgxKTtcbn1cbmZ1bmN0aW9uIHNlcmlhbGl6ZUZpZWxkKHNjaGVtYSwgZmllbGROYW1lLCB2YWx1ZSwgZmllbGRUeXBlLCB3cml0ZXIpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBUT0RPOiBIYW5kbGUgbWlzc2luZyB2YWx1ZXMgcHJvcGVybHkgKG1ha2Ugc3VyZSB0aGV5IG5ldmVyIHJlc3VsdCBpbiBqdXN0IHNraXBwZWQgd3JpdGUpXG4gICAgICAgIGlmICh0eXBlb2YgZmllbGRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB3cml0ZXJbYHdyaXRlJHtjYXBpdGFsaXplRmlyc3RMZXR0ZXIoZmllbGRUeXBlKX1gXSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZmllbGRUeXBlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRUeXBlWzBdID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCAhPT0gZmllbGRUeXBlWzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCb3JzaEVycm9yKGBFeHBlY3RpbmcgYnl0ZSBhcnJheSBvZiBsZW5ndGggJHtmaWVsZFR5cGVbMF19LCBidXQgZ290ICR7dmFsdWUubGVuZ3RofSBieXRlc2ApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVGaXhlZEFycmF5KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkVHlwZS5sZW5ndGggPT09IDIgJiYgdHlwZW9mIGZpZWxkVHlwZVsxXSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IGZpZWxkVHlwZVsxXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQm9yc2hFcnJvcihgRXhwZWN0aW5nIGJ5dGUgYXJyYXkgb2YgbGVuZ3RoICR7ZmllbGRUeXBlWzFdfSwgYnV0IGdvdCAke3ZhbHVlLmxlbmd0aH0gYnl0ZXNgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZFR5cGVbMV07IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVGaWVsZChzY2hlbWEsIG51bGwsIHZhbHVlW2ldLCBmaWVsZFR5cGVbMF0sIHdyaXRlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlQXJyYXkodmFsdWUsIChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUZpZWxkKHNjaGVtYSwgZmllbGROYW1lLCBpdGVtLCBmaWVsZFR5cGVbMF0sIHdyaXRlcik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZmllbGRUeXBlLmtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUua2luZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJvcHRpb25cIjoge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlVTgoMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVVOCgxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUZpZWxkKHNjaGVtYSwgZmllbGROYW1lLCB2YWx1ZSwgZmllbGRUeXBlLnR5cGUsIHdyaXRlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgXCJtYXBcIjoge1xuICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVVMzIodmFsdWUuc2l6ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKHZhbCwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVGaWVsZChzY2hlbWEsIGZpZWxkTmFtZSwga2V5LCBmaWVsZFR5cGUua2V5LCB3cml0ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplRmllbGQoc2NoZW1hLCBmaWVsZE5hbWUsIHZhbCwgZmllbGRUeXBlLnZhbHVlLCB3cml0ZXIpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCb3JzaEVycm9yKGBGaWVsZFR5cGUgJHtmaWVsZFR5cGV9IHVucmVjb2duaXplZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2VyaWFsaXplU3RydWN0KHNjaGVtYSwgdmFsdWUsIHdyaXRlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEJvcnNoRXJyb3IpIHtcbiAgICAgICAgICAgIGVycm9yLmFkZFRvRmllbGRQYXRoKGZpZWxkTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxufVxuZnVuY3Rpb24gc2VyaWFsaXplU3RydWN0KHNjaGVtYSwgb2JqLCB3cml0ZXIpIHtcbiAgICBpZiAodHlwZW9mIG9iai5ib3JzaFNlcmlhbGl6ZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIG9iai5ib3JzaFNlcmlhbGl6ZSh3cml0ZXIpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN0cnVjdFNjaGVtYSA9IHNjaGVtYS5nZXQob2JqLmNvbnN0cnVjdG9yKTtcbiAgICBpZiAoIXN0cnVjdFNjaGVtYSkge1xuICAgICAgICB0aHJvdyBuZXcgQm9yc2hFcnJvcihgQ2xhc3MgJHtvYmouY29uc3RydWN0b3IubmFtZX0gaXMgbWlzc2luZyBpbiBzY2hlbWFgKTtcbiAgICB9XG4gICAgaWYgKHN0cnVjdFNjaGVtYS5raW5kID09PSBcInN0cnVjdFwiKSB7XG4gICAgICAgIHN0cnVjdFNjaGVtYS5maWVsZHMubWFwKChbZmllbGROYW1lLCBmaWVsZFR5cGVdKSA9PiB7XG4gICAgICAgICAgICBzZXJpYWxpemVGaWVsZChzY2hlbWEsIGZpZWxkTmFtZSwgb2JqW2ZpZWxkTmFtZV0sIGZpZWxkVHlwZSwgd3JpdGVyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHN0cnVjdFNjaGVtYS5raW5kID09PSBcImVudW1cIikge1xuICAgICAgICBjb25zdCBuYW1lID0gb2JqW3N0cnVjdFNjaGVtYS5maWVsZF07XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IGlkeCA8IHN0cnVjdFNjaGVtYS52YWx1ZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgY29uc3QgW2ZpZWxkTmFtZSwgZmllbGRUeXBlXSA9IHN0cnVjdFNjaGVtYS52YWx1ZXNbaWR4XTtcbiAgICAgICAgICAgIGlmIChmaWVsZE5hbWUgPT09IG5hbWUpIHtcbiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVVOChpZHgpO1xuICAgICAgICAgICAgICAgIHNlcmlhbGl6ZUZpZWxkKHNjaGVtYSwgZmllbGROYW1lLCBvYmpbZmllbGROYW1lXSwgZmllbGRUeXBlLCB3cml0ZXIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgQm9yc2hFcnJvcihgVW5leHBlY3RlZCBzY2hlbWEga2luZDogJHtzdHJ1Y3RTY2hlbWEua2luZH0gZm9yICR7b2JqLmNvbnN0cnVjdG9yLm5hbWV9YCk7XG4gICAgfVxufVxuLy8vIFNlcmlhbGl6ZSBnaXZlbiBvYmplY3QgdXNpbmcgc2NoZW1hIG9mIHRoZSBmb3JtOlxuLy8vIHsgY2xhc3NfbmFtZSAtPiBbIFtmaWVsZF9uYW1lLCBmaWVsZF90eXBlXSwgLi4gXSwgLi4gfVxuZnVuY3Rpb24gc2VyaWFsaXplKHNjaGVtYSwgb2JqLCBXcml0ZXIgPSBCaW5hcnlXcml0ZXIpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgV3JpdGVyKCk7XG4gICAgc2VyaWFsaXplU3RydWN0KHNjaGVtYSwgb2JqLCB3cml0ZXIpO1xuICAgIHJldHVybiB3cml0ZXIudG9BcnJheSgpO1xufVxuZXhwb3J0cy5zZXJpYWxpemUgPSBzZXJpYWxpemU7XG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUZpZWxkKHNjaGVtYSwgZmllbGROYW1lLCBmaWVsZFR5cGUsIHJlYWRlcikge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgZmllbGRUeXBlID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVhZGVyW2ByZWFkJHtjYXBpdGFsaXplRmlyc3RMZXR0ZXIoZmllbGRUeXBlKX1gXSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWVsZFR5cGUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZFR5cGVbMF0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRGaXhlZEFycmF5KGZpZWxkVHlwZVswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZmllbGRUeXBlWzFdID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJyID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaWVsZFR5cGVbMV07IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBhcnIucHVzaChkZXNlcmlhbGl6ZUZpZWxkKHNjaGVtYSwgbnVsbCwgZmllbGRUeXBlWzBdLCByZWFkZXIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXIucmVhZEFycmF5KCgpID0+IGRlc2VyaWFsaXplRmllbGQoc2NoZW1hLCBmaWVsZE5hbWUsIGZpZWxkVHlwZVswXSwgcmVhZGVyKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpZWxkVHlwZS5raW5kID09PSBcIm9wdGlvblwiKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSByZWFkZXIucmVhZFU4KCk7XG4gICAgICAgICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplRmllbGQoc2NoZW1hLCBmaWVsZE5hbWUsIGZpZWxkVHlwZS50eXBlLCByZWFkZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmllbGRUeXBlLmtpbmQgPT09IFwibWFwXCIpIHtcbiAgICAgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBjb25zdCBsZW5ndGggPSByZWFkZXIucmVhZFUzMigpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGRlc2VyaWFsaXplRmllbGQoc2NoZW1hLCBmaWVsZE5hbWUsIGZpZWxkVHlwZS5rZXksIHJlYWRlcik7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsID0gZGVzZXJpYWxpemVGaWVsZChzY2hlbWEsIGZpZWxkTmFtZSwgZmllbGRUeXBlLnZhbHVlLCByZWFkZXIpO1xuICAgICAgICAgICAgICAgIG1hcC5zZXQoa2V5LCB2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVTdHJ1Y3Qoc2NoZW1hLCBmaWVsZFR5cGUsIHJlYWRlcik7XG4gICAgfVxuICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBCb3JzaEVycm9yKSB7XG4gICAgICAgICAgICBlcnJvci5hZGRUb0ZpZWxkUGF0aChmaWVsZE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGRlc2VyaWFsaXplU3RydWN0KHNjaGVtYSwgY2xhc3NUeXBlLCByZWFkZXIpIHtcbiAgICBpZiAodHlwZW9mIGNsYXNzVHlwZS5ib3JzaERlc2VyaWFsaXplID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgcmV0dXJuIGNsYXNzVHlwZS5ib3JzaERlc2VyaWFsaXplKHJlYWRlcik7XG4gICAgfVxuICAgIGNvbnN0IHN0cnVjdFNjaGVtYSA9IHNjaGVtYS5nZXQoY2xhc3NUeXBlKTtcbiAgICBpZiAoIXN0cnVjdFNjaGVtYSkge1xuICAgICAgICB0aHJvdyBuZXcgQm9yc2hFcnJvcihgQ2xhc3MgJHtjbGFzc1R5cGUubmFtZX0gaXMgbWlzc2luZyBpbiBzY2hlbWFgKTtcbiAgICB9XG4gICAgaWYgKHN0cnVjdFNjaGVtYS5raW5kID09PSBcInN0cnVjdFwiKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGZpZWxkVHlwZV0gb2Ygc2NoZW1hLmdldChjbGFzc1R5cGUpLmZpZWxkcykge1xuICAgICAgICAgICAgcmVzdWx0W2ZpZWxkTmFtZV0gPSBkZXNlcmlhbGl6ZUZpZWxkKHNjaGVtYSwgZmllbGROYW1lLCBmaWVsZFR5cGUsIHJlYWRlcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBjbGFzc1R5cGUocmVzdWx0KTtcbiAgICB9XG4gICAgaWYgKHN0cnVjdFNjaGVtYS5raW5kID09PSBcImVudW1cIikge1xuICAgICAgICBjb25zdCBpZHggPSByZWFkZXIucmVhZFU4KCk7XG4gICAgICAgIGlmIChpZHggPj0gc3RydWN0U2NoZW1hLnZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBCb3JzaEVycm9yKGBFbnVtIGluZGV4OiAke2lkeH0gaXMgb3V0IG9mIHJhbmdlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgW2ZpZWxkTmFtZSwgZmllbGRUeXBlXSA9IHN0cnVjdFNjaGVtYS52YWx1ZXNbaWR4XTtcbiAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IGRlc2VyaWFsaXplRmllbGQoc2NoZW1hLCBmaWVsZE5hbWUsIGZpZWxkVHlwZSwgcmVhZGVyKTtcbiAgICAgICAgcmV0dXJuIG5ldyBjbGFzc1R5cGUoeyBbZmllbGROYW1lXTogZmllbGRWYWx1ZSB9KTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEJvcnNoRXJyb3IoYFVuZXhwZWN0ZWQgc2NoZW1hIGtpbmQ6ICR7c3RydWN0U2NoZW1hLmtpbmR9IGZvciAke2NsYXNzVHlwZS5jb25zdHJ1Y3Rvci5uYW1lfWApO1xufVxuLy8vIERlc2VyaWFsaXplcyBvYmplY3QgZnJvbSBieXRlcyB1c2luZyBzY2hlbWEuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZShzY2hlbWEsIGNsYXNzVHlwZSwgYnVmZmVyLCBSZWFkZXIgPSBCaW5hcnlSZWFkZXIpIHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgUmVhZGVyKGJ1ZmZlcik7XG4gICAgY29uc3QgcmVzdWx0ID0gZGVzZXJpYWxpemVTdHJ1Y3Qoc2NoZW1hLCBjbGFzc1R5cGUsIHJlYWRlcik7XG4gICAgaWYgKHJlYWRlci5vZmZzZXQgPCBidWZmZXIubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBCb3JzaEVycm9yKGBVbmV4cGVjdGVkICR7YnVmZmVyLmxlbmd0aCAtIHJlYWRlci5vZmZzZXR9IGJ5dGVzIGFmdGVyIGRlc2VyaWFsaXplZCBkYXRhYCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnRzLmRlc2VyaWFsaXplID0gZGVzZXJpYWxpemU7XG4vLy8gRGVzZXJpYWxpemVzIG9iamVjdCBmcm9tIGJ5dGVzIHVzaW5nIHNjaGVtYSwgd2l0aG91dCBjaGVja2luZyB0aGUgbGVuZ3RoIHJlYWRcbmZ1bmN0aW9uIGRlc2VyaWFsaXplVW5jaGVja2VkKHNjaGVtYSwgY2xhc3NUeXBlLCBidWZmZXIsIFJlYWRlciA9IEJpbmFyeVJlYWRlcikge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBSZWFkZXIoYnVmZmVyKTtcbiAgICByZXR1cm4gZGVzZXJpYWxpemVTdHJ1Y3Qoc2NoZW1hLCBjbGFzc1R5cGUsIHJlYWRlcik7XG59XG5leHBvcnRzLmRlc2VyaWFsaXplVW5jaGVja2VkID0gZGVzZXJpYWxpemVVbmNoZWNrZWQ7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/borsh/lib/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/borsh/node_modules/base-x/src/index.js":
/*!*************************************************************!*\
  !*** ./node_modules/borsh/node_modules/base-x/src/index.js ***!
  \*************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\n// base-x encoding / decoding\n// Copyright (c) 2018 base-x contributors\n// Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)\n// Distributed under the MIT software license, see the accompanying\n// file LICENSE or http://www.opensource.org/licenses/mit-license.php.\n// @ts-ignore\nvar _Buffer = (__webpack_require__(/*! safe-buffer */ \"(app-pages-browser)/./node_modules/safe-buffer/index.js\").Buffer)\nfunction base (ALPHABET) {\n  if (ALPHABET.length >= 255) { throw new TypeError('Alphabet too long') }\n  var BASE_MAP = new Uint8Array(256)\n  for (var j = 0; j < BASE_MAP.length; j++) {\n    BASE_MAP[j] = 255\n  }\n  for (var i = 0; i < ALPHABET.length; i++) {\n    var x = ALPHABET.charAt(i)\n    var xc = x.charCodeAt(0)\n    if (BASE_MAP[xc] !== 255) { throw new TypeError(x + ' is ambiguous') }\n    BASE_MAP[xc] = i\n  }\n  var BASE = ALPHABET.length\n  var LEADER = ALPHABET.charAt(0)\n  var FACTOR = Math.log(BASE) / Math.log(256) // log(BASE) / log(256), rounded up\n  var iFACTOR = Math.log(256) / Math.log(BASE) // log(256) / log(BASE), rounded up\n  function encode (source) {\n    if (Array.isArray(source) || source instanceof Uint8Array) { source = _Buffer.from(source) }\n    if (!_Buffer.isBuffer(source)) { throw new TypeError('Expected Buffer') }\n    if (source.length === 0) { return '' }\n        // Skip & count leading zeroes.\n    var zeroes = 0\n    var length = 0\n    var pbegin = 0\n    var pend = source.length\n    while (pbegin !== pend && source[pbegin] === 0) {\n      pbegin++\n      zeroes++\n    }\n        // Allocate enough space in big-endian base58 representation.\n    var size = ((pend - pbegin) * iFACTOR + 1) >>> 0\n    var b58 = new Uint8Array(size)\n        // Process the bytes.\n    while (pbegin !== pend) {\n      var carry = source[pbegin]\n            // Apply \"b58 = b58 * 256 + ch\".\n      var i = 0\n      for (var it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {\n        carry += (256 * b58[it1]) >>> 0\n        b58[it1] = (carry % BASE) >>> 0\n        carry = (carry / BASE) >>> 0\n      }\n      if (carry !== 0) { throw new Error('Non-zero carry') }\n      length = i\n      pbegin++\n    }\n        // Skip leading zeroes in base58 result.\n    var it2 = size - length\n    while (it2 !== size && b58[it2] === 0) {\n      it2++\n    }\n        // Translate the result into a string.\n    var str = LEADER.repeat(zeroes)\n    for (; it2 < size; ++it2) { str += ALPHABET.charAt(b58[it2]) }\n    return str\n  }\n  function decodeUnsafe (source) {\n    if (typeof source !== 'string') { throw new TypeError('Expected String') }\n    if (source.length === 0) { return _Buffer.alloc(0) }\n    var psz = 0\n        // Skip and count leading '1's.\n    var zeroes = 0\n    var length = 0\n    while (source[psz] === LEADER) {\n      zeroes++\n      psz++\n    }\n        // Allocate enough space in big-endian base256 representation.\n    var size = (((source.length - psz) * FACTOR) + 1) >>> 0 // log(58) / log(256), rounded up.\n    var b256 = new Uint8Array(size)\n        // Process the characters.\n    while (psz < source.length) {\n            // Find code of next character\n      var charCode = source.charCodeAt(psz)\n            // Base map can not be indexed using char code\n      if (charCode > 255) { return }\n            // Decode character\n      var carry = BASE_MAP[charCode]\n            // Invalid character\n      if (carry === 255) { return }\n      var i = 0\n      for (var it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {\n        carry += (BASE * b256[it3]) >>> 0\n        b256[it3] = (carry % 256) >>> 0\n        carry = (carry / 256) >>> 0\n      }\n      if (carry !== 0) { throw new Error('Non-zero carry') }\n      length = i\n      psz++\n    }\n        // Skip leading zeroes in b256.\n    var it4 = size - length\n    while (it4 !== size && b256[it4] === 0) {\n      it4++\n    }\n    var vch = _Buffer.allocUnsafe(zeroes + (size - it4))\n    vch.fill(0x00, 0, zeroes)\n    var j = zeroes\n    while (it4 !== size) {\n      vch[j++] = b256[it4++]\n    }\n    return vch\n  }\n  function decode (string) {\n    var buffer = decodeUnsafe(string)\n    if (buffer) { return buffer }\n    throw new Error('Non-base' + BASE + ' character')\n  }\n  return {\n    encode: encode,\n    decodeUnsafe: decodeUnsafe,\n    decode: decode\n  }\n}\nmodule.exports = base\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9ib3JzaC9ub2RlX21vZHVsZXMvYmFzZS14L3NyYy9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWMsMEdBQTZCO0FBQzNDO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0Esa0JBQWtCLHFCQUFxQjtBQUN2QztBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFO0FBQ2pFLHFDQUFxQztBQUNyQywrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw2Q0FBNkM7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLFlBQVksU0FBUztBQUNoQztBQUNBO0FBQ0E7QUFDQSxzQ0FBc0M7QUFDdEMsK0JBQStCO0FBQy9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLDJCQUEyQjtBQUMzQjtBQUNBLCtCQUErQiw2Q0FBNkM7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9ib3JzaC9ub2RlX21vZHVsZXMvYmFzZS14L3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCdcbi8vIGJhc2UteCBlbmNvZGluZyAvIGRlY29kaW5nXG4vLyBDb3B5cmlnaHQgKGMpIDIwMTggYmFzZS14IGNvbnRyaWJ1dG9yc1xuLy8gQ29weXJpZ2h0IChjKSAyMDE0LTIwMTggVGhlIEJpdGNvaW4gQ29yZSBkZXZlbG9wZXJzIChiYXNlNTguY3BwKVxuLy8gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBzb2Z0d2FyZSBsaWNlbnNlLCBzZWUgdGhlIGFjY29tcGFueWluZ1xuLy8gZmlsZSBMSUNFTlNFIG9yIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwLlxuLy8gQHRzLWlnbm9yZVxudmFyIF9CdWZmZXIgPSByZXF1aXJlKCdzYWZlLWJ1ZmZlcicpLkJ1ZmZlclxuZnVuY3Rpb24gYmFzZSAoQUxQSEFCRVQpIHtcbiAgaWYgKEFMUEhBQkVULmxlbmd0aCA+PSAyNTUpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignQWxwaGFiZXQgdG9vIGxvbmcnKSB9XG4gIHZhciBCQVNFX01BUCA9IG5ldyBVaW50OEFycmF5KDI1NilcbiAgZm9yICh2YXIgaiA9IDA7IGogPCBCQVNFX01BUC5sZW5ndGg7IGorKykge1xuICAgIEJBU0VfTUFQW2pdID0gMjU1XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBBTFBIQUJFVC5sZW5ndGg7IGkrKykge1xuICAgIHZhciB4ID0gQUxQSEFCRVQuY2hhckF0KGkpXG4gICAgdmFyIHhjID0geC5jaGFyQ29kZUF0KDApXG4gICAgaWYgKEJBU0VfTUFQW3hjXSAhPT0gMjU1KSB7IHRocm93IG5ldyBUeXBlRXJyb3IoeCArICcgaXMgYW1iaWd1b3VzJykgfVxuICAgIEJBU0VfTUFQW3hjXSA9IGlcbiAgfVxuICB2YXIgQkFTRSA9IEFMUEhBQkVULmxlbmd0aFxuICB2YXIgTEVBREVSID0gQUxQSEFCRVQuY2hhckF0KDApXG4gIHZhciBGQUNUT1IgPSBNYXRoLmxvZyhCQVNFKSAvIE1hdGgubG9nKDI1NikgLy8gbG9nKEJBU0UpIC8gbG9nKDI1NiksIHJvdW5kZWQgdXBcbiAgdmFyIGlGQUNUT1IgPSBNYXRoLmxvZygyNTYpIC8gTWF0aC5sb2coQkFTRSkgLy8gbG9nKDI1NikgLyBsb2coQkFTRSksIHJvdW5kZWQgdXBcbiAgZnVuY3Rpb24gZW5jb2RlIChzb3VyY2UpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2UpIHx8IHNvdXJjZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsgc291cmNlID0gX0J1ZmZlci5mcm9tKHNvdXJjZSkgfVxuICAgIGlmICghX0J1ZmZlci5pc0J1ZmZlcihzb3VyY2UpKSB7IHRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkIEJ1ZmZlcicpIH1cbiAgICBpZiAoc291cmNlLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gJycgfVxuICAgICAgICAvLyBTa2lwICYgY291bnQgbGVhZGluZyB6ZXJvZXMuXG4gICAgdmFyIHplcm9lcyA9IDBcbiAgICB2YXIgbGVuZ3RoID0gMFxuICAgIHZhciBwYmVnaW4gPSAwXG4gICAgdmFyIHBlbmQgPSBzb3VyY2UubGVuZ3RoXG4gICAgd2hpbGUgKHBiZWdpbiAhPT0gcGVuZCAmJiBzb3VyY2VbcGJlZ2luXSA9PT0gMCkge1xuICAgICAgcGJlZ2luKytcbiAgICAgIHplcm9lcysrXG4gICAgfVxuICAgICAgICAvLyBBbGxvY2F0ZSBlbm91Z2ggc3BhY2UgaW4gYmlnLWVuZGlhbiBiYXNlNTggcmVwcmVzZW50YXRpb24uXG4gICAgdmFyIHNpemUgPSAoKHBlbmQgLSBwYmVnaW4pICogaUZBQ1RPUiArIDEpID4+PiAwXG4gICAgdmFyIGI1OCA9IG5ldyBVaW50OEFycmF5KHNpemUpXG4gICAgICAgIC8vIFByb2Nlc3MgdGhlIGJ5dGVzLlxuICAgIHdoaWxlIChwYmVnaW4gIT09IHBlbmQpIHtcbiAgICAgIHZhciBjYXJyeSA9IHNvdXJjZVtwYmVnaW5dXG4gICAgICAgICAgICAvLyBBcHBseSBcImI1OCA9IGI1OCAqIDI1NiArIGNoXCIuXG4gICAgICB2YXIgaSA9IDBcbiAgICAgIGZvciAodmFyIGl0MSA9IHNpemUgLSAxOyAoY2FycnkgIT09IDAgfHwgaSA8IGxlbmd0aCkgJiYgKGl0MSAhPT0gLTEpOyBpdDEtLSwgaSsrKSB7XG4gICAgICAgIGNhcnJ5ICs9ICgyNTYgKiBiNThbaXQxXSkgPj4+IDBcbiAgICAgICAgYjU4W2l0MV0gPSAoY2FycnkgJSBCQVNFKSA+Pj4gMFxuICAgICAgICBjYXJyeSA9IChjYXJyeSAvIEJBU0UpID4+PiAwXG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdOb24temVybyBjYXJyeScpIH1cbiAgICAgIGxlbmd0aCA9IGlcbiAgICAgIHBiZWdpbisrXG4gICAgfVxuICAgICAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGJhc2U1OCByZXN1bHQuXG4gICAgdmFyIGl0MiA9IHNpemUgLSBsZW5ndGhcbiAgICB3aGlsZSAoaXQyICE9PSBzaXplICYmIGI1OFtpdDJdID09PSAwKSB7XG4gICAgICBpdDIrK1xuICAgIH1cbiAgICAgICAgLy8gVHJhbnNsYXRlIHRoZSByZXN1bHQgaW50byBhIHN0cmluZy5cbiAgICB2YXIgc3RyID0gTEVBREVSLnJlcGVhdCh6ZXJvZXMpXG4gICAgZm9yICg7IGl0MiA8IHNpemU7ICsraXQyKSB7IHN0ciArPSBBTFBIQUJFVC5jaGFyQXQoYjU4W2l0Ml0pIH1cbiAgICByZXR1cm4gc3RyXG4gIH1cbiAgZnVuY3Rpb24gZGVjb2RlVW5zYWZlIChzb3VyY2UpIHtcbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ3N0cmluZycpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgU3RyaW5nJykgfVxuICAgIGlmIChzb3VyY2UubGVuZ3RoID09PSAwKSB7IHJldHVybiBfQnVmZmVyLmFsbG9jKDApIH1cbiAgICB2YXIgcHN6ID0gMFxuICAgICAgICAvLyBTa2lwIGFuZCBjb3VudCBsZWFkaW5nICcxJ3MuXG4gICAgdmFyIHplcm9lcyA9IDBcbiAgICB2YXIgbGVuZ3RoID0gMFxuICAgIHdoaWxlIChzb3VyY2VbcHN6XSA9PT0gTEVBREVSKSB7XG4gICAgICB6ZXJvZXMrK1xuICAgICAgcHN6KytcbiAgICB9XG4gICAgICAgIC8vIEFsbG9jYXRlIGVub3VnaCBzcGFjZSBpbiBiaWctZW5kaWFuIGJhc2UyNTYgcmVwcmVzZW50YXRpb24uXG4gICAgdmFyIHNpemUgPSAoKChzb3VyY2UubGVuZ3RoIC0gcHN6KSAqIEZBQ1RPUikgKyAxKSA+Pj4gMCAvLyBsb2coNTgpIC8gbG9nKDI1NiksIHJvdW5kZWQgdXAuXG4gICAgdmFyIGIyNTYgPSBuZXcgVWludDhBcnJheShzaXplKVxuICAgICAgICAvLyBQcm9jZXNzIHRoZSBjaGFyYWN0ZXJzLlxuICAgIHdoaWxlIChwc3ogPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBGaW5kIGNvZGUgb2YgbmV4dCBjaGFyYWN0ZXJcbiAgICAgIHZhciBjaGFyQ29kZSA9IHNvdXJjZS5jaGFyQ29kZUF0KHBzeilcbiAgICAgICAgICAgIC8vIEJhc2UgbWFwIGNhbiBub3QgYmUgaW5kZXhlZCB1c2luZyBjaGFyIGNvZGVcbiAgICAgIGlmIChjaGFyQ29kZSA+IDI1NSkgeyByZXR1cm4gfVxuICAgICAgICAgICAgLy8gRGVjb2RlIGNoYXJhY3RlclxuICAgICAgdmFyIGNhcnJ5ID0gQkFTRV9NQVBbY2hhckNvZGVdXG4gICAgICAgICAgICAvLyBJbnZhbGlkIGNoYXJhY3RlclxuICAgICAgaWYgKGNhcnJ5ID09PSAyNTUpIHsgcmV0dXJuIH1cbiAgICAgIHZhciBpID0gMFxuICAgICAgZm9yICh2YXIgaXQzID0gc2l6ZSAtIDE7IChjYXJyeSAhPT0gMCB8fCBpIDwgbGVuZ3RoKSAmJiAoaXQzICE9PSAtMSk7IGl0My0tLCBpKyspIHtcbiAgICAgICAgY2FycnkgKz0gKEJBU0UgKiBiMjU2W2l0M10pID4+PiAwXG4gICAgICAgIGIyNTZbaXQzXSA9IChjYXJyeSAlIDI1NikgPj4+IDBcbiAgICAgICAgY2FycnkgPSAoY2FycnkgLyAyNTYpID4+PiAwXG4gICAgICB9XG4gICAgICBpZiAoY2FycnkgIT09IDApIHsgdGhyb3cgbmV3IEVycm9yKCdOb24temVybyBjYXJyeScpIH1cbiAgICAgIGxlbmd0aCA9IGlcbiAgICAgIHBzeisrXG4gICAgfVxuICAgICAgICAvLyBTa2lwIGxlYWRpbmcgemVyb2VzIGluIGIyNTYuXG4gICAgdmFyIGl0NCA9IHNpemUgLSBsZW5ndGhcbiAgICB3aGlsZSAoaXQ0ICE9PSBzaXplICYmIGIyNTZbaXQ0XSA9PT0gMCkge1xuICAgICAgaXQ0KytcbiAgICB9XG4gICAgdmFyIHZjaCA9IF9CdWZmZXIuYWxsb2NVbnNhZmUoemVyb2VzICsgKHNpemUgLSBpdDQpKVxuICAgIHZjaC5maWxsKDB4MDAsIDAsIHplcm9lcylcbiAgICB2YXIgaiA9IHplcm9lc1xuICAgIHdoaWxlIChpdDQgIT09IHNpemUpIHtcbiAgICAgIHZjaFtqKytdID0gYjI1NltpdDQrK11cbiAgICB9XG4gICAgcmV0dXJuIHZjaFxuICB9XG4gIGZ1bmN0aW9uIGRlY29kZSAoc3RyaW5nKSB7XG4gICAgdmFyIGJ1ZmZlciA9IGRlY29kZVVuc2FmZShzdHJpbmcpXG4gICAgaWYgKGJ1ZmZlcikgeyByZXR1cm4gYnVmZmVyIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vbi1iYXNlJyArIEJBU0UgKyAnIGNoYXJhY3RlcicpXG4gIH1cbiAgcmV0dXJuIHtcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBkZWNvZGVVbnNhZmU6IGRlY29kZVVuc2FmZSxcbiAgICBkZWNvZGU6IGRlY29kZVxuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IGJhc2VcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/borsh/node_modules/base-x/src/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/borsh/node_modules/bs58/index.js":
/*!*******************************************************!*\
  !*** ./node_modules/borsh/node_modules/bs58/index.js ***!
  \*******************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
eval(__webpack_require__.ts("var basex = __webpack_require__(/*! base-x */ \"(app-pages-browser)/./node_modules/borsh/node_modules/base-x/src/index.js\")\nvar ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n\nmodule.exports = basex(ALPHABET)\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9ib3JzaC9ub2RlX21vZHVsZXMvYnM1OC9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxZQUFZLG1CQUFPLENBQUMseUZBQVE7QUFDNUI7O0FBRUEiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvYm9yc2gvbm9kZV9tb2R1bGVzL2JzNTgvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGJhc2V4ID0gcmVxdWlyZSgnYmFzZS14JylcbnZhciBBTFBIQUJFVCA9ICcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGJhc2V4KEFMUEhBQkVUKVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/borsh/node_modules/bs58/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/buffer/index.js":
/*!**************************************!*\
  !*** ./node_modules/buffer/index.js ***!
  \**************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <https://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n\n\nconst base64 = __webpack_require__(/*! base64-js */ \"(app-pages-browser)/./node_modules/base64-js/index.js\")\nconst ieee754 = __webpack_require__(/*! ieee754 */ \"(app-pages-browser)/./node_modules/ieee754/index.js\")\nconst customInspectSymbol =\n  (typeof Symbol === 'function' && typeof Symbol['for'] === 'function') // eslint-disable-line dot-notation\n    ? Symbol['for']('nodejs.util.inspect.custom') // eslint-disable-line dot-notation\n    : null\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\nconst K_MAX_LENGTH = 0x7fffffff\nexports.kMaxLength = K_MAX_LENGTH\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Print warning and recommend using `buffer` v4.x which has an Object\n *               implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * We report that the browser does not support typed arrays if the are not subclassable\n * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`\n * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support\n * for __proto__ and has a buggy typed array implementation.\n */\nBuffer.TYPED_ARRAY_SUPPORT = typedArraySupport()\n\nif (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&\n    typeof console.error === 'function') {\n  console.error(\n    'This browser lacks typed array (Uint8Array) support which is required by ' +\n    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'\n  )\n}\n\nfunction typedArraySupport () {\n  // Can typed array instances can be augmented?\n  try {\n    const arr = new Uint8Array(1)\n    const proto = { foo: function () { return 42 } }\n    Object.setPrototypeOf(proto, Uint8Array.prototype)\n    Object.setPrototypeOf(arr, proto)\n    return arr.foo() === 42\n  } catch (e) {\n    return false\n  }\n}\n\nObject.defineProperty(Buffer.prototype, 'parent', {\n  enumerable: true,\n  get: function () {\n    if (!Buffer.isBuffer(this)) return undefined\n    return this.buffer\n  }\n})\n\nObject.defineProperty(Buffer.prototype, 'offset', {\n  enumerable: true,\n  get: function () {\n    if (!Buffer.isBuffer(this)) return undefined\n    return this.byteOffset\n  }\n})\n\nfunction createBuffer (length) {\n  if (length > K_MAX_LENGTH) {\n    throw new RangeError('The value \"' + length + '\" is invalid for option \"size\"')\n  }\n  // Return an augmented `Uint8Array` instance\n  const buf = new Uint8Array(length)\n  Object.setPrototypeOf(buf, Buffer.prototype)\n  return buf\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new TypeError(\n        'The \"string\" argument must be of type string. Received type number'\n      )\n    }\n    return allocUnsafe(arg)\n  }\n  return from(arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\nfunction from (value, encodingOrOffset, length) {\n  if (typeof value === 'string') {\n    return fromString(value, encodingOrOffset)\n  }\n\n  if (ArrayBuffer.isView(value)) {\n    return fromArrayView(value)\n  }\n\n  if (value == null) {\n    throw new TypeError(\n      'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n      'or Array-like Object. Received type ' + (typeof value)\n    )\n  }\n\n  if (isInstance(value, ArrayBuffer) ||\n      (value && isInstance(value.buffer, ArrayBuffer))) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof SharedArrayBuffer !== 'undefined' &&\n      (isInstance(value, SharedArrayBuffer) ||\n      (value && isInstance(value.buffer, SharedArrayBuffer)))) {\n    return fromArrayBuffer(value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'number') {\n    throw new TypeError(\n      'The \"value\" argument must not be of type number. Received type number'\n    )\n  }\n\n  const valueOf = value.valueOf && value.valueOf()\n  if (valueOf != null && valueOf !== value) {\n    return Buffer.from(valueOf, encodingOrOffset, length)\n  }\n\n  const b = fromObject(value)\n  if (b) return b\n\n  if (typeof Symbol !== 'undefined' && Symbol.toPrimitive != null &&\n      typeof value[Symbol.toPrimitive] === 'function') {\n    return Buffer.from(value[Symbol.toPrimitive]('string'), encodingOrOffset, length)\n  }\n\n  throw new TypeError(\n    'The first argument must be one of type string, Buffer, ArrayBuffer, Array, ' +\n    'or Array-like Object. Received type ' + (typeof value)\n  )\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(value, encodingOrOffset, length)\n}\n\n// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:\n// https://github.com/feross/buffer/pull/148\nObject.setPrototypeOf(Buffer.prototype, Uint8Array.prototype)\nObject.setPrototypeOf(Buffer, Uint8Array)\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be of type number')\n  } else if (size < 0) {\n    throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n  }\n}\n\nfunction alloc (size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpreted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(size).fill(fill, encoding)\n      : createBuffer(size).fill(fill)\n  }\n  return createBuffer(size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(size, fill, encoding)\n}\n\nfunction allocUnsafe (size) {\n  assertSize(size)\n  return createBuffer(size < 0 ? 0 : checked(size) | 0)\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(size)\n}\n\nfunction fromString (string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('Unknown encoding: ' + encoding)\n  }\n\n  const length = byteLength(string, encoding) | 0\n  let buf = createBuffer(length)\n\n  const actual = buf.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    buf = buf.slice(0, actual)\n  }\n\n  return buf\n}\n\nfunction fromArrayLike (array) {\n  const length = array.length < 0 ? 0 : checked(array.length) | 0\n  const buf = createBuffer(length)\n  for (let i = 0; i < length; i += 1) {\n    buf[i] = array[i] & 255\n  }\n  return buf\n}\n\nfunction fromArrayView (arrayView) {\n  if (isInstance(arrayView, Uint8Array)) {\n    const copy = new Uint8Array(arrayView)\n    return fromArrayBuffer(copy.buffer, copy.byteOffset, copy.byteLength)\n  }\n  return fromArrayLike(arrayView)\n}\n\nfunction fromArrayBuffer (array, byteOffset, length) {\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\"offset\" is outside of buffer bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\"length\" is outside of buffer bounds')\n  }\n\n  let buf\n  if (byteOffset === undefined && length === undefined) {\n    buf = new Uint8Array(array)\n  } else if (length === undefined) {\n    buf = new Uint8Array(array, byteOffset)\n  } else {\n    buf = new Uint8Array(array, byteOffset, length)\n  }\n\n  // Return an augmented `Uint8Array` instance\n  Object.setPrototypeOf(buf, Buffer.prototype)\n\n  return buf\n}\n\nfunction fromObject (obj) {\n  if (Buffer.isBuffer(obj)) {\n    const len = checked(obj.length) | 0\n    const buf = createBuffer(len)\n\n    if (buf.length === 0) {\n      return buf\n    }\n\n    obj.copy(buf, 0, 0, len)\n    return buf\n  }\n\n  if (obj.length !== undefined) {\n    if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {\n      return createBuffer(0)\n    }\n    return fromArrayLike(obj)\n  }\n\n  if (obj.type === 'Buffer' && Array.isArray(obj.data)) {\n    return fromArrayLike(obj.data)\n  }\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= K_MAX_LENGTH) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return b != null && b._isBuffer === true &&\n    b !== Buffer.prototype // so Buffer.isBuffer(Buffer.prototype) will be false\n}\n\nBuffer.compare = function compare (a, b) {\n  if (isInstance(a, Uint8Array)) a = Buffer.from(a, a.offset, a.byteLength)\n  if (isInstance(b, Uint8Array)) b = Buffer.from(b, b.offset, b.byteLength)\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError(\n      'The \"buf1\", \"buf2\" arguments must be one of type Buffer or Uint8Array'\n    )\n  }\n\n  if (a === b) return 0\n\n  let x = a.length\n  let y = b.length\n\n  for (let i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!Array.isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  let i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  const buffer = Buffer.allocUnsafe(length)\n  let pos = 0\n  for (i = 0; i < list.length; ++i) {\n    let buf = list[i]\n    if (isInstance(buf, Uint8Array)) {\n      if (pos + buf.length > buffer.length) {\n        if (!Buffer.isBuffer(buf)) buf = Buffer.from(buf)\n        buf.copy(buffer, pos)\n      } else {\n        Uint8Array.prototype.set.call(\n          buffer,\n          buf,\n          pos\n        )\n      }\n    } else if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    } else {\n      buf.copy(buffer, pos)\n    }\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (ArrayBuffer.isView(string) || isInstance(string, ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    throw new TypeError(\n      'The \"string\" argument must be one of type string, Buffer, or ArrayBuffer. ' +\n      'Received type ' + typeof string\n    )\n  }\n\n  const len = string.length\n  const mustMatch = (arguments.length > 2 && arguments[2] === true)\n  if (!mustMatch && len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  let loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) {\n          return mustMatch ? -1 : utf8ToBytes(string).length // assume utf8\n        }\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  let loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coercion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)\n// to detect a Buffer instance. It's not possible to use `instanceof Buffer`\n// reliably in a browserify context because there could be multiple different\n// copies of the 'buffer' package in use. This method works even for Buffer\n// instances that were created from another copy of the `buffer` package.\n// See: https://github.com/feross/buffer/issues/154\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  const i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  const len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (let i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  const len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (let i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  const len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (let i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  const length = this.length\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.toLocaleString = Buffer.prototype.toString\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  let str = ''\n  const max = exports.INSPECT_MAX_BYTES\n  str = this.toString('hex', 0, max).replace(/(.{2})/g, '$1 ').trim()\n  if (this.length > max) str += ' ... '\n  return '<Buffer ' + str + '>'\n}\nif (customInspectSymbol) {\n  Buffer.prototype[customInspectSymbol] = Buffer.prototype.inspect\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (isInstance(target, Uint8Array)) {\n    target = Buffer.from(target, target.offset, target.byteLength)\n  }\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError(\n      'The \"target\" argument must be one of type Buffer or Uint8Array. ' +\n      'Received type ' + (typeof target)\n    )\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  let x = thisEnd - thisStart\n  let y = end - start\n  const len = Math.min(x, y)\n\n  const thisCopy = this.slice(thisStart, thisEnd)\n  const targetCopy = target.slice(start, end)\n\n  for (let i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset // Coerce to Number.\n  if (numberIsNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [val], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  let indexSize = 1\n  let arrLength = arr.length\n  let valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  let i\n  if (dir) {\n    let foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      let found = true\n      for (let j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  const remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  const strLen = string.length\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  let i\n  for (i = 0; i < length; ++i) {\n    const parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (numberIsNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset >>> 0\n    if (isFinite(length)) {\n      length = length >>> 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  const remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  let loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return asciiWrite(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  const res = []\n\n  let i = start\n  while (i < end) {\n    const firstByte = buf[i]\n    let codePoint = null\n    let bytesPerSequence = (firstByte > 0xEF)\n      ? 4\n      : (firstByte > 0xDF)\n          ? 3\n          : (firstByte > 0xBF)\n              ? 2\n              : 1\n\n    if (i + bytesPerSequence <= end) {\n      let secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nconst MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  const len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  let res = ''\n  let i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  let ret = ''\n  end = Math.min(buf.length, end)\n\n  for (let i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  let ret = ''\n  end = Math.min(buf.length, end)\n\n  for (let i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  const len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  let out = ''\n  for (let i = start; i < end; ++i) {\n    out += hexSliceLookupTable[buf[i]]\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  const bytes = buf.slice(start, end)\n  let res = ''\n  // If bytes.length is odd, the last 8 bits must be ignored (same as node.js)\n  for (let i = 0; i < bytes.length - 1; i += 2) {\n    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  const len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  const newBuf = this.subarray(start, end)\n  // Return an augmented `Uint8Array` instance\n  Object.setPrototypeOf(newBuf, Buffer.prototype)\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUintLE =\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  let val = this[offset]\n  let mul = 1\n  let i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUintBE =\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  let val = this[offset + --byteLength]\n  let mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUint8 =\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUint16LE =\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUint16BE =\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUint32LE =\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUint32BE =\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readBigUInt64LE = defineBigIntMethod(function readBigUInt64LE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const lo = first +\n    this[++offset] * 2 ** 8 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 24\n\n  const hi = this[++offset] +\n    this[++offset] * 2 ** 8 +\n    this[++offset] * 2 ** 16 +\n    last * 2 ** 24\n\n  return BigInt(lo) + (BigInt(hi) << BigInt(32))\n})\n\nBuffer.prototype.readBigUInt64BE = defineBigIntMethod(function readBigUInt64BE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const hi = first * 2 ** 24 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    this[++offset]\n\n  const lo = this[++offset] * 2 ** 24 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    last\n\n  return (BigInt(hi) << BigInt(32)) + BigInt(lo)\n})\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  let val = this[offset]\n  let mul = 1\n  let i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  let i = byteLength\n  let mul = 1\n  let val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  const val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  const val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readBigInt64LE = defineBigIntMethod(function readBigInt64LE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const val = this[offset + 4] +\n    this[offset + 5] * 2 ** 8 +\n    this[offset + 6] * 2 ** 16 +\n    (last << 24) // Overflow\n\n  return (BigInt(val) << BigInt(32)) +\n    BigInt(first +\n    this[++offset] * 2 ** 8 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 24)\n})\n\nBuffer.prototype.readBigInt64BE = defineBigIntMethod(function readBigInt64BE (offset) {\n  offset = offset >>> 0\n  validateNumber(offset, 'offset')\n  const first = this[offset]\n  const last = this[offset + 7]\n  if (first === undefined || last === undefined) {\n    boundsError(offset, this.length - 8)\n  }\n\n  const val = (first << 24) + // Overflow\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    this[++offset]\n\n  return (BigInt(val) << BigInt(32)) +\n    BigInt(this[++offset] * 2 ** 24 +\n    this[++offset] * 2 ** 16 +\n    this[++offset] * 2 ** 8 +\n    last)\n})\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  offset = offset >>> 0\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUintLE =\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    const maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  let mul = 1\n  let i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUintBE =\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  byteLength = byteLength >>> 0\n  if (!noAssert) {\n    const maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  let i = byteLength - 1\n  let mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUint8 =\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeUint16LE =\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeUint16BE =\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeUint32LE =\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset + 3] = (value >>> 24)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 1] = (value >>> 8)\n  this[offset] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeUint32BE =\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nfunction wrtBigUInt64LE (buf, value, offset, min, max) {\n  checkIntBI(value, min, max, buf, offset, 7)\n\n  let lo = Number(value & BigInt(0xffffffff))\n  buf[offset++] = lo\n  lo = lo >> 8\n  buf[offset++] = lo\n  lo = lo >> 8\n  buf[offset++] = lo\n  lo = lo >> 8\n  buf[offset++] = lo\n  let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n  buf[offset++] = hi\n  hi = hi >> 8\n  buf[offset++] = hi\n  hi = hi >> 8\n  buf[offset++] = hi\n  hi = hi >> 8\n  buf[offset++] = hi\n  return offset\n}\n\nfunction wrtBigUInt64BE (buf, value, offset, min, max) {\n  checkIntBI(value, min, max, buf, offset, 7)\n\n  let lo = Number(value & BigInt(0xffffffff))\n  buf[offset + 7] = lo\n  lo = lo >> 8\n  buf[offset + 6] = lo\n  lo = lo >> 8\n  buf[offset + 5] = lo\n  lo = lo >> 8\n  buf[offset + 4] = lo\n  let hi = Number(value >> BigInt(32) & BigInt(0xffffffff))\n  buf[offset + 3] = hi\n  hi = hi >> 8\n  buf[offset + 2] = hi\n  hi = hi >> 8\n  buf[offset + 1] = hi\n  hi = hi >> 8\n  buf[offset] = hi\n  return offset + 8\n}\n\nBuffer.prototype.writeBigUInt64LE = defineBigIntMethod(function writeBigUInt64LE (value, offset = 0) {\n  return wrtBigUInt64LE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeBigUInt64BE = defineBigIntMethod(function writeBigUInt64BE (value, offset = 0) {\n  return wrtBigUInt64BE(this, value, offset, BigInt(0), BigInt('0xffffffffffffffff'))\n})\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    const limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  let i = 0\n  let mul = 1\n  let sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    const limit = Math.pow(2, (8 * byteLength) - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  let i = byteLength - 1\n  let mul = 1\n  let sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  this[offset] = (value >>> 8)\n  this[offset + 1] = (value & 0xff)\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  this[offset] = (value & 0xff)\n  this[offset + 1] = (value >>> 8)\n  this[offset + 2] = (value >>> 16)\n  this[offset + 3] = (value >>> 24)\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  this[offset] = (value >>> 24)\n  this[offset + 1] = (value >>> 16)\n  this[offset + 2] = (value >>> 8)\n  this[offset + 3] = (value & 0xff)\n  return offset + 4\n}\n\nBuffer.prototype.writeBigInt64LE = defineBigIntMethod(function writeBigInt64LE (value, offset = 0) {\n  return wrtBigUInt64LE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nBuffer.prototype.writeBigInt64BE = defineBigIntMethod(function writeBigInt64BE (value, offset = 0) {\n  return wrtBigUInt64BE(this, value, offset, -BigInt('0x8000000000000000'), BigInt('0x7fffffffffffffff'))\n})\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  value = +value\n  offset = offset >>> 0\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!Buffer.isBuffer(target)) throw new TypeError('argument should be a Buffer')\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('Index out of range')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  const len = end - start\n\n  if (this === target && typeof Uint8Array.prototype.copyWithin === 'function') {\n    // Use built-in when available, missing from IE11\n    this.copyWithin(targetStart, start, end)\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, end),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n    if (val.length === 1) {\n      const code = val.charCodeAt(0)\n      if ((encoding === 'utf8' && code < 128) ||\n          encoding === 'latin1') {\n        // Fast path: If `val` fits into a single byte, use that numeric value.\n        val = code\n      }\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  } else if (typeof val === 'boolean') {\n    val = Number(val)\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  let i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    const bytes = Buffer.isBuffer(val)\n      ? val\n      : Buffer.from(val, encoding)\n    const len = bytes.length\n    if (len === 0) {\n      throw new TypeError('The value \"' + val +\n        '\" is invalid for argument \"value\"')\n    }\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// CUSTOM ERRORS\n// =============\n\n// Simplified versions from Node, changed for Buffer-only usage\nconst errors = {}\nfunction E (sym, getMessage, Base) {\n  errors[sym] = class NodeError extends Base {\n    constructor () {\n      super()\n\n      Object.defineProperty(this, 'message', {\n        value: getMessage.apply(this, arguments),\n        writable: true,\n        configurable: true\n      })\n\n      // Add the error code to the name to include it in the stack trace.\n      this.name = `${this.name} [${sym}]`\n      // Access the stack to generate the error message including the error code\n      // from the name.\n      this.stack // eslint-disable-line no-unused-expressions\n      // Reset the name to the actual name.\n      delete this.name\n    }\n\n    get code () {\n      return sym\n    }\n\n    set code (value) {\n      Object.defineProperty(this, 'code', {\n        configurable: true,\n        enumerable: true,\n        value,\n        writable: true\n      })\n    }\n\n    toString () {\n      return `${this.name} [${sym}]: ${this.message}`\n    }\n  }\n}\n\nE('ERR_BUFFER_OUT_OF_BOUNDS',\n  function (name) {\n    if (name) {\n      return `${name} is outside of buffer bounds`\n    }\n\n    return 'Attempt to access memory outside buffer bounds'\n  }, RangeError)\nE('ERR_INVALID_ARG_TYPE',\n  function (name, actual) {\n    return `The \"${name}\" argument must be of type number. Received type ${typeof actual}`\n  }, TypeError)\nE('ERR_OUT_OF_RANGE',\n  function (str, range, input) {\n    let msg = `The value of \"${str}\" is out of range.`\n    let received = input\n    if (Number.isInteger(input) && Math.abs(input) > 2 ** 32) {\n      received = addNumericalSeparator(String(input))\n    } else if (typeof input === 'bigint') {\n      received = String(input)\n      if (input > BigInt(2) ** BigInt(32) || input < -(BigInt(2) ** BigInt(32))) {\n        received = addNumericalSeparator(received)\n      }\n      received += 'n'\n    }\n    msg += ` It must be ${range}. Received ${received}`\n    return msg\n  }, RangeError)\n\nfunction addNumericalSeparator (val) {\n  let res = ''\n  let i = val.length\n  const start = val[0] === '-' ? 1 : 0\n  for (; i >= start + 4; i -= 3) {\n    res = `_${val.slice(i - 3, i)}${res}`\n  }\n  return `${val.slice(0, i)}${res}`\n}\n\n// CHECK FUNCTIONS\n// ===============\n\nfunction checkBounds (buf, offset, byteLength) {\n  validateNumber(offset, 'offset')\n  if (buf[offset] === undefined || buf[offset + byteLength] === undefined) {\n    boundsError(offset, buf.length - (byteLength + 1))\n  }\n}\n\nfunction checkIntBI (value, min, max, buf, offset, byteLength) {\n  if (value > max || value < min) {\n    const n = typeof min === 'bigint' ? 'n' : ''\n    let range\n    if (byteLength > 3) {\n      if (min === 0 || min === BigInt(0)) {\n        range = `>= 0${n} and < 2${n} ** ${(byteLength + 1) * 8}${n}`\n      } else {\n        range = `>= -(2${n} ** ${(byteLength + 1) * 8 - 1}${n}) and < 2 ** ` +\n                `${(byteLength + 1) * 8 - 1}${n}`\n      }\n    } else {\n      range = `>= ${min}${n} and <= ${max}${n}`\n    }\n    throw new errors.ERR_OUT_OF_RANGE('value', range, value)\n  }\n  checkBounds(buf, offset, byteLength)\n}\n\nfunction validateNumber (value, name) {\n  if (typeof value !== 'number') {\n    throw new errors.ERR_INVALID_ARG_TYPE(name, 'number', value)\n  }\n}\n\nfunction boundsError (value, length, type) {\n  if (Math.floor(value) !== value) {\n    validateNumber(value, type)\n    throw new errors.ERR_OUT_OF_RANGE(type || 'offset', 'an integer', value)\n  }\n\n  if (length < 0) {\n    throw new errors.ERR_BUFFER_OUT_OF_BOUNDS()\n  }\n\n  throw new errors.ERR_OUT_OF_RANGE(type || 'offset',\n                                    `>= ${type ? 1 : 0} and <= ${length}`,\n                                    value)\n}\n\n// HELPER FUNCTIONS\n// ================\n\nconst INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node takes equal signs as end of the Base64 encoding\n  str = str.split('=')[0]\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = str.trim().replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  let codePoint\n  const length = string.length\n  let leadSurrogate = null\n  const bytes = []\n\n  for (let i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  const byteArray = []\n  for (let i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  let c, hi, lo\n  const byteArray = []\n  for (let i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  let i\n  for (i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\n// ArrayBuffer or Uint8Array objects from other contexts (i.e. iframes) do not pass\n// the `instanceof` check but they should be treated as of that type.\n// See: https://github.com/feross/buffer/issues/166\nfunction isInstance (obj, type) {\n  return obj instanceof type ||\n    (obj != null && obj.constructor != null && obj.constructor.name != null &&\n      obj.constructor.name === type.name)\n}\nfunction numberIsNaN (obj) {\n  // For IE11 support\n  return obj !== obj // eslint-disable-line no-self-compare\n}\n\n// Create lookup table for `toString('hex')`\n// See: https://github.com/feross/buffer/issues/219\nconst hexSliceLookupTable = (function () {\n  const alphabet = '0123456789abcdef'\n  const table = new Array(256)\n  for (let i = 0; i < 16; ++i) {\n    const i16 = i * 16\n    for (let j = 0; j < 16; ++j) {\n      table[i16 + j] = alphabet[i] + alphabet[j]\n    }\n  }\n  return table\n})()\n\n// Return not function with Error if BigInt not supported\nfunction defineBigIntMethod (fn) {\n  return typeof BigInt === 'undefined' ? BufferBigIntNotDefined : fn\n}\n\nfunction BufferBigIntNotDefined () {\n  throw new Error('BigInt not supported')\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9idWZmZXIvaW5kZXguanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRVk7O0FBRVosZUFBZSxtQkFBTyxDQUFDLHdFQUFXO0FBQ2xDLGdCQUFnQixtQkFBTyxDQUFDLG9FQUFTO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGNBQWM7QUFDZCxrQkFBa0I7QUFDbEIseUJBQXlCOztBQUV6QjtBQUNBLGtCQUFrQjs7QUFFbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLG1CQUFtQjtBQUN2QztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFlBQVk7QUFDOUI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBLHdDQUF3QyxTQUFTO0FBQ2pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUI7QUFDakM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLGlCQUFpQjtBQUMvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLFNBQVM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixTQUFTO0FBQzNCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLGlEQUFpRCxFQUFFO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsU0FBUztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLGVBQWU7QUFDeEM7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EseUJBQXlCLFFBQVE7QUFDakM7QUFDQSxzQkFBc0IsZUFBZTtBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYyxZQUFZO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQSxzQkFBc0IsU0FBUztBQUMvQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0Esc0JBQXNCLFNBQVM7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isc0JBQXNCO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBLENBQUM7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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RUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGtCQUFrQixnQkFBZ0I7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxZQUFZO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQkFBa0IsUUFBUTtBQUMxQjtBQUNBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvYnVmZmVyL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGh0dHBzOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cblxuJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG5jb25zdCBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG5jb25zdCBjdXN0b21JbnNwZWN0U3ltYm9sID1cbiAgKHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIFN5bWJvbFsnZm9yJ10gPT09ICdmdW5jdGlvbicpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgPyBTeW1ib2xbJ2ZvciddKCdub2RlanMudXRpbC5pbnNwZWN0LmN1c3RvbScpIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZG90LW5vdGF0aW9uXG4gICAgOiBudWxsXG5cbmV4cG9ydHMuQnVmZmVyID0gQnVmZmVyXG5leHBvcnRzLlNsb3dCdWZmZXIgPSBTbG93QnVmZmVyXG5leHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTID0gNTBcblxuY29uc3QgS19NQVhfTEVOR1RIID0gMHg3ZmZmZmZmZlxuZXhwb3J0cy5rTWF4TGVuZ3RoID0gS19NQVhfTEVOR1RIXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFByaW50IHdhcm5pbmcgYW5kIHJlY29tbWVuZCB1c2luZyBgYnVmZmVyYCB2NC54IHdoaWNoIGhhcyBhbiBPYmplY3RcbiAqICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIFdlIHJlcG9ydCB0aGF0IHRoZSBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgdHlwZWQgYXJyYXlzIGlmIHRoZSBhcmUgbm90IHN1YmNsYXNzYWJsZVxuICogdXNpbmcgX19wcm90b19fLiBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YFxuICogKFNlZTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Njk1NDM4KS4gSUUgMTAgbGFja3Mgc3VwcG9ydFxuICogZm9yIF9fcHJvdG9fXyBhbmQgaGFzIGEgYnVnZ3kgdHlwZWQgYXJyYXkgaW1wbGVtZW50YXRpb24uXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gdHlwZWRBcnJheVN1cHBvcnQoKVxuXG5pZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmIHR5cGVvZiBjb25zb2xlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiBjb25zb2xlLmVycm9yID09PSAnZnVuY3Rpb24nKSB7XG4gIGNvbnNvbGUuZXJyb3IoXG4gICAgJ1RoaXMgYnJvd3NlciBsYWNrcyB0eXBlZCBhcnJheSAoVWludDhBcnJheSkgc3VwcG9ydCB3aGljaCBpcyByZXF1aXJlZCBieSAnICtcbiAgICAnYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4nXG4gIClcbn1cblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICAvLyBDYW4gdHlwZWQgYXJyYXkgaW5zdGFuY2VzIGNhbiBiZSBhdWdtZW50ZWQ/XG4gIHRyeSB7XG4gICAgY29uc3QgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBjb25zdCBwcm90byA9IHsgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9IH1cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YocHJvdG8sIFVpbnQ4QXJyYXkucHJvdG90eXBlKVxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihhcnIsIHByb3RvKVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLnByb3RvdHlwZSwgJ3BhcmVudCcsIHtcbiAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIodGhpcykpIHJldHVybiB1bmRlZmluZWRcbiAgICByZXR1cm4gdGhpcy5idWZmZXJcbiAgfVxufSlcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEJ1ZmZlci5wcm90b3R5cGUsICdvZmZzZXQnLCB7XG4gIGVudW1lcmFibGU6IHRydWUsXG4gIGdldDogZnVuY3Rpb24gKCkge1xuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKHRoaXMpKSByZXR1cm4gdW5kZWZpbmVkXG4gICAgcmV0dXJuIHRoaXMuYnl0ZU9mZnNldFxuICB9XG59KVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAobGVuZ3RoID4gS19NQVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RoZSB2YWx1ZSBcIicgKyBsZW5ndGggKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gIE9iamVjdC5zZXRQcm90b3R5cGVPZihidWYsIEJ1ZmZlci5wcm90b3R5cGUpXG4gIHJldHVybiBidWZcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIC8vIENvbW1vbiBjYXNlLlxuICBpZiAodHlwZW9mIGFyZyA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAodHlwZW9mIGVuY29kaW5nT3JPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIHN0cmluZy4gUmVjZWl2ZWQgdHlwZSBudW1iZXInXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZShhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20oYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG5mdW5jdGlvbiBmcm9tICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZyb21TdHJpbmcodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQpXG4gIH1cblxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHZhbHVlKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlWaWV3KHZhbHVlKVxuICB9XG5cbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksICcgK1xuICAgICAgJ29yIEFycmF5LWxpa2UgT2JqZWN0LiBSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHZhbHVlKVxuICAgIClcbiAgfVxuXG4gIGlmIChpc0luc3RhbmNlKHZhbHVlLCBBcnJheUJ1ZmZlcikgfHxcbiAgICAgICh2YWx1ZSAmJiBpc0luc3RhbmNlKHZhbHVlLmJ1ZmZlciwgQXJyYXlCdWZmZXIpKSkge1xuICAgIHJldHVybiBmcm9tQXJyYXlCdWZmZXIodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmICh0eXBlb2YgU2hhcmVkQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAoaXNJbnN0YW5jZSh2YWx1ZSwgU2hhcmVkQXJyYXlCdWZmZXIpIHx8XG4gICAgICAodmFsdWUgJiYgaXNJbnN0YW5jZSh2YWx1ZS5idWZmZXIsIFNoYXJlZEFycmF5QnVmZmVyKSkpKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgJ1RoZSBcInZhbHVlXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgbnVtYmVyJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IHZhbHVlT2YgPSB2YWx1ZS52YWx1ZU9mICYmIHZhbHVlLnZhbHVlT2YoKVxuICBpZiAodmFsdWVPZiAhPSBudWxsICYmIHZhbHVlT2YgIT09IHZhbHVlKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlT2YsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGNvbnN0IGIgPSBmcm9tT2JqZWN0KHZhbHVlKVxuICBpZiAoYikgcmV0dXJuIGJcblxuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvUHJpbWl0aXZlICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZVtTeW1ib2wudG9QcmltaXRpdmVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5mcm9tKHZhbHVlW1N5bWJvbC50b1ByaW1pdGl2ZV0oJ3N0cmluZycpLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICdUaGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCAnICtcbiAgICAnb3IgQXJyYXktbGlrZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArICh0eXBlb2YgdmFsdWUpXG4gIClcbn1cblxuLyoqXG4gKiBGdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBCdWZmZXIoYXJnLCBlbmNvZGluZykgYnV0IHRocm93cyBhIFR5cGVFcnJvclxuICogaWYgdmFsdWUgaXMgYSBudW1iZXIuXG4gKiBCdWZmZXIuZnJvbShzdHJbLCBlbmNvZGluZ10pXG4gKiBCdWZmZXIuZnJvbShhcnJheSlcbiAqIEJ1ZmZlci5mcm9tKGJ1ZmZlcilcbiAqIEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyWywgYnl0ZU9mZnNldFssIGxlbmd0aF1dKVxuICoqL1xuQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAodmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gZnJvbSh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG4vLyBOb3RlOiBDaGFuZ2UgcHJvdG90eXBlICphZnRlciogQnVmZmVyLmZyb20gaXMgZGVmaW5lZCB0byB3b3JrYXJvdW5kIENocm9tZSBidWc6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9wdWxsLzE0OFxuT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlci5wcm90b3R5cGUsIFVpbnQ4QXJyYXkucHJvdG90eXBlKVxuT2JqZWN0LnNldFByb3RvdHlwZU9mKEJ1ZmZlciwgVWludDhBcnJheSlcblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVGhlIHZhbHVlIFwiJyArIHNpemUgKyAnXCIgaXMgaW52YWxpZCBmb3Igb3B0aW9uIFwic2l6ZVwiJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcihzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIoc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICB9XG5cbiAgY29uc3QgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgbGV0IGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW5ndGgpXG5cbiAgY29uc3QgYWN0dWFsID0gYnVmLndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICBidWYgPSBidWYuc2xpY2UoMCwgYWN0dWFsKVxuICB9XG5cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlIChhcnJheSkge1xuICBjb25zdCBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgY29uc3QgYnVmID0gY3JlYXRlQnVmZmVyKGxlbmd0aClcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGJ1ZltpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIGJ1ZlxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlWaWV3IChhcnJheVZpZXcpIHtcbiAgaWYgKGlzSW5zdGFuY2UoYXJyYXlWaWV3LCBVaW50OEFycmF5KSkge1xuICAgIGNvbnN0IGNvcHkgPSBuZXcgVWludDhBcnJheShhcnJheVZpZXcpXG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcihjb3B5LmJ1ZmZlciwgY29weS5ieXRlT2Zmc2V0LCBjb3B5LmJ5dGVMZW5ndGgpXG4gIH1cbiAgcmV0dXJuIGZyb21BcnJheUxpa2UoYXJyYXlWaWV3KVxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wib2Zmc2V0XCIgaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJsZW5ndGhcIiBpcyBvdXRzaWRlIG9mIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgbGV0IGJ1ZlxuICBpZiAoYnl0ZU9mZnNldCA9PT0gdW5kZWZpbmVkICYmIGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBidWYgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gUmV0dXJuIGFuIGF1Z21lbnRlZCBgVWludDhBcnJheWAgaW5zdGFuY2VcbiAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGJ1ZiwgQnVmZmVyLnByb3RvdHlwZSlcblxuICByZXR1cm4gYnVmXG59XG5cbmZ1bmN0aW9uIGZyb21PYmplY3QgKG9iaikge1xuICBpZiAoQnVmZmVyLmlzQnVmZmVyKG9iaikpIHtcbiAgICBjb25zdCBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIGNvbnN0IGJ1ZiA9IGNyZWF0ZUJ1ZmZlcihsZW4pXG5cbiAgICBpZiAoYnVmLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGJ1ZlxuICAgIH1cblxuICAgIG9iai5jb3B5KGJ1ZiwgMCwgMCwgbGVuKVxuICAgIHJldHVybiBidWZcbiAgfVxuXG4gIGlmIChvYmoubGVuZ3RoICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IG51bWJlcklzTmFOKG9iai5sZW5ndGgpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKDApXG4gICAgfVxuICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKG9iailcbiAgfVxuXG4gIGlmIChvYmoudHlwZSA9PT0gJ0J1ZmZlcicgJiYgQXJyYXkuaXNBcnJheShvYmouZGF0YSkpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5TGlrZShvYmouZGF0YSlcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja2VkIChsZW5ndGgpIHtcbiAgLy8gTm90ZTogY2Fubm90IHVzZSBgbGVuZ3RoIDwgS19NQVhfTEVOR1RIYCBoZXJlIGJlY2F1c2UgdGhhdCBmYWlscyB3aGVuXG4gIC8vIGxlbmd0aCBpcyBOYU4gKHdoaWNoIGlzIG90aGVyd2lzZSBjb2VyY2VkIHRvIHplcm8uKVxuICBpZiAobGVuZ3RoID49IEtfTUFYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIGFsbG9jYXRlIEJ1ZmZlciBsYXJnZXIgdGhhbiBtYXhpbXVtICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICdzaXplOiAweCcgKyBLX01BWF9MRU5HVEgudG9TdHJpbmcoMTYpICsgJyBieXRlcycpXG4gIH1cbiAgcmV0dXJuIGxlbmd0aCB8IDBcbn1cblxuZnVuY3Rpb24gU2xvd0J1ZmZlciAobGVuZ3RoKSB7XG4gIGlmICgrbGVuZ3RoICE9IGxlbmd0aCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcVxuICAgIGxlbmd0aCA9IDBcbiAgfVxuICByZXR1cm4gQnVmZmVyLmFsbG9jKCtsZW5ndGgpXG59XG5cbkJ1ZmZlci5pc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyIChiKSB7XG4gIHJldHVybiBiICE9IG51bGwgJiYgYi5faXNCdWZmZXIgPT09IHRydWUgJiZcbiAgICBiICE9PSBCdWZmZXIucHJvdG90eXBlIC8vIHNvIEJ1ZmZlci5pc0J1ZmZlcihCdWZmZXIucHJvdG90eXBlKSB3aWxsIGJlIGZhbHNlXG59XG5cbkJ1ZmZlci5jb21wYXJlID0gZnVuY3Rpb24gY29tcGFyZSAoYSwgYikge1xuICBpZiAoaXNJbnN0YW5jZShhLCBVaW50OEFycmF5KSkgYSA9IEJ1ZmZlci5mcm9tKGEsIGEub2Zmc2V0LCBhLmJ5dGVMZW5ndGgpXG4gIGlmIChpc0luc3RhbmNlKGIsIFVpbnQ4QXJyYXkpKSBiID0gQnVmZmVyLmZyb20oYiwgYi5vZmZzZXQsIGIuYnl0ZUxlbmd0aClcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwiYnVmMVwiLCBcImJ1ZjJcIiBhcmd1bWVudHMgbXVzdCBiZSBvbmUgb2YgdHlwZSBCdWZmZXIgb3IgVWludDhBcnJheSdcbiAgICApXG4gIH1cblxuICBpZiAoYSA9PT0gYikgcmV0dXJuIDBcblxuICBsZXQgeCA9IGEubGVuZ3RoXG4gIGxldCB5ID0gYi5sZW5ndGhcblxuICBmb3IgKGxldCBpID0gMCwgbGVuID0gTWF0aC5taW4oeCwgeSk7IGkgPCBsZW47ICsraSkge1xuICAgIGlmIChhW2ldICE9PSBiW2ldKSB7XG4gICAgICB4ID0gYVtpXVxuICAgICAgeSA9IGJbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG5CdWZmZXIuaXNFbmNvZGluZyA9IGZ1bmN0aW9uIGlzRW5jb2RpbmcgKGVuY29kaW5nKSB7XG4gIHN3aXRjaCAoU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnaGV4JzpcbiAgICBjYXNlICd1dGY4JzpcbiAgICBjYXNlICd1dGYtOCc6XG4gICAgY2FzZSAnYXNjaWknOlxuICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgY2FzZSAnYmluYXJ5JzpcbiAgICBjYXNlICdiYXNlNjQnOlxuICAgIGNhc2UgJ3VjczInOlxuICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5CdWZmZXIuY29uY2F0ID0gZnVuY3Rpb24gY29uY2F0IChsaXN0LCBsZW5ndGgpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBCdWZmZXIuYWxsb2MoMClcbiAgfVxuXG4gIGxldCBpXG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGxlbmd0aCA9IDBcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgICAgbGVuZ3RoICs9IGxpc3RbaV0ubGVuZ3RoXG4gICAgfVxuICB9XG5cbiAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgbGV0IHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICBsZXQgYnVmID0gbGlzdFtpXVxuICAgIGlmIChpc0luc3RhbmNlKGJ1ZiwgVWludDhBcnJheSkpIHtcbiAgICAgIGlmIChwb3MgKyBidWYubGVuZ3RoID4gYnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSBidWYgPSBCdWZmZXIuZnJvbShidWYpXG4gICAgICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgVWludDhBcnJheS5wcm90b3R5cGUuc2V0LmNhbGwoXG4gICAgICAgICAgYnVmZmVyLFxuICAgICAgICAgIGJ1ZixcbiAgICAgICAgICBwb3NcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICAgIH0gZWxzZSB7XG4gICAgICBidWYuY29weShidWZmZXIsIHBvcylcbiAgICB9XG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgaXNJbnN0YW5jZShzdHJpbmcsIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAnVGhlIFwic3RyaW5nXCIgYXJndW1lbnQgbXVzdCBiZSBvbmUgb2YgdHlwZSBzdHJpbmcsIEJ1ZmZlciwgb3IgQXJyYXlCdWZmZXIuICcgK1xuICAgICAgJ1JlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBzdHJpbmdcbiAgICApXG4gIH1cblxuICBjb25zdCBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGNvbnN0IG11c3RNYXRjaCA9IChhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gPT09IHRydWUpXG4gIGlmICghbXVzdE1hdGNoICYmIGxlbiA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBVc2UgYSBmb3IgbG9vcCB0byBhdm9pZCByZWN1cnNpb25cbiAgbGV0IGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGVuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkge1xuICAgICAgICAgIHJldHVybiBtdXN0TWF0Y2ggPyAtMSA6IHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIH1cbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuXG5mdW5jdGlvbiBzbG93VG9TdHJpbmcgKGVuY29kaW5nLCBzdGFydCwgZW5kKSB7XG4gIGxldCBsb3dlcmVkQ2FzZSA9IGZhbHNlXG5cbiAgLy8gTm8gbmVlZCB0byB2ZXJpZnkgdGhhdCBcInRoaXMubGVuZ3RoIDw9IE1BWF9VSU5UMzJcIiBzaW5jZSBpdCdzIGEgcmVhZC1vbmx5XG4gIC8vIHByb3BlcnR5IG9mIGEgdHlwZWQgYXJyYXkuXG5cbiAgLy8gVGhpcyBiZWhhdmVzIG5laXRoZXIgbGlrZSBTdHJpbmcgbm9yIFVpbnQ4QXJyYXkgaW4gdGhhdCB3ZSBzZXQgc3RhcnQvZW5kXG4gIC8vIHRvIHRoZWlyIHVwcGVyL2xvd2VyIGJvdW5kcyBpZiB0aGUgdmFsdWUgcGFzc2VkIGlzIG91dCBvZiByYW5nZS5cbiAgLy8gdW5kZWZpbmVkIGlzIGhhbmRsZWQgc3BlY2lhbGx5IGFzIHBlciBFQ01BLTI2MiA2dGggRWRpdGlvbixcbiAgLy8gU2VjdGlvbiAxMy4zLjMuNyBSdW50aW1lIFNlbWFudGljczogS2V5ZWRCaW5kaW5nSW5pdGlhbGl6YXRpb24uXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkIHx8IHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIC8vIFJldHVybiBlYXJseSBpZiBzdGFydCA+IHRoaXMubGVuZ3RoLiBEb25lIGhlcmUgdG8gcHJldmVudCBwb3RlbnRpYWwgdWludDMyXG4gIC8vIGNvZXJjaW9uIGZhaWwgYmVsb3cuXG4gIGlmIChzdGFydCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoZW5kID09PSB1bmRlZmluZWQgfHwgZW5kID4gdGhpcy5sZW5ndGgpIHtcbiAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKGVuZCA8PSAwKSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICAvLyBGb3JjZSBjb2VyY2lvbiB0byB1aW50MzIuIFRoaXMgd2lsbCBhbHNvIGNvZXJjZSBmYWxzZXkvTmFOIHZhbHVlcyB0byAwLlxuICBlbmQgPj4+PSAwXG4gIHN0YXJ0ID4+Pj0gMFxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgd2hpbGUgKHRydWUpIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdXRmMTZsZVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9IChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG4vLyBUaGlzIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgKGFuZCB0aGUgYGlzLWJ1ZmZlcmAgbnBtIHBhY2thZ2UpXG4vLyB0byBkZXRlY3QgYSBCdWZmZXIgaW5zdGFuY2UuIEl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBgaW5zdGFuY2VvZiBCdWZmZXJgXG4vLyByZWxpYWJseSBpbiBhIGJyb3dzZXJpZnkgY29udGV4dCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGRpZmZlcmVudFxuLy8gY29waWVzIG9mIHRoZSAnYnVmZmVyJyBwYWNrYWdlIGluIHVzZS4gVGhpcyBtZXRob2Qgd29ya3MgZXZlbiBmb3IgQnVmZmVyXG4vLyBpbnN0YW5jZXMgdGhhdCB3ZXJlIGNyZWF0ZWQgZnJvbSBhbm90aGVyIGNvcHkgb2YgdGhlIGBidWZmZXJgIHBhY2thZ2UuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2lzc3Vlcy8xNTRcbkJ1ZmZlci5wcm90b3R5cGUuX2lzQnVmZmVyID0gdHJ1ZVxuXG5mdW5jdGlvbiBzd2FwIChiLCBuLCBtKSB7XG4gIGNvbnN0IGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDQpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAzKVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyAyKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDY0ID0gZnVuY3Rpb24gc3dhcDY0ICgpIHtcbiAgY29uc3QgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIGNvbnN0IGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW5ndGggPT09IDApIHJldHVybiAnJ1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCAwLCBsZW5ndGgpXG4gIHJldHVybiBzbG93VG9TdHJpbmcuYXBwbHkodGhpcywgYXJndW1lbnRzKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvTG9jYWxlU3RyaW5nID0gQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZ1xuXG5CdWZmZXIucHJvdG90eXBlLmVxdWFscyA9IGZ1bmN0aW9uIGVxdWFscyAoYikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIGlmICh0aGlzID09PSBiKSByZXR1cm4gdHJ1ZVxuICByZXR1cm4gQnVmZmVyLmNvbXBhcmUodGhpcywgYikgPT09IDBcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbnNwZWN0ID0gZnVuY3Rpb24gaW5zcGVjdCAoKSB7XG4gIGxldCBzdHIgPSAnJ1xuICBjb25zdCBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkucmVwbGFjZSgvKC57Mn0pL2csICckMSAnKS50cmltKClcbiAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuaWYgKGN1c3RvbUluc3BlY3RTeW1ib2wpIHtcbiAgQnVmZmVyLnByb3RvdHlwZVtjdXN0b21JbnNwZWN0U3ltYm9sXSA9IEJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoaXNJbnN0YW5jZSh0YXJnZXQsIFVpbnQ4QXJyYXkpKSB7XG4gICAgdGFyZ2V0ID0gQnVmZmVyLmZyb20odGFyZ2V0LCB0YXJnZXQub2Zmc2V0LCB0YXJnZXQuYnl0ZUxlbmd0aClcbiAgfVxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICdUaGUgXCJ0YXJnZXRcIiBhcmd1bWVudCBtdXN0IGJlIG9uZSBvZiB0eXBlIEJ1ZmZlciBvciBVaW50OEFycmF5LiAnICtcbiAgICAgICdSZWNlaXZlZCB0eXBlICcgKyAodHlwZW9mIHRhcmdldClcbiAgICApXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICBsZXQgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgbGV0IHkgPSBlbmQgLSBzdGFydFxuICBjb25zdCBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIGNvbnN0IHRoaXNDb3B5ID0gdGhpcy5zbGljZSh0aGlzU3RhcnQsIHRoaXNFbmQpXG4gIGNvbnN0IHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0IC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChudW1iZXJJc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFt2YWxdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICBsZXQgaW5kZXhTaXplID0gMVxuICBsZXQgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICBsZXQgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICBsZXQgaVxuICBpZiAoZGlyKSB7XG4gICAgbGV0IGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgbGV0IGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICBjb25zdCByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICBjb25zdCBzdHJMZW4gPSBzdHJpbmcubGVuZ3RoXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgbGV0IGlcbiAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VJbnQoc3RyaW5nLnN1YnN0cihpICogMiwgMiksIDE2KVxuICAgIGlmIChudW1iZXJJc05hTihwYXJzZWQpKSByZXR1cm4gaVxuICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHBhcnNlZFxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIHV0ZjhXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjhUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGFzY2lpV3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihhc2NpaVRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoID4+PiAwXG4gICAgICBpZiAoZW5jb2RpbmcgPT09IHVuZGVmaW5lZCkgZW5jb2RpbmcgPSAndXRmOCdcbiAgICB9IGVsc2Uge1xuICAgICAgZW5jb2RpbmcgPSBsZW5ndGhcbiAgICAgIGxlbmd0aCA9IHVuZGVmaW5lZFxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgY29uc3QgcmVtYWluaW5nID0gdGhpcy5sZW5ndGggLSBvZmZzZXRcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkIHx8IGxlbmd0aCA+IHJlbWFpbmluZykgbGVuZ3RoID0gcmVtYWluaW5nXG5cbiAgaWYgKChzdHJpbmcubGVuZ3RoID4gMCAmJiAobGVuZ3RoIDwgMCB8fCBvZmZzZXQgPCAwKSkgfHwgb2Zmc2V0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byB3cml0ZSBvdXRzaWRlIGJ1ZmZlciBib3VuZHMnKVxuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICBsZXQgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICAvLyBXYXJuaW5nOiBtYXhMZW5ndGggbm90IHRha2VuIGludG8gYWNjb3VudCBpbiBiYXNlNjRXcml0ZVxuICAgICAgICByZXR1cm4gYmFzZTY0V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHVjczJXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoJycgKyBlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiB0b0pTT04gKCkge1xuICByZXR1cm4ge1xuICAgIHR5cGU6ICdCdWZmZXInLFxuICAgIGRhdGE6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2FyciB8fCB0aGlzLCAwKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKHN0YXJ0ID09PSAwICYmIGVuZCA9PT0gYnVmLmxlbmd0aCkge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYpXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1Zi5zbGljZShzdGFydCwgZW5kKSlcbiAgfVxufVxuXG5mdW5jdGlvbiB1dGY4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG4gIGNvbnN0IHJlcyA9IFtdXG5cbiAgbGV0IGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIGNvbnN0IGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIGxldCBjb2RlUG9pbnQgPSBudWxsXG4gICAgbGV0IGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRilcbiAgICAgID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERilcbiAgICAgICAgICA/IDNcbiAgICAgICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKVxuICAgICAgICAgICAgICA/IDJcbiAgICAgICAgICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICBsZXQgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG5jb25zdCBNQVhfQVJHVU1FTlRTX0xFTkdUSCA9IDB4MTAwMFxuXG5mdW5jdGlvbiBkZWNvZGVDb2RlUG9pbnRzQXJyYXkgKGNvZGVQb2ludHMpIHtcbiAgY29uc3QgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICBsZXQgcmVzID0gJydcbiAgbGV0IGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGxldCByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBsZXQgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBjb25zdCBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgbGV0IG91dCA9ICcnXG4gIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IGhleFNsaWNlTG9va3VwVGFibGVbYnVmW2ldXVxuICB9XG4gIHJldHVybiBvdXRcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgY29uc3QgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgbGV0IHJlcyA9ICcnXG4gIC8vIElmIGJ5dGVzLmxlbmd0aCBpcyBvZGQsIHRoZSBsYXN0IDggYml0cyBtdXN0IGJlIGlnbm9yZWQgKHNhbWUgYXMgbm9kZS5qcylcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGggLSAxOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIChieXRlc1tpICsgMV0gKiAyNTYpKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIGNvbnN0IGxlbiA9IHRoaXMubGVuZ3RoXG4gIHN0YXJ0ID0gfn5zdGFydFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IH5+ZW5kXG5cbiAgaWYgKHN0YXJ0IDwgMCkge1xuICAgIHN0YXJ0ICs9IGxlblxuICAgIGlmIChzdGFydCA8IDApIHN0YXJ0ID0gMFxuICB9IGVsc2UgaWYgKHN0YXJ0ID4gbGVuKSB7XG4gICAgc3RhcnQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCAwKSB7XG4gICAgZW5kICs9IGxlblxuICAgIGlmIChlbmQgPCAwKSBlbmQgPSAwXG4gIH0gZWxzZSBpZiAoZW5kID4gbGVuKSB7XG4gICAgZW5kID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgY29uc3QgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZVxuICBPYmplY3Quc2V0UHJvdG90eXBlT2YobmV3QnVmLCBCdWZmZXIucHJvdG90eXBlKVxuXG4gIHJldHVybiBuZXdCdWZcbn1cblxuLypcbiAqIE5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgYnVmZmVyIGlzbid0IHRyeWluZyB0byB3cml0ZSBvdXQgb2YgYm91bmRzLlxuICovXG5mdW5jdGlvbiBjaGVja09mZnNldCAob2Zmc2V0LCBleHQsIGxlbmd0aCkge1xuICBpZiAoKG9mZnNldCAlIDEpICE9PSAwIHx8IG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdvZmZzZXQgaXMgbm90IHVpbnQnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gbGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCcpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnRMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldF1cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludEJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnRCRSA9IGZ1bmN0aW9uIHJlYWRVSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgbGV0IHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICBsZXQgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQ4ID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQxNkxFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2QkUgPSBmdW5jdGlvbiByZWFkVUludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVaW50MzJMRSA9XG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVpbnQzMkJFID1cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdICogMHgxMDAwMDAwKSArXG4gICAgKCh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgIHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ1VJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHJlYWRCaWdVSW50NjRMRSAob2Zmc2V0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBjb25zdCBmaXJzdCA9IHRoaXNbb2Zmc2V0XVxuICBjb25zdCBsYXN0ID0gdGhpc1tvZmZzZXQgKyA3XVxuICBpZiAoZmlyc3QgPT09IHVuZGVmaW5lZCB8fCBsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICBib3VuZHNFcnJvcihvZmZzZXQsIHRoaXMubGVuZ3RoIC0gOClcbiAgfVxuXG4gIGNvbnN0IGxvID0gZmlyc3QgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAyNFxuXG4gIGNvbnN0IGhpID0gdGhpc1srK29mZnNldF0gK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIGxhc3QgKiAyICoqIDI0XG5cbiAgcmV0dXJuIEJpZ0ludChsbykgKyAoQmlnSW50KGhpKSA8PCBCaWdJbnQoMzIpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkQmlnVUludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ1VJbnQ2NEJFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgaGkgPSBmaXJzdCAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIHRoaXNbKytvZmZzZXRdXG5cbiAgY29uc3QgbG8gPSB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiAxNiArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDggK1xuICAgIGxhc3RcblxuICByZXR1cm4gKEJpZ0ludChoaSkgPDwgQmlnSW50KDMyKSkgKyBCaWdJbnQobG8pXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICBsZXQgdmFsID0gdGhpc1tvZmZzZXRdXG4gIGxldCBtdWwgPSAxXG4gIGxldCBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgbGV0IGkgPSBieXRlTGVuZ3RoXG4gIGxldCBtdWwgPSAxXG4gIGxldCB2YWwgPSB0aGlzW29mZnNldCArIC0taV1cbiAgd2hpbGUgKGkgPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1pXSAqIG11bFxuICB9XG4gIG11bCAqPSAweDgwXG5cbiAgaWYgKHZhbCA+PSBtdWwpIHZhbCAtPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aClcblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbiByZWFkSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgY29uc3QgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDI0KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgM10pXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEJpZ0ludDY0TEUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gcmVhZEJpZ0ludDY0TEUgKG9mZnNldCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgdmFsaWRhdGVOdW1iZXIob2Zmc2V0LCAnb2Zmc2V0JylcbiAgY29uc3QgZmlyc3QgPSB0aGlzW29mZnNldF1cbiAgY29uc3QgbGFzdCA9IHRoaXNbb2Zmc2V0ICsgN11cbiAgaWYgKGZpcnN0ID09PSB1bmRlZmluZWQgfHwgbGFzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYm91bmRzRXJyb3Iob2Zmc2V0LCB0aGlzLmxlbmd0aCAtIDgpXG4gIH1cblxuICBjb25zdCB2YWwgPSB0aGlzW29mZnNldCArIDRdICtcbiAgICB0aGlzW29mZnNldCArIDVdICogMiAqKiA4ICtcbiAgICB0aGlzW29mZnNldCArIDZdICogMiAqKiAxNiArXG4gICAgKGxhc3QgPDwgMjQpIC8vIE92ZXJmbG93XG5cbiAgcmV0dXJuIChCaWdJbnQodmFsKSA8PCBCaWdJbnQoMzIpKSArXG4gICAgQmlnSW50KGZpcnN0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMjQpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRCaWdJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHJlYWRCaWdJbnQ2NEJFIChvZmZzZXQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIHZhbGlkYXRlTnVtYmVyKG9mZnNldCwgJ29mZnNldCcpXG4gIGNvbnN0IGZpcnN0ID0gdGhpc1tvZmZzZXRdXG4gIGNvbnN0IGxhc3QgPSB0aGlzW29mZnNldCArIDddXG4gIGlmIChmaXJzdCA9PT0gdW5kZWZpbmVkIHx8IGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgdGhpcy5sZW5ndGggLSA4KVxuICB9XG5cbiAgY29uc3QgdmFsID0gKGZpcnN0IDw8IDI0KSArIC8vIE92ZXJmbG93XG4gICAgdGhpc1srK29mZnNldF0gKiAyICoqIDE2ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogOCArXG4gICAgdGhpc1srK29mZnNldF1cblxuICByZXR1cm4gKEJpZ0ludCh2YWwpIDw8IEJpZ0ludCgzMikpICtcbiAgICBCaWdJbnQodGhpc1srK29mZnNldF0gKiAyICoqIDI0ICtcbiAgICB0aGlzWysrb2Zmc2V0XSAqIDIgKiogMTYgK1xuICAgIHRoaXNbKytvZmZzZXRdICogMiAqKiA4ICtcbiAgICBsYXN0KVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgdHJ1ZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEZsb2F0QkUgPSBmdW5jdGlvbiByZWFkRmxvYXRCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgNTIsIDgpXG59XG5cbmZ1bmN0aW9uIGNoZWNrSW50IChidWYsIHZhbHVlLCBvZmZzZXQsIGV4dCwgbWF4LCBtaW4pIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJidWZmZXJcIiBhcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIGluc3RhbmNlJylcbiAgaWYgKHZhbHVlID4gbWF4IHx8IHZhbHVlIDwgbWluKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKVxuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50TEUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgbGV0IG11bCA9IDFcbiAgbGV0IGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnRCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY29uc3QgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICBsZXQgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIGxldCBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDggPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MTZMRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVWludDE2QkUgPVxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVpbnQzMkxFID1cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVaW50MzJCRSA9XG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyQkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiB3cnRCaWdVSW50NjRMRSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBtaW4sIG1heCkge1xuICBjaGVja0ludEJJKHZhbHVlLCBtaW4sIG1heCwgYnVmLCBvZmZzZXQsIDcpXG5cbiAgbGV0IGxvID0gTnVtYmVyKHZhbHVlICYgQmlnSW50KDB4ZmZmZmZmZmYpKVxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0KytdID0gbG9cbiAgbGV0IGhpID0gTnVtYmVyKHZhbHVlID4+IEJpZ0ludCgzMikgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCsrXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0KytdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQrK10gPSBoaVxuICByZXR1cm4gb2Zmc2V0XG59XG5cbmZ1bmN0aW9uIHdydEJpZ1VJbnQ2NEJFIChidWYsIHZhbHVlLCBvZmZzZXQsIG1pbiwgbWF4KSB7XG4gIGNoZWNrSW50QkkodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgNylcblxuICBsZXQgbG8gPSBOdW1iZXIodmFsdWUgJiBCaWdJbnQoMHhmZmZmZmZmZikpXG4gIGJ1ZltvZmZzZXQgKyA3XSA9IGxvXG4gIGxvID0gbG8gPj4gOFxuICBidWZbb2Zmc2V0ICsgNl0gPSBsb1xuICBsbyA9IGxvID4+IDhcbiAgYnVmW29mZnNldCArIDVdID0gbG9cbiAgbG8gPSBsbyA+PiA4XG4gIGJ1ZltvZmZzZXQgKyA0XSA9IGxvXG4gIGxldCBoaSA9IE51bWJlcih2YWx1ZSA+PiBCaWdJbnQoMzIpICYgQmlnSW50KDB4ZmZmZmZmZmYpKVxuICBidWZbb2Zmc2V0ICsgM10gPSBoaVxuICBoaSA9IGhpID4+IDhcbiAgYnVmW29mZnNldCArIDJdID0gaGlcbiAgaGkgPSBoaSA+PiA4XG4gIGJ1ZltvZmZzZXQgKyAxXSA9IGhpXG4gIGhpID0gaGkgPj4gOFxuICBidWZbb2Zmc2V0XSA9IGhpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdVSW50NjRMRSA9IGRlZmluZUJpZ0ludE1ldGhvZChmdW5jdGlvbiB3cml0ZUJpZ1VJbnQ2NExFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0TEUodGhpcywgdmFsdWUsIG9mZnNldCwgQmlnSW50KDApLCBCaWdJbnQoJzB4ZmZmZmZmZmZmZmZmZmZmZicpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ1VJbnQ2NEJFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnVUludDY0QkUgKHZhbHVlLCBvZmZzZXQgPSAwKSB7XG4gIHJldHVybiB3cnRCaWdVSW50NjRCRSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBCaWdJbnQoMCksIEJpZ0ludCgnMHhmZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50TEUgPSBmdW5jdGlvbiB3cml0ZUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIGxldCBpID0gMFxuICBsZXQgbXVsID0gMVxuICBsZXQgc3ViID0gMFxuICB0aGlzW29mZnNldF0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgLSAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50QkUgPSBmdW5jdGlvbiB3cml0ZUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5wb3coMiwgKDggKiBieXRlTGVuZ3RoKSAtIDEpXG5cbiAgICBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBsaW1pdCAtIDEsIC1saW1pdClcbiAgfVxuXG4gIGxldCBpID0gYnl0ZUxlbmd0aCAtIDFcbiAgbGV0IG11bCA9IDFcbiAgbGV0IHN1YiA9IDBcbiAgdGhpc1tvZmZzZXQgKyBpXSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoLS1pID49IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICBpZiAodmFsdWUgPCAwICYmIHN1YiA9PT0gMCAmJiB0aGlzW29mZnNldCArIGkgKyAxXSAhPT0gMCkge1xuICAgICAgc3ViID0gMVxuICAgIH1cbiAgICB0aGlzW29mZnNldCArIGldID0gKCh2YWx1ZSAvIG11bCkgPj4gMCkgLSBzdWIgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50OCA9IGZ1bmN0aW9uIHdyaXRlSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmYgKyB2YWx1ZSArIDFcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2TEUgPSBmdW5jdGlvbiB3cml0ZUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0ID4+PiAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVCaWdJbnQ2NExFID0gZGVmaW5lQmlnSW50TWV0aG9kKGZ1bmN0aW9uIHdyaXRlQmlnSW50NjRMRSAodmFsdWUsIG9mZnNldCA9IDApIHtcbiAgcmV0dXJuIHdydEJpZ1VJbnQ2NExFKHRoaXMsIHZhbHVlLCBvZmZzZXQsIC1CaWdJbnQoJzB4ODAwMDAwMDAwMDAwMDAwMCcpLCBCaWdJbnQoJzB4N2ZmZmZmZmZmZmZmZmZmZicpKVxufSlcblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUJpZ0ludDY0QkUgPSBkZWZpbmVCaWdJbnRNZXRob2QoZnVuY3Rpb24gd3JpdGVCaWdJbnQ2NEJFICh2YWx1ZSwgb2Zmc2V0ID0gMCkge1xuICByZXR1cm4gd3J0QmlnVUludDY0QkUodGhpcywgdmFsdWUsIG9mZnNldCwgLUJpZ0ludCgnMHg4MDAwMDAwMDAwMDAwMDAwJyksIEJpZ0ludCgnMHg3ZmZmZmZmZmZmZmZmZmZmJykpXG59KVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCA+Pj4gMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tJRUVFNzU0KGJ1ZiwgdmFsdWUsIG9mZnNldCwgNCwgMy40MDI4MjM0NjYzODUyODg2ZSszOCwgLTMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgMjMsIDQpXG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdExFID0gZnVuY3Rpb24gd3JpdGVGbG9hdExFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0QkUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3VibGUgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgPj4+IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdhcmd1bWVudCBzaG91bGQgYmUgYSBCdWZmZXInKVxuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKGVuZCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcycpXG5cbiAgLy8gQXJlIHdlIG9vYj9cbiAgaWYgKGVuZCA+IHRoaXMubGVuZ3RoKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0IDwgZW5kIC0gc3RhcnQpIHtcbiAgICBlbmQgPSB0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgKyBzdGFydFxuICB9XG5cbiAgY29uc3QgbGVuID0gZW5kIC0gc3RhcnRcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluID09PSAnZnVuY3Rpb24nKSB7XG4gICAgLy8gVXNlIGJ1aWx0LWluIHdoZW4gYXZhaWxhYmxlLCBtaXNzaW5nIGZyb20gSUUxMVxuICAgIHRoaXMuY29weVdpdGhpbih0YXJnZXRTdGFydCwgc3RhcnQsIGVuZClcbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZCksXG4gICAgICB0YXJnZXRTdGFydFxuICAgIClcbiAgfVxuXG4gIHJldHVybiBsZW5cbn1cblxuLy8gVXNhZ2U6XG4vLyAgICBidWZmZXIuZmlsbChudW1iZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKGJ1ZmZlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoc3RyaW5nWywgb2Zmc2V0WywgZW5kXV1bLCBlbmNvZGluZ10pXG5CdWZmZXIucHJvdG90eXBlLmZpbGwgPSBmdW5jdGlvbiBmaWxsICh2YWwsIHN0YXJ0LCBlbmQsIGVuY29kaW5nKSB7XG4gIC8vIEhhbmRsZSBzdHJpbmcgY2FzZXM6XG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IHN0YXJ0XG4gICAgICBzdGFydCA9IDBcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZW5kID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBlbmRcbiAgICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gICAgfVxuICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ2VuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcnKVxuICAgIH1cbiAgICBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiAhQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgfVxuICAgIGlmICh2YWwubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmICgoZW5jb2RpbmcgPT09ICd1dGY4JyAmJiBjb2RlIDwgMTI4KSB8fFxuICAgICAgICAgIGVuY29kaW5nID09PSAnbGF0aW4xJykge1xuICAgICAgICAvLyBGYXN0IHBhdGg6IElmIGB2YWxgIGZpdHMgaW50byBhIHNpbmdsZSBieXRlLCB1c2UgdGhhdCBudW1lcmljIHZhbHVlLlxuICAgICAgICB2YWwgPSBjb2RlXG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMjU1XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgdmFsID0gTnVtYmVyKHZhbClcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICBsZXQgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gICAgY29uc3QgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIHZhbHVlIFwiJyArIHZhbCArXG4gICAgICAgICdcIiBpcyBpbnZhbGlkIGZvciBhcmd1bWVudCBcInZhbHVlXCInKVxuICAgIH1cbiAgICBmb3IgKGkgPSAwOyBpIDwgZW5kIC0gc3RhcnQ7ICsraSkge1xuICAgICAgdGhpc1tpICsgc3RhcnRdID0gYnl0ZXNbaSAlIGxlbl1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGhpc1xufVxuXG4vLyBDVVNUT00gRVJST1JTXG4vLyA9PT09PT09PT09PT09XG5cbi8vIFNpbXBsaWZpZWQgdmVyc2lvbnMgZnJvbSBOb2RlLCBjaGFuZ2VkIGZvciBCdWZmZXItb25seSB1c2FnZVxuY29uc3QgZXJyb3JzID0ge31cbmZ1bmN0aW9uIEUgKHN5bSwgZ2V0TWVzc2FnZSwgQmFzZSkge1xuICBlcnJvcnNbc3ltXSA9IGNsYXNzIE5vZGVFcnJvciBleHRlbmRzIEJhc2Uge1xuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgIHN1cGVyKClcblxuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdtZXNzYWdlJywge1xuICAgICAgICB2YWx1ZTogZ2V0TWVzc2FnZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9KVxuXG4gICAgICAvLyBBZGQgdGhlIGVycm9yIGNvZGUgdG8gdGhlIG5hbWUgdG8gaW5jbHVkZSBpdCBpbiB0aGUgc3RhY2sgdHJhY2UuXG4gICAgICB0aGlzLm5hbWUgPSBgJHt0aGlzLm5hbWV9IFske3N5bX1dYFxuICAgICAgLy8gQWNjZXNzIHRoZSBzdGFjayB0byBnZW5lcmF0ZSB0aGUgZXJyb3IgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIGVycm9yIGNvZGVcbiAgICAgIC8vIGZyb20gdGhlIG5hbWUuXG4gICAgICB0aGlzLnN0YWNrIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAvLyBSZXNldCB0aGUgbmFtZSB0byB0aGUgYWN0dWFsIG5hbWUuXG4gICAgICBkZWxldGUgdGhpcy5uYW1lXG4gICAgfVxuXG4gICAgZ2V0IGNvZGUgKCkge1xuICAgICAgcmV0dXJuIHN5bVxuICAgIH1cblxuICAgIHNldCBjb2RlICh2YWx1ZSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdjb2RlJywge1xuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0b1N0cmluZyAoKSB7XG4gICAgICByZXR1cm4gYCR7dGhpcy5uYW1lfSBbJHtzeW19XTogJHt0aGlzLm1lc3NhZ2V9YFxuICAgIH1cbiAgfVxufVxuXG5FKCdFUlJfQlVGRkVSX09VVF9PRl9CT1VORFMnLFxuICBmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChuYW1lKSB7XG4gICAgICByZXR1cm4gYCR7bmFtZX0gaXMgb3V0c2lkZSBvZiBidWZmZXIgYm91bmRzYFxuICAgIH1cblxuICAgIHJldHVybiAnQXR0ZW1wdCB0byBhY2Nlc3MgbWVtb3J5IG91dHNpZGUgYnVmZmVyIGJvdW5kcydcbiAgfSwgUmFuZ2VFcnJvcilcbkUoJ0VSUl9JTlZBTElEX0FSR19UWVBFJyxcbiAgZnVuY3Rpb24gKG5hbWUsIGFjdHVhbCkge1xuICAgIHJldHVybiBgVGhlIFwiJHtuYW1lfVwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBudW1iZXIuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2YgYWN0dWFsfWBcbiAgfSwgVHlwZUVycm9yKVxuRSgnRVJSX09VVF9PRl9SQU5HRScsXG4gIGZ1bmN0aW9uIChzdHIsIHJhbmdlLCBpbnB1dCkge1xuICAgIGxldCBtc2cgPSBgVGhlIHZhbHVlIG9mIFwiJHtzdHJ9XCIgaXMgb3V0IG9mIHJhbmdlLmBcbiAgICBsZXQgcmVjZWl2ZWQgPSBpbnB1dFxuICAgIGlmIChOdW1iZXIuaXNJbnRlZ2VyKGlucHV0KSAmJiBNYXRoLmFicyhpbnB1dCkgPiAyICoqIDMyKSB7XG4gICAgICByZWNlaXZlZCA9IGFkZE51bWVyaWNhbFNlcGFyYXRvcihTdHJpbmcoaW5wdXQpKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGlucHV0ID09PSAnYmlnaW50Jykge1xuICAgICAgcmVjZWl2ZWQgPSBTdHJpbmcoaW5wdXQpXG4gICAgICBpZiAoaW5wdXQgPiBCaWdJbnQoMikgKiogQmlnSW50KDMyKSB8fCBpbnB1dCA8IC0oQmlnSW50KDIpICoqIEJpZ0ludCgzMikpKSB7XG4gICAgICAgIHJlY2VpdmVkID0gYWRkTnVtZXJpY2FsU2VwYXJhdG9yKHJlY2VpdmVkKVxuICAgICAgfVxuICAgICAgcmVjZWl2ZWQgKz0gJ24nXG4gICAgfVxuICAgIG1zZyArPSBgIEl0IG11c3QgYmUgJHtyYW5nZX0uIFJlY2VpdmVkICR7cmVjZWl2ZWR9YFxuICAgIHJldHVybiBtc2dcbiAgfSwgUmFuZ2VFcnJvcilcblxuZnVuY3Rpb24gYWRkTnVtZXJpY2FsU2VwYXJhdG9yICh2YWwpIHtcbiAgbGV0IHJlcyA9ICcnXG4gIGxldCBpID0gdmFsLmxlbmd0aFxuICBjb25zdCBzdGFydCA9IHZhbFswXSA9PT0gJy0nID8gMSA6IDBcbiAgZm9yICg7IGkgPj0gc3RhcnQgKyA0OyBpIC09IDMpIHtcbiAgICByZXMgPSBgXyR7dmFsLnNsaWNlKGkgLSAzLCBpKX0ke3Jlc31gXG4gIH1cbiAgcmV0dXJuIGAke3ZhbC5zbGljZSgwLCBpKX0ke3Jlc31gXG59XG5cbi8vIENIRUNLIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09XG5cbmZ1bmN0aW9uIGNoZWNrQm91bmRzIChidWYsIG9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICB2YWxpZGF0ZU51bWJlcihvZmZzZXQsICdvZmZzZXQnKVxuICBpZiAoYnVmW29mZnNldF0gPT09IHVuZGVmaW5lZCB8fCBidWZbb2Zmc2V0ICsgYnl0ZUxlbmd0aF0gPT09IHVuZGVmaW5lZCkge1xuICAgIGJvdW5kc0Vycm9yKG9mZnNldCwgYnVmLmxlbmd0aCAtIChieXRlTGVuZ3RoICsgMSkpXG4gIH1cbn1cblxuZnVuY3Rpb24gY2hlY2tJbnRCSSAodmFsdWUsIG1pbiwgbWF4LCBidWYsIG9mZnNldCwgYnl0ZUxlbmd0aCkge1xuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHtcbiAgICBjb25zdCBuID0gdHlwZW9mIG1pbiA9PT0gJ2JpZ2ludCcgPyAnbicgOiAnJ1xuICAgIGxldCByYW5nZVxuICAgIGlmIChieXRlTGVuZ3RoID4gMykge1xuICAgICAgaWYgKG1pbiA9PT0gMCB8fCBtaW4gPT09IEJpZ0ludCgwKSkge1xuICAgICAgICByYW5nZSA9IGA+PSAwJHtufSBhbmQgPCAyJHtufSAqKiAkeyhieXRlTGVuZ3RoICsgMSkgKiA4fSR7bn1gXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByYW5nZSA9IGA+PSAtKDIke259ICoqICR7KGJ5dGVMZW5ndGggKyAxKSAqIDggLSAxfSR7bn0pIGFuZCA8IDIgKiogYCArXG4gICAgICAgICAgICAgICAgYCR7KGJ5dGVMZW5ndGggKyAxKSAqIDggLSAxfSR7bn1gXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJhbmdlID0gYD49ICR7bWlufSR7bn0gYW5kIDw9ICR7bWF4fSR7bn1gXG4gICAgfVxuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX09VVF9PRl9SQU5HRSgndmFsdWUnLCByYW5nZSwgdmFsdWUpXG4gIH1cbiAgY2hlY2tCb3VuZHMoYnVmLCBvZmZzZXQsIGJ5dGVMZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTnVtYmVyICh2YWx1ZSwgbmFtZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBlcnJvcnMuRVJSX0lOVkFMSURfQVJHX1RZUEUobmFtZSwgJ251bWJlcicsIHZhbHVlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGJvdW5kc0Vycm9yICh2YWx1ZSwgbGVuZ3RoLCB0eXBlKSB7XG4gIGlmIChNYXRoLmZsb29yKHZhbHVlKSAhPT0gdmFsdWUpIHtcbiAgICB2YWxpZGF0ZU51bWJlcih2YWx1ZSwgdHlwZSlcbiAgICB0aHJvdyBuZXcgZXJyb3JzLkVSUl9PVVRfT0ZfUkFOR0UodHlwZSB8fCAnb2Zmc2V0JywgJ2FuIGludGVnZXInLCB2YWx1ZSlcbiAgfVxuXG4gIGlmIChsZW5ndGggPCAwKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5FUlJfQlVGRkVSX09VVF9PRl9CT1VORFMoKVxuICB9XG5cbiAgdGhyb3cgbmV3IGVycm9ycy5FUlJfT1VUX09GX1JBTkdFKHR5cGUgfHwgJ29mZnNldCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPj0gJHt0eXBlID8gMSA6IDB9IGFuZCA8PSAke2xlbmd0aH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxuY29uc3QgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSB0YWtlcyBlcXVhbCBzaWducyBhcyBlbmQgb2YgdGhlIEJhc2U2NCBlbmNvZGluZ1xuICBzdHIgPSBzdHIuc3BsaXQoJz0nKVswXVxuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyLnRyaW0oKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiB1dGY4VG9CeXRlcyAoc3RyaW5nLCB1bml0cykge1xuICB1bml0cyA9IHVuaXRzIHx8IEluZmluaXR5XG4gIGxldCBjb2RlUG9pbnRcbiAgY29uc3QgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICBsZXQgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgY29uc3QgYnl0ZXMgPSBbXVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICBjb25zdCBieXRlQXJyYXkgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIC8vIE5vZGUncyBjb2RlIHNlZW1zIHRvIGJlIGRvaW5nIHRoaXMgYW5kIG5vdCAmIDB4N0YuLlxuICAgIGJ5dGVBcnJheS5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpICYgMHhGRilcbiAgfVxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVUb0J5dGVzIChzdHIsIHVuaXRzKSB7XG4gIGxldCBjLCBoaSwgbG9cbiAgY29uc3QgYnl0ZUFycmF5ID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBsZXQgaVxuICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuLy8gQXJyYXlCdWZmZXIgb3IgVWludDhBcnJheSBvYmplY3RzIGZyb20gb3RoZXIgY29udGV4dHMgKGkuZS4gaWZyYW1lcykgZG8gbm90IHBhc3Ncbi8vIHRoZSBgaW5zdGFuY2VvZmAgY2hlY2sgYnV0IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgb2YgdGhhdCB0eXBlLlxuLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZmVyb3NzL2J1ZmZlci9pc3N1ZXMvMTY2XG5mdW5jdGlvbiBpc0luc3RhbmNlIChvYmosIHR5cGUpIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIHR5cGUgfHxcbiAgICAob2JqICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yICE9IG51bGwgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWUgIT0gbnVsbCAmJlxuICAgICAgb2JqLmNvbnN0cnVjdG9yLm5hbWUgPT09IHR5cGUubmFtZSlcbn1cbmZ1bmN0aW9uIG51bWJlcklzTmFOIChvYmopIHtcbiAgLy8gRm9yIElFMTEgc3VwcG9ydFxuICByZXR1cm4gb2JqICE9PSBvYmogLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cblxuLy8gQ3JlYXRlIGxvb2t1cCB0YWJsZSBmb3IgYHRvU3RyaW5nKCdoZXgnKWBcbi8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvaXNzdWVzLzIxOVxuY29uc3QgaGV4U2xpY2VMb29rdXBUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGFscGhhYmV0ID0gJzAxMjM0NTY3ODlhYmNkZWYnXG4gIGNvbnN0IHRhYmxlID0gbmV3IEFycmF5KDI1NilcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgY29uc3QgaTE2ID0gaSAqIDE2XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICB0YWJsZVtpMTYgKyBqXSA9IGFscGhhYmV0W2ldICsgYWxwaGFiZXRbal1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhYmxlXG59KSgpXG5cbi8vIFJldHVybiBub3QgZnVuY3Rpb24gd2l0aCBFcnJvciBpZiBCaWdJbnQgbm90IHN1cHBvcnRlZFxuZnVuY3Rpb24gZGVmaW5lQmlnSW50TWV0aG9kIChmbikge1xuICByZXR1cm4gdHlwZW9mIEJpZ0ludCA9PT0gJ3VuZGVmaW5lZCcgPyBCdWZmZXJCaWdJbnROb3REZWZpbmVkIDogZm5cbn1cblxuZnVuY3Rpb24gQnVmZmVyQmlnSW50Tm90RGVmaW5lZCAoKSB7XG4gIHRocm93IG5ldyBFcnJvcignQmlnSW50IG5vdCBzdXBwb3J0ZWQnKVxufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/buffer/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs":
/*!*****************************************!*\
  !*** ./node_modules/clsx/dist/clsx.mjs ***!
  \*****************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   clsx: () => (/* binding */ clsx),\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\nfunction r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (clsx);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9jbHN4L2Rpc3QvY2xzeC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxjQUFjLGFBQWEsK0NBQStDLGdEQUFnRCxlQUFlLFFBQVEsSUFBSSwwQ0FBMEMseUNBQXlDLFNBQWdCLGdCQUFnQix3Q0FBd0MsSUFBSSxtREFBbUQsU0FBUyxpRUFBZSxJQUFJIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2Nsc3gvZGlzdC9jbHN4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJmdW5jdGlvbiByKGUpe3ZhciB0LGYsbj1cIlwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZSluKz1lO2Vsc2UgaWYoXCJvYmplY3RcIj09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSl7dmFyIG89ZS5sZW5ndGg7Zm9yKHQ9MDt0PG87dCsrKWVbdF0mJihmPXIoZVt0XSkpJiYobiYmKG4rPVwiIFwiKSxuKz1mKX1lbHNlIGZvcihmIGluIGUpZVtmXSYmKG4mJihuKz1cIiBcIiksbis9Zik7cmV0dXJuIG59ZXhwb3J0IGZ1bmN0aW9uIGNsc3goKXtmb3IodmFyIGUsdCxmPTAsbj1cIlwiLG89YXJndW1lbnRzLmxlbmd0aDtmPG87ZisrKShlPWFyZ3VtZW50c1tmXSkmJih0PXIoZSkpJiYobiYmKG4rPVwiIFwiKSxuKz10KTtyZXR1cm4gbn1leHBvcnQgZGVmYXVsdCBjbHN4OyJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/clsx/dist/clsx.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/comlink/dist/esm/comlink.mjs":
/*!***************************************************!*\
  !*** ./node_modules/comlink/dist/esm/comlink.mjs ***!
  \***************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   createEndpoint: () => (/* binding */ createEndpoint),\n/* harmony export */   expose: () => (/* binding */ expose),\n/* harmony export */   finalizer: () => (/* binding */ finalizer),\n/* harmony export */   proxy: () => (/* binding */ proxy),\n/* harmony export */   proxyMarker: () => (/* binding */ proxyMarker),\n/* harmony export */   releaseProxy: () => (/* binding */ releaseProxy),\n/* harmony export */   transfer: () => (/* binding */ transfer),\n/* harmony export */   transferHandlers: () => (/* binding */ transferHandlers),\n/* harmony export */   windowEndpoint: () => (/* binding */ windowEndpoint),\n/* harmony export */   wrap: () => (/* binding */ wrap)\n/* harmony export */ });\n/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: Apache-2.0\n */\nconst proxyMarker = Symbol(\"Comlink.proxy\");\nconst createEndpoint = Symbol(\"Comlink.endpoint\");\nconst releaseProxy = Symbol(\"Comlink.releaseProxy\");\nconst finalizer = Symbol(\"Comlink.finalizer\");\nconst throwMarker = Symbol(\"Comlink.thrown\");\nconst isObject = (val) => (typeof val === \"object\" && val !== null) || typeof val === \"function\";\n/**\n * Internal transfer handle to handle objects marked to proxy.\n */\nconst proxyTransferHandler = {\n    canHandle: (val) => isObject(val) && val[proxyMarker],\n    serialize(obj) {\n        const { port1, port2 } = new MessageChannel();\n        expose(obj, port1);\n        return [port2, [port2]];\n    },\n    deserialize(port) {\n        port.start();\n        return wrap(port);\n    },\n};\n/**\n * Internal transfer handler to handle thrown exceptions.\n */\nconst throwTransferHandler = {\n    canHandle: (value) => isObject(value) && throwMarker in value,\n    serialize({ value }) {\n        let serialized;\n        if (value instanceof Error) {\n            serialized = {\n                isError: true,\n                value: {\n                    message: value.message,\n                    name: value.name,\n                    stack: value.stack,\n                },\n            };\n        }\n        else {\n            serialized = { isError: false, value };\n        }\n        return [serialized, []];\n    },\n    deserialize(serialized) {\n        if (serialized.isError) {\n            throw Object.assign(new Error(serialized.value.message), serialized.value);\n        }\n        throw serialized.value;\n    },\n};\n/**\n * Allows customizing the serialization of certain values.\n */\nconst transferHandlers = new Map([\n    [\"proxy\", proxyTransferHandler],\n    [\"throw\", throwTransferHandler],\n]);\nfunction isAllowedOrigin(allowedOrigins, origin) {\n    for (const allowedOrigin of allowedOrigins) {\n        if (origin === allowedOrigin || allowedOrigin === \"*\") {\n            return true;\n        }\n        if (allowedOrigin instanceof RegExp && allowedOrigin.test(origin)) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction expose(obj, ep = globalThis, allowedOrigins = [\"*\"]) {\n    ep.addEventListener(\"message\", function callback(ev) {\n        if (!ev || !ev.data) {\n            return;\n        }\n        if (!isAllowedOrigin(allowedOrigins, ev.origin)) {\n            console.warn(`Invalid origin '${ev.origin}' for comlink proxy`);\n            return;\n        }\n        const { id, type, path } = Object.assign({ path: [] }, ev.data);\n        const argumentList = (ev.data.argumentList || []).map(fromWireValue);\n        let returnValue;\n        try {\n            const parent = path.slice(0, -1).reduce((obj, prop) => obj[prop], obj);\n            const rawValue = path.reduce((obj, prop) => obj[prop], obj);\n            switch (type) {\n                case \"GET\" /* MessageType.GET */:\n                    {\n                        returnValue = rawValue;\n                    }\n                    break;\n                case \"SET\" /* MessageType.SET */:\n                    {\n                        parent[path.slice(-1)[0]] = fromWireValue(ev.data.value);\n                        returnValue = true;\n                    }\n                    break;\n                case \"APPLY\" /* MessageType.APPLY */:\n                    {\n                        returnValue = rawValue.apply(parent, argumentList);\n                    }\n                    break;\n                case \"CONSTRUCT\" /* MessageType.CONSTRUCT */:\n                    {\n                        const value = new rawValue(...argumentList);\n                        returnValue = proxy(value);\n                    }\n                    break;\n                case \"ENDPOINT\" /* MessageType.ENDPOINT */:\n                    {\n                        const { port1, port2 } = new MessageChannel();\n                        expose(obj, port2);\n                        returnValue = transfer(port1, [port1]);\n                    }\n                    break;\n                case \"RELEASE\" /* MessageType.RELEASE */:\n                    {\n                        returnValue = undefined;\n                    }\n                    break;\n                default:\n                    return;\n            }\n        }\n        catch (value) {\n            returnValue = { value, [throwMarker]: 0 };\n        }\n        Promise.resolve(returnValue)\n            .catch((value) => {\n            return { value, [throwMarker]: 0 };\n        })\n            .then((returnValue) => {\n            const [wireValue, transferables] = toWireValue(returnValue);\n            ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n            if (type === \"RELEASE\" /* MessageType.RELEASE */) {\n                // detach and deactive after sending release response above.\n                ep.removeEventListener(\"message\", callback);\n                closeEndPoint(ep);\n                if (finalizer in obj && typeof obj[finalizer] === \"function\") {\n                    obj[finalizer]();\n                }\n            }\n        })\n            .catch((error) => {\n            // Send Serialization Error To Caller\n            const [wireValue, transferables] = toWireValue({\n                value: new TypeError(\"Unserializable return value\"),\n                [throwMarker]: 0,\n            });\n            ep.postMessage(Object.assign(Object.assign({}, wireValue), { id }), transferables);\n        });\n    });\n    if (ep.start) {\n        ep.start();\n    }\n}\nfunction isMessagePort(endpoint) {\n    return endpoint.constructor.name === \"MessagePort\";\n}\nfunction closeEndPoint(endpoint) {\n    if (isMessagePort(endpoint))\n        endpoint.close();\n}\nfunction wrap(ep, target) {\n    const pendingListeners = new Map();\n    ep.addEventListener(\"message\", function handleMessage(ev) {\n        const { data } = ev;\n        if (!data || !data.id) {\n            return;\n        }\n        const resolver = pendingListeners.get(data.id);\n        if (!resolver) {\n            return;\n        }\n        try {\n            resolver(data);\n        }\n        finally {\n            pendingListeners.delete(data.id);\n        }\n    });\n    return createProxy(ep, pendingListeners, [], target);\n}\nfunction throwIfProxyReleased(isReleased) {\n    if (isReleased) {\n        throw new Error(\"Proxy has been released and is not useable\");\n    }\n}\nfunction releaseEndpoint(ep) {\n    return requestResponseMessage(ep, new Map(), {\n        type: \"RELEASE\" /* MessageType.RELEASE */,\n    }).then(() => {\n        closeEndPoint(ep);\n    });\n}\nconst proxyCounter = new WeakMap();\nconst proxyFinalizers = \"FinalizationRegistry\" in globalThis &&\n    new FinalizationRegistry((ep) => {\n        const newCount = (proxyCounter.get(ep) || 0) - 1;\n        proxyCounter.set(ep, newCount);\n        if (newCount === 0) {\n            releaseEndpoint(ep);\n        }\n    });\nfunction registerProxy(proxy, ep) {\n    const newCount = (proxyCounter.get(ep) || 0) + 1;\n    proxyCounter.set(ep, newCount);\n    if (proxyFinalizers) {\n        proxyFinalizers.register(proxy, ep, proxy);\n    }\n}\nfunction unregisterProxy(proxy) {\n    if (proxyFinalizers) {\n        proxyFinalizers.unregister(proxy);\n    }\n}\nfunction createProxy(ep, pendingListeners, path = [], target = function () { }) {\n    let isProxyReleased = false;\n    const proxy = new Proxy(target, {\n        get(_target, prop) {\n            throwIfProxyReleased(isProxyReleased);\n            if (prop === releaseProxy) {\n                return () => {\n                    unregisterProxy(proxy);\n                    releaseEndpoint(ep);\n                    pendingListeners.clear();\n                    isProxyReleased = true;\n                };\n            }\n            if (prop === \"then\") {\n                if (path.length === 0) {\n                    return { then: () => proxy };\n                }\n                const r = requestResponseMessage(ep, pendingListeners, {\n                    type: \"GET\" /* MessageType.GET */,\n                    path: path.map((p) => p.toString()),\n                }).then(fromWireValue);\n                return r.then.bind(r);\n            }\n            return createProxy(ep, pendingListeners, [...path, prop]);\n        },\n        set(_target, prop, rawValue) {\n            throwIfProxyReleased(isProxyReleased);\n            // FIXME: ES6 Proxy Handler `set` methods are supposed to return a\n            // boolean. To show good will, we return true asynchronously ¯\\_(ツ)_/¯\n            const [value, transferables] = toWireValue(rawValue);\n            return requestResponseMessage(ep, pendingListeners, {\n                type: \"SET\" /* MessageType.SET */,\n                path: [...path, prop].map((p) => p.toString()),\n                value,\n            }, transferables).then(fromWireValue);\n        },\n        apply(_target, _thisArg, rawArgumentList) {\n            throwIfProxyReleased(isProxyReleased);\n            const last = path[path.length - 1];\n            if (last === createEndpoint) {\n                return requestResponseMessage(ep, pendingListeners, {\n                    type: \"ENDPOINT\" /* MessageType.ENDPOINT */,\n                }).then(fromWireValue);\n            }\n            // We just pretend that `bind()` didn’t happen.\n            if (last === \"bind\") {\n                return createProxy(ep, pendingListeners, path.slice(0, -1));\n            }\n            const [argumentList, transferables] = processArguments(rawArgumentList);\n            return requestResponseMessage(ep, pendingListeners, {\n                type: \"APPLY\" /* MessageType.APPLY */,\n                path: path.map((p) => p.toString()),\n                argumentList,\n            }, transferables).then(fromWireValue);\n        },\n        construct(_target, rawArgumentList) {\n            throwIfProxyReleased(isProxyReleased);\n            const [argumentList, transferables] = processArguments(rawArgumentList);\n            return requestResponseMessage(ep, pendingListeners, {\n                type: \"CONSTRUCT\" /* MessageType.CONSTRUCT */,\n                path: path.map((p) => p.toString()),\n                argumentList,\n            }, transferables).then(fromWireValue);\n        },\n    });\n    registerProxy(proxy, ep);\n    return proxy;\n}\nfunction myFlat(arr) {\n    return Array.prototype.concat.apply([], arr);\n}\nfunction processArguments(argumentList) {\n    const processed = argumentList.map(toWireValue);\n    return [processed.map((v) => v[0]), myFlat(processed.map((v) => v[1]))];\n}\nconst transferCache = new WeakMap();\nfunction transfer(obj, transfers) {\n    transferCache.set(obj, transfers);\n    return obj;\n}\nfunction proxy(obj) {\n    return Object.assign(obj, { [proxyMarker]: true });\n}\nfunction windowEndpoint(w, context = globalThis, targetOrigin = \"*\") {\n    return {\n        postMessage: (msg, transferables) => w.postMessage(msg, targetOrigin, transferables),\n        addEventListener: context.addEventListener.bind(context),\n        removeEventListener: context.removeEventListener.bind(context),\n    };\n}\nfunction toWireValue(value) {\n    for (const [name, handler] of transferHandlers) {\n        if (handler.canHandle(value)) {\n            const [serializedValue, transferables] = handler.serialize(value);\n            return [\n                {\n                    type: \"HANDLER\" /* WireValueType.HANDLER */,\n                    name,\n                    value: serializedValue,\n                },\n                transferables,\n            ];\n        }\n    }\n    return [\n        {\n            type: \"RAW\" /* WireValueType.RAW */,\n            value,\n        },\n        transferCache.get(value) || [],\n    ];\n}\nfunction fromWireValue(value) {\n    switch (value.type) {\n        case \"HANDLER\" /* WireValueType.HANDLER */:\n            return transferHandlers.get(value.name).deserialize(value.value);\n        case \"RAW\" /* WireValueType.RAW */:\n            return value.value;\n    }\n}\nfunction requestResponseMessage(ep, pendingListeners, msg, transfers) {\n    return new Promise((resolve) => {\n        const id = generateUUID();\n        pendingListeners.set(id, resolve);\n        if (ep.start) {\n            ep.start();\n        }\n        ep.postMessage(Object.assign({ id }, msg), transfers);\n    });\n}\nfunction generateUUID() {\n    return new Array(4)\n        .fill(0)\n        .map(() => Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString(16))\n        .join(\"-\");\n}\n\n\n//# sourceMappingURL=comlink.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9jb21saW5rL2Rpc3QvZXNtL2NvbWxpbmsubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGVBQWU7QUFDL0I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ0E7QUFDQSwyQkFBMkI7QUFDM0I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNENBQTRDLFVBQVU7QUFDdEQ7QUFDQTtBQUNBLGdCQUFnQixpQkFBaUIsa0JBQWtCLFVBQVU7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGVBQWU7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1QjtBQUNBO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsU0FBUztBQUNUO0FBQ0E7QUFDQSx5REFBeUQsZ0JBQWdCLElBQUk7QUFDN0U7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLHlEQUF5RCxnQkFBZ0IsSUFBSTtBQUM3RSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEVBQThFO0FBQzlFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLHFCQUFxQjtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLElBQUk7QUFDM0MsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVpSTtBQUNqSSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9jb21saW5rL2Rpc3QvZXNtL2NvbWxpbmsubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTENcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG4gKi9cbmNvbnN0IHByb3h5TWFya2VyID0gU3ltYm9sKFwiQ29tbGluay5wcm94eVwiKTtcbmNvbnN0IGNyZWF0ZUVuZHBvaW50ID0gU3ltYm9sKFwiQ29tbGluay5lbmRwb2ludFwiKTtcbmNvbnN0IHJlbGVhc2VQcm94eSA9IFN5bWJvbChcIkNvbWxpbmsucmVsZWFzZVByb3h5XCIpO1xuY29uc3QgZmluYWxpemVyID0gU3ltYm9sKFwiQ29tbGluay5maW5hbGl6ZXJcIik7XG5jb25zdCB0aHJvd01hcmtlciA9IFN5bWJvbChcIkNvbWxpbmsudGhyb3duXCIpO1xuY29uc3QgaXNPYmplY3QgPSAodmFsKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIiAmJiB2YWwgIT09IG51bGwpIHx8IHR5cGVvZiB2YWwgPT09IFwiZnVuY3Rpb25cIjtcbi8qKlxuICogSW50ZXJuYWwgdHJhbnNmZXIgaGFuZGxlIHRvIGhhbmRsZSBvYmplY3RzIG1hcmtlZCB0byBwcm94eS5cbiAqL1xuY29uc3QgcHJveHlUcmFuc2ZlckhhbmRsZXIgPSB7XG4gICAgY2FuSGFuZGxlOiAodmFsKSA9PiBpc09iamVjdCh2YWwpICYmIHZhbFtwcm94eU1hcmtlcl0sXG4gICAgc2VyaWFsaXplKG9iaikge1xuICAgICAgICBjb25zdCB7IHBvcnQxLCBwb3J0MiB9ID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4gICAgICAgIGV4cG9zZShvYmosIHBvcnQxKTtcbiAgICAgICAgcmV0dXJuIFtwb3J0MiwgW3BvcnQyXV07XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShwb3J0KSB7XG4gICAgICAgIHBvcnQuc3RhcnQoKTtcbiAgICAgICAgcmV0dXJuIHdyYXAocG9ydCk7XG4gICAgfSxcbn07XG4vKipcbiAqIEludGVybmFsIHRyYW5zZmVyIGhhbmRsZXIgdG8gaGFuZGxlIHRocm93biBleGNlcHRpb25zLlxuICovXG5jb25zdCB0aHJvd1RyYW5zZmVySGFuZGxlciA9IHtcbiAgICBjYW5IYW5kbGU6ICh2YWx1ZSkgPT4gaXNPYmplY3QodmFsdWUpICYmIHRocm93TWFya2VyIGluIHZhbHVlLFxuICAgIHNlcmlhbGl6ZSh7IHZhbHVlIH0pIHtcbiAgICAgICAgbGV0IHNlcmlhbGl6ZWQ7XG4gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBzZXJpYWxpemVkID0ge1xuICAgICAgICAgICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdmFsdWUubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdmFsdWUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3RhY2s6IHZhbHVlLnN0YWNrLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2VyaWFsaXplZCA9IHsgaXNFcnJvcjogZmFsc2UsIHZhbHVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtzZXJpYWxpemVkLCBbXV07XG4gICAgfSxcbiAgICBkZXNlcmlhbGl6ZShzZXJpYWxpemVkKSB7XG4gICAgICAgIGlmIChzZXJpYWxpemVkLmlzRXJyb3IpIHtcbiAgICAgICAgICAgIHRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKHNlcmlhbGl6ZWQudmFsdWUubWVzc2FnZSksIHNlcmlhbGl6ZWQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IHNlcmlhbGl6ZWQudmFsdWU7XG4gICAgfSxcbn07XG4vKipcbiAqIEFsbG93cyBjdXN0b21pemluZyB0aGUgc2VyaWFsaXphdGlvbiBvZiBjZXJ0YWluIHZhbHVlcy5cbiAqL1xuY29uc3QgdHJhbnNmZXJIYW5kbGVycyA9IG5ldyBNYXAoW1xuICAgIFtcInByb3h5XCIsIHByb3h5VHJhbnNmZXJIYW5kbGVyXSxcbiAgICBbXCJ0aHJvd1wiLCB0aHJvd1RyYW5zZmVySGFuZGxlcl0sXG5dKTtcbmZ1bmN0aW9uIGlzQWxsb3dlZE9yaWdpbihhbGxvd2VkT3JpZ2lucywgb3JpZ2luKSB7XG4gICAgZm9yIChjb25zdCBhbGxvd2VkT3JpZ2luIG9mIGFsbG93ZWRPcmlnaW5zKSB7XG4gICAgICAgIGlmIChvcmlnaW4gPT09IGFsbG93ZWRPcmlnaW4gfHwgYWxsb3dlZE9yaWdpbiA9PT0gXCIqXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbGxvd2VkT3JpZ2luIGluc3RhbmNlb2YgUmVnRXhwICYmIGFsbG93ZWRPcmlnaW4udGVzdChvcmlnaW4pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBleHBvc2Uob2JqLCBlcCA9IGdsb2JhbFRoaXMsIGFsbG93ZWRPcmlnaW5zID0gW1wiKlwiXSkge1xuICAgIGVwLmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGZ1bmN0aW9uIGNhbGxiYWNrKGV2KSB7XG4gICAgICAgIGlmICghZXYgfHwgIWV2LmRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzQWxsb3dlZE9yaWdpbihhbGxvd2VkT3JpZ2lucywgZXYub3JpZ2luKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBJbnZhbGlkIG9yaWdpbiAnJHtldi5vcmlnaW59JyBmb3IgY29tbGluayBwcm94eWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgaWQsIHR5cGUsIHBhdGggfSA9IE9iamVjdC5hc3NpZ24oeyBwYXRoOiBbXSB9LCBldi5kYXRhKTtcbiAgICAgICAgY29uc3QgYXJndW1lbnRMaXN0ID0gKGV2LmRhdGEuYXJndW1lbnRMaXN0IHx8IFtdKS5tYXAoZnJvbVdpcmVWYWx1ZSk7XG4gICAgICAgIGxldCByZXR1cm5WYWx1ZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHBhdGguc2xpY2UoMCwgLTEpLnJlZHVjZSgob2JqLCBwcm9wKSA9PiBvYmpbcHJvcF0sIG9iaik7XG4gICAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHBhdGgucmVkdWNlKChvYmosIHByb3ApID0+IG9ialtwcm9wXSwgb2JqKTtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJHRVRcIiAvKiBNZXNzYWdlVHlwZS5HRVQgKi86XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gcmF3VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlNFVFwiIC8qIE1lc3NhZ2VUeXBlLlNFVCAqLzpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50W3BhdGguc2xpY2UoLTEpWzBdXSA9IGZyb21XaXJlVmFsdWUoZXYuZGF0YS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkFQUExZXCIgLyogTWVzc2FnZVR5cGUuQVBQTFkgKi86XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblZhbHVlID0gcmF3VmFsdWUuYXBwbHkocGFyZW50LCBhcmd1bWVudExpc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJDT05TVFJVQ1RcIiAvKiBNZXNzYWdlVHlwZS5DT05TVFJVQ1QgKi86XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbmV3IHJhd1ZhbHVlKC4uLmFyZ3VtZW50TGlzdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHByb3h5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiRU5EUE9JTlRcIiAvKiBNZXNzYWdlVHlwZS5FTkRQT0lOVCAqLzpcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwb3J0MSwgcG9ydDIgfSA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3NlKG9iaiwgcG9ydDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVmFsdWUgPSB0cmFuc2Zlcihwb3J0MSwgW3BvcnQxXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIlJFTEVBU0VcIiAvKiBNZXNzYWdlVHlwZS5SRUxFQVNFICovOlxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm5WYWx1ZSA9IHsgdmFsdWUsIFt0aHJvd01hcmtlcl06IDAgfTtcbiAgICAgICAgfVxuICAgICAgICBQcm9taXNlLnJlc29sdmUocmV0dXJuVmFsdWUpXG4gICAgICAgICAgICAuY2F0Y2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZSwgW3Rocm93TWFya2VyXTogMCB9O1xuICAgICAgICB9KVxuICAgICAgICAgICAgLnRoZW4oKHJldHVyblZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbd2lyZVZhbHVlLCB0cmFuc2ZlcmFibGVzXSA9IHRvV2lyZVZhbHVlKHJldHVyblZhbHVlKTtcbiAgICAgICAgICAgIGVwLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgd2lyZVZhbHVlKSwgeyBpZCB9KSwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJSRUxFQVNFXCIgLyogTWVzc2FnZVR5cGUuUkVMRUFTRSAqLykge1xuICAgICAgICAgICAgICAgIC8vIGRldGFjaCBhbmQgZGVhY3RpdmUgYWZ0ZXIgc2VuZGluZyByZWxlYXNlIHJlc3BvbnNlIGFib3ZlLlxuICAgICAgICAgICAgICAgIGVwLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIGNhbGxiYWNrKTtcbiAgICAgICAgICAgICAgICBjbG9zZUVuZFBvaW50KGVwKTtcbiAgICAgICAgICAgICAgICBpZiAoZmluYWxpemVyIGluIG9iaiAmJiB0eXBlb2Ygb2JqW2ZpbmFsaXplcl0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgICAgICBvYmpbZmluYWxpemVyXSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIC8vIFNlbmQgU2VyaWFsaXphdGlvbiBFcnJvciBUbyBDYWxsZXJcbiAgICAgICAgICAgIGNvbnN0IFt3aXJlVmFsdWUsIHRyYW5zZmVyYWJsZXNdID0gdG9XaXJlVmFsdWUoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiBuZXcgVHlwZUVycm9yKFwiVW5zZXJpYWxpemFibGUgcmV0dXJuIHZhbHVlXCIpLFxuICAgICAgICAgICAgICAgIFt0aHJvd01hcmtlcl06IDAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGVwLnBvc3RNZXNzYWdlKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgd2lyZVZhbHVlKSwgeyBpZCB9KSwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIGlmIChlcC5zdGFydCkge1xuICAgICAgICBlcC5zdGFydCgpO1xuICAgIH1cbn1cbmZ1bmN0aW9uIGlzTWVzc2FnZVBvcnQoZW5kcG9pbnQpIHtcbiAgICByZXR1cm4gZW5kcG9pbnQuY29uc3RydWN0b3IubmFtZSA9PT0gXCJNZXNzYWdlUG9ydFwiO1xufVxuZnVuY3Rpb24gY2xvc2VFbmRQb2ludChlbmRwb2ludCkge1xuICAgIGlmIChpc01lc3NhZ2VQb3J0KGVuZHBvaW50KSlcbiAgICAgICAgZW5kcG9pbnQuY2xvc2UoKTtcbn1cbmZ1bmN0aW9uIHdyYXAoZXAsIHRhcmdldCkge1xuICAgIGNvbnN0IHBlbmRpbmdMaXN0ZW5lcnMgPSBuZXcgTWFwKCk7XG4gICAgZXAuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZnVuY3Rpb24gaGFuZGxlTWVzc2FnZShldikge1xuICAgICAgICBjb25zdCB7IGRhdGEgfSA9IGV2O1xuICAgICAgICBpZiAoIWRhdGEgfHwgIWRhdGEuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXNvbHZlciA9IHBlbmRpbmdMaXN0ZW5lcnMuZ2V0KGRhdGEuaWQpO1xuICAgICAgICBpZiAoIXJlc29sdmVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc29sdmVyKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgcGVuZGluZ0xpc3RlbmVycy5kZWxldGUoZGF0YS5pZCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY3JlYXRlUHJveHkoZXAsIHBlbmRpbmdMaXN0ZW5lcnMsIFtdLCB0YXJnZXQpO1xufVxuZnVuY3Rpb24gdGhyb3dJZlByb3h5UmVsZWFzZWQoaXNSZWxlYXNlZCkge1xuICAgIGlmIChpc1JlbGVhc2VkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlByb3h5IGhhcyBiZWVuIHJlbGVhc2VkIGFuZCBpcyBub3QgdXNlYWJsZVwiKTtcbiAgICB9XG59XG5mdW5jdGlvbiByZWxlYXNlRW5kcG9pbnQoZXApIHtcbiAgICByZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgbmV3IE1hcCgpLCB7XG4gICAgICAgIHR5cGU6IFwiUkVMRUFTRVwiIC8qIE1lc3NhZ2VUeXBlLlJFTEVBU0UgKi8sXG4gICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgIGNsb3NlRW5kUG9pbnQoZXApO1xuICAgIH0pO1xufVxuY29uc3QgcHJveHlDb3VudGVyID0gbmV3IFdlYWtNYXAoKTtcbmNvbnN0IHByb3h5RmluYWxpemVycyA9IFwiRmluYWxpemF0aW9uUmVnaXN0cnlcIiBpbiBnbG9iYWxUaGlzICYmXG4gICAgbmV3IEZpbmFsaXphdGlvblJlZ2lzdHJ5KChlcCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdDb3VudCA9IChwcm94eUNvdW50ZXIuZ2V0KGVwKSB8fCAwKSAtIDE7XG4gICAgICAgIHByb3h5Q291bnRlci5zZXQoZXAsIG5ld0NvdW50KTtcbiAgICAgICAgaWYgKG5ld0NvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZWxlYXNlRW5kcG9pbnQoZXApO1xuICAgICAgICB9XG4gICAgfSk7XG5mdW5jdGlvbiByZWdpc3RlclByb3h5KHByb3h5LCBlcCkge1xuICAgIGNvbnN0IG5ld0NvdW50ID0gKHByb3h5Q291bnRlci5nZXQoZXApIHx8IDApICsgMTtcbiAgICBwcm94eUNvdW50ZXIuc2V0KGVwLCBuZXdDb3VudCk7XG4gICAgaWYgKHByb3h5RmluYWxpemVycykge1xuICAgICAgICBwcm94eUZpbmFsaXplcnMucmVnaXN0ZXIocHJveHksIGVwLCBwcm94eSk7XG4gICAgfVxufVxuZnVuY3Rpb24gdW5yZWdpc3RlclByb3h5KHByb3h5KSB7XG4gICAgaWYgKHByb3h5RmluYWxpemVycykge1xuICAgICAgICBwcm94eUZpbmFsaXplcnMudW5yZWdpc3Rlcihwcm94eSk7XG4gICAgfVxufVxuZnVuY3Rpb24gY3JlYXRlUHJveHkoZXAsIHBlbmRpbmdMaXN0ZW5lcnMsIHBhdGggPSBbXSwgdGFyZ2V0ID0gZnVuY3Rpb24gKCkgeyB9KSB7XG4gICAgbGV0IGlzUHJveHlSZWxlYXNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHByb3h5ID0gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICBnZXQoX3RhcmdldCwgcHJvcCkge1xuICAgICAgICAgICAgdGhyb3dJZlByb3h5UmVsZWFzZWQoaXNQcm94eVJlbGVhc2VkKTtcbiAgICAgICAgICAgIGlmIChwcm9wID09PSByZWxlYXNlUHJveHkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyUHJveHkocHJveHkpO1xuICAgICAgICAgICAgICAgICAgICByZWxlYXNlRW5kcG9pbnQoZXApO1xuICAgICAgICAgICAgICAgICAgICBwZW5kaW5nTGlzdGVuZXJzLmNsZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgIGlzUHJveHlSZWxlYXNlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwcm9wID09PSBcInRoZW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB0aGVuOiAoKSA9PiBwcm94eSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByID0gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgcGVuZGluZ0xpc3RlbmVycywge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIkdFVFwiIC8qIE1lc3NhZ2VUeXBlLkdFVCAqLyxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogcGF0aC5tYXAoKHApID0+IHAudG9TdHJpbmcoKSksXG4gICAgICAgICAgICAgICAgfSkudGhlbihmcm9tV2lyZVZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gci50aGVuLmJpbmQocik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUHJveHkoZXAsIHBlbmRpbmdMaXN0ZW5lcnMsIFsuLi5wYXRoLCBwcm9wXSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldChfdGFyZ2V0LCBwcm9wLCByYXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhyb3dJZlByb3h5UmVsZWFzZWQoaXNQcm94eVJlbGVhc2VkKTtcbiAgICAgICAgICAgIC8vIEZJWE1FOiBFUzYgUHJveHkgSGFuZGxlciBgc2V0YCBtZXRob2RzIGFyZSBzdXBwb3NlZCB0byByZXR1cm4gYVxuICAgICAgICAgICAgLy8gYm9vbGVhbi4gVG8gc2hvdyBnb29kIHdpbGwsIHdlIHJldHVybiB0cnVlIGFzeW5jaHJvbm91c2x5IMKvXFxfKOODhClfL8KvXG4gICAgICAgICAgICBjb25zdCBbdmFsdWUsIHRyYW5zZmVyYWJsZXNdID0gdG9XaXJlVmFsdWUocmF3VmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RSZXNwb25zZU1lc3NhZ2UoZXAsIHBlbmRpbmdMaXN0ZW5lcnMsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiBcIlNFVFwiIC8qIE1lc3NhZ2VUeXBlLlNFVCAqLyxcbiAgICAgICAgICAgICAgICBwYXRoOiBbLi4ucGF0aCwgcHJvcF0ubWFwKChwKSA9PiBwLnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgfSwgdHJhbnNmZXJhYmxlcykudGhlbihmcm9tV2lyZVZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgYXBwbHkoX3RhcmdldCwgX3RoaXNBcmcsIHJhd0FyZ3VtZW50TGlzdCkge1xuICAgICAgICAgICAgdGhyb3dJZlByb3h5UmVsZWFzZWQoaXNQcm94eVJlbGVhc2VkKTtcbiAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICBpZiAobGFzdCA9PT0gY3JlYXRlRW5kcG9pbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgcGVuZGluZ0xpc3RlbmVycywge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIkVORFBPSU5UXCIgLyogTWVzc2FnZVR5cGUuRU5EUE9JTlQgKi8sXG4gICAgICAgICAgICAgICAgfSkudGhlbihmcm9tV2lyZVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGp1c3QgcHJldGVuZCB0aGF0IGBiaW5kKClgIGRpZG7igJl0IGhhcHBlbi5cbiAgICAgICAgICAgIGlmIChsYXN0ID09PSBcImJpbmRcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm94eShlcCwgcGVuZGluZ0xpc3RlbmVycywgcGF0aC5zbGljZSgwLCAtMSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgW2FyZ3VtZW50TGlzdCwgdHJhbnNmZXJhYmxlc10gPSBwcm9jZXNzQXJndW1lbnRzKHJhd0FyZ3VtZW50TGlzdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgcGVuZGluZ0xpc3RlbmVycywge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiQVBQTFlcIiAvKiBNZXNzYWdlVHlwZS5BUFBMWSAqLyxcbiAgICAgICAgICAgICAgICBwYXRoOiBwYXRoLm1hcCgocCkgPT4gcC50b1N0cmluZygpKSxcbiAgICAgICAgICAgICAgICBhcmd1bWVudExpc3QsXG4gICAgICAgICAgICB9LCB0cmFuc2ZlcmFibGVzKS50aGVuKGZyb21XaXJlVmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBjb25zdHJ1Y3QoX3RhcmdldCwgcmF3QXJndW1lbnRMaXN0KSB7XG4gICAgICAgICAgICB0aHJvd0lmUHJveHlSZWxlYXNlZChpc1Byb3h5UmVsZWFzZWQpO1xuICAgICAgICAgICAgY29uc3QgW2FyZ3VtZW50TGlzdCwgdHJhbnNmZXJhYmxlc10gPSBwcm9jZXNzQXJndW1lbnRzKHJhd0FyZ3VtZW50TGlzdCk7XG4gICAgICAgICAgICByZXR1cm4gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgcGVuZGluZ0xpc3RlbmVycywge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwiQ09OU1RSVUNUXCIgLyogTWVzc2FnZVR5cGUuQ09OU1RSVUNUICovLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgubWFwKChwKSA9PiBwLnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgICAgIGFyZ3VtZW50TGlzdCxcbiAgICAgICAgICAgIH0sIHRyYW5zZmVyYWJsZXMpLnRoZW4oZnJvbVdpcmVWYWx1ZSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgcmVnaXN0ZXJQcm94eShwcm94eSwgZXApO1xuICAgIHJldHVybiBwcm94eTtcbn1cbmZ1bmN0aW9uIG15RmxhdChhcnIpIHtcbiAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgYXJyKTtcbn1cbmZ1bmN0aW9uIHByb2Nlc3NBcmd1bWVudHMoYXJndW1lbnRMaXN0KSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkID0gYXJndW1lbnRMaXN0Lm1hcCh0b1dpcmVWYWx1ZSk7XG4gICAgcmV0dXJuIFtwcm9jZXNzZWQubWFwKCh2KSA9PiB2WzBdKSwgbXlGbGF0KHByb2Nlc3NlZC5tYXAoKHYpID0+IHZbMV0pKV07XG59XG5jb25zdCB0cmFuc2ZlckNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIHRyYW5zZmVyKG9iaiwgdHJhbnNmZXJzKSB7XG4gICAgdHJhbnNmZXJDYWNoZS5zZXQob2JqLCB0cmFuc2ZlcnMpO1xuICAgIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBwcm94eShvYmopIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihvYmosIHsgW3Byb3h5TWFya2VyXTogdHJ1ZSB9KTtcbn1cbmZ1bmN0aW9uIHdpbmRvd0VuZHBvaW50KHcsIGNvbnRleHQgPSBnbG9iYWxUaGlzLCB0YXJnZXRPcmlnaW4gPSBcIipcIikge1xuICAgIHJldHVybiB7XG4gICAgICAgIHBvc3RNZXNzYWdlOiAobXNnLCB0cmFuc2ZlcmFibGVzKSA9PiB3LnBvc3RNZXNzYWdlKG1zZywgdGFyZ2V0T3JpZ2luLCB0cmFuc2ZlcmFibGVzKSxcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcjogY29udGV4dC5hZGRFdmVudExpc3RlbmVyLmJpbmQoY29udGV4dCksXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXI6IGNvbnRleHQucmVtb3ZlRXZlbnRMaXN0ZW5lci5iaW5kKGNvbnRleHQpLFxuICAgIH07XG59XG5mdW5jdGlvbiB0b1dpcmVWYWx1ZSh2YWx1ZSkge1xuICAgIGZvciAoY29uc3QgW25hbWUsIGhhbmRsZXJdIG9mIHRyYW5zZmVySGFuZGxlcnMpIHtcbiAgICAgICAgaWYgKGhhbmRsZXIuY2FuSGFuZGxlKHZhbHVlKSkge1xuICAgICAgICAgICAgY29uc3QgW3NlcmlhbGl6ZWRWYWx1ZSwgdHJhbnNmZXJhYmxlc10gPSBoYW5kbGVyLnNlcmlhbGl6ZSh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJIQU5ETEVSXCIgLyogV2lyZVZhbHVlVHlwZS5IQU5ETEVSICovLFxuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogc2VyaWFsaXplZFZhbHVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogXCJSQVdcIiAvKiBXaXJlVmFsdWVUeXBlLlJBVyAqLyxcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2ZlckNhY2hlLmdldCh2YWx1ZSkgfHwgW10sXG4gICAgXTtcbn1cbmZ1bmN0aW9uIGZyb21XaXJlVmFsdWUodmFsdWUpIHtcbiAgICBzd2l0Y2ggKHZhbHVlLnR5cGUpIHtcbiAgICAgICAgY2FzZSBcIkhBTkRMRVJcIiAvKiBXaXJlVmFsdWVUeXBlLkhBTkRMRVIgKi86XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmZXJIYW5kbGVycy5nZXQodmFsdWUubmFtZSkuZGVzZXJpYWxpemUodmFsdWUudmFsdWUpO1xuICAgICAgICBjYXNlIFwiUkFXXCIgLyogV2lyZVZhbHVlVHlwZS5SQVcgKi86XG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gICAgfVxufVxuZnVuY3Rpb24gcmVxdWVzdFJlc3BvbnNlTWVzc2FnZShlcCwgcGVuZGluZ0xpc3RlbmVycywgbXNnLCB0cmFuc2ZlcnMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgaWQgPSBnZW5lcmF0ZVVVSUQoKTtcbiAgICAgICAgcGVuZGluZ0xpc3RlbmVycy5zZXQoaWQsIHJlc29sdmUpO1xuICAgICAgICBpZiAoZXAuc3RhcnQpIHtcbiAgICAgICAgICAgIGVwLnN0YXJ0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZXAucG9zdE1lc3NhZ2UoT2JqZWN0LmFzc2lnbih7IGlkIH0sIG1zZyksIHRyYW5zZmVycyk7XG4gICAgfSk7XG59XG5mdW5jdGlvbiBnZW5lcmF0ZVVVSUQoKSB7XG4gICAgcmV0dXJuIG5ldyBBcnJheSg0KVxuICAgICAgICAuZmlsbCgwKVxuICAgICAgICAubWFwKCgpID0+IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKS50b1N0cmluZygxNikpXG4gICAgICAgIC5qb2luKFwiLVwiKTtcbn1cblxuZXhwb3J0IHsgY3JlYXRlRW5kcG9pbnQsIGV4cG9zZSwgZmluYWxpemVyLCBwcm94eSwgcHJveHlNYXJrZXIsIHJlbGVhc2VQcm94eSwgdHJhbnNmZXIsIHRyYW5zZmVySGFuZGxlcnMsIHdpbmRvd0VuZHBvaW50LCB3cmFwIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1jb21saW5rLm1qcy5tYXBcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/comlink/dist/esm/comlink.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/eventemitter3/index.js":
/*!*********************************************!*\
  !*** ./node_modules/eventemitter3/index.js ***!
  \*********************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif (true) {\n  module.exports = EventEmitter;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxXQUFXLFNBQVM7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGNBQWM7QUFDekIsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsR0FBRztBQUNkLFdBQVcsU0FBUztBQUNwQixhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxjQUFjO0FBQ3pCLFdBQVcsaUJBQWlCO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUIsYUFBYSxPQUFPO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSwwREFBMEQsT0FBTztBQUNqRTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUIsYUFBYSxRQUFRO0FBQ3JCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUIsYUFBYSxTQUFTO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSwwQ0FBMEMsU0FBUztBQUNuRDtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUEsZ0JBQWdCLFlBQVk7QUFDNUI7O0FBRUE7QUFDQSw0REFBNEQ7QUFDNUQsZ0VBQWdFO0FBQ2hFLG9FQUFvRTtBQUNwRSx3RUFBd0U7QUFDeEU7QUFDQSwyREFBMkQsU0FBUztBQUNwRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsV0FBVyxpQkFBaUI7QUFDNUIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsR0FBRztBQUNkLGFBQWEsY0FBYztBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCLFdBQVcsVUFBVTtBQUNyQixXQUFXLEdBQUc7QUFDZCxhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGlCQUFpQjtBQUM1QixXQUFXLFVBQVU7QUFDckIsV0FBVyxHQUFHO0FBQ2QsV0FBVyxTQUFTO0FBQ3BCLGFBQWEsY0FBYztBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNERBQTRELFlBQVk7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLGlCQUFpQjtBQUM1QixhQUFhLGNBQWM7QUFDM0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSSxJQUE2QjtBQUNqQztBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2V2ZW50ZW1pdHRlcjMvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuICAsIHByZWZpeCA9ICd+JztcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBzdG9yYWdlIGZvciBvdXIgYEVFYCBvYmplY3RzLlxuICogQW4gYEV2ZW50c2AgaW5zdGFuY2UgaXMgYSBwbGFpbiBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgZXZlbnQgbmFtZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFdmVudHMoKSB7fVxuXG4vL1xuLy8gV2UgdHJ5IHRvIG5vdCBpbmhlcml0IGZyb20gYE9iamVjdC5wcm90b3R5cGVgLiBJbiBzb21lIGVuZ2luZXMgY3JlYXRpbmcgYW5cbi8vIGluc3RhbmNlIGluIHRoaXMgd2F5IGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYE9iamVjdC5jcmVhdGUobnVsbClgIGRpcmVjdGx5LlxuLy8gSWYgYE9iamVjdC5jcmVhdGUobnVsbClgIGlzIG5vdCBzdXBwb3J0ZWQgd2UgcHJlZml4IHRoZSBldmVudCBuYW1lcyB3aXRoIGFcbi8vIGNoYXJhY3RlciB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbHQtaW4gb2JqZWN0IHByb3BlcnRpZXMgYXJlIG5vdFxuLy8gb3ZlcnJpZGRlbiBvciB1c2VkIGFzIGFuIGF0dGFjayB2ZWN0b3IuXG4vL1xuaWYgKE9iamVjdC5jcmVhdGUpIHtcbiAgRXZlbnRzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy9cbiAgLy8gVGhpcyBoYWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBgX19wcm90b19fYCBwcm9wZXJ0eSBpcyBzdGlsbCBpbmhlcml0ZWQgaW5cbiAgLy8gc29tZSBvbGQgYnJvd3NlcnMgbGlrZSBBbmRyb2lkIDQsIGlQaG9uZSA1LjEsIE9wZXJhIDExIGFuZCBTYWZhcmkgNS5cbiAgLy9cbiAgaWYgKCFuZXcgRXZlbnRzKCkuX19wcm90b19fKSBwcmVmaXggPSBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBldmVudCBsaXN0ZW5lci5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHBhcmFtIHtCb29sZWFufSBbb25jZT1mYWxzZV0gU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRUUoZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdGhpcy5mbiA9IGZuO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLm9uY2UgPSBvbmNlIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBuZXcgRUUoZm4sIGNvbnRleHQgfHwgZW1pdHRlciwgb25jZSlcbiAgICAsIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XSkgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBsaXN0ZW5lciwgZW1pdHRlci5fZXZlbnRzQ291bnQrKztcbiAgZWxzZSBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdLmZuKSBlbWl0dGVyLl9ldmVudHNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IFtlbWl0dGVyLl9ldmVudHNbZXZ0XSwgbGlzdGVuZXJdO1xuXG4gIHJldHVybiBlbWl0dGVyO1xufVxuXG4vKipcbiAqIENsZWFyIGV2ZW50IGJ5IG5hbWUuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldnQgVGhlIEV2ZW50IG5hbWUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbGVhckV2ZW50KGVtaXR0ZXIsIGV2dCkge1xuICBpZiAoLS1lbWl0dGVyLl9ldmVudHNDb3VudCA9PT0gMCkgZW1pdHRlci5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICBlbHNlIGRlbGV0ZSBlbWl0dGVyLl9ldmVudHNbZXZ0XTtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZSB0aGF0IGlzIG1vbGRlZCBhZ2FpbnN0IHRoZSBOb2RlLmpzXG4gKiBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG59XG5cbi8qKlxuICogUmV0dXJuIGFuIGFycmF5IGxpc3RpbmcgdGhlIGV2ZW50cyBmb3Igd2hpY2ggdGhlIGVtaXR0ZXIgaGFzIHJlZ2lzdGVyZWRcbiAqIGxpc3RlbmVycy5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHZhciBuYW1lcyA9IFtdXG4gICAgLCBldmVudHNcbiAgICAsIG5hbWU7XG5cbiAgaWYgKHRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSByZXR1cm4gbmFtZXM7XG5cbiAgZm9yIChuYW1lIGluIChldmVudHMgPSB0aGlzLl9ldmVudHMpKSB7XG4gICAgaWYgKGhhcy5jYWxsKGV2ZW50cywgbmFtZSkpIG5hbWVzLnB1c2gocHJlZml4ID8gbmFtZS5zbGljZSgxKSA6IG5hbWUpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICByZXR1cm4gbmFtZXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZXZlbnRzKSk7XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0FycmF5fSBUaGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmICghaGFuZGxlcnMpIHJldHVybiBbXTtcbiAgaWYgKGhhbmRsZXJzLmZuKSByZXR1cm4gW2hhbmRsZXJzLmZuXTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aCwgZWUgPSBuZXcgQXJyYXkobCk7IGkgPCBsOyBpKyspIHtcbiAgICBlZVtpXSA9IGhhbmRsZXJzW2ldLmZuO1xuICB9XG5cbiAgcmV0dXJuIGVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge051bWJlcn0gVGhlIG51bWJlciBvZiBsaXN0ZW5lcnMuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIGxpc3RlbmVyQ291bnQoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmICghbGlzdGVuZXJzKSByZXR1cm4gMDtcbiAgaWYgKGxpc3RlbmVycy5mbikgcmV0dXJuIDE7XG4gIHJldHVybiBsaXN0ZW5lcnMubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBDYWxscyBlYWNoIG9mIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBldmVudCBoYWQgbGlzdGVuZXJzLCBlbHNlIGBmYWxzZWAuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQoZXZlbnQsIGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdXG4gICAgLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgLCBhcmdzXG4gICAgLCBpO1xuXG4gIGlmIChsaXN0ZW5lcnMuZm4pIHtcbiAgICBpZiAobGlzdGVuZXJzLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVycy5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICBjYXNlIDE6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCksIHRydWU7XG4gICAgICBjYXNlIDI6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEpLCB0cnVlO1xuICAgICAgY2FzZSAzOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiksIHRydWU7XG4gICAgICBjYXNlIDQ6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMyksIHRydWU7XG4gICAgICBjYXNlIDU6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQpLCB0cnVlO1xuICAgICAgY2FzZSA2OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0LCBhNSksIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cblxuICAgIGxpc3RlbmVycy5mbi5hcHBseShsaXN0ZW5lcnMuY29udGV4dCwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGhcbiAgICAgICwgajtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxpc3RlbmVyc1tpXS5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnNbaV0uZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICAgIGNhc2UgMTogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQpOyBicmVhaztcbiAgICAgICAgY2FzZSAyOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEpOyBicmVhaztcbiAgICAgICAgY2FzZSAzOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgNDogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMiwgYTMpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoIWFyZ3MpIGZvciAoaiA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICBhcmdzW2ogLSAxXSA9IGFyZ3VtZW50c1tqXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaXN0ZW5lcnNbaV0uZm4uYXBwbHkobGlzdGVuZXJzW2ldLmNvbnRleHQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIG9uKGV2ZW50LCBmbiwgY29udGV4dCkge1xuICByZXR1cm4gYWRkTGlzdGVuZXIodGhpcywgZXZlbnQsIGZuLCBjb250ZXh0LCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG9uZS10aW1lIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKGV2ZW50LCBmbiwgY29udGV4dCkge1xuICByZXR1cm4gYWRkTGlzdGVuZXIodGhpcywgZXZlbnQsIGZuLCBjb250ZXh0LCB0cnVlKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgb2YgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgbWF0Y2ggdGhpcyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgaGF2ZSB0aGlzIGNvbnRleHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgT25seSByZW1vdmUgb25lLXRpbWUgbGlzdGVuZXJzLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiB0aGlzO1xuICBpZiAoIWZuKSB7XG4gICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmIChsaXN0ZW5lcnMuZm4pIHtcbiAgICBpZiAoXG4gICAgICBsaXN0ZW5lcnMuZm4gPT09IGZuICYmXG4gICAgICAoIW9uY2UgfHwgbGlzdGVuZXJzLm9uY2UpICYmXG4gICAgICAoIWNvbnRleHQgfHwgbGlzdGVuZXJzLmNvbnRleHQgPT09IGNvbnRleHQpXG4gICAgKSB7XG4gICAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwLCBldmVudHMgPSBbXSwgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGxpc3RlbmVyc1tpXS5mbiAhPT0gZm4gfHxcbiAgICAgICAgKG9uY2UgJiYgIWxpc3RlbmVyc1tpXS5vbmNlKSB8fFxuICAgICAgICAoY29udGV4dCAmJiBsaXN0ZW5lcnNbaV0uY29udGV4dCAhPT0gY29udGV4dClcbiAgICAgICkge1xuICAgICAgICBldmVudHMucHVzaChsaXN0ZW5lcnNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gUmVzZXQgdGhlIGFycmF5LCBvciByZW1vdmUgaXQgY29tcGxldGVseSBpZiB3ZSBoYXZlIG5vIG1vcmUgbGlzdGVuZXJzLlxuICAgIC8vXG4gICAgaWYgKGV2ZW50cy5sZW5ndGgpIHRoaXMuX2V2ZW50c1tldnRdID0gZXZlbnRzLmxlbmd0aCA9PT0gMSA/IGV2ZW50c1swXSA6IGV2ZW50cztcbiAgICBlbHNlIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYWxsIGxpc3RlbmVycywgb3IgdGhvc2Ugb2YgdGhlIHNwZWNpZmllZCBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gW2V2ZW50XSBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dDtcblxuICBpZiAoZXZlbnQpIHtcbiAgICBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuICAgIGlmICh0aGlzLl9ldmVudHNbZXZ0XSkgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBBbGlhcyBtZXRob2RzIG5hbWVzIGJlY2F1c2UgcGVvcGxlIHJvbGwgbGlrZSB0aGF0LlxuLy9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uO1xuXG4vL1xuLy8gRXhwb3NlIHRoZSBwcmVmaXguXG4vL1xuRXZlbnRFbWl0dGVyLnByZWZpeGVkID0gcHJlZml4O1xuXG4vL1xuLy8gQWxsb3cgYEV2ZW50RW1pdHRlcmAgdG8gYmUgaW1wb3J0ZWQgYXMgbW9kdWxlIG5hbWVzcGFjZS5cbi8vXG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG4vL1xuLy8gRXhwb3NlIHRoZSBtb2R1bGUuXG4vL1xuaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgbW9kdWxlKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/eventemitter3/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/eventemitter3/index.mjs":
/*!**********************************************!*\
  !*** ./node_modules/eventemitter3/index.mjs ***!
  \**********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   EventEmitter: () => (/* reexport default export from named module */ _index_js__WEBPACK_IMPORTED_MODULE_0__),\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ \"(app-pages-browser)/./node_modules/eventemitter3/index.js\");\n\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_index_js__WEBPACK_IMPORTED_MODULE_0__);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBcUM7O0FBRWQ7QUFDdkIsaUVBQWUsc0NBQVkiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvZXZlbnRlbWl0dGVyMy9pbmRleC5tanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICcuL2luZGV4LmpzJ1xuXG5leHBvcnQgeyBFdmVudEVtaXR0ZXIgfVxuZXhwb3J0IGRlZmF1bHQgRXZlbnRFbWl0dGVyXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/eventemitter3/index.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ieee754/index.js":
/*!***************************************!*\
  !*** ./node_modules/ieee754/index.js ***!
  \***************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
eval(__webpack_require__.ts("/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */\nexports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsWUFBWTtBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUyxXQUFXOztBQUVwQjtBQUNBO0FBQ0E7QUFDQSxTQUFTLFdBQVc7O0FBRXBCO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsV0FBVzs7QUFFcEI7QUFDQTtBQUNBLFNBQVMsVUFBVTs7QUFFbkI7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9pZWVlNzU0L2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qISBpZWVlNzU0LiBCU0QtMy1DbGF1c2UgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG5leHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IChuQnl0ZXMgKiA4KSAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IChlICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIG0gPSBlICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIGUgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IG1MZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IChtICogMjU2KSArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSAobkJ5dGVzICogOCkgLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKCh2YWx1ZSAqIGMpIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IGUgKyBlQmlhc1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gdmFsdWUgKiBNYXRoLnBvdygyLCBlQmlhcyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSAwXG4gICAgfVxuICB9XG5cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW29mZnNldCArIGldID0gbSAmIDB4ZmYsIGkgKz0gZCwgbSAvPSAyNTYsIG1MZW4gLT0gOCkge31cblxuICBlID0gKGUgPDwgbUxlbikgfCBtXG4gIGVMZW4gKz0gbUxlblxuICBmb3IgKDsgZUxlbiA+IDA7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IGUgJiAweGZmLCBpICs9IGQsIGUgLz0gMjU2LCBlTGVuIC09IDgpIHt9XG5cbiAgYnVmZmVyW29mZnNldCArIGkgLSBkXSB8PSBzICogMTI4XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ieee754/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/jayson/lib/client/browser/index.js":
/*!*********************************************************!*\
  !*** ./node_modules/jayson/lib/client/browser/index.js ***!
  \*********************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\n\nconst uuid = (__webpack_require__(/*! uuid */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/index.js\").v4);\nconst generateRequest = __webpack_require__(/*! ../../generateRequest */ \"(app-pages-browser)/./node_modules/jayson/lib/generateRequest.js\");\n\n/**\n * Constructor for a Jayson Browser Client that does not depend any node.js core libraries\n * @class ClientBrowser\n * @param {Function} callServer Method that calls the server, receives the stringified request and a regular node-style callback\n * @param {Object} [options]\n * @param {Function} [options.reviver] Reviver function for JSON\n * @param {Function} [options.replacer] Replacer function for JSON\n * @param {Number} [options.version=2] JSON-RPC version to use (1|2)\n * @param {Function} [options.generator] Function to use for generating request IDs\n *  @param {Boolean} [options.notificationIdNull=false] When true, version 2 requests will set id to null instead of omitting it\n * @return {ClientBrowser}\n */\nconst ClientBrowser = function(callServer, options) {\n  if(!(this instanceof ClientBrowser)) {\n    return new ClientBrowser(callServer, options);\n  }\n\n  if (!options) {\n    options = {};\n  }\n\n  this.options = {\n    reviver: typeof options.reviver !== 'undefined' ? options.reviver : null,\n    replacer: typeof options.replacer !== 'undefined' ? options.replacer : null,\n    generator: typeof options.generator !== 'undefined' ? options.generator : function() { return uuid(); },\n    version: typeof options.version !== 'undefined' ? options.version : 2,\n    notificationIdNull: typeof options.notificationIdNull === 'boolean' ? options.notificationIdNull : false,\n  };\n\n  this.callServer = callServer;\n};\n\nmodule.exports = ClientBrowser;\n\n/**\n *  Creates a request and dispatches it if given a callback.\n *  @param {String|Array} method A batch request if passed an Array, or a method name if passed a String\n *  @param {Array|Object} [params] Parameters for the method\n *  @param {String|Number} [id] Optional id. If undefined an id will be generated. If null it creates a notification request\n *  @param {Function} [callback] Request callback. If specified, executes the request rather than only returning it.\n *  @throws {TypeError} Invalid parameters\n *  @return {Object} JSON-RPC 1.0 or 2.0 compatible request\n */\nClientBrowser.prototype.request = function(method, params, id, callback) {\n  const self = this;\n  let request = null;\n\n  // is this a batch request?\n  const isBatch = Array.isArray(method) && typeof params === 'function';\n\n  if (this.options.version === 1 && isBatch) {\n    throw new TypeError('JSON-RPC 1.0 does not support batching');\n  }\n\n  // is this a raw request?\n  const isRaw = !isBatch && method && typeof method === 'object' && typeof params === 'function';\n\n  if(isBatch || isRaw) {\n    callback = params;\n    request = method;\n  } else {\n    if(typeof id === 'function') {\n      callback = id;\n      // specifically undefined because \"null\" is a notification request\n      id = undefined;\n    }\n\n    const hasCallback = typeof callback === 'function';\n\n    try {\n      request = generateRequest(method, params, id, {\n        generator: this.options.generator,\n        version: this.options.version,\n        notificationIdNull: this.options.notificationIdNull,\n      });\n    } catch(err) {\n      if(hasCallback) {\n        return callback(err);\n      }\n      throw err;\n    }\n\n    // no callback means we should just return a raw request\n    if(!hasCallback) {\n      return request;\n    }\n\n  }\n\n  let message;\n  try {\n    message = JSON.stringify(request, this.options.replacer);\n  } catch(err) {\n    return callback(err);\n  }\n\n  this.callServer(message, function(err, response) {\n    self._parseResponse(err, response, callback);\n  });\n\n  // always return the raw request\n  return request;\n};\n\n/**\n * Parses a response from a server\n * @param {Object} err Error to pass on that is unrelated to the actual response\n * @param {String} responseText JSON-RPC 1.0 or 2.0 response\n * @param {Function} callback Callback that will receive different arguments depending on the amount of parameters\n * @private\n */\nClientBrowser.prototype._parseResponse = function(err, responseText, callback) {\n  if(err) {\n    callback(err);\n    return;\n  }\n\n  if(!responseText) {\n    // empty response text, assume that is correct because it could be a\n    // notification which jayson does not give any body for\n    return callback();\n  }\n\n  let response;\n  try {\n    response = JSON.parse(responseText, this.options.reviver);\n  } catch(err) {\n    return callback(err);\n  }\n\n  if(callback.length === 3) {\n    // if callback length is 3, we split callback arguments on error and response\n\n    // is batch response?\n    if(Array.isArray(response)) {\n\n      // neccesary to split strictly on validity according to spec here\n      const isError = function(res) {\n        return typeof res.error !== 'undefined';\n      };\n\n      const isNotError = function (res) {\n        return !isError(res);\n      };\n\n      return callback(null, response.filter(isError), response.filter(isNotError));\n    \n    } else {\n\n      // split regardless of validity\n      return callback(null, response.error, response.result);\n    \n    }\n  \n  }\n\n  callback(null, response);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qYXlzb24vbGliL2NsaWVudC9icm93c2VyL2luZGV4LmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLGFBQWEseUdBQWtCO0FBQy9CLHdCQUF3QixtQkFBTyxDQUFDLCtGQUF1Qjs7QUFFdkQ7QUFDQTtBQUNBO0FBQ0EsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsV0FBVyxVQUFVO0FBQ3JCLFdBQVcsUUFBUTtBQUNuQixXQUFXLFVBQVU7QUFDckIsWUFBWSxTQUFTO0FBQ3JCLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSwyRkFBMkYsZ0JBQWdCO0FBQzNHO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxZQUFZLGNBQWM7QUFDMUIsWUFBWSxjQUFjO0FBQzFCLFlBQVksZUFBZTtBQUMzQixZQUFZLFVBQVU7QUFDdEIsYUFBYSxXQUFXO0FBQ3hCLGFBQWEsUUFBUTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsVUFBVTtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLE1BQU07O0FBRU47QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvamF5c29uL2xpYi9jbGllbnQvYnJvd3Nlci9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmNvbnN0IHV1aWQgPSByZXF1aXJlKCd1dWlkJykudjQ7XG5jb25zdCBnZW5lcmF0ZVJlcXVlc3QgPSByZXF1aXJlKCcuLi8uLi9nZW5lcmF0ZVJlcXVlc3QnKTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBmb3IgYSBKYXlzb24gQnJvd3NlciBDbGllbnQgdGhhdCBkb2VzIG5vdCBkZXBlbmQgYW55IG5vZGUuanMgY29yZSBsaWJyYXJpZXNcbiAqIEBjbGFzcyBDbGllbnRCcm93c2VyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsU2VydmVyIE1ldGhvZCB0aGF0IGNhbGxzIHRoZSBzZXJ2ZXIsIHJlY2VpdmVzIHRoZSBzdHJpbmdpZmllZCByZXF1ZXN0IGFuZCBhIHJlZ3VsYXIgbm9kZS1zdHlsZSBjYWxsYmFja1xuICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMucmV2aXZlcl0gUmV2aXZlciBmdW5jdGlvbiBmb3IgSlNPTlxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMucmVwbGFjZXJdIFJlcGxhY2VyIGZ1bmN0aW9uIGZvciBKU09OXG4gKiBAcGFyYW0ge051bWJlcn0gW29wdGlvbnMudmVyc2lvbj0yXSBKU09OLVJQQyB2ZXJzaW9uIHRvIHVzZSAoMXwyKVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdG9yXSBGdW5jdGlvbiB0byB1c2UgZm9yIGdlbmVyYXRpbmcgcmVxdWVzdCBJRHNcbiAqICBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5vdGlmaWNhdGlvbklkTnVsbD1mYWxzZV0gV2hlbiB0cnVlLCB2ZXJzaW9uIDIgcmVxdWVzdHMgd2lsbCBzZXQgaWQgdG8gbnVsbCBpbnN0ZWFkIG9mIG9taXR0aW5nIGl0XG4gKiBAcmV0dXJuIHtDbGllbnRCcm93c2VyfVxuICovXG5jb25zdCBDbGllbnRCcm93c2VyID0gZnVuY3Rpb24oY2FsbFNlcnZlciwgb3B0aW9ucykge1xuICBpZighKHRoaXMgaW5zdGFuY2VvZiBDbGllbnRCcm93c2VyKSkge1xuICAgIHJldHVybiBuZXcgQ2xpZW50QnJvd3NlcihjYWxsU2VydmVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIGlmICghb3B0aW9ucykge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHRoaXMub3B0aW9ucyA9IHtcbiAgICByZXZpdmVyOiB0eXBlb2Ygb3B0aW9ucy5yZXZpdmVyICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMucmV2aXZlciA6IG51bGwsXG4gICAgcmVwbGFjZXI6IHR5cGVvZiBvcHRpb25zLnJlcGxhY2VyICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMucmVwbGFjZXIgOiBudWxsLFxuICAgIGdlbmVyYXRvcjogdHlwZW9mIG9wdGlvbnMuZ2VuZXJhdG9yICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMuZ2VuZXJhdG9yIDogZnVuY3Rpb24oKSB7IHJldHVybiB1dWlkKCk7IH0sXG4gICAgdmVyc2lvbjogdHlwZW9mIG9wdGlvbnMudmVyc2lvbiAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLnZlcnNpb24gOiAyLFxuICAgIG5vdGlmaWNhdGlvbklkTnVsbDogdHlwZW9mIG9wdGlvbnMubm90aWZpY2F0aW9uSWROdWxsID09PSAnYm9vbGVhbicgPyBvcHRpb25zLm5vdGlmaWNhdGlvbklkTnVsbCA6IGZhbHNlLFxuICB9O1xuXG4gIHRoaXMuY2FsbFNlcnZlciA9IGNhbGxTZXJ2ZXI7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IENsaWVudEJyb3dzZXI7XG5cbi8qKlxuICogIENyZWF0ZXMgYSByZXF1ZXN0IGFuZCBkaXNwYXRjaGVzIGl0IGlmIGdpdmVuIGEgY2FsbGJhY2suXG4gKiAgQHBhcmFtIHtTdHJpbmd8QXJyYXl9IG1ldGhvZCBBIGJhdGNoIHJlcXVlc3QgaWYgcGFzc2VkIGFuIEFycmF5LCBvciBhIG1ldGhvZCBuYW1lIGlmIHBhc3NlZCBhIFN0cmluZ1xuICogIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBbcGFyYW1zXSBQYXJhbWV0ZXJzIGZvciB0aGUgbWV0aG9kXG4gKiAgQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSBbaWRdIE9wdGlvbmFsIGlkLiBJZiB1bmRlZmluZWQgYW4gaWQgd2lsbCBiZSBnZW5lcmF0ZWQuIElmIG51bGwgaXQgY3JlYXRlcyBhIG5vdGlmaWNhdGlvbiByZXF1ZXN0XG4gKiAgQHBhcmFtIHtGdW5jdGlvbn0gW2NhbGxiYWNrXSBSZXF1ZXN0IGNhbGxiYWNrLiBJZiBzcGVjaWZpZWQsIGV4ZWN1dGVzIHRoZSByZXF1ZXN0IHJhdGhlciB0aGFuIG9ubHkgcmV0dXJuaW5nIGl0LlxuICogIEB0aHJvd3Mge1R5cGVFcnJvcn0gSW52YWxpZCBwYXJhbWV0ZXJzXG4gKiAgQHJldHVybiB7T2JqZWN0fSBKU09OLVJQQyAxLjAgb3IgMi4wIGNvbXBhdGlibGUgcmVxdWVzdFxuICovXG5DbGllbnRCcm93c2VyLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24obWV0aG9kLCBwYXJhbXMsIGlkLCBjYWxsYmFjaykge1xuICBjb25zdCBzZWxmID0gdGhpcztcbiAgbGV0IHJlcXVlc3QgPSBudWxsO1xuXG4gIC8vIGlzIHRoaXMgYSBiYXRjaCByZXF1ZXN0P1xuICBjb25zdCBpc0JhdGNoID0gQXJyYXkuaXNBcnJheShtZXRob2QpICYmIHR5cGVvZiBwYXJhbXMgPT09ICdmdW5jdGlvbic7XG5cbiAgaWYgKHRoaXMub3B0aW9ucy52ZXJzaW9uID09PSAxICYmIGlzQmF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdKU09OLVJQQyAxLjAgZG9lcyBub3Qgc3VwcG9ydCBiYXRjaGluZycpO1xuICB9XG5cbiAgLy8gaXMgdGhpcyBhIHJhdyByZXF1ZXN0P1xuICBjb25zdCBpc1JhdyA9ICFpc0JhdGNoICYmIG1ldGhvZCAmJiB0eXBlb2YgbWV0aG9kID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcGFyYW1zID09PSAnZnVuY3Rpb24nO1xuXG4gIGlmKGlzQmF0Y2ggfHwgaXNSYXcpIHtcbiAgICBjYWxsYmFjayA9IHBhcmFtcztcbiAgICByZXF1ZXN0ID0gbWV0aG9kO1xuICB9IGVsc2Uge1xuICAgIGlmKHR5cGVvZiBpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgY2FsbGJhY2sgPSBpZDtcbiAgICAgIC8vIHNwZWNpZmljYWxseSB1bmRlZmluZWQgYmVjYXVzZSBcIm51bGxcIiBpcyBhIG5vdGlmaWNhdGlvbiByZXF1ZXN0XG4gICAgICBpZCA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBjb25zdCBoYXNDYWxsYmFjayA9IHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJztcblxuICAgIHRyeSB7XG4gICAgICByZXF1ZXN0ID0gZ2VuZXJhdGVSZXF1ZXN0KG1ldGhvZCwgcGFyYW1zLCBpZCwge1xuICAgICAgICBnZW5lcmF0b3I6IHRoaXMub3B0aW9ucy5nZW5lcmF0b3IsXG4gICAgICAgIHZlcnNpb246IHRoaXMub3B0aW9ucy52ZXJzaW9uLFxuICAgICAgICBub3RpZmljYXRpb25JZE51bGw6IHRoaXMub3B0aW9ucy5ub3RpZmljYXRpb25JZE51bGwsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoKGVycikge1xuICAgICAgaWYoaGFzQ2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgLy8gbm8gY2FsbGJhY2sgbWVhbnMgd2Ugc2hvdWxkIGp1c3QgcmV0dXJuIGEgcmF3IHJlcXVlc3RcbiAgICBpZighaGFzQ2FsbGJhY2spIHtcbiAgICAgIHJldHVybiByZXF1ZXN0O1xuICAgIH1cblxuICB9XG5cbiAgbGV0IG1lc3NhZ2U7XG4gIHRyeSB7XG4gICAgbWVzc2FnZSA9IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QsIHRoaXMub3B0aW9ucy5yZXBsYWNlcik7XG4gIH0gY2F0Y2goZXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gIH1cblxuICB0aGlzLmNhbGxTZXJ2ZXIobWVzc2FnZSwgZnVuY3Rpb24oZXJyLCByZXNwb25zZSkge1xuICAgIHNlbGYuX3BhcnNlUmVzcG9uc2UoZXJyLCByZXNwb25zZSwgY2FsbGJhY2spO1xuICB9KTtcblxuICAvLyBhbHdheXMgcmV0dXJuIHRoZSByYXcgcmVxdWVzdFxuICByZXR1cm4gcmVxdWVzdDtcbn07XG5cbi8qKlxuICogUGFyc2VzIGEgcmVzcG9uc2UgZnJvbSBhIHNlcnZlclxuICogQHBhcmFtIHtPYmplY3R9IGVyciBFcnJvciB0byBwYXNzIG9uIHRoYXQgaXMgdW5yZWxhdGVkIHRvIHRoZSBhY3R1YWwgcmVzcG9uc2VcbiAqIEBwYXJhbSB7U3RyaW5nfSByZXNwb25zZVRleHQgSlNPTi1SUEMgMS4wIG9yIDIuMCByZXNwb25zZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgQ2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgZGlmZmVyZW50IGFyZ3VtZW50cyBkZXBlbmRpbmcgb24gdGhlIGFtb3VudCBvZiBwYXJhbWV0ZXJzXG4gKiBAcHJpdmF0ZVxuICovXG5DbGllbnRCcm93c2VyLnByb3RvdHlwZS5fcGFyc2VSZXNwb25zZSA9IGZ1bmN0aW9uKGVyciwgcmVzcG9uc2VUZXh0LCBjYWxsYmFjaykge1xuICBpZihlcnIpIHtcbiAgICBjYWxsYmFjayhlcnIpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmKCFyZXNwb25zZVRleHQpIHtcbiAgICAvLyBlbXB0eSByZXNwb25zZSB0ZXh0LCBhc3N1bWUgdGhhdCBpcyBjb3JyZWN0IGJlY2F1c2UgaXQgY291bGQgYmUgYVxuICAgIC8vIG5vdGlmaWNhdGlvbiB3aGljaCBqYXlzb24gZG9lcyBub3QgZ2l2ZSBhbnkgYm9keSBmb3JcbiAgICByZXR1cm4gY2FsbGJhY2soKTtcbiAgfVxuXG4gIGxldCByZXNwb25zZTtcbiAgdHJ5IHtcbiAgICByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2VUZXh0LCB0aGlzLm9wdGlvbnMucmV2aXZlcik7XG4gIH0gY2F0Y2goZXJyKSB7XG4gICAgcmV0dXJuIGNhbGxiYWNrKGVycik7XG4gIH1cblxuICBpZihjYWxsYmFjay5sZW5ndGggPT09IDMpIHtcbiAgICAvLyBpZiBjYWxsYmFjayBsZW5ndGggaXMgMywgd2Ugc3BsaXQgY2FsbGJhY2sgYXJndW1lbnRzIG9uIGVycm9yIGFuZCByZXNwb25zZVxuXG4gICAgLy8gaXMgYmF0Y2ggcmVzcG9uc2U/XG4gICAgaWYoQXJyYXkuaXNBcnJheShyZXNwb25zZSkpIHtcblxuICAgICAgLy8gbmVjY2VzYXJ5IHRvIHNwbGl0IHN0cmljdGx5IG9uIHZhbGlkaXR5IGFjY29yZGluZyB0byBzcGVjIGhlcmVcbiAgICAgIGNvbnN0IGlzRXJyb3IgPSBmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXMuZXJyb3IgIT09ICd1bmRlZmluZWQnO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgaXNOb3RFcnJvciA9IGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgICAgcmV0dXJuICFpc0Vycm9yKHJlcyk7XG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UuZmlsdGVyKGlzRXJyb3IpLCByZXNwb25zZS5maWx0ZXIoaXNOb3RFcnJvcikpO1xuICAgIFxuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vIHNwbGl0IHJlZ2FyZGxlc3Mgb2YgdmFsaWRpdHlcbiAgICAgIHJldHVybiBjYWxsYmFjayhudWxsLCByZXNwb25zZS5lcnJvciwgcmVzcG9uc2UucmVzdWx0KTtcbiAgICBcbiAgICB9XG4gIFxuICB9XG5cbiAgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpO1xufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jayson/lib/client/browser/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/jayson/lib/generateRequest.js":
/*!****************************************************!*\
  !*** ./node_modules/jayson/lib/generateRequest.js ***!
  \****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\n\nconst uuid = (__webpack_require__(/*! uuid */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/index.js\").v4);\n\n/**\n *  Generates a JSON-RPC 1.0 or 2.0 request\n *  @param {String} method Name of method to call\n *  @param {Array|Object} params Array of parameters passed to the method as specified, or an object of parameter names and corresponding value\n *  @param {String|Number|null} [id] Request ID can be a string, number, null for explicit notification or left out for automatic generation\n *  @param {Object} [options]\n *  @param {Number} [options.version=2] JSON-RPC version to use (1 or 2)\n *  @param {Boolean} [options.notificationIdNull=false] When true, version 2 requests will set id to null instead of omitting it\n *  @param {Function} [options.generator] Passed the request, and the options object and is expected to return a request ID\n *  @throws {TypeError} If any of the parameters are invalid\n *  @return {Object} A JSON-RPC 1.0 or 2.0 request\n *  @memberOf Utils\n */\nconst generateRequest = function(method, params, id, options) {\n  if(typeof method !== 'string') {\n    throw new TypeError(method + ' must be a string');\n  }\n\n  options = options || {};\n\n  // check valid version provided\n  const version = typeof options.version === 'number' ? options.version : 2;\n  if (version !== 1 && version !== 2) {\n    throw new TypeError(version + ' must be 1 or 2');\n  }\n\n  const request = {\n    method: method\n  };\n\n  if(version === 2) {\n    request.jsonrpc = '2.0';\n  }\n\n  if(params) {\n    // params given, but invalid?\n    if(typeof params !== 'object' && !Array.isArray(params)) {\n      throw new TypeError(params + ' must be an object, array or omitted');\n    }\n    request.params = params;\n  }\n\n  // if id was left out, generate one (null means explicit notification)\n  if(typeof(id) === 'undefined') {\n    const generator = typeof options.generator === 'function' ? options.generator : function() { return uuid(); };\n    request.id = generator(request, options);\n  } else if (version === 2 && id === null) {\n    // we have a version 2 notification\n    if (options.notificationIdNull) {\n      request.id = null; // id will not be set at all unless option provided\n    }\n  } else {\n    request.id = id;\n  }\n\n  return request;\n};\n\nmodule.exports = generateRequest;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qYXlzb24vbGliL2dlbmVyYXRlUmVxdWVzdC5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixhQUFhLHlHQUFrQjs7QUFFL0I7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQixZQUFZLGNBQWM7QUFDMUIsWUFBWSxvQkFBb0I7QUFDaEMsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUTtBQUNwQixZQUFZLFNBQVM7QUFDckIsWUFBWSxVQUFVO0FBQ3RCLGFBQWEsV0FBVztBQUN4QixhQUFhLFFBQVE7QUFDckI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsaUdBQWlHO0FBQ2pHO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekI7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBOztBQUVBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2pheXNvbi9saWIvZ2VuZXJhdGVSZXF1ZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2Ugc3RyaWN0JztcblxuY29uc3QgdXVpZCA9IHJlcXVpcmUoJ3V1aWQnKS52NDtcblxuLyoqXG4gKiAgR2VuZXJhdGVzIGEgSlNPTi1SUEMgMS4wIG9yIDIuMCByZXF1ZXN0XG4gKiAgQHBhcmFtIHtTdHJpbmd9IG1ldGhvZCBOYW1lIG9mIG1ldGhvZCB0byBjYWxsXG4gKiAgQHBhcmFtIHtBcnJheXxPYmplY3R9IHBhcmFtcyBBcnJheSBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgbWV0aG9kIGFzIHNwZWNpZmllZCwgb3IgYW4gb2JqZWN0IG9mIHBhcmFtZXRlciBuYW1lcyBhbmQgY29ycmVzcG9uZGluZyB2YWx1ZVxuICogIEBwYXJhbSB7U3RyaW5nfE51bWJlcnxudWxsfSBbaWRdIFJlcXVlc3QgSUQgY2FuIGJlIGEgc3RyaW5nLCBudW1iZXIsIG51bGwgZm9yIGV4cGxpY2l0IG5vdGlmaWNhdGlvbiBvciBsZWZ0IG91dCBmb3IgYXV0b21hdGljIGdlbmVyYXRpb25cbiAqICBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdXG4gKiAgQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLnZlcnNpb249Ml0gSlNPTi1SUEMgdmVyc2lvbiB0byB1c2UgKDEgb3IgMilcbiAqICBAcGFyYW0ge0Jvb2xlYW59IFtvcHRpb25zLm5vdGlmaWNhdGlvbklkTnVsbD1mYWxzZV0gV2hlbiB0cnVlLCB2ZXJzaW9uIDIgcmVxdWVzdHMgd2lsbCBzZXQgaWQgdG8gbnVsbCBpbnN0ZWFkIG9mIG9taXR0aW5nIGl0XG4gKiAgQHBhcmFtIHtGdW5jdGlvbn0gW29wdGlvbnMuZ2VuZXJhdG9yXSBQYXNzZWQgdGhlIHJlcXVlc3QsIGFuZCB0aGUgb3B0aW9ucyBvYmplY3QgYW5kIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIHJlcXVlc3QgSURcbiAqICBAdGhyb3dzIHtUeXBlRXJyb3J9IElmIGFueSBvZiB0aGUgcGFyYW1ldGVycyBhcmUgaW52YWxpZFxuICogIEByZXR1cm4ge09iamVjdH0gQSBKU09OLVJQQyAxLjAgb3IgMi4wIHJlcXVlc3RcbiAqICBAbWVtYmVyT2YgVXRpbHNcbiAqL1xuY29uc3QgZ2VuZXJhdGVSZXF1ZXN0ID0gZnVuY3Rpb24obWV0aG9kLCBwYXJhbXMsIGlkLCBvcHRpb25zKSB7XG4gIGlmKHR5cGVvZiBtZXRob2QgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihtZXRob2QgKyAnIG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIGNoZWNrIHZhbGlkIHZlcnNpb24gcHJvdmlkZWRcbiAgY29uc3QgdmVyc2lvbiA9IHR5cGVvZiBvcHRpb25zLnZlcnNpb24gPT09ICdudW1iZXInID8gb3B0aW9ucy52ZXJzaW9uIDogMjtcbiAgaWYgKHZlcnNpb24gIT09IDEgJiYgdmVyc2lvbiAhPT0gMikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IodmVyc2lvbiArICcgbXVzdCBiZSAxIG9yIDInKTtcbiAgfVxuXG4gIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgbWV0aG9kOiBtZXRob2RcbiAgfTtcblxuICBpZih2ZXJzaW9uID09PSAyKSB7XG4gICAgcmVxdWVzdC5qc29ucnBjID0gJzIuMCc7XG4gIH1cblxuICBpZihwYXJhbXMpIHtcbiAgICAvLyBwYXJhbXMgZ2l2ZW4sIGJ1dCBpbnZhbGlkP1xuICAgIGlmKHR5cGVvZiBwYXJhbXMgIT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KHBhcmFtcykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IocGFyYW1zICsgJyBtdXN0IGJlIGFuIG9iamVjdCwgYXJyYXkgb3Igb21pdHRlZCcpO1xuICAgIH1cbiAgICByZXF1ZXN0LnBhcmFtcyA9IHBhcmFtcztcbiAgfVxuXG4gIC8vIGlmIGlkIHdhcyBsZWZ0IG91dCwgZ2VuZXJhdGUgb25lIChudWxsIG1lYW5zIGV4cGxpY2l0IG5vdGlmaWNhdGlvbilcbiAgaWYodHlwZW9mKGlkKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBjb25zdCBnZW5lcmF0b3IgPSB0eXBlb2Ygb3B0aW9ucy5nZW5lcmF0b3IgPT09ICdmdW5jdGlvbicgPyBvcHRpb25zLmdlbmVyYXRvciA6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdXVpZCgpOyB9O1xuICAgIHJlcXVlc3QuaWQgPSBnZW5lcmF0b3IocmVxdWVzdCwgb3B0aW9ucyk7XG4gIH0gZWxzZSBpZiAodmVyc2lvbiA9PT0gMiAmJiBpZCA9PT0gbnVsbCkge1xuICAgIC8vIHdlIGhhdmUgYSB2ZXJzaW9uIDIgbm90aWZpY2F0aW9uXG4gICAgaWYgKG9wdGlvbnMubm90aWZpY2F0aW9uSWROdWxsKSB7XG4gICAgICByZXF1ZXN0LmlkID0gbnVsbDsgLy8gaWQgd2lsbCBub3QgYmUgc2V0IGF0IGFsbCB1bmxlc3Mgb3B0aW9uIHByb3ZpZGVkXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJlcXVlc3QuaWQgPSBpZDtcbiAgfVxuXG4gIHJldHVybiByZXF1ZXN0O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBnZW5lcmF0ZVJlcXVlc3Q7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jayson/lib/generateRequest.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/jose/dist/browser/lib/buffer_utils.js":
/*!************************************************************!*\
  !*** ./node_modules/jose/dist/browser/lib/buffer_utils.js ***!
  \************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   concat: () => (/* binding */ concat),\n/* harmony export */   concatKdf: () => (/* binding */ concatKdf),\n/* harmony export */   decoder: () => (/* binding */ decoder),\n/* harmony export */   encoder: () => (/* binding */ encoder),\n/* harmony export */   lengthAndInput: () => (/* binding */ lengthAndInput),\n/* harmony export */   p2s: () => (/* binding */ p2s),\n/* harmony export */   uint32be: () => (/* binding */ uint32be),\n/* harmony export */   uint64be: () => (/* binding */ uint64be)\n/* harmony export */ });\n/* harmony import */ var _runtime_digest_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../runtime/digest.js */ \"(app-pages-browser)/./node_modules/jose/dist/browser/runtime/digest.js\");\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\nconst MAX_INT32 = 2 ** 32;\nfunction concat(...buffers) {\n    const size = buffers.reduce((acc, { length }) => acc + length, 0);\n    const buf = new Uint8Array(size);\n    let i = 0;\n    for (const buffer of buffers) {\n        buf.set(buffer, i);\n        i += buffer.length;\n    }\n    return buf;\n}\nfunction p2s(alg, p2sInput) {\n    return concat(encoder.encode(alg), new Uint8Array([0]), p2sInput);\n}\nfunction writeUInt32BE(buf, value, offset) {\n    if (value < 0 || value >= MAX_INT32) {\n        throw new RangeError(`value must be >= 0 and <= ${MAX_INT32 - 1}. Received ${value}`);\n    }\n    buf.set([value >>> 24, value >>> 16, value >>> 8, value & 0xff], offset);\n}\nfunction uint64be(value) {\n    const high = Math.floor(value / MAX_INT32);\n    const low = value % MAX_INT32;\n    const buf = new Uint8Array(8);\n    writeUInt32BE(buf, high, 0);\n    writeUInt32BE(buf, low, 4);\n    return buf;\n}\nfunction uint32be(value) {\n    const buf = new Uint8Array(4);\n    writeUInt32BE(buf, value);\n    return buf;\n}\nfunction lengthAndInput(input) {\n    return concat(uint32be(input.length), input);\n}\nasync function concatKdf(secret, bits, value) {\n    const iterations = Math.ceil((bits >> 3) / 32);\n    const res = new Uint8Array(iterations * 32);\n    for (let iter = 0; iter < iterations; iter++) {\n        const buf = new Uint8Array(4 + secret.length + value.length);\n        buf.set(uint32be(iter + 1));\n        buf.set(secret, 4);\n        buf.set(value, 4 + secret.length);\n        res.set(await (0,_runtime_digest_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('sha256', buf), iter * 32);\n    }\n    return res.slice(0, bits >> 3);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qb3NlL2Rpc3QvYnJvd3Nlci9saWIvYnVmZmVyX3V0aWxzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUEwQztBQUNuQztBQUNBO0FBQ1A7QUFDTztBQUNQLHdDQUF3QyxRQUFRO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMERBQTBELGNBQWMsYUFBYSxNQUFNO0FBQzNGO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EsdUJBQXVCLG1CQUFtQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQiw4REFBTTtBQUM1QjtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvam9zZS9kaXN0L2Jyb3dzZXIvbGliL2J1ZmZlcl91dGlscy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZGlnZXN0IGZyb20gJy4uL3J1bnRpbWUvZGlnZXN0LmpzJztcbmV4cG9ydCBjb25zdCBlbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5leHBvcnQgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuY29uc3QgTUFYX0lOVDMyID0gMiAqKiAzMjtcbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQoLi4uYnVmZmVycykge1xuICAgIGNvbnN0IHNpemUgPSBidWZmZXJzLnJlZHVjZSgoYWNjLCB7IGxlbmd0aCB9KSA9PiBhY2MgKyBsZW5ndGgsIDApO1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICAgIGxldCBpID0gMDtcbiAgICBmb3IgKGNvbnN0IGJ1ZmZlciBvZiBidWZmZXJzKSB7XG4gICAgICAgIGJ1Zi5zZXQoYnVmZmVyLCBpKTtcbiAgICAgICAgaSArPSBidWZmZXIubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gYnVmO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHAycyhhbGcsIHAyc0lucHV0KSB7XG4gICAgcmV0dXJuIGNvbmNhdChlbmNvZGVyLmVuY29kZShhbGcpLCBuZXcgVWludDhBcnJheShbMF0pLCBwMnNJbnB1dCk7XG59XG5mdW5jdGlvbiB3cml0ZVVJbnQzMkJFKGJ1ZiwgdmFsdWUsIG9mZnNldCkge1xuICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPj0gTUFYX0lOVDMyKSB7XG4gICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGB2YWx1ZSBtdXN0IGJlID49IDAgYW5kIDw9ICR7TUFYX0lOVDMyIC0gMX0uIFJlY2VpdmVkICR7dmFsdWV9YCk7XG4gICAgfVxuICAgIGJ1Zi5zZXQoW3ZhbHVlID4+PiAyNCwgdmFsdWUgPj4+IDE2LCB2YWx1ZSA+Pj4gOCwgdmFsdWUgJiAweGZmXSwgb2Zmc2V0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50NjRiZSh2YWx1ZSkge1xuICAgIGNvbnN0IGhpZ2ggPSBNYXRoLmZsb29yKHZhbHVlIC8gTUFYX0lOVDMyKTtcbiAgICBjb25zdCBsb3cgPSB2YWx1ZSAlIE1BWF9JTlQzMjtcbiAgICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheSg4KTtcbiAgICB3cml0ZVVJbnQzMkJFKGJ1ZiwgaGlnaCwgMCk7XG4gICAgd3JpdGVVSW50MzJCRShidWYsIGxvdywgNCk7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cbmV4cG9ydCBmdW5jdGlvbiB1aW50MzJiZSh2YWx1ZSkge1xuICAgIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KDQpO1xuICAgIHdyaXRlVUludDMyQkUoYnVmLCB2YWx1ZSk7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsZW5ndGhBbmRJbnB1dChpbnB1dCkge1xuICAgIHJldHVybiBjb25jYXQodWludDMyYmUoaW5wdXQubGVuZ3RoKSwgaW5wdXQpO1xufVxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbmNhdEtkZihzZWNyZXQsIGJpdHMsIHZhbHVlKSB7XG4gICAgY29uc3QgaXRlcmF0aW9ucyA9IE1hdGguY2VpbCgoYml0cyA+PiAzKSAvIDMyKTtcbiAgICBjb25zdCByZXMgPSBuZXcgVWludDhBcnJheShpdGVyYXRpb25zICogMzIpO1xuICAgIGZvciAobGV0IGl0ZXIgPSAwOyBpdGVyIDwgaXRlcmF0aW9uczsgaXRlcisrKSB7XG4gICAgICAgIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KDQgKyBzZWNyZXQubGVuZ3RoICsgdmFsdWUubGVuZ3RoKTtcbiAgICAgICAgYnVmLnNldCh1aW50MzJiZShpdGVyICsgMSkpO1xuICAgICAgICBidWYuc2V0KHNlY3JldCwgNCk7XG4gICAgICAgIGJ1Zi5zZXQodmFsdWUsIDQgKyBzZWNyZXQubGVuZ3RoKTtcbiAgICAgICAgcmVzLnNldChhd2FpdCBkaWdlc3QoJ3NoYTI1NicsIGJ1ZiksIGl0ZXIgKiAzMik7XG4gICAgfVxuICAgIHJldHVybiByZXMuc2xpY2UoMCwgYml0cyA+PiAzKTtcbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jose/dist/browser/lib/buffer_utils.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/jose/dist/browser/lib/is_object.js":
/*!*********************************************************!*\
  !*** ./node_modules/jose/dist/browser/lib/is_object.js ***!
  \*********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ isObject)\n/* harmony export */ });\nfunction isObjectLike(value) {\n    return typeof value === 'object' && value !== null;\n}\nfunction isObject(input) {\n    if (!isObjectLike(input) || Object.prototype.toString.call(input) !== '[object Object]') {\n        return false;\n    }\n    if (Object.getPrototypeOf(input) === null) {\n        return true;\n    }\n    let proto = input;\n    while (Object.getPrototypeOf(proto) !== null) {\n        proto = Object.getPrototypeOf(proto);\n    }\n    return Object.getPrototypeOf(input) === proto;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qb3NlL2Rpc3QvYnJvd3Nlci9saWIvaXNfb2JqZWN0LmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9qb3NlL2Rpc3QvYnJvd3Nlci9saWIvaXNfb2JqZWN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGlzT2JqZWN0TGlrZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufVxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgICBpZiAoIWlzT2JqZWN0TGlrZShpbnB1dCkgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKGlucHV0KSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgbGV0IHByb3RvID0gaW5wdXQ7XG4gICAgd2hpbGUgKE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykgIT09IG51bGwpIHtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKGlucHV0KSA9PT0gcHJvdG87XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jose/dist/browser/lib/is_object.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/jose/dist/browser/runtime/base64url.js":
/*!*************************************************************!*\
  !*** ./node_modules/jose/dist/browser/runtime/base64url.js ***!
  \*************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   decode: () => (/* binding */ decode),\n/* harmony export */   decodeBase64: () => (/* binding */ decodeBase64),\n/* harmony export */   encode: () => (/* binding */ encode),\n/* harmony export */   encodeBase64: () => (/* binding */ encodeBase64)\n/* harmony export */ });\n/* harmony import */ var _lib_buffer_utils_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib/buffer_utils.js */ \"(app-pages-browser)/./node_modules/jose/dist/browser/lib/buffer_utils.js\");\n\nconst encodeBase64 = (input) => {\n    let unencoded = input;\n    if (typeof unencoded === 'string') {\n        unencoded = _lib_buffer_utils_js__WEBPACK_IMPORTED_MODULE_0__.encoder.encode(unencoded);\n    }\n    const CHUNK_SIZE = 0x8000;\n    const arr = [];\n    for (let i = 0; i < unencoded.length; i += CHUNK_SIZE) {\n        arr.push(String.fromCharCode.apply(null, unencoded.subarray(i, i + CHUNK_SIZE)));\n    }\n    return btoa(arr.join(''));\n};\nconst encode = (input) => {\n    return encodeBase64(input).replace(/=/g, '').replace(/\\+/g, '-').replace(/\\//g, '_');\n};\nconst decodeBase64 = (encoded) => {\n    const binary = atob(encoded);\n    const bytes = new Uint8Array(binary.length);\n    for (let i = 0; i < binary.length; i++) {\n        bytes[i] = binary.charCodeAt(i);\n    }\n    return bytes;\n};\nconst decode = (input) => {\n    let encoded = input;\n    if (encoded instanceof Uint8Array) {\n        encoded = _lib_buffer_utils_js__WEBPACK_IMPORTED_MODULE_0__.decoder.decode(encoded);\n    }\n    encoded = encoded.replace(/-/g, '+').replace(/_/g, '/').replace(/\\s/g, '');\n    try {\n        return decodeBase64(encoded);\n    }\n    catch {\n        throw new TypeError('The input to be decoded is not correctly encoded.');\n    }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qb3NlL2Rpc3QvYnJvd3Nlci9ydW50aW1lL2Jhc2U2NHVybC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUEwRDtBQUNuRDtBQUNQO0FBQ0E7QUFDQSxvQkFBb0IseURBQU87QUFDM0I7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLHNCQUFzQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLG9CQUFvQixtQkFBbUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSxrQkFBa0IseURBQU87QUFDekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2pvc2UvZGlzdC9icm93c2VyL3J1bnRpbWUvYmFzZTY0dXJsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGVuY29kZXIsIGRlY29kZXIgfSBmcm9tICcuLi9saWIvYnVmZmVyX3V0aWxzLmpzJztcbmV4cG9ydCBjb25zdCBlbmNvZGVCYXNlNjQgPSAoaW5wdXQpID0+IHtcbiAgICBsZXQgdW5lbmNvZGVkID0gaW5wdXQ7XG4gICAgaWYgKHR5cGVvZiB1bmVuY29kZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHVuZW5jb2RlZCA9IGVuY29kZXIuZW5jb2RlKHVuZW5jb2RlZCk7XG4gICAgfVxuICAgIGNvbnN0IENIVU5LX1NJWkUgPSAweDgwMDA7XG4gICAgY29uc3QgYXJyID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bmVuY29kZWQubGVuZ3RoOyBpICs9IENIVU5LX1NJWkUpIHtcbiAgICAgICAgYXJyLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1bmVuY29kZWQuc3ViYXJyYXkoaSwgaSArIENIVU5LX1NJWkUpKSk7XG4gICAgfVxuICAgIHJldHVybiBidG9hKGFyci5qb2luKCcnKSk7XG59O1xuZXhwb3J0IGNvbnN0IGVuY29kZSA9IChpbnB1dCkgPT4ge1xuICAgIHJldHVybiBlbmNvZGVCYXNlNjQoaW5wdXQpLnJlcGxhY2UoLz0vZywgJycpLnJlcGxhY2UoL1xcKy9nLCAnLScpLnJlcGxhY2UoL1xcLy9nLCAnXycpO1xufTtcbmV4cG9ydCBjb25zdCBkZWNvZGVCYXNlNjQgPSAoZW5jb2RlZCkgPT4ge1xuICAgIGNvbnN0IGJpbmFyeSA9IGF0b2IoZW5jb2RlZCk7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnkubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbmFyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICBieXRlc1tpXSA9IGJpbmFyeS5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgICByZXR1cm4gYnl0ZXM7XG59O1xuZXhwb3J0IGNvbnN0IGRlY29kZSA9IChpbnB1dCkgPT4ge1xuICAgIGxldCBlbmNvZGVkID0gaW5wdXQ7XG4gICAgaWYgKGVuY29kZWQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIGVuY29kZWQgPSBkZWNvZGVyLmRlY29kZShlbmNvZGVkKTtcbiAgICB9XG4gICAgZW5jb2RlZCA9IGVuY29kZWQucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCYXNlNjQoZW5jb2RlZCk7XG4gICAgfVxuICAgIGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGlucHV0IHRvIGJlIGRlY29kZWQgaXMgbm90IGNvcnJlY3RseSBlbmNvZGVkLicpO1xuICAgIH1cbn07XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jose/dist/browser/runtime/base64url.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/jose/dist/browser/runtime/digest.js":
/*!**********************************************************!*\
  !*** ./node_modules/jose/dist/browser/runtime/digest.js ***!
  \**********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _webcrypto_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./webcrypto.js */ \"(app-pages-browser)/./node_modules/jose/dist/browser/runtime/webcrypto.js\");\n\nconst digest = async (algorithm, data) => {\n    const subtleDigest = `SHA-${algorithm.slice(-3)}`;\n    return new Uint8Array(await _webcrypto_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].subtle.digest(subtleDigest, data));\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (digest);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qb3NlL2Rpc3QvYnJvd3Nlci9ydW50aW1lL2RpZ2VzdC5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFvQztBQUNwQztBQUNBLGdDQUFnQyxvQkFBb0I7QUFDcEQsZ0NBQWdDLHFEQUFNO0FBQ3RDO0FBQ0EsaUVBQWUsTUFBTSxFQUFDIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2pvc2UvZGlzdC9icm93c2VyL3J1bnRpbWUvZGlnZXN0LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSAnLi93ZWJjcnlwdG8uanMnO1xuY29uc3QgZGlnZXN0ID0gYXN5bmMgKGFsZ29yaXRobSwgZGF0YSkgPT4ge1xuICAgIGNvbnN0IHN1YnRsZURpZ2VzdCA9IGBTSEEtJHthbGdvcml0aG0uc2xpY2UoLTMpfWA7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KHN1YnRsZURpZ2VzdCwgZGF0YSkpO1xufTtcbmV4cG9ydCBkZWZhdWx0IGRpZ2VzdDtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jose/dist/browser/runtime/digest.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/jose/dist/browser/runtime/webcrypto.js":
/*!*************************************************************!*\
  !*** ./node_modules/jose/dist/browser/runtime/webcrypto.js ***!
  \*************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__),\n/* harmony export */   isCryptoKey: () => (/* binding */ isCryptoKey)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (crypto);\nconst isCryptoKey = (key) => key instanceof CryptoKey;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qb3NlL2Rpc3QvYnJvd3Nlci9ydW50aW1lL3dlYmNyeXB0by5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBLGlFQUFlLE1BQU0sRUFBQztBQUNmIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2pvc2UvZGlzdC9icm93c2VyL3J1bnRpbWUvd2ViY3J5cHRvLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNyeXB0bztcbmV4cG9ydCBjb25zdCBpc0NyeXB0b0tleSA9IChrZXkpID0+IGtleSBpbnN0YW5jZW9mIENyeXB0b0tleTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jose/dist/browser/runtime/webcrypto.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/jose/dist/browser/util/base64url.js":
/*!**********************************************************!*\
  !*** ./node_modules/jose/dist/browser/util/base64url.js ***!
  \**********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   decode: () => (/* binding */ decode),\n/* harmony export */   encode: () => (/* binding */ encode)\n/* harmony export */ });\n/* harmony import */ var _runtime_base64url_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../runtime/base64url.js */ \"(app-pages-browser)/./node_modules/jose/dist/browser/runtime/base64url.js\");\n\nconst encode = _runtime_base64url_js__WEBPACK_IMPORTED_MODULE_0__.encode;\nconst decode = _runtime_base64url_js__WEBPACK_IMPORTED_MODULE_0__.decode;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qb3NlL2Rpc3QvYnJvd3Nlci91dGlsL2Jhc2U2NHVybC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBcUQ7QUFDOUMsZUFBZSx5REFBZ0I7QUFDL0IsZUFBZSx5REFBZ0IiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvam9zZS9kaXN0L2Jyb3dzZXIvdXRpbC9iYXNlNjR1cmwuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgYmFzZTY0dXJsIGZyb20gJy4uL3J1bnRpbWUvYmFzZTY0dXJsLmpzJztcbmV4cG9ydCBjb25zdCBlbmNvZGUgPSBiYXNlNjR1cmwuZW5jb2RlO1xuZXhwb3J0IGNvbnN0IGRlY29kZSA9IGJhc2U2NHVybC5kZWNvZGU7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jose/dist/browser/util/base64url.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/jose/dist/browser/util/decode_jwt.js":
/*!***********************************************************!*\
  !*** ./node_modules/jose/dist/browser/util/decode_jwt.js ***!
  \***********************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   decodeJwt: () => (/* binding */ decodeJwt)\n/* harmony export */ });\n/* harmony import */ var _base64url_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./base64url.js */ \"(app-pages-browser)/./node_modules/jose/dist/browser/util/base64url.js\");\n/* harmony import */ var _lib_buffer_utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../lib/buffer_utils.js */ \"(app-pages-browser)/./node_modules/jose/dist/browser/lib/buffer_utils.js\");\n/* harmony import */ var _lib_is_object_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../lib/is_object.js */ \"(app-pages-browser)/./node_modules/jose/dist/browser/lib/is_object.js\");\n/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./errors.js */ \"(app-pages-browser)/./node_modules/jose/dist/browser/util/errors.js\");\n\n\n\n\nfunction decodeJwt(jwt) {\n    if (typeof jwt !== 'string')\n        throw new _errors_js__WEBPACK_IMPORTED_MODULE_0__.JWTInvalid('JWTs must use Compact JWS serialization, JWT must be a string');\n    const { 1: payload, length } = jwt.split('.');\n    if (length === 5)\n        throw new _errors_js__WEBPACK_IMPORTED_MODULE_0__.JWTInvalid('Only JWTs using Compact JWS serialization can be decoded');\n    if (length !== 3)\n        throw new _errors_js__WEBPACK_IMPORTED_MODULE_0__.JWTInvalid('Invalid JWT');\n    if (!payload)\n        throw new _errors_js__WEBPACK_IMPORTED_MODULE_0__.JWTInvalid('JWTs must contain a payload');\n    let decoded;\n    try {\n        decoded = (0,_base64url_js__WEBPACK_IMPORTED_MODULE_1__.decode)(payload);\n    }\n    catch {\n        throw new _errors_js__WEBPACK_IMPORTED_MODULE_0__.JWTInvalid('Failed to base64url decode the payload');\n    }\n    let result;\n    try {\n        result = JSON.parse(_lib_buffer_utils_js__WEBPACK_IMPORTED_MODULE_2__.decoder.decode(decoded));\n    }\n    catch {\n        throw new _errors_js__WEBPACK_IMPORTED_MODULE_0__.JWTInvalid('Failed to parse the decoded payload as JSON');\n    }\n    if (!(0,_lib_is_object_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(result))\n        throw new _errors_js__WEBPACK_IMPORTED_MODULE_0__.JWTInvalid('Invalid JWT Claims Set');\n    return result;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qb3NlL2Rpc3QvYnJvd3Nlci91dGlsL2RlY29kZV9qd3QuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBcUQ7QUFDSjtBQUNOO0FBQ0Y7QUFDbEM7QUFDUDtBQUNBLGtCQUFrQixrREFBVTtBQUM1QixZQUFZLHFCQUFxQjtBQUNqQztBQUNBLGtCQUFrQixrREFBVTtBQUM1QjtBQUNBLGtCQUFrQixrREFBVTtBQUM1QjtBQUNBLGtCQUFrQixrREFBVTtBQUM1QjtBQUNBO0FBQ0Esa0JBQWtCLHFEQUFTO0FBQzNCO0FBQ0E7QUFDQSxrQkFBa0Isa0RBQVU7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLHlEQUFPO0FBQ25DO0FBQ0E7QUFDQSxrQkFBa0Isa0RBQVU7QUFDNUI7QUFDQSxTQUFTLDZEQUFRO0FBQ2pCLGtCQUFrQixrREFBVTtBQUM1QjtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2pvc2UvZGlzdC9icm93c2VyL3V0aWwvZGVjb2RlX2p3dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWNvZGUgYXMgYmFzZTY0dXJsIH0gZnJvbSAnLi9iYXNlNjR1cmwuanMnO1xuaW1wb3J0IHsgZGVjb2RlciB9IGZyb20gJy4uL2xpYi9idWZmZXJfdXRpbHMuanMnO1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJy4uL2xpYi9pc19vYmplY3QuanMnO1xuaW1wb3J0IHsgSldUSW52YWxpZCB9IGZyb20gJy4vZXJyb3JzLmpzJztcbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVKd3Qoand0KSB7XG4gICAgaWYgKHR5cGVvZiBqd3QgIT09ICdzdHJpbmcnKVxuICAgICAgICB0aHJvdyBuZXcgSldUSW52YWxpZCgnSldUcyBtdXN0IHVzZSBDb21wYWN0IEpXUyBzZXJpYWxpemF0aW9uLCBKV1QgbXVzdCBiZSBhIHN0cmluZycpO1xuICAgIGNvbnN0IHsgMTogcGF5bG9hZCwgbGVuZ3RoIH0gPSBqd3Quc3BsaXQoJy4nKTtcbiAgICBpZiAobGVuZ3RoID09PSA1KVxuICAgICAgICB0aHJvdyBuZXcgSldUSW52YWxpZCgnT25seSBKV1RzIHVzaW5nIENvbXBhY3QgSldTIHNlcmlhbGl6YXRpb24gY2FuIGJlIGRlY29kZWQnKTtcbiAgICBpZiAobGVuZ3RoICE9PSAzKVxuICAgICAgICB0aHJvdyBuZXcgSldUSW52YWxpZCgnSW52YWxpZCBKV1QnKTtcbiAgICBpZiAoIXBheWxvYWQpXG4gICAgICAgIHRocm93IG5ldyBKV1RJbnZhbGlkKCdKV1RzIG11c3QgY29udGFpbiBhIHBheWxvYWQnKTtcbiAgICBsZXQgZGVjb2RlZDtcbiAgICB0cnkge1xuICAgICAgICBkZWNvZGVkID0gYmFzZTY0dXJsKHBheWxvYWQpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBKV1RJbnZhbGlkKCdGYWlsZWQgdG8gYmFzZTY0dXJsIGRlY29kZSB0aGUgcGF5bG9hZCcpO1xuICAgIH1cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UoZGVjb2Rlci5kZWNvZGUoZGVjb2RlZCkpO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHRocm93IG5ldyBKV1RJbnZhbGlkKCdGYWlsZWQgdG8gcGFyc2UgdGhlIGRlY29kZWQgcGF5bG9hZCBhcyBKU09OJyk7XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QocmVzdWx0KSlcbiAgICAgICAgdGhyb3cgbmV3IEpXVEludmFsaWQoJ0ludmFsaWQgSldUIENsYWltcyBTZXQnKTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jose/dist/browser/util/decode_jwt.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/jose/dist/browser/util/errors.js":
/*!*******************************************************!*\
  !*** ./node_modules/jose/dist/browser/util/errors.js ***!
  \*******************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   JOSEAlgNotAllowed: () => (/* binding */ JOSEAlgNotAllowed),\n/* harmony export */   JOSEError: () => (/* binding */ JOSEError),\n/* harmony export */   JOSENotSupported: () => (/* binding */ JOSENotSupported),\n/* harmony export */   JWEDecryptionFailed: () => (/* binding */ JWEDecryptionFailed),\n/* harmony export */   JWEInvalid: () => (/* binding */ JWEInvalid),\n/* harmony export */   JWKInvalid: () => (/* binding */ JWKInvalid),\n/* harmony export */   JWKSInvalid: () => (/* binding */ JWKSInvalid),\n/* harmony export */   JWKSMultipleMatchingKeys: () => (/* binding */ JWKSMultipleMatchingKeys),\n/* harmony export */   JWKSNoMatchingKey: () => (/* binding */ JWKSNoMatchingKey),\n/* harmony export */   JWKSTimeout: () => (/* binding */ JWKSTimeout),\n/* harmony export */   JWSInvalid: () => (/* binding */ JWSInvalid),\n/* harmony export */   JWSSignatureVerificationFailed: () => (/* binding */ JWSSignatureVerificationFailed),\n/* harmony export */   JWTClaimValidationFailed: () => (/* binding */ JWTClaimValidationFailed),\n/* harmony export */   JWTExpired: () => (/* binding */ JWTExpired),\n/* harmony export */   JWTInvalid: () => (/* binding */ JWTInvalid)\n/* harmony export */ });\nclass JOSEError extends Error {\n    constructor(message, options) {\n        super(message, options);\n        this.code = 'ERR_JOSE_GENERIC';\n        this.name = this.constructor.name;\n        Error.captureStackTrace?.(this, this.constructor);\n    }\n}\nJOSEError.code = 'ERR_JOSE_GENERIC';\nclass JWTClaimValidationFailed extends JOSEError {\n    constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n        super(message, { cause: { claim, reason, payload } });\n        this.code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\n        this.claim = claim;\n        this.reason = reason;\n        this.payload = payload;\n    }\n}\nJWTClaimValidationFailed.code = 'ERR_JWT_CLAIM_VALIDATION_FAILED';\nclass JWTExpired extends JOSEError {\n    constructor(message, payload, claim = 'unspecified', reason = 'unspecified') {\n        super(message, { cause: { claim, reason, payload } });\n        this.code = 'ERR_JWT_EXPIRED';\n        this.claim = claim;\n        this.reason = reason;\n        this.payload = payload;\n    }\n}\nJWTExpired.code = 'ERR_JWT_EXPIRED';\nclass JOSEAlgNotAllowed extends JOSEError {\n    constructor() {\n        super(...arguments);\n        this.code = 'ERR_JOSE_ALG_NOT_ALLOWED';\n    }\n}\nJOSEAlgNotAllowed.code = 'ERR_JOSE_ALG_NOT_ALLOWED';\nclass JOSENotSupported extends JOSEError {\n    constructor() {\n        super(...arguments);\n        this.code = 'ERR_JOSE_NOT_SUPPORTED';\n    }\n}\nJOSENotSupported.code = 'ERR_JOSE_NOT_SUPPORTED';\nclass JWEDecryptionFailed extends JOSEError {\n    constructor(message = 'decryption operation failed', options) {\n        super(message, options);\n        this.code = 'ERR_JWE_DECRYPTION_FAILED';\n    }\n}\nJWEDecryptionFailed.code = 'ERR_JWE_DECRYPTION_FAILED';\nclass JWEInvalid extends JOSEError {\n    constructor() {\n        super(...arguments);\n        this.code = 'ERR_JWE_INVALID';\n    }\n}\nJWEInvalid.code = 'ERR_JWE_INVALID';\nclass JWSInvalid extends JOSEError {\n    constructor() {\n        super(...arguments);\n        this.code = 'ERR_JWS_INVALID';\n    }\n}\nJWSInvalid.code = 'ERR_JWS_INVALID';\nclass JWTInvalid extends JOSEError {\n    constructor() {\n        super(...arguments);\n        this.code = 'ERR_JWT_INVALID';\n    }\n}\nJWTInvalid.code = 'ERR_JWT_INVALID';\nclass JWKInvalid extends JOSEError {\n    constructor() {\n        super(...arguments);\n        this.code = 'ERR_JWK_INVALID';\n    }\n}\nJWKInvalid.code = 'ERR_JWK_INVALID';\nclass JWKSInvalid extends JOSEError {\n    constructor() {\n        super(...arguments);\n        this.code = 'ERR_JWKS_INVALID';\n    }\n}\nJWKSInvalid.code = 'ERR_JWKS_INVALID';\nclass JWKSNoMatchingKey extends JOSEError {\n    constructor(message = 'no applicable key found in the JSON Web Key Set', options) {\n        super(message, options);\n        this.code = 'ERR_JWKS_NO_MATCHING_KEY';\n    }\n}\nJWKSNoMatchingKey.code = 'ERR_JWKS_NO_MATCHING_KEY';\nclass JWKSMultipleMatchingKeys extends JOSEError {\n    constructor(message = 'multiple matching keys found in the JSON Web Key Set', options) {\n        super(message, options);\n        this.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\n    }\n}\nSymbol.asyncIterator;\nJWKSMultipleMatchingKeys.code = 'ERR_JWKS_MULTIPLE_MATCHING_KEYS';\nclass JWKSTimeout extends JOSEError {\n    constructor(message = 'request timed out', options) {\n        super(message, options);\n        this.code = 'ERR_JWKS_TIMEOUT';\n    }\n}\nJWKSTimeout.code = 'ERR_JWKS_TIMEOUT';\nclass JWSSignatureVerificationFailed extends JOSEError {\n    constructor(message = 'signature verification failed', options) {\n        super(message, options);\n        this.code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n    }\n}\nJWSSignatureVerificationFailed.code = 'ERR_JWS_SIGNATURE_VERIFICATION_FAILED';\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9qb3NlL2Rpc3QvYnJvd3Nlci91dGlsL2Vycm9ycy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0EseUJBQXlCLFNBQVMsMEJBQTBCO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLHlCQUF5QixTQUFTLDBCQUEwQjtBQUM1RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL2pvc2UvZGlzdC9icm93c2VyL3V0aWwvZXJyb3JzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBKT1NFRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5jb2RlID0gJ0VSUl9KT1NFX0dFTkVSSUMnO1xuICAgICAgICB0aGlzLm5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlPy4odGhpcywgdGhpcy5jb25zdHJ1Y3Rvcik7XG4gICAgfVxufVxuSk9TRUVycm9yLmNvZGUgPSAnRVJSX0pPU0VfR0VORVJJQyc7XG5leHBvcnQgY2xhc3MgSldUQ2xhaW1WYWxpZGF0aW9uRmFpbGVkIGV4dGVuZHMgSk9TRUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBwYXlsb2FkLCBjbGFpbSA9ICd1bnNwZWNpZmllZCcsIHJlYXNvbiA9ICd1bnNwZWNpZmllZCcpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgeyBjYXVzZTogeyBjbGFpbSwgcmVhc29uLCBwYXlsb2FkIH0gfSk7XG4gICAgICAgIHRoaXMuY29kZSA9ICdFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEJztcbiAgICAgICAgdGhpcy5jbGFpbSA9IGNsYWltO1xuICAgICAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjtcbiAgICAgICAgdGhpcy5wYXlsb2FkID0gcGF5bG9hZDtcbiAgICB9XG59XG5KV1RDbGFpbVZhbGlkYXRpb25GYWlsZWQuY29kZSA9ICdFUlJfSldUX0NMQUlNX1ZBTElEQVRJT05fRkFJTEVEJztcbmV4cG9ydCBjbGFzcyBKV1RFeHBpcmVkIGV4dGVuZHMgSk9TRUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlLCBwYXlsb2FkLCBjbGFpbSA9ICd1bnNwZWNpZmllZCcsIHJlYXNvbiA9ICd1bnNwZWNpZmllZCcpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgeyBjYXVzZTogeyBjbGFpbSwgcmVhc29uLCBwYXlsb2FkIH0gfSk7XG4gICAgICAgIHRoaXMuY29kZSA9ICdFUlJfSldUX0VYUElSRUQnO1xuICAgICAgICB0aGlzLmNsYWltID0gY2xhaW07XG4gICAgICAgIHRoaXMucmVhc29uID0gcmVhc29uO1xuICAgICAgICB0aGlzLnBheWxvYWQgPSBwYXlsb2FkO1xuICAgIH1cbn1cbkpXVEV4cGlyZWQuY29kZSA9ICdFUlJfSldUX0VYUElSRUQnO1xuZXhwb3J0IGNsYXNzIEpPU0VBbGdOb3RBbGxvd2VkIGV4dGVuZHMgSk9TRUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5jb2RlID0gJ0VSUl9KT1NFX0FMR19OT1RfQUxMT1dFRCc7XG4gICAgfVxufVxuSk9TRUFsZ05vdEFsbG93ZWQuY29kZSA9ICdFUlJfSk9TRV9BTEdfTk9UX0FMTE9XRUQnO1xuZXhwb3J0IGNsYXNzIEpPU0VOb3RTdXBwb3J0ZWQgZXh0ZW5kcyBKT1NFRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmNvZGUgPSAnRVJSX0pPU0VfTk9UX1NVUFBPUlRFRCc7XG4gICAgfVxufVxuSk9TRU5vdFN1cHBvcnRlZC5jb2RlID0gJ0VSUl9KT1NFX05PVF9TVVBQT1JURUQnO1xuZXhwb3J0IGNsYXNzIEpXRURlY3J5cHRpb25GYWlsZWQgZXh0ZW5kcyBKT1NFRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAnZGVjcnlwdGlvbiBvcGVyYXRpb24gZmFpbGVkJywgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5jb2RlID0gJ0VSUl9KV0VfREVDUllQVElPTl9GQUlMRUQnO1xuICAgIH1cbn1cbkpXRURlY3J5cHRpb25GYWlsZWQuY29kZSA9ICdFUlJfSldFX0RFQ1JZUFRJT05fRkFJTEVEJztcbmV4cG9ydCBjbGFzcyBKV0VJbnZhbGlkIGV4dGVuZHMgSk9TRUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5jb2RlID0gJ0VSUl9KV0VfSU5WQUxJRCc7XG4gICAgfVxufVxuSldFSW52YWxpZC5jb2RlID0gJ0VSUl9KV0VfSU5WQUxJRCc7XG5leHBvcnQgY2xhc3MgSldTSW52YWxpZCBleHRlbmRzIEpPU0VFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuY29kZSA9ICdFUlJfSldTX0lOVkFMSUQnO1xuICAgIH1cbn1cbkpXU0ludmFsaWQuY29kZSA9ICdFUlJfSldTX0lOVkFMSUQnO1xuZXhwb3J0IGNsYXNzIEpXVEludmFsaWQgZXh0ZW5kcyBKT1NFRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmNvZGUgPSAnRVJSX0pXVF9JTlZBTElEJztcbiAgICB9XG59XG5KV1RJbnZhbGlkLmNvZGUgPSAnRVJSX0pXVF9JTlZBTElEJztcbmV4cG9ydCBjbGFzcyBKV0tJbnZhbGlkIGV4dGVuZHMgSk9TRUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5jb2RlID0gJ0VSUl9KV0tfSU5WQUxJRCc7XG4gICAgfVxufVxuSldLSW52YWxpZC5jb2RlID0gJ0VSUl9KV0tfSU5WQUxJRCc7XG5leHBvcnQgY2xhc3MgSldLU0ludmFsaWQgZXh0ZW5kcyBKT1NFRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmNvZGUgPSAnRVJSX0pXS1NfSU5WQUxJRCc7XG4gICAgfVxufVxuSldLU0ludmFsaWQuY29kZSA9ICdFUlJfSldLU19JTlZBTElEJztcbmV4cG9ydCBjbGFzcyBKV0tTTm9NYXRjaGluZ0tleSBleHRlbmRzIEpPU0VFcnJvciB7XG4gICAgY29uc3RydWN0b3IobWVzc2FnZSA9ICdubyBhcHBsaWNhYmxlIGtleSBmb3VuZCBpbiB0aGUgSlNPTiBXZWIgS2V5IFNldCcsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuY29kZSA9ICdFUlJfSldLU19OT19NQVRDSElOR19LRVknO1xuICAgIH1cbn1cbkpXS1NOb01hdGNoaW5nS2V5LmNvZGUgPSAnRVJSX0pXS1NfTk9fTUFUQ0hJTkdfS0VZJztcbmV4cG9ydCBjbGFzcyBKV0tTTXVsdGlwbGVNYXRjaGluZ0tleXMgZXh0ZW5kcyBKT1NFRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UgPSAnbXVsdGlwbGUgbWF0Y2hpbmcga2V5cyBmb3VuZCBpbiB0aGUgSlNPTiBXZWIgS2V5IFNldCcsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuY29kZSA9ICdFUlJfSldLU19NVUxUSVBMRV9NQVRDSElOR19LRVlTJztcbiAgICB9XG59XG5TeW1ib2wuYXN5bmNJdGVyYXRvcjtcbkpXS1NNdWx0aXBsZU1hdGNoaW5nS2V5cy5jb2RlID0gJ0VSUl9KV0tTX01VTFRJUExFX01BVENISU5HX0tFWVMnO1xuZXhwb3J0IGNsYXNzIEpXS1NUaW1lb3V0IGV4dGVuZHMgSk9TRUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ3JlcXVlc3QgdGltZWQgb3V0Jywgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5jb2RlID0gJ0VSUl9KV0tTX1RJTUVPVVQnO1xuICAgIH1cbn1cbkpXS1NUaW1lb3V0LmNvZGUgPSAnRVJSX0pXS1NfVElNRU9VVCc7XG5leHBvcnQgY2xhc3MgSldTU2lnbmF0dXJlVmVyaWZpY2F0aW9uRmFpbGVkIGV4dGVuZHMgSk9TRUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlID0gJ3NpZ25hdHVyZSB2ZXJpZmljYXRpb24gZmFpbGVkJywgb3B0aW9ucykge1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5jb2RlID0gJ0VSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQnO1xuICAgIH1cbn1cbkpXU1NpZ25hdHVyZVZlcmlmaWNhdGlvbkZhaWxlZC5jb2RlID0gJ0VSUl9KV1NfU0lHTkFUVVJFX1ZFUklGSUNBVElPTl9GQUlMRUQnO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/jose/dist/browser/util/errors.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/next/dist/api/app-dynamic.js":
/*!***************************************************!*\
  !*** ./node_modules/next/dist/api/app-dynamic.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* reexport default from dynamic */ _shared_lib_app_dynamic__WEBPACK_IMPORTED_MODULE_0___default.a)\n/* harmony export */ });\n/* harmony import */ var _shared_lib_app_dynamic__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../shared/lib/app-dynamic */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/app-dynamic.js\");\n/* harmony import */ var _shared_lib_app_dynamic__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_shared_lib_app_dynamic__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in _shared_lib_app_dynamic__WEBPACK_IMPORTED_MODULE_0__) if(__WEBPACK_IMPORT_KEY__ !== \"default\") __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => _shared_lib_app_dynamic__WEBPACK_IMPORTED_MODULE_0__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\n\n\n//# sourceMappingURL=app-dynamic.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvYXBpL2FwcC1keW5hbWljLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUEwQztBQUNVOztBQUVwRCIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvYXBpL2FwcC1keW5hbWljLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4uL3NoYXJlZC9saWIvYXBwLWR5bmFtaWMnO1xuZXhwb3J0IHsgZGVmYXVsdCB9IGZyb20gJy4uL3NoYXJlZC9saWIvYXBwLWR5bmFtaWMnO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1hcHAtZHluYW1pYy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/api/app-dynamic.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fnode_modules%2Fsonner%2Fdist%2Findex.mjs%22%2C%22ids%22%3A%5B%22Toaster%22%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Fapp%2Fproviders.tsx%22%2C%22ids%22%3A%5B%22Providers%22%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Flib%2Fwallet-context.tsx%22%2C%22ids%22%3A%5B%22WalletProvider%22%5D%7D&server=false!":
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
  !*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fnode_modules%2Fsonner%2Fdist%2Findex.mjs%22%2C%22ids%22%3A%5B%22Toaster%22%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Fapp%2Fproviders.tsx%22%2C%22ids%22%3A%5B%22Providers%22%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Flib%2Fwallet-context.tsx%22%2C%22ids%22%3A%5B%22WalletProvider%22%5D%7D&server=false! ***!
  \*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
 
eval(__webpack_require__.ts("Promise.resolve(/*! import() eager */).then(__webpack_require__.bind(__webpack_require__, /*! ./node_modules/sonner/dist/index.mjs */ \"(app-pages-browser)/./node_modules/sonner/dist/index.mjs\"));\n;\nPromise.resolve(/*! import() eager */).then(__webpack_require__.bind(__webpack_require__, /*! ./src/app/globals.css */ \"(app-pages-browser)/./src/app/globals.css\"));\n;\nPromise.resolve(/*! import() eager */).then(__webpack_require__.bind(__webpack_require__, /*! ./src/app/providers.tsx */ \"(app-pages-browser)/./src/app/providers.tsx\"));\n;\nPromise.resolve(/*! import() eager */).then(__webpack_require__.bind(__webpack_require__, /*! ./src/lib/wallet-context.tsx */ \"(app-pages-browser)/./src/lib/wallet-context.tsx\"));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvYnVpbGQvd2VicGFjay9sb2FkZXJzL25leHQtZmxpZ2h0LWNsaWVudC1lbnRyeS1sb2FkZXIuanM/bW9kdWxlcz0lN0IlMjJyZXF1ZXN0JTIyJTNBJTIyJTJGaG9tZSUyRndzbHh0JTJGY3M0NzIlMkZmYXJjYXN0ZXIlMkZub2RlX21vZHVsZXMlMkZzb25uZXIlMkZkaXN0JTJGaW5kZXgubWpzJTIyJTJDJTIyaWRzJTIyJTNBJTVCJTIyVG9hc3RlciUyMiU1RCU3RCZtb2R1bGVzPSU3QiUyMnJlcXVlc3QlMjIlM0ElMjIlMkZob21lJTJGd3NseHQlMkZjczQ3MiUyRmZhcmNhc3RlciUyRnNyYyUyRmFwcCUyRmdsb2JhbHMuY3NzJTIyJTJDJTIyaWRzJTIyJTNBJTVCJTVEJTdEJm1vZHVsZXM9JTdCJTIycmVxdWVzdCUyMiUzQSUyMiUyRmhvbWUlMkZ3c2x4dCUyRmNzNDcyJTJGZmFyY2FzdGVyJTJGc3JjJTJGYXBwJTJGcHJvdmlkZXJzLnRzeCUyMiUyQyUyMmlkcyUyMiUzQSU1QiUyMlByb3ZpZGVycyUyMiU1RCU3RCZtb2R1bGVzPSU3QiUyMnJlcXVlc3QlMjIlM0ElMjIlMkZob21lJTJGd3NseHQlMkZjczQ3MiUyRmZhcmNhc3RlciUyRnNyYyUyRmxpYiUyRndhbGxldC1jb250ZXh0LnRzeCUyMiUyQyUyMmlkcyUyMiUzQSU1QiUyMldhbGxldFByb3ZpZGVyJTIyJTVEJTdEJnNlcnZlcj1mYWxzZSEiLCJtYXBwaW5ncyI6IkFBQUEsa01BQWdJO0FBQ2hJO0FBQ0Esb0tBQW9GO0FBQ3BGO0FBQ0Esd0tBQXFIO0FBQ3JIO0FBQ0Esa0xBQStIIiwic291cmNlcyI6WyIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0KC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIsIHdlYnBhY2tFeHBvcnRzOiBbXCJUb2FzdGVyXCJdICovIFwiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9zb25uZXIvZGlzdC9pbmRleC5tanNcIik7XG47XG5pbXBvcnQoLyogd2VicGFja01vZGU6IFwiZWFnZXJcIiAqLyBcIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvYXBwL2dsb2JhbHMuY3NzXCIpO1xuO1xuaW1wb3J0KC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIsIHdlYnBhY2tFeHBvcnRzOiBbXCJQcm92aWRlcnNcIl0gKi8gXCIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvc3JjL2FwcC9wcm92aWRlcnMudHN4XCIpO1xuO1xuaW1wb3J0KC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIsIHdlYnBhY2tFeHBvcnRzOiBbXCJXYWxsZXRQcm92aWRlclwiXSAqLyBcIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvbGliL3dhbGxldC1jb250ZXh0LnRzeFwiKTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fnode_modules%2Fsonner%2Fdist%2Findex.mjs%22%2C%22ids%22%3A%5B%22Toaster%22%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Fapp%2Fproviders.tsx%22%2C%22ids%22%3A%5B%22Providers%22%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Flib%2Fwallet-context.tsx%22%2C%22ids%22%3A%5B%22WalletProvider%22%5D%7D&server=false!\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js":
/*!****************************************************************************************!*\
  !*** ./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js ***!
  \****************************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("/**\n * @license React\n * react-jsx-dev-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n true &&\n  (function () {\n    function getComponentNameFromType(type) {\n      if (null == type) return null;\n      if (\"function\" === typeof type)\n        return type.$$typeof === REACT_CLIENT_REFERENCE\n          ? null\n          : type.displayName || type.name || null;\n      if (\"string\" === typeof type) return type;\n      switch (type) {\n        case REACT_FRAGMENT_TYPE:\n          return \"Fragment\";\n        case REACT_PROFILER_TYPE:\n          return \"Profiler\";\n        case REACT_STRICT_MODE_TYPE:\n          return \"StrictMode\";\n        case REACT_SUSPENSE_TYPE:\n          return \"Suspense\";\n        case REACT_SUSPENSE_LIST_TYPE:\n          return \"SuspenseList\";\n        case REACT_ACTIVITY_TYPE:\n          return \"Activity\";\n      }\n      if (\"object\" === typeof type)\n        switch (\n          (\"number\" === typeof type.tag &&\n            console.error(\n              \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n            ),\n          type.$$typeof)\n        ) {\n          case REACT_PORTAL_TYPE:\n            return \"Portal\";\n          case REACT_CONTEXT_TYPE:\n            return type.displayName || \"Context\";\n          case REACT_CONSUMER_TYPE:\n            return (type._context.displayName || \"Context\") + \".Consumer\";\n          case REACT_FORWARD_REF_TYPE:\n            var innerType = type.render;\n            type = type.displayName;\n            type ||\n              ((type = innerType.displayName || innerType.name || \"\"),\n              (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n            return type;\n          case REACT_MEMO_TYPE:\n            return (\n              (innerType = type.displayName || null),\n              null !== innerType\n                ? innerType\n                : getComponentNameFromType(type.type) || \"Memo\"\n            );\n          case REACT_LAZY_TYPE:\n            innerType = type._payload;\n            type = type._init;\n            try {\n              return getComponentNameFromType(type(innerType));\n            } catch (x) {}\n        }\n      return null;\n    }\n    function testStringCoercion(value) {\n      return \"\" + value;\n    }\n    function checkKeyStringCoercion(value) {\n      try {\n        testStringCoercion(value);\n        var JSCompiler_inline_result = !1;\n      } catch (e) {\n        JSCompiler_inline_result = !0;\n      }\n      if (JSCompiler_inline_result) {\n        JSCompiler_inline_result = console;\n        var JSCompiler_temp_const = JSCompiler_inline_result.error;\n        var JSCompiler_inline_result$jscomp$0 =\n          (\"function\" === typeof Symbol &&\n            Symbol.toStringTag &&\n            value[Symbol.toStringTag]) ||\n          value.constructor.name ||\n          \"Object\";\n        JSCompiler_temp_const.call(\n          JSCompiler_inline_result,\n          \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n          JSCompiler_inline_result$jscomp$0\n        );\n        return testStringCoercion(value);\n      }\n    }\n    function getTaskName(type) {\n      if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n      if (\n        \"object\" === typeof type &&\n        null !== type &&\n        type.$$typeof === REACT_LAZY_TYPE\n      )\n        return \"<...>\";\n      try {\n        var name = getComponentNameFromType(type);\n        return name ? \"<\" + name + \">\" : \"<...>\";\n      } catch (x) {\n        return \"<...>\";\n      }\n    }\n    function getOwner() {\n      var dispatcher = ReactSharedInternals.A;\n      return null === dispatcher ? null : dispatcher.getOwner();\n    }\n    function UnknownOwner() {\n      return Error(\"react-stack-top-frame\");\n    }\n    function hasValidKey(config) {\n      if (hasOwnProperty.call(config, \"key\")) {\n        var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n        if (getter && getter.isReactWarning) return !1;\n      }\n      return void 0 !== config.key;\n    }\n    function defineKeyPropWarningGetter(props, displayName) {\n      function warnAboutAccessingKey() {\n        specialPropKeyWarningShown ||\n          ((specialPropKeyWarningShown = !0),\n          console.error(\n            \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n            displayName\n          ));\n      }\n      warnAboutAccessingKey.isReactWarning = !0;\n      Object.defineProperty(props, \"key\", {\n        get: warnAboutAccessingKey,\n        configurable: !0\n      });\n    }\n    function elementRefGetterWithDeprecationWarning() {\n      var componentName = getComponentNameFromType(this.type);\n      didWarnAboutElementRef[componentName] ||\n        ((didWarnAboutElementRef[componentName] = !0),\n        console.error(\n          \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n        ));\n      componentName = this.props.ref;\n      return void 0 !== componentName ? componentName : null;\n    }\n    function ReactElement(type, key, props, owner, debugStack, debugTask) {\n      var refProp = props.ref;\n      type = {\n        $$typeof: REACT_ELEMENT_TYPE,\n        type: type,\n        key: key,\n        props: props,\n        _owner: owner\n      };\n      null !== (void 0 !== refProp ? refProp : null)\n        ? Object.defineProperty(type, \"ref\", {\n            enumerable: !1,\n            get: elementRefGetterWithDeprecationWarning\n          })\n        : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n      type._store = {};\n      Object.defineProperty(type._store, \"validated\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: 0\n      });\n      Object.defineProperty(type, \"_debugInfo\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: null\n      });\n      Object.defineProperty(type, \"_debugStack\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: debugStack\n      });\n      Object.defineProperty(type, \"_debugTask\", {\n        configurable: !1,\n        enumerable: !1,\n        writable: !0,\n        value: debugTask\n      });\n      Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n      return type;\n    }\n    function jsxDEVImpl(\n      type,\n      config,\n      maybeKey,\n      isStaticChildren,\n      debugStack,\n      debugTask\n    ) {\n      var children = config.children;\n      if (void 0 !== children)\n        if (isStaticChildren)\n          if (isArrayImpl(children)) {\n            for (\n              isStaticChildren = 0;\n              isStaticChildren < children.length;\n              isStaticChildren++\n            )\n              validateChildKeys(children[isStaticChildren]);\n            Object.freeze && Object.freeze(children);\n          } else\n            console.error(\n              \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n            );\n        else validateChildKeys(children);\n      if (hasOwnProperty.call(config, \"key\")) {\n        children = getComponentNameFromType(type);\n        var keys = Object.keys(config).filter(function (k) {\n          return \"key\" !== k;\n        });\n        isStaticChildren =\n          0 < keys.length\n            ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n            : \"{key: someKey}\";\n        didWarnAboutKeySpread[children + isStaticChildren] ||\n          ((keys =\n            0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n          console.error(\n            'A props object containing a \"key\" prop is being spread into JSX:\\n  let props = %s;\\n  <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n  let props = %s;\\n  <%s key={someKey} {...props} />',\n            isStaticChildren,\n            children,\n            keys,\n            children\n          ),\n          (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n      }\n      children = null;\n      void 0 !== maybeKey &&\n        (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n      hasValidKey(config) &&\n        (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n      if (\"key\" in config) {\n        maybeKey = {};\n        for (var propName in config)\n          \"key\" !== propName && (maybeKey[propName] = config[propName]);\n      } else maybeKey = config;\n      children &&\n        defineKeyPropWarningGetter(\n          maybeKey,\n          \"function\" === typeof type\n            ? type.displayName || type.name || \"Unknown\"\n            : type\n        );\n      return ReactElement(\n        type,\n        children,\n        maybeKey,\n        getOwner(),\n        debugStack,\n        debugTask\n      );\n    }\n    function validateChildKeys(node) {\n      \"object\" === typeof node &&\n        null !== node &&\n        node.$$typeof === REACT_ELEMENT_TYPE &&\n        node._store &&\n        (node._store.validated = 1);\n    }\n    var React = __webpack_require__(/*! next/dist/compiled/react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\"),\n      REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n      REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n      REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n      REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n      REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n      REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n      REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n      REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n      REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n      REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n      REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n      REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n      REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n      REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n      ReactSharedInternals =\n        React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n      hasOwnProperty = Object.prototype.hasOwnProperty,\n      isArrayImpl = Array.isArray,\n      createTask = console.createTask\n        ? console.createTask\n        : function () {\n            return null;\n          };\n    React = {\n      react_stack_bottom_frame: function (callStackForError) {\n        return callStackForError();\n      }\n    };\n    var specialPropKeyWarningShown;\n    var didWarnAboutElementRef = {};\n    var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n      React,\n      UnknownOwner\n    )();\n    var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n    var didWarnAboutKeySpread = {};\n    exports.Fragment = REACT_FRAGMENT_TYPE;\n    exports.jsxDEV = function (type, config, maybeKey, isStaticChildren) {\n      var trackActualOwner =\n        1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n      return jsxDEVImpl(\n        type,\n        config,\n        maybeKey,\n        isStaticChildren,\n        trackActualOwner\n          ? Error(\"react-stack-top-frame\")\n          : unknownOwnerDebugStack,\n        trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n      );\n    };\n  })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvcmVhY3QvY2pzL3JlYWN0LWpzeC1kZXYtcnVudGltZS5kZXZlbG9wbWVudC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRWE7QUFDYixLQUFxQztBQUNyQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGNBQWM7QUFDZDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWCwrQ0FBK0MsNkJBQTZCO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxnQkFBZ0IsZ0RBQWdEO0FBQ2hFLGdCQUFnQixhQUFhO0FBQzdCO0FBQ0E7QUFDQSxnQ0FBZ0Msa0NBQWtDLE9BQU87QUFDekU7QUFDQSxnR0FBZ0csU0FBUyxVQUFVLHNGQUFzRixhQUFhLFVBQVUsVUFBVTtBQUMxTztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLG1CQUFPLENBQUMsc0dBQTBCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksZ0JBQWdCO0FBQ3BCLElBQUksY0FBYztBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUciLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NvbXBpbGVkL3JlYWN0L2Nqcy9yZWFjdC1qc3gtZGV2LXJ1bnRpbWUuZGV2ZWxvcG1lbnQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtanN4LWRldi1ydW50aW1lLmRldmVsb3BtZW50LmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG5cInVzZSBzdHJpY3RcIjtcblwicHJvZHVjdGlvblwiICE9PSBwcm9jZXNzLmVudi5OT0RFX0VOViAmJlxuICAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKSB7XG4gICAgICBpZiAobnVsbCA9PSB0eXBlKSByZXR1cm4gbnVsbDtcbiAgICAgIGlmIChcImZ1bmN0aW9uXCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICByZXR1cm4gdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgbnVsbDtcbiAgICAgIGlmIChcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSkgcmV0dXJuIHR5cGU7XG4gICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgY2FzZSBSRUFDVF9GUkFHTUVOVF9UWVBFOlxuICAgICAgICAgIHJldHVybiBcIkZyYWdtZW50XCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfUFJPRklMRVJfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJQcm9maWxlclwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3RyaWN0TW9kZVwiO1xuICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VcIjtcbiAgICAgICAgY2FzZSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU6XG4gICAgICAgICAgcmV0dXJuIFwiU3VzcGVuc2VMaXN0XCI7XG4gICAgICAgIGNhc2UgUkVBQ1RfQUNUSVZJVFlfVFlQRTpcbiAgICAgICAgICByZXR1cm4gXCJBY3Rpdml0eVwiO1xuICAgICAgfVxuICAgICAgaWYgKFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlKVxuICAgICAgICBzd2l0Y2ggKFxuICAgICAgICAgIChcIm51bWJlclwiID09PSB0eXBlb2YgdHlwZS50YWcgJiZcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIFwiUmVjZWl2ZWQgYW4gdW5leHBlY3RlZCBvYmplY3QgaW4gZ2V0Q29tcG9uZW50TmFtZUZyb21UeXBlKCkuIFRoaXMgaXMgbGlrZWx5IGEgYnVnIGluIFJlYWN0LiBQbGVhc2UgZmlsZSBhbiBpc3N1ZS5cIlxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB0eXBlLiQkdHlwZW9mKVxuICAgICAgICApIHtcbiAgICAgICAgICBjYXNlIFJFQUNUX1BPUlRBTF9UWVBFOlxuICAgICAgICAgICAgcmV0dXJuIFwiUG9ydGFsXCI7XG4gICAgICAgICAgY2FzZSBSRUFDVF9DT05URVhUX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCBcIkNvbnRleHRcIjtcbiAgICAgICAgICBjYXNlIFJFQUNUX0NPTlNVTUVSX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKHR5cGUuX2NvbnRleHQuZGlzcGxheU5hbWUgfHwgXCJDb250ZXh0XCIpICsgXCIuQ29uc3VtZXJcIjtcbiAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG4gICAgICAgICAgICB2YXIgaW5uZXJUeXBlID0gdHlwZS5yZW5kZXI7XG4gICAgICAgICAgICB0eXBlID0gdHlwZS5kaXNwbGF5TmFtZTtcbiAgICAgICAgICAgIHR5cGUgfHxcbiAgICAgICAgICAgICAgKCh0eXBlID0gaW5uZXJUeXBlLmRpc3BsYXlOYW1lIHx8IGlubmVyVHlwZS5uYW1lIHx8IFwiXCIpLFxuICAgICAgICAgICAgICAodHlwZSA9IFwiXCIgIT09IHR5cGUgPyBcIkZvcndhcmRSZWYoXCIgKyB0eXBlICsgXCIpXCIgOiBcIkZvcndhcmRSZWZcIikpO1xuICAgICAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAoaW5uZXJUeXBlID0gdHlwZS5kaXNwbGF5TmFtZSB8fCBudWxsKSxcbiAgICAgICAgICAgICAgbnVsbCAhPT0gaW5uZXJUeXBlXG4gICAgICAgICAgICAgICAgPyBpbm5lclR5cGVcbiAgICAgICAgICAgICAgICA6IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlLnR5cGUpIHx8IFwiTWVtb1wiXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNhc2UgUkVBQ1RfTEFaWV9UWVBFOlxuICAgICAgICAgICAgaW5uZXJUeXBlID0gdHlwZS5fcGF5bG9hZDtcbiAgICAgICAgICAgIHR5cGUgPSB0eXBlLl9pbml0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKGlubmVyVHlwZSkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoeCkge31cbiAgICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRlc3RTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAgICAgcmV0dXJuIFwiXCIgKyB2YWx1ZTtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2hlY2tLZXlTdHJpbmdDb2VyY2lvbih2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCA9ICExO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQgPSAhMDtcbiAgICAgIH1cbiAgICAgIGlmIChKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQpIHtcbiAgICAgICAgSlNDb21waWxlcl9pbmxpbmVfcmVzdWx0ID0gY29uc29sZTtcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfdGVtcF9jb25zdCA9IEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdC5lcnJvcjtcbiAgICAgICAgdmFyIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMCA9XG4gICAgICAgICAgKFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIFN5bWJvbCAmJlxuICAgICAgICAgICAgU3ltYm9sLnRvU3RyaW5nVGFnICYmXG4gICAgICAgICAgICB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddKSB8fFxuICAgICAgICAgIHZhbHVlLmNvbnN0cnVjdG9yLm5hbWUgfHxcbiAgICAgICAgICBcIk9iamVjdFwiO1xuICAgICAgICBKU0NvbXBpbGVyX3RlbXBfY29uc3QuY2FsbChcbiAgICAgICAgICBKU0NvbXBpbGVyX2lubGluZV9yZXN1bHQsXG4gICAgICAgICAgXCJUaGUgcHJvdmlkZWQga2V5IGlzIGFuIHVuc3VwcG9ydGVkIHR5cGUgJXMuIFRoaXMgdmFsdWUgbXVzdCBiZSBjb2VyY2VkIHRvIGEgc3RyaW5nIGJlZm9yZSB1c2luZyBpdCBoZXJlLlwiLFxuICAgICAgICAgIEpTQ29tcGlsZXJfaW5saW5lX3Jlc3VsdCRqc2NvbXAkMFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGVzdFN0cmluZ0NvZXJjaW9uKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0VGFza05hbWUodHlwZSkge1xuICAgICAgaWYgKHR5cGUgPT09IFJFQUNUX0ZSQUdNRU5UX1RZUEUpIHJldHVybiBcIjw+XCI7XG4gICAgICBpZiAoXG4gICAgICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiB0eXBlICYmXG4gICAgICAgIG51bGwgIT09IHR5cGUgJiZcbiAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFXG4gICAgICApXG4gICAgICAgIHJldHVybiBcIjwuLi4+XCI7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbmFtZSA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgICAgcmV0dXJuIG5hbWUgPyBcIjxcIiArIG5hbWUgKyBcIj5cIiA6IFwiPC4uLj5cIjtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgcmV0dXJuIFwiPC4uLj5cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0T3duZXIoKSB7XG4gICAgICB2YXIgZGlzcGF0Y2hlciA9IFJlYWN0U2hhcmVkSW50ZXJuYWxzLkE7XG4gICAgICByZXR1cm4gbnVsbCA9PT0gZGlzcGF0Y2hlciA/IG51bGwgOiBkaXNwYXRjaGVyLmdldE93bmVyKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIFVua25vd25Pd25lcigpIHtcbiAgICAgIHJldHVybiBFcnJvcihcInJlYWN0LXN0YWNrLXRvcC1mcmFtZVwiKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gaGFzVmFsaWRLZXkoY29uZmlnKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChjb25maWcsIFwia2V5XCIpKSB7XG4gICAgICAgIHZhciBnZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbmZpZywgXCJrZXlcIikuZ2V0O1xuICAgICAgICBpZiAoZ2V0dGVyICYmIGdldHRlci5pc1JlYWN0V2FybmluZykgcmV0dXJuICExO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gY29uZmlnLmtleTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIocHJvcHMsIGRpc3BsYXlOYW1lKSB7XG4gICAgICBmdW5jdGlvbiB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkoKSB7XG4gICAgICAgIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duIHx8XG4gICAgICAgICAgKChzcGVjaWFsUHJvcEtleVdhcm5pbmdTaG93biA9ICEwKSxcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgXCIlczogYGtleWAgaXMgbm90IGEgcHJvcC4gVHJ5aW5nIHRvIGFjY2VzcyBpdCB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBiZWluZyByZXR1cm5lZC4gSWYgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBzYW1lIHZhbHVlIHdpdGhpbiB0aGUgY2hpbGQgY29tcG9uZW50LCB5b3Ugc2hvdWxkIHBhc3MgaXQgYXMgYSBkaWZmZXJlbnQgcHJvcC4gKGh0dHBzOi8vcmVhY3QuZGV2L2xpbmsvc3BlY2lhbC1wcm9wcylcIixcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lXG4gICAgICAgICAgKSk7XG4gICAgICB9XG4gICAgICB3YXJuQWJvdXRBY2Nlc3NpbmdLZXkuaXNSZWFjdFdhcm5pbmcgPSAhMDtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm9wcywgXCJrZXlcIiwge1xuICAgICAgICBnZXQ6IHdhcm5BYm91dEFjY2Vzc2luZ0tleSxcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGVsZW1lbnRSZWZHZXR0ZXJXaXRoRGVwcmVjYXRpb25XYXJuaW5nKCkge1xuICAgICAgdmFyIGNvbXBvbmVudE5hbWUgPSBnZXRDb21wb25lbnROYW1lRnJvbVR5cGUodGhpcy50eXBlKTtcbiAgICAgIGRpZFdhcm5BYm91dEVsZW1lbnRSZWZbY29tcG9uZW50TmFtZV0gfHxcbiAgICAgICAgKChkaWRXYXJuQWJvdXRFbGVtZW50UmVmW2NvbXBvbmVudE5hbWVdID0gITApLFxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIFwiQWNjZXNzaW5nIGVsZW1lbnQucmVmIHdhcyByZW1vdmVkIGluIFJlYWN0IDE5LiByZWYgaXMgbm93IGEgcmVndWxhciBwcm9wLiBJdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgSlNYIEVsZW1lbnQgdHlwZSBpbiBhIGZ1dHVyZSByZWxlYXNlLlwiXG4gICAgICAgICkpO1xuICAgICAgY29tcG9uZW50TmFtZSA9IHRoaXMucHJvcHMucmVmO1xuICAgICAgcmV0dXJuIHZvaWQgMCAhPT0gY29tcG9uZW50TmFtZSA/IGNvbXBvbmVudE5hbWUgOiBudWxsO1xuICAgIH1cbiAgICBmdW5jdGlvbiBSZWFjdEVsZW1lbnQodHlwZSwga2V5LCBwcm9wcywgb3duZXIsIGRlYnVnU3RhY2ssIGRlYnVnVGFzaykge1xuICAgICAgdmFyIHJlZlByb3AgPSBwcm9wcy5yZWY7XG4gICAgICB0eXBlID0ge1xuICAgICAgICAkJHR5cGVvZjogUkVBQ1RfRUxFTUVOVF9UWVBFLFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgICBfb3duZXI6IG93bmVyXG4gICAgICB9O1xuICAgICAgbnVsbCAhPT0gKHZvaWQgMCAhPT0gcmVmUHJvcCA/IHJlZlByb3AgOiBudWxsKVxuICAgICAgICA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcInJlZlwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiAhMSxcbiAgICAgICAgICAgIGdldDogZWxlbWVudFJlZkdldHRlcldpdGhEZXByZWNhdGlvbldhcm5pbmdcbiAgICAgICAgICB9KVxuICAgICAgICA6IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcInJlZlwiLCB7IGVudW1lcmFibGU6ICExLCB2YWx1ZTogbnVsbCB9KTtcbiAgICAgIHR5cGUuX3N0b3JlID0ge307XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZS5fc3RvcmUsIFwidmFsaWRhdGVkXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMSxcbiAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgICAgdmFsdWU6IDBcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIFwiX2RlYnVnSW5mb1wiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITEsXG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICB3cml0YWJsZTogITAsXG4gICAgICAgIHZhbHVlOiBudWxsXG4gICAgICB9KTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBcIl9kZWJ1Z1N0YWNrXCIsIHtcbiAgICAgICAgY29uZmlndXJhYmxlOiAhMSxcbiAgICAgICAgZW51bWVyYWJsZTogITEsXG4gICAgICAgIHdyaXRhYmxlOiAhMCxcbiAgICAgICAgdmFsdWU6IGRlYnVnU3RhY2tcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIFwiX2RlYnVnVGFza1wiLCB7XG4gICAgICAgIGNvbmZpZ3VyYWJsZTogITEsXG4gICAgICAgIGVudW1lcmFibGU6ICExLFxuICAgICAgICB3cml0YWJsZTogITAsXG4gICAgICAgIHZhbHVlOiBkZWJ1Z1Rhc2tcbiAgICAgIH0pO1xuICAgICAgT2JqZWN0LmZyZWV6ZSAmJiAoT2JqZWN0LmZyZWV6ZSh0eXBlLnByb3BzKSwgT2JqZWN0LmZyZWV6ZSh0eXBlKSk7XG4gICAgICByZXR1cm4gdHlwZTtcbiAgICB9XG4gICAgZnVuY3Rpb24ganN4REVWSW1wbChcbiAgICAgIHR5cGUsXG4gICAgICBjb25maWcsXG4gICAgICBtYXliZUtleSxcbiAgICAgIGlzU3RhdGljQ2hpbGRyZW4sXG4gICAgICBkZWJ1Z1N0YWNrLFxuICAgICAgZGVidWdUYXNrXG4gICAgKSB7XG4gICAgICB2YXIgY2hpbGRyZW4gPSBjb25maWcuY2hpbGRyZW47XG4gICAgICBpZiAodm9pZCAwICE9PSBjaGlsZHJlbilcbiAgICAgICAgaWYgKGlzU3RhdGljQ2hpbGRyZW4pXG4gICAgICAgICAgaWYgKGlzQXJyYXlJbXBsKGNoaWxkcmVuKSkge1xuICAgICAgICAgICAgZm9yIChcbiAgICAgICAgICAgICAgaXNTdGF0aWNDaGlsZHJlbiA9IDA7XG4gICAgICAgICAgICAgIGlzU3RhdGljQ2hpbGRyZW4gPCBjaGlsZHJlbi5sZW5ndGg7XG4gICAgICAgICAgICAgIGlzU3RhdGljQ2hpbGRyZW4rK1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB2YWxpZGF0ZUNoaWxkS2V5cyhjaGlsZHJlbltpc1N0YXRpY0NoaWxkcmVuXSk7XG4gICAgICAgICAgICBPYmplY3QuZnJlZXplICYmIE9iamVjdC5mcmVlemUoY2hpbGRyZW4pO1xuICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgXCJSZWFjdC5qc3g6IFN0YXRpYyBjaGlsZHJlbiBzaG91bGQgYWx3YXlzIGJlIGFuIGFycmF5LiBZb3UgYXJlIGxpa2VseSBleHBsaWNpdGx5IGNhbGxpbmcgUmVhY3QuanN4cyBvciBSZWFjdC5qc3hERVYuIFVzZSB0aGUgQmFiZWwgdHJhbnNmb3JtIGluc3RlYWQuXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIGVsc2UgdmFsaWRhdGVDaGlsZEtleXMoY2hpbGRyZW4pO1xuICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwoY29uZmlnLCBcImtleVwiKSkge1xuICAgICAgICBjaGlsZHJlbiA9IGdldENvbXBvbmVudE5hbWVGcm9tVHlwZSh0eXBlKTtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhjb25maWcpLmZpbHRlcihmdW5jdGlvbiAoaykge1xuICAgICAgICAgIHJldHVybiBcImtleVwiICE9PSBrO1xuICAgICAgICB9KTtcbiAgICAgICAgaXNTdGF0aWNDaGlsZHJlbiA9XG4gICAgICAgICAgMCA8IGtleXMubGVuZ3RoXG4gICAgICAgICAgICA/IFwie2tleTogc29tZUtleSwgXCIgKyBrZXlzLmpvaW4oXCI6IC4uLiwgXCIpICsgXCI6IC4uLn1cIlxuICAgICAgICAgICAgOiBcIntrZXk6IHNvbWVLZXl9XCI7XG4gICAgICAgIGRpZFdhcm5BYm91dEtleVNwcmVhZFtjaGlsZHJlbiArIGlzU3RhdGljQ2hpbGRyZW5dIHx8XG4gICAgICAgICAgKChrZXlzID1cbiAgICAgICAgICAgIDAgPCBrZXlzLmxlbmd0aCA/IFwie1wiICsga2V5cy5qb2luKFwiOiAuLi4sIFwiKSArIFwiOiAuLi59XCIgOiBcInt9XCIpLFxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAnQSBwcm9wcyBvYmplY3QgY29udGFpbmluZyBhIFwia2V5XCIgcHJvcCBpcyBiZWluZyBzcHJlYWQgaW50byBKU1g6XFxuICBsZXQgcHJvcHMgPSAlcztcXG4gIDwlcyB7Li4ucHJvcHN9IC8+XFxuUmVhY3Qga2V5cyBtdXN0IGJlIHBhc3NlZCBkaXJlY3RseSB0byBKU1ggd2l0aG91dCB1c2luZyBzcHJlYWQ6XFxuICBsZXQgcHJvcHMgPSAlcztcXG4gIDwlcyBrZXk9e3NvbWVLZXl9IHsuLi5wcm9wc30gLz4nLFxuICAgICAgICAgICAgaXNTdGF0aWNDaGlsZHJlbixcbiAgICAgICAgICAgIGNoaWxkcmVuLFxuICAgICAgICAgICAga2V5cyxcbiAgICAgICAgICAgIGNoaWxkcmVuXG4gICAgICAgICAgKSxcbiAgICAgICAgICAoZGlkV2FybkFib3V0S2V5U3ByZWFkW2NoaWxkcmVuICsgaXNTdGF0aWNDaGlsZHJlbl0gPSAhMCkpO1xuICAgICAgfVxuICAgICAgY2hpbGRyZW4gPSBudWxsO1xuICAgICAgdm9pZCAwICE9PSBtYXliZUtleSAmJlxuICAgICAgICAoY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihtYXliZUtleSksIChjaGlsZHJlbiA9IFwiXCIgKyBtYXliZUtleSkpO1xuICAgICAgaGFzVmFsaWRLZXkoY29uZmlnKSAmJlxuICAgICAgICAoY2hlY2tLZXlTdHJpbmdDb2VyY2lvbihjb25maWcua2V5KSwgKGNoaWxkcmVuID0gXCJcIiArIGNvbmZpZy5rZXkpKTtcbiAgICAgIGlmIChcImtleVwiIGluIGNvbmZpZykge1xuICAgICAgICBtYXliZUtleSA9IHt9O1xuICAgICAgICBmb3IgKHZhciBwcm9wTmFtZSBpbiBjb25maWcpXG4gICAgICAgICAgXCJrZXlcIiAhPT0gcHJvcE5hbWUgJiYgKG1heWJlS2V5W3Byb3BOYW1lXSA9IGNvbmZpZ1twcm9wTmFtZV0pO1xuICAgICAgfSBlbHNlIG1heWJlS2V5ID0gY29uZmlnO1xuICAgICAgY2hpbGRyZW4gJiZcbiAgICAgICAgZGVmaW5lS2V5UHJvcFdhcm5pbmdHZXR0ZXIoXG4gICAgICAgICAgbWF5YmVLZXksXG4gICAgICAgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdHlwZVxuICAgICAgICAgICAgPyB0eXBlLmRpc3BsYXlOYW1lIHx8IHR5cGUubmFtZSB8fCBcIlVua25vd25cIlxuICAgICAgICAgICAgOiB0eXBlXG4gICAgICAgICk7XG4gICAgICByZXR1cm4gUmVhY3RFbGVtZW50KFxuICAgICAgICB0eXBlLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgbWF5YmVLZXksXG4gICAgICAgIGdldE93bmVyKCksXG4gICAgICAgIGRlYnVnU3RhY2ssXG4gICAgICAgIGRlYnVnVGFza1xuICAgICAgKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gdmFsaWRhdGVDaGlsZEtleXMobm9kZSkge1xuICAgICAgXCJvYmplY3RcIiA9PT0gdHlwZW9mIG5vZGUgJiZcbiAgICAgICAgbnVsbCAhPT0gbm9kZSAmJlxuICAgICAgICBub2RlLiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEUgJiZcbiAgICAgICAgbm9kZS5fc3RvcmUgJiZcbiAgICAgICAgKG5vZGUuX3N0b3JlLnZhbGlkYXRlZCA9IDEpO1xuICAgIH1cbiAgICB2YXIgUmVhY3QgPSByZXF1aXJlKFwibmV4dC9kaXN0L2NvbXBpbGVkL3JlYWN0XCIpLFxuICAgICAgUkVBQ1RfRUxFTUVOVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnRyYW5zaXRpb25hbC5lbGVtZW50XCIpLFxuICAgICAgUkVBQ1RfUE9SVEFMX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLFxuICAgICAgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxcbiAgICAgIFJFQUNUX1NUUklDVF9NT0RFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3RyaWN0X21vZGVcIiksXG4gICAgICBSRUFDVF9QUk9GSUxFUl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLFxuICAgICAgUkVBQ1RfQ09OU1VNRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jb25zdW1lclwiKSxcbiAgICAgIFJFQUNUX0NPTlRFWFRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jb250ZXh0XCIpLFxuICAgICAgUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mb3J3YXJkX3JlZlwiKSxcbiAgICAgIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIiksXG4gICAgICBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKSxcbiAgICAgIFJFQUNUX01FTU9fVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpLFxuICAgICAgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmxhenlcIiksXG4gICAgICBSRUFDVF9BQ1RJVklUWV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmFjdGl2aXR5XCIpLFxuICAgICAgUkVBQ1RfQ0xJRU5UX1JFRkVSRU5DRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jbGllbnQucmVmZXJlbmNlXCIpLFxuICAgICAgUmVhY3RTaGFyZWRJbnRlcm5hbHMgPVxuICAgICAgICBSZWFjdC5fX0NMSUVOVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9XQVJOX1VTRVJTX1RIRVlfQ0FOTk9UX1VQR1JBREUsXG4gICAgICBoYXNPd25Qcm9wZXJ0eSA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksXG4gICAgICBpc0FycmF5SW1wbCA9IEFycmF5LmlzQXJyYXksXG4gICAgICBjcmVhdGVUYXNrID0gY29uc29sZS5jcmVhdGVUYXNrXG4gICAgICAgID8gY29uc29sZS5jcmVhdGVUYXNrXG4gICAgICAgIDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfTtcbiAgICBSZWFjdCA9IHtcbiAgICAgIHJlYWN0X3N0YWNrX2JvdHRvbV9mcmFtZTogZnVuY3Rpb24gKGNhbGxTdGFja0ZvckVycm9yKSB7XG4gICAgICAgIHJldHVybiBjYWxsU3RhY2tGb3JFcnJvcigpO1xuICAgICAgfVxuICAgIH07XG4gICAgdmFyIHNwZWNpYWxQcm9wS2V5V2FybmluZ1Nob3duO1xuICAgIHZhciBkaWRXYXJuQWJvdXRFbGVtZW50UmVmID0ge307XG4gICAgdmFyIHVua25vd25Pd25lckRlYnVnU3RhY2sgPSBSZWFjdC5yZWFjdF9zdGFja19ib3R0b21fZnJhbWUuYmluZChcbiAgICAgIFJlYWN0LFxuICAgICAgVW5rbm93bk93bmVyXG4gICAgKSgpO1xuICAgIHZhciB1bmtub3duT3duZXJEZWJ1Z1Rhc2sgPSBjcmVhdGVUYXNrKGdldFRhc2tOYW1lKFVua25vd25Pd25lcikpO1xuICAgIHZhciBkaWRXYXJuQWJvdXRLZXlTcHJlYWQgPSB7fTtcbiAgICBleHBvcnRzLkZyYWdtZW50ID0gUkVBQ1RfRlJBR01FTlRfVFlQRTtcbiAgICBleHBvcnRzLmpzeERFViA9IGZ1bmN0aW9uICh0eXBlLCBjb25maWcsIG1heWJlS2V5LCBpc1N0YXRpY0NoaWxkcmVuKSB7XG4gICAgICB2YXIgdHJhY2tBY3R1YWxPd25lciA9XG4gICAgICAgIDFlNCA+IFJlYWN0U2hhcmVkSW50ZXJuYWxzLnJlY2VudGx5Q3JlYXRlZE93bmVyU3RhY2tzKys7XG4gICAgICByZXR1cm4ganN4REVWSW1wbChcbiAgICAgICAgdHlwZSxcbiAgICAgICAgY29uZmlnLFxuICAgICAgICBtYXliZUtleSxcbiAgICAgICAgaXNTdGF0aWNDaGlsZHJlbixcbiAgICAgICAgdHJhY2tBY3R1YWxPd25lclxuICAgICAgICAgID8gRXJyb3IoXCJyZWFjdC1zdGFjay10b3AtZnJhbWVcIilcbiAgICAgICAgICA6IHVua25vd25Pd25lckRlYnVnU3RhY2ssXG4gICAgICAgIHRyYWNrQWN0dWFsT3duZXIgPyBjcmVhdGVUYXNrKGdldFRhc2tOYW1lKHR5cGUpKSA6IHVua25vd25Pd25lckRlYnVnVGFza1xuICAgICAgKTtcbiAgICB9O1xuICB9KSgpO1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js":
/*!******************************************************************!*\
  !*** ./node_modules/next/dist/compiled/react/jsx-dev-runtime.js ***!
  \******************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\n\nif (false) {} else {\n  module.exports = __webpack_require__(/*! ./cjs/react-jsx-dev-runtime.development.js */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/cjs/react-jsx-dev-runtime.development.js\");\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY29tcGlsZWQvcmVhY3QvanN4LWRldi1ydW50aW1lLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViLElBQUksS0FBcUMsRUFBRSxFQUUxQyxDQUFDO0FBQ0YsRUFBRSw4TEFBc0U7QUFDeEUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NvbXBpbGVkL3JlYWN0L2pzeC1kZXYtcnVudGltZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIHN0cmljdCc7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LWRldi1ydW50aW1lLnByb2R1Y3Rpb24uanMnKTtcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9janMvcmVhY3QtanN4LWRldi1ydW50aW1lLmRldmVsb3BtZW50LmpzJyk7XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/next/dist/shared/lib/app-dynamic.js":
/*!**********************************************************!*\
  !*** ./node_modules/next/dist/shared/lib/app-dynamic.js ***!
  \**********************************************************/
/***/ ((module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n    value: true\n}));\nObject.defineProperty(exports, \"default\", ({\n    enumerable: true,\n    get: function() {\n        return dynamic;\n    }\n}));\nconst _interop_require_default = __webpack_require__(/*! @swc/helpers/_/_interop_require_default */ \"(app-pages-browser)/./node_modules/@swc/helpers/esm/_interop_require_default.js\");\nconst _loadable = /*#__PURE__*/ _interop_require_default._(__webpack_require__(/*! ./lazy-dynamic/loadable */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/lazy-dynamic/loadable.js\"));\nfunction dynamic(dynamicOptions, options) {\n    var _mergedOptions_loadableGenerated;\n    const loadableOptions = {};\n    if (typeof dynamicOptions === 'function') {\n        loadableOptions.loader = dynamicOptions;\n    }\n    const mergedOptions = {\n        ...loadableOptions,\n        ...options\n    };\n    return (0, _loadable.default)({\n        ...mergedOptions,\n        modules: (_mergedOptions_loadableGenerated = mergedOptions.loadableGenerated) == null ? void 0 : _mergedOptions_loadableGenerated.modules\n    });\n}\nif ((typeof exports.default === 'function' || typeof exports.default === 'object' && exports.default !== null) && typeof exports.default.__esModule === 'undefined') {\n    Object.defineProperty(exports.default, '__esModule', {\n        value: true\n    });\n    Object.assign(exports.default, exports);\n    module.exports = exports.default;\n} //# sourceMappingURL=app-dynamic.js.map\n\n\n;\n    // Wrapped in an IIFE to avoid polluting the global scope\n    ;\n    (function () {\n        var _a, _b;\n        // Legacy CSS implementations will `eval` browser code in a Node.js context\n        // to extract CSS. For backwards compatibility, we need to check we're in a\n        // browser context before continuing.\n        if (typeof self !== 'undefined' &&\n            // AMP / No-JS mode does not inject these helpers:\n            '$RefreshHelpers$' in self) {\n            // @ts-ignore __webpack_module__ is global\n            var currentExports = module.exports;\n            // @ts-ignore __webpack_module__ is global\n            var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n            // This cannot happen in MainTemplate because the exports mismatch between\n            // templating and execution.\n            self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n            // A module can be accepted automatically based on its exports, e.g. when\n            // it is a Refresh Boundary.\n            if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n                // Save the previous exports signature on update so we can compare the boundary\n                // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n                module.hot.dispose(function (data) {\n                    data.prevSignature =\n                        self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n                });\n                // Unconditionally accept an update to this module, we'll check if it's\n                // still a Refresh Boundary later.\n                // @ts-ignore importMeta is replaced in the loader\n                module.hot.accept();\n                // This field is set when the previous version of this module was a\n                // Refresh Boundary, letting us know we need to check for invalidation or\n                // enqueue an update.\n                if (prevSignature !== null) {\n                    // A boundary can become ineligible if its exports are incompatible\n                    // with the previous exports.\n                    //\n                    // For example, if you add/remove/change exports, we'll want to\n                    // re-execute the importing modules, and force those components to\n                    // re-render. Similarly, if you convert a class component to a\n                    // function, we want to invalidate the boundary.\n                    if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n                        module.hot.invalidate();\n                    }\n                    else {\n                        self.$RefreshHelpers$.scheduleUpdate();\n                    }\n                }\n            }\n            else {\n                // Since we just executed the code for the module, it's possible that the\n                // new exports made it ineligible for being a boundary.\n                // We only care about the case when we were _previously_ a boundary,\n                // because we already accepted this update (accidental side effect).\n                var isNoLongerABoundary = prevSignature !== null;\n                if (isNoLongerABoundary) {\n                    module.hot.invalidate();\n                }\n            }\n        }\n    })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2hhcmVkL2xpYi9hcHAtZHluYW1pYy5qcyIsIm1hcHBpbmdzIjoiOzs7OzJDQWtDQTs7O2VBQXdCQTs7OzsrRUFoQ0g7QUFnQ04sU0FBU0EsUUFDdEJDLGNBQTZDLEVBQzdDQyxPQUEyQjtRQWVoQkM7SUFiWCxNQUFNQyxrQkFBc0MsQ0FBQztJQUU3QyxJQUFJLE9BQU9ILG1CQUFtQixZQUFZO1FBQ3hDRyxnQkFBZ0JDLE1BQU0sR0FBR0o7SUFDM0I7SUFFQSxNQUFNRSxnQkFBZ0I7UUFDcEIsR0FBR0MsZUFBZTtRQUNsQixHQUFHRixPQUFPO0lBQ1o7SUFFQSxPQUFPSSxDQUFBQSxHQUFBQSxVQUFBQSxPQUFBQSxFQUFTO1FBQ2QsR0FBR0gsYUFBYTtRQUNoQkksT0FBTyxHQUFFSixtQ0FBQUEsY0FBY0ssaUJBQUFBLEtBQWlCLGdCQUEvQkwsaUNBQWlDSSxPQUFPO0lBQ25EO0FBQ0YiLCJzb3VyY2VzIjpbIi9ob21lL3NyYy9zaGFyZWQvbGliL2FwcC1keW5hbWljLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgSlNYIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgTG9hZGFibGUgZnJvbSAnLi9sYXp5LWR5bmFtaWMvbG9hZGFibGUnXG5cbmltcG9ydCB0eXBlIHtcbiAgTG9hZGFibGVHZW5lcmF0ZWRPcHRpb25zLFxuICBEeW5hbWljT3B0aW9uc0xvYWRpbmdQcm9wcyxcbiAgTG9hZGVyLFxuICBMb2FkZXJDb21wb25lbnQsXG59IGZyb20gJy4vbGF6eS1keW5hbWljL3R5cGVzJ1xuXG5leHBvcnQge1xuICB0eXBlIExvYWRhYmxlR2VuZXJhdGVkT3B0aW9ucyxcbiAgdHlwZSBEeW5hbWljT3B0aW9uc0xvYWRpbmdQcm9wcyxcbiAgdHlwZSBMb2FkZXIsXG4gIHR5cGUgTG9hZGVyQ29tcG9uZW50LFxufVxuXG5leHBvcnQgdHlwZSBEeW5hbWljT3B0aW9uczxQID0ge30+ID0gTG9hZGFibGVHZW5lcmF0ZWRPcHRpb25zICYge1xuICBsb2FkaW5nPzogKCkgPT4gSlNYLkVsZW1lbnQgfCBudWxsXG4gIGxvYWRlcj86IExvYWRlcjxQPlxuICBsb2FkYWJsZUdlbmVyYXRlZD86IExvYWRhYmxlR2VuZXJhdGVkT3B0aW9uc1xuICBtb2R1bGVzPzogc3RyaW5nW11cbiAgc3NyPzogYm9vbGVhblxufVxuXG5leHBvcnQgdHlwZSBMb2FkYWJsZU9wdGlvbnM8UCA9IHt9PiA9IER5bmFtaWNPcHRpb25zPFA+XG5cbmV4cG9ydCB0eXBlIExvYWRhYmxlRm48UCA9IHt9PiA9IChcbiAgb3B0czogTG9hZGFibGVPcHRpb25zPFA+XG4pID0+IFJlYWN0LkNvbXBvbmVudFR5cGU8UD5cblxuZXhwb3J0IHR5cGUgTG9hZGFibGVDb21wb25lbnQ8UCA9IHt9PiA9IFJlYWN0LkNvbXBvbmVudFR5cGU8UD5cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZHluYW1pYzxQID0ge30+KFxuICBkeW5hbWljT3B0aW9uczogRHluYW1pY09wdGlvbnM8UD4gfCBMb2FkZXI8UD4sXG4gIG9wdGlvbnM/OiBEeW5hbWljT3B0aW9uczxQPlxuKTogUmVhY3QuQ29tcG9uZW50VHlwZTxQPiB7XG4gIGNvbnN0IGxvYWRhYmxlT3B0aW9uczogTG9hZGFibGVPcHRpb25zPFA+ID0ge31cblxuICBpZiAodHlwZW9mIGR5bmFtaWNPcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgbG9hZGFibGVPcHRpb25zLmxvYWRlciA9IGR5bmFtaWNPcHRpb25zXG4gIH1cblxuICBjb25zdCBtZXJnZWRPcHRpb25zID0ge1xuICAgIC4uLmxvYWRhYmxlT3B0aW9ucyxcbiAgICAuLi5vcHRpb25zLFxuICB9XG5cbiAgcmV0dXJuIExvYWRhYmxlKHtcbiAgICAuLi5tZXJnZWRPcHRpb25zLFxuICAgIG1vZHVsZXM6IG1lcmdlZE9wdGlvbnMubG9hZGFibGVHZW5lcmF0ZWQ/Lm1vZHVsZXMsXG4gIH0pXG59XG4iXSwibmFtZXMiOlsiZHluYW1pYyIsImR5bmFtaWNPcHRpb25zIiwib3B0aW9ucyIsIm1lcmdlZE9wdGlvbnMiLCJsb2FkYWJsZU9wdGlvbnMiLCJsb2FkZXIiLCJMb2FkYWJsZSIsIm1vZHVsZXMiLCJsb2FkYWJsZUdlbmVyYXRlZCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/shared/lib/app-dynamic.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/next/dist/shared/lib/lazy-dynamic/dynamic-bailout-to-csr.js":
/*!**********************************************************************************!*\
  !*** ./node_modules/next/dist/shared/lib/lazy-dynamic/dynamic-bailout-to-csr.js ***!
  \**********************************************************************************/
/***/ ((module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("/* __next_internal_client_entry_do_not_use__  cjs */ \nObject.defineProperty(exports, \"__esModule\", ({\n    value: true\n}));\nObject.defineProperty(exports, \"BailoutToCSR\", ({\n    enumerable: true,\n    get: function() {\n        return BailoutToCSR;\n    }\n}));\nconst _bailouttocsr = __webpack_require__(/*! ./bailout-to-csr */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/lazy-dynamic/bailout-to-csr.js\");\nfunction BailoutToCSR(param) {\n    let { reason, children } = param;\n    if (false) {}\n    return children;\n} //# sourceMappingURL=dynamic-bailout-to-csr.js.map\n_c = BailoutToCSR;\nvar _c;\n$RefreshReg$(_c, \"BailoutToCSR\");\n\n\n;\n    // Wrapped in an IIFE to avoid polluting the global scope\n    ;\n    (function () {\n        var _a, _b;\n        // Legacy CSS implementations will `eval` browser code in a Node.js context\n        // to extract CSS. For backwards compatibility, we need to check we're in a\n        // browser context before continuing.\n        if (typeof self !== 'undefined' &&\n            // AMP / No-JS mode does not inject these helpers:\n            '$RefreshHelpers$' in self) {\n            // @ts-ignore __webpack_module__ is global\n            var currentExports = module.exports;\n            // @ts-ignore __webpack_module__ is global\n            var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n            // This cannot happen in MainTemplate because the exports mismatch between\n            // templating and execution.\n            self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n            // A module can be accepted automatically based on its exports, e.g. when\n            // it is a Refresh Boundary.\n            if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n                // Save the previous exports signature on update so we can compare the boundary\n                // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n                module.hot.dispose(function (data) {\n                    data.prevSignature =\n                        self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n                });\n                // Unconditionally accept an update to this module, we'll check if it's\n                // still a Refresh Boundary later.\n                // @ts-ignore importMeta is replaced in the loader\n                module.hot.accept();\n                // This field is set when the previous version of this module was a\n                // Refresh Boundary, letting us know we need to check for invalidation or\n                // enqueue an update.\n                if (prevSignature !== null) {\n                    // A boundary can become ineligible if its exports are incompatible\n                    // with the previous exports.\n                    //\n                    // For example, if you add/remove/change exports, we'll want to\n                    // re-execute the importing modules, and force those components to\n                    // re-render. Similarly, if you convert a class component to a\n                    // function, we want to invalidate the boundary.\n                    if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n                        module.hot.invalidate();\n                    }\n                    else {\n                        self.$RefreshHelpers$.scheduleUpdate();\n                    }\n                }\n            }\n            else {\n                // Since we just executed the code for the module, it's possible that the\n                // new exports made it ineligible for being a boundary.\n                // We only care about the case when we were _previously_ a boundary,\n                // because we already accepted this update (accidental side effect).\n                var isNoLongerABoundary = prevSignature !== null;\n                if (isNoLongerABoundary) {\n                    module.hot.invalidate();\n                }\n            }\n        }\n    })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2hhcmVkL2xpYi9sYXp5LWR5bmFtaWMvZHluYW1pYy1iYWlsb3V0LXRvLWNzci5qcyIsIm1hcHBpbmdzIjoiOzs7O2dEQWNnQkE7OztlQUFBQTs7OzBDQVhrQjtBQVczQixzQkFBc0IsS0FBdUM7SUFBdkMsTUFBRUMsTUFBTSxFQUFFQyxRQUFRLEVBQXFCLEdBQXZDO0lBQzNCLElBQUksS0FBNkIsRUFBRSxFQUVsQztJQUVELE9BQU9BO0FBQ1Q7S0FOZ0JGIiwic291cmNlcyI6WyIvc3JjL3NoYXJlZC9saWIvbGF6eS1keW5hbWljL2R5bmFtaWMtYmFpbG91dC10by1jc3IudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50J1xuXG5pbXBvcnQgdHlwZSB7IFJlYWN0RWxlbWVudCB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQmFpbG91dFRvQ1NSRXJyb3IgfSBmcm9tICcuL2JhaWxvdXQtdG8tY3NyJ1xuXG5pbnRlcmZhY2UgQmFpbG91dFRvQ1NSUHJvcHMge1xuICByZWFzb246IHN0cmluZ1xuICBjaGlsZHJlbjogUmVhY3RFbGVtZW50XG59XG5cbi8qKlxuICogSWYgcmVuZGVyZWQgb24gdGhlIHNlcnZlciwgdGhpcyBjb21wb25lbnQgdGhyb3dzIGFuIGVycm9yXG4gKiB0byBzaWduYWwgTmV4dC5qcyB0aGF0IGl0IHNob3VsZCBiYWlsIG91dCB0byBjbGllbnQtc2lkZSByZW5kZXJpbmcgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEJhaWxvdXRUb0NTUih7IHJlYXNvbiwgY2hpbGRyZW4gfTogQmFpbG91dFRvQ1NSUHJvcHMpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IEJhaWxvdXRUb0NTUkVycm9yKHJlYXNvbilcbiAgfVxuXG4gIHJldHVybiBjaGlsZHJlblxufVxuIl0sIm5hbWVzIjpbIkJhaWxvdXRUb0NTUiIsInJlYXNvbiIsImNoaWxkcmVuIiwid2luZG93IiwiQmFpbG91dFRvQ1NSRXJyb3IiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/shared/lib/lazy-dynamic/dynamic-bailout-to-csr.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/next/dist/shared/lib/lazy-dynamic/loadable.js":
/*!********************************************************************!*\
  !*** ./node_modules/next/dist/shared/lib/lazy-dynamic/loadable.js ***!
  \********************************************************************/
/***/ ((module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n    value: true\n}));\nObject.defineProperty(exports, \"default\", ({\n    enumerable: true,\n    get: function() {\n        return _default;\n    }\n}));\nconst _jsxruntime = __webpack_require__(/*! react/jsx-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-runtime.js\");\nconst _react = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\nconst _dynamicbailouttocsr = __webpack_require__(/*! ./dynamic-bailout-to-csr */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/lazy-dynamic/dynamic-bailout-to-csr.js\");\nconst _preloadchunks = __webpack_require__(/*! ./preload-chunks */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/lazy-dynamic/preload-chunks.js\");\n// Normalize loader to return the module as form { default: Component } for `React.lazy`.\n// Also for backward compatible since next/dynamic allows to resolve a component directly with loader\n// Client component reference proxy need to be converted to a module.\nfunction convertModule(mod) {\n    // Check \"default\" prop before accessing it, as it could be client reference proxy that could break it reference.\n    // Cases:\n    // mod: { default: Component }\n    // mod: Component\n    // mod: { default: proxy(Component) }\n    // mod: proxy(Component)\n    const hasDefault = mod && 'default' in mod;\n    return {\n        default: hasDefault ? mod.default : mod\n    };\n}\nconst defaultOptions = {\n    loader: ()=>Promise.resolve(convertModule(()=>null)),\n    loading: null,\n    ssr: true\n};\nfunction Loadable(options) {\n    const opts = {\n        ...defaultOptions,\n        ...options\n    };\n    const Lazy = /*#__PURE__*/ (0, _react.lazy)(()=>opts.loader().then(convertModule));\n    const Loading = opts.loading;\n    function LoadableComponent(props) {\n        const fallbackElement = Loading ? /*#__PURE__*/ (0, _jsxruntime.jsx)(Loading, {\n            isLoading: true,\n            pastDelay: true,\n            error: null\n        }) : null;\n        // If it's non-SSR or provided a loading component, wrap it in a suspense boundary\n        const hasSuspenseBoundary = !opts.ssr || !!opts.loading;\n        const Wrap = hasSuspenseBoundary ? _react.Suspense : _react.Fragment;\n        const wrapProps = hasSuspenseBoundary ? {\n            fallback: fallbackElement\n        } : {};\n        const children = opts.ssr ? /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {\n            children: [\n                 false ? /*#__PURE__*/ 0 : null,\n                /*#__PURE__*/ (0, _jsxruntime.jsx)(Lazy, {\n                    ...props\n                })\n            ]\n        }) : /*#__PURE__*/ (0, _jsxruntime.jsx)(_dynamicbailouttocsr.BailoutToCSR, {\n            reason: \"next/dynamic\",\n            children: /*#__PURE__*/ (0, _jsxruntime.jsx)(Lazy, {\n                ...props\n            })\n        });\n        return /*#__PURE__*/ (0, _jsxruntime.jsx)(Wrap, {\n            ...wrapProps,\n            children: children\n        });\n    }\n    LoadableComponent.displayName = 'LoadableComponent';\n    return LoadableComponent;\n}\n_c = Loadable;\nconst _default = Loadable; //# sourceMappingURL=loadable.js.map\nvar _c;\n$RefreshReg$(_c, \"Loadable\");\n\n\n;\n    // Wrapped in an IIFE to avoid polluting the global scope\n    ;\n    (function () {\n        var _a, _b;\n        // Legacy CSS implementations will `eval` browser code in a Node.js context\n        // to extract CSS. For backwards compatibility, we need to check we're in a\n        // browser context before continuing.\n        if (typeof self !== 'undefined' &&\n            // AMP / No-JS mode does not inject these helpers:\n            '$RefreshHelpers$' in self) {\n            // @ts-ignore __webpack_module__ is global\n            var currentExports = module.exports;\n            // @ts-ignore __webpack_module__ is global\n            var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n            // This cannot happen in MainTemplate because the exports mismatch between\n            // templating and execution.\n            self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n            // A module can be accepted automatically based on its exports, e.g. when\n            // it is a Refresh Boundary.\n            if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n                // Save the previous exports signature on update so we can compare the boundary\n                // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n                module.hot.dispose(function (data) {\n                    data.prevSignature =\n                        self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n                });\n                // Unconditionally accept an update to this module, we'll check if it's\n                // still a Refresh Boundary later.\n                // @ts-ignore importMeta is replaced in the loader\n                module.hot.accept();\n                // This field is set when the previous version of this module was a\n                // Refresh Boundary, letting us know we need to check for invalidation or\n                // enqueue an update.\n                if (prevSignature !== null) {\n                    // A boundary can become ineligible if its exports are incompatible\n                    // with the previous exports.\n                    //\n                    // For example, if you add/remove/change exports, we'll want to\n                    // re-execute the importing modules, and force those components to\n                    // re-render. Similarly, if you convert a class component to a\n                    // function, we want to invalidate the boundary.\n                    if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n                        module.hot.invalidate();\n                    }\n                    else {\n                        self.$RefreshHelpers$.scheduleUpdate();\n                    }\n                }\n            }\n            else {\n                // Since we just executed the code for the module, it's possible that the\n                // new exports made it ineligible for being a boundary.\n                // We only care about the case when we were _previously_ a boundary,\n                // because we already accepted this update (accidental side effect).\n                var isNoLongerABoundary = prevSignature !== null;\n                if (isNoLongerABoundary) {\n                    module.hot.invalidate();\n                }\n            }\n        }\n    })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2hhcmVkL2xpYi9sYXp5LWR5bmFtaWMvbG9hZGFibGUuanMiLCJtYXBwaW5ncyI6Ijs7OzsyQ0E0RUE7OztlQUFBOzs7O21DQTVFeUM7aURBQ1o7MkNBRUM7QUFFOUIseUZBQXlGO0FBQ3pGLHFHQUFxRztBQUNyRyxxRUFBcUU7QUFDckUsU0FBU0EsY0FDUEMsR0FBNEQ7SUFJNUQsaUhBQWlIO0lBQ2pILFNBQVM7SUFDVCw4QkFBOEI7SUFDOUIsaUJBQWlCO0lBQ2pCLHFDQUFxQztJQUNyQyx3QkFBd0I7SUFDeEIsTUFBTUMsYUFBYUQsT0FBTyxhQUFhQTtJQUN2QyxPQUFPO1FBQ0xFLFNBQVNELGFBQ0pELElBQTJCRSxPQUFPLEdBQ2xDRjtJQUNQO0FBQ0Y7QUFFQSxNQUFNRyxpQkFBaUI7SUFDckJDLFFBQVEsSUFBTUMsUUFBUUMsT0FBTyxDQUFDUCxjQUFjLElBQU07SUFDbERRLFNBQVM7SUFDVEMsS0FBSztBQUNQO0FBU0Esa0JBQWtCRSxPQUF3QjtJQUN4QyxNQUFNQyxPQUFPO1FBQUUsR0FBR1IsY0FBYztRQUFFLEdBQUdPLE9BQU87SUFBQztJQUM3QyxNQUFNRSxPQUFBQSxXQUFBQSxHQUFPQyxDQUFBQSxHQUFBQSxPQUFBQSxJQUFBQSxFQUFLLElBQU1GLEtBQUtQLE1BQU0sR0FBR1UsSUFBSSxDQUFDZjtJQUMzQyxNQUFNZ0IsVUFBVUosS0FBS0osT0FBTztJQUU1QixTQUFTUyxrQkFBa0JDLEtBQVU7UUFDbkMsTUFBTUMsa0JBQWtCSCxVQUFBQSxXQUFBQSxHQUN0QixxQkFBQ0EsU0FBQUE7WUFBUUksV0FBVztZQUFNQyxXQUFXO1lBQU1DLE9BQU87YUFDaEQ7UUFFSixrRkFBa0Y7UUFDbEYsTUFBTUMsc0JBQXNCLENBQUNYLEtBQUtILEdBQUcsSUFBSSxDQUFDLENBQUNHLEtBQUtKLE9BQU87UUFDdkQsTUFBTWdCLE9BQU9ELHNCQUFzQkUsT0FBQUEsUUFBUSxHQUFHQyxPQUFBQSxRQUFRO1FBQ3RELE1BQU1DLFlBQVlKLHNCQUFzQjtZQUFFSyxVQUFVVDtRQUFnQixJQUFJLENBQUM7UUFDekUsTUFBTVUsV0FBV2pCLEtBQUtILEdBQUcsaUJBQ3ZCOztnQkFFRyxNQUE2QixHQUFYLGNBQ2pCLEMsR0FDRTs4QkFDSixxQkFBQ0ksTUFBQUE7b0JBQU0sR0FBR0ssS0FBSzs7O2FBR2pCLG1DQUFDZ0IscUJBQUFBLFlBQVk7WUFBQ0MsUUFBTztzQkFDbkIsbUNBQUN0QixNQUFBQTtnQkFBTSxHQUFHSyxLQUFLOzs7UUFJbkIscUJBQU8scUJBQUNNLE1BQUFBO1lBQU0sR0FBR0csU0FBUztzQkFBR0U7O0lBQy9CO0lBRUFaLGtCQUFrQm1CLFdBQVcsR0FBRztJQUVoQyxPQUFPbkI7QUFDVDtLQWxDU1A7TUFvQ1QsV0FBZUEiLCJzb3VyY2VzIjpbIi9zcmMvc2hhcmVkL2xpYi9sYXp5LWR5bmFtaWMvbG9hZGFibGUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1c3BlbnNlLCBGcmFnbWVudCwgbGF6eSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgQmFpbG91dFRvQ1NSIH0gZnJvbSAnLi9keW5hbWljLWJhaWxvdXQtdG8tY3NyJ1xuaW1wb3J0IHR5cGUgeyBDb21wb25lbnRNb2R1bGUgfSBmcm9tICcuL3R5cGVzJ1xuaW1wb3J0IHsgUHJlbG9hZENodW5rcyB9IGZyb20gJy4vcHJlbG9hZC1jaHVua3MnXG5cbi8vIE5vcm1hbGl6ZSBsb2FkZXIgdG8gcmV0dXJuIHRoZSBtb2R1bGUgYXMgZm9ybSB7IGRlZmF1bHQ6IENvbXBvbmVudCB9IGZvciBgUmVhY3QubGF6eWAuXG4vLyBBbHNvIGZvciBiYWNrd2FyZCBjb21wYXRpYmxlIHNpbmNlIG5leHQvZHluYW1pYyBhbGxvd3MgdG8gcmVzb2x2ZSBhIGNvbXBvbmVudCBkaXJlY3RseSB3aXRoIGxvYWRlclxuLy8gQ2xpZW50IGNvbXBvbmVudCByZWZlcmVuY2UgcHJveHkgbmVlZCB0byBiZSBjb252ZXJ0ZWQgdG8gYSBtb2R1bGUuXG5mdW5jdGlvbiBjb252ZXJ0TW9kdWxlPFA+KFxuICBtb2Q6IFJlYWN0LkNvbXBvbmVudFR5cGU8UD4gfCBDb21wb25lbnRNb2R1bGU8UD4gfCB1bmRlZmluZWRcbik6IHtcbiAgZGVmYXVsdDogUmVhY3QuQ29tcG9uZW50VHlwZTxQPlxufSB7XG4gIC8vIENoZWNrIFwiZGVmYXVsdFwiIHByb3AgYmVmb3JlIGFjY2Vzc2luZyBpdCwgYXMgaXQgY291bGQgYmUgY2xpZW50IHJlZmVyZW5jZSBwcm94eSB0aGF0IGNvdWxkIGJyZWFrIGl0IHJlZmVyZW5jZS5cbiAgLy8gQ2FzZXM6XG4gIC8vIG1vZDogeyBkZWZhdWx0OiBDb21wb25lbnQgfVxuICAvLyBtb2Q6IENvbXBvbmVudFxuICAvLyBtb2Q6IHsgZGVmYXVsdDogcHJveHkoQ29tcG9uZW50KSB9XG4gIC8vIG1vZDogcHJveHkoQ29tcG9uZW50KVxuICBjb25zdCBoYXNEZWZhdWx0ID0gbW9kICYmICdkZWZhdWx0JyBpbiBtb2RcbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0OiBoYXNEZWZhdWx0XG4gICAgICA/IChtb2QgYXMgQ29tcG9uZW50TW9kdWxlPFA+KS5kZWZhdWx0XG4gICAgICA6IChtb2QgYXMgUmVhY3QuQ29tcG9uZW50VHlwZTxQPiksXG4gIH1cbn1cblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGxvYWRlcjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKGNvbnZlcnRNb2R1bGUoKCkgPT4gbnVsbCkpLFxuICBsb2FkaW5nOiBudWxsLFxuICBzc3I6IHRydWUsXG59XG5cbmludGVyZmFjZSBMb2FkYWJsZU9wdGlvbnMge1xuICBsb2FkZXI/OiAoKSA9PiBQcm9taXNlPFJlYWN0LkNvbXBvbmVudFR5cGU8YW55PiB8IENvbXBvbmVudE1vZHVsZTxhbnk+PlxuICBsb2FkaW5nPzogUmVhY3QuQ29tcG9uZW50VHlwZTxhbnk+IHwgbnVsbFxuICBzc3I/OiBib29sZWFuXG4gIG1vZHVsZXM/OiBzdHJpbmdbXVxufVxuXG5mdW5jdGlvbiBMb2FkYWJsZShvcHRpb25zOiBMb2FkYWJsZU9wdGlvbnMpIHtcbiAgY29uc3Qgb3B0cyA9IHsgLi4uZGVmYXVsdE9wdGlvbnMsIC4uLm9wdGlvbnMgfVxuICBjb25zdCBMYXp5ID0gbGF6eSgoKSA9PiBvcHRzLmxvYWRlcigpLnRoZW4oY29udmVydE1vZHVsZSkpXG4gIGNvbnN0IExvYWRpbmcgPSBvcHRzLmxvYWRpbmdcblxuICBmdW5jdGlvbiBMb2FkYWJsZUNvbXBvbmVudChwcm9wczogYW55KSB7XG4gICAgY29uc3QgZmFsbGJhY2tFbGVtZW50ID0gTG9hZGluZyA/IChcbiAgICAgIDxMb2FkaW5nIGlzTG9hZGluZz17dHJ1ZX0gcGFzdERlbGF5PXt0cnVlfSBlcnJvcj17bnVsbH0gLz5cbiAgICApIDogbnVsbFxuXG4gICAgLy8gSWYgaXQncyBub24tU1NSIG9yIHByb3ZpZGVkIGEgbG9hZGluZyBjb21wb25lbnQsIHdyYXAgaXQgaW4gYSBzdXNwZW5zZSBib3VuZGFyeVxuICAgIGNvbnN0IGhhc1N1c3BlbnNlQm91bmRhcnkgPSAhb3B0cy5zc3IgfHwgISFvcHRzLmxvYWRpbmdcbiAgICBjb25zdCBXcmFwID0gaGFzU3VzcGVuc2VCb3VuZGFyeSA/IFN1c3BlbnNlIDogRnJhZ21lbnRcbiAgICBjb25zdCB3cmFwUHJvcHMgPSBoYXNTdXNwZW5zZUJvdW5kYXJ5ID8geyBmYWxsYmFjazogZmFsbGJhY2tFbGVtZW50IH0gOiB7fVxuICAgIGNvbnN0IGNoaWxkcmVuID0gb3B0cy5zc3IgPyAoXG4gICAgICA8PlxuICAgICAgICB7LyogRHVyaW5nIFNTUiwgd2UgbmVlZCB0byBwcmVsb2FkIHRoZSBDU1MgZnJvbSB0aGUgZHluYW1pYyBjb21wb25lbnQgdG8gYXZvaWQgZmxhc2ggb2YgdW5zdHlsZWQgY29udGVudCAqL31cbiAgICAgICAge3R5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gKFxuICAgICAgICAgIDxQcmVsb2FkQ2h1bmtzIG1vZHVsZUlkcz17b3B0cy5tb2R1bGVzfSAvPlxuICAgICAgICApIDogbnVsbH1cbiAgICAgICAgPExhenkgey4uLnByb3BzfSAvPlxuICAgICAgPC8+XG4gICAgKSA6IChcbiAgICAgIDxCYWlsb3V0VG9DU1IgcmVhc29uPVwibmV4dC9keW5hbWljXCI+XG4gICAgICAgIDxMYXp5IHsuLi5wcm9wc30gLz5cbiAgICAgIDwvQmFpbG91dFRvQ1NSPlxuICAgIClcblxuICAgIHJldHVybiA8V3JhcCB7Li4ud3JhcFByb3BzfT57Y2hpbGRyZW59PC9XcmFwPlxuICB9XG5cbiAgTG9hZGFibGVDb21wb25lbnQuZGlzcGxheU5hbWUgPSAnTG9hZGFibGVDb21wb25lbnQnXG5cbiAgcmV0dXJuIExvYWRhYmxlQ29tcG9uZW50XG59XG5cbmV4cG9ydCBkZWZhdWx0IExvYWRhYmxlXG4iXSwibmFtZXMiOlsiY29udmVydE1vZHVsZSIsIm1vZCIsImhhc0RlZmF1bHQiLCJkZWZhdWx0IiwiZGVmYXVsdE9wdGlvbnMiLCJsb2FkZXIiLCJQcm9taXNlIiwicmVzb2x2ZSIsImxvYWRpbmciLCJzc3IiLCJMb2FkYWJsZSIsIm9wdGlvbnMiLCJvcHRzIiwiTGF6eSIsImxhenkiLCJ0aGVuIiwiTG9hZGluZyIsIkxvYWRhYmxlQ29tcG9uZW50IiwicHJvcHMiLCJmYWxsYmFja0VsZW1lbnQiLCJpc0xvYWRpbmciLCJwYXN0RGVsYXkiLCJlcnJvciIsImhhc1N1c3BlbnNlQm91bmRhcnkiLCJXcmFwIiwiU3VzcGVuc2UiLCJGcmFnbWVudCIsIndyYXBQcm9wcyIsImZhbGxiYWNrIiwiY2hpbGRyZW4iLCJ3aW5kb3ciLCJQcmVsb2FkQ2h1bmtzIiwibW9kdWxlSWRzIiwibW9kdWxlcyIsIkJhaWxvdXRUb0NTUiIsInJlYXNvbiIsImRpc3BsYXlOYW1lIl0sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/shared/lib/lazy-dynamic/loadable.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/next/dist/shared/lib/lazy-dynamic/preload-chunks.js":
/*!**************************************************************************!*\
  !*** ./node_modules/next/dist/shared/lib/lazy-dynamic/preload-chunks.js ***!
  \**************************************************************************/
/***/ ((module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("/* __next_internal_client_entry_do_not_use__  cjs */ \nObject.defineProperty(exports, \"__esModule\", ({\n    value: true\n}));\nObject.defineProperty(exports, \"PreloadChunks\", ({\n    enumerable: true,\n    get: function() {\n        return PreloadChunks;\n    }\n}));\nconst _jsxruntime = __webpack_require__(/*! react/jsx-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-runtime.js\");\nconst _reactdom = __webpack_require__(/*! react-dom */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react-dom/index.js\");\nconst _workasyncstorageexternal = __webpack_require__(/*! ../../../server/app-render/work-async-storage.external */ \"(shared)/./node_modules/next/dist/server/app-render/work-async-storage.external.js\");\nconst _encodeuripath = __webpack_require__(/*! ../encode-uri-path */ \"(app-pages-browser)/./node_modules/next/dist/shared/lib/encode-uri-path.js\");\nfunction PreloadChunks(param) {\n    let { moduleIds } = param;\n    // Early return in client compilation and only load requestStore on server side\n    if (true) {\n        return null;\n    }\n    const workStore = _workasyncstorageexternal.workAsyncStorage.getStore();\n    if (workStore === undefined) {\n        return null;\n    }\n    const allFiles = [];\n    // Search the current dynamic call unique key id in react loadable manifest,\n    // and find the corresponding CSS files to preload\n    if (workStore.reactLoadableManifest && moduleIds) {\n        const manifest = workStore.reactLoadableManifest;\n        for (const key of moduleIds){\n            if (!manifest[key]) continue;\n            const chunks = manifest[key].files;\n            allFiles.push(...chunks);\n        }\n    }\n    if (allFiles.length === 0) {\n        return null;\n    }\n    const dplId =  false ? 0 : '';\n    return /*#__PURE__*/ (0, _jsxruntime.jsx)(_jsxruntime.Fragment, {\n        children: allFiles.map((chunk)=>{\n            const href = workStore.assetPrefix + \"/_next/\" + (0, _encodeuripath.encodeURIPath)(chunk) + dplId;\n            const isCss = chunk.endsWith('.css');\n            // If it's stylesheet we use `precedence` o help hoist with React Float.\n            // For stylesheets we actually need to render the CSS because nothing else is going to do it so it needs to be part of the component tree.\n            // The `preload` for stylesheet is not optional.\n            if (isCss) {\n                return /*#__PURE__*/ (0, _jsxruntime.jsx)(\"link\", {\n                    // @ts-ignore\n                    precedence: \"dynamic\",\n                    href: href,\n                    rel: \"stylesheet\",\n                    as: \"style\"\n                }, chunk);\n            } else {\n                // If it's script we use ReactDOM.preload to preload the resources\n                (0, _reactdom.preload)(href, {\n                    as: 'script',\n                    fetchPriority: 'low'\n                });\n                return null;\n            }\n        })\n    });\n} //# sourceMappingURL=preload-chunks.js.map\n_c = PreloadChunks;\nvar _c;\n$RefreshReg$(_c, \"PreloadChunks\");\n\n\n;\n    // Wrapped in an IIFE to avoid polluting the global scope\n    ;\n    (function () {\n        var _a, _b;\n        // Legacy CSS implementations will `eval` browser code in a Node.js context\n        // to extract CSS. For backwards compatibility, we need to check we're in a\n        // browser context before continuing.\n        if (typeof self !== 'undefined' &&\n            // AMP / No-JS mode does not inject these helpers:\n            '$RefreshHelpers$' in self) {\n            // @ts-ignore __webpack_module__ is global\n            var currentExports = module.exports;\n            // @ts-ignore __webpack_module__ is global\n            var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n            // This cannot happen in MainTemplate because the exports mismatch between\n            // templating and execution.\n            self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n            // A module can be accepted automatically based on its exports, e.g. when\n            // it is a Refresh Boundary.\n            if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n                // Save the previous exports signature on update so we can compare the boundary\n                // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n                module.hot.dispose(function (data) {\n                    data.prevSignature =\n                        self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n                });\n                // Unconditionally accept an update to this module, we'll check if it's\n                // still a Refresh Boundary later.\n                // @ts-ignore importMeta is replaced in the loader\n                module.hot.accept();\n                // This field is set when the previous version of this module was a\n                // Refresh Boundary, letting us know we need to check for invalidation or\n                // enqueue an update.\n                if (prevSignature !== null) {\n                    // A boundary can become ineligible if its exports are incompatible\n                    // with the previous exports.\n                    //\n                    // For example, if you add/remove/change exports, we'll want to\n                    // re-execute the importing modules, and force those components to\n                    // re-render. Similarly, if you convert a class component to a\n                    // function, we want to invalidate the boundary.\n                    if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n                        module.hot.invalidate();\n                    }\n                    else {\n                        self.$RefreshHelpers$.scheduleUpdate();\n                    }\n                }\n            }\n            else {\n                // Since we just executed the code for the module, it's possible that the\n                // new exports made it ineligible for being a boundary.\n                // We only care about the case when we were _previously_ a boundary,\n                // because we already accepted this update (accidental side effect).\n                var isNoLongerABoundary = prevSignature !== null;\n                if (isNoLongerABoundary) {\n                    module.hot.invalidate();\n                }\n            }\n        }\n    })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2hhcmVkL2xpYi9sYXp5LWR5bmFtaWMvcHJlbG9hZC1jaHVua3MuanMiLCJtYXBwaW5ncyI6Ijs7OztpREFPZ0JBOzs7ZUFBQUE7Ozs7c0NBTFE7c0RBRVM7MkNBQ0g7QUFFdkIsdUJBQXVCLEtBSTdCO0lBSjZCLE1BQzVCQyxTQUFTLEVBR1YsR0FKNkI7SUFLNUIsK0VBQStFO0lBQy9FLElBQUksSUFBNkIsRUFBRTtRQUNqQyxPQUFPO0lBQ1Q7SUFFQSxNQUFNRSxZQUFZQywwQkFBQUEsZ0JBQWdCLENBQUNDLFFBQVE7SUFDM0MsSUFBSUYsY0FBY0csV0FBVztRQUMzQixPQUFPO0lBQ1Q7SUFFQSxNQUFNQyxXQUFXLEVBQUU7SUFFbkIsNEVBQTRFO0lBQzVFLGtEQUFrRDtJQUNsRCxJQUFJSixVQUFVSyxxQkFBcUIsSUFBSVAsV0FBVztRQUNoRCxNQUFNUSxXQUFXTixVQUFVSyxxQkFBcUI7UUFDaEQsS0FBSyxNQUFNRSxPQUFPVCxVQUFXO1lBQzNCLElBQUksQ0FBQ1EsUUFBUSxDQUFDQyxJQUFJLEVBQUU7WUFDcEIsTUFBTUMsU0FBU0YsUUFBUSxDQUFDQyxJQUFJLENBQUNFLEtBQUs7WUFDbENMLFNBQVNNLElBQUksSUFBSUY7UUFDbkI7SUFDRjtJQUVBLElBQUlKLFNBQVNPLE1BQU0sS0FBSyxHQUFHO1FBQ3pCLE9BQU87SUFDVDtJQUVBLE1BQU1DLFFBQVFDLE1BQThCLEdBQ3ZDLENBQXFDLEdBQ3RDO0lBRUoscUJBQ0U7a0JBQ0dULFNBQVNZLEdBQUcsQ0FBQyxDQUFDQztZQUNiLE1BQU1DLE9BQVVsQixVQUFVbUIsV0FBVyxHQUFDLFlBQVNDLENBQUFBLEdBQUFBLGVBQUFBLGFBQUFBLEVBQWNILFNBQVNMO1lBQ3RFLE1BQU1TLFFBQVFKLE1BQU1LLFFBQVEsQ0FBQztZQUM3Qix3RUFBd0U7WUFDeEUsMElBQTBJO1lBQzFJLGdEQUFnRDtZQUNoRCxJQUFJRCxPQUFPO2dCQUNULE9BQ0UsV0FERixHQUNFLHFCQUFDRSxRQUFBQTtvQkFFQyxhQUFhO29CQUNiQyxZQUFXO29CQUNYTixNQUFNQTtvQkFDTk8sS0FBSTtvQkFDSkMsSUFBRzttQkFMRVQ7WUFRWCxPQUFPO2dCQUNMLGtFQUFrRTtnQkFDbEVVLENBQUFBLEdBQUFBLFVBQUFBLE9BQUFBLEVBQVFULE1BQU07b0JBQ1pRLElBQUk7b0JBQ0pFLGVBQWU7Z0JBQ2pCO2dCQUNBLE9BQU87WUFDVDtRQUNGOztBQUdOO0tBbEVnQi9CIiwic291cmNlcyI6WyIvc3JjL3NoYXJlZC9saWIvbGF6eS1keW5hbWljL3ByZWxvYWQtY2h1bmtzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCdcblxuaW1wb3J0IHsgcHJlbG9hZCB9IGZyb20gJ3JlYWN0LWRvbSdcblxuaW1wb3J0IHsgd29ya0FzeW5jU3RvcmFnZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZlci9hcHAtcmVuZGVyL3dvcmstYXN5bmMtc3RvcmFnZS5leHRlcm5hbCdcbmltcG9ydCB7IGVuY29kZVVSSVBhdGggfSBmcm9tICcuLi9lbmNvZGUtdXJpLXBhdGgnXG5cbmV4cG9ydCBmdW5jdGlvbiBQcmVsb2FkQ2h1bmtzKHtcbiAgbW9kdWxlSWRzLFxufToge1xuICBtb2R1bGVJZHM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkXG59KSB7XG4gIC8vIEVhcmx5IHJldHVybiBpbiBjbGllbnQgY29tcGlsYXRpb24gYW5kIG9ubHkgbG9hZCByZXF1ZXN0U3RvcmUgb24gc2VydmVyIHNpZGVcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IHdvcmtTdG9yZSA9IHdvcmtBc3luY1N0b3JhZ2UuZ2V0U3RvcmUoKVxuICBpZiAod29ya1N0b3JlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgY29uc3QgYWxsRmlsZXMgPSBbXVxuXG4gIC8vIFNlYXJjaCB0aGUgY3VycmVudCBkeW5hbWljIGNhbGwgdW5pcXVlIGtleSBpZCBpbiByZWFjdCBsb2FkYWJsZSBtYW5pZmVzdCxcbiAgLy8gYW5kIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgQ1NTIGZpbGVzIHRvIHByZWxvYWRcbiAgaWYgKHdvcmtTdG9yZS5yZWFjdExvYWRhYmxlTWFuaWZlc3QgJiYgbW9kdWxlSWRzKSB7XG4gICAgY29uc3QgbWFuaWZlc3QgPSB3b3JrU3RvcmUucmVhY3RMb2FkYWJsZU1hbmlmZXN0XG4gICAgZm9yIChjb25zdCBrZXkgb2YgbW9kdWxlSWRzKSB7XG4gICAgICBpZiAoIW1hbmlmZXN0W2tleV0pIGNvbnRpbnVlXG4gICAgICBjb25zdCBjaHVua3MgPSBtYW5pZmVzdFtrZXldLmZpbGVzXG4gICAgICBhbGxGaWxlcy5wdXNoKC4uLmNodW5rcylcbiAgICB9XG4gIH1cblxuICBpZiAoYWxsRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGNvbnN0IGRwbElkID0gcHJvY2Vzcy5lbnYuTkVYVF9ERVBMT1lNRU5UX0lEXG4gICAgPyBgP2RwbD0ke3Byb2Nlc3MuZW52Lk5FWFRfREVQTE9ZTUVOVF9JRH1gXG4gICAgOiAnJ1xuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHthbGxGaWxlcy5tYXAoKGNodW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IGhyZWYgPSBgJHt3b3JrU3RvcmUuYXNzZXRQcmVmaXh9L19uZXh0LyR7ZW5jb2RlVVJJUGF0aChjaHVuayl9JHtkcGxJZH1gXG4gICAgICAgIGNvbnN0IGlzQ3NzID0gY2h1bmsuZW5kc1dpdGgoJy5jc3MnKVxuICAgICAgICAvLyBJZiBpdCdzIHN0eWxlc2hlZXQgd2UgdXNlIGBwcmVjZWRlbmNlYCBvIGhlbHAgaG9pc3Qgd2l0aCBSZWFjdCBGbG9hdC5cbiAgICAgICAgLy8gRm9yIHN0eWxlc2hlZXRzIHdlIGFjdHVhbGx5IG5lZWQgdG8gcmVuZGVyIHRoZSBDU1MgYmVjYXVzZSBub3RoaW5nIGVsc2UgaXMgZ29pbmcgdG8gZG8gaXQgc28gaXQgbmVlZHMgdG8gYmUgcGFydCBvZiB0aGUgY29tcG9uZW50IHRyZWUuXG4gICAgICAgIC8vIFRoZSBgcHJlbG9hZGAgZm9yIHN0eWxlc2hlZXQgaXMgbm90IG9wdGlvbmFsLlxuICAgICAgICBpZiAoaXNDc3MpIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGxpbmtcbiAgICAgICAgICAgICAga2V5PXtjaHVua31cbiAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICBwcmVjZWRlbmNlPVwiZHluYW1pY1wiXG4gICAgICAgICAgICAgIGhyZWY9e2hyZWZ9XG4gICAgICAgICAgICAgIHJlbD1cInN0eWxlc2hlZXRcIlxuICAgICAgICAgICAgICBhcz1cInN0eWxlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIGl0J3Mgc2NyaXB0IHdlIHVzZSBSZWFjdERPTS5wcmVsb2FkIHRvIHByZWxvYWQgdGhlIHJlc291cmNlc1xuICAgICAgICAgIHByZWxvYWQoaHJlZiwge1xuICAgICAgICAgICAgYXM6ICdzY3JpcHQnLFxuICAgICAgICAgICAgZmV0Y2hQcmlvcml0eTogJ2xvdycsXG4gICAgICAgICAgfSlcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9KX1cbiAgICA8Lz5cbiAgKVxufVxuIl0sIm5hbWVzIjpbIlByZWxvYWRDaHVua3MiLCJtb2R1bGVJZHMiLCJ3aW5kb3ciLCJ3b3JrU3RvcmUiLCJ3b3JrQXN5bmNTdG9yYWdlIiwiZ2V0U3RvcmUiLCJ1bmRlZmluZWQiLCJhbGxGaWxlcyIsInJlYWN0TG9hZGFibGVNYW5pZmVzdCIsIm1hbmlmZXN0Iiwia2V5IiwiY2h1bmtzIiwiZmlsZXMiLCJwdXNoIiwibGVuZ3RoIiwiZHBsSWQiLCJwcm9jZXNzIiwiZW52IiwiTkVYVF9ERVBMT1lNRU5UX0lEIiwibWFwIiwiY2h1bmsiLCJocmVmIiwiYXNzZXRQcmVmaXgiLCJlbmNvZGVVUklQYXRoIiwiaXNDc3MiLCJlbmRzV2l0aCIsImxpbmsiLCJwcmVjZWRlbmNlIiwicmVsIiwiYXMiLCJwcmVsb2FkIiwiZmV0Y2hQcmlvcml0eSJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/shared/lib/lazy-dynamic/preload-chunks.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/Address.js":
/*!**********************************************!*\
  !*** ./node_modules/ox/_esm/core/Address.js ***!
  \**********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   InvalidAddressError: () => (/* binding */ InvalidAddressError),\n/* harmony export */   InvalidChecksumError: () => (/* binding */ InvalidChecksumError),\n/* harmony export */   InvalidInputError: () => (/* binding */ InvalidInputError),\n/* harmony export */   assert: () => (/* binding */ assert),\n/* harmony export */   checksum: () => (/* binding */ checksum),\n/* harmony export */   from: () => (/* binding */ from),\n/* harmony export */   fromPublicKey: () => (/* binding */ fromPublicKey),\n/* harmony export */   isEqual: () => (/* binding */ isEqual),\n/* harmony export */   validate: () => (/* binding */ validate)\n/* harmony export */ });\n/* harmony import */ var _Bytes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Bytes.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Bytes.js\");\n/* harmony import */ var _Caches_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Caches.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Caches.js\");\n/* harmony import */ var _Errors_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Errors.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Errors.js\");\n/* harmony import */ var _Hash_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Hash.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Hash.js\");\n/* harmony import */ var _PublicKey_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./PublicKey.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/PublicKey.js\");\n\n\n\n\n\nconst addressRegex = /*#__PURE__*/ /^0x[a-fA-F0-9]{40}$/;\n/**\n * Asserts that the given value is a valid {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.assert('0xA0Cf798816D4b9b9866b5330EEa46a18382f251e')\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.assert('0xdeadbeef')\n * // @error: InvalidAddressError: Address \"0xdeadbeef\" is invalid.\n * ```\n *\n * @param value - Value to assert if it is a valid address.\n * @param options - Assertion options.\n */\nfunction assert(value, options = {}) {\n    const { strict = true } = options;\n    if (!addressRegex.test(value))\n        throw new InvalidAddressError({\n            address: value,\n            cause: new InvalidInputError(),\n        });\n    if (strict) {\n        if (value.toLowerCase() === value)\n            return;\n        if (checksum(value) !== value)\n            throw new InvalidAddressError({\n                address: value,\n                cause: new InvalidChecksumError(),\n            });\n    }\n}\n/**\n * Computes the checksum address for the given {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.checksum('0xa0cf798816d4b9b9866b5330eea46a18382f251e')\n * // @log: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'\n * ```\n *\n * @param address - The address to compute the checksum for.\n * @returns The checksummed address.\n */\nfunction checksum(address) {\n    if (_Caches_js__WEBPACK_IMPORTED_MODULE_0__.checksum.has(address))\n        return _Caches_js__WEBPACK_IMPORTED_MODULE_0__.checksum.get(address);\n    assert(address, { strict: false });\n    const hexAddress = address.substring(2).toLowerCase();\n    const hash = _Hash_js__WEBPACK_IMPORTED_MODULE_1__.keccak256(_Bytes_js__WEBPACK_IMPORTED_MODULE_2__.fromString(hexAddress), { as: 'Bytes' });\n    const characters = hexAddress.split('');\n    for (let i = 0; i < 40; i += 2) {\n        if (hash[i >> 1] >> 4 >= 8 && characters[i]) {\n            characters[i] = characters[i].toUpperCase();\n        }\n        if ((hash[i >> 1] & 0x0f) >= 8 && characters[i + 1]) {\n            characters[i + 1] = characters[i + 1].toUpperCase();\n        }\n    }\n    const result = `0x${characters.join('')}`;\n    _Caches_js__WEBPACK_IMPORTED_MODULE_0__.checksum.set(address, result);\n    return result;\n}\n/**\n * Converts a stringified address to a typed (checksummed) {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('0xa0cf798816d4b9b9866b5330eea46a18382f251e')\n * // @log: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('0xa0cf798816d4b9b9866b5330eea46a18382f251e', {\n *   checksum: false\n * })\n * // @log: '0xa0cf798816d4b9b9866b5330eea46a18382f251e'\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('hello')\n * // @error: InvalidAddressError: Address \"0xa\" is invalid.\n * ```\n *\n * @param address - An address string to convert to a typed Address.\n * @param options - Conversion options.\n * @returns The typed Address.\n */\nfunction from(address, options = {}) {\n    const { checksum: checksumVal = false } = options;\n    assert(address);\n    if (checksumVal)\n        return checksum(address);\n    return address;\n}\n/**\n * Converts an ECDSA public key to an {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address, PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from(\n *   '0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5',\n * )\n * const address = Address.fromPublicKey(publicKey)\n * // @log: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'\n * ```\n *\n * @param publicKey - The ECDSA public key to convert to an {@link ox#Address.Address}.\n * @param options - Conversion options.\n * @returns The {@link ox#Address.Address} corresponding to the public key.\n */\nfunction fromPublicKey(publicKey, options = {}) {\n    const address = _Hash_js__WEBPACK_IMPORTED_MODULE_1__.keccak256(`0x${_PublicKey_js__WEBPACK_IMPORTED_MODULE_3__.toHex(publicKey).slice(4)}`).substring(26);\n    return from(`0x${address}`, options);\n}\n/**\n * Checks if two {@link ox#Address.Address} are equal.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.isEqual(\n *   '0xa0cf798816d4b9b9866b5330eea46a18382f251e',\n *   '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'\n * )\n * // @log: true\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.isEqual(\n *   '0xa0cf798816d4b9b9866b5330eea46a18382f251e',\n *   '0xA0Cf798816D4b9b9866b5330EEa46a18382f251f'\n * )\n * // @log: false\n * ```\n *\n * @param addressA - The first address to compare.\n * @param addressB - The second address to compare.\n * @returns Whether the addresses are equal.\n */\nfunction isEqual(addressA, addressB) {\n    assert(addressA, { strict: false });\n    assert(addressB, { strict: false });\n    return addressA.toLowerCase() === addressB.toLowerCase();\n}\n/**\n * Checks if the given address is a valid {@link ox#Address.Address}.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.validate('0xA0Cf798816D4b9b9866b5330EEa46a18382f251e')\n * // @log: true\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.validate('0xdeadbeef')\n * // @log: false\n * ```\n *\n * @param address - Value to check if it is a valid address.\n * @param options - Check options.\n * @returns Whether the address is a valid address.\n */\nfunction validate(address, options = {}) {\n    const { strict = true } = options ?? {};\n    try {\n        assert(address, { strict });\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\n/**\n * Thrown when an address is invalid.\n *\n * @example\n * ```ts twoslash\n * import { Address } from 'ox'\n *\n * Address.from('0x123')\n * // @error: Address.InvalidAddressError: Address `0x123` is invalid.\n * ```\n */\nclass InvalidAddressError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor({ address, cause }) {\n        super(`Address \"${address}\" is invalid.`, {\n            cause,\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Address.InvalidAddressError'\n        });\n    }\n}\n/** Thrown when an address is not a 20 byte (40 hexadecimal character) value. */\nclass InvalidInputError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor() {\n        super('Address is not a 20 byte (40 hexadecimal character) value.');\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Address.InvalidInputError'\n        });\n    }\n}\n/** Thrown when an address does not match its checksum counterpart. */\nclass InvalidChecksumError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor() {\n        super('Address does not match its checksum counterpart.');\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Address.InvalidChecksumError'\n        });\n    }\n}\n//# sourceMappingURL=Address.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvQWRkcmVzcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFvQztBQUNFO0FBQ0E7QUFDSjtBQUNVO0FBQzVDLG1EQUFtRCxHQUFHO0FBQ3REO0FBQ0EsNENBQTRDLHlCQUF5QjtBQUNyRTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxVQUFVO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxtQ0FBbUM7QUFDMUMsWUFBWSxnQkFBZ0I7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsZ0RBQWdELHlCQUF5QjtBQUN6RTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsUUFBUSxnREFBZTtBQUN2QixlQUFlLGdEQUFlO0FBQzlCLHNCQUFzQixlQUFlO0FBQ3JDO0FBQ0EsaUJBQWlCLCtDQUFjLENBQUMsaURBQWdCLGdCQUFnQixhQUFhO0FBQzdFO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0Isb0JBQW9CO0FBQzVDLElBQUksZ0RBQWU7QUFDbkI7QUFDQTtBQUNBO0FBQ0EsNERBQTRELHlCQUF5QjtBQUNyRjtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sbUNBQW1DO0FBQzFDLFlBQVksZ0NBQWdDO0FBQzVDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1Qyx5QkFBeUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0EsWUFBWSxxQkFBcUI7QUFDakM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZEQUE2RCx5QkFBeUI7QUFDdEY7QUFDQSxpQkFBaUIsMEJBQTBCO0FBQzNDO0FBQ08sOENBQThDO0FBQ3JELG9CQUFvQiwrQ0FBYyxNQUFNLGdEQUFlLHFCQUFxQjtBQUM1RSxxQkFBcUIsUUFBUTtBQUM3QjtBQUNBO0FBQ0Esa0JBQWtCLDBCQUEwQjtBQUM1QztBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFVBQVU7QUFDdEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCx1QkFBdUIsZUFBZTtBQUN0Qyx1QkFBdUIsZUFBZTtBQUN0QztBQUNBO0FBQ0E7QUFDQSwyQ0FBMkMseUJBQXlCO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksVUFBVTtBQUN0QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyx1Q0FBdUM7QUFDOUMsWUFBWSxnQkFBZ0I7QUFDNUI7QUFDQSwwQkFBMEIsUUFBUTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxVQUFVO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxrQ0FBa0MsaURBQWdCO0FBQ3pELGtCQUFrQixnQkFBZ0I7QUFDbEMsMEJBQTBCLFFBQVE7QUFDbEM7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDTyxnQ0FBZ0MsaURBQWdCO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNPLG1DQUFtQyxpREFBZ0I7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL294L19lc20vY29yZS9BZGRyZXNzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEJ5dGVzIGZyb20gJy4vQnl0ZXMuanMnO1xuaW1wb3J0ICogYXMgQ2FjaGVzIGZyb20gJy4vQ2FjaGVzLmpzJztcbmltcG9ydCAqIGFzIEVycm9ycyBmcm9tICcuL0Vycm9ycy5qcyc7XG5pbXBvcnQgKiBhcyBIYXNoIGZyb20gJy4vSGFzaC5qcyc7XG5pbXBvcnQgKiBhcyBQdWJsaWNLZXkgZnJvbSAnLi9QdWJsaWNLZXkuanMnO1xuY29uc3QgYWRkcmVzc1JlZ2V4ID0gLyojX19QVVJFX18qLyAvXjB4W2EtZkEtRjAtOV17NDB9JC87XG4vKipcbiAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWxpZCB7QGxpbmsgb3gjQWRkcmVzcy5BZGRyZXNzfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEFkZHJlc3MgfSBmcm9tICdveCdcbiAqXG4gKiBBZGRyZXNzLmFzc2VydCgnMHhBMENmNzk4ODE2RDRiOWI5ODY2YjUzMzBFRWE0NmExODM4MmYyNTFlJylcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQWRkcmVzcyB9IGZyb20gJ294J1xuICpcbiAqIEFkZHJlc3MuYXNzZXJ0KCcweGRlYWRiZWVmJylcbiAqIC8vIEBlcnJvcjogSW52YWxpZEFkZHJlc3NFcnJvcjogQWRkcmVzcyBcIjB4ZGVhZGJlZWZcIiBpcyBpbnZhbGlkLlxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gYXNzZXJ0IGlmIGl0IGlzIGEgdmFsaWQgYWRkcmVzcy5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQXNzZXJ0aW9uIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQodmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgc3RyaWN0ID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgICBpZiAoIWFkZHJlc3NSZWdleC50ZXN0KHZhbHVlKSlcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRBZGRyZXNzRXJyb3Ioe1xuICAgICAgICAgICAgYWRkcmVzczogdmFsdWUsXG4gICAgICAgICAgICBjYXVzZTogbmV3IEludmFsaWRJbnB1dEVycm9yKCksXG4gICAgICAgIH0pO1xuICAgIGlmIChzdHJpY3QpIHtcbiAgICAgICAgaWYgKHZhbHVlLnRvTG93ZXJDYXNlKCkgPT09IHZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBpZiAoY2hlY2tzdW0odmFsdWUpICE9PSB2YWx1ZSlcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQWRkcmVzc0Vycm9yKHtcbiAgICAgICAgICAgICAgICBhZGRyZXNzOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICBjYXVzZTogbmV3IEludmFsaWRDaGVja3N1bUVycm9yKCksXG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4vKipcbiAqIENvbXB1dGVzIHRoZSBjaGVja3N1bSBhZGRyZXNzIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIG94I0FkZHJlc3MuQWRkcmVzc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBBZGRyZXNzIH0gZnJvbSAnb3gnXG4gKlxuICogQWRkcmVzcy5jaGVja3N1bSgnMHhhMGNmNzk4ODE2ZDRiOWI5ODY2YjUzMzBlZWE0NmExODM4MmYyNTFlJylcbiAqIC8vIEBsb2c6ICcweEEwQ2Y3OTg4MTZENGI5Yjk4NjZiNTMzMEVFYTQ2YTE4MzgyZjI1MWUnXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYWRkcmVzcyAtIFRoZSBhZGRyZXNzIHRvIGNvbXB1dGUgdGhlIGNoZWNrc3VtIGZvci5cbiAqIEByZXR1cm5zIFRoZSBjaGVja3N1bW1lZCBhZGRyZXNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tzdW0oYWRkcmVzcykge1xuICAgIGlmIChDYWNoZXMuY2hlY2tzdW0uaGFzKGFkZHJlc3MpKVxuICAgICAgICByZXR1cm4gQ2FjaGVzLmNoZWNrc3VtLmdldChhZGRyZXNzKTtcbiAgICBhc3NlcnQoYWRkcmVzcywgeyBzdHJpY3Q6IGZhbHNlIH0pO1xuICAgIGNvbnN0IGhleEFkZHJlc3MgPSBhZGRyZXNzLnN1YnN0cmluZygyKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGhhc2ggPSBIYXNoLmtlY2NhazI1NihCeXRlcy5mcm9tU3RyaW5nKGhleEFkZHJlc3MpLCB7IGFzOiAnQnl0ZXMnIH0pO1xuICAgIGNvbnN0IGNoYXJhY3RlcnMgPSBoZXhBZGRyZXNzLnNwbGl0KCcnKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQwOyBpICs9IDIpIHtcbiAgICAgICAgaWYgKGhhc2hbaSA+PiAxXSA+PiA0ID49IDggJiYgY2hhcmFjdGVyc1tpXSkge1xuICAgICAgICAgICAgY2hhcmFjdGVyc1tpXSA9IGNoYXJhY3RlcnNbaV0udG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGhhc2hbaSA+PiAxXSAmIDB4MGYpID49IDggJiYgY2hhcmFjdGVyc1tpICsgMV0pIHtcbiAgICAgICAgICAgIGNoYXJhY3RlcnNbaSArIDFdID0gY2hhcmFjdGVyc1tpICsgMV0udG9VcHBlckNhc2UoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBgMHgke2NoYXJhY3RlcnMuam9pbignJyl9YDtcbiAgICBDYWNoZXMuY2hlY2tzdW0uc2V0KGFkZHJlc3MsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuICogQ29udmVydHMgYSBzdHJpbmdpZmllZCBhZGRyZXNzIHRvIGEgdHlwZWQgKGNoZWNrc3VtbWVkKSB7QGxpbmsgb3gjQWRkcmVzcy5BZGRyZXNzfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEFkZHJlc3MgfSBmcm9tICdveCdcbiAqXG4gKiBBZGRyZXNzLmZyb20oJzB4YTBjZjc5ODgxNmQ0YjliOTg2NmI1MzMwZWVhNDZhMTgzODJmMjUxZScpXG4gKiAvLyBAbG9nOiAnMHhBMENmNzk4ODE2RDRiOWI5ODY2YjUzMzBFRWE0NmExODM4MmYyNTFlJ1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBBZGRyZXNzIH0gZnJvbSAnb3gnXG4gKlxuICogQWRkcmVzcy5mcm9tKCcweGEwY2Y3OTg4MTZkNGI5Yjk4NjZiNTMzMGVlYTQ2YTE4MzgyZjI1MWUnLCB7XG4gKiAgIGNoZWNrc3VtOiBmYWxzZVxuICogfSlcbiAqIC8vIEBsb2c6ICcweGEwY2Y3OTg4MTZkNGI5Yjk4NjZiNTMzMGVlYTQ2YTE4MzgyZjI1MWUnXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEFkZHJlc3MgfSBmcm9tICdveCdcbiAqXG4gKiBBZGRyZXNzLmZyb20oJ2hlbGxvJylcbiAqIC8vIEBlcnJvcjogSW52YWxpZEFkZHJlc3NFcnJvcjogQWRkcmVzcyBcIjB4YVwiIGlzIGludmFsaWQuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYWRkcmVzcyAtIEFuIGFkZHJlc3Mgc3RyaW5nIHRvIGNvbnZlcnQgdG8gYSB0eXBlZCBBZGRyZXNzLlxuICogQHBhcmFtIG9wdGlvbnMgLSBDb252ZXJzaW9uIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgdHlwZWQgQWRkcmVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb20oYWRkcmVzcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBjaGVja3N1bTogY2hlY2tzdW1WYWwgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICBhc3NlcnQoYWRkcmVzcyk7XG4gICAgaWYgKGNoZWNrc3VtVmFsKVxuICAgICAgICByZXR1cm4gY2hlY2tzdW0oYWRkcmVzcyk7XG4gICAgcmV0dXJuIGFkZHJlc3M7XG59XG4vKipcbiAqIENvbnZlcnRzIGFuIEVDRFNBIHB1YmxpYyBrZXkgdG8gYW4ge0BsaW5rIG94I0FkZHJlc3MuQWRkcmVzc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBBZGRyZXNzLCBQdWJsaWNLZXkgfSBmcm9tICdveCdcbiAqXG4gKiBjb25zdCBwdWJsaWNLZXkgPSBQdWJsaWNLZXkuZnJvbShcbiAqICAgJzB4MDQ4MzE4NTM1YjU0MTA1ZDRhN2FhZTYwYzA4ZmM0NWY5Njg3MTgxYjRmZGZjNjI1YmQxYTc1M2ZhNzM5N2ZlZDc1MzU0N2YxMWNhODY5NjY0NmYyZjNhY2IwOGUzMTAxNmFmYWMyM2U2MzBjNWQxMWY1OWY2MWZlZjU3YjBkMmFhNScsXG4gKiApXG4gKiBjb25zdCBhZGRyZXNzID0gQWRkcmVzcy5mcm9tUHVibGljS2V5KHB1YmxpY0tleSlcbiAqIC8vIEBsb2c6ICcweGYzOWZkNmU1MWFhZDg4ZjZmNGNlNmFiODgyNzI3OWNmZmZiOTIyNjYnXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHVibGljS2V5IC0gVGhlIEVDRFNBIHB1YmxpYyBrZXkgdG8gY29udmVydCB0byBhbiB7QGxpbmsgb3gjQWRkcmVzcy5BZGRyZXNzfS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gQ29udmVyc2lvbiBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHtAbGluayBveCNBZGRyZXNzLkFkZHJlc3N9IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHB1YmxpYyBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tUHVibGljS2V5KHB1YmxpY0tleSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgYWRkcmVzcyA9IEhhc2gua2VjY2FrMjU2KGAweCR7UHVibGljS2V5LnRvSGV4KHB1YmxpY0tleSkuc2xpY2UoNCl9YCkuc3Vic3RyaW5nKDI2KTtcbiAgICByZXR1cm4gZnJvbShgMHgke2FkZHJlc3N9YCwgb3B0aW9ucyk7XG59XG4vKipcbiAqIENoZWNrcyBpZiB0d28ge0BsaW5rIG94I0FkZHJlc3MuQWRkcmVzc30gYXJlIGVxdWFsLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQWRkcmVzcyB9IGZyb20gJ294J1xuICpcbiAqIEFkZHJlc3MuaXNFcXVhbChcbiAqICAgJzB4YTBjZjc5ODgxNmQ0YjliOTg2NmI1MzMwZWVhNDZhMTgzODJmMjUxZScsXG4gKiAgICcweEEwQ2Y3OTg4MTZENGI5Yjk4NjZiNTMzMEVFYTQ2YTE4MzgyZjI1MWUnXG4gKiApXG4gKiAvLyBAbG9nOiB0cnVlXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEFkZHJlc3MgfSBmcm9tICdveCdcbiAqXG4gKiBBZGRyZXNzLmlzRXF1YWwoXG4gKiAgICcweGEwY2Y3OTg4MTZkNGI5Yjk4NjZiNTMzMGVlYTQ2YTE4MzgyZjI1MWUnLFxuICogICAnMHhBMENmNzk4ODE2RDRiOWI5ODY2YjUzMzBFRWE0NmExODM4MmYyNTFmJ1xuICogKVxuICogLy8gQGxvZzogZmFsc2VcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhZGRyZXNzQSAtIFRoZSBmaXJzdCBhZGRyZXNzIHRvIGNvbXBhcmUuXG4gKiBAcGFyYW0gYWRkcmVzc0IgLSBUaGUgc2Vjb25kIGFkZHJlc3MgdG8gY29tcGFyZS5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGFkZHJlc3NlcyBhcmUgZXF1YWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VxdWFsKGFkZHJlc3NBLCBhZGRyZXNzQikge1xuICAgIGFzc2VydChhZGRyZXNzQSwgeyBzdHJpY3Q6IGZhbHNlIH0pO1xuICAgIGFzc2VydChhZGRyZXNzQiwgeyBzdHJpY3Q6IGZhbHNlIH0pO1xuICAgIHJldHVybiBhZGRyZXNzQS50b0xvd2VyQ2FzZSgpID09PSBhZGRyZXNzQi50b0xvd2VyQ2FzZSgpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFkZHJlc3MgaXMgYSB2YWxpZCB7QGxpbmsgb3gjQWRkcmVzcy5BZGRyZXNzfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEFkZHJlc3MgfSBmcm9tICdveCdcbiAqXG4gKiBBZGRyZXNzLnZhbGlkYXRlKCcweEEwQ2Y3OTg4MTZENGI5Yjk4NjZiNTMzMEVFYTQ2YTE4MzgyZjI1MWUnKVxuICogLy8gQGxvZzogdHJ1ZVxuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBBZGRyZXNzIH0gZnJvbSAnb3gnXG4gKlxuICogQWRkcmVzcy52YWxpZGF0ZSgnMHhkZWFkYmVlZicpXG4gKiAvLyBAbG9nOiBmYWxzZVxuICogYGBgXG4gKlxuICogQHBhcmFtIGFkZHJlc3MgLSBWYWx1ZSB0byBjaGVjayBpZiBpdCBpcyBhIHZhbGlkIGFkZHJlc3MuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENoZWNrIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhZGRyZXNzIGlzIGEgdmFsaWQgYWRkcmVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKGFkZHJlc3MsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgc3RyaWN0ID0gdHJ1ZSB9ID0gb3B0aW9ucyA/PyB7fTtcbiAgICB0cnkge1xuICAgICAgICBhc3NlcnQoYWRkcmVzcywgeyBzdHJpY3QgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIFRocm93biB3aGVuIGFuIGFkZHJlc3MgaXMgaW52YWxpZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEFkZHJlc3MgfSBmcm9tICdveCdcbiAqXG4gKiBBZGRyZXNzLmZyb20oJzB4MTIzJylcbiAqIC8vIEBlcnJvcjogQWRkcmVzcy5JbnZhbGlkQWRkcmVzc0Vycm9yOiBBZGRyZXNzIGAweDEyM2AgaXMgaW52YWxpZC5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEFkZHJlc3NFcnJvciBleHRlbmRzIEVycm9ycy5CYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHsgYWRkcmVzcywgY2F1c2UgfSkge1xuICAgICAgICBzdXBlcihgQWRkcmVzcyBcIiR7YWRkcmVzc31cIiBpcyBpbnZhbGlkLmAsIHtcbiAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ0FkZHJlc3MuSW52YWxpZEFkZHJlc3NFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqIFRocm93biB3aGVuIGFuIGFkZHJlc3MgaXMgbm90IGEgMjAgYnl0ZSAoNDAgaGV4YWRlY2ltYWwgY2hhcmFjdGVyKSB2YWx1ZS4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkSW5wdXRFcnJvciBleHRlbmRzIEVycm9ycy5CYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcignQWRkcmVzcyBpcyBub3QgYSAyMCBieXRlICg0MCBoZXhhZGVjaW1hbCBjaGFyYWN0ZXIpIHZhbHVlLicpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnQWRkcmVzcy5JbnZhbGlkSW5wdXRFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqIFRocm93biB3aGVuIGFuIGFkZHJlc3MgZG9lcyBub3QgbWF0Y2ggaXRzIGNoZWNrc3VtIGNvdW50ZXJwYXJ0LiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRDaGVja3N1bUVycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdBZGRyZXNzIGRvZXMgbm90IG1hdGNoIGl0cyBjaGVja3N1bSBjb3VudGVycGFydC4nKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ0FkZHJlc3MuSW52YWxpZENoZWNrc3VtRXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUFkZHJlc3MuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/Address.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/Bytes.js":
/*!********************************************!*\
  !*** ./node_modules/ox/_esm/core/Bytes.js ***!
  \********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   InvalidBytesBooleanError: () => (/* binding */ InvalidBytesBooleanError),\n/* harmony export */   InvalidBytesTypeError: () => (/* binding */ InvalidBytesTypeError),\n/* harmony export */   SizeExceedsPaddingSizeError: () => (/* binding */ SizeExceedsPaddingSizeError),\n/* harmony export */   SizeOverflowError: () => (/* binding */ SizeOverflowError),\n/* harmony export */   SliceOffsetOutOfBoundsError: () => (/* binding */ SliceOffsetOutOfBoundsError),\n/* harmony export */   assert: () => (/* binding */ assert),\n/* harmony export */   concat: () => (/* binding */ concat),\n/* harmony export */   from: () => (/* binding */ from),\n/* harmony export */   fromArray: () => (/* binding */ fromArray),\n/* harmony export */   fromBoolean: () => (/* binding */ fromBoolean),\n/* harmony export */   fromHex: () => (/* binding */ fromHex),\n/* harmony export */   fromNumber: () => (/* binding */ fromNumber),\n/* harmony export */   fromString: () => (/* binding */ fromString),\n/* harmony export */   isEqual: () => (/* binding */ isEqual),\n/* harmony export */   padLeft: () => (/* binding */ padLeft),\n/* harmony export */   padRight: () => (/* binding */ padRight),\n/* harmony export */   random: () => (/* binding */ random),\n/* harmony export */   size: () => (/* binding */ size),\n/* harmony export */   slice: () => (/* binding */ slice),\n/* harmony export */   toBigInt: () => (/* binding */ toBigInt),\n/* harmony export */   toBoolean: () => (/* binding */ toBoolean),\n/* harmony export */   toHex: () => (/* binding */ toHex),\n/* harmony export */   toNumber: () => (/* binding */ toNumber),\n/* harmony export */   toString: () => (/* binding */ toString),\n/* harmony export */   trimLeft: () => (/* binding */ trimLeft),\n/* harmony export */   trimRight: () => (/* binding */ trimRight),\n/* harmony export */   validate: () => (/* binding */ validate)\n/* harmony export */ });\n/* harmony import */ var _noble_curves_abstract_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @noble/curves/abstract/utils */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/utils.js\");\n/* harmony import */ var _Errors_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Errors.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Errors.js\");\n/* harmony import */ var _Hex_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Hex.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Hex.js\");\n/* harmony import */ var _Json_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Json.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Json.js\");\n/* harmony import */ var _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/bytes.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/internal/bytes.js\");\n/* harmony import */ var _internal_hex_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/hex.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/internal/hex.js\");\n\n\n\n\n\n\nconst decoder = /*#__PURE__*/ new TextDecoder();\nconst encoder = /*#__PURE__*/ new TextEncoder();\n/**\n * Asserts if the given value is {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.assert('abc')\n * // @error: Bytes.InvalidBytesTypeError:\n * // @error: Value `\"abc\"` of type `string` is an invalid Bytes value.\n * // @error: Bytes values must be of type `Uint8Array`.\n * ```\n *\n * @param value - Value to assert.\n */\nfunction assert(value) {\n    if (value instanceof Uint8Array)\n        return;\n    if (!value)\n        throw new InvalidBytesTypeError(value);\n    if (typeof value !== 'object')\n        throw new InvalidBytesTypeError(value);\n    if (!('BYTES_PER_ELEMENT' in value))\n        throw new InvalidBytesTypeError(value);\n    if (value.BYTES_PER_ELEMENT !== 1 || value.constructor.name !== 'Uint8Array')\n        throw new InvalidBytesTypeError(value);\n}\n/**\n * Concatenates two or more {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const bytes = Bytes.concat(\n *   Bytes.from([1]),\n *   Bytes.from([69]),\n *   Bytes.from([420, 69]),\n * )\n * // @log: Uint8Array [ 1, 69, 420, 69 ]\n * ```\n *\n * @param values - Values to concatenate.\n * @returns Concatenated {@link ox#Bytes.Bytes}.\n */\nfunction concat(...values) {\n    let length = 0;\n    for (const arr of values) {\n        length += arr.length;\n    }\n    const result = new Uint8Array(length);\n    for (let i = 0, index = 0; i < values.length; i++) {\n        const arr = values[i];\n        result.set(arr, index);\n        index += arr.length;\n    }\n    return result;\n}\n/**\n * Instantiates a {@link ox#Bytes.Bytes} value from a `Uint8Array`, a hex string, or an array of unsigned 8-bit integers.\n *\n * :::tip\n *\n * To instantiate from a **Boolean**, **String**, or **Number**, use one of the following:\n *\n * - `Bytes.fromBoolean`\n *\n * - `Bytes.fromString`\n *\n * - `Bytes.fromNumber`\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.from([255, 124, 5, 4])\n * // @log: Uint8Array([255, 124, 5, 4])\n *\n * const data = Bytes.from('0xdeadbeef')\n * // @log: Uint8Array([222, 173, 190, 239])\n * ```\n *\n * @param value - Value to convert.\n * @returns A {@link ox#Bytes.Bytes} instance.\n */\nfunction from(value) {\n    if (value instanceof Uint8Array)\n        return value;\n    if (typeof value === 'string')\n        return fromHex(value);\n    return fromArray(value);\n}\n/**\n * Converts an array of unsigned 8-bit integers into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromArray([255, 124, 5, 4])\n * // @log: Uint8Array([255, 124, 5, 4])\n * ```\n *\n * @param value - Value to convert.\n * @returns A {@link ox#Bytes.Bytes} instance.\n */\nfunction fromArray(value) {\n    return value instanceof Uint8Array ? value : new Uint8Array(value);\n}\n/**\n * Encodes a boolean value into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromBoolean(true)\n * // @log: Uint8Array([1])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromBoolean(true, { size: 32 })\n * // @log: Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])\n * ```\n *\n * @param value - Boolean value to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nfunction fromBoolean(value, options = {}) {\n    const { size } = options;\n    const bytes = new Uint8Array(1);\n    bytes[0] = Number(value);\n    if (typeof size === 'number') {\n        _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.assertSize(bytes, size);\n        return padLeft(bytes, size);\n    }\n    return bytes;\n}\n/**\n * Encodes a {@link ox#Hex.Hex} value into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromHex('0x48656c6c6f20776f726c6421')\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromHex('0x48656c6c6f20776f726c6421', { size: 32 })\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n * ```\n *\n * @param value - {@link ox#Hex.Hex} value to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nfunction fromHex(value, options = {}) {\n    const { size } = options;\n    let hex = value;\n    if (size) {\n        _internal_hex_js__WEBPACK_IMPORTED_MODULE_1__.assertSize(value, size);\n        hex = _Hex_js__WEBPACK_IMPORTED_MODULE_2__.padRight(value, size);\n    }\n    let hexString = hex.slice(2);\n    if (hexString.length % 2)\n        hexString = `0${hexString}`;\n    const length = hexString.length / 2;\n    const bytes = new Uint8Array(length);\n    for (let index = 0, j = 0; index < length; index++) {\n        const nibbleLeft = _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.charCodeToBase16(hexString.charCodeAt(j++));\n        const nibbleRight = _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.charCodeToBase16(hexString.charCodeAt(j++));\n        if (nibbleLeft === undefined || nibbleRight === undefined) {\n            throw new _Errors_js__WEBPACK_IMPORTED_MODULE_3__.BaseError(`Invalid byte sequence (\"${hexString[j - 2]}${hexString[j - 1]}\" in \"${hexString}\").`);\n        }\n        bytes[index] = nibbleLeft * 16 + nibbleRight;\n    }\n    return bytes;\n}\n/**\n * Encodes a number value into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromNumber(420)\n * // @log: Uint8Array([1, 164])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromNumber(420, { size: 4 })\n * // @log: Uint8Array([0, 0, 1, 164])\n * ```\n *\n * @param value - Number value to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nfunction fromNumber(value, options) {\n    const hex = _Hex_js__WEBPACK_IMPORTED_MODULE_2__.fromNumber(value, options);\n    return fromHex(hex);\n}\n/**\n * Encodes a string into {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromString('Hello world!')\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33])\n * ```\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.fromString('Hello world!', { size: 32 })\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])\n * ```\n *\n * @param value - String to encode.\n * @param options - Encoding options.\n * @returns Encoded {@link ox#Bytes.Bytes}.\n */\nfunction fromString(value, options = {}) {\n    const { size } = options;\n    const bytes = encoder.encode(value);\n    if (typeof size === 'number') {\n        _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.assertSize(bytes, size);\n        return padRight(bytes, size);\n    }\n    return bytes;\n}\n/**\n * Checks if two {@link ox#Bytes.Bytes} values are equal.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.isEqual(Bytes.from([1]), Bytes.from([1]))\n * // @log: true\n *\n * Bytes.isEqual(Bytes.from([1]), Bytes.from([2]))\n * // @log: false\n * ```\n *\n * @param bytesA - First {@link ox#Bytes.Bytes} value.\n * @param bytesB - Second {@link ox#Bytes.Bytes} value.\n * @returns `true` if the two values are equal, otherwise `false`.\n */\nfunction isEqual(bytesA, bytesB) {\n    return (0,_noble_curves_abstract_utils__WEBPACK_IMPORTED_MODULE_4__.equalBytes)(bytesA, bytesB);\n}\n/**\n * Pads a {@link ox#Bytes.Bytes} value to the left with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.padLeft(Bytes.from([1]), 4)\n * // @log: Uint8Array([0, 0, 0, 1])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value to pad.\n * @param size - Size to pad the {@link ox#Bytes.Bytes} value to.\n * @returns Padded {@link ox#Bytes.Bytes} value.\n */\nfunction padLeft(value, size) {\n    return _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.pad(value, { dir: 'left', size });\n}\n/**\n * Pads a {@link ox#Bytes.Bytes} value to the right with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.padRight(Bytes.from([1]), 4)\n * // @log: Uint8Array([1, 0, 0, 0])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value to pad.\n * @param size - Size to pad the {@link ox#Bytes.Bytes} value to.\n * @returns Padded {@link ox#Bytes.Bytes} value.\n */\nfunction padRight(value, size) {\n    return _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.pad(value, { dir: 'right', size });\n}\n/**\n * Generates random {@link ox#Bytes.Bytes} of the specified length.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const bytes = Bytes.random(32)\n * // @log: Uint8Array([... x32])\n * ```\n *\n * @param length - Length of the random {@link ox#Bytes.Bytes} to generate.\n * @returns Random {@link ox#Bytes.Bytes} of the specified length.\n */\nfunction random(length) {\n    return crypto.getRandomValues(new Uint8Array(length));\n}\n/**\n * Retrieves the size of a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.size(Bytes.from([1, 2, 3, 4]))\n * // @log: 4\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value.\n * @returns Size of the {@link ox#Bytes.Bytes} value.\n */\nfunction size(value) {\n    return value.length;\n}\n/**\n * Returns a section of a {@link ox#Bytes.Bytes} value given a start/end bytes offset.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.slice(\n *   Bytes.from([1, 2, 3, 4, 5, 6, 7, 8, 9]),\n *   1,\n *   4,\n * )\n * // @log: Uint8Array([2, 3, 4])\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value.\n * @param start - Start offset.\n * @param end - End offset.\n * @param options - Slice options.\n * @returns Sliced {@link ox#Bytes.Bytes} value.\n */\nfunction slice(value, start, end, options = {}) {\n    const { strict } = options;\n    _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.assertStartOffset(value, start);\n    const value_ = value.slice(start, end);\n    if (strict)\n        _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.assertEndOffset(value_, start, end);\n    return value_;\n}\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a bigint.\n *\n * @example\n * ```ts\n * import { Bytes } from 'ox'\n *\n * Bytes.toBigInt(Bytes.from([1, 164]))\n * // @log: 420n\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Decoding options.\n * @returns Decoded bigint.\n */\nfunction toBigInt(bytes, options = {}) {\n    const { size } = options;\n    if (typeof size !== 'undefined')\n        _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.assertSize(bytes, size);\n    const hex = _Hex_js__WEBPACK_IMPORTED_MODULE_2__.fromBytes(bytes, options);\n    return _Hex_js__WEBPACK_IMPORTED_MODULE_2__.toBigInt(hex, options);\n}\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a boolean.\n *\n * @example\n * ```ts\n * import { Bytes } from 'ox'\n *\n * Bytes.toBoolean(Bytes.from([1]))\n * // @log: true\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Decoding options.\n * @returns Decoded boolean.\n */\nfunction toBoolean(bytes, options = {}) {\n    const { size } = options;\n    let bytes_ = bytes;\n    if (typeof size !== 'undefined') {\n        _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.assertSize(bytes_, size);\n        bytes_ = trimLeft(bytes_);\n    }\n    if (bytes_.length > 1 || bytes_[0] > 1)\n        throw new InvalidBytesBooleanError(bytes_);\n    return Boolean(bytes_[0]);\n}\n/**\n * Encodes a {@link ox#Bytes.Bytes} value into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.toHex(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Options.\n * @returns Decoded {@link ox#Hex.Hex} value.\n */\nfunction toHex(value, options = {}) {\n    return _Hex_js__WEBPACK_IMPORTED_MODULE_2__.fromBytes(value, options);\n}\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a number.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.toNumber(Bytes.from([1, 164]))\n * // @log: 420\n * ```\n */\nfunction toNumber(bytes, options = {}) {\n    const { size } = options;\n    if (typeof size !== 'undefined')\n        _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.assertSize(bytes, size);\n    const hex = _Hex_js__WEBPACK_IMPORTED_MODULE_2__.fromBytes(bytes, options);\n    return _Hex_js__WEBPACK_IMPORTED_MODULE_2__.toNumber(hex, options);\n}\n/**\n * Decodes a {@link ox#Bytes.Bytes} into a string.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * const data = Bytes.toString(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: 'Hello world'\n * ```\n *\n * @param bytes - The {@link ox#Bytes.Bytes} to decode.\n * @param options - Options.\n * @returns Decoded string.\n */\nfunction toString(bytes, options = {}) {\n    const { size } = options;\n    let bytes_ = bytes;\n    if (typeof size !== 'undefined') {\n        _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.assertSize(bytes_, size);\n        bytes_ = trimRight(bytes_);\n    }\n    return decoder.decode(bytes_);\n}\n/**\n * Trims leading zeros from a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.trimLeft(Bytes.from([0, 0, 0, 0, 1, 2, 3]))\n * // @log: Uint8Array([1, 2, 3])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value.\n * @returns Trimmed {@link ox#Bytes.Bytes} value.\n */\nfunction trimLeft(value) {\n    return _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.trim(value, { dir: 'left' });\n}\n/**\n * Trims trailing zeros from a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.trimRight(Bytes.from([1, 2, 3, 0, 0, 0, 0]))\n * // @log: Uint8Array([1, 2, 3])\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} value.\n * @returns Trimmed {@link ox#Bytes.Bytes} value.\n */\nfunction trimRight(value) {\n    return _internal_bytes_js__WEBPACK_IMPORTED_MODULE_0__.trim(value, { dir: 'right' });\n}\n/**\n * Checks if the given value is {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.validate('0x')\n * // @log: false\n *\n * Bytes.validate(Bytes.from([1, 2, 3]))\n * // @log: true\n * ```\n *\n * @param value - Value to check.\n * @returns `true` if the value is {@link ox#Bytes.Bytes}, otherwise `false`.\n */\nfunction validate(value) {\n    try {\n        assert(value);\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\n/**\n * Thrown when the bytes value cannot be represented as a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.toBoolean(Bytes.from([5]))\n * // @error: Bytes.InvalidBytesBooleanError: Bytes value `[5]` is not a valid boolean.\n * // @error: The bytes array must contain a single byte of either a `0` or `1` value.\n * ```\n */\nclass InvalidBytesBooleanError extends _Errors_js__WEBPACK_IMPORTED_MODULE_3__.BaseError {\n    constructor(bytes) {\n        super(`Bytes value \\`${bytes}\\` is not a valid boolean.`, {\n            metaMessages: [\n                'The bytes array must contain a single byte of either a `0` or `1` value.',\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Bytes.InvalidBytesBooleanError'\n        });\n    }\n}\n/**\n * Thrown when a value cannot be converted to bytes.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Bytes } from 'ox'\n *\n * Bytes.from('foo')\n * // @error: Bytes.InvalidBytesTypeError: Value `foo` of type `string` is an invalid Bytes value.\n * ```\n */\nclass InvalidBytesTypeError extends _Errors_js__WEBPACK_IMPORTED_MODULE_3__.BaseError {\n    constructor(value) {\n        super(`Value \\`${typeof value === 'object' ? _Json_js__WEBPACK_IMPORTED_MODULE_5__.stringify(value) : value}\\` of type \\`${typeof value}\\` is an invalid Bytes value.`, {\n            metaMessages: ['Bytes values must be of type `Bytes`.'],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Bytes.InvalidBytesTypeError'\n        });\n    }\n}\n/**\n * Thrown when a size exceeds the maximum allowed size.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.fromString('Hello World!', { size: 8 })\n * // @error: Bytes.SizeOverflowError: Size cannot exceed `8` bytes. Given size: `12` bytes.\n * ```\n */\nclass SizeOverflowError extends _Errors_js__WEBPACK_IMPORTED_MODULE_3__.BaseError {\n    constructor({ givenSize, maxSize }) {\n        super(`Size cannot exceed \\`${maxSize}\\` bytes. Given size: \\`${givenSize}\\` bytes.`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Bytes.SizeOverflowError'\n        });\n    }\n}\n/**\n * Thrown when a slice offset is out-of-bounds.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.slice(Bytes.from([1, 2, 3]), 4)\n * // @error: Bytes.SliceOffsetOutOfBoundsError: Slice starting at offset `4` is out-of-bounds (size: `3`).\n * ```\n */\nclass SliceOffsetOutOfBoundsError extends _Errors_js__WEBPACK_IMPORTED_MODULE_3__.BaseError {\n    constructor({ offset, position, size, }) {\n        super(`Slice ${position === 'start' ? 'starting' : 'ending'} at offset \\`${offset}\\` is out-of-bounds (size: \\`${size}\\`).`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Bytes.SliceOffsetOutOfBoundsError'\n        });\n    }\n}\n/**\n * Thrown when a the padding size exceeds the maximum allowed size.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.padLeft(Bytes.fromString('Hello World!'), 8)\n * // @error: [Bytes.SizeExceedsPaddingSizeError: Bytes size (`12`) exceeds padding size (`8`).\n * ```\n */\nclass SizeExceedsPaddingSizeError extends _Errors_js__WEBPACK_IMPORTED_MODULE_3__.BaseError {\n    constructor({ size, targetSize, type, }) {\n        super(`${type.charAt(0).toUpperCase()}${type\n            .slice(1)\n            .toLowerCase()} size (\\`${size}\\`) exceeds padding size (\\`${targetSize}\\`).`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Bytes.SizeExceedsPaddingSizeError'\n        });\n    }\n}\n//# sourceMappingURL=Bytes.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvQnl0ZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQTBEO0FBQ3BCO0FBQ047QUFDRTtBQUNjO0FBQ0U7QUFDbEQ7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDLHFCQUFxQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw2QkFBNkIscUJBQXFCO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDBCQUEwQixxQkFBcUI7QUFDL0M7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0IsbUJBQW1CO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLHNCQUFzQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHNCQUFzQjtBQUNyQztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxzREFBc0QscUJBQXFCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLHNCQUFzQjtBQUNyQztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Es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QSxZQUFZLFFBQVE7QUFDcEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDBDQUEwQyxpREFBZ0I7QUFDakUsa0JBQWtCLHlCQUF5QjtBQUMzQyxpQkFBaUIsNkJBQTZCLEVBQUU7QUFDaEQ7QUFDQSw0QkFBNEIsVUFBVSxLQUFLLDhCQUE4QixXQUFXO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL294L19lc20vY29yZS9CeXRlcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBlcXVhbEJ5dGVzIH0gZnJvbSAnQG5vYmxlL2N1cnZlcy9hYnN0cmFjdC91dGlscyc7XG5pbXBvcnQgKiBhcyBFcnJvcnMgZnJvbSAnLi9FcnJvcnMuanMnO1xuaW1wb3J0ICogYXMgSGV4IGZyb20gJy4vSGV4LmpzJztcbmltcG9ydCAqIGFzIEpzb24gZnJvbSAnLi9Kc29uLmpzJztcbmltcG9ydCAqIGFzIGludGVybmFsIGZyb20gJy4vaW50ZXJuYWwvYnl0ZXMuanMnO1xuaW1wb3J0ICogYXMgaW50ZXJuYWxfaGV4IGZyb20gJy4vaW50ZXJuYWwvaGV4LmpzJztcbmNvbnN0IGRlY29kZXIgPSAvKiNfX1BVUkVfXyovIG5ldyBUZXh0RGVjb2RlcigpO1xuY29uc3QgZW5jb2RlciA9IC8qI19fUFVSRV9fKi8gbmV3IFRleHRFbmNvZGVyKCk7XG4vKipcbiAqIEFzc2VydHMgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIHtAbGluayBveCNCeXRlcy5CeXRlc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBCeXRlcyB9IGZyb20gJ294J1xuICpcbiAqIEJ5dGVzLmFzc2VydCgnYWJjJylcbiAqIC8vIEBlcnJvcjogQnl0ZXMuSW52YWxpZEJ5dGVzVHlwZUVycm9yOlxuICogLy8gQGVycm9yOiBWYWx1ZSBgXCJhYmNcImAgb2YgdHlwZSBgc3RyaW5nYCBpcyBhbiBpbnZhbGlkIEJ5dGVzIHZhbHVlLlxuICogLy8gQGVycm9yOiBCeXRlcyB2YWx1ZXMgbXVzdCBiZSBvZiB0eXBlIGBVaW50OEFycmF5YC5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGFzc2VydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpXG4gICAgICAgIHJldHVybjtcbiAgICBpZiAoIXZhbHVlKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEJ5dGVzVHlwZUVycm9yKHZhbHVlKTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JylcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCeXRlc1R5cGVFcnJvcih2YWx1ZSk7XG4gICAgaWYgKCEoJ0JZVEVTX1BFUl9FTEVNRU5UJyBpbiB2YWx1ZSkpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQnl0ZXNUeXBlRXJyb3IodmFsdWUpO1xuICAgIGlmICh2YWx1ZS5CWVRFU19QRVJfRUxFTUVOVCAhPT0gMSB8fCB2YWx1ZS5jb25zdHJ1Y3Rvci5uYW1lICE9PSAnVWludDhBcnJheScpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQnl0ZXNUeXBlRXJyb3IodmFsdWUpO1xufVxuLyoqXG4gKiBDb25jYXRlbmF0ZXMgdHdvIG9yIG1vcmUge0BsaW5rIG94I0J5dGVzLkJ5dGVzfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgYnl0ZXMgPSBCeXRlcy5jb25jYXQoXG4gKiAgIEJ5dGVzLmZyb20oWzFdKSxcbiAqICAgQnl0ZXMuZnJvbShbNjldKSxcbiAqICAgQnl0ZXMuZnJvbShbNDIwLCA2OV0pLFxuICogKVxuICogLy8gQGxvZzogVWludDhBcnJheSBbIDEsIDY5LCA0MjAsIDY5IF1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgLSBWYWx1ZXMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcmV0dXJucyBDb25jYXRlbmF0ZWQge0BsaW5rIG94I0J5dGVzLkJ5dGVzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmNhdCguLi52YWx1ZXMpIHtcbiAgICBsZXQgbGVuZ3RoID0gMDtcbiAgICBmb3IgKGNvbnN0IGFyciBvZiB2YWx1ZXMpIHtcbiAgICAgICAgbGVuZ3RoICs9IGFyci5sZW5ndGg7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDAsIGluZGV4ID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhcnIgPSB2YWx1ZXNbaV07XG4gICAgICAgIHJlc3VsdC5zZXQoYXJyLCBpbmRleCk7XG4gICAgICAgIGluZGV4ICs9IGFyci5sZW5ndGg7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEluc3RhbnRpYXRlcyBhIHtAbGluayBveCNCeXRlcy5CeXRlc30gdmFsdWUgZnJvbSBhIGBVaW50OEFycmF5YCwgYSBoZXggc3RyaW5nLCBvciBhbiBhcnJheSBvZiB1bnNpZ25lZCA4LWJpdCBpbnRlZ2Vycy5cbiAqXG4gKiA6Ojp0aXBcbiAqXG4gKiBUbyBpbnN0YW50aWF0ZSBmcm9tIGEgKipCb29sZWFuKiosICoqU3RyaW5nKiosIG9yICoqTnVtYmVyKiosIHVzZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAtIGBCeXRlcy5mcm9tQm9vbGVhbmBcbiAqXG4gKiAtIGBCeXRlcy5mcm9tU3RyaW5nYFxuICpcbiAqIC0gYEJ5dGVzLmZyb21OdW1iZXJgXG4gKlxuICogOjo6XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiAvLyBAbm9FcnJvcnNcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgZGF0YSA9IEJ5dGVzLmZyb20oWzI1NSwgMTI0LCA1LCA0XSlcbiAqIC8vIEBsb2c6IFVpbnQ4QXJyYXkoWzI1NSwgMTI0LCA1LCA0XSlcbiAqXG4gKiBjb25zdCBkYXRhID0gQnl0ZXMuZnJvbSgnMHhkZWFkYmVlZicpXG4gKiAvLyBAbG9nOiBVaW50OEFycmF5KFsyMjIsIDE3MywgMTkwLCAyMzldKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY29udmVydC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb20odmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBVaW50OEFycmF5KVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpXG4gICAgICAgIHJldHVybiBmcm9tSGV4KHZhbHVlKTtcbiAgICByZXR1cm4gZnJvbUFycmF5KHZhbHVlKTtcbn1cbi8qKlxuICogQ29udmVydHMgYW4gYXJyYXkgb2YgdW5zaWduZWQgOC1iaXQgaW50ZWdlcnMgaW50byB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBjb25zdCBkYXRhID0gQnl0ZXMuZnJvbUFycmF5KFsyNTUsIDEyNCwgNSwgNF0pXG4gKiAvLyBAbG9nOiBVaW50OEFycmF5KFsyNTUsIDEyNCwgNSwgNF0pXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbUFycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSA/IHZhbHVlIDogbmV3IFVpbnQ4QXJyYXkodmFsdWUpO1xufVxuLyoqXG4gKiBFbmNvZGVzIGEgYm9vbGVhbiB2YWx1ZSBpbnRvIHtAbGluayBveCNCeXRlcy5CeXRlc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBCeXRlcyB9IGZyb20gJ294J1xuICpcbiAqIGNvbnN0IGRhdGEgPSBCeXRlcy5mcm9tQm9vbGVhbih0cnVlKVxuICogLy8gQGxvZzogVWludDhBcnJheShbMV0pXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgZGF0YSA9IEJ5dGVzLmZyb21Cb29sZWFuKHRydWUsIHsgc2l6ZTogMzIgfSlcbiAqIC8vIEBsb2c6IFVpbnQ4QXJyYXkoWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDFdKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gQm9vbGVhbiB2YWx1ZSB0byBlbmNvZGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEVuY29kaW5nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBFbmNvZGVkIHtAbGluayBveCNCeXRlcy5CeXRlc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQm9vbGVhbih2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBzaXplIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMSk7XG4gICAgYnl0ZXNbMF0gPSBOdW1iZXIodmFsdWUpO1xuICAgIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaW50ZXJuYWwuYXNzZXJ0U2l6ZShieXRlcywgc2l6ZSk7XG4gICAgICAgIHJldHVybiBwYWRMZWZ0KGJ5dGVzLCBzaXplKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuLyoqXG4gKiBFbmNvZGVzIGEge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIGludG8ge0BsaW5rIG94I0J5dGVzLkJ5dGVzfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgZGF0YSA9IEJ5dGVzLmZyb21IZXgoJzB4NDg2NTZjNmM2ZjIwNzc2ZjcyNmM2NDIxJylcbiAqIC8vIEBsb2c6IFVpbnQ4QXJyYXkoWzcyLCAxMDEsIDEwOCwgMTA4LCAxMTEsIDMyLCA4NywgMTExLCAxMTQsIDEwOCwgMTAwLCAzM10pXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgZGF0YSA9IEJ5dGVzLmZyb21IZXgoJzB4NDg2NTZjNmM2ZjIwNzc2ZjcyNmM2NDIxJywgeyBzaXplOiAzMiB9KVxuICogLy8gQGxvZzogVWludDhBcnJheShbNzIsIDEwMSwgMTA4LCAxMDgsIDExMSwgMzIsIDg3LCAxMTEsIDExNCwgMTA4LCAxMDAsIDMzLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZSB0byBlbmNvZGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEVuY29kaW5nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBFbmNvZGVkIHtAbGluayBveCNCeXRlcy5CeXRlc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tSGV4KHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IHNpemUgfSA9IG9wdGlvbnM7XG4gICAgbGV0IGhleCA9IHZhbHVlO1xuICAgIGlmIChzaXplKSB7XG4gICAgICAgIGludGVybmFsX2hleC5hc3NlcnRTaXplKHZhbHVlLCBzaXplKTtcbiAgICAgICAgaGV4ID0gSGV4LnBhZFJpZ2h0KHZhbHVlLCBzaXplKTtcbiAgICB9XG4gICAgbGV0IGhleFN0cmluZyA9IGhleC5zbGljZSgyKTtcbiAgICBpZiAoaGV4U3RyaW5nLmxlbmd0aCAlIDIpXG4gICAgICAgIGhleFN0cmluZyA9IGAwJHtoZXhTdHJpbmd9YDtcbiAgICBjb25zdCBsZW5ndGggPSBoZXhTdHJpbmcubGVuZ3RoIC8gMjtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCk7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwLCBqID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgY29uc3QgbmliYmxlTGVmdCA9IGludGVybmFsLmNoYXJDb2RlVG9CYXNlMTYoaGV4U3RyaW5nLmNoYXJDb2RlQXQoaisrKSk7XG4gICAgICAgIGNvbnN0IG5pYmJsZVJpZ2h0ID0gaW50ZXJuYWwuY2hhckNvZGVUb0Jhc2UxNihoZXhTdHJpbmcuY2hhckNvZGVBdChqKyspKTtcbiAgICAgICAgaWYgKG5pYmJsZUxlZnQgPT09IHVuZGVmaW5lZCB8fCBuaWJibGVSaWdodCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3JzLkJhc2VFcnJvcihgSW52YWxpZCBieXRlIHNlcXVlbmNlIChcIiR7aGV4U3RyaW5nW2ogLSAyXX0ke2hleFN0cmluZ1tqIC0gMV19XCIgaW4gXCIke2hleFN0cmluZ31cIikuYCk7XG4gICAgICAgIH1cbiAgICAgICAgYnl0ZXNbaW5kZXhdID0gbmliYmxlTGVmdCAqIDE2ICsgbmliYmxlUmlnaHQ7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbi8qKlxuICogRW5jb2RlcyBhIG51bWJlciB2YWx1ZSBpbnRvIHtAbGluayBveCNCeXRlcy5CeXRlc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBCeXRlcyB9IGZyb20gJ294J1xuICpcbiAqIGNvbnN0IGRhdGEgPSBCeXRlcy5mcm9tTnVtYmVyKDQyMClcbiAqIC8vIEBsb2c6IFVpbnQ4QXJyYXkoWzEsIDE2NF0pXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgZGF0YSA9IEJ5dGVzLmZyb21OdW1iZXIoNDIwLCB7IHNpemU6IDQgfSlcbiAqIC8vIEBsb2c6IFVpbnQ4QXJyYXkoWzAsIDAsIDEsIDE2NF0pXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBOdW1iZXIgdmFsdWUgdG8gZW5jb2RlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBFbmNvZGluZyBvcHRpb25zLlxuICogQHJldHVybnMgRW5jb2RlZCB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgb3B0aW9ucykge1xuICAgIGNvbnN0IGhleCA9IEhleC5mcm9tTnVtYmVyKHZhbHVlLCBvcHRpb25zKTtcbiAgICByZXR1cm4gZnJvbUhleChoZXgpO1xufVxuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIGludG8ge0BsaW5rIG94I0J5dGVzLkJ5dGVzfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgZGF0YSA9IEJ5dGVzLmZyb21TdHJpbmcoJ0hlbGxvIHdvcmxkIScpXG4gKiAvLyBAbG9nOiBVaW50OEFycmF5KFs3MiwgMTAxLCAxMDgsIDEwOCwgMTExLCAzMiwgMTE5LCAxMTEsIDExNCwgMTA4LCAxMDAsIDMzXSlcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBjb25zdCBkYXRhID0gQnl0ZXMuZnJvbVN0cmluZygnSGVsbG8gd29ybGQhJywgeyBzaXplOiAzMiB9KVxuICogLy8gQGxvZzogVWludDhBcnJheShbNzIsIDEwMSwgMTA4LCAxMDgsIDExMSwgMzIsIDg3LCAxMTEsIDExNCwgMTA4LCAxMDAsIDMzLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFN0cmluZyB0byBlbmNvZGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIEVuY29kaW5nIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBFbmNvZGVkIHtAbGluayBveCNCeXRlcy5CeXRlc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IHNpemUgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYnl0ZXMgPSBlbmNvZGVyLmVuY29kZSh2YWx1ZSk7XG4gICAgaWYgKHR5cGVvZiBzaXplID09PSAnbnVtYmVyJykge1xuICAgICAgICBpbnRlcm5hbC5hc3NlcnRTaXplKGJ5dGVzLCBzaXplKTtcbiAgICAgICAgcmV0dXJuIHBhZFJpZ2h0KGJ5dGVzLCBzaXplKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ5dGVzO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgdHdvIHtAbGluayBveCNCeXRlcy5CeXRlc30gdmFsdWVzIGFyZSBlcXVhbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogQnl0ZXMuaXNFcXVhbChCeXRlcy5mcm9tKFsxXSksIEJ5dGVzLmZyb20oWzFdKSlcbiAqIC8vIEBsb2c6IHRydWVcbiAqXG4gKiBCeXRlcy5pc0VxdWFsKEJ5dGVzLmZyb20oWzFdKSwgQnl0ZXMuZnJvbShbMl0pKVxuICogLy8gQGxvZzogZmFsc2VcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBieXRlc0EgLSBGaXJzdCB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IHZhbHVlLlxuICogQHBhcmFtIGJ5dGVzQiAtIFNlY29uZCB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IHZhbHVlLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0d28gdmFsdWVzIGFyZSBlcXVhbCwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VxdWFsKGJ5dGVzQSwgYnl0ZXNCKSB7XG4gICAgcmV0dXJuIGVxdWFsQnl0ZXMoYnl0ZXNBLCBieXRlc0IpO1xufVxuLyoqXG4gKiBQYWRzIGEge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZSB0byB0aGUgbGVmdCB3aXRoIHplcm8gYnl0ZXMgdW50aWwgaXQgcmVhY2hlcyB0aGUgZ2l2ZW4gYHNpemVgIChkZWZhdWx0OiAzMiBieXRlcykuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBCeXRlcyB9IGZyb20gJ294J1xuICpcbiAqIEJ5dGVzLnBhZExlZnQoQnl0ZXMuZnJvbShbMV0pLCA0KVxuICogLy8gQGxvZzogVWludDhBcnJheShbMCwgMCwgMCwgMV0pXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IHZhbHVlIHRvIHBhZC5cbiAqIEBwYXJhbSBzaXplIC0gU2l6ZSB0byBwYWQgdGhlIHtAbGluayBveCNCeXRlcy5CeXRlc30gdmFsdWUgdG8uXG4gKiBAcmV0dXJucyBQYWRkZWQge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZExlZnQodmFsdWUsIHNpemUpIHtcbiAgICByZXR1cm4gaW50ZXJuYWwucGFkKHZhbHVlLCB7IGRpcjogJ2xlZnQnLCBzaXplIH0pO1xufVxuLyoqXG4gKiBQYWRzIGEge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZSB0byB0aGUgcmlnaHQgd2l0aCB6ZXJvIGJ5dGVzIHVudGlsIGl0IHJlYWNoZXMgdGhlIGdpdmVuIGBzaXplYCAoZGVmYXVsdDogMzIgYnl0ZXMpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy5wYWRSaWdodChCeXRlcy5mcm9tKFsxXSksIDQpXG4gKiAvLyBAbG9nOiBVaW50OEFycmF5KFsxLCAwLCAwLCAwXSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIHtAbGluayBveCNCeXRlcy5CeXRlc30gdmFsdWUgdG8gcGFkLlxuICogQHBhcmFtIHNpemUgLSBTaXplIHRvIHBhZCB0aGUge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZSB0by5cbiAqIEByZXR1cm5zIFBhZGRlZCB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFkUmlnaHQodmFsdWUsIHNpemUpIHtcbiAgICByZXR1cm4gaW50ZXJuYWwucGFkKHZhbHVlLCB7IGRpcjogJ3JpZ2h0Jywgc2l6ZSB9KTtcbn1cbi8qKlxuICogR2VuZXJhdGVzIHJhbmRvbSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBjb25zdCBieXRlcyA9IEJ5dGVzLnJhbmRvbSgzMilcbiAqIC8vIEBsb2c6IFVpbnQ4QXJyYXkoWy4uLiB4MzJdKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGxlbmd0aCAtIExlbmd0aCBvZiB0aGUgcmFuZG9tIHtAbGluayBveCNCeXRlcy5CeXRlc30gdG8gZ2VuZXJhdGUuXG4gKiBAcmV0dXJucyBSYW5kb20ge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSBvZiB0aGUgc3BlY2lmaWVkIGxlbmd0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbShsZW5ndGgpIHtcbiAgICByZXR1cm4gY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShsZW5ndGgpKTtcbn1cbi8qKlxuICogUmV0cmlldmVzIHRoZSBzaXplIG9mIGEge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogQnl0ZXMuc2l6ZShCeXRlcy5mcm9tKFsxLCAyLCAzLCA0XSkpXG4gKiAvLyBAbG9nOiA0XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IHZhbHVlLlxuICogQHJldHVybnMgU2l6ZSBvZiB0aGUge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpemUodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUubGVuZ3RoO1xufVxuLyoqXG4gKiBSZXR1cm5zIGEgc2VjdGlvbiBvZiBhIHtAbGluayBveCNCeXRlcy5CeXRlc30gdmFsdWUgZ2l2ZW4gYSBzdGFydC9lbmQgYnl0ZXMgb2Zmc2V0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy5zbGljZShcbiAqICAgQnl0ZXMuZnJvbShbMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0pLFxuICogICAxLFxuICogICA0LFxuICogKVxuICogLy8gQGxvZzogVWludDhBcnJheShbMiwgMywgNF0pXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZS5cbiAqIEBwYXJhbSBzdGFydCAtIFN0YXJ0IG9mZnNldC5cbiAqIEBwYXJhbSBlbmQgLSBFbmQgb2Zmc2V0LlxuICogQHBhcmFtIG9wdGlvbnMgLSBTbGljZSBvcHRpb25zLlxuICogQHJldHVybnMgU2xpY2VkIHtAbGluayBveCNCeXRlcy5CeXRlc30gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZSh2YWx1ZSwgc3RhcnQsIGVuZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBzdHJpY3QgfSA9IG9wdGlvbnM7XG4gICAgaW50ZXJuYWwuYXNzZXJ0U3RhcnRPZmZzZXQodmFsdWUsIHN0YXJ0KTtcbiAgICBjb25zdCB2YWx1ZV8gPSB2YWx1ZS5zbGljZShzdGFydCwgZW5kKTtcbiAgICBpZiAoc3RyaWN0KVxuICAgICAgICBpbnRlcm5hbC5hc3NlcnRFbmRPZmZzZXQodmFsdWVfLCBzdGFydCwgZW5kKTtcbiAgICByZXR1cm4gdmFsdWVfO1xufVxuLyoqXG4gKiBEZWNvZGVzIGEge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSBpbnRvIGEgYmlnaW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy50b0JpZ0ludChCeXRlcy5mcm9tKFsxLCAxNjRdKSlcbiAqIC8vIEBsb2c6IDQyMG5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBieXRlcyAtIFRoZSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IHRvIGRlY29kZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gRGVjb2Rpbmcgb3B0aW9ucy5cbiAqIEByZXR1cm5zIERlY29kZWQgYmlnaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9CaWdJbnQoYnl0ZXMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgc2l6ZSB9ID0gb3B0aW9ucztcbiAgICBpZiAodHlwZW9mIHNpemUgIT09ICd1bmRlZmluZWQnKVxuICAgICAgICBpbnRlcm5hbC5hc3NlcnRTaXplKGJ5dGVzLCBzaXplKTtcbiAgICBjb25zdCBoZXggPSBIZXguZnJvbUJ5dGVzKGJ5dGVzLCBvcHRpb25zKTtcbiAgICByZXR1cm4gSGV4LnRvQmlnSW50KGhleCwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlY29kZXMgYSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IGludG8gYSBib29sZWFuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy50b0Jvb2xlYW4oQnl0ZXMuZnJvbShbMV0pKVxuICogLy8gQGxvZzogdHJ1ZVxuICogYGBgXG4gKlxuICogQHBhcmFtIGJ5dGVzIC0gVGhlIHtAbGluayBveCNCeXRlcy5CeXRlc30gdG8gZGVjb2RlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBEZWNvZGluZyBvcHRpb25zLlxuICogQHJldHVybnMgRGVjb2RlZCBib29sZWFuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Cb29sZWFuKGJ5dGVzLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IHNpemUgfSA9IG9wdGlvbnM7XG4gICAgbGV0IGJ5dGVzXyA9IGJ5dGVzO1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgaW50ZXJuYWwuYXNzZXJ0U2l6ZShieXRlc18sIHNpemUpO1xuICAgICAgICBieXRlc18gPSB0cmltTGVmdChieXRlc18pO1xuICAgIH1cbiAgICBpZiAoYnl0ZXNfLmxlbmd0aCA+IDEgfHwgYnl0ZXNfWzBdID4gMSlcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRCeXRlc0Jvb2xlYW5FcnJvcihieXRlc18pO1xuICAgIHJldHVybiBCb29sZWFuKGJ5dGVzX1swXSk7XG59XG4vKipcbiAqIEVuY29kZXMgYSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IHZhbHVlIGludG8gYSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBCeXRlcyB9IGZyb20gJ294J1xuICpcbiAqIEJ5dGVzLnRvSGV4KEJ5dGVzLmZyb20oWzcyLCAxMDEsIDEwOCwgMTA4LCAxMTEsIDMyLCA4NywgMTExLCAxMTQsIDEwOCwgMTAwLCAzM10pKVxuICogLy8gJzB4NDg2NTZjNmM2ZjIwNTc2ZjcyNmM2NDIxJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHtAbGluayBveCNCeXRlcy5CeXRlc30gdG8gZGVjb2RlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zLlxuICogQHJldHVybnMgRGVjb2RlZCB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0hleCh2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgcmV0dXJuIEhleC5mcm9tQnl0ZXModmFsdWUsIG9wdGlvbnMpO1xufVxuLyoqXG4gKiBEZWNvZGVzIGEge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSBpbnRvIGEgbnVtYmVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy50b051bWJlcihCeXRlcy5mcm9tKFsxLCAxNjRdKSlcbiAqIC8vIEBsb2c6IDQyMFxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b051bWJlcihieXRlcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBzaXplIH0gPSBvcHRpb25zO1xuICAgIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ3VuZGVmaW5lZCcpXG4gICAgICAgIGludGVybmFsLmFzc2VydFNpemUoYnl0ZXMsIHNpemUpO1xuICAgIGNvbnN0IGhleCA9IEhleC5mcm9tQnl0ZXMoYnl0ZXMsIG9wdGlvbnMpO1xuICAgIHJldHVybiBIZXgudG9OdW1iZXIoaGV4LCBvcHRpb25zKTtcbn1cbi8qKlxuICogRGVjb2RlcyBhIHtAbGluayBveCNCeXRlcy5CeXRlc30gaW50byBhIHN0cmluZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgZGF0YSA9IEJ5dGVzLnRvU3RyaW5nKEJ5dGVzLmZyb20oWzcyLCAxMDEsIDEwOCwgMTA4LCAxMTEsIDMyLCA4NywgMTExLCAxMTQsIDEwOCwgMTAwLCAzM10pKVxuICogLy8gQGxvZzogJ0hlbGxvIHdvcmxkJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIGJ5dGVzIC0gVGhlIHtAbGluayBveCNCeXRlcy5CeXRlc30gdG8gZGVjb2RlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zLlxuICogQHJldHVybnMgRGVjb2RlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1N0cmluZyhieXRlcywgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBzaXplIH0gPSBvcHRpb25zO1xuICAgIGxldCBieXRlc18gPSBieXRlcztcbiAgICBpZiAodHlwZW9mIHNpemUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGludGVybmFsLmFzc2VydFNpemUoYnl0ZXNfLCBzaXplKTtcbiAgICAgICAgYnl0ZXNfID0gdHJpbVJpZ2h0KGJ5dGVzXyk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVyLmRlY29kZShieXRlc18pO1xufVxuLyoqXG4gKiBUcmltcyBsZWFkaW5nIHplcm9zIGZyb20gYSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy50cmltTGVmdChCeXRlcy5mcm9tKFswLCAwLCAwLCAwLCAxLCAyLCAzXSkpXG4gKiAvLyBAbG9nOiBVaW50OEFycmF5KFsxLCAyLCAzXSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIHtAbGluayBveCNCeXRlcy5CeXRlc30gdmFsdWUuXG4gKiBAcmV0dXJucyBUcmltbWVkIHtAbGluayBveCNCeXRlcy5CeXRlc30gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltTGVmdCh2YWx1ZSkge1xuICAgIHJldHVybiBpbnRlcm5hbC50cmltKHZhbHVlLCB7IGRpcjogJ2xlZnQnIH0pO1xufVxuLyoqXG4gKiBUcmltcyB0cmFpbGluZyB6ZXJvcyBmcm9tIGEge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogQnl0ZXMudHJpbVJpZ2h0KEJ5dGVzLmZyb20oWzEsIDIsIDMsIDAsIDAsIDAsIDBdKSlcbiAqIC8vIEBsb2c6IFVpbnQ4QXJyYXkoWzEsIDIsIDNdKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0ge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZS5cbiAqIEByZXR1cm5zIFRyaW1tZWQge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1SaWdodCh2YWx1ZSkge1xuICAgIHJldHVybiBpbnRlcm5hbC50cmltKHZhbHVlLCB7IGRpcjogJ3JpZ2h0JyB9KTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy52YWxpZGF0ZSgnMHgnKVxuICogLy8gQGxvZzogZmFsc2VcbiAqXG4gKiBCeXRlcy52YWxpZGF0ZShCeXRlcy5mcm9tKFsxLCAyLCAzXSkpXG4gKiAvLyBAbG9nOiB0cnVlXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWUgaXMge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSwgb3RoZXJ3aXNlIGBmYWxzZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZSh2YWx1ZSkge1xuICAgIHRyeSB7XG4gICAgICAgIGFzc2VydCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBieXRlcyB2YWx1ZSBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgYSBib29sZWFuLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy50b0Jvb2xlYW4oQnl0ZXMuZnJvbShbNV0pKVxuICogLy8gQGVycm9yOiBCeXRlcy5JbnZhbGlkQnl0ZXNCb29sZWFuRXJyb3I6IEJ5dGVzIHZhbHVlIGBbNV1gIGlzIG5vdCBhIHZhbGlkIGJvb2xlYW4uXG4gKiAvLyBAZXJyb3I6IFRoZSBieXRlcyBhcnJheSBtdXN0IGNvbnRhaW4gYSBzaW5nbGUgYnl0ZSBvZiBlaXRoZXIgYSBgMGAgb3IgYDFgIHZhbHVlLlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQnl0ZXNCb29sZWFuRXJyb3IgZXh0ZW5kcyBFcnJvcnMuQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihieXRlcykge1xuICAgICAgICBzdXBlcihgQnl0ZXMgdmFsdWUgXFxgJHtieXRlc31cXGAgaXMgbm90IGEgdmFsaWQgYm9vbGVhbi5gLCB7XG4gICAgICAgICAgICBtZXRhTWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAgICAnVGhlIGJ5dGVzIGFycmF5IG11c3QgY29udGFpbiBhIHNpbmdsZSBieXRlIG9mIGVpdGhlciBhIGAwYCBvciBgMWAgdmFsdWUuJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnQnl0ZXMuSW52YWxpZEJ5dGVzQm9vbGVhbkVycm9yJ1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKipcbiAqIFRocm93biB3aGVuIGEgdmFsdWUgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBieXRlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIC8vIEBub0Vycm9yc1xuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy5mcm9tKCdmb28nKVxuICogLy8gQGVycm9yOiBCeXRlcy5JbnZhbGlkQnl0ZXNUeXBlRXJyb3I6IFZhbHVlIGBmb29gIG9mIHR5cGUgYHN0cmluZ2AgaXMgYW4gaW52YWxpZCBCeXRlcyB2YWx1ZS5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZEJ5dGVzVHlwZUVycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgc3VwZXIoYFZhbHVlIFxcYCR7dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IEpzb24uc3RyaW5naWZ5KHZhbHVlKSA6IHZhbHVlfVxcYCBvZiB0eXBlIFxcYCR7dHlwZW9mIHZhbHVlfVxcYCBpcyBhbiBpbnZhbGlkIEJ5dGVzIHZhbHVlLmAsIHtcbiAgICAgICAgICAgIG1ldGFNZXNzYWdlczogWydCeXRlcyB2YWx1ZXMgbXVzdCBiZSBvZiB0eXBlIGBCeXRlc2AuJ10sXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnQnl0ZXMuSW52YWxpZEJ5dGVzVHlwZUVycm9yJ1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKipcbiAqIFRocm93biB3aGVuIGEgc2l6ZSBleGNlZWRzIHRoZSBtYXhpbXVtIGFsbG93ZWQgc2l6ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzIH0gZnJvbSAnb3gnXG4gKlxuICogQnl0ZXMuZnJvbVN0cmluZygnSGVsbG8gV29ybGQhJywgeyBzaXplOiA4IH0pXG4gKiAvLyBAZXJyb3I6IEJ5dGVzLlNpemVPdmVyZmxvd0Vycm9yOiBTaXplIGNhbm5vdCBleGNlZWQgYDhgIGJ5dGVzLiBHaXZlbiBzaXplOiBgMTJgIGJ5dGVzLlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTaXplT3ZlcmZsb3dFcnJvciBleHRlbmRzIEVycm9ycy5CYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHsgZ2l2ZW5TaXplLCBtYXhTaXplIH0pIHtcbiAgICAgICAgc3VwZXIoYFNpemUgY2Fubm90IGV4Y2VlZCBcXGAke21heFNpemV9XFxgIGJ5dGVzLiBHaXZlbiBzaXplOiBcXGAke2dpdmVuU2l6ZX1cXGAgYnl0ZXMuYCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdCeXRlcy5TaXplT3ZlcmZsb3dFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIHNsaWNlIG9mZnNldCBpcyBvdXQtb2YtYm91bmRzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy5zbGljZShCeXRlcy5mcm9tKFsxLCAyLCAzXSksIDQpXG4gKiAvLyBAZXJyb3I6IEJ5dGVzLlNsaWNlT2Zmc2V0T3V0T2ZCb3VuZHNFcnJvcjogU2xpY2Ugc3RhcnRpbmcgYXQgb2Zmc2V0IGA0YCBpcyBvdXQtb2YtYm91bmRzIChzaXplOiBgM2ApLlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTbGljZU9mZnNldE91dE9mQm91bmRzRXJyb3IgZXh0ZW5kcyBFcnJvcnMuQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7IG9mZnNldCwgcG9zaXRpb24sIHNpemUsIH0pIHtcbiAgICAgICAgc3VwZXIoYFNsaWNlICR7cG9zaXRpb24gPT09ICdzdGFydCcgPyAnc3RhcnRpbmcnIDogJ2VuZGluZyd9IGF0IG9mZnNldCBcXGAke29mZnNldH1cXGAgaXMgb3V0LW9mLWJvdW5kcyAoc2l6ZTogXFxgJHtzaXplfVxcYCkuYCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdCeXRlcy5TbGljZU9mZnNldE91dE9mQm91bmRzRXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogVGhyb3duIHdoZW4gYSB0aGUgcGFkZGluZyBzaXplIGV4Y2VlZHMgdGhlIG1heGltdW0gYWxsb3dlZCBzaXplLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMgfSBmcm9tICdveCdcbiAqXG4gKiBCeXRlcy5wYWRMZWZ0KEJ5dGVzLmZyb21TdHJpbmcoJ0hlbGxvIFdvcmxkIScpLCA4KVxuICogLy8gQGVycm9yOiBbQnl0ZXMuU2l6ZUV4Y2VlZHNQYWRkaW5nU2l6ZUVycm9yOiBCeXRlcyBzaXplIChgMTJgKSBleGNlZWRzIHBhZGRpbmcgc2l6ZSAoYDhgKS5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU2l6ZUV4Y2VlZHNQYWRkaW5nU2l6ZUVycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IoeyBzaXplLCB0YXJnZXRTaXplLCB0eXBlLCB9KSB7XG4gICAgICAgIHN1cGVyKGAke3R5cGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHt0eXBlXG4gICAgICAgICAgICAuc2xpY2UoMSlcbiAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpfSBzaXplIChcXGAke3NpemV9XFxgKSBleGNlZWRzIHBhZGRpbmcgc2l6ZSAoXFxgJHt0YXJnZXRTaXplfVxcYCkuYCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdCeXRlcy5TaXplRXhjZWVkc1BhZGRpbmdTaXplRXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUJ5dGVzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/Bytes.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/Caches.js":
/*!*********************************************!*\
  !*** ./node_modules/ox/_esm/core/Caches.js ***!
  \*********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   checksum: () => (/* binding */ checksum),\n/* harmony export */   clear: () => (/* binding */ clear)\n/* harmony export */ });\n/* harmony import */ var _internal_lru_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/lru.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/internal/lru.js\");\n\nconst caches = {\n    checksum: /*#__PURE__*/ new _internal_lru_js__WEBPACK_IMPORTED_MODULE_0__.LruMap(8192),\n};\nconst checksum = caches.checksum;\n/**\n * Clears all global caches.\n *\n * @example\n * ```ts\n * import { Caches } from 'ox'\n * Caches.clear()\n * ```\n */\nfunction clear() {\n    for (const cache of Object.values(caches))\n        cache.clear();\n}\n//# sourceMappingURL=Caches.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvQ2FjaGVzLmpzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUEyQztBQUMzQztBQUNBLGdDQUFnQyxvREFBTTtBQUN0QztBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksU0FBUztBQUNyQjtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL294L19lc20vY29yZS9DYWNoZXMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTHJ1TWFwIH0gZnJvbSAnLi9pbnRlcm5hbC9scnUuanMnO1xuY29uc3QgY2FjaGVzID0ge1xuICAgIGNoZWNrc3VtOiAvKiNfX1BVUkVfXyovIG5ldyBMcnVNYXAoODE5MiksXG59O1xuZXhwb3J0IGNvbnN0IGNoZWNrc3VtID0gY2FjaGVzLmNoZWNrc3VtO1xuLyoqXG4gKiBDbGVhcnMgYWxsIGdsb2JhbCBjYWNoZXMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBDYWNoZXMgfSBmcm9tICdveCdcbiAqIENhY2hlcy5jbGVhcigpXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgIGZvciAoY29uc3QgY2FjaGUgb2YgT2JqZWN0LnZhbHVlcyhjYWNoZXMpKVxuICAgICAgICBjYWNoZS5jbGVhcigpO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Q2FjaGVzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/Caches.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/Errors.js":
/*!*********************************************!*\
  !*** ./node_modules/ox/_esm/core/Errors.js ***!
  \*********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   BaseError: () => (/* binding */ BaseError)\n/* harmony export */ });\n/* harmony import */ var _internal_errors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/errors.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/internal/errors.js\");\n\n/**\n * Base error class inherited by all errors thrown by ox.\n *\n * @example\n * ```ts\n * import { Errors } from 'ox'\n * throw new Errors.BaseError('An error occurred')\n * ```\n */\nclass BaseError extends Error {\n    constructor(shortMessage, options = {}) {\n        const details = (() => {\n            if (options.cause instanceof BaseError) {\n                if (options.cause.details)\n                    return options.cause.details;\n                if (options.cause.shortMessage)\n                    return options.cause.shortMessage;\n            }\n            if (options.cause?.message)\n                return options.cause.message;\n            return options.details;\n        })();\n        const docsPath = (() => {\n            if (options.cause instanceof BaseError)\n                return options.cause.docsPath || options.docsPath;\n            return options.docsPath;\n        })();\n        const docsBaseUrl = 'https://oxlib.sh';\n        const docs = `${docsBaseUrl}${docsPath ?? ''}`;\n        const message = [\n            shortMessage || 'An error occurred.',\n            ...(options.metaMessages ? ['', ...options.metaMessages] : []),\n            ...(details || docsPath\n                ? [\n                    '',\n                    details ? `Details: ${details}` : undefined,\n                    docsPath ? `See: ${docs}` : undefined,\n                ]\n                : []),\n        ]\n            .filter((x) => typeof x === 'string')\n            .join('\\n');\n        super(message, options.cause ? { cause: options.cause } : undefined);\n        Object.defineProperty(this, \"details\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"docs\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"docsPath\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"shortMessage\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"cause\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'BaseError'\n        });\n        Object.defineProperty(this, \"version\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: `ox@${(0,_internal_errors_js__WEBPACK_IMPORTED_MODULE_0__.getVersion)()}`\n        });\n        this.cause = options.cause;\n        this.details = details;\n        this.docs = docs;\n        this.docsPath = docsPath;\n        this.shortMessage = shortMessage;\n    }\n    walk(fn) {\n        return walk(this, fn);\n    }\n}\n/** @internal */\nfunction walk(err, fn) {\n    if (fn?.(err))\n        return err;\n    if (err && typeof err === 'object' && 'cause' in err && err.cause)\n        return walk(err.cause, fn);\n    return fn ? null : err;\n}\n//# sourceMappingURL=Errors.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvRXJyb3JzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQWtEO0FBQ2xEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ087QUFDUCwwQ0FBMEM7QUFDMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQSx3QkFBd0IsWUFBWSxFQUFFLGVBQWU7QUFDckQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMENBQTBDLFFBQVE7QUFDbEQsdUNBQXVDLEtBQUs7QUFDNUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlDQUF5Qyx1QkFBdUI7QUFDaEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsK0RBQVUsR0FBRztBQUN0QyxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvb3gvX2VzbS9jb3JlL0Vycm9ycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRWZXJzaW9uIH0gZnJvbSAnLi9pbnRlcm5hbC9lcnJvcnMuanMnO1xuLyoqXG4gKiBCYXNlIGVycm9yIGNsYXNzIGluaGVyaXRlZCBieSBhbGwgZXJyb3JzIHRocm93biBieSBveC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IEVycm9ycyB9IGZyb20gJ294J1xuICogdGhyb3cgbmV3IEVycm9ycy5CYXNlRXJyb3IoJ0FuIGVycm9yIG9jY3VycmVkJylcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgQmFzZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHNob3J0TWVzc2FnZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2F1c2UgaW5zdGFuY2VvZiBCYXNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5jYXVzZS5kZXRhaWxzKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jYXVzZS5kZXRhaWxzO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmNhdXNlLnNob3J0TWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY2F1c2Uuc2hvcnRNZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2F1c2U/Lm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuY2F1c2UubWVzc2FnZTtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmRldGFpbHM7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGNvbnN0IGRvY3NQYXRoID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNhdXNlIGluc3RhbmNlb2YgQmFzZUVycm9yKVxuICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmNhdXNlLmRvY3NQYXRoIHx8IG9wdGlvbnMuZG9jc1BhdGg7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5kb2NzUGF0aDtcbiAgICAgICAgfSkoKTtcbiAgICAgICAgY29uc3QgZG9jc0Jhc2VVcmwgPSAnaHR0cHM6Ly9veGxpYi5zaCc7XG4gICAgICAgIGNvbnN0IGRvY3MgPSBgJHtkb2NzQmFzZVVybH0ke2RvY3NQYXRoID8/ICcnfWA7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXG4gICAgICAgICAgICBzaG9ydE1lc3NhZ2UgfHwgJ0FuIGVycm9yIG9jY3VycmVkLicsXG4gICAgICAgICAgICAuLi4ob3B0aW9ucy5tZXRhTWVzc2FnZXMgPyBbJycsIC4uLm9wdGlvbnMubWV0YU1lc3NhZ2VzXSA6IFtdKSxcbiAgICAgICAgICAgIC4uLihkZXRhaWxzIHx8IGRvY3NQYXRoXG4gICAgICAgICAgICAgICAgPyBbXG4gICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzID8gYERldGFpbHM6ICR7ZGV0YWlsc31gIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBkb2NzUGF0aCA/IGBTZWU6ICR7ZG9jc31gIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgXVxuICAgICAgICAgICAgLmZpbHRlcigoeCkgPT4gdHlwZW9mIHggPT09ICdzdHJpbmcnKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICBzdXBlcihtZXNzYWdlLCBvcHRpb25zLmNhdXNlID8geyBjYXVzZTogb3B0aW9ucy5jYXVzZSB9IDogdW5kZWZpbmVkKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiZGV0YWlsc1wiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJkb2NzXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRvY3NQYXRoXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNob3J0TWVzc2FnZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjYXVzZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnQmFzZUVycm9yJ1xuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwidmVyc2lvblwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogYG94QCR7Z2V0VmVyc2lvbigpfWBcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F1c2UgPSBvcHRpb25zLmNhdXNlO1xuICAgICAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuICAgICAgICB0aGlzLmRvY3MgPSBkb2NzO1xuICAgICAgICB0aGlzLmRvY3NQYXRoID0gZG9jc1BhdGg7XG4gICAgICAgIHRoaXMuc2hvcnRNZXNzYWdlID0gc2hvcnRNZXNzYWdlO1xuICAgIH1cbiAgICB3YWxrKGZuKSB7XG4gICAgICAgIHJldHVybiB3YWxrKHRoaXMsIGZuKTtcbiAgICB9XG59XG4vKiogQGludGVybmFsICovXG5mdW5jdGlvbiB3YWxrKGVyciwgZm4pIHtcbiAgICBpZiAoZm4/LihlcnIpKVxuICAgICAgICByZXR1cm4gZXJyO1xuICAgIGlmIChlcnIgJiYgdHlwZW9mIGVyciA9PT0gJ29iamVjdCcgJiYgJ2NhdXNlJyBpbiBlcnIgJiYgZXJyLmNhdXNlKVxuICAgICAgICByZXR1cm4gd2FsayhlcnIuY2F1c2UsIGZuKTtcbiAgICByZXR1cm4gZm4gPyBudWxsIDogZXJyO1xufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9RXJyb3JzLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/Errors.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/Hash.js":
/*!*******************************************!*\
  !*** ./node_modules/ox/_esm/core/Hash.js ***!
  \*******************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   keccak256: () => (/* binding */ keccak256),\n/* harmony export */   ripemd160: () => (/* binding */ ripemd160),\n/* harmony export */   sha256: () => (/* binding */ sha256),\n/* harmony export */   validate: () => (/* binding */ validate)\n/* harmony export */ });\n/* harmony import */ var _noble_hashes_ripemd160__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @noble/hashes/ripemd160 */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/ripemd160.js\");\n/* harmony import */ var _noble_hashes_sha3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @noble/hashes/sha3 */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/sha3.js\");\n/* harmony import */ var _noble_hashes_sha256__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @noble/hashes/sha256 */ \"(app-pages-browser)/./node_modules/@noble/hashes/esm/sha256.js\");\n/* harmony import */ var _Bytes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Bytes.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Bytes.js\");\n/* harmony import */ var _Hex_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Hex.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Hex.js\");\n\n\n\n\n\n/**\n * Calculates the [Keccak256](https://en.wikipedia.org/wiki/SHA-3) hash of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `keccak_256` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.keccak256('0xdeadbeef')\n * // @log: '0xd4fd4e189132273036449fc9e11198c739161b4c0116a9a2dccdfa1c492006f1'\n * ```\n *\n * @example\n * ### Calculate Hash of a String\n *\n * ```ts twoslash\n * import { Hash, Hex } from 'ox'\n *\n * Hash.keccak256(Hex.fromString('hello world'))\n * // @log: '0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0'\n * ```\n *\n * @example\n * ### Configure Return Type\n *\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.keccak256('0xdeadbeef', { as: 'Bytes' })\n * // @log: Uint8Array [...]\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns Keccak256 hash.\n */\nfunction keccak256(value, options = {}) {\n    const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options;\n    const bytes = (0,_noble_hashes_sha3__WEBPACK_IMPORTED_MODULE_0__.keccak_256)(_Bytes_js__WEBPACK_IMPORTED_MODULE_1__.from(value));\n    if (as === 'Bytes')\n        return bytes;\n    return _Hex_js__WEBPACK_IMPORTED_MODULE_2__.fromBytes(bytes);\n}\n/**\n * Calculates the [Ripemd160](https://en.wikipedia.org/wiki/RIPEMD) hash of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `ripemd160` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.ripemd160('0xdeadbeef')\n * // '0x226821c2f5423e11fe9af68bd285c249db2e4b5a'\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns Ripemd160 hash.\n */\nfunction ripemd160(value, options = {}) {\n    const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options;\n    const bytes = (0,_noble_hashes_ripemd160__WEBPACK_IMPORTED_MODULE_3__.ripemd160)(_Bytes_js__WEBPACK_IMPORTED_MODULE_1__.from(value));\n    if (as === 'Bytes')\n        return bytes;\n    return _Hex_js__WEBPACK_IMPORTED_MODULE_2__.fromBytes(bytes);\n}\n/**\n * Calculates the [Sha256](https://en.wikipedia.org/wiki/SHA-256) hash of a {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n *\n * This function is a re-export of `sha256` from [`@noble/hashes`](https://github.com/paulmillr/noble-hashes), an audited & minimal JS hashing library.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.sha256('0xdeadbeef')\n * // '0x5f78c33274e43fa9de5659265c1d917e25c03722dcb0b8d27db8d5feaa813953'\n * ```\n *\n * @param value - {@link ox#Bytes.Bytes} or {@link ox#Hex.Hex} value.\n * @param options - Options.\n * @returns Sha256 hash.\n */\nfunction sha256(value, options = {}) {\n    const { as = typeof value === 'string' ? 'Hex' : 'Bytes' } = options;\n    const bytes = (0,_noble_hashes_sha256__WEBPACK_IMPORTED_MODULE_4__.sha256)(_Bytes_js__WEBPACK_IMPORTED_MODULE_1__.from(value));\n    if (as === 'Bytes')\n        return bytes;\n    return _Hex_js__WEBPACK_IMPORTED_MODULE_2__.fromBytes(bytes);\n}\n/**\n * Checks if a string is a valid hash value.\n *\n * @example\n * ```ts twoslash\n * import { Hash } from 'ox'\n *\n * Hash.validate('0x')\n * // @log: false\n *\n * Hash.validate('0x3ea2f1d0abf3fc66cf29eebb70cbd4e7fe762ef8a09bcc06c8edf641230afec0')\n * // @log: true\n * ```\n *\n * @param value - Value to check.\n * @returns Whether the value is a valid hash.\n */\nfunction validate(value) {\n    return _Hex_js__WEBPACK_IMPORTED_MODULE_2__.validate(value) && _Hex_js__WEBPACK_IMPORTED_MODULE_2__.size(value) === 32;\n}\n//# sourceMappingURL=Hash.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvSGFzaC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBdUU7QUFDSjtBQUNMO0FBQzFCO0FBQ0o7QUFDaEM7QUFDQSw4RUFBOEUsc0JBQXNCLElBQUksa0JBQWtCO0FBQzFIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBLGtDQUFrQyxhQUFhO0FBQy9DO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixzQkFBc0IsSUFBSSxrQkFBa0I7QUFDL0Q7QUFDQTtBQUNBO0FBQ08sc0NBQXNDO0FBQzdDLFlBQVksbURBQW1EO0FBQy9ELGtCQUFrQiw4REFBZSxDQUFDLDJDQUFVO0FBQzVDO0FBQ0E7QUFDQSxXQUFXLDhDQUFhO0FBQ3hCO0FBQ0E7QUFDQSwrRUFBK0Usc0JBQXNCLElBQUksa0JBQWtCO0FBQzNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixzQkFBc0IsSUFBSSxrQkFBa0I7QUFDL0Q7QUFDQTtBQUNBO0FBQ08sc0NBQXNDO0FBQzdDLFlBQVksbURBQW1EO0FBQy9ELGtCQUFrQixrRUFBZSxDQUFDLDJDQUFVO0FBQzVDO0FBQ0E7QUFDQSxXQUFXLDhDQUFhO0FBQ3hCO0FBQ0E7QUFDQSw2RUFBNkUsc0JBQXNCLElBQUksa0JBQWtCO0FBQ3pIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLE9BQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixzQkFBc0IsSUFBSSxrQkFBa0I7QUFDL0Q7QUFDQTtBQUNBO0FBQ08sbUNBQW1DO0FBQzFDLFlBQVksbURBQW1EO0FBQy9ELGtCQUFrQiw0REFBWSxDQUFDLDJDQUFVO0FBQ3pDO0FBQ0E7QUFDQSxXQUFXLDhDQUFhO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxXQUFXLDZDQUFZLFdBQVcseUNBQVE7QUFDMUM7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvSGFzaC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByaXBlbWQxNjAgYXMgbm9ibGVfcmlwZW1kMTYwIH0gZnJvbSAnQG5vYmxlL2hhc2hlcy9yaXBlbWQxNjAnO1xuaW1wb3J0IHsga2VjY2FrXzI1NiBhcyBub2JsZV9rZWNjYWsyNTYgfSBmcm9tICdAbm9ibGUvaGFzaGVzL3NoYTMnO1xuaW1wb3J0IHsgc2hhMjU2IGFzIG5vYmxlX3NoYTI1NiB9IGZyb20gJ0Bub2JsZS9oYXNoZXMvc2hhMjU2JztcbmltcG9ydCAqIGFzIEJ5dGVzIGZyb20gJy4vQnl0ZXMuanMnO1xuaW1wb3J0ICogYXMgSGV4IGZyb20gJy4vSGV4LmpzJztcbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgW0tlY2NhazI1Nl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU0hBLTMpIGhhc2ggb2YgYSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IG9yIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGEgcmUtZXhwb3J0IG9mIGBrZWNjYWtfMjU2YCBmcm9tIFtgQG5vYmxlL2hhc2hlc2BdKGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVsbWlsbHIvbm9ibGUtaGFzaGVzKSwgYW4gYXVkaXRlZCAmIG1pbmltYWwgSlMgaGFzaGluZyBsaWJyYXJ5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSGFzaCB9IGZyb20gJ294J1xuICpcbiAqIEhhc2gua2VjY2FrMjU2KCcweGRlYWRiZWVmJylcbiAqIC8vIEBsb2c6ICcweGQ0ZmQ0ZTE4OTEzMjI3MzAzNjQ0OWZjOWUxMTE5OGM3MzkxNjFiNGMwMTE2YTlhMmRjY2RmYTFjNDkyMDA2ZjEnXG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogIyMjIENhbGN1bGF0ZSBIYXNoIG9mIGEgU3RyaW5nXG4gKlxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEhhc2gsIEhleCB9IGZyb20gJ294J1xuICpcbiAqIEhhc2gua2VjY2FrMjU2KEhleC5mcm9tU3RyaW5nKCdoZWxsbyB3b3JsZCcpKVxuICogLy8gQGxvZzogJzB4M2VhMmYxZDBhYmYzZmM2NmNmMjllZWJiNzBjYmQ0ZTdmZTc2MmVmOGEwOWJjYzA2YzhlZGY2NDEyMzBhZmVjMCdcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiAjIyMgQ29uZmlndXJlIFJldHVybiBUeXBlXG4gKlxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEhhc2ggfSBmcm9tICdveCdcbiAqXG4gKiBIYXNoLmtlY2NhazI1NignMHhkZWFkYmVlZicsIHsgYXM6ICdCeXRlcycgfSlcbiAqIC8vIEBsb2c6IFVpbnQ4QXJyYXkgWy4uLl1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIHtAbGluayBveCNCeXRlcy5CeXRlc30gb3Ige0BsaW5rIG94I0hleC5IZXh9IHZhbHVlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zLlxuICogQHJldHVybnMgS2VjY2FrMjU2IGhhc2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBrZWNjYWsyNTYodmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgYXMgPSB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gJ0hleCcgOiAnQnl0ZXMnIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGJ5dGVzID0gbm9ibGVfa2VjY2FrMjU2KEJ5dGVzLmZyb20odmFsdWUpKTtcbiAgICBpZiAoYXMgPT09ICdCeXRlcycpXG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICByZXR1cm4gSGV4LmZyb21CeXRlcyhieXRlcyk7XG59XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIFtSaXBlbWQxNjBdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JJUEVNRCkgaGFzaCBvZiBhIHtAbGluayBveCNCeXRlcy5CeXRlc30gb3Ige0BsaW5rIG94I0hleC5IZXh9IHZhbHVlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgYSByZS1leHBvcnQgb2YgYHJpcGVtZDE2MGAgZnJvbSBbYEBub2JsZS9oYXNoZXNgXShodHRwczovL2dpdGh1Yi5jb20vcGF1bG1pbGxyL25vYmxlLWhhc2hlcyksIGFuIGF1ZGl0ZWQgJiBtaW5pbWFsIEpTIGhhc2hpbmcgbGlicmFyeS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEhhc2ggfSBmcm9tICdveCdcbiAqXG4gKiBIYXNoLnJpcGVtZDE2MCgnMHhkZWFkYmVlZicpXG4gKiAvLyAnMHgyMjY4MjFjMmY1NDIzZTExZmU5YWY2OGJkMjg1YzI0OWRiMmU0YjVhJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0ge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSBvciB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMuXG4gKiBAcmV0dXJucyBSaXBlbWQxNjAgaGFzaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJpcGVtZDE2MCh2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBhcyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyAnSGV4JyA6ICdCeXRlcycgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYnl0ZXMgPSBub2JsZV9yaXBlbWQxNjAoQnl0ZXMuZnJvbSh2YWx1ZSkpO1xuICAgIGlmIChhcyA9PT0gJ0J5dGVzJylcbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIHJldHVybiBIZXguZnJvbUJ5dGVzKGJ5dGVzKTtcbn1cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgW1NoYTI1Nl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU0hBLTI1NikgaGFzaCBvZiBhIHtAbGluayBveCNCeXRlcy5CeXRlc30gb3Ige0BsaW5rIG94I0hleC5IZXh9IHZhbHVlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgYSByZS1leHBvcnQgb2YgYHNoYTI1NmAgZnJvbSBbYEBub2JsZS9oYXNoZXNgXShodHRwczovL2dpdGh1Yi5jb20vcGF1bG1pbGxyL25vYmxlLWhhc2hlcyksIGFuIGF1ZGl0ZWQgJiBtaW5pbWFsIEpTIGhhc2hpbmcgbGlicmFyeS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEhhc2ggfSBmcm9tICdveCdcbiAqXG4gKiBIYXNoLnNoYTI1NignMHhkZWFkYmVlZicpXG4gKiAvLyAnMHg1Zjc4YzMzMjc0ZTQzZmE5ZGU1NjU5MjY1YzFkOTE3ZTI1YzAzNzIyZGNiMGI4ZDI3ZGI4ZDVmZWFhODEzOTUzJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0ge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSBvciB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMuXG4gKiBAcmV0dXJucyBTaGEyNTYgaGFzaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYTI1Nih2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBhcyA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyAnSGV4JyA6ICdCeXRlcycgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgYnl0ZXMgPSBub2JsZV9zaGEyNTYoQnl0ZXMuZnJvbSh2YWx1ZSkpO1xuICAgIGlmIChhcyA9PT0gJ0J5dGVzJylcbiAgICAgICAgcmV0dXJuIGJ5dGVzO1xuICAgIHJldHVybiBIZXguZnJvbUJ5dGVzKGJ5dGVzKTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgaGFzaCB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEhhc2ggfSBmcm9tICdveCdcbiAqXG4gKiBIYXNoLnZhbGlkYXRlKCcweCcpXG4gKiAvLyBAbG9nOiBmYWxzZVxuICpcbiAqIEhhc2gudmFsaWRhdGUoJzB4M2VhMmYxZDBhYmYzZmM2NmNmMjllZWJiNzBjYmQ0ZTdmZTc2MmVmOGEwOWJjYzA2YzhlZGY2NDEyMzBhZmVjMCcpXG4gKiAvLyBAbG9nOiB0cnVlXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBWYWx1ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgdmFsaWQgaGFzaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEhleC52YWxpZGF0ZSh2YWx1ZSkgJiYgSGV4LnNpemUodmFsdWUpID09PSAzMjtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUhhc2guanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/Hash.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/Hex.js":
/*!******************************************!*\
  !*** ./node_modules/ox/_esm/core/Hex.js ***!
  \******************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   IntegerOutOfRangeError: () => (/* binding */ IntegerOutOfRangeError),\n/* harmony export */   InvalidHexBooleanError: () => (/* binding */ InvalidHexBooleanError),\n/* harmony export */   InvalidHexTypeError: () => (/* binding */ InvalidHexTypeError),\n/* harmony export */   InvalidHexValueError: () => (/* binding */ InvalidHexValueError),\n/* harmony export */   InvalidLengthError: () => (/* binding */ InvalidLengthError),\n/* harmony export */   SizeExceedsPaddingSizeError: () => (/* binding */ SizeExceedsPaddingSizeError),\n/* harmony export */   SizeOverflowError: () => (/* binding */ SizeOverflowError),\n/* harmony export */   SliceOffsetOutOfBoundsError: () => (/* binding */ SliceOffsetOutOfBoundsError),\n/* harmony export */   assert: () => (/* binding */ assert),\n/* harmony export */   concat: () => (/* binding */ concat),\n/* harmony export */   from: () => (/* binding */ from),\n/* harmony export */   fromBoolean: () => (/* binding */ fromBoolean),\n/* harmony export */   fromBytes: () => (/* binding */ fromBytes),\n/* harmony export */   fromNumber: () => (/* binding */ fromNumber),\n/* harmony export */   fromString: () => (/* binding */ fromString),\n/* harmony export */   isEqual: () => (/* binding */ isEqual),\n/* harmony export */   padLeft: () => (/* binding */ padLeft),\n/* harmony export */   padRight: () => (/* binding */ padRight),\n/* harmony export */   random: () => (/* binding */ random),\n/* harmony export */   size: () => (/* binding */ size),\n/* harmony export */   slice: () => (/* binding */ slice),\n/* harmony export */   toBigInt: () => (/* binding */ toBigInt),\n/* harmony export */   toBoolean: () => (/* binding */ toBoolean),\n/* harmony export */   toBytes: () => (/* binding */ toBytes),\n/* harmony export */   toNumber: () => (/* binding */ toNumber),\n/* harmony export */   toString: () => (/* binding */ toString),\n/* harmony export */   trimLeft: () => (/* binding */ trimLeft),\n/* harmony export */   trimRight: () => (/* binding */ trimRight),\n/* harmony export */   validate: () => (/* binding */ validate)\n/* harmony export */ });\n/* harmony import */ var _noble_curves_abstract_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @noble/curves/abstract/utils */ \"(app-pages-browser)/./node_modules/@noble/curves/esm/abstract/utils.js\");\n/* harmony import */ var _Bytes_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Bytes.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Bytes.js\");\n/* harmony import */ var _Errors_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./Errors.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Errors.js\");\n/* harmony import */ var _Json_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./Json.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Json.js\");\n/* harmony import */ var _internal_bytes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internal/bytes.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/internal/bytes.js\");\n/* harmony import */ var _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./internal/hex.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/internal/hex.js\");\n\n\n\n\n\n\nconst encoder = /*#__PURE__*/ new TextEncoder();\nconst hexes = /*#__PURE__*/ Array.from({ length: 256 }, (_v, i) => i.toString(16).padStart(2, '0'));\n/**\n * Asserts if the given value is {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert('abc')\n * // @error: InvalidHexValueTypeError:\n * // @error: Value `\"abc\"` of type `string` is an invalid hex type.\n * // @error: Hex types must be represented as `\"0x\\${string}\"`.\n * ```\n *\n * @param value - The value to assert.\n * @param options - Options.\n */\nfunction assert(value, options = {}) {\n    const { strict = false } = options;\n    if (!value)\n        throw new InvalidHexTypeError(value);\n    if (typeof value !== 'string')\n        throw new InvalidHexTypeError(value);\n    if (strict) {\n        if (!/^0x[0-9a-fA-F]*$/.test(value))\n            throw new InvalidHexValueError(value);\n    }\n    if (!value.startsWith('0x'))\n        throw new InvalidHexValueError(value);\n}\n/**\n * Concatenates two or more {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.concat('0x123', '0x456')\n * // @log: '0x123456'\n * ```\n *\n * @param values - The {@link ox#Hex.Hex} values to concatenate.\n * @returns The concatenated {@link ox#Hex.Hex} value.\n */\nfunction concat(...values) {\n    return `0x${values.reduce((acc, x) => acc + x.replace('0x', ''), '')}`;\n}\n/**\n * Instantiates a {@link ox#Hex.Hex} value from a hex string or {@link ox#Bytes.Bytes} value.\n *\n * :::tip\n *\n * To instantiate from a **Boolean**, **String**, or **Number**, use one of the following:\n *\n * - `Hex.fromBoolean`\n *\n * - `Hex.fromString`\n *\n * - `Hex.fromNumber`\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.from('0x48656c6c6f20576f726c6421')\n * // @log: '0x48656c6c6f20576f726c6421'\n *\n * Hex.from(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value to encode.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nfunction from(value) {\n    if (value instanceof Uint8Array)\n        return fromBytes(value);\n    if (Array.isArray(value))\n        return fromBytes(new Uint8Array(value));\n    return value;\n}\n/**\n * Encodes a boolean into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromBoolean(true)\n * // @log: '0x1'\n *\n * Hex.fromBoolean(false)\n * // @log: '0x0'\n *\n * Hex.fromBoolean(true, { size: 32 })\n * // @log: '0x0000000000000000000000000000000000000000000000000000000000000001'\n * ```\n *\n * @param value - The boolean value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nfunction fromBoolean(value, options = {}) {\n    const hex = `0x${Number(value)}`;\n    if (typeof options.size === 'number') {\n        _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__.assertSize(hex, options.size);\n        return padLeft(hex, options.size);\n    }\n    return hex;\n}\n/**\n * Encodes a {@link ox#Bytes.Bytes} value into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.fromBytes(Bytes.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]))\n * // @log: '0x48656c6c6f20576f726c6421'\n * ```\n *\n * @param value - The {@link ox#Bytes.Bytes} value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nfunction fromBytes(value, options = {}) {\n    let string = '';\n    for (let i = 0; i < value.length; i++)\n        string += hexes[value[i]];\n    const hex = `0x${string}`;\n    if (typeof options.size === 'number') {\n        _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__.assertSize(hex, options.size);\n        return padRight(hex, options.size);\n    }\n    return hex;\n}\n/**\n * Encodes a number or bigint into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromNumber(420)\n * // @log: '0x1a4'\n *\n * Hex.fromNumber(420, { size: 32 })\n * // @log: '0x00000000000000000000000000000000000000000000000000000000000001a4'\n * ```\n *\n * @param value - The number or bigint value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nfunction fromNumber(value, options = {}) {\n    const { signed, size } = options;\n    const value_ = BigInt(value);\n    let maxValue;\n    if (size) {\n        if (signed)\n            maxValue = (1n << (BigInt(size) * 8n - 1n)) - 1n;\n        else\n            maxValue = 2n ** (BigInt(size) * 8n) - 1n;\n    }\n    else if (typeof value === 'number') {\n        maxValue = BigInt(Number.MAX_SAFE_INTEGER);\n    }\n    const minValue = typeof maxValue === 'bigint' && signed ? -maxValue - 1n : 0;\n    if ((maxValue && value_ > maxValue) || value_ < minValue) {\n        const suffix = typeof value === 'bigint' ? 'n' : '';\n        throw new IntegerOutOfRangeError({\n            max: maxValue ? `${maxValue}${suffix}` : undefined,\n            min: `${minValue}${suffix}`,\n            signed,\n            size,\n            value: `${value}${suffix}`,\n        });\n    }\n    const stringValue = (signed && value_ < 0 ? (1n << BigInt(size * 8)) + BigInt(value_) : value_).toString(16);\n    const hex = `0x${stringValue}`;\n    if (size)\n        return padLeft(hex, size);\n    return hex;\n}\n/**\n * Encodes a string into a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n * Hex.fromString('Hello World!')\n * // '0x48656c6c6f20576f726c6421'\n *\n * Hex.fromString('Hello World!', { size: 32 })\n * // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'\n * ```\n *\n * @param value - The string value to encode.\n * @param options - Options.\n * @returns The encoded {@link ox#Hex.Hex} value.\n */\nfunction fromString(value, options = {}) {\n    return fromBytes(encoder.encode(value), options);\n}\n/**\n * Checks if two {@link ox#Hex.Hex} values are equal.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.isEqual('0xdeadbeef', '0xdeadbeef')\n * // @log: true\n *\n * Hex.isEqual('0xda', '0xba')\n * // @log: false\n * ```\n *\n * @param hexA - The first {@link ox#Hex.Hex} value.\n * @param hexB - The second {@link ox#Hex.Hex} value.\n * @returns `true` if the two {@link ox#Hex.Hex} values are equal, `false` otherwise.\n */\nfunction isEqual(hexA, hexB) {\n    return (0,_noble_curves_abstract_utils__WEBPACK_IMPORTED_MODULE_1__.equalBytes)(_Bytes_js__WEBPACK_IMPORTED_MODULE_2__.fromHex(hexA), _Bytes_js__WEBPACK_IMPORTED_MODULE_2__.fromHex(hexB));\n}\n/**\n * Pads a {@link ox#Hex.Hex} value to the left with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.padLeft('0x1234', 4)\n * // @log: '0x00001234'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to pad.\n * @param size - The size (in bytes) of the output hex value.\n * @returns The padded {@link ox#Hex.Hex} value.\n */\nfunction padLeft(value, size) {\n    return _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__.pad(value, { dir: 'left', size });\n}\n/**\n * Pads a {@link ox#Hex.Hex} value to the right with zero bytes until it reaches the given `size` (default: 32 bytes).\n *\n * @example\n * ```ts\n * import { Hex } from 'ox'\n *\n * Hex.padRight('0x1234', 4)\n * // @log: '0x12340000'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to pad.\n * @param size - The size (in bytes) of the output hex value.\n * @returns The padded {@link ox#Hex.Hex} value.\n */\nfunction padRight(value, size) {\n    return _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__.pad(value, { dir: 'right', size });\n}\n/**\n * Generates a random {@link ox#Hex.Hex} value of the specified length.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * const hex = Hex.random(32)\n * // @log: '0x...'\n * ```\n *\n * @returns Random {@link ox#Hex.Hex} value.\n */\nfunction random(length) {\n    return fromBytes(_Bytes_js__WEBPACK_IMPORTED_MODULE_2__.random(length));\n}\n/**\n * Returns a section of a {@link ox#Bytes.Bytes} value given a start/end bytes offset.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.slice('0x0123456789', 1, 4)\n * // @log: '0x234567'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to slice.\n * @param start - The start offset (in bytes).\n * @param end - The end offset (in bytes).\n * @param options - Options.\n * @returns The sliced {@link ox#Hex.Hex} value.\n */\nfunction slice(value, start, end, options = {}) {\n    const { strict } = options;\n    _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__.assertStartOffset(value, start);\n    const value_ = `0x${value\n        .replace('0x', '')\n        .slice((start ?? 0) * 2, (end ?? value.length) * 2)}`;\n    if (strict)\n        _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__.assertEndOffset(value_, start, end);\n    return value_;\n}\n/**\n * Retrieves the size of a {@link ox#Hex.Hex} value (in bytes).\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.size('0xdeadbeef')\n * // @log: 4\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to get the size of.\n * @returns The size of the {@link ox#Hex.Hex} value (in bytes).\n */\nfunction size(value) {\n    return Math.ceil((value.length - 2) / 2);\n}\n/**\n * Trims leading zeros from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.trimLeft('0x00000000deadbeef')\n * // @log: '0xdeadbeef'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to trim.\n * @returns The trimmed {@link ox#Hex.Hex} value.\n */\nfunction trimLeft(value) {\n    return _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__.trim(value, { dir: 'left' });\n}\n/**\n * Trims trailing zeros from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.trimRight('0xdeadbeef00000000')\n * // @log: '0xdeadbeef'\n * ```\n *\n * @param value - The {@link ox#Hex.Hex} value to trim.\n * @returns The trimmed {@link ox#Hex.Hex} value.\n */\nfunction trimRight(value) {\n    return _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__.trim(value, { dir: 'right' });\n}\n/**\n * Decodes a {@link ox#Hex.Hex} value into a BigInt.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBigInt('0x1a4')\n * // @log: 420n\n *\n * Hex.toBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // @log: 420n\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded BigInt.\n */\nfunction toBigInt(hex, options = {}) {\n    const { signed } = options;\n    if (options.size)\n        _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__.assertSize(hex, options.size);\n    const value = BigInt(hex);\n    if (!signed)\n        return value;\n    const size = (hex.length - 2) / 2;\n    const max_unsigned = (1n << (BigInt(size) * 8n)) - 1n;\n    const max_signed = max_unsigned >> 1n;\n    if (value <= max_signed)\n        return value;\n    return value - max_unsigned - 1n;\n}\n/**\n * Decodes a {@link ox#Hex.Hex} value into a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBoolean('0x01')\n * // @log: true\n *\n * Hex.toBoolean('0x0000000000000000000000000000000000000000000000000000000000000001', { size: 32 })\n * // @log: true\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded boolean.\n */\nfunction toBoolean(hex, options = {}) {\n    if (options.size)\n        _internal_hex_js__WEBPACK_IMPORTED_MODULE_0__.assertSize(hex, options.size);\n    const hex_ = trimLeft(hex);\n    if (hex_ === '0x')\n        return false;\n    if (hex_ === '0x1')\n        return true;\n    throw new InvalidHexBooleanError(hex);\n}\n/**\n * Decodes a {@link ox#Hex.Hex} value into a {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * const data = Hex.toBytes('0x48656c6c6f20776f726c6421')\n * // @log: Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded {@link ox#Bytes.Bytes}.\n */\nfunction toBytes(hex, options = {}) {\n    return _Bytes_js__WEBPACK_IMPORTED_MODULE_2__.fromHex(hex, options);\n}\n/**\n * Decodes a {@link ox#Hex.Hex} value into a number.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toNumber('0x1a4')\n * // @log: 420\n *\n * Hex.toNumber('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })\n * // @log: 420\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded number.\n */\nfunction toNumber(hex, options = {}) {\n    const { signed, size } = options;\n    if (!signed && !size)\n        return Number(hex);\n    return Number(toBigInt(hex, options));\n}\n/**\n * Decodes a {@link ox#Hex.Hex} value into a string.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toString('0x48656c6c6f20576f726c6421')\n * // @log: 'Hello world!'\n *\n * Hex.toString('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {\n *  size: 32,\n * })\n * // @log: 'Hello world'\n * ```\n *\n * @param hex - The {@link ox#Hex.Hex} value to decode.\n * @param options - Options.\n * @returns The decoded string.\n */\nfunction toString(hex, options = {}) {\n    const { size } = options;\n    let bytes = _Bytes_js__WEBPACK_IMPORTED_MODULE_2__.fromHex(hex);\n    if (size) {\n        _internal_bytes_js__WEBPACK_IMPORTED_MODULE_3__.assertSize(bytes, size);\n        bytes = _Bytes_js__WEBPACK_IMPORTED_MODULE_2__.trimRight(bytes);\n    }\n    return new TextDecoder().decode(bytes);\n}\n/**\n * Checks if the given value is {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { Bytes, Hex } from 'ox'\n *\n * Hex.validate('0xdeadbeef')\n * // @log: true\n *\n * Hex.validate(Bytes.from([1, 2, 3]))\n * // @log: false\n * ```\n *\n * @param value - The value to check.\n * @param options - Options.\n * @returns `true` if the value is a {@link ox#Hex.Hex}, `false` otherwise.\n */\nfunction validate(value, options = {}) {\n    const { strict = false } = options;\n    try {\n        assert(value, { strict });\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\n/**\n * Thrown when the provided integer is out of range, and cannot be represented as a hex value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromNumber(420182738912731283712937129)\n * // @error: Hex.IntegerOutOfRangeError: Number \\`4.2018273891273126e+26\\` is not in safe unsigned integer range (`0` to `9007199254740991`)\n * ```\n */\nclass IntegerOutOfRangeError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor({ max, min, signed, size, value, }) {\n        super(`Number \\`${value}\\` is not in safe${size ? ` ${size * 8}-bit` : ''}${signed ? ' signed' : ' unsigned'} integer range ${max ? `(\\`${min}\\` to \\`${max}\\`)` : `(above \\`${min}\\`)`}`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.IntegerOutOfRangeError'\n        });\n    }\n}\n/**\n * Thrown when the provided hex value cannot be represented as a boolean.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.toBoolean('0xa')\n * // @error: Hex.InvalidHexBooleanError: Hex value `\"0xa\"` is not a valid boolean.\n * // @error: The hex value must be `\"0x0\"` (false) or `\"0x1\"` (true).\n * ```\n */\nclass InvalidHexBooleanError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor(hex) {\n        super(`Hex value \\`\"${hex}\"\\` is not a valid boolean.`, {\n            metaMessages: [\n                'The hex value must be `\"0x0\"` (false) or `\"0x1\"` (true).',\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.InvalidHexBooleanError'\n        });\n    }\n}\n/**\n * Thrown when the provided value is not a valid hex type.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert(1)\n * // @error: Hex.InvalidHexTypeError: Value `1` of type `number` is an invalid hex type.\n * ```\n */\nclass InvalidHexTypeError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor(value) {\n        super(`Value \\`${typeof value === 'object' ? _Json_js__WEBPACK_IMPORTED_MODULE_5__.stringify(value) : value}\\` of type \\`${typeof value}\\` is an invalid hex type.`, {\n            metaMessages: ['Hex types must be represented as `\"0x${string}\"`.'],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.InvalidHexTypeError'\n        });\n    }\n}\n/**\n * Thrown when the provided hex value is invalid.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.assert('0x0123456789abcdefg')\n * // @error: Hex.InvalidHexValueError: Value `0x0123456789abcdefg` is an invalid hex value.\n * // @error: Hex values must start with `\"0x\"` and contain only hexadecimal characters (0-9, a-f, A-F).\n * ```\n */\nclass InvalidHexValueError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor(value) {\n        super(`Value \\`${value}\\` is an invalid hex value.`, {\n            metaMessages: [\n                'Hex values must start with `\"0x\"` and contain only hexadecimal characters (0-9, a-f, A-F).',\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.InvalidHexValueError'\n        });\n    }\n}\n/**\n * Thrown when the provided hex value is an odd length.\n *\n * @example\n * ```ts twoslash\n * import { Bytes } from 'ox'\n *\n * Bytes.fromHex('0xabcde')\n * // @error: Hex.InvalidLengthError: Hex value `\"0xabcde\"` is an odd length (5 nibbles).\n * ```\n */\nclass InvalidLengthError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor(value) {\n        super(`Hex value \\`\"${value}\"\\` is an odd length (${value.length - 2} nibbles).`, {\n            metaMessages: ['It must be an even length.'],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.InvalidLengthError'\n        });\n    }\n}\n/**\n * Thrown when the size of the value exceeds the expected max size.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.fromString('Hello World!', { size: 8 })\n * // @error: Hex.SizeOverflowError: Size cannot exceed `8` bytes. Given size: `12` bytes.\n * ```\n */\nclass SizeOverflowError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor({ givenSize, maxSize }) {\n        super(`Size cannot exceed \\`${maxSize}\\` bytes. Given size: \\`${givenSize}\\` bytes.`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.SizeOverflowError'\n        });\n    }\n}\n/**\n * Thrown when the slice offset exceeds the bounds of the value.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.slice('0x0123456789', 6)\n * // @error: Hex.SliceOffsetOutOfBoundsError: Slice starting at offset `6` is out-of-bounds (size: `5`).\n * ```\n */\nclass SliceOffsetOutOfBoundsError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor({ offset, position, size, }) {\n        super(`Slice ${position === 'start' ? 'starting' : 'ending'} at offset \\`${offset}\\` is out-of-bounds (size: \\`${size}\\`).`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.SliceOffsetOutOfBoundsError'\n        });\n    }\n}\n/**\n * Thrown when the size of the value exceeds the pad size.\n *\n * @example\n * ```ts twoslash\n * import { Hex } from 'ox'\n *\n * Hex.padLeft('0x1a4e12a45a21323123aaa87a897a897a898a6567a578a867a98778a667a85a875a87a6a787a65a675a6a9', 32)\n * // @error: Hex.SizeExceedsPaddingSizeError: Hex size (`43`) exceeds padding size (`32`).\n * ```\n */\nclass SizeExceedsPaddingSizeError extends _Errors_js__WEBPACK_IMPORTED_MODULE_4__.BaseError {\n    constructor({ size, targetSize, type, }) {\n        super(`${type.charAt(0).toUpperCase()}${type\n            .slice(1)\n            .toLowerCase()} size (\\`${size}\\`) exceeds padding size (\\`${targetSize}\\`).`);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Hex.SizeExceedsPaddingSizeError'\n        });\n    }\n}\n//# sourceMappingURL=Hex.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvSGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQTBEO0FBQ3RCO0FBQ0U7QUFDSjtBQUNvQjtBQUNSO0FBQzlDO0FBQ0EseUNBQXlDLGFBQWE7QUFDdEQ7QUFDQSxrQ0FBa0MsaUJBQWlCO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLFlBQVksTUFBTTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNEQUFzRCxPQUFPO0FBQzdEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxtQ0FBbUM7QUFDMUMsWUFBWSxpQkFBaUI7QUFDN0I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLGlCQUFpQjtBQUM5QztBQUNBO0FBQ0E7QUFDQSxZQUFZLE1BQU07QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3QixrQkFBa0I7QUFDMUMsOEJBQThCLGtCQUFrQjtBQUNoRDtBQUNPO0FBQ1AsZ0JBQWdCLHlEQUF5RDtBQUN6RTtBQUNBO0FBQ0EsbUJBQW1CLGtCQUFrQiw0QkFBNEIsc0JBQXNCO0FBQ3ZGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksYUFBYTtBQUN6QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUJBQXVCLHNCQUFzQjtBQUM3Qyx5QkFBeUIsa0JBQWtCO0FBQzNDO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QixrQkFBa0I7QUFDL0M7QUFDQTtBQUNBO0FBQ0EsWUFBWSxNQUFNO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLFVB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O0FBQ0E7QUFDQTtBQUNPLGlDQUFpQyxpREFBZ0I7QUFDeEQ7QUFDQSw4QkFBOEIsTUFBTSx3QkFBd0Isa0JBQWtCO0FBQzlFO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLE1BQU07QUFDbEI7QUFDQSxvQ0FBb0MsU0FBUztBQUM3QztBQUNBO0FBQ0E7QUFDTyxnQ0FBZ0MsaURBQWdCO0FBQ3ZELGtCQUFrQixvQkFBb0I7QUFDdEMsc0NBQXNDLFFBQVEsMEJBQTBCLFVBQVU7QUFDbEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksTUFBTTtBQUNsQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sMENBQTBDLGlEQUFnQjtBQUNqRSxrQkFBa0IseUJBQXlCO0FBQzNDLHVCQUF1Qiw4Q0FBOEMsY0FBYyxPQUFPLCtCQUErQixLQUFLO0FBQzlIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLE1BQU07QUFDbEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLDBDQUEwQyxpREFBZ0I7QUFDakUsa0JBQWtCLHlCQUF5QjtBQUMzQyxpQkFBaUIsNkJBQTZCLEVBQUU7QUFDaEQ7QUFDQSw0QkFBNEIsVUFBVSxLQUFLLDhCQUE4QixXQUFXO0FBQ3BGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL294L19lc20vY29yZS9IZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXF1YWxCeXRlcyB9IGZyb20gJ0Bub2JsZS9jdXJ2ZXMvYWJzdHJhY3QvdXRpbHMnO1xuaW1wb3J0ICogYXMgQnl0ZXMgZnJvbSAnLi9CeXRlcy5qcyc7XG5pbXBvcnQgKiBhcyBFcnJvcnMgZnJvbSAnLi9FcnJvcnMuanMnO1xuaW1wb3J0ICogYXMgSnNvbiBmcm9tICcuL0pzb24uanMnO1xuaW1wb3J0ICogYXMgaW50ZXJuYWxfYnl0ZXMgZnJvbSAnLi9pbnRlcm5hbC9ieXRlcy5qcyc7XG5pbXBvcnQgKiBhcyBpbnRlcm5hbCBmcm9tICcuL2ludGVybmFsL2hleC5qcyc7XG5jb25zdCBlbmNvZGVyID0gLyojX19QVVJFX18qLyBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IGhleGVzID0gLyojX19QVVJFX18qLyBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNTYgfSwgKF92LCBpKSA9PiBpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKTtcbi8qKlxuICogQXNzZXJ0cyBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMge0BsaW5rIG94I0hleC5IZXh9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSGV4IH0gZnJvbSAnb3gnXG4gKlxuICogSGV4LmFzc2VydCgnYWJjJylcbiAqIC8vIEBlcnJvcjogSW52YWxpZEhleFZhbHVlVHlwZUVycm9yOlxuICogLy8gQGVycm9yOiBWYWx1ZSBgXCJhYmNcImAgb2YgdHlwZSBgc3RyaW5nYCBpcyBhbiBpbnZhbGlkIGhleCB0eXBlLlxuICogLy8gQGVycm9yOiBIZXggdHlwZXMgbXVzdCBiZSByZXByZXNlbnRlZCBhcyBgXCIweFxcJHtzdHJpbmd9XCJgLlxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGFzc2VydC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydCh2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBzdHJpY3QgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICBpZiAoIXZhbHVlKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEhleFR5cGVFcnJvcih2YWx1ZSk7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkSGV4VHlwZUVycm9yKHZhbHVlKTtcbiAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAgIGlmICghL14weFswLTlhLWZBLUZdKiQvLnRlc3QodmFsdWUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRIZXhWYWx1ZUVycm9yKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCcweCcpKVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEhleFZhbHVlRXJyb3IodmFsdWUpO1xufVxuLyoqXG4gKiBDb25jYXRlbmF0ZXMgdHdvIG9yIG1vcmUge0BsaW5rIG94I0hleC5IZXh9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSGV4IH0gZnJvbSAnb3gnXG4gKlxuICogSGV4LmNvbmNhdCgnMHgxMjMnLCAnMHg0NTYnKVxuICogLy8gQGxvZzogJzB4MTIzNDU2J1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyAtIFRoZSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWVzIHRvIGNvbmNhdGVuYXRlLlxuICogQHJldHVybnMgVGhlIGNvbmNhdGVuYXRlZCB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQoLi4udmFsdWVzKSB7XG4gICAgcmV0dXJuIGAweCR7dmFsdWVzLnJlZHVjZSgoYWNjLCB4KSA9PiBhY2MgKyB4LnJlcGxhY2UoJzB4JywgJycpLCAnJyl9YDtcbn1cbi8qKlxuICogSW5zdGFudGlhdGVzIGEge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIGZyb20gYSBoZXggc3RyaW5nIG9yIHtAbGluayBveCNCeXRlcy5CeXRlc30gdmFsdWUuXG4gKlxuICogOjo6dGlwXG4gKlxuICogVG8gaW5zdGFudGlhdGUgZnJvbSBhICoqQm9vbGVhbioqLCAqKlN0cmluZyoqLCBvciAqKk51bWJlcioqLCB1c2Ugb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogLSBgSGV4LmZyb21Cb29sZWFuYFxuICpcbiAqIC0gYEhleC5mcm9tU3RyaW5nYFxuICpcbiAqIC0gYEhleC5mcm9tTnVtYmVyYFxuICpcbiAqIDo6OlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgQnl0ZXMsIEhleCB9IGZyb20gJ294J1xuICpcbiAqIEhleC5mcm9tKCcweDQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMScpXG4gKiAvLyBAbG9nOiAnMHg0ODY1NmM2YzZmMjA1NzZmNzI2YzY0MjEnXG4gKlxuICogSGV4LmZyb20oQnl0ZXMuZnJvbShbNzIsIDEwMSwgMTA4LCAxMDgsIDExMSwgMzIsIDg3LCAxMTEsIDExNCwgMTA4LCAxMDAsIDMzXSkpXG4gKiAvLyBAbG9nOiAnMHg0ODY1NmM2YzZmMjA1NzZmNzI2YzY0MjEnXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZSB0byBlbmNvZGUuXG4gKiBAcmV0dXJucyBUaGUgZW5jb2RlZCB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSlcbiAgICAgICAgcmV0dXJuIGZyb21CeXRlcyh2YWx1ZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKVxuICAgICAgICByZXR1cm4gZnJvbUJ5dGVzKG5ldyBVaW50OEFycmF5KHZhbHVlKSk7XG4gICAgcmV0dXJuIHZhbHVlO1xufVxuLyoqXG4gKiBFbmNvZGVzIGEgYm9vbGVhbiBpbnRvIGEge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSGV4IH0gZnJvbSAnb3gnXG4gKlxuICogSGV4LmZyb21Cb29sZWFuKHRydWUpXG4gKiAvLyBAbG9nOiAnMHgxJ1xuICpcbiAqIEhleC5mcm9tQm9vbGVhbihmYWxzZSlcbiAqIC8vIEBsb2c6ICcweDAnXG4gKlxuICogSGV4LmZyb21Cb29sZWFuKHRydWUsIHsgc2l6ZTogMzIgfSlcbiAqIC8vIEBsb2c6ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgYm9vbGVhbiB2YWx1ZSB0byBlbmNvZGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgZW5jb2RlZCB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQm9vbGVhbih2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgaGV4ID0gYDB4JHtOdW1iZXIodmFsdWUpfWA7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGludGVybmFsLmFzc2VydFNpemUoaGV4LCBvcHRpb25zLnNpemUpO1xuICAgICAgICByZXR1cm4gcGFkTGVmdChoZXgsIG9wdGlvbnMuc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBoZXg7XG59XG4vKipcbiAqIEVuY29kZXMgYSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IHZhbHVlIGludG8gYSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBCeXRlcywgSGV4IH0gZnJvbSAnb3gnXG4gKlxuICogSGV4LmZyb21CeXRlcyhCeXRlcy5mcm9tKFs3MiwgMTAxLCAxMDgsIDEwOCwgMTExLCAzMiwgODcsIDExMSwgMTE0LCAxMDgsIDEwMCwgMzNdKSlcbiAqIC8vIEBsb2c6ICcweDQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9IHZhbHVlIHRvIGVuY29kZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21CeXRlcyh2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IHN0cmluZyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspXG4gICAgICAgIHN0cmluZyArPSBoZXhlc1t2YWx1ZVtpXV07XG4gICAgY29uc3QgaGV4ID0gYDB4JHtzdHJpbmd9YDtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaW50ZXJuYWwuYXNzZXJ0U2l6ZShoZXgsIG9wdGlvbnMuc2l6ZSk7XG4gICAgICAgIHJldHVybiBwYWRSaWdodChoZXgsIG9wdGlvbnMuc2l6ZSk7XG4gICAgfVxuICAgIHJldHVybiBoZXg7XG59XG4vKipcbiAqIEVuY29kZXMgYSBudW1iZXIgb3IgYmlnaW50IGludG8gYSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXguZnJvbU51bWJlcig0MjApXG4gKiAvLyBAbG9nOiAnMHgxYTQnXG4gKlxuICogSGV4LmZyb21OdW1iZXIoNDIwLCB7IHNpemU6IDMyIH0pXG4gKiAvLyBAbG9nOiAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMWE0J1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIG51bWJlciBvciBiaWdpbnQgdmFsdWUgdG8gZW5jb2RlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zLlxuICogQHJldHVybnMgVGhlIGVuY29kZWQge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZnJvbU51bWJlcih2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBzaWduZWQsIHNpemUgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgdmFsdWVfID0gQmlnSW50KHZhbHVlKTtcbiAgICBsZXQgbWF4VmFsdWU7XG4gICAgaWYgKHNpemUpIHtcbiAgICAgICAgaWYgKHNpZ25lZClcbiAgICAgICAgICAgIG1heFZhbHVlID0gKDFuIDw8IChCaWdJbnQoc2l6ZSkgKiA4biAtIDFuKSkgLSAxbjtcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgbWF4VmFsdWUgPSAybiAqKiAoQmlnSW50KHNpemUpICogOG4pIC0gMW47XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgbWF4VmFsdWUgPSBCaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xuICAgIH1cbiAgICBjb25zdCBtaW5WYWx1ZSA9IHR5cGVvZiBtYXhWYWx1ZSA9PT0gJ2JpZ2ludCcgJiYgc2lnbmVkID8gLW1heFZhbHVlIC0gMW4gOiAwO1xuICAgIGlmICgobWF4VmFsdWUgJiYgdmFsdWVfID4gbWF4VmFsdWUpIHx8IHZhbHVlXyA8IG1pblZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcgPyAnbicgOiAnJztcbiAgICAgICAgdGhyb3cgbmV3IEludGVnZXJPdXRPZlJhbmdlRXJyb3Ioe1xuICAgICAgICAgICAgbWF4OiBtYXhWYWx1ZSA/IGAke21heFZhbHVlfSR7c3VmZml4fWAgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBtaW46IGAke21pblZhbHVlfSR7c3VmZml4fWAsXG4gICAgICAgICAgICBzaWduZWQsXG4gICAgICAgICAgICBzaXplLFxuICAgICAgICAgICAgdmFsdWU6IGAke3ZhbHVlfSR7c3VmZml4fWAsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBzdHJpbmdWYWx1ZSA9IChzaWduZWQgJiYgdmFsdWVfIDwgMCA/ICgxbiA8PCBCaWdJbnQoc2l6ZSAqIDgpKSArIEJpZ0ludCh2YWx1ZV8pIDogdmFsdWVfKS50b1N0cmluZygxNik7XG4gICAgY29uc3QgaGV4ID0gYDB4JHtzdHJpbmdWYWx1ZX1gO1xuICAgIGlmIChzaXplKVxuICAgICAgICByZXR1cm4gcGFkTGVmdChoZXgsIHNpemUpO1xuICAgIHJldHVybiBoZXg7XG59XG4vKipcbiAqIEVuY29kZXMgYSBzdHJpbmcgaW50byBhIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEhleCB9IGZyb20gJ294J1xuICogSGV4LmZyb21TdHJpbmcoJ0hlbGxvIFdvcmxkIScpXG4gKiAvLyAnMHg0ODY1NmM2YzZmMjA1NzZmNzI2YzY0MjEnXG4gKlxuICogSGV4LmZyb21TdHJpbmcoJ0hlbGxvIFdvcmxkIScsIHsgc2l6ZTogMzIgfSlcbiAqIC8vICcweDQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3RyaW5nIHZhbHVlIHRvIGVuY29kZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBlbmNvZGVkIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBmcm9tQnl0ZXMoZW5jb2Rlci5lbmNvZGUodmFsdWUpLCBvcHRpb25zKTtcbn1cbi8qKlxuICogQ2hlY2tzIGlmIHR3byB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWVzIGFyZSBlcXVhbC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEhleCB9IGZyb20gJ294J1xuICpcbiAqIEhleC5pc0VxdWFsKCcweGRlYWRiZWVmJywgJzB4ZGVhZGJlZWYnKVxuICogLy8gQGxvZzogdHJ1ZVxuICpcbiAqIEhleC5pc0VxdWFsKCcweGRhJywgJzB4YmEnKVxuICogLy8gQGxvZzogZmFsc2VcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBoZXhBIC0gVGhlIGZpcnN0IHtAbGluayBveCNIZXguSGV4fSB2YWx1ZS5cbiAqIEBwYXJhbSBoZXhCIC0gVGhlIHNlY29uZCB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHR3byB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWVzIGFyZSBlcXVhbCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VxdWFsKGhleEEsIGhleEIpIHtcbiAgICByZXR1cm4gZXF1YWxCeXRlcyhCeXRlcy5mcm9tSGV4KGhleEEpLCBCeXRlcy5mcm9tSGV4KGhleEIpKTtcbn1cbi8qKlxuICogUGFkcyBhIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZSB0byB0aGUgbGVmdCB3aXRoIHplcm8gYnl0ZXMgdW50aWwgaXQgcmVhY2hlcyB0aGUgZ2l2ZW4gYHNpemVgIChkZWZhdWx0OiAzMiBieXRlcykuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXgucGFkTGVmdCgnMHgxMjM0JywgNClcbiAqIC8vIEBsb2c6ICcweDAwMDAxMjM0J1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZSB0byBwYWQuXG4gKiBAcGFyYW0gc2l6ZSAtIFRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIG91dHB1dCBoZXggdmFsdWUuXG4gKiBAcmV0dXJucyBUaGUgcGFkZGVkIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZExlZnQodmFsdWUsIHNpemUpIHtcbiAgICByZXR1cm4gaW50ZXJuYWwucGFkKHZhbHVlLCB7IGRpcjogJ2xlZnQnLCBzaXplIH0pO1xufVxuLyoqXG4gKiBQYWRzIGEge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIHRvIHRoZSByaWdodCB3aXRoIHplcm8gYnl0ZXMgdW50aWwgaXQgcmVhY2hlcyB0aGUgZ2l2ZW4gYHNpemVgIChkZWZhdWx0OiAzMiBieXRlcykuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXgucGFkUmlnaHQoJzB4MTIzNCcsIDQpXG4gKiAvLyBAbG9nOiAnMHgxMjM0MDAwMCdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUgdG8gcGFkLlxuICogQHBhcmFtIHNpemUgLSBUaGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBvdXRwdXQgaGV4IHZhbHVlLlxuICogQHJldHVybnMgVGhlIHBhZGRlZCB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWRSaWdodCh2YWx1ZSwgc2l6ZSkge1xuICAgIHJldHVybiBpbnRlcm5hbC5wYWQodmFsdWUsIHsgZGlyOiAncmlnaHQnLCBzaXplIH0pO1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20ge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSGV4IH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgaGV4ID0gSGV4LnJhbmRvbSgzMilcbiAqIC8vIEBsb2c6ICcweC4uLidcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIFJhbmRvbSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kb20obGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZyb21CeXRlcyhCeXRlcy5yYW5kb20obGVuZ3RoKSk7XG59XG4vKipcbiAqIFJldHVybnMgYSBzZWN0aW9uIG9mIGEge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZSBnaXZlbiBhIHN0YXJ0L2VuZCBieXRlcyBvZmZzZXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXguc2xpY2UoJzB4MDEyMzQ1Njc4OScsIDEsIDQpXG4gKiAvLyBAbG9nOiAnMHgyMzQ1NjcnXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIHRvIHNsaWNlLlxuICogQHBhcmFtIHN0YXJ0IC0gVGhlIHN0YXJ0IG9mZnNldCAoaW4gYnl0ZXMpLlxuICogQHBhcmFtIGVuZCAtIFRoZSBlbmQgb2Zmc2V0IChpbiBieXRlcykuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgc2xpY2VkIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlKHZhbHVlLCBzdGFydCwgZW5kLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IHN0cmljdCB9ID0gb3B0aW9ucztcbiAgICBpbnRlcm5hbC5hc3NlcnRTdGFydE9mZnNldCh2YWx1ZSwgc3RhcnQpO1xuICAgIGNvbnN0IHZhbHVlXyA9IGAweCR7dmFsdWVcbiAgICAgICAgLnJlcGxhY2UoJzB4JywgJycpXG4gICAgICAgIC5zbGljZSgoc3RhcnQgPz8gMCkgKiAyLCAoZW5kID8/IHZhbHVlLmxlbmd0aCkgKiAyKX1gO1xuICAgIGlmIChzdHJpY3QpXG4gICAgICAgIGludGVybmFsLmFzc2VydEVuZE9mZnNldCh2YWx1ZV8sIHN0YXJ0LCBlbmQpO1xuICAgIHJldHVybiB2YWx1ZV87XG59XG4vKipcbiAqIFJldHJpZXZlcyB0aGUgc2l6ZSBvZiBhIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZSAoaW4gYnl0ZXMpLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSGV4IH0gZnJvbSAnb3gnXG4gKlxuICogSGV4LnNpemUoJzB4ZGVhZGJlZWYnKVxuICogLy8gQGxvZzogNFxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZSB0byBnZXQgdGhlIHNpemUgb2YuXG4gKiBAcmV0dXJucyBUaGUgc2l6ZSBvZiB0aGUge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIChpbiBieXRlcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaXplKHZhbHVlKSB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCgodmFsdWUubGVuZ3RoIC0gMikgLyAyKTtcbn1cbi8qKlxuICogVHJpbXMgbGVhZGluZyB6ZXJvcyBmcm9tIGEge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSGV4IH0gZnJvbSAnb3gnXG4gKlxuICogSGV4LnRyaW1MZWZ0KCcweDAwMDAwMDAwZGVhZGJlZWYnKVxuICogLy8gQGxvZzogJzB4ZGVhZGJlZWYnXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIHRvIHRyaW0uXG4gKiBAcmV0dXJucyBUaGUgdHJpbW1lZCB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltTGVmdCh2YWx1ZSkge1xuICAgIHJldHVybiBpbnRlcm5hbC50cmltKHZhbHVlLCB7IGRpcjogJ2xlZnQnIH0pO1xufVxuLyoqXG4gKiBUcmltcyB0cmFpbGluZyB6ZXJvcyBmcm9tIGEge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSGV4IH0gZnJvbSAnb3gnXG4gKlxuICogSGV4LnRyaW1SaWdodCgnMHhkZWFkYmVlZjAwMDAwMDAwJylcbiAqIC8vIEBsb2c6ICcweGRlYWRiZWVmJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZSB0byB0cmltLlxuICogQHJldHVybnMgVGhlIHRyaW1tZWQge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbVJpZ2h0KHZhbHVlKSB7XG4gICAgcmV0dXJuIGludGVybmFsLnRyaW0odmFsdWUsIHsgZGlyOiAncmlnaHQnIH0pO1xufVxuLyoqXG4gKiBEZWNvZGVzIGEge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIGludG8gYSBCaWdJbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXgudG9CaWdJbnQoJzB4MWE0JylcbiAqIC8vIEBsb2c6IDQyMG5cbiAqXG4gKiBIZXgudG9CaWdJbnQoJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFhNCcsIHsgc2l6ZTogMzIgfSlcbiAqIC8vIEBsb2c6IDQyMG5cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBoZXggLSBUaGUge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIHRvIGRlY29kZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIEJpZ0ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQmlnSW50KGhleCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBzaWduZWQgfSA9IG9wdGlvbnM7XG4gICAgaWYgKG9wdGlvbnMuc2l6ZSlcbiAgICAgICAgaW50ZXJuYWwuYXNzZXJ0U2l6ZShoZXgsIG9wdGlvbnMuc2l6ZSk7XG4gICAgY29uc3QgdmFsdWUgPSBCaWdJbnQoaGV4KTtcbiAgICBpZiAoIXNpZ25lZClcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IHNpemUgPSAoaGV4Lmxlbmd0aCAtIDIpIC8gMjtcbiAgICBjb25zdCBtYXhfdW5zaWduZWQgPSAoMW4gPDwgKEJpZ0ludChzaXplKSAqIDhuKSkgLSAxbjtcbiAgICBjb25zdCBtYXhfc2lnbmVkID0gbWF4X3Vuc2lnbmVkID4+IDFuO1xuICAgIGlmICh2YWx1ZSA8PSBtYXhfc2lnbmVkKVxuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgcmV0dXJuIHZhbHVlIC0gbWF4X3Vuc2lnbmVkIC0gMW47XG59XG4vKipcbiAqIERlY29kZXMgYSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUgaW50byBhIGJvb2xlYW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXgudG9Cb29sZWFuKCcweDAxJylcbiAqIC8vIEBsb2c6IHRydWVcbiAqXG4gKiBIZXgudG9Cb29sZWFuKCcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnLCB7IHNpemU6IDMyIH0pXG4gKiAvLyBAbG9nOiB0cnVlXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gaGV4IC0gVGhlIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZSB0byBkZWNvZGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgZGVjb2RlZCBib29sZWFuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Cb29sZWFuKGhleCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKG9wdGlvbnMuc2l6ZSlcbiAgICAgICAgaW50ZXJuYWwuYXNzZXJ0U2l6ZShoZXgsIG9wdGlvbnMuc2l6ZSk7XG4gICAgY29uc3QgaGV4XyA9IHRyaW1MZWZ0KGhleCk7XG4gICAgaWYgKGhleF8gPT09ICcweCcpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoaGV4XyA9PT0gJzB4MScpXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIHRocm93IG5ldyBJbnZhbGlkSGV4Qm9vbGVhbkVycm9yKGhleCk7XG59XG4vKipcbiAqIERlY29kZXMgYSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUgaW50byBhIHtAbGluayBveCNCeXRlcy5CeXRlc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBjb25zdCBkYXRhID0gSGV4LnRvQnl0ZXMoJzB4NDg2NTZjNmM2ZjIwNzc2ZjcyNmM2NDIxJylcbiAqIC8vIEBsb2c6IFVpbnQ4QXJyYXkoWzcyLCAxMDEsIDEwOCwgMTA4LCAxMTEsIDMyLCA4NywgMTExLCAxMTQsIDEwOCwgMTAwLCAzM10pXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gaGV4IC0gVGhlIHtAbGluayBveCNIZXguSGV4fSB2YWx1ZSB0byBkZWNvZGUuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgZGVjb2RlZCB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9CeXRlcyhoZXgsIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBCeXRlcy5mcm9tSGV4KGhleCwgb3B0aW9ucyk7XG59XG4vKipcbiAqIERlY29kZXMgYSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUgaW50byBhIG51bWJlci5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEhleCB9IGZyb20gJ294J1xuICpcbiAqIEhleC50b051bWJlcignMHgxYTQnKVxuICogLy8gQGxvZzogNDIwXG4gKlxuICogSGV4LnRvTnVtYmVyKCcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxYTQnLCB7IHNpemU6IDMyIH0pXG4gKiAvLyBAbG9nOiA0MjBcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBoZXggLSBUaGUge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIHRvIGRlY29kZS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKGhleCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBzaWduZWQsIHNpemUgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFzaWduZWQgJiYgIXNpemUpXG4gICAgICAgIHJldHVybiBOdW1iZXIoaGV4KTtcbiAgICByZXR1cm4gTnVtYmVyKHRvQmlnSW50KGhleCwgb3B0aW9ucykpO1xufVxuLyoqXG4gKiBEZWNvZGVzIGEge0BsaW5rIG94I0hleC5IZXh9IHZhbHVlIGludG8gYSBzdHJpbmcuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXgudG9TdHJpbmcoJzB4NDg2NTZjNmM2ZjIwNTc2ZjcyNmM2NDIxJylcbiAqIC8vIEBsb2c6ICdIZWxsbyB3b3JsZCEnXG4gKlxuICogSGV4LnRvU3RyaW5nKCcweDQ4NjU2YzZjNmYyMDU3NmY3MjZjNjQyMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCB7XG4gKiAgc2l6ZTogMzIsXG4gKiB9KVxuICogLy8gQGxvZzogJ0hlbGxvIHdvcmxkJ1xuICogYGBgXG4gKlxuICogQHBhcmFtIGhleCAtIFRoZSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUgdG8gZGVjb2RlLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zLlxuICogQHJldHVybnMgVGhlIGRlY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TdHJpbmcoaGV4LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IHNpemUgfSA9IG9wdGlvbnM7XG4gICAgbGV0IGJ5dGVzID0gQnl0ZXMuZnJvbUhleChoZXgpO1xuICAgIGlmIChzaXplKSB7XG4gICAgICAgIGludGVybmFsX2J5dGVzLmFzc2VydFNpemUoYnl0ZXMsIHNpemUpO1xuICAgICAgICBieXRlcyA9IEJ5dGVzLnRyaW1SaWdodChieXRlcyk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUoYnl0ZXMpO1xufVxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIHtAbGluayBveCNIZXguSGV4fS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEJ5dGVzLCBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXgudmFsaWRhdGUoJzB4ZGVhZGJlZWYnKVxuICogLy8gQGxvZzogdHJ1ZVxuICpcbiAqIEhleC52YWxpZGF0ZShCeXRlcy5mcm9tKFsxLCAyLCAzXSkpXG4gKiAvLyBAbG9nOiBmYWxzZVxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhIHtAbGluayBveCNIZXguSGV4fSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZSh2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBzdHJpY3QgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICB0cnkge1xuICAgICAgICBhc3NlcnQodmFsdWUsIHsgc3RyaWN0IH0pO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcHJvdmlkZWQgaW50ZWdlciBpcyBvdXQgb2YgcmFuZ2UsIGFuZCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQgYXMgYSBoZXggdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXguZnJvbU51bWJlcig0MjAxODI3Mzg5MTI3MzEyODM3MTI5MzcxMjkpXG4gKiAvLyBAZXJyb3I6IEhleC5JbnRlZ2VyT3V0T2ZSYW5nZUVycm9yOiBOdW1iZXIgXFxgNC4yMDE4MjczODkxMjczMTI2ZSsyNlxcYCBpcyBub3QgaW4gc2FmZSB1bnNpZ25lZCBpbnRlZ2VyIHJhbmdlIChgMGAgdG8gYDkwMDcxOTkyNTQ3NDA5OTFgKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlZ2VyT3V0T2ZSYW5nZUVycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IoeyBtYXgsIG1pbiwgc2lnbmVkLCBzaXplLCB2YWx1ZSwgfSkge1xuICAgICAgICBzdXBlcihgTnVtYmVyIFxcYCR7dmFsdWV9XFxgIGlzIG5vdCBpbiBzYWZlJHtzaXplID8gYCAke3NpemUgKiA4fS1iaXRgIDogJyd9JHtzaWduZWQgPyAnIHNpZ25lZCcgOiAnIHVuc2lnbmVkJ30gaW50ZWdlciByYW5nZSAke21heCA/IGAoXFxgJHttaW59XFxgIHRvIFxcYCR7bWF4fVxcYClgIDogYChhYm92ZSBcXGAke21pbn1cXGApYH1gKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ0hleC5JbnRlZ2VyT3V0T2ZSYW5nZUVycm9yJ1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKipcbiAqIFRocm93biB3aGVuIHRoZSBwcm92aWRlZCBoZXggdmFsdWUgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzIGEgYm9vbGVhbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IEhleCB9IGZyb20gJ294J1xuICpcbiAqIEhleC50b0Jvb2xlYW4oJzB4YScpXG4gKiAvLyBAZXJyb3I6IEhleC5JbnZhbGlkSGV4Qm9vbGVhbkVycm9yOiBIZXggdmFsdWUgYFwiMHhhXCJgIGlzIG5vdCBhIHZhbGlkIGJvb2xlYW4uXG4gKiAvLyBAZXJyb3I6IFRoZSBoZXggdmFsdWUgbXVzdCBiZSBgXCIweDBcImAgKGZhbHNlKSBvciBgXCIweDFcImAgKHRydWUpLlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkSGV4Qm9vbGVhbkVycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IoaGV4KSB7XG4gICAgICAgIHN1cGVyKGBIZXggdmFsdWUgXFxgXCIke2hleH1cIlxcYCBpcyBub3QgYSB2YWxpZCBib29sZWFuLmAsIHtcbiAgICAgICAgICAgIG1ldGFNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgICdUaGUgaGV4IHZhbHVlIG11c3QgYmUgYFwiMHgwXCJgIChmYWxzZSkgb3IgYFwiMHgxXCJgICh0cnVlKS4nLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdIZXguSW52YWxpZEhleEJvb2xlYW5FcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcHJvdmlkZWQgdmFsdWUgaXMgbm90IGEgdmFsaWQgaGV4IHR5cGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXguYXNzZXJ0KDEpXG4gKiAvLyBAZXJyb3I6IEhleC5JbnZhbGlkSGV4VHlwZUVycm9yOiBWYWx1ZSBgMWAgb2YgdHlwZSBgbnVtYmVyYCBpcyBhbiBpbnZhbGlkIGhleCB0eXBlLlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkSGV4VHlwZUVycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgc3VwZXIoYFZhbHVlIFxcYCR7dHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyA/IEpzb24uc3RyaW5naWZ5KHZhbHVlKSA6IHZhbHVlfVxcYCBvZiB0eXBlIFxcYCR7dHlwZW9mIHZhbHVlfVxcYCBpcyBhbiBpbnZhbGlkIGhleCB0eXBlLmAsIHtcbiAgICAgICAgICAgIG1ldGFNZXNzYWdlczogWydIZXggdHlwZXMgbXVzdCBiZSByZXByZXNlbnRlZCBhcyBgXCIweCR7c3RyaW5nfVwiYC4nXSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdIZXguSW52YWxpZEhleFR5cGVFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcHJvdmlkZWQgaGV4IHZhbHVlIGlzIGludmFsaWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXguYXNzZXJ0KCcweDAxMjM0NTY3ODlhYmNkZWZnJylcbiAqIC8vIEBlcnJvcjogSGV4LkludmFsaWRIZXhWYWx1ZUVycm9yOiBWYWx1ZSBgMHgwMTIzNDU2Nzg5YWJjZGVmZ2AgaXMgYW4gaW52YWxpZCBoZXggdmFsdWUuXG4gKiAvLyBAZXJyb3I6IEhleCB2YWx1ZXMgbXVzdCBzdGFydCB3aXRoIGBcIjB4XCJgIGFuZCBjb250YWluIG9ubHkgaGV4YWRlY2ltYWwgY2hhcmFjdGVycyAoMC05LCBhLWYsIEEtRikuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRIZXhWYWx1ZUVycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IodmFsdWUpIHtcbiAgICAgICAgc3VwZXIoYFZhbHVlIFxcYCR7dmFsdWV9XFxgIGlzIGFuIGludmFsaWQgaGV4IHZhbHVlLmAsIHtcbiAgICAgICAgICAgIG1ldGFNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgICdIZXggdmFsdWVzIG11c3Qgc3RhcnQgd2l0aCBgXCIweFwiYCBhbmQgY29udGFpbiBvbmx5IGhleGFkZWNpbWFsIGNoYXJhY3RlcnMgKDAtOSwgYS1mLCBBLUYpLicsXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ0hleC5JbnZhbGlkSGV4VmFsdWVFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgcHJvdmlkZWQgaGV4IHZhbHVlIGlzIGFuIG9kZCBsZW5ndGguXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBCeXRlcyB9IGZyb20gJ294J1xuICpcbiAqIEJ5dGVzLmZyb21IZXgoJzB4YWJjZGUnKVxuICogLy8gQGVycm9yOiBIZXguSW52YWxpZExlbmd0aEVycm9yOiBIZXggdmFsdWUgYFwiMHhhYmNkZVwiYCBpcyBhbiBvZGQgbGVuZ3RoICg1IG5pYmJsZXMpLlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkTGVuZ3RoRXJyb3IgZXh0ZW5kcyBFcnJvcnMuQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkge1xuICAgICAgICBzdXBlcihgSGV4IHZhbHVlIFxcYFwiJHt2YWx1ZX1cIlxcYCBpcyBhbiBvZGQgbGVuZ3RoICgke3ZhbHVlLmxlbmd0aCAtIDJ9IG5pYmJsZXMpLmAsIHtcbiAgICAgICAgICAgIG1ldGFNZXNzYWdlczogWydJdCBtdXN0IGJlIGFuIGV2ZW4gbGVuZ3RoLiddLFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ0hleC5JbnZhbGlkTGVuZ3RoRXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKlxuICogVGhyb3duIHdoZW4gdGhlIHNpemUgb2YgdGhlIHZhbHVlIGV4Y2VlZHMgdGhlIGV4cGVjdGVkIG1heCBzaXplLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSGV4IH0gZnJvbSAnb3gnXG4gKlxuICogSGV4LmZyb21TdHJpbmcoJ0hlbGxvIFdvcmxkIScsIHsgc2l6ZTogOCB9KVxuICogLy8gQGVycm9yOiBIZXguU2l6ZU92ZXJmbG93RXJyb3I6IFNpemUgY2Fubm90IGV4Y2VlZCBgOGAgYnl0ZXMuIEdpdmVuIHNpemU6IGAxMmAgYnl0ZXMuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNpemVPdmVyZmxvd0Vycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IoeyBnaXZlblNpemUsIG1heFNpemUgfSkge1xuICAgICAgICBzdXBlcihgU2l6ZSBjYW5ub3QgZXhjZWVkIFxcYCR7bWF4U2l6ZX1cXGAgYnl0ZXMuIEdpdmVuIHNpemU6IFxcYCR7Z2l2ZW5TaXplfVxcYCBieXRlcy5gKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ0hleC5TaXplT3ZlcmZsb3dFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgc2xpY2Ugb2Zmc2V0IGV4Y2VlZHMgdGhlIGJvdW5kcyBvZiB0aGUgdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXguc2xpY2UoJzB4MDEyMzQ1Njc4OScsIDYpXG4gKiAvLyBAZXJyb3I6IEhleC5TbGljZU9mZnNldE91dE9mQm91bmRzRXJyb3I6IFNsaWNlIHN0YXJ0aW5nIGF0IG9mZnNldCBgNmAgaXMgb3V0LW9mLWJvdW5kcyAoc2l6ZTogYDVgKS5cbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU2xpY2VPZmZzZXRPdXRPZkJvdW5kc0Vycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IoeyBvZmZzZXQsIHBvc2l0aW9uLCBzaXplLCB9KSB7XG4gICAgICAgIHN1cGVyKGBTbGljZSAke3Bvc2l0aW9uID09PSAnc3RhcnQnID8gJ3N0YXJ0aW5nJyA6ICdlbmRpbmcnfSBhdCBvZmZzZXQgXFxgJHtvZmZzZXR9XFxgIGlzIG91dC1vZi1ib3VuZHMgKHNpemU6IFxcYCR7c2l6ZX1cXGApLmApO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnSGV4LlNsaWNlT2Zmc2V0T3V0T2ZCb3VuZHNFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgc2l6ZSBvZiB0aGUgdmFsdWUgZXhjZWVkcyB0aGUgcGFkIHNpemUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBIZXggfSBmcm9tICdveCdcbiAqXG4gKiBIZXgucGFkTGVmdCgnMHgxYTRlMTJhNDVhMjEzMjMxMjNhYWE4N2E4OTdhODk3YTg5OGE2NTY3YTU3OGE4NjdhOTg3NzhhNjY3YTg1YTg3NWE4N2E2YTc4N2E2NWE2NzVhNmE5JywgMzIpXG4gKiAvLyBAZXJyb3I6IEhleC5TaXplRXhjZWVkc1BhZGRpbmdTaXplRXJyb3I6IEhleCBzaXplIChgNDNgKSBleGNlZWRzIHBhZGRpbmcgc2l6ZSAoYDMyYCkuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNpemVFeGNlZWRzUGFkZGluZ1NpemVFcnJvciBleHRlbmRzIEVycm9ycy5CYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHsgc2l6ZSwgdGFyZ2V0U2l6ZSwgdHlwZSwgfSkge1xuICAgICAgICBzdXBlcihgJHt0eXBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7dHlwZVxuICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAudG9Mb3dlckNhc2UoKX0gc2l6ZSAoXFxgJHtzaXplfVxcYCkgZXhjZWVkcyBwYWRkaW5nIHNpemUgKFxcYCR7dGFyZ2V0U2l6ZX1cXGApLmApO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnSGV4LlNpemVFeGNlZWRzUGFkZGluZ1NpemVFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9SGV4LmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/Hex.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/Json.js":
/*!*******************************************!*\
  !*** ./node_modules/ox/_esm/core/Json.js ***!
  \*******************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   parse: () => (/* binding */ parse),\n/* harmony export */   stringify: () => (/* binding */ stringify)\n/* harmony export */ });\nconst bigIntSuffix = /*#__PURE__*/ '#__bigint';\n/**\n * Parses a JSON string, with support for `bigint`.\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.parse('{\"foo\":\"bar\",\"baz\":\"69420694206942069420694206942069420694206942069420#__bigint\"}')\n * // @log: {\n * // @log:   foo: 'bar',\n * // @log:   baz: 69420694206942069420694206942069420694206942069420n\n * // @log: }\n * ```\n *\n * @param string - The value to parse.\n * @param reviver - A function that transforms the results.\n * @returns The parsed value.\n */\nfunction parse(string, reviver) {\n    return JSON.parse(string, (key, value_) => {\n        const value = value_;\n        if (typeof value === 'string' && value.endsWith(bigIntSuffix))\n            return BigInt(value.slice(0, -bigIntSuffix.length));\n        return typeof reviver === 'function' ? reviver(key, value) : value;\n    });\n}\n/**\n * Stringifies a value to its JSON representation, with support for `bigint`.\n *\n * @example\n * ```ts twoslash\n * import { Json } from 'ox'\n *\n * const json = Json.stringify({\n *   foo: 'bar',\n *   baz: 69420694206942069420694206942069420694206942069420n,\n * })\n * // @log: '{\"foo\":\"bar\",\"baz\":\"69420694206942069420694206942069420694206942069420#__bigint\"}'\n * ```\n *\n * @param value - The value to stringify.\n * @param replacer - A function that transforms the results. It is passed the key and value of the property, and must return the value to be used in the JSON string. If this function returns `undefined`, the property is not included in the resulting JSON string.\n * @param space - A string or number that determines the indentation of the JSON string. If it is a number, it indicates the number of spaces to use as indentation; if it is a string (e.g. `'\\t'`), it uses the string as the indentation character.\n * @returns The JSON string.\n */\nfunction stringify(value, replacer, space) {\n    return JSON.stringify(value, (key, value) => {\n        if (typeof replacer === 'function')\n            return replacer(key, value);\n        if (typeof value === 'bigint')\n            return value.toString() + bigIntSuffix;\n        return value;\n    }, space);\n}\n//# sourceMappingURL=Json.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvSnNvbi5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksT0FBTztBQUNuQjtBQUNBLDZCQUE2QixnRkFBZ0Y7QUFDN0c7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKLGNBQWMsZ0ZBQWdGO0FBQzlGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUtBQXFLO0FBQ3JLO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL294L19lc20vY29yZS9Kc29uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IGJpZ0ludFN1ZmZpeCA9IC8qI19fUFVSRV9fKi8gJyNfX2JpZ2ludCc7XG4vKipcbiAqIFBhcnNlcyBhIEpTT04gc3RyaW5nLCB3aXRoIHN1cHBvcnQgZm9yIGBiaWdpbnRgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSnNvbiB9IGZyb20gJ294J1xuICpcbiAqIGNvbnN0IGpzb24gPSBKc29uLnBhcnNlKCd7XCJmb29cIjpcImJhclwiLFwiYmF6XCI6XCI2OTQyMDY5NDIwNjk0MjA2OTQyMDY5NDIwNjk0MjA2OTQyMDY5NDIwNjk0MjA2OTQyMCNfX2JpZ2ludFwifScpXG4gKiAvLyBAbG9nOiB7XG4gKiAvLyBAbG9nOiAgIGZvbzogJ2JhcicsXG4gKiAvLyBAbG9nOiAgIGJhejogNjk0MjA2OTQyMDY5NDIwNjk0MjA2OTQyMDY5NDIwNjk0MjA2OTQyMDY5NDIwNjk0MjBuXG4gKiAvLyBAbG9nOiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc3RyaW5nIC0gVGhlIHZhbHVlIHRvIHBhcnNlLlxuICogQHBhcmFtIHJldml2ZXIgLSBBIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgcmVzdWx0cy5cbiAqIEByZXR1cm5zIFRoZSBwYXJzZWQgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZShzdHJpbmcsIHJldml2ZXIpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzdHJpbmcsIChrZXksIHZhbHVlXykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlXztcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuZW5kc1dpdGgoYmlnSW50U3VmZml4KSlcbiAgICAgICAgICAgIHJldHVybiBCaWdJbnQodmFsdWUuc2xpY2UoMCwgLWJpZ0ludFN1ZmZpeC5sZW5ndGgpKTtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXZpdmVyID09PSAnZnVuY3Rpb24nID8gcmV2aXZlcihrZXksIHZhbHVlKSA6IHZhbHVlO1xuICAgIH0pO1xufVxuLyoqXG4gKiBTdHJpbmdpZmllcyBhIHZhbHVlIHRvIGl0cyBKU09OIHJlcHJlc2VudGF0aW9uLCB3aXRoIHN1cHBvcnQgZm9yIGBiaWdpbnRgLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgSnNvbiB9IGZyb20gJ294J1xuICpcbiAqIGNvbnN0IGpzb24gPSBKc29uLnN0cmluZ2lmeSh7XG4gKiAgIGZvbzogJ2JhcicsXG4gKiAgIGJhejogNjk0MjA2OTQyMDY5NDIwNjk0MjA2OTQyMDY5NDIwNjk0MjA2OTQyMDY5NDIwNjk0MjBuLFxuICogfSlcbiAqIC8vIEBsb2c6ICd7XCJmb29cIjpcImJhclwiLFwiYmF6XCI6XCI2OTQyMDY5NDIwNjk0MjA2OTQyMDY5NDIwNjk0MjA2OTQyMDY5NDIwNjk0MjA2OTQyMCNfX2JpZ2ludFwifSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBzdHJpbmdpZnkuXG4gKiBAcGFyYW0gcmVwbGFjZXIgLSBBIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgcmVzdWx0cy4gSXQgaXMgcGFzc2VkIHRoZSBrZXkgYW5kIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgYW5kIG11c3QgcmV0dXJuIHRoZSB2YWx1ZSB0byBiZSB1c2VkIGluIHRoZSBKU09OIHN0cmluZy4gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGB1bmRlZmluZWRgLCB0aGUgcHJvcGVydHkgaXMgbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgSlNPTiBzdHJpbmcuXG4gKiBAcGFyYW0gc3BhY2UgLSBBIHN0cmluZyBvciBudW1iZXIgdGhhdCBkZXRlcm1pbmVzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgSlNPTiBzdHJpbmcuIElmIGl0IGlzIGEgbnVtYmVyLCBpdCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBzcGFjZXMgdG8gdXNlIGFzIGluZGVudGF0aW9uOyBpZiBpdCBpcyBhIHN0cmluZyAoZS5nLiBgJ1xcdCdgKSwgaXQgdXNlcyB0aGUgc3RyaW5nIGFzIHRoZSBpbmRlbnRhdGlvbiBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyBUaGUgSlNPTiBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdpZnkodmFsdWUsIHJlcGxhY2VyLCBzcGFjZSkge1xuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiByZXBsYWNlciA9PT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICAgIHJldHVybiByZXBsYWNlcihrZXksIHZhbHVlKTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpXG4gICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKSArIGJpZ0ludFN1ZmZpeDtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0sIHNwYWNlKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPUpzb24uanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/Json.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/Provider.js":
/*!***********************************************!*\
  !*** ./node_modules/ox/_esm/core/Provider.js ***!
  \***********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   ChainDisconnectedError: () => (/* binding */ ChainDisconnectedError),\n/* harmony export */   DisconnectedError: () => (/* binding */ DisconnectedError),\n/* harmony export */   IsUndefinedError: () => (/* binding */ IsUndefinedError),\n/* harmony export */   ProviderRpcError: () => (/* binding */ ProviderRpcError),\n/* harmony export */   UnauthorizedError: () => (/* binding */ UnauthorizedError),\n/* harmony export */   UnsupportedMethodError: () => (/* binding */ UnsupportedMethodError),\n/* harmony export */   UserRejectedRequestError: () => (/* binding */ UserRejectedRequestError),\n/* harmony export */   createEmitter: () => (/* binding */ createEmitter),\n/* harmony export */   from: () => (/* binding */ from)\n/* harmony export */ });\n/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! eventemitter3 */ \"(app-pages-browser)/./node_modules/eventemitter3/index.mjs\");\n/* harmony import */ var _Errors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Errors.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Errors.js\");\n/* harmony import */ var _RpcResponse_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./RpcResponse.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/RpcResponse.js\");\n\n\n\nclass ProviderRpcError extends Error {\n    constructor(code, message) {\n        super(message);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'ProviderRpcError'\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"details\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.code = code;\n        this.details = message;\n    }\n}\n/** The user rejected the request. */\nclass UserRejectedRequestError extends ProviderRpcError {\n    constructor({ message = 'The user rejected the request.', } = {}) {\n        super(4001, message);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Provider.UserRejectedRequestError'\n        });\n    }\n}\nObject.defineProperty(UserRejectedRequestError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4001\n});\n/** The requested method and/or account has not been authorized by the user. */\nclass UnauthorizedError extends ProviderRpcError {\n    constructor({ message = 'The requested method and/or account has not been authorized by the user.', } = {}) {\n        super(4100, message);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Provider.UnauthorizedError'\n        });\n    }\n}\nObject.defineProperty(UnauthorizedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4100\n});\n/** The provider does not support the requested method. */\nclass UnsupportedMethodError extends ProviderRpcError {\n    constructor({ message = 'The provider does not support the requested method.', } = {}) {\n        super(4200, message);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Provider.UnsupportedMethodError'\n        });\n    }\n}\nObject.defineProperty(UnsupportedMethodError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4200\n});\n/** The provider is disconnected from all chains. */\nclass DisconnectedError extends ProviderRpcError {\n    constructor({ message = 'The provider is disconnected from all chains.', } = {}) {\n        super(4900, message);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Provider.DisconnectedError'\n        });\n    }\n}\nObject.defineProperty(DisconnectedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4900\n});\n/** The provider is not connected to the requested chain. */\nclass ChainDisconnectedError extends ProviderRpcError {\n    constructor({ message = 'The provider is not connected to the requested chain.', } = {}) {\n        super(4901, message);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Provider.ChainDisconnectedError'\n        });\n    }\n}\nObject.defineProperty(ChainDisconnectedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: 4901\n});\n/**\n * Creates an EIP-1193 flavored event emitter to be injected onto a Provider.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Provider, RpcRequest, RpcResponse } from 'ox' // [!code focus]\n *\n * // 1. Instantiate a Provider Emitter. // [!code focus]\n * const emitter = Provider.createEmitter() // [!code focus]\n *\n * const store = RpcRequest.createStore()\n *\n * const provider = Provider.from({\n *   // 2. Pass the Emitter to the Provider. // [!code focus]\n *   ...emitter, // [!code focus]\n *   async request(args) {\n *     return await fetch('https://1.rpc.thirdweb.com', {\n *       body: JSON.stringify(store.prepare(args)),\n *       method: 'POST',\n *       headers: {\n *         'Content-Type': 'application/json',\n *       },\n *     })\n *       .then((res) => res.json())\n *       .then(RpcResponse.parse)\n *   },\n * })\n *\n * // 3. Emit Provider Events. // [!code focus]\n * emitter.emit('accountsChanged', ['0x...']) // [!code focus]\n * ```\n *\n * @returns An event emitter.\n */\nfunction createEmitter() {\n    const emitter = new eventemitter3__WEBPACK_IMPORTED_MODULE_0__.EventEmitter();\n    return {\n        get eventNames() {\n            return emitter.eventNames.bind(emitter);\n        },\n        get listenerCount() {\n            return emitter.listenerCount.bind(emitter);\n        },\n        get listeners() {\n            return emitter.listeners.bind(emitter);\n        },\n        addListener: emitter.addListener.bind(emitter),\n        emit: emitter.emit.bind(emitter),\n        off: emitter.off.bind(emitter),\n        on: emitter.on.bind(emitter),\n        once: emitter.once.bind(emitter),\n        removeAllListeners: emitter.removeAllListeners.bind(emitter),\n        removeListener: emitter.removeListener.bind(emitter),\n    };\n}\n// eslint-disable-next-line jsdoc/require-jsdoc\nfunction from(provider, options = {}) {\n    const { includeEvents = true } = options;\n    if (!provider)\n        throw new IsUndefinedError();\n    return {\n        ...(includeEvents\n            ? {\n                on: provider.on?.bind(provider),\n                removeListener: provider.removeListener?.bind(provider),\n            }\n            : {}),\n        async request(args) {\n            const result = await provider.request(args);\n            if (result &&\n                typeof result === 'object' &&\n                'jsonrpc' in result)\n                return _RpcResponse_js__WEBPACK_IMPORTED_MODULE_1__.parse(result);\n            return result;\n        },\n    };\n}\n/** Thrown when the provider is undefined. */\nclass IsUndefinedError extends _Errors_js__WEBPACK_IMPORTED_MODULE_2__.BaseError {\n    constructor() {\n        super('`provider` is undefined.');\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Provider.IsUndefinedError'\n        });\n    }\n}\n//# sourceMappingURL=Provider.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvUHJvdmlkZXIuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBQTZDO0FBQ1A7QUFDVTtBQUN6QztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCxrQkFBa0IsOENBQThDLElBQUk7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCxrQkFBa0Isd0ZBQXdGLElBQUk7QUFDOUc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCxrQkFBa0IsbUVBQW1FLElBQUk7QUFDekY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCxrQkFBa0IsNkRBQTZELElBQUk7QUFDbkY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCxrQkFBa0IscUVBQXFFLElBQUk7QUFDM0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksb0NBQW9DO0FBQ2hEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixRQUFRO0FBQ1I7QUFDQTtBQUNBLE1BQU07QUFDTixJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQLHdCQUF3Qix1REFBWTtBQUNwQztBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sb0NBQW9DO0FBQzNDLFlBQVksdUJBQXVCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVCQUF1QixrREFBaUI7QUFDeEM7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ08sK0JBQStCLGlEQUFnQjtBQUN0RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvb3gvX2VzbS9jb3JlL1Byb3ZpZGVyLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0ICogYXMgRXJyb3JzIGZyb20gJy4vRXJyb3JzLmpzJztcbmltcG9ydCAqIGFzIFJwY1Jlc3BvbnNlIGZyb20gJy4vUnBjUmVzcG9uc2UuanMnO1xuZXhwb3J0IGNsYXNzIFByb3ZpZGVyUnBjRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgY29uc3RydWN0b3IoY29kZSwgbWVzc2FnZSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ1Byb3ZpZGVyUnBjRXJyb3InXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiB2b2lkIDBcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImRldGFpbHNcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jb2RlID0gY29kZTtcbiAgICAgICAgdGhpcy5kZXRhaWxzID0gbWVzc2FnZTtcbiAgICB9XG59XG4vKiogVGhlIHVzZXIgcmVqZWN0ZWQgdGhlIHJlcXVlc3QuICovXG5leHBvcnQgY2xhc3MgVXNlclJlamVjdGVkUmVxdWVzdEVycm9yIGV4dGVuZHMgUHJvdmlkZXJScGNFcnJvciB7XG4gICAgY29uc3RydWN0b3IoeyBtZXNzYWdlID0gJ1RoZSB1c2VyIHJlamVjdGVkIHRoZSByZXF1ZXN0LicsIH0gPSB7fSkge1xuICAgICAgICBzdXBlcig0MDAxLCBtZXNzYWdlKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ1Byb3ZpZGVyLlVzZXJSZWplY3RlZFJlcXVlc3RFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFVzZXJSZWplY3RlZFJlcXVlc3RFcnJvciwgXCJjb2RlXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogNDAwMVxufSk7XG4vKiogVGhlIHJlcXVlc3RlZCBtZXRob2QgYW5kL29yIGFjY291bnQgaGFzIG5vdCBiZWVuIGF1dGhvcml6ZWQgYnkgdGhlIHVzZXIuICovXG5leHBvcnQgY2xhc3MgVW5hdXRob3JpemVkRXJyb3IgZXh0ZW5kcyBQcm92aWRlclJwY0Vycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UgPSAnVGhlIHJlcXVlc3RlZCBtZXRob2QgYW5kL29yIGFjY291bnQgaGFzIG5vdCBiZWVuIGF1dGhvcml6ZWQgYnkgdGhlIHVzZXIuJywgfSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKDQxMDAsIG1lc3NhZ2UpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnUHJvdmlkZXIuVW5hdXRob3JpemVkRXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShVbmF1dGhvcml6ZWRFcnJvciwgXCJjb2RlXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogNDEwMFxufSk7XG4vKiogVGhlIHByb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBtZXRob2QuICovXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRNZXRob2RFcnJvciBleHRlbmRzIFByb3ZpZGVyUnBjRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHsgbWVzc2FnZSA9ICdUaGUgcHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIG1ldGhvZC4nLCB9ID0ge30pIHtcbiAgICAgICAgc3VwZXIoNDIwMCwgbWVzc2FnZSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdQcm92aWRlci5VbnN1cHBvcnRlZE1ldGhvZEVycm9yJ1xuICAgICAgICB9KTtcbiAgICB9XG59XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoVW5zdXBwb3J0ZWRNZXRob2RFcnJvciwgXCJjb2RlXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogNDIwMFxufSk7XG4vKiogVGhlIHByb3ZpZGVyIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIGFsbCBjaGFpbnMuICovXG5leHBvcnQgY2xhc3MgRGlzY29ubmVjdGVkRXJyb3IgZXh0ZW5kcyBQcm92aWRlclJwY0Vycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7IG1lc3NhZ2UgPSAnVGhlIHByb3ZpZGVyIGlzIGRpc2Nvbm5lY3RlZCBmcm9tIGFsbCBjaGFpbnMuJywgfSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKDQ5MDAsIG1lc3NhZ2UpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnUHJvdmlkZXIuRGlzY29ubmVjdGVkRXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShEaXNjb25uZWN0ZWRFcnJvciwgXCJjb2RlXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogNDkwMFxufSk7XG4vKiogVGhlIHByb3ZpZGVyIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIHJlcXVlc3RlZCBjaGFpbi4gKi9cbmV4cG9ydCBjbGFzcyBDaGFpbkRpc2Nvbm5lY3RlZEVycm9yIGV4dGVuZHMgUHJvdmlkZXJScGNFcnJvciB7XG4gICAgY29uc3RydWN0b3IoeyBtZXNzYWdlID0gJ1RoZSBwcm92aWRlciBpcyBub3QgY29ubmVjdGVkIHRvIHRoZSByZXF1ZXN0ZWQgY2hhaW4uJywgfSA9IHt9KSB7XG4gICAgICAgIHN1cGVyKDQ5MDEsIG1lc3NhZ2UpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnUHJvdmlkZXIuQ2hhaW5EaXNjb25uZWN0ZWRFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KENoYWluRGlzY29ubmVjdGVkRXJyb3IsIFwiY29kZVwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IDQ5MDFcbn0pO1xuLyoqXG4gKiBDcmVhdGVzIGFuIEVJUC0xMTkzIGZsYXZvcmVkIGV2ZW50IGVtaXR0ZXIgdG8gYmUgaW5qZWN0ZWQgb250byBhIFByb3ZpZGVyLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogLy8gQG5vRXJyb3JzXG4gKiBpbXBvcnQgeyBQcm92aWRlciwgUnBjUmVxdWVzdCwgUnBjUmVzcG9uc2UgfSBmcm9tICdveCcgLy8gWyFjb2RlIGZvY3VzXVxuICpcbiAqIC8vIDEuIEluc3RhbnRpYXRlIGEgUHJvdmlkZXIgRW1pdHRlci4gLy8gWyFjb2RlIGZvY3VzXVxuICogY29uc3QgZW1pdHRlciA9IFByb3ZpZGVyLmNyZWF0ZUVtaXR0ZXIoKSAvLyBbIWNvZGUgZm9jdXNdXG4gKlxuICogY29uc3Qgc3RvcmUgPSBScGNSZXF1ZXN0LmNyZWF0ZVN0b3JlKClcbiAqXG4gKiBjb25zdCBwcm92aWRlciA9IFByb3ZpZGVyLmZyb20oe1xuICogICAvLyAyLiBQYXNzIHRoZSBFbWl0dGVyIHRvIHRoZSBQcm92aWRlci4gLy8gWyFjb2RlIGZvY3VzXVxuICogICAuLi5lbWl0dGVyLCAvLyBbIWNvZGUgZm9jdXNdXG4gKiAgIGFzeW5jIHJlcXVlc3QoYXJncykge1xuICogICAgIHJldHVybiBhd2FpdCBmZXRjaCgnaHR0cHM6Ly8xLnJwYy50aGlyZHdlYi5jb20nLCB7XG4gKiAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShzdG9yZS5wcmVwYXJlKGFyZ3MpKSxcbiAqICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICogICAgICAgaGVhZGVyczoge1xuICogICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICogICAgICAgfSxcbiAqICAgICB9KVxuICogICAgICAgLnRoZW4oKHJlcykgPT4gcmVzLmpzb24oKSlcbiAqICAgICAgIC50aGVuKFJwY1Jlc3BvbnNlLnBhcnNlKVxuICogICB9LFxuICogfSlcbiAqXG4gKiAvLyAzLiBFbWl0IFByb3ZpZGVyIEV2ZW50cy4gLy8gWyFjb2RlIGZvY3VzXVxuICogZW1pdHRlci5lbWl0KCdhY2NvdW50c0NoYW5nZWQnLCBbJzB4Li4uJ10pIC8vIFshY29kZSBmb2N1c11cbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIEFuIGV2ZW50IGVtaXR0ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVFbWl0dGVyKCkge1xuICAgIGNvbnN0IGVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0IGV2ZW50TmFtZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gZW1pdHRlci5ldmVudE5hbWVzLmJpbmQoZW1pdHRlcik7XG4gICAgICAgIH0sXG4gICAgICAgIGdldCBsaXN0ZW5lckNvdW50KCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudC5iaW5kKGVtaXR0ZXIpO1xuICAgICAgICB9LFxuICAgICAgICBnZXQgbGlzdGVuZXJzKCkge1xuICAgICAgICAgICAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzLmJpbmQoZW1pdHRlcik7XG4gICAgICAgIH0sXG4gICAgICAgIGFkZExpc3RlbmVyOiBlbWl0dGVyLmFkZExpc3RlbmVyLmJpbmQoZW1pdHRlciksXG4gICAgICAgIGVtaXQ6IGVtaXR0ZXIuZW1pdC5iaW5kKGVtaXR0ZXIpLFxuICAgICAgICBvZmY6IGVtaXR0ZXIub2ZmLmJpbmQoZW1pdHRlciksXG4gICAgICAgIG9uOiBlbWl0dGVyLm9uLmJpbmQoZW1pdHRlciksXG4gICAgICAgIG9uY2U6IGVtaXR0ZXIub25jZS5iaW5kKGVtaXR0ZXIpLFxuICAgICAgICByZW1vdmVBbGxMaXN0ZW5lcnM6IGVtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzLmJpbmQoZW1pdHRlciksXG4gICAgICAgIHJlbW92ZUxpc3RlbmVyOiBlbWl0dGVyLnJlbW92ZUxpc3RlbmVyLmJpbmQoZW1pdHRlciksXG4gICAgfTtcbn1cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gZnJvbShwcm92aWRlciwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBpbmNsdWRlRXZlbnRzID0gdHJ1ZSB9ID0gb3B0aW9ucztcbiAgICBpZiAoIXByb3ZpZGVyKVxuICAgICAgICB0aHJvdyBuZXcgSXNVbmRlZmluZWRFcnJvcigpO1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLihpbmNsdWRlRXZlbnRzXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBvbjogcHJvdmlkZXIub24/LmJpbmQocHJvdmlkZXIpLFxuICAgICAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyOiBwcm92aWRlci5yZW1vdmVMaXN0ZW5lcj8uYmluZChwcm92aWRlciksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgYXN5bmMgcmVxdWVzdChhcmdzKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwcm92aWRlci5yZXF1ZXN0KGFyZ3MpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdCAmJlxuICAgICAgICAgICAgICAgIHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgICAgJ2pzb25ycGMnIGluIHJlc3VsdClcbiAgICAgICAgICAgICAgICByZXR1cm4gUnBjUmVzcG9uc2UucGFyc2UocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgfTtcbn1cbi8qKiBUaHJvd24gd2hlbiB0aGUgcHJvdmlkZXIgaXMgdW5kZWZpbmVkLiAqL1xuZXhwb3J0IGNsYXNzIElzVW5kZWZpbmVkRXJyb3IgZXh0ZW5kcyBFcnJvcnMuQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoJ2Bwcm92aWRlcmAgaXMgdW5kZWZpbmVkLicpO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnUHJvdmlkZXIuSXNVbmRlZmluZWRFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9UHJvdmlkZXIuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/Provider.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/PublicKey.js":
/*!************************************************!*\
  !*** ./node_modules/ox/_esm/core/PublicKey.js ***!
  \************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   InvalidCompressedPrefixError: () => (/* binding */ InvalidCompressedPrefixError),\n/* harmony export */   InvalidError: () => (/* binding */ InvalidError),\n/* harmony export */   InvalidPrefixError: () => (/* binding */ InvalidPrefixError),\n/* harmony export */   InvalidSerializedSizeError: () => (/* binding */ InvalidSerializedSizeError),\n/* harmony export */   InvalidUncompressedPrefixError: () => (/* binding */ InvalidUncompressedPrefixError),\n/* harmony export */   assert: () => (/* binding */ assert),\n/* harmony export */   compress: () => (/* binding */ compress),\n/* harmony export */   from: () => (/* binding */ from),\n/* harmony export */   fromBytes: () => (/* binding */ fromBytes),\n/* harmony export */   fromHex: () => (/* binding */ fromHex),\n/* harmony export */   toBytes: () => (/* binding */ toBytes),\n/* harmony export */   toHex: () => (/* binding */ toHex),\n/* harmony export */   validate: () => (/* binding */ validate)\n/* harmony export */ });\n/* harmony import */ var _Bytes_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Bytes.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Bytes.js\");\n/* harmony import */ var _Errors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Errors.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Errors.js\");\n/* harmony import */ var _Hex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Hex.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Hex.js\");\n/* harmony import */ var _Json_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Json.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Json.js\");\n\n\n\n\n/**\n * Asserts that a {@link ox#PublicKey.PublicKey} is valid.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * PublicKey.assert({\n *   prefix: 4,\n *   y: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * })\n * // @error: PublicKey.InvalidError: Value \\`{\"y\":\"1\"}\\` is not a valid public key.\n * // @error: Public key must contain:\n * // @error: - an `x` and `prefix` value (compressed)\n * // @error: - an `x`, `y`, and `prefix` value (uncompressed)\n * ```\n *\n * @param publicKey - The public key object to assert.\n */\nfunction assert(publicKey, options = {}) {\n    const { compressed } = options;\n    const { prefix, x, y } = publicKey;\n    // Uncompressed\n    if (compressed === false ||\n        (typeof x === 'bigint' && typeof y === 'bigint')) {\n        if (prefix !== 4)\n            throw new InvalidPrefixError({\n                prefix,\n                cause: new InvalidUncompressedPrefixError(),\n            });\n        return;\n    }\n    // Compressed\n    if (compressed === true ||\n        (typeof x === 'bigint' && typeof y === 'undefined')) {\n        if (prefix !== 3 && prefix !== 2)\n            throw new InvalidPrefixError({\n                prefix,\n                cause: new InvalidCompressedPrefixError(),\n            });\n        return;\n    }\n    // Unknown/invalid\n    throw new InvalidError({ publicKey });\n}\n/**\n * Compresses a {@link ox#PublicKey.PublicKey}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n *   prefix: 4,\n *   x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n *   y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n *\n * const compressed = PublicKey.compress(publicKey) // [!code focus]\n * // @log: {\n * // @log:   prefix: 3,\n * // @log:   x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: }\n * ```\n *\n * @param publicKey - The public key to compress.\n * @returns The compressed public key.\n */\nfunction compress(publicKey) {\n    const { x, y } = publicKey;\n    return {\n        prefix: y % 2n === 0n ? 2 : 3,\n        x,\n    };\n}\n/**\n * Instantiates a typed {@link ox#PublicKey.PublicKey} object from a {@link ox#PublicKey.PublicKey}, {@link ox#Bytes.Bytes}, or {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n *   prefix: 4,\n *   x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n *   y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n * // @log: {\n * // @log:   prefix: 4,\n * // @log:   x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log:   y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @example\n * ### From Serialized\n *\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from('0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5')\n * // @log: {\n * // @log:   prefix: 4,\n * // @log:   x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log:   y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @param value - The public key value to instantiate.\n * @returns The instantiated {@link ox#PublicKey.PublicKey}.\n */\nfunction from(value) {\n    const publicKey = (() => {\n        if (_Hex_js__WEBPACK_IMPORTED_MODULE_0__.validate(value))\n            return fromHex(value);\n        if (_Bytes_js__WEBPACK_IMPORTED_MODULE_1__.validate(value))\n            return fromBytes(value);\n        const { prefix, x, y } = value;\n        if (typeof x === 'bigint' && typeof y === 'bigint')\n            return { prefix: prefix ?? 0x04, x, y };\n        return { prefix, x };\n    })();\n    assert(publicKey);\n    return publicKey;\n}\n/**\n * Deserializes a {@link ox#PublicKey.PublicKey} from a {@link ox#Bytes.Bytes} value.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.fromBytes(new Uint8Array([128, 3, 131, ...]))\n * // @log: {\n * // @log:   prefix: 4,\n * // @log:   x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log:   y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @param publicKey - The serialized public key.\n * @returns The deserialized public key.\n */\nfunction fromBytes(publicKey) {\n    return fromHex(_Hex_js__WEBPACK_IMPORTED_MODULE_0__.fromBytes(publicKey));\n}\n/**\n * Deserializes a {@link ox#PublicKey.PublicKey} from a {@link ox#Hex.Hex} value.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.fromHex('0x8318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5')\n * // @log: {\n * // @log:   prefix: 4,\n * // @log:   x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log:   y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * // @log: }\n * ```\n *\n * @example\n * ### Deserializing a Compressed Public Key\n *\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.fromHex('0x038318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed75')\n * // @log: {\n * // @log:   prefix: 3,\n * // @log:   x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n * // @log: }\n * ```\n *\n * @param publicKey - The serialized public key.\n * @returns The deserialized public key.\n */\nfunction fromHex(publicKey) {\n    if (publicKey.length !== 132 &&\n        publicKey.length !== 130 &&\n        publicKey.length !== 68)\n        throw new InvalidSerializedSizeError({ publicKey });\n    if (publicKey.length === 130) {\n        const x = BigInt(_Hex_js__WEBPACK_IMPORTED_MODULE_0__.slice(publicKey, 0, 32));\n        const y = BigInt(_Hex_js__WEBPACK_IMPORTED_MODULE_0__.slice(publicKey, 32, 64));\n        return {\n            prefix: 4,\n            x,\n            y,\n        };\n    }\n    if (publicKey.length === 132) {\n        const prefix = Number(_Hex_js__WEBPACK_IMPORTED_MODULE_0__.slice(publicKey, 0, 1));\n        const x = BigInt(_Hex_js__WEBPACK_IMPORTED_MODULE_0__.slice(publicKey, 1, 33));\n        const y = BigInt(_Hex_js__WEBPACK_IMPORTED_MODULE_0__.slice(publicKey, 33, 65));\n        return {\n            prefix,\n            x,\n            y,\n        };\n    }\n    const prefix = Number(_Hex_js__WEBPACK_IMPORTED_MODULE_0__.slice(publicKey, 0, 1));\n    const x = BigInt(_Hex_js__WEBPACK_IMPORTED_MODULE_0__.slice(publicKey, 1, 33));\n    return {\n        prefix,\n        x,\n    };\n}\n/**\n * Serializes a {@link ox#PublicKey.PublicKey} to {@link ox#Bytes.Bytes}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n *   prefix: 4,\n *   x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n *   y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n *\n * const bytes = PublicKey.toBytes(publicKey) // [!code focus]\n * // @log: Uint8Array [128, 3, 131, ...]\n * ```\n *\n * @param publicKey - The public key to serialize.\n * @returns The serialized public key.\n */\nfunction toBytes(publicKey, options = {}) {\n    return _Bytes_js__WEBPACK_IMPORTED_MODULE_1__.fromHex(toHex(publicKey, options));\n}\n/**\n * Serializes a {@link ox#PublicKey.PublicKey} to {@link ox#Hex.Hex}.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const publicKey = PublicKey.from({\n *   prefix: 4,\n *   x: 59295962801117472859457908919941473389380284132224861839820747729565200149877n,\n *   y: 24099691209996290925259367678540227198235484593389470330605641003500238088869n,\n * })\n *\n * const hex = PublicKey.toHex(publicKey) // [!code focus]\n * // @log: '0x048318535b54105d4a7aae60c08fc45f9687181b4fdfc625bd1a753fa7397fed753547f11ca8696646f2f3acb08e31016afac23e630c5d11f59f61fef57b0d2aa5'\n * ```\n *\n * @param publicKey - The public key to serialize.\n * @returns The serialized public key.\n */\nfunction toHex(publicKey, options = {}) {\n    assert(publicKey);\n    const { prefix, x, y } = publicKey;\n    const { includePrefix = true } = options;\n    const publicKey_ = _Hex_js__WEBPACK_IMPORTED_MODULE_0__.concat(includePrefix ? _Hex_js__WEBPACK_IMPORTED_MODULE_0__.fromNumber(prefix, { size: 1 }) : '0x', _Hex_js__WEBPACK_IMPORTED_MODULE_0__.fromNumber(x, { size: 32 }), \n    // If the public key is not compressed, add the y coordinate.\n    typeof y === 'bigint' ? _Hex_js__WEBPACK_IMPORTED_MODULE_0__.fromNumber(y, { size: 32 }) : '0x');\n    return publicKey_;\n}\n/**\n * Validates a {@link ox#PublicKey.PublicKey}. Returns `true` if valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * const valid = PublicKey.validate({\n *   prefix: 4,\n *   y: 49782753348462494199823712700004552394425719014458918871452329774910450607807n,\n * })\n * // @log: false\n * ```\n *\n * @param publicKey - The public key object to assert.\n */\nfunction validate(publicKey, options = {}) {\n    try {\n        assert(publicKey, options);\n        return true;\n    }\n    catch (error) {\n        return false;\n    }\n}\n/**\n * Thrown when a public key is invalid.\n *\n * @example\n * ```ts twoslash\n * import { PublicKey } from 'ox'\n *\n * PublicKey.assert({ y: 1n })\n * // @error: PublicKey.InvalidError: Value `{\"y\":1n}` is not a valid public key.\n * // @error: Public key must contain:\n * // @error: - an `x` and `prefix` value (compressed)\n * // @error: - an `x`, `y`, and `prefix` value (uncompressed)\n * ```\n */\nclass InvalidError extends _Errors_js__WEBPACK_IMPORTED_MODULE_2__.BaseError {\n    constructor({ publicKey }) {\n        super(`Value \\`${_Json_js__WEBPACK_IMPORTED_MODULE_3__.stringify(publicKey)}\\` is not a valid public key.`, {\n            metaMessages: [\n                'Public key must contain:',\n                '- an `x` and `prefix` value (compressed)',\n                '- an `x`, `y`, and `prefix` value (uncompressed)',\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'PublicKey.InvalidError'\n        });\n    }\n}\n/** Thrown when a public key has an invalid prefix. */\nclass InvalidPrefixError extends _Errors_js__WEBPACK_IMPORTED_MODULE_2__.BaseError {\n    constructor({ prefix, cause }) {\n        super(`Prefix \"${prefix}\" is invalid.`, {\n            cause,\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'PublicKey.InvalidPrefixError'\n        });\n    }\n}\n/** Thrown when the public key has an invalid prefix for a compressed public key. */\nclass InvalidCompressedPrefixError extends _Errors_js__WEBPACK_IMPORTED_MODULE_2__.BaseError {\n    constructor() {\n        super('Prefix must be 2 or 3 for compressed public keys.');\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'PublicKey.InvalidCompressedPrefixError'\n        });\n    }\n}\n/** Thrown when the public key has an invalid prefix for an uncompressed public key. */\nclass InvalidUncompressedPrefixError extends _Errors_js__WEBPACK_IMPORTED_MODULE_2__.BaseError {\n    constructor() {\n        super('Prefix must be 4 for uncompressed public keys.');\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'PublicKey.InvalidUncompressedPrefixError'\n        });\n    }\n}\n/** Thrown when the public key has an invalid serialized size. */\nclass InvalidSerializedSizeError extends _Errors_js__WEBPACK_IMPORTED_MODULE_2__.BaseError {\n    constructor({ publicKey }) {\n        super(`Value \\`${publicKey}\\` is an invalid public key size.`, {\n            metaMessages: [\n                'Expected: 33 bytes (compressed + prefix), 64 bytes (uncompressed) or 65 bytes (uncompressed + prefix).',\n                `Received ${_Hex_js__WEBPACK_IMPORTED_MODULE_0__.size(_Hex_js__WEBPACK_IMPORTED_MODULE_0__.from(publicKey))} bytes.`,\n            ],\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'PublicKey.InvalidSerializedSizeError'\n        });\n    }\n}\n//# sourceMappingURL=PublicKey.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvUHVibGljS2V5LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQW9DO0FBQ0U7QUFDTjtBQUNFO0FBQ2xDO0FBQ0EsbUJBQW1CLDhCQUE4QjtBQUNqRDtBQUNBO0FBQ0E7QUFDQSxZQUFZLFlBQVk7QUFDeEI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osK0NBQStDLFFBQVE7QUFDdkQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyx1Q0FBdUM7QUFDOUMsWUFBWSxhQUFhO0FBQ3pCLFlBQVksZUFBZTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsNkJBQTZCLFdBQVc7QUFDeEM7QUFDQTtBQUNBLGlCQUFpQiw2QkFBNkI7QUFDOUM7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCQUF5Qiw4QkFBOEIsZUFBZSw2QkFBNkIsR0FBRyxxQkFBcUIsTUFBTSxpQkFBaUI7QUFDbEo7QUFDQTtBQUNBO0FBQ0EsWUFBWSxZQUFZO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksWUFBWTtBQUN4QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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Q0E7QUFDTywyQ0FBMkMsaURBQWdCO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNPLDZDQUE2QyxpREFBZ0I7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ08seUNBQXlDLGlEQUFnQjtBQUNoRSxrQkFBa0IsV0FBVztBQUM3Qix5QkFBeUIsVUFBVTtBQUNuQztBQUNBO0FBQ0EsNEJBQTRCLHlDQUFRLENBQUMseUNBQVEsY0FBYztBQUMzRDtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvUHVibGljS2V5LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEJ5dGVzIGZyb20gJy4vQnl0ZXMuanMnO1xuaW1wb3J0ICogYXMgRXJyb3JzIGZyb20gJy4vRXJyb3JzLmpzJztcbmltcG9ydCAqIGFzIEhleCBmcm9tICcuL0hleC5qcyc7XG5pbXBvcnQgKiBhcyBKc29uIGZyb20gJy4vSnNvbi5qcyc7XG4vKipcbiAqIEFzc2VydHMgdGhhdCBhIHtAbGluayBveCNQdWJsaWNLZXkuUHVibGljS2V5fSBpcyB2YWxpZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IFB1YmxpY0tleSB9IGZyb20gJ294J1xuICpcbiAqIFB1YmxpY0tleS5hc3NlcnQoe1xuICogICBwcmVmaXg6IDQsXG4gKiAgIHk6IDQ5NzgyNzUzMzQ4NDYyNDk0MTk5ODIzNzEyNzAwMDA0NTUyMzk0NDI1NzE5MDE0NDU4OTE4ODcxNDUyMzI5Nzc0OTEwNDUwNjA3ODA3bixcbiAqIH0pXG4gKiAvLyBAZXJyb3I6IFB1YmxpY0tleS5JbnZhbGlkRXJyb3I6IFZhbHVlIFxcYHtcInlcIjpcIjFcIn1cXGAgaXMgbm90IGEgdmFsaWQgcHVibGljIGtleS5cbiAqIC8vIEBlcnJvcjogUHVibGljIGtleSBtdXN0IGNvbnRhaW46XG4gKiAvLyBAZXJyb3I6IC0gYW4gYHhgIGFuZCBgcHJlZml4YCB2YWx1ZSAoY29tcHJlc3NlZClcbiAqIC8vIEBlcnJvcjogLSBhbiBgeGAsIGB5YCwgYW5kIGBwcmVmaXhgIHZhbHVlICh1bmNvbXByZXNzZWQpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHVibGljS2V5IC0gVGhlIHB1YmxpYyBrZXkgb2JqZWN0IHRvIGFzc2VydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydChwdWJsaWNLZXksIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgY29tcHJlc3NlZCB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB7IHByZWZpeCwgeCwgeSB9ID0gcHVibGljS2V5O1xuICAgIC8vIFVuY29tcHJlc3NlZFxuICAgIGlmIChjb21wcmVzc2VkID09PSBmYWxzZSB8fFxuICAgICAgICAodHlwZW9mIHggPT09ICdiaWdpbnQnICYmIHR5cGVvZiB5ID09PSAnYmlnaW50JykpIHtcbiAgICAgICAgaWYgKHByZWZpeCAhPT0gNClcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJlZml4RXJyb3Ioe1xuICAgICAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgICAgICBjYXVzZTogbmV3IEludmFsaWRVbmNvbXByZXNzZWRQcmVmaXhFcnJvcigpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQ29tcHJlc3NlZFxuICAgIGlmIChjb21wcmVzc2VkID09PSB0cnVlIHx8XG4gICAgICAgICh0eXBlb2YgeCA9PT0gJ2JpZ2ludCcgJiYgdHlwZW9mIHkgPT09ICd1bmRlZmluZWQnKSkge1xuICAgICAgICBpZiAocHJlZml4ICE9PSAzICYmIHByZWZpeCAhPT0gMilcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJlZml4RXJyb3Ioe1xuICAgICAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgICAgICBjYXVzZTogbmV3IEludmFsaWRDb21wcmVzc2VkUHJlZml4RXJyb3IoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFVua25vd24vaW52YWxpZFxuICAgIHRocm93IG5ldyBJbnZhbGlkRXJyb3IoeyBwdWJsaWNLZXkgfSk7XG59XG4vKipcbiAqIENvbXByZXNzZXMgYSB7QGxpbmsgb3gjUHVibGljS2V5LlB1YmxpY0tleX0uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICdveCdcbiAqXG4gKiBjb25zdCBwdWJsaWNLZXkgPSBQdWJsaWNLZXkuZnJvbSh7XG4gKiAgIHByZWZpeDogNCxcbiAqICAgeDogNTkyOTU5NjI4MDExMTc0NzI4NTk0NTc5MDg5MTk5NDE0NzMzODkzODAyODQxMzIyMjQ4NjE4Mzk4MjA3NDc3Mjk1NjUyMDAxNDk4NzduLFxuICogICB5OiAyNDA5OTY5MTIwOTk5NjI5MDkyNTI1OTM2NzY3ODU0MDIyNzE5ODIzNTQ4NDU5MzM4OTQ3MDMzMDYwNTY0MTAwMzUwMDIzODA4ODg2OW4sXG4gKiB9KVxuICpcbiAqIGNvbnN0IGNvbXByZXNzZWQgPSBQdWJsaWNLZXkuY29tcHJlc3MocHVibGljS2V5KSAvLyBbIWNvZGUgZm9jdXNdXG4gKiAvLyBAbG9nOiB7XG4gKiAvLyBAbG9nOiAgIHByZWZpeDogMyxcbiAqIC8vIEBsb2c6ICAgeDogNTkyOTU5NjI4MDExMTc0NzI4NTk0NTc5MDg5MTk5NDE0NzMzODkzODAyODQxMzIyMjQ4NjE4Mzk4MjA3NDc3Mjk1NjUyMDAxNDk4NzduLFxuICogLy8gQGxvZzogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHB1YmxpY0tleSAtIFRoZSBwdWJsaWMga2V5IHRvIGNvbXByZXNzLlxuICogQHJldHVybnMgVGhlIGNvbXByZXNzZWQgcHVibGljIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXByZXNzKHB1YmxpY0tleSkge1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gcHVibGljS2V5O1xuICAgIHJldHVybiB7XG4gICAgICAgIHByZWZpeDogeSAlIDJuID09PSAwbiA/IDIgOiAzLFxuICAgICAgICB4LFxuICAgIH07XG59XG4vKipcbiAqIEluc3RhbnRpYXRlcyBhIHR5cGVkIHtAbGluayBveCNQdWJsaWNLZXkuUHVibGljS2V5fSBvYmplY3QgZnJvbSBhIHtAbGluayBveCNQdWJsaWNLZXkuUHVibGljS2V5fSwge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSwgb3Ige0BsaW5rIG94I0hleC5IZXh9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgUHVibGljS2V5IH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgcHVibGljS2V5ID0gUHVibGljS2V5LmZyb20oe1xuICogICBwcmVmaXg6IDQsXG4gKiAgIHg6IDU5Mjk1OTYyODAxMTE3NDcyODU5NDU3OTA4OTE5OTQxNDczMzg5MzgwMjg0MTMyMjI0ODYxODM5ODIwNzQ3NzI5NTY1MjAwMTQ5ODc3bixcbiAqICAgeTogMjQwOTk2OTEyMDk5OTYyOTA5MjUyNTkzNjc2Nzg1NDAyMjcxOTgyMzU0ODQ1OTMzODk0NzAzMzA2MDU2NDEwMDM1MDAyMzgwODg4NjluLFxuICogfSlcbiAqIC8vIEBsb2c6IHtcbiAqIC8vIEBsb2c6ICAgcHJlZml4OiA0LFxuICogLy8gQGxvZzogICB4OiA1OTI5NTk2MjgwMTExNzQ3Mjg1OTQ1NzkwODkxOTk0MTQ3MzM4OTM4MDI4NDEzMjIyNDg2MTgzOTgyMDc0NzcyOTU2NTIwMDE0OTg3N24sXG4gKiAvLyBAbG9nOiAgIHk6IDI0MDk5NjkxMjA5OTk2MjkwOTI1MjU5MzY3Njc4NTQwMjI3MTk4MjM1NDg0NTkzMzg5NDcwMzMwNjA1NjQxMDAzNTAwMjM4MDg4ODY5bixcbiAqIC8vIEBsb2c6IH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiAjIyMgRnJvbSBTZXJpYWxpemVkXG4gKlxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IFB1YmxpY0tleSB9IGZyb20gJ294J1xuICpcbiAqIGNvbnN0IHB1YmxpY0tleSA9IFB1YmxpY0tleS5mcm9tKCcweDA0ODMxODUzNWI1NDEwNWQ0YTdhYWU2MGMwOGZjNDVmOTY4NzE4MWI0ZmRmYzYyNWJkMWE3NTNmYTczOTdmZWQ3NTM1NDdmMTFjYTg2OTY2NDZmMmYzYWNiMDhlMzEwMTZhZmFjMjNlNjMwYzVkMTFmNTlmNjFmZWY1N2IwZDJhYTUnKVxuICogLy8gQGxvZzoge1xuICogLy8gQGxvZzogICBwcmVmaXg6IDQsXG4gKiAvLyBAbG9nOiAgIHg6IDU5Mjk1OTYyODAxMTE3NDcyODU5NDU3OTA4OTE5OTQxNDczMzg5MzgwMjg0MTMyMjI0ODYxODM5ODIwNzQ3NzI5NTY1MjAwMTQ5ODc3bixcbiAqIC8vIEBsb2c6ICAgeTogMjQwOTk2OTEyMDk5OTYyOTA5MjUyNTkzNjc2Nzg1NDAyMjcxOTgyMzU0ODQ1OTMzODk0NzAzMzA2MDU2NDEwMDM1MDAyMzgwODg4NjluLFxuICogLy8gQGxvZzogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHB1YmxpYyBrZXkgdmFsdWUgdG8gaW5zdGFudGlhdGUuXG4gKiBAcmV0dXJucyBUaGUgaW5zdGFudGlhdGVkIHtAbGluayBveCNQdWJsaWNLZXkuUHVibGljS2V5fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb20odmFsdWUpIHtcbiAgICBjb25zdCBwdWJsaWNLZXkgPSAoKCkgPT4ge1xuICAgICAgICBpZiAoSGV4LnZhbGlkYXRlKHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBmcm9tSGV4KHZhbHVlKTtcbiAgICAgICAgaWYgKEJ5dGVzLnZhbGlkYXRlKHZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBmcm9tQnl0ZXModmFsdWUpO1xuICAgICAgICBjb25zdCB7IHByZWZpeCwgeCwgeSB9ID0gdmFsdWU7XG4gICAgICAgIGlmICh0eXBlb2YgeCA9PT0gJ2JpZ2ludCcgJiYgdHlwZW9mIHkgPT09ICdiaWdpbnQnKVxuICAgICAgICAgICAgcmV0dXJuIHsgcHJlZml4OiBwcmVmaXggPz8gMHgwNCwgeCwgeSB9O1xuICAgICAgICByZXR1cm4geyBwcmVmaXgsIHggfTtcbiAgICB9KSgpO1xuICAgIGFzc2VydChwdWJsaWNLZXkpO1xuICAgIHJldHVybiBwdWJsaWNLZXk7XG59XG4vKipcbiAqIERlc2VyaWFsaXplcyBhIHtAbGluayBveCNQdWJsaWNLZXkuUHVibGljS2V5fSBmcm9tIGEge0BsaW5rIG94I0J5dGVzLkJ5dGVzfSB2YWx1ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIC8vIEBub0Vycm9yc1xuICogaW1wb3J0IHsgUHVibGljS2V5IH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgcHVibGljS2V5ID0gUHVibGljS2V5LmZyb21CeXRlcyhuZXcgVWludDhBcnJheShbMTI4LCAzLCAxMzEsIC4uLl0pKVxuICogLy8gQGxvZzoge1xuICogLy8gQGxvZzogICBwcmVmaXg6IDQsXG4gKiAvLyBAbG9nOiAgIHg6IDU5Mjk1OTYyODAxMTE3NDcyODU5NDU3OTA4OTE5OTQxNDczMzg5MzgwMjg0MTMyMjI0ODYxODM5ODIwNzQ3NzI5NTY1MjAwMTQ5ODc3bixcbiAqIC8vIEBsb2c6ICAgeTogMjQwOTk2OTEyMDk5OTYyOTA5MjUyNTkzNjc2Nzg1NDAyMjcxOTgyMzU0ODQ1OTMzODk0NzAzMzA2MDU2NDEwMDM1MDAyMzgwODg4NjluLFxuICogLy8gQGxvZzogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHB1YmxpY0tleSAtIFRoZSBzZXJpYWxpemVkIHB1YmxpYyBrZXkuXG4gKiBAcmV0dXJucyBUaGUgZGVzZXJpYWxpemVkIHB1YmxpYyBrZXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tQnl0ZXMocHVibGljS2V5KSB7XG4gICAgcmV0dXJuIGZyb21IZXgoSGV4LmZyb21CeXRlcyhwdWJsaWNLZXkpKTtcbn1cbi8qKlxuICogRGVzZXJpYWxpemVzIGEge0BsaW5rIG94I1B1YmxpY0tleS5QdWJsaWNLZXl9IGZyb20gYSB7QGxpbmsgb3gjSGV4LkhleH0gdmFsdWUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICdveCdcbiAqXG4gKiBjb25zdCBwdWJsaWNLZXkgPSBQdWJsaWNLZXkuZnJvbUhleCgnMHg4MzE4NTM1YjU0MTA1ZDRhN2FhZTYwYzA4ZmM0NWY5Njg3MTgxYjRmZGZjNjI1YmQxYTc1M2ZhNzM5N2ZlZDc1MzU0N2YxMWNhODY5NjY0NmYyZjNhY2IwOGUzMTAxNmFmYWMyM2U2MzBjNWQxMWY1OWY2MWZlZjU3YjBkMmFhNScpXG4gKiAvLyBAbG9nOiB7XG4gKiAvLyBAbG9nOiAgIHByZWZpeDogNCxcbiAqIC8vIEBsb2c6ICAgeDogNTkyOTU5NjI4MDExMTc0NzI4NTk0NTc5MDg5MTk5NDE0NzMzODkzODAyODQxMzIyMjQ4NjE4Mzk4MjA3NDc3Mjk1NjUyMDAxNDk4NzduLFxuICogLy8gQGxvZzogICB5OiAyNDA5OTY5MTIwOTk5NjI5MDkyNTI1OTM2NzY3ODU0MDIyNzE5ODIzNTQ4NDU5MzM4OTQ3MDMzMDYwNTY0MTAwMzUwMDIzODA4ODg2OW4sXG4gKiAvLyBAbG9nOiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogIyMjIERlc2VyaWFsaXppbmcgYSBDb21wcmVzc2VkIFB1YmxpYyBLZXlcbiAqXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgUHVibGljS2V5IH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgcHVibGljS2V5ID0gUHVibGljS2V5LmZyb21IZXgoJzB4MDM4MzE4NTM1YjU0MTA1ZDRhN2FhZTYwYzA4ZmM0NWY5Njg3MTgxYjRmZGZjNjI1YmQxYTc1M2ZhNzM5N2ZlZDc1JylcbiAqIC8vIEBsb2c6IHtcbiAqIC8vIEBsb2c6ICAgcHJlZml4OiAzLFxuICogLy8gQGxvZzogICB4OiA1OTI5NTk2MjgwMTExNzQ3Mjg1OTQ1NzkwODkxOTk0MTQ3MzM4OTM4MDI4NDEzMjIyNDg2MTgzOTgyMDc0NzcyOTU2NTIwMDE0OTg3N24sXG4gKiAvLyBAbG9nOiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHVibGljS2V5IC0gVGhlIHNlcmlhbGl6ZWQgcHVibGljIGtleS5cbiAqIEByZXR1cm5zIFRoZSBkZXNlcmlhbGl6ZWQgcHVibGljIGtleS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb21IZXgocHVibGljS2V5KSB7XG4gICAgaWYgKHB1YmxpY0tleS5sZW5ndGggIT09IDEzMiAmJlxuICAgICAgICBwdWJsaWNLZXkubGVuZ3RoICE9PSAxMzAgJiZcbiAgICAgICAgcHVibGljS2V5Lmxlbmd0aCAhPT0gNjgpXG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkU2VyaWFsaXplZFNpemVFcnJvcih7IHB1YmxpY0tleSB9KTtcbiAgICBpZiAocHVibGljS2V5Lmxlbmd0aCA9PT0gMTMwKSB7XG4gICAgICAgIGNvbnN0IHggPSBCaWdJbnQoSGV4LnNsaWNlKHB1YmxpY0tleSwgMCwgMzIpKTtcbiAgICAgICAgY29uc3QgeSA9IEJpZ0ludChIZXguc2xpY2UocHVibGljS2V5LCAzMiwgNjQpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByZWZpeDogNCxcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBpZiAocHVibGljS2V5Lmxlbmd0aCA9PT0gMTMyKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IE51bWJlcihIZXguc2xpY2UocHVibGljS2V5LCAwLCAxKSk7XG4gICAgICAgIGNvbnN0IHggPSBCaWdJbnQoSGV4LnNsaWNlKHB1YmxpY0tleSwgMSwgMzMpKTtcbiAgICAgICAgY29uc3QgeSA9IEJpZ0ludChIZXguc2xpY2UocHVibGljS2V5LCAzMywgNjUpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByZWZpeCxcbiAgICAgICAgICAgIHgsXG4gICAgICAgICAgICB5LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBwcmVmaXggPSBOdW1iZXIoSGV4LnNsaWNlKHB1YmxpY0tleSwgMCwgMSkpO1xuICAgIGNvbnN0IHggPSBCaWdJbnQoSGV4LnNsaWNlKHB1YmxpY0tleSwgMSwgMzMpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBwcmVmaXgsXG4gICAgICAgIHgsXG4gICAgfTtcbn1cbi8qKlxuICogU2VyaWFsaXplcyBhIHtAbGluayBveCNQdWJsaWNLZXkuUHVibGljS2V5fSB0byB7QGxpbmsgb3gjQnl0ZXMuQnl0ZXN9LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgUHVibGljS2V5IH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3QgcHVibGljS2V5ID0gUHVibGljS2V5LmZyb20oe1xuICogICBwcmVmaXg6IDQsXG4gKiAgIHg6IDU5Mjk1OTYyODAxMTE3NDcyODU5NDU3OTA4OTE5OTQxNDczMzg5MzgwMjg0MTMyMjI0ODYxODM5ODIwNzQ3NzI5NTY1MjAwMTQ5ODc3bixcbiAqICAgeTogMjQwOTk2OTEyMDk5OTYyOTA5MjUyNTkzNjc2Nzg1NDAyMjcxOTgyMzU0ODQ1OTMzODk0NzAzMzA2MDU2NDEwMDM1MDAyMzgwODg4NjluLFxuICogfSlcbiAqXG4gKiBjb25zdCBieXRlcyA9IFB1YmxpY0tleS50b0J5dGVzKHB1YmxpY0tleSkgLy8gWyFjb2RlIGZvY3VzXVxuICogLy8gQGxvZzogVWludDhBcnJheSBbMTI4LCAzLCAxMzEsIC4uLl1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwdWJsaWNLZXkgLSBUaGUgcHVibGljIGtleSB0byBzZXJpYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgc2VyaWFsaXplZCBwdWJsaWMga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9CeXRlcyhwdWJsaWNLZXksIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBCeXRlcy5mcm9tSGV4KHRvSGV4KHB1YmxpY0tleSwgb3B0aW9ucykpO1xufVxuLyoqXG4gKiBTZXJpYWxpemVzIGEge0BsaW5rIG94I1B1YmxpY0tleS5QdWJsaWNLZXl9IHRvIHtAbGluayBveCNIZXguSGV4fS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IFB1YmxpY0tleSB9IGZyb20gJ294J1xuICpcbiAqIGNvbnN0IHB1YmxpY0tleSA9IFB1YmxpY0tleS5mcm9tKHtcbiAqICAgcHJlZml4OiA0LFxuICogICB4OiA1OTI5NTk2MjgwMTExNzQ3Mjg1OTQ1NzkwODkxOTk0MTQ3MzM4OTM4MDI4NDEzMjIyNDg2MTgzOTgyMDc0NzcyOTU2NTIwMDE0OTg3N24sXG4gKiAgIHk6IDI0MDk5NjkxMjA5OTk2MjkwOTI1MjU5MzY3Njc4NTQwMjI3MTk4MjM1NDg0NTkzMzg5NDcwMzMwNjA1NjQxMDAzNTAwMjM4MDg4ODY5bixcbiAqIH0pXG4gKlxuICogY29uc3QgaGV4ID0gUHVibGljS2V5LnRvSGV4KHB1YmxpY0tleSkgLy8gWyFjb2RlIGZvY3VzXVxuICogLy8gQGxvZzogJzB4MDQ4MzE4NTM1YjU0MTA1ZDRhN2FhZTYwYzA4ZmM0NWY5Njg3MTgxYjRmZGZjNjI1YmQxYTc1M2ZhNzM5N2ZlZDc1MzU0N2YxMWNhODY5NjY0NmYyZjNhY2IwOGUzMTAxNmFmYWMyM2U2MzBjNWQxMWY1OWY2MWZlZjU3YjBkMmFhNSdcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwdWJsaWNLZXkgLSBUaGUgcHVibGljIGtleSB0byBzZXJpYWxpemUuXG4gKiBAcmV0dXJucyBUaGUgc2VyaWFsaXplZCBwdWJsaWMga2V5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9IZXgocHVibGljS2V5LCBvcHRpb25zID0ge30pIHtcbiAgICBhc3NlcnQocHVibGljS2V5KTtcbiAgICBjb25zdCB7IHByZWZpeCwgeCwgeSB9ID0gcHVibGljS2V5O1xuICAgIGNvbnN0IHsgaW5jbHVkZVByZWZpeCA9IHRydWUgfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgcHVibGljS2V5XyA9IEhleC5jb25jYXQoaW5jbHVkZVByZWZpeCA/IEhleC5mcm9tTnVtYmVyKHByZWZpeCwgeyBzaXplOiAxIH0pIDogJzB4JywgSGV4LmZyb21OdW1iZXIoeCwgeyBzaXplOiAzMiB9KSwgXG4gICAgLy8gSWYgdGhlIHB1YmxpYyBrZXkgaXMgbm90IGNvbXByZXNzZWQsIGFkZCB0aGUgeSBjb29yZGluYXRlLlxuICAgIHR5cGVvZiB5ID09PSAnYmlnaW50JyA/IEhleC5mcm9tTnVtYmVyKHksIHsgc2l6ZTogMzIgfSkgOiAnMHgnKTtcbiAgICByZXR1cm4gcHVibGljS2V5Xztcbn1cbi8qKlxuICogVmFsaWRhdGVzIGEge0BsaW5rIG94I1B1YmxpY0tleS5QdWJsaWNLZXl9LiBSZXR1cm5zIGB0cnVlYCBpZiB2YWxpZCwgYGZhbHNlYCBvdGhlcndpc2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICdveCdcbiAqXG4gKiBjb25zdCB2YWxpZCA9IFB1YmxpY0tleS52YWxpZGF0ZSh7XG4gKiAgIHByZWZpeDogNCxcbiAqICAgeTogNDk3ODI3NTMzNDg0NjI0OTQxOTk4MjM3MTI3MDAwMDQ1NTIzOTQ0MjU3MTkwMTQ0NTg5MTg4NzE0NTIzMjk3NzQ5MTA0NTA2MDc4MDduLFxuICogfSlcbiAqIC8vIEBsb2c6IGZhbHNlXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcHVibGljS2V5IC0gVGhlIHB1YmxpYyBrZXkgb2JqZWN0IHRvIGFzc2VydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlKHB1YmxpY0tleSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdHJ5IHtcbiAgICAgICAgYXNzZXJ0KHB1YmxpY0tleSwgb3B0aW9ucyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cbi8qKlxuICogVGhyb3duIHdoZW4gYSBwdWJsaWMga2V5IGlzIGludmFsaWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBQdWJsaWNLZXkgfSBmcm9tICdveCdcbiAqXG4gKiBQdWJsaWNLZXkuYXNzZXJ0KHsgeTogMW4gfSlcbiAqIC8vIEBlcnJvcjogUHVibGljS2V5LkludmFsaWRFcnJvcjogVmFsdWUgYHtcInlcIjoxbn1gIGlzIG5vdCBhIHZhbGlkIHB1YmxpYyBrZXkuXG4gKiAvLyBAZXJyb3I6IFB1YmxpYyBrZXkgbXVzdCBjb250YWluOlxuICogLy8gQGVycm9yOiAtIGFuIGB4YCBhbmQgYHByZWZpeGAgdmFsdWUgKGNvbXByZXNzZWQpXG4gKiAvLyBAZXJyb3I6IC0gYW4gYHhgLCBgeWAsIGFuZCBgcHJlZml4YCB2YWx1ZSAodW5jb21wcmVzc2VkKVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkRXJyb3IgZXh0ZW5kcyBFcnJvcnMuQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7IHB1YmxpY0tleSB9KSB7XG4gICAgICAgIHN1cGVyKGBWYWx1ZSBcXGAke0pzb24uc3RyaW5naWZ5KHB1YmxpY0tleSl9XFxgIGlzIG5vdCBhIHZhbGlkIHB1YmxpYyBrZXkuYCwge1xuICAgICAgICAgICAgbWV0YU1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAgJ1B1YmxpYyBrZXkgbXVzdCBjb250YWluOicsXG4gICAgICAgICAgICAgICAgJy0gYW4gYHhgIGFuZCBgcHJlZml4YCB2YWx1ZSAoY29tcHJlc3NlZCknLFxuICAgICAgICAgICAgICAgICctIGFuIGB4YCwgYHlgLCBhbmQgYHByZWZpeGAgdmFsdWUgKHVuY29tcHJlc3NlZCknLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdQdWJsaWNLZXkuSW52YWxpZEVycm9yJ1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKiogVGhyb3duIHdoZW4gYSBwdWJsaWMga2V5IGhhcyBhbiBpbnZhbGlkIHByZWZpeC4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkUHJlZml4RXJyb3IgZXh0ZW5kcyBFcnJvcnMuQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3Rvcih7IHByZWZpeCwgY2F1c2UgfSkge1xuICAgICAgICBzdXBlcihgUHJlZml4IFwiJHtwcmVmaXh9XCIgaXMgaW52YWxpZC5gLCB7XG4gICAgICAgICAgICBjYXVzZSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdQdWJsaWNLZXkuSW52YWxpZFByZWZpeEVycm9yJ1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKiogVGhyb3duIHdoZW4gdGhlIHB1YmxpYyBrZXkgaGFzIGFuIGludmFsaWQgcHJlZml4IGZvciBhIGNvbXByZXNzZWQgcHVibGljIGtleS4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkQ29tcHJlc3NlZFByZWZpeEVycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdQcmVmaXggbXVzdCBiZSAyIG9yIDMgZm9yIGNvbXByZXNzZWQgcHVibGljIGtleXMuJyk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdQdWJsaWNLZXkuSW52YWxpZENvbXByZXNzZWRQcmVmaXhFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqIFRocm93biB3aGVuIHRoZSBwdWJsaWMga2V5IGhhcyBhbiBpbnZhbGlkIHByZWZpeCBmb3IgYW4gdW5jb21wcmVzc2VkIHB1YmxpYyBrZXkuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZFVuY29tcHJlc3NlZFByZWZpeEVycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCdQcmVmaXggbXVzdCBiZSA0IGZvciB1bmNvbXByZXNzZWQgcHVibGljIGtleXMuJyk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdQdWJsaWNLZXkuSW52YWxpZFVuY29tcHJlc3NlZFByZWZpeEVycm9yJ1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vKiogVGhyb3duIHdoZW4gdGhlIHB1YmxpYyBrZXkgaGFzIGFuIGludmFsaWQgc2VyaWFsaXplZCBzaXplLiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRTZXJpYWxpemVkU2l6ZUVycm9yIGV4dGVuZHMgRXJyb3JzLkJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IoeyBwdWJsaWNLZXkgfSkge1xuICAgICAgICBzdXBlcihgVmFsdWUgXFxgJHtwdWJsaWNLZXl9XFxgIGlzIGFuIGludmFsaWQgcHVibGljIGtleSBzaXplLmAsIHtcbiAgICAgICAgICAgIG1ldGFNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgICdFeHBlY3RlZDogMzMgYnl0ZXMgKGNvbXByZXNzZWQgKyBwcmVmaXgpLCA2NCBieXRlcyAodW5jb21wcmVzc2VkKSBvciA2NSBieXRlcyAodW5jb21wcmVzc2VkICsgcHJlZml4KS4nLFxuICAgICAgICAgICAgICAgIGBSZWNlaXZlZCAke0hleC5zaXplKEhleC5mcm9tKHB1YmxpY0tleSkpfSBieXRlcy5gLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdQdWJsaWNLZXkuSW52YWxpZFNlcmlhbGl6ZWRTaXplRXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVB1YmxpY0tleS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/PublicKey.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/RpcRequest.js":
/*!*************************************************!*\
  !*** ./node_modules/ox/_esm/core/RpcRequest.js ***!
  \*************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   createStore: () => (/* binding */ createStore),\n/* harmony export */   from: () => (/* binding */ from)\n/* harmony export */ });\n/**\n * Creates a JSON-RPC request store to build requests with an incrementing `id`.\n *\n * Returns a type-safe `prepare` function to build a JSON-RPC request object as per the [JSON-RPC 2.0 specification](https://www.jsonrpc.org/specification#request_object).\n *\n * @example\n * ```ts twoslash\n * import { RpcRequest } from 'ox'\n *\n * const store = RpcRequest.createStore()\n *\n * const request_1 = store.prepare({\n *   method: 'eth_blockNumber',\n * })\n * // @log: { id: 0, jsonrpc: '2.0', method: 'eth_blockNumber' }\n *\n * const request_2 = store.prepare({\n *   method: 'eth_call',\n *   params: [\n *     {\n *       to: '0x0000000000000000000000000000000000000000',\n *       data: '0xdeadbeef',\n *     },\n *   ],\n * })\n * // @log: { id: 1, jsonrpc: '2.0', method: 'eth_call', params: [{ to: '0x0000000000000000000000000000000000000000', data: '0xdeadbeef' }] }\n * ```\n *\n * @example\n * ### Type-safe Custom Schemas\n *\n * It is possible to define your own type-safe schema by using the {@link ox#RpcSchema.From} type.\n *\n * ```ts twoslash\n * import { RpcSchema, RpcRequest } from 'ox'\n *\n * type Schema = RpcSchema.From<{ // [!code focus]\n *   Request: { // [!code focus]\n *     method: 'eth_foobar' // [!code focus]\n *     params: [number] // [!code focus]\n *   } // [!code focus]\n *   ReturnType: string // [!code focus]\n * } | { // [!code focus]\n *   Request: { // [!code focus]\n *     method: 'eth_foobaz' // [!code focus]\n *     params: [string] // [!code focus]\n *   } // [!code focus]\n *   ReturnType: string // [!code focus]\n * }> // [!code focus]\n *\n * const store = RpcRequest.createStore<Schema>() // [!code focus]\n *\n * const request = store.prepare({\n *   method: 'eth_foobar', // [!code focus]\n *   // ^?\n *   params: [42],\n * })\n * ```\n *\n * @param options - Request store options.\n * @returns The request store\n */\nfunction createStore(options = {}) {\n    let id = options.id ?? 0;\n    return {\n        prepare(options) {\n            return from({\n                id: id++,\n                ...options,\n            });\n        },\n        get id() {\n            return id;\n        },\n    };\n}\n/**\n * A type-safe interface to build a JSON-RPC request object as per the [JSON-RPC 2.0 specification](https://www.jsonrpc.org/specification#request_object).\n *\n * :::warning\n *\n * You will likely want to use {@link ox#RpcRequest.(createStore:function)} instead as it will also manage `id`s and uses this function internally.\n *\n * :::\n *\n * @example\n * ```ts twoslash\n * import { RpcRequest, RpcResponse } from 'ox'\n *\n * // 1. Build a request object.\n * const request = RpcRequest.from({ // [!code focus]\n *   id: 0, // [!code focus]\n *   method: 'eth_estimateGas', // [!code focus]\n *   params: [ // [!code focus]\n *     { // [!code focus]\n *       from: '0xd2135CfB216b74109775236E36d4b433F1DF507B', // [!code focus]\n *       to: '0x0D44f617435088c947F00B31160f64b074e412B4', // [!code focus]\n *       value: '0x69420', // [!code focus]\n *     }, // [!code focus]\n *   ], // [!code focus]\n * }) // [!code focus]\n *\n * // 2. Send the JSON-RPC request via HTTP.\n * const gas = await fetch('https://1.rpc.thirdweb.com', {\n *   body: JSON.stringify(request),\n *   headers: {\n *     'Content-Type': 'application/json',\n *   },\n *   method: 'POST',\n * })\n *  .then((response) => response.json())\n *  // 3. Parse the JSON-RPC response into a type-safe result.\n *  .then((response) => RpcResponse.parse(response, { request }))\n * ```\n *\n * @param options - JSON-RPC request options.\n * @returns The fully-formed JSON-RPC request object.\n */\nfunction from(options) {\n    return {\n        ...options,\n        jsonrpc: '2.0',\n    };\n}\n//# sourceMappingURL=RpcRequest.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvUnBjUmVxdWVzdC5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxhQUFhO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0osY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsSUFBSTtBQUNKLGNBQWMsc0RBQXNELHNFQUFzRTtBQUMxSTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0VBQW9FLHlCQUF5QjtBQUM3RjtBQUNBO0FBQ0EsWUFBWSx3QkFBd0I7QUFDcEM7QUFDQSxrQ0FBa0M7QUFDbEMsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxLQUFLLElBQUk7QUFDVCxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08saUNBQWlDO0FBQ3hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYixTQUFTO0FBQ1Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyw0Q0FBNEM7QUFDNUU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksMEJBQTBCO0FBQ3RDO0FBQ0E7QUFDQSxxQ0FBcUM7QUFDckM7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBLHNEQUFzRCxTQUFTO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvUnBjUmVxdWVzdC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENyZWF0ZXMgYSBKU09OLVJQQyByZXF1ZXN0IHN0b3JlIHRvIGJ1aWxkIHJlcXVlc3RzIHdpdGggYW4gaW5jcmVtZW50aW5nIGBpZGAuXG4gKlxuICogUmV0dXJucyBhIHR5cGUtc2FmZSBgcHJlcGFyZWAgZnVuY3Rpb24gdG8gYnVpbGQgYSBKU09OLVJQQyByZXF1ZXN0IG9iamVjdCBhcyBwZXIgdGhlIFtKU09OLVJQQyAyLjAgc3BlY2lmaWNhdGlvbl0oaHR0cHM6Ly93d3cuanNvbnJwYy5vcmcvc3BlY2lmaWNhdGlvbiNyZXF1ZXN0X29iamVjdCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBScGNSZXF1ZXN0IH0gZnJvbSAnb3gnXG4gKlxuICogY29uc3Qgc3RvcmUgPSBScGNSZXF1ZXN0LmNyZWF0ZVN0b3JlKClcbiAqXG4gKiBjb25zdCByZXF1ZXN0XzEgPSBzdG9yZS5wcmVwYXJlKHtcbiAqICAgbWV0aG9kOiAnZXRoX2Jsb2NrTnVtYmVyJyxcbiAqIH0pXG4gKiAvLyBAbG9nOiB7IGlkOiAwLCBqc29ucnBjOiAnMi4wJywgbWV0aG9kOiAnZXRoX2Jsb2NrTnVtYmVyJyB9XG4gKlxuICogY29uc3QgcmVxdWVzdF8yID0gc3RvcmUucHJlcGFyZSh7XG4gKiAgIG1ldGhvZDogJ2V0aF9jYWxsJyxcbiAqICAgcGFyYW1zOiBbXG4gKiAgICAge1xuICogICAgICAgdG86ICcweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLFxuICogICAgICAgZGF0YTogJzB4ZGVhZGJlZWYnLFxuICogICAgIH0sXG4gKiAgIF0sXG4gKiB9KVxuICogLy8gQGxvZzogeyBpZDogMSwganNvbnJwYzogJzIuMCcsIG1ldGhvZDogJ2V0aF9jYWxsJywgcGFyYW1zOiBbeyB0bzogJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIGRhdGE6ICcweGRlYWRiZWVmJyB9XSB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogIyMjIFR5cGUtc2FmZSBDdXN0b20gU2NoZW1hc1xuICpcbiAqIEl0IGlzIHBvc3NpYmxlIHRvIGRlZmluZSB5b3VyIG93biB0eXBlLXNhZmUgc2NoZW1hIGJ5IHVzaW5nIHRoZSB7QGxpbmsgb3gjUnBjU2NoZW1hLkZyb219IHR5cGUuXG4gKlxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IFJwY1NjaGVtYSwgUnBjUmVxdWVzdCB9IGZyb20gJ294J1xuICpcbiAqIHR5cGUgU2NoZW1hID0gUnBjU2NoZW1hLkZyb208eyAvLyBbIWNvZGUgZm9jdXNdXG4gKiAgIFJlcXVlc3Q6IHsgLy8gWyFjb2RlIGZvY3VzXVxuICogICAgIG1ldGhvZDogJ2V0aF9mb29iYXInIC8vIFshY29kZSBmb2N1c11cbiAqICAgICBwYXJhbXM6IFtudW1iZXJdIC8vIFshY29kZSBmb2N1c11cbiAqICAgfSAvLyBbIWNvZGUgZm9jdXNdXG4gKiAgIFJldHVyblR5cGU6IHN0cmluZyAvLyBbIWNvZGUgZm9jdXNdXG4gKiB9IHwgeyAvLyBbIWNvZGUgZm9jdXNdXG4gKiAgIFJlcXVlc3Q6IHsgLy8gWyFjb2RlIGZvY3VzXVxuICogICAgIG1ldGhvZDogJ2V0aF9mb29iYXonIC8vIFshY29kZSBmb2N1c11cbiAqICAgICBwYXJhbXM6IFtzdHJpbmddIC8vIFshY29kZSBmb2N1c11cbiAqICAgfSAvLyBbIWNvZGUgZm9jdXNdXG4gKiAgIFJldHVyblR5cGU6IHN0cmluZyAvLyBbIWNvZGUgZm9jdXNdXG4gKiB9PiAvLyBbIWNvZGUgZm9jdXNdXG4gKlxuICogY29uc3Qgc3RvcmUgPSBScGNSZXF1ZXN0LmNyZWF0ZVN0b3JlPFNjaGVtYT4oKSAvLyBbIWNvZGUgZm9jdXNdXG4gKlxuICogY29uc3QgcmVxdWVzdCA9IHN0b3JlLnByZXBhcmUoe1xuICogICBtZXRob2Q6ICdldGhfZm9vYmFyJywgLy8gWyFjb2RlIGZvY3VzXVxuICogICAvLyBeP1xuICogICBwYXJhbXM6IFs0Ml0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBSZXF1ZXN0IHN0b3JlIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgcmVxdWVzdCBzdG9yZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RvcmUob3B0aW9ucyA9IHt9KSB7XG4gICAgbGV0IGlkID0gb3B0aW9ucy5pZCA/PyAwO1xuICAgIHJldHVybiB7XG4gICAgICAgIHByZXBhcmUob3B0aW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIGZyb20oe1xuICAgICAgICAgICAgICAgIGlkOiBpZCsrLFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0IGlkKCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9LFxuICAgIH07XG59XG4vKipcbiAqIEEgdHlwZS1zYWZlIGludGVyZmFjZSB0byBidWlsZCBhIEpTT04tUlBDIHJlcXVlc3Qgb2JqZWN0IGFzIHBlciB0aGUgW0pTT04tUlBDIDIuMCBzcGVjaWZpY2F0aW9uXShodHRwczovL3d3dy5qc29ucnBjLm9yZy9zcGVjaWZpY2F0aW9uI3JlcXVlc3Rfb2JqZWN0KS5cbiAqXG4gKiA6Ojp3YXJuaW5nXG4gKlxuICogWW91IHdpbGwgbGlrZWx5IHdhbnQgdG8gdXNlIHtAbGluayBveCNScGNSZXF1ZXN0LihjcmVhdGVTdG9yZTpmdW5jdGlvbil9IGluc3RlYWQgYXMgaXQgd2lsbCBhbHNvIG1hbmFnZSBgaWRgcyBhbmQgdXNlcyB0aGlzIGZ1bmN0aW9uIGludGVybmFsbHkuXG4gKlxuICogOjo6XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBScGNSZXF1ZXN0LCBScGNSZXNwb25zZSB9IGZyb20gJ294J1xuICpcbiAqIC8vIDEuIEJ1aWxkIGEgcmVxdWVzdCBvYmplY3QuXG4gKiBjb25zdCByZXF1ZXN0ID0gUnBjUmVxdWVzdC5mcm9tKHsgLy8gWyFjb2RlIGZvY3VzXVxuICogICBpZDogMCwgLy8gWyFjb2RlIGZvY3VzXVxuICogICBtZXRob2Q6ICdldGhfZXN0aW1hdGVHYXMnLCAvLyBbIWNvZGUgZm9jdXNdXG4gKiAgIHBhcmFtczogWyAvLyBbIWNvZGUgZm9jdXNdXG4gKiAgICAgeyAvLyBbIWNvZGUgZm9jdXNdXG4gKiAgICAgICBmcm9tOiAnMHhkMjEzNUNmQjIxNmI3NDEwOTc3NTIzNkUzNmQ0YjQzM0YxREY1MDdCJywgLy8gWyFjb2RlIGZvY3VzXVxuICogICAgICAgdG86ICcweDBENDRmNjE3NDM1MDg4Yzk0N0YwMEIzMTE2MGY2NGIwNzRlNDEyQjQnLCAvLyBbIWNvZGUgZm9jdXNdXG4gKiAgICAgICB2YWx1ZTogJzB4Njk0MjAnLCAvLyBbIWNvZGUgZm9jdXNdXG4gKiAgICAgfSwgLy8gWyFjb2RlIGZvY3VzXVxuICogICBdLCAvLyBbIWNvZGUgZm9jdXNdXG4gKiB9KSAvLyBbIWNvZGUgZm9jdXNdXG4gKlxuICogLy8gMi4gU2VuZCB0aGUgSlNPTi1SUEMgcmVxdWVzdCB2aWEgSFRUUC5cbiAqIGNvbnN0IGdhcyA9IGF3YWl0IGZldGNoKCdodHRwczovLzEucnBjLnRoaXJkd2ViLmNvbScsIHtcbiAqICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdCksXG4gKiAgIGhlYWRlcnM6IHtcbiAqICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICogICB9LFxuICogICBtZXRob2Q6ICdQT1NUJyxcbiAqIH0pXG4gKiAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gKiAgLy8gMy4gUGFyc2UgdGhlIEpTT04tUlBDIHJlc3BvbnNlIGludG8gYSB0eXBlLXNhZmUgcmVzdWx0LlxuICogIC50aGVuKChyZXNwb25zZSkgPT4gUnBjUmVzcG9uc2UucGFyc2UocmVzcG9uc2UsIHsgcmVxdWVzdCB9KSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gSlNPTi1SUEMgcmVxdWVzdCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIGZ1bGx5LWZvcm1lZCBKU09OLVJQQyByZXF1ZXN0IG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZyb20ob3B0aW9ucykge1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGpzb25ycGM6ICcyLjAnLFxuICAgIH07XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ScGNSZXF1ZXN0LmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/RpcRequest.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/RpcResponse.js":
/*!**************************************************!*\
  !*** ./node_modules/ox/_esm/core/RpcResponse.js ***!
  \**************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   BaseError: () => (/* binding */ BaseError),\n/* harmony export */   InternalError: () => (/* binding */ InternalError),\n/* harmony export */   InvalidInputError: () => (/* binding */ InvalidInputError),\n/* harmony export */   InvalidParamsError: () => (/* binding */ InvalidParamsError),\n/* harmony export */   InvalidRequestError: () => (/* binding */ InvalidRequestError),\n/* harmony export */   LimitExceededError: () => (/* binding */ LimitExceededError),\n/* harmony export */   MethodNotFoundError: () => (/* binding */ MethodNotFoundError),\n/* harmony export */   MethodNotSupportedError: () => (/* binding */ MethodNotSupportedError),\n/* harmony export */   ParseError: () => (/* binding */ ParseError),\n/* harmony export */   ResourceNotFoundError: () => (/* binding */ ResourceNotFoundError),\n/* harmony export */   ResourceUnavailableError: () => (/* binding */ ResourceUnavailableError),\n/* harmony export */   TransactionRejectedError: () => (/* binding */ TransactionRejectedError),\n/* harmony export */   VersionNotSupportedError: () => (/* binding */ VersionNotSupportedError),\n/* harmony export */   from: () => (/* binding */ from),\n/* harmony export */   parse: () => (/* binding */ parse)\n/* harmony export */ });\n// eslint-disable-next-line jsdoc/require-jsdoc\nfunction from(response, options = {}) {\n    const { request } = options;\n    return {\n        ...response,\n        id: response.id ?? request?.id,\n        jsonrpc: response.jsonrpc ?? request.jsonrpc,\n    };\n}\n/**\n * A type-safe interface to parse a JSON-RPC response object as per the [JSON-RPC 2.0 specification](https://www.jsonrpc.org/specification#response_object), and extract the result.\n *\n * @example\n * ```ts twoslash\n * import { RpcRequest, RpcResponse } from 'ox'\n *\n * // 1. Create a request store.\n * const store = RpcRequest.createStore()\n *\n * // 2. Get a request object.\n * const request = store.prepare({\n *   method: 'eth_getBlockByNumber',\n *   params: ['0x1', false],\n * })\n *\n * // 3. Send the JSON-RPC request via HTTP.\n * const block = await fetch('https://1.rpc.thirdweb.com', {\n *   body: JSON.stringify(request),\n *   headers: {\n *     'Content-Type': 'application/json',\n *   },\n *   method: 'POST',\n * })\n *  .then((response) => response.json())\n *  // 4. Parse the JSON-RPC response into a type-safe result. // [!code focus]\n *  .then((response) => RpcResponse.parse(response, { request })) // [!code focus]\n *\n * block // [!code focus]\n * // ^?\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n *\n * ```\n *\n * :::tip\n *\n * If you don't need the return type, you can omit the options entirely.\n *\n * ```ts twoslash\n * // @noErrors\n * import { RpcResponse } from 'ox'\n *\n * const block = await fetch('https://1.rpc.thirdweb.com', {})\n *  .then((response) => response.json())\n *  .then((response) => RpcResponse.parse(response, { request })) // [!code --]\n *  .then(RpcResponse.parse) // [!code ++]\n * ```\n * :::\n *\n * @example\n * ### Raw Mode\n *\n * If `raw` is `true`, the response will be returned as an object with `result` and `error` properties instead of returning the `result` directly and throwing errors.\n *\n * ```ts twoslash\n * import { RpcRequest, RpcResponse } from 'ox'\n *\n * const store = RpcRequest.createStore()\n *\n * const request = store.prepare({\n *   method: 'eth_blockNumber',\n * })\n *\n * const response = RpcResponse.parse({}, {\n *   request,\n *   raw: true, // [!code hl]\n * })\n *\n * response.result\n * //       ^?\n *\n *\n * response.error\n * //       ^?\n *\n *\n * ```\n *\n * @param response - Opaque JSON-RPC response object.\n * @param options - Parsing options.\n * @returns Typed JSON-RPC result, or response object (if `raw` is `true`).\n */\nfunction parse(response, options = {}) {\n    const { raw = false } = options;\n    const response_ = response;\n    if (raw)\n        return response;\n    if (response_.error) {\n        const { code } = response_.error;\n        const JsonRpcError = (() => {\n            if (code === InternalError.code)\n                return InternalError;\n            if (code === InvalidInputError.code)\n                return InvalidInputError;\n            if (code === InvalidParamsError.code)\n                return InvalidParamsError;\n            if (code === InvalidRequestError.code)\n                return InvalidRequestError;\n            if (code === LimitExceededError.code)\n                return LimitExceededError;\n            if (code === MethodNotFoundError.code)\n                return MethodNotFoundError;\n            if (code === MethodNotSupportedError.code)\n                return MethodNotSupportedError;\n            if (code === ParseError.code)\n                return ParseError;\n            if (code === ResourceNotFoundError.code)\n                return ResourceNotFoundError;\n            if (code === ResourceUnavailableError.code)\n                return ResourceUnavailableError;\n            if (code === TransactionRejectedError.code)\n                return TransactionRejectedError;\n            if (code === VersionNotSupportedError.code)\n                return VersionNotSupportedError;\n            return BaseError;\n        })();\n        throw new JsonRpcError(response_.error);\n    }\n    return response_.result;\n}\n/** Thrown when a JSON-RPC error has occurred. */\nclass BaseError extends Error {\n    constructor(errorObject) {\n        const { code, message, data } = errorObject;\n        super(message);\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.BaseError'\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        Object.defineProperty(this, \"data\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.code = code;\n        this.data = data;\n    }\n}\n/** Thrown when the input to a JSON-RPC method is invalid. */\nclass InvalidInputError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Missing or invalid parameters.',\n            ...parameters,\n            code: InvalidInputError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32000\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.InvalidInputError'\n        });\n    }\n}\nObject.defineProperty(InvalidInputError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32000\n});\n/** Thrown when a JSON-RPC resource is not found. */\nclass ResourceNotFoundError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Requested resource not found.',\n            ...parameters,\n            code: ResourceNotFoundError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32001\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.ResourceNotFoundError'\n        });\n    }\n}\nObject.defineProperty(ResourceNotFoundError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32001\n});\n/** Thrown when a JSON-RPC resource is unavailable. */\nclass ResourceUnavailableError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Requested resource not available.',\n            ...parameters,\n            code: ResourceUnavailableError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32002\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.ResourceUnavailableError'\n        });\n    }\n}\nObject.defineProperty(ResourceUnavailableError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32002\n});\n/** Thrown when a JSON-RPC transaction is rejected. */\nclass TransactionRejectedError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Transaction creation failed.',\n            ...parameters,\n            code: TransactionRejectedError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32003\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.TransactionRejectedError'\n        });\n    }\n}\nObject.defineProperty(TransactionRejectedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32003\n});\n/** Thrown when a JSON-RPC method is not supported. */\nclass MethodNotSupportedError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Method is not implemented.',\n            ...parameters,\n            code: MethodNotSupportedError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32004\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.MethodNotSupportedError'\n        });\n    }\n}\nObject.defineProperty(MethodNotSupportedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32004\n});\n/** Thrown when a rate-limit is exceeded. */\nclass LimitExceededError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Rate limit exceeded.',\n            ...parameters,\n            code: LimitExceededError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32005\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.LimitExceededError'\n        });\n    }\n}\nObject.defineProperty(LimitExceededError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32005\n});\n/** Thrown when a JSON-RPC version is not supported. */\nclass VersionNotSupportedError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'JSON-RPC version not supported.',\n            ...parameters,\n            code: VersionNotSupportedError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32006\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.VersionNotSupportedError'\n        });\n    }\n}\nObject.defineProperty(VersionNotSupportedError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32006\n});\n/** Thrown when a JSON-RPC request is invalid. */\nclass InvalidRequestError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Input is not a valid JSON-RPC request.',\n            ...parameters,\n            code: InvalidRequestError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32600\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.InvalidRequestError'\n        });\n    }\n}\nObject.defineProperty(InvalidRequestError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32600\n});\n/** Thrown when a JSON-RPC method is not found. */\nclass MethodNotFoundError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Method does not exist.',\n            ...parameters,\n            code: MethodNotFoundError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32601\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.MethodNotFoundError'\n        });\n    }\n}\nObject.defineProperty(MethodNotFoundError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32601\n});\n/** Thrown when the parameters to a JSON-RPC method are invalid. */\nclass InvalidParamsError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Invalid method parameters.',\n            ...parameters,\n            code: InvalidParamsError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32602\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.InvalidParamsError'\n        });\n    }\n}\nObject.defineProperty(InvalidParamsError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32602\n});\n/** Thrown when an internal JSON-RPC error has occurred. */\nclass InternalError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Internal JSON-RPC error.',\n            ...parameters,\n            code: InternalError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32603\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.InternalErrorError'\n        });\n    }\n}\nObject.defineProperty(InternalError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32603\n});\n/** Thrown when a JSON-RPC response is invalid. */\nclass ParseError extends BaseError {\n    constructor(parameters = {}) {\n        super({\n            message: 'Failed to parse JSON-RPC response.',\n            ...parameters,\n            code: ParseError.code,\n        });\n        Object.defineProperty(this, \"code\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: -32700\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'RpcResponse.ParseError'\n        });\n    }\n}\nObject.defineProperty(ParseError, \"code\", {\n    enumerable: true,\n    configurable: true,\n    writable: true,\n    value: -32700\n});\n//# sourceMappingURL=RpcResponse.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvUnBjUmVzcG9uc2UuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFDTyxvQ0FBb0M7QUFDM0MsWUFBWSxVQUFVO0FBQ3RCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDBCQUEwQjtBQUN0QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0Esc0RBQXNELFNBQVM7QUFDL0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGNBQWM7QUFDMUI7QUFDQSw2REFBNkQ7QUFDN0Q7QUFDQSxzREFBc0QsU0FBUztBQUMvRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksMEJBQTBCO0FBQ3RDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQSx3Q0FBd0M7QUFDeEM7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTyxxQ0FBcUM7QUFDNUMsWUFBWSxjQUFjO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU87QUFDdkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGdCQUFnQixzQkFBc0I7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ087QUFDUCwrQkFBK0I7QUFDL0I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL294L19lc20vY29yZS9ScGNSZXNwb25zZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIGZyb20ocmVzcG9uc2UsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgcmVxdWVzdCB9ID0gb3B0aW9ucztcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5yZXNwb25zZSxcbiAgICAgICAgaWQ6IHJlc3BvbnNlLmlkID8/IHJlcXVlc3Q/LmlkLFxuICAgICAgICBqc29ucnBjOiByZXNwb25zZS5qc29ucnBjID8/IHJlcXVlc3QuanNvbnJwYyxcbiAgICB9O1xufVxuLyoqXG4gKiBBIHR5cGUtc2FmZSBpbnRlcmZhY2UgdG8gcGFyc2UgYSBKU09OLVJQQyByZXNwb25zZSBvYmplY3QgYXMgcGVyIHRoZSBbSlNPTi1SUEMgMi4wIHNwZWNpZmljYXRpb25dKGh0dHBzOi8vd3d3Lmpzb25ycGMub3JnL3NwZWNpZmljYXRpb24jcmVzcG9uc2Vfb2JqZWN0KSwgYW5kIGV4dHJhY3QgdGhlIHJlc3VsdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IFJwY1JlcXVlc3QsIFJwY1Jlc3BvbnNlIH0gZnJvbSAnb3gnXG4gKlxuICogLy8gMS4gQ3JlYXRlIGEgcmVxdWVzdCBzdG9yZS5cbiAqIGNvbnN0IHN0b3JlID0gUnBjUmVxdWVzdC5jcmVhdGVTdG9yZSgpXG4gKlxuICogLy8gMi4gR2V0IGEgcmVxdWVzdCBvYmplY3QuXG4gKiBjb25zdCByZXF1ZXN0ID0gc3RvcmUucHJlcGFyZSh7XG4gKiAgIG1ldGhvZDogJ2V0aF9nZXRCbG9ja0J5TnVtYmVyJyxcbiAqICAgcGFyYW1zOiBbJzB4MScsIGZhbHNlXSxcbiAqIH0pXG4gKlxuICogLy8gMy4gU2VuZCB0aGUgSlNPTi1SUEMgcmVxdWVzdCB2aWEgSFRUUC5cbiAqIGNvbnN0IGJsb2NrID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vMS5ycGMudGhpcmR3ZWIuY29tJywge1xuICogICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KSxcbiAqICAgaGVhZGVyczoge1xuICogICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gKiAgIH0sXG4gKiAgIG1ldGhvZDogJ1BPU1QnLFxuICogfSlcbiAqICAudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLmpzb24oKSlcbiAqICAvLyA0LiBQYXJzZSB0aGUgSlNPTi1SUEMgcmVzcG9uc2UgaW50byBhIHR5cGUtc2FmZSByZXN1bHQuIC8vIFshY29kZSBmb2N1c11cbiAqICAudGhlbigocmVzcG9uc2UpID0+IFJwY1Jlc3BvbnNlLnBhcnNlKHJlc3BvbnNlLCB7IHJlcXVlc3QgfSkpIC8vIFshY29kZSBmb2N1c11cbiAqXG4gKiBibG9jayAvLyBbIWNvZGUgZm9jdXNdXG4gKiAvLyBeP1xuICpcbiAqXG4gKlxuICpcbiAqXG4gKlxuICpcbiAqXG4gKlxuICpcbiAqXG4gKiBgYGBcbiAqXG4gKiA6Ojp0aXBcbiAqXG4gKiBJZiB5b3UgZG9uJ3QgbmVlZCB0aGUgcmV0dXJuIHR5cGUsIHlvdSBjYW4gb21pdCB0aGUgb3B0aW9ucyBlbnRpcmVseS5cbiAqXG4gKiBgYGB0cyB0d29zbGFzaFxuICogLy8gQG5vRXJyb3JzXG4gKiBpbXBvcnQgeyBScGNSZXNwb25zZSB9IGZyb20gJ294J1xuICpcbiAqIGNvbnN0IGJsb2NrID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vMS5ycGMudGhpcmR3ZWIuY29tJywge30pXG4gKiAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpXG4gKiAgLnRoZW4oKHJlc3BvbnNlKSA9PiBScGNSZXNwb25zZS5wYXJzZShyZXNwb25zZSwgeyByZXF1ZXN0IH0pKSAvLyBbIWNvZGUgLS1dXG4gKiAgLnRoZW4oUnBjUmVzcG9uc2UucGFyc2UpIC8vIFshY29kZSArK11cbiAqIGBgYFxuICogOjo6XG4gKlxuICogQGV4YW1wbGVcbiAqICMjIyBSYXcgTW9kZVxuICpcbiAqIElmIGByYXdgIGlzIGB0cnVlYCwgdGhlIHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQgYXMgYW4gb2JqZWN0IHdpdGggYHJlc3VsdGAgYW5kIGBlcnJvcmAgcHJvcGVydGllcyBpbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgYHJlc3VsdGAgZGlyZWN0bHkgYW5kIHRocm93aW5nIGVycm9ycy5cbiAqXG4gKiBgYGB0cyB0d29zbGFzaFxuICogaW1wb3J0IHsgUnBjUmVxdWVzdCwgUnBjUmVzcG9uc2UgfSBmcm9tICdveCdcbiAqXG4gKiBjb25zdCBzdG9yZSA9IFJwY1JlcXVlc3QuY3JlYXRlU3RvcmUoKVxuICpcbiAqIGNvbnN0IHJlcXVlc3QgPSBzdG9yZS5wcmVwYXJlKHtcbiAqICAgbWV0aG9kOiAnZXRoX2Jsb2NrTnVtYmVyJyxcbiAqIH0pXG4gKlxuICogY29uc3QgcmVzcG9uc2UgPSBScGNSZXNwb25zZS5wYXJzZSh7fSwge1xuICogICByZXF1ZXN0LFxuICogICByYXc6IHRydWUsIC8vIFshY29kZSBobF1cbiAqIH0pXG4gKlxuICogcmVzcG9uc2UucmVzdWx0XG4gKiAvLyAgICAgICBeP1xuICpcbiAqXG4gKiByZXNwb25zZS5lcnJvclxuICogLy8gICAgICAgXj9cbiAqXG4gKlxuICogYGBgXG4gKlxuICogQHBhcmFtIHJlc3BvbnNlIC0gT3BhcXVlIEpTT04tUlBDIHJlc3BvbnNlIG9iamVjdC5cbiAqIEBwYXJhbSBvcHRpb25zIC0gUGFyc2luZyBvcHRpb25zLlxuICogQHJldHVybnMgVHlwZWQgSlNPTi1SUEMgcmVzdWx0LCBvciByZXNwb25zZSBvYmplY3QgKGlmIGByYXdgIGlzIGB0cnVlYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZShyZXNwb25zZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyByYXcgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCByZXNwb25zZV8gPSByZXNwb25zZTtcbiAgICBpZiAocmF3KVxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgaWYgKHJlc3BvbnNlXy5lcnJvcikge1xuICAgICAgICBjb25zdCB7IGNvZGUgfSA9IHJlc3BvbnNlXy5lcnJvcjtcbiAgICAgICAgY29uc3QgSnNvblJwY0Vycm9yID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBJbnRlcm5hbEVycm9yLmNvZGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEludGVybmFsRXJyb3I7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gSW52YWxpZElucHV0RXJyb3IuY29kZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gSW52YWxpZElucHV0RXJyb3I7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gSW52YWxpZFBhcmFtc0Vycm9yLmNvZGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEludmFsaWRQYXJhbXNFcnJvcjtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBJbnZhbGlkUmVxdWVzdEVycm9yLmNvZGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIEludmFsaWRSZXF1ZXN0RXJyb3I7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gTGltaXRFeGNlZWRlZEVycm9yLmNvZGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIExpbWl0RXhjZWVkZWRFcnJvcjtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBNZXRob2ROb3RGb3VuZEVycm9yLmNvZGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIE1ldGhvZE5vdEZvdW5kRXJyb3I7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gTWV0aG9kTm90U3VwcG9ydGVkRXJyb3IuY29kZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gTWV0aG9kTm90U3VwcG9ydGVkRXJyb3I7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gUGFyc2VFcnJvci5jb2RlKVxuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZUVycm9yO1xuICAgICAgICAgICAgaWYgKGNvZGUgPT09IFJlc291cmNlTm90Rm91bmRFcnJvci5jb2RlKVxuICAgICAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZU5vdEZvdW5kRXJyb3I7XG4gICAgICAgICAgICBpZiAoY29kZSA9PT0gUmVzb3VyY2VVbmF2YWlsYWJsZUVycm9yLmNvZGUpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlVW5hdmFpbGFibGVFcnJvcjtcbiAgICAgICAgICAgIGlmIChjb2RlID09PSBUcmFuc2FjdGlvblJlamVjdGVkRXJyb3IuY29kZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhbnNhY3Rpb25SZWplY3RlZEVycm9yO1xuICAgICAgICAgICAgaWYgKGNvZGUgPT09IFZlcnNpb25Ob3RTdXBwb3J0ZWRFcnJvci5jb2RlKVxuICAgICAgICAgICAgICAgIHJldHVybiBWZXJzaW9uTm90U3VwcG9ydGVkRXJyb3I7XG4gICAgICAgICAgICByZXR1cm4gQmFzZUVycm9yO1xuICAgICAgICB9KSgpO1xuICAgICAgICB0aHJvdyBuZXcgSnNvblJwY0Vycm9yKHJlc3BvbnNlXy5lcnJvcik7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZV8ucmVzdWx0O1xufVxuLyoqIFRocm93biB3aGVuIGEgSlNPTi1SUEMgZXJyb3IgaGFzIG9jY3VycmVkLiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihlcnJvck9iamVjdCkge1xuICAgICAgICBjb25zdCB7IGNvZGUsIG1lc3NhZ2UsIGRhdGEgfSA9IGVycm9yT2JqZWN0O1xuICAgICAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ1JwY1Jlc3BvbnNlLkJhc2VFcnJvcidcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IHZvaWQgMFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiZGF0YVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvZGUgPSBjb2RlO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cbi8qKiBUaHJvd24gd2hlbiB0aGUgaW5wdXQgdG8gYSBKU09OLVJQQyBtZXRob2QgaXMgaW52YWxpZC4gKi9cbmV4cG9ydCBjbGFzcyBJbnZhbGlkSW5wdXRFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdNaXNzaW5nIG9yIGludmFsaWQgcGFyYW1ldGVycy4nLFxuICAgICAgICAgICAgLi4ucGFyYW1ldGVycyxcbiAgICAgICAgICAgIGNvZGU6IEludmFsaWRJbnB1dEVycm9yLmNvZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAtMzIwMDBcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdScGNSZXNwb25zZS5JbnZhbGlkSW5wdXRFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEludmFsaWRJbnB1dEVycm9yLCBcImNvZGVcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIHZhbHVlOiAtMzIwMDBcbn0pO1xuLyoqIFRocm93biB3aGVuIGEgSlNPTi1SUEMgcmVzb3VyY2UgaXMgbm90IGZvdW5kLiAqL1xuZXhwb3J0IGNsYXNzIFJlc291cmNlTm90Rm91bmRFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdSZXF1ZXN0ZWQgcmVzb3VyY2Ugbm90IGZvdW5kLicsXG4gICAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgY29kZTogUmVzb3VyY2VOb3RGb3VuZEVycm9yLmNvZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAtMzIwMDFcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdScGNSZXNwb25zZS5SZXNvdXJjZU5vdEZvdW5kRXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShSZXNvdXJjZU5vdEZvdW5kRXJyb3IsIFwiY29kZVwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IC0zMjAwMVxufSk7XG4vKiogVGhyb3duIHdoZW4gYSBKU09OLVJQQyByZXNvdXJjZSBpcyB1bmF2YWlsYWJsZS4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBtZXNzYWdlOiAnUmVxdWVzdGVkIHJlc291cmNlIG5vdCBhdmFpbGFibGUuJyxcbiAgICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICBjb2RlOiBSZXNvdXJjZVVuYXZhaWxhYmxlRXJyb3IuY29kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IC0zMjAwMlxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ1JwY1Jlc3BvbnNlLlJlc291cmNlVW5hdmFpbGFibGVFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFJlc291cmNlVW5hdmFpbGFibGVFcnJvciwgXCJjb2RlXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogLTMyMDAyXG59KTtcbi8qKiBUaHJvd24gd2hlbiBhIEpTT04tUlBDIHRyYW5zYWN0aW9uIGlzIHJlamVjdGVkLiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uUmVqZWN0ZWRFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdUcmFuc2FjdGlvbiBjcmVhdGlvbiBmYWlsZWQuJyxcbiAgICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICBjb2RlOiBUcmFuc2FjdGlvblJlamVjdGVkRXJyb3IuY29kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IC0zMjAwM1xuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ1JwY1Jlc3BvbnNlLlRyYW5zYWN0aW9uUmVqZWN0ZWRFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyYW5zYWN0aW9uUmVqZWN0ZWRFcnJvciwgXCJjb2RlXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogLTMyMDAzXG59KTtcbi8qKiBUaHJvd24gd2hlbiBhIEpTT04tUlBDIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkLiAqL1xuZXhwb3J0IGNsYXNzIE1ldGhvZE5vdFN1cHBvcnRlZEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgbWVzc2FnZTogJ01ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuJyxcbiAgICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICBjb2RlOiBNZXRob2ROb3RTdXBwb3J0ZWRFcnJvci5jb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogLTMyMDA0XG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnUnBjUmVzcG9uc2UuTWV0aG9kTm90U3VwcG9ydGVkRXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShNZXRob2ROb3RTdXBwb3J0ZWRFcnJvciwgXCJjb2RlXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogLTMyMDA0XG59KTtcbi8qKiBUaHJvd24gd2hlbiBhIHJhdGUtbGltaXQgaXMgZXhjZWVkZWQuICovXG5leHBvcnQgY2xhc3MgTGltaXRFeGNlZWRlZEVycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgbWVzc2FnZTogJ1JhdGUgbGltaXQgZXhjZWVkZWQuJyxcbiAgICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICBjb2RlOiBMaW1pdEV4Y2VlZGVkRXJyb3IuY29kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IC0zMjAwNVxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ1JwY1Jlc3BvbnNlLkxpbWl0RXhjZWVkZWRFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KExpbWl0RXhjZWVkZWRFcnJvciwgXCJjb2RlXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogLTMyMDA1XG59KTtcbi8qKiBUaHJvd24gd2hlbiBhIEpTT04tUlBDIHZlcnNpb24gaXMgbm90IHN1cHBvcnRlZC4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uTm90U3VwcG9ydGVkRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBtZXNzYWdlOiAnSlNPTi1SUEMgdmVyc2lvbiBub3Qgc3VwcG9ydGVkLicsXG4gICAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgY29kZTogVmVyc2lvbk5vdFN1cHBvcnRlZEVycm9yLmNvZGUsXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJjb2RlXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAtMzIwMDZcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcIm5hbWVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6ICdScGNSZXNwb25zZS5WZXJzaW9uTm90U3VwcG9ydGVkRXJyb3InXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShWZXJzaW9uTm90U3VwcG9ydGVkRXJyb3IsIFwiY29kZVwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IC0zMjAwNlxufSk7XG4vKiogVGhyb3duIHdoZW4gYSBKU09OLVJQQyByZXF1ZXN0IGlzIGludmFsaWQuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZFJlcXVlc3RFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnB1dCBpcyBub3QgYSB2YWxpZCBKU09OLVJQQyByZXF1ZXN0LicsXG4gICAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgY29kZTogSW52YWxpZFJlcXVlc3RFcnJvci5jb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogLTMyNjAwXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnUnBjUmVzcG9uc2UuSW52YWxpZFJlcXVlc3RFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEludmFsaWRSZXF1ZXN0RXJyb3IsIFwiY29kZVwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IC0zMjYwMFxufSk7XG4vKiogVGhyb3duIHdoZW4gYSBKU09OLVJQQyBtZXRob2QgaXMgbm90IGZvdW5kLiAqL1xuZXhwb3J0IGNsYXNzIE1ldGhvZE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBtZXNzYWdlOiAnTWV0aG9kIGRvZXMgbm90IGV4aXN0LicsXG4gICAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgY29kZTogTWV0aG9kTm90Rm91bmRFcnJvci5jb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogLTMyNjAxXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnUnBjUmVzcG9uc2UuTWV0aG9kTm90Rm91bmRFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KE1ldGhvZE5vdEZvdW5kRXJyb3IsIFwiY29kZVwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IC0zMjYwMVxufSk7XG4vKiogVGhyb3duIHdoZW4gdGhlIHBhcmFtZXRlcnMgdG8gYSBKU09OLVJQQyBtZXRob2QgYXJlIGludmFsaWQuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZFBhcmFtc0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJzID0ge30pIHtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgbWVzc2FnZTogJ0ludmFsaWQgbWV0aG9kIHBhcmFtZXRlcnMuJyxcbiAgICAgICAgICAgIC4uLnBhcmFtZXRlcnMsXG4gICAgICAgICAgICBjb2RlOiBJbnZhbGlkUGFyYW1zRXJyb3IuY29kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IC0zMjYwMlxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ1JwY1Jlc3BvbnNlLkludmFsaWRQYXJhbXNFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEludmFsaWRQYXJhbXNFcnJvciwgXCJjb2RlXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogLTMyNjAyXG59KTtcbi8qKiBUaHJvd24gd2hlbiBhbiBpbnRlcm5hbCBKU09OLVJQQyBlcnJvciBoYXMgb2NjdXJyZWQuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gICAgY29uc3RydWN0b3IocGFyYW1ldGVycyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIG1lc3NhZ2U6ICdJbnRlcm5hbCBKU09OLVJQQyBlcnJvci4nLFxuICAgICAgICAgICAgLi4ucGFyYW1ldGVycyxcbiAgICAgICAgICAgIGNvZGU6IEludGVybmFsRXJyb3IuY29kZSxcbiAgICAgICAgfSk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcImNvZGVcIiwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IC0zMjYwM1xuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ1JwY1Jlc3BvbnNlLkludGVybmFsRXJyb3JFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KEludGVybmFsRXJyb3IsIFwiY29kZVwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IC0zMjYwM1xufSk7XG4vKiogVGhyb3duIHdoZW4gYSBKU09OLVJQQyByZXNwb25zZSBpcyBpbnZhbGlkLiAqL1xuZXhwb3J0IGNsYXNzIFBhcnNlRXJyb3IgZXh0ZW5kcyBCYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMgPSB7fSkge1xuICAgICAgICBzdXBlcih7XG4gICAgICAgICAgICBtZXNzYWdlOiAnRmFpbGVkIHRvIHBhcnNlIEpTT04tUlBDIHJlc3BvbnNlLicsXG4gICAgICAgICAgICAuLi5wYXJhbWV0ZXJzLFxuICAgICAgICAgICAgY29kZTogUGFyc2VFcnJvci5jb2RlLFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwiY29kZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogLTMyNzAwXG4gICAgICAgIH0pO1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJuYW1lXCIsIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiAnUnBjUmVzcG9uc2UuUGFyc2VFcnJvcidcbiAgICAgICAgfSk7XG4gICAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFBhcnNlRXJyb3IsIFwiY29kZVwiLCB7XG4gICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgdmFsdWU6IC0zMjcwMFxufSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ScGNSZXNwb25zZS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/RpcResponse.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/Siwe.js":
/*!*******************************************!*\
  !*** ./node_modules/ox/_esm/core/Siwe.js ***!
  \*******************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   InvalidMessageFieldError: () => (/* binding */ InvalidMessageFieldError),\n/* harmony export */   createMessage: () => (/* binding */ createMessage),\n/* harmony export */   domainRegex: () => (/* binding */ domainRegex),\n/* harmony export */   generateNonce: () => (/* binding */ generateNonce),\n/* harmony export */   ipRegex: () => (/* binding */ ipRegex),\n/* harmony export */   isUri: () => (/* binding */ isUri),\n/* harmony export */   localhostRegex: () => (/* binding */ localhostRegex),\n/* harmony export */   nonceRegex: () => (/* binding */ nonceRegex),\n/* harmony export */   parseMessage: () => (/* binding */ parseMessage),\n/* harmony export */   prefixRegex: () => (/* binding */ prefixRegex),\n/* harmony export */   schemeRegex: () => (/* binding */ schemeRegex),\n/* harmony export */   suffixRegex: () => (/* binding */ suffixRegex),\n/* harmony export */   validateMessage: () => (/* binding */ validateMessage)\n/* harmony export */ });\n/* harmony import */ var _Address_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Address.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Address.js\");\n/* harmony import */ var _Errors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Errors.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Errors.js\");\n/* harmony import */ var _internal_uid_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./internal/uid.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/internal/uid.js\");\n\n\n\nconst domainRegex = /^([a-zA-Z0-9]([a-zA-Z0-9\\-]{0,61}[a-zA-Z0-9])?\\.)+[a-zA-Z]{2,}(:[0-9]{1,5})?$/;\nconst ipRegex = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(:[0-9]{1,5})?$/;\nconst localhostRegex = /^localhost(:[0-9]{1,5})?$/;\nconst nonceRegex = /^[a-zA-Z0-9]{8,}$/;\nconst schemeRegex = /^([a-zA-Z][a-zA-Z0-9+-.]*)$/;\n// https://regexr.com/80gdj\nconst prefixRegex = /^(?:(?<scheme>[a-zA-Z][a-zA-Z0-9+-.]*):\\/\\/)?(?<domain>[a-zA-Z0-9+-.]*(?::[0-9]{1,5})?) (?:wants you to sign in with your Ethereum account:\\n)(?<address>0x[a-fA-F0-9]{40})\\n\\n(?:(?<statement>.*)\\n\\n)?/;\n// https://regexr.com/80gf9\nconst suffixRegex = /(?:URI: (?<uri>.+))\\n(?:Version: (?<version>.+))\\n(?:Chain ID: (?<chainId>\\d+))\\n(?:Nonce: (?<nonce>[a-zA-Z0-9]+))\\n(?:Issued At: (?<issuedAt>.+))(?:\\nExpiration Time: (?<expirationTime>.+))?(?:\\nNot Before: (?<notBefore>.+))?(?:\\nRequest ID: (?<requestId>.+))?/;\n/**\n * Creates [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361) formatted message.\n *\n * @example\n * ```ts twoslash\n * import { Siwe } from 'ox'\n *\n * Siwe.createMessage({\n *   address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n *   chainId: 1,\n *   domain: 'example.com',\n *   nonce: 'foobarbaz',\n *   uri: 'https://example.com/path',\n *   version: '1',\n * })\n * // @log: \"example.com wants you to sign in with your Ethereum account:\n * // @log: 0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\n * // @log:\n * // @log:\n * // @log: URI: https://example.com/path\n * // @log: Version: 1\n * // @log: Chain ID: 1\n * // @log: Nonce: foobarbaz\n * // @log: Issued At: 2023-02-01T00:00:00.000Z\"\n * ```\n *\n * @param value - Values to use when creating EIP-4361 formatted message.\n * @returns EIP-4361 formatted message.\n */\nfunction createMessage(value) {\n    const { chainId, domain, expirationTime, issuedAt = new Date(), nonce, notBefore, requestId, resources, scheme, uri, version, } = value;\n    // Validate fields\n    {\n        // Required fields\n        if (chainId !== Math.floor(chainId))\n            throw new InvalidMessageFieldError({\n                field: 'chainId',\n                metaMessages: [\n                    '- Chain ID must be a EIP-155 chain ID.',\n                    '- See https://eips.ethereum.org/EIPS/eip-155',\n                    '',\n                    `Provided value: ${chainId}`,\n                ],\n            });\n        if (!(domainRegex.test(domain) ||\n            ipRegex.test(domain) ||\n            localhostRegex.test(domain)))\n            throw new InvalidMessageFieldError({\n                field: 'domain',\n                metaMessages: [\n                    '- Domain must be an RFC 3986 authority.',\n                    '- See https://www.rfc-editor.org/rfc/rfc3986',\n                    '',\n                    `Provided value: ${domain}`,\n                ],\n            });\n        if (!nonceRegex.test(nonce))\n            throw new InvalidMessageFieldError({\n                field: 'nonce',\n                metaMessages: [\n                    '- Nonce must be at least 8 characters.',\n                    '- Nonce must be alphanumeric.',\n                    '',\n                    `Provided value: ${nonce}`,\n                ],\n            });\n        if (!isUri(uri))\n            throw new InvalidMessageFieldError({\n                field: 'uri',\n                metaMessages: [\n                    '- URI must be a RFC 3986 URI referring to the resource that is the subject of the signing.',\n                    '- See https://www.rfc-editor.org/rfc/rfc3986',\n                    '',\n                    `Provided value: ${uri}`,\n                ],\n            });\n        if (version !== '1')\n            throw new InvalidMessageFieldError({\n                field: 'version',\n                metaMessages: [\n                    \"- Version must be '1'.\",\n                    '',\n                    `Provided value: ${version}`,\n                ],\n            });\n        // Optional fields\n        if (scheme && !schemeRegex.test(scheme))\n            throw new InvalidMessageFieldError({\n                field: 'scheme',\n                metaMessages: [\n                    '- Scheme must be an RFC 3986 URI scheme.',\n                    '- See https://www.rfc-editor.org/rfc/rfc3986#section-3.1',\n                    '',\n                    `Provided value: ${scheme}`,\n                ],\n            });\n        const statement = value.statement;\n        if (statement?.includes('\\n'))\n            throw new InvalidMessageFieldError({\n                field: 'statement',\n                metaMessages: [\n                    \"- Statement must not include '\\\\n'.\",\n                    '',\n                    `Provided value: ${statement}`,\n                ],\n            });\n    }\n    // Construct message\n    const address = _Address_js__WEBPACK_IMPORTED_MODULE_0__.from(value.address, { checksum: true });\n    const origin = (() => {\n        if (scheme)\n            return `${scheme}://${domain}`;\n        return domain;\n    })();\n    const statement = (() => {\n        if (!value.statement)\n            return '';\n        return `${value.statement}\\n`;\n    })();\n    const prefix = `${origin} wants you to sign in with your Ethereum account:\\n${address}\\n\\n${statement}`;\n    let suffix = `URI: ${uri}\\nVersion: ${version}\\nChain ID: ${chainId}\\nNonce: ${nonce}\\nIssued At: ${issuedAt.toISOString()}`;\n    if (expirationTime)\n        suffix += `\\nExpiration Time: ${expirationTime.toISOString()}`;\n    if (notBefore)\n        suffix += `\\nNot Before: ${notBefore.toISOString()}`;\n    if (requestId)\n        suffix += `\\nRequest ID: ${requestId}`;\n    if (resources) {\n        let content = '\\nResources:';\n        for (const resource of resources) {\n            if (!isUri(resource))\n                throw new InvalidMessageFieldError({\n                    field: 'resources',\n                    metaMessages: [\n                        '- Every resource must be a RFC 3986 URI.',\n                        '- See https://www.rfc-editor.org/rfc/rfc3986',\n                        '',\n                        `Provided value: ${resource}`,\n                    ],\n                });\n            content += `\\n- ${resource}`;\n        }\n        suffix += content;\n    }\n    return `${prefix}\\n${suffix}`;\n}\n/**\n * Generates random [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361) nonce.\n *\n * @example\n * ```ts twoslash\n * import { Siwe } from 'ox'\n *\n * Siwe.generateNonce()\n * // @log: '65ed4681d4efe0270b923ff5f4b097b1c95974dc33aeebecd5724c42fd86dfd25dc70b27ef836b2aa22e68f19ebcccc1'\n * ```\n *\n * @returns Random nonce.\n */\nfunction generateNonce() {\n    return (0,_internal_uid_js__WEBPACK_IMPORTED_MODULE_1__.uid)(96);\n}\n/**\n * Check if the given URI is a valid [RFC 3986](https://www.rfc-editor.org/rfc/rfc3986) URI.\n *\n * @example\n * ```ts twoslash\n * import { Siwe } from 'ox'\n *\n * Siwe.isUri('https://example.com/foo')\n * // @log: true\n * ```\n *\n * @param value - Value to check.\n * @returns `false` if invalid, otherwise the valid URI.\n */\n// based on https://github.com/ogt/valid-url\nfunction isUri(value) {\n    // check for illegal characters\n    if (/[^a-z0-9\\:\\/\\?\\#\\[\\]\\@\\!\\$\\&\\'\\(\\)\\*\\+\\,\\;\\=\\.\\-\\_\\~\\%]/i.test(value))\n        return false;\n    // check for hex escapes that aren't complete\n    if (/%[^0-9a-f]/i.test(value))\n        return false;\n    if (/%[0-9a-f](:?[^0-9a-f]|$)/i.test(value))\n        return false;\n    // from RFC 3986\n    const splitted = splitUri(value);\n    const scheme = splitted[1];\n    const authority = splitted[2];\n    const path = splitted[3];\n    const query = splitted[4];\n    const fragment = splitted[5];\n    // scheme and path are required, though the path can be empty\n    if (!(scheme?.length && path && path.length >= 0))\n        return false;\n    // if authority is present, the path must be empty or begin with a /\n    if (authority?.length) {\n        if (!(path.length === 0 || /^\\//.test(path)))\n            return false;\n    }\n    else {\n        // if authority is not present, the path must not start with //\n        if (/^\\/\\//.test(path))\n            return false;\n    }\n    // scheme must begin with a letter, then consist of letters, digits, +, ., or -\n    if (!/^[a-z][a-z0-9\\+\\-\\.]*$/.test(scheme.toLowerCase()))\n        return false;\n    let out = '';\n    // re-assemble the URL per section 5.3 in RFC 3986\n    out += `${scheme}:`;\n    if (authority?.length)\n        out += `//${authority}`;\n    out += path;\n    if (query?.length)\n        out += `?${query}`;\n    if (fragment?.length)\n        out += `#${fragment}`;\n    return out;\n}\nfunction splitUri(value) {\n    return value.match(/(?:([^:\\/?#]+):)?(?:\\/\\/([^\\/?#]*))?([^?#]*)(?:\\?([^#]*))?(?:#(.*))?/);\n}\n/**\n * [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361) formatted message into message fields object.\n *\n * @example\n * ```ts twoslash\n * import { Siwe } from 'ox'\n *\n * Siwe.parseMessage(`example.com wants you to sign in with your Ethereum account:\n * 0xA0Cf798816D4b9b9866b5330EEa46a18382f251e\n *\n * I accept the ExampleOrg Terms of Service: https://example.com/tos\n *\n * URI: https://example.com/path\n * Version: 1\n * Chain ID: 1\n * Nonce: foobarbaz\n * Issued At: 2023-02-01T00:00:00.000Z`)\n * // @log: {\n * // @log:   address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * // @log:   chainId: 1,\n * // @log:   domain: 'example.com',\n * // @log:   issuedAt: '2023-02-01T00:00:00.000Z',\n * // @log:   nonce: 'foobarbaz',\n * // @log:   statement: 'I accept the ExampleOrg Terms of Service: https://example.com/tos',\n * // @log:   uri: 'https://example.com/path',\n * // @log:   version: '1',\n * // @log: }\n * ```\n *\n * @param message - [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361) formatted message.\n * @returns Message fields object.\n */\nfunction parseMessage(message) {\n    const { scheme, statement, ...prefix } = (message.match(prefixRegex)\n        ?.groups ?? {});\n    const { chainId, expirationTime, issuedAt, notBefore, requestId, ...suffix } = (message.match(suffixRegex)?.groups ?? {});\n    const resources = message.split('Resources:')[1]?.split('\\n- ').slice(1);\n    return {\n        ...prefix,\n        ...suffix,\n        ...(chainId ? { chainId: Number(chainId) } : {}),\n        ...(expirationTime ? { expirationTime: new Date(expirationTime) } : {}),\n        ...(issuedAt ? { issuedAt: new Date(issuedAt) } : {}),\n        ...(notBefore ? { notBefore: new Date(notBefore) } : {}),\n        ...(requestId ? { requestId } : {}),\n        ...(resources ? { resources } : {}),\n        ...(scheme ? { scheme } : {}),\n        ...(statement ? { statement } : {}),\n    };\n}\n/**\n * Validates [EIP-4361](https://eips.ethereum.org/EIPS/eip-4361) message.\n *\n * @example\n * ```ts twoslash\n * import { Siwe } from 'ox'\n *\n * Siwe.validateMessage({\n *   address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n *   domain: 'example.com',\n *   message: {\n *     address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n *     chainId: 1,\n *     domain: 'example.com',\n *     nonce: 'foobarbaz',\n *     uri: 'https://example.com/path',\n *     version: '1',\n *   },\n *   nonce: 'foobarbaz',\n * })\n * // @log: true\n * ```\n *\n * @param value - Values to use when validating EIP-4361 formatted message.\n * @returns Whether the message is valid.\n */\nfunction validateMessage(value) {\n    const { address, domain, message, nonce, scheme, time = new Date() } = value;\n    if (domain && message.domain !== domain)\n        return false;\n    if (nonce && message.nonce !== nonce)\n        return false;\n    if (scheme && message.scheme !== scheme)\n        return false;\n    if (message.expirationTime && time >= message.expirationTime)\n        return false;\n    if (message.notBefore && time < message.notBefore)\n        return false;\n    try {\n        if (!message.address)\n            return false;\n        if (address && !_Address_js__WEBPACK_IMPORTED_MODULE_0__.isEqual(message.address, address))\n            return false;\n    }\n    catch {\n        return false;\n    }\n    return true;\n}\n/**\n * Thrown when a field in a SIWE Message is invalid.\n *\n * @example\n * ```ts twoslash\n * import { Siwe } from 'ox'\n *\n * Siwe.createMessage({\n *   address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n *   chainId: 1.1,\n *   domain: 'example.com',\n *   nonce: 'foobarbaz',\n *   uri: 'https://example.com/path',\n *   version: '1',\n * })\n * // @error: Siwe.InvalidMessageFieldError: Invalid Sign-In with Ethereum message field \"chainId\".\n * // @error: - Chain ID must be a EIP-155 chain ID.\n * // @error: - See https://eips.ethereum.org/EIPS/eip-155\n * // @error: Provided value: 1.1\n * ```\n */\nclass InvalidMessageFieldError extends _Errors_js__WEBPACK_IMPORTED_MODULE_2__.BaseError {\n    constructor(parameters) {\n        const { field, metaMessages } = parameters;\n        super(`Invalid Sign-In with Ethereum message field \"${field}\".`, {\n            metaMessages,\n        });\n        Object.defineProperty(this, \"name\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: 'Siwe.InvalidMessageFieldError'\n        });\n    }\n}\n//# sourceMappingURL=Siwe.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvU2l3ZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXdDO0FBQ0Y7QUFDRTtBQUNqQyxpREFBaUQsS0FBSywwQkFBMEIsR0FBRyxRQUFRLElBQUk7QUFDL0Ysd0xBQXdMLElBQUk7QUFDNUwsMENBQTBDLElBQUk7QUFDOUMsaUNBQWlDLEdBQUc7QUFDcEM7QUFDUDtBQUNPLHFHQUFxRyxJQUFJLG1GQUFtRixHQUFHO0FBQ3RNO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxPQUFPO0FBQ25CO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsWUFBWSx3SEFBd0g7QUFDcEk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsUUFBUTtBQUMvQztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1Q0FBdUMsT0FBTztBQUM5QztBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxNQUFNO0FBQzdDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLElBQUk7QUFDM0M7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdUNBQXVDLFFBQVE7QUFDL0M7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QyxPQUFPO0FBQzlDO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFD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Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLHVDQUF1QyxpREFBZ0I7QUFDOUQ7QUFDQSxnQkFBZ0Isc0JBQXNCO0FBQ3RDLDhEQUE4RCxNQUFNO0FBQ3BFO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL294L19lc20vY29yZS9TaXdlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEFkZHJlc3MgZnJvbSAnLi9BZGRyZXNzLmpzJztcbmltcG9ydCAqIGFzIEVycm9ycyBmcm9tICcuL0Vycm9ycy5qcyc7XG5pbXBvcnQgeyB1aWQgfSBmcm9tICcuL2ludGVybmFsL3VpZC5qcyc7XG5leHBvcnQgY29uc3QgZG9tYWluUmVnZXggPSAvXihbYS16QS1aMC05XShbYS16QS1aMC05XFwtXXswLDYxfVthLXpBLVowLTldKT9cXC4pK1thLXpBLVpdezIsfSg6WzAtOV17MSw1fSk/JC87XG5leHBvcnQgY29uc3QgaXBSZWdleCA9IC9eKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4oMjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/KVxcLigyNVswLTVdfDJbMC00XVswLTldfFswMV0/WzAtOV1bMC05XT8pXFwuKDI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPykoOlswLTldezEsNX0pPyQvO1xuZXhwb3J0IGNvbnN0IGxvY2FsaG9zdFJlZ2V4ID0gL15sb2NhbGhvc3QoOlswLTldezEsNX0pPyQvO1xuZXhwb3J0IGNvbnN0IG5vbmNlUmVnZXggPSAvXlthLXpBLVowLTldezgsfSQvO1xuZXhwb3J0IGNvbnN0IHNjaGVtZVJlZ2V4ID0gL14oW2EtekEtWl1bYS16QS1aMC05Ky0uXSopJC87XG4vLyBodHRwczovL3JlZ2V4ci5jb20vODBnZGpcbmV4cG9ydCBjb25zdCBwcmVmaXhSZWdleCA9IC9eKD86KD88c2NoZW1lPlthLXpBLVpdW2EtekEtWjAtOSstLl0qKTpcXC9cXC8pPyg/PGRvbWFpbj5bYS16QS1aMC05Ky0uXSooPzo6WzAtOV17MSw1fSk/KSAoPzp3YW50cyB5b3UgdG8gc2lnbiBpbiB3aXRoIHlvdXIgRXRoZXJldW0gYWNjb3VudDpcXG4pKD88YWRkcmVzcz4weFthLWZBLUYwLTldezQwfSlcXG5cXG4oPzooPzxzdGF0ZW1lbnQ+LiopXFxuXFxuKT8vO1xuLy8gaHR0cHM6Ly9yZWdleHIuY29tLzgwZ2Y5XG5leHBvcnQgY29uc3Qgc3VmZml4UmVnZXggPSAvKD86VVJJOiAoPzx1cmk+LispKVxcbig/OlZlcnNpb246ICg/PHZlcnNpb24+LispKVxcbig/OkNoYWluIElEOiAoPzxjaGFpbklkPlxcZCspKVxcbig/Ok5vbmNlOiAoPzxub25jZT5bYS16QS1aMC05XSspKVxcbig/Oklzc3VlZCBBdDogKD88aXNzdWVkQXQ+LispKSg/OlxcbkV4cGlyYXRpb24gVGltZTogKD88ZXhwaXJhdGlvblRpbWU+LispKT8oPzpcXG5Ob3QgQmVmb3JlOiAoPzxub3RCZWZvcmU+LispKT8oPzpcXG5SZXF1ZXN0IElEOiAoPzxyZXF1ZXN0SWQ+LispKT8vO1xuLyoqXG4gKiBDcmVhdGVzIFtFSVAtNDM2MV0oaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC00MzYxKSBmb3JtYXR0ZWQgbWVzc2FnZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IFNpd2UgfSBmcm9tICdveCdcbiAqXG4gKiBTaXdlLmNyZWF0ZU1lc3NhZ2Uoe1xuICogICBhZGRyZXNzOiAnMHhBMENmNzk4ODE2RDRiOWI5ODY2YjUzMzBFRWE0NmExODM4MmYyNTFlJyxcbiAqICAgY2hhaW5JZDogMSxcbiAqICAgZG9tYWluOiAnZXhhbXBsZS5jb20nLFxuICogICBub25jZTogJ2Zvb2JhcmJheicsXG4gKiAgIHVyaTogJ2h0dHBzOi8vZXhhbXBsZS5jb20vcGF0aCcsXG4gKiAgIHZlcnNpb246ICcxJyxcbiAqIH0pXG4gKiAvLyBAbG9nOiBcImV4YW1wbGUuY29tIHdhbnRzIHlvdSB0byBzaWduIGluIHdpdGggeW91ciBFdGhlcmV1bSBhY2NvdW50OlxuICogLy8gQGxvZzogMHhBMENmNzk4ODE2RDRiOWI5ODY2YjUzMzBFRWE0NmExODM4MmYyNTFlXG4gKiAvLyBAbG9nOlxuICogLy8gQGxvZzpcbiAqIC8vIEBsb2c6IFVSSTogaHR0cHM6Ly9leGFtcGxlLmNvbS9wYXRoXG4gKiAvLyBAbG9nOiBWZXJzaW9uOiAxXG4gKiAvLyBAbG9nOiBDaGFpbiBJRDogMVxuICogLy8gQGxvZzogTm9uY2U6IGZvb2JhcmJhelxuICogLy8gQGxvZzogSXNzdWVkIEF0OiAyMDIzLTAyLTAxVDAwOjAwOjAwLjAwMFpcIlxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWVzIHRvIHVzZSB3aGVuIGNyZWF0aW5nIEVJUC00MzYxIGZvcm1hdHRlZCBtZXNzYWdlLlxuICogQHJldHVybnMgRUlQLTQzNjEgZm9ybWF0dGVkIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZXNzYWdlKHZhbHVlKSB7XG4gICAgY29uc3QgeyBjaGFpbklkLCBkb21haW4sIGV4cGlyYXRpb25UaW1lLCBpc3N1ZWRBdCA9IG5ldyBEYXRlKCksIG5vbmNlLCBub3RCZWZvcmUsIHJlcXVlc3RJZCwgcmVzb3VyY2VzLCBzY2hlbWUsIHVyaSwgdmVyc2lvbiwgfSA9IHZhbHVlO1xuICAgIC8vIFZhbGlkYXRlIGZpZWxkc1xuICAgIHtcbiAgICAgICAgLy8gUmVxdWlyZWQgZmllbGRzXG4gICAgICAgIGlmIChjaGFpbklkICE9PSBNYXRoLmZsb29yKGNoYWluSWQpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRNZXNzYWdlRmllbGRFcnJvcih7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdjaGFpbklkJyxcbiAgICAgICAgICAgICAgICBtZXRhTWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJy0gQ2hhaW4gSUQgbXVzdCBiZSBhIEVJUC0xNTUgY2hhaW4gSUQuJyxcbiAgICAgICAgICAgICAgICAgICAgJy0gU2VlIGh0dHBzOi8vZWlwcy5ldGhlcmV1bS5vcmcvRUlQUy9laXAtMTU1JyxcbiAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgIGBQcm92aWRlZCB2YWx1ZTogJHtjaGFpbklkfWAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoIShkb21haW5SZWdleC50ZXN0KGRvbWFpbikgfHxcbiAgICAgICAgICAgIGlwUmVnZXgudGVzdChkb21haW4pIHx8XG4gICAgICAgICAgICBsb2NhbGhvc3RSZWdleC50ZXN0KGRvbWFpbikpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRNZXNzYWdlRmllbGRFcnJvcih7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdkb21haW4nLFxuICAgICAgICAgICAgICAgIG1ldGFNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgICAgICAnLSBEb21haW4gbXVzdCBiZSBhbiBSRkMgMzk4NiBhdXRob3JpdHkuJyxcbiAgICAgICAgICAgICAgICAgICAgJy0gU2VlIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMzOTg2JyxcbiAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgIGBQcm92aWRlZCB2YWx1ZTogJHtkb21haW59YCxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGlmICghbm9uY2VSZWdleC50ZXN0KG5vbmNlKSlcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkTWVzc2FnZUZpZWxkRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGZpZWxkOiAnbm9uY2UnLFxuICAgICAgICAgICAgICAgIG1ldGFNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgICAgICAnLSBOb25jZSBtdXN0IGJlIGF0IGxlYXN0IDggY2hhcmFjdGVycy4nLFxuICAgICAgICAgICAgICAgICAgICAnLSBOb25jZSBtdXN0IGJlIGFscGhhbnVtZXJpYy4nLFxuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgYFByb3ZpZGVkIHZhbHVlOiAke25vbmNlfWAsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoIWlzVXJpKHVyaSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE1lc3NhZ2VGaWVsZEVycm9yKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3VyaScsXG4gICAgICAgICAgICAgICAgbWV0YU1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICctIFVSSSBtdXN0IGJlIGEgUkZDIDM5ODYgVVJJIHJlZmVycmluZyB0byB0aGUgcmVzb3VyY2UgdGhhdCBpcyB0aGUgc3ViamVjdCBvZiB0aGUgc2lnbmluZy4nLFxuICAgICAgICAgICAgICAgICAgICAnLSBTZWUgaHR0cHM6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzM5ODYnLFxuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgYFByb3ZpZGVkIHZhbHVlOiAke3VyaX1gLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKHZlcnNpb24gIT09ICcxJylcbiAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkTWVzc2FnZUZpZWxkRXJyb3Ioe1xuICAgICAgICAgICAgICAgIGZpZWxkOiAndmVyc2lvbicsXG4gICAgICAgICAgICAgICAgbWV0YU1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiLSBWZXJzaW9uIG11c3QgYmUgJzEnLlwiLFxuICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgYFByb3ZpZGVkIHZhbHVlOiAke3ZlcnNpb259YCxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIC8vIE9wdGlvbmFsIGZpZWxkc1xuICAgICAgICBpZiAoc2NoZW1lICYmICFzY2hlbWVSZWdleC50ZXN0KHNjaGVtZSkpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE1lc3NhZ2VGaWVsZEVycm9yKHtcbiAgICAgICAgICAgICAgICBmaWVsZDogJ3NjaGVtZScsXG4gICAgICAgICAgICAgICAgbWV0YU1lc3NhZ2VzOiBbXG4gICAgICAgICAgICAgICAgICAgICctIFNjaGVtZSBtdXN0IGJlIGFuIFJGQyAzOTg2IFVSSSBzY2hlbWUuJyxcbiAgICAgICAgICAgICAgICAgICAgJy0gU2VlIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMzOTg2I3NlY3Rpb24tMy4xJyxcbiAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgIGBQcm92aWRlZCB2YWx1ZTogJHtzY2hlbWV9YCxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IHN0YXRlbWVudCA9IHZhbHVlLnN0YXRlbWVudDtcbiAgICAgICAgaWYgKHN0YXRlbWVudD8uaW5jbHVkZXMoJ1xcbicpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRNZXNzYWdlRmllbGRFcnJvcih7XG4gICAgICAgICAgICAgICAgZmllbGQ6ICdzdGF0ZW1lbnQnLFxuICAgICAgICAgICAgICAgIG1ldGFNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgICAgICBcIi0gU3RhdGVtZW50IG11c3Qgbm90IGluY2x1ZGUgJ1xcXFxuJy5cIixcbiAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgIGBQcm92aWRlZCB2YWx1ZTogJHtzdGF0ZW1lbnR9YCxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIENvbnN0cnVjdCBtZXNzYWdlXG4gICAgY29uc3QgYWRkcmVzcyA9IEFkZHJlc3MuZnJvbSh2YWx1ZS5hZGRyZXNzLCB7IGNoZWNrc3VtOiB0cnVlIH0pO1xuICAgIGNvbnN0IG9yaWdpbiA9ICgoKSA9PiB7XG4gICAgICAgIGlmIChzY2hlbWUpXG4gICAgICAgICAgICByZXR1cm4gYCR7c2NoZW1lfTovLyR7ZG9tYWlufWA7XG4gICAgICAgIHJldHVybiBkb21haW47XG4gICAgfSkoKTtcbiAgICBjb25zdCBzdGF0ZW1lbnQgPSAoKCkgPT4ge1xuICAgICAgICBpZiAoIXZhbHVlLnN0YXRlbWVudClcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlLnN0YXRlbWVudH1cXG5gO1xuICAgIH0pKCk7XG4gICAgY29uc3QgcHJlZml4ID0gYCR7b3JpZ2lufSB3YW50cyB5b3UgdG8gc2lnbiBpbiB3aXRoIHlvdXIgRXRoZXJldW0gYWNjb3VudDpcXG4ke2FkZHJlc3N9XFxuXFxuJHtzdGF0ZW1lbnR9YDtcbiAgICBsZXQgc3VmZml4ID0gYFVSSTogJHt1cml9XFxuVmVyc2lvbjogJHt2ZXJzaW9ufVxcbkNoYWluIElEOiAke2NoYWluSWR9XFxuTm9uY2U6ICR7bm9uY2V9XFxuSXNzdWVkIEF0OiAke2lzc3VlZEF0LnRvSVNPU3RyaW5nKCl9YDtcbiAgICBpZiAoZXhwaXJhdGlvblRpbWUpXG4gICAgICAgIHN1ZmZpeCArPSBgXFxuRXhwaXJhdGlvbiBUaW1lOiAke2V4cGlyYXRpb25UaW1lLnRvSVNPU3RyaW5nKCl9YDtcbiAgICBpZiAobm90QmVmb3JlKVxuICAgICAgICBzdWZmaXggKz0gYFxcbk5vdCBCZWZvcmU6ICR7bm90QmVmb3JlLnRvSVNPU3RyaW5nKCl9YDtcbiAgICBpZiAocmVxdWVzdElkKVxuICAgICAgICBzdWZmaXggKz0gYFxcblJlcXVlc3QgSUQ6ICR7cmVxdWVzdElkfWA7XG4gICAgaWYgKHJlc291cmNlcykge1xuICAgICAgICBsZXQgY29udGVudCA9ICdcXG5SZXNvdXJjZXM6JztcbiAgICAgICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcbiAgICAgICAgICAgIGlmICghaXNVcmkocmVzb3VyY2UpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkTWVzc2FnZUZpZWxkRXJyb3Ioe1xuICAgICAgICAgICAgICAgICAgICBmaWVsZDogJ3Jlc291cmNlcycsXG4gICAgICAgICAgICAgICAgICAgIG1ldGFNZXNzYWdlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgJy0gRXZlcnkgcmVzb3VyY2UgbXVzdCBiZSBhIFJGQyAzOTg2IFVSSS4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJy0gU2VlIGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMzOTg2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYFByb3ZpZGVkIHZhbHVlOiAke3Jlc291cmNlfWAsXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb250ZW50ICs9IGBcXG4tICR7cmVzb3VyY2V9YDtcbiAgICAgICAgfVxuICAgICAgICBzdWZmaXggKz0gY29udGVudDtcbiAgICB9XG4gICAgcmV0dXJuIGAke3ByZWZpeH1cXG4ke3N1ZmZpeH1gO1xufVxuLyoqXG4gKiBHZW5lcmF0ZXMgcmFuZG9tIFtFSVAtNDM2MV0oaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC00MzYxKSBub25jZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IFNpd2UgfSBmcm9tICdveCdcbiAqXG4gKiBTaXdlLmdlbmVyYXRlTm9uY2UoKVxuICogLy8gQGxvZzogJzY1ZWQ0NjgxZDRlZmUwMjcwYjkyM2ZmNWY0YjA5N2IxYzk1OTc0ZGMzM2FlZWJlY2Q1NzI0YzQyZmQ4NmRmZDI1ZGM3MGIyN2VmODM2YjJhYTIyZTY4ZjE5ZWJjY2NjMSdcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIFJhbmRvbSBub25jZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlTm9uY2UoKSB7XG4gICAgcmV0dXJuIHVpZCg5Nik7XG59XG4vKipcbiAqIENoZWNrIGlmIHRoZSBnaXZlbiBVUkkgaXMgYSB2YWxpZCBbUkZDIDM5ODZdKGh0dHBzOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMzOTg2KSBVUkkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBTaXdlIH0gZnJvbSAnb3gnXG4gKlxuICogU2l3ZS5pc1VyaSgnaHR0cHM6Ly9leGFtcGxlLmNvbS9mb28nKVxuICogLy8gQGxvZzogdHJ1ZVxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgZmFsc2VgIGlmIGludmFsaWQsIG90aGVyd2lzZSB0aGUgdmFsaWQgVVJJLlxuICovXG4vLyBiYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vb2d0L3ZhbGlkLXVybFxuZXhwb3J0IGZ1bmN0aW9uIGlzVXJpKHZhbHVlKSB7XG4gICAgLy8gY2hlY2sgZm9yIGlsbGVnYWwgY2hhcmFjdGVyc1xuICAgIGlmICgvW15hLXowLTlcXDpcXC9cXD9cXCNcXFtcXF1cXEBcXCFcXCRcXCZcXCdcXChcXClcXCpcXCtcXCxcXDtcXD1cXC5cXC1cXF9cXH5cXCVdL2kudGVzdCh2YWx1ZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBjaGVjayBmb3IgaGV4IGVzY2FwZXMgdGhhdCBhcmVuJ3QgY29tcGxldGVcbiAgICBpZiAoLyVbXjAtOWEtZl0vaS50ZXN0KHZhbHVlKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGlmICgvJVswLTlhLWZdKDo/W14wLTlhLWZdfCQpL2kudGVzdCh2YWx1ZSkpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAvLyBmcm9tIFJGQyAzOTg2XG4gICAgY29uc3Qgc3BsaXR0ZWQgPSBzcGxpdFVyaSh2YWx1ZSk7XG4gICAgY29uc3Qgc2NoZW1lID0gc3BsaXR0ZWRbMV07XG4gICAgY29uc3QgYXV0aG9yaXR5ID0gc3BsaXR0ZWRbMl07XG4gICAgY29uc3QgcGF0aCA9IHNwbGl0dGVkWzNdO1xuICAgIGNvbnN0IHF1ZXJ5ID0gc3BsaXR0ZWRbNF07XG4gICAgY29uc3QgZnJhZ21lbnQgPSBzcGxpdHRlZFs1XTtcbiAgICAvLyBzY2hlbWUgYW5kIHBhdGggYXJlIHJlcXVpcmVkLCB0aG91Z2ggdGhlIHBhdGggY2FuIGJlIGVtcHR5XG4gICAgaWYgKCEoc2NoZW1lPy5sZW5ndGggJiYgcGF0aCAmJiBwYXRoLmxlbmd0aCA+PSAwKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIC8vIGlmIGF1dGhvcml0eSBpcyBwcmVzZW50LCB0aGUgcGF0aCBtdXN0IGJlIGVtcHR5IG9yIGJlZ2luIHdpdGggYSAvXG4gICAgaWYgKGF1dGhvcml0eT8ubGVuZ3RoKSB7XG4gICAgICAgIGlmICghKHBhdGgubGVuZ3RoID09PSAwIHx8IC9eXFwvLy50ZXN0KHBhdGgpKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIGlmIGF1dGhvcml0eSBpcyBub3QgcHJlc2VudCwgdGhlIHBhdGggbXVzdCBub3Qgc3RhcnQgd2l0aCAvL1xuICAgICAgICBpZiAoL15cXC9cXC8vLnRlc3QocGF0aCkpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIHNjaGVtZSBtdXN0IGJlZ2luIHdpdGggYSBsZXR0ZXIsIHRoZW4gY29uc2lzdCBvZiBsZXR0ZXJzLCBkaWdpdHMsICssIC4sIG9yIC1cbiAgICBpZiAoIS9eW2Etel1bYS16MC05XFwrXFwtXFwuXSokLy50ZXN0KHNjaGVtZS50b0xvd2VyQ2FzZSgpKSlcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBvdXQgPSAnJztcbiAgICAvLyByZS1hc3NlbWJsZSB0aGUgVVJMIHBlciBzZWN0aW9uIDUuMyBpbiBSRkMgMzk4NlxuICAgIG91dCArPSBgJHtzY2hlbWV9OmA7XG4gICAgaWYgKGF1dGhvcml0eT8ubGVuZ3RoKVxuICAgICAgICBvdXQgKz0gYC8vJHthdXRob3JpdHl9YDtcbiAgICBvdXQgKz0gcGF0aDtcbiAgICBpZiAocXVlcnk/Lmxlbmd0aClcbiAgICAgICAgb3V0ICs9IGA/JHtxdWVyeX1gO1xuICAgIGlmIChmcmFnbWVudD8ubGVuZ3RoKVxuICAgICAgICBvdXQgKz0gYCMke2ZyYWdtZW50fWA7XG4gICAgcmV0dXJuIG91dDtcbn1cbmZ1bmN0aW9uIHNwbGl0VXJpKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hdGNoKC8oPzooW146XFwvPyNdKyk6KT8oPzpcXC9cXC8oW15cXC8/I10qKSk/KFtePyNdKikoPzpcXD8oW14jXSopKT8oPzojKC4qKSk/Lyk7XG59XG4vKipcbiAqIFtFSVAtNDM2MV0oaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC00MzYxKSBmb3JtYXR0ZWQgbWVzc2FnZSBpbnRvIG1lc3NhZ2UgZmllbGRzIG9iamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHMgdHdvc2xhc2hcbiAqIGltcG9ydCB7IFNpd2UgfSBmcm9tICdveCdcbiAqXG4gKiBTaXdlLnBhcnNlTWVzc2FnZShgZXhhbXBsZS5jb20gd2FudHMgeW91IHRvIHNpZ24gaW4gd2l0aCB5b3VyIEV0aGVyZXVtIGFjY291bnQ6XG4gKiAweEEwQ2Y3OTg4MTZENGI5Yjk4NjZiNTMzMEVFYTQ2YTE4MzgyZjI1MWVcbiAqXG4gKiBJIGFjY2VwdCB0aGUgRXhhbXBsZU9yZyBUZXJtcyBvZiBTZXJ2aWNlOiBodHRwczovL2V4YW1wbGUuY29tL3Rvc1xuICpcbiAqIFVSSTogaHR0cHM6Ly9leGFtcGxlLmNvbS9wYXRoXG4gKiBWZXJzaW9uOiAxXG4gKiBDaGFpbiBJRDogMVxuICogTm9uY2U6IGZvb2JhcmJhelxuICogSXNzdWVkIEF0OiAyMDIzLTAyLTAxVDAwOjAwOjAwLjAwMFpgKVxuICogLy8gQGxvZzoge1xuICogLy8gQGxvZzogICBhZGRyZXNzOiAnMHhBMENmNzk4ODE2RDRiOWI5ODY2YjUzMzBFRWE0NmExODM4MmYyNTFlJyxcbiAqIC8vIEBsb2c6ICAgY2hhaW5JZDogMSxcbiAqIC8vIEBsb2c6ICAgZG9tYWluOiAnZXhhbXBsZS5jb20nLFxuICogLy8gQGxvZzogICBpc3N1ZWRBdDogJzIwMjMtMDItMDFUMDA6MDA6MDAuMDAwWicsXG4gKiAvLyBAbG9nOiAgIG5vbmNlOiAnZm9vYmFyYmF6JyxcbiAqIC8vIEBsb2c6ICAgc3RhdGVtZW50OiAnSSBhY2NlcHQgdGhlIEV4YW1wbGVPcmcgVGVybXMgb2YgU2VydmljZTogaHR0cHM6Ly9leGFtcGxlLmNvbS90b3MnLFxuICogLy8gQGxvZzogICB1cmk6ICdodHRwczovL2V4YW1wbGUuY29tL3BhdGgnLFxuICogLy8gQGxvZzogICB2ZXJzaW9uOiAnMScsXG4gKiAvLyBAbG9nOiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbWVzc2FnZSAtIFtFSVAtNDM2MV0oaHR0cHM6Ly9laXBzLmV0aGVyZXVtLm9yZy9FSVBTL2VpcC00MzYxKSBmb3JtYXR0ZWQgbWVzc2FnZS5cbiAqIEByZXR1cm5zIE1lc3NhZ2UgZmllbGRzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTWVzc2FnZShtZXNzYWdlKSB7XG4gICAgY29uc3QgeyBzY2hlbWUsIHN0YXRlbWVudCwgLi4ucHJlZml4IH0gPSAobWVzc2FnZS5tYXRjaChwcmVmaXhSZWdleClcbiAgICAgICAgPy5ncm91cHMgPz8ge30pO1xuICAgIGNvbnN0IHsgY2hhaW5JZCwgZXhwaXJhdGlvblRpbWUsIGlzc3VlZEF0LCBub3RCZWZvcmUsIHJlcXVlc3RJZCwgLi4uc3VmZml4IH0gPSAobWVzc2FnZS5tYXRjaChzdWZmaXhSZWdleCk/Lmdyb3VwcyA/PyB7fSk7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gbWVzc2FnZS5zcGxpdCgnUmVzb3VyY2VzOicpWzFdPy5zcGxpdCgnXFxuLSAnKS5zbGljZSgxKTtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5wcmVmaXgsXG4gICAgICAgIC4uLnN1ZmZpeCxcbiAgICAgICAgLi4uKGNoYWluSWQgPyB7IGNoYWluSWQ6IE51bWJlcihjaGFpbklkKSB9IDoge30pLFxuICAgICAgICAuLi4oZXhwaXJhdGlvblRpbWUgPyB7IGV4cGlyYXRpb25UaW1lOiBuZXcgRGF0ZShleHBpcmF0aW9uVGltZSkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGlzc3VlZEF0ID8geyBpc3N1ZWRBdDogbmV3IERhdGUoaXNzdWVkQXQpIH0gOiB7fSksXG4gICAgICAgIC4uLihub3RCZWZvcmUgPyB7IG5vdEJlZm9yZTogbmV3IERhdGUobm90QmVmb3JlKSB9IDoge30pLFxuICAgICAgICAuLi4ocmVxdWVzdElkID8geyByZXF1ZXN0SWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlc291cmNlcyA/IHsgcmVzb3VyY2VzIH0gOiB7fSksXG4gICAgICAgIC4uLihzY2hlbWUgPyB7IHNjaGVtZSB9IDoge30pLFxuICAgICAgICAuLi4oc3RhdGVtZW50ID8geyBzdGF0ZW1lbnQgfSA6IHt9KSxcbiAgICB9O1xufVxuLyoqXG4gKiBWYWxpZGF0ZXMgW0VJUC00MzYxXShodHRwczovL2VpcHMuZXRoZXJldW0ub3JnL0VJUFMvZWlwLTQzNjEpIG1lc3NhZ2UuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBTaXdlIH0gZnJvbSAnb3gnXG4gKlxuICogU2l3ZS52YWxpZGF0ZU1lc3NhZ2Uoe1xuICogICBhZGRyZXNzOiAnMHhBMENmNzk4ODE2RDRiOWI5ODY2YjUzMzBFRWE0NmExODM4MmYyNTFlJyxcbiAqICAgZG9tYWluOiAnZXhhbXBsZS5jb20nLFxuICogICBtZXNzYWdlOiB7XG4gKiAgICAgYWRkcmVzczogJzB4QTBDZjc5ODgxNkQ0YjliOTg2NmI1MzMwRUVhNDZhMTgzODJmMjUxZScsXG4gKiAgICAgY2hhaW5JZDogMSxcbiAqICAgICBkb21haW46ICdleGFtcGxlLmNvbScsXG4gKiAgICAgbm9uY2U6ICdmb29iYXJiYXonLFxuICogICAgIHVyaTogJ2h0dHBzOi8vZXhhbXBsZS5jb20vcGF0aCcsXG4gKiAgICAgdmVyc2lvbjogJzEnLFxuICogICB9LFxuICogICBub25jZTogJ2Zvb2JhcmJheicsXG4gKiB9KVxuICogLy8gQGxvZzogdHJ1ZVxuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVmFsdWVzIHRvIHVzZSB3aGVuIHZhbGlkYXRpbmcgRUlQLTQzNjEgZm9ybWF0dGVkIG1lc3NhZ2UuXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBtZXNzYWdlIGlzIHZhbGlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVNZXNzYWdlKHZhbHVlKSB7XG4gICAgY29uc3QgeyBhZGRyZXNzLCBkb21haW4sIG1lc3NhZ2UsIG5vbmNlLCBzY2hlbWUsIHRpbWUgPSBuZXcgRGF0ZSgpIH0gPSB2YWx1ZTtcbiAgICBpZiAoZG9tYWluICYmIG1lc3NhZ2UuZG9tYWluICE9PSBkb21haW4pXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAobm9uY2UgJiYgbWVzc2FnZS5ub25jZSAhPT0gbm9uY2UpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAoc2NoZW1lICYmIG1lc3NhZ2Uuc2NoZW1lICE9PSBzY2hlbWUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAobWVzc2FnZS5leHBpcmF0aW9uVGltZSAmJiB0aW1lID49IG1lc3NhZ2UuZXhwaXJhdGlvblRpbWUpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICBpZiAobWVzc2FnZS5ub3RCZWZvcmUgJiYgdGltZSA8IG1lc3NhZ2Uubm90QmVmb3JlKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLmFkZHJlc3MpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChhZGRyZXNzICYmICFBZGRyZXNzLmlzRXF1YWwobWVzc2FnZS5hZGRyZXNzLCBhZGRyZXNzKSlcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIGZpZWxkIGluIGEgU0lXRSBNZXNzYWdlIGlzIGludmFsaWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzIHR3b3NsYXNoXG4gKiBpbXBvcnQgeyBTaXdlIH0gZnJvbSAnb3gnXG4gKlxuICogU2l3ZS5jcmVhdGVNZXNzYWdlKHtcbiAqICAgYWRkcmVzczogJzB4QTBDZjc5ODgxNkQ0YjliOTg2NmI1MzMwRUVhNDZhMTgzODJmMjUxZScsXG4gKiAgIGNoYWluSWQ6IDEuMSxcbiAqICAgZG9tYWluOiAnZXhhbXBsZS5jb20nLFxuICogICBub25jZTogJ2Zvb2JhcmJheicsXG4gKiAgIHVyaTogJ2h0dHBzOi8vZXhhbXBsZS5jb20vcGF0aCcsXG4gKiAgIHZlcnNpb246ICcxJyxcbiAqIH0pXG4gKiAvLyBAZXJyb3I6IFNpd2UuSW52YWxpZE1lc3NhZ2VGaWVsZEVycm9yOiBJbnZhbGlkIFNpZ24tSW4gd2l0aCBFdGhlcmV1bSBtZXNzYWdlIGZpZWxkIFwiY2hhaW5JZFwiLlxuICogLy8gQGVycm9yOiAtIENoYWluIElEIG11c3QgYmUgYSBFSVAtMTU1IGNoYWluIElELlxuICogLy8gQGVycm9yOiAtIFNlZSBodHRwczovL2VpcHMuZXRoZXJldW0ub3JnL0VJUFMvZWlwLTE1NVxuICogLy8gQGVycm9yOiBQcm92aWRlZCB2YWx1ZTogMS4xXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEludmFsaWRNZXNzYWdlRmllbGRFcnJvciBleHRlbmRzIEVycm9ycy5CYXNlRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKHBhcmFtZXRlcnMpIHtcbiAgICAgICAgY29uc3QgeyBmaWVsZCwgbWV0YU1lc3NhZ2VzIH0gPSBwYXJhbWV0ZXJzO1xuICAgICAgICBzdXBlcihgSW52YWxpZCBTaWduLUluIHdpdGggRXRoZXJldW0gbWVzc2FnZSBmaWVsZCBcIiR7ZmllbGR9XCIuYCwge1xuICAgICAgICAgICAgbWV0YU1lc3NhZ2VzLFxuICAgICAgICB9KTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibmFtZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogJ1Npd2UuSW52YWxpZE1lc3NhZ2VGaWVsZEVycm9yJ1xuICAgICAgICB9KTtcbiAgICB9XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1TaXdlLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/Siwe.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/internal/bytes.js":
/*!*****************************************************!*\
  !*** ./node_modules/ox/_esm/core/internal/bytes.js ***!
  \*****************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   assertEndOffset: () => (/* binding */ assertEndOffset),\n/* harmony export */   assertSize: () => (/* binding */ assertSize),\n/* harmony export */   assertStartOffset: () => (/* binding */ assertStartOffset),\n/* harmony export */   charCodeMap: () => (/* binding */ charCodeMap),\n/* harmony export */   charCodeToBase16: () => (/* binding */ charCodeToBase16),\n/* harmony export */   pad: () => (/* binding */ pad),\n/* harmony export */   trim: () => (/* binding */ trim)\n/* harmony export */ });\n/* harmony import */ var _Bytes_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Bytes.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Bytes.js\");\n\n/** @internal */\nfunction assertSize(bytes, size_) {\n    if (_Bytes_js__WEBPACK_IMPORTED_MODULE_0__.size(bytes) > size_)\n        throw new _Bytes_js__WEBPACK_IMPORTED_MODULE_0__.SizeOverflowError({\n            givenSize: _Bytes_js__WEBPACK_IMPORTED_MODULE_0__.size(bytes),\n            maxSize: size_,\n        });\n}\n/** @internal */\nfunction assertStartOffset(value, start) {\n    if (typeof start === 'number' && start > 0 && start > _Bytes_js__WEBPACK_IMPORTED_MODULE_0__.size(value) - 1)\n        throw new _Bytes_js__WEBPACK_IMPORTED_MODULE_0__.SliceOffsetOutOfBoundsError({\n            offset: start,\n            position: 'start',\n            size: _Bytes_js__WEBPACK_IMPORTED_MODULE_0__.size(value),\n        });\n}\n/** @internal */\nfunction assertEndOffset(value, start, end) {\n    if (typeof start === 'number' &&\n        typeof end === 'number' &&\n        _Bytes_js__WEBPACK_IMPORTED_MODULE_0__.size(value) !== end - start) {\n        throw new _Bytes_js__WEBPACK_IMPORTED_MODULE_0__.SliceOffsetOutOfBoundsError({\n            offset: end,\n            position: 'end',\n            size: _Bytes_js__WEBPACK_IMPORTED_MODULE_0__.size(value),\n        });\n    }\n}\n/** @internal */\nconst charCodeMap = {\n    zero: 48,\n    nine: 57,\n    A: 65,\n    F: 70,\n    a: 97,\n    f: 102,\n};\n/** @internal */\nfunction charCodeToBase16(char) {\n    if (char >= charCodeMap.zero && char <= charCodeMap.nine)\n        return char - charCodeMap.zero;\n    if (char >= charCodeMap.A && char <= charCodeMap.F)\n        return char - (charCodeMap.A - 10);\n    if (char >= charCodeMap.a && char <= charCodeMap.f)\n        return char - (charCodeMap.a - 10);\n    return undefined;\n}\n/** @internal */\nfunction pad(bytes, options = {}) {\n    const { dir, size = 32 } = options;\n    if (size === 0)\n        return bytes;\n    if (bytes.length > size)\n        throw new _Bytes_js__WEBPACK_IMPORTED_MODULE_0__.SizeExceedsPaddingSizeError({\n            size: bytes.length,\n            targetSize: size,\n            type: 'Bytes',\n        });\n    const paddedBytes = new Uint8Array(size);\n    for (let i = 0; i < size; i++) {\n        const padEnd = dir === 'right';\n        paddedBytes[padEnd ? i : size - i - 1] =\n            bytes[padEnd ? i : bytes.length - i - 1];\n    }\n    return paddedBytes;\n}\n/** @internal */\nfunction trim(value, options = {}) {\n    const { dir = 'left' } = options;\n    let data = value;\n    let sliceLength = 0;\n    for (let i = 0; i < data.length - 1; i++) {\n        if (data[dir === 'left' ? i : data.length - i - 1].toString() === '0')\n            sliceLength++;\n        else\n            break;\n    }\n    data =\n        dir === 'left'\n            ? data.slice(sliceLength)\n            : data.slice(0, data.length - sliceLength);\n    return data;\n}\n//# sourceMappingURL=bytes.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvaW50ZXJuYWwvYnl0ZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBcUM7QUFDckM7QUFDTztBQUNQLFFBQVEsMkNBQVU7QUFDbEIsa0JBQWtCLHdEQUF1QjtBQUN6Qyx1QkFBdUIsMkNBQVU7QUFDakM7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNPO0FBQ1AsMERBQTBELDJDQUFVO0FBQ3BFLGtCQUFrQixrRUFBaUM7QUFDbkQ7QUFDQTtBQUNBLGtCQUFrQiwyQ0FBVTtBQUM1QixTQUFTO0FBQ1Q7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLFFBQVEsMkNBQVU7QUFDbEIsa0JBQWtCLGtFQUFpQztBQUNuRDtBQUNBO0FBQ0Esa0JBQWtCLDJDQUFVO0FBQzVCLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLGdDQUFnQztBQUN2QyxZQUFZLGlCQUFpQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isa0VBQWlDO0FBQ25EO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLG9CQUFvQixVQUFVO0FBQzlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08saUNBQWlDO0FBQ3hDLFlBQVksZUFBZTtBQUMzQjtBQUNBO0FBQ0Esb0JBQW9CLHFCQUFxQjtBQUN6QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvb3gvX2VzbS9jb3JlL2ludGVybmFsL2J5dGVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEJ5dGVzIGZyb20gJy4uL0J5dGVzLmpzJztcbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTaXplKGJ5dGVzLCBzaXplXykge1xuICAgIGlmIChCeXRlcy5zaXplKGJ5dGVzKSA+IHNpemVfKVxuICAgICAgICB0aHJvdyBuZXcgQnl0ZXMuU2l6ZU92ZXJmbG93RXJyb3Ioe1xuICAgICAgICAgICAgZ2l2ZW5TaXplOiBCeXRlcy5zaXplKGJ5dGVzKSxcbiAgICAgICAgICAgIG1heFNpemU6IHNpemVfLFxuICAgICAgICB9KTtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTdGFydE9mZnNldCh2YWx1ZSwgc3RhcnQpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnbnVtYmVyJyAmJiBzdGFydCA+IDAgJiYgc3RhcnQgPiBCeXRlcy5zaXplKHZhbHVlKSAtIDEpXG4gICAgICAgIHRocm93IG5ldyBCeXRlcy5TbGljZU9mZnNldE91dE9mQm91bmRzRXJyb3Ioe1xuICAgICAgICAgICAgb2Zmc2V0OiBzdGFydCxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnc3RhcnQnLFxuICAgICAgICAgICAgc2l6ZTogQnl0ZXMuc2l6ZSh2YWx1ZSksXG4gICAgICAgIH0pO1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEVuZE9mZnNldCh2YWx1ZSwgc3RhcnQsIGVuZCkge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdudW1iZXInICYmXG4gICAgICAgIHR5cGVvZiBlbmQgPT09ICdudW1iZXInICYmXG4gICAgICAgIEJ5dGVzLnNpemUodmFsdWUpICE9PSBlbmQgLSBzdGFydCkge1xuICAgICAgICB0aHJvdyBuZXcgQnl0ZXMuU2xpY2VPZmZzZXRPdXRPZkJvdW5kc0Vycm9yKHtcbiAgICAgICAgICAgIG9mZnNldDogZW5kLFxuICAgICAgICAgICAgcG9zaXRpb246ICdlbmQnLFxuICAgICAgICAgICAgc2l6ZTogQnl0ZXMuc2l6ZSh2YWx1ZSksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCBjaGFyQ29kZU1hcCA9IHtcbiAgICB6ZXJvOiA0OCxcbiAgICBuaW5lOiA1NyxcbiAgICBBOiA2NSxcbiAgICBGOiA3MCxcbiAgICBhOiA5NyxcbiAgICBmOiAxMDIsXG59O1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYXJDb2RlVG9CYXNlMTYoY2hhcikge1xuICAgIGlmIChjaGFyID49IGNoYXJDb2RlTWFwLnplcm8gJiYgY2hhciA8PSBjaGFyQ29kZU1hcC5uaW5lKVxuICAgICAgICByZXR1cm4gY2hhciAtIGNoYXJDb2RlTWFwLnplcm87XG4gICAgaWYgKGNoYXIgPj0gY2hhckNvZGVNYXAuQSAmJiBjaGFyIDw9IGNoYXJDb2RlTWFwLkYpXG4gICAgICAgIHJldHVybiBjaGFyIC0gKGNoYXJDb2RlTWFwLkEgLSAxMCk7XG4gICAgaWYgKGNoYXIgPj0gY2hhckNvZGVNYXAuYSAmJiBjaGFyIDw9IGNoYXJDb2RlTWFwLmYpXG4gICAgICAgIHJldHVybiBjaGFyIC0gKGNoYXJDb2RlTWFwLmEgLSAxMCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBmdW5jdGlvbiBwYWQoYnl0ZXMsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgZGlyLCBzaXplID0gMzIgfSA9IG9wdGlvbnM7XG4gICAgaWYgKHNpemUgPT09IDApXG4gICAgICAgIHJldHVybiBieXRlcztcbiAgICBpZiAoYnl0ZXMubGVuZ3RoID4gc2l6ZSlcbiAgICAgICAgdGhyb3cgbmV3IEJ5dGVzLlNpemVFeGNlZWRzUGFkZGluZ1NpemVFcnJvcih7XG4gICAgICAgICAgICBzaXplOiBieXRlcy5sZW5ndGgsXG4gICAgICAgICAgICB0YXJnZXRTaXplOiBzaXplLFxuICAgICAgICAgICAgdHlwZTogJ0J5dGVzJyxcbiAgICAgICAgfSk7XG4gICAgY29uc3QgcGFkZGVkQnl0ZXMgPSBuZXcgVWludDhBcnJheShzaXplKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICBjb25zdCBwYWRFbmQgPSBkaXIgPT09ICdyaWdodCc7XG4gICAgICAgIHBhZGRlZEJ5dGVzW3BhZEVuZCA/IGkgOiBzaXplIC0gaSAtIDFdID1cbiAgICAgICAgICAgIGJ5dGVzW3BhZEVuZCA/IGkgOiBieXRlcy5sZW5ndGggLSBpIC0gMV07XG4gICAgfVxuICAgIHJldHVybiBwYWRkZWRCeXRlcztcbn1cbi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmltKHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGRpciA9ICdsZWZ0JyB9ID0gb3B0aW9ucztcbiAgICBsZXQgZGF0YSA9IHZhbHVlO1xuICAgIGxldCBzbGljZUxlbmd0aCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICBpZiAoZGF0YVtkaXIgPT09ICdsZWZ0JyA/IGkgOiBkYXRhLmxlbmd0aCAtIGkgLSAxXS50b1N0cmluZygpID09PSAnMCcpXG4gICAgICAgICAgICBzbGljZUxlbmd0aCsrO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBicmVhaztcbiAgICB9XG4gICAgZGF0YSA9XG4gICAgICAgIGRpciA9PT0gJ2xlZnQnXG4gICAgICAgICAgICA/IGRhdGEuc2xpY2Uoc2xpY2VMZW5ndGgpXG4gICAgICAgICAgICA6IGRhdGEuc2xpY2UoMCwgZGF0YS5sZW5ndGggLSBzbGljZUxlbmd0aCk7XG4gICAgcmV0dXJuIGRhdGE7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1ieXRlcy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/internal/bytes.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/internal/errors.js":
/*!******************************************************!*\
  !*** ./node_modules/ox/_esm/core/internal/errors.js ***!
  \******************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   getUrl: () => (/* binding */ getUrl),\n/* harmony export */   getVersion: () => (/* binding */ getVersion),\n/* harmony export */   prettyPrint: () => (/* binding */ prettyPrint)\n/* harmony export */ });\n/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../version.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/version.js\");\n\n/** @internal */\nfunction getUrl(url) {\n    return url;\n}\n/** @internal */\nfunction getVersion() {\n    return _version_js__WEBPACK_IMPORTED_MODULE_0__.version;\n}\n/** @internal */\nfunction prettyPrint(args) {\n    if (!args)\n        return '';\n    const entries = Object.entries(args)\n        .map(([key, value]) => {\n        if (value === undefined || value === false)\n            return null;\n        return [key, value];\n    })\n        .filter(Boolean);\n    const maxLength = entries.reduce((acc, [key]) => Math.max(acc, key.length), 0);\n    return entries\n        .map(([key, value]) => `  ${`${key}:`.padEnd(maxLength + 1)}  ${value}`)\n        .join('\\n');\n}\n//# sourceMappingURL=errors.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvaW50ZXJuYWwvZXJyb3JzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBd0M7QUFDeEM7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNPO0FBQ1AsV0FBVyxnREFBTztBQUNsQjtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxvQ0FBb0MsR0FBRyxJQUFJLDJCQUEyQixFQUFFLE1BQU07QUFDOUU7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL294L19lc20vY29yZS9pbnRlcm5hbC9lcnJvcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVybCh1cmwpIHtcbiAgICByZXR1cm4gdXJsO1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZlcnNpb24oKSB7XG4gICAgcmV0dXJuIHZlcnNpb247XG59XG4vKiogQGludGVybmFsICovXG5leHBvcnQgZnVuY3Rpb24gcHJldHR5UHJpbnQoYXJncykge1xuICAgIGlmICghYXJncylcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhhcmdzKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IGZhbHNlKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBba2V5LCB2YWx1ZV07XG4gICAgfSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBtYXhMZW5ndGggPSBlbnRyaWVzLnJlZHVjZSgoYWNjLCBba2V5XSkgPT4gTWF0aC5tYXgoYWNjLCBrZXkubGVuZ3RoKSwgMCk7XG4gICAgcmV0dXJuIGVudHJpZXNcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiBgICAke2Ake2tleX06YC5wYWRFbmQobWF4TGVuZ3RoICsgMSl9ICAke3ZhbHVlfWApXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWVycm9ycy5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/internal/errors.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/internal/hex.js":
/*!***************************************************!*\
  !*** ./node_modules/ox/_esm/core/internal/hex.js ***!
  \***************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   assertEndOffset: () => (/* binding */ assertEndOffset),\n/* harmony export */   assertSize: () => (/* binding */ assertSize),\n/* harmony export */   assertStartOffset: () => (/* binding */ assertStartOffset),\n/* harmony export */   pad: () => (/* binding */ pad),\n/* harmony export */   trim: () => (/* binding */ trim)\n/* harmony export */ });\n/* harmony import */ var _Hex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Hex.js */ \"(app-pages-browser)/./node_modules/ox/_esm/core/Hex.js\");\n\n/** @internal */\nfunction assertSize(hex, size_) {\n    if (_Hex_js__WEBPACK_IMPORTED_MODULE_0__.size(hex) > size_)\n        throw new _Hex_js__WEBPACK_IMPORTED_MODULE_0__.SizeOverflowError({\n            givenSize: _Hex_js__WEBPACK_IMPORTED_MODULE_0__.size(hex),\n            maxSize: size_,\n        });\n}\n/** @internal */\nfunction assertStartOffset(value, start) {\n    if (typeof start === 'number' && start > 0 && start > _Hex_js__WEBPACK_IMPORTED_MODULE_0__.size(value) - 1)\n        throw new _Hex_js__WEBPACK_IMPORTED_MODULE_0__.SliceOffsetOutOfBoundsError({\n            offset: start,\n            position: 'start',\n            size: _Hex_js__WEBPACK_IMPORTED_MODULE_0__.size(value),\n        });\n}\n/** @internal */\nfunction assertEndOffset(value, start, end) {\n    if (typeof start === 'number' &&\n        typeof end === 'number' &&\n        _Hex_js__WEBPACK_IMPORTED_MODULE_0__.size(value) !== end - start) {\n        throw new _Hex_js__WEBPACK_IMPORTED_MODULE_0__.SliceOffsetOutOfBoundsError({\n            offset: end,\n            position: 'end',\n            size: _Hex_js__WEBPACK_IMPORTED_MODULE_0__.size(value),\n        });\n    }\n}\n/** @internal */\nfunction pad(hex_, options = {}) {\n    const { dir, size = 32 } = options;\n    if (size === 0)\n        return hex_;\n    const hex = hex_.replace('0x', '');\n    if (hex.length > size * 2)\n        throw new _Hex_js__WEBPACK_IMPORTED_MODULE_0__.SizeExceedsPaddingSizeError({\n            size: Math.ceil(hex.length / 2),\n            targetSize: size,\n            type: 'Hex',\n        });\n    return `0x${hex[dir === 'right' ? 'padEnd' : 'padStart'](size * 2, '0')}`;\n}\n/** @internal */\nfunction trim(value, options = {}) {\n    const { dir = 'left' } = options;\n    let data = value.replace('0x', '');\n    let sliceLength = 0;\n    for (let i = 0; i < data.length - 1; i++) {\n        if (data[dir === 'left' ? i : data.length - i - 1].toString() === '0')\n            sliceLength++;\n        else\n            break;\n    }\n    data =\n        dir === 'left'\n            ? data.slice(sliceLength)\n            : data.slice(0, data.length - sliceLength);\n    if (data === '0')\n        return '0x';\n    if (dir === 'right' && data.length % 2 === 1)\n        return `0x${data}0`;\n    return `0x${data}`;\n}\n//# sourceMappingURL=hex.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvaW50ZXJuYWwvaGV4LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFpQztBQUNqQztBQUNPO0FBQ1AsUUFBUSx5Q0FBUTtBQUNoQixrQkFBa0Isc0RBQXFCO0FBQ3ZDLHVCQUF1Qix5Q0FBUTtBQUMvQjtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ087QUFDUCwwREFBMEQseUNBQVE7QUFDbEUsa0JBQWtCLGdFQUErQjtBQUNqRDtBQUNBO0FBQ0Esa0JBQWtCLHlDQUFRO0FBQzFCLFNBQVM7QUFDVDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0EsUUFBUSx5Q0FBUTtBQUNoQixrQkFBa0IsZ0VBQStCO0FBQ2pEO0FBQ0E7QUFDQSxrQkFBa0IseUNBQVE7QUFDMUIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNPLCtCQUErQjtBQUN0QyxZQUFZLGlCQUFpQjtBQUM3QjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixnRUFBK0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULGdCQUFnQiw0REFBNEQ7QUFDNUU7QUFDQTtBQUNPLGlDQUFpQztBQUN4QyxZQUFZLGVBQWU7QUFDM0I7QUFDQTtBQUNBLG9CQUFvQixxQkFBcUI7QUFDekM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esb0JBQW9CLEtBQUs7QUFDekIsZ0JBQWdCLEtBQUs7QUFDckI7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvaW50ZXJuYWwvaGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEhleCBmcm9tICcuLi9IZXguanMnO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNpemUoaGV4LCBzaXplXykge1xuICAgIGlmIChIZXguc2l6ZShoZXgpID4gc2l6ZV8pXG4gICAgICAgIHRocm93IG5ldyBIZXguU2l6ZU92ZXJmbG93RXJyb3Ioe1xuICAgICAgICAgICAgZ2l2ZW5TaXplOiBIZXguc2l6ZShoZXgpLFxuICAgICAgICAgICAgbWF4U2l6ZTogc2l6ZV8sXG4gICAgICAgIH0pO1xufVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFN0YXJ0T2Zmc2V0KHZhbHVlLCBzdGFydCkge1xuICAgIGlmICh0eXBlb2Ygc3RhcnQgPT09ICdudW1iZXInICYmIHN0YXJ0ID4gMCAmJiBzdGFydCA+IEhleC5zaXplKHZhbHVlKSAtIDEpXG4gICAgICAgIHRocm93IG5ldyBIZXguU2xpY2VPZmZzZXRPdXRPZkJvdW5kc0Vycm9yKHtcbiAgICAgICAgICAgIG9mZnNldDogc3RhcnQsXG4gICAgICAgICAgICBwb3NpdGlvbjogJ3N0YXJ0JyxcbiAgICAgICAgICAgIHNpemU6IEhleC5zaXplKHZhbHVlKSxcbiAgICAgICAgfSk7XG59XG4vKiogQGludGVybmFsICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RW5kT2Zmc2V0KHZhbHVlLCBzdGFydCwgZW5kKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgdHlwZW9mIGVuZCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgSGV4LnNpemUodmFsdWUpICE9PSBlbmQgLSBzdGFydCkge1xuICAgICAgICB0aHJvdyBuZXcgSGV4LlNsaWNlT2Zmc2V0T3V0T2ZCb3VuZHNFcnJvcih7XG4gICAgICAgICAgICBvZmZzZXQ6IGVuZCxcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnZW5kJyxcbiAgICAgICAgICAgIHNpemU6IEhleC5zaXplKHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZChoZXhfLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGRpciwgc2l6ZSA9IDMyIH0gPSBvcHRpb25zO1xuICAgIGlmIChzaXplID09PSAwKVxuICAgICAgICByZXR1cm4gaGV4XztcbiAgICBjb25zdCBoZXggPSBoZXhfLnJlcGxhY2UoJzB4JywgJycpO1xuICAgIGlmIChoZXgubGVuZ3RoID4gc2l6ZSAqIDIpXG4gICAgICAgIHRocm93IG5ldyBIZXguU2l6ZUV4Y2VlZHNQYWRkaW5nU2l6ZUVycm9yKHtcbiAgICAgICAgICAgIHNpemU6IE1hdGguY2VpbChoZXgubGVuZ3RoIC8gMiksXG4gICAgICAgICAgICB0YXJnZXRTaXplOiBzaXplLFxuICAgICAgICAgICAgdHlwZTogJ0hleCcsXG4gICAgICAgIH0pO1xuICAgIHJldHVybiBgMHgke2hleFtkaXIgPT09ICdyaWdodCcgPyAncGFkRW5kJyA6ICdwYWRTdGFydCddKHNpemUgKiAyLCAnMCcpfWA7XG59XG4vKiogQGludGVybmFsICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbSh2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBkaXIgPSAnbGVmdCcgfSA9IG9wdGlvbnM7XG4gICAgbGV0IGRhdGEgPSB2YWx1ZS5yZXBsYWNlKCcweCcsICcnKTtcbiAgICBsZXQgc2xpY2VMZW5ndGggPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgaWYgKGRhdGFbZGlyID09PSAnbGVmdCcgPyBpIDogZGF0YS5sZW5ndGggLSBpIC0gMV0udG9TdHJpbmcoKSA9PT0gJzAnKVxuICAgICAgICAgICAgc2xpY2VMZW5ndGgrKztcbiAgICAgICAgZWxzZVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRhdGEgPVxuICAgICAgICBkaXIgPT09ICdsZWZ0J1xuICAgICAgICAgICAgPyBkYXRhLnNsaWNlKHNsaWNlTGVuZ3RoKVxuICAgICAgICAgICAgOiBkYXRhLnNsaWNlKDAsIGRhdGEubGVuZ3RoIC0gc2xpY2VMZW5ndGgpO1xuICAgIGlmIChkYXRhID09PSAnMCcpXG4gICAgICAgIHJldHVybiAnMHgnO1xuICAgIGlmIChkaXIgPT09ICdyaWdodCcgJiYgZGF0YS5sZW5ndGggJSAyID09PSAxKVxuICAgICAgICByZXR1cm4gYDB4JHtkYXRhfTBgO1xuICAgIHJldHVybiBgMHgke2RhdGF9YDtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWhleC5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/internal/hex.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/internal/lru.js":
/*!***************************************************!*\
  !*** ./node_modules/ox/_esm/core/internal/lru.js ***!
  \***************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   LruMap: () => (/* binding */ LruMap)\n/* harmony export */ });\n/**\n * @internal\n *\n * Map with a LRU (Least recently used) policy.\n * @see https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n */\nclass LruMap extends Map {\n    constructor(size) {\n        super();\n        Object.defineProperty(this, \"maxSize\", {\n            enumerable: true,\n            configurable: true,\n            writable: true,\n            value: void 0\n        });\n        this.maxSize = size;\n    }\n    get(key) {\n        const value = super.get(key);\n        if (super.has(key) && value !== undefined) {\n            this.delete(key);\n            super.set(key, value);\n        }\n        return value;\n    }\n    set(key, value) {\n        super.set(key, value);\n        if (this.maxSize && this.size > this.maxSize) {\n            const firstKey = this.keys().next().value;\n            if (firstKey)\n                this.delete(firstKey);\n        }\n        return this;\n    }\n}\n//# sourceMappingURL=lru.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvaW50ZXJuYWwvbHJ1LmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvaW50ZXJuYWwvbHJ1LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGludGVybmFsXG4gKlxuICogTWFwIHdpdGggYSBMUlUgKExlYXN0IHJlY2VudGx5IHVzZWQpIHBvbGljeS5cbiAqIEBzZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2FjaGVfcmVwbGFjZW1lbnRfcG9saWNpZXMjTFJVXG4gKi9cbmV4cG9ydCBjbGFzcyBMcnVNYXAgZXh0ZW5kcyBNYXAge1xuICAgIGNvbnN0cnVjdG9yKHNpemUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIFwibWF4U2l6ZVwiLCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogdm9pZCAwXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1heFNpemUgPSBzaXplO1xuICAgIH1cbiAgICBnZXQoa2V5KSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gc3VwZXIuZ2V0KGtleSk7XG4gICAgICAgIGlmIChzdXBlci5oYXMoa2V5KSAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5tYXhTaXplICYmIHRoaXMuc2l6ZSA+IHRoaXMubWF4U2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RLZXkgPSB0aGlzLmtleXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICAgICAgICBpZiAoZmlyc3RLZXkpXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGUoZmlyc3RLZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWxydS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/internal/lru.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/internal/uid.js":
/*!***************************************************!*\
  !*** ./node_modules/ox/_esm/core/internal/uid.js ***!
  \***************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   uid: () => (/* binding */ uid)\n/* harmony export */ });\nconst size = 256;\nlet index = size;\nlet buffer;\n/** @internal */\nfunction uid(length = 11) {\n    if (!buffer || index + length > size * 2) {\n        buffer = '';\n        index = 0;\n        for (let i = 0; i < size; i++) {\n            buffer += ((256 + Math.random() * 256) | 0).toString(16).substring(1);\n        }\n    }\n    return buffer.substring(index, index++ + length);\n}\n//# sourceMappingURL=uid.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvaW50ZXJuYWwvdWlkLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLFVBQVU7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL294L19lc20vY29yZS9pbnRlcm5hbC91aWQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3Qgc2l6ZSA9IDI1NjtcbmxldCBpbmRleCA9IHNpemU7XG5sZXQgYnVmZmVyO1xuLyoqIEBpbnRlcm5hbCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpZChsZW5ndGggPSAxMSkge1xuICAgIGlmICghYnVmZmVyIHx8IGluZGV4ICsgbGVuZ3RoID4gc2l6ZSAqIDIpIHtcbiAgICAgICAgYnVmZmVyID0gJyc7XG4gICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIGJ1ZmZlciArPSAoKDI1NiArIE1hdGgucmFuZG9tKCkgKiAyNTYpIHwgMCkudG9TdHJpbmcoMTYpLnN1YnN0cmluZygxKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyLnN1YnN0cmluZyhpbmRleCwgaW5kZXgrKyArIGxlbmd0aCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD11aWQuanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/internal/uid.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/ox/_esm/core/version.js":
/*!**********************************************!*\
  !*** ./node_modules/ox/_esm/core/version.js ***!
  \**********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   version: () => (/* binding */ version)\n/* harmony export */ });\n/** @internal */\nconst version = '0.1.1';\n//# sourceMappingURL=version.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9veC9fZXNtL2NvcmUvdmVyc2lvbi5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDTztBQUNQIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL294L19lc20vY29yZS92ZXJzaW9uLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBAaW50ZXJuYWwgKi9cbmV4cG9ydCBjb25zdCB2ZXJzaW9uID0gJzAuMS4xJztcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXZlcnNpb24uanMubWFwIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/ox/_esm/core/version.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/rpc-websockets/dist/index.browser.mjs":
/*!************************************************************!*\
  !*** ./node_modules/rpc-websockets/dist/index.browser.mjs ***!
  \************************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Client: () => (/* binding */ Client),\n/* harmony export */   CommonClient: () => (/* binding */ CommonClient),\n/* harmony export */   DefaultDataPack: () => (/* binding */ DefaultDataPack),\n/* harmony export */   WebSocket: () => (/* binding */ WebSocket)\n/* harmony export */ });\n/* harmony import */ var buffer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! buffer */ \"(app-pages-browser)/./node_modules/buffer/index.js\");\n/* harmony import */ var eventemitter3__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! eventemitter3 */ \"(app-pages-browser)/./node_modules/eventemitter3/index.mjs\");\n\n\n\n// node_modules/esbuild-plugin-polyfill-node/polyfills/buffer.js\nvar WebSocketBrowserImpl = class extends eventemitter3__WEBPACK_IMPORTED_MODULE_1__.EventEmitter {\n  socket;\n  /** Instantiate a WebSocket class\n  * @constructor\n  * @param {String} address - url to a websocket server\n  * @param {(Object)} options - websocket options\n  * @param {(String|Array)} protocols - a list of protocols\n  * @return {WebSocketBrowserImpl} - returns a WebSocket instance\n  */\n  constructor(address, options, protocols) {\n    super();\n    this.socket = new window.WebSocket(address, protocols);\n    this.socket.onopen = () => this.emit(\"open\");\n    this.socket.onmessage = (event) => this.emit(\"message\", event.data);\n    this.socket.onerror = (error) => this.emit(\"error\", error);\n    this.socket.onclose = (event) => {\n      this.emit(\"close\", event.code, event.reason);\n    };\n  }\n  /**\n  * Sends data through a websocket connection\n  * @method\n  * @param {(String|Object)} data - data to be sent via websocket\n  * @param {Object} optionsOrCallback - ws options\n  * @param {Function} callback - a callback called once the data is sent\n  * @return {Undefined}\n  */\n  send(data, optionsOrCallback, callback) {\n    const cb = callback || optionsOrCallback;\n    try {\n      this.socket.send(data);\n      cb();\n    } catch (error) {\n      cb(error);\n    }\n  }\n  /**\n  * Closes an underlying socket\n  * @method\n  * @param {Number} code - status code explaining why the connection is being closed\n  * @param {String} reason - a description why the connection is closing\n  * @return {Undefined}\n  * @throws {Error}\n  */\n  close(code, reason) {\n    this.socket.close(code, reason);\n  }\n  addEventListener(type, listener, options) {\n    this.socket.addEventListener(type, listener, options);\n  }\n};\nfunction WebSocket(address, options) {\n  return new WebSocketBrowserImpl(address, options);\n}\n\n// src/lib/utils.ts\nvar DefaultDataPack = class {\n  encode(value) {\n    return JSON.stringify(value);\n  }\n  decode(value) {\n    return JSON.parse(value);\n  }\n};\n\n// src/lib/client.ts\nvar CommonClient = class extends eventemitter3__WEBPACK_IMPORTED_MODULE_1__.EventEmitter {\n  address;\n  rpc_id;\n  queue;\n  options;\n  autoconnect;\n  ready;\n  reconnect;\n  reconnect_timer_id;\n  reconnect_interval;\n  max_reconnects;\n  rest_options;\n  current_reconnects;\n  generate_request_id;\n  socket;\n  webSocketFactory;\n  dataPack;\n  /**\n  * Instantiate a Client class.\n  * @constructor\n  * @param {webSocketFactory} webSocketFactory - factory method for WebSocket\n  * @param {String} address - url to a websocket server\n  * @param {Object} options - ws options object with reconnect parameters\n  * @param {Function} generate_request_id - custom generation request Id\n  * @param {DataPack} dataPack - data pack contains encoder and decoder\n  * @return {CommonClient}\n  */\n  constructor(webSocketFactory, address = \"ws://localhost:8080\", {\n    autoconnect = true,\n    reconnect = true,\n    reconnect_interval = 1e3,\n    max_reconnects = 5,\n    ...rest_options\n  } = {}, generate_request_id, dataPack) {\n    super();\n    this.webSocketFactory = webSocketFactory;\n    this.queue = {};\n    this.rpc_id = 0;\n    this.address = address;\n    this.autoconnect = autoconnect;\n    this.ready = false;\n    this.reconnect = reconnect;\n    this.reconnect_timer_id = void 0;\n    this.reconnect_interval = reconnect_interval;\n    this.max_reconnects = max_reconnects;\n    this.rest_options = rest_options;\n    this.current_reconnects = 0;\n    this.generate_request_id = generate_request_id || (() => typeof this.rpc_id === \"number\" ? ++this.rpc_id : Number(this.rpc_id) + 1);\n    if (!dataPack) this.dataPack = new DefaultDataPack();\n    else this.dataPack = dataPack;\n    if (this.autoconnect)\n      this._connect(this.address, {\n        autoconnect: this.autoconnect,\n        reconnect: this.reconnect,\n        reconnect_interval: this.reconnect_interval,\n        max_reconnects: this.max_reconnects,\n        ...this.rest_options\n      });\n  }\n  /**\n  * Connects to a defined server if not connected already.\n  * @method\n  * @return {Undefined}\n  */\n  connect() {\n    if (this.socket) return;\n    this._connect(this.address, {\n      autoconnect: this.autoconnect,\n      reconnect: this.reconnect,\n      reconnect_interval: this.reconnect_interval,\n      max_reconnects: this.max_reconnects,\n      ...this.rest_options\n    });\n  }\n  /**\n  * Calls a registered RPC method on server.\n  * @method\n  * @param {String} method - RPC method name\n  * @param {Object|Array} params - optional method parameters\n  * @param {Number} timeout - RPC reply timeout value\n  * @param {Object} ws_opts - options passed to ws\n  * @return {Promise}\n  */\n  call(method, params, timeout, ws_opts) {\n    if (!ws_opts && \"object\" === typeof timeout) {\n      ws_opts = timeout;\n      timeout = null;\n    }\n    return new Promise((resolve, reject) => {\n      if (!this.ready) return reject(new Error(\"socket not ready\"));\n      const rpc_id = this.generate_request_id(method, params);\n      const message = {\n        jsonrpc: \"2.0\",\n        method,\n        params: params || void 0,\n        id: rpc_id\n      };\n      this.socket.send(this.dataPack.encode(message), ws_opts, (error) => {\n        if (error) return reject(error);\n        this.queue[rpc_id] = { promise: [resolve, reject] };\n        if (timeout) {\n          this.queue[rpc_id].timeout = setTimeout(() => {\n            delete this.queue[rpc_id];\n            reject(new Error(\"reply timeout\"));\n          }, timeout);\n        }\n      });\n    });\n  }\n  /**\n  * Logins with the other side of the connection.\n  * @method\n  * @param {Object} params - Login credentials object\n  * @return {Promise}\n  */\n  async login(params) {\n    const resp = await this.call(\"rpc.login\", params);\n    if (!resp) throw new Error(\"authentication failed\");\n    return resp;\n  }\n  /**\n  * Fetches a list of client's methods registered on server.\n  * @method\n  * @return {Array}\n  */\n  async listMethods() {\n    return await this.call(\"__listMethods\");\n  }\n  /**\n  * Sends a JSON-RPC 2.0 notification to server.\n  * @method\n  * @param {String} method - RPC method name\n  * @param {Object} params - optional method parameters\n  * @return {Promise}\n  */\n  notify(method, params) {\n    return new Promise((resolve, reject) => {\n      if (!this.ready) return reject(new Error(\"socket not ready\"));\n      const message = {\n        jsonrpc: \"2.0\",\n        method,\n        params\n      };\n      this.socket.send(this.dataPack.encode(message), (error) => {\n        if (error) return reject(error);\n        resolve();\n      });\n    });\n  }\n  /**\n  * Subscribes for a defined event.\n  * @method\n  * @param {String|Array} event - event name\n  * @return {Undefined}\n  * @throws {Error}\n  */\n  async subscribe(event) {\n    if (typeof event === \"string\") event = [event];\n    const result = await this.call(\"rpc.on\", event);\n    if (typeof event === \"string\" && result[event] !== \"ok\")\n      throw new Error(\n        \"Failed subscribing to an event '\" + event + \"' with: \" + result[event]\n      );\n    return result;\n  }\n  /**\n  * Unsubscribes from a defined event.\n  * @method\n  * @param {String|Array} event - event name\n  * @return {Undefined}\n  * @throws {Error}\n  */\n  async unsubscribe(event) {\n    if (typeof event === \"string\") event = [event];\n    const result = await this.call(\"rpc.off\", event);\n    if (typeof event === \"string\" && result[event] !== \"ok\")\n      throw new Error(\"Failed unsubscribing from an event with: \" + result);\n    return result;\n  }\n  /**\n  * Closes a WebSocket connection gracefully.\n  * @method\n  * @param {Number} code - socket close code\n  * @param {String} data - optional data to be sent before closing\n  * @return {Undefined}\n  */\n  close(code, data) {\n    if (this.socket) this.socket.close(code || 1e3, data);\n  }\n  /**\n  * Enable / disable automatic reconnection.\n  * @method\n  * @param {Boolean} reconnect - enable / disable reconnection\n  * @return {Undefined}\n  */\n  setAutoReconnect(reconnect) {\n    this.reconnect = reconnect;\n  }\n  /**\n  * Set the interval between reconnection attempts.\n  * @method\n  * @param {Number} interval - reconnection interval in milliseconds\n  * @return {Undefined}\n  */\n  setReconnectInterval(interval) {\n    this.reconnect_interval = interval;\n  }\n  /**\n  * Set the maximum number of reconnection attempts.\n  * @method\n  * @param {Number} max_reconnects - maximum reconnection attempts\n  * @return {Undefined}\n  */\n  setMaxReconnects(max_reconnects) {\n    this.max_reconnects = max_reconnects;\n  }\n  /**\n  * Get the current number of reconnection attempts made.\n  * @method\n  * @return {Number} current reconnection attempts\n  */\n  getCurrentReconnects() {\n    return this.current_reconnects;\n  }\n  /**\n  * Get the maximum number of reconnection attempts.\n  * @method\n  * @return {Number} maximum reconnection attempts\n  */\n  getMaxReconnects() {\n    return this.max_reconnects;\n  }\n  /**\n  * Check if the client is currently attempting to reconnect.\n  * @method\n  * @return {Boolean} true if reconnection is in progress\n  */\n  isReconnecting() {\n    return this.reconnect_timer_id !== void 0;\n  }\n  /**\n  * Check if the client will attempt to reconnect on the next close event.\n  * @method\n  * @return {Boolean} true if reconnection will be attempted\n  */\n  willReconnect() {\n    return this.reconnect && (this.max_reconnects === 0 || this.current_reconnects < this.max_reconnects);\n  }\n  /**\n  * Connection/Message handler.\n  * @method\n  * @private\n  * @param {String} address - WebSocket API address\n  * @param {Object} options - ws options object\n  * @return {Undefined}\n  */\n  _connect(address, options) {\n    clearTimeout(this.reconnect_timer_id);\n    this.socket = this.webSocketFactory(address, options);\n    this.socket.addEventListener(\"open\", () => {\n      this.ready = true;\n      this.emit(\"open\");\n      this.current_reconnects = 0;\n    });\n    this.socket.addEventListener(\"message\", ({ data: message }) => {\n      if (message instanceof ArrayBuffer)\n        message = buffer__WEBPACK_IMPORTED_MODULE_0__.Buffer.from(message).toString();\n      try {\n        message = this.dataPack.decode(message);\n      } catch (error) {\n        return;\n      }\n      if (message.notification && this.listeners(message.notification).length) {\n        if (!Object.keys(message.params).length)\n          return this.emit(message.notification);\n        const args = [message.notification];\n        if (message.params.constructor === Object) args.push(message.params);\n        else\n          for (let i = 0; i < message.params.length; i++)\n            args.push(message.params[i]);\n        return Promise.resolve().then(() => {\n          this.emit.apply(this, args);\n        });\n      }\n      if (!this.queue[message.id]) {\n        if (message.method) {\n          return Promise.resolve().then(() => {\n            this.emit(message.method, message?.params);\n          });\n        }\n        return;\n      }\n      if (\"error\" in message === \"result\" in message)\n        this.queue[message.id].promise[1](\n          new Error(\n            'Server response malformed. Response must include either \"result\" or \"error\", but not both.'\n          )\n        );\n      if (this.queue[message.id].timeout)\n        clearTimeout(this.queue[message.id].timeout);\n      if (message.error) this.queue[message.id].promise[1](message.error);\n      else this.queue[message.id].promise[0](message.result);\n      delete this.queue[message.id];\n    });\n    this.socket.addEventListener(\"error\", (error) => this.emit(\"error\", error));\n    this.socket.addEventListener(\"close\", ({ code, reason }) => {\n      if (this.ready)\n        setTimeout(() => this.emit(\"close\", code, reason), 0);\n      this.ready = false;\n      this.socket = void 0;\n      if (code === 1e3) return;\n      this.current_reconnects++;\n      if (this.reconnect && (this.max_reconnects > this.current_reconnects || this.max_reconnects === 0))\n        this.reconnect_timer_id = setTimeout(\n          () => this._connect(address, options),\n          this.reconnect_interval\n        );\n      else if (this.reconnect && this.max_reconnects > 0 && this.current_reconnects >= this.max_reconnects) {\n        setTimeout(() => this.emit(\"max_reconnects_reached\", code, reason), 1);\n      }\n    });\n  }\n};\n\n// src/index.browser.ts\nvar Client = class extends CommonClient {\n  constructor(address = \"ws://localhost:8080\", {\n    autoconnect = true,\n    reconnect = true,\n    reconnect_interval = 1e3,\n    max_reconnects = 5\n  } = {}, generate_request_id) {\n    super(\n      WebSocket,\n      address,\n      {\n        autoconnect,\n        reconnect,\n        reconnect_interval,\n        max_reconnects\n      },\n      generate_request_id\n    );\n  }\n};\n\n\n//# sourceMappingURL=index.browser.mjs.map\n//# sourceMappingURL=index.browser.mjs.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9ycGMtd2Vic29ja2V0cy9kaXN0L2luZGV4LmJyb3dzZXIubWpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFnQztBQUNhOztBQUU3QztBQUNBLHlDQUF5Qyx1REFBWTtBQUNyRDtBQUNBO0FBQ0E7QUFDQSxZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksZ0JBQWdCO0FBQzVCLGFBQWEsc0JBQXNCO0FBQ25DO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLGlCQUFpQjtBQUM3QixZQUFZLFFBQVE7QUFDcEIsWUFBWSxVQUFVO0FBQ3RCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUTtBQUNwQixhQUFhO0FBQ2IsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaUNBQWlDLHVEQUFZO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxrQkFBa0I7QUFDOUIsWUFBWSxRQUFRO0FBQ3BCLFlBQVksUUFBUTtBQUNwQixZQUFZLFVBQVU7QUFDdEIsWUFBWSxVQUFVO0FBQ3RCLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB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QUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksSUFBSTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRTREO0FBQzVEO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvcnBjLXdlYnNvY2tldHMvZGlzdC9pbmRleC5icm93c2VyLm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCdWZmZXIgfSBmcm9tICdidWZmZXInO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRlbWl0dGVyMyc7XG5cbi8vIG5vZGVfbW9kdWxlcy9lc2J1aWxkLXBsdWdpbi1wb2x5ZmlsbC1ub2RlL3BvbHlmaWxscy9idWZmZXIuanNcbnZhciBXZWJTb2NrZXRCcm93c2VySW1wbCA9IGNsYXNzIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgc29ja2V0O1xuICAvKiogSW5zdGFudGlhdGUgYSBXZWJTb2NrZXQgY2xhc3NcbiAgKiBAY29uc3RydWN0b3JcbiAgKiBAcGFyYW0ge1N0cmluZ30gYWRkcmVzcyAtIHVybCB0byBhIHdlYnNvY2tldCBzZXJ2ZXJcbiAgKiBAcGFyYW0geyhPYmplY3QpfSBvcHRpb25zIC0gd2Vic29ja2V0IG9wdGlvbnNcbiAgKiBAcGFyYW0geyhTdHJpbmd8QXJyYXkpfSBwcm90b2NvbHMgLSBhIGxpc3Qgb2YgcHJvdG9jb2xzXG4gICogQHJldHVybiB7V2ViU29ja2V0QnJvd3NlckltcGx9IC0gcmV0dXJucyBhIFdlYlNvY2tldCBpbnN0YW5jZVxuICAqL1xuICBjb25zdHJ1Y3RvcihhZGRyZXNzLCBvcHRpb25zLCBwcm90b2NvbHMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc29ja2V0ID0gbmV3IHdpbmRvdy5XZWJTb2NrZXQoYWRkcmVzcywgcHJvdG9jb2xzKTtcbiAgICB0aGlzLnNvY2tldC5vbm9wZW4gPSAoKSA9PiB0aGlzLmVtaXQoXCJvcGVuXCIpO1xuICAgIHRoaXMuc29ja2V0Lm9ubWVzc2FnZSA9IChldmVudCkgPT4gdGhpcy5lbWl0KFwibWVzc2FnZVwiLCBldmVudC5kYXRhKTtcbiAgICB0aGlzLnNvY2tldC5vbmVycm9yID0gKGVycm9yKSA9PiB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnJvcik7XG4gICAgdGhpcy5zb2NrZXQub25jbG9zZSA9IChldmVudCkgPT4ge1xuICAgICAgdGhpcy5lbWl0KFwiY2xvc2VcIiwgZXZlbnQuY29kZSwgZXZlbnQucmVhc29uKTtcbiAgICB9O1xuICB9XG4gIC8qKlxuICAqIFNlbmRzIGRhdGEgdGhyb3VnaCBhIHdlYnNvY2tldCBjb25uZWN0aW9uXG4gICogQG1ldGhvZFxuICAqIEBwYXJhbSB7KFN0cmluZ3xPYmplY3QpfSBkYXRhIC0gZGF0YSB0byBiZSBzZW50IHZpYSB3ZWJzb2NrZXRcbiAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc09yQ2FsbGJhY2sgLSB3cyBvcHRpb25zXG4gICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgLSBhIGNhbGxiYWNrIGNhbGxlZCBvbmNlIHRoZSBkYXRhIGlzIHNlbnRcbiAgKiBAcmV0dXJuIHtVbmRlZmluZWR9XG4gICovXG4gIHNlbmQoZGF0YSwgb3B0aW9uc09yQ2FsbGJhY2ssIGNhbGxiYWNrKSB7XG4gICAgY29uc3QgY2IgPSBjYWxsYmFjayB8fCBvcHRpb25zT3JDYWxsYmFjaztcbiAgICB0cnkge1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgIGNiKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNiKGVycm9yKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICogQ2xvc2VzIGFuIHVuZGVybHlpbmcgc29ja2V0XG4gICogQG1ldGhvZFxuICAqIEBwYXJhbSB7TnVtYmVyfSBjb2RlIC0gc3RhdHVzIGNvZGUgZXhwbGFpbmluZyB3aHkgdGhlIGNvbm5lY3Rpb24gaXMgYmVpbmcgY2xvc2VkXG4gICogQHBhcmFtIHtTdHJpbmd9IHJlYXNvbiAtIGEgZGVzY3JpcHRpb24gd2h5IHRoZSBjb25uZWN0aW9uIGlzIGNsb3NpbmdcbiAgKiBAcmV0dXJuIHtVbmRlZmluZWR9XG4gICogQHRocm93cyB7RXJyb3J9XG4gICovXG4gIGNsb3NlKGNvZGUsIHJlYXNvbikge1xuICAgIHRoaXMuc29ja2V0LmNsb3NlKGNvZGUsIHJlYXNvbik7XG4gIH1cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lciwgb3B0aW9ucykge1xuICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIsIG9wdGlvbnMpO1xuICB9XG59O1xuZnVuY3Rpb24gV2ViU29ja2V0KGFkZHJlc3MsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBXZWJTb2NrZXRCcm93c2VySW1wbChhZGRyZXNzLCBvcHRpb25zKTtcbn1cblxuLy8gc3JjL2xpYi91dGlscy50c1xudmFyIERlZmF1bHREYXRhUGFjayA9IGNsYXNzIHtcbiAgZW5jb2RlKHZhbHVlKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfVxuICBkZWNvZGUodmFsdWUpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWx1ZSk7XG4gIH1cbn07XG5cbi8vIHNyYy9saWIvY2xpZW50LnRzXG52YXIgQ29tbW9uQ2xpZW50ID0gY2xhc3MgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBhZGRyZXNzO1xuICBycGNfaWQ7XG4gIHF1ZXVlO1xuICBvcHRpb25zO1xuICBhdXRvY29ubmVjdDtcbiAgcmVhZHk7XG4gIHJlY29ubmVjdDtcbiAgcmVjb25uZWN0X3RpbWVyX2lkO1xuICByZWNvbm5lY3RfaW50ZXJ2YWw7XG4gIG1heF9yZWNvbm5lY3RzO1xuICByZXN0X29wdGlvbnM7XG4gIGN1cnJlbnRfcmVjb25uZWN0cztcbiAgZ2VuZXJhdGVfcmVxdWVzdF9pZDtcbiAgc29ja2V0O1xuICB3ZWJTb2NrZXRGYWN0b3J5O1xuICBkYXRhUGFjaztcbiAgLyoqXG4gICogSW5zdGFudGlhdGUgYSBDbGllbnQgY2xhc3MuXG4gICogQGNvbnN0cnVjdG9yXG4gICogQHBhcmFtIHt3ZWJTb2NrZXRGYWN0b3J5fSB3ZWJTb2NrZXRGYWN0b3J5IC0gZmFjdG9yeSBtZXRob2QgZm9yIFdlYlNvY2tldFxuICAqIEBwYXJhbSB7U3RyaW5nfSBhZGRyZXNzIC0gdXJsIHRvIGEgd2Vic29ja2V0IHNlcnZlclxuICAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gd3Mgb3B0aW9ucyBvYmplY3Qgd2l0aCByZWNvbm5lY3QgcGFyYW1ldGVyc1xuICAqIEBwYXJhbSB7RnVuY3Rpb259IGdlbmVyYXRlX3JlcXVlc3RfaWQgLSBjdXN0b20gZ2VuZXJhdGlvbiByZXF1ZXN0IElkXG4gICogQHBhcmFtIHtEYXRhUGFja30gZGF0YVBhY2sgLSBkYXRhIHBhY2sgY29udGFpbnMgZW5jb2RlciBhbmQgZGVjb2RlclxuICAqIEByZXR1cm4ge0NvbW1vbkNsaWVudH1cbiAgKi9cbiAgY29uc3RydWN0b3Iod2ViU29ja2V0RmFjdG9yeSwgYWRkcmVzcyA9IFwid3M6Ly9sb2NhbGhvc3Q6ODA4MFwiLCB7XG4gICAgYXV0b2Nvbm5lY3QgPSB0cnVlLFxuICAgIHJlY29ubmVjdCA9IHRydWUsXG4gICAgcmVjb25uZWN0X2ludGVydmFsID0gMWUzLFxuICAgIG1heF9yZWNvbm5lY3RzID0gNSxcbiAgICAuLi5yZXN0X29wdGlvbnNcbiAgfSA9IHt9LCBnZW5lcmF0ZV9yZXF1ZXN0X2lkLCBkYXRhUGFjaykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy53ZWJTb2NrZXRGYWN0b3J5ID0gd2ViU29ja2V0RmFjdG9yeTtcbiAgICB0aGlzLnF1ZXVlID0ge307XG4gICAgdGhpcy5ycGNfaWQgPSAwO1xuICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7XG4gICAgdGhpcy5hdXRvY29ubmVjdCA9IGF1dG9jb25uZWN0O1xuICAgIHRoaXMucmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLnJlY29ubmVjdCA9IHJlY29ubmVjdDtcbiAgICB0aGlzLnJlY29ubmVjdF90aW1lcl9pZCA9IHZvaWQgMDtcbiAgICB0aGlzLnJlY29ubmVjdF9pbnRlcnZhbCA9IHJlY29ubmVjdF9pbnRlcnZhbDtcbiAgICB0aGlzLm1heF9yZWNvbm5lY3RzID0gbWF4X3JlY29ubmVjdHM7XG4gICAgdGhpcy5yZXN0X29wdGlvbnMgPSByZXN0X29wdGlvbnM7XG4gICAgdGhpcy5jdXJyZW50X3JlY29ubmVjdHMgPSAwO1xuICAgIHRoaXMuZ2VuZXJhdGVfcmVxdWVzdF9pZCA9IGdlbmVyYXRlX3JlcXVlc3RfaWQgfHwgKCgpID0+IHR5cGVvZiB0aGlzLnJwY19pZCA9PT0gXCJudW1iZXJcIiA/ICsrdGhpcy5ycGNfaWQgOiBOdW1iZXIodGhpcy5ycGNfaWQpICsgMSk7XG4gICAgaWYgKCFkYXRhUGFjaykgdGhpcy5kYXRhUGFjayA9IG5ldyBEZWZhdWx0RGF0YVBhY2soKTtcbiAgICBlbHNlIHRoaXMuZGF0YVBhY2sgPSBkYXRhUGFjaztcbiAgICBpZiAodGhpcy5hdXRvY29ubmVjdClcbiAgICAgIHRoaXMuX2Nvbm5lY3QodGhpcy5hZGRyZXNzLCB7XG4gICAgICAgIGF1dG9jb25uZWN0OiB0aGlzLmF1dG9jb25uZWN0LFxuICAgICAgICByZWNvbm5lY3Q6IHRoaXMucmVjb25uZWN0LFxuICAgICAgICByZWNvbm5lY3RfaW50ZXJ2YWw6IHRoaXMucmVjb25uZWN0X2ludGVydmFsLFxuICAgICAgICBtYXhfcmVjb25uZWN0czogdGhpcy5tYXhfcmVjb25uZWN0cyxcbiAgICAgICAgLi4udGhpcy5yZXN0X29wdGlvbnNcbiAgICAgIH0pO1xuICB9XG4gIC8qKlxuICAqIENvbm5lY3RzIHRvIGEgZGVmaW5lZCBzZXJ2ZXIgaWYgbm90IGNvbm5lY3RlZCBhbHJlYWR5LlxuICAqIEBtZXRob2RcbiAgKiBAcmV0dXJuIHtVbmRlZmluZWR9XG4gICovXG4gIGNvbm5lY3QoKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSByZXR1cm47XG4gICAgdGhpcy5fY29ubmVjdCh0aGlzLmFkZHJlc3MsIHtcbiAgICAgIGF1dG9jb25uZWN0OiB0aGlzLmF1dG9jb25uZWN0LFxuICAgICAgcmVjb25uZWN0OiB0aGlzLnJlY29ubmVjdCxcbiAgICAgIHJlY29ubmVjdF9pbnRlcnZhbDogdGhpcy5yZWNvbm5lY3RfaW50ZXJ2YWwsXG4gICAgICBtYXhfcmVjb25uZWN0czogdGhpcy5tYXhfcmVjb25uZWN0cyxcbiAgICAgIC4uLnRoaXMucmVzdF9vcHRpb25zXG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICogQ2FsbHMgYSByZWdpc3RlcmVkIFJQQyBtZXRob2Qgb24gc2VydmVyLlxuICAqIEBtZXRob2RcbiAgKiBAcGFyYW0ge1N0cmluZ30gbWV0aG9kIC0gUlBDIG1ldGhvZCBuYW1lXG4gICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IHBhcmFtcyAtIG9wdGlvbmFsIG1ldGhvZCBwYXJhbWV0ZXJzXG4gICogQHBhcmFtIHtOdW1iZXJ9IHRpbWVvdXQgLSBSUEMgcmVwbHkgdGltZW91dCB2YWx1ZVxuICAqIEBwYXJhbSB7T2JqZWN0fSB3c19vcHRzIC0gb3B0aW9ucyBwYXNzZWQgdG8gd3NcbiAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAqL1xuICBjYWxsKG1ldGhvZCwgcGFyYW1zLCB0aW1lb3V0LCB3c19vcHRzKSB7XG4gICAgaWYgKCF3c19vcHRzICYmIFwib2JqZWN0XCIgPT09IHR5cGVvZiB0aW1lb3V0KSB7XG4gICAgICB3c19vcHRzID0gdGltZW91dDtcbiAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnJlYWR5KSByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcInNvY2tldCBub3QgcmVhZHlcIikpO1xuICAgICAgY29uc3QgcnBjX2lkID0gdGhpcy5nZW5lcmF0ZV9yZXF1ZXN0X2lkKG1ldGhvZCwgcGFyYW1zKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSB7XG4gICAgICAgIGpzb25ycGM6IFwiMi4wXCIsXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgcGFyYW1zOiBwYXJhbXMgfHwgdm9pZCAwLFxuICAgICAgICBpZDogcnBjX2lkXG4gICAgICB9O1xuICAgICAgdGhpcy5zb2NrZXQuc2VuZCh0aGlzLmRhdGFQYWNrLmVuY29kZShtZXNzYWdlKSwgd3Nfb3B0cywgKGVycm9yKSA9PiB7XG4gICAgICAgIGlmIChlcnJvcikgcmV0dXJuIHJlamVjdChlcnJvcik7XG4gICAgICAgIHRoaXMucXVldWVbcnBjX2lkXSA9IHsgcHJvbWlzZTogW3Jlc29sdmUsIHJlamVjdF0gfTtcbiAgICAgICAgaWYgKHRpbWVvdXQpIHtcbiAgICAgICAgICB0aGlzLnF1ZXVlW3JwY19pZF0udGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucXVldWVbcnBjX2lkXTtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJyZXBseSB0aW1lb3V0XCIpKTtcbiAgICAgICAgICB9LCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICogTG9naW5zIHdpdGggdGhlIG90aGVyIHNpZGUgb2YgdGhlIGNvbm5lY3Rpb24uXG4gICogQG1ldGhvZFxuICAqIEBwYXJhbSB7T2JqZWN0fSBwYXJhbXMgLSBMb2dpbiBjcmVkZW50aWFscyBvYmplY3RcbiAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAqL1xuICBhc3luYyBsb2dpbihwYXJhbXMpIHtcbiAgICBjb25zdCByZXNwID0gYXdhaXQgdGhpcy5jYWxsKFwicnBjLmxvZ2luXCIsIHBhcmFtcyk7XG4gICAgaWYgKCFyZXNwKSB0aHJvdyBuZXcgRXJyb3IoXCJhdXRoZW50aWNhdGlvbiBmYWlsZWRcIik7XG4gICAgcmV0dXJuIHJlc3A7XG4gIH1cbiAgLyoqXG4gICogRmV0Y2hlcyBhIGxpc3Qgb2YgY2xpZW50J3MgbWV0aG9kcyByZWdpc3RlcmVkIG9uIHNlcnZlci5cbiAgKiBAbWV0aG9kXG4gICogQHJldHVybiB7QXJyYXl9XG4gICovXG4gIGFzeW5jIGxpc3RNZXRob2RzKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmNhbGwoXCJfX2xpc3RNZXRob2RzXCIpO1xuICB9XG4gIC8qKlxuICAqIFNlbmRzIGEgSlNPTi1SUEMgMi4wIG5vdGlmaWNhdGlvbiB0byBzZXJ2ZXIuXG4gICogQG1ldGhvZFxuICAqIEBwYXJhbSB7U3RyaW5nfSBtZXRob2QgLSBSUEMgbWV0aG9kIG5hbWVcbiAgKiBAcGFyYW0ge09iamVjdH0gcGFyYW1zIC0gb3B0aW9uYWwgbWV0aG9kIHBhcmFtZXRlcnNcbiAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAqL1xuICBub3RpZnkobWV0aG9kLCBwYXJhbXMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnJlYWR5KSByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcInNvY2tldCBub3QgcmVhZHlcIikpO1xuICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAganNvbnJwYzogXCIyLjBcIixcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBwYXJhbXNcbiAgICAgIH07XG4gICAgICB0aGlzLnNvY2tldC5zZW5kKHRoaXMuZGF0YVBhY2suZW5jb2RlKG1lc3NhZ2UpLCAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbiAgLyoqXG4gICogU3Vic2NyaWJlcyBmb3IgYSBkZWZpbmVkIGV2ZW50LlxuICAqIEBtZXRob2RcbiAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gZXZlbnQgLSBldmVudCBuYW1lXG4gICogQHJldHVybiB7VW5kZWZpbmVkfVxuICAqIEB0aHJvd3Mge0Vycm9yfVxuICAqL1xuICBhc3luYyBzdWJzY3JpYmUoZXZlbnQpIHtcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSBcInN0cmluZ1wiKSBldmVudCA9IFtldmVudF07XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5jYWxsKFwicnBjLm9uXCIsIGV2ZW50KTtcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSBcInN0cmluZ1wiICYmIHJlc3VsdFtldmVudF0gIT09IFwib2tcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJGYWlsZWQgc3Vic2NyaWJpbmcgdG8gYW4gZXZlbnQgJ1wiICsgZXZlbnQgKyBcIicgd2l0aDogXCIgKyByZXN1bHRbZXZlbnRdXG4gICAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICogVW5zdWJzY3JpYmVzIGZyb20gYSBkZWZpbmVkIGV2ZW50LlxuICAqIEBtZXRob2RcbiAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheX0gZXZlbnQgLSBldmVudCBuYW1lXG4gICogQHJldHVybiB7VW5kZWZpbmVkfVxuICAqIEB0aHJvd3Mge0Vycm9yfVxuICAqL1xuICBhc3luYyB1bnN1YnNjcmliZShldmVudCkge1xuICAgIGlmICh0eXBlb2YgZXZlbnQgPT09IFwic3RyaW5nXCIpIGV2ZW50ID0gW2V2ZW50XTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmNhbGwoXCJycGMub2ZmXCIsIGV2ZW50KTtcbiAgICBpZiAodHlwZW9mIGV2ZW50ID09PSBcInN0cmluZ1wiICYmIHJlc3VsdFtldmVudF0gIT09IFwib2tcIilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB1bnN1YnNjcmliaW5nIGZyb20gYW4gZXZlbnQgd2l0aDogXCIgKyByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLyoqXG4gICogQ2xvc2VzIGEgV2ViU29ja2V0IGNvbm5lY3Rpb24gZ3JhY2VmdWxseS5cbiAgKiBAbWV0aG9kXG4gICogQHBhcmFtIHtOdW1iZXJ9IGNvZGUgLSBzb2NrZXQgY2xvc2UgY29kZVxuICAqIEBwYXJhbSB7U3RyaW5nfSBkYXRhIC0gb3B0aW9uYWwgZGF0YSB0byBiZSBzZW50IGJlZm9yZSBjbG9zaW5nXG4gICogQHJldHVybiB7VW5kZWZpbmVkfVxuICAqL1xuICBjbG9zZShjb2RlLCBkYXRhKSB7XG4gICAgaWYgKHRoaXMuc29ja2V0KSB0aGlzLnNvY2tldC5jbG9zZShjb2RlIHx8IDFlMywgZGF0YSk7XG4gIH1cbiAgLyoqXG4gICogRW5hYmxlIC8gZGlzYWJsZSBhdXRvbWF0aWMgcmVjb25uZWN0aW9uLlxuICAqIEBtZXRob2RcbiAgKiBAcGFyYW0ge0Jvb2xlYW59IHJlY29ubmVjdCAtIGVuYWJsZSAvIGRpc2FibGUgcmVjb25uZWN0aW9uXG4gICogQHJldHVybiB7VW5kZWZpbmVkfVxuICAqL1xuICBzZXRBdXRvUmVjb25uZWN0KHJlY29ubmVjdCkge1xuICAgIHRoaXMucmVjb25uZWN0ID0gcmVjb25uZWN0O1xuICB9XG4gIC8qKlxuICAqIFNldCB0aGUgaW50ZXJ2YWwgYmV0d2VlbiByZWNvbm5lY3Rpb24gYXR0ZW1wdHMuXG4gICogQG1ldGhvZFxuICAqIEBwYXJhbSB7TnVtYmVyfSBpbnRlcnZhbCAtIHJlY29ubmVjdGlvbiBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHNcbiAgKiBAcmV0dXJuIHtVbmRlZmluZWR9XG4gICovXG4gIHNldFJlY29ubmVjdEludGVydmFsKGludGVydmFsKSB7XG4gICAgdGhpcy5yZWNvbm5lY3RfaW50ZXJ2YWwgPSBpbnRlcnZhbDtcbiAgfVxuICAvKipcbiAgKiBTZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY29ubmVjdGlvbiBhdHRlbXB0cy5cbiAgKiBAbWV0aG9kXG4gICogQHBhcmFtIHtOdW1iZXJ9IG1heF9yZWNvbm5lY3RzIC0gbWF4aW11bSByZWNvbm5lY3Rpb24gYXR0ZW1wdHNcbiAgKiBAcmV0dXJuIHtVbmRlZmluZWR9XG4gICovXG4gIHNldE1heFJlY29ubmVjdHMobWF4X3JlY29ubmVjdHMpIHtcbiAgICB0aGlzLm1heF9yZWNvbm5lY3RzID0gbWF4X3JlY29ubmVjdHM7XG4gIH1cbiAgLyoqXG4gICogR2V0IHRoZSBjdXJyZW50IG51bWJlciBvZiByZWNvbm5lY3Rpb24gYXR0ZW1wdHMgbWFkZS5cbiAgKiBAbWV0aG9kXG4gICogQHJldHVybiB7TnVtYmVyfSBjdXJyZW50IHJlY29ubmVjdGlvbiBhdHRlbXB0c1xuICAqL1xuICBnZXRDdXJyZW50UmVjb25uZWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50X3JlY29ubmVjdHM7XG4gIH1cbiAgLyoqXG4gICogR2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiByZWNvbm5lY3Rpb24gYXR0ZW1wdHMuXG4gICogQG1ldGhvZFxuICAqIEByZXR1cm4ge051bWJlcn0gbWF4aW11bSByZWNvbm5lY3Rpb24gYXR0ZW1wdHNcbiAgKi9cbiAgZ2V0TWF4UmVjb25uZWN0cygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXhfcmVjb25uZWN0cztcbiAgfVxuICAvKipcbiAgKiBDaGVjayBpZiB0aGUgY2xpZW50IGlzIGN1cnJlbnRseSBhdHRlbXB0aW5nIHRvIHJlY29ubmVjdC5cbiAgKiBAbWV0aG9kXG4gICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiByZWNvbm5lY3Rpb24gaXMgaW4gcHJvZ3Jlc3NcbiAgKi9cbiAgaXNSZWNvbm5lY3RpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVjb25uZWN0X3RpbWVyX2lkICE9PSB2b2lkIDA7XG4gIH1cbiAgLyoqXG4gICogQ2hlY2sgaWYgdGhlIGNsaWVudCB3aWxsIGF0dGVtcHQgdG8gcmVjb25uZWN0IG9uIHRoZSBuZXh0IGNsb3NlIGV2ZW50LlxuICAqIEBtZXRob2RcbiAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHJlY29ubmVjdGlvbiB3aWxsIGJlIGF0dGVtcHRlZFxuICAqL1xuICB3aWxsUmVjb25uZWN0KCkge1xuICAgIHJldHVybiB0aGlzLnJlY29ubmVjdCAmJiAodGhpcy5tYXhfcmVjb25uZWN0cyA9PT0gMCB8fCB0aGlzLmN1cnJlbnRfcmVjb25uZWN0cyA8IHRoaXMubWF4X3JlY29ubmVjdHMpO1xuICB9XG4gIC8qKlxuICAqIENvbm5lY3Rpb24vTWVzc2FnZSBoYW5kbGVyLlxuICAqIEBtZXRob2RcbiAgKiBAcHJpdmF0ZVxuICAqIEBwYXJhbSB7U3RyaW5nfSBhZGRyZXNzIC0gV2ViU29ja2V0IEFQSSBhZGRyZXNzXG4gICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSB3cyBvcHRpb25zIG9iamVjdFxuICAqIEByZXR1cm4ge1VuZGVmaW5lZH1cbiAgKi9cbiAgX2Nvbm5lY3QoYWRkcmVzcywgb3B0aW9ucykge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnJlY29ubmVjdF90aW1lcl9pZCk7XG4gICAgdGhpcy5zb2NrZXQgPSB0aGlzLndlYlNvY2tldEZhY3RvcnkoYWRkcmVzcywgb3B0aW9ucyk7XG4gICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcihcIm9wZW5cIiwgKCkgPT4ge1xuICAgICAgdGhpcy5yZWFkeSA9IHRydWU7XG4gICAgICB0aGlzLmVtaXQoXCJvcGVuXCIpO1xuICAgICAgdGhpcy5jdXJyZW50X3JlY29ubmVjdHMgPSAwO1xuICAgIH0pO1xuICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsICh7IGRhdGE6IG1lc3NhZ2UgfSkgPT4ge1xuICAgICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcilcbiAgICAgICAgbWVzc2FnZSA9IEJ1ZmZlci5mcm9tKG1lc3NhZ2UpLnRvU3RyaW5nKCk7XG4gICAgICB0cnkge1xuICAgICAgICBtZXNzYWdlID0gdGhpcy5kYXRhUGFjay5kZWNvZGUobWVzc2FnZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAobWVzc2FnZS5ub3RpZmljYXRpb24gJiYgdGhpcy5saXN0ZW5lcnMobWVzc2FnZS5ub3RpZmljYXRpb24pLmxlbmd0aCkge1xuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKG1lc3NhZ2UucGFyYW1zKS5sZW5ndGgpXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZW1pdChtZXNzYWdlLm5vdGlmaWNhdGlvbik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbbWVzc2FnZS5ub3RpZmljYXRpb25dO1xuICAgICAgICBpZiAobWVzc2FnZS5wYXJhbXMuY29uc3RydWN0b3IgPT09IE9iamVjdCkgYXJncy5wdXNoKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVzc2FnZS5wYXJhbXMubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICBhcmdzLnB1c2gobWVzc2FnZS5wYXJhbXNbaV0pO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgdGhpcy5lbWl0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5xdWV1ZVttZXNzYWdlLmlkXSkge1xuICAgICAgICBpZiAobWVzc2FnZS5tZXRob2QpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmVtaXQobWVzc2FnZS5tZXRob2QsIG1lc3NhZ2U/LnBhcmFtcyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKFwiZXJyb3JcIiBpbiBtZXNzYWdlID09PSBcInJlc3VsdFwiIGluIG1lc3NhZ2UpXG4gICAgICAgIHRoaXMucXVldWVbbWVzc2FnZS5pZF0ucHJvbWlzZVsxXShcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnU2VydmVyIHJlc3BvbnNlIG1hbGZvcm1lZC4gUmVzcG9uc2UgbXVzdCBpbmNsdWRlIGVpdGhlciBcInJlc3VsdFwiIG9yIFwiZXJyb3JcIiwgYnV0IG5vdCBib3RoLidcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICBpZiAodGhpcy5xdWV1ZVttZXNzYWdlLmlkXS50aW1lb3V0KVxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5xdWV1ZVttZXNzYWdlLmlkXS50aW1lb3V0KTtcbiAgICAgIGlmIChtZXNzYWdlLmVycm9yKSB0aGlzLnF1ZXVlW21lc3NhZ2UuaWRdLnByb21pc2VbMV0obWVzc2FnZS5lcnJvcik7XG4gICAgICBlbHNlIHRoaXMucXVldWVbbWVzc2FnZS5pZF0ucHJvbWlzZVswXShtZXNzYWdlLnJlc3VsdCk7XG4gICAgICBkZWxldGUgdGhpcy5xdWV1ZVttZXNzYWdlLmlkXTtcbiAgICB9KTtcbiAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB0aGlzLmVtaXQoXCJlcnJvclwiLCBlcnJvcikpO1xuICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCAoeyBjb2RlLCByZWFzb24gfSkgPT4ge1xuICAgICAgaWYgKHRoaXMucmVhZHkpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5lbWl0KFwiY2xvc2VcIiwgY29kZSwgcmVhc29uKSwgMCk7XG4gICAgICB0aGlzLnJlYWR5ID0gZmFsc2U7XG4gICAgICB0aGlzLnNvY2tldCA9IHZvaWQgMDtcbiAgICAgIGlmIChjb2RlID09PSAxZTMpIHJldHVybjtcbiAgICAgIHRoaXMuY3VycmVudF9yZWNvbm5lY3RzKys7XG4gICAgICBpZiAodGhpcy5yZWNvbm5lY3QgJiYgKHRoaXMubWF4X3JlY29ubmVjdHMgPiB0aGlzLmN1cnJlbnRfcmVjb25uZWN0cyB8fCB0aGlzLm1heF9yZWNvbm5lY3RzID09PSAwKSlcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RfdGltZXJfaWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAgICgpID0+IHRoaXMuX2Nvbm5lY3QoYWRkcmVzcywgb3B0aW9ucyksXG4gICAgICAgICAgdGhpcy5yZWNvbm5lY3RfaW50ZXJ2YWxcbiAgICAgICAgKTtcbiAgICAgIGVsc2UgaWYgKHRoaXMucmVjb25uZWN0ICYmIHRoaXMubWF4X3JlY29ubmVjdHMgPiAwICYmIHRoaXMuY3VycmVudF9yZWNvbm5lY3RzID49IHRoaXMubWF4X3JlY29ubmVjdHMpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmVtaXQoXCJtYXhfcmVjb25uZWN0c19yZWFjaGVkXCIsIGNvZGUsIHJlYXNvbiksIDEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59O1xuXG4vLyBzcmMvaW5kZXguYnJvd3Nlci50c1xudmFyIENsaWVudCA9IGNsYXNzIGV4dGVuZHMgQ29tbW9uQ2xpZW50IHtcbiAgY29uc3RydWN0b3IoYWRkcmVzcyA9IFwid3M6Ly9sb2NhbGhvc3Q6ODA4MFwiLCB7XG4gICAgYXV0b2Nvbm5lY3QgPSB0cnVlLFxuICAgIHJlY29ubmVjdCA9IHRydWUsXG4gICAgcmVjb25uZWN0X2ludGVydmFsID0gMWUzLFxuICAgIG1heF9yZWNvbm5lY3RzID0gNVxuICB9ID0ge30sIGdlbmVyYXRlX3JlcXVlc3RfaWQpIHtcbiAgICBzdXBlcihcbiAgICAgIFdlYlNvY2tldCxcbiAgICAgIGFkZHJlc3MsXG4gICAgICB7XG4gICAgICAgIGF1dG9jb25uZWN0LFxuICAgICAgICByZWNvbm5lY3QsXG4gICAgICAgIHJlY29ubmVjdF9pbnRlcnZhbCxcbiAgICAgICAgbWF4X3JlY29ubmVjdHNcbiAgICAgIH0sXG4gICAgICBnZW5lcmF0ZV9yZXF1ZXN0X2lkXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IHsgQ2xpZW50LCBDb21tb25DbGllbnQsIERlZmF1bHREYXRhUGFjaywgV2ViU29ja2V0IH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5icm93c2VyLm1qcy5tYXBcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmJyb3dzZXIubWpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/rpc-websockets/dist/index.browser.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/safe-buffer/index.js":
/*!*******************************************!*\
  !*** ./node_modules/safe-buffer/index.js ***!
  \*******************************************/
/***/ ((module, exports, __webpack_require__) => {
 
eval(__webpack_require__.ts("/*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */\n/* eslint-disable node/no-deprecated-api */\nvar buffer = __webpack_require__(/*! buffer */ \"(app-pages-browser)/./node_modules/buffer/index.js\")\nvar Buffer = buffer.Buffer\n\n// alternative to using Object.keys for old browsers\nfunction copyProps (src, dst) {\n  for (var key in src) {\n    dst[key] = src[key]\n  }\n}\nif (Buffer.from && Buffer.alloc && Buffer.allocUnsafe && Buffer.allocUnsafeSlow) {\n  module.exports = buffer\n} else {\n  // Copy properties from require('buffer')\n  copyProps(buffer, exports)\n  exports.Buffer = SafeBuffer\n}\n\nfunction SafeBuffer (arg, encodingOrOffset, length) {\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.prototype = Object.create(Buffer.prototype)\n\n// Copy static methods from Buffer\ncopyProps(Buffer, SafeBuffer)\n\nSafeBuffer.from = function (arg, encodingOrOffset, length) {\n  if (typeof arg === 'number') {\n    throw new TypeError('Argument must not be a number')\n  }\n  return Buffer(arg, encodingOrOffset, length)\n}\n\nSafeBuffer.alloc = function (size, fill, encoding) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  var buf = Buffer(size)\n  if (fill !== undefined) {\n    if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n  } else {\n    buf.fill(0)\n  }\n  return buf\n}\n\nSafeBuffer.allocUnsafe = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return Buffer(size)\n}\n\nSafeBuffer.allocUnsafeSlow = function (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('Argument must be a number')\n  }\n  return buffer.SlowBuffer(size)\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9zYWZlLWJ1ZmZlci9pbmRleC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0EsYUFBYSxtQkFBTyxDQUFDLGtFQUFRO0FBQzdCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFO0FBQ0Y7QUFDQTtBQUNBLEVBQUUsY0FBYztBQUNoQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvc2FmZS1idWZmZXIvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohIHNhZmUtYnVmZmVyLiBNSVQgTGljZW5zZS4gRmVyb3NzIEFib3VraGFkaWplaCA8aHR0cHM6Ly9mZXJvc3Mub3JnL29wZW5zb3VyY2U+ICovXG4vKiBlc2xpbnQtZGlzYWJsZSBub2RlL25vLWRlcHJlY2F0ZWQtYXBpICovXG52YXIgYnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJylcbnZhciBCdWZmZXIgPSBidWZmZXIuQnVmZmVyXG5cbi8vIGFsdGVybmF0aXZlIHRvIHVzaW5nIE9iamVjdC5rZXlzIGZvciBvbGQgYnJvd3NlcnNcbmZ1bmN0aW9uIGNvcHlQcm9wcyAoc3JjLCBkc3QpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgIGRzdFtrZXldID0gc3JjW2tleV1cbiAgfVxufVxuaWYgKEJ1ZmZlci5mcm9tICYmIEJ1ZmZlci5hbGxvYyAmJiBCdWZmZXIuYWxsb2NVbnNhZmUgJiYgQnVmZmVyLmFsbG9jVW5zYWZlU2xvdykge1xuICBtb2R1bGUuZXhwb3J0cyA9IGJ1ZmZlclxufSBlbHNlIHtcbiAgLy8gQ29weSBwcm9wZXJ0aWVzIGZyb20gcmVxdWlyZSgnYnVmZmVyJylcbiAgY29weVByb3BzKGJ1ZmZlciwgZXhwb3J0cylcbiAgZXhwb3J0cy5CdWZmZXIgPSBTYWZlQnVmZmVyXG59XG5cbmZ1bmN0aW9uIFNhZmVCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShCdWZmZXIucHJvdG90eXBlKVxuXG4vLyBDb3B5IHN0YXRpYyBtZXRob2RzIGZyb20gQnVmZmVyXG5jb3B5UHJvcHMoQnVmZmVyLCBTYWZlQnVmZmVyKVxuXG5TYWZlQnVmZmVyLmZyb20gPSBmdW5jdGlvbiAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBub3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHJldHVybiBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cblNhZmVCdWZmZXIuYWxsb2MgPSBmdW5jdGlvbiAoc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9XG4gIHZhciBidWYgPSBCdWZmZXIoc2l6ZSlcbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnKSB7XG4gICAgICBidWYuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICB9IGVsc2Uge1xuICAgICAgYnVmLmZpbGwoZmlsbClcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYnVmLmZpbGwoMClcbiAgfVxuICByZXR1cm4gYnVmXG59XG5cblNhZmVCdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlcihzaXplKVxufVxuXG5TYWZlQnVmZmVyLmFsbG9jVW5zYWZlU2xvdyA9IGZ1bmN0aW9uIChzaXplKSB7XG4gIGlmICh0eXBlb2Ygc2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJylcbiAgfVxuICByZXR1cm4gYnVmZmVyLlNsb3dCdWZmZXIoc2l6ZSlcbn1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/safe-buffer/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/sonner/dist/index.mjs":
/*!********************************************!*\
  !*** ./node_modules/sonner/dist/index.mjs ***!
  \********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Toaster: () => (/* binding */ Toaster),\n/* harmony export */   toast: () => (/* binding */ toast),\n/* harmony export */   useSonner: () => (/* binding */ useSonner)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react-dom */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react-dom/index.js\");\n/* __next_internal_client_entry_do_not_use__ Toaster,toast,useSonner auto */ var _s = $RefreshSig$(), _s1 = $RefreshSig$(), _s2 = $RefreshSig$(), _s3 = $RefreshSig$();\nfunction __insertCSS(code) {\n    if (!code || typeof document == 'undefined') return;\n    let head = document.head || document.getElementsByTagName('head')[0];\n    let style = document.createElement('style');\n    style.type = 'text/css';\n    head.appendChild(style);\n    style.styleSheet ? style.styleSheet.cssText = code : style.appendChild(document.createTextNode(code));\n}\n\n\nconst getAsset = (type)=>{\n    switch(type){\n        case 'success':\n            return SuccessIcon;\n        case 'info':\n            return InfoIcon;\n        case 'warning':\n            return WarningIcon;\n        case 'error':\n            return ErrorIcon;\n        default:\n            return null;\n    }\n};\nconst bars = Array(12).fill(0);\nconst Loader = (param)=>{\n    let { visible, className } = param;\n    return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n        className: [\n            'sonner-loading-wrapper',\n            className\n        ].filter(Boolean).join(' '),\n        \"data-visible\": visible\n    }, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n        className: \"sonner-spinner\"\n    }, bars.map((_, i)=>/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n            className: \"sonner-loading-bar\",\n            key: \"spinner-bar-\".concat(i)\n        }))));\n};\n_c = Loader;\nconst SuccessIcon = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 20 20\",\n    fill: \"currentColor\",\n    height: \"20\",\n    width: \"20\"\n}, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n    fillRule: \"evenodd\",\n    d: \"M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z\",\n    clipRule: \"evenodd\"\n}));\nconst WarningIcon = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 24 24\",\n    fill: \"currentColor\",\n    height: \"20\",\n    width: \"20\"\n}, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n    fillRule: \"evenodd\",\n    d: \"M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z\",\n    clipRule: \"evenodd\"\n}));\nconst InfoIcon = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 20 20\",\n    fill: \"currentColor\",\n    height: \"20\",\n    width: \"20\"\n}, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n    fillRule: \"evenodd\",\n    d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z\",\n    clipRule: \"evenodd\"\n}));\nconst ErrorIcon = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    viewBox: \"0 0 20 20\",\n    fill: \"currentColor\",\n    height: \"20\",\n    width: \"20\"\n}, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"path\", {\n    fillRule: \"evenodd\",\n    d: \"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\",\n    clipRule: \"evenodd\"\n}));\nconst CloseIcon = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"svg\", {\n    xmlns: \"http://www.w3.org/2000/svg\",\n    width: \"12\",\n    height: \"12\",\n    viewBox: \"0 0 24 24\",\n    fill: \"none\",\n    stroke: \"currentColor\",\n    strokeWidth: \"1.5\",\n    strokeLinecap: \"round\",\n    strokeLinejoin: \"round\"\n}, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"line\", {\n    x1: \"18\",\n    y1: \"6\",\n    x2: \"6\",\n    y2: \"18\"\n}), /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"line\", {\n    x1: \"6\",\n    y1: \"6\",\n    x2: \"18\",\n    y2: \"18\"\n}));\nconst useIsDocumentHidden = ()=>{\n    _s();\n    const [isDocumentHidden, setIsDocumentHidden] = react__WEBPACK_IMPORTED_MODULE_0__.useState(document.hidden);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"useIsDocumentHidden.useEffect\": ()=>{\n            const callback = {\n                \"useIsDocumentHidden.useEffect.callback\": ()=>{\n                    setIsDocumentHidden(document.hidden);\n                }\n            }[\"useIsDocumentHidden.useEffect.callback\"];\n            document.addEventListener('visibilitychange', callback);\n            return ({\n                \"useIsDocumentHidden.useEffect\": ()=>window.removeEventListener('visibilitychange', callback)\n            })[\"useIsDocumentHidden.useEffect\"];\n        }\n    }[\"useIsDocumentHidden.useEffect\"], []);\n    return isDocumentHidden;\n};\n_s(useIsDocumentHidden, \"RJwWklAunJjdVVAElZ/SoraKxVU=\");\nlet toastsCounter = 1;\nclass Observer {\n    constructor(){\n        // We use arrow functions to maintain the correct `this` reference\n        this.subscribe = (subscriber)=>{\n            this.subscribers.push(subscriber);\n            return ()=>{\n                const index = this.subscribers.indexOf(subscriber);\n                this.subscribers.splice(index, 1);\n            };\n        };\n        this.publish = (data)=>{\n            this.subscribers.forEach((subscriber)=>subscriber(data));\n        };\n        this.addToast = (data)=>{\n            this.publish(data);\n            this.toasts = [\n                ...this.toasts,\n                data\n            ];\n        };\n        this.create = (data)=>{\n            var _data_id;\n            const { message, ...rest } = data;\n            const id = typeof (data == null ? void 0 : data.id) === 'number' || ((_data_id = data.id) == null ? void 0 : _data_id.length) > 0 ? data.id : toastsCounter++;\n            const alreadyExists = this.toasts.find((toast)=>{\n                return toast.id === id;\n            });\n            const dismissible = data.dismissible === undefined ? true : data.dismissible;\n            if (this.dismissedToasts.has(id)) {\n                this.dismissedToasts.delete(id);\n            }\n            if (alreadyExists) {\n                this.toasts = this.toasts.map((toast)=>{\n                    if (toast.id === id) {\n                        this.publish({\n                            ...toast,\n                            ...data,\n                            id,\n                            title: message\n                        });\n                        return {\n                            ...toast,\n                            ...data,\n                            id,\n                            dismissible,\n                            title: message\n                        };\n                    }\n                    return toast;\n                });\n            } else {\n                this.addToast({\n                    title: message,\n                    ...rest,\n                    dismissible,\n                    id\n                });\n            }\n            return id;\n        };\n        this.dismiss = (id)=>{\n            if (id) {\n                this.dismissedToasts.add(id);\n                requestAnimationFrame(()=>this.subscribers.forEach((subscriber)=>subscriber({\n                            id,\n                            dismiss: true\n                        })));\n            } else {\n                this.toasts.forEach((toast)=>{\n                    this.subscribers.forEach((subscriber)=>subscriber({\n                            id: toast.id,\n                            dismiss: true\n                        }));\n                });\n            }\n            return id;\n        };\n        this.message = (message, data)=>{\n            return this.create({\n                ...data,\n                message\n            });\n        };\n        this.error = (message, data)=>{\n            return this.create({\n                ...data,\n                message,\n                type: 'error'\n            });\n        };\n        this.success = (message, data)=>{\n            return this.create({\n                ...data,\n                type: 'success',\n                message\n            });\n        };\n        this.info = (message, data)=>{\n            return this.create({\n                ...data,\n                type: 'info',\n                message\n            });\n        };\n        this.warning = (message, data)=>{\n            return this.create({\n                ...data,\n                type: 'warning',\n                message\n            });\n        };\n        this.loading = (message, data)=>{\n            return this.create({\n                ...data,\n                type: 'loading',\n                message\n            });\n        };\n        this.promise = (promise, data)=>{\n            if (!data) {\n                // Nothing to show\n                return;\n            }\n            let id = undefined;\n            if (data.loading !== undefined) {\n                id = this.create({\n                    ...data,\n                    promise,\n                    type: 'loading',\n                    message: data.loading,\n                    description: typeof data.description !== 'function' ? data.description : undefined\n                });\n            }\n            const p = Promise.resolve(promise instanceof Function ? promise() : promise);\n            let shouldDismiss = id !== undefined;\n            let result;\n            const originalPromise = p.then(async (response)=>{\n                result = [\n                    'resolve',\n                    response\n                ];\n                const isReactElementResponse = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(response);\n                if (isReactElementResponse) {\n                    shouldDismiss = false;\n                    this.create({\n                        id,\n                        type: 'default',\n                        message: response\n                    });\n                } else if (isHttpResponse(response) && !response.ok) {\n                    shouldDismiss = false;\n                    const promiseData = typeof data.error === 'function' ? await data.error(\"HTTP error! status: \".concat(response.status)) : data.error;\n                    const description = typeof data.description === 'function' ? await data.description(\"HTTP error! status: \".concat(response.status)) : data.description;\n                    const isExtendedResult = typeof promiseData === 'object' && !/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(promiseData);\n                    const toastSettings = isExtendedResult ? promiseData : {\n                        message: promiseData\n                    };\n                    this.create({\n                        id,\n                        type: 'error',\n                        description,\n                        ...toastSettings\n                    });\n                } else if (response instanceof Error) {\n                    shouldDismiss = false;\n                    const promiseData = typeof data.error === 'function' ? await data.error(response) : data.error;\n                    const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n                    const isExtendedResult = typeof promiseData === 'object' && !/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(promiseData);\n                    const toastSettings = isExtendedResult ? promiseData : {\n                        message: promiseData\n                    };\n                    this.create({\n                        id,\n                        type: 'error',\n                        description,\n                        ...toastSettings\n                    });\n                } else if (data.success !== undefined) {\n                    shouldDismiss = false;\n                    const promiseData = typeof data.success === 'function' ? await data.success(response) : data.success;\n                    const description = typeof data.description === 'function' ? await data.description(response) : data.description;\n                    const isExtendedResult = typeof promiseData === 'object' && !/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(promiseData);\n                    const toastSettings = isExtendedResult ? promiseData : {\n                        message: promiseData\n                    };\n                    this.create({\n                        id,\n                        type: 'success',\n                        description,\n                        ...toastSettings\n                    });\n                }\n            }).catch(async (error)=>{\n                result = [\n                    'reject',\n                    error\n                ];\n                if (data.error !== undefined) {\n                    shouldDismiss = false;\n                    const promiseData = typeof data.error === 'function' ? await data.error(error) : data.error;\n                    const description = typeof data.description === 'function' ? await data.description(error) : data.description;\n                    const isExtendedResult = typeof promiseData === 'object' && !/*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(promiseData);\n                    const toastSettings = isExtendedResult ? promiseData : {\n                        message: promiseData\n                    };\n                    this.create({\n                        id,\n                        type: 'error',\n                        description,\n                        ...toastSettings\n                    });\n                }\n            }).finally(()=>{\n                if (shouldDismiss) {\n                    // Toast is still in load state (and will be indefinitely — dismiss it)\n                    this.dismiss(id);\n                    id = undefined;\n                }\n                data.finally == null ? void 0 : data.finally.call(data);\n            });\n            const unwrap = ()=>new Promise((resolve, reject)=>originalPromise.then(()=>result[0] === 'reject' ? reject(result[1]) : resolve(result[1])).catch(reject));\n            if (typeof id !== 'string' && typeof id !== 'number') {\n                // cannot Object.assign on undefined\n                return {\n                    unwrap\n                };\n            } else {\n                return Object.assign(id, {\n                    unwrap\n                });\n            }\n        };\n        this.custom = (jsx, data)=>{\n            const id = (data == null ? void 0 : data.id) || toastsCounter++;\n            this.create({\n                jsx: jsx(id),\n                id,\n                ...data\n            });\n            return id;\n        };\n        this.getActiveToasts = ()=>{\n            return this.toasts.filter((toast)=>!this.dismissedToasts.has(toast.id));\n        };\n        this.subscribers = [];\n        this.toasts = [];\n        this.dismissedToasts = new Set();\n    }\n}\nconst ToastState = new Observer();\n// bind this to the toast function\nconst toastFunction = (message, data)=>{\n    const id = (data == null ? void 0 : data.id) || toastsCounter++;\n    ToastState.addToast({\n        title: message,\n        ...data,\n        id\n    });\n    return id;\n};\nconst isHttpResponse = (data)=>{\n    return data && typeof data === 'object' && 'ok' in data && typeof data.ok === 'boolean' && 'status' in data && typeof data.status === 'number';\n};\nconst basicToast = toastFunction;\nconst getHistory = ()=>ToastState.toasts;\nconst getToasts = ()=>ToastState.getActiveToasts();\n// We use `Object.assign` to maintain the correct types as we would lose them otherwise\nconst toast = Object.assign(basicToast, {\n    success: ToastState.success,\n    info: ToastState.info,\n    warning: ToastState.warning,\n    error: ToastState.error,\n    custom: ToastState.custom,\n    message: ToastState.message,\n    promise: ToastState.promise,\n    dismiss: ToastState.dismiss,\n    loading: ToastState.loading\n}, {\n    getHistory,\n    getToasts\n});\n__insertCSS(\"[data-sonner-toaster][dir=ltr],html[dir=ltr]{--toast-icon-margin-start:-3px;--toast-icon-margin-end:4px;--toast-svg-margin-start:-1px;--toast-svg-margin-end:0px;--toast-button-margin-start:auto;--toast-button-margin-end:0;--toast-close-button-start:0;--toast-close-button-end:unset;--toast-close-button-transform:translate(-35%, -35%)}[data-sonner-toaster][dir=rtl],html[dir=rtl]{--toast-icon-margin-start:4px;--toast-icon-margin-end:-3px;--toast-svg-margin-start:0px;--toast-svg-margin-end:-1px;--toast-button-margin-start:0;--toast-button-margin-end:auto;--toast-close-button-start:unset;--toast-close-button-end:0;--toast-close-button-transform:translate(35%, -35%)}[data-sonner-toaster]{position:fixed;width:var(--width);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;--gray1:hsl(0, 0%, 99%);--gray2:hsl(0, 0%, 97.3%);--gray3:hsl(0, 0%, 95.1%);--gray4:hsl(0, 0%, 93%);--gray5:hsl(0, 0%, 90.9%);--gray6:hsl(0, 0%, 88.7%);--gray7:hsl(0, 0%, 85.8%);--gray8:hsl(0, 0%, 78%);--gray9:hsl(0, 0%, 56.1%);--gray10:hsl(0, 0%, 52.3%);--gray11:hsl(0, 0%, 43.5%);--gray12:hsl(0, 0%, 9%);--border-radius:8px;box-sizing:border-box;padding:0;margin:0;list-style:none;outline:0;z-index:999999999;transition:transform .4s ease}@media (hover:none) and (pointer:coarse){[data-sonner-toaster][data-lifted=true]{transform:none}}[data-sonner-toaster][data-x-position=right]{right:var(--offset-right)}[data-sonner-toaster][data-x-position=left]{left:var(--offset-left)}[data-sonner-toaster][data-x-position=center]{left:50%;transform:translateX(-50%)}[data-sonner-toaster][data-y-position=top]{top:var(--offset-top)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--offset-bottom)}[data-sonner-toast]{--y:translateY(100%);--lift-amount:calc(var(--lift) * var(--gap));z-index:var(--z-index);position:absolute;opacity:0;transform:var(--y);touch-action:none;transition:transform .4s,opacity .4s,height .4s,box-shadow .2s;box-sizing:border-box;outline:0;overflow-wrap:anywhere}[data-sonner-toast][data-styled=true]{padding:16px;background:var(--normal-bg);border:1px solid var(--normal-border);color:var(--normal-text);border-radius:var(--border-radius);box-shadow:0 4px 12px rgba(0,0,0,.1);width:var(--width);font-size:13px;display:flex;align-items:center;gap:6px}[data-sonner-toast]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-y-position=top]{top:0;--y:translateY(-100%);--lift:1;--lift-amount:calc(1 * var(--gap))}[data-sonner-toast][data-y-position=bottom]{bottom:0;--y:translateY(100%);--lift:-1;--lift-amount:calc(var(--lift) * var(--gap))}[data-sonner-toast][data-styled=true] [data-description]{font-weight:400;line-height:1.4;color:#3f3f3f}[data-rich-colors=true][data-sonner-toast][data-styled=true] [data-description]{color:inherit}[data-sonner-toaster][data-sonner-theme=dark] [data-description]{color:#e8e8e8}[data-sonner-toast][data-styled=true] [data-title]{font-weight:500;line-height:1.5;color:inherit}[data-sonner-toast][data-styled=true] [data-icon]{display:flex;height:16px;width:16px;position:relative;justify-content:flex-start;align-items:center;flex-shrink:0;margin-left:var(--toast-icon-margin-start);margin-right:var(--toast-icon-margin-end)}[data-sonner-toast][data-promise=true] [data-icon]>svg{opacity:0;transform:scale(.8);transform-origin:center;animation:sonner-fade-in .3s ease forwards}[data-sonner-toast][data-styled=true] [data-icon]>*{flex-shrink:0}[data-sonner-toast][data-styled=true] [data-icon] svg{margin-left:var(--toast-svg-margin-start);margin-right:var(--toast-svg-margin-end)}[data-sonner-toast][data-styled=true] [data-content]{display:flex;flex-direction:column;gap:2px}[data-sonner-toast][data-styled=true] [data-button]{border-radius:4px;padding-left:8px;padding-right:8px;height:24px;font-size:12px;color:var(--normal-bg);background:var(--normal-text);margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end);border:none;font-weight:500;cursor:pointer;outline:0;display:flex;align-items:center;flex-shrink:0;transition:opacity .4s,box-shadow .2s}[data-sonner-toast][data-styled=true] [data-button]:focus-visible{box-shadow:0 0 0 2px rgba(0,0,0,.4)}[data-sonner-toast][data-styled=true] [data-button]:first-of-type{margin-left:var(--toast-button-margin-start);margin-right:var(--toast-button-margin-end)}[data-sonner-toast][data-styled=true] [data-cancel]{color:var(--normal-text);background:rgba(0,0,0,.08)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-styled=true] [data-cancel]{background:rgba(255,255,255,.3)}[data-sonner-toast][data-styled=true] [data-close-button]{position:absolute;left:var(--toast-close-button-start);right:var(--toast-close-button-end);top:0;height:20px;width:20px;display:flex;justify-content:center;align-items:center;padding:0;color:var(--gray12);background:var(--normal-bg);border:1px solid var(--gray4);transform:var(--toast-close-button-transform);border-radius:50%;cursor:pointer;z-index:1;transition:opacity .1s,background .2s,border-color .2s}[data-sonner-toast][data-styled=true] [data-close-button]:focus-visible{box-shadow:0 4px 12px rgba(0,0,0,.1),0 0 0 2px rgba(0,0,0,.2)}[data-sonner-toast][data-styled=true] [data-disabled=true]{cursor:not-allowed}[data-sonner-toast][data-styled=true]:hover [data-close-button]:hover{background:var(--gray2);border-color:var(--gray5)}[data-sonner-toast][data-swiping=true]::before{content:'';position:absolute;left:-100%;right:-100%;height:100%;z-index:-1}[data-sonner-toast][data-y-position=top][data-swiping=true]::before{bottom:50%;transform:scaleY(3) translateY(50%)}[data-sonner-toast][data-y-position=bottom][data-swiping=true]::before{top:50%;transform:scaleY(3) translateY(-50%)}[data-sonner-toast][data-swiping=false][data-removed=true]::before{content:'';position:absolute;inset:0;transform:scaleY(2)}[data-sonner-toast][data-expanded=true]::after{content:'';position:absolute;left:0;height:calc(var(--gap) + 1px);bottom:100%;width:100%}[data-sonner-toast][data-mounted=true]{--y:translateY(0);opacity:1}[data-sonner-toast][data-expanded=false][data-front=false]{--scale:var(--toasts-before) * 0.05 + 1;--y:translateY(calc(var(--lift-amount) * var(--toasts-before))) scale(calc(-1 * var(--scale)));height:var(--front-toast-height)}[data-sonner-toast]>*{transition:opacity .4s}[data-sonner-toast][data-x-position=right]{right:0}[data-sonner-toast][data-x-position=left]{left:0}[data-sonner-toast][data-expanded=false][data-front=false][data-styled=true]>*{opacity:0}[data-sonner-toast][data-visible=false]{opacity:0;pointer-events:none}[data-sonner-toast][data-mounted=true][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset)));height:var(--initial-height)}[data-sonner-toast][data-removed=true][data-front=true][data-swipe-out=false]{--y:translateY(calc(var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=true]{--y:translateY(calc(var(--lift) * var(--offset) + var(--lift) * -100%));opacity:0}[data-sonner-toast][data-removed=true][data-front=false][data-swipe-out=false][data-expanded=false]{--y:translateY(40%);opacity:0;transition:transform .5s,opacity .2s}[data-sonner-toast][data-removed=true][data-front=false]::before{height:calc(var(--initial-height) + 20%)}[data-sonner-toast][data-swiping=true]{transform:var(--y) translateY(var(--swipe-amount-y,0)) translateX(var(--swipe-amount-x,0));transition:none}[data-sonner-toast][data-swiped=true]{user-select:none}[data-sonner-toast][data-swipe-out=true][data-y-position=bottom],[data-sonner-toast][data-swipe-out=true][data-y-position=top]{animation-duration:.2s;animation-timing-function:ease-out;animation-fill-mode:forwards}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=left]{animation-name:swipe-out-left}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=right]{animation-name:swipe-out-right}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=up]{animation-name:swipe-out-up}[data-sonner-toast][data-swipe-out=true][data-swipe-direction=down]{animation-name:swipe-out-down}@keyframes swipe-out-left{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) - 100%));opacity:0}}@keyframes swipe-out-right{from{transform:var(--y) translateX(var(--swipe-amount-x));opacity:1}to{transform:var(--y) translateX(calc(var(--swipe-amount-x) + 100%));opacity:0}}@keyframes swipe-out-up{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) - 100%));opacity:0}}@keyframes swipe-out-down{from{transform:var(--y) translateY(var(--swipe-amount-y));opacity:1}to{transform:var(--y) translateY(calc(var(--swipe-amount-y) + 100%));opacity:0}}@media (max-width:600px){[data-sonner-toaster]{position:fixed;right:var(--mobile-offset-right);left:var(--mobile-offset-left);width:100%}[data-sonner-toaster][dir=rtl]{left:calc(var(--mobile-offset-left) * -1)}[data-sonner-toaster] [data-sonner-toast]{left:0;right:0;width:calc(100% - var(--mobile-offset-left) * 2)}[data-sonner-toaster][data-x-position=left]{left:var(--mobile-offset-left)}[data-sonner-toaster][data-y-position=bottom]{bottom:var(--mobile-offset-bottom)}[data-sonner-toaster][data-y-position=top]{top:var(--mobile-offset-top)}[data-sonner-toaster][data-x-position=center]{left:var(--mobile-offset-left);right:var(--mobile-offset-right);transform:none}}[data-sonner-toaster][data-sonner-theme=light]{--normal-bg:#fff;--normal-border:var(--gray4);--normal-text:var(--gray12);--success-bg:hsl(143, 85%, 96%);--success-border:hsl(145, 92%, 87%);--success-text:hsl(140, 100%, 27%);--info-bg:hsl(208, 100%, 97%);--info-border:hsl(221, 91%, 93%);--info-text:hsl(210, 92%, 45%);--warning-bg:hsl(49, 100%, 97%);--warning-border:hsl(49, 91%, 84%);--warning-text:hsl(31, 92%, 45%);--error-bg:hsl(359, 100%, 97%);--error-border:hsl(359, 100%, 94%);--error-text:hsl(360, 100%, 45%)}[data-sonner-toaster][data-sonner-theme=light] [data-sonner-toast][data-invert=true]{--normal-bg:#000;--normal-border:hsl(0, 0%, 20%);--normal-text:var(--gray1)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast][data-invert=true]{--normal-bg:#fff;--normal-border:var(--gray3);--normal-text:var(--gray12)}[data-sonner-toaster][data-sonner-theme=dark]{--normal-bg:#000;--normal-bg-hover:hsl(0, 0%, 12%);--normal-border:hsl(0, 0%, 20%);--normal-border-hover:hsl(0, 0%, 25%);--normal-text:var(--gray1);--success-bg:hsl(150, 100%, 6%);--success-border:hsl(147, 100%, 12%);--success-text:hsl(150, 86%, 65%);--info-bg:hsl(215, 100%, 6%);--info-border:hsl(223, 43%, 17%);--info-text:hsl(216, 87%, 65%);--warning-bg:hsl(64, 100%, 6%);--warning-border:hsl(60, 100%, 9%);--warning-text:hsl(46, 87%, 65%);--error-bg:hsl(358, 76%, 10%);--error-border:hsl(357, 89%, 16%);--error-text:hsl(358, 100%, 81%)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]{background:var(--normal-bg);border-color:var(--normal-border);color:var(--normal-text)}[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover{background:var(--normal-bg-hover);border-color:var(--normal-border-hover)}[data-rich-colors=true][data-sonner-toast][data-type=success]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=success] [data-close-button]{background:var(--success-bg);border-color:var(--success-border);color:var(--success-text)}[data-rich-colors=true][data-sonner-toast][data-type=info]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=info] [data-close-button]{background:var(--info-bg);border-color:var(--info-border);color:var(--info-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=warning] [data-close-button]{background:var(--warning-bg);border-color:var(--warning-border);color:var(--warning-text)}[data-rich-colors=true][data-sonner-toast][data-type=error]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}[data-rich-colors=true][data-sonner-toast][data-type=error] [data-close-button]{background:var(--error-bg);border-color:var(--error-border);color:var(--error-text)}.sonner-loading-wrapper{--size:16px;height:var(--size);width:var(--size);position:absolute;inset:0;z-index:10}.sonner-loading-wrapper[data-visible=false]{transform-origin:center;animation:sonner-fade-out .2s ease forwards}.sonner-spinner{position:relative;top:50%;left:50%;height:var(--size);width:var(--size)}.sonner-loading-bar{animation:sonner-spin 1.2s linear infinite;background:var(--gray11);border-radius:6px;height:8%;left:-10%;position:absolute;top:-3.9%;width:24%}.sonner-loading-bar:first-child{animation-delay:-1.2s;transform:rotate(.0001deg) translate(146%)}.sonner-loading-bar:nth-child(2){animation-delay:-1.1s;transform:rotate(30deg) translate(146%)}.sonner-loading-bar:nth-child(3){animation-delay:-1s;transform:rotate(60deg) translate(146%)}.sonner-loading-bar:nth-child(4){animation-delay:-.9s;transform:rotate(90deg) translate(146%)}.sonner-loading-bar:nth-child(5){animation-delay:-.8s;transform:rotate(120deg) translate(146%)}.sonner-loading-bar:nth-child(6){animation-delay:-.7s;transform:rotate(150deg) translate(146%)}.sonner-loading-bar:nth-child(7){animation-delay:-.6s;transform:rotate(180deg) translate(146%)}.sonner-loading-bar:nth-child(8){animation-delay:-.5s;transform:rotate(210deg) translate(146%)}.sonner-loading-bar:nth-child(9){animation-delay:-.4s;transform:rotate(240deg) translate(146%)}.sonner-loading-bar:nth-child(10){animation-delay:-.3s;transform:rotate(270deg) translate(146%)}.sonner-loading-bar:nth-child(11){animation-delay:-.2s;transform:rotate(300deg) translate(146%)}.sonner-loading-bar:nth-child(12){animation-delay:-.1s;transform:rotate(330deg) translate(146%)}@keyframes sonner-fade-in{0%{opacity:0;transform:scale(.8)}100%{opacity:1;transform:scale(1)}}@keyframes sonner-fade-out{0%{opacity:1;transform:scale(1)}100%{opacity:0;transform:scale(.8)}}@keyframes sonner-spin{0%{opacity:1}100%{opacity:.15}}@media (prefers-reduced-motion){.sonner-loading-bar,[data-sonner-toast],[data-sonner-toast]>*{transition:none!important;animation:none!important}}.sonner-loader{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);transform-origin:center;transition:opacity .2s,transform .2s}.sonner-loader[data-visible=false]{opacity:0;transform:scale(.8) translate(-50%,-50%)}\");\nfunction isAction(action) {\n    return action.label !== undefined;\n}\n// Visible toasts amount\nconst VISIBLE_TOASTS_AMOUNT = 3;\n// Viewport padding\nconst VIEWPORT_OFFSET = '24px';\n// Mobile viewport padding\nconst MOBILE_VIEWPORT_OFFSET = '16px';\n// Default lifetime of a toasts (in ms)\nconst TOAST_LIFETIME = 4000;\n// Default toast width\nconst TOAST_WIDTH = 356;\n// Default gap between toasts\nconst GAP = 14;\n// Threshold to dismiss a toast\nconst SWIPE_THRESHOLD = 45;\n// Equal to exit animation duration\nconst TIME_BEFORE_UNMOUNT = 200;\nfunction cn() {\n    for(var _len = arguments.length, classes = new Array(_len), _key = 0; _key < _len; _key++){\n        classes[_key] = arguments[_key];\n    }\n    return classes.filter(Boolean).join(' ');\n}\nfunction getDefaultSwipeDirections(position) {\n    const [y, x] = position.split('-');\n    const directions = [];\n    if (y) {\n        directions.push(y);\n    }\n    if (x) {\n        directions.push(x);\n    }\n    return directions;\n}\nconst Toast = (props)=>{\n    _s1();\n    var _toast_classNames, _toast_classNames1, _toast_classNames2, _toast_classNames3, _toast_classNames4, _toast_classNames5, _toast_classNames6, _toast_classNames7, _toast_classNames8;\n    const { invert: ToasterInvert, toast, unstyled, interacting, setHeights, visibleToasts, heights, index, toasts, expanded, removeToast, defaultRichColors, closeButton: closeButtonFromToaster, style, cancelButtonStyle, actionButtonStyle, className = '', descriptionClassName = '', duration: durationFromToaster, position, gap, expandByDefault, classNames, icons, closeButtonAriaLabel = 'Close toast' } = props;\n    const [swipeDirection, setSwipeDirection] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n    const [swipeOutDirection, setSwipeOutDirection] = react__WEBPACK_IMPORTED_MODULE_0__.useState(null);\n    const [mounted, setMounted] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n    const [removed, setRemoved] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n    const [swiping, setSwiping] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n    const [swipeOut, setSwipeOut] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n    const [isSwiped, setIsSwiped] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n    const [offsetBeforeRemove, setOffsetBeforeRemove] = react__WEBPACK_IMPORTED_MODULE_0__.useState(0);\n    const [initialHeight, setInitialHeight] = react__WEBPACK_IMPORTED_MODULE_0__.useState(0);\n    const remainingTime = react__WEBPACK_IMPORTED_MODULE_0__.useRef(toast.duration || durationFromToaster || TOAST_LIFETIME);\n    const dragStartTime = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n    const toastRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n    const isFront = index === 0;\n    const isVisible = index + 1 <= visibleToasts;\n    const toastType = toast.type;\n    const dismissible = toast.dismissible !== false;\n    const toastClassname = toast.className || '';\n    const toastDescriptionClassname = toast.descriptionClassName || '';\n    // Height index is used to calculate the offset as it gets updated before the toast array, which means we can calculate the new layout faster.\n    const heightIndex = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n        \"Toast.useMemo[heightIndex]\": ()=>heights.findIndex({\n                \"Toast.useMemo[heightIndex]\": (height)=>height.toastId === toast.id\n            }[\"Toast.useMemo[heightIndex]\"]) || 0\n    }[\"Toast.useMemo[heightIndex]\"], [\n        heights,\n        toast.id\n    ]);\n    const closeButton = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n        \"Toast.useMemo[closeButton]\": ()=>{\n            var _toast_closeButton;\n            return (_toast_closeButton = toast.closeButton) != null ? _toast_closeButton : closeButtonFromToaster;\n        }\n    }[\"Toast.useMemo[closeButton]\"], [\n        toast.closeButton,\n        closeButtonFromToaster\n    ]);\n    const duration = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n        \"Toast.useMemo[duration]\": ()=>toast.duration || durationFromToaster || TOAST_LIFETIME\n    }[\"Toast.useMemo[duration]\"], [\n        toast.duration,\n        durationFromToaster\n    ]);\n    const closeTimerStartTimeRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(0);\n    const offset = react__WEBPACK_IMPORTED_MODULE_0__.useRef(0);\n    const lastCloseTimerStartTimeRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(0);\n    const pointerStartRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n    const [y, x] = position.split('-');\n    const toastsHeightBefore = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n        \"Toast.useMemo[toastsHeightBefore]\": ()=>{\n            return heights.reduce({\n                \"Toast.useMemo[toastsHeightBefore]\": (prev, curr, reducerIndex)=>{\n                    // Calculate offset up until current toast\n                    if (reducerIndex >= heightIndex) {\n                        return prev;\n                    }\n                    return prev + curr.height;\n                }\n            }[\"Toast.useMemo[toastsHeightBefore]\"], 0);\n        }\n    }[\"Toast.useMemo[toastsHeightBefore]\"], [\n        heights,\n        heightIndex\n    ]);\n    const isDocumentHidden = useIsDocumentHidden();\n    const invert = toast.invert || ToasterInvert;\n    const disabled = toastType === 'loading';\n    offset.current = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n        \"Toast.useMemo\": ()=>heightIndex * gap + toastsHeightBefore\n    }[\"Toast.useMemo\"], [\n        heightIndex,\n        toastsHeightBefore\n    ]);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"Toast.useEffect\": ()=>{\n            remainingTime.current = duration;\n        }\n    }[\"Toast.useEffect\"], [\n        duration\n    ]);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"Toast.useEffect\": ()=>{\n            // Trigger enter animation without using CSS animation\n            setMounted(true);\n        }\n    }[\"Toast.useEffect\"], []);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"Toast.useEffect\": ()=>{\n            const toastNode = toastRef.current;\n            if (toastNode) {\n                const height = toastNode.getBoundingClientRect().height;\n                // Add toast height to heights array after the toast is mounted\n                setInitialHeight(height);\n                setHeights({\n                    \"Toast.useEffect\": (h)=>[\n                            {\n                                toastId: toast.id,\n                                height,\n                                position: toast.position\n                            },\n                            ...h\n                        ]\n                }[\"Toast.useEffect\"]);\n                return ({\n                    \"Toast.useEffect\": ()=>setHeights({\n                            \"Toast.useEffect\": (h)=>h.filter({\n                                    \"Toast.useEffect\": (height)=>height.toastId !== toast.id\n                                }[\"Toast.useEffect\"])\n                        }[\"Toast.useEffect\"])\n                })[\"Toast.useEffect\"];\n            }\n        }\n    }[\"Toast.useEffect\"], [\n        setHeights,\n        toast.id\n    ]);\n    react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect({\n        \"Toast.useLayoutEffect\": ()=>{\n            // Keep height up to date with the content in case it updates\n            if (!mounted) return;\n            const toastNode = toastRef.current;\n            const originalHeight = toastNode.style.height;\n            toastNode.style.height = 'auto';\n            const newHeight = toastNode.getBoundingClientRect().height;\n            toastNode.style.height = originalHeight;\n            setInitialHeight(newHeight);\n            setHeights({\n                \"Toast.useLayoutEffect\": (heights)=>{\n                    const alreadyExists = heights.find({\n                        \"Toast.useLayoutEffect.alreadyExists\": (height)=>height.toastId === toast.id\n                    }[\"Toast.useLayoutEffect.alreadyExists\"]);\n                    if (!alreadyExists) {\n                        return [\n                            {\n                                toastId: toast.id,\n                                height: newHeight,\n                                position: toast.position\n                            },\n                            ...heights\n                        ];\n                    } else {\n                        return heights.map({\n                            \"Toast.useLayoutEffect\": (height)=>height.toastId === toast.id ? {\n                                    ...height,\n                                    height: newHeight\n                                } : height\n                        }[\"Toast.useLayoutEffect\"]);\n                    }\n                }\n            }[\"Toast.useLayoutEffect\"]);\n        }\n    }[\"Toast.useLayoutEffect\"], [\n        mounted,\n        toast.title,\n        toast.description,\n        setHeights,\n        toast.id,\n        toast.jsx,\n        toast.action,\n        toast.cancel\n    ]);\n    const deleteToast = react__WEBPACK_IMPORTED_MODULE_0__.useCallback({\n        \"Toast.useCallback[deleteToast]\": ()=>{\n            // Save the offset for the exit swipe animation\n            setRemoved(true);\n            setOffsetBeforeRemove(offset.current);\n            setHeights({\n                \"Toast.useCallback[deleteToast]\": (h)=>h.filter({\n                        \"Toast.useCallback[deleteToast]\": (height)=>height.toastId !== toast.id\n                    }[\"Toast.useCallback[deleteToast]\"])\n            }[\"Toast.useCallback[deleteToast]\"]);\n            setTimeout({\n                \"Toast.useCallback[deleteToast]\": ()=>{\n                    removeToast(toast);\n                }\n            }[\"Toast.useCallback[deleteToast]\"], TIME_BEFORE_UNMOUNT);\n        }\n    }[\"Toast.useCallback[deleteToast]\"], [\n        toast,\n        removeToast,\n        setHeights,\n        offset\n    ]);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"Toast.useEffect\": ()=>{\n            if (toast.promise && toastType === 'loading' || toast.duration === Infinity || toast.type === 'loading') return;\n            let timeoutId;\n            // Pause the timer on each hover\n            const pauseTimer = {\n                \"Toast.useEffect.pauseTimer\": ()=>{\n                    if (lastCloseTimerStartTimeRef.current < closeTimerStartTimeRef.current) {\n                        // Get the elapsed time since the timer started\n                        const elapsedTime = new Date().getTime() - closeTimerStartTimeRef.current;\n                        remainingTime.current = remainingTime.current - elapsedTime;\n                    }\n                    lastCloseTimerStartTimeRef.current = new Date().getTime();\n                }\n            }[\"Toast.useEffect.pauseTimer\"];\n            const startTimer = {\n                \"Toast.useEffect.startTimer\": ()=>{\n                    // setTimeout(, Infinity) behaves as if the delay is 0.\n                    // As a result, the toast would be closed immediately, giving the appearance that it was never rendered.\n                    // See: https://github.com/denysdovhan/wtfjs?tab=readme-ov-file#an-infinite-timeout\n                    if (remainingTime.current === Infinity) return;\n                    closeTimerStartTimeRef.current = new Date().getTime();\n                    // Let the toast know it has started\n                    timeoutId = setTimeout({\n                        \"Toast.useEffect.startTimer\": ()=>{\n                            toast.onAutoClose == null ? void 0 : toast.onAutoClose.call(toast, toast);\n                            deleteToast();\n                        }\n                    }[\"Toast.useEffect.startTimer\"], remainingTime.current);\n                }\n            }[\"Toast.useEffect.startTimer\"];\n            if (expanded || interacting || isDocumentHidden) {\n                pauseTimer();\n            } else {\n                startTimer();\n            }\n            return ({\n                \"Toast.useEffect\": ()=>clearTimeout(timeoutId)\n            })[\"Toast.useEffect\"];\n        }\n    }[\"Toast.useEffect\"], [\n        expanded,\n        interacting,\n        toast,\n        toastType,\n        isDocumentHidden,\n        deleteToast\n    ]);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"Toast.useEffect\": ()=>{\n            if (toast.delete) {\n                deleteToast();\n                toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n            }\n        }\n    }[\"Toast.useEffect\"], [\n        deleteToast,\n        toast.delete\n    ]);\n    function getLoadingIcon() {\n        var _toast_classNames;\n        if (icons == null ? void 0 : icons.loading) {\n            var _toast_classNames1;\n            return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n                className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1.loader, 'sonner-loader'),\n                \"data-visible\": toastType === 'loading'\n            }, icons.loading);\n        }\n        return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(Loader, {\n            className: cn(classNames == null ? void 0 : classNames.loader, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.loader),\n            visible: toastType === 'loading'\n        });\n    }\n    const icon = toast.icon || (icons == null ? void 0 : icons[toastType]) || getAsset(toastType);\n    var _toast_richColors, _icons_close;\n    return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"li\", {\n        tabIndex: 0,\n        ref: toastRef,\n        className: cn(className, toastClassname, classNames == null ? void 0 : classNames.toast, toast == null ? void 0 : (_toast_classNames = toast.classNames) == null ? void 0 : _toast_classNames.toast, classNames == null ? void 0 : classNames.default, classNames == null ? void 0 : classNames[toastType], toast == null ? void 0 : (_toast_classNames1 = toast.classNames) == null ? void 0 : _toast_classNames1[toastType]),\n        \"data-sonner-toast\": \"\",\n        \"data-rich-colors\": (_toast_richColors = toast.richColors) != null ? _toast_richColors : defaultRichColors,\n        \"data-styled\": !Boolean(toast.jsx || toast.unstyled || unstyled),\n        \"data-mounted\": mounted,\n        \"data-promise\": Boolean(toast.promise),\n        \"data-swiped\": isSwiped,\n        \"data-removed\": removed,\n        \"data-visible\": isVisible,\n        \"data-y-position\": y,\n        \"data-x-position\": x,\n        \"data-index\": index,\n        \"data-front\": isFront,\n        \"data-swiping\": swiping,\n        \"data-dismissible\": dismissible,\n        \"data-type\": toastType,\n        \"data-invert\": invert,\n        \"data-swipe-out\": swipeOut,\n        \"data-swipe-direction\": swipeOutDirection,\n        \"data-expanded\": Boolean(expanded || expandByDefault && mounted),\n        \"data-testid\": toast.testId,\n        style: {\n            '--index': index,\n            '--toasts-before': index,\n            '--z-index': toasts.length - index,\n            '--offset': \"\".concat(removed ? offsetBeforeRemove : offset.current, \"px\"),\n            '--initial-height': expandByDefault ? 'auto' : \"\".concat(initialHeight, \"px\"),\n            ...style,\n            ...toast.style\n        },\n        onDragEnd: ()=>{\n            setSwiping(false);\n            setSwipeDirection(null);\n            pointerStartRef.current = null;\n        },\n        onPointerDown: (event)=>{\n            if (event.button === 2) return; // Return early on right click\n            if (disabled || !dismissible) return;\n            dragStartTime.current = new Date();\n            setOffsetBeforeRemove(offset.current);\n            // Ensure we maintain correct pointer capture even when going outside of the toast (e.g. when swiping)\n            event.target.setPointerCapture(event.pointerId);\n            if (event.target.tagName === 'BUTTON') return;\n            setSwiping(true);\n            pointerStartRef.current = {\n                x: event.clientX,\n                y: event.clientY\n            };\n        },\n        onPointerUp: ()=>{\n            var _toastRef_current, _toastRef_current1, _dragStartTime_current;\n            if (swipeOut || !dismissible) return;\n            pointerStartRef.current = null;\n            const swipeAmountX = Number(((_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.getPropertyValue('--swipe-amount-x').replace('px', '')) || 0);\n            const swipeAmountY = Number(((_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.getPropertyValue('--swipe-amount-y').replace('px', '')) || 0);\n            const timeTaken = new Date().getTime() - ((_dragStartTime_current = dragStartTime.current) == null ? void 0 : _dragStartTime_current.getTime());\n            const swipeAmount = swipeDirection === 'x' ? swipeAmountX : swipeAmountY;\n            const velocity = Math.abs(swipeAmount) / timeTaken;\n            if (Math.abs(swipeAmount) >= SWIPE_THRESHOLD || velocity > 0.11) {\n                setOffsetBeforeRemove(offset.current);\n                toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n                if (swipeDirection === 'x') {\n                    setSwipeOutDirection(swipeAmountX > 0 ? 'right' : 'left');\n                } else {\n                    setSwipeOutDirection(swipeAmountY > 0 ? 'down' : 'up');\n                }\n                deleteToast();\n                setSwipeOut(true);\n                return;\n            } else {\n                var _toastRef_current2, _toastRef_current3;\n                (_toastRef_current2 = toastRef.current) == null ? void 0 : _toastRef_current2.style.setProperty('--swipe-amount-x', \"0px\");\n                (_toastRef_current3 = toastRef.current) == null ? void 0 : _toastRef_current3.style.setProperty('--swipe-amount-y', \"0px\");\n            }\n            setIsSwiped(false);\n            setSwiping(false);\n            setSwipeDirection(null);\n        },\n        onPointerMove: (event)=>{\n            var _window_getSelection, _toastRef_current, _toastRef_current1;\n            if (!pointerStartRef.current || !dismissible) return;\n            const isHighlighted = ((_window_getSelection = window.getSelection()) == null ? void 0 : _window_getSelection.toString().length) > 0;\n            if (isHighlighted) return;\n            const yDelta = event.clientY - pointerStartRef.current.y;\n            const xDelta = event.clientX - pointerStartRef.current.x;\n            var _props_swipeDirections;\n            const swipeDirections = (_props_swipeDirections = props.swipeDirections) != null ? _props_swipeDirections : getDefaultSwipeDirections(position);\n            // Determine swipe direction if not already locked\n            if (!swipeDirection && (Math.abs(xDelta) > 1 || Math.abs(yDelta) > 1)) {\n                setSwipeDirection(Math.abs(xDelta) > Math.abs(yDelta) ? 'x' : 'y');\n            }\n            let swipeAmount = {\n                x: 0,\n                y: 0\n            };\n            const getDampening = (delta)=>{\n                const factor = Math.abs(delta) / 20;\n                return 1 / (1.5 + factor);\n            };\n            // Only apply swipe in the locked direction\n            if (swipeDirection === 'y') {\n                // Handle vertical swipes\n                if (swipeDirections.includes('top') || swipeDirections.includes('bottom')) {\n                    if (swipeDirections.includes('top') && yDelta < 0 || swipeDirections.includes('bottom') && yDelta > 0) {\n                        swipeAmount.y = yDelta;\n                    } else {\n                        // Smoothly transition to dampened movement\n                        const dampenedDelta = yDelta * getDampening(yDelta);\n                        // Ensure we don't jump when transitioning to dampened movement\n                        swipeAmount.y = Math.abs(dampenedDelta) < Math.abs(yDelta) ? dampenedDelta : yDelta;\n                    }\n                }\n            } else if (swipeDirection === 'x') {\n                // Handle horizontal swipes\n                if (swipeDirections.includes('left') || swipeDirections.includes('right')) {\n                    if (swipeDirections.includes('left') && xDelta < 0 || swipeDirections.includes('right') && xDelta > 0) {\n                        swipeAmount.x = xDelta;\n                    } else {\n                        // Smoothly transition to dampened movement\n                        const dampenedDelta = xDelta * getDampening(xDelta);\n                        // Ensure we don't jump when transitioning to dampened movement\n                        swipeAmount.x = Math.abs(dampenedDelta) < Math.abs(xDelta) ? dampenedDelta : xDelta;\n                    }\n                }\n            }\n            if (Math.abs(swipeAmount.x) > 0 || Math.abs(swipeAmount.y) > 0) {\n                setIsSwiped(true);\n            }\n            (_toastRef_current = toastRef.current) == null ? void 0 : _toastRef_current.style.setProperty('--swipe-amount-x', \"\".concat(swipeAmount.x, \"px\"));\n            (_toastRef_current1 = toastRef.current) == null ? void 0 : _toastRef_current1.style.setProperty('--swipe-amount-y', \"\".concat(swipeAmount.y, \"px\"));\n        }\n    }, closeButton && !toast.jsx && toastType !== 'loading' ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n        \"aria-label\": closeButtonAriaLabel,\n        \"data-disabled\": disabled,\n        \"data-close-button\": true,\n        onClick: disabled || !dismissible ? ()=>{} : ()=>{\n            deleteToast();\n            toast.onDismiss == null ? void 0 : toast.onDismiss.call(toast, toast);\n        },\n        className: cn(classNames == null ? void 0 : classNames.closeButton, toast == null ? void 0 : (_toast_classNames2 = toast.classNames) == null ? void 0 : _toast_classNames2.closeButton)\n    }, (_icons_close = icons == null ? void 0 : icons.close) != null ? _icons_close : CloseIcon) : null, (toastType || toast.icon || toast.promise) && toast.icon !== null && ((icons == null ? void 0 : icons[toastType]) !== null || toast.icon) ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n        \"data-icon\": \"\",\n        className: cn(classNames == null ? void 0 : classNames.icon, toast == null ? void 0 : (_toast_classNames3 = toast.classNames) == null ? void 0 : _toast_classNames3.icon)\n    }, toast.promise || toast.type === 'loading' && !toast.icon ? toast.icon || getLoadingIcon() : null, toast.type !== 'loading' ? icon : null) : null, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n        \"data-content\": \"\",\n        className: cn(classNames == null ? void 0 : classNames.content, toast == null ? void 0 : (_toast_classNames4 = toast.classNames) == null ? void 0 : _toast_classNames4.content)\n    }, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n        \"data-title\": \"\",\n        className: cn(classNames == null ? void 0 : classNames.title, toast == null ? void 0 : (_toast_classNames5 = toast.classNames) == null ? void 0 : _toast_classNames5.title)\n    }, toast.jsx ? toast.jsx : typeof toast.title === 'function' ? toast.title() : toast.title), toast.description ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"div\", {\n        \"data-description\": \"\",\n        className: cn(descriptionClassName, toastDescriptionClassname, classNames == null ? void 0 : classNames.description, toast == null ? void 0 : (_toast_classNames6 = toast.classNames) == null ? void 0 : _toast_classNames6.description)\n    }, typeof toast.description === 'function' ? toast.description() : toast.description) : null), /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(toast.cancel) ? toast.cancel : toast.cancel && isAction(toast.cancel) ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n        \"data-button\": true,\n        \"data-cancel\": true,\n        style: toast.cancelButtonStyle || cancelButtonStyle,\n        onClick: (event)=>{\n            // We need to check twice because typescript\n            if (!isAction(toast.cancel)) return;\n            if (!dismissible) return;\n            toast.cancel.onClick == null ? void 0 : toast.cancel.onClick.call(toast.cancel, event);\n            deleteToast();\n        },\n        className: cn(classNames == null ? void 0 : classNames.cancelButton, toast == null ? void 0 : (_toast_classNames7 = toast.classNames) == null ? void 0 : _toast_classNames7.cancelButton)\n    }, toast.cancel.label) : null, /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.isValidElement(toast.action) ? toast.action : toast.action && isAction(toast.action) ? /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"button\", {\n        \"data-button\": true,\n        \"data-action\": true,\n        style: toast.actionButtonStyle || actionButtonStyle,\n        onClick: (event)=>{\n            // We need to check twice because typescript\n            if (!isAction(toast.action)) return;\n            toast.action.onClick == null ? void 0 : toast.action.onClick.call(toast.action, event);\n            if (event.defaultPrevented) return;\n            deleteToast();\n        },\n        className: cn(classNames == null ? void 0 : classNames.actionButton, toast == null ? void 0 : (_toast_classNames8 = toast.classNames) == null ? void 0 : _toast_classNames8.actionButton)\n    }, toast.action.label) : null);\n};\n_s1(Toast, \"Hs2RwklMUctKsF2fEbXUzesmn3w=\", false, function() {\n    return [\n        useIsDocumentHidden\n    ];\n});\n_c1 = Toast;\nfunction getDocumentDirection() {\n    if (typeof window === 'undefined') return 'ltr';\n    if (typeof document === 'undefined') return 'ltr'; // For Fresh purpose\n    const dirAttribute = document.documentElement.getAttribute('dir');\n    if (dirAttribute === 'auto' || !dirAttribute) {\n        return window.getComputedStyle(document.documentElement).direction;\n    }\n    return dirAttribute;\n}\nfunction assignOffset(defaultOffset, mobileOffset) {\n    const styles = {};\n    [\n        defaultOffset,\n        mobileOffset\n    ].forEach((offset, index)=>{\n        const isMobile = index === 1;\n        const prefix = isMobile ? '--mobile-offset' : '--offset';\n        const defaultValue = isMobile ? MOBILE_VIEWPORT_OFFSET : VIEWPORT_OFFSET;\n        function assignAll(offset) {\n            [\n                'top',\n                'right',\n                'bottom',\n                'left'\n            ].forEach((key)=>{\n                styles[\"\".concat(prefix, \"-\").concat(key)] = typeof offset === 'number' ? \"\".concat(offset, \"px\") : offset;\n            });\n        }\n        if (typeof offset === 'number' || typeof offset === 'string') {\n            assignAll(offset);\n        } else if (typeof offset === 'object') {\n            [\n                'top',\n                'right',\n                'bottom',\n                'left'\n            ].forEach((key)=>{\n                if (offset[key] === undefined) {\n                    styles[\"\".concat(prefix, \"-\").concat(key)] = defaultValue;\n                } else {\n                    styles[\"\".concat(prefix, \"-\").concat(key)] = typeof offset[key] === 'number' ? \"\".concat(offset[key], \"px\") : offset[key];\n                }\n            });\n        } else {\n            assignAll(defaultValue);\n        }\n    });\n    return styles;\n}\nfunction useSonner() {\n    _s2();\n    const [activeToasts, setActiveToasts] = react__WEBPACK_IMPORTED_MODULE_0__.useState([]);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"useSonner.useEffect\": ()=>{\n            return ToastState.subscribe({\n                \"useSonner.useEffect\": (toast)=>{\n                    if (toast.dismiss) {\n                        setTimeout({\n                            \"useSonner.useEffect\": ()=>{\n                                react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync({\n                                    \"useSonner.useEffect\": ()=>{\n                                        setActiveToasts({\n                                            \"useSonner.useEffect\": (toasts)=>toasts.filter({\n                                                    \"useSonner.useEffect\": (t)=>t.id !== toast.id\n                                                }[\"useSonner.useEffect\"])\n                                        }[\"useSonner.useEffect\"]);\n                                    }\n                                }[\"useSonner.useEffect\"]);\n                            }\n                        }[\"useSonner.useEffect\"]);\n                        return;\n                    }\n                    // Prevent batching, temp solution.\n                    setTimeout({\n                        \"useSonner.useEffect\": ()=>{\n                            react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync({\n                                \"useSonner.useEffect\": ()=>{\n                                    setActiveToasts({\n                                        \"useSonner.useEffect\": (toasts)=>{\n                                            const indexOfExistingToast = toasts.findIndex({\n                                                \"useSonner.useEffect.indexOfExistingToast\": (t)=>t.id === toast.id\n                                            }[\"useSonner.useEffect.indexOfExistingToast\"]);\n                                            // Update the toast if it already exists\n                                            if (indexOfExistingToast !== -1) {\n                                                return [\n                                                    ...toasts.slice(0, indexOfExistingToast),\n                                                    {\n                                                        ...toasts[indexOfExistingToast],\n                                                        ...toast\n                                                    },\n                                                    ...toasts.slice(indexOfExistingToast + 1)\n                                                ];\n                                            }\n                                            return [\n                                                toast,\n                                                ...toasts\n                                            ];\n                                        }\n                                    }[\"useSonner.useEffect\"]);\n                                }\n                            }[\"useSonner.useEffect\"]);\n                        }\n                    }[\"useSonner.useEffect\"]);\n                }\n            }[\"useSonner.useEffect\"]);\n        }\n    }[\"useSonner.useEffect\"], []);\n    return {\n        toasts: activeToasts\n    };\n}\n_s2(useSonner, \"wvKkrpl8d9UBJsfUcWYgFEOa7SA=\");\nconst Toaster = /*#__PURE__*/ _s3(react__WEBPACK_IMPORTED_MODULE_0__.forwardRef(_c2 = _s3(function Toaster(props, ref) {\n    _s3();\n    const { id, invert, position = 'bottom-right', hotkey = [\n        'altKey',\n        'KeyT'\n    ], expand, closeButton, className, offset, mobileOffset, theme = 'light', richColors, duration, style, visibleToasts = VISIBLE_TOASTS_AMOUNT, toastOptions, dir = getDocumentDirection(), gap = GAP, icons, containerAriaLabel = 'Notifications' } = props;\n    const [toasts, setToasts] = react__WEBPACK_IMPORTED_MODULE_0__.useState([]);\n    const filteredToasts = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n        \"Toaster.Toaster.useMemo[filteredToasts]\": ()=>{\n            if (id) {\n                return toasts.filter({\n                    \"Toaster.Toaster.useMemo[filteredToasts]\": (toast)=>toast.toasterId === id\n                }[\"Toaster.Toaster.useMemo[filteredToasts]\"]);\n            }\n            return toasts.filter({\n                \"Toaster.Toaster.useMemo[filteredToasts]\": (toast)=>!toast.toasterId\n            }[\"Toaster.Toaster.useMemo[filteredToasts]\"]);\n        }\n    }[\"Toaster.Toaster.useMemo[filteredToasts]\"], [\n        toasts,\n        id\n    ]);\n    const possiblePositions = react__WEBPACK_IMPORTED_MODULE_0__.useMemo({\n        \"Toaster.Toaster.useMemo[possiblePositions]\": ()=>{\n            return Array.from(new Set([\n                position\n            ].concat(filteredToasts.filter({\n                \"Toaster.Toaster.useMemo[possiblePositions]\": (toast)=>toast.position\n            }[\"Toaster.Toaster.useMemo[possiblePositions]\"]).map({\n                \"Toaster.Toaster.useMemo[possiblePositions]\": (toast)=>toast.position\n            }[\"Toaster.Toaster.useMemo[possiblePositions]\"]))));\n        }\n    }[\"Toaster.Toaster.useMemo[possiblePositions]\"], [\n        filteredToasts,\n        position\n    ]);\n    const [heights, setHeights] = react__WEBPACK_IMPORTED_MODULE_0__.useState([]);\n    const [expanded, setExpanded] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n    const [interacting, setInteracting] = react__WEBPACK_IMPORTED_MODULE_0__.useState(false);\n    const [actualTheme, setActualTheme] = react__WEBPACK_IMPORTED_MODULE_0__.useState(theme !== 'system' ? theme : typeof window !== 'undefined' ? window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' : 'light');\n    const listRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n    const hotkeyLabel = hotkey.join('+').replace(/Key/g, '').replace(/Digit/g, '');\n    const lastFocusedElementRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(null);\n    const isFocusWithinRef = react__WEBPACK_IMPORTED_MODULE_0__.useRef(false);\n    const removeToast = react__WEBPACK_IMPORTED_MODULE_0__.useCallback({\n        \"Toaster.Toaster.useCallback[removeToast]\": (toastToRemove)=>{\n            setToasts({\n                \"Toaster.Toaster.useCallback[removeToast]\": (toasts)=>{\n                    var _toasts_find;\n                    if (!((_toasts_find = toasts.find({\n                        \"Toaster.Toaster.useCallback[removeToast]\": (toast)=>toast.id === toastToRemove.id\n                    }[\"Toaster.Toaster.useCallback[removeToast]\"])) == null ? void 0 : _toasts_find.delete)) {\n                        ToastState.dismiss(toastToRemove.id);\n                    }\n                    return toasts.filter({\n                        \"Toaster.Toaster.useCallback[removeToast]\": (param)=>{\n                            let { id } = param;\n                            return id !== toastToRemove.id;\n                        }\n                    }[\"Toaster.Toaster.useCallback[removeToast]\"]);\n                }\n            }[\"Toaster.Toaster.useCallback[removeToast]\"]);\n        }\n    }[\"Toaster.Toaster.useCallback[removeToast]\"], []);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"Toaster.Toaster.useEffect\": ()=>{\n            return ToastState.subscribe({\n                \"Toaster.Toaster.useEffect\": (toast)=>{\n                    if (toast.dismiss) {\n                        // Prevent batching of other state updates\n                        requestAnimationFrame({\n                            \"Toaster.Toaster.useEffect\": ()=>{\n                                setToasts({\n                                    \"Toaster.Toaster.useEffect\": (toasts)=>toasts.map({\n                                            \"Toaster.Toaster.useEffect\": (t)=>t.id === toast.id ? {\n                                                    ...t,\n                                                    delete: true\n                                                } : t\n                                        }[\"Toaster.Toaster.useEffect\"])\n                                }[\"Toaster.Toaster.useEffect\"]);\n                            }\n                        }[\"Toaster.Toaster.useEffect\"]);\n                        return;\n                    }\n                    // Prevent batching, temp solution.\n                    setTimeout({\n                        \"Toaster.Toaster.useEffect\": ()=>{\n                            react_dom__WEBPACK_IMPORTED_MODULE_1__.flushSync({\n                                \"Toaster.Toaster.useEffect\": ()=>{\n                                    setToasts({\n                                        \"Toaster.Toaster.useEffect\": (toasts)=>{\n                                            const indexOfExistingToast = toasts.findIndex({\n                                                \"Toaster.Toaster.useEffect.indexOfExistingToast\": (t)=>t.id === toast.id\n                                            }[\"Toaster.Toaster.useEffect.indexOfExistingToast\"]);\n                                            // Update the toast if it already exists\n                                            if (indexOfExistingToast !== -1) {\n                                                return [\n                                                    ...toasts.slice(0, indexOfExistingToast),\n                                                    {\n                                                        ...toasts[indexOfExistingToast],\n                                                        ...toast\n                                                    },\n                                                    ...toasts.slice(indexOfExistingToast + 1)\n                                                ];\n                                            }\n                                            return [\n                                                toast,\n                                                ...toasts\n                                            ];\n                                        }\n                                    }[\"Toaster.Toaster.useEffect\"]);\n                                }\n                            }[\"Toaster.Toaster.useEffect\"]);\n                        }\n                    }[\"Toaster.Toaster.useEffect\"]);\n                }\n            }[\"Toaster.Toaster.useEffect\"]);\n        }\n    }[\"Toaster.Toaster.useEffect\"], [\n        toasts\n    ]);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"Toaster.Toaster.useEffect\": ()=>{\n            if (theme !== 'system') {\n                setActualTheme(theme);\n                return;\n            }\n            if (theme === 'system') {\n                // check if current preference is dark\n                if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {\n                    // it's currently dark\n                    setActualTheme('dark');\n                } else {\n                    // it's not dark\n                    setActualTheme('light');\n                }\n            }\n            if (typeof window === 'undefined') return;\n            const darkMediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n            try {\n                // Chrome & Firefox\n                darkMediaQuery.addEventListener('change', {\n                    \"Toaster.Toaster.useEffect\": (param)=>{\n                        let { matches } = param;\n                        if (matches) {\n                            setActualTheme('dark');\n                        } else {\n                            setActualTheme('light');\n                        }\n                    }\n                }[\"Toaster.Toaster.useEffect\"]);\n            } catch (error) {\n                // Safari < 14\n                darkMediaQuery.addListener({\n                    \"Toaster.Toaster.useEffect\": (param)=>{\n                        let { matches } = param;\n                        try {\n                            if (matches) {\n                                setActualTheme('dark');\n                            } else {\n                                setActualTheme('light');\n                            }\n                        } catch (e) {\n                            console.error(e);\n                        }\n                    }\n                }[\"Toaster.Toaster.useEffect\"]);\n            }\n        }\n    }[\"Toaster.Toaster.useEffect\"], [\n        theme\n    ]);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"Toaster.Toaster.useEffect\": ()=>{\n            // Ensure expanded is always false when no toasts are present / only one left\n            if (toasts.length <= 1) {\n                setExpanded(false);\n            }\n        }\n    }[\"Toaster.Toaster.useEffect\"], [\n        toasts\n    ]);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"Toaster.Toaster.useEffect\": ()=>{\n            const handleKeyDown = {\n                \"Toaster.Toaster.useEffect.handleKeyDown\": (event)=>{\n                    var _listRef_current;\n                    const isHotkeyPressed = hotkey.every({\n                        \"Toaster.Toaster.useEffect.handleKeyDown.isHotkeyPressed\": (key)=>event[key] || event.code === key\n                    }[\"Toaster.Toaster.useEffect.handleKeyDown.isHotkeyPressed\"]);\n                    if (isHotkeyPressed) {\n                        var _listRef_current1;\n                        setExpanded(true);\n                        (_listRef_current1 = listRef.current) == null ? void 0 : _listRef_current1.focus();\n                    }\n                    if (event.code === 'Escape' && (document.activeElement === listRef.current || ((_listRef_current = listRef.current) == null ? void 0 : _listRef_current.contains(document.activeElement)))) {\n                        setExpanded(false);\n                    }\n                }\n            }[\"Toaster.Toaster.useEffect.handleKeyDown\"];\n            document.addEventListener('keydown', handleKeyDown);\n            return ({\n                \"Toaster.Toaster.useEffect\": ()=>document.removeEventListener('keydown', handleKeyDown)\n            })[\"Toaster.Toaster.useEffect\"];\n        }\n    }[\"Toaster.Toaster.useEffect\"], [\n        hotkey\n    ]);\n    react__WEBPACK_IMPORTED_MODULE_0__.useEffect({\n        \"Toaster.Toaster.useEffect\": ()=>{\n            if (listRef.current) {\n                return ({\n                    \"Toaster.Toaster.useEffect\": ()=>{\n                        if (lastFocusedElementRef.current) {\n                            lastFocusedElementRef.current.focus({\n                                preventScroll: true\n                            });\n                            lastFocusedElementRef.current = null;\n                            isFocusWithinRef.current = false;\n                        }\n                    }\n                })[\"Toaster.Toaster.useEffect\"];\n            }\n        }\n    }[\"Toaster.Toaster.useEffect\"], [\n        listRef.current\n    ]);\n    return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"section\", {\n        ref: ref,\n        \"aria-label\": \"\".concat(containerAriaLabel, \" \").concat(hotkeyLabel),\n        tabIndex: -1,\n        \"aria-live\": \"polite\",\n        \"aria-relevant\": \"additions text\",\n        \"aria-atomic\": \"false\",\n        suppressHydrationWarning: true\n    }, possiblePositions.map((position, index)=>{\n        var _heights_;\n        const [y, x] = position.split('-');\n        if (!filteredToasts.length) return null;\n        return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(\"ol\", {\n            key: position,\n            dir: dir === 'auto' ? getDocumentDirection() : dir,\n            tabIndex: -1,\n            ref: listRef,\n            className: className,\n            \"data-sonner-toaster\": true,\n            \"data-sonner-theme\": actualTheme,\n            \"data-y-position\": y,\n            \"data-x-position\": x,\n            style: {\n                '--front-toast-height': \"\".concat(((_heights_ = heights[0]) == null ? void 0 : _heights_.height) || 0, \"px\"),\n                '--width': \"\".concat(TOAST_WIDTH, \"px\"),\n                '--gap': \"\".concat(gap, \"px\"),\n                ...style,\n                ...assignOffset(offset, mobileOffset)\n            },\n            onBlur: (event)=>{\n                if (isFocusWithinRef.current && !event.currentTarget.contains(event.relatedTarget)) {\n                    isFocusWithinRef.current = false;\n                    if (lastFocusedElementRef.current) {\n                        lastFocusedElementRef.current.focus({\n                            preventScroll: true\n                        });\n                        lastFocusedElementRef.current = null;\n                    }\n                }\n            },\n            onFocus: (event)=>{\n                const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n                if (isNotDismissible) return;\n                if (!isFocusWithinRef.current) {\n                    isFocusWithinRef.current = true;\n                    lastFocusedElementRef.current = event.relatedTarget;\n                }\n            },\n            onMouseEnter: ()=>setExpanded(true),\n            onMouseMove: ()=>setExpanded(true),\n            onMouseLeave: ()=>{\n                // Avoid setting expanded to false when interacting with a toast, e.g. swiping\n                if (!interacting) {\n                    setExpanded(false);\n                }\n            },\n            onDragEnd: ()=>setExpanded(false),\n            onPointerDown: (event)=>{\n                const isNotDismissible = event.target instanceof HTMLElement && event.target.dataset.dismissible === 'false';\n                if (isNotDismissible) return;\n                setInteracting(true);\n            },\n            onPointerUp: ()=>setInteracting(false)\n        }, filteredToasts.filter((toast)=>!toast.position && index === 0 || toast.position === position).map((toast, index)=>{\n            var _toastOptions_duration, _toastOptions_closeButton;\n            return /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_0__.createElement(Toast, {\n                key: toast.id,\n                icons: icons,\n                index: index,\n                toast: toast,\n                defaultRichColors: richColors,\n                duration: (_toastOptions_duration = toastOptions == null ? void 0 : toastOptions.duration) != null ? _toastOptions_duration : duration,\n                className: toastOptions == null ? void 0 : toastOptions.className,\n                descriptionClassName: toastOptions == null ? void 0 : toastOptions.descriptionClassName,\n                invert: invert,\n                visibleToasts: visibleToasts,\n                closeButton: (_toastOptions_closeButton = toastOptions == null ? void 0 : toastOptions.closeButton) != null ? _toastOptions_closeButton : closeButton,\n                interacting: interacting,\n                position: position,\n                style: toastOptions == null ? void 0 : toastOptions.style,\n                unstyled: toastOptions == null ? void 0 : toastOptions.unstyled,\n                classNames: toastOptions == null ? void 0 : toastOptions.classNames,\n                cancelButtonStyle: toastOptions == null ? void 0 : toastOptions.cancelButtonStyle,\n                actionButtonStyle: toastOptions == null ? void 0 : toastOptions.actionButtonStyle,\n                closeButtonAriaLabel: toastOptions == null ? void 0 : toastOptions.closeButtonAriaLabel,\n                removeToast: removeToast,\n                toasts: filteredToasts.filter((t)=>t.position == toast.position),\n                heights: heights.filter((h)=>h.position == toast.position),\n                setHeights: setHeights,\n                expandByDefault: expand,\n                gap: gap,\n                expanded: expanded,\n                swipeDirections: props.swipeDirections\n            });\n        }));\n    }));\n}, \"ShJc+0hlP7kpJg+bSV2b9eE3FXo=\")), \"ShJc+0hlP7kpJg+bSV2b9eE3FXo=\");\n_c3 = Toaster;\n\nvar _c, _c1, _c2, _c3;\n$RefreshReg$(_c, \"Loader\");\n$RefreshReg$(_c1, \"Toast\");\n$RefreshReg$(_c2, \"Toaster$React.forwardRef\");\n$RefreshReg$(_c3, \"Toaster\");\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9zb25uZXIvZGlzdC9pbmRleC5tanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQ0EsU0FBU0EsWUFBWUMsSUFBSTtJQUN2QixJQUFJLENBQUNBLFFBQVEsT0FBT0MsWUFBWSxhQUFhO0lBQzdDLElBQUlDLE9BQU9ELFNBQVNDLElBQUksSUFBSUQsU0FBU0Usb0JBQW9CLENBQUMsT0FBTyxDQUFDLEVBQUU7SUFDcEUsSUFBSUMsUUFBUUgsU0FBU0ksYUFBYSxDQUFDO0lBQ25DRCxNQUFNRSxJQUFJLEdBQUc7SUFDYkosS0FBS0ssV0FBVyxDQUFDSDtJQUNoQkEsTUFBTUksVUFBVSxHQUFJSixNQUFNSSxVQUFVLENBQUNDLE9BQU8sR0FBR1QsT0FBUUksTUFBTUcsV0FBVyxDQUFDTixTQUFTUyxjQUFjLENBQUNWO0FBQ3BHO0FBRTBCO0FBQ087QUFFakMsTUFBTWEsV0FBVyxDQUFDUDtJQUNkLE9BQU9BO1FBQ0gsS0FBSztZQUNELE9BQU9RO1FBQ1gsS0FBSztZQUNELE9BQU9DO1FBQ1gsS0FBSztZQUNELE9BQU9DO1FBQ1gsS0FBSztZQUNELE9BQU9DO1FBQ1g7WUFDSSxPQUFPO0lBQ2Y7QUFDSjtBQUNBLE1BQU1DLE9BQU9DLE1BQU0sSUFBSUMsSUFBSSxDQUFDO0FBQzVCLE1BQU1DLFNBQVM7UUFBQyxFQUFFQyxPQUFPLEVBQUVDLFNBQVMsRUFBRTtJQUNsQyxPQUFPLFdBQVcsR0FBR1osZ0RBQW1CLENBQUMsT0FBTztRQUM1Q1ksV0FBVztZQUNQO1lBQ0FBO1NBQ0gsQ0FBQ0MsTUFBTSxDQUFDQyxTQUFTQyxJQUFJLENBQUM7UUFDdkIsZ0JBQWdCSjtJQUNwQixHQUFHLFdBQVcsR0FBR1gsZ0RBQW1CLENBQUMsT0FBTztRQUN4Q1ksV0FBVztJQUNmLEdBQUdMLEtBQUtTLEdBQUcsQ0FBQyxDQUFDQyxHQUFHQyxJQUFJLFdBQVcsR0FBR2xCLGdEQUFtQixDQUFDLE9BQU87WUFDckRZLFdBQVc7WUFD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LEtBQUs7Z0JBQ3pEOEosVUFBVXNLLGdCQUFnQixPQUFPLEtBQUssSUFBSUEsYUFBYXRLLFFBQVE7Z0JBQy9EaUIsWUFBWXFKLGdCQUFnQixPQUFPLEtBQUssSUFBSUEsYUFBYXJKLFVBQVU7Z0JBQ25FUCxtQkFBbUI0SixnQkFBZ0IsT0FBTyxLQUFLLElBQUlBLGFBQWE1SixpQkFBaUI7Z0JBQ2pGQyxtQkFBbUIySixnQkFBZ0IsT0FBTyxLQUFLLElBQUlBLGFBQWEzSixpQkFBaUI7Z0JBQ2pGUSxzQkFBc0JtSixnQkFBZ0IsT0FBTyxLQUFLLElBQUlBLGFBQWFuSixvQkFBb0I7Z0JBQ3ZGYixhQUFhQTtnQkFDYmxHLFFBQVFzUSxlQUFlcFQsTUFBTSxDQUFDLENBQUN3UyxJQUFJQSxFQUFFaEwsUUFBUSxJQUFJakUsTUFBTWlFLFFBQVE7Z0JBQy9Ec0IsU0FBU0EsUUFBUTlJLE1BQU0sQ0FBQyxDQUFDMk0sSUFBSUEsRUFBRW5GLFFBQVEsSUFBSWpFLE1BQU1pRSxRQUFRO2dCQUN6RG9CLFlBQVlBO2dCQUNaYyxpQkFBaUJvSjtnQkFDakJySixLQUFLQTtnQkFDTFYsVUFBVUE7Z0JBQ1YySCxpQkFBaUI1SSxNQUFNNEksZUFBZTtZQUMxQztRQUNKO0lBQ0o7QUFDSjs7QUFFcUMiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvc29ubmVyL2Rpc3QvaW5kZXgubWpzIl0sInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcbmZ1bmN0aW9uIF9faW5zZXJ0Q1NTKGNvZGUpIHtcbiAgaWYgKCFjb2RlIHx8IHR5cGVvZiBkb2N1bWVudCA9PSAndW5kZWZpbmVkJykgcmV0dXJuXG4gIGxldCBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG4gIGxldCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJylcbiAgc3R5bGUudHlwZSA9ICd0ZXh0L2NzcydcbiAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSlcbiAgO3N0eWxlLnN0eWxlU2hlZXQgPyAoc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gY29kZSkgOiBzdHlsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb2RlKSlcbn1cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nO1xuXG5jb25zdCBnZXRBc3NldCA9ICh0eXBlKT0+e1xuICAgIHN3aXRjaCh0eXBlKXtcbiAgICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgICAgICByZXR1cm4gU3VjY2Vzc0ljb247XG4gICAgICAgIGNhc2UgJ2luZm8nOlxuICAgICAgICAgICAgcmV0dXJuIEluZm9JY29uO1xuICAgICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgICAgIHJldHVybiBXYXJuaW5nSWNvbjtcbiAgICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICAgICAgcmV0dXJuIEVycm9ySWNvbjtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5jb25zdCBiYXJzID0gQXJyYXkoMTIpLmZpbGwoMCk7XG5jb25zdCBMb2FkZXIgPSAoeyB2aXNpYmxlLCBjbGFzc05hbWUgfSk9PntcbiAgICByZXR1cm4gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBbXG4gICAgICAgICAgICAnc29ubmVyLWxvYWRpbmctd3JhcHBlcicsXG4gICAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpLFxuICAgICAgICBcImRhdGEtdmlzaWJsZVwiOiB2aXNpYmxlXG4gICAgfSwgLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBcInNvbm5lci1zcGlubmVyXCJcbiAgICB9LCBiYXJzLm1hcCgoXywgaSk9Pi8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwic29ubmVyLWxvYWRpbmctYmFyXCIsXG4gICAgICAgICAgICBrZXk6IGBzcGlubmVyLWJhci0ke2l9YFxuICAgICAgICB9KSkpKTtcbn07XG5jb25zdCBTdWNjZXNzSWNvbiA9IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyMCAyMFwiLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgaGVpZ2h0OiBcIjIwXCIsXG4gICAgd2lkdGg6IFwiMjBcIlxufSwgLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTEwIDE4YTggOCAwIDEwMC0xNiA4IDggMCAwMDAgMTZ6bTMuODU3LTkuODA5YS43NS43NSAwIDAwLTEuMjE0LS44ODJsLTMuNDgzIDQuNzktMS44OC0xLjg4YS43NS43NSAwIDEwLTEuMDYgMS4wNjFsMi41IDIuNWEuNzUuNzUgMCAwMDEuMTM3LS4wODlsNC01LjV6XCIsXG4gICAgY2xpcFJ1bGU6IFwiZXZlbm9kZFwiXG59KSk7XG5jb25zdCBXYXJuaW5nSWNvbiA9IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyNCAyNFwiLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgaGVpZ2h0OiBcIjIwXCIsXG4gICAgd2lkdGg6IFwiMjBcIlxufSwgLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTkuNDAxIDMuMDAzYzEuMTU1LTIgNC4wNDMtMiA1LjE5NyAwbDcuMzU1IDEyLjc0OGMxLjE1NCAyLS4yOSA0LjUtMi41OTkgNC41SDQuNjQ1Yy0yLjMwOSAwLTMuNzUyLTIuNS0yLjU5OC00LjVMOS40IDMuMDAzek0xMiA4LjI1YS43NS43NSAwIDAxLjc1Ljc1djMuNzVhLjc1Ljc1IDAgMDEtMS41IDBWOWEuNzUuNzUgMCAwMS43NS0uNzV6bTAgOC4yNWEuNzUuNzUgMCAxMDAtMS41Ljc1Ljc1IDAgMDAwIDEuNXpcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCJcbn0pKTtcbmNvbnN0IEluZm9JY29uID0gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICB4bWxuczogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDIwIDIwXCIsXG4gICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIixcbiAgICBoZWlnaHQ6IFwiMjBcIixcbiAgICB3aWR0aDogXCIyMFwiXG59LCAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICBmaWxsUnVsZTogXCJldmVub2RkXCIsXG4gICAgZDogXCJNMTggMTBhOCA4IDAgMTEtMTYgMCA4IDggMCAwMTE2IDB6bS03LTRhMSAxIDAgMTEtMiAwIDEgMSAwIDAxMiAwek05IDlhLjc1Ljc1IDAgMDAwIDEuNWguMjUzYS4yNS4yNSAwIDAxLjI0NC4zMDRsLS40NTkgMi4wNjZBMS43NSAxLjc1IDAgMDAxMC43NDcgMTVIMTFhLjc1Ljc1IDAgMDAwLTEuNWgtLjI1M2EuMjUuMjUgMCAwMS0uMjQ0LS4zMDRsLjQ1OS0yLjA2NkExLjc1IDEuNzUgMCAwMDkuMjUzIDlIOXpcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCJcbn0pKTtcbmNvbnN0IEVycm9ySWNvbiA9IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB2aWV3Qm94OiBcIjAgMCAyMCAyMFwiLFxuICAgIGZpbGw6IFwiY3VycmVudENvbG9yXCIsXG4gICAgaGVpZ2h0OiBcIjIwXCIsXG4gICAgd2lkdGg6IFwiMjBcIlxufSwgLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgZmlsbFJ1bGU6IFwiZXZlbm9kZFwiLFxuICAgIGQ6IFwiTTE4IDEwYTggOCAwIDExLTE2IDAgOCA4IDAgMDExNiAwem0tOC01YS43NS43NSAwIDAxLjc1Ljc1djQuNWEuNzUuNzUgMCAwMS0xLjUgMHYtNC41QS43NS43NSAwIDAxMTAgNXptMCAxMGExIDEgMCAxMDAtMiAxIDEgMCAwMDAgMnpcIixcbiAgICBjbGlwUnVsZTogXCJldmVub2RkXCJcbn0pKTtcbmNvbnN0IENsb3NlSWNvbiA9IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgeG1sbnM6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcbiAgICB3aWR0aDogXCIxMlwiLFxuICAgIGhlaWdodDogXCIxMlwiLFxuICAgIHZpZXdCb3g6IFwiMCAwIDI0IDI0XCIsXG4gICAgZmlsbDogXCJub25lXCIsXG4gICAgc3Ryb2tlOiBcImN1cnJlbnRDb2xvclwiLFxuICAgIHN0cm9rZVdpZHRoOiBcIjEuNVwiLFxuICAgIHN0cm9rZUxpbmVjYXA6IFwicm91bmRcIixcbiAgICBzdHJva2VMaW5lam9pbjogXCJyb3VuZFwiXG59LCAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaW5lXCIsIHtcbiAgICB4MTogXCIxOFwiLFxuICAgIHkxOiBcIjZcIixcbiAgICB4MjogXCI2XCIsXG4gICAgeTI6IFwiMThcIlxufSksIC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImxpbmVcIiwge1xuICAgIHgxOiBcIjZcIixcbiAgICB5MTogXCI2XCIsXG4gICAgeDI6IFwiMThcIixcbiAgICB5MjogXCIxOFwiXG59KSk7XG5cbmNvbnN0IHVzZUlzRG9jdW1lbnRIaWRkZW4gPSAoKT0+e1xuICAgIGNvbnN0IFtpc0RvY3VtZW50SGlkZGVuLCBzZXRJc0RvY3VtZW50SGlkZGVuXSA9IFJlYWN0LnVzZVN0YXRlKGRvY3VtZW50LmhpZGRlbik7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGNvbnN0IGNhbGxiYWNrID0gKCk9PntcbiAgICAgICAgICAgIHNldElzRG9jdW1lbnRIaWRkZW4oZG9jdW1lbnQuaGlkZGVuKTtcbiAgICAgICAgfTtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuICgpPT53aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIGNhbGxiYWNrKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIGlzRG9jdW1lbnRIaWRkZW47XG59O1xuXG5sZXQgdG9hc3RzQ291bnRlciA9IDE7XG5jbGFzcyBPYnNlcnZlciB7XG4gICAgY29uc3RydWN0b3IoKXtcbiAgICAgICAgLy8gV2UgdXNlIGFycm93IGZ1bmN0aW9ucyB0byBtYWludGFpbiB0aGUgY29ycmVjdCBgdGhpc2AgcmVmZXJlbmNlXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlID0gKHN1YnNjcmliZXIpPT57XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnB1c2goc3Vic2NyaWJlcik7XG4gICAgICAgICAgICByZXR1cm4gKCk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc3Vic2NyaWJlcnMuaW5kZXhPZihzdWJzY3JpYmVyKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnB1Ymxpc2ggPSAoZGF0YSk9PntcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcik9PnN1YnNjcmliZXIoZGF0YSkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFkZFRvYXN0ID0gKGRhdGEpPT57XG4gICAgICAgICAgICB0aGlzLnB1Ymxpc2goZGF0YSk7XG4gICAgICAgICAgICB0aGlzLnRvYXN0cyA9IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLnRvYXN0cyxcbiAgICAgICAgICAgICAgICBkYXRhXG4gICAgICAgICAgICBdO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNyZWF0ZSA9IChkYXRhKT0+e1xuICAgICAgICAgICAgdmFyIF9kYXRhX2lkO1xuICAgICAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5yZXN0IH0gPSBkYXRhO1xuICAgICAgICAgICAgY29uc3QgaWQgPSB0eXBlb2YgKGRhdGEgPT0gbnVsbCA/IHZvaWQgMCA6IGRhdGEuaWQpID09PSAnbnVtYmVyJyB8fCAoKF9kYXRhX2lkID0gZGF0YS5pZCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9kYXRhX2lkLmxlbmd0aCkgPiAwID8gZGF0YS5pZCA6IHRvYXN0c0NvdW50ZXIrKztcbiAgICAgICAgICAgIGNvbnN0IGFscmVhZHlFeGlzdHMgPSB0aGlzLnRvYXN0cy5maW5kKCh0b2FzdCk9PntcbiAgICAgICAgICAgICAgICByZXR1cm4gdG9hc3QuaWQgPT09IGlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBkaXNtaXNzaWJsZSA9IGRhdGEuZGlzbWlzc2libGUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiBkYXRhLmRpc21pc3NpYmxlO1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzbWlzc2VkVG9hc3RzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc21pc3NlZFRvYXN0cy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFscmVhZHlFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0cyA9IHRoaXMudG9hc3RzLm1hcCgodG9hc3QpPT57XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b2FzdC5pZCA9PT0gaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVibGlzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udG9hc3QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogbWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzc2libGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IG1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvYXN0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRvYXN0KHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgICAgICAgICAgICAgIGRpc21pc3NpYmxlLFxuICAgICAgICAgICAgICAgICAgICBpZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmRpc21pc3MgPSAoaWQpPT57XG4gICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc21pc3NlZFRvYXN0cy5hZGQoaWQpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy5zdWJzY3JpYmVycy5mb3JFYWNoKChzdWJzY3JpYmVyKT0+c3Vic2NyaWJlcih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzbWlzczogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2FzdHMuZm9yRWFjaCgodG9hc3QpPT57XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlcnMuZm9yRWFjaCgoc3Vic2NyaWJlcik9PnN1YnNjcmliZXIoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0b2FzdC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubWVzc2FnZSA9IChtZXNzYWdlLCBkYXRhKT0+e1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmVycm9yID0gKG1lc3NhZ2UsIGRhdGEpPT57XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdWNjZXNzID0gKG1lc3NhZ2UsIGRhdGEpPT57XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmluZm8gPSAobWVzc2FnZSwgZGF0YSk9PntcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMud2FybmluZyA9IChtZXNzYWdlLCBkYXRhKT0+e1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gKG1lc3NhZ2UsIGRhdGEpPT57XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGUoe1xuICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2xvYWRpbmcnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnByb21pc2UgPSAocHJvbWlzZSwgZGF0YSk9PntcbiAgICAgICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gc2hvd1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBpZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChkYXRhLmxvYWRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlkID0gdGhpcy5jcmVhdGUoe1xuICAgICAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbG9hZGluZycsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRhdGEubG9hZGluZyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHR5cGVvZiBkYXRhLmRlc2NyaXB0aW9uICE9PSAnZnVuY3Rpb24nID8gZGF0YS5kZXNjcmlwdGlvbiA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcCA9IFByb21pc2UucmVzb2x2ZShwcm9taXNlIGluc3RhbmNlb2YgRnVuY3Rpb24gPyBwcm9taXNlKCkgOiBwcm9taXNlKTtcbiAgICAgICAgICAgIGxldCBzaG91bGREaXNtaXNzID0gaWQgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFByb21pc2UgPSBwLnRoZW4oYXN5bmMgKHJlc3BvbnNlKT0+e1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAgICAgICAgICAgJ3Jlc29sdmUnLFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgY29uc3QgaXNSZWFjdEVsZW1lbnRSZXNwb25zZSA9IFJlYWN0LmlzVmFsaWRFbGVtZW50KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNSZWFjdEVsZW1lbnRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICBzaG91bGREaXNtaXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RlZmF1bHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0h0dHBSZXNwb25zZShyZXNwb25zZSkgJiYgIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZERpc21pc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZURhdGEgPSB0eXBlb2YgZGF0YS5lcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IGRhdGEuZXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCkgOiBkYXRhLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHR5cGVvZiBkYXRhLmRlc2NyaXB0aW9uID09PSAnZnVuY3Rpb24nID8gYXdhaXQgZGF0YS5kZXNjcmlwdGlvbihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKSA6IGRhdGEuZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXh0ZW5kZWRSZXN1bHQgPSB0eXBlb2YgcHJvbWlzZURhdGEgPT09ICdvYmplY3QnICYmICFSZWFjdC5pc1ZhbGlkRWxlbWVudChwcm9taXNlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvYXN0U2V0dGluZ3MgPSBpc0V4dGVuZGVkUmVzdWx0ID8gcHJvbWlzZURhdGEgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBwcm9taXNlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0U2V0dGluZ3NcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZERpc21pc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZURhdGEgPSB0eXBlb2YgZGF0YS5lcnJvciA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IGRhdGEuZXJyb3IocmVzcG9uc2UpIDogZGF0YS5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0eXBlb2YgZGF0YS5kZXNjcmlwdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IGRhdGEuZGVzY3JpcHRpb24ocmVzcG9uc2UpIDogZGF0YS5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFeHRlbmRlZFJlc3VsdCA9IHR5cGVvZiBwcm9taXNlRGF0YSA9PT0gJ29iamVjdCcgJiYgIVJlYWN0LmlzVmFsaWRFbGVtZW50KHByb21pc2VEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9hc3RTZXR0aW5ncyA9IGlzRXh0ZW5kZWRSZXN1bHQgPyBwcm9taXNlRGF0YSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHByb21pc2VEYXRhXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4udG9hc3RTZXR0aW5nc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGEuc3VjY2VzcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZERpc21pc3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZURhdGEgPSB0eXBlb2YgZGF0YS5zdWNjZXNzID09PSAnZnVuY3Rpb24nID8gYXdhaXQgZGF0YS5zdWNjZXNzKHJlc3BvbnNlKSA6IGRhdGEuc3VjY2VzcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSB0eXBlb2YgZGF0YS5kZXNjcmlwdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IGF3YWl0IGRhdGEuZGVzY3JpcHRpb24ocmVzcG9uc2UpIDogZGF0YS5kZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFeHRlbmRlZFJlc3VsdCA9IHR5cGVvZiBwcm9taXNlRGF0YSA9PT0gJ29iamVjdCcgJiYgIVJlYWN0LmlzVmFsaWRFbGVtZW50KHByb21pc2VEYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9hc3RTZXR0aW5ncyA9IGlzRXh0ZW5kZWRSZXN1bHQgPyBwcm9taXNlRGF0YSA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHByb21pc2VEYXRhXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdFNldHRpbmdzXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLmNhdGNoKGFzeW5jIChlcnJvcik9PntcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBbXG4gICAgICAgICAgICAgICAgICAgICdyZWplY3QnLFxuICAgICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzaG91bGREaXNtaXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb21pc2VEYXRhID0gdHlwZW9mIGRhdGEuZXJyb3IgPT09ICdmdW5jdGlvbicgPyBhd2FpdCBkYXRhLmVycm9yKGVycm9yKSA6IGRhdGEuZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdHlwZW9mIGRhdGEuZGVzY3JpcHRpb24gPT09ICdmdW5jdGlvbicgPyBhd2FpdCBkYXRhLmRlc2NyaXB0aW9uKGVycm9yKSA6IGRhdGEuZGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRXh0ZW5kZWRSZXN1bHQgPSB0eXBlb2YgcHJvbWlzZURhdGEgPT09ICdvYmplY3QnICYmICFSZWFjdC5pc1ZhbGlkRWxlbWVudChwcm9taXNlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvYXN0U2V0dGluZ3MgPSBpc0V4dGVuZGVkUmVzdWx0ID8gcHJvbWlzZURhdGEgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBwcm9taXNlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0U2V0dGluZ3NcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkuZmluYWxseSgoKT0+e1xuICAgICAgICAgICAgICAgIGlmIChzaG91bGREaXNtaXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRvYXN0IGlzIHN0aWxsIGluIGxvYWQgc3RhdGUgKGFuZCB3aWxsIGJlIGluZGVmaW5pdGVseSDigJQgZGlzbWlzcyBpdClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNtaXNzKGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEuZmluYWxseSA9PSBudWxsID8gdm9pZCAwIDogZGF0YS5maW5hbGx5LmNhbGwoZGF0YSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IHVud3JhcCA9ICgpPT5uZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KT0+b3JpZ2luYWxQcm9taXNlLnRoZW4oKCk9PnJlc3VsdFswXSA9PT0gJ3JlamVjdCcgPyByZWplY3QocmVzdWx0WzFdKSA6IHJlc29sdmUocmVzdWx0WzFdKSkuY2F0Y2gocmVqZWN0KSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlkICE9PSAnc3RyaW5nJyAmJiB0eXBlb2YgaWQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gY2Fubm90IE9iamVjdC5hc3NpZ24gb24gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdW53cmFwXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaWQsIHtcbiAgICAgICAgICAgICAgICAgICAgdW53cmFwXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY3VzdG9tID0gKGpzeCwgZGF0YSk9PntcbiAgICAgICAgICAgIGNvbnN0IGlkID0gKGRhdGEgPT0gbnVsbCA/IHZvaWQgMCA6IGRhdGEuaWQpIHx8IHRvYXN0c0NvdW50ZXIrKztcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICBqc3g6IGpzeChpZCksXG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICAgICAgLi4uZGF0YVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZ2V0QWN0aXZlVG9hc3RzID0gKCk9PntcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRvYXN0cy5maWx0ZXIoKHRvYXN0KT0+IXRoaXMuZGlzbWlzc2VkVG9hc3RzLmhhcyh0b2FzdC5pZCkpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN1YnNjcmliZXJzID0gW107XG4gICAgICAgIHRoaXMudG9hc3RzID0gW107XG4gICAgICAgIHRoaXMuZGlzbWlzc2VkVG9hc3RzID0gbmV3IFNldCgpO1xuICAgIH1cbn1cbmNvbnN0IFRvYXN0U3RhdGUgPSBuZXcgT2JzZXJ2ZXIoKTtcbi8vIGJpbmQgdGhpcyB0byB0aGUgdG9hc3QgZnVuY3Rpb25cbmNvbnN0IHRvYXN0RnVuY3Rpb24gPSAobWVzc2FnZSwgZGF0YSk9PntcbiAgICBjb25zdCBpZCA9IChkYXRhID09IG51bGwgPyB2b2lkIDAgOiBkYXRhLmlkKSB8fCB0b2FzdHNDb3VudGVyKys7XG4gICAgVG9hc3RTdGF0ZS5hZGRUb2FzdCh7XG4gICAgICAgIHRpdGxlOiBtZXNzYWdlLFxuICAgICAgICAuLi5kYXRhLFxuICAgICAgICBpZFxuICAgIH0pO1xuICAgIHJldHVybiBpZDtcbn07XG5jb25zdCBpc0h0dHBSZXNwb25zZSA9IChkYXRhKT0+e1xuICAgIHJldHVybiBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJiAnb2snIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEub2sgPT09ICdib29sZWFuJyAmJiAnc3RhdHVzJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLnN0YXR1cyA9PT0gJ251bWJlcic7XG59O1xuY29uc3QgYmFzaWNUb2FzdCA9IHRvYXN0RnVuY3Rpb247XG5jb25zdCBnZXRIaXN0b3J5ID0gKCk9PlRvYXN0U3RhdGUudG9hc3RzO1xuY29uc3QgZ2V0VG9hc3RzID0gKCk9PlRvYXN0U3RhdGUuZ2V0QWN0aXZlVG9hc3RzKCk7XG4vLyBXZSB1c2UgYE9iamVjdC5hc3NpZ25gIHRvIG1haW50YWluIHRoZSBjb3JyZWN0IHR5cGVzIGFzIHdlIHdvdWxkIGxvc2UgdGhlbSBvdGhlcndpc2VcbmNvbnN0IHRvYXN0ID0gT2JqZWN0LmFzc2lnbihiYXNpY1RvYXN0LCB7XG4gICAgc3VjY2VzczogVG9hc3RTdGF0ZS5zdWNjZXNzLFxuICAgIGluZm86IFRvYXN0U3RhdGUuaW5mbyxcbiAgICB3YXJuaW5nOiBUb2FzdFN0YXRlLndhcm5pbmcsXG4gICAgZXJyb3I6IFRvYXN0U3RhdGUuZXJyb3IsXG4gICAgY3VzdG9tOiBUb2FzdFN0YXRlLmN1c3RvbSxcbiAgICBtZXNzYWdlOiBUb2FzdFN0YXRlLm1lc3NhZ2UsXG4gICAgcHJvbWlzZTogVG9hc3RTdGF0ZS5wcm9taXNlLFxuICAgIGRpc21pc3M6IFRvYXN0U3RhdGUuZGlzbWlzcyxcbiAgICBsb2FkaW5nOiBUb2FzdFN0YXRlLmxvYWRpbmdcbn0sIHtcbiAgICBnZXRIaXN0b3J5LFxuICAgIGdldFRvYXN0c1xufSk7XG5cbl9faW5zZXJ0Q1NTKFwiW2RhdGEtc29ubmVyLXRvYXN0ZXJdW2Rpcj1sdHJdLGh0bWxbZGlyPWx0cl17LS10b2FzdC1pY29uLW1hcmdpbi1zdGFydDotM3B4Oy0tdG9hc3QtaWNvbi1tYXJnaW4tZW5kOjRweDstLXRvYXN0LXN2Zy1tYXJnaW4tc3RhcnQ6LTFweDstLXRvYXN0LXN2Zy1tYXJnaW4tZW5kOjBweDstLXRvYXN0LWJ1dHRvbi1tYXJnaW4tc3RhcnQ6YXV0bzstLXRvYXN0LWJ1dHRvbi1tYXJnaW4tZW5kOjA7LS10b2FzdC1jbG9zZS1idXR0b24tc3RhcnQ6MDstLXRvYXN0LWNsb3NlLWJ1dHRvbi1lbmQ6dW5zZXQ7LS10b2FzdC1jbG9zZS1idXR0b24tdHJhbnNmb3JtOnRyYW5zbGF0ZSgtMzUlLCAtMzUlKX1bZGF0YS1zb25uZXItdG9hc3Rlcl1bZGlyPXJ0bF0saHRtbFtkaXI9cnRsXXstLXRvYXN0LWljb24tbWFyZ2luLXN0YXJ0OjRweDstLXRvYXN0LWljb24tbWFyZ2luLWVuZDotM3B4Oy0tdG9hc3Qtc3ZnLW1hcmdpbi1zdGFydDowcHg7LS10b2FzdC1zdmctbWFyZ2luLWVuZDotMXB4Oy0tdG9hc3QtYnV0dG9uLW1hcmdpbi1zdGFydDowOy0tdG9hc3QtYnV0dG9uLW1hcmdpbi1lbmQ6YXV0bzstLXRvYXN0LWNsb3NlLWJ1dHRvbi1zdGFydDp1bnNldDstLXRvYXN0LWNsb3NlLWJ1dHRvbi1lbmQ6MDstLXRvYXN0LWNsb3NlLWJ1dHRvbi10cmFuc2Zvcm06dHJhbnNsYXRlKDM1JSwgLTM1JSl9W2RhdGEtc29ubmVyLXRvYXN0ZXJde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOnZhcigtLXdpZHRoKTtmb250LWZhbWlseTp1aS1zYW5zLXNlcmlmLHN5c3RlbS11aSwtYXBwbGUtc3lzdGVtLEJsaW5rTWFjU3lzdGVtRm9udCxTZWdvZSBVSSxSb2JvdG8sSGVsdmV0aWNhIE5ldWUsQXJpYWwsTm90byBTYW5zLHNhbnMtc2VyaWYsQXBwbGUgQ29sb3IgRW1vamksU2Vnb2UgVUkgRW1vamksU2Vnb2UgVUkgU3ltYm9sLE5vdG8gQ29sb3IgRW1vamk7LS1ncmF5MTpoc2woMCwgMCUsIDk5JSk7LS1ncmF5Mjpoc2woMCwgMCUsIDk3LjMlKTstLWdyYXkzOmhzbCgwLCAwJSwgOTUuMSUpOy0tZ3JheTQ6aHNsKDAsIDAlLCA5MyUpOy0tZ3JheTU6aHNsKDAsIDAlLCA5MC45JSk7LS1ncmF5Njpoc2woMCwgMCUsIDg4LjclKTstLWdyYXk3OmhzbCgwLCAwJSwgODUuOCUpOy0tZ3JheTg6aHNsKDAsIDAlLCA3OCUpOy0tZ3JheTk6aHNsKDAsIDAlLCA1Ni4xJSk7LS1ncmF5MTA6aHNsKDAsIDAlLCA1Mi4zJSk7LS1ncmF5MTE6aHNsKDAsIDAlLCA0My41JSk7LS1ncmF5MTI6aHNsKDAsIDAlLCA5JSk7LS1ib3JkZXItcmFkaXVzOjhweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzowO21hcmdpbjowO2xpc3Qtc3R5bGU6bm9uZTtvdXRsaW5lOjA7ei1pbmRleDo5OTk5OTk5OTk7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjRzIGVhc2V9QG1lZGlhIChob3Zlcjpub25lKSBhbmQgKHBvaW50ZXI6Y29hcnNlKXtbZGF0YS1zb25uZXItdG9hc3Rlcl1bZGF0YS1saWZ0ZWQ9dHJ1ZV17dHJhbnNmb3JtOm5vbmV9fVtkYXRhLXNvbm5lci10b2FzdGVyXVtkYXRhLXgtcG9zaXRpb249cmlnaHRde3JpZ2h0OnZhcigtLW9mZnNldC1yaWdodCl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteC1wb3NpdGlvbj1sZWZ0XXtsZWZ0OnZhcigtLW9mZnNldC1sZWZ0KX1bZGF0YS1zb25uZXItdG9hc3Rlcl1bZGF0YS14LXBvc2l0aW9uPWNlbnRlcl17bGVmdDo1MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZVgoLTUwJSl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteS1wb3NpdGlvbj10b3Bde3RvcDp2YXIoLS1vZmZzZXQtdG9wKX1bZGF0YS1zb25uZXItdG9hc3Rlcl1bZGF0YS15LXBvc2l0aW9uPWJvdHRvbV17Ym90dG9tOnZhcigtLW9mZnNldC1ib3R0b20pfVtkYXRhLXNvbm5lci10b2FzdF17LS15OnRyYW5zbGF0ZVkoMTAwJSk7LS1saWZ0LWFtb3VudDpjYWxjKHZhcigtLWxpZnQpICogdmFyKC0tZ2FwKSk7ei1pbmRleDp2YXIoLS16LWluZGV4KTtwb3NpdGlvbjphYnNvbHV0ZTtvcGFjaXR5OjA7dHJhbnNmb3JtOnZhcigtLXkpO3RvdWNoLWFjdGlvbjpub25lO3RyYW5zaXRpb246dHJhbnNmb3JtIC40cyxvcGFjaXR5IC40cyxoZWlnaHQgLjRzLGJveC1zaGFkb3cgLjJzO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdXRsaW5lOjA7b3ZlcmZsb3ctd3JhcDphbnl3aGVyZX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVde3BhZGRpbmc6MTZweDtiYWNrZ3JvdW5kOnZhcigtLW5vcm1hbC1iZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ub3JtYWwtYm9yZGVyKTtjb2xvcjp2YXIoLS1ub3JtYWwtdGV4dCk7Ym9yZGVyLXJhZGl1czp2YXIoLS1ib3JkZXItcmFkaXVzKTtib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwuMSk7d2lkdGg6dmFyKC0td2lkdGgpO2ZvbnQtc2l6ZToxM3B4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7Z2FwOjZweH1bZGF0YS1zb25uZXItdG9hc3RdOmZvY3VzLXZpc2libGV7Ym94LXNoYWRvdzowIDRweCAxMnB4IHJnYmEoMCwwLDAsLjEpLDAgMCAwIDJweCByZ2JhKDAsMCwwLC4yKX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEteS1wb3NpdGlvbj10b3Bde3RvcDowOy0teTp0cmFuc2xhdGVZKC0xMDAlKTstLWxpZnQ6MTstLWxpZnQtYW1vdW50OmNhbGMoMSAqIHZhcigtLWdhcCkpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS15LXBvc2l0aW9uPWJvdHRvbV17Ym90dG9tOjA7LS15OnRyYW5zbGF0ZVkoMTAwJSk7LS1saWZ0Oi0xOy0tbGlmdC1hbW91bnQ6Y2FsYyh2YXIoLS1saWZ0KSAqIHZhcigtLWdhcCkpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtZGVzY3JpcHRpb25de2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjQ7Y29sb3I6IzNmM2YzZn1bZGF0YS1yaWNoLWNvbG9ycz10cnVlXVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtZGVzY3JpcHRpb25de2NvbG9yOmluaGVyaXR9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEtc29ubmVyLXRoZW1lPWRhcmtdIFtkYXRhLWRlc2NyaXB0aW9uXXtjb2xvcjojZThlOGU4fVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtdGl0bGVde2ZvbnQtd2VpZ2h0OjUwMDtsaW5lLWhlaWdodDoxLjU7Y29sb3I6aW5oZXJpdH1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVdIFtkYXRhLWljb25de2Rpc3BsYXk6ZmxleDtoZWlnaHQ6MTZweDt3aWR0aDoxNnB4O3Bvc2l0aW9uOnJlbGF0aXZlO2p1c3RpZnktY29udGVudDpmbGV4LXN0YXJ0O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXNocmluazowO21hcmdpbi1sZWZ0OnZhcigtLXRvYXN0LWljb24tbWFyZ2luLXN0YXJ0KTttYXJnaW4tcmlnaHQ6dmFyKC0tdG9hc3QtaWNvbi1tYXJnaW4tZW5kKX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtcHJvbWlzZT10cnVlXSBbZGF0YS1pY29uXT5zdmd7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOCk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7YW5pbWF0aW9uOnNvbm5lci1mYWRlLWluIC4zcyBlYXNlIGZvcndhcmRzfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtaWNvbl0+KntmbGV4LXNocmluazowfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtaWNvbl0gc3Zne21hcmdpbi1sZWZ0OnZhcigtLXRvYXN0LXN2Zy1tYXJnaW4tc3RhcnQpO21hcmdpbi1yaWdodDp2YXIoLS10b2FzdC1zdmctbWFyZ2luLWVuZCl9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN0eWxlZD10cnVlXSBbZGF0YS1jb250ZW50XXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2dhcDoycHh9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN0eWxlZD10cnVlXSBbZGF0YS1idXR0b25de2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmctbGVmdDo4cHg7cGFkZGluZy1yaWdodDo4cHg7aGVpZ2h0OjI0cHg7Zm9udC1zaXplOjEycHg7Y29sb3I6dmFyKC0tbm9ybWFsLWJnKTtiYWNrZ3JvdW5kOnZhcigtLW5vcm1hbC10ZXh0KTttYXJnaW4tbGVmdDp2YXIoLS10b2FzdC1idXR0b24tbWFyZ2luLXN0YXJ0KTttYXJnaW4tcmlnaHQ6dmFyKC0tdG9hc3QtYnV0dG9uLW1hcmdpbi1lbmQpO2JvcmRlcjpub25lO2ZvbnQtd2VpZ2h0OjUwMDtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOjA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXNocmluazowO3RyYW5zaXRpb246b3BhY2l0eSAuNHMsYm94LXNoYWRvdyAuMnN9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN0eWxlZD10cnVlXSBbZGF0YS1idXR0b25dOmZvY3VzLXZpc2libGV7Ym94LXNoYWRvdzowIDAgMCAycHggcmdiYSgwLDAsMCwuNCl9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN0eWxlZD10cnVlXSBbZGF0YS1idXR0b25dOmZpcnN0LW9mLXR5cGV7bWFyZ2luLWxlZnQ6dmFyKC0tdG9hc3QtYnV0dG9uLW1hcmdpbi1zdGFydCk7bWFyZ2luLXJpZ2h0OnZhcigtLXRvYXN0LWJ1dHRvbi1tYXJnaW4tZW5kKX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVdIFtkYXRhLWNhbmNlbF17Y29sb3I6dmFyKC0tbm9ybWFsLXRleHQpO2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDgpfVtkYXRhLXNvbm5lci10b2FzdGVyXVtkYXRhLXNvbm5lci10aGVtZT1kYXJrXSBbZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVdIFtkYXRhLWNhbmNlbF17YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVdIFtkYXRhLWNsb3NlLWJ1dHRvbl17cG9zaXRpb246YWJzb2x1dGU7bGVmdDp2YXIoLS10b2FzdC1jbG9zZS1idXR0b24tc3RhcnQpO3JpZ2h0OnZhcigtLXRvYXN0LWNsb3NlLWJ1dHRvbi1lbmQpO3RvcDowO2hlaWdodDoyMHB4O3dpZHRoOjIwcHg7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3BhZGRpbmc6MDtjb2xvcjp2YXIoLS1ncmF5MTIpO2JhY2tncm91bmQ6dmFyKC0tbm9ybWFsLWJnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWdyYXk0KTt0cmFuc2Zvcm06dmFyKC0tdG9hc3QtY2xvc2UtYnV0dG9uLXRyYW5zZm9ybSk7Ym9yZGVyLXJhZGl1czo1MCU7Y3Vyc29yOnBvaW50ZXI7ei1pbmRleDoxO3RyYW5zaXRpb246b3BhY2l0eSAuMXMsYmFja2dyb3VuZCAuMnMsYm9yZGVyLWNvbG9yIC4yc31bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3R5bGVkPXRydWVdIFtkYXRhLWNsb3NlLWJ1dHRvbl06Zm9jdXMtdmlzaWJsZXtib3gtc2hhZG93OjAgNHB4IDEycHggcmdiYSgwLDAsMCwuMSksMCAwIDAgMnB4IHJnYmEoMCwwLDAsLjIpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV0gW2RhdGEtZGlzYWJsZWQ9dHJ1ZV17Y3Vyc29yOm5vdC1hbGxvd2VkfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zdHlsZWQ9dHJ1ZV06aG92ZXIgW2RhdGEtY2xvc2UtYnV0dG9uXTpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLWdyYXkyKTtib3JkZXItY29sb3I6dmFyKC0tZ3JheTUpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zd2lwaW5nPXRydWVdOjpiZWZvcmV7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0Oi0xMDAlO3JpZ2h0Oi0xMDAlO2hlaWdodDoxMDAlO3otaW5kZXg6LTF9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXktcG9zaXRpb249dG9wXVtkYXRhLXN3aXBpbmc9dHJ1ZV06OmJlZm9yZXtib3R0b206NTAlO3RyYW5zZm9ybTpzY2FsZVkoMykgdHJhbnNsYXRlWSg1MCUpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS15LXBvc2l0aW9uPWJvdHRvbV1bZGF0YS1zd2lwaW5nPXRydWVdOjpiZWZvcmV7dG9wOjUwJTt0cmFuc2Zvcm06c2NhbGVZKDMpIHRyYW5zbGF0ZVkoLTUwJSl9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN3aXBpbmc9ZmFsc2VdW2RhdGEtcmVtb3ZlZD10cnVlXTo6YmVmb3Jle2NvbnRlbnQ6Jyc7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDt0cmFuc2Zvcm06c2NhbGVZKDIpfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1leHBhbmRlZD10cnVlXTo6YWZ0ZXJ7Y29udGVudDonJztwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7aGVpZ2h0OmNhbGModmFyKC0tZ2FwKSArIDFweCk7Ym90dG9tOjEwMCU7d2lkdGg6MTAwJX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtbW91bnRlZD10cnVlXXstLXk6dHJhbnNsYXRlWSgwKTtvcGFjaXR5OjF9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLWV4cGFuZGVkPWZhbHNlXVtkYXRhLWZyb250PWZhbHNlXXstLXNjYWxlOnZhcigtLXRvYXN0cy1iZWZvcmUpICogMC4wNSArIDE7LS15OnRyYW5zbGF0ZVkoY2FsYyh2YXIoLS1saWZ0LWFtb3VudCkgKiB2YXIoLS10b2FzdHMtYmVmb3JlKSkpIHNjYWxlKGNhbGMoLTEgKiB2YXIoLS1zY2FsZSkpKTtoZWlnaHQ6dmFyKC0tZnJvbnQtdG9hc3QtaGVpZ2h0KX1bZGF0YS1zb25uZXItdG9hc3RdPip7dHJhbnNpdGlvbjpvcGFjaXR5IC40c31bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEteC1wb3NpdGlvbj1yaWdodF17cmlnaHQ6MH1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEteC1wb3NpdGlvbj1sZWZ0XXtsZWZ0OjB9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLWV4cGFuZGVkPWZhbHNlXVtkYXRhLWZyb250PWZhbHNlXVtkYXRhLXN0eWxlZD10cnVlXT4qe29wYWNpdHk6MH1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdmlzaWJsZT1mYWxzZV17b3BhY2l0eTowO3BvaW50ZXItZXZlbnRzOm5vbmV9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLW1vdW50ZWQ9dHJ1ZV1bZGF0YS1leHBhbmRlZD10cnVlXXstLXk6dHJhbnNsYXRlWShjYWxjKHZhcigtLWxpZnQpICogdmFyKC0tb2Zmc2V0KSkpO2hlaWdodDp2YXIoLS1pbml0aWFsLWhlaWdodCl9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXJlbW92ZWQ9dHJ1ZV1bZGF0YS1mcm9udD10cnVlXVtkYXRhLXN3aXBlLW91dD1mYWxzZV17LS15OnRyYW5zbGF0ZVkoY2FsYyh2YXIoLS1saWZ0KSAqIC0xMDAlKSk7b3BhY2l0eTowfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1yZW1vdmVkPXRydWVdW2RhdGEtZnJvbnQ9ZmFsc2VdW2RhdGEtc3dpcGUtb3V0PWZhbHNlXVtkYXRhLWV4cGFuZGVkPXRydWVdey0teTp0cmFuc2xhdGVZKGNhbGModmFyKC0tbGlmdCkgKiB2YXIoLS1vZmZzZXQpICsgdmFyKC0tbGlmdCkgKiAtMTAwJSkpO29wYWNpdHk6MH1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtcmVtb3ZlZD10cnVlXVtkYXRhLWZyb250PWZhbHNlXVtkYXRhLXN3aXBlLW91dD1mYWxzZV1bZGF0YS1leHBhbmRlZD1mYWxzZV17LS15OnRyYW5zbGF0ZVkoNDAlKTtvcGFjaXR5OjA7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gLjVzLG9wYWNpdHkgLjJzfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1yZW1vdmVkPXRydWVdW2RhdGEtZnJvbnQ9ZmFsc2VdOjpiZWZvcmV7aGVpZ2h0OmNhbGModmFyKC0taW5pdGlhbC1oZWlnaHQpICsgMjAlKX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3dpcGluZz10cnVlXXt0cmFuc2Zvcm06dmFyKC0teSkgdHJhbnNsYXRlWSh2YXIoLS1zd2lwZS1hbW91bnQteSwwKSkgdHJhbnNsYXRlWCh2YXIoLS1zd2lwZS1hbW91bnQteCwwKSk7dHJhbnNpdGlvbjpub25lfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zd2lwZWQ9dHJ1ZV17dXNlci1zZWxlY3Q6bm9uZX1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3dpcGUtb3V0PXRydWVdW2RhdGEteS1wb3NpdGlvbj1ib3R0b21dLFtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zd2lwZS1vdXQ9dHJ1ZV1bZGF0YS15LXBvc2l0aW9uPXRvcF17YW5pbWF0aW9uLWR1cmF0aW9uOi4yczthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmVhc2Utb3V0O2FuaW1hdGlvbi1maWxsLW1vZGU6Zm9yd2FyZHN9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN3aXBlLW91dD10cnVlXVtkYXRhLXN3aXBlLWRpcmVjdGlvbj1sZWZ0XXthbmltYXRpb24tbmFtZTpzd2lwZS1vdXQtbGVmdH1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtc3dpcGUtb3V0PXRydWVdW2RhdGEtc3dpcGUtZGlyZWN0aW9uPXJpZ2h0XXthbmltYXRpb24tbmFtZTpzd2lwZS1vdXQtcmlnaHR9W2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLXN3aXBlLW91dD10cnVlXVtkYXRhLXN3aXBlLWRpcmVjdGlvbj11cF17YW5pbWF0aW9uLW5hbWU6c3dpcGUtb3V0LXVwfVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1zd2lwZS1vdXQ9dHJ1ZV1bZGF0YS1zd2lwZS1kaXJlY3Rpb249ZG93bl17YW5pbWF0aW9uLW5hbWU6c3dpcGUtb3V0LWRvd259QGtleWZyYW1lcyBzd2lwZS1vdXQtbGVmdHtmcm9te3RyYW5zZm9ybTp2YXIoLS15KSB0cmFuc2xhdGVYKHZhcigtLXN3aXBlLWFtb3VudC14KSk7b3BhY2l0eToxfXRve3RyYW5zZm9ybTp2YXIoLS15KSB0cmFuc2xhdGVYKGNhbGModmFyKC0tc3dpcGUtYW1vdW50LXgpIC0gMTAwJSkpO29wYWNpdHk6MH19QGtleWZyYW1lcyBzd2lwZS1vdXQtcmlnaHR7ZnJvbXt0cmFuc2Zvcm06dmFyKC0teSkgdHJhbnNsYXRlWCh2YXIoLS1zd2lwZS1hbW91bnQteCkpO29wYWNpdHk6MX10b3t0cmFuc2Zvcm06dmFyKC0teSkgdHJhbnNsYXRlWChjYWxjKHZhcigtLXN3aXBlLWFtb3VudC14KSArIDEwMCUpKTtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgc3dpcGUtb3V0LXVwe2Zyb217dHJhbnNmb3JtOnZhcigtLXkpIHRyYW5zbGF0ZVkodmFyKC0tc3dpcGUtYW1vdW50LXkpKTtvcGFjaXR5OjF9dG97dHJhbnNmb3JtOnZhcigtLXkpIHRyYW5zbGF0ZVkoY2FsYyh2YXIoLS1zd2lwZS1hbW91bnQteSkgLSAxMDAlKSk7b3BhY2l0eTowfX1Aa2V5ZnJhbWVzIHN3aXBlLW91dC1kb3due2Zyb217dHJhbnNmb3JtOnZhcigtLXkpIHRyYW5zbGF0ZVkodmFyKC0tc3dpcGUtYW1vdW50LXkpKTtvcGFjaXR5OjF9dG97dHJhbnNmb3JtOnZhcigtLXkpIHRyYW5zbGF0ZVkoY2FsYyh2YXIoLS1zd2lwZS1hbW91bnQteSkgKyAxMDAlKSk7b3BhY2l0eTowfX1AbWVkaWEgKG1heC13aWR0aDo2MDBweCl7W2RhdGEtc29ubmVyLXRvYXN0ZXJde3Bvc2l0aW9uOmZpeGVkO3JpZ2h0OnZhcigtLW1vYmlsZS1vZmZzZXQtcmlnaHQpO2xlZnQ6dmFyKC0tbW9iaWxlLW9mZnNldC1sZWZ0KTt3aWR0aDoxMDAlfVtkYXRhLXNvbm5lci10b2FzdGVyXVtkaXI9cnRsXXtsZWZ0OmNhbGModmFyKC0tbW9iaWxlLW9mZnNldC1sZWZ0KSAqIC0xKX1bZGF0YS1zb25uZXItdG9hc3Rlcl0gW2RhdGEtc29ubmVyLXRvYXN0XXtsZWZ0OjA7cmlnaHQ6MDt3aWR0aDpjYWxjKDEwMCUgLSB2YXIoLS1tb2JpbGUtb2Zmc2V0LWxlZnQpICogMil9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteC1wb3NpdGlvbj1sZWZ0XXtsZWZ0OnZhcigtLW1vYmlsZS1vZmZzZXQtbGVmdCl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteS1wb3NpdGlvbj1ib3R0b21de2JvdHRvbTp2YXIoLS1tb2JpbGUtb2Zmc2V0LWJvdHRvbSl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteS1wb3NpdGlvbj10b3Bde3RvcDp2YXIoLS1tb2JpbGUtb2Zmc2V0LXRvcCl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEteC1wb3NpdGlvbj1jZW50ZXJde2xlZnQ6dmFyKC0tbW9iaWxlLW9mZnNldC1sZWZ0KTtyaWdodDp2YXIoLS1tb2JpbGUtb2Zmc2V0LXJpZ2h0KTt0cmFuc2Zvcm06bm9uZX19W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEtc29ubmVyLXRoZW1lPWxpZ2h0XXstLW5vcm1hbC1iZzojZmZmOy0tbm9ybWFsLWJvcmRlcjp2YXIoLS1ncmF5NCk7LS1ub3JtYWwtdGV4dDp2YXIoLS1ncmF5MTIpOy0tc3VjY2Vzcy1iZzpoc2woMTQzLCA4NSUsIDk2JSk7LS1zdWNjZXNzLWJvcmRlcjpoc2woMTQ1LCA5MiUsIDg3JSk7LS1zdWNjZXNzLXRleHQ6aHNsKDE0MCwgMTAwJSwgMjclKTstLWluZm8tYmc6aHNsKDIwOCwgMTAwJSwgOTclKTstLWluZm8tYm9yZGVyOmhzbCgyMjEsIDkxJSwgOTMlKTstLWluZm8tdGV4dDpoc2woMjEwLCA5MiUsIDQ1JSk7LS13YXJuaW5nLWJnOmhzbCg0OSwgMTAwJSwgOTclKTstLXdhcm5pbmctYm9yZGVyOmhzbCg0OSwgOTElLCA4NCUpOy0td2FybmluZy10ZXh0OmhzbCgzMSwgOTIlLCA0NSUpOy0tZXJyb3ItYmc6aHNsKDM1OSwgMTAwJSwgOTclKTstLWVycm9yLWJvcmRlcjpoc2woMzU5LCAxMDAlLCA5NCUpOy0tZXJyb3ItdGV4dDpoc2woMzYwLCAxMDAlLCA0NSUpfVtkYXRhLXNvbm5lci10b2FzdGVyXVtkYXRhLXNvbm5lci10aGVtZT1saWdodF0gW2RhdGEtc29ubmVyLXRvYXN0XVtkYXRhLWludmVydD10cnVlXXstLW5vcm1hbC1iZzojMDAwOy0tbm9ybWFsLWJvcmRlcjpoc2woMCwgMCUsIDIwJSk7LS1ub3JtYWwtdGV4dDp2YXIoLS1ncmF5MSl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEtc29ubmVyLXRoZW1lPWRhcmtdIFtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS1pbnZlcnQ9dHJ1ZV17LS1ub3JtYWwtYmc6I2ZmZjstLW5vcm1hbC1ib3JkZXI6dmFyKC0tZ3JheTMpOy0tbm9ybWFsLXRleHQ6dmFyKC0tZ3JheTEyKX1bZGF0YS1zb25uZXItdG9hc3Rlcl1bZGF0YS1zb25uZXItdGhlbWU9ZGFya117LS1ub3JtYWwtYmc6IzAwMDstLW5vcm1hbC1iZy1ob3Zlcjpoc2woMCwgMCUsIDEyJSk7LS1ub3JtYWwtYm9yZGVyOmhzbCgwLCAwJSwgMjAlKTstLW5vcm1hbC1ib3JkZXItaG92ZXI6aHNsKDAsIDAlLCAyNSUpOy0tbm9ybWFsLXRleHQ6dmFyKC0tZ3JheTEpOy0tc3VjY2Vzcy1iZzpoc2woMTUwLCAxMDAlLCA2JSk7LS1zdWNjZXNzLWJvcmRlcjpoc2woMTQ3LCAxMDAlLCAxMiUpOy0tc3VjY2Vzcy10ZXh0OmhzbCgxNTAsIDg2JSwgNjUlKTstLWluZm8tYmc6aHNsKDIxNSwgMTAwJSwgNiUpOy0taW5mby1ib3JkZXI6aHNsKDIyMywgNDMlLCAxNyUpOy0taW5mby10ZXh0OmhzbCgyMTYsIDg3JSwgNjUlKTstLXdhcm5pbmctYmc6aHNsKDY0LCAxMDAlLCA2JSk7LS13YXJuaW5nLWJvcmRlcjpoc2woNjAsIDEwMCUsIDklKTstLXdhcm5pbmctdGV4dDpoc2woNDYsIDg3JSwgNjUlKTstLWVycm9yLWJnOmhzbCgzNTgsIDc2JSwgMTAlKTstLWVycm9yLWJvcmRlcjpoc2woMzU3LCA4OSUsIDE2JSk7LS1lcnJvci10ZXh0OmhzbCgzNTgsIDEwMCUsIDgxJSl9W2RhdGEtc29ubmVyLXRvYXN0ZXJdW2RhdGEtc29ubmVyLXRoZW1lPWRhcmtdIFtkYXRhLXNvbm5lci10b2FzdF0gW2RhdGEtY2xvc2UtYnV0dG9uXXtiYWNrZ3JvdW5kOnZhcigtLW5vcm1hbC1iZyk7Ym9yZGVyLWNvbG9yOnZhcigtLW5vcm1hbC1ib3JkZXIpO2NvbG9yOnZhcigtLW5vcm1hbC10ZXh0KX1bZGF0YS1zb25uZXItdG9hc3Rlcl1bZGF0YS1zb25uZXItdGhlbWU9ZGFya10gW2RhdGEtc29ubmVyLXRvYXN0XSBbZGF0YS1jbG9zZS1idXR0b25dOmhvdmVye2JhY2tncm91bmQ6dmFyKC0tbm9ybWFsLWJnLWhvdmVyKTtib3JkZXItY29sb3I6dmFyKC0tbm9ybWFsLWJvcmRlci1ob3Zlcil9W2RhdGEtcmljaC1jb2xvcnM9dHJ1ZV1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdHlwZT1zdWNjZXNzXXtiYWNrZ3JvdW5kOnZhcigtLXN1Y2Nlc3MtYmcpO2JvcmRlci1jb2xvcjp2YXIoLS1zdWNjZXNzLWJvcmRlcik7Y29sb3I6dmFyKC0tc3VjY2Vzcy10ZXh0KX1bZGF0YS1yaWNoLWNvbG9ycz10cnVlXVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS10eXBlPXN1Y2Nlc3NdIFtkYXRhLWNsb3NlLWJ1dHRvbl17YmFja2dyb3VuZDp2YXIoLS1zdWNjZXNzLWJnKTtib3JkZXItY29sb3I6dmFyKC0tc3VjY2Vzcy1ib3JkZXIpO2NvbG9yOnZhcigtLXN1Y2Nlc3MtdGV4dCl9W2RhdGEtcmljaC1jb2xvcnM9dHJ1ZV1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdHlwZT1pbmZvXXtiYWNrZ3JvdW5kOnZhcigtLWluZm8tYmcpO2JvcmRlci1jb2xvcjp2YXIoLS1pbmZvLWJvcmRlcik7Y29sb3I6dmFyKC0taW5mby10ZXh0KX1bZGF0YS1yaWNoLWNvbG9ycz10cnVlXVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS10eXBlPWluZm9dIFtkYXRhLWNsb3NlLWJ1dHRvbl17YmFja2dyb3VuZDp2YXIoLS1pbmZvLWJnKTtib3JkZXItY29sb3I6dmFyKC0taW5mby1ib3JkZXIpO2NvbG9yOnZhcigtLWluZm8tdGV4dCl9W2RhdGEtcmljaC1jb2xvcnM9dHJ1ZV1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdHlwZT13YXJuaW5nXXtiYWNrZ3JvdW5kOnZhcigtLXdhcm5pbmctYmcpO2JvcmRlci1jb2xvcjp2YXIoLS13YXJuaW5nLWJvcmRlcik7Y29sb3I6dmFyKC0td2FybmluZy10ZXh0KX1bZGF0YS1yaWNoLWNvbG9ycz10cnVlXVtkYXRhLXNvbm5lci10b2FzdF1bZGF0YS10eXBlPXdhcm5pbmddIFtkYXRhLWNsb3NlLWJ1dHRvbl17YmFja2dyb3VuZDp2YXIoLS13YXJuaW5nLWJnKTtib3JkZXItY29sb3I6dmFyKC0td2FybmluZy1ib3JkZXIpO2NvbG9yOnZhcigtLXdhcm5pbmctdGV4dCl9W2RhdGEtcmljaC1jb2xvcnM9dHJ1ZV1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdHlwZT1lcnJvcl17YmFja2dyb3VuZDp2YXIoLS1lcnJvci1iZyk7Ym9yZGVyLWNvbG9yOnZhcigtLWVycm9yLWJvcmRlcik7Y29sb3I6dmFyKC0tZXJyb3ItdGV4dCl9W2RhdGEtcmljaC1jb2xvcnM9dHJ1ZV1bZGF0YS1zb25uZXItdG9hc3RdW2RhdGEtdHlwZT1lcnJvcl0gW2RhdGEtY2xvc2UtYnV0dG9uXXtiYWNrZ3JvdW5kOnZhcigtLWVycm9yLWJnKTtib3JkZXItY29sb3I6dmFyKC0tZXJyb3ItYm9yZGVyKTtjb2xvcjp2YXIoLS1lcnJvci10ZXh0KX0uc29ubmVyLWxvYWRpbmctd3JhcHBlcnstLXNpemU6MTZweDtoZWlnaHQ6dmFyKC0tc2l6ZSk7d2lkdGg6dmFyKC0tc2l6ZSk7cG9zaXRpb246YWJzb2x1dGU7aW5zZXQ6MDt6LWluZGV4OjEwfS5zb25uZXItbG9hZGluZy13cmFwcGVyW2RhdGEtdmlzaWJsZT1mYWxzZV17dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7YW5pbWF0aW9uOnNvbm5lci1mYWRlLW91dCAuMnMgZWFzZSBmb3J3YXJkc30uc29ubmVyLXNwaW5uZXJ7cG9zaXRpb246cmVsYXRpdmU7dG9wOjUwJTtsZWZ0OjUwJTtoZWlnaHQ6dmFyKC0tc2l6ZSk7d2lkdGg6dmFyKC0tc2l6ZSl9LnNvbm5lci1sb2FkaW5nLWJhcnthbmltYXRpb246c29ubmVyLXNwaW4gMS4ycyBsaW5lYXIgaW5maW5pdGU7YmFja2dyb3VuZDp2YXIoLS1ncmF5MTEpO2JvcmRlci1yYWRpdXM6NnB4O2hlaWdodDo4JTtsZWZ0Oi0xMCU7cG9zaXRpb246YWJzb2x1dGU7dG9wOi0zLjklO3dpZHRoOjI0JX0uc29ubmVyLWxvYWRpbmctYmFyOmZpcnN0LWNoaWxke2FuaW1hdGlvbi1kZWxheTotMS4yczt0cmFuc2Zvcm06cm90YXRlKC4wMDAxZGVnKSB0cmFuc2xhdGUoMTQ2JSl9LnNvbm5lci1sb2FkaW5nLWJhcjpudGgtY2hpbGQoMil7YW5pbWF0aW9uLWRlbGF5Oi0xLjFzO3RyYW5zZm9ybTpyb3RhdGUoMzBkZWcpIHRyYW5zbGF0ZSgxNDYlKX0uc29ubmVyLWxvYWRpbmctYmFyOm50aC1jaGlsZCgzKXthbmltYXRpb24tZGVsYXk6LTFzO3RyYW5zZm9ybTpyb3RhdGUoNjBkZWcpIHRyYW5zbGF0ZSgxNDYlKX0uc29ubmVyLWxvYWRpbmctYmFyOm50aC1jaGlsZCg0KXthbmltYXRpb24tZGVsYXk6LS45czt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKSB0cmFuc2xhdGUoMTQ2JSl9LnNvbm5lci1sb2FkaW5nLWJhcjpudGgtY2hpbGQoNSl7YW5pbWF0aW9uLWRlbGF5Oi0uOHM7dHJhbnNmb3JtOnJvdGF0ZSgxMjBkZWcpIHRyYW5zbGF0ZSgxNDYlKX0uc29ubmVyLWxvYWRpbmctYmFyOm50aC1jaGlsZCg2KXthbmltYXRpb24tZGVsYXk6LS43czt0cmFuc2Zvcm06cm90YXRlKDE1MGRlZykgdHJhbnNsYXRlKDE0NiUpfS5zb25uZXItbG9hZGluZy1iYXI6bnRoLWNoaWxkKDcpe2FuaW1hdGlvbi1kZWxheTotLjZzO3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKSB0cmFuc2xhdGUoMTQ2JSl9LnNvbm5lci1sb2FkaW5nLWJhcjpudGgtY2hpbGQoOCl7YW5pbWF0aW9uLWRlbGF5Oi0uNXM7dHJhbnNmb3JtOnJvdGF0ZSgyMTBkZWcpIHRyYW5zbGF0ZSgxNDYlKX0uc29ubmVyLWxvYWRpbmctYmFyOm50aC1jaGlsZCg5KXthbmltYXRpb24tZGVsYXk6LS40czt0cmFuc2Zvcm06cm90YXRlKDI0MGRlZykgdHJhbnNsYXRlKDE0NiUpfS5zb25uZXItbG9hZGluZy1iYXI6bnRoLWNoaWxkKDEwKXthbmltYXRpb24tZGVsYXk6LS4zczt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZykgdHJhbnNsYXRlKDE0NiUpfS5zb25uZXItbG9hZGluZy1iYXI6bnRoLWNoaWxkKDExKXthbmltYXRpb24tZGVsYXk6LS4yczt0cmFuc2Zvcm06cm90YXRlKDMwMGRlZykgdHJhbnNsYXRlKDE0NiUpfS5zb25uZXItbG9hZGluZy1iYXI6bnRoLWNoaWxkKDEyKXthbmltYXRpb24tZGVsYXk6LS4xczt0cmFuc2Zvcm06cm90YXRlKDMzMGRlZykgdHJhbnNsYXRlKDE0NiUpfUBrZXlmcmFtZXMgc29ubmVyLWZhZGUtaW57MCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOCl9MTAwJXtvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpfX1Aa2V5ZnJhbWVzIHNvbm5lci1mYWRlLW91dHswJXtvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlKDEpfTEwMCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOCl9fUBrZXlmcmFtZXMgc29ubmVyLXNwaW57MCV7b3BhY2l0eToxfTEwMCV7b3BhY2l0eTouMTV9fUBtZWRpYSAocHJlZmVycy1yZWR1Y2VkLW1vdGlvbil7LnNvbm5lci1sb2FkaW5nLWJhcixbZGF0YS1zb25uZXItdG9hc3RdLFtkYXRhLXNvbm5lci10b2FzdF0+Knt0cmFuc2l0aW9uOm5vbmUhaW1wb3J0YW50O2FuaW1hdGlvbjpub25lIWltcG9ydGFudH19LnNvbm5lci1sb2FkZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtsZWZ0OjUwJTt0cmFuc2Zvcm06dHJhbnNsYXRlKC01MCUsLTUwJSk7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNpdGlvbjpvcGFjaXR5IC4ycyx0cmFuc2Zvcm0gLjJzfS5zb25uZXItbG9hZGVyW2RhdGEtdmlzaWJsZT1mYWxzZV17b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZSguOCkgdHJhbnNsYXRlKC01MCUsLTUwJSl9XCIpO1xuXG5mdW5jdGlvbiBpc0FjdGlvbihhY3Rpb24pIHtcbiAgICByZXR1cm4gYWN0aW9uLmxhYmVsICE9PSB1bmRlZmluZWQ7XG59XG5cbi8vIFZpc2libGUgdG9hc3RzIGFtb3VudFxuY29uc3QgVklTSUJMRV9UT0FTVFNfQU1PVU5UID0gMztcbi8vIFZpZXdwb3J0IHBhZGRpbmdcbmNvbnN0IFZJRVdQT1JUX09GRlNFVCA9ICcyNHB4Jztcbi8vIE1vYmlsZSB2aWV3cG9ydCBwYWRkaW5nXG5jb25zdCBNT0JJTEVfVklFV1BPUlRfT0ZGU0VUID0gJzE2cHgnO1xuLy8gRGVmYXVsdCBsaWZldGltZSBvZiBhIHRvYXN0cyAoaW4gbXMpXG5jb25zdCBUT0FTVF9MSUZFVElNRSA9IDQwMDA7XG4vLyBEZWZhdWx0IHRvYXN0IHdpZHRoXG5jb25zdCBUT0FTVF9XSURUSCA9IDM1Njtcbi8vIERlZmF1bHQgZ2FwIGJldHdlZW4gdG9hc3RzXG5jb25zdCBHQVAgPSAxNDtcbi8vIFRocmVzaG9sZCB0byBkaXNtaXNzIGEgdG9hc3RcbmNvbnN0IFNXSVBFX1RIUkVTSE9MRCA9IDQ1O1xuLy8gRXF1YWwgdG8gZXhpdCBhbmltYXRpb24gZHVyYXRpb25cbmNvbnN0IFRJTUVfQkVGT1JFX1VOTU9VTlQgPSAyMDA7XG5mdW5jdGlvbiBjbiguLi5jbGFzc2VzKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAnKTtcbn1cbmZ1bmN0aW9uIGdldERlZmF1bHRTd2lwZURpcmVjdGlvbnMocG9zaXRpb24pIHtcbiAgICBjb25zdCBbeSwgeF0gPSBwb3NpdGlvbi5zcGxpdCgnLScpO1xuICAgIGNvbnN0IGRpcmVjdGlvbnMgPSBbXTtcbiAgICBpZiAoeSkge1xuICAgICAgICBkaXJlY3Rpb25zLnB1c2goeSk7XG4gICAgfVxuICAgIGlmICh4KSB7XG4gICAgICAgIGRpcmVjdGlvbnMucHVzaCh4KTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdGlvbnM7XG59XG5jb25zdCBUb2FzdCA9IChwcm9wcyk9PntcbiAgICB2YXIgX3RvYXN0X2NsYXNzTmFtZXMsIF90b2FzdF9jbGFzc05hbWVzMSwgX3RvYXN0X2NsYXNzTmFtZXMyLCBfdG9hc3RfY2xhc3NOYW1lczMsIF90b2FzdF9jbGFzc05hbWVzNCwgX3RvYXN0X2NsYXNzTmFtZXM1LCBfdG9hc3RfY2xhc3NOYW1lczYsIF90b2FzdF9jbGFzc05hbWVzNywgX3RvYXN0X2NsYXNzTmFtZXM4O1xuICAgIGNvbnN0IHsgaW52ZXJ0OiBUb2FzdGVySW52ZXJ0LCB0b2FzdCwgdW5zdHlsZWQsIGludGVyYWN0aW5nLCBzZXRIZWlnaHRzLCB2aXNpYmxlVG9hc3RzLCBoZWlnaHRzLCBpbmRleCwgdG9hc3RzLCBleHBhbmRlZCwgcmVtb3ZlVG9hc3QsIGRlZmF1bHRSaWNoQ29sb3JzLCBjbG9zZUJ1dHRvbjogY2xvc2VCdXR0b25Gcm9tVG9hc3Rlciwgc3R5bGUsIGNhbmNlbEJ1dHRvblN0eWxlLCBhY3Rpb25CdXR0b25TdHlsZSwgY2xhc3NOYW1lID0gJycsIGRlc2NyaXB0aW9uQ2xhc3NOYW1lID0gJycsIGR1cmF0aW9uOiBkdXJhdGlvbkZyb21Ub2FzdGVyLCBwb3NpdGlvbiwgZ2FwLCBleHBhbmRCeURlZmF1bHQsIGNsYXNzTmFtZXMsIGljb25zLCBjbG9zZUJ1dHRvbkFyaWFMYWJlbCA9ICdDbG9zZSB0b2FzdCcgfSA9IHByb3BzO1xuICAgIGNvbnN0IFtzd2lwZURpcmVjdGlvbiwgc2V0U3dpcGVEaXJlY3Rpb25dID0gUmVhY3QudXNlU3RhdGUobnVsbCk7XG4gICAgY29uc3QgW3N3aXBlT3V0RGlyZWN0aW9uLCBzZXRTd2lwZU91dERpcmVjdGlvbl0gPSBSZWFjdC51c2VTdGF0ZShudWxsKTtcbiAgICBjb25zdCBbbW91bnRlZCwgc2V0TW91bnRlZF0gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW3JlbW92ZWQsIHNldFJlbW92ZWRdID0gUmVhY3QudXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtzd2lwaW5nLCBzZXRTd2lwaW5nXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbc3dpcGVPdXQsIHNldFN3aXBlT3V0XSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbaXNTd2lwZWQsIHNldElzU3dpcGVkXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbb2Zmc2V0QmVmb3JlUmVtb3ZlLCBzZXRPZmZzZXRCZWZvcmVSZW1vdmVdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gICAgY29uc3QgW2luaXRpYWxIZWlnaHQsIHNldEluaXRpYWxIZWlnaHRdID0gUmVhY3QudXNlU3RhdGUoMCk7XG4gICAgY29uc3QgcmVtYWluaW5nVGltZSA9IFJlYWN0LnVzZVJlZih0b2FzdC5kdXJhdGlvbiB8fCBkdXJhdGlvbkZyb21Ub2FzdGVyIHx8IFRPQVNUX0xJRkVUSU1FKTtcbiAgICBjb25zdCBkcmFnU3RhcnRUaW1lID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IHRvYXN0UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGlzRnJvbnQgPSBpbmRleCA9PT0gMDtcbiAgICBjb25zdCBpc1Zpc2libGUgPSBpbmRleCArIDEgPD0gdmlzaWJsZVRvYXN0cztcbiAgICBjb25zdCB0b2FzdFR5cGUgPSB0b2FzdC50eXBlO1xuICAgIGNvbnN0IGRpc21pc3NpYmxlID0gdG9hc3QuZGlzbWlzc2libGUgIT09IGZhbHNlO1xuICAgIGNvbnN0IHRvYXN0Q2xhc3NuYW1lID0gdG9hc3QuY2xhc3NOYW1lIHx8ICcnO1xuICAgIGNvbnN0IHRvYXN0RGVzY3JpcHRpb25DbGFzc25hbWUgPSB0b2FzdC5kZXNjcmlwdGlvbkNsYXNzTmFtZSB8fCAnJztcbiAgICAvLyBIZWlnaHQgaW5kZXggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG9mZnNldCBhcyBpdCBnZXRzIHVwZGF0ZWQgYmVmb3JlIHRoZSB0b2FzdCBhcnJheSwgd2hpY2ggbWVhbnMgd2UgY2FuIGNhbGN1bGF0ZSB0aGUgbmV3IGxheW91dCBmYXN0ZXIuXG4gICAgY29uc3QgaGVpZ2h0SW5kZXggPSBSZWFjdC51c2VNZW1vKCgpPT5oZWlnaHRzLmZpbmRJbmRleCgoaGVpZ2h0KT0+aGVpZ2h0LnRvYXN0SWQgPT09IHRvYXN0LmlkKSB8fCAwLCBbXG4gICAgICAgIGhlaWdodHMsXG4gICAgICAgIHRvYXN0LmlkXG4gICAgXSk7XG4gICAgY29uc3QgY2xvc2VCdXR0b24gPSBSZWFjdC51c2VNZW1vKCgpPT57XG4gICAgICAgIHZhciBfdG9hc3RfY2xvc2VCdXR0b247XG4gICAgICAgIHJldHVybiAoX3RvYXN0X2Nsb3NlQnV0dG9uID0gdG9hc3QuY2xvc2VCdXR0b24pICE9IG51bGwgPyBfdG9hc3RfY2xvc2VCdXR0b24gOiBjbG9zZUJ1dHRvbkZyb21Ub2FzdGVyO1xuICAgIH0sIFtcbiAgICAgICAgdG9hc3QuY2xvc2VCdXR0b24sXG4gICAgICAgIGNsb3NlQnV0dG9uRnJvbVRvYXN0ZXJcbiAgICBdKTtcbiAgICBjb25zdCBkdXJhdGlvbiA9IFJlYWN0LnVzZU1lbW8oKCk9PnRvYXN0LmR1cmF0aW9uIHx8IGR1cmF0aW9uRnJvbVRvYXN0ZXIgfHwgVE9BU1RfTElGRVRJTUUsIFtcbiAgICAgICAgdG9hc3QuZHVyYXRpb24sXG4gICAgICAgIGR1cmF0aW9uRnJvbVRvYXN0ZXJcbiAgICBdKTtcbiAgICBjb25zdCBjbG9zZVRpbWVyU3RhcnRUaW1lUmVmID0gUmVhY3QudXNlUmVmKDApO1xuICAgIGNvbnN0IG9mZnNldCA9IFJlYWN0LnVzZVJlZigwKTtcbiAgICBjb25zdCBsYXN0Q2xvc2VUaW1lclN0YXJ0VGltZVJlZiA9IFJlYWN0LnVzZVJlZigwKTtcbiAgICBjb25zdCBwb2ludGVyU3RhcnRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgW3ksIHhdID0gcG9zaXRpb24uc3BsaXQoJy0nKTtcbiAgICBjb25zdCB0b2FzdHNIZWlnaHRCZWZvcmUgPSBSZWFjdC51c2VNZW1vKCgpPT57XG4gICAgICAgIHJldHVybiBoZWlnaHRzLnJlZHVjZSgocHJldiwgY3VyciwgcmVkdWNlckluZGV4KT0+e1xuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9mZnNldCB1cCB1bnRpbCBjdXJyZW50IHRvYXN0XG4gICAgICAgICAgICBpZiAocmVkdWNlckluZGV4ID49IGhlaWdodEluZGV4KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcHJldiArIGN1cnIuaGVpZ2h0O1xuICAgICAgICB9LCAwKTtcbiAgICB9LCBbXG4gICAgICAgIGhlaWdodHMsXG4gICAgICAgIGhlaWdodEluZGV4XG4gICAgXSk7XG4gICAgY29uc3QgaXNEb2N1bWVudEhpZGRlbiA9IHVzZUlzRG9jdW1lbnRIaWRkZW4oKTtcbiAgICBjb25zdCBpbnZlcnQgPSB0b2FzdC5pbnZlcnQgfHwgVG9hc3RlckludmVydDtcbiAgICBjb25zdCBkaXNhYmxlZCA9IHRvYXN0VHlwZSA9PT0gJ2xvYWRpbmcnO1xuICAgIG9mZnNldC5jdXJyZW50ID0gUmVhY3QudXNlTWVtbygoKT0+aGVpZ2h0SW5kZXggKiBnYXAgKyB0b2FzdHNIZWlnaHRCZWZvcmUsIFtcbiAgICAgICAgaGVpZ2h0SW5kZXgsXG4gICAgICAgIHRvYXN0c0hlaWdodEJlZm9yZVxuICAgIF0pO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKT0+e1xuICAgICAgICByZW1haW5pbmdUaW1lLmN1cnJlbnQgPSBkdXJhdGlvbjtcbiAgICB9LCBbXG4gICAgICAgIGR1cmF0aW9uXG4gICAgXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIC8vIFRyaWdnZXIgZW50ZXIgYW5pbWF0aW9uIHdpdGhvdXQgdXNpbmcgQ1NTIGFuaW1hdGlvblxuICAgICAgICBzZXRNb3VudGVkKHRydWUpO1xuICAgIH0sIFtdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCk9PntcbiAgICAgICAgY29uc3QgdG9hc3ROb2RlID0gdG9hc3RSZWYuY3VycmVudDtcbiAgICAgICAgaWYgKHRvYXN0Tm9kZSkge1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gdG9hc3ROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIC8vIEFkZCB0b2FzdCBoZWlnaHQgdG8gaGVpZ2h0cyBhcnJheSBhZnRlciB0aGUgdG9hc3QgaXMgbW91bnRlZFxuICAgICAgICAgICAgc2V0SW5pdGlhbEhlaWdodChoZWlnaHQpO1xuICAgICAgICAgICAgc2V0SGVpZ2h0cygoaCk9PltcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9hc3RJZDogdG9hc3QuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogdG9hc3QucG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgLi4uaFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcmV0dXJuICgpPT5zZXRIZWlnaHRzKChoKT0+aC5maWx0ZXIoKGhlaWdodCk9PmhlaWdodC50b2FzdElkICE9PSB0b2FzdC5pZCkpO1xuICAgICAgICB9XG4gICAgfSwgW1xuICAgICAgICBzZXRIZWlnaHRzLFxuICAgICAgICB0b2FzdC5pZFxuICAgIF0pO1xuICAgIFJlYWN0LnVzZUxheW91dEVmZmVjdCgoKT0+e1xuICAgICAgICAvLyBLZWVwIGhlaWdodCB1cCB0byBkYXRlIHdpdGggdGhlIGNvbnRlbnQgaW4gY2FzZSBpdCB1cGRhdGVzXG4gICAgICAgIGlmICghbW91bnRlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB0b2FzdE5vZGUgPSB0b2FzdFJlZi5jdXJyZW50O1xuICAgICAgICBjb25zdCBvcmlnaW5hbEhlaWdodCA9IHRvYXN0Tm9kZS5zdHlsZS5oZWlnaHQ7XG4gICAgICAgIHRvYXN0Tm9kZS5zdHlsZS5oZWlnaHQgPSAnYXV0byc7XG4gICAgICAgIGNvbnN0IG5ld0hlaWdodCA9IHRvYXN0Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICAgIHRvYXN0Tm9kZS5zdHlsZS5oZWlnaHQgPSBvcmlnaW5hbEhlaWdodDtcbiAgICAgICAgc2V0SW5pdGlhbEhlaWdodChuZXdIZWlnaHQpO1xuICAgICAgICBzZXRIZWlnaHRzKChoZWlnaHRzKT0+e1xuICAgICAgICAgICAgY29uc3QgYWxyZWFkeUV4aXN0cyA9IGhlaWdodHMuZmluZCgoaGVpZ2h0KT0+aGVpZ2h0LnRvYXN0SWQgPT09IHRvYXN0LmlkKTtcbiAgICAgICAgICAgIGlmICghYWxyZWFkeUV4aXN0cykge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0SWQ6IHRvYXN0LmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogdG9hc3QucG9zaXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgLi4uaGVpZ2h0c1xuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBoZWlnaHRzLm1hcCgoaGVpZ2h0KT0+aGVpZ2h0LnRvYXN0SWQgPT09IHRvYXN0LmlkID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgfSA6IGhlaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sIFtcbiAgICAgICAgbW91bnRlZCxcbiAgICAgICAgdG9hc3QudGl0bGUsXG4gICAgICAgIHRvYXN0LmRlc2NyaXB0aW9uLFxuICAgICAgICBzZXRIZWlnaHRzLFxuICAgICAgICB0b2FzdC5pZCxcbiAgICAgICAgdG9hc3QuanN4LFxuICAgICAgICB0b2FzdC5hY3Rpb24sXG4gICAgICAgIHRvYXN0LmNhbmNlbFxuICAgIF0pO1xuICAgIGNvbnN0IGRlbGV0ZVRvYXN0ID0gUmVhY3QudXNlQ2FsbGJhY2soKCk9PntcbiAgICAgICAgLy8gU2F2ZSB0aGUgb2Zmc2V0IGZvciB0aGUgZXhpdCBzd2lwZSBhbmltYXRpb25cbiAgICAgICAgc2V0UmVtb3ZlZCh0cnVlKTtcbiAgICAgICAgc2V0T2Zmc2V0QmVmb3JlUmVtb3ZlKG9mZnNldC5jdXJyZW50KTtcbiAgICAgICAgc2V0SGVpZ2h0cygoaCk9PmguZmlsdGVyKChoZWlnaHQpPT5oZWlnaHQudG9hc3RJZCAhPT0gdG9hc3QuaWQpKTtcbiAgICAgICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgcmVtb3ZlVG9hc3QodG9hc3QpO1xuICAgICAgICB9LCBUSU1FX0JFRk9SRV9VTk1PVU5UKTtcbiAgICB9LCBbXG4gICAgICAgIHRvYXN0LFxuICAgICAgICByZW1vdmVUb2FzdCxcbiAgICAgICAgc2V0SGVpZ2h0cyxcbiAgICAgICAgb2Zmc2V0XG4gICAgXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGlmICh0b2FzdC5wcm9taXNlICYmIHRvYXN0VHlwZSA9PT0gJ2xvYWRpbmcnIHx8IHRvYXN0LmR1cmF0aW9uID09PSBJbmZpbml0eSB8fCB0b2FzdC50eXBlID09PSAnbG9hZGluZycpIHJldHVybjtcbiAgICAgICAgbGV0IHRpbWVvdXRJZDtcbiAgICAgICAgLy8gUGF1c2UgdGhlIHRpbWVyIG9uIGVhY2ggaG92ZXJcbiAgICAgICAgY29uc3QgcGF1c2VUaW1lciA9ICgpPT57XG4gICAgICAgICAgICBpZiAobGFzdENsb3NlVGltZXJTdGFydFRpbWVSZWYuY3VycmVudCA8IGNsb3NlVGltZXJTdGFydFRpbWVSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZWxhcHNlZCB0aW1lIHNpbmNlIHRoZSB0aW1lciBzdGFydGVkXG4gICAgICAgICAgICAgICAgY29uc3QgZWxhcHNlZFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIGNsb3NlVGltZXJTdGFydFRpbWVSZWYuY3VycmVudDtcbiAgICAgICAgICAgICAgICByZW1haW5pbmdUaW1lLmN1cnJlbnQgPSByZW1haW5pbmdUaW1lLmN1cnJlbnQgLSBlbGFwc2VkVGltZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RDbG9zZVRpbWVyU3RhcnRUaW1lUmVmLmN1cnJlbnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lciA9ICgpPT57XG4gICAgICAgICAgICAvLyBzZXRUaW1lb3V0KCwgSW5maW5pdHkpIGJlaGF2ZXMgYXMgaWYgdGhlIGRlbGF5IGlzIDAuXG4gICAgICAgICAgICAvLyBBcyBhIHJlc3VsdCwgdGhlIHRvYXN0IHdvdWxkIGJlIGNsb3NlZCBpbW1lZGlhdGVseSwgZ2l2aW5nIHRoZSBhcHBlYXJhbmNlIHRoYXQgaXQgd2FzIG5ldmVyIHJlbmRlcmVkLlxuICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vZGVueXNkb3ZoYW4vd3RmanM/dGFiPXJlYWRtZS1vdi1maWxlI2FuLWluZmluaXRlLXRpbWVvdXRcbiAgICAgICAgICAgIGlmIChyZW1haW5pbmdUaW1lLmN1cnJlbnQgPT09IEluZmluaXR5KSByZXR1cm47XG4gICAgICAgICAgICBjbG9zZVRpbWVyU3RhcnRUaW1lUmVmLmN1cnJlbnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgICAgIC8vIExldCB0aGUgdG9hc3Qga25vdyBpdCBoYXMgc3RhcnRlZFxuICAgICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgICAgIHRvYXN0Lm9uQXV0b0Nsb3NlID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdC5vbkF1dG9DbG9zZS5jYWxsKHRvYXN0LCB0b2FzdCk7XG4gICAgICAgICAgICAgICAgZGVsZXRlVG9hc3QoKTtcbiAgICAgICAgICAgIH0sIHJlbWFpbmluZ1RpbWUuY3VycmVudCk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChleHBhbmRlZCB8fCBpbnRlcmFjdGluZyB8fCBpc0RvY3VtZW50SGlkZGVuKSB7XG4gICAgICAgICAgICBwYXVzZVRpbWVyKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGFydFRpbWVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICgpPT5jbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICB9LCBbXG4gICAgICAgIGV4cGFuZGVkLFxuICAgICAgICBpbnRlcmFjdGluZyxcbiAgICAgICAgdG9hc3QsXG4gICAgICAgIHRvYXN0VHlwZSxcbiAgICAgICAgaXNEb2N1bWVudEhpZGRlbixcbiAgICAgICAgZGVsZXRlVG9hc3RcbiAgICBdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCk9PntcbiAgICAgICAgaWYgKHRvYXN0LmRlbGV0ZSkge1xuICAgICAgICAgICAgZGVsZXRlVG9hc3QoKTtcbiAgICAgICAgICAgIHRvYXN0Lm9uRGlzbWlzcyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3Qub25EaXNtaXNzLmNhbGwodG9hc3QsIHRvYXN0KTtcbiAgICAgICAgfVxuICAgIH0sIFtcbiAgICAgICAgZGVsZXRlVG9hc3QsXG4gICAgICAgIHRvYXN0LmRlbGV0ZVxuICAgIF0pO1xuICAgIGZ1bmN0aW9uIGdldExvYWRpbmdJY29uKCkge1xuICAgICAgICB2YXIgX3RvYXN0X2NsYXNzTmFtZXM7XG4gICAgICAgIGlmIChpY29ucyA9PSBudWxsID8gdm9pZCAwIDogaWNvbnMubG9hZGluZykge1xuICAgICAgICAgICAgdmFyIF90b2FzdF9jbGFzc05hbWVzMTtcbiAgICAgICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogY24oY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lcy5sb2FkZXIsIHRvYXN0ID09IG51bGwgPyB2b2lkIDAgOiAoX3RvYXN0X2NsYXNzTmFtZXMxID0gdG9hc3QuY2xhc3NOYW1lcykgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2FzdF9jbGFzc05hbWVzMS5sb2FkZXIsICdzb25uZXItbG9hZGVyJyksXG4gICAgICAgICAgICAgICAgXCJkYXRhLXZpc2libGVcIjogdG9hc3RUeXBlID09PSAnbG9hZGluZydcbiAgICAgICAgICAgIH0sIGljb25zLmxvYWRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoTG9hZGVyLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGNuKGNsYXNzTmFtZXMgPT0gbnVsbCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMubG9hZGVyLCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzID0gdG9hc3QuY2xhc3NOYW1lcykgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2FzdF9jbGFzc05hbWVzLmxvYWRlciksXG4gICAgICAgICAgICB2aXNpYmxlOiB0b2FzdFR5cGUgPT09ICdsb2FkaW5nJ1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgY29uc3QgaWNvbiA9IHRvYXN0Lmljb24gfHwgKGljb25zID09IG51bGwgPyB2b2lkIDAgOiBpY29uc1t0b2FzdFR5cGVdKSB8fCBnZXRBc3NldCh0b2FzdFR5cGUpO1xuICAgIHZhciBfdG9hc3RfcmljaENvbG9ycywgX2ljb25zX2Nsb3NlO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJsaVwiLCB7XG4gICAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgICByZWY6IHRvYXN0UmVmLFxuICAgICAgICBjbGFzc05hbWU6IGNuKGNsYXNzTmFtZSwgdG9hc3RDbGFzc25hbWUsIGNsYXNzTmFtZXMgPT0gbnVsbCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMudG9hc3QsIHRvYXN0ID09IG51bGwgPyB2b2lkIDAgOiAoX3RvYXN0X2NsYXNzTmFtZXMgPSB0b2FzdC5jbGFzc05hbWVzKSA9PSBudWxsID8gdm9pZCAwIDogX3RvYXN0X2NsYXNzTmFtZXMudG9hc3QsIGNsYXNzTmFtZXMgPT0gbnVsbCA/IHZvaWQgMCA6IGNsYXNzTmFtZXMuZGVmYXVsdCwgY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lc1t0b2FzdFR5cGVdLCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzMSA9IHRvYXN0LmNsYXNzTmFtZXMpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RfY2xhc3NOYW1lczFbdG9hc3RUeXBlXSksXG4gICAgICAgIFwiZGF0YS1zb25uZXItdG9hc3RcIjogXCJcIixcbiAgICAgICAgXCJkYXRhLXJpY2gtY29sb3JzXCI6IChfdG9hc3RfcmljaENvbG9ycyA9IHRvYXN0LnJpY2hDb2xvcnMpICE9IG51bGwgPyBfdG9hc3RfcmljaENvbG9ycyA6IGRlZmF1bHRSaWNoQ29sb3JzLFxuICAgICAgICBcImRhdGEtc3R5bGVkXCI6ICFCb29sZWFuKHRvYXN0LmpzeCB8fCB0b2FzdC51bnN0eWxlZCB8fCB1bnN0eWxlZCksXG4gICAgICAgIFwiZGF0YS1tb3VudGVkXCI6IG1vdW50ZWQsXG4gICAgICAgIFwiZGF0YS1wcm9taXNlXCI6IEJvb2xlYW4odG9hc3QucHJvbWlzZSksXG4gICAgICAgIFwiZGF0YS1zd2lwZWRcIjogaXNTd2lwZWQsXG4gICAgICAgIFwiZGF0YS1yZW1vdmVkXCI6IHJlbW92ZWQsXG4gICAgICAgIFwiZGF0YS12aXNpYmxlXCI6IGlzVmlzaWJsZSxcbiAgICAgICAgXCJkYXRhLXktcG9zaXRpb25cIjogeSxcbiAgICAgICAgXCJkYXRhLXgtcG9zaXRpb25cIjogeCxcbiAgICAgICAgXCJkYXRhLWluZGV4XCI6IGluZGV4LFxuICAgICAgICBcImRhdGEtZnJvbnRcIjogaXNGcm9udCxcbiAgICAgICAgXCJkYXRhLXN3aXBpbmdcIjogc3dpcGluZyxcbiAgICAgICAgXCJkYXRhLWRpc21pc3NpYmxlXCI6IGRpc21pc3NpYmxlLFxuICAgICAgICBcImRhdGEtdHlwZVwiOiB0b2FzdFR5cGUsXG4gICAgICAgIFwiZGF0YS1pbnZlcnRcIjogaW52ZXJ0LFxuICAgICAgICBcImRhdGEtc3dpcGUtb3V0XCI6IHN3aXBlT3V0LFxuICAgICAgICBcImRhdGEtc3dpcGUtZGlyZWN0aW9uXCI6IHN3aXBlT3V0RGlyZWN0aW9uLFxuICAgICAgICBcImRhdGEtZXhwYW5kZWRcIjogQm9vbGVhbihleHBhbmRlZCB8fCBleHBhbmRCeURlZmF1bHQgJiYgbW91bnRlZCksXG4gICAgICAgIFwiZGF0YS10ZXN0aWRcIjogdG9hc3QudGVzdElkLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgJy0taW5kZXgnOiBpbmRleCxcbiAgICAgICAgICAgICctLXRvYXN0cy1iZWZvcmUnOiBpbmRleCxcbiAgICAgICAgICAgICctLXotaW5kZXgnOiB0b2FzdHMubGVuZ3RoIC0gaW5kZXgsXG4gICAgICAgICAgICAnLS1vZmZzZXQnOiBgJHtyZW1vdmVkID8gb2Zmc2V0QmVmb3JlUmVtb3ZlIDogb2Zmc2V0LmN1cnJlbnR9cHhgLFxuICAgICAgICAgICAgJy0taW5pdGlhbC1oZWlnaHQnOiBleHBhbmRCeURlZmF1bHQgPyAnYXV0bycgOiBgJHtpbml0aWFsSGVpZ2h0fXB4YCxcbiAgICAgICAgICAgIC4uLnN0eWxlLFxuICAgICAgICAgICAgLi4udG9hc3Quc3R5bGVcbiAgICAgICAgfSxcbiAgICAgICAgb25EcmFnRW5kOiAoKT0+e1xuICAgICAgICAgICAgc2V0U3dpcGluZyhmYWxzZSk7XG4gICAgICAgICAgICBzZXRTd2lwZURpcmVjdGlvbihudWxsKTtcbiAgICAgICAgICAgIHBvaW50ZXJTdGFydFJlZi5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgICAgb25Qb2ludGVyRG93bjogKGV2ZW50KT0+e1xuICAgICAgICAgICAgaWYgKGV2ZW50LmJ1dHRvbiA9PT0gMikgcmV0dXJuOyAvLyBSZXR1cm4gZWFybHkgb24gcmlnaHQgY2xpY2tcbiAgICAgICAgICAgIGlmIChkaXNhYmxlZCB8fCAhZGlzbWlzc2libGUpIHJldHVybjtcbiAgICAgICAgICAgIGRyYWdTdGFydFRpbWUuY3VycmVudCA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICBzZXRPZmZzZXRCZWZvcmVSZW1vdmUob2Zmc2V0LmN1cnJlbnQpO1xuICAgICAgICAgICAgLy8gRW5zdXJlIHdlIG1haW50YWluIGNvcnJlY3QgcG9pbnRlciBjYXB0dXJlIGV2ZW4gd2hlbiBnb2luZyBvdXRzaWRlIG9mIHRoZSB0b2FzdCAoZS5nLiB3aGVuIHN3aXBpbmcpXG4gICAgICAgICAgICBldmVudC50YXJnZXQuc2V0UG9pbnRlckNhcHR1cmUoZXZlbnQucG9pbnRlcklkKTtcbiAgICAgICAgICAgIGlmIChldmVudC50YXJnZXQudGFnTmFtZSA9PT0gJ0JVVFRPTicpIHJldHVybjtcbiAgICAgICAgICAgIHNldFN3aXBpbmcodHJ1ZSk7XG4gICAgICAgICAgICBwb2ludGVyU3RhcnRSZWYuY3VycmVudCA9IHtcbiAgICAgICAgICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgICAgIHk6IGV2ZW50LmNsaWVudFlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9uUG9pbnRlclVwOiAoKT0+e1xuICAgICAgICAgICAgdmFyIF90b2FzdFJlZl9jdXJyZW50LCBfdG9hc3RSZWZfY3VycmVudDEsIF9kcmFnU3RhcnRUaW1lX2N1cnJlbnQ7XG4gICAgICAgICAgICBpZiAoc3dpcGVPdXQgfHwgIWRpc21pc3NpYmxlKSByZXR1cm47XG4gICAgICAgICAgICBwb2ludGVyU3RhcnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICBjb25zdCBzd2lwZUFtb3VudFggPSBOdW1iZXIoKChfdG9hc3RSZWZfY3VycmVudCA9IHRvYXN0UmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RSZWZfY3VycmVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXN3aXBlLWFtb3VudC14JykucmVwbGFjZSgncHgnLCAnJykpIHx8IDApO1xuICAgICAgICAgICAgY29uc3Qgc3dpcGVBbW91bnRZID0gTnVtYmVyKCgoX3RvYXN0UmVmX2N1cnJlbnQxID0gdG9hc3RSZWYuY3VycmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2FzdFJlZl9jdXJyZW50MS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLXN3aXBlLWFtb3VudC15JykucmVwbGFjZSgncHgnLCAnJykpIHx8IDApO1xuICAgICAgICAgICAgY29uc3QgdGltZVRha2VuID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgLSAoKF9kcmFnU3RhcnRUaW1lX2N1cnJlbnQgPSBkcmFnU3RhcnRUaW1lLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfZHJhZ1N0YXJ0VGltZV9jdXJyZW50LmdldFRpbWUoKSk7XG4gICAgICAgICAgICBjb25zdCBzd2lwZUFtb3VudCA9IHN3aXBlRGlyZWN0aW9uID09PSAneCcgPyBzd2lwZUFtb3VudFggOiBzd2lwZUFtb3VudFk7XG4gICAgICAgICAgICBjb25zdCB2ZWxvY2l0eSA9IE1hdGguYWJzKHN3aXBlQW1vdW50KSAvIHRpbWVUYWtlbjtcbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhzd2lwZUFtb3VudCkgPj0gU1dJUEVfVEhSRVNIT0xEIHx8IHZlbG9jaXR5ID4gMC4xMSkge1xuICAgICAgICAgICAgICAgIHNldE9mZnNldEJlZm9yZVJlbW92ZShvZmZzZXQuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgdG9hc3Qub25EaXNtaXNzID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdC5vbkRpc21pc3MuY2FsbCh0b2FzdCwgdG9hc3QpO1xuICAgICAgICAgICAgICAgIGlmIChzd2lwZURpcmVjdGlvbiA9PT0gJ3gnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldFN3aXBlT3V0RGlyZWN0aW9uKHN3aXBlQW1vdW50WCA+IDAgPyAncmlnaHQnIDogJ2xlZnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzZXRTd2lwZU91dERpcmVjdGlvbihzd2lwZUFtb3VudFkgPiAwID8gJ2Rvd24nIDogJ3VwJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZVRvYXN0KCk7XG4gICAgICAgICAgICAgICAgc2V0U3dpcGVPdXQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgX3RvYXN0UmVmX2N1cnJlbnQyLCBfdG9hc3RSZWZfY3VycmVudDM7XG4gICAgICAgICAgICAgICAgKF90b2FzdFJlZl9jdXJyZW50MiA9IHRvYXN0UmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RSZWZfY3VycmVudDIuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3dpcGUtYW1vdW50LXgnLCBgMHB4YCk7XG4gICAgICAgICAgICAgICAgKF90b2FzdFJlZl9jdXJyZW50MyA9IHRvYXN0UmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RSZWZfY3VycmVudDMuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3dpcGUtYW1vdW50LXknLCBgMHB4YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRJc1N3aXBlZChmYWxzZSk7XG4gICAgICAgICAgICBzZXRTd2lwaW5nKGZhbHNlKTtcbiAgICAgICAgICAgIHNldFN3aXBlRGlyZWN0aW9uKG51bGwpO1xuICAgICAgICB9LFxuICAgICAgICBvblBvaW50ZXJNb3ZlOiAoZXZlbnQpPT57XG4gICAgICAgICAgICB2YXIgX3dpbmRvd19nZXRTZWxlY3Rpb24sIC8vIEFwcGx5IHRyYW5zZm9ybSB1c2luZyBib3RoIHggYW5kIHkgdmFsdWVzXG4gICAgICAgICAgICBfdG9hc3RSZWZfY3VycmVudCwgX3RvYXN0UmVmX2N1cnJlbnQxO1xuICAgICAgICAgICAgaWYgKCFwb2ludGVyU3RhcnRSZWYuY3VycmVudCB8fCAhZGlzbWlzc2libGUpIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IGlzSGlnaGxpZ2h0ZWQgPSAoKF93aW5kb3dfZ2V0U2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpKSA9PSBudWxsID8gdm9pZCAwIDogX3dpbmRvd19nZXRTZWxlY3Rpb24udG9TdHJpbmcoKS5sZW5ndGgpID4gMDtcbiAgICAgICAgICAgIGlmIChpc0hpZ2hsaWdodGVkKSByZXR1cm47XG4gICAgICAgICAgICBjb25zdCB5RGVsdGEgPSBldmVudC5jbGllbnRZIC0gcG9pbnRlclN0YXJ0UmVmLmN1cnJlbnQueTtcbiAgICAgICAgICAgIGNvbnN0IHhEZWx0YSA9IGV2ZW50LmNsaWVudFggLSBwb2ludGVyU3RhcnRSZWYuY3VycmVudC54O1xuICAgICAgICAgICAgdmFyIF9wcm9wc19zd2lwZURpcmVjdGlvbnM7XG4gICAgICAgICAgICBjb25zdCBzd2lwZURpcmVjdGlvbnMgPSAoX3Byb3BzX3N3aXBlRGlyZWN0aW9ucyA9IHByb3BzLnN3aXBlRGlyZWN0aW9ucykgIT0gbnVsbCA/IF9wcm9wc19zd2lwZURpcmVjdGlvbnMgOiBnZXREZWZhdWx0U3dpcGVEaXJlY3Rpb25zKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIC8vIERldGVybWluZSBzd2lwZSBkaXJlY3Rpb24gaWYgbm90IGFscmVhZHkgbG9ja2VkXG4gICAgICAgICAgICBpZiAoIXN3aXBlRGlyZWN0aW9uICYmIChNYXRoLmFicyh4RGVsdGEpID4gMSB8fCBNYXRoLmFicyh5RGVsdGEpID4gMSkpIHtcbiAgICAgICAgICAgICAgICBzZXRTd2lwZURpcmVjdGlvbihNYXRoLmFicyh4RGVsdGEpID4gTWF0aC5hYnMoeURlbHRhKSA/ICd4JyA6ICd5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgc3dpcGVBbW91bnQgPSB7XG4gICAgICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgICAgICB5OiAwXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgZ2V0RGFtcGVuaW5nID0gKGRlbHRhKT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IGZhY3RvciA9IE1hdGguYWJzKGRlbHRhKSAvIDIwO1xuICAgICAgICAgICAgICAgIHJldHVybiAxIC8gKDEuNSArIGZhY3Rvcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgLy8gT25seSBhcHBseSBzd2lwZSBpbiB0aGUgbG9ja2VkIGRpcmVjdGlvblxuICAgICAgICAgICAgaWYgKHN3aXBlRGlyZWN0aW9uID09PSAneScpIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgdmVydGljYWwgc3dpcGVzXG4gICAgICAgICAgICAgICAgaWYgKHN3aXBlRGlyZWN0aW9ucy5pbmNsdWRlcygndG9wJykgfHwgc3dpcGVEaXJlY3Rpb25zLmluY2x1ZGVzKCdib3R0b20nKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3dpcGVEaXJlY3Rpb25zLmluY2x1ZGVzKCd0b3AnKSAmJiB5RGVsdGEgPCAwIHx8IHN3aXBlRGlyZWN0aW9ucy5pbmNsdWRlcygnYm90dG9tJykgJiYgeURlbHRhID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpcGVBbW91bnQueSA9IHlEZWx0YTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNtb290aGx5IHRyYW5zaXRpb24gdG8gZGFtcGVuZWQgbW92ZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhbXBlbmVkRGVsdGEgPSB5RGVsdGEgKiBnZXREYW1wZW5pbmcoeURlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB3ZSBkb24ndCBqdW1wIHdoZW4gdHJhbnNpdGlvbmluZyB0byBkYW1wZW5lZCBtb3ZlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpcGVBbW91bnQueSA9IE1hdGguYWJzKGRhbXBlbmVkRGVsdGEpIDwgTWF0aC5hYnMoeURlbHRhKSA/IGRhbXBlbmVkRGVsdGEgOiB5RGVsdGE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN3aXBlRGlyZWN0aW9uID09PSAneCcpIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgaG9yaXpvbnRhbCBzd2lwZXNcbiAgICAgICAgICAgICAgICBpZiAoc3dpcGVEaXJlY3Rpb25zLmluY2x1ZGVzKCdsZWZ0JykgfHwgc3dpcGVEaXJlY3Rpb25zLmluY2x1ZGVzKCdyaWdodCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzd2lwZURpcmVjdGlvbnMuaW5jbHVkZXMoJ2xlZnQnKSAmJiB4RGVsdGEgPCAwIHx8IHN3aXBlRGlyZWN0aW9ucy5pbmNsdWRlcygncmlnaHQnKSAmJiB4RGVsdGEgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2lwZUFtb3VudC54ID0geERlbHRhO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU21vb3RobHkgdHJhbnNpdGlvbiB0byBkYW1wZW5lZCBtb3ZlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGFtcGVuZWREZWx0YSA9IHhEZWx0YSAqIGdldERhbXBlbmluZyh4RGVsdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5zdXJlIHdlIGRvbid0IGp1bXAgd2hlbiB0cmFuc2l0aW9uaW5nIHRvIGRhbXBlbmVkIG1vdmVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2lwZUFtb3VudC54ID0gTWF0aC5hYnMoZGFtcGVuZWREZWx0YSkgPCBNYXRoLmFicyh4RGVsdGEpID8gZGFtcGVuZWREZWx0YSA6IHhEZWx0YTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhzd2lwZUFtb3VudC54KSA+IDAgfHwgTWF0aC5hYnMoc3dpcGVBbW91bnQueSkgPiAwKSB7XG4gICAgICAgICAgICAgICAgc2V0SXNTd2lwZWQodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAoX3RvYXN0UmVmX2N1cnJlbnQgPSB0b2FzdFJlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX3RvYXN0UmVmX2N1cnJlbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tc3dpcGUtYW1vdW50LXgnLCBgJHtzd2lwZUFtb3VudC54fXB4YCk7XG4gICAgICAgICAgICAoX3RvYXN0UmVmX2N1cnJlbnQxID0gdG9hc3RSZWYuY3VycmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2FzdFJlZl9jdXJyZW50MS5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1zd2lwZS1hbW91bnQteScsIGAke3N3aXBlQW1vdW50Lnl9cHhgKTtcbiAgICAgICAgfVxuICAgIH0sIGNsb3NlQnV0dG9uICYmICF0b2FzdC5qc3ggJiYgdG9hc3RUeXBlICE9PSAnbG9hZGluZycgPyAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICBcImFyaWEtbGFiZWxcIjogY2xvc2VCdXR0b25BcmlhTGFiZWwsXG4gICAgICAgIFwiZGF0YS1kaXNhYmxlZFwiOiBkaXNhYmxlZCxcbiAgICAgICAgXCJkYXRhLWNsb3NlLWJ1dHRvblwiOiB0cnVlLFxuICAgICAgICBvbkNsaWNrOiBkaXNhYmxlZCB8fCAhZGlzbWlzc2libGUgPyAoKT0+e30gOiAoKT0+e1xuICAgICAgICAgICAgZGVsZXRlVG9hc3QoKTtcbiAgICAgICAgICAgIHRvYXN0Lm9uRGlzbWlzcyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3Qub25EaXNtaXNzLmNhbGwodG9hc3QsIHRvYXN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbihjbGFzc05hbWVzID09IG51bGwgPyB2b2lkIDAgOiBjbGFzc05hbWVzLmNsb3NlQnV0dG9uLCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzMiA9IHRvYXN0LmNsYXNzTmFtZXMpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RfY2xhc3NOYW1lczIuY2xvc2VCdXR0b24pXG4gICAgfSwgKF9pY29uc19jbG9zZSA9IGljb25zID09IG51bGwgPyB2b2lkIDAgOiBpY29ucy5jbG9zZSkgIT0gbnVsbCA/IF9pY29uc19jbG9zZSA6IENsb3NlSWNvbikgOiBudWxsLCAodG9hc3RUeXBlIHx8IHRvYXN0Lmljb24gfHwgdG9hc3QucHJvbWlzZSkgJiYgdG9hc3QuaWNvbiAhPT0gbnVsbCAmJiAoKGljb25zID09IG51bGwgPyB2b2lkIDAgOiBpY29uc1t0b2FzdFR5cGVdKSAhPT0gbnVsbCB8fCB0b2FzdC5pY29uKSA/IC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS1pY29uXCI6IFwiXCIsXG4gICAgICAgIGNsYXNzTmFtZTogY24oY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lcy5pY29uLCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzMyA9IHRvYXN0LmNsYXNzTmFtZXMpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RfY2xhc3NOYW1lczMuaWNvbilcbiAgICB9LCB0b2FzdC5wcm9taXNlIHx8IHRvYXN0LnR5cGUgPT09ICdsb2FkaW5nJyAmJiAhdG9hc3QuaWNvbiA/IHRvYXN0Lmljb24gfHwgZ2V0TG9hZGluZ0ljb24oKSA6IG51bGwsIHRvYXN0LnR5cGUgIT09ICdsb2FkaW5nJyA/IGljb24gOiBudWxsKSA6IG51bGwsIC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIFwiZGF0YS1jb250ZW50XCI6IFwiXCIsXG4gICAgICAgIGNsYXNzTmFtZTogY24oY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lcy5jb250ZW50LCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzNCA9IHRvYXN0LmNsYXNzTmFtZXMpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RfY2xhc3NOYW1lczQuY29udGVudClcbiAgICB9LCAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtdGl0bGVcIjogXCJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBjbihjbGFzc05hbWVzID09IG51bGwgPyB2b2lkIDAgOiBjbGFzc05hbWVzLnRpdGxlLCB0b2FzdCA9PSBudWxsID8gdm9pZCAwIDogKF90b2FzdF9jbGFzc05hbWVzNSA9IHRvYXN0LmNsYXNzTmFtZXMpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RfY2xhc3NOYW1lczUudGl0bGUpXG4gICAgfSwgdG9hc3QuanN4ID8gdG9hc3QuanN4IDogdHlwZW9mIHRvYXN0LnRpdGxlID09PSAnZnVuY3Rpb24nID8gdG9hc3QudGl0bGUoKSA6IHRvYXN0LnRpdGxlKSwgdG9hc3QuZGVzY3JpcHRpb24gPyAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBcImRhdGEtZGVzY3JpcHRpb25cIjogXCJcIixcbiAgICAgICAgY2xhc3NOYW1lOiBjbihkZXNjcmlwdGlvbkNsYXNzTmFtZSwgdG9hc3REZXNjcmlwdGlvbkNsYXNzbmFtZSwgY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lcy5kZXNjcmlwdGlvbiwgdG9hc3QgPT0gbnVsbCA/IHZvaWQgMCA6IChfdG9hc3RfY2xhc3NOYW1lczYgPSB0b2FzdC5jbGFzc05hbWVzKSA9PSBudWxsID8gdm9pZCAwIDogX3RvYXN0X2NsYXNzTmFtZXM2LmRlc2NyaXB0aW9uKVxuICAgIH0sIHR5cGVvZiB0b2FzdC5kZXNjcmlwdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHRvYXN0LmRlc2NyaXB0aW9uKCkgOiB0b2FzdC5kZXNjcmlwdGlvbikgOiBudWxsKSwgLyojX19QVVJFX18qLyBSZWFjdC5pc1ZhbGlkRWxlbWVudCh0b2FzdC5jYW5jZWwpID8gdG9hc3QuY2FuY2VsIDogdG9hc3QuY2FuY2VsICYmIGlzQWN0aW9uKHRvYXN0LmNhbmNlbCkgPyAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICBcImRhdGEtYnV0dG9uXCI6IHRydWUsXG4gICAgICAgIFwiZGF0YS1jYW5jZWxcIjogdHJ1ZSxcbiAgICAgICAgc3R5bGU6IHRvYXN0LmNhbmNlbEJ1dHRvblN0eWxlIHx8IGNhbmNlbEJ1dHRvblN0eWxlLFxuICAgICAgICBvbkNsaWNrOiAoZXZlbnQpPT57XG4gICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIHR3aWNlIGJlY2F1c2UgdHlwZXNjcmlwdFxuICAgICAgICAgICAgaWYgKCFpc0FjdGlvbih0b2FzdC5jYW5jZWwpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoIWRpc21pc3NpYmxlKSByZXR1cm47XG4gICAgICAgICAgICB0b2FzdC5jYW5jZWwub25DbGljayA9PSBudWxsID8gdm9pZCAwIDogdG9hc3QuY2FuY2VsLm9uQ2xpY2suY2FsbCh0b2FzdC5jYW5jZWwsIGV2ZW50KTtcbiAgICAgICAgICAgIGRlbGV0ZVRvYXN0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzTmFtZTogY24oY2xhc3NOYW1lcyA9PSBudWxsID8gdm9pZCAwIDogY2xhc3NOYW1lcy5jYW5jZWxCdXR0b24sIHRvYXN0ID09IG51bGwgPyB2b2lkIDAgOiAoX3RvYXN0X2NsYXNzTmFtZXM3ID0gdG9hc3QuY2xhc3NOYW1lcykgPT0gbnVsbCA/IHZvaWQgMCA6IF90b2FzdF9jbGFzc05hbWVzNy5jYW5jZWxCdXR0b24pXG4gICAgfSwgdG9hc3QuY2FuY2VsLmxhYmVsKSA6IG51bGwsIC8qI19fUFVSRV9fKi8gUmVhY3QuaXNWYWxpZEVsZW1lbnQodG9hc3QuYWN0aW9uKSA/IHRvYXN0LmFjdGlvbiA6IHRvYXN0LmFjdGlvbiAmJiBpc0FjdGlvbih0b2FzdC5hY3Rpb24pID8gLyojX19QVVJFX18qLyBSZWFjdC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIsIHtcbiAgICAgICAgXCJkYXRhLWJ1dHRvblwiOiB0cnVlLFxuICAgICAgICBcImRhdGEtYWN0aW9uXCI6IHRydWUsXG4gICAgICAgIHN0eWxlOiB0b2FzdC5hY3Rpb25CdXR0b25TdHlsZSB8fCBhY3Rpb25CdXR0b25TdHlsZSxcbiAgICAgICAgb25DbGljazogKGV2ZW50KT0+e1xuICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB0d2ljZSBiZWNhdXNlIHR5cGVzY3JpcHRcbiAgICAgICAgICAgIGlmICghaXNBY3Rpb24odG9hc3QuYWN0aW9uKSkgcmV0dXJuO1xuICAgICAgICAgICAgdG9hc3QuYWN0aW9uLm9uQ2xpY2sgPT0gbnVsbCA/IHZvaWQgMCA6IHRvYXN0LmFjdGlvbi5vbkNsaWNrLmNhbGwodG9hc3QuYWN0aW9uLCBldmVudCk7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgcmV0dXJuO1xuICAgICAgICAgICAgZGVsZXRlVG9hc3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xhc3NOYW1lOiBjbihjbGFzc05hbWVzID09IG51bGwgPyB2b2lkIDAgOiBjbGFzc05hbWVzLmFjdGlvbkJ1dHRvbiwgdG9hc3QgPT0gbnVsbCA/IHZvaWQgMCA6IChfdG9hc3RfY2xhc3NOYW1lczggPSB0b2FzdC5jbGFzc05hbWVzKSA9PSBudWxsID8gdm9pZCAwIDogX3RvYXN0X2NsYXNzTmFtZXM4LmFjdGlvbkJ1dHRvbilcbiAgICB9LCB0b2FzdC5hY3Rpb24ubGFiZWwpIDogbnVsbCk7XG59O1xuZnVuY3Rpb24gZ2V0RG9jdW1lbnREaXJlY3Rpb24oKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gJ2x0cic7XG4gICAgaWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybiAnbHRyJzsgLy8gRm9yIEZyZXNoIHB1cnBvc2VcbiAgICBjb25zdCBkaXJBdHRyaWJ1dGUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKTtcbiAgICBpZiAoZGlyQXR0cmlidXRlID09PSAnYXV0bycgfHwgIWRpckF0dHJpYnV0ZSkge1xuICAgICAgICByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5kaXJlY3Rpb247XG4gICAgfVxuICAgIHJldHVybiBkaXJBdHRyaWJ1dGU7XG59XG5mdW5jdGlvbiBhc3NpZ25PZmZzZXQoZGVmYXVsdE9mZnNldCwgbW9iaWxlT2Zmc2V0KSB7XG4gICAgY29uc3Qgc3R5bGVzID0ge307XG4gICAgW1xuICAgICAgICBkZWZhdWx0T2Zmc2V0LFxuICAgICAgICBtb2JpbGVPZmZzZXRcbiAgICBdLmZvckVhY2goKG9mZnNldCwgaW5kZXgpPT57XG4gICAgICAgIGNvbnN0IGlzTW9iaWxlID0gaW5kZXggPT09IDE7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGlzTW9iaWxlID8gJy0tbW9iaWxlLW9mZnNldCcgOiAnLS1vZmZzZXQnO1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBpc01vYmlsZSA/IE1PQklMRV9WSUVXUE9SVF9PRkZTRVQgOiBWSUVXUE9SVF9PRkZTRVQ7XG4gICAgICAgIGZ1bmN0aW9uIGFzc2lnbkFsbChvZmZzZXQpIHtcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAndG9wJyxcbiAgICAgICAgICAgICAgICAncmlnaHQnLFxuICAgICAgICAgICAgICAgICdib3R0b20nLFxuICAgICAgICAgICAgICAgICdsZWZ0J1xuICAgICAgICAgICAgXS5mb3JFYWNoKChrZXkpPT57XG4gICAgICAgICAgICAgICAgc3R5bGVzW2Ake3ByZWZpeH0tJHtrZXl9YF0gPSB0eXBlb2Ygb2Zmc2V0ID09PSAnbnVtYmVyJyA/IGAke29mZnNldH1weGAgOiBvZmZzZXQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIG9mZnNldCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGFzc2lnbkFsbChvZmZzZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBvZmZzZXQgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgJ3RvcCcsXG4gICAgICAgICAgICAgICAgJ3JpZ2h0JyxcbiAgICAgICAgICAgICAgICAnYm90dG9tJyxcbiAgICAgICAgICAgICAgICAnbGVmdCdcbiAgICAgICAgICAgIF0uZm9yRWFjaCgoa2V5KT0+e1xuICAgICAgICAgICAgICAgIGlmIChvZmZzZXRba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlc1tgJHtwcmVmaXh9LSR7a2V5fWBdID0gZGVmYXVsdFZhbHVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlc1tgJHtwcmVmaXh9LSR7a2V5fWBdID0gdHlwZW9mIG9mZnNldFtrZXldID09PSAnbnVtYmVyJyA/IGAke29mZnNldFtrZXldfXB4YCA6IG9mZnNldFtrZXldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzaWduQWxsKGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gc3R5bGVzO1xufVxuZnVuY3Rpb24gdXNlU29ubmVyKCkge1xuICAgIGNvbnN0IFthY3RpdmVUb2FzdHMsIHNldEFjdGl2ZVRvYXN0c10gPSBSZWFjdC51c2VTdGF0ZShbXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIHJldHVybiBUb2FzdFN0YXRlLnN1YnNjcmliZSgodG9hc3QpPT57XG4gICAgICAgICAgICBpZiAodG9hc3QuZGlzbWlzcykge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAgICAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpPT57XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBY3RpdmVUb2FzdHMoKHRvYXN0cyk9PnRvYXN0cy5maWx0ZXIoKHQpPT50LmlkICE9PSB0b2FzdC5pZCkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQcmV2ZW50IGJhdGNoaW5nLCB0ZW1wIHNvbHV0aW9uLlxuICAgICAgICAgICAgc2V0VGltZW91dCgoKT0+e1xuICAgICAgICAgICAgICAgIFJlYWN0RE9NLmZsdXNoU3luYygoKT0+e1xuICAgICAgICAgICAgICAgICAgICBzZXRBY3RpdmVUb2FzdHMoKHRvYXN0cyk9PntcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4T2ZFeGlzdGluZ1RvYXN0ID0gdG9hc3RzLmZpbmRJbmRleCgodCk9PnQuaWQgPT09IHRvYXN0LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdG9hc3QgaWYgaXQgYWxyZWFkeSBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleE9mRXhpc3RpbmdUb2FzdCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdHMuc2xpY2UoMCwgaW5kZXhPZkV4aXN0aW5nVG9hc3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdHNbaW5kZXhPZkV4aXN0aW5nVG9hc3RdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udG9hc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udG9hc3RzLnNsaWNlKGluZGV4T2ZFeGlzdGluZ1RvYXN0ICsgMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2FzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sIFtdKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0b2FzdHM6IGFjdGl2ZVRvYXN0c1xuICAgIH07XG59XG5jb25zdCBUb2FzdGVyID0gLyojX19QVVJFX18qLyBSZWFjdC5mb3J3YXJkUmVmKGZ1bmN0aW9uIFRvYXN0ZXIocHJvcHMsIHJlZikge1xuICAgIGNvbnN0IHsgaWQsIGludmVydCwgcG9zaXRpb24gPSAnYm90dG9tLXJpZ2h0JywgaG90a2V5ID0gW1xuICAgICAgICAnYWx0S2V5JyxcbiAgICAgICAgJ0tleVQnXG4gICAgXSwgZXhwYW5kLCBjbG9zZUJ1dHRvbiwgY2xhc3NOYW1lLCBvZmZzZXQsIG1vYmlsZU9mZnNldCwgdGhlbWUgPSAnbGlnaHQnLCByaWNoQ29sb3JzLCBkdXJhdGlvbiwgc3R5bGUsIHZpc2libGVUb2FzdHMgPSBWSVNJQkxFX1RPQVNUU19BTU9VTlQsIHRvYXN0T3B0aW9ucywgZGlyID0gZ2V0RG9jdW1lbnREaXJlY3Rpb24oKSwgZ2FwID0gR0FQLCBpY29ucywgY29udGFpbmVyQXJpYUxhYmVsID0gJ05vdGlmaWNhdGlvbnMnIH0gPSBwcm9wcztcbiAgICBjb25zdCBbdG9hc3RzLCBzZXRUb2FzdHNdID0gUmVhY3QudXNlU3RhdGUoW10pO1xuICAgIGNvbnN0IGZpbHRlcmVkVG9hc3RzID0gUmVhY3QudXNlTWVtbygoKT0+e1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0b2FzdHMuZmlsdGVyKCh0b2FzdCk9PnRvYXN0LnRvYXN0ZXJJZCA9PT0gaWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b2FzdHMuZmlsdGVyKCh0b2FzdCk9PiF0b2FzdC50b2FzdGVySWQpO1xuICAgIH0sIFtcbiAgICAgICAgdG9hc3RzLFxuICAgICAgICBpZFxuICAgIF0pO1xuICAgIGNvbnN0IHBvc3NpYmxlUG9zaXRpb25zID0gUmVhY3QudXNlTWVtbygoKT0+e1xuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KFtcbiAgICAgICAgICAgIHBvc2l0aW9uXG4gICAgICAgIF0uY29uY2F0KGZpbHRlcmVkVG9hc3RzLmZpbHRlcigodG9hc3QpPT50b2FzdC5wb3NpdGlvbikubWFwKCh0b2FzdCk9PnRvYXN0LnBvc2l0aW9uKSkpKTtcbiAgICB9LCBbXG4gICAgICAgIGZpbHRlcmVkVG9hc3RzLFxuICAgICAgICBwb3NpdGlvblxuICAgIF0pO1xuICAgIGNvbnN0IFtoZWlnaHRzLCBzZXRIZWlnaHRzXSA9IFJlYWN0LnVzZVN0YXRlKFtdKTtcbiAgICBjb25zdCBbZXhwYW5kZWQsIHNldEV4cGFuZGVkXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbaW50ZXJhY3RpbmcsIHNldEludGVyYWN0aW5nXSA9IFJlYWN0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbYWN0dWFsVGhlbWUsIHNldEFjdHVhbFRoZW1lXSA9IFJlYWN0LnVzZVN0YXRlKHRoZW1lICE9PSAnc3lzdGVtJyA/IHRoZW1lIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMgPyAnZGFyaycgOiAnbGlnaHQnIDogJ2xpZ2h0Jyk7XG4gICAgY29uc3QgbGlzdFJlZiA9IFJlYWN0LnVzZVJlZihudWxsKTtcbiAgICBjb25zdCBob3RrZXlMYWJlbCA9IGhvdGtleS5qb2luKCcrJykucmVwbGFjZSgvS2V5L2csICcnKS5yZXBsYWNlKC9EaWdpdC9nLCAnJyk7XG4gICAgY29uc3QgbGFzdEZvY3VzZWRFbGVtZW50UmVmID0gUmVhY3QudXNlUmVmKG51bGwpO1xuICAgIGNvbnN0IGlzRm9jdXNXaXRoaW5SZWYgPSBSZWFjdC51c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IHJlbW92ZVRvYXN0ID0gUmVhY3QudXNlQ2FsbGJhY2soKHRvYXN0VG9SZW1vdmUpPT57XG4gICAgICAgIHNldFRvYXN0cygodG9hc3RzKT0+e1xuICAgICAgICAgICAgdmFyIF90b2FzdHNfZmluZDtcbiAgICAgICAgICAgIGlmICghKChfdG9hc3RzX2ZpbmQgPSB0b2FzdHMuZmluZCgodG9hc3QpPT50b2FzdC5pZCA9PT0gdG9hc3RUb1JlbW92ZS5pZCkpID09IG51bGwgPyB2b2lkIDAgOiBfdG9hc3RzX2ZpbmQuZGVsZXRlKSkge1xuICAgICAgICAgICAgICAgIFRvYXN0U3RhdGUuZGlzbWlzcyh0b2FzdFRvUmVtb3ZlLmlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0b2FzdHMuZmlsdGVyKCh7IGlkIH0pPT5pZCAhPT0gdG9hc3RUb1JlbW92ZS5pZCk7XG4gICAgICAgIH0pO1xuICAgIH0sIFtdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCk9PntcbiAgICAgICAgcmV0dXJuIFRvYXN0U3RhdGUuc3Vic2NyaWJlKCh0b2FzdCk9PntcbiAgICAgICAgICAgIGlmICh0b2FzdC5kaXNtaXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJldmVudCBiYXRjaGluZyBvZiBvdGhlciBzdGF0ZSB1cGRhdGVzXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIHNldFRvYXN0cygodG9hc3RzKT0+dG9hc3RzLm1hcCgodCk9PnQuaWQgPT09IHRvYXN0LmlkID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IDogdCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFByZXZlbnQgYmF0Y2hpbmcsIHRlbXAgc29sdXRpb24uXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgICAgICAgICAgUmVhY3RET00uZmx1c2hTeW5jKCgpPT57XG4gICAgICAgICAgICAgICAgICAgIHNldFRvYXN0cygodG9hc3RzKT0+e1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhPZkV4aXN0aW5nVG9hc3QgPSB0b2FzdHMuZmluZEluZGV4KCh0KT0+dC5pZCA9PT0gdG9hc3QuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0b2FzdCBpZiBpdCBhbHJlYWR5IGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4T2ZFeGlzdGluZ1RvYXN0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0cy5zbGljZSgwLCBpbmRleE9mRXhpc3RpbmdUb2FzdCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0c1tpbmRleE9mRXhpc3RpbmdUb2FzdF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50b2FzdHMuc2xpY2UoaW5kZXhPZkV4aXN0aW5nVG9hc3QgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRvYXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSwgW1xuICAgICAgICB0b2FzdHNcbiAgICBdKTtcbiAgICBSZWFjdC51c2VFZmZlY3QoKCk9PntcbiAgICAgICAgaWYgKHRoZW1lICE9PSAnc3lzdGVtJykge1xuICAgICAgICAgICAgc2V0QWN0dWFsVGhlbWUodGhlbWUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGVtZSA9PT0gJ3N5c3RlbScpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGN1cnJlbnQgcHJlZmVyZW5jZSBpcyBkYXJrXG4gICAgICAgICAgICBpZiAod2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyayknKS5tYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gaXQncyBjdXJyZW50bHkgZGFya1xuICAgICAgICAgICAgICAgIHNldEFjdHVhbFRoZW1lKCdkYXJrJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGl0J3Mgbm90IGRhcmtcbiAgICAgICAgICAgICAgICBzZXRBY3R1YWxUaGVtZSgnbGlnaHQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICAgICAgY29uc3QgZGFya01lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gQ2hyb21lICYgRmlyZWZveFxuICAgICAgICAgICAgZGFya01lZGlhUXVlcnkuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKHsgbWF0Y2hlcyB9KT0+e1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEFjdHVhbFRoZW1lKCdkYXJrJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0QWN0dWFsVGhlbWUoJ2xpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBTYWZhcmkgPCAxNFxuICAgICAgICAgICAgZGFya01lZGlhUXVlcnkuYWRkTGlzdGVuZXIoKHsgbWF0Y2hlcyB9KT0+e1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRBY3R1YWxUaGVtZSgnZGFyaycpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0QWN0dWFsVGhlbWUoJ2xpZ2h0Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIHRoZW1lXG4gICAgXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIC8vIEVuc3VyZSBleHBhbmRlZCBpcyBhbHdheXMgZmFsc2Ugd2hlbiBubyB0b2FzdHMgYXJlIHByZXNlbnQgLyBvbmx5IG9uZSBsZWZ0XG4gICAgICAgIGlmICh0b2FzdHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIHNldEV4cGFuZGVkKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH0sIFtcbiAgICAgICAgdG9hc3RzXG4gICAgXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSAoZXZlbnQpPT57XG4gICAgICAgICAgICB2YXIgX2xpc3RSZWZfY3VycmVudDtcbiAgICAgICAgICAgIGNvbnN0IGlzSG90a2V5UHJlc3NlZCA9IGhvdGtleS5ldmVyeSgoa2V5KT0+ZXZlbnRba2V5XSB8fCBldmVudC5jb2RlID09PSBrZXkpO1xuICAgICAgICAgICAgaWYgKGlzSG90a2V5UHJlc3NlZCkge1xuICAgICAgICAgICAgICAgIHZhciBfbGlzdFJlZl9jdXJyZW50MTtcbiAgICAgICAgICAgICAgICBzZXRFeHBhbmRlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAoX2xpc3RSZWZfY3VycmVudDEgPSBsaXN0UmVmLmN1cnJlbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbGlzdFJlZl9jdXJyZW50MS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnICYmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBsaXN0UmVmLmN1cnJlbnQgfHwgKChfbGlzdFJlZl9jdXJyZW50ID0gbGlzdFJlZi5jdXJyZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2xpc3RSZWZfY3VycmVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkpKSB7XG4gICAgICAgICAgICAgICAgc2V0RXhwYW5kZWQoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIHJldHVybiAoKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIGhhbmRsZUtleURvd24pO1xuICAgIH0sIFtcbiAgICAgICAgaG90a2V5XG4gICAgXSk7XG4gICAgUmVhY3QudXNlRWZmZWN0KCgpPT57XG4gICAgICAgIGlmIChsaXN0UmVmLmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiAoKT0+e1xuICAgICAgICAgICAgICAgIGlmIChsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudC5mb2N1cyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50U2Nyb2xsOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIGlzRm9jdXNXaXRoaW5SZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LCBbXG4gICAgICAgIGxpc3RSZWYuY3VycmVudFxuICAgIF0pO1xuICAgIHJldHVybigvLyBSZW1vdmUgaXRlbSBmcm9tIG5vcm1hbCBuYXZpZ2F0aW9uIGZsb3csIG9ubHkgYXZhaWxhYmxlIHZpYSBob3RrZXlcbiAgICAvKiNfX1BVUkVfXyovIFJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzZWN0aW9uXCIsIHtcbiAgICAgICAgcmVmOiByZWYsXG4gICAgICAgIFwiYXJpYS1sYWJlbFwiOiBgJHtjb250YWluZXJBcmlhTGFiZWx9ICR7aG90a2V5TGFiZWx9YCxcbiAgICAgICAgdGFiSW5kZXg6IC0xLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcInBvbGl0ZVwiLFxuICAgICAgICBcImFyaWEtcmVsZXZhbnRcIjogXCJhZGRpdGlvbnMgdGV4dFwiLFxuICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwiZmFsc2VcIixcbiAgICAgICAgc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nOiB0cnVlXG4gICAgfSwgcG9zc2libGVQb3NpdGlvbnMubWFwKChwb3NpdGlvbiwgaW5kZXgpPT57XG4gICAgICAgIHZhciBfaGVpZ2h0c187XG4gICAgICAgIGNvbnN0IFt5LCB4XSA9IHBvc2l0aW9uLnNwbGl0KCctJyk7XG4gICAgICAgIGlmICghZmlsdGVyZWRUb2FzdHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChcIm9sXCIsIHtcbiAgICAgICAgICAgIGtleTogcG9zaXRpb24sXG4gICAgICAgICAgICBkaXI6IGRpciA9PT0gJ2F1dG8nID8gZ2V0RG9jdW1lbnREaXJlY3Rpb24oKSA6IGRpcixcbiAgICAgICAgICAgIHRhYkluZGV4OiAtMSxcbiAgICAgICAgICAgIHJlZjogbGlzdFJlZixcbiAgICAgICAgICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuICAgICAgICAgICAgXCJkYXRhLXNvbm5lci10b2FzdGVyXCI6IHRydWUsXG4gICAgICAgICAgICBcImRhdGEtc29ubmVyLXRoZW1lXCI6IGFjdHVhbFRoZW1lLFxuICAgICAgICAgICAgXCJkYXRhLXktcG9zaXRpb25cIjogeSxcbiAgICAgICAgICAgIFwiZGF0YS14LXBvc2l0aW9uXCI6IHgsXG4gICAgICAgICAgICBzdHlsZToge1xuICAgICAgICAgICAgICAgICctLWZyb250LXRvYXN0LWhlaWdodCc6IGAkeygoX2hlaWdodHNfID0gaGVpZ2h0c1swXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9oZWlnaHRzXy5oZWlnaHQpIHx8IDB9cHhgLFxuICAgICAgICAgICAgICAgICctLXdpZHRoJzogYCR7VE9BU1RfV0lEVEh9cHhgLFxuICAgICAgICAgICAgICAgICctLWdhcCc6IGAke2dhcH1weGAsXG4gICAgICAgICAgICAgICAgLi4uc3R5bGUsXG4gICAgICAgICAgICAgICAgLi4uYXNzaWduT2Zmc2V0KG9mZnNldCwgbW9iaWxlT2Zmc2V0KVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQmx1cjogKGV2ZW50KT0+e1xuICAgICAgICAgICAgICAgIGlmIChpc0ZvY3VzV2l0aGluUmVmLmN1cnJlbnQgJiYgIWV2ZW50LmN1cnJlbnRUYXJnZXQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNGb2N1c1dpdGhpblJlZi5jdXJyZW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZvY3VzZWRFbGVtZW50UmVmLmN1cnJlbnQuZm9jdXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnRTY3JvbGw6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZvY3VzZWRFbGVtZW50UmVmLmN1cnJlbnQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRm9jdXM6IChldmVudCk9PntcbiAgICAgICAgICAgICAgICBjb25zdCBpc05vdERpc21pc3NpYmxlID0gZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgZXZlbnQudGFyZ2V0LmRhdGFzZXQuZGlzbWlzc2libGUgPT09ICdmYWxzZSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzTm90RGlzbWlzc2libGUpIHJldHVybjtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRm9jdXNXaXRoaW5SZWYuY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpc0ZvY3VzV2l0aGluUmVmLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBsYXN0Rm9jdXNlZEVsZW1lbnRSZWYuY3VycmVudCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uTW91c2VFbnRlcjogKCk9PnNldEV4cGFuZGVkKHRydWUpLFxuICAgICAgICAgICAgb25Nb3VzZU1vdmU6ICgpPT5zZXRFeHBhbmRlZCh0cnVlKSxcbiAgICAgICAgICAgIG9uTW91c2VMZWF2ZTogKCk9PntcbiAgICAgICAgICAgICAgICAvLyBBdm9pZCBzZXR0aW5nIGV4cGFuZGVkIHRvIGZhbHNlIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCBhIHRvYXN0LCBlLmcuIHN3aXBpbmdcbiAgICAgICAgICAgICAgICBpZiAoIWludGVyYWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEV4cGFuZGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb25EcmFnRW5kOiAoKT0+c2V0RXhwYW5kZWQoZmFsc2UpLFxuICAgICAgICAgICAgb25Qb2ludGVyRG93bjogKGV2ZW50KT0+e1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzTm90RGlzbWlzc2libGUgPSBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBldmVudC50YXJnZXQuZGF0YXNldC5kaXNtaXNzaWJsZSA9PT0gJ2ZhbHNlJztcbiAgICAgICAgICAgICAgICBpZiAoaXNOb3REaXNtaXNzaWJsZSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIHNldEludGVyYWN0aW5nKHRydWUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uUG9pbnRlclVwOiAoKT0+c2V0SW50ZXJhY3RpbmcoZmFsc2UpXG4gICAgICAgIH0sIGZpbHRlcmVkVG9hc3RzLmZpbHRlcigodG9hc3QpPT4hdG9hc3QucG9zaXRpb24gJiYgaW5kZXggPT09IDAgfHwgdG9hc3QucG9zaXRpb24gPT09IHBvc2l0aW9uKS5tYXAoKHRvYXN0LCBpbmRleCk9PntcbiAgICAgICAgICAgIHZhciBfdG9hc3RPcHRpb25zX2R1cmF0aW9uLCBfdG9hc3RPcHRpb25zX2Nsb3NlQnV0dG9uO1xuICAgICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi8gUmVhY3QuY3JlYXRlRWxlbWVudChUb2FzdCwge1xuICAgICAgICAgICAgICAgIGtleTogdG9hc3QuaWQsXG4gICAgICAgICAgICAgICAgaWNvbnM6IGljb25zLFxuICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcbiAgICAgICAgICAgICAgICB0b2FzdDogdG9hc3QsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFJpY2hDb2xvcnM6IHJpY2hDb2xvcnMsXG4gICAgICAgICAgICAgICAgZHVyYXRpb246IChfdG9hc3RPcHRpb25zX2R1cmF0aW9uID0gdG9hc3RPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdE9wdGlvbnMuZHVyYXRpb24pICE9IG51bGwgPyBfdG9hc3RPcHRpb25zX2R1cmF0aW9uIDogZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lOiB0b2FzdE9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvYXN0T3B0aW9ucy5jbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb25DbGFzc05hbWU6IHRvYXN0T3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3RPcHRpb25zLmRlc2NyaXB0aW9uQ2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgIGludmVydDogaW52ZXJ0LFxuICAgICAgICAgICAgICAgIHZpc2libGVUb2FzdHM6IHZpc2libGVUb2FzdHMsXG4gICAgICAgICAgICAgICAgY2xvc2VCdXR0b246IChfdG9hc3RPcHRpb25zX2Nsb3NlQnV0dG9uID0gdG9hc3RPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdE9wdGlvbnMuY2xvc2VCdXR0b24pICE9IG51bGwgPyBfdG9hc3RPcHRpb25zX2Nsb3NlQnV0dG9uIDogY2xvc2VCdXR0b24sXG4gICAgICAgICAgICAgICAgaW50ZXJhY3Rpbmc6IGludGVyYWN0aW5nLFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3NpdGlvbixcbiAgICAgICAgICAgICAgICBzdHlsZTogdG9hc3RPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdE9wdGlvbnMuc3R5bGUsXG4gICAgICAgICAgICAgICAgdW5zdHlsZWQ6IHRvYXN0T3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3RPcHRpb25zLnVuc3R5bGVkLFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZXM6IHRvYXN0T3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3RPcHRpb25zLmNsYXNzTmFtZXMsXG4gICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uU3R5bGU6IHRvYXN0T3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogdG9hc3RPcHRpb25zLmNhbmNlbEJ1dHRvblN0eWxlLFxuICAgICAgICAgICAgICAgIGFjdGlvbkJ1dHRvblN0eWxlOiB0b2FzdE9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IHRvYXN0T3B0aW9ucy5hY3Rpb25CdXR0b25TdHlsZSxcbiAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbkFyaWFMYWJlbDogdG9hc3RPcHRpb25zID09IG51bGwgPyB2b2lkIDAgOiB0b2FzdE9wdGlvbnMuY2xvc2VCdXR0b25BcmlhTGFiZWwsXG4gICAgICAgICAgICAgICAgcmVtb3ZlVG9hc3Q6IHJlbW92ZVRvYXN0LFxuICAgICAgICAgICAgICAgIHRvYXN0czogZmlsdGVyZWRUb2FzdHMuZmlsdGVyKCh0KT0+dC5wb3NpdGlvbiA9PSB0b2FzdC5wb3NpdGlvbiksXG4gICAgICAgICAgICAgICAgaGVpZ2h0czogaGVpZ2h0cy5maWx0ZXIoKGgpPT5oLnBvc2l0aW9uID09IHRvYXN0LnBvc2l0aW9uKSxcbiAgICAgICAgICAgICAgICBzZXRIZWlnaHRzOiBzZXRIZWlnaHRzLFxuICAgICAgICAgICAgICAgIGV4cGFuZEJ5RGVmYXVsdDogZXhwYW5kLFxuICAgICAgICAgICAgICAgIGdhcDogZ2FwLFxuICAgICAgICAgICAgICAgIGV4cGFuZGVkOiBleHBhbmRlZCxcbiAgICAgICAgICAgICAgICBzd2lwZURpcmVjdGlvbnM6IHByb3BzLnN3aXBlRGlyZWN0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9KSkpO1xufSk7XG5cbmV4cG9ydCB7IFRvYXN0ZXIsIHRvYXN0LCB1c2VTb25uZXIgfTtcbiJdLCJuYW1lcyI6WyJfX2luc2VydENTUyIsImNvZGUiLCJkb2N1bWVudCIsImhlYWQiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInN0eWxlIiwiY3JlYXRlRWxlbWVudCIsInR5cGUiLCJhcHBlbmRDaGlsZCIsInN0eWxlU2hlZXQiLCJjc3NUZXh0IiwiY3JlYXRlVGV4dE5vZGUiLCJSZWFjdCIsIlJlYWN0RE9NIiwiZ2V0QXNzZXQiLCJTdWNjZXNzSWNvbiIsIkluZm9JY29uIiwiV2FybmluZ0ljb24iLCJFcnJvckljb24iLCJiYXJzIiwiQXJyYXkiLCJmaWxsIiwiTG9hZGVyIiwidmlzaWJsZSIsImNsYXNzTmFtZSIsImZpbHRlciIsIkJvb2xlYW4iLCJqb2luIiwibWFwIiwiXyIsImkiLCJrZXkiLCJ4bWxucyIsInZpZXdCb3giLCJoZWlnaHQiLCJ3aWR0aCIsImZpbGxSdWxlIiwiZCIsImNsaXBSdWxlIiwiQ2xvc2VJY29uIiwic3Ryb2tlIiwic3Ryb2tlV2lkdGgiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJ4MSIsInkxIiwieDIiLCJ5MiIsInVzZUlzRG9jdW1lbnRIaWRkZW4iLCJpc0RvY3VtZW50SGlkZGVuIiwic2V0SXNEb2N1bWVudEhpZGRlbiIsInVzZVN0YXRlIiwiaGlkZGVuIiwidXNlRWZmZWN0IiwiY2FsbGJhY2siLCJhZGRFdmVudExpc3RlbmVyIiwid2luZG93IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInRvYXN0c0NvdW50ZXIiLCJPYnNlcnZlciIsInN1YnNjcmliZSIsInN1YnNjcmliZXIiLCJzdWJzY3JpYmVycyIsInB1c2giLCJpbmRleCIsImluZGV4T2YiLCJzcGxpY2UiLCJwdWJsaXNoIiwiZGF0YSIsImZvckVhY2giLCJhZGRUb2FzdCIsInRvYXN0cyIsImNyZWF0ZSIsIl9kYXRhX2lkIiwibWVzc2FnZSIsInJlc3QiLCJpZCIsImxlbmd0aCIsImFscmVhZHlFeGlzdHMiLCJmaW5kIiwidG9hc3QiLCJkaXNtaXNzaWJsZSIsInVuZGVmaW5lZCIsImRpc21pc3NlZFRvYXN0cyIsImhhcyIsImRlbGV0ZSIsInRpdGxlIiwiZGlzbWlzcyIsImFkZCIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImVycm9yIiwic3VjY2VzcyIsImluZm8iLCJ3YXJuaW5nIiwibG9hZGluZyIsInByb21pc2UiLCJkZXNjcmlwdGlvbiIsInAiLCJQcm9taXNlIiwicmVzb2x2ZSIsIkZ1bmN0aW9uIiwic2hvdWxkRGlzbWlzcyIsInJlc3VsdCIsIm9yaWdpbmFsUHJvbWlzZSIsInRoZW4iLCJyZXNwb25zZSIsImlzUmVhY3RFbGVtZW50UmVzcG9uc2UiLCJpc1ZhbGlkRWxlbWVudCIsImlzSHR0cFJlc3BvbnNlIiwib2siLCJwcm9taXNlRGF0YSIsInN0YXR1cyIsImlzRXh0ZW5kZWRSZXN1bHQiLCJ0b2FzdFNldHRpbmdzIiwiRXJyb3IiLCJjYXRjaCIsImZpbmFsbHkiLCJjYWxsIiwidW53cmFwIiwicmVqZWN0IiwiT2JqZWN0IiwiYXNzaWduIiwiY3VzdG9tIiwianN4IiwiZ2V0QWN0aXZlVG9hc3RzIiwiU2V0IiwiVG9hc3RTdGF0ZSIsInRvYXN0RnVuY3Rpb24iLCJiYXNpY1RvYXN0IiwiZ2V0SGlzdG9yeSIsImdldFRvYXN0cyIsImlzQWN0aW9uIiwiYWN0aW9uIiwibGFiZWwiLCJWSVNJQkxFX1RPQVNUU19BTU9VTlQiLCJWSUVXUE9SVF9PRkZTRVQiLCJNT0JJTEVfVklFV1BPUlRfT0ZGU0VUIiwiVE9BU1RfTElGRVRJTUUiLCJUT0FTVF9XSURUSCIsIkdBUCIsIlNXSVBFX1RIUkVTSE9MRCIsIlRJTUVfQkVGT1JFX1VOTU9VTlQiLCJjbiIsImNsYXNzZXMiLCJnZXREZWZhdWx0U3dpcGVEaXJlY3Rpb25zIiwicG9zaXRpb24iLCJ5IiwieCIsInNwbGl0IiwiZGlyZWN0aW9ucyIsIlRvYXN0IiwicHJvcHMiLCJfdG9hc3RfY2xhc3NOYW1lcyIsIl90b2FzdF9jbGFzc05hbWVzMSIsIl90b2FzdF9jbGFzc05hbWVzMiIsIl90b2FzdF9jbGFzc05hbWVzMyIsIl90b2FzdF9jbGFzc05hbWVzNCIsIl90b2FzdF9jbGFzc05hbWVzNSIsIl90b2FzdF9jbGFzc05hbWVzNiIsIl90b2FzdF9jbGFzc05hbWVzNyIsIl90b2FzdF9jbGFzc05hbWVzOCIsImludmVydCIsIlRvYXN0ZXJJbnZlcnQiLCJ1bnN0eWxlZCIsImludGVyYWN0aW5nIiwic2V0SGVpZ2h0cyIsInZpc2libGVUb2FzdHMiLCJoZWlnaHRzIiwiZXhwYW5kZWQiLCJyZW1vdmVUb2FzdCIsImRlZmF1bHRSaWNoQ29sb3JzIiwiY2xvc2VCdXR0b24iLCJjbG9zZUJ1dHRvbkZyb21Ub2FzdGVyIiwiY2FuY2VsQnV0dG9uU3R5bGUiLCJhY3Rpb25CdXR0b25TdHlsZSIsImRlc2NyaXB0aW9uQ2xhc3NOYW1lIiwiZHVyYXRpb24iLCJkdXJhdGlvbkZyb21Ub2FzdGVyIiwiZ2FwIiwiZXhwYW5kQnlEZWZhdWx0IiwiY2xhc3NOYW1lcyIsImljb25zIiwiY2xvc2VCdXR0b25BcmlhTGFiZWwiLCJzd2lwZURpcmVjdGlvbiIsInNldFN3aXBlRGlyZWN0aW9uIiwic3dpcGVPdXREaXJlY3Rpb24iLCJzZXRTd2lwZU91dERpcmVjdGlvbiIsIm1vdW50ZWQiLCJzZXRNb3VudGVkIiwicmVtb3ZlZCIsInNldFJlbW92ZWQiLCJzd2lwaW5nIiwic2V0U3dpcGluZyIsInN3aXBlT3V0Iiwic2V0U3dpcGVPdXQiLCJpc1N3aXBlZCIsInNldElzU3dpcGVkIiwib2Zmc2V0QmVmb3JlUmVtb3ZlIiwic2V0T2Zmc2V0QmVmb3JlUmVtb3ZlIiwiaW5pdGlhbEhlaWdodCIsInNldEluaXRpYWxIZWlnaHQiLCJyZW1haW5pbmdUaW1lIiwidXNlUmVmIiwiZHJhZ1N0YXJ0VGltZSIsInRvYXN0UmVmIiwiaXNGcm9udCIsImlzVmlzaWJsZSIsInRvYXN0VHlwZSIsInRvYXN0Q2xhc3NuYW1lIiwidG9hc3REZXNjcmlwdGlvbkNsYXNzbmFtZSIsImhlaWdodEluZGV4IiwidXNlTWVtbyIsImZpbmRJbmRleCIsInRvYXN0SWQiLCJfdG9hc3RfY2xvc2VCdXR0b24iLCJjbG9zZVRpbWVyU3RhcnRUaW1lUmVmIiwib2Zmc2V0IiwibGFzdENsb3NlVGltZXJTdGFydFRpbWVSZWYiLCJwb2ludGVyU3RhcnRSZWYiLCJ0b2FzdHNIZWlnaHRCZWZvcmUiLCJyZWR1Y2UiLCJwcmV2IiwiY3VyciIsInJlZHVjZXJJbmRleCIsImRpc2FibGVkIiwiY3VycmVudCIsInRvYXN0Tm9kZSIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsImgiLCJ1c2VMYXlvdXRFZmZlY3QiLCJvcmlnaW5hbEhlaWdodCIsIm5ld0hlaWdodCIsImNhbmNlbCIsImRlbGV0ZVRvYXN0IiwidXNlQ2FsbGJhY2siLCJzZXRUaW1lb3V0IiwiSW5maW5pdHkiLCJ0aW1lb3V0SWQiLCJwYXVzZVRpbWVyIiwiZWxhcHNlZFRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsInN0YXJ0VGltZXIiLCJvbkF1dG9DbG9zZSIsImNsZWFyVGltZW91dCIsIm9uRGlzbWlzcyIsImdldExvYWRpbmdJY29uIiwibG9hZGVyIiwiaWNvbiIsIl90b2FzdF9yaWNoQ29sb3JzIiwiX2ljb25zX2Nsb3NlIiwidGFiSW5kZXgiLCJyZWYiLCJkZWZhdWx0IiwicmljaENvbG9ycyIsInRlc3RJZCIsIm9uRHJhZ0VuZCIsIm9uUG9pbnRlckRvd24iLCJldmVudCIsImJ1dHRvbiIsInRhcmdldCIsInNldFBvaW50ZXJDYXB0dXJlIiwicG9pbnRlcklkIiwidGFnTmFtZSIsImNsaWVudFgiLCJjbGllbnRZIiwib25Qb2ludGVyVXAiLCJfdG9hc3RSZWZfY3VycmVudCIsIl90b2FzdFJlZl9jdXJyZW50MSIsIl9kcmFnU3RhcnRUaW1lX2N1cnJlbnQiLCJzd2lwZUFtb3VudFgiLCJOdW1iZXIiLCJnZXRQcm9wZXJ0eVZhbHVlIiwicmVwbGFjZSIsInN3aXBlQW1vdW50WSIsInRpbWVUYWtlbiIsInN3aXBlQW1vdW50IiwidmVsb2NpdHkiLCJNYXRoIiwiYWJzIiwiX3RvYXN0UmVmX2N1cnJlbnQyIiwiX3RvYXN0UmVmX2N1cnJlbnQzIiwic2V0UHJvcGVydHkiLCJvblBvaW50ZXJNb3ZlIiwiX3dpbmRvd19nZXRTZWxlY3Rpb24iLCJpc0hpZ2hsaWdodGVkIiwiZ2V0U2VsZWN0aW9uIiwidG9TdHJpbmciLCJ5RGVsdGEiLCJ4RGVsdGEiLCJfcHJvcHNfc3dpcGVEaXJlY3Rpb25zIiwic3dpcGVEaXJlY3Rpb25zIiwiZ2V0RGFtcGVuaW5nIiwiZGVsdGEiLCJmYWN0b3IiLCJpbmNsdWRlcyIsImRhbXBlbmVkRGVsdGEiLCJvbkNsaWNrIiwiY2xvc2UiLCJjb250ZW50IiwiY2FuY2VsQnV0dG9uIiwiZGVmYXVsdFByZXZlbnRlZCIsImFjdGlvbkJ1dHRvbiIsImdldERvY3VtZW50RGlyZWN0aW9uIiwiZGlyQXR0cmlidXRlIiwiZG9jdW1lbnRFbGVtZW50IiwiZ2V0QXR0cmlidXRlIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImRpcmVjdGlvbiIsImFzc2lnbk9mZnNldCIsImRlZmF1bHRPZmZzZXQiLCJtb2JpbGVPZmZzZXQiLCJzdHlsZXMiLCJpc01vYmlsZSIsInByZWZpeCIsImRlZmF1bHRWYWx1ZSIsImFzc2lnbkFsbCIsInVzZVNvbm5lciIsImFjdGl2ZVRvYXN0cyIsInNldEFjdGl2ZVRvYXN0cyIsImZsdXNoU3luYyIsInQiLCJpbmRleE9mRXhpc3RpbmdUb2FzdCIsInNsaWNlIiwiVG9hc3RlciIsImZvcndhcmRSZWYiLCJob3RrZXkiLCJleHBhbmQiLCJ0aGVtZSIsInRvYXN0T3B0aW9ucyIsImRpciIsImNvbnRhaW5lckFyaWFMYWJlbCIsInNldFRvYXN0cyIsImZpbHRlcmVkVG9hc3RzIiwidG9hc3RlcklkIiwicG9zc2libGVQb3NpdGlvbnMiLCJmcm9tIiwiY29uY2F0Iiwic2V0RXhwYW5kZWQiLCJzZXRJbnRlcmFjdGluZyIsImFjdHVhbFRoZW1lIiwic2V0QWN0dWFsVGhlbWUiLCJtYXRjaE1lZGlhIiwibWF0Y2hlcyIsImxpc3RSZWYiLCJob3RrZXlMYWJlbCIsImxhc3RGb2N1c2VkRWxlbWVudFJlZiIsImlzRm9jdXNXaXRoaW5SZWYiLCJ0b2FzdFRvUmVtb3ZlIiwiX3RvYXN0c19maW5kIiwiZGFya01lZGlhUXVlcnkiLCJhZGRMaXN0ZW5lciIsImUiLCJjb25zb2xlIiwiaGFuZGxlS2V5RG93biIsIl9saXN0UmVmX2N1cnJlbnQiLCJpc0hvdGtleVByZXNzZWQiLCJldmVyeSIsIl9saXN0UmVmX2N1cnJlbnQxIiwiZm9jdXMiLCJhY3RpdmVFbGVtZW50IiwiY29udGFpbnMiLCJwcmV2ZW50U2Nyb2xsIiwic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiwiX2hlaWdodHNfIiwib25CbHVyIiwiY3VycmVudFRhcmdldCIsInJlbGF0ZWRUYXJnZXQiLCJvbkZvY3VzIiwiaXNOb3REaXNtaXNzaWJsZSIsIkhUTUxFbGVtZW50IiwiZGF0YXNldCIsIm9uTW91c2VFbnRlciIsIm9uTW91c2VNb3ZlIiwib25Nb3VzZUxlYXZlIiwiX3RvYXN0T3B0aW9uc19kdXJhdGlvbiIsIl90b2FzdE9wdGlvbnNfY2xvc2VCdXR0b24iXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/sonner/dist/index.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/superstruct/dist/index.mjs":
/*!*************************************************!*\
  !*** ./node_modules/superstruct/dist/index.mjs ***!
  \*************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Struct: () => (/* binding */ Struct),\n/* harmony export */   StructError: () => (/* binding */ StructError),\n/* harmony export */   any: () => (/* binding */ any),\n/* harmony export */   array: () => (/* binding */ array),\n/* harmony export */   assert: () => (/* binding */ assert),\n/* harmony export */   assign: () => (/* binding */ assign),\n/* harmony export */   bigint: () => (/* binding */ bigint),\n/* harmony export */   boolean: () => (/* binding */ boolean),\n/* harmony export */   coerce: () => (/* binding */ coerce),\n/* harmony export */   create: () => (/* binding */ create),\n/* harmony export */   date: () => (/* binding */ date),\n/* harmony export */   defaulted: () => (/* binding */ defaulted),\n/* harmony export */   define: () => (/* binding */ define),\n/* harmony export */   deprecated: () => (/* binding */ deprecated),\n/* harmony export */   dynamic: () => (/* binding */ dynamic),\n/* harmony export */   empty: () => (/* binding */ empty),\n/* harmony export */   enums: () => (/* binding */ enums),\n/* harmony export */   func: () => (/* binding */ func),\n/* harmony export */   instance: () => (/* binding */ instance),\n/* harmony export */   integer: () => (/* binding */ integer),\n/* harmony export */   intersection: () => (/* binding */ intersection),\n/* harmony export */   is: () => (/* binding */ is),\n/* harmony export */   lazy: () => (/* binding */ lazy),\n/* harmony export */   literal: () => (/* binding */ literal),\n/* harmony export */   map: () => (/* binding */ map),\n/* harmony export */   mask: () => (/* binding */ mask),\n/* harmony export */   max: () => (/* binding */ max),\n/* harmony export */   min: () => (/* binding */ min),\n/* harmony export */   never: () => (/* binding */ never),\n/* harmony export */   nonempty: () => (/* binding */ nonempty),\n/* harmony export */   nullable: () => (/* binding */ nullable),\n/* harmony export */   number: () => (/* binding */ number),\n/* harmony export */   object: () => (/* binding */ object),\n/* harmony export */   omit: () => (/* binding */ omit),\n/* harmony export */   optional: () => (/* binding */ optional),\n/* harmony export */   partial: () => (/* binding */ partial),\n/* harmony export */   pattern: () => (/* binding */ pattern),\n/* harmony export */   pick: () => (/* binding */ pick),\n/* harmony export */   record: () => (/* binding */ record),\n/* harmony export */   refine: () => (/* binding */ refine),\n/* harmony export */   regexp: () => (/* binding */ regexp),\n/* harmony export */   set: () => (/* binding */ set),\n/* harmony export */   size: () => (/* binding */ size),\n/* harmony export */   string: () => (/* binding */ string),\n/* harmony export */   struct: () => (/* binding */ struct),\n/* harmony export */   trimmed: () => (/* binding */ trimmed),\n/* harmony export */   tuple: () => (/* binding */ tuple),\n/* harmony export */   type: () => (/* binding */ type),\n/* harmony export */   union: () => (/* binding */ union),\n/* harmony export */   unknown: () => (/* binding */ unknown),\n/* harmony export */   validate: () => (/* binding */ validate)\n/* harmony export */ });\n/**\n * A `StructFailure` represents a single specific failure in validation.\n */\n/**\n * `StructError` objects are thrown (or returned) when validation fails.\n *\n * Validation logic is design to exit early for maximum performance. The error\n * represents the first error encountered during validation. For more detail,\n * the `error.failures` property is a generator function that can be run to\n * continue validation and receive all the failures in the data.\n */\nclass StructError extends TypeError {\n    constructor(failure, failures) {\n        let cached;\n        const { message, explanation, ...rest } = failure;\n        const { path } = failure;\n        const msg = path.length === 0 ? message : `At path: ${path.join('.')} -- ${message}`;\n        super(explanation ?? msg);\n        if (explanation != null)\n            this.cause = msg;\n        Object.assign(this, rest);\n        this.name = this.constructor.name;\n        this.failures = () => {\n            return (cached ?? (cached = [failure, ...failures()]));\n        };\n    }\n}\n\n/**\n * Check if a value is an iterator.\n */\nfunction isIterable(x) {\n    return isObject(x) && typeof x[Symbol.iterator] === 'function';\n}\n/**\n * Check if a value is a plain object.\n */\nfunction isObject(x) {\n    return typeof x === 'object' && x != null;\n}\n/**\n * Check if a value is a non-array object.\n */\nfunction isNonArrayObject(x) {\n    return isObject(x) && !Array.isArray(x);\n}\n/**\n * Check if a value is a plain object.\n */\nfunction isPlainObject(x) {\n    if (Object.prototype.toString.call(x) !== '[object Object]') {\n        return false;\n    }\n    const prototype = Object.getPrototypeOf(x);\n    return prototype === null || prototype === Object.prototype;\n}\n/**\n * Return a value as a printable string.\n */\nfunction print(value) {\n    if (typeof value === 'symbol') {\n        return value.toString();\n    }\n    return typeof value === 'string' ? JSON.stringify(value) : `${value}`;\n}\n/**\n * Shifts (removes and returns) the first value from the `input` iterator.\n * Like `Array.prototype.shift()` but for an `Iterator`.\n */\nfunction shiftIterator(input) {\n    const { done, value } = input.next();\n    return done ? undefined : value;\n}\n/**\n * Convert a single validation result to a failure.\n */\nfunction toFailure(result, context, struct, value) {\n    if (result === true) {\n        return;\n    }\n    else if (result === false) {\n        result = {};\n    }\n    else if (typeof result === 'string') {\n        result = { message: result };\n    }\n    const { path, branch } = context;\n    const { type } = struct;\n    const { refinement, message = `Expected a value of type \\`${type}\\`${refinement ? ` with refinement \\`${refinement}\\`` : ''}, but received: \\`${print(value)}\\``, } = result;\n    return {\n        value,\n        type,\n        refinement,\n        key: path[path.length - 1],\n        path,\n        branch,\n        ...result,\n        message,\n    };\n}\n/**\n * Convert a validation result to an iterable of failures.\n */\nfunction* toFailures(result, context, struct, value) {\n    if (!isIterable(result)) {\n        result = [result];\n    }\n    for (const r of result) {\n        const failure = toFailure(r, context, struct, value);\n        if (failure) {\n            yield failure;\n        }\n    }\n}\n/**\n * Check a value against a struct, traversing deeply into nested values, and\n * returning an iterator of failures or success.\n */\nfunction* run(value, struct, options = {}) {\n    const { path = [], branch = [value], coerce = false, mask = false } = options;\n    const ctx = { path, branch, mask };\n    if (coerce) {\n        value = struct.coercer(value, ctx);\n    }\n    let status = 'valid';\n    for (const failure of struct.validator(value, ctx)) {\n        failure.explanation = options.message;\n        status = 'not_valid';\n        yield [failure, undefined];\n    }\n    for (let [k, v, s] of struct.entries(value, ctx)) {\n        const ts = run(v, s, {\n            path: k === undefined ? path : [...path, k],\n            branch: k === undefined ? branch : [...branch, v],\n            coerce,\n            mask,\n            message: options.message,\n        });\n        for (const t of ts) {\n            if (t[0]) {\n                status = t[0].refinement != null ? 'not_refined' : 'not_valid';\n                yield [t[0], undefined];\n            }\n            else if (coerce) {\n                v = t[1];\n                if (k === undefined) {\n                    value = v;\n                }\n                else if (value instanceof Map) {\n                    value.set(k, v);\n                }\n                else if (value instanceof Set) {\n                    value.add(v);\n                }\n                else if (isObject(value)) {\n                    if (v !== undefined || k in value)\n                        value[k] = v;\n                }\n            }\n        }\n    }\n    if (status !== 'not_valid') {\n        for (const failure of struct.refiner(value, ctx)) {\n            failure.explanation = options.message;\n            status = 'not_refined';\n            yield [failure, undefined];\n        }\n    }\n    if (status === 'valid') {\n        yield [undefined, value];\n    }\n}\n\n/**\n * `Struct` objects encapsulate the validation logic for a specific type of\n * values. Once constructed, you use the `assert`, `is` or `validate` helpers to\n * validate unknown input data against the struct.\n */\nclass Struct {\n    constructor(props) {\n        const { type, schema, validator, refiner, coercer = (value) => value, entries = function* () { }, } = props;\n        this.type = type;\n        this.schema = schema;\n        this.entries = entries;\n        this.coercer = coercer;\n        if (validator) {\n            this.validator = (value, context) => {\n                const result = validator(value, context);\n                return toFailures(result, context, this, value);\n            };\n        }\n        else {\n            this.validator = () => [];\n        }\n        if (refiner) {\n            this.refiner = (value, context) => {\n                const result = refiner(value, context);\n                return toFailures(result, context, this, value);\n            };\n        }\n        else {\n            this.refiner = () => [];\n        }\n    }\n    /**\n     * Assert that a value passes the struct's validation, throwing if it doesn't.\n     */\n    assert(value, message) {\n        return assert(value, this, message);\n    }\n    /**\n     * Create a value with the struct's coercion logic, then validate it.\n     */\n    create(value, message) {\n        return create(value, this, message);\n    }\n    /**\n     * Check if a value passes the struct's validation.\n     */\n    is(value) {\n        return is(value, this);\n    }\n    /**\n     * Mask a value, coercing and validating it, but returning only the subset of\n     * properties defined by the struct's schema. Masking applies recursively to\n     * props of `object` structs only.\n     */\n    mask(value, message) {\n        return mask(value, this, message);\n    }\n    /**\n     * Validate a value with the struct's validation logic, returning a tuple\n     * representing the result.\n     *\n     * You may optionally pass `true` for the `coerce` argument to coerce\n     * the value before attempting to validate it. If you do, the result will\n     * contain the coerced result when successful. Also, `mask` will turn on\n     * masking of the unknown `object` props recursively if passed.\n     */\n    validate(value, options = {}) {\n        return validate(value, this, options);\n    }\n}\n/**\n * Assert that a value passes a struct, throwing if it doesn't.\n */\nfunction assert(value, struct, message) {\n    const result = validate(value, struct, { message });\n    if (result[0]) {\n        throw result[0];\n    }\n}\n/**\n * Create a value with the coercion logic of struct and validate it.\n */\nfunction create(value, struct, message) {\n    const result = validate(value, struct, { coerce: true, message });\n    if (result[0]) {\n        throw result[0];\n    }\n    else {\n        return result[1];\n    }\n}\n/**\n * Mask a value, returning only the subset of properties defined by a struct.\n */\nfunction mask(value, struct, message) {\n    const result = validate(value, struct, { coerce: true, mask: true, message });\n    if (result[0]) {\n        throw result[0];\n    }\n    else {\n        return result[1];\n    }\n}\n/**\n * Check if a value passes a struct.\n */\nfunction is(value, struct) {\n    const result = validate(value, struct);\n    return !result[0];\n}\n/**\n * Validate a value against a struct, returning an error if invalid, or the\n * value (with potential coercion) if valid.\n */\nfunction validate(value, struct, options = {}) {\n    const tuples = run(value, struct, options);\n    const tuple = shiftIterator(tuples);\n    if (tuple[0]) {\n        const error = new StructError(tuple[0], function* () {\n            for (const t of tuples) {\n                if (t[0]) {\n                    yield t[0];\n                }\n            }\n        });\n        return [error, undefined];\n    }\n    else {\n        const v = tuple[1];\n        return [undefined, v];\n    }\n}\n\nfunction assign(...Structs) {\n    const isType = Structs[0].type === 'type';\n    const schemas = Structs.map((s) => s.schema);\n    const schema = Object.assign({}, ...schemas);\n    return isType ? type(schema) : object(schema);\n}\n/**\n * Define a new struct type with a custom validation function.\n */\nfunction define(name, validator) {\n    return new Struct({ type: name, schema: null, validator });\n}\n/**\n * Create a new struct based on an existing struct, but the value is allowed to\n * be `undefined`. `log` will be called if the value is not `undefined`.\n */\nfunction deprecated(struct, log) {\n    return new Struct({\n        ...struct,\n        refiner: (value, ctx) => value === undefined || struct.refiner(value, ctx),\n        validator(value, ctx) {\n            if (value === undefined) {\n                return true;\n            }\n            else {\n                log(value, ctx);\n                return struct.validator(value, ctx);\n            }\n        },\n    });\n}\n/**\n * Create a struct with dynamic validation logic.\n *\n * The callback will receive the value currently being validated, and must\n * return a struct object to validate it with. This can be useful to model\n * validation logic that changes based on its input.\n */\nfunction dynamic(fn) {\n    return new Struct({\n        type: 'dynamic',\n        schema: null,\n        *entries(value, ctx) {\n            const struct = fn(value, ctx);\n            yield* struct.entries(value, ctx);\n        },\n        validator(value, ctx) {\n            const struct = fn(value, ctx);\n            return struct.validator(value, ctx);\n        },\n        coercer(value, ctx) {\n            const struct = fn(value, ctx);\n            return struct.coercer(value, ctx);\n        },\n        refiner(value, ctx) {\n            const struct = fn(value, ctx);\n            return struct.refiner(value, ctx);\n        },\n    });\n}\n/**\n * Create a struct with lazily evaluated validation logic.\n *\n * The first time validation is run with the struct, the callback will be called\n * and must return a struct object to use. This is useful for cases where you\n * want to have self-referential structs for nested data structures to avoid a\n * circular definition problem.\n */\nfunction lazy(fn) {\n    let struct;\n    return new Struct({\n        type: 'lazy',\n        schema: null,\n        *entries(value, ctx) {\n            struct ?? (struct = fn());\n            yield* struct.entries(value, ctx);\n        },\n        validator(value, ctx) {\n            struct ?? (struct = fn());\n            return struct.validator(value, ctx);\n        },\n        coercer(value, ctx) {\n            struct ?? (struct = fn());\n            return struct.coercer(value, ctx);\n        },\n        refiner(value, ctx) {\n            struct ?? (struct = fn());\n            return struct.refiner(value, ctx);\n        },\n    });\n}\n/**\n * Create a new struct based on an existing object struct, but excluding\n * specific properties.\n *\n * Like TypeScript's `Omit` utility.\n */\nfunction omit(struct, keys) {\n    const { schema } = struct;\n    const subschema = { ...schema };\n    for (const key of keys) {\n        delete subschema[key];\n    }\n    switch (struct.type) {\n        case 'type':\n            return type(subschema);\n        default:\n            return object(subschema);\n    }\n}\n/**\n * Create a new struct based on an existing object struct, but with all of its\n * properties allowed to be `undefined`.\n *\n * Like TypeScript's `Partial` utility.\n */\nfunction partial(struct) {\n    const isStruct = struct instanceof Struct;\n    const schema = isStruct ? { ...struct.schema } : { ...struct };\n    for (const key in schema) {\n        schema[key] = optional(schema[key]);\n    }\n    if (isStruct && struct.type === 'type') {\n        return type(schema);\n    }\n    return object(schema);\n}\n/**\n * Create a new struct based on an existing object struct, but only including\n * specific properties.\n *\n * Like TypeScript's `Pick` utility.\n */\nfunction pick(struct, keys) {\n    const { schema } = struct;\n    const subschema = {};\n    for (const key of keys) {\n        subschema[key] = schema[key];\n    }\n    switch (struct.type) {\n        case 'type':\n            return type(subschema);\n        default:\n            return object(subschema);\n    }\n}\n/**\n * Define a new struct type with a custom validation function.\n *\n * @deprecated This function has been renamed to `define`.\n */\nfunction struct(name, validator) {\n    console.warn('superstruct@0.11 - The `struct` helper has been renamed to `define`.');\n    return define(name, validator);\n}\n\n/**\n * Ensure that any value passes validation.\n */\nfunction any() {\n    return define('any', () => true);\n}\nfunction array(Element) {\n    return new Struct({\n        type: 'array',\n        schema: Element,\n        *entries(value) {\n            if (Element && Array.isArray(value)) {\n                for (const [i, v] of value.entries()) {\n                    yield [i, v, Element];\n                }\n            }\n        },\n        coercer(value) {\n            return Array.isArray(value) ? value.slice() : value;\n        },\n        validator(value) {\n            return (Array.isArray(value) ||\n                `Expected an array value, but received: ${print(value)}`);\n        },\n    });\n}\n/**\n * Ensure that a value is a bigint.\n */\nfunction bigint() {\n    return define('bigint', (value) => {\n        return typeof value === 'bigint';\n    });\n}\n/**\n * Ensure that a value is a boolean.\n */\nfunction boolean() {\n    return define('boolean', (value) => {\n        return typeof value === 'boolean';\n    });\n}\n/**\n * Ensure that a value is a valid `Date`.\n *\n * Note: this also ensures that the value is *not* an invalid `Date` object,\n * which can occur when parsing a date fails but still returns a `Date`.\n */\nfunction date() {\n    return define('date', (value) => {\n        return ((value instanceof Date && !isNaN(value.getTime())) ||\n            `Expected a valid \\`Date\\` object, but received: ${print(value)}`);\n    });\n}\nfunction enums(values) {\n    const schema = {};\n    const description = values.map((v) => print(v)).join();\n    for (const key of values) {\n        schema[key] = key;\n    }\n    return new Struct({\n        type: 'enums',\n        schema,\n        validator(value) {\n            return (values.includes(value) ||\n                `Expected one of \\`${description}\\`, but received: ${print(value)}`);\n        },\n    });\n}\n/**\n * Ensure that a value is a function.\n */\nfunction func() {\n    return define('func', (value) => {\n        return (typeof value === 'function' ||\n            `Expected a function, but received: ${print(value)}`);\n    });\n}\n/**\n * Ensure that a value is an instance of a specific class.\n */\nfunction instance(Class) {\n    return define('instance', (value) => {\n        return (value instanceof Class ||\n            `Expected a \\`${Class.name}\\` instance, but received: ${print(value)}`);\n    });\n}\n/**\n * Ensure that a value is an integer.\n */\nfunction integer() {\n    return define('integer', (value) => {\n        return ((typeof value === 'number' && !isNaN(value) && Number.isInteger(value)) ||\n            `Expected an integer, but received: ${print(value)}`);\n    });\n}\n/**\n * Ensure that a value matches all of a set of types.\n */\nfunction intersection(Structs) {\n    return new Struct({\n        type: 'intersection',\n        schema: null,\n        *entries(value, ctx) {\n            for (const S of Structs) {\n                yield* S.entries(value, ctx);\n            }\n        },\n        *validator(value, ctx) {\n            for (const S of Structs) {\n                yield* S.validator(value, ctx);\n            }\n        },\n        *refiner(value, ctx) {\n            for (const S of Structs) {\n                yield* S.refiner(value, ctx);\n            }\n        },\n    });\n}\nfunction literal(constant) {\n    const description = print(constant);\n    const t = typeof constant;\n    return new Struct({\n        type: 'literal',\n        schema: t === 'string' || t === 'number' || t === 'boolean' ? constant : null,\n        validator(value) {\n            return (value === constant ||\n                `Expected the literal \\`${description}\\`, but received: ${print(value)}`);\n        },\n    });\n}\nfunction map(Key, Value) {\n    return new Struct({\n        type: 'map',\n        schema: null,\n        *entries(value) {\n            if (Key && Value && value instanceof Map) {\n                for (const [k, v] of value.entries()) {\n                    yield [k, k, Key];\n                    yield [k, v, Value];\n                }\n            }\n        },\n        coercer(value) {\n            return value instanceof Map ? new Map(value) : value;\n        },\n        validator(value) {\n            return (value instanceof Map ||\n                `Expected a \\`Map\\` object, but received: ${print(value)}`);\n        },\n    });\n}\n/**\n * Ensure that no value ever passes validation.\n */\nfunction never() {\n    return define('never', () => false);\n}\n/**\n * Augment an existing struct to allow `null` values.\n */\nfunction nullable(struct) {\n    return new Struct({\n        ...struct,\n        validator: (value, ctx) => value === null || struct.validator(value, ctx),\n        refiner: (value, ctx) => value === null || struct.refiner(value, ctx),\n    });\n}\n/**\n * Ensure that a value is a number.\n */\nfunction number() {\n    return define('number', (value) => {\n        return ((typeof value === 'number' && !isNaN(value)) ||\n            `Expected a number, but received: ${print(value)}`);\n    });\n}\nfunction object(schema) {\n    const knowns = schema ? Object.keys(schema) : [];\n    const Never = never();\n    return new Struct({\n        type: 'object',\n        schema: schema ? schema : null,\n        *entries(value) {\n            if (schema && isObject(value)) {\n                const unknowns = new Set(Object.keys(value));\n                for (const key of knowns) {\n                    unknowns.delete(key);\n                    yield [key, value[key], schema[key]];\n                }\n                for (const key of unknowns) {\n                    yield [key, value[key], Never];\n                }\n            }\n        },\n        validator(value) {\n            return (isNonArrayObject(value) ||\n                `Expected an object, but received: ${print(value)}`);\n        },\n        coercer(value, ctx) {\n            if (!isNonArrayObject(value)) {\n                return value;\n            }\n            const coerced = { ...value };\n            // The `object` struct has special behaviour enabled by the mask flag.\n            // When masking, properties that are not in the schema are deleted from\n            // the coerced object instead of eventually failing validaiton.\n            if (ctx.mask && schema) {\n                for (const key in coerced) {\n                    if (schema[key] === undefined) {\n                        delete coerced[key];\n                    }\n                }\n            }\n            return coerced;\n        },\n    });\n}\n/**\n * Augment a struct to allow `undefined` values.\n */\nfunction optional(struct) {\n    return new Struct({\n        ...struct,\n        validator: (value, ctx) => value === undefined || struct.validator(value, ctx),\n        refiner: (value, ctx) => value === undefined || struct.refiner(value, ctx),\n    });\n}\n/**\n * Ensure that a value is an object with keys and values of specific types, but\n * without ensuring any specific shape of properties.\n *\n * Like TypeScript's `Record` utility.\n */\nfunction record(Key, Value) {\n    return new Struct({\n        type: 'record',\n        schema: null,\n        *entries(value) {\n            if (isObject(value)) {\n                for (const k in value) {\n                    const v = value[k];\n                    yield [k, k, Key];\n                    yield [k, v, Value];\n                }\n            }\n        },\n        validator(value) {\n            return (isNonArrayObject(value) ||\n                `Expected an object, but received: ${print(value)}`);\n        },\n        coercer(value) {\n            return isNonArrayObject(value) ? { ...value } : value;\n        },\n    });\n}\n/**\n * Ensure that a value is a `RegExp`.\n *\n * Note: this does not test the value against the regular expression! For that\n * you need to use the `pattern()` refinement.\n */\nfunction regexp() {\n    return define('regexp', (value) => {\n        return value instanceof RegExp;\n    });\n}\nfunction set(Element) {\n    return new Struct({\n        type: 'set',\n        schema: null,\n        *entries(value) {\n            if (Element && value instanceof Set) {\n                for (const v of value) {\n                    yield [v, v, Element];\n                }\n            }\n        },\n        coercer(value) {\n            return value instanceof Set ? new Set(value) : value;\n        },\n        validator(value) {\n            return (value instanceof Set ||\n                `Expected a \\`Set\\` object, but received: ${print(value)}`);\n        },\n    });\n}\n/**\n * Ensure that a value is a string.\n */\nfunction string() {\n    return define('string', (value) => {\n        return (typeof value === 'string' ||\n            `Expected a string, but received: ${print(value)}`);\n    });\n}\n/**\n * Ensure that a value is a tuple of a specific length, and that each of its\n * elements is of a specific type.\n */\nfunction tuple(Structs) {\n    const Never = never();\n    return new Struct({\n        type: 'tuple',\n        schema: null,\n        *entries(value) {\n            if (Array.isArray(value)) {\n                const length = Math.max(Structs.length, value.length);\n                for (let i = 0; i < length; i++) {\n                    yield [i, value[i], Structs[i] || Never];\n                }\n            }\n        },\n        validator(value) {\n            return (Array.isArray(value) ||\n                `Expected an array, but received: ${print(value)}`);\n        },\n        coercer(value) {\n            return Array.isArray(value) ? value.slice() : value;\n        },\n    });\n}\n/**\n * Ensure that a value has a set of known properties of specific types.\n *\n * Note: Unrecognized properties are allowed and untouched. This is similar to\n * how TypeScript's structural typing works.\n */\nfunction type(schema) {\n    const keys = Object.keys(schema);\n    return new Struct({\n        type: 'type',\n        schema,\n        *entries(value) {\n            if (isObject(value)) {\n                for (const k of keys) {\n                    yield [k, value[k], schema[k]];\n                }\n            }\n        },\n        validator(value) {\n            return (isNonArrayObject(value) ||\n                `Expected an object, but received: ${print(value)}`);\n        },\n        coercer(value) {\n            return isNonArrayObject(value) ? { ...value } : value;\n        },\n    });\n}\n/**\n * Ensure that a value matches one of a set of types.\n */\nfunction union(Structs) {\n    const description = Structs.map((s) => s.type).join(' | ');\n    return new Struct({\n        type: 'union',\n        schema: null,\n        coercer(value, ctx) {\n            for (const S of Structs) {\n                const [error, coerced] = S.validate(value, {\n                    coerce: true,\n                    mask: ctx.mask,\n                });\n                if (!error) {\n                    return coerced;\n                }\n            }\n            return value;\n        },\n        validator(value, ctx) {\n            const failures = [];\n            for (const S of Structs) {\n                const [...tuples] = run(value, S, ctx);\n                const [first] = tuples;\n                if (!first[0]) {\n                    return [];\n                }\n                else {\n                    for (const [failure] of tuples) {\n                        if (failure) {\n                            failures.push(failure);\n                        }\n                    }\n                }\n            }\n            return [\n                `Expected the value to satisfy a union of \\`${description}\\`, but received: ${print(value)}`,\n                ...failures,\n            ];\n        },\n    });\n}\n/**\n * Ensure that any value passes validation, without widening its type to `any`.\n */\nfunction unknown() {\n    return define('unknown', () => true);\n}\n\n/**\n * Augment a `Struct` to add an additional coercion step to its input.\n *\n * This allows you to transform input data before validating it, to increase the\n * likelihood that it passes validation—for example for default values, parsing\n * different formats, etc.\n *\n * Note: You must use `create(value, Struct)` on the value to have the coercion\n * take effect! Using simply `assert()` or `is()` will not use coercion.\n */\nfunction coerce(struct, condition, coercer) {\n    return new Struct({\n        ...struct,\n        coercer: (value, ctx) => {\n            return is(value, condition)\n                ? struct.coercer(coercer(value, ctx), ctx)\n                : struct.coercer(value, ctx);\n        },\n    });\n}\n/**\n * Augment a struct to replace `undefined` values with a default.\n *\n * Note: You must use `create(value, Struct)` on the value to have the coercion\n * take effect! Using simply `assert()` or `is()` will not use coercion.\n */\nfunction defaulted(struct, fallback, options = {}) {\n    return coerce(struct, unknown(), (x) => {\n        const f = typeof fallback === 'function' ? fallback() : fallback;\n        if (x === undefined) {\n            return f;\n        }\n        if (!options.strict && isPlainObject(x) && isPlainObject(f)) {\n            const ret = { ...x };\n            let changed = false;\n            for (const key in f) {\n                if (ret[key] === undefined) {\n                    ret[key] = f[key];\n                    changed = true;\n                }\n            }\n            if (changed) {\n                return ret;\n            }\n        }\n        return x;\n    });\n}\n/**\n * Augment a struct to trim string inputs.\n *\n * Note: You must use `create(value, Struct)` on the value to have the coercion\n * take effect! Using simply `assert()` or `is()` will not use coercion.\n */\nfunction trimmed(struct) {\n    return coerce(struct, string(), (x) => x.trim());\n}\n\n/**\n * Ensure that a string, array, map, or set is empty.\n */\nfunction empty(struct) {\n    return refine(struct, 'empty', (value) => {\n        const size = getSize(value);\n        return (size === 0 ||\n            `Expected an empty ${struct.type} but received one with a size of \\`${size}\\``);\n    });\n}\nfunction getSize(value) {\n    if (value instanceof Map || value instanceof Set) {\n        return value.size;\n    }\n    else {\n        return value.length;\n    }\n}\n/**\n * Ensure that a number or date is below a threshold.\n */\nfunction max(struct, threshold, options = {}) {\n    const { exclusive } = options;\n    return refine(struct, 'max', (value) => {\n        return exclusive\n            ? value < threshold\n            : value <= threshold ||\n                `Expected a ${struct.type} less than ${exclusive ? '' : 'or equal to '}${threshold} but received \\`${value}\\``;\n    });\n}\n/**\n * Ensure that a number or date is above a threshold.\n */\nfunction min(struct, threshold, options = {}) {\n    const { exclusive } = options;\n    return refine(struct, 'min', (value) => {\n        return exclusive\n            ? value > threshold\n            : value >= threshold ||\n                `Expected a ${struct.type} greater than ${exclusive ? '' : 'or equal to '}${threshold} but received \\`${value}\\``;\n    });\n}\n/**\n * Ensure that a string, array, map or set is not empty.\n */\nfunction nonempty(struct) {\n    return refine(struct, 'nonempty', (value) => {\n        const size = getSize(value);\n        return (size > 0 || `Expected a nonempty ${struct.type} but received an empty one`);\n    });\n}\n/**\n * Ensure that a string matches a regular expression.\n */\nfunction pattern(struct, regexp) {\n    return refine(struct, 'pattern', (value) => {\n        return (regexp.test(value) ||\n            `Expected a ${struct.type} matching \\`/${regexp.source}/\\` but received \"${value}\"`);\n    });\n}\n/**\n * Ensure that a string, array, number, date, map, or set has a size (or length, or time) between `min` and `max`.\n */\nfunction size(struct, min, max = min) {\n    const expected = `Expected a ${struct.type}`;\n    const of = min === max ? `of \\`${min}\\`` : `between \\`${min}\\` and \\`${max}\\``;\n    return refine(struct, 'size', (value) => {\n        if (typeof value === 'number' || value instanceof Date) {\n            return ((min <= value && value <= max) ||\n                `${expected} ${of} but received \\`${value}\\``);\n        }\n        else if (value instanceof Map || value instanceof Set) {\n            const { size } = value;\n            return ((min <= size && size <= max) ||\n                `${expected} with a size ${of} but received one with a size of \\`${size}\\``);\n        }\n        else {\n            const { length } = value;\n            return ((min <= length && length <= max) ||\n                `${expected} with a length ${of} but received one with a length of \\`${length}\\``);\n        }\n    });\n}\n/**\n * Augment a `Struct` to add an additional refinement to the validation.\n *\n * The refiner function is guaranteed to receive a value of the struct's type,\n * because the struct's existing validation will already have passed. This\n * allows you to layer additional validation on top of existing structs.\n */\nfunction refine(struct, name, refiner) {\n    return new Struct({\n        ...struct,\n        *refiner(value, ctx) {\n            yield* struct.refiner(value, ctx);\n            const result = refiner(value, ctx);\n            const failures = toFailures(result, ctx, struct, value);\n            for (const failure of failures) {\n                yield { ...failure, refinement: name };\n            }\n        },\n    });\n}\n\n\n//# sourceMappingURL=index.mjs.map\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9zdXBlcnN0cnVjdC9kaXN0L2luZGV4Lm1qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLGdDQUFnQztBQUNoRCxnQkFBZ0IsT0FBTztBQUN2Qiw4REFBOEQsZ0JBQWdCLEtBQUssUUFBUTtBQUMzRjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0VBQWtFLE1BQU07QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxjQUFjO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25CO0FBQ0EsWUFBWSxlQUFlO0FBQzNCLFlBQVksT0FBTztBQUNuQixZQUFZLG9EQUFvRCxLQUFLLElBQUksbUNBQW1DLFdBQVcsU0FBUyxvQkFBb0IsYUFBYSxPQUFPO0FBQ3hLO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5Q0FBeUM7QUFDekMsWUFBWSw0REFBNEQ7QUFDeEUsa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLHdGQUF3RixJQUFJO0FBQzVHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDLFNBQVM7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qyx1QkFBdUI7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QyxtQ0FBbUM7QUFDaEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsNkNBQTZDO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBbUM7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLHFDQUFxQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNULEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLFNBQVM7QUFDckIsd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyxtQkFBbUIsSUFBSTtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD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QUFDL0MscUNBQXFDLElBQUksbUJBQW1CLElBQUksV0FBVyxJQUFJO0FBQy9FO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixVQUFVLEVBQUUsSUFBSSxpQkFBaUIsTUFBTTtBQUMxRDtBQUNBO0FBQ0Esb0JBQW9CLE9BQU87QUFDM0I7QUFDQSxtQkFBbUIsVUFBVSxjQUFjLElBQUksb0NBQW9DLEtBQUs7QUFDeEY7QUFDQTtBQUNBLG9CQUFvQixTQUFTO0FBQzdCO0FBQ0EsbUJBQW1CLFVBQVUsZ0JBQWdCLElBQUksc0NBQXNDLE9BQU87QUFDOUY7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3QkFBd0I7QUFDeEI7QUFDQSxTQUFTO0FBQ1QsS0FBSztBQUNMOztBQUU2WjtBQUM3WiIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9zdXBlcnN0cnVjdC9kaXN0L2luZGV4Lm1qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgYFN0cnVjdEZhaWx1cmVgIHJlcHJlc2VudHMgYSBzaW5nbGUgc3BlY2lmaWMgZmFpbHVyZSBpbiB2YWxpZGF0aW9uLlxuICovXG4vKipcbiAqIGBTdHJ1Y3RFcnJvcmAgb2JqZWN0cyBhcmUgdGhyb3duIChvciByZXR1cm5lZCkgd2hlbiB2YWxpZGF0aW9uIGZhaWxzLlxuICpcbiAqIFZhbGlkYXRpb24gbG9naWMgaXMgZGVzaWduIHRvIGV4aXQgZWFybHkgZm9yIG1heGltdW0gcGVyZm9ybWFuY2UuIFRoZSBlcnJvclxuICogcmVwcmVzZW50cyB0aGUgZmlyc3QgZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIHZhbGlkYXRpb24uIEZvciBtb3JlIGRldGFpbCxcbiAqIHRoZSBgZXJyb3IuZmFpbHVyZXNgIHByb3BlcnR5IGlzIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHJ1biB0b1xuICogY29udGludWUgdmFsaWRhdGlvbiBhbmQgcmVjZWl2ZSBhbGwgdGhlIGZhaWx1cmVzIGluIHRoZSBkYXRhLlxuICovXG5jbGFzcyBTdHJ1Y3RFcnJvciBleHRlbmRzIFR5cGVFcnJvciB7XG4gICAgY29uc3RydWN0b3IoZmFpbHVyZSwgZmFpbHVyZXMpIHtcbiAgICAgICAgbGV0IGNhY2hlZDtcbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCBleHBsYW5hdGlvbiwgLi4ucmVzdCB9ID0gZmFpbHVyZTtcbiAgICAgICAgY29uc3QgeyBwYXRoIH0gPSBmYWlsdXJlO1xuICAgICAgICBjb25zdCBtc2cgPSBwYXRoLmxlbmd0aCA9PT0gMCA/IG1lc3NhZ2UgOiBgQXQgcGF0aDogJHtwYXRoLmpvaW4oJy4nKX0gLS0gJHttZXNzYWdlfWA7XG4gICAgICAgIHN1cGVyKGV4cGxhbmF0aW9uID8/IG1zZyk7XG4gICAgICAgIGlmIChleHBsYW5hdGlvbiAhPSBudWxsKVxuICAgICAgICAgICAgdGhpcy5jYXVzZSA9IG1zZztcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLCByZXN0KTtcbiAgICAgICAgdGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuICAgICAgICB0aGlzLmZhaWx1cmVzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChjYWNoZWQgPz8gKGNhY2hlZCA9IFtmYWlsdXJlLCAuLi5mYWlsdXJlcygpXSkpO1xuICAgICAgICB9O1xuICAgIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHZhbHVlIGlzIGFuIGl0ZXJhdG9yLlxuICovXG5mdW5jdGlvbiBpc0l0ZXJhYmxlKHgpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoeCkgJiYgdHlwZW9mIHhbU3ltYm9sLml0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJztcbn1cbi8qKlxuICogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QoeCkge1xuICAgIHJldHVybiB0eXBlb2YgeCA9PT0gJ29iamVjdCcgJiYgeCAhPSBudWxsO1xufVxuLyoqXG4gKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgbm9uLWFycmF5IG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNOb25BcnJheU9iamVjdCh4KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KHgpICYmICFBcnJheS5pc0FycmF5KHgpO1xufVxuLyoqXG4gKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHgpIHtcbiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpICE9PSAnW29iamVjdCBPYmplY3RdJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih4KTtcbiAgICByZXR1cm4gcHJvdG90eXBlID09PSBudWxsIHx8IHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZTtcbn1cbi8qKlxuICogUmV0dXJuIGEgdmFsdWUgYXMgYSBwcmludGFibGUgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBwcmludCh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IEpTT04uc3RyaW5naWZ5KHZhbHVlKSA6IGAke3ZhbHVlfWA7XG59XG4vKipcbiAqIFNoaWZ0cyAocmVtb3ZlcyBhbmQgcmV0dXJucykgdGhlIGZpcnN0IHZhbHVlIGZyb20gdGhlIGBpbnB1dGAgaXRlcmF0b3IuXG4gKiBMaWtlIGBBcnJheS5wcm90b3R5cGUuc2hpZnQoKWAgYnV0IGZvciBhbiBgSXRlcmF0b3JgLlxuICovXG5mdW5jdGlvbiBzaGlmdEl0ZXJhdG9yKGlucHV0KSB7XG4gICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gaW5wdXQubmV4dCgpO1xuICAgIHJldHVybiBkb25lID8gdW5kZWZpbmVkIDogdmFsdWU7XG59XG4vKipcbiAqIENvbnZlcnQgYSBzaW5nbGUgdmFsaWRhdGlvbiByZXN1bHQgdG8gYSBmYWlsdXJlLlxuICovXG5mdW5jdGlvbiB0b0ZhaWx1cmUocmVzdWx0LCBjb250ZXh0LCBzdHJ1Y3QsIHZhbHVlKSB7XG4gICAgaWYgKHJlc3VsdCA9PT0gdHJ1ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmVzdWx0ID0ge307XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlc3VsdCA9IHsgbWVzc2FnZTogcmVzdWx0IH07XG4gICAgfVxuICAgIGNvbnN0IHsgcGF0aCwgYnJhbmNoIH0gPSBjb250ZXh0O1xuICAgIGNvbnN0IHsgdHlwZSB9ID0gc3RydWN0O1xuICAgIGNvbnN0IHsgcmVmaW5lbWVudCwgbWVzc2FnZSA9IGBFeHBlY3RlZCBhIHZhbHVlIG9mIHR5cGUgXFxgJHt0eXBlfVxcYCR7cmVmaW5lbWVudCA/IGAgd2l0aCByZWZpbmVtZW50IFxcYCR7cmVmaW5lbWVudH1cXGBgIDogJyd9LCBidXQgcmVjZWl2ZWQ6IFxcYCR7cHJpbnQodmFsdWUpfVxcYGAsIH0gPSByZXN1bHQ7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHR5cGUsXG4gICAgICAgIHJlZmluZW1lbnQsXG4gICAgICAgIGtleTogcGF0aFtwYXRoLmxlbmd0aCAtIDFdLFxuICAgICAgICBwYXRoLFxuICAgICAgICBicmFuY2gsXG4gICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICB9O1xufVxuLyoqXG4gKiBDb252ZXJ0IGEgdmFsaWRhdGlvbiByZXN1bHQgdG8gYW4gaXRlcmFibGUgb2YgZmFpbHVyZXMuXG4gKi9cbmZ1bmN0aW9uKiB0b0ZhaWx1cmVzKHJlc3VsdCwgY29udGV4dCwgc3RydWN0LCB2YWx1ZSkge1xuICAgIGlmICghaXNJdGVyYWJsZShyZXN1bHQpKSB7XG4gICAgICAgIHJlc3VsdCA9IFtyZXN1bHRdO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHIgb2YgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IGZhaWx1cmUgPSB0b0ZhaWx1cmUociwgY29udGV4dCwgc3RydWN0LCB2YWx1ZSk7XG4gICAgICAgIGlmIChmYWlsdXJlKSB7XG4gICAgICAgICAgICB5aWVsZCBmYWlsdXJlO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBDaGVjayBhIHZhbHVlIGFnYWluc3QgYSBzdHJ1Y3QsIHRyYXZlcnNpbmcgZGVlcGx5IGludG8gbmVzdGVkIHZhbHVlcywgYW5kXG4gKiByZXR1cm5pbmcgYW4gaXRlcmF0b3Igb2YgZmFpbHVyZXMgb3Igc3VjY2Vzcy5cbiAqL1xuZnVuY3Rpb24qIHJ1bih2YWx1ZSwgc3RydWN0LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IHBhdGggPSBbXSwgYnJhbmNoID0gW3ZhbHVlXSwgY29lcmNlID0gZmFsc2UsIG1hc2sgPSBmYWxzZSB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBjdHggPSB7IHBhdGgsIGJyYW5jaCwgbWFzayB9O1xuICAgIGlmIChjb2VyY2UpIHtcbiAgICAgICAgdmFsdWUgPSBzdHJ1Y3QuY29lcmNlcih2YWx1ZSwgY3R4KTtcbiAgICB9XG4gICAgbGV0IHN0YXR1cyA9ICd2YWxpZCc7XG4gICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIHN0cnVjdC52YWxpZGF0b3IodmFsdWUsIGN0eCkpIHtcbiAgICAgICAgZmFpbHVyZS5leHBsYW5hdGlvbiA9IG9wdGlvbnMubWVzc2FnZTtcbiAgICAgICAgc3RhdHVzID0gJ25vdF92YWxpZCc7XG4gICAgICAgIHlpZWxkIFtmYWlsdXJlLCB1bmRlZmluZWRdO1xuICAgIH1cbiAgICBmb3IgKGxldCBbaywgdiwgc10gb2Ygc3RydWN0LmVudHJpZXModmFsdWUsIGN0eCkpIHtcbiAgICAgICAgY29uc3QgdHMgPSBydW4odiwgcywge1xuICAgICAgICAgICAgcGF0aDogayA9PT0gdW5kZWZpbmVkID8gcGF0aCA6IFsuLi5wYXRoLCBrXSxcbiAgICAgICAgICAgIGJyYW5jaDogayA9PT0gdW5kZWZpbmVkID8gYnJhbmNoIDogWy4uLmJyYW5jaCwgdl0sXG4gICAgICAgICAgICBjb2VyY2UsXG4gICAgICAgICAgICBtYXNrLFxuICAgICAgICAgICAgbWVzc2FnZTogb3B0aW9ucy5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCB0IG9mIHRzKSB7XG4gICAgICAgICAgICBpZiAodFswXSkge1xuICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRbMF0ucmVmaW5lbWVudCAhPSBudWxsID8gJ25vdF9yZWZpbmVkJyA6ICdub3RfdmFsaWQnO1xuICAgICAgICAgICAgICAgIHlpZWxkIFt0WzBdLCB1bmRlZmluZWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY29lcmNlKSB7XG4gICAgICAgICAgICAgICAgdiA9IHRbMV07XG4gICAgICAgICAgICAgICAgaWYgKGsgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHY7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLnNldChrLCB2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuYWRkKHYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IHVuZGVmaW5lZCB8fCBrIGluIHZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVba10gPSB2O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhdHVzICE9PSAnbm90X3ZhbGlkJykge1xuICAgICAgICBmb3IgKGNvbnN0IGZhaWx1cmUgb2Ygc3RydWN0LnJlZmluZXIodmFsdWUsIGN0eCkpIHtcbiAgICAgICAgICAgIGZhaWx1cmUuZXhwbGFuYXRpb24gPSBvcHRpb25zLm1lc3NhZ2U7XG4gICAgICAgICAgICBzdGF0dXMgPSAnbm90X3JlZmluZWQnO1xuICAgICAgICAgICAgeWllbGQgW2ZhaWx1cmUsIHVuZGVmaW5lZF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gJ3ZhbGlkJykge1xuICAgICAgICB5aWVsZCBbdW5kZWZpbmVkLCB2YWx1ZV07XG4gICAgfVxufVxuXG4vKipcbiAqIGBTdHJ1Y3RgIG9iamVjdHMgZW5jYXBzdWxhdGUgdGhlIHZhbGlkYXRpb24gbG9naWMgZm9yIGEgc3BlY2lmaWMgdHlwZSBvZlxuICogdmFsdWVzLiBPbmNlIGNvbnN0cnVjdGVkLCB5b3UgdXNlIHRoZSBgYXNzZXJ0YCwgYGlzYCBvciBgdmFsaWRhdGVgIGhlbHBlcnMgdG9cbiAqIHZhbGlkYXRlIHVua25vd24gaW5wdXQgZGF0YSBhZ2FpbnN0IHRoZSBzdHJ1Y3QuXG4gKi9cbmNsYXNzIFN0cnVjdCB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgY29uc3QgeyB0eXBlLCBzY2hlbWEsIHZhbGlkYXRvciwgcmVmaW5lciwgY29lcmNlciA9ICh2YWx1ZSkgPT4gdmFsdWUsIGVudHJpZXMgPSBmdW5jdGlvbiogKCkgeyB9LCB9ID0gcHJvcHM7XG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hO1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBlbnRyaWVzO1xuICAgICAgICB0aGlzLmNvZXJjZXIgPSBjb2VyY2VyO1xuICAgICAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICAgICAgICB0aGlzLnZhbGlkYXRvciA9ICh2YWx1ZSwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRvcih2YWx1ZSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvRmFpbHVyZXMocmVzdWx0LCBjb250ZXh0LCB0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy52YWxpZGF0b3IgPSAoKSA9PiBbXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmaW5lcikge1xuICAgICAgICAgICAgdGhpcy5yZWZpbmVyID0gKHZhbHVlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVmaW5lcih2YWx1ZSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRvRmFpbHVyZXMocmVzdWx0LCBjb250ZXh0LCB0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZWZpbmVyID0gKCkgPT4gW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQXNzZXJ0IHRoYXQgYSB2YWx1ZSBwYXNzZXMgdGhlIHN0cnVjdCdzIHZhbGlkYXRpb24sIHRocm93aW5nIGlmIGl0IGRvZXNuJ3QuXG4gICAgICovXG4gICAgYXNzZXJ0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBhc3NlcnQodmFsdWUsIHRoaXMsIG1lc3NhZ2UpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSB2YWx1ZSB3aXRoIHRoZSBzdHJ1Y3QncyBjb2VyY2lvbiBsb2dpYywgdGhlbiB2YWxpZGF0ZSBpdC5cbiAgICAgKi9cbiAgICBjcmVhdGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZSh2YWx1ZSwgdGhpcywgbWVzc2FnZSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIGEgdmFsdWUgcGFzc2VzIHRoZSBzdHJ1Y3QncyB2YWxpZGF0aW9uLlxuICAgICAqL1xuICAgIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpcyh2YWx1ZSwgdGhpcyk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIE1hc2sgYSB2YWx1ZSwgY29lcmNpbmcgYW5kIHZhbGlkYXRpbmcgaXQsIGJ1dCByZXR1cm5pbmcgb25seSB0aGUgc3Vic2V0IG9mXG4gICAgICogcHJvcGVydGllcyBkZWZpbmVkIGJ5IHRoZSBzdHJ1Y3QncyBzY2hlbWEuIE1hc2tpbmcgYXBwbGllcyByZWN1cnNpdmVseSB0b1xuICAgICAqIHByb3BzIG9mIGBvYmplY3RgIHN0cnVjdHMgb25seS5cbiAgICAgKi9cbiAgICBtYXNrKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBtYXNrKHZhbHVlLCB0aGlzLCBtZXNzYWdlKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVmFsaWRhdGUgYSB2YWx1ZSB3aXRoIHRoZSBzdHJ1Y3QncyB2YWxpZGF0aW9uIGxvZ2ljLCByZXR1cm5pbmcgYSB0dXBsZVxuICAgICAqIHJlcHJlc2VudGluZyB0aGUgcmVzdWx0LlxuICAgICAqXG4gICAgICogWW91IG1heSBvcHRpb25hbGx5IHBhc3MgYHRydWVgIGZvciB0aGUgYGNvZXJjZWAgYXJndW1lbnQgdG8gY29lcmNlXG4gICAgICogdGhlIHZhbHVlIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHZhbGlkYXRlIGl0LiBJZiB5b3UgZG8sIHRoZSByZXN1bHQgd2lsbFxuICAgICAqIGNvbnRhaW4gdGhlIGNvZXJjZWQgcmVzdWx0IHdoZW4gc3VjY2Vzc2Z1bC4gQWxzbywgYG1hc2tgIHdpbGwgdHVybiBvblxuICAgICAqIG1hc2tpbmcgb2YgdGhlIHVua25vd24gYG9iamVjdGAgcHJvcHMgcmVjdXJzaXZlbHkgaWYgcGFzc2VkLlxuICAgICAqL1xuICAgIHZhbGlkYXRlKHZhbHVlLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlKHZhbHVlLCB0aGlzLCBvcHRpb25zKTtcbiAgICB9XG59XG4vKipcbiAqIEFzc2VydCB0aGF0IGEgdmFsdWUgcGFzc2VzIGEgc3RydWN0LCB0aHJvd2luZyBpZiBpdCBkb2Vzbid0LlxuICovXG5mdW5jdGlvbiBhc3NlcnQodmFsdWUsIHN0cnVjdCwgbWVzc2FnZSkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlKHZhbHVlLCBzdHJ1Y3QsIHsgbWVzc2FnZSB9KTtcbiAgICBpZiAocmVzdWx0WzBdKSB7XG4gICAgICAgIHRocm93IHJlc3VsdFswXTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZSBhIHZhbHVlIHdpdGggdGhlIGNvZXJjaW9uIGxvZ2ljIG9mIHN0cnVjdCBhbmQgdmFsaWRhdGUgaXQuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZSh2YWx1ZSwgc3RydWN0LCBtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGUodmFsdWUsIHN0cnVjdCwgeyBjb2VyY2U6IHRydWUsIG1lc3NhZ2UgfSk7XG4gICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICB0aHJvdyByZXN1bHRbMF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzdWx0WzFdO1xuICAgIH1cbn1cbi8qKlxuICogTWFzayBhIHZhbHVlLCByZXR1cm5pbmcgb25seSB0aGUgc3Vic2V0IG9mIHByb3BlcnRpZXMgZGVmaW5lZCBieSBhIHN0cnVjdC5cbiAqL1xuZnVuY3Rpb24gbWFzayh2YWx1ZSwgc3RydWN0LCBtZXNzYWdlKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdmFsaWRhdGUodmFsdWUsIHN0cnVjdCwgeyBjb2VyY2U6IHRydWUsIG1hc2s6IHRydWUsIG1lc3NhZ2UgfSk7XG4gICAgaWYgKHJlc3VsdFswXSkge1xuICAgICAgICB0aHJvdyByZXN1bHRbMF07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzdWx0WzFdO1xuICAgIH1cbn1cbi8qKlxuICogQ2hlY2sgaWYgYSB2YWx1ZSBwYXNzZXMgYSBzdHJ1Y3QuXG4gKi9cbmZ1bmN0aW9uIGlzKHZhbHVlLCBzdHJ1Y3QpIHtcbiAgICBjb25zdCByZXN1bHQgPSB2YWxpZGF0ZSh2YWx1ZSwgc3RydWN0KTtcbiAgICByZXR1cm4gIXJlc3VsdFswXTtcbn1cbi8qKlxuICogVmFsaWRhdGUgYSB2YWx1ZSBhZ2FpbnN0IGEgc3RydWN0LCByZXR1cm5pbmcgYW4gZXJyb3IgaWYgaW52YWxpZCwgb3IgdGhlXG4gKiB2YWx1ZSAod2l0aCBwb3RlbnRpYWwgY29lcmNpb24pIGlmIHZhbGlkLlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZSh2YWx1ZSwgc3RydWN0LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB0dXBsZXMgPSBydW4odmFsdWUsIHN0cnVjdCwgb3B0aW9ucyk7XG4gICAgY29uc3QgdHVwbGUgPSBzaGlmdEl0ZXJhdG9yKHR1cGxlcyk7XG4gICAgaWYgKHR1cGxlWzBdKSB7XG4gICAgICAgIGNvbnN0IGVycm9yID0gbmV3IFN0cnVjdEVycm9yKHR1cGxlWzBdLCBmdW5jdGlvbiogKCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB0IG9mIHR1cGxlcykge1xuICAgICAgICAgICAgICAgIGlmICh0WzBdKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIHRbMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIFtlcnJvciwgdW5kZWZpbmVkXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHYgPSB0dXBsZVsxXTtcbiAgICAgICAgcmV0dXJuIFt1bmRlZmluZWQsIHZdO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYXNzaWduKC4uLlN0cnVjdHMpIHtcbiAgICBjb25zdCBpc1R5cGUgPSBTdHJ1Y3RzWzBdLnR5cGUgPT09ICd0eXBlJztcbiAgICBjb25zdCBzY2hlbWFzID0gU3RydWN0cy5tYXAoKHMpID0+IHMuc2NoZW1hKTtcbiAgICBjb25zdCBzY2hlbWEgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zY2hlbWFzKTtcbiAgICByZXR1cm4gaXNUeXBlID8gdHlwZShzY2hlbWEpIDogb2JqZWN0KHNjaGVtYSk7XG59XG4vKipcbiAqIERlZmluZSBhIG5ldyBzdHJ1Y3QgdHlwZSB3aXRoIGEgY3VzdG9tIHZhbGlkYXRpb24gZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGRlZmluZShuYW1lLCB2YWxpZGF0b3IpIHtcbiAgICByZXR1cm4gbmV3IFN0cnVjdCh7IHR5cGU6IG5hbWUsIHNjaGVtYTogbnVsbCwgdmFsaWRhdG9yIH0pO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgc3RydWN0IGJhc2VkIG9uIGFuIGV4aXN0aW5nIHN0cnVjdCwgYnV0IHRoZSB2YWx1ZSBpcyBhbGxvd2VkIHRvXG4gKiBiZSBgdW5kZWZpbmVkYC4gYGxvZ2Agd2lsbCBiZSBjYWxsZWQgaWYgdGhlIHZhbHVlIGlzIG5vdCBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gZGVwcmVjYXRlZChzdHJ1Y3QsIGxvZykge1xuICAgIHJldHVybiBuZXcgU3RydWN0KHtcbiAgICAgICAgLi4uc3RydWN0LFxuICAgICAgICByZWZpbmVyOiAodmFsdWUsIGN0eCkgPT4gdmFsdWUgPT09IHVuZGVmaW5lZCB8fCBzdHJ1Y3QucmVmaW5lcih2YWx1ZSwgY3R4KSxcbiAgICAgICAgdmFsaWRhdG9yKHZhbHVlLCBjdHgpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2codmFsdWUsIGN0eCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cnVjdC52YWxpZGF0b3IodmFsdWUsIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIENyZWF0ZSBhIHN0cnVjdCB3aXRoIGR5bmFtaWMgdmFsaWRhdGlvbiBsb2dpYy5cbiAqXG4gKiBUaGUgY2FsbGJhY2sgd2lsbCByZWNlaXZlIHRoZSB2YWx1ZSBjdXJyZW50bHkgYmVpbmcgdmFsaWRhdGVkLCBhbmQgbXVzdFxuICogcmV0dXJuIGEgc3RydWN0IG9iamVjdCB0byB2YWxpZGF0ZSBpdCB3aXRoLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gbW9kZWxcbiAqIHZhbGlkYXRpb24gbG9naWMgdGhhdCBjaGFuZ2VzIGJhc2VkIG9uIGl0cyBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gZHluYW1pYyhmbikge1xuICAgIHJldHVybiBuZXcgU3RydWN0KHtcbiAgICAgICAgdHlwZTogJ2R5bmFtaWMnLFxuICAgICAgICBzY2hlbWE6IG51bGwsXG4gICAgICAgICplbnRyaWVzKHZhbHVlLCBjdHgpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0cnVjdCA9IGZuKHZhbHVlLCBjdHgpO1xuICAgICAgICAgICAgeWllbGQqIHN0cnVjdC5lbnRyaWVzKHZhbHVlLCBjdHgpO1xuICAgICAgICB9LFxuICAgICAgICB2YWxpZGF0b3IodmFsdWUsIGN0eCkge1xuICAgICAgICAgICAgY29uc3Qgc3RydWN0ID0gZm4odmFsdWUsIGN0eCk7XG4gICAgICAgICAgICByZXR1cm4gc3RydWN0LnZhbGlkYXRvcih2YWx1ZSwgY3R4KTtcbiAgICAgICAgfSxcbiAgICAgICAgY29lcmNlcih2YWx1ZSwgY3R4KSB7XG4gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgPSBmbih2YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIHJldHVybiBzdHJ1Y3QuY29lcmNlcih2YWx1ZSwgY3R4KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmaW5lcih2YWx1ZSwgY3R4KSB7XG4gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgPSBmbih2YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIHJldHVybiBzdHJ1Y3QucmVmaW5lcih2YWx1ZSwgY3R4KTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogQ3JlYXRlIGEgc3RydWN0IHdpdGggbGF6aWx5IGV2YWx1YXRlZCB2YWxpZGF0aW9uIGxvZ2ljLlxuICpcbiAqIFRoZSBmaXJzdCB0aW1lIHZhbGlkYXRpb24gaXMgcnVuIHdpdGggdGhlIHN0cnVjdCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkXG4gKiBhbmQgbXVzdCByZXR1cm4gYSBzdHJ1Y3Qgb2JqZWN0IHRvIHVzZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGNhc2VzIHdoZXJlIHlvdVxuICogd2FudCB0byBoYXZlIHNlbGYtcmVmZXJlbnRpYWwgc3RydWN0cyBmb3IgbmVzdGVkIGRhdGEgc3RydWN0dXJlcyB0byBhdm9pZCBhXG4gKiBjaXJjdWxhciBkZWZpbml0aW9uIHByb2JsZW0uXG4gKi9cbmZ1bmN0aW9uIGxhenkoZm4pIHtcbiAgICBsZXQgc3RydWN0O1xuICAgIHJldHVybiBuZXcgU3RydWN0KHtcbiAgICAgICAgdHlwZTogJ2xhenknLFxuICAgICAgICBzY2hlbWE6IG51bGwsXG4gICAgICAgICplbnRyaWVzKHZhbHVlLCBjdHgpIHtcbiAgICAgICAgICAgIHN0cnVjdCA/PyAoc3RydWN0ID0gZm4oKSk7XG4gICAgICAgICAgICB5aWVsZCogc3RydWN0LmVudHJpZXModmFsdWUsIGN0eCk7XG4gICAgICAgIH0sXG4gICAgICAgIHZhbGlkYXRvcih2YWx1ZSwgY3R4KSB7XG4gICAgICAgICAgICBzdHJ1Y3QgPz8gKHN0cnVjdCA9IGZuKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHN0cnVjdC52YWxpZGF0b3IodmFsdWUsIGN0eCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvZXJjZXIodmFsdWUsIGN0eCkge1xuICAgICAgICAgICAgc3RydWN0ID8/IChzdHJ1Y3QgPSBmbigpKTtcbiAgICAgICAgICAgIHJldHVybiBzdHJ1Y3QuY29lcmNlcih2YWx1ZSwgY3R4KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVmaW5lcih2YWx1ZSwgY3R4KSB7XG4gICAgICAgICAgICBzdHJ1Y3QgPz8gKHN0cnVjdCA9IGZuKCkpO1xuICAgICAgICAgICAgcmV0dXJuIHN0cnVjdC5yZWZpbmVyKHZhbHVlLCBjdHgpO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgc3RydWN0IGJhc2VkIG9uIGFuIGV4aXN0aW5nIG9iamVjdCBzdHJ1Y3QsIGJ1dCBleGNsdWRpbmdcbiAqIHNwZWNpZmljIHByb3BlcnRpZXMuXG4gKlxuICogTGlrZSBUeXBlU2NyaXB0J3MgYE9taXRgIHV0aWxpdHkuXG4gKi9cbmZ1bmN0aW9uIG9taXQoc3RydWN0LCBrZXlzKSB7XG4gICAgY29uc3QgeyBzY2hlbWEgfSA9IHN0cnVjdDtcbiAgICBjb25zdCBzdWJzY2hlbWEgPSB7IC4uLnNjaGVtYSB9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgZGVsZXRlIHN1YnNjaGVtYVtrZXldO1xuICAgIH1cbiAgICBzd2l0Y2ggKHN0cnVjdC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3R5cGUnOlxuICAgICAgICAgICAgcmV0dXJuIHR5cGUoc3Vic2NoZW1hKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBvYmplY3Qoc3Vic2NoZW1hKTtcbiAgICB9XG59XG4vKipcbiAqIENyZWF0ZSBhIG5ldyBzdHJ1Y3QgYmFzZWQgb24gYW4gZXhpc3Rpbmcgb2JqZWN0IHN0cnVjdCwgYnV0IHdpdGggYWxsIG9mIGl0c1xuICogcHJvcGVydGllcyBhbGxvd2VkIHRvIGJlIGB1bmRlZmluZWRgLlxuICpcbiAqIExpa2UgVHlwZVNjcmlwdCdzIGBQYXJ0aWFsYCB1dGlsaXR5LlxuICovXG5mdW5jdGlvbiBwYXJ0aWFsKHN0cnVjdCkge1xuICAgIGNvbnN0IGlzU3RydWN0ID0gc3RydWN0IGluc3RhbmNlb2YgU3RydWN0O1xuICAgIGNvbnN0IHNjaGVtYSA9IGlzU3RydWN0ID8geyAuLi5zdHJ1Y3Quc2NoZW1hIH0gOiB7IC4uLnN0cnVjdCB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIHNjaGVtYSkge1xuICAgICAgICBzY2hlbWFba2V5XSA9IG9wdGlvbmFsKHNjaGVtYVtrZXldKTtcbiAgICB9XG4gICAgaWYgKGlzU3RydWN0ICYmIHN0cnVjdC50eXBlID09PSAndHlwZScpIHtcbiAgICAgICAgcmV0dXJuIHR5cGUoc2NoZW1hKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdChzY2hlbWEpO1xufVxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgc3RydWN0IGJhc2VkIG9uIGFuIGV4aXN0aW5nIG9iamVjdCBzdHJ1Y3QsIGJ1dCBvbmx5IGluY2x1ZGluZ1xuICogc3BlY2lmaWMgcHJvcGVydGllcy5cbiAqXG4gKiBMaWtlIFR5cGVTY3JpcHQncyBgUGlja2AgdXRpbGl0eS5cbiAqL1xuZnVuY3Rpb24gcGljayhzdHJ1Y3QsIGtleXMpIHtcbiAgICBjb25zdCB7IHNjaGVtYSB9ID0gc3RydWN0O1xuICAgIGNvbnN0IHN1YnNjaGVtYSA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgc3Vic2NoZW1hW2tleV0gPSBzY2hlbWFba2V5XTtcbiAgICB9XG4gICAgc3dpdGNoIChzdHJ1Y3QudHlwZSkge1xuICAgICAgICBjYXNlICd0eXBlJzpcbiAgICAgICAgICAgIHJldHVybiB0eXBlKHN1YnNjaGVtYSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gb2JqZWN0KHN1YnNjaGVtYSk7XG4gICAgfVxufVxuLyoqXG4gKiBEZWZpbmUgYSBuZXcgc3RydWN0IHR5cGUgd2l0aCBhIGN1c3RvbSB2YWxpZGF0aW9uIGZ1bmN0aW9uLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gcmVuYW1lZCB0byBgZGVmaW5lYC5cbiAqL1xuZnVuY3Rpb24gc3RydWN0KG5hbWUsIHZhbGlkYXRvcikge1xuICAgIGNvbnNvbGUud2Fybignc3VwZXJzdHJ1Y3RAMC4xMSAtIFRoZSBgc3RydWN0YCBoZWxwZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBgZGVmaW5lYC4nKTtcbiAgICByZXR1cm4gZGVmaW5lKG5hbWUsIHZhbGlkYXRvcik7XG59XG5cbi8qKlxuICogRW5zdXJlIHRoYXQgYW55IHZhbHVlIHBhc3NlcyB2YWxpZGF0aW9uLlxuICovXG5mdW5jdGlvbiBhbnkoKSB7XG4gICAgcmV0dXJuIGRlZmluZSgnYW55JywgKCkgPT4gdHJ1ZSk7XG59XG5mdW5jdGlvbiBhcnJheShFbGVtZW50KSB7XG4gICAgcmV0dXJuIG5ldyBTdHJ1Y3Qoe1xuICAgICAgICB0eXBlOiAnYXJyYXknLFxuICAgICAgICBzY2hlbWE6IEVsZW1lbnQsXG4gICAgICAgICplbnRyaWVzKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoRWxlbWVudCAmJiBBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ksIHZdIG9mIHZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBbaSwgdiwgRWxlbWVudF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb2VyY2VyKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5zbGljZSgpIDogdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHZhbGlkYXRvcih2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIChBcnJheS5pc0FycmF5KHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBhbiBhcnJheSB2YWx1ZSwgYnV0IHJlY2VpdmVkOiAke3ByaW50KHZhbHVlKX1gKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgYSB2YWx1ZSBpcyBhIGJpZ2ludC5cbiAqL1xuZnVuY3Rpb24gYmlnaW50KCkge1xuICAgIHJldHVybiBkZWZpbmUoJ2JpZ2ludCcsICh2YWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYmlnaW50JztcbiAgICB9KTtcbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgYSB2YWx1ZSBpcyBhIGJvb2xlYW4uXG4gKi9cbmZ1bmN0aW9uIGJvb2xlYW4oKSB7XG4gICAgcmV0dXJuIGRlZmluZSgnYm9vbGVhbicsICh2YWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGEgdmFsdWUgaXMgYSB2YWxpZCBgRGF0ZWAuXG4gKlxuICogTm90ZTogdGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgdmFsdWUgaXMgKm5vdCogYW4gaW52YWxpZCBgRGF0ZWAgb2JqZWN0LFxuICogd2hpY2ggY2FuIG9jY3VyIHdoZW4gcGFyc2luZyBhIGRhdGUgZmFpbHMgYnV0IHN0aWxsIHJldHVybnMgYSBgRGF0ZWAuXG4gKi9cbmZ1bmN0aW9uIGRhdGUoKSB7XG4gICAgcmV0dXJuIGRlZmluZSgnZGF0ZScsICh2YWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4gKCh2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlLmdldFRpbWUoKSkpIHx8XG4gICAgICAgICAgICBgRXhwZWN0ZWQgYSB2YWxpZCBcXGBEYXRlXFxgIG9iamVjdCwgYnV0IHJlY2VpdmVkOiAke3ByaW50KHZhbHVlKX1gKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGVudW1zKHZhbHVlcykge1xuICAgIGNvbnN0IHNjaGVtYSA9IHt9O1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gdmFsdWVzLm1hcCgodikgPT4gcHJpbnQodikpLmpvaW4oKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgc2NoZW1hW2tleV0gPSBrZXk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU3RydWN0KHtcbiAgICAgICAgdHlwZTogJ2VudW1zJyxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICB2YWxpZGF0b3IodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAodmFsdWVzLmluY2x1ZGVzKHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBvbmUgb2YgXFxgJHtkZXNjcmlwdGlvbn1cXGAsIGJ1dCByZWNlaXZlZDogJHtwcmludCh2YWx1ZSl9YCk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGEgdmFsdWUgaXMgYSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gZnVuYygpIHtcbiAgICByZXR1cm4gZGVmaW5lKCdmdW5jJywgKHZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBgRXhwZWN0ZWQgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkOiAke3ByaW50KHZhbHVlKX1gKTtcbiAgICB9KTtcbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgYSB2YWx1ZSBpcyBhbiBpbnN0YW5jZSBvZiBhIHNwZWNpZmljIGNsYXNzLlxuICovXG5mdW5jdGlvbiBpbnN0YW5jZShDbGFzcykge1xuICAgIHJldHVybiBkZWZpbmUoJ2luc3RhbmNlJywgKHZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiAodmFsdWUgaW5zdGFuY2VvZiBDbGFzcyB8fFxuICAgICAgICAgICAgYEV4cGVjdGVkIGEgXFxgJHtDbGFzcy5uYW1lfVxcYCBpbnN0YW5jZSwgYnV0IHJlY2VpdmVkOiAke3ByaW50KHZhbHVlKX1gKTtcbiAgICB9KTtcbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgYSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLlxuICovXG5mdW5jdGlvbiBpbnRlZ2VyKCkge1xuICAgIHJldHVybiBkZWZpbmUoJ2ludGVnZXInLCAodmFsdWUpID0+IHtcbiAgICAgICAgcmV0dXJuICgodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpICYmIE51bWJlci5pc0ludGVnZXIodmFsdWUpKSB8fFxuICAgICAgICAgICAgYEV4cGVjdGVkIGFuIGludGVnZXIsIGJ1dCByZWNlaXZlZDogJHtwcmludCh2YWx1ZSl9YCk7XG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGEgdmFsdWUgbWF0Y2hlcyBhbGwgb2YgYSBzZXQgb2YgdHlwZXMuXG4gKi9cbmZ1bmN0aW9uIGludGVyc2VjdGlvbihTdHJ1Y3RzKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJ1Y3Qoe1xuICAgICAgICB0eXBlOiAnaW50ZXJzZWN0aW9uJyxcbiAgICAgICAgc2NoZW1hOiBudWxsLFxuICAgICAgICAqZW50cmllcyh2YWx1ZSwgY3R4KSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFMgb2YgU3RydWN0cykge1xuICAgICAgICAgICAgICAgIHlpZWxkKiBTLmVudHJpZXModmFsdWUsIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICp2YWxpZGF0b3IodmFsdWUsIGN0eCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBTIG9mIFN0cnVjdHMpIHtcbiAgICAgICAgICAgICAgICB5aWVsZCogUy52YWxpZGF0b3IodmFsdWUsIGN0eCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICpyZWZpbmVyKHZhbHVlLCBjdHgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgUyBvZiBTdHJ1Y3RzKSB7XG4gICAgICAgICAgICAgICAgeWllbGQqIFMucmVmaW5lcih2YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGxpdGVyYWwoY29uc3RhbnQpIHtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHByaW50KGNvbnN0YW50KTtcbiAgICBjb25zdCB0ID0gdHlwZW9mIGNvbnN0YW50O1xuICAgIHJldHVybiBuZXcgU3RydWN0KHtcbiAgICAgICAgdHlwZTogJ2xpdGVyYWwnLFxuICAgICAgICBzY2hlbWE6IHQgPT09ICdzdHJpbmcnIHx8IHQgPT09ICdudW1iZXInIHx8IHQgPT09ICdib29sZWFuJyA/IGNvbnN0YW50IDogbnVsbCxcbiAgICAgICAgdmFsaWRhdG9yKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHZhbHVlID09PSBjb25zdGFudCB8fFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCB0aGUgbGl0ZXJhbCBcXGAke2Rlc2NyaXB0aW9ufVxcYCwgYnV0IHJlY2VpdmVkOiAke3ByaW50KHZhbHVlKX1gKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG1hcChLZXksIFZhbHVlKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJ1Y3Qoe1xuICAgICAgICB0eXBlOiAnbWFwJyxcbiAgICAgICAgc2NoZW1hOiBudWxsLFxuICAgICAgICAqZW50cmllcyh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKEtleSAmJiBWYWx1ZSAmJiB2YWx1ZSBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIHZhbHVlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBbaywgaywgS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgW2ssIHYsIFZhbHVlXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvZXJjZXIodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIE1hcCA/IG5ldyBNYXAodmFsdWUpIDogdmFsdWU7XG4gICAgICAgIH0sXG4gICAgICAgIHZhbGlkYXRvcih2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mIE1hcCB8fFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBhIFxcYE1hcFxcYCBvYmplY3QsIGJ1dCByZWNlaXZlZDogJHtwcmludCh2YWx1ZSl9YCk7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IG5vIHZhbHVlIGV2ZXIgcGFzc2VzIHZhbGlkYXRpb24uXG4gKi9cbmZ1bmN0aW9uIG5ldmVyKCkge1xuICAgIHJldHVybiBkZWZpbmUoJ25ldmVyJywgKCkgPT4gZmFsc2UpO1xufVxuLyoqXG4gKiBBdWdtZW50IGFuIGV4aXN0aW5nIHN0cnVjdCB0byBhbGxvdyBgbnVsbGAgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBudWxsYWJsZShzdHJ1Y3QpIHtcbiAgICByZXR1cm4gbmV3IFN0cnVjdCh7XG4gICAgICAgIC4uLnN0cnVjdCxcbiAgICAgICAgdmFsaWRhdG9yOiAodmFsdWUsIGN0eCkgPT4gdmFsdWUgPT09IG51bGwgfHwgc3RydWN0LnZhbGlkYXRvcih2YWx1ZSwgY3R4KSxcbiAgICAgICAgcmVmaW5lcjogKHZhbHVlLCBjdHgpID0+IHZhbHVlID09PSBudWxsIHx8IHN0cnVjdC5yZWZpbmVyKHZhbHVlLCBjdHgpLFxuICAgIH0pO1xufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBhIHZhbHVlIGlzIGEgbnVtYmVyLlxuICovXG5mdW5jdGlvbiBudW1iZXIoKSB7XG4gICAgcmV0dXJuIGRlZmluZSgnbnVtYmVyJywgKHZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiAoKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgIWlzTmFOKHZhbHVlKSkgfHxcbiAgICAgICAgICAgIGBFeHBlY3RlZCBhIG51bWJlciwgYnV0IHJlY2VpdmVkOiAke3ByaW50KHZhbHVlKX1gKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIG9iamVjdChzY2hlbWEpIHtcbiAgICBjb25zdCBrbm93bnMgPSBzY2hlbWEgPyBPYmplY3Qua2V5cyhzY2hlbWEpIDogW107XG4gICAgY29uc3QgTmV2ZXIgPSBuZXZlcigpO1xuICAgIHJldHVybiBuZXcgU3RydWN0KHtcbiAgICAgICAgdHlwZTogJ29iamVjdCcsXG4gICAgICAgIHNjaGVtYTogc2NoZW1hID8gc2NoZW1hIDogbnVsbCxcbiAgICAgICAgKmVudHJpZXModmFsdWUpIHtcbiAgICAgICAgICAgIGlmIChzY2hlbWEgJiYgaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5rbm93bnMgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga25vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgIHVua25vd25zLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBba2V5LCB2YWx1ZVtrZXldLCBzY2hlbWFba2V5XV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHVua25vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIFtrZXksIHZhbHVlW2tleV0sIE5ldmVyXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHZhbGlkYXRvcih2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIChpc05vbkFycmF5T2JqZWN0KHZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBhbiBvYmplY3QsIGJ1dCByZWNlaXZlZDogJHtwcmludCh2YWx1ZSl9YCk7XG4gICAgICAgIH0sXG4gICAgICAgIGNvZXJjZXIodmFsdWUsIGN0eCkge1xuICAgICAgICAgICAgaWYgKCFpc05vbkFycmF5T2JqZWN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNvZXJjZWQgPSB7IC4uLnZhbHVlIH07XG4gICAgICAgICAgICAvLyBUaGUgYG9iamVjdGAgc3RydWN0IGhhcyBzcGVjaWFsIGJlaGF2aW91ciBlbmFibGVkIGJ5IHRoZSBtYXNrIGZsYWcuXG4gICAgICAgICAgICAvLyBXaGVuIG1hc2tpbmcsIHByb3BlcnRpZXMgdGhhdCBhcmUgbm90IGluIHRoZSBzY2hlbWEgYXJlIGRlbGV0ZWQgZnJvbVxuICAgICAgICAgICAgLy8gdGhlIGNvZXJjZWQgb2JqZWN0IGluc3RlYWQgb2YgZXZlbnR1YWxseSBmYWlsaW5nIHZhbGlkYWl0b24uXG4gICAgICAgICAgICBpZiAoY3R4Lm1hc2sgJiYgc2NoZW1hKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY29lcmNlZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZW1hW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvZXJjZWRba2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb2VyY2VkO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuLyoqXG4gKiBBdWdtZW50IGEgc3RydWN0IHRvIGFsbG93IGB1bmRlZmluZWRgIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gb3B0aW9uYWwoc3RydWN0KSB7XG4gICAgcmV0dXJuIG5ldyBTdHJ1Y3Qoe1xuICAgICAgICAuLi5zdHJ1Y3QsXG4gICAgICAgIHZhbGlkYXRvcjogKHZhbHVlLCBjdHgpID0+IHZhbHVlID09PSB1bmRlZmluZWQgfHwgc3RydWN0LnZhbGlkYXRvcih2YWx1ZSwgY3R4KSxcbiAgICAgICAgcmVmaW5lcjogKHZhbHVlLCBjdHgpID0+IHZhbHVlID09PSB1bmRlZmluZWQgfHwgc3RydWN0LnJlZmluZXIodmFsdWUsIGN0eCksXG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGEgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGgga2V5cyBhbmQgdmFsdWVzIG9mIHNwZWNpZmljIHR5cGVzLCBidXRcbiAqIHdpdGhvdXQgZW5zdXJpbmcgYW55IHNwZWNpZmljIHNoYXBlIG9mIHByb3BlcnRpZXMuXG4gKlxuICogTGlrZSBUeXBlU2NyaXB0J3MgYFJlY29yZGAgdXRpbGl0eS5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkKEtleSwgVmFsdWUpIHtcbiAgICByZXR1cm4gbmV3IFN0cnVjdCh7XG4gICAgICAgIHR5cGU6ICdyZWNvcmQnLFxuICAgICAgICBzY2hlbWE6IG51bGwsXG4gICAgICAgICplbnRyaWVzKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrIGluIHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHYgPSB2YWx1ZVtrXTtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgW2ssIGssIEtleV07XG4gICAgICAgICAgICAgICAgICAgIHlpZWxkIFtrLCB2LCBWYWx1ZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB2YWxpZGF0b3IodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiAoaXNOb25BcnJheU9iamVjdCh2YWx1ZSkgfHxcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgYW4gb2JqZWN0LCBidXQgcmVjZWl2ZWQ6ICR7cHJpbnQodmFsdWUpfWApO1xuICAgICAgICB9LFxuICAgICAgICBjb2VyY2VyKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNOb25BcnJheU9iamVjdCh2YWx1ZSkgPyB7IC4uLnZhbHVlIH0gOiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgYSB2YWx1ZSBpcyBhIGBSZWdFeHBgLlxuICpcbiAqIE5vdGU6IHRoaXMgZG9lcyBub3QgdGVzdCB0aGUgdmFsdWUgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uISBGb3IgdGhhdFxuICogeW91IG5lZWQgdG8gdXNlIHRoZSBgcGF0dGVybigpYCByZWZpbmVtZW50LlxuICovXG5mdW5jdGlvbiByZWdleHAoKSB7XG4gICAgcmV0dXJuIGRlZmluZSgncmVnZXhwJywgKHZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cDtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIHNldChFbGVtZW50KSB7XG4gICAgcmV0dXJuIG5ldyBTdHJ1Y3Qoe1xuICAgICAgICB0eXBlOiAnc2V0JyxcbiAgICAgICAgc2NoZW1hOiBudWxsLFxuICAgICAgICAqZW50cmllcyh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKEVsZW1lbnQgJiYgdmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHYgb2YgdmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgW3YsIHYsIEVsZW1lbnRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29lcmNlcih2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU2V0ID8gbmV3IFNldCh2YWx1ZSkgOiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdG9yKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gKHZhbHVlIGluc3RhbmNlb2YgU2V0IHx8XG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIGEgXFxgU2V0XFxgIG9iamVjdCwgYnV0IHJlY2VpdmVkOiAke3ByaW50KHZhbHVlKX1gKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgYSB2YWx1ZSBpcyBhIHN0cmluZy5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nKCkge1xuICAgIHJldHVybiBkZWZpbmUoJ3N0cmluZycsICh2YWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIGBFeHBlY3RlZCBhIHN0cmluZywgYnV0IHJlY2VpdmVkOiAke3ByaW50KHZhbHVlKX1gKTtcbiAgICB9KTtcbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgYSB2YWx1ZSBpcyBhIHR1cGxlIG9mIGEgc3BlY2lmaWMgbGVuZ3RoLCBhbmQgdGhhdCBlYWNoIG9mIGl0c1xuICogZWxlbWVudHMgaXMgb2YgYSBzcGVjaWZpYyB0eXBlLlxuICovXG5mdW5jdGlvbiB0dXBsZShTdHJ1Y3RzKSB7XG4gICAgY29uc3QgTmV2ZXIgPSBuZXZlcigpO1xuICAgIHJldHVybiBuZXcgU3RydWN0KHtcbiAgICAgICAgdHlwZTogJ3R1cGxlJyxcbiAgICAgICAgc2NoZW1hOiBudWxsLFxuICAgICAgICAqZW50cmllcyh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gTWF0aC5tYXgoU3RydWN0cy5sZW5ndGgsIHZhbHVlLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICB5aWVsZCBbaSwgdmFsdWVbaV0sIFN0cnVjdHNbaV0gfHwgTmV2ZXJdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdG9yKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkodmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIGFuIGFycmF5LCBidXQgcmVjZWl2ZWQ6ICR7cHJpbnQodmFsdWUpfWApO1xuICAgICAgICB9LFxuICAgICAgICBjb2VyY2VyKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5zbGljZSgpIDogdmFsdWU7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGEgdmFsdWUgaGFzIGEgc2V0IG9mIGtub3duIHByb3BlcnRpZXMgb2Ygc3BlY2lmaWMgdHlwZXMuXG4gKlxuICogTm90ZTogVW5yZWNvZ25pemVkIHByb3BlcnRpZXMgYXJlIGFsbG93ZWQgYW5kIHVudG91Y2hlZC4gVGhpcyBpcyBzaW1pbGFyIHRvXG4gKiBob3cgVHlwZVNjcmlwdCdzIHN0cnVjdHVyYWwgdHlwaW5nIHdvcmtzLlxuICovXG5mdW5jdGlvbiB0eXBlKHNjaGVtYSkge1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhzY2hlbWEpO1xuICAgIHJldHVybiBuZXcgU3RydWN0KHtcbiAgICAgICAgdHlwZTogJ3R5cGUnLFxuICAgICAgICBzY2hlbWEsXG4gICAgICAgICplbnRyaWVzKHZhbHVlKSB7XG4gICAgICAgICAgICBpZiAoaXNPYmplY3QodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrIG9mIGtleXMpIHtcbiAgICAgICAgICAgICAgICAgICAgeWllbGQgW2ssIHZhbHVlW2tdLCBzY2hlbWFba11dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdG9yKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gKGlzTm9uQXJyYXlPYmplY3QodmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIGFuIG9iamVjdCwgYnV0IHJlY2VpdmVkOiAke3ByaW50KHZhbHVlKX1gKTtcbiAgICAgICAgfSxcbiAgICAgICAgY29lcmNlcih2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGlzTm9uQXJyYXlPYmplY3QodmFsdWUpID8geyAuLi52YWx1ZSB9IDogdmFsdWU7XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGEgdmFsdWUgbWF0Y2hlcyBvbmUgb2YgYSBzZXQgb2YgdHlwZXMuXG4gKi9cbmZ1bmN0aW9uIHVuaW9uKFN0cnVjdHMpIHtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IFN0cnVjdHMubWFwKChzKSA9PiBzLnR5cGUpLmpvaW4oJyB8ICcpO1xuICAgIHJldHVybiBuZXcgU3RydWN0KHtcbiAgICAgICAgdHlwZTogJ3VuaW9uJyxcbiAgICAgICAgc2NoZW1hOiBudWxsLFxuICAgICAgICBjb2VyY2VyKHZhbHVlLCBjdHgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgUyBvZiBTdHJ1Y3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2Vycm9yLCBjb2VyY2VkXSA9IFMudmFsaWRhdGUodmFsdWUsIHtcbiAgICAgICAgICAgICAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBtYXNrOiBjdHgubWFzayxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2VyY2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSxcbiAgICAgICAgdmFsaWRhdG9yKHZhbHVlLCBjdHgpIHtcbiAgICAgICAgICAgIGNvbnN0IGZhaWx1cmVzID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFMgb2YgU3RydWN0cykge1xuICAgICAgICAgICAgICAgIGNvbnN0IFsuLi50dXBsZXNdID0gcnVuKHZhbHVlLCBTLCBjdHgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IFtmaXJzdF0gPSB0dXBsZXM7XG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdFswXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtmYWlsdXJlXSBvZiB0dXBsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsdXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZXMucHVzaChmYWlsdXJlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIHRoZSB2YWx1ZSB0byBzYXRpc2Z5IGEgdW5pb24gb2YgXFxgJHtkZXNjcmlwdGlvbn1cXGAsIGJ1dCByZWNlaXZlZDogJHtwcmludCh2YWx1ZSl9YCxcbiAgICAgICAgICAgICAgICAuLi5mYWlsdXJlcyxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGFueSB2YWx1ZSBwYXNzZXMgdmFsaWRhdGlvbiwgd2l0aG91dCB3aWRlbmluZyBpdHMgdHlwZSB0byBgYW55YC5cbiAqL1xuZnVuY3Rpb24gdW5rbm93bigpIHtcbiAgICByZXR1cm4gZGVmaW5lKCd1bmtub3duJywgKCkgPT4gdHJ1ZSk7XG59XG5cbi8qKlxuICogQXVnbWVudCBhIGBTdHJ1Y3RgIHRvIGFkZCBhbiBhZGRpdGlvbmFsIGNvZXJjaW9uIHN0ZXAgdG8gaXRzIGlucHV0LlxuICpcbiAqIFRoaXMgYWxsb3dzIHlvdSB0byB0cmFuc2Zvcm0gaW5wdXQgZGF0YSBiZWZvcmUgdmFsaWRhdGluZyBpdCwgdG8gaW5jcmVhc2UgdGhlXG4gKiBsaWtlbGlob29kIHRoYXQgaXQgcGFzc2VzIHZhbGlkYXRpb27igJRmb3IgZXhhbXBsZSBmb3IgZGVmYXVsdCB2YWx1ZXMsIHBhcnNpbmdcbiAqIGRpZmZlcmVudCBmb3JtYXRzLCBldGMuXG4gKlxuICogTm90ZTogWW91IG11c3QgdXNlIGBjcmVhdGUodmFsdWUsIFN0cnVjdClgIG9uIHRoZSB2YWx1ZSB0byBoYXZlIHRoZSBjb2VyY2lvblxuICogdGFrZSBlZmZlY3QhIFVzaW5nIHNpbXBseSBgYXNzZXJ0KClgIG9yIGBpcygpYCB3aWxsIG5vdCB1c2UgY29lcmNpb24uXG4gKi9cbmZ1bmN0aW9uIGNvZXJjZShzdHJ1Y3QsIGNvbmRpdGlvbiwgY29lcmNlcikge1xuICAgIHJldHVybiBuZXcgU3RydWN0KHtcbiAgICAgICAgLi4uc3RydWN0LFxuICAgICAgICBjb2VyY2VyOiAodmFsdWUsIGN0eCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGlzKHZhbHVlLCBjb25kaXRpb24pXG4gICAgICAgICAgICAgICAgPyBzdHJ1Y3QuY29lcmNlcihjb2VyY2VyKHZhbHVlLCBjdHgpLCBjdHgpXG4gICAgICAgICAgICAgICAgOiBzdHJ1Y3QuY29lcmNlcih2YWx1ZSwgY3R4KTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cbi8qKlxuICogQXVnbWVudCBhIHN0cnVjdCB0byByZXBsYWNlIGB1bmRlZmluZWRgIHZhbHVlcyB3aXRoIGEgZGVmYXVsdC5cbiAqXG4gKiBOb3RlOiBZb3UgbXVzdCB1c2UgYGNyZWF0ZSh2YWx1ZSwgU3RydWN0KWAgb24gdGhlIHZhbHVlIHRvIGhhdmUgdGhlIGNvZXJjaW9uXG4gKiB0YWtlIGVmZmVjdCEgVXNpbmcgc2ltcGx5IGBhc3NlcnQoKWAgb3IgYGlzKClgIHdpbGwgbm90IHVzZSBjb2VyY2lvbi5cbiAqL1xuZnVuY3Rpb24gZGVmYXVsdGVkKHN0cnVjdCwgZmFsbGJhY2ssIG9wdGlvbnMgPSB7fSkge1xuICAgIHJldHVybiBjb2VyY2Uoc3RydWN0LCB1bmtub3duKCksICh4KSA9PiB7XG4gICAgICAgIGNvbnN0IGYgPSB0eXBlb2YgZmFsbGJhY2sgPT09ICdmdW5jdGlvbicgPyBmYWxsYmFjaygpIDogZmFsbGJhY2s7XG4gICAgICAgIGlmICh4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmO1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucy5zdHJpY3QgJiYgaXNQbGFpbk9iamVjdCh4KSAmJiBpc1BsYWluT2JqZWN0KGYpKSB7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7IC4uLnggfTtcbiAgICAgICAgICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJldFtrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0W2tleV0gPSBmW2tleV07XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geDtcbiAgICB9KTtcbn1cbi8qKlxuICogQXVnbWVudCBhIHN0cnVjdCB0byB0cmltIHN0cmluZyBpbnB1dHMuXG4gKlxuICogTm90ZTogWW91IG11c3QgdXNlIGBjcmVhdGUodmFsdWUsIFN0cnVjdClgIG9uIHRoZSB2YWx1ZSB0byBoYXZlIHRoZSBjb2VyY2lvblxuICogdGFrZSBlZmZlY3QhIFVzaW5nIHNpbXBseSBgYXNzZXJ0KClgIG9yIGBpcygpYCB3aWxsIG5vdCB1c2UgY29lcmNpb24uXG4gKi9cbmZ1bmN0aW9uIHRyaW1tZWQoc3RydWN0KSB7XG4gICAgcmV0dXJuIGNvZXJjZShzdHJ1Y3QsIHN0cmluZygpLCAoeCkgPT4geC50cmltKCkpO1xufVxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IGEgc3RyaW5nLCBhcnJheSwgbWFwLCBvciBzZXQgaXMgZW1wdHkuXG4gKi9cbmZ1bmN0aW9uIGVtcHR5KHN0cnVjdCkge1xuICAgIHJldHVybiByZWZpbmUoc3RydWN0LCAnZW1wdHknLCAodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IGdldFNpemUodmFsdWUpO1xuICAgICAgICByZXR1cm4gKHNpemUgPT09IDAgfHxcbiAgICAgICAgICAgIGBFeHBlY3RlZCBhbiBlbXB0eSAke3N0cnVjdC50eXBlfSBidXQgcmVjZWl2ZWQgb25lIHdpdGggYSBzaXplIG9mIFxcYCR7c2l6ZX1cXGBgKTtcbiAgICB9KTtcbn1cbmZ1bmN0aW9uIGdldFNpemUodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNpemU7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdmFsdWUubGVuZ3RoO1xuICAgIH1cbn1cbi8qKlxuICogRW5zdXJlIHRoYXQgYSBudW1iZXIgb3IgZGF0ZSBpcyBiZWxvdyBhIHRocmVzaG9sZC5cbiAqL1xuZnVuY3Rpb24gbWF4KHN0cnVjdCwgdGhyZXNob2xkLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IGV4Y2x1c2l2ZSB9ID0gb3B0aW9ucztcbiAgICByZXR1cm4gcmVmaW5lKHN0cnVjdCwgJ21heCcsICh2YWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4gZXhjbHVzaXZlXG4gICAgICAgICAgICA/IHZhbHVlIDwgdGhyZXNob2xkXG4gICAgICAgICAgICA6IHZhbHVlIDw9IHRocmVzaG9sZCB8fFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBhICR7c3RydWN0LnR5cGV9IGxlc3MgdGhhbiAke2V4Y2x1c2l2ZSA/ICcnIDogJ29yIGVxdWFsIHRvICd9JHt0aHJlc2hvbGR9IGJ1dCByZWNlaXZlZCBcXGAke3ZhbHVlfVxcYGA7XG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGEgbnVtYmVyIG9yIGRhdGUgaXMgYWJvdmUgYSB0aHJlc2hvbGQuXG4gKi9cbmZ1bmN0aW9uIG1pbihzdHJ1Y3QsIHRocmVzaG9sZCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBleGNsdXNpdmUgfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIHJlZmluZShzdHJ1Y3QsICdtaW4nLCAodmFsdWUpID0+IHtcbiAgICAgICAgcmV0dXJuIGV4Y2x1c2l2ZVxuICAgICAgICAgICAgPyB2YWx1ZSA+IHRocmVzaG9sZFxuICAgICAgICAgICAgOiB2YWx1ZSA+PSB0aHJlc2hvbGQgfHxcbiAgICAgICAgICAgICAgICBgRXhwZWN0ZWQgYSAke3N0cnVjdC50eXBlfSBncmVhdGVyIHRoYW4gJHtleGNsdXNpdmUgPyAnJyA6ICdvciBlcXVhbCB0byAnfSR7dGhyZXNob2xkfSBidXQgcmVjZWl2ZWQgXFxgJHt2YWx1ZX1cXGBgO1xuICAgIH0pO1xufVxuLyoqXG4gKiBFbnN1cmUgdGhhdCBhIHN0cmluZywgYXJyYXksIG1hcCBvciBzZXQgaXMgbm90IGVtcHR5LlxuICovXG5mdW5jdGlvbiBub25lbXB0eShzdHJ1Y3QpIHtcbiAgICByZXR1cm4gcmVmaW5lKHN0cnVjdCwgJ25vbmVtcHR5JywgKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHNpemUgPSBnZXRTaXplKHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIChzaXplID4gMCB8fCBgRXhwZWN0ZWQgYSBub25lbXB0eSAke3N0cnVjdC50eXBlfSBidXQgcmVjZWl2ZWQgYW4gZW1wdHkgb25lYCk7XG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGEgc3RyaW5nIG1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gKi9cbmZ1bmN0aW9uIHBhdHRlcm4oc3RydWN0LCByZWdleHApIHtcbiAgICByZXR1cm4gcmVmaW5lKHN0cnVjdCwgJ3BhdHRlcm4nLCAodmFsdWUpID0+IHtcbiAgICAgICAgcmV0dXJuIChyZWdleHAudGVzdCh2YWx1ZSkgfHxcbiAgICAgICAgICAgIGBFeHBlY3RlZCBhICR7c3RydWN0LnR5cGV9IG1hdGNoaW5nIFxcYC8ke3JlZ2V4cC5zb3VyY2V9L1xcYCBidXQgcmVjZWl2ZWQgXCIke3ZhbHVlfVwiYCk7XG4gICAgfSk7XG59XG4vKipcbiAqIEVuc3VyZSB0aGF0IGEgc3RyaW5nLCBhcnJheSwgbnVtYmVyLCBkYXRlLCBtYXAsIG9yIHNldCBoYXMgYSBzaXplIChvciBsZW5ndGgsIG9yIHRpbWUpIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgLlxuICovXG5mdW5jdGlvbiBzaXplKHN0cnVjdCwgbWluLCBtYXggPSBtaW4pIHtcbiAgICBjb25zdCBleHBlY3RlZCA9IGBFeHBlY3RlZCBhICR7c3RydWN0LnR5cGV9YDtcbiAgICBjb25zdCBvZiA9IG1pbiA9PT0gbWF4ID8gYG9mIFxcYCR7bWlufVxcYGAgOiBgYmV0d2VlbiBcXGAke21pbn1cXGAgYW5kIFxcYCR7bWF4fVxcYGA7XG4gICAgcmV0dXJuIHJlZmluZShzdHJ1Y3QsICdzaXplJywgKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuICgobWluIDw9IHZhbHVlICYmIHZhbHVlIDw9IG1heCkgfHxcbiAgICAgICAgICAgICAgICBgJHtleHBlY3RlZH0gJHtvZn0gYnV0IHJlY2VpdmVkIFxcYCR7dmFsdWV9XFxgYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBNYXAgfHwgdmFsdWUgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgc2l6ZSB9ID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gKChtaW4gPD0gc2l6ZSAmJiBzaXplIDw9IG1heCkgfHxcbiAgICAgICAgICAgICAgICBgJHtleHBlY3RlZH0gd2l0aCBhIHNpemUgJHtvZn0gYnV0IHJlY2VpdmVkIG9uZSB3aXRoIGEgc2l6ZSBvZiBcXGAke3NpemV9XFxgYCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGxlbmd0aCB9ID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gKChtaW4gPD0gbGVuZ3RoICYmIGxlbmd0aCA8PSBtYXgpIHx8XG4gICAgICAgICAgICAgICAgYCR7ZXhwZWN0ZWR9IHdpdGggYSBsZW5ndGggJHtvZn0gYnV0IHJlY2VpdmVkIG9uZSB3aXRoIGEgbGVuZ3RoIG9mIFxcYCR7bGVuZ3RofVxcYGApO1xuICAgICAgICB9XG4gICAgfSk7XG59XG4vKipcbiAqIEF1Z21lbnQgYSBgU3RydWN0YCB0byBhZGQgYW4gYWRkaXRpb25hbCByZWZpbmVtZW50IHRvIHRoZSB2YWxpZGF0aW9uLlxuICpcbiAqIFRoZSByZWZpbmVyIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gcmVjZWl2ZSBhIHZhbHVlIG9mIHRoZSBzdHJ1Y3QncyB0eXBlLFxuICogYmVjYXVzZSB0aGUgc3RydWN0J3MgZXhpc3RpbmcgdmFsaWRhdGlvbiB3aWxsIGFscmVhZHkgaGF2ZSBwYXNzZWQuIFRoaXNcbiAqIGFsbG93cyB5b3UgdG8gbGF5ZXIgYWRkaXRpb25hbCB2YWxpZGF0aW9uIG9uIHRvcCBvZiBleGlzdGluZyBzdHJ1Y3RzLlxuICovXG5mdW5jdGlvbiByZWZpbmUoc3RydWN0LCBuYW1lLCByZWZpbmVyKSB7XG4gICAgcmV0dXJuIG5ldyBTdHJ1Y3Qoe1xuICAgICAgICAuLi5zdHJ1Y3QsXG4gICAgICAgICpyZWZpbmVyKHZhbHVlLCBjdHgpIHtcbiAgICAgICAgICAgIHlpZWxkKiBzdHJ1Y3QucmVmaW5lcih2YWx1ZSwgY3R4KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlZmluZXIodmFsdWUsIGN0eCk7XG4gICAgICAgICAgICBjb25zdCBmYWlsdXJlcyA9IHRvRmFpbHVyZXMocmVzdWx0LCBjdHgsIHN0cnVjdCwgdmFsdWUpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBmYWlsdXJlIG9mIGZhaWx1cmVzKSB7XG4gICAgICAgICAgICAgICAgeWllbGQgeyAuLi5mYWlsdXJlLCByZWZpbmVtZW50OiBuYW1lIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCB7IFN0cnVjdCwgU3RydWN0RXJyb3IsIGFueSwgYXJyYXksIGFzc2VydCwgYXNzaWduLCBiaWdpbnQsIGJvb2xlYW4sIGNvZXJjZSwgY3JlYXRlLCBkYXRlLCBkZWZhdWx0ZWQsIGRlZmluZSwgZGVwcmVjYXRlZCwgZHluYW1pYywgZW1wdHksIGVudW1zLCBmdW5jLCBpbnN0YW5jZSwgaW50ZWdlciwgaW50ZXJzZWN0aW9uLCBpcywgbGF6eSwgbGl0ZXJhbCwgbWFwLCBtYXNrLCBtYXgsIG1pbiwgbmV2ZXIsIG5vbmVtcHR5LCBudWxsYWJsZSwgbnVtYmVyLCBvYmplY3QsIG9taXQsIG9wdGlvbmFsLCBwYXJ0aWFsLCBwYXR0ZXJuLCBwaWNrLCByZWNvcmQsIHJlZmluZSwgcmVnZXhwLCBzZXQsIHNpemUsIHN0cmluZywgc3RydWN0LCB0cmltbWVkLCB0dXBsZSwgdHlwZSwgdW5pb24sIHVua25vd24sIHZhbGlkYXRlIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5tanMubWFwXG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/superstruct/dist/index.mjs\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/text-encoding-utf-8/lib/encoding.lib.js":
/*!**************************************************************!*\
  !*** ./node_modules/text-encoding-utf-8/lib/encoding.lib.js ***!
  \**************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\n\n// This is free and unencumbered software released into the public domain.\n// See LICENSE.md for more information.\n\n//\n// Utilities\n//\n\n/**\n * @param {number} a The number to test.\n * @param {number} min The minimum value in the range, inclusive.\n * @param {number} max The maximum value in the range, inclusive.\n * @return {boolean} True if a >= min and a <= max.\n */\nfunction inRange(a, min, max) {\n  return min <= a && a <= max;\n}\n\n/**\n * @param {*} o\n * @return {Object}\n */\nfunction ToDictionary(o) {\n  if (o === undefined) return {};\n  if (o === Object(o)) return o;\n  throw TypeError('Could not convert argument to dictionary');\n}\n\n/**\n * @param {string} string Input string of UTF-16 code units.\n * @return {!Array.<number>} Code points.\n */\nfunction stringToCodePoints(string) {\n  // https://heycam.github.io/webidl/#dfn-obtain-unicode\n\n  // 1. Let S be the DOMString value.\n  var s = String(string);\n\n  // 2. Let n be the length of S.\n  var n = s.length;\n\n  // 3. Initialize i to 0.\n  var i = 0;\n\n  // 4. Initialize U to be an empty sequence of Unicode characters.\n  var u = [];\n\n  // 5. While i < n:\n  while (i < n) {\n\n    // 1. Let c be the code unit in S at index i.\n    var c = s.charCodeAt(i);\n\n    // 2. Depending on the value of c:\n\n    // c < 0xD800 or c > 0xDFFF\n    if (c < 0xD800 || c > 0xDFFF) {\n      // Append to U the Unicode character with code point c.\n      u.push(c);\n    }\n\n    // 0xDC00 ≤ c ≤ 0xDFFF\n    else if (0xDC00 <= c && c <= 0xDFFF) {\n      // Append to U a U+FFFD REPLACEMENT CHARACTER.\n      u.push(0xFFFD);\n    }\n\n    // 0xD800 ≤ c ≤ 0xDBFF\n    else if (0xD800 <= c && c <= 0xDBFF) {\n      // 1. If i = n−1, then append to U a U+FFFD REPLACEMENT\n      // CHARACTER.\n      if (i === n - 1) {\n        u.push(0xFFFD);\n      }\n      // 2. Otherwise, i < n−1:\n      else {\n        // 1. Let d be the code unit in S at index i+1.\n        var d = string.charCodeAt(i + 1);\n\n        // 2. If 0xDC00 ≤ d ≤ 0xDFFF, then:\n        if (0xDC00 <= d && d <= 0xDFFF) {\n          // 1. Let a be c & 0x3FF.\n          var a = c & 0x3FF;\n\n          // 2. Let b be d & 0x3FF.\n          var b = d & 0x3FF;\n\n          // 3. Append to U the Unicode character with code point\n          // 2^16+2^10*a+b.\n          u.push(0x10000 + (a << 10) + b);\n\n          // 4. Set i to i+1.\n          i += 1;\n        }\n\n        // 3. Otherwise, d < 0xDC00 or d > 0xDFFF. Append to U a\n        // U+FFFD REPLACEMENT CHARACTER.\n        else  {\n          u.push(0xFFFD);\n        }\n      }\n    }\n\n    // 3. Set i to i+1.\n    i += 1;\n  }\n\n  // 6. Return U.\n  return u;\n}\n\n/**\n * @param {!Array.<number>} code_points Array of code points.\n * @return {string} string String of UTF-16 code units.\n */\nfunction codePointsToString(code_points) {\n  var s = '';\n  for (var i = 0; i < code_points.length; ++i) {\n    var cp = code_points[i];\n    if (cp <= 0xFFFF) {\n      s += String.fromCharCode(cp);\n    } else {\n      cp -= 0x10000;\n      s += String.fromCharCode((cp >> 10) + 0xD800,\n                               (cp & 0x3FF) + 0xDC00);\n    }\n  }\n  return s;\n}\n\n\n//\n// Implementation of Encoding specification\n// https://encoding.spec.whatwg.org/\n//\n\n//\n// 3. Terminology\n//\n\n/**\n * End-of-stream is a special token that signifies no more tokens\n * are in the stream.\n * @const\n */ var end_of_stream = -1;\n\n/**\n * A stream represents an ordered sequence of tokens.\n *\n * @constructor\n * @param {!(Array.<number>|Uint8Array)} tokens Array of tokens that provide the\n * stream.\n */\nfunction Stream(tokens) {\n  /** @type {!Array.<number>} */\n  this.tokens = [].slice.call(tokens);\n}\n\nStream.prototype = {\n  /**\n   * @return {boolean} True if end-of-stream has been hit.\n   */\n  endOfStream: function() {\n    return !this.tokens.length;\n  },\n\n  /**\n   * When a token is read from a stream, the first token in the\n   * stream must be returned and subsequently removed, and\n   * end-of-stream must be returned otherwise.\n   *\n   * @return {number} Get the next token from the stream, or\n   * end_of_stream.\n   */\n   read: function() {\n    if (!this.tokens.length)\n      return end_of_stream;\n     return this.tokens.shift();\n   },\n\n  /**\n   * When one or more tokens are prepended to a stream, those tokens\n   * must be inserted, in given order, before the first token in the\n   * stream.\n   *\n   * @param {(number|!Array.<number>)} token The token(s) to prepend to the stream.\n   */\n  prepend: function(token) {\n    if (Array.isArray(token)) {\n      var tokens = /**@type {!Array.<number>}*/(token);\n      while (tokens.length)\n        this.tokens.unshift(tokens.pop());\n    } else {\n      this.tokens.unshift(token);\n    }\n  },\n\n  /**\n   * When one or more tokens are pushed to a stream, those tokens\n   * must be inserted, in given order, after the last token in the\n   * stream.\n   *\n   * @param {(number|!Array.<number>)} token The tokens(s) to prepend to the stream.\n   */\n  push: function(token) {\n    if (Array.isArray(token)) {\n      var tokens = /**@type {!Array.<number>}*/(token);\n      while (tokens.length)\n        this.tokens.push(tokens.shift());\n    } else {\n      this.tokens.push(token);\n    }\n  }\n};\n\n//\n// 4. Encodings\n//\n\n// 4.1 Encoders and decoders\n\n/** @const */\nvar finished = -1;\n\n/**\n * @param {boolean} fatal If true, decoding errors raise an exception.\n * @param {number=} opt_code_point Override the standard fallback code point.\n * @return {number} The code point to insert on a decoding error.\n */\nfunction decoderError(fatal, opt_code_point) {\n  if (fatal)\n    throw TypeError('Decoder error');\n  return opt_code_point || 0xFFFD;\n}\n\n//\n// 7. API\n//\n\n/** @const */ var DEFAULT_ENCODING = 'utf-8';\n\n// 7.1 Interface TextDecoder\n\n/**\n * @constructor\n * @param {string=} encoding The label of the encoding;\n *     defaults to 'utf-8'.\n * @param {Object=} options\n */\nfunction TextDecoder(encoding, options) {\n  if (!(this instanceof TextDecoder)) {\n    return new TextDecoder(encoding, options);\n  }\n  encoding = encoding !== undefined ? String(encoding).toLowerCase() : DEFAULT_ENCODING;\n  if (encoding !== DEFAULT_ENCODING) {\n    throw new Error('Encoding not supported. Only utf-8 is supported');\n  }\n  options = ToDictionary(options);\n\n  /** @private @type {boolean} */\n  this._streaming = false;\n  /** @private @type {boolean} */\n  this._BOMseen = false;\n  /** @private @type {?Decoder} */\n  this._decoder = null;\n  /** @private @type {boolean} */\n  this._fatal = Boolean(options['fatal']);\n  /** @private @type {boolean} */\n  this._ignoreBOM = Boolean(options['ignoreBOM']);\n\n  Object.defineProperty(this, 'encoding', {value: 'utf-8'});\n  Object.defineProperty(this, 'fatal', {value: this._fatal});\n  Object.defineProperty(this, 'ignoreBOM', {value: this._ignoreBOM});\n}\n\nTextDecoder.prototype = {\n  /**\n   * @param {ArrayBufferView=} input The buffer of bytes to decode.\n   * @param {Object=} options\n   * @return {string} The decoded string.\n   */\n  decode: function decode(input, options) {\n    var bytes;\n    if (typeof input === 'object' && input instanceof ArrayBuffer) {\n      bytes = new Uint8Array(input);\n    } else if (typeof input === 'object' && 'buffer' in input &&\n               input.buffer instanceof ArrayBuffer) {\n      bytes = new Uint8Array(input.buffer,\n                             input.byteOffset,\n                             input.byteLength);\n    } else {\n      bytes = new Uint8Array(0);\n    }\n\n    options = ToDictionary(options);\n\n    if (!this._streaming) {\n      this._decoder = new UTF8Decoder({fatal: this._fatal});\n      this._BOMseen = false;\n    }\n    this._streaming = Boolean(options['stream']);\n\n    var input_stream = new Stream(bytes);\n\n    var code_points = [];\n\n    /** @type {?(number|!Array.<number>)} */\n    var result;\n\n    while (!input_stream.endOfStream()) {\n      result = this._decoder.handler(input_stream, input_stream.read());\n      if (result === finished)\n        break;\n      if (result === null)\n        continue;\n      if (Array.isArray(result))\n        code_points.push.apply(code_points, /**@type {!Array.<number>}*/(result));\n      else\n        code_points.push(result);\n    }\n    if (!this._streaming) {\n      do {\n        result = this._decoder.handler(input_stream, input_stream.read());\n        if (result === finished)\n          break;\n        if (result === null)\n          continue;\n        if (Array.isArray(result))\n          code_points.push.apply(code_points, /**@type {!Array.<number>}*/(result));\n        else\n          code_points.push(result);\n      } while (!input_stream.endOfStream());\n      this._decoder = null;\n    }\n\n    if (code_points.length) {\n      // If encoding is one of utf-8, utf-16be, and utf-16le, and\n      // ignore BOM flag and BOM seen flag are unset, run these\n      // subsubsteps:\n      if (['utf-8'].indexOf(this.encoding) !== -1 &&\n          !this._ignoreBOM && !this._BOMseen) {\n        // If token is U+FEFF, set BOM seen flag.\n        if (code_points[0] === 0xFEFF) {\n          this._BOMseen = true;\n          code_points.shift();\n        } else {\n          // Otherwise, if token is not end-of-stream, set BOM seen\n          // flag and append token to output.\n          this._BOMseen = true;\n        }\n      }\n    }\n\n    return codePointsToString(code_points);\n  }\n};\n\n// 7.2 Interface TextEncoder\n\n/**\n * @constructor\n * @param {string=} encoding The label of the encoding;\n *     defaults to 'utf-8'.\n * @param {Object=} options\n */\nfunction TextEncoder(encoding, options) {\n  if (!(this instanceof TextEncoder))\n    return new TextEncoder(encoding, options);\n  encoding = encoding !== undefined ? String(encoding).toLowerCase() : DEFAULT_ENCODING;\n  if (encoding !== DEFAULT_ENCODING) {\n    throw new Error('Encoding not supported. Only utf-8 is supported');\n  }\n  options = ToDictionary(options);\n\n  /** @private @type {boolean} */\n  this._streaming = false;\n  /** @private @type {?Encoder} */\n  this._encoder = null;\n  /** @private @type {{fatal: boolean}} */\n  this._options = {fatal: Boolean(options['fatal'])};\n\n  Object.defineProperty(this, 'encoding', {value: 'utf-8'});\n}\n\nTextEncoder.prototype = {\n  /**\n   * @param {string=} opt_string The string to encode.\n   * @param {Object=} options\n   * @return {Uint8Array} Encoded bytes, as a Uint8Array.\n   */\n  encode: function encode(opt_string, options) {\n    opt_string = opt_string ? String(opt_string) : '';\n    options = ToDictionary(options);\n\n    // NOTE: This option is nonstandard. None of the encodings\n    // permitted for encoding (i.e. UTF-8, UTF-16) are stateful,\n    // so streaming is not necessary.\n    if (!this._streaming)\n      this._encoder = new UTF8Encoder(this._options);\n    this._streaming = Boolean(options['stream']);\n\n    var bytes = [];\n    var input_stream = new Stream(stringToCodePoints(opt_string));\n    /** @type {?(number|!Array.<number>)} */\n    var result;\n    while (!input_stream.endOfStream()) {\n      result = this._encoder.handler(input_stream, input_stream.read());\n      if (result === finished)\n        break;\n      if (Array.isArray(result))\n        bytes.push.apply(bytes, /**@type {!Array.<number>}*/(result));\n      else\n        bytes.push(result);\n    }\n    if (!this._streaming) {\n      while (true) {\n        result = this._encoder.handler(input_stream, input_stream.read());\n        if (result === finished)\n          break;\n        if (Array.isArray(result))\n          bytes.push.apply(bytes, /**@type {!Array.<number>}*/(result));\n        else\n          bytes.push(result);\n      }\n      this._encoder = null;\n    }\n    return new Uint8Array(bytes);\n  }\n};\n\n//\n// 8. The encoding\n//\n\n// 8.1 utf-8\n\n/**\n * @constructor\n * @implements {Decoder}\n * @param {{fatal: boolean}} options\n */\nfunction UTF8Decoder(options) {\n  var fatal = options.fatal;\n\n  // utf-8's decoder's has an associated utf-8 code point, utf-8\n  // bytes seen, and utf-8 bytes needed (all initially 0), a utf-8\n  // lower boundary (initially 0x80), and a utf-8 upper boundary\n  // (initially 0xBF).\n  var /** @type {number} */ utf8_code_point = 0,\n      /** @type {number} */ utf8_bytes_seen = 0,\n      /** @type {number} */ utf8_bytes_needed = 0,\n      /** @type {number} */ utf8_lower_boundary = 0x80,\n      /** @type {number} */ utf8_upper_boundary = 0xBF;\n\n  /**\n   * @param {Stream} stream The stream of bytes being decoded.\n   * @param {number} bite The next byte read from the stream.\n   * @return {?(number|!Array.<number>)} The next code point(s)\n   *     decoded, or null if not enough data exists in the input\n   *     stream to decode a complete code point.\n   */\n  this.handler = function(stream, bite) {\n    // 1. If byte is end-of-stream and utf-8 bytes needed is not 0,\n    // set utf-8 bytes needed to 0 and return error.\n    if (bite === end_of_stream && utf8_bytes_needed !== 0) {\n      utf8_bytes_needed = 0;\n      return decoderError(fatal);\n    }\n\n    // 2. If byte is end-of-stream, return finished.\n    if (bite === end_of_stream)\n      return finished;\n\n    // 3. If utf-8 bytes needed is 0, based on byte:\n    if (utf8_bytes_needed === 0) {\n\n      // 0x00 to 0x7F\n      if (inRange(bite, 0x00, 0x7F)) {\n        // Return a code point whose value is byte.\n        return bite;\n      }\n\n      // 0xC2 to 0xDF\n      if (inRange(bite, 0xC2, 0xDF)) {\n        // Set utf-8 bytes needed to 1 and utf-8 code point to byte\n        // − 0xC0.\n        utf8_bytes_needed = 1;\n        utf8_code_point = bite - 0xC0;\n      }\n\n      // 0xE0 to 0xEF\n      else if (inRange(bite, 0xE0, 0xEF)) {\n        // 1. If byte is 0xE0, set utf-8 lower boundary to 0xA0.\n        if (bite === 0xE0)\n          utf8_lower_boundary = 0xA0;\n        // 2. If byte is 0xED, set utf-8 upper boundary to 0x9F.\n        if (bite === 0xED)\n          utf8_upper_boundary = 0x9F;\n        // 3. Set utf-8 bytes needed to 2 and utf-8 code point to\n        // byte − 0xE0.\n        utf8_bytes_needed = 2;\n        utf8_code_point = bite - 0xE0;\n      }\n\n      // 0xF0 to 0xF4\n      else if (inRange(bite, 0xF0, 0xF4)) {\n        // 1. If byte is 0xF0, set utf-8 lower boundary to 0x90.\n        if (bite === 0xF0)\n          utf8_lower_boundary = 0x90;\n        // 2. If byte is 0xF4, set utf-8 upper boundary to 0x8F.\n        if (bite === 0xF4)\n          utf8_upper_boundary = 0x8F;\n        // 3. Set utf-8 bytes needed to 3 and utf-8 code point to\n        // byte − 0xF0.\n        utf8_bytes_needed = 3;\n        utf8_code_point = bite - 0xF0;\n      }\n\n      // Otherwise\n      else {\n        // Return error.\n        return decoderError(fatal);\n      }\n\n      // Then (byte is in the range 0xC2 to 0xF4) set utf-8 code\n      // point to utf-8 code point << (6 × utf-8 bytes needed) and\n      // return continue.\n      utf8_code_point = utf8_code_point << (6 * utf8_bytes_needed);\n      return null;\n    }\n\n    // 4. If byte is not in the range utf-8 lower boundary to utf-8\n    // upper boundary, run these substeps:\n    if (!inRange(bite, utf8_lower_boundary, utf8_upper_boundary)) {\n\n      // 1. Set utf-8 code point, utf-8 bytes needed, and utf-8\n      // bytes seen to 0, set utf-8 lower boundary to 0x80, and set\n      // utf-8 upper boundary to 0xBF.\n      utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;\n      utf8_lower_boundary = 0x80;\n      utf8_upper_boundary = 0xBF;\n\n      // 2. Prepend byte to stream.\n      stream.prepend(bite);\n\n      // 3. Return error.\n      return decoderError(fatal);\n    }\n\n    // 5. Set utf-8 lower boundary to 0x80 and utf-8 upper boundary\n    // to 0xBF.\n    utf8_lower_boundary = 0x80;\n    utf8_upper_boundary = 0xBF;\n\n    // 6. Increase utf-8 bytes seen by one and set utf-8 code point\n    // to utf-8 code point + (byte − 0x80) << (6 × (utf-8 bytes\n    // needed − utf-8 bytes seen)).\n    utf8_bytes_seen += 1;\n    utf8_code_point += (bite - 0x80) << (6 * (utf8_bytes_needed - utf8_bytes_seen));\n\n    // 7. If utf-8 bytes seen is not equal to utf-8 bytes needed,\n    // continue.\n    if (utf8_bytes_seen !== utf8_bytes_needed)\n      return null;\n\n    // 8. Let code point be utf-8 code point.\n    var code_point = utf8_code_point;\n\n    // 9. Set utf-8 code point, utf-8 bytes needed, and utf-8 bytes\n    // seen to 0.\n    utf8_code_point = utf8_bytes_needed = utf8_bytes_seen = 0;\n\n    // 10. Return a code point whose value is code point.\n    return code_point;\n  };\n}\n\n/**\n * @constructor\n * @implements {Encoder}\n * @param {{fatal: boolean}} options\n */\nfunction UTF8Encoder(options) {\n  var fatal = options.fatal;\n  /**\n   * @param {Stream} stream Input stream.\n   * @param {number} code_point Next code point read from the stream.\n   * @return {(number|!Array.<number>)} Byte(s) to emit.\n   */\n  this.handler = function(stream, code_point) {\n    // 1. If code point is end-of-stream, return finished.\n    if (code_point === end_of_stream)\n      return finished;\n\n    // 2. If code point is in the range U+0000 to U+007F, return a\n    // byte whose value is code point.\n    if (inRange(code_point, 0x0000, 0x007f))\n      return code_point;\n\n    // 3. Set count and offset based on the range code point is in:\n    var count, offset;\n    // U+0080 to U+07FF:    1 and 0xC0\n    if (inRange(code_point, 0x0080, 0x07FF)) {\n      count = 1;\n      offset = 0xC0;\n    }\n    // U+0800 to U+FFFF:    2 and 0xE0\n    else if (inRange(code_point, 0x0800, 0xFFFF)) {\n      count = 2;\n      offset = 0xE0;\n    }\n    // U+10000 to U+10FFFF: 3 and 0xF0\n    else if (inRange(code_point, 0x10000, 0x10FFFF)) {\n      count = 3;\n      offset = 0xF0;\n    }\n\n    // 4.Let bytes be a byte sequence whose first byte is (code\n    // point >> (6 × count)) + offset.\n    var bytes = [(code_point >> (6 * count)) + offset];\n\n    // 5. Run these substeps while count is greater than 0:\n    while (count > 0) {\n\n      // 1. Set temp to code point >> (6 × (count − 1)).\n      var temp = code_point >> (6 * (count - 1));\n\n      // 2. Append to bytes 0x80 | (temp & 0x3F).\n      bytes.push(0x80 | (temp & 0x3F));\n\n      // 3. Decrease count by one.\n      count -= 1;\n    }\n\n    // 6. Return bytes bytes, in order.\n    return bytes;\n  };\n}\n\nexports.TextEncoder = TextEncoder;\nexports.TextDecoder = TextDecoder;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy90ZXh0LWVuY29kaW5nLXV0Zi04L2xpYi9lbmNvZGluZy5saWIuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLFFBQVE7QUFDbkIsV0FBVyxRQUFRO0FBQ25CLFdBQVcsUUFBUTtBQUNuQixZQUFZLFNBQVM7QUFDckI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxXQUFXLEdBQUc7QUFDZCxZQUFZO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxRQUFRO0FBQ25CLFlBQVksaUJBQWlCO0FBQzdCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVcsaUJBQWlCO0FBQzVCLFlBQVksUUFBUTtBQUNwQjtBQUNBO0FBQ0E7QUFDQSxrQkFBa0Isd0JBQXdCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXLDhCQUE4QjtBQUN6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QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsbUJBQW1CO0FBQ25CLG1CQUFtQiIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy90ZXh0LWVuY29kaW5nLXV0Zi04L2xpYi9lbmNvZGluZy5saWIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG4vLyBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuLy8gU2VlIExJQ0VOU0UubWQgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbi8vXG4vLyBVdGlsaXRpZXNcbi8vXG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGEgVGhlIG51bWJlciB0byB0ZXN0LlxuICogQHBhcmFtIHtudW1iZXJ9IG1pbiBUaGUgbWluaW11bSB2YWx1ZSBpbiB0aGUgcmFuZ2UsIGluY2x1c2l2ZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSBtYXggVGhlIG1heGltdW0gdmFsdWUgaW4gdGhlIHJhbmdlLCBpbmNsdXNpdmUuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGEgPj0gbWluIGFuZCBhIDw9IG1heC5cbiAqL1xuZnVuY3Rpb24gaW5SYW5nZShhLCBtaW4sIG1heCkge1xuICByZXR1cm4gbWluIDw9IGEgJiYgYSA8PSBtYXg7XG59XG5cbi8qKlxuICogQHBhcmFtIHsqfSBvXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbmZ1bmN0aW9uIFRvRGljdGlvbmFyeShvKSB7XG4gIGlmIChvID09PSB1bmRlZmluZWQpIHJldHVybiB7fTtcbiAgaWYgKG8gPT09IE9iamVjdChvKSkgcmV0dXJuIG87XG4gIHRocm93IFR5cGVFcnJvcignQ291bGQgbm90IGNvbnZlcnQgYXJndW1lbnQgdG8gZGljdGlvbmFyeScpO1xufVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgSW5wdXQgc3RyaW5nIG9mIFVURi0xNiBjb2RlIHVuaXRzLlxuICogQHJldHVybiB7IUFycmF5LjxudW1iZXI+fSBDb2RlIHBvaW50cy5cbiAqL1xuZnVuY3Rpb24gc3RyaW5nVG9Db2RlUG9pbnRzKHN0cmluZykge1xuICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb2J0YWluLXVuaWNvZGVcblxuICAvLyAxLiBMZXQgUyBiZSB0aGUgRE9NU3RyaW5nIHZhbHVlLlxuICB2YXIgcyA9IFN0cmluZyhzdHJpbmcpO1xuXG4gIC8vIDIuIExldCBuIGJlIHRoZSBsZW5ndGggb2YgUy5cbiAgdmFyIG4gPSBzLmxlbmd0aDtcblxuICAvLyAzLiBJbml0aWFsaXplIGkgdG8gMC5cbiAgdmFyIGkgPSAwO1xuXG4gIC8vIDQuIEluaXRpYWxpemUgVSB0byBiZSBhbiBlbXB0eSBzZXF1ZW5jZSBvZiBVbmljb2RlIGNoYXJhY3RlcnMuXG4gIHZhciB1ID0gW107XG5cbiAgLy8gNS4gV2hpbGUgaSA8IG46XG4gIHdoaWxlIChpIDwgbikge1xuXG4gICAgLy8gMS4gTGV0IGMgYmUgdGhlIGNvZGUgdW5pdCBpbiBTIGF0IGluZGV4IGkuXG4gICAgdmFyIGMgPSBzLmNoYXJDb2RlQXQoaSk7XG5cbiAgICAvLyAyLiBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIGM6XG5cbiAgICAvLyBjIDwgMHhEODAwIG9yIGMgPiAweERGRkZcbiAgICBpZiAoYyA8IDB4RDgwMCB8fCBjID4gMHhERkZGKSB7XG4gICAgICAvLyBBcHBlbmQgdG8gVSB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgd2l0aCBjb2RlIHBvaW50IGMuXG4gICAgICB1LnB1c2goYyk7XG4gICAgfVxuXG4gICAgLy8gMHhEQzAwIOKJpCBjIOKJpCAweERGRkZcbiAgICBlbHNlIGlmICgweERDMDAgPD0gYyAmJiBjIDw9IDB4REZGRikge1xuICAgICAgLy8gQXBwZW5kIHRvIFUgYSBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSLlxuICAgICAgdS5wdXNoKDB4RkZGRCk7XG4gICAgfVxuXG4gICAgLy8gMHhEODAwIOKJpCBjIOKJpCAweERCRkZcbiAgICBlbHNlIGlmICgweEQ4MDAgPD0gYyAmJiBjIDw9IDB4REJGRikge1xuICAgICAgLy8gMS4gSWYgaSA9IG7iiJIxLCB0aGVuIGFwcGVuZCB0byBVIGEgVStGRkZEIFJFUExBQ0VNRU5UXG4gICAgICAvLyBDSEFSQUNURVIuXG4gICAgICBpZiAoaSA9PT0gbiAtIDEpIHtcbiAgICAgICAgdS5wdXNoKDB4RkZGRCk7XG4gICAgICB9XG4gICAgICAvLyAyLiBPdGhlcndpc2UsIGkgPCBu4oiSMTpcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyAxLiBMZXQgZCBiZSB0aGUgY29kZSB1bml0IGluIFMgYXQgaW5kZXggaSsxLlxuICAgICAgICB2YXIgZCA9IHN0cmluZy5jaGFyQ29kZUF0KGkgKyAxKTtcblxuICAgICAgICAvLyAyLiBJZiAweERDMDAg4omkIGQg4omkIDB4REZGRiwgdGhlbjpcbiAgICAgICAgaWYgKDB4REMwMCA8PSBkICYmIGQgPD0gMHhERkZGKSB7XG4gICAgICAgICAgLy8gMS4gTGV0IGEgYmUgYyAmIDB4M0ZGLlxuICAgICAgICAgIHZhciBhID0gYyAmIDB4M0ZGO1xuXG4gICAgICAgICAgLy8gMi4gTGV0IGIgYmUgZCAmIDB4M0ZGLlxuICAgICAgICAgIHZhciBiID0gZCAmIDB4M0ZGO1xuXG4gICAgICAgICAgLy8gMy4gQXBwZW5kIHRvIFUgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIHdpdGggY29kZSBwb2ludFxuICAgICAgICAgIC8vIDJeMTYrMl4xMCphK2IuXG4gICAgICAgICAgdS5wdXNoKDB4MTAwMDAgKyAoYSA8PCAxMCkgKyBiKTtcblxuICAgICAgICAgIC8vIDQuIFNldCBpIHRvIGkrMS5cbiAgICAgICAgICBpICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAzLiBPdGhlcndpc2UsIGQgPCAweERDMDAgb3IgZCA+IDB4REZGRi4gQXBwZW5kIHRvIFUgYVxuICAgICAgICAvLyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSLlxuICAgICAgICBlbHNlICB7XG4gICAgICAgICAgdS5wdXNoKDB4RkZGRCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiBTZXQgaSB0byBpKzEuXG4gICAgaSArPSAxO1xuICB9XG5cbiAgLy8gNi4gUmV0dXJuIFUuXG4gIHJldHVybiB1O1xufVxuXG4vKipcbiAqIEBwYXJhbSB7IUFycmF5LjxudW1iZXI+fSBjb2RlX3BvaW50cyBBcnJheSBvZiBjb2RlIHBvaW50cy5cbiAqIEByZXR1cm4ge3N0cmluZ30gc3RyaW5nIFN0cmluZyBvZiBVVEYtMTYgY29kZSB1bml0cy5cbiAqL1xuZnVuY3Rpb24gY29kZVBvaW50c1RvU3RyaW5nKGNvZGVfcG9pbnRzKSB7XG4gIHZhciBzID0gJyc7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29kZV9wb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgY3AgPSBjb2RlX3BvaW50c1tpXTtcbiAgICBpZiAoY3AgPD0gMHhGRkZGKSB7XG4gICAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjcCAtPSAweDEwMDAwO1xuICAgICAgcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKChjcCA+PiAxMCkgKyAweEQ4MDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNwICYgMHgzRkYpICsgMHhEQzAwKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHM7XG59XG5cblxuLy9cbi8vIEltcGxlbWVudGF0aW9uIG9mIEVuY29kaW5nIHNwZWNpZmljYXRpb25cbi8vIGh0dHBzOi8vZW5jb2Rpbmcuc3BlYy53aGF0d2cub3JnL1xuLy9cblxuLy9cbi8vIDMuIFRlcm1pbm9sb2d5XG4vL1xuXG4vKipcbiAqIEVuZC1vZi1zdHJlYW0gaXMgYSBzcGVjaWFsIHRva2VuIHRoYXQgc2lnbmlmaWVzIG5vIG1vcmUgdG9rZW5zXG4gKiBhcmUgaW4gdGhlIHN0cmVhbS5cbiAqIEBjb25zdFxuICovIHZhciBlbmRfb2Zfc3RyZWFtID0gLTE7XG5cbi8qKlxuICogQSBzdHJlYW0gcmVwcmVzZW50cyBhbiBvcmRlcmVkIHNlcXVlbmNlIG9mIHRva2Vucy5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7IShBcnJheS48bnVtYmVyPnxVaW50OEFycmF5KX0gdG9rZW5zIEFycmF5IG9mIHRva2VucyB0aGF0IHByb3ZpZGUgdGhlXG4gKiBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIFN0cmVhbSh0b2tlbnMpIHtcbiAgLyoqIEB0eXBlIHshQXJyYXkuPG51bWJlcj59ICovXG4gIHRoaXMudG9rZW5zID0gW10uc2xpY2UuY2FsbCh0b2tlbnMpO1xufVxuXG5TdHJlYW0ucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBlbmQtb2Ytc3RyZWFtIGhhcyBiZWVuIGhpdC5cbiAgICovXG4gIGVuZE9mU3RyZWFtOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gIXRoaXMudG9rZW5zLmxlbmd0aDtcbiAgfSxcblxuICAvKipcbiAgICogV2hlbiBhIHRva2VuIGlzIHJlYWQgZnJvbSBhIHN0cmVhbSwgdGhlIGZpcnN0IHRva2VuIGluIHRoZVxuICAgKiBzdHJlYW0gbXVzdCBiZSByZXR1cm5lZCBhbmQgc3Vic2VxdWVudGx5IHJlbW92ZWQsIGFuZFxuICAgKiBlbmQtb2Ytc3RyZWFtIG11c3QgYmUgcmV0dXJuZWQgb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAcmV0dXJuIHtudW1iZXJ9IEdldCB0aGUgbmV4dCB0b2tlbiBmcm9tIHRoZSBzdHJlYW0sIG9yXG4gICAqIGVuZF9vZl9zdHJlYW0uXG4gICAqL1xuICAgcmVhZDogZnVuY3Rpb24oKSB7XG4gICAgaWYgKCF0aGlzLnRva2Vucy5sZW5ndGgpXG4gICAgICByZXR1cm4gZW5kX29mX3N0cmVhbTtcbiAgICAgcmV0dXJuIHRoaXMudG9rZW5zLnNoaWZ0KCk7XG4gICB9LFxuXG4gIC8qKlxuICAgKiBXaGVuIG9uZSBvciBtb3JlIHRva2VucyBhcmUgcHJlcGVuZGVkIHRvIGEgc3RyZWFtLCB0aG9zZSB0b2tlbnNcbiAgICogbXVzdCBiZSBpbnNlcnRlZCwgaW4gZ2l2ZW4gb3JkZXIsIGJlZm9yZSB0aGUgZmlyc3QgdG9rZW4gaW4gdGhlXG4gICAqIHN0cmVhbS5cbiAgICpcbiAgICogQHBhcmFtIHsobnVtYmVyfCFBcnJheS48bnVtYmVyPil9IHRva2VuIFRoZSB0b2tlbihzKSB0byBwcmVwZW5kIHRvIHRoZSBzdHJlYW0uXG4gICAqL1xuICBwcmVwZW5kOiBmdW5jdGlvbih0b2tlbikge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHRva2VuKSkge1xuICAgICAgdmFyIHRva2VucyA9IC8qKkB0eXBlIHshQXJyYXkuPG51bWJlcj59Ki8odG9rZW4pO1xuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGgpXG4gICAgICAgIHRoaXMudG9rZW5zLnVuc2hpZnQodG9rZW5zLnBvcCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b2tlbnMudW5zaGlmdCh0b2tlbik7XG4gICAgfVxuICB9LFxuXG4gIC8qKlxuICAgKiBXaGVuIG9uZSBvciBtb3JlIHRva2VucyBhcmUgcHVzaGVkIHRvIGEgc3RyZWFtLCB0aG9zZSB0b2tlbnNcbiAgICogbXVzdCBiZSBpbnNlcnRlZCwgaW4gZ2l2ZW4gb3JkZXIsIGFmdGVyIHRoZSBsYXN0IHRva2VuIGluIHRoZVxuICAgKiBzdHJlYW0uXG4gICAqXG4gICAqIEBwYXJhbSB7KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSB0b2tlbiBUaGUgdG9rZW5zKHMpIHRvIHByZXBlbmQgdG8gdGhlIHN0cmVhbS5cbiAgICovXG4gIHB1c2g6IGZ1bmN0aW9uKHRva2VuKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodG9rZW4pKSB7XG4gICAgICB2YXIgdG9rZW5zID0gLyoqQHR5cGUgeyFBcnJheS48bnVtYmVyPn0qLyh0b2tlbik7XG4gICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aClcbiAgICAgICAgdGhpcy50b2tlbnMucHVzaCh0b2tlbnMuc2hpZnQoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9rZW5zLnB1c2godG9rZW4pO1xuICAgIH1cbiAgfVxufTtcblxuLy9cbi8vIDQuIEVuY29kaW5nc1xuLy9cblxuLy8gNC4xIEVuY29kZXJzIGFuZCBkZWNvZGVyc1xuXG4vKiogQGNvbnN0ICovXG52YXIgZmluaXNoZWQgPSAtMTtcblxuLyoqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGZhdGFsIElmIHRydWUsIGRlY29kaW5nIGVycm9ycyByYWlzZSBhbiBleGNlcHRpb24uXG4gKiBAcGFyYW0ge251bWJlcj19IG9wdF9jb2RlX3BvaW50IE92ZXJyaWRlIHRoZSBzdGFuZGFyZCBmYWxsYmFjayBjb2RlIHBvaW50LlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY29kZSBwb2ludCB0byBpbnNlcnQgb24gYSBkZWNvZGluZyBlcnJvci5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlckVycm9yKGZhdGFsLCBvcHRfY29kZV9wb2ludCkge1xuICBpZiAoZmF0YWwpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdEZWNvZGVyIGVycm9yJyk7XG4gIHJldHVybiBvcHRfY29kZV9wb2ludCB8fCAweEZGRkQ7XG59XG5cbi8vXG4vLyA3LiBBUElcbi8vXG5cbi8qKiBAY29uc3QgKi8gdmFyIERFRkFVTFRfRU5DT0RJTkcgPSAndXRmLTgnO1xuXG4vLyA3LjEgSW50ZXJmYWNlIFRleHREZWNvZGVyXG5cbi8qKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZz19IGVuY29kaW5nIFRoZSBsYWJlbCBvZiB0aGUgZW5jb2Rpbmc7XG4gKiAgICAgZGVmYXVsdHMgdG8gJ3V0Zi04Jy5cbiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBUZXh0RGVjb2RlcihlbmNvZGluZywgb3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVGV4dERlY29kZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZywgb3B0aW9ucyk7XG4gIH1cbiAgZW5jb2RpbmcgPSBlbmNvZGluZyAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpIDogREVGQVVMVF9FTkNPRElORztcbiAgaWYgKGVuY29kaW5nICE9PSBERUZBVUxUX0VOQ09ESU5HKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvZGluZyBub3Qgc3VwcG9ydGVkLiBPbmx5IHV0Zi04IGlzIHN1cHBvcnRlZCcpO1xuICB9XG4gIG9wdGlvbnMgPSBUb0RpY3Rpb25hcnkob3B0aW9ucyk7XG5cbiAgLyoqIEBwcml2YXRlIEB0eXBlIHtib29sZWFufSAqL1xuICB0aGlzLl9zdHJlYW1pbmcgPSBmYWxzZTtcbiAgLyoqIEBwcml2YXRlIEB0eXBlIHtib29sZWFufSAqL1xuICB0aGlzLl9CT01zZWVuID0gZmFsc2U7XG4gIC8qKiBAcHJpdmF0ZSBAdHlwZSB7P0RlY29kZXJ9ICovXG4gIHRoaXMuX2RlY29kZXIgPSBudWxsO1xuICAvKiogQHByaXZhdGUgQHR5cGUge2Jvb2xlYW59ICovXG4gIHRoaXMuX2ZhdGFsID0gQm9vbGVhbihvcHRpb25zWydmYXRhbCddKTtcbiAgLyoqIEBwcml2YXRlIEB0eXBlIHtib29sZWFufSAqL1xuICB0aGlzLl9pZ25vcmVCT00gPSBCb29sZWFuKG9wdGlvbnNbJ2lnbm9yZUJPTSddKTtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgJ2VuY29kaW5nJywge3ZhbHVlOiAndXRmLTgnfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZmF0YWwnLCB7dmFsdWU6IHRoaXMuX2ZhdGFsfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCAnaWdub3JlQk9NJywge3ZhbHVlOiB0aGlzLl9pZ25vcmVCT019KTtcbn1cblxuVGV4dERlY29kZXIucHJvdG90eXBlID0ge1xuICAvKipcbiAgICogQHBhcmFtIHtBcnJheUJ1ZmZlclZpZXc9fSBpbnB1dCBUaGUgYnVmZmVyIG9mIGJ5dGVzIHRvIGRlY29kZS5cbiAgICogQHBhcmFtIHtPYmplY3Q9fSBvcHRpb25zXG4gICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nLlxuICAgKi9cbiAgZGVjb2RlOiBmdW5jdGlvbiBkZWNvZGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICB2YXIgYnl0ZXM7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ29iamVjdCcgJiYgaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdvYmplY3QnICYmICdidWZmZXInIGluIGlucHV0ICYmXG4gICAgICAgICAgICAgICBpbnB1dC5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShpbnB1dC5idWZmZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmJ5dGVPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmJ5dGVMZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cblxuICAgIG9wdGlvbnMgPSBUb0RpY3Rpb25hcnkob3B0aW9ucyk7XG5cbiAgICBpZiAoIXRoaXMuX3N0cmVhbWluZykge1xuICAgICAgdGhpcy5fZGVjb2RlciA9IG5ldyBVVEY4RGVjb2Rlcih7ZmF0YWw6IHRoaXMuX2ZhdGFsfSk7XG4gICAgICB0aGlzLl9CT01zZWVuID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX3N0cmVhbWluZyA9IEJvb2xlYW4ob3B0aW9uc1snc3RyZWFtJ10pO1xuXG4gICAgdmFyIGlucHV0X3N0cmVhbSA9IG5ldyBTdHJlYW0oYnl0ZXMpO1xuXG4gICAgdmFyIGNvZGVfcG9pbnRzID0gW107XG5cbiAgICAvKiogQHR5cGUgez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9ICovXG4gICAgdmFyIHJlc3VsdDtcblxuICAgIHdoaWxlICghaW5wdXRfc3RyZWFtLmVuZE9mU3RyZWFtKCkpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZXIuaGFuZGxlcihpbnB1dF9zdHJlYW0sIGlucHV0X3N0cmVhbS5yZWFkKCkpO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gZmluaXNoZWQpXG4gICAgICAgIGJyZWFrO1xuICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgY29udGludWU7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKVxuICAgICAgICBjb2RlX3BvaW50cy5wdXNoLmFwcGx5KGNvZGVfcG9pbnRzLCAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovKHJlc3VsdCkpO1xuICAgICAgZWxzZVxuICAgICAgICBjb2RlX3BvaW50cy5wdXNoKHJlc3VsdCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc3RyZWFtaW5nKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX2RlY29kZXIuaGFuZGxlcihpbnB1dF9zdHJlYW0sIGlucHV0X3N0cmVhbS5yZWFkKCkpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBmaW5pc2hlZClcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gbnVsbClcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0KSlcbiAgICAgICAgICBjb2RlX3BvaW50cy5wdXNoLmFwcGx5KGNvZGVfcG9pbnRzLCAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovKHJlc3VsdCkpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgY29kZV9wb2ludHMucHVzaChyZXN1bHQpO1xuICAgICAgfSB3aGlsZSAoIWlucHV0X3N0cmVhbS5lbmRPZlN0cmVhbSgpKTtcbiAgICAgIHRoaXMuX2RlY29kZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChjb2RlX3BvaW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIElmIGVuY29kaW5nIGlzIG9uZSBvZiB1dGYtOCwgdXRmLTE2YmUsIGFuZCB1dGYtMTZsZSwgYW5kXG4gICAgICAvLyBpZ25vcmUgQk9NIGZsYWcgYW5kIEJPTSBzZWVuIGZsYWcgYXJlIHVuc2V0LCBydW4gdGhlc2VcbiAgICAgIC8vIHN1YnN1YnN0ZXBzOlxuICAgICAgaWYgKFsndXRmLTgnXS5pbmRleE9mKHRoaXMuZW5jb2RpbmcpICE9PSAtMSAmJlxuICAgICAgICAgICF0aGlzLl9pZ25vcmVCT00gJiYgIXRoaXMuX0JPTXNlZW4pIHtcbiAgICAgICAgLy8gSWYgdG9rZW4gaXMgVStGRUZGLCBzZXQgQk9NIHNlZW4gZmxhZy5cbiAgICAgICAgaWYgKGNvZGVfcG9pbnRzWzBdID09PSAweEZFRkYpIHtcbiAgICAgICAgICB0aGlzLl9CT01zZWVuID0gdHJ1ZTtcbiAgICAgICAgICBjb2RlX3BvaW50cy5zaGlmdCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWYgdG9rZW4gaXMgbm90IGVuZC1vZi1zdHJlYW0sIHNldCBCT00gc2VlblxuICAgICAgICAgIC8vIGZsYWcgYW5kIGFwcGVuZCB0b2tlbiB0byBvdXRwdXQuXG4gICAgICAgICAgdGhpcy5fQk9Nc2VlbiA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29kZVBvaW50c1RvU3RyaW5nKGNvZGVfcG9pbnRzKTtcbiAgfVxufTtcblxuLy8gNy4yIEludGVyZmFjZSBUZXh0RW5jb2RlclxuXG4vKipcbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtzdHJpbmc9fSBlbmNvZGluZyBUaGUgbGFiZWwgb2YgdGhlIGVuY29kaW5nO1xuICogICAgIGRlZmF1bHRzIHRvICd1dGYtOCcuXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gVGV4dEVuY29kZXIoZW5jb2RpbmcsIG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFRleHRFbmNvZGVyKSlcbiAgICByZXR1cm4gbmV3IFRleHRFbmNvZGVyKGVuY29kaW5nLCBvcHRpb25zKTtcbiAgZW5jb2RpbmcgPSBlbmNvZGluZyAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpIDogREVGQVVMVF9FTkNPRElORztcbiAgaWYgKGVuY29kaW5nICE9PSBERUZBVUxUX0VOQ09ESU5HKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdFbmNvZGluZyBub3Qgc3VwcG9ydGVkLiBPbmx5IHV0Zi04IGlzIHN1cHBvcnRlZCcpO1xuICB9XG4gIG9wdGlvbnMgPSBUb0RpY3Rpb25hcnkob3B0aW9ucyk7XG5cbiAgLyoqIEBwcml2YXRlIEB0eXBlIHtib29sZWFufSAqL1xuICB0aGlzLl9zdHJlYW1pbmcgPSBmYWxzZTtcbiAgLyoqIEBwcml2YXRlIEB0eXBlIHs/RW5jb2Rlcn0gKi9cbiAgdGhpcy5fZW5jb2RlciA9IG51bGw7XG4gIC8qKiBAcHJpdmF0ZSBAdHlwZSB7e2ZhdGFsOiBib29sZWFufX0gKi9cbiAgdGhpcy5fb3B0aW9ucyA9IHtmYXRhbDogQm9vbGVhbihvcHRpb25zWydmYXRhbCddKX07XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsICdlbmNvZGluZycsIHt2YWx1ZTogJ3V0Zi04J30pO1xufVxuXG5UZXh0RW5jb2Rlci5wcm90b3R5cGUgPSB7XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9wdF9zdHJpbmcgVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9uc1xuICAgKiBAcmV0dXJuIHtVaW50OEFycmF5fSBFbmNvZGVkIGJ5dGVzLCBhcyBhIFVpbnQ4QXJyYXkuXG4gICAqL1xuICBlbmNvZGU6IGZ1bmN0aW9uIGVuY29kZShvcHRfc3RyaW5nLCBvcHRpb25zKSB7XG4gICAgb3B0X3N0cmluZyA9IG9wdF9zdHJpbmcgPyBTdHJpbmcob3B0X3N0cmluZykgOiAnJztcbiAgICBvcHRpb25zID0gVG9EaWN0aW9uYXJ5KG9wdGlvbnMpO1xuXG4gICAgLy8gTk9URTogVGhpcyBvcHRpb24gaXMgbm9uc3RhbmRhcmQuIE5vbmUgb2YgdGhlIGVuY29kaW5nc1xuICAgIC8vIHBlcm1pdHRlZCBmb3IgZW5jb2RpbmcgKGkuZS4gVVRGLTgsIFVURi0xNikgYXJlIHN0YXRlZnVsLFxuICAgIC8vIHNvIHN0cmVhbWluZyBpcyBub3QgbmVjZXNzYXJ5LlxuICAgIGlmICghdGhpcy5fc3RyZWFtaW5nKVxuICAgICAgdGhpcy5fZW5jb2RlciA9IG5ldyBVVEY4RW5jb2Rlcih0aGlzLl9vcHRpb25zKTtcbiAgICB0aGlzLl9zdHJlYW1pbmcgPSBCb29sZWFuKG9wdGlvbnNbJ3N0cmVhbSddKTtcblxuICAgIHZhciBieXRlcyA9IFtdO1xuICAgIHZhciBpbnB1dF9zdHJlYW0gPSBuZXcgU3RyZWFtKHN0cmluZ1RvQ29kZVBvaW50cyhvcHRfc3RyaW5nKSk7XG4gICAgLyoqIEB0eXBlIHs/KG51bWJlcnwhQXJyYXkuPG51bWJlcj4pfSAqL1xuICAgIHZhciByZXN1bHQ7XG4gICAgd2hpbGUgKCFpbnB1dF9zdHJlYW0uZW5kT2ZTdHJlYW0oKSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fZW5jb2Rlci5oYW5kbGVyKGlucHV0X3N0cmVhbSwgaW5wdXRfc3RyZWFtLnJlYWQoKSk7XG4gICAgICBpZiAocmVzdWx0ID09PSBmaW5pc2hlZClcbiAgICAgICAgYnJlYWs7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQpKVxuICAgICAgICBieXRlcy5wdXNoLmFwcGx5KGJ5dGVzLCAvKipAdHlwZSB7IUFycmF5LjxudW1iZXI+fSovKHJlc3VsdCkpO1xuICAgICAgZWxzZVxuICAgICAgICBieXRlcy5wdXNoKHJlc3VsdCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fc3RyZWFtaW5nKSB7XG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLl9lbmNvZGVyLmhhbmRsZXIoaW5wdXRfc3RyZWFtLCBpbnB1dF9zdHJlYW0ucmVhZCgpKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gZmluaXNoZWQpXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdCkpXG4gICAgICAgICAgYnl0ZXMucHVzaC5hcHBseShieXRlcywgLyoqQHR5cGUgeyFBcnJheS48bnVtYmVyPn0qLyhyZXN1bHQpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIGJ5dGVzLnB1c2gocmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2VuY29kZXIgPSBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICB9XG59O1xuXG4vL1xuLy8gOC4gVGhlIGVuY29kaW5nXG4vL1xuXG4vLyA4LjEgdXRmLThcblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBpbXBsZW1lbnRzIHtEZWNvZGVyfVxuICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIFVURjhEZWNvZGVyKG9wdGlvbnMpIHtcbiAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcblxuICAvLyB1dGYtOCdzIGRlY29kZXIncyBoYXMgYW4gYXNzb2NpYXRlZCB1dGYtOCBjb2RlIHBvaW50LCB1dGYtOFxuICAvLyBieXRlcyBzZWVuLCBhbmQgdXRmLTggYnl0ZXMgbmVlZGVkIChhbGwgaW5pdGlhbGx5IDApLCBhIHV0Zi04XG4gIC8vIGxvd2VyIGJvdW5kYXJ5IChpbml0aWFsbHkgMHg4MCksIGFuZCBhIHV0Zi04IHVwcGVyIGJvdW5kYXJ5XG4gIC8vIChpbml0aWFsbHkgMHhCRikuXG4gIHZhciAvKiogQHR5cGUge251bWJlcn0gKi8gdXRmOF9jb2RlX3BvaW50ID0gMCxcbiAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyB1dGY4X2J5dGVzX3NlZW4gPSAwLFxuICAgICAgLyoqIEB0eXBlIHtudW1iZXJ9ICovIHV0ZjhfYnl0ZXNfbmVlZGVkID0gMCxcbiAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyB1dGY4X2xvd2VyX2JvdW5kYXJ5ID0gMHg4MCxcbiAgICAgIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyB1dGY4X3VwcGVyX2JvdW5kYXJ5ID0gMHhCRjtcblxuICAvKipcbiAgICogQHBhcmFtIHtTdHJlYW19IHN0cmVhbSBUaGUgc3RyZWFtIG9mIGJ5dGVzIGJlaW5nIGRlY29kZWQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRlIFRoZSBuZXh0IGJ5dGUgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAqIEByZXR1cm4gez8obnVtYmVyfCFBcnJheS48bnVtYmVyPil9IFRoZSBuZXh0IGNvZGUgcG9pbnQocylcbiAgICogICAgIGRlY29kZWQsIG9yIG51bGwgaWYgbm90IGVub3VnaCBkYXRhIGV4aXN0cyBpbiB0aGUgaW5wdXRcbiAgICogICAgIHN0cmVhbSB0byBkZWNvZGUgYSBjb21wbGV0ZSBjb2RlIHBvaW50LlxuICAgKi9cbiAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBiaXRlKSB7XG4gICAgLy8gMS4gSWYgYnl0ZSBpcyBlbmQtb2Ytc3RyZWFtIGFuZCB1dGYtOCBieXRlcyBuZWVkZWQgaXMgbm90IDAsXG4gICAgLy8gc2V0IHV0Zi04IGJ5dGVzIG5lZWRlZCB0byAwIGFuZCByZXR1cm4gZXJyb3IuXG4gICAgaWYgKGJpdGUgPT09IGVuZF9vZl9zdHJlYW0gJiYgdXRmOF9ieXRlc19uZWVkZWQgIT09IDApIHtcbiAgICAgIHV0ZjhfYnl0ZXNfbmVlZGVkID0gMDtcbiAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgIH1cblxuICAgIC8vIDIuIElmIGJ5dGUgaXMgZW5kLW9mLXN0cmVhbSwgcmV0dXJuIGZpbmlzaGVkLlxuICAgIGlmIChiaXRlID09PSBlbmRfb2Zfc3RyZWFtKVxuICAgICAgcmV0dXJuIGZpbmlzaGVkO1xuXG4gICAgLy8gMy4gSWYgdXRmLTggYnl0ZXMgbmVlZGVkIGlzIDAsIGJhc2VkIG9uIGJ5dGU6XG4gICAgaWYgKHV0ZjhfYnl0ZXNfbmVlZGVkID09PSAwKSB7XG5cbiAgICAgIC8vIDB4MDAgdG8gMHg3RlxuICAgICAgaWYgKGluUmFuZ2UoYml0ZSwgMHgwMCwgMHg3RikpIHtcbiAgICAgICAgLy8gUmV0dXJuIGEgY29kZSBwb2ludCB3aG9zZSB2YWx1ZSBpcyBieXRlLlxuICAgICAgICByZXR1cm4gYml0ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMHhDMiB0byAweERGXG4gICAgICBpZiAoaW5SYW5nZShiaXRlLCAweEMyLCAweERGKSkge1xuICAgICAgICAvLyBTZXQgdXRmLTggYnl0ZXMgbmVlZGVkIHRvIDEgYW5kIHV0Zi04IGNvZGUgcG9pbnQgdG8gYnl0ZVxuICAgICAgICAvLyDiiJIgMHhDMC5cbiAgICAgICAgdXRmOF9ieXRlc19uZWVkZWQgPSAxO1xuICAgICAgICB1dGY4X2NvZGVfcG9pbnQgPSBiaXRlIC0gMHhDMDtcbiAgICAgIH1cblxuICAgICAgLy8gMHhFMCB0byAweEVGXG4gICAgICBlbHNlIGlmIChpblJhbmdlKGJpdGUsIDB4RTAsIDB4RUYpKSB7XG4gICAgICAgIC8vIDEuIElmIGJ5dGUgaXMgMHhFMCwgc2V0IHV0Zi04IGxvd2VyIGJvdW5kYXJ5IHRvIDB4QTAuXG4gICAgICAgIGlmIChiaXRlID09PSAweEUwKVxuICAgICAgICAgIHV0ZjhfbG93ZXJfYm91bmRhcnkgPSAweEEwO1xuICAgICAgICAvLyAyLiBJZiBieXRlIGlzIDB4RUQsIHNldCB1dGYtOCB1cHBlciBib3VuZGFyeSB0byAweDlGLlxuICAgICAgICBpZiAoYml0ZSA9PT0gMHhFRClcbiAgICAgICAgICB1dGY4X3VwcGVyX2JvdW5kYXJ5ID0gMHg5RjtcbiAgICAgICAgLy8gMy4gU2V0IHV0Zi04IGJ5dGVzIG5lZWRlZCB0byAyIGFuZCB1dGYtOCBjb2RlIHBvaW50IHRvXG4gICAgICAgIC8vIGJ5dGUg4oiSIDB4RTAuXG4gICAgICAgIHV0ZjhfYnl0ZXNfbmVlZGVkID0gMjtcbiAgICAgICAgdXRmOF9jb2RlX3BvaW50ID0gYml0ZSAtIDB4RTA7XG4gICAgICB9XG5cbiAgICAgIC8vIDB4RjAgdG8gMHhGNFxuICAgICAgZWxzZSBpZiAoaW5SYW5nZShiaXRlLCAweEYwLCAweEY0KSkge1xuICAgICAgICAvLyAxLiBJZiBieXRlIGlzIDB4RjAsIHNldCB1dGYtOCBsb3dlciBib3VuZGFyeSB0byAweDkwLlxuICAgICAgICBpZiAoYml0ZSA9PT0gMHhGMClcbiAgICAgICAgICB1dGY4X2xvd2VyX2JvdW5kYXJ5ID0gMHg5MDtcbiAgICAgICAgLy8gMi4gSWYgYnl0ZSBpcyAweEY0LCBzZXQgdXRmLTggdXBwZXIgYm91bmRhcnkgdG8gMHg4Ri5cbiAgICAgICAgaWYgKGJpdGUgPT09IDB4RjQpXG4gICAgICAgICAgdXRmOF91cHBlcl9ib3VuZGFyeSA9IDB4OEY7XG4gICAgICAgIC8vIDMuIFNldCB1dGYtOCBieXRlcyBuZWVkZWQgdG8gMyBhbmQgdXRmLTggY29kZSBwb2ludCB0b1xuICAgICAgICAvLyBieXRlIOKIkiAweEYwLlxuICAgICAgICB1dGY4X2J5dGVzX25lZWRlZCA9IDM7XG4gICAgICAgIHV0ZjhfY29kZV9wb2ludCA9IGJpdGUgLSAweEYwO1xuICAgICAgfVxuXG4gICAgICAvLyBPdGhlcndpc2VcbiAgICAgIGVsc2Uge1xuICAgICAgICAvLyBSZXR1cm4gZXJyb3IuXG4gICAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIChieXRlIGlzIGluIHRoZSByYW5nZSAweEMyIHRvIDB4RjQpIHNldCB1dGYtOCBjb2RlXG4gICAgICAvLyBwb2ludCB0byB1dGYtOCBjb2RlIHBvaW50IDw8ICg2IMOXIHV0Zi04IGJ5dGVzIG5lZWRlZCkgYW5kXG4gICAgICAvLyByZXR1cm4gY29udGludWUuXG4gICAgICB1dGY4X2NvZGVfcG9pbnQgPSB1dGY4X2NvZGVfcG9pbnQgPDwgKDYgKiB1dGY4X2J5dGVzX25lZWRlZCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyA0LiBJZiBieXRlIGlzIG5vdCBpbiB0aGUgcmFuZ2UgdXRmLTggbG93ZXIgYm91bmRhcnkgdG8gdXRmLThcbiAgICAvLyB1cHBlciBib3VuZGFyeSwgcnVuIHRoZXNlIHN1YnN0ZXBzOlxuICAgIGlmICghaW5SYW5nZShiaXRlLCB1dGY4X2xvd2VyX2JvdW5kYXJ5LCB1dGY4X3VwcGVyX2JvdW5kYXJ5KSkge1xuXG4gICAgICAvLyAxLiBTZXQgdXRmLTggY29kZSBwb2ludCwgdXRmLTggYnl0ZXMgbmVlZGVkLCBhbmQgdXRmLThcbiAgICAgIC8vIGJ5dGVzIHNlZW4gdG8gMCwgc2V0IHV0Zi04IGxvd2VyIGJvdW5kYXJ5IHRvIDB4ODAsIGFuZCBzZXRcbiAgICAgIC8vIHV0Zi04IHVwcGVyIGJvdW5kYXJ5IHRvIDB4QkYuXG4gICAgICB1dGY4X2NvZGVfcG9pbnQgPSB1dGY4X2J5dGVzX25lZWRlZCA9IHV0ZjhfYnl0ZXNfc2VlbiA9IDA7XG4gICAgICB1dGY4X2xvd2VyX2JvdW5kYXJ5ID0gMHg4MDtcbiAgICAgIHV0ZjhfdXBwZXJfYm91bmRhcnkgPSAweEJGO1xuXG4gICAgICAvLyAyLiBQcmVwZW5kIGJ5dGUgdG8gc3RyZWFtLlxuICAgICAgc3RyZWFtLnByZXBlbmQoYml0ZSk7XG5cbiAgICAgIC8vIDMuIFJldHVybiBlcnJvci5cbiAgICAgIHJldHVybiBkZWNvZGVyRXJyb3IoZmF0YWwpO1xuICAgIH1cblxuICAgIC8vIDUuIFNldCB1dGYtOCBsb3dlciBib3VuZGFyeSB0byAweDgwIGFuZCB1dGYtOCB1cHBlciBib3VuZGFyeVxuICAgIC8vIHRvIDB4QkYuXG4gICAgdXRmOF9sb3dlcl9ib3VuZGFyeSA9IDB4ODA7XG4gICAgdXRmOF91cHBlcl9ib3VuZGFyeSA9IDB4QkY7XG5cbiAgICAvLyA2LiBJbmNyZWFzZSB1dGYtOCBieXRlcyBzZWVuIGJ5IG9uZSBhbmQgc2V0IHV0Zi04IGNvZGUgcG9pbnRcbiAgICAvLyB0byB1dGYtOCBjb2RlIHBvaW50ICsgKGJ5dGUg4oiSIDB4ODApIDw8ICg2IMOXICh1dGYtOCBieXRlc1xuICAgIC8vIG5lZWRlZCDiiJIgdXRmLTggYnl0ZXMgc2VlbikpLlxuICAgIHV0ZjhfYnl0ZXNfc2VlbiArPSAxO1xuICAgIHV0ZjhfY29kZV9wb2ludCArPSAoYml0ZSAtIDB4ODApIDw8ICg2ICogKHV0ZjhfYnl0ZXNfbmVlZGVkIC0gdXRmOF9ieXRlc19zZWVuKSk7XG5cbiAgICAvLyA3LiBJZiB1dGYtOCBieXRlcyBzZWVuIGlzIG5vdCBlcXVhbCB0byB1dGYtOCBieXRlcyBuZWVkZWQsXG4gICAgLy8gY29udGludWUuXG4gICAgaWYgKHV0ZjhfYnl0ZXNfc2VlbiAhPT0gdXRmOF9ieXRlc19uZWVkZWQpXG4gICAgICByZXR1cm4gbnVsbDtcblxuICAgIC8vIDguIExldCBjb2RlIHBvaW50IGJlIHV0Zi04IGNvZGUgcG9pbnQuXG4gICAgdmFyIGNvZGVfcG9pbnQgPSB1dGY4X2NvZGVfcG9pbnQ7XG5cbiAgICAvLyA5LiBTZXQgdXRmLTggY29kZSBwb2ludCwgdXRmLTggYnl0ZXMgbmVlZGVkLCBhbmQgdXRmLTggYnl0ZXNcbiAgICAvLyBzZWVuIHRvIDAuXG4gICAgdXRmOF9jb2RlX3BvaW50ID0gdXRmOF9ieXRlc19uZWVkZWQgPSB1dGY4X2J5dGVzX3NlZW4gPSAwO1xuXG4gICAgLy8gMTAuIFJldHVybiBhIGNvZGUgcG9pbnQgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICByZXR1cm4gY29kZV9wb2ludDtcbiAgfTtcbn1cblxuLyoqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBpbXBsZW1lbnRzIHtFbmNvZGVyfVxuICogQHBhcmFtIHt7ZmF0YWw6IGJvb2xlYW59fSBvcHRpb25zXG4gKi9cbmZ1bmN0aW9uIFVURjhFbmNvZGVyKG9wdGlvbnMpIHtcbiAgdmFyIGZhdGFsID0gb3B0aW9ucy5mYXRhbDtcbiAgLyoqXG4gICAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gSW5wdXQgc3RyZWFtLlxuICAgKiBAcGFyYW0ge251bWJlcn0gY29kZV9wb2ludCBOZXh0IGNvZGUgcG9pbnQgcmVhZCBmcm9tIHRoZSBzdHJlYW0uXG4gICAqIEByZXR1cm4geyhudW1iZXJ8IUFycmF5LjxudW1iZXI+KX0gQnl0ZShzKSB0byBlbWl0LlxuICAgKi9cbiAgdGhpcy5oYW5kbGVyID0gZnVuY3Rpb24oc3RyZWFtLCBjb2RlX3BvaW50KSB7XG4gICAgLy8gMS4gSWYgY29kZSBwb2ludCBpcyBlbmQtb2Ytc3RyZWFtLCByZXR1cm4gZmluaXNoZWQuXG4gICAgaWYgKGNvZGVfcG9pbnQgPT09IGVuZF9vZl9zdHJlYW0pXG4gICAgICByZXR1cm4gZmluaXNoZWQ7XG5cbiAgICAvLyAyLiBJZiBjb2RlIHBvaW50IGlzIGluIHRoZSByYW5nZSBVKzAwMDAgdG8gVSswMDdGLCByZXR1cm4gYVxuICAgIC8vIGJ5dGUgd2hvc2UgdmFsdWUgaXMgY29kZSBwb2ludC5cbiAgICBpZiAoaW5SYW5nZShjb2RlX3BvaW50LCAweDAwMDAsIDB4MDA3ZikpXG4gICAgICByZXR1cm4gY29kZV9wb2ludDtcblxuICAgIC8vIDMuIFNldCBjb3VudCBhbmQgb2Zmc2V0IGJhc2VkIG9uIHRoZSByYW5nZSBjb2RlIHBvaW50IGlzIGluOlxuICAgIHZhciBjb3VudCwgb2Zmc2V0O1xuICAgIC8vIFUrMDA4MCB0byBVKzA3RkY6ICAgIDEgYW5kIDB4QzBcbiAgICBpZiAoaW5SYW5nZShjb2RlX3BvaW50LCAweDAwODAsIDB4MDdGRikpIHtcbiAgICAgIGNvdW50ID0gMTtcbiAgICAgIG9mZnNldCA9IDB4QzA7XG4gICAgfVxuICAgIC8vIFUrMDgwMCB0byBVK0ZGRkY6ICAgIDIgYW5kIDB4RTBcbiAgICBlbHNlIGlmIChpblJhbmdlKGNvZGVfcG9pbnQsIDB4MDgwMCwgMHhGRkZGKSkge1xuICAgICAgY291bnQgPSAyO1xuICAgICAgb2Zmc2V0ID0gMHhFMDtcbiAgICB9XG4gICAgLy8gVSsxMDAwMCB0byBVKzEwRkZGRjogMyBhbmQgMHhGMFxuICAgIGVsc2UgaWYgKGluUmFuZ2UoY29kZV9wb2ludCwgMHgxMDAwMCwgMHgxMEZGRkYpKSB7XG4gICAgICBjb3VudCA9IDM7XG4gICAgICBvZmZzZXQgPSAweEYwO1xuICAgIH1cblxuICAgIC8vIDQuTGV0IGJ5dGVzIGJlIGEgYnl0ZSBzZXF1ZW5jZSB3aG9zZSBmaXJzdCBieXRlIGlzIChjb2RlXG4gICAgLy8gcG9pbnQgPj4gKDYgw5cgY291bnQpKSArIG9mZnNldC5cbiAgICB2YXIgYnl0ZXMgPSBbKGNvZGVfcG9pbnQgPj4gKDYgKiBjb3VudCkpICsgb2Zmc2V0XTtcblxuICAgIC8vIDUuIFJ1biB0aGVzZSBzdWJzdGVwcyB3aGlsZSBjb3VudCBpcyBncmVhdGVyIHRoYW4gMDpcbiAgICB3aGlsZSAoY291bnQgPiAwKSB7XG5cbiAgICAgIC8vIDEuIFNldCB0ZW1wIHRvIGNvZGUgcG9pbnQgPj4gKDYgw5cgKGNvdW50IOKIkiAxKSkuXG4gICAgICB2YXIgdGVtcCA9IGNvZGVfcG9pbnQgPj4gKDYgKiAoY291bnQgLSAxKSk7XG5cbiAgICAgIC8vIDIuIEFwcGVuZCB0byBieXRlcyAweDgwIHwgKHRlbXAgJiAweDNGKS5cbiAgICAgIGJ5dGVzLnB1c2goMHg4MCB8ICh0ZW1wICYgMHgzRikpO1xuXG4gICAgICAvLyAzLiBEZWNyZWFzZSBjb3VudCBieSBvbmUuXG4gICAgICBjb3VudCAtPSAxO1xuICAgIH1cblxuICAgIC8vIDYuIFJldHVybiBieXRlcyBieXRlcywgaW4gb3JkZXIuXG4gICAgcmV0dXJuIGJ5dGVzO1xuICB9O1xufVxuXG5leHBvcnRzLlRleHRFbmNvZGVyID0gVGV4dEVuY29kZXI7XG5leHBvcnRzLlRleHREZWNvZGVyID0gVGV4dERlY29kZXI7Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/text-encoding-utf-8/lib/encoding.lib.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/index.js":
/*!*****************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/index.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   NIL: () => (/* reexport safe */ _nil_js__WEBPACK_IMPORTED_MODULE_4__[\"default\"]),\n/* harmony export */   parse: () => (/* reexport safe */ _parse_js__WEBPACK_IMPORTED_MODULE_8__[\"default\"]),\n/* harmony export */   stringify: () => (/* reexport safe */ _stringify_js__WEBPACK_IMPORTED_MODULE_7__[\"default\"]),\n/* harmony export */   v1: () => (/* reexport safe */ _v1_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */   v3: () => (/* reexport safe */ _v3_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]),\n/* harmony export */   v4: () => (/* reexport safe */ _v4_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"]),\n/* harmony export */   v5: () => (/* reexport safe */ _v5_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"]),\n/* harmony export */   validate: () => (/* reexport safe */ _validate_js__WEBPACK_IMPORTED_MODULE_6__[\"default\"]),\n/* harmony export */   version: () => (/* reexport safe */ _version_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"])\n/* harmony export */ });\n/* harmony import */ var _v1_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v1.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v1.js\");\n/* harmony import */ var _v3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v3.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v3.js\");\n/* harmony import */ var _v4_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v4.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v4.js\");\n/* harmony import */ var _v5_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v5.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v5.js\");\n/* harmony import */ var _nil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nil.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/nil.js\");\n/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/version.js\");\n/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./validate.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/validate.js\");\n/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringify.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/stringify.js\");\n/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./parse.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/parse.js\");\n\n\n\n\n\n\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvaW5kZXguanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQXdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0U7QUFDUTtBQUNFO0FBQ0UiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IGRlZmF1bHQgYXMgdjEgfSBmcm9tICcuL3YxLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjMgfSBmcm9tICcuL3YzLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjQgfSBmcm9tICcuL3Y0LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjUgfSBmcm9tICcuL3Y1LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTklMIH0gZnJvbSAnLi9uaWwuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsaWRhdGUgfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZSB9IGZyb20gJy4vcGFyc2UuanMnOyJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/index.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/md5.js":
/*!***************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/md5.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n  if (typeof bytes === 'string') {\n    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n    bytes = new Uint8Array(msg.length);\n\n    for (var i = 0; i < msg.length; ++i) {\n      bytes[i] = msg.charCodeAt(i);\n    }\n  }\n\n  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n  var output = [];\n  var length32 = input.length * 32;\n  var hexTab = '0123456789abcdef';\n\n  for (var i = 0; i < length32; i += 8) {\n    var x = input[i >> 5] >>> i % 32 & 0xff;\n    var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n    output.push(hex);\n  }\n\n  return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n  /* append padding */\n  x[len >> 5] |= 0x80 << len % 32;\n  x[getOutputLength(len) - 1] = len;\n  var a = 1732584193;\n  var b = -271733879;\n  var c = -1732584194;\n  var d = 271733878;\n\n  for (var i = 0; i < x.length; i += 16) {\n    var olda = a;\n    var oldb = b;\n    var oldc = c;\n    var oldd = d;\n    a = md5ff(a, b, c, d, x[i], 7, -680876936);\n    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n    b = md5gg(b, c, d, a, x[i], 20, -373897302);\n    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n    d = md5hh(d, a, b, c, x[i], 11, -358537222);\n    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n    a = md5ii(a, b, c, d, x[i], 6, -198630844);\n    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n    a = safeAdd(a, olda);\n    b = safeAdd(b, oldb);\n    c = safeAdd(c, oldc);\n    d = safeAdd(d, oldd);\n  }\n\n  return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n  if (input.length === 0) {\n    return [];\n  }\n\n  var length8 = input.length * 8;\n  var output = new Uint32Array(getOutputLength(length8));\n\n  for (var i = 0; i < length8; i += 8) {\n    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n  }\n\n  return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n  var lsw = (x & 0xffff) + (y & 0xffff);\n  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n  return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n  return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n  return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n  return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n  return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n  return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (md5);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbWQ1LmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1EQUFtRDs7QUFFbkQ7O0FBRUEsb0JBQW9CLGdCQUFnQjtBQUNwQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsa0JBQWtCLGNBQWM7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGtCQUFrQixjQUFjO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxrQkFBa0IsYUFBYTtBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBLGlFQUFlLEdBQUciLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL21kNS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQnJvd3Nlci1jb21wYXRpYmxlIEphdmFTY3JpcHQgTUQ1XG4gKlxuICogTW9kaWZpY2F0aW9uIG9mIEphdmFTY3JpcHQgTUQ1XG4gKiBodHRwczovL2dpdGh1Yi5jb20vYmx1ZWltcC9KYXZhU2NyaXB0LU1ENVxuICpcbiAqIENvcHlyaWdodCAyMDExLCBTZWJhc3RpYW4gVHNjaGFuXG4gKiBodHRwczovL2JsdWVpbXAubmV0XG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOlxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVRcbiAqXG4gKiBCYXNlZCBvblxuICogQSBKYXZhU2NyaXB0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUgTWVzc2FnZVxuICogRGlnZXN0IEFsZ29yaXRobSwgYXMgZGVmaW5lZCBpbiBSRkMgMTMyMS5cbiAqIFZlcnNpb24gMi4yIENvcHlyaWdodCAoQykgUGF1bCBKb2huc3RvbiAxOTk5IC0gMjAwOVxuICogT3RoZXIgY29udHJpYnV0b3JzOiBHcmVnIEhvbHQsIEFuZHJldyBLZXBlcnQsIFlkbmFyLCBMb3N0aW5ldFxuICogRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJTRCBMaWNlbnNlXG4gKiBTZWUgaHR0cDovL3BhamhvbWUub3JnLnVrL2NyeXB0L21kNSBmb3IgbW9yZSBpbmZvLlxuICovXG5mdW5jdGlvbiBtZDUoYnl0ZXMpIHtcbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IG5ldyBVaW50OEFycmF5KG1zZy5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzW2ldID0gbXNnLmNoYXJDb2RlQXQoaSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1kNVRvSGV4RW5jb2RlZEFycmF5KHdvcmRzVG9NZDUoYnl0ZXNUb1dvcmRzKGJ5dGVzKSwgYnl0ZXMubGVuZ3RoICogOCkpO1xufVxuLypcbiAqIENvbnZlcnQgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcyB0byBhbiBhcnJheSBvZiBieXRlc1xuICovXG5cblxuZnVuY3Rpb24gbWQ1VG9IZXhFbmNvZGVkQXJyYXkoaW5wdXQpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICB2YXIgbGVuZ3RoMzIgPSBpbnB1dC5sZW5ndGggKiAzMjtcbiAgdmFyIGhleFRhYiA9ICcwMTIzNDU2Nzg5YWJjZGVmJztcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDMyOyBpICs9IDgpIHtcbiAgICB2YXIgeCA9IGlucHV0W2kgPj4gNV0gPj4+IGkgJSAzMiAmIDB4ZmY7XG4gICAgdmFyIGhleCA9IHBhcnNlSW50KGhleFRhYi5jaGFyQXQoeCA+Pj4gNCAmIDB4MGYpICsgaGV4VGFiLmNoYXJBdCh4ICYgMHgwZiksIDE2KTtcbiAgICBvdXRwdXQucHVzaChoZXgpO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlIG91dHB1dCBsZW5ndGggd2l0aCBwYWRkaW5nIGFuZCBiaXQgbGVuZ3RoXG4gKi9cblxuXG5mdW5jdGlvbiBnZXRPdXRwdXRMZW5ndGgoaW5wdXRMZW5ndGg4KSB7XG4gIHJldHVybiAoaW5wdXRMZW5ndGg4ICsgNjQgPj4+IDkgPDwgNCkgKyAxNCArIDE7XG59XG4vKlxuICogQ2FsY3VsYXRlIHRoZSBNRDUgb2YgYW4gYXJyYXkgb2YgbGl0dGxlLWVuZGlhbiB3b3JkcywgYW5kIGEgYml0IGxlbmd0aC5cbiAqL1xuXG5cbmZ1bmN0aW9uIHdvcmRzVG9NZDUoeCwgbGVuKSB7XG4gIC8qIGFwcGVuZCBwYWRkaW5nICovXG4gIHhbbGVuID4+IDVdIHw9IDB4ODAgPDwgbGVuICUgMzI7XG4gIHhbZ2V0T3V0cHV0TGVuZ3RoKGxlbikgLSAxXSA9IGxlbjtcbiAgdmFyIGEgPSAxNzMyNTg0MTkzO1xuICB2YXIgYiA9IC0yNzE3MzM4Nzk7XG4gIHZhciBjID0gLTE3MzI1ODQxOTQ7XG4gIHZhciBkID0gMjcxNzMzODc4O1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICB2YXIgb2xkYSA9IGE7XG4gICAgdmFyIG9sZGIgPSBiO1xuICAgIHZhciBvbGRjID0gYztcbiAgICB2YXIgb2xkZCA9IGQ7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaV0sIDcsIC02ODA4NzY5MzYpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyAxXSwgMTIsIC0zODk1NjQ1ODYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAyXSwgMTcsIDYwNjEwNTgxOSk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDNdLCAyMiwgLTEwNDQ1MjUzMzApO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNywgLTE3NjQxODg5Nyk7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDVdLCAxMiwgMTIwMDA4MDQyNik7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNywgLTE0NzMyMzEzNDEpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyA3XSwgMjIsIC00NTcwNTk4Myk7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA3LCAxNzcwMDM1NDE2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgOV0sIDEyLCAtMTk1ODQxNDQxNyk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTcsIC00MjA2Myk7XG4gICAgYiA9IG1kNWZmKGIsIGMsIGQsIGEsIHhbaSArIDExXSwgMjIsIC0xOTkwNDA0MTYyKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA3LCAxODA0NjAzNjgyKTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMTNdLCAxMiwgLTQwMzQxMTAxKTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNywgLTE1MDIwMDIyOTApO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxNV0sIDIyLCAxMjM2NTM1MzI5KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgMV0sIDUsIC0xNjU3OTY1MTApO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyA2XSwgOSwgLTEwNjk1MDE2MzIpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE0LCA2NDM3MTc3MTMpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2ldLCAyMCwgLTM3Mzg5NzMwMik7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDVdLCA1LCAtNzAxNTU4NjkxKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTBdLCA5LCAzODAxNjA4Myk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTQsIC02NjA0NzgzMzUpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA0XSwgMjAsIC00MDU1Mzc4NDgpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNSwgNTY4NDQ2NDM4KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMTRdLCA5LCAtMTAxOTgwMzY5MCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNCwgLTE4NzM2Mzk2MSk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDhdLCAyMCwgMTE2MzUzMTUwMSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDEzXSwgNSwgLTE0NDQ2ODE0NjcpO1xuICAgIGQgPSBtZDVnZyhkLCBhLCBiLCBjLCB4W2kgKyAyXSwgOSwgLTUxNDAzNzg0KTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgN10sIDE0LCAxNzM1MzI4NDczKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgMTJdLCAyMCwgLTE5MjY2MDc3MzQpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNCwgLTM3ODU1OCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDhdLCAxMSwgLTIwMjI1NzQ0NjMpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxMV0sIDE2LCAxODM5MDMwNTYyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTRdLCAyMywgLTM1MzA5NTU2KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMV0sIDQsIC0xNTMwOTkyMDYwKTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgNF0sIDExLCAxMjcyODkzMzUzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgN10sIDE2LCAtMTU1NDk3NjMyKTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgMTBdLCAyMywgLTEwOTQ3MzA2NDApO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDQsIDY4MTI3OTE3NCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaV0sIDExLCAtMzU4NTM3MjIyKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgM10sIDE2LCAtNzIyNTIxOTc5KTtcbiAgICBiID0gbWQ1aGgoYiwgYywgZCwgYSwgeFtpICsgNl0sIDIzLCA3NjAyOTE4OSk7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDldLCA0LCAtNjQwMzY0NDg3KTtcbiAgICBkID0gbWQ1aGgoZCwgYSwgYiwgYywgeFtpICsgMTJdLCAxMSwgLTQyMTgxNTgzNSk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDE1XSwgMTYsIDUzMDc0MjUyMCk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDJdLCAyMywgLTk5NTMzODY1MSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaV0sIDYsIC0xOTg2MzA4NDQpO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyA3XSwgMTAsIDExMjY4OTE0MTUpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxNF0sIDE1LCAtMTQxNjM1NDkwNSk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDVdLCAyMSwgLTU3NDM0MDU1KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgMTJdLCA2LCAxNzAwNDg1NTcxKTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgM10sIDEwLCAtMTg5NDk4NjYwNik7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDEwXSwgMTUsIC0xMDUxNTIzKTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgMV0sIDIxLCAtMjA1NDkyMjc5OSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDhdLCA2LCAxODczMzEzMzU5KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgMTVdLCAxMCwgLTMwNjExNzQ0KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgNl0sIDE1LCAtMTU2MDE5ODM4MCk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDEzXSwgMjEsIDEzMDkxNTE2NDkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA0XSwgNiwgLTE0NTUyMzA3MCk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDExXSwgMTAsIC0xMTIwMjEwMzc5KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE1LCA3MTg3ODcyNTkpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA5XSwgMjEsIC0zNDM0ODU1NTEpO1xuICAgIGEgPSBzYWZlQWRkKGEsIG9sZGEpO1xuICAgIGIgPSBzYWZlQWRkKGIsIG9sZGIpO1xuICAgIGMgPSBzYWZlQWRkKGMsIG9sZGMpO1xuICAgIGQgPSBzYWZlQWRkKGQsIG9sZGQpO1xuICB9XG5cbiAgcmV0dXJuIFthLCBiLCBjLCBkXTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IGJ5dGVzIHRvIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHNcbiAqIENoYXJhY3RlcnMgPjI1NSBoYXZlIHRoZWlyIGhpZ2gtYnl0ZSBzaWxlbnRseSBpZ25vcmVkLlxuICovXG5cblxuZnVuY3Rpb24gYnl0ZXNUb1dvcmRzKGlucHV0KSB7XG4gIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgbGVuZ3RoOCA9IGlucHV0Lmxlbmd0aCAqIDg7XG4gIHZhciBvdXRwdXQgPSBuZXcgVWludDMyQXJyYXkoZ2V0T3V0cHV0TGVuZ3RoKGxlbmd0aDgpKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDg7IGkgKz0gOCkge1xuICAgIG91dHB1dFtpID4+IDVdIHw9IChpbnB1dFtpIC8gOF0gJiAweGZmKSA8PCBpICUgMzI7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuLypcbiAqIEFkZCBpbnRlZ2Vycywgd3JhcHBpbmcgYXQgMl4zMi4gVGhpcyB1c2VzIDE2LWJpdCBvcGVyYXRpb25zIGludGVybmFsbHlcbiAqIHRvIHdvcmsgYXJvdW5kIGJ1Z3MgaW4gc29tZSBKUyBpbnRlcnByZXRlcnMuXG4gKi9cblxuXG5mdW5jdGlvbiBzYWZlQWRkKHgsIHkpIHtcbiAgdmFyIGxzdyA9ICh4ICYgMHhmZmZmKSArICh5ICYgMHhmZmZmKTtcbiAgdmFyIG1zdyA9ICh4ID4+IDE2KSArICh5ID4+IDE2KSArIChsc3cgPj4gMTYpO1xuICByZXR1cm4gbXN3IDw8IDE2IHwgbHN3ICYgMHhmZmZmO1xufVxuLypcbiAqIEJpdHdpc2Ugcm90YXRlIGEgMzItYml0IG51bWJlciB0byB0aGUgbGVmdC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJpdFJvdGF0ZUxlZnQobnVtLCBjbnQpIHtcbiAgcmV0dXJuIG51bSA8PCBjbnQgfCBudW0gPj4+IDMyIC0gY250O1xufVxuLypcbiAqIFRoZXNlIGZ1bmN0aW9ucyBpbXBsZW1lbnQgdGhlIGZvdXIgYmFzaWMgb3BlcmF0aW9ucyB0aGUgYWxnb3JpdGhtIHVzZXMuXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVjbW4ocSwgYSwgYiwgeCwgcywgdCkge1xuICByZXR1cm4gc2FmZUFkZChiaXRSb3RhdGVMZWZ0KHNhZmVBZGQoc2FmZUFkZChhLCBxKSwgc2FmZUFkZCh4LCB0KSksIHMpLCBiKTtcbn1cblxuZnVuY3Rpb24gbWQ1ZmYoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBjIHwgfmIgJiBkLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1Z2coYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgJiBkIHwgYyAmIH5kLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZnVuY3Rpb24gbWQ1aGgoYSwgYiwgYywgZCwgeCwgcywgdCkge1xuICByZXR1cm4gbWQ1Y21uKGIgXiBjIF4gZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWlpKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihjIF4gKGIgfCB+ZCksIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBtZDU7Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/md5.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/nil.js":
/*!***************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/nil.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ('00000000-0000-0000-0000-000000000000');//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbmlsLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSxpRUFBZSxzQ0FBc0MiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL25pbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCAnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJzsiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/nil.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/parse.js":
/*!*****************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/parse.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/validate.js\");\n\n\nfunction parse(uuid) {\n  if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(uuid)) {\n    throw TypeError('Invalid UUID');\n  }\n\n  var v;\n  var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n  arr[1] = v >>> 16 & 0xff;\n  arr[2] = v >>> 8 & 0xff;\n  arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n  arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n  arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n  arr[9] = v & 0xff; // Parse ........-....-....-....-############\n  // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n  arr[11] = v / 0x100000000 & 0xff;\n  arr[12] = v >>> 24 & 0xff;\n  arr[13] = v >>> 16 & 0xff;\n  arr[14] = v >>> 8 & 0xff;\n  arr[15] = v & 0xff;\n  return arr;\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (parse);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcGFyc2UuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBcUM7O0FBRXJDO0FBQ0EsT0FBTyx3REFBUTtBQUNmO0FBQ0E7O0FBRUE7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQSxxQkFBcUI7O0FBRXJCO0FBQ0EscUJBQXFCOztBQUVyQjtBQUNBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLGlFQUFlLEtBQUsiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3BhcnNlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gcGFyc2UodXVpZCkge1xuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuXG4gIHZhciB2O1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBQYXJzZSAjIyMjIyMjIy0uLi4uLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0O1xuICBhcnJbMV0gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsyXSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbM10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tIyMjIy0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzRdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDksIDEzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzVdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tIyMjIy0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls2XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTgpLCAxNikpID4+PiA4O1xuICBhcnJbN10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLSMjIyMtLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzhdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDg7XG4gIGFycls5XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tLi4uLi0jIyMjIyMjIyMjIyNcbiAgLy8gKFVzZSBcIi9cIiB0byBhdm9pZCAzMi1iaXQgdHJ1bmNhdGlvbiB3aGVuIGJpdC1zaGlmdGluZyBoaWdoLW9yZGVyIGJ5dGVzKVxuXG4gIGFyclsxMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMjQsIDM2KSwgMTYpKSAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTFdID0gdiAvIDB4MTAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzEyXSA9IHYgPj4+IDI0ICYgMHhmZjtcbiAgYXJyWzEzXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzE0XSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbMTVdID0gdiAmIDB4ZmY7XG4gIHJldHVybiBhcnI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnNlOyJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/parse.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/regex.js":
/*!*****************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/regex.js ***!
  \*****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLGNBQWMsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFVBQVUsR0FBRyx5Q0FBeUMiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JlZ2V4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/regex.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/rng.js":
/*!***************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/rng.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (/* binding */ rng)\n/* harmony export */ });\n// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nfunction rng() {\n  // lazy load so that environments that need to polyfill have a chance to do so\n  if (!getRandomValues) {\n    // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n    // find the complete implementation of crypto (msCrypto) on IE11.\n    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n    if (!getRandomValues) {\n      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n    }\n  }\n\n  return getRandomValues(rnds8);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcm5nLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ2U7QUFDZjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbnZhciBnZXRSYW5kb21WYWx1ZXM7XG52YXIgcm5kczggPSBuZXcgVWludDhBcnJheSgxNik7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBybmcoKSB7XG4gIC8vIGxhenkgbG9hZCBzbyB0aGF0IGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gcG9seWZpbGwgaGF2ZSBhIGNoYW5jZSB0byBkbyBzb1xuICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0byBpbXBsZW1lbnRhdGlvbi4gQWxzbyxcbiAgICAvLyBmaW5kIHRoZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBjcnlwdG8gKG1zQ3J5cHRvKSBvbiBJRTExLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0bykgfHwgdHlwZW9mIG1zQ3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nICYmIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKTtcblxuICAgIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/rng.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/sha1.js":
/*!****************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/sha1.js ***!
  \****************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n  switch (s) {\n    case 0:\n      return x & y ^ ~x & z;\n\n    case 1:\n      return x ^ y ^ z;\n\n    case 2:\n      return x & y ^ x & z ^ y & z;\n\n    case 3:\n      return x ^ y ^ z;\n  }\n}\n\nfunction ROTL(x, n) {\n  return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n  var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n  var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n  if (typeof bytes === 'string') {\n    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n    bytes = [];\n\n    for (var i = 0; i < msg.length; ++i) {\n      bytes.push(msg.charCodeAt(i));\n    }\n  } else if (!Array.isArray(bytes)) {\n    // Convert Array-like to Array\n    bytes = Array.prototype.slice.call(bytes);\n  }\n\n  bytes.push(0x80);\n  var l = bytes.length / 4 + 2;\n  var N = Math.ceil(l / 16);\n  var M = new Array(N);\n\n  for (var _i = 0; _i < N; ++_i) {\n    var arr = new Uint32Array(16);\n\n    for (var j = 0; j < 16; ++j) {\n      arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n    }\n\n    M[_i] = arr;\n  }\n\n  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n  M[N - 1][14] = Math.floor(M[N - 1][14]);\n  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n  for (var _i2 = 0; _i2 < N; ++_i2) {\n    var W = new Uint32Array(80);\n\n    for (var t = 0; t < 16; ++t) {\n      W[t] = M[_i2][t];\n    }\n\n    for (var _t = 16; _t < 80; ++_t) {\n      W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n    }\n\n    var a = H[0];\n    var b = H[1];\n    var c = H[2];\n    var d = H[3];\n    var e = H[4];\n\n    for (var _t2 = 0; _t2 < 80; ++_t2) {\n      var s = Math.floor(_t2 / 20);\n      var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n      e = d;\n      d = c;\n      c = ROTL(b, 30) >>> 0;\n      b = a;\n      a = T;\n    }\n\n    H[0] = H[0] + a >>> 0;\n    H[1] = H[1] + b >>> 0;\n    H[2] = H[2] + c >>> 0;\n    H[3] = H[3] + d >>> 0;\n    H[4] = H[4] + e >>> 0;\n  }\n\n  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (sha1);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsbURBQW1EOztBQUVuRDs7QUFFQSxvQkFBb0IsZ0JBQWdCO0FBQ3BDO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLG1CQUFtQixRQUFRO0FBQzNCOztBQUVBLG9CQUFvQixRQUFRO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLFNBQVM7QUFDN0I7O0FBRUEsb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTs7QUFFQSxzQkFBc0IsU0FBUztBQUMvQjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsc0JBQXNCLFVBQVU7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpRUFBZSxJQUFJIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zaGExLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEFkYXB0ZWQgZnJvbSBDaHJpcyBWZW5lc3MnIFNIQTEgY29kZSBhdFxuLy8gaHR0cDovL3d3dy5tb3ZhYmxlLXR5cGUuY28udWsvc2NyaXB0cy9zaGExLmh0bWxcbmZ1bmN0aW9uIGYocywgeCwgeSwgeikge1xuICBzd2l0Y2ggKHMpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4geCAmIHkgXiB+eCAmIHo7XG5cbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4geCBeIHkgXiB6O1xuXG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIHggJiB5IF4geCAmIHogXiB5ICYgejtcblxuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG4gIH1cbn1cblxuZnVuY3Rpb24gUk9UTCh4LCBuKSB7XG4gIHJldHVybiB4IDw8IG4gfCB4ID4+PiAzMiAtIG47XG59XG5cbmZ1bmN0aW9uIHNoYTEoYnl0ZXMpIHtcbiAgdmFyIEsgPSBbMHg1YTgyNzk5OSwgMHg2ZWQ5ZWJhMSwgMHg4ZjFiYmNkYywgMHhjYTYyYzFkNl07XG4gIHZhciBIID0gWzB4Njc0NTIzMDEsIDB4ZWZjZGFiODksIDB4OThiYWRjZmUsIDB4MTAzMjU0NzYsIDB4YzNkMmUxZjBdO1xuXG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlcy5wdXNoKG1zZy5jaGFyQ29kZUF0KGkpKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIUFycmF5LmlzQXJyYXkoYnl0ZXMpKSB7XG4gICAgLy8gQ29udmVydCBBcnJheS1saWtlIHRvIEFycmF5XG4gICAgYnl0ZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChieXRlcyk7XG4gIH1cblxuICBieXRlcy5wdXNoKDB4ODApO1xuICB2YXIgbCA9IGJ5dGVzLmxlbmd0aCAvIDQgKyAyO1xuICB2YXIgTiA9IE1hdGguY2VpbChsIC8gMTYpO1xuICB2YXIgTSA9IG5ldyBBcnJheShOKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgTjsgKytfaSkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDMyQXJyYXkoMTYpO1xuXG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCAxNjsgKytqKSB7XG4gICAgICBhcnJbal0gPSBieXRlc1tfaSAqIDY0ICsgaiAqIDRdIDw8IDI0IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgMV0gPDwgMTYgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAyXSA8PCA4IHwgYnl0ZXNbX2kgKiA2NCArIGogKiA0ICsgM107XG4gICAgfVxuXG4gICAgTVtfaV0gPSBhcnI7XG4gIH1cblxuICBNW04gLSAxXVsxNF0gPSAoYnl0ZXMubGVuZ3RoIC0gMSkgKiA4IC8gTWF0aC5wb3coMiwgMzIpO1xuICBNW04gLSAxXVsxNF0gPSBNYXRoLmZsb29yKE1bTiAtIDFdWzE0XSk7XG4gIE1bTiAtIDFdWzE1XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggJiAweGZmZmZmZmZmO1xuXG4gIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IE47ICsrX2kyKSB7XG4gICAgdmFyIFcgPSBuZXcgVWludDMyQXJyYXkoODApO1xuXG4gICAgZm9yICh2YXIgdCA9IDA7IHQgPCAxNjsgKyt0KSB7XG4gICAgICBXW3RdID0gTVtfaTJdW3RdO1xuICAgIH1cblxuICAgIGZvciAodmFyIF90ID0gMTY7IF90IDwgODA7ICsrX3QpIHtcbiAgICAgIFdbX3RdID0gUk9UTChXW190IC0gM10gXiBXW190IC0gOF0gXiBXW190IC0gMTRdIF4gV1tfdCAtIDE2XSwgMSk7XG4gICAgfVxuXG4gICAgdmFyIGEgPSBIWzBdO1xuICAgIHZhciBiID0gSFsxXTtcbiAgICB2YXIgYyA9IEhbMl07XG4gICAgdmFyIGQgPSBIWzNdO1xuICAgIHZhciBlID0gSFs0XTtcblxuICAgIGZvciAodmFyIF90MiA9IDA7IF90MiA8IDgwOyArK190Mikge1xuICAgICAgdmFyIHMgPSBNYXRoLmZsb29yKF90MiAvIDIwKTtcbiAgICAgIHZhciBUID0gUk9UTChhLCA1KSArIGYocywgYiwgYywgZCkgKyBlICsgS1tzXSArIFdbX3QyXSA+Pj4gMDtcbiAgICAgIGUgPSBkO1xuICAgICAgZCA9IGM7XG4gICAgICBjID0gUk9UTChiLCAzMCkgPj4+IDA7XG4gICAgICBiID0gYTtcbiAgICAgIGEgPSBUO1xuICAgIH1cblxuICAgIEhbMF0gPSBIWzBdICsgYSA+Pj4gMDtcbiAgICBIWzFdID0gSFsxXSArIGIgPj4+IDA7XG4gICAgSFsyXSA9IEhbMl0gKyBjID4+PiAwO1xuICAgIEhbM10gPSBIWzNdICsgZCA+Pj4gMDtcbiAgICBIWzRdID0gSFs0XSArIGUgPj4+IDA7XG4gIH1cblxuICByZXR1cm4gW0hbMF0gPj4gMjQgJiAweGZmLCBIWzBdID4+IDE2ICYgMHhmZiwgSFswXSA+PiA4ICYgMHhmZiwgSFswXSAmIDB4ZmYsIEhbMV0gPj4gMjQgJiAweGZmLCBIWzFdID4+IDE2ICYgMHhmZiwgSFsxXSA+PiA4ICYgMHhmZiwgSFsxXSAmIDB4ZmYsIEhbMl0gPj4gMjQgJiAweGZmLCBIWzJdID4+IDE2ICYgMHhmZiwgSFsyXSA+PiA4ICYgMHhmZiwgSFsyXSAmIDB4ZmYsIEhbM10gPj4gMjQgJiAweGZmLCBIWzNdID4+IDE2ICYgMHhmZiwgSFszXSA+PiA4ICYgMHhmZiwgSFszXSAmIDB4ZmYsIEhbNF0gPj4gMjQgJiAweGZmLCBIWzRdID4+IDE2ICYgMHhmZiwgSFs0XSA+PiA4ICYgMHhmZiwgSFs0XSAmIDB4ZmZdO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzaGExOyJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/sha1.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/stringify.js":
/*!*********************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/stringify.js ***!
  \*********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/validate.js\");\n\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n  byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n  var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  // Note: Be careful editing this code!  It's been tuned for performance\n  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n  var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one\n  // of the following:\n  // - One or more input array values don't map to a hex octet (leading to\n  // \"undefined\" in the uuid)\n  // - Invalid input values for the RFC `version` or `variant` fields\n\n  if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(uuid)) {\n    throw TypeError('Stringified UUID is invalid');\n  }\n\n  return uuid;\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (stringify);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQXFDO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBLGdCQUFnQixTQUFTO0FBQ3pCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwZ0JBQTBnQjtBQUMxZ0I7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTyx3REFBUTtBQUNmO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpRUFBZSxTQUFTIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9zdHJpbmdpZnkuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG5cbnZhciBieXRlVG9IZXggPSBbXTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KGFycikge1xuICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgdmFyIHV1aWQgPSAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7IC8vIENvbnNpc3RlbmN5IGNoZWNrIGZvciB2YWxpZCBVVUlELiAgSWYgdGhpcyB0aHJvd3MsIGl0J3MgbGlrZWx5IGR1ZSB0byBvbmVcbiAgLy8gb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gLSBPbmUgb3IgbW9yZSBpbnB1dCBhcnJheSB2YWx1ZXMgZG9uJ3QgbWFwIHRvIGEgaGV4IG9jdGV0IChsZWFkaW5nIHRvXG4gIC8vIFwidW5kZWZpbmVkXCIgaW4gdGhlIHV1aWQpXG4gIC8vIC0gSW52YWxpZCBpbnB1dCB2YWx1ZXMgZm9yIHRoZSBSRkMgYHZlcnNpb25gIG9yIGB2YXJpYW50YCBmaWVsZHNcblxuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHJldHVybiB1dWlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdpZnk7Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/stringify.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v1.js":
/*!**************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/v1.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/rng.js\");\n/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/stringify.js\");\n\n // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n  var i = buf && offset || 0;\n  var b = buf || new Array(16);\n  options = options || {};\n  var node = options.node || _nodeId;\n  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n  // specified.  We do this lazily to minimize issues related to insufficient\n  // system entropy.  See #189\n\n  if (node == null || clockseq == null) {\n    var seedBytes = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])();\n\n    if (node == null) {\n      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n    }\n\n    if (clockseq == null) {\n      // Per 4.2.2, randomize (14 bit) clockseq\n      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n    }\n  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so\n  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n  var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n  // cycle to simulate higher resolution clock\n\n  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n  var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n  if (dt < 0 && options.clockseq === undefined) {\n    clockseq = clockseq + 1 & 0x3fff;\n  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n  // time interval\n\n\n  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n    nsecs = 0;\n  } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n  if (nsecs >= 10000) {\n    throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n  }\n\n  _lastMSecs = msecs;\n  _lastNSecs = nsecs;\n  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n  msecs += 12219292800000; // `time_low`\n\n  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n  b[i++] = tl >>> 24 & 0xff;\n  b[i++] = tl >>> 16 & 0xff;\n  b[i++] = tl >>> 8 & 0xff;\n  b[i++] = tl & 0xff; // `time_mid`\n\n  var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n  b[i++] = tmh >>> 8 & 0xff;\n  b[i++] = tmh & 0xff; // `time_high_and_version`\n\n  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n  b[i++] = clockseq & 0xff; // `node`\n\n  for (var n = 0; n < 6; ++n) {\n    b[i + n] = node[n];\n  }\n\n  return buf || (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(b);\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v1);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjEuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQTJCO0FBQ1ksQ0FBQztBQUN4QztBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsZUFBZTs7O0FBR2Y7QUFDQSxvQkFBb0I7O0FBRXBCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnRkFBZ0Y7QUFDaEY7QUFDQTs7QUFFQTtBQUNBLHNEQUFzRCwrQ0FBRzs7QUFFekQ7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOzs7QUFHQSx3RUFBd0U7QUFDeEU7O0FBRUEsNEVBQTRFOztBQUU1RSw4REFBOEQ7O0FBRTlEO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7OztBQUdBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHdCQUF3Qjs7QUFFeEIsMkJBQTJCOztBQUUzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQjs7QUFFdEI7QUFDQTtBQUNBLHVCQUF1Qjs7QUFFdkIsb0NBQW9DOztBQUVwQyw4QkFBOEI7O0FBRTlCLGtDQUFrQzs7QUFFbEMsNEJBQTRCOztBQUU1QixrQkFBa0IsT0FBTztBQUN6QjtBQUNBOztBQUVBLGdCQUFnQix5REFBUztBQUN6Qjs7QUFFQSxpRUFBZSxFQUFFIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcm5nIGZyb20gJy4vcm5nLmpzJztcbmltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnOyAvLyAqKmB2MSgpYCAtIEdlbmVyYXRlIHRpbWUtYmFzZWQgVVVJRCoqXG4vL1xuLy8gSW5zcGlyZWQgYnkgaHR0cHM6Ly9naXRodWIuY29tL0xpb3NLL1VVSUQuanNcbi8vIGFuZCBodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvdXVpZC5odG1sXG5cbnZhciBfbm9kZUlkO1xuXG52YXIgX2Nsb2Nrc2VxOyAvLyBQcmV2aW91cyB1dWlkIGNyZWF0aW9uIHRpbWVcblxuXG52YXIgX2xhc3RNU2VjcyA9IDA7XG52YXIgX2xhc3ROU2VjcyA9IDA7IC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQgZm9yIEFQSSBkZXRhaWxzXG5cbmZ1bmN0aW9uIHYxKG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIHZhciBpID0gYnVmICYmIG9mZnNldCB8fCAwO1xuICB2YXIgYiA9IGJ1ZiB8fCBuZXcgQXJyYXkoMTYpO1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgdmFyIG5vZGUgPSBvcHRpb25zLm5vZGUgfHwgX25vZGVJZDtcbiAgdmFyIGNsb2Nrc2VxID0gb3B0aW9ucy5jbG9ja3NlcSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5jbG9ja3NlcSA6IF9jbG9ja3NlcTsgLy8gbm9kZSBhbmQgY2xvY2tzZXEgbmVlZCB0byBiZSBpbml0aWFsaXplZCB0byByYW5kb20gdmFsdWVzIGlmIHRoZXkncmUgbm90XG4gIC8vIHNwZWNpZmllZC4gIFdlIGRvIHRoaXMgbGF6aWx5IHRvIG1pbmltaXplIGlzc3VlcyByZWxhdGVkIHRvIGluc3VmZmljaWVudFxuICAvLyBzeXN0ZW0gZW50cm9weS4gIFNlZSAjMTg5XG5cbiAgaWYgKG5vZGUgPT0gbnVsbCB8fCBjbG9ja3NlcSA9PSBudWxsKSB7XG4gICAgdmFyIHNlZWRCeXRlcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7XG5cbiAgICBpZiAobm9kZSA9PSBudWxsKSB7XG4gICAgICAvLyBQZXIgNC41LCBjcmVhdGUgYW5kIDQ4LWJpdCBub2RlIGlkLCAoNDcgcmFuZG9tIGJpdHMgKyBtdWx0aWNhc3QgYml0ID0gMSlcbiAgICAgIG5vZGUgPSBfbm9kZUlkID0gW3NlZWRCeXRlc1swXSB8IDB4MDEsIHNlZWRCeXRlc1sxXSwgc2VlZEJ5dGVzWzJdLCBzZWVkQnl0ZXNbM10sIHNlZWRCeXRlc1s0XSwgc2VlZEJ5dGVzWzVdXTtcbiAgICB9XG5cbiAgICBpZiAoY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuMi4yLCByYW5kb21pemUgKDE0IGJpdCkgY2xvY2tzZXFcbiAgICAgIGNsb2Nrc2VxID0gX2Nsb2Nrc2VxID0gKHNlZWRCeXRlc1s2XSA8PCA4IHwgc2VlZEJ5dGVzWzddKSAmIDB4M2ZmZjtcbiAgICB9XG4gIH0gLy8gVVVJRCB0aW1lc3RhbXBzIGFyZSAxMDAgbmFuby1zZWNvbmQgdW5pdHMgc2luY2UgdGhlIEdyZWdvcmlhbiBlcG9jaCxcbiAgLy8gKDE1ODItMTAtMTUgMDA6MDApLiAgSlNOdW1iZXJzIGFyZW4ndCBwcmVjaXNlIGVub3VnaCBmb3IgdGhpcywgc29cbiAgLy8gdGltZSBpcyBoYW5kbGVkIGludGVybmFsbHkgYXMgJ21zZWNzJyAoaW50ZWdlciBtaWxsaXNlY29uZHMpIGFuZCAnbnNlY3MnXG4gIC8vICgxMDAtbmFub3NlY29uZHMgb2Zmc2V0IGZyb20gbXNlY3MpIHNpbmNlIHVuaXggZXBvY2gsIDE5NzAtMDEtMDEgMDA6MDAuXG5cblxuICB2YXIgbXNlY3MgPSBvcHRpb25zLm1zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm1zZWNzIDogRGF0ZS5ub3coKTsgLy8gUGVyIDQuMi4xLjIsIHVzZSBjb3VudCBvZiB1dWlkJ3MgZ2VuZXJhdGVkIGR1cmluZyB0aGUgY3VycmVudCBjbG9ja1xuICAvLyBjeWNsZSB0byBzaW11bGF0ZSBoaWdoZXIgcmVzb2x1dGlvbiBjbG9ja1xuXG4gIHZhciBuc2VjcyA9IG9wdGlvbnMubnNlY3MgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMubnNlY3MgOiBfbGFzdE5TZWNzICsgMTsgLy8gVGltZSBzaW5jZSBsYXN0IHV1aWQgY3JlYXRpb24gKGluIG1zZWNzKVxuXG4gIHZhciBkdCA9IG1zZWNzIC0gX2xhc3RNU2VjcyArIChuc2VjcyAtIF9sYXN0TlNlY3MpIC8gMTAwMDA7IC8vIFBlciA0LjIuMS4yLCBCdW1wIGNsb2Nrc2VxIG9uIGNsb2NrIHJlZ3Jlc3Npb25cblxuICBpZiAoZHQgPCAwICYmIG9wdGlvbnMuY2xvY2tzZXEgPT09IHVuZGVmaW5lZCkge1xuICAgIGNsb2Nrc2VxID0gY2xvY2tzZXEgKyAxICYgMHgzZmZmO1xuICB9IC8vIFJlc2V0IG5zZWNzIGlmIGNsb2NrIHJlZ3Jlc3NlcyAobmV3IGNsb2Nrc2VxKSBvciB3ZSd2ZSBtb3ZlZCBvbnRvIGEgbmV3XG4gIC8vIHRpbWUgaW50ZXJ2YWxcblxuXG4gIGlmICgoZHQgPCAwIHx8IG1zZWNzID4gX2xhc3RNU2VjcykgJiYgb3B0aW9ucy5uc2VjcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbnNlY3MgPSAwO1xuICB9IC8vIFBlciA0LjIuMS4yIFRocm93IGVycm9yIGlmIHRvbyBtYW55IHV1aWRzIGFyZSByZXF1ZXN0ZWRcblxuXG4gIGlmIChuc2VjcyA+PSAxMDAwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjXCIpO1xuICB9XG5cbiAgX2xhc3RNU2VjcyA9IG1zZWNzO1xuICBfbGFzdE5TZWNzID0gbnNlY3M7XG4gIF9jbG9ja3NlcSA9IGNsb2Nrc2VxOyAvLyBQZXIgNC4xLjQgLSBDb252ZXJ0IGZyb20gdW5peCBlcG9jaCB0byBHcmVnb3JpYW4gZXBvY2hcblxuICBtc2VjcyArPSAxMjIxOTI5MjgwMDAwMDsgLy8gYHRpbWVfbG93YFxuXG4gIHZhciB0bCA9ICgobXNlY3MgJiAweGZmZmZmZmYpICogMTAwMDAgKyBuc2VjcykgJSAweDEwMDAwMDAwMDtcbiAgYltpKytdID0gdGwgPj4+IDI0ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDE2ICYgMHhmZjtcbiAgYltpKytdID0gdGwgPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bCAmIDB4ZmY7IC8vIGB0aW1lX21pZGBcblxuICB2YXIgdG1oID0gbXNlY3MgLyAweDEwMDAwMDAwMCAqIDEwMDAwICYgMHhmZmZmZmZmO1xuICBiW2krK10gPSB0bWggPj4+IDggJiAweGZmO1xuICBiW2krK10gPSB0bWggJiAweGZmOyAvLyBgdGltZV9oaWdoX2FuZF92ZXJzaW9uYFxuXG4gIGJbaSsrXSA9IHRtaCA+Pj4gMjQgJiAweGYgfCAweDEwOyAvLyBpbmNsdWRlIHZlcnNpb25cblxuICBiW2krK10gPSB0bWggPj4+IDE2ICYgMHhmZjsgLy8gYGNsb2NrX3NlcV9oaV9hbmRfcmVzZXJ2ZWRgIChQZXIgNC4yLjIgLSBpbmNsdWRlIHZhcmlhbnQpXG5cbiAgYltpKytdID0gY2xvY2tzZXEgPj4+IDggfCAweDgwOyAvLyBgY2xvY2tfc2VxX2xvd2BcblxuICBiW2krK10gPSBjbG9ja3NlcSAmIDB4ZmY7IC8vIGBub2RlYFxuXG4gIGZvciAodmFyIG4gPSAwOyBuIDwgNjsgKytuKSB7XG4gICAgYltpICsgbl0gPSBub2RlW25dO1xuICB9XG5cbiAgcmV0dXJuIGJ1ZiB8fCBzdHJpbmdpZnkoYik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHYxOyJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v1.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v3.js":
/*!**************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/v3.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v35.js\");\n/* harmony import */ var _md5_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./md5.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/md5.js\");\n\n\nvar v3 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('v3', 0x30, _md5_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v3);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQTJCO0FBQ0E7QUFDM0IsU0FBUyxtREFBRyxhQUFhLCtDQUFHO0FBQzVCLGlFQUFlLEVBQUUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IG1kNSBmcm9tICcuL21kNS5qcyc7XG52YXIgdjMgPSB2MzUoJ3YzJywgMHgzMCwgbWQ1KTtcbmV4cG9ydCBkZWZhdWx0IHYzOyJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v3.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v35.js":
/*!***************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/v35.js ***!
  \***************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   DNS: () => (/* binding */ DNS),\n/* harmony export */   URL: () => (/* binding */ URL),\n/* harmony export */   \"default\": () => (/* export default binding */ __WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/stringify.js\");\n/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parse.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/parse.js\");\n\n\n\nfunction stringToBytes(str) {\n  str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n  var bytes = [];\n\n  for (var i = 0; i < str.length; ++i) {\n    bytes.push(str.charCodeAt(i));\n  }\n\n  return bytes;\n}\n\nvar DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nvar URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\n/* harmony default export */ function __WEBPACK_DEFAULT_EXPORT__(name, version, hashfunc) {\n  function generateUUID(value, namespace, buf, offset) {\n    if (typeof value === 'string') {\n      value = stringToBytes(value);\n    }\n\n    if (typeof namespace === 'string') {\n      namespace = (0,_parse_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(namespace);\n    }\n\n    if (namespace.length !== 16) {\n      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n    } // Compute hash of namespace and value, Per 4.3\n    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n    // hashfunc([...namespace, ... value])`\n\n\n    var bytes = new Uint8Array(16 + value.length);\n    bytes.set(namespace);\n    bytes.set(value, namespace.length);\n    bytes = hashfunc(bytes);\n    bytes[6] = bytes[6] & 0x0f | version;\n    bytes[8] = bytes[8] & 0x3f | 0x80;\n\n    if (buf) {\n      offset = offset || 0;\n\n      for (var i = 0; i < 16; ++i) {\n        buf[offset + i] = bytes[i];\n      }\n\n      return buf;\n    }\n\n    return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(bytes);\n  } // Function#name is not settable on some platforms (#270)\n\n\n  try {\n    generateUUID.name = name; // eslint-disable-next-line no-empty\n  } catch (err) {} // For CommonJS default export support\n\n\n  generateUUID.DNS = DNS;\n  generateUUID.URL = URL;\n  return generateUUID;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQXVDO0FBQ1I7O0FBRS9CO0FBQ0EsMkNBQTJDOztBQUUzQzs7QUFFQSxrQkFBa0IsZ0JBQWdCO0FBQ2xDO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTztBQUNBO0FBQ1AsNkJBQWUsb0NBQVU7QUFDekI7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxrQkFBa0IscURBQUs7QUFDdkI7O0FBRUE7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxzQkFBc0IsUUFBUTtBQUM5QjtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsV0FBVyx5REFBUztBQUNwQixJQUFJOzs7QUFHSjtBQUNBLDhCQUE4QjtBQUM5QixJQUFJLGVBQWU7OztBQUduQjtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjM1LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzdHJpbmdpZnkgZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuaW1wb3J0IHBhcnNlIGZyb20gJy4vcGFyc2UuanMnO1xuXG5mdW5jdGlvbiBzdHJpbmdUb0J5dGVzKHN0cikge1xuICBzdHIgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3RyKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgdmFyIGJ5dGVzID0gW107XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBieXRlcy5wdXNoKHN0ci5jaGFyQ29kZUF0KGkpKTtcbiAgfVxuXG4gIHJldHVybiBieXRlcztcbn1cblxuZXhwb3J0IHZhciBETlMgPSAnNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCB2YXIgVVJMID0gJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiAobmFtZSwgdmVyc2lvbiwgaGFzaGZ1bmMpIHtcbiAgZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKHZhbHVlLCBuYW1lc3BhY2UsIGJ1Ziwgb2Zmc2V0KSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHZhbHVlID0gc3RyaW5nVG9CeXRlcyh2YWx1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuYW1lc3BhY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBuYW1lc3BhY2UgPSBwYXJzZShuYW1lc3BhY2UpO1xuICAgIH1cblxuICAgIGlmIChuYW1lc3BhY2UubGVuZ3RoICE9PSAxNikge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdOYW1lc3BhY2UgbXVzdCBiZSBhcnJheS1saWtlICgxNiBpdGVyYWJsZSBpbnRlZ2VyIHZhbHVlcywgMC0yNTUpJyk7XG4gICAgfSAvLyBDb21wdXRlIGhhc2ggb2YgbmFtZXNwYWNlIGFuZCB2YWx1ZSwgUGVyIDQuM1xuICAgIC8vIEZ1dHVyZTogVXNlIHNwcmVhZCBzeW50YXggd2hlbiBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3JtcywgZS5nLiBgYnl0ZXMgPVxuICAgIC8vIGhhc2hmdW5jKFsuLi5uYW1lc3BhY2UsIC4uLiB2YWx1ZV0pYFxuXG5cbiAgICB2YXIgYnl0ZXMgPSBuZXcgVWludDhBcnJheSgxNiArIHZhbHVlLmxlbmd0aCk7XG4gICAgYnl0ZXMuc2V0KG5hbWVzcGFjZSk7XG4gICAgYnl0ZXMuc2V0KHZhbHVlLCBuYW1lc3BhY2UubGVuZ3RoKTtcbiAgICBieXRlcyA9IGhhc2hmdW5jKGJ5dGVzKTtcbiAgICBieXRlc1s2XSA9IGJ5dGVzWzZdICYgMHgwZiB8IHZlcnNpb247XG4gICAgYnl0ZXNbOF0gPSBieXRlc1s4XSAmIDB4M2YgfCAweDgwO1xuXG4gICAgaWYgKGJ1Zikge1xuICAgICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgICBidWZbb2Zmc2V0ICsgaV0gPSBieXRlc1tpXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGJ1ZjtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5naWZ5KGJ5dGVzKTtcbiAgfSAvLyBGdW5jdGlvbiNuYW1lIGlzIG5vdCBzZXR0YWJsZSBvbiBzb21lIHBsYXRmb3JtcyAoIzI3MClcblxuXG4gIHRyeSB7XG4gICAgZ2VuZXJhdGVVVUlELm5hbWUgPSBuYW1lOyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHlcbiAgfSBjYXRjaCAoZXJyKSB7fSAvLyBGb3IgQ29tbW9uSlMgZGVmYXVsdCBleHBvcnQgc3VwcG9ydFxuXG5cbiAgZ2VuZXJhdGVVVUlELkROUyA9IEROUztcbiAgZ2VuZXJhdGVVVUlELlVSTCA9IFVSTDtcbiAgcmV0dXJuIGdlbmVyYXRlVVVJRDtcbn0iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v35.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v4.js":
/*!**************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/v4.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _rng_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./rng.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/rng.js\");\n/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/stringify.js\");\n\n\n\nfunction v4(options, buf, offset) {\n  options = options || {};\n  var rnds = options.random || (options.rng || _rng_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n  rnds[6] = rnds[6] & 0x0f | 0x40;\n  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n  if (buf) {\n    offset = offset || 0;\n\n    for (var i = 0; i < 16; ++i) {\n      buf[offset + i] = rnds[i];\n    }\n\n    return buf;\n  }\n\n  return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(rnds);\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v4);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQTJCO0FBQ1k7O0FBRXZDO0FBQ0E7QUFDQSwrQ0FBK0MsK0NBQUcsS0FBSzs7QUFFdkQ7QUFDQSxtQ0FBbUM7O0FBRW5DO0FBQ0E7O0FBRUEsb0JBQW9CLFFBQVE7QUFDNUI7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFNBQVMseURBQVM7QUFDbEI7O0FBRUEsaUVBQWUsRUFBRSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v4.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v5.js":
/*!**************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/v5.js ***!
  \**************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _v35_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./v35.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v35.js\");\n/* harmony import */ var _sha1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sha1.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/sha1.js\");\n\n\nvar v5 = (0,_v35_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])('v5', 0x50, _sha1_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"]);\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v5);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQTJCO0FBQ0U7QUFDN0IsU0FBUyxtREFBRyxhQUFhLGdEQUFJO0FBQzdCLGlFQUFlLEVBQUUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y1LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/v5.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/validate.js":
/*!********************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/validate.js ***!
  \********************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _regex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./regex.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/regex.js\");\n\n\nfunction validate(uuid) {\n  return typeof uuid === 'string' && _regex_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"].test(uuid);\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (validate);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmFsaWRhdGUuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBK0I7O0FBRS9CO0FBQ0EscUNBQXFDLGlEQUFLO0FBQzFDOztBQUVBLGlFQUFlLFFBQVEiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZhbGlkYXRlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/validate.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/uuid/dist/esm-browser/version.js":
/*!*******************************************************!*\
  !*** ./node_modules/uuid/dist/esm-browser/version.js ***!
  \*******************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./validate.js */ \"(app-pages-browser)/./node_modules/uuid/dist/esm-browser/validate.js\");\n\n\nfunction version(uuid) {\n  if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(uuid)) {\n    throw TypeError('Invalid UUID');\n  }\n\n  return parseInt(uuid.substr(14, 1), 16);\n}\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (version);//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmVyc2lvbi5qcyIsIm1hcHBpbmdzIjoiOzs7OztBQUFxQzs7QUFFckM7QUFDQSxPQUFPLHdEQUFRO0FBQ2Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBLGlFQUFlLE9BQU8iLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3ZlcnNpb24uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zdWJzdHIoMTQsIDEpLCAxNik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247Il0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/uuid/dist/esm-browser/version.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/zod/v3/ZodError.js":
/*!*****************************************!*\
  !*** ./node_modules/zod/v3/ZodError.js ***!
  \*****************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   ZodError: () => (/* binding */ ZodError),\n/* harmony export */   ZodIssueCode: () => (/* binding */ ZodIssueCode),\n/* harmony export */   quotelessJson: () => (/* binding */ quotelessJson)\n/* harmony export */ });\n/* harmony import */ var _helpers_util_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers/util.js */ \"(app-pages-browser)/./node_modules/zod/v3/helpers/util.js\");\n\nconst ZodIssueCode = _helpers_util_js__WEBPACK_IMPORTED_MODULE_0__.util.arrayToEnum([\n    \"invalid_type\",\n    \"invalid_literal\",\n    \"custom\",\n    \"invalid_union\",\n    \"invalid_union_discriminator\",\n    \"invalid_enum_value\",\n    \"unrecognized_keys\",\n    \"invalid_arguments\",\n    \"invalid_return_type\",\n    \"invalid_date\",\n    \"invalid_string\",\n    \"too_small\",\n    \"too_big\",\n    \"invalid_intersection_types\",\n    \"not_multiple_of\",\n    \"not_finite\",\n]);\nconst quotelessJson = (obj) => {\n    const json = JSON.stringify(obj, null, 2);\n    return json.replace(/\"([^\"]+)\":/g, \"$1:\");\n};\nclass ZodError extends Error {\n    get errors() {\n        return this.issues;\n    }\n    constructor(issues) {\n        super();\n        this.issues = [];\n        this.addIssue = (sub) => {\n            this.issues = [...this.issues, sub];\n        };\n        this.addIssues = (subs = []) => {\n            this.issues = [...this.issues, ...subs];\n        };\n        const actualProto = new.target.prototype;\n        if (Object.setPrototypeOf) {\n            // eslint-disable-next-line ban/ban\n            Object.setPrototypeOf(this, actualProto);\n        }\n        else {\n            this.__proto__ = actualProto;\n        }\n        this.name = \"ZodError\";\n        this.issues = issues;\n    }\n    format(_mapper) {\n        const mapper = _mapper ||\n            function (issue) {\n                return issue.message;\n            };\n        const fieldErrors = { _errors: [] };\n        const processError = (error) => {\n            for (const issue of error.issues) {\n                if (issue.code === \"invalid_union\") {\n                    issue.unionErrors.map(processError);\n                }\n                else if (issue.code === \"invalid_return_type\") {\n                    processError(issue.returnTypeError);\n                }\n                else if (issue.code === \"invalid_arguments\") {\n                    processError(issue.argumentsError);\n                }\n                else if (issue.path.length === 0) {\n                    fieldErrors._errors.push(mapper(issue));\n                }\n                else {\n                    let curr = fieldErrors;\n                    let i = 0;\n                    while (i < issue.path.length) {\n                        const el = issue.path[i];\n                        const terminal = i === issue.path.length - 1;\n                        if (!terminal) {\n                            curr[el] = curr[el] || { _errors: [] };\n                            // if (typeof el === \"string\") {\n                            //   curr[el] = curr[el] || { _errors: [] };\n                            // } else if (typeof el === \"number\") {\n                            //   const errorArray: any = [];\n                            //   errorArray._errors = [];\n                            //   curr[el] = curr[el] || errorArray;\n                            // }\n                        }\n                        else {\n                            curr[el] = curr[el] || { _errors: [] };\n                            curr[el]._errors.push(mapper(issue));\n                        }\n                        curr = curr[el];\n                        i++;\n                    }\n                }\n            }\n        };\n        processError(this);\n        return fieldErrors;\n    }\n    static assert(value) {\n        if (!(value instanceof ZodError)) {\n            throw new Error(`Not a ZodError: ${value}`);\n        }\n    }\n    toString() {\n        return this.message;\n    }\n    get message() {\n        return JSON.stringify(this.issues, _helpers_util_js__WEBPACK_IMPORTED_MODULE_0__.util.jsonStringifyReplacer, 2);\n    }\n    get isEmpty() {\n        return this.issues.length === 0;\n    }\n    flatten(mapper = (issue) => issue.message) {\n        const fieldErrors = {};\n        const formErrors = [];\n        for (const sub of this.issues) {\n            if (sub.path.length > 0) {\n                const firstEl = sub.path[0];\n                fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n                fieldErrors[firstEl].push(mapper(sub));\n            }\n            else {\n                formErrors.push(mapper(sub));\n            }\n        }\n        return { formErrors, fieldErrors };\n    }\n    get formErrors() {\n        return this.flatten();\n    }\n}\nZodError.create = (issues) => {\n    const error = new ZodError(issues);\n    return error;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy96b2QvdjMvWm9kRXJyb3IuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUF5QztBQUNsQyxxQkFBcUIsa0RBQUk7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDhCQUE4QjtBQUM5QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQSwwREFBMEQ7QUFDMUQsaUNBQWlDO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFEQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtDQUErQyxNQUFNO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDJDQUEyQyxrREFBSTtBQUMvQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy96b2QvdjMvWm9kRXJyb3IuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXRpbCB9IGZyb20gXCIuL2hlbHBlcnMvdXRpbC5qc1wiO1xuZXhwb3J0IGNvbnN0IFpvZElzc3VlQ29kZSA9IHV0aWwuYXJyYXlUb0VudW0oW1xuICAgIFwiaW52YWxpZF90eXBlXCIsXG4gICAgXCJpbnZhbGlkX2xpdGVyYWxcIixcbiAgICBcImN1c3RvbVwiLFxuICAgIFwiaW52YWxpZF91bmlvblwiLFxuICAgIFwiaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yXCIsXG4gICAgXCJpbnZhbGlkX2VudW1fdmFsdWVcIixcbiAgICBcInVucmVjb2duaXplZF9rZXlzXCIsXG4gICAgXCJpbnZhbGlkX2FyZ3VtZW50c1wiLFxuICAgIFwiaW52YWxpZF9yZXR1cm5fdHlwZVwiLFxuICAgIFwiaW52YWxpZF9kYXRlXCIsXG4gICAgXCJpbnZhbGlkX3N0cmluZ1wiLFxuICAgIFwidG9vX3NtYWxsXCIsXG4gICAgXCJ0b29fYmlnXCIsXG4gICAgXCJpbnZhbGlkX2ludGVyc2VjdGlvbl90eXBlc1wiLFxuICAgIFwibm90X211bHRpcGxlX29mXCIsXG4gICAgXCJub3RfZmluaXRlXCIsXG5dKTtcbmV4cG9ydCBjb25zdCBxdW90ZWxlc3NKc29uID0gKG9iaikgPT4ge1xuICAgIGNvbnN0IGpzb24gPSBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpO1xuICAgIHJldHVybiBqc29uLnJlcGxhY2UoL1wiKFteXCJdKylcIjovZywgXCIkMTpcIik7XG59O1xuZXhwb3J0IGNsYXNzIFpvZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGdldCBlcnJvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzc3VlcztcbiAgICB9XG4gICAgY29uc3RydWN0b3IoaXNzdWVzKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuaXNzdWVzID0gW107XG4gICAgICAgIHRoaXMuYWRkSXNzdWUgPSAoc3ViKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzc3VlcyA9IFsuLi50aGlzLmlzc3Vlcywgc3ViXTtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hZGRJc3N1ZXMgPSAoc3VicyA9IFtdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzc3VlcyA9IFsuLi50aGlzLmlzc3VlcywgLi4uc3Vic107XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGFjdHVhbFByb3RvID0gbmV3LnRhcmdldC5wcm90b3R5cGU7XG4gICAgICAgIGlmIChPYmplY3Quc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBiYW4vYmFuXG4gICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgYWN0dWFsUHJvdG8pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fX3Byb3RvX18gPSBhY3R1YWxQcm90bztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5hbWUgPSBcIlpvZEVycm9yXCI7XG4gICAgICAgIHRoaXMuaXNzdWVzID0gaXNzdWVzO1xuICAgIH1cbiAgICBmb3JtYXQoX21hcHBlcikge1xuICAgICAgICBjb25zdCBtYXBwZXIgPSBfbWFwcGVyIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoaXNzdWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNzdWUubWVzc2FnZTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIGNvbnN0IGZpZWxkRXJyb3JzID0geyBfZXJyb3JzOiBbXSB9O1xuICAgICAgICBjb25zdCBwcm9jZXNzRXJyb3IgPSAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzc3VlLmNvZGUgPT09IFwiaW52YWxpZF91bmlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlLnVuaW9uRXJyb3JzLm1hcChwcm9jZXNzRXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS5jb2RlID09PSBcImludmFsaWRfcmV0dXJuX3R5cGVcIikge1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3IoaXNzdWUucmV0dXJuVHlwZUVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUuY29kZSA9PT0gXCJpbnZhbGlkX2FyZ3VtZW50c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFcnJvcihpc3N1ZS5hcmd1bWVudHNFcnJvcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkRXJyb3JzLl9lcnJvcnMucHVzaChtYXBwZXIoaXNzdWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjdXJyID0gZmllbGRFcnJvcnM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBpc3N1ZS5wYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWwgPSBpc3N1ZS5wYXRoW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVybWluYWwgPSBpID09PSBpc3N1ZS5wYXRoLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHR5cGVvZiBlbCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmICh0eXBlb2YgZWwgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IGVycm9yQXJyYXk6IGFueSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZXJyb3JBcnJheS5fZXJyb3JzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjdXJyW2VsXSA9IGN1cnJbZWxdIHx8IGVycm9yQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0gPSBjdXJyW2VsXSB8fCB7IF9lcnJvcnM6IFtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycltlbF0uX2Vycm9ycy5wdXNoKG1hcHBlcihpc3N1ZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnJbZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBwcm9jZXNzRXJyb3IodGhpcyk7XG4gICAgICAgIHJldHVybiBmaWVsZEVycm9ycztcbiAgICB9XG4gICAgc3RhdGljIGFzc2VydCh2YWx1ZSkge1xuICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIFpvZEVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBOb3QgYSBab2RFcnJvcjogJHt2YWx1ZX1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB0b1N0cmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZTtcbiAgICB9XG4gICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzLmlzc3VlcywgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIsIDIpO1xuICAgIH1cbiAgICBnZXQgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNzdWVzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG4gICAgZmxhdHRlbihtYXBwZXIgPSAoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgZmllbGRFcnJvcnMgPSB7fTtcbiAgICAgICAgY29uc3QgZm9ybUVycm9ycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLmlzc3Vlcykge1xuICAgICAgICAgICAgaWYgKHN1Yi5wYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEVsID0gc3ViLnBhdGhbMF07XG4gICAgICAgICAgICAgICAgZmllbGRFcnJvcnNbZmlyc3RFbF0gPSBmaWVsZEVycm9yc1tmaXJzdEVsXSB8fCBbXTtcbiAgICAgICAgICAgICAgICBmaWVsZEVycm9yc1tmaXJzdEVsXS5wdXNoKG1hcHBlcihzdWIpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvcm1FcnJvcnMucHVzaChtYXBwZXIoc3ViKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZm9ybUVycm9ycywgZmllbGRFcnJvcnMgfTtcbiAgICB9XG4gICAgZ2V0IGZvcm1FcnJvcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZsYXR0ZW4oKTtcbiAgICB9XG59XG5ab2RFcnJvci5jcmVhdGUgPSAoaXNzdWVzKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoaXNzdWVzKTtcbiAgICByZXR1cm4gZXJyb3I7XG59O1xuIl0sIm5hbWVzIjpbXSwiaWdub3JlTGlzdCI6WzBdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/zod/v3/ZodError.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/zod/v3/errors.js":
/*!***************************************!*\
  !*** ./node_modules/zod/v3/errors.js ***!
  \***************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   defaultErrorMap: () => (/* reexport safe */ _locales_en_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"]),\n/* harmony export */   getErrorMap: () => (/* binding */ getErrorMap),\n/* harmony export */   setErrorMap: () => (/* binding */ setErrorMap)\n/* harmony export */ });\n/* harmony import */ var _locales_en_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./locales/en.js */ \"(app-pages-browser)/./node_modules/zod/v3/locales/en.js\");\n\nlet overrideErrorMap = _locales_en_js__WEBPACK_IMPORTED_MODULE_0__[\"default\"];\n\nfunction setErrorMap(map) {\n    overrideErrorMap = map;\n}\nfunction getErrorMap() {\n    return overrideErrorMap;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy96b2QvdjMvZXJyb3JzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBOEM7QUFDOUMsdUJBQXVCLHNEQUFlO0FBQ1g7QUFDcEI7QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvbm9kZV9tb2R1bGVzL3pvZC92My9lcnJvcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGRlZmF1bHRFcnJvck1hcCBmcm9tIFwiLi9sb2NhbGVzL2VuLmpzXCI7XG5sZXQgb3ZlcnJpZGVFcnJvck1hcCA9IGRlZmF1bHRFcnJvck1hcDtcbmV4cG9ydCB7IGRlZmF1bHRFcnJvck1hcCB9O1xuZXhwb3J0IGZ1bmN0aW9uIHNldEVycm9yTWFwKG1hcCkge1xuICAgIG92ZXJyaWRlRXJyb3JNYXAgPSBtYXA7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3JNYXAoKSB7XG4gICAgcmV0dXJuIG92ZXJyaWRlRXJyb3JNYXA7XG59XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/zod/v3/errors.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/zod/v3/helpers/errorUtil.js":
/*!**************************************************!*\
  !*** ./node_modules/zod/v3/helpers/errorUtil.js ***!
  \**************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   errorUtil: () => (/* binding */ errorUtil)\n/* harmony export */ });\nvar errorUtil;\n(function (errorUtil) {\n    errorUtil.errToObj = (message) => typeof message === \"string\" ? { message } : message || {};\n    // biome-ignore lint:\n    errorUtil.toString = (message) => typeof message === \"string\" ? message : message?.message;\n})(errorUtil || (errorUtil = {}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy96b2QvdjMvaGVscGVycy9lcnJvclV0aWwuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFPO0FBQ1A7QUFDQSxzRUFBc0UsVUFBVTtBQUNoRjtBQUNBO0FBQ0EsQ0FBQyw4QkFBOEIiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvem9kL3YzL2hlbHBlcnMvZXJyb3JVdGlsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB2YXIgZXJyb3JVdGlsO1xuKGZ1bmN0aW9uIChlcnJvclV0aWwpIHtcbiAgICBlcnJvclV0aWwuZXJyVG9PYmogPSAobWVzc2FnZSkgPT4gdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyB7IG1lc3NhZ2UgfSA6IG1lc3NhZ2UgfHwge307XG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQ6XG4gICAgZXJyb3JVdGlsLnRvU3RyaW5nID0gKG1lc3NhZ2UpID0+IHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZSA6IG1lc3NhZ2U/Lm1lc3NhZ2U7XG59KShlcnJvclV0aWwgfHwgKGVycm9yVXRpbCA9IHt9KSk7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/zod/v3/helpers/errorUtil.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/zod/v3/helpers/parseUtil.js":
/*!**************************************************!*\
  !*** ./node_modules/zod/v3/helpers/parseUtil.js ***!
  \**************************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   DIRTY: () => (/* binding */ DIRTY),\n/* harmony export */   EMPTY_PATH: () => (/* binding */ EMPTY_PATH),\n/* harmony export */   INVALID: () => (/* binding */ INVALID),\n/* harmony export */   OK: () => (/* binding */ OK),\n/* harmony export */   ParseStatus: () => (/* binding */ ParseStatus),\n/* harmony export */   addIssueToContext: () => (/* binding */ addIssueToContext),\n/* harmony export */   isAborted: () => (/* binding */ isAborted),\n/* harmony export */   isAsync: () => (/* binding */ isAsync),\n/* harmony export */   isDirty: () => (/* binding */ isDirty),\n/* harmony export */   isValid: () => (/* binding */ isValid),\n/* harmony export */   makeIssue: () => (/* binding */ makeIssue)\n/* harmony export */ });\n/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../errors.js */ \"(app-pages-browser)/./node_modules/zod/v3/errors.js\");\n/* harmony import */ var _locales_en_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../locales/en.js */ \"(app-pages-browser)/./node_modules/zod/v3/locales/en.js\");\n\n\nconst makeIssue = (params) => {\n    const { data, path, errorMaps, issueData } = params;\n    const fullPath = [...path, ...(issueData.path || [])];\n    const fullIssue = {\n        ...issueData,\n        path: fullPath,\n    };\n    if (issueData.message !== undefined) {\n        return {\n            ...issueData,\n            path: fullPath,\n            message: issueData.message,\n        };\n    }\n    let errorMessage = \"\";\n    const maps = errorMaps\n        .filter((m) => !!m)\n        .slice()\n        .reverse();\n    for (const map of maps) {\n        errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n    }\n    return {\n        ...issueData,\n        path: fullPath,\n        message: errorMessage,\n    };\n};\nconst EMPTY_PATH = [];\nfunction addIssueToContext(ctx, issueData) {\n    const overrideMap = (0,_errors_js__WEBPACK_IMPORTED_MODULE_0__.getErrorMap)();\n    const issue = makeIssue({\n        issueData: issueData,\n        data: ctx.data,\n        path: ctx.path,\n        errorMaps: [\n            ctx.common.contextualErrorMap, // contextual error map is first priority\n            ctx.schemaErrorMap, // then schema-bound map if available\n            overrideMap, // then global override map\n            overrideMap === _locales_en_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"] ? undefined : _locales_en_js__WEBPACK_IMPORTED_MODULE_1__[\"default\"], // then global default map\n        ].filter((x) => !!x),\n    });\n    ctx.common.issues.push(issue);\n}\nclass ParseStatus {\n    constructor() {\n        this.value = \"valid\";\n    }\n    dirty() {\n        if (this.value === \"valid\")\n            this.value = \"dirty\";\n    }\n    abort() {\n        if (this.value !== \"aborted\")\n            this.value = \"aborted\";\n    }\n    static mergeArray(status, results) {\n        const arrayValue = [];\n        for (const s of results) {\n            if (s.status === \"aborted\")\n                return INVALID;\n            if (s.status === \"dirty\")\n                status.dirty();\n            arrayValue.push(s.value);\n        }\n        return { status: status.value, value: arrayValue };\n    }\n    static async mergeObjectAsync(status, pairs) {\n        const syncPairs = [];\n        for (const pair of pairs) {\n            const key = await pair.key;\n            const value = await pair.value;\n            syncPairs.push({\n                key,\n                value,\n            });\n        }\n        return ParseStatus.mergeObjectSync(status, syncPairs);\n    }\n    static mergeObjectSync(status, pairs) {\n        const finalObject = {};\n        for (const pair of pairs) {\n            const { key, value } = pair;\n            if (key.status === \"aborted\")\n                return INVALID;\n            if (value.status === \"aborted\")\n                return INVALID;\n            if (key.status === \"dirty\")\n                status.dirty();\n            if (value.status === \"dirty\")\n                status.dirty();\n            if (key.value !== \"__proto__\" && (typeof value.value !== \"undefined\" || pair.alwaysSet)) {\n                finalObject[key.value] = value.value;\n            }\n        }\n        return { status: status.value, value: finalObject };\n    }\n}\nconst INVALID = Object.freeze({\n    status: \"aborted\",\n});\nconst DIRTY = (value) => ({ status: \"dirty\", value });\nconst OK = (value) => ({ status: \"valid\", value });\nconst isAborted = (x) => x.status === \"aborted\";\nconst isDirty = (x) => x.status === \"dirty\";\nconst isValid = (x) => x.status === \"valid\";\nconst isAsync = (x) => typeof Promise !== \"undefined\" && x instanceof Promise;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy96b2QvdjMvaGVscGVycy9wYXJzZVV0aWwuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUEyQztBQUNJO0FBQ3hDO0FBQ1AsWUFBWSxtQ0FBbUM7QUFDL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0NBQXdDLGtDQUFrQztBQUMxRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ0E7QUFDUCx3QkFBd0IsdURBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixzREFBZSxlQUFlLHNEQUFlO0FBQ3pFO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixhQUFhO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBO0FBQ087QUFDUDtBQUNBLENBQUM7QUFDTSw0QkFBNEIsd0JBQXdCO0FBQ3BELHlCQUF5Qix3QkFBd0I7QUFDakQ7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvem9kL3YzL2hlbHBlcnMvcGFyc2VVdGlsLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEVycm9yTWFwIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IGRlZmF1bHRFcnJvck1hcCBmcm9tIFwiLi4vbG9jYWxlcy9lbi5qc1wiO1xuZXhwb3J0IGNvbnN0IG1ha2VJc3N1ZSA9IChwYXJhbXMpID0+IHtcbiAgICBjb25zdCB7IGRhdGEsIHBhdGgsIGVycm9yTWFwcywgaXNzdWVEYXRhIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZnVsbFBhdGggPSBbLi4ucGF0aCwgLi4uKGlzc3VlRGF0YS5wYXRoIHx8IFtdKV07XG4gICAgY29uc3QgZnVsbElzc3VlID0ge1xuICAgICAgICAuLi5pc3N1ZURhdGEsXG4gICAgICAgIHBhdGg6IGZ1bGxQYXRoLFxuICAgIH07XG4gICAgaWYgKGlzc3VlRGF0YS5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLmlzc3VlRGF0YSxcbiAgICAgICAgICAgIHBhdGg6IGZ1bGxQYXRoLFxuICAgICAgICAgICAgbWVzc2FnZTogaXNzdWVEYXRhLm1lc3NhZ2UsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGxldCBlcnJvck1lc3NhZ2UgPSBcIlwiO1xuICAgIGNvbnN0IG1hcHMgPSBlcnJvck1hcHNcbiAgICAgICAgLmZpbHRlcigobSkgPT4gISFtKVxuICAgICAgICAuc2xpY2UoKVxuICAgICAgICAucmV2ZXJzZSgpO1xuICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgZXJyb3JNZXNzYWdlID0gbWFwKGZ1bGxJc3N1ZSwgeyBkYXRhLCBkZWZhdWx0RXJyb3I6IGVycm9yTWVzc2FnZSB9KS5tZXNzYWdlO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5pc3N1ZURhdGEsXG4gICAgICAgIHBhdGg6IGZ1bGxQYXRoLFxuICAgICAgICBtZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgfTtcbn07XG5leHBvcnQgY29uc3QgRU1QVFlfUEFUSCA9IFtdO1xuZXhwb3J0IGZ1bmN0aW9uIGFkZElzc3VlVG9Db250ZXh0KGN0eCwgaXNzdWVEYXRhKSB7XG4gICAgY29uc3Qgb3ZlcnJpZGVNYXAgPSBnZXRFcnJvck1hcCgpO1xuICAgIGNvbnN0IGlzc3VlID0gbWFrZUlzc3VlKHtcbiAgICAgICAgaXNzdWVEYXRhOiBpc3N1ZURhdGEsXG4gICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgZXJyb3JNYXBzOiBbXG4gICAgICAgICAgICBjdHguY29tbW9uLmNvbnRleHR1YWxFcnJvck1hcCwgLy8gY29udGV4dHVhbCBlcnJvciBtYXAgaXMgZmlyc3QgcHJpb3JpdHlcbiAgICAgICAgICAgIGN0eC5zY2hlbWFFcnJvck1hcCwgLy8gdGhlbiBzY2hlbWEtYm91bmQgbWFwIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgb3ZlcnJpZGVNYXAsIC8vIHRoZW4gZ2xvYmFsIG92ZXJyaWRlIG1hcFxuICAgICAgICAgICAgb3ZlcnJpZGVNYXAgPT09IGRlZmF1bHRFcnJvck1hcCA/IHVuZGVmaW5lZCA6IGRlZmF1bHRFcnJvck1hcCwgLy8gdGhlbiBnbG9iYWwgZGVmYXVsdCBtYXBcbiAgICAgICAgXS5maWx0ZXIoKHgpID0+ICEheCksXG4gICAgfSk7XG4gICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaChpc3N1ZSk7XG59XG5leHBvcnQgY2xhc3MgUGFyc2VTdGF0dXMge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJ2YWxpZFwiO1xuICAgIH1cbiAgICBkaXJ0eSgpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgPT09IFwidmFsaWRcIilcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBcImRpcnR5XCI7XG4gICAgfVxuICAgIGFib3J0KCkge1xuICAgICAgICBpZiAodGhpcy52YWx1ZSAhPT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gXCJhYm9ydGVkXCI7XG4gICAgfVxuICAgIHN0YXRpYyBtZXJnZUFycmF5KHN0YXR1cywgcmVzdWx0cykge1xuICAgICAgICBjb25zdCBhcnJheVZhbHVlID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcyBvZiByZXN1bHRzKSB7XG4gICAgICAgICAgICBpZiAocy5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKHMuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICBhcnJheVZhbHVlLnB1c2gocy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBhcnJheVZhbHVlIH07XG4gICAgfVxuICAgIHN0YXRpYyBhc3luYyBtZXJnZU9iamVjdEFzeW5jKHN0YXR1cywgcGFpcnMpIHtcbiAgICAgICAgY29uc3Qgc3luY1BhaXJzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcGFpciBvZiBwYWlycykge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcGFpci5rZXk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7XG4gICAgICAgICAgICBzeW5jUGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0U3luYyhzdGF0dXMsIHN5bmNQYWlycyk7XG4gICAgfVxuICAgIHN0YXRpYyBtZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBwYWlycykge1xuICAgICAgICBjb25zdCBmaW5hbE9iamVjdCA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gcGFpcjtcbiAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZS5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIGlmIChrZXkudmFsdWUgIT09IFwiX19wcm90b19fXCIgJiYgKHR5cGVvZiB2YWx1ZS52YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIiB8fCBwYWlyLmFsd2F5c1NldCkpIHtcbiAgICAgICAgICAgICAgICBmaW5hbE9iamVjdFtrZXkudmFsdWVdID0gdmFsdWUudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBmaW5hbE9iamVjdCB9O1xuICAgIH1cbn1cbmV4cG9ydCBjb25zdCBJTlZBTElEID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgc3RhdHVzOiBcImFib3J0ZWRcIixcbn0pO1xuZXhwb3J0IGNvbnN0IERJUlRZID0gKHZhbHVlKSA9PiAoeyBzdGF0dXM6IFwiZGlydHlcIiwgdmFsdWUgfSk7XG5leHBvcnQgY29uc3QgT0sgPSAodmFsdWUpID0+ICh7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZSB9KTtcbmV4cG9ydCBjb25zdCBpc0Fib3J0ZWQgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiO1xuZXhwb3J0IGNvbnN0IGlzRGlydHkgPSAoeCkgPT4geC5zdGF0dXMgPT09IFwiZGlydHlcIjtcbmV4cG9ydCBjb25zdCBpc1ZhbGlkID0gKHgpID0+IHguc3RhdHVzID09PSBcInZhbGlkXCI7XG5leHBvcnQgY29uc3QgaXNBc3luYyA9ICh4KSA9PiB0eXBlb2YgUHJvbWlzZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB4IGluc3RhbmNlb2YgUHJvbWlzZTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/zod/v3/helpers/parseUtil.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/zod/v3/helpers/util.js":
/*!*********************************************!*\
  !*** ./node_modules/zod/v3/helpers/util.js ***!
  \*********************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   ZodParsedType: () => (/* binding */ ZodParsedType),\n/* harmony export */   getParsedType: () => (/* binding */ getParsedType),\n/* harmony export */   objectUtil: () => (/* binding */ objectUtil),\n/* harmony export */   util: () => (/* binding */ util)\n/* harmony export */ });\nvar util;\n(function (util) {\n    util.assertEqual = (_) => { };\n    function assertIs(_arg) { }\n    util.assertIs = assertIs;\n    function assertNever(_x) {\n        throw new Error();\n    }\n    util.assertNever = assertNever;\n    util.arrayToEnum = (items) => {\n        const obj = {};\n        for (const item of items) {\n            obj[item] = item;\n        }\n        return obj;\n    };\n    util.getValidEnumValues = (obj) => {\n        const validKeys = util.objectKeys(obj).filter((k) => typeof obj[obj[k]] !== \"number\");\n        const filtered = {};\n        for (const k of validKeys) {\n            filtered[k] = obj[k];\n        }\n        return util.objectValues(filtered);\n    };\n    util.objectValues = (obj) => {\n        return util.objectKeys(obj).map(function (e) {\n            return obj[e];\n        });\n    };\n    util.objectKeys = typeof Object.keys === \"function\" // eslint-disable-line ban/ban\n        ? (obj) => Object.keys(obj) // eslint-disable-line ban/ban\n        : (object) => {\n            const keys = [];\n            for (const key in object) {\n                if (Object.prototype.hasOwnProperty.call(object, key)) {\n                    keys.push(key);\n                }\n            }\n            return keys;\n        };\n    util.find = (arr, checker) => {\n        for (const item of arr) {\n            if (checker(item))\n                return item;\n        }\n        return undefined;\n    };\n    util.isInteger = typeof Number.isInteger === \"function\"\n        ? (val) => Number.isInteger(val) // eslint-disable-line ban/ban\n        : (val) => typeof val === \"number\" && Number.isFinite(val) && Math.floor(val) === val;\n    function joinValues(array, separator = \" | \") {\n        return array.map((val) => (typeof val === \"string\" ? `'${val}'` : val)).join(separator);\n    }\n    util.joinValues = joinValues;\n    util.jsonStringifyReplacer = (_, value) => {\n        if (typeof value === \"bigint\") {\n            return value.toString();\n        }\n        return value;\n    };\n})(util || (util = {}));\nvar objectUtil;\n(function (objectUtil) {\n    objectUtil.mergeShapes = (first, second) => {\n        return {\n            ...first,\n            ...second, // second overwrites first\n        };\n    };\n})(objectUtil || (objectUtil = {}));\nconst ZodParsedType = util.arrayToEnum([\n    \"string\",\n    \"nan\",\n    \"number\",\n    \"integer\",\n    \"float\",\n    \"boolean\",\n    \"date\",\n    \"bigint\",\n    \"symbol\",\n    \"function\",\n    \"undefined\",\n    \"null\",\n    \"array\",\n    \"object\",\n    \"unknown\",\n    \"promise\",\n    \"void\",\n    \"never\",\n    \"map\",\n    \"set\",\n]);\nconst getParsedType = (data) => {\n    const t = typeof data;\n    switch (t) {\n        case \"undefined\":\n            return ZodParsedType.undefined;\n        case \"string\":\n            return ZodParsedType.string;\n        case \"number\":\n            return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n        case \"boolean\":\n            return ZodParsedType.boolean;\n        case \"function\":\n            return ZodParsedType.function;\n        case \"bigint\":\n            return ZodParsedType.bigint;\n        case \"symbol\":\n            return ZodParsedType.symbol;\n        case \"object\":\n            if (Array.isArray(data)) {\n                return ZodParsedType.array;\n            }\n            if (data === null) {\n                return ZodParsedType.null;\n            }\n            if (data.then && typeof data.then === \"function\" && data.catch && typeof data.catch === \"function\") {\n                return ZodParsedType.promise;\n            }\n            if (typeof Map !== \"undefined\" && data instanceof Map) {\n                return ZodParsedType.map;\n            }\n            if (typeof Set !== \"undefined\" && data instanceof Set) {\n                return ZodParsedType.set;\n            }\n            if (typeof Date !== \"undefined\" && data instanceof Date) {\n                return ZodParsedType.date;\n            }\n            return ZodParsedType.object;\n        default:\n            return ZodParsedType.unknown;\n    }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy96b2QvdjMvaGVscGVycy91dGlsLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlFQUFpRSxJQUFJO0FBQ3JFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLG9CQUFvQjtBQUNkO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLGdDQUFnQztBQUMxQjtBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvem9kL3YzL2hlbHBlcnMvdXRpbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdmFyIHV0aWw7XG4oZnVuY3Rpb24gKHV0aWwpIHtcbiAgICB1dGlsLmFzc2VydEVxdWFsID0gKF8pID0+IHsgfTtcbiAgICBmdW5jdGlvbiBhc3NlcnRJcyhfYXJnKSB7IH1cbiAgICB1dGlsLmFzc2VydElzID0gYXNzZXJ0SXM7XG4gICAgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIoX3gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgfVxuICAgIHV0aWwuYXNzZXJ0TmV2ZXIgPSBhc3NlcnROZXZlcjtcbiAgICB1dGlsLmFycmF5VG9FbnVtID0gKGl0ZW1zKSA9PiB7XG4gICAgICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcbiAgICAgICAgICAgIG9ialtpdGVtXSA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9iajtcbiAgICB9O1xuICAgIHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzID0gKG9iaikgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZEtleXMgPSB1dGlsLm9iamVjdEtleXMob2JqKS5maWx0ZXIoKGspID0+IHR5cGVvZiBvYmpbb2JqW2tdXSAhPT0gXCJudW1iZXJcIik7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0ge307XG4gICAgICAgIGZvciAoY29uc3QgayBvZiB2YWxpZEtleXMpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkW2tdID0gb2JqW2tdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1dGlsLm9iamVjdFZhbHVlcyhmaWx0ZXJlZCk7XG4gICAgfTtcbiAgICB1dGlsLm9iamVjdFZhbHVlcyA9IChvYmopID0+IHtcbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0S2V5cyhvYmopLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIG9ialtlXTtcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICB1dGlsLm9iamVjdEtleXMgPSB0eXBlb2YgT2JqZWN0LmtleXMgPT09IFwiZnVuY3Rpb25cIiAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgPyAob2JqKSA9PiBPYmplY3Qua2V5cyhvYmopIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgYmFuL2JhblxuICAgICAgICA6IChvYmplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGtleXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iamVjdCkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBrZXlzO1xuICAgICAgICB9O1xuICAgIHV0aWwuZmluZCA9IChhcnIsIGNoZWNrZXIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycikge1xuICAgICAgICAgICAgaWYgKGNoZWNrZXIoaXRlbSkpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHV0aWwuaXNJbnRlZ2VyID0gdHlwZW9mIE51bWJlci5pc0ludGVnZXIgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/ICh2YWwpID0+IE51bWJlci5pc0ludGVnZXIodmFsKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGJhbi9iYW5cbiAgICAgICAgOiAodmFsKSA9PiB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICYmIE51bWJlci5pc0Zpbml0ZSh2YWwpICYmIE1hdGguZmxvb3IodmFsKSA9PT0gdmFsO1xuICAgIGZ1bmN0aW9uIGpvaW5WYWx1ZXMoYXJyYXksIHNlcGFyYXRvciA9IFwiIHwgXCIpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5Lm1hcCgodmFsKSA9PiAodHlwZW9mIHZhbCA9PT0gXCJzdHJpbmdcIiA/IGAnJHt2YWx9J2AgOiB2YWwpKS5qb2luKHNlcGFyYXRvcik7XG4gICAgfVxuICAgIHV0aWwuam9pblZhbHVlcyA9IGpvaW5WYWx1ZXM7XG4gICAgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIgPSAoXywgdmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJiaWdpbnRcIikge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG59KSh1dGlsIHx8ICh1dGlsID0ge30pKTtcbmV4cG9ydCB2YXIgb2JqZWN0VXRpbDtcbihmdW5jdGlvbiAob2JqZWN0VXRpbCkge1xuICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXMgPSAoZmlyc3QsIHNlY29uZCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uZmlyc3QsXG4gICAgICAgICAgICAuLi5zZWNvbmQsIC8vIHNlY29uZCBvdmVyd3JpdGVzIGZpcnN0XG4gICAgICAgIH07XG4gICAgfTtcbn0pKG9iamVjdFV0aWwgfHwgKG9iamVjdFV0aWwgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IFpvZFBhcnNlZFR5cGUgPSB1dGlsLmFycmF5VG9FbnVtKFtcbiAgICBcInN0cmluZ1wiLFxuICAgIFwibmFuXCIsXG4gICAgXCJudW1iZXJcIixcbiAgICBcImludGVnZXJcIixcbiAgICBcImZsb2F0XCIsXG4gICAgXCJib29sZWFuXCIsXG4gICAgXCJkYXRlXCIsXG4gICAgXCJiaWdpbnRcIixcbiAgICBcInN5bWJvbFwiLFxuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcInVuZGVmaW5lZFwiLFxuICAgIFwibnVsbFwiLFxuICAgIFwiYXJyYXlcIixcbiAgICBcIm9iamVjdFwiLFxuICAgIFwidW5rbm93blwiLFxuICAgIFwicHJvbWlzZVwiLFxuICAgIFwidm9pZFwiLFxuICAgIFwibmV2ZXJcIixcbiAgICBcIm1hcFwiLFxuICAgIFwic2V0XCIsXG5dKTtcbmV4cG9ydCBjb25zdCBnZXRQYXJzZWRUeXBlID0gKGRhdGEpID0+IHtcbiAgICBjb25zdCB0ID0gdHlwZW9mIGRhdGE7XG4gICAgc3dpdGNoICh0KSB7XG4gICAgICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZDtcbiAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3RyaW5nO1xuICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGEpID8gWm9kUGFyc2VkVHlwZS5uYW4gOiBab2RQYXJzZWRUeXBlLm51bWJlcjtcbiAgICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmJvb2xlYW47XG4gICAgICAgIGNhc2UgXCJmdW5jdGlvblwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuZnVuY3Rpb247XG4gICAgICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmJpZ2ludDtcbiAgICAgICAgY2FzZSBcInN5bWJvbFwiOlxuICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc3ltYm9sO1xuICAgICAgICBjYXNlIFwib2JqZWN0XCI6XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLmFycmF5O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5udWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGEudGhlbiAmJiB0eXBlb2YgZGF0YS50aGVuID09PSBcImZ1bmN0aW9uXCIgJiYgZGF0YS5jYXRjaCAmJiB0eXBlb2YgZGF0YS5jYXRjaCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUucHJvbWlzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgTWFwICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gWm9kUGFyc2VkVHlwZS5tYXA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIFNldCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuc2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBEYXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGRhdGEgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFpvZFBhcnNlZFR5cGUuZGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLm9iamVjdDtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHJldHVybiBab2RQYXJzZWRUeXBlLnVua25vd247XG4gICAgfVxufTtcbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/zod/v3/helpers/util.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/zod/v3/locales/en.js":
/*!*******************************************!*\
  !*** ./node_modules/zod/v3/locales/en.js ***!
  \*******************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _ZodError_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ZodError.js */ \"(app-pages-browser)/./node_modules/zod/v3/ZodError.js\");\n/* harmony import */ var _helpers_util_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../helpers/util.js */ \"(app-pages-browser)/./node_modules/zod/v3/helpers/util.js\");\n\n\nconst errorMap = (issue, _ctx) => {\n    let message;\n    switch (issue.code) {\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.invalid_type:\n            if (issue.received === _helpers_util_js__WEBPACK_IMPORTED_MODULE_1__.ZodParsedType.undefined) {\n                message = \"Required\";\n            }\n            else {\n                message = `Expected ${issue.expected}, received ${issue.received}`;\n            }\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.invalid_literal:\n            message = `Invalid literal value, expected ${JSON.stringify(issue.expected, _helpers_util_js__WEBPACK_IMPORTED_MODULE_1__.util.jsonStringifyReplacer)}`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.unrecognized_keys:\n            message = `Unrecognized key(s) in object: ${_helpers_util_js__WEBPACK_IMPORTED_MODULE_1__.util.joinValues(issue.keys, \", \")}`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.invalid_union:\n            message = `Invalid input`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.invalid_union_discriminator:\n            message = `Invalid discriminator value. Expected ${_helpers_util_js__WEBPACK_IMPORTED_MODULE_1__.util.joinValues(issue.options)}`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.invalid_enum_value:\n            message = `Invalid enum value. Expected ${_helpers_util_js__WEBPACK_IMPORTED_MODULE_1__.util.joinValues(issue.options)}, received '${issue.received}'`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.invalid_arguments:\n            message = `Invalid function arguments`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.invalid_return_type:\n            message = `Invalid function return type`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.invalid_date:\n            message = `Invalid date`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.invalid_string:\n            if (typeof issue.validation === \"object\") {\n                if (\"includes\" in issue.validation) {\n                    message = `Invalid input: must include \"${issue.validation.includes}\"`;\n                    if (typeof issue.validation.position === \"number\") {\n                        message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n                    }\n                }\n                else if (\"startsWith\" in issue.validation) {\n                    message = `Invalid input: must start with \"${issue.validation.startsWith}\"`;\n                }\n                else if (\"endsWith\" in issue.validation) {\n                    message = `Invalid input: must end with \"${issue.validation.endsWith}\"`;\n                }\n                else {\n                    _helpers_util_js__WEBPACK_IMPORTED_MODULE_1__.util.assertNever(issue.validation);\n                }\n            }\n            else if (issue.validation !== \"regex\") {\n                message = `Invalid ${issue.validation}`;\n            }\n            else {\n                message = \"Invalid\";\n            }\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.too_small:\n            if (issue.type === \"array\")\n                message = `Array must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n            else if (issue.type === \"string\")\n                message = `String must contain ${issue.exact ? \"exactly\" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n            else if (issue.type === \"number\")\n                message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n            else if (issue.type === \"bigint\")\n                message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n            else if (issue.type === \"date\")\n                message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n            else\n                message = \"Invalid input\";\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.too_big:\n            if (issue.type === \"array\")\n                message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n            else if (issue.type === \"string\")\n                message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n            else if (issue.type === \"number\")\n                message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n            else if (issue.type === \"bigint\")\n                message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n            else if (issue.type === \"date\")\n                message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n            else\n                message = \"Invalid input\";\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.custom:\n            message = `Invalid input`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.invalid_intersection_types:\n            message = `Intersection results could not be merged`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.not_multiple_of:\n            message = `Number must be a multiple of ${issue.multipleOf}`;\n            break;\n        case _ZodError_js__WEBPACK_IMPORTED_MODULE_0__.ZodIssueCode.not_finite:\n            message = \"Number must be finite\";\n            break;\n        default:\n            message = _ctx.defaultError;\n            _helpers_util_js__WEBPACK_IMPORTED_MODULE_1__.util.assertNever(issue);\n    }\n    return { message };\n};\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (errorMap);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy96b2QvdjMvbG9jYWxlcy9lbi5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBOEM7QUFDVztBQUN6RDtBQUNBO0FBQ0E7QUFDQSxhQUFhLHNEQUFZO0FBQ3pCLG1DQUFtQywyREFBYTtBQUNoRDtBQUNBO0FBQ0E7QUFDQSxzQ0FBc0MsZUFBZSxhQUFhLGVBQWU7QUFDakY7QUFDQTtBQUNBLGFBQWEsc0RBQVk7QUFDekIseURBQXlELCtCQUErQixrREFBSSx3QkFBd0I7QUFDcEg7QUFDQSxhQUFhLHNEQUFZO0FBQ3pCLHdEQUF3RCxrREFBSSw4QkFBOEI7QUFDMUY7QUFDQSxhQUFhLHNEQUFZO0FBQ3pCO0FBQ0E7QUFDQSxhQUFhLHNEQUFZO0FBQ3pCLCtEQUErRCxrREFBSSwyQkFBMkI7QUFDOUY7QUFDQSxhQUFhLHNEQUFZO0FBQ3pCLHNEQUFzRCxrREFBSSwyQkFBMkIsY0FBYyxlQUFlO0FBQ2xIO0FBQ0EsYUFBYSxzREFBWTtBQUN6QjtBQUNBO0FBQ0EsYUFBYSxzREFBWTtBQUN6QjtBQUNBO0FBQ0EsYUFBYSxzREFBWTtBQUN6QjtBQUNBO0FBQ0EsYUFBYSxzREFBWTtBQUN6QjtBQUNBO0FBQ0EsOERBQThELDBCQUEwQjtBQUN4RjtBQUNBLHFDQUFxQyxTQUFTLG9EQUFvRCwwQkFBMEI7QUFDNUg7QUFDQTtBQUNBO0FBQ0EsaUVBQWlFLDRCQUE0QjtBQUM3RjtBQUNBO0FBQ0EsK0RBQStELDBCQUEwQjtBQUN6RjtBQUNBO0FBQ0Esb0JBQW9CLGtEQUFJO0FBQ3hCO0FBQ0E7QUFDQTtBQUNBLHFDQUFxQyxpQkFBaUI7QUFDdEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsc0RBQVk7QUFDekI7QUFDQSxnREFBZ0Qsc0VBQXNFLEVBQUUsZUFBZTtBQUN2STtBQUNBLGlEQUFpRCxpRUFBaUUsRUFBRSxlQUFlO0FBQ25JO0FBQ0EsNENBQTRDLG9HQUFvRyxFQUFFLGNBQWM7QUFDaEs7QUFDQSw0Q0FBNEMsb0dBQW9HLEVBQUUsY0FBYztBQUNoSztBQUNBLDBDQUEwQyxvR0FBb0csRUFBRSxnQ0FBZ0M7QUFDaEw7QUFDQTtBQUNBO0FBQ0EsYUFBYSxzREFBWTtBQUN6QjtBQUNBLGdEQUFnRCxxRUFBcUUsRUFBRSxlQUFlO0FBQ3RJO0FBQ0EsaURBQWlELGlFQUFpRSxFQUFFLGVBQWU7QUFDbkk7QUFDQSw0Q0FBNEMsbUZBQW1GLEVBQUUsY0FBYztBQUMvSTtBQUNBLDRDQUE0QyxtRkFBbUYsRUFBRSxjQUFjO0FBQy9JO0FBQ0EsMENBQTBDLHlGQUF5RixFQUFFLGdDQUFnQztBQUNySztBQUNBO0FBQ0E7QUFDQSxhQUFhLHNEQUFZO0FBQ3pCO0FBQ0E7QUFDQSxhQUFhLHNEQUFZO0FBQ3pCO0FBQ0E7QUFDQSxhQUFhLHNEQUFZO0FBQ3pCLHNEQUFzRCxpQkFBaUI7QUFDdkU7QUFDQSxhQUFhLHNEQUFZO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWSxrREFBSTtBQUNoQjtBQUNBLGFBQWE7QUFDYjtBQUNBLGlFQUFlLFFBQVEsRUFBQyIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy96b2QvdjMvbG9jYWxlcy9lbi5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBab2RJc3N1ZUNvZGUgfSBmcm9tIFwiLi4vWm9kRXJyb3IuanNcIjtcbmltcG9ydCB7IHV0aWwsIFpvZFBhcnNlZFR5cGUgfSBmcm9tIFwiLi4vaGVscGVycy91dGlsLmpzXCI7XG5jb25zdCBlcnJvck1hcCA9IChpc3N1ZSwgX2N0eCkgPT4ge1xuICAgIGxldCBtZXNzYWdlO1xuICAgIHN3aXRjaCAoaXNzdWUuY29kZSkge1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGU6XG4gICAgICAgICAgICBpZiAoaXNzdWUucmVjZWl2ZWQgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiUmVxdWlyZWRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgRXhwZWN0ZWQgJHtpc3N1ZS5leHBlY3RlZH0sIHJlY2VpdmVkICR7aXNzdWUucmVjZWl2ZWR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2xpdGVyYWw6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgbGl0ZXJhbCB2YWx1ZSwgZXhwZWN0ZWQgJHtKU09OLnN0cmluZ2lmeShpc3N1ZS5leHBlY3RlZCwgdXRpbC5qc29uU3RyaW5naWZ5UmVwbGFjZXIpfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUudW5yZWNvZ25pemVkX2tleXM6XG4gICAgICAgICAgICBtZXNzYWdlID0gYFVucmVjb2duaXplZCBrZXkocykgaW4gb2JqZWN0OiAke3V0aWwuam9pblZhbHVlcyhpc3N1ZS5rZXlzLCBcIiwgXCIpfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbl9kaXNjcmltaW5hdG9yOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWUuIEV4cGVjdGVkICR7dXRpbC5qb2luVmFsdWVzKGlzc3VlLm9wdGlvbnMpfWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGVudW0gdmFsdWUuIEV4cGVjdGVkICR7dXRpbC5qb2luVmFsdWVzKGlzc3VlLm9wdGlvbnMpfSwgcmVjZWl2ZWQgJyR7aXNzdWUucmVjZWl2ZWR9J2A7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9hcmd1bWVudHM6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZnVuY3Rpb24gYXJndW1lbnRzYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX3JldHVybl90eXBlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGZ1bmN0aW9uIHJldHVybiB0eXBlYDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5pbnZhbGlkX2RhdGU6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludmFsaWQgZGF0ZWA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmc6XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlLnZhbGlkYXRpb24gPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoXCJpbmNsdWRlc1wiIGluIGlzc3VlLnZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IGluY2x1ZGUgXCIke2lzc3VlLnZhbGlkYXRpb24uaW5jbHVkZXN9XCJgO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGlzc3VlLnZhbGlkYXRpb24ucG9zaXRpb24gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgJHttZXNzYWdlfSBhdCBvbmUgb3IgbW9yZSBwb3NpdGlvbnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICR7aXNzdWUudmFsaWRhdGlvbi5wb3NpdGlvbn1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFwic3RhcnRzV2l0aFwiIGluIGlzc3VlLnZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBJbnZhbGlkIGlucHV0OiBtdXN0IHN0YXJ0IHdpdGggXCIke2lzc3VlLnZhbGlkYXRpb24uc3RhcnRzV2l0aH1cImA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFwiZW5kc1dpdGhcIiBpbiBpc3N1ZS52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dDogbXVzdCBlbmQgd2l0aCBcIiR7aXNzdWUudmFsaWRhdGlvbi5lbmRzV2l0aH1cImA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGlzc3VlLnZhbGlkYXRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnZhbGlkYXRpb24gIT09IFwicmVnZXhcIikge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCAke2lzc3VlLnZhbGlkYXRpb259YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS50b29fc21hbGw6XG4gICAgICAgICAgICBpZiAoaXNzdWUudHlwZSA9PT0gXCJhcnJheVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgQXJyYXkgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBcImV4YWN0bHlcIiA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBsZWFzdGAgOiBgbW9yZSB0aGFuYH0gJHtpc3N1ZS5taW5pbXVtfSBlbGVtZW50KHMpYDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBTdHJpbmcgbXVzdCBjb250YWluICR7aXNzdWUuZXhhY3QgPyBcImV4YWN0bHlcIiA6IGlzc3VlLmluY2x1c2l2ZSA/IGBhdCBsZWFzdGAgOiBgb3ZlcmB9ICR7aXNzdWUubWluaW11bX0gY2hhcmFjdGVyKHMpYDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwibnVtYmVyXCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHkgZXF1YWwgdG8gYCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYCA6IGBncmVhdGVyIHRoYW4gYH0ke2lzc3VlLm1pbmltdW19YDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwiYmlnaW50XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBOdW1iZXIgbXVzdCBiZSAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHkgZXF1YWwgdG8gYCA6IGlzc3VlLmluY2x1c2l2ZSA/IGBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYCA6IGBncmVhdGVyIHRoYW4gYH0ke2lzc3VlLm1pbmltdW19YDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwiZGF0ZVwiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgRGF0ZSBtdXN0IGJlICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseSBlcXVhbCB0byBgIDogaXNzdWUuaW5jbHVzaXZlID8gYGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBgIDogYGdyZWF0ZXIgdGhhbiBgfSR7bmV3IERhdGUoTnVtYmVyKGlzc3VlLm1pbmltdW0pKX1gO1xuICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBcIkludmFsaWQgaW5wdXRcIjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS50b29fYmlnOlxuICAgICAgICAgICAgaWYgKGlzc3VlLnR5cGUgPT09IFwiYXJyYXlcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYEFycmF5IG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IG1vc3RgIDogYGxlc3MgdGhhbmB9ICR7aXNzdWUubWF4aW11bX0gZWxlbWVudChzKWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcInN0cmluZ1wiKVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBgU3RyaW5nIG11c3QgY29udGFpbiAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYGF0IG1vc3RgIDogYHVuZGVyYH0gJHtpc3N1ZS5tYXhpbXVtfSBjaGFyYWN0ZXIocylgO1xuICAgICAgICAgICAgZWxzZSBpZiAoaXNzdWUudHlwZSA9PT0gXCJudW1iZXJcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYE51bWJlciBtdXN0IGJlICR7aXNzdWUuZXhhY3QgPyBgZXhhY3RseWAgOiBpc3N1ZS5pbmNsdXNpdmUgPyBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvYCA6IGBsZXNzIHRoYW5gfSAke2lzc3VlLm1heGltdW19YDtcbiAgICAgICAgICAgIGVsc2UgaWYgKGlzc3VlLnR5cGUgPT09IFwiYmlnaW50XCIpXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IGBCaWdJbnQgbXVzdCBiZSAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYGxlc3MgdGhhbiBvciBlcXVhbCB0b2AgOiBgbGVzcyB0aGFuYH0gJHtpc3N1ZS5tYXhpbXVtfWA7XG4gICAgICAgICAgICBlbHNlIGlmIChpc3N1ZS50eXBlID09PSBcImRhdGVcIilcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gYERhdGUgbXVzdCBiZSAke2lzc3VlLmV4YWN0ID8gYGV4YWN0bHlgIDogaXNzdWUuaW5jbHVzaXZlID8gYHNtYWxsZXIgdGhhbiBvciBlcXVhbCB0b2AgOiBgc21hbGxlciB0aGFuYH0gJHtuZXcgRGF0ZShOdW1iZXIoaXNzdWUubWF4aW11bSkpfWA7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9IFwiSW52YWxpZCBpbnB1dFwiO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLmN1c3RvbTpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgSW52YWxpZCBpbnB1dGA7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBab2RJc3N1ZUNvZGUuaW52YWxpZF9pbnRlcnNlY3Rpb25fdHlwZXM6XG4gICAgICAgICAgICBtZXNzYWdlID0gYEludGVyc2VjdGlvbiByZXN1bHRzIGNvdWxkIG5vdCBiZSBtZXJnZWRgO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgWm9kSXNzdWVDb2RlLm5vdF9tdWx0aXBsZV9vZjpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBgTnVtYmVyIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAke2lzc3VlLm11bHRpcGxlT2Z9YDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFpvZElzc3VlQ29kZS5ub3RfZmluaXRlOlxuICAgICAgICAgICAgbWVzc2FnZSA9IFwiTnVtYmVyIG11c3QgYmUgZmluaXRlXCI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBfY3R4LmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoaXNzdWUpO1xuICAgIH1cbiAgICByZXR1cm4geyBtZXNzYWdlIH07XG59O1xuZXhwb3J0IGRlZmF1bHQgZXJyb3JNYXA7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/zod/v3/locales/en.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./node_modules/zod/v3/types.js":
/*!**************************************!*\
  !*** ./node_modules/zod/v3/types.js ***!
  \**************************************/
/***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   BRAND: () => (/* binding */ BRAND),\n/* harmony export */   NEVER: () => (/* binding */ NEVER),\n/* harmony export */   Schema: () => (/* binding */ ZodType),\n/* harmony export */   ZodAny: () => (/* binding */ ZodAny),\n/* harmony export */   ZodArray: () => (/* binding */ ZodArray),\n/* harmony export */   ZodBigInt: () => (/* binding */ ZodBigInt),\n/* harmony export */   ZodBoolean: () => (/* binding */ ZodBoolean),\n/* harmony export */   ZodBranded: () => (/* binding */ ZodBranded),\n/* harmony export */   ZodCatch: () => (/* binding */ ZodCatch),\n/* harmony export */   ZodDate: () => (/* binding */ ZodDate),\n/* harmony export */   ZodDefault: () => (/* binding */ ZodDefault),\n/* harmony export */   ZodDiscriminatedUnion: () => (/* binding */ ZodDiscriminatedUnion),\n/* harmony export */   ZodEffects: () => (/* binding */ ZodEffects),\n/* harmony export */   ZodEnum: () => (/* binding */ ZodEnum),\n/* harmony export */   ZodFirstPartyTypeKind: () => (/* binding */ ZodFirstPartyTypeKind),\n/* harmony export */   ZodFunction: () => (/* binding */ ZodFunction),\n/* harmony export */   ZodIntersection: () => (/* binding */ ZodIntersection),\n/* harmony export */   ZodLazy: () => (/* binding */ ZodLazy),\n/* harmony export */   ZodLiteral: () => (/* binding */ ZodLiteral),\n/* harmony export */   ZodMap: () => (/* binding */ ZodMap),\n/* harmony export */   ZodNaN: () => (/* binding */ ZodNaN),\n/* harmony export */   ZodNativeEnum: () => (/* binding */ ZodNativeEnum),\n/* harmony export */   ZodNever: () => (/* binding */ ZodNever),\n/* harmony export */   ZodNull: () => (/* binding */ ZodNull),\n/* harmony export */   ZodNullable: () => (/* binding */ ZodNullable),\n/* harmony export */   ZodNumber: () => (/* binding */ ZodNumber),\n/* harmony export */   ZodObject: () => (/* binding */ ZodObject),\n/* harmony export */   ZodOptional: () => (/* binding */ ZodOptional),\n/* harmony export */   ZodPipeline: () => (/* binding */ ZodPipeline),\n/* harmony export */   ZodPromise: () => (/* binding */ ZodPromise),\n/* harmony export */   ZodReadonly: () => (/* binding */ ZodReadonly),\n/* harmony export */   ZodRecord: () => (/* binding */ ZodRecord),\n/* harmony export */   ZodSchema: () => (/* binding */ ZodType),\n/* harmony export */   ZodSet: () => (/* binding */ ZodSet),\n/* harmony export */   ZodString: () => (/* binding */ ZodString),\n/* harmony export */   ZodSymbol: () => (/* binding */ ZodSymbol),\n/* harmony export */   ZodTransformer: () => (/* binding */ ZodEffects),\n/* harmony export */   ZodTuple: () => (/* binding */ ZodTuple),\n/* harmony export */   ZodType: () => (/* binding */ ZodType),\n/* harmony export */   ZodUndefined: () => (/* binding */ ZodUndefined),\n/* harmony export */   ZodUnion: () => (/* binding */ ZodUnion),\n/* harmony export */   ZodUnknown: () => (/* binding */ ZodUnknown),\n/* harmony export */   ZodVoid: () => (/* binding */ ZodVoid),\n/* harmony export */   any: () => (/* binding */ anyType),\n/* harmony export */   array: () => (/* binding */ arrayType),\n/* harmony export */   bigint: () => (/* binding */ bigIntType),\n/* harmony export */   boolean: () => (/* binding */ booleanType),\n/* harmony export */   coerce: () => (/* binding */ coerce),\n/* harmony export */   custom: () => (/* binding */ custom),\n/* harmony export */   date: () => (/* binding */ dateType),\n/* harmony export */   datetimeRegex: () => (/* binding */ datetimeRegex),\n/* harmony export */   discriminatedUnion: () => (/* binding */ discriminatedUnionType),\n/* harmony export */   effect: () => (/* binding */ effectsType),\n/* harmony export */   \"enum\": () => (/* binding */ enumType),\n/* harmony export */   \"function\": () => (/* binding */ functionType),\n/* harmony export */   \"instanceof\": () => (/* binding */ instanceOfType),\n/* harmony export */   intersection: () => (/* binding */ intersectionType),\n/* harmony export */   late: () => (/* binding */ late),\n/* harmony export */   lazy: () => (/* binding */ lazyType),\n/* harmony export */   literal: () => (/* binding */ literalType),\n/* harmony export */   map: () => (/* binding */ mapType),\n/* harmony export */   nan: () => (/* binding */ nanType),\n/* harmony export */   nativeEnum: () => (/* binding */ nativeEnumType),\n/* harmony export */   never: () => (/* binding */ neverType),\n/* harmony export */   \"null\": () => (/* binding */ nullType),\n/* harmony export */   nullable: () => (/* binding */ nullableType),\n/* harmony export */   number: () => (/* binding */ numberType),\n/* harmony export */   object: () => (/* binding */ objectType),\n/* harmony export */   oboolean: () => (/* binding */ oboolean),\n/* harmony export */   onumber: () => (/* binding */ onumber),\n/* harmony export */   optional: () => (/* binding */ optionalType),\n/* harmony export */   ostring: () => (/* binding */ ostring),\n/* harmony export */   pipeline: () => (/* binding */ pipelineType),\n/* harmony export */   preprocess: () => (/* binding */ preprocessType),\n/* harmony export */   promise: () => (/* binding */ promiseType),\n/* harmony export */   record: () => (/* binding */ recordType),\n/* harmony export */   set: () => (/* binding */ setType),\n/* harmony export */   strictObject: () => (/* binding */ strictObjectType),\n/* harmony export */   string: () => (/* binding */ stringType),\n/* harmony export */   symbol: () => (/* binding */ symbolType),\n/* harmony export */   transformer: () => (/* binding */ effectsType),\n/* harmony export */   tuple: () => (/* binding */ tupleType),\n/* harmony export */   undefined: () => (/* binding */ undefinedType),\n/* harmony export */   union: () => (/* binding */ unionType),\n/* harmony export */   unknown: () => (/* binding */ unknownType),\n/* harmony export */   \"void\": () => (/* binding */ voidType)\n/* harmony export */ });\n/* harmony import */ var _ZodError_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ZodError.js */ \"(app-pages-browser)/./node_modules/zod/v3/ZodError.js\");\n/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./errors.js */ \"(app-pages-browser)/./node_modules/zod/v3/errors.js\");\n/* harmony import */ var _errors_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./errors.js */ \"(app-pages-browser)/./node_modules/zod/v3/locales/en.js\");\n/* harmony import */ var _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./helpers/errorUtil.js */ \"(app-pages-browser)/./node_modules/zod/v3/helpers/errorUtil.js\");\n/* harmony import */ var _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./helpers/parseUtil.js */ \"(app-pages-browser)/./node_modules/zod/v3/helpers/parseUtil.js\");\n/* harmony import */ var _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./helpers/util.js */ \"(app-pages-browser)/./node_modules/zod/v3/helpers/util.js\");\n\n\n\n\n\nclass ParseInputLazyPath {\n    constructor(parent, value, path, key) {\n        this._cachedPath = [];\n        this.parent = parent;\n        this.data = value;\n        this._path = path;\n        this._key = key;\n    }\n    get path() {\n        if (!this._cachedPath.length) {\n            if (Array.isArray(this._key)) {\n                this._cachedPath.push(...this._path, ...this._key);\n            }\n            else {\n                this._cachedPath.push(...this._path, this._key);\n            }\n        }\n        return this._cachedPath;\n    }\n}\nconst handleResult = (ctx, result) => {\n    if ((0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isValid)(result)) {\n        return { success: true, data: result.value };\n    }\n    else {\n        if (!ctx.common.issues.length) {\n            throw new Error(\"Validation failed but no issues detected.\");\n        }\n        return {\n            success: false,\n            get error() {\n                if (this._error)\n                    return this._error;\n                const error = new _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodError(ctx.common.issues);\n                this._error = error;\n                return this._error;\n            },\n        };\n    }\n};\nfunction processCreateParams(params) {\n    if (!params)\n        return {};\n    const { errorMap, invalid_type_error, required_error, description } = params;\n    if (errorMap && (invalid_type_error || required_error)) {\n        throw new Error(`Can't use \"invalid_type_error\" or \"required_error\" in conjunction with custom error map.`);\n    }\n    if (errorMap)\n        return { errorMap: errorMap, description };\n    const customMap = (iss, ctx) => {\n        const { message } = params;\n        if (iss.code === \"invalid_enum_value\") {\n            return { message: message ?? ctx.defaultError };\n        }\n        if (typeof ctx.data === \"undefined\") {\n            return { message: message ?? required_error ?? ctx.defaultError };\n        }\n        if (iss.code !== \"invalid_type\")\n            return { message: ctx.defaultError };\n        return { message: message ?? invalid_type_error ?? ctx.defaultError };\n    };\n    return { errorMap: customMap, description };\n}\nclass ZodType {\n    get description() {\n        return this._def.description;\n    }\n    _getType(input) {\n        return (0,_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.getParsedType)(input.data);\n    }\n    _getOrReturnCtx(input, ctx) {\n        return (ctx || {\n            common: input.parent.common,\n            data: input.data,\n            parsedType: (0,_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.getParsedType)(input.data),\n            schemaErrorMap: this._def.errorMap,\n            path: input.path,\n            parent: input.parent,\n        });\n    }\n    _processInputParams(input) {\n        return {\n            status: new _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus(),\n            ctx: {\n                common: input.parent.common,\n                data: input.data,\n                parsedType: (0,_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.getParsedType)(input.data),\n                schemaErrorMap: this._def.errorMap,\n                path: input.path,\n                parent: input.parent,\n            },\n        };\n    }\n    _parseSync(input) {\n        const result = this._parse(input);\n        if ((0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isAsync)(result)) {\n            throw new Error(\"Synchronous parse encountered promise.\");\n        }\n        return result;\n    }\n    _parseAsync(input) {\n        const result = this._parse(input);\n        return Promise.resolve(result);\n    }\n    parse(data, params) {\n        const result = this.safeParse(data, params);\n        if (result.success)\n            return result.data;\n        throw result.error;\n    }\n    safeParse(data, params) {\n        const ctx = {\n            common: {\n                issues: [],\n                async: params?.async ?? false,\n                contextualErrorMap: params?.errorMap,\n            },\n            path: params?.path || [],\n            schemaErrorMap: this._def.errorMap,\n            parent: null,\n            data,\n            parsedType: (0,_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.getParsedType)(data),\n        };\n        const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n        return handleResult(ctx, result);\n    }\n    \"~validate\"(data) {\n        const ctx = {\n            common: {\n                issues: [],\n                async: !!this[\"~standard\"].async,\n            },\n            path: [],\n            schemaErrorMap: this._def.errorMap,\n            parent: null,\n            data,\n            parsedType: (0,_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.getParsedType)(data),\n        };\n        if (!this[\"~standard\"].async) {\n            try {\n                const result = this._parseSync({ data, path: [], parent: ctx });\n                return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isValid)(result)\n                    ? {\n                        value: result.value,\n                    }\n                    : {\n                        issues: ctx.common.issues,\n                    };\n            }\n            catch (err) {\n                if (err?.message?.toLowerCase()?.includes(\"encountered\")) {\n                    this[\"~standard\"].async = true;\n                }\n                ctx.common = {\n                    issues: [],\n                    async: true,\n                };\n            }\n        }\n        return this._parseAsync({ data, path: [], parent: ctx }).then((result) => (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isValid)(result)\n            ? {\n                value: result.value,\n            }\n            : {\n                issues: ctx.common.issues,\n            });\n    }\n    async parseAsync(data, params) {\n        const result = await this.safeParseAsync(data, params);\n        if (result.success)\n            return result.data;\n        throw result.error;\n    }\n    async safeParseAsync(data, params) {\n        const ctx = {\n            common: {\n                issues: [],\n                contextualErrorMap: params?.errorMap,\n                async: true,\n            },\n            path: params?.path || [],\n            schemaErrorMap: this._def.errorMap,\n            parent: null,\n            data,\n            parsedType: (0,_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.getParsedType)(data),\n        };\n        const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n        const result = await ((0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isAsync)(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n        return handleResult(ctx, result);\n    }\n    refine(check, message) {\n        const getIssueProperties = (val) => {\n            if (typeof message === \"string\" || typeof message === \"undefined\") {\n                return { message };\n            }\n            else if (typeof message === \"function\") {\n                return message(val);\n            }\n            else {\n                return message;\n            }\n        };\n        return this._refinement((val, ctx) => {\n            const result = check(val);\n            const setError = () => ctx.addIssue({\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.custom,\n                ...getIssueProperties(val),\n            });\n            if (typeof Promise !== \"undefined\" && result instanceof Promise) {\n                return result.then((data) => {\n                    if (!data) {\n                        setError();\n                        return false;\n                    }\n                    else {\n                        return true;\n                    }\n                });\n            }\n            if (!result) {\n                setError();\n                return false;\n            }\n            else {\n                return true;\n            }\n        });\n    }\n    refinement(check, refinementData) {\n        return this._refinement((val, ctx) => {\n            if (!check(val)) {\n                ctx.addIssue(typeof refinementData === \"function\" ? refinementData(val, ctx) : refinementData);\n                return false;\n            }\n            else {\n                return true;\n            }\n        });\n    }\n    _refinement(refinement) {\n        return new ZodEffects({\n            schema: this,\n            typeName: ZodFirstPartyTypeKind.ZodEffects,\n            effect: { type: \"refinement\", refinement },\n        });\n    }\n    superRefine(refinement) {\n        return this._refinement(refinement);\n    }\n    constructor(def) {\n        /** Alias of safeParseAsync */\n        this.spa = this.safeParseAsync;\n        this._def = def;\n        this.parse = this.parse.bind(this);\n        this.safeParse = this.safeParse.bind(this);\n        this.parseAsync = this.parseAsync.bind(this);\n        this.safeParseAsync = this.safeParseAsync.bind(this);\n        this.spa = this.spa.bind(this);\n        this.refine = this.refine.bind(this);\n        this.refinement = this.refinement.bind(this);\n        this.superRefine = this.superRefine.bind(this);\n        this.optional = this.optional.bind(this);\n        this.nullable = this.nullable.bind(this);\n        this.nullish = this.nullish.bind(this);\n        this.array = this.array.bind(this);\n        this.promise = this.promise.bind(this);\n        this.or = this.or.bind(this);\n        this.and = this.and.bind(this);\n        this.transform = this.transform.bind(this);\n        this.brand = this.brand.bind(this);\n        this.default = this.default.bind(this);\n        this.catch = this.catch.bind(this);\n        this.describe = this.describe.bind(this);\n        this.pipe = this.pipe.bind(this);\n        this.readonly = this.readonly.bind(this);\n        this.isNullable = this.isNullable.bind(this);\n        this.isOptional = this.isOptional.bind(this);\n        this[\"~standard\"] = {\n            version: 1,\n            vendor: \"zod\",\n            validate: (data) => this[\"~validate\"](data),\n        };\n    }\n    optional() {\n        return ZodOptional.create(this, this._def);\n    }\n    nullable() {\n        return ZodNullable.create(this, this._def);\n    }\n    nullish() {\n        return this.nullable().optional();\n    }\n    array() {\n        return ZodArray.create(this);\n    }\n    promise() {\n        return ZodPromise.create(this, this._def);\n    }\n    or(option) {\n        return ZodUnion.create([this, option], this._def);\n    }\n    and(incoming) {\n        return ZodIntersection.create(this, incoming, this._def);\n    }\n    transform(transform) {\n        return new ZodEffects({\n            ...processCreateParams(this._def),\n            schema: this,\n            typeName: ZodFirstPartyTypeKind.ZodEffects,\n            effect: { type: \"transform\", transform },\n        });\n    }\n    default(def) {\n        const defaultValueFunc = typeof def === \"function\" ? def : () => def;\n        return new ZodDefault({\n            ...processCreateParams(this._def),\n            innerType: this,\n            defaultValue: defaultValueFunc,\n            typeName: ZodFirstPartyTypeKind.ZodDefault,\n        });\n    }\n    brand() {\n        return new ZodBranded({\n            typeName: ZodFirstPartyTypeKind.ZodBranded,\n            type: this,\n            ...processCreateParams(this._def),\n        });\n    }\n    catch(def) {\n        const catchValueFunc = typeof def === \"function\" ? def : () => def;\n        return new ZodCatch({\n            ...processCreateParams(this._def),\n            innerType: this,\n            catchValue: catchValueFunc,\n            typeName: ZodFirstPartyTypeKind.ZodCatch,\n        });\n    }\n    describe(description) {\n        const This = this.constructor;\n        return new This({\n            ...this._def,\n            description,\n        });\n    }\n    pipe(target) {\n        return ZodPipeline.create(this, target);\n    }\n    readonly() {\n        return ZodReadonly.create(this);\n    }\n    isOptional() {\n        return this.safeParse(undefined).success;\n    }\n    isNullable() {\n        return this.safeParse(null).success;\n    }\n}\nconst cuidRegex = /^c[^\\s-]{8,}$/i;\nconst cuid2Regex = /^[0-9a-z]+$/;\nconst ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n// const uuidRegex =\n//   /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;\nconst uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\nconst nanoidRegex = /^[a-z0-9_-]{21}$/i;\nconst jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\nconst durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n// from https://stackoverflow.com/a/46181/1550155\n// old version: too slow, didn't support unicode\n// const emailRegex = /^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))$/i;\n//old email regex\n// const emailRegex = /^(([^<>()[\\].,;:\\s@\"]+(\\.[^<>()[\\].,;:\\s@\"]+)*)|(\".+\"))@((?!-)([^<>()[\\].,;:\\s@\"]+\\.)+[^<>()[\\].,;:\\s@\"]{1,})[^-<>()[\\].,;:\\s@\"]$/i;\n// eslint-disable-next-line\n// const emailRegex =\n//   /^(([^<>()[\\]\\\\.,;:\\s@\\\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\\\"]+)*)|(\\\".+\\\"))@((\\[(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\])|(\\[IPv6:(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))\\])|([A-Za-z0-9]([A-Za-z0-9-]*[A-Za-z0-9])*(\\.[A-Za-z]{2,})+))$/;\n// const emailRegex =\n//   /^[a-zA-Z0-9\\.\\!\\#\\$\\%\\&\\'\\*\\+\\/\\=\\?\\^\\_\\`\\{\\|\\}\\~\\-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;\n// const emailRegex =\n//   /^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])$/i;\nconst emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n// const emailRegex =\n//   /^[a-z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-z0-9-]+(?:\\.[a-z0-9\\-]+)*$/i;\n// from https://thekevinscott.com/emojis-in-javascript/#writing-a-regular-expression\nconst _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\nlet emojiRegex;\n// faster, simpler, safer\nconst ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\nconst ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n// const ipv6Regex =\n// /^(([a-f0-9]{1,4}:){7}|::([a-f0-9]{1,4}:){0,6}|([a-f0-9]{1,4}:){1}:([a-f0-9]{1,4}:){0,5}|([a-f0-9]{1,4}:){2}:([a-f0-9]{1,4}:){0,4}|([a-f0-9]{1,4}:){3}:([a-f0-9]{1,4}:){0,3}|([a-f0-9]{1,4}:){4}:([a-f0-9]{1,4}:){0,2}|([a-f0-9]{1,4}:){5}:([a-f0-9]{1,4}:){0,1})([a-f0-9]{1,4}|(((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2}))\\.){3}((25[0-5])|(2[0-4][0-9])|(1[0-9]{2})|([0-9]{1,2})))$/;\nconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\nconst ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n// https://stackoverflow.com/questions/7860392/determine-if-string-is-in-base64-using-javascript\nconst base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n// https://base64.guru/standards/base64url\nconst base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n// simple\n// const dateRegexSource = `\\\\d{4}-\\\\d{2}-\\\\d{2}`;\n// no leap year validation\n// const dateRegexSource = `\\\\d{4}-((0[13578]|10|12)-31|(0[13-9]|1[0-2])-30|(0[1-9]|1[0-2])-(0[1-9]|1\\\\d|2\\\\d))`;\n// with leap year validation\nconst dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\nconst dateRegex = new RegExp(`^${dateRegexSource}$`);\nfunction timeRegexSource(args) {\n    let secondsRegexSource = `[0-5]\\\\d`;\n    if (args.precision) {\n        secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n    }\n    else if (args.precision == null) {\n        secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n    }\n    const secondsQuantifier = args.precision ? \"+\" : \"?\"; // require seconds if precision is nonzero\n    return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n}\nfunction timeRegex(args) {\n    return new RegExp(`^${timeRegexSource(args)}$`);\n}\n// Adapted from https://stackoverflow.com/a/3143231\nfunction datetimeRegex(args) {\n    let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n    const opts = [];\n    opts.push(args.local ? `Z?` : `Z`);\n    if (args.offset)\n        opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n    regex = `${regex}(${opts.join(\"|\")})`;\n    return new RegExp(`^${regex}$`);\n}\nfunction isValidIP(ip, version) {\n    if ((version === \"v4\" || !version) && ipv4Regex.test(ip)) {\n        return true;\n    }\n    if ((version === \"v6\" || !version) && ipv6Regex.test(ip)) {\n        return true;\n    }\n    return false;\n}\nfunction isValidJWT(jwt, alg) {\n    if (!jwtRegex.test(jwt))\n        return false;\n    try {\n        const [header] = jwt.split(\".\");\n        if (!header)\n            return false;\n        // Convert base64url to base64\n        const base64 = header\n            .replace(/-/g, \"+\")\n            .replace(/_/g, \"/\")\n            .padEnd(header.length + ((4 - (header.length % 4)) % 4), \"=\");\n        const decoded = JSON.parse(atob(base64));\n        if (typeof decoded !== \"object\" || decoded === null)\n            return false;\n        if (\"typ\" in decoded && decoded?.typ !== \"JWT\")\n            return false;\n        if (!decoded.alg)\n            return false;\n        if (alg && decoded.alg !== alg)\n            return false;\n        return true;\n    }\n    catch {\n        return false;\n    }\n}\nfunction isValidCidr(ip, version) {\n    if ((version === \"v4\" || !version) && ipv4CidrRegex.test(ip)) {\n        return true;\n    }\n    if ((version === \"v6\" || !version) && ipv6CidrRegex.test(ip)) {\n        return true;\n    }\n    return false;\n}\nclass ZodString extends ZodType {\n    _parse(input) {\n        if (this._def.coerce) {\n            input.data = String(input.data);\n        }\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.string) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.string,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        const status = new _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus();\n        let ctx = undefined;\n        for (const check of this._def.checks) {\n            if (check.kind === \"min\") {\n                if (input.data.length < check.value) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_small,\n                        minimum: check.value,\n                        type: \"string\",\n                        inclusive: true,\n                        exact: false,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"max\") {\n                if (input.data.length > check.value) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_big,\n                        maximum: check.value,\n                        type: \"string\",\n                        inclusive: true,\n                        exact: false,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"length\") {\n                const tooBig = input.data.length > check.value;\n                const tooSmall = input.data.length < check.value;\n                if (tooBig || tooSmall) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    if (tooBig) {\n                        (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                            code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_big,\n                            maximum: check.value,\n                            type: \"string\",\n                            inclusive: true,\n                            exact: true,\n                            message: check.message,\n                        });\n                    }\n                    else if (tooSmall) {\n                        (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                            code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_small,\n                            minimum: check.value,\n                            type: \"string\",\n                            inclusive: true,\n                            exact: true,\n                            message: check.message,\n                        });\n                    }\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"email\") {\n                if (!emailRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"email\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"emoji\") {\n                if (!emojiRegex) {\n                    emojiRegex = new RegExp(_emojiRegex, \"u\");\n                }\n                if (!emojiRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"emoji\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"uuid\") {\n                if (!uuidRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"uuid\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"nanoid\") {\n                if (!nanoidRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"nanoid\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"cuid\") {\n                if (!cuidRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"cuid\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"cuid2\") {\n                if (!cuid2Regex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"cuid2\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"ulid\") {\n                if (!ulidRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"ulid\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"url\") {\n                try {\n                    new URL(input.data);\n                }\n                catch {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"url\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"regex\") {\n                check.regex.lastIndex = 0;\n                const testResult = check.regex.test(input.data);\n                if (!testResult) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"regex\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"trim\") {\n                input.data = input.data.trim();\n            }\n            else if (check.kind === \"includes\") {\n                if (!input.data.includes(check.value, check.position)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        validation: { includes: check.value, position: check.position },\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"toLowerCase\") {\n                input.data = input.data.toLowerCase();\n            }\n            else if (check.kind === \"toUpperCase\") {\n                input.data = input.data.toUpperCase();\n            }\n            else if (check.kind === \"startsWith\") {\n                if (!input.data.startsWith(check.value)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        validation: { startsWith: check.value },\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"endsWith\") {\n                if (!input.data.endsWith(check.value)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        validation: { endsWith: check.value },\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"datetime\") {\n                const regex = datetimeRegex(check);\n                if (!regex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        validation: \"datetime\",\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"date\") {\n                const regex = dateRegex;\n                if (!regex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        validation: \"date\",\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"time\") {\n                const regex = timeRegex(check);\n                if (!regex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        validation: \"time\",\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"duration\") {\n                if (!durationRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"duration\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"ip\") {\n                if (!isValidIP(input.data, check.version)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"ip\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"jwt\") {\n                if (!isValidJWT(input.data, check.alg)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"jwt\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"cidr\") {\n                if (!isValidCidr(input.data, check.version)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"cidr\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"base64\") {\n                if (!base64Regex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"base64\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"base64url\") {\n                if (!base64urlRegex.test(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        validation: \"base64url\",\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else {\n                _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.assertNever(check);\n            }\n        }\n        return { status: status.value, value: input.data };\n    }\n    _regex(regex, validation, message) {\n        return this.refinement((data) => regex.test(data), {\n            validation,\n            code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_string,\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message),\n        });\n    }\n    _addCheck(check) {\n        return new ZodString({\n            ...this._def,\n            checks: [...this._def.checks, check],\n        });\n    }\n    email(message) {\n        return this._addCheck({ kind: \"email\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message) });\n    }\n    url(message) {\n        return this._addCheck({ kind: \"url\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message) });\n    }\n    emoji(message) {\n        return this._addCheck({ kind: \"emoji\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message) });\n    }\n    uuid(message) {\n        return this._addCheck({ kind: \"uuid\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message) });\n    }\n    nanoid(message) {\n        return this._addCheck({ kind: \"nanoid\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message) });\n    }\n    cuid(message) {\n        return this._addCheck({ kind: \"cuid\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message) });\n    }\n    cuid2(message) {\n        return this._addCheck({ kind: \"cuid2\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message) });\n    }\n    ulid(message) {\n        return this._addCheck({ kind: \"ulid\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message) });\n    }\n    base64(message) {\n        return this._addCheck({ kind: \"base64\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message) });\n    }\n    base64url(message) {\n        // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n        return this._addCheck({\n            kind: \"base64url\",\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message),\n        });\n    }\n    jwt(options) {\n        return this._addCheck({ kind: \"jwt\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(options) });\n    }\n    ip(options) {\n        return this._addCheck({ kind: \"ip\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(options) });\n    }\n    cidr(options) {\n        return this._addCheck({ kind: \"cidr\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(options) });\n    }\n    datetime(options) {\n        if (typeof options === \"string\") {\n            return this._addCheck({\n                kind: \"datetime\",\n                precision: null,\n                offset: false,\n                local: false,\n                message: options,\n            });\n        }\n        return this._addCheck({\n            kind: \"datetime\",\n            precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n            offset: options?.offset ?? false,\n            local: options?.local ?? false,\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(options?.message),\n        });\n    }\n    date(message) {\n        return this._addCheck({ kind: \"date\", message });\n    }\n    time(options) {\n        if (typeof options === \"string\") {\n            return this._addCheck({\n                kind: \"time\",\n                precision: null,\n                message: options,\n            });\n        }\n        return this._addCheck({\n            kind: \"time\",\n            precision: typeof options?.precision === \"undefined\" ? null : options?.precision,\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(options?.message),\n        });\n    }\n    duration(message) {\n        return this._addCheck({ kind: \"duration\", ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message) });\n    }\n    regex(regex, message) {\n        return this._addCheck({\n            kind: \"regex\",\n            regex: regex,\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message),\n        });\n    }\n    includes(value, options) {\n        return this._addCheck({\n            kind: \"includes\",\n            value: value,\n            position: options?.position,\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(options?.message),\n        });\n    }\n    startsWith(value, message) {\n        return this._addCheck({\n            kind: \"startsWith\",\n            value: value,\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message),\n        });\n    }\n    endsWith(value, message) {\n        return this._addCheck({\n            kind: \"endsWith\",\n            value: value,\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message),\n        });\n    }\n    min(minLength, message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: minLength,\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message),\n        });\n    }\n    max(maxLength, message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: maxLength,\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message),\n        });\n    }\n    length(len, message) {\n        return this._addCheck({\n            kind: \"length\",\n            value: len,\n            ..._helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message),\n        });\n    }\n    /**\n     * Equivalent to `.min(1)`\n     */\n    nonempty(message) {\n        return this.min(1, _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message));\n    }\n    trim() {\n        return new ZodString({\n            ...this._def,\n            checks: [...this._def.checks, { kind: \"trim\" }],\n        });\n    }\n    toLowerCase() {\n        return new ZodString({\n            ...this._def,\n            checks: [...this._def.checks, { kind: \"toLowerCase\" }],\n        });\n    }\n    toUpperCase() {\n        return new ZodString({\n            ...this._def,\n            checks: [...this._def.checks, { kind: \"toUpperCase\" }],\n        });\n    }\n    get isDatetime() {\n        return !!this._def.checks.find((ch) => ch.kind === \"datetime\");\n    }\n    get isDate() {\n        return !!this._def.checks.find((ch) => ch.kind === \"date\");\n    }\n    get isTime() {\n        return !!this._def.checks.find((ch) => ch.kind === \"time\");\n    }\n    get isDuration() {\n        return !!this._def.checks.find((ch) => ch.kind === \"duration\");\n    }\n    get isEmail() {\n        return !!this._def.checks.find((ch) => ch.kind === \"email\");\n    }\n    get isURL() {\n        return !!this._def.checks.find((ch) => ch.kind === \"url\");\n    }\n    get isEmoji() {\n        return !!this._def.checks.find((ch) => ch.kind === \"emoji\");\n    }\n    get isUUID() {\n        return !!this._def.checks.find((ch) => ch.kind === \"uuid\");\n    }\n    get isNANOID() {\n        return !!this._def.checks.find((ch) => ch.kind === \"nanoid\");\n    }\n    get isCUID() {\n        return !!this._def.checks.find((ch) => ch.kind === \"cuid\");\n    }\n    get isCUID2() {\n        return !!this._def.checks.find((ch) => ch.kind === \"cuid2\");\n    }\n    get isULID() {\n        return !!this._def.checks.find((ch) => ch.kind === \"ulid\");\n    }\n    get isIP() {\n        return !!this._def.checks.find((ch) => ch.kind === \"ip\");\n    }\n    get isCIDR() {\n        return !!this._def.checks.find((ch) => ch.kind === \"cidr\");\n    }\n    get isBase64() {\n        return !!this._def.checks.find((ch) => ch.kind === \"base64\");\n    }\n    get isBase64url() {\n        // base64url encoding is a modification of base64 that can safely be used in URLs and filenames\n        return !!this._def.checks.find((ch) => ch.kind === \"base64url\");\n    }\n    get minLength() {\n        let min = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"min\") {\n                if (min === null || ch.value > min)\n                    min = ch.value;\n            }\n        }\n        return min;\n    }\n    get maxLength() {\n        let max = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"max\") {\n                if (max === null || ch.value < max)\n                    max = ch.value;\n            }\n        }\n        return max;\n    }\n}\nZodString.create = (params) => {\n    return new ZodString({\n        checks: [],\n        typeName: ZodFirstPartyTypeKind.ZodString,\n        coerce: params?.coerce ?? false,\n        ...processCreateParams(params),\n    });\n};\n// https://stackoverflow.com/questions/3966484/why-does-modulus-operator-return-fractional-number-in-javascript/31711034#31711034\nfunction floatSafeRemainder(val, step) {\n    const valDecCount = (val.toString().split(\".\")[1] || \"\").length;\n    const stepDecCount = (step.toString().split(\".\")[1] || \"\").length;\n    const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n    const valInt = Number.parseInt(val.toFixed(decCount).replace(\".\", \"\"));\n    const stepInt = Number.parseInt(step.toFixed(decCount).replace(\".\", \"\"));\n    return (valInt % stepInt) / 10 ** decCount;\n}\nclass ZodNumber extends ZodType {\n    constructor() {\n        super(...arguments);\n        this.min = this.gte;\n        this.max = this.lte;\n        this.step = this.multipleOf;\n    }\n    _parse(input) {\n        if (this._def.coerce) {\n            input.data = Number(input.data);\n        }\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.number) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.number,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        let ctx = undefined;\n        const status = new _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus();\n        for (const check of this._def.checks) {\n            if (check.kind === \"int\") {\n                if (!_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.isInteger(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                        expected: \"integer\",\n                        received: \"float\",\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"min\") {\n                const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n                if (tooSmall) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_small,\n                        minimum: check.value,\n                        type: \"number\",\n                        inclusive: check.inclusive,\n                        exact: false,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"max\") {\n                const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n                if (tooBig) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_big,\n                        maximum: check.value,\n                        type: \"number\",\n                        inclusive: check.inclusive,\n                        exact: false,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"multipleOf\") {\n                if (floatSafeRemainder(input.data, check.value) !== 0) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.not_multiple_of,\n                        multipleOf: check.value,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"finite\") {\n                if (!Number.isFinite(input.data)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.not_finite,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else {\n                _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.assertNever(check);\n            }\n        }\n        return { status: status.value, value: input.data };\n    }\n    gte(value, message) {\n        return this.setLimit(\"min\", value, true, _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message));\n    }\n    gt(value, message) {\n        return this.setLimit(\"min\", value, false, _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message));\n    }\n    lte(value, message) {\n        return this.setLimit(\"max\", value, true, _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message));\n    }\n    lt(value, message) {\n        return this.setLimit(\"max\", value, false, _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message));\n    }\n    setLimit(kind, value, inclusive, message) {\n        return new ZodNumber({\n            ...this._def,\n            checks: [\n                ...this._def.checks,\n                {\n                    kind,\n                    value,\n                    inclusive,\n                    message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n                },\n            ],\n        });\n    }\n    _addCheck(check) {\n        return new ZodNumber({\n            ...this._def,\n            checks: [...this._def.checks, check],\n        });\n    }\n    int(message) {\n        return this._addCheck({\n            kind: \"int\",\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    positive(message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: 0,\n            inclusive: false,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    negative(message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: 0,\n            inclusive: false,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    nonpositive(message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: 0,\n            inclusive: true,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    nonnegative(message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: 0,\n            inclusive: true,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    multipleOf(value, message) {\n        return this._addCheck({\n            kind: \"multipleOf\",\n            value: value,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    finite(message) {\n        return this._addCheck({\n            kind: \"finite\",\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    safe(message) {\n        return this._addCheck({\n            kind: \"min\",\n            inclusive: true,\n            value: Number.MIN_SAFE_INTEGER,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        })._addCheck({\n            kind: \"max\",\n            inclusive: true,\n            value: Number.MAX_SAFE_INTEGER,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    get minValue() {\n        let min = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"min\") {\n                if (min === null || ch.value > min)\n                    min = ch.value;\n            }\n        }\n        return min;\n    }\n    get maxValue() {\n        let max = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"max\") {\n                if (max === null || ch.value < max)\n                    max = ch.value;\n            }\n        }\n        return max;\n    }\n    get isInt() {\n        return !!this._def.checks.find((ch) => ch.kind === \"int\" || (ch.kind === \"multipleOf\" && _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.isInteger(ch.value)));\n    }\n    get isFinite() {\n        let max = null;\n        let min = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"finite\" || ch.kind === \"int\" || ch.kind === \"multipleOf\") {\n                return true;\n            }\n            else if (ch.kind === \"min\") {\n                if (min === null || ch.value > min)\n                    min = ch.value;\n            }\n            else if (ch.kind === \"max\") {\n                if (max === null || ch.value < max)\n                    max = ch.value;\n            }\n        }\n        return Number.isFinite(min) && Number.isFinite(max);\n    }\n}\nZodNumber.create = (params) => {\n    return new ZodNumber({\n        checks: [],\n        typeName: ZodFirstPartyTypeKind.ZodNumber,\n        coerce: params?.coerce || false,\n        ...processCreateParams(params),\n    });\n};\nclass ZodBigInt extends ZodType {\n    constructor() {\n        super(...arguments);\n        this.min = this.gte;\n        this.max = this.lte;\n    }\n    _parse(input) {\n        if (this._def.coerce) {\n            try {\n                input.data = BigInt(input.data);\n            }\n            catch {\n                return this._getInvalidInput(input);\n            }\n        }\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.bigint) {\n            return this._getInvalidInput(input);\n        }\n        let ctx = undefined;\n        const status = new _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus();\n        for (const check of this._def.checks) {\n            if (check.kind === \"min\") {\n                const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n                if (tooSmall) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_small,\n                        type: \"bigint\",\n                        minimum: check.value,\n                        inclusive: check.inclusive,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"max\") {\n                const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n                if (tooBig) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_big,\n                        type: \"bigint\",\n                        maximum: check.value,\n                        inclusive: check.inclusive,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"multipleOf\") {\n                if (input.data % check.value !== BigInt(0)) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.not_multiple_of,\n                        multipleOf: check.value,\n                        message: check.message,\n                    });\n                    status.dirty();\n                }\n            }\n            else {\n                _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.assertNever(check);\n            }\n        }\n        return { status: status.value, value: input.data };\n    }\n    _getInvalidInput(input) {\n        const ctx = this._getOrReturnCtx(input);\n        (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n            code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n            expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.bigint,\n            received: ctx.parsedType,\n        });\n        return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n    }\n    gte(value, message) {\n        return this.setLimit(\"min\", value, true, _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message));\n    }\n    gt(value, message) {\n        return this.setLimit(\"min\", value, false, _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message));\n    }\n    lte(value, message) {\n        return this.setLimit(\"max\", value, true, _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message));\n    }\n    lt(value, message) {\n        return this.setLimit(\"max\", value, false, _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message));\n    }\n    setLimit(kind, value, inclusive, message) {\n        return new ZodBigInt({\n            ...this._def,\n            checks: [\n                ...this._def.checks,\n                {\n                    kind,\n                    value,\n                    inclusive,\n                    message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n                },\n            ],\n        });\n    }\n    _addCheck(check) {\n        return new ZodBigInt({\n            ...this._def,\n            checks: [...this._def.checks, check],\n        });\n    }\n    positive(message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: BigInt(0),\n            inclusive: false,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    negative(message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: BigInt(0),\n            inclusive: false,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    nonpositive(message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: BigInt(0),\n            inclusive: true,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    nonnegative(message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: BigInt(0),\n            inclusive: true,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    multipleOf(value, message) {\n        return this._addCheck({\n            kind: \"multipleOf\",\n            value,\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    get minValue() {\n        let min = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"min\") {\n                if (min === null || ch.value > min)\n                    min = ch.value;\n            }\n        }\n        return min;\n    }\n    get maxValue() {\n        let max = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"max\") {\n                if (max === null || ch.value < max)\n                    max = ch.value;\n            }\n        }\n        return max;\n    }\n}\nZodBigInt.create = (params) => {\n    return new ZodBigInt({\n        checks: [],\n        typeName: ZodFirstPartyTypeKind.ZodBigInt,\n        coerce: params?.coerce ?? false,\n        ...processCreateParams(params),\n    });\n};\nclass ZodBoolean extends ZodType {\n    _parse(input) {\n        if (this._def.coerce) {\n            input.data = Boolean(input.data);\n        }\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.boolean) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.boolean,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(input.data);\n    }\n}\nZodBoolean.create = (params) => {\n    return new ZodBoolean({\n        typeName: ZodFirstPartyTypeKind.ZodBoolean,\n        coerce: params?.coerce || false,\n        ...processCreateParams(params),\n    });\n};\nclass ZodDate extends ZodType {\n    _parse(input) {\n        if (this._def.coerce) {\n            input.data = new Date(input.data);\n        }\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.date) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.date,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        if (Number.isNaN(input.data.getTime())) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_date,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        const status = new _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus();\n        let ctx = undefined;\n        for (const check of this._def.checks) {\n            if (check.kind === \"min\") {\n                if (input.data.getTime() < check.value) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_small,\n                        message: check.message,\n                        inclusive: true,\n                        exact: false,\n                        minimum: check.value,\n                        type: \"date\",\n                    });\n                    status.dirty();\n                }\n            }\n            else if (check.kind === \"max\") {\n                if (input.data.getTime() > check.value) {\n                    ctx = this._getOrReturnCtx(input, ctx);\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_big,\n                        message: check.message,\n                        inclusive: true,\n                        exact: false,\n                        maximum: check.value,\n                        type: \"date\",\n                    });\n                    status.dirty();\n                }\n            }\n            else {\n                _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.assertNever(check);\n            }\n        }\n        return {\n            status: status.value,\n            value: new Date(input.data.getTime()),\n        };\n    }\n    _addCheck(check) {\n        return new ZodDate({\n            ...this._def,\n            checks: [...this._def.checks, check],\n        });\n    }\n    min(minDate, message) {\n        return this._addCheck({\n            kind: \"min\",\n            value: minDate.getTime(),\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    max(maxDate, message) {\n        return this._addCheck({\n            kind: \"max\",\n            value: maxDate.getTime(),\n            message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message),\n        });\n    }\n    get minDate() {\n        let min = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"min\") {\n                if (min === null || ch.value > min)\n                    min = ch.value;\n            }\n        }\n        return min != null ? new Date(min) : null;\n    }\n    get maxDate() {\n        let max = null;\n        for (const ch of this._def.checks) {\n            if (ch.kind === \"max\") {\n                if (max === null || ch.value < max)\n                    max = ch.value;\n            }\n        }\n        return max != null ? new Date(max) : null;\n    }\n}\nZodDate.create = (params) => {\n    return new ZodDate({\n        checks: [],\n        coerce: params?.coerce || false,\n        typeName: ZodFirstPartyTypeKind.ZodDate,\n        ...processCreateParams(params),\n    });\n};\nclass ZodSymbol extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.symbol) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.symbol,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(input.data);\n    }\n}\nZodSymbol.create = (params) => {\n    return new ZodSymbol({\n        typeName: ZodFirstPartyTypeKind.ZodSymbol,\n        ...processCreateParams(params),\n    });\n};\nclass ZodUndefined extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.undefined) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.undefined,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(input.data);\n    }\n}\nZodUndefined.create = (params) => {\n    return new ZodUndefined({\n        typeName: ZodFirstPartyTypeKind.ZodUndefined,\n        ...processCreateParams(params),\n    });\n};\nclass ZodNull extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.null) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.null,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(input.data);\n    }\n}\nZodNull.create = (params) => {\n    return new ZodNull({\n        typeName: ZodFirstPartyTypeKind.ZodNull,\n        ...processCreateParams(params),\n    });\n};\nclass ZodAny extends ZodType {\n    constructor() {\n        super(...arguments);\n        // to prevent instances of other classes from extending ZodAny. this causes issues with catchall in ZodObject.\n        this._any = true;\n    }\n    _parse(input) {\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(input.data);\n    }\n}\nZodAny.create = (params) => {\n    return new ZodAny({\n        typeName: ZodFirstPartyTypeKind.ZodAny,\n        ...processCreateParams(params),\n    });\n};\nclass ZodUnknown extends ZodType {\n    constructor() {\n        super(...arguments);\n        // required\n        this._unknown = true;\n    }\n    _parse(input) {\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(input.data);\n    }\n}\nZodUnknown.create = (params) => {\n    return new ZodUnknown({\n        typeName: ZodFirstPartyTypeKind.ZodUnknown,\n        ...processCreateParams(params),\n    });\n};\nclass ZodNever extends ZodType {\n    _parse(input) {\n        const ctx = this._getOrReturnCtx(input);\n        (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n            code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n            expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.never,\n            received: ctx.parsedType,\n        });\n        return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n    }\n}\nZodNever.create = (params) => {\n    return new ZodNever({\n        typeName: ZodFirstPartyTypeKind.ZodNever,\n        ...processCreateParams(params),\n    });\n};\nclass ZodVoid extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.undefined) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.void,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(input.data);\n    }\n}\nZodVoid.create = (params) => {\n    return new ZodVoid({\n        typeName: ZodFirstPartyTypeKind.ZodVoid,\n        ...processCreateParams(params),\n    });\n};\nclass ZodArray extends ZodType {\n    _parse(input) {\n        const { ctx, status } = this._processInputParams(input);\n        const def = this._def;\n        if (ctx.parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.array) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.array,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        if (def.exactLength !== null) {\n            const tooBig = ctx.data.length > def.exactLength.value;\n            const tooSmall = ctx.data.length < def.exactLength.value;\n            if (tooBig || tooSmall) {\n                (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                    code: tooBig ? _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_big : _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_small,\n                    minimum: (tooSmall ? def.exactLength.value : undefined),\n                    maximum: (tooBig ? def.exactLength.value : undefined),\n                    type: \"array\",\n                    inclusive: true,\n                    exact: true,\n                    message: def.exactLength.message,\n                });\n                status.dirty();\n            }\n        }\n        if (def.minLength !== null) {\n            if (ctx.data.length < def.minLength.value) {\n                (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                    code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_small,\n                    minimum: def.minLength.value,\n                    type: \"array\",\n                    inclusive: true,\n                    exact: false,\n                    message: def.minLength.message,\n                });\n                status.dirty();\n            }\n        }\n        if (def.maxLength !== null) {\n            if (ctx.data.length > def.maxLength.value) {\n                (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                    code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_big,\n                    maximum: def.maxLength.value,\n                    type: \"array\",\n                    inclusive: true,\n                    exact: false,\n                    message: def.maxLength.message,\n                });\n                status.dirty();\n            }\n        }\n        if (ctx.common.async) {\n            return Promise.all([...ctx.data].map((item, i) => {\n                return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n            })).then((result) => {\n                return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus.mergeArray(status, result);\n            });\n        }\n        const result = [...ctx.data].map((item, i) => {\n            return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));\n        });\n        return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus.mergeArray(status, result);\n    }\n    get element() {\n        return this._def.type;\n    }\n    min(minLength, message) {\n        return new ZodArray({\n            ...this._def,\n            minLength: { value: minLength, message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message) },\n        });\n    }\n    max(maxLength, message) {\n        return new ZodArray({\n            ...this._def,\n            maxLength: { value: maxLength, message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message) },\n        });\n    }\n    length(len, message) {\n        return new ZodArray({\n            ...this._def,\n            exactLength: { value: len, message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message) },\n        });\n    }\n    nonempty(message) {\n        return this.min(1, message);\n    }\n}\nZodArray.create = (schema, params) => {\n    return new ZodArray({\n        type: schema,\n        minLength: null,\n        maxLength: null,\n        exactLength: null,\n        typeName: ZodFirstPartyTypeKind.ZodArray,\n        ...processCreateParams(params),\n    });\n};\nfunction deepPartialify(schema) {\n    if (schema instanceof ZodObject) {\n        const newShape = {};\n        for (const key in schema.shape) {\n            const fieldSchema = schema.shape[key];\n            newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n        }\n        return new ZodObject({\n            ...schema._def,\n            shape: () => newShape,\n        });\n    }\n    else if (schema instanceof ZodArray) {\n        return new ZodArray({\n            ...schema._def,\n            type: deepPartialify(schema.element),\n        });\n    }\n    else if (schema instanceof ZodOptional) {\n        return ZodOptional.create(deepPartialify(schema.unwrap()));\n    }\n    else if (schema instanceof ZodNullable) {\n        return ZodNullable.create(deepPartialify(schema.unwrap()));\n    }\n    else if (schema instanceof ZodTuple) {\n        return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n    }\n    else {\n        return schema;\n    }\n}\nclass ZodObject extends ZodType {\n    constructor() {\n        super(...arguments);\n        this._cached = null;\n        /**\n         * @deprecated In most cases, this is no longer needed - unknown properties are now silently stripped.\n         * If you want to pass through unknown properties, use `.passthrough()` instead.\n         */\n        this.nonstrict = this.passthrough;\n        // extend<\n        //   Augmentation extends ZodRawShape,\n        //   NewOutput extends util.flatten<{\n        //     [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n        //       ? Augmentation[k][\"_output\"]\n        //       : k extends keyof Output\n        //       ? Output[k]\n        //       : never;\n        //   }>,\n        //   NewInput extends util.flatten<{\n        //     [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n        //       ? Augmentation[k][\"_input\"]\n        //       : k extends keyof Input\n        //       ? Input[k]\n        //       : never;\n        //   }>\n        // >(\n        //   augmentation: Augmentation\n        // ): ZodObject<\n        //   extendShape<T, Augmentation>,\n        //   UnknownKeys,\n        //   Catchall,\n        //   NewOutput,\n        //   NewInput\n        // > {\n        //   return new ZodObject({\n        //     ...this._def,\n        //     shape: () => ({\n        //       ...this._def.shape(),\n        //       ...augmentation,\n        //     }),\n        //   }) as any;\n        // }\n        /**\n         * @deprecated Use `.extend` instead\n         *  */\n        this.augment = this.extend;\n    }\n    _getCached() {\n        if (this._cached !== null)\n            return this._cached;\n        const shape = this._def.shape();\n        const keys = _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectKeys(shape);\n        this._cached = { shape, keys };\n        return this._cached;\n    }\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.object) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.object,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        const { status, ctx } = this._processInputParams(input);\n        const { shape, keys: shapeKeys } = this._getCached();\n        const extraKeys = [];\n        if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === \"strip\")) {\n            for (const key in ctx.data) {\n                if (!shapeKeys.includes(key)) {\n                    extraKeys.push(key);\n                }\n            }\n        }\n        const pairs = [];\n        for (const key of shapeKeys) {\n            const keyValidator = shape[key];\n            const value = ctx.data[key];\n            pairs.push({\n                key: { status: \"valid\", value: key },\n                value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n                alwaysSet: key in ctx.data,\n            });\n        }\n        if (this._def.catchall instanceof ZodNever) {\n            const unknownKeys = this._def.unknownKeys;\n            if (unknownKeys === \"passthrough\") {\n                for (const key of extraKeys) {\n                    pairs.push({\n                        key: { status: \"valid\", value: key },\n                        value: { status: \"valid\", value: ctx.data[key] },\n                    });\n                }\n            }\n            else if (unknownKeys === \"strict\") {\n                if (extraKeys.length > 0) {\n                    (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                        code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.unrecognized_keys,\n                        keys: extraKeys,\n                    });\n                    status.dirty();\n                }\n            }\n            else if (unknownKeys === \"strip\") {\n            }\n            else {\n                throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n            }\n        }\n        else {\n            // run catchall validation\n            const catchall = this._def.catchall;\n            for (const key of extraKeys) {\n                const value = ctx.data[key];\n                pairs.push({\n                    key: { status: \"valid\", value: key },\n                    value: catchall._parse(new ParseInputLazyPath(ctx, value, ctx.path, key) //, ctx.child(key), value, getParsedType(value)\n                    ),\n                    alwaysSet: key in ctx.data,\n                });\n            }\n        }\n        if (ctx.common.async) {\n            return Promise.resolve()\n                .then(async () => {\n                const syncPairs = [];\n                for (const pair of pairs) {\n                    const key = await pair.key;\n                    const value = await pair.value;\n                    syncPairs.push({\n                        key,\n                        value,\n                        alwaysSet: pair.alwaysSet,\n                    });\n                }\n                return syncPairs;\n            })\n                .then((syncPairs) => {\n                return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus.mergeObjectSync(status, syncPairs);\n            });\n        }\n        else {\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus.mergeObjectSync(status, pairs);\n        }\n    }\n    get shape() {\n        return this._def.shape();\n    }\n    strict(message) {\n        _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj;\n        return new ZodObject({\n            ...this._def,\n            unknownKeys: \"strict\",\n            ...(message !== undefined\n                ? {\n                    errorMap: (issue, ctx) => {\n                        const defaultError = this._def.errorMap?.(issue, ctx).message ?? ctx.defaultError;\n                        if (issue.code === \"unrecognized_keys\")\n                            return {\n                                message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.errToObj(message).message ?? defaultError,\n                            };\n                        return {\n                            message: defaultError,\n                        };\n                    },\n                }\n                : {}),\n        });\n    }\n    strip() {\n        return new ZodObject({\n            ...this._def,\n            unknownKeys: \"strip\",\n        });\n    }\n    passthrough() {\n        return new ZodObject({\n            ...this._def,\n            unknownKeys: \"passthrough\",\n        });\n    }\n    // const AugmentFactory =\n    //   <Def extends ZodObjectDef>(def: Def) =>\n    //   <Augmentation extends ZodRawShape>(\n    //     augmentation: Augmentation\n    //   ): ZodObject<\n    //     extendShape<ReturnType<Def[\"shape\"]>, Augmentation>,\n    //     Def[\"unknownKeys\"],\n    //     Def[\"catchall\"]\n    //   > => {\n    //     return new ZodObject({\n    //       ...def,\n    //       shape: () => ({\n    //         ...def.shape(),\n    //         ...augmentation,\n    //       }),\n    //     }) as any;\n    //   };\n    extend(augmentation) {\n        return new ZodObject({\n            ...this._def,\n            shape: () => ({\n                ...this._def.shape(),\n                ...augmentation,\n            }),\n        });\n    }\n    /**\n     * Prior to zod@1.0.12 there was a bug in the\n     * inferred type of merged objects. Please\n     * upgrade if you are experiencing issues.\n     */\n    merge(merging) {\n        const merged = new ZodObject({\n            unknownKeys: merging._def.unknownKeys,\n            catchall: merging._def.catchall,\n            shape: () => ({\n                ...this._def.shape(),\n                ...merging._def.shape(),\n            }),\n            typeName: ZodFirstPartyTypeKind.ZodObject,\n        });\n        return merged;\n    }\n    // merge<\n    //   Incoming extends AnyZodObject,\n    //   Augmentation extends Incoming[\"shape\"],\n    //   NewOutput extends {\n    //     [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n    //       ? Augmentation[k][\"_output\"]\n    //       : k extends keyof Output\n    //       ? Output[k]\n    //       : never;\n    //   },\n    //   NewInput extends {\n    //     [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n    //       ? Augmentation[k][\"_input\"]\n    //       : k extends keyof Input\n    //       ? Input[k]\n    //       : never;\n    //   }\n    // >(\n    //   merging: Incoming\n    // ): ZodObject<\n    //   extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n    //   Incoming[\"_def\"][\"unknownKeys\"],\n    //   Incoming[\"_def\"][\"catchall\"],\n    //   NewOutput,\n    //   NewInput\n    // > {\n    //   const merged: any = new ZodObject({\n    //     unknownKeys: merging._def.unknownKeys,\n    //     catchall: merging._def.catchall,\n    //     shape: () =>\n    //       objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n    //     typeName: ZodFirstPartyTypeKind.ZodObject,\n    //   }) as any;\n    //   return merged;\n    // }\n    setKey(key, schema) {\n        return this.augment({ [key]: schema });\n    }\n    // merge<Incoming extends AnyZodObject>(\n    //   merging: Incoming\n    // ): //ZodObject<T & Incoming[\"_shape\"], UnknownKeys, Catchall> = (merging) => {\n    // ZodObject<\n    //   extendShape<T, ReturnType<Incoming[\"_def\"][\"shape\"]>>,\n    //   Incoming[\"_def\"][\"unknownKeys\"],\n    //   Incoming[\"_def\"][\"catchall\"]\n    // > {\n    //   // const mergedShape = objectUtil.mergeShapes(\n    //   //   this._def.shape(),\n    //   //   merging._def.shape()\n    //   // );\n    //   const merged: any = new ZodObject({\n    //     unknownKeys: merging._def.unknownKeys,\n    //     catchall: merging._def.catchall,\n    //     shape: () =>\n    //       objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n    //     typeName: ZodFirstPartyTypeKind.ZodObject,\n    //   }) as any;\n    //   return merged;\n    // }\n    catchall(index) {\n        return new ZodObject({\n            ...this._def,\n            catchall: index,\n        });\n    }\n    pick(mask) {\n        const shape = {};\n        for (const key of _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectKeys(mask)) {\n            if (mask[key] && this.shape[key]) {\n                shape[key] = this.shape[key];\n            }\n        }\n        return new ZodObject({\n            ...this._def,\n            shape: () => shape,\n        });\n    }\n    omit(mask) {\n        const shape = {};\n        for (const key of _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectKeys(this.shape)) {\n            if (!mask[key]) {\n                shape[key] = this.shape[key];\n            }\n        }\n        return new ZodObject({\n            ...this._def,\n            shape: () => shape,\n        });\n    }\n    /**\n     * @deprecated\n     */\n    deepPartial() {\n        return deepPartialify(this);\n    }\n    partial(mask) {\n        const newShape = {};\n        for (const key of _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectKeys(this.shape)) {\n            const fieldSchema = this.shape[key];\n            if (mask && !mask[key]) {\n                newShape[key] = fieldSchema;\n            }\n            else {\n                newShape[key] = fieldSchema.optional();\n            }\n        }\n        return new ZodObject({\n            ...this._def,\n            shape: () => newShape,\n        });\n    }\n    required(mask) {\n        const newShape = {};\n        for (const key of _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectKeys(this.shape)) {\n            if (mask && !mask[key]) {\n                newShape[key] = this.shape[key];\n            }\n            else {\n                const fieldSchema = this.shape[key];\n                let newField = fieldSchema;\n                while (newField instanceof ZodOptional) {\n                    newField = newField._def.innerType;\n                }\n                newShape[key] = newField;\n            }\n        }\n        return new ZodObject({\n            ...this._def,\n            shape: () => newShape,\n        });\n    }\n    keyof() {\n        return createZodEnum(_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectKeys(this.shape));\n    }\n}\nZodObject.create = (shape, params) => {\n    return new ZodObject({\n        shape: () => shape,\n        unknownKeys: \"strip\",\n        catchall: ZodNever.create(),\n        typeName: ZodFirstPartyTypeKind.ZodObject,\n        ...processCreateParams(params),\n    });\n};\nZodObject.strictCreate = (shape, params) => {\n    return new ZodObject({\n        shape: () => shape,\n        unknownKeys: \"strict\",\n        catchall: ZodNever.create(),\n        typeName: ZodFirstPartyTypeKind.ZodObject,\n        ...processCreateParams(params),\n    });\n};\nZodObject.lazycreate = (shape, params) => {\n    return new ZodObject({\n        shape,\n        unknownKeys: \"strip\",\n        catchall: ZodNever.create(),\n        typeName: ZodFirstPartyTypeKind.ZodObject,\n        ...processCreateParams(params),\n    });\n};\nclass ZodUnion extends ZodType {\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        const options = this._def.options;\n        function handleResults(results) {\n            // return first issue-free validation if it exists\n            for (const result of results) {\n                if (result.result.status === \"valid\") {\n                    return result.result;\n                }\n            }\n            for (const result of results) {\n                if (result.result.status === \"dirty\") {\n                    // add issues from dirty option\n                    ctx.common.issues.push(...result.ctx.common.issues);\n                    return result.result;\n                }\n            }\n            // return invalid\n            const unionErrors = results.map((result) => new _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodError(result.ctx.common.issues));\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_union,\n                unionErrors,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        if (ctx.common.async) {\n            return Promise.all(options.map(async (option) => {\n                const childCtx = {\n                    ...ctx,\n                    common: {\n                        ...ctx.common,\n                        issues: [],\n                    },\n                    parent: null,\n                };\n                return {\n                    result: await option._parseAsync({\n                        data: ctx.data,\n                        path: ctx.path,\n                        parent: childCtx,\n                    }),\n                    ctx: childCtx,\n                };\n            })).then(handleResults);\n        }\n        else {\n            let dirty = undefined;\n            const issues = [];\n            for (const option of options) {\n                const childCtx = {\n                    ...ctx,\n                    common: {\n                        ...ctx.common,\n                        issues: [],\n                    },\n                    parent: null,\n                };\n                const result = option._parseSync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: childCtx,\n                });\n                if (result.status === \"valid\") {\n                    return result;\n                }\n                else if (result.status === \"dirty\" && !dirty) {\n                    dirty = { result, ctx: childCtx };\n                }\n                if (childCtx.common.issues.length) {\n                    issues.push(childCtx.common.issues);\n                }\n            }\n            if (dirty) {\n                ctx.common.issues.push(...dirty.ctx.common.issues);\n                return dirty.result;\n            }\n            const unionErrors = issues.map((issues) => new _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodError(issues));\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_union,\n                unionErrors,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n    }\n    get options() {\n        return this._def.options;\n    }\n}\nZodUnion.create = (types, params) => {\n    return new ZodUnion({\n        options: types,\n        typeName: ZodFirstPartyTypeKind.ZodUnion,\n        ...processCreateParams(params),\n    });\n};\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\n//////////                                 //////////\n//////////      ZodDiscriminatedUnion      //////////\n//////////                                 //////////\n/////////////////////////////////////////////////////\n/////////////////////////////////////////////////////\nconst getDiscriminator = (type) => {\n    if (type instanceof ZodLazy) {\n        return getDiscriminator(type.schema);\n    }\n    else if (type instanceof ZodEffects) {\n        return getDiscriminator(type.innerType());\n    }\n    else if (type instanceof ZodLiteral) {\n        return [type.value];\n    }\n    else if (type instanceof ZodEnum) {\n        return type.options;\n    }\n    else if (type instanceof ZodNativeEnum) {\n        // eslint-disable-next-line ban/ban\n        return _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectValues(type.enum);\n    }\n    else if (type instanceof ZodDefault) {\n        return getDiscriminator(type._def.innerType);\n    }\n    else if (type instanceof ZodUndefined) {\n        return [undefined];\n    }\n    else if (type instanceof ZodNull) {\n        return [null];\n    }\n    else if (type instanceof ZodOptional) {\n        return [undefined, ...getDiscriminator(type.unwrap())];\n    }\n    else if (type instanceof ZodNullable) {\n        return [null, ...getDiscriminator(type.unwrap())];\n    }\n    else if (type instanceof ZodBranded) {\n        return getDiscriminator(type.unwrap());\n    }\n    else if (type instanceof ZodReadonly) {\n        return getDiscriminator(type.unwrap());\n    }\n    else if (type instanceof ZodCatch) {\n        return getDiscriminator(type._def.innerType);\n    }\n    else {\n        return [];\n    }\n};\nclass ZodDiscriminatedUnion extends ZodType {\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.object) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.object,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        const discriminator = this.discriminator;\n        const discriminatorValue = ctx.data[discriminator];\n        const option = this.optionsMap.get(discriminatorValue);\n        if (!option) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_union_discriminator,\n                options: Array.from(this.optionsMap.keys()),\n                path: [discriminator],\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        if (ctx.common.async) {\n            return option._parseAsync({\n                data: ctx.data,\n                path: ctx.path,\n                parent: ctx,\n            });\n        }\n        else {\n            return option._parseSync({\n                data: ctx.data,\n                path: ctx.path,\n                parent: ctx,\n            });\n        }\n    }\n    get discriminator() {\n        return this._def.discriminator;\n    }\n    get options() {\n        return this._def.options;\n    }\n    get optionsMap() {\n        return this._def.optionsMap;\n    }\n    /**\n     * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n     * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n     * have a different value for each object in the union.\n     * @param discriminator the name of the discriminator property\n     * @param types an array of object schemas\n     * @param params\n     */\n    static create(discriminator, options, params) {\n        // Get all the valid discriminator values\n        const optionsMap = new Map();\n        // try {\n        for (const type of options) {\n            const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n            if (!discriminatorValues.length) {\n                throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n            }\n            for (const value of discriminatorValues) {\n                if (optionsMap.has(value)) {\n                    throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n                }\n                optionsMap.set(value, type);\n            }\n        }\n        return new ZodDiscriminatedUnion({\n            typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n            discriminator,\n            options,\n            optionsMap,\n            ...processCreateParams(params),\n        });\n    }\n}\nfunction mergeValues(a, b) {\n    const aType = (0,_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.getParsedType)(a);\n    const bType = (0,_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.getParsedType)(b);\n    if (a === b) {\n        return { valid: true, data: a };\n    }\n    else if (aType === _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.object && bType === _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.object) {\n        const bKeys = _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectKeys(b);\n        const sharedKeys = _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectKeys(a).filter((key) => bKeys.indexOf(key) !== -1);\n        const newObj = { ...a, ...b };\n        for (const key of sharedKeys) {\n            const sharedValue = mergeValues(a[key], b[key]);\n            if (!sharedValue.valid) {\n                return { valid: false };\n            }\n            newObj[key] = sharedValue.data;\n        }\n        return { valid: true, data: newObj };\n    }\n    else if (aType === _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.array && bType === _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.array) {\n        if (a.length !== b.length) {\n            return { valid: false };\n        }\n        const newArray = [];\n        for (let index = 0; index < a.length; index++) {\n            const itemA = a[index];\n            const itemB = b[index];\n            const sharedValue = mergeValues(itemA, itemB);\n            if (!sharedValue.valid) {\n                return { valid: false };\n            }\n            newArray.push(sharedValue.data);\n        }\n        return { valid: true, data: newArray };\n    }\n    else if (aType === _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.date && bType === _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.date && +a === +b) {\n        return { valid: true, data: a };\n    }\n    else {\n        return { valid: false };\n    }\n}\nclass ZodIntersection extends ZodType {\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        const handleParsed = (parsedLeft, parsedRight) => {\n            if ((0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isAborted)(parsedLeft) || (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isAborted)(parsedRight)) {\n                return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n            }\n            const merged = mergeValues(parsedLeft.value, parsedRight.value);\n            if (!merged.valid) {\n                (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                    code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_intersection_types,\n                });\n                return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n            }\n            if ((0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isDirty)(parsedLeft) || (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isDirty)(parsedRight)) {\n                status.dirty();\n            }\n            return { status: status.value, value: merged.data };\n        };\n        if (ctx.common.async) {\n            return Promise.all([\n                this._def.left._parseAsync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: ctx,\n                }),\n                this._def.right._parseAsync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: ctx,\n                }),\n            ]).then(([left, right]) => handleParsed(left, right));\n        }\n        else {\n            return handleParsed(this._def.left._parseSync({\n                data: ctx.data,\n                path: ctx.path,\n                parent: ctx,\n            }), this._def.right._parseSync({\n                data: ctx.data,\n                path: ctx.path,\n                parent: ctx,\n            }));\n        }\n    }\n}\nZodIntersection.create = (left, right, params) => {\n    return new ZodIntersection({\n        left: left,\n        right: right,\n        typeName: ZodFirstPartyTypeKind.ZodIntersection,\n        ...processCreateParams(params),\n    });\n};\n// type ZodTupleItems = [ZodTypeAny, ...ZodTypeAny[]];\nclass ZodTuple extends ZodType {\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.array) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.array,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        if (ctx.data.length < this._def.items.length) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_small,\n                minimum: this._def.items.length,\n                inclusive: true,\n                exact: false,\n                type: \"array\",\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        const rest = this._def.rest;\n        if (!rest && ctx.data.length > this._def.items.length) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_big,\n                maximum: this._def.items.length,\n                inclusive: true,\n                exact: false,\n                type: \"array\",\n            });\n            status.dirty();\n        }\n        const items = [...ctx.data]\n            .map((item, itemIndex) => {\n            const schema = this._def.items[itemIndex] || this._def.rest;\n            if (!schema)\n                return null;\n            return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n        })\n            .filter((x) => !!x); // filter nulls\n        if (ctx.common.async) {\n            return Promise.all(items).then((results) => {\n                return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus.mergeArray(status, results);\n            });\n        }\n        else {\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus.mergeArray(status, items);\n        }\n    }\n    get items() {\n        return this._def.items;\n    }\n    rest(rest) {\n        return new ZodTuple({\n            ...this._def,\n            rest,\n        });\n    }\n}\nZodTuple.create = (schemas, params) => {\n    if (!Array.isArray(schemas)) {\n        throw new Error(\"You must pass an array of schemas to z.tuple([ ... ])\");\n    }\n    return new ZodTuple({\n        items: schemas,\n        typeName: ZodFirstPartyTypeKind.ZodTuple,\n        rest: null,\n        ...processCreateParams(params),\n    });\n};\nclass ZodRecord extends ZodType {\n    get keySchema() {\n        return this._def.keyType;\n    }\n    get valueSchema() {\n        return this._def.valueType;\n    }\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.object) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.object,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        const pairs = [];\n        const keyType = this._def.keyType;\n        const valueType = this._def.valueType;\n        for (const key in ctx.data) {\n            pairs.push({\n                key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n                value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n                alwaysSet: key in ctx.data,\n            });\n        }\n        if (ctx.common.async) {\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus.mergeObjectAsync(status, pairs);\n        }\n        else {\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.ParseStatus.mergeObjectSync(status, pairs);\n        }\n    }\n    get element() {\n        return this._def.valueType;\n    }\n    static create(first, second, third) {\n        if (second instanceof ZodType) {\n            return new ZodRecord({\n                keyType: first,\n                valueType: second,\n                typeName: ZodFirstPartyTypeKind.ZodRecord,\n                ...processCreateParams(third),\n            });\n        }\n        return new ZodRecord({\n            keyType: ZodString.create(),\n            valueType: first,\n            typeName: ZodFirstPartyTypeKind.ZodRecord,\n            ...processCreateParams(second),\n        });\n    }\n}\nclass ZodMap extends ZodType {\n    get keySchema() {\n        return this._def.keyType;\n    }\n    get valueSchema() {\n        return this._def.valueType;\n    }\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.map) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.map,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        const keyType = this._def.keyType;\n        const valueType = this._def.valueType;\n        const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n            return {\n                key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, \"key\"])),\n                value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, \"value\"])),\n            };\n        });\n        if (ctx.common.async) {\n            const finalMap = new Map();\n            return Promise.resolve().then(async () => {\n                for (const pair of pairs) {\n                    const key = await pair.key;\n                    const value = await pair.value;\n                    if (key.status === \"aborted\" || value.status === \"aborted\") {\n                        return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                    }\n                    if (key.status === \"dirty\" || value.status === \"dirty\") {\n                        status.dirty();\n                    }\n                    finalMap.set(key.value, value.value);\n                }\n                return { status: status.value, value: finalMap };\n            });\n        }\n        else {\n            const finalMap = new Map();\n            for (const pair of pairs) {\n                const key = pair.key;\n                const value = pair.value;\n                if (key.status === \"aborted\" || value.status === \"aborted\") {\n                    return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                }\n                if (key.status === \"dirty\" || value.status === \"dirty\") {\n                    status.dirty();\n                }\n                finalMap.set(key.value, value.value);\n            }\n            return { status: status.value, value: finalMap };\n        }\n    }\n}\nZodMap.create = (keyType, valueType, params) => {\n    return new ZodMap({\n        valueType,\n        keyType,\n        typeName: ZodFirstPartyTypeKind.ZodMap,\n        ...processCreateParams(params),\n    });\n};\nclass ZodSet extends ZodType {\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.set) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.set,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        const def = this._def;\n        if (def.minSize !== null) {\n            if (ctx.data.size < def.minSize.value) {\n                (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                    code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_small,\n                    minimum: def.minSize.value,\n                    type: \"set\",\n                    inclusive: true,\n                    exact: false,\n                    message: def.minSize.message,\n                });\n                status.dirty();\n            }\n        }\n        if (def.maxSize !== null) {\n            if (ctx.data.size > def.maxSize.value) {\n                (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                    code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.too_big,\n                    maximum: def.maxSize.value,\n                    type: \"set\",\n                    inclusive: true,\n                    exact: false,\n                    message: def.maxSize.message,\n                });\n                status.dirty();\n            }\n        }\n        const valueType = this._def.valueType;\n        function finalizeSet(elements) {\n            const parsedSet = new Set();\n            for (const element of elements) {\n                if (element.status === \"aborted\")\n                    return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                if (element.status === \"dirty\")\n                    status.dirty();\n                parsedSet.add(element.value);\n            }\n            return { status: status.value, value: parsedSet };\n        }\n        const elements = [...ctx.data.values()].map((item, i) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i)));\n        if (ctx.common.async) {\n            return Promise.all(elements).then((elements) => finalizeSet(elements));\n        }\n        else {\n            return finalizeSet(elements);\n        }\n    }\n    min(minSize, message) {\n        return new ZodSet({\n            ...this._def,\n            minSize: { value: minSize, message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message) },\n        });\n    }\n    max(maxSize, message) {\n        return new ZodSet({\n            ...this._def,\n            maxSize: { value: maxSize, message: _helpers_errorUtil_js__WEBPACK_IMPORTED_MODULE_3__.errorUtil.toString(message) },\n        });\n    }\n    size(size, message) {\n        return this.min(size, message).max(size, message);\n    }\n    nonempty(message) {\n        return this.min(1, message);\n    }\n}\nZodSet.create = (valueType, params) => {\n    return new ZodSet({\n        valueType,\n        minSize: null,\n        maxSize: null,\n        typeName: ZodFirstPartyTypeKind.ZodSet,\n        ...processCreateParams(params),\n    });\n};\nclass ZodFunction extends ZodType {\n    constructor() {\n        super(...arguments);\n        this.validate = this.implement;\n    }\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.function) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.function,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        function makeArgsIssue(args, error) {\n            return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.makeIssue)({\n                data: args,\n                path: ctx.path,\n                errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, (0,_errors_js__WEBPACK_IMPORTED_MODULE_4__.getErrorMap)(), _errors_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]].filter((x) => !!x),\n                issueData: {\n                    code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_arguments,\n                    argumentsError: error,\n                },\n            });\n        }\n        function makeReturnsIssue(returns, error) {\n            return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.makeIssue)({\n                data: returns,\n                path: ctx.path,\n                errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, (0,_errors_js__WEBPACK_IMPORTED_MODULE_4__.getErrorMap)(), _errors_js__WEBPACK_IMPORTED_MODULE_5__[\"default\"]].filter((x) => !!x),\n                issueData: {\n                    code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_return_type,\n                    returnTypeError: error,\n                },\n            });\n        }\n        const params = { errorMap: ctx.common.contextualErrorMap };\n        const fn = ctx.data;\n        if (this._def.returns instanceof ZodPromise) {\n            // Would love a way to avoid disabling this rule, but we need\n            // an alias (using an arrow function was what caused 2651).\n            // eslint-disable-next-line @typescript-eslint/no-this-alias\n            const me = this;\n            return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(async function (...args) {\n                const error = new _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodError([]);\n                const parsedArgs = await me._def.args.parseAsync(args, params).catch((e) => {\n                    error.addIssue(makeArgsIssue(args, e));\n                    throw error;\n                });\n                const result = await Reflect.apply(fn, this, parsedArgs);\n                const parsedReturns = await me._def.returns._def.type\n                    .parseAsync(result, params)\n                    .catch((e) => {\n                    error.addIssue(makeReturnsIssue(result, e));\n                    throw error;\n                });\n                return parsedReturns;\n            });\n        }\n        else {\n            // Would love a way to avoid disabling this rule, but we need\n            // an alias (using an arrow function was what caused 2651).\n            // eslint-disable-next-line @typescript-eslint/no-this-alias\n            const me = this;\n            return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(function (...args) {\n                const parsedArgs = me._def.args.safeParse(args, params);\n                if (!parsedArgs.success) {\n                    throw new _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodError([makeArgsIssue(args, parsedArgs.error)]);\n                }\n                const result = Reflect.apply(fn, this, parsedArgs.data);\n                const parsedReturns = me._def.returns.safeParse(result, params);\n                if (!parsedReturns.success) {\n                    throw new _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n                }\n                return parsedReturns.data;\n            });\n        }\n    }\n    parameters() {\n        return this._def.args;\n    }\n    returnType() {\n        return this._def.returns;\n    }\n    args(...items) {\n        return new ZodFunction({\n            ...this._def,\n            args: ZodTuple.create(items).rest(ZodUnknown.create()),\n        });\n    }\n    returns(returnType) {\n        return new ZodFunction({\n            ...this._def,\n            returns: returnType,\n        });\n    }\n    implement(func) {\n        const validatedFunc = this.parse(func);\n        return validatedFunc;\n    }\n    strictImplement(func) {\n        const validatedFunc = this.parse(func);\n        return validatedFunc;\n    }\n    static create(args, returns, params) {\n        return new ZodFunction({\n            args: (args ? args : ZodTuple.create([]).rest(ZodUnknown.create())),\n            returns: returns || ZodUnknown.create(),\n            typeName: ZodFirstPartyTypeKind.ZodFunction,\n            ...processCreateParams(params),\n        });\n    }\n}\nclass ZodLazy extends ZodType {\n    get schema() {\n        return this._def.getter();\n    }\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        const lazySchema = this._def.getter();\n        return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n    }\n}\nZodLazy.create = (getter, params) => {\n    return new ZodLazy({\n        getter: getter,\n        typeName: ZodFirstPartyTypeKind.ZodLazy,\n        ...processCreateParams(params),\n    });\n};\nclass ZodLiteral extends ZodType {\n    _parse(input) {\n        if (input.data !== this._def.value) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                received: ctx.data,\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_literal,\n                expected: this._def.value,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        return { status: \"valid\", value: input.data };\n    }\n    get value() {\n        return this._def.value;\n    }\n}\nZodLiteral.create = (value, params) => {\n    return new ZodLiteral({\n        value: value,\n        typeName: ZodFirstPartyTypeKind.ZodLiteral,\n        ...processCreateParams(params),\n    });\n};\nfunction createZodEnum(values, params) {\n    return new ZodEnum({\n        values,\n        typeName: ZodFirstPartyTypeKind.ZodEnum,\n        ...processCreateParams(params),\n    });\n}\nclass ZodEnum extends ZodType {\n    _parse(input) {\n        if (typeof input.data !== \"string\") {\n            const ctx = this._getOrReturnCtx(input);\n            const expectedValues = this._def.values;\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.joinValues(expectedValues),\n                received: ctx.parsedType,\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        if (!this._cache) {\n            this._cache = new Set(this._def.values);\n        }\n        if (!this._cache.has(input.data)) {\n            const ctx = this._getOrReturnCtx(input);\n            const expectedValues = this._def.values;\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                received: ctx.data,\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_enum_value,\n                options: expectedValues,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(input.data);\n    }\n    get options() {\n        return this._def.values;\n    }\n    get enum() {\n        const enumValues = {};\n        for (const val of this._def.values) {\n            enumValues[val] = val;\n        }\n        return enumValues;\n    }\n    get Values() {\n        const enumValues = {};\n        for (const val of this._def.values) {\n            enumValues[val] = val;\n        }\n        return enumValues;\n    }\n    get Enum() {\n        const enumValues = {};\n        for (const val of this._def.values) {\n            enumValues[val] = val;\n        }\n        return enumValues;\n    }\n    extract(values, newDef = this._def) {\n        return ZodEnum.create(values, {\n            ...this._def,\n            ...newDef,\n        });\n    }\n    exclude(values, newDef = this._def) {\n        return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n            ...this._def,\n            ...newDef,\n        });\n    }\n}\nZodEnum.create = createZodEnum;\nclass ZodNativeEnum extends ZodType {\n    _parse(input) {\n        const nativeEnumValues = _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.getValidEnumValues(this._def.values);\n        const ctx = this._getOrReturnCtx(input);\n        if (ctx.parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.string && ctx.parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.number) {\n            const expectedValues = _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectValues(nativeEnumValues);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.joinValues(expectedValues),\n                received: ctx.parsedType,\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        if (!this._cache) {\n            this._cache = new Set(_helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.getValidEnumValues(this._def.values));\n        }\n        if (!this._cache.has(input.data)) {\n            const expectedValues = _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.objectValues(nativeEnumValues);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                received: ctx.data,\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_enum_value,\n                options: expectedValues,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(input.data);\n    }\n    get enum() {\n        return this._def.values;\n    }\n}\nZodNativeEnum.create = (values, params) => {\n    return new ZodNativeEnum({\n        values: values,\n        typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n        ...processCreateParams(params),\n    });\n};\nclass ZodPromise extends ZodType {\n    unwrap() {\n        return this._def.type;\n    }\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        if (ctx.parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.promise && ctx.common.async === false) {\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.promise,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        const promisified = ctx.parsedType === _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(promisified.then((data) => {\n            return this._def.type.parseAsync(data, {\n                path: ctx.path,\n                errorMap: ctx.common.contextualErrorMap,\n            });\n        }));\n    }\n}\nZodPromise.create = (schema, params) => {\n    return new ZodPromise({\n        type: schema,\n        typeName: ZodFirstPartyTypeKind.ZodPromise,\n        ...processCreateParams(params),\n    });\n};\nclass ZodEffects extends ZodType {\n    innerType() {\n        return this._def.schema;\n    }\n    sourceType() {\n        return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects\n            ? this._def.schema.sourceType()\n            : this._def.schema;\n    }\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        const effect = this._def.effect || null;\n        const checkCtx = {\n            addIssue: (arg) => {\n                (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, arg);\n                if (arg.fatal) {\n                    status.abort();\n                }\n                else {\n                    status.dirty();\n                }\n            },\n            get path() {\n                return ctx.path;\n            },\n        };\n        checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n        if (effect.type === \"preprocess\") {\n            const processed = effect.transform(ctx.data, checkCtx);\n            if (ctx.common.async) {\n                return Promise.resolve(processed).then(async (processed) => {\n                    if (status.value === \"aborted\")\n                        return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                    const result = await this._def.schema._parseAsync({\n                        data: processed,\n                        path: ctx.path,\n                        parent: ctx,\n                    });\n                    if (result.status === \"aborted\")\n                        return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                    if (result.status === \"dirty\")\n                        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.DIRTY)(result.value);\n                    if (status.value === \"dirty\")\n                        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.DIRTY)(result.value);\n                    return result;\n                });\n            }\n            else {\n                if (status.value === \"aborted\")\n                    return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                const result = this._def.schema._parseSync({\n                    data: processed,\n                    path: ctx.path,\n                    parent: ctx,\n                });\n                if (result.status === \"aborted\")\n                    return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                if (result.status === \"dirty\")\n                    return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.DIRTY)(result.value);\n                if (status.value === \"dirty\")\n                    return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.DIRTY)(result.value);\n                return result;\n            }\n        }\n        if (effect.type === \"refinement\") {\n            const executeRefinement = (acc) => {\n                const result = effect.refinement(acc, checkCtx);\n                if (ctx.common.async) {\n                    return Promise.resolve(result);\n                }\n                if (result instanceof Promise) {\n                    throw new Error(\"Async refinement encountered during synchronous parse operation. Use .parseAsync instead.\");\n                }\n                return acc;\n            };\n            if (ctx.common.async === false) {\n                const inner = this._def.schema._parseSync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: ctx,\n                });\n                if (inner.status === \"aborted\")\n                    return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                if (inner.status === \"dirty\")\n                    status.dirty();\n                // return value is ignored\n                executeRefinement(inner.value);\n                return { status: status.value, value: inner.value };\n            }\n            else {\n                return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n                    if (inner.status === \"aborted\")\n                        return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                    if (inner.status === \"dirty\")\n                        status.dirty();\n                    return executeRefinement(inner.value).then(() => {\n                        return { status: status.value, value: inner.value };\n                    });\n                });\n            }\n        }\n        if (effect.type === \"transform\") {\n            if (ctx.common.async === false) {\n                const base = this._def.schema._parseSync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: ctx,\n                });\n                if (!(0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isValid)(base))\n                    return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                const result = effect.transform(base.value, checkCtx);\n                if (result instanceof Promise) {\n                    throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n                }\n                return { status: status.value, value: result };\n            }\n            else {\n                return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n                    if (!(0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isValid)(base))\n                        return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                    return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n                        status: status.value,\n                        value: result,\n                    }));\n                });\n            }\n        }\n        _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.util.assertNever(effect);\n    }\n}\nZodEffects.create = (schema, effect, params) => {\n    return new ZodEffects({\n        schema,\n        typeName: ZodFirstPartyTypeKind.ZodEffects,\n        effect,\n        ...processCreateParams(params),\n    });\n};\nZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n    return new ZodEffects({\n        schema,\n        effect: { type: \"preprocess\", transform: preprocess },\n        typeName: ZodFirstPartyTypeKind.ZodEffects,\n        ...processCreateParams(params),\n    });\n};\n\nclass ZodOptional extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType === _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.undefined) {\n            return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(undefined);\n        }\n        return this._def.innerType._parse(input);\n    }\n    unwrap() {\n        return this._def.innerType;\n    }\n}\nZodOptional.create = (type, params) => {\n    return new ZodOptional({\n        innerType: type,\n        typeName: ZodFirstPartyTypeKind.ZodOptional,\n        ...processCreateParams(params),\n    });\n};\nclass ZodNullable extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType === _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.null) {\n            return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.OK)(null);\n        }\n        return this._def.innerType._parse(input);\n    }\n    unwrap() {\n        return this._def.innerType;\n    }\n}\nZodNullable.create = (type, params) => {\n    return new ZodNullable({\n        innerType: type,\n        typeName: ZodFirstPartyTypeKind.ZodNullable,\n        ...processCreateParams(params),\n    });\n};\nclass ZodDefault extends ZodType {\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        let data = ctx.data;\n        if (ctx.parsedType === _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.undefined) {\n            data = this._def.defaultValue();\n        }\n        return this._def.innerType._parse({\n            data,\n            path: ctx.path,\n            parent: ctx,\n        });\n    }\n    removeDefault() {\n        return this._def.innerType;\n    }\n}\nZodDefault.create = (type, params) => {\n    return new ZodDefault({\n        innerType: type,\n        typeName: ZodFirstPartyTypeKind.ZodDefault,\n        defaultValue: typeof params.default === \"function\" ? params.default : () => params.default,\n        ...processCreateParams(params),\n    });\n};\nclass ZodCatch extends ZodType {\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        // newCtx is used to not collect issues from inner types in ctx\n        const newCtx = {\n            ...ctx,\n            common: {\n                ...ctx.common,\n                issues: [],\n            },\n        };\n        const result = this._def.innerType._parse({\n            data: newCtx.data,\n            path: newCtx.path,\n            parent: {\n                ...newCtx,\n            },\n        });\n        if ((0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isAsync)(result)) {\n            return result.then((result) => {\n                return {\n                    status: \"valid\",\n                    value: result.status === \"valid\"\n                        ? result.value\n                        : this._def.catchValue({\n                            get error() {\n                                return new _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodError(newCtx.common.issues);\n                            },\n                            input: newCtx.data,\n                        }),\n                };\n            });\n        }\n        else {\n            return {\n                status: \"valid\",\n                value: result.status === \"valid\"\n                    ? result.value\n                    : this._def.catchValue({\n                        get error() {\n                            return new _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodError(newCtx.common.issues);\n                        },\n                        input: newCtx.data,\n                    }),\n            };\n        }\n    }\n    removeCatch() {\n        return this._def.innerType;\n    }\n}\nZodCatch.create = (type, params) => {\n    return new ZodCatch({\n        innerType: type,\n        typeName: ZodFirstPartyTypeKind.ZodCatch,\n        catchValue: typeof params.catch === \"function\" ? params.catch : () => params.catch,\n        ...processCreateParams(params),\n    });\n};\nclass ZodNaN extends ZodType {\n    _parse(input) {\n        const parsedType = this._getType(input);\n        if (parsedType !== _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.nan) {\n            const ctx = this._getOrReturnCtx(input);\n            (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.addIssueToContext)(ctx, {\n                code: _ZodError_js__WEBPACK_IMPORTED_MODULE_1__.ZodIssueCode.invalid_type,\n                expected: _helpers_util_js__WEBPACK_IMPORTED_MODULE_2__.ZodParsedType.nan,\n                received: ctx.parsedType,\n            });\n            return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n        }\n        return { status: \"valid\", value: input.data };\n    }\n}\nZodNaN.create = (params) => {\n    return new ZodNaN({\n        typeName: ZodFirstPartyTypeKind.ZodNaN,\n        ...processCreateParams(params),\n    });\n};\nconst BRAND = Symbol(\"zod_brand\");\nclass ZodBranded extends ZodType {\n    _parse(input) {\n        const { ctx } = this._processInputParams(input);\n        const data = ctx.data;\n        return this._def.type._parse({\n            data,\n            path: ctx.path,\n            parent: ctx,\n        });\n    }\n    unwrap() {\n        return this._def.type;\n    }\n}\nclass ZodPipeline extends ZodType {\n    _parse(input) {\n        const { status, ctx } = this._processInputParams(input);\n        if (ctx.common.async) {\n            const handleAsync = async () => {\n                const inResult = await this._def.in._parseAsync({\n                    data: ctx.data,\n                    path: ctx.path,\n                    parent: ctx,\n                });\n                if (inResult.status === \"aborted\")\n                    return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n                if (inResult.status === \"dirty\") {\n                    status.dirty();\n                    return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.DIRTY)(inResult.value);\n                }\n                else {\n                    return this._def.out._parseAsync({\n                        data: inResult.value,\n                        path: ctx.path,\n                        parent: ctx,\n                    });\n                }\n            };\n            return handleAsync();\n        }\n        else {\n            const inResult = this._def.in._parseSync({\n                data: ctx.data,\n                path: ctx.path,\n                parent: ctx,\n            });\n            if (inResult.status === \"aborted\")\n                return _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n            if (inResult.status === \"dirty\") {\n                status.dirty();\n                return {\n                    status: \"dirty\",\n                    value: inResult.value,\n                };\n            }\n            else {\n                return this._def.out._parseSync({\n                    data: inResult.value,\n                    path: ctx.path,\n                    parent: ctx,\n                });\n            }\n        }\n    }\n    static create(a, b) {\n        return new ZodPipeline({\n            in: a,\n            out: b,\n            typeName: ZodFirstPartyTypeKind.ZodPipeline,\n        });\n    }\n}\nclass ZodReadonly extends ZodType {\n    _parse(input) {\n        const result = this._def.innerType._parse(input);\n        const freeze = (data) => {\n            if ((0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isValid)(data)) {\n                data.value = Object.freeze(data.value);\n            }\n            return data;\n        };\n        return (0,_helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.isAsync)(result) ? result.then((data) => freeze(data)) : freeze(result);\n    }\n    unwrap() {\n        return this._def.innerType;\n    }\n}\nZodReadonly.create = (type, params) => {\n    return new ZodReadonly({\n        innerType: type,\n        typeName: ZodFirstPartyTypeKind.ZodReadonly,\n        ...processCreateParams(params),\n    });\n};\n////////////////////////////////////////\n////////////////////////////////////////\n//////////                    //////////\n//////////      z.custom      //////////\n//////////                    //////////\n////////////////////////////////////////\n////////////////////////////////////////\nfunction cleanParams(params, data) {\n    const p = typeof params === \"function\" ? params(data) : typeof params === \"string\" ? { message: params } : params;\n    const p2 = typeof p === \"string\" ? { message: p } : p;\n    return p2;\n}\nfunction custom(check, _params = {}, \n/**\n * @deprecated\n *\n * Pass `fatal` into the params object instead:\n *\n * ```ts\n * z.string().custom((val) => val.length > 5, { fatal: false })\n * ```\n *\n */\nfatal) {\n    if (check)\n        return ZodAny.create().superRefine((data, ctx) => {\n            const r = check(data);\n            if (r instanceof Promise) {\n                return r.then((r) => {\n                    if (!r) {\n                        const params = cleanParams(_params, data);\n                        const _fatal = params.fatal ?? fatal ?? true;\n                        ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n                    }\n                });\n            }\n            if (!r) {\n                const params = cleanParams(_params, data);\n                const _fatal = params.fatal ?? fatal ?? true;\n                ctx.addIssue({ code: \"custom\", ...params, fatal: _fatal });\n            }\n            return;\n        });\n    return ZodAny.create();\n}\n\nconst late = {\n    object: ZodObject.lazycreate,\n};\nvar ZodFirstPartyTypeKind;\n(function (ZodFirstPartyTypeKind) {\n    ZodFirstPartyTypeKind[\"ZodString\"] = \"ZodString\";\n    ZodFirstPartyTypeKind[\"ZodNumber\"] = \"ZodNumber\";\n    ZodFirstPartyTypeKind[\"ZodNaN\"] = \"ZodNaN\";\n    ZodFirstPartyTypeKind[\"ZodBigInt\"] = \"ZodBigInt\";\n    ZodFirstPartyTypeKind[\"ZodBoolean\"] = \"ZodBoolean\";\n    ZodFirstPartyTypeKind[\"ZodDate\"] = \"ZodDate\";\n    ZodFirstPartyTypeKind[\"ZodSymbol\"] = \"ZodSymbol\";\n    ZodFirstPartyTypeKind[\"ZodUndefined\"] = \"ZodUndefined\";\n    ZodFirstPartyTypeKind[\"ZodNull\"] = \"ZodNull\";\n    ZodFirstPartyTypeKind[\"ZodAny\"] = \"ZodAny\";\n    ZodFirstPartyTypeKind[\"ZodUnknown\"] = \"ZodUnknown\";\n    ZodFirstPartyTypeKind[\"ZodNever\"] = \"ZodNever\";\n    ZodFirstPartyTypeKind[\"ZodVoid\"] = \"ZodVoid\";\n    ZodFirstPartyTypeKind[\"ZodArray\"] = \"ZodArray\";\n    ZodFirstPartyTypeKind[\"ZodObject\"] = \"ZodObject\";\n    ZodFirstPartyTypeKind[\"ZodUnion\"] = \"ZodUnion\";\n    ZodFirstPartyTypeKind[\"ZodDiscriminatedUnion\"] = \"ZodDiscriminatedUnion\";\n    ZodFirstPartyTypeKind[\"ZodIntersection\"] = \"ZodIntersection\";\n    ZodFirstPartyTypeKind[\"ZodTuple\"] = \"ZodTuple\";\n    ZodFirstPartyTypeKind[\"ZodRecord\"] = \"ZodRecord\";\n    ZodFirstPartyTypeKind[\"ZodMap\"] = \"ZodMap\";\n    ZodFirstPartyTypeKind[\"ZodSet\"] = \"ZodSet\";\n    ZodFirstPartyTypeKind[\"ZodFunction\"] = \"ZodFunction\";\n    ZodFirstPartyTypeKind[\"ZodLazy\"] = \"ZodLazy\";\n    ZodFirstPartyTypeKind[\"ZodLiteral\"] = \"ZodLiteral\";\n    ZodFirstPartyTypeKind[\"ZodEnum\"] = \"ZodEnum\";\n    ZodFirstPartyTypeKind[\"ZodEffects\"] = \"ZodEffects\";\n    ZodFirstPartyTypeKind[\"ZodNativeEnum\"] = \"ZodNativeEnum\";\n    ZodFirstPartyTypeKind[\"ZodOptional\"] = \"ZodOptional\";\n    ZodFirstPartyTypeKind[\"ZodNullable\"] = \"ZodNullable\";\n    ZodFirstPartyTypeKind[\"ZodDefault\"] = \"ZodDefault\";\n    ZodFirstPartyTypeKind[\"ZodCatch\"] = \"ZodCatch\";\n    ZodFirstPartyTypeKind[\"ZodPromise\"] = \"ZodPromise\";\n    ZodFirstPartyTypeKind[\"ZodBranded\"] = \"ZodBranded\";\n    ZodFirstPartyTypeKind[\"ZodPipeline\"] = \"ZodPipeline\";\n    ZodFirstPartyTypeKind[\"ZodReadonly\"] = \"ZodReadonly\";\n})(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n// requires TS 4.4+\nclass Class {\n    constructor(..._) { }\n}\nconst instanceOfType = (\n// const instanceOfType = <T extends new (...args: any[]) => any>(\ncls, params = {\n    message: `Input not instance of ${cls.name}`,\n}) => custom((data) => data instanceof cls, params);\nconst stringType = ZodString.create;\nconst numberType = ZodNumber.create;\nconst nanType = ZodNaN.create;\nconst bigIntType = ZodBigInt.create;\nconst booleanType = ZodBoolean.create;\nconst dateType = ZodDate.create;\nconst symbolType = ZodSymbol.create;\nconst undefinedType = ZodUndefined.create;\nconst nullType = ZodNull.create;\nconst anyType = ZodAny.create;\nconst unknownType = ZodUnknown.create;\nconst neverType = ZodNever.create;\nconst voidType = ZodVoid.create;\nconst arrayType = ZodArray.create;\nconst objectType = ZodObject.create;\nconst strictObjectType = ZodObject.strictCreate;\nconst unionType = ZodUnion.create;\nconst discriminatedUnionType = ZodDiscriminatedUnion.create;\nconst intersectionType = ZodIntersection.create;\nconst tupleType = ZodTuple.create;\nconst recordType = ZodRecord.create;\nconst mapType = ZodMap.create;\nconst setType = ZodSet.create;\nconst functionType = ZodFunction.create;\nconst lazyType = ZodLazy.create;\nconst literalType = ZodLiteral.create;\nconst enumType = ZodEnum.create;\nconst nativeEnumType = ZodNativeEnum.create;\nconst promiseType = ZodPromise.create;\nconst effectsType = ZodEffects.create;\nconst optionalType = ZodOptional.create;\nconst nullableType = ZodNullable.create;\nconst preprocessType = ZodEffects.createWithPreprocess;\nconst pipelineType = ZodPipeline.create;\nconst ostring = () => stringType().optional();\nconst onumber = () => numberType().optional();\nconst oboolean = () => booleanType().optional();\nconst coerce = {\n    string: ((arg) => ZodString.create({ ...arg, coerce: true })),\n    number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),\n    boolean: ((arg) => ZodBoolean.create({\n        ...arg,\n        coerce: true,\n    })),\n    bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),\n    date: ((arg) => ZodDate.create({ ...arg, coerce: true })),\n};\n\nconst NEVER = _helpers_parseUtil_js__WEBPACK_IMPORTED_MODULE_0__.INVALID;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy96b2QvdjMvdHlwZXMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBd0Q7QUFDRztBQUNSO0FBQzJGO0FBQ3ZFO0FBQ3ZFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsOERBQU87QUFDZixpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxrQ0FBa0Msa0RBQVE7QUFDMUM7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZLDREQUE0RDtBQUN4RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQjtBQUNqQjtBQUNBLGdCQUFnQixVQUFVO0FBQzFCO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixpQkFBaUI7QUFDakI7QUFDQSxhQUFhO0FBQ2I7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZUFBZSwrREFBYTtBQUM1QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLCtEQUFhO0FBQ3JDO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQSx3QkFBd0IsOERBQVc7QUFDbkM7QUFDQTtBQUNBO0FBQ0EsNEJBQTRCLCtEQUFhO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVksOERBQU87QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUFDUDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsc0RBQXNEO0FBQ3ZEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0NBQXNDLFNBQVM7QUFDL0MsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUCx5Q0FBeUMsc0JBQXNCO0FBQy9ELHlDQUF5QyxzQkFBc0I7QUFDL0Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMLHlDQUF5QyxzQkFBc0I7QUFDL0QscUNBQXFDLHNCQUFzQjtBQUMzRDtBQUN3M0I7QUFDajNCLGNBQWMsMERBQU8iLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvem9kL3YzL3R5cGVzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFpvZEVycm9yLCBab2RJc3N1ZUNvZGUsIH0gZnJvbSBcIi4vWm9kRXJyb3IuanNcIjtcbmltcG9ydCB7IGRlZmF1bHRFcnJvck1hcCwgZ2V0RXJyb3JNYXAgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmltcG9ydCB7IGVycm9yVXRpbCB9IGZyb20gXCIuL2hlbHBlcnMvZXJyb3JVdGlsLmpzXCI7XG5pbXBvcnQgeyBESVJUWSwgSU5WQUxJRCwgT0ssIFBhcnNlU3RhdHVzLCBhZGRJc3N1ZVRvQ29udGV4dCwgaXNBYm9ydGVkLCBpc0FzeW5jLCBpc0RpcnR5LCBpc1ZhbGlkLCBtYWtlSXNzdWUsIH0gZnJvbSBcIi4vaGVscGVycy9wYXJzZVV0aWwuanNcIjtcbmltcG9ydCB7IHV0aWwsIFpvZFBhcnNlZFR5cGUsIGdldFBhcnNlZFR5cGUgfSBmcm9tIFwiLi9oZWxwZXJzL3V0aWwuanNcIjtcbmNsYXNzIFBhcnNlSW5wdXRMYXp5UGF0aCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50LCB2YWx1ZSwgcGF0aCwga2V5KSB7XG4gICAgICAgIHRoaXMuX2NhY2hlZFBhdGggPSBbXTtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMuZGF0YSA9IHZhbHVlO1xuICAgICAgICB0aGlzLl9wYXRoID0gcGF0aDtcbiAgICAgICAgdGhpcy5fa2V5ID0ga2V5O1xuICAgIH1cbiAgICBnZXQgcGF0aCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZWRQYXRoLmxlbmd0aCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5fa2V5KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFBhdGgucHVzaCguLi50aGlzLl9wYXRoLCAuLi50aGlzLl9rZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkUGF0aC5wdXNoKC4uLnRoaXMuX3BhdGgsIHRoaXMuX2tleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFBhdGg7XG4gICAgfVxufVxuY29uc3QgaGFuZGxlUmVzdWx0ID0gKGN0eCwgcmVzdWx0KSA9PiB7XG4gICAgaWYgKGlzVmFsaWQocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBkYXRhOiByZXN1bHQudmFsdWUgfTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmICghY3R4LmNvbW1vbi5pc3N1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJWYWxpZGF0aW9uIGZhaWxlZCBidXQgbm8gaXNzdWVzIGRldGVjdGVkLlwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Vycm9yKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXJyb3I7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoY3R4LmNvbW1vbi5pc3N1ZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9yID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Vycm9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9XG59O1xuZnVuY3Rpb24gcHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcylcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgIGNvbnN0IHsgZXJyb3JNYXAsIGludmFsaWRfdHlwZV9lcnJvciwgcmVxdWlyZWRfZXJyb3IsIGRlc2NyaXB0aW9uIH0gPSBwYXJhbXM7XG4gICAgaWYgKGVycm9yTWFwICYmIChpbnZhbGlkX3R5cGVfZXJyb3IgfHwgcmVxdWlyZWRfZXJyb3IpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgdXNlIFwiaW52YWxpZF90eXBlX2Vycm9yXCIgb3IgXCJyZXF1aXJlZF9lcnJvclwiIGluIGNvbmp1bmN0aW9uIHdpdGggY3VzdG9tIGVycm9yIG1hcC5gKTtcbiAgICB9XG4gICAgaWYgKGVycm9yTWFwKVxuICAgICAgICByZXR1cm4geyBlcnJvck1hcDogZXJyb3JNYXAsIGRlc2NyaXB0aW9uIH07XG4gICAgY29uc3QgY3VzdG9tTWFwID0gKGlzcywgY3R4KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSB9ID0gcGFyYW1zO1xuICAgICAgICBpZiAoaXNzLmNvZGUgPT09IFwiaW52YWxpZF9lbnVtX3ZhbHVlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IG1lc3NhZ2UgPz8gY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgY3R4LmRhdGEgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IG1lc3NhZ2UgPz8gcmVxdWlyZWRfZXJyb3IgPz8gY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc3MuY29kZSAhPT0gXCJpbnZhbGlkX3R5cGVcIilcbiAgICAgICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IGN0eC5kZWZhdWx0RXJyb3IgfTtcbiAgICAgICAgcmV0dXJuIHsgbWVzc2FnZTogbWVzc2FnZSA/PyBpbnZhbGlkX3R5cGVfZXJyb3IgPz8gY3R4LmRlZmF1bHRFcnJvciB9O1xuICAgIH07XG4gICAgcmV0dXJuIHsgZXJyb3JNYXA6IGN1c3RvbU1hcCwgZGVzY3JpcHRpb24gfTtcbn1cbmV4cG9ydCBjbGFzcyBab2RUeXBlIHtcbiAgICBnZXQgZGVzY3JpcHRpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZGVzY3JpcHRpb247XG4gICAgfVxuICAgIF9nZXRUeXBlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRQYXJzZWRUeXBlKGlucHV0LmRhdGEpO1xuICAgIH1cbiAgICBfZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCkge1xuICAgICAgICByZXR1cm4gKGN0eCB8fCB7XG4gICAgICAgICAgICBjb21tb246IGlucHV0LnBhcmVudC5jb21tb24sXG4gICAgICAgICAgICBkYXRhOiBpbnB1dC5kYXRhLFxuICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShpbnB1dC5kYXRhKSxcbiAgICAgICAgICAgIHNjaGVtYUVycm9yTWFwOiB0aGlzLl9kZWYuZXJyb3JNYXAsXG4gICAgICAgICAgICBwYXRoOiBpbnB1dC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBpbnB1dC5wYXJlbnQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6IG5ldyBQYXJzZVN0YXR1cygpLFxuICAgICAgICAgICAgY3R4OiB7XG4gICAgICAgICAgICAgICAgY29tbW9uOiBpbnB1dC5wYXJlbnQuY29tbW9uLFxuICAgICAgICAgICAgICAgIGRhdGE6IGlucHV0LmRhdGEsXG4gICAgICAgICAgICAgICAgcGFyc2VkVHlwZTogZ2V0UGFyc2VkVHlwZShpbnB1dC5kYXRhKSxcbiAgICAgICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgICAgIHBhdGg6IGlucHV0LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBpbnB1dC5wYXJlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbiAgICBfcGFyc2VTeW5jKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKGlzQXN5bmMocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luY2hyb25vdXMgcGFyc2UgZW5jb3VudGVyZWQgcHJvbWlzZS5cIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgX3BhcnNlQXN5bmMoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5fcGFyc2UoaW5wdXQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgfVxuICAgIHBhcnNlKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNhZmVQYXJzZShkYXRhLCBwYXJhbXMpO1xuICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LmRhdGE7XG4gICAgICAgIHRocm93IHJlc3VsdC5lcnJvcjtcbiAgICB9XG4gICAgc2FmZVBhcnNlKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgIGFzeW5jOiBwYXJhbXM/LmFzeW5jID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIGNvbnRleHR1YWxFcnJvck1hcDogcGFyYW1zPy5lcnJvck1hcCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoOiBwYXJhbXM/LnBhdGggfHwgW10sXG4gICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoZGF0YSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX3BhcnNlU3luYyh7IGRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3VsdChjdHgsIHJlc3VsdCk7XG4gICAgfVxuICAgIFwifnZhbGlkYXRlXCIoZGF0YSkge1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgIGFzeW5jOiAhIXRoaXNbXCJ+c3RhbmRhcmRcIl0uYXN5bmMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcGF0aDogW10sXG4gICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoZGF0YSksXG4gICAgICAgIH07XG4gICAgICAgIGlmICghdGhpc1tcIn5zdGFuZGFyZFwiXS5hc3luYykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9wYXJzZVN5bmMoeyBkYXRhLCBwYXRoOiBbXSwgcGFyZW50OiBjdHggfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlzVmFsaWQocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IGN0eC5jb21tb24uaXNzdWVzLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChlcnI/Lm1lc3NhZ2U/LnRvTG93ZXJDYXNlKCk/LmluY2x1ZGVzKFwiZW5jb3VudGVyZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tcIn5zdGFuZGFyZFwiXS5hc3luYyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN0eC5jb21tb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgICAgIGFzeW5jOiB0cnVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlQXN5bmMoeyBkYXRhLCBwYXRoOiBbXSwgcGFyZW50OiBjdHggfSkudGhlbigocmVzdWx0KSA9PiBpc1ZhbGlkKHJlc3VsdClcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IGN0eC5jb21tb24uaXNzdWVzLFxuICAgICAgICAgICAgfSk7XG4gICAgfVxuICAgIGFzeW5jIHBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuc2FmZVBhcnNlQXN5bmMoZGF0YSwgcGFyYW1zKTtcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5kYXRhO1xuICAgICAgICB0aHJvdyByZXN1bHQuZXJyb3I7XG4gICAgfVxuICAgIGFzeW5jIHNhZmVQYXJzZUFzeW5jKGRhdGEsIHBhcmFtcykge1xuICAgICAgICBjb25zdCBjdHggPSB7XG4gICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgIGNvbnRleHR1YWxFcnJvck1hcDogcGFyYW1zPy5lcnJvck1hcCxcbiAgICAgICAgICAgICAgICBhc3luYzogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwYXRoOiBwYXJhbXM/LnBhdGggfHwgW10sXG4gICAgICAgICAgICBzY2hlbWFFcnJvck1hcDogdGhpcy5fZGVmLmVycm9yTWFwLFxuICAgICAgICAgICAgcGFyZW50OiBudWxsLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhcnNlZFR5cGU6IGdldFBhcnNlZFR5cGUoZGF0YSksXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IG1heWJlQXN5bmNSZXN1bHQgPSB0aGlzLl9wYXJzZSh7IGRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgKGlzQXN5bmMobWF5YmVBc3luY1Jlc3VsdCkgPyBtYXliZUFzeW5jUmVzdWx0IDogUHJvbWlzZS5yZXNvbHZlKG1heWJlQXN5bmNSZXN1bHQpKTtcbiAgICAgICAgcmV0dXJuIGhhbmRsZVJlc3VsdChjdHgsIHJlc3VsdCk7XG4gICAgfVxuICAgIHJlZmluZShjaGVjaywgbWVzc2FnZSkge1xuICAgICAgICBjb25zdCBnZXRJc3N1ZVByb3BlcnRpZXMgPSAodmFsKSA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIG1lc3NhZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBtZXNzYWdlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UodmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVmaW5lbWVudCgodmFsLCBjdHgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrKHZhbCk7XG4gICAgICAgICAgICBjb25zdCBzZXRFcnJvciA9ICgpID0+IGN0eC5hZGRJc3N1ZSh7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmN1c3RvbSxcbiAgICAgICAgICAgICAgICAuLi5nZXRJc3N1ZVByb3BlcnRpZXModmFsKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBQcm9taXNlICE9PSBcInVuZGVmaW5lZFwiICYmIHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnRoZW4oKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRFcnJvcigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3IoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlZmluZW1lbnQoY2hlY2ssIHJlZmluZW1lbnREYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KCh2YWwsIGN0eCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjaGVjayh2YWwpKSB7XG4gICAgICAgICAgICAgICAgY3R4LmFkZElzc3VlKHR5cGVvZiByZWZpbmVtZW50RGF0YSA9PT0gXCJmdW5jdGlvblwiID8gcmVmaW5lbWVudERhdGEodmFsLCBjdHgpIDogcmVmaW5lbWVudERhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX3JlZmluZW1lbnQocmVmaW5lbWVudCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEVmZmVjdHMoe1xuICAgICAgICAgICAgc2NoZW1hOiB0aGlzLFxuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICAgICAgZWZmZWN0OiB7IHR5cGU6IFwicmVmaW5lbWVudFwiLCByZWZpbmVtZW50IH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBzdXBlclJlZmluZShyZWZpbmVtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWZpbmVtZW50KHJlZmluZW1lbnQpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3RvcihkZWYpIHtcbiAgICAgICAgLyoqIEFsaWFzIG9mIHNhZmVQYXJzZUFzeW5jICovXG4gICAgICAgIHRoaXMuc3BhID0gdGhpcy5zYWZlUGFyc2VBc3luYztcbiAgICAgICAgdGhpcy5fZGVmID0gZGVmO1xuICAgICAgICB0aGlzLnBhcnNlID0gdGhpcy5wYXJzZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNhZmVQYXJzZSA9IHRoaXMuc2FmZVBhcnNlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucGFyc2VBc3luYyA9IHRoaXMucGFyc2VBc3luYy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNhZmVQYXJzZUFzeW5jID0gdGhpcy5zYWZlUGFyc2VBc3luYy5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnNwYSA9IHRoaXMuc3BhLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMucmVmaW5lID0gdGhpcy5yZWZpbmUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWZpbmVtZW50ID0gdGhpcy5yZWZpbmVtZW50LmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuc3VwZXJSZWZpbmUgPSB0aGlzLnN1cGVyUmVmaW5lLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMub3B0aW9uYWwgPSB0aGlzLm9wdGlvbmFsLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubnVsbGFibGUgPSB0aGlzLm51bGxhYmxlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMubnVsbGlzaCA9IHRoaXMubnVsbGlzaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmFycmF5ID0gdGhpcy5hcnJheS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnByb21pc2UgPSB0aGlzLnByb21pc2UuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5vciA9IHRoaXMub3IuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5hbmQgPSB0aGlzLmFuZC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnRyYW5zZm9ybSA9IHRoaXMudHJhbnNmb3JtLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuYnJhbmQgPSB0aGlzLmJyYW5kLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuZGVmYXVsdCA9IHRoaXMuZGVmYXVsdC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmNhdGNoID0gdGhpcy5jYXRjaC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLmRlc2NyaWJlID0gdGhpcy5kZXNjcmliZS5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzLnBpcGUgPSB0aGlzLnBpcGUuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5yZWFkb25seSA9IHRoaXMucmVhZG9ubHkuYmluZCh0aGlzKTtcbiAgICAgICAgdGhpcy5pc051bGxhYmxlID0gdGhpcy5pc051bGxhYmxlLmJpbmQodGhpcyk7XG4gICAgICAgIHRoaXMuaXNPcHRpb25hbCA9IHRoaXMuaXNPcHRpb25hbC5iaW5kKHRoaXMpO1xuICAgICAgICB0aGlzW1wifnN0YW5kYXJkXCJdID0ge1xuICAgICAgICAgICAgdmVyc2lvbjogMSxcbiAgICAgICAgICAgIHZlbmRvcjogXCJ6b2RcIixcbiAgICAgICAgICAgIHZhbGlkYXRlOiAoZGF0YSkgPT4gdGhpc1tcIn52YWxpZGF0ZVwiXShkYXRhKSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgb3B0aW9uYWwoKSB7XG4gICAgICAgIHJldHVybiBab2RPcHRpb25hbC5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgbnVsbGFibGUoKSB7XG4gICAgICAgIHJldHVybiBab2ROdWxsYWJsZS5jcmVhdGUodGhpcywgdGhpcy5fZGVmKTtcbiAgICB9XG4gICAgbnVsbGlzaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubnVsbGFibGUoKS5vcHRpb25hbCgpO1xuICAgIH1cbiAgICBhcnJheSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZEFycmF5LmNyZWF0ZSh0aGlzKTtcbiAgICB9XG4gICAgcHJvbWlzZSgpIHtcbiAgICAgICAgcmV0dXJuIFpvZFByb21pc2UuY3JlYXRlKHRoaXMsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIG9yKG9wdGlvbikge1xuICAgICAgICByZXR1cm4gWm9kVW5pb24uY3JlYXRlKFt0aGlzLCBvcHRpb25dLCB0aGlzLl9kZWYpO1xuICAgIH1cbiAgICBhbmQoaW5jb21pbmcpIHtcbiAgICAgICAgcmV0dXJuIFpvZEludGVyc2VjdGlvbi5jcmVhdGUodGhpcywgaW5jb21pbmcsIHRoaXMuX2RlZik7XG4gICAgfVxuICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm0pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcy5fZGVmKSxcbiAgICAgICAgICAgIHNjaGVtYTogdGhpcyxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0cyxcbiAgICAgICAgICAgIGVmZmVjdDogeyB0eXBlOiBcInRyYW5zZm9ybVwiLCB0cmFuc2Zvcm0gfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGRlZmF1bHQoZGVmKSB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZUZ1bmMgPSB0eXBlb2YgZGVmID09PSBcImZ1bmN0aW9uXCIgPyBkZWYgOiAoKSA9PiBkZWY7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRGVmYXVsdCh7XG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgICAgICBpbm5lclR5cGU6IHRoaXMsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZUZ1bmMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERlZmF1bHQsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBicmFuZCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RCcmFuZGVkKHtcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQnJhbmRlZCxcbiAgICAgICAgICAgIHR5cGU6IHRoaXMsXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHRoaXMuX2RlZiksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaChkZWYpIHtcbiAgICAgICAgY29uc3QgY2F0Y2hWYWx1ZUZ1bmMgPSB0eXBlb2YgZGVmID09PSBcImZ1bmN0aW9uXCIgPyBkZWYgOiAoKSA9PiBkZWY7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQ2F0Y2goe1xuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyh0aGlzLl9kZWYpLFxuICAgICAgICAgICAgaW5uZXJUeXBlOiB0aGlzLFxuICAgICAgICAgICAgY2F0Y2hWYWx1ZTogY2F0Y2hWYWx1ZUZ1bmMsXG4gICAgICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZENhdGNoLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGVzY3JpYmUoZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgVGhpcyA9IHRoaXMuY29uc3RydWN0b3I7XG4gICAgICAgIHJldHVybiBuZXcgVGhpcyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHBpcGUodGFyZ2V0KSB7XG4gICAgICAgIHJldHVybiBab2RQaXBlbGluZS5jcmVhdGUodGhpcywgdGFyZ2V0KTtcbiAgICB9XG4gICAgcmVhZG9ubHkoKSB7XG4gICAgICAgIHJldHVybiBab2RSZWFkb25seS5jcmVhdGUodGhpcyk7XG4gICAgfVxuICAgIGlzT3B0aW9uYWwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhZmVQYXJzZSh1bmRlZmluZWQpLnN1Y2Nlc3M7XG4gICAgfVxuICAgIGlzTnVsbGFibGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhZmVQYXJzZShudWxsKS5zdWNjZXNzO1xuICAgIH1cbn1cbmNvbnN0IGN1aWRSZWdleCA9IC9eY1teXFxzLV17OCx9JC9pO1xuY29uc3QgY3VpZDJSZWdleCA9IC9eWzAtOWEtel0rJC87XG5jb25zdCB1bGlkUmVnZXggPSAvXlswLTlBLUhKS01OUC1UVi1aXXsyNn0kL2k7XG4vLyBjb25zdCB1dWlkUmVnZXggPVxuLy8gICAvXihbYS1mMC05XXs4fS1bYS1mMC05XXs0fS1bMS01XVthLWYwLTldezN9LVthLWYwLTldezR9LVthLWYwLTldezEyfXwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDApJC9pO1xuY29uc3QgdXVpZFJlZ2V4ID0gL15bMC05YS1mQS1GXXs4fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXs0fVxcYi1bMC05YS1mQS1GXXsxMn0kL2k7XG5jb25zdCBuYW5vaWRSZWdleCA9IC9eW2EtejAtOV8tXXsyMX0kL2k7XG5jb25zdCBqd3RSZWdleCA9IC9eW0EtWmEtejAtOS1fXStcXC5bQS1aYS16MC05LV9dK1xcLltBLVphLXowLTktX10qJC87XG5jb25zdCBkdXJhdGlvblJlZ2V4ID0gL15bLStdP1AoPyEkKSg/Oig/OlstK10/XFxkK1kpfCg/OlstK10/XFxkK1suLF1cXGQrWSQpKT8oPzooPzpbLStdP1xcZCtNKXwoPzpbLStdP1xcZCtbLixdXFxkK00kKSk/KD86KD86Wy0rXT9cXGQrVyl8KD86Wy0rXT9cXGQrWy4sXVxcZCtXJCkpPyg/Oig/OlstK10/XFxkK0QpfCg/OlstK10/XFxkK1suLF1cXGQrRCQpKT8oPzpUKD89W1xcZCstXSkoPzooPzpbLStdP1xcZCtIKXwoPzpbLStdP1xcZCtbLixdXFxkK0gkKSk/KD86KD86Wy0rXT9cXGQrTSl8KD86Wy0rXT9cXGQrWy4sXVxcZCtNJCkpPyg/OlstK10/XFxkKyg/OlsuLF1cXGQrKT9TKT8pPz8kLztcbi8vIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ2MTgxLzE1NTAxNTVcbi8vIG9sZCB2ZXJzaW9uOiB0b28gc2xvdywgZGlkbid0IHN1cHBvcnQgdW5pY29kZVxuLy8gY29uc3QgZW1haWxSZWdleCA9IC9eKCgoW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKyhcXC4oW2Etel18XFxkfFshI1xcJCUmJ1xcKlxcK1xcLVxcLz1cXD9cXF5fYHtcXHx9fl18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKykqKXwoKFxceDIyKSgoKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KChbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHg3Zl18XFx4MjF8W1xceDIzLVxceDViXXxbXFx4NWQtXFx4N2VdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKXwoXFxcXChbXFx4MDEtXFx4MDlcXHgwYlxceDBjXFx4MGQtXFx4N2ZdfFtcXHUwMEEwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdKSkpKSooKChcXHgyMHxcXHgwOSkqKFxceDBkXFx4MGEpKT8oXFx4MjB8XFx4MDkpKyk/KFxceDIyKSkpQCgoKFthLXpdfFxcZHxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSl8KChbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxcXGR8W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKSlcXC4pKygoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pfCgoW2Etel18W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKFthLXpdfFxcZHwtfFxcLnxffH58W1xcdTAwQTAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkZFRl0pKihbYS16XXxbXFx1MDBBMC1cXHVEN0ZGXFx1RjkwMC1cXHVGRENGXFx1RkRGMC1cXHVGRkVGXSkpKSQvaTtcbi8vb2xkIGVtYWlsIHJlZ2V4XG4vLyBjb25zdCBlbWFpbFJlZ2V4ID0gL14oKFtePD4oKVtcXF0uLDs6XFxzQFwiXSsoXFwuW148PigpW1xcXS4sOzpcXHNAXCJdKykqKXwoXCIuK1wiKSlAKCg/IS0pKFtePD4oKVtcXF0uLDs6XFxzQFwiXStcXC4pK1tePD4oKVtcXF0uLDs6XFxzQFwiXXsxLH0pW14tPD4oKVtcXF0uLDs6XFxzQFwiXSQvaTtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXFxcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcXFwiXSspKil8KFxcXCIuK1xcXCIpKUAoKFxcWygoKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcLil7M30oKDI1WzAtNV0pfCgyWzAtNF1bMC05XSl8KDFbMC05XXsyfSl8KFswLTldezEsMn0pKVxcXSl8KFxcW0lQdjY6KChbYS1mMC05XXsxLDR9Oil7N318OjooW2EtZjAtOV17MSw0fTopezAsNn18KFthLWYwLTldezEsNH06KXsxfTooW2EtZjAtOV17MSw0fTopezAsNX18KFthLWYwLTldezEsNH06KXsyfTooW2EtZjAtOV17MSw0fTopezAsNH18KFthLWYwLTldezEsNH06KXszfTooW2EtZjAtOV17MSw0fTopezAsM318KFthLWYwLTldezEsNH06KXs0fTooW2EtZjAtOV17MSw0fTopezAsMn18KFthLWYwLTldezEsNH06KXs1fTooW2EtZjAtOV17MSw0fTopezAsMX0pKFthLWYwLTldezEsNH18KCgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpXFwuKXszfSgoMjVbMC01XSl8KDJbMC00XVswLTldKXwoMVswLTldezJ9KXwoWzAtOV17MSwyfSkpKVxcXSl8KFtBLVphLXowLTldKFtBLVphLXowLTktXSpbQS1aYS16MC05XSkqKFxcLltBLVphLXpdezIsfSkrKSkkLztcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXpBLVowLTlcXC5cXCFcXCNcXCRcXCVcXCZcXCdcXCpcXCtcXC9cXD1cXD9cXF5cXF9cXGBcXHtcXHxcXH1cXH5cXC1dK0BbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcXC5bYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8pKiQvO1xuLy8gY29uc3QgZW1haWxSZWdleCA9XG4vLyAgIC9eKD86W2EtejAtOSEjJCUmJyorLz0/Xl9ge3x9fi1dKyg/OlxcLlthLXowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKnxcIig/OltcXHgwMS1cXHgwOFxceDBiXFx4MGNcXHgwZS1cXHgxZlxceDIxXFx4MjMtXFx4NWJcXHg1ZC1cXHg3Zl18XFxcXFtcXHgwMS1cXHgwOVxceDBiXFx4MGNcXHgwZS1cXHg3Zl0pKlwiKUAoPzooPzpbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/XFwuKStbYS16MC05XSg/OlthLXowLTktXSpbYS16MC05XSk/fFxcWyg/Oig/OjI1WzAtNV18MlswLTRdWzAtOV18WzAxXT9bMC05XVswLTldPylcXC4pezN9KD86MjVbMC01XXwyWzAtNF1bMC05XXxbMDFdP1swLTldWzAtOV0/fFthLXowLTktXSpbYS16MC05XTooPzpbXFx4MDEtXFx4MDhcXHgwYlxceDBjXFx4MGUtXFx4MWZcXHgyMS1cXHg1YVxceDUzLVxceDdmXXxcXFxcW1xceDAxLVxceDA5XFx4MGJcXHgwY1xceDBlLVxceDdmXSkrKVxcXSkkL2k7XG5jb25zdCBlbWFpbFJlZ2V4ID0gL14oPyFcXC4pKD8hLipcXC5cXC4pKFtBLVowLTlfJytcXC1cXC5dKilbQS1aMC05XystXUAoW0EtWjAtOV1bQS1aMC05XFwtXSpcXC4pK1tBLVpdezIsfSQvaTtcbi8vIGNvbnN0IGVtYWlsUmVnZXggPVxuLy8gICAvXlthLXowLTkuISMkJSbigJkqKy89P15fYHt8fX4tXStAW2EtejAtOS1dKyg/OlxcLlthLXowLTlcXC1dKykqJC9pO1xuLy8gZnJvbSBodHRwczovL3RoZWtldmluc2NvdHQuY29tL2Vtb2ppcy1pbi1qYXZhc2NyaXB0LyN3cml0aW5nLWEtcmVndWxhci1leHByZXNzaW9uXG5jb25zdCBfZW1vamlSZWdleCA9IGBeKFxcXFxwe0V4dGVuZGVkX1BpY3RvZ3JhcGhpY318XFxcXHB7RW1vamlfQ29tcG9uZW50fSkrJGA7XG5sZXQgZW1vamlSZWdleDtcbi8vIGZhc3Rlciwgc2ltcGxlciwgc2FmZXJcbmNvbnN0IGlwdjRSZWdleCA9IC9eKD86KD86MjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV1bMC05XXxbMS05XVswLTldfFswLTldKVxcLil7M30oPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pJC87XG5jb25zdCBpcHY0Q2lkclJlZ2V4ID0gL14oPzooPzoyNVswLTVdfDJbMC00XVswLTldfDFbMC05XVswLTldfFsxLTldWzAtOV18WzAtOV0pXFwuKXszfSg/OjI1WzAtNV18MlswLTRdWzAtOV18MVswLTldWzAtOV18WzEtOV1bMC05XXxbMC05XSlcXC8oM1swLTJdfFsxMl0/WzAtOV0pJC87XG4vLyBjb25zdCBpcHY2UmVnZXggPVxuLy8gL14oKFthLWYwLTldezEsNH06KXs3fXw6OihbYS1mMC05XXsxLDR9Oil7MCw2fXwoW2EtZjAtOV17MSw0fTopezF9OihbYS1mMC05XXsxLDR9Oil7MCw1fXwoW2EtZjAtOV17MSw0fTopezJ9OihbYS1mMC05XXsxLDR9Oil7MCw0fXwoW2EtZjAtOV17MSw0fTopezN9OihbYS1mMC05XXsxLDR9Oil7MCwzfXwoW2EtZjAtOV17MSw0fTopezR9OihbYS1mMC05XXsxLDR9Oil7MCwyfXwoW2EtZjAtOV17MSw0fTopezV9OihbYS1mMC05XXsxLDR9Oil7MCwxfSkoW2EtZjAtOV17MSw0fXwoKCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSlcXC4pezN9KCgyNVswLTVdKXwoMlswLTRdWzAtOV0pfCgxWzAtOV17Mn0pfChbMC05XXsxLDJ9KSkpJC87XG5jb25zdCBpcHY2UmVnZXggPSAvXigoWzAtOWEtZkEtRl17MSw0fTopezcsN31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdezAsNH0pezAsNH0lWzAtOWEtekEtWl17MSx9fDo6KGZmZmYoOjB7MSw0fSl7MCwxfTopezAsMX0oKDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKVxcLil7MywzfSgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKSkkLztcbmNvbnN0IGlwdjZDaWRyUmVnZXggPSAvXigoWzAtOWEtZkEtRl17MSw0fTopezcsN31bMC05YS1mQS1GXXsxLDR9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw3fTp8KFswLTlhLWZBLUZdezEsNH06KXsxLDZ9OlswLTlhLWZBLUZdezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDV9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDJ9fChbMC05YS1mQS1GXXsxLDR9Oil7MSw0fSg6WzAtOWEtZkEtRl17MSw0fSl7MSwzfXwoWzAtOWEtZkEtRl17MSw0fTopezEsM30oOlswLTlhLWZBLUZdezEsNH0pezEsNH18KFswLTlhLWZBLUZdezEsNH06KXsxLDJ9KDpbMC05YS1mQS1GXXsxLDR9KXsxLDV9fFswLTlhLWZBLUZdezEsNH06KCg6WzAtOWEtZkEtRl17MSw0fSl7MSw2fSl8OigoOlswLTlhLWZBLUZdezEsNH0pezEsN318Oil8ZmU4MDooOlswLTlhLWZBLUZdezAsNH0pezAsNH0lWzAtOWEtekEtWl17MSx9fDo6KGZmZmYoOjB7MSw0fSl7MCwxfTopezAsMX0oKDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKVxcLil7MywzfSgyNVswLTVdfCgyWzAtNF18MXswLDF9WzAtOV0pezAsMX1bMC05XSl8KFswLTlhLWZBLUZdezEsNH06KXsxLDR9OigoMjVbMC01XXwoMlswLTRdfDF7MCwxfVswLTldKXswLDF9WzAtOV0pXFwuKXszLDN9KDI1WzAtNV18KDJbMC00XXwxezAsMX1bMC05XSl7MCwxfVswLTldKSlcXC8oMTJbMC04XXwxWzAxXVswLTldfFsxLTldP1swLTldKSQvO1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzg2MDM5Mi9kZXRlcm1pbmUtaWYtc3RyaW5nLWlzLWluLWJhc2U2NC11c2luZy1qYXZhc2NyaXB0XG5jb25zdCBiYXNlNjRSZWdleCA9IC9eKFswLTlhLXpBLVorL117NH0pKigoWzAtOWEtekEtWisvXXsyfT09KXwoWzAtOWEtekEtWisvXXszfT0pKT8kLztcbi8vIGh0dHBzOi8vYmFzZTY0Lmd1cnUvc3RhbmRhcmRzL2Jhc2U2NHVybFxuY29uc3QgYmFzZTY0dXJsUmVnZXggPSAvXihbMC05YS16QS1aLV9dezR9KSooKFswLTlhLXpBLVotX117Mn0oPT0pPyl8KFswLTlhLXpBLVotX117M30oPSk/KSk/JC87XG4vLyBzaW1wbGVcbi8vIGNvbnN0IGRhdGVSZWdleFNvdXJjZSA9IGBcXFxcZHs0fS1cXFxcZHsyfS1cXFxcZHsyfWA7XG4vLyBubyBsZWFwIHllYXIgdmFsaWRhdGlvblxuLy8gY29uc3QgZGF0ZVJlZ2V4U291cmNlID0gYFxcXFxkezR9LSgoMFsxMzU3OF18MTB8MTIpLTMxfCgwWzEzLTldfDFbMC0yXSktMzB8KDBbMS05XXwxWzAtMl0pLSgwWzEtOV18MVxcXFxkfDJcXFxcZCkpYDtcbi8vIHdpdGggbGVhcCB5ZWFyIHZhbGlkYXRpb25cbmNvbnN0IGRhdGVSZWdleFNvdXJjZSA9IGAoKFxcXFxkXFxcXGRbMjQ2OF1bMDQ4XXxcXFxcZFxcXFxkWzEzNTc5XVsyNl18XFxcXGRcXFxcZDBbNDhdfFswMjQ2OF1bMDQ4XTAwfFsxMzU3OV1bMjZdMDApLTAyLTI5fFxcXFxkezR9LSgoMFsxMzU3OF18MVswMl0pLSgwWzEtOV18WzEyXVxcXFxkfDNbMDFdKXwoMFs0NjldfDExKS0oMFsxLTldfFsxMl1cXFxcZHwzMCl8KDAyKS0oMFsxLTldfDFcXFxcZHwyWzAtOF0pKSlgO1xuY29uc3QgZGF0ZVJlZ2V4ID0gbmV3IFJlZ0V4cChgXiR7ZGF0ZVJlZ2V4U291cmNlfSRgKTtcbmZ1bmN0aW9uIHRpbWVSZWdleFNvdXJjZShhcmdzKSB7XG4gICAgbGV0IHNlY29uZHNSZWdleFNvdXJjZSA9IGBbMC01XVxcXFxkYDtcbiAgICBpZiAoYXJncy5wcmVjaXNpb24pIHtcbiAgICAgICAgc2Vjb25kc1JlZ2V4U291cmNlID0gYCR7c2Vjb25kc1JlZ2V4U291cmNlfVxcXFwuXFxcXGR7JHthcmdzLnByZWNpc2lvbn19YDtcbiAgICB9XG4gICAgZWxzZSBpZiAoYXJncy5wcmVjaXNpb24gPT0gbnVsbCkge1xuICAgICAgICBzZWNvbmRzUmVnZXhTb3VyY2UgPSBgJHtzZWNvbmRzUmVnZXhTb3VyY2V9KFxcXFwuXFxcXGQrKT9gO1xuICAgIH1cbiAgICBjb25zdCBzZWNvbmRzUXVhbnRpZmllciA9IGFyZ3MucHJlY2lzaW9uID8gXCIrXCIgOiBcIj9cIjsgLy8gcmVxdWlyZSBzZWNvbmRzIGlmIHByZWNpc2lvbiBpcyBub256ZXJvXG4gICAgcmV0dXJuIGAoWzAxXVxcXFxkfDJbMC0zXSk6WzAtNV1cXFxcZCg6JHtzZWNvbmRzUmVnZXhTb3VyY2V9KSR7c2Vjb25kc1F1YW50aWZpZXJ9YDtcbn1cbmZ1bmN0aW9uIHRpbWVSZWdleChhcmdzKSB7XG4gICAgcmV0dXJuIG5ldyBSZWdFeHAoYF4ke3RpbWVSZWdleFNvdXJjZShhcmdzKX0kYCk7XG59XG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzMxNDMyMzFcbmV4cG9ydCBmdW5jdGlvbiBkYXRldGltZVJlZ2V4KGFyZ3MpIHtcbiAgICBsZXQgcmVnZXggPSBgJHtkYXRlUmVnZXhTb3VyY2V9VCR7dGltZVJlZ2V4U291cmNlKGFyZ3MpfWA7XG4gICAgY29uc3Qgb3B0cyA9IFtdO1xuICAgIG9wdHMucHVzaChhcmdzLmxvY2FsID8gYFo/YCA6IGBaYCk7XG4gICAgaWYgKGFyZ3Mub2Zmc2V0KVxuICAgICAgICBvcHRzLnB1c2goYChbKy1dXFxcXGR7Mn06P1xcXFxkezJ9KWApO1xuICAgIHJlZ2V4ID0gYCR7cmVnZXh9KCR7b3B0cy5qb2luKFwifFwiKX0pYDtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgXiR7cmVnZXh9JGApO1xufVxuZnVuY3Rpb24gaXNWYWxpZElQKGlwLCB2ZXJzaW9uKSB7XG4gICAgaWYgKCh2ZXJzaW9uID09PSBcInY0XCIgfHwgIXZlcnNpb24pICYmIGlwdjRSZWdleC50ZXN0KGlwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKCh2ZXJzaW9uID09PSBcInY2XCIgfHwgIXZlcnNpb24pICYmIGlwdjZSZWdleC50ZXN0KGlwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gaXNWYWxpZEpXVChqd3QsIGFsZykge1xuICAgIGlmICghand0UmVnZXgudGVzdChqd3QpKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgW2hlYWRlcl0gPSBqd3Quc3BsaXQoXCIuXCIpO1xuICAgICAgICBpZiAoIWhlYWRlcilcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgLy8gQ29udmVydCBiYXNlNjR1cmwgdG8gYmFzZTY0XG4gICAgICAgIGNvbnN0IGJhc2U2NCA9IGhlYWRlclxuICAgICAgICAgICAgLnJlcGxhY2UoLy0vZywgXCIrXCIpXG4gICAgICAgICAgICAucmVwbGFjZSgvXy9nLCBcIi9cIilcbiAgICAgICAgICAgIC5wYWRFbmQoaGVhZGVyLmxlbmd0aCArICgoNCAtIChoZWFkZXIubGVuZ3RoICUgNCkpICUgNCksIFwiPVwiKTtcbiAgICAgICAgY29uc3QgZGVjb2RlZCA9IEpTT04ucGFyc2UoYXRvYihiYXNlNjQpKTtcbiAgICAgICAgaWYgKHR5cGVvZiBkZWNvZGVkICE9PSBcIm9iamVjdFwiIHx8IGRlY29kZWQgPT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChcInR5cFwiIGluIGRlY29kZWQgJiYgZGVjb2RlZD8udHlwICE9PSBcIkpXVFwiKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIWRlY29kZWQuYWxnKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoYWxnICYmIGRlY29kZWQuYWxnICE9PSBhbGcpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG5mdW5jdGlvbiBpc1ZhbGlkQ2lkcihpcCwgdmVyc2lvbikge1xuICAgIGlmICgodmVyc2lvbiA9PT0gXCJ2NFwiIHx8ICF2ZXJzaW9uKSAmJiBpcHY0Q2lkclJlZ2V4LnRlc3QoaXApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoKHZlcnNpb24gPT09IFwidjZcIiB8fCAhdmVyc2lvbikgJiYgaXB2NkNpZHJSZWdleC50ZXN0KGlwKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuZXhwb3J0IGNsYXNzIFpvZFN0cmluZyBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IFN0cmluZyhpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5zdHJpbmcsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgbGV0IGN0eCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA8IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibGVuZ3RoXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBpbnB1dC5kYXRhLmxlbmd0aCA+IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gaW5wdXQuZGF0YS5sZW5ndGggPCBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vQmlnIHx8IHRvb1NtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9vQmlnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluaW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZW1haWxcIikge1xuICAgICAgICAgICAgICAgIGlmICghZW1haWxSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZW1haWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImVtb2ppXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWVtb2ppUmVnZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgZW1vamlSZWdleCA9IG5ldyBSZWdFeHAoX2Vtb2ppUmVnZXgsIFwidVwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFlbW9qaVJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJlbW9qaVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidXVpZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF1dWlkUmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInV1aWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm5hbm9pZFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFuYW5vaWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwibmFub2lkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJjdWlkXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1aWRSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiY3VpZDJcIikge1xuICAgICAgICAgICAgICAgIGlmICghY3VpZDJSZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiY3VpZDJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInVsaWRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdWxpZFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1bGlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ1cmxcIikge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBVUkwoaW5wdXQuZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ1cmxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInJlZ2V4XCIpIHtcbiAgICAgICAgICAgICAgICBjaGVjay5yZWdleC5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RSZXN1bHQgPSBjaGVjay5yZWdleC50ZXN0KGlucHV0LmRhdGEpO1xuICAgICAgICAgICAgICAgIGlmICghdGVzdFJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcInJlZ2V4XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0cmltXCIpIHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gaW5wdXQuZGF0YS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImluY2x1ZGVzXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlucHV0LmRhdGEuaW5jbHVkZXMoY2hlY2sudmFsdWUsIGNoZWNrLnBvc2l0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7IGluY2x1ZGVzOiBjaGVjay52YWx1ZSwgcG9zaXRpb246IGNoZWNrLnBvc2l0aW9uIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJ0b0xvd2VyQ2FzZVwiKSB7XG4gICAgICAgICAgICAgICAgaW5wdXQuZGF0YSA9IGlucHV0LmRhdGEudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwidG9VcHBlckNhc2VcIikge1xuICAgICAgICAgICAgICAgIGlucHV0LmRhdGEgPSBpbnB1dC5kYXRhLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInN0YXJ0c1dpdGhcIikge1xuICAgICAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YS5zdGFydHNXaXRoKGNoZWNrLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7IHN0YXJ0c1dpdGg6IGNoZWNrLnZhbHVlIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJlbmRzV2l0aFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dC5kYXRhLmVuZHNXaXRoKGNoZWNrLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiB7IGVuZHNXaXRoOiBjaGVjay52YWx1ZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiZGF0ZXRpbWVcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gZGF0ZXRpbWVSZWdleChjaGVjayk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWdleC50ZXN0KGlucHV0LmRhdGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiZGF0ZXRpbWVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImRhdGVcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gZGF0ZVJlZ2V4O1xuICAgICAgICAgICAgICAgIGlmICghcmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcInRpbWVcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gdGltZVJlZ2V4KGNoZWNrKTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJ0aW1lXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJkdXJhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFkdXJhdGlvblJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJkdXJhdGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiaXBcIikge1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZElQKGlucHV0LmRhdGEsIGNoZWNrLnZlcnNpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb246IFwiaXBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImp3dFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ZhbGlkSldUKGlucHV0LmRhdGEsIGNoZWNrLmFsZykpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJqd3RcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImNpZHJcIikge1xuICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZENpZHIoaW5wdXQuZGF0YSwgY2hlY2sudmVyc2lvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJjaWRyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJiYXNlNjRcIikge1xuICAgICAgICAgICAgICAgIGlmICghYmFzZTY0UmVnZXgudGVzdChpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uOiBcImJhc2U2NFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwiYmFzZTY0dXJsXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWJhc2U2NHVybFJlZ2V4LnRlc3QoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbjogXCJiYXNlNjR1cmxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3N0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGNoZWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBzdGF0dXM6IHN0YXR1cy52YWx1ZSwgdmFsdWU6IGlucHV0LmRhdGEgfTtcbiAgICB9XG4gICAgX3JlZ2V4KHJlZ2V4LCB2YWxpZGF0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlZmluZW1lbnQoKGRhdGEpID0+IHJlZ2V4LnRlc3QoZGF0YSksIHtcbiAgICAgICAgICAgIHZhbGlkYXRpb24sXG4gICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9zdHJpbmcsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RTdHJpbmcoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZW1haWwobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImVtYWlsXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdXJsKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1cmxcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBlbW9qaShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZW1vamlcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICB1dWlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJ1dWlkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgbmFub2lkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJuYW5vaWRcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpIH0pO1xuICAgIH1cbiAgICBjdWlkKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJjdWlkXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgY3VpZDIobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImN1aWQyXCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgdWxpZChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwidWxpZFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIGJhc2U2NChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiYmFzZTY0XCIsIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSB9KTtcbiAgICB9XG4gICAgYmFzZTY0dXJsKG1lc3NhZ2UpIHtcbiAgICAgICAgLy8gYmFzZTY0dXJsIGVuY29kaW5nIGlzIGEgbW9kaWZpY2F0aW9uIG9mIGJhc2U2NCB0aGF0IGNhbiBzYWZlbHkgYmUgdXNlZCBpbiBVUkxzIGFuZCBmaWxlbmFtZXNcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwiYmFzZTY0dXJsXCIsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBqd3Qob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImp3dFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucykgfSk7XG4gICAgfVxuICAgIGlwKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJpcFwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoob3B0aW9ucykgfSk7XG4gICAgfVxuICAgIGNpZHIob3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soeyBraW5kOiBcImNpZHJcIiwgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnMpIH0pO1xuICAgIH1cbiAgICBkYXRldGltZShvcHRpb25zKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgICAgICBraW5kOiBcImRhdGV0aW1lXCIsXG4gICAgICAgICAgICAgICAgcHJlY2lzaW9uOiBudWxsLFxuICAgICAgICAgICAgICAgIG9mZnNldDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbG9jYWw6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJkYXRldGltZVwiLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB0eXBlb2Ygb3B0aW9ucz8ucHJlY2lzaW9uID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG9wdGlvbnM/LnByZWNpc2lvbixcbiAgICAgICAgICAgIG9mZnNldDogb3B0aW9ucz8ub2Zmc2V0ID8/IGZhbHNlLFxuICAgICAgICAgICAgbG9jYWw6IG9wdGlvbnM/LmxvY2FsID8/IGZhbHNlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnM/Lm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZGF0ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7IGtpbmQ6IFwiZGF0ZVwiLCBtZXNzYWdlIH0pO1xuICAgIH1cbiAgICB0aW1lKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAgICAgIGtpbmQ6IFwidGltZVwiLFxuICAgICAgICAgICAgICAgIHByZWNpc2lvbjogbnVsbCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBvcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwidGltZVwiLFxuICAgICAgICAgICAgcHJlY2lzaW9uOiB0eXBlb2Ygb3B0aW9ucz8ucHJlY2lzaW9uID09PSBcInVuZGVmaW5lZFwiID8gbnVsbCA6IG9wdGlvbnM/LnByZWNpc2lvbixcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihvcHRpb25zPy5tZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGR1cmF0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHsga2luZDogXCJkdXJhdGlvblwiLCAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkgfSk7XG4gICAgfVxuICAgIHJlZ2V4KHJlZ2V4LCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcInJlZ2V4XCIsXG4gICAgICAgICAgICByZWdleDogcmVnZXgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBpbmNsdWRlcyh2YWx1ZSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJpbmNsdWRlc1wiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgcG9zaXRpb246IG9wdGlvbnM/LnBvc2l0aW9uLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG9wdGlvbnM/Lm1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RhcnRzV2l0aCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJzdGFydHNXaXRoXCIsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbmRzV2l0aCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJlbmRzV2l0aFwiLFxuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkxlbmd0aCwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBtaW5MZW5ndGgsXG4gICAgICAgICAgICAuLi5lcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IG1heExlbmd0aCxcbiAgICAgICAgICAgIC4uLmVycm9yVXRpbC5lcnJUb09iaihtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxlbmd0aChsZW4sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibGVuZ3RoXCIsXG4gICAgICAgICAgICB2YWx1ZTogbGVuLFxuICAgICAgICAgICAgLi4uZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRXF1aXZhbGVudCB0byBgLm1pbigxKWBcbiAgICAgKi9cbiAgICBub25lbXB0eShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbigxLCBlcnJvclV0aWwuZXJyVG9PYmoobWVzc2FnZSkpO1xuICAgIH1cbiAgICB0cmltKCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFsuLi50aGlzLl9kZWYuY2hlY2tzLCB7IGtpbmQ6IFwidHJpbVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9Mb3dlckNhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b0xvd2VyQ2FzZVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgdG9VcHBlckNhc2UoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU3RyaW5nKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIHsga2luZDogXCJ0b1VwcGVyQ2FzZVwiIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGlzRGF0ZXRpbWUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZGF0ZXRpbWVcIik7XG4gICAgfVxuICAgIGdldCBpc0RhdGUoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZGF0ZVwiKTtcbiAgICB9XG4gICAgZ2V0IGlzVGltZSgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ0aW1lXCIpO1xuICAgIH1cbiAgICBnZXQgaXNEdXJhdGlvbigpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJkdXJhdGlvblwiKTtcbiAgICB9XG4gICAgZ2V0IGlzRW1haWwoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiZW1haWxcIik7XG4gICAgfVxuICAgIGdldCBpc1VSTCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJ1cmxcIik7XG4gICAgfVxuICAgIGdldCBpc0Vtb2ppKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImVtb2ppXCIpO1xuICAgIH1cbiAgICBnZXQgaXNVVUlEKCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcInV1aWRcIik7XG4gICAgfVxuICAgIGdldCBpc05BTk9JRCgpIHtcbiAgICAgICAgcmV0dXJuICEhdGhpcy5fZGVmLmNoZWNrcy5maW5kKChjaCkgPT4gY2gua2luZCA9PT0gXCJuYW5vaWRcIik7XG4gICAgfVxuICAgIGdldCBpc0NVSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQ1VJRDIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY3VpZDJcIik7XG4gICAgfVxuICAgIGdldCBpc1VMSUQoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwidWxpZFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzSVAoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiaXBcIik7XG4gICAgfVxuICAgIGdldCBpc0NJRFIoKSB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2RlZi5jaGVja3MuZmluZCgoY2gpID0+IGNoLmtpbmQgPT09IFwiY2lkclwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQmFzZTY0KCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImJhc2U2NFwiKTtcbiAgICB9XG4gICAgZ2V0IGlzQmFzZTY0dXJsKCkge1xuICAgICAgICAvLyBiYXNlNjR1cmwgZW5jb2RpbmcgaXMgYSBtb2RpZmljYXRpb24gb2YgYmFzZTY0IHRoYXQgY2FuIHNhZmVseSBiZSB1c2VkIGluIFVSTHMgYW5kIGZpbGVuYW1lc1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImJhc2U2NHVybFwiKTtcbiAgICB9XG4gICAgZ2V0IG1pbkxlbmd0aCgpIHtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICBnZXQgbWF4TGVuZ3RoKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuWm9kU3RyaW5nLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFN0cmluZyh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kU3RyaW5nLFxuICAgICAgICBjb2VyY2U6IHBhcmFtcz8uY29lcmNlID8/IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzk2NjQ4NC93aHktZG9lcy1tb2R1bHVzLW9wZXJhdG9yLXJldHVybi1mcmFjdGlvbmFsLW51bWJlci1pbi1qYXZhc2NyaXB0LzMxNzExMDM0IzMxNzExMDM0XG5mdW5jdGlvbiBmbG9hdFNhZmVSZW1haW5kZXIodmFsLCBzdGVwKSB7XG4gICAgY29uc3QgdmFsRGVjQ291bnQgPSAodmFsLnRvU3RyaW5nKCkuc3BsaXQoXCIuXCIpWzFdIHx8IFwiXCIpLmxlbmd0aDtcbiAgICBjb25zdCBzdGVwRGVjQ291bnQgPSAoc3RlcC50b1N0cmluZygpLnNwbGl0KFwiLlwiKVsxXSB8fCBcIlwiKS5sZW5ndGg7XG4gICAgY29uc3QgZGVjQ291bnQgPSB2YWxEZWNDb3VudCA+IHN0ZXBEZWNDb3VudCA/IHZhbERlY0NvdW50IDogc3RlcERlY0NvdW50O1xuICAgIGNvbnN0IHZhbEludCA9IE51bWJlci5wYXJzZUludCh2YWwudG9GaXhlZChkZWNDb3VudCkucmVwbGFjZShcIi5cIiwgXCJcIikpO1xuICAgIGNvbnN0IHN0ZXBJbnQgPSBOdW1iZXIucGFyc2VJbnQoc3RlcC50b0ZpeGVkKGRlY0NvdW50KS5yZXBsYWNlKFwiLlwiLCBcIlwiKSk7XG4gICAgcmV0dXJuICh2YWxJbnQgJSBzdGVwSW50KSAvIDEwICoqIGRlY0NvdW50O1xufVxuZXhwb3J0IGNsYXNzIFpvZE51bWJlciBleHRlbmRzIFpvZFR5cGUge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLm1pbiA9IHRoaXMuZ3RlO1xuICAgICAgICB0aGlzLm1heCA9IHRoaXMubHRlO1xuICAgICAgICB0aGlzLnN0ZXAgPSB0aGlzLm11bHRpcGxlT2Y7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgaW5wdXQuZGF0YSA9IE51bWJlcihpbnB1dC5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bWJlcikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5udW1iZXIsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJpbnRcIikge1xuICAgICAgICAgICAgICAgIGlmICghdXRpbC5pc0ludGVnZXIoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBcImludGVnZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBcImZsb2F0XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY2hlY2suaW5jbHVzaXZlID8gaW5wdXQuZGF0YSA8IGNoZWNrLnZhbHVlIDogaW5wdXQuZGF0YSA8PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmUgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWUgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChmbG9hdFNhZmVSZW1haW5kZXIoaW5wdXQuZGF0YSwgY2hlY2sudmFsdWUpICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0LCBjdHgpO1xuICAgICAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5ub3RfbXVsdGlwbGVfb2YsXG4gICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZU9mOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcImZpbml0ZVwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLm5vdF9maW5pdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIGd0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgZ3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtaW5cIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBsdGUodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIHRydWUsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0KHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWF4XCIsIHZhbHVlLCBmYWxzZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgc2V0TGltaXQoa2luZCwgdmFsdWUsIGluY2x1c2l2ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE51bWJlcih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjaGVja3M6IFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9kZWYuY2hlY2tzLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgX2FkZENoZWNrKGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogWy4uLnRoaXMuX2RlZi5jaGVja3MsIGNoZWNrXSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGludChtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImludFwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiAwLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiBmYWxzZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG5lZ2F0aXZlKG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWF4XCIsXG4gICAgICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogZmFsc2UsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25wb3NpdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1heFwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IDAsXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtdWx0aXBsZU9mKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm11bHRpcGxlT2ZcIixcbiAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZpbml0ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcImZpbml0ZVwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2FmZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KS5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBtaW5WYWx1ZSgpIHtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWluID09PSBudWxsIHx8IGNoLnZhbHVlID4gbWluKVxuICAgICAgICAgICAgICAgICAgICBtaW4gPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWluO1xuICAgIH1cbiAgICBnZXQgbWF4VmFsdWUoKSB7XG4gICAgICAgIGxldCBtYXggPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1heCA9PT0gbnVsbCB8fCBjaC52YWx1ZSA8IG1heClcbiAgICAgICAgICAgICAgICAgICAgbWF4ID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1heDtcbiAgICB9XG4gICAgZ2V0IGlzSW50KCkge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9kZWYuY2hlY2tzLmZpbmQoKGNoKSA9PiBjaC5raW5kID09PSBcImludFwiIHx8IChjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIiAmJiB1dGlsLmlzSW50ZWdlcihjaC52YWx1ZSkpKTtcbiAgICB9XG4gICAgZ2V0IGlzRmluaXRlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgbGV0IG1pbiA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwiZmluaXRlXCIgfHwgY2gua2luZCA9PT0gXCJpbnRcIiB8fCBjaC5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobWluKSAmJiBOdW1iZXIuaXNGaW5pdGUobWF4KTtcbiAgICB9XG59XG5ab2ROdW1iZXIuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTnVtYmVyKHtcbiAgICAgICAgY2hlY2tzOiBbXSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdW1iZXIsXG4gICAgICAgIGNvZXJjZTogcGFyYW1zPy5jb2VyY2UgfHwgZmFsc2UsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kQmlnSW50IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubWluID0gdGhpcy5ndGU7XG4gICAgICAgIHRoaXMubWF4ID0gdGhpcy5sdGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodGhpcy5fZGVmLmNvZXJjZSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpbnB1dC5kYXRhID0gQmlnSW50KGlucHV0LmRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2gge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRJbnZhbGlkSW5wdXQoaW5wdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYmlnaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0SW52YWxpZElucHV0KGlucHV0KTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgY3R4ID0gdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBzdGF0dXMgPSBuZXcgUGFyc2VTdGF0dXMoKTtcbiAgICAgICAgZm9yIChjb25zdCBjaGVjayBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2hlY2sua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY2hlY2suaW5jbHVzaXZlID8gaW5wdXQuZGF0YSA8IGNoZWNrLnZhbHVlIDogaW5wdXQuZGF0YSA8PSBjaGVjay52YWx1ZTtcbiAgICAgICAgICAgICAgICBpZiAodG9vU21hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYmlnaW50XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBjaGVjay52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogY2hlY2suaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNoZWNrLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0b29CaWcgPSBjaGVjay5pbmNsdXNpdmUgPyBpbnB1dC5kYXRhID4gY2hlY2sudmFsdWUgOiBpbnB1dC5kYXRhID49IGNoZWNrLnZhbHVlO1xuICAgICAgICAgICAgICAgIGlmICh0b29CaWcpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImJpZ2ludFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IGNoZWNrLmluY2x1c2l2ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGNoZWNrLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm11bHRpcGxlT2ZcIikge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5kYXRhICUgY2hlY2sudmFsdWUgIT09IEJpZ0ludCgwKSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUubm90X211bHRpcGxlX29mLFxuICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGVPZjogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdXRpbC5hc3NlcnROZXZlcihjaGVjayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiBpbnB1dC5kYXRhIH07XG4gICAgfVxuICAgIF9nZXRJbnZhbGlkSW5wdXQoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5iaWdpbnQsXG4gICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICB9XG4gICAgZ3RlKHZhbHVlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldExpbWl0KFwibWluXCIsIHZhbHVlLCB0cnVlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBndCh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1pblwiLCB2YWx1ZSwgZmFsc2UsIGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSk7XG4gICAgfVxuICAgIGx0ZSh2YWx1ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5zZXRMaW1pdChcIm1heFwiLCB2YWx1ZSwgdHJ1ZSwgZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpKTtcbiAgICB9XG4gICAgbHQodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0TGltaXQoXCJtYXhcIiwgdmFsdWUsIGZhbHNlLCBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkpO1xuICAgIH1cbiAgICBzZXRMaW1pdChraW5kLCB2YWx1ZSwgaW5jbHVzaXZlLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQmlnSW50KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGNoZWNrczogW1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5jaGVja3MsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBfYWRkQ2hlY2soY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RCaWdJbnQoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtaW5cIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbmVnYXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IGZhbHNlLFxuICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9ucG9zaXRpdmUobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBCaWdJbnQoMCksXG4gICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBub25uZWdhdGl2ZShtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRDaGVjayh7XG4gICAgICAgICAgICBraW5kOiBcIm1pblwiLFxuICAgICAgICAgICAgdmFsdWU6IEJpZ0ludCgwKSxcbiAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG11bHRpcGxlT2YodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibXVsdGlwbGVPZlwiLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBnZXQgbWluVmFsdWUoKSB7XG4gICAgICAgIGxldCBtaW4gPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IGNoIG9mIHRoaXMuX2RlZi5jaGVja3MpIHtcbiAgICAgICAgICAgIGlmIChjaC5raW5kID09PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1pbiA9PT0gbnVsbCB8fCBjaC52YWx1ZSA+IG1pbilcbiAgICAgICAgICAgICAgICAgICAgbWluID0gY2gudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICB9XG4gICAgZ2V0IG1heFZhbHVlKCkge1xuICAgICAgICBsZXQgbWF4ID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgIGlmIChtYXggPT09IG51bGwgfHwgY2gudmFsdWUgPCBtYXgpXG4gICAgICAgICAgICAgICAgICAgIG1heCA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtYXg7XG4gICAgfVxufVxuWm9kQmlnSW50LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEJpZ0ludCh7XG4gICAgICAgIGNoZWNrczogW10sXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQmlnSW50LFxuICAgICAgICBjb2VyY2U6IHBhcmFtcz8uY29lcmNlID8/IGZhbHNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZEJvb2xlYW4gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5jb2VyY2UpIHtcbiAgICAgICAgICAgIGlucHV0LmRhdGEgPSBCb29sZWFuKGlucHV0LmRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuYm9vbGVhbikge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5ib29sZWFuLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZEJvb2xlYW4uY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kQm9vbGVhbih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQm9vbGVhbixcbiAgICAgICAgY29lcmNlOiBwYXJhbXM/LmNvZXJjZSB8fCBmYWxzZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2REYXRlIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY29lcmNlKSB7XG4gICAgICAgICAgICBpbnB1dC5kYXRhID0gbmV3IERhdGUoaW5wdXQuZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5kYXRlKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmRhdGUsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGlucHV0LmRhdGEuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfZGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhdHVzID0gbmV3IFBhcnNlU3RhdHVzKCk7XG4gICAgICAgIGxldCBjdHggPSB1bmRlZmluZWQ7XG4gICAgICAgIGZvciAoY29uc3QgY2hlY2sgb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoZWNrLmtpbmQgPT09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZGF0YS5nZXRUaW1lKCkgPCBjaGVjay52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCwgY3R4KTtcbiAgICAgICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogY2hlY2subWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW06IGNoZWNrLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkYXRlXCIsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChjaGVjay5raW5kID09PSBcIm1heFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlucHV0LmRhdGEuZ2V0VGltZSgpID4gY2hlY2sudmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQsIGN0eCk7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBjaGVjay5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogY2hlY2sudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRhdGVcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHV0aWwuYXNzZXJ0TmV2ZXIoY2hlY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cy52YWx1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBuZXcgRGF0ZShpbnB1dC5kYXRhLmdldFRpbWUoKSksXG4gICAgICAgIH07XG4gICAgfVxuICAgIF9hZGRDaGVjayhjaGVjaykge1xuICAgICAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgY2hlY2tzOiBbLi4udGhpcy5fZGVmLmNoZWNrcywgY2hlY2tdLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbWluKG1pbkRhdGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZENoZWNrKHtcbiAgICAgICAgICAgIGtpbmQ6IFwibWluXCIsXG4gICAgICAgICAgICB2YWx1ZTogbWluRGF0ZS5nZXRUaW1lKCksXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4RGF0ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYWRkQ2hlY2soe1xuICAgICAgICAgICAga2luZDogXCJtYXhcIixcbiAgICAgICAgICAgIHZhbHVlOiBtYXhEYXRlLmdldFRpbWUoKSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGdldCBtaW5EYXRlKCkge1xuICAgICAgICBsZXQgbWluID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBjaCBvZiB0aGlzLl9kZWYuY2hlY2tzKSB7XG4gICAgICAgICAgICBpZiAoY2gua2luZCA9PT0gXCJtaW5cIikge1xuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IG51bGwgfHwgY2gudmFsdWUgPiBtaW4pXG4gICAgICAgICAgICAgICAgICAgIG1pbiA9IGNoLnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtaW4gIT0gbnVsbCA/IG5ldyBEYXRlKG1pbikgOiBudWxsO1xuICAgIH1cbiAgICBnZXQgbWF4RGF0ZSgpIHtcbiAgICAgICAgbGV0IG1heCA9IG51bGw7XG4gICAgICAgIGZvciAoY29uc3QgY2ggb2YgdGhpcy5fZGVmLmNoZWNrcykge1xuICAgICAgICAgICAgaWYgKGNoLmtpbmQgPT09IFwibWF4XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAobWF4ID09PSBudWxsIHx8IGNoLnZhbHVlIDwgbWF4KVxuICAgICAgICAgICAgICAgICAgICBtYXggPSBjaC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4ICE9IG51bGwgPyBuZXcgRGF0ZShtYXgpIDogbnVsbDtcbiAgICB9XG59XG5ab2REYXRlLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZERhdGUoe1xuICAgICAgICBjaGVja3M6IFtdLFxuICAgICAgICBjb2VyY2U6IHBhcmFtcz8uY29lcmNlIHx8IGZhbHNlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZERhdGUsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kU3ltYm9sIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUuc3ltYm9sKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnN5bWJvbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RTeW1ib2wuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kU3ltYm9sKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTeW1ib2wsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kVW5kZWZpbmVkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2RVbmRlZmluZWQuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVW5kZWZpbmVkKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmRlZmluZWQsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kTnVsbCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubnVsbCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBPSyhpbnB1dC5kYXRhKTtcbiAgICB9XG59XG5ab2ROdWxsLmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE51bGwoe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE51bGwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kQW55IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIC8vIHRvIHByZXZlbnQgaW5zdGFuY2VzIG9mIG90aGVyIGNsYXNzZXMgZnJvbSBleHRlbmRpbmcgWm9kQW55LiB0aGlzIGNhdXNlcyBpc3N1ZXMgd2l0aCBjYXRjaGFsbCBpbiBab2RPYmplY3QuXG4gICAgICAgIHRoaXMuX2FueSA9IHRydWU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kQW55LmNyZWF0ZSA9IChwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZEFueSh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQW55LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZFVua25vd24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgLy8gcmVxdWlyZWRcbiAgICAgICAgdGhpcy5fdW5rbm93biA9IHRydWU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxufVxuWm9kVW5rbm93bi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RVbmtub3duKHtcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmtub3duLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZE5ldmVyIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUubmV2ZXIsXG4gICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICB9XG59XG5ab2ROZXZlci5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROZXZlcih7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTmV2ZXIsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kVm9pZCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBwYXJzZWRUeXBlID0gdGhpcy5fZ2V0VHlwZShpbnB1dCk7XG4gICAgICAgIGlmIChwYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY3R4ID0gdGhpcy5fZ2V0T3JSZXR1cm5DdHgoaW5wdXQpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS52b2lkLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE9LKGlucHV0LmRhdGEpO1xuICAgIH1cbn1cblpvZFZvaWQuY3JlYXRlID0gKHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVm9pZCh7XG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kVm9pZCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RBcnJheSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCwgc3RhdHVzIH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBkZWYgPSB0aGlzLl9kZWY7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5hcnJheSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYuZXhhY3RMZW5ndGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvb0JpZyA9IGN0eC5kYXRhLmxlbmd0aCA+IGRlZi5leGFjdExlbmd0aC52YWx1ZTtcbiAgICAgICAgICAgIGNvbnN0IHRvb1NtYWxsID0gY3R4LmRhdGEubGVuZ3RoIDwgZGVmLmV4YWN0TGVuZ3RoLnZhbHVlO1xuICAgICAgICAgICAgaWYgKHRvb0JpZyB8fCB0b29TbWFsbCkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiB0b29CaWcgPyBab2RJc3N1ZUNvZGUudG9vX2JpZyA6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgICAgIG1pbmltdW06ICh0b29TbWFsbCA/IGRlZi5leGFjdExlbmd0aC52YWx1ZSA6IHVuZGVmaW5lZCksXG4gICAgICAgICAgICAgICAgICAgIG1heGltdW06ICh0b29CaWcgPyBkZWYuZXhhY3RMZW5ndGgudmFsdWUgOiB1bmRlZmluZWQpLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZi5leGFjdExlbmd0aC5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubWluTGVuZ3RoICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmRhdGEubGVuZ3RoIDwgZGVmLm1pbkxlbmd0aC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX3NtYWxsLFxuICAgICAgICAgICAgICAgICAgICBtaW5pbXVtOiBkZWYubWluTGVuZ3RoLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWluTGVuZ3RoLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlZi5tYXhMZW5ndGggIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5sZW5ndGggPiBkZWYubWF4TGVuZ3RoLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fYmlnLFxuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtOiBkZWYubWF4TGVuZ3RoLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWF4TGVuZ3RoLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbLi4uY3R4LmRhdGFdLm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWYudHlwZS5fcGFyc2VBc3luYyhuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGkpKTtcbiAgICAgICAgICAgIH0pKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBbLi4uY3R4LmRhdGFdLm1hcCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRlZi50eXBlLl9wYXJzZVN5bmMobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGl0ZW0sIGN0eC5wYXRoLCBpKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdCk7XG4gICAgfVxuICAgIGdldCBlbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGU7XG4gICAgfVxuICAgIG1pbihtaW5MZW5ndGgsIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtaW5MZW5ndGg6IHsgdmFsdWU6IG1pbkxlbmd0aCwgbWVzc2FnZTogZXJyb3JVdGlsLnRvU3RyaW5nKG1lc3NhZ2UpIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtYXgobWF4TGVuZ3RoLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kQXJyYXkoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgbWF4TGVuZ3RoOiB7IHZhbHVlOiBtYXhMZW5ndGgsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbGVuZ3RoKGxlbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIGV4YWN0TGVuZ3RoOiB7IHZhbHVlOiBsZW4sIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgbm9uZW1wdHkobWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5taW4oMSwgbWVzc2FnZSk7XG4gICAgfVxufVxuWm9kQXJyYXkuY3JlYXRlID0gKHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RBcnJheSh7XG4gICAgICAgIHR5cGU6IHNjaGVtYSxcbiAgICAgICAgbWluTGVuZ3RoOiBudWxsLFxuICAgICAgICBtYXhMZW5ndGg6IG51bGwsXG4gICAgICAgIGV4YWN0TGVuZ3RoOiBudWxsLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEFycmF5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZnVuY3Rpb24gZGVlcFBhcnRpYWxpZnkoc2NoZW1hKSB7XG4gICAgaWYgKHNjaGVtYSBpbnN0YW5jZW9mIFpvZE9iamVjdCkge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEuc2hhcGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkU2NoZW1hID0gc2NoZW1hLnNoYXBlW2tleV07XG4gICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gWm9kT3B0aW9uYWwuY3JlYXRlKGRlZXBQYXJ0aWFsaWZ5KGZpZWxkU2NoZW1hKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4uc2NoZW1hLl9kZWYsXG4gICAgICAgICAgICBzaGFwZTogKCkgPT4gbmV3U2hhcGUsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChzY2hlbWEgaW5zdGFuY2VvZiBab2RBcnJheSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZEFycmF5KHtcbiAgICAgICAgICAgIC4uLnNjaGVtYS5fZGVmLFxuICAgICAgICAgICAgdHlwZTogZGVlcFBhcnRpYWxpZnkoc2NoZW1hLmVsZW1lbnQpLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kT3B0aW9uYWwpIHtcbiAgICAgICAgcmV0dXJuIFpvZE9wdGlvbmFsLmNyZWF0ZShkZWVwUGFydGlhbGlmeShzY2hlbWEudW53cmFwKCkpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kTnVsbGFibGUpIHtcbiAgICAgICAgcmV0dXJuIFpvZE51bGxhYmxlLmNyZWF0ZShkZWVwUGFydGlhbGlmeShzY2hlbWEudW53cmFwKCkpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoc2NoZW1hIGluc3RhbmNlb2YgWm9kVHVwbGUpIHtcbiAgICAgICAgcmV0dXJuIFpvZFR1cGxlLmNyZWF0ZShzY2hlbWEuaXRlbXMubWFwKChpdGVtKSA9PiBkZWVwUGFydGlhbGlmeShpdGVtKSkpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgWm9kT2JqZWN0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX2NhY2hlZCA9IG51bGw7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBJbiBtb3N0IGNhc2VzLCB0aGlzIGlzIG5vIGxvbmdlciBuZWVkZWQgLSB1bmtub3duIHByb3BlcnRpZXMgYXJlIG5vdyBzaWxlbnRseSBzdHJpcHBlZC5cbiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gcGFzcyB0aHJvdWdoIHVua25vd24gcHJvcGVydGllcywgdXNlIGAucGFzc3Rocm91Z2goKWAgaW5zdGVhZC5cbiAgICAgICAgICovXG4gICAgICAgIHRoaXMubm9uc3RyaWN0ID0gdGhpcy5wYXNzdGhyb3VnaDtcbiAgICAgICAgLy8gZXh0ZW5kPFxuICAgICAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlLFxuICAgICAgICAvLyAgIE5ld091dHB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBPdXRwdXRdOiBrIGV4dGVuZHMga2V5b2YgQXVnbWVudGF0aW9uXG4gICAgICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX291dHB1dFwiXVxuICAgICAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAgICAgLy8gICAgICAgPyBPdXRwdXRba11cbiAgICAgICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAgICAgLy8gICB9PixcbiAgICAgICAgLy8gICBOZXdJbnB1dCBleHRlbmRzIHV0aWwuZmxhdHRlbjx7XG4gICAgICAgIC8vICAgICBbayBpbiBrZXlvZiBBdWdtZW50YXRpb24gfCBrZXlvZiBJbnB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gICAgICAgPyBBdWdtZW50YXRpb25ba11bXCJfaW5wdXRcIl1cbiAgICAgICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAgICAgLy8gICAgICAgPyBJbnB1dFtrXVxuICAgICAgICAvLyAgICAgICA6IG5ldmVyO1xuICAgICAgICAvLyAgIH0+XG4gICAgICAgIC8vID4oXG4gICAgICAgIC8vICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAgICAgLy8gKTogWm9kT2JqZWN0PFxuICAgICAgICAvLyAgIGV4dGVuZFNoYXBlPFQsIEF1Z21lbnRhdGlvbj4sXG4gICAgICAgIC8vICAgVW5rbm93bktleXMsXG4gICAgICAgIC8vICAgQ2F0Y2hhbGwsXG4gICAgICAgIC8vICAgTmV3T3V0cHV0LFxuICAgICAgICAvLyAgIE5ld0lucHV0XG4gICAgICAgIC8vID4ge1xuICAgICAgICAvLyAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgLy8gICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgLy8gICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAvLyAgICAgICAuLi50aGlzLl9kZWYuc2hhcGUoKSxcbiAgICAgICAgLy8gICAgICAgLi4uYXVnbWVudGF0aW9uLFxuICAgICAgICAvLyAgICAgfSksXG4gICAgICAgIC8vICAgfSkgYXMgYW55O1xuICAgICAgICAvLyB9XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYC5leHRlbmRgIGluc3RlYWRcbiAgICAgICAgICogICovXG4gICAgICAgIHRoaXMuYXVnbWVudCA9IHRoaXMuZXh0ZW5kO1xuICAgIH1cbiAgICBfZ2V0Q2FjaGVkKCkge1xuICAgICAgICBpZiAodGhpcy5fY2FjaGVkICE9PSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZDtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLl9kZWYuc2hhcGUoKTtcbiAgICAgICAgY29uc3Qga2V5cyA9IHV0aWwub2JqZWN0S2V5cyhzaGFwZSk7XG4gICAgICAgIHRoaXMuX2NhY2hlZCA9IHsgc2hhcGUsIGtleXMgfTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZDtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHsgc2hhcGUsIGtleXM6IHNoYXBlS2V5cyB9ID0gdGhpcy5fZ2V0Q2FjaGVkKCk7XG4gICAgICAgIGNvbnN0IGV4dHJhS2V5cyA9IFtdO1xuICAgICAgICBpZiAoISh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBab2ROZXZlciAmJiB0aGlzLl9kZWYudW5rbm93bktleXMgPT09IFwic3RyaXBcIikpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGN0eC5kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzaGFwZUtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBleHRyYUtleXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYWlycyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBzaGFwZUtleXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleVZhbGlkYXRvciA9IHNoYXBlW2tleV07XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGN0eC5kYXRhW2tleV07XG4gICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBrZXk6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBrZXkgfSxcbiAgICAgICAgICAgICAgICB2YWx1ZToga2V5VmFsaWRhdG9yLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBrZXkpKSxcbiAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IGtleSBpbiBjdHguZGF0YSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9kZWYuY2F0Y2hhbGwgaW5zdGFuY2VvZiBab2ROZXZlcikge1xuICAgICAgICAgICAgY29uc3QgdW5rbm93bktleXMgPSB0aGlzLl9kZWYudW5rbm93bktleXM7XG4gICAgICAgICAgICBpZiAodW5rbm93bktleXMgPT09IFwicGFzc3Rocm91Z2hcIikge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGV4dHJhS2V5cykge1xuICAgICAgICAgICAgICAgICAgICBwYWlycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGtleSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHsgc3RhdHVzOiBcInZhbGlkXCIsIHZhbHVlOiBjdHguZGF0YVtrZXldIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHVua25vd25LZXlzID09PSBcInN0cmljdFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGV4dHJhS2V5cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnVucmVjb2duaXplZF9rZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5czogZXh0cmFLZXlzLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodW5rbm93bktleXMgPT09IFwic3RyaXBcIikge1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnRlcm5hbCBab2RPYmplY3QgZXJyb3I6IGludmFsaWQgdW5rbm93bktleXMgdmFsdWUuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBydW4gY2F0Y2hhbGwgdmFsaWRhdGlvblxuICAgICAgICAgICAgY29uc3QgY2F0Y2hhbGwgPSB0aGlzLl9kZWYuY2F0Y2hhbGw7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiBleHRyYUtleXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGN0eC5kYXRhW2tleV07XG4gICAgICAgICAgICAgICAgcGFpcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleTogeyBzdGF0dXM6IFwidmFsaWRcIiwgdmFsdWU6IGtleSB9LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY2F0Y2hhbGwuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCB2YWx1ZSwgY3R4LnBhdGgsIGtleSkgLy8sIGN0eC5jaGlsZChrZXkpLCB2YWx1ZSwgZ2V0UGFyc2VkVHlwZSh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBrZXkgaW4gY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzeW5jUGFpcnMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQgcGFpci5rZXk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcGFpci52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgc3luY1BhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHdheXNTZXQ6IHBhaXIuYWx3YXlzU2V0LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN5bmNQYWlycztcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHN5bmNQYWlycykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVN0YXR1cy5tZXJnZU9iamVjdFN5bmMoc3RhdHVzLCBzeW5jUGFpcnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBzaGFwZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5zaGFwZSgpO1xuICAgIH1cbiAgICBzdHJpY3QobWVzc2FnZSkge1xuICAgICAgICBlcnJvclV0aWwuZXJyVG9PYmo7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInN0cmljdFwiLFxuICAgICAgICAgICAgLi4uKG1lc3NhZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1hcDogKGlzc3VlLCBjdHgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRFcnJvciA9IHRoaXMuX2RlZi5lcnJvck1hcD8uKGlzc3VlLCBjdHgpLm1lc3NhZ2UgPz8gY3R4LmRlZmF1bHRFcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3N1ZS5jb2RlID09PSBcInVucmVjb2duaXplZF9rZXlzXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZXJyb3JVdGlsLmVyclRvT2JqKG1lc3NhZ2UpLm1lc3NhZ2UgPz8gZGVmYXVsdEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGRlZmF1bHRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc3RyaXAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwYXNzdGhyb3VnaCgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgdW5rbm93bktleXM6IFwicGFzc3Rocm91Z2hcIixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGNvbnN0IEF1Z21lbnRGYWN0b3J5ID1cbiAgICAvLyAgIDxEZWYgZXh0ZW5kcyBab2RPYmplY3REZWY+KGRlZjogRGVmKSA9PlxuICAgIC8vICAgPEF1Z21lbnRhdGlvbiBleHRlbmRzIFpvZFJhd1NoYXBlPihcbiAgICAvLyAgICAgYXVnbWVudGF0aW9uOiBBdWdtZW50YXRpb25cbiAgICAvLyAgICk6IFpvZE9iamVjdDxcbiAgICAvLyAgICAgZXh0ZW5kU2hhcGU8UmV0dXJuVHlwZTxEZWZbXCJzaGFwZVwiXT4sIEF1Z21lbnRhdGlvbj4sXG4gICAgLy8gICAgIERlZltcInVua25vd25LZXlzXCJdLFxuICAgIC8vICAgICBEZWZbXCJjYXRjaGFsbFwiXVxuICAgIC8vICAgPiA9PiB7XG4gICAgLy8gICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAvLyAgICAgICAuLi5kZWYsXG4gICAgLy8gICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgLy8gICAgICAgICAuLi5kZWYuc2hhcGUoKSxcbiAgICAvLyAgICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAvLyAgICAgICB9KSxcbiAgICAvLyAgICAgfSkgYXMgYW55O1xuICAgIC8vICAgfTtcbiAgICBleHRlbmQoYXVnbWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnRoaXMuX2RlZi5zaGFwZSgpLFxuICAgICAgICAgICAgICAgIC4uLmF1Z21lbnRhdGlvbixcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogUHJpb3IgdG8gem9kQDEuMC4xMiB0aGVyZSB3YXMgYSBidWcgaW4gdGhlXG4gICAgICogaW5mZXJyZWQgdHlwZSBvZiBtZXJnZWQgb2JqZWN0cy4gUGxlYXNlXG4gICAgICogdXBncmFkZSBpZiB5b3UgYXJlIGV4cGVyaWVuY2luZyBpc3N1ZXMuXG4gICAgICovXG4gICAgbWVyZ2UobWVyZ2luZykge1xuICAgICAgICBjb25zdCBtZXJnZWQgPSBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgICAgICAgICBjYXRjaGFsbDogbWVyZ2luZy5fZGVmLmNhdGNoYWxsLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+ICh7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICAgICAgLi4ubWVyZ2luZy5fZGVmLnNoYXBlKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG4gICAgLy8gbWVyZ2U8XG4gICAgLy8gICBJbmNvbWluZyBleHRlbmRzIEFueVpvZE9iamVjdCxcbiAgICAvLyAgIEF1Z21lbnRhdGlvbiBleHRlbmRzIEluY29taW5nW1wic2hhcGVcIl0sXG4gICAgLy8gICBOZXdPdXRwdXQgZXh0ZW5kcyB7XG4gICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIE91dHB1dF06IGsgZXh0ZW5kcyBrZXlvZiBBdWdtZW50YXRpb25cbiAgICAvLyAgICAgICA/IEF1Z21lbnRhdGlvbltrXVtcIl9vdXRwdXRcIl1cbiAgICAvLyAgICAgICA6IGsgZXh0ZW5kcyBrZXlvZiBPdXRwdXRcbiAgICAvLyAgICAgICA/IE91dHB1dFtrXVxuICAgIC8vICAgICAgIDogbmV2ZXI7XG4gICAgLy8gICB9LFxuICAgIC8vICAgTmV3SW5wdXQgZXh0ZW5kcyB7XG4gICAgLy8gICAgIFtrIGluIGtleW9mIEF1Z21lbnRhdGlvbiB8IGtleW9mIElucHV0XTogayBleHRlbmRzIGtleW9mIEF1Z21lbnRhdGlvblxuICAgIC8vICAgICAgID8gQXVnbWVudGF0aW9uW2tdW1wiX2lucHV0XCJdXG4gICAgLy8gICAgICAgOiBrIGV4dGVuZHMga2V5b2YgSW5wdXRcbiAgICAvLyAgICAgICA/IElucHV0W2tdXG4gICAgLy8gICAgICAgOiBuZXZlcjtcbiAgICAvLyAgIH1cbiAgICAvLyA+KFxuICAgIC8vICAgbWVyZ2luZzogSW5jb21pbmdcbiAgICAvLyApOiBab2RPYmplY3Q8XG4gICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcImNhdGNoYWxsXCJdLFxuICAgIC8vICAgTmV3T3V0cHV0LFxuICAgIC8vICAgTmV3SW5wdXRcbiAgICAvLyA+IHtcbiAgICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgLy8gICB9KSBhcyBhbnk7XG4gICAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAgIC8vIH1cbiAgICBzZXRLZXkoa2V5LCBzY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXVnbWVudCh7IFtrZXldOiBzY2hlbWEgfSk7XG4gICAgfVxuICAgIC8vIG1lcmdlPEluY29taW5nIGV4dGVuZHMgQW55Wm9kT2JqZWN0PihcbiAgICAvLyAgIG1lcmdpbmc6IEluY29taW5nXG4gICAgLy8gKTogLy9ab2RPYmplY3Q8VCAmIEluY29taW5nW1wiX3NoYXBlXCJdLCBVbmtub3duS2V5cywgQ2F0Y2hhbGw+ID0gKG1lcmdpbmcpID0+IHtcbiAgICAvLyBab2RPYmplY3Q8XG4gICAgLy8gICBleHRlbmRTaGFwZTxULCBSZXR1cm5UeXBlPEluY29taW5nW1wiX2RlZlwiXVtcInNoYXBlXCJdPj4sXG4gICAgLy8gICBJbmNvbWluZ1tcIl9kZWZcIl1bXCJ1bmtub3duS2V5c1wiXSxcbiAgICAvLyAgIEluY29taW5nW1wiX2RlZlwiXVtcImNhdGNoYWxsXCJdXG4gICAgLy8gPiB7XG4gICAgLy8gICAvLyBjb25zdCBtZXJnZWRTaGFwZSA9IG9iamVjdFV0aWwubWVyZ2VTaGFwZXMoXG4gICAgLy8gICAvLyAgIHRoaXMuX2RlZi5zaGFwZSgpLFxuICAgIC8vICAgLy8gICBtZXJnaW5nLl9kZWYuc2hhcGUoKVxuICAgIC8vICAgLy8gKTtcbiAgICAvLyAgIGNvbnN0IG1lcmdlZDogYW55ID0gbmV3IFpvZE9iamVjdCh7XG4gICAgLy8gICAgIHVua25vd25LZXlzOiBtZXJnaW5nLl9kZWYudW5rbm93bktleXMsXG4gICAgLy8gICAgIGNhdGNoYWxsOiBtZXJnaW5nLl9kZWYuY2F0Y2hhbGwsXG4gICAgLy8gICAgIHNoYXBlOiAoKSA9PlxuICAgIC8vICAgICAgIG9iamVjdFV0aWwubWVyZ2VTaGFwZXModGhpcy5fZGVmLnNoYXBlKCksIG1lcmdpbmcuX2RlZi5zaGFwZSgpKSxcbiAgICAvLyAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgLy8gICB9KSBhcyBhbnk7XG4gICAgLy8gICByZXR1cm4gbWVyZ2VkO1xuICAgIC8vIH1cbiAgICBjYXRjaGFsbChpbmRleCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZE9iamVjdCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBjYXRjaGFsbDogaW5kZXgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwaWNrKG1hc2spIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdXRpbC5vYmplY3RLZXlzKG1hc2spKSB7XG4gICAgICAgICAgICBpZiAobWFza1trZXldICYmIHRoaXMuc2hhcGVba2V5XSkge1xuICAgICAgICAgICAgICAgIHNoYXBlW2tleV0gPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgb21pdChtYXNrKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSkge1xuICAgICAgICAgICAgaWYgKCFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBzaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBzaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZGVlcFBhcnRpYWwoKSB7XG4gICAgICAgIHJldHVybiBkZWVwUGFydGlhbGlmeSh0aGlzKTtcbiAgICB9XG4gICAgcGFydGlhbChtYXNrKSB7XG4gICAgICAgIGNvbnN0IG5ld1NoYXBlID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHV0aWwub2JqZWN0S2V5cyh0aGlzLnNoYXBlKSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICBpZiAobWFzayAmJiAhbWFza1trZXldKSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IGZpZWxkU2NoZW1hLm9wdGlvbmFsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgc2hhcGU6ICgpID0+IG5ld1NoYXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVxdWlyZWQobWFzaykge1xuICAgICAgICBjb25zdCBuZXdTaGFwZSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkpIHtcbiAgICAgICAgICAgIGlmIChtYXNrICYmICFtYXNrW2tleV0pIHtcbiAgICAgICAgICAgICAgICBuZXdTaGFwZVtrZXldID0gdGhpcy5zaGFwZVtrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRTY2hlbWEgPSB0aGlzLnNoYXBlW2tleV07XG4gICAgICAgICAgICAgICAgbGV0IG5ld0ZpZWxkID0gZmllbGRTY2hlbWE7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG5ld0ZpZWxkIGluc3RhbmNlb2YgWm9kT3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3RmllbGQgPSBuZXdGaWVsZC5fZGVmLmlubmVyVHlwZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbmV3U2hhcGVba2V5XSA9IG5ld0ZpZWxkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHNoYXBlOiAoKSA9PiBuZXdTaGFwZSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGtleW9mKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlWm9kRW51bSh1dGlsLm9iamVjdEtleXModGhpcy5zaGFwZSkpO1xuICAgIH1cbn1cblpvZE9iamVjdC5jcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGU6ICgpID0+IHNoYXBlLFxuICAgICAgICB1bmtub3duS2V5czogXCJzdHJpcFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kT2JqZWN0LnN0cmljdENyZWF0ZSA9IChzaGFwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RPYmplY3Qoe1xuICAgICAgICBzaGFwZTogKCkgPT4gc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmljdFwiLFxuICAgICAgICBjYXRjaGFsbDogWm9kTmV2ZXIuY3JlYXRlKCksXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuWm9kT2JqZWN0LmxhenljcmVhdGUgPSAoc2hhcGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT2JqZWN0KHtcbiAgICAgICAgc2hhcGUsXG4gICAgICAgIHVua25vd25LZXlzOiBcInN0cmlwXCIsXG4gICAgICAgIGNhdGNoYWxsOiBab2ROZXZlci5jcmVhdGUoKSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RPYmplY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kVW5pb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLl9kZWYub3B0aW9ucztcbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUmVzdWx0cyhyZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyByZXR1cm4gZmlyc3QgaXNzdWUtZnJlZSB2YWxpZGF0aW9uIGlmIGl0IGV4aXN0c1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgaXNzdWVzIGZyb20gZGlydHkgb3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIGN0eC5jb21tb24uaXNzdWVzLnB1c2goLi4ucmVzdWx0LmN0eC5jb21tb24uaXNzdWVzKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmV0dXJuIGludmFsaWRcbiAgICAgICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4gbmV3IFpvZEVycm9yKHJlc3VsdC5jdHguY29tbW9uLmlzc3VlcykpO1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb24sXG4gICAgICAgICAgICAgICAgdW5pb25FcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwob3B0aW9ucy5tYXAoYXN5bmMgKG9wdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkQ3R4ID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jdHgsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3R4LmNvbW1vbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzc3VlczogW10sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogbnVsbCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdDogYXdhaXQgb3B0aW9uLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGNoaWxkQ3R4LFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgY3R4OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkpLnRoZW4oaGFuZGxlUmVzdWx0cyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZGlydHkgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBpc3N1ZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZEN0eCA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY3R4LFxuICAgICAgICAgICAgICAgICAgICBjb21tb246IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc3N1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRpb24uX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjaGlsZEN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJ2YWxpZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIiAmJiAhZGlydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlydHkgPSB7IHJlc3VsdCwgY3R4OiBjaGlsZEN0eCB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRDdHguY29tbW9uLmlzc3Vlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNzdWVzLnB1c2goY2hpbGRDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRpcnR5KSB7XG4gICAgICAgICAgICAgICAgY3R4LmNvbW1vbi5pc3N1ZXMucHVzaCguLi5kaXJ0eS5jdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRpcnR5LnJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHVuaW9uRXJyb3JzID0gaXNzdWVzLm1hcCgoaXNzdWVzKSA9PiBuZXcgWm9kRXJyb3IoaXNzdWVzKSk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF91bmlvbixcbiAgICAgICAgICAgICAgICB1bmlvbkVycm9ycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9ucztcbiAgICB9XG59XG5ab2RVbmlvbi5jcmVhdGUgPSAodHlwZXMsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kVW5pb24oe1xuICAgICAgICBvcHRpb25zOiB0eXBlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RVbmlvbixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8vLy8vLy9cbi8vLy8vLy8vLy8gICAgICBab2REaXNjcmltaW5hdGVkVW5pb24gICAgICAvLy8vLy8vLy8vXG4vLy8vLy8vLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5jb25zdCBnZXREaXNjcmltaW5hdG9yID0gKHR5cGUpID0+IHtcbiAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZExhenkpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS5zY2hlbWEpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kRWZmZWN0cykge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLmlubmVyVHlwZSgpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZExpdGVyYWwpIHtcbiAgICAgICAgcmV0dXJuIFt0eXBlLnZhbHVlXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZEVudW0pIHtcbiAgICAgICAgcmV0dXJuIHR5cGUub3B0aW9ucztcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE5hdGl2ZUVudW0pIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGJhbi9iYW5cbiAgICAgICAgcmV0dXJuIHV0aWwub2JqZWN0VmFsdWVzKHR5cGUuZW51bSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2REZWZhdWx0KSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUuX2RlZi5pbm5lclR5cGUpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kVW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE51bGwpIHtcbiAgICAgICAgcmV0dXJuIFtudWxsXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE9wdGlvbmFsKSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkLCAuLi5nZXREaXNjcmltaW5hdG9yKHR5cGUudW53cmFwKCkpXTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZSBpbnN0YW5jZW9mIFpvZE51bGxhYmxlKSB7XG4gICAgICAgIHJldHVybiBbbnVsbCwgLi4uZ2V0RGlzY3JpbWluYXRvcih0eXBlLnVud3JhcCgpKV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RCcmFuZGVkKSB7XG4gICAgICAgIHJldHVybiBnZXREaXNjcmltaW5hdG9yKHR5cGUudW53cmFwKCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgWm9kUmVhZG9ubHkpIHtcbiAgICAgICAgcmV0dXJuIGdldERpc2NyaW1pbmF0b3IodHlwZS51bndyYXAoKSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBab2RDYXRjaCkge1xuICAgICAgICByZXR1cm4gZ2V0RGlzY3JpbWluYXRvcih0eXBlLl9kZWYuaW5uZXJUeXBlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG59O1xuZXhwb3J0IGNsYXNzIFpvZERpc2NyaW1pbmF0ZWRVbmlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm9iamVjdCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5vYmplY3QsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yID0gdGhpcy5kaXNjcmltaW5hdG9yO1xuICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWUgPSBjdHguZGF0YVtkaXNjcmltaW5hdG9yXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uID0gdGhpcy5vcHRpb25zTWFwLmdldChkaXNjcmltaW5hdG9yVmFsdWUpO1xuICAgICAgICBpZiAoIW9wdGlvbikge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdW5pb25fZGlzY3JpbWluYXRvcixcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBBcnJheS5mcm9tKHRoaXMub3B0aW9uc01hcC5rZXlzKCkpLFxuICAgICAgICAgICAgICAgIHBhdGg6IFtkaXNjcmltaW5hdG9yXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb24uX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGRpc2NyaW1pbmF0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuZGlzY3JpbWluYXRvcjtcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IG9wdGlvbnNNYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYub3B0aW9uc01hcDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBkaXNjcmltaW5hdGVkIHVuaW9uIHNjaGVtYS4gSXRzIGJlaGF2aW91ciBpcyB2ZXJ5IHNpbWlsYXIgdG8gdGhhdCBvZiB0aGUgbm9ybWFsIHoudW5pb24oKSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBIb3dldmVyLCBpdCBvbmx5IGFsbG93cyBhIHVuaW9uIG9mIG9iamVjdHMsIGFsbCBvZiB3aGljaCBuZWVkIHRvIHNoYXJlIGEgZGlzY3JpbWluYXRvciBwcm9wZXJ0eS4gVGhpcyBwcm9wZXJ0eSBtdXN0XG4gICAgICogaGF2ZSBhIGRpZmZlcmVudCB2YWx1ZSBmb3IgZWFjaCBvYmplY3QgaW4gdGhlIHVuaW9uLlxuICAgICAqIEBwYXJhbSBkaXNjcmltaW5hdG9yIHRoZSBuYW1lIG9mIHRoZSBkaXNjcmltaW5hdG9yIHByb3BlcnR5XG4gICAgICogQHBhcmFtIHR5cGVzIGFuIGFycmF5IG9mIG9iamVjdCBzY2hlbWFzXG4gICAgICogQHBhcmFtIHBhcmFtc1xuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGUoZGlzY3JpbWluYXRvciwgb3B0aW9ucywgcGFyYW1zKSB7XG4gICAgICAgIC8vIEdldCBhbGwgdGhlIHZhbGlkIGRpc2NyaW1pbmF0b3IgdmFsdWVzXG4gICAgICAgIGNvbnN0IG9wdGlvbnNNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgIC8vIHRyeSB7XG4gICAgICAgIGZvciAoY29uc3QgdHlwZSBvZiBvcHRpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBkaXNjcmltaW5hdG9yVmFsdWVzID0gZ2V0RGlzY3JpbWluYXRvcih0eXBlLnNoYXBlW2Rpc2NyaW1pbmF0b3JdKTtcbiAgICAgICAgICAgIGlmICghZGlzY3JpbWluYXRvclZhbHVlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgZGlzY3JpbWluYXRvciB2YWx1ZSBmb3Iga2V5IFxcYCR7ZGlzY3JpbWluYXRvcn1cXGAgY291bGQgbm90IGJlIGV4dHJhY3RlZCBmcm9tIGFsbCBzY2hlbWEgb3B0aW9uc2ApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBkaXNjcmltaW5hdG9yVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNNYXAuaGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERpc2NyaW1pbmF0b3IgcHJvcGVydHkgJHtTdHJpbmcoZGlzY3JpbWluYXRvcil9IGhhcyBkdXBsaWNhdGUgdmFsdWUgJHtTdHJpbmcodmFsdWUpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBvcHRpb25zTWFwLnNldCh2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2REaXNjcmltaW5hdGVkVW5pb24oe1xuICAgICAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REaXNjcmltaW5hdGVkVW5pb24sXG4gICAgICAgICAgICBkaXNjcmltaW5hdG9yLFxuICAgICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnNNYXAsXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmZ1bmN0aW9uIG1lcmdlVmFsdWVzKGEsIGIpIHtcbiAgICBjb25zdCBhVHlwZSA9IGdldFBhcnNlZFR5cGUoYSk7XG4gICAgY29uc3QgYlR5cGUgPSBnZXRQYXJzZWRUeXBlKGIpO1xuICAgIGlmIChhID09PSBiKSB7XG4gICAgICAgIHJldHVybiB7IHZhbGlkOiB0cnVlLCBkYXRhOiBhIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKGFUeXBlID09PSBab2RQYXJzZWRUeXBlLm9iamVjdCAmJiBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5vYmplY3QpIHtcbiAgICAgICAgY29uc3QgYktleXMgPSB1dGlsLm9iamVjdEtleXMoYik7XG4gICAgICAgIGNvbnN0IHNoYXJlZEtleXMgPSB1dGlsLm9iamVjdEtleXMoYSkuZmlsdGVyKChrZXkpID0+IGJLZXlzLmluZGV4T2Yoa2V5KSAhPT0gLTEpO1xuICAgICAgICBjb25zdCBuZXdPYmogPSB7IC4uLmEsIC4uLmIgfTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2Ygc2hhcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhhW2tleV0sIGJba2V5XSk7XG4gICAgICAgICAgICBpZiAoIXNoYXJlZFZhbHVlLnZhbGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXdPYmpba2V5XSA9IHNoYXJlZFZhbHVlLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IHRydWUsIGRhdGE6IG5ld09iaiB9O1xuICAgIH1cbiAgICBlbHNlIGlmIChhVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5hcnJheSAmJiBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5hcnJheSkge1xuICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4geyB2YWxpZDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdBcnJheSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1BID0gYVtpbmRleF07XG4gICAgICAgICAgICBjb25zdCBpdGVtQiA9IGJbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3Qgc2hhcmVkVmFsdWUgPSBtZXJnZVZhbHVlcyhpdGVtQSwgaXRlbUIpO1xuICAgICAgICAgICAgaWYgKCFzaGFyZWRWYWx1ZS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbGlkOiBmYWxzZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmV3QXJyYXkucHVzaChzaGFyZWRWYWx1ZS5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogbmV3QXJyYXkgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoYVR5cGUgPT09IFpvZFBhcnNlZFR5cGUuZGF0ZSAmJiBiVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5kYXRlICYmICthID09PSArYikge1xuICAgICAgICByZXR1cm4geyB2YWxpZDogdHJ1ZSwgZGF0YTogYSB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsaWQ6IGZhbHNlIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIFpvZEludGVyc2VjdGlvbiBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBoYW5kbGVQYXJzZWQgPSAocGFyc2VkTGVmdCwgcGFyc2VkUmlnaHQpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0Fib3J0ZWQocGFyc2VkTGVmdCkgfHwgaXNBYm9ydGVkKHBhcnNlZFJpZ2h0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVyZ2VkID0gbWVyZ2VWYWx1ZXMocGFyc2VkTGVmdC52YWx1ZSwgcGFyc2VkUmlnaHQudmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFtZXJnZWQudmFsaWQpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfaW50ZXJzZWN0aW9uX3R5cGVzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRGlydHkocGFyc2VkTGVmdCkgfHwgaXNEaXJ0eShwYXJzZWRSaWdodCkpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogbWVyZ2VkLmRhdGEgfTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5fZGVmLmxlZnQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuX2RlZi5yaWdodC5fcGFyc2VBc3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBdKS50aGVuKChbbGVmdCwgcmlnaHRdKSA9PiBoYW5kbGVQYXJzZWQobGVmdCwgcmlnaHQpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVQYXJzZWQodGhpcy5fZGVmLmxlZnQuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgICAgICB9KSwgdGhpcy5fZGVmLnJpZ2h0Ll9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGN0eC5kYXRhLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuWm9kSW50ZXJzZWN0aW9uLmNyZWF0ZSA9IChsZWZ0LCByaWdodCwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RJbnRlcnNlY3Rpb24oe1xuICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICByaWdodDogcmlnaHQsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kSW50ZXJzZWN0aW9uLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8gdHlwZSBab2RUdXBsZUl0ZW1zID0gW1pvZFR5cGVBbnksIC4uLlpvZFR5cGVBbnlbXV07XG5leHBvcnQgY2xhc3MgWm9kVHVwbGUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLmFycmF5KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLmFycmF5LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGN0eC5kYXRhLmxlbmd0aCA8IHRoaXMuX2RlZi5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS50b29fc21hbGwsXG4gICAgICAgICAgICAgICAgbWluaW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzdCA9IHRoaXMuX2RlZi5yZXN0O1xuICAgICAgICBpZiAoIXJlc3QgJiYgY3R4LmRhdGEubGVuZ3RoID4gdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19iaWcsXG4gICAgICAgICAgICAgICAgbWF4aW11bTogdGhpcy5fZGVmLml0ZW1zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBpbmNsdXNpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbXMgPSBbLi4uY3R4LmRhdGFdXG4gICAgICAgICAgICAubWFwKChpdGVtLCBpdGVtSW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuX2RlZi5pdGVtc1tpdGVtSW5kZXhdIHx8IHRoaXMuX2RlZi5yZXN0O1xuICAgICAgICAgICAgaWYgKCFzY2hlbWEpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gc2NoZW1hLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGl0ZW1JbmRleCkpO1xuICAgICAgICB9KVxuICAgICAgICAgICAgLmZpbHRlcigoeCkgPT4gISF4KTsgLy8gZmlsdGVyIG51bGxzXG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoaXRlbXMpLnRoZW4oKHJlc3VsdHMpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIHJlc3VsdHMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VBcnJheShzdGF0dXMsIGl0ZW1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXRlbXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaXRlbXM7XG4gICAgfVxuICAgIHJlc3QocmVzdCkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFR1cGxlKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIHJlc3QsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblpvZFR1cGxlLmNyZWF0ZSA9IChzY2hlbWFzLCBwYXJhbXMpID0+IHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoc2NoZW1hcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiWW91IG11c3QgcGFzcyBhbiBhcnJheSBvZiBzY2hlbWFzIHRvIHoudHVwbGUoWyAuLi4gXSlcIik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgWm9kVHVwbGUoe1xuICAgICAgICBpdGVtczogc2NoZW1hcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RUdXBsZSxcbiAgICAgICAgcmVzdDogbnVsbCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RSZWNvcmQgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBnZXQga2V5U2NoZW1hKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgfVxuICAgIGdldCB2YWx1ZVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgfVxuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IHN0YXR1cywgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUub2JqZWN0KSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm9iamVjdCxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhaXJzID0gW107XG4gICAgICAgIGNvbnN0IGtleVR5cGUgPSB0aGlzLl9kZWYua2V5VHlwZTtcbiAgICAgICAgY29uc3QgdmFsdWVUeXBlID0gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gY3R4LmRhdGEpIHtcbiAgICAgICAgICAgIHBhaXJzLnB1c2goe1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIGtleSkpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVR5cGUuX3BhcnNlKG5ldyBQYXJzZUlucHV0TGF6eVBhdGgoY3R4LCBjdHguZGF0YVtrZXldLCBjdHgucGF0aCwga2V5KSksXG4gICAgICAgICAgICAgICAgYWx3YXlzU2V0OiBrZXkgaW4gY3R4LmRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgcmV0dXJuIFBhcnNlU3RhdHVzLm1lcmdlT2JqZWN0QXN5bmMoc3RhdHVzLCBwYWlycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUGFyc2VTdGF0dXMubWVyZ2VPYmplY3RTeW5jKHN0YXR1cywgcGFpcnMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBlbGVtZW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlVHlwZTtcbiAgICB9XG4gICAgc3RhdGljIGNyZWF0ZShmaXJzdCwgc2Vjb25kLCB0aGlyZCkge1xuICAgICAgICBpZiAoc2Vjb25kIGluc3RhbmNlb2YgWm9kVHlwZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICAgICAgICAgIGtleVR5cGU6IGZpcnN0LFxuICAgICAgICAgICAgICAgIHZhbHVlVHlwZTogc2Vjb25kLFxuICAgICAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLFxuICAgICAgICAgICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXModGhpcmQpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBab2RSZWNvcmQoe1xuICAgICAgICAgICAga2V5VHlwZTogWm9kU3RyaW5nLmNyZWF0ZSgpLFxuICAgICAgICAgICAgdmFsdWVUeXBlOiBmaXJzdCxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUmVjb3JkLFxuICAgICAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhzZWNvbmQpLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgWm9kTWFwIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IGtleVNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5rZXlUeXBlO1xuICAgIH1cbiAgICBnZXQgdmFsdWVTY2hlbWEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWVUeXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLm1hcCkge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5tYXAsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBrZXlUeXBlID0gdGhpcy5fZGVmLmtleVR5cGU7XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGNvbnN0IHBhaXJzID0gWy4uLmN0eC5kYXRhLmVudHJpZXMoKV0ubWFwKChba2V5LCB2YWx1ZV0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGtleToga2V5VHlwZS5fcGFyc2UobmV3IFBhcnNlSW5wdXRMYXp5UGF0aChjdHgsIGtleSwgY3R4LnBhdGgsIFtpbmRleCwgXCJrZXlcIl0pKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgdmFsdWUsIGN0eC5wYXRoLCBbaW5kZXgsIFwidmFsdWVcIl0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYykge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWlyIG9mIHBhaXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGF3YWl0IHBhaXIua2V5O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImFib3J0ZWRcIiB8fCB2YWx1ZS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXR1cyA9PT0gXCJkaXJ0eVwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmaW5hbE1hcC5zZXQoa2V5LnZhbHVlLCB2YWx1ZS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgZmluYWxNYXAgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhaXIgb2YgcGFpcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBwYWlyLmtleTtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhaXIudmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGtleS5zdGF0dXMgPT09IFwiYWJvcnRlZFwiIHx8IHZhbHVlLnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhdHVzID09PSBcImRpcnR5XCIgfHwgdmFsdWUuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZpbmFsTWFwLnNldChrZXkudmFsdWUsIHZhbHVlLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogZmluYWxNYXAgfTtcbiAgICAgICAgfVxuICAgIH1cbn1cblpvZE1hcC5jcmVhdGUgPSAoa2V5VHlwZSwgdmFsdWVUeXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZE1hcCh7XG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAga2V5VHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RNYXAsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kU2V0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgc3RhdHVzLCBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5zZXQpIHtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX3R5cGUsXG4gICAgICAgICAgICAgICAgZXhwZWN0ZWQ6IFpvZFBhcnNlZFR5cGUuc2V0LFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVmID0gdGhpcy5fZGVmO1xuICAgICAgICBpZiAoZGVmLm1pblNpemUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChjdHguZGF0YS5zaXplIDwgZGVmLm1pblNpemUudmFsdWUpIHtcbiAgICAgICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLnRvb19zbWFsbCxcbiAgICAgICAgICAgICAgICAgICAgbWluaW11bTogZGVmLm1pblNpemUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWluU2l6ZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChkZWYubWF4U2l6ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGN0eC5kYXRhLnNpemUgPiBkZWYubWF4U2l6ZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUudG9vX2JpZyxcbiAgICAgICAgICAgICAgICAgICAgbWF4aW11bTogZGVmLm1heFNpemUudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic2V0XCIsXG4gICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZXhhY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBkZWYubWF4U2l6ZS5tZXNzYWdlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHRoaXMuX2RlZi52YWx1ZVR5cGU7XG4gICAgICAgIGZ1bmN0aW9uIGZpbmFsaXplU2V0KGVsZW1lbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWRTZXQgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmRpcnR5KCk7XG4gICAgICAgICAgICAgICAgcGFyc2VkU2V0LmFkZChlbGVtZW50LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogcGFyc2VkU2V0IH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbLi4uY3R4LmRhdGEudmFsdWVzKCldLm1hcCgoaXRlbSwgaSkgPT4gdmFsdWVUeXBlLl9wYXJzZShuZXcgUGFyc2VJbnB1dExhenlQYXRoKGN0eCwgaXRlbSwgY3R4LnBhdGgsIGkpKSk7XG4gICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoZWxlbWVudHMpLnRoZW4oKGVsZW1lbnRzKSA9PiBmaW5hbGl6ZVNldChlbGVtZW50cykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmFsaXplU2V0KGVsZW1lbnRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBtaW4obWluU2l6ZSwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBtaW5TaXplOiB7IHZhbHVlOiBtaW5TaXplLCBtZXNzYWdlOiBlcnJvclV0aWwudG9TdHJpbmcobWVzc2FnZSkgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIG1heChtYXhTaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kU2V0KHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIG1heFNpemU6IHsgdmFsdWU6IG1heFNpemUsIG1lc3NhZ2U6IGVycm9yVXRpbC50b1N0cmluZyhtZXNzYWdlKSB9LFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgc2l6ZShzaXplLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1pbihzaXplLCBtZXNzYWdlKS5tYXgoc2l6ZSwgbWVzc2FnZSk7XG4gICAgfVxuICAgIG5vbmVtcHR5KG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWluKDEsIG1lc3NhZ2UpO1xuICAgIH1cbn1cblpvZFNldC5jcmVhdGUgPSAodmFsdWVUeXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFNldCh7XG4gICAgICAgIHZhbHVlVHlwZSxcbiAgICAgICAgbWluU2l6ZTogbnVsbCxcbiAgICAgICAgbWF4U2l6ZTogbnVsbCxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RTZXQsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kRnVuY3Rpb24gZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHRoaXMuaW1wbGVtZW50O1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5mdW5jdGlvbikge1xuICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCB7XG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogWm9kUGFyc2VkVHlwZS5mdW5jdGlvbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIG1ha2VBcmdzSXNzdWUoYXJncywgZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBtYWtlSXNzdWUoe1xuICAgICAgICAgICAgICAgIGRhdGE6IGFyZ3MsXG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXBzOiBbY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAsIGN0eC5zY2hlbWFFcnJvck1hcCwgZ2V0RXJyb3JNYXAoKSwgZGVmYXVsdEVycm9yTWFwXS5maWx0ZXIoKHgpID0+ICEheCksXG4gICAgICAgICAgICAgICAgaXNzdWVEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGU6IFpvZElzc3VlQ29kZS5pbnZhbGlkX2FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzRXJyb3I6IGVycm9yLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBmdW5jdGlvbiBtYWtlUmV0dXJuc0lzc3VlKHJldHVybnMsIGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWFrZUlzc3VlKHtcbiAgICAgICAgICAgICAgICBkYXRhOiByZXR1cm5zLFxuICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgIGVycm9yTWFwczogW2N0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLCBjdHguc2NoZW1hRXJyb3JNYXAsIGdldEVycm9yTWFwKCksIGRlZmF1bHRFcnJvck1hcF0uZmlsdGVyKCh4KSA9PiAhIXgpLFxuICAgICAgICAgICAgICAgIGlzc3VlRGF0YToge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9yZXR1cm5fdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZUVycm9yOiBlcnJvcixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyYW1zID0geyBlcnJvck1hcDogY3R4LmNvbW1vbi5jb250ZXh0dWFsRXJyb3JNYXAgfTtcbiAgICAgICAgY29uc3QgZm4gPSBjdHguZGF0YTtcbiAgICAgICAgaWYgKHRoaXMuX2RlZi5yZXR1cm5zIGluc3RhbmNlb2YgWm9kUHJvbWlzZSkge1xuICAgICAgICAgICAgLy8gV291bGQgbG92ZSBhIHdheSB0byBhdm9pZCBkaXNhYmxpbmcgdGhpcyBydWxlLCBidXQgd2UgbmVlZFxuICAgICAgICAgICAgLy8gYW4gYWxpYXMgKHVzaW5nIGFuIGFycm93IGZ1bmN0aW9uIHdhcyB3aGF0IGNhdXNlZCAyNjUxKS5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhc1xuICAgICAgICAgICAgY29uc3QgbWUgPSB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIE9LKGFzeW5jIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgWm9kRXJyb3IoW10pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZEFyZ3MgPSBhd2FpdCBtZS5fZGVmLmFyZ3MucGFyc2VBc3luYyhhcmdzLCBwYXJhbXMpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmFkZElzc3VlKG1ha2VBcmdzSXNzdWUoYXJncywgZSkpO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzLCBwYXJzZWRBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRSZXR1cm5zID0gYXdhaXQgbWUuX2RlZi5yZXR1cm5zLl9kZWYudHlwZVxuICAgICAgICAgICAgICAgICAgICAucGFyc2VBc3luYyhyZXN1bHQsIHBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGVycm9yLmFkZElzc3VlKG1ha2VSZXR1cm5zSXNzdWUocmVzdWx0LCBlKSk7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZWRSZXR1cm5zO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBXb3VsZCBsb3ZlIGEgd2F5IHRvIGF2b2lkIGRpc2FibGluZyB0aGlzIHJ1bGUsIGJ1dCB3ZSBuZWVkXG4gICAgICAgICAgICAvLyBhbiBhbGlhcyAodXNpbmcgYW4gYXJyb3cgZnVuY3Rpb24gd2FzIHdoYXQgY2F1c2VkIDI2NTEpLlxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby10aGlzLWFsaWFzXG4gICAgICAgICAgICBjb25zdCBtZSA9IHRoaXM7XG4gICAgICAgICAgICByZXR1cm4gT0soZnVuY3Rpb24gKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRBcmdzID0gbWUuX2RlZi5hcmdzLnNhZmVQYXJzZShhcmdzLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGlmICghcGFyc2VkQXJncy5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBab2RFcnJvcihbbWFrZUFyZ3NJc3N1ZShhcmdzLCBwYXJzZWRBcmdzLmVycm9yKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBSZWZsZWN0LmFwcGx5KGZuLCB0aGlzLCBwYXJzZWRBcmdzLmRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFJldHVybnMgPSBtZS5fZGVmLnJldHVybnMuc2FmZVBhcnNlKHJlc3VsdCwgcGFyYW1zKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZFJldHVybnMuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWm9kRXJyb3IoW21ha2VSZXR1cm5zSXNzdWUocmVzdWx0LCBwYXJzZWRSZXR1cm5zLmVycm9yKV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VkUmV0dXJucy5kYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcGFyYW1ldGVycygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5hcmdzO1xuICAgIH1cbiAgICByZXR1cm5UeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnJldHVybnM7XG4gICAgfVxuICAgIGFyZ3MoLi4uaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICBhcmdzOiBab2RUdXBsZS5jcmVhdGUoaXRlbXMpLnJlc3QoWm9kVW5rbm93bi5jcmVhdGUoKSksXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm5zKHJldHVyblR5cGUpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RGdW5jdGlvbih7XG4gICAgICAgICAgICAuLi50aGlzLl9kZWYsXG4gICAgICAgICAgICByZXR1cm5zOiByZXR1cm5UeXBlLFxuICAgICAgICB9KTtcbiAgICB9XG4gICAgaW1wbGVtZW50KGZ1bmMpIHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVkRnVuYyA9IHRoaXMucGFyc2UoZnVuYyk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0ZWRGdW5jO1xuICAgIH1cbiAgICBzdHJpY3RJbXBsZW1lbnQoZnVuYykge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZWRGdW5jID0gdGhpcy5wYXJzZShmdW5jKTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRlZEZ1bmM7XG4gICAgfVxuICAgIHN0YXRpYyBjcmVhdGUoYXJncywgcmV0dXJucywgcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBuZXcgWm9kRnVuY3Rpb24oe1xuICAgICAgICAgICAgYXJnczogKGFyZ3MgPyBhcmdzIDogWm9kVHVwbGUuY3JlYXRlKFtdKS5yZXN0KFpvZFVua25vd24uY3JlYXRlKCkpKSxcbiAgICAgICAgICAgIHJldHVybnM6IHJldHVybnMgfHwgWm9kVW5rbm93bi5jcmVhdGUoKSxcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRnVuY3Rpb24sXG4gICAgICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBab2RMYXp5IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgZ2V0IHNjaGVtYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5nZXR0ZXIoKTtcbiAgICB9XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBsYXp5U2NoZW1hID0gdGhpcy5fZGVmLmdldHRlcigpO1xuICAgICAgICByZXR1cm4gbGF6eVNjaGVtYS5fcGFyc2UoeyBkYXRhOiBjdHguZGF0YSwgcGF0aDogY3R4LnBhdGgsIHBhcmVudDogY3R4IH0pO1xuICAgIH1cbn1cblpvZExhenkuY3JlYXRlID0gKGdldHRlciwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RMYXp5KHtcbiAgICAgICAgZ2V0dGVyOiBnZXR0ZXIsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kTGF6eSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RMaXRlcmFsIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGlmIChpbnB1dC5kYXRhICE9PSB0aGlzLl9kZWYudmFsdWUpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9saXRlcmFsLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB0aGlzLl9kZWYudmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudmFsdWU7XG4gICAgfVxufVxuWm9kTGl0ZXJhbC5jcmVhdGUgPSAodmFsdWUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTGl0ZXJhbCh7XG4gICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RMaXRlcmFsLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZnVuY3Rpb24gY3JlYXRlWm9kRW51bSh2YWx1ZXMsIHBhcmFtcykge1xuICAgIHJldHVybiBuZXcgWm9kRW51bSh7XG4gICAgICAgIHZhbHVlcyxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFbnVtLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59XG5leHBvcnQgY2xhc3MgWm9kRW51bSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBpZiAodHlwZW9mIGlucHV0LmRhdGEgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdGhpcy5fZGVmLnZhbHVlcztcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiB1dGlsLmpvaW5WYWx1ZXMoZXhwZWN0ZWRWYWx1ZXMpLFxuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHgucGFyc2VkVHlwZSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWNoZSA9IG5ldyBTZXQodGhpcy5fZGVmLnZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZS5oYXMoaW5wdXQuZGF0YSkpIHtcbiAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdGhpcy5fZGVmLnZhbHVlcztcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgICB9XG4gICAgZ2V0IGVudW0oKSB7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5fZGVmLnZhbHVlcykge1xuICAgICAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnVtVmFsdWVzO1xuICAgIH1cbiAgICBnZXQgVmFsdWVzKCkge1xuICAgICAgICBjb25zdCBlbnVtVmFsdWVzID0ge307XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHRoaXMuX2RlZi52YWx1ZXMpIHtcbiAgICAgICAgICAgIGVudW1WYWx1ZXNbdmFsXSA9IHZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZW51bVZhbHVlcztcbiAgICB9XG4gICAgZ2V0IEVudW0oKSB7XG4gICAgICAgIGNvbnN0IGVudW1WYWx1ZXMgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdGhpcy5fZGVmLnZhbHVlcykge1xuICAgICAgICAgICAgZW51bVZhbHVlc1t2YWxdID0gdmFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbnVtVmFsdWVzO1xuICAgIH1cbiAgICBleHRyYWN0KHZhbHVlcywgbmV3RGVmID0gdGhpcy5fZGVmKSB7XG4gICAgICAgIHJldHVybiBab2RFbnVtLmNyZWF0ZSh2YWx1ZXMsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZixcbiAgICAgICAgICAgIC4uLm5ld0RlZixcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGV4Y2x1ZGUodmFsdWVzLCBuZXdEZWYgPSB0aGlzLl9kZWYpIHtcbiAgICAgICAgcmV0dXJuIFpvZEVudW0uY3JlYXRlKHRoaXMub3B0aW9ucy5maWx0ZXIoKG9wdCkgPT4gIXZhbHVlcy5pbmNsdWRlcyhvcHQpKSwge1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmLFxuICAgICAgICAgICAgLi4ubmV3RGVmLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5ab2RFbnVtLmNyZWF0ZSA9IGNyZWF0ZVpvZEVudW07XG5leHBvcnQgY2xhc3MgWm9kTmF0aXZlRW51bSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCBuYXRpdmVFbnVtVmFsdWVzID0gdXRpbC5nZXRWYWxpZEVudW1WYWx1ZXModGhpcy5fZGVmLnZhbHVlcyk7XG4gICAgICAgIGNvbnN0IGN0eCA9IHRoaXMuX2dldE9yUmV0dXJuQ3R4KGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5wYXJzZWRUeXBlICE9PSBab2RQYXJzZWRUeXBlLnN0cmluZyAmJiBjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5udW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVmFsdWVzID0gdXRpbC5vYmplY3RWYWx1ZXMobmF0aXZlRW51bVZhbHVlcyk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBleHBlY3RlZDogdXRpbC5qb2luVmFsdWVzKGV4cGVjdGVkVmFsdWVzKSxcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICAgICAgY29kZTogWm9kSXNzdWVDb2RlLmludmFsaWRfdHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLl9jYWNoZSkge1xuICAgICAgICAgICAgdGhpcy5fY2FjaGUgPSBuZXcgU2V0KHV0aWwuZ2V0VmFsaWRFbnVtVmFsdWVzKHRoaXMuX2RlZi52YWx1ZXMpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2NhY2hlLmhhcyhpbnB1dC5kYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwZWN0ZWRWYWx1ZXMgPSB1dGlsLm9iamVjdFZhbHVlcyhuYXRpdmVFbnVtVmFsdWVzKTtcbiAgICAgICAgICAgIGFkZElzc3VlVG9Db250ZXh0KGN0eCwge1xuICAgICAgICAgICAgICAgIHJlY2VpdmVkOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF9lbnVtX3ZhbHVlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGV4cGVjdGVkVmFsdWVzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gT0soaW5wdXQuZGF0YSk7XG4gICAgfVxuICAgIGdldCBlbnVtKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnZhbHVlcztcbiAgICB9XG59XG5ab2ROYXRpdmVFbnVtLmNyZWF0ZSA9ICh2YWx1ZXMsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kTmF0aXZlRW51bSh7XG4gICAgICAgIHZhbHVlczogdmFsdWVzLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hdGl2ZUVudW0sXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kUHJvbWlzZSBleHRlbmRzIFpvZFR5cGUge1xuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi50eXBlO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBjdHggfSA9IHRoaXMuX3Byb2Nlc3NJbnB1dFBhcmFtcyhpbnB1dCk7XG4gICAgICAgIGlmIChjdHgucGFyc2VkVHlwZSAhPT0gWm9kUGFyc2VkVHlwZS5wcm9taXNlICYmIGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLnByb21pc2UsXG4gICAgICAgICAgICAgICAgcmVjZWl2ZWQ6IGN0eC5wYXJzZWRUeXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9taXNpZmllZCA9IGN0eC5wYXJzZWRUeXBlID09PSBab2RQYXJzZWRUeXBlLnByb21pc2UgPyBjdHguZGF0YSA6IFByb21pc2UucmVzb2x2ZShjdHguZGF0YSk7XG4gICAgICAgIHJldHVybiBPSyhwcm9taXNpZmllZC50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnR5cGUucGFyc2VBc3luYyhkYXRhLCB7XG4gICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgZXJyb3JNYXA6IGN0eC5jb21tb24uY29udGV4dHVhbEVycm9yTWFwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcbiAgICB9XG59XG5ab2RQcm9taXNlLmNyZWF0ZSA9IChzY2hlbWEsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kUHJvbWlzZSh7XG4gICAgICAgIHR5cGU6IHNjaGVtYSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RQcm9taXNlLFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuZXhwb3J0IGNsYXNzIFpvZEVmZmVjdHMgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBpbm5lclR5cGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hO1xuICAgIH1cbiAgICBzb3VyY2VUeXBlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLnNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRWZmZWN0c1xuICAgICAgICAgICAgPyB0aGlzLl9kZWYuc2NoZW1hLnNvdXJjZVR5cGUoKVxuICAgICAgICAgICAgOiB0aGlzLl9kZWYuc2NoZW1hO1xuICAgIH1cbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgY29uc3QgZWZmZWN0ID0gdGhpcy5fZGVmLmVmZmVjdCB8fCBudWxsO1xuICAgICAgICBjb25zdCBjaGVja0N0eCA9IHtcbiAgICAgICAgICAgIGFkZElzc3VlOiAoYXJnKSA9PiB7XG4gICAgICAgICAgICAgICAgYWRkSXNzdWVUb0NvbnRleHQoY3R4LCBhcmcpO1xuICAgICAgICAgICAgICAgIGlmIChhcmcuZmF0YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzLmFib3J0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IHBhdGgoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN0eC5wYXRoO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgY2hlY2tDdHguYWRkSXNzdWUgPSBjaGVja0N0eC5hZGRJc3N1ZS5iaW5kKGNoZWNrQ3R4KTtcbiAgICAgICAgaWYgKGVmZmVjdC50eXBlID09PSBcInByZXByb2Nlc3NcIikge1xuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc2VkID0gZWZmZWN0LnRyYW5zZm9ybShjdHguZGF0YSwgY2hlY2tDdHgpO1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHByb2Nlc3NlZCkudGhlbihhc3luYyAocHJvY2Vzc2VkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmFsdWUgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcHJvY2Vzc2VkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmFsdWUgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBESVJUWShyZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlZi5zY2hlbWEuX3BhcnNlU3luYyh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHByb2Nlc3NlZCxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZGlydHlcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERJUlRZKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXR1cy52YWx1ZSA9PT0gXCJkaXJ0eVwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSVFkocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChlZmZlY3QudHlwZSA9PT0gXCJyZWZpbmVtZW50XCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGVSZWZpbmVtZW50ID0gKGFjYykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGVmZmVjdC5yZWZpbmVtZW50KGFjYywgY2hlY2tDdHgpO1xuICAgICAgICAgICAgICAgIGlmIChjdHguY29tbW9uLmFzeW5jKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXN5bmMgcmVmaW5lbWVudCBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC5cIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXIgPSB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZVN5bmMoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChpbm5lci5zdGF0dXMgPT09IFwiYWJvcnRlZFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDtcbiAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBpcyBpZ25vcmVkXG4gICAgICAgICAgICAgICAgZXhlY3V0ZVJlZmluZW1lbnQoaW5uZXIudmFsdWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5uZXIudmFsdWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KS50aGVuKChpbm5lcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXIuc3RhdHVzID09PSBcImRpcnR5XCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGVSZWZpbmVtZW50KGlubmVyLnZhbHVlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHN0YXR1czogc3RhdHVzLnZhbHVlLCB2YWx1ZTogaW5uZXIudmFsdWUgfTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVmZmVjdC50eXBlID09PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICAgICAgICBpZiAoY3R4LmNvbW1vbi5hc3luYyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gdGhpcy5fZGVmLnNjaGVtYS5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIWlzVmFsaWQoYmFzZSkpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGVmZmVjdC50cmFuc2Zvcm0oYmFzZS52YWx1ZSwgY2hlY2tDdHgpO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXN5bmNocm9ub3VzIHRyYW5zZm9ybSBlbmNvdW50ZXJlZCBkdXJpbmcgc3luY2hyb25vdXMgcGFyc2Ugb3BlcmF0aW9uLiBVc2UgLnBhcnNlQXN5bmMgaW5zdGVhZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBzdGF0dXMudmFsdWUsIHZhbHVlOiByZXN1bHQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWYuc2NoZW1hLl9wYXJzZUFzeW5jKHsgZGF0YTogY3R4LmRhdGEsIHBhdGg6IGN0eC5wYXRoLCBwYXJlbnQ6IGN0eCB9KS50aGVuKChiYXNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNWYWxpZChiYXNlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGVmZmVjdC50cmFuc2Zvcm0oYmFzZS52YWx1ZSwgY2hlY2tDdHgpKS50aGVuKChyZXN1bHQpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1dGlsLmFzc2VydE5ldmVyKGVmZmVjdCk7XG4gICAgfVxufVxuWm9kRWZmZWN0cy5jcmVhdGUgPSAoc2NoZW1hLCBlZmZlY3QsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRWZmZWN0cyh7XG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICAgICAgICBlZmZlY3QsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5ab2RFZmZlY3RzLmNyZWF0ZVdpdGhQcmVwcm9jZXNzID0gKHByZXByb2Nlc3MsIHNjaGVtYSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2RFZmZlY3RzKHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBlZmZlY3Q6IHsgdHlwZTogXCJwcmVwcm9jZXNzXCIsIHRyYW5zZm9ybTogcHJlcHJvY2VzcyB9LFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgeyBab2RFZmZlY3RzIGFzIFpvZFRyYW5zZm9ybWVyIH07XG5leHBvcnQgY2xhc3MgWm9kT3B0aW9uYWwgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS51bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBPSyh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgfVxuICAgIHVud3JhcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGU7XG4gICAgfVxufVxuWm9kT3B0aW9uYWwuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kT3B0aW9uYWwoe1xuICAgICAgICBpbm5lclR5cGU6IHR5cGUsXG4gICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kTnVsbGFibGUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVHlwZSA9IHRoaXMuX2dldFR5cGUoaW5wdXQpO1xuICAgICAgICBpZiAocGFyc2VkVHlwZSA9PT0gWm9kUGFyc2VkVHlwZS5udWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gT0sobnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKGlucHV0KTtcbiAgICB9XG4gICAgdW53cmFwKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmLmlubmVyVHlwZTtcbiAgICB9XG59XG5ab2ROdWxsYWJsZS5jcmVhdGUgPSAodHlwZSwgcGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROdWxsYWJsZSh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2ROdWxsYWJsZSxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2REZWZhdWx0IGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBsZXQgZGF0YSA9IGN0eC5kYXRhO1xuICAgICAgICBpZiAoY3R4LnBhcnNlZFR5cGUgPT09IFpvZFBhcnNlZFR5cGUudW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBkYXRhID0gdGhpcy5fZGVmLmRlZmF1bHRWYWx1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZSh7XG4gICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgcGF0aDogY3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJlbW92ZURlZmF1bHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZERlZmF1bHQuY3JlYXRlID0gKHR5cGUsIHBhcmFtcykgPT4ge1xuICAgIHJldHVybiBuZXcgWm9kRGVmYXVsdCh7XG4gICAgICAgIGlubmVyVHlwZTogdHlwZSxcbiAgICAgICAgdHlwZU5hbWU6IFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgICAgICBkZWZhdWx0VmFsdWU6IHR5cGVvZiBwYXJhbXMuZGVmYXVsdCA9PT0gXCJmdW5jdGlvblwiID8gcGFyYW1zLmRlZmF1bHQgOiAoKSA9PiBwYXJhbXMuZGVmYXVsdCxcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjbGFzcyBab2RDYXRjaCBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCB7IGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgLy8gbmV3Q3R4IGlzIHVzZWQgdG8gbm90IGNvbGxlY3QgaXNzdWVzIGZyb20gaW5uZXIgdHlwZXMgaW4gY3R4XG4gICAgICAgIGNvbnN0IG5ld0N0eCA9IHtcbiAgICAgICAgICAgIC4uLmN0eCxcbiAgICAgICAgICAgIGNvbW1vbjoge1xuICAgICAgICAgICAgICAgIC4uLmN0eC5jb21tb24sXG4gICAgICAgICAgICAgICAgaXNzdWVzOiBbXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2RlZi5pbm5lclR5cGUuX3BhcnNlKHtcbiAgICAgICAgICAgIGRhdGE6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgcGF0aDogbmV3Q3R4LnBhdGgsXG4gICAgICAgICAgICBwYXJlbnQ6IHtcbiAgICAgICAgICAgICAgICAuLi5uZXdDdHgsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGlzQXN5bmMocmVzdWx0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwidmFsaWRcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdC5zdGF0dXMgPT09IFwidmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5fZGVmLmNhdGNoVmFsdWUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCBlcnJvcigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDogbmV3Q3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogXCJ2YWxpZFwiLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQuc3RhdHVzID09PSBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLl9kZWYuY2F0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXQgZXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBab2RFcnJvcihuZXdDdHguY29tbW9uLmlzc3Vlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IG5ld0N0eC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVtb3ZlQ2F0Y2goKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZENhdGNoLmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZENhdGNoKHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZENhdGNoLFxuICAgICAgICBjYXRjaFZhbHVlOiB0eXBlb2YgcGFyYW1zLmNhdGNoID09PSBcImZ1bmN0aW9uXCIgPyBwYXJhbXMuY2F0Y2ggOiAoKSA9PiBwYXJhbXMuY2F0Y2gsXG4gICAgICAgIC4uLnByb2Nlc3NDcmVhdGVQYXJhbXMocGFyYW1zKSxcbiAgICB9KTtcbn07XG5leHBvcnQgY2xhc3MgWm9kTmFOIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFR5cGUgPSB0aGlzLl9nZXRUeXBlKGlucHV0KTtcbiAgICAgICAgaWYgKHBhcnNlZFR5cGUgIT09IFpvZFBhcnNlZFR5cGUubmFuKSB7XG4gICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzLl9nZXRPclJldHVybkN0eChpbnB1dCk7XG4gICAgICAgICAgICBhZGRJc3N1ZVRvQ29udGV4dChjdHgsIHtcbiAgICAgICAgICAgICAgICBjb2RlOiBab2RJc3N1ZUNvZGUuaW52YWxpZF90eXBlLFxuICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBab2RQYXJzZWRUeXBlLm5hbixcbiAgICAgICAgICAgICAgICByZWNlaXZlZDogY3R4LnBhcnNlZFR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBJTlZBTElEO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHN0YXR1czogXCJ2YWxpZFwiLCB2YWx1ZTogaW5wdXQuZGF0YSB9O1xuICAgIH1cbn1cblpvZE5hTi5jcmVhdGUgPSAocGFyYW1zKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBab2ROYU4oe1xuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE5hTixcbiAgICAgICAgLi4ucHJvY2Vzc0NyZWF0ZVBhcmFtcyhwYXJhbXMpLFxuICAgIH0pO1xufTtcbmV4cG9ydCBjb25zdCBCUkFORCA9IFN5bWJvbChcInpvZF9icmFuZFwiKTtcbmV4cG9ydCBjbGFzcyBab2RCcmFuZGVkIGV4dGVuZHMgWm9kVHlwZSB7XG4gICAgX3BhcnNlKGlucHV0KSB7XG4gICAgICAgIGNvbnN0IHsgY3R4IH0gPSB0aGlzLl9wcm9jZXNzSW5wdXRQYXJhbXMoaW5wdXQpO1xuICAgICAgICBjb25zdCBkYXRhID0gY3R4LmRhdGE7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZS5fcGFyc2Uoe1xuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgcGFyZW50OiBjdHgsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYudHlwZTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgWm9kUGlwZWxpbmUgZXh0ZW5kcyBab2RUeXBlIHtcbiAgICBfcGFyc2UoaW5wdXQpIHtcbiAgICAgICAgY29uc3QgeyBzdGF0dXMsIGN0eCB9ID0gdGhpcy5fcHJvY2Vzc0lucHV0UGFyYW1zKGlucHV0KTtcbiAgICAgICAgaWYgKGN0eC5jb21tb24uYXN5bmMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZUFzeW5jID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluUmVzdWx0ID0gYXdhaXQgdGhpcy5fZGVmLmluLl9wYXJzZUFzeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogY3R4LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImFib3J0ZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJkaXJ0eVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cy5kaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRElSVFkoaW5SZXN1bHQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlZi5vdXQuX3BhcnNlQXN5bmMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogY3R4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFzeW5jKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBpblJlc3VsdCA9IHRoaXMuX2RlZi5pbi5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICBkYXRhOiBjdHguZGF0YSxcbiAgICAgICAgICAgICAgICBwYXRoOiBjdHgucGF0aCxcbiAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0LnN0YXR1cyA9PT0gXCJhYm9ydGVkXCIpXG4gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHQuc3RhdHVzID09PSBcImRpcnR5XCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMuZGlydHkoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IFwiZGlydHlcIixcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGluUmVzdWx0LnZhbHVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmLm91dC5fcGFyc2VTeW5jKHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaW5SZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHBhdGg6IGN0eC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQ6IGN0eCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzdGF0aWMgY3JlYXRlKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBab2RQaXBlbGluZSh7XG4gICAgICAgICAgICBpbjogYSxcbiAgICAgICAgICAgIG91dDogYixcbiAgICAgICAgICAgIHR5cGVOYW1lOiBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kUGlwZWxpbmUsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbmV4cG9ydCBjbGFzcyBab2RSZWFkb25seSBleHRlbmRzIFpvZFR5cGUge1xuICAgIF9wYXJzZShpbnB1dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLl9kZWYuaW5uZXJUeXBlLl9wYXJzZShpbnB1dCk7XG4gICAgICAgIGNvbnN0IGZyZWV6ZSA9IChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZChkYXRhKSkge1xuICAgICAgICAgICAgICAgIGRhdGEudmFsdWUgPSBPYmplY3QuZnJlZXplKGRhdGEudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc0FzeW5jKHJlc3VsdCkgPyByZXN1bHQudGhlbigoZGF0YSkgPT4gZnJlZXplKGRhdGEpKSA6IGZyZWV6ZShyZXN1bHQpO1xuICAgIH1cbiAgICB1bndyYXAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kZWYuaW5uZXJUeXBlO1xuICAgIH1cbn1cblpvZFJlYWRvbmx5LmNyZWF0ZSA9ICh0eXBlLCBwYXJhbXMpID0+IHtcbiAgICByZXR1cm4gbmV3IFpvZFJlYWRvbmx5KHtcbiAgICAgICAgaW5uZXJUeXBlOiB0eXBlLFxuICAgICAgICB0eXBlTmFtZTogWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZFJlYWRvbmx5LFxuICAgICAgICAuLi5wcm9jZXNzQ3JlYXRlUGFyYW1zKHBhcmFtcyksXG4gICAgfSk7XG59O1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgIHouY3VzdG9tICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLyAgICAgICAgICAgICAgICAgICAgLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuZnVuY3Rpb24gY2xlYW5QYXJhbXMocGFyYW1zLCBkYXRhKSB7XG4gICAgY29uc3QgcCA9IHR5cGVvZiBwYXJhbXMgPT09IFwiZnVuY3Rpb25cIiA/IHBhcmFtcyhkYXRhKSA6IHR5cGVvZiBwYXJhbXMgPT09IFwic3RyaW5nXCIgPyB7IG1lc3NhZ2U6IHBhcmFtcyB9IDogcGFyYW1zO1xuICAgIGNvbnN0IHAyID0gdHlwZW9mIHAgPT09IFwic3RyaW5nXCIgPyB7IG1lc3NhZ2U6IHAgfSA6IHA7XG4gICAgcmV0dXJuIHAyO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGN1c3RvbShjaGVjaywgX3BhcmFtcyA9IHt9LCBcbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqXG4gKiBQYXNzIGBmYXRhbGAgaW50byB0aGUgcGFyYW1zIG9iamVjdCBpbnN0ZWFkOlxuICpcbiAqIGBgYHRzXG4gKiB6LnN0cmluZygpLmN1c3RvbSgodmFsKSA9PiB2YWwubGVuZ3RoID4gNSwgeyBmYXRhbDogZmFsc2UgfSlcbiAqIGBgYFxuICpcbiAqL1xuZmF0YWwpIHtcbiAgICBpZiAoY2hlY2spXG4gICAgICAgIHJldHVybiBab2RBbnkuY3JlYXRlKCkuc3VwZXJSZWZpbmUoKGRhdGEsIGN0eCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgciA9IGNoZWNrKGRhdGEpO1xuICAgICAgICAgICAgaWYgKHIgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHIudGhlbigocikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGNsZWFuUGFyYW1zKF9wYXJhbXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX2ZhdGFsID0gcGFyYW1zLmZhdGFsID8/IGZhdGFsID8/IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdHguYWRkSXNzdWUoeyBjb2RlOiBcImN1c3RvbVwiLCAuLi5wYXJhbXMsIGZhdGFsOiBfZmF0YWwgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGNsZWFuUGFyYW1zKF9wYXJhbXMsIGRhdGEpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9mYXRhbCA9IHBhcmFtcy5mYXRhbCA/PyBmYXRhbCA/PyB0cnVlO1xuICAgICAgICAgICAgICAgIGN0eC5hZGRJc3N1ZSh7IGNvZGU6IFwiY3VzdG9tXCIsIC4uLnBhcmFtcywgZmF0YWw6IF9mYXRhbCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIFpvZEFueS5jcmVhdGUoKTtcbn1cbmV4cG9ydCB7IFpvZFR5cGUgYXMgU2NoZW1hLCBab2RUeXBlIGFzIFpvZFNjaGVtYSB9O1xuZXhwb3J0IGNvbnN0IGxhdGUgPSB7XG4gICAgb2JqZWN0OiBab2RPYmplY3QubGF6eWNyZWF0ZSxcbn07XG5leHBvcnQgdmFyIFpvZEZpcnN0UGFydHlUeXBlS2luZDtcbihmdW5jdGlvbiAoWm9kRmlyc3RQYXJ0eVR5cGVLaW5kKSB7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kU3RyaW5nXCJdID0gXCJab2RTdHJpbmdcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdW1iZXJcIl0gPSBcIlpvZE51bWJlclwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE5hTlwiXSA9IFwiWm9kTmFOXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQmlnSW50XCJdID0gXCJab2RCaWdJbnRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCb29sZWFuXCJdID0gXCJab2RCb29sZWFuXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGF0ZVwiXSA9IFwiWm9kRGF0ZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFN5bWJvbFwiXSA9IFwiWm9kU3ltYm9sXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5kZWZpbmVkXCJdID0gXCJab2RVbmRlZmluZWRcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROdWxsXCJdID0gXCJab2ROdWxsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kQW55XCJdID0gXCJab2RBbnlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RVbmtub3duXCJdID0gXCJab2RVbmtub3duXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTmV2ZXJcIl0gPSBcIlpvZE5ldmVyXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVm9pZFwiXSA9IFwiWm9kVm9pZFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEFycmF5XCJdID0gXCJab2RBcnJheVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZE9iamVjdFwiXSA9IFwiWm9kT2JqZWN0XCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kVW5pb25cIl0gPSBcIlpvZFVuaW9uXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGlzY3JpbWluYXRlZFVuaW9uXCJdID0gXCJab2REaXNjcmltaW5hdGVkVW5pb25cIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RJbnRlcnNlY3Rpb25cIl0gPSBcIlpvZEludGVyc2VjdGlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFR1cGxlXCJdID0gXCJab2RUdXBsZVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFJlY29yZFwiXSA9IFwiWm9kUmVjb3JkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTWFwXCJdID0gXCJab2RNYXBcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RTZXRcIl0gPSBcIlpvZFNldFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEZ1bmN0aW9uXCJdID0gXCJab2RGdW5jdGlvblwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZExhenlcIl0gPSBcIlpvZExhenlcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RMaXRlcmFsXCJdID0gXCJab2RMaXRlcmFsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRW51bVwiXSA9IFwiWm9kRW51bVwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZEVmZmVjdHNcIl0gPSBcIlpvZEVmZmVjdHNcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2ROYXRpdmVFbnVtXCJdID0gXCJab2ROYXRpdmVFbnVtXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kT3B0aW9uYWxcIl0gPSBcIlpvZE9wdGlvbmFsXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kTnVsbGFibGVcIl0gPSBcIlpvZE51bGxhYmxlXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kRGVmYXVsdFwiXSA9IFwiWm9kRGVmYXVsdFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZENhdGNoXCJdID0gXCJab2RDYXRjaFwiO1xuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZFtcIlpvZFByb21pc2VcIl0gPSBcIlpvZFByb21pc2VcIjtcbiAgICBab2RGaXJzdFBhcnR5VHlwZUtpbmRbXCJab2RCcmFuZGVkXCJdID0gXCJab2RCcmFuZGVkXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUGlwZWxpbmVcIl0gPSBcIlpvZFBpcGVsaW5lXCI7XG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kW1wiWm9kUmVhZG9ubHlcIl0gPSBcIlpvZFJlYWRvbmx5XCI7XG59KShab2RGaXJzdFBhcnR5VHlwZUtpbmQgfHwgKFpvZEZpcnN0UGFydHlUeXBlS2luZCA9IHt9KSk7XG4vLyByZXF1aXJlcyBUUyA0LjQrXG5jbGFzcyBDbGFzcyB7XG4gICAgY29uc3RydWN0b3IoLi4uXykgeyB9XG59XG5jb25zdCBpbnN0YW5jZU9mVHlwZSA9IChcbi8vIGNvbnN0IGluc3RhbmNlT2ZUeXBlID0gPFQgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnk+KFxuY2xzLCBwYXJhbXMgPSB7XG4gICAgbWVzc2FnZTogYElucHV0IG5vdCBpbnN0YW5jZSBvZiAke2Nscy5uYW1lfWAsXG59KSA9PiBjdXN0b20oKGRhdGEpID0+IGRhdGEgaW5zdGFuY2VvZiBjbHMsIHBhcmFtcyk7XG5jb25zdCBzdHJpbmdUeXBlID0gWm9kU3RyaW5nLmNyZWF0ZTtcbmNvbnN0IG51bWJlclR5cGUgPSBab2ROdW1iZXIuY3JlYXRlO1xuY29uc3QgbmFuVHlwZSA9IFpvZE5hTi5jcmVhdGU7XG5jb25zdCBiaWdJbnRUeXBlID0gWm9kQmlnSW50LmNyZWF0ZTtcbmNvbnN0IGJvb2xlYW5UeXBlID0gWm9kQm9vbGVhbi5jcmVhdGU7XG5jb25zdCBkYXRlVHlwZSA9IFpvZERhdGUuY3JlYXRlO1xuY29uc3Qgc3ltYm9sVHlwZSA9IFpvZFN5bWJvbC5jcmVhdGU7XG5jb25zdCB1bmRlZmluZWRUeXBlID0gWm9kVW5kZWZpbmVkLmNyZWF0ZTtcbmNvbnN0IG51bGxUeXBlID0gWm9kTnVsbC5jcmVhdGU7XG5jb25zdCBhbnlUeXBlID0gWm9kQW55LmNyZWF0ZTtcbmNvbnN0IHVua25vd25UeXBlID0gWm9kVW5rbm93bi5jcmVhdGU7XG5jb25zdCBuZXZlclR5cGUgPSBab2ROZXZlci5jcmVhdGU7XG5jb25zdCB2b2lkVHlwZSA9IFpvZFZvaWQuY3JlYXRlO1xuY29uc3QgYXJyYXlUeXBlID0gWm9kQXJyYXkuY3JlYXRlO1xuY29uc3Qgb2JqZWN0VHlwZSA9IFpvZE9iamVjdC5jcmVhdGU7XG5jb25zdCBzdHJpY3RPYmplY3RUeXBlID0gWm9kT2JqZWN0LnN0cmljdENyZWF0ZTtcbmNvbnN0IHVuaW9uVHlwZSA9IFpvZFVuaW9uLmNyZWF0ZTtcbmNvbnN0IGRpc2NyaW1pbmF0ZWRVbmlvblR5cGUgPSBab2REaXNjcmltaW5hdGVkVW5pb24uY3JlYXRlO1xuY29uc3QgaW50ZXJzZWN0aW9uVHlwZSA9IFpvZEludGVyc2VjdGlvbi5jcmVhdGU7XG5jb25zdCB0dXBsZVR5cGUgPSBab2RUdXBsZS5jcmVhdGU7XG5jb25zdCByZWNvcmRUeXBlID0gWm9kUmVjb3JkLmNyZWF0ZTtcbmNvbnN0IG1hcFR5cGUgPSBab2RNYXAuY3JlYXRlO1xuY29uc3Qgc2V0VHlwZSA9IFpvZFNldC5jcmVhdGU7XG5jb25zdCBmdW5jdGlvblR5cGUgPSBab2RGdW5jdGlvbi5jcmVhdGU7XG5jb25zdCBsYXp5VHlwZSA9IFpvZExhenkuY3JlYXRlO1xuY29uc3QgbGl0ZXJhbFR5cGUgPSBab2RMaXRlcmFsLmNyZWF0ZTtcbmNvbnN0IGVudW1UeXBlID0gWm9kRW51bS5jcmVhdGU7XG5jb25zdCBuYXRpdmVFbnVtVHlwZSA9IFpvZE5hdGl2ZUVudW0uY3JlYXRlO1xuY29uc3QgcHJvbWlzZVR5cGUgPSBab2RQcm9taXNlLmNyZWF0ZTtcbmNvbnN0IGVmZmVjdHNUeXBlID0gWm9kRWZmZWN0cy5jcmVhdGU7XG5jb25zdCBvcHRpb25hbFR5cGUgPSBab2RPcHRpb25hbC5jcmVhdGU7XG5jb25zdCBudWxsYWJsZVR5cGUgPSBab2ROdWxsYWJsZS5jcmVhdGU7XG5jb25zdCBwcmVwcm9jZXNzVHlwZSA9IFpvZEVmZmVjdHMuY3JlYXRlV2l0aFByZXByb2Nlc3M7XG5jb25zdCBwaXBlbGluZVR5cGUgPSBab2RQaXBlbGluZS5jcmVhdGU7XG5jb25zdCBvc3RyaW5nID0gKCkgPT4gc3RyaW5nVHlwZSgpLm9wdGlvbmFsKCk7XG5jb25zdCBvbnVtYmVyID0gKCkgPT4gbnVtYmVyVHlwZSgpLm9wdGlvbmFsKCk7XG5jb25zdCBvYm9vbGVhbiA9ICgpID0+IGJvb2xlYW5UeXBlKCkub3B0aW9uYWwoKTtcbmV4cG9ydCBjb25zdCBjb2VyY2UgPSB7XG4gICAgc3RyaW5nOiAoKGFyZykgPT4gWm9kU3RyaW5nLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbiAgICBudW1iZXI6ICgoYXJnKSA9PiBab2ROdW1iZXIuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxuICAgIGJvb2xlYW46ICgoYXJnKSA9PiBab2RCb29sZWFuLmNyZWF0ZSh7XG4gICAgICAgIC4uLmFyZyxcbiAgICAgICAgY29lcmNlOiB0cnVlLFxuICAgIH0pKSxcbiAgICBiaWdpbnQ6ICgoYXJnKSA9PiBab2RCaWdJbnQuY3JlYXRlKHsgLi4uYXJnLCBjb2VyY2U6IHRydWUgfSkpLFxuICAgIGRhdGU6ICgoYXJnKSA9PiBab2REYXRlLmNyZWF0ZSh7IC4uLmFyZywgY29lcmNlOiB0cnVlIH0pKSxcbn07XG5leHBvcnQgeyBhbnlUeXBlIGFzIGFueSwgYXJyYXlUeXBlIGFzIGFycmF5LCBiaWdJbnRUeXBlIGFzIGJpZ2ludCwgYm9vbGVhblR5cGUgYXMgYm9vbGVhbiwgZGF0ZVR5cGUgYXMgZGF0ZSwgZGlzY3JpbWluYXRlZFVuaW9uVHlwZSBhcyBkaXNjcmltaW5hdGVkVW5pb24sIGVmZmVjdHNUeXBlIGFzIGVmZmVjdCwgZW51bVR5cGUgYXMgZW51bSwgZnVuY3Rpb25UeXBlIGFzIGZ1bmN0aW9uLCBpbnN0YW5jZU9mVHlwZSBhcyBpbnN0YW5jZW9mLCBpbnRlcnNlY3Rpb25UeXBlIGFzIGludGVyc2VjdGlvbiwgbGF6eVR5cGUgYXMgbGF6eSwgbGl0ZXJhbFR5cGUgYXMgbGl0ZXJhbCwgbWFwVHlwZSBhcyBtYXAsIG5hblR5cGUgYXMgbmFuLCBuYXRpdmVFbnVtVHlwZSBhcyBuYXRpdmVFbnVtLCBuZXZlclR5cGUgYXMgbmV2ZXIsIG51bGxUeXBlIGFzIG51bGwsIG51bGxhYmxlVHlwZSBhcyBudWxsYWJsZSwgbnVtYmVyVHlwZSBhcyBudW1iZXIsIG9iamVjdFR5cGUgYXMgb2JqZWN0LCBvYm9vbGVhbiwgb251bWJlciwgb3B0aW9uYWxUeXBlIGFzIG9wdGlvbmFsLCBvc3RyaW5nLCBwaXBlbGluZVR5cGUgYXMgcGlwZWxpbmUsIHByZXByb2Nlc3NUeXBlIGFzIHByZXByb2Nlc3MsIHByb21pc2VUeXBlIGFzIHByb21pc2UsIHJlY29yZFR5cGUgYXMgcmVjb3JkLCBzZXRUeXBlIGFzIHNldCwgc3RyaWN0T2JqZWN0VHlwZSBhcyBzdHJpY3RPYmplY3QsIHN0cmluZ1R5cGUgYXMgc3RyaW5nLCBzeW1ib2xUeXBlIGFzIHN5bWJvbCwgZWZmZWN0c1R5cGUgYXMgdHJhbnNmb3JtZXIsIHR1cGxlVHlwZSBhcyB0dXBsZSwgdW5kZWZpbmVkVHlwZSBhcyB1bmRlZmluZWQsIHVuaW9uVHlwZSBhcyB1bmlvbiwgdW5rbm93blR5cGUgYXMgdW5rbm93biwgdm9pZFR5cGUgYXMgdm9pZCwgfTtcbmV4cG9ydCBjb25zdCBORVZFUiA9IElOVkFMSUQ7XG4iXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/zod/v3/types.js\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./src/app/globals.css":
/*!*****************************!*\
  !*** ./src/app/globals.css ***!
  \*****************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"34a2860e0bfd\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLGNBQWM7QUFDN0IsSUFBSSxJQUFVLElBQUksaUJBQWlCIiwic291cmNlcyI6WyIvaG9tZS93c2x4dC9jczQ3Mi9mYXJjYXN0ZXIvc3JjL2FwcC9nbG9iYWxzLmNzcyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcIjM0YTI4NjBlMGJmZFwiXG5pZiAobW9kdWxlLmhvdCkgeyBtb2R1bGUuaG90LmFjY2VwdCgpIH1cbiJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/globals.css\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./src/app/providers.tsx":
/*!*******************************!*\
  !*** ./src/app/providers.tsx ***!
  \*******************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   Providers: () => (/* binding */ Providers)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/dynamic */ \"(app-pages-browser)/./node_modules/next/dist/api/app-dynamic.js\");\n/* harmony import */ var _neynar_react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @neynar/react */ \"(app-pages-browser)/./node_modules/@neynar/react/dist/bundle.es.js\");\n/* harmony import */ var _components_providers_SafeFarcasterSolanaProvider__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ~/components/providers/SafeFarcasterSolanaProvider */ \"(app-pages-browser)/./src/components/providers/SafeFarcasterSolanaProvider.tsx\");\n/* harmony import */ var _lib_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ~/lib/constants */ \"(app-pages-browser)/./src/lib/constants.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ Providers auto */ \n\n\n\n\nconst WagmiProvider = (0,next_dynamic__WEBPACK_IMPORTED_MODULE_1__[\"default\"])(()=>__webpack_require__.e(/*! import() */ \"_app-pages-browser_src_components_providers_WagmiProvider_tsx\").then(__webpack_require__.bind(__webpack_require__, /*! ~/components/providers/WagmiProvider */ \"(app-pages-browser)/./src/components/providers/WagmiProvider.tsx\")), {\n    loadableGenerated: {\n        modules: [\n            \"app/providers.tsx -> \" + \"~/components/providers/WagmiProvider\"\n        ]\n    },\n    ssr: false\n});\n_c = WagmiProvider;\nfunction Providers(param) {\n    let { children } = param;\n    const solanaEndpoint = process.env.SOLANA_RPC_ENDPOINT || 'https://solana-rpc.publicnode.com';\n    return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(WagmiProvider, {\n        children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_neynar_react__WEBPACK_IMPORTED_MODULE_2__.MiniAppProvider, {\n            analyticsEnabled: _lib_constants__WEBPACK_IMPORTED_MODULE_4__.ANALYTICS_ENABLED,\n            backButtonEnabled: true,\n            returnUrl: _lib_constants__WEBPACK_IMPORTED_MODULE_4__.RETURN_URL,\n            children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_providers_SafeFarcasterSolanaProvider__WEBPACK_IMPORTED_MODULE_3__.SafeFarcasterSolanaProvider, {\n                endpoint: solanaEndpoint,\n                children: children\n            }, void 0, false, {\n                fileName: \"/home/wslxt/cs472/farcaster/src/app/providers.tsx\",\n                lineNumber: 29,\n                columnNumber: 9\n            }, this)\n        }, void 0, false, {\n            fileName: \"/home/wslxt/cs472/farcaster/src/app/providers.tsx\",\n            lineNumber: 24,\n            columnNumber: 7\n        }, this)\n    }, void 0, false, {\n        fileName: \"/home/wslxt/cs472/farcaster/src/app/providers.tsx\",\n        lineNumber: 23,\n        columnNumber: 5\n    }, this);\n}\n_c1 = Providers;\nvar _c, _c1;\n$RefreshReg$(_c, \"WagmiProvider\");\n$RefreshReg$(_c1, \"Providers\");\n\n\n;\n    // Wrapped in an IIFE to avoid polluting the global scope\n    ;\n    (function () {\n        var _a, _b;\n        // Legacy CSS implementations will `eval` browser code in a Node.js context\n        // to extract CSS. For backwards compatibility, we need to check we're in a\n        // browser context before continuing.\n        if (typeof self !== 'undefined' &&\n            // AMP / No-JS mode does not inject these helpers:\n            '$RefreshHelpers$' in self) {\n            // @ts-ignore __webpack_module__ is global\n            var currentExports = module.exports;\n            // @ts-ignore __webpack_module__ is global\n            var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n            // This cannot happen in MainTemplate because the exports mismatch between\n            // templating and execution.\n            self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n            // A module can be accepted automatically based on its exports, e.g. when\n            // it is a Refresh Boundary.\n            if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n                // Save the previous exports signature on update so we can compare the boundary\n                // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n                module.hot.dispose(function (data) {\n                    data.prevSignature =\n                        self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n                });\n                // Unconditionally accept an update to this module, we'll check if it's\n                // still a Refresh Boundary later.\n                // @ts-ignore importMeta is replaced in the loader\n                module.hot.accept();\n                // This field is set when the previous version of this module was a\n                // Refresh Boundary, letting us know we need to check for invalidation or\n                // enqueue an update.\n                if (prevSignature !== null) {\n                    // A boundary can become ineligible if its exports are incompatible\n                    // with the previous exports.\n                    //\n                    // For example, if you add/remove/change exports, we'll want to\n                    // re-execute the importing modules, and force those components to\n                    // re-render. Similarly, if you convert a class component to a\n                    // function, we want to invalidate the boundary.\n                    if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n                        module.hot.invalidate();\n                    }\n                    else {\n                        self.$RefreshHelpers$.scheduleUpdate();\n                    }\n                }\n            }\n            else {\n                // Since we just executed the code for the module, it's possible that the\n                // new exports made it ineligible for being a boundary.\n                // We only care about the case when we were _previously_ a boundary,\n                // because we already accepted this update (accidental side effect).\n                var isNoLongerABoundary = prevSignature !== null;\n                if (isNoLongerABoundary) {\n                    module.hot.invalidate();\n                }\n            }\n        }\n    })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9hcHAvcHJvdmlkZXJzLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUVtQztBQUNhO0FBQ2lEO0FBQ2pDO0FBRWhFLE1BQU1LLGdCQUFnQkwsd0RBQU9BLENBQzNCLElBQU0sMFFBQThDOzs7Ozs7SUFFbERNLEtBQUs7O0tBSEhEO0FBT0MsU0FBU0UsVUFBVSxLQUl6QjtRQUp5QixFQUN4QkMsUUFBUSxFQUdULEdBSnlCO0lBS3hCLE1BQU1DLGlCQUNKQyxPQUFPQSxDQUFDQyxHQUFHLENBQUNDLG1CQUFtQixJQUFJO0lBQ3JDLHFCQUNFLDhEQUFDUDtrQkFDQyw0RUFBQ0osMERBQWVBO1lBQ2RZLGtCQUFrQlYsNkRBQWlCQTtZQUNuQ1csbUJBQW1CO1lBQ25CQyxXQUFXWCxzREFBVUE7c0JBRXJCLDRFQUFDRiwwR0FBMkJBO2dCQUFDYyxVQUFVUDswQkFDcENEOzs7Ozs7Ozs7Ozs7Ozs7O0FBS1g7TUFwQmdCRCIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL3NyYy9hcHAvcHJvdmlkZXJzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCBkeW5hbWljIGZyb20gJ25leHQvZHluYW1pYyc7XG5pbXBvcnQgeyBNaW5pQXBwUHJvdmlkZXIgfSBmcm9tICdAbmV5bmFyL3JlYWN0JztcbmltcG9ydCB7IFNhZmVGYXJjYXN0ZXJTb2xhbmFQcm92aWRlciB9IGZyb20gJ34vY29tcG9uZW50cy9wcm92aWRlcnMvU2FmZUZhcmNhc3RlclNvbGFuYVByb3ZpZGVyJztcbmltcG9ydCB7IEFOQUxZVElDU19FTkFCTEVELCBSRVRVUk5fVVJMIH0gZnJvbSAnfi9saWIvY29uc3RhbnRzJztcblxuY29uc3QgV2FnbWlQcm92aWRlciA9IGR5bmFtaWMoXG4gICgpID0+IGltcG9ydCgnfi9jb21wb25lbnRzL3Byb3ZpZGVycy9XYWdtaVByb3ZpZGVyJyksXG4gIHtcbiAgICBzc3I6IGZhbHNlLFxuICB9XG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gUHJvdmlkZXJzKHtcbiAgY2hpbGRyZW4sXG59OiB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59KSB7XG4gIGNvbnN0IHNvbGFuYUVuZHBvaW50ID1cbiAgICBwcm9jZXNzLmVudi5TT0xBTkFfUlBDX0VORFBPSU5UIHx8ICdodHRwczovL3NvbGFuYS1ycGMucHVibGljbm9kZS5jb20nO1xuICByZXR1cm4gKFxuICAgIDxXYWdtaVByb3ZpZGVyPlxuICAgICAgPE1pbmlBcHBQcm92aWRlclxuICAgICAgICBhbmFseXRpY3NFbmFibGVkPXtBTkFMWVRJQ1NfRU5BQkxFRH1cbiAgICAgICAgYmFja0J1dHRvbkVuYWJsZWQ9e3RydWV9XG4gICAgICAgIHJldHVyblVybD17UkVUVVJOX1VSTH1cbiAgICAgID5cbiAgICAgICAgPFNhZmVGYXJjYXN0ZXJTb2xhbmFQcm92aWRlciBlbmRwb2ludD17c29sYW5hRW5kcG9pbnR9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9TYWZlRmFyY2FzdGVyU29sYW5hUHJvdmlkZXI+XG4gICAgICA8L01pbmlBcHBQcm92aWRlcj5cbiAgICA8L1dhZ21pUHJvdmlkZXI+XG4gICk7XG59XG4iXSwibmFtZXMiOlsiZHluYW1pYyIsIk1pbmlBcHBQcm92aWRlciIsIlNhZmVGYXJjYXN0ZXJTb2xhbmFQcm92aWRlciIsIkFOQUxZVElDU19FTkFCTEVEIiwiUkVUVVJOX1VSTCIsIldhZ21pUHJvdmlkZXIiLCJzc3IiLCJQcm92aWRlcnMiLCJjaGlsZHJlbiIsInNvbGFuYUVuZHBvaW50IiwicHJvY2VzcyIsImVudiIsIlNPTEFOQV9SUENfRU5EUE9JTlQiLCJhbmFseXRpY3NFbmFibGVkIiwiYmFja0J1dHRvbkVuYWJsZWQiLCJyZXR1cm5VcmwiLCJlbmRwb2ludCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/app/providers.tsx\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./src/components/providers/SafeFarcasterSolanaProvider.tsx":
/*!******************************************************************!*\
  !*** ./src/components/providers/SafeFarcasterSolanaProvider.tsx ***!
  \******************************************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   SafeFarcasterSolanaProvider: () => (/* binding */ SafeFarcasterSolanaProvider),\n/* harmony export */   useHasSolanaProvider: () => (/* binding */ useHasSolanaProvider)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_dynamic__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/dynamic */ \"(app-pages-browser)/./node_modules/next/dist/api/app-dynamic.js\");\n/* harmony import */ var _farcaster_miniapp_sdk__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @farcaster/miniapp-sdk */ \"(app-pages-browser)/./node_modules/@farcaster/miniapp-sdk/dist/index.js\");\n\nvar _s = $RefreshSig$(), _s1 = $RefreshSig$();\n\n\n\nconst FarcasterSolanaProvider = (0,next_dynamic__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(()=>__webpack_require__.e(/*! import() */ \"_app-pages-browser_node_modules_farcaster_mini-app-solana_dist_index_js\").then(__webpack_require__.bind(__webpack_require__, /*! @farcaster/mini-app-solana */ \"(app-pages-browser)/./node_modules/@farcaster/mini-app-solana/dist/index.js\")).then((mod)=>mod.FarcasterSolanaProvider), {\n    loadableGenerated: {\n        modules: [\n            \"components/providers/SafeFarcasterSolanaProvider.tsx -> \" + \"@farcaster/mini-app-solana\"\n        ]\n    },\n    ssr: false\n});\n_c = FarcasterSolanaProvider;\nconst SolanaProviderContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)({\n    hasSolanaProvider: false\n});\nfunction SafeFarcasterSolanaProvider(param) {\n    let { endpoint, children } = param;\n    _s();\n    const isClient = \"object\" !== \"undefined\";\n    const [hasSolanaProvider, setHasSolanaProvider] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n    const [checked, setChecked] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n    (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n        \"SafeFarcasterSolanaProvider.useEffect\": ()=>{\n            if (!isClient) return;\n            let cancelled = false;\n            ({\n                \"SafeFarcasterSolanaProvider.useEffect\": async ()=>{\n                    try {\n                        const provider = await _farcaster_miniapp_sdk__WEBPACK_IMPORTED_MODULE_3__.sdk.wallet.getSolanaProvider();\n                        if (!cancelled) {\n                            setHasSolanaProvider(!!provider);\n                        }\n                    } catch (e) {\n                        if (!cancelled) {\n                            setHasSolanaProvider(false);\n                        }\n                    } finally{\n                        if (!cancelled) {\n                            setChecked(true);\n                        }\n                    }\n                }\n            })[\"SafeFarcasterSolanaProvider.useEffect\"]();\n            return ({\n                \"SafeFarcasterSolanaProvider.useEffect\": ()=>{\n                    cancelled = true;\n                }\n            })[\"SafeFarcasterSolanaProvider.useEffect\"];\n        }\n    }[\"SafeFarcasterSolanaProvider.useEffect\"], [\n        isClient\n    ]);\n    (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n        \"SafeFarcasterSolanaProvider.useEffect\": ()=>{\n            let errorShown = false;\n            const origError = console.error;\n            console.error = ({\n                \"SafeFarcasterSolanaProvider.useEffect\": function() {\n                    for(var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++){\n                        args[_key] = arguments[_key];\n                    }\n                    if (typeof args[0] === \"string\" && args[0].includes(\"WalletConnectionError: could not get Solana provider\")) {\n                        if (!errorShown) {\n                            origError(...args);\n                            errorShown = true;\n                        }\n                        return;\n                    }\n                    origError(...args);\n                }\n            })[\"SafeFarcasterSolanaProvider.useEffect\"];\n            return ({\n                \"SafeFarcasterSolanaProvider.useEffect\": ()=>{\n                    console.error = origError;\n                }\n            })[\"SafeFarcasterSolanaProvider.useEffect\"];\n        }\n    }[\"SafeFarcasterSolanaProvider.useEffect\"], []);\n    if (!isClient || !checked) {\n        return null;\n    }\n    return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(SolanaProviderContext.Provider, {\n        value: {\n            hasSolanaProvider\n        },\n        children: hasSolanaProvider ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(FarcasterSolanaProvider, {\n            endpoint: endpoint,\n            children: children\n        }, void 0, false, {\n            fileName: \"/home/wslxt/cs472/farcaster/src/components/providers/SafeFarcasterSolanaProvider.tsx\",\n            lineNumber: 74,\n            columnNumber: 9\n        }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n            children: children\n        }, void 0, false)\n    }, void 0, false, {\n        fileName: \"/home/wslxt/cs472/farcaster/src/components/providers/SafeFarcasterSolanaProvider.tsx\",\n        lineNumber: 72,\n        columnNumber: 5\n    }, this);\n}\n_s(SafeFarcasterSolanaProvider, \"icYa+9fVXUGNLWOTJNA5RvavKgs=\");\n_c1 = SafeFarcasterSolanaProvider;\nfunction useHasSolanaProvider() {\n    _s1();\n    return react__WEBPACK_IMPORTED_MODULE_1___default().useContext(SolanaProviderContext).hasSolanaProvider;\n}\n_s1(useHasSolanaProvider, \"gDsCjeeItUuvgOWf1v4qoK9RF6k=\");\nvar _c, _c1;\n$RefreshReg$(_c, \"FarcasterSolanaProvider\");\n$RefreshReg$(_c1, \"SafeFarcasterSolanaProvider\");\n\n\n;\n    // Wrapped in an IIFE to avoid polluting the global scope\n    ;\n    (function () {\n        var _a, _b;\n        // Legacy CSS implementations will `eval` browser code in a Node.js context\n        // to extract CSS. For backwards compatibility, we need to check we're in a\n        // browser context before continuing.\n        if (typeof self !== 'undefined' &&\n            // AMP / No-JS mode does not inject these helpers:\n            '$RefreshHelpers$' in self) {\n            // @ts-ignore __webpack_module__ is global\n            var currentExports = module.exports;\n            // @ts-ignore __webpack_module__ is global\n            var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n            // This cannot happen in MainTemplate because the exports mismatch between\n            // templating and execution.\n            self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n            // A module can be accepted automatically based on its exports, e.g. when\n            // it is a Refresh Boundary.\n            if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n                // Save the previous exports signature on update so we can compare the boundary\n                // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n                module.hot.dispose(function (data) {\n                    data.prevSignature =\n                        self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n                });\n                // Unconditionally accept an update to this module, we'll check if it's\n                // still a Refresh Boundary later.\n                // @ts-ignore importMeta is replaced in the loader\n                module.hot.accept();\n                // This field is set when the previous version of this module was a\n                // Refresh Boundary, letting us know we need to check for invalidation or\n                // enqueue an update.\n                if (prevSignature !== null) {\n                    // A boundary can become ineligible if its exports are incompatible\n                    // with the previous exports.\n                    //\n                    // For example, if you add/remove/change exports, we'll want to\n                    // re-execute the importing modules, and force those components to\n                    // re-render. Similarly, if you convert a class component to a\n                    // function, we want to invalidate the boundary.\n                    if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n                        module.hot.invalidate();\n                    }\n                    else {\n                        self.$RefreshHelpers$.scheduleUpdate();\n                    }\n                }\n            }\n            else {\n                // Since we just executed the code for the module, it's possible that the\n                // new exports made it ineligible for being a boundary.\n                // We only care about the case when we were _previously_ a boundary,\n                // because we already accepted this update (accidental side effect).\n                var isNoLongerABoundary = prevSignature !== null;\n                if (isNoLongerABoundary) {\n                    module.hot.invalidate();\n                }\n            }\n        }\n    })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9jb21wb25lbnRzL3Byb3ZpZGVycy9TYWZlRmFyY2FzdGVyU29sYW5hUHJvdmlkZXIudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFrRTtBQUMvQjtBQUNVO0FBRTdDLE1BQU1NLDBCQUEwQkYsd0RBQU9BLENBQ3JDLElBQU0scVJBQW9DLENBQUNHLElBQUksQ0FBQ0MsQ0FBQUEsTUFBT0EsSUFBSUYsdUJBQXVCOzs7Ozs7SUFDaEZHLEtBQUs7O0tBRkhIO0FBVU4sTUFBTUksc0NBQXdCVCxvREFBYUEsQ0FBaUM7SUFBRVUsbUJBQW1CO0FBQU07QUFFaEcsU0FBU0MsNEJBQTRCLEtBQXdEO1FBQXhELEVBQUVDLFFBQVEsRUFBRUMsUUFBUSxFQUFvQyxHQUF4RDs7SUFDMUMsTUFBTUMsV0FBVyxhQUFrQjtJQUNuQyxNQUFNLENBQUNKLG1CQUFtQksscUJBQXFCLEdBQUdiLCtDQUFRQSxDQUFVO0lBQ3BFLE1BQU0sQ0FBQ2MsU0FBU0MsV0FBVyxHQUFHZiwrQ0FBUUEsQ0FBVTtJQUVoREQsZ0RBQVNBO2lEQUFDO1lBQ1IsSUFBSSxDQUFDYSxVQUFVO1lBQ2YsSUFBSUksWUFBWTtZQUNoQjt5REFBQztvQkFDQyxJQUFJO3dCQUNGLE1BQU1DLFdBQVcsTUFBTWYsdURBQUdBLENBQUNnQixNQUFNLENBQUNDLGlCQUFpQjt3QkFDbkQsSUFBSSxDQUFDSCxXQUFXOzRCQUNkSCxxQkFBcUIsQ0FBQyxDQUFDSTt3QkFDekI7b0JBQ0YsRUFBRSxVQUFNO3dCQUNOLElBQUksQ0FBQ0QsV0FBVzs0QkFDZEgscUJBQXFCO3dCQUN2QjtvQkFDRixTQUFVO3dCQUNSLElBQUksQ0FBQ0csV0FBVzs0QkFDZEQsV0FBVzt3QkFDYjtvQkFDRjtnQkFDRjs7WUFDQTt5REFBTztvQkFDTEMsWUFBWTtnQkFDZDs7UUFDRjtnREFBRztRQUFDSjtLQUFTO0lBRWJiLGdEQUFTQTtpREFBQztZQUNSLElBQUlxQixhQUFhO1lBQ2pCLE1BQU1DLFlBQVlDLFFBQVFDLEtBQUs7WUFDL0JELFFBQVFDLEtBQUs7eURBQUc7cURBQUlDO3dCQUFBQTs7b0JBQ2xCLElBQ0UsT0FBT0EsSUFBSSxDQUFDLEVBQUUsS0FBSyxZQUNuQkEsSUFBSSxDQUFDLEVBQUUsQ0FBQ0MsUUFBUSxDQUFDLHlEQUNqQjt3QkFDQSxJQUFJLENBQUNMLFlBQVk7NEJBQ2ZDLGFBQWFHOzRCQUNiSixhQUFhO3dCQUNmO3dCQUNBO29CQUNGO29CQUNBQyxhQUFhRztnQkFDZjs7WUFDQTt5REFBTztvQkFDTEYsUUFBUUMsS0FBSyxHQUFHRjtnQkFDbEI7O1FBQ0Y7Z0RBQUcsRUFBRTtJQUVMLElBQUksQ0FBQ1QsWUFBWSxDQUFDRSxTQUFTO1FBQ3pCLE9BQU87SUFDVDtJQUVBLHFCQUNFLDhEQUFDUCxzQkFBc0JtQixRQUFRO1FBQUNDLE9BQU87WUFBRW5CO1FBQWtCO2tCQUN4REEsa0NBQ0MsOERBQUNMO1lBQXdCTyxVQUFVQTtzQkFDaENDOzs7OztpQ0FHSDtzQkFBR0E7Ozs7Ozs7QUFJWDtHQWpFZ0JGO01BQUFBO0FBbUVULFNBQVNtQjs7SUFDZCxPQUFPL0IsdURBQWdCLENBQUNVLHVCQUF1QkMsaUJBQWlCO0FBQ2xFO0lBRmdCb0IiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvY29tcG9uZW50cy9wcm92aWRlcnMvU2FmZUZhcmNhc3RlclNvbGFuYVByb3ZpZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgY3JlYXRlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGR5bmFtaWMgZnJvbSBcIm5leHQvZHluYW1pY1wiO1xuaW1wb3J0IHsgc2RrIH0gZnJvbSAnQGZhcmNhc3Rlci9taW5pYXBwLXNkayc7XG5cbmNvbnN0IEZhcmNhc3RlclNvbGFuYVByb3ZpZGVyID0gZHluYW1pYyhcbiAgKCkgPT4gaW1wb3J0KCdAZmFyY2FzdGVyL21pbmktYXBwLXNvbGFuYScpLnRoZW4obW9kID0+IG1vZC5GYXJjYXN0ZXJTb2xhbmFQcm92aWRlciksXG4gIHsgc3NyOiBmYWxzZSB9XG4pO1xuXG50eXBlIFNhZmVGYXJjYXN0ZXJTb2xhbmFQcm92aWRlclByb3BzID0ge1xuICBlbmRwb2ludDogc3RyaW5nO1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xufTtcblxuY29uc3QgU29sYW5hUHJvdmlkZXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dDx7IGhhc1NvbGFuYVByb3ZpZGVyOiBib29sZWFuIH0+KHsgaGFzU29sYW5hUHJvdmlkZXI6IGZhbHNlIH0pO1xuXG5leHBvcnQgZnVuY3Rpb24gU2FmZUZhcmNhc3RlclNvbGFuYVByb3ZpZGVyKHsgZW5kcG9pbnQsIGNoaWxkcmVuIH06IFNhZmVGYXJjYXN0ZXJTb2xhbmFQcm92aWRlclByb3BzKSB7XG4gIGNvbnN0IGlzQ2xpZW50ID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgY29uc3QgW2hhc1NvbGFuYVByb3ZpZGVyLCBzZXRIYXNTb2xhbmFQcm92aWRlcl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gIGNvbnN0IFtjaGVja2VkLCBzZXRDaGVja2VkXSA9IHVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghaXNDbGllbnQpIHJldHVybjtcbiAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7XG4gICAgKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVyID0gYXdhaXQgc2RrLndhbGxldC5nZXRTb2xhbmFQcm92aWRlcigpO1xuICAgICAgICBpZiAoIWNhbmNlbGxlZCkge1xuICAgICAgICAgIHNldEhhc1NvbGFuYVByb3ZpZGVyKCEhcHJvdmlkZXIpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgaWYgKCFjYW5jZWxsZWQpIHtcbiAgICAgICAgICBzZXRIYXNTb2xhbmFQcm92aWRlcihmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmICghY2FuY2VsbGVkKSB7XG4gICAgICAgICAgc2V0Q2hlY2tlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgfTtcbiAgfSwgW2lzQ2xpZW50XSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgZXJyb3JTaG93biA9IGZhbHNlO1xuICAgIGNvbnN0IG9yaWdFcnJvciA9IGNvbnNvbGUuZXJyb3I7XG4gICAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBhcmdzWzBdID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgIGFyZ3NbMF0uaW5jbHVkZXMoXCJXYWxsZXRDb25uZWN0aW9uRXJyb3I6IGNvdWxkIG5vdCBnZXQgU29sYW5hIHByb3ZpZGVyXCIpXG4gICAgICApIHtcbiAgICAgICAgaWYgKCFlcnJvclNob3duKSB7XG4gICAgICAgICAgb3JpZ0Vycm9yKC4uLmFyZ3MpO1xuICAgICAgICAgIGVycm9yU2hvd24gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG9yaWdFcnJvciguLi5hcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yID0gb3JpZ0Vycm9yO1xuICAgIH07XG4gIH0sIFtdKTtcblxuICBpZiAoIWlzQ2xpZW50IHx8ICFjaGVja2VkKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxTb2xhbmFQcm92aWRlckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgaGFzU29sYW5hUHJvdmlkZXIgfX0+XG4gICAgICB7aGFzU29sYW5hUHJvdmlkZXIgPyAoXG4gICAgICAgIDxGYXJjYXN0ZXJTb2xhbmFQcm92aWRlciBlbmRwb2ludD17ZW5kcG9pbnR9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9GYXJjYXN0ZXJTb2xhbmFQcm92aWRlcj5cbiAgICAgICkgOiAoXG4gICAgICAgIDw+e2NoaWxkcmVufTwvPlxuICAgICAgKX1cbiAgICA8L1NvbGFuYVByb3ZpZGVyQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZUhhc1NvbGFuYVByb3ZpZGVyKCkge1xuICByZXR1cm4gUmVhY3QudXNlQ29udGV4dChTb2xhbmFQcm92aWRlckNvbnRleHQpLmhhc1NvbGFuYVByb3ZpZGVyO1xufVxuIl0sIm5hbWVzIjpbIlJlYWN0IiwiY3JlYXRlQ29udGV4dCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiZHluYW1pYyIsInNkayIsIkZhcmNhc3RlclNvbGFuYVByb3ZpZGVyIiwidGhlbiIsIm1vZCIsInNzciIsIlNvbGFuYVByb3ZpZGVyQ29udGV4dCIsImhhc1NvbGFuYVByb3ZpZGVyIiwiU2FmZUZhcmNhc3RlclNvbGFuYVByb3ZpZGVyIiwiZW5kcG9pbnQiLCJjaGlsZHJlbiIsImlzQ2xpZW50Iiwic2V0SGFzU29sYW5hUHJvdmlkZXIiLCJjaGVja2VkIiwic2V0Q2hlY2tlZCIsImNhbmNlbGxlZCIsInByb3ZpZGVyIiwid2FsbGV0IiwiZ2V0U29sYW5hUHJvdmlkZXIiLCJlcnJvclNob3duIiwib3JpZ0Vycm9yIiwiY29uc29sZSIsImVycm9yIiwiYXJncyIsImluY2x1ZGVzIiwiUHJvdmlkZXIiLCJ2YWx1ZSIsInVzZUhhc1NvbGFuYVByb3ZpZGVyIiwidXNlQ29udGV4dCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/components/providers/SafeFarcasterSolanaProvider.tsx\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./src/lib/constants.ts":
/*!******************************!*\
  !*** ./src/lib/constants.ts ***!
  \******************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   ANALYTICS_ENABLED: () => (/* binding */ ANALYTICS_ENABLED),\n/* harmony export */   APP_ACCOUNT_ASSOCIATION: () => (/* binding */ APP_ACCOUNT_ASSOCIATION),\n/* harmony export */   APP_BUTTON_TEXT: () => (/* binding */ APP_BUTTON_TEXT),\n/* harmony export */   APP_DESCRIPTION: () => (/* binding */ APP_DESCRIPTION),\n/* harmony export */   APP_ICON_URL: () => (/* binding */ APP_ICON_URL),\n/* harmony export */   APP_NAME: () => (/* binding */ APP_NAME),\n/* harmony export */   APP_OG_IMAGE_URL: () => (/* binding */ APP_OG_IMAGE_URL),\n/* harmony export */   APP_PRIMARY_CATEGORY: () => (/* binding */ APP_PRIMARY_CATEGORY),\n/* harmony export */   APP_REQUIRED_CHAINS: () => (/* binding */ APP_REQUIRED_CHAINS),\n/* harmony export */   APP_SPLASH_BACKGROUND_COLOR: () => (/* binding */ APP_SPLASH_BACKGROUND_COLOR),\n/* harmony export */   APP_SPLASH_URL: () => (/* binding */ APP_SPLASH_URL),\n/* harmony export */   APP_TAGS: () => (/* binding */ APP_TAGS),\n/* harmony export */   APP_URL: () => (/* binding */ APP_URL),\n/* harmony export */   APP_WEBHOOK_URL: () => (/* binding */ APP_WEBHOOK_URL),\n/* harmony export */   RETURN_URL: () => (/* binding */ RETURN_URL),\n/* harmony export */   SIGNED_KEY_REQUEST_TYPE: () => (/* binding */ SIGNED_KEY_REQUEST_TYPE),\n/* harmony export */   SIGNED_KEY_REQUEST_VALIDATOR_EIP_712_DOMAIN: () => (/* binding */ SIGNED_KEY_REQUEST_VALIDATOR_EIP_712_DOMAIN),\n/* harmony export */   USE_WALLET: () => (/* binding */ USE_WALLET)\n/* harmony export */ });\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/**\n * Application constants and configuration values.\n *\n * This file contains all the configuration constants used throughout the mini app.\n * These values are either sourced from environment variables or hardcoded and provide\n * configuration for the app's appearance, behavior, and integration settings.\n *\n * NOTE: This file is automatically updated by the init script.\n * Manual changes may be overwritten during project initialization.\n */ // --- App Configuration ---\n/**\n * The base URL of the application.\n * Used for generating absolute URLs for assets and API endpoints.\n */ const APP_URL = \"http://localhost:3000\";\n/**\n * The name of the mini app as displayed to users.\n * Used in titles, headers, and app store listings.\n */ const APP_NAME = 'Horce Race';\n/**\n * A brief description of the mini app's functionality.\n * Used in app store listings and metadata.\n */ const APP_DESCRIPTION = 'A Farcaster mini app created with Neynar';\n/**\n * The primary category for the mini app.\n * Used for app store categorization and discovery.\n */ const APP_PRIMARY_CATEGORY = 'games';\n/**\n * Tags associated with the mini app.\n * Used for search and discovery in app stores.\n */ const APP_TAGS = [\n    'racing',\n    'horces',\n    'betting'\n];\n// --- Asset URLs ---\n/**\n * URL for the app's icon image.\n * Used in app store listings and UI elements.\n */ const APP_ICON_URL = \"\".concat(APP_URL, \"/icon.png\");\n/**\n * URL for the app's Open Graph image.\n * Used for social media sharing and previews.\n */ const APP_OG_IMAGE_URL = \"\".concat(APP_URL, \"/api/opengraph-image\");\n/**\n * URL for the app's splash screen image.\n * Displayed during app loading.\n */ const APP_SPLASH_URL = \"\".concat(APP_URL, \"/splash.png\");\n/**\n * Background color for the splash screen.\n * Used as fallback when splash image is loading.\n */ const APP_SPLASH_BACKGROUND_COLOR = '#f7f7f7';\n/**\n * Account association for the mini app.\n * Used to associate the mini app with a Farcaster account.\n * If not provided, the mini app will be unsigned and have limited capabilities.\n */ const APP_ACCOUNT_ASSOCIATION = undefined;\n// --- UI Configuration ---\n/**\n * Text displayed on the main action button.\n * Used for the primary call-to-action in the mini app.\n */ const APP_BUTTON_TEXT = 'The Stables';\n// --- Integration Configuration ---\n/**\n * Webhook URL for receiving events from Neynar.\n *\n * If Neynar API key and client ID are configured, uses the official\n * Neynar webhook endpoint. Otherwise, falls back to a local webhook\n * endpoint for development and testing.\n */ const APP_WEBHOOK_URL = process.env.NEYNAR_API_KEY && process.env.NEYNAR_CLIENT_ID ? \"https://api.neynar.com/f/app/\".concat(process.env.NEYNAR_CLIENT_ID, \"/event\") : \"\".concat(APP_URL, \"/api/webhook\");\n/**\n * Flag to enable/disable wallet functionality.\n *\n * When true, wallet-related components and features are rendered.\n * When false, wallet functionality is completely hidden from the UI.\n * Useful for mini apps that don't require wallet integration.\n */ const USE_WALLET = true;\n/**\n * Flag to enable/disable analytics tracking.\n *\n * When true, usage analytics are collected and sent to Neynar.\n * When false, analytics collection is disabled.\n * Useful for privacy-conscious users or development environments.\n */ const ANALYTICS_ENABLED = false;\n/**\n * Required chains for the mini app.\n *\n * Contains an array of CAIP-2 identifiers for blockchains that the mini app requires.\n * If the host does not support all chains listed here, it will not render the mini app.\n * If empty or undefined, the mini app will be rendered regardless of chain support.\n *\n * Supported chains: eip155:1, eip155:137, eip155:42161, eip155:10, eip155:8453,\n * solana:mainnet, solana:devnet\n */ const APP_REQUIRED_CHAINS = [];\n/**\n * Return URL for the mini app.\n *\n * If provided, the mini app will be rendered with a return URL to be rendered if the\n * back button is pressed from the home page.\n */ const RETURN_URL = undefined;\n// PLEASE DO NOT UPDATE THIS\nconst SIGNED_KEY_REQUEST_VALIDATOR_EIP_712_DOMAIN = {\n    name: 'Farcaster SignedKeyRequestValidator',\n    version: '1',\n    chainId: 10,\n    verifyingContract: '0x00000000fc700472606ed4fa22623acf62c60553'\n};\n// PLEASE DO NOT UPDATE THIS\nconst SIGNED_KEY_REQUEST_TYPE = [\n    {\n        name: 'requestFid',\n        type: 'uint256'\n    },\n    {\n        name: 'key',\n        type: 'bytes'\n    },\n    {\n        name: 'deadline',\n        type: 'uint256'\n    }\n];\n\n\n;\n    // Wrapped in an IIFE to avoid polluting the global scope\n    ;\n    (function () {\n        var _a, _b;\n        // Legacy CSS implementations will `eval` browser code in a Node.js context\n        // to extract CSS. For backwards compatibility, we need to check we're in a\n        // browser context before continuing.\n        if (typeof self !== 'undefined' &&\n            // AMP / No-JS mode does not inject these helpers:\n            '$RefreshHelpers$' in self) {\n            // @ts-ignore __webpack_module__ is global\n            var currentExports = module.exports;\n            // @ts-ignore __webpack_module__ is global\n            var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n            // This cannot happen in MainTemplate because the exports mismatch between\n            // templating and execution.\n            self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n            // A module can be accepted automatically based on its exports, e.g. when\n            // it is a Refresh Boundary.\n            if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n                // Save the previous exports signature on update so we can compare the boundary\n                // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n                module.hot.dispose(function (data) {\n                    data.prevSignature =\n                        self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n                });\n                // Unconditionally accept an update to this module, we'll check if it's\n                // still a Refresh Boundary later.\n                // @ts-ignore importMeta is replaced in the loader\n                module.hot.accept();\n                // This field is set when the previous version of this module was a\n                // Refresh Boundary, letting us know we need to check for invalidation or\n                // enqueue an update.\n                if (prevSignature !== null) {\n                    // A boundary can become ineligible if its exports are incompatible\n                    // with the previous exports.\n                    //\n                    // For example, if you add/remove/change exports, we'll want to\n                    // re-execute the importing modules, and force those components to\n                    // re-render. Similarly, if you convert a class component to a\n                    // function, we want to invalidate the boundary.\n                    if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n                        module.hot.invalidate();\n                    }\n                    else {\n                        self.$RefreshHelpers$.scheduleUpdate();\n                    }\n                }\n            }\n            else {\n                // Since we just executed the code for the module, it's possible that the\n                // new exports made it ineligible for being a boundary.\n                // We only care about the case when we were _previously_ a boundary,\n                // because we already accepted this update (accidental side effect).\n                var isNoLongerABoundary = prevSignature !== null;\n                if (isNoLongerABoundary) {\n                    module.hot.invalidate();\n                }\n            }\n        }\n    })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9saWIvY29uc3RhbnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFQTs7Ozs7Ozs7O0NBU0MsR0FFRCw0QkFBNEI7QUFDNUI7OztDQUdDLEdBQ00sTUFBTUEsVUFBa0JDLHVCQUEyQixDQUFFO0FBRTVEOzs7Q0FHQyxHQUNNLE1BQU1HLFdBQW1CLGFBQWE7QUFFN0M7OztDQUdDLEdBQ00sTUFBTUMsa0JBQTBCLDJDQUEyQztBQUVsRjs7O0NBR0MsR0FDTSxNQUFNQyx1QkFBK0IsUUFBUTtBQUVwRDs7O0NBR0MsR0FDTSxNQUFNQyxXQUFxQjtJQUFDO0lBQVU7SUFBVTtDQUFVLENBQUM7QUFFbEUscUJBQXFCO0FBQ3JCOzs7Q0FHQyxHQUNNLE1BQU1DLGVBQXVCLEdBQVcsT0FBUlIsU0FBUSxhQUFXO0FBRTFEOzs7Q0FHQyxHQUNNLE1BQU1TLG1CQUEyQixHQUFXLE9BQVJULFNBQVEsd0JBQXNCO0FBRXpFOzs7Q0FHQyxHQUNNLE1BQU1VLGlCQUF5QixHQUFXLE9BQVJWLFNBQVEsZUFBYTtBQUU5RDs7O0NBR0MsR0FDTSxNQUFNVyw4QkFBc0MsVUFBVTtBQUU3RDs7OztDQUlDLEdBQ00sTUFBTUMsMEJBQ1hDLFVBQVU7QUFFWiwyQkFBMkI7QUFDM0I7OztDQUdDLEdBQ00sTUFBTUMsa0JBQTBCLGNBQWM7QUFFckQsb0NBQW9DO0FBQ3BDOzs7Ozs7Q0FNQyxHQUNNLE1BQU1DLGtCQUNYZCxPQUFPQSxDQUFDQyxHQUFHLENBQUNjLGNBQWMsSUFBSWYsT0FBT0EsQ0FBQ0MsR0FBRyxDQUFDZSxnQkFBZ0IsR0FDdEQsZ0NBQTZELE9BQTdCaEIsT0FBT0EsQ0FBQ0MsR0FBRyxDQUFDZSxnQkFBZ0IsRUFBQyxZQUM3RCxHQUFXLE9BQVJqQixTQUFRLGdCQUFjO0FBRS9COzs7Ozs7Q0FNQyxHQUNNLE1BQU1rQixhQUFzQixLQUFLO0FBRXhDOzs7Ozs7Q0FNQyxHQUNNLE1BQU1DLG9CQUE2QixNQUFNO0FBRWhEOzs7Ozs7Ozs7Q0FTQyxHQUNNLE1BQU1DLHNCQUFnQyxFQUFFLENBQUM7QUFFaEQ7Ozs7O0NBS0MsR0FDTSxNQUFNQyxhQUFpQ1IsVUFBVTtBQUV4RCw0QkFBNEI7QUFDckIsTUFBTVMsOENBQThDO0lBQ3pEQyxNQUFNO0lBQ05DLFNBQVM7SUFDVEMsU0FBUztJQUNUQyxtQkFDRTtBQUNKLEVBQUU7QUFFRiw0QkFBNEI7QUFDckIsTUFBTUMsMEJBQTBCO0lBQ3JDO1FBQUVKLE1BQU07UUFBY0ssTUFBTTtJQUFVO0lBQ3RDO1FBQUVMLE1BQU07UUFBT0ssTUFBTTtJQUFRO0lBQzdCO1FBQUVMLE1BQU07UUFBWUssTUFBTTtJQUFVO0NBQ3JDLENBQUMiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvbGliL2NvbnN0YW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEFjY291bnRBc3NvY2lhdGlvbiB9IGZyb20gJ0BmYXJjYXN0ZXIvbWluaWFwcC1jb3JlL3NyYy9tYW5pZmVzdCc7XG5cbi8qKlxuICogQXBwbGljYXRpb24gY29uc3RhbnRzIGFuZCBjb25maWd1cmF0aW9uIHZhbHVlcy5cbiAqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgYWxsIHRoZSBjb25maWd1cmF0aW9uIGNvbnN0YW50cyB1c2VkIHRocm91Z2hvdXQgdGhlIG1pbmkgYXBwLlxuICogVGhlc2UgdmFsdWVzIGFyZSBlaXRoZXIgc291cmNlZCBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBoYXJkY29kZWQgYW5kIHByb3ZpZGVcbiAqIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBhcHAncyBhcHBlYXJhbmNlLCBiZWhhdmlvciwgYW5kIGludGVncmF0aW9uIHNldHRpbmdzLlxuICpcbiAqIE5PVEU6IFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgdGhlIGluaXQgc2NyaXB0LlxuICogTWFudWFsIGNoYW5nZXMgbWF5IGJlIG92ZXJ3cml0dGVuIGR1cmluZyBwcm9qZWN0IGluaXRpYWxpemF0aW9uLlxuICovXG5cbi8vIC0tLSBBcHAgQ29uZmlndXJhdGlvbiAtLS1cbi8qKlxuICogVGhlIGJhc2UgVVJMIG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAqIFVzZWQgZm9yIGdlbmVyYXRpbmcgYWJzb2x1dGUgVVJMcyBmb3IgYXNzZXRzIGFuZCBBUEkgZW5kcG9pbnRzLlxuICovXG5leHBvcnQgY29uc3QgQVBQX1VSTDogc3RyaW5nID0gcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfVVJMITtcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgbWluaSBhcHAgYXMgZGlzcGxheWVkIHRvIHVzZXJzLlxuICogVXNlZCBpbiB0aXRsZXMsIGhlYWRlcnMsIGFuZCBhcHAgc3RvcmUgbGlzdGluZ3MuXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfTkFNRTogc3RyaW5nID0gJ0hvcmNlIFJhY2UnO1xuXG4vKipcbiAqIEEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIG1pbmkgYXBwJ3MgZnVuY3Rpb25hbGl0eS5cbiAqIFVzZWQgaW4gYXBwIHN0b3JlIGxpc3RpbmdzIGFuZCBtZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9ERVNDUklQVElPTjogc3RyaW5nID0gJ0EgRmFyY2FzdGVyIG1pbmkgYXBwIGNyZWF0ZWQgd2l0aCBOZXluYXInO1xuXG4vKipcbiAqIFRoZSBwcmltYXJ5IGNhdGVnb3J5IGZvciB0aGUgbWluaSBhcHAuXG4gKiBVc2VkIGZvciBhcHAgc3RvcmUgY2F0ZWdvcml6YXRpb24gYW5kIGRpc2NvdmVyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9QUklNQVJZX0NBVEVHT1JZOiBzdHJpbmcgPSAnZ2FtZXMnO1xuXG4vKipcbiAqIFRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBtaW5pIGFwcC5cbiAqIFVzZWQgZm9yIHNlYXJjaCBhbmQgZGlzY292ZXJ5IGluIGFwcCBzdG9yZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfVEFHUzogc3RyaW5nW10gPSBbJ3JhY2luZycsICdob3JjZXMnLCAnYmV0dGluZyddO1xuXG4vLyAtLS0gQXNzZXQgVVJMcyAtLS1cbi8qKlxuICogVVJMIGZvciB0aGUgYXBwJ3MgaWNvbiBpbWFnZS5cbiAqIFVzZWQgaW4gYXBwIHN0b3JlIGxpc3RpbmdzIGFuZCBVSSBlbGVtZW50cy5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9JQ09OX1VSTDogc3RyaW5nID0gYCR7QVBQX1VSTH0vaWNvbi5wbmdgO1xuXG4vKipcbiAqIFVSTCBmb3IgdGhlIGFwcCdzIE9wZW4gR3JhcGggaW1hZ2UuXG4gKiBVc2VkIGZvciBzb2NpYWwgbWVkaWEgc2hhcmluZyBhbmQgcHJldmlld3MuXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfT0dfSU1BR0VfVVJMOiBzdHJpbmcgPSBgJHtBUFBfVVJMfS9hcGkvb3BlbmdyYXBoLWltYWdlYDtcblxuLyoqXG4gKiBVUkwgZm9yIHRoZSBhcHAncyBzcGxhc2ggc2NyZWVuIGltYWdlLlxuICogRGlzcGxheWVkIGR1cmluZyBhcHAgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9TUExBU0hfVVJMOiBzdHJpbmcgPSBgJHtBUFBfVVJMfS9zcGxhc2gucG5nYDtcblxuLyoqXG4gKiBCYWNrZ3JvdW5kIGNvbG9yIGZvciB0aGUgc3BsYXNoIHNjcmVlbi5cbiAqIFVzZWQgYXMgZmFsbGJhY2sgd2hlbiBzcGxhc2ggaW1hZ2UgaXMgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9TUExBU0hfQkFDS0dST1VORF9DT0xPUjogc3RyaW5nID0gJyNmN2Y3ZjcnO1xuXG4vKipcbiAqIEFjY291bnQgYXNzb2NpYXRpb24gZm9yIHRoZSBtaW5pIGFwcC5cbiAqIFVzZWQgdG8gYXNzb2NpYXRlIHRoZSBtaW5pIGFwcCB3aXRoIGEgRmFyY2FzdGVyIGFjY291bnQuXG4gKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBtaW5pIGFwcCB3aWxsIGJlIHVuc2lnbmVkIGFuZCBoYXZlIGxpbWl0ZWQgY2FwYWJpbGl0aWVzLlxuICovXG5leHBvcnQgY29uc3QgQVBQX0FDQ09VTlRfQVNTT0NJQVRJT046IEFjY291bnRBc3NvY2lhdGlvbiB8IHVuZGVmaW5lZCA9XG4gIHVuZGVmaW5lZDtcblxuLy8gLS0tIFVJIENvbmZpZ3VyYXRpb24gLS0tXG4vKipcbiAqIFRleHQgZGlzcGxheWVkIG9uIHRoZSBtYWluIGFjdGlvbiBidXR0b24uXG4gKiBVc2VkIGZvciB0aGUgcHJpbWFyeSBjYWxsLXRvLWFjdGlvbiBpbiB0aGUgbWluaSBhcHAuXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfQlVUVE9OX1RFWFQ6IHN0cmluZyA9ICdUaGUgU3RhYmxlcyc7XG5cbi8vIC0tLSBJbnRlZ3JhdGlvbiBDb25maWd1cmF0aW9uIC0tLVxuLyoqXG4gKiBXZWJob29rIFVSTCBmb3IgcmVjZWl2aW5nIGV2ZW50cyBmcm9tIE5leW5hci5cbiAqXG4gKiBJZiBOZXluYXIgQVBJIGtleSBhbmQgY2xpZW50IElEIGFyZSBjb25maWd1cmVkLCB1c2VzIHRoZSBvZmZpY2lhbFxuICogTmV5bmFyIHdlYmhvb2sgZW5kcG9pbnQuIE90aGVyd2lzZSwgZmFsbHMgYmFjayB0byBhIGxvY2FsIHdlYmhvb2tcbiAqIGVuZHBvaW50IGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9XRUJIT09LX1VSTDogc3RyaW5nID1cbiAgcHJvY2Vzcy5lbnYuTkVZTkFSX0FQSV9LRVkgJiYgcHJvY2Vzcy5lbnYuTkVZTkFSX0NMSUVOVF9JRFxuICAgID8gYGh0dHBzOi8vYXBpLm5leW5hci5jb20vZi9hcHAvJHtwcm9jZXNzLmVudi5ORVlOQVJfQ0xJRU5UX0lEfS9ldmVudGBcbiAgICA6IGAke0FQUF9VUkx9L2FwaS93ZWJob29rYDtcblxuLyoqXG4gKiBGbGFnIHRvIGVuYWJsZS9kaXNhYmxlIHdhbGxldCBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIFdoZW4gdHJ1ZSwgd2FsbGV0LXJlbGF0ZWQgY29tcG9uZW50cyBhbmQgZmVhdHVyZXMgYXJlIHJlbmRlcmVkLlxuICogV2hlbiBmYWxzZSwgd2FsbGV0IGZ1bmN0aW9uYWxpdHkgaXMgY29tcGxldGVseSBoaWRkZW4gZnJvbSB0aGUgVUkuXG4gKiBVc2VmdWwgZm9yIG1pbmkgYXBwcyB0aGF0IGRvbid0IHJlcXVpcmUgd2FsbGV0IGludGVncmF0aW9uLlxuICovXG5leHBvcnQgY29uc3QgVVNFX1dBTExFVDogYm9vbGVhbiA9IHRydWU7XG5cbi8qKlxuICogRmxhZyB0byBlbmFibGUvZGlzYWJsZSBhbmFseXRpY3MgdHJhY2tpbmcuXG4gKlxuICogV2hlbiB0cnVlLCB1c2FnZSBhbmFseXRpY3MgYXJlIGNvbGxlY3RlZCBhbmQgc2VudCB0byBOZXluYXIuXG4gKiBXaGVuIGZhbHNlLCBhbmFseXRpY3MgY29sbGVjdGlvbiBpcyBkaXNhYmxlZC5cbiAqIFVzZWZ1bCBmb3IgcHJpdmFjeS1jb25zY2lvdXMgdXNlcnMgb3IgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLlxuICovXG5leHBvcnQgY29uc3QgQU5BTFlUSUNTX0VOQUJMRUQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuLyoqXG4gKiBSZXF1aXJlZCBjaGFpbnMgZm9yIHRoZSBtaW5pIGFwcC5cbiAqXG4gKiBDb250YWlucyBhbiBhcnJheSBvZiBDQUlQLTIgaWRlbnRpZmllcnMgZm9yIGJsb2NrY2hhaW5zIHRoYXQgdGhlIG1pbmkgYXBwIHJlcXVpcmVzLlxuICogSWYgdGhlIGhvc3QgZG9lcyBub3Qgc3VwcG9ydCBhbGwgY2hhaW5zIGxpc3RlZCBoZXJlLCBpdCB3aWxsIG5vdCByZW5kZXIgdGhlIG1pbmkgYXBwLlxuICogSWYgZW1wdHkgb3IgdW5kZWZpbmVkLCB0aGUgbWluaSBhcHAgd2lsbCBiZSByZW5kZXJlZCByZWdhcmRsZXNzIG9mIGNoYWluIHN1cHBvcnQuXG4gKlxuICogU3VwcG9ydGVkIGNoYWluczogZWlwMTU1OjEsIGVpcDE1NToxMzcsIGVpcDE1NTo0MjE2MSwgZWlwMTU1OjEwLCBlaXAxNTU6ODQ1MyxcbiAqIHNvbGFuYTptYWlubmV0LCBzb2xhbmE6ZGV2bmV0XG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfUkVRVUlSRURfQ0hBSU5TOiBzdHJpbmdbXSA9IFtdO1xuXG4vKipcbiAqIFJldHVybiBVUkwgZm9yIHRoZSBtaW5pIGFwcC5cbiAqXG4gKiBJZiBwcm92aWRlZCwgdGhlIG1pbmkgYXBwIHdpbGwgYmUgcmVuZGVyZWQgd2l0aCBhIHJldHVybiBVUkwgdG8gYmUgcmVuZGVyZWQgaWYgdGhlXG4gKiBiYWNrIGJ1dHRvbiBpcyBwcmVzc2VkIGZyb20gdGhlIGhvbWUgcGFnZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJFVFVSTl9VUkw6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuLy8gUExFQVNFIERPIE5PVCBVUERBVEUgVEhJU1xuZXhwb3J0IGNvbnN0IFNJR05FRF9LRVlfUkVRVUVTVF9WQUxJREFUT1JfRUlQXzcxMl9ET01BSU4gPSB7XG4gIG5hbWU6ICdGYXJjYXN0ZXIgU2lnbmVkS2V5UmVxdWVzdFZhbGlkYXRvcicsXG4gIHZlcnNpb246ICcxJyxcbiAgY2hhaW5JZDogMTAsXG4gIHZlcmlmeWluZ0NvbnRyYWN0OlxuICAgICcweDAwMDAwMDAwZmM3MDA0NzI2MDZlZDRmYTIyNjIzYWNmNjJjNjA1NTMnIGFzIGAweCR7c3RyaW5nfWAsXG59O1xuXG4vLyBQTEVBU0UgRE8gTk9UIFVQREFURSBUSElTXG5leHBvcnQgY29uc3QgU0lHTkVEX0tFWV9SRVFVRVNUX1RZUEUgPSBbXG4gIHsgbmFtZTogJ3JlcXVlc3RGaWQnLCB0eXBlOiAndWludDI1NicgfSxcbiAgeyBuYW1lOiAna2V5JywgdHlwZTogJ2J5dGVzJyB9LFxuICB7IG5hbWU6ICdkZWFkbGluZScsIHR5cGU6ICd1aW50MjU2JyB9LFxuXTtcbiJdLCJuYW1lcyI6WyJBUFBfVVJMIiwicHJvY2VzcyIsImVudiIsIk5FWFRfUFVCTElDX1VSTCIsIkFQUF9OQU1FIiwiQVBQX0RFU0NSSVBUSU9OIiwiQVBQX1BSSU1BUllfQ0FURUdPUlkiLCJBUFBfVEFHUyIsIkFQUF9JQ09OX1VSTCIsIkFQUF9PR19JTUFHRV9VUkwiLCJBUFBfU1BMQVNIX1VSTCIsIkFQUF9TUExBU0hfQkFDS0dST1VORF9DT0xPUiIsIkFQUF9BQ0NPVU5UX0FTU09DSUFUSU9OIiwidW5kZWZpbmVkIiwiQVBQX0JVVFRPTl9URVhUIiwiQVBQX1dFQkhPT0tfVVJMIiwiTkVZTkFSX0FQSV9LRVkiLCJORVlOQVJfQ0xJRU5UX0lEIiwiVVNFX1dBTExFVCIsIkFOQUxZVElDU19FTkFCTEVEIiwiQVBQX1JFUVVJUkVEX0NIQUlOUyIsIlJFVFVSTl9VUkwiLCJTSUdORURfS0VZX1JFUVVFU1RfVkFMSURBVE9SX0VJUF83MTJfRE9NQUlOIiwibmFtZSIsInZlcnNpb24iLCJjaGFpbklkIiwidmVyaWZ5aW5nQ29udHJhY3QiLCJTSUdORURfS0VZX1JFUVVFU1RfVFlQRSIsInR5cGUiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/lib/constants.ts\n"));
 
/***/ }),
 
/***/ "(app-pages-browser)/./src/lib/wallet-context.tsx":
/*!************************************!*\
  !*** ./src/lib/wallet-context.tsx ***!
  \************************************/
/***/ ((module, __webpack_exports__, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */   WalletProvider: () => (/* binding */ WalletProvider),\n/* harmony export */   useWallet: () => (/* binding */ useWallet)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* __next_internal_client_entry_do_not_use__ WalletProvider,useWallet auto */ \nvar _s = $RefreshSig$(), _s1 = $RefreshSig$();\n\nconst WalletContext = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_1__.createContext)(undefined);\nfunction WalletProvider(param) {\n    let { children } = param;\n    _s();\n    const [balance, setBalance] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(1000);\n    const [bets, setBets] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n    // Load from localStorage on mount\n    (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n        \"WalletProvider.useEffect\": ()=>{\n            const savedBalance = localStorage.getItem(\"wallet-balance\");\n            const savedBets = localStorage.getItem(\"wallet-bets\");\n            if (savedBalance) setBalance(Number.parseFloat(savedBalance));\n            if (savedBets) setBets(JSON.parse(savedBets));\n        }\n    }[\"WalletProvider.useEffect\"], []);\n    // Save to localStorage whenever balance or bets change\n    (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n        \"WalletProvider.useEffect\": ()=>{\n            localStorage.setItem(\"wallet-balance\", balance.toString());\n        }\n    }[\"WalletProvider.useEffect\"], [\n        balance\n    ]);\n    (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)({\n        \"WalletProvider.useEffect\": ()=>{\n            localStorage.setItem(\"wallet-bets\", JSON.stringify(bets));\n        }\n    }[\"WalletProvider.useEffect\"], [\n        bets\n    ]);\n    const addBet = (bet)=>{\n        const newBet = {\n            ...bet,\n            id: \"bet-\".concat(Date.now(), \"-\").concat(Math.random()),\n            timestamp: Date.now(),\n            status: \"pending\"\n        };\n        setBets((prev)=>[\n                newBet,\n                ...prev\n            ]);\n        setBalance((prev)=>prev - bet.amount);\n    };\n    const updateBetStatus = (betId, status)=>{\n        setBets((prev)=>prev.map((bet)=>{\n                if (bet.id === betId && bet.status === \"pending\") {\n                    if (status === \"won\") {\n                        setBalance((b)=>b + bet.potentialWin);\n                    }\n                    return {\n                        ...bet,\n                        status\n                    };\n                }\n                return bet;\n            }));\n    };\n    const addCoins = (amount)=>{\n        setBalance((prev)=>prev + amount);\n    };\n    const stats = {\n        totalBets: bets.length,\n        totalWins: bets.filter((b)=>b.status === \"won\").length,\n        totalLosses: bets.filter((b)=>b.status === \"lost\").length,\n        winRate: bets.length > 0 ? bets.filter((b)=>b.status === \"won\").length / bets.length * 100 : 0,\n        totalWon: bets.filter((b)=>b.status === \"won\").reduce((sum, b)=>sum + b.potentialWin, 0),\n        totalLost: bets.filter((b)=>b.status === \"lost\").reduce((sum, b)=>sum + b.amount, 0)\n    };\n    return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(WalletContext.Provider, {\n        value: {\n            balance,\n            bets,\n            addBet,\n            updateBetStatus,\n            addCoins,\n            stats\n        },\n        children: children\n    }, void 0, false, {\n        fileName: \"/home/wslxt/cs472/farcaster/src/lib/wallet-context.tsx\",\n        lineNumber: 99,\n        columnNumber: 9\n    }, this);\n}\n_s(WalletProvider, \"jvTu62Sqq48QwjRnDWt7hlK5K0s=\");\n_c = WalletProvider;\nfunction useWallet() {\n    _s1();\n    const context = (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(WalletContext);\n    if (context === undefined) {\n        throw new Error(\"useWallet must be used within a WalletProvider\");\n    }\n    return context;\n}\n_s1(useWallet, \"b9L3QQ+jgeyIrH0NfHrJ8nn7VMU=\");\nvar _c;\n$RefreshReg$(_c, \"WalletProvider\");\n\n\n;\n    // Wrapped in an IIFE to avoid polluting the global scope\n    ;\n    (function () {\n        var _a, _b;\n        // Legacy CSS implementations will `eval` browser code in a Node.js context\n        // to extract CSS. For backwards compatibility, we need to check we're in a\n        // browser context before continuing.\n        if (typeof self !== 'undefined' &&\n            // AMP / No-JS mode does not inject these helpers:\n            '$RefreshHelpers$' in self) {\n            // @ts-ignore __webpack_module__ is global\n            var currentExports = module.exports;\n            // @ts-ignore __webpack_module__ is global\n            var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n            // This cannot happen in MainTemplate because the exports mismatch between\n            // templating and execution.\n            self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n            // A module can be accepted automatically based on its exports, e.g. when\n            // it is a Refresh Boundary.\n            if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n                // Save the previous exports signature on update so we can compare the boundary\n                // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n                module.hot.dispose(function (data) {\n                    data.prevSignature =\n                        self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n                });\n                // Unconditionally accept an update to this module, we'll check if it's\n                // still a Refresh Boundary later.\n                // @ts-ignore importMeta is replaced in the loader\n                module.hot.accept();\n                // This field is set when the previous version of this module was a\n                // Refresh Boundary, letting us know we need to check for invalidation or\n                // enqueue an update.\n                if (prevSignature !== null) {\n                    // A boundary can become ineligible if its exports are incompatible\n                    // with the previous exports.\n                    //\n                    // For example, if you add/remove/change exports, we'll want to\n                    // re-execute the importing modules, and force those components to\n                    // re-render. Similarly, if you convert a class component to a\n                    // function, we want to invalidate the boundary.\n                    if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n                        module.hot.invalidate();\n                    }\n                    else {\n                        self.$RefreshHelpers$.scheduleUpdate();\n                    }\n                }\n            }\n            else {\n                // Since we just executed the code for the module, it's possible that the\n                // new exports made it ineligible for being a boundary.\n                // We only care about the case when we were _previously_ a boundary,\n                // because we already accepted this update (accidental side effect).\n                var isNoLongerABoundary = prevSignature !== null;\n                if (isNoLongerABoundary) {\n                    module.hot.invalidate();\n                }\n            }\n        }\n    })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL3NyYy9saWIvd2FsbGV0LWNvbnRleHQudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFHc0U7QUErQnRFLE1BQU1JLDhCQUFnQkosb0RBQWFBLENBQWdDSztBQUU1RCxTQUFTQyxlQUFlLEtBQTJDO1FBQTNDLEVBQUVDLFFBQVEsRUFBaUMsR0FBM0M7O0lBQzNCLE1BQU0sQ0FBQ0MsU0FBU0MsV0FBVyxHQUFHUCwrQ0FBUUEsQ0FBQztJQUN2QyxNQUFNLENBQUNRLE1BQU1DLFFBQVEsR0FBR1QsK0NBQVFBLENBQVEsRUFBRTtJQUUxQyxrQ0FBa0M7SUFDbENDLGdEQUFTQTtvQ0FBQztZQUNOLE1BQU1TLGVBQWVDLGFBQWFDLE9BQU8sQ0FBQztZQUMxQyxNQUFNQyxZQUFZRixhQUFhQyxPQUFPLENBQUM7WUFFdkMsSUFBSUYsY0FBY0gsV0FBV08sT0FBT0MsVUFBVSxDQUFDTDtZQUMvQyxJQUFJRyxXQUFXSixRQUFRTyxLQUFLQyxLQUFLLENBQUNKO1FBQ3RDO21DQUFHLEVBQUU7SUFFTCx1REFBdUQ7SUFDdkRaLGdEQUFTQTtvQ0FBQztZQUNOVSxhQUFhTyxPQUFPLENBQUMsa0JBQWtCWixRQUFRYSxRQUFRO1FBQzNEO21DQUFHO1FBQUNiO0tBQVE7SUFFWkwsZ0RBQVNBO29DQUFDO1lBQ05VLGFBQWFPLE9BQU8sQ0FBQyxlQUFlRixLQUFLSSxTQUFTLENBQUNaO1FBQ3ZEO21DQUFHO1FBQUNBO0tBQUs7SUFFVCxNQUFNYSxTQUFTLENBQUNDO1FBQ1osTUFBTUMsU0FBYztZQUNoQixHQUFHRCxHQUFHO1lBQ05FLElBQUksT0FBcUJDLE9BQWRDLEtBQUtDLEdBQUcsSUFBRyxLQUFpQixPQUFkRixLQUFLRyxNQUFNO1lBQ3BDQyxXQUFXSCxLQUFLQyxHQUFHO1lBQ25CRyxRQUFRO1FBQ1o7UUFFQXJCLFFBQVEsQ0FBQ3NCLE9BQVM7Z0JBQUNSO21CQUFXUTthQUFLO1FBQ25DeEIsV0FBVyxDQUFDd0IsT0FBU0EsT0FBT1QsSUFBSVUsTUFBTTtJQUMxQztJQUVBLE1BQU1DLGtCQUFrQixDQUFDQyxPQUFlSjtRQUNwQ3JCLFFBQVEsQ0FBQ3NCLE9BQ0xBLEtBQUtJLEdBQUcsQ0FBQyxDQUFDYjtnQkFDTixJQUFJQSxJQUFJRSxFQUFFLEtBQUtVLFNBQVNaLElBQUlRLE1BQU0sS0FBSyxXQUFXO29CQUM5QyxJQUFJQSxXQUFXLE9BQU87d0JBQ2xCdkIsV0FBVyxDQUFDNkIsSUFBTUEsSUFBSWQsSUFBSWUsWUFBWTtvQkFDMUM7b0JBQ0EsT0FBTzt3QkFBRSxHQUFHZixHQUFHO3dCQUFFUTtvQkFBTztnQkFDNUI7Z0JBQ0EsT0FBT1I7WUFDWDtJQUVSO0lBRUEsTUFBTWdCLFdBQVcsQ0FBQ047UUFDZHpCLFdBQVcsQ0FBQ3dCLE9BQVNBLE9BQU9DO0lBQ2hDO0lBRUEsTUFBTU8sUUFBUTtRQUNWQyxXQUFXaEMsS0FBS2lDLE1BQU07UUFDdEJDLFdBQVdsQyxLQUFLbUMsTUFBTSxDQUFDLENBQUNQLElBQU1BLEVBQUVOLE1BQU0sS0FBSyxPQUFPVyxNQUFNO1FBQ3hERyxhQUFhcEMsS0FBS21DLE1BQU0sQ0FBQyxDQUFDUCxJQUFNQSxFQUFFTixNQUFNLEtBQUssUUFBUVcsTUFBTTtRQUMzREksU0FBU3JDLEtBQUtpQyxNQUFNLEdBQUcsSUFBSSxLQUFNRSxNQUFNLENBQUMsQ0FBQ1AsSUFBTUEsRUFBRU4sTUFBTSxLQUFLLE9BQU9XLE1BQU0sR0FBR2pDLEtBQUtpQyxNQUFNLEdBQUksTUFBTTtRQUNqR0ssVUFBVXRDLEtBQUttQyxNQUFNLENBQUMsQ0FBQ1AsSUFBTUEsRUFBRU4sTUFBTSxLQUFLLE9BQU9pQixNQUFNLENBQUMsQ0FBQ0MsS0FBS1osSUFBTVksTUFBTVosRUFBRUMsWUFBWSxFQUFFO1FBQzFGWSxXQUFXekMsS0FBS21DLE1BQU0sQ0FBQyxDQUFDUCxJQUFNQSxFQUFFTixNQUFNLEtBQUssUUFBUWlCLE1BQU0sQ0FBQyxDQUFDQyxLQUFLWixJQUFNWSxNQUFNWixFQUFFSixNQUFNLEVBQUU7SUFDMUY7SUFFQSxxQkFDSSw4REFBQzlCLGNBQWNnRCxRQUFRO1FBQUNDLE9BQU87WUFBRTdDO1lBQVNFO1lBQU1hO1lBQVFZO1lBQWlCSztZQUFVQztRQUFNO2tCQUNwRmxDOzs7Ozs7QUFHYjtHQWxFZ0JEO0tBQUFBO0FBb0VULFNBQVNnRDs7SUFDWixNQUFNQyxVQUFVdEQsaURBQVVBLENBQUNHO0lBQzNCLElBQUltRCxZQUFZbEQsV0FBVztRQUN2QixNQUFNLElBQUltRCxNQUFNO0lBQ3BCO0lBQ0EsT0FBT0Q7QUFDWDtJQU5nQkQiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9zcmMvbGliL3dhbGxldC1jb250ZXh0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIlxuXG5pbXBvcnQgdHlwZSBSZWFjdCBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCwgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiXG5cbmludGVyZmFjZSBCZXQge1xuICAgIGlkOiBzdHJpbmdcbiAgICByYWNlSWQ6IG51bWJlclxuICAgIHJhY2VOYW1lOiBzdHJpbmdcbiAgICBob3JzZUlkOiBudW1iZXJcbiAgICBob3JzZU5hbWU6IHN0cmluZ1xuICAgIGFtb3VudDogbnVtYmVyXG4gICAgb2RkczogbnVtYmVyXG4gICAgcG90ZW50aWFsV2luOiBudW1iZXJcbiAgICB0aW1lc3RhbXA6IG51bWJlclxuICAgIHN0YXR1czogXCJwZW5kaW5nXCIgfCBcIndvblwiIHwgXCJsb3N0XCJcbn1cblxuaW50ZXJmYWNlIFdhbGxldENvbnRleHRUeXBlIHtcbiAgICBiYWxhbmNlOiBudW1iZXJcbiAgICBiZXRzOiBCZXRbXVxuICAgIGFkZEJldDogKGJldDogT21pdDxCZXQsIFwiaWRcIiB8IFwidGltZXN0YW1wXCIgfCBcInN0YXR1c1wiPikgPT4gdm9pZFxuICAgIHVwZGF0ZUJldFN0YXR1czogKGJldElkOiBzdHJpbmcsIHN0YXR1czogXCJ3b25cIiB8IFwibG9zdFwiKSA9PiB2b2lkXG4gICAgYWRkQ29pbnM6IChhbW91bnQ6IG51bWJlcikgPT4gdm9pZFxuICAgIHN0YXRzOiB7XG4gICAgICAgIHRvdGFsQmV0czogbnVtYmVyXG4gICAgICAgIHRvdGFsV2luczogbnVtYmVyXG4gICAgICAgIHRvdGFsTG9zc2VzOiBudW1iZXJcbiAgICAgICAgd2luUmF0ZTogbnVtYmVyXG4gICAgICAgIHRvdGFsV29uOiBudW1iZXJcbiAgICAgICAgdG90YWxMb3N0OiBudW1iZXJcbiAgICB9XG59XG5cbmNvbnN0IFdhbGxldENvbnRleHQgPSBjcmVhdGVDb250ZXh0PFdhbGxldENvbnRleHRUeXBlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG5cbmV4cG9ydCBmdW5jdGlvbiBXYWxsZXRQcm92aWRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gICAgY29uc3QgW2JhbGFuY2UsIHNldEJhbGFuY2VdID0gdXNlU3RhdGUoMTAwMClcbiAgICBjb25zdCBbYmV0cywgc2V0QmV0c10gPSB1c2VTdGF0ZTxCZXRbXT4oW10pXG5cbiAgICAvLyBMb2FkIGZyb20gbG9jYWxTdG9yYWdlIG9uIG1vdW50XG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3Qgc2F2ZWRCYWxhbmNlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJ3YWxsZXQtYmFsYW5jZVwiKVxuICAgICAgICBjb25zdCBzYXZlZEJldHMgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIndhbGxldC1iZXRzXCIpXG5cbiAgICAgICAgaWYgKHNhdmVkQmFsYW5jZSkgc2V0QmFsYW5jZShOdW1iZXIucGFyc2VGbG9hdChzYXZlZEJhbGFuY2UpKVxuICAgICAgICBpZiAoc2F2ZWRCZXRzKSBzZXRCZXRzKEpTT04ucGFyc2Uoc2F2ZWRCZXRzKSlcbiAgICB9LCBbXSlcblxuICAgIC8vIFNhdmUgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGJhbGFuY2Ugb3IgYmV0cyBjaGFuZ2VcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIndhbGxldC1iYWxhbmNlXCIsIGJhbGFuY2UudG9TdHJpbmcoKSlcbiAgICB9LCBbYmFsYW5jZV0pXG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIndhbGxldC1iZXRzXCIsIEpTT04uc3RyaW5naWZ5KGJldHMpKVxuICAgIH0sIFtiZXRzXSlcblxuICAgIGNvbnN0IGFkZEJldCA9IChiZXQ6IE9taXQ8QmV0LCBcImlkXCIgfCBcInRpbWVzdGFtcFwiIHwgXCJzdGF0dXNcIj4pID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmV0OiBCZXQgPSB7XG4gICAgICAgICAgICAuLi5iZXQsXG4gICAgICAgICAgICBpZDogYGJldC0ke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKX1gLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICAgICAgc3RhdHVzOiBcInBlbmRpbmdcIixcbiAgICAgICAgfVxuXG4gICAgICAgIHNldEJldHMoKHByZXYpID0+IFtuZXdCZXQsIC4uLnByZXZdKVxuICAgICAgICBzZXRCYWxhbmNlKChwcmV2KSA9PiBwcmV2IC0gYmV0LmFtb3VudClcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVCZXRTdGF0dXMgPSAoYmV0SWQ6IHN0cmluZywgc3RhdHVzOiBcIndvblwiIHwgXCJsb3N0XCIpID0+IHtcbiAgICAgICAgc2V0QmV0cygocHJldikgPT5cbiAgICAgICAgICAgIHByZXYubWFwKChiZXQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoYmV0LmlkID09PSBiZXRJZCAmJiBiZXQuc3RhdHVzID09PSBcInBlbmRpbmdcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBcIndvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRCYWxhbmNlKChiKSA9PiBiICsgYmV0LnBvdGVudGlhbFdpbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5iZXQsIHN0YXR1cyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBiZXRcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgYWRkQ29pbnMgPSAoYW1vdW50OiBudW1iZXIpID0+IHtcbiAgICAgICAgc2V0QmFsYW5jZSgocHJldikgPT4gcHJldiArIGFtb3VudClcbiAgICB9XG5cbiAgICBjb25zdCBzdGF0cyA9IHtcbiAgICAgICAgdG90YWxCZXRzOiBiZXRzLmxlbmd0aCxcbiAgICAgICAgdG90YWxXaW5zOiBiZXRzLmZpbHRlcigoYikgPT4gYi5zdGF0dXMgPT09IFwid29uXCIpLmxlbmd0aCxcbiAgICAgICAgdG90YWxMb3NzZXM6IGJldHMuZmlsdGVyKChiKSA9PiBiLnN0YXR1cyA9PT0gXCJsb3N0XCIpLmxlbmd0aCxcbiAgICAgICAgd2luUmF0ZTogYmV0cy5sZW5ndGggPiAwID8gKGJldHMuZmlsdGVyKChiKSA9PiBiLnN0YXR1cyA9PT0gXCJ3b25cIikubGVuZ3RoIC8gYmV0cy5sZW5ndGgpICogMTAwIDogMCxcbiAgICAgICAgdG90YWxXb246IGJldHMuZmlsdGVyKChiKSA9PiBiLnN0YXR1cyA9PT0gXCJ3b25cIikucmVkdWNlKChzdW0sIGIpID0+IHN1bSArIGIucG90ZW50aWFsV2luLCAwKSxcbiAgICAgICAgdG90YWxMb3N0OiBiZXRzLmZpbHRlcigoYikgPT4gYi5zdGF0dXMgPT09IFwibG9zdFwiKS5yZWR1Y2UoKHN1bSwgYikgPT4gc3VtICsgYi5hbW91bnQsIDApLFxuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICAgIDxXYWxsZXRDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IGJhbGFuY2UsIGJldHMsIGFkZEJldCwgdXBkYXRlQmV0U3RhdHVzLCBhZGRDb2lucywgc3RhdHMgfX0+XG4gICAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvV2FsbGV0Q29udGV4dC5Qcm92aWRlcj5cbiAgICApXG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VXYWxsZXQoKSB7XG4gICAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoV2FsbGV0Q29udGV4dClcbiAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcInVzZVdhbGxldCBtdXN0IGJlIHVzZWQgd2l0aGluIGEgV2FsbGV0UHJvdmlkZXJcIilcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHRcbn1cbiJdLCJuYW1lcyI6WyJjcmVhdGVDb250ZXh0IiwidXNlQ29udGV4dCIsInVzZVN0YXRlIiwidXNlRWZmZWN0IiwiV2FsbGV0Q29udGV4dCIsInVuZGVmaW5lZCIsIldhbGxldFByb3ZpZGVyIiwiY2hpbGRyZW4iLCJiYWxhbmNlIiwic2V0QmFsYW5jZSIsImJldHMiLCJzZXRCZXRzIiwic2F2ZWRCYWxhbmNlIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsInNhdmVkQmV0cyIsIk51bWJlciIsInBhcnNlRmxvYXQiLCJKU09OIiwicGFyc2UiLCJzZXRJdGVtIiwidG9TdHJpbmciLCJzdHJpbmdpZnkiLCJhZGRCZXQiLCJiZXQiLCJuZXdCZXQiLCJpZCIsIk1hdGgiLCJEYXRlIiwibm93IiwicmFuZG9tIiwidGltZXN0YW1wIiwic3RhdHVzIiwicHJldiIsImFtb3VudCIsInVwZGF0ZUJldFN0YXR1cyIsImJldElkIiwibWFwIiwiYiIsInBvdGVudGlhbFdpbiIsImFkZENvaW5zIiwic3RhdHMiLCJ0b3RhbEJldHMiLCJsZW5ndGgiLCJ0b3RhbFdpbnMiLCJmaWx0ZXIiLCJ0b3RhbExvc3NlcyIsIndpblJhdGUiLCJ0b3RhbFdvbiIsInJlZHVjZSIsInN1bSIsInRvdGFsTG9zdCIsIlByb3ZpZGVyIiwidmFsdWUiLCJ1c2VXYWxsZXQiLCJjb250ZXh0IiwiRXJyb3IiXSwiaWdub3JlTGlzdCI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./src/lib/wallet-context.tsx\n"));
 
/***/ }),
 
/***/ "(shared)/./node_modules/next/dist/server/app-render/async-local-storage.js":
/*!*************************************************************************!*\
  !*** ./node_modules/next/dist/server/app-render/async-local-storage.js ***!
  \*************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n    value: true\n}));\n0 && (0);\nfunction _export(target, all) {\n    for(var name in all)Object.defineProperty(target, name, {\n        enumerable: true,\n        get: all[name]\n    });\n}\n_export(exports, {\n    bindSnapshot: function() {\n        return bindSnapshot;\n    },\n    createAsyncLocalStorage: function() {\n        return createAsyncLocalStorage;\n    },\n    createSnapshot: function() {\n        return createSnapshot;\n    }\n});\nconst sharedAsyncLocalStorageNotAvailableError = Object.defineProperty(new Error('Invariant: AsyncLocalStorage accessed in runtime where it is not available'), \"__NEXT_ERROR_CODE\", {\n    value: \"E504\",\n    enumerable: false,\n    configurable: true\n});\nclass FakeAsyncLocalStorage {\n    disable() {\n        throw sharedAsyncLocalStorageNotAvailableError;\n    }\n    getStore() {\n        // This fake implementation of AsyncLocalStorage always returns `undefined`.\n        return undefined;\n    }\n    run() {\n        throw sharedAsyncLocalStorageNotAvailableError;\n    }\n    exit() {\n        throw sharedAsyncLocalStorageNotAvailableError;\n    }\n    enterWith() {\n        throw sharedAsyncLocalStorageNotAvailableError;\n    }\n    static bind(fn) {\n        return fn;\n    }\n}\nconst maybeGlobalAsyncLocalStorage = typeof globalThis !== 'undefined' && globalThis.AsyncLocalStorage;\nfunction createAsyncLocalStorage() {\n    if (maybeGlobalAsyncLocalStorage) {\n        return new maybeGlobalAsyncLocalStorage();\n    }\n    return new FakeAsyncLocalStorage();\n}\nfunction bindSnapshot(fn) {\n    if (maybeGlobalAsyncLocalStorage) {\n        return maybeGlobalAsyncLocalStorage.bind(fn);\n    }\n    return FakeAsyncLocalStorage.bind(fn);\n}\nfunction createSnapshot() {\n    if (maybeGlobalAsyncLocalStorage) {\n        return maybeGlobalAsyncLocalStorage.snapshot();\n    }\n    return function(fn, ...args) {\n        return fn(...args);\n    };\n}\n\n//# sourceMappingURL=async-local-storage.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNoYXJlZCkvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L3NlcnZlci9hcHAtcmVuZGVyL2FzeW5jLWxvY2FsLXN0b3JhZ2UuanMiLCJtYXBwaW5ncyI6IkFBQWE7QUFDYiw4Q0FBNkM7QUFDN0M7QUFDQSxDQUFDLEVBQUM7QUFDRixNQUFNLENBSUw7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L3NlcnZlci9hcHAtcmVuZGVyL2FzeW5jLWxvY2FsLXN0b3JhZ2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG4wICYmIChtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBiaW5kU25hcHNob3Q6IG51bGwsXG4gICAgY3JlYXRlQXN5bmNMb2NhbFN0b3JhZ2U6IG51bGwsXG4gICAgY3JlYXRlU25hcHNob3Q6IG51bGxcbn0pO1xuZnVuY3Rpb24gX2V4cG9ydCh0YXJnZXQsIGFsbCkge1xuICAgIGZvcih2YXIgbmFtZSBpbiBhbGwpT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgbmFtZSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGFsbFtuYW1lXVxuICAgIH0pO1xufVxuX2V4cG9ydChleHBvcnRzLCB7XG4gICAgYmluZFNuYXBzaG90OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGJpbmRTbmFwc2hvdDtcbiAgICB9LFxuICAgIGNyZWF0ZUFzeW5jTG9jYWxTdG9yYWdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUFzeW5jTG9jYWxTdG9yYWdlO1xuICAgIH0sXG4gICAgY3JlYXRlU25hcHNob3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlU25hcHNob3Q7XG4gICAgfVxufSk7XG5jb25zdCBzaGFyZWRBc3luY0xvY2FsU3RvcmFnZU5vdEF2YWlsYWJsZUVycm9yID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ldyBFcnJvcignSW52YXJpYW50OiBBc3luY0xvY2FsU3RvcmFnZSBhY2Nlc3NlZCBpbiBydW50aW1lIHdoZXJlIGl0IGlzIG5vdCBhdmFpbGFibGUnKSwgXCJfX05FWFRfRVJST1JfQ09ERVwiLCB7XG4gICAgdmFsdWU6IFwiRTUwNFwiLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxufSk7XG5jbGFzcyBGYWtlQXN5bmNMb2NhbFN0b3JhZ2Uge1xuICAgIGRpc2FibGUoKSB7XG4gICAgICAgIHRocm93IHNoYXJlZEFzeW5jTG9jYWxTdG9yYWdlTm90QXZhaWxhYmxlRXJyb3I7XG4gICAgfVxuICAgIGdldFN0b3JlKCkge1xuICAgICAgICAvLyBUaGlzIGZha2UgaW1wbGVtZW50YXRpb24gb2YgQXN5bmNMb2NhbFN0b3JhZ2UgYWx3YXlzIHJldHVybnMgYHVuZGVmaW5lZGAuXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJ1bigpIHtcbiAgICAgICAgdGhyb3cgc2hhcmVkQXN5bmNMb2NhbFN0b3JhZ2VOb3RBdmFpbGFibGVFcnJvcjtcbiAgICB9XG4gICAgZXhpdCgpIHtcbiAgICAgICAgdGhyb3cgc2hhcmVkQXN5bmNMb2NhbFN0b3JhZ2VOb3RBdmFpbGFibGVFcnJvcjtcbiAgICB9XG4gICAgZW50ZXJXaXRoKCkge1xuICAgICAgICB0aHJvdyBzaGFyZWRBc3luY0xvY2FsU3RvcmFnZU5vdEF2YWlsYWJsZUVycm9yO1xuICAgIH1cbiAgICBzdGF0aWMgYmluZChmbikge1xuICAgICAgICByZXR1cm4gZm47XG4gICAgfVxufVxuY29uc3QgbWF5YmVHbG9iYWxBc3luY0xvY2FsU3RvcmFnZSA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyAmJiBnbG9iYWxUaGlzLkFzeW5jTG9jYWxTdG9yYWdlO1xuZnVuY3Rpb24gY3JlYXRlQXN5bmNMb2NhbFN0b3JhZ2UoKSB7XG4gICAgaWYgKG1heWJlR2xvYmFsQXN5bmNMb2NhbFN0b3JhZ2UpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBtYXliZUdsb2JhbEFzeW5jTG9jYWxTdG9yYWdlKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRmFrZUFzeW5jTG9jYWxTdG9yYWdlKCk7XG59XG5mdW5jdGlvbiBiaW5kU25hcHNob3QoZm4pIHtcbiAgICBpZiAobWF5YmVHbG9iYWxBc3luY0xvY2FsU3RvcmFnZSkge1xuICAgICAgICByZXR1cm4gbWF5YmVHbG9iYWxBc3luY0xvY2FsU3RvcmFnZS5iaW5kKGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIEZha2VBc3luY0xvY2FsU3RvcmFnZS5iaW5kKGZuKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNuYXBzaG90KCkge1xuICAgIGlmIChtYXliZUdsb2JhbEFzeW5jTG9jYWxTdG9yYWdlKSB7XG4gICAgICAgIHJldHVybiBtYXliZUdsb2JhbEFzeW5jTG9jYWxTdG9yYWdlLnNuYXBzaG90KCk7XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbihmbiwgLi4uYXJncykge1xuICAgICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgfTtcbn1cblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXN5bmMtbG9jYWwtc3RvcmFnZS5qcy5tYXAiXSwibmFtZXMiOltdLCJpZ25vcmVMaXN0IjpbMF0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(shared)/./node_modules/next/dist/server/app-render/async-local-storage.js\n"));
 
/***/ }),
 
/***/ "(shared)/./node_modules/next/dist/server/app-render/work-async-storage-instance.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/next/dist/server/app-render/work-async-storage-instance.js ***!
  \*********************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n    value: true\n}));\nObject.defineProperty(exports, \"workAsyncStorageInstance\", ({\n    enumerable: true,\n    get: function() {\n        return workAsyncStorageInstance;\n    }\n}));\nconst _asynclocalstorage = __webpack_require__(/*! ./async-local-storage */ \"(shared)/./node_modules/next/dist/server/app-render/async-local-storage.js\");\nconst workAsyncStorageInstance = (0, _asynclocalstorage.createAsyncLocalStorage)();\n\n//# sourceMappingURL=work-async-storage-instance.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNoYXJlZCkvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L3NlcnZlci9hcHAtcmVuZGVyL3dvcmstYXN5bmMtc3RvcmFnZS1pbnN0YW5jZS5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLDREQUEyRDtBQUMzRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLDJCQUEyQixtQkFBTyxDQUFDLHlHQUF1QjtBQUMxRDs7QUFFQSIsInNvdXJjZXMiOlsiL2hvbWUvd3NseHQvY3M0NzIvZmFyY2FzdGVyL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3Qvc2VydmVyL2FwcC1yZW5kZXIvd29yay1hc3luYy1zdG9yYWdlLWluc3RhbmNlLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwid29ya0FzeW5jU3RvcmFnZUluc3RhbmNlXCIsIHtcbiAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB3b3JrQXN5bmNTdG9yYWdlSW5zdGFuY2U7XG4gICAgfVxufSk7XG5jb25zdCBfYXN5bmNsb2NhbHN0b3JhZ2UgPSByZXF1aXJlKFwiLi9hc3luYy1sb2NhbC1zdG9yYWdlXCIpO1xuY29uc3Qgd29ya0FzeW5jU3RvcmFnZUluc3RhbmNlID0gKDAsIF9hc3luY2xvY2Fsc3RvcmFnZS5jcmVhdGVBc3luY0xvY2FsU3RvcmFnZSkoKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d29yay1hc3luYy1zdG9yYWdlLWluc3RhbmNlLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(shared)/./node_modules/next/dist/server/app-render/work-async-storage-instance.js\n"));
 
/***/ }),
 
/***/ "(shared)/./node_modules/next/dist/server/app-render/work-async-storage.external.js":
/*!*********************************************************************************!*\
  !*** ./node_modules/next/dist/server/app-render/work-async-storage.external.js ***!
  \*********************************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
 
"use strict";
eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n    value: true\n}));\nObject.defineProperty(exports, \"workAsyncStorage\", ({\n    enumerable: true,\n    get: function() {\n        return _workasyncstorageinstance.workAsyncStorageInstance;\n    }\n}));\nconst _workasyncstorageinstance = __webpack_require__(/*! ./work-async-storage-instance */ \"(shared)/./node_modules/next/dist/server/app-render/work-async-storage-instance.js\");\n\n//# sourceMappingURL=work-async-storage.external.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNoYXJlZCkvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L3NlcnZlci9hcHAtcmVuZGVyL3dvcmstYXN5bmMtc3RvcmFnZS5leHRlcm5hbC5qcyIsIm1hcHBpbmdzIjoiQUFBYTtBQUNiLDhDQUE2QztBQUM3QztBQUNBLENBQUMsRUFBQztBQUNGLG9EQUFtRDtBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUMsRUFBQztBQUNGLGtDQUFrQyxtQkFBTyxDQUFDLHlIQUErQjs7QUFFekUiLCJzb3VyY2VzIjpbIi9ob21lL3dzbHh0L2NzNDcyL2ZhcmNhc3Rlci9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L3NlcnZlci9hcHAtcmVuZGVyL3dvcmstYXN5bmMtc3RvcmFnZS5leHRlcm5hbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIndvcmtBc3luY1N0b3JhZ2VcIiwge1xuICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIF93b3JrYXN5bmNzdG9yYWdlaW5zdGFuY2Uud29ya0FzeW5jU3RvcmFnZUluc3RhbmNlO1xuICAgIH1cbn0pO1xuY29uc3QgX3dvcmthc3luY3N0b3JhZ2VpbnN0YW5jZSA9IHJlcXVpcmUoXCIuL3dvcmstYXN5bmMtc3RvcmFnZS1pbnN0YW5jZVwiKTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9d29yay1hc3luYy1zdG9yYWdlLmV4dGVybmFsLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOlswXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(shared)/./node_modules/next/dist/server/app-render/work-async-storage.external.js\n"));
 
/***/ }),
 
/***/ "?f4e8":
/*!************************!*\
  !*** buffer (ignored) ***!
  \************************/
/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => {
 
/* (ignored) */
 
/***/ })
 
},
/******/ __webpack_require__ => { // webpackRuntimeModules
/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
/******/ __webpack_require__.O(0, ["main-app"], () => (__webpack_exec__("(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fnode_modules%2Fsonner%2Fdist%2Findex.mjs%22%2C%22ids%22%3A%5B%22Toaster%22%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Fapp%2Fproviders.tsx%22%2C%22ids%22%3A%5B%22Providers%22%5D%7D&modules=%7B%22request%22%3A%22%2Fhome%2Fwslxt%2Fcs472%2Ffarcaster%2Fsrc%2Flib%2Fwallet-context.tsx%22%2C%22ids%22%3A%5B%22WalletProvider%22%5D%7D&server=false!")));
/******/ var __webpack_exports__ = __webpack_require__.O();
/******/ _N_E = __webpack_exports__;
/******/ }
]);